﻿{"id":303,"date":"2026-10-07T03:40:23","date_gmt":"2026-10-07T03:40:23","guid":{"rendered":"https:\/\/catventures.lol\/?page_id=303"},"modified":"2026-10-07T04:50:24","modified_gmt":"2026-10-07T04:50:24","slug":"cat-match","status":"publish","type":"page","link":"https:\/\/catventures.lol\/?page_id=303","title":{"rendered":"Cat Match (backup version 6)"},"content":{"rendered":"\n<style>\nhtml.cm-boot, body.cm-boot {\n  overflow: hidden !important;\n  overscroll-behavior: none;\n  touch-action: none;\n  height: 100% !important;\n  margin: 0 !important;\n}\nbody.cm-boot .wp-block-post-title,\nbody.cm-boot .wp-site-blocks > header,\nbody.cm-boot .wp-site-blocks > footer,\nbody.cm-boot header.wp-block-template-part,\nbody.cm-boot footer.wp-block-template-part,\nbody.cm-boot nav.wp-block-navigation,\nbody.cm-boot .wp-block-navigation,\nbody.cm-boot .wp-block-template-part {\n  display: none !important;\n}\nbody.cm-boot .wp-site-blocks > main,\nbody.cm-boot main,\nbody.cm-boot .entry-content,\nbody.cm-boot .entry-content > .wp-block-group,\nbody.cm-boot main > .wp-block-group {\n  padding: 0 !important;\n  margin: 0 !important;\n  max-width: none !important;\n}\n#cm-app, #cm-app * { box-sizing: border-box; }\n#cm-app {\n  position: fixed;\n  left: 0; top: 0; right: 0; bottom: 0;\n  width: 100vw; height: 100vh;\n  width: 100dvw; height: 100dvh;\n  max-width: none;\n  margin: 0;\n  background: #1a1210;\n  color: #fff4e0;\n  font-family: \"Trebuchet MS\", \"Segoe UI\", sans-serif;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  overflow: hidden;\n  touch-action: none;\n  user-select: none;\n  -webkit-user-select: none;\n  -webkit-touch-callout: none;\n  -webkit-tap-highlight-color: transparent;\n  border-radius: 0;\n  z-index: 2147482000;\n}\n#cm-stage {\n  position: relative;\n  width: 100%;\n  height: 100%;\n  line-height: 0;\n  touch-action: none;\n  margin: 0 auto;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n#cm-game {\n  display: block;\n  width: min(calc(100dvw - 16px), calc((100dvh - 16px) * 16 \/ 9));\n  height: min(calc(100dvh - 16px), calc((100dvw - 16px) * 9 \/ 16));\n  max-width: calc(100dvw - 16px);\n  max-height: calc(100dvh - 16px);\n  margin: 0 auto;\n  background: #2a1c14;\n  touch-action: none;\n}\n#cm-app:fullscreen, #cm-app:-webkit-full-screen {\n  width: 100vw; height: 100vh; width: 100dvw; height: 100dvh;\n  max-width: none; border-radius: 0; background: #1a1210;\n}\n#cm-app.cm-fallback {\n  position: fixed; left: 0; top: 0;\n  width: 100vw; height: 100vh; width: 100dvw; height: 100dvh;\n  max-width: none; margin: 0; z-index: 2147483000; border-radius: 0; background: #1a1210;\n}\n#cm-app.cm-playing #cm-stage, #cm-app.cm-mobile #cm-stage, #cm-app.cm-fallback #cm-stage,\n#cm-app:fullscreen #cm-stage, #cm-app:-webkit-full-screen #cm-stage {\n  flex: 1 1 auto; width: 100%; height: 100%; max-width: none; max-height: none;\n}\n#cm-app.cm-playing #cm-game, #cm-app.cm-mobile #cm-game, #cm-app.cm-fallback #cm-game,\n#cm-app:fullscreen #cm-game, #cm-app:-webkit-full-screen #cm-game {\n  width: 100% !important; height: 100% !important;\n  max-width: none !important; max-height: none !important;\n  aspect-ratio: auto; margin: 0;\n}\nhtml.cm-noscroll, body.cm-noscroll { overflow: hidden !important; overscroll-behavior: none; touch-action: none; }\n#cm-overlay {\n  position: absolute; left: 0; top: 0; right: 0; bottom: 0;\n  display: flex; align-items: center; justify-content: center;\n  background: rgba(8, 5, 12, 0.82); padding: 10px; line-height: 1.3; z-index: 20; overflow: auto;\n  touch-action: manipulation;\n}\n#cm-overlay.cm-tapplay { cursor: pointer; }\n#cm-overlay.cm-tapplay .cm-card { pointer-events: none; }\n#cm-overlay.cm-tapplay .cm-card .cm-go { pointer-events: auto; }\n#cm-overlay[hidden] { display: none !important; }\n.cm-card {\n  width: min(560px, 100%); max-height: 100%; overflow: auto;\n  background: rgba(42, 28, 22, 0.97); border: 2px solid #e07a32; border-radius: 16px;\n  padding: 10px 14px 12px; text-align: center; box-shadow: 0 18px 50px rgba(0,0,0,0.5);\n}\n.cm-card[hidden] { display: none !important; }\n.cm-card h2 {\n  font-family: Impact, \"Arial Black\", sans-serif; letter-spacing: 1px; font-size: 26px;\n  line-height: 1.1; margin: 2px 0 6px; color: #ffb35c; text-transform: uppercase;\n}\n.cm-cover {\n  display: block; width: min(220px, 55%); height: auto; margin: 0 auto 6px;\n  border-radius: 12px; box-shadow: 0 8px 24px rgba(0,0,0,0.45);\n}\n.cm-txt { font-size: 14px; margin: 0 0 6px; color: #f3dcc4; }\n.cm-keys { font-size: 12px; margin: 0 0 6px; color: #d8bfa8; text-align: left; }\n.cm-keys b { color: #ffd9a0; }\n.cm-ver { font-size: 11px; color: #9a8070; margin: 8px 0 0; }\n.cm-go {\n  display: inline-block; background: #e0622a; color: #fff; border: 0; border-radius: 999px;\n  padding: 12px 40px; font: 800 20px \"Arial Black\", Impact, sans-serif; letter-spacing: 1px;\n  cursor: pointer; margin: 8px 4px 2px;\n}\n.cm-go:hover { background: #f07a3a; }\n.cm-go:disabled { opacity: 0.6; cursor: wait; }\n.cm-small {\n  display: inline-block; background: transparent; color: #f3dcc4;\n  border: 1px solid rgba(255,220,180,0.5); border-radius: 999px; padding: 6px 14px;\n  font: 700 13px \"Trebuchet MS\", sans-serif; cursor: pointer; margin: 4px 4px 0;\n}\n.cm-stars { font-size: 36px; color: #ffd070; margin: 4px 0; letter-spacing: 4px; }\n#cm-exit, #cm-pausebtn, #cm-hintbtn {\n  position: fixed; z-index: 2147483100; border-radius: 50%;\n  border: 2px solid rgba(255,240,220,0.65); background: rgba(30, 18, 14, 0.88); color: #fff4e0;\n  font: 800 12px \"Arial Black\", sans-serif; line-height: 1; padding: 0; cursor: pointer; touch-action: manipulation;\n}\n#cm-exit, #cm-pausebtn { width: 44px; height: 44px; font-size: 16px; }\n#cm-hintbtn {\n  width: auto; min-width: 64px; min-height: 48px; height: 52px; border-radius: 16px; padding: 0 16px;\n  font-size: 15px; letter-spacing: 0.4px; white-space: nowrap;\n  box-shadow: 0 4px 14px rgba(0,0,0,0.45);\n}\n#cm-hintbtn.cm-hint-on { background: rgba(224, 122, 50, 0.98); border-color: #ffd080; color: #fff; }\n#cm-exit { top: 8px; right: 8px; }\n#cm-pausebtn { top: 8px; right: 58px; }\n#cm-hintbtn { bottom: 8px; right: 8px; top: auto; }\n#cm-exit[hidden], #cm-pausebtn[hidden], #cm-hintbtn[hidden] { display: none !important; }\n#cm-rotate {\n  position: fixed; left: 0; top: 0; right: 0; bottom: 0; z-index: 2147483200;\n  background: rgba(8, 6, 10, 0.94); display: flex; align-items: center; justify-content: center;\n  text-align: center; padding: 24px; line-height: 1.4;\n}\n#cm-rotate[hidden] { display: none !important; }\n#cm-rotate .cm-rot-icon { font: 800 46px \"Arial Black\", sans-serif; margin-bottom: 10px; color: #ffb35c; }\n@media (max-height: 480px) {\n  .cm-card { padding: 6px 10px 8px; border-radius: 12px; width: min(640px, 100%); }\n  .cm-card h2 { font-size: 18px; margin: 0 0 2px; }\n  .cm-cover { width: min(140px, 28%); margin: 0 auto 2px; }\n  .cm-txt { font-size: 11px; margin: 0 0 2px; }\n  .cm-keys { font-size: 10px; margin: 0 0 2px; }\n  .cm-go { padding: 8px 28px; font-size: 16px; margin: 4px 4px 0; }\n  .cm-ver { font-size: 10px; margin: 4px 0 0; }\n}\n<\/style>\n<div id=\"cm-app\">\n<button type=\"button\" id=\"cm-exit\" hidden aria-label=\"Exit\">X<\/button>\n<button type=\"button\" id=\"cm-pausebtn\" hidden aria-label=\"Pause\">II<\/button>\n<button type=\"button\" id=\"cm-hintbtn\" hidden aria-label=\"Toggle hints\" aria-pressed=\"false\">Hint<\/button>\n<div id=\"cm-rotate\" hidden><div><div class=\"cm-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\">Landscape fits more board. Portrait works too.<\/div><\/div><\/div>\n<div id=\"cm-stage\">\n<canvas id=\"cm-game\" width=\"960\" height=\"540\" tabindex=\"0\" aria-label=\"Cat Match game\"><\/canvas>\n<div id=\"cm-overlay\">\n<div class=\"cm-card\" id=\"cm-title\">\n<img loading=\"lazy\" decoding=\"async\" class=\"cm-cover\" src=\"https:\/\/catventures.lol\/wp-content\/uploads\/2026\/10\/cm_cover_new.jpg\" alt=\"Cat Match: cartoon cat faces on a colorful match-3 board\" width=\"960\" height=\"540\">\n<h2>Cat Match<\/h2>\n<div class=\"cm-txt\"><b style=\"color:#ffd9a0\">What:<\/b> A cozy match-3. Swap cute cats, make combos, clear boxes, and free kittens.<\/div>\n<div class=\"cm-txt\"><b style=\"color:#ffd9a0\">Goal:<\/b> Beat each level&#8217;s objective before you run out of moves. Match 4 for stripes, 5 for rainbow, T\/L for bombs.<\/div>\n<div class=\"cm-keys\"><b>Desktop:<\/b> Click two adjacent cats, or drag to swap. Tap Hint to highlight a move.<\/div>\n<div class=\"cm-keys\"><b>Phone:<\/b> Drag a cat toward its neighbor. Turn sideways. Use Hint when you need help.<\/div>\n<button type=\"button\" class=\"cm-go\" id=\"cm-start\" disabled>Loading<\/button>\n<div class=\"cm-ver\">v2026-10-06d<\/div>\n<\/div>\n<div class=\"cm-card\" id=\"cm-level\" hidden>\n<h2 id=\"cm-level-title\">Level 1<\/h2>\n<div class=\"cm-txt\" id=\"cm-level-goal\"><\/div>\n<button type=\"button\" class=\"cm-go\" id=\"cm-play-level\">Go<\/button>\n<div class=\"cm-ver\">v2026-10-06d<\/div>\n<\/div>\n<div class=\"cm-card\" id=\"cm-win\" hidden>\n<h2>Pawsome!<\/h2>\n<div class=\"cm-stars\" id=\"cm-win-stars\">***<\/div>\n<div class=\"cm-txt\" id=\"cm-win-msg\"><\/div>\n<button type=\"button\" class=\"cm-go\" id=\"cm-next\">Next level<\/button>\n<button type=\"button\" class=\"cm-small\" id=\"cm-retry\">Replay<\/button>\n<button type=\"button\" class=\"cm-small\" id=\"cm-menu\">Menu<\/button>\n<div class=\"cm-ver\">v2026-10-06d<\/div>\n<\/div>\n<div class=\"cm-card\" id=\"cm-lose\" hidden>\n<h2>Out of moves<\/h2>\n<div class=\"cm-txt\">The cats still need your help. Try again!<\/div>\n<button type=\"button\" class=\"cm-go\" id=\"cm-retry-lose\">Try again<\/button>\n<button type=\"button\" class=\"cm-small\" id=\"cm-menu-lose\">Menu<\/button>\n<div class=\"cm-ver\">v2026-10-06d<\/div>\n<\/div>\n<div class=\"cm-card\" id=\"cm-pause\" hidden>\n<h2>Paused<\/h2>\n<button type=\"button\" class=\"cm-go\" id=\"cm-resume\">Resume<\/button>\n<button type=\"button\" class=\"cm-go\" id=\"cm-restart\">Restart<\/button>\n<div class=\"cm-ver\">v2026-10-06d<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<script>\n(function () {\n  try {\n    document.documentElement.classList.add(\"cm-boot\");\n    if (document.body) document.body.classList.add(\"cm-boot\");\n    else document.addEventListener(\"DOMContentLoaded\", function () {\n      document.body.classList.add(\"cm-boot\");\n    });\n  } catch (e) {}\n  try { window.scrollTo(0, 0); } catch (e2) {}\n})();\n<\/script>\n<script>\n(function () {\n  var el = document.createElement(\"script\");\n  el.text = atob(\"KGZ1bmN0aW9uICgpIHsKICAidXNlIHN0cmljdCI7CiAgdmFyIFZFUlNJT04gPSAidjIwMjYtMTAtMDZkIjsKICB2YXIgVyA9IDk2MCwgSCA9IDU0MDsKICB2YXIgR1JJRCA9IDg7CiAgdmFyIFRZUEVTID0gNjsKICB2YXIgQ0FUX05BTUVTID0gWyJPcmFuZ2UiLCAiQmxhY2siLCAiV2hpdGUiLCAiR3JheSIsICJDYWxpY28iLCAiVHV4ZWRvIl07CiAgdmFyIFNDT1JFX0JBU0UgPSB7MzogMTAwLCA0OiAyNTAsIDU6IDUwMH07CiAgdmFyIENPTUJPX01TRyA9IFsiIiwgIlBVUlJGRUNUISIsICJQQVdTT01FISIsICJDQVQtVEFTVElDISIsICJNRU9XWkEhIiwgIkxFR0VOREFSWSEiXTsKCiAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjbS1nYW1lIik7CiAgaWYgKCFjYW52YXMpIHJldHVybjsKICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgdmFyIGFwcEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNtLWFwcCIpOwoKICAoZnVuY3Rpb24gY2xlYW5NYXJrdXAoKSB7CiAgICBpZiAoIWFwcEVsKSByZXR1cm47CiAgICB2YXIgYnJzID0gYXBwRWwucXVlcnlTZWxlY3RvckFsbCgiYnIiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnJzLmxlbmd0aDsgaSsrKSBicnNbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChicnNbaV0pOwogICAgdmFyIHBzID0gYXBwRWwucXVlcnlTZWxlY3RvckFsbCgicCIpOwogICAgZm9yICh2YXIgaiA9IHBzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7CiAgICAgIHZhciBwID0gcHNbal07CiAgICAgIHdoaWxlIChwLmZpcnN0Q2hpbGQpIHAucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocC5maXJzdENoaWxkLCBwKTsKICAgICAgcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHApOwogICAgfQogIH0pKCk7CgogIGZ1bmN0aW9uICQoaWQpIHsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsgfQogIHZhciBvdmVybGF5RWwgPSAkKCJjbS1vdmVybGF5Iik7CiAgdmFyIHRpdGxlQ2FyZCA9ICQoImNtLXRpdGxlIik7CiAgdmFyIGxldmVsQ2FyZCA9ICQoImNtLWxldmVsIik7CiAgdmFyIHdpbkNhcmQgPSAkKCJjbS13aW4iKTsKICB2YXIgbG9zZUNhcmQgPSAkKCJjbS1sb3NlIik7CiAgdmFyIHBhdXNlQ2FyZCA9ICQoImNtLXBhdXNlIik7CiAgdmFyIHN0YXJ0QnRuID0gJCgiY20tc3RhcnQiKTsKICB2YXIgbmV4dEJ0biA9ICQoImNtLW5leHQiKTsKICB2YXIgcmV0cnlCdG4gPSAkKCJjbS1yZXRyeSIpOwogIHZhciByZXRyeUxvc2VCdG4gPSAkKCJjbS1yZXRyeS1sb3NlIik7CiAgdmFyIG1lbnVCdG4gPSAkKCJjbS1tZW51Iik7CiAgdmFyIHJlc3VtZUJ0biA9ICQoImNtLXJlc3VtZSIpOwogIHZhciByZXN0YXJ0QnRuID0gJCgiY20tcmVzdGFydCIpOwogIHZhciBleGl0QnRuID0gJCgiY20tZXhpdCIpOwogIHZhciBwYXVzZUJ0biA9ICQoImNtLXBhdXNlYnRuIik7CiAgdmFyIHJvdGF0ZUVsID0gJCgiY20tcm90YXRlIik7CiAgdmFyIGxldmVsVGl0bGUgPSAkKCJjbS1sZXZlbC10aXRsZSIpOwogIHZhciBsZXZlbEdvYWwgPSAkKCJjbS1sZXZlbC1nb2FsIik7CiAgdmFyIHdpblN0YXJzID0gJCgiY20td2luLXN0YXJzIik7CiAgdmFyIHdpbk1zZyA9ICQoImNtLXdpbi1tc2ciKTsKICB2YXIgdmVyRWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmNtLXZlciIpOwogIGZvciAodmFyIHZpID0gMDsgdmkgPCB2ZXJFbHMubGVuZ3RoOyB2aSsrKSB2ZXJFbHNbdmldLnRleHRDb250ZW50ID0gVkVSU0lPTjsKCiAgdmFyIGJvYXJkWCA9IDIwMCwgYm9hcmRZID0gNDgsIGNlbGwgPSA1NCwgYm9hcmRQYWQgPSA4OwogIHZhciBodWRNb2RlID0gInNpZGUiOwogIHZhciBoaW50QW5jaG9yID0ge3g6IDAsIHk6IDAsIHc6IDY0LCBoOiA1Mn07CiAgdmFyIHNwcml0ZXMgPSBbXTsKICB2YXIgc3BlY2lhbFNwcml0ZXMgPSB7fTsKICB2YXIgb2JzdGFjbGVTcHJpdGVzID0ge307CiAgdmFyIGJnQ2FudmFzID0gbnVsbDsKICB2YXIgYm9hcmRHcmlkSW1nID0gbnVsbDsKICB2YXIgYm9hcmRHcmlkUmVhZHkgPSBmYWxzZTsKICB2YXIgbGFzdExheW91dEtleSA9ICIiOwoKICB2YXIgc3RhdGUgPSAidGl0bGUiOwogIHZhciBncmlkID0gW107CiAgdmFyIGxldmVsSW5kZXggPSAwOwogIHZhciBtb3Zlc0xlZnQgPSAwOwogIHZhciBzY29yZSA9IDA7CiAgdmFyIGNvbWJvID0gMDsKICB2YXIgZ29hbHMgPSBbXTsKICB2YXIgc3RhcnNFYXJuZWQgPSAwOwogIHZhciBidXN5ID0gZmFsc2U7CiAgdmFyIHNlbGVjdGVkID0gbnVsbDsKICB2YXIgaGludENlbGxzID0gbnVsbDsKICB2YXIgaGludHNPbiA9IGZhbHNlOwogIHZhciBoaW50QnRuID0gJCgiY20taGludGJ0biIpOwogIHZhciBmbGFzaE1zZyA9ICIiOwogIHZhciBmbGFzaFRpbWVyID0gMDsKICB2YXIgcGFydGljbGVzID0gW107CiAgdmFyIGFuaW1UaWxlcyA9IFtdOwogIHZhciBkcmFnU3RhcnQgPSBudWxsOwogIHZhciBwb2ludGVySWQgPSBudWxsOwogIHZhciBiZXN0U3RhcnMgPSB7fTsKICB0cnkgewogICAgYmVzdFN0YXJzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY2F0TWF0Y2hTdGFycyIpIHx8ICJ7fSIpIHx8IHt9OwogIH0gY2F0Y2ggKGUpIHsgYmVzdFN0YXJzID0ge307IH0KCiAgLyogPT09PT0gTEVWRUxTID09PT09ICovCiAgdmFyIExFVkVMUyA9IFsKICAgIHttb3ZlczogMjAsIHN0YXJzOiBbODAwLCAxNjAwLCAyODAwXSwgZ29hbHM6IFt7a2luZDogImNvbGxlY3QiLCB0eXBlOiAwLCBuZWVkOiAxMn1dLCB0aXA6ICJTd2FwIGFkamFjZW50IGNhdHMgdG8gbWF0Y2ggMysgb3JhbmdlIHRhYmJpZXMuIn0sCiAgICB7bW92ZXM6IDIyLCBzdGFyczogWzEwMDAsIDIwMDAsIDM1MDBdLCBnb2FsczogW3traW5kOiAiY29sbGVjdCIsIHR5cGU6IDEsIG5lZWQ6IDE0fV0sIHRpcDogIkNvbGxlY3QgYmxhY2sgY2F0cy4gQ2FzY2FkZXMgZ2l2ZSBib251cyBwb2ludHMhIn0sCiAgICB7bW92ZXM6IDIyLCBzdGFyczogWzEyMDAsIDI0MDAsIDQwMDBdLCBnb2FsczogW3traW5kOiAiY29sbGVjdCIsIHR5cGU6IDIsIG5lZWQ6IDE1fV0sIHRpcDogIk1hdGNoIDQgZm9yIGEgU3RyaXBlZCBDYXQgdGhhdCBjbGVhcnMgYSB3aG9sZSBsaW5lLiJ9LAogICAge21vdmVzOiAyNCwgc3RhcnM6IFsxNDAwLCAyODAwLCA0NTAwXSwgZ29hbHM6IFt7a2luZDogImNvbGxlY3QiLCB0eXBlOiAzLCBuZWVkOiAxNn1dLCB0aXA6ICJUIG9yIEwgc2hhcGVzIG1ha2UgRXhwbG9kaW5nIENhdHMgKDN4MyBibGFzdCkuIn0sCiAgICB7bW92ZXM6IDI0LCBzdGFyczogWzE2MDAsIDMyMDAsIDUwMDBdLCBnb2FsczogW3traW5kOiAiY29sbGVjdCIsIHR5cGU6IDQsIG5lZWQ6IDEyfSwge2tpbmQ6ICJjb2xsZWN0IiwgdHlwZTogNSwgbmVlZDogMTJ9XSwgdGlwOiAiQ29sbGVjdCBjYWxpY28gQU5EIHR1eGVkbyBjYXRzLiJ9LAogICAge21vdmVzOiAyNiwgc3RhcnM6IFsxNTAwLCAzMDAwLCA1MDAwXSwgZ29hbHM6IFt7a2luZDogImJveGVzIiwgbmVlZDogOH1dLCBib3hlczogOCwgdGlwOiAiTWF0Y2ggbmV4dCB0byBjYXJkYm9hcmQgYm94ZXMgdG8gY2xlYXIgdGhlbS4iLCBsYXlvdXQ6ICJib3hlczEifSwKICAgIHttb3ZlczogMjYsIHN0YXJzOiBbMTgwMCwgMzYwMCwgNTUwMF0sIGdvYWxzOiBbe2tpbmQ6ICJib3hlcyIsIG5lZWQ6IDEyfV0sIGJveGVzOiAxMiwgdGlwOiAiRG91YmxlIGJveGVzIG5lZWQgdHdvIGhpdHMhIiwgbGF5b3V0OiAiYm94ZXMyIn0sCiAgICB7bW92ZXM6IDI4LCBzdGFyczogWzIwMDAsIDQwMDAsIDY1MDBdLCBnb2FsczogW3traW5kOiAiYm94ZXMiLCBuZWVkOiAxMH0sIHtraW5kOiAiY29sbGVjdCIsIHR5cGU6IDAsIG5lZWQ6IDEwfV0sIGJveGVzOiAxMCwgdGlwOiAiQ2xlYXIgYm94ZXMgYW5kIGNvbGxlY3Qgb3JhbmdlIGNhdHMuIiwgbGF5b3V0OiAiYm94ZXMzIn0sCiAgICB7bW92ZXM6IDI4LCBzdGFyczogWzIyMDAsIDQ0MDAsIDcwMDBdLCBnb2FsczogW3traW5kOiAiYm94ZXMiLCBuZWVkOiAxNH1dLCBib3hlczogMTQsIHRpcDogIlVzZSBzcGVjaWFscyB0byBzbWFzaCBsb3RzIG9mIGJveGVzLiIsIGxheW91dDogImJveGVzNCJ9LAogICAge21vdmVzOiAzMCwgc3RhcnM6IFsyNTAwLCA1MDAwLCA4MDAwXSwgZ29hbHM6IFt7a2luZDogImJveGVzIiwgbmVlZDogMTZ9XSwgYm94ZXM6IDE2LCB0aXA6ICJCaWcgYm94IGNsZWFyLiBDb21ib3MgaGVscCEiLCBsYXlvdXQ6ICJib3hlczUifSwKICAgIHttb3ZlczogMjgsIHN0YXJzOiBbMjAwMCwgNDAwMCwgNjUwMF0sIGdvYWxzOiBbe2tpbmQ6ICJraXR0ZW5zIiwgbmVlZDogM31dLCBjYXJyaWVyczogMywgdGlwOiAiTWF0Y2ggbmV4dCB0byBjYXQgY2FycmllcnMgdG8gZnJlZSB0aGUga2l0dGVucyEiLCBsYXlvdXQ6ICJraXRzMSJ9LAogICAge21vdmVzOiAzMCwgc3RhcnM6IFsyNDAwLCA0ODAwLCA3NTAwXSwgZ29hbHM6IFt7a2luZDogImtpdHRlbnMiLCBuZWVkOiA0fSwge2tpbmQ6ICJib3hlcyIsIG5lZWQ6IDZ9XSwgY2FycmllcnM6IDQsIGJveGVzOiA2LCB0aXA6ICJGcmVlIGtpdHRlbnMgYW5kIGNsZWFyIGJveGVzLiIsIGxheW91dDogImtpdHMyIn0sCiAgICB7bW92ZXM6IDMwLCBzdGFyczogWzI2MDAsIDUyMDAsIDgwMDBdLCBnb2FsczogW3traW5kOiAieWFybiIsIG5lZWQ6IDh9XSwgeWFybjogOCwgdGlwOiAiWWFybiBiYWxscyBjbGVhciB3aGVuIGEgbWF0Y2ggdG91Y2hlcyB0aGVtLiIsIGxheW91dDogInlhcm4xIn0sCiAgICB7bW92ZXM6IDMyLCBzdGFyczogWzI4MDAsIDU2MDAsIDkwMDBdLCBnb2FsczogW3traW5kOiAieWFybiIsIG5lZWQ6IDEwfSwge2tpbmQ6ICJjb2xsZWN0IiwgdHlwZTogMiwgbmVlZDogMTB9XSwgeWFybjogMTAsIHRpcDogIkNsZWFyIHlhcm4gYW5kIGNvbGxlY3Qgd2hpdGUgY2F0cy4iLCBsYXlvdXQ6ICJ5YXJuMiJ9LAogICAge21vdmVzOiAzMiwgc3RhcnM6IFszMDAwLCA2MDAwLCA5NTAwXSwgZ29hbHM6IFt7a2luZDogImtpdHRlbnMiLCBuZWVkOiAzfSwge2tpbmQ6ICJ5YXJuIiwgbmVlZDogNn1dLCBjYXJyaWVyczogMywgeWFybjogNiwgdGlwOiAiTWl4IG9mIGNhcnJpZXJzIGFuZCB5YXJuLiIsIGxheW91dDogIm1peDEifSwKICAgIHttb3ZlczogMzQsIHN0YXJzOiBbMzIwMCwgNjQwMCwgMTAwMDBdLCBnb2FsczogW3traW5kOiAiYm94ZXMiLCBuZWVkOiAxMH0sIHtraW5kOiAia2l0dGVucyIsIG5lZWQ6IDN9XSwgYm94ZXM6IDEwLCBjYXJyaWVyczogMywgdGlwOiAiQm9zcy1pc2ggbWl4LiBTdHViYmVkIGZvciBleHBhbnNpb24uIiwgbGF5b3V0OiAibWl4MiJ9LAogICAge21vdmVzOiAzNCwgc3RhcnM6IFszNDAwLCA2ODAwLCAxMDUwMF0sIGdvYWxzOiBbe2tpbmQ6ICJjb2xsZWN0IiwgdHlwZTogMCwgbmVlZDogMjB9LCB7a2luZDogImJveGVzIiwgbmVlZDogOH1dLCBib3hlczogOCwgdGlwOiAiTW9yZSB0byBjb21lISIsIGxheW91dDogIm1peDMifSwKICAgIHttb3ZlczogMzYsIHN0YXJzOiBbMzYwMCwgNzIwMCwgMTEwMDBdLCBnb2FsczogW3traW5kOiAieWFybiIsIG5lZWQ6IDEyfV0sIHlhcm46IDEyLCB0aXA6ICJZYXJuIGdhdW50bGV0LiIsIGxheW91dDogInlhcm4zIn0sCiAgICB7bW92ZXM6IDM2LCBzdGFyczogWzM4MDAsIDc2MDAsIDExNTAwXSwgZ29hbHM6IFt7a2luZDogImtpdHRlbnMiLCBuZWVkOiA1fV0sIGNhcnJpZXJzOiA1LCB0aXA6ICJLaXR0ZW4gcmVzY3VlLiIsIGxheW91dDogImtpdHMzIn0sCiAgICB7bW92ZXM6IDQwLCBzdGFyczogWzQwMDAsIDgwMDAsIDEyMDAwXSwgZ29hbHM6IFt7a2luZDogImJveGVzIiwgbmVlZDogMTJ9LCB7a2luZDogInlhcm4iLCBuZWVkOiA4fSwge2tpbmQ6ICJraXR0ZW5zIiwgbmVlZDogM31dLCBib3hlczogMTIsIHlhcm46IDgsIGNhcnJpZXJzOiAzLCB0aXA6ICJFdmVyeXRoaW5nIGF0IG9uY2UhIiwgbGF5b3V0OiAibWl4NCJ9CiAgXTsKCiAgLyogPT09PT0gU1BSSVRFIERSQVdJTkcgPT09PT0gKi8KICBmdW5jdGlvbiByb3VuZFJlY3QoYywgeCwgeSwgdywgaCwgcikgewogICAgYy5iZWdpblBhdGgoKTsKICAgIGMubW92ZVRvKHggKyByLCB5KTsKICAgIGMuYXJjVG8oeCArIHcsIHksIHggKyB3LCB5ICsgaCwgcik7CiAgICBjLmFyY1RvKHggKyB3LCB5ICsgaCwgeCwgeSArIGgsIHIpOwogICAgYy5hcmNUbyh4LCB5ICsgaCwgeCwgeSwgcik7CiAgICBjLmFyY1RvKHgsIHksIHggKyB3LCB5LCByKTsKICAgIGMuY2xvc2VQYXRoKCk7CiAgfQoKICB2YXIgQVRMQVNfVVJMID0gImh0dHBzOi8vY2F0dmVudHVyZXMubG9sL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzEwL2NtX2F0bGFzLnBuZyI7CiAgdmFyIEFUTEFTX1RXID0gOTYsIEFUTEFTX1RIID0gOTY7CiAgdmFyIEVYUFIgPSB7aGFwcHk6IDAsIHdpbms6IDEsIGpveWZ1bDogMiwgc3VycHJpc2U6IDMsIGFuZ3J5OiA0fTsKICB2YXIgYXRsYXNJbWcgPSBudWxsOwogIHZhciBhdGxhc1JlYWR5ID0gZmFsc2U7CiAgdmFyIHNwcml0ZXNSZWFkeSA9IGZhbHNlOwoKICBmdW5jdGlvbiBzbGljZUF0bGFzVGlsZSh0eXBlLCBleHByTmFtZSkgewogICAgdmFyIHJvdyA9IEVYUFJbZXhwck5hbWVdOwogICAgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSByb3cgPSAwOwogICAgdmFyIGN2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgICBjdi53aWR0aCA9IEFUTEFTX1RXOyBjdi5oZWlnaHQgPSBBVExBU19USDsKICAgIHZhciBjID0gY3YuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGlmIChhdGxhc0ltZykgewogICAgICBjLmRyYXdJbWFnZShhdGxhc0ltZywgdHlwZSAqIEFUTEFTX1RXLCByb3cgKiBBVExBU19USCwgQVRMQVNfVFcsIEFUTEFTX1RILCAwLCAwLCBBVExBU19UVywgQVRMQVNfVEgpOwogICAgfQogICAgcmV0dXJuIGN2OwogIH0KCiAgZnVuY3Rpb24gbWFrZVNwZWNpYWxPdmVybGF5KGtpbmQpIHsKICAgIHZhciBzID0gOTY7CiAgICB2YXIgY3YgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgIGN2LndpZHRoID0gczsgY3YuaGVpZ2h0ID0gczsKICAgIHZhciBjID0gY3YuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGlmIChraW5kID09PSAic3RyaXBlZF9oIikgewogICAgICBjLnN0cm9rZVN0eWxlID0gInJnYmEoMjU1LDI1NSwyNTUsMC44NSkiOwogICAgICBjLmxpbmVXaWR0aCA9IDY7CiAgICAgIGZvciAodmFyIHkgPSAxODsgeSA8IDgwOyB5ICs9IDE0KSB7CiAgICAgICAgYy5iZWdpblBhdGgoKTsgYy5tb3ZlVG8oMTIsIHkpOyBjLmxpbmVUbyg4NCwgeSk7IGMuc3Ryb2tlKCk7CiAgICAgIH0KICAgICAgYy5zdHJva2VTdHlsZSA9ICJyZ2JhKDgwLDE4MCwyNTUsMC45KSI7CiAgICAgIGMubGluZVdpZHRoID0gMzsKICAgICAgYy5zdHJva2VSZWN0KDgsIDgsIDgwLCA4MCk7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT09ICJzdHJpcGVkX3YiKSB7CiAgICAgIGMuc3Ryb2tlU3R5bGUgPSAicmdiYSgyNTUsMjU1LDI1NSwwLjg1KSI7CiAgICAgIGMubGluZVdpZHRoID0gNjsKICAgICAgZm9yICh2YXIgeCA9IDE4OyB4IDwgODA7IHggKz0gMTQpIHsKICAgICAgICBjLmJlZ2luUGF0aCgpOyBjLm1vdmVUbyh4LCAxMik7IGMubGluZVRvKHgsIDg0KTsgYy5zdHJva2UoKTsKICAgICAgfQogICAgICBjLnN0cm9rZVN0eWxlID0gInJnYmEoODAsMTgwLDI1NSwwLjkpIjsKICAgICAgYy5saW5lV2lkdGggPSAzOwogICAgICBjLnN0cm9rZVJlY3QoOCwgOCwgODAsIDgwKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gImJvbWIiKSB7CiAgICAgIGMuZmlsbFN0eWxlID0gInJnYmEoMjU1LDgwLDQwLDAuMzUpIjsKICAgICAgYy5iZWdpblBhdGgoKTsgYy5hcmMoNDgsIDQ4LCA0MCwgMCwgTWF0aC5QSSAqIDIpOyBjLmZpbGwoKTsKICAgICAgYy5zdHJva2VTdHlsZSA9ICIjZmY2MDMwIjsKICAgICAgYy5saW5lV2lkdGggPSA0OwogICAgICBjLmJlZ2luUGF0aCgpOyBjLmFyYyg0OCwgNDgsIDM4LCAwLCBNYXRoLlBJICogMik7IGMuc3Ryb2tlKCk7CiAgICAgIGMuZmlsbFN0eWxlID0gIiNmZjQwMjAiOwogICAgICBjLmZvbnQgPSAiYm9sZCAyOHB4IEltcGFjdCxzYW5zLXNlcmlmIjsKICAgICAgYy50ZXh0QWxpZ24gPSAiY2VudGVyIjsKICAgICAgYy5maWxsVGV4dCgiISIsIDQ4LCA1OCk7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT09ICJyYWluYm93IikgewogICAgICB2YXIgZyA9IGMuY3JlYXRlTGluZWFyR3JhZGllbnQoMTAsIDEwLCA4NiwgODYpOwogICAgICBnLmFkZENvbG9yU3RvcCgwLCAiI2ZmNjA2MCIpOyBnLmFkZENvbG9yU3RvcCgwLjIsICIjZmZjMDQwIik7CiAgICAgIGcuYWRkQ29sb3JTdG9wKDAuNCwgIiM4MGZmNjAiKTsgZy5hZGRDb2xvclN0b3AoMC42LCAiIzYwYzBmZiIpOwogICAgICBnLmFkZENvbG9yU3RvcCgwLjgsICIjYzA2MGZmIik7IGcuYWRkQ29sb3JTdG9wKDEsICIjZmY2MGMwIik7CiAgICAgIGMuc3Ryb2tlU3R5bGUgPSBnOwogICAgICBjLmxpbmVXaWR0aCA9IDg7CiAgICAgIHJvdW5kUmVjdChjLCAxMCwgMTAsIDc2LCA3NiwgMTYpOwogICAgICBjLnN0cm9rZSgpOwogICAgICBjLmZpbGxTdHlsZSA9ICJyZ2JhKDI1NSwyNTUsMjU1LDAuNSkiOwogICAgICBjLmJlZ2luUGF0aCgpOyBjLmFyYyg0OCwgNDgsIDEyLCAwLCBNYXRoLlBJICogMik7IGMuZmlsbCgpOwogICAgfQogICAgcmV0dXJuIGN2OwogIH0KCiAgZnVuY3Rpb24gbWFrZU9ic3RhY2xlU3ByaXRlKGtpbmQpIHsKICAgIHZhciBzID0gOTY7CiAgICB2YXIgY3YgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgIGN2LndpZHRoID0gczsgY3YuaGVpZ2h0ID0gczsKICAgIHZhciBjID0gY3YuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGlmIChraW5kID09PSAiYm94IiB8fCBraW5kID09PSAiYm94MiIpIHsKICAgICAgYy5maWxsU3R5bGUgPSBraW5kID09PSAiYm94MiIgPyAiI2M4OTA1MCIgOiAiI2UwYTg2OCI7CiAgICAgIHJvdW5kUmVjdChjLCAxMCwgMTQsIDc2LCA2OCwgNik7CiAgICAgIGMuZmlsbCgpOwogICAgICBjLnN0cm9rZVN0eWxlID0gIiM2YTQwMjAiOwogICAgICBjLmxpbmVXaWR0aCA9IDM7CiAgICAgIHJvdW5kUmVjdChjLCAxMCwgMTQsIDc2LCA2OCwgNik7CiAgICAgIGMuc3Ryb2tlKCk7CiAgICAgIGMuYmVnaW5QYXRoKCk7CiAgICAgIGMubW92ZVRvKDEwLCA0MCk7IGMubGluZVRvKDg2LCA0MCk7CiAgICAgIGMubW92ZVRvKDQ4LCAxNCk7IGMubGluZVRvKDQ4LCA4Mik7CiAgICAgIGMuc3Ryb2tlKCk7CiAgICAgIGlmIChraW5kID09PSAiYm94MiIpIHsKICAgICAgICBjLmZpbGxTdHlsZSA9ICIjOGE1MDIwIjsKICAgICAgICBjLmZvbnQgPSAiYm9sZCAyMnB4IHNhbnMtc2VyaWYiOwogICAgICAgIGMudGV4dEFsaWduID0gImNlbnRlciI7CiAgICAgICAgYy5maWxsVGV4dCgiMiIsIDQ4LCA1OCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gInlhcm4iKSB7CiAgICAgIGMuZmlsbFN0eWxlID0gIiNlMDYwOTAiOwogICAgICBjLmJlZ2luUGF0aCgpOyBjLmFyYyg0OCwgNTAsIDMwLCAwLCBNYXRoLlBJICogMik7IGMuZmlsbCgpOwogICAgICBjLnN0cm9rZVN0eWxlID0gIiNhMDMwNjAiOwogICAgICBjLmxpbmVXaWR0aCA9IDM7CiAgICAgIGMuc3Ryb2tlKCk7CiAgICAgIGMuYmVnaW5QYXRoKCk7CiAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgNjsgYSsrKSB7CiAgICAgICAgYy5tb3ZlVG8oNDgsIDUwKTsKICAgICAgICBjLmFyYyg0OCwgNTAsIDI4LCBhICogMS4xLCBhICogMS4xICsgMC44KTsKICAgICAgfQogICAgICBjLnN0cm9rZSgpOwogICAgICBjLnN0cm9rZVN0eWxlID0gIiNlMDYwOTAiOwogICAgICBjLmJlZ2luUGF0aCgpOwogICAgICBjLm1vdmVUbyg3MCwgMzApOyBjLnF1YWRyYXRpY0N1cnZlVG8oODUsIDEwLCA3OCwgNSk7CiAgICAgIGMuc3Ryb2tlKCk7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT09ICJjYXJyaWVyIikgewogICAgICBjLmZpbGxTdHlsZSA9ICIjNzBiMGQwIjsKICAgICAgcm91bmRSZWN0KGMsIDEyLCAyMCwgNzIsIDU2LCAxMCk7CiAgICAgIGMuZmlsbCgpOwogICAgICBjLnN0cm9rZVN0eWxlID0gIiMzMDYwODAiOwogICAgICBjLmxpbmVXaWR0aCA9IDM7CiAgICAgIHJvdW5kUmVjdChjLCAxMiwgMjAsIDcyLCA1NiwgMTApOwogICAgICBjLnN0cm9rZSgpOwogICAgICBjLmZpbGxTdHlsZSA9ICJyZ2JhKDI1NSwyNTUsMjU1LDAuNSkiOwogICAgICByb3VuZFJlY3QoYywgMjIsIDMwLCA1MiwgMzAsIDYpOwogICAgICBjLmZpbGwoKTsKICAgICAgYy5maWxsU3R5bGUgPSAiI2U4ODgzYSI7CiAgICAgIGMuYmVnaW5QYXRoKCk7IGMuYXJjKDQ4LCA0NiwgMTIsIDAsIE1hdGguUEkgKiAyKTsgYy5maWxsKCk7CiAgICAgIGMuZmlsbFN0eWxlID0gIiMyYTFhMTAiOwogICAgICBjLmJlZ2luUGF0aCgpOyBjLmFyYyg0MywgNDQsIDIsIDAsIE1hdGguUEkgKiAyKTsgYy5maWxsKCk7CiAgICAgIGMuYmVnaW5QYXRoKCk7IGMuYXJjKDUzLCA0NCwgMiwgMCwgTWF0aC5QSSAqIDIpOyBjLmZpbGwoKTsKICAgICAgYy5maWxsU3R5bGUgPSAiIzMwNjA4MCI7CiAgICAgIGMuZmlsbFJlY3QoNDAsIDEyLCAxNiwgMTIpOwogICAgICByb3VuZFJlY3QoYywgMzYsIDgsIDI0LCA4LCAzKTsgYy5maWxsKCk7CiAgICB9CiAgICByZXR1cm4gY3Y7CiAgfQoKICBmdW5jdGlvbiBidWlsZEJnKCkgewogICAgaWYgKCFXIHx8ICFIKSByZXR1cm47CiAgICBiZ0NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgYmdDYW52YXMud2lkdGggPSBXOyBiZ0NhbnZhcy5oZWlnaHQgPSBIOwogICAgdmFyIGIgPSBiZ0NhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgdmFyIGdyYWQgPSBiLmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIDAsIEgpOwogICAgZ3JhZC5hZGRDb2xvclN0b3AoMCwgIiM2YTlmYzgiKTsKICAgIGdyYWQuYWRkQ29sb3JTdG9wKDAuNDIsICIjYjhkOGVjIik7CiAgICBncmFkLmFkZENvbG9yU3RvcCgwLjQyLCAiI2M0YTA2YSIpOwogICAgZ3JhZC5hZGRDb2xvclN0b3AoMSwgIiM4YTY4NDAiKTsKICAgIGIuZmlsbFN0eWxlID0gZ3JhZDsKICAgIGIuZmlsbFJlY3QoMCwgMCwgVywgSCk7CiAgICAvLyBzb2Z0IHZpZ25ldHRlIHNvIGJvYXJkIHJlYWRzIGNsZWFybHkgd2l0aG91dCBsYXJnZSBlbXB0eSBwcm9wcwogICAgdmFyIHZnID0gYi5jcmVhdGVSYWRpYWxHcmFkaWVudChXICogMC41LCBIICogMC40OCwgTWF0aC5taW4oVywgSCkgKiAwLjE1LCBXICogMC41LCBIICogMC41LCBNYXRoLm1heChXLCBIKSAqIDAuNzIpOwogICAgdmcuYWRkQ29sb3JTdG9wKDAsICJyZ2JhKDI1NSwyNDAsMjEwLDAuMDgpIik7CiAgICB2Zy5hZGRDb2xvclN0b3AoMC41NSwgInJnYmEoNDAsMjUsMTUsMC4wNSkiKTsKICAgIHZnLmFkZENvbG9yU3RvcCgxLCAicmdiYSgyMCwxMiw4LDAuMzUpIik7CiAgICBiLmZpbGxTdHlsZSA9IHZnOwogICAgYi5maWxsUmVjdCgwLCAwLCBXLCBIKTsKICAgIC8vIHRpbnkgY29ybmVyIGFjY2VudHMgb25seSAobm8gYmlnIHdhc3RlZCBzb2ZhL3dpbmRvdyBlYXRpbmcgYm9hcmQgc3BhY2UpCiAgICBiLmdsb2JhbEFscGhhID0gMC4zNTsKICAgIGIuZmlsbFN0eWxlID0gIiM1YTkwNDgiOwogICAgYi5iZWdpblBhdGgoKTsgYi5lbGxpcHNlKE1hdGgubWF4KDI0LCBXICogMC4wNSksIEggKiAwLjc4LCAxOCwgMzIsIDAsIDAsIE1hdGguUEkgKiAyKTsgYi5maWxsKCk7CiAgICBiLmZpbGxTdHlsZSA9ICIjYzg2ODU4IjsKICAgIHJvdW5kUmVjdChiLCBXIC0gTWF0aC5tYXgoOTAsIFcgKiAwLjE0KSwgSCAqIDAuNjIsIE1hdGgubWF4KDcwLCBXICogMC4xMSksIE1hdGgubWF4KDM2LCBIICogMC4xMiksIDEyKTsKICAgIGIuZmlsbCgpOwogICAgYi5nbG9iYWxBbHBoYSA9IDE7CiAgfQoKICBmdW5jdGlvbiBsb2FkQm9hcmRHcmlkKCkgewogICAgYm9hcmRHcmlkSW1nID0gbmV3IEltYWdlKCk7CiAgICBib2FyZEdyaWRJbWcub25sb2FkID0gZnVuY3Rpb24gKCkgeyBib2FyZEdyaWRSZWFkeSA9IHRydWU7IH07CiAgICBib2FyZEdyaWRJbWcub25lcnJvciA9IGZ1bmN0aW9uICgpIHsgYm9hcmRHcmlkUmVhZHkgPSBmYWxzZTsgfTsKICAgIHZhciBncmlkVXJsID0gImh0dHBzOi8vY2F0dmVudHVyZXMubG9sL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzEwL2NtX2JvYXJkX2dyaWQucG5nIjsKICAgIGlmIChncmlkVXJsLmluZGV4T2YoIlBMQUNFSE9MREVSIikgPj0gMCB8fCAhZ3JpZFVybCkgewogICAgICBncmlkVXJsID0gImFzc2V0cy9jbV9ib2FyZF9ncmlkLnBuZyI7CiAgICB9CiAgICBib2FyZEdyaWRJbWcuc3JjID0gZ3JpZFVybDsKICB9CgogIGZ1bmN0aW9uIGRyYXdCb2FyZEdyaWRCZygpIHsKICAgIHZhciBidyA9IEdSSUQgKiBjZWxsICsgYm9hcmRQYWQgKiAyOwogICAgdmFyIGJoID0gR1JJRCAqIGNlbGwgKyBib2FyZFBhZCAqIDI7CiAgICB2YXIgYnggPSBib2FyZFggLSBib2FyZFBhZDsKICAgIHZhciBieSA9IGJvYXJkWSAtIGJvYXJkUGFkOwogICAgaWYgKGJvYXJkR3JpZFJlYWR5ICYmIGJvYXJkR3JpZEltZykgewogICAgICAvLyBQTkc6IDIwcHggZnJhbWUgYXJvdW5kIDc2OHB4ICg4Kjk2KSBzbG90IGZpZWxkCiAgICAgIHZhciBzcmMgPSBib2FyZEdyaWRJbWcubmF0dXJhbFdpZHRoIHx8IDgwODsKICAgICAgdmFyIGZyID0gTWF0aC5yb3VuZChzcmMgKiAoMjAgLyA4MDgpKTsKICAgICAgdmFyIGlubmVyID0gc3JjIC0gZnIgKiAyOwogICAgICBjdHguZHJhd0ltYWdlKGJvYXJkR3JpZEltZywgMCwgMCwgc3JjLCBzcmMsIGJ4LCBieSwgYncsIGJoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gcHJvY2VkdXJhbCBmYWxsYmFjayBzbG90cwogICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDYwLDQwLDI1LDAuOTIpIjsKICAgIHJvdW5kUmVjdChjdHgsIGJ4LCBieSwgYncsIGJoLCBNYXRoLm1heCgxMCwgY2VsbCAqIDAuMjgpKTsKICAgIGN0eC5maWxsKCk7CiAgICBjdHguZmlsbFN0eWxlID0gIiNmM2UyYzAiOwogICAgcm91bmRSZWN0KGN0eCwgYm9hcmRYIC0gMiwgYm9hcmRZIC0gMiwgR1JJRCAqIGNlbGwgKyA0LCBHUklEICogY2VsbCArIDQsIE1hdGgubWF4KDgsIGNlbGwgKiAwLjIpKTsKICAgIGN0eC5maWxsKCk7CiAgICB2YXIgaW5zZXQgPSBNYXRoLm1heCgyLCBNYXRoLmZsb29yKGNlbGwgKiAwLjA4KSk7CiAgICB2YXIgcnIgPSBNYXRoLm1heCg2LCBNYXRoLmZsb29yKGNlbGwgKiAwLjIyKSk7CiAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykgewogICAgICBmb3IgKHZhciBjID0gMDsgYyA8IEdSSUQ7IGMrKykgewogICAgICAgIHZhciB4ID0gYm9hcmRYICsgYyAqIGNlbGw7CiAgICAgICAgdmFyIHkgPSBib2FyZFkgKyByICogY2VsbDsKICAgICAgICBjdHguZmlsbFN0eWxlID0gKChyICsgYykgJSAyID09PSAwKSA\/ICIjZWZlMGMwIiA6ICIjZTBkMGE4IjsKICAgICAgICBjdHguZmlsbFJlY3QoeCwgeSwgY2VsbCwgY2VsbCk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICgociArIGMpICUgMiA9PT0gMCkgPyAiI2UyZDBhMCIgOiAiI2Q0YzA5MCI7CiAgICAgICAgcm91bmRSZWN0KGN0eCwgeCArIGluc2V0LCB5ICsgaW5zZXQsIGNlbGwgLSBpbnNldCAqIDIsIGNlbGwgLSBpbnNldCAqIDIsIHJyKTsKICAgICAgICBjdHguZmlsbCgpOwogICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICJyZ2JhKDEyMCw4MCw0MCwwLjQ1KSI7CiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IE1hdGgubWF4KDEsIGNlbGwgKiAwLjA0KTsKICAgICAgICByb3VuZFJlY3QoY3R4LCB4ICsgaW5zZXQsIHkgKyBpbnNldCwgY2VsbCAtIGluc2V0ICogMiwgY2VsbCAtIGluc2V0ICogMiwgcnIpOwogICAgICAgIGN0eC5zdHJva2UoKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gbGF5b3V0UGxheWZpZWxkKCkgewogICAgdmFyIG1hcmdpbiA9IE1hdGgubWF4KDQsIE1hdGguZmxvb3IoTWF0aC5taW4oVywgSCkgKiAwLjAxKSk7CiAgICB2YXIgdGlwID0gTWF0aC5tYXgoNTYsIE1hdGgubWluKDg4LCBNYXRoLmZsb29yKE1hdGgubWluKFcsIEgpICogMC4xMSkpKTsKICAgIHZhciBsYW5kc2NhcGUgPSBXID49IEg7CiAgICB2YXIgYm9hcmRTaXplOwogICAgaWYgKGxhbmRzY2FwZSkgewogICAgICBodWRNb2RlID0gInNpZGUiOwogICAgICB2YXIgYXZhaWxIID0gSCAtIE1hdGgubWF4KDQsIG1hcmdpbik7CiAgICAgIHZhciBoaW50VyA9IE1hdGgubWF4KDY0LCB0aXApOwogICAgICB2YXIgZ2FwID0gNjsKICAgICAgdmFyIG1pbkh1ZCA9IE1hdGgubWF4KDEyMCwgTWF0aC5mbG9vcihXICogMC4xOCkpOwogICAgICBjZWxsID0gTWF0aC5tYXgoMjYsIE1hdGguZmxvb3IoYXZhaWxIIC8gR1JJRCkpOwogICAgICBib2FyZFNpemUgPSBHUklEICogY2VsbDsKICAgICAgYm9hcmRQYWQgPSBNYXRoLm1heCg2LCBNYXRoLnJvdW5kKGNlbGwgKiAyMCAvIDk2KSk7CiAgICAgIHZhciBtYXhCb2FyZCA9IFcgLSBtYXJnaW4gKiAyIC0gbWluSHVkIC0gZ2FwIC0gaGludFc7CiAgICAgIGlmIChib2FyZFNpemUgPiBtYXhCb2FyZCkgewogICAgICAgIGNlbGwgPSBNYXRoLm1heCgyNiwgTWF0aC5mbG9vcihtYXhCb2FyZCAvIEdSSUQpKTsKICAgICAgICBib2FyZFNpemUgPSBHUklEICogY2VsbDsKICAgICAgICBib2FyZFBhZCA9IE1hdGgubWF4KDYsIE1hdGgucm91bmQoY2VsbCAqIDIwIC8gOTYpKTsKICAgICAgfQogICAgICBib2FyZFkgPSBNYXRoLmZsb29yKChIIC0gYm9hcmRTaXplKSAvIDIpOwogICAgICAvLyBQYWNrIGJvYXJkK2hpbnQgdG8gdGhlIHJpZ2h0OyBIVUQgZXhwYW5kcyBpbnRvIGxlZnRvdmVyIGxlZnQKICAgICAgYm9hcmRYID0gVyAtIG1hcmdpbiAtIGhpbnRXIC0gZ2FwIC0gYm9hcmRTaXplOwogICAgICBpZiAoYm9hcmRYIDwgbWFyZ2luICsgbWluSHVkKSBib2FyZFggPSBtYXJnaW4gKyBtaW5IdWQ7CiAgICAgIGhpbnRBbmNob3IgPSB7CiAgICAgICAgeDogYm9hcmRYICsgYm9hcmRTaXplICsgZ2FwLAogICAgICAgIHk6IGJvYXJkWSArIGJvYXJkU2l6ZSAtIHRpcCwKICAgICAgICB3OiBoaW50VywKICAgICAgICBoOiB0aXAKICAgICAgfTsKICAgICAgaWYgKGhpbnRBbmNob3IueCArIGhpbnRBbmNob3IudyA+IFcgLSBtYXJnaW4pIHsKICAgICAgICBoaW50QW5jaG9yLnggPSBXIC0gbWFyZ2luIC0gaGludEFuY2hvci53OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBodWRNb2RlID0gInRvcCI7CiAgICAgIHZhciB0b3BCYXIgPSBNYXRoLm1heCg1MCwgTWF0aC5taW4oNzIsIE1hdGguZmxvb3IoSCAqIDAuMDc1KSkpOwogICAgICAvLyBCb2FyZCB1c2VzIGZ1bGwgd2lkdGg7IGxlZnRvdmVyIGhlaWdodCBiZWNvbWVzIGJvdHRvbSBIVUQgdW5kZXIgYm9hcmQraGludAogICAgICB2YXIgaGludFJvdyA9IHRpcCArIDg7CiAgICAgIHZhciBtaW5Cb3R0b20gPSBNYXRoLm1heCg3MiwgTWF0aC5mbG9vcihIICogMC4xMikpOwogICAgICB2YXIgYXZhaWxXID0gVyAtIG1hcmdpbiAqIDI7CiAgICAgIHZhciBhdmFpbEhwID0gSCAtIHRvcEJhciAtIGhpbnRSb3cgLSBtaW5Cb3R0b20gLSBtYXJnaW47CiAgICAgIGNlbGwgPSBNYXRoLm1heCgyNiwgTWF0aC5mbG9vcihNYXRoLm1pbihhdmFpbFcsIE1hdGgubWF4KGF2YWlsSHAsIGF2YWlsVykpIC8gR1JJRCkpOwogICAgICAvLyBQcmVmZXIgd2lkdGgtbGltaXRlZCBib2FyZCAodGFsbCBwaG9uZXMpOiB1c2UgZnVsbCB3aWR0aAogICAgICBjZWxsID0gTWF0aC5tYXgoMjYsIE1hdGguZmxvb3IoYXZhaWxXIC8gR1JJRCkpOwogICAgICBib2FyZFNpemUgPSBHUklEICogY2VsbDsKICAgICAgLy8gSWYgYm9hcmQgKyBjaHJvbWUgZXhjZWVkcyBoZWlnaHQsIHNocmluawogICAgICB3aGlsZSAodG9wQmFyICsgYm9hcmRTaXplICsgaGludFJvdyArIG1pbkJvdHRvbSArIG1hcmdpbiA+IEggJiYgY2VsbCA+IDI2KSB7CiAgICAgICAgY2VsbCAtPSAxOwogICAgICAgIGJvYXJkU2l6ZSA9IEdSSUQgKiBjZWxsOwogICAgICB9CiAgICAgIGJvYXJkUGFkID0gTWF0aC5tYXgoNiwgTWF0aC5yb3VuZChjZWxsICogMjAgLyA5NikpOwogICAgICBib2FyZFggPSBNYXRoLmZsb29yKChXIC0gYm9hcmRTaXplKSAvIDIpOwogICAgICBib2FyZFkgPSB0b3BCYXIgKyA0OwogICAgICBoaW50QW5jaG9yID0gewogICAgICAgIHg6IGJvYXJkWCArIGJvYXJkU2l6ZSAtIE1hdGgubWF4KDc2LCB0aXApLAogICAgICAgIHk6IGJvYXJkWSArIGJvYXJkU2l6ZSArIDQsCiAgICAgICAgdzogTWF0aC5tYXgoNzYsIHRpcCksCiAgICAgICAgaDogdGlwCiAgICAgIH07CiAgICAgIGlmIChoaW50QW5jaG9yLnggPCBib2FyZFgpIGhpbnRBbmNob3IueCA9IGJvYXJkWDsKICAgICAgaWYgKGhpbnRBbmNob3IueCArIGhpbnRBbmNob3IudyA+IFcgLSA0KSBoaW50QW5jaG9yLnggPSBXIC0gNCAtIGhpbnRBbmNob3IudzsKICAgICAgaWYgKGhpbnRBbmNob3IueSArIGhpbnRBbmNob3IuaCA+IEggLSBtaW5Cb3R0b20pIHsKICAgICAgICBoaW50QW5jaG9yLnkgPSBNYXRoLm1heChib2FyZFkgKyBib2FyZFNpemUgLSB0aXAsIEggLSBtaW5Cb3R0b20gLSB0aXApOwogICAgICB9CiAgICB9CiAgICB2YXIga2V5ID0gVyArICJ4IiArIEggKyAiOiIgKyBjZWxsICsgIjoiICsgYm9hcmRYICsgIiwiICsgYm9hcmRZOwogICAgaWYgKGtleSAhPT0gbGFzdExheW91dEtleSkgewogICAgICBsYXN0TGF5b3V0S2V5ID0ga2V5OwogICAgICBidWlsZEJnKCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBidWlsZFNwcml0ZXNGcm9tQXRsYXMoKSB7CiAgICBzcHJpdGVzID0gW107CiAgICBmb3IgKHZhciB0ID0gMDsgdCA8IFRZUEVTOyB0KyspIHsKICAgICAgc3ByaXRlcy5wdXNoKHsKICAgICAgICBoYXBweTogc2xpY2VBdGxhc1RpbGUodCwgImhhcHB5IiksCiAgICAgICAgd2luazogc2xpY2VBdGxhc1RpbGUodCwgIndpbmsiKSwKICAgICAgICBqb3lmdWw6IHNsaWNlQXRsYXNUaWxlKHQsICJqb3lmdWwiKSwKICAgICAgICBzdXJwcmlzZTogc2xpY2VBdGxhc1RpbGUodCwgInN1cnByaXNlIiksCiAgICAgICAgYW5ncnk6IHNsaWNlQXRsYXNUaWxlKHQsICJhbmdyeSIpLAogICAgICAgIG5vcm1hbDogbnVsbAogICAgICB9KTsKICAgICAgc3ByaXRlc1t0XS5ub3JtYWwgPSBzcHJpdGVzW3RdLmhhcHB5OwogICAgfQogICAgc3BlY2lhbFNwcml0ZXMuc3RyaXBlZF9oID0gbWFrZVNwZWNpYWxPdmVybGF5KCJzdHJpcGVkX2giKTsKICAgIHNwZWNpYWxTcHJpdGVzLnN0cmlwZWRfdiA9IG1ha2VTcGVjaWFsT3ZlcmxheSgic3RyaXBlZF92Iik7CiAgICBzcGVjaWFsU3ByaXRlcy5ib21iID0gbWFrZVNwZWNpYWxPdmVybGF5KCJib21iIik7CiAgICBzcGVjaWFsU3ByaXRlcy5yYWluYm93ID0gbWFrZVNwZWNpYWxPdmVybGF5KCJyYWluYm93Iik7CiAgICBvYnN0YWNsZVNwcml0ZXMuYm94ID0gbWFrZU9ic3RhY2xlU3ByaXRlKCJib3giKTsKICAgIG9ic3RhY2xlU3ByaXRlcy5ib3gyID0gbWFrZU9ic3RhY2xlU3ByaXRlKCJib3gyIik7CiAgICBvYnN0YWNsZVNwcml0ZXMueWFybiA9IG1ha2VPYnN0YWNsZVNwcml0ZSgieWFybiIpOwogICAgb2JzdGFjbGVTcHJpdGVzLmNhcnJpZXIgPSBtYWtlT2JzdGFjbGVTcHJpdGUoImNhcnJpZXIiKTsKICAgIGJ1aWxkQmcoKTsKICAgIGxvYWRCb2FyZEdyaWQoKTsKICAgIHNwcml0ZXNSZWFkeSA9IHRydWU7CiAgICBpZiAoc3RhcnRCdG4pIHsKICAgICAgc3RhcnRCdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgc3RhcnRCdG4udGV4dENvbnRlbnQgPSAiUGxheSI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBsb2FkQXRsYXMoKSB7CiAgICBhdGxhc0ltZyA9IG5ldyBJbWFnZSgpOwogICAgYXRsYXNJbWcub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICBBVExBU19UVyA9IE1hdGguZmxvb3IoYXRsYXNJbWcubmF0dXJhbFdpZHRoIC8gNikgfHwgOTY7CiAgICAgIEFUTEFTX1RIID0gTWF0aC5mbG9vcihhdGxhc0ltZy5uYXR1cmFsSGVpZ2h0IC8gNSkgfHwgOTY7CiAgICAgIGF0bGFzUmVhZHkgPSB0cnVlOwogICAgICBidWlsZFNwcml0ZXNGcm9tQXRsYXMoKTsKICAgIH07CiAgICBhdGxhc0ltZy5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICBhdGxhc1JlYWR5ID0gZmFsc2U7CiAgICAgIHNwcml0ZXMgPSBbXTsKICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBUWVBFUzsgdCsrKSB7CiAgICAgICAgdmFyIGN2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgICAgICAgY3Yud2lkdGggPSA5NjsgY3YuaGVpZ2h0ID0gOTY7CiAgICAgICAgdmFyIGMgPSBjdi5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgIHZhciBjb2xzID0gWyIjZmZjMDc4IiwgIiM1YTVhNjgiLCAiI2ZmZjhmMCIsICIjYzhjOGQ0IiwgIiNmZmU4YjgiLCAiIzRhNGE1OCJdOwogICAgICAgIGMuZmlsbFN0eWxlID0gY29sc1t0XTsKICAgICAgICByb3VuZFJlY3QoYywgNCwgNCwgODgsIDg4LCAxOCk7IGMuZmlsbCgpOwogICAgICAgIHNwcml0ZXMucHVzaCh7aGFwcHk6IGN2LCB3aW5rOiBjdiwgam95ZnVsOiBjdiwgc3VycHJpc2U6IGN2LCBhbmdyeTogY3YsIG5vcm1hbDogY3Z9KTsKICAgICAgfQogICAgICBzcGVjaWFsU3ByaXRlcy5zdHJpcGVkX2ggPSBtYWtlU3BlY2lhbE92ZXJsYXkoInN0cmlwZWRfaCIpOwogICAgICBzcGVjaWFsU3ByaXRlcy5zdHJpcGVkX3YgPSBtYWtlU3BlY2lhbE92ZXJsYXkoInN0cmlwZWRfdiIpOwogICAgICBzcGVjaWFsU3ByaXRlcy5ib21iID0gbWFrZVNwZWNpYWxPdmVybGF5KCJib21iIik7CiAgICAgIHNwZWNpYWxTcHJpdGVzLnJhaW5ib3cgPSBtYWtlU3BlY2lhbE92ZXJsYXkoInJhaW5ib3ciKTsKICAgICAgb2JzdGFjbGVTcHJpdGVzLmJveCA9IG1ha2VPYnN0YWNsZVNwcml0ZSgiYm94Iik7CiAgICAgIG9ic3RhY2xlU3ByaXRlcy5ib3gyID0gbWFrZU9ic3RhY2xlU3ByaXRlKCJib3gyIik7CiAgICAgIG9ic3RhY2xlU3ByaXRlcy55YXJuID0gbWFrZU9ic3RhY2xlU3ByaXRlKCJ5YXJuIik7CiAgICAgIG9ic3RhY2xlU3ByaXRlcy5jYXJyaWVyID0gbWFrZU9ic3RhY2xlU3ByaXRlKCJjYXJyaWVyIik7CiAgICAgIGJ1aWxkQmcoKTsKICAgICAgbG9hZEJvYXJkR3JpZCgpOwogICAgICBzcHJpdGVzUmVhZHkgPSB0cnVlOwogICAgICBpZiAoc3RhcnRCdG4pIHsgc3RhcnRCdG4uZGlzYWJsZWQgPSBmYWxzZTsgc3RhcnRCdG4udGV4dENvbnRlbnQgPSAiUGxheSI7IH0KICAgIH07CiAgICBhdGxhc0ltZy5zcmMgPSBBVExBU19VUkw7CiAgfQoKICAvKiA9PT09PSBCT0FSRCBIRUxQRVJTID09PT09ICovCiAgZnVuY3Rpb24gZW1wdHlUaWxlKCkgewogICAgcmV0dXJuIHt0eXBlOiAtMSwgc3BlY2lhbDogbnVsbCwgb2JzdGFjbGU6IG51bGwsIGhwOiAwLCBmYWxsOiAwLCBzY2FsZTogMSwgc2hha2U6IDAsIHBvcDogMCwgZ2xvdzogMCwgd2lua1VudGlsOiAwLCBuZXh0V2luazogMH07CiAgfQoKICBmdW5jdGlvbiByYW5kVHlwZSgpIHsKICAgIHJldHVybiAoTWF0aC5yYW5kb20oKSAqIFRZUEVTKSB8IDA7CiAgfQoKICBmdW5jdGlvbiBuZXdDYXQoYXZvaWQxLCBhdm9pZDIpIHsKICAgIHZhciB0LCBndWFyZCA9IDA7CiAgICBkbyB7CiAgICAgIHQgPSByYW5kVHlwZSgpOwogICAgICBndWFyZCsrOwogICAgfSB3aGlsZSAoZ3VhcmQgPCAyMCAmJiAoKGF2b2lkMSAhPT0gdW5kZWZpbmVkICYmIHQgPT09IGF2b2lkMSkgfHwgKGF2b2lkMiAhPT0gdW5kZWZpbmVkICYmIHQgPT09IGF2b2lkMikpKTsKICAgIHZhciB0aWxlID0gZW1wdHlUaWxlKCk7CiAgICB0aWxlLnR5cGUgPSB0OwogICAgdGlsZS5uZXh0V2luayA9IHBlcmZvcm1hbmNlLm5vdygpIC8gMTAwMCArIDEuNSArIE1hdGgucmFuZG9tKCkgKiA1OwogICAgcmV0dXJuIHRpbGU7CiAgfQoKICBmdW5jdGlvbiBpbkJvdW5kcyhyLCBjKSB7CiAgICByZXR1cm4gciA+PSAwICYmIHIgPCBHUklEICYmIGMgPj0gMCAmJiBjIDwgR1JJRDsKICB9CgogIGZ1bmN0aW9uIGNsb25lR3JpZChnKSB7CiAgICB2YXIgb3V0ID0gW107CiAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykgewogICAgICBvdXRbcl0gPSBbXTsKICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBHUklEOyBjKyspIHsKICAgICAgICB2YXIgdCA9IGdbcl1bY107CiAgICAgICAgb3V0W3JdW2NdID0gewogICAgICAgICAgdHlwZTogdC50eXBlLCBzcGVjaWFsOiB0LnNwZWNpYWwsIG9ic3RhY2xlOiB0Lm9ic3RhY2xlLCBocDogdC5ocCwKICAgICAgICAgIGZhbGw6IDAsIHNjYWxlOiAxLCBzaGFrZTogMCwgcG9wOiAwLCBnbG93OiB0Lmdsb3cgfHwgMCwKICAgICAgICAgIHdpbmtVbnRpbDogdC53aW5rVW50aWwgfHwgMCwgbmV4dFdpbms6IHQubmV4dFdpbmsgfHwgMAogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBvdXQ7CiAgfQoKICBmdW5jdGlvbiBhcHBseUxheW91dChsYXlvdXQpIHsKICAgIHZhciBwb3NpdGlvbnMgPSBbXTsKICAgIGZ1bmN0aW9uIGFkZFJpbmcoa2luZCwgaHAsIGNvdW50KSB7CiAgICAgIHZhciBzcG90cyA9IFtdOwogICAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykKICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IEdSSUQ7IGMrKykKICAgICAgICAgIGlmICgociArIGMpICUgMiA9PT0gMCkgc3BvdHMucHVzaChbciwgY10pOwogICAgICBzaHVmZmxlKHNwb3RzKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudCAmJiBpIDwgc3BvdHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgcnIgPSBzcG90c1tpXVswXSwgY2MgPSBzcG90c1tpXVsxXTsKICAgICAgICBncmlkW3JyXVtjY10ub2JzdGFjbGUgPSBraW5kOwogICAgICAgIGdyaWRbcnJdW2NjXS5ocCA9IGhwOwogICAgICAgIGdyaWRbcnJdW2NjXS50eXBlID0gLTE7CiAgICAgICAgZ3JpZFtycl1bY2NdLnNwZWNpYWwgPSBudWxsOwogICAgICB9CiAgICB9CiAgICBpZiAobGF5b3V0ID09PSAiYm94ZXMxIikgYWRkUmluZygiYm94IiwgMSwgOCk7CiAgICBlbHNlIGlmIChsYXlvdXQgPT09ICJib3hlczIiKSB7CiAgICAgIGFkZFJpbmcoImJveDIiLCAyLCA2KTsgYWRkUmluZygiYm94IiwgMSwgNik7CiAgICB9IGVsc2UgaWYgKGxheW91dCA9PT0gImJveGVzMyIpIGFkZFJpbmcoImJveCIsIDEsIDEwKTsKICAgIGVsc2UgaWYgKGxheW91dCA9PT0gImJveGVzNCIpIHsKICAgICAgYWRkUmluZygiYm94MiIsIDIsIDgpOyBhZGRSaW5nKCJib3giLCAxLCA2KTsKICAgIH0gZWxzZSBpZiAobGF5b3V0ID09PSAiYm94ZXM1IikgewogICAgICBhZGRSaW5nKCJib3gyIiwgMiwgMTApOyBhZGRSaW5nKCJib3giLCAxLCA2KTsKICAgIH0gZWxzZSBpZiAobGF5b3V0ID09PSAia2l0czEiKSBhZGRSaW5nKCJjYXJyaWVyIiwgMSwgMyk7CiAgICBlbHNlIGlmIChsYXlvdXQgPT09ICJraXRzMiIpIHsKICAgICAgYWRkUmluZygiY2FycmllciIsIDEsIDQpOyBhZGRSaW5nKCJib3giLCAxLCA2KTsKICAgIH0gZWxzZSBpZiAobGF5b3V0ID09PSAia2l0czMiKSBhZGRSaW5nKCJjYXJyaWVyIiwgMSwgNSk7CiAgICBlbHNlIGlmIChsYXlvdXQgPT09ICJ5YXJuMSIpIGFkZFJpbmcoInlhcm4iLCAxLCA4KTsKICAgIGVsc2UgaWYgKGxheW91dCA9PT0gInlhcm4yIikgYWRkUmluZygieWFybiIsIDEsIDEwKTsKICAgIGVsc2UgaWYgKGxheW91dCA9PT0gInlhcm4zIikgYWRkUmluZygieWFybiIsIDEsIDEyKTsKICAgIGVsc2UgaWYgKGxheW91dCA9PT0gIm1peDEiKSB7CiAgICAgIGFkZFJpbmcoImNhcnJpZXIiLCAxLCAzKTsgYWRkUmluZygieWFybiIsIDEsIDYpOwogICAgfSBlbHNlIGlmIChsYXlvdXQgPT09ICJtaXgyIikgewogICAgICBhZGRSaW5nKCJjYXJyaWVyIiwgMSwgMyk7IGFkZFJpbmcoImJveCIsIDEsIDEwKTsKICAgIH0gZWxzZSBpZiAobGF5b3V0ID09PSAibWl4MyIpIGFkZFJpbmcoImJveCIsIDEsIDgpOwogICAgZWxzZSBpZiAobGF5b3V0ID09PSAibWl4NCIpIHsKICAgICAgYWRkUmluZygiY2FycmllciIsIDEsIDMpOyBhZGRSaW5nKCJ5YXJuIiwgMSwgOCk7IGFkZFJpbmcoImJveCIsIDEsIDEyKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNodWZmbGUoYSkgewogICAgZm9yICh2YXIgaSA9IGEubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkgewogICAgICB2YXIgaiA9IChNYXRoLnJhbmRvbSgpICogKGkgKyAxKSkgfCAwOwogICAgICB2YXIgdG1wID0gYVtpXTsgYVtpXSA9IGFbal07IGFbal0gPSB0bXA7CiAgICB9CiAgICByZXR1cm4gYTsKICB9CgogIGZ1bmN0aW9uIGZpbGxCb2FyZE5vTWF0Y2hlcygpIHsKICAgIGdyaWQgPSBbXTsKICAgIGZvciAodmFyIHIgPSAwOyByIDwgR1JJRDsgcisrKSB7CiAgICAgIGdyaWRbcl0gPSBbXTsKICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBHUklEOyBjKyspIHsKICAgICAgICB2YXIgbGVmdCA9IGMgPj0gMiAmJiBncmlkW3JdW2MgLSAxXS50eXBlID09PSBncmlkW3JdW2MgLSAyXS50eXBlID8gZ3JpZFtyXVtjIC0gMV0udHlwZSA6IHVuZGVmaW5lZDsKICAgICAgICB2YXIgdXAgPSByID49IDIgJiYgZ3JpZFtyIC0gMV1bY10udHlwZSA9PT0gZ3JpZFtyIC0gMl1bY10udHlwZSA\/IGdyaWRbciAtIDFdW2NdLnR5cGUgOiB1bmRlZmluZWQ7CiAgICAgICAgZ3JpZFtyXVtjXSA9IG5ld0NhdChsZWZ0LCB1cCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qID09PT09IE1BVENIIEZJTkRJTkcgPT09PT0gKi8KICBmdW5jdGlvbiBmaW5kTWF0Y2hlcyhnKSB7CiAgICB2YXIgbWFya2VkID0ge307CiAgICB2YXIgZ3JvdXBzID0gW107CiAgICBmdW5jdGlvbiBrZXkociwgYykgeyByZXR1cm4gciArICIsIiArIGM7IH0KCiAgICAvLyBob3Jpem9udGFsCiAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykgewogICAgICB2YXIgYyA9IDA7CiAgICAgIHdoaWxlIChjIDwgR1JJRCkgewogICAgICAgIHZhciB0ID0gZ1tyXVtjXTsKICAgICAgICBpZiAodC50eXBlIDwgMCB8fCB0Lm9ic3RhY2xlKSB7IGMrKzsgY29udGludWU7IH0KICAgICAgICB2YXIgcnVuID0gMTsKICAgICAgICB3aGlsZSAoYyArIHJ1biA8IEdSSUQgJiYgZ1tyXVtjICsgcnVuXS50eXBlID09PSB0LnR5cGUgJiYgIWdbcl1bYyArIHJ1bl0ub2JzdGFjbGUpIHJ1bisrOwogICAgICAgIGlmIChydW4gPj0gMykgewogICAgICAgICAgdmFyIGNlbGxzID0gW107CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJ1bjsgaSsrKSB7CiAgICAgICAgICAgIGNlbGxzLnB1c2goW3IsIGMgKyBpXSk7CiAgICAgICAgICAgIG1hcmtlZFtrZXkociwgYyArIGkpXSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBncm91cHMucHVzaCh7Y2VsbHM6IGNlbGxzLCB0eXBlOiB0LnR5cGUsIG9yaWVudDogImgiLCBsZW46IHJ1bn0pOwogICAgICAgIH0KICAgICAgICBjICs9IHJ1bjsKICAgICAgfQogICAgfQogICAgLy8gdmVydGljYWwKICAgIGZvciAodmFyIGMyID0gMDsgYzIgPCBHUklEOyBjMisrKSB7CiAgICAgIHZhciByMiA9IDA7CiAgICAgIHdoaWxlIChyMiA8IEdSSUQpIHsKICAgICAgICB2YXIgdDIgPSBnW3IyXVtjMl07CiAgICAgICAgaWYgKHQyLnR5cGUgPCAwIHx8IHQyLm9ic3RhY2xlKSB7IHIyKys7IGNvbnRpbnVlOyB9CiAgICAgICAgdmFyIHJ1bjIgPSAxOwogICAgICAgIHdoaWxlIChyMiArIHJ1bjIgPCBHUklEICYmIGdbcjIgKyBydW4yXVtjMl0udHlwZSA9PT0gdDIudHlwZSAmJiAhZ1tyMiArIHJ1bjJdW2MyXS5vYnN0YWNsZSkgcnVuMisrOwogICAgICAgIGlmIChydW4yID49IDMpIHsKICAgICAgICAgIHZhciBjZWxsczIgPSBbXTsKICAgICAgICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBydW4yOyBpMisrKSB7CiAgICAgICAgICAgIGNlbGxzMi5wdXNoKFtyMiArIGkyLCBjMl0pOwogICAgICAgICAgICBtYXJrZWRba2V5KHIyICsgaTIsIGMyKV0gPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgZ3JvdXBzLnB1c2goe2NlbGxzOiBjZWxsczIsIHR5cGU6IHQyLnR5cGUsIG9yaWVudDogInYiLCBsZW46IHJ1bjJ9KTsKICAgICAgICB9CiAgICAgICAgcjIgKz0gcnVuMjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHtncm91cHM6IGdyb3VwcywgbWFya2VkOiBtYXJrZWR9OwogIH0KCiAgZnVuY3Rpb24gd291bGRNYXRjaChnLCByMSwgYzEsIHIyLCBjMikgewogICAgdmFyIGEgPSBnW3IxXVtjMV0sIGIgPSBnW3IyXVtjMl07CiAgICBpZiAoYS50eXBlIDwgMCB8fCBiLnR5cGUgPCAwKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoYS5vYnN0YWNsZSB8fCBiLm9ic3RhY2xlKSByZXR1cm4gZmFsc2U7CiAgICAvLyByYWluYm93IGFsd2F5cyAibWF0Y2hlcyIgd2hlbiBzd2FwcGVkIHdpdGggYSBjYXQKICAgIGlmIChhLnNwZWNpYWwgPT09ICJyYWluYm93IiB8fCBiLnNwZWNpYWwgPT09ICJyYWluYm93IikgcmV0dXJuIHRydWU7CiAgICAvLyB0d28gc3BlY2lhbHMKICAgIGlmIChhLnNwZWNpYWwgJiYgYi5zcGVjaWFsKSByZXR1cm4gdHJ1ZTsKICAgIGdbcjFdW2MxXSA9IGI7IGdbcjJdW2MyXSA9IGE7CiAgICB2YXIgbSA9IGZpbmRNYXRjaGVzKGcpOwogICAgZ1tyMV1bYzFdID0gYTsgZ1tyMl1bYzJdID0gYjsKICAgIHJldHVybiBtLmdyb3Vwcy5sZW5ndGggPiAwOwogIH0KCiAgZnVuY3Rpb24gZmluZEhpbnQoKSB7CiAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykgewogICAgICBmb3IgKHZhciBjID0gMDsgYyA8IEdSSUQ7IGMrKykgewogICAgICAgIGlmIChjICsgMSA8IEdSSUQgJiYgd291bGRNYXRjaChncmlkLCByLCBjLCByLCBjICsgMSkpIHJldHVybiBbW3IsIGNdLCBbciwgYyArIDFdXTsKICAgICAgICBpZiAociArIDEgPCBHUklEICYmIHdvdWxkTWF0Y2goZ3JpZCwgciwgYywgciArIDEsIGMpKSByZXR1cm4gW1tyLCBjXSwgW3IgKyAxLCBjXV07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLyogPT09PT0gR09BTFMgLyBEQU1BR0UgPT09PT0gKi8KICBmdW5jdGlvbiBoaXRPYnN0YWNsZShyLCBjKSB7CiAgICB2YXIgdCA9IGdyaWRbcl1bY107CiAgICBpZiAoIXQub2JzdGFjbGUpIHJldHVybjsKICAgIHZhciBraW5kID0gdC5vYnN0YWNsZTsKICAgIHQuaHAtLTsKICAgIHQuc2hha2UgPSA4OwogICAgaWYgKHQuaHAgPD0gMCkgewogICAgICB0Lm9ic3RhY2xlID0gbnVsbDsKICAgICAgaWYgKGtpbmQgPT09ICJib3giIHx8IGtpbmQgPT09ICJib3gyIikgcHJvZ3Jlc3NHb2FsKCJib3hlcyIsIDEpOwogICAgICBlbHNlIGlmIChraW5kID09PSAieWFybiIpIHByb2dyZXNzR29hbCgieWFybiIsIDEpOwogICAgICBlbHNlIGlmIChraW5kID09PSAiY2FycmllciIpIHsKICAgICAgICBwcm9ncmVzc0dvYWwoImtpdHRlbnMiLCAxKTsKICAgICAgICB0LnR5cGUgPSByYW5kVHlwZSgpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGtpbmQgPT09ICJib3gyIiAmJiB0LmhwID09PSAxKSB7CiAgICAgIHQub2JzdGFjbGUgPSAiYm94IjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHByb2dyZXNzR29hbChraW5kLCBuLCB0eXBlKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdvYWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBnID0gZ29hbHNbaV07CiAgICAgIGlmIChnLmtpbmQgPT09IGtpbmQpIHsKICAgICAgICBpZiAoa2luZCA9PT0gImNvbGxlY3QiICYmIGcudHlwZSAhPT0gdHlwZSkgY29udGludWU7CiAgICAgICAgZy5oYXZlID0gTWF0aC5taW4oZy5uZWVkLCAoZy5oYXZlIHx8IDApICsgbik7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGdvYWxzRG9uZSgpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ29hbHMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKChnb2Fsc1tpXS5oYXZlIHx8IDApIDwgZ29hbHNbaV0ubmVlZCkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBkYW1hZ2VBZGphY2VudChjZWxscykgewogICAgdmFyIHNlZW4gPSB7fTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHIgPSBjZWxsc1tpXVswXSwgYyA9IGNlbGxzW2ldWzFdOwogICAgICB2YXIgZGlycyA9IFtbMCwgMV0sIFswLCAtMV0sIFsxLCAwXSwgWy0xLCAwXV07CiAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgNDsgZCsrKSB7CiAgICAgICAgdmFyIG5yID0gciArIGRpcnNbZF1bMF0sIG5jID0gYyArIGRpcnNbZF1bMV07CiAgICAgICAgdmFyIGsgPSBuciArICIsIiArIG5jOwogICAgICAgIGlmIChpbkJvdW5kcyhuciwgbmMpICYmICFzZWVuW2tdICYmIGdyaWRbbnJdW25jXS5vYnN0YWNsZSkgewogICAgICAgICAgc2VlbltrXSA9IHRydWU7CiAgICAgICAgICBoaXRPYnN0YWNsZShuciwgbmMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLyogPT09PT0gQ0xFQVIgLyBTUEVDSUFMUyA9PT09PSAqLwogIGZ1bmN0aW9uIGFkZFNjb3JlKGxlbiwgbXVsdCkgewogICAgdmFyIGJhc2UgPSBTQ09SRV9CQVNFW01hdGgubWluKDUsIE1hdGgubWF4KDMsIGxlbikpXSB8fCAxMDA7CiAgICBpZiAobGVuID4gNSkgYmFzZSA9IDUwMCArIChsZW4gLSA1KSAqIDEwMDsKICAgIHNjb3JlICs9IGJhc2UgKiBtdWx0OwogIH0KCiAgZnVuY3Rpb24gc2V0Rmxhc2gobXNnKSB7CiAgICBmbGFzaE1zZyA9IG1zZzsKICAgIGZsYXNoVGltZXIgPSAxLjI7CiAgfQoKICBmdW5jdGlvbiBjb2xsZWN0Q2xlYXJlZChyLCBjKSB7CiAgICB2YXIgdCA9IGdyaWRbcl1bY107CiAgICBpZiAodC50eXBlID49IDApIHByb2dyZXNzR29hbCgiY29sbGVjdCIsIDEsIHQudHlwZSk7CiAgICBzcGF3blBvb2YoYm9hcmRYICsgYyAqIGNlbGwgKyBjZWxsIC8gMiwgYm9hcmRZICsgciAqIGNlbGwgKyBjZWxsIC8gMiwgdC50eXBlKTsKICB9CgogIGZ1bmN0aW9uIHNwYXduUG9vZih4LCB5LCB0eXBlKSB7CiAgICB2YXIgY29scyA9IFsiI2U4ODgzYSIsICIjMmEyYTMwIiwgIiNmNWYyZWEiLCAiIzlhOWFhOCIsICIjZjBkOGE4IiwgIiM0YTRhNTgiXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgIHBhcnRpY2xlcy5wdXNoKHsKICAgICAgICB4OiB4LCB5OiB5LAogICAgICAgIHZ4OiAoTWF0aC5yYW5kb20oKSAtIDAuNSkgKiAxODAsCiAgICAgICAgdnk6IChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIDE4MCAtIDQwLAogICAgICAgIGxpZmU6IDAuNCArIE1hdGgucmFuZG9tKCkgKiAwLjMsCiAgICAgICAgY29sOiBjb2xzW3R5cGVdIHx8ICIjZmZmIiwKICAgICAgICBzaXplOiA0ICsgTWF0aC5yYW5kb20oKSAqIDYKICAgICAgfSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjbGVhckNlbGwociwgYywgc2tpcFNwZWNpYWwpIHsKICAgIGlmICghaW5Cb3VuZHMociwgYykpIHJldHVybjsKICAgIHZhciB0ID0gZ3JpZFtyXVtjXTsKICAgIGlmICh0LnR5cGUgPCAwICYmICF0Lm9ic3RhY2xlKSByZXR1cm47CiAgICBpZiAodC5vYnN0YWNsZSA9PT0gImNhcnJpZXIiKSB7CiAgICAgIGhpdE9ic3RhY2xlKHIsIGMpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodC5vYnN0YWNsZSkgewogICAgICBoaXRPYnN0YWNsZShyLCBjKTsKICAgIH0KICAgIGlmICh0LnR5cGUgPj0gMCkgewogICAgICB2YXIgc3AgPSB0LnNwZWNpYWw7CiAgICAgIGNvbGxlY3RDbGVhcmVkKHIsIGMpOwogICAgICB0LnR5cGUgPSAtMTsKICAgICAgdC5zcGVjaWFsID0gbnVsbDsKICAgICAgdC5wb3AgPSAwOwogICAgICBpZiAoIXNraXBTcGVjaWFsICYmIHNwKSB0cmlnZ2VyU3BlY2lhbChyLCBjLCBzcCwgdCk7CiAgICB9CiAgfQoKICB2YXIgc3BlY2lhbFF1ZXVlID0gW107CgogIGZ1bmN0aW9uIHRyaWdnZXJTcGVjaWFsKHIsIGMsIHNwLCBvbGRUaWxlKSB7CiAgICBzcGVjaWFsUXVldWUucHVzaCh7cjogciwgYzogYywgc3A6IHNwLCB0eXBlOiBvbGRUaWxlID8gb2xkVGlsZS5fY2xlYXJUeXBlIDogMH0pOwogIH0KCiAgZnVuY3Rpb24gcHJvY2Vzc1NwZWNpYWxRdWV1ZShtdWx0KSB7CiAgICB3aGlsZSAoc3BlY2lhbFF1ZXVlLmxlbmd0aCkgewogICAgICB2YXIgcyA9IHNwZWNpYWxRdWV1ZS5zaGlmdCgpOwogICAgICB2YXIgc3AgPSBzLnNwOwogICAgICBpZiAoc3AgPT09ICJzdHJpcGVkX2giKSB7CiAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBHUklEOyBjKyspIGNsZWFyQ2VsbChzLnIsIGMsIGZhbHNlKTsKICAgICAgICBhZGRTY29yZSg1LCBtdWx0KTsKICAgICAgfSBlbHNlIGlmIChzcCA9PT0gInN0cmlwZWRfdiIpIHsKICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykgY2xlYXJDZWxsKHIsIHMuYywgZmFsc2UpOwogICAgICAgIGFkZFNjb3JlKDUsIG11bHQpOwogICAgICB9IGVsc2UgaWYgKHNwID09PSAiYm9tYiIpIHsKICAgICAgICBmb3IgKHZhciBkciA9IC0xOyBkciA8PSAxOyBkcisrKQogICAgICAgICAgZm9yICh2YXIgZGMgPSAtMTsgZGMgPD0gMTsgZGMrKykKICAgICAgICAgICAgY2xlYXJDZWxsKHMuciArIGRyLCBzLmMgKyBkYywgZmFsc2UpOwogICAgICAgIGFkZFNjb3JlKDUsIG11bHQpOwogICAgICB9IGVsc2UgaWYgKHNwID09PSAicmFpbmJvdyIpIHsKICAgICAgICB2YXIgdGFyZ2V0ID0gcy50YXJnZXRUeXBlOwogICAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPCAwKSB0YXJnZXQgPSByYW5kVHlwZSgpOwogICAgICAgIGZvciAodmFyIHIyID0gMDsgcjIgPCBHUklEOyByMisrKQogICAgICAgICAgZm9yICh2YXIgYzIgPSAwOyBjMiA8IEdSSUQ7IGMyKyspCiAgICAgICAgICAgIGlmIChncmlkW3IyXVtjMl0udHlwZSA9PT0gdGFyZ2V0KSBjbGVhckNlbGwocjIsIGMyLCBmYWxzZSk7CiAgICAgICAgYWRkU2NvcmUoNSwgbXVsdCk7CiAgICAgIH0gZWxzZSBpZiAoc3AgPT09ICJiaWdjcm9zcyIpIHsKICAgICAgICBmb3IgKHZhciByciA9IDA7IHJyIDwgR1JJRDsgcnIrKykgY2xlYXJDZWxsKHJyLCBzLmMsIGZhbHNlKTsKICAgICAgICBmb3IgKHZhciBjYyA9IDA7IGNjIDwgR1JJRDsgY2MrKykgY2xlYXJDZWxsKHMuciwgY2MsIGZhbHNlKTsKICAgICAgICBhZGRTY29yZSg1LCBtdWx0KTsKICAgICAgfSBlbHNlIGlmIChzcCA9PT0gIm1lZ2Fib21iIikgewogICAgICAgIGZvciAodmFyIGRyMiA9IC0yOyBkcjIgPD0gMjsgZHIyKyspCiAgICAgICAgICBmb3IgKHZhciBkYzIgPSAtMjsgZGMyIDw9IDI7IGRjMisrKQogICAgICAgICAgICBjbGVhckNlbGwocy5yICsgZHIyLCBzLmMgKyBkYzIsIGZhbHNlKTsKICAgICAgICBhZGRTY29yZSg1LCBtdWx0KTsKICAgICAgfSBlbHNlIGlmIChzcCA9PT0gInJvdzMiKSB7CiAgICAgICAgZm9yICh2YXIgZHIzID0gLTE7IGRyMyA8PSAxOyBkcjMrKykKICAgICAgICAgIGZvciAodmFyIGNjMyA9IDA7IGNjMyA8IEdSSUQ7IGNjMysrKQogICAgICAgICAgICBjbGVhckNlbGwocy5yICsgZHIzLCBjYzMsIGZhbHNlKTsKICAgICAgICBmb3IgKHZhciBkYzMgPSAtMTsgZGMzIDw9IDE7IGRjMysrKQogICAgICAgICAgZm9yICh2YXIgcnIzID0gMDsgcnIzIDwgR1JJRDsgcnIzKyspCiAgICAgICAgICAgIGNsZWFyQ2VsbChycjMsIHMuYyArIGRjMywgZmFsc2UpOwogICAgICAgIGFkZFNjb3JlKDUsIG11bHQpOwogICAgICB9IGVsc2UgaWYgKHNwID09PSAiY2xlYXJhbGwiKSB7CiAgICAgICAgZm9yICh2YXIgcmEgPSAwOyByYSA8IEdSSUQ7IHJhKyspCiAgICAgICAgICBmb3IgKHZhciBjYSA9IDA7IGNhIDwgR1JJRDsgY2ErKykKICAgICAgICAgICAgaWYgKGdyaWRbcmFdW2NhXS50eXBlID49IDApIGNsZWFyQ2VsbChyYSwgY2EsIHRydWUpOwogICAgICAgIGFkZFNjb3JlKDUsIG11bHQpOwogICAgICB9IGVsc2UgaWYgKHNwID09PSAicGFpbnRfc3RyaXBlIiB8fCBzcCA9PT0gInBhaW50X2JvbWIiKSB7CiAgICAgICAgdmFyIHB0ID0gcy50YXJnZXRUeXBlOwogICAgICAgIGlmIChwdCA9PT0gdW5kZWZpbmVkIHx8IHB0IDwgMCkgcHQgPSByYW5kVHlwZSgpOwogICAgICAgIHZhciBtYWtlID0gc3AgPT09ICJwYWludF9zdHJpcGUiID8gInN0cmlwZWRfaCIgOiAiYm9tYiI7CiAgICAgICAgdmFyIHBhaW50ZWQgPSBbXTsKICAgICAgICBmb3IgKHZhciBycCA9IDA7IHJwIDwgR1JJRDsgcnArKykKICAgICAgICAgIGZvciAodmFyIGNwID0gMDsgY3AgPCBHUklEOyBjcCsrKQogICAgICAgICAgICBpZiAoZ3JpZFtycF1bY3BdLnR5cGUgPT09IHB0KSB7CiAgICAgICAgICAgICAgZ3JpZFtycF1bY3BdLnNwZWNpYWwgPSBtYWtlOwogICAgICAgICAgICAgIGlmIChtYWtlID09PSAic3RyaXBlZF9oIiAmJiBNYXRoLnJhbmRvbSgpIDwgMC41KSBncmlkW3JwXVtjcF0uc3BlY2lhbCA9ICJzdHJpcGVkX3YiOwogICAgICAgICAgICAgIHBhaW50ZWQucHVzaChbcnAsIGNwXSk7CiAgICAgICAgICAgIH0KICAgICAgICBmb3IgKHZhciBwaSA9IDA7IHBpIDwgcGFpbnRlZC5sZW5ndGg7IHBpKyspIHsKICAgICAgICAgIHZhciBwciA9IHBhaW50ZWRbcGldWzBdLCBwYyA9IHBhaW50ZWRbcGldWzFdOwogICAgICAgICAgdmFyIHBzcCA9IGdyaWRbcHJdW3BjXS5zcGVjaWFsOwogICAgICAgICAgY2xlYXJDZWxsKHByLCBwYywgZmFsc2UpOwogICAgICAgIH0KICAgICAgICBhZGRTY29yZSg1LCBtdWx0KTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVzb2x2ZVNwZWNpYWxDb21ibyhyMSwgYzEsIHIyLCBjMikgewogICAgdmFyIGEgPSBncmlkW3IxXVtjMV0sIGIgPSBncmlkW3IyXVtjMl07CiAgICB2YXIgc2EgPSBhLnNwZWNpYWwsIHNiID0gYi5zcGVjaWFsOwogICAgLy8gY2xlYXIgYm90aCBjZWxscyBmaXJzdCB2aXN1YWxseQogICAgdmFyIHR5cGVCID0gYi50eXBlLCB0eXBlQSA9IGEudHlwZTsKCiAgICBmdW5jdGlvbiB3aXBlKHIsIGMpIHsKICAgICAgY29sbGVjdENsZWFyZWQociwgYyk7CiAgICAgIGdyaWRbcl1bY10udHlwZSA9IC0xOwogICAgICBncmlkW3JdW2NdLnNwZWNpYWwgPSBudWxsOwogICAgfQoKICAgIGlmIChzYSA9PT0gInJhaW5ib3ciICYmIHNiID09PSAicmFpbmJvdyIpIHsKICAgICAgd2lwZShyMSwgYzEpOyB3aXBlKHIyLCBjMik7CiAgICAgIHNwZWNpYWxRdWV1ZS5wdXNoKHtyOiByMSwgYzogYzEsIHNwOiAiY2xlYXJhbGwifSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKHNhID09PSAicmFpbmJvdyIgfHwgc2IgPT09ICJyYWluYm93IikgewogICAgICB2YXIgb3RoZXIgPSBzYSA9PT0gInJhaW5ib3ciID8gYiA6IGE7CiAgICAgIHZhciByciA9IHNhID09PSAicmFpbmJvdyIgPyByMSA6IHIyOwogICAgICB2YXIgY2MgPSBzYSA9PT0gInJhaW5ib3ciID8gYzEgOiBjMjsKICAgICAgdmFyIG9yXyA9IHNhID09PSAicmFpbmJvdyIgPyByMiA6IHIxOwogICAgICB2YXIgb2MgPSBzYSA9PT0gInJhaW5ib3ciID8gYzIgOiBjMTsKICAgICAgd2lwZShyciwgY2MpOyB3aXBlKG9yXywgb2MpOwogICAgICBpZiAob3RoZXIuc3BlY2lhbCA9PT0gInN0cmlwZWRfaCIgfHwgb3RoZXIuc3BlY2lhbCA9PT0gInN0cmlwZWRfdiIpIHsKICAgICAgICBzcGVjaWFsUXVldWUucHVzaCh7cjogb3JfLCBjOiBvYywgc3A6ICJwYWludF9zdHJpcGUiLCB0YXJnZXRUeXBlOiBvdGhlci50eXBlID49IDAgPyBvdGhlci50eXBlIDogcmFuZFR5cGUoKX0pOwogICAgICB9IGVsc2UgaWYgKG90aGVyLnNwZWNpYWwgPT09ICJib21iIikgewogICAgICAgIHNwZWNpYWxRdWV1ZS5wdXNoKHtyOiBvcl8sIGM6IG9jLCBzcDogInBhaW50X2JvbWIiLCB0YXJnZXRUeXBlOiBvdGhlci50eXBlID49IDAgPyBvdGhlci50eXBlIDogcmFuZFR5cGUoKX0pOwogICAgICB9IGVsc2UgewogICAgICAgIHNwZWNpYWxRdWV1ZS5wdXNoKHtyOiBvcl8sIGM6IG9jLCBzcDogInJhaW5ib3ciLCB0YXJnZXRUeXBlOiBvdGhlci50eXBlfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB2YXIgc3RyaXBlQSA9IHNhID09PSAic3RyaXBlZF9oIiB8fCBzYSA9PT0gInN0cmlwZWRfdiI7CiAgICB2YXIgc3RyaXBlQiA9IHNiID09PSAic3RyaXBlZF9oIiB8fCBzYiA9PT0gInN0cmlwZWRfdiI7CiAgICBpZiAoc3RyaXBlQSAmJiBzdHJpcGVCKSB7CiAgICAgIHdpcGUocjEsIGMxKTsgd2lwZShyMiwgYzIpOwogICAgICBzcGVjaWFsUXVldWUucHVzaCh7cjogcjEsIGM6IGMxLCBzcDogImJpZ2Nyb3NzIn0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICgoc3RyaXBlQSAmJiBzYiA9PT0gImJvbWIiKSB8fCAoc3RyaXBlQiAmJiBzYSA9PT0gImJvbWIiKSkgewogICAgICB3aXBlKHIxLCBjMSk7IHdpcGUocjIsIGMyKTsKICAgICAgc3BlY2lhbFF1ZXVlLnB1c2goe3I6IHIxLCBjOiBjMSwgc3A6ICJyb3czIn0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChzYSA9PT0gImJvbWIiICYmIHNiID09PSAiYm9tYiIpIHsKICAgICAgd2lwZShyMSwgYzEpOyB3aXBlKHIyLCBjMik7CiAgICAgIHNwZWNpYWxRdWV1ZS5wdXNoKHtyOiByMSwgYzogYzEsIHNwOiAibWVnYWJvbWIifSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gZGV0ZXJtaW5lU3BlY2lhbChncm91cHMsIG1hcmtlZCkgewogICAgLy8gRmluZCBpbnRlcnNlY3Rpb25zIGZvciBUL0wgKGJvbWIpLCBsb25nIHJ1bnMgZm9yIHN0cmlwZS9yYWluYm93CiAgICB2YXIgY2VsbEdyb3VwcyA9IHt9OwogICAgZnVuY3Rpb24gayhyLCBjKSB7IHJldHVybiByICsgIiwiICsgYzsgfQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGcgPSBncm91cHNbaV07CiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZy5jZWxscy5sZW5ndGg7IGorKykgewogICAgICAgIHZhciBjZWxsID0gZy5jZWxsc1tqXTsKICAgICAgICB2YXIga2sgPSBrKGNlbGxbMF0sIGNlbGxbMV0pOwogICAgICAgIGlmICghY2VsbEdyb3Vwc1tra10pIGNlbGxHcm91cHNba2tdID0gW107CiAgICAgICAgY2VsbEdyb3Vwc1tra10ucHVzaChnKTsKICAgICAgfQogICAgfQogICAgdmFyIHNwYXduQXQgPSBudWxsOwogICAgdmFyIHNwYXduS2luZCA9IG51bGw7CiAgICAvLyBQcmVmZXIgYm9tYiBhdCBpbnRlcnNlY3Rpb24KICAgIGZvciAodmFyIGtleSBpbiBjZWxsR3JvdXBzKSB7CiAgICAgIGlmIChjZWxsR3JvdXBzW2tleV0ubGVuZ3RoID49IDIpIHsKICAgICAgICB2YXIgcGFydHMgPSBrZXkuc3BsaXQoIiwiKTsKICAgICAgICBzcGF3bkF0ID0gW3BhcnNlSW50KHBhcnRzWzBdLCAxMCksIHBhcnNlSW50KHBhcnRzWzFdLCAxMCldOwogICAgICAgIHNwYXduS2luZCA9ICJib21iIjsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKCFzcGF3bktpbmQpIHsKICAgICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IGdyb3Vwcy5sZW5ndGg7IGkyKyspIHsKICAgICAgICB2YXIgZzIgPSBncm91cHNbaTJdOwogICAgICAgIGlmIChnMi5sZW4gPj0gNSkgewogICAgICAgICAgc3Bhd25BdCA9IGcyLmNlbGxzWyhnMi5sZW4gLyAyKSB8IDBdOwogICAgICAgICAgc3Bhd25LaW5kID0gInJhaW5ib3ciOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoIXNwYXduS2luZCkgewogICAgICBmb3IgKHZhciBpMyA9IDA7IGkzIDwgZ3JvdXBzLmxlbmd0aDsgaTMrKykgewogICAgICAgIHZhciBnMyA9IGdyb3Vwc1tpM107CiAgICAgICAgaWYgKGczLmxlbiA+PSA0KSB7CiAgICAgICAgICBzcGF3bkF0ID0gZzMuY2VsbHNbMV07CiAgICAgICAgICBzcGF3bktpbmQgPSBnMy5vcmllbnQgPT09ICJoIiA\/ICJzdHJpcGVkX3YiIDogInN0cmlwZWRfaCI7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7YXQ6IHNwYXduQXQsIGtpbmQ6IHNwYXduS2luZCwgdHlwZTogc3Bhd25BdCA\/IGdyaWRbc3Bhd25BdFswXV1bc3Bhd25BdFsxXV0udHlwZSA6IDB9OwogIH0KCiAgZnVuY3Rpb24gc2xlZXAobXMpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeyBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTsgfSk7CiAgfQoKICBmdW5jdGlvbiBhbmltYXRlU3VycHJpc2UoY2VsbHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHIgPSBjZWxsc1tpXVswXSwgYyA9IGNlbGxzW2ldWzFdOwogICAgICBpZiAoZ3JpZFtyXVtjXS50eXBlID49IDApIGdyaWRbcl1bY10ucG9wID0gMTsKICAgIH0KICB9CgogIGFzeW5jIGZ1bmN0aW9uIGNvbGxhcHNlQW5kUmVmaWxsKCkgewogICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgR1JJRDsgY29sKyspIHsKICAgICAgdmFyIHBpZWNlcyA9IFtdOwogICAgICB2YXIgYmxvY2tlcnMgPSB7fTsKICAgICAgZm9yICh2YXIgcm93ID0gR1JJRCAtIDE7IHJvdyA+PSAwOyByb3ctLSkgewogICAgICAgIHZhciB0dCA9IGdyaWRbcm93XVtjb2xdOwogICAgICAgIGlmICh0dC5vYnN0YWNsZSkgewogICAgICAgICAgYmxvY2tlcnNbcm93XSA9IHtvYnN0YWNsZTogdHQub2JzdGFjbGUsIGhwOiB0dC5ocCwgdHlwZTogdHQudHlwZX07CiAgICAgICAgfSBlbHNlIGlmICh0dC50eXBlID49IDApIHsKICAgICAgICAgIHBpZWNlcy5wdXNoKHt0eXBlOiB0dC50eXBlLCBzcGVjaWFsOiB0dC5zcGVjaWFsLCBmcm9tOiByb3d9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yICh2YXIgcm93MiA9IDA7IHJvdzIgPCBHUklEOyByb3cyKyspIGdyaWRbcm93Ml1bY29sXSA9IGVtcHR5VGlsZSgpOwogICAgICBmb3IgKHZhciBiayBpbiBibG9ja2VycykgewogICAgICAgIHZhciBiaSA9IHBhcnNlSW50KGJrLCAxMCk7CiAgICAgICAgZ3JpZFtiaV1bY29sXS5vYnN0YWNsZSA9IGJsb2NrZXJzW2JrXS5vYnN0YWNsZTsKICAgICAgICBncmlkW2JpXVtjb2xdLmhwID0gYmxvY2tlcnNbYmtdLmhwOwogICAgICAgIGdyaWRbYmldW2NvbF0udHlwZSA9IGJsb2NrZXJzW2JrXS50eXBlOwogICAgICB9CiAgICAgIHZhciBkZXN0ID0gR1JJRCAtIDE7CiAgICAgIHZhciBwaSA9IDA7CiAgICAgIHdoaWxlIChkZXN0ID49IDAgJiYgcGkgPCBwaWVjZXMubGVuZ3RoKSB7CiAgICAgICAgaWYgKGdyaWRbZGVzdF1bY29sXS5vYnN0YWNsZSkgeyBkZXN0LS07IGNvbnRpbnVlOyB9CiAgICAgICAgdmFyIHBpZWNlID0gcGllY2VzW3BpKytdOwogICAgICAgIHZhciBmYWxsRGlzdCA9IE1hdGgubWF4KDAsIGRlc3QgLSAoR1JJRCAtIHBpZWNlcy5sZW5ndGgpKTsKICAgICAgICBncmlkW2Rlc3RdW2NvbF0udHlwZSA9IHBpZWNlLnR5cGU7CiAgICAgICAgZ3JpZFtkZXN0XVtjb2xdLnNwZWNpYWwgPSBwaWVjZS5zcGVjaWFsOwogICAgICAgIGdyaWRbZGVzdF1bY29sXS5mYWxsID0gTWF0aC5tYXgoMC41LCBwaWVjZS5mcm9tID49IDAgPyAoZGVzdCA8IHBpZWNlLmZyb20gPyBwaWVjZS5mcm9tIC0gZGVzdCA6IDAuOCkgOiAyKTsKICAgICAgICBkZXN0LS07CiAgICAgIH0KICAgICAgd2hpbGUgKGRlc3QgPj0gMCkgewogICAgICAgIGlmIChncmlkW2Rlc3RdW2NvbF0ub2JzdGFjbGUpIHsgZGVzdC0tOyBjb250aW51ZTsgfQogICAgICAgIHZhciBudCA9IG5ld0NhdCgpOwogICAgICAgIG50LmZhbGwgPSAyICsgKEdSSUQgLSBkZXN0KSAqIDAuMzsKICAgICAgICBncmlkW2Rlc3RdW2NvbF0gPSBudDsKICAgICAgICBkZXN0LS07CiAgICAgIH0KICAgIH0KICAgIHZhciBtYXhGYWxsID0gMDsKICAgIGZvciAodmFyIHIzID0gMDsgcjMgPCBHUklEOyByMysrKQogICAgICBmb3IgKHZhciBjMyA9IDA7IGMzIDwgR1JJRDsgYzMrKykKICAgICAgICBpZiAoZ3JpZFtyM11bYzNdLmZhbGwgPiBtYXhGYWxsKSBtYXhGYWxsID0gZ3JpZFtyM11bYzNdLmZhbGw7CiAgICBpZiAobWF4RmFsbCA+IDApIHsKICAgICAgdmFyIHQwID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgIHZhciBkdXIgPSBNYXRoLm1pbigzNTAsIDgwICsgbWF4RmFsbCAqIDQwKTsKICAgICAgYXdhaXQgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgICBmdW5jdGlvbiBzdGVwKG5vdykgewogICAgICAgICAgdmFyIHAgPSBNYXRoLm1pbigxLCAobm93IC0gdDApIC8gZHVyKTsKICAgICAgICAgIHZhciBlYXNlID0gMSAtIE1hdGgucG93KDEgLSBwLCAyKTsKICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgR1JJRDsgcisrKQogICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IEdSSUQ7IGMrKykgewogICAgICAgICAgICAgIHZhciB0ID0gZ3JpZFtyXVtjXTsKICAgICAgICAgICAgICBpZiAodC5fZmFsbEZyb20gPT09IHVuZGVmaW5lZCAmJiB0LmZhbGwpIHQuX2ZhbGxGcm9tID0gdC5mYWxsOwogICAgICAgICAgICAgIGlmICh0Ll9mYWxsRnJvbSkgewogICAgICAgICAgICAgICAgdC5mYWxsID0gdC5fZmFsbEZyb20gKiAoMSAtIGVhc2UpOwogICAgICAgICAgICAgICAgdC5zY2FsZSA9IHAgPiAwLjg1ID8gMSAtICgxIC0gcCkgKiAwLjMgOiAxOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgaWYgKHAgPCAxKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yICh2YXIgcjQgPSAwOyByNCA8IEdSSUQ7IHI0KyspCiAgICAgICAgICAgICAgZm9yICh2YXIgYzQgPSAwOyBjNCA8IEdSSUQ7IGM0KyspIHsKICAgICAgICAgICAgICAgIGdyaWRbcjRdW2M0XS5mYWxsID0gMDsKICAgICAgICAgICAgICAgIGdyaWRbcjRdW2M0XS5fZmFsbEZyb20gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBncmlkW3I0XVtjNF0uc2NhbGUgPSAxOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU1hdGNoZXMoZnJvbVN3YXApIHsKICAgIGNvbWJvID0gMDsKICAgIHZhciBzYWZldHkgPSAwOwogICAgd2hpbGUgKHNhZmV0eSsrIDwgMzApIHsKICAgICAgdmFyIHJlc3VsdCA9IGZpbmRNYXRjaGVzKGdyaWQpOwogICAgICBpZiAocmVzdWx0Lmdyb3Vwcy5sZW5ndGggPT09IDAgJiYgc3BlY2lhbFF1ZXVlLmxlbmd0aCA9PT0gMCkgYnJlYWs7CiAgICAgIGNvbWJvKys7CiAgICAgIHZhciBtdWx0ID0gTWF0aC5taW4oNSwgTWF0aC5tYXgoMSwgY29tYm8pKTsKICAgICAgaWYgKGNvbWJvID49IDIpIHNldEZsYXNoKENPTUJPX01TR1tNYXRoLm1pbihDT01CT19NU0cubGVuZ3RoIC0gMSwgY29tYm8pXSk7CgogICAgICAvLyBkZXRlcm1pbmUgc3BlY2lhbHMgdG8gc3Bhd24gYmVmb3JlIGNsZWFyaW5nCiAgICAgIHZhciBzcGF3biA9IGRldGVybWluZVNwZWNpYWwocmVzdWx0Lmdyb3VwcywgcmVzdWx0Lm1hcmtlZCk7CiAgICAgIHZhciBhbGxDZWxscyA9IFtdOwogICAgICB2YXIgc2VlbiA9IHt9OwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5ncm91cHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgZyA9IHJlc3VsdC5ncm91cHNbaV07CiAgICAgICAgYWRkU2NvcmUoZy5sZW4sIG11bHQpOwogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZy5jZWxscy5sZW5ndGg7IGorKykgewogICAgICAgICAgdmFyIGNrID0gZy5jZWxsc1tqXVswXSArICIsIiArIGcuY2VsbHNbal1bMV07CiAgICAgICAgICBpZiAoIXNlZW5bY2tdKSB7CiAgICAgICAgICAgIHNlZW5bY2tdID0gdHJ1ZTsKICAgICAgICAgICAgYWxsQ2VsbHMucHVzaChnLmNlbGxzW2pdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFuaW1hdGVTdXJwcmlzZShhbGxDZWxscyk7CiAgICAgIGF3YWl0IHNsZWVwKDE4MCk7CgogICAgICAvLyBjbGVhciBtYXRjaGVkLCBrZWVwIHNwYXduIGNlbGwKICAgICAgdmFyIHNwYXduS2V5ID0gc3Bhd24uYXQgPyBzcGF3bi5hdFswXSArICIsIiArIHNwYXduLmF0WzFdIDogIiI7CiAgICAgIHZhciBjbGVhcmVkU3BlY2lhbHMgPSBbXTsKICAgICAgZm9yICh2YXIgY2kgPSAwOyBjaSA8IGFsbENlbGxzLmxlbmd0aDsgY2krKykgewogICAgICAgIHZhciByciA9IGFsbENlbGxzW2NpXVswXSwgY2MgPSBhbGxDZWxsc1tjaV1bMV07CiAgICAgICAgdmFyIHRpbGUgPSBncmlkW3JyXVtjY107CiAgICAgICAgaWYgKHRpbGUuc3BlY2lhbCAmJiAocnIgKyAiLCIgKyBjYykgIT09IHNwYXduS2V5KSB7CiAgICAgICAgICBjbGVhcmVkU3BlY2lhbHMucHVzaCh7cjogcnIsIGM6IGNjLCBzcDogdGlsZS5zcGVjaWFsLCB0eXBlOiB0aWxlLnR5cGV9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGRhbWFnZUFkamFjZW50KGFsbENlbGxzKTsKCiAgICAgIGZvciAodmFyIGNpMiA9IDA7IGNpMiA8IGFsbENlbGxzLmxlbmd0aDsgY2kyKyspIHsKICAgICAgICB2YXIgcjUgPSBhbGxDZWxsc1tjaTJdWzBdLCBjNSA9IGFsbENlbGxzW2NpMl1bMV07CiAgICAgICAgaWYgKChyNSArICIsIiArIGM1KSA9PT0gc3Bhd25LZXkpIGNvbnRpbnVlOwogICAgICAgIGNvbGxlY3RDbGVhcmVkKHI1LCBjNSk7CiAgICAgICAgdmFyIHNwS2VlcCA9IGdyaWRbcjVdW2M1XS5zcGVjaWFsOwogICAgICAgIGdyaWRbcjVdW2M1XS50eXBlID0gLTE7CiAgICAgICAgZ3JpZFtyNV1bYzVdLnNwZWNpYWwgPSBudWxsOwogICAgICAgIGdyaWRbcjVdW2M1XS5wb3AgPSAwOwogICAgICB9CgogICAgICAvLyB0cmlnZ2VyIHNwZWNpYWxzIHRoYXQgd2VyZSBpbiB0aGUgbWF0Y2gKICAgICAgZm9yICh2YXIgc2kgPSAwOyBzaSA8IGNsZWFyZWRTcGVjaWFscy5sZW5ndGg7IHNpKyspIHsKICAgICAgICBzcGVjaWFsUXVldWUucHVzaChjbGVhcmVkU3BlY2lhbHNbc2ldKTsKICAgICAgfQoKICAgICAgaWYgKHNwYXduLmtpbmQgJiYgc3Bhd24uYXQpIHsKICAgICAgICB2YXIgc3IgPSBzcGF3bi5hdFswXSwgc2MgPSBzcGF3bi5hdFsxXTsKICAgICAgICBncmlkW3NyXVtzY10udHlwZSA9IHNwYXduLnR5cGU7CiAgICAgICAgZ3JpZFtzcl1bc2NdLnNwZWNpYWwgPSBzcGF3bi5raW5kOwogICAgICAgIGdyaWRbc3JdW3NjXS5nbG93ID0gMTsKICAgICAgICBncmlkW3NyXVtzY10ucG9wID0gMDsKICAgICAgICBncmlkW3NyXVtzY10uc2NhbGUgPSAxLjM7CiAgICAgIH0KCiAgICAgIHByb2Nlc3NTcGVjaWFsUXVldWUobXVsdCk7CiAgICAgIGF3YWl0IHNsZWVwKDEyMCk7CiAgICAgIGF3YWl0IGNvbGxhcHNlQW5kUmVmaWxsKCk7CiAgICAgIGF3YWl0IHNsZWVwKDYwKTsKICAgIH0KICAgIGNvbWJvID0gMDsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIGRvU3dhcChyMSwgYzEsIHIyLCBjMikgewogICAgaWYgKGJ1c3kpIHJldHVybjsKICAgIGlmICghaW5Cb3VuZHMocjEsIGMxKSB8fCAhaW5Cb3VuZHMocjIsIGMyKSkgcmV0dXJuOwogICAgaWYgKE1hdGguYWJzKHIxIC0gcjIpICsgTWF0aC5hYnMoYzEgLSBjMikgIT09IDEpIHJldHVybjsKICAgIHZhciBhID0gZ3JpZFtyMV1bYzFdLCBiID0gZ3JpZFtyMl1bYzJdOwogICAgaWYgKGEub2JzdGFjbGUgfHwgYi5vYnN0YWNsZSkgcmV0dXJuOwogICAgaWYgKGEudHlwZSA8IDAgfHwgYi50eXBlIDwgMCkgcmV0dXJuOwoKICAgIGJ1c3kgPSB0cnVlOwogICAgc2VsZWN0ZWQgPSBudWxsOwogICAgaGludENlbGxzID0gbnVsbDsKCiAgICAvLyBhbmltYXRlIHN3YXAKICAgIHZhciB0bXAgPSBncmlkW3IxXVtjMV07CiAgICBncmlkW3IxXVtjMV0gPSBncmlkW3IyXVtjMl07CiAgICBncmlkW3IyXVtjMl0gPSB0bXA7CgogICAgdmFyIHZhbGlkID0gZmFsc2U7CiAgICB2YXIgYTIgPSBncmlkW3IxXVtjMV0sIGIyID0gZ3JpZFtyMl1bYzJdOwogICAgaWYgKChhMi5zcGVjaWFsICYmIGIyLnNwZWNpYWwpIHx8IGEyLnNwZWNpYWwgPT09ICJyYWluYm93IiB8fCBiMi5zcGVjaWFsID09PSAicmFpbmJvdyIpIHsKICAgICAgdmFsaWQgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgdmFyIG0gPSBmaW5kTWF0Y2hlcyhncmlkKTsKICAgICAgdmFsaWQgPSBtLmdyb3Vwcy5sZW5ndGggPiAwOwogICAgfQoKICAgIGlmICghdmFsaWQpIHsKICAgICAgYXdhaXQgc2xlZXAoMTIwKTsKICAgICAgdmFyIHRtcDIgPSBncmlkW3IxXVtjMV07CiAgICAgIGdyaWRbcjFdW2MxXSA9IGdyaWRbcjJdW2MyXTsKICAgICAgZ3JpZFtyMl1bYzJdID0gdG1wMjsKICAgICAgYnVzeSA9IGZhbHNlOwogICAgICByZXR1cm47CiAgICB9CgogICAgbW92ZXNMZWZ0LS07CiAgICBpZiAoYTIuc3BlY2lhbCAmJiBiMi5zcGVjaWFsIHx8IGEyLnNwZWNpYWwgPT09ICJyYWluYm93IiB8fCBiMi5zcGVjaWFsID09PSAicmFpbmJvdyIpIHsKICAgICAgaWYgKGEyLnNwZWNpYWwgJiYgYjIuc3BlY2lhbCkgewogICAgICAgIHJlc29sdmVTcGVjaWFsQ29tYm8ocjEsIGMxLCByMiwgYzIpOwogICAgICAgIHByb2Nlc3NTcGVjaWFsUXVldWUoMSk7CiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKTsKICAgICAgICBhd2FpdCBjb2xsYXBzZUFuZFJlZmlsbCgpOwogICAgICB9IGVsc2UgaWYgKGEyLnNwZWNpYWwgPT09ICJyYWluYm93IiB8fCBiMi5zcGVjaWFsID09PSAicmFpbmJvdyIpIHsKICAgICAgICB2YXIgcnIgPSBhMi5zcGVjaWFsID09PSAicmFpbmJvdyIgPyByMSA6IHIyOwogICAgICAgIHZhciBjYyA9IGEyLnNwZWNpYWwgPT09ICJyYWluYm93IiA\/IGMxIDogYzI7CiAgICAgICAgdmFyIG90aGVyID0gYTIuc3BlY2lhbCA9PT0gInJhaW5ib3ciID8gYjIgOiBhMjsKICAgICAgICB2YXIgdGFyZ2V0VHlwZSA9IG90aGVyLnR5cGU7CiAgICAgICAgY29sbGVjdENsZWFyZWQocnIsIGNjKTsKICAgICAgICBncmlkW3JyXVtjY10udHlwZSA9IC0xOwogICAgICAgIGdyaWRbcnJdW2NjXS5zcGVjaWFsID0gbnVsbDsKICAgICAgICBzcGVjaWFsUXVldWUucHVzaCh7cjogcnIsIGM6IGNjLCBzcDogInJhaW5ib3ciLCB0YXJnZXRUeXBlOiB0YXJnZXRUeXBlfSk7CiAgICAgICAgcHJvY2Vzc1NwZWNpYWxRdWV1ZSgxKTsKICAgICAgICBhd2FpdCBzbGVlcCgxMDApOwogICAgICAgIGF3YWl0IGNvbGxhcHNlQW5kUmVmaWxsKCk7CiAgICAgIH0KICAgIH0KCiAgICBhd2FpdCByZXNvbHZlTWF0Y2hlcyh0cnVlKTsKCiAgICBpZiAoZ29hbHNEb25lKCkpIHsKICAgICAgZmluaXNoTGV2ZWwodHJ1ZSk7CiAgICB9IGVsc2UgaWYgKG1vdmVzTGVmdCA8PSAwKSB7CiAgICAgIGZpbmlzaExldmVsKGZhbHNlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIHNodWZmbGUgaWYgbm8gbW92ZXMKICAgICAgaWYgKCFmaW5kSGludCgpKSB7CiAgICAgICAgYXdhaXQgc2h1ZmZsZUJvYXJkKCk7CiAgICAgIH0KICAgIH0KICAgIGJ1c3kgPSBmYWxzZTsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIHNodWZmbGVCb2FyZCgpIHsKICAgIHNldEZsYXNoKCJTaHVmZmxpbmcuLi4iKTsKICAgIHZhciBjYXRzID0gW107CiAgICBmb3IgKHZhciByID0gMDsgciA8IEdSSUQ7IHIrKykKICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBHUklEOyBjKyspCiAgICAgICAgaWYgKGdyaWRbcl1bY10udHlwZSA+PSAwICYmIGdyaWRbcl1bY10ub2JzdGFjbGUgIT09ICJjYXJyaWVyIikKICAgICAgICAgIGNhdHMucHVzaCh7dHlwZTogZ3JpZFtyXVtjXS50eXBlLCBzcGVjaWFsOiBncmlkW3JdW2NdLnNwZWNpYWx9KTsKICAgIHNodWZmbGUoY2F0cyk7CiAgICB2YXIgaSA9IDA7CiAgICBmb3IgKHZhciByMiA9IDA7IHIyIDwgR1JJRDsgcjIrKykKICAgICAgZm9yICh2YXIgYzIgPSAwOyBjMiA8IEdSSUQ7IGMyKyspCiAgICAgICAgaWYgKGdyaWRbcjJdW2MyXS5vYnN0YWNsZSAhPT0gImNhcnJpZXIiICYmIGdyaWRbcjJdW2MyXS50eXBlID49IDApIHsKICAgICAgICAgIGdyaWRbcjJdW2MyXS50eXBlID0gY2F0c1tpXS50eXBlOwogICAgICAgICAgZ3JpZFtyMl1bYzJdLnNwZWNpYWwgPSBjYXRzW2ldLnNwZWNpYWw7CiAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgYXdhaXQgc2xlZXAoNDAwKTsKICB9CgogIGZ1bmN0aW9uIHN0YXJDb3VudChzYywgdGhyZXNob2xkcykgewogICAgaWYgKHNjID49IHRocmVzaG9sZHNbMl0pIHJldHVybiAzOwogICAgaWYgKHNjID49IHRocmVzaG9sZHNbMV0pIHJldHVybiAyOwogICAgaWYgKHNjID49IHRocmVzaG9sZHNbMF0pIHJldHVybiAxOwogICAgcmV0dXJuIDA7CiAgfQoKICBmdW5jdGlvbiBmaW5pc2hMZXZlbCh3b24pIHsKICAgIGJ1c3kgPSB0cnVlOwogICAgc3RhdGUgPSB3b24gPyAid2luIiA6ICJsb3NlIjsKICAgIGlmICh3b24pIHsKICAgICAgdmFyIGx2ID0gTEVWRUxTW2xldmVsSW5kZXhdOwogICAgICBzdGFyc0Vhcm5lZCA9IE1hdGgubWF4KDEsIHN0YXJDb3VudChzY29yZSwgbHYuc3RhcnMpKTsKICAgICAgdmFyIHByZXYgPSBiZXN0U3RhcnNbbGV2ZWxJbmRleF0gfHwgMDsKICAgICAgaWYgKHN0YXJzRWFybmVkID4gcHJldikgewogICAgICAgIGJlc3RTdGFyc1tsZXZlbEluZGV4XSA9IHN0YXJzRWFybmVkOwogICAgICAgIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjYXRNYXRjaFN0YXJzIiwgSlNPTi5zdHJpbmdpZnkoYmVzdFN0YXJzKSk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0KICAgICAgaWYgKHdpblN0YXJzKSB3aW5TdGFycy50ZXh0Q29udGVudCA9IFsiIiwgIioiLCAiKioiLCAiKioqIl1bc3RhcnNFYXJuZWRdOwogICAgICBpZiAod2luTXNnKSB3aW5Nc2cudGV4dENvbnRlbnQgPSAiU2NvcmUgIiArIHNjb3JlICsgIiB8ICIgKyBzdGFyc0Vhcm5lZCArICIgc3RhciIgKyAoc3RhcnNFYXJuZWQgPiAxID8gInMiIDogIiIpOwogICAgICBzaG93Q2FyZCh3aW5DYXJkKTsKICAgIH0gZWxzZSB7CiAgICAgIHNob3dDYXJkKGxvc2VDYXJkKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNob3dDYXJkKGNhcmQpIHsKICAgIGlmIChvdmVybGF5RWwpIG92ZXJsYXlFbC5oaWRkZW4gPSBmYWxzZTsKICAgIHZhciBjYXJkcyA9IFt0aXRsZUNhcmQsIGxldmVsQ2FyZCwgd2luQ2FyZCwgbG9zZUNhcmQsIHBhdXNlQ2FyZF07CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhcmRzLmxlbmd0aDsgaSsrKSBpZiAoY2FyZHNbaV0pIGNhcmRzW2ldLmhpZGRlbiA9IHRydWU7CiAgICBpZiAoY2FyZCkgY2FyZC5oaWRkZW4gPSBmYWxzZTsKICAgIGlmIChvdmVybGF5RWwpIHsKICAgICAgdmFyIHRhcCA9IChjYXJkID09PSB0aXRsZUNhcmQgfHwgY2FyZCA9PT0gbGV2ZWxDYXJkKTsKICAgICAgaWYgKHRhcCkgb3ZlcmxheUVsLmNsYXNzTGlzdC5hZGQoImNtLXRhcHBsYXkiKTsKICAgICAgZWxzZSBvdmVybGF5RWwuY2xhc3NMaXN0LnJlbW92ZSgiY20tdGFwcGxheSIpOwogICAgICBvdmVybGF5RWwuc3R5bGUuY3Vyc29yID0gdGFwID8gInBvaW50ZXIiIDogIiI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoaWRlT3ZlcmxheSgpIHsKICAgIGlmIChvdmVybGF5RWwpIG92ZXJsYXlFbC5oaWRkZW4gPSB0cnVlOwogIH0KCiAgZnVuY3Rpb24gZ29hbFRleHQobHYpIHsKICAgIHZhciBwYXJ0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsdi5nb2Fscy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZyA9IGx2LmdvYWxzW2ldOwogICAgICBpZiAoZy5raW5kID09PSAiY29sbGVjdCIpIHBhcnRzLnB1c2goIkNvbGxlY3QgIiArIGcubmVlZCArICIgIiArIENBVF9OQU1FU1tnLnR5cGVdKTsKICAgICAgZWxzZSBpZiAoZy5raW5kID09PSAiYm94ZXMiKSBwYXJ0cy5wdXNoKCJDbGVhciAiICsgZy5uZWVkICsgIiBib3hlcyIpOwogICAgICBlbHNlIGlmIChnLmtpbmQgPT09ICJraXR0ZW5zIikgcGFydHMucHVzaCgiRnJlZSAiICsgZy5uZWVkICsgIiBraXR0ZW5zIik7CiAgICAgIGVsc2UgaWYgKGcua2luZCA9PT0gInlhcm4iKSBwYXJ0cy5wdXNoKCJDbGVhciAiICsgZy5uZWVkICsgIiB5YXJuIGJhbGxzIik7CiAgICB9CiAgICByZXR1cm4gcGFydHMuam9pbigiIHwgIikgKyAiIHwgIiArIGx2Lm1vdmVzICsgIiBtb3ZlcyI7CiAgfQoKICBmdW5jdGlvbiBzdGFydExldmVsKGlkeCkgewogICAgbGV2ZWxJbmRleCA9IGlkeDsKICAgIHZhciBsdiA9IExFVkVMU1tpZHhdOwogICAgbW92ZXNMZWZ0ID0gbHYubW92ZXM7CiAgICBzY29yZSA9IDA7CiAgICBjb21ibyA9IDA7CiAgICBnb2FscyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsdi5nb2Fscy5sZW5ndGg7IGkrKykgewogICAgICBnb2Fscy5wdXNoKHtraW5kOiBsdi5nb2Fsc1tpXS5raW5kLCB0eXBlOiBsdi5nb2Fsc1tpXS50eXBlLCBuZWVkOiBsdi5nb2Fsc1tpXS5uZWVkLCBoYXZlOiAwfSk7CiAgICB9CiAgICBmaWxsQm9hcmROb01hdGNoZXMoKTsKICAgIGlmIChsdi5sYXlvdXQpIGFwcGx5TGF5b3V0KGx2LmxheW91dCk7CiAgICAvLyBlbnN1cmUgbm8gaW1tZWRpYXRlIG1hdGNoZXMgYWZ0ZXIgbGF5b3V0CiAgICB2YXIgZ3VhcmQgPSAwOwogICAgd2hpbGUgKGZpbmRNYXRjaGVzKGdyaWQpLmdyb3Vwcy5sZW5ndGggPiAwICYmIGd1YXJkKysgPCAxMCkgewogICAgICBmaWxsQm9hcmROb01hdGNoZXMoKTsKICAgICAgaWYgKGx2LmxheW91dCkgYXBwbHlMYXlvdXQobHYubGF5b3V0KTsKICAgIH0KICAgIHNlbGVjdGVkID0gbnVsbDsKICAgIGhpbnRDZWxscyA9IG51bGw7CiAgICBidXN5ID0gZmFsc2U7CiAgICBzdGF0ZSA9ICJwbGF5IjsKICAgIGhpZGVPdmVybGF5KCk7CiAgICBpZiAocGF1c2VCdG4pIHBhdXNlQnRuLmhpZGRlbiA9IGZhbHNlOwogICAgaWYgKGV4aXRCdG4pIGV4aXRCdG4uaGlkZGVuID0gZmFsc2U7CiAgICBpZiAoaGludEJ0bikgaGludEJ0bi5oaWRkZW4gPSBmYWxzZTsKICAgIHVwZGF0ZUhpbnRCdG4oKTsKICAgIGZpdENhbnZhcygpOwogIH0KCiAgZnVuY3Rpb24gc2hvd0xldmVsSW50cm8oaWR4KSB7CiAgICBsZXZlbEluZGV4ID0gaWR4OwogICAgdmFyIGx2ID0gTEVWRUxTW2lkeF07CiAgICBpZiAobGV2ZWxUaXRsZSkgbGV2ZWxUaXRsZS50ZXh0Q29udGVudCA9ICJMZXZlbCAiICsgKGlkeCArIDEpOwogICAgaWYgKGxldmVsR29hbCkgbGV2ZWxHb2FsLmlubmVySFRNTCA9ICI8Yj4iICsgZ29hbFRleHQobHYpICsgIjwvYj48YnI+IiArIChsdi50aXAgfHwgIiIpOwogICAgc2hvd0NhcmQobGV2ZWxDYXJkKTsKICAgIHN0YXRlID0gImxldmVsIjsKICAgIGlmIChoaW50QnRuKSBoaW50QnRuLmhpZGRlbiA9IGZhbHNlOwogICAgdXBkYXRlSGludEJ0bigpOwogICAgZml0Q2FudmFzKCk7CiAgfQoKICAvKiA9PT09PSBJTlBVVCA9PT09PSAqLwogIGZ1bmN0aW9uIGNhbnZhc1BvcyhlKSB7CiAgICB2YXIgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIHZhciBjbGllbnRYID0gZS5jbGllbnRYLCBjbGllbnRZID0gZS5jbGllbnRZOwogICAgaWYgKGUudG91Y2hlcyAmJiBlLnRvdWNoZXMubGVuZ3RoKSB7CiAgICAgIGNsaWVudFggPSBlLnRvdWNoZXNbMF0uY2xpZW50WDsKICAgICAgY2xpZW50WSA9IGUudG91Y2hlc1swXS5jbGllbnRZOwogICAgfSBlbHNlIGlmIChlLmNoYW5nZWRUb3VjaGVzICYmIGUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoKSB7CiAgICAgIGNsaWVudFggPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7CiAgICAgIGNsaWVudFkgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFk7CiAgICB9CiAgICByZXR1cm4gewogICAgICB4OiAoY2xpZW50WCAtIHJlY3QubGVmdCkgKiAoVyAvIHJlY3Qud2lkdGgpLAogICAgICB5OiAoY2xpZW50WSAtIHJlY3QudG9wKSAqIChIIC8gcmVjdC5oZWlnaHQpCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gY2VsbEF0KHgsIHkpIHsKICAgIHZhciBjeCA9IE1hdGguZmxvb3IoKHggLSBib2FyZFgpIC8gY2VsbCk7CiAgICB2YXIgY3kgPSBNYXRoLmZsb29yKCh5IC0gYm9hcmRZKSAvIGNlbGwpOwogICAgaWYgKGN4IDwgMCB8fCBjeSA8IDAgfHwgY3ggPj0gR1JJRCB8fCBjeSA+PSBHUklEKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBbY3ksIGN4XTsKICB9CgogIGZ1bmN0aW9uIG9uRG93bihlKSB7CiAgICBpZiAoc3RhdGUgIT09ICJwbGF5IiB8fCBidXN5KSByZXR1cm47CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB2YXIgcCA9IGNhbnZhc1BvcyhlKTsKICAgIHZhciBjZWxsUG9zID0gY2VsbEF0KHAueCwgcC55KTsKICAgIGlmICghY2VsbFBvcykgcmV0dXJuOwogICAgZHJhZ1N0YXJ0ID0ge3I6IGNlbGxQb3NbMF0sIGM6IGNlbGxQb3NbMV0sIHg6IHAueCwgeTogcC55fTsKICAgIHBvaW50ZXJJZCA9IGUucG9pbnRlcklkOwogIH0KCiAgZnVuY3Rpb24gb25Nb3ZlKGUpIHsKICAgIGlmICghZHJhZ1N0YXJ0IHx8IHN0YXRlICE9PSAicGxheSIgfHwgYnVzeSkgcmV0dXJuOwogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgdmFyIHAgPSBjYW52YXNQb3MoZSk7CiAgICB2YXIgZHggPSBwLnggLSBkcmFnU3RhcnQueCwgZHkgPSBwLnkgLSBkcmFnU3RhcnQueTsKICAgIHZhciB0aHIgPSBNYXRoLm1heCgxMiwgY2VsbCAqIDAuMjgpOwogICAgaWYgKE1hdGguYWJzKGR4KSA8IHRociAmJiBNYXRoLmFicyhkeSkgPCB0aHIpIHJldHVybjsKICAgIHZhciBuciA9IGRyYWdTdGFydC5yLCBuYyA9IGRyYWdTdGFydC5jOwogICAgaWYgKE1hdGguYWJzKGR4KSA+IE1hdGguYWJzKGR5KSkgbmMgKz0gZHggPiAwID8gMSA6IC0xOwogICAgZWxzZSBuciArPSBkeSA+IDAgPyAxIDogLTE7CiAgICB2YXIgc3IgPSBkcmFnU3RhcnQuciwgc2MgPSBkcmFnU3RhcnQuYzsKICAgIGRyYWdTdGFydCA9IG51bGw7CiAgICBkb1N3YXAoc3IsIHNjLCBuciwgbmMpOwogIH0KCiAgZnVuY3Rpb24gb25VcChlKSB7CiAgICBpZiAoc3RhdGUgIT09ICJwbGF5IiB8fCBidXN5KSB7IGRyYWdTdGFydCA9IG51bGw7IHJldHVybjsgfQogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgdmFyIHAgPSBjYW52YXNQb3MoZSk7CiAgICBpZiAoZHJhZ1N0YXJ0KSB7CiAgICAgIHZhciBjZWxsUG9zID0gY2VsbEF0KHAueCwgcC55KTsKICAgICAgdmFyIGR4ID0gcC54IC0gZHJhZ1N0YXJ0LngsIGR5ID0gcC55IC0gZHJhZ1N0YXJ0Lnk7CiAgICAgIGlmIChNYXRoLmFicyhkeCkgPCBNYXRoLm1heCgxMCwgY2VsbCAqIDAuMikgJiYgTWF0aC5hYnMoZHkpIDwgTWF0aC5tYXgoMTAsIGNlbGwgKiAwLjIpICYmIGNlbGxQb3MpIHsKICAgICAgICAvLyBjbGljay1jbGljayBzZWxlY3QKICAgICAgICBpZiAoc2VsZWN0ZWQgJiYgc2VsZWN0ZWRbMF0gPT09IGNlbGxQb3NbMF0gJiYgc2VsZWN0ZWRbMV0gPT09IGNlbGxQb3NbMV0pIHsKICAgICAgICAgIHNlbGVjdGVkID0gbnVsbDsKICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkICYmIE1hdGguYWJzKHNlbGVjdGVkWzBdIC0gY2VsbFBvc1swXSkgKyBNYXRoLmFicyhzZWxlY3RlZFsxXSAtIGNlbGxQb3NbMV0pID09PSAxKSB7CiAgICAgICAgICB2YXIgc3IgPSBzZWxlY3RlZFswXSwgc2MgPSBzZWxlY3RlZFsxXTsKICAgICAgICAgIHNlbGVjdGVkID0gbnVsbDsKICAgICAgICAgIGRyYWdTdGFydCA9IG51bGw7CiAgICAgICAgICBkb1N3YXAoc3IsIHNjLCBjZWxsUG9zWzBdLCBjZWxsUG9zWzFdKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2VsZWN0ZWQgPSBjZWxsUG9zOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZHJhZ1N0YXJ0ID0gbnVsbDsKICB9CgogIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIG9uRG93bik7CiAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgb25Nb3ZlKTsKICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgb25VcCk7CiAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJjYW5jZWwiLCBmdW5jdGlvbiAoKSB7IGRyYWdTdGFydCA9IG51bGw7IH0pOwogIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgZnVuY3Rpb24gKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9LCB7cGFzc2l2ZTogZmFsc2V9KTsKCiAgLyogPT09PT0gUkVOREVSID09PT09ICovCiAgZnVuY3Rpb24gZHJhd0JvYXJkKCkgewogICAgZHJhd0JvYXJkR3JpZEJnKCk7CgogICAgdmFyIHQgPSBwZXJmb3JtYW5jZS5ub3coKSAvIDEwMDA7CiAgICBmb3IgKHZhciByMiA9IDA7IHIyIDwgR1JJRDsgcjIrKykgewogICAgICBmb3IgKHZhciBjMiA9IDA7IGMyIDwgR1JJRDsgYzIrKykgewogICAgICAgIHZhciB0aWxlID0gZ3JpZFtyMl1bYzJdOwogICAgICAgIHZhciB4ID0gYm9hcmRYICsgYzIgKiBjZWxsOwogICAgICAgIHZhciB5ID0gYm9hcmRZICsgcjIgKiBjZWxsIC0gKHRpbGUuZmFsbCB8fCAwKSAqIGNlbGw7CiAgICAgICAgdmFyIHNoYWtlWCA9IHRpbGUuc2hha2UgPyBNYXRoLnNpbih0ICogNDApICogMyA6IDA7CiAgICAgICAgaWYgKHRpbGUuc2hha2UpIHRpbGUuc2hha2UgPSBNYXRoLm1heCgwLCB0aWxlLnNoYWtlIC0gMC4zKTsKCiAgICAgICAgaWYgKHRpbGUub2JzdGFjbGUgJiYgdGlsZS5vYnN0YWNsZSAhPT0gImNhcnJpZXIiKSB7CiAgICAgICAgICAvLyBkcmF3IGNhdCB1bmRlciBvYnN0YWNsZSBpZiBhbnk\/IGJveGVzIHNpdCBvbiB0b3Agb2YgY2F0cyBpbiBDQyAtIHdlIGtlZXAgY2F0IHVuZGVyCiAgICAgICAgfQoKICAgICAgICBpZiAodGlsZS50eXBlID49IDApIHsKICAgICAgICAgIHZhciBwYWNrID0gc3ByaXRlc1t0aWxlLnR5cGVdOwogICAgICAgICAgdmFyIHNwciA9IHBhY2suaGFwcHk7CiAgICAgICAgICBpZiAodGlsZS5wb3ApIHNwciA9IHBhY2suc3VycHJpc2U7CiAgICAgICAgICBlbHNlIGlmICh0aWxlLndpbmtVbnRpbCAmJiB0IDwgdGlsZS53aW5rVW50aWwpIHNwciA9IHBhY2sud2luazsKICAgICAgICAgIHZhciBzYyA9IHRpbGUuc2NhbGUgfHwgMTsKICAgICAgICAgIHZhciBwYWQgPSBNYXRoLm1heCgyLCBNYXRoLmZsb29yKGNlbGwgKiAwLjA2KSk7CiAgICAgICAgICB2YXIgc3ogPSAoY2VsbCAtIHBhZCAqIDIpICogc2M7CiAgICAgICAgICB2YXIgb3ggPSB4ICsgcGFkICsgKGNlbGwgLSBwYWQgKiAyIC0gc3opIC8gMiArIHNoYWtlWDsKICAgICAgICAgIHZhciBveSA9IHkgKyBwYWQgKyAoY2VsbCAtIHBhZCAqIDIgLSBzeikgLyAyOwogICAgICAgICAgaWYgKGhpbnRzT24gJiYgaGludENlbGxzKSB7CiAgICAgICAgICAgIGZvciAodmFyIGggPSAwOyBoIDwgaGludENlbGxzLmxlbmd0aDsgaCsrKSB7CiAgICAgICAgICAgICAgaWYgKGhpbnRDZWxsc1toXVswXSA9PT0gcjIgJiYgaGludENlbGxzW2hdWzFdID09PSBjMikgewogICAgICAgICAgICAgICAgb3ggKz0gTWF0aC5zaW4odCAqIDgpICogMzsKICAgICAgICAgICAgICAgIG95ICs9IE1hdGguYWJzKE1hdGguc2luKHQgKiA4KSkgKiAtMjsKICAgICAgICAgICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAicmdiYSgyNTUsMjIwLDgwLDAuODUpIjsKICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSAyLjU7CiAgICAgICAgICAgICAgICByb3VuZFJlY3QoY3R4LCB4ICsgMSwgeSArIDEsIGNlbGwgLSAyLCBjZWxsIC0gMiwgOCk7CiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7CiAgICAgICAgICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY3R4LmRyYXdJbWFnZShzcHIsIG94LCBveSwgc3osIHN6KTsKICAgICAgICAgIGlmICh0aWxlLnNwZWNpYWwgJiYgc3BlY2lhbFNwcml0ZXNbdGlsZS5zcGVjaWFsXSkgewogICAgICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSAwLjg1ICsgMC4xNSAqIE1hdGguc2luKHQgKiA0KTsKICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShzcGVjaWFsU3ByaXRlc1t0aWxlLnNwZWNpYWxdLCBveCwgb3ksIHN6LCBzeik7CiAgICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IDE7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc2VsZWN0ZWQgJiYgc2VsZWN0ZWRbMF0gPT09IHIyICYmIHNlbGVjdGVkWzFdID09PSBjMikgewogICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAiI2ZmODA0MCI7CiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSAzOwogICAgICAgICAgICByb3VuZFJlY3QoY3R4LCB4ICsgMiwgeSArIDIsIGNlbGwgLSA0LCBjZWxsIC0gNCwgOCk7CiAgICAgICAgICAgIGN0eC5zdHJva2UoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh0aWxlLm9ic3RhY2xlKSB7CiAgICAgICAgICB2YXIgb3MgPSBvYnN0YWNsZVNwcml0ZXNbdGlsZS5vYnN0YWNsZSA9PT0gImJveDIiID8gImJveDIiIDogdGlsZS5vYnN0YWNsZV07CiAgICAgICAgICBpZiAob3MpIHsKICAgICAgICAgICAgdmFyIG9wID0gdGlsZS5vYnN0YWNsZSA9PT0gImNhcnJpZXIiID8gMiA6IDY7CiAgICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IHRpbGUub2JzdGFjbGUgPT09ICJjYXJyaWVyIiA\/IDEgOiAwLjkyOwogICAgICAgICAgICBjdHguZHJhd0ltYWdlKG9zLCB4ICsgb3AgKyBzaGFrZVgsIHkgKyBvcCwgY2VsbCAtIG9wICogMiwgY2VsbCAtIG9wICogMik7CiAgICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkcmF3SFVEKCkgewogICAgdmFyIGx2ID0gTEVWRUxTW2xldmVsSW5kZXhdOwogICAgdmFyIHNjbiA9IHN0YXJDb3VudChzY29yZSwgbHYuc3RhcnMpOwogICAgdmFyIGdvYWxCaXRzID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdvYWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBnID0gZ29hbHNbaV07CiAgICAgIHZhciBsYWJlbCA9ICIiOwogICAgICBpZiAoZy5raW5kID09PSAiY29sbGVjdCIpIGxhYmVsID0gQ0FUX05BTUVTW2cudHlwZV07CiAgICAgIGVsc2UgaWYgKGcua2luZCA9PT0gImJveGVzIikgbGFiZWwgPSAiQm94ZXMiOwogICAgICBlbHNlIGlmIChnLmtpbmQgPT09ICJraXR0ZW5zIikgbGFiZWwgPSAiS2l0dGVucyI7CiAgICAgIGVsc2UgaWYgKGcua2luZCA9PT0gInlhcm4iKSBsYWJlbCA9ICJZYXJuIjsKICAgICAgZ29hbEJpdHMucHVzaCh7bGFiZWw6IGxhYmVsLCBoYXZlOiBnLmhhdmUgfHwgMCwgbmVlZDogZy5uZWVkLCBkb25lOiAoZy5oYXZlIHx8IDApID49IGcubmVlZH0pOwogICAgfQogICAgdmFyIHN0YXJzVHh0ID0gWyIiLCAiKiIsICIqKiIsICIqKioiXVtzY25dOwoKICAgIGlmIChodWRNb2RlID09PSAic2lkZSIpIHsKICAgICAgdmFyIHBhbmVsVyA9IE1hdGgubWF4KDEwMCwgYm9hcmRYIC0gYm9hcmRQYWQgLSA2KTsKICAgICAgdmFyIHBhbmVsSCA9IE1hdGgubWluKEggLSA4LCBib2FyZFNpemVTYWZlKCkpOwogICAgICB2YXIgcHggPSA0LCBweSA9IE1hdGgubWF4KDQsIGJvYXJkWSAtIGJvYXJkUGFkKTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDI4LDE2LDEwLDAuOSkiOwogICAgICByb3VuZFJlY3QoY3R4LCBweCwgcHksIHBhbmVsVywgcGFuZWxILCAxNCk7CiAgICAgIGN0eC5maWxsKCk7CiAgICAgIHZhciBmc1RpdGxlID0gTWF0aC5taW4oMjIsIE1hdGgubWF4KDE0LCBNYXRoLmZsb29yKEggKiAwLjA0NSkpKTsKICAgICAgdmFyIGZzU2NvcmUgPSBNYXRoLm1pbigzNiwgTWF0aC5tYXgoMjIsIE1hdGguZmxvb3IoSCAqIDAuMDcpKSk7CiAgICAgIHZhciBmc0JvZHkgPSBNYXRoLm1pbigxOCwgTWF0aC5tYXgoMTMsIE1hdGguZmxvb3IoSCAqIDAuMDM4KSkpOwogICAgICBjdHgudGV4dEFsaWduID0gImxlZnQiOwogICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmY0ZTAiOwogICAgICBjdHguZm9udCA9ICJib2xkICIgKyBmc1RpdGxlICsgInB4IFRyZWJ1Y2hldCBNUyxzYW5zLXNlcmlmIjsKICAgICAgY3R4LmZpbGxUZXh0KCJMZXZlbCAiICsgKGxldmVsSW5kZXggKyAxKSwgcHggKyAxNCwgcHkgKyBmc1RpdGxlICsgMTApOwogICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmIwNjAiOwogICAgICBjdHguZm9udCA9ICJib2xkICIgKyBmc1Njb3JlICsgInB4IFRyZWJ1Y2hldCBNUyxzYW5zLXNlcmlmIjsKICAgICAgY3R4LmZpbGxUZXh0KFN0cmluZyhzY29yZSksIHB4ICsgMTQsIHB5ICsgZnNUaXRsZSArIGZzU2NvcmUgKyAyNCk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2Q4YzBhMCI7CiAgICAgIGN0eC5mb250ID0gZnNCb2R5ICsgInB4IFRyZWJ1Y2hldCBNUyxzYW5zLXNlcmlmIjsKICAgICAgY3R4LmZpbGxUZXh0KCJTY29yZSIsIHB4ICsgMTQsIHB5ICsgZnNUaXRsZSArIGZzU2NvcmUgKyAyNCArIGZzQm9keSArIDQpOwogICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmY0ZTAiOwogICAgICBjdHguZm9udCA9ICJib2xkICIgKyBmc1RpdGxlICsgInB4IFRyZWJ1Y2hldCBNUyxzYW5zLXNlcmlmIjsKICAgICAgY3R4LmZpbGxUZXh0KCJNb3ZlcyIsIHB4ICsgMTQsIHB5ICsgTWF0aC5mbG9vcihwYW5lbEggKiAwLjQyKSk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmZDlhMCI7CiAgICAgIGN0eC5mb250ID0gImJvbGQgIiArIGZzU2NvcmUgKyAicHggVHJlYnVjaGV0IE1TLHNhbnMtc2VyaWYiOwogICAgICBjdHguZmlsbFRleHQoU3RyaW5nKG1vdmVzTGVmdCksIHB4ICsgMTQsIHB5ICsgTWF0aC5mbG9vcihwYW5lbEggKiAwLjQyKSArIGZzU2NvcmUgKyA2KTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZlMGIwIjsKICAgICAgY3R4LmZvbnQgPSAiYm9sZCAiICsgZnNCb2R5ICsgInB4IFRyZWJ1Y2hldCBNUyxzYW5zLXNlcmlmIjsKICAgICAgY3R4LmZpbGxUZXh0KCJHb2FscyIsIHB4ICsgMTQsIHB5ICsgTWF0aC5mbG9vcihwYW5lbEggKiAwLjY4KSk7CiAgICAgIHZhciBneSA9IHB5ICsgTWF0aC5mbG9vcihwYW5lbEggKiAwLjY4KSArIGZzQm9keSArIDE0OwogICAgICBmb3IgKHZhciBnaSA9IDA7IGdpIDwgZ29hbEJpdHMubGVuZ3RoOyBnaSsrKSB7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGdvYWxCaXRzW2dpXS5kb25lID8gIiM4MGUwODAiIDogIiNmZmY0ZTAiOwogICAgICAgIGN0eC5mb250ID0gZnNCb2R5ICsgInB4IFRyZWJ1Y2hldCBNUyxzYW5zLXNlcmlmIjsKICAgICAgICBjdHguZmlsbFRleHQoZ29hbEJpdHNbZ2ldLmxhYmVsICsgIiAgIiArIGdvYWxCaXRzW2dpXS5oYXZlICsgIi8iICsgZ29hbEJpdHNbZ2ldLm5lZWQsIHB4ICsgMTQsIGd5KTsKICAgICAgICBneSArPSBmc0JvZHkgKyAxMDsKICAgICAgfQogICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmQwNzAiOwogICAgICBjdHguZm9udCA9IE1hdGgubWF4KDE4LCBmc1RpdGxlKSArICJweCBzZXJpZiI7CiAgICAgIGN0eC5maWxsVGV4dChzdGFyc1R4dCwgcHggKyAxNCwgcHkgKyBwYW5lbEggLSAxNik7CiAgICB9IGVsc2UgewogICAgICAvLyBQb3J0cmFpdDogdG9wIHN0cmlwICsgYm90dG9tIGdvYWxzIHBhbmVsIGZpbGxpbmcgbGVmdG92ZXIKICAgICAgdmFyIHRvcEggPSBNYXRoLm1heCg0OCwgYm9hcmRZIC0gNCk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAicmdiYSgyOCwxNiwxMCwwLjkyKSI7CiAgICAgIHJvdW5kUmVjdChjdHgsIDQsIDIsIFcgLSA4LCB0b3BILCAxMik7CiAgICAgIGN0eC5maWxsKCk7CiAgICAgIHZhciBmcyA9IE1hdGgubWF4KDEzLCBNYXRoLmZsb29yKHRvcEggKiAwLjI4KSk7CiAgICAgIHZhciBmc0JpZyA9IE1hdGgubWF4KDE2LCBNYXRoLmZsb29yKHRvcEggKiAwLjM2KSk7CiAgICAgIHZhciB5MSA9IDIgKyBNYXRoLmZsb29yKHRvcEggKiAwLjQyKTsKICAgICAgdmFyIHkyID0gMiArIE1hdGguZmxvb3IodG9wSCAqIDAuNzgpOwogICAgICB2YXIgYzEgPSAxMiwgYzIgPSBNYXRoLmZsb29yKFcgKiAwLjIyKSwgYzMgPSBNYXRoLmZsb29yKFcgKiAwLjQ4KTsKICAgICAgY3R4LnRleHRBbGlnbiA9ICJsZWZ0IjsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZmNGUwIjsKICAgICAgY3R4LmZvbnQgPSAiYm9sZCAiICsgZnMgKyAicHggVHJlYnVjaGV0IE1TLHNhbnMtc2VyaWYiOwogICAgICBjdHguZmlsbFRleHQoIkx2ICIgKyAobGV2ZWxJbmRleCArIDEpLCBjMSwgeTEpOwogICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmIwNjAiOwogICAgICBjdHguZm9udCA9ICJib2xkICIgKyBmc0JpZyArICJweCBUcmVidWNoZXQgTVMsc2Fucy1zZXJpZiI7CiAgICAgIGN0eC5maWxsVGV4dChTdHJpbmcoc2NvcmUpLCBjMiwgeTEpOwogICAgICBjdHguZmlsbFN0eWxlID0gIiNkOGMwYTAiOwogICAgICBjdHguZm9udCA9IE1hdGgubWF4KDEwLCBNYXRoLmZsb29yKHRvcEggKiAwLjIpKSArICJweCBUcmVidWNoZXQgTVMsc2Fucy1zZXJpZiI7CiAgICAgIGN0eC5maWxsVGV4dCgic2NvcmUiLCBjMiwgeTIpOwogICAgICBjdHguZmlsbFN0eWxlID0gIiNmZmY0ZTAiOwogICAgICBjdHguZm9udCA9ICJib2xkICIgKyBmcyArICJweCBUcmVidWNoZXQgTVMsc2Fucy1zZXJpZiI7CiAgICAgIGN0eC5maWxsVGV4dCgiTW92ZXMgIiArIG1vdmVzTGVmdCwgYzMsIHkxKTsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZkMDcwIjsKICAgICAgY3R4LmZvbnQgPSBNYXRoLm1heCgxNCwgZnMpICsgInB4IHNlcmlmIjsKICAgICAgY3R4LnRleHRBbGlnbiA9ICJyaWdodCI7CiAgICAgIGN0eC5maWxsVGV4dChzdGFyc1R4dCwgVyAtIDEwOCwgeTEpOwogICAgICBjdHgudGV4dEFsaWduID0gImxlZnQiOwoKICAgICAgdmFyIGJvdHRvbVRvcCA9IE1hdGgubWF4KGJvYXJkWSArIEdSSUQgKiBjZWxsICsgOCwgaGludEFuY2hvci55ICsgaGludEFuY2hvci5oICsgNik7CiAgICAgIGlmIChib3R0b21Ub3AgPCBIIC0gMzYpIHsKICAgICAgICB2YXIgYmggPSBIIC0gYm90dG9tVG9wIC0gNDsKICAgICAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMjgsMTYsMTAsMC45KSI7CiAgICAgICAgcm91bmRSZWN0KGN0eCwgNCwgYm90dG9tVG9wLCBXIC0gOCwgYmgsIDE0KTsKICAgICAgICBjdHguZmlsbCgpOwogICAgICAgIHZhciBnZnMgPSBNYXRoLm1pbigyMiwgTWF0aC5tYXgoMTQsIE1hdGguZmxvb3IoTWF0aC5taW4oYmggKiAwLjIyLCBXICogMC4wNDUpKSkpOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2ZmZTBiMCI7CiAgICAgICAgY3R4LmZvbnQgPSAiYm9sZCAiICsgZ2ZzICsgInB4IFRyZWJ1Y2hldCBNUyxzYW5zLXNlcmlmIjsKICAgICAgICBjdHguZmlsbFRleHQoIkdvYWxzIiwgMTYsIGJvdHRvbVRvcCArIGdmcyArIDEwKTsKICAgICAgICB2YXIgZ3ggPSAxNjsKICAgICAgICB2YXIgZ3kyID0gYm90dG9tVG9wICsgZ2ZzICogMiArIDI0OwogICAgICAgIGZvciAodmFyIGdqID0gMDsgZ2ogPCBnb2FsQml0cy5sZW5ndGg7IGdqKyspIHsKICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBnb2FsQml0c1tnal0uZG9uZSA\/ICIjODBlMDgwIiA6ICIjZmZmNGUwIjsKICAgICAgICAgIGN0eC5mb250ID0gImJvbGQgIiArIGdmcyArICJweCBUcmVidWNoZXQgTVMsc2Fucy1zZXJpZiI7CiAgICAgICAgICB2YXIgZ3R4dCA9IGdvYWxCaXRzW2dqXS5sYWJlbCArICIgICIgKyBnb2FsQml0c1tnal0uaGF2ZSArICIvIiArIGdvYWxCaXRzW2dqXS5uZWVkOwogICAgICAgICAgY3R4LmZpbGxUZXh0KGd0eHQsIGd4LCBneTIpOwogICAgICAgICAgZ3ggKz0gTWF0aC5tYXgoMTIwLCBNYXRoLmZsb29yKGN0eC5tZWFzdXJlVGV4dChndHh0KS53aWR0aCArIDI0KSk7CiAgICAgICAgICBpZiAoZ3ggPiBXIC0gODApIHsgZ3ggPSAxNjsgZ3kyICs9IGdmcyArIDEyOyB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKGZsYXNoVGltZXIgPiAwICYmIGZsYXNoTXNnKSB7CiAgICAgIGN0eC5zYXZlKCk7CiAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IE1hdGgubWluKDEsIGZsYXNoVGltZXIgKiAyKTsKICAgICAgY3R4LmZvbnQgPSAiYm9sZCAiICsgTWF0aC5tYXgoMjgsIE1hdGguZmxvb3IoY2VsbCAqIDAuODUpKSArICJweCBJbXBhY3QsQXJpYWwgQmxhY2ssc2Fucy1zZXJpZiI7CiAgICAgIGN0eC50ZXh0QWxpZ24gPSAiY2VudGVyIjsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZmIjsKICAgICAgY3R4LnN0cm9rZVN0eWxlID0gIiNlMDcwMzAiOwogICAgICBjdHgubGluZVdpZHRoID0gTWF0aC5tYXgoNCwgY2VsbCAqIDAuMSk7CiAgICAgIHZhciBmeCA9IGJvYXJkWCArIEdSSUQgKiBjZWxsIC8gMjsKICAgICAgdmFyIGZ5ID0gYm9hcmRZICsgR1JJRCAqIGNlbGwgLyAyOwogICAgICBjdHguc3Ryb2tlVGV4dChmbGFzaE1zZywgZngsIGZ5KTsKICAgICAgY3R4LmZpbGxUZXh0KGZsYXNoTXNnLCBmeCwgZnkpOwogICAgICBjdHgucmVzdG9yZSgpOwogICAgfQoKICAgIGN0eC5mb250ID0gTWF0aC5tYXgoMTAsIE1hdGguZmxvb3IoTWF0aC5taW4oVywgSCkgKiAwLjAxOCkpICsgInB4IFRyZWJ1Y2hldCBNUyxzYW5zLXNlcmlmIjsKICAgIGN0eC5maWxsU3R5bGUgPSAicmdiYSgyNTUsMjQwLDIyMCwwLjQ1KSI7CiAgICBjdHgudGV4dEFsaWduID0gImxlZnQiOwogICAgY3R4LmZpbGxUZXh0KFZFUlNJT04sIDgsIEggLSA4KTsKICB9CgogIGZ1bmN0aW9uIGJvYXJkU2l6ZVNhZmUoKSB7CiAgICByZXR1cm4gR1JJRCAqIGNlbGwgKyBib2FyZFBhZCAqIDI7CiAgfQoKICBmdW5jdGlvbiBkcmF3UGFydGljbGVzKGR0KSB7CiAgICBmb3IgKHZhciBpID0gcGFydGljbGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHZhciBwID0gcGFydGljbGVzW2ldOwogICAgICBwLmxpZmUgLT0gZHQ7CiAgICAgIHAueCArPSBwLnZ4ICogZHQ7CiAgICAgIHAueSArPSBwLnZ5ICogZHQ7CiAgICAgIHAudnkgKz0gMzAwICogZHQ7CiAgICAgIGlmIChwLmxpZmUgPD0gMCkgeyBwYXJ0aWNsZXMuc3BsaWNlKGksIDEpOyBjb250aW51ZTsgfQogICAgICBjdHguZ2xvYmFsQWxwaGEgPSBNYXRoLm1heCgwLCBwLmxpZmUgKiAyKTsKICAgICAgY3R4LmZpbGxTdHlsZSA9IHAuY29sOwogICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgIGN0eC5hcmMocC54LCBwLnksIHAuc2l6ZSAqIHAubGlmZSwgMCwgTWF0aC5QSSAqIDIpOwogICAgICBjdHguZmlsbCgpOwogICAgICBjdHguZ2xvYmFsQWxwaGEgPSAxOwogICAgfQogIH0KCiAgdmFyIGxhc3RUcyA9IHBlcmZvcm1hbmNlLm5vdygpOwogIGZ1bmN0aW9uIGZyYW1lKHRzKSB7CiAgICB2YXIgZHQgPSBNYXRoLm1pbigwLjA1LCAodHMgLSBsYXN0VHMpIC8gMTAwMCk7CiAgICBsYXN0VHMgPSB0czsKICAgIGlmIChmbGFzaFRpbWVyID4gMCkgZmxhc2hUaW1lciAtPSBkdDsKCiAgICBpZiAoc3RhdGUgPT09ICJwbGF5IikgewogICAgICB1cGRhdGVXaW5rcyhkdCk7CiAgICAgIGlmIChoaW50c09uKSB7CiAgICAgICAgaWYgKCFoaW50Q2VsbHMpIGhpbnRDZWxscyA9IGZpbmRIaW50KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaGludENlbGxzID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgVywgSCk7CiAgICBpZiAoYmdDYW52YXMpIGN0eC5kcmF3SW1hZ2UoYmdDYW52YXMsIDAsIDApOwogICAgZWxzZSB7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzg3YjhlMCI7CiAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCBXLCBIKTsKICAgIH0KCiAgICBpZiAoc3RhdGUgPT09ICJwbGF5IiB8fCBzdGF0ZSA9PT0gIndpbiIgfHwgc3RhdGUgPT09ICJsb3NlIiB8fCBzdGF0ZSA9PT0gInBhdXNlIikgewogICAgICBpZiAoZ3JpZC5sZW5ndGgpIHsKICAgICAgICBkcmF3Qm9hcmQoKTsKICAgICAgICBkcmF3SFVEKCk7CiAgICAgICAgZHJhd1BhcnRpY2xlcyhkdCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIHRpdGxlIGJhY2tkcm9wIGNhdHMKICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDQwLDI1LDE1LDAuMjUpIjsKICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIFcsIEgpOwogICAgICBpZiAoc3ByaXRlcy5sZW5ndGgpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY7IGkrKykgewogICAgICAgICAgY3R4LmRyYXdJbWFnZShzcHJpdGVzW2ldLmhhcHB5IHx8IHNwcml0ZXNbaV0ubm9ybWFsLCA4MCArIGkgKiAxNDAsIDIwMCwgMTAwLCAxMDApOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7CiAgfQoKICAvKiA9PT09PSBGVUxMU0NSRUVOIC8gTU9CSUxFID09PT09ICovCiAgdmFyIG1vYmlsZVBsYXkgPSBmYWxzZTsKICB2YXIgZnNGYWxsYmFjayA9IGZhbHNlOwoKICBmdW5jdGlvbiBpc01vYmlsZSgpIHsKICAgIHJldHVybiAvQW5kcm9pZHxpUGhvbmV8aVBhZHxpUG9kfE1vYmlsZS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgKG1hdGNoTWVkaWEgJiYgbWF0Y2hNZWRpYSgiKHBvaW50ZXI6IGNvYXJzZSkiKS5tYXRjaGVzKTsKICB9CiAgZnVuY3Rpb24gaXNGc0FjdGl2ZSgpIHsKICAgIHJldHVybiAhIShkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCB8fCBkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCk7CiAgfQogIGZ1bmN0aW9uIGlzUG9ydHJhaXQoKSB7IHJldHVybiB3aW5kb3cuaW5uZXJIZWlnaHQgPiB3aW5kb3cuaW5uZXJXaWR0aDsgfQoKICBmdW5jdGlvbiB1cGRhdGVSb3RhdGUoKSB7CiAgICAvLyBQb3J0cmFpdCBpcyBwbGF5YWJsZTsga2VlcCBvdmVybGF5IGhpZGRlbiAobGFuZHNjYXBlIGxvY2sgc3RpbGwgYXR0ZW1wdGVkKS4KICAgIGlmICghcm90YXRlRWwpIHJldHVybjsKICAgIHJvdGF0ZUVsLmhpZGRlbiA9IHRydWU7CiAgfQoKICBmdW5jdGlvbiBsb2NrTGFuZHNjYXBlKCkgewogICAgdHJ5IHsKICAgICAgaWYgKHNjcmVlbi5vcmllbnRhdGlvbiAmJiBzY3JlZW4ub3JpZW50YXRpb24ubG9jaykgewogICAgICAgIHZhciBwID0gc2NyZWVuLm9yaWVudGF0aW9uLmxvY2soImxhbmRzY2FwZSIpOwogICAgICAgIGlmIChwICYmIHAuY2F0Y2gpIHAuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQogIH0KCiAgZnVuY3Rpb24gZml0Q2FudmFzKCkgewogICAgdmFyIHZ3ID0gd2luZG93LmlubmVyV2lkdGggfHwgMzIwLCB2aCA9IHdpbmRvdy5pbm5lckhlaWdodCB8fCAxODA7CiAgICB2YXIgcGxheWluZyA9ICEhKGFwcEVsICYmIChhcHBFbC5jbGFzc0xpc3QuY29udGFpbnMoImNtLXBsYXlpbmciKSB8fCBhcHBFbC5jbGFzc0xpc3QuY29udGFpbnMoImNtLWZhbGxiYWNrIikgfHwgYXBwRWwuY2xhc3NMaXN0LmNvbnRhaW5zKCJjbS1tb2JpbGUiKSkpIHx8IG1vYmlsZVBsYXkgfHwgaXNGc0FjdGl2ZSgpOwogICAgdmFyIHN0YWdlID0gJCgiY20tc3RhZ2UiKTsKICAgIHZhciBjdywgY2g7CiAgICBpZiAocGxheWluZykgewogICAgICBjdyA9IE1hdGgubWF4KDE2MCwgTWF0aC5mbG9vcih2dykpOwogICAgICBjaCA9IE1hdGgubWF4KDE2MCwgTWF0aC5mbG9vcih2aCkpOwogICAgICBjYW52YXMuc3R5bGUud2lkdGggPSBjdyArICJweCI7CiAgICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBjaCArICJweCI7CiAgICAgIGlmIChzdGFnZSkgewogICAgICAgIHN0YWdlLnN0eWxlLndpZHRoID0gY3cgKyAicHgiOwogICAgICAgIHN0YWdlLnN0eWxlLmhlaWdodCA9IGNoICsgInB4IjsKICAgICAgICBzdGFnZS5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAgICAgc3RhZ2Uuc3R5bGUubGVmdCA9ICIwcHgiOwogICAgICAgIHN0YWdlLnN0eWxlLnRvcCA9ICIwcHgiOwogICAgICAgIHN0YWdlLnN0eWxlLm1hcmdpbiA9ICIwIjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGF2YWlsVyA9IE1hdGgubWF4KDgwLCB2dyAtIDE2KTsKICAgICAgdmFyIGF2YWlsSCA9IE1hdGgubWF4KDgwLCB2aCAtIDE2KTsKICAgICAgY3cgPSBNYXRoLmZsb29yKE1hdGgubWluKGF2YWlsVywgYXZhaWxIICogMTYgLyA5KSk7CiAgICAgIGNoID0gTWF0aC5mbG9vcihjdyAqIDkgLyAxNik7CiAgICAgIGlmIChjdyA8IDE2MCkgeyBjdyA9IDE2MDsgY2ggPSBNYXRoLmZsb29yKGN3ICogOSAvIDE2KTsgfQogICAgICBjYW52YXMuc3R5bGUud2lkdGggPSBjdyArICJweCI7CiAgICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBjaCArICJweCI7CiAgICAgIGlmIChzdGFnZSkgewogICAgICAgIHN0YWdlLnN0eWxlLndpZHRoID0gY3cgKyAicHgiOwogICAgICAgIHN0YWdlLnN0eWxlLmhlaWdodCA9IGNoICsgInB4IjsKICAgICAgICBzdGFnZS5zdHlsZS5wb3NpdGlvbiA9ICIiOwogICAgICAgIHN0YWdlLnN0eWxlLmxlZnQgPSAiIjsKICAgICAgICBzdGFnZS5zdHlsZS50b3AgPSAiIjsKICAgICAgfQogICAgfQogICAgdmFyIGRwciA9IE1hdGgubWluKDIuNSwgd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSk7CiAgICB2YXIgbncgPSBNYXRoLm1heCgxNjAsIE1hdGguZmxvb3IoY3cgKiBkcHIpKTsKICAgIHZhciBuaCA9IE1hdGgubWF4KDE2MCwgTWF0aC5mbG9vcihjaCAqIGRwcikpOwogICAgLy8gTGF5b3V0IG1hdGggc3RheXMgaW4gQ1NTIHBpeGVsczsgYmFja2luZyBzdG9yZSBpcyBEUFItc2NhbGVkCiAgICBXID0gY3c7CiAgICBIID0gY2g7CiAgICBpZiAoY2FudmFzLndpZHRoICE9PSBudyB8fCBjYW52YXMuaGVpZ2h0ICE9PSBuaCkgewogICAgICBjYW52YXMud2lkdGggPSBudzsKICAgICAgY2FudmFzLmhlaWdodCA9IG5oOwogICAgfQogICAgdHJ5IHsgY3R4LnNldFRyYW5zZm9ybShkcHIsIDAsIDAsIGRwciwgMCwgMCk7IH0gY2F0Y2ggKGVUKSB7fQogICAgbGF5b3V0UGxheWZpZWxkKCk7CiAgICBwbGFjZVNpZGVCdXR0b25zKGN3LCBjaCwgdncsIHZoKTsKICAgIHVwZGF0ZVJvdGF0ZSgpOwogIH0KCiAgZnVuY3Rpb24gcGxhY2VTaWRlQnV0dG9ucyhjdywgY2gsIHZ3LCB2aCkgewogICAgdmFyIHBsYXlpbmcgPSBzdGF0ZSA9PT0gInBsYXkiIHx8IHN0YXRlID09PSAicGF1c2UiIHx8IHN0YXRlID09PSAibGV2ZWwiIHx8IHN0YXRlID09PSAid2luIiB8fCBzdGF0ZSA9PT0gImxvc2UiOwogICAgdmFyIG9uID0gISEoYXBwRWwgJiYgYXBwRWwuY2xhc3NMaXN0LmNvbnRhaW5zKCJjbS1wbGF5aW5nIikpIHx8IG1vYmlsZVBsYXkgfHwgcGxheWluZzsKICAgIGlmIChleGl0QnRuKSBleGl0QnRuLmhpZGRlbiA9ICFvbjsKICAgIGlmIChwYXVzZUJ0bikgcGF1c2VCdG4uaGlkZGVuID0gIShvbiAmJiAoc3RhdGUgPT09ICJwbGF5IiB8fCBzdGF0ZSA9PT0gInBhdXNlIikpOwogICAgaWYgKGhpbnRCdG4pIGhpbnRCdG4uaGlkZGVuID0gIShvbiAmJiAoc3RhdGUgPT09ICJwbGF5IiB8fCBzdGF0ZSA9PT0gInBhdXNlIiB8fCBzdGF0ZSA9PT0gImxldmVsIikpOwogICAgaWYgKCFvbikgcmV0dXJuOwoKICAgIC8vIEV4aXQgLyBQYXVzZTogdG9wLXJpZ2h0IGNocm9tZSBjb3JuZXIgKG92ZXIgSFVEIGVkZ2UsIG5vdCBmbG9hdGluZyBpbiBlbXB0eSBtYXJnaW4pCiAgICBpZiAoZXhpdEJ0bikgewogICAgICBleGl0QnRuLnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKICAgICAgZXhpdEJ0bi5zdHlsZS50b3AgPSAiNnB4IjsKICAgICAgZXhpdEJ0bi5zdHlsZS5yaWdodCA9ICI2cHgiOwogICAgICBleGl0QnRuLnN0eWxlLmxlZnQgPSAiYXV0byI7CiAgICAgIGV4aXRCdG4uc3R5bGUuYm90dG9tID0gImF1dG8iOwogICAgfQogICAgaWYgKHBhdXNlQnRuKSB7CiAgICAgIHBhdXNlQnRuLnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKICAgICAgcGF1c2VCdG4uc3R5bGUudG9wID0gIjZweCI7CiAgICAgIHBhdXNlQnRuLnN0eWxlLnJpZ2h0ID0gIjU2cHgiOwogICAgICBwYXVzZUJ0bi5zdHlsZS5sZWZ0ID0gImF1dG8iOwogICAgICBwYXVzZUJ0bi5zdHlsZS5ib3R0b20gPSAiYXV0byI7CiAgICB9CgogICAgLy8gSGludDogZmx1c2ggdG8gYm9hcmQgY29ybmVyIGluIHNjcmVlbiBzcGFjZSAoY2FudmFzLWxvY2FsIGhpbnRBbmNob3IgLT4gQ1NTIHB4KQogICAgaWYgKGhpbnRCdG4pIHsKICAgICAgdmFyIHJlY3QgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHZhciBzeCA9IHJlY3Qud2lkdGggLyBXOwogICAgICB2YXIgc3kgPSByZWN0LmhlaWdodCAvIEg7CiAgICAgIHZhciBoeCA9IHJlY3QubGVmdCArIGhpbnRBbmNob3IueCAqIHN4OwogICAgICB2YXIgaHkgPSByZWN0LnRvcCArIGhpbnRBbmNob3IueSAqIHN5OwogICAgICB2YXIgaHcgPSBNYXRoLm1heCg0OCwgaGludEFuY2hvci53ICogc3gpOwogICAgICB2YXIgaGggPSBNYXRoLm1heCg0OCwgaGludEFuY2hvci5oICogc3kpOwogICAgICBoaW50QnRuLnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKICAgICAgaGludEJ0bi5zdHlsZS53aWR0aCA9IE1hdGguZmxvb3IoaHcpICsgInB4IjsKICAgICAgaGludEJ0bi5zdHlsZS5oZWlnaHQgPSBNYXRoLmZsb29yKGhoKSArICJweCI7CiAgICAgIGhpbnRCdG4uc3R5bGUubWluV2lkdGggPSAiNDhweCI7CiAgICAgIGhpbnRCdG4uc3R5bGUubWluSGVpZ2h0ID0gIjQ4cHgiOwogICAgICBoaW50QnRuLnN0eWxlLnBhZGRpbmcgPSAiMCAxMnB4IjsKICAgICAgaGludEJ0bi5zdHlsZS5ib3hTaXppbmcgPSAiYm9yZGVyLWJveCI7CiAgICAgIHZhciBsZWZ0ID0gTWF0aC5mbG9vcihoeCk7CiAgICAgIHZhciB0b3AgPSBNYXRoLmZsb29yKGh5KTsKICAgICAgaWYgKGxlZnQgKyBodyA+IHZ3IC0gNCkgbGVmdCA9IE1hdGgubWF4KDQsIE1hdGguZmxvb3IodncgLSBodyAtIDQpKTsKICAgICAgaWYgKHRvcCArIGhoID4gdmggLSA0KSB0b3AgPSBNYXRoLm1heCg0LCBNYXRoLmZsb29yKHZoIC0gaGggLSA0KSk7CiAgICAgIGlmIChsZWZ0IDwgNCkgbGVmdCA9IDQ7CiAgICAgIGlmICh0b3AgPCA0KSB0b3AgPSA0OwogICAgICBoaW50QnRuLnN0eWxlLmxlZnQgPSBsZWZ0ICsgInB4IjsKICAgICAgaGludEJ0bi5zdHlsZS50b3AgPSB0b3AgKyAicHgiOwogICAgICBoaW50QnRuLnN0eWxlLnJpZ2h0ID0gImF1dG8iOwogICAgICBoaW50QnRuLnN0eWxlLmJvdHRvbSA9ICJhdXRvIjsKICAgICAgaGludEJ0bi5zdHlsZS5mb250U2l6ZSA9IE1hdGgubWF4KDE0LCBNYXRoLmZsb29yKGhoICogMC4zNCkpICsgInB4IjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUhpbnRCdG4oKSB7CiAgICBpZiAoIWhpbnRCdG4pIHJldHVybjsKICAgIGhpbnRCdG4udGV4dENvbnRlbnQgPSBoaW50c09uID8gIkhpbnQ6IE9OIiA6ICJIaW50IjsKICAgIGhpbnRCdG4uc2V0QXR0cmlidXRlKCJhcmlhLXByZXNzZWQiLCBoaW50c09uID8gInRydWUiIDogImZhbHNlIik7CiAgICBpZiAoaGludHNPbikgaGludEJ0bi5jbGFzc0xpc3QuYWRkKCJjbS1oaW50LW9uIik7CiAgICBlbHNlIGhpbnRCdG4uY2xhc3NMaXN0LnJlbW92ZSgiY20taGludC1vbiIpOwogIH0KCiAgZnVuY3Rpb24gc2V0SGludHMob24pIHsKICAgIGhpbnRzT24gPSAhIW9uOwogICAgaWYgKGhpbnRzT24pIGhpbnRDZWxscyA9IGZpbmRIaW50KCk7CiAgICBlbHNlIGhpbnRDZWxscyA9IG51bGw7CiAgICB1cGRhdGVIaW50QnRuKCk7CiAgfQoKICBmdW5jdGlvbiBlbnRlclBsYXlNb2RlKCkgewogICAgbW9iaWxlUGxheSA9IGlzTW9iaWxlKCk7CiAgICBpZiAoYXBwRWwpIHsKICAgICAgYXBwRWwuY2xhc3NMaXN0LmFkZCgiY20tcGxheWluZyIpOwogICAgICBpZiAobW9iaWxlUGxheSkgYXBwRWwuY2xhc3NMaXN0LmFkZCgiY20tbW9iaWxlIik7CiAgICB9CiAgICB0cnkgewogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgiY20tbm9zY3JvbGwiLCAiY20tYm9vdCIpOwogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNtLW5vc2Nyb2xsIiwgImNtLWJvb3QiKTsKICAgICAgd2luZG93LnNjcm9sbFRvKDAsIDApOwogICAgfSBjYXRjaCAoZSkge30KICAgIHZhciBlbCA9IGFwcEVsOwogICAgdmFyIHJlcSA9IGVsICYmIChlbC5yZXF1ZXN0RnVsbHNjcmVlbiB8fCBlbC53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbiB8fCBlbC53ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbik7CiAgICBmdW5jdGlvbiBmYWxsYmFjaygpIHsKICAgICAgZnNGYWxsYmFjayA9IHRydWU7CiAgICAgIGlmIChhcHBFbCkgYXBwRWwuY2xhc3NMaXN0LmFkZCgiY20tZmFsbGJhY2siKTsKICAgICAgZml0Q2FudmFzKCk7CiAgICB9CiAgICBpZiAocmVxKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHJldCA9IHJlcS5jYWxsKGVsKTsKICAgICAgICBpZiAocmV0ICYmIHR5cGVvZiByZXQudGhlbiA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgcmV0LnRoZW4oZnVuY3Rpb24gKCkgeyBsb2NrTGFuZHNjYXBlKCk7IGZpdENhbnZhcygpOyB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IGZhbGxiYWNrKCk7IH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsb2NrTGFuZHNjYXBlKCk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlMikgeyBmYWxsYmFjaygpOyB9CiAgICB9IGVsc2UgaWYgKG1vYmlsZVBsYXkpIHsKICAgICAgZmFsbGJhY2soKTsKICAgIH0KICAgIGxvY2tMYW5kc2NhcGUoKTsKICAgIGlmIChwYXVzZUJ0bikgcGF1c2VCdG4uaGlkZGVuID0gZmFsc2U7CiAgICBpZiAoZXhpdEJ0bikgZXhpdEJ0bi5oaWRkZW4gPSBmYWxzZTsKICAgIGlmIChoaW50QnRuKSBoaW50QnRuLmhpZGRlbiA9IGZhbHNlOwogICAgdXBkYXRlSGludEJ0bigpOwogICAgZml0Q2FudmFzKCk7CiAgICBzZXRUaW1lb3V0KGZpdENhbnZhcywgODApOwogICAgc2V0VGltZW91dChmaXRDYW52YXMsIDQ1MCk7CiAgICB1cGRhdGVSb3RhdGUoKTsKICB9CgogIGZ1bmN0aW9uIGV4aXRQbGF5TW9kZSgpIHsKICAgIG1vYmlsZVBsYXkgPSBmYWxzZTsKICAgIHZhciBleCA9IGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuIHx8IGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuIHx8IGRvY3VtZW50LndlYmtpdENhbmNlbEZ1bGxTY3JlZW47CiAgICBpZiAoaXNGc0FjdGl2ZSgpICYmIGV4KSB7CiAgICAgIHRyeSB7IHZhciByID0gZXguY2FsbChkb2N1bWVudCk7IGlmIChyICYmIHIuY2F0Y2gpIHIuY2F0Y2goZnVuY3Rpb24gKCkge30pOyB9IGNhdGNoIChlMCkge30KICAgIH0KICAgIGZzRmFsbGJhY2sgPSBmYWxzZTsKICAgIGlmIChhcHBFbCkgYXBwRWwuY2xhc3NMaXN0LnJlbW92ZSgiY20tcGxheWluZyIsICJjbS1tb2JpbGUiLCAiY20tZmFsbGJhY2siKTsKICAgIHRyeSB7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJjbS1ub3Njcm9sbCIpOwogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNtLW5vc2Nyb2xsIik7CiAgICB9IGNhdGNoIChlKSB7fQogICAgaWYgKHBhdXNlQnRuKSBwYXVzZUJ0bi5oaWRkZW4gPSB0cnVlOwogICAgaWYgKGV4aXRCdG4pIGV4aXRCdG4uaGlkZGVuID0gdHJ1ZTsKICAgIGlmIChoaW50QnRuKSBoaW50QnRuLmhpZGRlbiA9IHRydWU7CiAgICBzZXRIaW50cyhmYWxzZSk7CiAgICBmaXRDYW52YXMoKTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZVdpbmtzKGR0KSB7CiAgICBpZiAoIWdyaWQubGVuZ3RoKSByZXR1cm47CiAgICB2YXIgbm93ID0gcGVyZm9ybWFuY2Uubm93KCkgLyAxMDAwOwogICAgZm9yICh2YXIgciA9IDA7IHIgPCBHUklEOyByKyspIHsKICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBHUklEOyBjKyspIHsKICAgICAgICB2YXIgdGlsZSA9IGdyaWRbcl1bY107CiAgICAgICAgaWYgKHRpbGUudHlwZSA8IDApIGNvbnRpbnVlOwogICAgICAgIGlmICh0aWxlLndpbmtVbnRpbCAmJiBub3cgPj0gdGlsZS53aW5rVW50aWwpIHsKICAgICAgICAgIHRpbGUud2lua1VudGlsID0gMDsKICAgICAgICAgIHRpbGUubmV4dFdpbmsgPSBub3cgKyAyLjUgKyBNYXRoLnJhbmRvbSgpICogNzsKICAgICAgICB9IGVsc2UgaWYgKCF0aWxlLndpbmtVbnRpbCkgewogICAgICAgICAgaWYgKCF0aWxlLm5leHRXaW5rKSB0aWxlLm5leHRXaW5rID0gbm93ICsgMSArIE1hdGgucmFuZG9tKCkgKiA0OwogICAgICAgICAgaWYgKG5vdyA+PSB0aWxlLm5leHRXaW5rKSB7CiAgICAgICAgICAgIHRpbGUud2lua1VudGlsID0gbm93ICsgMC4yOCArIE1hdGgucmFuZG9tKCkgKiAwLjIyOwogICAgICAgICAgICB0aWxlLm5leHRXaW5rID0gbm93ICsgMyArIE1hdGgucmFuZG9tKCkgKiA4OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLyogPT09PT0gQlVUVE9OUyA9PT09PSAqLwogIGZ1bmN0aW9uIHRyeVN0YXJ0RnJvbVRpdGxlKCkgewogICAgaWYgKHN0YXRlICE9PSAidGl0bGUiKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoIXNwcml0ZXNSZWFkeSB8fCAoc3RhcnRCdG4gJiYgc3RhcnRCdG4uZGlzYWJsZWQpKSByZXR1cm4gZmFsc2U7CiAgICBlbnRlclBsYXlNb2RlKCk7CiAgICBzaG93TGV2ZWxJbnRybygwKTsKICAgIHJldHVybiB0cnVlOwogIH0KICBmdW5jdGlvbiB0cnlTdGFydEZyb21MZXZlbCgpIHsKICAgIGlmIChzdGF0ZSAhPT0gImxldmVsIikgcmV0dXJuIGZhbHNlOwogICAgc3RhcnRMZXZlbChsZXZlbEluZGV4KTsKICAgIHJldHVybiB0cnVlOwogIH0KICBmdW5jdGlvbiBvbk92ZXJsYXlUYXBTdGFydChlKSB7CiAgICAvLyBGdWxsLXZpZXdwb3J0IHRhcC9jbGljayBzdGFydHMgb24gdGl0bGUgKyBsZXZlbCBpbnRybyBvbmx5LgogICAgLy8gS2VlcCBQbGF5L0dvIGxhYmVsczsgZW1wdHkgYXJlYXMgb2YgdGhlIG92ZXJsYXkgYWxzbyBzdGFydC4KICAgIGlmIChzdGF0ZSAhPT0gInRpdGxlIiAmJiBzdGF0ZSAhPT0gImxldmVsIikgcmV0dXJuOwogICAgaWYgKGUudGFyZ2V0ICYmIGUudGFyZ2V0LmNsb3Nlc3QpIHsKICAgICAgdmFyIG90aGVyID0gZS50YXJnZXQuY2xvc2VzdCgiYnV0dG9uLmNtLXNtYWxsLCAjY20tZXhpdCwgI2NtLXBhdXNlYnRuLCAjY20taGludGJ0biIpOwogICAgICBpZiAob3RoZXIpIHJldHVybjsKICAgIH0KICAgIGlmIChzdGF0ZSA9PT0gInRpdGxlIikgdHJ5U3RhcnRGcm9tVGl0bGUoKTsKICAgIGVsc2UgdHJ5U3RhcnRGcm9tTGV2ZWwoKTsKICB9CiAgaWYgKHN0YXJ0QnRuKSBzdGFydEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgdHJ5U3RhcnRGcm9tVGl0bGUoKTsKICB9KTsKICBpZiAoJCgiY20tcGxheS1sZXZlbCIpKSAkKCJjbS1wbGF5LWxldmVsIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIHRyeVN0YXJ0RnJvbUxldmVsKCk7CiAgfSk7CiAgaWYgKG92ZXJsYXlFbCkgewogICAgb3ZlcmxheUVsLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgb25PdmVybGF5VGFwU3RhcnQpOwogICAgb3ZlcmxheUVsLnN0eWxlLmN1cnNvciA9ICJwb2ludGVyIjsKICAgIG92ZXJsYXlFbC5zZXRBdHRyaWJ1dGUoInJvbGUiLCAiYnV0dG9uIik7CiAgICBvdmVybGF5RWwuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgIlRhcCBhbnl3aGVyZSB0byBwbGF5Iik7CiAgfQogIGlmIChuZXh0QnRuKSBuZXh0QnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgaWYgKGxldmVsSW5kZXggKyAxIDwgTEVWRUxTLmxlbmd0aCkgc2hvd0xldmVsSW50cm8obGV2ZWxJbmRleCArIDEpOwogICAgZWxzZSB7CiAgICAgIHN0YXRlID0gInRpdGxlIjsKICAgICAgZXhpdFBsYXlNb2RlKCk7CiAgICAgIHNob3dDYXJkKHRpdGxlQ2FyZCk7CiAgICB9CiAgfSk7CiAgaWYgKHJldHJ5QnRuKSByZXRyeUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsgc3RhcnRMZXZlbChsZXZlbEluZGV4KTsgfSk7CiAgaWYgKHJldHJ5TG9zZUJ0bikgcmV0cnlMb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgeyBzdGFydExldmVsKGxldmVsSW5kZXgpOyB9KTsKICBpZiAobWVudUJ0bikgbWVudUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgIHN0YXRlID0gInRpdGxlIjsKICAgIGV4aXRQbGF5TW9kZSgpOwogICAgc2hvd0NhcmQodGl0bGVDYXJkKTsKICB9KTsKICBpZiAoJCgiY20tbWVudS1sb3NlIikpICQoImNtLW1lbnUtbG9zZSIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgc3RhdGUgPSAidGl0bGUiOwogICAgZXhpdFBsYXlNb2RlKCk7CiAgICBzaG93Q2FyZCh0aXRsZUNhcmQpOwogIH0pOwogIGlmIChwYXVzZUJ0bikgcGF1c2VCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICBpZiAoc3RhdGUgIT09ICJwbGF5IiB8fCBidXN5KSByZXR1cm47CiAgICBzdGF0ZSA9ICJwYXVzZSI7CiAgICBzaG93Q2FyZChwYXVzZUNhcmQpOwogIH0pOwogIGlmIChyZXN1bWVCdG4pIHJlc3VtZUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgIHN0YXRlID0gInBsYXkiOwogICAgaGlkZU92ZXJsYXkoKTsKICB9KTsKICBpZiAocmVzdGFydEJ0bikgcmVzdGFydEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgIHN0YXJ0TGV2ZWwobGV2ZWxJbmRleCk7CiAgfSk7CiAgaWYgKGV4aXRCdG4pIGV4aXRCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICBzdGF0ZSA9ICJ0aXRsZSI7CiAgICBleGl0UGxheU1vZGUoKTsKICAgIHNob3dDYXJkKHRpdGxlQ2FyZCk7CiAgfSk7CgogIGlmIChoaW50QnRuKSBoaW50QnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIHNldEhpbnRzKCFoaW50c09uKTsKICB9KTsKCiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIGZpdENhbnZhcyk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIiwgZnVuY3Rpb24gKCkgeyBzZXRUaW1lb3V0KGZpdENhbnZhcywgMjUwKTsgfSk7CiAgZnVuY3Rpb24gb25Gc0NoYW5nZSgpIHsKICAgIGlmICghaXNGc0FjdGl2ZSgpICYmIG1vYmlsZVBsYXkgJiYgIWZzRmFsbGJhY2spIHsKICAgICAgLy8gdXNlciBleGl0ZWQgZnVsbHNjcmVlbjoga2VlcCBwbGF5aW5nIGluIGZhbGxiYWNrIGZpbGwKICAgICAgZnNGYWxsYmFjayA9IHRydWU7CiAgICAgIGlmIChhcHBFbCkgYXBwRWwuY2xhc3NMaXN0LmFkZCgiY20tZmFsbGJhY2siKTsKICAgIH0KICAgIGZpdENhbnZhcygpOwogIH0KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIiwgb25Gc0NoYW5nZSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2Via2l0ZnVsbHNjcmVlbmNoYW5nZSIsIG9uRnNDaGFuZ2UpOwoKICAvLyBib290CiAgaWYgKHN0YXJ0QnRuKSB7CiAgICBzdGFydEJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICBzdGFydEJ0bi50ZXh0Q29udGVudCA9ICJMb2FkaW5nIjsKICB9CiAgdXBkYXRlSGludEJ0bigpOwogIGxvYWRBdGxhcygpOwogIHNob3dDYXJkKHRpdGxlQ2FyZCk7CiAgZml0Q2FudmFzKCk7CiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZyYW1lKTsKfSkoKTsK\");\n  document.body.appendChild(el);\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>X II Hint &#8635; Turn your phone sideways Landscape fits more board. Portrait works too. Cat Match What: A cozy match-3. Swap cute cats, make combos, clear boxes, and free kittens. Goal: Beat each level&#8217;s objective before you run out of moves. Match 4 for stripes, 5 for rainbow, T\/L for bombs. Desktop: Click two [&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-303","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/303","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=303"}],"version-history":[{"count":5,"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/303\/revisions"}],"predecessor-version":[{"id":317,"href":"https:\/\/catventures.lol\/index.php?rest_route=\/wp\/v2\/pages\/303\/revisions\/317"}],"wp:attachment":[{"href":"https:\/\/catventures.lol\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}