산출 근거
| 적용 세율 | … |
| 취득세 본세 | … |
| 생애최초 감면 | … |
| 지방교육세 | … |
| 농어촌특별세 | … |
| 가액 대비 실효세율 | … |
★ 6~9억은 “2%”가 아닙니다
가장 많이 틀리는 부분입니다. 6억 초과 9억 이하 구간은 고정세율이 아니라 산식입니다.
세율(%) = 취득가액 × 2 ÷ 3억 − 3
6억에서 1%로 시작해 9억에서 3%가 되도록 가격에 따라 연속으로 올라갑니다.
7억이면 1.67%, 8억이면 2.33%, 8.9억이면 2.93%입니다. “6~9억은 2%”로 알고 계산하면
8억짜리에서 500만원 넘게 어긋납니다.
★ 85㎡ 넘으면 농어촌특별세가 붙습니다
전용면적 85㎡ 이하는 농어촌특별세가 없습니다. 넘으면 0.2%가 추가됩니다.
같은 8억짜리라도 84㎡와 85.1㎡의 세금이 160만원 차이 납니다.
공급면적이 아니라 전용면적 기준입니다. 흔히 말하는 ’34평’은 전용 84㎡라
농특세가 없습니다. ‘국민주택규모’라는 말이 이 85㎡를 가리킵니다.
다주택 중과는 어떻게 걸리나
취득 후 보유하게 될 주택 수로 따지고, 사는 집이 조정대상지역이면 한 단계 빨리 걸립니다.
| 취득 후 주택 수 | 조정대상지역 | 그 외 지역 |
| 1주택 | 기본세율 | 기본세율 |
| 2주택 | 8% | 기본세율 |
| 3주택 | 12% | 8% |
| 4주택 이상 | 12% | 12% |
중과되면 지방교육세는 0.4% 고정이 됩니다(표준세율 기준으로 계산하기 때문입니다).
취득세율의 1/10로 계산하면 크게 틀립니다. 12% 중과에 85㎡ 초과면 실효 13.4%입니다.
주택 수에는 분양권·입주권·주거용 오피스텔도 포함됩니다.
조정대상지역 지정은 수시로 바뀌니 계약 전에 확인하세요.
생애최초 감면
무주택 세대가 12억 이하 주택을 처음 살 때
취득세를 최대 200만원까지 깎아 줍니다.
감면은 취득세 본세에만 적용됩니다. 지방교육세·농어촌특별세는 그대로 냅니다.
4억짜리를 사면 취득세 400만원 중 200만원이 깎여 실효세율이 0.6%까지 내려갑니다.
이 계산에 없는 것
- 중개보수·법무사비·인지세·국민주택채권 — 취득세와 별도로 나가는 돈입니다.
집값의 0.5~1% 정도를 더 잡아 두세요.
- 증여·상속 취득 — 세율 체계가 다릅니다. 이 계산기는 유상거래(매매) 기준입니다.
- 일시적 2주택 특례 — 기존 집을 정해진 기간 안에 팔면 중과를 피할 수 있습니다.
- 지방 미분양주택 감면 등 한시 감면 제도.
근거 지방세법 제11조·제13조의2·제151조, 농어촌특별세법 · 확인일 2026-09-21 ·
유상거래(매매) 기준 · 실제 세액은 과세관청 판단에 따르며 이 결과는 참고용입니다.
자주 묻는 질문
6억 이하면 무조건 1%인가요?
네. 6억원 이하는 1% 고정입니다. 6억을 넘는 순간부터 산식이 적용돼 가격에 비례해 올라가고, 9억을 넘으면 3% 고정입니다. 6억과 6억 1원의 세율 차이는 거의 없지만, 8억쯤 되면 2.33%가 됩니다.
34평이면 농어촌특별세를 내나요?
안 냅니다. 흔히 말하는 34평은 전용 84㎡라 85㎡ 이하입니다. 공급면적(분양면적)이 아니라 전용면적 기준이라는 점만 주의하세요. 전용 85㎡를 넘는 대형 평형부터 0.2%가 붙습니다.
분양권도 주택 수에 들어가나요?
들어갑니다. 2020년 8월 이후 취득한 분양권·입주권·주거용 오피스텔은 주택 수에 포함됩니다. 본인은 1주택이라 생각했는데 중과가 걸리는 경우가 여기서 나옵니다.
취득세 말고 또 뭐가 드나요?
중개보수(요율 상한 0.4~0.7%), 법무사 등기비, 인지세, 국민주택채권 매입 손실이 있습니다. 합치면 집값의 0.5~1% 정도를 더 잡아 두시는 게 안전합니다. 이 계산기에는 세금만 들어 있습니다.
같이 보면 좋은 것
요율·기준 확인일 2026-09-16 · 본 계산기는 참고용이며 법적 효력이 없습니다. 입력값은 브라우저에서만 계산되며 서버로 전송되지 않습니다.
dmFyIFRIRU1FX0lDTz1mdW5jdGlvbih0KXtyZXR1cm4gdD09PSdkYXJrJz8nPHN2ZyBjbGFzcz0idHBoLWkgaWNvLXMiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS43IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGFyaWEtaGlkZGVuPSJ0cnVlIj48cGF0aCBkPSJNMjAgMTQuNUE4LjUgOC41IDAgMCAxIDkuNSA0YTguNSA4LjUgMCAxIDAgMTAuNSAxMC41eiIvPjwvc3ZnPic6dD09PSdsaWdodCc/JzxzdmcgY2xhc3M9InRwaC1pIGljby1zIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PHBhdGggZD0iTTEyIDcuNWE0LjUgNC41IDAgMSAwIDAgOSA0LjUgNC41IDAgMCAwIDAtOXpNMTIgMnYyTTEyIDIwdjJNNC4yIDQuMmwxLjQgMS40TTE4LjQgMTguNGwxLjQgMS40TTIgMTJoMk0yMCAxMmgyTTQuMiAxOS44bDEuNC0xLjRNMTguNCA1LjZsMS40LTEuNCIvPjwvc3ZnPic6JzxzdmcgY2xhc3M9InRwaC1pIGljby1zIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PHBhdGggZD0iTTEyIDNhOSA5IDAgMSAwIDAgMTggOSA5IDAgMCAwIDAtMTh6TTEyIDN2MThhOSA5IDAgMCAwIDAtMTh6Ii8+PC9zdmc+Jzt9OwoKdmFyICQ9ZnVuY3Rpb24oaSl7cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0cGgtJytpKTt9Owp2YXIgdj1mdW5jdGlvbihpKXt2YXIgZT0kKGkpO3JldHVybiBlPygrZS52YWx1ZXx8MCk6MDt9Owp2YXIgcz1mdW5jdGlvbihpKXt2YXIgZT0kKGkpO3JldHVybiBlP2UudmFsdWU6Jyc7fTsKdmFyIGY9ZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucm91bmQobikudG9Mb2NhbGVTdHJpbmcoJ2tvLUtSJykrJ+ybkCc7fTsKdmFyIGZkPWZ1bmN0aW9uKG4sZCl7cmV0dXJuIG4udG9Mb2NhbGVTdHJpbmcoJ2tvLUtSJyx7bWF4aW11bUZyYWN0aW9uRGlnaXRzOmR8fDF9KTt9Owp2YXIgY3V0MTA9ZnVuY3Rpb24oeCl7cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yb3VuZCh4KS8xMCkqMTA7fTsKdmFyIHNldD1mdW5jdGlvbihpLHQpe3ZhciBlPSQoaSk7aWYoIWUpcmV0dXJuO2lmKGk9PT0nbWFpbicpe2NvdW50VXAoZSx0KTt9ZWxzZXtlLnRleHRDb250ZW50PXQ7fX07CgovKiDslYjsoITtlZwg7KCA7J6l7IaMIOygkeq3vCDigJQg7Iuc7YGs66a/IOuqqOuTnC/ssKjri6gg7ZmY6rK97JeQ7ISc64+EIOyjveyngCDslYrqsowgKi8KdmFyIHN0b3JlPXsKICBnZXQ6ZnVuY3Rpb24oayl7dHJ5e3JldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrKTt9Y2F0Y2goZSl7cmV0dXJuIG51bGw7fX0sCiAgc2V0OmZ1bmN0aW9uKGssdmFsKXt0cnl7bG9jYWxTdG9yYWdlLnNldEl0ZW0oayx2YWwpO31jYXRjaChlKXt9fSwKICBkZWw6ZnVuY3Rpb24oayl7dHJ5e2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGspO31jYXRjaChlKXt9fQp9OwoKdmFyIHRvYXN0PWZ1bmN0aW9uKG1zZyl7CiAgdmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRwaC10b2FzdCcpOwogIGlmKCF0KXt0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO3QuY2xhc3NOYW1lPSd0cGgtdG9hc3QnO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCk7fQogIHQudGV4dENvbnRlbnQ9bXNnO3QuY2xhc3NMaXN0LmFkZCgnc2hvdycpOwogIGNsZWFyVGltZW91dCh0Ll9oKTt0Ll9oPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTt9LDE5MDApOwp9OwoKLyog7YWM66eIIO2GoOq4gDog7Iuc7Iqk7YWcIOyEpOyglSDihpIg65287J207Yq4IOKGkiDri6Ttgawg7Iic7ZmYICovCmZ1bmN0aW9uIGluaXRUaGVtZShyb290KXsKICB2YXIgSz0ndHBoLXRoZW1lJywgY3VyPXN0b3JlLmdldChLKTsKICBpZihjdXIpIHJvb3Quc2V0QXR0cmlidXRlKCdkYXRhLXRoZW1lJyxjdXIpOwogIHZhciBiPSQoJ3RoZW1lJyk7CiAgaWYoIWIpIHJldHVybjsKICB2YXIgbGFiZWw9ZnVuY3Rpb24oKXsKICAgIHZhciB0PXJvb3QuZ2V0QXR0cmlidXRlKCdkYXRhLXRoZW1lJyk7CiAgICBiLmlubmVySFRNTD1USEVNRV9JQ08odCkrJyA8c3Bhbj4nKyh0PT09J2RhcmsnPyfri6TtgawnOnQ9PT0nbGlnaHQnPyfrnbzsnbTtirgnOifsnpDrj5knKSsnPC9zcGFuPic7CiAgfTsKICBsYWJlbCgpOwogIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICB2YXIgdD1yb290LmdldEF0dHJpYnV0ZSgnZGF0YS10aGVtZScpOwogICAgdmFyIG54PSF0PydsaWdodCc6dD09PSdsaWdodCc/J2RhcmsnOicnOwogICAgaWYobngpe3Jvb3Quc2V0QXR0cmlidXRlKCdkYXRhLXRoZW1lJyxueCk7c3RvcmUuc2V0KEssbngpO30KICAgIGVsc2V7cm9vdC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnKTtzdG9yZS5kZWwoSyk7fQogICAgbGFiZWwoKTsKICB9KTsKfQoKLyog7J6F66Cl6rCSIOKGlCBVUkwg7YyM652866+47YSwIOKGlCBsb2NhbFN0b3JhZ2UgKi8KZnVuY3Rpb24gaW5pdFN0YXRlKHNsdWcsIGlkcywgb25jaGFuZ2UpewogIHZhciBLRVk9J3RwaC1pbi0nK3NsdWcsIHE9bmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbi5zZWFyY2gpLCB1c2VkPWZhbHNlOwogIGlkcy5mb3JFYWNoKGZ1bmN0aW9uKGkpewogICAgdmFyIGU9JChpKTsgaWYoIWUpIHJldHVybjsKICAgIGlmKHEuaGFzKGkpKXsgZS52YWx1ZT1xLmdldChpKTsgdXNlZD10cnVlOyB9CiAgfSk7CiAgaWYoIXVzZWQpewogICAgdmFyIHJhdz1zdG9yZS5nZXQoS0VZKTsKICAgIGlmKHJhdyl7IHRyeXsgdmFyIG89SlNPTi5wYXJzZShyYXcpOwogICAgICBpZHMuZm9yRWFjaChmdW5jdGlvbihpKXsgdmFyIGU9JChpKTsgaWYoZSYmb1tpXSE9PXVuZGVmaW5lZCYmb1tpXSE9PScnKSBlLnZhbHVlPW9baV07IH0pOwogICAgfWNhdGNoKGUpe30gfQogIH0KICB2YXIgc2F2ZT1mdW5jdGlvbigpewogICAgdmFyIG89e307IGlkcy5mb3JFYWNoKGZ1bmN0aW9uKGkpeyB2YXIgZT0kKGkpOyBpZihlKSBvW2ldPWUudmFsdWU7IH0pOwogICAgc3RvcmUuc2V0KEtFWSwgSlNPTi5zdHJpbmdpZnkobykpOwogIH07CiAgdmFyIHNoYXJlPSQoJ3NoYXJlJyk7CiAgaWYoc2hhcmUpIHNoYXJlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgdmFyIHA9bmV3IFVSTFNlYXJjaFBhcmFtcygpOwogICAgaWRzLmZvckVhY2goZnVuY3Rpb24oaSl7IHZhciBlPSQoaSk7IGlmKGUpIHAuc2V0KGksZS52YWx1ZSk7IH0pOwogICAgdmFyIHVybD1sb2NhdGlvbi5vcmlnaW4rbG9jYXRpb24ucGF0aG5hbWUrJz8nK3AudG9TdHJpbmcoKTsKICAgIHZhciBkb25lPWZ1bmN0aW9uKCl7dG9hc3QoJ+unge2BrOulvCDrs7XsgqztlojsirXri4jri6QnKTt9OwogICAgaWYobmF2aWdhdG9yLmNsaXBib2FyZCYmbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpewogICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh1cmwpLnRoZW4oZG9uZSxmdW5jdGlvbigpe3Byb21wdCgn7JWE656YIOyjvOyGjOulvCDrs7XsgqztlZjshLjsmpQnLHVybCk7fSk7CiAgICB9IGVsc2UgcHJvbXB0KCfslYTrnpgg7KO87IaM66W8IOuzteyCrO2VmOyEuOyalCcsdXJsKTsKICB9KTsKICB2YXIgY29weT0kKCdjb3B5Jyk7CiAgaWYoY29weSkgY29weS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgIHZhciBsaW5lcz1bZG9jdW1lbnQudGl0bGUuc3BsaXQoJ3wnKVswXS50cmltKCldOwogICAgaWRzLmZvckVhY2goZnVuY3Rpb24oaSl7CiAgICAgIHZhciBlPSQoaSk7IGlmKCFlKSByZXR1cm47CiAgICAgIHZhciBsYWI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGFiZWxbZm9yPXRwaC0nK2krJ10nKTsKICAgICAgdmFyIHZhbD1lLnRhZ05hbWU9PT0nU0VMRUNUJz9lLm9wdGlvbnNbZS5zZWxlY3RlZEluZGV4XS50ZXh0OigrZS52YWx1ZXx8MCkudG9Mb2NhbGVTdHJpbmcoJ2tvLUtSJyk7CiAgICAgIGlmKGxhYikgbGluZXMucHVzaCgnwrcgJytsYWIudGV4dENvbnRlbnQudHJpbSgpKyc6ICcrdmFsKTsKICAgIH0pOwogICAgbGluZXMucHVzaCgnJyk7CiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudHBoLXRvdGFsJykuZm9yRWFjaChmdW5jdGlvbih0KXsKICAgICAgdmFyIGw9dC5xdWVyeVNlbGVjdG9yKCcubCcpLCB2YWw9dC5xdWVyeVNlbGVjdG9yKCcudicpOwogICAgICBpZihsJiZ2YWwpIGxpbmVzLnB1c2gobC50ZXh0Q29udGVudC50cmltKCkrJzogJyt2YWwudGV4dENvbnRlbnQudHJpbSgpKTsKICAgIH0pOwogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRwaC1wYWdlIHRhYmxlJykuZm9yRWFjaChmdW5jdGlvbih0Yil7CiAgICAgIHRiLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJykuZm9yRWFjaChmdW5jdGlvbih0cil7CiAgICAgICAgdmFyIHRkPXRyLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJyk7CiAgICAgICAgaWYodGQubGVuZ3RoPT09MikgbGluZXMucHVzaCgnwrcgJyt0ZFswXS50ZXh0Q29udGVudC50cmltKCkrJzogJyt0ZFsxXS50ZXh0Q29udGVudC50cmltKCkpOwogICAgICB9KTsKICAgIH0pOwogICAgbGluZXMucHVzaCgnJywgbG9jYXRpb24ub3JpZ2luK2xvY2F0aW9uLnBhdGhuYW1lKTsKICAgIHZhciB0eHQ9bGluZXMuam9pbignXG4nKTsKICAgIHZhciBkb25lPWZ1bmN0aW9uKCl7dG9hc3QoJ+qysOqzvOulvCDrs7XsgqztlojsirXri4jri6QnKTt9OwogICAgaWYobmF2aWdhdG9yLmNsaXBib2FyZCYmbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHR4dCkudGhlbihkb25lLGRvbmUpOwogICAgZWxzZSB7IHZhciB0YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOyB0YS52YWx1ZT10eHQ7IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOwogICAgICAgICAgIHRhLnNlbGVjdCgpOyB0cnl7ZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTt9Y2F0Y2goZSl7fSB0YS5yZW1vdmUoKTsgZG9uZSgpOyB9CiAgfSk7CiAgdmFyIHJlc2V0PSQoJ3Jlc2V0Jyk7CiAgaWYocmVzZXQpIHJlc2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgc3RvcmUuZGVsKEtFWSk7IGxvY2F0aW9uLmhyZWY9bG9jYXRpb24ucGF0aG5hbWU7CiAgfSk7CiAgcmV0dXJuIHNhdmU7Cn0KCi8qIOq4iOyVoSDsnoXroKUg67CRIOu5oOuluCDsobDsoJUg7LmpICovCmZ1bmN0aW9uIGluaXRDaGlwcyhvbmNoYW5nZSl7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRwaC1jaGlwJykuZm9yRWFjaChmdW5jdGlvbihjKXsKICAgIGMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICAgIHZhciBlPSQoYy5kYXRhc2V0LnQpOyBpZighZSkgcmV0dXJuOwogICAgICB2YXIgZD1jLmRhdGFzZXQuZDsKICAgICAgZS52YWx1ZSA9IGQ9PT0nMCcgPyAwIDogTWF0aC5tYXgoMCwoK2UudmFsdWV8fDApKygrZCkpOwogICAgICBvbmNoYW5nZSgpOwogICAgfSk7CiAgfSk7Cn0KCi8qIOyeheugpeqwkuydhCDsgqzrnozsnbQg7J2964qUIOusuOyepeycvOuhnCAoMywwMDAsMDAwIOKGkiAzMDDrp4zsm5ApICovCmZ1bmN0aW9uIGtvck1vbmV5KG4pewogIG49TWF0aC5yb3VuZChuKTsgaWYoIW4pIHJldHVybiAnMOybkCc7CiAgdmFyIGVvaz1NYXRoLmZsb29yKG4vMTAwMDAwMDAwKSwgbWFuPU1hdGguZmxvb3IoKG4lMTAwMDAwMDAwKS8xMDAwMCksIHdvbj1uJTEwMDAwLCBwPVtdOwogIGlmKGVvaykgcC5wdXNoKGVvaysn7Ja1Jyk7CiAgaWYobWFuKSBwLnB1c2gobWFuLnRvTG9jYWxlU3RyaW5nKCdrby1LUicpKyfrp4wnKTsKICBpZih3b24pIHAucHVzaCh3b24udG9Mb2NhbGVTdHJpbmcoJ2tvLUtSJykpOwogIHJldHVybiBwLmpvaW4oJyAnKSsn7JuQJzsKfQpmdW5jdGlvbiBpbml0UmVhZChtYXApewogIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaChmdW5jdGlvbihpZCl7CiAgICB2YXIgZT0kKGlkKSwgb3V0PSQobWFwW2lkXSk7IGlmKCFlfHwhb3V0KSByZXR1cm47CiAgICB2YXIgdXBkPWZ1bmN0aW9uKCl7IG91dC50ZXh0Q29udGVudCA9ICgrZS52YWx1ZT4wKSA/IGtvck1vbmV5KCtlLnZhbHVlKSA6ICcnOyB9OwogICAgZS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsdXBkKTsgdXBkKCk7CiAgfSk7Cn0KCgovKiDsiKvsnpAg7Lm07Jq07Yq47JeFIOKAlCDqsrDqs7zqsIAg67CU64CUIOuVjCDrtoDrk5zrn73qsowgKi8KZnVuY3Rpb24gY291bnRVcChlbCwgdGV4dCl7CiAgaWYoIWVsKSByZXR1cm47CiAgdmFyIHByZXY9ZWwuX3Jhd3x8JycsIGN1cj10ZXh0OwogIGVsLl9yYXc9Y3VyOwogIHZhciBwbj1wYXJzZUZsb2F0KFN0cmluZyhwcmV2KS5yZXBsYWNlKC9bXjAtOS4tXS9nLCcnKSk7CiAgdmFyIGNuPXBhcnNlRmxvYXQoU3RyaW5nKGN1cikucmVwbGFjZSgvW14wLTkuLV0vZywnJykpOwogIHZhciByZWR1Y2U9d2luZG93Lm1hdGNoTWVkaWEmJndpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScpLm1hdGNoZXM7CiAgaWYocmVkdWNlfHwhaXNGaW5pdGUocG4pfHwhaXNGaW5pdGUoY24pfHxwbj09PWNufHxNYXRoLmFicyhjbi1wbik8MSl7ZWwudGV4dENvbnRlbnQ9Y3VyO3JldHVybjt9CiAgdmFyIHByZT1jdXIuc2xpY2UoMCxjdXIuc2VhcmNoKC9bMC05LV0vKSk7CiAgdmFyIHBvc3Q9Y3VyLnNsaWNlKGN1ci5zZWFyY2goL1swLTldW14wLTldKiQvKSsxKS5yZXBsYWNlKC9eWzAtOV0vLCcnKTsKICB2YXIgc3VmZml4PWN1ci5yZXBsYWNlKC9eW14wLTktXSovLCcnKS5yZXBsYWNlKC9eWzAtOSwuXC1dKy8sJycpOwogIHZhciB0MD1udWxsLCBkdXI9MzgwOwogIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGVsLl9hZnx8MCk7CiAgZnVuY3Rpb24gc3RlcCh0KXsKICAgIGlmKCF0MCkgdDA9dDsKICAgIHZhciBrPU1hdGgubWluKDEsKHQtdDApL2R1ciksIGU9MS1NYXRoLnBvdygxLWssMyk7CiAgICB2YXIgdmFsPXBuKyhjbi1wbikqZTsKICAgIGVsLnRleHRDb250ZW50PXByZStNYXRoLnJvdW5kKHZhbCkudG9Mb2NhbGVTdHJpbmcoJ2tvLUtSJykrc3VmZml4OwogICAgaWYoazwxKSBlbC5fYWY9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApOyBlbHNlIGVsLnRleHRDb250ZW50PWN1cjsKICB9CiAgZWwuX2FmPXJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTsKfQoKLyog66qo67CU7J28IOqzoOyglSDqsrDqs7zrsJQgKyDrp6gg7JyE66GcICovCmZ1bmN0aW9uIGluaXRTdGlja3kocm9vdCwgbGFiZWwpewogIGlmKCFyb290KSByZXR1cm47CiAgdmFyIG1haW49JCgnbWFpbicpOyBpZighbWFpbikgcmV0dXJuOwogIHZhciBiYXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgYmFyLmNsYXNzTmFtZT0ndHBoLXN0aWNreSc7CiAgYmFyLmlubmVySFRNTD0nPGRpdiBjbGFzcz0ibCI+JytsYWJlbCsnPC9kaXY+PGRpdiBjbGFzcz0idiIgaWQ9InRwaC1zdGlja3l2Ij7igKY8L2Rpdj4nOwogIHJvb3QuYXBwZW5kQ2hpbGQoYmFyKTsKICB2YXIgdG9wPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIHRvcC50eXBlPSdidXR0b24nOyB0b3AuY2xhc3NOYW1lPSd0cGgtdG9wJzsgdG9wLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsJ+unqCDsnITroZwnKTsKICB0b3AuaW5uZXJIVE1MPSc8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDE5VjUiLz48cGF0aCBkPSJNNSAxMmw3LTcgNyA3Ii8+PC9zdmc+JzsKICB0b3AuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7d2luZG93LnNjcm9sbFRvKHt0b3A6MCxiZWhhdmlvcjonc21vb3RoJ30pO30pOwogIHJvb3QuYXBwZW5kQ2hpbGQodG9wKTsKICB2YXIgc3Y9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RwaC1zdGlja3l2Jyk7CiAgdmFyIHN5bmM9ZnVuY3Rpb24oKXsKICAgIGlmKHN2JiZzdi50ZXh0Q29udGVudCE9PW1haW4udGV4dENvbnRlbnQpIHN2LnRleHRDb250ZW50PW1haW4udGV4dENvbnRlbnQ7CiAgICB2YXIgcj1tYWluLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgYmFyLmNsYXNzTGlzdC50b2dnbGUoJ29uJywgci5ib3R0b208NTYpOwogICAgdG9wLmNsYXNzTGlzdC50b2dnbGUoJ29uJywgd2luZG93LnNjcm9sbFk+NTAwKTsKICB9OwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLHN5bmMse3Bhc3NpdmU6dHJ1ZX0pOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLHN5bmMpOwogIGlmKHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyKSBuZXcgTXV0YXRpb25PYnNlcnZlcihzeW5jKS5vYnNlcnZlKG1haW4se2NoaWxkTGlzdDp0cnVlLGNoYXJhY3RlckRhdGE6dHJ1ZSxzdWJ0cmVlOnRydWV9KTsKICBzeW5jKCk7Cn0KCi8qIOKUgOKUgCDssKjtirgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgIOyDieydgCBDU1Mg67OA7IiYIC0tczEvLS1zMi8tLXMzICjqsoDspp3rkJwg7Lm07YWM6rOg66asIO2MlOugiO2KuCkuCiAgIOqzhOyXtOydtCAy6rCcIOydtOyDgeydtOuptCDrspTroYDrpbwg7ZWt7IOBIOu2meydtOqzoCwg6rCS7J2AIO2RnOyXkOuPhCDqt7jrjIDroZwg7J6I64ukLiAqLwp2YXIgU1ZHTlM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJzsKZnVuY3Rpb24gZWwodCxhKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHTlMsdCk7Zm9yKHZhciBrIGluIGEpZS5zZXRBdHRyaWJ1dGUoayxhW2tdKTtyZXR1cm4gZTt9CgpmdW5jdGlvbiB0aXAoYm94KXsKICB2YXIgdD1ib3gucXVlcnlTZWxlY3RvcignLnRwaC10aXAnKTsKICBpZighdCl7dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTt0LmNsYXNzTmFtZT0ndHBoLXRpcCc7Ym94LmFwcGVuZENoaWxkKHQpO30KICByZXR1cm4gdDsKfQpmdW5jdGlvbiBzaG93VGlwKGJveCx4LHksaHRtbCl7CiAgdmFyIHQ9dGlwKGJveCk7IHQuaW5uZXJIVE1MPWh0bWw7IHQuc3R5bGUub3BhY2l0eT0nMSc7CiAgdmFyIHc9dC5vZmZzZXRXaWR0aCwgYnc9Ym94LmNsaWVudFdpZHRoOwogIHQuc3R5bGUubGVmdD1NYXRoLm1heCg0LE1hdGgubWluKGJ3LXctNCx4LXcvMikpKydweCc7CiAgdC5zdHlsZS50b3A9TWF0aC5tYXgoMix5LXQub2Zmc2V0SGVpZ2h0LTEwKSsncHgnOwp9CmZ1bmN0aW9uIGhpZGVUaXAoYm94KXt2YXIgdD1ib3gucXVlcnlTZWxlY3RvcignLnRwaC10aXAnKTtpZih0KXQuc3R5bGUub3BhY2l0eT0nMCc7fQoKLyog7IS466GcIOuIhOyggSDrp4nrjIAg4oCUIGNhdHM6W+udvOuyqF0sIHNlcmllczpbe25hbWUsY2xzLGRhdGE6W119XSAqLwpmdW5jdGlvbiBzdGFja0NoYXJ0KGJveElkLCBjYXRzLCBzZXJpZXMsIGZtdCl7CiAgdmFyIGJveD0kKGJveElkKTsgaWYoIWJveCkgcmV0dXJuOwogIGJveC5xdWVyeVNlbGVjdG9yQWxsKCdzdmcsLnRwaC1sZWdlbmQnKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe24ucmVtb3ZlKCk7fSk7CiAgdmFyIFc9NjYwLEg9MjM2LFBMPTgsUFI9OCxQVD0xNCxQQj0yNjsKICB2YXIgbj1jYXRzLmxlbmd0aDsgaWYoIW4pIHJldHVybjsKICB2YXIgdG90YWxzPWNhdHMubWFwKGZ1bmN0aW9uKF8saSl7cmV0dXJuIHNlcmllcy5yZWR1Y2UoZnVuY3Rpb24oYSxzKXtyZXR1cm4gYSsocy5kYXRhW2ldfHwwKTt9LDApO30pOwogIHZhciBtYXg9TWF0aC5tYXguYXBwbHkobnVsbCx0b3RhbHMpfHwxOwogIHZhciBpdz1XLVBMLVBSLCBpaD1ILVBULVBCOwogIHZhciBidz1NYXRoLm1heCg2LE1hdGgubWluKDQ2LGl3L24qMC42OCkpLCBzdGVwPWl3L247CiAgdmFyIHN2Zz1lbCgnc3ZnJyx7dmlld0JveDonMCAwICcrVysnICcrSCxyb2xlOidpbWcnfSk7CiAgZm9yKHZhciBnPTA7Zzw9MztnKyspewogICAgdmFyIGd5PVBUK2loKmcvMzsKICAgIHN2Zy5hcHBlbmRDaGlsZChlbCgnbGluZScse3gxOlBMLHkxOmd5LHgyOlctUFIseTI6Z3ksJ2NsYXNzJzonZ2wnfSkpOwogIH0KICBjYXRzLmZvckVhY2goZnVuY3Rpb24oYyxpKXsKICAgIHZhciBjeD1QTCtzdGVwKmkrc3RlcC8yLCB5PVBUK2loLCBhY2M9MDsKICAgIHNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKHMsc2kpewogICAgICB2YXIgdmFsPXMuZGF0YVtpXXx8MDsgaWYodmFsPD0wKSByZXR1cm47CiAgICAgIHZhciBoPXZhbC9tYXgqaWg7IHktPWg7IGFjYys9dmFsOwogICAgICB2YXIgaXNUb3AgPSBzaT09PXNlcmllcy5sZW5ndGgtMSB8fCAhc2VyaWVzLnNsaWNlKHNpKzEpLnNvbWUoZnVuY3Rpb24oeil7cmV0dXJuICh6LmRhdGFbaV18fDApPjA7fSk7CiAgICAgIHZhciByPWVsKCdyZWN0Jyx7eDpjeC1idy8yLHk6eSx3aWR0aDpidyxoZWlnaHQ6TWF0aC5tYXgoMSxoKSwnY2xhc3MnOnMuY2xzLAogICAgICAgICAgICAgICAgICAgICAgIHJ4OmlzVG9wPzQ6MCxyeTppc1RvcD80OjB9KTsKICAgICAgc3ZnLmFwcGVuZENoaWxkKHIpOwogICAgfSk7CiAgICB2YXIgaGl0PWVsKCdyZWN0Jyx7eDpjeC1zdGVwLzIrMSx5OlBULHdpZHRoOnN0ZXAtMixoZWlnaHQ6aWgsJ2NsYXNzJzonaGl0J30pOwogICAgaGl0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsZnVuY3Rpb24oZXYpewogICAgICB2YXIgYnI9Ym94LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICB2YXIgcm93cz1zZXJpZXMubWFwKGZ1bmN0aW9uKHMpewogICAgICAgIHJldHVybiAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjhweDtoZWlnaHQ6OHB4O2JvcmRlci1yYWRpdXM6MnB4OycKICAgICAgICAgICAgICsgJ2JhY2tncm91bmQ6dmFyKC0tJytzLmNscysnKTttYXJnaW4tcmlnaHQ6NnB4Ij48L3NwYW4+JytzLm5hbWUrJyAnK2ZtdChzLmRhdGFbaV18fDApOwogICAgICB9KS5qb2luKCc8YnI+Jyk7CiAgICAgIHNob3dUaXAoYm94LGV2LmNsaWVudFgtYnIubGVmdCxldi5jbGllbnRZLWJyLnRvcCwKICAgICAgICAgICAgICAnPGI+JytjKyc8L2I+PGJyPicrcm93cysnPGJyPu2VqeqzhCAnK2ZtdChhY2MpKTsKICAgIH0pOwogICAgaGl0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLGZ1bmN0aW9uKCl7aGlkZVRpcChib3gpO30pOwogICAgc3ZnLmFwcGVuZENoaWxkKGhpdCk7CiAgICBpZihuPD0xNHx8aSVNYXRoLmNlaWwobi8xMik9PT0wKQogICAgICBzdmcuYXBwZW5kQ2hpbGQoT2JqZWN0LmFzc2lnbihlbCgndGV4dCcse3g6Y3gseTpILTgsJ2NsYXNzJzonbGInLCd0ZXh0LWFuY2hvcic6J21pZGRsZSd9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3RleHRDb250ZW50OmN9KSk7CiAgfSk7CiAgYm94LmFwcGVuZENoaWxkKHN2Zyk7CiAgYm94LmFwcGVuZENoaWxkKGxlZ2VuZChzZXJpZXMpKTsKfQoKLyog6rCA66GcIOuIhOyggSDrp4nrjIAo6rWs7ISxKSDigJQgc2Vnczpbe25hbWUsY2xzLHZhbHVlfV0gwrcg7KeB7KCRIOudvOuyqCAqLwpmdW5jdGlvbiBoU3RhY2soYm94SWQsIHNlZ3MsIGZtdCl7CiAgdmFyIGJveD0kKGJveElkKTsgaWYoIWJveCkgcmV0dXJuOwogIGJveC5xdWVyeVNlbGVjdG9yQWxsKCdzdmcsLnRwaC1sZWdlbmQnKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe24ucmVtb3ZlKCk7fSk7CiAgdmFyIHRvdGFsPXNlZ3MucmVkdWNlKGZ1bmN0aW9uKGEscyl7cmV0dXJuIGErTWF0aC5tYXgoMCxzLnZhbHVlKTt9LDApfHwxOwogIHZhciBXPTY2MCxIPTY0LFBMPTgsUFI9OCxCSD0zNCxUWT0xMjsKICB2YXIgc3ZnPWVsKCdzdmcnLHt2aWV3Qm94OicwIDAgJytXKycgJytILHJvbGU6J2ltZyd9KTsKICB2YXIgeD1QTCwgaXc9Vy1QTC1QUjsKICBzZWdzLmZvckVhY2goZnVuY3Rpb24ocyxpKXsKICAgIHZhciB3PU1hdGgubWF4KDAscy52YWx1ZSkvdG90YWwqaXc7IGlmKHc8PTApIHJldHVybjsKICAgIHZhciBmaXJzdD1pPT09MCwgbGFzdD1pPT09c2Vncy5sZW5ndGgtMTsKICAgIHN2Zy5hcHBlbmRDaGlsZChlbCgncmVjdCcse3g6eCx5OlRZLHdpZHRoOncsaGVpZ2h0OkJILCdjbGFzcyc6cy5jbHMsCiAgICAgIHJ4OihmaXJzdHx8bGFzdCk/NDowLHJ5OihmaXJzdHx8bGFzdCk/NDowfSkpOwogICAgdmFyIHBjdD1zLnZhbHVlL3RvdGFsKjEwMDsKICAgIGlmKHBjdD49OSkKICAgICAgc3ZnLmFwcGVuZENoaWxkKE9iamVjdC5hc3NpZ24oZWwoJ3RleHQnLHt4Ongrdy8yLHk6VFkrQkgvMis0LCdjbGFzcyc6J3ZsJywKICAgICAgICAndGV4dC1hbmNob3InOidtaWRkbGUnLGZpbGw6JyNmZmYnfSkse3RleHRDb250ZW50OnBjdC50b0ZpeGVkKDApKyclJ30pKTsKICAgIHZhciBoaXQ9ZWwoJ3JlY3QnLHt4OngseTpUWSx3aWR0aDp3LGhlaWdodDpCSCwnY2xhc3MnOidoaXQnfSk7CiAgICAoZnVuY3Rpb24oc2VnLHB4LHB3KXsKICAgICAgaGl0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsZnVuY3Rpb24oZXYpewogICAgICAgIHZhciBicj1ib3guZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgc2hvd1RpcChib3gsZXYuY2xpZW50WC1ici5sZWZ0LGV2LmNsaWVudFktYnIudG9wLAogICAgICAgICAgJzxiPicrc2VnLm5hbWUrJzwvYj48YnI+JytmbXQoc2VnLnZhbHVlKSsnIMK3ICcrKHNlZy52YWx1ZS90b3RhbCoxMDApLnRvRml4ZWQoMSkrJyUnKTsKICAgICAgfSk7CiAgICAgIGhpdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJyxmdW5jdGlvbigpe2hpZGVUaXAoYm94KTt9KTsKICAgIH0pKHMseCx3KTsKICAgIHN2Zy5hcHBlbmRDaGlsZChoaXQpOwogICAgeCs9dzsKICB9KTsKICBib3guYXBwZW5kQ2hpbGQoc3ZnKTsKICBib3guYXBwZW5kQ2hpbGQobGVnZW5kKHNlZ3MubWFwKGZ1bmN0aW9uKHMpe3JldHVybiB7bmFtZTpzLm5hbWUrJyAnK2ZtdChzLnZhbHVlKSxjbHM6cy5jbHN9O30pKSk7Cn0KCi8qIOyEoO2YlSDstpTsnbQg7LCo7Yq4IOKAlCBzZXJpZXM6W3tuYW1lLGNscyxkYXRhOltdfV0sIGNhdHM6W+udvOuyqF0gKi8KZnVuY3Rpb24gbGluZUNoYXJ0KGJveElkLCBjYXRzLCBzZXJpZXMsIGZtdCl7CiAgdmFyIGJveD0kKGJveElkKTsgaWYoIWJveCkgcmV0dXJuOwogIGJveC5xdWVyeVNlbGVjdG9yQWxsKCdzdmcsLnRwaC1sZWdlbmQnKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe24ucmVtb3ZlKCk7fSk7CiAgdmFyIG49Y2F0cy5sZW5ndGg7IGlmKG48MikgcmV0dXJuOwogIHZhciBXPTY2MCxIPTI0MCxQTD01NCxQUj0xMixQVD0xNCxQQj0yNjsKICB2YXIgYWxsPVtdOyBzZXJpZXMuZm9yRWFjaChmdW5jdGlvbihzKXthbGw9YWxsLmNvbmNhdChzLmRhdGEuZmlsdGVyKGZ1bmN0aW9uKHYpe3JldHVybiB2IT1udWxsO30pKTt9KTsKICBpZighYWxsLmxlbmd0aCkgcmV0dXJuOwogIHZhciBteD1NYXRoLm1heC5hcHBseShudWxsLGFsbCksIG1uPU1hdGgubWluLmFwcGx5KG51bGwsYWxsKTsKICB2YXIgcGFkPShteC1tbikqMC4xNXx8bXgqMC4wMnx8MTsgbXgrPXBhZDsgbW49TWF0aC5tYXgoMCxtbi1wYWQpOwogIHZhciBpdz1XLVBMLVBSLCBpaD1ILVBULVBCOwogIHZhciBYPWZ1bmN0aW9uKGkpe3JldHVybiBQTCtpdyoobj09PTE/MC41OmkvKG4tMSkpO307CiAgdmFyIFk9ZnVuY3Rpb24odil7cmV0dXJuIFBUK2loKigxLSh2LW1uKS8oKG14LW1uKXx8MSkpO307CiAgdmFyIHN2Zz1lbCgnc3ZnJyx7dmlld0JveDonMCAwICcrVysnICcrSCxyb2xlOidpbWcnfSk7CiAgZm9yKHZhciBnPTA7Zzw9NDtnKyspewogICAgdmFyIGd2PW1uKyhteC1tbikqZy80LCBneT1ZKGd2KTsKICAgIHN2Zy5hcHBlbmRDaGlsZChlbCgnbGluZScse3gxOlBMLHkxOmd5LHgyOlctUFIseTI6Z3ksJ2NsYXNzJzonZ2wnfSkpOwogICAgc3ZnLmFwcGVuZENoaWxkKE9iamVjdC5hc3NpZ24oZWwoJ3RleHQnLHt4OlBMLTgseTpneSs0LCdjbGFzcyc6J2xiJywndGV4dC1hbmNob3InOidlbmQnfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dGV4dENvbnRlbnQ6TWF0aC5yb3VuZChndikudG9Mb2NhbGVTdHJpbmcoJ2tvLUtSJyl9KSk7CiAgfQogIHNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKHMpewogICAgdmFyIGQ9JycsIHN0YXJ0ZWQ9ZmFsc2U7CiAgICBzLmRhdGEuZm9yRWFjaChmdW5jdGlvbih2LGkpewogICAgICBpZih2PT1udWxsKSByZXR1cm47CiAgICAgIGQrPShzdGFydGVkPydMJzonTScpK1goaSkudG9GaXhlZCgxKSsnICcrWSh2KS50b0ZpeGVkKDEpKycgJzsgc3RhcnRlZD10cnVlOwogICAgfSk7CiAgICBpZihkKSBzdmcuYXBwZW5kQ2hpbGQoZWwoJ3BhdGgnLHtkOmQsZmlsbDonbm9uZScsJ3N0cm9rZSc6J3ZhcigtLScrcy5jbHMrJyknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cm9rZS13aWR0aCc6Mi4yLCdzdHJva2UtbGluZWpvaW4nOidyb3VuZCcsJ3N0cm9rZS1saW5lY2FwJzoncm91bmQnfSkpOwogICAgdmFyIGxhc3Q9cy5kYXRhLmxlbmd0aC0xOwogICAgaWYocy5kYXRhW2xhc3RdIT1udWxsKQogICAgICBzdmcuYXBwZW5kQ2hpbGQoZWwoJ2NpcmNsZScse2N4OlgobGFzdCksY3k6WShzLmRhdGFbbGFzdF0pLHI6NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsOid2YXIoLS0nK3MuY2xzKycpJyxzdHJva2U6J3ZhcigtLXN1cmZhY2UpJywnc3Ryb2tlLXdpZHRoJzoyfSkpOwogIH0pOwogIGNhdHMuZm9yRWFjaChmdW5jdGlvbihjLGkpewogICAgaWYobj4xMCAmJiBpJU1hdGguY2VpbChuLzcpIT09MCAmJiBpIT09bi0xKSByZXR1cm47CiAgICBzdmcuYXBwZW5kQ2hpbGQoT2JqZWN0LmFzc2lnbihlbCgndGV4dCcse3g6WChpKSx5OkgtOCwnY2xhc3MnOidsYicsJ3RleHQtYW5jaG9yJzonbWlkZGxlJ30pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3RleHRDb250ZW50OmN9KSk7CiAgfSk7CiAgZm9yKHZhciBpPTA7aTxuO2krKyl7CiAgICAoZnVuY3Rpb24oaWR4KXsKICAgICAgdmFyIGhpdD1lbCgncmVjdCcse3g6WChpZHgpLWl3LyhuLTEpLzIseTpQVCx3aWR0aDppdy8obi0xKXx8MjAsaGVpZ2h0OmloLCdjbGFzcyc6J2hpdCd9KTsKICAgICAgaGl0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsZnVuY3Rpb24oZXYpewogICAgICAgIHZhciBicj1ib3guZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgdmFyIHJvd3M9c2VyaWVzLm1hcChmdW5jdGlvbihzKXsKICAgICAgICAgIHJldHVybiAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjhweDtoZWlnaHQ6OHB4O2JvcmRlci1yYWRpdXM6MnB4OycKICAgICAgICAgICAgICAgKyAnYmFja2dyb3VuZDp2YXIoLS0nK3MuY2xzKycpO21hcmdpbi1yaWdodDo2cHgiPjwvc3Bhbj4nK3MubmFtZSsnICcKICAgICAgICAgICAgICAgKyAocy5kYXRhW2lkeF09PW51bGw/Jy0nOmZtdChzLmRhdGFbaWR4XSkpOwogICAgICAgIH0pLmpvaW4oJzxicj4nKTsKICAgICAgICBzaG93VGlwKGJveCxldi5jbGllbnRYLWJyLmxlZnQsZXYuY2xpZW50WS1ici50b3AsJzxiPicrY2F0c1tpZHhdKyc8L2I+PGJyPicrcm93cyk7CiAgICAgIH0pOwogICAgICBoaXQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsZnVuY3Rpb24oKXtoaWRlVGlwKGJveCk7fSk7CiAgICAgIHN2Zy5hcHBlbmRDaGlsZChoaXQpOwogICAgfSkoaSk7CiAgfQogIGJveC5hcHBlbmRDaGlsZChzdmcpOwogIGJveC5hcHBlbmRDaGlsZChsZWdlbmQoc2VyaWVzKSk7Cn0KCmZ1bmN0aW9uIGxlZ2VuZChpdGVtcyl7CiAgdmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGQuY2xhc3NOYW1lPSd0cGgtbGVnZW5kJzsKICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKHMpewogICAgdmFyIHNwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgIHNwLmlubmVySFRNTD0nPGkgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tJytzLmNscysnKSI+PC9pPicrcy5uYW1lOwogICAgZC5hcHBlbmRDaGlsZChzcCk7CiAgfSk7CiAgcmV0dXJuIGQ7Cn0KCnZhciBSPXsiX+yjvOydmCI6ICLrqqjrk6Ag7JqU7Jyo7J2AIOy2nOyymOyZgCDtmZXsnbjsnbzsnpDrpbwg66qF7Iuc7ZWc64ukLiDrp6TrhYQgMTLsm5Qg6rOg7IucIO2ZleyduCDtm4Qg6rCx7Iug7ZWgIOqygy4iLCAieWVhciI6IDIwMjYsICJ2ZXJpZmllZF9vbiI6ICIyMDI2LTA5LTE2IiwgIuq1reuvvOyXsOq4iCI6IHsidG90YWwiOiAwLjA5NSwgImVtcGxveWVlIjogMC4wNDc1LCAiZW1wbG95ZXIiOiAwLjA0NzUsICLquLDspIDshozrk53sm5TslaFf7ZWY7ZWcIjogNDAwMDAwLCAi6riw7KSA7IaM65Od7JuU7JWhX+yDge2VnCI6IDYzNzAwMDAsICJub3RlIjogIjE5OTjrhYQg7J207ZuEIOyyqyDsnbjsg4EoOSXihpI5LjUlKS4gMjAzM+uFhOq5jOyngCAxMyXroZwg64uo6rOEIOyduOyDgS4iLCAic291cmNlIjogIuuztOqxtOuzteyngOu2gC/soJXssYXruIzrpqztlZEg7Jew6riI6rCc7ZiBIiwgIuyDge2VnOyVoV/tmZXsnbjtlYTsmpQiOiB0cnVlfSwgIuqxtOqwleuztO2XmCI6IHsidG90YWwiOiAwLjA3MTksICJlbXBsb3llZSI6IDAuMDM1OTUsICJlbXBsb3llciI6IDAuMDM1OTUsICJwcmV2X3llYXIiOiAwLjA3MDksICJub3RlIjogIjIwMjXrhYQgNy4wOSUg4oaSIDIwMjbrhYQgNy4xOSUgKDAuMSVwLCDspp3qsIDsnKggMS40OCUpIiwgInNvdXJjZSI6ICLrs7TqsbTrs7Xsp4DrtoAg67O064+E7J6Q66OMIDIwMjbrhYQg6rG06rCV67O07ZeY66OM7JyoIDcuMTkl66GcIOqysOyglSJ9LCAi7J6l6riw7JqU7JaR67O07ZeYIjogeyLshozrk53rjIDruYQiOiAwLjAwOTQ0OCwgIuqxtOqwleuztO2XmOujjF/rjIDruYQiOiAwLjEzMTQsICJlbXBsb3llZV9zaGFyZSI6IDAuNSwgImVtcGxveWVyX3NoYXJlIjogMC41LCAicHJldl95ZWFyX+yGjOuTneuMgOu5hCI6IDAuMDA5MTc0LCAibm90ZSI6ICLqsbTqsJXrs7Ttl5jro4wgeCAxMy4xNCUuIOyGjOuTnSDrjIDruYTroZzripQgMC45NDQ4JS4iLCAic291cmNlIjogIuuztOqxtOuzteyngOu2gCDrs7Trj4TsnpDro4wgMjAyNuuFhOuPhCDsnqXquLDsmpTslpHrs7Ttl5jro4zsnKggMC45NDQ4JSJ9LCAi6rOg7Jqp67O07ZeYIjogeyLsi6Tsl4XquInsl6xfdG90YWwiOiAwLjAxOCwgImVtcGxveWVlIjogMC4wMDksICJlbXBsb3llciI6IDAuMDA5LCAi6rOg7Jqp7JWI7KCVX+yngeyXheuKpeugpeqwnOuwnCI6IHsiMTUw7J2466+466eMIjogMC4wMDI1LCAiMTUw7J247J207IOBX+yasOyEoOyngOybkOuMgOyDgSI6IDAuMDA0NSwgIjE1MOyduOydtOyDgV8xMDAw7J2466+466eMIjogMC4wMDY1LCAiMTAwMOyduOydtOyDgSI6IDAuMDA4NSwgIuu2gOuLtOyjvOyytCI6ICLsgqzsl4Xso7wg7KCE7JWhIn0sICJub3RlIjogIuyLpOyXheq4ieyXrOu2hOunjCDrhbjsgqwg6rCBIDEvMiDrtoDri7QuIOqzoOyaqeyViOyglcK37KeB7JeF64ql66Cl6rCc67Cc67aE7J2AIOyCrOyXheyjvCDsoITslaEuIiwgInNvdXJjZSI6ICLqs6Dsmqnrs7Ttl5gg67CPIOyCsOyerOuztO2XmOujjOynleyImOuylSAvIOqzoOyaqeuFuOuPmeu2gCIsICIyMDI2X+uzgOqyveqzoOyLnCI6ICLrr7jtmZXsnbgg4oCUIOuzgOqyvSDsl4bsnLzrqbQg7Jyg7KeAIn0sICLsgrDsnqzrs7Ttl5giOiB7Iuu2gOuLtOyjvOyytCI6ICLsgqzsl4Xso7wg7KCE7JWhIiwgIm5vdGUiOiAi7JeF7KKF67OEIOyDgeydtC4g6re866Gc7J6QIOyLpOyImOugueyVoeyXkOuKlCDsmIHtlqUg7JeG7J2MLiJ9LCAi7LWc7KCA7J6E6riIIjogeyLsi5zquIkiOiAxMDMyMCwgIuyblO2ZmOyCsCI6IDIxNTY4ODAsICLquLDspIDsi5zqsIQiOiAyMDksICLsoITrhYTsi5zquIkiOiAxMDAzMCwgIm5vdGUiOiAiMjAyNi0wMS0wMSDsoIHsmqkuIOyXheyihSDqtazrtoQg7JeG7J2MLiDsnbjsg4HrpaAgMi45JS4iLCAic291cmNlIjogIuqzoOyaqeuFuOuPmeu2gCAyMDI264WEIOyggeyaqSDstZzsoIDsnoTquIgg6rOg7IucICjsi5zqsITquIkgMTAsMzIw7JuQKSJ9LCAi7Iuk7JeF6riJ7JesIjogeyLsg4HtlZzslaFfMeydvCI6IDY2MDAwLCAi7ZWY7ZWc7JWhX+y1nOyggOyehOq4iOu5hOycqCI6IDAuOCwgIu2VmO2VnOyVoV/quLDspIDsi5zqsIQiOiA4LCAi6rOE7IKw65CcX+2VmO2VnOyVoSI6IDY2MDQ4LCAi7Y+J6reg7J6E6riIX+yngOq4ieuloCI6IDAuNiwgIuyjvOydmCI6ICIyMDI264WE7J2AIO2VmO2VnOyVoSgxMCwzMjAgeCA4MCUgeCA4aCA9IDY2LDA0OOybkCnsnbQg7IOB7ZWc7JWhKDY2LDAwMOybkCnsnYQg7LSI6rO8LiDsg4HtlZzsnbQg7Lqh7J2066+A66GcIOyLpOyniCDqtazsp4HquInsl6zsnbzslaHsnYAgNjYsMDAw7JuQ7Jy866GcIOyImOugtC4iLCAi7IaM7KCV6riJ7Jes7J287IiYIjogeyI1MOyEuOuvuOunjCI6IHsiMeuFhOuvuOunjCI6IDEyMCwgIjF+M+uFhCI6IDE1MCwgIjN+NeuFhCI6IDE4MCwgIjV+MTDrhYQiOiAyMTAsICIxMOuFhOydtOyDgSI6IDI0MH0sICI1MOyEuOydtOyDgV/snqXslaDsnbgiOiB7IjHrhYTrr7jrp4wiOiAxMjAsICIxfjPrhYQiOiAxODAsICIzfjXrhYQiOiAyMTAsICI1fjEw64WEIjogMjQwLCAiMTDrhYTsnbTsg4EiOiAyNzB9fSwgInNvdXJjZSI6ICLqs6Dsmqnrhbjrj5nrtoAgLyDqs6Dsmqnrs7Ttl5jrspUiLCAi7IOB7ZWc7JWhXzIwMjbrs4Dqsr3qs6Dsi5wiOiAi66+47ZmV7J24IOKAlCAyMDE5LjEg7J207ZuEIDY2LDAwMOybkCDsnKDsp4Ag6riw7KSAIn0sICLqt7zroZzquLDspIAiOiB7IuyblOyGjOygleq3vOuhnOyLnOqwhCI6IDIwOSwgIuyjvOyGjOygleq3vOuhnOyLnOqwhCI6IDQwLCAiMeydvOyGjOygleq3vOuhnOyLnOqwhCI6IDgsICLsl7DssKhfMeuFhOuvuOunjF/stZzrjIAiOiAxMSwgIuyXsOywqF/quLDrs7giOiAxNSwgIuyXsOywqF/stZzrjIAiOiAyNSwgIu2PiV/soJzqs7Hrr7jthLAiOiAzLjMwNTc4NSwgInNvdXJjZSI6ICLqt7zroZzquLDspIDrspUg7KCcNjDsobAg65OxIn0sICLrs7TsnKDshLgiOiB7Il/stpzsspgiOiAi7KeA67Cp7IS467KVIOygnDExMeyhsCjsnqzsgrDshLgg7IS47JyoKSwg7KCcMTEy7KGwKOuPhOyLnOyngOyXreu2hCksIOyngOuwqeyEuOuyleyLnO2WieuguSDsoJwxMDnsobAo6rO17KCV7Iuc7J6l6rCA7JWh67mE7JyoKSwg7KKF7ZWp67aA64+Z7IKw7IS467KVIOygnDjCtznsobAuIDIwMjbrhYQg6riw7KSALiDshLjsnKjCt+u5hOycqOydgCDrp6TrhYQg67CU64CUIOyImCDsnojsnLzri4gg7ZmV7J247J28IOydtO2bhOyXkOuKlCDsnqztmZXsnbjtlaAg6rKDLiIsICJf7ZmV7J247J28IjogIjIwMjYtMDktMTYiLCAi7J6s7IKw7IS4IjogeyLqs7XsoJXsi5zsnqXqsIDslaHruYTsnKgiOiAwLjYsICLqs7XsoJXsi5zsnqXqsIDslaHruYTsnKhfMeyEuOuMgDHso7ztg50iOiAwLjQzLCAi7ZGc7KSA7IS47JyoIjogW1s2MDAwMDAwMCwgMC4wMDEsIDBdLCBbMTUwMDAwMDAwLCAwLjAwMTUsIDMwMDAwXSwgWzMwMDAwMDAwMCwgMC4wMDI1LCAxODAwMDBdLCBbbnVsbCwgMC4wMDQsIDYzMDAwMF1dLCAi7Yq566GA7IS47JyoXzHshLjrjIAx7KO87YOdXznslrXsnbTtlZgiOiBbWzYwMDAwMDAwLCAwLjAwMDUsIDBdLCBbMTUwMDAwMDAwLCAwLjAwMSwgMzAwMDBdLCBbMzAwMDAwMDAwLCAwLjAwMiwgMTgwMDAwXSwgW251bGwsIDAuMDAzNSwgNjMwMDAwXV0sICLrj4Tsi5zsp4Dsl63rtoTshLjsnKgiOiAwLjAwMTQsICLsp4DrsKnqtZDsnKHshLjsnKgiOiAwLjJ9LCAi7KKF7ZWp67aA64+Z7IKw7IS4IjogeyLqs7XsoJxfMeyEuOuMgDHso7ztg50iOiAxMjAwMDAwMDAwLCAi6rO17KCcX+q3uOyZuCI6IDkwMDAwMDAwMCwgIuqzteygleyLnOyepeqwgOyVoeu5hOycqCI6IDAuNiwgIuyEuOycqF8y7KO87YOd7J207ZWYIjogW1szMDAwMDAwMDAsIDAuMDA1LCAwXSwgWzYwMDAwMDAwMCwgMC4wMDcsIDYwMDAwMF0sIFsxMjAwMDAwMDAwLCAwLjAxLCAyNDAwMDAwXSwgWzI1MDAwMDAwMDAsIDAuMDEzLCA2MDAwMDAwXSwgWzUwMDAwMDAwMDAsIDAuMDE1LCAxMTAwMDAwMF0sIFs5NDAwMDAwMDAwLCAwLjAyLCAzNjAwMDAwMF0sIFtudWxsLCAwLjAyNywgMTAxODAwMDAwXV0sICLrho3slrTstIztirnrs4TshLjsnKgiOiAwLjJ9LCAi7ZiE7Iuk7ZmU7JyoX+y2lOyglSI6IDAuNjksICJf7IS47Jyo7ZGc7ISk66qFIjogIlvqtazqsITsg4HtlZwsIOyEuOycqCwg64iE7KeE6rO17KCcXS4g7IS47JWhID0g6rO87IS47ZGc7KSAIMOXIOyEuOycqCDiiJIg64iE7KeE6rO17KCcLiDriITsoIHshLjslaHsnbQg7JWE64uI64ukLiJ9LCAi64yA7Lac6rec7KCcIjogeyJf7Lac7LKYIjogIuq4iOycteychOybkO2ajCAnM+uLqOqzhCDsiqTtirjroIjsiqQgRFNSIOyLnO2WieuwqeyViCcoMjAyNS0wNy0wMSDsi5ztlokpIOuwjyDssKjso7zri6jsnIQgRFNSIOq3nOygnC4gTFRWIOuKlCDsp4Dsl63Ct+yjvO2DneyImMK37IOd7JWg7LWc7LSIIOyXrOu2gOyXkCDrlLDrnbwg7YGs6rKMIOuLrOudvOyngOuvgOuhnCDrjIDtkZzqsJLrp4wg7Iuj64qU64ukLiDqt5zsoJzripQg7J6Q7KO8IOuwlOuAjOuvgOuhnCDtmZXsnbjsnbwg7J207ZuE7JeQ64qUIOuwmOuTnOyLnCDsnqztmZXsnbjtlaAg6rKDLiIsICJf7ZmV7J247J28IjogIjIwMjYtMDktMjEiLCAiRFNS7ZWc64+EIjogeyLsnYDtlokiOiAwLjQsICLsoJwy6riI7Jy16raMIjogMC41fSwgIuyKpO2KuOugiOyKpOq4iOumrCI6IDEuNSwgIl/siqTtirjroIjsiqTquIjrpqxf7KO8IjogIjPri6jqs4Qg6riw67O4IDEuNTAlLiDsp4DrsKkg7KO864u064yAIDAuNzUlIO2VnOyLnOyggeyaqeydgCAyMDI1LTEyLTMxIOyiheujjC4iLCAi7Iqk7Yq466CI7Iqk7KCB7Jqp67mE7JyoIjogW1s1LCAwLjhdLCBbOSwgMC42XSwgWzE1LCAwLjRdLCBbbnVsbCwgMC4yXV0sICJMVFYiOiB7Iuu5hOq3nOygnOyngOyXrSI6IDAuNywgIuq3nOygnOyngOyXrSI6IDAuNCwgIuyDneyVoOy1nOy0iCI6IDAuOH0sICJfTFRWX+yjvCI6ICLrjIDtkZzqsJLsnbTri6QuIO2IrOq4sOqzvOyXtOyngOq1rMK37KGw7KCV64yA7IOB7KeA7JetIOyngOyglSDtmITtmaksIOyjvO2DnSDsiJgsIOustOyjvO2DnSDsl6zrtoAsIOyDneyVoOy1nOy0iCDsl6zrtoDsl5Ag65Sw6528IOuLrOudvOynhOuLpC4g7Iuk7KCcIO2VnOuPhOuKlCDquIjsnLXtmozsgqzsl5DshJwg7ZmV7J247ZW07JW8IO2VnOuLpC4iLCAi7Iug7Jqp64yA7LacX0RTUuyCsOygleunjOq4sCI6IDUsICJf7Iug7Jqp64yA7LacX+yjvCI6ICJEU1Ig6rOE7IKwIOyLnCDsi6DsmqnrjIDstpzsnYAg7Iuk7KCcIOunjOq4sOqwgCDslYTri4jrnbwg6rec7KCc7IOBIOunjOq4sCg164WEKeuhnCDsm5DrpqzquIjsnYQg7ZmY7IKw7ZWc64ukLiJ9LCAi7Leo65Od7IS4IjogeyJf7Lac7LKYIjogIuyngOuwqeyEuOuylSDsoJwxMeyhsCjrtoDrj5nsgrAg7Leo65Od7IS47JyoKcK37KCcMTPsobDsnZgyKOykkeqzvCnCt+ygnDE1MeyhsCjsp4DrsKnqtZDsnKHshLgpLCDrho3slrTstIztirnrs4TshLjrspUuIOyjvO2DnSDsnKDsg4HqsbDrnpgg6riw7KSALiAyMDI264WELiDshLjsnKjCt+qwkOuptOydgCDsnpDso7wg67CU64CM66+A66GcIO2ZleyduOydvCDsnbTtm4Qg7J6s7ZmV7J247ZWgIOqygy4iLCAiX+2ZleyduOydvCI6ICIyMDI2LTA5LTIxIiwgIuq4sOuzuCI6IHsi7ZWY7ZWc6rCA7JWhIjogNjAwMDAwMDAwLCAi7IOB7ZWc6rCA7JWhIjogOTAwMDAwMDAwLCAi6riw7KSA7JWhIjogMzAwMDAwMDAwLCAi7ZWY7ZWc7IS47JyoIjogMS4wLCAi7IOB7ZWc7IS47JyoIjogMy4wLCAiX+yCsOyLnSI6ICLshLjsnKgoJSkgPSDst6jrk53qsIDslaEgw5cgMiDDtyDquLDspIDslaEoM+yWtSkg4oiSIDMifSwgIuykkeqzvCI6IHsiOO2NvOyEvO2KuCI6IDguMCwgIjEy7Y287IS87Yq4IjogMTIuMH0sICLsp4DrsKnqtZDsnKHshLhf6riw67O467Cw7JyoIjogMC4xLCAi7KeA67Cp6rWQ7Jyh7IS4X+ykkeqzvCI6IDAuNCwgIuuGje2KueyEuCI6IHsi6riw67O4IjogMC4yLCAi7KSR6rO8OCI6IDAuNiwgIuykkeqzvDEyIjogMS4wLCAi66m07KCc66m07KCBIjogODV9LCAi7IOd7JWg7LWc7LSI6rCQ66m0IjogeyLtlZzrj4TqsIDslaEiOiAxMjAwMDAwMDAwLCAi7LWc64yA6rCQ66m07JWhIjogMjAwMDAwMH0sICJf7KO87J2YIjogIuyhsOygleuMgOyDgeyngOyXrSDsp4DsoJUg7ZiE7Zmp7J2AIOyImOyLnOuhnCDrsJTrgJDri6QuIOydtCDqs4TsgrDquLDripQgJ+yhsOygleuMgOyDgeyngOyXreyduOyngCfrpbwg7J207Jqp7J6Q6rCAIOyngeygkSDqs6DrpbTqsowg7ZWc64ukLiDsp4Dsl60g66qp66Gd7J2EIOuCtOyepe2VmOuptCDrsJjrk5zsi5wg7YuA66aw64ukLiJ9fTsKdmFyIEFRPXsiX+y2nOyymCI6ICLsp4DrsKnshLjrspUg7KCcMTHsobAo67aA64+Z7IKwIOy3qOuTneyEuOycqCnCt+ygnDEz7KGw7J2YMijspJHqs7wpwrfsoJwxNTHsobAo7KeA67Cp6rWQ7Jyh7IS4KSwg64aN7Ja07LSM7Yq567OE7IS467KVLiDso7ztg50g7Jyg7IOB6rGw656YIOq4sOykgC4gMjAyNuuFhC4g7IS47JyowrfqsJDrqbTsnYAg7J6Q7KO8IOuwlOuAjOuvgOuhnCDtmZXsnbjsnbwg7J207ZuEIOyerO2ZleyduO2VoCDqsoMuIiwgIl/tmZXsnbjsnbwiOiAiMjAyNi0wOS0yMSIsICLquLDrs7giOiB7Iu2VmO2VnOqwgOyVoSI6IDYwMDAwMDAwMCwgIuyDge2VnOqwgOyVoSI6IDkwMDAwMDAwMCwgIuq4sOykgOyVoSI6IDMwMDAwMDAwMCwgIu2VmO2VnOyEuOycqCI6IDEuMCwgIuyDge2VnOyEuOycqCI6IDMuMCwgIl/sgrDsi50iOiAi7IS47JyoKCUpID0g7Leo65Od6rCA7JWhIMOXIDIgw7cg6riw7KSA7JWhKDPslrUpIOKIkiAzIn0sICLspJHqs7wiOiB7IjjtjbzshLztirgiOiA4LjAsICIxMu2NvOyEvO2KuCI6IDEyLjB9LCAi7KeA67Cp6rWQ7Jyh7IS4X+q4sOuzuOuwsOycqCI6IDAuMSwgIuyngOuwqeq1kOycoeyEuF/spJHqs7wiOiAwLjQsICLrho3tirnshLgiOiB7Iuq4sOuzuCI6IDAuMiwgIuykkeqzvDgiOiAwLjYsICLspJHqs7wxMiI6IDEuMCwgIuuptOygnOuptOyggSI6IDg1fSwgIuyDneyVoOy1nOy0iOqwkOuptCI6IHsi7ZWc64+E6rCA7JWhIjogMTIwMDAwMDAwMCwgIuy1nOuMgOqwkOuptOyVoSI6IDIwMDAwMDB9LCAiX+yjvOydmCI6ICLsobDsoJXrjIDsg4Hsp4Dsl60g7KeA7KCVIO2YhO2ZqeydgCDsiJjsi5zroZwg67CU64CQ64ukLiDsnbQg6rOE7IKw6riw64qUICfsobDsoJXrjIDsg4Hsp4Dsl63snbjsp4An66W8IOydtOyaqeyekOqwgCDsp4HsoJEg6rOg66W06rKMIO2VnOuLpC4g7KeA7JetIOuqqeuhneydhCDrgrTsnqXtlZjrqbQg67CY65Oc7IucIO2LgOumsOuLpC4ifTsKCmZ1bmN0aW9uIGNhbGMoKXsKCiB2YXIgcHJpY2U9digncHJpY2UnKSwgaG9tZXM9TWF0aC5yb3VuZCh2KCdob21lcycpKSwgYWRqPXMoJ2FkaicpPT09J3knOwogdmFyIGFyZWE9dignYXJlYScpLCBmaXJzdD1zKCdmaXJzdCcpPT09J3knOwogaWYocHJpY2U8PTApeyBbJ21haW4nLCdyYXRlU2hvdycsJ2FjcScsJ2VkdScsJ2Zhcm0nLCdjdXRTaG93JywnZWZmU2hvdyddCiAgIC5mb3JFYWNoKGZ1bmN0aW9uKGlkKXsgc2V0KGlkLCfigJQnKTsgfSk7ICQoJ3dhcm4nKS50ZXh0Q29udGVudD0nJzsgcmV0dXJuOyB9CgogLyog7KSR6rO8IO2MkOyglSDigJQg7Leo65OdIO2bhCDso7ztg50g7IiYIOq4sOykgC4g7KGw7KCV64yA7IOB7KeA7Jet7J2066m0IO2VnCDri6jqs4Qg67mo66asIOqxuOumsOuLpC4gKi8KIHZhciBhZnRlciA9IGhvbWVzICsgMSwgcmF0ZTsKIGlmKGFkaikgICAgICByYXRlID0gYWZ0ZXI+PTMgPyAxMiA6IGFmdGVyPT09MiA/IDggOiBudWxsOwogZWxzZSAgICAgICAgIHJhdGUgPSBhZnRlcj49NCA/IDEyIDogYWZ0ZXI9PT0zID8gOCA6IG51bGw7CgogaWYocmF0ZT09PW51bGwpewogICB2YXIgYj1BUVsn6riw67O4J107CiAgIGlmKHByaWNlIDw9IGJbJ+2VmO2VnOqwgOyVoSddKSAgICAgIHJhdGUgPSBiWyftlZjtlZzshLjsnKgnXTsKICAgZWxzZSBpZihwcmljZSA+PSBiWyfsg4HtlZzqsIDslaEnXSkgcmF0ZSA9IGJbJ+yDge2VnOyEuOycqCddOwogICAvKiDimIUg67aE66qo64qUIOyDge2VnOqwgOyVoeydtCDslYTri4jrnbwgM+yWtSDqs6DsoJXsnbTri6Qo7KeA67Cp7IS467KVIOygnDEx7KGw7KCcMe2VreygnDjtmLgpICovCiAgIGVsc2UgcmF0ZSA9IE1hdGgucm91bmQoKHByaWNlKjIvYlsn6riw7KSA7JWhJ10gLSAzKSoxMDAwMCkvMTAwMDA7CiB9CgogdmFyIGFjcSA9IHByaWNlKnJhdGUvMTAwOwogLyog7KSR6rO8IOq1rOqwhOydmCDsp4DrsKnqtZDsnKHshLjripQg7ZGc7KSA7IS47JyoIOq4sOykgOydtOudvCAwLjQlIOqzoOyglSAqLwogdmFyIGVkdSA9IHByaWNlKihyYXRlPj04ID8gQVFbJ+yngOuwqeq1kOycoeyEuF/spJHqs7wnXSA6IHJhdGUqQVFbJ+yngOuwqeq1kOycoeyEuF/quLDrs7jrsLDsnKgnXSkvMTAwOwogdmFyIGZhcm0gPSAwOwogdmFyIEY9QVFbJ+uGje2KueyEuCddOwogaWYoYXJlYSA+IEZbJ+uptOygnOuptOyggSddKXsKICAgdmFyIGZyID0gcmF0ZT49MTIgPyBGWyfspJHqs7wxMiddIDogcmF0ZT49OCA/IEZbJ+ykkeqzvDgnXSA6IEZbJ+q4sOuzuCddOwogICBmYXJtID0gcHJpY2UqZnIvMTAwOwogfQogLyog7IOd7JWg7LWc7LSIIOqwkOuptCDigJQg66y07KO87YOd7J6Q6rCAIO2VnOuPhOqwgOyVoSDsnbTtlZgg7KO87YOd7J2EIOyCtCDrlYzrp4wgKi8KIHZhciBHPUFRWyfsg53slaDstZzstIjqsJDrqbQnXSwgY3V0PTA7CiBpZihmaXJzdCAmJiBob21lcz09PTAgJiYgcHJpY2UgPD0gR1sn7ZWc64+E6rCA7JWhJ10pIGN1dCA9IE1hdGgubWluKGFjcSwgR1sn7LWc64yA6rCQ66m07JWhJ10pOwoKIHZhciB0b3RhbCA9IGFjcSAtIGN1dCArIGVkdSArIGZhcm07CiBzZXQoJ21haW4nLCBmKHRvdGFsKSk7CiBzZXQoJ3JhdGVTaG93JywgcmF0ZS50b0ZpeGVkKDIpICsgJyUnICsgKHJhdGU+PTggPyAnICjspJHqs7wpJyA6ICcnKSk7CiBzZXQoJ2FjcScsIGYoYWNxKSArIChjdXQ+MCA/ICcg4oaSICcgKyBmKGFjcS1jdXQpIDogJycpKTsKIHNldCgnZWR1JywgZihlZHUpKTsKIHNldCgnZmFybScsIGFyZWEgPiBGWyfrqbTsoJzrqbTsoIEnXSA/IGYoZmFybSkgOiAn7ZW064u5IOyXhuydjCAoODXjjqEg7J207ZWYKScpOwogc2V0KCdjdXRTaG93JywgY3V0PjAgPyAn4oiSJyArIGYoY3V0KSA6ICftlbTri7kg7JeG7J2MJyk7CiBzZXQoJ2VmZlNob3cnLCAodG90YWwvcHJpY2UqMTAwKS50b0ZpeGVkKDIpICsgJyUnKTsKCiB2YXIgdz0kKCd3YXJuJyksIG1zZz0nJzsKIGlmKHJhdGU+PTgpIG1zZz0n4pqgIOuLpOyjvO2DnSDspJHqs7zshLjsnKjsnoXri4jri6QuIOyjvO2DnSDsiJjsl5DripQg67aE7JaR6raMwrfsnoXso7zqtozCt+yhsO2VqeybkOyeheyjvOq2jOuPhCDtj6ztlajrkKnri4jri6QuJzsKIGVsc2UgaWYoZmlyc3QgJiYgaG9tZXM9PT0wICYmIHByaWNlID4gR1sn7ZWc64+E6rCA7JWhJ10pIG1zZz0n4pqgIOyDneyVoOy1nOy0iCDqsJDrqbTsnYAgMTLslrUg7J207ZWY66eMIOuQqeuLiOuLpC4nOwogdy50ZXh0Q29udGVudCA9IG1zZzsKCn0KdmFyIElEUz1bInByaWNlIiwgImhvbWVzIiwgImFkaiIsICJhcmVhIiwgImZpcnN0Il07CnZhciByb290PWRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5jbG9zZXN0KCcudHBoLXBhZ2UnKTpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudHBoLXBhZ2UnKTsKaW5pdFRoZW1lKHJvb3R8fGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50cGgtcGFnZScpKTsKaW5pdFN0aWNreShyb290fHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudHBoLXBhZ2UnKSwgIuy0nSDrgqnrtoDshLjslaEiKTsKdmFyIHNhdmU9aW5pdFN0YXRlKCJcdWNkZThcdWI0ZGRcdWMxMzgtXHVhY2M0XHVjMGIwXHVhZTMwIiwgSURTLCBjYWxjKTsKSURTLmZvckVhY2goZnVuY3Rpb24oaSl7dmFyIGU9JChpKTtpZighZSlyZXR1cm47ZS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsZnVuY3Rpb24oKXtjYWxjKCk7c2F2ZSgpO30pO2UuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxmdW5jdGlvbigpe2NhbGMoKTtzYXZlKCk7fSk7fSk7CmluaXRDaGlwcyhmdW5jdGlvbigpe2NhbGMoKTtzYXZlKCk7fSk7CmluaXRSZWFkKHsicHJpY2UiOiAicHJpY2UtcmVhZCJ9KTsKY2FsYygpOw==