LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjEweF9hZGMuYw0KICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQogICogQHZlcnNpb24gVjMuNC4wDQogICogQGRhdGUgICAgMTAvMTUvMjAxMA0KICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIEFEQyBmaXJtd2FyZSBmdW5jdGlvbnMuDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBjb3B5DQogICoNCiAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCiAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQogICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqLyANCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmYxMHhfYWRjLmgiDQojaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KDQovKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIEFEQyANCiAgKiBAYnJpZWYgQURDIGRyaXZlciBtb2R1bGVzDQogICogQHsNCiAgKi8NCg0KLyoqIEBkZWZncm91cCBBRENfUHJpdmF0ZV9UeXBlc0RlZmluaXRpb25zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBBRENfUHJpdmF0ZV9EZWZpbmVzDQogICogQHsNCiAgKi8NCg0KLyogQURDIERJU0NOVU0gbWFzayAqLw0KI2RlZmluZSBDUjFfRElTQ05VTV9SZXNldCAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkYxRkZGKQ0KDQovKiBBREMgRElTQ0VOIG1hc2sgKi8NCiNkZWZpbmUgQ1IxX0RJU0NFTl9TZXQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDgwMCkNCiNkZWZpbmUgQ1IxX0RJU0NFTl9SZXNldCAgICAgICAgICAgICgodWludDMyX3QpMHhGRkZGRjdGRikNCg0KLyogQURDIEpBVVRPIG1hc2sgKi8NCiNkZWZpbmUgQ1IxX0pBVVRPX1NldCAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDQwMCkNCiNkZWZpbmUgQ1IxX0pBVVRPX1Jlc2V0ICAgICAgICAgICAgICgodWludDMyX3QpMHhGRkZGRkJGRikNCg0KLyogQURDIEpESVNDRU4gbWFzayAqLw0KI2RlZmluZSBDUjFfSkRJU0NFTl9TZXQgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAxMDAwKQ0KI2RlZmluZSBDUjFfSkRJU0NFTl9SZXNldCAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZFRkZGKQ0KDQovKiBBREMgQVdEQ0ggbWFzayAqLw0KI2RlZmluZSBDUjFfQVdEQ0hfUmVzZXQgICAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZGRkUwKQ0KDQovKiBBREMgQW5hbG9nIHdhdGNoZG9nIGVuYWJsZSBtb2RlIG1hc2sgKi8NCiNkZWZpbmUgQ1IxX0FXRE1vZGVfUmVzZXQgICAgICAgICAgICgodWludDMyX3QpMHhGRjNGRkRGRikNCg0KLyogQ1IxIHJlZ2lzdGVyIE1hc2sgKi8NCiNkZWZpbmUgQ1IxX0NMRUFSX01hc2sgICAgICAgICAgICAgICgodWludDMyX3QpMHhGRkYwRkVGRikNCg0KLyogQURDIEFET04gbWFzayAqLw0KI2RlZmluZSBDUjJfQURPTl9TZXQgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxKQ0KI2RlZmluZSBDUjJfQURPTl9SZXNldCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZGRkZFKQ0KDQovKiBBREMgRE1BIG1hc2sgKi8NCiNkZWZpbmUgQ1IyX0RNQV9TZXQgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDEwMCkNCiNkZWZpbmUgQ1IyX0RNQV9SZXNldCAgICAgICAgICAgICAgICgodWludDMyX3QpMHhGRkZGRkVGRikNCg0KLyogQURDIFJTVENBTCBtYXNrICovDQojZGVmaW5lIENSMl9SU1RDQUxfU2V0ICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDgpDQoNCi8qIEFEQyBDQUwgbWFzayAqLw0KI2RlZmluZSBDUjJfQ0FMX1NldCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0KQ0KDQovKiBBREMgU1dTVEFSVCBtYXNrICovDQojZGVmaW5lIENSMl9TV1NUQVJUX1NldCAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDA0MDAwMDApDQoNCi8qIEFEQyBFWFRUUklHIG1hc2sgKi8NCiNkZWZpbmUgQ1IyX0VYVFRSSUdfU2V0ICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDEwMDAwMCkNCiNkZWZpbmUgQ1IyX0VYVFRSSUdfUmVzZXQgICAgICAgICAgICgodWludDMyX3QpMHhGRkVGRkZGRikNCg0KLyogQURDIFNvZnR3YXJlIHN0YXJ0IG1hc2sgKi8NCiNkZWZpbmUgQ1IyX0VYVFRSSUdfU1dTVEFSVF9TZXQgICAgICgodWludDMyX3QpMHgwMDUwMDAwMCkNCiNkZWZpbmUgQ1IyX0VYVFRSSUdfU1dTVEFSVF9SZXNldCAgICgodWludDMyX3QpMHhGRkFGRkZGRikNCg0KLyogQURDIEpFWFRTRUwgbWFzayAqLw0KI2RlZmluZSBDUjJfSkVYVFNFTF9SZXNldCAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkY4RkZGKQ0KDQovKiBBREMgSkVYVFRSSUcgbWFzayAqLw0KI2RlZmluZSBDUjJfSkVYVFRSSUdfU2V0ICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDA4MDAwKQ0KI2RlZmluZSBDUjJfSkVYVFRSSUdfUmVzZXQgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkY3RkZGKQ0KDQovKiBBREMgSlNXU1RBUlQgbWFzayAqLw0KI2RlZmluZSBDUjJfSlNXU1RBUlRfU2V0ICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMjAwMDAwKQ0KDQovKiBBREMgaW5qZWN0ZWQgc29mdHdhcmUgc3RhcnQgbWFzayAqLw0KI2RlZmluZSBDUjJfSkVYVFRSSUdfSlNXU1RBUlRfU2V0ICAgKCh1aW50MzJfdCkweDAwMjA4MDAwKQ0KI2RlZmluZSBDUjJfSkVYVFRSSUdfSlNXU1RBUlRfUmVzZXQgKCh1aW50MzJfdCkweEZGREY3RkZGKQ0KDQovKiBBREMgVFNQRCBtYXNrICovDQojZGVmaW5lIENSMl9UU1ZSRUZFX1NldCAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDA4MDAwMDApDQojZGVmaW5lIENSMl9UU1ZSRUZFX1Jlc2V0ICAgICAgICAgICAoKHVpbnQzMl90KTB4RkY3RkZGRkYpDQoNCi8qIENSMiByZWdpc3RlciBNYXNrICovDQojZGVmaW5lIENSMl9DTEVBUl9NYXNrICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4RkZGMUY3RkQpDQoNCi8qIEFEQyBTUXggbWFzayAqLw0KI2RlZmluZSBTUVIzX1NRX1NldCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDFGKQ0KI2RlZmluZSBTUVIyX1NRX1NldCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDFGKQ0KI2RlZmluZSBTUVIxX1NRX1NldCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDFGKQ0KDQovKiBTUVIxIHJlZ2lzdGVyIE1hc2sgKi8NCiNkZWZpbmUgU1FSMV9DTEVBUl9NYXNrICAgICAgICAgICAgICgodWludDMyX3QpMHhGRjBGRkZGRikNCg0KLyogQURDIEpTUXggbWFzayAqLw0KI2RlZmluZSBKU1FSX0pTUV9TZXQgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDFGKQ0KDQovKiBBREMgSkwgbWFzayAqLw0KI2RlZmluZSBKU1FSX0pMX1NldCAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMzAwMDAwKQ0KI2RlZmluZSBKU1FSX0pMX1Jlc2V0ICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweEZGQ0ZGRkZGKQ0KDQovKiBBREMgU01QeCBtYXNrICovDQojZGVmaW5lIFNNUFIxX1NNUF9TZXQgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDcpDQojZGVmaW5lIFNNUFIyX1NNUF9TZXQgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDcpDQoNCi8qIEFEQyBKRFJ4IHJlZ2lzdGVycyBvZmZzZXQgKi8NCiNkZWZpbmUgSkRSX09mZnNldCAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDI4KQ0KDQovKiBBREMxIERSIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAqLw0KI2RlZmluZSBEUl9BRERSRVNTICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDQwMDEyNDRDKQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIEFEQ19Qcml2YXRlX01hY3Jvcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgQURDX1ByaXZhdGVfVmFyaWFibGVzDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBBRENfUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIEFEQ19Qcml2YXRlX0Z1bmN0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiAgRGVpbml0aWFsaXplcyB0aGUgQURDeCBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4NCiAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBBRENfRGVJbml0KEFEQ19UeXBlRGVmKiBBREN4KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KICANCiAgaWYgKEFEQ3ggPT0gQURDMSkNCiAgew0KICAgIC8qIEVuYWJsZSBBREMxIHJlc2V0IHN0YXRlICovDQogICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9BREMxLCBFTkFCTEUpOw0KICAgIC8qIFJlbGVhc2UgQURDMSBmcm9tIHJlc2V0IHN0YXRlICovDQogICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9BREMxLCBESVNBQkxFKTsNCiAgfQ0KICBlbHNlIGlmIChBREN4ID09IEFEQzIpDQogIHsNCiAgICAvKiBFbmFibGUgQURDMiByZXNldCBzdGF0ZSAqLw0KICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfQURDMiwgRU5BQkxFKTsNCiAgICAvKiBSZWxlYXNlIEFEQzIgZnJvbSByZXNldCBzdGF0ZSAqLw0KICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfQURDMiwgRElTQUJMRSk7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgaWYgKEFEQ3ggPT0gQURDMykNCiAgICB7DQogICAgICAvKiBFbmFibGUgQURDMyByZXNldCBzdGF0ZSAqLw0KICAgICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9BREMzLCBFTkFCTEUpOw0KICAgICAgLyogUmVsZWFzZSBBREMzIGZyb20gcmVzZXQgc3RhdGUgKi8NCiAgICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfQURDMywgRElTQUJMRSk7DQogICAgfQ0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEFEQ3ggcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzDQogICogICBpbiB0aGUgQURDX0luaXRTdHJ1Y3QuDQogICogQHBhcmFtICBBREN4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIEFEQ19Jbml0U3RydWN0OiBwb2ludGVyIHRvIGFuIEFEQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQURDIHBlcmlwaGVyYWwuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEFEQ19Jbml0KEFEQ19UeXBlRGVmKiBBREN4LCBBRENfSW5pdFR5cGVEZWYqIEFEQ19Jbml0U3RydWN0KQ0Kew0KICB1aW50MzJfdCB0bXByZWcxID0gMDsNCiAgdWludDhfdCB0bXByZWcyID0gMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19NT0RFKEFEQ19Jbml0U3RydWN0LT5BRENfTW9kZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShBRENfSW5pdFN0cnVjdC0+QURDX1NjYW5Db252TW9kZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShBRENfSW5pdFN0cnVjdC0+QURDX0NvbnRpbnVvdXNDb252TW9kZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0VYVF9UUklHKEFEQ19Jbml0U3RydWN0LT5BRENfRXh0ZXJuYWxUcmlnQ29udikpOyAgIA0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0RBVEFfQUxJR04oQURDX0luaXRTdHJ1Y3QtPkFEQ19EYXRhQWxpZ24pKTsgDQogIGFzc2VydF9wYXJhbShJU19BRENfUkVHVUxBUl9MRU5HVEgoQURDX0luaXRTdHJ1Y3QtPkFEQ19OYnJPZkNoYW5uZWwpKTsNCg0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQURDeCBDUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIEdldCB0aGUgQURDeCBDUjEgdmFsdWUgKi8NCiAgdG1wcmVnMSA9IEFEQ3gtPkNSMTsNCiAgLyogQ2xlYXIgRFVBTE1PRCBhbmQgU0NBTiBiaXRzICovDQogIHRtcHJlZzEgJj0gQ1IxX0NMRUFSX01hc2s7DQogIC8qIENvbmZpZ3VyZSBBREN4OiBEdWFsIG1vZGUgYW5kIHNjYW4gY29udmVyc2lvbiBtb2RlICovDQogIC8qIFNldCBEVUFMTU9EIGJpdHMgYWNjb3JkaW5nIHRvIEFEQ19Nb2RlIHZhbHVlICovDQogIC8qIFNldCBTQ0FOIGJpdCBhY2NvcmRpbmcgdG8gQURDX1NjYW5Db252TW9kZSB2YWx1ZSAqLw0KICB0bXByZWcxIHw9ICh1aW50MzJfdCkoQURDX0luaXRTdHJ1Y3QtPkFEQ19Nb2RlIHwgKCh1aW50MzJfdClBRENfSW5pdFN0cnVjdC0+QURDX1NjYW5Db252TW9kZSA8PCA4KSk7DQogIC8qIFdyaXRlIHRvIEFEQ3ggQ1IxICovDQogIEFEQ3gtPkNSMSA9IHRtcHJlZzE7DQoNCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFEQ3ggQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBHZXQgdGhlIEFEQ3ggQ1IyIHZhbHVlICovDQogIHRtcHJlZzEgPSBBREN4LT5DUjI7DQogIC8qIENsZWFyIENPTlQsIEFMSUdOIGFuZCBFWFRTRUwgYml0cyAqLw0KICB0bXByZWcxICY9IENSMl9DTEVBUl9NYXNrOw0KICAvKiBDb25maWd1cmUgQURDeDogZXh0ZXJuYWwgdHJpZ2dlciBldmVudCBhbmQgY29udGludW91cyBjb252ZXJzaW9uIG1vZGUgKi8NCiAgLyogU2V0IEFMSUdOIGJpdCBhY2NvcmRpbmcgdG8gQURDX0RhdGFBbGlnbiB2YWx1ZSAqLw0KICAvKiBTZXQgRVhUU0VMIGJpdHMgYWNjb3JkaW5nIHRvIEFEQ19FeHRlcm5hbFRyaWdDb252IHZhbHVlICovDQogIC8qIFNldCBDT05UIGJpdCBhY2NvcmRpbmcgdG8gQURDX0NvbnRpbnVvdXNDb252TW9kZSB2YWx1ZSAqLw0KICB0bXByZWcxIHw9ICh1aW50MzJfdCkoQURDX0luaXRTdHJ1Y3QtPkFEQ19EYXRhQWxpZ24gfCBBRENfSW5pdFN0cnVjdC0+QURDX0V4dGVybmFsVHJpZ0NvbnYgfA0KICAgICAgICAgICAgKCh1aW50MzJfdClBRENfSW5pdFN0cnVjdC0+QURDX0NvbnRpbnVvdXNDb252TW9kZSA8PCAxKSk7DQogIC8qIFdyaXRlIHRvIEFEQ3ggQ1IyICovDQogIEFEQ3gtPkNSMiA9IHRtcHJlZzE7DQoNCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFEQ3ggU1FSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogR2V0IHRoZSBBREN4IFNRUjEgdmFsdWUgKi8NCiAgdG1wcmVnMSA9IEFEQ3gtPlNRUjE7DQogIC8qIENsZWFyIEwgYml0cyAqLw0KICB0bXByZWcxICY9IFNRUjFfQ0xFQVJfTWFzazsNCiAgLyogQ29uZmlndXJlIEFEQ3g6IHJlZ3VsYXIgY2hhbm5lbCBzZXF1ZW5jZSBsZW5ndGggKi8NCiAgLyogU2V0IEwgYml0cyBhY2NvcmRpbmcgdG8gQURDX05ick9mQ2hhbm5lbCB2YWx1ZSAqLw0KICB0bXByZWcyIHw9ICh1aW50OF90KSAoQURDX0luaXRTdHJ1Y3QtPkFEQ19OYnJPZkNoYW5uZWwgLSAodWludDhfdCkxKTsNCiAgdG1wcmVnMSB8PSAodWludDMyX3QpdG1wcmVnMiA8PCAyMDsNCiAgLyogV3JpdGUgdG8gQURDeCBTUVIxICovDQogIEFEQ3gtPlNRUjEgPSB0bXByZWcxOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggQURDX0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQogICogQHBhcmFtICBBRENfSW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYW4gQURDX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBBRENfU3RydWN0SW5pdChBRENfSW5pdFR5cGVEZWYqIEFEQ19Jbml0U3RydWN0KQ0Kew0KICAvKiBSZXNldCBBREMgaW5pdCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB2YWx1ZXMgKi8NCiAgLyogSW5pdGlhbGl6ZSB0aGUgQURDX01vZGUgbWVtYmVyICovDQogIEFEQ19Jbml0U3RydWN0LT5BRENfTW9kZSA9IEFEQ19Nb2RlX0luZGVwZW5kZW50Ow0KICAvKiBpbml0aWFsaXplIHRoZSBBRENfU2NhbkNvbnZNb2RlIG1lbWJlciAqLw0KICBBRENfSW5pdFN0cnVjdC0+QURDX1NjYW5Db252TW9kZSA9IERJU0FCTEU7DQogIC8qIEluaXRpYWxpemUgdGhlIEFEQ19Db250aW51b3VzQ29udk1vZGUgbWVtYmVyICovDQogIEFEQ19Jbml0U3RydWN0LT5BRENfQ29udGludW91c0NvbnZNb2RlID0gRElTQUJMRTsNCiAgLyogSW5pdGlhbGl6ZSB0aGUgQURDX0V4dGVybmFsVHJpZ0NvbnYgbWVtYmVyICovDQogIEFEQ19Jbml0U3RydWN0LT5BRENfRXh0ZXJuYWxUcmlnQ29udiA9IEFEQ19FeHRlcm5hbFRyaWdDb252X1QxX0NDMTsNCiAgLyogSW5pdGlhbGl6ZSB0aGUgQURDX0RhdGFBbGlnbiBtZW1iZXIgKi8NCiAgQURDX0luaXRTdHJ1Y3QtPkFEQ19EYXRhQWxpZ24gPSBBRENfRGF0YUFsaWduX1JpZ2h0Ow0KICAvKiBJbml0aWFsaXplIHRoZSBBRENfTmJyT2ZDaGFubmVsIG1lbWJlciAqLw0KICBBRENfSW5pdFN0cnVjdC0+QURDX05ick9mQ2hhbm5lbCA9IDE7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEFEQyBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBBREN4IHBlcmlwaGVyYWwuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBBRENfQ21kKEFEQ19UeXBlRGVmKiBBREN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogU2V0IHRoZSBBRE9OIGJpdCB0byB3YWtlIHVwIHRoZSBBREMgZnJvbSBwb3dlciBkb3duIG1vZGUgKi8NCiAgICBBREN4LT5DUjIgfD0gQ1IyX0FET05fU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEFEQyBwZXJpcGhlcmFsICovDQogICAgQURDeC0+Q1IyICY9IENSMl9BRE9OX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEFEQyBETUEgcmVxdWVzdC4NCiAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KICAqICAgTm90ZTogQURDMiBoYXNuJ3QgYSBETUEgY2FwYWJpbGl0eS4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIEFEQyBETUEgdHJhbnNmZXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBBRENfRE1BQ21kKEFEQ19UeXBlRGVmKiBBREN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19BRENfRE1BX1BFUklQSChBREN4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgRE1BIHJlcXVlc3QgKi8NCiAgICBBREN4LT5DUjIgfD0gQ1IyX0RNQV9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDIERNQSByZXF1ZXN0ICovDQogICAgQURDeC0+Q1IyICY9IENSMl9ETUFfUmVzZXQ7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgQURDIGludGVycnVwdHMuDQogICogQHBhcmFtICBBREN4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIEFEQ19JVDogc3BlY2lmaWVzIHRoZSBBREMgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEFEQ19JVF9FT0M6IEVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCBtYXNrDQogICogICAgIEBhcmcgQURDX0lUX0FXRDogQW5hbG9nIHdhdGNoZG9nIGludGVycnVwdCBtYXNrDQogICogICAgIEBhcmcgQURDX0lUX0pFT0M6IEVuZCBvZiBpbmplY3RlZCBjb252ZXJzaW9uIGludGVycnVwdCBtYXNrDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgQURDIGludGVycnVwdHMuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBBRENfSVRDb25maWcoQURDX1R5cGVEZWYqIEFEQ3gsIHVpbnQxNl90IEFEQ19JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICB1aW50OF90IGl0bWFzayA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGFzc2VydF9wYXJhbShJU19BRENfSVQoQURDX0lUKSk7DQogIC8qIEdldCB0aGUgQURDIElUIGluZGV4ICovDQogIGl0bWFzayA9ICh1aW50OF90KUFEQ19JVDsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBpbnRlcnJ1cHRzICovDQogICAgQURDeC0+Q1IxIHw9IGl0bWFzazsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMgaW50ZXJydXB0cyAqLw0KICAgIEFEQ3gtPkNSMSAmPSAofih1aW50MzJfdClpdG1hc2spOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmVzZXRzIHRoZSBzZWxlY3RlZCBBREMgY2FsaWJyYXRpb24gcmVnaXN0ZXJzLg0KICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEFEQ19SZXNldENhbGlicmF0aW9uKEFEQ19UeXBlRGVmKiBBREN4KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KICAvKiBSZXNldHMgdGhlIHNlbGVjdGVkIEFEQyBjYWxpYmFydGlvbiByZWdpc3RlcnMgKi8gIA0KICBBREN4LT5DUjIgfD0gQ1IyX1JTVENBTF9TZXQ7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgR2V0cyB0aGUgc2VsZWN0ZWQgQURDIHJlc2V0IGNhbGlicmF0aW9uIHJlZ2lzdGVycyBzdGF0dXMuDQogICogQHBhcmFtICBBREN4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgQURDIHJlc2V0IGNhbGlicmF0aW9uIHJlZ2lzdGVycyAoU0VUIG9yIFJFU0VUKS4NCiAgKi8NCkZsYWdTdGF0dXMgQURDX0dldFJlc2V0Q2FsaWJyYXRpb25TdGF0dXMoQURDX1R5cGVEZWYqIEFEQ3gpDQp7DQogIEZsYWdTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQogIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgUlNUQ0FMIGJpdCAqLw0KICBpZiAoKEFEQ3gtPkNSMiAmIENSMl9SU1RDQUxfU2V0KSAhPSAodWludDMyX3QpUkVTRVQpDQogIHsNCiAgICAvKiBSU1RDQUwgYml0IGlzIHNldCAqLw0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBSU1RDQUwgYml0IGlzIHJlc2V0ICovDQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgLyogUmV0dXJuIHRoZSBSU1RDQUwgYml0IHN0YXR1cyAqLw0KICByZXR1cm4gIGJpdHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTdGFydHMgdGhlIHNlbGVjdGVkIEFEQyBjYWxpYnJhdGlvbiBwcm9jZXNzLg0KICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEFEQ19TdGFydENhbGlicmF0aW9uKEFEQ19UeXBlRGVmKiBBREN4KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBjYWxpYnJhdGlvbiBwcm9jZXNzICovICANCiAgQURDeC0+Q1IyIHw9IENSMl9DQUxfU2V0Ow0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEdldHMgdGhlIHNlbGVjdGVkIEFEQyBjYWxpYnJhdGlvbiBzdGF0dXMuDQogICogQHBhcmFtICBBREN4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgQURDIGNhbGlicmF0aW9uIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KRmxhZ1N0YXR1cyBBRENfR2V0Q2FsaWJyYXRpb25TdGF0dXMoQURDX1R5cGVEZWYqIEFEQ3gpDQp7DQogIEZsYWdTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQogIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgQ0FMIGJpdCAqLw0KICBpZiAoKEFEQ3gtPkNSMiAmIENSMl9DQUxfU2V0KSAhPSAodWludDMyX3QpUkVTRVQpDQogIHsNCiAgICAvKiBDQUwgYml0IGlzIHNldDogY2FsaWJyYXRpb24gb24gZ29pbmcgKi8NCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogQ0FMIGJpdCBpcyByZXNldDogZW5kIG9mIGNhbGlicmF0aW9uICovDQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgLyogUmV0dXJuIHRoZSBDQUwgYml0IHN0YXR1cyAqLw0KICByZXR1cm4gIGJpdHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzZWxlY3RlZCBBREMgc29mdHdhcmUgc3RhcnQgY29udmVyc2lvbiAuDQogICogQHBhcmFtICBBREN4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIEFEQyBzb2Z0d2FyZSBzdGFydCBjb252ZXJzaW9uLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgQURDX1NvZnR3YXJlU3RhcnRDb252Q21kKEFEQ19UeXBlRGVmKiBBREN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgY29udmVyc2lvbiBvbiBleHRlcm5hbCBldmVudCBhbmQgc3RhcnQgdGhlIHNlbGVjdGVkDQogICAgICAgQURDIGNvbnZlcnNpb24gKi8NCiAgICBBREN4LT5DUjIgfD0gQ1IyX0VYVFRSSUdfU1dTVEFSVF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGNvbnZlcnNpb24gb24gZXh0ZXJuYWwgZXZlbnQgYW5kIHN0b3AgdGhlIHNlbGVjdGVkDQogICAgICAgQURDIGNvbnZlcnNpb24gKi8NCiAgICBBREN4LT5DUjIgJj0gQ1IyX0VYVFRSSUdfU1dTVEFSVF9SZXNldDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEdldHMgdGhlIHNlbGVjdGVkIEFEQyBTb2Z0d2FyZSBzdGFydCBjb252ZXJzaW9uIFN0YXR1cy4NCiAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBBREMgc29mdHdhcmUgc3RhcnQgY29udmVyc2lvbiAoU0VUIG9yIFJFU0VUKS4NCiAgKi8NCkZsYWdTdGF0dXMgQURDX0dldFNvZnR3YXJlU3RhcnRDb252U3RhdHVzKEFEQ19UeXBlRGVmKiBBREN4KQ0Kew0KICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIFNXU1RBUlQgYml0ICovDQogIGlmICgoQURDeC0+Q1IyICYgQ1IyX1NXU1RBUlRfU2V0KSAhPSAodWludDMyX3QpUkVTRVQpDQogIHsNCiAgICAvKiBTV1NUQVJUIGJpdCBpcyBzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogU1dTVEFSVCBiaXQgaXMgcmVzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICAvKiBSZXR1cm4gdGhlIFNXU1RBUlQgYml0IHN0YXR1cyAqLw0KICByZXR1cm4gIGJpdHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBkaXNjb250aW51b3VzIG1vZGUgZm9yIHRoZSBzZWxlY3RlZCBBREMgcmVndWxhcg0KICAqICAgZ3JvdXAgY2hhbm5lbC4NCiAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgTnVtYmVyOiBzcGVjaWZpZXMgdGhlIGRpc2NvbnRpbnVvdXMgbW9kZSByZWd1bGFyIGNoYW5uZWwNCiAgKiAgIGNvdW50IHZhbHVlLiBUaGlzIG51bWJlciBtdXN0IGJlIGJldHdlZW4gMSBhbmQgOC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgQURDX0Rpc2NNb2RlQ2hhbm5lbENvdW50Q29uZmlnKEFEQ19UeXBlRGVmKiBBREN4LCB1aW50OF90IE51bWJlcikNCnsNCiAgdWludDMyX3QgdG1wcmVnMSA9IDA7DQogIHVpbnQzMl90IHRtcHJlZzIgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX1JFR1VMQVJfRElTQ19OVU1CRVIoTnVtYmVyKSk7DQogIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcHJlZzEgPSBBREN4LT5DUjE7DQogIC8qIENsZWFyIHRoZSBvbGQgZGlzY29udGludW91cyBtb2RlIGNoYW5uZWwgY291bnQgKi8NCiAgdG1wcmVnMSAmPSBDUjFfRElTQ05VTV9SZXNldDsNCiAgLyogU2V0IHRoZSBkaXNjb250aW51b3VzIG1vZGUgY2hhbm5lbCBjb3VudCAqLw0KICB0bXByZWcyID0gTnVtYmVyIC0gMTsNCiAgdG1wcmVnMSB8PSB0bXByZWcyIDw8IDEzOw0KICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQogIEFEQ3gtPkNSMSA9IHRtcHJlZzE7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZGlzY29udGludW91cyBtb2RlIG9uIHJlZ3VsYXIgZ3JvdXANCiAgKiAgIGNoYW5uZWwgZm9yIHRoZSBzcGVjaWZpZWQgQURDDQogICogQHBhcmFtICBBREN4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIEFEQyBkaXNjb250aW51b3VzIG1vZGUNCiAgKiAgIG9uIHJlZ3VsYXIgZ3JvdXAgY2hhbm5lbC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEFEQ19EaXNjTW9kZUNtZChBRENfVHlwZURlZiogQURDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgQURDIHJlZ3VsYXIgZGlzY29udGludW91cyBtb2RlICovDQogICAgQURDeC0+Q1IxIHw9IENSMV9ESVNDRU5fU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEFEQyByZWd1bGFyIGRpc2NvbnRpbnVvdXMgbW9kZSAqLw0KICAgIEFEQ3gtPkNSMSAmPSBDUjFfRElTQ0VOX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyBmb3IgdGhlIHNlbGVjdGVkIEFEQyByZWd1bGFyIGNoYW5uZWwgaXRzIGNvcnJlc3BvbmRpbmcNCiAgKiAgIHJhbmsgaW4gdGhlIHNlcXVlbmNlciBhbmQgaXRzIHNhbXBsZSB0aW1lLg0KICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBBRENfQ2hhbm5lbDogdGhlIEFEQyBjaGFubmVsIHRvIGNvbmZpZ3VyZS4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzA6IEFEQyBDaGFubmVsMCBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzE6IEFEQyBDaGFubmVsMSBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzI6IEFEQyBDaGFubmVsMiBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzM6IEFEQyBDaGFubmVsMyBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzQ6IEFEQyBDaGFubmVsNCBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzU6IEFEQyBDaGFubmVsNSBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzY6IEFEQyBDaGFubmVsNiBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzc6IEFEQyBDaGFubmVsNyBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzg6IEFEQyBDaGFubmVsOCBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzk6IEFEQyBDaGFubmVsOSBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzEwOiBBREMgQ2hhbm5lbDEwIHNlbGVjdGVkDQogICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTE6IEFEQyBDaGFubmVsMTEgc2VsZWN0ZWQNCiAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8xMjogQURDIENoYW5uZWwxMiBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzEzOiBBREMgQ2hhbm5lbDEzIHNlbGVjdGVkDQogICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTQ6IEFEQyBDaGFubmVsMTQgc2VsZWN0ZWQNCiAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8xNTogQURDIENoYW5uZWwxNSBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzE2OiBBREMgQ2hhbm5lbDE2IHNlbGVjdGVkDQogICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTc6IEFEQyBDaGFubmVsMTcgc2VsZWN0ZWQNCiAgKiBAcGFyYW0gIFJhbms6IFRoZSByYW5rIGluIHRoZSByZWd1bGFyIGdyb3VwIHNlcXVlbmNlci4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBiZXR3ZWVuIDEgdG8gMTYuDQogICogQHBhcmFtICBBRENfU2FtcGxlVGltZTogVGhlIHNhbXBsZSB0aW1lIHZhbHVlIHRvIGJlIHNldCBmb3IgdGhlIHNlbGVjdGVkIGNoYW5uZWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBBRENfU2FtcGxlVGltZV8xQ3ljbGVzNTogU2FtcGxlIHRpbWUgZXF1YWwgdG8gMS41IGN5Y2xlcw0KICAqICAgICBAYXJnIEFEQ19TYW1wbGVUaW1lXzdDeWNsZXM1OiBTYW1wbGUgdGltZSBlcXVhbCB0byA3LjUgY3ljbGVzDQogICogICAgIEBhcmcgQURDX1NhbXBsZVRpbWVfMTNDeWNsZXM1OiBTYW1wbGUgdGltZSBlcXVhbCB0byAxMy41IGN5Y2xlcw0KICAqICAgICBAYXJnIEFEQ19TYW1wbGVUaW1lXzI4Q3ljbGVzNTogU2FtcGxlIHRpbWUgZXF1YWwgdG8gMjguNSBjeWNsZXMJDQogICogICAgIEBhcmcgQURDX1NhbXBsZVRpbWVfNDFDeWNsZXM1OiBTYW1wbGUgdGltZSBlcXVhbCB0byA0MS41IGN5Y2xlcwkNCiAgKiAgICAgQGFyZyBBRENfU2FtcGxlVGltZV81NUN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDU1LjUgY3ljbGVzCQ0KICAqICAgICBAYXJnIEFEQ19TYW1wbGVUaW1lXzcxQ3ljbGVzNTogU2FtcGxlIHRpbWUgZXF1YWwgdG8gNzEuNSBjeWNsZXMJDQogICogICAgIEBhcmcgQURDX1NhbXBsZVRpbWVfMjM5Q3ljbGVzNTogU2FtcGxlIHRpbWUgZXF1YWwgdG8gMjM5LjUgY3ljbGVzCQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBBRENfUmVndWxhckNoYW5uZWxDb25maWcoQURDX1R5cGVEZWYqIEFEQ3gsIHVpbnQ4X3QgQURDX0NoYW5uZWwsIHVpbnQ4X3QgUmFuaywgdWludDhfdCBBRENfU2FtcGxlVGltZSkNCnsNCiAgdWludDMyX3QgdG1wcmVnMSA9IDAsIHRtcHJlZzIgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0NIQU5ORUwoQURDX0NoYW5uZWwpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SRUdVTEFSX1JBTksoUmFuaykpOw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX1NBTVBMRV9USU1FKEFEQ19TYW1wbGVUaW1lKSk7DQogIC8qIGlmIEFEQ19DaGFubmVsXzEwIC4uLiBBRENfQ2hhbm5lbF8xNyBpcyBzZWxlY3RlZCAqLw0KICBpZiAoQURDX0NoYW5uZWwgPiBBRENfQ2hhbm5lbF85KQ0KICB7DQogICAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgICB0bXByZWcxID0gQURDeC0+U01QUjE7DQogICAgLyogQ2FsY3VsYXRlIHRoZSBtYXNrIHRvIGNsZWFyICovDQogICAgdG1wcmVnMiA9IFNNUFIxX1NNUF9TZXQgPDwgKDMgKiAoQURDX0NoYW5uZWwgLSAxMCkpOw0KICAgIC8qIENsZWFyIHRoZSBvbGQgY2hhbm5lbCBzYW1wbGUgdGltZSAqLw0KICAgIHRtcHJlZzEgJj0gfnRtcHJlZzI7DQogICAgLyogQ2FsY3VsYXRlIHRoZSBtYXNrIHRvIHNldCAqLw0KICAgIHRtcHJlZzIgPSAodWludDMyX3QpQURDX1NhbXBsZVRpbWUgPDwgKDMgKiAoQURDX0NoYW5uZWwgLSAxMCkpOw0KICAgIC8qIFNldCB0aGUgbmV3IGNoYW5uZWwgc2FtcGxlIHRpbWUgKi8NCiAgICB0bXByZWcxIHw9IHRtcHJlZzI7DQogICAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KICAgIEFEQ3gtPlNNUFIxID0gdG1wcmVnMTsNCiAgfQ0KICBlbHNlIC8qIEFEQ19DaGFubmVsIGluY2x1ZGUgaW4gQURDX0NoYW5uZWxfWzAuLjldICovDQogIHsNCiAgICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KICAgIHRtcHJlZzEgPSBBREN4LT5TTVBSMjsNCiAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gY2xlYXIgKi8NCiAgICB0bXByZWcyID0gU01QUjJfU01QX1NldCA8PCAoMyAqIEFEQ19DaGFubmVsKTsNCiAgICAvKiBDbGVhciB0aGUgb2xkIGNoYW5uZWwgc2FtcGxlIHRpbWUgKi8NCiAgICB0bXByZWcxICY9IH50bXByZWcyOw0KICAgIC8qIENhbGN1bGF0ZSB0aGUgbWFzayB0byBzZXQgKi8NCiAgICB0bXByZWcyID0gKHVpbnQzMl90KUFEQ19TYW1wbGVUaW1lIDw8ICgzICogQURDX0NoYW5uZWwpOw0KICAgIC8qIFNldCB0aGUgbmV3IGNoYW5uZWwgc2FtcGxlIHRpbWUgKi8NCiAgICB0bXByZWcxIHw9IHRtcHJlZzI7DQogICAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KICAgIEFEQ3gtPlNNUFIyID0gdG1wcmVnMTsNCiAgfQ0KICAvKiBGb3IgUmFuayAxIHRvIDYgKi8NCiAgaWYgKFJhbmsgPCA3KQ0KICB7DQogICAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgICB0bXByZWcxID0gQURDeC0+U1FSMzsNCiAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gY2xlYXIgKi8NCiAgICB0bXByZWcyID0gU1FSM19TUV9TZXQgPDwgKDUgKiAoUmFuayAtIDEpKTsNCiAgICAvKiBDbGVhciB0aGUgb2xkIFNReCBiaXRzIGZvciB0aGUgc2VsZWN0ZWQgcmFuayAqLw0KICAgIHRtcHJlZzEgJj0gfnRtcHJlZzI7DQogICAgLyogQ2FsY3VsYXRlIHRoZSBtYXNrIHRvIHNldCAqLw0KICAgIHRtcHJlZzIgPSAodWludDMyX3QpQURDX0NoYW5uZWwgPDwgKDUgKiAoUmFuayAtIDEpKTsNCiAgICAvKiBTZXQgdGhlIFNReCBiaXRzIGZvciB0aGUgc2VsZWN0ZWQgcmFuayAqLw0KICAgIHRtcHJlZzEgfD0gdG1wcmVnMjsNCiAgICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQogICAgQURDeC0+U1FSMyA9IHRtcHJlZzE7DQogIH0NCiAgLyogRm9yIFJhbmsgNyB0byAxMiAqLw0KICBlbHNlIGlmIChSYW5rIDwgMTMpDQogIHsNCiAgICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KICAgIHRtcHJlZzEgPSBBREN4LT5TUVIyOw0KICAgIC8qIENhbGN1bGF0ZSB0aGUgbWFzayB0byBjbGVhciAqLw0KICAgIHRtcHJlZzIgPSBTUVIyX1NRX1NldCA8PCAoNSAqIChSYW5rIC0gNykpOw0KICAgIC8qIENsZWFyIHRoZSBvbGQgU1F4IGJpdHMgZm9yIHRoZSBzZWxlY3RlZCByYW5rICovDQogICAgdG1wcmVnMSAmPSB+dG1wcmVnMjsNCiAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gc2V0ICovDQogICAgdG1wcmVnMiA9ICh1aW50MzJfdClBRENfQ2hhbm5lbCA8PCAoNSAqIChSYW5rIC0gNykpOw0KICAgIC8qIFNldCB0aGUgU1F4IGJpdHMgZm9yIHRoZSBzZWxlY3RlZCByYW5rICovDQogICAgdG1wcmVnMSB8PSB0bXByZWcyOw0KICAgIC8qIFN0b3JlIHRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgICBBREN4LT5TUVIyID0gdG1wcmVnMTsNCiAgfQ0KICAvKiBGb3IgUmFuayAxMyB0byAxNiAqLw0KICBlbHNlDQogIHsNCiAgICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KICAgIHRtcHJlZzEgPSBBREN4LT5TUVIxOw0KICAgIC8qIENhbGN1bGF0ZSB0aGUgbWFzayB0byBjbGVhciAqLw0KICAgIHRtcHJlZzIgPSBTUVIxX1NRX1NldCA8PCAoNSAqIChSYW5rIC0gMTMpKTsNCiAgICAvKiBDbGVhciB0aGUgb2xkIFNReCBiaXRzIGZvciB0aGUgc2VsZWN0ZWQgcmFuayAqLw0KICAgIHRtcHJlZzEgJj0gfnRtcHJlZzI7DQogICAgLyogQ2FsY3VsYXRlIHRoZSBtYXNrIHRvIHNldCAqLw0KICAgIHRtcHJlZzIgPSAodWludDMyX3QpQURDX0NoYW5uZWwgPDwgKDUgKiAoUmFuayAtIDEzKSk7DQogICAgLyogU2V0IHRoZSBTUXggYml0cyBmb3IgdGhlIHNlbGVjdGVkIHJhbmsgKi8NCiAgICB0bXByZWcxIHw9IHRtcHJlZzI7DQogICAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KICAgIEFEQ3gtPlNRUjEgPSB0bXByZWcxOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgQURDeCBjb252ZXJzaW9uIHRocm91Z2ggZXh0ZXJuYWwgdHJpZ2dlci4NCiAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGV4dGVybmFsIHRyaWdnZXIgc3RhcnQgb2YgY29udmVyc2lvbi4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEFEQ19FeHRlcm5hbFRyaWdDb252Q21kKEFEQ19UeXBlRGVmKiBBREN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgY29udmVyc2lvbiBvbiBleHRlcm5hbCBldmVudCAqLw0KICAgIEFEQ3gtPkNSMiB8PSBDUjJfRVhUVFJJR19TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGNvbnZlcnNpb24gb24gZXh0ZXJuYWwgZXZlbnQgKi8NCiAgICBBREN4LT5DUjIgJj0gQ1IyX0VYVFRSSUdfUmVzZXQ7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBSZXR1cm5zIHRoZSBsYXN0IEFEQ3ggY29udmVyc2lvbiByZXN1bHQgZGF0YSBmb3IgcmVndWxhciBjaGFubmVsLg0KICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQogICogQHJldHZhbCBUaGUgRGF0YSBjb252ZXJzaW9uIHZhbHVlLg0KICAqLw0KdWludDE2X3QgQURDX0dldENvbnZlcnNpb25WYWx1ZShBRENfVHlwZURlZiogQURDeCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCiAgLyogUmV0dXJuIHRoZSBzZWxlY3RlZCBBREMgY29udmVyc2lvbiB2YWx1ZSAqLw0KICByZXR1cm4gKHVpbnQxNl90KSBBREN4LT5EUjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZXR1cm5zIHRoZSBsYXN0IEFEQzEgYW5kIEFEQzIgY29udmVyc2lvbiByZXN1bHQgZGF0YSBpbiBkdWFsIG1vZGUuDQogICogQHJldHZhbCBUaGUgRGF0YSBjb252ZXJzaW9uIHZhbHVlLg0KICAqLw0KdWludDMyX3QgQURDX0dldER1YWxNb2RlQ29udmVyc2lvblZhbHVlKHZvaWQpDQp7DQogIC8qIFJldHVybiB0aGUgZHVhbCBtb2RlIGNvbnZlcnNpb24gdmFsdWUgKi8NCiAgcmV0dXJuICgqKF9fSU8gdWludDMyX3QgKikgRFJfQUREUkVTUyk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc2VsZWN0ZWQgQURDIGF1dG9tYXRpYyBpbmplY3RlZCBncm91cA0KICAqICAgY29udmVyc2lvbiBhZnRlciByZWd1bGFyIG9uZS4NCiAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGF1dG8gaW5qZWN0ZWQgY29udmVyc2lvbg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgQURDX0F1dG9JbmplY3RlZENvbnZDbWQoQURDX1R5cGVEZWYqIEFEQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBhdXRvbWF0aWMgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiAqLw0KICAgIEFEQ3gtPkNSMSB8PSBDUjFfSkFVVE9fU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEFEQyBhdXRvbWF0aWMgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiAqLw0KICAgIEFEQ3gtPkNSMSAmPSBDUjFfSkFVVE9fUmVzZXQ7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBkaXNjb250aW51b3VzIG1vZGUgZm9yIGluamVjdGVkIGdyb3VwDQogICogICBjaGFubmVsIGZvciB0aGUgc3BlY2lmaWVkIEFEQw0KICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzZWxlY3RlZCBBREMgZGlzY29udGludW91cyBtb2RlDQogICogICBvbiBpbmplY3RlZCBncm91cCBjaGFubmVsLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgQURDX0luamVjdGVkRGlzY01vZGVDbWQoQURDX1R5cGVEZWYqIEFEQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBpbmplY3RlZCBkaXNjb250aW51b3VzIG1vZGUgKi8NCiAgICBBREN4LT5DUjEgfD0gQ1IxX0pESVNDRU5fU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEFEQyBpbmplY3RlZCBkaXNjb250aW51b3VzIG1vZGUgKi8NCiAgICBBREN4LT5DUjEgJj0gQ1IxX0pESVNDRU5fUmVzZXQ7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBBREN4IGV4dGVybmFsIHRyaWdnZXIgZm9yIGluamVjdGVkIGNoYW5uZWxzIGNvbnZlcnNpb24uDQogICogQHBhcmFtICBBREN4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnY6IHNwZWNpZmllcyB0aGUgQURDIHRyaWdnZXIgdG8gc3RhcnQgaW5qZWN0ZWQgY29udmVyc2lvbi4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDFfVFJHTzogVGltZXIxIFRSR08gZXZlbnQgc2VsZWN0ZWQgKGZvciBBREMxLCBBREMyIGFuZCBBREMzKQ0KICAqICAgICBAYXJnIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDFfQ0M0OiBUaW1lcjEgY2FwdHVyZSBjb21wYXJlNCBzZWxlY3RlZCAoZm9yIEFEQzEsIEFEQzIgYW5kIEFEQzMpDQogICogICAgIEBhcmcgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UMl9UUkdPOiBUaW1lcjIgVFJHTyBldmVudCBzZWxlY3RlZCAoZm9yIEFEQzEgYW5kIEFEQzIpDQogICogICAgIEBhcmcgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UMl9DQzE6IFRpbWVyMiBjYXB0dXJlIGNvbXBhcmUxIHNlbGVjdGVkIChmb3IgQURDMSBhbmQgQURDMikNCiAgKiAgICAgQGFyZyBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X1QzX0NDNDogVGltZXIzIGNhcHR1cmUgY29tcGFyZTQgc2VsZWN0ZWQgKGZvciBBREMxIGFuZCBBREMyKQ0KICAqICAgICBAYXJnIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDRfVFJHTzogVGltZXI0IFRSR08gZXZlbnQgc2VsZWN0ZWQgKGZvciBBREMxIGFuZCBBREMyKQ0KICAqICAgICBAYXJnIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfRXh0X0lUMTVfVElNOF9DQzQ6IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDE1IG9yIFRpbWVyOA0KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmUgY29tcGFyZTQgZXZlbnQgc2VsZWN0ZWQgKGZvciBBREMxIGFuZCBBREMyKSAgICAgICAgICAgICAgICAgICAgICAgDQogICogICAgIEBhcmcgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UNF9DQzM6IFRpbWVyNCBjYXB0dXJlIGNvbXBhcmUzIHNlbGVjdGVkIChmb3IgQURDMyBvbmx5KQ0KICAqICAgICBAYXJnIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDhfQ0MyOiBUaW1lcjggY2FwdHVyZSBjb21wYXJlMiBzZWxlY3RlZCAoZm9yIEFEQzMgb25seSkgICAgICAgICAgICAgICAgICAgICAgICAgDQogICogICAgIEBhcmcgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UOF9DQzQ6IFRpbWVyOCBjYXB0dXJlIGNvbXBhcmU0IHNlbGVjdGVkIChmb3IgQURDMyBvbmx5KQ0KICAqICAgICBAYXJnIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDVfVFJHTzogVGltZXI1IFRSR08gZXZlbnQgc2VsZWN0ZWQgKGZvciBBREMzIG9ubHkpICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAqICAgICBAYXJnIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDVfQ0M0OiBUaW1lcjUgY2FwdHVyZSBjb21wYXJlNCBzZWxlY3RlZCAoZm9yIEFEQzMgb25seSkgICAgICAgICAgICAgICAgICAgICAgICANCiAgKiAgICAgQGFyZyBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X05vbmU6IEluamVjdGVkIGNvbnZlcnNpb24gc3RhcnRlZCBieSBzb2Z0d2FyZSBhbmQgbm90DQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBleHRlcm5hbCB0cmlnZ2VyIChmb3IgQURDMSwgQURDMiBhbmQgQURDMykNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgQURDX0V4dGVybmFsVHJpZ0luamVjdGVkQ29udkNvbmZpZyhBRENfVHlwZURlZiogQURDeCwgdWludDMyX3QgQURDX0V4dGVybmFsVHJpZ0luamVjQ29udikNCnsNCiAgdWludDMyX3QgdG1wcmVnID0gMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19FWFRfSU5KRUNfVFJJRyhBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252KSk7DQogIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcHJlZyA9IEFEQ3gtPkNSMjsNCiAgLyogQ2xlYXIgdGhlIG9sZCBleHRlcm5hbCBldmVudCBzZWxlY3Rpb24gZm9yIGluamVjdGVkIGdyb3VwICovDQogIHRtcHJlZyAmPSBDUjJfSkVYVFNFTF9SZXNldDsNCiAgLyogU2V0IHRoZSBleHRlcm5hbCBldmVudCBzZWxlY3Rpb24gZm9yIGluamVjdGVkIGdyb3VwICovDQogIHRtcHJlZyB8PSBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252Ow0KICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQogIEFEQ3gtPkNSMiA9IHRtcHJlZzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBBREN4IGluamVjdGVkIGNoYW5uZWxzIGNvbnZlcnNpb24gdGhyb3VnaA0KICAqICAgZXh0ZXJuYWwgdHJpZ2dlcg0KICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzZWxlY3RlZCBBREMgZXh0ZXJuYWwgdHJpZ2dlciBzdGFydCBvZg0KICAqICAgaW5qZWN0ZWQgY29udmVyc2lvbi4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEFEQ19FeHRlcm5hbFRyaWdJbmplY3RlZENvbnZDbWQoQURDX1R5cGVEZWYqIEFEQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBleHRlcm5hbCBldmVudCBzZWxlY3Rpb24gZm9yIGluamVjdGVkIGdyb3VwICovDQogICAgQURDeC0+Q1IyIHw9IENSMl9KRVhUVFJJR19TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGV4dGVybmFsIGV2ZW50IHNlbGVjdGlvbiBmb3IgaW5qZWN0ZWQgZ3JvdXAgKi8NCiAgICBBREN4LT5DUjIgJj0gQ1IyX0pFWFRUUklHX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc2VsZWN0ZWQgQURDIHN0YXJ0IG9mIHRoZSBpbmplY3RlZCANCiAgKiAgIGNoYW5uZWxzIGNvbnZlcnNpb24uDQogICogQHBhcmFtICBBREN4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIEFEQyBzb2Z0d2FyZSBzdGFydCBpbmplY3RlZCBjb252ZXJzaW9uLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgQURDX1NvZnR3YXJlU3RhcnRJbmplY3RlZENvbnZDbWQoQURDX1R5cGVEZWYqIEFEQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBjb252ZXJzaW9uIGZvciBpbmplY3RlZCBncm91cCBvbiBleHRlcm5hbCBldmVudCBhbmQgc3RhcnQgdGhlIHNlbGVjdGVkDQogICAgICAgQURDIGluamVjdGVkIGNvbnZlcnNpb24gKi8NCiAgICBBREN4LT5DUjIgfD0gQ1IyX0pFWFRUUklHX0pTV1NUQVJUX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMgY29udmVyc2lvbiBvbiBleHRlcm5hbCBldmVudCBmb3IgaW5qZWN0ZWQgZ3JvdXAgYW5kIHN0b3AgdGhlIHNlbGVjdGVkDQogICAgICAgQURDIGluamVjdGVkIGNvbnZlcnNpb24gKi8NCiAgICBBREN4LT5DUjIgJj0gQ1IyX0pFWFRUUklHX0pTV1NUQVJUX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgR2V0cyB0aGUgc2VsZWN0ZWQgQURDIFNvZnR3YXJlIHN0YXJ0IGluamVjdGVkIGNvbnZlcnNpb24gU3RhdHVzLg0KICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQogICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIEFEQyBzb2Z0d2FyZSBzdGFydCBpbmplY3RlZCBjb252ZXJzaW9uIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KRmxhZ1N0YXR1cyBBRENfR2V0U29mdHdhcmVTdGFydEluamVjdGVkQ29udkNtZFN0YXR1cyhBRENfVHlwZURlZiogQURDeCkNCnsNCiAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCiAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiBKU1dTVEFSVCBiaXQgKi8NCiAgaWYgKChBREN4LT5DUjIgJiBDUjJfSlNXU1RBUlRfU2V0KSAhPSAodWludDMyX3QpUkVTRVQpDQogIHsNCiAgICAvKiBKU1dTVEFSVCBiaXQgaXMgc2V0ICovDQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIEpTV1NUQVJUIGJpdCBpcyByZXNldCAqLw0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIC8qIFJldHVybiB0aGUgSlNXU1RBUlQgYml0IHN0YXR1cyAqLw0KICByZXR1cm4gIGJpdHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIGZvciB0aGUgc2VsZWN0ZWQgQURDIGluamVjdGVkIGNoYW5uZWwgaXRzIGNvcnJlc3BvbmRpbmcNCiAgKiAgIHJhbmsgaW4gdGhlIHNlcXVlbmNlciBhbmQgaXRzIHNhbXBsZSB0aW1lLg0KICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBBRENfQ2hhbm5lbDogdGhlIEFEQyBjaGFubmVsIHRvIGNvbmZpZ3VyZS4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzA6IEFEQyBDaGFubmVsMCBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzE6IEFEQyBDaGFubmVsMSBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzI6IEFEQyBDaGFubmVsMiBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzM6IEFEQyBDaGFubmVsMyBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzQ6IEFEQyBDaGFubmVsNCBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzU6IEFEQyBDaGFubmVsNSBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzY6IEFEQyBDaGFubmVsNiBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzc6IEFEQyBDaGFubmVsNyBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzg6IEFEQyBDaGFubmVsOCBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzk6IEFEQyBDaGFubmVsOSBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzEwOiBBREMgQ2hhbm5lbDEwIHNlbGVjdGVkDQogICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTE6IEFEQyBDaGFubmVsMTEgc2VsZWN0ZWQNCiAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8xMjogQURDIENoYW5uZWwxMiBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzEzOiBBREMgQ2hhbm5lbDEzIHNlbGVjdGVkDQogICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTQ6IEFEQyBDaGFubmVsMTQgc2VsZWN0ZWQNCiAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8xNTogQURDIENoYW5uZWwxNSBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzE2OiBBREMgQ2hhbm5lbDE2IHNlbGVjdGVkDQogICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTc6IEFEQyBDaGFubmVsMTcgc2VsZWN0ZWQNCiAgKiBAcGFyYW0gIFJhbms6IFRoZSByYW5rIGluIHRoZSBpbmplY3RlZCBncm91cCBzZXF1ZW5jZXIuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA0Lg0KICAqIEBwYXJhbSAgQURDX1NhbXBsZVRpbWU6IFRoZSBzYW1wbGUgdGltZSB2YWx1ZSB0byBiZSBzZXQgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgQURDX1NhbXBsZVRpbWVfMUN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDEuNSBjeWNsZXMNCiAgKiAgICAgQGFyZyBBRENfU2FtcGxlVGltZV83Q3ljbGVzNTogU2FtcGxlIHRpbWUgZXF1YWwgdG8gNy41IGN5Y2xlcw0KICAqICAgICBAYXJnIEFEQ19TYW1wbGVUaW1lXzEzQ3ljbGVzNTogU2FtcGxlIHRpbWUgZXF1YWwgdG8gMTMuNSBjeWNsZXMNCiAgKiAgICAgQGFyZyBBRENfU2FtcGxlVGltZV8yOEN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDI4LjUgY3ljbGVzCQ0KICAqICAgICBAYXJnIEFEQ19TYW1wbGVUaW1lXzQxQ3ljbGVzNTogU2FtcGxlIHRpbWUgZXF1YWwgdG8gNDEuNSBjeWNsZXMJDQogICogICAgIEBhcmcgQURDX1NhbXBsZVRpbWVfNTVDeWNsZXM1OiBTYW1wbGUgdGltZSBlcXVhbCB0byA1NS41IGN5Y2xlcwkNCiAgKiAgICAgQGFyZyBBRENfU2FtcGxlVGltZV83MUN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDcxLjUgY3ljbGVzCQ0KICAqICAgICBAYXJnIEFEQ19TYW1wbGVUaW1lXzIzOUN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDIzOS41IGN5Y2xlcwkNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgQURDX0luamVjdGVkQ2hhbm5lbENvbmZpZyhBRENfVHlwZURlZiogQURDeCwgdWludDhfdCBBRENfQ2hhbm5lbCwgdWludDhfdCBSYW5rLCB1aW50OF90IEFEQ19TYW1wbGVUaW1lKQ0Kew0KICB1aW50MzJfdCB0bXByZWcxID0gMCwgdG1wcmVnMiA9IDAsIHRtcHJlZzMgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0NIQU5ORUwoQURDX0NoYW5uZWwpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19JTkpFQ1RFRF9SQU5LKFJhbmspKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TQU1QTEVfVElNRShBRENfU2FtcGxlVGltZSkpOw0KICAvKiBpZiBBRENfQ2hhbm5lbF8xMCAuLi4gQURDX0NoYW5uZWxfMTcgaXMgc2VsZWN0ZWQgKi8NCiAgaWYgKEFEQ19DaGFubmVsID4gQURDX0NoYW5uZWxfOSkNCiAgew0KICAgIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovDQogICAgdG1wcmVnMSA9IEFEQ3gtPlNNUFIxOw0KICAgIC8qIENhbGN1bGF0ZSB0aGUgbWFzayB0byBjbGVhciAqLw0KICAgIHRtcHJlZzIgPSBTTVBSMV9TTVBfU2V0IDw8ICgzKihBRENfQ2hhbm5lbCAtIDEwKSk7DQogICAgLyogQ2xlYXIgdGhlIG9sZCBjaGFubmVsIHNhbXBsZSB0aW1lICovDQogICAgdG1wcmVnMSAmPSB+dG1wcmVnMjsNCiAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gc2V0ICovDQogICAgdG1wcmVnMiA9ICh1aW50MzJfdClBRENfU2FtcGxlVGltZSA8PCAoMyooQURDX0NoYW5uZWwgLSAxMCkpOw0KICAgIC8qIFNldCB0aGUgbmV3IGNoYW5uZWwgc2FtcGxlIHRpbWUgKi8NCiAgICB0bXByZWcxIHw9IHRtcHJlZzI7DQogICAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KICAgIEFEQ3gtPlNNUFIxID0gdG1wcmVnMTsNCiAgfQ0KICBlbHNlIC8qIEFEQ19DaGFubmVsIGluY2x1ZGUgaW4gQURDX0NoYW5uZWxfWzAuLjldICovDQogIHsNCiAgICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KICAgIHRtcHJlZzEgPSBBREN4LT5TTVBSMjsNCiAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gY2xlYXIgKi8NCiAgICB0bXByZWcyID0gU01QUjJfU01QX1NldCA8PCAoMyAqIEFEQ19DaGFubmVsKTsNCiAgICAvKiBDbGVhciB0aGUgb2xkIGNoYW5uZWwgc2FtcGxlIHRpbWUgKi8NCiAgICB0bXByZWcxICY9IH50bXByZWcyOw0KICAgIC8qIENhbGN1bGF0ZSB0aGUgbWFzayB0byBzZXQgKi8NCiAgICB0bXByZWcyID0gKHVpbnQzMl90KUFEQ19TYW1wbGVUaW1lIDw8ICgzICogQURDX0NoYW5uZWwpOw0KICAgIC8qIFNldCB0aGUgbmV3IGNoYW5uZWwgc2FtcGxlIHRpbWUgKi8NCiAgICB0bXByZWcxIHw9IHRtcHJlZzI7DQogICAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KICAgIEFEQ3gtPlNNUFIyID0gdG1wcmVnMTsNCiAgfQ0KICAvKiBSYW5rIGNvbmZpZ3VyYXRpb24gKi8NCiAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wcmVnMSA9IEFEQ3gtPkpTUVI7DQogIC8qIEdldCBKTCB2YWx1ZTogTnVtYmVyID0gSkwrMSAqLw0KICB0bXByZWczID0gICh0bXByZWcxICYgSlNRUl9KTF9TZXQpPj4gMjA7DQogIC8qIENhbGN1bGF0ZSB0aGUgbWFzayB0byBjbGVhcjogKChSYW5rLTEpKyg0LUpMLTEpKSAqLw0KICB0bXByZWcyID0gSlNRUl9KU1FfU2V0IDw8ICg1ICogKHVpbnQ4X3QpKChSYW5rICsgMykgLSAodG1wcmVnMyArIDEpKSk7DQogIC8qIENsZWFyIHRoZSBvbGQgSlNReCBiaXRzIGZvciB0aGUgc2VsZWN0ZWQgcmFuayAqLw0KICB0bXByZWcxICY9IH50bXByZWcyOw0KICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gc2V0OiAoKFJhbmstMSkrKDQtSkwtMSkpICovDQogIHRtcHJlZzIgPSAodWludDMyX3QpQURDX0NoYW5uZWwgPDwgKDUgKiAodWludDhfdCkoKFJhbmsgKyAzKSAtICh0bXByZWczICsgMSkpKTsNCiAgLyogU2V0IHRoZSBKU1F4IGJpdHMgZm9yIHRoZSBzZWxlY3RlZCByYW5rICovDQogIHRtcHJlZzEgfD0gdG1wcmVnMjsNCiAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KICBBREN4LT5KU1FSID0gdG1wcmVnMTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBzZXF1ZW5jZXIgbGVuZ3RoIGZvciBpbmplY3RlZCBjaGFubmVscw0KICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBMZW5ndGg6IFRoZSBzZXF1ZW5jZXIgbGVuZ3RoLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAxIHRvIDQuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEFEQ19JbmplY3RlZFNlcXVlbmNlckxlbmd0aENvbmZpZyhBRENfVHlwZURlZiogQURDeCwgdWludDhfdCBMZW5ndGgpDQp7DQogIHVpbnQzMl90IHRtcHJlZzEgPSAwOw0KICB1aW50MzJfdCB0bXByZWcyID0gMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19JTkpFQ1RFRF9MRU5HVEgoTGVuZ3RoKSk7DQogIA0KICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KICB0bXByZWcxID0gQURDeC0+SlNRUjsNCiAgLyogQ2xlYXIgdGhlIG9sZCBpbmplY3RlZCBzZXF1bmVuY2UgbGVuZ2h0IEpMIGJpdHMgKi8NCiAgdG1wcmVnMSAmPSBKU1FSX0pMX1Jlc2V0Ow0KICAvKiBTZXQgdGhlIGluamVjdGVkIHNlcXVuZW5jZSBsZW5naHQgSkwgYml0cyAqLw0KICB0bXByZWcyID0gTGVuZ3RoIC0gMTsgDQogIHRtcHJlZzEgfD0gdG1wcmVnMiA8PCAyMDsNCiAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KICBBREN4LT5KU1FSID0gdG1wcmVnMTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXQgdGhlIGluamVjdGVkIGNoYW5uZWxzIGNvbnZlcnNpb24gdmFsdWUgb2Zmc2V0DQogICogQHBhcmFtICBBREN4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIEFEQ19JbmplY3RlZENoYW5uZWw6IHRoZSBBREMgaW5qZWN0ZWQgY2hhbm5lbCB0byBzZXQgaXRzIG9mZnNldC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEFEQ19JbmplY3RlZENoYW5uZWxfMTogSW5qZWN0ZWQgQ2hhbm5lbDEgc2VsZWN0ZWQNCiAgKiAgICAgQGFyZyBBRENfSW5qZWN0ZWRDaGFubmVsXzI6IEluamVjdGVkIENoYW5uZWwyIHNlbGVjdGVkDQogICogICAgIEBhcmcgQURDX0luamVjdGVkQ2hhbm5lbF8zOiBJbmplY3RlZCBDaGFubmVsMyBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19JbmplY3RlZENoYW5uZWxfNDogSW5qZWN0ZWQgQ2hhbm5lbDQgc2VsZWN0ZWQNCiAgKiBAcGFyYW0gIE9mZnNldDogdGhlIG9mZnNldCB2YWx1ZSBmb3IgdGhlIHNlbGVjdGVkIEFEQyBpbmplY3RlZCBjaGFubmVsDQogICogICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgMTJiaXQgdmFsdWUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEFEQ19TZXRJbmplY3RlZE9mZnNldChBRENfVHlwZURlZiogQURDeCwgdWludDhfdCBBRENfSW5qZWN0ZWRDaGFubmVsLCB1aW50MTZfdCBPZmZzZXQpDQp7DQogIF9fSU8gdWludDMyX3QgdG1wID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQogIGFzc2VydF9wYXJhbShJU19BRENfSU5KRUNURURfQ0hBTk5FTChBRENfSW5qZWN0ZWRDaGFubmVsKSk7DQogIGFzc2VydF9wYXJhbShJU19BRENfT0ZGU0VUKE9mZnNldCkpOyAgDQogIA0KICB0bXAgPSAodWludDMyX3QpQURDeDsNCiAgdG1wICs9IEFEQ19JbmplY3RlZENoYW5uZWw7DQogIA0KICAvKiBTZXQgdGhlIHNlbGVjdGVkIGluamVjdGVkIGNoYW5uZWwgZGF0YSBvZmZzZXQgKi8NCiAgKihfX0lPIHVpbnQzMl90ICopIHRtcCA9ICh1aW50MzJfdClPZmZzZXQ7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmV0dXJucyB0aGUgQURDIGluamVjdGVkIGNoYW5uZWwgY29udmVyc2lvbiByZXN1bHQNCiAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgQURDX0luamVjdGVkQ2hhbm5lbDogdGhlIGNvbnZlcnRlZCBBREMgaW5qZWN0ZWQgY2hhbm5lbC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgQURDX0luamVjdGVkQ2hhbm5lbF8xOiBJbmplY3RlZCBDaGFubmVsMSBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19JbmplY3RlZENoYW5uZWxfMjogSW5qZWN0ZWQgQ2hhbm5lbDIgc2VsZWN0ZWQNCiAgKiAgICAgQGFyZyBBRENfSW5qZWN0ZWRDaGFubmVsXzM6IEluamVjdGVkIENoYW5uZWwzIHNlbGVjdGVkDQogICogICAgIEBhcmcgQURDX0luamVjdGVkQ2hhbm5lbF80OiBJbmplY3RlZCBDaGFubmVsNCBzZWxlY3RlZA0KICAqIEByZXR2YWwgVGhlIERhdGEgY29udmVyc2lvbiB2YWx1ZS4NCiAgKi8NCnVpbnQxNl90IEFEQ19HZXRJbmplY3RlZENvbnZlcnNpb25WYWx1ZShBRENfVHlwZURlZiogQURDeCwgdWludDhfdCBBRENfSW5qZWN0ZWRDaGFubmVsKQ0Kew0KICBfX0lPIHVpbnQzMl90IHRtcCA9IDA7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0lOSkVDVEVEX0NIQU5ORUwoQURDX0luamVjdGVkQ2hhbm5lbCkpOw0KDQogIHRtcCA9ICh1aW50MzJfdClBREN4Ow0KICB0bXAgKz0gQURDX0luamVjdGVkQ2hhbm5lbCArIEpEUl9PZmZzZXQ7DQogIA0KICAvKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBpbmplY3RlZCBjaGFubmVsIGNvbnZlcnNpb24gZGF0YSB2YWx1ZSAqLw0KICByZXR1cm4gKHVpbnQxNl90KSAoKihfX0lPIHVpbnQzMl90KikgIHRtcCk7ICAgDQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYW5hbG9nIHdhdGNoZG9nIG9uIHNpbmdsZS9hbGwgcmVndWxhcg0KICAqICAgb3IgaW5qZWN0ZWQgY2hhbm5lbHMNCiAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgQURDX0FuYWxvZ1dhdGNoZG9nOiB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyBjb25maWd1cmF0aW9uLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBBRENfQW5hbG9nV2F0Y2hkb2dfU2luZ2xlUmVnRW5hYmxlOiBBbmFsb2cgd2F0Y2hkb2cgb24gYSBzaW5nbGUgcmVndWxhciBjaGFubmVsDQogICogICAgIEBhcmcgQURDX0FuYWxvZ1dhdGNoZG9nX1NpbmdsZUluamVjRW5hYmxlOiBBbmFsb2cgd2F0Y2hkb2cgb24gYSBzaW5nbGUgaW5qZWN0ZWQgY2hhbm5lbA0KICAqICAgICBAYXJnIEFEQ19BbmFsb2dXYXRjaGRvZ19TaW5nbGVSZWdPckluamVjRW5hYmxlOiBBbmFsb2cgd2F0Y2hkb2cgb24gYSBzaW5nbGUgcmVndWxhciBvciBpbmplY3RlZCBjaGFubmVsDQogICogICAgIEBhcmcgQURDX0FuYWxvZ1dhdGNoZG9nX0FsbFJlZ0VuYWJsZTogQW5hbG9nIHdhdGNoZG9nIG9uICBhbGwgcmVndWxhciBjaGFubmVsDQogICogICAgIEBhcmcgQURDX0FuYWxvZ1dhdGNoZG9nX0FsbEluamVjRW5hYmxlOiBBbmFsb2cgd2F0Y2hkb2cgb24gIGFsbCBpbmplY3RlZCBjaGFubmVsDQogICogICAgIEBhcmcgQURDX0FuYWxvZ1dhdGNoZG9nX0FsbFJlZ0FsbEluamVjRW5hYmxlOiBBbmFsb2cgd2F0Y2hkb2cgb24gYWxsIHJlZ3VsYXIgYW5kIGluamVjdGVkIGNoYW5uZWxzDQogICogICAgIEBhcmcgQURDX0FuYWxvZ1dhdGNoZG9nX05vbmU6IE5vIGNoYW5uZWwgZ3VhcmRlZCBieSB0aGUgYW5hbG9nIHdhdGNoZG9nDQogICogQHJldHZhbCBOb25lCSAgDQogICovDQp2b2lkIEFEQ19BbmFsb2dXYXRjaGRvZ0NtZChBRENfVHlwZURlZiogQURDeCwgdWludDMyX3QgQURDX0FuYWxvZ1dhdGNoZG9nKQ0Kew0KICB1aW50MzJfdCB0bXByZWcgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0FOQUxPR19XQVRDSERPRyhBRENfQW5hbG9nV2F0Y2hkb2cpKTsNCiAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wcmVnID0gQURDeC0+Q1IxOw0KICAvKiBDbGVhciBBV0RFTiwgQVdERU5KIGFuZCBBV0RTR0wgYml0cyAqLw0KICB0bXByZWcgJj0gQ1IxX0FXRE1vZGVfUmVzZXQ7DQogIC8qIFNldCB0aGUgYW5hbG9nIHdhdGNoZG9nIGVuYWJsZSBtb2RlICovDQogIHRtcHJlZyB8PSBBRENfQW5hbG9nV2F0Y2hkb2c7DQogIC8qIFN0b3JlIHRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgQURDeC0+Q1IxID0gdG1wcmVnOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIGhpZ2ggYW5kIGxvdyB0aHJlc2hvbGRzIG9mIHRoZSBhbmFsb2cgd2F0Y2hkb2cuDQogICogQHBhcmFtICBBREN4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIEhpZ2hUaHJlc2hvbGQ6IHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIEhpZ2ggdGhyZXNob2xkIHZhbHVlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIDEyYml0IHZhbHVlLg0KICAqIEBwYXJhbSAgTG93VGhyZXNob2xkOiB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyBMb3cgdGhyZXNob2xkIHZhbHVlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIDEyYml0IHZhbHVlLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBBRENfQW5hbG9nV2F0Y2hkb2dUaHJlc2hvbGRzQ29uZmlnKEFEQ19UeXBlRGVmKiBBREN4LCB1aW50MTZfdCBIaWdoVGhyZXNob2xkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IExvd1RocmVzaG9sZCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19USFJFU0hPTEQoSGlnaFRocmVzaG9sZCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX1RIUkVTSE9MRChMb3dUaHJlc2hvbGQpKTsNCiAgLyogU2V0IHRoZSBBREN4IGhpZ2ggdGhyZXNob2xkICovDQogIEFEQ3gtPkhUUiA9IEhpZ2hUaHJlc2hvbGQ7DQogIC8qIFNldCB0aGUgQURDeCBsb3cgdGhyZXNob2xkICovDQogIEFEQ3gtPkxUUiA9IExvd1RocmVzaG9sZDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBhbmFsb2cgd2F0Y2hkb2cgZ3VhcmRlZCBzaW5nbGUgY2hhbm5lbA0KICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBBRENfQ2hhbm5lbDogdGhlIEFEQyBjaGFubmVsIHRvIGNvbmZpZ3VyZSBmb3IgdGhlIGFuYWxvZyB3YXRjaGRvZy4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzA6IEFEQyBDaGFubmVsMCBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzE6IEFEQyBDaGFubmVsMSBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzI6IEFEQyBDaGFubmVsMiBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzM6IEFEQyBDaGFubmVsMyBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzQ6IEFEQyBDaGFubmVsNCBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzU6IEFEQyBDaGFubmVsNSBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzY6IEFEQyBDaGFubmVsNiBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzc6IEFEQyBDaGFubmVsNyBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzg6IEFEQyBDaGFubmVsOCBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzk6IEFEQyBDaGFubmVsOSBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzEwOiBBREMgQ2hhbm5lbDEwIHNlbGVjdGVkDQogICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTE6IEFEQyBDaGFubmVsMTEgc2VsZWN0ZWQNCiAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8xMjogQURDIENoYW5uZWwxMiBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzEzOiBBREMgQ2hhbm5lbDEzIHNlbGVjdGVkDQogICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTQ6IEFEQyBDaGFubmVsMTQgc2VsZWN0ZWQNCiAgKiAgICAgQGFyZyBBRENfQ2hhbm5lbF8xNTogQURDIENoYW5uZWwxNSBzZWxlY3RlZA0KICAqICAgICBAYXJnIEFEQ19DaGFubmVsXzE2OiBBREMgQ2hhbm5lbDE2IHNlbGVjdGVkDQogICogICAgIEBhcmcgQURDX0NoYW5uZWxfMTc6IEFEQyBDaGFubmVsMTcgc2VsZWN0ZWQNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgQURDX0FuYWxvZ1dhdGNoZG9nU2luZ2xlQ2hhbm5lbENvbmZpZyhBRENfVHlwZURlZiogQURDeCwgdWludDhfdCBBRENfQ2hhbm5lbCkNCnsNCiAgdWludDMyX3QgdG1wcmVnID0gMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfUEVSSVBIKEFEQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DSEFOTkVMKEFEQ19DaGFubmVsKSk7DQogIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcHJlZyA9IEFEQ3gtPkNSMTsNCiAgLyogQ2xlYXIgdGhlIEFuYWxvZyB3YXRjaGRvZyBjaGFubmVsIHNlbGVjdCBiaXRzICovDQogIHRtcHJlZyAmPSBDUjFfQVdEQ0hfUmVzZXQ7DQogIC8qIFNldCB0aGUgQW5hbG9nIHdhdGNoZG9nIGNoYW5uZWwgKi8NCiAgdG1wcmVnIHw9IEFEQ19DaGFubmVsOw0KICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQogIEFEQ3gtPkNSMSA9IHRtcHJlZzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IgYW5kIFZyZWZpbnQgY2hhbm5lbC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHRlbXBlcmF0dXJlIHNlbnNvci4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEFEQ19UZW1wU2Vuc29yVnJlZmludENtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IgYW5kIFZyZWZpbnQgY2hhbm5lbCovDQogICAgQURDMS0+Q1IyIHw9IENSMl9UU1ZSRUZFX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IgYW5kIFZyZWZpbnQgY2hhbm5lbCovDQogICAgQURDMS0+Q1IyICY9IENSMl9UU1ZSRUZFX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBBREMgZmxhZyBpcyBzZXQgb3Igbm90Lg0KICAqIEBwYXJhbSAgQURDeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBBRENfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgQURDX0ZMQUdfQVdEOiBBbmFsb2cgd2F0Y2hkb2cgZmxhZw0KICAqICAgICBAYXJnIEFEQ19GTEFHX0VPQzogRW5kIG9mIGNvbnZlcnNpb24gZmxhZw0KICAqICAgICBAYXJnIEFEQ19GTEFHX0pFT0M6IEVuZCBvZiBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIGZsYWcNCiAgKiAgICAgQGFyZyBBRENfRkxBR19KU1RSVDogU3RhcnQgb2YgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiBmbGFnDQogICogICAgIEBhcmcgQURDX0ZMQUdfU1RSVDogU3RhcnQgb2YgcmVndWxhciBncm91cCBjb252ZXJzaW9uIGZsYWcNCiAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgQURDX0ZMQUcgKFNFVCBvciBSRVNFVCkuDQogICovDQpGbGFnU3RhdHVzIEFEQ19HZXRGbGFnU3RhdHVzKEFEQ19UeXBlRGVmKiBBREN4LCB1aW50OF90IEFEQ19GTEFHKQ0Kew0KICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0dFVF9GTEFHKEFEQ19GTEFHKSk7DQogIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBBREMgZmxhZyAqLw0KICBpZiAoKEFEQ3gtPlNSICYgQURDX0ZMQUcpICE9ICh1aW50OF90KVJFU0VUKQ0KICB7DQogICAgLyogQURDX0ZMQUcgaXMgc2V0ICovDQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIEFEQ19GTEFHIGlzIHJlc2V0ICovDQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgLyogUmV0dXJuIHRoZSBBRENfRkxBRyBzdGF0dXMgKi8NCiAgcmV0dXJuICBiaXRzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2xlYXJzIHRoZSBBREN4J3MgcGVuZGluZyBmbGFncy4NCiAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgQURDX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEFEQ19GTEFHX0FXRDogQW5hbG9nIHdhdGNoZG9nIGZsYWcNCiAgKiAgICAgQGFyZyBBRENfRkxBR19FT0M6IEVuZCBvZiBjb252ZXJzaW9uIGZsYWcNCiAgKiAgICAgQGFyZyBBRENfRkxBR19KRU9DOiBFbmQgb2YgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiBmbGFnDQogICogICAgIEBhcmcgQURDX0ZMQUdfSlNUUlQ6IFN0YXJ0IG9mIGluamVjdGVkIGdyb3VwIGNvbnZlcnNpb24gZmxhZw0KICAqICAgICBAYXJnIEFEQ19GTEFHX1NUUlQ6IFN0YXJ0IG9mIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBmbGFnDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEFEQ19DbGVhckZsYWcoQURDX1R5cGVEZWYqIEFEQ3gsIHVpbnQ4X3QgQURDX0ZMQUcpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQogIGFzc2VydF9wYXJhbShJU19BRENfQ0xFQVJfRkxBRyhBRENfRkxBRykpOw0KICAvKiBDbGVhciB0aGUgc2VsZWN0ZWQgQURDIGZsYWdzICovDQogIEFEQ3gtPlNSID0gfih1aW50MzJfdClBRENfRkxBRzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIEFEQyBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCiAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgQURDX0lUOiBzcGVjaWZpZXMgdGhlIEFEQyBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgQURDX0lUX0VPQzogRW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0IG1hc2sNCiAgKiAgICAgQGFyZyBBRENfSVRfQVdEOiBBbmFsb2cgd2F0Y2hkb2cgaW50ZXJydXB0IG1hc2sNCiAgKiAgICAgQGFyZyBBRENfSVRfSkVPQzogRW5kIG9mIGluamVjdGVkIGNvbnZlcnNpb24gaW50ZXJydXB0IG1hc2sNCiAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgQURDX0lUIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KSVRTdGF0dXMgQURDX0dldElUU3RhdHVzKEFEQ19UeXBlRGVmKiBBREN4LCB1aW50MTZfdCBBRENfSVQpDQp7DQogIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB1aW50MzJfdCBpdG1hc2sgPSAwLCBlbmFibGVzdGF0dXMgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9QRVJJUEgoQURDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfQURDX0dFVF9JVChBRENfSVQpKTsNCiAgLyogR2V0IHRoZSBBREMgSVQgaW5kZXggKi8NCiAgaXRtYXNrID0gQURDX0lUID4+IDg7DQogIC8qIEdldCB0aGUgQURDX0lUIGVuYWJsZSBiaXQgc3RhdHVzICovDQogIGVuYWJsZXN0YXR1cyA9IChBREN4LT5DUjEgJiAodWludDhfdClBRENfSVQpIDsNCiAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIEFEQyBpbnRlcnJ1cHQgKi8NCiAgaWYgKCgoQURDeC0+U1IgJiBpdG1hc2spICE9ICh1aW50MzJfdClSRVNFVCkgJiYgZW5hYmxlc3RhdHVzKQ0KICB7DQogICAgLyogQURDX0lUIGlzIHNldCAqLw0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBBRENfSVQgaXMgcmVzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICAvKiBSZXR1cm4gdGhlIEFEQ19JVCBzdGF0dXMgKi8NCiAgcmV0dXJuICBiaXRzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2xlYXJzIHRoZSBBREN4knMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCiAgKiBAcGFyYW0gIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgQURDX0lUOiBzcGVjaWZpZXMgdGhlIEFEQyBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEFEQ19JVF9FT0M6IEVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCBtYXNrDQogICogICAgIEBhcmcgQURDX0lUX0FXRDogQW5hbG9nIHdhdGNoZG9nIGludGVycnVwdCBtYXNrDQogICogICAgIEBhcmcgQURDX0lUX0pFT0M6IEVuZCBvZiBpbmplY3RlZCBjb252ZXJzaW9uIGludGVycnVwdCBtYXNrDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEFEQ19DbGVhcklUUGVuZGluZ0JpdChBRENfVHlwZURlZiogQURDeCwgdWludDE2X3QgQURDX0lUKQ0Kew0KICB1aW50OF90IGl0bWFzayA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19BRENfQUxMX1BFUklQSChBREN4KSk7DQogIGFzc2VydF9wYXJhbShJU19BRENfSVQoQURDX0lUKSk7DQogIC8qIEdldCB0aGUgQURDIElUIGluZGV4ICovDQogIGl0bWFzayA9ICh1aW50OF90KShBRENfSVQgPj4gOCk7DQogIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBBREMgaW50ZXJydXB0IHBlbmRpbmcgYml0cyAqLw0KICBBREN4LT5TUiA9IH4odWludDMyX3QpaXRtYXNrOw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K