Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCg0KI2lmbmRlZiBfRlhFVF9MSVNUX0hfDQojZGVmaW5lIF9GWEVUX0xJU1RfSF8NCg0KI2luY2x1ZGUgImZ4X2VkaXQuaCINCg0KY2xhc3MgSUZYX0VkaXQ7DQoNCmNsYXNzIENMU1RfU2l6ZQ0Kew0KcHVibGljOg0KCUNMU1RfU2l6ZSgpIDogeCgwLjBmKSwgeSgwLjBmKQ0KCXsJCQ0KCX0NCg0KCUNMU1RfU2l6ZShGWF9GTE9BVCB4LEZYX0ZMT0FUIHkpDQoJeyANCgkJdGhpcy0+eCA9IHg7DQoJCXRoaXMtPnkgPSB5Ow0KCX0NCg0KCXZvaWQgRGVmYXVsdCgpDQoJew0KCQl4ID0gMC4wZjsNCgkJeSA9IDAuMGY7DQoJfQ0KDQoJRlhfQk9PTCBvcGVyYXRvciAhPSAoY29uc3QgQ0xTVF9TaXplICYgc2l6ZSkgY29uc3QNCgl7DQoJCXJldHVybiBGWFNZU19tZW1jbXAodGhpcywgJnNpemUsIHNpemVvZihDTFNUX1NpemUpKSAhPSAwOw0KCX0NCg0KCUZYX0ZMT0FUIHgseTsNCn07DQoNCmNsYXNzIENMU1RfUmVjdCA6IHB1YmxpYyBDUERGX1JlY3QNCnsNCnB1YmxpYzoNCglDTFNUX1JlY3QoKQ0KCXsJDQoJCWxlZnQgPSB0b3AgPSByaWdodCA9IGJvdHRvbSA9IDAuMGY7DQoJfQ0KDQoJQ0xTVF9SZWN0KEZYX0ZMT0FUIGxlZnQsRlhfRkxPQVQgdG9wLA0KCQkJCQkJRlhfRkxPQVQgcmlnaHQsRlhfRkxPQVQgYm90dG9tKQ0KCXsgDQoJCXRoaXMtPmxlZnQgPSBsZWZ0OyANCgkJdGhpcy0+dG9wID0gdG9wOyANCgkJdGhpcy0+cmlnaHQgPSByaWdodDsgDQoJCXRoaXMtPmJvdHRvbSA9IGJvdHRvbTsgDQoJfQ0KDQoJQ0xTVF9SZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QpDQoJeyANCgkJdGhpcy0+bGVmdCA9IHJlY3QubGVmdDsgDQoJCXRoaXMtPnRvcCA9IHJlY3QudG9wOyANCgkJdGhpcy0+cmlnaHQgPSByZWN0LnJpZ2h0OyANCgkJdGhpcy0+Ym90dG9tID0gcmVjdC5ib3R0b207IA0KCX0NCg0KCXZvaWQgRGVmYXVsdCgpDQoJew0KCQlsZWZ0ID0gdG9wID0gcmlnaHQgPSBib3R0b20gPSAwLjBmOw0KCX0NCg0KCWNvbnN0IENMU1RfUmVjdCBvcGVyYXRvciA9IChjb25zdCBDUERGX1JlY3QgJiByZWN0KQ0KCXsNCgkJdGhpcy0+bGVmdCA9IHJlY3QubGVmdDsNCgkJdGhpcy0+dG9wID0gcmVjdC50b3A7DQoJCXRoaXMtPnJpZ2h0ID0gcmVjdC5yaWdodDsNCgkJdGhpcy0+Ym90dG9tID0gcmVjdC5ib3R0b207DQoNCgkJcmV0dXJuICp0aGlzOw0KCX0NCg0KCUZYX0JPT0wgb3BlcmF0b3IgPT0gKGNvbnN0IENMU1RfUmVjdCAmIHJlY3QpIGNvbnN0DQoJew0KCQlyZXR1cm4gRlhTWVNfbWVtY21wKHRoaXMsICZyZWN0LCBzaXplb2YoQ0xTVF9SZWN0KSkgPT0gMDsNCgl9DQoNCglGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDTFNUX1JlY3QgJiByZWN0KSBjb25zdA0KCXsNCgkJcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmcmVjdCwgc2l6ZW9mKENMU1RfUmVjdCkpICE9IDA7DQoJfQ0KDQoJRlhfRkxPQVQgV2lkdGgoKSBjb25zdA0KCXsNCgkJcmV0dXJuIHRoaXMtPnJpZ2h0IC0gdGhpcy0+bGVmdDsNCgl9DQoNCglGWF9GTE9BVCBIZWlnaHQoKSBjb25zdA0KCXsNCgkJaWYgKHRoaXMtPnRvcCA+IHRoaXMtPmJvdHRvbSkNCgkJCXJldHVybiB0aGlzLT50b3AgLSB0aGlzLT5ib3R0b207DQoJCWVsc2UNCgkJCXJldHVybiB0aGlzLT5ib3R0b20gLSB0aGlzLT50b3A7DQoJfQ0KDQoJQ1BERl9Qb2ludCBMZWZ0VG9wKCkgY29uc3QNCgl7DQoJCXJldHVybiBDUERGX1BvaW50KGxlZnQsdG9wKTsNCgl9DQoNCglDUERGX1BvaW50IFJpZ2h0Qm90dG9tKCkgY29uc3QNCgl7DQoJCXJldHVybiBDUERGX1BvaW50KHJpZ2h0LGJvdHRvbSk7DQoJfQ0KDQoJY29uc3QgQ0xTVF9SZWN0IG9wZXJhdG9yICs9IChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIA0KCXsNCgkJdGhpcy0+bGVmdCArPSBwb2ludC54Ow0KCQl0aGlzLT5yaWdodCArPSBwb2ludC54Ow0KCQl0aGlzLT50b3AgKz0gcG9pbnQueTsNCgkJdGhpcy0+Ym90dG9tICs9IHBvaW50Lnk7DQoNCgkJcmV0dXJuICp0aGlzOw0KCX0NCg0KCWNvbnN0IENMU1RfUmVjdCBvcGVyYXRvciAtPSAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSANCgl7DQoJCXRoaXMtPmxlZnQgLT0gcG9pbnQueDsNCgkJdGhpcy0+cmlnaHQgLT0gcG9pbnQueDsNCgkJdGhpcy0+dG9wIC09IHBvaW50Lnk7DQoJCXRoaXMtPmJvdHRvbSAtPSBwb2ludC55Ow0KDQoJCXJldHVybiAqdGhpczsNCgl9DQoNCglDTFNUX1JlY3Qgb3BlcmF0b3IgKyAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdA0KCXsNCgkJcmV0dXJuIENMU1RfUmVjdChsZWZ0ICsgcG9pbnQueCwNCgkJCQkJdG9wICsgcG9pbnQueSwNCgkJCQkJcmlnaHQgKyBwb2ludC54LA0KCQkJCQlib3R0b20gKyBwb2ludC55KTsNCgl9DQoNCglDTFNUX1JlY3Qgb3BlcmF0b3IgLSAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdA0KCXsNCgkJcmV0dXJuIENMU1RfUmVjdChsZWZ0IC0gcG9pbnQueCwNCgkJCQkJdG9wIC0gcG9pbnQueSwNCgkJCQkJcmlnaHQgLSBwb2ludC54LA0KCQkJCQlib3R0b20gLSBwb2ludC55KTsNCgl9DQp9Ow0KDQpjbGFzcyBDRlhfTGlzdEl0ZW0NCnsNCnB1YmxpYzoNCglDRlhfTGlzdEl0ZW0oKTsNCgl2aXJ0dWFsIH5DRlhfTGlzdEl0ZW0oKTsNCg0KCXZvaWQJCQkJCQkJU2V0Rm9udE1hcChJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXApOw0KCUlGWF9FZGl0X0l0ZXJhdG9yKgkJCQlHZXRJdGVyYXRvcigpIGNvbnN0Ow0KCUlGWF9FZGl0KgkJCQkJCUdldEVkaXQoKSBjb25zdDsNCg0KcHVibGljOg0KCXZvaWQJCQkJCQkJU2V0UmVjdChjb25zdCBDTFNUX1JlY3QgJiByZWN0KTsJCQ0KCXZvaWQJCQkJCQkJU2V0U2VsZWN0KEZYX0JPT0wgYlNlbGVjdGVkKTsJDQoJdm9pZAkJCQkJCQlTZXRDYXJldChGWF9CT09MIGJDYXJldCk7DQoJdm9pZAkJCQkJCQlTZXRUZXh0KEZYX0xQQ1dTVFIgdGV4dCk7DQoJdm9pZAkJCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOw0KCUNGWF9XaWRlU3RyaW5nCQkJCQlHZXRUZXh0KCkgY29uc3Q7DQoNCglDTFNUX1JlY3QJCQkJCQlHZXRSZWN0KCkgY29uc3Q7DQoJRlhfQk9PTAkJCQkJCQlJc1NlbGVjdGVkKCkgY29uc3Q7DQoJRlhfQk9PTAkJCQkJCQlJc0NhcmV0KCkgY29uc3Q7DQoJRlhfRkxPQVQJCQkJCQlHZXRJdGVtSGVpZ2h0KCkgY29uc3Q7CQ0KCUZYX1dPUkQJCQkJCQkJR2V0Rmlyc3RDaGFyKCkgY29uc3Q7DQoNCnByaXZhdGU6DQoJSUZYX0VkaXQqCQkJCQkJbV9wRWRpdDsNCglGWF9CT09MCQkJCQkJCW1fYlNlbGVjdGVkOwkJLy/Kx7fx0aHW0A0KCUZYX0JPT0wJCQkJCQkJbV9iQ2FyZXQ7CQkvL8rHt/HOqr25teOjrLbg0aHKsdPDDQoJQ0xTVF9SZWN0CQkJCQkJbV9yY0xpc3RJdGVtOwkvL8Tasr/X+LHqDQp9Ow0KDQpjbGFzcyBDRlhfTGlzdENvbnRhaW5lcg0Kew0KcHVibGljOg0KCUNGWF9MaXN0Q29udGFpbmVyKCkgOiBtX3JjUGxhdGUoMC4wZiwwLjBmLDAuMGYsMC4wZiksIG1fcmNDb250ZW50KDAuMGYsMC4wZiwwLjBmLDAuMGYpe30NCgl2aXJ0dWFsIH5DRlhfTGlzdENvbnRhaW5lcigpe30NCgl2aXJ0dWFsIHZvaWQJCQkJCVNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0KXttX3JjUGxhdGUgPSByZWN0O30NCglDUERGX1JlY3QJCQkJCQlHZXRQbGF0ZVJlY3QoKSBjb25zdHtyZXR1cm4gbV9yY1BsYXRlO30NCgl2b2lkCQkJCQkJCVNldENvbnRlbnRSZWN0KGNvbnN0IENMU1RfUmVjdCAmIHJlY3Qpe21fcmNDb250ZW50ID0gcmVjdDt9DQoJQ0xTVF9SZWN0CQkJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdHtyZXR1cm4gbV9yY0NvbnRlbnQ7fQ0KCUNQREZfUG9pbnQJCQkJCQlHZXRCVFBvaW50KCkgY29uc3R7cmV0dXJuIENQREZfUG9pbnQobV9yY1BsYXRlLmxlZnQsbV9yY1BsYXRlLnRvcCk7fQ0KCUNQREZfUG9pbnQJCQkJCQlHZXRFVFBvaW50KCkgY29uc3R7cmV0dXJuIENQREZfUG9pbnQobV9yY1BsYXRlLnJpZ2h0LG1fcmNQbGF0ZS5ib3R0b20pO30NCnB1YmxpYzoNCglDUERGX1BvaW50CQkJCQkJSW5uZXJUb091dGVyKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3R7cmV0dXJuIENQREZfUG9pbnQocG9pbnQueCArIEdldEJUUG9pbnQoKS54LEdldEJUUG9pbnQoKS55IC0gcG9pbnQueSk7fQ0KCUNQREZfUG9pbnQJCQkJCQlPdXRlclRvSW5uZXIoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdHtyZXR1cm4gQ1BERl9Qb2ludChwb2ludC54IC0gR2V0QlRQb2ludCgpLngsR2V0QlRQb2ludCgpLnkgLSBwb2ludC55KTt9DQoJQ1BERl9SZWN0CQkJCQkJSW5uZXJUb091dGVyKGNvbnN0IENMU1RfUmVjdCAmIHJlY3QpIGNvbnN0e0NQREZfUG9pbnQgcHRMZWZ0VG9wID0gSW5uZXJUb091dGVyKENQREZfUG9pbnQocmVjdC5sZWZ0LHJlY3QudG9wKSk7DQoJCQkJCQkJCQkJCQkJCQkJCQkJQ1BERl9Qb2ludCBwdFJpZ2h0Qm90dG9tID0gSW5uZXJUb091dGVyKENQREZfUG9pbnQocmVjdC5yaWdodCxyZWN0LmJvdHRvbSkpOw0KCQkJCQkJCQkJCQkJCQkJCQkJCXJldHVybiBDUERGX1JlY3QocHRMZWZ0VG9wLngscHRSaWdodEJvdHRvbS55LHB0UmlnaHRCb3R0b20ueCxwdExlZnRUb3AueSk7fQ0KCUNMU1RfUmVjdAkJCQkJCU91dGVyVG9Jbm5lcihjb25zdCBDUERGX1JlY3QgJiByZWN0KSBjb25zdHtDUERGX1BvaW50IHB0TGVmdFRvcCA9IE91dGVyVG9Jbm5lcihDUERGX1BvaW50KHJlY3QubGVmdCxyZWN0LnRvcCkpOw0KCQkJCQkJCQkJCQkJCQkJCQkJCUNQREZfUG9pbnQgcHRSaWdodEJvdHRvbSA9IE91dGVyVG9Jbm5lcihDUERGX1BvaW50KHJlY3QucmlnaHQscmVjdC5ib3R0b20pKTsNCgkJCQkJCQkJCQkJCQkJCQkJCQlyZXR1cm4gQ0xTVF9SZWN0KHB0TGVmdFRvcC54LHB0TGVmdFRvcC55LHB0UmlnaHRCb3R0b20ueCxwdFJpZ2h0Qm90dG9tLnkpO30NCnByaXZhdGU6DQoJQ1BERl9SZWN0CQkJCQkJbV9yY1BsYXRlOyAJDQoJQ0xTVF9SZWN0CQkJCQkJbV9yY0NvbnRlbnQ7CQkvL3Bvc2l0aXZlIGZvcmV2ZXIhDQp9Ow0KDQp0ZW1wbGF0ZTxjbGFzcyBUWVBFPiBjbGFzcyBDTFNUX0FycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT4NCnsNCnB1YmxpYzoJDQoJRlhfQk9PTCBJc0VtcHR5KCkgeyByZXR1cm4gQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSA8PSAwOyB9DQoJVFlQRSBHZXRBdChGWF9JTlQzMiBuSW5kZXgpIGNvbnN0IHsgaWYgKG5JbmRleCA+PSAwICYmIG5JbmRleCA8IENGWF9BcnJheVRlbXBsYXRlPFRZUEU+OjpHZXRTaXplKCkpIHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0QXQobkluZGV4KTsgcmV0dXJuIE5VTEw7fQ0KCXZvaWQgUmVtb3ZlQXQoRlhfSU5UMzIgbkluZGV4KXtpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSkgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OlJlbW92ZUF0KG5JbmRleCk7fQ0KfTsNCg0KY2xhc3MgQ0ZYX0xpc3QgOiBwcm90ZWN0ZWQgQ0ZYX0xpc3RDb250YWluZXIgLCBwdWJsaWMgSUZYX0xpc3QNCnsNCnB1YmxpYzoNCglDRlhfTGlzdCgpOw0KCXZpcnR1YWwgfkNGWF9MaXN0KCk7DQoNCnB1YmxpYzoNCgl2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwKTsNCgl2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7DQoNCgl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRQbGF0ZVJlY3QoKSBjb25zdDsNCgl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRDb250ZW50UmVjdCgpIGNvbnN0Ow0KDQoJdmlydHVhbCBGWF9GTE9BVAkJCQlHZXRGb250U2l6ZSgpIGNvbnN0Ow0KCXZpcnR1YWwgSUZYX0VkaXQqCQkJCUdldEl0ZW1FZGl0KEZYX0lOVDMyIG5JbmRleCkgY29uc3Q7DQoJdmlydHVhbCBGWF9JTlQzMgkJCQlHZXRDb3VudCgpIGNvbnN0Ow0KCXZpcnR1YWwgRlhfQk9PTAkJCQkJSXNJdGVtU2VsZWN0ZWQoRlhfSU5UMzIgbkluZGV4KSBjb25zdDsNCgl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZpcnN0SGVpZ2h0KCkgY29uc3Q7DQoJDQoJdmlydHVhbCB2b2lkCQkJCQlTZXRNdWx0aXBsZVNlbChGWF9CT09MIGJNdWx0aXBsZSk7DQoJdmlydHVhbCBGWF9CT09MCQkJCQlJc011bHRpcGxlU2VsKCkgY29uc3Q7CQ0KCXZpcnR1YWwgRlhfQk9PTAkJCQkJSXNWYWxpZChGWF9JTlQzMiBuSXRlbUluZGV4KSBjb25zdDsNCgl2aXJ0dWFsIEZYX0lOVDMyCQkJCUZpbmROZXh0KEZYX0lOVDMyIG5JbmRleCxGWF9XQ0hBUiBuQ2hhcikgY29uc3Q7CQ0KDQpwcm90ZWN0ZWQ6DQoJdmlydHVhbCB2b2lkCQkJCQlFbXB0eSgpOw0KDQoJdm9pZAkJCQkJCQlBZGRJdGVtKEZYX0xQQ1dTVFIgc3RyKTsNCgl2aXJ0dWFsIHZvaWQJCQkJCVJlQXJyYW5nZShGWF9JTlQzMiBuSXRlbUluZGV4KTsJDQoNCgl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRJdGVtUmVjdChGWF9JTlQzMiBuSW5kZXgpIGNvbnN0OwkNCglDRlhfV2lkZVN0cmluZwkJCQkJR2V0SXRlbVRleHQoRlhfSU5UMzIgbkluZGV4KSBjb25zdDsNCg0KCXZvaWQJCQkJCQkJU2V0SXRlbVNlbGVjdChGWF9JTlQzMiBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCk7DQoJdm9pZAkJCQkJCQlTZXRJdGVtQ2FyZXQoRlhfSU5UMzIgbkl0ZW1JbmRleCwgRlhfQk9PTCBiQ2FyZXQpOw0KDQoJdmlydHVhbCBGWF9JTlQzMgkJCQlHZXRJdGVtSW5kZXgoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsJCQ0KCUZYX0lOVDMyCQkJCQkJR2V0Rmlyc3RTZWxlY3RlZCgpIGNvbnN0Ow0KCUZYX0lOVDMyCQkJCQkJR2V0TGFzdFNlbGVjdGVkKCkgY29uc3Q7DQoJRlhfV0NIQVIJCQkJCQlUb3VwcGVyKEZYX1dDSEFSIGMpIGNvbnN0Ow0KCQkNCnByaXZhdGU6DQoJQ0xTVF9BcnJheVRlbXBsYXRlPENGWF9MaXN0SXRlbSo+CW1fYUxpc3RJdGVtczsNCglGWF9GTE9BVAkJCQkJCQltX2ZGb250U2l6ZTsNCglJRlhfRWRpdF9Gb250TWFwKgkJCQkJbV9wRm9udE1hcDsNCglGWF9CT09MCQkJCQkJCQltX2JNdWx0aXBsZTsJDQp9Ow0KDQpzdHJ1Y3QgQ1BMU1RfU2VsZWN0X0l0ZW0NCnsNCglDUExTVF9TZWxlY3RfSXRlbShGWF9JTlQzMiBuSXRlbUluZGV4LEZYX0lOVDMyIG5TdGF0ZSkNCgl7DQoJCXRoaXMtPm5JdGVtSW5kZXggPSBuSXRlbUluZGV4Ow0KCQl0aGlzLT5uU3RhdGUgPSBuU3RhdGU7DQoJfQ0KDQoJRlhfSU5UMzIJCW5JdGVtSW5kZXg7DQoJRlhfSU5UMzIJCW5TdGF0ZTsgLy8wOm5vcm1hbCBzZWxlY3QgLTE6dG8gZGVzZWxlY3QgMTogdG8gc2VsZWN0DQp9Ow0KDQpjbGFzcyBDUExTVF9TZWxlY3QNCnsNCnB1YmxpYzoNCglDUExTVF9TZWxlY3QoKTsNCgl2aXJ0dWFsIH5DUExTVF9TZWxlY3QoKTsNCg0KcHVibGljOg0KCXZvaWQJCQkJCQkJQWRkKEZYX0lOVDMyIG5JdGVtSW5kZXgpOw0KCXZvaWQJCQkJCQkJQWRkKEZYX0lOVDMyIG5CZWdpbkluZGV4LCBGWF9JTlQzMiBuRW5kSW5kZXgpOw0KCXZvaWQJCQkJCQkJU3ViKEZYX0lOVDMyIG5JdGVtSW5kZXgpOw0KCXZvaWQJCQkJCQkJU3ViKEZYX0lOVDMyIG5CZWdpbkluZGV4LCBGWF9JTlQzMiBuRW5kSW5kZXgpOw0KCUZYX0JPT0wJCQkJCQkJSXNFeGlzdChGWF9JTlQzMiBuSXRlbUluZGV4KSBjb25zdDsNCglGWF9JTlQzMgkJCQkJCUZpbmQoRlhfSU5UMzIgbkl0ZW1JbmRleCkgY29uc3Q7DQoJRlhfSU5UMzIJCQkJCQlHZXRDb3VudCgpIGNvbnN0Ow0KCUZYX0lOVDMyCQkJCQkJR2V0SXRlbUluZGV4KEZYX0lOVDMyIG5JbmRleCkgY29uc3Q7DQoJRlhfSU5UMzIJCQkJCQlHZXRTdGF0ZShGWF9JTlQzMiBuSW5kZXgpIGNvbnN0Ow0KCXZvaWQJCQkJCQkJRG9uZSgpOw0KCXZvaWQJCQkJCQkJRGVzZWxlY3RBbGwoKTsNCg0KcHJpdmF0ZToNCglDRlhfQXJyYXlUZW1wbGF0ZTxDUExTVF9TZWxlY3RfSXRlbSo+CW1fYUl0ZW1zOw0KfTsNCg0KY2xhc3MgQ0ZYX0xpc3RDdHJsIDogcHVibGljIENGWF9MaXN0DQp7DQpwdWJsaWM6DQoJQ0ZYX0xpc3RDdHJsKCk7DQoJdmlydHVhbCB+Q0ZYX0xpc3RDdHJsKCk7DQoNCnB1YmxpYzoNCgl2b2lkCQkJCQkJCVNldE5vdGlmeShJRlhfTGlzdF9Ob3RpZnkgKiBwTm90aWZ5KTsNCg0KCXZvaWQJCQkJCQkJT25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOw0KCXZvaWQJCQkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOw0KCXZvaWQJCQkJCQkJT25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsNCgl2b2lkCQkJCQkJCU9uVktfRE9XTihGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsNCgl2b2lkCQkJCQkJCU9uVktfTEVGVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsNCgl2b2lkCQkJCQkJCU9uVktfUklHSFQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7DQoJdm9pZAkJCQkJCQlPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7DQoJdm9pZAkJCQkJCQlPblZLX0VORChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsNCgl2b2lkCQkJCQkJCU9uVksoRlhfSU5UMzIgbkl0ZW1JbmRleCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsNCglGWF9CT09MCQkJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOw0KDQoJdmlydHVhbCBDUERGX1BvaW50CQkJCUluVG9PdXQoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsNCgl2aXJ0dWFsIENQREZfUG9pbnQJCQkJT3V0VG9Jbihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Ow0KCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUluVG9PdXQoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkgY29uc3Q7DQoJdmlydHVhbCBDUERGX1JlY3QJCQkJT3V0VG9Jbihjb25zdCBDUERGX1JlY3QgJiByZWN0KSBjb25zdDsNCg0KCXZpcnR1YWwgdm9pZAkJCQkJU2V0UGxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QpOw0KCXZvaWQJCQkJCQkJU2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCk7DQoJdm9pZAkJCQkJCQlTY3JvbGxUb0xpc3RJdGVtKEZYX0lOVDMyIG5JdGVtSW5kZXgpOw0KCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldEl0ZW1SZWN0KEZYX0lOVDMyIG5JbmRleCkgY29uc3Q7DQoJRlhfSU5UMzIJCQkJCQlHZXRDYXJldCgpIGNvbnN0IHtyZXR1cm4gbV9uQ2FyZXRJbmRleDt9DQoJRlhfSU5UMzIJCQkJCQlHZXRTZWxlY3QoKSBjb25zdCB7cmV0dXJuIG1fblNlbEl0ZW07fQkNCglGWF9JTlQzMgkJCQkJCUdldFRvcEl0ZW0oKSBjb25zdDsNCgl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRDb250ZW50UmVjdCgpIGNvbnN0Ow0KCXZpcnR1YWwgRlhfSU5UMzIJCQkJR2V0SXRlbUluZGV4KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3Q7DQoNCgl2b2lkCQkJCQkJCUFkZFN0cmluZyhGWF9MUENXU1RSIHN0cmluZyk7DQoJdm9pZAkJCQkJCQlTZXRUb3BJdGVtKEZYX0lOVDMyIG5JbmRleCk7CQ0KCXZvaWQJCQkJCQkJU2VsZWN0KEZYX0lOVDMyIG5JdGVtSW5kZXgpOw0KCXZpcnR1YWwgdm9pZAkJCQkJU2V0Q2FyZXQoRlhfSU5UMzIgbkl0ZW1JbmRleCk7DQoJdmlydHVhbCB2b2lkCQkJCQlFbXB0eSgpOw0KCXZpcnR1YWwgdm9pZAkJCQkJQ2FuY2VsKCk7DQoJQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFRleHQoKSBjb25zdDsNCg0KcHJpdmF0ZToNCgl2b2lkCQkJCQkJCVNldE11bHRpcGxlU2VsZWN0KEZYX0lOVDMyIG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkKTsNCgl2b2lkCQkJCQkJCVNldFNpbmdsZVNlbGVjdChGWF9JTlQzMiBuSXRlbUluZGV4KTsNCgl2b2lkCQkJCQkJCUludmFsaWRhdGVJdGVtKEZYX0lOVDMyIG5JdGVtSW5kZXgpOw0KCXZvaWQJCQkJCQkJU2VsZWN0SXRlbXMoKTsNCglGWF9CT09MCQkJCQkJCUlzSXRlbVZpc2libGUoRlhfSU5UMzIgbkl0ZW1JbmRleCkgY29uc3Q7CQkNCgl2b2lkCQkJCQkJCVNldFNjcm9sbEluZm8oKTsNCgl2b2lkCQkJCQkJCVNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpOw0KCXZpcnR1YWwgdm9pZAkJCQkJUmVBcnJhbmdlKEZYX0lOVDMyIG5JdGVtSW5kZXgpOwkNCg0KcHJpdmF0ZToNCglJRlhfTGlzdF9Ob3RpZnkqCQkJCW1fcE5vdGlmeTsNCglGWF9CT09MCQkJCQkJCW1fYk5vdGlmeUZsYWc7DQoJQ1BERl9Qb2ludAkJCQkJCW1fcHRTY3JvbGxQb3M7DQoJQ1BMU1RfU2VsZWN0CQkJCQltX2FTZWxJdGVtczsJLy9mb3IgbXVsdGlwbGUNCglGWF9JTlQzMgkJCQkJCW1fblNlbEl0ZW07CQkvL2ZvciBzaW5nbGUNCglGWF9JTlQzMgkJCQkJCW1fbkZvb3RJbmRleDsJLy9mb3IgbXVsdGlwbGUNCglGWF9CT09MCQkJCQkJCW1fYkN0cmxTZWw7CQkvL2ZvciBtdWx0aXBsZQ0KCUZYX0lOVDMyCQkJCQkJbV9uQ2FyZXRJbmRleDsJLy9mb3IgbXVsdGlwbGUNCn07DQoNCiNlbmRpZg0KDQo=