﻿{"id":161,"date":"2026-10-06T14:16:29","date_gmt":"2026-10-06T14:16:29","guid":{"rendered":"https:\/\/catventures.lol\/?page_id=161"},"modified":"2026-10-06T14:16:29","modified_gmt":"2026-10-06T14:16:29","slug":"kaiju-kitties","status":"publish","type":"page","link":"https:\/\/catventures.lol\/?page_id=161","title":{"rendered":"Kaiju Kitties"},"content":{"rendered":"\n<style>\n#kk-app, #kk-app * { box-sizing: border-box; }\n#kk-app { position: relative; width: 100%; max-width: 100%; margin: 0 auto; background: #0d0a10; color: #fff4e0; font-family: \"Trebuchet MS\", \"Segoe UI\", sans-serif; display: flex; flex-direction: column; align-items: center; justify-content: center; overflow: hidden; touch-action: none; user-select: none; -webkit-user-select: none; -webkit-touch-callout: none; -webkit-tap-highlight-color: transparent; border-radius: 10px; }\n#kk-stage { position: relative; width: 100%; line-height: 0; touch-action: none; margin: 0 auto; }\n#kk-game { display: block; width: min(100%, calc((100vh - 60px) * 16 \/ 9)); height: auto; aspect-ratio: 16 \/ 9; margin: 0 auto; background: #1a1220; touch-action: none; }\n#kk-app:fullscreen { width: 100vw; height: 100vh; max-width: none; border-radius: 0; background: #000; }\n#kk-app:-webkit-full-screen { width: 100vw; height: 100vh; max-width: none; border-radius: 0; background: #000; }\n#kk-app.kk-fallback { position: fixed; left: 0; top: 0; width: 100vw; height: 100vh; width: 100dvw; height: 100dvh; max-width: none; margin: 0; z-index: 2147483000; border-radius: 0; background: #000; }\n#kk-app.kk-mobile #kk-stage, #kk-app.kk-fallback #kk-stage, #kk-app:fullscreen #kk-stage { flex: 0 0 auto; }\n#kk-app.kk-mobile #kk-game, #kk-app.kk-fallback #kk-game, #kk-app:fullscreen #kk-game { aspect-ratio: auto; max-width: none; }\nhtml.kk-noscroll, body.kk-noscroll { overflow: hidden !important; overscroll-behavior: none; touch-action: none; }\n#kk-overlay { position: absolute; left: 0; top: 0; right: 0; bottom: 0; display: flex; align-items: center; justify-content: center; background: rgba(12, 8, 14, 0.55); padding: 10px; line-height: 1.3; z-index: 6; }\n#kk-overlay[hidden] { display: none !important; }\n.kk-card { width: min(560px, 100%); max-height: 100%; overflow: auto; background: rgba(34, 22, 30, 0.94); border: 2px solid #e07a32; border-radius: 16px; padding: 12px 16px 14px; text-align: center; box-shadow: 0 18px 50px rgba(0,0,0,0.5); }\n.kk-card[hidden] { display: none !important; }\n.kk-card h2 { font-family: Impact, \"Arial Black\", sans-serif; letter-spacing: 1px; font-size: 30px; line-height: 1.1; margin: 4px 0 8px; color: #ffb35c; text-transform: uppercase; }\n.kk-cover { display: block; width: min(300px, 70%); height: auto; margin: 0 auto 8px; border-radius: 10px; box-shadow: 0 8px 24px rgba(0,0,0,0.45); }\n.kk-txt { font-size: 14px; margin: 0 0 8px; color: #f3dcc4; }\n.kk-keys { font-size: 12.5px; margin: 0 0 10px; color: #d8bfa8; }\n.kk-keys b { color: #ffd9a0; }\n.kk-go { display: inline-block; background: #e0622a; color: #fff; border: 0; border-radius: 999px; padding: 11px 34px; font: 800 18px \"Arial Black\", Impact, sans-serif; letter-spacing: 1px; cursor: pointer; margin: 2px 4px; }\n.kk-go:hover { background: #f07a3a; }\n.kk-go:disabled { opacity: 0.6; cursor: wait; }\n.kk-small { display: inline-block; background: transparent; color: #f3dcc4; border: 1px solid rgba(255,220,180,0.5); border-radius: 999px; padding: 6px 14px; font: 700 13px \"Trebuchet MS\", sans-serif; cursor: pointer; margin: 6px 4px 0; }\n#kk-load-err { color: #ff8a8a; font-size: 12px; min-height: 0; margin: 4px 0 0; }\n#kk-exit, #kk-pausebtn { position: fixed; z-index: 2147483100; width: 40px; height: 40px; border-radius: 50%; border: 2px solid rgba(255,240,220,0.6); background: rgba(30, 18, 14, 0.8); color: #fff4e0; font: 800 16px \"Arial Black\", sans-serif; line-height: 1; padding: 0; cursor: pointer; touch-action: manipulation; }\n#kk-exit[hidden], #kk-pausebtn[hidden] { display: none !important; }\n#kk-rotate { position: fixed; left: 0; top: 0; right: 0; bottom: 0; z-index: 2147483200; background: rgba(8, 6, 10, 0.94); display: flex; align-items: center; justify-content: center; text-align: center; padding: 24px; line-height: 1.4; }\n#kk-rotate[hidden] { display: none !important; }\n#kk-rotate .kk-rot-icon { font: 800 46px \"Arial Black\", sans-serif; margin-bottom: 10px; color: #ffb35c; }\n#kk-touch { position: absolute; left: 0; top: 0; right: 0; bottom: 0; z-index: 5; pointer-events: none; line-height: 1; }\n#kk-touch[hidden] { display: none !important; }\n#kk-stickzone { position: absolute; left: 0; bottom: 0; width: 40%; height: 72%; pointer-events: auto; touch-action: none; }\n#kk-stickbase { position: absolute; left: 18%; top: 68%; width: 110px; height: 110px; margin: 0; transform: translate(-50%, -50%); border-radius: 50%; background: rgba(255, 240, 220, 0.10); border: 2px solid rgba(255, 240, 220, 0.35); pointer-events: none; }\n#kk-stickbase.kk-active { background: rgba(255, 240, 220, 0.18); border-color: rgba(255, 220, 170, 0.7); }\n#kk-stickknob { position: absolute; left: 50%; top: 50%; width: 46px; height: 46px; transform: translate(-50%, -50%); border-radius: 50%; background: rgba(255, 230, 200, 0.55); border: 2px solid rgba(255, 250, 240, 0.8); }\n.kk-btn { position: absolute; border-radius: 50%; pointer-events: auto; touch-action: none; background: rgba(24, 14, 12, 0.40); border: 2px solid rgba(255, 240, 220, 0.6); color: #fff6ea; font: 800 12px \"Arial Black\", Impact, sans-serif; letter-spacing: 0.5px; padding: 0; text-shadow: 0 1px 2px #000; cursor: pointer; }\n.kk-btn.kk-press { background: rgba(255, 170, 80, 0.6); }\n#kk-b-swipe { font-size: 15px; background: rgba(200, 80, 40, 0.42); }\n#kk-b-special { display: none; background: rgba(255, 200, 40, 0.55); border-color: #fff2a0; }\n#kk-b-special.kk-ready { display: block; animation: kkglow 0.7s ease-in-out infinite alternate; }\n@keyframes kkglow { from { box-shadow: 0 0 6px 2px rgba(255, 210, 60, 0.6); } to { box-shadow: 0 0 22px 8px rgba(255, 210, 60, 0.95); } }\n<\/style>\n<div id=\"kk-app\">\n<button type=\"button\" id=\"kk-exit\" hidden aria-label=\"Exit full screen\">X<\/button>\n<button type=\"button\" id=\"kk-pausebtn\" hidden aria-label=\"Pause\">II<\/button>\n<div id=\"kk-rotate\" hidden><div><div class=\"kk-rot-icon\">&#8635;<\/div><div style=\"font:800 22px Arial Black,sans-serif;margin-bottom:6px\">Turn your phone sideways<\/div><div style=\"font:14px Trebuchet MS,sans-serif;color:#d8bfa8\">Kaiju Kitties plays in landscape.<\/div><\/div><\/div>\n<div id=\"kk-stage\">\n<canvas id=\"kk-game\" width=\"1280\" height=\"720\" tabindex=\"0\" aria-label=\"Kaiju Kitties game\"><\/canvas>\n<div id=\"kk-touch\" hidden>\n<div id=\"kk-stickzone\"><div id=\"kk-stickbase\"><div id=\"kk-stickknob\"><\/div><\/div><\/div>\n<button type=\"button\" class=\"kk-btn\" id=\"kk-b-swipe\" tabindex=\"-1\">SWIPE<\/button>\n<button type=\"button\" class=\"kk-btn\" id=\"kk-b-heavy\" tabindex=\"-1\">HEAVY<\/button>\n<button type=\"button\" class=\"kk-btn\" id=\"kk-b-roar\" tabindex=\"-1\">ROAR<\/button>\n<button type=\"button\" class=\"kk-btn\" id=\"kk-b-special\" tabindex=\"-1\">SLAM<\/button>\n<button type=\"button\" class=\"kk-btn\" id=\"kk-b-tail\" tabindex=\"-1\">TAIL<\/button>\n<\/div>\n<div id=\"kk-overlay\">\n<div class=\"kk-card\" id=\"kk-title\">\n<img loading=\"lazy\" decoding=\"async\" class=\"kk-cover\" src=\"https:\/\/catventures.lol\/wp-content\/uploads\/2026\/10\/kk_cover.jpg\" alt=\"Kaiju Kitties: a giant tabby cat swatting helicopters over a city\" width=\"960\" height=\"540\">\n<h2>Kaiju Kitties<\/h2>\n<div class=\"kk-txt\">You are a house cat the size of a skyscraper. Stomp through downtown, swat helicopters out of the sky, flatten tanks, and level the city. At the end of the district a rival giant cat is waiting.<\/div>\n<div class=\"kk-keys\"><b>Keyboard:<\/b> A\/D or arrows move, Space jump, J paw swipe (press 3 times for a combo), K heavy strike, L tail sweep, R roar, U special slam, Esc pause. You can also click a target to swipe at it.<\/div>\n<div class=\"kk-keys\"><b>Phone:<\/b> thumb stick moves (push up to jump), tap a helicopter or tank to swat it, or use the Swipe, Heavy and Roar buttons.<\/div>\n<button type=\"button\" class=\"kk-go\" id=\"kk-start\" disabled>Loading<\/button>\n<div><button type=\"button\" class=\"kk-small\" id=\"kk-sound\">Sound: on<\/button><\/div>\n<div id=\"kk-load-err\"><\/div>\n<\/div>\n<div class=\"kk-card\" id=\"kk-pause\" hidden>\n<h2>Paused<\/h2>\n<button type=\"button\" class=\"kk-go\" id=\"kk-resume\">Resume<\/button>\n<button type=\"button\" class=\"kk-go\" id=\"kk-restart\">Restart<\/button>\n<\/div>\n<div class=\"kk-card\" id=\"kk-end\" hidden>\n<h2 id=\"kk-end-title\">Game over<\/h2>\n<div class=\"kk-txt\" id=\"kk-end-msg\"><\/div>\n<button type=\"button\" class=\"kk-go\" id=\"kk-again\">Play again<\/button>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<script>\n(function () {\n  var el = document.createElement(\"script\");\n  el.text = atob(\"d2luZG93LktBSUpVX0FTU0VUUyA9IHsKICBjb3ZlcjogImh0dHBzOi8vY2F0dmVudHVyZXMubG9sL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzEwL2trX2NvdmVyLmpwZyIsCiAgc3ByaXRlczogeyJjYXRfaWRsZSI6ICJodHRwczovL2NhdHZlbnR1cmVzLmxvbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9ra19jYXRfaWRsZS5wbmciLCAiY2F0X3N3aXBlIjogImh0dHBzOi8vY2F0dmVudHVyZXMubG9sL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzEwL2trX2NhdF9zd2lwZS5wbmciLCAiaGVsaTEiOiAiaHR0cHM6Ly9jYXR2ZW50dXJlcy5sb2wvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMTAva2tfaGVsaTEucG5nIiwgImhlbGkyIjogImh0dHBzOi8vY2F0dmVudHVyZXMubG9sL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzEwL2trX2hlbGkyLnBuZyIsICJibGRfb2ZmaWNlIjogImh0dHBzOi8vY2F0dmVudHVyZXMubG9sL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzEwL2trX2JsZF9vZmZpY2UucG5nIiwgImJsZF9nbGFzcyI6ICJodHRwczovL2NhdHZlbnR1cmVzLmxvbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9ra19ibGRfZ2xhc3MucG5nIiwgImJsZF9icmljayI6ICJodHRwczovL2NhdHZlbnR1cmVzLmxvbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9ra19ibGRfYnJpY2sucG5nIiwgImJsZF9ydWluIjogImh0dHBzOi8vY2F0dmVudHVyZXMubG9sL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzEwL2trX2JsZF9ydWluLnBuZyJ9Cn07CihmdW5jdGlvbiAoKSB7CiAgInVzZSBzdHJpY3QiOwogIHZhciBBU1NFVFMgPSB3aW5kb3cuS0FJSlVfQVNTRVRTIHx8IHsgc3ByaXRlczoge30gfTsKICB2YXIgVyA9IDEyODAsIEggPSA3MjA7CiAgdmFyIEZFRVQgPSA2OTgsIFNUUkVFVCA9IDYwNCwgV09STEQgPSA5NDAwLCBCT1NTX1ggPSA4NTAwOwogIHZhciBDQVRfSCA9IDI5MDsKICB2YXIgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImtrLWdhbWUiKTsKICBpZiAoIWNhbnZhcykgcmV0dXJuOwogIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICB2YXIgYXBwRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgia2stYXBwIik7CiAgdmFyIHN0YWdlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgia2stc3RhZ2UiKTsKCiAgKGZ1bmN0aW9uIGNsZWFuTWFya3VwKCkgewogICAgaWYgKCFhcHBFbCkgcmV0dXJuOwogICAgdmFyIGJycyA9IGFwcEVsLnF1ZXJ5U2VsZWN0b3JBbGwoImJyIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJycy5sZW5ndGg7IGkrKykgYnJzW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYnJzW2ldKTsKICAgIHZhciBwcyA9IGFwcEVsLnF1ZXJ5U2VsZWN0b3JBbGwoInAiKTsKICAgIGZvciAodmFyIGogPSBwcy5sZW5ndGggLSAxOyBqID49IDA7IGotLSkgewogICAgICB2YXIgcCA9IHBzW2pdOwogICAgICB3aGlsZSAocC5maXJzdENoaWxkKSBwLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHAuZmlyc3RDaGlsZCwgcCk7CiAgICAgIHAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwKTsKICAgIH0KICB9KSgpOwoKICBmdW5jdGlvbiAkKGlkKSB7IHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7IH0KICB2YXIgb3ZlcmxheUVsID0gJCgia2stb3ZlcmxheSIpLCB0aXRsZUNhcmQgPSAkKCJray10aXRsZSIpLCBlbmRDYXJkID0gJCgia2stZW5kIiksIHBhdXNlQ2FyZCA9ICQoImtrLXBhdXNlIik7CiAgdmFyIHN0YXJ0QnRuID0gJCgia2stc3RhcnQiKSwgYWdhaW5CdG4gPSAkKCJray1hZ2FpbiIpLCByZXN1bWVCdG4gPSAkKCJray1yZXN1bWUiKSwgcmVzdGFydEJ0biA9ICQoImtrLXJlc3RhcnQiKTsKICB2YXIgZW5kVGl0bGUgPSAkKCJray1lbmQtdGl0bGUiKSwgZW5kTXNnID0gJCgia2stZW5kLW1zZyIpLCBsb2FkRXJyID0gJCgia2stbG9hZC1lcnIiKTsKICB2YXIgZXhpdEJ0biA9ICQoImtrLWV4aXQiKSwgcGF1c2VCdG4gPSAkKCJray1wYXVzZWJ0biIpLCByb3RhdGVFbCA9ICQoImtrLXJvdGF0ZSIpOwogIHZhciB0b3VjaEVsID0gJCgia2stdG91Y2giKSwgc3RpY2tab25lID0gJCgia2stc3RpY2t6b25lIiksIHN0aWNrQmFzZSA9ICQoImtrLXN0aWNrYmFzZSIpLCBzdGlja0tub2IgPSAkKCJray1zdGlja2tub2IiKTsKICB2YXIgYlN3aXBlID0gJCgia2stYi1zd2lwZSIpLCBiSGVhdnkgPSAkKCJray1iLWhlYXZ5IiksIGJSb2FyID0gJCgia2stYi1yb2FyIiksIGJUYWlsID0gJCgia2stYi10YWlsIiksIGJTcGVjaWFsID0gJCgia2stYi1zcGVjaWFsIik7CiAgdmFyIHNvdW5kQnRuID0gJCgia2stc291bmQiKTsKCiAgZnVuY3Rpb24gcmFuZChhLCBiKSB7IHJldHVybiBhICsgTWF0aC5yYW5kb20oKSAqIChiIC0gYSk7IH0KICBmdW5jdGlvbiBjbGFtcCh2LCBhLCBiKSB7IHJldHVybiB2IDwgYSA\/IGEgOiAodiA+IGIgPyBiIDogdik7IH0KICBmdW5jdGlvbiBsZXJwKGEsIGIsIHQpIHsgcmV0dXJuIGEgKyAoYiAtIGEpICogdDsgfQogIGZ1bmN0aW9uIHBpY2soYXJyKSB7IHJldHVybiBhcnJbKE1hdGgucmFuZG9tKCkgKiBhcnIubGVuZ3RoKSB8IDBdOyB9CiAgZnVuY3Rpb24gc2lnbih2KSB7IHJldHVybiB2IDwgMCA\/IC0xIDogMTsgfQogIGZ1bmN0aW9uIGVhc2VPdXQodCkgeyByZXR1cm4gMSAtICgxIC0gdCkgKiAoMSAtIHQpICogKDEgLSB0KTsgfQogIGZ1bmN0aW9uIG1rKHcsIGgpIHsgdmFyIGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsgYy53aWR0aCA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh3KSk7IGMuaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGgpKTsgcmV0dXJuIGM7IH0KICB2YXIgc2VlZCA9IDEzMzc7CiAgZnVuY3Rpb24gc3JhbmQoKSB7IHNlZWQgPSAoc2VlZCAqIDE2NjQ1MjUgKyAxMDEzOTA0MjIzKSAlIDQyOTQ5NjcyOTY7IHJldHVybiBzZWVkIC8gNDI5NDk2NzI5NjsgfQogIGZ1bmN0aW9uIHNyYW5nZShhLCBiKSB7IHJldHVybiBhICsgc3JhbmQoKSAqIChiIC0gYSk7IH0KCiAgdmFyIElNRyA9IHt9OwogIHZhciBOQU1FUyA9IFsiY2F0X2lkbGUiLCAiY2F0X3N3aXBlIiwgImhlbGkxIiwgImhlbGkyIiwgImJsZF9vZmZpY2UiLCAiYmxkX2dsYXNzIiwgImJsZF9icmljayIsICJibGRfcnVpbiJdOwogIHZhciBpbWFnZXNSZWFkeSA9IGZhbHNlOwogIGZ1bmN0aW9uIGxvYWRJbWFnZXMoY2IpIHsKICAgIHZhciBsZWZ0ID0gTkFNRVMubGVuZ3RoLCBmYWlsZWQgPSBbXTsKICAgIE5BTUVTLmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgdmFyIGltID0gbmV3IEltYWdlKCk7CiAgICAgIGltLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsgSU1HW25dID0gaW07IGlmICgtLWxlZnQgPT09IDApIGNiKGZhaWxlZCk7IH07CiAgICAgIGltLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IGZhaWxlZC5wdXNoKG4pOyBpZiAoLS1sZWZ0ID09PSAwKSBjYihmYWlsZWQpOyB9OwogICAgICBpbS5zcmMgPSAoQVNTRVRTLnNwcml0ZXMgfHwge30pW25dIHx8ICIiOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIGZhbGxiYWNrSW1nKHcsIGgsIGNvbCkgewogICAgdmFyIGMgPSBtayh3LCBoKSwgZyA9IGMuZ2V0Q29udGV4dCgiMmQiKTsgZy5maWxsU3R5bGUgPSBjb2w7IGcuZmlsbFJlY3QoMCwgMCwgdywgaCk7IHJldHVybiBjOwogIH0KICB2YXIgU0VUUyA9IHt9OwogIGZ1bmN0aW9uIHNpbGhvdWV0dGUoaW1nLCBjb2wpIHsKICAgIHZhciBjID0gbWsoaW1nLndpZHRoLCBpbWcuaGVpZ2h0KSwgZyA9IGMuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGcuZHJhd0ltYWdlKGltZywgMCwgMCk7IGcuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gInNvdXJjZS1pbiI7IGcuZmlsbFN0eWxlID0gY29sOyBnLmZpbGxSZWN0KDAsIDAsIGMud2lkdGgsIGMuaGVpZ2h0KTsKICAgIHJldHVybiBjOwogIH0KICBmdW5jdGlvbiBkYXJrQ2F0KGltZykgewogICAgdmFyIGMgPSBtayhpbWcud2lkdGgsIGltZy5oZWlnaHQpLCBnID0gYy5nZXRDb250ZXh0KCIyZCIpOwogICAgZy5kcmF3SW1hZ2UoaW1nLCAwLCAwKTsKICAgIHRyeSB7CiAgICAgIGcuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gInNhdHVyYXRpb24iOyBnLmZpbGxTdHlsZSA9ICIjODA4MDgwIjsgZy5maWxsUmVjdCgwLCAwLCBjLndpZHRoLCBjLmhlaWdodCk7CiAgICAgIGcuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gIm11bHRpcGx5IjsgZy5maWxsU3R5bGUgPSAiIzRhNGE1OCI7IGcuZmlsbFJlY3QoMCwgMCwgYy53aWR0aCwgYy5oZWlnaHQpOwogICAgfSBjYXRjaCAoZSkge30KICAgIGcuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gImRlc3RpbmF0aW9uLWluIjsgZy5kcmF3SW1hZ2UoaW1nLCAwLCAwKTsKICAgIHJldHVybiBjOwogIH0KICBmdW5jdGlvbiBwcmVwU2V0cygpIHsKICAgIGlmICghSU1HLmNhdF9pZGxlKSBJTUcuY2F0X2lkbGUgPSBmYWxsYmFja0ltZygzMDAsIDM1NiwgIiM4YTZhNGEiKTsKICAgIGlmICghSU1HLmNhdF9zd2lwZSkgSU1HLmNhdF9zd2lwZSA9IElNRy5jYXRfaWRsZTsKICAgIFsiaGVsaTEiLCAiaGVsaTIiXS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7IGlmICghSU1HW25dKSBJTUdbbl0gPSBmYWxsYmFja0ltZygyMTAsIDkwLCAiIzRhNWEyYSIpOyB9KTsKICAgIFsiYmxkX29mZmljZSIsICJibGRfZ2xhc3MiLCAiYmxkX2JyaWNrIiwgImJsZF9ydWluIl0uZm9yRWFjaChmdW5jdGlvbiAobikgeyBpZiAoIUlNR1tuXSkgSU1HW25dID0gZmFsbGJhY2tJbWcoMjQwLCAzNDAsICIjNzc3Iik7IH0pOwogICAgU0VUUy5wbGF5ZXIgPSB7IGlkbGU6IElNRy5jYXRfaWRsZSwgc3dpcGU6IElNRy5jYXRfc3dpcGUsIGlkbGVXOiBzaWxob3VldHRlKElNRy5jYXRfaWRsZSwgIiNmZmYiKSwgc3dpcGVXOiBzaWxob3VldHRlKElNRy5jYXRfc3dpcGUsICIjZmZmIiksCiAgICAgIGlkbGVSOiBzaWxob3VldHRlKElNRy5jYXRfaWRsZSwgIiNmZjJhMmEiKSwgc3dpcGVSOiBzaWxob3VldHRlKElNRy5jYXRfc3dpcGUsICIjZmYyYTJhIikgfTsKICAgIHZhciBiaSA9IGRhcmtDYXQoSU1HLmNhdF9pZGxlKSwgYnMgPSBkYXJrQ2F0KElNRy5jYXRfc3dpcGUpOwogICAgU0VUUy5ib3NzID0geyBpZGxlOiBiaSwgc3dpcGU6IGJzLCBpZGxlVzogU0VUUy5wbGF5ZXIuaWRsZVcsIHN3aXBlVzogU0VUUy5wbGF5ZXIuc3dpcGVXLCBpZGxlUjogU0VUUy5wbGF5ZXIuaWRsZVIsIHN3aXBlUjogU0VUUy5wbGF5ZXIuc3dpcGVSLCBleWVzOiB0cnVlIH07CiAgICB2YXIgciA9IElNRy5ibGRfcnVpbjsgdmFyIHJjID0gbWsoci53aWR0aCwgci5oZWlnaHQpLCByZyA9IHJjLmdldENvbnRleHQoIjJkIik7CiAgICByZy5kcmF3SW1hZ2UociwgMCwgMCk7IHJnLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICJzb3VyY2UtYXRvcCI7IHJnLmZpbGxTdHlsZSA9ICJyZ2JhKDQwLDMwLDMwLDAuMzUpIjsgcmcuZmlsbFJlY3QoMCwgMCwgcmMud2lkdGgsIHJjLmhlaWdodCk7CiAgICBJTUcucnVpbkRhcmsgPSByYzsKICAgIGltYWdlc1JlYWR5ID0gdHJ1ZTsKICB9CiAgdmFyIEFDID0gbnVsbCwgbWFzdGVyID0gbnVsbCwgbXV0ZWQgPSBmYWxzZSwgbm9pc2VCdWYgPSBudWxsLCBsYXN0U2hvdFNmeCA9IDA7CiAgZnVuY3Rpb24gaW5pdEF1ZGlvKCkgewogICAgaWYgKEFDKSB7IHRyeSB7IGlmIChBQy5zdGF0ZSA9PT0gInN1c3BlbmRlZCIpIEFDLnJlc3VtZSgpOyB9IGNhdGNoIChlKSB7fSByZXR1cm47IH0KICAgIHRyeSB7CiAgICAgIHZhciBDID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0OwogICAgICBpZiAoIUMpIHJldHVybjsKICAgICAgQUMgPSBuZXcgQygpOyBtYXN0ZXIgPSBBQy5jcmVhdGVHYWluKCk7IG1hc3Rlci5nYWluLnZhbHVlID0gMC40NTsgbWFzdGVyLmNvbm5lY3QoQUMuZGVzdGluYXRpb24pOwogICAgICBub2lzZUJ1ZiA9IEFDLmNyZWF0ZUJ1ZmZlcigxLCBBQy5zYW1wbGVSYXRlICogMS41LCBBQy5zYW1wbGVSYXRlKTsKICAgICAgdmFyIGQgPSBub2lzZUJ1Zi5nZXRDaGFubmVsRGF0YSgwKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkLmxlbmd0aDsgaSsrKSBkW2ldID0gTWF0aC5yYW5kb20oKSAqIDIgLSAxOwogICAgfSBjYXRjaCAoZSkgeyBBQyA9IG51bGw7IH0KICB9CiAgZnVuY3Rpb24gbm9pc2UoZHVyLCBmMCwgZjEsIHZvbCwgdHlwZSkgewogICAgdmFyIHQgPSBBQy5jdXJyZW50VGltZSwgcyA9IEFDLmNyZWF0ZUJ1ZmZlclNvdXJjZSgpLCBmbCA9IEFDLmNyZWF0ZUJpcXVhZEZpbHRlcigpLCBnID0gQUMuY3JlYXRlR2FpbigpOwogICAgcy5idWZmZXIgPSBub2lzZUJ1ZjsgZmwudHlwZSA9IHR5cGUgfHwgImxvd3Bhc3MiOyBmbC5mcmVxdWVuY3kuc2V0VmFsdWVBdFRpbWUoZjAsIHQpOyBmbC5mcmVxdWVuY3kuZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZShNYXRoLm1heCgzMCwgZjEpLCB0ICsgZHVyKTsKICAgIGcuZ2Fpbi5zZXRWYWx1ZUF0VGltZSh2b2wsIHQpOyBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMSwgdCArIGR1cik7CiAgICBzLmNvbm5lY3QoZmwpOyBmbC5jb25uZWN0KGcpOyBnLmNvbm5lY3QobWFzdGVyKTsgcy5zdGFydCh0KTsgcy5zdG9wKHQgKyBkdXIgKyAwLjA1KTsKICB9CiAgZnVuY3Rpb24gdG9uZShmMCwgZjEsIGR1ciwgdm9sLCB0eXBlKSB7CiAgICB2YXIgdCA9IEFDLmN1cnJlbnRUaW1lLCBvID0gQUMuY3JlYXRlT3NjaWxsYXRvcigpLCBnID0gQUMuY3JlYXRlR2FpbigpOwogICAgby50eXBlID0gdHlwZSB8fCAic2luZSI7IG8uZnJlcXVlbmN5LnNldFZhbHVlQXRUaW1lKGYwLCB0KTsgby5mcmVxdWVuY3kuZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZShNYXRoLm1heCgyMCwgZjEpLCB0ICsgZHVyKTsKICAgIGcuZ2Fpbi5zZXRWYWx1ZUF0VGltZSh2b2wsIHQpOyBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMSwgdCArIGR1cik7CiAgICBvLmNvbm5lY3QoZyk7IGcuY29ubmVjdChtYXN0ZXIpOyBvLnN0YXJ0KHQpOyBvLnN0b3AodCArIGR1ciArIDAuMDUpOwogIH0KICBmdW5jdGlvbiBzZngobikgewogICAgaWYgKCFBQyB8fCBtdXRlZCkgcmV0dXJuOwogICAgdHJ5IHsKICAgICAgaWYgKG4gPT09ICJzdGVwIikgeyB0b25lKDcwLCAzNSwgMC4yMiwgMC41KTsgbm9pc2UoMC4xNSwgNDAwLCA4MCwgMC4xNSk7IH0KICAgICAgZWxzZSBpZiAobiA9PT0gIndob29zaCIpIHsgbm9pc2UoMC4xOCwgNjAwLCAzMDAwLCAwLjIyLCAiYmFuZHBhc3MiKTsgfQogICAgICBlbHNlIGlmIChuID09PSAiaGl0IikgeyB0b25lKDE2MCwgNDAsIDAuMjUsIDAuNiwgInNxdWFyZSIpOyBub2lzZSgwLjIsIDMwMDAsIDIwMCwgMC40KTsgfQogICAgICBlbHNlIGlmIChuID09PSAiaGVhdnkiKSB7IHRvbmUoMTEwLCAzMCwgMC40LCAwLjcsICJzcXVhcmUiKTsgbm9pc2UoMC4zNSwgMjAwMCwgMTAwLCAwLjUpOyB9CiAgICAgIGVsc2UgaWYgKG4gPT09ICJib29tIikgeyBub2lzZSgwLjksIDEyMDAsIDYwLCAwLjYpOyB0b25lKDgwLCAyNSwgMC42LCAwLjUpOyB9CiAgICAgIGVsc2UgaWYgKG4gPT09ICJjb2xsYXBzZSIpIHsgbm9pc2UoMS40LCA1MDAsIDQwLCAwLjYpOyB0b25lKDUwLCAyNSwgMS40LCAwLjQpOyB9CiAgICAgIGVsc2UgaWYgKG4gPT09ICJzaG90IikgeyB2YXIgbm93ID0gQUMuY3VycmVudFRpbWU7IGlmIChub3cgLSBsYXN0U2hvdFNmeCA8IDAuMDcpIHJldHVybjsgbGFzdFNob3RTZnggPSBub3c7IG5vaXNlKDAuMDUsIDQwMDAsIDE1MDAsIDAuMDYsICJoaWdocGFzcyIpOyB9CiAgICAgIGVsc2UgaWYgKG4gPT09ICJtaXNzaWxlIikgeyBub2lzZSgwLjUsIDE1MDAsIDYwMCwgMC4xLCAiYmFuZHBhc3MiKTsgfQogICAgICBlbHNlIGlmIChuID09PSAicm9hciIpIHsKICAgICAgICB2YXIgdCA9IEFDLmN1cnJlbnRUaW1lLCBvID0gQUMuY3JlYXRlT3NjaWxsYXRvcigpLCBvMiA9IEFDLmNyZWF0ZU9zY2lsbGF0b3IoKSwgZyA9IEFDLmNyZWF0ZUdhaW4oKSwgbGYgPSBBQy5jcmVhdGVPc2NpbGxhdG9yKCksIGxnID0gQUMuY3JlYXRlR2FpbigpOwogICAgICAgIG8udHlwZSA9ICJzYXd0b290aCI7IG8yLnR5cGUgPSAic2F3dG9vdGgiOyBvLmZyZXF1ZW5jeS5zZXRWYWx1ZUF0VGltZSgxMjAsIHQpOyBvLmZyZXF1ZW5jeS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSg4NSwgdCArIDEuMCk7CiAgICAgICAgbzIuZnJlcXVlbmN5LnNldFZhbHVlQXRUaW1lKDE4MSwgdCk7IG8yLmZyZXF1ZW5jeS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSgxMjAsIHQgKyAxLjApOwogICAgICAgIGxmLmZyZXF1ZW5jeS52YWx1ZSA9IDIyOyBsZy5nYWluLnZhbHVlID0gMTg7IGxmLmNvbm5lY3QobGcpOyBsZy5jb25uZWN0KG8uZnJlcXVlbmN5KTsgbGcuY29ubmVjdChvMi5mcmVxdWVuY3kpOwogICAgICAgIGcuZ2Fpbi5zZXRWYWx1ZUF0VGltZSgwLjAwMSwgdCk7IGcuZ2Fpbi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSgwLjM1LCB0ICsgMC4xKTsgZy5nYWluLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoMC4wMDEsIHQgKyAxLjEpOwogICAgICAgIG8uY29ubmVjdChnKTsgbzIuY29ubmVjdChnKTsgZy5jb25uZWN0KG1hc3Rlcik7IG8uc3RhcnQodCk7IG8yLnN0YXJ0KHQpOyBsZi5zdGFydCh0KTsgby5zdG9wKHQgKyAxLjIpOyBvMi5zdG9wKHQgKyAxLjIpOyBsZi5zdG9wKHQgKyAxLjIpOwogICAgICAgIG5vaXNlKDEuMCwgMTgwMCwgMzAwLCAwLjI1LCAiYmFuZHBhc3MiKTsKICAgICAgfQogICAgICBlbHNlIGlmIChuID09PSAic2xhbSIpIHsgdG9uZSg2MCwgMjAsIDEuMiwgMC45LCAic3F1YXJlIik7IG5vaXNlKDEuNCwgMjUwMCwgNTAsIDAuNyk7IH0KICAgICAgZWxzZSBpZiAobiA9PT0gImtpY2siKSB7IHRvbmUoOTAsIDQwLCAwLjE4LCAwLjIyKTsgfQogICAgICBlbHNlIGlmIChuID09PSAic25hcmUiKSB7IG5vaXNlKDAuMTIsIDMwMDAsIDgwMCwgMC4wOCwgImhpZ2hwYXNzIik7IH0KICAgICAgZWxzZSBpZiAobiA9PT0gImpldCIpIHsgbm9pc2UoMS42LCAzMDAsIDMwMDAsIDAuMjUsICJiYW5kcGFzcyIpOyB9CiAgICB9IGNhdGNoIChlKSB7fQogIH0KICB2YXIgZHJvbmUgPSBudWxsOwogIGZ1bmN0aW9uIHN0YXJ0RHJvbmUoKSB7CiAgICBpZiAoIUFDIHx8IGRyb25lKSByZXR1cm47CiAgICB0cnkgewogICAgICB2YXIgbyA9IEFDLmNyZWF0ZU9zY2lsbGF0b3IoKSwgbzIgPSBBQy5jcmVhdGVPc2NpbGxhdG9yKCksIGYgPSBBQy5jcmVhdGVCaXF1YWRGaWx0ZXIoKSwgZyA9IEFDLmNyZWF0ZUdhaW4oKTsKICAgICAgby50eXBlID0gInNhd3Rvb3RoIjsgby5mcmVxdWVuY3kudmFsdWUgPSA1NTsgbzIudHlwZSA9ICJzYXd0b290aCI7IG8yLmZyZXF1ZW5jeS52YWx1ZSA9IDgyLjQ7CiAgICAgIGYudHlwZSA9ICJsb3dwYXNzIjsgZi5mcmVxdWVuY3kudmFsdWUgPSAyNjA7IGcuZ2Fpbi52YWx1ZSA9IG11dGVkID8gMCA6IDAuMDk7CiAgICAgIG8uY29ubmVjdChmKTsgbzIuY29ubmVjdChmKTsgZi5jb25uZWN0KGcpOyBnLmNvbm5lY3QobWFzdGVyKTsgby5zdGFydCgpOyBvMi5zdGFydCgpOwogICAgICBkcm9uZSA9IHsgbzogbywgbzI6IG8yLCBnOiBnIH07CiAgICB9IGNhdGNoIChlKSB7fQogIH0KICBmdW5jdGlvbiBzdG9wRHJvbmUoKSB7CiAgICBpZiAoIWRyb25lKSByZXR1cm47CiAgICB0cnkgeyBkcm9uZS5vLnN0b3AoKTsgZHJvbmUubzIuc3RvcCgpOyB9IGNhdGNoIChlKSB7fQogICAgZHJvbmUgPSBudWxsOwogIH0KCiAgdmFyIEcgPSB7IHN0YXRlOiAidGl0bGUiLCBwaGFzZTogImNpdHkiLCB0OiAwLCBzaGFrZTogMCwgZmxhc2g6IDAsIGhpdFN0b3A6IDAsIHdhdmU6IDAsIHNjb3JlOiAwLCBoZWF0OiAwLCBpZGxlVDogMCwgY2FtWDogMCwgem9vbTogMSwgem9vbVQ6IDEsIGJlYXRUOiAwLCBiZWF0OiAwLCBqZXRUOiAxMiwgYm9zc1Q6IDAsIGVuZFQ6IDAsIHBsYXlUaW1lOiAwLCBnb2Q6IGZhbHNlLCBwb3J0cmFpdFBhdXNlOiBmYWxzZSwgYXV0b1RhaWxDRDogMCB9OwogIHZhciBjYXQsIGJvc3MsIGJ1aWxkaW5ncywgdmVoaWNsZXMsIGhlbGlzLCBzaG90cywgcGFydHMsIGJnUGFydHMsIHRleHRzLCBkZWNhbHMsIHByb3BzLCBqZXRzLCBsYXVuY2hlcnMsIHNreUZhciwgc2t5TWlkLCBzcGF3blQ7CiAgdmFyIGtleXMgPSB7fTsKICB2YXIgdG91Y2hNb2RlID0gZmFsc2UsIG1vYmlsZVBsYXkgPSBmYWxzZSwgZnNGYWxsYmFjayA9IGZhbHNlOwogIHZhciBzdGljayA9IHsgaWQ6IG51bGwsIHgwOiAwLCB5MDogMCwgZHg6IDAsIGR5OiAwLCBqdW1wZWQ6IGZhbHNlIH07CgogIHZhciBCVCA9IHsKICAgIG9mZmljZTogeyBpbWc6ICJibGRfb2ZmaWNlIiwgaE1pbjogMTcwLCBoTWF4OiAyNDAsIGhwOiAzLCBwdHM6IDE1MDAsIGdsYXNzOiAwLjU1LCB0aW50czogW251bGwsICJyZ2JhKDI1NSwyMTAsMTcwLDAuMTgpIiwgInJnYmEoMTEwLDEzMCwxNzAsMC4yMikiLCAicmdiYSg1MCw1MCw3MCwwLjIyKSJdIH0sCiAgICBicmljazogeyBpbWc6ICJibGRfYnJpY2siLCBoTWluOiAxOTAsIGhNYXg6IDI2NSwgaHA6IDQsIHB0czogMTgwMCwgZ2xhc3M6IDAuMywgdGludHM6IFtudWxsLCAicmdiYSgyNTUsMTYwLDExMCwwLjE2KSIsICJyZ2JhKDgwLDUwLDQ1LDAuMjUpIiwgInJnYmEoMTkwLDE5MCwyMTUsMC4yKSJdIH0sCiAgICBnbGFzczogeyBpbWc6ICJibGRfZ2xhc3MiLCBoTWluOiAzMDAsIGhNYXg6IDQzMCwgaHA6IDYsIHB0czogMzAwMCwgZ2xhc3M6IDAuOSwgdGludHM6IFtudWxsLCAicmdiYSg2MCwyMDAsMjIwLDAuMTYpIiwgInJnYmEoMjU1LDE5MCwxNDAsMC4xNikiLCAicmdiYSgzMCw0MCw5MCwwLjI0KSJdIH0sCiAgICBydWluOiB7IGltZzogImJsZF9ydWluIiwgaE1pbjogMTQwLCBoTWF4OiAxOTAsIGhwOiAxLCBwdHM6IDMwMCwgZ2xhc3M6IDAsIHRpbnRzOiBbbnVsbCwgInJnYmEoNDAsMzAsMzAsMC4yKSJdIH0KICB9OwoKICBmdW5jdGlvbiBtYWtlQnVpbGRpbmcodHlwZSwgeCkgewogICAgdmFyIGQgPSBCVFt0eXBlXSwgaW1nID0gSU1HW2QuaW1nXTsKICAgIHZhciBoID0gc3JhbmdlKGQuaE1pbiwgZC5oTWF4KTsKICAgIHZhciB3ID0gaCAqIChpbWcud2lkdGggLyBpbWcuaGVpZ2h0KSAqIHNyYW5nZSgwLjkyLCAxLjEyKTsKICAgIHZhciBiID0geyB0eXBlOiB0eXBlLCB4OiB4LCB3OiB3LCBoOiBoLCBocDogZC5ocCwgbWF4SHA6IGQuaHAsIHN0YXRlOiB0eXBlID09PSAicnVpbiIgPyAicnVpbiIgOiAib2siLCBzaW5rOiAwLCBzaW5rVjogMCwgbHZsOiAwLCBoaXRDRDogMCwgbGVhbjogMCwgc21va2VUOiAwLCBjb2xsVDogMCwgbGF1bmNoZXI6IG51bGwgfTsKICAgIHZhciBjdiA9IG1rKHcsIGgpLCBnID0gY3YuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGcuZHJhd0ltYWdlKGltZywgMCwgMCwgY3Yud2lkdGgsIGN2LmhlaWdodCk7CiAgICB2YXIgdGludCA9IGQudGludHNbKHNyYW5kKCkgKiBkLnRpbnRzLmxlbmd0aCkgfCAwXTsKICAgIGlmICh0aW50KSB7IGcuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gInNvdXJjZS1hdG9wIjsgZy5maWxsU3R5bGUgPSB0aW50OyBnLmZpbGxSZWN0KDAsIDAsIGN2LndpZHRoLCBjdi5oZWlnaHQpOyB9CiAgICBnLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICJzb3VyY2UtYXRvcCI7CiAgICB2YXIgZ3IgPSBnLmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIDAsIGN2LmhlaWdodCk7CiAgICBnci5hZGRDb2xvclN0b3AoMCwgInJnYmEoMjU1LDE3MCwxMTAsMC4xMCkiKTsgZ3IuYWRkQ29sb3JTdG9wKDEsICJyZ2JhKDIwLDEwLDMwLDAuMTgpIik7CiAgICBnLmZpbGxTdHlsZSA9IGdyOyBnLmZpbGxSZWN0KDAsIDAsIGN2LndpZHRoLCBjdi5oZWlnaHQpOwogICAgZy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAic291cmNlLW92ZXIiOwogICAgYi5jdiA9IGN2OwogICAgaWYgKHR5cGUgPT09ICJydWluIikgeyBiLnJ1aW5IID0gaDsgfQogICAgdmFyIHBpbGUgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykgcGlsZS5wdXNoKHsgeDogc3JhbmQoKSAqIHcsIHc6IHNyYW5nZSgxNCwgMzgpLCBoOiBzcmFuZ2UoOCwgMjYpLCByOiBzcmFuZ2UoLTAuNiwgMC42KSwgYzogKDEwMCArIHNyYW5kKCkgKiA2MCkgfCAwIH0pOwogICAgYi5waWxlID0gcGlsZTsKICAgIHJldHVybiBiOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRDaXR5KCkgewogICAgc2VlZCA9IDQyNDI7CiAgICBidWlsZGluZ3MgPSBbXTsKICAgIHZhciB4ID0gMTIwOwogICAgdmFyIHR5cGVzID0gWyJvZmZpY2UiLCAiYnJpY2siLCAiZ2xhc3MiLCAib2ZmaWNlIiwgImJyaWNrIiwgImdsYXNzIiwgImdsYXNzIl07CiAgICB3aGlsZSAoeCA8IFdPUkxEICsgMzAwKSB7CiAgICAgIHZhciB0ID0gdHlwZXNbKHNyYW5kKCkgKiB0eXBlcy5sZW5ndGgpIHwgMF07CiAgICAgIGlmICh4ID4gOTAwICYmIHNyYW5kKCkgPCAwLjA2KSB0ID0gInJ1aW4iOwogICAgICBpZiAoeCA+IDQzMDAgJiYgeCA8IEJPU1NfWCAtIDQwMCAmJiBzcmFuZCgpIDwgMC4zNSkgdCA9ICJnbGFzcyI7CiAgICAgIHZhciBiID0gbWFrZUJ1aWxkaW5nKHQsIHgpOwogICAgICBidWlsZGluZ3MucHVzaChiKTsKICAgICAgeCArPSBiLncgKyBzcmFuZ2UoMTIsIDcwKTsKICAgIH0KICAgIGxhdW5jaGVycyA9IFtdOwogICAgYnVpbGRpbmdzLmZvckVhY2goZnVuY3Rpb24gKGIpIHsKICAgICAgaWYgKGIueCA+IDM4MDAgJiYgYi54IDwgQk9TU19YICsgNjAwICYmIGIuc3RhdGUgPT09ICJvayIgJiYgc3JhbmQoKSA8IDAuMzMpIHsKICAgICAgICB2YXIgTCA9IHsgYjogYiwgeDogYi54ICsgYi53ICogMC41LCBmaXJlVDogc3JhbmdlKDEsIDMpLCBkZWFkOiBmYWxzZSwgYWltOiBNYXRoLlBJLCBocDogMSB9OwogICAgICAgIGIubGF1bmNoZXIgPSBMOyBsYXVuY2hlcnMucHVzaChMKTsKICAgICAgfQogICAgfSk7CiAgICBwcm9wcyA9IFtdOwogICAgZm9yICh2YXIgcHggPSA2MDsgcHggPCBXT1JMRDsgcHggKz0gc3JhbmdlKDE1MCwgMjMwKSkgewogICAgICBwcm9wcy5wdXNoKHsga2luZDogc3JhbmQoKSA8IDAuNzggPyAibGFtcCIgOiAic2lnbiIsIHg6IHB4LCBiZW5kOiAwLCB3b2I6IDAsIHdvYlY6IDAsIGh1ZTogKHNyYW5kKCkgKiAzNjApIHwgMCB9KTsKICAgIH0KICAgIHNreUZhciA9IG1ha2VTa3lsaW5lKDI1NjAsIDAuMTUsICIjM2QzNTUyIiwgIiM0YTNmNWUiLCA4MCwgMjMwLCAwLjAzKTsKICAgIHNreU1pZCA9IG1ha2VTa3lsaW5lKDI1NjAsIDAuNCwgIiMyNzIyMzUiLCAiIzJmMmE0MCIsIDE0MCwgMzMwLCAwLjEyKTsKICB9CiAgZnVuY3Rpb24gbWFrZVNreWxpbmUodywgcGFyYSwgYzEsIGMyLCBoTWluLCBoTWF4LCBsaXRQKSB7CiAgICB2YXIgYyA9IG1rKHcsIDQyMCksIGcgPSBjLmdldENvbnRleHQoIjJkIik7CiAgICB2YXIgeCA9IDA7CiAgICB3aGlsZSAoeCA8IHcpIHsKICAgICAgdmFyIGJ3ID0gc3JhbmdlKDQwLCAxMjApLCBiaCA9IHNyYW5nZShoTWluLCBoTWF4KTsKICAgICAgaWYgKHggKyBidyA+IHcpIGJ3ID0gdyAtIHg7CiAgICAgIGcuZmlsbFN0eWxlID0gc3JhbmQoKSA8IDAuNSA\/IGMxIDogYzI7CiAgICAgIGcuZmlsbFJlY3QoeCwgNDIwIC0gYmgsIGJ3LCBiaCk7CiAgICAgIGlmIChzcmFuZCgpIDwgMC4yNSkgeyBnLmZpbGxSZWN0KHggKyBidyAqIDAuNDUsIDQyMCAtIGJoIC0gc3JhbmdlKDE1LCA1MCksIDMsIDUwKTsgfQogICAgICBnLmZpbGxTdHlsZSA9ICJyZ2JhKDI1NSwyMTAsMTMwLDAuNzUpIjsKICAgICAgZm9yICh2YXIgd3kgPSA0MjAgLSBiaCArIDEwOyB3eSA8IDQxMDsgd3kgKz0gMTIpIHsKICAgICAgICBmb3IgKHZhciB3eCA9IHggKyA2OyB3eCA8IHggKyBidyAtIDY7IHd4ICs9IDEwKSB7CiAgICAgICAgICBpZiAoc3JhbmQoKSA8IGxpdFApIGcuZmlsbFJlY3Qod3gsIHd5LCA0LCA1KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgeCArPSBidyArIHNyYW5nZSgwLCAxNCk7CiAgICB9CiAgICByZXR1cm4geyBjdjogYywgcGFyYTogcGFyYSB9OwogIH0KCiAgZnVuY3Rpb24gbmV3Q2F0KHgpIHsKICAgIHJldHVybiB7IHg6IHgsIGZlZXQ6IEZFRVQsIHZ4OiAwLCB2eTogMCwgZmFjaW5nOiAxLCBvbkdyb3VuZDogdHJ1ZSwgaHA6IDEwMCwgcG93ZXI6IDAsIGFjdDogbnVsbCwgYnVmZmVyOiBudWxsLAogICAgICBjb21ibzogMCwgY29tYm9UOiAwLCBzdGVwUGhhc2U6IDAsIHN0ZXBDb3VudDogMCwgc3F1YXNoOiAwLCBodXJ0VDogMCwgcm9hckNEOiAwLCBpbnZ1bG46IDAsIGFpclNsYW06IGZhbHNlLAogICAgICBsb29rUm90OiAwLCBkZWFkOiBmYWxzZSwgZGVhZFQ6IDAsIGF1dG9UOiBudWxsLCBhdXRvVGltZTogMCwgdHVyblQ6IDAgfTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0R2FtZSgpIHsKICAgIGJ1aWxkQ2l0eSgpOwogICAgY2F0ID0gbmV3Q2F0KDI2MCk7CiAgICBib3NzID0gbnVsbDsKICAgIHZlaGljbGVzID0gW107IGhlbGlzID0gW107IHNob3RzID0gW107IHBhcnRzID0gW107IGJnUGFydHMgPSBbXTsgdGV4dHMgPSBbXTsgZGVjYWxzID0gW107IGpldHMgPSBbXTsKICAgIHNwYXduVCA9IHsgbWlsOiAyLjUsIGhlbGk6IDMsIGNhcjogMC41LCBpbnRybzogMCB9OwogICAgRy5waGFzZSA9ICJjaXR5IjsgRy50ID0gMDsgRy5zaGFrZSA9IDA7IEcuZmxhc2ggPSAwOyBHLmhpdFN0b3AgPSAwOyBHLndhdmUgPSAwOyBHLnNjb3JlID0gMDsgRy5oZWF0ID0gMDsgRy5pZGxlVCA9IDA7CiAgICBHLmNhbVggPSAwOyBHLnpvb20gPSAxOyBHLnpvb21UID0gMTsgRy5qZXRUID0gMTQ7IEcuYm9zc1QgPSAwOyBHLmVuZFQgPSAwOyBHLnBsYXlUaW1lID0gMDsgRy5kaXN0cmljdCA9ICIiOwogICAgRy5kaXN0cmljdFQgPSAwOyBHLmF1dG9UYWlsQ0QgPSAwOwogICAgc3RvcERyb25lKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY7IGkrKykgc3Bhd25WZWhpY2xlKCJjYXIiLCBudWxsLCA1MDAgKyBpICogcmFuZCgxODAsIDMyMCkpOwogIH0KCiAgZnVuY3Rpb24gbXVsdCgpIHsgcmV0dXJuIEcuaGVhdCA+PSAzNiA\/IDEwIDogKEcuaGVhdCA+PSAyMCA\/IDUgOiAoRy5oZWF0ID49IDggPyAyIDogMSkpOyB9CiAgZnVuY3Rpb24gYWRkRGVzdHJ1Y3Rpb24ocHRzLCB4LCB5LCBiaWcpIHsKICAgIHZhciBtID0gbXVsdCgpOwogICAgRy5zY29yZSArPSBwdHMgKiBtOwogICAgRy5oZWF0ID0gTWF0aC5taW4oNDUsIEcuaGVhdCArIChiaWcgPyAzIDogMSkpOwogICAgRy5pZGxlVCA9IDA7CiAgICBpZiAoIWNhdC5kZWFkKSBjYXQucG93ZXIgPSBNYXRoLm1pbigxMDAsIGNhdC5wb3dlciArIHB0cyAvIDQ1KTsKICAgIGlmICh4ICE9PSB1bmRlZmluZWQpIGFkZFRleHQoIisiICsgKHB0cyAqIG0pLCB4LCB5IC0gMzAsIDIyLCAiI2ZmZTI3YSIsIDAuOSwgMC41KTsKICB9CgogIGZ1bmN0aW9uIGFkZFBhcnQocCkgeyBpZiAocGFydHMubGVuZ3RoIDwgOTAwKSBwYXJ0cy5wdXNoKHApOyB9CiAgZnVuY3Rpb24gYWRkVGV4dChzLCB4LCB5LCBzaXplLCBjb2wsIGxpZmUsIHJpc2UpIHsKICAgIHRleHRzLnB1c2goeyBzOiBzLCB4OiB4LCB5OiB5LCBzaXplOiBzaXplLCBjb2w6IGNvbCwgdDogMCwgbGlmZTogbGlmZSB8fCAwLjgsIHJpc2U6IHJpc2UgPT09IHVuZGVmaW5lZCA\/IDEgOiByaXNlIH0pOwogICAgaWYgKHRleHRzLmxlbmd0aCA+IDQwKSB0ZXh0cy5zaGlmdCgpOwogIH0KICBmdW5jdGlvbiBkdXN0KHgsIHksIG4sIHNwcmVhZCwgc2l6ZSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIGFkZFBhcnQoeyB0eXBlOiAiZHVzdCIsIHg6IHggKyByYW5kKC1zcHJlYWQsIHNwcmVhZCksIHk6IHkgKyByYW5kKC02LCA2KSwgdng6IHJhbmQoLTkwLCA5MCksIHZ5OiByYW5kKC02MCwgLTEwKSwgbGlmZTogcmFuZCgwLjYsIDEuMiksIHQ6IDAsIHNpemU6IHJhbmQoc2l6ZSAqIDAuNSwgc2l6ZSksIGNvbDogcGljayhbIiNiOGE4OTAiLCAiI2EzOTU4MiIsICIjY2JiZGE1Il0pIH0pOwogIH0KICBmdW5jdGlvbiBkZWJyaXMoeCwgeSwgZGlyLCBnbGFzc1JhdGlvLCBuLCBwb3dlcikgewogICAgcG93ZXIgPSBwb3dlciB8fCAxOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgdmFyIGdsID0gTWF0aC5yYW5kb20oKSA8IGdsYXNzUmF0aW87CiAgICAgIGFkZFBhcnQoeyB0eXBlOiBnbCA\/ICJnbGFzcyIgOiAiY2h1bmsiLCB4OiB4ICsgcmFuZCgtMTAsIDEwKSwgeTogeSArIHJhbmQoLTEwLCAxMCksIHZ4OiBkaXIgKiByYW5kKDEyMCwgNTIwKSAqIHBvd2VyICsgcmFuZCgtODAsIDgwKSwgdnk6IHJhbmQoLTUyMCwgLTYwKSAqIHBvd2VyLAogICAgICAgIGxpZmU6IHJhbmQoMS4yLCAyLjIpLCB0OiAwLCBzaXplOiBnbCA\/IHJhbmQoNCwgOSkgOiByYW5kKDUsIDE0KSwgcm90OiByYW5kKDAsIDYpLCB2cjogcmFuZCgtMTIsIDEyKSwgZmxvb3I6IHJhbmQoU1RSRUVUICsgOCwgSCAtIDYpLAogICAgICAgIGNvbDogZ2wgPyBwaWNrKFsiI2JmZTZmZiIsICIjOGZkMGZmIiwgIiNlNmY2ZmYiXSkgOiBwaWNrKFsiIzhjODU3YyIsICIjYTM5YjkwIiwgIiM2ZjY4NjAiLCAiI2I1YTQ4ZSJdKSB9KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gc3BhcmtzKHgsIHksIG4sIGNvbCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsgdmFyIGEgPSByYW5kKDAsIE1hdGguUEkgKiAyKSwgcyA9IHJhbmQoMjAwLCA2NTApOyBhZGRQYXJ0KHsgdHlwZTogInNwYXJrIiwgeDogeCwgeTogeSwgdng6IE1hdGguY29zKGEpICogcywgdnk6IE1hdGguc2luKGEpICogcywgbGlmZTogcmFuZCgwLjIsIDAuNDUpLCB0OiAwLCBzaXplOiByYW5kKDIsIDQpLCBjb2w6IGNvbCB8fCAiI2ZmZTlhMCIgfSk7IH0KICB9CiAgZnVuY3Rpb24gZXhwbG9kZSh4LCB5LCBzaXplKSB7CiAgICBzaXplID0gc2l6ZSB8fCAxOwogICAgYWRkUGFydCh7IHR5cGU6ICJmbGFzaCIsIHg6IHgsIHk6IHksIGxpZmU6IDAuMTgsIHQ6IDAsIHNpemU6IDcwICogc2l6ZSB9KTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTQgKiBzaXplOyBpKyspIGFkZFBhcnQoeyB0eXBlOiAiZmlyZSIsIHg6IHggKyByYW5kKC0yMCwgMjApICogc2l6ZSwgeTogeSArIHJhbmQoLTIwLCAyMCkgKiBzaXplLCB2eDogcmFuZCgtMTYwLCAxNjApICogc2l6ZSwgdnk6IHJhbmQoLTIyMCwgNDApICogc2l6ZSwgbGlmZTogcmFuZCgwLjM1LCAwLjcpLCB0OiAwLCBzaXplOiByYW5kKDE0LCAzMCkgKiBzaXplLCBjb2w6IHBpY2soWyIjZmZkMzRhIiwgIiNmZjhhMmEiLCAiI2ZmNWExYSJdKSB9KTsKICAgIGZvciAodmFyIGogPSAwOyBqIDwgOCAqIHNpemU7IGorKykgYWRkUGFydCh7IHR5cGU6ICJzbW9rZSIsIHg6IHggKyByYW5kKC0yNSwgMjUpLCB5OiB5ICsgcmFuZCgtMjUsIDI1KSwgdng6IHJhbmQoLTQwLCA0MCksIHZ5OiByYW5kKC05MCwgLTMwKSwgbGlmZTogcmFuZCgxLjAsIDEuOCksIHQ6IDAsIHNpemU6IHJhbmQoMTgsIDM0KSAqIHNpemUsIGNvbDogIiMzYTM1MzIiIH0pOwogICAgc3BhcmtzKHgsIHksIDEwICogc2l6ZSk7CiAgICBkZWJyaXMoeCwgeSwgMCwgMC4xLCA2ICogc2l6ZSwgMC42KTsKICAgIEcuc2hha2UgPSBNYXRoLm1heChHLnNoYWtlLCA3ICogc2l6ZSk7CiAgICBzZngoImJvb20iKTsKICAgIGZvciAodmFyIGsgPSAwOyBrIDwgaGVsaXMubGVuZ3RoOyBrKyspIHsKICAgICAgdmFyIGhoID0gaGVsaXNba107CiAgICAgIGlmIChoaC5zdGF0ZSA9PT0gImZseSIgfHwgaGguc3RhdGUgPT09ICJzdHVuIikgewogICAgICAgIHZhciBkeCA9IGhoLnggLSB4LCBkeSA9IGhoLnkgLSB5OwogICAgICAgIGlmIChkeCAqIGR4ICsgZHkgKiBkeSA8IDkwICogOTAgKiBzaXplICogc2l6ZSkgbGF1bmNoSGVsaShoaCwgc2lnbihkeCkgKiA1MDAsIC0yMDAsIDAuOCk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gc2hvY2tSaW5nKHgsIHksIG1heFIsIGNvbCwgbGlmZSkgewogICAgYWRkUGFydCh7IHR5cGU6ICJyaW5nIiwgeDogeCwgeTogeSwgbGlmZTogbGlmZSB8fCAwLjUsIHQ6IDAsIHNpemU6IG1heFIsIGNvbDogY29sIHx8ICJyZ2JhKDI1NSwyNDAsMjEwLDAuOSkiIH0pOwogIH0KICBmdW5jdGlvbiBjcmFja0RlY2FsKHgpIHsKICAgIHZhciBzZWdzID0gW10sIHB4ID0geCwgcHkgPSByYW5kKFNUUkVFVCArIDMwLCBIIC0gMTIpOwogICAgdmFyIG4gPSA0ICsgKChNYXRoLnJhbmRvbSgpICogMykgfCAwKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7IHZhciBhID0gcmFuZCgwLCBNYXRoLlBJICogMiksIGwgPSByYW5kKDEwLCAzMCk7IHNlZ3MucHVzaChbcHgsIHB5LCBweCArIE1hdGguY29zKGEpICogbCwgcHkgKyBNYXRoLnNpbihhKSAqIGwgKiAwLjRdKTsgfQogICAgZGVjYWxzLnB1c2goeyBzZWdzOiBzZWdzLCBsaWZlOiAxNCB9KTsKICAgIGlmIChkZWNhbHMubGVuZ3RoID4gNzApIGRlY2Fscy5zaGlmdCgpOwogIH0KICB2YXIgVksgPSB7CiAgICBjYXI6IHsgdzogNjYsIGg6IDI2LCBocDogMSwgcHRzOiAxMDAsIHNwZWVkOiA5MCwgcmFuZ2U6IFswLCAwXSwgZmlyZTogMCB9LAogICAgcG9saWNlOiB7IHc6IDc0LCBoOiAyOCwgaHA6IDEsIHB0czogMTUwLCBzcGVlZDogMTUwLCByYW5nZTogWzM2MCwgNTYwXSwgZmlyZTogMS4zIH0sCiAgICB0cnVjazogeyB3OiAxMDQsIGg6IDQyLCBocDogMiwgcHRzOiAyNTAsIHNwZWVkOiAxMTAsIHJhbmdlOiBbNDIwLCA2NDBdLCBmaXJlOiAxLjYgfSwKICAgIHRhbms6IHsgdzogMTE2LCBoOiA0NCwgaHA6IDMsIHB0czogNDUwLCBzcGVlZDogNzAsIHJhbmdlOiBbNDgwLCA3NjBdLCBmaXJlOiAyLjYgfQogIH07CiAgZnVuY3Rpb24gdmlld0woKSB7IHJldHVybiBHLmNhbVggKyBXIC8gMiAtIFcgLyAoMiAqIEcuem9vbSk7IH0KICBmdW5jdGlvbiB2aWV3UigpIHsgcmV0dXJuIEcuY2FtWCArIFcgLyAyICsgVyAvICgyICogRy56b29tKTsgfQogIGZ1bmN0aW9uIHNwYXduVmVoaWNsZShraW5kLCBzaWRlLCBhdFgpIHsKICAgIHZhciBkID0gVktba2luZF07CiAgICB2YXIgeCA9IGF0WCAhPT0gdW5kZWZpbmVkID8gYXRYIDogKHNpZGUgPiAwID8gdmlld1IoKSArIHJhbmQoNjAsIDIyMCkgOiB2aWV3TCgpIC0gcmFuZCg2MCwgMjIwKSk7CiAgICB2YXIgdiA9IHsga2luZDoga2luZCwgeDogeCwgeTogRkVFVCArIHJhbmQoLTE0LCA2KSwgdzogZC53LCBoOiBkLmgsIGhwOiBkLmhwLCB2eDogMCwgdnk6IDAsIGRpcjogLTEsIHN0YXRlOiBhdFggIT09IHVuZGVmaW5lZCA\/ICJwYXJrZWQiIDogImRyaXZlIiwKICAgICAgcm90OiAwLCB2cjogMCwgZmlyZVQ6IHJhbmQoMC41LCAxLjUpICsgZC5maXJlLCBib3VuY2VZOiAwLCBib3VuY2VWOiAwLCBzdHVuOiAwLCBhaW06IE1hdGguUEksIGZsYXNoVDogMCwKICAgICAgY29sb3I6IHBpY2soWyIjYzg0YTNhIiwgIiMzYTZhYzgiLCAiI2UwYzA0MCIsICIjZThlOGU4IiwgIiMzYTlhNWEiLCAiIzZhNGE4YSJdKSwgZGVhZDogZmFsc2UsIGJ1cm46IDAsIHByZWY6IHJhbmQoZC5yYW5nZVswXSwgZC5yYW5nZVsxXSkgfTsKICAgIGlmIChraW5kID09PSAiY2FyIiAmJiBhdFggPT09IHVuZGVmaW5lZCkgeyB2LnN0YXRlID0gInRyYWZmaWMiOyB2LmRpciA9IHNpZGUgPiAwID8gLTEgOiAxOyB2LnZ4ID0gdi5kaXIgKiByYW5kKDcwLCAxMzApOyB9CiAgICB2ZWhpY2xlcy5wdXNoKHYpOwogICAgcmV0dXJuIHY7CiAgfQogIGZ1bmN0aW9uIGxhdW5jaFZlaGljbGUodiwgdngsIHZ5LCBzcGluKSB7CiAgICBpZiAodi5kZWFkKSByZXR1cm47CiAgICB2LnN0YXRlID0gInR1bWJsZSI7IHYudnggPSB2eDsgdi52eSA9IHZ5OyB2LnZyID0gc3Bpbjsgdi5ib3VuY2VZID0gMDsgdi5zdHVuID0gMDsKICB9CiAgZnVuY3Rpb24gY3J1c2hWZWhpY2xlKHYpIHsKICAgIGlmICh2LnN0YXRlID09PSAiY3J1c2hlZCIgfHwgdi5kZWFkKSByZXR1cm47CiAgICB2LnN0YXRlID0gImNydXNoZWQiOyB2LnZ4ID0gMDsgdi5idXJuID0gdi5raW5kID09PSAiY2FyIiA\/IDAgOiAzOyB2LnN0dW4gPSAwOwogICAgc3BhcmtzKHYueCwgdi55IC0gMTAsIDYpOyBkZWJyaXModi54LCB2LnkgLSAxMCwgMCwgMC40LCA2LCAwLjUpOwogICAgaWYgKHYua2luZCAhPT0gImNhciIpIGV4cGxvZGUodi54LCB2LnkgLSAxNCwgMC42KTsKICAgIGFkZERlc3RydWN0aW9uKFZLW3Yua2luZF0ucHRzLCB2LngsIHYueSAtIDMwKTsKICB9CiAgZnVuY3Rpb24gY2F0VGFyZ2V0KCkgewogICAgaWYgKGJvc3MgJiYgYm9zcy5zdGF0ZSAhPT0gImRvd24iICYmIGJvc3Muc3RhdGUgIT09ICJlbnRlciIgJiYgTWF0aC5yYW5kb20oKSA8IDAuNCkgcmV0dXJuIHsgeDogYm9zcy54LCB5OiBib3NzLmZlZXQgLSAxNzAsIHdobzogImJvc3MiIH07CiAgICByZXR1cm4geyB4OiBjYXQueCwgeTogY2F0LmZlZXQgLSByYW5kKDEyMCwgMjMwKSwgd2hvOiAiY2F0IiB9OwogIH0KICBmdW5jdGlvbiBmaXJlU2hvdCh4LCB5LCBraW5kLCB0Z3QpIHsKICAgIHZhciBkeCA9IHRndC54IC0geCwgZHkgPSB0Z3QueSAtIHksIGQgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpIHx8IDE7CiAgICB2YXIgc3AgPSBraW5kID09PSAiYnVsbGV0IiA\/IDcyMCA6IChraW5kID09PSAic2hlbGwiID8gODIwIDogMzYwKTsKICAgIHZhciBzID0geyBraW5kOiBraW5kLCB4OiB4LCB5OiB5LCB2eDogZHggLyBkICogc3AsIHZ5OiBkeSAvIGQgKiBzcCwgbGlmZToga2luZCA9PT0gIm1pc3NpbGUiID8gNC41IDogMi4yLCBvd25lcjogIm1pbCIsIHRndDogdGd0LndobywgZG1nOiBraW5kID09PSAiYnVsbGV0IiA\/IDEuMiA6IChraW5kID09PSAic2hlbGwiID8gNCA6IDUpLCB0cmFpbFQ6IDAgfTsKICAgIGlmIChraW5kID09PSAiYnVsbGV0IikgeyBzLnZ4ICs9IHJhbmQoLTQwLCA0MCk7IHMudnkgKz0gcmFuZCgtNDAsIDQwKTsgfQogICAgc2hvdHMucHVzaChzKTsKICAgIGlmIChraW5kID09PSAibWlzc2lsZSIpIHNmeCgibWlzc2lsZSIpOyBlbHNlIHNmeCgic2hvdCIpOwogICAgcmV0dXJuIHM7CiAgfQogIGZ1bmN0aW9uIHVwZGF0ZVZlaGljbGVzKGR0KSB7CiAgICBmb3IgKHZhciBpID0gdmVoaWNsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgdmFyIHYgPSB2ZWhpY2xlc1tpXSwgZCA9IFZLW3Yua2luZF07CiAgICAgIGlmICh2LmZsYXNoVCA+IDApIHYuZmxhc2hUIC09IGR0OwogICAgICBpZiAodi5ib3VuY2VZIDwgMCB8fCB2LmJvdW5jZVYgIT09IDApIHsKICAgICAgICB2LmJvdW5jZVYgKz0gMTUwMCAqIGR0OyB2LmJvdW5jZVkgKz0gdi5ib3VuY2VWICogZHQ7CiAgICAgICAgaWYgKHYuYm91bmNlWSA+PSAwKSB7IHYuYm91bmNlWSA9IDA7IHYuYm91bmNlViA9IE1hdGguYWJzKHYuYm91bmNlVikgPiAxMjAgPyAtTWF0aC5hYnModi5ib3VuY2VWKSAqIDAuMyA6IDA7IH0KICAgICAgfQogICAgICBpZiAodi5zdGF0ZSA9PT0gImRyaXZlIikgewogICAgICAgIGlmICh2LnN0dW4gPiAwKSB7IHYuc3R1biAtPSBkdDsgdi5yb3QgPSBNYXRoLnNpbihHLnQgKiAzMCkgKiAwLjA1OyBjb250aW51ZTsgfQogICAgICAgIHYucm90ID0gMDsKICAgICAgICB2YXIgdGd0ID0gYm9zcyAmJiBib3NzLnN0YXRlICE9PSAiZW50ZXIiICYmIGJvc3Muc3RhdGUgIT09ICJkb3duIiAmJiBNYXRoLmFicyhib3NzLnggLSB2LngpIDwgTWF0aC5hYnMoY2F0LnggLSB2LngpICogMC44ID8gYm9zcyA6IGNhdDsKICAgICAgICB2YXIgZHggPSB0Z3QueCAtIHYueCwgZGlzdCA9IE1hdGguYWJzKGR4KTsKICAgICAgICB2LmRpciA9IHNpZ24oZHgpOwogICAgICAgIGlmIChkaXN0ID4gdi5wcmVmICsgNDApIHYudnggPSBsZXJwKHYudngsIHYuZGlyICogZC5zcGVlZCwgZHQgKiAzKTsKICAgICAgICBlbHNlIGlmIChkaXN0IDwgdi5wcmVmIC0gODApIHYudnggPSBsZXJwKHYudngsIC12LmRpciAqIGQuc3BlZWQgKiAwLjcsIGR0ICogMyk7CiAgICAgICAgZWxzZSB2LnZ4ID0gbGVycCh2LnZ4LCAwLCBkdCAqIDQpOwogICAgICAgIHYueCArPSB2LnZ4ICogZHQ7CiAgICAgICAgdi5haW0gPSBNYXRoLmF0YW4yKCh0Z3QuZmVldCAtIDE4MCkgLSAodi55IC0gdi5oKSwgZHgpOwogICAgICAgIHYuZmlyZVQgLT0gZHQ7CiAgICAgICAgaWYgKHYuZmlyZVQgPD0gMCAmJiBkaXN0IDwgMTEwMCAmJiAhY2F0LmRlYWQpIHsKICAgICAgICAgIHZhciB0MiA9IGNhdFRhcmdldCgpOwogICAgICAgICAgaWYgKHYua2luZCA9PT0gInBvbGljZSIpIHsgZmlyZVNob3Qodi54ICsgdi5kaXIgKiAyMCwgdi55IC0gdi5oLCAiYnVsbGV0IiwgdDIpOyB2LmZpcmVUID0gZC5maXJlICsgcmFuZCgwLCAwLjYpOyB9CiAgICAgICAgICBlbHNlIGlmICh2LmtpbmQgPT09ICJ0cnVjayIpIHsgZm9yICh2YXIgayA9IDA7IGsgPCAzOyBrKyspIGZpcmVTaG90KHYueCArIHYuZGlyICogMzAsIHYueSAtIHYuaCAtIDYsICJidWxsZXQiLCB0Mik7IHYuZmlyZVQgPSBkLmZpcmUgKyByYW5kKDAsIDAuOCk7IH0KICAgICAgICAgIGVsc2UgaWYgKHYua2luZCA9PT0gInRhbmsiKSB7IGZpcmVTaG90KHYueCArIHYuZGlyICogNjAsIHYueSAtIHYuaCAtIDEwLCAic2hlbGwiLCB0Mik7IGFkZFBhcnQoeyB0eXBlOiAic21va2UiLCB4OiB2LnggKyB2LmRpciAqIDY0LCB5OiB2LnkgLSB2LmggLSAxMCwgdng6IHYuZGlyICogNjAsIHZ5OiAtMjAsIGxpZmU6IDAuOCwgdDogMCwgc2l6ZTogMTgsIGNvbDogIiNjZmM4YmMiIH0pOyB2LmZpcmVUID0gZC5maXJlICsgcmFuZCgwLCAxKTsgdi5mbGFzaFQgPSAwLjA4OyB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHYuc3RhdGUgPT09ICJ0cmFmZmljIikgewogICAgICAgIHZhciBuZWFyID0gTWF0aC5hYnMoY2F0LnggLSB2LngpIDwgNDIwOwogICAgICAgIGlmIChuZWFyKSB2LnZ4ID0gbGVycCh2LnZ4LCBzaWduKHYueCAtIGNhdC54KSAqIDI2MCwgZHQgKiAyKTsKICAgICAgICB2LnggKz0gdi52eCAqIGR0OyB2LmRpciA9IHNpZ24odi52eCk7CiAgICAgICAgaWYgKHYueCA8IHZpZXdMKCkgLSA2MDAgfHwgdi54ID4gdmlld1IoKSArIDYwMCkgeyB2ZWhpY2xlcy5zcGxpY2UoaSwgMSk7IGNvbnRpbnVlOyB9CiAgICAgIH0gZWxzZSBpZiAodi5zdGF0ZSA9PT0gInR1bWJsZSIpIHsKICAgICAgICB2LnZ5ICs9IDE1MDAgKiBkdDsgdi54ICs9IHYudnggKiBkdDsgdi55ICs9IHYudnkgKiBkdDsgdi5yb3QgKz0gdi52ciAqIGR0OwogICAgICAgIGlmIChNYXRoLnJhbmRvbSgpIDwgMC41KSBhZGRQYXJ0KHsgdHlwZTogInNtb2tlIiwgeDogdi54LCB5OiB2LnkgLSAxMCwgdng6IDAsIHZ5OiAtMjAsIGxpZmU6IDAuNiwgdDogMCwgc2l6ZTogMTIsIGNvbDogIiM1NTUiIH0pOwogICAgICAgIGlmICh2LnkgPCBTVFJFRVQgLSAyMCkgewogICAgICAgICAgdmFyIGIgPSBidWlsZGluZ0F0KHYueCwgdi55KTsKICAgICAgICAgIGlmIChiKSB7IGRhbWFnZUJ1aWxkaW5nKGIsIDEsIHYueCwgdi55LCBzaWduKHYudngpKTsgdi52eCAqPSAtMC4zOyB9CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGhJID0gMDsgaEkgPCBoZWxpcy5sZW5ndGg7IGhJKyspIHsgdmFyIGhoID0gaGVsaXNbaEldOyBpZiAoKGhoLnN0YXRlID09PSAiZmx5IiB8fCBoaC5zdGF0ZSA9PT0gInN0dW4iKSAmJiBNYXRoLmFicyhoaC54IC0gdi54KSA8IDcwICYmIE1hdGguYWJzKGhoLnkgLSB2LnkpIDwgNDUpIHsgbGF1bmNoSGVsaShoaCwgdi52eCAqIDAuNiwgLTIwMCwgMSk7IH0gfQogICAgICAgIGlmIChib3NzICYmIGJvc3Muc3RhdGUgIT09ICJkb3duIiAmJiBib3NzLnN0YXRlICE9PSAiZW50ZXIiICYmIE1hdGguYWJzKHYueCAtIGJvc3MueCkgPCAxMTAgJiYgdi55ID4gYm9zcy5mZWV0IC0gMjYwICYmIHYueSA8IGJvc3MuZmVldCAtIDIwICYmIHNpZ24odi52eCkgPT09IHNpZ24oYm9zcy54IC0gY2F0LngpKSB7CiAgICAgICAgICBodXJ0Qm9zcyg4LCBzaWduKHYudngpLCAwLjYpOyBleHBsb2RlKHYueCwgdi55IC0gMTAsIDAuNyk7IHYuZGVhZCA9IHRydWU7IHZlaGljbGVzLnNwbGljZShpLCAxKTsgYWRkRGVzdHJ1Y3Rpb24oZC5wdHMsIHYueCwgdi55KTsgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh2LnkgPj0gRkVFVCAmJiB2LnZ5ID4gMCkgewogICAgICAgICAgdi55ID0gRkVFVDsKICAgICAgICAgIGlmICh2LmtpbmQgPT09ICJjYXIiKSB7IHYuc3RhdGUgPSAiY3J1c2hlZCI7IHNwYXJrcyh2LngsIHYueSwgNik7IGRlYnJpcyh2LngsIHYueSAtIDEwLCAwLCAwLjUsIDUsIDAuNCk7IGFkZERlc3RydWN0aW9uKGQucHRzLCB2LngsIHYueSAtIDMwKTsgfQogICAgICAgICAgZWxzZSB7IGV4cGxvZGUodi54LCB2LnkgLSAyMCwgMC45KTsgYWRkRGVzdHJ1Y3Rpb24oZC5wdHMsIHYueCwgdi55IC0gMzApOyB2LnN0YXRlID0gImNydXNoZWQiOyB2LmJ1cm4gPSA0OyB9CiAgICAgICAgICB2LnJvdCA9IE1hdGgucm91bmQodi5yb3QgLyBNYXRoLlBJKSAqIE1hdGguUEk7IHYudnggPSAwOwogICAgICAgIH0KICAgICAgICBpZiAodi54IDwgdmlld0woKSAtIDkwMCB8fCB2LnggPiB2aWV3UigpICsgOTAwKSB7IGFkZERlc3RydWN0aW9uKGQucHRzKTsgdmVoaWNsZXMuc3BsaWNlKGksIDEpOyBjb250aW51ZTsgfQogICAgICB9IGVsc2UgaWYgKHYuc3RhdGUgPT09ICJjcnVzaGVkIikgewogICAgICAgIHYuYnVybiAtPSBkdDsKICAgICAgICBpZiAodi5idXJuID4gMCAmJiBNYXRoLnJhbmRvbSgpIDwgMC4zKSBhZGRQYXJ0KHsgdHlwZTogInNtb2tlIiwgeDogdi54ICsgcmFuZCgtMjAsIDIwKSwgeTogdi55IC0gMTAsIHZ4OiByYW5kKC0xMCwgMTApLCB2eTogLTUwLCBsaWZlOiAxLjIsIHQ6IDAsIHNpemU6IDE0LCBjb2w6ICIjM2EzNTMyIiB9KTsKICAgICAgICBpZiAodi54IDwgdmlld0woKSAtIDE0MDAgfHwgdi54ID4gdmlld1IoKSArIDE0MDApIHsgdmVoaWNsZXMuc3BsaWNlKGksIDEpOyBjb250aW51ZTsgfQogICAgICB9IGVsc2UgaWYgKHYuc3RhdGUgPT09ICJwYXJrZWQiKSB7CiAgICAgICAgaWYgKE1hdGguYWJzKGNhdC54IC0gdi54KSA8IDUwMCAmJiBNYXRoLnJhbmRvbSgpIDwgMC4wMSkgeyB2LnN0YXRlID0gInRyYWZmaWMiOyB2LnZ4ID0gc2lnbih2LnggLSBjYXQueCkgKiA2MDsgfQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzcGF3bkhlbGkoeCwgeSkgewogICAgdmFyIHNpZGUgPSB4ICE9PSB1bmRlZmluZWQgPyAwIDogKE1hdGgucmFuZG9tKCkgPCAwLjcgPyAxIDogLTEpOwogICAgdmFyIGh4ID0geCAhPT0gdW5kZWZpbmVkID8geCA6IChzaWRlID4gMCA\/IHZpZXdSKCkgKyAxMjAgOiB2aWV3TCgpIC0gMTIwKTsKICAgIHZhciBoID0geyB4OiBoeCwgeTogeSAhPT0gdW5kZWZpbmVkID8geSA6IHJhbmQoMjYwLCA0MjApLCB2eDogMCwgdnk6IDAsIHZhcmlhbnQ6IE1hdGgucmFuZG9tKCkgPCAwLjUgPyAxIDogMiwgc3RhdGU6ICJmbHkiLCByb3Q6IDAsIHZyOiAwLAogICAgICBvcmJpdDogcmFuZCgwLCBNYXRoLlBJICogMiksIG9yYml0UjogcmFuZCgyMzAsIDQwMCksIG9yYml0RGlyOiBNYXRoLnJhbmRvbSgpIDwgMC41ID8gMSA6IC0xLCBmaXJlVDogcmFuZCgxLjUsIDIuNSksIGZhY2U6IC0xLCBzdHVuOiAwLCBsaWZlOiAwLCBkZWFkOiBmYWxzZSwgYnVyc3Q6IDAsIGJ1cnN0VDogMCB9OwogICAgaGVsaXMucHVzaChoKTsKICAgIHJldHVybiBoOwogIH0KICBmdW5jdGlvbiBsYXVuY2hIZWxpKGgsIHZ4LCB2eSwgc3Bpbk11bCkgewogICAgaWYgKGguc3RhdGUgPT09ICJ0dW1ibGUiIHx8IGguZGVhZCkgcmV0dXJuOwogICAgaC5zdGF0ZSA9ICJ0dW1ibGUiOyBoLnZ4ID0gdng7IGgudnkgPSB2eTsgaC52ciA9IHNpZ24odngpICogcmFuZCgxMSwgMTgpICogKHNwaW5NdWwgfHwgMSk7IGgubGlmZSA9IDA7CiAgICBzcGFya3MoaC54LCBoLnksIDEwKTsKICB9CiAgZnVuY3Rpb24ga2lsbEhlbGkoaCwgaSkgewogICAgZXhwbG9kZShoLngsIGgueSwgMS4xKTsKICAgIGFkZERlc3RydWN0aW9uKDUwMCwgaC54LCBoLnksIHRydWUpOwogICAgaGVsaXMuc3BsaWNlKGksIDEpOwogIH0KICBmdW5jdGlvbiB1cGRhdGVIZWxpcyhkdCkgewogICAgZm9yICh2YXIgaSA9IGhlbGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHZhciBoID0gaGVsaXNbaV07CiAgICAgIGlmICghaCkgY29udGludWU7CiAgICAgIGgubGlmZSArPSBkdDsKICAgICAgaWYgKGguc3RhdGUgPT09ICJmbHkiIHx8IGguc3RhdGUgPT09ICJzdHVuIikgewogICAgICAgIGlmIChoLnN0YXRlID09PSAic3R1biIpIHsKICAgICAgICAgIGguc3R1biAtPSBkdDsgaC52eSArPSAxMjAgKiBkdDsgaC52eCAqPSAwLjk3OyBoLnJvdCA9IE1hdGguc2luKEcudCAqIDkpICogMC4zOwogICAgICAgICAgaC54ICs9IGgudnggKiBkdDsgaC55ICs9IGgudnkgKiBkdDsKICAgICAgICAgIGlmIChoLnN0dW4gPD0gMCkgaC5zdGF0ZSA9ICJmbHkiOwogICAgICAgICAgaWYgKGgueSA+IEZFRVQgLSA0MCkgeyBraWxsSGVsaShoLCBpKTsgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHZhciBmb2N1cyA9IGNhdDsKICAgICAgICBpZiAoYm9zcyAmJiBib3NzLnN0YXRlICE9PSAiZW50ZXIiICYmIGJvc3Muc3RhdGUgIT09ICJkb3duIiAmJiAoaSAlIDIgPT09IDEpKSBmb2N1cyA9IGJvc3M7CiAgICAgICAgaC5vcmJpdCArPSBkdCAqIDAuNTUgKiBoLm9yYml0RGlyOwogICAgICAgIHZhciB0eCA9IGZvY3VzLnggKyBNYXRoLmNvcyhoLm9yYml0KSAqIGgub3JiaXRSOwogICAgICAgIHZhciB0eSA9IChmb2N1cy5mZWV0IC0gQ0FUX0gpICsgNTAgKyBNYXRoLnNpbihoLm9yYml0ICogMS43KSAqIDcwOwogICAgICAgIHZhciBheCA9ICh0eCAtIGgueCkgKiAyLjIgLSBoLnZ4ICogMS42LCBheSA9ICh0eSAtIGgueSkgKiAyLjIgLSBoLnZ5ICogMS44OwogICAgICAgIGgudnggKz0gYXggKiBkdDsgaC52eSArPSBheSAqIGR0OwogICAgICAgIGgudnggPSBjbGFtcChoLnZ4LCAtMzgwLCAzODApOyBoLnZ5ID0gY2xhbXAoaC52eSwgLTI2MCwgMjYwKTsKICAgICAgICBoLnggKz0gaC52eCAqIGR0OyBoLnkgKz0gaC52eSAqIGR0OwogICAgICAgIGgueSA9IE1hdGgubWF4KGgueSwgMTQwKTsKICAgICAgICBoLmZhY2UgPSBzaWduKGZvY3VzLnggLSBoLngpOwogICAgICAgIGgucm90ID0gY2xhbXAoaC52eCAqIDAuMDAwOSwgLTAuMywgMC4zKSAqIGguZmFjZTsKICAgICAgICBoLmZpcmVUIC09IGR0OwogICAgICAgIHZhciBkID0gTWF0aC5hYnMoZm9jdXMueCAtIGgueCk7CiAgICAgICAgaWYgKGguZmlyZVQgPD0gMCAmJiBkIDwgOTAwICYmICFjYXQuZGVhZCkgewogICAgICAgICAgdmFyIHQyID0gY2F0VGFyZ2V0KCk7CiAgICAgICAgICBpZiAoaC52YXJpYW50ID09PSAxKSB7IGguYnVyc3QgPSA0OyBoLmJ1cnN0VCA9IDA7IGguZmlyZVQgPSByYW5kKDIuMCwgMy4wKTsgfQogICAgICAgICAgZWxzZSB7IGZpcmVTaG90KGgueCArIGguZmFjZSAqIDUwLCBoLnkgKyAxNiwgIm1pc3NpbGUiLCB0Mik7IGguZmlyZVQgPSByYW5kKDIuOCwgMy44KTsgfQogICAgICAgIH0KICAgICAgICBpZiAoaC5idXJzdCA+IDApIHsKICAgICAgICAgIGguYnVyc3RUIC09IGR0OwogICAgICAgICAgaWYgKGguYnVyc3RUIDw9IDApIHsgaC5idXJzdC0tOyBoLmJ1cnN0VCA9IDAuMDk7IGZpcmVTaG90KGgueCArIGguZmFjZSAqIDYwLCBoLnkgKyAyMCwgImJ1bGxldCIsIGNhdFRhcmdldCgpKTsgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChoLnN0YXRlID09PSAidHVtYmxlIikgewogICAgICAgIGgudnkgKz0gOTAwICogZHQ7IGgudnggKj0gTWF0aC5wb3coMC43LCBkdCk7IGgueCArPSBoLnZ4ICogZHQ7IGgueSArPSBoLnZ5ICogZHQ7IGgucm90ICs9IGgudnIgKiBkdDsKICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8IDAuOCkgYWRkUGFydCh7IHR5cGU6ICJzbW9rZSIsIHg6IGgueCAtIE1hdGguY29zKGgucm90KSAqIDQwLCB5OiBoLnkgLSBNYXRoLnNpbihoLnJvdCkgKiA0MCwgdng6IHJhbmQoLTIwLCAyMCksIHZ5OiAtMzAsIGxpZmU6IDAuOSwgdDogMCwgc2l6ZTogcmFuZCgxMCwgMTgpLCBjb2w6ICIjMmYyYjJhIiB9KTsKICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8IDAuMykgYWRkUGFydCh7IHR5cGU6ICJmaXJlIiwgeDogaC54LCB5OiBoLnksIHZ4OiByYW5kKC0zMCwgMzApLCB2eTogLTQwLCBsaWZlOiAwLjMsIHQ6IDAsIHNpemU6IDE0LCBjb2w6ICIjZmY4YTJhIiB9KTsKICAgICAgICB2YXIgaGl0ID0gZmFsc2U7CiAgICAgICAgaWYgKGgubGlmZSA+IDAuMTIpIHsKICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaGVsaXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgdmFyIG8gPSBoZWxpc1tqXTsKICAgICAgICAgICAgaWYgKG8gIT09IGggJiYgKG8uc3RhdGUgPT09ICJmbHkiIHx8IG8uc3RhdGUgPT09ICJzdHVuIikgJiYgTWF0aC5hYnMoby54IC0gaC54KSA8IDk1ICYmIE1hdGguYWJzKG8ueSAtIGgueSkgPCA1NSkgewogICAgICAgICAgICAgIGxhdW5jaEhlbGkobywgaC52eCAqIDAuNywgLTE1MCwgMSk7IGhpdCA9IHRydWU7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgYiA9IGgubGlmZSA+IDAuNTUgPyBidWlsZGluZ0F0KGgueCwgaC55KSA6IG51bGw7CiAgICAgICAgICBpZiAoYikgeyBkYW1hZ2VCdWlsZGluZyhiLCAyLCBoLngsIGgueSwgc2lnbihoLnZ4KSk7IGhpdCA9IHRydWU7IH0KICAgICAgICAgIGZvciAodmFyIEwgPSAwOyBMIDwgbGF1bmNoZXJzLmxlbmd0aDsgTCsrKSB7IHZhciBsYSA9IGxhdW5jaGVyc1tMXTsgaWYgKCFsYS5kZWFkICYmIGxhLmIuc3RhdGUgPT09ICJvayIgJiYgTWF0aC5hYnMobGEueCAtIGgueCkgPCA1MCAmJiBNYXRoLmFicyhsYXVuY2hlclkobGEpIC0gaC55KSA8IDUwKSB7IGtpbGxMYXVuY2hlcihsYSk7IGhpdCA9IHRydWU7IH0gfQogICAgICAgICAgaWYgKGJvc3MgJiYgYm9zcy5zdGF0ZSAhPT0gImRvd24iICYmIGJvc3Muc3RhdGUgIT09ICJlbnRlciIgJiYgTWF0aC5hYnMoaC54IC0gYm9zcy54KSA8IDEyMCAmJiBoLnkgPiBib3NzLmZlZXQgLSAyODAgJiYgc2lnbihoLnZ4KSA9PT0gc2lnbihib3NzLnggLSBjYXQueCkpIHsgaHVydEJvc3MoMTIsIHNpZ24oaC52eCksIDAuOCk7IGhpdCA9IHRydWU7IH0KICAgICAgICB9CiAgICAgICAgaWYgKGgueSA+IEZFRVQgLSAyMCkgaGl0ID0gdHJ1ZTsKICAgICAgICB2YXIgaWR4ID0gaGVsaXMuaW5kZXhPZihoKTsKICAgICAgICBpZiAoaGl0KSB7IGlmIChpZHggPj0gMCkga2lsbEhlbGkoaCwgaWR4KTsgY29udGludWU7IH0KICAgICAgICBpZiAoaC54IDwgdmlld0woKSAtIDUwMCB8fCBoLnggPiB2aWV3UigpICsgNTAwIHx8IGgueSA8IC00MDApIHsgYWRkRGVzdHJ1Y3Rpb24oNTAwLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSk7IGlmIChpZHggPj0gMCkgaGVsaXMuc3BsaWNlKGlkeCwgMSk7IGNvbnRpbnVlOyB9CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gYnVpbGRpbmdUb3AoYikgeyByZXR1cm4gU1RSRUVUIC0gYi5oICsgYi5zaW5rOyB9CiAgZnVuY3Rpb24gYnVpbGRpbmdBdCh4LCB5KSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1aWxkaW5ncy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYiA9IGJ1aWxkaW5nc1tpXTsKICAgICAgaWYgKGIuc3RhdGUgIT09ICJvayIpIGNvbnRpbnVlOwogICAgICBpZiAoeCA+IGIueCArIDYgJiYgeCA8IGIueCArIGIudyAtIDYgJiYgeSA+IGJ1aWxkaW5nVG9wKGIpICsgNiAmJiB5IDwgU1RSRUVUKSByZXR1cm4gYjsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBmdW5jdGlvbiBjYXJ2ZShnLCBseCwgbHksIHIpIHsKICAgIGcuc2F2ZSgpOwogICAgZy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAiZGVzdGluYXRpb24tb3V0IjsKICAgIGcuYmVnaW5QYXRoKCk7CiAgICB2YXIgbiA9IDgsIHB0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsgdmFyIGEgPSBpIC8gbiAqIE1hdGguUEkgKiAyICsgcmFuZCgtMC4yLCAwLjIpLCByciA9IHIgKiByYW5kKDAuNTUsIDEuMik7IHB0cy5wdXNoKFtseCArIE1hdGguY29zKGEpICogcnIsIGx5ICsgTWF0aC5zaW4oYSkgKiBycl0pOyB9CiAgICBnLm1vdmVUbyhwdHNbMF1bMF0sIHB0c1swXVsxXSk7CiAgICBmb3IgKHZhciBqID0gMTsgaiA8IG47IGorKykgZy5saW5lVG8ocHRzW2pdWzBdLCBwdHNbal1bMV0pOwogICAgZy5jbG9zZVBhdGgoKTsgZy5maWxsKCk7CiAgICBnLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICJzb3VyY2UtYXRvcCI7CiAgICBnLmxpbmVXaWR0aCA9IDU7IGcuc3Ryb2tlU3R5bGUgPSAicmdiYSg1NSw0NSw0MCwwLjkpIjsgZy5zdHJva2UoKTsKICAgIGcucmVzdG9yZSgpOwogIH0KICBmdW5jdGlvbiBkcmF3Q3JhY2tzKGcsIHcsIGgsIG4sIG94LCBveSkgewogICAgZy5zYXZlKCk7CiAgICBnLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICJzb3VyY2UtYXRvcCI7CiAgICBnLnN0cm9rZVN0eWxlID0gInJnYmEoMzUsMjUsMjIsMC45KSI7IGcubGluZUNhcCA9ICJyb3VuZCI7CiAgICBmb3IgKHZhciBrID0gMDsgayA8IG47IGsrKykgewogICAgICB2YXIgeCA9IG94ICE9PSB1bmRlZmluZWQgJiYgayA9PT0gMCA\/IG94IDogcmFuZCh3ICogMC4xLCB3ICogMC45KSwgeSA9IG95ICE9PSB1bmRlZmluZWQgJiYgayA9PT0gMCA\/IG95IDogcmFuZChoICogMC4xLCBoICogMC45KTsKICAgICAgZy5saW5lV2lkdGggPSByYW5kKDEuNSwgMyk7CiAgICAgIGcuYmVnaW5QYXRoKCk7IGcubW92ZVRvKHgsIHkpOwogICAgICB2YXIgYSA9IHJhbmQoMCwgTWF0aC5QSSAqIDIpOwogICAgICBmb3IgKHZhciBzID0gMDsgcyA8IDY7IHMrKykgewogICAgICAgIGEgKz0gcmFuZCgtMC45LCAwLjkpOyB2YXIgbCA9IHJhbmQoOCwgMjYpOyB4ICs9IE1hdGguY29zKGEpICogbDsgeSArPSBNYXRoLnNpbihhKSAqIGw7IGcubGluZVRvKHgsIHkpOwogICAgICAgIGlmIChNYXRoLnJhbmRvbSgpIDwgMC4zKSB7IGcubW92ZVRvKHgsIHkpOyBnLmxpbmVUbyh4ICsgcmFuZCgtMTQsIDE0KSwgeSArIHJhbmQoLTE0LCAxNCkpOyBnLm1vdmVUbyh4LCB5KTsgfQogICAgICB9CiAgICAgIGcuc3Ryb2tlKCk7CiAgICB9CiAgICBnLnJlc3RvcmUoKTsKICB9CiAgZnVuY3Rpb24gZGFtYWdlQnVpbGRpbmcoYiwgYW10LCBoeCwgaHksIGRpcikgewogICAgaWYgKGIuc3RhdGUgPT09ICJjb2xsYXBzaW5nIiB8fCBiLnN0YXRlID09PSAicnViYmxlIikgcmV0dXJuIGZhbHNlOwogICAgaWYgKGIuaGl0Q0QgPiAwKSByZXR1cm4gZmFsc2U7CiAgICBiLmhpdENEID0gMC4wODsKICAgIGlmIChiLnN0YXRlID09PSAicnVpbiIpIHsKICAgICAgYi5zdGF0ZSA9ICJydWJibGUiOyBkdXN0KGIueCArIGIudyAvIDIsIFNUUkVFVCAtIDIwLCAxNiwgYi53IC8gMiwgNjApOyBkZWJyaXMoaHgsIGh5LCBkaXIsIDAsIDEwLCAwLjYpOwogICAgICBhZGREZXN0cnVjdGlvbihCVC5ydWluLnB0cywgYi54ICsgYi53IC8gMiwgU1RSRUVUIC0gODApOyBzZngoImNvbGxhcHNlIik7IHJldHVybiB0cnVlOwogICAgfQogICAgdmFyIGdsID0gQlRbYi50eXBlXS5nbGFzczsKICAgIGIuaHAgLT0gYW10OwogICAgdmFyIGcgPSBiLmN2LmdldENvbnRleHQoIjJkIik7CiAgICB2YXIgbHggPSBjbGFtcChoeCAtIGIueCwgNCwgYi53IC0gNCksIGx5ID0gY2xhbXAoaHkgLSAoU1RSRUVUIC0gYi5oKSwgNCwgYi5oIC0gNCk7CiAgICBjYXJ2ZShnLCBseCwgbHksIHJhbmQoMTMsIDIyKSAqIE1hdGguc3FydChhbXQpKTsKICAgIGRyYXdDcmFja3MoZywgYi53LCBiLmgsIDEsIGx4LCBseSk7CiAgICBkZWJyaXMoaHgsIGh5LCBkaXIsIGdsLCAxMCArIGFtdCAqIDcsIDEpOwogICAgZHVzdChoeCwgaHksIDMsIDEwLCAzMCk7CiAgICB2YXIgciA9IGIuaHAgLyBiLm1heEhwOwogICAgaWYgKHIgPD0gMC42NyAmJiBiLmx2bCA8IDEpIHsgYi5sdmwgPSAxOyBkcmF3Q3JhY2tzKGcsIGIudywgYi5oLCA1KTsgfQogICAgaWYgKHIgPD0gMC4zNCAmJiBiLmx2bCA8IDIpIHsKICAgICAgYi5sdmwgPSAyOyBkcmF3Q3JhY2tzKGcsIGIudywgYi5oLCA2KTsKICAgICAgY2FydmUoZywgcmFuZCgwLCBiLncgKiAwLjMpLCByYW5kKDAsIDMwKSwgcmFuZCgyMiwgNDApKTsKICAgICAgY2FydmUoZywgcmFuZChiLncgKiAwLjcsIGIudyksIHJhbmQoMCwgNDApLCByYW5kKDIyLCA0MCkpOwogICAgICBjYXJ2ZShnLCByYW5kKGIudyAqIDAuMiwgYi53ICogMC44KSwgcmFuZChiLmggKiAwLjIsIGIuaCAqIDAuNSksIHJhbmQoMTgsIDMwKSk7CiAgICAgIGRlYnJpcyhiLnggKyBiLncgLyAyLCBTVFJFRVQgLSBiLmggKyAyMCwgZGlyLCBnbCwgMTQsIDAuOCk7CiAgICB9CiAgICBhZGREZXN0cnVjdGlvbig2MCwgaHgsIGh5KTsKICAgIGlmIChiLmhwIDw9IDApIHN0YXJ0Q29sbGFwc2UoYiwgZGlyKTsKICAgIHJldHVybiB0cnVlOwogIH0KICBmdW5jdGlvbiBzdGFydENvbGxhcHNlKGIsIGRpcikgewogICAgYi5zdGF0ZSA9ICJjb2xsYXBzaW5nIjsgYi5jb2xsVCA9IDA7IGIuc2lua1YgPSA0MDsgYi5sZWFuID0gZGlyICogMC4wNTsKICAgIGFkZERlc3RydWN0aW9uKEJUW2IudHlwZV0ucHRzLCBiLnggKyBiLncgLyAyLCBTVFJFRVQgLSBiLmggKiAwLjYsIHRydWUpOwogICAgYWRkVGV4dCgiQ1JBU0ghIiwgYi54ICsgYi53IC8gMiwgU1RSRUVUIC0gYi5oICogMC41LCA1NiwgIiNmZmNmNmEiLCAxLjEsIDAuNCk7CiAgICBzZngoImNvbGxhcHNlIik7CiAgICBHLnNoYWtlID0gTWF0aC5tYXgoRy5zaGFrZSwgMTApOwogICAgaWYgKGIubGF1bmNoZXIgJiYgIWIubGF1bmNoZXIuZGVhZCkga2lsbExhdW5jaGVyKGIubGF1bmNoZXIpOwogIH0KICBmdW5jdGlvbiB1cGRhdGVCdWlsZGluZ3MoZHQpIHsKICAgIHZhciB2bCA9IHZpZXdMKCkgLSAzMDAsIHZyID0gdmlld1IoKSArIDMwMDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVpbGRpbmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBiID0gYnVpbGRpbmdzW2ldOwogICAgICBpZiAoYi5oaXRDRCA+IDApIGIuaGl0Q0QgLT0gZHQ7CiAgICAgIGlmIChiLnN0YXRlID09PSAiY29sbGFwc2luZyIpIHsKICAgICAgICBiLmNvbGxUICs9IGR0OyBiLnNpbmtWICs9IDM4MCAqIGR0OyBiLnNpbmsgKz0gYi5zaW5rViAqIGR0OwogICAgICAgIEcuc2hha2UgPSBNYXRoLm1heChHLnNoYWtlLCAzKTsKICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8IDAuMzUpIGR1c3QoYi54ICsgcmFuZCgwLCBiLncpLCBTVFJFRVQgLSAxMCwgMSwgNCwgNTUpOwogICAgICAgIGlmIChNYXRoLnJhbmRvbSgpIDwgMC40KSBkZWJyaXMoYi54ICsgcmFuZCgwLCBiLncpLCBTVFJFRVQgLSBiLmggKyBiLnNpbmssIHBpY2soWy0xLCAxXSksIEJUW2IudHlwZV0uZ2xhc3MsIDEsIDAuNSk7CiAgICAgICAgaWYgKGIuc2luayA+PSBiLmggKiAwLjkpIHsKICAgICAgICAgIGIuc3RhdGUgPSAicnVpbiI7IGIucnVpbkggPSBNYXRoLm1pbihiLmggKiAwLjYsIGIudyAqIChJTUcuYmxkX3J1aW4uaGVpZ2h0IC8gSU1HLmJsZF9ydWluLndpZHRoKSAqIDAuNzUpOwogICAgICAgICAgZHVzdChiLnggKyBiLncgLyAyLCBTVFJFRVQgLSAyMCwgMTIsIGIudyAvIDIsIDcwKTsKICAgICAgICAgIGIuc21va2VUID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKChiLnN0YXRlID09PSAicnVpbiIgJiYgYi50eXBlICE9PSAicnVpbiIpIHx8IGIuc3RhdGUgPT09ICJydWJibGUiKSB7CiAgICAgICAgaWYgKGIueCA+IHZsICYmIGIueCA8IHZyKSB7CiAgICAgICAgICBiLnNtb2tlVCAtPSBkdDsKICAgICAgICAgIGlmIChiLnNtb2tlVCA8PSAwKSB7IGIuc21va2VUID0gcmFuZCgwLjE4LCAwLjQpOyBiZ1BhcnRzLnB1c2goeyB0eXBlOiAic21va2UiLCB4OiBiLnggKyByYW5kKGIudyAqIDAuMiwgYi53ICogMC44KSwgeTogU1RSRUVUIC0gMzAsIHZ4OiByYW5kKDUsIDI1KSwgdnk6IHJhbmQoLTYwLCAtMzUpLCBsaWZlOiByYW5kKDQsIDYpLCB0OiAwLCBzaXplOiByYW5kKDI0LCA0MCksIGNvbDogIiMyYjI2MjgiIH0pOyBpZiAoYmdQYXJ0cy5sZW5ndGggPiAyMjApIGJnUGFydHMuc2hpZnQoKTsgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBsYXVuY2hlclkoTCkgeyByZXR1cm4gYnVpbGRpbmdUb3AoTC5iKSAtIDEyOyB9CiAgZnVuY3Rpb24ga2lsbExhdW5jaGVyKEwpIHsKICAgIGlmIChMLmRlYWQpIHJldHVybjsKICAgIEwuZGVhZCA9IHRydWU7IGV4cGxvZGUoTC54LCBsYXVuY2hlclkoTCksIDAuOCk7IGFkZERlc3RydWN0aW9uKDMwMCwgTC54LCBsYXVuY2hlclkoTCkpOwogIH0KICBmdW5jdGlvbiB1cGRhdGVMYXVuY2hlcnMoZHQpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGF1bmNoZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBMID0gbGF1bmNoZXJzW2ldOwogICAgICBpZiAoTC5kZWFkIHx8IEwuYi5zdGF0ZSAhPT0gIm9rIikgY29udGludWU7CiAgICAgIHZhciBkeCA9IGNhdC54IC0gTC54OwogICAgICBpZiAoTWF0aC5hYnMoZHgpID4gMTAwMCkgY29udGludWU7CiAgICAgIEwuYWltID0gTWF0aC5hdGFuMigoY2F0LmZlZXQgLSAyMDApIC0gbGF1bmNoZXJZKEwpLCBkeCk7CiAgICAgIEwuZmlyZVQgLT0gZHQ7CiAgICAgIGlmIChMLmZpcmVUIDw9IDAgJiYgIWNhdC5kZWFkKSB7CiAgICAgICAgTC5maXJlVCA9IHJhbmQoMywgNC4yKTsKICAgICAgICB2YXIgcyA9IGZpcmVTaG90KEwueCArIE1hdGguY29zKEwuYWltKSAqIDIwLCBsYXVuY2hlclkoTCkgLSA2LCAibWlzc2lsZSIsIGNhdFRhcmdldCgpKTsKICAgICAgICBzLnZ4ID0gc2lnbihkeCkgKiAzMDA7IHMudnkgPSAtMjYwOwogICAgICAgIGFkZFBhcnQoeyB0eXBlOiAic21va2UiLCB4OiBMLngsIHk6IGxhdW5jaGVyWShMKSwgdng6IDAsIHZ5OiAtNDAsIGxpZmU6IDAuOSwgdDogMCwgc2l6ZTogMjAsIGNvbDogIiNkOGQwYzQiIH0pOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzcGF3bkpldCgpIHsKICAgIHZhciBkaXIgPSBNYXRoLnJhbmRvbSgpIDwgMC43ID8gLTEgOiAxOwogICAgamV0cy5wdXNoKHsgeDogZGlyIDwgMCA\/IHZpZXdSKCkgKyAzMDAgOiB2aWV3TCgpIC0gMzAwLCB5OiByYW5kKDE1MCwgMjMwKSwgdng6IGRpciAqIDExMDAsIGRpcjogZGlyLCBkcm9wcGVkOiAwLCBkZWFkOiBmYWxzZSwgc3RhdGU6ICJmbHkiLCByb3Q6IDAsIHZ5OiAwLCB2cjogMCwgZHJvcFQ6IDAgfSk7CiAgICBzZngoImpldCIpOwogIH0KICBmdW5jdGlvbiB1cGRhdGVKZXRzKGR0KSB7CiAgICBmb3IgKHZhciBpID0gamV0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICB2YXIgaiA9IGpldHNbaV07CiAgICAgIGoueCArPSBqLnZ4ICogZHQ7CiAgICAgIGlmIChqLnN0YXRlID09PSAidHVtYmxlIikgeyBqLnZ5ICs9IDkwMCAqIGR0OyBqLnkgKz0gai52eSAqIGR0OyBqLnJvdCArPSBqLnZyICogZHQ7IGlmIChqLnkgPiBGRUVUIC0gMzApIHsgZXhwbG9kZShqLngsIGoueSwgMS40KTsgYWRkRGVzdHJ1Y3Rpb24oODAwLCBqLngsIGoueSwgdHJ1ZSk7IGpldHMuc3BsaWNlKGksIDEpOyB9IGNvbnRpbnVlOyB9CiAgICAgIHZhciBhaGVhZCA9IChjYXQueCAtIGoueCkgKiBqLmRpcjsKICAgICAgaWYgKGFoZWFkIDwgMjYwICYmIGFoZWFkID4gLTIwMCAmJiBqLmRyb3BwZWQgPCAzKSB7CiAgICAgICAgai5kcm9wVCAtPSBkdDsKICAgICAgICBpZiAoai5kcm9wVCA8PSAwKSB7IGouZHJvcFQgPSAwLjEyOyBqLmRyb3BwZWQrKzsgdmFyIHMgPSBmaXJlU2hvdChqLngsIGoueSArIDEwLCAibWlzc2lsZSIsIHsgeDogY2F0LnggKyByYW5kKC0xMjAsIDEyMCksIHk6IGNhdC5mZWV0IC0gMTUwLCB3aG86ICJjYXQiIH0pOyBzLnZ4ID0gai52eCAqIDAuMzsgfQogICAgICB9CiAgICAgIGlmICgoai5kaXIgPCAwICYmIGoueCA8IHZpZXdMKCkgLSA2MDApIHx8IChqLmRpciA+IDAgJiYgai54ID4gdmlld1IoKSArIDYwMCkpIGpldHMuc3BsaWNlKGksIDEpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY2F0SHVydGJveCgpIHsgcmV0dXJuIHsgeDA6IGNhdC54IC0gMTE1LCB4MTogY2F0LnggKyAxMTUsIHkwOiBjYXQuZmVldCAtIENBVF9IICogMC45MiwgeTE6IGNhdC5mZWV0IH07IH0KICBmdW5jdGlvbiBib3NzSHVydGJveCgpIHsgcmV0dXJuIHsgeDA6IGJvc3MueCAtIDExNSwgeDE6IGJvc3MueCArIDExNSwgeTA6IGJvc3MuZmVldCAtIENBVF9IICogMC45NSwgeTE6IGJvc3MuZmVldCB9OyB9CiAgZnVuY3Rpb24gaW5Cb3goeCwgeSwgYikgeyByZXR1cm4geCA+IGIueDAgJiYgeCA8IGIueDEgJiYgeSA+IGIueTAgJiYgeSA8IGIueTE7IH0KICBmdW5jdGlvbiB1cGRhdGVTaG90cyhkdCkgewogICAgZm9yICh2YXIgaSA9IHNob3RzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHZhciBzID0gc2hvdHNbaV07CiAgICAgIGlmICghcykgY29udGludWU7CiAgICAgIHMubGlmZSAtPSBkdDsKICAgICAgaWYgKHMua2luZCA9PT0gIm1pc3NpbGUiKSB7CiAgICAgICAgaWYgKHMub3duZXIgPT09ICJtaWwiKSB7CiAgICAgICAgICB2YXIgdGcgPSBzLnRndCA9PT0gImJvc3MiICYmIGJvc3MgPyBib3NzIDogY2F0OwogICAgICAgICAgdmFyIHdhbnQgPSBNYXRoLmF0YW4yKCh0Zy5mZWV0IC0gMTYwKSAtIHMueSwgdGcueCAtIHMueCksIGN1ciA9IE1hdGguYXRhbjIocy52eSwgcy52eCk7CiAgICAgICAgICB2YXIgZGEgPSB3YW50IC0gY3VyOyB3aGlsZSAoZGEgPiBNYXRoLlBJKSBkYSAtPSBNYXRoLlBJICogMjsgd2hpbGUgKGRhIDwgLU1hdGguUEkpIGRhICs9IE1hdGguUEkgKiAyOwogICAgICAgICAgY3VyICs9IGNsYW1wKGRhLCAtMS42ICogZHQsIDEuNiAqIGR0KTsKICAgICAgICAgIHZhciBzcCA9IE1hdGgubWluKDUyMCwgTWF0aC5zcXJ0KHMudnggKiBzLnZ4ICsgcy52eSAqIHMudnkpICsgMjAwICogZHQpOwogICAgICAgICAgcy52eCA9IE1hdGguY29zKGN1cikgKiBzcDsgcy52eSA9IE1hdGguc2luKGN1cikgKiBzcDsKICAgICAgICB9CiAgICAgICAgcy50cmFpbFQgLT0gZHQ7CiAgICAgICAgaWYgKHMudHJhaWxUIDw9IDApIHsgcy50cmFpbFQgPSAwLjAyOyBhZGRQYXJ0KHsgdHlwZTogInNtb2tlIiwgeDogcy54LCB5OiBzLnksIHZ4OiByYW5kKC0xMCwgMTApLCB2eTogcmFuZCgtMTAsIDEwKSwgbGlmZTogMC42LCB0OiAwLCBzaXplOiA4LCBjb2w6ICIjZDZkMGM4IiB9KTsgfQogICAgICB9IGVsc2UgaWYgKHMua2luZCA9PT0gInNoZWxsIikgeyBzLnZ5ICs9IDEyMCAqIGR0OyB9CiAgICAgIHMueCArPSBzLnZ4ICogZHQ7IHMueSArPSBzLnZ5ICogZHQ7CiAgICAgIHZhciBnb25lID0gcy5saWZlIDw9IDAgfHwgcy55ID4gSCArIDIwOwogICAgICBpZiAoIWdvbmUgJiYgcy5vd25lciA9PT0gIm1pbCIpIHsKICAgICAgICBpZiAoIWNhdC5kZWFkICYmIGluQm94KHMueCwgcy55LCBjYXRIdXJ0Ym94KCkpKSB7IGh1cnRDYXQocy5kbWcsIHNpZ24ocy52eCkpOyBpZiAocy5raW5kICE9PSAiYnVsbGV0IikgZXhwbG9kZShzLngsIHMueSwgMC42KTsgZWxzZSBzcGFya3Mocy54LCBzLnksIDMpOyBnb25lID0gdHJ1ZTsgfQogICAgICAgIGVsc2UgaWYgKGJvc3MgJiYgYm9zcy5zdGF0ZSAhPT0gImRvd24iICYmIGJvc3Muc3RhdGUgIT09ICJlbnRlciIgJiYgaW5Cb3gocy54LCBzLnksIGJvc3NIdXJ0Ym94KCkpKSB7IGh1cnRCb3NzKHMua2luZCA9PT0gImJ1bGxldCIgPyAwLjYgOiA0LCBzaWduKHMudngpLCAwKTsgaWYgKHMua2luZCAhPT0gImJ1bGxldCIpIGV4cGxvZGUocy54LCBzLnksIDAuNik7IGVsc2Ugc3BhcmtzKHMueCwgcy55LCAzKTsgZ29uZSA9IHRydWU7IH0KICAgICAgfSBlbHNlIGlmICghZ29uZSAmJiBzLm93bmVyID09PSAiY2F0IikgewogICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgaGVsaXMubGVuZ3RoOyBrKyspIHsgdmFyIGggPSBoZWxpc1trXTsgaWYgKGguc3RhdGUgIT09ICJ0dW1ibGUiICYmIE1hdGguYWJzKGgueCAtIHMueCkgPCA3MCAmJiBNYXRoLmFicyhoLnkgLSBzLnkpIDwgNDApIHsgbGF1bmNoSGVsaShoLCBzLnZ4ICogMC44LCAtMjAwLCAxKTsgZ29uZSA9IHRydWU7IGJyZWFrOyB9IH0KICAgICAgICBpZiAoIWdvbmUpIGZvciAodmFyIG0gPSAwOyBtIDwgdmVoaWNsZXMubGVuZ3RoOyBtKyspIHsgdmFyIHYgPSB2ZWhpY2xlc1ttXTsgaWYgKHYuc3RhdGUgPT09ICJkcml2ZSIgJiYgTWF0aC5hYnModi54IC0gcy54KSA8IHYudyAvIDIgKyAxMCAmJiBzLnkgPiB2LnkgLSB2LmggLSAxMCkgeyBleHBsb2RlKHMueCwgcy55LCAwLjgpOyBsYXVuY2hWZWhpY2xlKHYsIHNpZ24ocy52eCkgKiAzMDAsIC02MDAsIDgpOyBnb25lID0gdHJ1ZTsgYnJlYWs7IH0gfQogICAgICAgIGlmICghZ29uZSAmJiBib3NzICYmIGJvc3Muc3RhdGUgIT09ICJkb3duIiAmJiBib3NzLnN0YXRlICE9PSAiZW50ZXIiICYmIGluQm94KHMueCwgcy55LCBib3NzSHVydGJveCgpKSkgeyBodXJ0Qm9zcygxNSwgc2lnbihzLnZ4KSwgMC41KTsgZXhwbG9kZShzLngsIHMueSwgMC45KTsgZ29uZSA9IHRydWU7IH0KICAgICAgICBpZiAoIWdvbmUpIHsgdmFyIGIgPSBidWlsZGluZ0F0KHMueCwgcy55KTsgaWYgKGIpIHsgZGFtYWdlQnVpbGRpbmcoYiwgMiwgcy54LCBzLnksIHNpZ24ocy52eCkpOyBleHBsb2RlKHMueCwgcy55LCAwLjgpOyBnb25lID0gdHJ1ZTsgfSB9CiAgICAgICAgaWYgKCFnb25lICYmIHMueSA+IEZFRVQgLSAxMCkgeyBleHBsb2RlKHMueCwgcy55LCAwLjcpOyBnb25lID0gdHJ1ZTsgfQogICAgICB9CiAgICAgIGlmICghZ29uZSAmJiBzLmtpbmQgIT09ICJidWxsZXQiICYmIHMueSA+IEZFRVQgLSA1KSB7IGV4cGxvZGUocy54LCBzLnksIDAuNik7IGdvbmUgPSB0cnVlOyB9CiAgICAgIGlmIChnb25lKSB7IHZhciBpeCA9IHNob3RzLmluZGV4T2Yocyk7IGlmIChpeCA+PSAwKSBzaG90cy5zcGxpY2UoaXgsIDEpOyB9CiAgICB9CiAgfQogIHZhciBBQ1RTID0gewogICAgc3dpcGU6IHsgd2luZDogMC4wNzUsIGFjdGl2ZTogMC4xLCByZWM6IDAuMTcgfSwKICAgIGhlYXZ5OiB7IHdpbmQ6IDAuMiwgYWN0aXZlOiAwLjEyLCByZWM6IDAuMjYgfSwKICAgIHRhaWw6IHsgd2luZDogMC4wNywgYWN0aXZlOiAwLjE0LCByZWM6IDAuMiB9LAogICAgcm9hcjogeyB3aW5kOiAwLjE1LCBhY3RpdmU6IDAuNTUsIHJlYzogMC4yNSB9LAogICAgc3BlY2lhbDogeyB3aW5kOiAwLjQyLCBhY3RpdmU6IDAuMDgsIHJlYzogMC41IH0sCiAgICBjcm91Y2g6IHsgd2luZDogMC4xMiwgYWN0aXZlOiAwLCByZWM6IDAgfQogIH07CiAgZnVuY3Rpb24gc3RhcnRBY3QodHlwZSwgb3B0cykgewogICAgdmFyIGQgPSBBQ1RTW3R5cGVdOwogICAgY2F0LmFjdCA9IHsgdHlwZTogdHlwZSwgdDogMCwgd2luZDogZC53aW5kLCBhY3RpdmU6IGQuYWN0aXZlLCByZWM6IGQucmVjLCBoaXREb25lOiBmYWxzZSwgaWR4OiAob3B0cyAmJiBvcHRzLmlkeCkgfHwgMCwgZmluaXNoZXI6ICEhKG9wdHMgJiYgb3B0cy5maW5pc2hlcikgfTsKICAgIGlmICh0eXBlID09PSAic3dpcGUiIHx8IHR5cGUgPT09ICJoZWF2eSIgfHwgdHlwZSA9PT0gInRhaWwiKSBzZngoIndob29zaCIpOwogIH0KICBmdW5jdGlvbiBpblJlY292ZXJ5KCkgeyB2YXIgYSA9IGNhdC5hY3Q7IHJldHVybiBhICYmIGEudCA+PSBhLndpbmQgKyBhLmFjdGl2ZTsgfQogIGZ1bmN0aW9uIHByZXNzQWN0aW9uKG4pIHsKICAgIGlmIChHLnN0YXRlICE9PSAicGxheSIgfHwgY2F0LmRlYWQgfHwgRy5wb3J0cmFpdFBhdXNlKSByZXR1cm47CiAgICBpbml0QXVkaW8oKTsKICAgIGlmIChuID09PSAianVtcCIpIHsgdHJ5SnVtcCgpOyByZXR1cm47IH0KICAgIGlmICghY2F0Lm9uR3JvdW5kKSB7CiAgICAgIGlmICgobiA9PT0gInN3aXBlIiB8fCBuID09PSAiaGVhdnkiKSAmJiAhY2F0LmFpclNsYW0pIHsgY2F0LmFpclNsYW0gPSB0cnVlOyBjYXQudnkgPSBNYXRoLm1heChjYXQudnksIDEzMDApOyBhZGRUZXh0KCJTTEFNISIsIGNhdC54LCBjYXQuZmVldCAtIENBVF9IIC0gMjAsIDQwLCAiI2ZmZiIsIDAuNSwgMC4zKTsgfQogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAobiA9PT0gInNwZWNpYWwiICYmIGNhdC5wb3dlciA8IDEwMCkgcmV0dXJuOwogICAgaWYgKG4gPT09ICJyb2FyIiAmJiBjYXQucm9hckNEID4gMCkgcmV0dXJuOwogICAgaWYgKGNhdC5hY3QpIHsKICAgICAgaWYgKGNhdC5hY3QudHlwZSA9PT0gInNwZWNpYWwiIHx8IGNhdC5hY3QudHlwZSA9PT0gInJvYXIiIHx8IGNhdC5hY3QudHlwZSA9PT0gImNyb3VjaCIpIHJldHVybjsKICAgICAgY2F0LmJ1ZmZlciA9IG47CiAgICAgIHJldHVybjsKICAgIH0KICAgIGRvU3RhcnQobik7CiAgfQogIGZ1bmN0aW9uIGRvU3RhcnQobikgewogICAgaWYgKG4gPT09ICJzd2lwZSIpIHsKICAgICAgdmFyIGlkeCA9IGNhdC5jb21ib1QgPiAwID8gY2F0LmNvbWJvIDogMDsKICAgICAgaWYgKGlkeCA+PSAyKSB7IGNhdC5jb21ibyA9IDA7IGNhdC5jb21ib1QgPSAwOyBzdGFydEFjdCgiaGVhdnkiLCB7IGZpbmlzaGVyOiB0cnVlIH0pOyByZXR1cm47IH0KICAgICAgY2F0LmNvbWJvID0gaWR4ICsgMTsgc3RhcnRBY3QoInN3aXBlIiwgeyBpZHg6IGlkeCB9KTsKICAgIH0gZWxzZSBpZiAobiA9PT0gImhlYXZ5IikgeyBjYXQuY29tYm8gPSAwOyBzdGFydEFjdCgiaGVhdnkiKTsgfQogICAgZWxzZSBpZiAobiA9PT0gInRhaWwiKSBzdGFydEFjdCgidGFpbCIpOwogICAgZWxzZSBpZiAobiA9PT0gInJvYXIiKSB7IGlmIChjYXQucm9hckNEID4gMCkgcmV0dXJuOyBjYXQucm9hckNEID0gMy4yOyBzdGFydEFjdCgicm9hciIpOyB9CiAgICBlbHNlIGlmIChuID09PSAic3BlY2lhbCIpIHsgaWYgKGNhdC5wb3dlciA8IDEwMCkgcmV0dXJuOyBjYXQucG93ZXIgPSAwOyBzdGFydEFjdCgic3BlY2lhbCIpOyB9CiAgfQogIGZ1bmN0aW9uIHRyeUp1bXAoKSB7CiAgICBpZiAoIWNhdC5vbkdyb3VuZCkgcmV0dXJuOwogICAgaWYgKGNhdC5hY3QgJiYgIWluUmVjb3ZlcnkoKSkgeyBjYXQuYnVmZmVyID0gImp1bXAiOyByZXR1cm47IH0KICAgIGNhdC5hY3QgPSBudWxsOyBzdGFydEFjdCgiY3JvdWNoIik7CiAgfQogIGZ1bmN0aW9uIGh1cnRDYXQoZG1nLCBkaXIpIHsKICAgIGlmIChjYXQuZGVhZCB8fCBHLnN0YXRlICE9PSAicGxheSIpIHJldHVybjsKICAgIGlmIChHLmdvZCkgcmV0dXJuOwogICAgY2F0LmhwIC09IGRtZzsgY2F0Lmh1cnRUID0gTWF0aC5tYXgoY2F0Lmh1cnRULCBkbWcgPj0gMyA\/IDAuMTYgOiAwLjA2KTsKICAgIGlmIChjYXQuaHAgPD0gMCkgeyBjYXQuaHAgPSAwOyBjYXQuZGVhZCA9IHRydWU7IGNhdC5kZWFkVCA9IDA7IGNhdC5hY3QgPSBudWxsOyBHLnNoYWtlID0gMjA7IHNmeCgiY29sbGFwc2UiKTsgYWRkVGV4dCgiS0FJSlUgRE9XTiIsIGNhdC54LCBjYXQuZmVldCAtIENBVF9IIC0gNDAsIDY0LCAiI2ZmNzA2MCIsIDIuNSwgMC4yKTsgfQogIH0KCiAgZnVuY3Rpb24gaGl0VGFyZ2V0cyhraW5kLCBib3gsIGYsIHBvd2VyKSB7CiAgICB2YXIgaGl0cyA9IDAsIGZpcnN0WCA9IG51bGwsIGZpcnN0WSA9IG51bGwsIGtiID0gcG93ZXI7CiAgICBmdW5jdGlvbiBtYXJrKHgsIHkpIHsgaGl0cysrOyBpZiAoZmlyc3RYID09PSBudWxsKSB7IGZpcnN0WCA9IHg7IGZpcnN0WSA9IHk7IH0gfQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWxpcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgaCA9IGhlbGlzW2ldOwogICAgICBpZiAoaC5zdGF0ZSA9PT0gInR1bWJsZSIpIGNvbnRpbnVlOwogICAgICBpZiAoaC54ICsgNjAgPiBib3gueDAgJiYgaC54IC0gNjAgPCBib3gueDEgJiYgaC55ICsgMzAgPiBib3gueTAgJiYgaC55IC0gMzAgPCBib3gueTEpIHsKICAgICAgICB2YXIgZGlyWCA9IGtpbmQgPT09ICJzcGVjaWFsIiA\/IHNpZ24oaC54IC0gY2F0LngpIDogZjsKICAgICAgICBsYXVuY2hIZWxpKGgsIGRpclggKiByYW5kKDgyMCwgMTEwMCkgKiBrYiwgLXJhbmQoMjUwLCA0ODApICoga2IsIGtiID4gMS4yID8gMS40IDogMSk7CiAgICAgICAgbWFyayhoLngsIGgueSk7CiAgICAgIH0KICAgIH0KICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmVoaWNsZXMubGVuZ3RoOyBqKyspIHsKICAgICAgdmFyIHYgPSB2ZWhpY2xlc1tqXTsKICAgICAgaWYgKHYuc3RhdGUgPT09ICJ0dW1ibGUiIHx8IHYuZGVhZCkgY29udGludWU7CiAgICAgIGlmICh2LnggKyB2LncgLyAyID4gYm94LngwICYmIHYueCAtIHYudyAvIDIgPCBib3gueDEgJiYgdi55ID4gYm94LnkwICYmIHYueSAtIHYuaCA8IGJveC55MSkgewogICAgICAgIHZhciBkdiA9IGtpbmQgPT09ICJzcGVjaWFsIiA\/IHNpZ24odi54IC0gY2F0LngpIDogZjsKICAgICAgICB2YXIgaGVhdnlNdWwgPSB2LmtpbmQgPT09ICJ0YW5rIiA\/IDAuOCA6IDE7CiAgICAgICAgaWYgKHYuc3RhdGUgPT09ICJjcnVzaGVkIikgbGF1bmNoVmVoaWNsZSh2LCBkdiAqIHJhbmQoNTAwLCA3MDApICoga2IsIC1yYW5kKDUwMCwgNzAwKSwgZHYgKiByYW5kKDgsIDE0KSk7CiAgICAgICAgZWxzZSBsYXVuY2hWZWhpY2xlKHYsIGR2ICogcmFuZCg2MDAsIDgyMCkgKiBrYiAqIGhlYXZ5TXVsLCAtcmFuZCg2NTAsIDkwMCkgKiBNYXRoLm1pbigxLjMsIGtiKSwgZHYgKiByYW5kKDksIDE1KSk7CiAgICAgICAgbWFyayh2LngsIHYueSAtIHYuaCAvIDIpOwogICAgICB9CiAgICB9CiAgICBmb3IgKHZhciBrID0gMDsgayA8IHNob3RzLmxlbmd0aDsgaysrKSB7CiAgICAgIHZhciBzID0gc2hvdHNba107CiAgICAgIGlmIChzLm93bmVyID09PSAibWlsIiAmJiBzLmtpbmQgIT09ICJidWxsZXQiICYmIHMueCA+IGJveC54MCAmJiBzLnggPCBib3gueDEgJiYgcy55ID4gYm94LnkwICYmIHMueSA8IGJveC55MSkgewogICAgICAgIHMub3duZXIgPSAiY2F0Ijsgcy52eCA9IChraW5kID09PSAic3BlY2lhbCIgPyBzaWduKHMueCAtIGNhdC54KSA6IGYpICogOTAwOyBzLnZ5ID0gcmFuZCgtMjAwLCA2MCk7IHMubGlmZSA9IDIuNTsgbWFyayhzLngsIHMueSk7CiAgICAgICAgYWRkVGV4dCgiREVGTEVDVCIsIHMueCwgcy55IC0gMjAsIDI2LCAiIzlmZThmZiIsIDAuNiwgMC42KTsKICAgICAgfQogICAgfQogICAgZm9yICh2YXIgbSA9IDA7IG0gPCBqZXRzLmxlbmd0aDsgbSsrKSB7CiAgICAgIHZhciBqdCA9IGpldHNbbV07CiAgICAgIGlmIChqdC5zdGF0ZSAhPT0gInR1bWJsZSIgJiYganQueCArIDYwID4gYm94LngwICYmIGp0LnggLSA2MCA8IGJveC54MSAmJiBqdC55ICsgMjUgPiBib3gueTAgJiYganQueSAtIDI1IDwgYm94LnkxKSB7CiAgICAgICAganQuc3RhdGUgPSAidHVtYmxlIjsganQudnkgPSAtMjAwOyBqdC52eCA9IGYgKiA2MDA7IGp0LnZyID0gZiAqIDE0OyBqdC5yb3QgPSAwOyBtYXJrKGp0LngsIGp0LnkpOwogICAgICB9CiAgICB9CiAgICBmb3IgKHZhciBMID0gMDsgTCA8IGxhdW5jaGVycy5sZW5ndGg7IEwrKykgewogICAgICB2YXIgbGEgPSBsYXVuY2hlcnNbTF07CiAgICAgIGlmICghbGEuZGVhZCAmJiBsYS5iLnN0YXRlID09PSAib2siICYmIGxhLnggPiBib3gueDAgJiYgbGEueCA8IGJveC54MSAmJiBsYXVuY2hlclkobGEpID4gYm94LnkwICYmIGxhdW5jaGVyWShsYSkgPCBib3gueTEpIHsga2lsbExhdW5jaGVyKGxhKTsgbWFyayhsYS54LCBsYXVuY2hlclkobGEpKTsgfQogICAgfQogICAgZm9yICh2YXIgcCA9IDA7IHAgPCBwcm9wcy5sZW5ndGg7IHArKykgewogICAgICB2YXIgcHIgPSBwcm9wc1twXTsKICAgICAgaWYgKCFwci5iZW5kICYmIHByLnggPiBib3gueDAgJiYgcHIueCA8IGJveC54MSAmJiBib3gueTEgPiBTVFJFRVQgLSA0MCkgeyBwci5iZW5kID0gMTsgcHIuYmVuZERpciA9IGY7IHNwYXJrcyhwci54LCBTVFJFRVQgLSA0MCwgNCk7IGFkZERlc3RydWN0aW9uKDIwKTsgfQogICAgfQogICAgaWYgKGJvc3MgJiYgYm9zcy5zdGF0ZSAhPT0gImRvd24iICYmIGJvc3Muc3RhdGUgIT09ICJlbnRlciIpIHsKICAgICAgdmFyIGJiID0gYm9zc0h1cnRib3goKTsKICAgICAgaWYgKGJiLngxID4gYm94LngwICYmIGJiLngwIDwgYm94LngxICYmIGJiLnkxID4gYm94LnkwICYmIGJiLnkwIDwgYm94LnkxKSB7CiAgICAgICAgdmFyIGRtZyA9IGtpbmQgPT09ICJzd2lwZSIgPyAyMCA6IChraW5kID09PSAiaGVhdnkiID8gKHBvd2VyID4gMS41ID8gNDIgOiAzNCkgOiAoa2luZCA9PT0gInRhaWwiID8gMTIgOiAoa2luZCA9PT0gInNwZWNpYWwiID8gNzUgOiAyMCkpKTsKICAgICAgICBodXJ0Qm9zcyhkbWcsIGtpbmQgPT09ICJzcGVjaWFsIiA\/IHNpZ24oYm9zcy54IC0gY2F0LngpIDogZiwga2IpOwogICAgICAgIG1hcmsoYm9zcy54IC0gZiAqIDYwLCBib3NzLmZlZXQgLSAyMjApOwogICAgICB9CiAgICB9CiAgICB2YXIgYkhpdCA9IDA7CiAgICBmb3IgKHZhciBxID0gMDsgcSA8IGJ1aWxkaW5ncy5sZW5ndGg7IHErKykgewogICAgICB2YXIgYiA9IGJ1aWxkaW5nc1txXTsKICAgICAgaWYgKGIuc3RhdGUgIT09ICJvayIgJiYgYi5zdGF0ZSAhPT0gInJ1aW4iKSBjb250aW51ZTsKICAgICAgdmFyIHRvcCA9IGIuc3RhdGUgPT09ICJydWluIiA\/IFNUUkVFVCAtIChiLnJ1aW5IIHx8IGIuaCkgOiBidWlsZGluZ1RvcChiKTsKICAgICAgaWYgKGIueCArIGIudyA+IGJveC54MCAmJiBiLnggPCBib3gueDEgJiYgU1RSRUVUID4gYm94LnkwICYmIHRvcCA8IGJveC55MSkgewogICAgICAgIHZhciBoeCA9IGYgPiAwID8gTWF0aC5tYXgoYi54LCBib3gueDApICsgcmFuZCg0LCA0MCkgOiBNYXRoLm1pbihiLnggKyBiLncsIGJveC54MSkgLSByYW5kKDQsIDQwKTsKICAgICAgICBpZiAoa2luZCA9PT0gInNwZWNpYWwiKSBoeCA9IGIueCArIHJhbmQoMC4yLCAwLjgpICogYi53OwogICAgICAgIHZhciBoeSA9IGNsYW1wKHJhbmQoYm94LnkwICsgNDAsIGJveC55MSAtIDYwKSwgdG9wICsgMTIsIFNUUkVFVCAtIDE0KTsKICAgICAgICBpZiAoZGFtYWdlQnVpbGRpbmcoYiwga2luZCA9PT0gImhlYXZ5IiB8fCBraW5kID09PSAic3BlY2lhbCIgPyAyIDogMSwgaHgsIGh5LCBraW5kID09PSAic3BlY2lhbCIgPyBzaWduKGIueCArIGIudyAvIDIgLSBjYXQueCkgOiBmKSkgYkhpdCsrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4geyBoaXRzOiBoaXRzLCBiSGl0OiBiSGl0LCB4OiBmaXJzdFgsIHk6IGZpcnN0WSB9OwogIH0KCiAgZnVuY3Rpb24gcmVzb2x2ZUF0dGFjayhhKSB7CiAgICB2YXIgZiA9IGNhdC5mYWNpbmcsIGJveCwga2luZCA9IGEudHlwZSwgcG93ZXIgPSAxOwogICAgaWYgKGtpbmQgPT09ICJzd2lwZSIpIHsgYm94ID0geyB4MDogY2F0LnggKyBmICogMTAsIHgxOiBjYXQueCArIGYgKiAzMDAsIHkwOiBjYXQuZmVldCAtIDM2MCwgeTE6IGNhdC5mZWV0ICsgMTAgfTsgfQogICAgZWxzZSBpZiAoa2luZCA9PT0gImhlYXZ5IikgeyBwb3dlciA9IGEuZmluaXNoZXIgPyAxLjYgOiAxLjQ7IGJveCA9IHsgeDA6IGNhdC54ICsgZiAqIDEwLCB4MTogY2F0LnggKyBmICogMzIwLCB5MDogY2F0LmZlZXQgLSAzNzAsIHkxOiBjYXQuZmVldCArIDEwIH07IH0KICAgIGVsc2UgaWYgKGtpbmQgPT09ICJ0YWlsIikgeyBwb3dlciA9IDAuOTsgYm94ID0geyB4MDogY2F0LnggLSBmICogMzQwLCB4MTogY2F0LnggLSBmICogMzAsIHkwOiBjYXQuZmVldCAtIDIxMCwgeTE6IGNhdC5mZWV0ICsgMTAgfTsgZiA9IC1mOyB9CiAgICBlbHNlIHsgcG93ZXIgPSAxLjU7IGJveCA9IHsgeDA6IHZpZXdMKCkgLSA0MCwgeDE6IHZpZXdSKCkgKyA0MCwgeTA6IC0zMDAsIHkxOiBIIH07IH0KICAgIGlmIChib3gueDAgPiBib3gueDEpIHsgdmFyIHRtcCA9IGJveC54MDsgYm94LngwID0gYm94LngxOyBib3gueDEgPSB0bXA7IH0KICAgIHZhciByID0gaGl0VGFyZ2V0cyhraW5kLCBib3gsIGYsIHBvd2VyKTsKICAgIHZhciBiaWcgPSBraW5kID09PSAiaGVhdnkiOwogICAgaWYgKGtpbmQgPT09ICJzcGVjaWFsIikgewogICAgICBHLmZsYXNoID0gMC45OyBHLnNoYWtlID0gMzA7IHNmeCgic2xhbSIpOwogICAgICBzaG9ja1JpbmcoY2F0LnggKyBjYXQuZmFjaW5nICogMTIwLCBGRUVULCAxNTAwLCAicmdiYSgyNTUsMjUwLDIzMCwwLjk1KSIsIDAuOSk7CiAgICAgIHNob2NrUmluZyhjYXQueCArIGNhdC5mYWNpbmcgKiAxMjAsIEZFRVQsIDEwMDAsICJyZ2JhKDI1NSwyMDAsMTIwLDAuOCkiLCAwLjcpOwogICAgICBkdXN0KGNhdC54ICsgY2F0LmZhY2luZyAqIDEyMCwgRkVFVCAtIDEwLCAyNCwgNjAwLCA3MCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzA7IGkrKykgY3JhY2tEZWNhbChjYXQueCArIHJhbmQoLTYwMCwgNjAwKSk7CiAgICAgIGFkZFRleHQoIktBSUpVIFNMQU0hIiwgY2F0LnggKyBjYXQuZmFjaW5nICogMTIwLCBjYXQuZmVldCAtIENBVF9IIC0gMzAsIDg0LCAiI2ZmZDA0MCIsIDEuNCwgMC4zKTsKICAgICAgRy5oaXRTdG9wID0gNSAvIDYwOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoci5oaXRzID4gMCkgewogICAgICBHLmhpdFN0b3AgPSAoYmlnID8gNCA6IDMpIC8gNjA7CiAgICAgIEcuc2hha2UgPSBNYXRoLm1heChHLnNoYWtlLCBiaWcgPyAxNiA6IDkpOwogICAgICB2YXIgd29yZCA9IGtpbmQgPT09ICJ0YWlsIiA\/ICJTV0lTSCEiIDogKGJpZyA\/IChhLmZpbmlzaGVyID8gIktBLVdIQU0hIiA6ICJLUkFLSyEiKSA6IChhLmlkeCA9PT0gMSA\/ICJXSEFQISIgOiAiV0hBTSEiKSk7CiAgICAgIGFkZFRleHQod29yZCwgci54LCByLnkgLSA0MCwgYmlnID8gNjYgOiA1NiwgYmlnID8gIiNmZmIwNDAiIDogIiNmZmZmZmYiLCAwLjc1LCAwLjI1KTsKICAgICAgYWRkUGFydCh7IHR5cGU6ICJmbGFzaCIsIHg6IHIueCwgeTogci55LCBsaWZlOiAwLjEyLCB0OiAwLCBzaXplOiBiaWcgPyA5MCA6IDYwIH0pOwogICAgICBzcGFya3Moci54LCByLnksIGJpZyA\/IDE4IDogMTAsICIjZmZmNmMwIik7CiAgICAgIHNmeChiaWcgPyAiaGVhdnkiIDogImhpdCIpOwogICAgICBHLmxhc3RIaXQgPSB7IHQ6IEcudCwgaGl0czogci5oaXRzIH07CiAgICB9IGVsc2UgaWYgKHIuYkhpdCA+IDApIHsKICAgICAgRy5oaXRTdG9wID0gMiAvIDYwOyBHLnNoYWtlID0gTWF0aC5tYXgoRy5zaGFrZSwgYmlnID8gMTAgOiA2KTsgc2Z4KCJoaXQiKTsKICAgICAgaWYgKGJpZykgYWRkVGV4dCgiS1JBS0shIiwgY2F0LnggKyBmICogMjIwLCBjYXQuZmVldCAtIDIyMCwgNjAsICIjZmZiMDQwIiwgMC42LCAwLjMpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gbGFuZGluZygpIHsKICAgIHZhciBzbGFtID0gY2F0LmFpclNsYW0sIFIgPSBzbGFtID8gNDcwIDogMzIwOwogICAgY2F0LmFpclNsYW0gPSBmYWxzZTsKICAgIGNhdC5zcXVhc2ggPSBzbGFtID8gMS42IDogMS4yOwogICAgRy5zaGFrZSA9IE1hdGgubWF4KEcuc2hha2UsIHNsYW0gPyAyMiA6IDEzKTsKICAgIHNob2NrUmluZyhjYXQueCwgRkVFVCwgUiAqIDEuNiwgInJnYmEoMjU1LDI0MCwyMTAsMC45KSIsIDAuNTUpOwogICAgZHVzdChjYXQueCwgRkVFVCAtIDEwLCBzbGFtID8gMjAgOiAxMiwgMTYwLCA2MCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IChzbGFtID8gOCA6IDQpOyBpKyspIGNyYWNrRGVjYWwoY2F0LnggKyByYW5kKC1SICogMC42LCBSICogMC42KSk7CiAgICBzZngoc2xhbSA\/ICJzbGFtIiA6ICJoZWF2eSIpOwogICAgdmFyIGRtZ0IgPSBzbGFtID8gMiA6IDE7CiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZlaGljbGVzLmxlbmd0aDsgaisrKSB7CiAgICAgIHZhciB2ID0gdmVoaWNsZXNbal0sIGR4ID0gdi54IC0gY2F0Lng7CiAgICAgIGlmICh2LnN0YXRlID09PSAidHVtYmxlIiB8fCB2LmRlYWQpIGNvbnRpbnVlOwogICAgICBpZiAoTWF0aC5hYnMoZHgpIDwgOTApIHsgY3J1c2hWZWhpY2xlKHYpOyBjb250aW51ZTsgfQogICAgICBpZiAoTWF0aC5hYnMoZHgpIDwgUikgeyB2YXIgayA9IDEgLSBNYXRoLmFicyhkeCkgLyBSOyBsYXVuY2hWZWhpY2xlKHYsIHNpZ24oZHgpICogMzIwICogayArIHJhbmQoLTQwLCA0MCksIC0oMzgwICsgNjAwICogaykgKiAoc2xhbSA\/IDEuMyA6IDEpLCBzaWduKGR4KSAqIHJhbmQoNiwgMTIpKTsgfQogICAgfQogICAgZm9yICh2YXIgYiA9IDA7IGIgPCBidWlsZGluZ3MubGVuZ3RoOyBiKyspIHsKICAgICAgdmFyIGJkID0gYnVpbGRpbmdzW2JdOwogICAgICBpZiAoKGJkLnN0YXRlID09PSAib2siIHx8IGJkLnN0YXRlID09PSAicnVpbiIpICYmIGJkLnggKyBiZC53ID4gY2F0LnggLSBSICogMC43ICYmIGJkLnggPCBjYXQueCArIFIgKiAwLjcpIGRhbWFnZUJ1aWxkaW5nKGJkLCBkbWdCLCBjbGFtcChjYXQueCwgYmQueCArIDUsIGJkLnggKyBiZC53IC0gNSksIFNUUkVFVCAtIHJhbmQoMTAsIDYwKSwgc2lnbihiZC54ICsgYmQudyAvIDIgLSBjYXQueCkpOwogICAgfQogICAgZm9yICh2YXIgaCA9IDA7IGggPCBoZWxpcy5sZW5ndGg7IGgrKykgeyB2YXIgaGggPSBoZWxpc1toXTsgaWYgKGhoLnN0YXRlID09PSAiZmx5IiAmJiBNYXRoLmFicyhoaC54IC0gY2F0LngpIDwgUiAmJiBoaC55ID4gRkVFVCAtIDMzMCkgeyBoaC5zdGF0ZSA9ICJzdHVuIjsgaGguc3R1biA9IDEuMjsgfSB9CiAgICBpZiAoYm9zcyAmJiBib3NzLnN0YXRlICE9PSAiZG93biIgJiYgYm9zcy5zdGF0ZSAhPT0gImVudGVyIiAmJiBNYXRoLmFicyhib3NzLnggLSBjYXQueCkgPCAoc2xhbSA\/IDMwMCA6IDIyMCkpIGh1cnRCb3NzKHNsYW0gPyAzNCA6IDE4LCBzaWduKGJvc3MueCAtIGNhdC54KSwgMSk7CiAgICBpZiAoc2xhbSkgYWRkVGV4dCgiQk9PTSEiLCBjYXQueCwgRkVFVCAtIDEyMCwgNzIsICIjZmZkMDQwIiwgMC44LCAwLjMpOwogIH0KCiAgZnVuY3Rpb24gc3RlcEV2ZW50KHNpZGVYKSB7CiAgICBHLnNoYWtlID0gTWF0aC5tYXgoRy5zaGFrZSwgMy41KTsKICAgIGR1c3Qoc2lkZVgsIEZFRVQgLSA0LCA1LCAxOCwgMzQpOwogICAgY3JhY2tEZWNhbChzaWRlWCk7CiAgICBzZngoInN0ZXAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVoaWNsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHYgPSB2ZWhpY2xlc1tpXTsKICAgICAgaWYgKHYuc3RhdGUgPT09ICJ0dW1ibGUiIHx8IHYuZGVhZCkgY29udGludWU7CiAgICAgIHZhciBkID0gTWF0aC5hYnModi54IC0gc2lkZVgpOwogICAgICBpZiAoZCA8IDQwICsgdi53ICogMC4zICYmIHYuc3RhdGUgIT09ICJjcnVzaGVkIikgeyBjcnVzaFZlaGljbGUodik7IGNvbnRpbnVlOyB9CiAgICAgIGlmIChkIDwgMzAwICYmIHYuc3RhdGUgIT09ICJjcnVzaGVkIikgdi5ib3VuY2VWID0gTWF0aC5taW4odi5ib3VuY2VWLCAtMjYwICogKDEgLSBkIC8gMzAwKSk7CiAgICB9CiAgICBmb3IgKHZhciBwID0gMDsgcCA8IHByb3BzLmxlbmd0aDsgcCsrKSB7IHZhciBwciA9IHByb3BzW3BdLCBkZCA9IE1hdGguYWJzKHByLnggLSBzaWRlWCk7IGlmIChkZCA8IDMyMCkgcHIud29iViArPSAoMSAtIGRkIC8gMzIwKSAqIDYgKiAoTWF0aC5yYW5kb20oKSA8IDAuNSA\/IC0xIDogMSk7IH0KICB9CgogIGZ1bmN0aW9uIG5lYXJlc3RUaHJlYXQobWF4RCkgewogICAgdmFyIGJlc3QgPSBudWxsLCBiZCA9IG1heEQ7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlbGlzLmxlbmd0aDsgaSsrKSB7IHZhciBoID0gaGVsaXNbaV07IGlmIChoLnN0YXRlID09PSAidHVtYmxlIikgY29udGludWU7IHZhciBkID0gTWF0aC5hYnMoaC54IC0gY2F0LngpOyBpZiAoZCA8IGJkKSB7IGJkID0gZDsgYmVzdCA9IGg7IH0gfQogICAgaWYgKGJvc3MgJiYgYm9zcy5zdGF0ZSAhPT0gImRvd24iKSB7IHZhciBkYiA9IE1hdGguYWJzKGJvc3MueCAtIGNhdC54KTsgaWYgKGRiIDwgYmQgKyAyMDApIGJlc3QgPSBib3NzOyB9CiAgICByZXR1cm4gYmVzdDsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUNhdChkdCkgewogICAgaWYgKGNhdC5odXJ0VCA+IDApIGNhdC5odXJ0VCAtPSBkdDsKICAgIGlmIChjYXQucm9hckNEID4gMCkgY2F0LnJvYXJDRCAtPSBkdDsKICAgIGlmIChjYXQuY29tYm9UID4gMCkgeyBjYXQuY29tYm9UIC09IGR0OyBpZiAoY2F0LmNvbWJvVCA8PSAwKSBjYXQuY29tYm8gPSAwOyB9CiAgICBjYXQuc3F1YXNoID0gTWF0aC5tYXgoMCwgY2F0LnNxdWFzaCAtIGR0ICogNSk7CiAgICBpZiAoRy5hdXRvVGFpbENEID4gMCkgRy5hdXRvVGFpbENEIC09IGR0OwogICAgaWYgKGNhdC5kZWFkKSB7IGNhdC5kZWFkVCArPSBkdDsgY2F0LnZ4ICo9IDAuOTsgcmV0dXJuOyB9CiAgICB2YXIgaW5wdXQgPSAwOwogICAgaWYgKGtleXMubGVmdCkgaW5wdXQgLT0gMTsKICAgIGlmIChrZXlzLnJpZ2h0KSBpbnB1dCArPSAxOwogICAgaWYgKHN0aWNrLmlkICE9PSBudWxsICYmIE1hdGguYWJzKHN0aWNrLmR4KSA+IDAuMTgpIGlucHV0ID0gY2xhbXAoc3RpY2suZHggKiAxLjQsIC0xLCAxKTsKICAgIGlmIChjYXQuYXV0b1QpIHsKICAgICAgY2F0LmF1dG9UaW1lIC09IGR0OwogICAgICB2YXIgYXQgPSBjYXQuYXV0b1QsIGFkeCA9IGF0LnggLSBjYXQueDsKICAgICAgaWYgKGNhdC5hdXRvVGltZSA8PSAwIHx8IGF0LnN0YXRlID09PSAidHVtYmxlIiB8fCBhdC5kZWFkIHx8IGlucHV0ICE9PSAwKSBjYXQuYXV0b1QgPSBudWxsOwogICAgICBlbHNlIGlmIChNYXRoLmFicyhhZHgpID4gMjUwKSBpbnB1dCA9IHNpZ24oYWR4KTsKICAgICAgZWxzZSB7IGNhdC5hdXRvVCA9IG51bGw7IGlmICghY2F0LmFjdCkgY2F0LmZhY2luZyA9IHNpZ24oYWR4KTsgcHJlc3NBY3Rpb24oInN3aXBlIik7IH0KICAgIH0KICAgIHZhciBhID0gY2F0LmFjdDsKICAgIHZhciBzcGVlZE11bCA9IGEgPyAoYS50eXBlID09PSAiY3JvdWNoIiA\/IDAgOiAwLjMpIDogMTsKICAgIHZhciBtYXhWID0gMjQwOwogICAgaWYgKGNhdC5vbkdyb3VuZCkgY2F0LnZ4ID0gbGVycChjYXQudngsIGlucHV0ICogbWF4ViAqIHNwZWVkTXVsLCBNYXRoLm1pbigxLCBkdCAqIChpbnB1dCA\/IDUgOiA3KSkpOwogICAgZWxzZSBjYXQudnggPSBsZXJwKGNhdC52eCwgaW5wdXQgKiBtYXhWLCBNYXRoLm1pbigxLCBkdCAqIDEuNSkpOwogICAgaWYgKGlucHV0ICE9PSAwICYmICghYSB8fCBhLnR5cGUgPT09ICJjcm91Y2giKSkgeyBjYXQuZmFjaW5nID0gc2lnbihpbnB1dCk7IGNhdC50dXJuVCA9IDA7IH0KICAgIGVsc2UgaWYgKCFhICYmIGlucHV0ID09PSAwKSB7CiAgICAgIHZhciB0aCA9IG5lYXJlc3RUaHJlYXQoNjUwKTsKICAgICAgaWYgKHRoKSB7CiAgICAgICAgdmFyIHdhbnQgPSBzaWduKHRoLnggLSBjYXQueCk7CiAgICAgICAgaWYgKHdhbnQgIT09IGNhdC5mYWNpbmcpIHsgY2F0LnR1cm5UICs9IGR0OyBpZiAoY2F0LnR1cm5UID4gMC4xOCkgeyBjYXQuZmFjaW5nID0gd2FudDsgY2F0LnR1cm5UID0gMDsgfSB9IGVsc2UgY2F0LnR1cm5UID0gMDsKICAgICAgICB2YXIgdXAgPSAoKGNhdC5mZWV0IC0gMjMwKSAtICh0aC55ICE9PSB1bmRlZmluZWQgPyB0aC55IDogdGguZmVldCAtIDIwMCkpIC8gMzAwOwogICAgICAgIGNhdC5sb29rUm90ID0gbGVycChjYXQubG9va1JvdCwgLWNsYW1wKHVwLCAtMC4zLCAxKSAqIDAuMDYsIE1hdGgubWluKDEsIGR0ICogNSkpOwogICAgICB9IGVsc2UgY2F0Lmxvb2tSb3QgPSBsZXJwKGNhdC5sb29rUm90LCAwLCBNYXRoLm1pbigxLCBkdCAqIDUpKTsKICAgIH0KICAgIGNhdC54ICs9IGNhdC52eCAqIGR0OwogICAgdmFyIG1pblggPSAxNDAsIG1heFggPSBXT1JMRCAtIDIwMDsKICAgIGlmIChHLnBoYXNlICE9PSAiY2l0eSIpIHsgbWluWCA9IEJPU1NfWCAtIDQyMDsgbWF4WCA9IEJPU1NfWCArIDg0MDsgfQogICAgY2F0LnggPSBjbGFtcChjYXQueCwgbWluWCwgbWF4WCk7CiAgICBpZiAoY2F0Lm9uR3JvdW5kICYmIE1hdGguYWJzKGNhdC52eCkgPiAyNSkgewogICAgICB2YXIgcHJldiA9IE1hdGguZmxvb3IoY2F0LnN0ZXBQaGFzZSAvIE1hdGguUEkpOwogICAgICBjYXQuc3RlcFBoYXNlICs9IE1hdGguYWJzKGNhdC52eCkgKiBkdCAvIDc4ICogTWF0aC5QSTsKICAgICAgaWYgKE1hdGguZmxvb3IoY2F0LnN0ZXBQaGFzZSAvIE1hdGguUEkpICE9PSBwcmV2KSB7IGNhdC5zdGVwQ291bnQrKzsgY2F0LnNxdWFzaCA9IE1hdGgubWF4KGNhdC5zcXVhc2gsIDAuOCk7IHN0ZXBFdmVudChjYXQueCArIGNhdC5mYWNpbmcgKiAoY2F0LnN0ZXBDb3VudCAlIDIgPyA3NSA6IC01NSkpOyB9CiAgICB9IGVsc2UgaWYgKGNhdC5vbkdyb3VuZCkgewogICAgICB2YXIgdGFyZ2V0ID0gTWF0aC5yb3VuZChjYXQuc3RlcFBoYXNlIC8gTWF0aC5QSSkgKiBNYXRoLlBJOyBjYXQuc3RlcFBoYXNlID0gbGVycChjYXQuc3RlcFBoYXNlLCB0YXJnZXQsIE1hdGgubWluKDEsIGR0ICogNikpOwogICAgfQogICAgaWYgKCFjYXQub25Hcm91bmQpIHsKICAgICAgY2F0LnZ5ICs9IDI1MDAgKiBkdDsgY2F0LmZlZXQgKz0gY2F0LnZ5ICogZHQ7CiAgICAgIGlmIChjYXQuZmVldCA+PSBGRUVUKSB7IGNhdC5mZWV0ID0gRkVFVDsgY2F0LnZ5ID0gMDsgY2F0Lm9uR3JvdW5kID0gdHJ1ZTsgbGFuZGluZygpOyB9CiAgICB9CiAgICBpZiAoYSkgewogICAgICBhLnQgKz0gZHQ7CiAgICAgIGlmIChhLnR5cGUgPT09ICJjcm91Y2giKSB7CiAgICAgICAgaWYgKGEudCA+PSBhLndpbmQpIHsKICAgICAgICAgIGNhdC5hY3QgPSBudWxsOyBjYXQub25Hcm91bmQgPSBmYWxzZTsgY2F0LnZ5ID0gLTEwMjA7IGNhdC52eCA9IGNhdC52eCAqIDEuNCArIGlucHV0ICogMTIwOyBjYXQuc3F1YXNoID0gMDsKICAgICAgICAgIGR1c3QoY2F0LngsIEZFRVQgLSA2LCAxMCwgODAsIDUwKTsgRy5zaGFrZSA9IE1hdGgubWF4KEcuc2hha2UsIDYpOyBzZngoIndob29zaCIpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCFhLmhpdERvbmUgJiYgYS50ID49IGEud2luZCkgewogICAgICAgIGEuaGl0RG9uZSA9IHRydWU7CiAgICAgICAgaWYgKGEudHlwZSA9PT0gInJvYXIiKSBkb1JvYXIoKTsgZWxzZSByZXNvbHZlQXR0YWNrKGEpOwogICAgICAgIGlmIChhLnR5cGUgPT09ICJzd2lwZSIpIGNhdC5jb21ib1QgPSAwLjYyOwogICAgICB9CiAgICAgIGlmIChhLnQgPj0gYS53aW5kICsgYS5hY3RpdmUgKyBhLnJlYykgewogICAgICAgIGNhdC5hY3QgPSBudWxsOwogICAgICAgIGlmIChjYXQuYnVmZmVyKSB7IHZhciBuID0gY2F0LmJ1ZmZlcjsgY2F0LmJ1ZmZlciA9IG51bGw7IGlmIChuID09PSAianVtcCIpIHRyeUp1bXAoKTsgZWxzZSBkb1N0YXJ0KG4pOyB9CiAgICAgIH0KICAgIH0KICAgIGlmICh0b3VjaE1vZGUgJiYgIWNhdC5hY3QgJiYgY2F0Lm9uR3JvdW5kICYmIEcuYXV0b1RhaWxDRCA8PSAwKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVoaWNsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgdiA9IHZlaGljbGVzW2ldOwogICAgICAgIGlmICh2LnN0YXRlID09PSAiZHJpdmUiICYmICh2LnggLSBjYXQueCkgKiBjYXQuZmFjaW5nIDwgLTYwICYmIE1hdGguYWJzKHYueCAtIGNhdC54KSA8IDI2MCkgeyBzdGFydEFjdCgidGFpbCIpOyBHLmF1dG9UYWlsQ0QgPSAxLjY7IGJyZWFrOyB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGRvUm9hcigpIHsKICAgIHNmeCgicm9hciIpOwogICAgRy53YXZlID0gMC43OyBHLnNoYWtlID0gTWF0aC5tYXgoRy5zaGFrZSwgMTIpOwogICAgdmFyIG14ID0gY2F0LnggKyBjYXQuZmFjaW5nICogMTAwLCBteSA9IGNhdC5mZWV0IC0gMjM1OwogICAgc2hvY2tSaW5nKG14LCBteSwgNzAwLCAicmdiYSgyNTUsMjU1LDI1NSwwLjgpIiwgMC43KTsKICAgIHNob2NrUmluZyhteCwgbXksIDUwMCwgInJnYmEoMjAwLDIzMCwyNTUsMC42KSIsIDAuNTUpOwogICAgYWRkVGV4dCgiUlJST09BQUFSUlIhIiwgbXggKyBjYXQuZmFjaW5nICogMTIwLCBteSAtIDYwLCA2NCwgIiNmZmU5YzAiLCAxLjAsIDAuMyk7CiAgICB2YXIgUiA9IDY0MDsKICAgIGhlbGlzLmZvckVhY2goZnVuY3Rpb24gKGgpIHsgaWYgKGguc3RhdGUgPT09ICJmbHkiICYmIE1hdGguYWJzKGgueCAtIGNhdC54KSA8IFIpIHsgaC5zdGF0ZSA9ICJzdHVuIjsgaC5zdHVuID0gMi41OyBoLnZ4ID0gc2lnbihoLnggLSBjYXQueCkgKiAxMjA7IH0gfSk7CiAgICB2ZWhpY2xlcy5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7IGlmICh2LnN0YXRlID09PSAiZHJpdmUiICYmIE1hdGguYWJzKHYueCAtIGNhdC54KSA8IFIpIHsgdi5zdHVuID0gMi41OyB2LmJvdW5jZVYgPSAtMzAwOyB9IGlmICh2LnN0YXRlID09PSAidHJhZmZpYyIgfHwgdi5zdGF0ZSA9PT0gInBhcmtlZCIpIHsgdi5zdGF0ZSA9ICJ0cmFmZmljIjsgdi52eCA9IHNpZ24odi54IC0gY2F0LngpICogMzAwOyB9IH0pOwogICAgc2hvdHMuZm9yRWFjaChmdW5jdGlvbiAocykgeyBpZiAocy5vd25lciA9PT0gIm1pbCIgJiYgTWF0aC5hYnMocy54IC0gY2F0LngpIDwgNDAwKSB7IHMudnggPSBzaWduKHMueCAtIGNhdC54KSAqIDMwMDsgcy52eSA9IC0xMjA7IHMubGlmZSA9IE1hdGgubWluKHMubGlmZSwgMC44KTsgfSB9KTsKICAgIGlmIChib3NzICYmIGJvc3Muc3RhdGUgIT09ICJkb3duIiAmJiBib3NzLnN0YXRlICE9PSAiZW50ZXIiICYmIE1hdGguYWJzKGJvc3MueCAtIGNhdC54KSA8IFIpIHsgYm9zcy5zdHVuID0gMS4zOyBib3NzLnN0YXRlID0gInN0YWdnZXIiOyBib3NzLnQgPSAwOyBib3NzLmR1ciA9IDEuMzsgYm9zcy52eCA9IHNpZ24oYm9zcy54IC0gY2F0LngpICogMTYwOyBhZGRUZXh0KCJTVFVOTkVEIiwgYm9zcy54LCBib3NzLmZlZXQgLSBDQVRfSCAtIDMwLCAzNCwgIiM5ZmU4ZmYiLCAxLCAwLjUpOyB9CiAgICBidWlsZGluZ3MuZm9yRWFjaChmdW5jdGlvbiAoYikgeyBpZiAoYi5zdGF0ZSA9PT0gIm9rIiAmJiBiLnggKyBiLncgPiBjYXQueCAtIDQwMCAmJiBiLnggPCBjYXQueCArIDQwMCkgeyBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykgZGVicmlzKGIueCArIHJhbmQoMCwgYi53KSwgU1RSRUVUIC0gcmFuZCgzMCwgYi5oKSwgc2lnbihiLnggLSBjYXQueCksIDEsIDIsIDAuNCk7IH0gfSk7CiAgfQogIGZ1bmN0aW9uIHN0YXJ0Qm9zc0ludHJvKCkgewogICAgRy5waGFzZSA9ICJib3NzSW50cm8iOyBHLmJvc3NUID0gMDsgRy56b29tVCA9IDAuODQ7CiAgICBib3NzID0geyB4OiBCT1NTX1ggKyAxMTUwLCBmZWV0OiBGRUVULCB2eDogMCwgdnk6IDAsIGZhY2luZzogLTEsIGhwOiA2MDAsIG1heEhwOiA2MDAsIHN0YXRlOiAiZW50ZXIiLCB0OiAwLCBzbmFwOiAwLCBzdHVuOiAwLCBvbkdyb3VuZDogdHJ1ZSwKICAgICAgZmxhc2g6IDAsIHN0ZXBQaGFzZTogMCwgc3RlcENvdW50OiAwLCBzcXVhc2g6IDAsIGR1cjogMSwgcm9hcmVkOiBmYWxzZSwgYmxkQ0Q6IDAsIGRlYWRUOiAwLCBzd0hpdDogZmFsc2UsIGNoYXJnZUhpdDogZmFsc2UgfTsKICAgIHZlaGljbGVzLmZvckVhY2goZnVuY3Rpb24gKHYpIHsgaWYgKHYuc3RhdGUgPT09ICJkcml2ZSIpIHYucHJlZiA9IHJhbmQoNjAwLCA4MDApOyB9KTsKICAgIGFkZFRleHQoIldBUk5JTkc6IEdJQU5UIE1PTlNURVIiLCBCT1NTX1ggKyAyMDAsIEZFRVQgLSA0NzAsIDQ0LCAiI2ZmNjA1MCIsIDIuMiwgMC4xKTsKICAgIHN0YXJ0RHJvbmUoKTsKICB9CiAgZnVuY3Rpb24gaHVydEJvc3MoZG1nLCBkaXIsIGtiKSB7CiAgICBpZiAoIWJvc3MgfHwgYm9zcy5zdGF0ZSA9PT0gImRvd24iIHx8IGJvc3Muc3RhdGUgPT09ICJlbnRlciIpIHJldHVybjsKICAgIGJvc3MuaHAgLT0gZG1nOyBib3NzLmZsYXNoID0gMC4xOwogICAgaWYgKGtiID4gMCkgewogICAgICBib3NzLnNuYXAgPSBNYXRoLm1pbigwLjQ1LCAwLjE4ICsga2IgKiAwLjEyKTsKICAgICAgaWYgKGJvc3Muc3RhdGUgIT09ICJwb3VuY2UiKSB7IGJvc3Muc3RhdGUgPSAic3RhZ2dlciI7IGJvc3Muc3R1biA9IDA7IGJvc3MudCA9IDA7IGJvc3MuZHVyID0gMC4zICsga2IgKiAwLjE1OyBib3NzLnZ4ID0gZGlyICogMzIwICoga2I7IH0KICAgIH0KICAgIGlmIChib3NzLmhwIDw9IDApIHsKICAgICAgYm9zcy5ocCA9IDA7IGJvc3Muc3RhdGUgPSAiZG93biI7IGJvc3MudCA9IDA7IGJvc3MudnggPSBkaXIgKiAyMDA7IGJvc3MuZGVhZFQgPSAwOwogICAgICBHLnNoYWtlID0gMjY7IEcuZmxhc2ggPSAwLjU7IHNmeCgiY29sbGFwc2UiKTsgc2Z4KCJyb2FyIik7CiAgICAgIGFkZFRleHQoIksuTy4iLCBib3NzLngsIGJvc3MuZmVldCAtIENBVF9IIC0gNDAsIDExMCwgIiNmZmQwNDAiLCAyLjQsIDAuMTUpOwogICAgICBhZGREZXN0cnVjdGlvbigxMDAwMCwgYm9zcy54LCBib3NzLmZlZXQgLSAyMDAsIHRydWUpOwogICAgICBzdG9wRHJvbmUoKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gYm9zc1N0ZXAoc2lkZSkgewogICAgRy5zaGFrZSA9IE1hdGgubWF4KEcuc2hha2UsIDQpOwogICAgZHVzdChzaWRlLCBGRUVUIC0gNCwgNSwgMTgsIDM0KTsgY3JhY2tEZWNhbChzaWRlKTsgc2Z4KCJzdGVwIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlaGljbGVzLmxlbmd0aDsgaSsrKSB7IHZhciB2ID0gdmVoaWNsZXNbaV07IGlmICh2LnN0YXRlID09PSAidHVtYmxlIiB8fCB2LmRlYWQpIGNvbnRpbnVlOyB2YXIgZCA9IE1hdGguYWJzKHYueCAtIHNpZGUpOyBpZiAoZCA8IDYwICYmIHYuc3RhdGUgIT09ICJjcnVzaGVkIikgY3J1c2hWZWhpY2xlKHYpOyBlbHNlIGlmIChkIDwgMzAwICYmIHYuc3RhdGUgIT09ICJjcnVzaGVkIikgdi5ib3VuY2VWID0gTWF0aC5taW4odi5ib3VuY2VWLCAtMjYwICogKDEgLSBkIC8gMzAwKSk7IH0KICB9CiAgZnVuY3Rpb24gdXBkYXRlQm9zcyhkdCkgewogICAgaWYgKCFib3NzKSByZXR1cm47CiAgICB2YXIgYiA9IGJvc3M7CiAgICBiLnQgKz0gZHQ7CiAgICBpZiAoYi5mbGFzaCA+IDApIGIuZmxhc2ggLT0gZHQ7CiAgICBiLnNuYXAgPSBsZXJwKGIuc25hcCwgMCwgTWF0aC5taW4oMSwgZHQgKiA2KSk7CiAgICBiLnNxdWFzaCA9IE1hdGgubWF4KDAsIGIuc3F1YXNoIC0gZHQgKiA1KTsKICAgIGlmIChiLmJsZENEID4gMCkgYi5ibGRDRCAtPSBkdDsKICAgIHZhciBkeCA9IGNhdC54IC0gYi54LCBkaXN0ID0gTWF0aC5hYnMoZHgpOwogICAgdmFyIHdhbGtTcGVlZCA9IDA7CiAgICBpZiAoYi5zdGF0ZSA9PT0gImVudGVyIikgewogICAgICBiLmZhY2luZyA9IC0xOwogICAgICB2YXIgc3RvcFggPSBCT1NTX1ggKyA1NjA7CiAgICAgIGlmIChiLnggPiBzdG9wWCkgYi52eCA9IC0xNzA7CiAgICAgIGVsc2UgewogICAgICAgIGIudnggPSAwOwogICAgICAgIGlmICghYi5yb2FyZWQpIHsgYi5yb2FyZWQgPSB0cnVlOyBiLnQgPSAwOyBzZngoInJvYXIiKTsgRy53YXZlID0gMC42OyBHLnNoYWtlID0gMTY7IHNob2NrUmluZyhiLnggLSAxMDAsIGIuZmVldCAtIDIzNSwgNzAwLCAicmdiYSgyNTUsMjAwLDIwMCwwLjgpIiwgMC43KTsgYWRkVGV4dCgiSFNTU1MtUlJBQUFIISIsIGIueCAtIDIwMCwgYi5mZWV0IC0gQ0FUX0ggLSA2MCwgNjAsICIjZmY5YThhIiwgMS40LCAwLjMpOyB9CiAgICAgICAgZWxzZSBpZiAoYi50ID4gMS40KSB7IGIuc3RhdGUgPSAiY2lyY2xlIjsgYi50ID0gMDsgYi5kdXIgPSAxLjI7IEcucGhhc2UgPSAiYm9zcyI7IGFkZFRleHQoIkZJR0hUISIsIChjYXQueCArIGIueCkgLyAyLCBGRUVUIC0gNDIwLCA5MCwgIiNmZmZmZmYiLCAxLjIsIDAuMik7IH0KICAgICAgfQogICAgfSBlbHNlIGlmIChiLnN0YXRlID09PSAiZG93biIpIHsKICAgICAgYi5kZWFkVCArPSBkdDsgYi52eCAqPSAwLjkyOwogICAgICBpZiAoYi5kZWFkVCA8IDEuNSAmJiBNYXRoLnJhbmRvbSgpIDwgMC41KSBkdXN0KGIueCArIHJhbmQoLTE1MCwgMTUwKSwgRkVFVCAtIDYsIDEsIDEwLCA3MCk7CiAgICAgIGlmIChiLmRlYWRUID4gMi44ICYmIEcuc3RhdGUgPT09ICJwbGF5IikgeyBHLnBoYXNlID0gIndvbiI7IGVuZEdhbWUodHJ1ZSk7IH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChiLnN0YXRlICE9PSAiY2hhcmdlIiAmJiBiLnN0YXRlICE9PSAicG91bmNlIiAmJiBiLnN0YXRlICE9PSAic3RhZ2dlciIpIGIuZmFjaW5nID0gc2lnbihkeCk7CiAgICAgIGlmIChiLnN0YXRlID09PSAiY2lyY2xlIikgewogICAgICAgIHZhciB3YW50ID0gMzgwICsgTWF0aC5zaW4oRy50ICogMS4zKSAqIDYwOwogICAgICAgIGlmIChkaXN0ID4gd2FudCArIDMwKSB3YWxrU3BlZWQgPSAxNTA7IGVsc2UgaWYgKGRpc3QgPCB3YW50IC0gNDApIHdhbGtTcGVlZCA9IC0xMjA7CiAgICAgICAgYi52eCA9IGxlcnAoYi52eCwgYi5mYWNpbmcgKiB3YWxrU3BlZWQsIE1hdGgubWluKDEsIGR0ICogNCkpOwogICAgICAgIGlmIChiLnQgPiBiLmR1cikgewogICAgICAgICAgYi50ID0gMDsKICAgICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKTsKICAgICAgICAgIGlmIChkaXN0IDwgMzAwKSBiLnN0YXRlID0gciA8IDAuNiA\/ICJzd2lwZVdpbmQiIDogImhpc3MiOwogICAgICAgICAgZWxzZSBiLnN0YXRlID0gciA8IDAuMzUgPyAiaGlzcyIgOiAociA8IDAuNiA\/ICJhcHByb2FjaCIgOiAociA8IDAuOCA\/ICJwb3VuY2VXaW5kIiA6ICJoaXNzIikpOwogICAgICAgICAgaWYgKGIuc3RhdGUgPT09ICJoaXNzIikgYWRkVGV4dCgiSFNTU1MiLCBiLngsIGIuZmVldCAtIENBVF9IIC0gMjAsIDQwLCAiI2ZmOWE4YSIsIDAuOCwgMC41KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYi5zdGF0ZSA9PT0gImFwcHJvYWNoIikgewogICAgICAgIGIudnggPSBsZXJwKGIudngsIGIuZmFjaW5nICogMjMwLCBNYXRoLm1pbigxLCBkdCAqIDQpKTsKICAgICAgICBpZiAoZGlzdCA8IDI0MCkgeyBiLnN0YXRlID0gInN3aXBlV2luZCI7IGIudCA9IDA7IH0KICAgICAgICBpZiAoYi50ID4gMi4yKSB7IGIuc3RhdGUgPSAiY2lyY2xlIjsgYi50ID0gMDsgYi5kdXIgPSAwLjY7IH0KICAgICAgfSBlbHNlIGlmIChiLnN0YXRlID09PSAiaGlzcyIpIHsKICAgICAgICBiLnZ4ID0gbGVycChiLnZ4LCAwLCBNYXRoLm1pbigxLCBkdCAqIDYpKTsKICAgICAgICBpZiAoYi50ID4gMC43KSB7IGIudCA9IDA7IGIuc3RhdGUgPSBNYXRoLnJhbmRvbSgpIDwgMC41NSA\/ICJjaGFyZ2UiIDogInBvdW5jZVdpbmQiOyBiLmNoYXJnZUhpdCA9IGZhbHNlOyBpZiAoYi5zdGF0ZSA9PT0gImNoYXJnZSIpIHNmeCgicm9hciIpOyB9CiAgICAgIH0gZWxzZSBpZiAoYi5zdGF0ZSA9PT0gImNoYXJnZSIpIHsKICAgICAgICBiLnZ4ID0gYi5mYWNpbmcgKiA3MjA7CiAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPCAwLjI1KSBkdXN0KGIueCAtIGIuZmFjaW5nICogODAsIEZFRVQgLSA2LCAxLCAxMCwgNDUpOwogICAgICAgIGlmICghYi5jaGFyZ2VIaXQgJiYgZGlzdCA8IDE5MCkgewogICAgICAgICAgYi5jaGFyZ2VIaXQgPSB0cnVlOwogICAgICAgICAgaWYgKCFjYXQuZGVhZCkgeyBodXJ0Q2F0KDEyLCBiLmZhY2luZyk7IGNhdC52eCA9IGIuZmFjaW5nICogNzAwOyBHLnNoYWtlID0gMTg7IEcuaGl0U3RvcCA9IDQgLyA2MDsgYWRkVGV4dCgiV0hBTSEiLCBjYXQueCwgY2F0LmZlZXQgLSAyMjAsIDY0LCAiI2ZmOWE4YSIsIDAuNywgMC4zKTsgc2Z4KCJoZWF2eSIpOyB9CiAgICAgICAgICBiLnN0YXRlID0gInJlY292ZXIiOyBiLnQgPSAwOyBiLnZ4ID0gLWIuZmFjaW5nICogMjAwOwogICAgICAgIH0KICAgICAgICBpZiAoYi50ID4gMS4xKSB7IGIuc3RhdGUgPSAicmVjb3ZlciI7IGIudCA9IDA7IH0KICAgICAgfSBlbHNlIGlmIChiLnN0YXRlID09PSAic3dpcGVXaW5kIikgewogICAgICAgIGIudnggPSBsZXJwKGIudngsIDAsIE1hdGgubWluKDEsIGR0ICogOCkpOwogICAgICAgIGlmIChiLnQgPiAwLjM0KSB7IGIuc3RhdGUgPSAic3dpcGUiOyBiLnQgPSAwOyBiLnN3SGl0ID0gZmFsc2U7IHNmeCgid2hvb3NoIik7IH0KICAgICAgfSBlbHNlIGlmIChiLnN0YXRlID09PSAic3dpcGUiKSB7CiAgICAgICAgaWYgKGIudCA+IDAuMDUgJiYgIWIuc3dIaXQpIHsKICAgICAgICAgIGIuc3dIaXQgPSB0cnVlOwogICAgICAgICAgaWYgKGRpc3QgPCAyOTAgJiYgIWNhdC5kZWFkKSB7IGh1cnRDYXQoOSwgYi5mYWNpbmcpOyBjYXQudnggPSBiLmZhY2luZyAqIDQ1MDsgRy5oaXRTdG9wID0gMyAvIDYwOyBHLnNoYWtlID0gMTI7IGFkZFRleHQoIldIQVAhIiwgY2F0LngsIGNhdC5mZWV0IC0gMjMwLCA1OCwgIiNmZjlhOGEiLCAwLjYsIDAuMyk7IHNmeCgiaGl0Iik7IH0KICAgICAgICB9CiAgICAgICAgaWYgKGIudCA+IDAuNCkgeyBiLnN0YXRlID0gInJlY292ZXIiOyBiLnQgPSAwOyB9CiAgICAgIH0gZWxzZSBpZiAoYi5zdGF0ZSA9PT0gInBvdW5jZVdpbmQiKSB7CiAgICAgICAgYi52eCA9IDA7IGIuc3F1YXNoID0gMTsKICAgICAgICBpZiAoYi50ID4gMC4zNSkgeyBiLnN0YXRlID0gInBvdW5jZSI7IGIudCA9IDA7IGIub25Hcm91bmQgPSBmYWxzZTsgYi52eSA9IC05MDA7IGIudnggPSBjbGFtcChkeCAvIDAuNzIsIC04MjAsIDgyMCk7IGIuZmFjaW5nID0gc2lnbihkeCk7IHNmeCgid2hvb3NoIik7IH0KICAgICAgfSBlbHNlIGlmIChiLnN0YXRlID09PSAic3RhZ2dlciIpIHsKICAgICAgICBpZiAoYi5zdHVuID4gMCkgeyBiLnN0dW4gLT0gZHQ7IGIudnggKj0gMC45OyBpZiAoYi5zdHVuIDw9IDApIHsgYi5zdGF0ZSA9ICJjaXJjbGUiOyBiLnQgPSAwOyBiLmR1ciA9IDAuODsgfSB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBiLnZ4ICo9IE1hdGgucG93KDAuMDUsIGR0KTsKICAgICAgICAgIGlmIChiLnQgPiBiLmR1cikgeyBiLnN0YXRlID0gImNpcmNsZSI7IGIudCA9IDA7IGIuZHVyID0gcmFuZCgwLjQsIDEuMCk7IH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYi5zdGF0ZSA9PT0gInJlY292ZXIiKSB7CiAgICAgICAgYi52eCA9IGxlcnAoYi52eCwgMCwgTWF0aC5taW4oMSwgZHQgKiA1KSk7CiAgICAgICAgaWYgKGIudCA+IDAuNTUpIHsgYi5zdGF0ZSA9ICJjaXJjbGUiOyBiLnQgPSAwOyBiLmR1ciA9IHJhbmQoMC44LCAxLjYpOyB9CiAgICAgIH0KICAgIH0KICAgIGlmICghYi5vbkdyb3VuZCkgewogICAgICBiLnZ5ICs9IDI1MDAgKiBkdDsgYi5mZWV0ICs9IGIudnkgKiBkdDsKICAgICAgaWYgKGIuZmVldCA+PSBGRUVUKSB7CiAgICAgICAgYi5mZWV0ID0gRkVFVDsgYi52eSA9IDA7IGIub25Hcm91bmQgPSB0cnVlOyBiLnNxdWFzaCA9IDEuMjsgYi52eCA9IDA7CiAgICAgICAgaWYgKGIuc3RhdGUgIT09ICJkb3duIikgeyBiLnN0YXRlID0gInJlY292ZXIiOyBiLnQgPSAwOyB9CiAgICAgICAgRy5zaGFrZSA9IE1hdGgubWF4KEcuc2hha2UsIDE2KTsgc2hvY2tSaW5nKGIueCwgRkVFVCwgNTAwLCAicmdiYSgyNTUsMjEwLDIwMCwwLjg1KSIsIDAuNSk7IGR1c3QoYi54LCBGRUVUIC0gOCwgMTIsIDE0MCwgNjApOwogICAgICAgIHNmeCgiaGVhdnkiKTsKICAgICAgICBpZiAoTWF0aC5hYnMoY2F0LnggLSBiLngpIDwgMjIwICYmICFjYXQuZGVhZCkgeyBodXJ0Q2F0KDE0LCBzaWduKGNhdC54IC0gYi54KSk7IGNhdC52eCA9IHNpZ24oY2F0LnggLSBiLngpICogNjAwOyBhZGRUZXh0KCJDUlVOQ0ghIiwgY2F0LngsIGNhdC5mZWV0IC0gMjIwLCA2MCwgIiNmZjlhOGEiLCAwLjcsIDAuMyk7IH0KICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZlaGljbGVzLmxlbmd0aDsgaisrKSB7IHZhciB2ID0gdmVoaWNsZXNbal07IGlmICh2LnN0YXRlID09PSAidHVtYmxlIikgY29udGludWU7IGlmIChNYXRoLmFicyh2LnggLSBiLngpIDwgMzAwKSBsYXVuY2hWZWhpY2xlKHYsIHNpZ24odi54IC0gYi54KSAqIDI1MCwgLTYwMCwgc2lnbih2LnggLSBiLngpICogOSk7IH0KICAgICAgfQogICAgfQogICAgYi54ICs9IGIudnggKiBkdDsKICAgIGlmIChiLnN0YXRlICE9PSAiZG93biIgJiYgYi5zdGF0ZSAhPT0gImVudGVyIikgYi54ID0gY2xhbXAoYi54LCBCT1NTX1ggLSA0NjAsIEJPU1NfWCArIDkwMCk7CiAgICBpZiAoYi5zdGF0ZSAhPT0gImRvd24iICYmIGIuc3RhdGUgIT09ICJlbnRlciIgJiYgYi5vbkdyb3VuZCAmJiBjYXQub25Hcm91bmQpIHsKICAgICAgdmFyIGdhcCA9IGNhdC54IC0gYi54LCBtaW5HYXAgPSAxNTA7CiAgICAgIGlmIChNYXRoLmFicyhnYXApIDwgbWluR2FwKSB7IHZhciBwdXNoID0gKG1pbkdhcCAtIE1hdGguYWJzKGdhcCkpIC8gMiAqIHNpZ24oZ2FwIHx8IDEpOyBjYXQueCA9IGNsYW1wKGNhdC54ICsgcHVzaCwgQk9TU19YIC0gNDIwLCBCT1NTX1ggKyA4NDApOyBiLnggPSBjbGFtcChiLnggLSBwdXNoLCBCT1NTX1ggLSA0NjAsIEJPU1NfWCArIDkwMCk7IH0KICAgIH0KICAgIGlmIChNYXRoLmFicyhiLnZ4KSA+IDI2MCAmJiBiLmJsZENEIDw9IDAgJiYgYi5zdGF0ZSAhPT0gImVudGVyIikgewogICAgICBmb3IgKHZhciBxID0gMDsgcSA8IGJ1aWxkaW5ncy5sZW5ndGg7IHErKykgewogICAgICAgIHZhciBiZCA9IGJ1aWxkaW5nc1txXTsKICAgICAgICBpZiAoKGJkLnN0YXRlID09PSAib2siIHx8IGJkLnN0YXRlID09PSAicnVpbiIpICYmIGIueCA+IGJkLnggLSA0MCAmJiBiLnggPCBiZC54ICsgYmQudyArIDQwKSB7IGRhbWFnZUJ1aWxkaW5nKGJkLCAxLCBjbGFtcChiLngsIGJkLnggKyA1LCBiZC54ICsgYmQudyAtIDUpLCBTVFJFRVQgLSByYW5kKDMwLCAxMjApLCBzaWduKGIudngpKTsgYi5ibGRDRCA9IDAuMjU7IGJyZWFrOyB9CiAgICAgIH0KICAgIH0KICAgIGlmIChiLm9uR3JvdW5kICYmIE1hdGguYWJzKGIudngpID4gMzAgJiYgYi5zdGF0ZSAhPT0gInN0YWdnZXIiICYmIGIuc3RhdGUgIT09ICJkb3duIikgewogICAgICB2YXIgcHJldiA9IE1hdGguZmxvb3IoYi5zdGVwUGhhc2UgLyBNYXRoLlBJKTsKICAgICAgYi5zdGVwUGhhc2UgKz0gTWF0aC5hYnMoYi52eCkgKiBkdCAvIDc4ICogTWF0aC5QSTsKICAgICAgaWYgKE1hdGguZmxvb3IoYi5zdGVwUGhhc2UgLyBNYXRoLlBJKSAhPT0gcHJldikgeyBiLnN0ZXBDb3VudCsrOyBiLnNxdWFzaCA9IE1hdGgubWF4KGIuc3F1YXNoLCAwLjgpOyBib3NzU3RlcChiLnggKyBiLmZhY2luZyAqIChiLnN0ZXBDb3VudCAlIDIgPyA3NSA6IC01NSkpOyB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVTcGF3bnMoZHQpIHsKICAgIHZhciBweCA9IGNhdC54OwogICAgdmFyIGluQm9zcyA9IEcucGhhc2UgPT09ICJib3NzIiB8fCBHLnBoYXNlID09PSAiYm9zc0ludHJvIjsKICAgIGlmIChHLnBoYXNlID09PSAid29uIikgcmV0dXJuOwogICAgc3Bhd25ULm1pbCAtPSBkdDsgc3Bhd25ULmhlbGkgLT0gZHQ7IHNwYXduVC5jYXIgLT0gZHQ7CiAgICB2YXIgZ3JvdW5kID0gMCwgYWlyID0gMCwgdHJhZmZpYyA9IDA7CiAgICB2ZWhpY2xlcy5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7IGlmICh2LnN0YXRlID09PSAiZHJpdmUiKSBncm91bmQrKzsgaWYgKHYuc3RhdGUgPT09ICJ0cmFmZmljIikgdHJhZmZpYysrOyB9KTsKICAgIGhlbGlzLmZvckVhY2goZnVuY3Rpb24gKGgpIHsgaWYgKGguc3RhdGUgIT09ICJ0dW1ibGUiKSBhaXIrKzsgfSk7CiAgICB2YXIgbWF4R3JvdW5kID0gaW5Cb3NzID8gMyA6IChweCA8IDE1MDAgPyAzIDogKHB4IDwgNDAwMCA\/IDUgOiA3KSk7CiAgICBpZiAoc3Bhd25ULm1pbCA8PSAwICYmIGdyb3VuZCA8IG1heEdyb3VuZCkgewogICAgICB2YXIga2luZCA9IHB4IDwgMTMwMCA\/IHBpY2soWyJwb2xpY2UiLCAicG9saWNlIiwgInRydWNrIl0pIDogKHB4IDwgMzAwMCA\/IHBpY2soWyJwb2xpY2UiLCAidHJ1Y2siLCAidGFuayJdKSA6IHBpY2soWyJ0cnVjayIsICJ0YW5rIiwgInRhbmsiLCAicG9saWNlIl0pKTsKICAgICAgc3Bhd25WZWhpY2xlKGtpbmQsIE1hdGgucmFuZG9tKCkgPCAoaW5Cb3NzID8gMC41IDogMC43OCkgPyAxIDogLTEpOwogICAgICBzcGF3blQubWlsID0gaW5Cb3NzID8gNCA6IChweCA8IDE1MDAgPyAyLjggOiAocHggPCA0MDAwID8gMi4xIDogMS42KSk7CiAgICB9CiAgICBpZiAocHggPiAxOTAwIHx8IGluQm9zcykgewogICAgICB2YXIgbWF4QWlyID0gaW5Cb3NzID8gMiA6IChweCA8IDM1MDAgPyAyIDogKHB4IDwgNjAwMCA\/IDMgOiA0KSk7CiAgICAgIGlmIChzcGF3blQuaGVsaSA8PSAwICYmIGFpciA8IG1heEFpcikgeyBzcGF3bkhlbGkoKTsgc3Bhd25ULmhlbGkgPSBpbkJvc3MgPyA2IDogKHB4IDwgMzUwMCA\/IDQuNSA6IDMuMik7IH0KICAgIH0KICAgIGlmICghaW5Cb3NzICYmIHNwYXduVC5jYXIgPD0gMCAmJiB0cmFmZmljIDwgNCkgeyBzcGF3blZlaGljbGUoImNhciIsIE1hdGgucmFuZG9tKCkgPCAwLjUgPyAxIDogLTEpOyBzcGF3blQuY2FyID0gcmFuZCgxLjUsIDMpOyB9CiAgICBpZiAocHggPiA1MDAwIHx8IEcucGhhc2UgPT09ICJib3NzIikgewogICAgICBHLmpldFQgLT0gZHQ7CiAgICAgIGlmIChHLmpldFQgPD0gMCkgeyBzcGF3bkpldCgpOyBHLmpldFQgPSByYW5kKDEyLCAxNik7IGFkZFRleHQoIklOQ09NSU5HIEpFVFMiLCBjYXQueCwgRkVFVCAtIDQ3MCwgMzAsICIjZmY4MDYwIiwgMS4yLCAwLjIpOyB9CiAgICB9CiAgICBpZiAoRy5waGFzZSA9PT0gImNpdHkiICYmIHB4ID4gQk9TU19YIC0gMzIwKSBzdGFydEJvc3NJbnRybygpOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlUGFydHMobGlzdCwgZHQpIHsKICAgIGZvciAodmFyIGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHZhciBwID0gbGlzdFtpXTsKICAgICAgcC50ICs9IGR0OwogICAgICBpZiAocC50ID49IHAubGlmZSkgeyBsaXN0LnNwbGljZShpLCAxKTsgY29udGludWU7IH0KICAgICAgaWYgKHAudHlwZSA9PT0gImR1c3QiKSB7IHAueCArPSBwLnZ4ICogZHQ7IHAueSArPSBwLnZ5ICogZHQ7IHAudnggKj0gMC45NTsgcC52eSAqPSAwLjk1OyB9CiAgICAgIGVsc2UgaWYgKHAudHlwZSA9PT0gInNtb2tlIikgeyBwLnggKz0gcC52eCAqIGR0OyBwLnkgKz0gcC52eSAqIGR0OyBwLnZ5IC09IDYgKiBkdDsgfQogICAgICBlbHNlIGlmIChwLnR5cGUgPT09ICJmaXJlIikgeyBwLnggKz0gcC52eCAqIGR0OyBwLnkgKz0gcC52eSAqIGR0OyBwLnZ4ICo9IDAuOTI7IHAudnkgPSBwLnZ5ICogMC45MiAtIDYwICogZHQ7IH0KICAgICAgZWxzZSBpZiAocC50eXBlID09PSAiY2h1bmsiIHx8IHAudHlwZSA9PT0gImdsYXNzIikgewogICAgICAgIHAudnkgKz0gMTQwMCAqIGR0OyBwLnggKz0gcC52eCAqIGR0OyBwLnkgKz0gcC52eSAqIGR0OyBwLnJvdCArPSBwLnZyICogZHQ7CiAgICAgICAgaWYgKHAueSA+IHAuZmxvb3IgJiYgcC52eSA+IDApIHsgcC55ID0gcC5mbG9vcjsgcC52eSAqPSAtMC4zOyBwLnZ4ICo9IDAuNjsgcC52ciAqPSAwLjU7IGlmIChNYXRoLmFicyhwLnZ5KSA8IDQwKSBwLnZ5ID0gMDsgfQogICAgICB9IGVsc2UgaWYgKHAudHlwZSA9PT0gInNwYXJrIikgeyBwLnZ5ICs9IDcwMCAqIGR0OyBwLnggKz0gcC52eCAqIGR0OyBwLnkgKz0gcC52eSAqIGR0OyB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVDYW1lcmEoZHQpIHsKICAgIHZhciB0eDsKICAgIGlmIChHLnBoYXNlICE9PSAiY2l0eSIpIHsKICAgICAgdmFyIG1pZCA9IGJvc3MgPyAoY2F0LnggKyBNYXRoLm1pbihib3NzLngsIEJPU1NfWCArIDkwMCkpIC8gMiA6IGNhdC54OwogICAgICB0eCA9IGNsYW1wKG1pZCwgQk9TU19YIC0gNDAsIEJPU1NfWCArIDQyMCkgLSBXIC8gMjsKICAgIH0gZWxzZSB0eCA9IGNhdC54IC0gVyAqIDAuMzggKyBjYXQuZmFjaW5nICogNjA7CiAgICBHLmNhbVggPSBsZXJwKEcuY2FtWCwgdHgsIE1hdGgubWluKDEsIGR0ICogMy41KSk7CiAgICBHLnpvb20gPSBsZXJwKEcuem9vbSwgRy56b29tVCwgTWF0aC5taW4oMSwgZHQgKiAxLjIpKTsKICAgIHZhciBtaW5DYW0gPSBXIC8gKDIgKiBHLnpvb20pIC0gVyAvIDI7CiAgICBHLmNhbVggPSBjbGFtcChHLmNhbVgsIG1pbkNhbSwgV09STEQgLSBXIC8gMiAtIFcgLyAoMiAqIEcuem9vbSkpOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlKGR0KSB7CiAgICBpZiAoRy5zdGF0ZSAhPT0gInBsYXkiIHx8IEcucG9ydHJhaXRQYXVzZSB8fCBHLmZyb3plbikgcmV0dXJuOwogICAgRy50ICs9IGR0OwogICAgRy5zaGFrZSAqPSBNYXRoLnBvdygwLjAwNCwgZHQpOwogICAgaWYgKEcuZmxhc2ggPiAwKSBHLmZsYXNoIC09IGR0ICogMjsKICAgIGlmIChHLndhdmUgPiAwKSBHLndhdmUgLT0gZHQ7CiAgICBmb3IgKHZhciBpID0gdGV4dHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsgdmFyIHR4ID0gdGV4dHNbaV07IHR4LnQgKz0gZHQ7IGlmICh0eC50ID4gdHgubGlmZSkgdGV4dHMuc3BsaWNlKGksIDEpOyB9CiAgICBpZiAoRy5oaXRTdG9wID4gMCkgeyBHLmhpdFN0b3AgLT0gZHQ7IHJldHVybjsgfQogICAgRy5wbGF5VGltZSArPSBkdDsKICAgIEcuaWRsZVQgKz0gZHQ7CiAgICBpZiAoRy5pZGxlVCA+IDIuMikgRy5oZWF0ID0gTWF0aC5tYXgoMCwgRy5oZWF0IC0gZHQgKiAzLjUpOwogICAgRy5iZWF0VCAtPSBkdDsKICAgIGlmIChHLmJlYXRUIDw9IDApIHsKICAgICAgdmFyIGJvc3NNdXNpYyA9IEcucGhhc2UgPT09ICJib3NzIiB8fCBHLnBoYXNlID09PSAiYm9zc0ludHJvIjsKICAgICAgRy5iZWF0VCA9IGJvc3NNdXNpYyA\/IDAuMyA6IDAuNTsgRy5iZWF0Kys7CiAgICAgIGlmIChib3NzTXVzaWMpIHsgc2Z4KCJraWNrIik7IGlmIChHLmJlYXQgJSAyKSBzZngoInNuYXJlIik7IH0gZWxzZSBpZiAoRy5iZWF0ICUgMiA9PT0gMCkgc2Z4KCJraWNrIik7IGVsc2UgaWYgKEcuYmVhdCAlIDQgPT09IDMpIHNmeCgic25hcmUiKTsKICAgIH0KICAgIHVwZGF0ZUNhdChkdCk7CiAgICB1cGRhdGVCb3NzKGR0KTsKICAgIHVwZGF0ZVZlaGljbGVzKGR0KTsKICAgIHVwZGF0ZUhlbGlzKGR0KTsKICAgIHVwZGF0ZUJ1aWxkaW5ncyhkdCk7CiAgICB1cGRhdGVMYXVuY2hlcnMoZHQpOwogICAgdXBkYXRlSmV0cyhkdCk7CiAgICB1cGRhdGVTaG90cyhkdCk7CiAgICB1cGRhdGVQYXJ0cyhwYXJ0cywgZHQpOwogICAgdXBkYXRlUGFydHMoYmdQYXJ0cywgZHQpOwogICAgZm9yICh2YXIgZCA9IGRlY2Fscy5sZW5ndGggLSAxOyBkID49IDA7IGQtLSkgeyBkZWNhbHNbZF0ubGlmZSAtPSBkdDsgaWYgKGRlY2Fsc1tkXS5saWZlIDw9IDApIGRlY2Fscy5zcGxpY2UoZCwgMSk7IH0KICAgIGZvciAodmFyIHAgPSAwOyBwIDwgcHJvcHMubGVuZ3RoOyBwKyspIHsgdmFyIHByID0gcHJvcHNbcF07IGlmIChwci53b2IgIT09IDAgfHwgcHIud29iViAhPT0gMCkgeyBwci53b2JWICs9IC1wci53b2IgKiA2MCAqIGR0OyBwci53b2JWICo9IE1hdGgucG93KDAuMDUsIGR0KTsgcHIud29iICs9IHByLndvYlYgKiBkdDsgaWYgKE1hdGguYWJzKHByLndvYikgPCAwLjAwMSAmJiBNYXRoLmFicyhwci53b2JWKSA8IDAuMDEpIHsgcHIud29iID0gMDsgcHIud29iViA9IDA7IH0gfSB9CiAgICB1cGRhdGVTcGF3bnMoZHQpOwogICAgdXBkYXRlQ2FtZXJhKGR0KTsKICAgIHZhciBkbiA9IGNhdC54IDwgNDMwMCA\/ICJET1dOVE9XTiIgOiAoY2F0LnggPCBCT1NTX1ggLSAzMDAgPyAiRklOQU5DSUFMIERJU1RSSUNUIiA6ICJDSVRZIENFTlRFUiIpOwogICAgaWYgKGRuICE9PSBHLmRpc3RyaWN0KSB7IEcuZGlzdHJpY3QgPSBkbjsgRy5kaXN0cmljdFQgPSAyLjY7IH0KICAgIGlmIChHLmRpc3RyaWN0VCA+IDApIEcuZGlzdHJpY3RUIC09IGR0OwogICAgaWYgKGNhdC5kZWFkICYmIGNhdC5kZWFkVCA+IDIuMiAmJiBHLnN0YXRlID09PSAicGxheSIpIGVuZEdhbWUoZmFsc2UpOwogIH0KICBmdW5jdGlvbiBkcmF3U2t5KCkgewogICAgdmFyIGJvc3N5ID0gRy5waGFzZSAhPT0gImNpdHkiOwogICAgdmFyIGdyID0gY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIDAsIEgpOwogICAgZ3IuYWRkQ29sb3JTdG9wKDAsIGJvc3N5ID8gIiMxYTBmMWMiIDogIiMxNjFkMzMiKTsKICAgIGdyLmFkZENvbG9yU3RvcCgwLjQ1LCBib3NzeSA\/ICIjNWEyNjMwIiA6ICIjNWEzZjVjIik7CiAgICBnci5hZGRDb2xvclN0b3AoMC44LCBib3NzeSA\/ICIjZDA1NTJlIiA6ICIjZTA4YTU4Iik7CiAgICBnci5hZGRDb2xvclN0b3AoMSwgIiNmMmIwNzAiKTsKICAgIGN0eC5maWxsU3R5bGUgPSBncjsgY3R4LmZpbGxSZWN0KDAsIDAsIFcsIEgpOwogICAgY3R4LmZpbGxTdHlsZSA9IGJvc3N5ID8gInJnYmEoMjU1LDEyMCw4MCwwLjM1KSIgOiAicmdiYSgyNTUsMjIwLDE3MCwwLjM1KSI7CiAgICBjdHguYmVnaW5QYXRoKCk7IGN0eC5hcmMoVyAqIDAuNzIsIDQwMCwgMTEwLCAwLCBNYXRoLlBJICogMik7IGN0eC5maWxsKCk7CiAgICBjdHguZmlsbFN0eWxlID0gYm9zc3kgPyAicmdiYSgyNTUsMTUwLDkwLDAuNikiIDogInJnYmEoMjU1LDIzNSwyMDAsMC43KSI7CiAgICBjdHguYmVnaW5QYXRoKCk7IGN0eC5hcmMoVyAqIDAuNzIsIDQwMCwgNjAsIDAsIE1hdGguUEkgKiAyKTsgY3R4LmZpbGwoKTsKICAgIGRyYXdMYXllcihza3lGYXIsIDIxMCk7CiAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoNDAsMzAsNDAsMC4yNSkiOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgdmFyIHggPSAoKGkgKiA2NDAgLSBHLmNhbVggKiAwLjI1KSAlIChXICsgNDAwKSArIFcgKyA0MDApICUgKFcgKyA0MDApIC0gMjAwOwogICAgICBmb3IgKHZhciBrID0gMDsgayA8IDY7IGsrKykgeyBjdHguYmVnaW5QYXRoKCk7IGN0eC5hcmMoeCArIGsgKiAxOCArIE1hdGguc2luKEcudCArIGspICogNiwgNDIwIC0gayAqIDUwLCAyNiArIGsgKiA5LCAwLCBNYXRoLlBJICogMik7IGN0eC5maWxsKCk7IH0KICAgIH0KICAgIGRyYXdMYXllcihza3lNaWQsIDI2MCk7CiAgICB2YXIgaHogPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMzgwLCAwLCA2NDApOwogICAgaHouYWRkQ29sb3JTdG9wKDAsICJyZ2JhKDI0MCwxNTAsOTAsMCkiKTsgaHouYWRkQ29sb3JTdG9wKDEsICJyZ2JhKDI0MCwxNTAsOTAsMC4yNSkiKTsKICAgIGN0eC5maWxsU3R5bGUgPSBoejsgY3R4LmZpbGxSZWN0KDAsIDM4MCwgVywgMjYwKTsKICB9CiAgZnVuY3Rpb24gZHJhd0xheWVyKEwsIHlUb3ApIHsKICAgIHZhciBvZmYgPSAoKEcuY2FtWCAqIEwucGFyYSkgJSBMLmN2LndpZHRoICsgTC5jdi53aWR0aCkgJSBMLmN2LndpZHRoOwogICAgdmFyIHkgPSB5VG9wICsgKDEgLSBHLnpvb20pICogMTIwOwogICAgZm9yICh2YXIgeCA9IC1vZmY7IHggPCBXOyB4ICs9IEwuY3Yud2lkdGgpIGN0eC5kcmF3SW1hZ2UoTC5jdiwgeCwgeSk7CiAgfQogIGZ1bmN0aW9uIGRyYXdQaWxlKGIsIGhNdWwpIHsKICAgIGZvciAodmFyIGsgPSAwOyBrIDwgYi5waWxlLmxlbmd0aDsgaysrKSB7CiAgICAgIHZhciBjID0gYi5waWxlW2tdOwogICAgICBjdHguc2F2ZSgpOyBjdHgudHJhbnNsYXRlKGIueCArIGMueCwgU1RSRUVUIC0gYy5oICogaE11bCAqIDAuNCk7IGN0eC5yb3RhdGUoYy5yKTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2IoIiArIGMuYyArICIsIiArIChjLmMgLSA2KSArICIsIiArIChjLmMgLSAxMikgKyAiKSI7CiAgICAgIGN0eC5maWxsUmVjdCgtYy53IC8gMiwgLWMuaCAqIGhNdWwgLyAyLCBjLncsIGMuaCAqIGhNdWwpOwogICAgICBjdHguc3Ryb2tlU3R5bGUgPSAicmdiYSgzMCwyNSwyMiwwLjcpIjsgY3R4LmxpbmVXaWR0aCA9IDI7IGN0eC5zdHJva2VSZWN0KC1jLncgLyAyLCAtYy5oICogaE11bCAvIDIsIGMudywgYy5oICogaE11bCk7CiAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGRyYXdCdWlsZGluZ3ModmwsIHZyKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1aWxkaW5ncy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYiA9IGJ1aWxkaW5nc1tpXTsKICAgICAgaWYgKGIueCArIGIudyA8IHZsIHx8IGIueCA+IHZyKSBjb250aW51ZTsKICAgICAgaWYgKGIuc3RhdGUgPT09ICJvayIpIGN0eC5kcmF3SW1hZ2UoYi5jdiwgYi54LCBTVFJFRVQgLSBiLmgpOwogICAgICBlbHNlIGlmIChiLnN0YXRlID09PSAiY29sbGFwc2luZyIpIHsKICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4LnJlY3QoYi54IC0gNjAsIC02MDAsIGIudyArIDEyMCwgU1RSRUVUICsgNjAwKTsgY3R4LmNsaXAoKTsKICAgICAgICBjdHgudHJhbnNsYXRlKGIueCArIGIudyAvIDIgKyByYW5kKC0zLCAzKSwgU1RSRUVUICsgYi5zaW5rKTsKICAgICAgICBjdHgucm90YXRlKGIubGVhbiAqIChiLnNpbmsgLyBiLmgpKTsKICAgICAgICBjdHguZHJhd0ltYWdlKGIuY3YsIC1iLncgLyAyLCAtYi5oKTsKICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICB9IGVsc2UgaWYgKGIuc3RhdGUgPT09ICJydWluIikgewogICAgICAgIHZhciByaCA9IGIucnVpbkggfHwgYi5oOwogICAgICAgIGN0eC5kcmF3SW1hZ2UoYi50eXBlID09PSAicnVpbiIgPyBiLmN2IDogSU1HLnJ1aW5EYXJrLCBiLngsIFNUUkVFVCAtIHJoLCBiLncsIHJoKTsKICAgICAgICBkcmF3UGlsZShiLCAwLjYpOwogICAgICB9IGVsc2UgaWYgKGIuc3RhdGUgPT09ICJydWJibGUiKSBkcmF3UGlsZShiLCAxLjQpOwogICAgfQogICAgZm9yICh2YXIgaiA9IDA7IGogPCBsYXVuY2hlcnMubGVuZ3RoOyBqKyspIHsKICAgICAgdmFyIEwgPSBsYXVuY2hlcnNbal07CiAgICAgIGlmIChMLmRlYWQgfHwgTC5iLnN0YXRlICE9PSAib2siIHx8IEwueCA8IHZsIC0gNTAgfHwgTC54ID4gdnIgKyA1MCkgY29udGludWU7CiAgICAgIHZhciBseSA9IGxhdW5jaGVyWShMKTsKICAgICAgY3R4LnNhdmUoKTsgY3R4LnRyYW5zbGF0ZShMLngsIGx5KTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjNGI1NTMwIjsgY3R4LmZpbGxSZWN0KC0yMCwgMCwgNDAsIDEyKTsKICAgICAgY3R4LnJvdGF0ZShjYXQueCA8IEwueCA\/IC0yLjYgOiAtMC41NSk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzVkNmEzYSI7IGN0eC5maWxsUmVjdCgtNCwgLTgsIDMwLCAxNCk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzJmMzUyMCI7IGN0eC5maWxsUmVjdCgyNCwgLTcsIDQsIDUpOyBjdHguZmlsbFJlY3QoMjQsIDAsIDQsIDUpOwogICAgICBjdHgucmVzdG9yZSgpOwogICAgICBpZiAoTWF0aC5zaW4oRy50ICogNiArIGopID4gMC42KSB7IGN0eC5maWxsU3R5bGUgPSAiI2ZmMzAzMCI7IGN0eC5maWxsUmVjdChMLnggLSAyLCBseSAtIDQsIDQsIDQpOyB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGRyYXdTdHJlZXQodmwsIHZyKSB7CiAgICB2YXIgbCA9IHZsIC0gMjAsIHcgPSB2ciAtIHZsICsgNDA7CiAgICBjdHguZmlsbFN0eWxlID0gIiM3ZDdhNzYiOyBjdHguZmlsbFJlY3QobCwgU1RSRUVULCB3LCAxNik7CiAgICBjdHguZmlsbFN0eWxlID0gIiM1ZTViNTgiOyBjdHguZmlsbFJlY3QobCwgU1RSRUVUICsgMTYsIHcsIDQpOwogICAgY3R4LmZpbGxTdHlsZSA9ICIjMzgzNzNjIjsgY3R4LmZpbGxSZWN0KGwsIFNUUkVFVCArIDIwLCB3LCBIIC0gU1RSRUVUICsgMjAwKTsKICAgIGN0eC5maWxsU3R5bGUgPSAiI2U2ZDQ4YSI7CiAgICB2YXIgc3RhcnQgPSBNYXRoLmZsb29yKGwgLyA5MCkgKiA5MDsKICAgIGZvciAodmFyIHggPSBzdGFydDsgeCA8IHZyICsgMjA7IHggKz0gOTApIGN0eC5maWxsUmVjdCh4LCA2NjIsIDQ2LCA0KTsKICAgIGN0eC5maWxsU3R5bGUgPSAiIzJjMmIzMCI7IGN0eC5maWxsUmVjdChsLCBIIC0gNiwgdywgMjAwKTsKICAgIGN0eC5zdHJva2VTdHlsZSA9ICJyZ2JhKDE1LDEyLDEyLDAuNzUpIjsgY3R4LmxpbmVXaWR0aCA9IDI7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlY2Fscy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZCA9IGRlY2Fsc1tpXTsKICAgICAgaWYgKGQuc2Vnc1swXVswXSA8IHZsIC0gNTAgfHwgZC5zZWdzWzBdWzBdID4gdnIgKyA1MCkgY29udGludWU7CiAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IE1hdGgubWluKDEsIGQubGlmZSAvIDMpOwogICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgZC5zZWdzLmxlbmd0aDsgcysrKSB7IGN0eC5tb3ZlVG8oZC5zZWdzW3NdWzBdLCBkLnNlZ3Nbc11bMV0pOyBjdHgubGluZVRvKGQuc2Vnc1tzXVsyXSwgZC5zZWdzW3NdWzNdKTsgfQogICAgICBjdHguc3Ryb2tlKCk7CiAgICB9CiAgICBjdHguZ2xvYmFsQWxwaGEgPSAxOwogIH0KICBmdW5jdGlvbiBkcmF3UHJvcHModmwsIHZyKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBwID0gcHJvcHNbaV07CiAgICAgIGlmIChwLnggPCB2bCAtIDQwIHx8IHAueCA+IHZyICsgNDApIGNvbnRpbnVlOwogICAgICBjdHguc2F2ZSgpOyBjdHgudHJhbnNsYXRlKHAueCwgU1RSRUVUICsgOCk7CiAgICAgIGN0eC5yb3RhdGUocC53b2IgKiAwLjAzICsgKHAuYmVuZCA\/IChwLmJlbmREaXIgfHwgMSkgKiAxLjEgOiAwKSk7CiAgICAgIGlmIChwLmtpbmQgPT09ICJsYW1wIikgewogICAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzJiMmIzMCI7IGN0eC5maWxsUmVjdCgtMiwgLTYyLCA0LCA2Mik7IGN0eC5maWxsUmVjdCgtMiwgLTYyLCAxNiwgMyk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHAuYmVuZCA\/ICIjNjY1IiA6ICIjZmZlNmEwIjsgY3R4LmZpbGxSZWN0KDEwLCAtNjAsIDgsIDQpOwogICAgICAgIGlmICghcC5iZW5kKSB7IGN0eC5maWxsU3R5bGUgPSAicmdiYSgyNTUsMjMwLDE2MCwwLjE4KSI7IGN0eC5iZWdpblBhdGgoKTsgY3R4LmFyYygxNCwgLTU2LCAxNCwgMCwgTWF0aC5QSSAqIDIpOyBjdHguZmlsbCgpOyB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjMmIyYjMwIjsgY3R4LmZpbGxSZWN0KC0yLCAtNDAsIDMsIDQwKTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gImhzbCgiICsgcC5odWUgKyAiLDU1JSw0NSUpIjsgY3R4LmZpbGxSZWN0KC0xNCwgLTU0LCAyOCwgMTYpOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAicmdiYSgyNTUsMjU1LDI1NSwwLjcpIjsgY3R4LmZpbGxSZWN0KC0xMCwgLTQ4LCAyMCwgMyk7CiAgICAgIH0KICAgICAgY3R4LnJlc3RvcmUoKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gcnIoeCwgeSwgdywgaCwgcikgeyBjdHguYmVnaW5QYXRoKCk7IGN0eC5tb3ZlVG8oeCArIHIsIHkpOyBjdHgubGluZVRvKHggKyB3IC0gciwgeSk7IGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHggKyB3LCB5LCB4ICsgdywgeSArIHIpOyBjdHgubGluZVRvKHggKyB3LCB5ICsgaCAtIHIpOyBjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgdywgeSArIGgsIHggKyB3IC0gciwgeSArIGgpOyBjdHgubGluZVRvKHggKyByLCB5ICsgaCk7IGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHkgKyBoLCB4LCB5ICsgaCAtIHIpOyBjdHgubGluZVRvKHgsIHkgKyByKTsgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSwgeCArIHIsIHkpOyBjdHguY2xvc2VQYXRoKCk7IH0KICBmdW5jdGlvbiB3aGVlbCh4LCB5LCByKSB7IGN0eC5maWxsU3R5bGUgPSAiIzFkMWQyMCI7IGN0eC5iZWdpblBhdGgoKTsgY3R4LmFyYyh4LCB5LCByLCAwLCBNYXRoLlBJICogMik7IGN0eC5maWxsKCk7IGN0eC5maWxsU3R5bGUgPSAiIzc3NyI7IGN0eC5iZWdpblBhdGgoKTsgY3R4LmFyYyh4LCB5LCByICogMC40LCAwLCBNYXRoLlBJICogMik7IGN0eC5maWxsKCk7IH0KICBmdW5jdGlvbiBkcmF3VmVoaWNsZSh2KSB7CiAgICB2YXIgdyA9IHYudywgaCA9IHYuaDsKICAgIGN0eC5zYXZlKCk7CiAgICBjdHgudHJhbnNsYXRlKHYueCwgdi55IC0gaCAvIDIgKyB2LmJvdW5jZVkpOwogICAgY3R4LnJvdGF0ZSh2LnJvdCk7CiAgICB2YXIgZmxhdCA9IHYuc3RhdGUgPT09ICJjcnVzaGVkIiA\/IDAuMzggOiAxOwogICAgaWYgKGZsYXQgPCAxKSBjdHgudHJhbnNsYXRlKDAsIGggKiAwLjMpOwogICAgY3R4LnNjYWxlKHYuZGlyLCBmbGF0KTsKICAgIGlmICh2LmtpbmQgPT09ICJjYXIiKSB7CiAgICAgIGN0eC5maWxsU3R5bGUgPSB2LmNvbG9yOyBycigtdyAvIDIsIC1oICogMC4wNSwgdywgaCAqIDAuNDUsIDUpOyBjdHguZmlsbCgpOwogICAgICBjdHguYmVnaW5QYXRoKCk7IGN0eC5tb3ZlVG8oLXcgKiAwLjMsIC1oICogMC4wNSk7IGN0eC5saW5lVG8oLXcgKiAwLjE4LCAtaCAqIDAuNDUpOyBjdHgubGluZVRvKHcgKiAwLjE4LCAtaCAqIDAuNDUpOyBjdHgubGluZVRvKHcgKiAwLjMyLCAtaCAqIDAuMDUpOyBjdHguZmlsbCgpOwogICAgICBjdHguZmlsbFN0eWxlID0gIiNiZmUwZjAiOyBjdHguZmlsbFJlY3QoLXcgKiAwLjE2LCAtaCAqIDAuMzgsIHcgKiAwLjE0LCBoICogMC4yOCk7IGN0eC5maWxsUmVjdCh3ICogMC4wMiwgLWggKiAwLjM4LCB3ICogMC4xNSwgaCAqIDAuMjgpOwogICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmU2YTAiOyBjdHguZmlsbFJlY3QodyAqIDAuNDQsIGggKiAwLjAyLCA0LCA0KTsKICAgICAgd2hlZWwoLXcgKiAwLjMsIGggKiAwLjQyLCBoICogMC4yKTsgd2hlZWwodyAqIDAuMywgaCAqIDAuNDIsIGggKiAwLjIpOwogICAgfSBlbHNlIGlmICh2LmtpbmQgPT09ICJwb2xpY2UiKSB7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2YyZjJmMiI7IHJyKC13IC8gMiwgLWggKiAwLjA1LCB3LCBoICogMC40NSwgNSk7IGN0eC5maWxsKCk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzFjMWYyYSI7IGN0eC5maWxsUmVjdCgtdyAvIDIsIGggKiAwLjE2LCB3LCBoICogMC4yMik7CiAgICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4Lm1vdmVUbygtdyAqIDAuMywgLWggKiAwLjA1KTsgY3R4LmxpbmVUbygtdyAqIDAuMTgsIC1oICogMC40NSk7IGN0eC5saW5lVG8odyAqIDAuMTgsIC1oICogMC40NSk7IGN0eC5saW5lVG8odyAqIDAuMzIsIC1oICogMC4wNSk7IGN0eC5maWxsKCk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2JmZTBmMCI7IGN0eC5maWxsUmVjdCgtdyAqIDAuMTUsIC1oICogMC4zOCwgdyAqIDAuMywgaCAqIDAuMjYpOwogICAgICB2YXIgb24gPSBNYXRoLnNpbihHLnQgKiAxOCkgPiAwOwogICAgICBjdHguZmlsbFN0eWxlID0gb24gPyAiI2ZmMmEyYSIgOiAiIzVhMTAxMCI7IGN0eC5maWxsUmVjdCgtMTAsIC1oICogMC41OCwgOSwgNSk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSBvbiA\/ICIjMWEzYThhIiA6ICIjM2E4YWZmIjsgY3R4LmZpbGxSZWN0KDEsIC1oICogMC41OCwgOSwgNSk7CiAgICAgIHdoZWVsKC13ICogMC4zLCBoICogMC40MiwgaCAqIDAuMik7IHdoZWVsKHcgKiAwLjMsIGggKiAwLjQyLCBoICogMC4yKTsKICAgIH0gZWxzZSBpZiAodi5raW5kID09PSAidHJ1Y2siKSB7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzU2NjAyZiI7IHJyKC13IC8gMiwgLWggKiAwLjUsIHcgKiAwLjY2LCBoICogMC44MiwgNCk7IGN0eC5maWxsKCk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzZjNzg0MCI7IGN0eC5iZWdpblBhdGgoKTsgY3R4Lm1vdmVUbygtdyAvIDIsIC1oICogMC41KTsgY3R4LnF1YWRyYXRpY0N1cnZlVG8oLXcgKiAwLjE3LCAtaCAqIDAuNzUsIHcgKiAwLjE2LCAtaCAqIDAuNSk7IGN0eC5maWxsKCk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzRiNTQyOCI7IHJyKHcgKiAwLjE2LCAtaCAqIDAuMjUsIHcgKiAwLjM0LCBoICogMC41NywgNCk7IGN0eC5maWxsKCk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2E4YzhkMCI7IGN0eC5maWxsUmVjdCh3ICogMC4zLCAtaCAqIDAuMTgsIHcgKiAwLjE0LCBoICogMC4yKTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjMmIyZjE4IjsgY3R4LmZpbGxSZWN0KHcgKiAwLjEsIC1oICogMC42MiwgMzAsIDUpOwogICAgICB3aGVlbCgtdyAqIDAuMzIsIGggKiAwLjM2LCBoICogMC4xNyk7IHdoZWVsKC13ICogMC4xMiwgaCAqIDAuMzYsIGggKiAwLjE3KTsgd2hlZWwodyAqIDAuMzQsIGggKiAwLjM2LCBoICogMC4xNyk7CiAgICB9IGVsc2UgewogICAgICBjdHguZmlsbFN0eWxlID0gIiMyYTJkMWQiOyBycigtdyAvIDIsIGggKiAwLjA1LCB3LCBoICogMC4zOCwgMTIpOyBjdHguZmlsbCgpOwogICAgICBmb3IgKHZhciBrID0gMDsgayA8IDU7IGsrKykgd2hlZWwoLXcgKiAwLjM4ICsgayAqIHcgKiAwLjE5LCBoICogMC4yNCwgaCAqIDAuMTIpOwogICAgICBjdHguZmlsbFN0eWxlID0gIiM1YjYyMzYiOyBjdHguYmVnaW5QYXRoKCk7IGN0eC5tb3ZlVG8oLXcgKiAwLjUsIGggKiAwLjA2KTsgY3R4LmxpbmVUbygtdyAqIDAuNDIsIC1oICogMC4yKTsgY3R4LmxpbmVUbyh3ICogMC40NiwgLWggKiAwLjIpOyBjdHgubGluZVRvKHcgKiAwLjUyLCBoICogMC4wNik7IGN0eC5maWxsKCk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzZhNzI0MCI7IHJyKC13ICogMC4yNSwgLWggKiAwLjUsIHcgKiAwLjQ1LCBoICogMC4zMiwgOCk7IGN0eC5maWxsKCk7CiAgICAgIGN0eC5zYXZlKCk7IGN0eC50cmFuc2xhdGUodyAqIDAuMTUsIC1oICogMC4zNik7CiAgICAgIGN0eC5yb3RhdGUodi5zdGF0ZSA9PT0gImRyaXZlIiA\/IC0wLjI4IDogMCk7IGN0eC5maWxsU3R5bGUgPSAiIzRmNTYzMCI7IGN0eC5maWxsUmVjdCgwLCAtNCwgdyAqIDAuNSwgOCk7CiAgICAgIGlmICh2LmZsYXNoVCA+IDApIHsgY3R4LmZpbGxTdHlsZSA9ICIjZmZkMzRhIjsgY3R4LmJlZ2luUGF0aCgpOyBjdHguYXJjKHcgKiAwLjU1LCAwLCAxMiwgMCwgTWF0aC5QSSAqIDIpOyBjdHguZmlsbCgpOyB9CiAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICB9CiAgICBpZiAodi5zdGF0ZSA9PT0gImNydXNoZWQiKSB7IGN0eC5maWxsU3R5bGUgPSAicmdiYSgyMCwxNSwxMCwwLjQ1KSI7IGN0eC5maWxsUmVjdCgtdyAvIDIsIC1oICogMC42LCB3LCBoICogMS4yKTsgfQogICAgY3R4LnJlc3RvcmUoKTsKICAgIGlmICh2LnN0dW4gPiAwKSBkcmF3U3RhcnModi54LCB2LnkgLSB2LmggLSAxNiwgMC42KTsKICB9CiAgZnVuY3Rpb24gZHJhd1N0YXJzKHgsIHksIHMpIHsKICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmZjZhMCI7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykgeyB2YXIgYSA9IEcudCAqIDUgKyBpICogMi4xOyBjdHguYmVnaW5QYXRoKCk7IGN0eC5hcmMoeCArIE1hdGguY29zKGEpICogMjYgKiBzLCB5ICsgTWF0aC5zaW4oYSkgKiA4ICogcywgNCAqIHMgKyAxLCAwLCBNYXRoLlBJICogMik7IGN0eC5maWxsKCk7IH0KICB9CiAgZnVuY3Rpb24gZHJhd0hlbGkoaCkgewogICAgdmFyIGltZyA9IGgudmFyaWFudCA9PT0gMSA\/IElNRy5oZWxpMSA6IElNRy5oZWxpMiwgc2MgPSAwLjcyOwogICAgY3R4LnNhdmUoKTsgY3R4LnRyYW5zbGF0ZShoLngsIGgueSk7IGN0eC5yb3RhdGUoaC5yb3QpOyBjdHguc2NhbGUoaC5mYWNlICogc2MsIHNjKTsKICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAtaW1nLndpZHRoIC8gMiwgLWltZy5oZWlnaHQgLyAyKTsKICAgIGlmIChoLnN0YXRlICE9PSAidHVtYmxlIikgewogICAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMzAsMzAsMzAsIiArICgwLjI1ICsgMC4xNSAqIE1hdGguc2luKEcudCAqIDYwKSkgKyAiKSI7CiAgICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4LmVsbGlwc2UoLWltZy53aWR0aCAqIDAuMDUsIC1pbWcuaGVpZ2h0ICogMC40MiwgaW1nLndpZHRoICogMC41NSwgNiwgMCwgMCwgTWF0aC5QSSAqIDIpOyBjdHguZmlsbCgpOwogICAgfQogICAgY3R4LnJlc3RvcmUoKTsKICAgIGlmIChoLnN0YXRlID09PSAic3R1biIpIGRyYXdTdGFycyhoLngsIGgueSAtIDUwLCAwLjgpOwogIH0KICBmdW5jdGlvbiBkcmF3SmV0KGopIHsKICAgIGN0eC5zYXZlKCk7IGN0eC50cmFuc2xhdGUoai54LCBqLnkpOyBpZiAoai5zdGF0ZSA9PT0gInR1bWJsZSIpIGN0eC5yb3RhdGUoai5yb3QpOwogICAgY3R4LnNjYWxlKGouZGlyLCAxKTsKICAgIGN0eC5maWxsU3R5bGUgPSAiIzhhOTA5OCI7CiAgICBjdHguYmVnaW5QYXRoKCk7IGN0eC5tb3ZlVG8oNjAsIDApOyBjdHgubGluZVRvKDIwLCAtOCk7IGN0eC5saW5lVG8oLTQwLCAtOCk7IGN0eC5saW5lVG8oLTU1LCAtMjQpOyBjdHgubGluZVRvKC02MiwgLTI0KTsgY3R4LmxpbmVUbygtNTgsIC02KTsgY3R4LmxpbmVUbygtNjAsIDQpOyBjdHgubGluZVRvKDIwLCA4KTsgY3R4LmNsb3NlUGF0aCgpOyBjdHguZmlsbCgpOwogICAgY3R4LmZpbGxTdHlsZSA9ICIjNmE3MDc4IjsgY3R4LmJlZ2luUGF0aCgpOyBjdHgubW92ZVRvKDEwLCAyKTsgY3R4LmxpbmVUbygtMzAsIDI2KTsgY3R4LmxpbmVUbygtNDAsIDI2KTsgY3R4LmxpbmVUbygtMjAsIDIpOyBjdHguZmlsbCgpOwogICAgY3R4LmZpbGxTdHlsZSA9ICIjOWZkMGZmIjsgY3R4LmZpbGxSZWN0KDIyLCAtMTAsIDE2LCA1KTsKICAgIGN0eC5maWxsU3R5bGUgPSAicmdiYSgyNTUsMTYwLDYwLCIgKyAoMC42ICsgTWF0aC5yYW5kb20oKSAqIDAuNCkgKyAiKSI7IGN0eC5iZWdpblBhdGgoKTsgY3R4Lm1vdmVUbygtNjAsIC00KTsgY3R4LmxpbmVUbygtOTAgLSBNYXRoLnJhbmRvbSgpICogMjAsIDApOyBjdHgubGluZVRvKC02MCwgNCk7IGN0eC5maWxsKCk7CiAgICBjdHgucmVzdG9yZSgpOwogIH0KICBmdW5jdGlvbiBwbGF5ZXJQb3NlKCkgewogICAgdmFyIHAgPSB7IHBvc2U6ICJpZGxlIiwgcm90OiAwLCBzeDogMSwgc3k6IDEsIG94OiAwLCBveTogMCB9OwogICAgdmFyIHdhbGsgPSBNYXRoLm1pbigxLCBNYXRoLmFicyhjYXQudngpIC8gMjAwKTsKICAgIGlmIChjYXQub25Hcm91bmQpIHsKICAgICAgcC5veSA9IC1NYXRoLmFicyhNYXRoLnNpbihjYXQuc3RlcFBoYXNlKSkgKiA4ICogd2FsazsKICAgICAgcC5yb3QgPSBNYXRoLnNpbihjYXQuc3RlcFBoYXNlKSAqIDAuMDMgKiB3YWxrICsgY2F0Lmxvb2tSb3QgKyB3YWxrICogMC4wMzsKICAgIH0gZWxzZSB7CiAgICAgIHAucm90ID0gY2xhbXAoY2F0LnZ5ICogMC4wMDAwOCwgLTAuMSwgMC4xMik7CiAgICAgIHAuc3kgPSBjYXQudnkgPCAwID8gMS4wNSA6IDE7IHAuc3ggPSBjYXQudnkgPCAwID8gMC45NiA6IDE7CiAgICAgIGlmIChjYXQuYWlyU2xhbSkgeyBwLnBvc2UgPSAic3dpcGUiOyBwLnJvdCA9IDAuMjU7IH0KICAgIH0KICAgIHZhciBzcSA9IGNhdC5zcXVhc2g7CiAgICBwLnN5ICo9IDEgLSAwLjA0NSAqIHNxOyBwLnN4ICo9IDEgKyAwLjAzICogc3E7CiAgICB2YXIgYSA9IGNhdC5hY3Q7CiAgICBpZiAoYSkgewogICAgICB2YXIgdCA9IGEudCwgdyA9IGEud2luZCwgYWMgPSBhLmFjdGl2ZSwgaGVhdnkgPSBhLnR5cGUgPT09ICJoZWF2eSI7CiAgICAgIGlmIChhLnR5cGUgPT09ICJzd2lwZSIgfHwgaGVhdnkpIHsKICAgICAgICB2YXIgYmFjayA9IGhlYXZ5ID8gLTAuMTcgOiAtMC4xLCBmd2QgPSBoZWF2eSA\/IDAuMTEgOiAwLjA3LCBieCA9IGhlYXZ5ID8gLTE2IDogLTksIGZ4ID0gaGVhdnkgPyAyOCA6IDE2OwogICAgICAgIGlmIChhLmlkeCA9PT0gMSkgeyBiYWNrICo9IDAuNzsgZndkICo9IDEuMTsgfQogICAgICAgIGlmICh0IDwgdykgeyB2YXIgayA9IHQgLyB3OyBwLnJvdCArPSBiYWNrICogazsgcC5veCA9IGJ4ICogazsgcC5zeCAqPSAxIC0gMC4wMyAqIGs7IGlmIChoZWF2eSkgcC5veSAtPSAxMiAqIGs7IH0KICAgICAgICBlbHNlIGlmICh0IDwgdyArIGFjKSB7IHZhciBxID0gZWFzZU91dCgodCAtIHcpIC8gYWMpOyBwLnBvc2UgPSAic3dpcGUiOyBwLnJvdCArPSBsZXJwKGJhY2ssIGZ3ZCwgcSk7IHAub3ggPSBsZXJwKGJ4LCBmeCwgcSk7IGlmIChoZWF2eSkgcC5veSAtPSAxMiAqICgxIC0gcSk7IH0KICAgICAgICBlbHNlIHsgdmFyIHIgPSAodCAtIHcgLSBhYykgLyBhLnJlYzsgcC5wb3NlID0gciA8IDAuNjUgPyAic3dpcGUiIDogImlkbGUiOyBwLnJvdCArPSBmd2QgKiAoMSAtIHIpOyBwLm94ID0gZnggKiAoMSAtIHIpOyB9CiAgICAgICAgaWYgKGEuaWR4ID09PSAxICYmIHAucG9zZSA9PT0gInN3aXBlIikgcC5veSAtPSA2OwogICAgICB9IGVsc2UgaWYgKGEudHlwZSA9PT0gInRhaWwiKSB7CiAgICAgICAgdmFyIHRrID0gdCA8IHcgPyB0IC8gdyA6ICh0IDwgdyArIGFjID8gMSA6IDEgLSAodCAtIHcgLSBhYykgLyBhLnJlYyk7CiAgICAgICAgcC5yb3QgKz0gMC4wOSAqIHRrOyBwLm94ID0gMTAgKiB0azsgcC5zeSAqPSAxIC0gMC4wMyAqIHRrOwogICAgICB9IGVsc2UgaWYgKGEudHlwZSA9PT0gInJvYXIiKSB7CiAgICAgICAgdmFyIHJrID0gdCA8IHcgPyB0IC8gdyA6ICh0IDwgdyArIGFjID8gMSA6IDEgLSAodCAtIHcgLSBhYykgLyBhLnJlYyk7CiAgICAgICAgcC5yb3QgKz0gLTAuMDkgKiByazsgcC5zeSAqPSAxICsgMC4wNCAqIHJrOyBwLm95IC09IDggKiByayArICh0ID4gdyAmJiB0IDwgdyArIGFjID8gTWF0aC5zaW4oRy50ICogNjApICogMiA6IDApOwogICAgICB9IGVsc2UgaWYgKGEudHlwZSA9PT0gInNwZWNpYWwiKSB7CiAgICAgICAgaWYgKHQgPCB3KSB7IHZhciBzayA9IHQgLyB3OyBwLnJvdCAtPSAwLjIgKiBzazsgcC5veSAtPSA0MCAqIHNrOyBwLnN5ICo9IDEgKyAwLjA2ICogc2s7IH0KICAgICAgICBlbHNlIHsgdmFyIHNyID0gTWF0aC5taW4oMSwgKHQgLSB3KSAvIChhYyArIGEucmVjKSk7IHAucG9zZSA9IHNyIDwgMC42ID8gInN3aXBlIiA6ICJpZGxlIjsgcC5yb3QgKz0gMC4yMiAqICgxIC0gc3IpOyBwLnN5ICo9IDEgLSAwLjA4ICogKDEgLSBzcik7IH0KICAgICAgfSBlbHNlIGlmIChhLnR5cGUgPT09ICJjcm91Y2giKSB7CiAgICAgICAgdmFyIGNrID0gdCAvIHc7IHAuc3kgKj0gMSAtIDAuMTMgKiBjazsgcC5zeCAqPSAxICsgMC4wNyAqIGNrOwogICAgICB9CiAgICB9CiAgICBpZiAoY2F0LmRlYWQpIHsgcC5yb3QgPSAtTWF0aC5taW4oMS4zNSwgY2F0LmRlYWRUICogMS42KTsgcC5veSA9IE1hdGgubWluKDQwLCBjYXQuZGVhZFQgKiA0MCk7IH0KICAgIHJldHVybiBwOwogIH0KICBmdW5jdGlvbiBib3NzUG9zZSgpIHsKICAgIHZhciBiID0gYm9zcywgcCA9IHsgcG9zZTogImlkbGUiLCByb3Q6IDAsIHN4OiAxLCBzeTogMSwgb3g6IDAsIG95OiAwIH07CiAgICB2YXIgd2FsayA9IE1hdGgubWluKDEsIE1hdGguYWJzKGIudngpIC8gMjAwKTsKICAgIGlmIChiLm9uR3JvdW5kKSB7IHAub3kgPSAtTWF0aC5hYnMoTWF0aC5zaW4oYi5zdGVwUGhhc2UpKSAqIDggKiB3YWxrOyBwLnJvdCA9IE1hdGguc2luKGIuc3RlcFBoYXNlKSAqIDAuMDMgKiB3YWxrICsgd2FsayAqIDAuMDM7IH0KICAgIGVsc2UgeyBwLnBvc2UgPSAic3dpcGUiOyBwLnJvdCA9IGNsYW1wKGIudnkgKiAwLjAwMDEsIC0wLjEyLCAwLjE0KTsgfQogICAgcC5zeSAqPSAxIC0gMC4wNDUgKiBiLnNxdWFzaDsgcC5zeCAqPSAxICsgMC4wMyAqIGIuc3F1YXNoOwogICAgaWYgKGIuc3RhdGUgPT09ICJoaXNzIikgeyBwLnN5ICo9IDEuMDYgKyBNYXRoLnNpbihHLnQgKiA0MCkgKiAwLjAxOyBwLnJvdCAtPSAwLjA2OyBwLm95IC09IDEwOyB9CiAgICBlbHNlIGlmIChiLnN0YXRlID09PSAic3dpcGVXaW5kIikgeyBwLnJvdCAtPSAwLjE0ICogTWF0aC5taW4oMSwgYi50IC8gMC4zKTsgcC5veCA9IC0xMjsgfQogICAgZWxzZSBpZiAoYi5zdGF0ZSA9PT0gInN3aXBlIikgeyBwLnBvc2UgPSAic3dpcGUiOyBwLnJvdCArPSAwLjA4OyBwLm94ID0gMTg7IH0KICAgIGVsc2UgaWYgKGIuc3RhdGUgPT09ICJjaGFyZ2UiKSB7IHAucm90ICs9IDAuMTI7IHAucG9zZSA9ICJzd2lwZSI7IH0KICAgIGVsc2UgaWYgKGIuc3RhdGUgPT09ICJwb3VuY2VXaW5kIikgeyBwLnN5ICo9IDAuODg7IHAuc3ggKj0gMS4wNjsgfQogICAgcC5yb3QgLT0gYi5zbmFwOwogICAgaWYgKGIuc3RhdGUgPT09ICJkb3duIikgeyBwLnJvdCA9IC1NYXRoLm1pbigxLjQsIGIuZGVhZFQgKiAxLjQpOyBwLm95ID0gTWF0aC5taW4oNTAsIGIuZGVhZFQgKiA0MCk7IH0KICAgIHJldHVybiBwOwogIH0KICBmdW5jdGlvbiBkcmF3S2FpanUoeCwgZmVldCwgZmFjaW5nLCBwLCBzZXQsIGZsYXNoQ29sLCBmbGFzaEEpIHsKICAgIHZhciBpbWcgPSBwLnBvc2UgPT09ICJzd2lwZSIgPyBzZXQuc3dpcGUgOiBzZXQuaWRsZTsKICAgIHZhciBzID0gQ0FUX0ggLyBzZXQuaWRsZS5oZWlnaHQ7CiAgICB2YXIgYXggPSBzZXQuaWRsZS53aWR0aCAqIDAuNTQ1OwogICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDAsMCwwLDAuMykiOwogICAgdmFyIHNoID0gTWF0aC5tYXgoMC40LCAxIC0gKEZFRVQgLSBmZWV0KSAvIDUwMCk7CiAgICBjdHguYmVnaW5QYXRoKCk7IGN0eC5lbGxpcHNlKHgsIEZFRVQgKyAyLCAxMzAgKiBzaCwgMTQgKiBzaCwgMCwgMCwgTWF0aC5QSSAqIDIpOyBjdHguZmlsbCgpOwogICAgY3R4LnNhdmUoKTsKICAgIGN0eC50cmFuc2xhdGUoeCArIHAub3ggKiBmYWNpbmcsIGZlZXQgKyBwLm95KTsKICAgIGN0eC5zY2FsZShmYWNpbmcsIDEpOwogICAgY3R4LnJvdGF0ZShwLnJvdCk7CiAgICBjdHguc2NhbGUocC5zeCAqIHMsIHAuc3kgKiBzKTsKICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAtYXgsIC1pbWcuaGVpZ2h0KTsKICAgIGlmIChmbGFzaEEgPiAwKSB7CiAgICAgIHZhciBmbCA9IHAucG9zZSA9PT0gInN3aXBlIiA\/IChmbGFzaENvbCA9PT0gInciID8gc2V0LnN3aXBlVyA6IHNldC5zd2lwZVIpIDogKGZsYXNoQ29sID09PSAidyIgPyBzZXQuaWRsZVcgOiBzZXQuaWRsZVIpOwogICAgICBjdHguZ2xvYmFsQWxwaGEgPSBmbGFzaEE7IGN0eC5kcmF3SW1hZ2UoZmwsIC1heCwgLWltZy5oZWlnaHQpOyBjdHguZ2xvYmFsQWxwaGEgPSAxOwogICAgfQogICAgaWYgKHNldC5leWVzKSB7CiAgICAgIHZhciBleCA9IHAucG9zZSA9PT0gInN3aXBlIiA\/IC1heCArIGltZy53aWR0aCAqIDAuNjE1IDogLWF4ICsgaW1nLndpZHRoICogMC43NDU7CiAgICAgIHZhciBleSA9IC1pbWcuaGVpZ2h0ICsgaW1nLmhlaWdodCAqIChwLnBvc2UgPT09ICJzd2lwZSIgPyAwLjIyNSA6IDAuMjMpOwogICAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMjU1LDI0MCw4MCwwLjkpIjsgY3R4LnNoYWRvd0NvbG9yID0gIiNmZmVmNTAiOyBjdHguc2hhZG93Qmx1ciA9IDE4OwogICAgICBjdHguYmVnaW5QYXRoKCk7IGN0eC5lbGxpcHNlKGV4LCBleSwgOSwgNiwgMCwgMCwgTWF0aC5QSSAqIDIpOyBjdHguZmlsbCgpOwogICAgICBjdHguc2hhZG93Qmx1ciA9IDA7CiAgICB9CiAgICBjdHgucmVzdG9yZSgpOwogIH0KICBmdW5jdGlvbiBkcmF3QXJjcyhjeCwgY3ksIGYsIGEwLCBhMSwgcCwgckJhc2UsIGNvbCwgd0Jhc2UsIGdhcCwgZmFkZSkgewogICAgdmFyIGUgPSBlYXNlT3V0KHApOwogICAgdmFyIGhlYWQgPSBsZXJwKGEwLCBhMSwgZSksIHRsID0gbGVycChhMCwgYTEsIE1hdGgubWF4KDAsIGUgLSAwLjUpKTsKICAgIGN0eC5zYXZlKCk7IGN0eC50cmFuc2xhdGUoY3gsIGN5KTsgY3R4LnNjYWxlKGYsIDEpOyBjdHgubGluZUNhcCA9ICJyb3VuZCI7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykgewogICAgICB2YXIgciA9IHJCYXNlICsgaSAqIGdhcDsKICAgICAgZm9yICh2YXIgc2cgPSAwOyBzZyA8IDU7IHNnKyspIHsKICAgICAgICB2YXIgczAgPSBsZXJwKHRsLCBoZWFkLCBzZyAvIDUpLCBzMSA9IGxlcnAodGwsIGhlYWQsIChzZyArIDEpIC8gNSk7CiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gInJnYmEoIiArIGNvbCArICIsIiArICgoMC4yNSArIDAuNyAqIChzZyArIDEpIC8gNSkgKiAoMSAtIGkgKiAwLjIyKSAqIGZhZGUpICsgIikiOwogICAgICAgIGN0eC5saW5lV2lkdGggPSAod0Jhc2UgLSBpICogMykgKiAoMC40ICsgMC42ICogKHNnICsgMSkgLyA1KTsKICAgICAgICBjdHguYmVnaW5QYXRoKCk7IGN0eC5hcmMoMCwgMCwgciwgTWF0aC5taW4oczAsIHMxKSwgTWF0aC5tYXgoczAsIHMxKSk7IGN0eC5zdHJva2UoKTsKICAgICAgfQogICAgfQogICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDI1NSwyNTUsMjU1LCIgKyAoMC41ICogZmFkZSkgKyAiKSI7CiAgICBjdHguYmVnaW5QYXRoKCk7IGN0eC5hcmMoTWF0aC5jb3MoaGVhZCkgKiAockJhc2UgKyBnYXApLCBNYXRoLnNpbihoZWFkKSAqIChyQmFzZSArIGdhcCksIHdCYXNlICogMS41LCAwLCBNYXRoLlBJICogMik7IGN0eC5maWxsKCk7CiAgICBjdHgucmVzdG9yZSgpOwogIH0KICBmdW5jdGlvbiBkcmF3U3dpcGVGeCgpIHsKICAgIHZhciBhID0gY2F0LmFjdDsKICAgIGlmICghYSB8fCAoYS50eXBlICE9PSAic3dpcGUiICYmIGEudHlwZSAhPT0gImhlYXZ5IiAmJiBhLnR5cGUgIT09ICJ0YWlsIikpIHJldHVybjsKICAgIHZhciB0ID0gYS50LCB3ID0gYS53aW5kLCBhYyA9IGEuYWN0aXZlLCB0YWlsVCA9IDAuMTsKICAgIGlmICh0IDwgdyB8fCB0ID4gdyArIGFjICsgdGFpbFQpIHJldHVybjsKICAgIHZhciBwID0gY2xhbXAoKHQgLSB3KSAvIGFjLCAwLCAxKSwgZmFkZSA9IHQgPiB3ICsgYWMgPyAxIC0gKHQgLSB3IC0gYWMpIC8gdGFpbFQgOiAxOwogICAgdmFyIGYgPSBjYXQuZmFjaW5nLCBoZWF2eSA9IGEudHlwZSA9PT0gImhlYXZ5IjsKICAgIGlmIChhLnR5cGUgPT09ICJ0YWlsIikgZHJhd0FyY3MoY2F0LnggLSBmICogNzAsIGNhdC5mZWV0IC0gODAsIGYsIDEuNywgMy45LCBwLCAxMjAsICIyMzUsMjA1LDE2NSIsIDEyLCAzMCwgZmFkZSk7CiAgICBlbHNlIGlmIChhLmlkeCA9PT0gMSkgZHJhd0FyY3MoY2F0LnggKyBmICogMjUsIGNhdC5mZWV0IC0gMTg1LCBmLCAwLjksIC0xLjksIHAsIDE1MCwgIjI1NSwyNTUsMjU1IiwgMTIsIDM0LCBmYWRlKTsKICAgIGVsc2UgZHJhd0FyY3MoY2F0LnggKyBmICogMjUsIGNhdC5mZWV0IC0gMTg1LCBmLCAtMi40LCAwLjYsIHAsIGhlYXZ5ID8gMTY1IDogMTUwLCBoZWF2eSA\/ICIyNTUsMjEwLDE0MCIgOiAiMjU1LDI1NSwyNTUiLCBoZWF2eSA\/IDE4IDogMTIsIGhlYXZ5ID8gNDIgOiAzNCwgZmFkZSk7CiAgfQogIGZ1bmN0aW9uIGRyYXdCb3NzU3dpcGVGeCgpIHsKICAgIGlmICghYm9zcyB8fCBib3NzLnN0YXRlICE9PSAic3dpcGUiIHx8IGJvc3MudCA+IDAuMikgcmV0dXJuOwogICAgZHJhd0FyY3MoYm9zcy54ICsgYm9zcy5mYWNpbmcgKiAyNSwgYm9zcy5mZWV0IC0gMTg1LCBib3NzLmZhY2luZywgLTIuNCwgMC42LCBjbGFtcChib3NzLnQgLyAwLjEyLCAwLCAxKSwgMTUwLCAiMjU1LDE1MCwxNTAiLCAxMiwgMzQsIDEpOwogIH0KICBmdW5jdGlvbiBkcmF3U2hvdHMoKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNob3RzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzID0gc2hvdHNbaV07CiAgICAgIGlmIChzLmtpbmQgPT09ICJidWxsZXQiKSB7IGN0eC5zdHJva2VTdHlsZSA9ICIjZmZlNjgwIjsgY3R4LmxpbmVXaWR0aCA9IDM7IGN0eC5iZWdpblBhdGgoKTsgY3R4Lm1vdmVUbyhzLngsIHMueSk7IGN0eC5saW5lVG8ocy54IC0gcy52eCAqIDAuMDI1LCBzLnkgLSBzLnZ5ICogMC4wMjUpOyBjdHguc3Ryb2tlKCk7IH0KICAgICAgZWxzZSBpZiAocy5raW5kID09PSAic2hlbGwiKSB7IGN0eC5maWxsU3R5bGUgPSAiI2ZmYjA0MCI7IGN0eC5iZWdpblBhdGgoKTsgY3R4LmFyYyhzLngsIHMueSwgNSwgMCwgTWF0aC5QSSAqIDIpOyBjdHguZmlsbCgpOyBjdHguc3Ryb2tlU3R5bGUgPSAicmdiYSgyNTUsMTcwLDYwLDAuNikiOyBjdHgubGluZVdpZHRoID0gNDsgY3R4LmJlZ2luUGF0aCgpOyBjdHgubW92ZVRvKHMueCwgcy55KTsgY3R4LmxpbmVUbyhzLnggLSBzLnZ4ICogMC4wMywgcy55IC0gcy52eSAqIDAuMDMpOyBjdHguc3Ryb2tlKCk7IH0KICAgICAgZWxzZSB7CiAgICAgICAgY3R4LnNhdmUoKTsgY3R4LnRyYW5zbGF0ZShzLngsIHMueSk7IGN0eC5yb3RhdGUoTWF0aC5hdGFuMihzLnZ5LCBzLnZ4KSk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHMub3duZXIgPT09ICJjYXQiID8gIiNiZmYiIDogIiNlZWUiOyBjdHguZmlsbFJlY3QoLTEyLCAtMywgMjIsIDYpOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2MzMyI7IGN0eC5maWxsUmVjdCg4LCAtMywgNSwgNik7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDI1NSwxNzAsNjAsMC45KSI7IGN0eC5iZWdpblBhdGgoKTsgY3R4Lm1vdmVUbygtMTIsIC0zKTsgY3R4LmxpbmVUbygtMjIgLSBNYXRoLnJhbmRvbSgpICogOCwgMCk7IGN0eC5saW5lVG8oLTEyLCAzKTsgY3R4LmZpbGwoKTsKICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGRyYXdQYXJ0cyhsaXN0LCBsYXllcikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBwID0gbGlzdFtpXSwgayA9IHAudCAvIHAubGlmZTsKICAgICAgaWYgKGxheWVyID09PSAxICYmIHAudHlwZSAhPT0gImR1c3QiKSBjb250aW51ZTsKICAgICAgaWYgKGxheWVyID09PSAyICYmIHAudHlwZSA9PT0gImR1c3QiKSBjb250aW51ZTsKICAgICAgaWYgKHAudHlwZSA9PT0gImR1c3QiIHx8IHAudHlwZSA9PT0gInNtb2tlIikgewogICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9ICgxIC0gaykgKiAocC50eXBlID09PSAic21va2UiID8gMC41IDogMC40Mik7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHAuY29sOyBjdHguYmVnaW5QYXRoKCk7IGN0eC5hcmMocC54LCBwLnksIHAuc2l6ZSAqICgwLjUgKyBrKSwgMCwgTWF0aC5QSSAqIDIpOyBjdHguZmlsbCgpOwogICAgICB9IGVsc2UgaWYgKHAudHlwZSA9PT0gImZpcmUiKSB7CiAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gMSAtIGs7IGN0eC5maWxsU3R5bGUgPSBwLmNvbDsgY3R4LmJlZ2luUGF0aCgpOyBjdHguYXJjKHAueCwgcC55LCBwLnNpemUgKiAoMSAtIGsgKiAwLjYpLCAwLCBNYXRoLlBJICogMik7IGN0eC5maWxsKCk7CiAgICAgIH0gZWxzZSBpZiAocC50eXBlID09PSAiY2h1bmsiIHx8IHAudHlwZSA9PT0gImdsYXNzIikgewogICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IE1hdGgubWluKDEsICgxIC0gaykgKiAzKTsKICAgICAgICBjdHguc2F2ZSgpOyBjdHgudHJhbnNsYXRlKHAueCwgcC55KTsgY3R4LnJvdGF0ZShwLnJvdCk7IGN0eC5maWxsU3R5bGUgPSBwLmNvbDsKICAgICAgICBpZiAocC50eXBlID09PSAiZ2xhc3MiKSB7IGN0eC5iZWdpblBhdGgoKTsgY3R4Lm1vdmVUbygtcC5zaXplLCBwLnNpemUgKiAwLjYpOyBjdHgubGluZVRvKHAuc2l6ZSAqIDAuMiwgLXAuc2l6ZSk7IGN0eC5saW5lVG8ocC5zaXplLCBwLnNpemUgKiAwLjQpOyBjdHguZmlsbCgpOyB9CiAgICAgICAgZWxzZSBjdHguZmlsbFJlY3QoLXAuc2l6ZSAvIDIsIC1wLnNpemUgLyAyLCBwLnNpemUsIHAuc2l6ZSAqIDAuOCk7CiAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgfSBlbHNlIGlmIChwLnR5cGUgPT09ICJzcGFyayIpIHsKICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSAxIC0gazsgY3R4LnN0cm9rZVN0eWxlID0gcC5jb2w7IGN0eC5saW5lV2lkdGggPSBwLnNpemU7IGN0eC5iZWdpblBhdGgoKTsgY3R4Lm1vdmVUbyhwLngsIHAueSk7IGN0eC5saW5lVG8ocC54IC0gcC52eCAqIDAuMDMsIHAueSAtIHAudnkgKiAwLjAzKTsgY3R4LnN0cm9rZSgpOwogICAgICB9IGVsc2UgaWYgKHAudHlwZSA9PT0gImZsYXNoIikgewogICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IDEgLSBrOyBjdHguZmlsbFN0eWxlID0gIiNmZmZiZTAiOyBjdHguYmVnaW5QYXRoKCk7IGN0eC5hcmMocC54LCBwLnksIHAuc2l6ZSAqICgwLjYgKyBrICogMC42KSwgMCwgTWF0aC5QSSAqIDIpOyBjdHguZmlsbCgpOwogICAgICB9IGVsc2UgaWYgKHAudHlwZSA9PT0gInJpbmciKSB7CiAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gMSAtIGs7IGN0eC5zdHJva2VTdHlsZSA9IHAuY29sOyBjdHgubGluZVdpZHRoID0gMTAgKiAoMSAtIGspICsgMjsKICAgICAgICB2YXIgciA9IHAuc2l6ZSAqIGVhc2VPdXQoayk7CiAgICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICAgIGlmIChwLnkgPj0gRkVFVCAtIDUpIGN0eC5lbGxpcHNlKHAueCwgcC55LCByLCByICogMC4xMiwgMCwgMCwgTWF0aC5QSSAqIDIpOyBlbHNlIGN0eC5hcmMocC54LCBwLnksIHIsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgICBjdHguc3Ryb2tlKCk7CiAgICAgIH0KICAgIH0KICAgIGN0eC5nbG9iYWxBbHBoYSA9IDE7CiAgfQogIGZ1bmN0aW9uIGRyYXdUZXh0cygpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHQgPSB0ZXh0c1tpXSwgayA9IHQudCAvIHQubGlmZTsKICAgICAgdmFyIHBvcCA9IHQudCA8IDAuMDggPyBsZXJwKDEuNiwgMSwgdC50IC8gMC4wOCkgOiAxOwogICAgICBjdHguc2F2ZSgpOyBjdHgudHJhbnNsYXRlKHQueCwgdC55IC0gdC5yaXNlICogNjAgKiBrKTsgY3R4LnNjYWxlKHBvcCwgcG9wKTsKICAgICAgY3R4Lmdsb2JhbEFscGhhID0gayA+IDAuNyA\/ICgxIC0gaykgLyAwLjMgOiAxOwogICAgICBjdHguZm9udCA9ICI5MDAgIiArIHQuc2l6ZSArICJweCBJbXBhY3QsICdBcmlhbCBCbGFjaycsIHNhbnMtc2VyaWYiOyBjdHgudGV4dEFsaWduID0gImNlbnRlciI7IGN0eC50ZXh0QmFzZWxpbmUgPSAibWlkZGxlIjsKICAgICAgY3R4LmxpbmVKb2luID0gInJvdW5kIjsgY3R4LmxpbmVXaWR0aCA9IE1hdGgubWF4KDQsIHQuc2l6ZSAvIDcpOyBjdHguc3Ryb2tlU3R5bGUgPSAiIzFhMGQwOCI7IGN0eC5zdHJva2VUZXh0KHQucywgMCwgMCk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSB0LmNvbDsgY3R4LmZpbGxUZXh0KHQucywgMCwgMCk7CiAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICB9CiAgICBjdHguZ2xvYmFsQWxwaGEgPSAxOwogIH0KICBmdW5jdGlvbiBiYXIoeCwgeSwgdywgaCwgZnJhYywgY29sLCBsYWJlbCwgZ2xvdykgewogICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDEwLDYsNiwwLjYpIjsgcnIoeCAtIDMsIHkgLSAzLCB3ICsgNiwgaCArIDYsIDYpOyBjdHguZmlsbCgpOwogICAgY3R4LmZpbGxTdHlsZSA9ICIjMmExYzE4IjsgY3R4LmZpbGxSZWN0KHgsIHksIHcsIGgpOwogICAgY3R4LmZpbGxTdHlsZSA9IGNvbDsgY3R4LmZpbGxSZWN0KHgsIHksIHcgKiBjbGFtcChmcmFjLCAwLCAxKSwgaCk7CiAgICBpZiAoZ2xvdykgeyBjdHguZmlsbFN0eWxlID0gInJnYmEoMjU1LDI1NSwyNTUsIiArICgwLjI1ICsgMC4yNSAqIE1hdGguc2luKEcudCAqIDEwKSkgKyAiKSI7IGN0eC5maWxsUmVjdCh4LCB5LCB3LCBoKTsgfQogICAgaWYgKGxhYmVsKSB7CiAgICAgIGN0eC5mb250ID0gIjgwMCAxNHB4ICdBcmlhbCBCbGFjaycsIEltcGFjdCwgc2Fucy1zZXJpZiI7IGN0eC50ZXh0QWxpZ24gPSAibGVmdCI7IGN0eC50ZXh0QmFzZWxpbmUgPSAiYm90dG9tIjsKICAgICAgY3R4LmxpbmVXaWR0aCA9IDM7IGN0eC5zdHJva2VTdHlsZSA9ICJyZ2JhKDEwLDYsNiwwLjgpIjsgY3R4LnN0cm9rZVRleHQobGFiZWwsIHgsIHkgLSA0KTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZmNGUwIjsgY3R4LmZpbGxUZXh0KGxhYmVsLCB4LCB5IC0gNCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGZtdChuKSB7IHJldHVybiBTdHJpbmcoTWF0aC5mbG9vcihuKSkucmVwbGFjZSgvXEIoPz0oXGR7M30pKyg\/IVxkKSkvZywgIiwiKTsgfQogIGZ1bmN0aW9uIGRyYXdIVUQoKSB7CiAgICBiYXIoMjQsIDMyLCAyODAsIDE2LCBjYXQuaHAgLyAxMDAsIGNhdC5ocCA+IDM1ID8gIiM1ZmQzNWEiIDogIiNlODQ4M2EiLCAiSEVBTFRIIik7CiAgICB2YXIgZnVsbCA9IGNhdC5wb3dlciA+PSAxMDA7CiAgICBiYXIoMjQsIDc0LCAyMjAsIDEyLCBjYXQucG93ZXIgLyAxMDAsIGZ1bGwgPyAiI2ZmZDA0MCIgOiAiI2YwOGEyYSIsIGZ1bGwgPyAodG91Y2hNb2RlID8gIlBPV0VSOiBTTEFNIFJFQURZIiA6ICJQT1dFUjogU0xBTSBSRUFEWSAoVSkiKSA6ICJQT1dFUiIsIGZ1bGwpOwogICAgdmFyIG0gPSBtdWx0KCk7CiAgICBjdHgudGV4dEFsaWduID0gInJpZ2h0IjsgY3R4LnRleHRCYXNlbGluZSA9ICJ0b3AiOwogICAgY3R4LmZvbnQgPSAiODAwIDE0cHggJ0FyaWFsIEJsYWNrJywgSW1wYWN0LCBzYW5zLXNlcmlmIjsgY3R4LmxpbmVXaWR0aCA9IDM7IGN0eC5zdHJva2VTdHlsZSA9ICJyZ2JhKDEwLDYsNiwwLjgpIjsKICAgIGN0eC5zdHJva2VUZXh0KCJERVNUUlVDVElPTiIsIFcgLSAyNCwgMTQpOyBjdHguZmlsbFN0eWxlID0gIiNmZmY0ZTAiOyBjdHguZmlsbFRleHQoIkRFU1RSVUNUSU9OIiwgVyAtIDI0LCAxNCk7CiAgICBjdHguZm9udCA9ICI5MDAgMzRweCBJbXBhY3QsICdBcmlhbCBCbGFjaycsIHNhbnMtc2VyaWYiOyBjdHgubGluZVdpZHRoID0gNTsgY3R4LnN0cm9rZVN0eWxlID0gIiMxYTBkMDgiOwogICAgdmFyIHNjID0gZm10KEcuc2NvcmUpOwogICAgY3R4LnN0cm9rZVRleHQoc2MsIFcgLSAyNCwgMzApOyBjdHguZmlsbFN0eWxlID0gIiNmZmUyN2EiOyBjdHguZmlsbFRleHQoc2MsIFcgLSAyNCwgMzApOwogICAgaWYgKG0gPiAxKSB7CiAgICAgIHZhciBtY29sID0gbSA+PSAxMCA\/ICIjZmY0MDQwIiA6IChtID49IDUgPyAiI2ZmOWEzMCIgOiAiI2ZmZTA2MCIpOwogICAgICBjdHguZm9udCA9ICI5MDAgIiArICgyNCArIG0pICsgInB4IEltcGFjdCwgJ0FyaWFsIEJsYWNrJywgc2Fucy1zZXJpZiI7CiAgICAgIGN0eC5zdHJva2VUZXh0KCJERVNUUlVDVElPTiB4IiArIG0sIFcgLSAyNCwgNzApOyBjdHguZmlsbFN0eWxlID0gbWNvbDsgY3R4LmZpbGxUZXh0KCJERVNUUlVDVElPTiB4IiArIG0sIFcgLSAyNCwgNzApOwogICAgICB2YXIgZGVjYXkgPSBHLmlkbGVUID4gMi4yID8gTWF0aC5tYXgoMCwgMSAtIChHLmlkbGVUIC0gMi4yKSAvIDQpIDogMTsKICAgICAgY3R4LmZpbGxTdHlsZSA9IG1jb2w7IGN0eC5maWxsUmVjdChXIC0gMjQgLSAxNjAgKiBkZWNheSwgMTA0ICsgbSwgMTYwICogZGVjYXksIDQpOwogICAgfQogICAgaWYgKGJvc3MgJiYgRy5waGFzZSAhPT0gImNpdHkiKSB7CiAgICAgIHZhciBidyA9IDQ2MCwgYnggPSBXIC8gMiAtIGJ3IC8gMjsKICAgICAgYmFyKGJ4LCAzNiwgYncsIDE4LCBib3NzLmhwIC8gYm9zcy5tYXhIcCwgIiNjMDNhNWEiLCAiIik7CiAgICAgIGN0eC50ZXh0QWxpZ24gPSAiY2VudGVyIjsgY3R4LnRleHRCYXNlbGluZSA9ICJib3R0b20iOyBjdHguZm9udCA9ICI5MDAgMThweCBJbXBhY3QsICdBcmlhbCBCbGFjaycsIHNhbnMtc2VyaWYiOwogICAgICBjdHgubGluZVdpZHRoID0gNDsgY3R4LnN0cm9rZVN0eWxlID0gIiMxYTBkMDgiOyBjdHguc3Ryb2tlVGV4dCgiUklWQUwgS0FJSlU6IFNIQURPVyBUT00iLCBXIC8gMiwgMzApOwogICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmQwZDgiOyBjdHguZmlsbFRleHQoIlJJVkFMIEtBSUpVOiBTSEFET1cgVE9NIiwgVyAvIDIsIDMwKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBwdyA9IDMwMCwgcHh4ID0gVyAvIDIgLSBwdyAvIDIsIHByb2cgPSBjbGFtcChjYXQueCAvIChCT1NTX1ggLSAzMjApLCAwLCAxKTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDEwLDYsNiwwLjUpIjsgY3R4LmZpbGxSZWN0KHB4eCwgMjIsIHB3LCA2KTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZjZjZhIjsgY3R4LmZpbGxSZWN0KHB4eCwgMjIsIHB3ICogcHJvZywgNik7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmNTA1MCI7IGN0eC5maWxsUmVjdChweHggKyBwdyAtIDQsIDE4LCA2LCAxNCk7CiAgICAgIGlmIChHLmRpc3RyaWN0VCA+IDApIHsKICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSBNYXRoLm1pbigxLCBHLmRpc3RyaWN0VCk7CiAgICAgICAgY3R4LnRleHRBbGlnbiA9ICJjZW50ZXIiOyBjdHgudGV4dEJhc2VsaW5lID0gInRvcCI7IGN0eC5mb250ID0gIjkwMCAzMHB4IEltcGFjdCwgJ0FyaWFsIEJsYWNrJywgc2Fucy1zZXJpZiI7CiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDU7IGN0eC5zdHJva2VTdHlsZSA9ICIjMWEwZDA4IjsgY3R4LnN0cm9rZVRleHQoRy5kaXN0cmljdCwgVyAvIDIsIDQwKTsgY3R4LmZpbGxTdHlsZSA9ICIjZmZmNGUwIjsgY3R4LmZpbGxUZXh0KEcuZGlzdHJpY3QsIFcgLyAyLCA0MCk7CiAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gMTsKICAgICAgfQogICAgfQogICAgaWYgKCF0b3VjaE1vZGUpIHsKICAgICAgY3R4LnRleHRBbGlnbiA9ICJjZW50ZXIiOyBjdHgudGV4dEJhc2VsaW5lID0gImJvdHRvbSI7IGN0eC5mb250ID0gIjcwMCAxNHB4ICdUcmVidWNoZXQgTVMnLCBzYW5zLXNlcmlmIjsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDEwLDYsNiwwLjU1KSI7IGN0eC5maWxsUmVjdChXIC8gMiAtIDQzMCwgSCAtIDI2LCA4NjAsIDIyKTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDI1NSwyNDQsMjI0LDAuOTIpIjsKICAgICAgY3R4LmZpbGxUZXh0KCJBL0Qgb3IgQXJyb3dzOiBtb3ZlICAgIFNwYWNlOiBqdW1wICAgIEo6IHN3aXBlICh4MyBjb21ibykgICAgSzogaGVhdnkgICAgTDogdGFpbCAgICBSOiByb2FyICAgIFU6IHNwZWNpYWwgICAgRXNjOiBwYXVzZSIsIFcgLyAyLCBIIC0gOCk7CiAgICB9CiAgfQogIHZhciBmeENhbnZhcyA9IG1rKFcsIEgpOwogIGZ1bmN0aW9uIGRyYXcoKSB7CiAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApOwogICAgaWYgKCFpbWFnZXNSZWFkeSB8fCAhY2F0KSB7IGN0eC5maWxsU3R5bGUgPSAiIzFhMTIyMCI7IGN0eC5maWxsUmVjdCgwLCAwLCBXLCBIKTsgcmV0dXJuOyB9CiAgICBkcmF3U2t5KCk7CiAgICB2YXIgeiA9IEcuem9vbTsKICAgIHZhciBzeCA9IChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIEcuc2hha2UgKiAyLCBzeSA9IChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIEcuc2hha2UgKiAyOwogICAgY3R4LnNhdmUoKTsKICAgIGN0eC50cmFuc2xhdGUoVyAvIDIgKyBzeCwgSCArIHN5KTsgY3R4LnNjYWxlKHosIHopOyBjdHgudHJhbnNsYXRlKC1XIC8gMiwgLUgpOwogICAgY3R4LnRyYW5zbGF0ZSgtRy5jYW1YLCAwKTsKICAgIHZhciB2bCA9IHZpZXdMKCkgLSA2MCwgdnIgPSB2aWV3UigpICsgNjA7CiAgICBkcmF3QnVpbGRpbmdzKHZsLCB2cik7CiAgICBkcmF3UGFydHMoYmdQYXJ0cyk7CiAgICBkcmF3U3RyZWV0KHZsLCB2cik7CiAgICBkcmF3UHJvcHModmwsIHZyKTsKICAgIGRyYXdQYXJ0cyhwYXJ0cywgMSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlaGljbGVzLmxlbmd0aDsgaSsrKSB7IHZhciB2ID0gdmVoaWNsZXNbaV07IGlmICh2LnN0YXRlICE9PSAidHVtYmxlIiAmJiB2LnggPiB2bCAtIDEwMCAmJiB2LnggPCB2ciArIDEwMCkgZHJhd1ZlaGljbGUodik7IH0KICAgIGlmIChib3NzKSBkcmF3S2FpanUoYm9zcy54LCBib3NzLmZlZXQsIGJvc3MuZmFjaW5nLCBib3NzUG9zZSgpLCBTRVRTLmJvc3MsICJ3IiwgYm9zcy5mbGFzaCA+IDAgPyAwLjcgOiAwKTsKICAgIGRyYXdCb3NzU3dpcGVGeCgpOwogICAgZHJhd0thaWp1KGNhdC54LCBjYXQuZmVldCwgY2F0LmZhY2luZywgcGxheWVyUG9zZSgpLCBTRVRTLnBsYXllciwgInIiLCBjYXQuaHVydFQgPiAwLjA4ID8gMC4zOCA6IChjYXQuaHVydFQgPiAwID8gMC4xNiA6IDApKTsKICAgIGRyYXdTd2lwZUZ4KCk7CiAgICBmb3IgKHZhciBoID0gMDsgaCA8IGhlbGlzLmxlbmd0aDsgaCsrKSBkcmF3SGVsaShoZWxpc1toXSk7CiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGpldHMubGVuZ3RoOyBqKyspIGRyYXdKZXQoamV0c1tqXSk7CiAgICBmb3IgKHZhciBrID0gMDsgayA8IHZlaGljbGVzLmxlbmd0aDsgaysrKSBpZiAodmVoaWNsZXNba10uc3RhdGUgPT09ICJ0dW1ibGUiKSBkcmF3VmVoaWNsZSh2ZWhpY2xlc1trXSk7CiAgICBkcmF3U2hvdHMoKTsKICAgIGRyYXdQYXJ0cyhwYXJ0cywgMik7CiAgICBkcmF3VGV4dHMoKTsKICAgIGN0eC5yZXN0b3JlKCk7CiAgICBpZiAoRy53YXZlID4gMCkgewogICAgICB2YXIgZmcgPSBmeENhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICBmZy5jbGVhclJlY3QoMCwgMCwgVywgSCk7IGZnLmRyYXdJbWFnZShjYW52YXMsIDAsIDApOwogICAgICB2YXIgYW1wID0gMTQgKiAoRy53YXZlIC8gMC43KTsKICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBIOyB5ICs9IDEyKSB7IHZhciBvZmYgPSBNYXRoLnNpbih5ICogMC4wNCArIEcudCAqIDQwKSAqIGFtcDsgY3R4LmRyYXdJbWFnZShmeENhbnZhcywgMCwgeSwgVywgMTIsIG9mZiwgeSwgVywgMTIpOyB9CiAgICB9CiAgICBpZiAoRy5mbGFzaCA+IDApIHsgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDI1NSwyNTAsMjM1LCIgKyBNYXRoLm1pbigwLjg1LCBHLmZsYXNoKSArICIpIjsgY3R4LmZpbGxSZWN0KDAsIDAsIFcsIEgpOyB9CiAgICBpZiAoY2F0Lmh1cnRUID4gMCB8fCBjYXQuaHAgPCAzMCkgewogICAgICB2YXIgdmEgPSBjYXQuaHVydFQgPiAwLjA4ID8gMC4zMiA6IGNhdC5odXJ0VCA+IDAgPyAwLjEyIDogMC4xMiArIDAuMDggKiBNYXRoLnNpbihHLnQgKiA2KTsKICAgICAgdmFyIHZnID0gY3R4LmNyZWF0ZVJhZGlhbEdyYWRpZW50KFcgLyAyLCBIIC8gMiwgSCAqIDAuMzUsIFcgLyAyLCBIIC8gMiwgSCAqIDAuODUpOwogICAgICB2Zy5hZGRDb2xvclN0b3AoMCwgInJnYmEoMjAwLDAsMCwwKSIpOyB2Zy5hZGRDb2xvclN0b3AoMSwgInJnYmEoMjAwLDAsMCwiICsgdmEgKyAiKSIpOwogICAgICBjdHguZmlsbFN0eWxlID0gdmc7IGN0eC5maWxsUmVjdCgwLCAwLCBXLCBIKTsKICAgIH0KICAgIGRyYXdIVUQoKTsKICAgIGlmIChHLnN0YXRlID09PSAicGF1c2VkIikgeyBjdHguZmlsbFN0eWxlID0gInJnYmEoMCwwLDAsMC4zNSkiOyBjdHguZmlsbFJlY3QoMCwgMCwgVywgSCk7IH0KICB9CiAgZnVuY3Rpb24gc2hvd0NhcmQoY2FyZCkgewogICAgW3RpdGxlQ2FyZCwgZW5kQ2FyZCwgcGF1c2VDYXJkXS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGlmIChjKSBjLmhpZGRlbiA9IGMgIT09IGNhcmQ7IH0pOwogICAgaWYgKG92ZXJsYXlFbCkgb3ZlcmxheUVsLmhpZGRlbiA9ICFjYXJkOwogICAgdXBkYXRlVG91Y2hWaXNpYmlsaXR5KCk7CiAgfQogIGZ1bmN0aW9uIHN0YXJ0R2FtZSgpIHsKICAgIGluaXRBdWRpbygpOwogICAgcmVzZXRHYW1lKCk7CiAgICBHLnN0YXRlID0gInBsYXkiOwogICAgc2hvd0NhcmQobnVsbCk7CiAgICBpZiAodG91Y2hNb2RlIHx8IGlzQ29hcnNlKCkpIGVudGVyTW9iaWxlUGxheSgpOwogICAgZWxzZSBzY3JvbGxHYW1lSW50b1ZpZXcoKTsKICB9CiAgZnVuY3Rpb24gZW5kR2FtZSh3b24pIHsKICAgIEcuc3RhdGUgPSB3b24gPyAid29uIiA6ICJvdmVyIjsKICAgIHN0b3BEcm9uZSgpOwogICAgdmFyIHNlY3MgPSBNYXRoLnJvdW5kKEcucGxheVRpbWUpOwogICAgaWYgKGVuZFRpdGxlKSBlbmRUaXRsZS50ZXh0Q29udGVudCA9IHdvbiA\/ICJTaGFkb3cgVG9tIGlzIGRvd24uIFRoZSBjaXR5IGlzIHlvdXJzLiIgOiAiVGhlIG1pbGl0YXJ5IGJyb3VnaHQgeW91IGRvd24iOwogICAgaWYgKGVuZE1zZykgZW5kTXNnLnRleHRDb250ZW50ID0gKHdvbiA\/ICJWaWN0b3J5ISAiIDogIiIpICsgIkRlc3RydWN0aW9uIHNjb3JlOiAiICsgZm10KEcuc2NvcmUpICsgIi4gVGltZTogIiArIE1hdGguZmxvb3Ioc2VjcyAvIDYwKSArICJtICIgKyAoc2VjcyAlIDYwKSArICJzLiI7CiAgICBzaG93Q2FyZChlbmRDYXJkKTsKICB9CiAgZnVuY3Rpb24gdG9nZ2xlUGF1c2UoKSB7CiAgICBpZiAoRy5zdGF0ZSA9PT0gInBsYXkiKSB7IEcuc3RhdGUgPSAicGF1c2VkIjsgc2hvd0NhcmQocGF1c2VDYXJkKTsga2V5cyA9IHt9OyB9CiAgICBlbHNlIGlmIChHLnN0YXRlID09PSAicGF1c2VkIikgeyBHLnN0YXRlID0gInBsYXkiOyBzaG93Q2FyZChudWxsKTsgfQogIH0KCiAgZnVuY3Rpb24gaXNGc0FjdGl2ZSgpIHsgcmV0dXJuICEhKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KTsgfQogIGZ1bmN0aW9uIGlzQ29hcnNlKCkgeyB0cnkgeyByZXR1cm4gISEod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoIihwb2ludGVyOiBjb2Fyc2UpIikubWF0Y2hlcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0KICBmdW5jdGlvbiBmaXQoKSB7CiAgICB2YXIgZnNNb2RlID0gZnNGYWxsYmFjayB8fCBpc0ZzQWN0aXZlKCk7CiAgICBpZiAoZnNNb2RlKSB7CiAgICAgIHZhciB2dyA9IHdpbmRvdy5pbm5lcldpZHRoIHx8IDMyMCwgdmggPSB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMTgwOwogICAgICB2YXIgY3cgPSBNYXRoLmZsb29yKE1hdGgubWluKHZ3IC0gMTYsICh2aCAtIDE2KSAqIDE2IC8gOSkpOwogICAgICB2YXIgY2ggPSBNYXRoLmZsb29yKGN3ICogOSAvIDE2KTsKICAgICAgY2FudmFzLnN0eWxlLndpZHRoID0gY3cgKyAicHgiOyBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gY2ggKyAicHgiOwogICAgICBzdGFnZUVsLnN0eWxlLndpZHRoID0gY3cgKyAicHgiOyBzdGFnZUVsLnN0eWxlLmhlaWdodCA9IGNoICsgInB4IjsKICAgICAgcGxhY2VTaWRlQnV0dG9ucyhjdywgY2gsIHZ3LCB2aCk7CiAgICB9IGVsc2UgewogICAgICBjYW52YXMuc3R5bGUud2lkdGggPSAiIjsgY2FudmFzLnN0eWxlLmhlaWdodCA9ICIiOwogICAgICBzdGFnZUVsLnN0eWxlLndpZHRoID0gIiI7IHN0YWdlRWwuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgIHBsYWNlU2lkZUJ1dHRvbnMoMCwgMCwgMCwgMCk7CiAgICB9CiAgICBzaXplVG91Y2hVSSgpOwogICAgdXBkYXRlUm90YXRlKCk7CiAgfQogIGZ1bmN0aW9uIHBsYWNlU2lkZUJ1dHRvbnMoY3csIGNoLCB2dywgdmgpIHsKICAgIHZhciBvbiA9IG1vYmlsZVBsYXk7CiAgICBpZiAoZXhpdEJ0bikgZXhpdEJ0bi5oaWRkZW4gPSAhb247CiAgICBpZiAocGF1c2VCdG4pIHBhdXNlQnRuLmhpZGRlbiA9ICFvbjsKICAgIGlmICghb24pIHJldHVybjsKICAgIHZhciBzaWRlID0gKHZ3IC0gY3cpIC8gMiwgdG9wID0gKHZoIC0gY2gpIC8gMiwgYncgPSA0MDsKICAgIFtleGl0QnRuLCBwYXVzZUJ0bl0uZm9yRWFjaChmdW5jdGlvbiAoYiwgaSkgewogICAgICBpZiAoIWIpIHJldHVybjsKICAgICAgYi5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7CiAgICAgIGlmIChzaWRlID49IGJ3ICsgNikgeyBiLnN0eWxlLnJpZ2h0ID0gTWF0aC5tYXgoMywgTWF0aC5mbG9vcigoc2lkZSAtIGJ3KSAvIDIpKSArICJweCI7IGIuc3R5bGUudG9wID0gTWF0aC5tYXgoNiwgTWF0aC5mbG9vcih0b3AgKyA4ICsgaSAqIDUwKSkgKyAicHgiOyBiLnN0eWxlLmxlZnQgPSAiYXV0byI7IH0KICAgICAgZWxzZSBpZiAodG9wID49IGJ3ICsgNikgeyBiLnN0eWxlLnRvcCA9IE1hdGguZmxvb3IoKHRvcCAtIGJ3KSAvIDIpICsgInB4IjsgYi5zdHlsZS5yaWdodCA9ICg4ICsgaSAqIDUwKSArICJweCI7IGIuc3R5bGUubGVmdCA9ICJhdXRvIjsgfQogICAgICBlbHNlIHsgYi5zdHlsZS50b3AgPSBNYXRoLm1heCgyLCBNYXRoLmZsb29yKHRvcCArIDIpKSArICJweCI7IGIuc3R5bGUubGVmdCA9IE1hdGguZmxvb3Ioc2lkZSArIGN3ICogMC4zNiArIGkgKiA0NikgKyAicHgiOyBiLnN0eWxlLnJpZ2h0ID0gImF1dG8iOyB9CiAgICB9KTsKICB9CiAgZnVuY3Rpb24gc2l6ZVRvdWNoVUkoKSB7CiAgICBpZiAoIXRvdWNoRWwpIHJldHVybjsKICAgIHZhciByID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgdmFyIGhndCA9IHIuaGVpZ2h0IHx8IDM2MDsKICAgIHZhciBiaWcgPSBjbGFtcChNYXRoLnJvdW5kKGhndCAqIDAuMjEpLCA2NCwgODApLCBtZWQgPSBjbGFtcChNYXRoLnJvdW5kKGhndCAqIDAuMTcpLCA1NCwgNjgpLCBzbSA9IGNsYW1wKE1hdGgucm91bmQoaGd0ICogMC4xMyksIDQyLCA1Mik7CiAgICB2YXIgcGFkID0gTWF0aC5tYXgoNiwgTWF0aC5yb3VuZChoZ3QgKiAwLjAzNSkpOwogICAgZnVuY3Rpb24gc2V0KGIsIHMsIHJpZ2h0LCBib3R0b20pIHsgaWYgKCFiKSByZXR1cm47IGIuc3R5bGUud2lkdGggPSBzICsgInB4IjsgYi5zdHlsZS5oZWlnaHQgPSBzICsgInB4IjsgYi5zdHlsZS5yaWdodCA9IHJpZ2h0ICsgInB4IjsgYi5zdHlsZS5ib3R0b20gPSBib3R0b20gKyAicHgiOyB9CiAgICBzZXQoYlN3aXBlLCBiaWcsIHBhZCwgcGFkKTsKICAgIHNldChiSGVhdnksIG1lZCwgcGFkICsgYmlnICsgOCwgcGFkKTsKICAgIHNldChiUm9hciwgbWVkLCBwYWQgKyBNYXRoLnJvdW5kKChiaWcgLSBtZWQpIC8gMiksIHBhZCArIGJpZyArIDgpOwogICAgc2V0KGJTcGVjaWFsLCBtZWQsIHBhZCArIGJpZyArIDgsIHBhZCArIG1lZCArIDgpOwogICAgc2V0KGJUYWlsLCBzbSwgcGFkICsgYmlnICsgbWVkICsgMTYsIHBhZCArIDQpOwogIH0KICBmdW5jdGlvbiBpc1BvcnRyYWl0KCkgeyByZXR1cm4gd2luZG93LmlubmVySGVpZ2h0ID4gd2luZG93LmlubmVyV2lkdGg7IH0KICBmdW5jdGlvbiB1cGRhdGVSb3RhdGUoKSB7CiAgICB2YXIgc2hvdyA9IG1vYmlsZVBsYXkgJiYgaXNQb3J0cmFpdCgpOwogICAgaWYgKHJvdGF0ZUVsKSByb3RhdGVFbC5oaWRkZW4gPSAhc2hvdzsKICAgIEcucG9ydHJhaXRQYXVzZSA9IHNob3c7CiAgfQogIGZ1bmN0aW9uIGxvY2tTY3JvbGwob24pIHsKICAgIHZhciBkZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgYmQgPSBkb2N1bWVudC5ib2R5OwogICAgaWYgKG9uKSB7IGRlLmNsYXNzTGlzdC5hZGQoImtrLW5vc2Nyb2xsIik7IGJkLmNsYXNzTGlzdC5hZGQoImtrLW5vc2Nyb2xsIik7IH0KICAgIGVsc2UgeyBkZS5jbGFzc0xpc3QucmVtb3ZlKCJray1ub3Njcm9sbCIpOyBiZC5jbGFzc0xpc3QucmVtb3ZlKCJray1ub3Njcm9sbCIpOyB9CiAgfQogIGZ1bmN0aW9uIGxvY2tMYW5kc2NhcGUoKSB7CiAgICB0cnkgeyBpZiAoc2NyZWVuLm9yaWVudGF0aW9uICYmIHNjcmVlbi5vcmllbnRhdGlvbi5sb2NrKSB7IHZhciBwID0gc2NyZWVuLm9yaWVudGF0aW9uLmxvY2soImxhbmRzY2FwZSIpOyBpZiAocCAmJiBwLmNhdGNoKSBwLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsgfSB9IGNhdGNoIChlKSB7fQogIH0KICBmdW5jdGlvbiBlbnRlck1vYmlsZVBsYXkoKSB7CiAgICBtb2JpbGVQbGF5ID0gdHJ1ZTsgdG91Y2hNb2RlID0gdHJ1ZTsKICAgIGxvY2tTY3JvbGwodHJ1ZSk7CiAgICBhcHBFbC5jbGFzc0xpc3QuYWRkKCJray1tb2JpbGUiKTsKICAgIHZhciBlbCA9IGFwcEVsOwogICAgdmFyIHJlcSA9IGVsLnJlcXVlc3RGdWxsc2NyZWVuIHx8IGVsLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuIHx8IGVsLndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuOwogICAgZnVuY3Rpb24gZmFsbGJhY2soKSB7IGZzRmFsbGJhY2sgPSB0cnVlOyBhcHBFbC5jbGFzc0xpc3QuYWRkKCJray1mYWxsYmFjayIpOyBmaXQoKTsgfQogICAgaWYgKCFyZXEpIGZhbGxiYWNrKCk7CiAgICBlbHNlIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcmV0ID0gcmVxLmNhbGwoZWwpOwogICAgICAgIGlmIChyZXQgJiYgdHlwZW9mIHJldC50aGVuID09PSAiZnVuY3Rpb24iKSByZXQudGhlbihmdW5jdGlvbiAoKSB7IGxvY2tMYW5kc2NhcGUoKTsgZml0KCk7IH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgZmFsbGJhY2soKTsgfSk7CiAgICAgICAgZWxzZSBsb2NrTGFuZHNjYXBlKCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsgZmFsbGJhY2soKTsgfQogICAgfQogICAgbG9ja0xhbmRzY2FwZSgpOwogICAgdXBkYXRlVG91Y2hWaXNpYmlsaXR5KCk7CiAgICBmaXQoKTsgc2V0VGltZW91dChmaXQsIDgwKTsgc2V0VGltZW91dChmaXQsIDQ1MCk7CiAgfQogIGZ1bmN0aW9uIGV4aXRNb2JpbGVQbGF5KCkgewogICAgbW9iaWxlUGxheSA9IGZhbHNlOwogICAgdmFyIGV4ID0gZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4gfHwgZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4gfHwgZG9jdW1lbnQud2Via2l0Q2FuY2VsRnVsbFNjcmVlbjsKICAgIGlmIChpc0ZzQWN0aXZlKCkgJiYgZXgpIHsgdHJ5IHsgdmFyIHIgPSBleC5jYWxsKGRvY3VtZW50KTsgaWYgKHIgJiYgci5jYXRjaCkgci5jYXRjaChmdW5jdGlvbiAoKSB7fSk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIGZzRmFsbGJhY2sgPSBmYWxzZTsgYXBwRWwuY2xhc3NMaXN0LnJlbW92ZSgia2stZmFsbGJhY2siKTsgYXBwRWwuY2xhc3NMaXN0LnJlbW92ZSgia2stbW9iaWxlIik7CiAgICBsb2NrU2Nyb2xsKGZhbHNlKTsKICAgIGlmIChHLnN0YXRlID09PSAicGxheSIpIHsgRy5zdGF0ZSA9ICJwYXVzZWQiOyBzaG93Q2FyZChwYXVzZUNhcmQpOyB9CiAgICBmaXQoKTsKICB9CiAgZnVuY3Rpb24gc2Nyb2xsR2FtZUludG9WaWV3KCkgewogICAgdHJ5IHsgYXBwRWwuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogImNlbnRlciIsIGJlaGF2aW9yOiAic21vb3RoIiB9KTsgfSBjYXRjaCAoZSkgeyB0cnkgeyBhcHBFbC5zY3JvbGxJbnRvVmlldygpOyB9IGNhdGNoIChlMikge30gfQogICAgc2V0VGltZW91dChmaXQsIDMwMCk7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVUb3VjaFZpc2liaWxpdHkoKSB7CiAgICBpZiAoIXRvdWNoRWwpIHJldHVybjsKICAgIHZhciBvbiA9IHRvdWNoTW9kZSAmJiBHLnN0YXRlID09PSAicGxheSI7CiAgICB0b3VjaEVsLmhpZGRlbiA9ICFvbjsKICB9CiAgZnVuY3Rpb24gZW5hYmxlVG91Y2goKSB7CiAgICBpZiAodG91Y2hNb2RlKSByZXR1cm47CiAgICB0b3VjaE1vZGUgPSB0cnVlOyB1cGRhdGVUb3VjaFZpc2liaWxpdHkoKTsgc2l6ZVRvdWNoVUkoKTsKICB9CiAgZnVuY3Rpb24gYmluZEJ0bihiLCBhY3Rpb24pIHsKICAgIGlmICghYikgcmV0dXJuOwogICAgYi5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgZW5hYmxlVG91Y2goKTsgYi5jbGFzc0xpc3QuYWRkKCJray1wcmVzcyIpOyBwcmVzc0FjdGlvbihhY3Rpb24pOyB9KTsKICAgIHZhciB1cCA9IGZ1bmN0aW9uICgpIHsgYi5jbGFzc0xpc3QucmVtb3ZlKCJray1wcmVzcyIpOyB9OwogICAgYi5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCB1cCk7IGIuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmNhbmNlbCIsIHVwKTsgYi5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybGVhdmUiLCB1cCk7CiAgICBiLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgZnVuY3Rpb24gKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9KTsKICB9CiAgYmluZEJ0bihiU3dpcGUsICJzd2lwZSIpOyBiaW5kQnRuKGJIZWF2eSwgImhlYXZ5Iik7IGJpbmRCdG4oYlJvYXIsICJyb2FyIik7IGJpbmRCdG4oYlRhaWwsICJ0YWlsIik7IGJpbmRCdG4oYlNwZWNpYWwsICJzcGVjaWFsIik7CiAgZnVuY3Rpb24ga25vYihkeCwgZHkpIHsgaWYgKHN0aWNrS25vYikgc3RpY2tLbm9iLnN0eWxlLnRyYW5zZm9ybSA9ICJ0cmFuc2xhdGUoIiArIChkeCAtIDUwKSArICIlLCIgKyAoZHkgLSA1MCkgKyAiJSkiOyB9CiAgaWYgKHN0aWNrWm9uZSkgewogICAgc3RpY2tab25lLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyBlbmFibGVUb3VjaCgpOwogICAgICBpZiAoc3RpY2suaWQgIT09IG51bGwpIHJldHVybjsKICAgICAgc3RpY2suaWQgPSBlLnBvaW50ZXJJZDsgc3RpY2sueDAgPSBlLmNsaWVudFg7IHN0aWNrLnkwID0gZS5jbGllbnRZOyBzdGljay5keCA9IDA7IHN0aWNrLmR5ID0gMDsgc3RpY2suanVtcGVkID0gZmFsc2U7CiAgICAgIHRyeSB7IHN0aWNrWm9uZS5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7IH0gY2F0Y2ggKGVyKSB7fQogICAgICB2YXIgenIgPSBzdGlja1pvbmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHN0aWNrQmFzZS5zdHlsZS5sZWZ0ID0gKGUuY2xpZW50WCAtIHpyLmxlZnQpICsgInB4Ijsgc3RpY2tCYXNlLnN0eWxlLnRvcCA9IChlLmNsaWVudFkgLSB6ci50b3ApICsgInB4IjsKICAgICAgc3RpY2tCYXNlLmNsYXNzTGlzdC5hZGQoImtrLWFjdGl2ZSIpOyBzdGlja0tub2Iuc3R5bGUudHJhbnNmb3JtID0gInRyYW5zbGF0ZSgtNTAlLC01MCUpIjsKICAgIH0pOwogICAgc3RpY2tab25lLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKGUucG9pbnRlcklkICE9PSBzdGljay5pZCkgcmV0dXJuOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHZhciBSID0gNDYsIGR4ID0gZS5jbGllbnRYIC0gc3RpY2sueDAsIGR5ID0gZS5jbGllbnRZIC0gc3RpY2sueTAsIGQgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpOwogICAgICBpZiAoZCA+IFIpIHsgZHggPSBkeCAvIGQgKiBSOyBkeSA9IGR5IC8gZCAqIFI7IH0KICAgICAgc3RpY2suZHggPSBkeCAvIFI7IHN0aWNrLmR5ID0gZHkgLyBSOwogICAgICBzdGlja0tub2Iuc3R5bGUudHJhbnNmb3JtID0gInRyYW5zbGF0ZSgiICsgTWF0aC5yb3VuZChkeCAtIDIzKSArICJweCwiICsgTWF0aC5yb3VuZChkeSAtIDIzKSArICJweCkiOwogICAgICBpZiAoc3RpY2suZHkgPCAtMC43ICYmICFzdGljay5qdW1wZWQpIHsgc3RpY2suanVtcGVkID0gdHJ1ZTsgcHJlc3NBY3Rpb24oImp1bXAiKTsgfQogICAgICBpZiAoc3RpY2suZHkgPiAtMC4zNSkgc3RpY2suanVtcGVkID0gZmFsc2U7CiAgICB9KTsKICAgIHZhciBlbmRTdGljayA9IGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChlLnBvaW50ZXJJZCAhPT0gc3RpY2suaWQpIHJldHVybjsKICAgICAgc3RpY2suaWQgPSBudWxsOyBzdGljay5keCA9IDA7IHN0aWNrLmR5ID0gMDsgc3RpY2tCYXNlLmNsYXNzTGlzdC5yZW1vdmUoImtrLWFjdGl2ZSIpOwogICAgICBzdGlja0Jhc2Uuc3R5bGUubGVmdCA9ICIiOyBzdGlja0Jhc2Uuc3R5bGUudG9wID0gIiI7CiAgICAgIHN0aWNrS25vYi5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlKC01MCUsLTUwJSkiOwogICAgfTsKICAgIHN0aWNrWm9uZS5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBlbmRTdGljayk7IHN0aWNrWm9uZS5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyY2FuY2VsIiwgZW5kU3RpY2spOwogIH0KICBmdW5jdGlvbiBjYW52YXNQb3MoZSkgewogICAgdmFyIHIgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICByZXR1cm4geyB4OiAoZS5jbGllbnRYIC0gci5sZWZ0KSAvIChyLndpZHRoIHx8IDEpICogVywgeTogKGUuY2xpZW50WSAtIHIudG9wKSAvIChyLmhlaWdodCB8fCAxKSAqIEggfTsKICB9CiAgZnVuY3Rpb24gc2NyZWVuVG9Xb3JsZChwKSB7IHJldHVybiB7IHg6IChwLnggLSBXIC8gMikgLyBHLnpvb20gKyBXIC8gMiArIEcuY2FtWCwgeTogKHAueSAtIEgpIC8gRy56b29tICsgSCB9OyB9CiAgZnVuY3Rpb24gdGFwVGFyZ2V0KHdwKSB7CiAgICB2YXIgYmVzdCA9IG51bGwsIGJkID0gMTcwICogMTcwOwogICAgZnVuY3Rpb24gdGVzdChvLCB4LCB5KSB7IHZhciBkeCA9IHggLSB3cC54LCBkeSA9IHkgLSB3cC55LCBkID0gZHggKiBkeCArIGR5ICogZHk7IGlmIChkIDwgYmQpIHsgYmQgPSBkOyBiZXN0ID0gbzsgfSB9CiAgICBoZWxpcy5mb3JFYWNoKGZ1bmN0aW9uIChoKSB7IGlmIChoLnN0YXRlICE9PSAidHVtYmxlIikgdGVzdChoLCBoLngsIGgueSk7IH0pOwogICAgdmVoaWNsZXMuZm9yRWFjaChmdW5jdGlvbiAodikgeyBpZiAodi5zdGF0ZSA9PT0gImRyaXZlIiB8fCB2LnN0YXRlID09PSAidHJhZmZpYyIgfHwgdi5zdGF0ZSA9PT0gInBhcmtlZCIpIHRlc3Qodiwgdi54LCB2LnkgLSB2LmggLyAyKTsgfSk7CiAgICBqZXRzLmZvckVhY2goZnVuY3Rpb24gKGopIHsgdGVzdChqLCBqLngsIGoueSk7IH0pOwogICAgbGF1bmNoZXJzLmZvckVhY2goZnVuY3Rpb24gKGwpIHsgaWYgKCFsLmRlYWQpIHRlc3QobCwgbC54LCBsYXVuY2hlclkobCkpOyB9KTsKICAgIGlmIChib3NzICYmIGJvc3Muc3RhdGUgIT09ICJkb3duIikgdGVzdChib3NzLCBib3NzLngsIGJvc3MuZmVldCAtIDE1MCk7CiAgICByZXR1cm4gYmVzdDsKICB9CiAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgIGlmIChHLnN0YXRlICE9PSAicGxheSIpIHJldHVybjsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIGluaXRBdWRpbygpOwogICAgaWYgKGUucG9pbnRlclR5cGUgPT09ICJ0b3VjaCIpIGVuYWJsZVRvdWNoKCk7CiAgICB2YXIgd3AgPSBzY3JlZW5Ub1dvcmxkKGNhbnZhc1BvcyhlKSk7CiAgICB2YXIgdGd0ID0gdGFwVGFyZ2V0KHdwKTsKICAgIGlmICh0Z3QpIHsKICAgICAgdmFyIGR4ID0gdGd0LnggLSBjYXQueDsKICAgICAgaWYgKE1hdGguYWJzKGR4KSA+IDMwMCAmJiBNYXRoLmFicyhkeCkgPCAxMDAwKSB7IGNhdC5hdXRvVCA9IHRndDsgY2F0LmF1dG9UaW1lID0gMS42OyByZXR1cm47IH0KICAgICAgaWYgKCFjYXQuYWN0KSBjYXQuZmFjaW5nID0gc2lnbihkeCk7CiAgICB9IGVsc2UgaWYgKCFjYXQuYWN0KSBjYXQuZmFjaW5nID0gc2lnbih3cC54IC0gY2F0LngpOwogICAgcHJlc3NBY3Rpb24oInN3aXBlIik7CiAgfSk7CiAgYXBwRWwuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIiwgZnVuY3Rpb24gKGUpIHsgaWYgKEcuc3RhdGUgPT09ICJwbGF5IiAmJiBlLmNhbmNlbGFibGUpIGUucHJldmVudERlZmF1bHQoKTsgfSwgeyBwYXNzaXZlOiBmYWxzZSB9KTsKICBhcHBFbC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgZnVuY3Rpb24gKGUpIHsgaWYgKEcuc3RhdGUgPT09ICJwbGF5IiAmJiBlLmNhbmNlbGFibGUgJiYgZS50YXJnZXQgIT09IGV4aXRCdG4gJiYgZS50YXJnZXQgIT09IHBhdXNlQnRuKSBlLnByZXZlbnREZWZhdWx0KCk7IH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBmdW5jdGlvbiAoKSB7IGlmIChHLnN0YXRlID09PSAicGxheSIpIGVuYWJsZVRvdWNoKCk7IH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKCiAgdmFyIEtFWU1BUCA9IHsgQXJyb3dMZWZ0OiAibGVmdCIsIEtleUE6ICJsZWZ0IiwgQXJyb3dSaWdodDogInJpZ2h0IiwgS2V5RDogInJpZ2h0IiB9OwogIHZhciBBQ1RLRVlTID0geyBTcGFjZTogImp1bXAiLCBBcnJvd1VwOiAianVtcCIsIEtleVc6ICJqdW1wIiwgS2V5SjogInN3aXBlIiwgS2V5SzogImhlYXZ5IiwgS2V5TDogInRhaWwiLCBLZXlSOiAicm9hciIsIEtleVU6ICJzcGVjaWFsIiB9OwogIGZ1bmN0aW9uIGNvZGVPZihlKSB7CiAgICBpZiAoZS5jb2RlKSByZXR1cm4gZS5jb2RlOwogICAgdmFyIGsgPSBlLmtleSB8fCAiIjsKICAgIGlmIChrID09PSAiICIpIHJldHVybiAiU3BhY2UiOwogICAgaWYgKGsubGVuZ3RoID09PSAxKSByZXR1cm4gIktleSIgKyBrLnRvVXBwZXJDYXNlKCk7CiAgICByZXR1cm4gazsKICB9CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbiAoZSkgewogICAgdmFyIGMgPSBjb2RlT2YoZSk7CiAgICBpZiAoYyA9PT0gIkVzY2FwZSIgfHwgYyA9PT0gIktleVAiKSB7IGlmIChHLnN0YXRlID09PSAicGxheSIgfHwgRy5zdGF0ZSA9PT0gInBhdXNlZCIpIHsgdG9nZ2xlUGF1c2UoKTsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9IHJldHVybjsgfQogICAgaWYgKGMgPT09ICJLZXlNIikgeyBtdXRlZCA9ICFtdXRlZDsgaWYgKGRyb25lKSBkcm9uZS5nLmdhaW4udmFsdWUgPSBtdXRlZCA\/IDAgOiAwLjA5OyBpZiAoc291bmRCdG4pIHNvdW5kQnRuLnRleHRDb250ZW50ID0gbXV0ZWQgPyAiU291bmQ6IG9mZiIgOiAiU291bmQ6IG9uIjsgcmV0dXJuOyB9CiAgICBpZiAoRy5zdGF0ZSAhPT0gInBsYXkiKSByZXR1cm47CiAgICBpZiAoS0VZTUFQW2NdKSB7IGtleXNbS0VZTUFQW2NdXSA9IHRydWU7IGUucHJldmVudERlZmF1bHQoKTsgfQogICAgaWYgKEFDVEtFWVNbY10pIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBpZiAoIWUucmVwZWF0KSBwcmVzc0FjdGlvbihBQ1RLRVlTW2NdKTsgfQogIH0pOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsIGZ1bmN0aW9uIChlKSB7IHZhciBjID0gY29kZU9mKGUpOyBpZiAoS0VZTUFQW2NdKSBrZXlzW0tFWU1BUFtjXV0gPSBmYWxzZTsgfSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLCBmdW5jdGlvbiAoKSB7IGtleXMgPSB7fTsgfSk7CgogIGlmIChzdGFydEJ0bikgc3RhcnRCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IGlmIChpbWFnZXNSZWFkeSkgc3RhcnRHYW1lKCk7IH0pOwogIGlmIChhZ2FpbkJ0bikgYWdhaW5CdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBzdGFydEdhbWUpOwogIGlmIChyZXN0YXJ0QnRuKSByZXN0YXJ0QnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgc3RhcnRHYW1lKTsKICBpZiAocmVzdW1lQnRuKSByZXN1bWVCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICBpZiAoRy5zdGF0ZSAhPT0gInBhdXNlZCIpIHJldHVybjsKICAgIEcuc3RhdGUgPSAicGxheSI7IHNob3dDYXJkKG51bGwpOwogICAgaWYgKHRvdWNoTW9kZSAmJiAhbW9iaWxlUGxheSkgZW50ZXJNb2JpbGVQbGF5KCk7CiAgfSk7CiAgaWYgKGV4aXRCdG4pIGV4aXRCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGV4aXRNb2JpbGVQbGF5KCk7IH0pOwogIGlmIChwYXVzZUJ0bikgcGF1c2VCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IHRvZ2dsZVBhdXNlKCk7IH0pOwogIGlmIChzb3VuZEJ0bikgc291bmRCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IG11dGVkID0gIW11dGVkOyBzb3VuZEJ0bi50ZXh0Q29udGVudCA9IG11dGVkID8gIlNvdW5kOiBvZmYiIDogIlNvdW5kOiBvbiI7IGlmIChkcm9uZSkgZHJvbmUuZy5nYWluLnZhbHVlID0gbXV0ZWQgPyAwIDogMC4wOTsgfSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIGZpdCk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIiwgZnVuY3Rpb24gKCkgeyBzZXRUaW1lb3V0KGZpdCwgMjUwKTsgfSk7CiAgZnVuY3Rpb24gb25Gc0NoYW5nZSgpIHsKICAgIGlmICghaXNGc0FjdGl2ZSgpICYmIG1vYmlsZVBsYXkgJiYgIWZzRmFsbGJhY2spIGV4aXRNb2JpbGVQbGF5KCk7CiAgICBmaXQoKTsKICB9CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZnVsbHNjcmVlbmNoYW5nZSIsIG9uRnNDaGFuZ2UpOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBvbkZzQ2hhbmdlKTsKICBpZiAoaXNDb2Fyc2UoKSkgdG91Y2hNb2RlID0gdHJ1ZTsKCiAgdmFyIGxhc3RUcyA9IDA7CiAgZnVuY3Rpb24gbG9vcCh0cykgewogICAgdmFyIGR0ID0gTWF0aC5taW4oMC4wMzMsICh0cyAtIGxhc3RUcykgLyAxMDAwIHx8IDAuMDE2KTsKICAgIGlmIChkdCA8IDApIGR0ID0gMC4wMTY7CiAgICBsYXN0VHMgPSB0czsKICAgIHRyeSB7IHVwZGF0ZShkdCk7IGRyYXcoKTsgfSBjYXRjaCAoZXJyKSB7IGlmICh3aW5kb3cuY29uc29sZSkgY29uc29sZS53YXJuKCJrYWlqdSBsb29wIiwgZXJyKTsgfQogICAgaWYgKGJTcGVjaWFsICYmIGNhdCkgeyBpZiAoY2F0LnBvd2VyID49IDEwMCkgYlNwZWNpYWwuY2xhc3NMaXN0LmFkZCgia2stcmVhZHkiKTsgZWxzZSBiU3BlY2lhbC5jbGFzc0xpc3QucmVtb3ZlKCJray1yZWFkeSIpOyB9CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7CiAgfQoKICBsb2FkSW1hZ2VzKGZ1bmN0aW9uIChmYWlsZWQpIHsKICAgIHByZXBTZXRzKCk7CiAgICByZXNldEdhbWUoKTsKICAgIGlmIChmYWlsZWQubGVuZ3RoICYmIGxvYWRFcnIpIGxvYWRFcnIudGV4dENvbnRlbnQgPSAiU29tZSBhcnQgZmFpbGVkIHRvIGxvYWQuIFBsYWNlaG9sZGVyIHNoYXBlcyB3aWxsIGJlIHVzZWQuIjsKICAgIGlmIChzdGFydEJ0bikgeyBzdGFydEJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBzdGFydEJ0bi50ZXh0Q29udGVudCA9ICJQbGF5IjsgfQogICAgZml0KCk7CiAgfSk7CiAgZml0KCk7CiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApOwoKICB3aW5kb3cuX19LQUlKVSA9IHsKICAgIGluZm86IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHsgc3RhdGU6IEcuc3RhdGUsIHBoYXNlOiBHLnBoYXNlLCBjYXRYOiBjYXQgJiYgTWF0aC5yb3VuZChjYXQueCksIGNhdEZlZXQ6IGNhdCAmJiBjYXQuZmVldCwgZmFjaW5nOiBjYXQgJiYgY2F0LmZhY2luZywgaHA6IGNhdCAmJiBjYXQuaHAsIHBvd2VyOiBjYXQgJiYgY2F0LnBvd2VyLCBzY29yZTogRy5zY29yZSwgbXVsdDogbXVsdCgpLAogICAgICAgIGFjdDogY2F0ICYmIGNhdC5hY3QgJiYgY2F0LmFjdC50eXBlLCBoaXRTdG9wOiBHLmhpdFN0b3AsIHpvb206IEcuem9vbSwgY2FtWDogRy5jYW1YLCB0b3VjaE1vZGU6IHRvdWNoTW9kZSwgbW9iaWxlUGxheTogbW9iaWxlUGxheSwgZnNGYWxsYmFjazogZnNGYWxsYmFjaywgbGFzdEhpdDogRy5sYXN0SGl0IHx8IG51bGwsCiAgICAgICAgaGVsaXM6IGhlbGlzID8gaGVsaXMubWFwKGZ1bmN0aW9uIChoKSB7IHJldHVybiB7IHg6IE1hdGgucm91bmQoaC54KSwgeTogTWF0aC5yb3VuZChoLnkpLCBzdGF0ZTogaC5zdGF0ZSwgcm90OiAraC5yb3QudG9GaXhlZCgyKSB9OyB9KSA6IFtdLAogICAgICAgIHZlaGljbGVzOiB2ZWhpY2xlcyA\/IHZlaGljbGVzLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gdi5raW5kICsgIjoiICsgdi5zdGF0ZTsgfSkgOiBbXSwKICAgICAgICBkYW1hZ2VkQnVpbGRpbmdzOiBidWlsZGluZ3MgPyBidWlsZGluZ3MuZmlsdGVyKGZ1bmN0aW9uIChiKSB7IHJldHVybiBiLnR5cGUgIT09ICJydWluIiAmJiAoYi5ocCA8IGIubWF4SHAgfHwgYi5zdGF0ZSAhPT0gIm9rIik7IH0pLmxlbmd0aCA6IDAsCiAgICAgICAgYm9zczogYm9zcyA\/IHsgeDogTWF0aC5yb3VuZChib3NzLngpLCBocDogYm9zcy5ocCwgc3RhdGU6IGJvc3Muc3RhdGUgfSA6IG51bGwgfTsKICAgIH0sCiAgICB0ZWxlcG9ydDogZnVuY3Rpb24gKHgpIHsgY2F0LnggPSB4OyBHLmNhbVggPSB4IC0gVyAqIDAuMzg7IH0sCiAgICBzcGF3bkhlbGk6IGZ1bmN0aW9uIChkeCwgeSkgeyByZXR1cm4gISFzcGF3bkhlbGkoY2F0LnggKyBkeCAqIGNhdC5mYWNpbmcsIHkpOyB9LAogICAgc3Bhd25WZWhpY2xlOiBmdW5jdGlvbiAoa2luZCwgZHgpIHsgdmFyIHYgPSBzcGF3blZlaGljbGUoa2luZCwgMSwgY2F0LnggKyBkeCk7IHYuc3RhdGUgPSAiZHJpdmUiOyByZXR1cm4gdHJ1ZTsgfSwKICAgIHByZXNzOiBmdW5jdGlvbiAobikgeyBwcmVzc0FjdGlvbihuKTsgfSwKICAgIGhvbGQ6IGZ1bmN0aW9uIChkaXIpIHsga2V5cy5sZWZ0ID0gZGlyIDwgMDsga2V5cy5yaWdodCA9IGRpciA+IDA7IH0sCiAgICBnb2Q6IGZ1bmN0aW9uIChvbikgeyBHLmdvZCA9ICEhb247IH0sCiAgICBmaWxsUG93ZXI6IGZ1bmN0aW9uICgpIHsgY2F0LnBvd2VyID0gMTAwOyB9LAogICAgZnJlZXplU3Bhd25zOiBmdW5jdGlvbiAoKSB7IHNwYXduVC5taWwgPSA5OTk5OyBzcGF3blQuaGVsaSA9IDk5OTk7IHNwYXduVC5jYXIgPSA5OTk5OyB9LAogICAgYm9zc05vdzogZnVuY3Rpb24gKCkgeyBjYXQueCA9IEJPU1NfWCAtIDIwMDsgRy5jYW1YID0gY2F0LnggLSBXIC8gMjsgc3RhcnRCb3NzSW50cm8oKTsgfSwKICAgIGZvcmNlVG91Y2g6IGZ1bmN0aW9uICgpIHsgdG91Y2hNb2RlID0gdHJ1ZTsgdXBkYXRlVG91Y2hWaXNpYmlsaXR5KCk7IHNpemVUb3VjaFVJKCk7IH0sCiAgICBidWlsZGluZ3M6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGJ1aWxkaW5ncy5tYXAoZnVuY3Rpb24gKGIpIHsgcmV0dXJuIHsgeDogTWF0aC5yb3VuZChiLngpLCB3OiBNYXRoLnJvdW5kKGIudyksIHR5cGU6IGIudHlwZSwgc3RhdGU6IGIuc3RhdGUsIGhwOiBiLmhwIH07IH0pOyB9LAogICAgaHVydDogZnVuY3Rpb24gKG4pIHsgaHVydENhdChuLCAxKTsgfSwKICAgIGZyZWV6ZTogZnVuY3Rpb24gKG9uKSB7IEcuZnJvemVuID0gISFvbjsgfSwKICAgIGFjdFQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNhdC5hY3QgPyB7IHR5cGU6IGNhdC5hY3QudHlwZSwgdDogY2F0LmFjdC50LCB3aW5kOiBjYXQuYWN0LndpbmQsIGFjdGl2ZTogY2F0LmFjdC5hY3RpdmUgfSA6IG51bGw7IH0sCiAgICBmaXQ6IGZpdAogIH07Cn0pKCk7Cg==\");\n  document.body.appendChild(el);\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>X II &#8635; Turn your phone sideways Kaiju Kitties plays in landscape. SWIPE HEAVY ROAR SLAM TAIL Kaiju Kitties You are a house cat the size of a skyscraper. Stomp through downtown, swat helicopters out of the sky, flatten tanks, and level the city. At the end of the district a rival giant cat is [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-161","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/161","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/catventures.lol\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=161"}],"version-history":[{"count":0,"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/161\/revisions"}],"wp:attachment":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}