LyogRHJvcCBpbiByZXBsYWNlbWVudCBmb3IgaGVhcHEucHkNCg0KQyBpbXBsZW1lbnRhdGlvbiBkZXJpdmVkIGRpcmVjdGx5IGZyb20gaGVhcHEucHkgaW4gUHkyLjMNCndoaWNoIHdhcyB3cml0dGVuIGJ5IEtldmluIE8nQ29ubm9yLCBhdWdtZW50ZWQgYnkgVGltIFBldGVycywNCmFubm90YXRlZCBieSBGcmFuw6dvaXMgUGluYXJkLCBhbmQgY29udmVydGVkIHRvIEMgYnkgUmF5bW9uZCBIZXR0aW5nZXIuDQoNCiovDQoNCiNpbmNsdWRlICJQeXRob24uaCINCg0KLyogT2xkZXIgaW1wbGVtZW50YXRpb25zIG9mIGhlYXBxIHVzZWQgUHlfTEUgZm9yIGNvbXBhcmlzb25zLiAgTm93LCBpdCB1c2VzDQogICBQeV9MVCBzbyBpdCB3aWxsIG1hdGNoIG1pbigpLCBzb3J0ZWQoKSwgYW5kIGJpc2VjdCgpLiAgVW5mb3J0dW5hdGVseSwgc29tZQ0KICAgY2xpZW50IGNvZGUgKFR3aXN0ZWQgZm9yIGV4YW1wbGUpIHJlbGllZCBvbiBQeV9MRSwgc28gdGhpcyBsaXR0bGUgZnVuY3Rpb24NCiAgIHJlc3RvcmVzIGNvbXBhdGliaWxpdHkgYnkgdHJ5aW5nIGJvdGguDQoqLw0Kc3RhdGljIGludA0KY21wX2x0KFB5T2JqZWN0ICp4LCBQeU9iamVjdCAqeSkNCnsNCiAgICBpbnQgY21wOw0KICAgIHN0YXRpYyBQeU9iamVjdCAqbHQgPSBOVUxMOw0KDQogICAgaWYgKGx0ID09IE5VTEwpIHsNCiAgICAgICAgbHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJfX2x0X18iKTsNCiAgICAgICAgaWYgKGx0ID09IE5VTEwpDQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KICAgIGlmIChQeU9iamVjdF9IYXNBdHRyKHgsIGx0KSkNCiAgICAgICAgcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh4LCB5LCBQeV9MVCk7DQogICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHksIHgsIFB5X0xFKTsNCiAgICBpZiAoY21wICE9IC0xKQ0KICAgICAgICBjbXAgPSAxIC0gY21wOw0KICAgIHJldHVybiBjbXA7DQp9DQoNCnN0YXRpYyBpbnQNCl9zaWZ0ZG93bihQeUxpc3RPYmplY3QgKmhlYXAsIFB5X3NzaXplX3Qgc3RhcnRwb3MsIFB5X3NzaXplX3QgcG9zKQ0Kew0KICAgIFB5T2JqZWN0ICpuZXdpdGVtLCAqcGFyZW50Ow0KICAgIGludCBjbXA7DQogICAgUHlfc3NpemVfdCBwYXJlbnRwb3M7DQoNCiAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsNCiAgICBpZiAocG9zID49IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgew0KICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOw0KICAgIFB5X0lOQ1JFRihuZXdpdGVtKTsNCiAgICAvKiBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZw0KICAgICAgIGEgcGxhY2UgbmV3aXRlbSBmaXRzLiAqLw0KICAgIHdoaWxlIChwb3MgPiBzdGFydHBvcyl7DQogICAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxOw0KICAgICAgICBwYXJlbnQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcGFyZW50cG9zKTsNCiAgICAgICAgY21wID0gY21wX2x0KG5ld2l0ZW0sIHBhcmVudCk7DQogICAgICAgIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdpdGVtKTsNCiAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoY21wID09IDApDQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgUHlfSU5DUkVGKHBhcmVudCk7DQogICAgICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7DQogICAgICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHBhcmVudCk7DQogICAgICAgIHBvcyA9IHBhcmVudHBvczsNCiAgICB9DQogICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsNCiAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBuZXdpdGVtKTsNCiAgICByZXR1cm4gMDsNCn0NCg0Kc3RhdGljIGludA0KX3NpZnR1cChQeUxpc3RPYmplY3QgKmhlYXAsIFB5X3NzaXplX3QgcG9zKQ0Kew0KICAgIFB5X3NzaXplX3Qgc3RhcnRwb3MsIGVuZHBvcywgY2hpbGRwb3MsIHJpZ2h0cG9zOw0KICAgIGludCBjbXA7DQogICAgUHlPYmplY3QgKm5ld2l0ZW0sICp0bXA7DQoNCiAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsNCiAgICBlbmRwb3MgPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7DQogICAgc3RhcnRwb3MgPSBwb3M7DQogICAgaWYgKHBvcyA+PSBlbmRwb3MpIHsNCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCiAgICBuZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7DQogICAgUHlfSU5DUkVGKG5ld2l0ZW0pOw0KDQogICAgLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLw0KICAgIGNoaWxkcG9zID0gMipwb3MgKyAxOyAgICAvKiBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbiAgKi8NCiAgICB3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHsNCiAgICAgICAgLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8NCiAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDE7DQogICAgICAgIGlmIChyaWdodHBvcyA8IGVuZHBvcykgew0KICAgICAgICAgICAgY21wID0gY21wX2x0KA0KICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyksDQogICAgICAgICAgICAgICAgUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHJpZ2h0cG9zKSk7DQogICAgICAgICAgICBpZiAoY21wID09IC0xKSB7DQogICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld2l0ZW0pOw0KICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChjbXAgPT0gMCkNCiAgICAgICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zOw0KICAgICAgICB9DQogICAgICAgIC8qIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuICovDQogICAgICAgIHRtcCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyk7DQogICAgICAgIFB5X0lOQ1JFRih0bXApOw0KICAgICAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOw0KICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCB0bXApOw0KICAgICAgICBwb3MgPSBjaGlsZHBvczsNCiAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDE7DQogICAgfQ0KDQogICAgLyogVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYW5kIGJ1YmJsZQ0KICAgICAgIGl0IHVwIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLiAqLw0KICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7DQogICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7DQogICAgcmV0dXJuIF9zaWZ0ZG93bihoZWFwLCBzdGFydHBvcywgcG9zKTsNCn0NCg0Kc3RhdGljIFB5T2JqZWN0ICoNCmhlYXBwdXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykNCnsNCiAgICBQeU9iamVjdCAqaGVhcCwgKml0ZW07DQoNCiAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcHVzaCIsIDIsIDIsICZoZWFwLCAmaXRlbSkpDQogICAgICAgIHJldHVybiBOVUxMOw0KDQogICAgaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsNCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KDQogICAgaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgaXRlbSkgPT0gLTEpDQogICAgICAgIHJldHVybiBOVUxMOw0KDQogICAgaWYgKF9zaWZ0ZG93bigoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCwgUHlMaXN0X0dFVF9TSVpFKGhlYXApLTEpID09IC0xKQ0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7DQogICAgcmV0dXJuIFB5X05vbmU7DQp9DQoNClB5RG9jX1NUUlZBUihoZWFwcHVzaF9kb2MsDQoiUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LiIpOw0KDQpzdGF0aWMgUHlPYmplY3QgKg0KaGVhcHBvcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmhlYXApDQp7DQogICAgUHlPYmplY3QgKmxhc3RlbHQsICpyZXR1cm5pdGVtOw0KICAgIFB5X3NzaXplX3QgbjsNCg0KICAgIGlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7DQogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCg0KICAgIC8qICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eSAqLw0KICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7DQogICAgaWYgKG4gPT0gMCkgew0KICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOw0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQoNCiAgICBsYXN0ZWx0ID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIG4tMSkgOw0KICAgIFB5X0lOQ1JFRihsYXN0ZWx0KTsNCiAgICBQeUxpc3RfU2V0U2xpY2UoaGVhcCwgbi0xLCBuLCBOVUxMKTsNCiAgICBuLS07DQoNCiAgICBpZiAoIW4pDQogICAgICAgIHJldHVybiBsYXN0ZWx0Ow0KICAgIHJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7DQogICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGxhc3RlbHQpOw0KICAgIGlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgew0KICAgICAgICBQeV9ERUNSRUYocmV0dXJuaXRlbSk7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCiAgICByZXR1cm4gcmV0dXJuaXRlbTsNCn0NCg0KUHlEb2NfU1RSVkFSKGhlYXBwb3BfZG9jLA0KIlBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC4iKTsNCg0Kc3RhdGljIFB5T2JqZWN0ICoNCmhlYXByZXBsYWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykNCnsNCiAgICBQeU9iamVjdCAqaGVhcCwgKml0ZW0sICpyZXR1cm5pdGVtOw0KDQogICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaGVhcHJlcGxhY2UiLCAyLCAyLCAmaGVhcCwgJml0ZW0pKQ0KICAgICAgICByZXR1cm4gTlVMTDsNCg0KICAgIGlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7DQogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCg0KICAgIGlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPCAxKSB7DQogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCg0KICAgIHJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7DQogICAgUHlfSU5DUkVGKGl0ZW0pOw0KICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBpdGVtKTsNCiAgICBpZiAoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCkgPT0gLTEpIHsNCiAgICAgICAgUHlfREVDUkVGKHJldHVybml0ZW0pOw0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQogICAgcmV0dXJuIHJldHVybml0ZW07DQp9DQoNClB5RG9jX1NUUlZBUihoZWFwcmVwbGFjZV9kb2MsDQoiUG9wIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgc21hbGxlc3QgdmFsdWUsIGFuZCBhZGQgdGhlIG5ldyBpdGVtLlxuXA0KXG5cDQpUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaGVhcHBvcCgpIGZvbGxvd2VkIGJ5IGhlYXBwdXNoKCksIGFuZCBjYW4gYmVcblwNCm1vcmUgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBhIGZpeGVkLXNpemUgaGVhcC4gIE5vdGUgdGhhdCB0aGUgdmFsdWVcblwNCnJldHVybmVkIG1heSBiZSBsYXJnZXIgdGhhbiBpdGVtISAgVGhhdCBjb25zdHJhaW5zIHJlYXNvbmFibGUgdXNlcyBvZlxuXA0KdGhpcyByb3V0aW5lIHVubGVzcyB3cml0dGVuIGFzIHBhcnQgb2YgYSBjb25kaXRpb25hbCByZXBsYWNlbWVudDpcblxuXA0KICAgIGlmIGl0ZW0gPiBoZWFwWzBdOlxuXA0KICAgICAgICBpdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSlcbiIpOw0KDQpzdGF0aWMgUHlPYmplY3QgKg0KaGVhcHB1c2hwb3AoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQ0Kew0KICAgIFB5T2JqZWN0ICpoZWFwLCAqaXRlbSwgKnJldHVybml0ZW07DQogICAgaW50IGNtcDsNCg0KICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImhlYXBwdXNocG9wIiwgMiwgMiwgJmhlYXAsICZpdGVtKSkNCiAgICAgICAgcmV0dXJuIE5VTEw7DQoNCiAgICBpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgew0KICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOw0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQoNCiAgICBpZiAoUHlMaXN0X0dFVF9TSVpFKGhlYXApIDwgMSkgew0KICAgICAgICBQeV9JTkNSRUYoaXRlbSk7DQogICAgICAgIHJldHVybiBpdGVtOw0KICAgIH0NCg0KICAgIGNtcCA9IGNtcF9sdChQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCksIGl0ZW0pOw0KICAgIGlmIChjbXAgPT0gLTEpDQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIGlmIChjbXAgPT0gMCkgew0KICAgICAgICBQeV9JTkNSRUYoaXRlbSk7DQogICAgICAgIHJldHVybiBpdGVtOw0KICAgIH0NCg0KICAgIHJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7DQogICAgUHlfSU5DUkVGKGl0ZW0pOw0KICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBpdGVtKTsNCiAgICBpZiAoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCkgPT0gLTEpIHsNCiAgICAgICAgUHlfREVDUkVGKHJldHVybml0ZW0pOw0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQogICAgcmV0dXJuIHJldHVybml0ZW07DQp9DQoNClB5RG9jX1NUUlZBUihoZWFwcHVzaHBvcF9kb2MsDQoiUHVzaCBpdGVtIG9uIHRoZSBoZWFwLCB0aGVuIHBvcCBhbmQgcmV0dXJuIHRoZSBzbWFsbGVzdCBpdGVtXG5cDQpmcm9tIHRoZSBoZWFwLiBUaGUgY29tYmluZWQgYWN0aW9uIHJ1bnMgbW9yZSBlZmZpY2llbnRseSB0aGFuXG5cDQpoZWFwcHVzaCgpIGZvbGxvd2VkIGJ5IGEgc2VwYXJhdGUgY2FsbCB0byBoZWFwcG9wKCkuIik7DQoNCnN0YXRpYyBQeU9iamVjdCAqDQpoZWFwaWZ5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaGVhcCkNCnsNCiAgICBQeV9zc2l6ZV90IGksIG47DQoNCiAgICBpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgew0KICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOw0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQoNCiAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOw0KICAgIC8qIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0bw0KICAgICAgIGxvb2tpbmcgYXQgaXMgdGhlIGxhcmdlc3Qgd2l0aCBhIGNoaWxkIGluZGV4IGluLXJhbmdlLCBzbyBtdXN0DQogICAgICAgaGF2ZSAyKmkgKyAxIDwgbiwgb3IgaSA8IChuLTEpLzIuICBJZiBuIGlzIGV2ZW4gPSAyKmosIHRoaXMgaXMNCiAgICAgICAoMipqLTEpLzIgPSBqLTEvMiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYNCiAgICAgICBuIGlzIG9kZCA9IDIqaisxLCB0aGlzIGlzICgyKmorMS0xKS8yID0gaiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsDQogICAgICAgYW5kIHRoYXQncyBhZ2FpbiBuLy8yLTEuDQogICAgKi8NCiAgICBmb3IgKGk9bi8yLTEgOyBpPj0wIDsgaS0tKQ0KICAgICAgICBpZihfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCBpKSA9PSAtMSkNCiAgICAgICAgICAgIHJldHVybiBOVUxMOw0KICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsNCiAgICByZXR1cm4gUHlfTm9uZTsNCn0NCg0KUHlEb2NfU1RSVkFSKGhlYXBpZnlfZG9jLA0KIlRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oaGVhcCkpIHRpbWUuIik7DQoNCnN0YXRpYyBQeU9iamVjdCAqDQpubGFyZ2VzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpDQp7DQogICAgUHlPYmplY3QgKmhlYXA9TlVMTCwgKmVsZW0sICppdGVyYWJsZSwgKnNvbCwgKml0LCAqb2xkZWxlbTsNCiAgICBQeV9zc2l6ZV90IGksIG47DQogICAgaW50IGNtcDsNCg0KICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibk86bmxhcmdlc3QiLCAmbiwgJml0ZXJhYmxlKSkNCiAgICAgICAgcmV0dXJuIE5VTEw7DQoNCiAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOw0KICAgIGlmIChpdCA9PSBOVUxMKQ0KICAgICAgICByZXR1cm4gTlVMTDsNCg0KICAgIGhlYXAgPSBQeUxpc3RfTmV3KDApOw0KICAgIGlmIChoZWFwID09IE5VTEwpDQogICAgICAgIGdvdG8gZmFpbDsNCg0KICAgIGZvciAoaT0wIDsgaTxuIDsgaSsrICl7DQogICAgICAgIGVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7DQogICAgICAgIGlmIChlbGVtID09IE5VTEwpIHsNCiAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICBnb3RvIHNvcnRpdDsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChoZWFwLCBlbGVtKSA9PSAtMSkgew0KICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOw0KICAgICAgICAgICAgZ290byBmYWlsOw0KICAgICAgICB9DQogICAgICAgIFB5X0RFQ1JFRihlbGVtKTsNCiAgICB9DQogICAgaWYgKFB5TGlzdF9HRVRfU0laRShoZWFwKSA9PSAwKQ0KICAgICAgICBnb3RvIHNvcnRpdDsNCg0KICAgIGZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pDQogICAgICAgIGlmKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIGkpID09IC0xKQ0KICAgICAgICAgICAgZ290byBmYWlsOw0KDQogICAgc29sID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOw0KICAgIHdoaWxlICgxKSB7DQogICAgICAgIGVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7DQogICAgICAgIGlmIChlbGVtID09IE5VTEwpIHsNCiAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQ0KICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICBnb3RvIHNvcnRpdDsNCiAgICAgICAgfQ0KICAgICAgICBjbXAgPSBjbXBfbHQoc29sLCBlbGVtKTsNCiAgICAgICAgaWYgKGNtcCA9PSAtMSkgew0KICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOw0KICAgICAgICAgICAgZ290byBmYWlsOw0KICAgICAgICB9DQogICAgICAgIGlmIChjbXAgPT0gMCkgew0KICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOw0KICAgICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsNCiAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOw0KICAgICAgICBQeV9ERUNSRUYob2xkZWxlbSk7DQogICAgICAgIGlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkNCiAgICAgICAgICAgIGdvdG8gZmFpbDsNCiAgICAgICAgc29sID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOw0KICAgIH0NCnNvcnRpdDoNCiAgICBpZiAoUHlMaXN0X1NvcnQoaGVhcCkgPT0gLTEpDQogICAgICAgIGdvdG8gZmFpbDsNCiAgICBpZiAoUHlMaXN0X1JldmVyc2UoaGVhcCkgPT0gLTEpDQogICAgICAgIGdvdG8gZmFpbDsNCiAgICBQeV9ERUNSRUYoaXQpOw0KICAgIHJldHVybiBoZWFwOw0KDQpmYWlsOg0KICAgIFB5X0RFQ1JFRihpdCk7DQogICAgUHlfWERFQ1JFRihoZWFwKTsNCiAgICByZXR1cm4gTlVMTDsNCn0NCg0KUHlEb2NfU1RSVkFSKG5sYXJnZXN0X2RvYywNCiJGaW5kIHRoZSBuIGxhcmdlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LlxuXA0KXG5cDQpFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlLCByZXZlcnNlPVRydWUpWzpuXVxuIik7DQoNCnN0YXRpYyBpbnQNCl9zaWZ0ZG93bm1heChQeUxpc3RPYmplY3QgKmhlYXAsIFB5X3NzaXplX3Qgc3RhcnRwb3MsIFB5X3NzaXplX3QgcG9zKQ0Kew0KICAgIFB5T2JqZWN0ICpuZXdpdGVtLCAqcGFyZW50Ow0KICAgIGludCBjbXA7DQogICAgUHlfc3NpemVfdCBwYXJlbnRwb3M7DQoNCiAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsNCiAgICBpZiAocG9zID49IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgew0KICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOw0KICAgIFB5X0lOQ1JFRihuZXdpdGVtKTsNCiAgICAvKiBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZw0KICAgICAgIGEgcGxhY2UgbmV3aXRlbSBmaXRzLiAqLw0KICAgIHdoaWxlIChwb3MgPiBzdGFydHBvcyl7DQogICAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxOw0KICAgICAgICBwYXJlbnQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcGFyZW50cG9zKTsNCiAgICAgICAgY21wID0gY21wX2x0KHBhcmVudCwgbmV3aXRlbSk7DQogICAgICAgIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdpdGVtKTsNCiAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoY21wID09IDApDQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgUHlfSU5DUkVGKHBhcmVudCk7DQogICAgICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7DQogICAgICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHBhcmVudCk7DQogICAgICAgIHBvcyA9IHBhcmVudHBvczsNCiAgICB9DQogICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsNCiAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBuZXdpdGVtKTsNCiAgICByZXR1cm4gMDsNCn0NCg0Kc3RhdGljIGludA0KX3NpZnR1cG1heChQeUxpc3RPYmplY3QgKmhlYXAsIFB5X3NzaXplX3QgcG9zKQ0Kew0KICAgIFB5X3NzaXplX3Qgc3RhcnRwb3MsIGVuZHBvcywgY2hpbGRwb3MsIHJpZ2h0cG9zOw0KICAgIGludCBjbXA7DQogICAgUHlPYmplY3QgKm5ld2l0ZW0sICp0bXA7DQoNCiAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsNCiAgICBlbmRwb3MgPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7DQogICAgc3RhcnRwb3MgPSBwb3M7DQogICAgaWYgKHBvcyA+PSBlbmRwb3MpIHsNCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCiAgICBuZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7DQogICAgUHlfSU5DUkVGKG5ld2l0ZW0pOw0KDQogICAgLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLw0KICAgIGNoaWxkcG9zID0gMipwb3MgKyAxOyAgICAvKiBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbiAgKi8NCiAgICB3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHsNCiAgICAgICAgLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8NCiAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDE7DQogICAgICAgIGlmIChyaWdodHBvcyA8IGVuZHBvcykgew0KICAgICAgICAgICAgY21wID0gY21wX2x0KA0KICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTShoZWFwLCByaWdodHBvcyksDQogICAgICAgICAgICAgICAgUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKSk7DQogICAgICAgICAgICBpZiAoY21wID09IC0xKSB7DQogICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld2l0ZW0pOw0KICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChjbXAgPT0gMCkNCiAgICAgICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zOw0KICAgICAgICB9DQogICAgICAgIC8qIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuICovDQogICAgICAgIHRtcCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyk7DQogICAgICAgIFB5X0lOQ1JFRih0bXApOw0KICAgICAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOw0KICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCB0bXApOw0KICAgICAgICBwb3MgPSBjaGlsZHBvczsNCiAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDE7DQogICAgfQ0KDQogICAgLyogVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYW5kIGJ1YmJsZQ0KICAgICAgIGl0IHVwIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLiAqLw0KICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7DQogICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7DQogICAgcmV0dXJuIF9zaWZ0ZG93bm1heChoZWFwLCBzdGFydHBvcywgcG9zKTsNCn0NCg0Kc3RhdGljIFB5T2JqZWN0ICoNCm5zbWFsbGVzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpDQp7DQogICAgUHlPYmplY3QgKmhlYXA9TlVMTCwgKmVsZW0sICppdGVyYWJsZSwgKmxvcywgKml0LCAqb2xkZWxlbTsNCiAgICBQeV9zc2l6ZV90IGksIG47DQogICAgaW50IGNtcDsNCg0KICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibk86bnNtYWxsZXN0IiwgJm4sICZpdGVyYWJsZSkpDQogICAgICAgIHJldHVybiBOVUxMOw0KDQogICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsNCiAgICBpZiAoaXQgPT0gTlVMTCkNCiAgICAgICAgcmV0dXJuIE5VTEw7DQoNCiAgICBoZWFwID0gUHlMaXN0X05ldygwKTsNCiAgICBpZiAoaGVhcCA9PSBOVUxMKQ0KICAgICAgICBnb3RvIGZhaWw7DQoNCiAgICBmb3IgKGk9MCA7IGk8biA7IGkrKyApew0KICAgICAgICBlbGVtID0gUHlJdGVyX05leHQoaXQpOw0KICAgICAgICBpZiAoZWxlbSA9PSBOVUxMKSB7DQogICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgICAgICAgICAgICBnb3RvIGZhaWw7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgZ290byBzb3J0aXQ7DQogICAgICAgIH0NCiAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgZWxlbSkgPT0gLTEpIHsNCiAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsNCiAgICAgICAgICAgIGdvdG8gZmFpbDsNCiAgICAgICAgfQ0KICAgICAgICBQeV9ERUNSRUYoZWxlbSk7DQogICAgfQ0KICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7DQogICAgaWYgKG4gPT0gMCkNCiAgICAgICAgZ290byBzb3J0aXQ7DQoNCiAgICBmb3IgKGk9bi8yLTEgOyBpPj0wIDsgaS0tKQ0KICAgICAgICBpZihfc2lmdHVwbWF4KChQeUxpc3RPYmplY3QgKiloZWFwLCBpKSA9PSAtMSkNCiAgICAgICAgICAgIGdvdG8gZmFpbDsNCg0KICAgIGxvcyA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsNCiAgICB3aGlsZSAoMSkgew0KICAgICAgICBlbGVtID0gUHlJdGVyX05leHQoaXQpOw0KICAgICAgICBpZiAoZWxlbSA9PSBOVUxMKSB7DQogICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgICAgICAgICAgICBnb3RvIGZhaWw7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgZ290byBzb3J0aXQ7DQogICAgICAgIH0NCiAgICAgICAgY21wID0gY21wX2x0KGVsZW0sIGxvcyk7DQogICAgICAgIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsNCiAgICAgICAgICAgIGdvdG8gZmFpbDsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoY21wID09IDApIHsNCiAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9DQoNCiAgICAgICAgb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsNCiAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOw0KICAgICAgICBQeV9ERUNSRUYob2xkZWxlbSk7DQogICAgICAgIGlmIChfc2lmdHVwbWF4KChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkNCiAgICAgICAgICAgIGdvdG8gZmFpbDsNCiAgICAgICAgbG9zID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOw0KICAgIH0NCg0Kc29ydGl0Og0KICAgIGlmIChQeUxpc3RfU29ydChoZWFwKSA9PSAtMSkNCiAgICAgICAgZ290byBmYWlsOw0KICAgIFB5X0RFQ1JFRihpdCk7DQogICAgcmV0dXJuIGhlYXA7DQoNCmZhaWw6DQogICAgUHlfREVDUkVGKGl0KTsNCiAgICBQeV9YREVDUkVGKGhlYXApOw0KICAgIHJldHVybiBOVUxMOw0KfQ0KDQpQeURvY19TVFJWQVIobnNtYWxsZXN0X2RvYywNCiJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cblwNClxuXA0KRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSlbOm5dXG4iKTsNCg0Kc3RhdGljIFB5TWV0aG9kRGVmIGhlYXBxX21ldGhvZHNbXSA9IHsNCiAgICB7ImhlYXBwdXNoIiwgICAgICAgIChQeUNGdW5jdGlvbiloZWFwcHVzaCwNCiAgICAgICAgTUVUSF9WQVJBUkdTLCAgICAgICAgICAgaGVhcHB1c2hfZG9jfSwNCiAgICB7ImhlYXBwdXNocG9wIiwgICAgIChQeUNGdW5jdGlvbiloZWFwcHVzaHBvcCwNCiAgICAgICAgTUVUSF9WQVJBUkdTLCAgICAgICAgICAgaGVhcHB1c2hwb3BfZG9jfSwNCiAgICB7ImhlYXBwb3AiLCAgICAgICAgIChQeUNGdW5jdGlvbiloZWFwcG9wLA0KICAgICAgICBNRVRIX08sICAgICAgICAgICAgICAgICBoZWFwcG9wX2RvY30sDQogICAgeyJoZWFwcmVwbGFjZSIsICAgICAoUHlDRnVuY3Rpb24paGVhcHJlcGxhY2UsDQogICAgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgIGhlYXByZXBsYWNlX2RvY30sDQogICAgeyJoZWFwaWZ5IiwgICAgICAgICAoUHlDRnVuY3Rpb24paGVhcGlmeSwNCiAgICAgICAgTUVUSF9PLCAgICAgICAgICAgICAgICAgaGVhcGlmeV9kb2N9LA0KICAgIHsibmxhcmdlc3QiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKW5sYXJnZXN0LA0KICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICBubGFyZ2VzdF9kb2N9LA0KICAgIHsibnNtYWxsZXN0IiwgICAgICAgKFB5Q0Z1bmN0aW9uKW5zbWFsbGVzdCwNCiAgICAgICAgTUVUSF9WQVJBUkdTLCAgICAgICAgICAgbnNtYWxsZXN0X2RvY30sDQogICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8NCn07DQoNClB5RG9jX1NUUlZBUihtb2R1bGVfZG9jLA0KIkhlYXAgcXVldWUgYWxnb3JpdGhtIChhLmsuYS4gcHJpb3JpdHkgcXVldWUpLlxuXA0KXG5cDQpIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvclxuXA0KYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxuXA0Kbm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlIGludGVyZXN0aW5nXG5cDQpwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC5cblwNClxuXA0KVXNhZ2U6XG5cDQpcblwNCmhlYXAgPSBbXSAgICAgICAgICAgICMgY3JlYXRlcyBhbiBlbXB0eSBoZWFwXG5cDQpoZWFwcHVzaChoZWFwLCBpdGVtKSAjIHB1c2hlcyBhIG5ldyBpdGVtIG9uIHRoZSBoZWFwXG5cDQppdGVtID0gaGVhcHBvcChoZWFwKSAjIHBvcHMgdGhlIHNtYWxsZXN0IGl0ZW0gZnJvbSB0aGUgaGVhcFxuXA0KaXRlbSA9IGhlYXBbMF0gICAgICAgIyBzbWFsbGVzdCBpdGVtIG9uIHRoZSBoZWFwIHdpdGhvdXQgcG9wcGluZyBpdFxuXA0KaGVhcGlmeSh4KSAgICAgICAgICAgIyB0cmFuc2Zvcm1zIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBsaW5lYXIgdGltZVxuXA0KaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pICMgcG9wcyBhbmQgcmV0dXJucyBzbWFsbGVzdCBpdGVtLCBhbmQgYWRkc1xuXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmV3IGl0ZW07IHRoZSBoZWFwIHNpemUgaXMgdW5jaGFuZ2VkXG5cDQpcblwNCk91ciBBUEkgZGlmZmVycyBmcm9tIHRleHRib29rIGhlYXAgYWxnb3JpdGhtcyBhcyBmb2xsb3dzOlxuXA0KXG5cDQotIFdlIHVzZSAwLWJhc2VkIGluZGV4aW5nLiAgVGhpcyBtYWtlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlXG5cDQogIGluZGV4IGZvciBhIG5vZGUgYW5kIHRoZSBpbmRleGVzIGZvciBpdHMgY2hpbGRyZW4gc2xpZ2h0bHkgbGVzc1xuXA0KICBvYnZpb3VzLCBidXQgaXMgbW9yZSBzdWl0YWJsZSBzaW5jZSBQeXRob24gdXNlcyAwLWJhc2VkIGluZGV4aW5nLlxuXA0KXG5cDQotIE91ciBoZWFwcG9wKCkgbWV0aG9kIHJldHVybnMgdGhlIHNtYWxsZXN0IGl0ZW0sIG5vdCB0aGUgbGFyZ2VzdC5cblwNClxuXA0KVGhlc2UgdHdvIG1ha2UgaXQgcG9zc2libGUgdG8gdmlldyB0aGUgaGVhcCBhcyBhIHJlZ3VsYXIgUHl0aG9uIGxpc3RcblwNCndpdGhvdXQgc3VycHJpc2VzOiBoZWFwWzBdIGlzIHRoZSBzbWFsbGVzdCBpdGVtLCBhbmQgaGVhcC5zb3J0KClcblwNCm1haW50YWlucyB0aGUgaGVhcCBpbnZhcmlhbnQhXG4iKTsNCg0KDQpQeURvY19TVFJWQVIoX19hYm91dF9fLA0KIkhlYXAgcXVldWVzXG5cDQpcblwNCltleHBsYW5hdGlvbiBieSBGcmFu529pcyBQaW5hcmRdXG5cDQpcblwNCkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXG5cDQphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sXG5cDQpub24tZXhpc3RpbmcgZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW5maW5pdGUuICBUaGUgaW50ZXJlc3RpbmdcblwNCnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxuIg0KIlxuXA0KVGhlIHN0cmFuZ2UgaW52YXJpYW50IGFib3ZlIGlzIG1lYW50IHRvIGJlIGFuIGVmZmljaWVudCBtZW1vcnlcblwNCnJlcHJlc2VudGF0aW9uIGZvciBhIHRvdXJuYW1lbnQuICBUaGUgbnVtYmVycyBiZWxvdyBhcmUgYGsnLCBub3QgYVtrXTpcblwNClxuXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwXG5cDQpcblwNCiAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXG5cDQpcblwNCiAgICAgICAgICAzICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICA1ICAgICAgICAgICAgICAgNlxuXA0KXG5cDQogICAgICA3ICAgICAgIDggICAgICAgOSAgICAgICAxMCAgICAgIDExICAgICAgMTIgICAgICAxMyAgICAgIDE0XG5cDQpcblwNCiAgICAxNSAxNiAgIDE3IDE4ICAgMTkgMjAgICAyMSAyMiAgIDIzIDI0ICAgMjUgMjYgICAyNyAyOCAgIDI5IDMwXG5cDQpcblwNClxuXA0KSW4gdGhlIHRyZWUgYWJvdmUsIGVhY2ggY2VsbCBgaycgaXMgdG9wcGluZyBgMiprKzEnIGFuZCBgMiprKzInLiAgSW5cblwNCmFuIHVzdWFsIGJpbmFyeSB0b3VybmFtZW50IHdlIHNlZSBpbiBzcG9ydHMsIGVhY2ggY2VsbCBpcyB0aGUgd2lubmVyXG5cDQpvdmVyIHRoZSB0d28gY2VsbHMgaXQgdG9wcywgYW5kIHdlIGNhbiB0cmFjZSB0aGUgd2lubmVyIGRvd24gdGhlIHRyZWVcblwNCnRvIHNlZSBhbGwgb3Bwb25lbnRzIHMvaGUgaGFkLiAgSG93ZXZlciwgaW4gbWFueSBjb21wdXRlciBhcHBsaWNhdGlvbnNcblwNCm9mIHN1Y2ggdG91cm5hbWVudHMsIHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNlIHRoZSBoaXN0b3J5IG9mIGEgd2lubmVyLlxuXA0KVG8gYmUgbW9yZSBtZW1vcnkgZWZmaWNpZW50LCB3aGVuIGEgd2lubmVyIGlzIHByb21vdGVkLCB3ZSB0cnkgdG9cblwNCnJlcGxhY2UgaXQgYnkgc29tZXRoaW5nIGVsc2UgYXQgYSBsb3dlciBsZXZlbCwgYW5kIHRoZSBydWxlIGJlY29tZXNcblwNCnRoYXQgYSBjZWxsIGFuZCB0aGUgdHdvIGNlbGxzIGl0IHRvcHMgY29udGFpbiB0aHJlZSBkaWZmZXJlbnQgaXRlbXMsXG5cDQpidXQgdGhlIHRvcCBjZWxsIFwid2luc1wiIG92ZXIgdGhlIHR3byB0b3BwZWQgY2VsbHMuXG4iDQoiXG5cDQpJZiB0aGlzIGhlYXAgaW52YXJpYW50IGlzIHByb3RlY3RlZCBhdCBhbGwgdGltZSwgaW5kZXggMCBpcyBjbGVhcmx5XG5cDQp0aGUgb3ZlcmFsbCB3aW5uZXIuICBUaGUgc2ltcGxlc3QgYWxnb3JpdGhtaWMgd2F5IHRvIHJlbW92ZSBpdCBhbmRcblwNCmZpbmQgdGhlIFwibmV4dFwiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZVxuXA0KZGlhZ3JhbSBhYm92ZSkgaW50byB0aGUgMCBwb3NpdGlvbiwgYW5kIHRoZW4gcGVyY29sYXRlIHRoaXMgbmV3IDAgZG93blxuXA0KdGhlIHRyZWUsIGV4Y2hhbmdpbmcgdmFsdWVzLCB1bnRpbCB0aGUgaW52YXJpYW50IGlzIHJlLWVzdGFibGlzaGVkLlxuXA0KVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuXG5cDQpCeSBpdGVyYXRpbmcgb3ZlciBhbGwgaXRlbXMsIHlvdSBnZXQgYW4gTyhuIGxuIG4pIHNvcnQuXG4iDQoiXG5cDQpBIG5pY2UgZmVhdHVyZSBvZiB0aGlzIHNvcnQgaXMgdGhhdCB5b3UgY2FuIGVmZmljaWVudGx5IGluc2VydCBuZXdcblwNCml0ZW1zIHdoaWxlIHRoZSBzb3J0IGlzIGdvaW5nIG9uLCBwcm92aWRlZCB0aGF0IHRoZSBpbnNlcnRlZCBpdGVtcyBhcmVcblwNCm5vdCBcImJldHRlclwiIHRoYW4gdGhlIGxhc3QgMCd0aCBlbGVtZW50IHlvdSBleHRyYWN0ZWQuICBUaGlzIGlzXG5cDQplc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGxcblwNCmluY29taW5nIGV2ZW50cywgYW5kIHRoZSBcIndpblwiIGNvbmRpdGlvbiBtZWFucyB0aGUgc21hbGxlc3Qgc2NoZWR1bGVkXG5cDQp0aW1lLiAgV2hlbiBhbiBldmVudCBzY2hlZHVsZSBvdGhlciBldmVudHMgZm9yIGV4ZWN1dGlvbiwgdGhleSBhcmVcblwNCnNjaGVkdWxlZCBpbnRvIHRoZSBmdXR1cmUsIHNvIHRoZXkgY2FuIGVhc2lseSBnbyBpbnRvIHRoZSBoZWFwLiAgU28sIGFcblwNCmhlYXAgaXMgYSBnb29kIHN0cnVjdHVyZSBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgKHRoaXMgaXMgd2hhdCBJXG5cDQp1c2VkIGZvciBteSBNSURJIHNlcXVlbmNlciA6LSkuXG4iDQoiXG5cDQpWYXJpb3VzIHN0cnVjdHVyZXMgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzIGhhdmUgYmVlbiBleHRlbnNpdmVseVxuXA0Kc3R1ZGllZCwgYW5kIGhlYXBzIGFyZSBnb29kIGZvciB0aGlzLCBhcyB0aGV5IGFyZSByZWFzb25hYmx5IHNwZWVkeSxcblwNCnRoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnRcblwNCnRoYW4gdGhlIGF2ZXJhZ2UgY2FzZS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBvdGhlciByZXByZXNlbnRhdGlvbnMgd2hpY2hcblwNCmFyZSBtb3JlIGVmZmljaWVudCBvdmVyYWxsLCB5ZXQgdGhlIHdvcnN0IGNhc2VzIG1pZ2h0IGJlIHRlcnJpYmxlLlxuIg0KIlxuXA0KSGVhcHMgYXJlIGFsc28gdmVyeSB1c2VmdWwgaW4gYmlnIGRpc2sgc29ydHMuICBZb3UgbW9zdCBwcm9iYWJseSBhbGxcblwNCmtub3cgdGhhdCBhIGJpZyBzb3J0IGltcGxpZXMgcHJvZHVjaW5nIFwicnVuc1wiICh3aGljaCBhcmUgcHJlLXNvcnRlZFxuXA0Kc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLFxuXA0KZm9sbG93ZWQgYnkgYSBtZXJnaW5nIHBhc3NlcyBmb3IgdGhlc2UgcnVucywgd2hpY2ggbWVyZ2luZyBpcyBvZnRlblxuXA0KdmVyeSBjbGV2ZXJseSBvcmdhbmlzZWRbMV0uICBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHRoZSBpbml0aWFsXG5cDQpzb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheVxuXA0KdG8gdGhhdC4gIElmLCB1c2luZyBhbGwgdGhlIG1lbW9yeSBhdmFpbGFibGUgdG8gaG9sZCBhIHRvdXJuYW1lbnQsIHlvdVxuXA0KcmVwbGFjZSBhbmQgcGVyY29sYXRlIGl0ZW1zIHRoYXQgaGFwcGVuIHRvIGZpdCB0aGUgY3VycmVudCBydW4sIHlvdSdsbFxuXA0KcHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsXG5cDQphbmQgbXVjaCBiZXR0ZXIgZm9yIGlucHV0IGZ1enppbHkgb3JkZXJlZC5cbiINCiJcblwNCk1vcmVvdmVyLCBpZiB5b3Ugb3V0cHV0IHRoZSAwJ3RoIGl0ZW0gb24gZGlzayBhbmQgZ2V0IGFuIGlucHV0IHdoaWNoXG5cDQptYXkgbm90IGZpdCBpbiB0aGUgY3VycmVudCB0b3VybmFtZW50IChiZWNhdXNlIHRoZSB2YWx1ZSBcIndpbnNcIiBvdmVyXG5cDQp0aGUgbGFzdCBvdXRwdXQgdmFsdWUpLCBpdCBjYW5ub3QgZml0IGluIHRoZSBoZWFwLCBzbyB0aGUgc2l6ZSBvZiB0aGVcblwNCmhlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHlcblwNCmZvciBwcm9ncmVzc2l2ZWx5IGJ1aWxkaW5nIGEgc2Vjb25kIGhlYXAsIHdoaWNoIGdyb3dzIGF0IGV4YWN0bHkgdGhlXG5cDQpzYW1lIHJhdGUgdGhlIGZpcnN0IGhlYXAgaXMgbWVsdGluZy4gIFdoZW4gdGhlIGZpcnN0IGhlYXAgY29tcGxldGVseVxuXA0KdmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGVcblwNCmVmZmVjdGl2ZSFcblwNClxuXA0KSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluXG5cDQphIGZldyBhcHBsaWNhdGlvbnMsIGFuZCBJIHRoaW5rIGl0IGlzIGdvb2QgdG8ga2VlcCBhIGBoZWFwJyBtb2R1bGVcblwNCmFyb3VuZC4gOi0pXG4iDQoiXG5cDQotLS0tLS0tLS0tLS0tLS0tLS0tLVxuXA0KWzFdIFRoZSBkaXNrIGJhbGFuY2luZyBhbGdvcml0aG1zIHdoaWNoIGFyZSBjdXJyZW50LCBub3dhZGF5cywgYXJlXG5cDQptb3JlIGFubm95aW5nIHRoYW4gY2xldmVyLCBhbmQgdGhpcyBpcyBhIGNvbnNlcXVlbmNlIG9mIHRoZSBzZWVraW5nXG5cDQpjYXBhYmlsaXRpZXMgb2YgdGhlIGRpc2tzLiAgT24gZGV2aWNlcyB3aGljaCBjYW5ub3Qgc2VlaywgbGlrZSBiaWdcblwNCnRhcGUgZHJpdmVzLCB0aGUgc3Rvcnkgd2FzIHF1aXRlIGRpZmZlcmVudCwgYW5kIG9uZSBoYWQgdG8gYmUgdmVyeVxuXA0KY2xldmVyIHRvIGVuc3VyZSAoZmFyIGluIGFkdmFuY2UpIHRoYXQgZWFjaCB0YXBlIG1vdmVtZW50IHdpbGwgYmUgdGhlXG5cDQptb3N0IGVmZmVjdGl2ZSBwb3NzaWJsZSAodGhhdCBpcywgd2lsbCBiZXN0IHBhcnRpY2lwYXRlIGF0XG5cDQpcInByb2dyZXNzaW5nXCIgdGhlIG1lcmdlKS4gIFNvbWUgdGFwZXMgd2VyZSBldmVuIGFibGUgdG8gcmVhZFxuXA0KYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS5cblwNCkJlbGlldmUgbWUsIHJlYWwgZ29vZCB0YXBlIHNvcnRzIHdlcmUgcXVpdGUgc3BlY3RhY3VsYXIgdG8gd2F0Y2ghXG5cDQpGcm9tIGFsbCB0aW1lcywgc29ydGluZyBoYXMgYWx3YXlzIGJlZW4gYSBHcmVhdCBBcnQhIDotKVxuIik7DQoNClB5TU9ESU5JVF9GVU5DDQppbml0X2hlYXBxKHZvaWQpDQp7DQogICAgUHlPYmplY3QgKm07DQoNCiAgICBtID0gUHlfSW5pdE1vZHVsZTMoIl9oZWFwcSIsIGhlYXBxX21ldGhvZHMsIG1vZHVsZV9kb2MpOw0KICAgIGlmIChtID09IE5VTEwpDQogICAgICAgIHJldHVybjsNCiAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9fYWJvdXRfXyIsIFB5U3RyaW5nX0Zyb21TdHJpbmcoX19hYm91dF9fKSk7DQp9DQoNCg==