Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCg0KI2lmbmRlZiBfSlNfQ09OU09MRV9IXw0KI2RlZmluZSBfSlNfQ09OU09MRV9IXw0KDQojaW5jbHVkZSAiLi4vcmVzL3Jlc291cmNlLmgiDQoNCiNkZWZpbmUgV1NUX05PTkUJCTB4MDAJCQkJCS8vIE5vIHNpemUgY2hhbmdlZA0KI2RlZmluZSBXU1RfTEVGVAkJMHgwMQkJCQkJLy8gc2l6ZSB0byBsZWZ0DQojZGVmaW5lIFdTVF9UT1AJCQkweDAyCQkJCQkvLyBzaXplIHRvIHRvcA0KI2RlZmluZSBXU1RfUklHSFQJCTB4MDQJCQkJCS8vIHNpemUgdG8gcmlnaHQNCiNkZWZpbmUgV1NUX0JPVFRPTQkJMHgwOAkJCQkJLy8gc2l6ZSB0byBib3R0b20NCiNkZWZpbmUgV1NUX1RPUExFRlQJCShXU1RfVE9QfFdTVF9MRUZUKQkJLy8gc2l6ZSB0byB0b3AgJiBsZWZ0DQojZGVmaW5lIFdTVF9UT1BSSUdIVAkoV1NUX1RPUHxXU1RfUklHSFQpCQkvLyBzaXplIHRvIHRvcCAmIHJpZ2h0DQojZGVmaW5lIFdTVF9CT1RUT01SSUdIVAkoV1NUX0JPVFRPTXxXU1RfUklHSFQpCS8vIHNpemUgdG8gYm90dG9tICYgcmlnaHQNCiNkZWZpbmUgV1NUX0JPVFRPTUxFRlQJKFdTVF9CT1RUT018V1NUX0xFRlQpCS8vIHNpemUgdG8gYm90dG9tICYgcmlnaHQNCg0KI2lmbmRlZiBJRENfRExHU0laRUJPWA0KI2RlZmluZSBJRENfRExHU0laRUJPWCAgNTANCiNlbmRpZgkvKiBJRENfRExHU0laRUJPWCAqLw0KDQplbnVtIHsgbV9pZFNpemVJY29uID0gSURDX0RMR1NJWkVCT1ggfTsNCmVudW0gewkJCQkvLyBwb3NzaWJsZSBDb250cm9sIHJlU2l6ZSBUeXBlDQoJQ1NUX05PTkUgPSAwLA0KCUNTVF9SRVNJWkUsCQkvLyBOT01PVkUgKyBTSVpFLCBhZGQgYWxsIGRlbHRhLXNpemUgb2YgZGxnIHRvIGNvbnRyb2wNCglDU1RfUkVQT1MsCQkvLyBNT1ZFKGFic29sdXRlbHkpICsgTk9TSVpFLCBtb3ZlIGNvbnRyb2wncyBwb3MgYnkgZGVsdGEtc2l6ZQ0KCUNTVF9SRUxBVElWRSwJLy8gTU9WRShwcm9wb3J0aW9uYWwpICArIE5PU0laRSwga2VlcCBjb250cm9sIGFsd2F5cyBhdCBhIHJlbGF0aXZlIHBvcw0KCUNTVF9aT09NLAkJLy8gTU9WRSArIFNJWkUgKGJvdGggYXJlIGF1dG9tYXRpY2FsbHkgcHJvcG9ydGlvbmFsKQ0KCUNTVF9ERUxUQV9aT09NCS8vIE1PVkUocHJvcG9ydGlvbmFsLCBzZXQgbWFudWFsbHkpICsgU0laRShwcm9wb3J0aW9uYWwsIHNldCBtYW51YWxsKQ0KfTsNCg0KLy8gY29udGFpbmVkIGNsYXNzIHRvIGhvbGQgaXRlbSBzdGF0ZQ0KLy8NCmNsYXNzIENKU19JdGVtQ3RybA0Kew0KcHVibGljOg0KCVVJTlQJbV9uSUQ7DQoJVUlOVAltX3N0eExlZnQgIAkgICA6IDQ7CQkJLy8gd2hlbiBsZWZ0IHJlc2l6aW5nIC4uLg0KCVVJTlQJbV9zdHhSaWdodCAgICAgOiA0OwkJCS8vIHdoZW4gcmlnaHQgcmVzaXppbmcgLi4uDQoJVUlOVAltX3N0eVRvcCAgIAkgICA6IDQ7CQkJLy8gd2hlbiB0b3AgcmVzaXppbmcgLi4uDQoJVUlOVAltX3N0eUJvdHRvbSAgICA6IDQ7CQkJLy8gd2hlbiBib3R0b20gcmVzaXppbmcgLi4uDQoJVUlOVAltX2JGbGlja2VyRnJlZSA6IDE7DQoJVUlOVAltX2JJbnZhbGlkYXRlICA6IDE7CQkJLy8gSW52YWxpZGF0ZSBjdHJsJ3MgcmVjdChlZy4gbm8tYXV0b21hdGljYWwgdXBkYXRlIGZvciBzdGF0aWMgd2hlbiByZXNpemUrbW92ZSkNCglVSU5UCW1fcjAJCSAgIDogMTQ7DQoJQ1JlY3QJbV93UmVjdDsNCglkb3VibGUJbV94UmF0aW8sIG1fY3hSYXRpbzsNCglkb3VibGUJbV95UmF0aW8sIG1fY3lSYXRpbzsNCg0KcHJvdGVjdGVkOg0KCXZvaWQgQXNzaWduKGNvbnN0IENKU19JdGVtQ3RybCYgc3JjKTsNCg0KcHVibGljOg0KCUNKU19JdGVtQ3RybCgpOw0KCUNKU19JdGVtQ3RybChjb25zdCBDSlNfSXRlbUN0cmwmIHNyYyk7DQoNCglIRFdQIE9uU2l6ZShIRFdQIGhkd3AsIGludCBzaXplVHlwZSwgQ1JlY3QgKnBuQ2x0UmVjdCwgQ1JlY3QgKnBvQ2x0UmVjdCwgQ1JlY3QgKnBSMCwgQ1duZCAqcERsZyk7DQoNCglDSlNfSXRlbUN0cmwmIG9wZXJhdG9yPShjb25zdCBDSlNfSXRlbUN0cmwmIHNyYyk7DQp9Ow0KDQpjbGFzcyBDSlNfUmVzaXplRGxnIDogcHVibGljIENEaWFsb2cNCnsNCi8vCURFQ0xBUkVfRFlOQU1JQyhDSlNfUmVzaXplRGxnKQ0KcHVibGljOg0KCUNKU19SZXNpemVEbGcoVUlOVCBuSUQsQ1duZCAqcFBhcmVudFduZCA9IE5VTEwpOw0KCXZpcnR1YWwgfkNKU19SZXNpemVEbGcoKTsNCg0KDQpwdWJsaWM6DQoJc3RkOjp2ZWN0b3I8Q0pTX0l0ZW1DdHJsPgltX0l0ZW1zOyAgICAgICAgICAgLy8gYXJyYXkgb2YgY29udHJvbGxlZCBpdGVtcw0KCUNSZWN0CQkJCQltX2NsdFJlY3QsIG1fY2x0UjA7DQoJaW50CQkJCQkJbV94TWluLCBtX3lNaW47DQoJaW50CQkJCQkJbV94U3QsICBtX3lTdDsJCS8vc3RlcD8NCglVSU5UCQkJCQltX25EZWxheVNpZGU7CQkvL2RyYWcgc2lkZSBvZiB3aW5kb3cNCglDU3RhdGljCQkJCQltX3duZFNpemVJY29uOyAgICAgLy8gc2l6ZSBpY29uIHdpbmRvdw0KDQpwcm90ZWN0ZWQ6DQoJdm9pZCAJCQkJCUFkZENvbnRyb2woIFVJTlQgbklELCBpbnQgeGwsIGludCB4ciwgaW50IHl0LCBpbnQgeWIsIGludCBiRmxpY2tlckZyZWUgPSAwLCANCgkJCQkJCQkJCSAgICBkb3VibGUgeFJhdGlvID0gLTEuMCwgZG91YmxlIGN4UmF0aW8gPSAtMS4wLA0KCQkJCQkJCQkJICAgIGRvdWJsZSB5UmF0aW8gPSAtMS4wLCBkb3VibGUgY3lSYXRpbyA9IC0xLjAgKTsNCgl2b2lkIAkJCQkJQWxsb3dTaXppbmcoaW50IHhzdCwgaW50IHlzdCk7DQoJdm9pZCAJCQkJCUhpZGVTaXplSWNvbih2b2lkKTsJDQoJdmlydHVhbCBCT09MCQkJT25Jbml0RGlhbG9nKCk7DQoNCgl2b2lkCQkJCQlPblNpemluZyhVSU5UIG5TaWRlLCBMUFJFQ1QgbHBSZWN0KTsNCgl2b2lkCQkJCQlPblNpemUoVUlOVCBuVHlwZSwgaW50IGN4LCBpbnQgY3kpOw0KCXZvaWQJCQkJCU9uR2V0TWluTWF4SW5mbyhNSU5NQVhJTkZPICpwbW1pKTsNCglCT09MCQkJCQlPbkVyYXNlQmtnbmQoQ0RDKiBwREMpOw0KDQpwdWJsaWM6DQoJaW50CQkJCQkJVXBkYXRlQ29udHJvbFJlY3QoVUlOVCBuSUQsIENSZWN0ICpwbnIpOw0KfTsNCg0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUNJY29uTGlzdEJveCBmb3IgQ1duZEVsZW1lbnRMaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjbGFzcyBDSWNvbkxpc3RCb3ggOiBwdWJsaWMgQ0xpc3RCb3gNCnsNCnB1YmxpYzoNCglDSWNvbkxpc3RCb3goKTsNCgl2aXJ0dWFsIH5DSWNvbkxpc3RCb3goKTsNCg0KcHVibGljOg0KCWludAkJCQlJbnNlcnRTdHJpbmcoaW50IG5JbmRleCwgTFBDV1NUUiBscHN6SXRlbSAsIGludCBuSW1hZ2UpOw0KCXZpcnR1YWwJdm9pZAlSZXNldENvbnRlbnQoKTsNCgl2aXJ0dWFsIHZvaWQJR2V0VGV4dChpbnQgbkluZGV4LCBDU3RyaW5nJiByU3RyaW5nKTsNCg0KCXZpcnR1YWwgdm9pZAlEcmF3SXRlbShMUERSQVdJVEVNU1RSVUNUIGxwRHJhd0l0ZW1TdHJ1Y3QpOw0KCXZvaWQJCQlNZWFzdXJlSXRlbShMUE1FQVNVUkVJVEVNU1RSVUNUIGxwTWVhc3VyZUl0ZW1TdHJ1Y3QpOw0KCWludAkJCQlDb21wYXJlSXRlbShMUENPTVBBUkVJVEVNU1RSVUNUIGxwQ29tcGFyZUl0ZW1TdHJ1Y3QpOw0KDQpwcm90ZWN0ZWQ6DQoJLy8gR2VuZXJhdGVkIG1lc3NhZ2UgbWFwIGZ1bmN0aW9ucw0KCS8ve3tBRlhfTVNHKENJY29uTGlzdEJveCkNCglhZnhfbXNnIHZvaWQgT25Nb3VzZU1vdmUoVUlOVCBuRmxhZ3MsIENQb2ludCBwb2ludCk7DQoJLy99fUFGWF9NU0cJDQoJREVDTEFSRV9NRVNTQUdFX01BUCgpDQoNCnByb3RlY3RlZDoNCglzdHJ1Y3QgSXRlbURhdGFzIA0KCXsNCgkJQ1N0cmluZwljc1RleHQ7DQoJCWludAkJbkltYWdlOw0KCX07DQp9Ow0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQ1duZEVsZW1lbnRMaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiNkZWZpbmUgSURDX0xJU1RfSlNfRUxFTUVOVCAxMDA3MA0KDQojZGVmaW5lIEVMRU1FTlRfTElTVF9XSURUSCAxNDANCiNkZWZpbmUgRUxFTUVOVF9MSVNUX0hFSUdIVCAxODANCiNkZWZpbmUgRUxFTUVOVF9MSVNUX1RPUF9PRkZTRVQgMTMNCg0KI2RlZmluZSBFTEVNRU5UX1RZUEVfTkFNRQkwDQojZGVmaW5lIEVMRU1FTlRfVFlQRV9DT05TVAkxDQojZGVmaW5lIEVMRU1FTlRfVFlQRV9GVU4JMg0KI2RlZmluZSBFTEVNRU5UX1RZUEVfUFJPCTMNCg0KY2xhc3MgQ1duZEVsZW1lbnRMaXN0IDogcHVibGljIENXbmQNCnsNCnB1YmxpYzoNCglDV25kRWxlbWVudExpc3QoKTsNCgl2aXJ0dWFsIH5DV25kRWxlbWVudExpc3QoKTsNCgkNCnB1YmxpYzoNCgl2aXJ0dWFsIHZvaWQJT25TaXplKFVJTlQgblR5cGUsIGludCBjeCwgaW50IGN5KTsNCgl2aXJ0dWFsIEJPT0wJQ3JlYXRlKENXbmQqIHBQYXJlbnRXbmQpOw0KCXZpcnR1YWwgQk9PTAlTaG93V2luZG93KGludCBuQ21kU2hvdyk7DQoJdm9pZAkJCVJlbW92ZUFsbEVsZW1lbnQoKTsNCgl2b2lkCQkJU2V0RWxlbWVudExpc3QoTFBDV1NUUiogcEVsZW1lbnQsIGludCogcFR5cGUgLCAgaW50IGlDb3VudCk7DQoJdm9pZAkJCUFkZEVsZW1lbnQoQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZSAsIGludCBuVHlwZSk7DQoJQk9PTAkJCUdldEVsZW1lbnRTZWwoQ1N0cmluZyAmY3NFbGVtZW50KTsNCglCT09MCQkJU2VsZWN0TmV4dCgpOw0KCUJPT0wJCQlTZWxlY3RQcmV2aW91cygpOw0KCUJPT0wJCQlTZWxlY3RGaXJzdCgpOw0KCUJPT0wJCQlTZWxlY3RMYXN0KCk7DQoJQk9PTAkJCVNlbGVjdE5leHRQYWdlKCk7DQoJQk9PTAkJCVNlbGVjdFByZXZpb3VzUGFnZSgpOw0KCWludAkJCQlHZXRMaXN0SGVpZ2h0KCk7DQoJDQpwcm90ZWN0ZWQ6DQoJLy8gR2VuZXJhdGVkIG1lc3NhZ2UgbWFwIGZ1bmN0aW9ucw0KCS8ve3tBRlhfTVNHKENXbmRFbGVtZW50TGlzdCkNCglhZnhfbXNnIHZvaWQgT25QYWludCgpOw0KCWFmeF9tc2cgQk9PTCBPbk5jQWN0aXZhdGUoQk9PTCBiQWN0aXZlKTsNCglhZnhfbXNnIHZvaWQgT25TZWxKU0VsZW1lbnQoKTsNCglhZnhfbXNnIHZvaWQgT25EYmxjbGtKU0VsZW1lbnQoKTsNCglhZnhfbXNnIHZvaWQgT25EZXN0cm95KCk7DQoJLy99fUFGWF9NU0cJDQoJREVDTEFSRV9NRVNTQUdFX01BUCgpDQpwcm90ZWN0ZWQ6DQoJQ0ljb25MaXN0Qm94CW1fTGlzdEJveDsNCglCT09MCQkJbV9iQmxvY2s7DQp9Ow0KDQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLy8gQ0pTX0NvbnNvbGVEbGcgttS7sL/yDQpjbGFzcyBDSlNfQ29uc29sZURsZyA6IHB1YmxpYyBDSlNfUmVzaXplRGxnDQp7DQoJREVDTEFSRV9EWU5BTUlDKENKU19Db25zb2xlRGxnKQ0KDQpwdWJsaWM6DQoJQ0pTX0NvbnNvbGVEbGcoQ1JlYWRlcl9BcHAqIHBBcHAsIENXbmQqIHBQYXJlbnQpOwkNCgl2aXJ0dWFsIH5DSlNfQ29uc29sZURsZygpOw0KDQoJZW51bSB7IElERCA9IElERF9KU19DT05TT0xFIH07DQoNCgl2b2lkCQkJCUNyZWF0ZSgpOw0KDQoJdm9pZAkJCQlBcHBlbmRDb25zb2xlVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dUZXh0KTsNCgl2b2lkCQkJCVNldENvbnNvbGVUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd1RleHQpOw0KCUNGWF9XaWRlU3RyaW5nCQlHZXRDb25zb2xlVGV4dCgpIGNvbnN0Ow0KCUNGWF9XaWRlU3RyaW5nCQlHZXRTY3JpcHRUZXh0KCkgY29uc3Q7DQoNCglCT09MCQkJCVJlc2V0RWxlbWVudExpc3QoTFBDV1NUUiBscHN0clJlZik7DQoJSUZYSlNfUnVudGltZSoJCUdldEpTUnVudGltZSgpOw0KDQpwcm90ZWN0ZWQ6DQoJdmlydHVhbCB2b2lkCQlEb0RhdGFFeGNoYW5nZShDRGF0YUV4Y2hhbmdlKiBwRFgpOwkvLyBERFgvRERWINans9YNCg0KcHJvdGVjdGVkOg0KCXZpcnR1YWwgQk9PTAkJT25Jbml0RGlhbG9nKCk7CQ0KCXZpcnR1YWwgdm9pZAkJT25DYW5jZWwoKTsNCg0KCXZpcnR1YWwgQk9PTAkJUHJlVHJhbnNsYXRlTWVzc2FnZShNU0cqIHBNc2cpOw0KDQpwcm90ZWN0ZWQ6DQoJLy8gR2VuZXJhdGVkIG1lc3NhZ2UgbWFwIGZ1bmN0aW9ucw0KCS8ve3tBRlhfTVNHKENKU19Db25zb2xlRGxnKQ0KCWFmeF9tc2cgdm9pZCBPbkJuQ2xpY2tlZENsZWFyKCk7DQoJYWZ4X21zZyB2b2lkIE9uQm5DbGlja2VkT2soKTsNCglhZnhfbXNnIHZvaWQgT25CbkNsaWNrVGlwcygpOw0KCWFmeF9tc2cgdm9pZCBPblNpemluZyhVSU5UIG5TaWRlLCBMUFJFQ1QgbHBSZWN0KTsNCglhZnhfbXNnIHZvaWQgT25TaXplKFVJTlQgblR5cGUsIGludCBjeCwgaW50IGN5KTsNCglhZnhfbXNnIHZvaWQgT25HZXRNaW5NYXhJbmZvKE1JTk1BWElORk8gKnBtbWkpOw0KCWFmeF9tc2cgQk9PTCBPbkVyYXNlQmtnbmQoQ0RDKiBwREMpOw0KCWFmeF9tc2cgdm9pZCBPblNob3dXaW5kb3coQk9PTCBiU2hvdywgVUlOVCBuU3RhdHVzKTsNCg0KCWFmeF9tc2cgdm9pZCBPbkxCdXR0b25Eb3duKFVJTlQgbkZsYWdzLCBDUG9pbnQgcG9pbnQpOw0KCWFmeF9tc2cgdm9pZCBPbkNoYW5nZVNjcmlwdEVkaXQoV1BBUkFNIHdQYXJhbSAsIExQQVJBTSBsUGFyYW0pOw0KCWFmeF9tc2cgdm9pZCBPbk1vdmUoaW50IHggLCBpbnQgeSk7DQoJcHVibGljOg0KCXZpcnR1YWwgaW50CURvTW9kYWwoKTsJDQoJLy99fUFGWF9NU0cNCglERUNMQVJFX01FU1NBR0VfTUFQKCkNCg0KcHVibGljOg0KCUNHV19MaW5lTnVtYmVyRWRpdAkJCW1fZWR0U0M7DQoJQk9PTAkJCQkJCW1fYlRpcHM7DQoJY29uc3QgVUlOVAkJCQkJbV91VGV4dGxpbWl0ZWQ7DQoJRlhfSEdMT0JBTAkJCQkJbV9oR2xvYmFsOw0KCUNSZWFkZXJfQXBwICoJCQkJbV9wQXBwOw0KCUNXbmRFbGVtZW50TGlzdAkJCQltX1duZEVsZW1lbnRMaXN0Ow0KfTsNCg0KI2VuZGlmIC8vX0pTX0NPTlNPTEVfSF8=