Copa España 2023 - 1a Prueba Dificultad
Abs_M
[1] " Copa España 2023 - 1a Prueba Dificultad - Getafe "
[1] 27
Abs_F
[1] " Copa España 2023 - 1a Prueba Dificultad - Getafe "
[1] 15
Sub18_M
[1] " Copa España 2023 - 1a Prueba Dificultad - Getafe "
[1] 27
Sub18_F
[1] " Copa España 2023 - 1a Prueba Dificultad - Getafe "
[1] 18
Sub16_M
[1] " Copa España 2023 - 1a Prueba Dificultad - Getafe "
[1] 26
Sub16_F
[1] " Copa España 2023 - 1a Prueba Dificultad - Getafe "
[1] 32
Sub14_M
[1] " Copa España 2023 - 1a Prueba Dificultad - Getafe "
[1] 32
Sub14_F
[1] " Copa España 2023 - 1a Prueba Dificultad - Getafe "
[1] 32
Copa España 2023 - 2a Prueba Dificultad
Abs_M
[1] " Copa España 2023 - 2a Prueba Dificultad - Torrejón "
[1] 21
Abs_F
[1] " Copa España 2023 - 2a Prueba Dificultad - Torrejón "
[1] 15
Sub18_M
[1] " Copa España 2023 - 2a Prueba Dificultad - Torrejón "
[1] 26
Sub18_F
[1] " Copa España 2023 - 2a Prueba Dificultad - Torrejón "
[1] 17
Sub16_M
[1] " Copa España 2023 - 2a Prueba Dificultad - Torrejón "
[1] 28
Sub16_F
[1] " Copa España 2023 - 2a Prueba Dificultad - Torrejón "
[1] 34
Sub14_M
[1] " Copa España 2023 - 2a Prueba Dificultad - Torrejón "
[1] 32
Sub14_F
[1] " Copa España 2023 - 2a Prueba Dificultad - Torrejón "
[1] 31
Copa España 2023 - 3a Prueba Dificultad
Abs_M
[1] " Copa España 2023 - 3a Prueba Dificultad - Vilanova "
[1] 19
Abs_F
[1] " Copa España 2023 - 3a Prueba Dificultad - Vilanova "
[1] 15
Sub18_M
[1] " Copa España 2023 - 3a Prueba Dificultad - Vilanova "
[1] 19
Sub18_F
[1] " Copa España 2023 - 3a Prueba Dificultad - Vilanova "
[1] 13
Sub16_M
[1] " Copa España 2023 - 3a Prueba Dificultad - Vilanova "
[1] 22
Sub16_F
[1] " Copa España 2023 - 3a Prueba Dificultad - Vilanova "
[1] 27
Sub14_M
[1] " Copa España 2023 - 3a Prueba Dificultad - Vilanova "
[1] 28
Sub14_F
[1] " Copa España 2023 - 3a Prueba Dificultad - Vilanova "
[1] 30
LS0tDQp0aXRsZTogImZlZG1lLmZlZWMucmVzdWx0c19Ob3RlQm9va19MZWFkXzIzIg0KYXV0aG9yOiAiRmVkZXJpY28gSi4gVmlsbGF0b3JvIg0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHRydWUNCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCi0tLQ0KDQojIyMjIyBGdWVudGU6IFtodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mb10oaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vKQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoZmxleGRhc2hib2FyZCkNCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgZWNobyA9IEZBTFNFLA0KCW1lc3NhZ2UgPSBGQUxTRSwNCiAgd2FybmluZyA9IEZBTFNFLA0KCWluY2x1ZGUgPSBGQUxTRQ0KKQ0KYGBgICANCg0KYGBge3IgcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQppZighcmVxdWlyZSh0aWR5dmVyc2UpKXtpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKX0NCmlmKCFyZXF1aXJlKGdvb2dsZXNoZWV0czQpKXtpbnN0YWxsLnBhY2thZ2VzKCJnb29nbGVzaGVldHM0Iil9DQppZighcmVxdWlyZShnb29nbGVkcml2ZSkpe2luc3RhbGwucGFja2FnZXMoImdvb2dsZWRyaXZlIil9DQppZighcmVxdWlyZShkcGx5cikpe2luc3RhbGwucGFja2FnZXMoImRwbHlyIil9DQppZighcmVxdWlyZShodHRyMikpe2luc3RhbGwucGFja2FnZXMoImh0dHIyIil9DQppZighcmVxdWlyZShqc29ubGl0ZSkpe2luc3RhbGwucGFja2FnZXMoImpzb25saXRlIil9DQppZighcmVxdWlyZShSc2VsZW5pdW0pKXtpbnN0YWxsLnBhY2thZ2VzKCJSc2VsZW5pdW0iKX0NCmlmKCFyZXF1aXJlKGNocm9tb3RlKSl7aW5zdGFsbC5wYWNrYWdlcygiY2hyb21vdGUiKX0NCmlmKCFyZXF1aXJlKHB1cnJyKSl7aW5zdGFsbC5wYWNrYWdlcygicHVycnIiKX0NCmlmKCFyZXF1aXJlKHdkbWFuKSl7aW5zdGFsbC5wYWNrYWdlcygid2RtYW4iKX0NCiMjDQpsaWJyYXJ5KGNocm9tb3RlKQ0KbGlicmFyeShwdXJycikNCmxpYnJhcnkod2RtYW4pDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGpzb25saXRlKQ0KbGlicmFyeShSU2VsZW5pdW0pDQoNCmxpYnJhcnkoZ29vZ2xlc2hlZXRzNCkNCmxpYnJhcnkoZ29vZ2xlZHJpdmUpDQoNCmBgYCAgDQoNCiMjIENvcGEgRXNwYcOxYSAyMDIzIC0gMWEgUHJ1ZWJhIERpZmljdWx0YWQNCg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KdXJsIDwtICJodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby9ldmVudC8xNS9nZW5lcmFsL2xlYWQiDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCmIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQpiJFBhZ2UkbmF2aWdhdGUodXJsKQ0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDEpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkNCiMjIyANCmBgYCAgDQoNCg0KDQojIyMgQWJzX00NCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpIA0KIyMjDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgInNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuaykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIkFic19GIiwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCnNjcmFwJENvbXBldGl0aW9uIDwtIHJlcChjb21wZSwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCiMjDQpjb21wZQ0Kbi5jb21wZXRpdG9ycyA8LSBtYXgoc2NyYXAkUmFuaywgbmEucm0gPSBUUlVFKTsgbi5jb21wZXRpdG9ycw0KIyMNCiMgc2NyYXAgJT4lIHByaW50KG49bGVuZ3RoKHNjcmFwJE5hbWUpKQ0Kc2NyYXBbLGMoMTo2KV0gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkgJT4lDQogIHByaW50KG4gPSAxNykNCiMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNCkFic19NIDwtIHNjcmFwDQpgYGAgIA0KDQojIyMgQWJzX0YNCg0KYGBge3J9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBzY3JhcGluZyBhY3RpdmUgcGFnZSB1c2luZyBjaHJvbW90ZSAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBBYnNGIERPbmUNCiMgQWJzTQ0KDQojIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQoNCiMgdXJsIDwtICJodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby9ldmVudC8zMC9nZW5lcmFsL2xlYWQiDQoNCiMjIyMjIyMjIyMjIyAgIGNocm9tb3RlOjogT1BUSU9OICMjIyMjIw0KIyBDcmVhdGUgYSBuZXcgQ2hyb21vdGUgc2Vzc2lvbg0KIyBiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQojIGIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQoNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCgyKSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpICANCmBgYCAgDQoNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMjIA0KY29tcGUgPC0gcGFnZSAlPiUNCiAgaHRtbF9lbGVtZW50cygnZGl2LmdyLWV2ZW50LW5hbWUnKSAlPiUNCiAgaHRtbF90ZXh0KCkNCiMjIw0KY29tcGV0aXRvcl9kaXZzIDwtIHBhZ2UgJT4lIA0KICBodG1sX2VsZW1lbnRzKCJkaXYuYXRobGV0ZS1iYXNpYy1saW5lIikgIyANCiMjIw0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJzY29yZS5yYW5rIiwgTkEpLCBzZXAgPSAiICIpDQojc2NyYXAgPC0gc2NyYXAgJT4lIA0KICMgc2VwYXJhdGUoc2NvcmUucmFuaywgaW50byA9IGMoTkEsTkEsInNjb3JlLnJhbmsiKSwgc2VwID0gIigpIikNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgbXV0YXRlKFJhbmsgPSBhcy5udW1lcmljKFJhbmspKQ0Kc2NyYXAkQ2F0ZWdvcnkgPC0gcmVwKCJBYnNfTSIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6NildICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpBYnNfRiA8LSBzY3JhcA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpgYGAgIA0KIyMjIFN1YjE4X00NCg0KYGBge3J9DQojIHNjcmFwaW5nIGFjdGl2ZSBwYWdlIHVzaW5nIGNocm9tb3RlICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEFic0YgRE9uZQ0KIyBBYnNNIERPTkUNCiMgU3ViMThNDQoNCiMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KIyB1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojIGIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQoNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCiMgYiRQYWdlJG5hdmlnYXRlKHVybCkNCg0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDMpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkNCmBgYCAgDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgInNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuaykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIlN1YjE4X00iLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjYpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KU3ViMThNIDwtIHNjcmFwDQpgYGAgIA0KDQojIyMgU3ViMThfRg0KDQpgYGB7cn0NCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIEFic0YgRE9ORQ0KIyBBYnNNIERPTkUNCiMgU3ViMTggTSBET05FDQojIFN1YjE4IEYNCiMgU3ViMTYgTQ0KIyBTdWIxNiBGDQojIFN1YjE0IE0NCiMgU3ViMTQgRg0KDQojIHNjcmFwaW5nIGFjdGl2ZSBwYWdlIHVzaW5nIGNocm9tb3RlICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEFic0YgRE9uZQ0KIyBBYnNNIERPTkUNCiMgU3ViMThNIERPTkUNCiMgU3ViMThGIA0KDQojIFVSTCBvZiB0aGUgd2VicGFnZSB0byBzY3JhcGUNCiMgdXJsIDwtICJodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby9ldmVudC8zMC9nZW5lcmFsL2xlYWQiDQoNCiMjIyMjIyMjIyMjIyAgIGNocm9tb3RlOjogT1BUSU9OICMjIyMjIw0KIyBDcmVhdGUgYSBuZXcgQ2hyb21vdGUgc2Vzc2lvbg0KIyBiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQojIGIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQoNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCg0KSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpDQpgYGAgIA0KDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgInNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuaykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIlN1YjE4X0YiLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjYpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KU3ViMThGIDwtIHNjcmFwDQpgYGAgIA0KDQojIyMgU3ViMTZfTQ0KDQpgYGB7cn0NCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00gRE9ORQ0KIyBTdWIxOE0gRE9ORQ0KIyBTdWIxOEYgRE9ORQ0KIyBTdWIxNk0NCg0KIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQojIHVybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMzAvZ2VuZXJhbC9sZWFkIg0KDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCiMgYiA8LSBDaHJvbW90ZVNlc3Npb24kbmV3KCkNCg0KIyBOYXZpZ2F0ZSB0byB0aGUgd2VicGFnZQ0KIyBiJFBhZ2UkbmF2aWdhdGUodXJsKQ0KDQojIEV4dHJhY3QgdGhlIHJlbmRlcmVkIEhUTUwNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCdkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubXgtMjpudGgtY2hpbGQoNSkiKS5jbGljaygpOycpICAjIFJlcGxhY2Ugd2l0aCB5b3VyIENTUyBzZWxlY3Rvcg0KU3lzLnNsZWVwKDEwKSANCg0KIyMjIFdBSVQgZm9yICJiYWNrc3RhZ2UiIHBhZ2UgbG9hZGluZyAjIyMjDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCIpJHJlc3VsdCR2YWx1ZQ0KIyMgDQpwYWdlIDwtIHJlYWRfaHRtbChodG1sKQ0KYGBgICANCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMjIA0KY29tcGUgPC0gcGFnZSAlPiUNCiAgaHRtbF9lbGVtZW50cygnZGl2LmdyLWV2ZW50LW5hbWUnKSAlPiUNCiAgaHRtbF90ZXh0KCkNCiMjIw0KY29tcGV0aXRvcl9kaXZzIDwtIHBhZ2UgJT4lIA0KICBodG1sX2VsZW1lbnRzKCJkaXYuYXRobGV0ZS1iYXNpYy1saW5lIikgIyANCg0KIyBFeHRyYWN0IGFuZCBjbGVhbiBkYXRhDQpzY3JhcCA8LSBjb21wZXRpdG9yX2RpdnMgJT4lDQogIG1hcF9kZih+ew0KICAgIHJhbmsgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnJhbmsiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIG5hbWUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnItbmFtZSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgc2NvcmUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIikgJT4lIGh0bWxfdGV4dCh0cmltID0gRkFMU0UpICMgc2NvcmUNCiAgICAjc2NvcmUuY2xhc2lmIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSBxdWFsaSBjZWxsIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBzY29yZQ0KICAgIHRlYW0gPC0gLnggJT4lIGh0bWxfZWxlbWVudCgic3BhbjpudGgtY2hpbGQoMikiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIFRlYW0NCiAgICANCiAgICAjIFJldHVybiBhcyBhIHRpYmJsZQ0KICAgIHRpYmJsZShOYW1lID0gbmFtZSwgDQogICAgICAgICAgIFJhbmsgPSByYW5rLCANCiAgICAgICAgICAgU2NvcmUgPSBzY29yZSwgDQogICAgICAgICAgICNDbGFzaWZpYyA9IHNjb3JlLmNsYXNpZiwNCiAgICAgICAgICAgVGVhbSA9IHRlYW0pDQogIH0pDQojIyMNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgc2VwYXJhdGUoU2NvcmUsIGludG8gPSBjKE5BLCAic2NvcmUiLCAic2NvcmUucmFuayIsIE5BKSwgc2VwID0gIiAiKQ0KI3NjcmFwIDwtIHNjcmFwICU+JSANCiAjIHNlcGFyYXRlKHNjb3JlLnJhbmssIGludG8gPSBjKE5BLE5BLCJzY29yZS5yYW5rIiksIHNlcCA9ICIoKSIpDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIG11dGF0ZShSYW5rID0gYXMubnVtZXJpYyhSYW5rKSkNCnNjcmFwJENhdGVnb3J5IDwtIHJlcCgiU3ViMTZfTSIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6NildICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpTdWIxNk0gPC0gc2NyYXANCmBgYCAgDQojIyMgU3ViMTZfRg0KDQpgYGB7cn0NCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00gRE9ORQ0KIyBTdWIxOE0gRE9ORQ0KIyBTdWIxOEYgRE9ORQ0KIyBTdWIxNk0gRE9ORQ0KIyBTdWIxNkYgDQoNCiMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KIyB1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojYiA8LSBDaHJvbW90ZVNlc3Npb24kbmV3KCkNCg0KIyBOYXZpZ2F0ZSB0byB0aGUgd2VicGFnZQ0KIyBiJFBhZ2UkbmF2aWdhdGUodXJsKQ0KDQojIEV4dHJhY3QgdGhlIHJlbmRlcmVkIEhUTUwNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCdkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubXgtMjpudGgtY2hpbGQoNikiKS5jbGljaygpOycpICAjIFJlcGxhY2Ugd2l0aCB5b3VyIENTUyBzZWxlY3Rvcg0KU3lzLnNsZWVwKDEwKSANCg0KIyMjIFdBSVQgZm9yICJiYWNrc3RhZ2UiIHBhZ2UgbG9hZGluZyAjIyMjDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCIpJHJlc3VsdCR2YWx1ZQ0KIyMgDQpwYWdlIDwtIHJlYWRfaHRtbChodG1sKQ0KYGBgICANCg0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIyMgDQpjb21wZSA8LSBwYWdlICU+JQ0KICBodG1sX2VsZW1lbnRzKCdkaXYuZ3ItZXZlbnQtbmFtZScpICU+JQ0KICBodG1sX3RleHQoKQ0KIyMjDQpjb21wZXRpdG9yX2RpdnMgPC0gcGFnZSAlPiUgDQogIGh0bWxfZWxlbWVudHMoImRpdi5hdGhsZXRlLWJhc2ljLWxpbmUiKSAjIA0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJzY29yZS5yYW5rIiwgTkEpLCBzZXAgPSAiICIpDQojc2NyYXAgPC0gc2NyYXAgJT4lIA0KICMgc2VwYXJhdGUoc2NvcmUucmFuaywgaW50byA9IGMoTkEsTkEsInNjb3JlLnJhbmsiKSwgc2VwID0gIigpIikNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgbXV0YXRlKFJhbmsgPSBhcy5udW1lcmljKFJhbmspKQ0Kc2NyYXAkQ2F0ZWdvcnkgPC0gcmVwKCJTdWIxNl9GIiwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCnNjcmFwJENvbXBldGl0aW9uIDwtIHJlcChjb21wZSwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCiMjDQpjb21wZQ0Kbi5jb21wZXRpdG9ycyA8LSBtYXgoc2NyYXAkUmFuaywgbmEucm0gPSBUUlVFKTsgbi5jb21wZXRpdG9ycw0KIyMNCiMgc2NyYXAgJT4lIHByaW50KG49bGVuZ3RoKHNjcmFwJE5hbWUpKQ0Kc2NyYXBbLGMoMTo2KV0gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkgJT4lDQogIHByaW50KG4gPSAxNykNCiMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNClN1YjE2RiA8LSBzY3JhcA0KYGBgICANCg0KIyMjIFN1YjE0X00NCg0KYGBge3J9DQojIHNjcmFwaW5nIGFjdGl2ZSBwYWdlIHVzaW5nIGNocm9tb3RlICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEFic0YgRE9uZQ0KIyBBYnNNIERPTkUNCiMgU3ViMThNIERPTkUNCiMgU3ViMThGIERPTkUNCiMgU3ViMTZNIERPTkUNCiMgU3ViMTZGIERPTkUNCiMgU3ViMTRNIA0KDQojIFVSTCBvZiB0aGUgd2VicGFnZSB0byBzY3JhcGUNCiMgdXJsIDwtICJodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby9ldmVudC8zMC9nZW5lcmFsL2xlYWQiDQoNCiMjIyMjIyMjIyMjIyAgIGNocm9tb3RlOjogT1BUSU9OICMjIyMjIw0KIyBDcmVhdGUgYSBuZXcgQ2hyb21vdGUgc2Vzc2lvbg0KIyBiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQojIGIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQoNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCg3KSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpDQpgYGAgIA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIyMgDQpjb21wZSA8LSBwYWdlICU+JQ0KICBodG1sX2VsZW1lbnRzKCdkaXYuZ3ItZXZlbnQtbmFtZScpICU+JQ0KICBodG1sX3RleHQoKQ0KIyMjDQpjb21wZXRpdG9yX2RpdnMgPC0gcGFnZSAlPiUgDQogIGh0bWxfZWxlbWVudHMoImRpdi5hdGhsZXRlLWJhc2ljLWxpbmUiKSAjIA0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgDQogICAgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJzY29yZS5yYW5rIiwgTkEpLCBzZXAgPSAiICIpDQojc2NyYXAgPC0gc2NyYXAgJT4lIA0KICMgc2VwYXJhdGUoc2NvcmUucmFuaywgaW50byA9IGMoTkEsTkEsInNjb3JlLnJhbmsiKSwgc2VwID0gIigpIikNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgbXV0YXRlKFJhbmsgPSBhcy5udW1lcmljKFJhbmspKQ0Kc2NyYXAkQ2F0ZWdvcnkgPC0gcmVwKCJTdWIxNF9NIiwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCnNjcmFwJENvbXBldGl0aW9uIDwtIHJlcChjb21wZSwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCiMjDQpjb21wZQ0Kbi5jb21wZXRpdG9ycyA8LSBtYXgoc2NyYXAkUmFuaywgbmEucm0gPSBUUlVFKTsgbi5jb21wZXRpdG9ycw0KIyMNCiMgc2NyYXAgJT4lIHByaW50KG49bGVuZ3RoKHNjcmFwJE5hbWUpKQ0Kc2NyYXBbLGMoMTo2KV0gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkgJT4lDQogIHByaW50KG4gPSAxNykNCiMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNClN1YjE0TSA8LSBzY3JhcA0KYGBgICANCg0KDQojIyMgU3ViMTRfRg0KDQoNCmBgYHtyfQ0KIyBzY3JhcGluZyBhY3RpdmUgcGFnZSB1c2luZyBjaHJvbW90ZSAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBBYnNGIERPbmUNCiMgQWJzTSBET05FDQojIFN1YjE4TSBET05FDQojIFN1YjE4RiBET05FDQojIFN1YjE2TSBET05FDQojIFN1YjE2RiBET05FDQojIFN1YjE0TSBET05FDQojIFN1YjE0RiANCg0KIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQojdXJsIDwtICJodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby9ldmVudC8zMC9nZW5lcmFsL2xlYWQiDQoNCiMjIyMjIyMjIyMjIyAgIGNocm9tb3RlOjogT1BUSU9OICMjIyMjIw0KIyBDcmVhdGUgYSBuZXcgQ2hyb21vdGUgc2Vzc2lvbg0KIyBiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQojIGIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQoNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCg4KSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpDQpgYGAgIA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIyMgDQpjb21wZSA8LSBwYWdlICU+JQ0KICBodG1sX2VsZW1lbnRzKCdkaXYuZ3ItZXZlbnQtbmFtZScpICU+JQ0KICBodG1sX3RleHQoKQ0KIyMjDQpjb21wZXRpdG9yX2RpdnMgPC0gcGFnZSAlPiUgDQogIGh0bWxfZWxlbWVudHMoImRpdi5hdGhsZXRlLWJhc2ljLWxpbmUiKSAjIA0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJzY29yZS5yYW5rIiwgTkEpLCBzZXAgPSAiICIpDQojc2NyYXAgPC0gc2NyYXAgJT4lIA0KICMgc2VwYXJhdGUoc2NvcmUucmFuaywgaW50byA9IGMoTkEsTkEsInNjb3JlLnJhbmsiKSwgc2VwID0gIigpIikNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgbXV0YXRlKFJhbmsgPSBhcy5udW1lcmljKFJhbmspKQ0Kc2NyYXAkQ2F0ZWdvcnkgPC0gcmVwKCJTdWIxNF9GIiwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCnNjcmFwJENvbXBldGl0aW9uIDwtIHJlcChjb21wZSwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCiMjDQpjb21wZQ0Kbi5jb21wZXRpdG9ycyA8LSBtYXgoc2NyYXAkUmFuaywgbmEucm0gPSBUUlVFKTsgbi5jb21wZXRpdG9ycw0KIyMNCiMgc2NyYXAgJT4lIHByaW50KG49bGVuZ3RoKHNjcmFwJE5hbWUpKQ0Kc2NyYXBbLGMoMTo2KV0gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkgJT4lDQogIHByaW50KG4gPSAxNykNCiMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNClN1YjE0RiA8LSBzY3JhcA0KYGBgICANCg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMgV3JpdGUgZ29vZ2xlIHNoZWV0ICMjIw0KRmlyc3QuTGVhZF9FU1AuMjMgPC0gcmJpbmQoQWJzX0YsIA0KICAgICAgICAgICAgIEFic19NLCANCiAgICAgICAgICAgICBTdWIxOE0sIA0KICAgICAgICAgICAgIFN1YjE4RiwNCiAgICAgICAgICAgICBTdWIxNk0sDQogICAgICAgICAgICAgU3ViMTZGLA0KICAgICAgICAgICAgIFN1YjE0TSwNCiAgICAgICAgICAgICBTdWIxNEYpDQpGaXJzdC5MZWFkX0VTUC4yMyAlPiUgcHJpbnQobj1sZW5ndGgoRmlyc3QuTGVhZF9FU1AuMjMkTmFtZSkpDQoNCm9wdGlvbnMoZ2FyZ2xlX29hdXRoX2VtYWlsID0gInZpbGxhdG9yb3BhemZqQGRhdGFhbmFseXNpc2xhYi5jb20iKQ0KZ3M0X2RlYXV0aCgpDQpnczRfYXV0aCgpDQpzaGVldF93cml0ZShkYXRhID0gRmlyc3QuTGVhZF9FU1AuMjMsDQogICAgICAgICAgICBzcz0gImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFrWFlVSDlfUVdOQmJkSWhWa2dydGhYQWcyU1VDNXA2LXJCNjUxSGx5RzZrL2VkaXQ/dXNwPXNoYXJpbmciLCANCiAgICAgICAgICAgIHNoZWV0PXBhc3RlKCJGaXJzdC5MZWFkX0VTUC4yMyIsICJfIiwgU3lzLkRhdGUoKSkpDQoNCg0KYGBgDQoNCg0KIyMgQ29wYSBFc3Bhw7FhIDIwMjMgLSAyYSBQcnVlYmEgRGlmaWN1bHRhZCAgDQoNCiMjIyBBYnNfTQ0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KdXJsIDwtICJodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby9ldmVudC8xNi9nZW5lcmFsL2xlYWQiDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCmIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQpiJFBhZ2UkbmF2aWdhdGUodXJsKQ0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDEpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkNCiMjIyANCmBgYCAgIA0KDQoNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMjIA0KY29tcGUgPC0gcGFnZSAlPiUNCiAgaHRtbF9lbGVtZW50cygnZGl2LmdyLWV2ZW50LW5hbWUnKSAlPiUNCiAgaHRtbF90ZXh0KCkNCiMjIw0KY29tcGV0aXRvcl9kaXZzIDwtIHBhZ2UgJT4lIA0KICBodG1sX2VsZW1lbnRzKCJkaXYuYXRobGV0ZS1iYXNpYy1saW5lIikgIyANCiMjIw0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJzY29yZS5yYW5rIiwgTkEpLCBzZXAgPSAiICIpDQojc2NyYXAgPC0gc2NyYXAgJT4lIA0KICMgc2VwYXJhdGUoc2NvcmUucmFuaywgaW50byA9IGMoTkEsTkEsInNjb3JlLnJhbmsiKSwgc2VwID0gIigpIikNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgbXV0YXRlKFJhbmsgPSBhcy5udW1lcmljKFJhbmspKQ0Kc2NyYXAkQ2F0ZWdvcnkgPC0gcmVwKCJBYnNfTSIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6NildICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpBYnNfTSA8LSBzY3JhcA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpgYGAgIA0KDQoNCmBgYHtyfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00NCg0KIyMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KDQojIHVybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMzAvZ2VuZXJhbC9sZWFkIg0KDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCiMgYiA8LSBDaHJvbW90ZVNlc3Npb24kbmV3KCkNCg0KIyBOYXZpZ2F0ZSB0byB0aGUgd2VicGFnZQ0KIyBiJFBhZ2UkbmF2aWdhdGUodXJsKQ0KDQojIEV4dHJhY3QgdGhlIHJlbmRlcmVkIEhUTUwNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCdkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubXgtMjpudGgtY2hpbGQoMikiKS5jbGljaygpOycpICAjIFJlcGxhY2Ugd2l0aCB5b3VyIENTUyBzZWxlY3Rvcg0KU3lzLnNsZWVwKDEwKSANCg0KIyMjIFdBSVQgZm9yICJiYWNrc3RhZ2UiIHBhZ2UgbG9hZGluZyAjIyMjDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCIpJHJlc3VsdCR2YWx1ZQ0KIyMgDQpwYWdlIDwtIHJlYWRfaHRtbChodG1sKSAgDQpgYGAgIA0KDQoNCg0KIyMjIEFic19GDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpjb21wZSA8LSBwYWdlICU+JQ0KICBodG1sX2VsZW1lbnRzKCdkaXYuZ3ItZXZlbnQtbmFtZScpICU+JQ0KICBodG1sX3RleHQoKQ0KIyMjDQpjb21wZXRpdG9yX2RpdnMgPC0gcGFnZSAlPiUgDQogIGh0bWxfZWxlbWVudHMoImRpdi5hdGhsZXRlLWJhc2ljLWxpbmUiKSANCiMjIw0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJzY29yZS5yYW5rIiwgTkEpLCBzZXAgPSAiICIpDQojc2NyYXAgPC0gc2NyYXAgJT4lIA0KICMgc2VwYXJhdGUoc2NvcmUucmFuaywgaW50byA9IGMoTkEsTkEsInNjb3JlLnJhbmsiKSwgc2VwID0gIigpIikNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgbXV0YXRlKFJhbmsgPSBhcy5udW1lcmljKFJhbmspKQ0Kc2NyYXAkQ2F0ZWdvcnkgPC0gcmVwKCJBYnNfRiIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6NildICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpBYnNfRiA8LSBzY3JhcA0KYGBgICANCg0KDQojIyMgU3ViMThfTQ0KDQpgYGB7cn0NCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00gRE9ORQ0KIyBTdWIxOE0NCg0KIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQojIHVybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMzAvZ2VuZXJhbC9sZWFkIg0KDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCiMgYiA8LSBDaHJvbW90ZVNlc3Npb24kbmV3KCkNCg0KIyBOYXZpZ2F0ZSB0byB0aGUgd2VicGFnZQ0KIyBiJFBhZ2UkbmF2aWdhdGUodXJsKQ0KDQojIEV4dHJhY3QgdGhlIHJlbmRlcmVkIEhUTUwNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCdkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubXgtMjpudGgtY2hpbGQoMykiKS5jbGljaygpOycpICAjIFJlcGxhY2Ugd2l0aCB5b3VyIENTUyBzZWxlY3Rvcg0KU3lzLnNsZWVwKDEwKSANCg0KIyMjIFdBSVQgZm9yICJiYWNrc3RhZ2UiIHBhZ2UgbG9hZGluZyAjIyMjDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCIpJHJlc3VsdCR2YWx1ZQ0KIyMgDQpwYWdlIDwtIHJlYWRfaHRtbChodG1sKQ0KYGBgICANCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMjIA0KY29tcGUgPC0gcGFnZSAlPiUNCiAgaHRtbF9lbGVtZW50cygnZGl2LmdyLWV2ZW50LW5hbWUnKSAlPiUNCiAgaHRtbF90ZXh0KCkNCiMjIw0KY29tcGV0aXRvcl9kaXZzIDwtIHBhZ2UgJT4lIA0KICBodG1sX2VsZW1lbnRzKCJkaXYuYXRobGV0ZS1iYXNpYy1saW5lIikgIyANCg0KIyBFeHRyYWN0IGFuZCBjbGVhbiBkYXRhDQpzY3JhcCA8LSBjb21wZXRpdG9yX2RpdnMgJT4lDQogIG1hcF9kZih+ew0KICAgIHJhbmsgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnJhbmsiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIG5hbWUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnItbmFtZSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgc2NvcmUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIikgJT4lIGh0bWxfdGV4dCh0cmltID0gRkFMU0UpICMgc2NvcmUNCiAgICAjc2NvcmUuY2xhc2lmIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSBxdWFsaSBjZWxsIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBzY29yZQ0KICAgIHRlYW0gPC0gLnggJT4lIGh0bWxfZWxlbWVudCgic3BhbjpudGgtY2hpbGQoMikiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIFRlYW0NCiAgICANCiAgICAjIFJldHVybiBhcyBhIHRpYmJsZQ0KICAgIHRpYmJsZShOYW1lID0gbmFtZSwgDQogICAgICAgICAgIFJhbmsgPSByYW5rLCANCiAgICAgICAgICAgU2NvcmUgPSBzY29yZSwgDQogICAgICAgICAgICNDbGFzaWZpYyA9IHNjb3JlLmNsYXNpZiwNCiAgICAgICAgICAgVGVhbSA9IHRlYW0pDQogIH0pDQojIyMNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgc2VwYXJhdGUoU2NvcmUsIGludG8gPSBjKE5BLCAic2NvcmUiLCAic2NvcmUucmFuayIsIE5BKSwgc2VwID0gIiAiKQ0KI3NjcmFwIDwtIHNjcmFwICU+JSANCiAjIHNlcGFyYXRlKHNjb3JlLnJhbmssIGludG8gPSBjKE5BLE5BLCJzY29yZS5yYW5rIiksIHNlcCA9ICIoKSIpDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIG11dGF0ZShSYW5rID0gYXMubnVtZXJpYyhSYW5rKSkNCnNjcmFwJENhdGVnb3J5IDwtIHJlcCgiU3ViMThfTSIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6NildICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpTdWIxOE0gPC0gc2NyYXANCmBgYCAgDQoNCiMjIyBTdWIxOF9GDQoNCmBgYHtyfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgQWJzRiBET05FDQojIEFic00gRE9ORQ0KIyBTdWIxOCBNIERPTkUNCiMgU3ViMTggRg0KIyBTdWIxNiBNDQojIFN1YjE2IEYNCiMgU3ViMTQgTQ0KIyBTdWIxNCBGDQoNCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00gRE9ORQ0KIyBTdWIxOE0gRE9ORQ0KIyBTdWIxOEYgDQoNCiMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KIyB1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojIGIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQoNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCiMgYiRQYWdlJG5hdmlnYXRlKHVybCkNCg0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDQpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkNCmBgYCAgDQoNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMjIA0KY29tcGUgPC0gcGFnZSAlPiUNCiAgaHRtbF9lbGVtZW50cygnZGl2LmdyLWV2ZW50LW5hbWUnKSAlPiUNCiAgaHRtbF90ZXh0KCkNCiMjIw0KY29tcGV0aXRvcl9kaXZzIDwtIHBhZ2UgJT4lIA0KICBodG1sX2VsZW1lbnRzKCJkaXYuYXRobGV0ZS1iYXNpYy1saW5lIikgIyANCg0KIyBFeHRyYWN0IGFuZCBjbGVhbiBkYXRhDQpzY3JhcCA8LSBjb21wZXRpdG9yX2RpdnMgJT4lDQogIG1hcF9kZih+ew0KICAgIHJhbmsgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnJhbmsiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIG5hbWUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnItbmFtZSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgc2NvcmUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIikgJT4lIGh0bWxfdGV4dCh0cmltID0gRkFMU0UpICMgc2NvcmUNCiAgICAjc2NvcmUuY2xhc2lmIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSBxdWFsaSBjZWxsIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBzY29yZQ0KICAgIHRlYW0gPC0gLnggJT4lIGh0bWxfZWxlbWVudCgic3BhbjpudGgtY2hpbGQoMikiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIFRlYW0NCiAgICANCiAgICAjIFJldHVybiBhcyBhIHRpYmJsZQ0KICAgIHRpYmJsZShOYW1lID0gbmFtZSwgDQogICAgICAgICAgIFJhbmsgPSByYW5rLCANCiAgICAgICAgICAgU2NvcmUgPSBzY29yZSwgDQogICAgICAgICAgICNDbGFzaWZpYyA9IHNjb3JlLmNsYXNpZiwNCiAgICAgICAgICAgVGVhbSA9IHRlYW0pDQogIH0pDQojIyMNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgc2VwYXJhdGUoU2NvcmUsIGludG8gPSBjKE5BLCAic2NvcmUiLCAic2NvcmUucmFuayIsIE5BKSwgc2VwID0gIiAiKQ0KI3NjcmFwIDwtIHNjcmFwICU+JSANCiAjIHNlcGFyYXRlKHNjb3JlLnJhbmssIGludG8gPSBjKE5BLE5BLCJzY29yZS5yYW5rIiksIHNlcCA9ICIoKSIpDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIG11dGF0ZShSYW5rID0gYXMubnVtZXJpYyhSYW5rKSkNCnNjcmFwJENhdGVnb3J5IDwtIHJlcCgiU3ViMThfRiIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6NildICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpTdWIxOEYgPC0gc2NyYXANCmBgYCAgDQoNCiMjIyBTdWIxNl9NDQoNCmBgYHtyfQ0KIyBzY3JhcGluZyBhY3RpdmUgcGFnZSB1c2luZyBjaHJvbW90ZSAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBBYnNGIERPbmUNCiMgQWJzTSBET05FDQojIFN1YjE4TSBET05FDQojIFN1YjE4RiBET05FDQojIFN1YjE2TQ0KDQojIFVSTCBvZiB0aGUgd2VicGFnZSB0byBzY3JhcGUNCiMgdXJsIDwtICJodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby9ldmVudC8zMC9nZW5lcmFsL2xlYWQiDQoNCiMjIyMjIyMjIyMjIyAgIGNocm9tb3RlOjogT1BUSU9OICMjIyMjIw0KIyBDcmVhdGUgYSBuZXcgQ2hyb21vdGUgc2Vzc2lvbg0KIyBiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQojIGIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQoNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCg1KSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpDQpgYGAgIA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIyMgDQpjb21wZSA8LSBwYWdlICU+JQ0KICBodG1sX2VsZW1lbnRzKCdkaXYuZ3ItZXZlbnQtbmFtZScpICU+JQ0KICBodG1sX3RleHQoKQ0KIyMjDQpjb21wZXRpdG9yX2RpdnMgPC0gcGFnZSAlPiUgDQogIGh0bWxfZWxlbWVudHMoImRpdi5hdGhsZXRlLWJhc2ljLWxpbmUiKSAjIA0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJzY29yZS5yYW5rIiwgTkEpLCBzZXAgPSAiICIpDQojc2NyYXAgPC0gc2NyYXAgJT4lIA0KICMgc2VwYXJhdGUoc2NvcmUucmFuaywgaW50byA9IGMoTkEsTkEsInNjb3JlLnJhbmsiKSwgc2VwID0gIigpIikNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgbXV0YXRlKFJhbmsgPSBhcy5udW1lcmljKFJhbmspKQ0Kc2NyYXAkQ2F0ZWdvcnkgPC0gcmVwKCJTdWIxNl9NIiwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCnNjcmFwJENvbXBldGl0aW9uIDwtIHJlcChjb21wZSwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCiMjDQpjb21wZQ0Kbi5jb21wZXRpdG9ycyA8LSBtYXgoc2NyYXAkUmFuaywgbmEucm0gPSBUUlVFKTsgbi5jb21wZXRpdG9ycw0KIyMNCiMgc2NyYXAgJT4lIHByaW50KG49bGVuZ3RoKHNjcmFwJE5hbWUpKQ0Kc2NyYXBbLGMoMTo2KV0gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkgJT4lDQogIHByaW50KG4gPSAxNykNCiMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNClN1YjE2TSA8LSBzY3JhcA0KYGBgICANCiMjIyBTdWIxNl9GDQoNCmBgYHtyfQ0KIyBzY3JhcGluZyBhY3RpdmUgcGFnZSB1c2luZyBjaHJvbW90ZSAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBBYnNGIERPbmUNCiMgQWJzTSBET05FDQojIFN1YjE4TSBET05FDQojIFN1YjE4RiBET05FDQojIFN1YjE2TSBET05FDQojIFN1YjE2RiANCg0KIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQojIHVybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMzAvZ2VuZXJhbC9sZWFkIg0KDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCiNiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQojIGIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQoNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCg2KSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpDQpgYGAgIA0KDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgInNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuaykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIlN1YjE2X0YiLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjYpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KU3ViMTZGIDwtIHNjcmFwDQpgYGAgIA0KDQojIyMgU3ViMTRfTQ0KDQpgYGB7cn0NCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00gRE9ORQ0KIyBTdWIxOE0gRE9ORQ0KIyBTdWIxOEYgRE9ORQ0KIyBTdWIxNk0gRE9ORQ0KIyBTdWIxNkYgRE9ORQ0KIyBTdWIxNE0gDQoNCiMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KIyB1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojIGIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQoNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCiMgYiRQYWdlJG5hdmlnYXRlKHVybCkNCg0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDcpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkNCmBgYCAgDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSANCiAgICAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgInNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuaykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIlN1YjE0X00iLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjYpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KU3ViMTRNIDwtIHNjcmFwDQpgYGAgIA0KDQoNCiMjIyBTdWIxNF9GDQoNCg0KYGBge3J9DQojIHNjcmFwaW5nIGFjdGl2ZSBwYWdlIHVzaW5nIGNocm9tb3RlICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEFic0YgRE9uZQ0KIyBBYnNNIERPTkUNCiMgU3ViMThNIERPTkUNCiMgU3ViMThGIERPTkUNCiMgU3ViMTZNIERPTkUNCiMgU3ViMTZGIERPTkUNCiMgU3ViMTRNIERPTkUNCiMgU3ViMTRGIA0KDQojIFVSTCBvZiB0aGUgd2VicGFnZSB0byBzY3JhcGUNCiN1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojIGIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQoNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCiMgYiRQYWdlJG5hdmlnYXRlKHVybCkNCg0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDgpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkNCmBgYCAgDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgInNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuaykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIlN1YjE0X0YiLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjYpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KU3ViMTRGIDwtIHNjcmFwDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIFdyaXRlIGdvb2dsZSBzaGVldCAjIyMNClNlY29uZC5MZWFkX0VTUC4yMyA8LSByYmluZChBYnNfRiwgDQogICAgICAgICAgICAgQWJzX00sIA0KICAgICAgICAgICAgIFN1YjE4TSwgDQogICAgICAgICAgICAgU3ViMThGLA0KICAgICAgICAgICAgIFN1YjE2TSwNCiAgICAgICAgICAgICBTdWIxNkYsDQogICAgICAgICAgICAgU3ViMTRNLA0KICAgICAgICAgICAgIFN1YjE0RikNClNlY29uZC5MZWFkX0VTUC4yMyAlPiUgcHJpbnQobj1sZW5ndGgoRmlyc3QuTGVhZF9FU1AuMjMkTmFtZSkpDQoNCm9wdGlvbnMoZ2FyZ2xlX29hdXRoX2VtYWlsID0gInZpbGxhdG9yb3BhemZqQGRhdGFhbmFseXNpc2xhYi5jb20iKQ0KZ3M0X2RlYXV0aCgpDQpnczRfYXV0aCgpDQpzaGVldF93cml0ZShkYXRhID0gU2Vjb25kLkxlYWRfRVNQLjIzLA0KICAgICAgICAgICAgc3M9ICJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xa1hZVUg5X1FXTkJiZEloVmtncnRoWEFnMlNVQzVwNi1yQjY1MUhseUc2ay9lZGl0P3VzcD1zaGFyaW5nIiwgDQogICAgICAgICAgICBzaGVldD1wYXN0ZSgiU2Vjb25kLkxlYWRfRVNQLjIzIiwgIl8iLCBTeXMuRGF0ZSgpKSkNCg0KDQpgYGANCg0KDQojIyBDb3BhIEVzcGHDsWEgMjAyMyAtIDNhIFBydWViYSBEaWZpY3VsdGFkDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBzY3JhcGluZyBhY3RpdmUgcGFnZSB1c2luZyBjaHJvbW90ZSAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQp1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzE3L2dlbmVyYWwvbGVhZCINCiMjIyMjIyMjIyMjIyAgIGNocm9tb3RlOjogT1BUSU9OICMjIyMjIw0KIyBDcmVhdGUgYSBuZXcgQ2hyb21vdGUgc2Vzc2lvbg0KYiA8LSBDaHJvbW90ZVNlc3Npb24kbmV3KCkNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCmIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQojIEV4dHJhY3QgdGhlIHJlbmRlcmVkIEhUTUwNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCdkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubXgtMjpudGgtY2hpbGQoMSkiKS5jbGljaygpOycpICAjIFJlcGxhY2Ugd2l0aCB5b3VyIENTUyBzZWxlY3Rvcg0KU3lzLnNsZWVwKDEwKSANCg0KIyMjIFdBSVQgZm9yICJiYWNrc3RhZ2UiIHBhZ2UgbG9hZGluZyAjIyMjDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCIpJHJlc3VsdCR2YWx1ZQ0KIyMgDQpwYWdlIDwtIHJlYWRfaHRtbChodG1sKQ0KIyMjIA0KYGBgICANCg0KIyMjIEFic19NDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQojIyMNCg0KIyBFeHRyYWN0IGFuZCBjbGVhbiBkYXRhDQpzY3JhcCA8LSBjb21wZXRpdG9yX2RpdnMgJT4lDQogIG1hcF9kZih+ew0KICAgIHJhbmsgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnJhbmsiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIG5hbWUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnItbmFtZSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgc2NvcmUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIikgJT4lIGh0bWxfdGV4dCh0cmltID0gRkFMU0UpICMgc2NvcmUNCiAgICAjc2NvcmUuY2xhc2lmIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSBxdWFsaSBjZWxsIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBzY29yZQ0KICAgIHRlYW0gPC0gLnggJT4lIGh0bWxfZWxlbWVudCgic3BhbjpudGgtY2hpbGQoMikiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIFRlYW0NCiAgICANCiAgICAjIFJldHVybiBhcyBhIHRpYmJsZQ0KICAgIHRpYmJsZShOYW1lID0gbmFtZSwgDQogICAgICAgICAgIFJhbmsgPSByYW5rLCANCiAgICAgICAgICAgU2NvcmUgPSBzY29yZSwgDQogICAgICAgICAgICNDbGFzaWZpYyA9IHNjb3JlLmNsYXNpZiwNCiAgICAgICAgICAgVGVhbSA9IHRlYW0pDQogIH0pDQojIyMNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgc2VwYXJhdGUoU2NvcmUsIGludG8gPSBjKE5BLCAic2NvcmUiLCAic2NvcmUucmFuayIsIE5BKSwgc2VwID0gIiAiKQ0KI3NjcmFwIDwtIHNjcmFwICU+JSANCiAjIHNlcGFyYXRlKHNjb3JlLnJhbmssIGludG8gPSBjKE5BLE5BLCJzY29yZS5yYW5rIiksIHNlcCA9ICIoKSIpDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIG11dGF0ZShSYW5rID0gYXMubnVtZXJpYyhSYW5rKSkNCnNjcmFwJENhdGVnb3J5IDwtIHJlcCgiQWJzX00iLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjYpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KQWJzX00gPC0gc2NyYXANCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KYGBgICANCg0KDQpgYGB7cn0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIHNjcmFwaW5nIGFjdGl2ZSBwYWdlIHVzaW5nIGNocm9tb3RlICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEFic0YgRE9uZQ0KIyBBYnNNDQoNCiMjIFVSTCBvZiB0aGUgd2VicGFnZSB0byBzY3JhcGUNCg0KIyB1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojIGIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQoNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCiMgYiRQYWdlJG5hdmlnYXRlKHVybCkNCg0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDIpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkgIA0KYGBgICANCg0KDQojIyMgQWJzX0YNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpIA0KIyMjDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgInNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuaykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIkFic19GIiwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCnNjcmFwJENvbXBldGl0aW9uIDwtIHJlcChjb21wZSwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCiMjDQpjb21wZQ0Kbi5jb21wZXRpdG9ycyA8LSBtYXgoc2NyYXAkUmFuaywgbmEucm0gPSBUUlVFKTsgbi5jb21wZXRpdG9ycw0KIyMNCiMgc2NyYXAgJT4lIHByaW50KG49bGVuZ3RoKHNjcmFwJE5hbWUpKQ0Kc2NyYXBbLGMoMTo2KV0gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkgJT4lDQogIHByaW50KG4gPSAxNykNCiMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNCkFic19GIDwtIHNjcmFwDQpgYGAgIA0KDQoNCg0KDQojIyMgU3ViMThfTQ0KDQpgYGB7cn0NCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00gRE9ORQ0KIyBTdWIxOE0NCg0KIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQojIHVybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMzAvZ2VuZXJhbC9sZWFkIg0KDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCiMgYiA8LSBDaHJvbW90ZVNlc3Npb24kbmV3KCkNCg0KIyBOYXZpZ2F0ZSB0byB0aGUgd2VicGFnZQ0KIyBiJFBhZ2UkbmF2aWdhdGUodXJsKQ0KDQojIEV4dHJhY3QgdGhlIHJlbmRlcmVkIEhUTUwNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCdkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubXgtMjpudGgtY2hpbGQoMykiKS5jbGljaygpOycpICAjIFJlcGxhY2Ugd2l0aCB5b3VyIENTUyBzZWxlY3Rvcg0KU3lzLnNsZWVwKDEwKSANCg0KIyMjIFdBSVQgZm9yICJiYWNrc3RhZ2UiIHBhZ2UgbG9hZGluZyAjIyMjDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCIpJHJlc3VsdCR2YWx1ZQ0KIyMgDQpwYWdlIDwtIHJlYWRfaHRtbChodG1sKQ0KYGBgICANCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMjIA0KY29tcGUgPC0gcGFnZSAlPiUNCiAgaHRtbF9lbGVtZW50cygnZGl2LmdyLWV2ZW50LW5hbWUnKSAlPiUNCiAgaHRtbF90ZXh0KCkNCiMjIw0KY29tcGV0aXRvcl9kaXZzIDwtIHBhZ2UgJT4lIA0KICBodG1sX2VsZW1lbnRzKCJkaXYuYXRobGV0ZS1iYXNpYy1saW5lIikgIyANCg0KIyBFeHRyYWN0IGFuZCBjbGVhbiBkYXRhDQpzY3JhcCA8LSBjb21wZXRpdG9yX2RpdnMgJT4lDQogIG1hcF9kZih+ew0KICAgIHJhbmsgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnJhbmsiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIG5hbWUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnItbmFtZSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgc2NvcmUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIikgJT4lIGh0bWxfdGV4dCh0cmltID0gRkFMU0UpICMgc2NvcmUNCiAgICAjc2NvcmUuY2xhc2lmIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSBxdWFsaSBjZWxsIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBzY29yZQ0KICAgIHRlYW0gPC0gLnggJT4lIGh0bWxfZWxlbWVudCgic3BhbjpudGgtY2hpbGQoMikiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIFRlYW0NCiAgICANCiAgICAjIFJldHVybiBhcyBhIHRpYmJsZQ0KICAgIHRpYmJsZShOYW1lID0gbmFtZSwgDQogICAgICAgICAgIFJhbmsgPSByYW5rLCANCiAgICAgICAgICAgU2NvcmUgPSBzY29yZSwgDQogICAgICAgICAgICNDbGFzaWZpYyA9IHNjb3JlLmNsYXNpZiwNCiAgICAgICAgICAgVGVhbSA9IHRlYW0pDQogIH0pDQojIyMNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgc2VwYXJhdGUoU2NvcmUsIGludG8gPSBjKE5BLCAic2NvcmUiLCAic2NvcmUucmFuayIsIE5BKSwgc2VwID0gIiAiKQ0KI3NjcmFwIDwtIHNjcmFwICU+JSANCiAjIHNlcGFyYXRlKHNjb3JlLnJhbmssIGludG8gPSBjKE5BLE5BLCJzY29yZS5yYW5rIiksIHNlcCA9ICIoKSIpDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIG11dGF0ZShSYW5rID0gYXMubnVtZXJpYyhSYW5rKSkNCnNjcmFwJENhdGVnb3J5IDwtIHJlcCgiU3ViMThfTSIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6NildICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpTdWIxOE0gPC0gc2NyYXANCmBgYCAgDQoNCiMjIyBTdWIxOF9GDQoNCmBgYHtyfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgQWJzRiBET05FDQojIEFic00gRE9ORQ0KIyBTdWIxOCBNIERPTkUNCiMgU3ViMTggRg0KIyBTdWIxNiBNDQojIFN1YjE2IEYNCiMgU3ViMTQgTQ0KIyBTdWIxNCBGDQoNCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00gRE9ORQ0KIyBTdWIxOE0gRE9ORQ0KIyBTdWIxOEYgDQoNCiMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KIyB1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojIGIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQoNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCiMgYiRQYWdlJG5hdmlnYXRlKHVybCkNCg0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDQpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkNCmBgYCAgDQoNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMjIA0KY29tcGUgPC0gcGFnZSAlPiUNCiAgaHRtbF9lbGVtZW50cygnZGl2LmdyLWV2ZW50LW5hbWUnKSAlPiUNCiAgaHRtbF90ZXh0KCkNCiMjIw0KY29tcGV0aXRvcl9kaXZzIDwtIHBhZ2UgJT4lIA0KICBodG1sX2VsZW1lbnRzKCJkaXYuYXRobGV0ZS1iYXNpYy1saW5lIikgIyANCg0KIyBFeHRyYWN0IGFuZCBjbGVhbiBkYXRhDQpzY3JhcCA8LSBjb21wZXRpdG9yX2RpdnMgJT4lDQogIG1hcF9kZih+ew0KICAgIHJhbmsgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnJhbmsiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIG5hbWUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnItbmFtZSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgc2NvcmUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIikgJT4lIGh0bWxfdGV4dCh0cmltID0gRkFMU0UpICMgc2NvcmUNCiAgICAjc2NvcmUuY2xhc2lmIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSBxdWFsaSBjZWxsIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBzY29yZQ0KICAgIHRlYW0gPC0gLnggJT4lIGh0bWxfZWxlbWVudCgic3BhbjpudGgtY2hpbGQoMikiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIFRlYW0NCiAgICANCiAgICAjIFJldHVybiBhcyBhIHRpYmJsZQ0KICAgIHRpYmJsZShOYW1lID0gbmFtZSwgDQogICAgICAgICAgIFJhbmsgPSByYW5rLCANCiAgICAgICAgICAgU2NvcmUgPSBzY29yZSwgDQogICAgICAgICAgICNDbGFzaWZpYyA9IHNjb3JlLmNsYXNpZiwNCiAgICAgICAgICAgVGVhbSA9IHRlYW0pDQogIH0pDQojIyMNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgc2VwYXJhdGUoU2NvcmUsIGludG8gPSBjKE5BLCAic2NvcmUiLCAic2NvcmUucmFuayIsIE5BKSwgc2VwID0gIiAiKQ0KI3NjcmFwIDwtIHNjcmFwICU+JSANCiAjIHNlcGFyYXRlKHNjb3JlLnJhbmssIGludG8gPSBjKE5BLE5BLCJzY29yZS5yYW5rIiksIHNlcCA9ICIoKSIpDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIG11dGF0ZShSYW5rID0gYXMubnVtZXJpYyhSYW5rKSkNCnNjcmFwJENhdGVnb3J5IDwtIHJlcCgiU3ViMThfRiIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6NildICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpTdWIxOEYgPC0gc2NyYXANCmBgYCAgDQojIyMgU3ViMTZfTQ0KDQpgYGB7cn0NCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00gRE9ORQ0KIyBTdWIxOE0gRE9ORQ0KIyBTdWIxOEYgRE9ORQ0KIyBTdWIxNk0NCg0KIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQojIHVybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMzAvZ2VuZXJhbC9sZWFkIg0KDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCiMgYiA8LSBDaHJvbW90ZVNlc3Npb24kbmV3KCkNCg0KIyBOYXZpZ2F0ZSB0byB0aGUgd2VicGFnZQ0KIyBiJFBhZ2UkbmF2aWdhdGUodXJsKQ0KDQojIEV4dHJhY3QgdGhlIHJlbmRlcmVkIEhUTUwNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCdkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubXgtMjpudGgtY2hpbGQoNSkiKS5jbGljaygpOycpICAjIFJlcGxhY2Ugd2l0aCB5b3VyIENTUyBzZWxlY3Rvcg0KU3lzLnNsZWVwKDEwKSANCg0KIyMjIFdBSVQgZm9yICJiYWNrc3RhZ2UiIHBhZ2UgbG9hZGluZyAjIyMjDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCIpJHJlc3VsdCR2YWx1ZQ0KIyMgDQpwYWdlIDwtIHJlYWRfaHRtbChodG1sKQ0KYGBgICANCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMjIA0KY29tcGUgPC0gcGFnZSAlPiUNCiAgaHRtbF9lbGVtZW50cygnZGl2LmdyLWV2ZW50LW5hbWUnKSAlPiUNCiAgaHRtbF90ZXh0KCkNCiMjIw0KY29tcGV0aXRvcl9kaXZzIDwtIHBhZ2UgJT4lIA0KICBodG1sX2VsZW1lbnRzKCJkaXYuYXRobGV0ZS1iYXNpYy1saW5lIikgIyANCg0KIyBFeHRyYWN0IGFuZCBjbGVhbiBkYXRhDQpzY3JhcCA8LSBjb21wZXRpdG9yX2RpdnMgJT4lDQogIG1hcF9kZih+ew0KICAgIHJhbmsgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnJhbmsiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIG5hbWUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnItbmFtZSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgc2NvcmUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIikgJT4lIGh0bWxfdGV4dCh0cmltID0gRkFMU0UpICMgc2NvcmUNCiAgICAjc2NvcmUuY2xhc2lmIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSBxdWFsaSBjZWxsIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBzY29yZQ0KICAgIHRlYW0gPC0gLnggJT4lIGh0bWxfZWxlbWVudCgic3BhbjpudGgtY2hpbGQoMikiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIFRlYW0NCiAgICANCiAgICAjIFJldHVybiBhcyBhIHRpYmJsZQ0KICAgIHRpYmJsZShOYW1lID0gbmFtZSwgDQogICAgICAgICAgIFJhbmsgPSByYW5rLCANCiAgICAgICAgICAgU2NvcmUgPSBzY29yZSwgDQogICAgICAgICAgICNDbGFzaWZpYyA9IHNjb3JlLmNsYXNpZiwNCiAgICAgICAgICAgVGVhbSA9IHRlYW0pDQogIH0pDQojIyMNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgc2VwYXJhdGUoU2NvcmUsIGludG8gPSBjKE5BLCAic2NvcmUiLCAic2NvcmUucmFuayIsIE5BKSwgc2VwID0gIiAiKQ0KI3NjcmFwIDwtIHNjcmFwICU+JSANCiAjIHNlcGFyYXRlKHNjb3JlLnJhbmssIGludG8gPSBjKE5BLE5BLCJzY29yZS5yYW5rIiksIHNlcCA9ICIoKSIpDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIG11dGF0ZShSYW5rID0gYXMubnVtZXJpYyhSYW5rKSkNCnNjcmFwJENhdGVnb3J5IDwtIHJlcCgiU3ViMTZfTSIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6NildICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpTdWIxNk0gPC0gc2NyYXANCmBgYCAgDQoNCiMjIyBTdWIxNl9GDQoNCmBgYHtyfQ0KIyBzY3JhcGluZyBhY3RpdmUgcGFnZSB1c2luZyBjaHJvbW90ZSAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBBYnNGIERPbmUNCiMgQWJzTSBET05FDQojIFN1YjE4TSBET05FDQojIFN1YjE4RiBET05FDQojIFN1YjE2TSBET05FDQojIFN1YjE2RiANCg0KIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQojIHVybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMzAvZ2VuZXJhbC9sZWFkIg0KDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCiNiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQojIGIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQoNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCg2KSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpDQpgYGAgIA0KDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgInNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuaykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIlN1YjE2X0YiLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjYpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KU3ViMTZGIDwtIHNjcmFwDQpgYGAgIA0KDQojIyMgU3ViMTRfTQ0KDQpgYGB7cn0NCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00gRE9ORQ0KIyBTdWIxOE0gRE9ORQ0KIyBTdWIxOEYgRE9ORQ0KIyBTdWIxNk0gRE9ORQ0KIyBTdWIxNkYgRE9ORQ0KIyBTdWIxNE0gDQoNCiMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KIyB1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojIGIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQoNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCiMgYiRQYWdlJG5hdmlnYXRlKHVybCkNCg0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDcpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkNCmBgYCAgDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSANCiAgICAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgInNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuaykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIlN1YjE0X00iLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjYpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KU3ViMTRNIDwtIHNjcmFwDQpgYGAgIA0KDQoNCiMjIyBTdWIxNF9GDQoNCg0KYGBge3J9DQojIHNjcmFwaW5nIGFjdGl2ZSBwYWdlIHVzaW5nIGNocm9tb3RlICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEFic0YgRE9uZQ0KIyBBYnNNIERPTkUNCiMgU3ViMThNIERPTkUNCiMgU3ViMThGIERPTkUNCiMgU3ViMTZNIERPTkUNCiMgU3ViMTZGIERPTkUNCiMgU3ViMTRNIERPTkUNCiMgU3ViMTRGIA0KDQojIFVSTCBvZiB0aGUgd2VicGFnZSB0byBzY3JhcGUNCiN1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojIGIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQoNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCiMgYiRQYWdlJG5hdmlnYXRlKHVybCkNCg0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDgpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkNCmBgYCAgDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgInNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuaykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIlN1YjE0X0YiLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjYpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KU3ViMTRGIDwtIHNjcmFwDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIFdyaXRlIGdvb2dsZSBzaGVldCAjIyMNClRoaXJkLkxlYWRfRVNQLjIzIDwtIHJiaW5kKEFic19GLCANCiAgICAgICAgICAgICBBYnNfTSwgDQogICAgICAgICAgICAgU3ViMThNLCANCiAgICAgICAgICAgICBTdWIxOEYsDQogICAgICAgICAgICAgU3ViMTZNLA0KICAgICAgICAgICAgIFN1YjE2RiwNCiAgICAgICAgICAgICBTdWIxNE0sDQogICAgICAgICAgICAgU3ViMTRGKQ0KVGhpcmQuTGVhZF9FU1AuMjMgJT4lIHByaW50KG49bGVuZ3RoKEZpcnN0LkxlYWRfRVNQLjIzJE5hbWUpKQ0KDQpvcHRpb25zKGdhcmdsZV9vYXV0aF9lbWFpbCA9ICJ2aWxsYXRvcm9wYXpmakBkYXRhYW5hbHlzaXNsYWIuY29tIikNCmdzNF9kZWF1dGgoKQ0KZ3M0X2F1dGgoKQ0Kc2hlZXRfd3JpdGUoZGF0YSA9IFRoaXJkLkxlYWRfRVNQLjIzLA0KICAgICAgICAgICAgc3M9ICJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xa1hZVUg5X1FXTkJiZEloVmtncnRoWEFnMlNVQzVwNi1yQjY1MUhseUc2ay9lZGl0P3VzcD1zaGFyaW5nIiwgDQogICAgICAgICAgICBzaGVldD1wYXN0ZSgiVGhpcmQuTGVhZF9FU1AuMjMiLCAiXyIsIFN5cy5EYXRlKCkpKQ0KDQoNCmBgYA0KDQoNCg0KDQojIyMgQ29uc29saWRhZG8gZW4gbGEgW0hvamEgR29vZ2xlXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xa1hZVUg5X1FXTkJiZEloVmtncnRoWEFnMlNVQzVwNi1yQjY1MUhseUc2ay9lZGl0P3VzcD1zaGFyaW5nKQ0KDQo=