Анализ страницы https://www.mann-ivanov-ferber.ru/subscribe-mif/
Основное Готовность: 100%
Домен
mann-ivanov-ferber.ru
Состояние доменного имени
?
Проверяем корректность доменного имени и наличие технических проблем на уровне домена.
Длина домена велика. Но если вы продвигаете запрос, входящий в название домена, то это хорошо.
Домен второго уровня идеален для продвижения.
Регистратор домена - REGRU-RU
Дата регистрации домена 27.10.2004 (более 20 лет назад)
Ответ сервера
200 Успешный ответ
HTTP-код ответа и цепочка редиректов
?
Код 200 — страница доступна. Коды 3xx — редиректы (цепочки замедляют загрузку и размывают ссылочный вес). Коды 4xx/5xx — ошибки, поисковик не сможет проиндексировать страницу.
Сервер настроен корректно.
Безопасность
Сайт безопасен
Использование HTTPS и SSL-сертификат
?
HTTPS — обязательный стандарт. Google и Яндекс отдают предпочтение защищённым сайтам. Отсутствие SSL или просроченный сертификат ведут к предупреждениям в браузере и снижению позиций.
Не настроен HSTS (Strict-Transport-Security) — рекомендуется включить.
На сайте работает защищенный протокол ssl и сайт открывается по https.
Ssl-сертификат действителен до 09.11.2026 13:26:03.
Поздравляем! Сайт не содержится в реестре РКН.
Кодировка
UTF-8
Кодировка символов страницы
?
Стандарт — UTF-8. Неправильная кодировка вызывает нечитаемые символы и мешает поисковику корректно распознать текст страницы.
Указана кодировка на странице UTF-8.
Язык
ru
Атрибут lang в HTML-теге
?
Атрибут lang (<html lang="ru">) сообщает поисковикам и браузерам, на каком языке написана страница. Помогает при ранжировании в региональном поиске.
Указан язык документа ru.
Скорость загрузки
~0,16сек
Время отклика сервера (TTFB)
?
Time To First Byte — время до получения первого байта от сервера. Норма до 200 мс. Медленный отклик ухудшает пользовательский опыт и ранжирование: Яндекс и Google учитывают скорость страниц.
Скорость загрузки сайта 0,16сек оптимальна.
Объем документа
773Кб
Размер HTML-кода страницы
?
Слишком большой HTML замедляет парсинг браузером и сканирование поисковым роботом. Рекомендуется не более 200 Кб.
Объем html-документа 773Кб оптимален.
Структура html-документа корректна.
Ресурсы
Ресурсы: 10
Внешние ресурсы страницы (CSS, JS, изображения)
?
Количество и тип подключённых ресурсов влияют на скорость загрузки. Большое число запросов увеличивает время рендеринга страницы.
Кол-во файлов ресурсов 10 достаточно.
Показать полный список ресурсов
| Тип | Название | Значение |
|---|---|---|
| stylesheet | https://fonts.googleapis.com/css?family=PT+Sans:400,400i,700,700i%7CPT+Serif:400,400i,700,700i&subset=cyrillic | |
| stylesheet | /assets/new/build/page-list.css?31381d5b6ea6 | |
| stylesheet | text/css | https://fonts.googleapis.com/css2?family=Cormorant:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700 |
| js | https://yookassa.ru/checkout-widget/v1/checkout-widget.js | |
| js | /_next/static/widgets/header.js | |
| js | /assets/new/src/js/cookie-consent.js | |
| js | data:text/html;base64,IWZ1bmN0aW9uKCl7dmFyIGU9MCx0PTA7ZnVuY3Rpb24gbigpeysrZT45fHwoInVuZGVmaW5lZCIhPXR5cGVvZiBUaWxkYUZvbnRzP2EoKTpzZXRUaW1lb3V0KG4sMjApKX1mdW5jdGlvbiBpKCl7Y2xlYXJUaW1lb3V0KHQpLG8oKSx3aW5kb3cudGlsZGFmb250c19sb2FkZWQ9ITB9ZnVuY3Rpb24gbygpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYWZvbnRzLWxvYWRpbmciKTt2b2lkIDAhPT1lJiZudWxsIT1lJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSl9ZnVuY3Rpb24gYSgpe3dpbmRvdy50aWxkYWZvbnRzX2xvYWRlZD0hMTt2YXIgZT1kb2N1bWVudC5oZWFkfHxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLG49d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNwbGl0KCIuIik7aWYoInRpbGRhIiE9PW5bbi5sZW5ndGgtMl0pe3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7aS5pbm5lckhUTUw9ImJvZHkgKntjb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnQ7fSIsaS5zZXRBdHRyaWJ1dGUoImlkIiwidGlsZGFmb250cy1sb2FkaW5nIiksZS5pbnNlcnRCZWZvcmUoaSxlLmZpcnN0Q2hpbGQpLHQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtvKCl9KSwieSI9PT13aW5kb3cudGlsZGFmb250c3N3YXA/NTA6M2UzKX12YXIgYT0obmF2aWdhdG9yLnVzZXJBZ2VudHx8bmF2aWdhdG9yLnZlbmRvcnx8d2luZG93Lm9wZXJhKS50b0xvd2VyQ2FzZSgpLHM9e29wZXJhOiJ2ZXJzaW9uIixmaXJlZm94OiJmaXJlZm94IixzYWZhcmk6InZlcnNpb24iLG1zaWU6Im1zaWUifSxkPVsibGludXgiLCJ3aW5kb3dzIiwiaXBob25lIiwibWFjIG9zIl0sZj0iZGVmYXVsdCIsbD0wLGM9LTEsdT0iZGVmYXVsdCIsdz0id29mZiIsbT0ieSI9PT13aW5kb3cudGlsZGFmb250c3N3YXA/IiZkaXNwbGF5PXN3YXAiOiIiLHA9L15Nb3ppbGxhXC81XC4wIFwoLitbXildK1wpIEFwcGxlV2ViS2l0XC9bXGQuXSsgXChLSFRNTCwgbGlrZSBHZWNrb1wpIENbaHJvbWV8cmlPU10rXC8oXGQrKVtcZC5dK1sgTW9iaWxlXSpbLzE1RTE0OF0qW1xzWWFCcm93c2VyL1tcZC5dK10/W1xzWW93c2VyL1tcZC5dK10/IFNhZmFyaVwvW1xkLl0rW1xzRWRnL1tcZC5dK10/W1xzT1BSL1tcZC5dK10/JC8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KSxoO2lmKHApe3ZhciBnO3BhcnNlSW50KHBbMV0sMTApPj0zNiYmKHc9IndvZmYyIil9ZWxzZXtmb3IodmFyIHYgaW4gcylpZihhLmluZGV4T2Yodik+LTEpe2M9YS5pbmRleE9mKHNbdl0pLGY9dixsPWEuc3Vic3RyaW5nKGMrc1t2XS5sZW5ndGgrMSxjK3Nbdl0ubGVuZ3RoKzMpO2JyZWFrfWZvcih2YXIgYj0wO2I8ZC5sZW5ndGg7YisrKWlmKGEuaW5kZXhPZihkW2JdKT4tMSl7dT1kW2JdO2JyZWFrfXN3aXRjaCgiZGVmYXVsdCI9PT1mJiZhLmluZGV4T2YoImluc3RhZ3JhbSIpPi0xJiZhLmluZGV4T2YoImlwaG9uZSIpPi0xJiYoYz1hLmluZGV4T2YoImlwaG9uZSBvcyIpLGY9InNhZmFyaSIsdT0iaXBob25lIixsPWEuc3Vic3RyaW5nKGMrMTAsYysxMikpLGYpe2Nhc2UiZmlyZWZveCI6bD49MzkmJih3PSJ3b2ZmMiIpO2JyZWFrO2Nhc2Uic2FmYXJpIjoiaXBob25lIj09PXU/bD49MTAmJih3PSJ3b2ZmMiIpOmw+PTEyJiYodz0id29mZjIiKTticmVhaztjYXNlIm9wZXJhIjpsPj0yMyYmKHc9IndvZmYyIil9fXIoImh0dHBzOi8vZm9udHMudGlsZGFjZG4uY29tL2dldC8iLCI/Zm9udHM9IitUaWxkYUZvbnRzKyImZm9ybWF0PSIrdyttLCEwLGUpfWZ1bmN0aW9uIHIoZSx0LG4sbyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7aSgpfSkpLG4pe2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLChmdW5jdGlvbigpe3IoImh0dHBzOi8vZm9udHMyLnRpbGRhY2RuLmNvbS9nZXQvIix0LCExLG8pfSkpO3ZhciBzPXdpbmRvdy5wZXJmb3JtYW5jZS50aW1pbmc7aWYoIXMpcmV0dXJuO3ZhciBkPXMucmVzcG9uc2VFbmQtcy5jb25uZWN0U3RhcnQsZj0yZTM7c3dpdGNoKCEwKXtjYXNlIGQ8PTMwMDpmPTJlMzticmVhaztjYXNlIGQ8PTFlMzpmPTdlMzticmVhaztjYXNlIGQ8PTJlMzpmPTJlNDticmVhaztjYXNlIGQ8PTNlMzpmPTNlNDticmVhaztjYXNlIGQ+M2UzOmY9NDVlM31zZXRUaW1lb3V0KChmdW5jdGlvbigpeyExPT09d2luZG93LnRpbGRhZm9udHNfbG9hZGVkJiZyKCJodHRwczovL2ZvbnRzMi50aWxkYWNkbi5jb20vZ2V0LyIsdCwhMSxvKX0pLGYpfWEuc2V0QXR0cmlidXRlKCJocmVmIixlK3QpLGEuc2V0QXR0cmlidXRlKCJyZWwiLCJzdHlsZXNoZWV0IiksYS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJ0ZXh0L2NzcyIpLGEuc2V0QXR0cmlidXRlKCJtZWRpYSIsImFsbCIpLG8uaW5zZXJ0QmVmb3JlKGEsby5maXJzdENoaWxkKX1uKCl9KCk7CgovKiEgalF1ZXJ5IHYxLjEwLjIgfCAoYykgMjAwNSwgMjAxMyBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiB8IGpxdWVyeS5vcmcvbGljZW5zZQoqLwooZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9dHlwZW9mIHQsbz1lLmxvY2F0aW9uLGE9ZS5kb2N1bWVudCxzPWEuZG9jdW1lbnRFbGVtZW50LGw9ZS5qUXVlcnksdT1lLiQsYz17fSxwPVtdLGY9IjEuMTAuMiIsZD1wLmNvbmNhdCxoPXAucHVzaCxnPXAuc2xpY2UsbT1wLmluZGV4T2YseT1jLnRvU3RyaW5nLHY9Yy5oYXNPd25Qcm9wZXJ0eSxiPWYudHJpbSx4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyB4LmZuLmluaXQoZSx0LHIpfSx3PS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFQ9L1xTKy9nLEM9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLE49L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxrPS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sRT0vXltcXSw6e31cc10qJC8sUz0vKD86Xnw6fCwpKD86XHMqXFspKy9nLEE9L1xcKD86WyJcXFwvYmZucnRdfHVbXGRhLWZBLUZdezR9KS9nLGo9LyJbXiJcXFxyXG5dKiJ8dHJ1ZXxmYWxzZXxudWxsfC0/KD86XGQrXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpL2csRD0vXi1tcy0vLEw9Ly0oW1xkYS16XSkvZ2ksSD1mdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9LHE9ZnVuY3Rpb24oZSl7KGEuYWRkRXZlbnRMaXN0ZW5lcnx8ImxvYWQiPT09ZS50eXBlfHwiY29tcGxldGUiPT09YS5yZWFkeVN0YXRlKSYmKF8oKSx4LnJlYWR5KCkpfSxfPWZ1bmN0aW9uKCl7YS5hZGRFdmVudExpc3RlbmVyPyhhLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHEsITEpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIscSwhMSkpOihhLmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLHEpLGUuZGV0YWNoRXZlbnQoIm9ubG9hZCIscSkpfTt4LmZuPXgucHJvdG90eXBlPXtqcXVlcnk6Zixjb25zdHJ1Y3Rvcjp4LGluaXQ6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG87aWYoIWUpcmV0dXJuIHRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZihpPSI8Ij09PWUuY2hhckF0KDApJiYiPiI9PT1lLmNoYXJBdChlLmxlbmd0aC0xKSYmZS5sZW5ndGg+PTM/W251bGwsZSxudWxsXTpOLmV4ZWMoZSksIWl8fCFpWzFdJiZuKXJldHVybiFufHxuLmpxdWVyeT8obnx8cikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKG4pLmZpbmQoZSk7aWYoaVsxXSl7aWYobj1uIGluc3RhbmNlb2YgeD9uWzBdOm4seC5tZXJnZSh0aGlzLHgucGFyc2VIVE1MKGlbMV0sbiYmbi5ub2RlVHlwZT9uLm93bmVyRG9jdW1lbnR8fG46YSwhMCkpLGsudGVzdChpWzFdKSYmeC5pc1BsYWluT2JqZWN0KG4pKWZvcihpIGluIG4peC5pc0Z1bmN0aW9uKHRoaXNbaV0pP3RoaXNbaV0obltpXSk6dGhpcy5hdHRyKGksbltpXSk7cmV0dXJuIHRoaXN9aWYobz1hLmdldEVsZW1lbnRCeUlkKGlbMl0pLG8mJm8ucGFyZW50Tm9kZSl7aWYoby5pZCE9PWlbMl0pcmV0dXJuIHIuZmluZChlKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09b31yZXR1cm4gdGhpcy5jb250ZXh0PWEsdGhpcy5zZWxlY3Rvcj1lLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWUsdGhpcy5sZW5ndGg9MSx0aGlzKTp4LmlzRnVuY3Rpb24oZSk/ci5yZWFkeShlKTooZS5zZWxlY3RvciE9PXQmJih0aGlzLnNlbGVjdG9yPWUuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWUuY29udGV4dCkseC5tYWtlQXJyYXkoZSx0aGlzKSl9LHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZy5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/dGhpcy50b0FycmF5KCk6MD5lP3RoaXNbdGhpcy5sZW5ndGgrZV06dGhpc1tlXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGUpe3ZhciB0PXgubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGUpO3JldHVybiB0LnByZXZPYmplY3Q9dGhpcyx0LmNvbnRleHQ9dGhpcy5jb250ZXh0LHR9LGVhY2g6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5lYWNoKHRoaXMsZSx0KX0scmVhZHk6ZnVuY3Rpb24oZSl7cmV0dXJuIHgucmVhZHkucHJvbWlzZSgpLmRvbmUoZSksdGhpc30sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZy5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKygwPmU/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobj49MCYmdD5uP1t0aGlzW25dXTpbXSl9LG1hcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeC5tYXAodGhpcyxmdW5jdGlvbih0LG4pe3JldHVybiBlLmNhbGwodCxuLHQpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOmgsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LHguZm4uaW5pdC5wcm90b3R5cGU9eC5mbix4LmV4dGVuZD14LmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBlLG4scixpLG8sYSxzPWFyZ3VtZW50c1swXXx8e30sbD0xLHU9YXJndW1lbnRzLmxlbmd0aCxjPSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBzJiYoYz1zLHM9YXJndW1lbnRzWzFdfHx7fSxsPTIpLCJvYmplY3QiPT10eXBlb2Ygc3x8eC5pc0Z1bmN0aW9uKHMpfHwocz17fSksdT09PWwmJihzPXRoaXMsLS1sKTt1Pmw7bCsrKWlmKG51bGwhPShvPWFyZ3VtZW50c1tsXSkpZm9yKGkgaW4gbyllPXNbaV0scj1vW2ldLHMhPT1yJiYoYyYmciYmKHguaXNQbGFpbk9iamVjdChyKXx8KG49eC5pc0FycmF5KHIpKSk/KG4/KG49ITEsYT1lJiZ4LmlzQXJyYXkoZSk/ZTpbXSk6YT1lJiZ4LmlzUGxhaW5PYmplY3QoZSk/ZTp7fSxzW2ldPXguZXh0ZW5kKGMsYSxyKSk6ciE9PXQmJihzW2ldPXIpKTtyZXR1cm4gc30seC5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKGYrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksbm9Db25mbGljdDpmdW5jdGlvbih0KXtyZXR1cm4gZS4kPT09eCYmKGUuJD11KSx0JiZlLmpRdWVyeT09PXgmJihlLmpRdWVyeT1sKSx4fSxpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihlKXtlP3gucmVhZHlXYWl0Kys6eC5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGUpe2lmKGU9PT0hMD8hLS14LnJlYWR5V2FpdDoheC5pc1JlYWR5KXtpZighYS5ib2R5KXJldHVybiBzZXRUaW1lb3V0KHgucmVhZHkpO3guaXNSZWFkeT0hMCxlIT09ITAmJi0teC5yZWFkeVdhaXQ+MHx8KG4ucmVzb2x2ZVdpdGgoYSxbeF0pLHguZm4udHJpZ2dlciYmeChhKS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKSl9fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PT14LnR5cGUoZSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuImFycmF5Ij09PXgudHlwZShlKX0saXNXaW5kb3c6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJmU9PWUud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oZSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoZSkpJiZpc0Zpbml0ZShlKX0sdHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9lKyIiOiJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGU/Y1t5LmNhbGwoZSldfHwib2JqZWN0Ijp0eXBlb2YgZX0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihlKXt2YXIgbjtpZighZXx8Im9iamVjdCIhPT14LnR5cGUoZSl8fGUubm9kZVR5cGV8fHguaXNXaW5kb3coZSkpcmV0dXJuITE7dHJ5e2lmKGUuY29uc3RydWN0b3ImJiF2LmNhbGwoZSwiY29uc3RydWN0b3IiKSYmIXYuY2FsbChlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKHIpe3JldHVybiExfWlmKHguc3VwcG9ydC5vd25MYXN0KWZvcihuIGluIGUpcmV0dXJuIHYuY2FsbChlLG4pO2ZvcihuIGluIGUpO3JldHVybiBuPT09dHx8di5jYWxsKGUsbil9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sZXJyb3I6ZnVuY3Rpb24oZSl7dGhyb3cgRXJyb3IoZSl9LHBhcnNlSFRNTDpmdW5jdGlvbihlLHQsbil7aWYoIWV8fCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gbnVsbDsiYm9vbGVhbiI9PXR5cGVvZiB0JiYobj10LHQ9ITEpLHQ9dHx8YTt2YXIgcj1rLmV4ZWMoZSksaT0hbiYmW107cmV0dXJuIHI/W3QuY3JlYXRlRWxlbWVudChyWzFdKV06KHI9eC5idWlsZEZyYWdtZW50KFtlXSx0LGkpLGkmJngoaSkucmVtb3ZlKCkseC5tZXJnZShbXSxyLmNoaWxkTm9kZXMpKX0scGFyc2VKU09OOmZ1bmN0aW9uKG4pe3JldHVybiBlLkpTT04mJmUuSlNPTi5wYXJzZT9lLkpTT04ucGFyc2Uobik6bnVsbD09PW4/bjoic3RyaW5nIj09dHlwZW9mIG4mJihuPXgudHJpbShuKSxuJiZFLnRlc3Qobi5yZXBsYWNlKEEsIkAiKS5yZXBsYWNlKGosIl0iKS5yZXBsYWNlKFMsIiIpKSk/RnVuY3Rpb24oInJldHVybiAiK24pKCk6KHguZXJyb3IoIkludmFsaWQgSlNPTjogIituKSx0KX0scGFyc2VYTUw6ZnVuY3Rpb24obil7dmFyIHIsaTtpZighbnx8InN0cmluZyIhPXR5cGVvZiBuKXJldHVybiBudWxsO3RyeXtlLkRPTVBhcnNlcj8oaT1uZXcgRE9NUGFyc2VyLHI9aS5wYXJzZUZyb21TdHJpbmcobiwidGV4dC94bWwiKSk6KHI9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxyLmFzeW5jPSJmYWxzZSIsci5sb2FkWE1MKG4pKX1jYXRjaChvKXtyPXR9cmV0dXJuIHImJnIuZG9jdW1lbnRFbGVtZW50JiYhci5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fHguZXJyb3IoIkludmFsaWQgWE1MOiAiK24pLHJ9LG5vb3A6ZnVuY3Rpb24oKXt9LGdsb2JhbEV2YWw6ZnVuY3Rpb24odCl7dCYmeC50cmltKHQpJiYoZS5leGVjU2NyaXB0fHxmdW5jdGlvbih0KXtlLmV2YWwuY2FsbChlLHQpfSkodCl9LGNhbWVsQ2FzZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKEQsIm1zLSIpLnJlcGxhY2UoTCxIKX0sbm9kZU5hbWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPTAsbz1lLmxlbmd0aCxhPU0oZSk7aWYobil7aWYoYSl7Zm9yKDtvPmk7aSsrKWlmKHI9dC5hcHBseShlW2ldLG4pLHI9PT0hMSlicmVha31lbHNlIGZvcihpIGluIGUpaWYocj10LmFwcGx5KGVbaV0sbikscj09PSExKWJyZWFrfWVsc2UgaWYoYSl7Zm9yKDtvPmk7aSsrKWlmKHI9dC5jYWxsKGVbaV0saSxlW2ldKSxyPT09ITEpYnJlYWt9ZWxzZSBmb3IoaSBpbiBlKWlmKHI9dC5jYWxsKGVbaV0saSxlW2ldKSxyPT09ITEpYnJlYWs7cmV0dXJuIGV9LHRyaW06YiYmIWIuY2FsbCgiXHVmZWZmXHUwMGEwIik/ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6Yi5jYWxsKGUpfTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjooZSsiIikucmVwbGFjZShDLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8W107cmV0dXJuIG51bGwhPWUmJihNKE9iamVjdChlKSk/eC5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgZT9bZV06ZSk6aC5jYWxsKG4sZSkpLG59LGluQXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKHQpe2lmKG0pcmV0dXJuIG0uY2FsbCh0LGUsbik7Zm9yKHI9dC5sZW5ndGgsbj1uPzA+bj9NYXRoLm1heCgwLHIrbik6bjowO3I+bjtuKyspaWYobiBpbiB0JiZ0W25dPT09ZSlyZXR1cm4gbn1yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oZSxuKXt2YXIgcj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89MDtpZigibnVtYmVyIj09dHlwZW9mIHIpZm9yKDtyPm87bysrKWVbaSsrXT1uW29dO2Vsc2Ugd2hpbGUobltvXSE9PXQpZVtpKytdPW5bbysrXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPVtdLG89MCxhPWUubGVuZ3RoO2ZvcihuPSEhbjthPm87bysrKXI9ISF0KGVbb10sbyksbiE9PXImJmkucHVzaChlW29dKTtyZXR1cm4gaX0sbWFwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPTAsbz1lLmxlbmd0aCxhPU0oZSkscz1bXTtpZihhKWZvcig7bz5pO2krKylyPXQoZVtpXSxpLG4pLG51bGwhPXImJihzW3MubGVuZ3RoXT1yKTtlbHNlIGZvcihpIGluIGUpcj10KGVbaV0saSxuKSxudWxsIT1yJiYoc1tzLmxlbmd0aF09cik7cmV0dXJuIGQuYXBwbHkoW10scyl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihlLG4pe3ZhciByLGksbztyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG4mJihvPWVbbl0sbj1lLGU9bykseC5pc0Z1bmN0aW9uKGUpPyhyPWcuY2FsbChhcmd1bWVudHMsMiksaT1mdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KG58fHRoaXMsci5jb25jYXQoZy5jYWxsKGFyZ3VtZW50cykpKX0saS5ndWlkPWUuZ3VpZD1lLmd1aWR8fHguZ3VpZCsrLGkpOnR9LGFjY2VzczpmdW5jdGlvbihlLG4scixpLG8sYSxzKXt2YXIgbD0wLHU9ZS5sZW5ndGgsYz1udWxsPT1yO2lmKCJvYmplY3QiPT09eC50eXBlKHIpKXtvPSEwO2ZvcihsIGluIHIpeC5hY2Nlc3MoZSxuLGwscltsXSwhMCxhLHMpfWVsc2UgaWYoaSE9PXQmJihvPSEwLHguaXNGdW5jdGlvbihpKXx8KHM9ITApLGMmJihzPyhuLmNhbGwoZSxpKSxuPW51bGwpOihjPW4sbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGMuY2FsbCh4KGUpLG4pfSkpLG4pKWZvcig7dT5sO2wrKyluKGVbbF0scixzP2k6aS5jYWxsKGVbbF0sbCxuKGVbbF0scikpKTtyZXR1cm4gbz9lOmM/bi5jYWxsKGUpOnU/bihlWzBdLHIpOmF9LG5vdzpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSxzd2FwOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYT17fTtmb3IobyBpbiB0KWFbb109ZS5zdHlsZVtvXSxlLnN0eWxlW29dPXRbb107aT1uLmFwcGx5KGUscnx8W10pO2ZvcihvIGluIHQpZS5zdHlsZVtvXT1hW29dO3JldHVybiBpfX0pLHgucmVhZHkucHJvbWlzZT1mdW5jdGlvbih0KXtpZighbilpZihuPXguRGVmZXJyZWQoKSwiY29tcGxldGUiPT09YS5yZWFkeVN0YXRlKXNldFRpbWVvdXQoeC5yZWFkeSk7ZWxzZSBpZihhLmFkZEV2ZW50TGlzdGVuZXIpYS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixxLCExKSxlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHEsITEpO2Vsc2V7YS5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixxKSxlLmF0dGFjaEV2ZW50KCJvbmxvYWQiLHEpO3ZhciByPSExO3RyeXtyPW51bGw9PWUuZnJhbWVFbGVtZW50JiZhLmRvY3VtZW50RWxlbWVudH1jYXRjaChpKXt9ciYmci5kb1Njcm9sbCYmZnVuY3Rpb24gbygpe2lmKCF4LmlzUmVhZHkpe3RyeXtyLmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goZSl7cmV0dXJuIHNldFRpbWVvdXQobyw1MCl9XygpLHgucmVhZHkoKX19KCl9cmV0dXJuIG4ucHJvbWlzZSh0KX0seC5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7Y1siW29iamVjdCAiK3QrIl0iXT10LnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiBNKGUpe3ZhciB0PWUubGVuZ3RoLG49eC50eXBlKGUpO3JldHVybiB4LmlzV2luZG93KGUpPyExOjE9PT1lLm5vZGVUeXBlJiZ0PyEwOiJhcnJheSI9PT1ufHwiZnVuY3Rpb24iIT09biYmKDA9PT10fHwibnVtYmVyIj09dHlwZW9mIHQmJnQ+MCYmdC0xIGluIGUpfXI9eChhKSxmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscyxsLHUsYyxwLGYsZCxoLGcsbSx5LHYsYj0ic2l6emxlIistbmV3IERhdGUsdz1lLmRvY3VtZW50LFQ9MCxDPTAsTj1zdCgpLGs9c3QoKSxFPXN0KCksUz0hMSxBPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10PyhTPSEwLDApOjB9LGo9dHlwZW9mIHQsRD0xPDwzMSxMPXt9Lmhhc093blByb3BlcnR5LEg9W10scT1ILnBvcCxfPUgucHVzaCxNPUgucHVzaCxPPUguc2xpY2UsRj1ILmluZGV4T2Z8fGZ1bmN0aW9uKGUpe3ZhciB0PTAsbj10aGlzLmxlbmd0aDtmb3IoO24+dDt0KyspaWYodGhpc1t0XT09PWUpcmV0dXJuIHQ7cmV0dXJuLTF9LEI9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixQPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixSPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsVz1SLnJlcGxhY2UoInciLCJ3IyIpLCQ9IlxcWyIrUCsiKigiK1IrIikiK1ArIiooPzooWypeJHwhfl0/PSkiK1ArIiooPzooWydcIl0pKCg/OlxcXFwufFteXFxcXF0pKj8pXFwzfCgiK1crIil8KXwpIitQKyIqXFxdIixJPSI6KCIrUisiKSg/OlxcKCgoWydcIl0pKCg/OlxcXFwufFteXFxcXF0pKj8pXFwzfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrJC5yZXBsYWNlKDMsOCkrIikqKXwuKilcXCl8KSIsej1SZWdFeHAoIl4iK1ArIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrUCsiKyQiLCJnIiksWD1SZWdFeHAoIl4iK1ArIiosIitQKyIqIiksVT1SZWdFeHAoIl4iK1ArIiooWz4rfl18IitQKyIpIitQKyIqIiksVj1SZWdFeHAoUCsiKlsrfl0iKSxZPVJlZ0V4cCgiPSIrUCsiKihbXlxcXSdcIl0qKSIrUCsiKlxcXSIsImciKSxKPVJlZ0V4cChJKSxHPVJlZ0V4cCgiXiIrVysiJCIpLFE9e0lEOlJlZ0V4cCgiXiMoIitSKyIpIiksQ0xBU1M6UmVnRXhwKCJeXFwuKCIrUisiKSIpLFRBRzpSZWdFeHAoIl4oIitSLnJlcGxhY2UoInciLCJ3KiIpKyIpIiksQVRUUjpSZWdFeHAoIl4iKyQpLFBTRVVETzpSZWdFeHAoIl4iK0kpLENISUxEOlJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitQKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitQKyIqKD86KFsrLV18KSIrUCsiKihcXGQrKXwpKSIrUCsiKlxcKXwpIiwiaSIpLGJvb2w6UmVnRXhwKCJeKD86IitCKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6UmVnRXhwKCJeIitQKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK1ArIiooKD86LVxcZCk/XFxkKikiK1ArIipcXCl8KSg/PVteLV18JCkiLCJpIil9LEs9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLFo9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxldD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLHR0PS9eaFxkJC9pLG50PS8nfFxcL2cscnQ9UmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK1ArIj98KCIrUCsiKXwuKSIsImlnIiksaXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSIweCIrdC02NTUzNjtyZXR1cm4gciE9PXJ8fG4/dDowPnI/U3RyaW5nLmZyb21DaGFyQ29kZShyKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fHI+PjEwLDU2MzIwfDEwMjMmcil9O3RyeXtNLmFwcGx5KEg9Ty5jYWxsKHcuY2hpbGROb2Rlcyksdy5jaGlsZE5vZGVzKSxIW3cuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKG90KXtNPXthcHBseTpILmxlbmd0aD9mdW5jdGlvbihlLHQpe18uYXBwbHkoZSxPLmNhbGwodCkpfTpmdW5jdGlvbihlLHQpe3ZhciBuPWUubGVuZ3RoLHI9MDt3aGlsZShlW24rK109dFtyKytdKTtlLmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBhdChlLHQsbixpKXt2YXIgbyxhLHMsbCx1LGMsZCxtLHkseDtpZigodD90Lm93bmVyRG9jdW1lbnR8fHQ6dykhPT1mJiZwKHQpLHQ9dHx8ZixuPW58fFtdLCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG47aWYoMSE9PShsPXQubm9kZVR5cGUpJiY5IT09bClyZXR1cm5bXTtpZihoJiYhaSl7aWYobz1aLmV4ZWMoZSkpaWYocz1vWzFdKXtpZig5PT09bCl7aWYoYT10LmdldEVsZW1lbnRCeUlkKHMpLCFhfHwhYS5wYXJlbnROb2RlKXJldHVybiBuO2lmKGEuaWQ9PT1zKXJldHVybiBuLnB1c2goYSksbn1lbHNlIGlmKHQub3duZXJEb2N1bWVudCYmKGE9dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHMpKSYmdih0LGEpJiZhLmlkPT09cylyZXR1cm4gbi5wdXNoKGEpLG59ZWxzZXtpZihvWzJdKXJldHVybiBNLmFwcGx5KG4sdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSksbjtpZigocz1vWzNdKSYmci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZ0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIE0uYXBwbHkobix0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUocykpLG59aWYoci5xc2EmJighZ3x8IWcudGVzdChlKSkpe2lmKG09ZD1iLHk9dCx4PTk9PT1sJiZlLDE9PT1sJiYib2JqZWN0IiE9PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7Yz1tdChlKSwoZD10LmdldEF0dHJpYnV0ZSgiaWQiKSk/bT1kLnJlcGxhY2UobnQsIlxcJCYiKTp0LnNldEF0dHJpYnV0ZSgiaWQiLG0pLG09IltpZD0nIittKyInXSAiLHU9Yy5sZW5ndGg7d2hpbGUodS0tKWNbdV09bSt5dChjW3VdKTt5PVYudGVzdChlKSYmdC5wYXJlbnROb2RlfHx0LHg9Yy5qb2luKCIsIil9aWYoeCl0cnl7cmV0dXJuIE0uYXBwbHkobix5LnF1ZXJ5U2VsZWN0b3JBbGwoeCkpLG59Y2F0Y2goVCl7fWZpbmFsbHl7ZHx8dC5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4ga3QoZS5yZXBsYWNlKHosIiQxIiksdCxuLGkpfWZ1bmN0aW9uIHN0KCl7dmFyIGU9W107ZnVuY3Rpb24gdChuLHIpe3JldHVybiBlLnB1c2gobis9IiAiKT5vLmNhY2hlTGVuZ3RoJiZkZWxldGUgdFtlLnNoaWZ0KCldLHRbbl09cn1yZXR1cm4gdH1mdW5jdGlvbiBsdChlKXtyZXR1cm4gZVtiXT0hMCxlfWZ1bmN0aW9uIHV0KGUpe3ZhciB0PWYuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhZSh0KX1jYXRjaChuKXtyZXR1cm4hMX1maW5hbGx5e3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHQ9bnVsbH19ZnVuY3Rpb24gY3QoZSx0KXt2YXIgbj1lLnNwbGl0KCJ8Iikscj1lLmxlbmd0aDt3aGlsZShyLS0pby5hdHRySGFuZGxlW25bcl1dPXR9ZnVuY3Rpb24gcHQoZSx0KXt2YXIgbj10JiZlLHI9biYmMT09PWUubm9kZVR5cGUmJjE9PT10Lm5vZGVUeXBlJiYofnQuc291cmNlSW5kZXh8fEQpLSh+ZS5zb3VyY2VJbmRleHx8RCk7aWYocilyZXR1cm4gcjtpZihuKXdoaWxlKG49bi5uZXh0U2libGluZylpZihuPT09dClyZXR1cm4tMTtyZXR1cm4gZT8xOi0xfWZ1bmN0aW9uIGZ0KGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PW4mJnQudHlwZT09PWV9fWZ1bmN0aW9uIGR0KGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1ufHwiYnV0dG9uIj09PW4pJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBodChlKXtyZXR1cm4gbHQoZnVuY3Rpb24odCl7cmV0dXJuIHQ9K3QsbHQoZnVuY3Rpb24obixyKXt2YXIgaSxvPWUoW10sbi5sZW5ndGgsdCksYT1vLmxlbmd0aDt3aGlsZShhLS0pbltpPW9bYV1dJiYobltpXT0hKHJbaV09bltpXSkpfSl9KX1zPWF0LmlzWE1MPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJihlLm93bmVyRG9jdW1lbnR8fGUpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gdD8iSFRNTCIhPT10Lm5vZGVOYW1lOiExfSxyPWF0LnN1cHBvcnQ9e30scD1hdC5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt2YXIgbj1lP2Uub3duZXJEb2N1bWVudHx8ZTp3LGk9bi5kZWZhdWx0VmlldztyZXR1cm4gbiE9PWYmJjk9PT1uLm5vZGVUeXBlJiZuLmRvY3VtZW50RWxlbWVudD8oZj1uLGQ9bi5kb2N1bWVudEVsZW1lbnQsaD0hcyhuKSxpJiZpLmF0dGFjaEV2ZW50JiZpIT09aS50b3AmJmkuYXR0YWNoRXZlbnQoIm9uYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3AoKX0pLHIuYXR0cmlidXRlcz11dChmdW5jdGlvbihlKXtyZXR1cm4gZS5jbGFzc05hbWU9ImkiLCFlLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxyLmdldEVsZW1lbnRzQnlUYWdOYW1lPXV0KGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKG4uY3JlYXRlQ29tbWVudCgiIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPXV0KGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGRpdiBjbGFzcz0nYSc+PC9kaXY+PGRpdiBjbGFzcz0nYSBpJz48L2Rpdj4iLGUuZmlyc3RDaGlsZC5jbGFzc05hbWU9ImkiLDI9PT1lLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImkiKS5sZW5ndGh9KSxyLmdldEJ5SWQ9dXQoZnVuY3Rpb24oZSl7cmV0dXJuIGQuYXBwZW5kQ2hpbGQoZSkuaWQ9Yiwhbi5nZXRFbGVtZW50c0J5TmFtZXx8IW4uZ2V0RWxlbWVudHNCeU5hbWUoYikubGVuZ3RofSksci5nZXRCeUlkPyhvLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdC5nZXRFbGVtZW50QnlJZCE9PWomJmgpe3ZhciBuPXQuZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIG4mJm4ucGFyZW50Tm9kZT9bbl06W119fSxvLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UocnQsaXQpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0pOihkZWxldGUgby5maW5kLklELG8uZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShydCxpdCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPXR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUhPT1qJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIG4mJm4udmFsdWU9PT10fX0pLG8uZmluZC5UQUc9ci5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihlLG4pe3JldHVybiB0eXBlb2Ygbi5nZXRFbGVtZW50c0J5VGFnTmFtZSE9PWo/bi5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTp0fTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT0wLG89dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTtpZigiKiI9PT1lKXt3aGlsZShuPW9baSsrXSkxPT09bi5ub2RlVHlwZSYmci5wdXNoKG4pO3JldHVybiByfXJldHVybiBvfSxvLmZpbmQuQ0xBU1M9ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbihlLG4pe3JldHVybiB0eXBlb2Ygbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT09aiYmaD9uLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSk6dH0sbT1bXSxnPVtdLChyLnFzYT1LLnRlc3Qobi5xdWVyeVNlbGVjdG9yQWxsKSkmJih1dChmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iPHNlbGVjdD48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RofHxnLnB1c2goIlxcWyIrUCsiKig/OnZhbHVlfCIrQisiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fGcucHVzaCgiOmNoZWNrZWQiKX0pLHV0KGZ1bmN0aW9uKGUpe3ZhciB0PW4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGUuYXBwZW5kQ2hpbGQodCkuc2V0QXR0cmlidXRlKCJ0IiwiIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbdF49JyddIikubGVuZ3RoJiZnLnB1c2goIlsqXiRdPSIrUCsiKig/OicnfFwiXCIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aHx8Zy5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGUucXVlcnlTZWxlY3RvckFsbCgiKiw6eCIpLGcucHVzaCgiLC4qOiIpfSkpLChyLm1hdGNoZXNTZWxlY3Rvcj1LLnRlc3QoeT1kLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8ZC5tb3pNYXRjaGVzU2VsZWN0b3J8fGQub01hdGNoZXNTZWxlY3Rvcnx8ZC5tc01hdGNoZXNTZWxlY3RvcikpJiZ1dChmdW5jdGlvbihlKXtyLmRpc2Nvbm5lY3RlZE1hdGNoPXkuY2FsbChlLCJkaXYiKSx5LmNhbGwoZSwiW3MhPScnXTp4IiksbS5wdXNoKCIhPSIsSSl9KSxnPWcubGVuZ3RoJiZSZWdFeHAoZy5qb2luKCJ8IikpLG09bS5sZW5ndGgmJlJlZ0V4cChtLmpvaW4oInwiKSksdj1LLnRlc3QoZC5jb250YWlucyl8fGQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxBPWQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gUz0hMCwwO3ZhciBpPXQuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk7cmV0dXJuIGk/MSZpfHwhci5zb3J0RGV0YWNoZWQmJnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSk9PT1pP2U9PT1ufHx2KHcsZSk/LTE6dD09PW58fHYodyx0KT8xOmM/Ri5jYWxsKGMsZSktRi5jYWxsKGMsdCk6MDo0Jmk/LTE6MTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPy0xOjF9OmZ1bmN0aW9uKGUsdCl7dmFyIHIsaT0wLG89ZS5wYXJlbnROb2RlLGE9dC5wYXJlbnROb2RlLHM9W2VdLGw9W3RdO2lmKGU9PT10KXJldHVybiBTPSEwLDA7aWYoIW98fCFhKXJldHVybiBlPT09bj8tMTp0PT09bj8xOm8/LTE6YT8xOmM/Ri5jYWxsKGMsZSktRi5jYWxsKGMsdCk6MDtpZihvPT09YSlyZXR1cm4gcHQoZSx0KTtyPWU7d2hpbGUocj1yLnBhcmVudE5vZGUpcy51bnNoaWZ0KHIpO3I9dDt3aGlsZShyPXIucGFyZW50Tm9kZSlsLnVuc2hpZnQocik7d2hpbGUoc1tpXT09PWxbaV0paSsrO3JldHVybiBpP3B0KHNbaV0sbFtpXSk6c1tpXT09PXc/LTE6bFtpXT09PXc/MTowfSxuKTpmfSxhdC5tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGF0KGUsbnVsbCxudWxsLHQpfSxhdC5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZSx0KXtpZigoZS5vd25lckRvY3VtZW50fHxlKSE9PWYmJnAoZSksdD10LnJlcGxhY2UoWSwiPSckMSddIiksISghci5tYXRjaGVzU2VsZWN0b3J8fCFofHxtJiZtLnRlc3QodCl8fGcmJmcudGVzdCh0KSkpdHJ5e3ZhciBuPXkuY2FsbChlLHQpO2lmKG58fHIuZGlzY29ubmVjdGVkTWF0Y2h8fGUuZG9jdW1lbnQmJjExIT09ZS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gbn1jYXRjaChpKXt9cmV0dXJuIGF0KHQsZixudWxsLFtlXSkubGVuZ3RoPjB9LGF0LmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUub3duZXJEb2N1bWVudHx8ZSkhPT1mJiZwKGUpLHYoZSx0KX0sYXQuYXR0cj1mdW5jdGlvbihlLG4peyhlLm93bmVyRG9jdW1lbnR8fGUpIT09ZiYmcChlKTt2YXIgaT1vLmF0dHJIYW5kbGVbbi50b0xvd2VyQ2FzZSgpXSxhPWkmJkwuY2FsbChvLmF0dHJIYW5kbGUsbi50b0xvd2VyQ2FzZSgpKT9pKGUsbiwhaCk6dDtyZXR1cm4gYT09PXQ/ci5hdHRyaWJ1dGVzfHwhaD9lLmdldEF0dHJpYnV0ZShuKTooYT1lLmdldEF0dHJpYnV0ZU5vZGUobikpJiZhLnNwZWNpZmllZD9hLnZhbHVlOm51bGw6YX0sYXQuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LGF0LnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxpPTAsbz0wO2lmKFM9IXIuZGV0ZWN0RHVwbGljYXRlcyxjPSFyLnNvcnRTdGFibGUmJmUuc2xpY2UoMCksZS5zb3J0KEEpLFMpe3doaWxlKHQ9ZVtvKytdKXQ9PT1lW29dJiYoaT1uLnB1c2gobykpO3doaWxlKGktLSllLnNwbGljZShuW2ldLDEpfXJldHVybiBlfSxhPWF0LmdldFRleHQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj0iIixyPTAsaT1lLm5vZGVUeXBlO2lmKGkpe2lmKDE9PT1pfHw5PT09aXx8MTE9PT1pKXtpZigic3RyaW5nIj09dHlwZW9mIGUudGV4dENvbnRlbnQpcmV0dXJuIGUudGV4dENvbnRlbnQ7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKW4rPWEoZSl9ZWxzZSBpZigzPT09aXx8ND09PWkpcmV0dXJuIGUubm9kZVZhbHVlfWVsc2UgZm9yKDt0PWVbcl07cisrKW4rPWEodCk7cmV0dXJuIG59LG89YXQuc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86bHQsbWF0Y2g6USxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKHJ0LGl0KSxlWzNdPShlWzRdfHxlWzVdfHwiIikucmVwbGFjZShydCxpdCksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fGF0LmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJmF0LmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgbixyPSFlWzVdJiZlWzJdO3JldHVybiBRLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXSYmZVs0XSE9PXQ/ZVsyXT1lWzRdOnImJkoudGVzdChyKSYmKG49bXQociwhMCkpJiYobj1yLmluZGV4T2YoIikiLHIubGVuZ3RoLW4pLXIubGVuZ3RoKSYmKGVbMF09ZVswXS5zbGljZSgwLG4pLGVbMl09ci5zbGljZSgwLG4pKSxlLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHJ0LGl0KS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PWU/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXR9fSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1OW2UrIiAiXTtyZXR1cm4gdHx8KHQ9UmVnRXhwKCIoXnwiK1ArIikiK2UrIigiK1ArInwkKSIpKSYmTihlLGZ1bmN0aW9uKGUpe3JldHVybiB0LnRlc3QoInN0cmluZyI9PXR5cGVvZiBlLmNsYXNzTmFtZSYmZS5jbGFzc05hbWV8fHR5cGVvZiBlLmdldEF0dHJpYnV0ZSE9PWomJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBpPWF0LmF0dHIocixlKTtyZXR1cm4gbnVsbD09aT8iIT0iPT09dDp0PyhpKz0iIiwiPSI9PT10P2k9PT1uOiIhPSI9PT10P2khPT1uOiJePSI9PT10P24mJjA9PT1pLmluZGV4T2Yobik6Iio9Ij09PXQ/biYmaS5pbmRleE9mKG4pPi0xOiIkPSI9PT10P24mJmkuc2xpY2UoLW4ubGVuZ3RoKT09PW46In49Ij09PXQ/KCIgIitpKyIgIikuaW5kZXhPZihuKT4tMToifD0iPT09dD9pPT09bnx8aS5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz0ibnRoIiE9PWUuc2xpY2UoMCwzKSxhPSJsYXN0IiE9PWUuc2xpY2UoLTQpLHM9Im9mLXR5cGUiPT09dDtyZXR1cm4gMT09PXImJjA9PT1pP2Z1bmN0aW9uKGUpe3JldHVybiEhZS5wYXJlbnROb2RlfTpmdW5jdGlvbih0LG4sbCl7dmFyIHUsYyxwLGYsZCxoLGc9byE9PWE/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixtPXQucGFyZW50Tm9kZSx5PXMmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSx2PSFsJiYhcztpZihtKXtpZihvKXt3aGlsZShnKXtwPXQ7d2hpbGUocD1wW2ddKWlmKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09eToxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtoPWc9Im9ubHkiPT09ZSYmIWgmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYoaD1bYT9tLmZpcnN0Q2hpbGQ6bS5sYXN0Q2hpbGRdLGEmJnYpe2M9bVtiXXx8KG1bYl09e30pLHU9Y1tlXXx8W10sZD11WzBdPT09VCYmdVsxXSxmPXVbMF09PT1UJiZ1WzJdLHA9ZCYmbS5jaGlsZE5vZGVzW2RdO3doaWxlKHA9KytkJiZwJiZwW2ddfHwoZj1kPTApfHxoLnBvcCgpKWlmKDE9PT1wLm5vZGVUeXBlJiYrK2YmJnA9PT10KXtjW2VdPVtULGQsZl07YnJlYWt9fWVsc2UgaWYodiYmKHU9KHRbYl18fCh0W2JdPXt9KSlbZV0pJiZ1WzBdPT09VClmPXVbMV07ZWxzZSB3aGlsZShwPSsrZCYmcCYmcFtnXXx8KGY9ZD0wKXx8aC5wb3AoKSlpZigocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT15OjE9PT1wLm5vZGVUeXBlKSYmKytmJiYodiYmKChwW2JdfHwocFtiXT17fSkpW2VdPVtULGZdKSxwPT09dCkpYnJlYWs7cmV0dXJuIGYtPWksZj09PXJ8fDA9PT1mJXImJmYvcj49MH19fSxQU0VVRE86ZnVuY3Rpb24oZSx0KXt2YXIgbixyPW8ucHNldWRvc1tlXXx8by5zZXRGaWx0ZXJzW2UudG9Mb3dlckNhc2UoKV18fGF0LmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrZSk7cmV0dXJuIHJbYl0/cih0KTpyLmxlbmd0aD4xPyhuPVtlLGUsIiIsdF0sby5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/bHQoZnVuY3Rpb24oZSxuKXt2YXIgaSxvPXIoZSx0KSxhPW8ubGVuZ3RoO3doaWxlKGEtLSlpPUYuY2FsbChlLG9bYV0pLGVbaV09IShuW2ldPW9bYV0pfSk6ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSwwLG4pfSk6cn19LHBzZXVkb3M6e25vdDpsdChmdW5jdGlvbihlKXt2YXIgdD1bXSxuPVtdLHI9bChlLnJlcGxhY2UoeiwiJDEiKSk7cmV0dXJuIHJbYl0/bHQoZnVuY3Rpb24oZSx0LG4saSl7dmFyIG8sYT1yKGUsbnVsbCxpLFtdKSxzPWUubGVuZ3RoO3doaWxlKHMtLSkobz1hW3NdKSYmKGVbc109ISh0W3NdPW8pKX0pOmZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gdFswXT1lLHIodCxudWxsLG8sbiksIW4ucG9wKCl9fSksaGFzOmx0KGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gYXQoZSx0KS5sZW5ndGg+MH19KSxjb250YWluczpsdChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuKHQudGV4dENvbnRlbnR8fHQuaW5uZXJUZXh0fHxhKHQpKS5pbmRleE9mKGUpPi0xfX0pLGxhbmc6bHQoZnVuY3Rpb24oZSl7cmV0dXJuIEcudGVzdChlfHwiIil8fGF0LmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2UpLGU9ZS5yZXBsYWNlKHJ0LGl0KS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKHQpe3ZhciBuO2RvIGlmKG49aD90Lmxhbmc6dC5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fHQuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIG49bi50b0xvd2VyQ2FzZSgpLG49PT1lfHwwPT09bi5pbmRleE9mKGUrIi0iKTt3aGlsZSgodD10LnBhcmVudE5vZGUpJiYxPT09dC5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKHQpe3ZhciBuPWUubG9jYXRpb24mJmUubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PXQuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1kfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWYuYWN0aXZlRWxlbWVudCYmKCFmLmhhc0ZvY3VzfHxmLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYhIWUuY2hlY2tlZHx8Im9wdGlvbiI9PT10JiYhIWUuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGUuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oZSl7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKWlmKGUubm9kZU5hbWU+IkAifHwzPT09ZS5ub2RlVHlwZXx8ND09PWUubm9kZVR5cGUpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihlKXtyZXR1cm4hby5wc2V1ZG9zLmVtcHR5KGUpfSxoZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHR0LnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBldC50ZXN0KGUubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYiYnV0dG9uIj09PWUudHlwZXx8ImJ1dHRvbiI9PT10fSx0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWUudHlwZSYmKG51bGw9PSh0PWUuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHx0LnRvTG93ZXJDYXNlKCk9PT1lLnR5cGUpfSxmaXJzdDpodChmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6aHQoZnVuY3Rpb24oZSx0KXtyZXR1cm5bdC0xXX0pLGVxOmh0KGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bMD5uP24rdDpuXX0pLGV2ZW46aHQoZnVuY3Rpb24oZSx0KXt2YXIgbj0wO2Zvcig7dD5uO24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksb2RkOmh0KGZ1bmN0aW9uKGUsdCl7dmFyIG49MTtmb3IoO3Q+bjtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0Omh0KGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0wPm4/bit0Om47Zm9yKDstLXI+PTA7KWUucHVzaChyKTtyZXR1cm4gZX0pLGd0Omh0KGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0wPm4/bit0Om47Zm9yKDt0PisrcjspZS5wdXNoKHIpO3JldHVybiBlfSl9fSxvLnBzZXVkb3MubnRoPW8ucHNldWRvcy5lcTtmb3IobiBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlvLnBzZXVkb3Nbbl09ZnQobik7Zm9yKG4gaW57c3VibWl0OiEwLHJlc2V0OiEwfSlvLnBzZXVkb3Nbbl09ZHQobik7ZnVuY3Rpb24gZ3QoKXt9Z3QucHJvdG90eXBlPW8uZmlsdGVycz1vLnBzZXVkb3Msby5zZXRGaWx0ZXJzPW5ldyBndDtmdW5jdGlvbiBtdChlLHQpe3ZhciBuLHIsaSxhLHMsbCx1LGM9a1tlKyIgIl07aWYoYylyZXR1cm4gdD8wOmMuc2xpY2UoMCk7cz1lLGw9W10sdT1vLnByZUZpbHRlcjt3aGlsZShzKXsoIW58fChyPVguZXhlYyhzKSkpJiYociYmKHM9cy5zbGljZShyWzBdLmxlbmd0aCl8fHMpLGwucHVzaChpPVtdKSksbj0hMSwocj1VLmV4ZWMocykpJiYobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6clswXS5yZXBsYWNlKHosIiAiKX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2ZvcihhIGluIG8uZmlsdGVyKSEocj1RW2FdLmV4ZWMocykpfHx1W2FdJiYhKHI9dVthXShyKSl8fChuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTphLG1hdGNoZXM6cn0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P3MubGVuZ3RoOnM/YXQuZXJyb3IoZSk6ayhlLGwpLnNsaWNlKDApfWZ1bmN0aW9uIHl0KGUpe3ZhciB0PTAsbj1lLmxlbmd0aCxyPSIiO2Zvcig7bj50O3QrKylyKz1lW3RdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIHZ0KGUsdCxuKXt2YXIgcj10LmRpcixvPW4mJiJwYXJlbnROb2RlIj09PXIsYT1DKys7cmV0dXJuIHQuZmlyc3Q/ZnVuY3Rpb24odCxuLGkpe3doaWxlKHQ9dFtyXSlpZigxPT09dC5ub2RlVHlwZXx8bylyZXR1cm4gZSh0LG4saSl9OmZ1bmN0aW9uKHQsbixzKXt2YXIgbCx1LGMscD1UKyIgIithO2lmKHMpe3doaWxlKHQ9dFtyXSlpZigoMT09PXQubm9kZVR5cGV8fG8pJiZlKHQsbixzKSlyZXR1cm4hMH1lbHNlIHdoaWxlKHQ9dFtyXSlpZigxPT09dC5ub2RlVHlwZXx8bylpZihjPXRbYl18fCh0W2JdPXt9KSwodT1jW3JdKSYmdVswXT09PXApe2lmKChsPXVbMV0pPT09ITB8fGw9PT1pKXJldHVybiBsPT09ITB9ZWxzZSBpZih1PWNbcl09W3BdLHVbMV09ZSh0LG4scyl8fGksdVsxXT09PSEwKXJldHVybiEwfX1mdW5jdGlvbiBidChlKXtyZXR1cm4gZS5sZW5ndGg+MT9mdW5jdGlvbih0LG4scil7dmFyIGk9ZS5sZW5ndGg7d2hpbGUoaS0tKWlmKCFlW2ldKHQsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06ZVswXX1mdW5jdGlvbiB4dChlLHQsbixyLGkpe3ZhciBvLGE9W10scz0wLGw9ZS5sZW5ndGgsdT1udWxsIT10O2Zvcig7bD5zO3MrKykobz1lW3NdKSYmKCFufHxuKG8scixpKSkmJihhLnB1c2gobyksdSYmdC5wdXNoKHMpKTtyZXR1cm4gYX1mdW5jdGlvbiB3dChlLHQsbixyLGksbyl7cmV0dXJuIHImJiFyW2JdJiYocj13dChyKSksaSYmIWlbYl0mJihpPXd0KGksbykpLGx0KGZ1bmN0aW9uKG8sYSxzLGwpe3ZhciB1LGMscCxmPVtdLGQ9W10saD1hLmxlbmd0aCxnPW98fE50KHR8fCIqIixzLm5vZGVUeXBlP1tzXTpzLFtdKSxtPSFlfHwhbyYmdD9nOnh0KGcsZixlLHMsbCkseT1uP2l8fChvP2U6aHx8cik/W106YTptO2lmKG4mJm4obSx5LHMsbCkscil7dT14dCh5LGQpLHIodSxbXSxzLGwpLGM9dS5sZW5ndGg7d2hpbGUoYy0tKShwPXVbY10pJiYoeVtkW2NdXT0hKG1bZFtjXV09cCkpfWlmKG8pe2lmKGl8fGUpe2lmKGkpe3U9W10sYz15Lmxlbmd0aDt3aGlsZShjLS0pKHA9eVtjXSkmJnUucHVzaChtW2NdPXApO2kobnVsbCx5PVtdLHUsbCl9Yz15Lmxlbmd0aDt3aGlsZShjLS0pKHA9eVtjXSkmJih1PWk/Ri5jYWxsKG8scCk6ZltjXSk+LTEmJihvW3VdPSEoYVt1XT1wKSl9fWVsc2UgeT14dCh5PT09YT95LnNwbGljZShoLHkubGVuZ3RoKTp5KSxpP2kobnVsbCxhLHksbCk6TS5hcHBseShhLHkpfSl9ZnVuY3Rpb24gVHQoZSl7dmFyIHQsbixyLGk9ZS5sZW5ndGgsYT1vLnJlbGF0aXZlW2VbMF0udHlwZV0scz1hfHxvLnJlbGF0aXZlWyIgIl0sbD1hPzE6MCxjPXZ0KGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dH0scywhMCkscD12dChmdW5jdGlvbihlKXtyZXR1cm4gRi5jYWxsKHQsZSk+LTF9LHMsITApLGY9W2Z1bmN0aW9uKGUsbixyKXtyZXR1cm4hYSYmKHJ8fG4hPT11KXx8KCh0PW4pLm5vZGVUeXBlP2MoZSxuLHIpOnAoZSxuLHIpKX1dO2Zvcig7aT5sO2wrKylpZihuPW8ucmVsYXRpdmVbZVtsXS50eXBlXSlmPVt2dChidChmKSxuKV07ZWxzZXtpZihuPW8uZmlsdGVyW2VbbF0udHlwZV0uYXBwbHkobnVsbCxlW2xdLm1hdGNoZXMpLG5bYl0pe2ZvcihyPSsrbDtpPnI7cisrKWlmKG8ucmVsYXRpdmVbZVtyXS50eXBlXSlicmVhaztyZXR1cm4gd3QobD4xJiZidChmKSxsPjEmJnl0KGUuc2xpY2UoMCxsLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09ZVtsLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoeiwiJDEiKSxuLHI+bCYmVHQoZS5zbGljZShsLHIpKSxpPnImJlR0KGU9ZS5zbGljZShyKSksaT5yJiZ5dChlKSl9Zi5wdXNoKG4pfXJldHVybiBidChmKX1mdW5jdGlvbiBDdChlLHQpe3ZhciBuPTAscj10Lmxlbmd0aD4wLGE9ZS5sZW5ndGg+MCxzPWZ1bmN0aW9uKHMsbCxjLHAsZCl7dmFyIGgsZyxtLHk9W10sdj0wLGI9IjAiLHg9cyYmW10sdz1udWxsIT1kLEM9dSxOPXN8fGEmJm8uZmluZC5UQUcoIioiLGQmJmwucGFyZW50Tm9kZXx8bCksaz1UKz1udWxsPT1DPzE6TWF0aC5yYW5kb20oKXx8LjE7Zm9yKHcmJih1PWwhPT1mJiZsLGk9bik7bnVsbCE9KGg9TltiXSk7YisrKXtpZihhJiZoKXtnPTA7d2hpbGUobT1lW2crK10paWYobShoLGwsYykpe3AucHVzaChoKTticmVha313JiYoVD1rLGk9KytuKX1yJiYoKGg9IW0mJmgpJiZ2LS0scyYmeC5wdXNoKGgpKX1pZih2Kz1iLHImJmIhPT12KXtnPTA7d2hpbGUobT10W2crK10pbSh4LHksbCxjKTtpZihzKXtpZih2PjApd2hpbGUoYi0tKXhbYl18fHlbYl18fCh5W2JdPXEuY2FsbChwKSk7eT14dCh5KX1NLmFwcGx5KHAseSksdyYmIXMmJnkubGVuZ3RoPjAmJnYrdC5sZW5ndGg+MSYmYXQudW5pcXVlU29ydChwKX1yZXR1cm4gdyYmKFQ9ayx1PUMpLHh9O3JldHVybiByP2x0KHMpOnN9bD1hdC5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPVtdLG89RVtlKyIgIl07aWYoIW8pe3R8fCh0PW10KGUpKSxuPXQubGVuZ3RoO3doaWxlKG4tLSlvPVR0KHRbbl0pLG9bYl0/ci5wdXNoKG8pOmkucHVzaChvKTtvPUUoZSxDdChpLHIpKX1yZXR1cm4gb307ZnVuY3Rpb24gTnQoZSx0LG4pe3ZhciByPTAsaT10Lmxlbmd0aDtmb3IoO2k+cjtyKyspYXQoZSx0W3JdLG4pO3JldHVybiBufWZ1bmN0aW9uIGt0KGUsdCxuLGkpe3ZhciBhLHMsdSxjLHAsZj1tdChlKTtpZighaSYmMT09PWYubGVuZ3RoKXtpZihzPWZbMF09ZlswXS5zbGljZSgwKSxzLmxlbmd0aD4yJiYiSUQiPT09KHU9c1swXSkudHlwZSYmci5nZXRCeUlkJiY5PT09dC5ub2RlVHlwZSYmaCYmby5yZWxhdGl2ZVtzWzFdLnR5cGVdKXtpZih0PShvLmZpbmQuSUQodS5tYXRjaGVzWzBdLnJlcGxhY2UocnQsaXQpLHQpfHxbXSlbMF0sIXQpcmV0dXJuIG47ZT1lLnNsaWNlKHMuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWE9US5uZWVkc0NvbnRleHQudGVzdChlKT8wOnMubGVuZ3RoO3doaWxlKGEtLSl7aWYodT1zW2FdLG8ucmVsYXRpdmVbYz11LnR5cGVdKWJyZWFrO2lmKChwPW8uZmluZFtjXSkmJihpPXAodS5tYXRjaGVzWzBdLnJlcGxhY2UocnQsaXQpLFYudGVzdChzWzBdLnR5cGUpJiZ0LnBhcmVudE5vZGV8fHQpKSl7aWYocy5zcGxpY2UoYSwxKSxlPWkubGVuZ3RoJiZ5dChzKSwhZSlyZXR1cm4gTS5hcHBseShuLGkpLG47YnJlYWt9fX1yZXR1cm4gbChlLGYpKGksdCwhaCxuLFYudGVzdChlKSksbn1yLnNvcnRTdGFibGU9Yi5zcGxpdCgiIikuc29ydChBKS5qb2luKCIiKT09PWIsci5kZXRlY3REdXBsaWNhdGVzPVMscCgpLHIuc29ydERldGFjaGVkPXV0KGZ1bmN0aW9uKGUpe3JldHVybiAxJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZi5jcmVhdGVFbGVtZW50KCJkaXYiKSl9KSx1dChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxjdCgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsZnVuY3Rpb24oZSxuLHIpe3JldHVybiByP3Q6ZS5nZXRBdHRyaWJ1dGUobiwidHlwZSI9PT1uLnRvTG93ZXJDYXNlKCk/MToyKX0pLHIuYXR0cmlidXRlcyYmdXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8aW5wdXQvPiIsZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8Y3QoInZhbHVlIixmdW5jdGlvbihlLG4scil7cmV0dXJuIHJ8fCJpbnB1dCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/dDplLmRlZmF1bHRWYWx1ZX0pLHV0KGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxjdChCLGZ1bmN0aW9uKGUsbixyKXt2YXIgaTtyZXR1cm4gcj90OihpPWUuZ2V0QXR0cmlidXRlTm9kZShuKSkmJmkuc3BlY2lmaWVkP2kudmFsdWU6ZVtuXT09PSEwP24udG9Mb3dlckNhc2UoKTpudWxsfSkseC5maW5kPWF0LHguZXhwcj1hdC5zZWxlY3RvcnMseC5leHByWyI6Il09eC5leHByLnBzZXVkb3MseC51bmlxdWU9YXQudW5pcXVlU29ydCx4LnRleHQ9YXQuZ2V0VGV4dCx4LmlzWE1MRG9jPWF0LmlzWE1MLHguY29udGFpbnM9YXQuY29udGFpbnN9KGUpO3ZhciBPPXt9O2Z1bmN0aW9uIEYoZSl7dmFyIHQ9T1tlXT17fTtyZXR1cm4geC5lYWNoKGUubWF0Y2goVCl8fFtdLGZ1bmN0aW9uKGUsbil7dFtuXT0hMH0pLHR9eC5DYWxsYmFja3M9ZnVuY3Rpb24oZSl7ZT0ic3RyaW5nIj09dHlwZW9mIGU/T1tlXXx8RihlKTp4LmV4dGVuZCh7fSxlKTt2YXIgbixyLGksbyxhLHMsbD1bXSx1PSFlLm9uY2UmJltdLGM9ZnVuY3Rpb24odCl7Zm9yKHI9ZS5tZW1vcnkmJnQsaT0hMCxhPXN8fDAscz0wLG89bC5sZW5ndGgsbj0hMDtsJiZvPmE7YSsrKWlmKGxbYV0uYXBwbHkodFswXSx0WzFdKT09PSExJiZlLnN0b3BPbkZhbHNlKXtyPSExO2JyZWFrfW49ITEsbCYmKHU/dS5sZW5ndGgmJmModS5zaGlmdCgpKTpyP2w9W106cC5kaXNhYmxlKCkpfSxwPXthZGQ6ZnVuY3Rpb24oKXtpZihsKXt2YXIgdD1sLmxlbmd0aDsoZnVuY3Rpb24gaSh0KXt4LmVhY2godCxmdW5jdGlvbih0LG4pe3ZhciByPXgudHlwZShuKTsiZnVuY3Rpb24iPT09cj9lLnVuaXF1ZSYmcC5oYXMobil8fGwucHVzaChuKTpuJiZuLmxlbmd0aCYmInN0cmluZyIhPT1yJiZpKG4pfSl9KShhcmd1bWVudHMpLG4/bz1sLmxlbmd0aDpyJiYocz10LGMocikpfXJldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gbCYmeC5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihlLHQpe3ZhciByO3doaWxlKChyPXguaW5BcnJheSh0LGwscikpPi0xKWwuc3BsaWNlKHIsMSksbiYmKG8+PXImJm8tLSxhPj1yJiZhLS0pfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiBlP3guaW5BcnJheShlLGwpPi0xOiEoIWx8fCFsLmxlbmd0aCl9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIGw9W10sbz0wLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gbD11PXI9dCx0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFsfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIHU9dCxyfHxwLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hdX0sZmlyZVdpdGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4hbHx8aSYmIXV8fCh0PXR8fFtdLHQ9W2UsdC5zbGljZT90LnNsaWNlKCk6dF0sbj91LnB1c2godCk6Yyh0KSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBwLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhaX19O3JldHVybiBwfSx4LmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9W1sicmVzb2x2ZSIsImRvbmUiLHguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIseC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIseC5DYWxsYmFja3MoIm1lbW9yeSIpXV0sbj0icGVuZGluZyIscj17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbn0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGkuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3JldHVybiB4LkRlZmVycmVkKGZ1bmN0aW9uKG4pe3guZWFjaCh0LGZ1bmN0aW9uKHQsbyl7dmFyIGE9b1swXSxzPXguaXNGdW5jdGlvbihlW3RdKSYmZVt0XTtpW29bMV1dKGZ1bmN0aW9uKCl7dmFyIGU9cyYmcy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSYmeC5pc0Z1bmN0aW9uKGUucHJvbWlzZSk/ZS5wcm9taXNlKCkuZG9uZShuLnJlc29sdmUpLmZhaWwobi5yZWplY3QpLnByb2dyZXNzKG4ubm90aWZ5KTpuW2ErIldpdGgiXSh0aGlzPT09cj9uLnByb21pc2UoKTp0aGlzLHM/W2VdOmFyZ3VtZW50cyl9KX0pLGU9bnVsbH0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT94LmV4dGVuZChlLHIpOnJ9fSxpPXt9O3JldHVybiByLnBpcGU9ci50aGVuLHguZWFjaCh0LGZ1bmN0aW9uKGUsbyl7dmFyIGE9b1syXSxzPW9bM107cltvWzFdXT1hLmFkZCxzJiZhLmFkZChmdW5jdGlvbigpe249c30sdFsxXmVdWzJdLmRpc2FibGUsdFsyXVsyXS5sb2NrKSxpW29bMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGlbb1swXSsiV2l0aCJdKHRoaXM9PT1pP3I6dGhpcyxhcmd1bWVudHMpLHRoaXN9LGlbb1swXSsiV2l0aCJdPWEuZmlyZVdpdGh9KSxyLnByb21pc2UoaSksZSYmZS5jYWxsKGksaSksaX0sd2hlbjpmdW5jdGlvbihlKXt2YXIgdD0wLG49Zy5jYWxsKGFyZ3VtZW50cykscj1uLmxlbmd0aCxpPTEhPT1yfHxlJiZ4LmlzRnVuY3Rpb24oZS5wcm9taXNlKT9yOjAsbz0xPT09aT9lOnguRGVmZXJyZWQoKSxhPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dFtlXT10aGlzLG5bZV09YXJndW1lbnRzLmxlbmd0aD4xP2cuY2FsbChhcmd1bWVudHMpOnIsbj09PXM/by5ub3RpZnlXaXRoKHQsbik6LS1pfHxvLnJlc29sdmVXaXRoKHQsbil9fSxzLGwsdTtpZihyPjEpZm9yKHM9QXJyYXkociksbD1BcnJheShyKSx1PUFycmF5KHIpO3I+dDt0Kyspblt0XSYmeC5pc0Z1bmN0aW9uKG5bdF0ucHJvbWlzZSk/blt0XS5wcm9taXNlKCkuZG9uZShhKHQsdSxuKSkuZmFpbChvLnJlamVjdCkucHJvZ3Jlc3MoYSh0LGwscykpOi0taTtyZXR1cm4gaXx8by5yZXNvbHZlV2l0aCh1LG4pLG8ucHJvbWlzZSgpfX0pLHguc3VwcG9ydD1mdW5jdGlvbih0KXt2YXIgbixyLG8scyxsLHUsYyxwLGYsZD1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKGQuc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IiksZC5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsbj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIil8fFtdLHI9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdLCFyfHwhci5zdHlsZXx8IW4ubGVuZ3RoKXJldHVybiB0O3M9YS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSx1PXMuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksbz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLHIuc3R5bGUuY3NzVGV4dD0idG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjUiLHQuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWQuY2xhc3NOYW1lLHQubGVhZGluZ1doaXRlc3BhY2U9Mz09PWQuZmlyc3RDaGlsZC5ub2RlVHlwZSx0LnRib2R5PSFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCx0Lmh0bWxTZXJpYWxpemU9ISFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLHQuc3R5bGU9L3RvcC8udGVzdChyLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksdC5ocmVmTm9ybWFsaXplZD0iL2EiPT09ci5nZXRBdHRyaWJ1dGUoImhyZWYiKSx0Lm9wYWNpdHk9L14wLjUvLnRlc3Qoci5zdHlsZS5vcGFjaXR5KSx0LmNzc0Zsb2F0PSEhci5zdHlsZS5jc3NGbG9hdCx0LmNoZWNrT249ISFvLnZhbHVlLHQub3B0U2VsZWN0ZWQ9dS5zZWxlY3RlZCx0LmVuY3R5cGU9ISFhLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLHQuaHRtbDVDbG9uZT0iPDpuYXY+PC86bmF2PiIhPT1hLmNyZWF0ZUVsZW1lbnQoIm5hdiIpLmNsb25lTm9kZSghMCkub3V0ZXJIVE1MLHQuaW5saW5lQmxvY2tOZWVkc0xheW91dD0hMSx0LnNocmlua1dyYXBCbG9ja3M9ITEsdC5waXhlbFBvc2l0aW9uPSExLHQuZGVsZXRlRXhwYW5kbz0hMCx0Lm5vQ2xvbmVFdmVudD0hMCx0LnJlbGlhYmxlTWFyZ2luUmlnaHQ9ITAsdC5ib3hTaXppbmdSZWxpYWJsZT0hMCxvLmNoZWNrZWQ9ITAsdC5ub0Nsb25lQ2hlY2tlZD1vLmNsb25lTm9kZSghMCkuY2hlY2tlZCxzLmRpc2FibGVkPSEwLHQub3B0RGlzYWJsZWQ9IXUuZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBkLnRlc3R9Y2F0Y2goaCl7dC5kZWxldGVFeHBhbmRvPSExfW89YS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLG8uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLHQuaW5wdXQ9IiI9PT1vLmdldEF0dHJpYnV0ZSgidmFsdWUiKSxvLnZhbHVlPSJ0IixvLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksdC5yYWRpb1ZhbHVlPSJ0Ij09PW8udmFsdWUsby5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJ0Iiksby5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksbD1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxsLmFwcGVuZENoaWxkKG8pLHQuYXBwZW5kQ2hlY2tlZD1vLmNoZWNrZWQsdC5jaGVja0Nsb25lPWwuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGQuYXR0YWNoRXZlbnQmJihkLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixmdW5jdGlvbigpe3Qubm9DbG9uZUV2ZW50PSExfSksZC5jbG9uZU5vZGUoITApLmNsaWNrKCkpO2ZvcihmIGlue3N1Ym1pdDohMCxjaGFuZ2U6ITAsZm9jdXNpbjohMH0pZC5zZXRBdHRyaWJ1dGUoYz0ib24iK2YsInQiKSx0W2YrIkJ1YmJsZXMiXT1jIGluIGV8fGQuYXR0cmlidXRlc1tjXS5leHBhbmRvPT09ITE7ZC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGQuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIix0LmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09ZC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcDtmb3IoZiBpbiB4KHQpKWJyZWFrO3JldHVybiB0Lm93bkxhc3Q9IjAiIT09Zix4KGZ1bmN0aW9uKCl7dmFyIG4scixvLHM9InBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDsiLGw9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdO2wmJihuPWEuY3JlYXRlRWxlbWVudCgiZGl2Iiksbi5zdHlsZS5jc3NUZXh0PSJib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6LTk5OTlweDttYXJnaW4tdG9wOjFweCIsbC5hcHBlbmRDaGlsZChuKS5hcHBlbmRDaGlsZChkKSxkLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIsbz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLG9bMF0uc3R5bGUuY3NzVGV4dD0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSIscD0wPT09b1swXS5vZmZzZXRIZWlnaHQsb1swXS5zdHlsZS5kaXNwbGF5PSIiLG9bMV0uc3R5bGUuZGlzcGxheT0ibm9uZSIsdC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9cCYmMD09PW9bMF0ub2Zmc2V0SGVpZ2h0LGQuaW5uZXJIVE1MPSIiLGQuc3R5bGUuY3NzVGV4dD0iYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94Oy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MXB4O2JvcmRlcjoxcHg7ZGlzcGxheTpibG9jazt3aWR0aDo0cHg7bWFyZ2luLXRvcDoxJTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MSU7Iix4LnN3YXAobCxudWxsIT1sLnN0eWxlLnpvb20/e3pvb206MX06e30sZnVuY3Rpb24oKXt0LmJveFNpemluZz00PT09ZC5vZmZzZXRXaWR0aH0pLGUuZ2V0Q29tcHV0ZWRTdHlsZSYmKHQucGl4ZWxQb3NpdGlvbj0iMSUiIT09KGUuZ2V0Q29tcHV0ZWRTdHlsZShkLG51bGwpfHx7fSkudG9wLHQuYm94U2l6aW5nUmVsaWFibGU9IjRweCI9PT0oZS5nZXRDb21wdXRlZFN0eWxlKGQsbnVsbCl8fHt3aWR0aDoiNHB4In0pLndpZHRoLHI9ZC5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxyLnN0eWxlLmNzc1RleHQ9ZC5zdHlsZS5jc3NUZXh0PXMsci5zdHlsZS5tYXJnaW5SaWdodD1yLnN0eWxlLndpZHRoPSIwIixkLnN0eWxlLndpZHRoPSIxcHgiLHQucmVsaWFibGVNYXJnaW5SaWdodD0hcGFyc2VGbG9hdCgoZS5nZXRDb21wdXRlZFN0eWxlKHIsbnVsbCl8fHt9KS5tYXJnaW5SaWdodCkpLHR5cGVvZiBkLnN0eWxlLnpvb20hPT1pJiYoZC5pbm5lckhUTUw9IiIsZC5zdHlsZS5jc3NUZXh0PXMrIndpZHRoOjFweDtwYWRkaW5nOjFweDtkaXNwbGF5OmlubGluZTt6b29tOjEiLHQuaW5saW5lQmxvY2tOZWVkc0xheW91dD0zPT09ZC5vZmZzZXRXaWR0aCxkLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixkLmlubmVySFRNTD0iPGRpdj48L2Rpdj4iLGQuZmlyc3RDaGlsZC5zdHlsZS53aWR0aD0iNXB4Iix0LnNocmlua1dyYXBCbG9ja3M9MyE9PWQub2Zmc2V0V2lkdGgsdC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0JiYobC5zdHlsZS56b29tPTEpKSxsLnJlbW92ZUNoaWxkKG4pLG49ZD1vPXI9bnVsbCl9KSxuPXM9bD11PXI9bz1udWxsLHQKfSh7fSk7dmFyIEI9Lyg/Olx7W1xzXFNdKlx9fFxbW1xzXFNdKlxdKSQvLFA9LyhbQS1aXSkvZztmdW5jdGlvbiBSKGUsbixyLGkpe2lmKHguYWNjZXB0RGF0YShlKSl7dmFyIG8sYSxzPXguZXhwYW5kbyxsPWUubm9kZVR5cGUsdT1sP3guY2FjaGU6ZSxjPWw/ZVtzXTplW3NdJiZzO2lmKGMmJnVbY10mJihpfHx1W2NdLmRhdGEpfHxyIT09dHx8InN0cmluZyIhPXR5cGVvZiBuKXJldHVybiBjfHwoYz1sP2Vbc109cC5wb3AoKXx8eC5ndWlkKys6cyksdVtjXXx8KHVbY109bD97fTp7dG9KU09OOngubm9vcH0pLCgib2JqZWN0Ij09dHlwZW9mIG58fCJmdW5jdGlvbiI9PXR5cGVvZiBuKSYmKGk/dVtjXT14LmV4dGVuZCh1W2NdLG4pOnVbY10uZGF0YT14LmV4dGVuZCh1W2NdLmRhdGEsbikpLGE9dVtjXSxpfHwoYS5kYXRhfHwoYS5kYXRhPXt9KSxhPWEuZGF0YSksciE9PXQmJihhW3guY2FtZWxDYXNlKG4pXT1yKSwic3RyaW5nIj09dHlwZW9mIG4/KG89YVtuXSxudWxsPT1vJiYobz1hW3guY2FtZWxDYXNlKG4pXSkpOm89YSxvfX1mdW5jdGlvbiBXKGUsdCxuKXtpZih4LmFjY2VwdERhdGEoZSkpe3ZhciByLGksbz1lLm5vZGVUeXBlLGE9bz94LmNhY2hlOmUscz1vP2VbeC5leHBhbmRvXTp4LmV4cGFuZG87aWYoYVtzXSl7aWYodCYmKHI9bj9hW3NdOmFbc10uZGF0YSkpe3guaXNBcnJheSh0KT90PXQuY29uY2F0KHgubWFwKHQseC5jYW1lbENhc2UpKTp0IGluIHI/dD1bdF06KHQ9eC5jYW1lbENhc2UodCksdD10IGluIHI/W3RdOnQuc3BsaXQoIiAiKSksaT10Lmxlbmd0aDt3aGlsZShpLS0pZGVsZXRlIHJbdFtpXV07aWYobj8hSShyKToheC5pc0VtcHR5T2JqZWN0KHIpKXJldHVybn0obnx8KGRlbGV0ZSBhW3NdLmRhdGEsSShhW3NdKSkpJiYobz94LmNsZWFuRGF0YShbZV0sITApOnguc3VwcG9ydC5kZWxldGVFeHBhbmRvfHxhIT1hLndpbmRvdz9kZWxldGUgYVtzXTphW3NdPW51bGwpfX19eC5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7YXBwbGV0OiEwLGVtYmVkOiEwLG9iamVjdDoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gZT1lLm5vZGVUeXBlP3guY2FjaGVbZVt4LmV4cGFuZG9dXTplW3guZXhwYW5kb10sISFlJiYhSShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFIoZSx0LG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFcoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBSKGUsdCxuLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gVyhlLHQsITApfSxhY2NlcHREYXRhOmZ1bmN0aW9uKGUpe2lmKGUubm9kZVR5cGUmJjEhPT1lLm5vZGVUeXBlJiY5IT09ZS5ub2RlVHlwZSlyZXR1cm4hMTt2YXIgdD1lLm5vZGVOYW1lJiZ4Lm5vRGF0YVtlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO3JldHVybiF0fHx0IT09ITAmJmUuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT10fX0pLHguZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGUsbil7dmFyIHIsaSxvPW51bGwsYT0wLHM9dGhpc1swXTtpZihlPT09dCl7aWYodGhpcy5sZW5ndGgmJihvPXguZGF0YShzKSwxPT09cy5ub2RlVHlwZSYmIXguX2RhdGEocywicGFyc2VkQXR0cnMiKSkpe2ZvcihyPXMuYXR0cmlidXRlcztyLmxlbmd0aD5hO2ErKylpPXJbYV0ubmFtZSwwPT09aS5pbmRleE9mKCJkYXRhLSIpJiYoaT14LmNhbWVsQ2FzZShpLnNsaWNlKDUpKSwkKHMsaSxvW2ldKSk7eC5fZGF0YShzLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBvfXJldHVybiJvYmplY3QiPT10eXBlb2YgZT90aGlzLmVhY2goZnVuY3Rpb24oKXt4LmRhdGEodGhpcyxlKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXt4LmRhdGEodGhpcyxlLG4pfSk6cz8kKHMsZSx4LmRhdGEocyxlKSk6bnVsbH0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5yZW1vdmVEYXRhKHRoaXMsZSl9KX19KTtmdW5jdGlvbiAkKGUsbixyKXtpZihyPT09dCYmMT09PWUubm9kZVR5cGUpe3ZhciBpPSJkYXRhLSIrbi5yZXBsYWNlKFAsIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYocj1lLmdldEF0dHJpYnV0ZShpKSwic3RyaW5nIj09dHlwZW9mIHIpe3RyeXtyPSJ0cnVlIj09PXI/ITA6ImZhbHNlIj09PXI/ITE6Im51bGwiPT09cj9udWxsOityKyIiPT09cj8rcjpCLnRlc3Qocik/eC5wYXJzZUpTT04ocik6cn1jYXRjaChvKXt9eC5kYXRhKGUsbixyKX1lbHNlIHI9dH1yZXR1cm4gcn1mdW5jdGlvbiBJKGUpe3ZhciB0O2Zvcih0IGluIGUpaWYoKCJkYXRhIiE9PXR8fCF4LmlzRW1wdHlPYmplY3QoZVt0XSkpJiYidG9KU09OIiE9PXQpcmV0dXJuITE7cmV0dXJuITB9eC5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsbixyKXt2YXIgaTtyZXR1cm4gZT8obj0obnx8ImZ4IikrInF1ZXVlIixpPXguX2RhdGEoZSxuKSxyJiYoIWl8fHguaXNBcnJheShyKT9pPXguX2RhdGEoZSxuLHgubWFrZUFycmF5KHIpKTppLnB1c2gocikpLGl8fFtdKTp0fSxkZXF1ZXVlOmZ1bmN0aW9uKGUsdCl7dD10fHwiZngiO3ZhciBuPXgucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89eC5fcXVldWVIb29rcyhlLHQpLGE9ZnVuY3Rpb24oKXt4LmRlcXVldWUoZSx0KX07ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGEsbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4geC5fZGF0YShlLG4pfHx4Ll9kYXRhKGUsbix7ZW1wdHk6eC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7eC5fcmVtb3ZlRGF0YShlLHQrInF1ZXVlIikseC5fcmVtb3ZlRGF0YShlLG4pfSl9KX19KSx4LmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSxuKXt2YXIgcj0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgZSYmKG49ZSxlPSJmeCIsci0tKSxyPmFyZ3VtZW50cy5sZW5ndGg/eC5xdWV1ZSh0aGlzWzBdLGUpOm49PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9eC5xdWV1ZSh0aGlzLGUsbik7eC5fcXVldWVIb29rcyh0aGlzLGUpLCJmeCI9PT1lJiYiaW5wcm9ncmVzcyIhPT10WzBdJiZ4LmRlcXVldWUodGhpcyxlKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt4LmRlcXVldWUodGhpcyxlKX0pfSxkZWxheTpmdW5jdGlvbihlLHQpe3JldHVybiBlPXguZng/eC5meC5zcGVlZHNbZV18fGU6ZSx0PXR8fCJmeCIsdGhpcy5xdWV1ZSh0LGZ1bmN0aW9uKHQsbil7dmFyIHI9c2V0VGltZW91dCh0LGUpO24uc3RvcD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChyKX19KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5xdWV1ZShlfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihlLG4pe3ZhciByLGk9MSxvPXguRGVmZXJyZWQoKSxhPXRoaXMscz10aGlzLmxlbmd0aCxsPWZ1bmN0aW9uKCl7LS1pfHxvLnJlc29sdmVXaXRoKGEsW2FdKX07InN0cmluZyIhPXR5cGVvZiBlJiYobj1lLGU9dCksZT1lfHwiZngiO3doaWxlKHMtLSlyPXguX2RhdGEoYVtzXSxlKyJxdWV1ZUhvb2tzIiksciYmci5lbXB0eSYmKGkrKyxyLmVtcHR5LmFkZChsKSk7cmV0dXJuIGwoKSxvLnByb21pc2Uobil9fSk7dmFyIHosWCxVPS9bXHRcclxuXGZdL2csVj0vXHIvZyxZPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmplY3QpJC9pLEo9L14oPzphfGFyZWEpJC9pLEc9L14oPzpjaGVja2VkfHNlbGVjdGVkKSQvaSxRPXguc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGUsSz14LnN1cHBvcnQuaW5wdXQ7eC5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5hY2Nlc3ModGhpcyx4LmF0dHIsZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3gucmVtb3ZlQXR0cih0aGlzLGUpfSl9LHByb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5hY2Nlc3ModGhpcyx4LnByb3AsZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9eC5wcm9wRml4W2VdfHxlLHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2VdPXQsZGVsZXRlIHRoaXNbZV19Y2F0Y2gobil7fX0pfSxhZGRDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGE9MCxzPXRoaXMubGVuZ3RoLGw9InN0cmluZyI9PXR5cGVvZiBlJiZlO2lmKHguaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3godGhpcykuYWRkQ2xhc3MoZS5jYWxsKHRoaXMsdCx0aGlzLmNsYXNzTmFtZSkpfSk7aWYobClmb3IodD0oZXx8IiIpLm1hdGNoKFQpfHxbXTtzPmE7YSsrKWlmKG49dGhpc1thXSxyPTE9PT1uLm5vZGVUeXBlJiYobi5jbGFzc05hbWU/KCIgIituLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoVSwiICIpOiIgIikpe289MDt3aGlsZShpPXRbbysrXSkwPnIuaW5kZXhPZigiICIraSsiICIpJiYocis9aSsiICIpO24uY2xhc3NOYW1lPXgudHJpbShyKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhPTAscz10aGlzLmxlbmd0aCxsPTA9PT1hcmd1bWVudHMubGVuZ3RofHwic3RyaW5nIj09dHlwZW9mIGUmJmU7aWYoeC5pc0Z1bmN0aW9uKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7eCh0aGlzKS5yZW1vdmVDbGFzcyhlLmNhbGwodGhpcyx0LHRoaXMuY2xhc3NOYW1lKSl9KTtpZihsKWZvcih0PShlfHwiIikubWF0Y2goVCl8fFtdO3M+YTthKyspaWYobj10aGlzW2FdLHI9MT09PW4ubm9kZVR5cGUmJihuLmNsYXNzTmFtZT8oIiAiK24uY2xhc3NOYW1lKyIgIikucmVwbGFjZShVLCIgIik6IiIpKXtvPTA7d2hpbGUoaT10W28rK10pd2hpbGUoci5pbmRleE9mKCIgIitpKyIgIik+PTApcj1yLnJlcGxhY2UoIiAiK2krIiAiLCIgIik7bi5jbGFzc05hbWU9ZT94LnRyaW0ocik6IiJ9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIGU7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdCYmInN0cmluZyI9PT1uP3Q/dGhpcy5hZGRDbGFzcyhlKTp0aGlzLnJlbW92ZUNsYXNzKGUpOnguaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24obil7eCh0aGlzKS50b2dnbGVDbGFzcyhlLmNhbGwodGhpcyxuLHRoaXMuY2xhc3NOYW1lLHQpLHQpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1uKXt2YXIgdCxyPTAsbz14KHRoaXMpLGE9ZS5tYXRjaChUKXx8W107d2hpbGUodD1hW3IrK10pby5oYXNDbGFzcyh0KT9vLnJlbW92ZUNsYXNzKHQpOm8uYWRkQ2xhc3ModCl9ZWxzZShuPT09aXx8ImJvb2xlYW4iPT09bikmJih0aGlzLmNsYXNzTmFtZSYmeC5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGU9PT0hMT8iIjp4Ll9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0PSIgIitlKyIgIixuPTAscj10aGlzLmxlbmd0aDtmb3IoO3I+bjtuKyspaWYoMT09PXRoaXNbbl0ubm9kZVR5cGUmJigiICIrdGhpc1tuXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKFUsIiAiKS5pbmRleE9mKHQpPj0wKXJldHVybiEwO3JldHVybiExfSx2YWw6ZnVuY3Rpb24oZSl7dmFyIG4scixpLG89dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gaT14LmlzRnVuY3Rpb24oZSksdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciBvOzE9PT10aGlzLm5vZGVUeXBlJiYobz1pP2UuY2FsbCh0aGlzLG4seCh0aGlzKS52YWwoKSk6ZSxudWxsPT1vP289IiI6Im51bWJlciI9PXR5cGVvZiBvP28rPSIiOnguaXNBcnJheShvKSYmKG89eC5tYXAobyxmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplKyIifSkpLHI9eC52YWxIb29rc1t0aGlzLnR5cGVdfHx4LnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sciYmInNldCJpbiByJiZyLnNldCh0aGlzLG8sInZhbHVlIikhPT10fHwodGhpcy52YWx1ZT1vKSl9KTtpZihvKXJldHVybiByPXgudmFsSG9va3Nbby50eXBlXXx8eC52YWxIb29rc1tvLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLHImJiJnZXQiaW4gciYmKG49ci5nZXQobywidmFsdWUiKSkhPT10P246KG49by52YWx1ZSwic3RyaW5nIj09dHlwZW9mIG4/bi5yZXBsYWNlKFYsIiIpOm51bGw9PW4/IiI6bil9fX0pLHguZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9eC5maW5kLmF0dHIoZSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9dD90OmUudGV4dH19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lLm9wdGlvbnMsaT1lLnNlbGVjdGVkSW5kZXgsbz0ic2VsZWN0LW9uZSI9PT1lLnR5cGV8fDA+aSxhPW8/bnVsbDpbXSxzPW8/aSsxOnIubGVuZ3RoLGw9MD5pP3M6bz9pOjA7Zm9yKDtzPmw7bCsrKWlmKG49cltsXSwhKCFuLnNlbGVjdGVkJiZsIT09aXx8KHguc3VwcG9ydC5vcHREaXNhYmxlZD9uLmRpc2FibGVkOm51bGwhPT1uLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSl8fG4ucGFyZW50Tm9kZS5kaXNhYmxlZCYmeC5ub2RlTmFtZShuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZih0PXgobikudmFsKCksbylyZXR1cm4gdDthLnB1c2godCl9cmV0dXJuIGF9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLm9wdGlvbnMsbz14Lm1ha2VBcnJheSh0KSxhPWkubGVuZ3RoO3doaWxlKGEtLSlyPWlbYV0sKHIuc2VsZWN0ZWQ9eC5pbkFycmF5KHgocikudmFsKCksbyk+PTApJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX0sYXR0cjpmdW5jdGlvbihlLG4scil7dmFyIG8sYSxzPWUubm9kZVR5cGU7aWYoZSYmMyE9PXMmJjghPT1zJiYyIT09cylyZXR1cm4gdHlwZW9mIGUuZ2V0QXR0cmlidXRlPT09aT94LnByb3AoZSxuLHIpOigxPT09cyYmeC5pc1hNTERvYyhlKXx8KG49bi50b0xvd2VyQ2FzZSgpLG89eC5hdHRySG9va3Nbbl18fCh4LmV4cHIubWF0Y2guYm9vbC50ZXN0KG4pP1g6eikpLHI9PT10P28mJiJnZXQiaW4gbyYmbnVsbCE9PShhPW8uZ2V0KGUsbikpP2E6KGE9eC5maW5kLmF0dHIoZSxuKSxudWxsPT1hP3Q6YSk6bnVsbCE9PXI/byYmInNldCJpbiBvJiYoYT1vLnNldChlLHIsbikpIT09dD9hOihlLnNldEF0dHJpYnV0ZShuLHIrIiIpLHIpOih4LnJlbW92ZUF0dHIoZSxuKSx0KSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9MCxvPXQmJnQubWF0Y2goVCk7aWYobyYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1vW2krK10pcj14LnByb3BGaXhbbl18fG4seC5leHByLm1hdGNoLmJvb2wudGVzdChuKT9LJiZRfHwhRy50ZXN0KG4pP2Vbcl09ITE6ZVt4LmNhbWVsQ2FzZSgiZGVmYXVsdC0iK24pXT1lW3JdPSExOnguYXR0cihlLG4sIiIpLGUucmVtb3ZlQXR0cmlidXRlKFE/bjpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZigheC5zdXBwb3J0LnJhZGlvVmFsdWUmJiJyYWRpbyI9PT10JiZ4Lm5vZGVOYW1lKGUsImlucHV0Iikpe3ZhciBuPWUudmFsdWU7cmV0dXJuIGUuc2V0QXR0cmlidXRlKCJ0eXBlIix0KSxuJiYoZS52YWx1ZT1uKSx0fX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn0scHJvcDpmdW5jdGlvbihlLG4scil7dmFyIGksbyxhLHM9ZS5ub2RlVHlwZTtpZihlJiYzIT09cyYmOCE9PXMmJjIhPT1zKXJldHVybiBhPTEhPT1zfHwheC5pc1hNTERvYyhlKSxhJiYobj14LnByb3BGaXhbbl18fG4sbz14LnByb3BIb29rc1tuXSksciE9PXQ/byYmInNldCJpbiBvJiYoaT1vLnNldChlLHIsbikpIT09dD9pOmVbbl09cjpvJiYiZ2V0ImluIG8mJm51bGwhPT0oaT1vLmdldChlLG4pKT9pOmVbbl19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXt2YXIgdD14LmZpbmQuYXR0cihlLCJ0YWJpbmRleCIpO3JldHVybiB0P3BhcnNlSW50KHQsMTApOlkudGVzdChlLm5vZGVOYW1lKXx8Si50ZXN0KGUubm9kZU5hbWUpJiZlLmhyZWY/MDotMX19fX0pLFg9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ9PT0hMT94LnJlbW92ZUF0dHIoZSxuKTpLJiZRfHwhRy50ZXN0KG4pP2Uuc2V0QXR0cmlidXRlKCFRJiZ4LnByb3BGaXhbbl18fG4sbik6ZVt4LmNhbWVsQ2FzZSgiZGVmYXVsdC0iK24pXT1lW25dPSEwLG59fSx4LmVhY2goeC5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24oZSxuKXt2YXIgcj14LmV4cHIuYXR0ckhhbmRsZVtuXXx8eC5maW5kLmF0dHI7eC5leHByLmF0dHJIYW5kbGVbbl09SyYmUXx8IUcudGVzdChuKT9mdW5jdGlvbihlLG4saSl7dmFyIG89eC5leHByLmF0dHJIYW5kbGVbbl0sYT1pP3Q6KHguZXhwci5hdHRySGFuZGxlW25dPXQpIT1yKGUsbixpKT9uLnRvTG93ZXJDYXNlKCk6bnVsbDtyZXR1cm4geC5leHByLmF0dHJIYW5kbGVbbl09byxhfTpmdW5jdGlvbihlLG4scil7cmV0dXJuIHI/dDplW3guY2FtZWxDYXNlKCJkZWZhdWx0LSIrbildP24udG9Mb3dlckNhc2UoKTpudWxsfX0pLEsmJlF8fCh4LmF0dHJIb29rcy52YWx1ZT17c2V0OmZ1bmN0aW9uKGUsbixyKXtyZXR1cm4geC5ub2RlTmFtZShlLCJpbnB1dCIpPyhlLmRlZmF1bHRWYWx1ZT1uLHQpOnomJnouc2V0KGUsbixyKX19KSxRfHwoej17c2V0OmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1lLmdldEF0dHJpYnV0ZU5vZGUocik7cmV0dXJuIGl8fGUuc2V0QXR0cmlidXRlTm9kZShpPWUub3duZXJEb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUocikpLGkudmFsdWU9bis9IiIsInZhbHVlIj09PXJ8fG49PT1lLmdldEF0dHJpYnV0ZShyKT9uOnR9fSx4LmV4cHIuYXR0ckhhbmRsZS5pZD14LmV4cHIuYXR0ckhhbmRsZS5uYW1lPXguZXhwci5hdHRySGFuZGxlLmNvb3Jkcz1mdW5jdGlvbihlLG4scil7dmFyIGk7cmV0dXJuIHI/dDooaT1lLmdldEF0dHJpYnV0ZU5vZGUobikpJiYiIiE9PWkudmFsdWU/aS52YWx1ZTpudWxsfSx4LnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKG4pO3JldHVybiByJiZyLnNwZWNpZmllZD9yLnZhbHVlOnR9LHNldDp6LnNldH0seC5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ouc2V0KGUsIiI9PT10PyExOnQsbil9fSx4LmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGUsbil7eC5hdHRySG9va3Nbbl09e3NldDpmdW5jdGlvbihlLHIpe3JldHVybiIiPT09cj8oZS5zZXRBdHRyaWJ1dGUobiwiYXV0byIpLHIpOnR9fX0pKSx4LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fHguZWFjaChbImhyZWYiLCJzcmMiXSxmdW5jdGlvbihlLHQpe3gucHJvcEhvb2tzW3RdPXtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQsNCl9fX0pLHguc3VwcG9ydC5zdHlsZXx8KHguYXR0ckhvb2tzLnN0eWxlPXtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3R5bGUuY3NzVGV4dHx8dH0sc2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuc3R5bGUuY3NzVGV4dD10KyIifX0pLHguc3VwcG9ydC5vcHRTZWxlY3RlZHx8KHgucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpLG51bGx9fSkseC5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXt4LnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSkseC5zdXBwb3J0LmVuY3R5cGV8fCh4LnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKSx4LmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXt4LnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSxuKXtyZXR1cm4geC5pc0FycmF5KG4pP2UuY2hlY2tlZD14LmluQXJyYXkoeChlKS52YWwoKSxuKT49MDp0fX0seC5zdXBwb3J0LmNoZWNrT258fCh4LnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSk7dmFyIFo9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWEpJC9pLGV0PS9ea2V5Lyx0dD0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sbnQ9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLHJ0PS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gaXQoKXtyZXR1cm4hMH1mdW5jdGlvbiBvdCgpe3JldHVybiExfWZ1bmN0aW9uIGF0KCl7dHJ5e3JldHVybiBhLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX14LmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGUsbixyLG8sYSl7dmFyIHMsbCx1LGMscCxmLGQsaCxnLG0seSx2PXguX2RhdGEoZSk7aWYodil7ci5oYW5kbGVyJiYoYz1yLHI9Yy5oYW5kbGVyLGE9Yy5zZWxlY3Rvciksci5ndWlkfHwoci5ndWlkPXguZ3VpZCsrKSwobD12LmV2ZW50cyl8fChsPXYuZXZlbnRzPXt9KSwoZj12LmhhbmRsZSl8fChmPXYuaGFuZGxlPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgeD09PWl8fGUmJnguZXZlbnQudHJpZ2dlcmVkPT09ZS50eXBlP3Q6eC5ldmVudC5kaXNwYXRjaC5hcHBseShmLmVsZW0sYXJndW1lbnRzKX0sZi5lbGVtPWUpLG49KG58fCIiKS5tYXRjaChUKXx8WyIiXSx1PW4ubGVuZ3RoO3doaWxlKHUtLSlzPXJ0LmV4ZWMoblt1XSl8fFtdLGc9eT1zWzFdLG09KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxnJiYocD14LmV2ZW50LnNwZWNpYWxbZ118fHt9LGc9KGE/cC5kZWxlZ2F0ZVR5cGU6cC5iaW5kVHlwZSl8fGcscD14LmV2ZW50LnNwZWNpYWxbZ118fHt9LGQ9eC5leHRlbmQoe3R5cGU6ZyxvcmlnVHlwZTp5LGRhdGE6byxoYW5kbGVyOnIsZ3VpZDpyLmd1aWQsc2VsZWN0b3I6YSxuZWVkc0NvbnRleHQ6YSYmeC5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGEpLG5hbWVzcGFjZTptLmpvaW4oIi4iKX0sYyksKGg9bFtnXSl8fChoPWxbZ109W10saC5kZWxlZ2F0ZUNvdW50PTAscC5zZXR1cCYmcC5zZXR1cC5jYWxsKGUsbyxtLGYpIT09ITF8fChlLmFkZEV2ZW50TGlzdGVuZXI/ZS5hZGRFdmVudExpc3RlbmVyKGcsZiwhMSk6ZS5hdHRhY2hFdmVudCYmZS5hdHRhY2hFdmVudCgib24iK2csZikpKSxwLmFkZCYmKHAuYWRkLmNhbGwoZSxkKSxkLmhhbmRsZXIuZ3VpZHx8KGQuaGFuZGxlci5ndWlkPXIuZ3VpZCkpLGE/aC5zcGxpY2UoaC5kZWxlZ2F0ZUNvdW50KyssMCxkKTpoLnB1c2goZCkseC5ldmVudC5nbG9iYWxbZ109ITApO2U9bnVsbH19LHJlbW92ZTpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyxsLHUsYyxwLGYsZCxoLGcsbT14Lmhhc0RhdGEoZSkmJnguX2RhdGEoZSk7aWYobSYmKGM9bS5ldmVudHMpKXt0PSh0fHwiIikubWF0Y2goVCl8fFsiIl0sdT10Lmxlbmd0aDt3aGlsZSh1LS0paWYocz1ydC5leGVjKHRbdV0pfHxbXSxkPWc9c1sxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCl7cD14LmV2ZW50LnNwZWNpYWxbZF18fHt9LGQ9KHI/cC5kZWxlZ2F0ZVR5cGU6cC5iaW5kVHlwZSl8fGQsZj1jW2RdfHxbXSxzPXNbMl0mJlJlZ0V4cCgiKF58XFwuKSIraC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxsPW89Zi5sZW5ndGg7d2hpbGUoby0tKWE9ZltvXSwhaSYmZyE9PWEub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWEuZ3VpZHx8cyYmIXMudGVzdChhLm5hbWVzcGFjZSl8fHImJnIhPT1hLnNlbGVjdG9yJiYoIioqIiE9PXJ8fCFhLnNlbGVjdG9yKXx8KGYuc3BsaWNlKG8sMSksYS5zZWxlY3RvciYmZi5kZWxlZ2F0ZUNvdW50LS0scC5yZW1vdmUmJnAucmVtb3ZlLmNhbGwoZSxhKSk7bCYmIWYubGVuZ3RoJiYocC50ZWFyZG93biYmcC50ZWFyZG93bi5jYWxsKGUsaCxtLmhhbmRsZSkhPT0hMXx8eC5yZW1vdmVFdmVudChlLGQsbS5oYW5kbGUpLGRlbGV0ZSBjW2RdKX1lbHNlIGZvcihkIGluIGMpeC5ldmVudC5yZW1vdmUoZSxkK3RbdV0sbixyLCEwKTt4LmlzRW1wdHlPYmplY3QoYykmJihkZWxldGUgbS5oYW5kbGUseC5fcmVtb3ZlRGF0YShlLCJldmVudHMiKSl9fSx0cmlnZ2VyOmZ1bmN0aW9uKG4scixpLG8pe3ZhciBzLGwsdSxjLHAsZixkLGg9W2l8fGFdLGc9di5jYWxsKG4sInR5cGUiKT9uLnR5cGU6bixtPXYuY2FsbChuLCJuYW1lc3BhY2UiKT9uLm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKHU9Zj1pPWl8fGEsMyE9PWkubm9kZVR5cGUmJjghPT1pLm5vZGVUeXBlJiYhbnQudGVzdChnK3guZXZlbnQudHJpZ2dlcmVkKSYmKGcuaW5kZXhPZigiLiIpPj0wJiYobT1nLnNwbGl0KCIuIiksZz1tLnNoaWZ0KCksbS5zb3J0KCkpLGw9MD5nLmluZGV4T2YoIjoiKSYmIm9uIitnLG49blt4LmV4cGFuZG9dP246bmV3IHguRXZlbnQoZywib2JqZWN0Ij09dHlwZW9mIG4mJm4pLG4uaXNUcmlnZ2VyPW8/MjozLG4ubmFtZXNwYWNlPW0uam9pbigiLiIpLG4ubmFtZXNwYWNlX3JlPW4ubmFtZXNwYWNlP1JlZ0V4cCgiKF58XFwuKSIrbS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLG4ucmVzdWx0PXQsbi50YXJnZXR8fChuLnRhcmdldD1pKSxyPW51bGw9PXI/W25dOngubWFrZUFycmF5KHIsW25dKSxwPXguZXZlbnQuc3BlY2lhbFtnXXx8e30sb3x8IXAudHJpZ2dlcnx8cC50cmlnZ2VyLmFwcGx5KGkscikhPT0hMSkpe2lmKCFvJiYhcC5ub0J1YmJsZSYmIXguaXNXaW5kb3coaSkpe2ZvcihjPXAuZGVsZWdhdGVUeXBlfHxnLG50LnRlc3QoYytnKXx8KHU9dS5wYXJlbnROb2RlKTt1O3U9dS5wYXJlbnROb2RlKWgucHVzaCh1KSxmPXU7Zj09PShpLm93bmVyRG9jdW1lbnR8fGEpJiZoLnB1c2goZi5kZWZhdWx0Vmlld3x8Zi5wYXJlbnRXaW5kb3d8fGUpfWQ9MDt3aGlsZSgodT1oW2QrK10pJiYhbi5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKW4udHlwZT1kPjE/YzpwLmJpbmRUeXBlfHxnLHM9KHguX2RhdGEodSwiZXZlbnRzIil8fHt9KVtuLnR5cGVdJiZ4Ll9kYXRhKHUsImhhbmRsZSIpLHMmJnMuYXBwbHkodSxyKSxzPWwmJnVbbF0scyYmeC5hY2NlcHREYXRhKHUpJiZzLmFwcGx5JiZzLmFwcGx5KHUscik9PT0hMSYmbi5wcmV2ZW50RGVmYXVsdCgpO2lmKG4udHlwZT1nLCFvJiYhbi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKCFwLl9kZWZhdWx0fHxwLl9kZWZhdWx0LmFwcGx5KGgucG9wKCkscik9PT0hMSkmJnguYWNjZXB0RGF0YShpKSYmbCYmaVtnXSYmIXguaXNXaW5kb3coaSkpe2Y9aVtsXSxmJiYoaVtsXT1udWxsKSx4LmV2ZW50LnRyaWdnZXJlZD1nO3RyeXtpW2ddKCl9Y2F0Y2goeSl7fXguZXZlbnQudHJpZ2dlcmVkPXQsZiYmKGlbbF09Zil9cmV0dXJuIG4ucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7ZT14LmV2ZW50LmZpeChlKTt2YXIgbixyLGksbyxhLHM9W10sbD1nLmNhbGwoYXJndW1lbnRzKSx1PSh4Ll9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbZS50eXBlXXx8W10sYz14LmV2ZW50LnNwZWNpYWxbZS50eXBlXXx8e307aWYobFswXT1lLGUuZGVsZWdhdGVUYXJnZXQ9dGhpcywhYy5wcmVEaXNwYXRjaHx8Yy5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsZSkhPT0hMSl7cz14LmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxlLHUpLG49MDt3aGlsZSgobz1zW24rK10pJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXtlLmN1cnJlbnRUYXJnZXQ9by5lbGVtLGE9MDt3aGlsZSgoaT1vLmhhbmRsZXJzW2ErK10pJiYhZS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghZS5uYW1lc3BhY2VfcmV8fGUubmFtZXNwYWNlX3JlLnRlc3QoaS5uYW1lc3BhY2UpKSYmKGUuaGFuZGxlT2JqPWksZS5kYXRhPWkuZGF0YSxyPSgoeC5ldmVudC5zcGVjaWFsW2kub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxpLmhhbmRsZXIpLmFwcGx5KG8uZWxlbSxsKSxyIT09dCYmKGUucmVzdWx0PXIpPT09ITEmJihlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBjLnBvc3REaXNwYXRjaCYmYy5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGUpLGUucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oZSxuKXt2YXIgcixpLG8sYSxzPVtdLGw9bi5kZWxlZ2F0ZUNvdW50LHU9ZS50YXJnZXQ7aWYobCYmdS5ub2RlVHlwZSYmKCFlLmJ1dHRvbnx8ImNsaWNrIiE9PWUudHlwZSkpZm9yKDt1IT10aGlzO3U9dS5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT11Lm5vZGVUeXBlJiYodS5kaXNhYmxlZCE9PSEwfHwiY2xpY2siIT09ZS50eXBlKSl7Zm9yKG89W10sYT0wO2w+YTthKyspaT1uW2FdLHI9aS5zZWxlY3RvcisiICIsb1tyXT09PXQmJihvW3JdPWkubmVlZHNDb250ZXh0P3gocix0aGlzKS5pbmRleCh1KT49MDp4LmZpbmQocix0aGlzLG51bGwsW3VdKS5sZW5ndGgpLG9bcl0mJm8ucHVzaChpKTtvLmxlbmd0aCYmcy5wdXNoKHtlbGVtOnUsaGFuZGxlcnM6b30pfXJldHVybiBuLmxlbmd0aD5sJiZzLnB1c2goe2VsZW06dGhpcyxoYW5kbGVyczpuLnNsaWNlKGwpfSksc30sZml4OmZ1bmN0aW9uKGUpe2lmKGVbeC5leHBhbmRvXSlyZXR1cm4gZTt2YXIgdCxuLHIsaT1lLnR5cGUsbz1lLHM9dGhpcy5maXhIb29rc1tpXTtzfHwodGhpcy5maXhIb29rc1tpXT1zPXR0LnRlc3QoaSk/dGhpcy5tb3VzZUhvb2tzOmV0LnRlc3QoaSk/dGhpcy5rZXlIb29rczp7fSkscj1zLnByb3BzP3RoaXMucHJvcHMuY29uY2F0KHMucHJvcHMpOnRoaXMucHJvcHMsZT1uZXcgeC5FdmVudChvKSx0PXIubGVuZ3RoO3doaWxlKHQtLSluPXJbdF0sZVtuXT1vW25dO3JldHVybiBlLnRhcmdldHx8KGUudGFyZ2V0PW8uc3JjRWxlbWVudHx8YSksMz09PWUudGFyZ2V0Lm5vZGVUeXBlJiYoZS50YXJnZXQ9ZS50YXJnZXQucGFyZW50Tm9kZSksZS5tZXRhS2V5PSEhZS5tZXRhS2V5LHMuZmlsdGVyP3MuZmlsdGVyKGUsbyk6ZX0scHJvcHM6ImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWUud2hpY2gmJihlLndoaWNoPW51bGwhPXQuY2hhckNvZGU/dC5jaGFyQ29kZTp0LmtleUNvZGUpLGV9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihlLG4pe3ZhciByLGksbyxzPW4uYnV0dG9uLGw9bi5mcm9tRWxlbWVudDtyZXR1cm4gbnVsbD09ZS5wYWdlWCYmbnVsbCE9bi5jbGllbnRYJiYoaT1lLnRhcmdldC5vd25lckRvY3VtZW50fHxhLG89aS5kb2N1bWVudEVsZW1lbnQscj1pLmJvZHksZS5wYWdlWD1uLmNsaWVudFgrKG8mJm8uc2Nyb2xsTGVmdHx8ciYmci5zY3JvbGxMZWZ0fHwwKS0obyYmby5jbGllbnRMZWZ0fHxyJiZyLmNsaWVudExlZnR8fDApLGUucGFnZVk9bi5jbGllbnRZKyhvJiZvLnNjcm9sbFRvcHx8ciYmci5zY3JvbGxUb3B8fDApLShvJiZvLmNsaWVudFRvcHx8ciYmci5jbGllbnRUb3B8fDApKSwhZS5yZWxhdGVkVGFyZ2V0JiZsJiYoZS5yZWxhdGVkVGFyZ2V0PWw9PT1lLnRhcmdldD9uLnRvRWxlbWVudDpsKSxlLndoaWNofHxzPT09dHx8KGUud2hpY2g9MSZzPzE6MiZzPzM6NCZzPzI6MCksZX19LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXMhPT1hdCgpJiZ0aGlzLmZvY3VzKXRyeXtyZXR1cm4gdGhpcy5mb2N1cygpLCExfWNhdGNoKGUpe319LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz09PWF0KCkmJnRoaXMuYmx1cj8odGhpcy5ibHVyKCksITEpOnR9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiB4Lm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dH0sX2RlZmF1bHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHgubm9kZU5hbWUoZS50YXJnZXQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe2UucmVzdWx0IT09dCYmKGUub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1lLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9eC5leHRlbmQobmV3IHguRXZlbnQsbix7dHlwZTplLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtyP3guZXZlbnQudHJpZ2dlcihpLG51bGwsdCk6eC5ldmVudC5kaXNwYXRjaC5jYWxsKHQsaSksaS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmbi5wcmV2ZW50RGVmYXVsdCgpfX0seC5yZW1vdmVFdmVudD1hLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMSl9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0ib24iK3Q7ZS5kZXRhY2hFdmVudCYmKHR5cGVvZiBlW3JdPT09aSYmKGVbcl09bnVsbCksZS5kZXRhY2hFdmVudChyLG4pKX0seC5FdmVudD1mdW5jdGlvbihlLG4pe3JldHVybiB0aGlzIGluc3RhbmNlb2YgeC5FdmVudD8oZSYmZS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9ZSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWUuZGVmYXVsdFByZXZlbnRlZHx8ZS5yZXR1cm5WYWx1ZT09PSExfHxlLmdldFByZXZlbnREZWZhdWx0JiZlLmdldFByZXZlbnREZWZhdWx0KCk/aXQ6b3QpOnRoaXMudHlwZT1lLG4mJnguZXh0ZW5kKHRoaXMsbiksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fHgubm93KCksdGhpc1t4LmV4cGFuZG9dPSEwLHQpOm5ldyB4LkV2ZW50KGUsbil9LHguRXZlbnQucHJvdG90eXBlPXtpc0RlZmF1bHRQcmV2ZW50ZWQ6b3QsaXNQcm9wYWdhdGlvblN0b3BwZWQ6b3QsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6b3QscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9aXQsZSYmKGUucHJldmVudERlZmF1bHQ/ZS5wcmV2ZW50RGVmYXVsdCgpOmUucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1pdCxlJiYoZS5zdG9wUHJvcGFnYXRpb24mJmUuc3RvcFByb3BhZ2F0aW9uKCksZS5jYW5jZWxCdWJibGU9ITApfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPWl0LHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSx4LmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihlLHQpe3guZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOnQsYmluZFR5cGU6dCxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzLGk9ZS5yZWxhdGVkVGFyZ2V0LG89ZS5oYW5kbGVPYmo7cmV0dXJuKCFpfHxpIT09ciYmIXguY29udGFpbnMocixpKSkmJihlLnR5cGU9by5vcmlnVHlwZSxuPW8uaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS50eXBlPXQpLG59fX0pLHguc3VwcG9ydC5zdWJtaXRCdWJibGVzfHwoeC5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4geC5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6KHguZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oZSl7dmFyIG49ZS50YXJnZXQscj14Lm5vZGVOYW1lKG4sImlucHV0Iil8fHgubm9kZU5hbWUobiwiYnV0dG9uIik/bi5mb3JtOnQ7ciYmIXguX2RhdGEociwic3VibWl0QnViYmxlcyIpJiYoeC5ldmVudC5hZGQociwic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGUpe2UuX3N1Ym1pdF9idWJibGU9ITB9KSx4Ll9kYXRhKHIsInN1Ym1pdEJ1YmJsZXMiLCEwKSl9KSx0KX0scG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe2UuX3N1Ym1pdF9idWJibGUmJihkZWxldGUgZS5fc3VibWl0X2J1YmJsZSx0aGlzLnBhcmVudE5vZGUmJiFlLmlzVHJpZ2dlciYmeC5ldmVudC5zaW11bGF0ZSgic3VibWl0Iix0aGlzLnBhcmVudE5vZGUsZSwhMCkpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiB4Lm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTooeC5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKSx0KX19KSx4LnN1cHBvcnQuY2hhbmdlQnViYmxlc3x8KHguZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIFoudGVzdCh0aGlzLm5vZGVOYW1lKT8oKCJjaGVja2JveCI9PT10aGlzLnR5cGV8fCJyYWRpbyI9PT10aGlzLnR5cGUpJiYoeC5ldmVudC5hZGQodGhpcywicHJvcGVydHljaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oZSl7ImNoZWNrZWQiPT09ZS5vcmlnaW5hbEV2ZW50LnByb3BlcnR5TmFtZSYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMCl9KSx4LmV2ZW50LmFkZCh0aGlzLCJjbGljay5fY2hhbmdlIixmdW5jdGlvbihlKXt0aGlzLl9qdXN0X2NoYW5nZWQmJiFlLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMSkseC5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLGUsITApfSkpLCExKTooeC5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7Wi50ZXN0KHQubm9kZU5hbWUpJiYheC5fZGF0YSh0LCJjaGFuZ2VCdWJibGVzIikmJih4LmV2ZW50LmFkZCh0LCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oZSl7IXRoaXMucGFyZW50Tm9kZXx8ZS5pc1NpbXVsYXRlZHx8ZS5pc1RyaWdnZXJ8fHguZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGUsITApfSkseC5fZGF0YSh0LCJjaGFuZ2VCdWJibGVzIiwhMCkpfSksdCl9LGhhbmRsZTpmdW5jdGlvbihlKXt2YXIgbj1lLnRhcmdldDtyZXR1cm4gdGhpcyE9PW58fGUuaXNTaW11bGF0ZWR8fGUuaXNUcmlnZ2VyfHwicmFkaW8iIT09bi50eXBlJiYiY2hlY2tib3giIT09bi50eXBlP2UuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOnR9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIHguZXZlbnQucmVtb3ZlKHRoaXMsIi5fY2hhbmdlIiksIVoudGVzdCh0aGlzLm5vZGVOYW1lKX19KSx4LnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXN8fHguZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj0wLHI9ZnVuY3Rpb24oZSl7eC5ldmVudC5zaW11bGF0ZSh0LGUudGFyZ2V0LHguZXZlbnQuZml4KGUpLCEwKX07eC5ldmVudC5zcGVjaWFsW3RdPXtzZXR1cDpmdW5jdGlvbigpezA9PT1uKysmJmEuYWRkRXZlbnRMaXN0ZW5lcihlLHIsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpezA9PT0tLW4mJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHIsITApfX19KSx4LmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oZSxuLHIsaSxvKXt2YXIgYSxzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7InN0cmluZyIhPXR5cGVvZiBuJiYocj1yfHxuLG49dCk7Zm9yKGEgaW4gZSl0aGlzLm9uKGEsbixyLGVbYV0sbyk7cmV0dXJuIHRoaXN9aWYobnVsbD09ciYmbnVsbD09aT8oaT1uLHI9bj10KTpudWxsPT1pJiYoInN0cmluZyI9PXR5cGVvZiBuPyhpPXIscj10KTooaT1yLHI9bixuPXQpKSxpPT09ITEpaT1vdDtlbHNlIGlmKCFpKXJldHVybiB0aGlzO3JldHVybiAxPT09byYmKHM9aSxpPWZ1bmN0aW9uKGUpe3JldHVybiB4KCkub2ZmKGUpLHMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxpLmd1aWQ9cy5ndWlkfHwocy5ndWlkPXguZ3VpZCsrKSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5ldmVudC5hZGQodGhpcyxlLGkscixuKX0pfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24oZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsbixyKXt2YXIgaSxvO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiBpPWUuaGFuZGxlT2JqLHgoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKGkubmFtZXNwYWNlP2kub3JpZ1R5cGUrIi4iK2kubmFtZXNwYWNlOmkub3JpZ1R5cGUsaS5zZWxlY3RvcixpLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IobyBpbiBlKXRoaXMub2ZmKG8sbixlW29dKTtyZXR1cm4gdGhpc31yZXR1cm4obj09PSExfHwiZnVuY3Rpb24iPT10eXBlb2YgbikmJihyPW4sbj10KSxyPT09ITEmJihyPW90KSx0aGlzLmVhY2goZnVuY3Rpb24oKXt4LmV2ZW50LnJlbW92ZSh0aGlzLGUscixuKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3guZXZlbnQudHJpZ2dlcihlLHQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzWzBdO3JldHVybiByP3guZXZlbnQudHJpZ2dlcihlLG4sciwhMCk6dH19KTt2YXIgc3Q9L14uW146I1xbXC4sXSokLyxsdD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyx1dD14LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LGN0PXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O3guZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG49W10scj10aGlzLGk9ci5sZW5ndGg7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayh4KGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7aT50O3QrKylpZih4LmNvbnRhaW5zKHJbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKHQ9MDtpPnQ7dCsrKXguZmluZChlLHJbdF0sbik7cmV0dXJuIG49dGhpcy5wdXNoU3RhY2soaT4xP3gudW5pcXVlKG4pOm4pLG4uc2VsZWN0b3I9dGhpcy5zZWxlY3Rvcj90aGlzLnNlbGVjdG9yKyIgIitlOmUsbn0saGFzOmZ1bmN0aW9uKGUpe3ZhciB0LG49eChlLHRoaXMpLHI9bi5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHQ9MDtyPnQ7dCsrKWlmKHguY29udGFpbnModGhpcyxuW3RdKSlyZXR1cm4hMH0pfSxub3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGZ0KHRoaXMsZXx8W10sITApKX0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmdCh0aGlzLGV8fFtdLCExKSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhZnQodGhpcywic3RyaW5nIj09dHlwZW9mIGUmJnV0LnRlc3QoZSk/eChlKTplfHxbXSwhMSkubGVuZ3RofSxjbG9zZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLGk9dGhpcy5sZW5ndGgsbz1bXSxhPXV0LnRlc3QoZSl8fCJzdHJpbmciIT10eXBlb2YgZT94KGUsdHx8dGhpcy5jb250ZXh0KTowO2Zvcig7aT5yO3IrKylmb3Iobj10aGlzW3JdO24mJm4hPT10O249bi5wYXJlbnROb2RlKWlmKDExPm4ubm9kZVR5cGUmJihhP2EuaW5kZXgobik+LTE6MT09PW4ubm9kZVR5cGUmJnguZmluZC5tYXRjaGVzU2VsZWN0b3IobixlKSkpe249by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhvLmxlbmd0aD4xP3gudW5pcXVlKG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/eC5pbkFycmF5KHRoaXNbMF0seChlKSk6eC5pbkFycmF5KGUuanF1ZXJ5P2VbMF06ZSx0aGlzKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3ZhciBuPSJzdHJpbmciPT10eXBlb2YgZT94KGUsdCk6eC5tYWtlQXJyYXkoZSYmZS5ub2RlVHlwZT9bZV06ZSkscj14Lm1lcmdlKHRoaXMuZ2V0KCksbik7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgudW5pcXVlKHIpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSk7ZnVuY3Rpb24gcHQoZSx0KXtkbyBlPWVbdF07d2hpbGUoZSYmMSE9PWUubm9kZVR5cGUpO3JldHVybiBlfXguZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmMTEhPT10Lm5vZGVUeXBlP3Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihlKXtyZXR1cm4geC5kaXIoZSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmRpcihlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gcHQoZSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihlKXtyZXR1cm4gcHQoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIHguZGlyKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIHguZGlyKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmRpcihlLCJuZXh0U2libGluZyIsbil9LHByZXZVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHguZGlyKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiB4LnNpYmxpbmcoKGUucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsZSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGUpe3JldHVybiB4LnNpYmxpbmcoZS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIHgubm9kZU5hbWUoZSwiaWZyYW1lIik/ZS5jb250ZW50RG9jdW1lbnR8fGUuY29udGVudFdpbmRvdy5kb2N1bWVudDp4Lm1lcmdlKFtdLGUuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihlLHQpe3guZm5bZV09ZnVuY3Rpb24obixyKXt2YXIgaT14Lm1hcCh0aGlzLHQsbik7cmV0dXJuIlVudGlsIiE9PWUuc2xpY2UoLTUpJiYocj1uKSxyJiYic3RyaW5nIj09dHlwZW9mIHImJihpPXguZmlsdGVyKHIsaSkpLHRoaXMubGVuZ3RoPjEmJihjdFtlXXx8KGk9eC51bmlxdWUoaSkpLGx0LnRlc3QoZSkmJihpPWkucmV2ZXJzZSgpKSksdGhpcy5wdXNoU3RhY2soaSl9fSkseC5leHRlbmQoe2ZpbHRlcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9dFswXTtyZXR1cm4gbiYmKGU9Ijpub3QoIitlKyIpIiksMT09PXQubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT94LmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsZSk/W3JdOltdOnguZmluZC5tYXRjaGVzKGUseC5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfSkpfSxkaXI6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPVtdLG89ZVtuXTt3aGlsZShvJiY5IT09by5ub2RlVHlwZSYmKHI9PT10fHwxIT09by5ub2RlVHlwZXx8IXgobykuaXMocikpKTE9PT1vLm5vZGVUeXBlJiZpLnB1c2gobyksbz1vW25dO3JldHVybiBpfSxzaWJsaW5nOmZ1bmN0aW9uKGUsdCl7dmFyIG49W107Zm9yKDtlO2U9ZS5uZXh0U2libGluZykxPT09ZS5ub2RlVHlwZSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn19KTtmdW5jdGlvbiBmdChlLHQsbil7aWYoeC5pc0Z1bmN0aW9uKHQpKXJldHVybiB4LmdyZXAoZSxmdW5jdGlvbihlLHIpe3JldHVybiEhdC5jYWxsKGUscixlKSE9PW59KTtpZih0Lm5vZGVUeXBlKXJldHVybiB4LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PXQhPT1ufSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZihzdC50ZXN0KHQpKXJldHVybiB4LmZpbHRlcih0LGUsbik7dD14LmZpbHRlcih0LGUpfXJldHVybiB4LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4geC5pbkFycmF5KGUsdCk+PTAhPT1ufSl9ZnVuY3Rpb24gZHQoZSl7dmFyIHQ9aHQuc3BsaXQoInwiKSxuPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKG4uY3JlYXRlRWxlbWVudCl3aGlsZSh0Lmxlbmd0aCluLmNyZWF0ZUVsZW1lbnQodC5wb3AoKSk7cmV0dXJuIG59dmFyIGh0PSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixndD0vIGpRdWVyeVxkKz0iKD86bnVsbHxcZCspIi9nLG10PVJlZ0V4cCgiPCg/OiIraHQrIilbXFxzLz5dIiwiaSIpLHl0PS9eXHMrLyx2dD0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLGJ0PS88KFtcdzpdKykvLHh0PS88dGJvZHkvaSx3dD0vPHwmIz9cdys7LyxUdD0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLEN0PS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLE50PS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGt0PS9eJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxFdD0vXnRydWVcLyguKikvLFN0PS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZyxBdD17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6eC5zdXBwb3J0Lmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX0sanQ9ZHQoYSksRHQ9anQuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7QXQub3B0Z3JvdXA9QXQub3B0aW9uLEF0LnRib2R5PUF0LnRmb290PUF0LmNvbGdyb3VwPUF0LmNhcHRpb249QXQudGhlYWQsQXQudGg9QXQudGQseC5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHguYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10P3gudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGEpLmNyZWF0ZVRleHROb2RlKGUpKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PUx0KHRoaXMsZSk7dC5hcHBlbmRDaGlsZChlKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9THQodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxyZW1vdmU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWU/eC5maWx0ZXIoZSx0aGlzKTp0aGlzLGk9MDtmb3IoO251bGwhPShuPXJbaV0pO2krKyl0fHwxIT09bi5ub2RlVHlwZXx8eC5jbGVhbkRhdGEoRnQobikpLG4ucGFyZW50Tm9kZSYmKHQmJnguY29udGFpbnMobi5vd25lckRvY3VtZW50LG4pJiZfdChGdChuLCJzY3JpcHQiKSksbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXt2YXIgZSx0PTA7Zm9yKDtudWxsIT0oZT10aGlzW3RdKTt0KyspezE9PT1lLm5vZGVUeXBlJiZ4LmNsZWFuRGF0YShGdChlLCExKSk7d2hpbGUoZS5maXJzdENoaWxkKWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtlLm9wdGlvbnMmJngubm9kZU5hbWUoZSwic2VsZWN0IikmJihlLm9wdGlvbnMubGVuZ3RoPTApfXJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGw9PWU/ITE6ZSx0PW51bGw9PXQ/ZTp0LHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHguY2xvbmUodGhpcyxlLHQpfSl9LGh0bWw6ZnVuY3Rpb24oZSl7cmV0dXJuIHguYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSl7dmFyIG49dGhpc1swXXx8e30scj0wLGk9dGhpcy5sZW5ndGg7aWYoZT09PXQpcmV0dXJuIDE9PT1uLm5vZGVUeXBlP24uaW5uZXJIVE1MLnJlcGxhY2UoZ3QsIiIpOnQ7aWYoISgic3RyaW5nIiE9dHlwZW9mIGV8fFR0LnRlc3QoZSl8fCF4LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSYmbXQudGVzdChlKXx8IXguc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmeXQudGVzdChlKXx8QXRbKGJ0LmV4ZWMoZSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKSl7ZT1lLnJlcGxhY2UodnQsIjwkMT48LyQyPiIpO3RyeXtmb3IoO2k+cjtyKyspbj10aGlzW3JdfHx7fSwxPT09bi5ub2RlVHlwZSYmKHguY2xlYW5EYXRhKEZ0KG4sITEpKSxuLmlubmVySFRNTD1lKTtuPTB9Y2F0Y2gobyl7fX1uJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGU9eC5tYXAodGhpcyxmdW5jdGlvbihlKXtyZXR1cm5bZS5uZXh0U2libGluZyxlLnBhcmVudE5vZGVdfSksdD0wO3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihuKXt2YXIgcj1lW3QrK10saT1lW3QrK107aSYmKHImJnIucGFyZW50Tm9kZSE9PWkmJihyPXRoaXMubmV4dFNpYmxpbmcpLHgodGhpcykucmVtb3ZlKCksaS5pbnNlcnRCZWZvcmUobixyKSl9LCEwKSx0P3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlbW92ZShlLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oZSx0LG4pe2U9ZC5hcHBseShbXSxlKTt2YXIgcixpLG8sYSxzLGwsdT0wLGM9dGhpcy5sZW5ndGgscD10aGlzLGY9Yy0xLGg9ZVswXSxnPXguaXNGdW5jdGlvbihoKTtpZihnfHwhKDE+PWN8fCJzdHJpbmciIT10eXBlb2YgaHx8eC5zdXBwb3J0LmNoZWNrQ2xvbmUpJiZOdC50ZXN0KGgpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24ocil7dmFyIGk9cC5lcShyKTtnJiYoZVswXT1oLmNhbGwodGhpcyxyLGkuaHRtbCgpKSksaS5kb21NYW5pcChlLHQsbil9KTtpZihjJiYobD14LmJ1aWxkRnJhZ21lbnQoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsIW4mJnRoaXMpLHI9bC5maXJzdENoaWxkLDE9PT1sLmNoaWxkTm9kZXMubGVuZ3RoJiYobD1yKSxyKSl7Zm9yKGE9eC5tYXAoRnQobCwic2NyaXB0IiksSHQpLG89YS5sZW5ndGg7Yz51O3UrKylpPWwsdSE9PWYmJihpPXguY2xvbmUoaSwhMCwhMCksbyYmeC5tZXJnZShhLEZ0KGksInNjcmlwdCIpKSksdC5jYWxsKHRoaXNbdV0saSx1KTtpZihvKWZvcihzPWFbYS5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCx4Lm1hcChhLHF0KSx1PTA7bz51O3UrKylpPWFbdV0sa3QudGVzdChpLnR5cGV8fCIiKSYmIXguX2RhdGEoaSwiZ2xvYmFsRXZhbCIpJiZ4LmNvbnRhaW5zKHMsaSkmJihpLnNyYz94Ll9ldmFsVXJsKGkuc3JjKTp4Lmdsb2JhbEV2YWwoKGkudGV4dHx8aS50ZXh0Q29udGVudHx8aS5pbm5lckhUTUx8fCIiKS5yZXBsYWNlKFN0LCIiKSkpO2w9cj1udWxsfXJldHVybiB0aGlzfX0pO2Z1bmN0aW9uIEx0KGUsdCl7cmV0dXJuIHgubm9kZU5hbWUoZSwidGFibGUiKSYmeC5ub2RlTmFtZSgxPT09dC5ub2RlVHlwZT90OnQuZmlyc3RDaGlsZCwidHIiKT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHxlLmFwcGVuZENoaWxkKGUub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKTplfWZ1bmN0aW9uIEh0KGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT14LmZpbmQuYXR0cihlLCJ0eXBlIikpKyIvIitlLnR5cGUsZX1mdW5jdGlvbiBxdChlKXt2YXIgdD1FdC5leGVjKGUudHlwZSk7cmV0dXJuIHQ/ZS50eXBlPXRbMV06ZS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIF90KGUsdCl7dmFyIG4scj0wO2Zvcig7bnVsbCE9KG49ZVtyXSk7cisrKXguX2RhdGEobiwiZ2xvYmFsRXZhbCIsIXR8fHguX2RhdGEodFtyXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBNdChlLHQpe2lmKDE9PT10Lm5vZGVUeXBlJiZ4Lmhhc0RhdGEoZSkpe3ZhciBuLHIsaSxvPXguX2RhdGEoZSksYT14Ll9kYXRhKHQsbykscz1vLmV2ZW50cztpZihzKXtkZWxldGUgYS5oYW5kbGUsYS5ldmVudHM9e307Zm9yKG4gaW4gcylmb3Iocj0wLGk9c1tuXS5sZW5ndGg7aT5yO3IrKyl4LmV2ZW50LmFkZCh0LG4sc1tuXVtyXSl9YS5kYXRhJiYoYS5kYXRhPXguZXh0ZW5kKHt9LGEuZGF0YSkpfX1mdW5jdGlvbiBPdChlLHQpe3ZhciBuLHIsaTtpZigxPT09dC5ub2RlVHlwZSl7aWYobj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIXguc3VwcG9ydC5ub0Nsb25lRXZlbnQmJnRbeC5leHBhbmRvXSl7aT14Ll9kYXRhKHQpO2ZvcihyIGluIGkuZXZlbnRzKXgucmVtb3ZlRXZlbnQodCxyLGkuaGFuZGxlKTt0LnJlbW92ZUF0dHJpYnV0ZSh4LmV4cGFuZG8pfSJzY3JpcHQiPT09biYmdC50ZXh0IT09ZS50ZXh0PyhIdCh0KS50ZXh0PWUudGV4dCxxdCh0KSk6Im9iamVjdCI9PT1uPyh0LnBhcmVudE5vZGUmJih0Lm91dGVySFRNTD1lLm91dGVySFRNTCkseC5zdXBwb3J0Lmh0bWw1Q2xvbmUmJmUuaW5uZXJIVE1MJiYheC50cmltKHQuaW5uZXJIVE1MKSYmKHQuaW5uZXJIVE1MPWUuaW5uZXJIVE1MKSk6ImlucHV0Ij09PW4mJkN0LnRlc3QoZS50eXBlKT8odC5kZWZhdWx0Q2hlY2tlZD10LmNoZWNrZWQ9ZS5jaGVja2VkLHQudmFsdWUhPT1lLnZhbHVlJiYodC52YWx1ZT1lLnZhbHVlKSk6Im9wdGlvbiI9PT1uP3QuZGVmYXVsdFNlbGVjdGVkPXQuc2VsZWN0ZWQ9ZS5kZWZhdWx0U2VsZWN0ZWQ6KCJpbnB1dCI9PT1ufHwidGV4dGFyZWEiPT09bikmJih0LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZSl9fXguZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGUsdCl7eC5mbltlXT1mdW5jdGlvbihlKXt2YXIgbixyPTAsaT1bXSxvPXgoZSksYT1vLmxlbmd0aC0xO2Zvcig7YT49cjtyKyspbj1yPT09YT90aGlzOnRoaXMuY2xvbmUoITApLHgob1tyXSlbdF0obiksaC5hcHBseShpLG4uZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhpKX19KTtmdW5jdGlvbiBGdChlLG4pe3ZhciByLG8sYT0wLHM9dHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1pP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUobnx8IioiKTp0eXBlb2YgZS5xdWVyeVNlbGVjdG9yQWxsIT09aT9lLnF1ZXJ5U2VsZWN0b3JBbGwobnx8IioiKTp0O2lmKCFzKWZvcihzPVtdLHI9ZS5jaGlsZE5vZGVzfHxlO251bGwhPShvPXJbYV0pO2ErKykhbnx8eC5ub2RlTmFtZShvLG4pP3MucHVzaChvKTp4Lm1lcmdlKHMsRnQobyxuKSk7cmV0dXJuIG49PT10fHxuJiZ4Lm5vZGVOYW1lKGUsbik/eC5tZXJnZShbZV0scyk6c31mdW5jdGlvbiBCdChlKXtDdC50ZXN0KGUudHlwZSkmJihlLmRlZmF1bHRDaGVja2VkPWUuY2hlY2tlZCl9eC5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLGw9eC5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSk7aWYoeC5zdXBwb3J0Lmh0bWw1Q2xvbmV8fHguaXNYTUxEb2MoZSl8fCFtdC50ZXN0KCI8IitlLm5vZGVOYW1lKyI+Iik/bz1lLmNsb25lTm9kZSghMCk6KER0LmlubmVySFRNTD1lLm91dGVySFRNTCxEdC5yZW1vdmVDaGlsZChvPUR0LmZpcnN0Q2hpbGQpKSwhKHguc3VwcG9ydC5ub0Nsb25lRXZlbnQmJnguc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZHx8MSE9PWUubm9kZVR5cGUmJjExIT09ZS5ub2RlVHlwZXx8eC5pc1hNTERvYyhlKSkpZm9yKHI9RnQobykscz1GdChlKSxhPTA7bnVsbCE9KGk9c1thXSk7KythKXJbYV0mJk90KGksclthXSk7aWYodClpZihuKWZvcihzPXN8fEZ0KGUpLHI9cnx8RnQobyksYT0wO251bGwhPShpPXNbYV0pO2ErKylNdChpLHJbYV0pO2Vsc2UgTXQoZSxvKTtyZXR1cm4gcj1GdChvLCJzY3JpcHQiKSxyLmxlbmd0aD4wJiZfdChyLCFsJiZGdChlLCJzY3JpcHQiKSkscj1zPWk9bnVsbCxvfSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLGwsdSxjLHA9ZS5sZW5ndGgsZj1kdCh0KSxkPVtdLGg9MDtmb3IoO3A+aDtoKyspaWYobz1lW2hdLG98fDA9PT1vKWlmKCJvYmplY3QiPT09eC50eXBlKG8pKXgubWVyZ2UoZCxvLm5vZGVUeXBlP1tvXTpvKTtlbHNlIGlmKHd0LnRlc3Qobykpe3M9c3x8Zi5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxsPShidC5leGVjKG8pfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGM9QXRbbF18fEF0Ll9kZWZhdWx0LHMuaW5uZXJIVE1MPWNbMV0rby5yZXBsYWNlKHZ0LCI8JDE+PC8kMj4iKStjWzJdLGk9Y1swXTt3aGlsZShpLS0pcz1zLmxhc3RDaGlsZDtpZigheC5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlJiZ5dC50ZXN0KG8pJiZkLnB1c2godC5jcmVhdGVUZXh0Tm9kZSh5dC5leGVjKG8pWzBdKSksIXguc3VwcG9ydC50Ym9keSl7bz0idGFibGUiIT09bHx8eHQudGVzdChvKT8iPHRhYmxlPiIhPT1jWzFdfHx4dC50ZXN0KG8pPzA6czpzLmZpcnN0Q2hpbGQsaT1vJiZvLmNoaWxkTm9kZXMubGVuZ3RoO3doaWxlKGktLSl4Lm5vZGVOYW1lKHU9by5jaGlsZE5vZGVzW2ldLCJ0Ym9keSIpJiYhdS5jaGlsZE5vZGVzLmxlbmd0aCYmby5yZW1vdmVDaGlsZCh1KX14Lm1lcmdlKGQscy5jaGlsZE5vZGVzKSxzLnRleHRDb250ZW50PSIiO3doaWxlKHMuZmlyc3RDaGlsZClzLnJlbW92ZUNoaWxkKHMuZmlyc3RDaGlsZCk7cz1mLmxhc3RDaGlsZH1lbHNlIGQucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtzJiZmLnJlbW92ZUNoaWxkKHMpLHguc3VwcG9ydC5hcHBlbmRDaGVja2VkfHx4LmdyZXAoRnQoZCwiaW5wdXQiKSxCdCksaD0wO3doaWxlKG89ZFtoKytdKWlmKCghcnx8LTE9PT14LmluQXJyYXkobyxyKSkmJihhPXguY29udGFpbnMoby5vd25lckRvY3VtZW50LG8pLHM9RnQoZi5hcHBlbmRDaGlsZChvKSwic2NyaXB0IiksYSYmX3Qocyksbikpe2k9MDt3aGlsZShvPXNbaSsrXSlrdC50ZXN0KG8udHlwZXx8IiIpJiZuLnB1c2gobyl9cmV0dXJuIHM9bnVsbCxmfSxjbGVhbkRhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLG8sYSxzPTAsbD14LmV4cGFuZG8sdT14LmNhY2hlLGM9eC5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8sZj14LmV2ZW50LnNwZWNpYWw7Zm9yKDtudWxsIT0obj1lW3NdKTtzKyspaWYoKHR8fHguYWNjZXB0RGF0YShuKSkmJihvPW5bbF0sYT1vJiZ1W29dKSl7aWYoYS5ldmVudHMpZm9yKHIgaW4gYS5ldmVudHMpZltyXT94LmV2ZW50LnJlbW92ZShuLHIpOngucmVtb3ZlRXZlbnQobixyLGEuaGFuZGxlKTsKdVtvXSYmKGRlbGV0ZSB1W29dLGM/ZGVsZXRlIG5bbF06dHlwZW9mIG4ucmVtb3ZlQXR0cmlidXRlIT09aT9uLnJlbW92ZUF0dHJpYnV0ZShsKTpuW2xdPW51bGwscC5wdXNoKG8pKX19LF9ldmFsVXJsOmZ1bmN0aW9uKGUpe3JldHVybiB4LmFqYXgoe3VybDplLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSl9fSkseC5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oZSl7aWYoeC5pc0Z1bmN0aW9uKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7eCh0aGlzKS53cmFwQWxsKGUuY2FsbCh0aGlzLHQpKX0pO2lmKHRoaXNbMF0pe3ZhciB0PXgoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJnQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLHQubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpczt3aGlsZShlLmZpcnN0Q2hpbGQmJjE9PT1lLmZpcnN0Q2hpbGQubm9kZVR5cGUpZT1lLmZpcnN0Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihlKXtyZXR1cm4geC5pc0Z1bmN0aW9uKGUpP3RoaXMuZWFjaChmdW5jdGlvbih0KXt4KHRoaXMpLndyYXBJbm5lcihlLmNhbGwodGhpcyx0KSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD14KHRoaXMpLG49dC5jb250ZW50cygpO24ubGVuZ3RoP24ud3JhcEFsbChlKTp0LmFwcGVuZChlKX0pfSx3cmFwOmZ1bmN0aW9uKGUpe3ZhciB0PXguaXNGdW5jdGlvbihlKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3godGhpcykud3JhcEFsbCh0P2UuY2FsbCh0aGlzLG4pOmUpfSl9LHVud3JhcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXt4Lm5vZGVOYW1lKHRoaXMsImJvZHkiKXx8eCh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSkuZW5kKCl9fSk7dmFyIFB0LFJ0LFd0LCR0PS9hbHBoYVwoW14pXSpcKS9pLEl0PS9vcGFjaXR5XHMqPVxzKihbXildKikvLHp0PS9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLyxYdD0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sVXQ9L15tYXJnaW4vLFZ0PVJlZ0V4cCgiXigiK3crIikoLiopJCIsImkiKSxZdD1SZWdFeHAoIl4oIit3KyIpKD8hcHgpW2EteiVdKyQiLCJpIiksSnQ9UmVnRXhwKCJeKFsrLV0pPSgiK3crIikiLCJpIiksR3Q9e0JPRFk6ImJsb2NrIn0sUXQ9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LEt0PXtsZXR0ZXJTcGFjaW5nOjAsZm9udFdlaWdodDo0MDB9LFp0PVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sZW49WyJXZWJraXQiLCJPIiwiTW96IiwibXMiXTtmdW5jdGlvbiB0bihlLHQpe2lmKHQgaW4gZSlyZXR1cm4gdDt2YXIgbj10LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSkscj10LGk9ZW4ubGVuZ3RoO3doaWxlKGktLSlpZih0PWVuW2ldK24sdCBpbiBlKXJldHVybiB0O3JldHVybiByfWZ1bmN0aW9uIG5uKGUsdCl7cmV0dXJuIGU9dHx8ZSwibm9uZSI9PT14LmNzcyhlLCJkaXNwbGF5Iil8fCF4LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKX1mdW5jdGlvbiBybihlLHQpe3ZhciBuLHIsaSxvPVtdLGE9MCxzPWUubGVuZ3RoO2Zvcig7cz5hO2ErKylyPWVbYV0sci5zdHlsZSYmKG9bYV09eC5fZGF0YShyLCJvbGRkaXNwbGF5Iiksbj1yLnN0eWxlLmRpc3BsYXksdD8ob1thXXx8Im5vbmUiIT09bnx8KHIuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJm5uKHIpJiYob1thXT14Ll9kYXRhKHIsIm9sZGRpc3BsYXkiLGxuKHIubm9kZU5hbWUpKSkpOm9bYV18fChpPW5uKHIpLChuJiYibm9uZSIhPT1ufHwhaSkmJnguX2RhdGEociwib2xkZGlzcGxheSIsaT9uOnguY3NzKHIsImRpc3BsYXkiKSkpKTtmb3IoYT0wO3M+YTthKyspcj1lW2FdLHIuc3R5bGUmJih0JiYibm9uZSIhPT1yLnN0eWxlLmRpc3BsYXkmJiIiIT09ci5zdHlsZS5kaXNwbGF5fHwoci5zdHlsZS5kaXNwbGF5PXQ/b1thXXx8IiI6Im5vbmUiKSk7cmV0dXJuIGV9eC5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLG4pe3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUsbixyKXt2YXIgaSxvLGE9e30scz0wO2lmKHguaXNBcnJheShuKSl7Zm9yKG89UnQoZSksaT1uLmxlbmd0aDtpPnM7cysrKWFbbltzXV09eC5jc3MoZSxuW3NdLCExLG8pO3JldHVybiBhfXJldHVybiByIT09dD94LnN0eWxlKGUsbixyKTp4LmNzcyhlLG4pfSxlLG4sYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBybih0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBybih0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtubih0aGlzKT94KHRoaXMpLnNob3coKTp4KHRoaXMpLmhpZGUoKX0pfX0pLHguZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49V3QoZSwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOntjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6eC5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihlLG4scixpKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBvLGEscyxsPXguY2FtZWxDYXNlKG4pLHU9ZS5zdHlsZTtpZihuPXguY3NzUHJvcHNbbF18fCh4LmNzc1Byb3BzW2xdPXRuKHUsbCkpLHM9eC5jc3NIb29rc1tuXXx8eC5jc3NIb29rc1tsXSxyPT09dClyZXR1cm4gcyYmImdldCJpbiBzJiYobz1zLmdldChlLCExLGkpKSE9PXQ/bzp1W25dO2lmKGE9dHlwZW9mIHIsInN0cmluZyI9PT1hJiYobz1KdC5leGVjKHIpKSYmKHI9KG9bMV0rMSkqb1syXStwYXJzZUZsb2F0KHguY3NzKGUsbikpLGE9Im51bWJlciIpLCEobnVsbD09cnx8Im51bWJlciI9PT1hJiZpc05hTihyKXx8KCJudW1iZXIiIT09YXx8eC5jc3NOdW1iZXJbbF18fChyKz0icHgiKSx4LnN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PXJ8fDAhPT1uLmluZGV4T2YoImJhY2tncm91bmQiKXx8KHVbbl09ImluaGVyaXQiKSxzJiYic2V0ImluIHMmJihyPXMuc2V0KGUscixpKSk9PT10KSkpdHJ5e3Vbbl09cn1jYXRjaChjKXt9fX0sY3NzOmZ1bmN0aW9uKGUsbixyLGkpe3ZhciBvLGEscyxsPXguY2FtZWxDYXNlKG4pO3JldHVybiBuPXguY3NzUHJvcHNbbF18fCh4LmNzc1Byb3BzW2xdPXRuKGUuc3R5bGUsbCkpLHM9eC5jc3NIb29rc1tuXXx8eC5jc3NIb29rc1tsXSxzJiYiZ2V0ImluIHMmJihhPXMuZ2V0KGUsITAscikpLGE9PT10JiYoYT1XdChlLG4saSkpLCJub3JtYWwiPT09YSYmbiBpbiBLdCYmKGE9S3Rbbl0pLCIiPT09cnx8cj8obz1wYXJzZUZsb2F0KGEpLHI9PT0hMHx8eC5pc051bWVyaWMobyk/b3x8MDphKTphfX0pLGUuZ2V0Q29tcHV0ZWRTdHlsZT8oUnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGUuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpfSxXdD1mdW5jdGlvbihlLG4scil7dmFyIGksbyxhLHM9cnx8UnQoZSksbD1zP3MuZ2V0UHJvcGVydHlWYWx1ZShuKXx8c1tuXTp0LHU9ZS5zdHlsZTtyZXR1cm4gcyYmKCIiIT09bHx8eC5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl8fChsPXguc3R5bGUoZSxuKSksWXQudGVzdChsKSYmVXQudGVzdChuKSYmKGk9dS53aWR0aCxvPXUubWluV2lkdGgsYT11Lm1heFdpZHRoLHUubWluV2lkdGg9dS5tYXhXaWR0aD11LndpZHRoPWwsbD1zLndpZHRoLHUud2lkdGg9aSx1Lm1pbldpZHRoPW8sdS5tYXhXaWR0aD1hKSksbH0pOmEuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKFJ0PWZ1bmN0aW9uKGUpe3JldHVybiBlLmN1cnJlbnRTdHlsZX0sV3Q9ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG8sYSxzPXJ8fFJ0KGUpLGw9cz9zW25dOnQsdT1lLnN0eWxlO3JldHVybiBudWxsPT1sJiZ1JiZ1W25dJiYobD11W25dKSxZdC50ZXN0KGwpJiYhenQudGVzdChuKSYmKGk9dS5sZWZ0LG89ZS5ydW50aW1lU3R5bGUsYT1vJiZvLmxlZnQsYSYmKG8ubGVmdD1lLmN1cnJlbnRTdHlsZS5sZWZ0KSx1LmxlZnQ9ImZvbnRTaXplIj09PW4/IjFlbSI6bCxsPXUucGl4ZWxMZWZ0KyJweCIsdS5sZWZ0PWksYSYmKG8ubGVmdD1hKSksIiI9PT1sPyJhdXRvIjpsfSk7ZnVuY3Rpb24gb24oZSx0LG4pe3ZhciByPVZ0LmV4ZWModCk7cmV0dXJuIHI/TWF0aC5tYXgoMCxyWzFdLShufHwwKSkrKHJbMl18fCJweCIpOnR9ZnVuY3Rpb24gYW4oZSx0LG4scixpKXt2YXIgbz1uPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKT80OiJ3aWR0aCI9PT10PzE6MCxhPTA7Zm9yKDs0Pm87bys9MikibWFyZ2luIj09PW4mJihhKz14LmNzcyhlLG4rWnRbb10sITAsaSkpLHI/KCJjb250ZW50Ij09PW4mJihhLT14LmNzcyhlLCJwYWRkaW5nIitadFtvXSwhMCxpKSksIm1hcmdpbiIhPT1uJiYoYS09eC5jc3MoZSwiYm9yZGVyIitadFtvXSsiV2lkdGgiLCEwLGkpKSk6KGErPXguY3NzKGUsInBhZGRpbmciK1p0W29dLCEwLGkpLCJwYWRkaW5nIiE9PW4mJihhKz14LmNzcyhlLCJib3JkZXIiK1p0W29dKyJXaWR0aCIsITAsaSkpKTtyZXR1cm4gYX1mdW5jdGlvbiBzbihlLHQsbil7dmFyIHI9ITAsaT0id2lkdGgiPT09dD9lLm9mZnNldFdpZHRoOmUub2Zmc2V0SGVpZ2h0LG89UnQoZSksYT14LnN1cHBvcnQuYm94U2l6aW5nJiYiYm9yZGVyLWJveCI9PT14LmNzcyhlLCJib3hTaXppbmciLCExLG8pO2lmKDA+PWl8fG51bGw9PWkpe2lmKGk9V3QoZSx0LG8pLCgwPml8fG51bGw9PWkpJiYoaT1lLnN0eWxlW3RdKSxZdC50ZXN0KGkpKXJldHVybiBpO3I9YSYmKHguc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZXx8aT09PWUuc3R5bGVbdF0pLGk9cGFyc2VGbG9hdChpKXx8MH1yZXR1cm4gaSthbihlLHQsbnx8KGE/ImJvcmRlciI6ImNvbnRlbnQiKSxyLG8pKyJweCJ9ZnVuY3Rpb24gbG4oZSl7dmFyIHQ9YSxuPUd0W2VdO3JldHVybiBufHwobj11bihlLHQpLCJub25lIiE9PW4mJm58fChQdD0oUHR8fHgoIjxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iKS5jc3MoImNzc1RleHQiLCJkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnQiKSkuYXBwZW5kVG8odC5kb2N1bWVudEVsZW1lbnQpLHQ9KFB0WzBdLmNvbnRlbnRXaW5kb3d8fFB0WzBdLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsdC53cml0ZSgiPCFkb2N0eXBlIGh0bWw+PGh0bWw+PGJvZHk+IiksdC5jbG9zZSgpLG49dW4oZSx0KSxQdC5kZXRhY2goKSksR3RbZV09biksbn1mdW5jdGlvbiB1bihlLHQpe3ZhciBuPXgodC5jcmVhdGVFbGVtZW50KGUpKS5hcHBlbmRUbyh0LmJvZHkpLHI9eC5jc3MoblswXSwiZGlzcGxheSIpO3JldHVybiBuLnJlbW92ZSgpLHJ9eC5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihlLG4pe3guY3NzSG9va3Nbbl09e2dldDpmdW5jdGlvbihlLHIsaSl7cmV0dXJuIHI/MD09PWUub2Zmc2V0V2lkdGgmJlh0LnRlc3QoeC5jc3MoZSwiZGlzcGxheSIpKT94LnN3YXAoZSxRdCxmdW5jdGlvbigpe3JldHVybiBzbihlLG4saSl9KTpzbihlLG4saSk6dH0sc2V0OmZ1bmN0aW9uKGUsdCxyKXt2YXIgaT1yJiZSdChlKTtyZXR1cm4gb24oZSx0LHI/YW4oZSxuLHIseC5zdXBwb3J0LmJveFNpemluZyYmImJvcmRlci1ib3giPT09eC5jc3MoZSwiYm94U2l6aW5nIiwhMSxpKSxpKTowKX19fSkseC5zdXBwb3J0Lm9wYWNpdHl8fCh4LmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihlLHQpe3JldHVybiBJdC50ZXN0KCh0JiZlLmN1cnJlbnRTdHlsZT9lLmN1cnJlbnRTdHlsZS5maWx0ZXI6ZS5zdHlsZS5maWx0ZXIpfHwiIik/LjAxKnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsiIjp0PyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zdHlsZSxyPWUuY3VycmVudFN0eWxlLGk9eC5pc051bWVyaWModCk/ImFscGhhKG9wYWNpdHk9IisxMDAqdCsiKSI6IiIsbz1yJiZyLmZpbHRlcnx8bi5maWx0ZXJ8fCIiO24uem9vbT0xLCh0Pj0xfHwiIj09PXQpJiYiIj09PXgudHJpbShvLnJlcGxhY2UoJHQsIiIpKSYmbi5yZW1vdmVBdHRyaWJ1dGUmJihuLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIiksIiI9PT10fHxyJiYhci5maWx0ZXIpfHwobi5maWx0ZXI9JHQudGVzdChvKT9vLnJlcGxhY2UoJHQsaSk6bysiICIraSl9fSkseChmdW5jdGlvbigpe3guc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0fHwoeC5jc3NIb29rcy5tYXJnaW5SaWdodD17Z2V0OmZ1bmN0aW9uKGUsbil7cmV0dXJuIG4/eC5zd2FwKGUse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LFd0LFtlLCJtYXJnaW5SaWdodCJdKTp0fX0pLCF4LnN1cHBvcnQucGl4ZWxQb3NpdGlvbiYmeC5mbi5wb3NpdGlvbiYmeC5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGUsbil7eC5jc3NIb29rc1tuXT17Z2V0OmZ1bmN0aW9uKGUscil7cmV0dXJuIHI/KHI9V3QoZSxuKSxZdC50ZXN0KHIpP3goZSkucG9zaXRpb24oKVtuXSsicHgiOnIpOnR9fX0pfSkseC5leHByJiZ4LmV4cHIuZmlsdGVycyYmKHguZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihlKXtyZXR1cm4gMD49ZS5vZmZzZXRXaWR0aCYmMD49ZS5vZmZzZXRIZWlnaHR8fCF4LnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzJiYibm9uZSI9PT0oZS5zdHlsZSYmZS5zdHlsZS5kaXNwbGF5fHx4LmNzcyhlLCJkaXNwbGF5IikpfSx4LmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGUpe3JldHVybiF4LmV4cHIuZmlsdGVycy5oaWRkZW4oZSl9KSx4LmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihlLHQpe3guY3NzSG9va3NbZSt0XT17ZXhwYW5kOmZ1bmN0aW9uKG4pe3ZhciByPTAsaT17fSxvPSJzdHJpbmciPT10eXBlb2Ygbj9uLnNwbGl0KCIgIik6W25dO2Zvcig7ND5yO3IrKylpW2UrWnRbcl0rdF09b1tyXXx8b1tyLTJdfHxvWzBdO3JldHVybiBpfX0sVXQudGVzdChlKXx8KHguY3NzSG9va3NbZSt0XS5zZXQ9b24pfSk7dmFyIGNuPS8lMjAvZyxwbj0vXFtcXSQvLGZuPS9ccj9cbi9nLGRuPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxobj0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7eC5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiB4LnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9eC5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGU/eC5tYWtlQXJyYXkoZSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYheCh0aGlzKS5pcygiOmRpc2FibGVkIikmJmhuLnRlc3QodGhpcy5ub2RlTmFtZSkmJiFkbi50ZXN0KGUpJiYodGhpcy5jaGVja2VkfHwhQ3QudGVzdChlKSl9KS5tYXAoZnVuY3Rpb24oZSx0KXt2YXIgbj14KHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6eC5pc0FycmF5KG4pP3gubWFwKG4sZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6dC5uYW1lLHZhbHVlOmUucmVwbGFjZShmbiwiXHJcbiIpfX0pOntuYW1lOnQubmFtZSx2YWx1ZTpuLnJlcGxhY2UoZm4sIlxyXG4iKX19KS5nZXQoKX19KSx4LnBhcmFtPWZ1bmN0aW9uKGUsbil7dmFyIHIsaT1bXSxvPWZ1bmN0aW9uKGUsdCl7dD14LmlzRnVuY3Rpb24odCk/dCgpOm51bGw9PXQ/IiI6dCxpW2kubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoZSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KX07aWYobj09PXQmJihuPXguYWpheFNldHRpbmdzJiZ4LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCkseC5pc0FycmF5KGUpfHxlLmpxdWVyeSYmIXguaXNQbGFpbk9iamVjdChlKSl4LmVhY2goZSxmdW5jdGlvbigpe28odGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IociBpbiBlKWduKHIsZVtyXSxuLG8pO3JldHVybiBpLmpvaW4oIiYiKS5yZXBsYWNlKGNuLCIrIil9O2Z1bmN0aW9uIGduKGUsdCxuLHIpe3ZhciBpO2lmKHguaXNBcnJheSh0KSl4LmVhY2godCxmdW5jdGlvbih0LGkpe258fHBuLnRlc3QoZSk/cihlLGkpOmduKGUrIlsiKygib2JqZWN0Ij09dHlwZW9mIGk/dDoiIikrIl0iLGksbixyKX0pO2Vsc2UgaWYobnx8Im9iamVjdCIhPT14LnR5cGUodCkpcihlLHQpO2Vsc2UgZm9yKGkgaW4gdClnbihlKyJbIitpKyJdIix0W2ldLG4scil9eC5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7eC5mblt0XT1mdW5jdGlvbihlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbih0LG51bGwsZSxuKTp0aGlzLnRyaWdnZXIodCl9fSkseC5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubW91c2VlbnRlcihlKS5tb3VzZWxlYXZlKHR8fGUpfSxiaW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vbihlLG51bGwsdCxuKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub2ZmKGUsbnVsbCx0KX0sZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24odCxlLG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihlLCIqKiIpOnRoaXMub2ZmKHQsZXx8IioqIixuKX19KTt2YXIgbW4seW4sdm49eC5ub3coKSxibj0vXD8vLHhuPS8jLiokLyx3bj0vKFs/Jl0pXz1bXiZdKi8sVG49L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxDbj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxObj0vXig/OkdFVHxIRUFEKSQvLGtuPS9eXC9cLy8sRW49L14oW1x3ListXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLFNuPXguZm4ubG9hZCxBbj17fSxqbj17fSxEbj0iKi8iLmNvbmNhdCgiKiIpO3RyeXt5bj1vLmhyZWZ9Y2F0Y2goTG4pe3luPWEuY3JlYXRlRWxlbWVudCgiYSIpLHluLmhyZWY9IiIseW49eW4uaHJlZn1tbj1Fbi5leGVjKHluLnRvTG93ZXJDYXNlKCkpfHxbXTtmdW5jdGlvbiBIbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXsic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iKiIpO3ZhciByLGk9MCxvPXQudG9Mb3dlckNhc2UoKS5tYXRjaChUKXx8W107aWYoeC5pc0Z1bmN0aW9uKG4pKXdoaWxlKHI9b1tpKytdKSIrIj09PXJbMF0/KHI9ci5zbGljZSgxKXx8IioiLChlW3JdPWVbcl18fFtdKS51bnNoaWZ0KG4pKTooZVtyXT1lW3JdfHxbXSkucHVzaChuKX19ZnVuY3Rpb24gcW4oZSxuLHIsaSl7dmFyIG89e30sYT1lPT09am47ZnVuY3Rpb24gcyhsKXt2YXIgdTtyZXR1cm4gb1tsXT0hMCx4LmVhY2goZVtsXXx8W10sZnVuY3Rpb24oZSxsKXt2YXIgYz1sKG4scixpKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGN8fGF8fG9bY10/YT8hKHU9Yyk6dDoobi5kYXRhVHlwZXMudW5zaGlmdChjKSxzKGMpLCExKX0pLHV9cmV0dXJuIHMobi5kYXRhVHlwZXNbMF0pfHwhb1siKiJdJiZzKCIqIil9ZnVuY3Rpb24gX24oZSxuKXt2YXIgcixpLG89eC5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihpIGluIG4pbltpXSE9PXQmJigob1tpXT9lOnJ8fChyPXt9KSlbaV09bltpXSk7cmV0dXJuIHImJnguZXh0ZW5kKCEwLGUsciksZX14LmZuLmxvYWQ9ZnVuY3Rpb24oZSxuLHIpe2lmKCJzdHJpbmciIT10eXBlb2YgZSYmU24pcmV0dXJuIFNuLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgaSxvLGEscz10aGlzLGw9ZS5pbmRleE9mKCIgIik7cmV0dXJuIGw+PTAmJihpPWUuc2xpY2UobCxlLmxlbmd0aCksZT1lLnNsaWNlKDAsbCkpLHguaXNGdW5jdGlvbihuKT8ocj1uLG49dCk6biYmIm9iamVjdCI9PXR5cGVvZiBuJiYoYT0iUE9TVCIpLHMubGVuZ3RoPjAmJnguYWpheCh7dXJsOmUsdHlwZTphLGRhdGFUeXBlOiJodG1sIixkYXRhOm59KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLHMuaHRtbChpP3goIjxkaXY+IikuYXBwZW5kKHgucGFyc2VIVE1MKGUpKS5maW5kKGkpOmUpfSkuY29tcGxldGUociYmZnVuY3Rpb24oZSx0KXtzLmVhY2gocixvfHxbZS5yZXNwb25zZVRleHQsdCxlXSl9KSx0aGlzfSx4LmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihlLHQpe3guZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub24odCxlKX19KSx4LmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6eW4sdHlwZToiR0VUIixpc0xvY2FsOkNuLnRlc3QobW5bMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6RG4sdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjp4LnBhcnNlSlNPTiwidGV4dCB4bWwiOngucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P19uKF9uKGUseC5hamF4U2V0dGluZ3MpLHQpOl9uKHguYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOkhuKEFuKSxhamF4VHJhbnNwb3J0OkhuKGpuKSxhamF4OmZ1bmN0aW9uKGUsbil7Im9iamVjdCI9PXR5cGVvZiBlJiYobj1lLGU9dCksbj1ufHx7fTt2YXIgcixpLG8sYSxzLGwsdSxjLHA9eC5hamF4U2V0dXAoe30sbiksZj1wLmNvbnRleHR8fHAsZD1wLmNvbnRleHQmJihmLm5vZGVUeXBlfHxmLmpxdWVyeSk/eChmKTp4LmV2ZW50LGg9eC5EZWZlcnJlZCgpLGc9eC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksbT1wLnN0YXR1c0NvZGV8fHt9LHk9e30sdj17fSxiPTAsdz0iY2FuY2VsZWQiLEM9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihlKXt2YXIgdDtpZigyPT09Yil7aWYoIWMpe2M9e307d2hpbGUodD1Ubi5leGVjKGEpKWNbdFsxXS50b0xvd2VyQ2FzZSgpXT10WzJdfXQ9Y1tlLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT10P251bGw6dH0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT1iP2E6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihlLHQpe3ZhciBuPWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYnx8KGU9dltuXT12W25dfHxlLHlbZV09dCksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gYnx8KHAubWltZVR5cGU9ZSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihlKXt2YXIgdDtpZihlKWlmKDI+Yilmb3IodCBpbiBlKW1bdF09W21bdF0sZVt0XV07ZWxzZSBDLmFsd2F5cyhlW0Muc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGUpe3ZhciB0PWV8fHc7cmV0dXJuIHUmJnUuYWJvcnQodCksaygwLHQpLHRoaXN9fTtpZihoLnByb21pc2UoQykuY29tcGxldGU9Zy5hZGQsQy5zdWNjZXNzPUMuZG9uZSxDLmVycm9yPUMuZmFpbCxwLnVybD0oKGV8fHAudXJsfHx5bikrIiIpLnJlcGxhY2UoeG4sIiIpLnJlcGxhY2Uoa24sbW5bMV0rIi8vIikscC50eXBlPW4ubWV0aG9kfHxuLnR5cGV8fHAubWV0aG9kfHxwLnR5cGUscC5kYXRhVHlwZXM9eC50cmltKHAuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChUKXx8WyIiXSxudWxsPT1wLmNyb3NzRG9tYWluJiYocj1Fbi5leGVjKHAudXJsLnRvTG93ZXJDYXNlKCkpLHAuY3Jvc3NEb21haW49ISghcnx8clsxXT09PW1uWzFdJiZyWzJdPT09bW5bMl0mJihyWzNdfHwoImh0dHA6Ij09PXJbMV0/IjgwIjoiNDQzIikpPT09KG1uWzNdfHwoImh0dHA6Ij09PW1uWzFdPyI4MCI6IjQ0MyIpKSkpLHAuZGF0YSYmcC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBwLmRhdGEmJihwLmRhdGE9eC5wYXJhbShwLmRhdGEscC50cmFkaXRpb25hbCkpLHFuKEFuLHAsbixDKSwyPT09YilyZXR1cm4gQztsPXAuZ2xvYmFsLGwmJjA9PT14LmFjdGl2ZSsrJiZ4LmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLHAudHlwZT1wLnR5cGUudG9VcHBlckNhc2UoKSxwLmhhc0NvbnRlbnQ9IU5uLnRlc3QocC50eXBlKSxvPXAudXJsLHAuaGFzQ29udGVudHx8KHAuZGF0YSYmKG89cC51cmwrPShibi50ZXN0KG8pPyImIjoiPyIpK3AuZGF0YSxkZWxldGUgcC5kYXRhKSxwLmNhY2hlPT09ITEmJihwLnVybD13bi50ZXN0KG8pP28ucmVwbGFjZSh3biwiJDFfPSIrdm4rKyk6bysoYm4udGVzdChvKT8iJiI6Ij8iKSsiXz0iK3ZuKyspKSxwLmlmTW9kaWZpZWQmJih4Lmxhc3RNb2RpZmllZFtvXSYmQy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIseC5sYXN0TW9kaWZpZWRbb10pLHguZXRhZ1tvXSYmQy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIix4LmV0YWdbb10pKSwocC5kYXRhJiZwLmhhc0NvbnRlbnQmJnAuY29udGVudFR5cGUhPT0hMXx8bi5jb250ZW50VHlwZSkmJkMuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixwLmNvbnRlbnRUeXBlKSxDLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIscC5kYXRhVHlwZXNbMF0mJnAuYWNjZXB0c1twLmRhdGFUeXBlc1swXV0/cC5hY2NlcHRzW3AuZGF0YVR5cGVzWzBdXSsoIioiIT09cC5kYXRhVHlwZXNbMF0/IiwgIitEbisiOyBxPTAuMDEiOiIiKTpwLmFjY2VwdHNbIioiXSk7Zm9yKGkgaW4gcC5oZWFkZXJzKUMuc2V0UmVxdWVzdEhlYWRlcihpLHAuaGVhZGVyc1tpXSk7aWYocC5iZWZvcmVTZW5kJiYocC5iZWZvcmVTZW5kLmNhbGwoZixDLHApPT09ITF8fDI9PT1iKSlyZXR1cm4gQy5hYm9ydCgpO3c9ImFib3J0Ijtmb3IoaSBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSlDW2ldKHBbaV0pO2lmKHU9cW4oam4scCxuLEMpKXtDLnJlYWR5U3RhdGU9MSxsJiZkLnRyaWdnZXIoImFqYXhTZW5kIixbQyxwXSkscC5hc3luYyYmcC50aW1lb3V0PjAmJihzPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtDLmFib3J0KCJ0aW1lb3V0Iil9LHAudGltZW91dCkpO3RyeXtiPTEsdS5zZW5kKHksayl9Y2F0Y2goTil7aWYoISgyPmIpKXRocm93IE47aygtMSxOKX19ZWxzZSBrKC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiBrKGUsbixyLGkpe3ZhciBjLHksdix3LFQsTj1uOzIhPT1iJiYoYj0yLHMmJmNsZWFyVGltZW91dChzKSx1PXQsYT1pfHwiIixDLnJlYWR5U3RhdGU9ZT4wPzQ6MCxjPWU+PTIwMCYmMzAwPmV8fDMwND09PWUsciYmKHc9TW4ocCxDLHIpKSx3PU9uKHAsdyxDLGMpLGM/KHAuaWZNb2RpZmllZCYmKFQ9Qy5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLFQmJih4Lmxhc3RNb2RpZmllZFtvXT1UKSxUPUMuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSxUJiYoeC5ldGFnW29dPVQpKSwyMDQ9PT1lfHwiSEVBRCI9PT1wLnR5cGU/Tj0ibm9jb250ZW50IjozMDQ9PT1lP049Im5vdG1vZGlmaWVkIjooTj13LnN0YXRlLHk9dy5kYXRhLHY9dy5lcnJvcixjPSF2KSk6KHY9TiwoZXx8IU4pJiYoTj0iZXJyb3IiLDA+ZSYmKGU9MCkpKSxDLnN0YXR1cz1lLEMuc3RhdHVzVGV4dD0obnx8TikrIiIsYz9oLnJlc29sdmVXaXRoKGYsW3ksTixDXSk6aC5yZWplY3RXaXRoKGYsW0MsTix2XSksQy5zdGF0dXNDb2RlKG0pLG09dCxsJiZkLnRyaWdnZXIoYz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFtDLHAsYz95OnZdKSxnLmZpcmVXaXRoKGYsW0MsTl0pLGwmJihkLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW0MscF0pLC0teC5hY3RpdmV8fHguZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiBDfSxnZXRKU09OOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4geC5nZXQoZSx0LG4sImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGUsbil7cmV0dXJuIHguZ2V0KGUsdCxuLCJzY3JpcHQiKX19KSx4LmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSxuKXt4W25dPWZ1bmN0aW9uKGUscixpLG8pe3JldHVybiB4LmlzRnVuY3Rpb24ocikmJihvPW98fGksaT1yLHI9dCkseC5hamF4KHt1cmw6ZSx0eXBlOm4sZGF0YVR5cGU6byxkYXRhOnIsc3VjY2VzczppfSl9fSk7ZnVuY3Rpb24gTW4oZSxuLHIpe3ZhciBpLG8sYSxzLGw9ZS5jb250ZW50cyx1PWUuZGF0YVR5cGVzO3doaWxlKCIqIj09PXVbMF0pdS5zaGlmdCgpLG89PT10JiYobz1lLm1pbWVUeXBlfHxuLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYobylmb3IocyBpbiBsKWlmKGxbc10mJmxbc10udGVzdChvKSl7dS51bnNoaWZ0KHMpO2JyZWFrfWlmKHVbMF1pbiByKWE9dVswXTtlbHNle2ZvcihzIGluIHIpe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbcysiICIrdVswXV0pe2E9czticmVha31pfHwoaT1zKX1hPWF8fGl9cmV0dXJuIGE/KGEhPT11WzBdJiZ1LnVuc2hpZnQoYSksclthXSk6dH1mdW5jdGlvbiBPbihlLHQsbixyKXt2YXIgaSxvLGEscyxsLHU9e30sYz1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGNbMV0pZm9yKGEgaW4gZS5jb252ZXJ0ZXJzKXVbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07bz1jLnNoaWZ0KCk7d2hpbGUobylpZihlLnJlc3BvbnNlRmllbGRzW29dJiYobltlLnJlc3BvbnNlRmllbGRzW29dXT10KSwhbCYmciYmZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSksbD1vLG89Yy5zaGlmdCgpKWlmKCIqIj09PW8pbz1sO2Vsc2UgaWYoIioiIT09bCYmbCE9PW8pe2lmKGE9dVtsKyIgIitvXXx8dVsiKiAiK29dLCFhKWZvcihpIGluIHUpaWYocz1pLnNwbGl0KCIgIiksc1sxXT09PW8mJihhPXVbbCsiICIrc1swXV18fHVbIiogIitzWzBdXSkpe2E9PT0hMD9hPXVbaV06dVtpXSE9PSEwJiYobz1zWzBdLGMudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoYSE9PSEwKWlmKGEmJmVbInRocm93cyJdKXQ9YSh0KTtlbHNlIHRyeXt0PWEodCl9Y2F0Y2gocCl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT9wOiJObyBjb252ZXJzaW9uIGZyb20gIitsKyIgdG8gIitvfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOnR9fXguYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovKD86amF2YXxlY21hKXNjcmlwdC99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIHguZ2xvYmFsRXZhbChlKSxlfX19KSx4LmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oZSl7ZS5jYWNoZT09PXQmJihlLmNhY2hlPSExKSxlLmNyb3NzRG9tYWluJiYoZS50eXBlPSJHRVQiLGUuZ2xvYmFsPSExKX0pLHguYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihlKXtpZihlLmNyb3NzRG9tYWluKXt2YXIgbixyPWEuaGVhZHx8eCgiaGVhZCIpWzBdfHxhLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbih0LGkpe249YS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxuLmFzeW5jPSEwLGUuc2NyaXB0Q2hhcnNldCYmKG4uY2hhcnNldD1lLnNjcmlwdENoYXJzZXQpLG4uc3JjPWUudXJsLG4ub25sb2FkPW4ub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGUsdCl7KHR8fCFuLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3Qobi5yZWFkeVN0YXRlKSkmJihuLm9ubG9hZD1uLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLG4ucGFyZW50Tm9kZSYmbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pLG49bnVsbCx0fHxpKDIwMCwic3VjY2VzcyIpKX0sci5pbnNlcnRCZWZvcmUobixyLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe24mJm4ub25sb2FkKHQsITApfX19fSk7dmFyIEZuPVtdLEJuPS8oPSlcPyg/PSZ8JCl8XD9cPy87eC5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPUZuLnBvcCgpfHx4LmV4cGFuZG8rIl8iK3ZuKys7cmV0dXJuIHRoaXNbZV09ITAsZX19KSx4LmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKG4scixpKXt2YXIgbyxhLHMsbD1uLmpzb25wIT09ITEmJihCbi50ZXN0KG4udXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIG4uZGF0YSYmIShuLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJkJuLnRlc3Qobi5kYXRhKSYmImRhdGEiKTtyZXR1cm4gbHx8Impzb25wIj09PW4uZGF0YVR5cGVzWzBdPyhvPW4uanNvbnBDYWxsYmFjaz14LmlzRnVuY3Rpb24obi5qc29ucENhbGxiYWNrKT9uLmpzb25wQ2FsbGJhY2soKTpuLmpzb25wQ2FsbGJhY2ssbD9uW2xdPW5bbF0ucmVwbGFjZShCbiwiJDEiK28pOm4uanNvbnAhPT0hMSYmKG4udXJsKz0oYm4udGVzdChuLnVybCk/IiYiOiI/Iikrbi5qc29ucCsiPSIrbyksbi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIHN8fHguZXJyb3IobysiIHdhcyBub3QgY2FsbGVkIiksc1swXX0sbi5kYXRhVHlwZXNbMF09Impzb24iLGE9ZVtvXSxlW29dPWZ1bmN0aW9uKCl7cz1hcmd1bWVudHN9LGkuYWx3YXlzKGZ1bmN0aW9uKCl7ZVtvXT1hLG5bb10mJihuLmpzb25wQ2FsbGJhY2s9ci5qc29ucENhbGxiYWNrLEZuLnB1c2gobykpLHMmJnguaXNGdW5jdGlvbihhKSYmYShzWzBdKSxzPWE9dH0pLCJzY3JpcHQiKTp0fSk7dmFyIFBuLFJuLFduPTAsJG49ZS5BY3RpdmVYT2JqZWN0JiZmdW5jdGlvbigpe3ZhciBlO2ZvcihlIGluIFBuKVBuW2VdKHQsITApfTtmdW5jdGlvbiBJbigpe3RyeXtyZXR1cm4gbmV3IGUuWE1MSHR0cFJlcXVlc3R9Y2F0Y2godCl7fX1mdW5jdGlvbiB6bigpe3RyeXtyZXR1cm4gbmV3IGUuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaCh0KXt9fXguYWpheFNldHRpbmdzLnhocj1lLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0xvY2FsJiZJbigpfHx6bigpfTpJbixSbj14LmFqYXhTZXR0aW5ncy54aHIoKSx4LnN1cHBvcnQuY29ycz0hIVJuJiYid2l0aENyZWRlbnRpYWxzImluIFJuLFJuPXguc3VwcG9ydC5hamF4PSEhUm4sUm4mJnguYWpheFRyYW5zcG9ydChmdW5jdGlvbihuKXtpZighbi5jcm9zc0RvbWFpbnx8eC5zdXBwb3J0LmNvcnMpe3ZhciByO3JldHVybntzZW5kOmZ1bmN0aW9uKGksbyl7dmFyIGEscyxsPW4ueGhyKCk7aWYobi51c2VybmFtZT9sLm9wZW4obi50eXBlLG4udXJsLG4uYXN5bmMsbi51c2VybmFtZSxuLnBhc3N3b3JkKTpsLm9wZW4obi50eXBlLG4udXJsLG4uYXN5bmMpLG4ueGhyRmllbGRzKWZvcihzIGluIG4ueGhyRmllbGRzKWxbc109bi54aHJGaWVsZHNbc107bi5taW1lVHlwZSYmbC5vdmVycmlkZU1pbWVUeXBlJiZsLm92ZXJyaWRlTWltZVR5cGUobi5taW1lVHlwZSksbi5jcm9zc0RvbWFpbnx8aVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoaVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO3RyeXtmb3IocyBpbiBpKWwuc2V0UmVxdWVzdEhlYWRlcihzLGlbc10pfWNhdGNoKHUpe31sLnNlbmQobi5oYXNDb250ZW50JiZuLmRhdGF8fG51bGwpLHI9ZnVuY3Rpb24oZSxpKXt2YXIgcyx1LGMscDt0cnl7aWYociYmKGl8fDQ9PT1sLnJlYWR5U3RhdGUpKWlmKHI9dCxhJiYobC5vbnJlYWR5c3RhdGVjaGFuZ2U9eC5ub29wLCRuJiZkZWxldGUgUG5bYV0pLGkpNCE9PWwucmVhZHlTdGF0ZSYmbC5hYm9ydCgpO2Vsc2V7cD17fSxzPWwuc3RhdHVzLHU9bC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSwic3RyaW5nIj09dHlwZW9mIGwucmVzcG9uc2VUZXh0JiYocC50ZXh0PWwucmVzcG9uc2VUZXh0KTt0cnl7Yz1sLnN0YXR1c1RleHR9Y2F0Y2goZil7Yz0iIn1zfHwhbi5pc0xvY2FsfHxuLmNyb3NzRG9tYWluPzEyMjM9PT1zJiYocz0yMDQpOnM9cC50ZXh0PzIwMDo0MDR9fWNhdGNoKGQpe2l8fG8oLTEsZCl9cCYmbyhzLGMscCx1KX0sbi5hc3luYz80PT09bC5yZWFkeVN0YXRlP3NldFRpbWVvdXQocik6KGE9KytXbiwkbiYmKFBufHwoUG49e30seChlKS51bmxvYWQoJG4pKSxQblthXT1yKSxsLm9ucmVhZHlzdGF0ZWNoYW5nZT1yKTpyKCl9LGFib3J0OmZ1bmN0aW9uKCl7ciYmcih0LCEwKX19fX0pO3ZhciBYbixVbixWbj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sWW49UmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrdysiKShbYS16JV0qKSQiLCJpIiksSm49L3F1ZXVlSG9va3MkLyxHbj1bbnJdLFFuPXsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpLHI9bi5jdXIoKSxpPVluLmV4ZWModCksbz1pJiZpWzNdfHwoeC5jc3NOdW1iZXJbZV0/IiI6InB4IiksYT0oeC5jc3NOdW1iZXJbZV18fCJweCIhPT1vJiYrcikmJlluLmV4ZWMoeC5jc3Mobi5lbGVtLGUpKSxzPTEsbD0yMDtpZihhJiZhWzNdIT09byl7bz1vfHxhWzNdLGk9aXx8W10sYT0rcnx8MTtkbyBzPXN8fCIuNSIsYS89cyx4LnN0eWxlKG4uZWxlbSxlLGErbyk7d2hpbGUocyE9PShzPW4uY3VyKCkvcikmJjEhPT1zJiYtLWwpfXJldHVybiBpJiYoYT1uLnN0YXJ0PSthfHwrcnx8MCxuLnVuaXQ9byxuLmVuZD1pWzFdP2ErKGlbMV0rMSkqaVsyXToraVsyXSksbn1dfTtmdW5jdGlvbiBLbigpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7WG49dH0pLFhuPXgubm93KCl9ZnVuY3Rpb24gWm4oZSx0LG4pe3ZhciByLGk9KFFuW3RdfHxbXSkuY29uY2F0KFFuWyIqIl0pLG89MCxhPWkubGVuZ3RoO2Zvcig7YT5vO28rKylpZihyPWlbb10uY2FsbChuLHQsZSkpcmV0dXJuIHJ9ZnVuY3Rpb24gZXIoZSx0LG4pe3ZhciByLGksbz0wLGE9R24ubGVuZ3RoLHM9eC5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBsLmVsZW19KSxsPWZ1bmN0aW9uKCl7aWYoaSlyZXR1cm4hMTt2YXIgdD1Ybnx8S24oKSxuPU1hdGgubWF4KDAsdS5zdGFydFRpbWUrdS5kdXJhdGlvbi10KSxyPW4vdS5kdXJhdGlvbnx8MCxvPTEtcixhPTAsbD11LnR3ZWVucy5sZW5ndGg7Zm9yKDtsPmE7YSsrKXUudHdlZW5zW2FdLnJ1bihvKTtyZXR1cm4gcy5ub3RpZnlXaXRoKGUsW3UsbyxuXSksMT5vJiZsP246KHMucmVzb2x2ZVdpdGgoZSxbdV0pLCExKX0sdT1zLnByb21pc2Uoe2VsZW06ZSxwcm9wczp4LmV4dGVuZCh7fSx0KSxvcHRzOnguZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxuKSxvcmlnaW5hbFByb3BlcnRpZXM6dCxvcmlnaW5hbE9wdGlvbnM6bixzdGFydFRpbWU6WG58fEtuKCksZHVyYXRpb246bi5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgcj14LlR3ZWVuKGUsdS5vcHRzLHQsbix1Lm9wdHMuc3BlY2lhbEVhc2luZ1t0XXx8dS5vcHRzLmVhc2luZyk7cmV0dXJuIHUudHdlZW5zLnB1c2gocikscn0sc3RvcDpmdW5jdGlvbih0KXt2YXIgbj0wLHI9dD91LnR3ZWVucy5sZW5ndGg6MDtpZihpKXJldHVybiB0aGlzO2ZvcihpPSEwO3I+bjtuKyspdS50d2VlbnNbbl0ucnVuKDEpO3JldHVybiB0P3MucmVzb2x2ZVdpdGgoZSxbdSx0XSk6cy5yZWplY3RXaXRoKGUsW3UsdF0pLHRoaXN9fSksYz11LnByb3BzO2Zvcih0cihjLHUub3B0cy5zcGVjaWFsRWFzaW5nKTthPm87bysrKWlmKHI9R25bb10uY2FsbCh1LGUsYyx1Lm9wdHMpKXJldHVybiByO3JldHVybiB4Lm1hcChjLFpuLHUpLHguaXNGdW5jdGlvbih1Lm9wdHMuc3RhcnQpJiZ1Lm9wdHMuc3RhcnQuY2FsbChlLHUpLHguZngudGltZXIoeC5leHRlbmQobCx7ZWxlbTplLGFuaW06dSxxdWV1ZTp1Lm9wdHMucXVldWV9KSksdS5wcm9ncmVzcyh1Lm9wdHMucHJvZ3Jlc3MpLmRvbmUodS5vcHRzLmRvbmUsdS5vcHRzLmNvbXBsZXRlKS5mYWlsKHUub3B0cy5mYWlsKS5hbHdheXModS5vcHRzLmFsd2F5cyl9ZnVuY3Rpb24gdHIoZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYocj14LmNhbWVsQ2FzZShuKSxpPXRbcl0sbz1lW25dLHguaXNBcnJheShvKSYmKGk9b1sxXSxvPWVbbl09b1swXSksbiE9PXImJihlW3JdPW8sZGVsZXRlIGVbbl0pLGE9eC5jc3NIb29rc1tyXSxhJiYiZXhwYW5kImluIGEpe289YS5leHBhbmQobyksZGVsZXRlIGVbcl07Zm9yKG4gaW4gbyluIGluIGV8fChlW25dPW9bbl0sdFtuXT1pKX1lbHNlIHRbcl09aX14LkFuaW1hdGlvbj14LmV4dGVuZChlcix7dHdlZW5lcjpmdW5jdGlvbihlLHQpe3guaXNGdW5jdGlvbihlKT8odD1lLGU9WyIqIl0pOmU9ZS5zcGxpdCgiICIpO3ZhciBuLHI9MCxpPWUubGVuZ3RoO2Zvcig7aT5yO3IrKyluPWVbcl0sUW5bbl09UW5bbl18fFtdLFFuW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcjpmdW5jdGlvbihlLHQpe3Q/R24udW5zaGlmdChlKTpHbi5wdXNoKGUpfX0pO2Z1bmN0aW9uIG5yKGUsdCxuKXt2YXIgcixpLG8sYSxzLGwsdT10aGlzLGM9e30scD1lLnN0eWxlLGY9ZS5ub2RlVHlwZSYmbm4oZSksZD14Ll9kYXRhKGUsImZ4c2hvdyIpO24ucXVldWV8fChzPXguX3F1ZXVlSG9va3MoZSwiZngiKSxudWxsPT1zLnVucXVldWVkJiYocy51bnF1ZXVlZD0wLGw9cy5lbXB0eS5maXJlLHMuZW1wdHkuZmlyZT1mdW5jdGlvbigpe3MudW5xdWV1ZWR8fGwoKX0pLHMudW5xdWV1ZWQrKyx1LmFsd2F5cyhmdW5jdGlvbigpe3UuYWx3YXlzKGZ1bmN0aW9uKCl7cy51bnF1ZXVlZC0tLHgucXVldWUoZSwiZngiKS5sZW5ndGh8fHMuZW1wdHkuZmlyZSgpfSl9KSksMT09PWUubm9kZVR5cGUmJigiaGVpZ2h0ImluIHR8fCJ3aWR0aCJpbiB0KSYmKG4ub3ZlcmZsb3c9W3Aub3ZlcmZsb3cscC5vdmVyZmxvd1gscC5vdmVyZmxvd1ldLCJpbmxpbmUiPT09eC5jc3MoZSwiZGlzcGxheSIpJiYibm9uZSI9PT14LmNzcyhlLCJmbG9hdCIpJiYoeC5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQmJiJpbmxpbmUiIT09bG4oZS5ub2RlTmFtZSk/cC56b29tPTE6cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIseC5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3N8fHUuYWx3YXlzKGZ1bmN0aW9uKCl7cC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKTtmb3IociBpbiB0KWlmKGk9dFtyXSxWbi5leGVjKGkpKXtpZihkZWxldGUgdFtyXSxvPW98fCJ0b2dnbGUiPT09aSxpPT09KGY/ImhpZGUiOiJzaG93IikpY29udGludWU7Y1tyXT1kJiZkW3JdfHx4LnN0eWxlKGUscil9aWYoIXguaXNFbXB0eU9iamVjdChjKSl7ZD8iaGlkZGVuImluIGQmJihmPWQuaGlkZGVuKTpkPXguX2RhdGEoZSwiZnhzaG93Iix7fSksbyYmKGQuaGlkZGVuPSFmKSxmP3goZSkuc2hvdygpOnUuZG9uZShmdW5jdGlvbigpe3goZSkuaGlkZSgpfSksdS5kb25lKGZ1bmN0aW9uKCl7dmFyIHQ7eC5fcmVtb3ZlRGF0YShlLCJmeHNob3ciKTtmb3IodCBpbiBjKXguc3R5bGUoZSx0LGNbdF0pfSk7Zm9yKHIgaW4gYylhPVpuKGY/ZFtyXTowLHIsdSksciBpbiBkfHwoZFtyXT1hLnN0YXJ0LGYmJihhLmVuZD1hLnN0YXJ0LGEuc3RhcnQ9IndpZHRoIj09PXJ8fCJoZWlnaHQiPT09cj8xOjApKX19ZnVuY3Rpb24gcnIoZSx0LG4scixpKXtyZXR1cm4gbmV3IHJyLnByb3RvdHlwZS5pbml0KGUsdCxuLHIsaSl9eC5Ud2Vlbj1ycixyci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnJyLGluaXQ6ZnVuY3Rpb24oZSx0LG4scixpLG8pe3RoaXMuZWxlbT1lLHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPWl8fCJzd2luZyIsdGhpcy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PW98fCh4LmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGU9cnIucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGUmJmUuZ2V0P2UuZ2V0KHRoaXMpOnJyLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihlKXt2YXIgdCxuPXJyLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLnBvcz10PXRoaXMub3B0aW9ucy5kdXJhdGlvbj94LmVhc2luZ1t0aGlzLmVhc2luZ10oZSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qZSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTplLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0K3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLG4mJm4uc2V0P24uc2V0KHRoaXMpOnJyLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LHJyLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1yci5wcm90b3R5cGUscnIucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBudWxsPT1lLmVsZW1bZS5wcm9wXXx8ZS5lbGVtLnN0eWxlJiZudWxsIT1lLmVsZW0uc3R5bGVbZS5wcm9wXT8odD14LmNzcyhlLmVsZW0sZS5wcm9wLCIiKSx0JiYiYXV0byIhPT10P3Q6MCk6ZS5lbGVtW2UucHJvcF19LHNldDpmdW5jdGlvbihlKXt4LmZ4LnN0ZXBbZS5wcm9wXT94LmZ4LnN0ZXBbZS5wcm9wXShlKTplLmVsZW0uc3R5bGUmJihudWxsIT1lLmVsZW0uc3R5bGVbeC5jc3NQcm9wc1tlLnByb3BdXXx8eC5jc3NIb29rc1tlLnByb3BdKT94LnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KTplLmVsZW1bZS5wcm9wXT1lLm5vd319fSxyci5wcm9wSG9va3Muc2Nyb2xsVG9wPXJyLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LHguZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24oZSx0KXt2YXIgbj14LmZuW3RdO3guZm5bdF09ZnVuY3Rpb24oZSxyLGkpe3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PXR5cGVvZiBlP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShpcih0LCEwKSxlLHIsaSl9fSkseC5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIobm4pLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXguaXNFbXB0eU9iamVjdChlKSxvPXguc3BlZWQodCxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgdD1lcih0aGlzLHguZXh0ZW5kKHt9LGUpLG8pOyhpfHx4Ll9kYXRhKHRoaXMsImZpbmlzaCIpKSYmdC5zdG9wKCEwKX07cmV0dXJuIGEuZmluaXNoPWEsaXx8by5xdWV1ZT09PSExP3RoaXMuZWFjaChhKTp0aGlzLnF1ZXVlKG8ucXVldWUsYSl9LHN0b3A6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RvcDtkZWxldGUgZS5zdG9wLHQocil9O3JldHVybiJzdHJpbmciIT10eXBlb2YgZSYmKHI9bixuPWUsZT10KSxuJiZlIT09ITEmJnRoaXMucXVldWUoZXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ITAsbj1udWxsIT1lJiZlKyJxdWV1ZUhvb2tzIixvPXgudGltZXJzLGE9eC5fZGF0YSh0aGlzKTtpZihuKWFbbl0mJmFbbl0uc3RvcCYmaShhW25dKTtlbHNlIGZvcihuIGluIGEpYVtuXSYmYVtuXS5zdG9wJiZKbi50ZXN0KG4pJiZpKGFbbl0pO2ZvcihuPW8ubGVuZ3RoO24tLTspb1tuXS5lbGVtIT09dGhpc3x8bnVsbCE9ZSYmb1tuXS5xdWV1ZSE9PWV8fChvW25dLmFuaW0uc3RvcChyKSx0PSExLG8uc3BsaWNlKG4sMSkpOyh0fHwhcikmJnguZGVxdWV1ZSh0aGlzLGUpfSl9LGZpbmlzaDpmdW5jdGlvbihlKXtyZXR1cm4gZSE9PSExJiYoZT1lfHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdCxuPXguX2RhdGEodGhpcykscj1uW2UrInF1ZXVlIl0saT1uW2UrInF1ZXVlSG9va3MiXSxvPXgudGltZXJzLGE9cj9yLmxlbmd0aDowO2ZvcihuLmZpbmlzaD0hMCx4LnF1ZXVlKHRoaXMsZSxbXSksaSYmaS5zdG9wJiZpLnN0b3AuY2FsbCh0aGlzLCEwKSx0PW8ubGVuZ3RoO3QtLTspb1t0XS5lbGVtPT09dGhpcyYmb1t0XS5xdWV1ZT09PWUmJihvW3RdLmFuaW0uc3RvcCghMCksby5zcGxpY2UodCwxKSk7Zm9yKHQ9MDthPnQ7dCsrKXJbdF0mJnJbdF0uZmluaXNoJiZyW3RdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSBuLmZpbmlzaH0pfX0pO2Z1bmN0aW9uIGlyKGUsdCl7dmFyIG4scj17aGVpZ2h0OmV9LGk9MDtmb3IodD10PzE6MDs0Pmk7aSs9Mi10KW49WnRbaV0sclsibWFyZ2luIituXT1yWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoci5vcGFjaXR5PXIud2lkdGg9ZSkscn14LmVhY2goe3NsaWRlRG93bjppcigic2hvdyIpLHNsaWRlVXA6aXIoImhpZGUiKSxzbGlkZVRvZ2dsZTppcigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe3guZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSkseC5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP3guZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8eC5pc0Z1bmN0aW9uKGUpJiZlLGR1cmF0aW9uOmUsZWFzaW5nOm4mJnR8fHQmJiF4LmlzRnVuY3Rpb24odCkmJnR9O3JldHVybiByLmR1cmF0aW9uPXguZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiByLmR1cmF0aW9uP3IuZHVyYXRpb246ci5kdXJhdGlvbiBpbiB4LmZ4LnNwZWVkcz94LmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTp4LmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ci5xdWV1ZXx8ci5xdWV1ZT09PSEwKSYmKHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7eC5pc0Z1bmN0aW9uKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZ4LmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0seC5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc3dpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuLjUtTWF0aC5jb3MoZSpNYXRoLlBJKS8yfX0seC50aW1lcnM9W10seC5meD1yci5wcm90b3R5cGUuaW5pdCx4LmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSxuPXgudGltZXJzLHI9MDtmb3IoWG49eC5ub3coKTtuLmxlbmd0aD5yO3IrKyllPW5bcl0sZSgpfHxuW3JdIT09ZXx8bi5zcGxpY2Uoci0tLDEpO24ubGVuZ3RofHx4LmZ4LnN0b3AoKSxYbj10fSx4LmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe2UoKSYmeC50aW1lcnMucHVzaChlKSYmeC5meC5zdGFydCgpfSx4LmZ4LmludGVydmFsPTEzLHguZnguc3RhcnQ9ZnVuY3Rpb24oKXtVbnx8KFVuPXNldEludGVydmFsKHguZngudGljayx4LmZ4LmludGVydmFsKSl9LHguZnguc3RvcD1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoVW4pLFVuPW51bGx9LHguZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHguZnguc3RlcD17fSx4LmV4cHImJnguZXhwci5maWx0ZXJzJiYoeC5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHguZ3JlcCh4LnRpbWVycyxmdW5jdGlvbih0KXtyZXR1cm4gZT09PXQuZWxlbX0pLmxlbmd0aH0pLHguZm4ub2Zmc2V0PWZ1bmN0aW9uKGUpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGU9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3gub2Zmc2V0LnNldE9mZnNldCh0aGlzLGUsdCl9KTt2YXIgbixyLG89e3RvcDowLGxlZnQ6MH0sYT10aGlzWzBdLHM9YSYmYS5vd25lckRvY3VtZW50O2lmKHMpcmV0dXJuIG49cy5kb2N1bWVudEVsZW1lbnQseC5jb250YWlucyhuLGEpPyh0eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QhPT1pJiYobz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxyPW9yKHMpLHt0b3A6by50b3ArKHIucGFnZVlPZmZzZXR8fG4uc2Nyb2xsVG9wKS0obi5jbGllbnRUb3B8fDApLGxlZnQ6by5sZWZ0KyhyLnBhZ2VYT2Zmc2V0fHxuLnNjcm9sbExlZnQpLShuLmNsaWVudExlZnR8fDApfSk6b30seC5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHI9eC5jc3MoZSwicG9zaXRpb24iKTsic3RhdGljIj09PXImJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBpPXgoZSksbz1pLm9mZnNldCgpLGE9eC5jc3MoZSwidG9wIikscz14LmNzcyhlLCJsZWZ0IiksbD0oImFic29sdXRlIj09PXJ8fCJmaXhlZCI9PT1yKSYmeC5pbkFycmF5KCJhdXRvIixbYSxzXSk+LTEsdT17fSxjPXt9LHAsZjtsPyhjPWkucG9zaXRpb24oKSxwPWMudG9wLGY9Yy5sZWZ0KToocD1wYXJzZUZsb2F0KGEpfHwwLGY9cGFyc2VGbG9hdChzKXx8MCkseC5pc0Z1bmN0aW9uKHQpJiYodD10LmNhbGwoZSxuLG8pKSxudWxsIT10LnRvcCYmKHUudG9wPXQudG9wLW8udG9wK3ApLG51bGwhPXQubGVmdCYmKHUubGVmdD10LmxlZnQtby5sZWZ0K2YpLCJ1c2luZyJpbiB0P3QudXNpbmcuY2FsbChlLHUpOmkuY3NzKHUpfX0seC5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuPXt0b3A6MCxsZWZ0OjB9LHI9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09eC5jc3MociwicG9zaXRpb24iKT90PXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGU9dGhpcy5vZmZzZXRQYXJlbnQoKSx0PXRoaXMub2Zmc2V0KCkseC5ub2RlTmFtZShlWzBdLCJodG1sIil8fChuPWUub2Zmc2V0KCkpLG4udG9wKz14LmNzcyhlWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLG4ubGVmdCs9eC5jc3MoZVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6dC50b3Atbi50b3AteC5jc3MociwibWFyZ2luVG9wIiwhMCksbGVmdDp0LmxlZnQtbi5sZWZ0LXguY3NzKHIsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9mZnNldFBhcmVudHx8czt3aGlsZShlJiYheC5ub2RlTmFtZShlLCJodG1sIikmJiJzdGF0aWMiPT09eC5jc3MoZSwicG9zaXRpb24iKSllPWUub2Zmc2V0UGFyZW50O3JldHVybiBlfHxzfSl9fSkseC5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGUsbil7dmFyIHI9L1kvLnRlc3Qobik7eC5mbltlXT1mdW5jdGlvbihpKXtyZXR1cm4geC5hY2Nlc3ModGhpcyxmdW5jdGlvbihlLGksbyl7dmFyIGE9b3IoZSk7cmV0dXJuIG89PT10P2E/biBpbiBhP2Fbbl06YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbaV06ZVtpXTooYT9hLnNjcm9sbFRvKHI/eChhKS5zY3JvbGxMZWZ0KCk6byxyP286eChhKS5zY3JvbGxUb3AoKSk6ZVtpXT1vLHQpfSxlLGksYXJndW1lbnRzLmxlbmd0aCxudWxsKX19KTtmdW5jdGlvbiBvcihlKXtyZXR1cm4geC5pc1dpbmRvdyhlKT9lOjk9PT1lLm5vZGVUeXBlP2UuZGVmYXVsdFZpZXd8fGUucGFyZW50V2luZG93OiExfXguZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsbil7eC5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50Om4sIiI6Im91dGVyIitlfSxmdW5jdGlvbihyLGkpe3guZm5baV09ZnVuY3Rpb24oaSxvKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoJiYocnx8ImJvb2xlYW4iIT10eXBlb2YgaSkscz1yfHwoaT09PSEwfHxvPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKG4scixpKXt2YXIgbztyZXR1cm4geC5pc1dpbmRvdyhuKT9uLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitlXTo5PT09bi5ub2RlVHlwZT8obz1uLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChuLmJvZHlbInNjcm9sbCIrZV0sb1sic2Nyb2xsIitlXSxuLmJvZHlbIm9mZnNldCIrZV0sb1sib2Zmc2V0IitlXSxvWyJjbGllbnQiK2VdKSk6aT09PXQ/eC5jc3MobixyLHMpOnguc3R5bGUobixyLGkscyl9LG4sYT9pOnQsYSxudWxsKX19KX0pLHguZm4uc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0seC5mbi5hbmRTZWxmPXguZm4uYWRkQmFjaywib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPXg6KGUualF1ZXJ5PWUuJD14LCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB4fSkpfSkod2luZG93KTsKCmZ1bmN0aW9uIHRfb25SZWFkeSh0KXsibG9hZGluZyIhPWRvY3VtZW50LnJlYWR5U3RhdGU/dCgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHQpfWZ1bmN0aW9uIHRfYWRkQ2xhc3ModCxlKXtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdD90LmNsYXNzTGlzdC5hZGQoZSk6dC5jbGFzc05hbWUrPSh0LmNsYXNzTmFtZT8iICI6IiIpK2V9ZnVuY3Rpb24gdF9yZW1vdmVDbGFzcyh0LGUpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0P3QuY2xhc3NMaXN0LnJlbW92ZShlKTp0LmNsYXNzTmFtZT10LmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoIihefFxccyspIitlKyIoXFxzK3wkKSIpLCIgIikucmVwbGFjZSgvXlxzKy8sIiIpLnJlcGxhY2UoL1xzKyQvLCIiKX1mdW5jdGlvbiB0X3JlbW92ZUVsKHQpe3QmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfWZ1bmN0aW9uIHRfb3V0ZXJXaWR0aCh0KXt2YXIgZT1nZXRDb21wdXRlZFN0eWxlKHQpLG49ZS53aWR0aCxvPWUubWFyZ2luTGVmdCxpPWUubWFyZ2luUmlnaHQ7cmV0dXJuImF1dG8iPT09biYmKG49MCksImF1dG8iPT09byYmKG89MCksImF1dG8iPT09aSYmKGk9MCksbj1wYXJzZUludChuKStwYXJzZUludChvKStwYXJzZUludChpKX12YXIgdmVyc2lvbix2ZXJzaW9uOyh3aW5kb3cuaXNTZWFyY2hCb3Q9ITEsL0JvdC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJih3aW5kb3cuaXNTZWFyY2hCb3Q9ITApLHdpbmRvdy5pc01vYmlsZT0hMSx3aW5kb3cuJGlzTW9iaWxlPSExLC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKHdpbmRvdy5pc01vYmlsZT0hMCx3aW5kb3cuJGlzTW9iaWxlPSEwKSx3aW5kb3cuaXNUYWJsZXQ9LyhpcGFkfHRhYmxldHwoYW5kcm9pZCg/IS4qbW9iaWxlKSl8KHdpbmRvd3MoPyEuKnBob25lKSguKnRvdWNoKSl8a2luZGxlfHBsYXlib29rfHNpbGt8KHB1ZmZpbig/IS4qKElQfEFQfFdQKSkpKS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksd2luZG93LmlzaU9TPSExLC9pUGhvbmV8aVBhZHxpUG9kL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKHdpbmRvdy5pc2lPUz0hMCksd2luZG93LmlzaU9TQ2hyb21lPSEhbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiQ3JpT1MiKSx3aW5kb3cuaXNGaXJlZm94PS9maXJlZm94L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx3aW5kb3cuaXNPcGVyYT0hIXdpbmRvdy5vcHImJiEhd2luZG93Lm9wci5hZGRvbnN8fCEhd2luZG93Lm9wZXJhfHxuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIiBPUFIvIik+PTAsd2luZG93LmlzaU9TVmVyc2lvbj0iIix3aW5kb3cuaXNpT1MpJiYobnVsbCE9PSh2ZXJzaW9uPW5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9PUyAoXGQrKV8oXGQrKV8/KFxkKyk/LykpJiYod2luZG93LmlzaU9TVmVyc2lvbj1bcGFyc2VJbnQodmVyc2lvblsxXSwxMCkscGFyc2VJbnQodmVyc2lvblsyXSwxMCkscGFyc2VJbnQodmVyc2lvblszXXx8MCwxMCldKSk7KHdpbmRvdy5pc1NhZmFyaT0hMSwvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYod2luZG93LmlzU2FmYXJpPSEwKSx3aW5kb3cuaXNJRT0hIWRvY3VtZW50LmRvY3VtZW50TW9kZSx3aW5kb3cuaXNTYWZhcmlWZXJzaW9uPSIiLHdpbmRvdy5pc1NhZmFyaSkmJihudWxsIT09KHZlcnNpb249bmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL1ZlcnNpb25cLyhcZCspXC4oXGQrKVwuPyhcZCspPyBTYWZhcmkvKSkmJih3aW5kb3cuaXNTYWZhcmlWZXJzaW9uPVtwYXJzZUludCh2ZXJzaW9uWzFdLDEwKSxwYXJzZUludCh2ZXJzaW9uWzJdLDEwKSxwYXJzZUludCh2ZXJzaW9uWzNdfHwwLDEwKV0pKTtmdW5jdGlvbiB0X3Rocm90dGxlKHQsZSxuKXt2YXIgbyxpO3JldHVybiBlfHwoZT0yNTApLGZ1bmN0aW9uKCl7dmFyIHI9bnx8dGhpcyxhPStuZXcgRGF0ZSxsPWFyZ3VtZW50cztvJiZhPG8rZT8oY2xlYXJUaW1lb3V0KGkpLGk9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtvPWEsdC5hcHBseShyLGwpfSksZSkpOihvPWEsdC5hcHBseShyLGwpKX19ZnVuY3Rpb24gdF9vbkZ1bmNMb2FkKHQsZSxuKXt2YXIgbz0xNWUzLGk9dF9jaGVja0lzRWRpdE1vZGUoKSxyPWZ1bmN0aW9uIHQoKXtyZXR1cm4haXx8aSYmdF9jaGVja0VkaXRvcklzUmVhZHkoKX0sYT1mdW5jdGlvbiB0KGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3dbZV18fCJvYmplY3QiPT10eXBlb2Ygd2luZG93W2VdfTtpZihhKHQpJiZyKCkpZSgpO2Vsc2V7dmFyIGw9RGF0ZS5ub3coKSxkPW5ldyBFcnJvcih0KyIgaXMgdW5kZWZpbmVkIikscz1mdW5jdGlvbiB0KCl7dGhyb3cgZH07c2V0VGltZW91dCgoZnVuY3Rpb24gaSgpe3ZhciBkPURhdGUubm93KCk7YSh0KSYmcigpP2UoKTooImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGUmJmQtbD5vJiYhYSh0KSYmcygpLHNldFRpbWVvdXQoaSxufHwxMDApKX0pKX19ZnVuY3Rpb24gdF9jaGVja0lzRWRpdE1vZGUoKXt2YXIgdD0hMSxlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYoIWUpcmV0dXJuITE7dmFyIG49ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpO3JldHVybiEhKHQ9biYmImVkaXQiPT09bil9ZnVuY3Rpb24gdF9jaGVja0VkaXRvcklzUmVhZHkoKXt2YXIgdD0hMTtpZighdF9jaGVja0lzRWRpdE1vZGUoKSlyZXR1cm4hMTt2YXIgZT1kb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgiZGF0YS1yZWFkeS1zdGF0dXMiKTtyZXR1cm4hISh0PWUmJiJyZWFkeSI9PT1lKX1mdW5jdGlvbiB0X3Njcm9sbEJhcldpZHRoQ29tcGVuc2F0b3JfX3NldE9iamVjdCgpe3dpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yPXt9O3ZhciB0PXdpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yO3QuaXNJbml0ZWQ9ITEsdC5zY3JvbGxCYXJXaWR0aD1NYXRoLmFicyh3aW5kb3cuaW5uZXJXaWR0aC1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpLHQuZGVsYXk9MCx0LmNhbmNlbFRpbWVvdXQ9bnVsbDt2YXIgZT1bInQ0NTAiLCJ0MjgyX19jb250YWluZXIiLCJ0MjgyX19jb250YWluZXJfX2JnX29wZW5lZCIsInQyODJfX21lbnVfX2NvbnRhaW5lciIsInQ4MzBtIiwidDgzMF9fcGFuZWwiLCJ0NDUxbSIsInQyMDRfX21lbnUiLCJ0bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiwidC1tZW51LXBvcG92ZXJfX2J1cmdlcm1lbnVfX3NpZGViYXJfcmlnaHQiLCJ0LW1lbnUtcG9wb3Zlcl9mdWxsc2NyZWVuIl0sbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIqIik7bj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xvc2VzdCgiLnQxMDkzIikmJiFlLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucyhlKX0pKX0pKSx0LmZpeGVkRWxlbWVudHM9W10sQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbihlKXtpZighZS5jbGFzc0xpc3QuY29udGFpbnMoInQ5NzUiKSl7dmFyIG49d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSksbz1uLmdldFByb3BlcnR5VmFsdWUoInBvc2l0aW9uIiksaT1uLmdldFByb3BlcnR5VmFsdWUoIndpZHRoIikscj1uLmdldFByb3BlcnR5VmFsdWUoImhlaWdodCIpLGE9IjEwMCUiPT09aXx8aT09PXdpbmRvdy5pbm5lcldpZHRoKyJweCJ8fGk9PT13aW5kb3cuaW5uZXJXaWR0aC10LnNjcm9sbEJhcldpZHRoKyJweCJ8fCIxMDB2dyI9PT1pLGw9IjEwMCUiPT09cnx8cj09PXdpbmRvdy5pbm5lckhlaWdodCsicHgifHxyPT09d2luZG93LmlubmVySGVpZ2h0LXQuc2Nyb2xsQmFyV2lkdGgrInB4Inx8ImF1dG8iPT09cnx8IjEwMHZoIj09PXI7KCJmaXhlZCI9PT1vfHwiYWJzb2x1dGUiPT09byYmYSYmIWwpJiZ0LmZpeGVkRWxlbWVudHMucHVzaCh7ZWw6ZSxjb21wdXRlZFN0eWxlOm59KX19KSl9ZnVuY3Rpb24gdF9zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yX19pbml0KCl7aWYoIXdpbmRvdy5pc01vYmlsZSYmIXRfY2hlY2tJc0VkaXRNb2RlKCkpe3dpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yfHx0X3Njcm9sbEJhcldpZHRoQ29tcGVuc2F0b3JfX3NldE9iamVjdCgpO3ZhciB0PXdpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yO2lmKHQuc2Nyb2xsQmFyV2lkdGg9TWF0aC5hYnMod2luZG93LmlubmVyV2lkdGgtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSx0LmNhbmNlbFRpbWVvdXQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHQuY2FuY2VsVGltZW91dCksdC5jYW5jZWxUaW1lb3V0PW51bGwpLCF0LmlzSW5pdGVkJiZ0LnNjcm9sbEJhcldpZHRoKXt0LmlzSW5pdGVkPSEwO3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoInBhZGRpbmctcmlnaHQiKTtlPXBhcnNlSW50KGUucmVwbGFjZSgicHgiLCIiKSwxMCk7dmFyIG49ZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ7biYmZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1wYWRkaW5nLXJpZ2h0IixuKSxkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD10LnNjcm9sbEJhcldpZHRoK2UrInB4Iixkb2N1bWVudC5ib2R5LnN0eWxlLmhlaWdodD0iMTAwdmgiLGRvY3VtZW50LmJvZHkuc3R5bGUubWluSGVpZ2h0PSIxMDB2aCIsZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjt2YXIgbz1bXTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQuZml4ZWRFbGVtZW50cywoZnVuY3Rpb24oZSl7dmFyIG49ZS5lbDtpZihkb2N1bWVudC5ib2R5LmNvbnRhaW5zKG4pJiYhbi5jbGFzc0xpc3QuY29udGFpbnMoInQ5NzUiKSYmIW4uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0OTc1Iikpe3ZhciBpPW4uY2xvc2VzdCgiLnIiKSxyPWUuY29tcHV0ZWRTdHlsZSxhPXIuZ2V0UHJvcGVydHlWYWx1ZSgicG9zaXRpb24iKTtpZigiZml4ZWQiPT09YXx8ImFic29sdXRlIj09PWEpe3ZhciBsPXIuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNpdGlvbi1kdXJhdGlvbiIpO2wuaW5kZXhPZigibXMiKSsxPyhsPXBhcnNlSW50KGwucmVwbGFjZSgibXMiLCIiKSwxMCksby5wdXNoKGwpKTpsLmluZGV4T2YoInMiKSsxJiYobD0xZTMqcGFyc2VGbG9hdChsLnJlcGxhY2UoInMiLCIiKSksby5wdXNoKGwpKTt2YXIgZD1yLmdldFByb3BlcnR5VmFsdWUoInJpZ2h0Iik7ZD1wYXJzZUludChkLnJlcGxhY2UoInB4IiwiIiksMTApO3ZhciBzPXIuZ2V0UHJvcGVydHlWYWx1ZSgid2lkdGgiKSxjPXIuZ2V0UHJvcGVydHlWYWx1ZSgiaGVpZ2h0IiksdT1uLnN0eWxlLnJpZ2h0O3UmJm4uc2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtcmlnaHQiLHUpO3ZhciBtPW4uc3R5bGUud2lkdGg7bSYmbi5zZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC13aWR0aCIsbSk7dmFyIHA9aSYmcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKGkpLmdldFByb3BlcnR5VmFsdWUoInpvb20iKSl8fDEsaD10LnNjcm9sbEJhcldpZHRoL3Asdz0iMTAwJSI9PT1zfHxzPT09d2luZG93LmlubmVyV2lkdGgrInB4Inx8cz09PXdpbmRvdy5pbm5lcldpZHRoLXQuc2Nyb2xsQmFyV2lkdGgrInB4Inx8IjEwMHZ3Ij09PXN8fG4uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LW1lbnUtcG9wb3Zlcl9mdWxsd2lkdGgiKXx8bi5jbGFzc0xpc3QuY29udGFpbnMoInQtbWVudS1wb3BvdmVyIikmJnA+MSxmPSIxMDAlIj09PWN8fGM9PT13aW5kb3cuaW5uZXJIZWlnaHQrInB4Inx8Yz09PXdpbmRvdy5pbm5lckhlaWdodC10LnNjcm9sbEJhcldpZHRoKyJweCJ8fCJhdXRvIj09PWN8fCIxMDB2aCI9PT1jOyFkJiYwIT09ZHx8ImF1dG8iPT09bi5zdHlsZS5yaWdodHx8ImFic29sdXRlIj09PWF8fHc/dyYmIWYmJihuLnN0eWxlLndpZHRoPSJjYWxjKDEwMHZ3IC8gIisod2luZG93LmlzU2FmYXJpPzE6cCkrIiAtICIraCsicHgpIik6bi5zdHlsZS5yaWdodD1oK2QrInB4In19fSkpLG8ubGVuZ3RoJiYodC5kZWxheT1NYXRoLm1heC5hcHBseShudWxsLG8pKX19fWZ1bmN0aW9uIHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fY2FuY2VsKCl7dmFyIHQ9d2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I7dCYmdC5pc0luaXRlZCYmKHQuaXNJbml0ZWQ9ITEsdC5kZWxheT0wLGRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtcGFkZGluZy1yaWdodCIpPyhkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1kb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXBhZGRpbmctcmlnaHQiKSxkb2N1bWVudC5ib2R5LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXBhZGRpbmctcmlnaHQiKSk6ZG9jdW1lbnQuYm9keS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgicGFkZGluZy1yaWdodCIpLGRvY3VtZW50LmJvZHkuc3R5bGUucmVtb3ZlUHJvcGVydHkoImhlaWdodCIpLGRvY3VtZW50LmJvZHkuc3R5bGUucmVtb3ZlUHJvcGVydHkoIm1pbi1oZWlnaHQiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJvdmVyZmxvdyIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC5maXhlZEVsZW1lbnRzLChmdW5jdGlvbih0KXt2YXIgZT10LmVsLG49ZS5jbGFzc0xpc3QuY29udGFpbnMoInRuLWF0b21fX3N0aWNreS13cmFwcGVyIil8fGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIik7ZS5oYXNBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1yaWdodCIpPyhlLnN0eWxlLnJpZ2h0PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtcmlnaHQiKSxlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXJpZ2h0IikpOmUuc3R5bGUucmVtb3ZlUHJvcGVydHkoInJpZ2h0IiksZS5oYXNBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC13aWR0aCIpPyhlLnN0eWxlLndpZHRoPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtd2lkdGgiKSxlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXdpZHRoIikpOihlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ3aWR0aCIpLG4mJihlLnN0eWxlLndpZHRoPSJpbmhlcml0IikpfSkpKX1mdW5jdGlvbiB0X3RyaWdnZXJFdmVudCh0LGUpe3ZhciBuO2RvY3VtZW50LmNyZWF0ZUV2ZW50PyhuPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIikpLmluaXRFdmVudChlLCEwLCExKTpkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCYmKChuPWRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCkpLmV2ZW50VHlwZT1lKSxuLmV2ZW50TmFtZT1lLHQuZGlzcGF0Y2hFdmVudD90LmRpc3BhdGNoRXZlbnQobik6dC5maXJlRXZlbnQ/dC5maXJlRXZlbnQoIm9uIituLmV2ZW50VHlwZSxuKTp0W2VdP3RbZV0oKTp0WyJvbiIrZV0mJnRbIm9uIitlXSgpfWZ1bmN0aW9uIHRfZ2V0Um9vdFpvbmUoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGU7cmV0dXJuIHQmJnQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXJvb3Qtem9uZSIpfHwiY29tIn1mdW5jdGlvbiB0X21vZGlmeVJvb3Rab25lKHQpe3JldHVybiB0JiZ0LmluY2x1ZGVzKCJzdGF0aWMudGlsZGFjZG4uY29tIik/dC5yZXBsYWNlKCJzdGF0aWMudGlsZGFjZG4uY29tIiwic3RhdGljLnRpbGRhY2RuLiIrdF9nZXRSb290Wm9uZSgpKTp0fWZ1bmN0aW9uIHRfbG9hZEpzRmlsZSh0LGUsbil7dm9pZCAwPT09biYmKG49MCk7dmFyIG89MyxpPTFlMyxyPXRfbW9kaWZ5Um9vdFpvbmUodCk7aWYoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyY149IicrcisnIl0nKSllJiZlKCk7ZWxzZXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnR5cGU9InRleHQvamF2YXNjcmlwdCIsYS5zcmM9cixlJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe2UoKX0pKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoZnVuY3Rpb24odCl7aWYoIShuPD0zKSl7dmFyIG89dC5tZXNzYWdlfHwiPG5vIGVycm9yIG1lc3NhZ2U+Ijt0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBsb2FkICIrcisiIHNjcmlwdDogIitvLHtjYXVzZTp0fSl9c2V0VGltZW91dCgoZnVuY3Rpb24oKXthLnJlbW92ZSgpLHRfbG9hZEpzRmlsZShyLGUsbisxKSxjb25zb2xlLndhcm4oIlJldHJ5aW5nIHRvIGxvYWQgIityKyIuIFJldHJ5OiAiKyhuKzEpKX0pLG4qaSl9KSksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhKX19ZnVuY3Rpb24gdF9sb2FkQ1NTRmlsZSh0LGUsbil7dm9pZCAwPT09biYmKG49MCk7dmFyIG89MyxpPTFlMyxyPXRfbW9kaWZ5Um9vdFpvbmUodCk7aWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tocmVmXj0iJytyKyciXScpKWUmJmUoKTtlbHNle3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTthLnJlbD0ic3R5bGVzaGVldCIsYS50eXBlPSJ0ZXh0L2NzcyIsYS5tZWRpYT0iYWxsIixhLmhyZWY9cixhLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLGUmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGZ1bmN0aW9uKHQpe2lmKCEobjw9Mykpe3ZhciBvPXQubWVzc2FnZXx8IjxubyBlcnJvciBtZXNzYWdlPiI7dGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gbG9hZCAiK3IrIiBzdHlsZTogIitvLHtjYXVzZTp0fSl9c2V0VGltZW91dCgoZnVuY3Rpb24oKXthLnJlbW92ZSgpLHRfbG9hZENTU0ZpbGUocixlLG4rMSksY29uc29sZS53YXJuKCJSZXRyeWluZyB0byBsb2FkICIrcisiLiBSZXRyeTogIisobisxKSl9KSxuKmkpfSkpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYSl9fWZ1bmN0aW9uIHRfc2Nyb2xsVG8odCxlKXtpZih0KXt2YXIgbj1lfHx7fSxvPW4udXNlTmF0aXZlU2Nyb2xsVG8saT1uLmR1cmF0aW9uLHI9bi5iZWhhdmlvcixhPXZvaWQgMD09PXI/Imluc3RhbnQiOnIsbD1uLm9mZnNldCxkPXZvaWQgMD09PWw/MDpsLHM9TWF0aC5tYXgocGFyc2VJbnQodC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnNjcm9sbFktZCwxMCksMCk7b3x8Imluc3RhbnQiPT09YT93aW5kb3cuc2Nyb2xsVG8oe2xlZnQ6MCx0b3A6cyxiZWhhdmlvcjphfSk6dF9zbW9vdGhTY3JvbGxUbyhzLGkpfX1mdW5jdGlvbiB0X3Ntb290aFNjcm9sbFRvKHQsZSl7dm9pZCAwPT09ZSYmKGU9NTAwKTt2YXIgbj1kb2N1bWVudC5ib2R5LG89d2luZG93LnNjcm9sbFl8fHdpbmRvdy5wYWdlWU9mZnNldCxpPXQtbyxyPXBlcmZvcm1hbmNlLm5vdygpO2Z1bmN0aW9uIGEodCl7cmV0dXJuIE1hdGgucG93KHQsMil9ZnVuY3Rpb24gbCgpe3ZhciBkPXBlcmZvcm1hbmNlLm5vdygpLHM9TWF0aC5taW4oKGQtcikvZSwxKSxjPWEocyk7d2luZG93LnNjcm9sbFRvKDAsbytpKmMpLHM8MT9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobCk6KG4ucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXNjcm9sbCIpLG4ucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXNjcm9sbGFibGUiKSx3aW5kb3cuc2Nyb2xsVG8oMCx0KSl9bi5zZXRBdHRyaWJ1dGUoImRhdGEtc2Nyb2xsIiwidHJ1ZSIpLG4uc2V0QXR0cmlidXRlKCJkYXRhLXNjcm9sbGFibGUiLCJ0cnVlIikscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGwpfXdpbmRvdy5icm93c2VyTGFuZz0od2luZG93Lm5hdmlnYXRvci51c2VyTGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UpLnRvVXBwZXJDYXNlKCkuc2xpY2UoMCwyKSx3aW5kb3cudGlsZGFCcm93c2VyTGFuZz13aW5kb3cuYnJvd3NlckxhbmcsdF9vblJlYWR5KChmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYodCl2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wcm9qZWN0LWxhbmciKTtlJiYod2luZG93LmJyb3dzZXJMYW5nPWUpfSkpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXt2YXIgdD13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxlPS0xIT09dC5pbmRleE9mKCJJbnN0YWdyYW0iKSxuPS0xIT09dC5pbmRleE9mKCJGQkFWIiksbz0tMSE9PXQuaW5kZXhPZigiWWFTZWFyY2hCcm93c2VyIiksaT0tMSE9PXQuaW5kZXhPZigiU2Ftc3VuZ0Jyb3dzZXIiKSxyPS0xIT09dC5pbmRleE9mKCJEdWNrRHVja0dvIiksYTtpZigtMSE9PXQuaW5kZXhPZigiQW5kcm9pZCIpJiYobnx8ZXx8b3x8aXx8cikpe3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKTtsLnN0eWxlLmxpbmVIZWlnaHQ9IjEwMHB4IixsLnN0eWxlLnBhZGRpbmc9IjAiLGwuc3R5bGUubWFyZ2luPSIwIixsLnN0eWxlLmhlaWdodD0iYXV0byIsbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUub3BhY2l0eT0iMC4wMDEiLGwuaW5uZXJUZXh0PSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpO3ZhciBkPTEwMC9sLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobCksZDwuOTgmJmRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8c3R5bGU+LnQzOTYgW2RhdGEtZWxlbS10eXBlPSJ0ZXh0Il0gLnRuLWF0b20ge3pvb206ICcrMTAwKmQrIiU7fTwvc3R5bGU+Iil9d2luZG93LmlzaU9TJiYhd2luZG93Lk1TU3RyZWFtJiYoZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eSgiLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0IiwiMTAwJSIpLGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoInRleHQtc2l6ZS1hZGp1c3QiLCIxMDAlIikpfSkpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImh0bWwiKSxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXRpbGRhbGFiZWwiKSxuPXQub2Zmc2V0SGVpZ2h0O2lmKGRvY3VtZW50LmJvZHkmJihuPU1hdGgubWF4KGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LHQub2Zmc2V0SGVpZ2h0KSksKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYWNvcHkiKXx8ZSkmJmUucXVlcnlTZWxlY3RvckFsbCgiZGl2Iikpbis3MD53aW5kb3cuaW5uZXJIZWlnaHQmJmUmJmUuc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IHZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDsgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IHBvaW50ZXItZXZlbnRzOiBhbGwgIWltcG9ydGFudDsgb3BhY2l0eTogMSAhaW1wb3J0YW50OyBtYXJnaW46IDAgIWltcG9ydGFudDsgei1pbmRleDogMSAhaW1wb3J0YW50Iik7ZWxzZXtmb3IodmFyIG89ZG9jdW1lbnQuYm9keS5jaGlsZE5vZGVzLGk9W10scj0wO3I8by5sZW5ndGg7cisrKXt2YXIgYT1vW3JdOzg9PT1hLm5vZGVUeXBlJiZpLnB1c2goYSl9Zm9yKHZhciByPTA7cjxpLmxlbmd0aDtyKyspLTEhPT1pW3JdLm5vZGVWYWx1ZS5pbmRleE9mKCIndCByZW1vdmUgdGhpcyBsIikmJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmVuZCIsJzxkaXYgY2xhc3M9InQtdGlsZGFsYWJlbCB0LXRpbGRhbGFiZWwtZnJlZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IHZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDsgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IHBvaW50ZXItZXZlbnRzOiBhbGwgIWltcG9ydGFudDsgb3BhY2l0eTogMSAhaW1wb3J0YW50OyBtYXJnaW46IDAgIWltcG9ydGFudDsgei1pbmRleDogOTk5MDAgIWltcG9ydGFudCI+PGRpdiBjbGFzcz0idC10aWxkYWxhYmVsLWZyZWVfX21haW4iPjxhIGhyZWY9Imh0dHBzOi8vdGlsZGEuY2MiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0icGFkZGluZy1ib3R0b206MTJweDsgZGlzcGxheTogYmxvY2s7Ij48aW1nIHN0eWxlPSJ3aWR0aDo0MHB4OyIgc3JjPSJodHRwczovL3N0YXRpYy50aWxkYWNkbi4nK3RfZ2V0Um9vdFpvbmUoKSsnL2ltZy90aWxkYWNvcHkucG5nIj48L2E+PGRpdiBzdHlsZT0icGFkZGluZy1ib3R0b206IDE1cHg7Ij5UaGlzIHNpdGUgd2FzIG1hZGUgb24gPGEgaHJlZj0iaHR0cHM6Ly90aWxkYS5jYyIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmU7IGNvbG9yOmluaGVyaXQ7Ij5UaWxkYSDigJQgYSB3ZWJzaXRlIGJ1aWxkZXI8L2E+IHRoYXQgaGVscHMgdG8mbmJzcDtjcmVhdGUgYSZuYnNwO3dlYnNpdGUgd2l0aG91dCBhbnkgY29kZTwvZGl2PjxhIGhyZWY9Imh0dHBzOi8vdGlsZGEuY2MvcmVnaXN0cmF0aW9uLyIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDEwcHggMjBweDsgZm9udC1zaXplOiAxM3B4OyBib3JkZXItcmFkaXVzOiA1MHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmE4NjY5OyBjb2xvcjogI2ZmZjsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyI+Q3JlYXRlIGEgd2Vic2l0ZTwvYT48L2Rpdj48ZGl2IGNsYXNzPSJ0LXRpbGRhbGFiZWwtZnJlZV9fbGlua3Mtd3IiPjxhIGNsYXNzPSJ0LXRpbGRhbGFiZWwtZnJlZV9fdHh0LWxpbmsiIGhyZWY9Imh0dHBzOi8vaGVscCcrKCJSVSI9PT13aW5kb3cuYnJvd3Nlckxhbmc/Ii1ydSI6IiIpKycudGlsZGEuY2Mvd2hpdGUtbGFiZWwiIHRhcmdldD0iX2JsYW5rIj4nKygiUlUiPT09d2luZG93LmJyb3dzZXJMYW5nPyLQmtCw0Log0YPQtNCw0LvQuNGC0Ywg0Y3RgtC+0YIg0LvQtdC50LHQuyI6IkhvdyB0byByZW1vdmUgdGhpcyBibG9jayIpKyI/PC9hPjwvZGl2PjwvZGl2PiIpfX0pLDUwMCl9KSksdF9vblJlYWR5KChmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYoIXdpbmRvdy5pc01vYmlsZSYmdCYmInllcyIhPT10LmdldEF0dHJpYnV0ZSgiZGF0YS1ibG9ja3MtYW5pbWF0aW9ub2ZmIikmJiExPT09d2luZG93LmlzU2VhcmNoQm90KXtmb3IodmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnIiKSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBvLGk9KG89ZVtuXSkuZ2V0QXR0cmlidXRlKCJzdHlsZSIpO2kmJi0xIT09aS5pbmRleE9mKCJiYWNrZ3JvdW5kLWNvbG9yIikmJm8uc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGlvbmFwcGVhciIsIm9mZiIpfWZvcih2YXIgcj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRpb25hcHBlYXIiKSYmIXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1taW4iKSYmIXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1tYXgiKX0pKSxuPTA7bjxyLmxlbmd0aDtuKyspe3ZhciBvLGE9KG89cltuXSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldCxsPXdpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQrMzAwO3RfYWRkQ2xhc3MobyxhPjFlMyYmYT5sPyJyX2hpZGRlbiI6InJfc2hvd2VkIiksdF9hZGRDbGFzcyhvLCJyX2FuaW0iKX1pZihyLmxlbmd0aCl7ZnVuY3Rpb24gZCgpe2Zvcih2YXIgdD1yLmxlbmd0aC0xO3Q+PTA7dC0tKXt2YXIgZT1yW3RdLG4sbz0wO2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDwobz1lLm9mZnNldEhlaWdodDw9MTAwP3dpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQ6d2luZG93LnBhZ2VZT2Zmc2V0K3dpbmRvdy5pbm5lckhlaWdodC0xMDApJiYodF9yZW1vdmVDbGFzcyhlLCJyX2hpZGRlbiIpLHRfYWRkQ2xhc3MoZSwicl9zaG93ZWQiKSwocj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChyKSkuc3BsaWNlKHQsMSkpfX12YXIgcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZWNvcmQtdHlwZT0iNDAwIl0sIFtkYXRhLXBhcmVudHRwbGlkPSI0MDAiXScpO2lmKHMubGVuZ3RoPjApdmFyIGM9MCx1PTAsbT1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXszMDA9PT0odSs9MSkmJmNsZWFySW50ZXJ2YWwobSk7Zm9yKHZhciB0PTA7dDxzLmxlbmd0aDt0Kyspe3ZhciBlOyJ5ZXMiPT09c1t0XS5nZXRBdHRyaWJ1dGUoImRhdGEtaGlkaW5nLWNvbXBsZXRlZCIpJiYoYys9MSl9Yz09PXMubGVuZ3RoJiYoZCgpLGNsZWFySW50ZXJ2YWwobSkpfSksMTAwKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe2QoKX0pLDIwMCkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0aWxkYXRhYjpjaGFuZ2UiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7ZCgpfSksMjAwKSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtkKCl9KSl9fXZhciBwPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImh0bWwiKSxoPWRvY3VtZW50LmJvZHk7Im5vbmUiPT09cC5zdHlsZS5kaXNwbGF5JiYocC5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3ZhciB3PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXRpbGRhbGFiZWwiKSxmOyhmPWg/TWF0aC5tYXgoaC5zY3JvbGxIZWlnaHQsaC5vZmZzZXRIZWlnaHQsaC5jbGllbnRIZWlnaHQscC5vZmZzZXRIZWlnaHQpOnAub2Zmc2V0SGVpZ2h0KSs3MDx3aW5kb3cuaW5uZXJIZWlnaHQ/dyYmKHcuc3R5bGUuZGlzcGxheT0ibm9uZSIpOncmJncuc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQiKX0pKSxmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt3aW5kb3cud2luV2lkdGg9d2luZG93LmlubmVyV2lkdGgsd2luZG93LndpbkhlaWdodD13aW5kb3cuaW5uZXJIZWlnaHR9ZnVuY3Rpb24gZSgpe3ZhciB0PXdpbmRvdy5pc01vYmlsZT9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6d2luZG93LmlubmVyV2lkdGgsZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucltkYXRhLXNjcmVlbi1tYXhdLCAucltkYXRhLXNjcmVlbi1taW5dIiksbixvLGk7LTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkluc3RhZ3JhbSIpJiYodD1zY3JlZW4ud2lkdGgpO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgYT1lW3JdLGw9YS5pZC5yZXBsYWNlKCJyZWMiLCIiKTtpZigieWVzIj09PWEuZ2V0QXR0cmlidXRlKCJkYXRhLWNvbm5lY3Qtd2l0aC10YWIiKXx8ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcG9wdXAtcmVjLWlkcz0iJytsKyciXScpKXJldHVybjtpPWdldENvbXB1dGVkU3R5bGUoYSkuZGlzcGxheSwobj1hLmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWF4IikpfHwobj0xZTQpLChvPWEuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1taW4iKSl8fChvPTApLG49cGFyc2VJbnQobiksKG89cGFyc2VJbnQobykpPD1uJiYodDw9biYmdD5vPyJibG9jayIhPT1pJiYoYS5zdHlsZS5kaXNwbGF5PSJibG9jayIpOiJub25lIiE9PWkmJihhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSl9fXRfb25SZWFkeSgoZnVuY3Rpb24oKXt0KCksZSgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dCgpfSksMjAwKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtlKCl9KSwyMDApKX0pKX0oKSxmdW5jdGlvbigpe3ZhciB0PS0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJJbnN0YWdyYW0iKTtmdW5jdGlvbiBlKCl7Zm9yKHZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNvdmVyX19jYXJyaWVyIiksZT0wLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIG8saTtpZigoaT0obz10W25dKS5zdHlsZSkuaGVpZ2h0LmluZGV4T2YoInZoIik+LTEpe2U9cGFyc2VJbnQoaS5oZWlnaHQsMTApLzEwMDt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyLmlkPSJ0ZW1wRGl2IixyLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDB2aDt2aXNpYmlsaXR5OmhpZGRlbjsiLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocik7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlbXBEaXYiKSxsPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoYSkuaGVpZ2h0LnJlcGxhY2UoInB4IiwiIikpO3RfcmVtb3ZlRWwoYSk7dmFyIGQ9TWF0aC5yb3VuZChsKmUpKyJweCIscz1vLmNsb3Nlc3QoIi50LWNvdmVyIik7aWYocyl7dmFyIGM9cy5xdWVyeVNlbGVjdG9yKCIudC1jb3Zlcl9fZmlsdGVyIiksdT1zLnF1ZXJ5U2VsZWN0b3IoIi50LWNvdmVyX193cmFwcGVyIik7cy5zdHlsZS5oZWlnaHQ9ZCxjJiYoYy5zdHlsZS5oZWlnaHQ9ZCksdSYmKHUuc3R5bGUuaGVpZ2h0PWQpfWkuaGVpZ2h0PWR9fXZhciBtPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWhlaWdodC1jb3JyZWN0LXZoXSIpLHA9d2luZG93LmlubmVySGVpZ2h0O2U9MDtmb3IodmFyIG49MDtuPG0ubGVuZ3RoO24rKyl7dmFyIG8saTsoaT0obz1tW25dKS5zdHlsZSkuaGVpZ2h0LmluZGV4T2YoInZoIik+LTEmJihlPXBhcnNlSW50KGkuaGVpZ2h0KS8xMDAsZD1wKihpc05hTihlKT8xOmUpKyJweCIsaS5oZWlnaHQ9ZCl9fWZ1bmN0aW9uIG4oKXt2YXIgZT10P3NjcmVlbi53aWR0aDp3aW5kb3cuaW5uZXJXaWR0aDt3aW5kb3cuaXNNb2JpbGUmJiF0JiYoZT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpO2Zvcih2YXIgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucjpub3QoW2RhdGEtcmVjb3JkLXR5cGU9IjM5NiJdLCBbZGF0YS1yZWNvcmQtdHlwZT0iMTAwMyJdLCBbZGF0YS1wYXJlbnR0cGxpZD0iMzk2Il0sIFtkYXRhLXBhcmVudHRwbGlkPSIxMDAzIl0pJyksbz1bXSxpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciByPW5baV0sYT1nZXRDb21wdXRlZFN0eWxlKHIpOyJub25lIiE9PWEuZGlzcGxheSYmImhpZGRlbiIhPT1hLnZpc2liaWxpdHkmJiIwIiE9PWEub3BhY2l0eSYmby5wdXNoKHIpfWZvcih2YXIgbD0wO2w8by5sZW5ndGg7bCsrKWZvcih2YXIgZD1vW2xdLHM9ZC5xdWVyeVNlbGVjdG9yQWxsKCdkaXY6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1tb2JpbGUtd2lkdGg9ImZhbHNlIl0pOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIpOm5vdCgudG4tYXRvbV9fcHJ4LXdyYXBwZXIpOm5vdCgudG4tYXRvbV9fdmlkZW9pZnJhbWUpOm5vdCgudG4tYXRvbV9fc3RpY2t5LXdyYXBwZXIpOm5vdCgudC1jYXRhbG9nX19yZWxldmFudHNfX2NvbnRhaW5lcik6bm90KC50LXNsZHNfX2l0ZW1zLXdyYXBwZXIpOm5vdCguanMtcHJvZHVjdC1jb250cm9scy13cmFwcGVyKTpub3QoLnQtc3RvcmVfX3JlbGV2YW50c19fY29udGFpbmVyKTpub3QoLnQtc2xkc19faXRlbXMtd3JhcHBlcik6bm90KC5qcy1wcm9kdWN0LWNvbnRyb2xzLXdyYXBwZXIpOm5vdCguanMtcHJvZHVjdC1lZGl0aW9uLW9wdGlvbik6bm90KC50LXByb2R1Y3RfX29wdGlvbi12YXJpYW50cyknKSxjPTA7YzxzLmxlbmd0aDtjKyspe3ZhciB1PXNbY107ZC5zdHlsZS53b3JkQnJlYWs9IiI7dmFyIG09dF9vdXRlcldpZHRoKHUpO2lmKG0+ZSl7aWYoInllcyI9PT11LmdldEF0dHJpYnV0ZSgiW2RhdGEtY3VzdG9tc3R5bGVdIikmJiJmYWxzZSI9PT11LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJbZGF0YS1hdXRvLWNvcnJlY3QtbW9iaWxlLXdpZHRoXSIpKXJldHVybjtjb25zb2xlLmxvZygiQmxvY2sgbm90IG9wdGltaXplZCBmb3IgbW9iaWxlIHdpZHRoLiBCbG9jayB3aWR0aDoiK20rIiBCbG9jayBpZDoiK2QuZ2V0QXR0cmlidXRlKCJpZCIpKSxjb25zb2xlLmxvZyh1KSxkLnN0eWxlLm92ZXJmbG93PSJhdXRvIixkLnN0eWxlLndvcmRCcmVhaz1tLTM+ZT8iYnJlYWstd29yZCI6IiJ9fX1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudC10ZXh0Om5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtbmFtZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXRpdGxlOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtZGVzY3I6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC1oZWFkaW5nOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtdGV4dC1pbXBhY3Q6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC1zdWJ0aXRsZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXVwdGl0bGU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pJyksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dLGk9by5nZXRBdHRyaWJ1dGUoInN0eWxlIik7aWYoaSl7dmFyIHI9InJlbSI9PT1vLmdldEF0dHJpYnV0ZSgiZGF0YS1hdXRvLWNvcnJlY3QtZm9udC1zaXplIiksYTtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg+dClhPShhPWkucmVwbGFjZSgibGluZWhlaWdodCIsImxpbmUtaGVpZ2h0IikpLnJlcGxhY2UoImZvbnRzaXplIiwiZm9udC1zaXplIiksby5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKTtlbHNle2lmKC0xPT09aS5pbmRleE9mKCJmb250LXNpemUiKSljb250aW51ZTtpZihwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLmZvbnRTaXplLnJlcGxhY2UoInB4IiwiIikpPDI2KWNvbnRpbnVlO2E9aS5yZXBsYWNlKCJsaW5lLWhlaWdodCIsImxpbmVoZWlnaHQiKSxhPXI/YS5yZXBsYWNlKC9mb250LXNpemUuKnB4Oy9naSwiZm9udC1zaXplOiAxLjZyZW07Iik6YS5yZXBsYWNlKCJmb250LXNpemUiLCJmb250c2l6ZSIpLG8uc2V0QXR0cmlidXRlKCJzdHlsZSIsYSl9fX19KHdpbmRvdy5pc01vYmlsZXx8d2luZG93LnBhcmVudC5pc1BhZ2VQcmV2aWV3KSYmKHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGUsNDAwKX0pKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7c2V0VGltZW91dChlLDQwMCl9KSksd2luZG93LmlubmVyV2lkdGg8NDgwfHx3aW5kb3cuaXNNb2JpbGUmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDw0ODB8fHQmJnNjcmVlbi53aWR0aDw0ODA/KHRfb25SZWFkeSgoZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY3VzdG9tc3R5bGU9InllcyJdJyksZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZmllbGRdIHNwYW4sIFtmaWVsZF0gc3Ryb25nLCBbZmllbGRdIGVtLCBbZmllbGRdIGEiKSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl07cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4yNiYmKGkuc3R5bGUuZm9udFNpemU9bnVsbCxpLnN0eWxlLmxpbmVIZWlnaHQ9bnVsbCl9Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPWVbbl07cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4yNiYmKGkuc3R5bGUuZm9udFNpemU9bnVsbCl9byg0ODApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtvKDQ4MCl9KSw1MDApfSkpfSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixuKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bigpfSksNTAwKX0pKSk6KHdpbmRvdy5pbm5lcldpZHRoPDkwMHx8d2luZG93LmlzTW9iaWxlJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg8OTAwfHx0JiZzY3JlZW4ud2lkdGg8OTAwKSYmdF9vblJlYWR5KChmdW5jdGlvbigpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jdXN0b21zdHlsZT0ieWVzIl0nKSxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltmaWVsZF0gc3BhbiwgW2ZpZWxkXSBzdHJvbmcsIFtmaWVsZF0gZW0sIFtmaWVsZF0gYSIpLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIG89dFtuXTtwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLmZvbnRTaXplLnJlcGxhY2UoInB4IiwiIikpPjMwJiYoby5zdHlsZS5mb250U2l6ZT1udWxsLG8uc3R5bGUubGluZUhlaWdodD1udWxsKX1mb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLmZvbnRTaXplLnJlcGxhY2UoInB4IiwiIikpPjMwJiYoby5zdHlsZS5mb250U2l6ZT1udWxsKX1mb3IodmFyIGk9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnQtdGV4dDpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LW5hbWU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC10aXRsZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LWRlc2NyOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtaGVhZGluZzpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXRleHQtaW1wYWN0Om5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtc3VidGl0bGU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC11cHRpdGxlOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKScpLG49MDtuPGkubGVuZ3RoO24rKyl7dmFyIG8scj0obz1pW25dKS5nZXRBdHRyaWJ1dGUoInN0eWxlIik7aWYociYmci5pbmRleE9mKCJmb250LXNpemUiKT4tMSYmcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShvKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4zMClpZigicmVtIj09PW8uZ2V0QXR0cmlidXRlKCJkYXRhLWF1dG8tY29ycmVjdC1mb250LXNpemUiKSl7dmFyIGE9ci5yZXBsYWNlKC9mb250LXNpemUuKnB4Oy9naSwiZm9udC1zaXplOiAxLjZyZW07IikucmVwbGFjZSgibGluZS1oZWlnaHQiLCJsaW5laGVpZ2h0Iik7by5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKX1lbHNle3ZhciBhPXIucmVwbGFjZSgiZm9udC1zaXplIiwiZm9udHNpemUiKS5yZXBsYWNlKCJsaW5lLWhlaWdodCIsImxpbmVoZWlnaHQiKTtvLnNldEF0dHJpYnV0ZSgic3R5bGUiLGEpfX19KSkpfSgpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZePSJodHRwIl1bdGFyZ2V0PSJfYmxhbmsiXScpLGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIG49dFtlXSxvPW4uZ2V0QXR0cmlidXRlKCJyZWwiKXx8IiI7IiI9PT1vP24uc2V0QXR0cmlidXRlKCJyZWwiLCJub29wZW5lciIpOi0xPT09by5pbmRleE9mKCJub29wZW5lciIpJiZuLnNldEF0dHJpYnV0ZSgicmVsIixvKyIgbm9vcGVuZXIiKX19KSwyNTAwKX0pKSxmdW5jdGlvbih0LGUpe3Qub25lcnJvcj1mdW5jdGlvbihlLG4sbyxpLHIpeyJvYmplY3QiIT10eXBlb2YgdC50X2pzZXJyb3JzJiYodC50X2pzZXJyb3JzPVtdKSx0LnRfanNlcnJvcnMucHVzaCh7bWVzc2FnZTplLGZpbGVuYW1lOm4sbGluZW5vOm8sY29sbm86aSxlcnJvcjpyfSl9fSh3aW5kb3csTWF0aCksdF9vblJlYWR5KChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigicG9wdXBTaG93ZWQiLHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9faW5pdCksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJwb3B1cEhpZGRlbiIsKGZ1bmN0aW9uKCl7dmFyIHQ9d2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I7dCYmKHQuY2FuY2VsVGltZW91dCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodC5jYW5jZWxUaW1lb3V0KSx0LmNhbmNlbFRpbWVvdXQ9bnVsbCksdC5jYW5jZWxUaW1lb3V0PXdpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuY2FuY2VsVGltZW91dD1udWxsLHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fY2FuY2VsKCl9KSxNYXRoLm1pbigzMDAsdC5kZWxheSkpKX0pKX0pKSx3aW5kb3cuc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcjsKCndpbmRvdy5ub2pzY29kZT0hMApmdW5jdGlvbiB0X2xhenlsb2FkX3VwZGF0ZSgpeyJ1bmRlZmluZWQiIT10eXBlb2YgbGF6eWxvYWRfY292ZXImJmxhenlsb2FkX2NvdmVyLnVwZGF0ZSgpLCJ1bmRlZmluZWQiIT10eXBlb2YgbGF6eWxvYWRfaW1nJiZsYXp5bG9hZF9pbWcudXBkYXRlKCksInVuZGVmaW5lZCIhPXR5cGVvZiBsYXp5bG9hZF9iZ2ltZyYmbGF6eWxvYWRfYmdpbWcudXBkYXRlKCksInVuZGVmaW5lZCIhPXR5cGVvZiBsYXp5bG9hZF9pZnJhbWUmJmxhenlsb2FkX2lmcmFtZS51cGRhdGUoKX1mdW5jdGlvbiB0X2xhenlsb2FkX3VwZGF0ZVJlc2l6ZV9lbGVtKGUpe2lmKHdpbmRvdy5qUXVlcnkmJmUgaW5zdGFuY2VvZiBqUXVlcnkpe2lmKDA9PWUubGVuZ3RoKXJldHVybjtlPWUuZ2V0KDApfWlmKG51bGwhPWUpe3ZhciB0PWUudGFnTmFtZTtpZigiSU1HIj09dCl2YXIgbz1lLmdldEF0dHJpYnV0ZSgic3JjIiksbj0iLS9yZXNpemUvIjtlbHNlIGlmKCJ1bmRlZmluZWQiIT10eXBlb2YgZ2V0Q29tcHV0ZWRTdHlsZSl7dmFyIG89Z2V0Q29tcHV0ZWRTdHlsZShlKVsiYmFja2dyb3VuZC1pbWFnZSJdLnJlcGxhY2UoInVybCgiLCIiKS5yZXBsYWNlKCIpIiwiIikucmVwbGFjZSgvIi9naSwiIiksaTtpZigiY29udGFpbiI9PWdldENvbXB1dGVkU3R5bGUoZSlbImJhY2tncm91bmQtc2l6ZSJdKXZhciBuPSItL2NvbnRhaW4vIjtlbHNlIHZhciBuPSItL2NvdmVyLyJ9ZWxzZSB2YXIgbj0iLS9jb3Zlci8iO2lmKCEobnVsbD09b3x8LTE9PT1vLmluZGV4T2Yobil8fG8uaW5kZXhPZigiLnN2ZyIpPjB8fG8uaW5kZXhPZigiLmdpZiIpPjB8fG8uaW5kZXhPZigiLmljbyIpPjB8fC0xPT09by5pbmRleE9mKCJ0aHVtYi50aWxkYWNkbi5jb20iKXx8by5pbmRleE9mKCItL2VtcHR5LyIpPjAmJm8uaW5kZXhPZigiLS9yZXNpemViLyIpPjApKXt2YXIgbD1vLmluZGV4T2Yobikrbi5sZW5ndGgsYT1vLmluZGV4T2YoIi8iLGwpO2lmKGw+MCYmYT4wKXt2YXIgcj1vLnNsaWNlKGwsYSkuc3BsaXQoIngiKSxzPWUuY2xpZW50V2lkdGgsYz1lLmNsaWVudEhlaWdodDtpZihzPjAmJmM+MCYmKHJbMF0+MHx8clsxXT4wKSYmKHJbMF0+MCYmcz5yWzBdfHxyWzFdPjAmJmM+clsxXSkmJihyWzBdPjAmJnMtclswXT4xMDB8fHJbMV0+MCYmYy1yWzFdPjEwMCkpe3ZhciBkPW8uc2xpY2UoMCxsKSsoclswXT4wP3M6IiIpKyJ4IisoclsxXT4wP2M6IiIpK28uc3Vic3RyaW5nKGEpOyJJTUciPT10P2Uuc2V0QXR0cmlidXRlKCJzcmMiLGQpOmUuc3R5bGUuYmFja2dyb3VuZEltYWdlPSJ1cmwoJyIrZCsiJykifX19fX0hZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSx0KToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9dCgpOmUuTGF6eUxvYWQ9dCgpfSh3aW5kb3csKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe218fChoPXtlbGVtZW50c19zZWxlY3RvcjoiaW1nIixjb250YWluZXI6d2luZG93LHRocmVzaG9sZDozMDAsdGhyb3R0bGU6NTAsZGF0YV9zcmM6Im9yaWdpbmFsIixkYXRhX3NyY3NldDoib3JpZ2luYWwtc2V0IixjbGFzc19sb2FkaW5nOiJsb2FkaW5nIixjbGFzc19sb2FkZWQ6ImxvYWRlZCIsc2tpcF9pbnZpc2libGU6ITAsc2hvd193aGlsZV9sb2FkaW5nOiEwLGNhbGxiYWNrX2xvYWQ6bnVsbCxjYWxsYmFja19lcnJvcjpudWxsLGNhbGxiYWNrX3NldDpudWxsLGNhbGxiYWNrX3Byb2Nlc3NlZDpudWxsLHBsYWNlaG9sZGVyOiJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUlBQUFBQUFBUC8vL3lINUJBRUFBQUFBTEFBQUFBQUJBQUVBQUFJQlJBQTcifSxwPSEhd2luZG93LmFkZEV2ZW50TGlzdGVuZXIsZj0hIXdpbmRvdy5hdHRhY2hFdmVudCxnPSEhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QsbT0hMCl9ZnVuY3Rpb24gdChlLHQsbyl7dmFyIG47cD9lLmFkZEV2ZW50TGlzdGVuZXIodCxvKTpmJiYoZS5hdHRhY2hFdmVudCgib24iK3QsKG49ZSxmdW5jdGlvbigpe28uY2FsbChuLHdpbmRvdy5ldmVudCl9KSksZT1udWxsKX1mdW5jdGlvbiBvKGUsdCxvKXtwP2UucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG8pOmYmJmUuZGV0YWNoRXZlbnQoIm9uIit0LG8pfWZ1bmN0aW9uIG4oZSx0LG8pe3ZhciBuLGksbDtmdW5jdGlvbiBhKCl7cmV0dXJuIHdpbmRvdy5pbm5lcldpZHRofHxuLmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aHx8ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aH1mdW5jdGlvbiByKCl7cmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodHx8bi5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fHxkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodH1mdW5jdGlvbiBzKGUpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCtpLW4uZG9jdW1lbnRFbGVtZW50LmNsaWVudFRvcH1mdW5jdGlvbiBjKGUpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQrbC1uLmRvY3VtZW50RWxlbWVudC5jbGllbnRMZWZ0fWZ1bmN0aW9uIGQoKXt2YXIgbjtyZXR1cm4obj10PT09d2luZG93P3IoKStpOnModCkrdC5vZmZzZXRIZWlnaHQpPD1zKGUpLW99ZnVuY3Rpb24gdSgpe3ZhciBuO3JldHVybihuPXQ9PT13aW5kb3c/YSgpK3dpbmRvdy5wYWdlWE9mZnNldDpjKHQpK2EoKSk8PWMoZSktb31mdW5jdGlvbiBfKCl7dmFyIG8sbj0xMjAwO3JldHVybihvPXQ9PT13aW5kb3c/aTpzKHQpKT49cyhlKStuK2Uub2Zmc2V0SGVpZ2h0fWZ1bmN0aW9uIGgoKXt2YXIgbjtyZXR1cm4obj10PT09d2luZG93P2w6Yyh0KSk+PWMoZSkrbytlLm9mZnNldFdpZHRofXJldHVybiBuPWUub3duZXJEb2N1bWVudCxpPXdpbmRvdy5wYWdlWU9mZnNldHx8bi5ib2R5LnNjcm9sbFRvcCxsPXdpbmRvdy5wYWdlWE9mZnNldHx8bi5ib2R5LnNjcm9sbExlZnQsImZpeGVkIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWNvbnRlbnQtY292ZXItcGFyYWxsYXgiKSYmZS5jbG9zZXN0JiZlLmNsb3Nlc3QoIi50LWNvdmVyX19jb250YWluZXIiKSYmKGU9ZS5jbG9zZXN0KCIudC1jb3Zlcl9fY29udGFpbmVyIikpLCEoZCgpfHxfKCl8fHUoKXx8aCgpKX1mdW5jdGlvbiBpKCl7dmFyIGU7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9ZnVuY3Rpb24gbChlLHQpe3ZhciBvPXt9LG47Zm9yKG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYob1tuXT1lW25dKTtmb3IobiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihvW25dPXRbbl0pO3JldHVybiBvfWZ1bmN0aW9uIGEoZSl7dmFyIHQ7dHJ5e3Q9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSl9Y2F0Y2gobCl7dmFyIG89W10sbixpPWUubGVuZ3RoO2ZvcihuPTA7bjxpO24rKylvLnB1c2goZVtuXSk7dD1vfXJldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuaXNTa2lwQnlQb3NpdGlvbj1udWxsPT09ZS5vZmZzZXRQYXJlbnQmJjA9PT1yKGUsIi50Mzk2X19jYXJyaWVyLXdyYXBwZXIiKS5sZW5ndGgmJiJmaXhlZCIhPT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1jb250ZW50LWNvdmVyLXBhcmFsbGF4IiksZS5pc05vdFVuZGVyU2NyZWVuUmFuZ2U9MD09PXIoZSwiLnQtcmVjW2RhdGEtc2NyZWVuLW1heF0iKS5sZW5ndGgmJjA9PT1yKGUsIi50LXJlY1tkYXRhLXNjcmVlbi1taW5dIikubGVuZ3RofSkpLHR9ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbz1bXTsoZT1lLnBhcmVudE5vZGUpJiZlIT09ZG9jdW1lbnQ7KXQmJiFlLm1hdGNoZXModCl8fG8udW5zaGlmdChlKTtyZXR1cm4gb31mdW5jdGlvbiBzKGUsdCl7Zz9lLmNsYXNzTGlzdC5hZGQodCk6ZS5jbGFzc05hbWUrPShlLmNsYXNzTmFtZT8iICI6IiIpK3R9ZnVuY3Rpb24gYyhlLHQpe2c/ZS5jbGFzc0xpc3QucmVtb3ZlKHQpOmUuY2xhc3NOYW1lPWUuY2xhc3NOYW1lLnJlcGxhY2UobmV3IFJlZ0V4cCgiKF58XFxzKykiK3QrIihcXHMrfCQpIiksIiAiKS5yZXBsYWNlKC9eXHMrLywiIikucmVwbGFjZSgvXHMrJC8sIiIpfWZ1bmN0aW9uIGQoZSx0LG8sbil7dmFyIGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtIituKSxsPXQuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbyksYT1lLnRhZ05hbWU7cmV0dXJuIklNRyI9PT1hPyhsJiZlLnNldEF0dHJpYnV0ZSgic3Jjc2V0IixsKSx2b2lkKGkmJmUuc2V0QXR0cmlidXRlKCJzcmMiLGkpKSk6IklGUkFNRSI9PT1hP3ZvaWQoaSYmZS5zZXRBdHRyaWJ1dGUoInNyYyIsaSkpOnZvaWQoZS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9InVybCgiK2krIikiKX1mdW5jdGlvbiB1KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodCxhcmd1bWVudHMpfX1mdW5jdGlvbiBfKG8pe2UoKSx0aGlzLl9zZXR0aW5ncz1sKGgsbyksdGhpcy5fcXVlcnlPcmlnaW5Ob2RlPXRoaXMuX3NldHRpbmdzLmNvbnRhaW5lcj09PXdpbmRvdz9kb2N1bWVudDp0aGlzLl9zZXR0aW5ncy5jb250YWluZXIsdGhpcy5fcHJldmlvdXNMb29wVGltZT0wLHRoaXMuX2xvb3BUaW1lb3V0PW51bGwsdGhpcy5faGFuZGxlU2Nyb2xsRm49dSh0aGlzLmhhbmRsZVNjcm9sbCx0aGlzKSx0KHdpbmRvdywicmVzaXplIix0aGlzLl9oYW5kbGVTY3JvbGxGbiksdGhpcy51cGRhdGUoKX13aW5kb3cudF9sYXp5bG9hZF9zZXRTb3VyY2VzPWQ7dmFyIGgscCxmLGcsbT0hMTtyZXR1cm4gXy5wcm90b3R5cGUuX3Nob3dPbkxvYWQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe251bGwhPT1sJiYobC5jYWxsYmFja19sb2FkJiZsLmNhbGxiYWNrX2xvYWQoZSksZChlLGUsbC5kYXRhX3NyY3NldCxsLmRhdGFfc3JjKSxsLmNhbGxiYWNrX3NldCYmbC5jYWxsYmFja19zZXQoZSksYyhlLGwuY2xhc3NfbG9hZGluZykscyhlLGwuY2xhc3NfbG9hZGVkKSxvKGksImxvYWQiLG4pKX12YXIgaSxsPXRoaXMuX3NldHRpbmdzO2UuZ2V0QXR0cmlidXRlKCJzcmMiKXx8ZS5zZXRBdHRyaWJ1dGUoInNyYyIsbC5wbGFjZWhvbGRlciksdChpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLCJsb2FkIixuKSx0KGksImVycm9yIiwoZnVuY3Rpb24oKXtjKGUsbC5jbGFzc19sb2FkaW5nKSxsLmNhbGxiYWNrX2Vycm9yJiZsLmNhbGxiYWNrX2Vycm9yKGUpfSkpLHMoZSxsLmNsYXNzX2xvYWRpbmcpLGQoaSxlLGwuZGF0YV9zcmNzZXQsbC5kYXRhX3NyYyl9LF8ucHJvdG90eXBlLl9zaG93T25BcHBlYXI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe251bGwhPT1pJiYoaS5jYWxsYmFja19sb2FkJiZpLmNhbGxiYWNrX2xvYWQoZSksYyhlLGkuY2xhc3NfbG9hZGluZykscyhlLGkuY2xhc3NfbG9hZGVkKSxvKGUsImxvYWQiLG4pKX12YXIgaT10aGlzLl9zZXR0aW5nczsoIklNRyI9PT1lLnRhZ05hbWV8fCJJRlJBTUUiPT09ZS50YWdOYW1lKSYmKHQoZSwibG9hZCIsbiksdChlLCJlcnJvciIsKGZ1bmN0aW9uKCl7byhlLCJsb2FkIixuKSxjKGUsaS5jbGFzc19sb2FkaW5nKSxpLmNhbGxiYWNrX2Vycm9yJiZpLmNhbGxiYWNrX2Vycm9yKGUpfSkpLHMoZSxpLmNsYXNzX2xvYWRpbmcpKSxkKGUsZSxpLmRhdGFfc3Jjc2V0LGkuZGF0YV9zcmMpLGkuY2FsbGJhY2tfc2V0JiZpLmNhbGxiYWNrX3NldChlKX0sXy5wcm90b3R5cGUuX2xvb3BUaHJvdWdoRWxlbWVudHM9ZnVuY3Rpb24oKXt2YXIgZSx0LG89dGhpcy5fc2V0dGluZ3MsaT10aGlzLl9lbGVtZW50cyxsPWk/aS5sZW5ndGg6MCxhPVtdO2ZvcihlPTA7bD5lO2UrKyl0PWlbZV0sby5za2lwX2ludmlzaWJsZSYmdC5pc1NraXBCeVBvc2l0aW9ufHxuKHQsby5jb250YWluZXIsby50aHJlc2hvbGQpJiYoby5zaG93X3doaWxlX2xvYWRpbmc/dGhpcy5fc2hvd09uQXBwZWFyKHQpOnRoaXMuX3Nob3dPbkxvYWQodCksYS5wdXNoKGUpLHQud2FzUHJvY2Vzc2VkPSEwKTtmb3IoO2EubGVuZ3RoPjA7KWkuc3BsaWNlKGEucG9wKCksMSksby5jYWxsYmFja19wcm9jZXNzZWQmJm8uY2FsbGJhY2tfcHJvY2Vzc2VkKGkubGVuZ3RoKTswPT09bCYmdGhpcy5fc3RvcFNjcm9sbEhhbmRsZXIoKX0sXy5wcm90b3R5cGUuX3B1cmdlRWxlbWVudHM9ZnVuY3Rpb24oKXt2YXIgZSx0LG89dGhpcy5fZWxlbWVudHMsbj1vLmxlbmd0aCxpPVtdO2ZvcihlPTA7bj5lO2UrKykodD1vW2VdKS53YXNQcm9jZXNzZWQmJmkucHVzaChlKTtmb3IoO2kubGVuZ3RoPjA7KW8uc3BsaWNlKGkucG9wKCksMSl9LF8ucHJvdG90eXBlLl9zdGFydFNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oKXt0aGlzLl9pc0hhbmRsaW5nU2Nyb2xsfHwodGhpcy5faXNIYW5kbGluZ1Njcm9sbD0hMCx0KHRoaXMuX3NldHRpbmdzLmNvbnRhaW5lciwic2Nyb2xsIix0aGlzLl9oYW5kbGVTY3JvbGxGbikpfSxfLnByb3RvdHlwZS5fc3RvcFNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oKXt0aGlzLl9pc0hhbmRsaW5nU2Nyb2xsJiYodGhpcy5faXNIYW5kbGluZ1Njcm9sbD0hMSxvKHRoaXMuX3NldHRpbmdzLmNvbnRhaW5lciwic2Nyb2xsIix0aGlzLl9oYW5kbGVTY3JvbGxGbikpfSxfLnByb3RvdHlwZS5oYW5kbGVTY3JvbGw9ZnVuY3Rpb24oKXt2YXIgZSx0LG87dGhpcy5fc2V0dGluZ3MmJih0PWkoKSwwIT09KG89dGhpcy5fc2V0dGluZ3MudGhyb3R0bGUpPzA+PShlPW8tKHQtdGhpcy5fcHJldmlvdXNMb29wVGltZSkpfHxlPm8/KHRoaXMuX2xvb3BUaW1lb3V0JiYoY2xlYXJUaW1lb3V0KHRoaXMuX2xvb3BUaW1lb3V0KSx0aGlzLl9sb29wVGltZW91dD1udWxsKSx0aGlzLl9wcmV2aW91c0xvb3BUaW1lPXQsdGhpcy5fbG9vcFRocm91Z2hFbGVtZW50cygpKTp0aGlzLl9sb29wVGltZW91dHx8KHRoaXMuX2xvb3BUaW1lb3V0PXNldFRpbWVvdXQodSgoZnVuY3Rpb24oKXt0aGlzLl9wcmV2aW91c0xvb3BUaW1lPWkoKSx0aGlzLl9sb29wVGltZW91dD1udWxsLHRoaXMuX2xvb3BUaHJvdWdoRWxlbWVudHMoKX0pLHRoaXMpLGUpKTp0aGlzLl9sb29wVGhyb3VnaEVsZW1lbnRzKCkpfSxfLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl9lbGVtZW50cz1hKHRoaXMuX3F1ZXJ5T3JpZ2luTm9kZS5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuX3NldHRpbmdzLmVsZW1lbnRzX3NlbGVjdG9yKSksdGhpcy5fcHVyZ2VFbGVtZW50cygpLHRoaXMuX2xvb3BUaHJvdWdoRWxlbWVudHMoKSx0aGlzLl9zdGFydFNjcm9sbEhhbmRsZXIoKX0sXy5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe28od2luZG93LCJyZXNpemUiLHRoaXMuX2hhbmRsZVNjcm9sbEZuKSx0aGlzLl9sb29wVGltZW91dCYmKGNsZWFyVGltZW91dCh0aGlzLl9sb29wVGltZW91dCksdGhpcy5fbG9vcFRpbWVvdXQ9bnVsbCksdGhpcy5fc3RvcFNjcm9sbEhhbmRsZXIoKSx0aGlzLl9lbGVtZW50cz1udWxsLHRoaXMuX3F1ZXJ5T3JpZ2luTm9kZT1udWxsLHRoaXMuX3NldHRpbmdzPW51bGx9LF99KSksd2luZG93Lmxhenk9InkiLHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2xhenlsb2FkX2NvdmVyPW5ldyBMYXp5TG9hZCh7ZWxlbWVudHNfc2VsZWN0b3I6Ii50LWNvdmVyX19jYXJyaWVyIixzaG93X3doaWxlX2xvYWRpbmc6ITEsZGF0YV9zcmM6ImNvbnRlbnQtY292ZXItYmciLHBsYWNlaG9sZGVyOiIiLHRocmVzaG9sZDo3MDB9KX0pLDEwMCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpZihsYXp5bG9hZF9pbWc9bmV3IExhenlMb2FkKHtlbGVtZW50c19zZWxlY3RvcjoiLnQtaW1nIix0aHJlc2hvbGQ6ODAwfSksbGF6eWxvYWRfYmdpbWc9bmV3IExhenlMb2FkKHtlbGVtZW50c19zZWxlY3RvcjoiLnQtYmdpbWciLHNob3dfd2hpbGVfbG9hZGluZzohMSxwbGFjZWhvbGRlcjoiIix0aHJlc2hvbGQ6ODAwfSksbGF6eWxvYWRfaWZyYW1lPW5ldyBMYXp5TG9hZCh7ZWxlbWVudHNfc2VsZWN0b3I6Ii50LWlmcmFtZSJ9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzbGlkZS5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bGF6eWxvYWRfY292ZXIudXBkYXRlKCksbGF6eWxvYWRfaW1nLnVwZGF0ZSgpLGxhenlsb2FkX2JnaW1nLnVwZGF0ZSgpfSksNTAwKX0pKSwvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiFkb2N1bWVudC5ib2R5LmNsYXNzTGlzdCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5jbGFzc0xpc3QuYWRkKCJ0LW1iZml4IiksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1tYmZpeCIpO3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5jbGFzc0xpc3QuYWRkKCJ0LW1iZml4X2hpZGUiKX0pLDUwKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe251bGwhPT10LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX0pLDFlMyl9fSksNTAwKX0pKTsKCmZ1bmN0aW9uIHRfYW5pbWF0ZV9faW5pdCgpe3RfYW5pbWF0ZV9fY2hlY2tBbmltYXRpb25BdmFpbGFiaWxpdHkoKSYmKHRfYW5pbWF0ZV9fZ2VuZXJhdGVTdHlsZXMoKSx0X2FuaW1hdGVfX3dyYXBUZXh0V2l0aE9wYWNpdHkoKSx0X2FuaW1hdGVfX2FkZE5vSG92ZXJDbGFzc1RvQnRucygpLHRfYW5pbWF0ZV9fcHJldmVudEhvcml6b250YWxTY3JvbGwoKSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg+PTEyMDAmJnRfYW5pbWF0ZV9fcGFyc2VOdW1iZXJUZXh0KCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X2FuaW1hdGVfX3N0YXJ0QW5pbWF0aW9uKCl9KSwxNTAwKSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGVja01vYmlsZSh0KXtyZXR1cm4gdC5maWx0ZXIoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xvc2VzdCgiLnQzOTZfX2VsZW0sIC50Mzk2X19ncm91cCIpLGEsbjtyZXR1cm4hKCFlfHwieSIhPT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW1vYmlsZSIpKXx8KHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyIik/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGUiKSwoZnVuY3Rpb24odCl7dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LCIiKX0pKTp0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsIiIpLCExKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsZSl7aWYodCl7dmFyIGE9InQtYW5pbWF0ZSI7dC5jbGFzc0xpc3QucmVtb3ZlKGEpLGUmJigic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSksZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1hKyJfIitlO3QuY2xhc3NMaXN0LnJlbW92ZShuKX0pKSl9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fcHJldmVudEhvcml6b250YWxTY3JvbGwoKXt2YXIgdCxlPUFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlubGVmdCJdJykpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkLCAudC1jb3ZlciIpJiZ0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0PndpbmRvdy5pbm5lcldpZHRofSkpOyFlLmxlbmd0aHx8d2luZG93LmlubmVyV2lkdGg8OTgwfHxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlO3QuY2xvc2VzdCgiLnIiKS5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfX292ZXJmbG93LXgtaGlkZGVuIil9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGVja0FuaW1hdGlvbkF2YWlsYWJpbGl0eSgpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXJlY29yZHMiKSxlPXQ/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYmxvY2tzLWFuaW1hdGlvbm9mZiIpOm51bGwsYT10P3QuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKTpudWxsO2lmKC9Cb3QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwieWVzIj09PWV8fHRfYW5pbWF0ZV9fY2hlY2tJRSgpfHwiZWRpdCI9PT1hKXt2YXIgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIik7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LCIiKX0pKSwhMX1yZXR1cm4hMH1mdW5jdGlvbiB0X2FuaW1hdGVfX2dlbmVyYXRlU3R5bGVzKCl7dmFyIHQ7aWYoISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDM5NiIpKXtmb3IodmFyIGU9dF9hbmltYXRlX19nZXRCcmVha3BvaW50c0FycigpLGE9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW4iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWludXAiXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWluZG93biJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5sZWZ0Il0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbnJpZ2h0Il0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9Inpvb21pbiJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29tb3V0Il0ge29wYWNpdHk6IDA7LXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5LCB0cmFuc2Zvcm07dHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgdHJhbnNmb3JtOy13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7dHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTksIDEsIDAuMjIsIDEpO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xOSwgMSwgMC4yMiwgMSk7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO30nLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIi50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbiJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9ImZhZGVpbnVwIl0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLScraS5taW5SZXMrJz0iZmFkZWluZG93biJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9ImZhZGVpbmxlZnQiXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJmYWRlaW5yaWdodCJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9Inpvb21pbiJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9Inpvb21vdXQiXSB7b3BhY2l0eTogMDstd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHksIHRyYW5zZm9ybTt0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5LCB0cmFuc2Zvcm07LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAxczt0cmFuc2l0aW9uLWR1cmF0aW9uOiAxczstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xOSwgMSwgMC4yMiwgMSk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE5LCAxLCAwLjIyLCAxKTstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47fX0nKX1hKz0nLnQzOTYgLnQtdGl0bGUudC1hbmltYXRlIHstd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDEuMnM7dHJhbnNpdGlvbi1kdXJhdGlvbjogMS4yczt9LnQzOTYgLnQtZGVzY3IudC1hbmltYXRlLC50Mzk2IC50LXVwdGl0bGUudC1hbmltYXRlLC50Mzk2IC50LXN1YnRpdGxlLnQtYW5pbWF0ZSwudDM5NiAudC10ZXh0LnQtYW5pbWF0ZSB7LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjdzO3RyYW5zaXRpb24tZHVyYXRpb246IDAuN3M7fS50Mzk2IC50LWl0ZW0udC1hbmltYXRlIHstd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuNXM7dHJhbnNpdGlvbi1kdXJhdGlvbjogMC41czt9LnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbiJdIHtvcGFjaXR5OiAwO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbiJdIHtvcGFjaXR5OiAwO3RyYW5zZm9ybTogbm9uZTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW4iXSB7b3BhY2l0eTogMTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWluIl0ge29wYWNpdHk6IDE7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbnVwIl0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMTAwcHgpO3RyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDEwMHB4KTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbnVwIl0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMTAwcHgpO3RyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDEwMHB4KTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW51cCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWludXAiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmRvd24iXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMTAwcHgpO3RyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC0xMDBweCk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW5kb3duIl0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTEwMHB4KTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMTAwcHgpO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmRvd24iXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbmRvd24iXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmxlZnQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMDBweCwgMCk7dHJhbnNmb3JtOiB0cmFuc2xhdGUoMTAwcHgsIDApO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWlubGVmdCJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDEwMHB4LCAwKTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMDBweCwgMCk7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlubGVmdCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWlubGVmdCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9fScpfWErPScudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlucmlnaHQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTAwcHgsIDApO3RyYW5zZm9ybTogdHJhbnNsYXRlKC0xMDBweCwgMCk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW5yaWdodCJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC0xMDBweCwgMCk7dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTEwMHB4LCAwKTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5yaWdodCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWlucmlnaHQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9Inpvb21pbiJdIHstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC45KTt0cmFuc2Zvcm06IHNjYWxlKDAuOSk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29taW4iXSB7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuOSk7dHJhbnNmb3JtOiBzY2FsZSgwLjkpO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGU9Inpvb21pbiJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTt0cmFuc2Zvcm06IHNjYWxlKDEpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29taW4iXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7dHJhbnNmb3JtOiBzY2FsZSgxKTt9fScpfWErPScudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iem9vbW91dCJdIHstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4yKTt0cmFuc2Zvcm06IHNjYWxlKDEuMik7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29tb3V0Il0gey13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjIpO3RyYW5zZm9ybTogc2NhbGUoMS4yKTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29tb3V0Il0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO3RyYW5zZm9ybTogc2NhbGUoMSk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9Inpvb21vdXQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7dHJhbnNmb3JtOiBzY2FsZSgxKTt9fScpfWErPSIudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLWRpc3RhbmNlXSwudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXNjYWxlXXstd2Via2l0LXRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O3RyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O30iO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1kaXN0YW5jZS1yZXMtIitpLm1pblJlcysiXSwjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9Inpvb21vdXQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDt0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDt9fScpfXZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIiksbz1kb2N1bWVudC5oZWFkfHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJoZWFkIik7ci50ZXh0Q29udGVudD1hLG8uYXBwZW5kQ2hpbGQocil9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0QnJlYWtwb2ludHNBcnIoKXt2YXIgdD1bXSxlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yW2RhdGEtcmVjb3JkLXR5cGU9IjM5NiJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yW2RhdGEtcGFyZW50dHBsaWQ9IjM5NiJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQnKSk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24oZSl7aWYoZS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkIikpe3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXNjcmVlbnMiKSxuPShhPShhPWE/YS5zcGxpdCgiLCIpOlsxMjAwLDk2MCw2NDAsNDgwLDMyMF0pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlSW50KHQsMTApfSkpKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybi0xPT09dC5pbmRleE9mKGUpfSkpO3Q9dC5jb25jYXQobil9fSkpLHQ9dF9hbmltYXRlX19zb3J0QXJyKHQpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeSh0LGUpe3ZhciBhPSIiLG49ITEsaT10W2UrMV0scj10W2VdLTEsbz1lPT09dC5sZW5ndGgtMSxzPWU9PT10Lmxlbmd0aC0yO3JldHVybiBvP249ITA6YSs9cz8iQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogIityKyJweCkgeyI6IkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6ICIraSsicHgpIGFuZCAobWF4LXdpZHRoOiAiK3IrInB4KSB7Iix7dGV4dDphLGlzQ29udGludWU6bixtaW5SZXM6aX19ZnVuY3Rpb24gdF9hbmltYXRlX19zb3J0QXJyKHQpe3JldHVybiB0LnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3N0YXJ0QW5pbWF0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnIiKSxlPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCh0LChmdW5jdGlvbih0KXtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1ncm91cD15ZXNdIil9KSksYT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodCwoZnVuY3Rpb24odCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcignLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtY2hhaW49InllcyJdJyl9KSksbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIik7aWYobj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuISgieWVzIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtZ3JvdXAiKXx8InllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWNoYWluIil8fHQuZ2V0QXR0cmlidXRlKCJvYnNlcnZlci1yZWFkeSIpKX0pKSx3aW5kb3cuaW5uZXJXaWR0aDwxMjAwJiYoZT10X2FuaW1hdGVfX2NoZWNrTW9iaWxlKGUpLGE9dF9hbmltYXRlX19jaGVja01vYmlsZShhKSxuPXRfYW5pbWF0ZV9fY2hlY2tNb2JpbGUobikpLGUubGVuZ3RofHxuLmxlbmd0aHx8YS5sZW5ndGgpe3RfYW5pbWF0ZV9fc2V0QW5pbWF0aW9uU3RhdGUoZSxhLG4pLGU9dF9hbmltYXRlX19oYXNXYWl0QW5pbWF0aW9uKGUpLG49dF9hbmltYXRlX19oYXNXYWl0QW5pbWF0aW9uKG4pLGE9dF9hbmltYXRlX19oYXNXYWl0QW5pbWF0aW9uKGEpO3ZhciBpPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiYvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSooc2FmYXJpfG1vYmlsZSkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYvKG9zIHx2ZXJzaW9uXC8pMTUoLnxfKVs0LTldL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZigiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiaW4gd2luZG93JiYhaSl7aWYoZS5sZW5ndGgpe3ZhciByPVtdO2UuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlIiksYSxuO2lmKCJmYWRlaW5kb3duIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3R5bGUiKSYmZS5jbG9zZXN0KCIudC1jb3ZlciIpKXt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGU6bm90KDpmaXJzdC1jaGlsZCkiKTtpJiYoZT1pKX1yLnB1c2goZSl9KSksci5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT17cm9vdE1hcmdpbjp0Lm9mZnNldEhlaWdodC81Ki0xKyJweCAwcHgifSxhO25ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24odCxlKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKHQuaXNJbnRlcnNlY3Rpbmcpe3ZhciBhPXQudGFyZ2V0O2UudW5vYnNlcnZlKGEpO3ZhciBuPWEuY2xvc2VzdCgiLnIiKS5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIik7bj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuISh0LmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpfHwieWVzIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtY2hhaW4iKSl9KSksdF9hbmltYXRlX19tYWtlU2VjdGlvbkJ1dHRvbldhaXQoYSksdF9hbmltYXRlX19zYXZlU2VjdGlvbkhlYWRlclN0YXJ0VGltZShhKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX3dhaXQiKSx0X2FuaW1hdGVfX3JlbW92ZU5vSG92ZXJDbGFzc0Zyb21CdG5zKHQpLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyh0LCExKX0pKX19KSl9KSxlKS5vYnNlcnZlKHQpfSkpfXZhciBvO2lmKG4ubGVuZ3RoJiZuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXt9LGE9dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsInRyaWdnZXItb2Zmc2V0Iik7YSYmKGUucm9vdE1hcmdpbj0iMHB4IDBweCAiKy0xKmEucmVwbGFjZSgicHgiLCIiKSsicHggMHB4Iik7dmFyIG49bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChmdW5jdGlvbih0LGUpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGE9dC50YXJnZXQ7aWYoIWEuZGVtYW5kVHJhbnNmb3JtJiZhLnN0eWxlLnRyYW5zZm9ybSlhLmRlbWFuZFRyYW5zZm9ybT1hLnN0eWxlLnRyYW5zZm9ybSxhLnN0eWxlLnRyYW5zZm9ybT0idW5zZXQiO2Vsc2V7dmFyIG49d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkudHJhbnNmb3JtO2Euc3R5bGUudHJhbnNmb3JtfHwibm9uZSI9PT1ufHwoYS5kZW1hbmRUcmFuc2Zvcm09bixhLnN0eWxlLnRyYW5zZm9ybT0idW5zZXQiKX1pZih0LmlzSW50ZXJzZWN0aW5nKXthLmNsb3Nlc3QoIi50MTA5MyIpfHxlLnVub2JzZXJ2ZShhKTt2YXIgaT1hLnN0eWxlLnRyYW5zaXRpb25EZWxheXx8IjBtcyI7aT0tMSE9PWkuaW5kZXhPZigibXMiKT9wYXJzZUludChpKSsyNTA6MWUzKnBhcnNlRmxvYXQoaSkrMjUwO3ZhciByPWZ1bmN0aW9uIHQoKXthLmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV93YWl0IiksdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyhhKSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3MoYSwhMCksImFuaW1hdGVkbnVtYmVyIj09PXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShhLCJzdHlsZSIpJiZ0X2FuaW1hdGVfX2FuaW1hdGVOdW1iZXJzKGEpfTthLmRlbWFuZFRyYW5zZm9ybSYmLTEhPT1hLmRlbWFuZFRyYW5zZm9ybS5pbmRleE9mKCJtYXRyaXgiKSYmKGEuc3R5bGUudHJhbnNmb3JtPSIiKSxhLmRlbWFuZFRyYW5zZm9ybSYmInVuc2V0Ij09PWEuc3R5bGUudHJhbnNmb3JtJiYoYS5zdHlsZS50cmFuc2Zvcm09YS5kZW1hbmRUcmFuc2Zvcm0sZGVsZXRlIGEuZGVtYW5kVHJhbnNmb3JtKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3IoKX0pLGkpfX0pKX0pLGUpO3QuZGF0YXNldC5vYnNlcnZlclJlYWR5PSEwLG4ub2JzZXJ2ZSh0KX0pKSxhLmxlbmd0aCkobz1mdW5jdGlvbiB0KCl7dF9hbmltYXRlX19nZXRDaGFpbk9mZnNldHMoYSl9KSgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7bygpfSkpKSxzZXRJbnRlcnZhbChvLDVlMyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2YXIgdCxlPXdpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQ7dF9hbmltYXRlX19hbmltYXRlQ2hhaW5zQmxvY2tzKGEsZSl9KSkpfWVsc2V7dmFyIG87KG89ZnVuY3Rpb24gdCgpe3RfYW5pbWF0ZV9fZ2V0R3JvdXBzT2Zmc2V0cyhlKSx0X2FuaW1hdGVfX2dldENoYWluT2Zmc2V0cyhhKSx0X2FuaW1hdGVfX2dldEVsZW1zT2Zmc2V0cyhuKX0pKCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZShvKSksc2V0SW50ZXJ2YWwobyw1ZTMpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dmFyIHQ9dF9hbmltYXRlX19kZWxldGVBbmltYXRlZEVscyhlLG4pO249dFswXTt2YXIgaT10X2FuaW1hdGVfX2FuaW1hdGVPblNjcm9sbChlPXRbMV0sYSxuKTtpJiZpLmxlbmd0aCYmKGU9aVswXSxhPWlbMV0sbj1pWzJdKX0pKSl9QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwIik7ZSYmZS5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dmFyIHQ9d2luZG93LnBhZ2VZT2Zmc2V0K3dpbmRvdy5pbm5lckhlaWdodDtpZihlLmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlIikmJiJ5ZXMiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1jaGFpbiIpfHxlLnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGVbZGF0YS1hbmltYXRlLWNoYWluPXllc10iKSl7dmFyIGE9W2VdO3RfYW5pbWF0ZV9fc2V0QW5pbWF0aW9uU3RhdGVDaGFpbnMoYSksdF9hbmltYXRlX19nZXRDaGFpbk9mZnNldHMoYT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYSwoZnVuY3Rpb24odCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZV93YWl0Iil9KSkpLHRfYW5pbWF0ZV9fYW5pbWF0ZUNoYWluc0Jsb2NrcyhhLHQpfX0pKSl9KSl9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZU9uU2Nyb2xsKHQsZSxhKXtpZih0Lmxlbmd0aHx8ZS5sZW5ndGh8fGEubGVuZ3RoKXt2YXIgbj13aW5kb3cucGFnZVlPZmZzZXQsaT1uK3dpbmRvdy5pbm5lckhlaWdodCxyLG8scztyZXR1cm5bdF9hbmltYXRlX19hbmltYXRlR3JvdXBzKHQsaSxuKSx0X2FuaW1hdGVfX2FuaW1hdGVDaGFpbnNCbG9ja3MoZSxpLG4pLHRfYW5pbWF0ZV9fYW5pbWF0ZUVsZW1zKGEsaSxuKV19fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZUdyb3Vwcyh0LGUpe3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKHQuY3VyVG9wT2Zmc2V0PGUpe3ZhciBhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO2E9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGEsKGZ1bmN0aW9uKHQpe3JldHVybiEodC5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZV9fYnRuLXdhaXQtY2hhaW4iKXx8InllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWNoYWluIikpfSkpLHRfYW5pbWF0ZV9fbWFrZVNlY3Rpb25CdXR0b25XYWl0KHQpLHRfYW5pbWF0ZV9fc2F2ZVNlY3Rpb25IZWFkZXJTdGFydFRpbWUodCksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV93YWl0IiksdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMSl9KSl9fSkpLHR9ZnVuY3Rpb24gdF9hbmltYXRlX19hbmltYXRlQ2hhaW5zQmxvY2tzKHQsZSl7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5pdGVtc09mZnNldHNbMF08ZSYmdC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlX3dhaXQiKS5sZW5ndGgmJih0X2FuaW1hdGVfX2FuaW1hdGVDaGFpbkl0ZW1zT25TY3JvbGwodCxlKSx0Lml0ZW1zT2Zmc2V0cy5sZW5ndGgmJnRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uX19vdXRPZlR1cm4odCkpfSkpLHR9ZnVuY3Rpb24gdF9hbmltYXRlX19hbmltYXRlRWxlbXModCxlLGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIG49dF9hbmltYXRlX19kZXRlY3RFbGVtVHJpZ2dlck9mZnNldCh0LGUpO3JldHVybiB0LmN1clRvcE9mZnNldDxuPyh0LmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV93YWl0IiksdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMSksImFuaW1hdGVkbnVtYmVyIj09PXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJzdHlsZSIpJiZ0X2FuaW1hdGVfX2FuaW1hdGVOdW1iZXJzKHQpLCEwKTohKHQuY3VyVG9wT2Zmc2V0PGEpJiZ2b2lkIDB9KSksdH1mdW5jdGlvbiB0X2FuaW1hdGVfX2RlbGV0ZUFuaW1hdGVkRWxzKHQsZSl7dmFyIGE9d2luZG93LnBhZ2VZT2Zmc2V0LG49W10saT1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0LmN1clRvcE9mZnNldDw9YSl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsWyJ3YWl0Iiwibm8taG92ZXIiXSl9KSl9ZWxzZSBuLnB1c2godCl9KSksZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmN1clRvcE9mZnNldDw9YT8odF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LFsid2FpdCIsIm5vLWhvdmVyIl0pLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyh0LCExKSk6aS5wdXNoKHQpfSkpLFtpLG5dfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZUNoYWluSXRlbXNPblNjcm9sbCh0LGUpe3ZhciBhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV93YWl0W2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIik7YT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKTt2YXIgbj0wLGk9MCxyPXQuaXRlbXNPZmZzZXRzWzBdLG89LjE2LHM9dF9hbmltYXRlX19nZXREZWxheUZyb21QcmV2aW91c1Njcm9sbEV2ZW50KHQsbyksbD10X2FuaW1hdGVfX2dldFNlY3Rpb25IZWFkRGVhbHkodCk7YS5sZW5ndGgmJmFbMF0uY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3ciKTtmb3IodmFyIG09MDttPGEubGVuZ3RoO20rKyl7dmFyIGM9YVttXSxfPXQuaXRlbXNPZmZzZXRzW21dO2lmKCEoXzxlKSlicmVhaztfIT09ciYmKGMuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3ciKSxuPSsraSxyPV8pO3ZhciBmPW4qbytzK2w7Yy5zdHlsZS50cmFuc2l0aW9uRGVsYXk9ZisicyIsYy5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfd2FpdCIpLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyhjLCExKSxjLnNldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0YXJ0LXRpbWUiLERhdGUubm93KCkrMWUzKmYpLGNbMF09PT1hW2EubGVuZ3RoLTFdJiZ0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbih0LGYpLCtfPT0rciYmbisrLGEuc3BsaWNlKG0sMSksdC5pdGVtc09mZnNldHMuc3BsaWNlKG0sMSksbS0tfXRfYW5pbWF0ZV9fY2F0Y2hUcmFuc2l0aW9uRW5kRXZlbnQodCl9ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRTZWN0aW9uSGVhZERlYWx5KHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtc2VjdGlvbl9fdGl0bGUudC1hbmltYXRlIiksYT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNlY3Rpb25fX2Rlc2NyLnQtYW5pbWF0ZSIpLG49MDtpZihlKXt2YXIgaT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0YXJ0LXRpbWUiKXx8MDtpZihEYXRlLm5vdygpLWk8PTE2MClyZXR1cm4gbj0uMTZ9aWYoYSl7dmFyIHI9YS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIil8fDA7aWYoRGF0ZS5ub3coKS1yPD0xNjApcmV0dXJuIG49LjE2fXJldHVybiBufWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0RGVsYXlGcm9tUHJldmlvdXNTY3JvbGxFdmVudCh0LGUpe3ZhciBhPSF0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfc3RhcnRlZCIpLmxlbmd0aCxuPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93LnQtYW5pbWF0ZV9zdGFydGVkIik7aWYobj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfX2NoYWluX3Nob3dlZCIpfSkpLGF8fCFuLmxlbmd0aClyZXR1cm4gMDtpZihuLmxlbmd0aCl7dmFyIGkscixvPShuW24ubGVuZ3RoLTFdLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0YXJ0LXRpbWUiKXx8MCktRGF0ZS5ub3coKTtyZXR1cm4gbzw9MD9lOm8vMWUzK2V9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyh0LGUpe2lmKHQpe2lmKGUpe3ZhciBhPSJ0LWFuaW1hdGUtZm9yLXdyYXBwZXIiLG49dC5jbG9zZXN0KCIuIithKTtuJiZuLmNsYXNzTGlzdC5yZW1vdmUoYSl9dmFyIGk7aWYodC5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfc3RhcnRlZCIpLCJmYWRlaW5sZWZ0Ij09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3R5bGUiKSl7dmFyIHI9dC5jbG9zZXN0KCIudC1hbmltYXRlX19vdmVyZmxvdy14LWhpZGRlbiIpO3ImJiFyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmxlZnQiXTpub3QoLnQtYW5pbWF0ZV9zdGFydGVkKScpJiZyLmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV9fb3ZlcmZsb3cteC1oaWRkZW4iKX19fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2F0Y2hUcmFuc2l0aW9uRW5kRXZlbnQodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3cudC1hbmltYXRlX3N0YXJ0ZWQiKTtlPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChlLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZV9fY2hhaW5fc2hvd2VkIil9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt2YXIgZTtbInRyYW5zaXRpb25lbmQiLCJ3ZWJraXRUcmFuc2l0aW9uRW5kIiwib1RyYW5zaXRpb25FbmQiLCJvdHJhbnNpdGlvbmVuZCIsIk1TVHJhbnNpdGlvbkVuZCJdLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuYWRkRXZlbnRMaXN0ZW5lcihlLChmdW5jdGlvbigpe3RfYW5pbWF0ZV9fYWRkRXZlbnRPbkFuaW1hdGVDaGFpbih0KX0pKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSwoZnVuY3Rpb24oKXt0X2FuaW1hdGVfX2FkZEV2ZW50T25BbmltYXRlQ2hhaW4odCl9KSl9KSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19wYXJzZU51bWJlclRleHQoKXt2YXIgdD13aW5kb3cucGFnZVlPZmZzZXQsZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0nYW5pbWF0ZWRudW1iZXInXSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24oZSl7dmFyIGEsbj0iIixpPWUucXVlcnlTZWxlY3RvckFsbCgic3BhbiIpO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7bis9dC5nZXRBdHRyaWJ1dGUoInN0eWxlIil8fCIiLHQucmVtb3ZlQXR0cmlidXRlKCJzdHlsZSIpLHQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXJlZGFjdG9yLXN0eWxlIil9KSksZS5xdWVyeVNlbGVjdG9yQWxsKCdkaXZbZGF0YS1jdXN0b21zdHlsZT0ieWVzIl0nKS5sZW5ndGgpe3ZhciByPWUucXVlcnlTZWxlY3RvcignZGl2W2RhdGEtY3VzdG9tc3R5bGU9InllcyJdJyk7YT1yP3IuaW5uZXJIVE1MOiIiO3ZhciBvPWUuZ2V0QXR0cmlidXRlKCJzdHlsZSIpfHwiIixzPWUucXVlcnlTZWxlY3RvcigiZGl2W2RhdGEtY3VzdG9tc3R5bGVdIiksbD1zP3MuZ2V0QXR0cmlidXRlKCJzdHlsZSIpOiIiO2wmJihvKz1sKSxlLnNldEF0dHJpYnV0ZSgic3R5bGUiLG8pfWVsc2UgYT1lLmlubmVySFRNTDtpZihuPW4uc3BsaXQoIjsiKS5maWx0ZXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uc3BsaXQoIjsiKS5pbmRleE9mKHQpPT09ZX0pKS5qb2luKCI7IiksIShlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ8dC01MDApJiZhLmxlbmd0aCl7dmFyIG09YS5yZXBsYWNlKC88YnI+L2csIiAiKS5yZXBsYWNlKC9bXlxkLiwgXSsvZywiIikucmVwbGFjZSgvIChcLnwsKS9nLCIiKS5yZXBsYWNlKC8oXGQpKD89XGQpIC9nLCIkMSIpLnRyaW0oKSxjPW07aWYoLTE9PT1hLmluZGV4T2YobSkmJihjPW09bS5zcGxpdCgiICIpWzBdKSwiIiE9PW0pe2Uuc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtbnVtYmVyLWNvdW50IixhKSx0X2FuaW1hdGVfX2NoYW5nZU51bWJlck9uWmVybyhlLGEucmVwbGFjZShjLCJudW0iKSk7dmFyIF89ZS5xdWVyeVNlbGVjdG9yQWxsKCJzcGFuIik7Xz1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoXywoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCIudC1hbmltYXRlX19udW1iZXIiKX0pKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKF8sKGZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJzdHlsZSIsbil9KSl9fX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2NoYW5nZU51bWJlck9uWmVybyh0LGUpe3QuaW5uZXJIVE1MPWUucmVwbGFjZSgvbnVtL2csJzxzcGFuIGNsYXNzPSJ0LWFuaW1hdGVfX251bWJlciI+MDwvc3Bhbj4nKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FuaW1hdGVOdW1iZXJzKHQpe2lmKCF0KXJldHVybiExO3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtbnVtYmVyLWNvdW50IiksYT1bXSxuPXQucXVlcnlTZWxlY3RvckFsbCgic3BhbiIpOyhuPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChuLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoIi50LWFuaW1hdGVfX251bWJlciIpfSkpKS5sZW5ndGgmJihhPW5bMF0uZ2V0QXR0cmlidXRlKCJzdHlsZSIpfHwiIik7dmFyIGk9W10scj1udWxsO2lmKGUpe3I9ZS5tYXRjaCgvXGQrXC5cZCt8XGQrLFxkKy9nKTt2YXIgbz1lLm1hdGNoKC9cZCsvZykscyxsO2UucmVwbGFjZSgvKFxkKSg/PSBcZCkgL2csIiQxIikuc3BsaXQoIiAiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpc05hTihwYXJzZUludCh0LnJlcGxhY2UoL1teXGQuLCBdKy9nLCIiKSwxMCkpfHxpLnB1c2godC5yZXBsYWNlKC9bXlxkLiwgXSsvZywiIikpfSkpfXZhciBtPTAsYz0hMSxfPSExO3QucmVtb3ZlQXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtbnVtYmVyLWNvdW50IiksbnVsbCE9PXImJihfPS0xIT09clswXS5pbmRleE9mKCIsIikpLGkuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt2YXIgYTtudWxsIT09ciYmKC0xIT09dC5pbmRleE9mKCIsIikmJihhPXQuc3BsaXQoIiwiKSksLTEhPT10LmluZGV4T2YoIi4iKSYmKGE9dC5zcGxpdCgiLiIpKSwtMT09PXQuaW5kZXhPZigiLCIpJiYtMT09PXQuaW5kZXhPZigiLiIpfHwobT1hWzFdLmxlbmd0aCxpW2VdPSthLmpvaW4oIi4iKSxjPSEwKSl9KSk7dmFyIGY9dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlX19udW1iZXIiKTtpZihpWzBdKXt2YXIgZD1OdW1iZXIoaVswXSl8fDAsdT0wLHk9TWF0aC5wb3coMTAsbSk7YyYmKGQqPXksdSo9eSk7dmFyIHA9MTIsaD0wLGc9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7aWYodSs9ZC8xMDgsaD1jPyhNYXRoLnJvdW5kKHUpL3kpLnRvRml4ZWQobSkrIiI6TWF0aC5mbG9vcih1KSsiIixvLmxlbmd0aD4xJiYoaD1oLnJlcGxhY2UoLyhcZCkoPz0oXGR7M30pKyhbXlxkXXwkKSkvZywiJDEgIikpLF8mJihoPWgucmVwbGFjZSgvXC4vZywiLCIpKSxmJiYoZi50ZXh0Q29udGVudD1oKSx1Pj1kKXtjbGVhckludGVydmFsKGcpLHQuaW5uZXJIVE1MPWU7dmFyIG49dC5xdWVyeVNlbGVjdG9yQWxsKCJzcGFuIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LnNldEF0dHJpYnV0ZSgic3R5bGUiLGEpfSkpfX0pLHApfX1mdW5jdGlvbiB0X2FuaW1hdGVfX3NldEFuaW1hdGlvblN0YXRlKHQsZSxhKXt2YXIgbj13aW5kb3cucGFnZVlPZmZzZXQsaT1uK3dpbmRvdy5pbm5lckhlaWdodDt0X2FuaW1hdGVfX3NldEdyb3Vwc0Jsb2Nrc1N0YXRlKHQsbixpKSxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fYXNzaWduQ2hhaW5EZWxheSh0LGksbiksdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb25fX291dE9mVHVybih0KX0pKSx0X2FuaW1hdGVfX3NldEFuaW1FTGVtc1N0YXRlKGEsbixpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3Rocm90dGxlKHRfYW5pbWF0ZV9fcmVtb3ZlSW5saW5lQW5pbVN0eWxlcykpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2V0QW5pbUVMZW1zU3RhdGUodCxlLGEpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0O2lmKG48ZS01MDApcmV0dXJuIHRfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCwibm8taG92ZXIiKSwiYW5pbWF0ZWRudW1iZXIiPT09dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsInN0eWxlIikmJnRfYW5pbWF0ZV9fYW5pbWF0ZU51bWJlcnModCksITA7dmFyIGk9dF9hbmltYXRlX19kZXRlY3RFbGVtVHJpZ2dlck9mZnNldCh0LGEpO3RfYW5pbWF0ZV9fc2V0Q3VzdG9tQW5pbVNldHRpbmdzKHQsbixhKSxuPGkmJiF0LmNsb3Nlc3QoIi50MTA5MyIpJiYodF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMCksImFuaW1hdGVkbnVtYmVyIj09PXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJzdHlsZSIpJiZ0X2FuaW1hdGVfX2FuaW1hdGVOdW1iZXJzKHQpKSwobj49aXx8dC5jbG9zZXN0KCIudDEwOTMiKSkmJnQuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX3dhaXQiKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3NldEdyb3Vwc0Jsb2Nrc1N0YXRlKHQsZSxhKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO249QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKGZ1bmN0aW9uKHQpe3JldHVybiEoInllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWNoYWluIikpfSkpO3ZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDt0X2FuaW1hdGVfX3JlbW92ZUFuaW1Gcm9tSGlkZGVuU2xpZGVzKHQpO3ZhciByPXRfYW5pbWF0ZV9fYXNzaWduU2VjdGlvbkRlbGF5KHQpO3RfYW5pbWF0ZV9fYXNzaWduR3JvdXBEZWxheSh0LHIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24obil7dmFyIHI9bi5jbG9zZXN0KCIudDM5N19fb2ZmIil8fG4uY2xvc2VzdCgiLnQzOTVfX29mZiIpfHxuLmNsb3Nlc3QoIi50NDAwX19vZmYiKTtpZihuLmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX25vLWhvdmVyIikmJnImJm4uY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX25vLWhvdmVyIiksaTw9ZS0xMDApcmV0dXJuIHRfYW5pbWF0ZV9fc2F2ZVNlY3Rpb25IZWFkZXJTdGFydFRpbWUodCksdF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyhuLCJuby1ob3ZlciIpLG4uc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIiLCEwO2k8YSYmaT5lLTEwMCYmKHRfYW5pbWF0ZV9fbWFrZVNlY3Rpb25CdXR0b25XYWl0KHQpLG4uY2xhc3NMaXN0LmNvbnRhaW5zKCIudC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpfHwodF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyhuKSxyP24uY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX3dhaXQiKTp0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3MobiwhMSkpKSxpPj1hJiZuLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV93YWl0Iil9KSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19zZXRBbmltYXRpb25TdGF0ZUNoYWlucyh0KXtpZighdHx8IXQubGVuZ3RoKXJldHVybiExO3ZhciBlPXdpbmRvdy5wYWdlWU9mZnNldCxhPWUrd2luZG93LmlubmVySGVpZ2h0O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dF9hbmltYXRlX19hc3NpZ25DaGFpbkRlbGF5KHQsYSxlKSx0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbl9fb3V0T2ZUdXJuKHQpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYXNzaWduU2VjdGlvbkRlbGF5KHQpe3ZhciBlPTAsYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNlY3Rpb25fX3RpdGxlLnQtYW5pbWF0ZSIpLG49dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX19kZXNjci50LWFuaW1hdGUiKTtyZXR1cm4gYS5sZW5ndGgmJihlPS4xNiksbi5sZW5ndGgmJihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWUrInMifSkpLGUrPS4xNiksZX1mdW5jdGlvbiB0X2FuaW1hdGVfX2Fzc2lnbkdyb3VwRGVsYXkodCxlKXt2YXIgYT0wO2lmKHQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtYW5pbWF0ZS1vcmRlcl0iKS5sZW5ndGgpdF9hbmltYXRlX19hc3NpZ25PcmRlcmVkRWxlbXNEZWxheSh0LGUpO2Vsc2V7dmFyIG49dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1pbWcudC1hbmltYXRlIiksaT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXVwdGl0bGUudC1hbmltYXRlIikscj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXRpdGxlLnQtYW5pbWF0ZSIpO3I9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHIsKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygidC1zZWN0aW9uX190aXRsZSIpfSkpO3ZhciBvPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtZGVzY3IudC1hbmltYXRlIik7bz1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobywoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNlY3Rpb25fX2Rlc2NyIil9KSk7dmFyIHM9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1idG4udC1hbmltYXRlLCAudC1idG53cmFwcGVyLnQtYW5pbWF0ZSIpO3M9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHMsKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsb3Nlc3QoIi50LXNlY3Rpb25fX2JvdHRvbXdyYXBwZXIiKX0pKTt2YXIgbD10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXRpbWVyLnQtYW5pbWF0ZSIpLG09dC5xdWVyeVNlbGVjdG9yQWxsKCJmb3JtLnQtYW5pbWF0ZSIpO24ubGVuZ3RoJiYoYT0uNSksci5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwociwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSksci5sZW5ndGgmJihhKz0uMyksby5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSksby5sZW5ndGgmJihhKz0uMyksaS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSksaS5sZW5ndGgmJihhKz0uMyksKGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGgpJiYoYSs9LjIpLGwubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGwsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpLGwubGVuZ3RoJiYoYSs9LjUpLHMubGVuZ3RoJiYoc1swXS5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyIpLDI9PT1zLmxlbmd0aCYmKGErPS40KSwyPT09cy5sZW5ndGgmJihzWzFdLnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIiksMCE9PW0ubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG0sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2Fzc2lnbk9yZGVyZWRFbGVtc0RlbGF5KHQsZSl7dmFyIGE9MDtlJiYoYT1lKTt2YXIgbj10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSIxIl0nKSxpPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjIiXScpLHI9dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iMyJdJyksbz10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSI0Il0nKSxzPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjUiXScpLGw9dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iNiJdJyksbT10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSI3Il0nKSxjPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjgiXScpLF89dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iOSJdJyk7bi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSksbi5sZW5ndGgmJmkubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UoaVswXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RoKSYmci5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShyWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwociwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpLChuLmxlbmd0aHx8aS5sZW5ndGh8fHIubGVuZ3RoKSYmby5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShvWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpLChuLmxlbmd0aHx8aS5sZW5ndGh8fHIubGVuZ3RofHxvLmxlbmd0aCkmJnMubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2Uoc1swXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHMsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGh8fHMubGVuZ3RoKSYmbC5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShsWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobCwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpLChuLmxlbmd0aHx8aS5sZW5ndGh8fHIubGVuZ3RofHxvLmxlbmd0aHx8cy5sZW5ndGh8fGwubGVuZ3RoKSYmbS5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShtWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobSwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpLChuLmxlbmd0aHx8aS5sZW5ndGh8fHIubGVuZ3RofHxvLmxlbmd0aHx8cy5sZW5ndGh8fGwubGVuZ3RofHxtLmxlbmd0aCkmJmMubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UoY1swXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGh8fHMubGVuZ3RofHxsLmxlbmd0aHx8bS5sZW5ndGh8fGMubGVuZ3RoKSYmXy5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShfWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoXywoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYXNzaWduQ2hhaW5EZWxheSh0LGUsYSl7dmFyIG49dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIiksaT0wO2lmKG4ubGVuZ3RoKXt2YXIgcj1uWzBdLG89ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0O3IuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3ciKTt2YXIgcz10X2FuaW1hdGVfX2dldEN1ckJsb2NrU2VjdGlvbkhlYWREZWxheSh0KTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKGwpe3ZhciBtPWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDtpZihtPGEpcmV0dXJuIHRfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3MobCwiIiksITA7aWYobTxlKXttIT09byYmKGwuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3ciKSxvPW0pO3ZhciBjPS4xNippK3MsXztsLnN0eWxlLnRyYW5zaXRpb25EZWxheT1jKyJzIix0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3MobCwhMSksbC5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIixEYXRlLm5vdygpKzFlMypjKSxyPT09bltuLmxlbmd0aC0xXSYmdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb24odCxjKSxpKyssWyJ0cmFuc2l0aW9uZW5kIiwid2Via2l0VHJhbnNpdGlvbkVuZCIsIm9UcmFuc2l0aW9uRW5kIiwib3RyYW5zaXRpb25lbmQiLCJNU1RyYW5zaXRpb25FbmQiXS5mb3JFYWNoKChmdW5jdGlvbih0KXtsLmFkZEV2ZW50TGlzdGVuZXIodCwoZnVuY3Rpb24oKXt0X2FuaW1hdGVfX2FkZEV2ZW50T25BbmltYXRlQ2hhaW4obCl9KSksbC5yZW1vdmVFdmVudExpc3RlbmVyKHQsKGZ1bmN0aW9uKCl7dF9hbmltYXRlX19hZGRFdmVudE9uQW5pbWF0ZUNoYWluKGwpfSkpfSkpfWVsc2UgbC5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfd2FpdCIpfSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCxlKXt2YXIgYSxuPXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIik7aWYoIW4pcmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtIitlKTt2YXIgaSxyPSJhYiIrbi5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxvLHMsbDt2b2lkIDAhPT13aW5kb3cudG5bcl0/KG89d2luZG93LnRuW3JdLmN1clJlc29sdXRpb24scz13aW5kb3cudG5bcl0uY3VyUmVzb2x1dGlvbl9tYXgsbD13aW5kb3cudG5bcl0uc2NyZWVucy5zbGljZSgpKToobz13aW5kb3cudG4uY3VyUmVzb2x1dGlvbixzPTEyMDAsbD1bMzIwLDQ4MCw2NDAsOTYwLDEyMDBdKTt2YXIgbT10LmNsb3Nlc3QoIi50Mzk2X19lbGVtLCAudDM5Nl9fZ3JvdXAiKSxjPW0mJm0uZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtbW9iaWxlIik7aWYobz09PXMpYT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLSIrZSk7ZWxzZXtpZigieSIhPT1jJiZvPDEyMDApcmV0dXJuIHQuc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsbnVsbDthPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtIitlKyItcmVzLSIrbyl9aWYoIWEmJiIiIT09YSlmb3IodmFyIF89MDtfPGwubGVuZ3RoO18rKyl7dmFyIGY9bFtfXTtpZighKGY8PW8pJiYoYT1mPT09cz90LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLSIrZSk6dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS0iK2UrIi1yZXMtIitmKSkpYnJlYWt9cmV0dXJuIGF9ZnVuY3Rpb24gdF9hbmltYXRlX19oYXNXYWl0QW5pbWF0aW9uKHQpe3JldHVybiB0LmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfd2FpdCIpfHx0LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGVfd2FpdCIpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYWRkRXZlbnRPbkFuaW1hdGVDaGFpbih0KXt0LmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fY2hhaW5fc2hvd2VkIil9ZnVuY3Rpb24gdF9hbmltYXRlX19zZXRDdXN0b21BbmltU2V0dGluZ3ModCxlLGEpe3ZhciBuPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJzdHlsZSIpLGk9dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsImRpc3RhbmNlIik7aWYoaSYmIiIhPT1pKXtzd2l0Y2goaT1pLnJlcGxhY2UoInB4IiwiIiksdC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IjBzIix0LnN0eWxlLnRyYW5zaXRpb25EZWxheT0iMHMiLG4pe2Nhc2UiZmFkZWludXAiOnQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgwLCIraSsicHgsMCkiO2JyZWFrO2Nhc2UiZmFkZWluZG93biI6dC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKDAsLSIraSsicHgsMCkiO2JyZWFrO2Nhc2UiZmFkZWlubGVmdCI6dC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKCIraSsicHgsMCwwKSI7YnJlYWs7Y2FzZSJmYWRlaW5yaWdodCI6dC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKC0iK2krInB4LDAsMCkifXRfYW5pbWF0ZV9fZm9yY2VFbGVtSW5WaWV3UG9ydFJlcGFpbnQodCxlLGEpLHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIiLHQuc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIifXZhciByPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJzY2FsZSIpO3ImJih0LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iMHMiLHQuc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIwcyIsdC5zdHlsZS50cmFuc2Zvcm09InNjYWxlKCIrcisiKSIsdF9hbmltYXRlX19mb3JjZUVsZW1JblZpZXdQb3J0UmVwYWludCh0LGUsYSksdC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IiIsdC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9IiIpO3ZhciBvPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJkZWxheSIpO28mJih0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1vKyJzIik7dmFyIHM9dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsImR1cmF0aW9uIik7cyYmKHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPXMrInMiKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3JlbW92ZUlubGluZUFuaW1TdHlsZXMoKXtpZih3aW5kb3cuaW5uZXJXaWR0aDw5ODApe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50Mzk2X19lbGVtLnQtYW5pbWF0ZTpub3QoLnQtYW5pbWF0ZV93YWl0KSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2Zvcm09IiIsdC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IiIsdC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9IiJ9KSl9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZm9yY2VFbGVtSW5WaWV3UG9ydFJlcGFpbnQodCxlLGEpe3QmJmU8YSs1MDAmJnQub2Zmc2V0SGVpZ2h0fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZGV0ZWN0RWxlbVRyaWdnZXJPZmZzZXQodCxlKXt2YXIgYT10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwidHJpZ2dlci1vZmZzZXQiKSxuPWU7cmV0dXJuIGEmJihuPWUtMSooYT1hLnJlcGxhY2UoInB4IiwiIikpKSxufWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2F2ZVNlY3Rpb25IZWFkZXJTdGFydFRpbWUodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX190aXRsZS50LWFuaW1hdGUiKSxhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fZGVzY3IudC1hbmltYXRlIik7ZS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIixEYXRlLm5vdygpKX0pKSxhLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLChmdW5jdGlvbih0KXt0LnNldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0YXJ0LXRpbWUiLERhdGUubm93KCkrMTYwKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldEN1ckJsb2NrU2VjdGlvbkhlYWREZWxheSh0KXt2YXIgZT0wO3JldHVybiB0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNlY3Rpb25fX3RpdGxlLnQtYW5pbWF0ZSIpLmxlbmd0aCYmKGUrPS4xNiksdC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX19kZXNjci50LWFuaW1hdGUiKS5sZW5ndGgmJihlKz0uMTYpLGV9ZnVuY3Rpb24gdF9hbmltYXRlX19tYWtlU2VjdGlvbkJ1dHRvbldhaXQodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIikubGVuZ3RoLGE9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX19ib3R0b213cmFwcGVyIC50LWJ0bi50LWFuaW1hdGUiKTtlLmxlbmd0aCYmYS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSwoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfX2J0bi13YWl0LWNoYWluIil9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb24odCxlKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfX2J0bi13YWl0LWNoYWluIik7YS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9ZSsuMTYrInMiLHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCksdC5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfX2J0bi13YWl0LWNoYWluIiksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKHQsITEpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uX19vdXRPZlR1cm4odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIiksYTsoZT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoZSwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfc3RhcnRlZCIpfSkpKS5sZW5ndGh8fHRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uKHQsLjE2KX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FkZE5vSG92ZXJDbGFzc1RvQnRucygpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWJ0bi50LWFuaW1hdGUiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX25vLWhvdmVyIil9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KXtpZighdClyZXR1cm4hMTt2YXIgZT10LmNsYXNzTGlzdC5jb250YWlucygidC1idG4iKT90Om51bGw7ZSYmKGUub250cmFuc2l0aW9uZW5kPWZ1bmN0aW9uKHQpeyJvcGFjaXR5IiE9PXQucHJvcGVydHlOYW1lJiYidHJhbnNmb3JtIiE9PXQucHJvcGVydHlOYW1lfHwoZS5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfbm8taG92ZXIiKSxlLnN0eWxlLnRyYW5zaXRpb25EZWxheT0iIixlLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iIix0aGlzLm9udHJhbnNpdGlvbmVuZD1udWxsKX0pfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0R3JvdXBzT2Zmc2V0cyh0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZSIpO2lmKGUpe3QuY3VyVG9wT2Zmc2V0PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDt2YXIgYT10X2FuaW1hdGlvbl9fZ2V0Wm9vbSh0KTt3aW5kb3cuaXNPbmx5U2NhbGFibGV8fCh0LmN1clRvcE9mZnNldCo9YSl9fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uX19nZXRab29tKHQpe2lmKHZvaWQgMCE9PXQuc2NhbGVGYWN0b3IpcmV0dXJuIHQuc2NhbGVGYWN0b3I7dmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKTtpZighZSlyZXR1cm4gMTt2YXIgYT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj0idGlsZGEtYmxvY2tzLTIuNyJdJyk7cmV0dXJuIGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19hcnRib2FyZF9zY2FsZSIpfHwhYSYmInVuZGVmaW5lZCIhPXR5cGVvZiB0Mzk2X2FiX19nZXRGaWVsZFZhbHVlJiYid2luZG93Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoZSwidXBzY2FsZSIpP3dpbmRvdy50bl9zY2FsZV9mYWN0b3I6MX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldENoYWluT2Zmc2V0cyh0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV93YWl0W2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIik7dC5pdGVtc09mZnNldHM9W10sQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbihlLGEpe3QuaXRlbXNPZmZzZXRzW2FdPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldH0pKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldEVsZW1zT2Zmc2V0cyh0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY3VyVG9wT2Zmc2V0PXdpbmRvdy5wYWdlWU9mZnNldCt0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDt2YXIgZT10X2FuaW1hdGlvbl9fZ2V0Wm9vbSh0KTt3aW5kb3cuaXNPbmx5U2NhbGFibGV8fCh0LmN1clRvcE9mZnNldCo9ZSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19yZW1vdmVBbmltRnJvbUhpZGRlblNsaWRlcyh0KXt2YXIgZTtpZih0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsaWRlcyIpLmxlbmd0aCl7dmFyIGE9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGlkZXNfX2l0ZW0iKTthPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xpZGVzX19pdGVtX2FjdGl2ZSIpfSkpO3ZhciBuPVtdO2EuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlIik7ZSYmbi5wdXNoKGUpfSkpLG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LCJuby1ob3ZlciIpfSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX3dyYXBUZXh0V2l0aE9wYWNpdHkoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC10aXRsZS50LWFuaW1hdGUsIC50LWRlc2NyLnQtYW5pbWF0ZSwgLnQtdXB0aXRsZS50LWFuaW1hdGUsIC50LXRleHQudC1hbmltYXRlIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgic3R5bGUiKTtpZihlJiYtMSE9PWUuaW5kZXhPZigib3BhY2l0eSIpKXt2YXIgYT10LnN0eWxlLm9wYWNpdHk7aWYoYSYmYT4wKXt0LnN0eWxlLm9wYWNpdHk9IiI7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bi5zdHlsZS5vcGFjaXR5PWE7dmFyIGk9dC5jaGlsZE5vZGVzO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7dmFyIGU9dC5jbG9uZU5vZGUoITApO24uYXBwZW5kQ2hpbGQoZSl9KSksdC5pbm5lckhUTUw9IiIsdC5hcHBlbmRDaGlsZChuKX19fSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hlY2tJRSgpe3ZhciB0PXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LGU9dC5pbmRleE9mKCJNU0lFIiksYT0iIixuPSExO3JldHVybiBlPjAmJig4IT09KGE9cGFyc2VJbnQodC5zdWJzdHJpbmcoZSs1LHQuaW5kZXhPZigiLiIsZSkpKSkmJjkhPT1hfHwobj0hMCkpLG59ImxvYWRpbmciIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT90X2FuaW1hdGVfX2luaXQoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix0X2FuaW1hdGVfX2luaXQpOwoKZnVuY3Rpb24gdDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1Zhcih0KXt0cnl7dmFyIGUsaT0vdmFyXCgoLS11Yy0oW14tXSspLShbXi1dKyktKFteLF0rKSksXHM/KC4qKVwpLy5leGVjKHQpO2lmKCFpKXJldHVybjt2YXIgcj1pWzBdLG89aVsxXSxuPWlbMl0sYT1pWzNdLGw9aVs0XSxkPWlbNV0sXyxzO2lmKCEociYmbiYmYSYmbCYmZCkpcmV0dXJuO3JldHVybntwYXJlbnQ6e2lkOmwsdHlwZTpufSxmYWxsYmFjazp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKG8pfHxkLGZpZWxkOmF9fWNhdGNoKHUpe2NvbnNvbGUuZXJyb3IoIkVycm9yIHRyeWluZyB0byBwYXJzZSBDU1MgVmFyaWFibGUiKX19ZnVuY3Rpb24gdDM5Nl9faGV4MnJnYmEodCxlKXtpZighdClyZXR1cm4hMTt2YXIgaT10Mzk2X19wYXJzZUdsb2JhbFN0eWxlQ1NTVmFyKHQpO2kmJih0PWkuZmFsbGJhY2spO3ZhciByPXQucmVwbGFjZSgvIy8sIiIpO2lmKDM9PT1yLmxlbmd0aCl7dmFyIG89clswXSxuPXJbMV0sYT1yWzJdO3Q9IiMiK28rbytuK24rYSthfXZhciBsPXBhcnNlSW50KHQuc3Vic3RyaW5nKDEpLDE2KSxkLF8scztyZXR1cm5bKDE2NzExNjgwJmwpPj4xNiwoNjUyODAmbCk+PjgsMjU1JmwscGFyc2VGbG9hdChlKV19ZnVuY3Rpb24gdDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KXt2YXIgZT1bImdhbGxlcnkiXSxpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO3JldHVybiBlLmluY2x1ZGVzKGkpfWZ1bmN0aW9uIHQzOTZfX2lzRmxleCh0KXt2YXIgZT10LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmQtZmxleCIpLGk9dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2dyb3VwLWZsZXgiKTtyZXR1cm4gZXx8aX1mdW5jdGlvbiB0Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3Jkcygpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYodCl7dmFyIGU9WyIudDk1MV9fc2lkZWJhcl9zdGlja3kiLCIudDEyMDZfX2NvbnRlbnRfc3RpY2t5IiwiLnQ3NTRfX2NvbF9maXhlZCIsIi50Nzc2X19jb2xfZml4ZWQiLCIudDc4Nl9fY29sX2ZpeGVkIiwiLnQtc3RvcmVfX3Byb2QtcG9wdXBfX2NvbF9maXhlZCIsIi50LWNhdGFsb2dfX3NpZGViYXJfc3RpY2t5Il07dDM5Nl9fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlKCk7dmFyIGk9Qm9vbGVhbihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUuam9pbigiLCAiKSkpO3QuY2xhc3NMaXN0LnJlbW92ZSgidC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIiwidC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4iKSx0LmNsYXNzTGlzdC5hZGQoaT8idC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIjoidC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4iKX19ZnVuY3Rpb24gdDM5Nl9fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlKCl7aWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0Mzk2X19vdmVyZmxvdy1zdHlsZXMiKSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt0LmlkPSJ0Mzk2X19vdmVyZmxvdy1zdHlsZXMiLHQuaW5uZXJIVE1MPSIudC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIHsgb3ZlcmZsb3c6IGNsaXA7IH1cblx0XHRcdFx0XHRcdC50LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiB7IG92ZXJmbG93OiBoaWRkZW47IH0iLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9fWZ1bmN0aW9uIHQzOTZfX2dldEFydGJvYXJkcyh0KXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGkscj1lJiYiZWRpdCI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik/Jy5yZWNvcmRbZGF0YS1yZWNvcmQtdHlwZT0iJyt0KyciXSAucjpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucmVjb3JkW2RhdGEtcGFyZW50dHBsaWQ9IicrdCsnIl0gLnI6bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCc6Jy5yW2RhdGEtcmVjb3JkLXR5cGU9IicrdCsnIl06bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCwgLnJbZGF0YS1wYXJlbnR0cGxpZD0iJyt0KyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJztyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHIpKX1mdW5jdGlvbiB0Mzk2X19nZXRaZXJvQmxvY2tzKCl7dmFyIHQ9W10uY29uY2F0KHQzOTZfX2dldEFydGJvYXJkcygiMzk2IiksdDM5Nl9fZ2V0QXJ0Ym9hcmRzKCIxMjEiKSksZTtyZXR1cm4gdC5sZW5ndGg/dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntyZWNvcmQ6dC5jbG9zZXN0KCIucjpub3QoLnQzOTdfX29mZik6bm90KC50Mzk1X19vZmYpOm5vdCgudDQwMF9fb2ZmKSIpLGFydGJvYXJkOnR9fSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVjb3JkfSkpOltdfWZ1bmN0aW9uIHQzOTZfX2lzSW5zaWRlR3JvdXBXaXRoWm9vbSh0KXtmb3IodmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtlOyl7dmFyIGk7aWYoZS5zdHlsZS56b29tKXJldHVybiEwO2U9bnVsbD09KGk9ZS5wYXJlbnRFbGVtZW50KT92b2lkIDA6aS5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKX1yZXR1cm4hMX12YXIgdDM5Nl9fdW5pcXVlSWRfX2dlbmVyYXRvcj1mdW5jdGlvbiB0KCl7dmFyIGU9MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1TdHJpbmcoZSs9MSkucGFkU3RhcnQoNiwiMCIpO3JldHVybiIiK0RhdGUubm93KCkrdH19LHQzOTZfX2dldFVuaXF1ZUlkPXQzOTZfX3VuaXF1ZUlkX19nZW5lcmF0b3IoKTtmdW5jdGlvbiB0Mzk2X2lzQmxvY2tWaXNpYmxlKHQpe3ZhciBlPXdpbmRvdy5pbm5lcldpZHRoLGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1pbiIpLHI9dC5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1heCIpO3JldHVybiEoaSYmZTxwYXJzZUludChpLDEwKSkmJiEociYmZT5wYXJzZUludChyLDEwKSl9dmFyIHQzOTZfX29uUmVhZHk9ZnVuY3Rpb24gdChlKXsibG9hZGluZyIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP2UoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixlKX07ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRGb3JtSW5wdXRzVmFsdWUodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9faW5wdXRzLXRleHRhcmVhIik7aWYoZSl7dmFyIGk9ZS52YWx1ZTtpZihpKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShpKX1jYXRjaChuKXtyZXR1cm4gY29uc29sZS5lcnJvcigiRXJyb3IgcGFyc2luZyBmb3JtIGlucHV0cyB0ZXh0YXJlYSB2YWx1ZToiLG4saSksW119fXZhciByPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX2lucHV0cy1kYXRhIik7aWYocil7dmFyIG89ci5nZXRBdHRyaWJ1dGUoImRhdGEtdmFsdWUiKTtpZihvKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShvKX1jYXRjaChuKXtyZXR1cm4gY29uc29sZS5lcnJvcigiRXJyb3IgcGFyc2luZyBmb3JtIGlucHV0cyBkYXRhOiIsbixvKSxbXX19cmV0dXJuW119ZnVuY3Rpb24gdDM5Nl9nZXRFbCh0KXtyZXR1cm4gd2luZG93LmpRdWVyeSYmdCBpbnN0YW5jZW9mIGpRdWVyeT90Lmxlbmd0aD90LmdldCgwKTpudWxsOnR9ZnVuY3Rpb24gdDM5Nl9pbml0KHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpLGk9ZT9lLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2Iik6bnVsbCxyPWU/ZS5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKTpudWxsO2lmKHIpe3QzOTZfaW5pdFROb2JqKHQsciksdDM5Nl9faW5pdE9ubHlTY2FsYWJsZSgpO3ZhciBvPSIiLG49dDM5Nl9kZXRlY3RSZXNvbHV0aW9uKHQpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxsPWEmJiJlZGl0Ij09PWEuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKTt2b2lkIDA9PT13aW5kb3cudG4uaXNFZGl0TW9kZSYmKHdpbmRvdy50bi5pc0VkaXRNb2RlPWwpLHQzOTZfc3dpdGNoUmVzb2x1dGlvbih0LG4pO3ZhciBkPSJ3aW5kb3ciPT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShyLCJ1cHNjYWxlIiksXz10Mzk2X19zZXRHbG9iYWxTY2FsZVZhcmlhYmxlcyh0LG4sZCk7aWYodDM5Nl9fc2V0U2NhbGVGYWN0b3JGb3JFbGVtZW50cyh0LF8pLHQzOTZfdXBkYXRlVE5vYmoodCksdDM5Nl9hcnRib2FyZF9idWlsZChvLHQpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXt0Mzk2X2FsbGVsZW1zX19yZW5kZXJWaWV3KHIpLHQzOTZfYWxsZ3JvdXBzX19yZW5kZXJWaWV3KHIpLHQzOTZfX2luaXRpYWxpemVBcnRib2FyZE92ZXJmbG93KGEscil9KSksd2luZG93LnRpbGRhTWVtYmVycyYmIk11dGF0aW9uT2JzZXJ2ZXIiaW4gd2luZG93KXt2YXIgcz1uZXcgTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24oZSl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXsiYXR0cmlidXRlcyI9PT1lLnR5cGUmJiJjbGFzcyI9PT1lLmF0dHJpYnV0ZU5hbWUmJmUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidGxrLWNvdXJzZXNfcGFnZSIpJiYodDM5Nl9kb1Jlc2l6ZSh0LCEwKSxzLmRpc2Nvbm5lY3QoKSl9KSl9KSk7cy5vYnNlcnZlKGRvY3VtZW50LmJvZHkse2F0dHJpYnV0ZXM6ITB9KX1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDgzMCIpJiZ0X29uUmVhZHkoKGZ1bmN0aW9uKCl7dmFyIGUsaTtbInQ4MzBfX2FsbHJlY29yZHNfcGFkZCIsInQ4MzBfX2FsbHJlY29yZHNfcGFkZC1zbWFsbCJdLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBhLmNsYXNzTGlzdC5jb250YWlucyh0KX0pKT90Mzk2X2RvUmVzaXplKHQsITApOmEuYWRkRXZlbnRMaXN0ZW5lcigiYWxsUmVjUGFkZGluZ0luaXQiLChmdW5jdGlvbigpe3QzOTZfZG9SZXNpemUodCwhMCl9KSl9KSksZSYmaSYmciYmInllcyI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1jb25uZWN0LXdpdGgtdGFiIikmJmkuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKTt2YXIgdT0iaHVnIj09PXIuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLWhlaWdodG1vZGUiKSxjO2lmKHUpe3ZhciBmPXRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dDM5Nl9fdXBkYXRlQXV0b0hlaWdodChyKX0pLDEwMCk7ZigpLHNldEludGVydmFsKGYsM2UzKSxkb2N1bWVudC5mb250cyYmZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbihmKSxyLnF1ZXJ5U2VsZWN0b3JBbGwoImltZyIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3Qub25sb2FkPWZ9KSksbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZikub2JzZXJ2ZShyLHtzdWJ0cmVlOiEwLGNoYXJhY3RlckRhdGE6ITAsY2hhcmFjdGVyRGF0YU9sZFZhbHVlOiEwfSksbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU7ImNoaWxkTGlzdCI9PT10LnR5cGUmJihBcnJheS5mcm9tKHQuYWRkZWROb2RlcykuY29uY2F0KEFycmF5LmZyb20odC5yZW1vdmVkTm9kZXMpKS5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gMyE9PXQubm9kZVR5cGUmJih0LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fZWxlbSIpfHx0LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fZ3JvdXAiKSl9KSkmJmYoKSl9KSl9KSkub2JzZXJ2ZShyLHtzdWJ0cmVlOiEwLGNoaWxkTGlzdDohMH0pfShhLmNsYXNzTGlzdC5jb250YWlucygidDIzNV9fYmVmb3JlcmVhZHkiKXx8ZSYmZS5jbG9zZXN0KCIjYWxscmVjb3Jkc3RhYmxlIil8fGEucXVlcnlTZWxlY3RvcignW2RhdGEtcmVjb3JkLXR5cGU9IjI2MyJdJykpJiZpJiZyJiZpLmFkZEV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIiwoZnVuY3Rpb24oKXt0Mzk2X2FsbGVsZW1zX19yZW5kZXJWaWV3KHIpLHQzOTZfYWxsZ3JvdXBzX19yZW5kZXJWaWV3KHIpLHQzOTZfZG9SZXNpemUodCwhMCl9KSk7dmFyIGc9ISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDYzNV9fdGV4dGhvbGRlciIpO2UmJmcmJmkmJnImJmkuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uSW5pdGVkIiwoZnVuY3Rpb24oKXt0Mzk2X2FsbGVsZW1zX19yZW5kZXJWaWV3KHIpLHQzOTZfYWxsZ3JvdXBzX19yZW5kZXJWaWV3KHIpLHQzOTZfZG9SZXNpemUodCwhMCl9KSksZSYmZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQ0MzEiKSYmaSYmciYmdF9vblJlYWR5KChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKX0pKSwvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZpJiZpLmNsYXNzTGlzdC5hZGQoInQzOTZfc2FmYXJpIiksZCYmIWwmJnRfb25GdW5jTG9hZCgidDM5Nl9zY2FsZUJsb2NrIiwoZnVuY3Rpb24oKXt0Mzk2X3NjYWxlQmxvY2sodCl9KSksbHx8InkiIT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShyLCJmaXhlZC1uZWVkLWpzIil8fHRfb25GdW5jTG9hZCgidDM5Nl9fcHJvY2Vzc0ZpeGVkQXJ0Qm9hcmQiLChmdW5jdGlvbigpe3QzOTZfX3Byb2Nlc3NGaXhlZEFydEJvYXJkKHIpfSkpLHQzOTZfX3Byb2Nlc3NBYnNvbHV0ZUFydEJvYXJkKHIpLHQzOTZfX3Byb2Nlc3NUb3BTaGlmdChyLHQsITEpLHdpbmRvdy50Mzk2X19pc01vYmlsZXx8dXx8dDM5Nl9fcmVtb3ZlSW5saW5lSGVpZ2h0KFtyLHIucXVlcnlTZWxlY3RvcigiLnQzOTZfX2NhcnJpZXIiKSxyLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19maWx0ZXIiKV0pLGx8fHQzOTZfX2ludGlhbGl6ZVVuZGVyY3V0KGUpfX13aW5kb3cudDM5Nl9faXNNb2JpbGU9L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHxuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkluc3RhZ3JhbSIpPi0xLHdpbmRvdy50Mzk2X19pc0lQYWQ9Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQmJi0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJBcHBsZVdlYktpdCIpLHdpbmRvdy50Mzk2X19pc1NhZmFyaT0vXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy50Mzk2X19pc1RvdWNoRGV2aWNlPSJvbnRvdWNoZW5kImluIGRvY3VtZW50LHdpbmRvdy50Mzk2X19pc0luQXBwQnJvd3Nlcj0vV2ViVmlld3woaVBob25lfGlQb2R8aVBhZCkoPyEuKlNhZmFyaSkvZ2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx3aW5kb3cudDM5Nl9faXNGYWNlYm9va01lc3NlbmdlckluQXBwPS9GQkFOfEZCQVYvZ2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmd2luZG93LnQzOTZfX2lzSW5BcHBCcm93c2VyLHdpbmRvdy50Mzk2X19pc0luc3RhZ3JhbUluQXBwPS9cYkluc3RhZ3JhbS9naS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZ3aW5kb3cudDM5Nl9faXNJbkFwcEJyb3dzZXIsdF9vblJlYWR5KHQzOTZfX2dsb2JhbEluaXQpO3ZhciB0Mzk2X3dhaXRGb3JGaW5hbEV2ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9e307cmV0dXJuIGZ1bmN0aW9uKGUsaSxyKXt2YXIgbz1yfHwiRG9uJ3QgY2FsbCB0aGlzIHR3aWNlIHdpdGhvdXQgYSB1bmlxdWVJZCI7dFtvXSYmY2xlYXJUaW1lb3V0KHRbb10pLHRbb109c2V0VGltZW91dChlLGkpfX0oKTtmdW5jdGlvbiB0Mzk2X19oYW5kbGVSZXNpemVPcGVuZWRQb3B1cCgpe3QzOTZfX3dhaXRGb3JQb3B1cCgpLnRoZW4oKGZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik7ZSYmdDM5Nl9kb1Jlc2l6ZShlLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpKX19KSl9ZnVuY3Rpb24gdDM5Nl9faW5pdFBvcHVwUmVzaXplKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCJwb3B1cFNob3dlZCIsdDM5Nl9faGFuZGxlUmVzaXplT3BlbmVkUG9wdXApLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigicG9wdXBTaG93ZWQiLHQzOTZfX2hhbmRsZVJlc2l6ZU9wZW5lZFBvcHVwKX1mdW5jdGlvbiB0Mzk2X2FiX19nZXRXaW5kb3dIZWlnaHQodCl7cmV0dXJuIHQzOTZfX3Nob3VsZFVzZVZpc3VhbFZpZXdwb3J0SGVpZ2h0KCkmJnQzOTZfX2lzSW5Qb3B1cCh0KT93aW5kb3cudmlzdWFsVmlld3BvcnQuaGVpZ2h0OnQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS5oZWlnaHQ7dmFyIGUsaX1mdW5jdGlvbiB0Mzk2X2FiX19nZXRXaW5kb3dXaWR0aCh0KXtyZXR1cm4gdDM5Nl9faXNJblBvcHVwKHQpP2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDp0Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKCkud2lkdGg7dmFyIGUsaX1mdW5jdGlvbiB0Mzk2X19nZXRUTldpbmRvd0hlaWdodCgpe3JldHVybiB3aW5kb3cudDM5Nl9faXNNb2JpbGV8fHdpbmRvdy50Mzk2X19pc0lQYWQ/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHR9ZnVuY3Rpb24gdDM5Nl9fZ2V0VE5XaW5kb3dXaWR0aCgpe3ZhciB0PXQzOTZfX2dldEJsb2NrRWRpdG9yV2lkdGgoKTtpZih0KXJldHVybiB0O3ZhciBlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxpPXQzOTZfX2dldEF4aXNYUGFkZGluZygpO3JldHVybiBpJiYoZS09aSksZX1mdW5jdGlvbiB0Mzk2X19nZXRDU1NXaW5kb3dXaWR0aCgpe3ZhciB0PXQzOTZfX2dldEJsb2NrRWRpdG9yV2lkdGgoKSxlO3JldHVybiB0fHwod2luZG93LnQzOTZfX2lzTW9iaWxlfHx3aW5kb3cudDM5Nl9faXNJUGFkfHx3aW5kb3cudDM5Nl9faXNTYWZhcmk/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOndpbmRvdy5pbm5lcldpZHRoKX1mdW5jdGlvbiB0Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKHQpe3ZhciBlLGk9KHR8fHt9KS5mb3JjZVVwZGF0ZSxyPXZvaWQgMCE9PWkmJmksbz0hd2luZG93LnRuLndpbmRvd193aWR0aHx8IXdpbmRvdy50bi53aW5kb3dfaGVpZ2h0fHwhd2luZG93LnRuLndpbmRvd193aWR0aF9jc3MsbjtyZXR1cm4ocnx8bykmJnQzOTZfX3VwZGF0ZVdpbmRvd0RpbWVuc2lvbnMoKSx7d2lkdGg6d2luZG93LnRuLndpbmRvd193aWR0aCxoZWlnaHQ6d2luZG93LnRuLndpbmRvd19oZWlnaHQsY3NzV2lkdGg6d2luZG93LnRuLndpbmRvd193aWR0aF9jc3N9fWZ1bmN0aW9uIHQzOTZfX3VwZGF0ZVdpbmRvd0RpbWVuc2lvbnMoKXt3aW5kb3cudG4ud2luZG93X3dpZHRoPXQzOTZfX2dldFROV2luZG93V2lkdGgoKSx3aW5kb3cudG4ud2luZG93X2hlaWdodD10Mzk2X19nZXRUTldpbmRvd0hlaWdodCgpLHdpbmRvdy50bi53aW5kb3dfd2lkdGhfY3NzPXQzOTZfX2dldENTU1dpbmRvd1dpZHRoKCl9ZnVuY3Rpb24gdDM5Nl9fcmV2YWxpZGF0ZURpbWVuc2lvbnMoKXt2YXIgdCxlPXQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aCxpLHI7cmV0dXJuIHQzOTZfX3VwZGF0ZVdpbmRvd0RpbWVuc2lvbnMoKSxlIT09dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLndpZHRofWZ1bmN0aW9uIHQzOTZfX3JlbW92ZUlubGluZUhlaWdodCh0KXsiMS4wIiE9PXdpbmRvdy5UTl9TQ0FMRV9JTklUSUFMX1ZFUiYmdC5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaCgoZnVuY3Rpb24odCl7dCYmKHQuc3R5bGUuaGVpZ2h0PSIiKX0pKX1mdW5jdGlvbiB0Mzk2X19jbGVhckluaXRpYWxTY2FsZVN0eWxlcygpe2lmKCIxLjAiPT09d2luZG93LlROX1NDQUxFX0lOSVRJQUxfVkVSKXt2YXIgdD1mdW5jdGlvbiB0KGUpe3ZhciBpO2UmJigidmFyKC0taW5pdGlhbC1zY2FsZS1oZWlnaHQpIj09PWUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgiaGVpZ2h0IikmJmUuc3R5bGUucmVtb3ZlUHJvcGVydHkoImhlaWdodCIpKX0sZTt0Mzk2X19nZXRaZXJvQmxvY2tzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIGk9ZS5hcnRib2FyZDtpJiYoaS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiLS1pbml0aWFsLXNjYWxlLWhlaWdodCIpLHQoaSksdChpLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19jYXJyaWVyIikpLHQoaS5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fZmlsdGVyIikpKX0pKX19ZnVuY3Rpb24gdDM5Nl9fZ2xvYmFsSW5pdCgpe3dpbmRvdy50bnx8dDM5Nl9pbml0VE5vYmpfX2NyZWF0ZURlZmF1bHQoKSx0Mzk2X19pc0FsbFplcm9CbG9ja3NSZW5kZXJlZCgoZnVuY3Rpb24oKXt0Mzk2X19hcHBseUZpeGVzRm9yQWxsRWxlbWVudHMoKSx0Mzk2X19pbml0aWFsaXplQW5jaG9yTGlua092ZXJmbG93Rml4KCksdDM5Nl9faW5pdFBvcHVwUmVzaXplKCksdDM5Nl9fY2xlYXJJbml0aWFsU2NhbGVTdHlsZXMoKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0Mzk2X19vblJlc2l6ZSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIix0Mzk2X19vbk9yaWVudGF0aW9uQ2hhbmdlKX0pKX1mdW5jdGlvbiB0Mzk2X19vblJlc2l6ZSgpe3QzOTZfd2FpdEZvckZpbmFsRXZlbnQoKGZ1bmN0aW9uKCl7dmFyIHQ7dDM5Nl9fcmV2YWxpZGF0ZURpbWVuc2lvbnMoKSYmKHQzOTZfX2dldFplcm9CbG9ja3MoKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LnJlY29yZDtpZihlJiZ0Mzk2X2lzQmxvY2tWaXNpYmxlKGUpKXRyeXt0Mzk2X2RvUmVzaXplKGUuaWQucmVwbGFjZSgicmVjIiwiIikpfWNhdGNoKGkpe2NvbnNvbGUuZXJyb3IoIkVycm9yIHRyeWluZyB0byByZXNpemUgIitlLmlkLGkpfX0pKSxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiemVybzp3aW5kb3ctd2lkdGgtY2hhbmdlZCIpKSl9KSw1MDAsImdsb2JhbF9yZXNpemVfemVyb191bmlxdWVfaWQiKX1mdW5jdGlvbiB0Mzk2X19vbk9yaWVudGF0aW9uQ2hhbmdlKCl7dDM5Nl93YWl0Rm9yRmluYWxFdmVudCgoZnVuY3Rpb24oKXt0Mzk2X191cGRhdGVXaW5kb3dEaW1lbnNpb25zKCksdDM5Nl9fZ2V0WmVyb0Jsb2NrcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucmVjb3JkO2UmJnQzOTZfaXNCbG9ja1Zpc2libGUoZSkmJnQzOTZfZG9SZXNpemUoZS5pZC5yZXBsYWNlKCJyZWMiLCIiKSl9KSl9KSw2MDAsImdsb2JhbF9vcmllbnRhdGlvbmNoYW5nZV96ZXJvX3VuaXF1ZV9pZCIpfWZ1bmN0aW9uIHQzOTZfaXNPbmx5U2NhbGFibGVCcm93c2VyKCl7cmV0dXJuIHdpbmRvdy5pc09ubHlTY2FsYWJsZX1mdW5jdGlvbiB0Mzk2X19pbml0T25seVNjYWxhYmxlKCl7aWYodm9pZCAwPT09d2luZG93LmlzT25seVNjYWxhYmxlKXt2YXIgdD13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRmlyZWZveFwvKFswLTldKylcLi8pLGU9dD9wYXJzZUludCh0WzFdLDEwKToxMjYsaT13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXC8oWzAtOV0rKVwuLykscj1pJiZwYXJzZUludChpWzFdLDEwKXx8MDt3aW5kb3cuaXNPbmx5U2NhbGFibGU9ZTwxMjYsd2luZG93LnNob3VsZFVzZVNjYWxlRmFjdG9yPSF3aW5kb3cuaXNPbmx5U2NhbGFibGUmJiF0JiZyPD0xMjd9fWZ1bmN0aW9uIHQzOTZfX3NldEdsb2JhbFNjYWxlVmFyaWFibGVzKHQsZSxpKXt2YXIgcj0xLG89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksbj1vP28ucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbDtpZighbilyZXR1cm4gMTt2YXIgYT10Mzk2X2FiX19nZXRXaW5kb3dXaWR0aChuKSxsPWk/cGFyc2VGbG9hdCgoYS9lKS50b0ZpeGVkKDMpKToxLGQ9ImFiIit0O3dpbmRvdy50bltkXS5zY2FsZUZhY3Rvcj1sLHdpbmRvdy50bl9zY2FsZV9mYWN0b3I9bDt2YXIgXz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KTtyZXR1cm4gXyYmIXdpbmRvdy50bi5pc0VkaXRNb2RlJiZfLnN0eWxlLnNldFByb3BlcnR5KCItLXpvb20iLGwudG9TdHJpbmcoKSksbH1mdW5jdGlvbiB0Mzk2X19wcm9jZXNzVG9wU2hpZnQodCxlLGkpeyJmdW5jdGlvbiIhPXR5cGVvZiB3aW5kb3cudDM5Nl9fdXBkYXRlVG9wU2hpZnR8fCJ5IiE9PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwic2hpZnQtcHJvY2Vzc2VkIikmJiJ5IiE9PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiZml4ZWQtc2hpZnQiKXx8d2luZG93LnQzOTZfX3VwZGF0ZVRvcFNoaWZ0KGUsaSl9ZnVuY3Rpb24gdDM5Nl9kb1Jlc2l6ZSh0LGUpe2UmJnQzOTZfX3VwZGF0ZVdpbmRvd0RpbWVuc2lvbnMoKTt2YXIgaT10Mzk2X2lzT25seVNjYWxhYmxlQnJvd3NlcigpLHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLG49dDM5Nl9kZXRlY3RSZXNvbHV0aW9uKHQpLGE7aWYodDM5Nl9yZW1vdmVFbGVtZW50RnJvbURPTShyP3IucXVlcnlTZWxlY3RvcigiLnQzOTZfX3NjYWxlLXN0eWxlIik6bnVsbCksaSl7dmFyIGw9cj9yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKTpbXTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGwsKGZ1bmN0aW9uKHQpe2lmKCF0LmNsYXNzTGlzdC5jb250YWlucygidG4tYXRvbSIpfHwhdC5jbG9zZXN0KCIudG4tbW9sZWN1bGUiKSl7dmFyIGU9dC5jbG9zZXN0KCIudG4tYXRvbV9fc2NhbGUtd3JhcHBlciIpLGk9ZT9lLnBhcmVudE5vZGU6bnVsbDtpJiZpLnJlbW92ZUNoaWxkKGUpLGkmJmkuYXBwZW5kQ2hpbGQodCl9fSkpfWVsc2V7dmFyIGQ9cj9yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50Mzk2X19lbGVtLCAudDM5Nl9fZ3JvdXAiKTpbXTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQsKGZ1bmN0aW9uKHQpe3Quc3R5bGUuem9vbT0iIjt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIik7ZSYmKGUuc3R5bGUudHJhbnNmb3JtT3JpZ2luPSIiLGUuc3R5bGUuZm9udFNpemU9IiIsZS5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdD0iIil9KSl9dDM5Nl9zd2l0Y2hSZXNvbHV0aW9uKHQsbik7dmFyIF89cj9yLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19hcnRib2FyZCIpOm51bGwscz0id2luZG93Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoXywidXBzY2FsZSIpLHU9dDM5Nl9fc2V0R2xvYmFsU2NhbGVWYXJpYWJsZXModCxuLHMpO3QzOTZfX3NldFNjYWxlRmFjdG9yRm9yRWxlbWVudHModCx1KSx0Mzk2X3VwZGF0ZVROb2JqKHQpLHQzOTZfYWJfX3JlbmRlclZpZXcoXyk7dmFyIGM9bz9vLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik6IiI7cyYmImVkaXQiIT09YyYmdF9vbkZ1bmNMb2FkKCJ0Mzk2X3NjYWxlQmxvY2siLChmdW5jdGlvbigpe3QzOTZfc2NhbGVCbG9jayh0KX0pKSwiZWRpdCIhPT1jJiYieSI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKF8sImZpeGVkLW5lZWQtanMiKSYmdF9vbkZ1bmNMb2FkKCJ0Mzk2X19wcm9jZXNzRml4ZWRBcnRCb2FyZCIsKGZ1bmN0aW9uKCl7dDM5Nl9fcHJvY2Vzc0ZpeGVkQXJ0Qm9hcmQoXyl9KSksdDM5Nl9fcHJvY2Vzc0Fic29sdXRlQXJ0Qm9hcmQoXyksdDM5Nl9fcHJvY2Vzc1RvcFNoaWZ0KF8sdCwhMCksdDM5Nl9hbGxlbGVtc19fcmVuZGVyVmlldyhfKSx0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyhfKSx0Mzk2X19hcHBseUZpeGVzRm9yQWxsRWxlbWVudHMoKSx0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KF8pLF8mJl8uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImFydEJvYXJkUmVzaXplZCIpKTt2YXIgZj0iaHVnIj09PV8uZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLWhlaWdodG1vZGUiKTtfJiYhZiYmKHdpbmRvdy50Mzk2X19pc01vYmlsZXx8dDM5Nl9fcmVtb3ZlSW5saW5lSGVpZ2h0KFtfLF8ucXVlcnlTZWxlY3RvcigiLnQzOTZfX2NhcnJpZXIiKSxfLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19maWx0ZXIiKV0pKX1mdW5jdGlvbiB0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KHQpe3ZhciBlLGk7aWYoImh1ZyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHRtb2RlIikpe3ZhciByPXQzOTZfX2dldEF1dG9IZWlnaHQodCksbz10Lm9mZnNldEhlaWdodDtpZighKE1hdGguYWJzKHItbyk8PS43KSl7dmFyIG4sYT0iYWIiK3QuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksbD13aW5kb3cudG5bYV0uY3VyUmVzb2x1dGlvbixkO2w9PT13aW5kb3cudG5bYV0uY3VyUmVzb2x1dGlvbl9tYXg/dC5zZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0IixyKTp0LnNldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHQtcmVzLSIrbCxyKSx0Mzk2X2FiX19yZW5kZXJWaWV3KHQpLG51bGw9PShlPXQuY2xvc2VzdCgiLnQzOTYiKSl8fGUuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInplcm86aGVpZ2h0LWNoYW5nZWQiKSl9fX1mdW5jdGlvbiB0Mzk2X19nZXRBdXRvSGVpZ2h0KHQpe3ZhciBlLGk9dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZsZXgiKSxyPUFycmF5LmZyb20odC5xdWVyeVNlbGVjdG9yQWxsKCI6c2NvcGUgPiAudG4tZ3JvdXAsIDpzY29wZSA+IC50bi1lbGVtIikpLG89dC5zdHlsZS5oZWlnaHQsbjtpZih0Mzk2X19hdXRvSGVpZ2h0X19jYW5BdXRvY2FsY3VsYXRlSGVpZ2h0KHQscikmJm8pe3ZhciBhPXQuc3R5bGUuaGVpZ2h0O3Quc3R5bGUuaGVpZ2h0PSJhdXRvIixlPXQub2Zmc2V0SGVpZ2h0LHQuc3R5bGUuaGVpZ2h0PWF9ZWxzZSBlPXIucmVkdWNlKChmdW5jdGlvbihlLHIpe3ZhciBvPXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZShyLCJheGlzeSIpLG49dDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHIsInRvcHVuaXRzIiksYT10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUociwiaGVpZ2h0dW5pdHMiKTtpZigiJSI9PT1ufHwiJSI9PT1hfHwiYm90dG9tIj09PW98fCJjZW50ZXIiPT09bylyZXR1cm4gZTt2YXIgbD0wO2lmKCJnYWxsZXJ5Ij09PXIuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpJiYobD10Mzk2X19hdXRvSGVpZ2h0X19nZXRBZGRpdGlvbmFsT2Zmc2V0Rm9yR2FsbGVyeShyKSksaSl7dmFyIGQ9dDM5Nl9fYWJfX2dldFBhZGRpbmdWYWx1ZSh0LCJwYWRkaW5nYm90dG9tIik7bCs9cGFyc2VJbnQoZCwxMCl9dmFyIF89ci5vZmZzZXRUb3Arci5vZmZzZXRIZWlnaHQrbCxzLHUsYzsid2luZG93IiE9PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwidXBzY2FsZSIpfHx3aW5kb3cudG4uaXNFZGl0TW9kZXx8KF8qPXQzOTZfX2dldEN1cnJlbnRTY2FsZUZhY3Rvcih0LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpKSk7cmV0dXJuIF8+ZT9fOmV9KSwtMS8wKTtyZXR1cm4gZT09PS0xLzA/MDplfWZ1bmN0aW9uIHQzOTZfX2F1dG9IZWlnaHRfX2dldEFkZGl0aW9uYWxPZmZzZXRGb3JHYWxsZXJ5KHQpe3ZhciBlPTAsaT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX3RpdGxlIikscj0ibm9uZSIhPT10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUodCwic2xkc19kb3RzY29udHJvbHMiKSxvPSJ1bmRlciI9PT10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUodCwic2xkc19hcnJvd2NvbnRyb2xzIik7aWYoaXx8cnx8byl7dmFyIG49dC5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX190aXRsZSIpLGE9bj9uLm9mZnNldEhlaWdodDowLGw9dC5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jYXB0aW9uLnQtc2xkc19fY2FwdGlvbi1hY3RpdmUiKSxkPWdldENvbXB1dGVkU3R5bGUobCksXztlKz1wYXJzZUludChkLm1hcmdpblRvcCwxMCkrYX1yZXR1cm4gaXx8IXImJiFvfHwoZS09MjApLGV9ZnVuY3Rpb24gdDM5Nl9fYXV0b0hlaWdodF9fY2FuQXV0b2NhbGN1bGF0ZUhlaWdodCh0LGUpe3ZhciBpLHI7aWYoIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19hcnRib2FyZC1mbGV4IikpcmV0dXJuITE7aWYoZS5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4iZ2FsbGVyeSI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKX0pKSl7dmFyIG89dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJmbGV4ZGlyZWN0aW9uIiksbj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsImZsZXhhbGlnbml0ZW1zIiksYT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsImZsZXhqdXN0aWZ5Y29udGVudCIpLGw7cmV0dXJuInJvdyI9PT1vJiYiZmxleC1lbmQiPT09bnx8ImNvbHVtbiI9PT1vJiYiZmxleC1lbmQiPT09YX1yZXR1cm4hMH1mdW5jdGlvbiB0Mzk2X19hYl9fZ2V0UGFkZGluZ1ZhbHVlKHQsZSl7dmFyIGk9KHQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwicGFkZGluZyIpfHwiMHB4IDBweCAwcHggMHB4Iikuc3BsaXQoIiAiKSxyPXtwYWRkaW5ndG9wOmlbMF0scGFkZGluZ3JpZ2h0OmlbMV0scGFkZGluZ2JvdHRvbTppWzJdLHBhZGRpbmdsZWZ0OmlbM119O3JldHVybiBwYXJzZUludChyW2VdLDEwKXx8MH1mdW5jdGlvbiB0Mzk2X19wcm9jZXNzQWJzb2x1dGVBcnRCb2FyZCh0KXtpZih0KXt2YXIgZT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsInBvcyIpO2lmKCJmaXhlZCIhPT1lKXt2YXIgaT0idDM5Nl9fYXJ0Ym9hcmQtZml4ZWQtbm8tYmciO2lmKCJhYnNvbHV0ZSI9PT1lKXt2YXIgcj1nZXRDb21wdXRlZFN0eWxlKHQpLG89dC5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fZmlsdGVyIiksbj0hb3x8Im5vbmUiPT09Z2V0Q29tcHV0ZWRTdHlsZShvKS5iYWNrZ3JvdW5kSW1hZ2UsYSxsPSJyZ2JhKDAsIDAsIDAsIDApIj09PXIuYmFja2dyb3VuZENvbG9yJiYibm9uZSI9PT1yLmJhY2tncm91bmRJbWFnZSYmbj8iYWRkIjoicmVtb3ZlIjt0LmNsYXNzTGlzdFtsXShpKX1lbHNlIHQuY2xhc3NMaXN0LnJlbW92ZShpKX19fWZ1bmN0aW9uIHQzOTZfZGV0ZWN0UmVzb2x1dGlvbih0KXtpZighdClyZXR1cm4gbnVsbDt2YXIgZSxpPXQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS5jc3NXaWR0aCxyPSJhYiIrdCxvO3JldHVybiB3aW5kb3cudG5bcl0uc2NyZWVucy5mb3JFYWNoKChmdW5jdGlvbih0KXtpPj10JiYobz10KX0pKSx2b2lkIDA9PT1vJiYobz13aW5kb3cudG5bcl0uc2NyZWVuc1swXSksb31mdW5jdGlvbiB0Mzk2X2luaXRUTm9ial9fY3JlYXRlRGVmYXVsdCgpe3dpbmRvdy50bj17fSx3aW5kb3cudG4uYWJfZmllbGRzPVsiaGVpZ2h0Iiwid2lkdGgiLCJiZ2NvbG9yIiwiYmdpbWciLCJiZ2F0dGFjaG1lbnQiLCJiZ3Bvc2l0aW9uIiwiZmlsdGVyb3BhY2l0eSIsImZpbHRlcmNvbG9yIiwiZmlsdGVyb3BhY2l0eTIiLCJmaWx0ZXJjb2xvcjIiLCJoZWlnaHRfdmgiLCJ2YWxpZ24iXX1mdW5jdGlvbiB0Mzk2X2luaXRUTm9iaih0LGUpe2UmJih3aW5kb3cudG58fHQzOTZfaW5pdFROb2JqX19jcmVhdGVEZWZhdWx0KCksdDM5Nl9zZXRTY3JlZW5zVE5vYmoodCxlKSl9ZnVuY3Rpb24gdDM5Nl9zZXRTY3JlZW5zVE5vYmoodCxlKXt2YXIgaT0iYWIiK3Q7d2luZG93LnRuW2ldPXt9LHdpbmRvdy50bltpXS5zY3JlZW5zPVtdO3ZhciByPWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXNjcmVlbnMiKTtyPyhyPXIuc3BsaXQoIiwiKSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7d2luZG93LnRuW2ldLnNjcmVlbnMucHVzaChwYXJzZUludCh0LDEwKSl9KSk6d2luZG93LnRuW2ldLnNjcmVlbnM9WzMyMCw0ODAsNjQwLDk2MCwxMjAwXX1mdW5jdGlvbiB0Mzk2X19nZXRBeGlzWFBhZGRpbmcoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGU9Qm9vbGVhbih3aW5kb3cudGlsZGFNZW1iZXJzKXx8ImFsbHJlY29yZHMiPT09d2luZG93Lnplcm9fd2luZG93X3dpZHRoX2hvb2ssaSxyO3JldHVybiB0JiZlJiZbZG9jdW1lbnQuYm9keSx0XS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7dmFyIGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSkucGFkZGluZ0xlZnQscj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5wYWRkaW5nUmlnaHQ7cmV0dXJuIHQrcGFyc2VJbnQoaSwxMCkrcGFyc2VJbnQociwxMCl9KSwwKXx8MH1mdW5jdGlvbiB0Mzk2X3VwZGF0ZVROb2JqKHQpe2Zvcih2YXIgZSxpPXQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aCxyPSJhYiIrdCxvPXdpbmRvdy50bltyXS5zY3JlZW5zLnNsaWNlKCkucmV2ZXJzZSgpLG49MDtuPG8ubGVuZ3RoO24rKyl3aW5kb3cudG5bcl0uY3VyUmVzb2x1dGlvbj09PW9bbl0mJih3aW5kb3cudG5bcl0uY2FudmFzX21pbl93aWR0aD1vW25dLHdpbmRvdy50bltyXS5jYW52YXNfbWF4X3dpZHRoPTA9PT1uP2k6b1tuLTFdKTt2YXIgYT0iYWxscmVjb3JkcyI9PT13aW5kb3cuemVyb193aW5kb3dfd2lkdGhfaG9vazt3aW5kb3cudG5bcl0uZ3JpZF93aWR0aD13aW5kb3cudG5bcl0uY2FudmFzX21pbl93aWR0aDt2YXIgbD0oaS13aW5kb3cudG5bcl0uZ3JpZF93aWR0aCkvMjt3aW5kb3cudG5bcl0uZ3JpZF9vZmZzZXRfbGVmdD1sPDAmJmE/MDpsfWZ1bmN0aW9uIHQzOTZfc3dpdGNoUmVzb2x1dGlvbih0LGUpe3ZhciBpPSJhYiIrdCxyPXdpbmRvdy50bltpXS5zY3JlZW5zW3dpbmRvdy50bltpXS5zY3JlZW5zLmxlbmd0aC0xXTt3aW5kb3cudG5baV0uY3VyUmVzb2x1dGlvbj1lLHdpbmRvdy50bltpXS5jdXJSZXNvbHV0aW9uX21heD1yLHdpbmRvdy50bi5jdXJSZXNvbHV0aW9uPWUsd2luZG93LnRuLmN1clJlc29sdXRpb25fbWF4PXJ9ZnVuY3Rpb24gdDM5Nl9hcnRib2FyZF9idWlsZCh0LGUpe3ZhciBpPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK2UpLHI9aT9pLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19hcnRib2FyZCIpOm51bGw7aWYocil7dDM5Nl9hYl9fcmVuZGVyVmlldyhyKSx0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyhyKTt2YXIgbz1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1lbGVtIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0KXt2YXIgaTtzd2l0Y2godC5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIikpe2Nhc2UidGV4dCI6dDM5Nl9hZGRUZXh0KHIsdCk7YnJlYWs7Y2FzZSJpbWFnZSI6dDM5Nl9hZGRJbWFnZShyLHQpO2JyZWFrO2Nhc2Uic2hhcGUiOnQzOTZfYWRkU2hhcGUocix0KTticmVhaztjYXNlImJ1dHRvbiI6dDM5Nl9hZGRCdXR0b24ocix0KTticmVhaztjYXNlInZpZGVvIjp0Mzk2X2FkZFZpZGVvKHIsdCk7YnJlYWs7Y2FzZSJodG1sIjp0Mzk2X2FkZEh0bWwocix0KTticmVhaztjYXNlInRvb2x0aXAiOnQzOTZfYWRkVG9vbHRpcChyLHQpO2JyZWFrO2Nhc2UiZm9ybSI6dDM5Nl9hZGRGb3JtKHIsdCxlKTticmVhaztjYXNlImdhbGxlcnkiOnQzOTZfYWRkR2FsbGVyeShyLHQsZSk7YnJlYWs7Y2FzZSJ2ZWN0b3IiOnQzOTZfYWRkVmVjdG9yKHIsdCl9fSkpLHIuY2xhc3NMaXN0LnJlbW92ZSgicmVuZGVyaW5nIiksci5jbGFzc0xpc3QuYWRkKCJyZW5kZXJlZCIpLHIuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoImFydEJvYXJkUmVuZGVyZWQiLHtidWJibGVzOiEwLGNhbmNlbGFibGU6ITB9KSk7dmFyIG49ci5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtb3ZyZmx3Iik7aWYoWyJ2aXNpYmxlIiwidmlzaWJsZVgiXS5pbmNsdWRlcyhuKSYmKHQzOTZfX3NldE92ZXJmbG93VG9BbGxSZWNvcmRzKCksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJ0U3RvcmVHYWxsZXJ5SW5pdGlhbGl6ZWQiLChmdW5jdGlvbigpe3QzOTZfX3NldE92ZXJmbG93VG9BbGxSZWNvcmRzKCl9KSkpLCJhdXRvIj09PW4pe3ZhciBhPU1hdGguYWJzKHIub2Zmc2V0SGVpZ2h0LXIuY2xpZW50SGVpZ2h0KTswIT09YSYmKHIuc3R5bGUucGFkZGluZ0JvdHRvbT1hKyJweCIpfWlmKHdpbmRvdy50Mzk2X19pc01vYmlsZXx8d2luZG93LnQzOTZfX2lzSVBhZCl7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtsLnRleHRDb250ZW50PSJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTM2NnB4KSBhbmQgKG9yaWVudGF0aW9uOmxhbmRzY2FwZSkgYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86Mikgey50Mzk2X19jYXJyaWVyIHtiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6c2Nyb2xsIWltcG9ydGFudDt9fSIsaS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsbCl9fX1mdW5jdGlvbiB0Mzk2X2FiX19yZW5kZXJWaWV3KHQpe2lmKHQpe2Zvcih2YXIgZT13aW5kb3cudG4uYWJfZmllbGRzLGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxyLG89MDtvPGUubGVuZ3RoO28rKyl0Mzk2X2FiX19yZW5kZXJWaWV3T25lRmllbGQodCxlW29dKTt2YXIgbj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsImhlaWdodCIpLGE9dDM5Nl9hYl9fZ2V0SGVpZ2h0KHQpLGwsZD10Mzk2X19nZXRDdXJyZW50U2NhbGVGYWN0b3IodC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSksXz0hIWkmJiJlZGl0Ij09PWkuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKSxzPSJ3aW5kb3ciPT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJ1cHNjYWxlIiksdSxjLGY7aWYocj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsImhlaWdodF92aCIpLHMmJiFfJiZyJiYodT1wYXJzZUludChuLDEwKSpkKSxuPT09YXx8dSYmdT49YSljPTA7ZWxzZSBzd2l0Y2godDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJ2YWxpZ24iKSl7Y2FzZSJ0b3AiOmRlZmF1bHQ6Yz0wO2JyZWFrO2Nhc2UiY2VudGVyIjpjPXU/cGFyc2VGbG9hdCgoKGEtdSkvMikudG9GaXhlZCgxKSk6cGFyc2VGbG9hdCgoKGEtbikvMikudG9GaXhlZCgxKSk7YnJlYWs7Y2FzZSJib3R0b20iOmM9dT9wYXJzZUZsb2F0KChhLXUpLnRvRml4ZWQoMSkpOnBhcnNlRmxvYXQoKGEtbikudG9GaXhlZCgxKSk7YnJlYWs7Y2FzZSJzdHJldGNoIjpjPTAsbj1hfXQuc2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1pbi1vZmZzZXQtdG9wIixjKSx0LnNldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1wcm94eS1taW4taGVpZ2h0IixuKSx0LnNldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1wcm94eS1tYXgtaGVpZ2h0IixhKTt2YXIgZz10LnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19maWx0ZXIiKSx3PXQucXVlcnlTZWxlY3RvcigiLnQzOTZfX2NhcnJpZXIiKSxwO2lmKHI9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJoZWlnaHRfdmgiKSxyPXBhcnNlRmxvYXQociksKHdpbmRvdy50Mzk2X19pc01vYmlsZXx8d2luZG93LnQzOTZfX2lzSVBhZCkmJnIpe3ZhciBoPXQzOTZfYWJfX2dldFdpbmRvd0hlaWdodCh0KSpyLzEwMDt0LnN0eWxlLmhlaWdodD1oKyJweCIsZyYmKGcuc3R5bGUuaGVpZ2h0PWgrInB4IiksdyYmKHcuc3R5bGUuaGVpZ2h0PWgrInB4Iil9Imh1ZyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHRtb2RlIikmJiFyJiYodC5zdHlsZS5oZWlnaHQ9bisicHgiLGcmJihnLnN0eWxlLmhlaWdodD1uKyJweCIpLHcmJih3LnN0eWxlLmhlaWdodD1uKyJweCIpKX19ZnVuY3Rpb24gdDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yKHQpe3ZhciBlPSJhYiIrdCxpO3JldHVybiB3aW5kb3cudG4mJndpbmRvdy50bltlXSYmd2luZG93LnRuW2VdLnNjYWxlRmFjdG9yfHx3aW5kb3cudG5fc2NhbGVfZmFjdG9yfWZ1bmN0aW9uIHQzOTZfX3NldFNjYWxlRmFjdG9yRm9yRWxlbWVudHModCxlKXt2YXIgaT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KSxyPWk/aS5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKTpudWxsO2lmKHIpe3ZhciBvPXIucXVlcnlTZWxlY3RvckFsbCgiLnQzOTZfX2VsZW0sIC50bi1ncm91cCIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCl7dC5zY2FsZUZhY3Rvcj1lfSkpfX1mdW5jdGlvbiB0Mzk2X2FkZFRleHQodCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKGkpe3ZhciByPSJ0b3AsbGVmdCx3aWR0aCxoZWlnaHQsY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIjtpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKX19ZnVuY3Rpb24gdDM5Nl9hZGRJbWFnZSh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoaSl7dmFyIHI9ImltZyx3aWR0aCxmaWxld2lkdGgsZmlsZWhlaWdodCx0b3AsbGVmdCxjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiO2kuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpO3ZhciBvPWkucXVlcnlTZWxlY3RvcigiaW1nIik7byYmKG8uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7ZG9jdW1lbnQuY29udGFpbnMobykmJih0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKSxvLnNyYyYmc2V0VGltZW91dCgoZnVuY3Rpb24oKXtkb2N1bWVudC5jb250YWlucyhvKSYmKHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpLHQzOTZfX3VwZGF0ZUF1dG9IZWlnaHQodCkpfSksMmUzKSl9KSksby5jb21wbGV0ZSYmKHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpLG8uc3JjJiZzZXRUaW1lb3V0KChmdW5jdGlvbigpe2RvY3VtZW50LmNvbnRhaW5zKG8pJiYodDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwidG9wIiksdDM5Nl9fdXBkYXRlQXV0b0hlaWdodCh0KSl9KSwyZTMpKSxvLmFkZEV2ZW50TGlzdGVuZXIoInR1d2lkZ2V0X2RvbmUiLChmdW5jdGlvbigpe3QzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dDM5Nl9jaGFuZ2VGaWx0ZXJPblNhZmFyaShpKX0pKSl9fWZ1bmN0aW9uIHQzOTZfYWRkU2hhcGUodCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKGkpe3ZhciByPSJ3aWR0aCxoZWlnaHQsdG9wLGxlZnQsIjtyKz0iY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsaGVpZ2h0dW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIixpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKX19ZnVuY3Rpb24gdDM5Nl9jaGFuZ2VGaWx0ZXJPblNhZmFyaSh0KXt2YXIgZTtpZigvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYodDM5Nl9fY2hlY2tDb250YWluQmFja2Ryb3BGaWx0ZXIodCkmJiJJbnRlcnNlY3Rpb25PYnNlcnZlciJpbiB3aW5kb3cpKXt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIikscjtuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKGUsaSl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtpZihlLmlzSW50ZXJzZWN0aW5nKXt2YXIgcj1lLnRhcmdldDtpLnVub2JzZXJ2ZShyKSx0Mzk2X19wcm9jZXNzQmFja2Ryb3BGaWx0ZXJPbkltYWdlKHQpfX0pKX0pKS5vYnNlcnZlKGkpfX1mdW5jdGlvbiB0Mzk2X19jaGVja0NvbnRhaW5CYWNrZHJvcEZpbHRlcih0KXtpZighdClyZXR1cm4hMTt2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS53ZWJraXRCYWNrZHJvcEZpbHRlcjtpZihlJiYibm9uZSIhPT1lKXJldHVybiEwO3ZhciBpPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIsIC50bi1hdG9tX19wcngtd3JhcHBlciwgLnRuLWF0b21fX3N0aWNreS13cmFwcGVyIik7aWYoIWkpcmV0dXJuITE7dmFyIHI9d2luZG93LmdldENvbXB1dGVkU3R5bGUoaSkud2Via2l0QmFja2Ryb3BGaWx0ZXI7cmV0dXJuIHImJiJub25lIiE9PXJ9ZnVuY3Rpb24gdDM5Nl9fcHJvY2Vzc0JhY2tkcm9wRmlsdGVyT25JbWFnZSh0KXtpZih0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1vcHRzIiksaT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXByeCIpfHx0LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWZpeCIpLHI9ZXx8aSxvPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtLS1iYWNrZHJvcC1maWx0ZXItaW1nLXdyYXBwZXJlZCIpO3ImJm98fCFyP3QzOTZfX3VwZGF0ZUJhY2tkcm9wRmlsdGVyT25JbWFnZSh0KTp0LmFkZEV2ZW50TGlzdGVuZXIoImJhY2tkcm9wRmlsdGVySW1nV3JhcHBlcmVkIiwoZnVuY3Rpb24oKXt0Mzk2X191cGRhdGVCYWNrZHJvcEZpbHRlck9uSW1hZ2UodCl9KSl9fWZ1bmN0aW9uIHQzOTZfX3VwZGF0ZUJhY2tkcm9wRmlsdGVyT25JbWFnZSh0KXtpZih0KXt2YXIgZT10LGk9ZS5xdWVyeVNlbGVjdG9yKCJpbWciKSxyPWUucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIsIC50bi1hdG9tX19wcngtd3JhcHBlciwgLnRuLWF0b21fX3N0aWNreS13cmFwcGVyIiksbz0iIjtyJiYoZT1yLG89d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSkud2Via2l0QmFja2Ryb3BGaWx0ZXJ8fCIiKSxlLnN0eWxlLndlYmtpdEJhY2tkcm9wRmlsdGVyPSJub25lIix0Mzk2X3dhaXRGb3JVcGxvYWRJbWcoaSwoZnVuY3Rpb24oKXtlLnN0eWxlLndlYmtpdEJhY2tkcm9wRmlsdGVyPW99KSl9fWZ1bmN0aW9uIHQzOTZfd2FpdEZvclVwbG9hZEltZyh0LGUpe2lmKCJ5Ij09PXdpbmRvdy5sYXp5KXZhciBpPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5jbGFzc0xpc3QuY29udGFpbnMoImxvYWRlZCIpJiZ0LmNsaWVudFdpZHRoJiZ0LnNyYz8oZSgpLGNsZWFyVGltZW91dChpKSk6dDM5Nl93YWl0Rm9yVXBsb2FkSW1nKHQsZSl9KSwzMDApO2Vsc2UgZSgpfWZ1bmN0aW9uIHQzOTZfYWRkQnV0dG9uKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZighaSlyZXR1cm4gbnVsbDt2YXIgcj0idG9wLGxlZnQsd2lkdGgsaGVpZ2h0LGNvbnRhaW5lcixheGlzeCxheGlzeSxjYXB0aW9uLGxlZnR1bml0cyx0b3B1bml0cyI7cmV0dXJuIGkuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpLGl9ZnVuY3Rpb24gdDM5Nl9hZGRWaWRlbyh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoaSl7dmFyIHI9IndpZHRoLGhlaWdodCx0b3AsbGVmdCwiO3IrPSJjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxoZWlnaHR1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiLGkuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpLHRfb25GdW5jTG9hZCgidDM5Nl9pbml0VmlkZW8iLChmdW5jdGlvbigpe3QzOTZfaW5pdFZpZGVvKGkpfSkpfX1mdW5jdGlvbiB0Mzk2X2FkZEh0bWwodCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKGkpe3ZhciByPSJ3aWR0aCxoZWlnaHQsdG9wLGxlZnQsIjtyKz0iY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsaGVpZ2h0dW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIixpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKX19ZnVuY3Rpb24gdDM5Nl9hZGRUb29sdGlwKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0id2lkdGgsaGVpZ2h0LHRvcCxsZWZ0LCI7cis9ImNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGhlaWdodHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyx0aXBwb3NpdGlvbiIsaS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSksdF9vbkZ1bmNMb2FkKCJ0Mzk2X2luaXRUb29sdGlwIiwoZnVuY3Rpb24oKXt0Mzk2X2luaXRUb29sdGlwKGkpfSkpfX1mdW5jdGlvbiB0Mzk2X2FkZEZvcm0odCxlLGkpe3ZhciByPXQzOTZfZ2V0RWwoZSk7aWYocil7dmFyIG89IndpZHRoLHRvcCxsZWZ0LCI7bys9ImlucHV0cyxjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiLHIuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsbyk7dmFyIG49dDM5Nl9lbGVtX19nZXRGb3JtSW5wdXRzVmFsdWUociksYT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1mZS1lbGVtLWlkIil8fHIuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKTt0X29uRnVuY0xvYWQoInRfemVyb0Zvcm1zX19pbml0IiwoZnVuY3Rpb24oKXt0Mzk2X2VsZW1fX3JlbmRlclZpZXcociksdF96ZXJvRm9ybXNfX2luaXQoaSxhLG4pLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhyKX0pKX19ZnVuY3Rpb24gdDM5Nl9hZGRHYWxsZXJ5KHQsZSxpKXt2YXIgcj10Mzk2X2dldEVsKGUpO2lmKHIpe3ZhciBvPSJ3aWR0aCxoZWlnaHQsdG9wLGxlZnQsIjtvKz0iaW1ncyxjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxoZWlnaHR1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiLHIuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsbyksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KHIpO3ZhciBuPXIuZ2V0QXR0cmlidXRlKCJkYXRhLWZlLWVsZW0taWQiKXx8ci5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpO3Rfb25GdW5jTG9hZCgidF96ZXJvR2FsbGVyeV9faW5pdCIsKGZ1bmN0aW9uKCl7dF96ZXJvR2FsbGVyeV9faW5pdChpLG4pfSkpfX1mdW5jdGlvbiB0Mzk2X2FkZFZlY3Rvcih0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoaSl7dmFyIHI9IndpZHRoLGZpbGV3aWR0aCxmaWxlaGVpZ2h0LHRvcCxsZWZ0LGNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyI7aS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSl9fWZ1bmN0aW9uIHQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwodCk7aWYoIWkpcmV0dXJuIG51bGw7aWYoaS5jbGFzc0xpc3QuY29udGFpbnMoInRuLWdyb3VwIikpcmV0dXJuIHQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUoaSxlKTt2YXIgcj1pLmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLG89ci5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxuPSJhYiIrbyxhO3ZvaWQgMD09PXdpbmRvdy50bltuXSYmKHQzOTZfaW5pdFROb2JqKG8sciksdDM5Nl9zd2l0Y2hSZXNvbHV0aW9uKG8sdDM5Nl9kZXRlY3RSZXNvbHV0aW9uKG8pKSk7dmFyIGw9d2luZG93LnRuW25dLmN1clJlc29sdXRpb24sZD13aW5kb3cudG5bbl0uY3VyUmVzb2x1dGlvbl9tYXgsXz13aW5kb3cudG5bbl0uc2NyZWVucyxzO2lmKCEocz1sPT09ZD9pLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC0iK2UrIi12YWx1ZSIpOmkuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLSIrZSsiLXJlcy0iK2wrIi12YWx1ZSIpKSYmIiIhPT1zKWZvcih2YXIgdT0wO3U8Xy5sZW5ndGg7dSsrKXt2YXIgYz1fW3VdO2lmKCEoYzw9bCkmJihzPWM9PT1kP2kuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLSIrZSsiLXZhbHVlIik6aS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtIitlKyItcmVzLSIrYysiLXZhbHVlIikpKWJyZWFrfXZhciBmPXQzOTZfX3BhcnNlR2xvYmFsU3R5bGVDU1NWYXIocyk7cmV0dXJuIGYmJihzPWYuZmFsbGJhY2spLHN9ZnVuY3Rpb24gdDM5Nl9lbGVtX19yZW5kZXJWaWV3KHQpe3ZhciBlPXQzOTZfZ2V0RWwodCksaT1lP2UuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIpOiIiO2kmJihpPWkuc3BsaXQoIiwiKSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoZSx0KX0pKX1mdW5jdGlvbiB0Mzk2X2dyb3VwX19yZW5kZXJWaWV3KHQpe3ZhciBlPXQ/dC5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIik6IiI7ZSYmKGU9ZS5zcGxpdCgiLCIpKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgaT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKHQsZSk7c3dpdGNoKGUpe2Nhc2UibGVmdCI6aT10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUodCxlLGkpLHQuc3R5bGUubGVmdD1wYXJzZUZsb2F0KGkpLnRvRml4ZWQoMSkrInB4IjticmVhaztjYXNlInRvcCI6aT10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUodCxlLGkpLHQuc3R5bGUudG9wPXBhcnNlRmxvYXQoaSkudG9GaXhlZCgxKSsicHgiO2JyZWFrO2Nhc2UiY29udGFpbmVyIjp0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZCh0LCJsZWZ0IiksdDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQodCwidG9wIil9fSkpfWZ1bmN0aW9uIHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbCh0KTtpZihpKXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLG89cj9yLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik6IiIsbixhPSJ3aW5kb3ciPT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShpLmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLCJ1cHNjYWxlIik7aWYoInllcyIhPT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zY2FsZS1vZmYiKXx8IWF8fCJlZGl0Ij09PW8pe3ZhciBsPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLGUpLGQsXz1bImZpbGwiLCJodWciXSxzPXQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20oaSk7c3dpdGNoKGUpe2Nhc2UibGVmdCI6bD10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoaSxlLGwpLGw9cz90Mzk2X196b29taWZ5VmFsdWUoaSxsKTpwYXJzZUZsb2F0KGwpLnRvRml4ZWQoMSkrInB4IixpLnN0eWxlLmxlZnQ9bDticmVhaztjYXNlInRvcCI6bD10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoaSxlLGwpLGw9cz90Mzk2X196b29taWZ5VmFsdWUoaSxsKTpwYXJzZUZsb2F0KGwpLnRvRml4ZWQoMSkrInB4IixpLnN0eWxlLnRvcD1sO2JyZWFrO2Nhc2Uid2lkdGgiOmQ9aS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7dmFyIHU9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksIndpZHRobW9kZSIpLGM7aWYoKGM9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksInRleHRmaXQiKSl8fCgiYnV0dG9uIj09PWQ/Yz0iZml4ZWRzaXplIjoidGV4dCI9PT1kJiYoYz0iYXV0b2hlaWdodCIpKSwoInRleHQiPT09ZHx8ImJ1dHRvbiI9PT1kKSYmImF1dG93aWR0aCI9PT1jKXJldHVybiB2b2lkKGkuc3R5bGUud2lkdGg9ImF1dG8iKTtpZihfLmluY2x1ZGVzKHUpKXJldHVybiB2b2lkKGkuc3R5bGUud2lkdGg9IiIpO3N3aXRjaChsPXQzOTZfZWxlbV9fZ2V0V2lkdGgoaSxsKSxpLnN0eWxlLndpZHRoPXBhcnNlRmxvYXQobCkudG9GaXhlZCgxKSsicHgiLGQpe2Nhc2UidG9vbHRpcCI6dmFyIGY9aS5xdWVyeVNlbGVjdG9yQWxsKCIudG4tYXRvbV9fcGluLWljb24iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGYsKGZ1bmN0aW9uKHQpe3ZhciBlPXBhcnNlRmxvYXQobCkudG9GaXhlZCgxKSsicHgiO3Quc3R5bGUud2lkdGg9ZSx0LnN0eWxlLmhlaWdodD1lfSkpLGkuc3R5bGUuaGVpZ2h0PXBhcnNlSW50KGwpLnRvRml4ZWQoMSkrInB4IjticmVhaztjYXNlImdhbGxlcnkiOnQzOTZfZWxlbV9fc2V0R2FsbGVyeVNpemUoaSwid2lkdGgiLGwpfWJyZWFrO2Nhc2UiaGVpZ2h0IjpkPWkuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO3ZhciBnPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJoZWlnaHRtb2RlIiksYztpZigoYz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwidGV4dGZpdCIpKXx8KCJidXR0b24iPT09ZD9jPSJmaXhlZHNpemUiOiJ0ZXh0Ij09PWQmJihjPSJhdXRvaGVpZ2h0IikpLCgidGV4dCI9PT1kfHwiYnV0dG9uIj09PWQpJiZbImF1dG93aWR0aCIsImF1dG9oZWlnaHQiLCJzaW5nbGVsaW5lIl0uaW5jbHVkZXMoYykpcmV0dXJuIHZvaWQoaS5zdHlsZS5oZWlnaHQ9ImF1dG8iKTtpZihfLmluY2x1ZGVzKGcpJiYidG9vbHRpcCIhPT1kKXJldHVybiB2b2lkKGkuc3R5bGUuaGVpZ2h0PSIiKTtpZigidG9vbHRpcCI9PT1kKXJldHVybjtsPXQzOTZfZWxlbV9fZ2V0SGVpZ2h0KGksbCksaS5zdHlsZS5oZWlnaHQ9cGFyc2VGbG9hdChsKS50b0ZpeGVkKDEpKyJweCIsImdhbGxlcnkiPT09ZCYmdDM5Nl9lbGVtX19zZXRHYWxsZXJ5U2l6ZShpLCJoZWlnaHQiLGwpO2JyZWFrO2Nhc2UiY29udGFpbmVyIjp0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJsZWZ0IiksdDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwidG9wIik7YnJlYWs7Y2FzZSJpbnB1dHMiOnRyeXtsPXQzOTZfZWxlbV9fZ2V0Rm9ybUlucHV0c1ZhbHVlKGkpLHdpbmRvdy50X3plcm9Gb3Jtc19fcmVuZGVyRm9ybShpLGwpfWNhdGNoKHcpe319IndpZHRoIiE9PWUmJiJoZWlnaHQiIT09ZSYmImZvbnRzaXplIiE9PWUmJiJmb250ZmFtaWx5IiE9PWUmJiJsZXR0ZXJzcGFjaW5nIiE9PWUmJiJmb250d2VpZ2h0IiE9PWUmJiJpbWciIT09ZXx8KHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksImxlZnQiKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKSl9fX1mdW5jdGlvbiB0Mzk2X2VsZW1fX3NldEdhbGxlcnlTaXplKHQsZSxpKXt2YXIgcj1pLG89dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsImJvcmRlcndpZHRoIiksbj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodCwiYm9yZGVyc3R5bGUiKTtuJiZvJiYibm9uZSIhPT1ufHwobz0wKSxyLT0yKm87dmFyIGE9TWF0aC5yb3VuZChwYXJzZUZsb2F0KHIpKSsicHgiO2E9IndpZHRoIj09PWV8fCJoZWlnaHQiPT09ZT90Mzk2X196b29taWZ5VmFsdWUodCxhLHtyb3VuZDohMH0pOnQzOTZfX3pvb21pZnlWYWx1ZSh0LGEpO3ZhciBsPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fbWFpbiIpLGQ9dC5xdWVyeVNlbGVjdG9yQWxsKCIudG4tYXRvbV9fc2xkcy1pbWciKTt0LnN0eWxlW2VdPWEsbCYmKGwuc3R5bGVbZV09YSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkLChmdW5jdGlvbih0KXt0LnN0eWxlW2VdPWF9KSl9ZnVuY3Rpb24gdDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKHQsZSxpKXt2YXIgcj10Mzk2X2dldEVsKHQpO2lmKCFyKXJldHVybiBudWxsO3ZhciBvPXIuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIiksbj1vLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLGE9ImFiIituLGw9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShvLCJ2YWxpZ24iKSxkPSJ3aW5kb3ciPT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShvLCJ1cHNjYWxlIiksXz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLHMsdT0iZWRpdCI9PT0oXz9fLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik6IiIpLGM9dDM5Nl9pc09ubHlTY2FsYWJsZUJyb3dzZXIoKSxmPSF1JiZkJiZjLGc9IXUmJmQmJiFjLHc9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHIsImF4aXN5IikscD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUociwiYXhpc3giKSxoPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShyLCJjb250YWluZXIiKSxtPXIuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1ncm91cCIpJiYicGh5c2ljYWwiPT09dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZShyLCJ0eXBlIiksYj1yLnBhcmVudE5vZGUuY2xvc2VzdCgiLnRuLWdyb3VwIiksdj0icGh5c2ljYWwiPT09dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZShiLCJ0eXBlIik7bSYmKGg9aHx8ImdyaWQiKTt2YXIgeT1wYXJzZUludChpKSxGLEEsUyx4LFYsRSxJLGs9dDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yKG4pO3N3aXRjaChlKXtjYXNlImxlZnQiOnZhciB6LEw9dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLndpZHRoLEI7aWYoRj0iZ3JpZCI9PT1oPyJncmlkIjoid2luZG93IixBPSJncmlkIj09PWg/d2luZG93LnRuW2FdLmdyaWRfb2Zmc2V0X2xlZnQ6MCxWPSJncmlkIj09PWg/d2luZG93LnRuW2FdLmdyaWRfd2lkdGg6TCwiJSI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUociwibGVmdHVuaXRzIikmJih5PXQzOTZfcm91bmRGbG9hdChWKnkvMTAwKSksdil7dmFyIE89cGFyc2VJbnQodDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZShiLCJsZWZ0IiksMTApLHE7IiUiPT09dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZShiLCJsZWZ0dW5pdHMiKSYmKE89dDM5Nl9yb3VuZEZsb2F0KFYqTy8xMDApKSx5LT1PO2JyZWFrfSF1JiZkPyJncmlkIj09PWgmJmMmJih5Kj1rKTp5PUEreSwiY2VudGVyIj09PXAmJih4PXQzOTZfZWxlbV9fZ2V0V2lkdGgociksZiYmIndpbmRvdyIhPT1GJiYoVio9ayx4Kj1rKSx5PVYvMi14LzIreSksInJpZ2h0Ij09PXAmJih4PXQzOTZfZWxlbV9fZ2V0V2lkdGgociksZiYmIndpbmRvdyIhPT1GJiYoVio9ayx4Kj1rKSx5PVYteCt5KSxmJiYid2luZG93IiE9PUYmJih5Kz0oKHg9dDM5Nl9lbGVtX19nZXRXaWR0aChyKSkqay14KS8yKTticmVhaztjYXNlInRvcCI6dmFyIFI9ci5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSxUPVI/Ui5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWluLW9mZnNldC10b3AiKToiMCIsVz1SP1IuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1pbi1oZWlnaHQiKToiMCIsSD1SP1IuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1heC1oZWlnaHQiKToiMCIsQz1mdW5jdGlvbiB0KGUpe3ZhciBpPXQzOTZfZWxlbV9fZ2V0SGVpZ2h0KGUpO2lmKGUmJiJpbWFnZSI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSl7dmFyIHI9dDM5Nl9lbGVtX19nZXRXaWR0aChlKSxvPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJmaWxld2lkdGgiKSxuPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJmaWxlaGVpZ2h0IiksYTtpZihvJiZuKWk9ci8ocGFyc2VJbnQobykvcGFyc2VJbnQobikpfXJldHVybiBpfSxQO2lmKEY9ImdyaWQiPT09aD8iZ3JpZCI6IndpbmRvdyIsUz0iZ3JpZCI9PT1oP3BhcnNlRmxvYXQoVCk6MCxJPSJncmlkIj09PWg/cGFyc2VGbG9hdChXKTpwYXJzZUZsb2F0KEgpLCIlIj09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShyLCJ0b3B1bml0cyIpJiYoeT1JKih5LzEwMCkpLHYpe3ZhciBNPXBhcnNlSW50KHQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUoYiwidG9wIiksMTApLE47IiUiPT09dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZShiLCJ0b3B1bml0cyIpJiYoTT10Mzk2X3JvdW5kRmxvYXQoSSpNLzEwMCkpLHktPU07YnJlYWt9ZiYmIndpbmRvdyIhPT1GJiYoeSo9ayksZyYmIndpbmRvdyIhPT1GJiYoUz0ic3RyZXRjaCI9PT1sPzA6Uy9rKSx5PVMreTt2YXIgRD10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKFIsImhlaWdodF92aCIpLGo9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShSLCJoZWlnaHQiKSxHPXQzOTZfYWJfX2dldEhlaWdodChSKSxaO2lmKGQmJiF1JiZEJiYoWj1wYXJzZUludChqLDEwKSprKSwiY2VudGVyIj09PXcmJihFPUMociksZiYmIndpbmRvdyIhPT1GJiYoInN0cmV0Y2giIT09bD9JKj1rOkk9Wj9aPkc/WjpHOlIuY2xpZW50SGVpZ2h0LEUqPWspLHV8fCFkfHxjfHwid2luZG93Ij09PUZ8fCJzdHJldGNoIiE9PWx8fChJPVo/Wj5HP1o6RzpSLmNsaWVudEhlaWdodCxJLz1rKSx5PUkvMi1FLzIreSksImJvdHRvbSI9PT13JiYoRT1DKHIpLGYmJiJ3aW5kb3ciIT09RiYmKCJzdHJldGNoIiE9PWw/SSo9azpJPVo/Wj5HP1o6RzpSLmNsaWVudEhlaWdodCxFKj1rKSx1fHwhZHx8Y3x8IndpbmRvdyI9PT1GfHwic3RyZXRjaCIhPT1sfHwoST1aP1o+Rz9aOkc6Ui5jbGllbnRIZWlnaHQsSS89aykseT1JLUUreSksZiYmIndpbmRvdyIhPT1GKXt2YXIgVT0oKEU9QyhyKSkqay1FKS8yO3krPVU9TWF0aC5yb3VuZChVKX19cmV0dXJuIHl9ZnVuY3Rpb24gdDM5Nl9lbGVtX2ZpbmRGaXJzdExldmVsUGFyZW50R3JvdXAodCl7Zm9yKHZhciBlPXQuY2xvc2VzdCgiLnQzOTZfX2dyb3VwIik7ZTspe3ZhciBpPWUucGFyZW50RWxlbWVudC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtpZighaSlicmVhaztlPWl9cmV0dXJuIGV9ZnVuY3Rpb24gdDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LGUpe2lmKCF0KXJldHVybiBudWxsO3ZhciBpLHI9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxvPSJhYiIrcixuO3ZvaWQgMD09PXdpbmRvdy50bltvXSYmKHQzOTZfaW5pdFROb2JqKHIsdCksdDM5Nl9zd2l0Y2hSZXNvbHV0aW9uKHIsdDM5Nl9kZXRlY3RSZXNvbHV0aW9uKHIpKSk7dmFyIGE9d2luZG93LnRuW29dLmN1clJlc29sdXRpb24sbD13aW5kb3cudG5bb10uY3VyUmVzb2x1dGlvbl9tYXgsZD13aW5kb3cudG5bb10uc2NyZWVucztpZihudWxsPT09KGk9YT09PWw/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtIitlKTp0LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC0iK2UrIi1yZXMtIithKSkpZm9yKHZhciBfPTA7XzxkLmxlbmd0aDtfKyspe3ZhciBzPWRbX107aWYoIShzPD1hKSYmbnVsbCE9PShpPXM9PT1sP3QuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLSIrZSk6dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtIitlKyItcmVzLSIrcykpKWJyZWFrfXZhciB1PXQzOTZfX3BhcnNlR2xvYmFsU3R5bGVDU1NWYXIoaSk7cmV0dXJuIHUmJihpPXUuZmFsbGJhY2spLGl9ZnVuY3Rpb24gdDM5Nl9hYl9fcmVuZGVyVmlld09uZUZpZWxkKHQsZSl7dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LGUpfWZ1bmN0aW9uIHQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZSh0LGUpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fZWxlbSIpP3QzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSh0LGUpOnQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCxlKX1mdW5jdGlvbiB0Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGkscixvPSJhYiIrdC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxuPXdpbmRvdy50bltvXS5jdXJSZXNvbHV0aW9uLGE9d2luZG93LnRuW29dLmN1clJlc29sdXRpb25fbWF4LGw9d2luZG93LnRuW29dLnNjcmVlbnMsZD1bIndpZHRobW9kZSIsImhlaWdodG1vZGUiLCJmbGV4Il0uaW5jbHVkZXMoZSk/IiI6Ii12YWx1ZSI7aWYobnVsbD09PShpPW49PT1hP3QuZ2V0QXR0cmlidXRlKCJkYXRhLWdyb3VwLSIrZStkKTp0LmdldEF0dHJpYnV0ZSgiZGF0YS1ncm91cC0iK2UrIi1yZXMtIituK2QpKSlmb3IodmFyIF89MDtfPGwubGVuZ3RoO18rKyl7dmFyIHM9bFtfXTtpZighKHM8PW4pJiZudWxsIT09KGk9cz09PWE/dC5nZXRBdHRyaWJ1dGUoImRhdGEtZ3JvdXAtIitlK2QpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWdyb3VwLSIrZSsiLXJlcy0iK3MrZCkpKWJyZWFrfXZhciB1PXQzOTZfX3BhcnNlR2xvYmFsU3R5bGVDU1NWYXIoaSk7cmV0dXJuIHUmJihpPXUuZmFsbGJhY2spLGl9ZnVuY3Rpb24gdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcodCl7aWYodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudG4tZ3JvdXAiKSxpPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChlLChmdW5jdGlvbih0KXtyZXR1cm4icGh5c2ljYWwiPT09dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZSh0LCJ0eXBlIil9KSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXt0Mzk2X2dyb3VwX19yZW5kZXJWaWV3KHQpLHQzOTZfYWxsZ3JvdXBzX19yZW5kZXJWaWV3QXV0b2xheW91dCh0KX0pKX19ZnVuY3Rpb24gdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXdBdXRvbGF5b3V0KHQpe2lmKHQmJnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cC1mbGV4Iikpe3ZhciBlPXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCwid2lkdGhtb2RlIiksaT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKHQsImhlaWdodG1vZGUiKTsiZmlsbCI9PT1lPyh0LnN0eWxlLndpZHRoPSIxMDAlIix0LnN0eWxlLmZsZXhTaHJpbms9IjEiKToodC5zdHlsZS53aWR0aD0iaHVnIj09PWU/Im1pbi1jb250ZW50IjoiIix0LnN0eWxlLmhlaWdodD0iaHVnIj09PWk/ImluaXRpYWwiOiIiLHQuc3R5bGUuZmxleFNocmluaz0iIil9fWZ1bmN0aW9uIHQzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcodCl7aWYodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudG4tZWxlbSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24odCl7dDM5Nl9lbGVtX19yZW5kZXJWaWV3KHQpfSkpfX1mdW5jdGlvbiB0Mzk2X2FiX19nZXRIZWlnaHQodCxlKXt2YXIgaT1lO2l8fChpPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0IikpLGk9cGFyc2VGbG9hdChpKTt2YXIgcj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsImhlaWdodF92aCIpO2lmKHImJihyPXBhcnNlRmxvYXQociksIWlzTmFOKHIpKSl7dmFyIG89dDM5Nl9hYl9fZ2V0V2luZG93SGVpZ2h0KHQpKnIvMTAwO2k8byYmKGk9byl9cmV0dXJuIGl9ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRXaWR0aCh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwodCkscixvLG49ImFiIitpLmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLGE9ZSxsLGQsXyxzOyhhfHwoYT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwid2lkdGgiKSksYT1wYXJzZUZsb2F0KGEpLCIlIj09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ3aWR0aHVuaXRzIikpJiYoYT0id2luZG93Ij09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJjb250YWluZXIiKT90Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKCkud2lkdGgqYS8xMDA6d2luZG93LnRuW25dLmdyaWRfd2lkdGgqYS8xMDApO3JldHVybiBhfWZ1bmN0aW9uIHQzOTZfZWxlbV9fZ2V0SGVpZ2h0KHQsZSl7dmFyIGk9dDM5Nl9nZXRFbCh0KSxyPWU7cnx8KHI9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksImhlaWdodCIpKSxyPXBhcnNlRmxvYXQocik7dmFyIG89aS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIiksbj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwidGV4dGZpdCIpLGE7aWYobnx8KCJidXR0b24iPT09bz9uPSJmaXhlZHNpemUiOiJ0ZXh0Ij09PW8mJihuPSJhdXRvaGVpZ2h0IikpLCJzaGFwZSI9PT1vfHwidmlkZW8iPT09b3x8Imh0bWwiPT09b3x8ImdhbGxlcnkiPT09b3x8KCJ0ZXh0Ij09PW98fCJidXR0b24iPT09bykmJiJmaXhlZHNpemUiPT09bil7dmFyIGw7aWYoIiUiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksImhlaWdodHVuaXRzIikpe3ZhciBkPWkuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIiksXz1kP2QuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1pbi1oZWlnaHQiKToiMCIscz1kP2QuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1heC1oZWlnaHQiKToiMCIsdT1wYXJzZUZsb2F0KF8pLGM9cGFyc2VGbG9hdChzKSxmO3I9IndpbmRvdyI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwiY29udGFpbmVyIik/Yyooci8xMDApOnUqKHIvMTAwKX1yZXR1cm4gcn1pZigidGV4dCI9PT1vKXt2YXIgZz1pLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIik7ZyYmKGcuc3R5bGUubGluZUhlaWdodD0iIil9cmV0dXJuIGkuY2xpZW50SGVpZ2h0fWZ1bmN0aW9uIHQzOTZfcm91bmRGbG9hdCh0KXtyZXR1cm4gTWF0aC5yb3VuZCgxMDAqdCkvMTAwfWZ1bmN0aW9uIHQzOTZfcmVtb3ZlRWxlbWVudEZyb21ET00odCl7dmFyIGU9dDM5Nl9nZXRFbCh0KTtlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX1mdW5jdGlvbiB0Mzk2X19nZXRCbG9ja0VkaXRvcldpZHRoKCl7aWYoIXdpbmRvdy50bi5pc0VkaXRNb2RlKXJldHVybiAwO3ZhciB0LGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZSgiLS1wYWdlLXZpZXctd2lkdGgiKTtyZXR1cm4gZSYmIjEwMCUiIT09ZT9wYXJzZUludChlLDEwKTowfWZ1bmN0aW9uIHQzOTZfX2lzQWxsWmVyb0Jsb2Nrc1JlbmRlcmVkKHQsZSl7dm9pZCAwPT09ZSYmKGU9MCk7dmFyIGk9dDM5Nl9fZ2V0WmVyb0Jsb2NrcygpLHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxvPXImJiJlZGl0Ij09PXIuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKSxuPSJyZWFkeSI9PT1kb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgiZGF0YS1yZWFkeS1zdGF0dXMiKSxhPSExO2lmKGkubGVuZ3RofHwhb3x8bil7aWYoIWkubGVuZ3RoJiZvJiZuKXJldHVybiBlPjMwP3ZvaWQgdCgpOnZvaWQgc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Mzk2X19pc0FsbFplcm9CbG9ja3NSZW5kZXJlZCh0LGUrMSl9KSwxMDApO3ZhciBsPWkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5hcnRib2FyZH0pKSxkO2lmKGwubGVuZ3RoPjAmJmwuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygicmVuZGVyZWQiKX0pKSl0KCk7ZWxzZXt2YXIgXz1sLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpO2wuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5jbGFzc0xpc3QuY29udGFpbnMoInJlbmRlcmVkIil8fGUuYWRkRXZlbnRMaXN0ZW5lcigiYXJ0Qm9hcmRSZW5kZXJlZCIsKGZ1bmN0aW9uKCl7Xy5wdXNoKGUpLF8ubGVuZ3RoIT09bC5sZW5ndGh8fGF8fHQoKX0pKX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2E9ITAsXy5sZW5ndGghPT1sLmxlbmd0aCYmdCgpfSksM2UzKX19ZWxzZXt2YXIgcz1uZXcgTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24oZSl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXsicmVhZHkiPT09ZS50YXJnZXQuZ2V0QXR0cmlidXRlKCJkYXRhLXJlYWR5LXN0YXR1cyIpJiYocy5kaXNjb25uZWN0KCksdDM5Nl9faXNBbGxaZXJvQmxvY2tzUmVuZGVyZWQodCkpfSkpfSkpO3Mub2JzZXJ2ZShkb2N1bWVudC5ib2R5LHthdHRyaWJ1dGVzOiEwLGF0dHJpYnV0ZUZpbHRlcjpbImRhdGEtcmVhZHktc3RhdHVzIl19KX19ZnVuY3Rpb24gdDM5Nl9fcHJvY2Vzc0VsZW1lbnRzVHJhbnNmb3JtKHQpe3ZhciBlPXQzOTZfX2luaXRGYXN0RE9NKCksaT1bXTtlLnJlYWQoKGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTtpZigidGV4dCI9PT1lfHwiaW1hZ2UiPT09ZXx8InNoYXBlIj09PWV8fCJidXR0b24iPT09ZXx8InZlY3RvciI9PT1lKXt2YXIgcj1nZXRDb21wdXRlZFN0eWxlKHQpLG89ci5iYWNrZHJvcEZpbHRlciYmIm5vbmUiIT09ci5iYWNrZHJvcEZpbHRlcnx8ci53ZWJraXRCYWNrZHJvcEZpbHRlciYmIm5vbmUiIT09ci53ZWJraXRCYWNrZHJvcEZpbHRlcixuPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3R5bGUiKTtpZihvJiYhbil7dmFyIGE9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbSIpLGw9YT93aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS50cmFuc2Zvcm06Im5vbmUiOyJtYXRyaXgoMSwgMCwgMCwgMSwgMCwgMCkiPT09bCYmKGw9Im5vbmUiKSwibm9uZSIhPT1sJiZpLnB1c2goe2VsZW1lbnQ6dCxhdG9tOmEsYXRvbVRyYW5zZm9ybTpsfSl9fX0pKX0pKSxlLndyaXRlKChmdW5jdGlvbigpe2kuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5hdG9tLnN0eWxlLnRyYW5zZm9ybT0ibm9uZSIsdC5lbGVtZW50LnN0eWxlLnRyYW5zZm9ybT10LmF0b21UcmFuc2Zvcm19KSl9KSl9ZnVuY3Rpb24gdDM5Nl9fZml4RWxlbWVudHNMaW5lSGVpZ2h0cyh0KXt2YXIgZT10Mzk2X19pbml0RmFzdERPTSgpLGk9W107ZS5yZWFkKChmdW5jdGlvbigpe0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU7aWYoInRleHQiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIikpe3ZhciByPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTtpZihyJiYhdDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKHQpKXt2YXIgbz10LnN0eWxlLnpvb20sbj1yLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0LGE9ci5zdHlsZS5mb250U2l6ZTtpLnB1c2goe2VsZW1lbnQ6dCxhdG9tOnIsem9vbTpvLHRleHRTaXplQWRqdXN0Om4sZm9udFNpemU6YX0pfX19KSl9KSksZS53cml0ZSgoZnVuY3Rpb24oKXtpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuYXRvbS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgibGluZS1oZWlnaHQiKSx3aW5kb3cudDM5Nl9faXNTYWZhcmkmJnQuem9vbSYmKHQuYXRvbS5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdD0ibm9uZSIsdC5hdG9tLnN0eWxlLmZvbnRTaXplPSIiLHQuZWxlbWVudC5zdHlsZS56b29tPSIiKX0pKX0pKSxlLnJlYWQoKGZ1bmN0aW9uKCl7aS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmNvbXB1dGVkTGluZUhlaWdodD1wYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQuYXRvbSkubGluZUhlaWdodCl9KSl9KSksZS53cml0ZSgoZnVuY3Rpb24oKXtpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQuY29tcHV0ZWRMaW5lSGVpZ2h0O3dpbmRvdy50Mzk2X19pc1NhZmFyaSYmdC56b29tJiYodC5hdG9tLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PXQudGV4dFNpemVBZGp1c3QsdC5hdG9tLnN0eWxlLmZvbnRTaXplPXQuZm9udFNpemUsdC56b29tJiYodC5lbGVtZW50LnN0eWxlLnpvb209dC56b29tKSksZSYmIWlzTmFOKGUpJiYodC5hdG9tLnN0eWxlLmxpbmVIZWlnaHQ9TWF0aC5yb3VuZChlKSsicHgiKX0pKX0pKX1mdW5jdGlvbiB0Mzk2X19maXhFbGVtZW50c0ZvbnRTaXplcyh0KXt2YXIgZTtpZighd2luZG93LnQzOTZfX2lzTW9iaWxlJiZ3aW5kb3cudDM5Nl9faXNJUGFkfHx3aW5kb3cudDM5Nl9faXNGYWNlYm9va01lc3NlbmdlckluQXBwfHx3aW5kb3cudDM5Nl9faXNJbnN0YWdyYW1JbkFwcCl7dmFyIGk9dDM5Nl9faW5pdEZhc3RET00oKSxyPVtdO2kucmVhZCgoZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO2lmKCJ0ZXh0Ij09PWV8fCJidXR0b24iPT09ZSl7dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbSIpO2lmKGkpe3ZhciBvPXQzOTZfZWxlbV9maW5kRmlyc3RMZXZlbFBhcmVudEdyb3VwKHQpLG49e2VsZW1lbnQ6dCxhdG9tOmksem9vbToxLGVsZW1lbnRUeXBlOmV9O2lmKG8mJm8uc3R5bGUuem9vbSYmKG4uem9vbT1wYXJzZUZsb2F0KG8uc3R5bGUuem9vbSkpLDEhPT1uLnpvb20pe3ZhciBhPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSh0LCJmb250c2l6ZSIpO2EmJihuLmZpZWxkRm9udFNpemU9cGFyc2VGbG9hdChhKSksci5wdXNoKG4pfX19fSkpfSkpLGkud3JpdGUoKGZ1bmN0aW9uKCl7ci5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmF0b20uc3R5bGUuZm9udFNpemU9IiJ9KSl9KSksaS5yZWFkKChmdW5jdGlvbigpe3IuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9cGFyc2VGbG9hdCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0LmF0b20pLmZvbnRTaXplKSxpPXQuZmllbGRGb250U2l6ZSYmTWF0aC5hYnModC5maWVsZEZvbnRTaXplLWUpPD0uMDEscj1OdW1iZXIuaXNJbnRlZ2VyKGUpO3QuY29ycmVjdEZvbnRTaXplPWl8fHI/ImNhbGMoIitlKyJweCAqIHZhcigtLXpvb20sIDEpKSI6ImNhbGMoIitlKyJweCAqIHZhcigtLXpvb20sIDEpICogdmFyKC0tem9vbSwgMSkpIn0pKX0pKSxpLndyaXRlKChmdW5jdGlvbigpe3IuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5hdG9tLnN0eWxlLmZvbnRTaXplPXQuY29ycmVjdEZvbnRTaXplfSkpfSkpfX1mdW5jdGlvbiB0Mzk2X19pbml0RmFzdERPTSgpe3JldHVybntyZWFkOmZ1bmN0aW9uIHQoZSl7ZSgpfSx3cml0ZTpmdW5jdGlvbiB0KGUpe2UoKX19fWZ1bmN0aW9uIHQzOTZfX2FwcGx5Rml4ZXNGb3JBbGxFbGVtZW50cygpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50Mzk2X19lbGVtIiksZT13aW5kb3cudDM5Nl9faXNTYWZhcml8fHdpbmRvdy50Mzk2X19pc0ZhY2Vib29rTWVzc2VuZ2VySW5BcHB8fHdpbmRvdy50Mzk2X19pc0luc3RhZ3JhbUluQXBwO2RvY3VtZW50LmZvbnRzJiZlP2RvY3VtZW50LmZvbnRzLnJlYWR5LnRoZW4oKGZ1bmN0aW9uKCl7dDM5Nl9fZml4RWxlbWVudHNGb250U2l6ZXModCksdDM5Nl9fZml4RWxlbWVudHNMaW5lSGVpZ2h0cyh0KX0pKTp0Mzk2X19maXhFbGVtZW50c0xpbmVIZWlnaHRzKHQpLHQzOTZfX3Byb2Nlc3NFbGVtZW50c1RyYW5zZm9ybSh0KX1mdW5jdGlvbiB0Mzk2X196b29taWZ5VmFsdWUodCxlLGkpe3ZvaWQgMD09PWkmJihpPXt9KTt2YXIgcixvPWUrKFN0cmluZyhlKS5lbmRzV2l0aCgicHgiKT8iIjoicHgiKSxuO2lmKHQzOTZfX2lzSW5zaWRlR3JvdXBXaXRoWm9vbSh0KSlyZXR1cm4gbzt2YXIgYT13aW5kb3cuQ1NTJiZ3aW5kb3cuQ1NTLnN1cHBvcnRzJiZDU1Muc3VwcG9ydHMoIndpZHRoIiwicm91bmQoMTBweCwgMXB4KSIpO3JldHVybiBpLnJvdW5kJiZhPyJyb3VuZCgiK28rIiAqIHZhcigtLXpvb20sIDEpLCAxcHgpIjoiY2FsYygiK28rIiAqIHZhcigtLXpvb20sIDEpKSJ9ZnVuY3Rpb24gdDM5Nl9faXNJblBvcHVwKHQpe2lmKCF0KXJldHVybiExO3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksaSxyO3JldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIitlKS5wYXJlbnROb2RlLmNsYXNzTGlzdC5jb250YWlucygidC1wb3B1cF9fY29udGFpbmVyIil9ZnVuY3Rpb24gdDM5Nl9fd2FpdEZvclBvcHVwKCl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0KXt2YXIgZT0wLGk9NTtmdW5jdGlvbiByKCl7dmFyIGk9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtcG9wdXBfc2hvdyIpO2k/dChpKTplPj01P3QobnVsbCk6KGUrKyxzZXRUaW1lb3V0KHIsMTAwKmUpKX1yKCl9KSl9ZnVuY3Rpb24gdDM5Nl9fc2hvdWxkVXNlVmlzdWFsVmlld3BvcnRIZWlnaHQoKXtyZXR1cm4idmlzdWFsVmlld3BvcnQiaW4gd2luZG93JiZ3aW5kb3cudDM5Nl9faXNNb2JpbGUmJndpbmRvdy50Mzk2X19pc1NhZmFyaX1mdW5jdGlvbiB0Mzk2X19nZXRSb290Wm9uZSgpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksZTtyZXR1cm4gdCYmdC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtcm9vdC16b25lIil8fCJjb20ifWZ1bmN0aW9uIHQzOTZfX2ludGlhbGl6ZVVuZGVyY3V0KHQpe2lmKHQmJnQucXVlcnlTZWxlY3RvcigiLnFsLXVuZGVyY3V0Iikpe3ZhciBlLGk9Imh0dHBzOi8vc3RhdGljLnRpbGRhY2RuLiIrdDM5Nl9fZ2V0Um9vdFpvbmUoKSsiL2pzL3RpbGRhLXVuZGVyY3V0LTEuMC5taW4uanMiO3Rfb25GdW5jTG9hZCgidF9sb2FkSnNGaWxlIiwoZnVuY3Rpb24oKXt0X2xvYWRKc0ZpbGUoaSwoZnVuY3Rpb24oKXt0X29uRnVuY0xvYWQoInRfcXVpbGxVbmRlcmN1dF9wYXJzZU5vZGVzIiwoZnVuY3Rpb24oKXt0X3F1aWxsVW5kZXJjdXRfcGFyc2VOb2Rlcyh0KX0pKX0pKX0pKX19ZnVuY3Rpb24gdDM5Nl9faW5pdGlhbGl6ZUFydGJvYXJkT3ZlcmZsb3codCxlKXtpZihlJiZ0KXt2YXIgaT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5nZXRQcm9wZXJ0eVZhbHVlKCJvdmVyZmxvdyIpO2lmKCJhdXRvIj09PWkpe3ZhciByPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWxhenkiKTsieSIhPT13aW5kb3cubGF6eSYmInllcyIhPT1yfHx0X29uRnVuY0xvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXtlLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdF90aHJvdHRsZSh3aW5kb3cudF9sYXp5bG9hZF91cGRhdGUsNTAwKSl9KSl9IiIhPT13aW5kb3cubG9jYXRpb24uaGFzaCYmInZpc2libGUiPT09aSYmKGUuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsc2V0VGltZW91dCgoZnVuY3Rpb24oKXtlLnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIn0pLDEpKX19ZnVuY3Rpb24gdDM5Nl9faW5pdGlhbGl6ZUFuY2hvckxpbmtPdmVyZmxvd0ZpeCgpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFydGJvYXJkLW92cmZsdz0idmlzaWJsZSJdJyk7dC5sZW5ndGgmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoZnVuY3Rpb24oZSl7dmFyIGk7ZS50YXJnZXQuY2xvc2VzdCgnYVtocmVmXj0iIyJdJykmJih0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3Quc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiJ9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3Quc3R5bGUub3ZlcmZsb3c9InZpc2libGUifSkpfSkpKX0pKX0KCmZ1bmN0aW9uIHRfc2xkc0luaXQodCxlKXt2YXIgcz10X3NsZHNfX2dldFJlYyh0KTtpZihzKXt2YXIgcj1zLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxpO2lmKHIpaWYoIXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pbml0aWFsaXplZCIpKXt2YXIgYT1yLmNsYXNzTGlzdC5jb250YWlucygianMtZmVlZC1jb250YWluZXIiKSxsPXMucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbTpub3QoLnQtc2xkc19faXRlbV9kdW1teSkiKTtpZihsKXtlJiZlLnJhbmRvbVNvcnQmJihsPXRfc2xkc19yYW5kb21Tb3J0RWxlbWVudHMobCkpO3ZhciBkPWwubGVuZ3RoLG89bFswXSxuPWxbbC5sZW5ndGgtMV0sYz13aW5kb3cuaW5uZXJXaWR0aCxfPXBhcnNlSW50KHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKSwxMCl8fDAsdT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpLHA9cGFyc2VGbG9hdChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdHJhbnNpdGlvbiIpKSxmO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobCwoZnVuY3Rpb24odCxlKXt0LnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIsZSsxKX0pKSwidHJ1ZSIhPT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcCIpKXtwfHwwPT09cHx8KHA9MzAwKSxpc05hTihwKSYmci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRyYW5zaXRpb24iLCIzMDAiKSxyLmNsYXNzTGlzdC5jb250YWlucygidC1zbGRzX2FuaW1hdGVkLWZhc3QiKXx8ci5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xkc19hbmltYXRlZC1zbG93Iil8fHIuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpfHxyLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZC1mYXN0Iik7dmFyIG09Xzt0X3NsZHNfc2V0SXRlbXNJblJvdyh0KSx0X3NsZHNfY2hhbmdlSW1hZ2VVcmwodCk7dmFyIHk9OD09PWRvY3VtZW50LmRvY3VtZW50TW9kZXx8OT09PWRvY3VtZW50LmRvY3VtZW50TW9kZTt5JiYoci5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtZmFzdCIpLHIuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLXNsb3ciKSxyLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZC1ub25lIiksci5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfaWUiKSxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQiLCJ0cnVlIiksci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIsMSkpLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pbml0aWFsaXplZCIsInRydWUiKSxyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiKXx8ci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIixkKTt2YXIgdj0xLGc9ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpO2c/dj1wYXJzZUludChnLDEwKTpyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIiwxKSxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiLCIiKSxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItYW5pbWF0ZWQiLCIiKSxhfHx0X3NsZHNfX2NyZWF0ZUR1bW1pZXMobyxuLHIpLF89cGFyc2VJbnQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLDEwKXx8MDt2YXIgYj1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93X3dyYXBwZXItcmlnaHQiKTtiLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLChmdW5jdGlvbih0KXt0LnN0eWxlLmRpc3BsYXk9ImZhbHNlIj09PXUmJmQtXzw9MD8ibm9uZSI6IiJ9KSksYXx8dF9zbGRzX1NsaWRlcldpZHRoKHQpLCJ0cnVlIj09ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0IikmJnRfc2xkc19TbGlkZXJIZWlnaHQodCksdF9zbGRzX1NsaWRlckFycm93c0hlaWdodCh0KSx0X3NsZHNfQWN0aXZlU2xpZGUodCx2LGQpLHRfc2xkc19BY3RpdmVDYXB0aW9uKHQsdixkKSxhP2M+OTYwJiYoInRydWUiPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtZmVlZHMtcG9zdHMtbG9hZGVkIik/KHRfc2xkc19faW5pdEZlZWRzU2xpZGVyKHQscyxlKSx0X3NsZHNfaW5pdFNsaWRlckNvbnRyb2xzKHQsZSkpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZlZWRzTG9hZFBvc3RzIiwoZnVuY3Rpb24oKXt0X3NsZHNfX2luaXRGZWVkc1NsaWRlcih0LHMsZSksdF9zbGRzX2luaXRTbGlkZXJDb250cm9scyh0LGUpfSkpKTooeXx8dF9zbGRzX29uSGFtbWVyTG9hZCgiSGFtbWVyIiwoZnVuY3Rpb24oKXt0X3NsZHNfaW5pdFNsaWRlclN3aXBlKHQsZCxjKX0pKSx0X3NsZHNfaW5pdFNsaWRlckNvbnRyb2xzKHQsZSksdF9zbGRzX3VwZGF0ZVNsaWRlcih0KSksci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRpbWVvdXQiKT4wP3Rfc2xkc19pbml0QXV0b1BsYXkodCx2LGQsZSk6ci5hZGRFdmVudExpc3RlbmVyKCJzbGlkZUF1dG9wbGF5VGltZXJSZWFkeSIsKGZ1bmN0aW9uKCl7ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRpbWVvdXQiKT4wJiZ0X3NsZHNfaW5pdEF1dG9QbGF5KHQsdixkLGUpfSkpLHMucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbS1sb2FkZWQiKS5sZW5ndGg8ZCsyJiZ0X3NsZHNfVXBkYXRlSW1hZ2VzKHQsdiksInllcyI9PXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1hcnJvd3MtbmVhcnBpYyIpJiZ0X3NsZHNfcG9zaXRpb25BcnJvd3ModCk7dmFyIGg9cy5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzIik7aC5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaCwoZnVuY3Rpb24odCl7dC5zdHlsZS52aXNpYmlsaXR5PSIifSkpLHRfc2xkc19fc2V0VGFiaW5kZXhGb3JGb2N1c2FibGVFbGVtZW50cyh0KSxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIix0X3NsZHNfdXBkYXRlT25EaXNwbGF5Q2hhbmdlKSxzLmFkZEV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIix0X3NsZHNfdXBkYXRlT25EaXNwbGF5Q2hhbmdlKHQsbSkpLGEmJihzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIix0X3NsZHNfdXBkYXRlRmVlZHNTbGlkZXJPblJlc2l6ZSkscy5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsKGZ1bmN0aW9uKCl7dF9zbGRzX3VwZGF0ZUZlZWRzU2xpZGVyT25SZXNpemUodCxzLGUpfSkpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9zbGRzX3NldEl0ZW1zSW5Sb3codCxtKSx0X3NsZHNfdXBkYXRlU2xpZGVyKHQpLHRfc2xkc19wb3NpdGlvbkFycm93cyh0KSxhJiZ0X3NsZHNfdXBkYXRlRmVlZHNTbGlkZXJPblJlc2l6ZSh0LHMsZSl9KSwxMDApfSkpKSx3aW5kb3cudF9zbGRzX19pc2lPUyYmKCJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlP3Rfc2xkc19faGlkZU1vYmlsZVNsaWRlcyhzLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIikpOndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXt0X3NsZHNfX2hpZGVNb2JpbGVTbGlkZXMocy5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpKX0pKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpeyJ0cnVlIj09ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0IikmJnRfc2xkc19VcGRhdGVTbGlkZXJIZWlnaHQodCksdF9zbGRzX1VwZGF0ZVNsaWRlckFycm93c0hlaWdodCh0KX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Rfc2xkc19VcGRhdGVTbGlkZXJBcnJvd3NIZWlnaHQodCl9KSw1MDApO3ZhciBBPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhbGxyZWNvcmRzIik7QSYmQS5hZGRFdmVudExpc3RlbmVyKCJhbGxSZWNQYWRkaW5nSW5pdCIsKGZ1bmN0aW9uKCl7dF9zbGRzX3VwZGF0ZVNsaWRlcih0KX0pKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdF9zbGRzX19yZW1vdmVBdXRvcGxheUJ5VmlkZW8pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0X3NsZHNfX3JlbW92ZUF1dG9wbGF5QnlWaWRlbyl9fX19fWZ1bmN0aW9uIHRfc2xkc19fcmVtb3ZlQXV0b3BsYXlCeVZpZGVvKHQpe3ZhciBlPXQudGFyZ2V0LmNsb3Nlc3QoIi50LXNsZHNfX2l0ZW0iKSxzPW51bGw9PWU/dm9pZCAwOmUucXVlcnlTZWxlY3RvcigiW2RhdGEtc2xpZGVyLXZpZGVvLXR5cGVdLCBbZGF0YS12aWRlb2xhenktdHlwZV0sIGlmcmFtZSIpO2lmKHMpe3ZhciByPXMuY2xvc2VzdCgiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGk7aWYocilyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaW50ZXJ2YWwtaWQiKSYmKHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwieWVzIiksci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iLCJ5IikpfX1mdW5jdGlvbiB0X3NsZHNfX2luaXRGZWVkc1NsaWRlcih0LGUpe3ZhciBzPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKHMpe3ZhciByPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbTpub3QoLnQtc2xkc19faXRlbV9kdW1teSkiKSxpPXBhcnNlSW50KHMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpLDEwKXx8MCxhPXJbMF0sbD1yW3IubGVuZ3RoLTFdLGQ9cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKTt0X3NsZHNfX2NyZWF0ZUR1bW1pZXMoYSxsLHMpLHRfc2xkc191cGRhdGVTbGlkZXIodCk7dmFyIG89cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLDEwKXx8MCxuPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYXJyb3dfd3JhcHBlci1yaWdodCIpO24ubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3Quc3R5bGUuZGlzcGxheT0iZmFsc2UiPT09ZCYmaS1vPD0wPyJub25lIjoiIn0pKSwidHJ1ZSI9PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodCIpJiZ0X3NsZHNfU2xpZGVySGVpZ2h0KHQpfX1mdW5jdGlvbiB0X3NsZHNfX2NyZWF0ZUR1bW1pZXModCxlLHMpe3ZhciByLGk9cy5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpLmxlbmd0aCxhPXBhcnNlSW50KHMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKSwxMCl8fDAsbD1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpLGQ9cy5jbGFzc0xpc3QuY29udGFpbnMoImpzLWZlZWQtY29udGFpbmVyIiksbz0hMSxuPSExLGMsXztpZih0JiYoYz10LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXpvb21hYmxlPSJ5ZXMiXScpKSYmKG89ITAsYy5jbGFzc0xpc3QuY29udGFpbnMoInQtem9vbWFibGUiKSYmYy5jbGFzc0xpc3QucmVtb3ZlKCJ0LXpvb21hYmxlIiksYy5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtem9vbWFibGUiKSksZSYmKF89ZS5xdWVyeVNlbGVjdG9yKCdbZGF0YS16b29tYWJsZT0ieWVzIl0nKSkmJihuPSEwLF8uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXpvb21hYmxlIikmJl8uY2xhc3NMaXN0LnJlbW92ZSgidC16b29tYWJsZSIpLF8ucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXpvb21hYmxlIikpLGUmJjA9PXMucXVlcnlTZWxlY3RvckFsbCgnLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSIwIl0nKS5sZW5ndGgpe3ZhciB1PWUuY2xvbmVOb2RlKCEwKTt1LnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIsIjAiKSx1LnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIik7dmFyIHA9dC5wYXJlbnROb2RlO3AuaW5zZXJ0QmVmb3JlKHUsdCk7dmFyIGY9cC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zbGlkZS1pbmRleD0iMCJdIFtmaWVsZF0nKTtmLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChmLChmdW5jdGlvbih0KXt0LnJlbW92ZUF0dHJpYnV0ZSgiZmllbGQiKX0pKX1pZighZCYmdCYmIXMucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSInKyhpKzEpKyciXScpKXt2YXIgbT10LmNsb25lTm9kZSghMCk7aWYobS5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiLGkrMSksbS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIiksbS5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpLGUuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJhZnRlcmVuZCIsbSksZS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW0tbG9hZGVkIiksYT4wJiYidHJ1ZSI9PT1sKWZvcih2YXIgeT10LHY9ZSxnPTA7ZzxhLTE7ZysrKXt2YXIgYj15Lm5leHRFbGVtZW50U2libGluZy5jbG9uZU5vZGUoITApO2Iuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IixpK2crMSksdi5uZXh0RWxlbWVudFNpYmxpbmcuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJhZnRlcmVuZCIsYiksdj12Lm5leHRFbGVtZW50U2libGluZyx5PXkubmV4dEVsZW1lbnRTaWJsaW5nfX1vJiZjJiYoYy5jbGFzc0xpc3QuYWRkKCJ0LXpvb21hYmxlIiksYy5zZXRBdHRyaWJ1dGUoImRhdGEtem9vbWFibGUiLCJ5ZXMiKSksbiYmXyYmKF8uY2xhc3NMaXN0LmFkZCgidC16b29tYWJsZSIpLF8uc2V0QXR0cmlidXRlKCJkYXRhLXpvb21hYmxlIiwieWVzIikpfWZ1bmN0aW9uIHRfc2xkc19faGlkZU1vYmlsZVNsaWRlcyh0KXtpZih0KXt2YXIgZT10LmNsb3Nlc3QoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxzPWUmJmdldENvbXB1dGVkU3R5bGUoZSk7aWYoIXN8fCJzY3JvbGwiIT09cy5vdmVyZmxvd1h8fCJmbGV4IiE9PXMuZGlzcGxheSl7dmFyIHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpKSxpPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aD45NjA/NTozO2lmKCEoci5sZW5ndGg8PTIqaSkpe2Zvcih2YXIgYT10LmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIpLGw9W2E9cGFyc2VJbnQoYSwxMCldLGQ9MTtkPGk7ZCsrKWErZDw9ci5sZW5ndGg/bC5wdXNoKGErZCk6bC5wdXNoKGQpLGEtZD4wP2wucHVzaChhLWQpOmwucHVzaChyLmxlbmd0aCsxLWQpO3ZhciBvPSJ0LXNsZHNfX2l0ZW0taW5uYWN0aXZlIjtyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlO2wuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIHBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IiksMTApPT09ZX0pKT90LmNsYXNzTGlzdC5yZW1vdmUobyk6dC5jbGFzc0xpc3QuYWRkKG8pfSkpfX19fWZ1bmN0aW9uIHRfc2xkc191cGRhdGVPbkRpc3BsYXlDaGFuZ2UodCxlKXt0X3Rocm90dGxlKChmdW5jdGlvbigpe3Rfc2xkc19zZXRJdGVtc0luUm93KHQsZSksdF9zbGRzX3VwZGF0ZVNsaWRlcih0KSx0X3NsZHNfcG9zaXRpb25BcnJvd3ModCl9KSl9ZnVuY3Rpb24gdF9zbGRzX3VwZGF0ZUZlZWRzU2xpZGVyT25SZXNpemUodCxlLHMpe3ZhciByPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGk7ciYmKHIuY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1mZWVkLWNvbnRhaW5lciIpJiYod2luZG93LmlubmVyV2lkdGg+OTYwPyJ0cnVlIj09PXIuZ2V0QXR0cmlidXRlKCJkYXRhLWZlZWRzLXBvc3RzLWxvYWRlZCIpPyh0X3NsZHNfX2luaXRGZWVkc1NsaWRlcih0LGUscyksdF9zbGRzX2luaXRTbGlkZXJDb250cm9scyh0LHMpKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmZWVkc0xvYWRQb3N0cyIsKGZ1bmN0aW9uKCl7dF9zbGRzX19pbml0RmVlZHNTbGlkZXIodCxlLHMpLHRfc2xkc19pbml0U2xpZGVyQ29udHJvbHModCxzKX0pKTpyLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWCgwKSIpKX1mdW5jdGlvbiB0X3NsZHNfc2V0SXRlbXNJblJvdyh0LGUpe3ZhciBzPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHMpe3ZhciByPXMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGksYTtpZihyKShyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93Iil8fDApJiYod2luZG93LmlubmVyV2lkdGg8PTk2MCYmKGE9Miksd2luZG93LmlubmVyV2lkdGg8PTY0MCYmKGE9MSksd2luZG93LmlubmVyV2lkdGg+OTYwJiYoYT1lKSksYSYmci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIsYSl9fWZ1bmN0aW9uIHRfc2xkc19pbml0U2xpZGVyQ29udHJvbHModCxlKXt2YXIgcz10X3NsZHNfX2dldFJlYyh0KTtpZihzKXt2YXIgcj1zLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihyKXt2YXIgaT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93Iil8fDAsYT1zLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciAudC1zbGRzX19pdGVtIiksbD1zLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciIpLGQ9aT4wJiZhJiZsP2Eub2Zmc2V0V2lkdGg6bC5vZmZzZXRXaWR0aCxvO2lmKCJ0cnVlIiE9PXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wIikpe3Iuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKC0iK2QrInB4KSI7dmFyIG49cy5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd193cmFwcGVyIik7bi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24oaSl7aS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKGZ1bmN0aW9uKCl7dmFyIGk9dF9zbGRzX2dldEN1cnJlbnRUcmFuc2xhdGUocyksYT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItYW5pbWF0ZWQiKSxsPXBhcnNlRmxvYXQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpKSxkPXBhcnNlRmxvYXQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIikpLG89ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSxuPSIiLGM7IiI9PWEmJihyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItYW5pbWF0ZWQiLCJ5ZXMiKSwibGVmdCI9PT10aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1kaXJlY3Rpb24iKT8iZmFsc2UiPT1vJiYxPT1sP2w9MTpsLS06ImZhbHNlIj09byYmbD09ZD9sPWQ6bCsrLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLGwpLGwhPWQrMSYmMCE9bHx8KG49InllcyIpLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIsbiksdF9zbGlkZU1vdmVXaXRob3V0QW5pbWF0aW9uKHQsITEsZSxpKSk7dF9zbGRzX3VwZGF0ZVNsaWRlcih0KX0pKX0pKTt2YXIgYz1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2J1bGxldCIpO2MubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsKGZ1bmN0aW9uKGkpe2kuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbigpe3ZhciBhPXBhcnNlSW50KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWJ1bGxldC1mb3IiKSwxMCksbDtpZihwYXJzZUludChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIiksMTApIT09YSl7dmFyIGQ9dF9zbGRzX2dldEN1cnJlbnRUcmFuc2xhdGUocyk7ci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsYSksdF9zbGlkZU1vdmVXaXRob3V0QW5pbWF0aW9uKHQsITEsZSxkKSx0X3NsZHNfdXBkYXRlU2xpZGVyKHQpfX0pKX0pKX19fX1mdW5jdGlvbiB0X3NsZHNfYW5pbWF0ZSh0LGUscyl7dmFyIHI9cGVyZm9ybWFuY2Uubm93KCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbiBpKGEpe3ZhciBsPShhLXIpL3M7bD4xJiYobD0xKTt2YXIgZD10KGwpO2UoZCksbDwxP3JlcXVlc3RBbmltYXRpb25GcmFtZShpKToieSIhPT13aW5kb3cubGF6eSYmInllcyIhPT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYWxscmVjb3JkcyIpLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5Iil8fHRfc2xkc19vbkhhbW1lckxvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXt0X2xhenlsb2FkX3VwZGF0ZSgpfSkpfSkpfWZ1bmN0aW9uIHRfc2xpZGVfTW92ZUFuaW1hdGlvbih0LGUscyxyKXtpZih0KXt0LnN0eWxlLnRyYW5zaXRpb249ImhlaWdodCBlYXNlLWluLW91dCAuNXMsIHRyYW5zZm9ybSBlYXNlLWluLW91dCAwcyI7dmFyIGk9LU1hdGguYWJzKGUqcyksYT0tcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZSh0KS50cmFuc2Zvcm0ubWF0Y2goL1xkKy8pWzBdKSxsPWEtaTswIT09bCYmdF9zbGRzX2FuaW1hdGUoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSksKGZ1bmN0aW9uKGUpe3Quc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKCIrKGEtbCplKSsicHgpIn0pLHIpfX1mdW5jdGlvbiB0X3NsaWRlTW92ZVdpdGhvdXRBbmltYXRpb24odCxlLHMpe3ZhciByPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHIpe3ZhciBpPXIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKGkpe3ZhciBhPXBhcnNlRmxvYXQoaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpKSxsLGQ9KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKXx8MCk+MD9yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciAudC1zbGRzX19pdGVtIikub2Zmc2V0V2lkdGg6ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIiKS5vZmZzZXRXaWR0aCxvPXBhcnNlRmxvYXQoaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIikpLG49aS5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xkc19hbmltYXRlZC1ub25lIik7YT5vKzEmJihhPTEpO3ZhciBjPXIuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIiksXz10X3NsZHNfZ2V0RXZlbnRzRm9yWmVyb0Jsb2NrKCksdT1fLm1vdmVTbGlkZVN0YXJ0RXZlbnQscD1fLm1vdmVTbGlkZUVuZEV2ZW50O2lmKGMmJnIuZGlzcGF0Y2hFdmVudCh1KSxuKXt2YXIgZj1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIiksbT1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW0iKTtpZihmJiYwPT09ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtX2R1bW15IikubGVuZ3RoKXt2YXIgeT1mLmNsb25lTm9kZSghMCksdjt5LmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbV9kdW1teSIpLHkuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix5LnN0eWxlLmxlZnQ9ZCphKyJweCIsaS5hcHBlbmRDaGlsZCh5KSwodj1yLmNsYXNzTGlzdC5jb250YWlucygianMtcHJvZHVjdCIpP3I6ci5xdWVyeVNlbGVjdG9yKCIudC1jYXRhbG9nLCAudC1zdG9yZSIpfHxyLnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0IikpPyh0X3NsZHNfZmFkZU91dCh5LDE1MCwoZnVuY3Rpb24oKXtudWxsIT09eS5wYXJlbnROb2RlJiZ5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoeSl9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtLChmdW5jdGlvbih0KXt0X3NsZHNfZmFkZUluKHQsMTUwKX0pKSk6KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobSwoZnVuY3Rpb24odCl7dC5zdHlsZS5vcGFjaXR5PTB9KSksdF9zbGRzX2ZhZGVPdXQoeSw0MDAsKGZ1bmN0aW9uKCl7bnVsbCE9PXkucGFyZW50Tm9kZSYmeS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHkpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtLChmdW5jdGlvbih0KXt0X3NsZHNfZmFkZUluKHQpfSkpLGMmJnIuZGlzcGF0Y2hFdmVudChwKX0pLDUwKSl9aS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQtY2FuY2VsIil9dF9zbGlkZU1vdmUodCxlLHMpLG4mJmkuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLWNhbmNlbCIpLGMmJnIuZGlzcGF0Y2hFdmVudChwKX19fWZ1bmN0aW9uIHRfc2xpZGVNb3ZlSW5zdGFudGx5KHQsZSxzKXt2YXIgcj10X3NsZHNfX2dldFJlYyh0KTtpZihyKXt2YXIgaT1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihpKXt2YXIgYT1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiKSksbCxkPShpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93Iil8fDApPjA/ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIgLnQtc2xkc19faXRlbSIpLm9mZnNldFdpZHRoOnIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIikub2Zmc2V0V2lkdGgsbz1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpKSxuPWkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpO2lmKGE+bysxJiYoYT0xKSxuKXt2YXIgYz1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIik7aWYoYyYmMD09PXIucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbV9kdW1teSIpLmxlbmd0aCl7dmFyIF89Yy5jbG9uZU5vZGUoITApO18uY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtX2R1bW15IiksXy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLF8uc3R5bGUubGVmdD1kKmErInB4IixpLmFwcGVuZENoaWxkKF8pLHRfc2xkc19mYWRlT3V0KF8sNDAwLChmdW5jdGlvbigpe251bGwhPT1fLnBhcmVudE5vZGUmJl8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChfKX0pKX1pLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZCIpLGkuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLWNhbmNlbCIpfWVsc2UgaS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQiKSxpLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZC1jYW5jZWwiKTt0X3NsaWRlTW92ZSh0LGUscyksaS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQiKSxpLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1jYW5jZWwiKX19fWZ1bmN0aW9uIHRfc2xpZGVNb3ZlKHQsZSxzKXt2YXIgcj10X3NsZHNfX2dldFJlYyh0KTtpZihyKXt2YXIgaT1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihpKXt2YXIgYT1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIiksbD1pLmNsYXNzTGlzdC5jb250YWlucygianMtZmVlZC1jb250YWluZXIiKSxkPXBhcnNlSW50KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKXx8MCksbz1wYXJzZUludChpLmdldEF0dHJpYnV0ZSgiZGF0YS1mZWVkLXNob3ctY291bnQiKXx8MCksbj1kPjA/ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIgLnQtc2xkc19faXRlbSIpLm9mZnNldFdpZHRoOnIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIikub2Zmc2V0V2lkdGgsYz1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10cmFuc2l0aW9uIikpLF89cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIikpLHU9cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiKSkscD1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiKSxmPWkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpLG09aS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRpbWVvdXQiKT4wLHk9ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvd193cmFwcGVyLXJpZ2h0Iiksdj1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93X3dyYXBwZXItbGVmdCIpLGc7Im9mZiI9PT1pLmdldEF0dHJpYnV0ZSgiYXJpYS1saXZlIikmJmkuc2V0QXR0cmlidXRlKCJhcmlhLWxpdmUiLCJwb2xpdGUiKTt2YXIgYj0wO2lmKC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpe3ZhciBoPW5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9WZXJzaW9uXC8oXGQrKVwuKFxkKylcLj8oXGQrKT8gU2FmYXJpLyk7bnVsbCE9PWgmJihiPXBhcnNlSW50KGhbMV0sMTApKX12YXIgQT0hIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goIkNyaU9TIiksUztpZihjfHwwPT09Y3x8KGM9MzAwKSxfPnUrMSYmKF89MSxpLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIiwxKSksInRydWUiIT09aS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3AiKSl7aWYoeSlpZihsKXt2YXIgdz1hW2EubGVuZ3RoLTFdLEU9cGFyc2VJbnQody5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiKSwxMCk7aWYoZDx1JiZ0X3NsZHNfZmFkZUluKHksMzAwKSxFPHUmJmQ+MCYmKF89PUUtbysxfHxFPT09bykpe3ZhciBxPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpO3EuaW5pdEV2ZW50KCJmZWVkc0xhc3RTbGlkZSIsITAsITApLGkuZGlzcGF0Y2hFdmVudChxKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmZWVkc0xvYWRTbGlkZSIsKGZ1bmN0aW9uKCl7dF9zbGRzX3VwZGF0ZVNsaWRlcih0KSwiZnVuY3Rpb24iPT10eXBlb2YgdF9hbmltYXRlX19zdGFydEFuaW1hdGlvbiYmdF9hbmltYXRlX19zdGFydEFuaW1hdGlvbigpfSkpLHRfc2xkc19mYWRlSW4oeSwzMDApfWVsc2UgRT09PXUmJl89PT11LWQrMSYmdF9zbGRzX2ZhZGVPdXQoeSwzMDApfWVsc2UiZmFsc2UiPT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpJiYoXz09dXx8ZD4xJiZfPT11LWQrMSk/dF9zbGRzX2ZhZGVPdXQoeSwzMDApOnRfc2xkc19mYWRlSW4oeSwzMDApO3YmJigiZmFsc2UiPT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpJiYxPT1fP3Rfc2xkc19mYWRlT3V0KHYsMzAwKTp0X3NsZHNfZmFkZUluKHYsMzAwKSksaS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQiKSxiPj0xMyYmQSYmIWY/dF9zbGlkZV9Nb3ZlQW5pbWF0aW9uKGksXyxuLGMpOmkuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKC0iK24qXysicHgpIix0X3RyaWdnZXJFdmVudChpLCJzbGlkZUNoYW5nZVN0YXJ0Iiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZCIpLGkuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1hbmltYXRlZCIsIiIpLCJ5ZXMiPT0ocD1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiKSkmJihfPT11KzEmJihfPTEpLDA9PV8mJihfPXUpLGI+PTEzJiZBJiYhZj90X3NsaWRlX01vdmVBbmltYXRpb24oaSxfLG4sMCk6aS5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoLSIrbipfKyJweCkiLCEwIT09ZiYmdF9zbGRzX0FjdGl2ZVNsaWRlKHQsXyx1LHMpLGkuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLF8pKSwoInkiPT09d2luZG93Lmxhenl8fGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhbGxyZWNvcmRzIikmJiJ5ZXMiPT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FsbHJlY29yZHMiKS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpKSYmdF9zbGRzX29uSGFtbWVyTG9hZCgidF9sYXp5bG9hZF91cGRhdGUiLChmdW5jdGlvbigpe3RfbGF6eWxvYWRfdXBkYXRlKCl9KSksIWUmJm0mJnRfc2xkc19pbml0QXV0b1BsYXkodCxfLHUscyl9KSxjKSx0X3NsZHNfQWN0aXZlQnVsbGV0KHQsXyx1LHMpLHRfc2xkc19BY3RpdmVTbGlkZSh0LF8sdSksInRydWUiPT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQiKSYmdF9zbGRzX1NsaWRlckhlaWdodCh0KSx0X3NsZHNfU2xpZGVyQXJyb3dzSGVpZ2h0KHQpLHRfc2xkc19BY3RpdmVDYXB0aW9uKHQsXyx1KSxyLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW0tbG9hZGVkIikubGVuZ3RoPHUrMiYmdF9zbGRzX1VwZGF0ZUltYWdlcyh0LF8pLHRfdHJpZ2dlckV2ZW50KGksInNsaWRlQ2hhbmdlRW5kIil9fX19ZnVuY3Rpb24gdF9zbGRzX3VwZGF0ZVNsaWRlcih0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt0X3NsZHNfU2xpZGVyV2lkdGgodCk7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYocyl7dmFyIHI9cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLDEwKXx8MSxpPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIC50LXNsZHNfX2l0ZW0iKSxhPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIiksbD1yPjAmJmEmJmk/aS5vZmZzZXRXaWR0aDphLm9mZnNldFdpZHRoLGQ9cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpLDEwKSxvPXBhcnNlSW50KHMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpLDEwKSxuPXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIiksYz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93X3dyYXBwZXItcmlnaHQiKTtpZihkPm8rMSYmKGQ9MSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIiwxKSksYyYmImZhbHNlIj09PW4pe3ZhciBfLHU9by1yPD0wfHxkK3ItMT09PW87Yy5zdHlsZS5kaXNwbGF5PXU/Im5vbmUiOiIifXMuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKC0iK2wqZCsicHgpIiwidHJ1ZSI9PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodCIpJiZ0X3NsZHNfVXBkYXRlU2xpZGVySGVpZ2h0KHQpLHRfc2xkc19VcGRhdGVTbGlkZXJBcnJvd3NIZWlnaHQodCksInkiPT09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iKSYmcy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iLCIiKX19fWZ1bmN0aW9uIHRfc2xkc19VcGRhdGVJbWFnZXModCxlKXt2YXIgcz10X3NsZHNfX2dldFJlYyh0KTtpZihzKXt2YXIgcj1zLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1bZGF0YS1zbGlkZS1pbmRleD0iJytlKyciXScpO3ImJihyLmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbS1sb2FkZWQiKSxyLm5leHRFbGVtZW50U2libGluZyYmci5uZXh0RWxlbWVudFNpYmxpbmcuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtLWxvYWRlZCIpLHIucHJldmlvdXNFbGVtZW50U2libGluZyYmci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbS1sb2FkZWQiKSl9fWZ1bmN0aW9uIHRfc2xkc19BY3RpdmVDYXB0aW9uKHQsZSxzKXt2YXIgcj10X3NsZHNfX2dldFJlYyh0KTtpZihyKXt2YXIgaT1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2NhcHRpb24iKSxhPXIucXVlcnlTZWxlY3RvcignLnQtc2xkc19fY2FwdGlvbltkYXRhLXNsaWRlLWNhcHRpb249IicrZSsnIl0nKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX19jYXB0aW9uLWFjdGl2ZSIpfSkpLDA9PWU/YT1yLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2NhcHRpb25bZGF0YS1zbGlkZS1jYXB0aW9uPSInK3MrJyJdJyk6ZT09cysxJiYoYT1yLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2NhcHRpb25bZGF0YS1zbGlkZS1jYXB0aW9uPSIxIl0nKSksYSYmYS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2NhcHRpb24tYWN0aXZlIil9fWZ1bmN0aW9uIHRfc2xkc19zY3JvbGxJbWFnZXModCxlKXt2YXIgcz10X3NsZHNfX2dldFJlYyh0KTtpZihzKXt2YXIgcj0oZTwwPyIiOiItIikrTWF0aC5hYnMoZSkudG9TdHJpbmcoKTtzLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKS5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoIityKyJweCkifX1mdW5jdGlvbiB0X3NsZHNfQWN0aXZlQnVsbGV0KHQsZSxzLHIpe3ZhciBpO2lmKHImJnIudGh1bWJzYnVsbGV0R2FsbGVyeSl7dmFyIGE9cGFyc2VJbnQoci5zdG9yZU9wdGlvbnMucG9wdXBfb3B0cy5jb2x1bW5zKSxsPStyLnN0b3JlT3B0aW9ucy5zbGlkZXJfc2xpZGVzT3B0cy5yYXRpbzsidF9zdG9yZV9wcm9kUG9wdXBfZ2FsbGVyeV9jYWxjTWF4VGh1bWJzQ291bnQiaW4gd2luZG93P2k9dF9zdG9yZV9wcm9kUG9wdXBfZ2FsbGVyeV9jYWxjTWF4VGh1bWJzQ291bnQoYSxsLDYwLDEwKToidF9jYXRhbG9nX3Byb2RQb3B1cF9nYWxsZXJ5X2NhbGNNYXhUaHVtYnNDb3VudCJpbiB3aW5kb3cmJihpPXRfY2F0YWxvZ19wcm9kUG9wdXBfZ2FsbGVyeV9jYWxjTWF4VGh1bWJzQ291bnQoYSxsLDYwLDEwKSl9dmFyIGQ9dF9zbGRzX19nZXRSZWModCk7aWYoZCl7dmFyIG89ZC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19idWxsZXQiKSxuPWQucXVlcnlTZWxlY3RvcignLnQtc2xkc19fYnVsbGV0W2RhdGEtc2xpZGUtYnVsbGV0LWZvcj0iJytlKyciXScpO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfX2J1bGxldF9hY3RpdmUiKTt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2J1bGxldF9ib2R5Iik7ZSYmZS5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtY3VycmVudCIpfSkpLHImJnIudGh1bWJzYnVsbGV0R2FsbGVyeSYmZT49aSYmZSE9cysxfHxzPj1pJiYwPT1lP249ZC5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19idWxsZXRbZGF0YS1zbGlkZS1idWxsZXQtZm9yPSInK2krJyJdJyk6MD09ZT9uPWQucXVlcnlTZWxlY3RvcignLnQtc2xkc19fYnVsbGV0W2RhdGEtc2xpZGUtYnVsbGV0LWZvcj0iJytzKyciXScpOmU9PXMrMSYmKG49ZC5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19idWxsZXRbZGF0YS1zbGlkZS1idWxsZXQtZm9yPSIxIl0nKSksbil7bi5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2J1bGxldF9hY3RpdmUiKTt2YXIgYz1uLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2J1bGxldF9ib2R5Iik7YyYmYy5zZXRBdHRyaWJ1dGUoImFyaWEtY3VycmVudCIsITApfX19ZnVuY3Rpb24gdF9zbGRzX0FjdGl2ZVNsaWRlKHQsZSxzKXt2YXIgcj10X3NsZHNfX2dldFJlYyh0KTtpZihyKXt2YXIgaT1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxhPXIucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbSIpLGw9ci5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IicrZSsnIl0nKSxkPSEhaSYmaS5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xkc19hbmltYXRlZC1ub25lIiksbz1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXZpZGVvLWxhenlsb2FkIik7aWYoby5sZW5ndGgpdF9vbkZ1bmNMb2FkKCJ0X3ZpZGVvX19nZXRQbGF5ZXIiLChmdW5jdGlvbigpe28uZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU7aWYoImZhbHNlIiE9PXQuZ2V0QXR0cmlidXRlKCJkYXRhLXZpZGVvbGF6eS1sb2FkIikpe3ZhciBzPXQuY2xvc2VzdCgiLnQtc2xkc19faXRlbTpub3QoLnQtc2xkc19faXRlbV9kdW1teSkiKTtpZihzKXt2YXIgcj10X3ZpZGVvX19nZXRQbGF5ZXIocyk7cj9yLnBhdXNlKCk6dF9zbGRzX19wcm9jY2Vzc1ZpZGVvKHMpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiB0LnBhdXNlKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpfX19KSl9KSk7ZWxzZXt2YXIgbj1yLnF1ZXJ5U2VsZWN0b3JBbGwoImlmcmFtZSIpLGM9ci5xdWVyeVNlbGVjdG9yQWxsKCJ2aWRlbyIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zcmMmJigtMSE9PXQuc3JjLmluZGV4T2YoIiZlbmFibGVqc2FwaT0xIikmJnQuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgneyJldmVudCI6ImNvbW1hbmQiLCJmdW5jIjoicGF1c2VWaWRlbyIsImFyZ3MiOiIifScsIioiKSwtMT09PXQuc3JjLmluZGV4T2YoInZpbWVvIil8fC0xPT09dC5zcmMuaW5kZXhPZigiJmFtcDthcGk9MSIpJiYtMT09PXQuc3JjLmluZGV4T2YoIiZhcGk9MSIpfHx0LmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoJ3sibWV0aG9kIjoicGF1c2UiLCJ2YWx1ZSI6InRydWUifScsIioiKSl9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLChmdW5jdGlvbih0KXt0LnBhdXNlKCl9KSl9aWYoQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19faXRlbV9hY3RpdmUiKSx0LnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIil9KSksMD09ZSYmITE9PT1kKXIucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSInK3MrJyJdJykuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtX2FjdGl2ZSIpLHIuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsImZhbHNlIik7ZWxzZSBpZigwPT1lJiYhMD09PWQpbD1yLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1bZGF0YS1zbGlkZS1pbmRleD0iJytzKyciXScpO2Vsc2UgaWYoZT09cysxJiYhMT09PWQpe3ZhciBfPXIucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSIxIl0nKTtfJiYoXy5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIiksXy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwiZmFsc2UiKSl9ZWxzZSBlPT1zKzEmJiEwPT09ZCYmKGw9ci5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IjEiXScpKTtsJiYobC5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIiksbC5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwiZmFsc2UiKSksd2luZG93LnRfc2xkc19faXNpT1MmJnRfc2xkc19faGlkZU1vYmlsZVNsaWRlcyhsKSx0X3NsZHNfX3NldFRhYmluZGV4Rm9yRm9jdXNhYmxlRWxlbWVudHModCl9fWZ1bmN0aW9uIHRfc2xkc19fc2V0VGFiaW5kZXhGb3JGb2N1c2FibGVFbGVtZW50cyh0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxyPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbV9hY3RpdmUiKTtpZihyKXt2YXIgaT0nYSwgYnV0dG9uLCBpbnB1dDpub3QoW3R5cGU9ImhpZGRlbiJdKSwgc2VsZWN0LCB0ZXh0YXJlYSwgdmlkZW8sIGlmcmFtZScsYT1zLnF1ZXJ5U2VsZWN0b3JBbGwoaSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLChmdW5jdGlvbih0KXt0LnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCItMSIpfSkpO3ZhciBsPXIucXVlcnlTZWxlY3RvckFsbChpKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGwsKGZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIjAiKX0pKX19fWZ1bmN0aW9uIHRfc2xkc19TbGlkZXJXaWR0aCh0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciIpO2lmKHMpe3ZhciByPWdldENvbXB1dGVkU3R5bGUocyksaT1wYXJzZUludChyLnBhZGRpbmdMZWZ0KXx8MCxhPXBhcnNlSW50KHIucGFkZGluZ1JpZ2h0KXx8MCxsPXMuY2xpZW50V2lkdGgtKGkrYSksZD1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIikubGVuZ3RoLG89ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksbjtpZigidHJ1ZSIhPW8uZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wIikpe3ZhciBjPTA7byYmKGM9by5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLG8uc3R5bGUud2lkdGg9bCpkKyJweCIpLHdpbmRvdy5pbm5lcldpZHRoPD02NDA/Yz0xOndpbmRvdy5pbm5lcldpZHRoPD05NjAmJmM+MSYmKGM9Mik7dmFyIF89Yz4xP2wvYzpsO2lmKF8+MCl7dmFyIHU9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtIik7byYmKHU9by5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtIikpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodSwoZnVuY3Rpb24odCl7dC5zdHlsZS53aWR0aD1fKyJweCJ9KSl9fX19fWZ1bmN0aW9uIHRfc2xkc19TbGlkZXJIZWlnaHQodCl7dmFyIGU9dF9zbGRzX19nZXRSZWModCk7aWYoZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtcy13cmFwcGVyOm5vdChbZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQ9ImZhbHNlIl0pJyk7aWYocyl7dmFyIHI9cy5jbGFzc0xpc3QuY29udGFpbnMoImpzLWZlZWQtY29udGFpbmVyIiksaT1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIiksYTtpZihpKXt2YXIgbD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGkpLnBhZGRpbmdUb3ApfHwwLGQ9cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5wYWRkaW5nQm90dG9tKXx8MDthPWkuY2xpZW50SGVpZ2h0LShsK2QpfWEmJnMmJihzLnN0eWxlLmhlaWdodD1yPyIiOmErInB4Iil9fX1mdW5jdGlvbiB0X3NsZHNfVXBkYXRlU2xpZGVySGVpZ2h0KHQpe3ZhciBlPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGUpe3ZhciBzPWUucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbXMtd3JhcHBlcjpub3QoW2RhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0PSJmYWxzZSJdKScpO2lmKHMpe3ZhciByPXMuY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1mZWVkLWNvbnRhaW5lciIpLGk9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpLGE7aWYoaSl7dmFyIGw9cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5wYWRkaW5nVG9wKXx8MCxkPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoaSkucGFkZGluZ0JvdHRvbSl8fDA7YT1pLmNsaWVudEhlaWdodC0obCtkKX0wIT09YSYmcyYmKHMuc3R5bGUuaGVpZ2h0PXI/IiI6YSsicHgiKX19fWZ1bmN0aW9uIHRfc2xkc19TbGlkZXJBcnJvd3NIZWlnaHQodCl7dmFyIGU9dF9zbGRzX19nZXRSZWModCk7aWYoZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpLHI9L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGksYT0wO2lmKHMpe3ZhciBsO3MucXVlcnlTZWxlY3RvcigiW2RhdGEtc2xpZGVyLXZpZGVvLXR5cGVdIikmJnImJihhPTQwKTt2YXIgZD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHMpLnBhZGRpbmdUb3ApfHwwLG89cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShzKS5wYWRkaW5nQm90dG9tKXx8MDtpPXMuY2xpZW50SGVpZ2h0LShkK28pLWF9dmFyIG49ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd193cmFwcGVyIik7aSYmbi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zdHlsZS5oZWlnaHQ9aSsicHgiO3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ciKTtlJiYoZS5zdHlsZS5tYXJnaW5Ub3A9YS8yKyJweCIpfSkpLHRfc2xkc19maXhBcnJvd3NJbkNhdGFsb2coZSxzLG4scil9fWZ1bmN0aW9uIHRfc2xkc19VcGRhdGVTbGlkZXJBcnJvd3NIZWlnaHQodCl7dmFyIGU9dF9zbGRzX19nZXRSZWModCk7aWYoZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpLHI9L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGksYT0wO2lmKHMpe3ZhciBsO3MucXVlcnlTZWxlY3RvcigiW2RhdGEtc2xpZGVyLXZpZGVvLXR5cGVdIikmJnImJihhPTQwKTt2YXIgZD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHMpLnBhZGRpbmdUb3ApfHwwLG89cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShzKS5wYWRkaW5nQm90dG9tKXx8MDtpPXMuY2xpZW50SGVpZ2h0LShkK28pLWF9dmFyIG49ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd193cmFwcGVyIik7aSYmbi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zdHlsZS5oZWlnaHQ9aSsicHgiO3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ciKTtlJiYoZS5zdHlsZS5tYXJnaW5Ub3A9YS8yKyJweCIpfSkpLHRfc2xkc19maXhBcnJvd3NJbkNhdGFsb2coZSxzLG4scil9fWZ1bmN0aW9uIHRfc2xkc19maXhBcnJvd3NJbkNhdGFsb2codCxlLHMscil7aWYoZSYmciYmKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWNhdGFsb2dfX3JlbGV2YW50cy1ncmlkLWNvbnQiKXx8dC5jbGFzc0xpc3QuY29udGFpbnMoInQtc3RvcmVfX3JlbGV2YW50cy1ncmlkLWNvbnQiKSkpe3ZhciBpPWUucXVlcnlTZWxlY3RvcigiLmpzLXByb2R1Y3QtaW1nIik7aWYoaSl7dmFyIGE9d2luZG93LmdldENvbXB1dGVkU3R5bGUoaSksbD0ocGFyc2VGbG9hdChhLm1hcmdpblRvcCl8fDApKyhwYXJzZUZsb2F0KGEubWFyZ2luQm90dG9tKXx8MCksZD1NYXRoLmNlaWwoaS5vZmZzZXRIZWlnaHQrbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzLChmdW5jdGlvbih0KXt2YXIgZT10Lm9mZnNldEhlaWdodCxzPShkLWUpLzI7dC5zdHlsZS50b3A9cysicHgiLHQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVZKDApIn0pKX19fWZ1bmN0aW9uIHRfc2xkc19pbml0QXV0b1BsYXkodCxlLHMscil7dmFyIGk9Im9iamVjdCI9PXR5cGVvZiB0LGE9aT90WzBdOmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyZWMiK3QpO2lmKGEpe3ZhciBsPWEucXVlcnlTZWxlY3RvcigiLnQtc2xkcyIpLGQ9YS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYoZCl7dmFyIG89cGFyc2VGbG9hdChkLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdGltZW91dCIpKSxuPSIiLGM9ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWludGVydmFsLWlkIiksXz1lLHU7aWYoYyYmY2xlYXJJbnRlcnZhbChjKSwidHJ1ZSIhPT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcCIpKXt2YXIgcDshL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZsJiYobC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLChmdW5jdGlvbigpe2Quc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwieWVzIil9KSksbC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsKGZ1bmN0aW9uKCl7InkiIT09ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iKSYmZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCIiKX0pKSk7dmFyIGY9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LG09ZithLm9mZnNldEhlaWdodCx5LHY7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtmPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldCxtPWYrYS5vZmZzZXRIZWlnaHR9KSkpLHZvaWQgMCE9PWRvY3VtZW50LmhpZGRlbj8oeT0iaGlkZGVuIix2PSJ2aXNpYmlsaXR5Y2hhbmdlIik6dm9pZCAwIT09ZG9jdW1lbnQubXNIaWRkZW4/KHk9Im1zSGlkZGVuIix2PSJtc3Zpc2liaWxpdHljaGFuZ2UiKTp2b2lkIDAhPT1kb2N1bWVudC53ZWJraXRIaWRkZW4mJih5PSJ3ZWJraXRIaWRkZW4iLHY9IndlYmtpdHZpc2liaWxpdHljaGFuZ2UiKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHYsKGZ1bmN0aW9uKCl7aWYoZG9jdW1lbnRbeV0pZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCJ5ZXMiKTtlbHNle3ZhciB0PWdldENvbXB1dGVkU3R5bGUoYSkuZGlzcGxheSxlPXdpbmRvdy5wYWdlWU9mZnNldCxzPWUrd2luZG93LmlubmVySGVpZ2h0O2Y9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LChtPWYrYS5vZmZzZXRIZWlnaHQpPmUmJmY8cyYmIm5vbmUiIT09dCYmInkiIT09ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iKSYmZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCIiKX19KSwhMSksMT09PWEubGVuZ3RoJiZ3aW5kb3cuYmluZCgic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3ZhciB0PWdldENvbXB1dGVkU3R5bGUoYSkuZGlzcGxheSxlPXdpbmRvdy5wYWdlWU9mZnNldCxzPWUrd2luZG93LmlubmVySGVpZ2h0OyJub25lIiE9PXQ/KGY9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LChtPWYrYS5vZmZzZXRIZWlnaHQpPmUmJmY8cyYmInkiIT09ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iKT9kLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZCIsIiIpOiIiPT09ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiKSYmZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCJ5ZXMiKSk6aXx8ZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCJ5ZXMiKX0pKSk7dmFyIGc9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7dmFyIGU9ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiKSxpPWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1hdXRvcGxheS1pZ25vcmUtaG92ZXIiKSxsPWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3VjaCIpLG89dF9zbGRzX2dldEN1cnJlbnRUcmFuc2xhdGUoYSk7InllcyIhPWUmJiJ5ZXMiIT1pJiYieWVzIiE9bCYmKCJmYWxzZSI9PWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikmJl89PXM/Xz1zOl8rKyxkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixfKSxfIT1zKzEmJjAhPV98fChuPSJ5ZXMiKSx0X3NsaWRlTW92ZVdpdGhvdXRBbmltYXRpb24odCwhMCxyLG8pLHRfc2xkc191cGRhdGVTbGlkZXIodCksInllcyI9PW4mJihfPT1zKzEmJihfPTEpLDA9PV8mJihfPXMpLGQuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLF8pKSxkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiLG4pKX0pLG8pO2Quc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pbnRlcnZhbC1pZCIsZyl9fX19ZnVuY3Rpb24gdF9zbGRzX3Bvc2l0aW9uQXJyb3dzKHQpe3ZhciBlPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGUpe3ZhciBzPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3dfY29udGFpbmVyLW91dHNpZGUiKSxyPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbSIpO2lmKHIpe3ZhciBpPXIub2Zmc2V0V2lkdGgsYT1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93LWxlZnQiKT9lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93LWxlZnQiKS5vZmZzZXRXaWR0aDowLGw9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1yaWdodCIpP2UucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ctcmlnaHQiKS5vZmZzZXRXaWR0aDowO3MmJihzLnN0eWxlLm1heFdpZHRoPWErbCtpKzEyMCsicHgiKX19fWZ1bmN0aW9uIHRfc2xkc19pbml0U2xpZGVyU3dpcGUodCxlLHMscil7dmFyIGk9dF9zbGRzX19nZXRSZWModCk7aWYoaSl7dmFyIGE9aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19tYWluIik7aWYoYSl7dmFyIGw9aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYobCl7dmFyIGQsbz0hMSxuPSExLGMsXztpZigidHJ1ZSIhPT1sLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcCIpKWlmKCJ0cnVlIiE9PWwuZ2V0QXR0cmlidXRlKCJkYXRhLXN3aXBlci1pbml0aWFsaXplZCIpKXtkZWxldGUgSGFtbWVyLmRlZmF1bHRzLmNzc1Byb3BzLnVzZXJTZWxlY3Qsd2luZG93LmhhbW1lcj1uZXcgSGFtbWVyKGEse2RvbUV2ZW50czohMCxpbnB1dENsYXNzOkhhbW1lci5Ub3VjaElucHV0LHJlY29nbml6ZXJzOltbSGFtbWVyLlBhbix7ZGlyZWN0aW9uOkhhbW1lci5ESVJFQ1RJT05fSE9SSVpPTlRBTH1dXX0pLGwuc2V0QXR0cmlidXRlKCJkYXRhLXN3aXBlci1pbml0aWFsaXplZCIsInRydWUiKTt2YXIgdT1mdW5jdGlvbiB0KGUpe3dpbmRvdy5wYWdlWU9mZnNldD5pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSt3aW5kb3cucGFnZVlPZmZzZXR8fHdpbmRvdy5wYWdlWU9mZnNldCtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0PGkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldD9sLnNldEF0dHJpYnV0ZShlLCJ5ZXMiKToieSIhPT1sLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZC1ieS12aWRlbyIpJiZsLnNldEF0dHJpYnV0ZShlLCIiKX0scD0ib250b3VjaGVuZCJpbiBkb2N1bWVudD8iZGF0YS1zbGlkZXItdG91Y2giOiJkYXRhLXNsaWRlci1zdG9wcGVkIixmO2lmKCJJbnRlcnNlY3Rpb25PYnNlcnZlciJpbiB3aW5kb3cpbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChmdW5jdGlvbih0KXt2YXIgZT10WzBdO2wuc2V0QXR0cmlidXRlKHAsZS5pc0ludGVyc2VjdGluZz8iIjoieWVzIil9KSkub2JzZXJ2ZShpKTtlbHNlIHUocCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsKGZ1bmN0aW9uKCl7bz0hMCxjbGVhclRpbWVvdXQoZCksZD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3UocCksbz0hMX0pLDI1MCl9KSk7aWYoMSE9ZSl7dmFyIG09ZnVuY3Rpb24gdChlKXtyZXR1cm4hbnx8KGUucHJldmVudERlZmF1bHQoKSwhMSl9LHk9aS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2VsZW0iKSx2PXRfc2xkc19nZXRFdmVudHNGb3JaZXJvQmxvY2soKSxnPXYubW92ZVNsaWRlU3RhcnRFdmVudCxiPXYubW92ZVNsaWRlRW5kRXZlbnQ7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsbSx7cGFzc2l2ZTohMX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLG0se3Bhc3NpdmU6ITF9KSx3aW5kb3cuaGFtbWVyLm9uKCJwYW4iLChmdW5jdGlvbihlKXtpZihvKXJldHVybiExO249ITAseSYmaS5kaXNwYXRjaEV2ZW50KGcpO3ZhciBzPWkucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGE9cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpfHwwLGw9YT4xLGQ9bD9pLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciAudC1zbGRzX19pdGVtIikub2Zmc2V0V2lkdGg6aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIiKS5vZmZzZXRXaWR0aCxjPXBhcnNlRmxvYXQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpKSxfPXBhcnNlRmxvYXQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIikpLHU9IiIscD1lLmRlbHRhWCxmPTEwMC9fKmUuZGVsdGFYL3dpbmRvdy5pbm5lcldpZHRoLG09MzAsdjtpZigidHJ1ZSI9PT1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcCIpKXJldHVybiExO2lmKHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3VjaCIsInllcyIpLHRfc2xkc19zY3JvbGxJbWFnZXModCxkKmMtcCksZS5pc0ZpbmFsKXtpZihlLnZlbG9jaXR5WD4uNCkiZmFsc2UiPT1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpJiYxPT1jP2M9MTpjLS0scy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsYyksMD09YyYmKHU9InllcyIpLHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIsdSksdF9zbGlkZU1vdmUodCwhMSxyKTtlbHNlIGlmKGUudmVsb2NpdHlYPC0uNCl7aWYoImZhbHNlIj09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSYmKGM9PV98fGwmJmM9PV8tYSsxKSljPWw/Xy1hOl87ZWxzZXt2YXIgYj1pLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIiksaD1iW2IubGVuZ3RoLTFdLEE9cGFyc2VGbG9hdChoLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIpLDEwKTtpZihBPF8mJmM9PUEpe3ZhciBTPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpO1MuaW5pdEV2ZW50KCJmZWVkc0xhc3RTbGlkZSIsITAsITApLHMuZGlzcGF0Y2hFdmVudChTKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmZWVkc0xvYWRTbGlkZSIsKGZ1bmN0aW9uKCl7dF9zbGRzX3VwZGF0ZVNsaWRlcih0KX0pKX1jKyt9cy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsYyksYz09XysxJiYodT0ieWVzIikscy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIix1KSx0X3NsaWRlTW92ZSh0LCExLHIpfWVsc2UgZjw9LTMwL18/KCJmYWxzZSI9PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikmJihjPT1ffHxsJiZjPT1fLWErMSk/Yz1sP18tYTpfOmMrKyxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixjKSxjPT1fKzEmJih1PSJ5ZXMiKSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiLHUpLHRfc2xpZGVNb3ZlKHQsITEscikpOmY+PW0vXz8oImZhbHNlIj09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSYmMT09Yz9jPTE6Yy0tLHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLGMpLDA9PWMmJih1PSJ5ZXMiKSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiLHUpLHRfc2xpZGVNb3ZlKHQsITEscikpOnRfc2xpZGVNb3ZlKHQsITEscik7cy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdWNoIiwiIiksbj0hMX1yZXR1cm4hMH0pKSx3aW5kb3cuaGFtbWVyLm9uKCJwYW5lbmQiLChmdW5jdGlvbigpe3kmJmkuZGlzcGF0Y2hFdmVudChiKSx0X3NsaWRlTW92ZSh0LCExLHIpLG49ITF9KSl9fX19fX1mdW5jdGlvbiB0X3NsZHNfZ2V0Q3VycmVudFRyYW5zbGF0ZSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihlKXt2YXIgcz1nZXRDb21wdXRlZFN0eWxlKGUpLnRyYW5zZm9ybTtpZih2b2lkIDAhPT1zJiYiIiE9PXMpe3ZhciByPXMubWF0Y2goL1xkKy9nKTtpZihudWxsIT09cilyZXR1cm4gcGFyc2VJbnQoclswXSwxMCl9fX1mdW5jdGlvbiB0X3NsZHNfY2hhbmdlSW1hZ2VVcmwodCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxzPWUmJiJ5ZXMiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpLHI9dF9zbGRzX19nZXRSZWModCksaTtyJiYoaT1zP3IucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faW1nOm5vdChbZGF0YS1vcmlnaW5hbF0pIik6ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pbWciKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNyYyIpO2UmJih0LnNldEF0dHJpYnV0ZSgic3JjIixlKSx0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1zcmMiKSl9KSkpfWZ1bmN0aW9uIHRfc2xkc19vbkhhbW1lckxvYWQodCxlLHMpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3dbdF0pZSgpO2Vsc2UgdmFyIHI9RGF0ZS5ub3coKSxpPXNldFRpbWVvdXQoKGZ1bmN0aW9uIGEoKXt2YXIgbD1EYXRlLm5vdygpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB3aW5kb3dbdF0pe2lmKGwtcj43ZTMpdGhyb3cgbmV3IEVycm9yKHQrIiBpcyB1bmRlZmluZWQiKTtpPXNldFRpbWVvdXQoYSxzfHwxMDApfWVsc2UgZSgpfSkpfWZ1bmN0aW9uIHRfc2xkc19mYWRlT3V0KHQsZSxzKXtpZigibm9uZSIhPT10LnN0eWxlLmRpc3BsYXkmJiF0LmdldEF0dHJpYnV0ZSgiZGF0YS1mYWRlb3V0LXRpbWVvdXQiKSl7dmFyIHI9MSxpPXBhcnNlSW50KGUpLGEsbD1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXt0LnN0eWxlLm9wYWNpdHk9ciwoci09LjEpPD0uMSYmKGNsZWFySW50ZXJ2YWwobCksdC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtZmFkZW91dC10aW1lb3V0IiksdC5zdHlsZS5kaXNwbGF5PSJub25lIiwiZnVuY3Rpb24iPT10eXBlb2YgcyYmcygpKX0pLGk+MD9pLzEwOjQwKTt0LnNldEF0dHJpYnV0ZSgiZGF0YS1mYWRlb3V0LXRpbWVvdXQiLGwpfX1mdW5jdGlvbiB0X3NsZHNfZmFkZUluKHQsZSxzKXtpZigoIjEiIT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS5vcGFjaXR5JiYiIiE9PWdldENvbXB1dGVkU3R5bGUodCkub3BhY2l0eXx8Im5vbmUiPT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS5kaXNwbGF5KSYmIXQuZ2V0QXR0cmlidXRlKCJkYXRhLWZhZGVpbi10aW1lb3V0Iikpe3ZhciByPTAsaT1wYXJzZUludChlKSxhPWk+MD9pLzEwOjQwO3Quc3R5bGUub3BhY2l0eT1yLHQuc3R5bGUuZGlzcGxheT0iYmxvY2siO3ZhciBsPXNldEludGVydmFsKChmdW5jdGlvbigpe3Quc3R5bGUub3BhY2l0eT1yLChyKz0uMSk+PTEmJihjbGVhckludGVydmFsKGwpLHQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLWZhZGVpbi10aW1lb3V0IiksImZ1bmN0aW9uIj09dHlwZW9mIHMmJnMoKSl9KSxhKTt0LnNldEF0dHJpYnV0ZSgiZGF0YS1mYWRlaW4tdGltZW91dCIsbCl9fWZ1bmN0aW9uIHRfc2xkc19yYW5kb21Tb3J0RWxlbWVudHModCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCk7aWYoIWUubGVuZ3RoKXJldHVybltdO2Uuc29ydCgoZnVuY3Rpb24oKXtyZXR1cm4uNS1NYXRoLnJhbmRvbSgpfSkpO3ZhciBzPXRbMF0ucGFyZW50Tm9kZTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbih0KXtzLmFwcGVuZENoaWxkKHQpfSkpLGV9ZnVuY3Rpb24gdF9zbGRzX19wcm9jY2Vzc1ZpZGVvKHQpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxzKXt0X29uRnVuY0xvYWQoInRfdmlkZW9fX2NyZWF0ZVBsYXllciIsKGZ1bmN0aW9uKCl7dF92aWRlb19fY3JlYXRlUGxheWVyKHQpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfSkpLmNhdGNoKChmdW5jdGlvbih0KXtyZXR1cm4gcyh0KX0pKX0pKX0pKX1mdW5jdGlvbiB0X3NsZHNfZ2V0RXZlbnRzRm9yWmVyb0Jsb2NrKCl7dmFyIHQsZTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50Pyh0PW5ldyBDdXN0b21FdmVudCgidGlsZGFTbGRzTW92ZVNsaWRlU3RhcnQiKSxlPW5ldyBDdXN0b21FdmVudCgidGlsZGFTbGRzTW92ZVNsaWRlRW5kIikpOigodD1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSkuaW5pdEN1c3RvbUV2ZW50KCJ0aWxkYVNsZHNNb3ZlU2xpZGVTdGFydCIsITAsITApLChlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpKS5pbml0Q3VzdG9tRXZlbnQoInRpbGRhU2xkc01vdmVTbGlkZUVuZCIsITAsITApKSx7bW92ZVNsaWRlU3RhcnRFdmVudDp0LG1vdmVTbGlkZUVuZEV2ZW50OmV9fWZ1bmN0aW9uIHRfc2xkc19fZ2V0UmVjKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmVjIit0KTp0IGluc3RhbmNlb2YgRWxlbWVudD90OnRbMF19ZnVuY3Rpb24gdF90cmlnZ2VyRXZlbnQodCxlKXt2YXIgcztkb2N1bWVudC5jcmVhdGVFdmVudD8ocz1kb2N1bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpKS5pbml0RXZlbnQoZSwhMCwhMSk6ZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QmJigocz1kb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpKS5ldmVudFR5cGU9ZSkscy5ldmVudE5hbWU9ZSx0LmRpc3BhdGNoRXZlbnQ/dC5kaXNwYXRjaEV2ZW50KHMpOnQuZmlyZUV2ZW50P3QuZmlyZUV2ZW50KCJvbiIrcy5ldmVudFR5cGUscyk6dFtlXT90W2VdKCk6dFsib24iK2VdJiZ0WyJvbiIrZV0oKX13aW5kb3cudF9zbGRzX19pc2lPUz0vaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTWFjaW50b3NoIikmJiJvbnRvdWNoZW5kImluIGRvY3VtZW50O3ZhciBERUJVRz0hMTtmdW5jdGlvbiBzZXRJbXBvcnRhbnRTdHlsZSh0LGUscyl7dC5zdHlsZS5zZXRQcm9wZXJ0eShlLHMsImltcG9ydGFudCIpfWZ1bmN0aW9uIGdldEdhbGxlcnlDb250YWluZXIoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cCIpO2lmKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtY2F0YWxvZ19fcmVsZXZhbnRzX19jb250YWluZXIsIC50LXN0b3JlX19yZWxldmFudHNfX2NvbnRhaW5lciIpO2lmKGUpcmV0dXJuIGV9cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhdGFsb2dfX3JlbGV2YW50c19fY29udGFpbmVyLCAudC1zdG9yZV9fcmVsZXZhbnRzX19jb250YWluZXIiKX1mdW5jdGlvbiBhcHBseUJhc2VTdHlsZXModCl7Zm9yKHZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QiKSxzPTA7czxlLmxlbmd0aDtzKyspZm9yKHZhciByLGk9ZVtzXS5xdWVyeVNlbGVjdG9yQWxsKCIudC1jYXRhbG9nX19jYXJkX190ZXh0d3JhcHBlciwgLnQtc3RvcmVfX2NhcmRfX3RleHR3cmFwcGVyIiksYT0wO2E8aS5sZW5ndGg7YSsrKXt2YXIgbD1pW2FdO3NldEltcG9ydGFudFN0eWxlKGwsIm1hcmdpbi1ib3R0b20iLCIwcHgiKSxzZXRJbXBvcnRhbnRTdHlsZShsLCJtYXJnaW4tdG9wIiwiYXV0byIpLHNldEltcG9ydGFudFN0eWxlKGwsImp1c3RpZnktY29udGVudCIsImZsZXgtc3RhcnQiKTt2YXIgZD1sLnF1ZXJ5U2VsZWN0b3IoIi5qcy1jYXRhbG9nLXByb2QtbmFtZSwgLmpzLXN0b3JlLXByb2QtbmFtZSIpO2QmJihzZXRJbXBvcnRhbnRTdHlsZShkLCJkaXNwbGF5IiwiLXdlYmtpdC1ib3giKSxzZXRJbXBvcnRhbnRTdHlsZShkLCItd2Via2l0LWJveC1vcmllbnQiLCJ2ZXJ0aWNhbCIpLHNldEltcG9ydGFudFN0eWxlKGQsIi13ZWJraXQtbGluZS1jbGFtcCIsIjIiKSxzZXRJbXBvcnRhbnRTdHlsZShkLCJvdmVyZmxvdyIsImhpZGRlbiIpLHNldEltcG9ydGFudFN0eWxlKGQsInRleHQtb3ZlcmZsb3ciLCJlbGxpcHNpcyIpLHNldEltcG9ydGFudFN0eWxlKGQsIm1heC1oZWlnaHQiLCJjYWxjKDEuNWVtICogMikiKSxzZXRJbXBvcnRhbnRTdHlsZShkLCJwYWRkaW5nLWJvdHRvbSIsInVuc2V0IikpO3ZhciBvPWwucXVlcnlTZWxlY3RvcigiLmpzLWNhdGFsb2ctcHJvZC1kZXNjciwgLmpzLXN0b3JlLXByb2QtZGVzY3IiKTtvJiYoc2V0SW1wb3J0YW50U3R5bGUobywiZGlzcGxheSIsIi13ZWJraXQtYm94Iiksc2V0SW1wb3J0YW50U3R5bGUobywiLXdlYmtpdC1ib3gtb3JpZW50IiwidmVydGljYWwiKSxzZXRJbXBvcnRhbnRTdHlsZShvLCItd2Via2l0LWxpbmUtY2xhbXAiLCIxIiksc2V0SW1wb3J0YW50U3R5bGUobywib3ZlcmZsb3ciLCJoaWRkZW4iKSxzZXRJbXBvcnRhbnRTdHlsZShvLCJ0ZXh0LW92ZXJmbG93IiwiZWxsaXBzaXMiKSxzZXRJbXBvcnRhbnRTdHlsZShvLCJwYWRkaW5nLWJvdHRvbSIsInVuc2V0IikpfURFQlVHJiZjb25zb2xlLmluZm8oItCR0LDQt9C+0LLRi9C1INGB0YLQuNC70Lgg0L/RgNC40LzQtdC90LXQvdGLLiIpfWZ1bmN0aW9uIGdldFJlZmVyZW5jZUhlaWdodCgpe3ZhciB0PWdldEdhbGxlcnlDb250YWluZXIoKTtpZighdClyZXR1cm4gMDt0Lm9mZnNldEhlaWdodDtmb3IodmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtcHJvZHVjdCIpLHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI9ZVtzXTtpZigibm9uZSIhPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShyKS5kaXNwbGF5JiYwIT09ci5vZmZzZXRIZWlnaHQmJnIucXVlcnlTZWxlY3RvcigiLmpzLXByb2R1Y3QtaW1nIikpe3ZhciBpPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O3JldHVybiBERUJVRyYmY29uc29sZS5pbmZvKCLQntC/0L7RgNC90LDRjyDQutCw0YDRgtC+0YfQutCwINC90LDQudC00LXQvdCwLiDQktGL0YHQvtGC0LA6IixpKSxpfX1yZXR1cm4gREVCVUcmJmNvbnNvbGUuaW5mbygi0J3QtSDQvdCw0LnQtNC10L3QsCDQstC40LTQuNC80LDRjyDQutCw0YDRgtC+0YfQutCwINGBINC40LfQvtCx0YDQsNC20LXQvdC40LXQvC4iKSwwfWZ1bmN0aW9uIHVwZGF0ZU5vSW1hZ2VDYXJkSGVpZ2h0cygpe3JlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24oKXt2YXIgdD1nZXRSZWZlcmVuY2VIZWlnaHQoKTtpZighKHQ8PTApKXt2YXIgZT1nZXRHYWxsZXJ5Q29udGFpbmVyKCk7aWYoZSlmb3IodmFyIHM9ZS5xdWVyeVNlbGVjdG9yQWxsKCIuanMtcHJvZHVjdCIpLHI9MDtyPHMubGVuZ3RoO3IrKyl7dmFyIGk9c1tyXTtpLnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0LWltZyIpP2kuc3R5bGUuaGVpZ2h0PSIiOihpLnN0eWxlLmNzc1RleHQrPSI7IGhlaWdodDogIit0KyJweCAhaW1wb3J0YW50OyIsREVCVUcmJmNvbnNvbGUuaW5mbygi0KPRgdGC0LDQvdC+0LLQu9C10L3QsCDQstGL0YHQvtGC0LAg0LTQu9GPINC60LDRgNGC0L7Rh9C60Lgg0LHQtdC3INC40LfQvtCx0YDQsNC20LXQvdC40Y86Iix0KSl9fX0pKX1mdW5jdGlvbiBhdHRhY2hJbWFnZUxvYWRMaXN0ZW5lcnMoKXt2YXIgdD1nZXRHYWxsZXJ5Q29udGFpbmVyKCk7aWYodClmb3IodmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtcHJvZHVjdC1pbWciKSxzPTA7czxlLmxlbmd0aDtzKyspe3ZhciByPWVbc107ci5jb21wbGV0ZXx8ci5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXtERUJVRyYmY29uc29sZS5pbmZvKCLQmNC30L7QsdGA0LDQttC10L3QuNC1INC30LDQs9GA0YPQt9C40LvQvtGB0YwsINC+0LHQvdC+0LLQu9GP0LXQvCDQstGL0YHQvtGC0YMiKSx1cGRhdGVOb0ltYWdlQ2FyZEhlaWdodHMoKX0pKX19ZnVuY3Rpb24gYWRkRW1wdHlEZXNjclBsYWNlaG9sZGVyKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLmpzLWNhdGFsb2ctcHJvZC1kZXNjci50LWNhdGFsb2dfX2NhcmRfX2Rlc2NyLCAuanMtc3RvcmUtcHJvZC1kZXNjci50LXN0b3JlX19jYXJkX19kZXNjciIpO2lmKGUpe3ZhciBzPWdldENvbXB1dGVkU3R5bGUoZSkscj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCxpPXMucGFkZGluZ1RvcDt0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1wcm9kdWN0IikuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIXQucXVlcnlTZWxlY3RvcigiLmpzLWNhdGFsb2ctcHJvZC1kZXNjci50LWNhdGFsb2dfX2NhcmRfX2Rlc2NyLCAuanMtc3RvcmUtcHJvZC1kZXNjci50LXN0b3JlX19jYXJkX19kZXNjciIpKXt2YXIgcz10LnF1ZXJ5U2VsZWN0b3IoIi50LWNhdGFsb2dfX2NhcmRfX3RleHR3cmFwcGVyLCAudC1zdG9yZV9fY2FyZF9fdGV4dHdyYXBwZXIiKSxhPXMmJnMucXVlcnlTZWxlY3RvcigiLmpzLWNhdGFsb2ctcHJpY2Utd3JhcHBlciwgLmpzLXN0b3JlLXByaWNlLXdyYXBwZXIiKTtpZihzJiZhKXt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTmFtZT1lLmNsYXNzTmFtZSxsLnN0eWxlLnNldFByb3BlcnR5KCJoZWlnaHQiLHIrInB4IiwiaW1wb3J0YW50IiksbC5zdHlsZS5zZXRQcm9wZXJ0eSgicGFkZGluZy10b3AiLGksImltcG9ydGFudCIpLGwuc3R5bGUuc2V0UHJvcGVydHkoIm1hcmdpbi1ib3R0b20iLCIwcHgiLCJpbXBvcnRhbnQiKSxsLnN0eWxlLnNldFByb3BlcnR5KCJkaXNwbGF5IiwiLXdlYmtpdC1ib3giLCJpbXBvcnRhbnQiKSxsLnN0eWxlLnNldFByb3BlcnR5KCItd2Via2l0LWJveC1vcmllbnQiLCJ2ZXJ0aWNhbCIsImltcG9ydGFudCIpLGwuc3R5bGUuc2V0UHJvcGVydHkoIi13ZWJraXQtbGluZS1jbGFtcCIsIjEiLCJpbXBvcnRhbnQiKSxsLnN0eWxlLnNldFByb3BlcnR5KCJvdmVyZmxvdyIsImhpZGRlbiIsImltcG9ydGFudCIpLGwuc3R5bGUuc2V0UHJvcGVydHkoInRleHQtb3ZlcmZsb3ciLCJlbGxpcHNpcyIsImltcG9ydGFudCIpLHMuaW5zZXJ0QmVmb3JlKGwsYSl9fX0pKX19ZnVuY3Rpb24gaW5pdEdhbGxlcnkoKXt2YXIgdD1nZXRHYWxsZXJ5Q29udGFpbmVyKCk7aWYodCl7dC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtc3R5bGVzLWFwcGxpZWQiKSxhcHBseUJhc2VTdHlsZXModCksdC5kYXRhc2V0LnN0eWxlc0FwcGxpZWQ9InRydWUiLGFkZEVtcHR5RGVzY3JQbGFjZWhvbGRlcih0KSxERUJVRyYmY29uc29sZS5pbmZvKCLQmNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyDQs9Cw0LvQtdGA0LXQuCDQt9Cw0LLQtdGA0YjQtdC90LAuIik7Zm9yKHZhciBlPVs1MDAsMWUzLDE1MDBdLHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI7c2V0VGltZW91dCgoZnVuY3Rpb24oKXthdHRhY2hJbWFnZUxvYWRMaXN0ZW5lcnMoKSx1cGRhdGVOb0ltYWdlQ2FyZEhlaWdodHMoKX0pLGVbc10pfX1lbHNlIERFQlVHJiZjb25zb2xlLmluZm8oItCa0L7QvdGC0LXQudC90LXRgCDQs9Cw0LvQtdGA0LXQuCDQvdC1INC90LDQudC00LXQvS4iKX1mdW5jdGlvbiBvYnNlcnZlUG9wdXAoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cCIpLGU7dCYmKCJJbnRlcnNlY3Rpb25PYnNlcnZlciJpbiB3aW5kb3c/bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChmdW5jdGlvbih0LGUpe2Zvcih2YXIgcz0wO3M8dC5sZW5ndGg7cysrKXt2YXIgcjtpZih0W3NdLmlzSW50ZXJzZWN0aW5nKXtERUJVRyYmY29uc29sZS5pbmZvKCLQn9C+0L/QsNC/INCy0LjQtNC40LwuINCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPINCz0LDQu9C10YDQtdC4INGH0LXRgNC10LcgMTUwMCDQvNGBIiksZS5kaXNjb25uZWN0KCksc2V0VGltZW91dChpbml0R2FsbGVyeSwxNTAwKTticmVha319fSkpLm9ic2VydmUodCk6c2V0VGltZW91dChpbml0R2FsbGVyeSwxNTAwKSl9ZnVuY3Rpb24gb25SZXNpemUoKXtERUJVRyYmY29uc29sZS5pbmZvKCJSZXNpemUg4oCTINC+0LHQvdC+0LLQu9C10L3QuNC1INCy0YvRgdC+0YLRiyDQutCw0YDRgtC+0YfQtdC6IiksdXBkYXRlTm9JbWFnZUNhcmRIZWlnaHRzKCl9ZnVuY3Rpb24gb25Qb3BzdGF0ZSgpe0RFQlVHJiZjb25zb2xlLmluZm8oIlBvcHN0YXRlIOKAkyDQuNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyDQs9Cw0LvQtdGA0LXQuCIpLHNldFRpbWVvdXQoaW5pdEdhbGxlcnksNTAwKX1mdW5jdGlvbiBvblBhZ2VzaG93KHQpe3QucGVyc2lzdGVkJiYoREVCVUcmJmNvbnNvbGUuaW5mbygiUGFnZXNob3cgKNC40Lcg0LrRjdGI0LApIOKAkyDQuNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyDQs9Cw0LvQtdGA0LXQuCIpLGluaXRHYWxsZXJ5KCkpfWZ1bmN0aW9uIG9uV2luZG93TG9hZCgpe2luaXRHYWxsZXJ5KCksb2JzZXJ2ZVBvcHVwKCl9aWYod2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsb25SZXNpemUpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb3BzdGF0ZSIsb25Qb3BzdGF0ZSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBhZ2VzaG93IixvblBhZ2VzaG93KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsb25XaW5kb3dMb2FkKSxkb2N1bWVudC5ib2R5JiYiTXV0YXRpb25PYnNlcnZlciJpbiB3aW5kb3cpe3ZhciBkb21PYnNlcnZlcj1uZXcgTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24oKXtpbml0R2FsbGVyeSgpfSkpO2RvbU9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KX12YXIgcG9sbENvdW50PTAscG9sbEludGVydmFsPXNldEludGVydmFsKChmdW5jdGlvbigpe2luaXRHYWxsZXJ5KCksKytwb2xsQ291bnQ+PTIwJiZjbGVhckludGVydmFsKHBvbGxJbnRlcnZhbCl9KSw1MDApOwoKZnVuY3Rpb24gdDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihlKXt0cnl7dmFyIHQscj0vdmFyXCgoLS11Yy0oW14tXSspLShbXi1dKyktKFteLF0rKSksXHM/KC4qKVwpLy5leGVjKGUpO2lmKCFyKXJldHVybjt2YXIgbD1yWzBdLGE9clsxXSxvPXJbMl0scz1yWzNdLF89cls0XSxuPXJbNV0saSxkO2lmKCEobCYmbyYmcyYmXyYmbikpcmV0dXJuO3JldHVybntwYXJlbnQ6e2lkOl8sdHlwZTpvfSxmYWxsYmFjazp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKGEpfHxuLGZpZWxkOnN9fWNhdGNoKGMpe2NvbnNvbGUuZXJyb3IoIkVycm9yIHRyeWluZyB0byBwYXJzZSBDU1MgVmFyaWFibGUiKX19ZnVuY3Rpb24gdDM5Nl9faGV4MnJnYmEoZSx0KXtpZighZSlyZXR1cm4hMTt2YXIgcj10Mzk2X19wYXJzZUdsb2JhbFN0eWxlQ1NTVmFyKGUpO3ImJihlPXIuZmFsbGJhY2spO3ZhciBsPWUucmVwbGFjZSgvIy8sIiIpO2lmKDM9PT1sLmxlbmd0aCl7dmFyIGE9bFswXSxvPWxbMV0scz1sWzJdO2U9IiMiK2ErYStvK28rcytzfXZhciBfPXBhcnNlSW50KGUuc3Vic3RyaW5nKDEpLDE2KSxuLGksZDtyZXR1cm5bKDE2NzExNjgwJl8pPj4xNiwoNjUyODAmXyk+PjgsMjU1Jl8scGFyc2VGbG9hdCh0KV19ZnVuY3Rpb24gdDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbShlKXt2YXIgdD1bImdhbGxlcnkiXSxyPWUuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO3JldHVybiB0LmluY2x1ZGVzKHIpfWZ1bmN0aW9uIHQzOTZfX2lzRmxleChlKXt2YXIgdD1lLmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmQtZmxleCIpLHI9ZS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2dyb3VwLWZsZXgiKTtyZXR1cm4gdHx8cn1mdW5jdGlvbiB0Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3Jkcygpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYoZSl7dmFyIHQ9WyIudDk1MV9fc2lkZWJhcl9zdGlja3kiLCIudDEyMDZfX2NvbnRlbnRfc3RpY2t5IiwiLnQ3NTRfX2NvbF9maXhlZCIsIi50Nzc2X19jb2xfZml4ZWQiLCIudDc4Nl9fY29sX2ZpeGVkIiwiLnQtc3RvcmVfX3Byb2QtcG9wdXBfX2NvbF9maXhlZCIsIi50LWNhdGFsb2dfX3NpZGViYXJfc3RpY2t5Il07dDM5Nl9fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlKCk7dmFyIHI9Qm9vbGVhbihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQuam9pbigiLCAiKSkpO2UuY2xhc3NMaXN0LnJlbW92ZSgidC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIiwidC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4iKSxlLmNsYXNzTGlzdC5hZGQocj8idC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIjoidC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4iKX19ZnVuY3Rpb24gdDM5Nl9fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlKCl7aWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0Mzk2X19vdmVyZmxvdy1zdHlsZXMiKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtlLmlkPSJ0Mzk2X19vdmVyZmxvdy1zdHlsZXMiLGUuaW5uZXJIVE1MPSIudC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIHsgb3ZlcmZsb3c6IGNsaXA7IH1cblx0XHRcdFx0XHRcdC50LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiB7IG92ZXJmbG93OiBoaWRkZW47IH0iLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZSl9fWZ1bmN0aW9uIHQzOTZfX2dldEFydGJvYXJkcyhlKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLHIsbD10JiYiZWRpdCI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik/Jy5yZWNvcmRbZGF0YS1yZWNvcmQtdHlwZT0iJytlKyciXSAucjpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucmVjb3JkW2RhdGEtcGFyZW50dHBsaWQ9IicrZSsnIl0gLnI6bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCc6Jy5yW2RhdGEtcmVjb3JkLXR5cGU9IicrZSsnIl06bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCwgLnJbZGF0YS1wYXJlbnR0cGxpZD0iJytlKyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJztyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGwpKX1mdW5jdGlvbiB0Mzk2X19nZXRaZXJvQmxvY2tzKCl7dmFyIGU9W10uY29uY2F0KHQzOTZfX2dldEFydGJvYXJkcygiMzk2IiksdDM5Nl9fZ2V0QXJ0Ym9hcmRzKCIxMjEiKSksdDtyZXR1cm4gZS5sZW5ndGg/ZS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybntyZWNvcmQ6ZS5jbG9zZXN0KCIucjpub3QoLnQzOTdfX29mZik6bm90KC50Mzk1X19vZmYpOm5vdCgudDQwMF9fb2ZmKSIpLGFydGJvYXJkOmV9fSkpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVjb3JkfSkpOltdfWZ1bmN0aW9uIHQzOTZfX2lzSW5zaWRlR3JvdXBXaXRoWm9vbShlKXtmb3IodmFyIHQ9ZS5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTt0Oyl7dmFyIHI7aWYodC5zdHlsZS56b29tKXJldHVybiEwO3Q9bnVsbD09KHI9dC5wYXJlbnRFbGVtZW50KT92b2lkIDA6ci5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKX1yZXR1cm4hMX12YXIgdDM5Nl9fdW5pcXVlSWRfX2dlbmVyYXRvcj1mdW5jdGlvbiBlKCl7dmFyIHQ9MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1TdHJpbmcodCs9MSkucGFkU3RhcnQoNiwiMCIpO3JldHVybiIiK0RhdGUubm93KCkrZX19LHQzOTZfX2dldFVuaXF1ZUlkPXQzOTZfX3VuaXF1ZUlkX19nZW5lcmF0b3IoKTtmdW5jdGlvbiB0Mzk2X2lzQmxvY2tWaXNpYmxlKGUpe3ZhciB0PXdpbmRvdy5pbm5lcldpZHRoLHI9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1pbiIpLGw9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1heCIpO3JldHVybiEociYmdDxwYXJzZUludChyLDEwKSkmJiEobCYmdD5wYXJzZUludChsLDEwKSl9dmFyIHQzOTZfX29uUmVhZHk9ZnVuY3Rpb24gZSh0KXsibG9hZGluZyIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP3QoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix0KX07ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRGb3JtSW5wdXRzVmFsdWUoZSl7dmFyIHQ9ZS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9faW5wdXRzLXRleHRhcmVhIik7aWYodCl7dmFyIHI9dC52YWx1ZTtpZihyKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShyKX1jYXRjaChvKXtyZXR1cm4gY29uc29sZS5lcnJvcigiRXJyb3IgcGFyc2luZyBmb3JtIGlucHV0cyB0ZXh0YXJlYSB2YWx1ZToiLG8sciksW119fXZhciBsPWUucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX2lucHV0cy1kYXRhIik7aWYobCl7dmFyIGE9bC5nZXRBdHRyaWJ1dGUoImRhdGEtdmFsdWUiKTtpZihhKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShhKX1jYXRjaChvKXtyZXR1cm4gY29uc29sZS5lcnJvcigiRXJyb3IgcGFyc2luZyBmb3JtIGlucHV0cyBkYXRhOiIsbyxhKSxbXX19cmV0dXJuW119ZnVuY3Rpb24gdDM5Nl9nZXRFbChlKXtyZXR1cm4gd2luZG93LmpRdWVyeSYmZSBpbnN0YW5jZW9mIGpRdWVyeT9lLmxlbmd0aD9lLmdldCgwKTpudWxsOmV9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9faW5pdChlLHQpe3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK2UpLGw9Jy50bi1lbGVtW2RhdGEtZmUtZWxlbS1pZD0iJyt0KyciXSwgLnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK3QrJyJdJyxhPXI/ci5xdWVyeVNlbGVjdG9yKGwpOm51bGw7aWYoIWEpcmV0dXJuITE7dmFyIG89ImZ1bmN0aW9uIj09dHlwZW9mIGpRdWVyeTt0X29uRnVuY0xvYWQoInRfc2xkc0luaXQiLChmdW5jdGlvbigpe3Rfb25GdW5jTG9hZCgidDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlIiwoZnVuY3Rpb24oKXt0X3plcm9HYWxsZXJ5X19wcm9jZXNzR2FsbGVyeVdpdGhHZW9MYW5kaW5nKHIsKGZ1bmN0aW9uKCl7dF96ZXJvR2FsbGVyeV9fcmVuZGVyKGE9ci5xdWVyeVNlbGVjdG9yKGwpKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcobz8kKGEpOmEpLHRfc2xkc0luaXQobz8kKGEpOlthXSksdF9vbkZ1bmNMb2FkKCJ0X3NsZHNfdXBkYXRlU2xpZGVyIiwoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Rfc2xkc191cGRhdGVTbGlkZXIobz8kKGEpOlthXSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyX25leHQoYSxlKX0pKX0pKX0pKX0pKSxbImVkaXQiLCJ6ZXJvIl0uaW5jbHVkZXMod2luZG93LnRpbGRhbW9kZSl8fCJ5IiE9PWEuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLXpvb21hYmxlLXZhbHVlIil8fGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXpvb21lcl9fd3JhcHBlciIpLmxlbmd0aHx8dF9vbkZ1bmNMb2FkKCJ0X2luaXRab29tIiwoZnVuY3Rpb24oKXt0X2luaXRab29tKCl9KSksdF96ZXJvR2FsbGVyeV9faGFuZGxlTW92ZVNsaWRlcihhKTt2YXIgdD1yLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2Iik7dCYmKCJ1bmRlZmluZWQiIT10eXBlb2YgalF1ZXJ5PygkKHQpLnVuYmluZCgiZGlzcGxheUNoYW5nZWQiLHRfemVyb0dhbGxlcnlfX3VwZGF0ZVNsaWRlckhhbmRsZXIpLCQodCkuYmluZCgiZGlzcGxheUNoYW5nZWQiLHRfemVyb0dhbGxlcnlfX3VwZGF0ZVNsaWRlckhhbmRsZXIpKToodC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsdF96ZXJvR2FsbGVyeV9fdXBkYXRlU2xpZGVySGFuZGxlciksdC5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsdF96ZXJvR2FsbGVyeV9fdXBkYXRlU2xpZGVySGFuZGxlcikpKTt2YXIgcz1hLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHMiKTtzJiYocy5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIil9KSl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fZ2xvYmFsSW5pdCgpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInplcm86d2luZG93LXdpZHRoLWNoYW5nZWQiLChmdW5jdGlvbigpe3ZhciBlO3RfemVyb0dhbGxlcnlfX29uUmVzaXplKHQzOTZfX2dldFplcm9CbG9ja3MoKSl9KSl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fb25SZXNpemUoZSl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD1lLnJlY29yZCxyO3QmJih0Mzk2X2lzQmxvY2tWaXNpYmxlKHQpJiZ0LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWVsZW0tdHlwZT0iZ2FsbGVyeSJdJykuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dF9zbGRzX3VwZGF0ZVNsaWRlcihlKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJfbmV4dChlLHQuaWQucmVwbGFjZSgicmVjIiwiIikpfSkpKX0pKX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19oYW5kbGVNb3ZlU2xpZGVyKGUpe3ZhciB0O2lmKCEoL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwib250b3VjaGVuZCJpbiBkb2N1bWVudCkpe3ZhciByPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGw9ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtIiksYT1wYXJzZUZsb2F0KHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10cmFuc2l0aW9uIikpO2F8fDA9PT1hfHwoYT0zMDApO3ZhciBvPTE0MDt0X3plcm9HYWxsZXJ5X19zZXRTbGlkZXNPcGFjaXR5KGwsIjAiKSxlLmFkZEV2ZW50TGlzdGVuZXIoInRpbGRhU2xkc01vdmVTbGlkZVN0YXJ0IiwoZnVuY3Rpb24oKXt0X3plcm9HYWxsZXJ5X19zZXRTbGlkZXNPcGFjaXR5KGwsIjEiKX0pKSxlLmFkZEV2ZW50TGlzdGVuZXIoInRpbGRhU2xkc01vdmVTbGlkZUVuZCIsKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X3plcm9HYWxsZXJ5X19zZXRTbGlkZXNPcGFjaXR5KGwsIjAiKX0pLGErbyl9KSl9fWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3NldFNsaWRlc09wYWNpdHkoZSx0KXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIil8fChlLnN0eWxlLm9wYWNpdHk9dCl9KSl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fcHJvY2Vzc0dhbGxlcnlXaXRoR2VvTGFuZGluZyhlLHQpe3ZhciByPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50ODA0IiksbD0hIWUudGV4dENvbnRlbnQmJi0xIT09ZS50ZXh0Q29udGVudC5pbmRleE9mKCIlJSIpLGE9ZS5xdWVyeVNlbGVjdG9yKCJbZGF0YS1yZXBsYWNlLWtleV0iKSxvPSJwdWJsaXNoZWQiIT09dF96ZXJvR2FsbGVyeV9fZ2V0VGlsZGFNb2RlKCk7IXJ8fCFsfHxhfHxvP3QoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZXBsYWNpbmdDb21wbGV0ZWQiLHQpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3VwZGF0ZVNsaWRlckhhbmRsZXIoZSl7dF9zbGRzX3VwZGF0ZVNsaWRlcihlLnRhcmdldCl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fZ2V0VGlsZGFNb2RlKCl7aWYodm9pZCAwIT09d2luZG93LnRpbGRhbW9kZSlyZXR1cm4gd2luZG93LnRpbGRhbW9kZTt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLHQ7c3dpdGNoKGU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpOiIiKXtjYXNlImVkaXQiOndpbmRvdy50aWxkYW1vZGU9ImVkaXQiO2JyZWFrO2Nhc2UicHJldmlldyI6d2luZG93LnRpbGRhbW9kZT0icHJldmlldyI7YnJlYWs7ZGVmYXVsdDp3aW5kb3cudGlsZGFtb2RlPSJwdWJsaXNoZWQifXJldHVybiB3aW5kb3cudGlsZGFtb2RlfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3NhZmVQYXJzZShlKXtpZighZSlyZXR1cm5bXTtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIGU7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKHQpe3JldHVybltdfX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19nZXREYXRhKGUpe3ZhciB0PWU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtaW1ncy12YWx1ZSIpOiIiO2lmKCF0KXt2YXIgcj1lP2UucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3NsZHMtaW1ncy10ZXh0YXJlYSIpOm51bGw7dD1yP3IudmFsdWU6IiJ9cmV0dXJuIHRfemVyb0dhbGxlcnlfX3NhZmVQYXJzZSh0KX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19yZW5kZXIoZSx0KXtlPXQzOTZfZ2V0RWwoZSk7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIGpRdWVyeSxsPXQ/dF96ZXJvR2FsbGVyeV9fc2FmZVBhcnNlKHQpOnRfemVyb0dhbGxlcnlfX2dldERhdGEoZSk7bD1sLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIXRfemVyb0dhbGxlcnlfX2lzRW1wdHlPYmooZSl9KSk7dmFyIGE9ZT9lLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIik6bnVsbDthJiYoYS5pbm5lckhUTUw9JzxkaXYgY2xhc3M9InQtc2xkcyIgc3R5bGU9InZpc2liaWxpdHk6IGhpZGRlbjsiPjxkaXYgY2xhc3M9InQtc2xkc19fbWFpbiI+PGRpdiBjbGFzcz0idC1zbGRzX19jb250YWluZXIiPjxkaXYgY2xhc3M9InQtc2xkc19faXRlbXMtd3JhcHBlciIgZGF0YS1zbGlkZXItdHJhbnNpdGlvbj0iIiBkYXRhLXNsaWRlci13aXRoLWN5Y2xlPSJ0cnVlIiBkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodD0idHJ1ZSIgZGF0YS1hdXRvLWNvcnJlY3QtbW9iaWxlLXdpZHRoPSJmYWxzZSIgIGRhdGEtc2xpZGVyLWlzLXByZXZpZXc9InRydWUiPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InQtc2xkc19fYnVsbGV0X3dyYXBwZXIiPjwvZGl2PjxkaXYgY2xhc3M9InQtc2xkc19fY2FwdGlvbl9fY29udGFpbmVyIj48L2Rpdj48ZGl2IGNsYXNzPSJ0LXNsZHNfX2Fycm93X2NvbnRhaW5lciI+PGRpdiBjbGFzcz0idC1zbGRzX19hcnJvd193cmFwcGVyIHQtc2xkc19fYXJyb3dfd3JhcHBlci1sZWZ0IiBkYXRhLXNsaWRlLWRpcmVjdGlvbj0ibGVmdCIgc3R5bGU9ImhlaWdodDogNDg4cHg7Ij48ZGl2IGNsYXNzPSJ0LXNsZHNfX2Fycm93IHQtc2xkc19fYXJyb3ctbGVmdCI+PGRpdiBjbGFzcz0idC1zbGRzX19hcnJvd19ib2R5IHQtc2xkc19fYXJyb3dfYm9keS1sZWZ0Ij48c3ZnIGNsYXNzPSJ0LW51bGxfX3NsZHMtYXJyb3cgdC1udWxsX19zbGRzLWFycm93XzEiIHdpZHRoPSI5NCIgaGVpZ2h0PSI5NCIgdmlld0JveD0iMCAwIDk0IDk0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0zOSA2OEw2MCA0N0wzOSAyNiIgc3Ryb2tlPSJibGFjayIgdmVjdG9yLWVmZmVjdD0ibm9uLXNjYWxpbmctc3Ryb2tlIi8+PC9zdmc+PHN2ZyBjbGFzcz0idC1udWxsX19zbGRzLWFycm93IHQtbnVsbF9fc2xkcy1hcnJvd18yIiAgd2lkdGg9Ijk0IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgOTQgOTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTYzIDQ3LjkxN0gzMCIgc3Ryb2tlPSJibGFjayIgdmVjdG9yLWVmZmVjdD0ibm9uLXNjYWxpbmctc3Ryb2tlIi8+PHBhdGggZD0iTTQ2LjkxNyA2NEw2MyA0Ny45MTdMNDYuOTE3IDMxLjgzNCIgc3Ryb2tlPSJibGFjayIgdmVjdG9yLWVmZmVjdD0ibm9uLXNjYWxpbmctc3Ryb2tlIi8+PC9zdmc+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0idC1zbGRzX19hcnJvd193cmFwcGVyIHQtc2xkc19fYXJyb3dfd3JhcHBlci1yaWdodCIgZGF0YS1zbGlkZS1kaXJlY3Rpb249InJpZ2h0IiBzdHlsZT0iaGVpZ2h0OiA0ODhweDsiPjxkaXYgY2xhc3M9InQtc2xkc19fYXJyb3cgdC1zbGRzX19hcnJvdy1yaWdodCAiPjxkaXYgY2xhc3M9InQtc2xkc19fYXJyb3dfYm9keSB0LXNsZHNfX2Fycm93X2JvZHktcmlnaHQiPjxzdmcgY2xhc3M9InQtbnVsbF9fc2xkcy1hcnJvdyB0LW51bGxfX3NsZHMtYXJyb3dfMSIgd2lkdGg9Ijk0IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgOTQgOTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTM5IDY4TDYwIDQ3TDM5IDI2IiBzdHJva2U9ImJsYWNrIiB2ZWN0b3ItZWZmZWN0PSJub24tc2NhbGluZy1zdHJva2UiLz48L3N2Zz48c3ZnIGNsYXNzPSJ0LW51bGxfX3NsZHMtYXJyb3cgdC1udWxsX19zbGRzLWFycm93XzIiICB3aWR0aD0iOTQiIGhlaWdodD0iOTQiIHZpZXdCb3g9IjAgMCA5NCA5NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNjMgNDcuOTE3SDMwIiBzdHJva2U9ImJsYWNrIiB2ZWN0b3ItZWZmZWN0PSJub24tc2NhbGluZy1zdHJva2UiLz48cGF0aCBkPSJNNDYuOTE3IDY0TDYzIDQ3LjkxN0w0Ni45MTcgMzEuODM0IiBzdHJva2U9ImJsYWNrIiB2ZWN0b3ItZWZmZWN0PSJub24tc2NhbGluZy1zdHJva2UiLz48L3N2Zz48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nKTtmb3IodmFyIG89ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIikscz0icHVibGlzaGVkIj09PXRfemVyb0dhbGxlcnlfX2dldFRpbGRhTW9kZSgpJiYieSI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUocj8kKGUpOmUsInpvb21hYmxlIiksXz0hMSxuPXRfemVyb0dhbGxlcnlfX2lzTGF6eUxvYWRpbmdPbkVsZW0oZSxyKSxpPTA7aTxsLmxlbmd0aDtpKyspe3ZhciBkPWxbaV0sYz10X3plcm9HYWxsZXJ5X19nZXRWaWRlb0tleXMoKS5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gZFtlXX0pKTsoY3x8ZC5saV9pbWd1cmwpJiYoXz0hMCkscz1zJiYhZC5saV9pbWd1cmwmJiFjLGQuem9vbWFibGU9cyxkLndpdGhMYXp5PW47dmFyIHU9dF96ZXJvR2FsbGVyeV9fZ2VuZXJhdGVTbGlkZShkLGkpO3UmJihudWxsPT1vfHxvLmFwcGVuZENoaWxkKHUpKTt2YXIgeT1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2J1bGxldF93cmFwcGVyIik7aWYoeSl7dmFyIG09JzxkaXYgY2xhc3M9InQtc2xkc19fYnVsbGV0JysoMD09PWk/IiB0LXNsZHNfX2J1bGxldF9hY3RpdmUiOiIiKSsnIiBkYXRhLXNsaWRlLWJ1bGxldC1mb3I9IicrKGkrMSkrJyI+PGRpdiBjbGFzcz0idC1zbGRzX19idWxsZXRfYm9keSIgc3R5bGU9IndpZHRoOiAxMHB4OyBoZWlnaHQ6IDEwcHg7YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Ij48L2Rpdj48L2Rpdj4nO3kuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLG0pfXRfemVyb0dhbGxlcnlfX2FwcGVuZENhcHRpb24oZSxkLGkpfWlmKCFzJiYhXyl7dmFyIHA9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19jb250YWluZXIiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHAsKGZ1bmN0aW9uKGUpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfemVyb0dhbGxlcnlfX3NldFNpZGVIYW5kbGVycyksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdF96ZXJvR2FsbGVyeV9fc2V0U2lkZUhhbmRsZXJzKX0pKX1pZihuJiZ0X29uRnVuY0xvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXt0X2xhenlsb2FkX3VwZGF0ZSgpfSkpLGUmJmUuY2xvc2VzdCgnW2RhdGEtZmUtcm9sZT0icG9zdHMiXScpKXt0X3plcm9HYWxsZXJ5X19zZXRCb3JkZXJTdHlsZXNGcm9tRmVlZChhKTt2YXIgZz1lLmNsb3Nlc3QoJ1tkYXRhLWZlLXJvbGU9InBvc3RzIl0gPiAudG4tbW9sZWN1bGUnKTtudWxsPT1nfHxnLmFkZEV2ZW50TGlzdGVuZXIoImZlZWRzOmRyYXctcG9zdHMiLChmdW5jdGlvbigpe3RfemVyb0dhbGxlcnlfX3NldEJvcmRlclN0eWxlc0Zyb21GZWVkKGEpfSkse29uY2U6ITB9KX19ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fc2V0Qm9yZGVyU3R5bGVzRnJvbUZlZWQoZSl7aWYoZSYmZS5jbG9zZXN0KCJbZGF0YS1mZS1lbGVtLWlkXVtkYXRhLWZlLWJvcmRlci1jb2xvcl0iKSl7dmFyIHQ9ZS5zdHlsZSxyPXQuYm9yZGVyQ29sb3IsbD10LmJvcmRlcldpZHRoLGE9dC5ib3JkZXJTdHlsZSxvPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fbWFpbiIpO2lmKG8pe3ImJihvLnN0eWxlLmJvcmRlckNvbG9yPXIpO3ZhciBzPWdldENvbXB1dGVkU3R5bGUobyk7bCYmIjBweCI9PT1zLmJvcmRlcldpZHRoJiYoby5zdHlsZS5ib3JkZXJXaWR0aD1sKSxhJiYibm9uZSI9PT1zLmJvcmRlclN0eWxlJiYoby5zdHlsZS5ib3JkZXJTdHlsZT1hKX19fWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2FwcGVuZENhcHRpb24oZSx0LHIpe3ZhciBsPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY2FwdGlvbl9fY29udGFpbmVyIik7bnVsbD09bHx8bC5hcHBlbmRDaGlsZCh0X3plcm9HYWxsZXJ5X19jcmVhdGVDYXB0aW9uKHQscikpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2NyZWF0ZUNhcHRpb24oZSx0KXt2YXIgcj1lLmxpX2ltZ3RpdGxlfHwiIixsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19jYXB0aW9uIiksMD09PXQmJmwuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19jYXB0aW9uLWFjdGl2ZSIpLGwuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWNhcHRpb24iLHQrMSk7dmFyIGEsbz1yLnN0YXJ0c1dpdGgoIjxzcGFuIGRhdGEtcmVwbGFjZS1rZXkiKSYmci5lbmRzV2l0aCgiPC9zcGFuPiIpP3I6dF96ZXJvR2FsbGVyeV9fZXNjYXBlSHRtbChyKTtyZXR1cm4gbC5pbm5lckhUTUw9bz8nPGRpdiBjbGFzcz0idC1zbGRzX19jYXB0aW9uX3dyYXBwZXIiPjxkaXYgY2xhc3M9InQtc2xkc19fdGl0bGUiPicrbysiPC9kaXY+PC9kaXY+IjoiIixsfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2dlbmVyYXRlU2xpZGUoZSx0KXt2YXIgcixsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGE9WyJ0LXNsZHNfX2l0ZW0iXTswPT09dCYmYS5wdXNoKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIiksKHI9bC5jbGFzc0xpc3QpLmFkZC5hcHBseShyLGEpLGwuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4Iix0KzEpO3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBvLmNsYXNzTGlzdC5hZGQoInQtd2lkdGgiLCJ0LW51bGxfX3NsZHMtd3JhcHBlciIsInQtc2xkc19fd3JhcHBlciIsInQtc2xkc19fd3JhcHBlcl8xMDAiLCJ0LWFsaWduX2NlbnRlciIpLGwuYXBwZW5kQ2hpbGQobyksZS5saV9pbWdhbHQmJmUubGlfaW1nJiYoby5pbm5lckhUTUw9JzxtZXRhIGl0ZW1wcm9wPSJpbWFnZSIgY29udGVudD0iJyt0X3plcm9HYWxsZXJ5X19lc2NhcGVIdG1sKGUubGlfaW1nKSsnIj5cblx0XHRcdDxtZXRhIGl0ZW1wcm9wPSJjYXB0aW9uIiBjb250ZW50PSInK3RfemVyb0dhbGxlcnlfX2VzY2FwZUh0bWwoZS5saV9pbWdhbHQpKyciPlxuXHRcdFx0Jyksby5hcHBlbmRDaGlsZCh0X3plcm9HYWxsZXJ5X19nZW5lcmF0ZVNsaWRlQ29udGVudChlLHQpKSxsfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2dlbmVyYXRlU2xpZGVDb250ZW50KGUsdCl7dmFyIHI9dF96ZXJvR2FsbGVyeV9fZ2V0VmlkZW9LZXlzKCkuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19KSksbD1lLmxpX2ltZ3VybCYmIXIsYT1lLmxpX2ltZ3RhcmdldCYmIXIsbz1lLmxpX2ltZ25vZm9sbG93JiYhcixzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobD8iYSI6ImRpdiIpO2lmKHMuc2V0QXR0cmlidXRlKCJkYXRhLWltZy1saWQiLGUubGlkKSxsJiZzLnNldEF0dHJpYnV0ZSgiaHJlZiIsZS5saV9pbWd1cmwpLGEmJnMuc2V0QXR0cmlidXRlKCJ0YXJnZXQiLCJfYmxhbmsiKSxvJiZzLnNldEF0dHJpYnV0ZSgicmVsIiwibm9mb2xsb3ciKSxlLnpvb21hYmxlJiYocy5zZXRBdHRyaWJ1dGUoImRhdGEtem9vbS10YXJnZXQiLHQrMSkscy5zZXRBdHRyaWJ1dGUoImRhdGEtem9vbWFibGUiLCJ5ZXMiKSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1pbWctem9vbS11cmwiLGUubGlfaW1nKSxzLmNsYXNzTGlzdC5hZGQoInQtem9vbWFibGUiKSksZS53aXRoTGF6eSYmKHMuY2xhc3NMaXN0LmFkZCgidC1iZ2ltZyIpLHMuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsIixlLmxpX2ltZykpLHMuY2xhc3NMaXN0LmFkZCgidG4tYXRvbV9fc2xkcy1pbWciKSxzLnN0eWxlLmJhY2tncm91bmRJbWFnZT10X3plcm9HYWxsZXJ5X19wYXJzZUltYWdlVXJsKGUubGlfaW1nLGUud2l0aExhenkpLHIpe3ZhciBfPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO18uY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9fdmlkZW8td3JhcHBlciIpLF8uYXBwZW5kQ2hpbGQocyk7dmFyIG49dF96ZXJvR2FsbGVyeV9fY3JlYXRlUGxheUJ1dHRvbkZvclZpZGVvKGUpO3JldHVybiBuJiZfLmFwcGVuZENoaWxkKG4pLF99cmV0dXJuIHN9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fcGFyc2VJbWFnZVVybChlLHQpe2lmKCFlKXJldHVybiIiO2lmKCF0fHxlLmluY2x1ZGVzKCIuc3ZnIil8fCFlLmluY2x1ZGVzKCJodHRwczovL3N0YXRpYy50aWxkYWNkbi4iKSlyZXR1cm4idXJsKCIrZSsiKSI7dmFyIHI9ZS5zcGxpdCgiLyIpO3JldHVybiByLnNwbGljZSgtMSwwLCItL3Jlc2l6ZS8yMHgvIiksInVybCgiK3Iuam9pbigiLyIpKyIpIn1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19jcmVhdGVQbGF5QnV0dG9uRm9yVmlkZW8oZSl7dmFyIHQ9dF96ZXJvR2FsbGVyeV9fZ2V0VmlkZW9LZXlzKCkuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19KSkscj0obnVsbD09dD92b2lkIDA6dC5yZXBsYWNlKCJsaV8iLCIiKSl8fCIiLGw9ZVt0XXx8IiI7aWYoIXJ8fCFsKXJldHVybiBudWxsO3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBhLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX3BsYXkiKSxhLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdmlkZW8tdHlwZSIsciksYS5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXZpZGVvLXVybCIsbCksYS5pbm5lckhUTUw9Jzxzdmcgdmlld0JveD0iMCAwIDYwIDYwIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSIiIGZpbGwtcnVsZT0iZXZlbm9kZCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxnIGNsYXNzPSJ0bi1lbGVtX19nYWxsZXJ5X19wbGF5X2ljb25fX2NvbG9yLWhvbGRlciIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTY5MS4wMDAwMDAsIC0zNTE0LjAwMDAwMCkiIGZpbGw9IiNGRkZGRkYiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxwYXRoIGQ9Ik03MjEsMzU3NCBDNzM3LjU2ODU0MiwzNTc0IDc1MSwzNTYwLjU2ODU0IDc1MSwzNTQ0IEM3NTEsMzUyNy40MzE0NiA3MzcuNTY4NTQyLDM1MTQgNzIxLDM1MTQgQzcwNC40MzE0NTgsMzUxNCA2OTEsMzUyNy40MzE0NiA2OTEsMzU0NCBDNjkxLDM1NjAuNTY4NTQgNzA0LjQzMTQ1OCwzNTc0IDcyMSwzNTc0IFogTTcxNSwzNTM0IEw3MzIsMzU0NC41IEw3MTUsMzU1NSBMNzE1LDM1MzQgWiI+PC9wYXRoPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2c+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2c+XG5cdFx0XHRcdFx0XHRcdFx0PC9zdmc+JyxhLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0X3plcm9HYWxsZXJ5X19wbGF5VmlkZW8pLGF9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fc2V0U2lkZUhhbmRsZXJzKGUpe3ZhciB0PWUudGFyZ2V0LHI9dC5jbG9zZXN0KCIudC1zbGRzIiksbD1lLm9mZnNldFgsYT10Lm9mZnNldFdpZHRoLG89cj9yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93LWxlZnQiKTpudWxsLHM9cj9yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93LXJpZ2h0Iik6bnVsbDtsPD02MCYmbyYmby5jbGljaygpLGEtbDw9NjAmJnMuY2xpY2soKX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19pc0VtcHR5T2JqKGUpe2lmKCFlKXJldHVybiEwO3ZhciB0PVtdO2Zvcih2YXIgciBpbiBlKWVbcl18fHQucHVzaCgieSIpO3JldHVybiB0Lmxlbmd0aD09PU9iamVjdC5rZXlzKGUpLmxlbmd0aH1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19yZW5kZXJfbmV4dChlLHQpe3ZhciByO1sic2xkc19hcnJvd3NpemUiLCJzbGRzX2Fycm93bGluZXNpemUiLCJzbGRzX2Fycm93Y29sb3IiLCJzbGRzX2Fycm93Y29sb3Job3ZlciIsInNsZHNfYXJyb3diZ2NvbG9yIiwic2xkc19hcnJvd2JnY29sb3Job3ZlciIsInNsZHNfYXJyb3diZ29wYWNpdHkiLCJzbGRzX2Fycm93YmdvcGFjaXR5aG92ZXIiLCJzbGRzX2RvdHNzaXplIiwic2xkc19kb3RzYmdjb2xvciIsInNsZHNfZG90c2JnY29sb3JhY3RpdmUiLCJzbGRzX2xvb3AiLCJzbGRzX3NwZWVkIiwic2xkc19hdXRvcGxheSIsInNsZHNfYXJyb3djb250cm9scyIsInNsZHNfZG90c2NvbnRyb2xzIiwic2xkc19zdHJldGNoIiwic2xkc19wbGF5aWNvbnNpemUiLCJzbGRzX3BsYXlpY29uY29sb3IiLCJzbGRzX2NhcHRpb250b3BtYXJnaW4iLCJzbGRzX2RvdHN2bWFyZ2luIiwic2xkc19jYXB0aW9ud2lkdGgiLCJzbGRzX2Fycm93aG1hcmdpbiIsInNsZHNfYXJyb3d2bWFyZ2luIiwic2xkc19kb3RzaG1hcmdpbiIsInNsZHNfYXJyb3dhbGlnbiIsInNsZHNfYXJyb3diZXR3ZWVubWFyZ2luIiwic2xkc19hcnJvd3R5cGUiLCJzbGRzX2N1cnNvcmNvbnRyb2wiLCJzbGRzX2ltZ3Bvc2l0aW9uIiwic2xkc19hcnJvd2JvcmRlciJdLmZvckVhY2goKGZ1bmN0aW9uKHIpe3RfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQscil9KSl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fZ2V0QXJyb3dTaXplKGUpe3ZhciB0O3JldHVybntzOjMwLG06NDAsbDo0NSx4bDo1MH1bZV19ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCxyKXt2YXIgbD0iZnVuY3Rpb24iPT10eXBlb2YgalF1ZXJ5O2lmKGRvY3VtZW50LmNvbnRhaW5zKGUpKXt2YXIgYT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsciksbz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciIpLHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvd19jb250YWluZXIiKSxfPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYnVsbGV0X3dyYXBwZXIiKSxuPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGk9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvdyIpLGQ9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1yaWdodCIpLGM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1sZWZ0IiksdT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2J1bGxldF9ib2R5IikseSxtLHAsZyxmLHYsdztzd2l0Y2godm9pZCAwPT09YSYmKGE9IiIpLHIpe2Nhc2Uic2xkc19pbWdwb3NpdGlvbiI6dmFyIGI7YXx8KGE9ImNlbnRlciBjZW50ZXIiKSx0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fX2dhbGxlcnlfX3Bvc2l0aW9uLXN0eWxlcyIpKSxvJiYoKHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9fcG9zaXRpb24tc3R5bGVzIiksdy50ZXh0Q29udGVudD0iI3JlYyIrdCsnIC50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50bi1hdG9tX19zbGRzLWltZ3tiYWNrZ3JvdW5kLXBvc2l0aW9uOiAnK2ErIjt9IixvLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIix3KSk7YnJlYWs7Y2FzZSJzbGRzX3N0cmV0Y2giOnZhciBoO2F8fChhPSJjb3ZlciIpLHRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZS5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fZ2FsbGVyeV9fc3RyZXRjaC1zdHlsZXMiKSksbyYmKCh3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX3N0cmV0Y2gtc3R5bGVzIiksdy50ZXh0Q29udGVudD0iI3JlYyIrdCsnIC50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50bi1hdG9tX19zbGRzLWltZyB7YmFja2dyb3VuZC1zaXplOiAnK2ErIjt9IixvLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIix3KSk7YnJlYWs7Y2FzZSJzbGRzX2N1cnNvcmNvbnRyb2wiOmF8fChhPSJub25lIiksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0bi1lbGVtX19nYWxsZXJ5X2Fycm93cy1jdXJzb3IiKSwib24iPT09YSYmZS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X2Fycm93cy1jdXJzb3IiKTticmVhaztjYXNlInNsZHNfYXJyb3djb250cm9scyI6aWYoYXx8KGE9Im5lYXIiKSxlLmNsYXNzTGlzdC5yZW1vdmUoInRuLWVsZW1fX2dhbGxlcnlfYXJyb3dzLWluIiwidG4tZWxlbV9fZ2FsbGVyeV9hcnJvd3MtbmVhciIsInRuLWVsZW1fX2dhbGxlcnlfYXJyb3dzLW5vbmUiLCJ0bi1lbGVtX19nYWxsZXJ5X2Fycm93cy1hYm92ZSIsInRuLWVsZW1fX2dhbGxlcnlfYXJyb3dzLXVuZGVyIiksZS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X2Fycm93cy0iK2EpLCJhYm92ZSI9PT1hfHwidW5kZXIiPT09YSl7eT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3dzaXplIik7dmFyIHo9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93YmV0d2Vlbm1hcmdpbiIpO2lmKHp8fCh6PSIxMCIpLHl8fCh5PSJzIikseT10X3plcm9HYWxsZXJ5X19nZXRBcnJvd1NpemUoeSkscyl7dmFyIEc9Mip5K3BhcnNlSW50KHosMTApO3Muc3R5bGUud2lkdGg9dDM5Nl9fem9vbWlmeVZhbHVlKGUsRyl9fWVsc2UgcyYmKHMuc3R5bGUud2lkdGg9IjEwMCUiKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChsPyQoZSk6ZSwiYm9yZGVyd2lkdGgiKTsiaW4iPT09YSYmZS5xdWVyeVNlbGVjdG9yKCJbZGF0YS1zbGlkZXItdmlkZW8tdHlwZV0iKSYmZS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX193aXRoLXZpZGVvIiksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2htYXJnaW4iKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93dm1hcmdpbiIpLCJ1bmRlciI9PT1hJiZ0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2NhcHRpb250b3BtYXJnaW4iKTticmVhaztjYXNlInNsZHNfZG90c2htYXJnaW4iOnZhciBTO2F8fChhPSIyMCIpLHRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZS5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fZ2FsbGVyeV9fYnVsbGV0LWhtYXJnaW4tc3R5bGVzIikpLG8mJigodz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpKS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19idWxsZXQtaG1hcmdpbi1zdHlsZXMiKSx3LnRleHRDb250ZW50PSIjcmVjIit0KycgLnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK2UuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKSsnIl0gLnQtc2xkc19fYnVsbGV0IHtwYWRkaW5nOiAxMHB4ICcrYS8yKyJweDttYXJnaW46IDBweDt9IixvLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIix3KSk7YnJlYWs7Y2FzZSJzbGRzX2RvdHNjb250cm9scyI6YXx8KGE9Im5vbmUiKSxfJiYoXy5zdHlsZS5kaXNwbGF5PSJibG9jayIpLGY9cGFyc2VJbnQodDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2RvdHNzaXplIiksMTApLCJuZWFyIj09PWEmJl8mJihfLnN0eWxlLmJvdHRvbT0tMjAtZisicHgiKSwiaW4iPT09YSYmXyYmKF8uc3R5bGUuYm90dG9tPSIwIiksIm5vbmUiPT09YSYmXyYmKF8uc3R5bGUuZGlzcGxheT0ibm9uZSIpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfZG90c3ZtYXJnaW4iKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93dm1hcmdpbiIpO2JyZWFrO2Nhc2Uic2xkc19wbGF5aWNvbnNpemUiOnZhciBFO2F8fChhPSI3MCIpLHRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZS5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fZ2FsbGVyeV9faWNvbi1zaXplLXN0eWxlcyIpKSxvJiYoKHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9faWNvbi1zaXplLXN0eWxlcyIpLHcudGV4dENvbnRlbnQ9IiNyZWMiK3QrJyAudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudG4tZWxlbV9fZ2FsbGVyeV9fcGxheSB7d2lkdGg6ICcrcGFyc2VJbnQoYSwxMCkrInB4O2hlaWdodDogIitwYXJzZUludChhLDEwKSsicHg7bGVmdDogY2FsYyg1MCUgLSAiK3BhcnNlSW50KGEsMTApLzIrInB4KTt0b3A6IGNhbGMoNTAlIC0gIitwYXJzZUludChhLDEwKS8yKyJweCk7fSIsby5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsdykpO2JyZWFrO2Nhc2Uic2xkc19wbGF5aWNvbmNvbG9yIjp2YXIgQTthfHwoYT0iI2ZmZiIpLHRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZS5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fZ2FsbGVyeV9faWNvbi1jb2xvci1zdHlsZXMiKSksbyYmKCh3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX2ljb24tY29sb3Itc3R5bGVzIiksdy50ZXh0Q29udGVudD0iI3JlYyIrdCsnIC50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50bi1lbGVtX19nYWxsZXJ5X19wbGF5X2ljb25fX2NvbG9yLWhvbGRlciB7ZmlsbDogJythKyI7fSIsby5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsdykpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd3R5cGUiOmF8fChhPSIxIik7dmFyIEw9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1udWxsX19zbGRzLWFycm93Iik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChMLChmdW5jdGlvbihlKXtlLnN0eWxlLmRpc3BsYXk9Im5vbmUifSkpO3ZhciBrPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtbnVsbF9fc2xkcy1hcnJvd18iK2EpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaywoZnVuY3Rpb24oZSl7ZS5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd3NpemUiKTticmVhaztjYXNlInNsZHNfYXJyb3dib3JkZXIiOnZhciBWO2lmKGF8fChhPSJub25lIiksdF96ZXJvR2FsbGVyeV9fcmVtb3ZlRWxlbWVudChlLnF1ZXJ5U2VsZWN0b3IoIi50bi1lbGVtX19nYWxsZXJ5X19hcnJvdy1ib3JkZXItc3R5bGVzIikpLCJub25lIiE9PWEpe3ZhciBGPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2xpbmVzaXplIil8fCIxIix4PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbG9yIil8fCIjMjIyIixxPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbG9yaG92ZXIiKXx8eDtvJiYoKHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9fYXJyb3ctYm9yZGVyLXN0eWxlcyIpLHcudGV4dENvbnRlbnQ9Jy50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50LXNsZHNfX2Fycm93X2JvZHk6YmVmb3JlIHtib3JkZXI6ICcrRisicHggc29saWQgIit4Kyc7fS50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50LXNsZHNfX2Fycm93X2JvZHk6aG92ZXI6YmVmb3JlIHtib3JkZXI6ICcrRisicHggc29saWQgIitxKyI7fSIsby5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsdykpfWJyZWFrO2Nhc2Uic2xkc19hcnJvd3NpemUiOmF8fChhPSJzIiksYT10X3plcm9HYWxsZXJ5X19nZXRBcnJvd1NpemUoYSk7dmFyIEM9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd19ib2R5Iik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChDLChmdW5jdGlvbih0KXt0LnN0eWxlLnNldFByb3BlcnR5KCJ3aWR0aCIsdDM5Nl9fem9vbWlmeVZhbHVlKGUscGFyc2VJbnQoYSwxMCkpLCJpbXBvcnRhbnQiKX0pKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93Ymdjb2xvciIpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3diZXR3ZWVubWFyZ2luIiksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd3ZtYXJnaW4iKTticmVhaztjYXNlInNsZHNfYXJyb3dsaW5lc2l6ZSI6YXx8KGE9IjEiKTt2YXIgTz1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93X2JvZHkgcG9seWxpbmUsIC50LXNsZHNfX2Fycm93X2JvZHkgcGF0aCIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTywoZnVuY3Rpb24oZSl7ZS5zdHlsZS5zdHJva2VXaWR0aD1wYXJzZUludChhLDEwKSsicHgifSkpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3dib3JkZXIiKTticmVhaztjYXNlInNsZHNfYXJyb3djb2xvciI6YXx8KGE9IiMyMjIiKTt2YXIgST1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93X2NvbnRhaW5lciBwb2x5bGluZSwgLnQtc2xkc19fYXJyb3dfY29udGFpbmVyIHBhdGgiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKEksKGZ1bmN0aW9uKGUpe2Uuc3R5bGUuc3Ryb2tlPWF9KSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2JvcmRlciIpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3djb2xvcmhvdmVyIiksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2JnY29sb3IiKTticmVhaztjYXNlInNsZHNfZG90c2JnY29sb3IiOmF8fChhPSIjZmZmIiksdj0tMSE9PWEuaW5kZXhPZigiLWdyYWRpZW50KCIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodSwoZnVuY3Rpb24oZSl7dj9lLnN0eWxlLmJhY2tncm91bmRJbWFnZT1hOmUuc3R5bGUuYmFja2dyb3VuZENvbG9yPWF9KSk7YnJlYWs7Y2FzZSJzbGRzX2RvdHNiZ2NvbG9yYWN0aXZlIjp2YXIgQjtpZihhfHwoYT0iIzIyMiIpLHY9LTEhPT1hLmluZGV4T2YoIi1ncmFkaWVudCgiKSx0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYnVsbGV0X3dyYXBwZXIgc3R5bGUiKSksXyl7dz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3ZhciBNPSIjcmVjIit0KycgLnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK2UuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKSsnIl0nLGo9KE0rPSIgLnQtc2xkc19fYnVsbGV0X2FjdGl2ZSAudC1zbGRzX19idWxsZXRfYm9keSIpKyJ7IjtqKz12PyJiYWNrZ3JvdW5kLWltYWdlOiAiK2ErIiAhaW1wb3J0YW50OyBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OyI6ImJhY2tncm91bmQtY29sb3I6ICIrYSsiICFpbXBvcnRhbnQ7IGJhY2tncm91bmQtaW1hZ2U6IG5vbmUgIWltcG9ydGFudDsiLGorPSJ9Iix3LnRleHRDb250ZW50PWosXy5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsdyl9YnJlYWs7Y2FzZSJzbGRzX2F1dG9wbGF5IjppZihhfHwoYT0iMCIpLG4mJihuLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdGltZW91dCIsKDFlMypwYXJzZUZsb2F0KGEpKS50b1N0cmluZygpKSx0X29uRnVuY0xvYWQoInRfc2xpZGVNb3ZlIiwoZnVuY3Rpb24oKXt0X3NsaWRlTW92ZShsPyQoZSk6ZSl9KSksMWUzKnBhcnNlRmxvYXQoYSkpKXt2YXIgSD1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtILmluaXRFdmVudCgic2xpZGVBdXRvcGxheVRpbWVyUmVhZHkiLCEwLCEwKSxuLmRpc3BhdGNoRXZlbnQoSCl9YnJlYWs7Y2FzZSJzbGRzX2Fycm93Ymdjb2xvciI6dmFyIFQ9dF96ZXJvR2FsbGVyeV9fZ2V0QXJyb3dTaXplKHk9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93c2l6ZSIpKSxXPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2Jnb3BhY2l0eSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7YT8odC5zdHlsZS53aWR0aD10Mzk2X196b29taWZ5VmFsdWUoZSxUKSx0LnN0eWxlLmhlaWdodD10Mzk2X196b29taWZ5VmFsdWUoZSxUKSx0LnN0eWxlLmJhY2tncm91bmRDb2xvcj1XPyJyZ2JhKCIrdDM5Nl9faGV4MnJnYmEoYSxXKSsiKSI6YSk6KHQuc3R5bGUud2lkdGg9dDM5Nl9fem9vbWlmeVZhbHVlKGUsVCksdC5zdHlsZS5oZWlnaHQ9dDM5Nl9fem9vbWlmeVZhbHVlKGUsVCksdC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InRyYW5zcGFyZW50Iil9KSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2JnY29sb3Job3ZlciIpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd2Jnb3BhY2l0eSI6dF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2JnY29sb3IiKTticmVhaztjYXNlInNsZHNfYXJyb3dhbGlnbiI6YXx8KGE9ImNlbnRlciIpLHMmJihzLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19fYXJyb3dfY29udGFpbmVyLWxlZnQiLCJ0LXNsZHNfX2Fycm93X2NvbnRhaW5lci1jZW50ZXIiLCJ0LXNsZHNfX2Fycm93X2NvbnRhaW5lci1yaWdodCIpLHMuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19hcnJvd19jb250YWluZXItIithKSk7YnJlYWs7Y2FzZSJzbGRzX2RvdHNzaXplIjphfHwoYT0iMTAiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHUsKGZ1bmN0aW9uKHQpe3Quc3R5bGUud2lkdGg9dDM5Nl9fem9vbWlmeVZhbHVlKGUsYSksdC5zdHlsZS5oZWlnaHQ9dDM5Nl9fem9vbWlmeVZhbHVlKGUsYSl9KSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19kb3RzY29udHJvbHMiKTticmVhaztjYXNlInNsZHNfbG9vcCI6YXx8KGE9Imxvb3AiKSwibm9uZSI9PT1hJiYobiYmbi5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiLCJmYWxzZSIpLHMmJnMuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19ub2N5Y2xlIikpLCJsb29wIj09PWEmJihuJiZuLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIsInRydWUiKSxzJiZzLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19fbm9jeWNsZSIpKTticmVhaztjYXNlInNsZHNfc3BlZWQiOmF8fChhPSJub25lIiksIm5vbmUiPT09YSYmbiYmKG4uc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10cmFuc2l0aW9uIiwiIiksbi5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtc2xvdyIpLG4uY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLWZhc3QiKSxuLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZC1ub25lIikpLCJzbG93Ij09PWEmJm4mJihuLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdHJhbnNpdGlvbiIsIjUwMCIpLG4uY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLWZhc3QiKSxuLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1ub25lIiksbi5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQtc2xvdyIpKSwiZmFzdCI9PT1hJiZuJiYobi5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRyYW5zaXRpb24iLCIzMDAiKSxuLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1zbG93Iiksbi5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpLG4uY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLWZhc3QiKSk7YnJlYWs7Y2FzZSJzbGRzX2Fycm93Y29sb3Job3ZlciI6dF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2JvcmRlciIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7dmFyIHI9dC5xdWVyeVNlbGVjdG9yQWxsKCJwb2x5bGluZSwgcGF0aCIpO3QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsKGZ1bmN0aW9uKCl7YXx8KGE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Y29sb3Job3ZlciIpKSxhfHwoYT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb2xvciIpKSxhfHwoYT0iIzIyMiIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwociwoZnVuY3Rpb24oZSl7ZS5zdHlsZS5zdHJva2U9YX0pKX0pKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLChmdW5jdGlvbigpe3ZhciB0PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbG9yIik7dHx8KHQ9IiMyMjIiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKGUpe2Uuc3R5bGUuc3Ryb2tlPXR9KSl9KSl9KSk7YnJlYWs7Y2FzZSJzbGRzX2Fycm93Ymdjb2xvcmhvdmVyIjpBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsKGZ1bmN0aW9uKCl7dmFyIHI9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93YmdvcGFjaXR5aG92ZXIiKTtyfHwocj0iMS4wIiksYXx8KGE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Ymdjb2xvciIpKSxhfHwoYT0idHJhbnNwYXJlbnQiKTt2YXIgbz1hOyJ0cmFuc3BhcmVudCIhPT1hJiYobz0icmdiYSgiK3QzOTZfX2hleDJyZ2JhKGEscikrIikiKSx0LnN0eWxlLmJhY2tncm91bmRDb2xvcj1vfSkpLHQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsKGZ1bmN0aW9uKCl7dmFyIHI9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Ymdjb2xvciIpO2lmKHJ8fChyPSJ0cmFuc3BhcmVudCIpLCJ0cmFuc3BhcmVudCIhPT1yKXt2YXIgYT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3diZ29wYWNpdHkiKTthfHwoYT0iMS4wIikscj0icmdiYSgiK3QzOTZfX2hleDJyZ2JhKHIsYSkrIikifXQuc3R5bGUuYmFja2dyb3VuZENvbG9yPXJ9KSl9KSk7YnJlYWs7Y2FzZSJzbGRzX2RvdHN2bWFyZ2luIjphfHwoYT0iMTYiKSxwPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19kb3RzY29udHJvbHMiKSxfJiYoIm5lYXIiPT09cD8oXy5zdHlsZS5tYXJnaW5Cb3R0b209LWErInB4IixfLnN0eWxlLnBhZGRpbmdCb3R0b209IjAiKTooXy5zdHlsZS5tYXJnaW5Cb3R0b209IjAiLF8uc3R5bGUucGFkZGluZ0JvdHRvbT1hKyJweCIpKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2NhcHRpb250b3BtYXJnaW4iKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93dm1hcmdpbiIpO2JyZWFrO2Nhc2Uic2xkc19jYXB0aW9udG9wbWFyZ2luIjp2YXIgUD10Mzk2X2dldEVsKGw/JChlKTplKSxSPW51bGw9PVA/dm9pZCAwOlAucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fdGl0bGUiKTthJiZSfHwoYT0iMjAiKSxwPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19kb3RzY29udHJvbHMiKSxtPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbnRyb2xzIik7dmFyIFo9MCxRO2lmKCJuZWFyIj09PXAmJigoZz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfZG90c3ZtYXJnaW4iKSl8fChnPSIxNiIpLChmPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19kb3Rzc2l6ZSIpKXx8KGY9IjEwIiksWj0yMCtwYXJzZUludChmLDEwKStwYXJzZUludChnLDEwKSksInVuZGVyIj09PW0pe3ZhciBVPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd3NpemUiKSxOPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd3ZtYXJnaW4iKTtOfHwoTj0iMTAiKSxVfHwoVT0icyIpLFU9dF96ZXJvR2FsbGVyeV9fZ2V0QXJyb3dTaXplKFUpLFo9WitwYXJzZUludChVLDEwKStwYXJzZUludChOLDEwKX10X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fX2dhbGxlcnlfX2NhcHRpb24tcG9zaXRpb24tc3R5bGVzIikpLG8mJigodz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpKS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19jYXB0aW9uLXBvc2l0aW9uLXN0eWxlcyIpLHcudGV4dENvbnRlbnQ9IiNyZWMiK3QrJyAudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudC1zbGRzX19jYXB0aW9uIHttYXJnaW4tdG9wOiAnKyhaK3BhcnNlSW50KGEsMTApKSsicHg7fSIsby5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsdykpO2JyZWFrO2Nhc2Uic2xkc19jYXB0aW9ud2lkdGgiOnZhciBEO2F8fChhPSI4MCIpLHRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZS5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fZ2FsbGVyeV9fY2FwdGlvbi13aWR0aC1zdHlsZXMiKSksbyYmKCh3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX2NhcHRpb24td2lkdGgtc3R5bGVzIiksdy50ZXh0Q29udGVudD0iI3JlYyIrdCsnIC50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50LXNsZHNfX2NhcHRpb24ge3dpZHRoOiAnK3BhcnNlSW50KGEsMTApKyIlO30iLG8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLHcpKTticmVhaztjYXNlInNsZHNfYXJyb3dobWFyZ2luIjphfHwoYT0iMzAiKSxtPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbnRyb2xzIiksZCYmYyYmKCJuZWFyIj09PW0/KGQuc3R5bGUubGVmdD10Mzk2X196b29taWZ5VmFsdWUoZSxhKSxkLnN0eWxlLnJpZ2h0PSJhdXRvIixjLnN0eWxlLmxlZnQ9ImF1dG8iLGMuc3R5bGUucmlnaHQ9dDM5Nl9fem9vbWlmeVZhbHVlKGUsYSkpOihkLnN0eWxlLmxlZnQ9ImF1dG8iLGQuc3R5bGUucmlnaHQ9dDM5Nl9fem9vbWlmeVZhbHVlKGUsYSksYy5zdHlsZS5sZWZ0PXQzOTZfX3pvb21pZnlWYWx1ZShlLGEpLGMuc3R5bGUucmlnaHQ9ImF1dG8iKSk7YnJlYWs7Y2FzZSJzbGRzX2Fycm93dm1hcmdpbiI6YXx8KGE9IjEwIik7dmFyIEs9e307aWYoImFib3ZlIj09PShtPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbnRyb2xzIikpKUsudG9wPS1hKyJweCIsSy5ib3R0b209ImF1dG8iLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24oZSl7ZS5zdHlsZS5tYXJnaW5Ub3A9IjAifSkpO2Vsc2UgaWYoInVuZGVyIj09PW0pe3ZhciBKPTA7Im5lYXIiPT09KHA9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2RvdHNjb250cm9scyIpKSYmKGc9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2RvdHN2bWFyZ2luIiksZj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfZG90c3NpemUiKSxKPTIwK3BhcnNlSW50KGYsMTApK3BhcnNlSW50KGcsMTApKSxhPXBhcnNlSW50KGEsMTApK0osSy5ib3R0b209LWErInB4IixLLnRvcD0iYXV0byIsQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbihlKXtlLnN0eWxlLm1hcmdpblRvcD0iMCJ9KSl9ZWxzZSBLLnRvcD0iIixLLmJvdHRvbT0iIjtzJiYocy5zdHlsZS50b3A9Sy50b3Ascy5zdHlsZS5ib3R0b209Sy5ib3R0b20pLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfY2FwdGlvbnRvcG1hcmdpbiIpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd2JldHdlZW5tYXJnaW4iOmF8fChhPSIxMCIpLCgiYWJvdmUiPT09KG09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Y29udHJvbHMiKSl8fCJ1bmRlciI9PT1tKSYmZCYmYyYmKGQuc3R5bGUubWFyZ2luTGVmdD1hLzIrInB4IixjLnN0eWxlLm1hcmdpblJpZ2h0PWEvMisicHgiLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3djb250cm9scyIpKX19fWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZSl7ZSYmZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fcGxheVZpZGVvKGUpe3ZhciB0PWUuY3VycmVudFRhcmdldDtpZih0KXt2YXIgcixsLGE9dF96ZXJvR2FsbGVyeV9fZ2VuZXJhdGVWaWRlbyh0LmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdmlkZW8tdHlwZSIpLHQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci12aWRlby11cmwiKSk7YSYmdC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGEpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfemVyb0dhbGxlcnlfX3BsYXlWaWRlbyl9fWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2dlbmVyYXRlVmlkZW8oZSx0KXtpZighZXx8IXQpcmV0dXJuIG51bGw7dmFyIHI9WyJ5b3V0dWJlIiwidmltZW8iXS5pbmNsdWRlcyhlKSxsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9fZnJhbWUiKTt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHI/ImlmcmFtZSI6InZpZGVvIik7cmV0dXJuIGEuY2xhc3NMaXN0LmFkZChyPyJ0bi1lbGVtX19nYWxsZXJ5X19pZnJhbWUiOiJ0bi1lbGVtX19nYWxsZXJ5X192aWRlbyIpLGEuc3JjPXRfemVyb0dhbGxlcnlfX2dldFVSTEJ5VmlkZW9UeXBlKHQsZSkscj8oYS5hbGxvdz0iYXV0b3BsYXkiLGEuc2V0QXR0cmlidXRlKCJhbGxvd2Z1bGxzY3JlZW4iLCIiKSk6KGEuc2V0QXR0cmlidXRlKCJjb250cm9scyIsImNvbnRyb2xzIiksYS5zZXRBdHRyaWJ1dGUoImF1dG9wbGF5IiwiYXV0b3BsYXkiKSxhLnNldEF0dHJpYnV0ZSgicGxheXNpbmxpbmUiLCJwbGF5c2lubGluZSIpKSxsLmFwcGVuZENoaWxkKGEpLGx9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fZ2V0VVJMQnlWaWRlb1R5cGUoZSx0KXtyZXR1cm4idmltZW8iPT09dD8iaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLyIrZSsiP2g9JmFwaT0xJmF1dG9wbGF5PTEiOiJ5b3V0dWJlIj09PXQ/Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyIrZSsiP2F1dG9wbGF5PTEmZW5hYmxlanNhcGk9MSI6ZXx8IiJ9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9faXNMYXp5TG9hZGluZ09uRWxlbShlLHQpe3ZhciByPSJ5Ij09PXdpbmRvdy5sYXp5O2lmKCFyKXt2YXIgbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO3I9ISFsJiYieWVzIj09PWwuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWxhenkiKX1yZXR1cm4hIXImJiJ5IiE9PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSh0PyQoZSk6ZSwibGF6eW9mZiIpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2dldFZpZGVvS2V5cygpe3JldHVyblsibGlfdmltZW8iLCJsaV95b3V0dWJlIiwibGlfbXA0IiwibGlfd2VibSJdfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2VzY2FwZUh0bWwoZSl7cmV0dXJuIGUucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7IikucmVwbGFjZSgvJy9nLCImIzAzOTsiKX10Mzk2X19vblJlYWR5KHRfemVyb0dhbGxlcnlfX2dsb2JhbEluaXQpLHdpbmRvdy50aWxkYV96ZXJvX2dhbGxlcnlfanNfdmVyPTE7CgovKiEgSGFtbWVyLkpTIC0gdjIuMC44IC0gMjAxNi0wNC0yMwogKiBodHRwOi8vaGFtbWVyanMuZ2l0aHViLmlvLwogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTYgSm9yaWsgVGFuZ2VsZGVyOwogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYixjLGQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKGEsYixjKXtyZXR1cm4gc2V0VGltZW91dChqKGEsYyksYil9ZnVuY3Rpb24gZihhLGIsYyl7cmV0dXJuIEFycmF5LmlzQXJyYXkoYSk/KGcoYSxjW2JdLGMpLCEwKTohMX1mdW5jdGlvbiBnKGEsYixjKXt2YXIgZTtpZihhKWlmKGEuZm9yRWFjaClhLmZvckVhY2goYixjKTtlbHNlIGlmKGEubGVuZ3RoIT09ZClmb3IoZT0wO2U8YS5sZW5ndGg7KWIuY2FsbChjLGFbZV0sZSxhKSxlKys7ZWxzZSBmb3IoZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIuY2FsbChjLGFbZV0sZSxhKX1mdW5jdGlvbiBoKGIsYyxkKXt2YXIgZT0iREVQUkVDQVRFRCBNRVRIT0Q6ICIrYysiXG4iK2QrIiBBVCBcbiI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGM9bmV3IEVycm9yKCJnZXQtc3RhY2stdHJhY2UiKSxkPWMmJmMuc3RhY2s/Yy5zdGFjay5yZXBsYWNlKC9eW15cKF0rP1tcbiRdL2dtLCIiKS5yZXBsYWNlKC9eXHMrYXRccysvZ20sIiIpLnJlcGxhY2UoL15PYmplY3QuPGFub255bW91cz5ccypcKC9nbSwie2Fub255bW91c30oKUAiKToiVW5rbm93biBTdGFjayBUcmFjZSIsZj1hLmNvbnNvbGUmJihhLmNvbnNvbGUud2Fybnx8YS5jb25zb2xlLmxvZyk7cmV0dXJuIGYmJmYuY2FsbChhLmNvbnNvbGUsZSxkKSxiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gaShhLGIsYyl7dmFyIGQsZT1iLnByb3RvdHlwZTtkPWEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSksZC5jb25zdHJ1Y3Rvcj1hLGQuX3N1cGVyPWUsYyYmbGEoZCxjKX1mdW5jdGlvbiBqKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiBrKGEsYil7cmV0dXJuIHR5cGVvZiBhPT1vYT9hLmFwcGx5KGI/YlswXXx8ZDpkLGIpOmF9ZnVuY3Rpb24gbChhLGIpe3JldHVybiBhPT09ZD9iOmF9ZnVuY3Rpb24gbShhLGIsYyl7ZyhxKGIpLGZ1bmN0aW9uKGIpe2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITEpfSl9ZnVuY3Rpb24gbihhLGIsYyl7ZyhxKGIpLGZ1bmN0aW9uKGIpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSl9ZnVuY3Rpb24gbyhhLGIpe2Zvcig7YTspe2lmKGE9PWIpcmV0dXJuITA7YT1hLnBhcmVudE5vZGV9cmV0dXJuITF9ZnVuY3Rpb24gcChhLGIpe3JldHVybiBhLmluZGV4T2YoYik+LTF9ZnVuY3Rpb24gcShhKXtyZXR1cm4gYS50cmltKCkuc3BsaXQoL1xzKy9nKX1mdW5jdGlvbiByKGEsYixjKXtpZihhLmluZGV4T2YmJiFjKXJldHVybiBhLmluZGV4T2YoYik7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDspe2lmKGMmJmFbZF1bY109PWJ8fCFjJiZhW2RdPT09YilyZXR1cm4gZDtkKyt9cmV0dXJuLTF9ZnVuY3Rpb24gcyhhKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKX1mdW5jdGlvbiB0KGEsYixjKXtmb3IodmFyIGQ9W10sZT1bXSxmPTA7ZjxhLmxlbmd0aDspe3ZhciBnPWI/YVtmXVtiXTphW2ZdO3IoZSxnKTwwJiZkLnB1c2goYVtmXSksZVtmXT1nLGYrK31yZXR1cm4gYyYmKGQ9Yj9kLnNvcnQoZnVuY3Rpb24oYSxjKXtyZXR1cm4gYVtiXT5jW2JdfSk6ZC5zb3J0KCkpLGR9ZnVuY3Rpb24gdShhLGIpe2Zvcih2YXIgYyxlLGY9YlswXS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSksZz0wO2c8bWEubGVuZ3RoOyl7aWYoYz1tYVtnXSxlPWM/YytmOmIsZSBpbiBhKXJldHVybiBlO2crK31yZXR1cm4gZH1mdW5jdGlvbiB2KCl7cmV0dXJuIHVhKyt9ZnVuY3Rpb24gdyhiKXt2YXIgYz1iLm93bmVyRG9jdW1lbnR8fGI7cmV0dXJuIGMuZGVmYXVsdFZpZXd8fGMucGFyZW50V2luZG93fHxhfWZ1bmN0aW9uIHgoYSxiKXt2YXIgYz10aGlzO3RoaXMubWFuYWdlcj1hLHRoaXMuY2FsbGJhY2s9Yix0aGlzLmVsZW1lbnQ9YS5lbGVtZW50LHRoaXMudGFyZ2V0PWEub3B0aW9ucy5pbnB1dFRhcmdldCx0aGlzLmRvbUhhbmRsZXI9ZnVuY3Rpb24oYil7ayhhLm9wdGlvbnMuZW5hYmxlLFthXSkmJmMuaGFuZGxlcihiKX0sdGhpcy5pbml0KCl9ZnVuY3Rpb24geShhKXt2YXIgYixjPWEub3B0aW9ucy5pbnB1dENsYXNzO3JldHVybiBuZXcoYj1jP2M6eGE/TTp5YT9QOndhP1I6TCkoYSx6KX1mdW5jdGlvbiB6KGEsYixjKXt2YXIgZD1jLnBvaW50ZXJzLmxlbmd0aCxlPWMuY2hhbmdlZFBvaW50ZXJzLmxlbmd0aCxmPWImRWEmJmQtZT09PTAsZz1iJihHYXxIYSkmJmQtZT09PTA7Yy5pc0ZpcnN0PSEhZixjLmlzRmluYWw9ISFnLGYmJihhLnNlc3Npb249e30pLGMuZXZlbnRUeXBlPWIsQShhLGMpLGEuZW1pdCgiaGFtbWVyLmlucHV0IixjKSxhLnJlY29nbml6ZShjKSxhLnNlc3Npb24ucHJldklucHV0PWN9ZnVuY3Rpb24gQShhLGIpe3ZhciBjPWEuc2Vzc2lvbixkPWIucG9pbnRlcnMsZT1kLmxlbmd0aDtjLmZpcnN0SW5wdXR8fChjLmZpcnN0SW5wdXQ9RChiKSksZT4xJiYhYy5maXJzdE11bHRpcGxlP2MuZmlyc3RNdWx0aXBsZT1EKGIpOjE9PT1lJiYoYy5maXJzdE11bHRpcGxlPSExKTt2YXIgZj1jLmZpcnN0SW5wdXQsZz1jLmZpcnN0TXVsdGlwbGUsaD1nP2cuY2VudGVyOmYuY2VudGVyLGk9Yi5jZW50ZXI9RShkKTtiLnRpbWVTdGFtcD1yYSgpLGIuZGVsdGFUaW1lPWIudGltZVN0YW1wLWYudGltZVN0YW1wLGIuYW5nbGU9SShoLGkpLGIuZGlzdGFuY2U9SChoLGkpLEIoYyxiKSxiLm9mZnNldERpcmVjdGlvbj1HKGIuZGVsdGFYLGIuZGVsdGFZKTt2YXIgaj1GKGIuZGVsdGFUaW1lLGIuZGVsdGFYLGIuZGVsdGFZKTtiLm92ZXJhbGxWZWxvY2l0eVg9ai54LGIub3ZlcmFsbFZlbG9jaXR5WT1qLnksYi5vdmVyYWxsVmVsb2NpdHk9cWEoai54KT5xYShqLnkpP2oueDpqLnksYi5zY2FsZT1nP0soZy5wb2ludGVycyxkKToxLGIucm90YXRpb249Zz9KKGcucG9pbnRlcnMsZCk6MCxiLm1heFBvaW50ZXJzPWMucHJldklucHV0P2IucG9pbnRlcnMubGVuZ3RoPmMucHJldklucHV0Lm1heFBvaW50ZXJzP2IucG9pbnRlcnMubGVuZ3RoOmMucHJldklucHV0Lm1heFBvaW50ZXJzOmIucG9pbnRlcnMubGVuZ3RoLEMoYyxiKTt2YXIgaz1hLmVsZW1lbnQ7byhiLnNyY0V2ZW50LnRhcmdldCxrKSYmKGs9Yi5zcmNFdmVudC50YXJnZXQpLGIudGFyZ2V0PWt9ZnVuY3Rpb24gQihhLGIpe3ZhciBjPWIuY2VudGVyLGQ9YS5vZmZzZXREZWx0YXx8e30sZT1hLnByZXZEZWx0YXx8e30sZj1hLnByZXZJbnB1dHx8e307Yi5ldmVudFR5cGUhPT1FYSYmZi5ldmVudFR5cGUhPT1HYXx8KGU9YS5wcmV2RGVsdGE9e3g6Zi5kZWx0YVh8fDAseTpmLmRlbHRhWXx8MH0sZD1hLm9mZnNldERlbHRhPXt4OmMueCx5OmMueX0pLGIuZGVsdGFYPWUueCsoYy54LWQueCksYi5kZWx0YVk9ZS55KyhjLnktZC55KX1mdW5jdGlvbiBDKGEsYil7dmFyIGMsZSxmLGcsaD1hLmxhc3RJbnRlcnZhbHx8YixpPWIudGltZVN0YW1wLWgudGltZVN0YW1wO2lmKGIuZXZlbnRUeXBlIT1IYSYmKGk+RGF8fGgudmVsb2NpdHk9PT1kKSl7dmFyIGo9Yi5kZWx0YVgtaC5kZWx0YVgsaz1iLmRlbHRhWS1oLmRlbHRhWSxsPUYoaSxqLGspO2U9bC54LGY9bC55LGM9cWEobC54KT5xYShsLnkpP2wueDpsLnksZz1HKGosayksYS5sYXN0SW50ZXJ2YWw9Yn1lbHNlIGM9aC52ZWxvY2l0eSxlPWgudmVsb2NpdHlYLGY9aC52ZWxvY2l0eVksZz1oLmRpcmVjdGlvbjtiLnZlbG9jaXR5PWMsYi52ZWxvY2l0eVg9ZSxiLnZlbG9jaXR5WT1mLGIuZGlyZWN0aW9uPWd9ZnVuY3Rpb24gRChhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5wb2ludGVycy5sZW5ndGg7KWJbY109e2NsaWVudFg6cGEoYS5wb2ludGVyc1tjXS5jbGllbnRYKSxjbGllbnRZOnBhKGEucG9pbnRlcnNbY10uY2xpZW50WSl9LGMrKztyZXR1cm57dGltZVN0YW1wOnJhKCkscG9pbnRlcnM6YixjZW50ZXI6RShiKSxkZWx0YVg6YS5kZWx0YVgsZGVsdGFZOmEuZGVsdGFZfX1mdW5jdGlvbiBFKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDE9PT1iKXJldHVybnt4OnBhKGFbMF0uY2xpZW50WCkseTpwYShhWzBdLmNsaWVudFkpfTtmb3IodmFyIGM9MCxkPTAsZT0wO2I+ZTspYys9YVtlXS5jbGllbnRYLGQrPWFbZV0uY2xpZW50WSxlKys7cmV0dXJue3g6cGEoYy9iKSx5OnBhKGQvYil9fWZ1bmN0aW9uIEYoYSxiLGMpe3JldHVybnt4OmIvYXx8MCx5OmMvYXx8MH19ZnVuY3Rpb24gRyhhLGIpe3JldHVybiBhPT09Yj9JYTpxYShhKT49cWEoYik/MD5hP0phOkthOjA+Yj9MYTpNYX1mdW5jdGlvbiBIKGEsYixjKXtjfHwoYz1RYSk7dmFyIGQ9YltjWzBdXS1hW2NbMF1dLGU9YltjWzFdXS1hW2NbMV1dO3JldHVybiBNYXRoLnNxcnQoZCpkK2UqZSl9ZnVuY3Rpb24gSShhLGIsYyl7Y3x8KGM9UWEpO3ZhciBkPWJbY1swXV0tYVtjWzBdXSxlPWJbY1sxXV0tYVtjWzFdXTtyZXR1cm4gMTgwKk1hdGguYXRhbjIoZSxkKS9NYXRoLlBJfWZ1bmN0aW9uIEooYSxiKXtyZXR1cm4gSShiWzFdLGJbMF0sUmEpK0koYVsxXSxhWzBdLFJhKX1mdW5jdGlvbiBLKGEsYil7cmV0dXJuIEgoYlswXSxiWzFdLFJhKS9IKGFbMF0sYVsxXSxSYSl9ZnVuY3Rpb24gTCgpe3RoaXMuZXZFbD1UYSx0aGlzLmV2V2luPVVhLHRoaXMucHJlc3NlZD0hMSx4LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBNKCl7dGhpcy5ldkVsPVhhLHRoaXMuZXZXaW49WWEseC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5zdG9yZT10aGlzLm1hbmFnZXIuc2Vzc2lvbi5wb2ludGVyRXZlbnRzPVtdfWZ1bmN0aW9uIE4oKXt0aGlzLmV2VGFyZ2V0PSRhLHRoaXMuZXZXaW49X2EsdGhpcy5zdGFydGVkPSExLHguYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIE8oYSxiKXt2YXIgYz1zKGEudG91Y2hlcyksZD1zKGEuY2hhbmdlZFRvdWNoZXMpO3JldHVybiBiJihHYXxIYSkmJihjPXQoYy5jb25jYXQoZCksImlkZW50aWZpZXIiLCEwKSksW2MsZF19ZnVuY3Rpb24gUCgpe3RoaXMuZXZUYXJnZXQ9YmIsdGhpcy50YXJnZXRJZHM9e30seC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gUShhLGIpe3ZhciBjPXMoYS50b3VjaGVzKSxkPXRoaXMudGFyZ2V0SWRzO2lmKGImKEVhfEZhKSYmMT09PWMubGVuZ3RoKXJldHVybiBkW2NbMF0uaWRlbnRpZmllcl09ITAsW2MsY107dmFyIGUsZixnPXMoYS5jaGFuZ2VkVG91Y2hlcyksaD1bXSxpPXRoaXMudGFyZ2V0O2lmKGY9Yy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIG8oYS50YXJnZXQsaSl9KSxiPT09RWEpZm9yKGU9MDtlPGYubGVuZ3RoOylkW2ZbZV0uaWRlbnRpZmllcl09ITAsZSsrO2ZvcihlPTA7ZTxnLmxlbmd0aDspZFtnW2VdLmlkZW50aWZpZXJdJiZoLnB1c2goZ1tlXSksYiYoR2F8SGEpJiZkZWxldGUgZFtnW2VdLmlkZW50aWZpZXJdLGUrKztyZXR1cm4gaC5sZW5ndGg/W3QoZi5jb25jYXQoaCksImlkZW50aWZpZXIiLCEwKSxoXTp2b2lkIDB9ZnVuY3Rpb24gUigpe3guYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBhPWoodGhpcy5oYW5kbGVyLHRoaXMpO3RoaXMudG91Y2g9bmV3IFAodGhpcy5tYW5hZ2VyLGEpLHRoaXMubW91c2U9bmV3IEwodGhpcy5tYW5hZ2VyLGEpLHRoaXMucHJpbWFyeVRvdWNoPW51bGwsdGhpcy5sYXN0VG91Y2hlcz1bXX1mdW5jdGlvbiBTKGEsYil7YSZFYT8odGhpcy5wcmltYXJ5VG91Y2g9Yi5jaGFuZ2VkUG9pbnRlcnNbMF0uaWRlbnRpZmllcixULmNhbGwodGhpcyxiKSk6YSYoR2F8SGEpJiZULmNhbGwodGhpcyxiKX1mdW5jdGlvbiBUKGEpe3ZhciBiPWEuY2hhbmdlZFBvaW50ZXJzWzBdO2lmKGIuaWRlbnRpZmllcj09PXRoaXMucHJpbWFyeVRvdWNoKXt2YXIgYz17eDpiLmNsaWVudFgseTpiLmNsaWVudFl9O3RoaXMubGFzdFRvdWNoZXMucHVzaChjKTt2YXIgZD10aGlzLmxhc3RUb3VjaGVzLGU9ZnVuY3Rpb24oKXt2YXIgYT1kLmluZGV4T2YoYyk7YT4tMSYmZC5zcGxpY2UoYSwxKX07c2V0VGltZW91dChlLGNiKX19ZnVuY3Rpb24gVShhKXtmb3IodmFyIGI9YS5zcmNFdmVudC5jbGllbnRYLGM9YS5zcmNFdmVudC5jbGllbnRZLGQ9MDtkPHRoaXMubGFzdFRvdWNoZXMubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5sYXN0VG91Y2hlc1tkXSxmPU1hdGguYWJzKGItZS54KSxnPU1hdGguYWJzKGMtZS55KTtpZihkYj49ZiYmZGI+PWcpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gVihhLGIpe3RoaXMubWFuYWdlcj1hLHRoaXMuc2V0KGIpfWZ1bmN0aW9uIFcoYSl7aWYocChhLGpiKSlyZXR1cm4gamI7dmFyIGI9cChhLGtiKSxjPXAoYSxsYik7cmV0dXJuIGImJmM/amI6Ynx8Yz9iP2tiOmxiOnAoYSxpYik/aWI6aGJ9ZnVuY3Rpb24gWCgpe2lmKCFmYilyZXR1cm4hMTt2YXIgYj17fSxjPWEuQ1NTJiZhLkNTUy5zdXBwb3J0cztyZXR1cm5bImF1dG8iLCJtYW5pcHVsYXRpb24iLCJwYW4teSIsInBhbi14IiwicGFuLXggcGFuLXkiLCJub25lIl0uZm9yRWFjaChmdW5jdGlvbihkKXtiW2RdPWM/YS5DU1Muc3VwcG9ydHMoInRvdWNoLWFjdGlvbiIsZCk6ITB9KSxifWZ1bmN0aW9uIFkoYSl7dGhpcy5vcHRpb25zPWxhKHt9LHRoaXMuZGVmYXVsdHMsYXx8e30pLHRoaXMuaWQ9digpLHRoaXMubWFuYWdlcj1udWxsLHRoaXMub3B0aW9ucy5lbmFibGU9bCh0aGlzLm9wdGlvbnMuZW5hYmxlLCEwKSx0aGlzLnN0YXRlPW5iLHRoaXMuc2ltdWx0YW5lb3VzPXt9LHRoaXMucmVxdWlyZUZhaWw9W119ZnVuY3Rpb24gWihhKXtyZXR1cm4gYSZzYj8iY2FuY2VsIjphJnFiPyJlbmQiOmEmcGI/Im1vdmUiOmEmb2I/InN0YXJ0IjoiIn1mdW5jdGlvbiAkKGEpe3JldHVybiBhPT1NYT8iZG93biI6YT09TGE/InVwIjphPT1KYT8ibGVmdCI6YT09S2E/InJpZ2h0IjoiIn1mdW5jdGlvbiBfKGEsYil7dmFyIGM9Yi5tYW5hZ2VyO3JldHVybiBjP2MuZ2V0KGEpOmF9ZnVuY3Rpb24gYWEoKXtZLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBiYSgpe2FhLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnBYPW51bGwsdGhpcy5wWT1udWxsfWZ1bmN0aW9uIGNhKCl7YWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGRhKCl7WS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fdGltZXI9bnVsbCx0aGlzLl9pbnB1dD1udWxsfWZ1bmN0aW9uIGVhKCl7YWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGZhKCl7YWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGdhKCl7WS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wVGltZT0hMSx0aGlzLnBDZW50ZXI9ITEsdGhpcy5fdGltZXI9bnVsbCx0aGlzLl9pbnB1dD1udWxsLHRoaXMuY291bnQ9MH1mdW5jdGlvbiBoYShhLGIpe3JldHVybiBiPWJ8fHt9LGIucmVjb2duaXplcnM9bChiLnJlY29nbml6ZXJzLGhhLmRlZmF1bHRzLnByZXNldCksbmV3IGlhKGEsYil9ZnVuY3Rpb24gaWEoYSxiKXt0aGlzLm9wdGlvbnM9bGEoe30saGEuZGVmYXVsdHMsYnx8e30pLHRoaXMub3B0aW9ucy5pbnB1dFRhcmdldD10aGlzLm9wdGlvbnMuaW5wdXRUYXJnZXR8fGEsdGhpcy5oYW5kbGVycz17fSx0aGlzLnNlc3Npb249e30sdGhpcy5yZWNvZ25pemVycz1bXSx0aGlzLm9sZENzc1Byb3BzPXt9LHRoaXMuZWxlbWVudD1hLHRoaXMuaW5wdXQ9eSh0aGlzKSx0aGlzLnRvdWNoQWN0aW9uPW5ldyBWKHRoaXMsdGhpcy5vcHRpb25zLnRvdWNoQWN0aW9uKSxqYSh0aGlzLCEwKSxnKHRoaXMub3B0aW9ucy5yZWNvZ25pemVycyxmdW5jdGlvbihhKXt2YXIgYj10aGlzLmFkZChuZXcgYVswXShhWzFdKSk7YVsyXSYmYi5yZWNvZ25pemVXaXRoKGFbMl0pLGFbM10mJmIucmVxdWlyZUZhaWx1cmUoYVszXSl9LHRoaXMpfWZ1bmN0aW9uIGphKGEsYil7dmFyIGM9YS5lbGVtZW50O2lmKGMuc3R5bGUpe3ZhciBkO2coYS5vcHRpb25zLmNzc1Byb3BzLGZ1bmN0aW9uKGUsZil7ZD11KGMuc3R5bGUsZiksYj8oYS5vbGRDc3NQcm9wc1tkXT1jLnN0eWxlW2RdLGMuc3R5bGVbZF09ZSk6Yy5zdHlsZVtkXT1hLm9sZENzc1Byb3BzW2RdfHwiIn0pLGJ8fChhLm9sZENzc1Byb3BzPXt9KX19ZnVuY3Rpb24ga2EoYSxjKXt2YXIgZD1iLmNyZWF0ZUV2ZW50KCJFdmVudCIpO2QuaW5pdEV2ZW50KGEsITAsITApLGQuZ2VzdHVyZT1jLGMudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZCl9dmFyIGxhLG1hPVsiIiwid2Via2l0IiwiTW96IiwiTVMiLCJtcyIsIm8iXSxuYT1iLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG9hPSJmdW5jdGlvbiIscGE9TWF0aC5yb3VuZCxxYT1NYXRoLmFicyxyYT1EYXRlLm5vdztsYT0iZnVuY3Rpb24iIT10eXBlb2YgT2JqZWN0LmFzc2lnbj9mdW5jdGlvbihhKXtpZihhPT09ZHx8bnVsbD09PWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7Zm9yKHZhciBiPU9iamVjdChhKSxjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyl7dmFyIGU9YXJndW1lbnRzW2NdO2lmKGUhPT1kJiZudWxsIT09ZSlmb3IodmFyIGYgaW4gZSllLmhhc093blByb3BlcnR5KGYpJiYoYltmXT1lW2ZdKX1yZXR1cm4gYn06T2JqZWN0LmFzc2lnbjt2YXIgc2E9aChmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKGIpLGY9MDtmPGUubGVuZ3RoOykoIWN8fGMmJmFbZVtmXV09PT1kKSYmKGFbZVtmXV09YltlW2ZdXSksZisrO3JldHVybiBhfSwiZXh0ZW5kIiwiVXNlIGBhc3NpZ25gLiIpLHRhPWgoZnVuY3Rpb24oYSxiKXtyZXR1cm4gc2EoYSxiLCEwKX0sIm1lcmdlIiwiVXNlIGBhc3NpZ25gLiIpLHVhPTEsdmE9L21vYmlsZXx0YWJsZXR8aXAoYWR8aG9uZXxvZCl8YW5kcm9pZC9pLHdhPSJvbnRvdWNoc3RhcnQiaW4gYSx4YT11KGEsIlBvaW50ZXJFdmVudCIpIT09ZCx5YT13YSYmdmEudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx6YT0idG91Y2giLEFhPSJwZW4iLEJhPSJtb3VzZSIsQ2E9ImtpbmVjdCIsRGE9MjUsRWE9MSxGYT0yLEdhPTQsSGE9OCxJYT0xLEphPTIsS2E9NCxMYT04LE1hPTE2LE5hPUphfEthLE9hPUxhfE1hLFBhPU5hfE9hLFFhPVsieCIsInkiXSxSYT1bImNsaWVudFgiLCJjbGllbnRZIl07eC5wcm90b3R5cGU9e2hhbmRsZXI6ZnVuY3Rpb24oKXt9LGluaXQ6ZnVuY3Rpb24oKXt0aGlzLmV2RWwmJm0odGhpcy5lbGVtZW50LHRoaXMuZXZFbCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZUYXJnZXQmJm0odGhpcy50YXJnZXQsdGhpcy5ldlRhcmdldCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZXaW4mJm0odyh0aGlzLmVsZW1lbnQpLHRoaXMuZXZXaW4sdGhpcy5kb21IYW5kbGVyKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZXZFbCYmbih0aGlzLmVsZW1lbnQsdGhpcy5ldkVsLHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldlRhcmdldCYmbih0aGlzLnRhcmdldCx0aGlzLmV2VGFyZ2V0LHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldldpbiYmbih3KHRoaXMuZWxlbWVudCksdGhpcy5ldldpbix0aGlzLmRvbUhhbmRsZXIpfX07dmFyIFNhPXttb3VzZWRvd246RWEsbW91c2Vtb3ZlOkZhLG1vdXNldXA6R2F9LFRhPSJtb3VzZWRvd24iLFVhPSJtb3VzZW1vdmUgbW91c2V1cCI7aShMLHgse2hhbmRsZXI6ZnVuY3Rpb24oYSl7dmFyIGI9U2FbYS50eXBlXTtiJkVhJiYwPT09YS5idXR0b24mJih0aGlzLnByZXNzZWQ9ITApLGImRmEmJjEhPT1hLndoaWNoJiYoYj1HYSksdGhpcy5wcmVzc2VkJiYoYiZHYSYmKHRoaXMucHJlc3NlZD0hMSksdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsYix7cG9pbnRlcnM6W2FdLGNoYW5nZWRQb2ludGVyczpbYV0scG9pbnRlclR5cGU6QmEsc3JjRXZlbnQ6YX0pKX19KTt2YXIgVmE9e3BvaW50ZXJkb3duOkVhLHBvaW50ZXJtb3ZlOkZhLHBvaW50ZXJ1cDpHYSxwb2ludGVyY2FuY2VsOkhhLHBvaW50ZXJvdXQ6SGF9LFdhPXsyOnphLDM6QWEsNDpCYSw1OkNhfSxYYT0icG9pbnRlcmRvd24iLFlhPSJwb2ludGVybW92ZSBwb2ludGVydXAgcG9pbnRlcmNhbmNlbCI7YS5NU1BvaW50ZXJFdmVudCYmIWEuUG9pbnRlckV2ZW50JiYoWGE9Ik1TUG9pbnRlckRvd24iLFlhPSJNU1BvaW50ZXJNb3ZlIE1TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbCIpLGkoTSx4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc3RvcmUsYz0hMSxkPWEudHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoIm1zIiwiIiksZT1WYVtkXSxmPVdhW2EucG9pbnRlclR5cGVdfHxhLnBvaW50ZXJUeXBlLGc9Zj09emEsaD1yKGIsYS5wb2ludGVySWQsInBvaW50ZXJJZCIpO2UmRWEmJigwPT09YS5idXR0b258fGcpPzA+aCYmKGIucHVzaChhKSxoPWIubGVuZ3RoLTEpOmUmKEdhfEhhKSYmKGM9ITApLDA+aHx8KGJbaF09YSx0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlcixlLHtwb2ludGVyczpiLGNoYW5nZWRQb2ludGVyczpbYV0scG9pbnRlclR5cGU6ZixzcmNFdmVudDphfSksYyYmYi5zcGxpY2UoaCwxKSl9fSk7dmFyIFphPXt0b3VjaHN0YXJ0OkVhLHRvdWNobW92ZTpGYSx0b3VjaGVuZDpHYSx0b3VjaGNhbmNlbDpIYX0sJGE9InRvdWNoc3RhcnQiLF9hPSJ0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCI7aShOLHgse2hhbmRsZXI6ZnVuY3Rpb24oYSl7dmFyIGI9WmFbYS50eXBlXTtpZihiPT09RWEmJih0aGlzLnN0YXJ0ZWQ9ITApLHRoaXMuc3RhcnRlZCl7dmFyIGM9Ty5jYWxsKHRoaXMsYSxiKTtiJihHYXxIYSkmJmNbMF0ubGVuZ3RoLWNbMV0ubGVuZ3RoPT09MCYmKHRoaXMuc3RhcnRlZD0hMSksdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsYix7cG9pbnRlcnM6Y1swXSxjaGFuZ2VkUG9pbnRlcnM6Y1sxXSxwb2ludGVyVHlwZTp6YSxzcmNFdmVudDphfSl9fX0pO3ZhciBhYj17dG91Y2hzdGFydDpFYSx0b3VjaG1vdmU6RmEsdG91Y2hlbmQ6R2EsdG91Y2hjYW5jZWw6SGF9LGJiPSJ0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCI7aShQLHgse2hhbmRsZXI6ZnVuY3Rpb24oYSl7dmFyIGI9YWJbYS50eXBlXSxjPVEuY2FsbCh0aGlzLGEsYik7YyYmdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsYix7cG9pbnRlcnM6Y1swXSxjaGFuZ2VkUG9pbnRlcnM6Y1sxXSxwb2ludGVyVHlwZTp6YSxzcmNFdmVudDphfSl9fSk7dmFyIGNiPTI1MDAsZGI9MjU7aShSLHgse2hhbmRsZXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWMucG9pbnRlclR5cGU9PXphLGU9Yy5wb2ludGVyVHlwZT09QmE7aWYoIShlJiZjLnNvdXJjZUNhcGFiaWxpdGllcyYmYy5zb3VyY2VDYXBhYmlsaXRpZXMuZmlyZXNUb3VjaEV2ZW50cykpe2lmKGQpUy5jYWxsKHRoaXMsYixjKTtlbHNlIGlmKGUmJlUuY2FsbCh0aGlzLGMpKXJldHVybjt0aGlzLmNhbGxiYWNrKGEsYixjKX19LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnRvdWNoLmRlc3Ryb3koKSx0aGlzLm1vdXNlLmRlc3Ryb3koKX19KTt2YXIgZWI9dShuYS5zdHlsZSwidG91Y2hBY3Rpb24iKSxmYj1lYiE9PWQsZ2I9ImNvbXB1dGUiLGhiPSJhdXRvIixpYj0ibWFuaXB1bGF0aW9uIixqYj0ibm9uZSIsa2I9InBhbi14IixsYj0icGFuLXkiLG1iPVgoKTtWLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKGEpe2E9PWdiJiYoYT10aGlzLmNvbXB1dGUoKSksZmImJnRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlJiZtYlthXSYmKHRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlW2ViXT1hKSx0aGlzLmFjdGlvbnM9YS50b0xvd2VyQ2FzZSgpLnRyaW0oKX0sdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5zZXQodGhpcy5tYW5hZ2VyLm9wdGlvbnMudG91Y2hBY3Rpb24pfSxjb21wdXRlOmZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIGcodGhpcy5tYW5hZ2VyLnJlY29nbml6ZXJzLGZ1bmN0aW9uKGIpe2soYi5vcHRpb25zLmVuYWJsZSxbYl0pJiYoYT1hLmNvbmNhdChiLmdldFRvdWNoQWN0aW9uKCkpKX0pLFcoYS5qb2luKCIgIikpfSxwcmV2ZW50RGVmYXVsdHM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5zcmNFdmVudCxjPWEub2Zmc2V0RGlyZWN0aW9uO2lmKHRoaXMubWFuYWdlci5zZXNzaW9uLnByZXZlbnRlZClyZXR1cm4gdm9pZCBiLnByZXZlbnREZWZhdWx0KCk7dmFyIGQ9dGhpcy5hY3Rpb25zLGU9cChkLGpiKSYmIW1iW2piXSxmPXAoZCxsYikmJiFtYltsYl0sZz1wKGQsa2IpJiYhbWJba2JdO2lmKGUpe3ZhciBoPTE9PT1hLnBvaW50ZXJzLmxlbmd0aCxpPWEuZGlzdGFuY2U8MixqPWEuZGVsdGFUaW1lPDI1MDtpZihoJiZpJiZqKXJldHVybn1yZXR1cm4gZyYmZj92b2lkIDA6ZXx8ZiYmYyZOYXx8ZyYmYyZPYT90aGlzLnByZXZlbnRTcmMoYik6dm9pZCAwfSxwcmV2ZW50U3JjOmZ1bmN0aW9uKGEpe3RoaXMubWFuYWdlci5zZXNzaW9uLnByZXZlbnRlZD0hMCxhLnByZXZlbnREZWZhdWx0KCl9fTt2YXIgbmI9MSxvYj0yLHBiPTQscWI9OCxyYj1xYixzYj0xNix0Yj0zMjtZLnByb3RvdHlwZT17ZGVmYXVsdHM6e30sc2V0OmZ1bmN0aW9uKGEpe3JldHVybiBsYSh0aGlzLm9wdGlvbnMsYSksdGhpcy5tYW5hZ2VyJiZ0aGlzLm1hbmFnZXIudG91Y2hBY3Rpb24udXBkYXRlKCksdGhpc30scmVjb2duaXplV2l0aDpmdW5jdGlvbihhKXtpZihmKGEsInJlY29nbml6ZVdpdGgiLHRoaXMpKXJldHVybiB0aGlzO3ZhciBiPXRoaXMuc2ltdWx0YW5lb3VzO3JldHVybiBhPV8oYSx0aGlzKSxiW2EuaWRdfHwoYlthLmlkXT1hLGEucmVjb2duaXplV2l0aCh0aGlzKSksdGhpc30sZHJvcFJlY29nbml6ZVdpdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGYoYSwiZHJvcFJlY29nbml6ZVdpdGgiLHRoaXMpP3RoaXM6KGE9XyhhLHRoaXMpLGRlbGV0ZSB0aGlzLnNpbXVsdGFuZW91c1thLmlkXSx0aGlzKX0scmVxdWlyZUZhaWx1cmU6ZnVuY3Rpb24oYSl7aWYoZihhLCJyZXF1aXJlRmFpbHVyZSIsdGhpcykpcmV0dXJuIHRoaXM7dmFyIGI9dGhpcy5yZXF1aXJlRmFpbDtyZXR1cm4gYT1fKGEsdGhpcyksLTE9PT1yKGIsYSkmJihiLnB1c2goYSksYS5yZXF1aXJlRmFpbHVyZSh0aGlzKSksdGhpc30sZHJvcFJlcXVpcmVGYWlsdXJlOmZ1bmN0aW9uKGEpe2lmKGYoYSwiZHJvcFJlcXVpcmVGYWlsdXJlIix0aGlzKSlyZXR1cm4gdGhpczthPV8oYSx0aGlzKTt2YXIgYj1yKHRoaXMucmVxdWlyZUZhaWwsYSk7cmV0dXJuIGI+LTEmJnRoaXMucmVxdWlyZUZhaWwuc3BsaWNlKGIsMSksdGhpc30saGFzUmVxdWlyZUZhaWx1cmVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVxdWlyZUZhaWwubGVuZ3RoPjB9LGNhblJlY29nbml6ZVdpdGg6ZnVuY3Rpb24oYSl7cmV0dXJuISF0aGlzLnNpbXVsdGFuZW91c1thLmlkXX0sZW1pdDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIpe2MubWFuYWdlci5lbWl0KGIsYSl9dmFyIGM9dGhpcyxkPXRoaXMuc3RhdGU7cWI+ZCYmYihjLm9wdGlvbnMuZXZlbnQrWihkKSksYihjLm9wdGlvbnMuZXZlbnQpLGEuYWRkaXRpb25hbEV2ZW50JiZiKGEuYWRkaXRpb25hbEV2ZW50KSxkPj1xYiYmYihjLm9wdGlvbnMuZXZlbnQrWihkKSl9LHRyeUVtaXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY2FuRW1pdCgpP3RoaXMuZW1pdChhKTp2b2lkKHRoaXMuc3RhdGU9dGIpfSxjYW5FbWl0OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aDspe2lmKCEodGhpcy5yZXF1aXJlRmFpbFthXS5zdGF0ZSYodGJ8bmIpKSlyZXR1cm4hMTthKyt9cmV0dXJuITB9LHJlY29nbml6ZTpmdW5jdGlvbihhKXt2YXIgYj1sYSh7fSxhKTtyZXR1cm4gayh0aGlzLm9wdGlvbnMuZW5hYmxlLFt0aGlzLGJdKT8odGhpcy5zdGF0ZSYocmJ8c2J8dGIpJiYodGhpcy5zdGF0ZT1uYiksdGhpcy5zdGF0ZT10aGlzLnByb2Nlc3MoYiksdm9pZCh0aGlzLnN0YXRlJihvYnxwYnxxYnxzYikmJnRoaXMudHJ5RW1pdChiKSkpOih0aGlzLnJlc2V0KCksdm9pZCh0aGlzLnN0YXRlPXRiKSl9LHByb2Nlc3M6ZnVuY3Rpb24oYSl7fSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe30scmVzZXQ6ZnVuY3Rpb24oKXt9fSxpKGFhLFkse2RlZmF1bHRzOntwb2ludGVyczoxfSxhdHRyVGVzdDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMucG9pbnRlcnM7cmV0dXJuIDA9PT1ifHxhLnBvaW50ZXJzLmxlbmd0aD09PWJ9LHByb2Nlc3M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5zdGF0ZSxjPWEuZXZlbnRUeXBlLGQ9YiYob2J8cGIpLGU9dGhpcy5hdHRyVGVzdChhKTtyZXR1cm4gZCYmKGMmSGF8fCFlKT9ifHNiOmR8fGU/YyZHYT9ifHFiOmImb2I/YnxwYjpvYjp0Yn19KSxpKGJhLGFhLHtkZWZhdWx0czp7ZXZlbnQ6InBhbiIsdGhyZXNob2xkOjEwLHBvaW50ZXJzOjEsZGlyZWN0aW9uOlBhfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucy5kaXJlY3Rpb24sYj1bXTtyZXR1cm4gYSZOYSYmYi5wdXNoKGxiKSxhJk9hJiZiLnB1c2goa2IpLGJ9LGRpcmVjdGlvblRlc3Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLGM9ITAsZD1hLmRpc3RhbmNlLGU9YS5kaXJlY3Rpb24sZj1hLmRlbHRhWCxnPWEuZGVsdGFZO3JldHVybiBlJmIuZGlyZWN0aW9ufHwoYi5kaXJlY3Rpb24mTmE/KGU9MD09PWY/SWE6MD5mP0phOkthLGM9ZiE9dGhpcy5wWCxkPU1hdGguYWJzKGEuZGVsdGFYKSk6KGU9MD09PWc/SWE6MD5nP0xhOk1hLGM9ZyE9dGhpcy5wWSxkPU1hdGguYWJzKGEuZGVsdGFZKSkpLGEuZGlyZWN0aW9uPWUsYyYmZD5iLnRocmVzaG9sZCYmZSZiLmRpcmVjdGlvbn0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGFhLnByb3RvdHlwZS5hdHRyVGVzdC5jYWxsKHRoaXMsYSkmJih0aGlzLnN0YXRlJm9ifHwhKHRoaXMuc3RhdGUmb2IpJiZ0aGlzLmRpcmVjdGlvblRlc3QoYSkpfSxlbWl0OmZ1bmN0aW9uKGEpe3RoaXMucFg9YS5kZWx0YVgsdGhpcy5wWT1hLmRlbHRhWTt2YXIgYj0kKGEuZGlyZWN0aW9uKTtiJiYoYS5hZGRpdGlvbmFsRXZlbnQ9dGhpcy5vcHRpb25zLmV2ZW50K2IpLHRoaXMuX3N1cGVyLmVtaXQuY2FsbCh0aGlzLGEpfX0pLGkoY2EsYWEse2RlZmF1bHRzOntldmVudDoicGluY2giLHRocmVzaG9sZDowLHBvaW50ZXJzOjJ9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2piXX0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcyxhKSYmKE1hdGguYWJzKGEuc2NhbGUtMSk+dGhpcy5vcHRpb25zLnRocmVzaG9sZHx8dGhpcy5zdGF0ZSZvYil9LGVtaXQ6ZnVuY3Rpb24oYSl7aWYoMSE9PWEuc2NhbGUpe3ZhciBiPWEuc2NhbGU8MT8iaW4iOiJvdXQiO2EuYWRkaXRpb25hbEV2ZW50PXRoaXMub3B0aW9ucy5ldmVudCtifXRoaXMuX3N1cGVyLmVtaXQuY2FsbCh0aGlzLGEpfX0pLGkoZGEsWSx7ZGVmYXVsdHM6e2V2ZW50OiJwcmVzcyIscG9pbnRlcnM6MSx0aW1lOjI1MSx0aHJlc2hvbGQ6OX0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm5baGJdfSxwcm9jZXNzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucyxjPWEucG9pbnRlcnMubGVuZ3RoPT09Yi5wb2ludGVycyxkPWEuZGlzdGFuY2U8Yi50aHJlc2hvbGQsZj1hLmRlbHRhVGltZT5iLnRpbWU7aWYodGhpcy5faW5wdXQ9YSwhZHx8IWN8fGEuZXZlbnRUeXBlJihHYXxIYSkmJiFmKXRoaXMucmVzZXQoKTtlbHNlIGlmKGEuZXZlbnRUeXBlJkVhKXRoaXMucmVzZXQoKSx0aGlzLl90aW1lcj1lKGZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT1yYix0aGlzLnRyeUVtaXQoKX0sYi50aW1lLHRoaXMpO2Vsc2UgaWYoYS5ldmVudFR5cGUmR2EpcmV0dXJuIHJiO3JldHVybiB0Yn0scmVzZXQ6ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpfSxlbWl0OmZ1bmN0aW9uKGEpe3RoaXMuc3RhdGU9PT1yYiYmKGEmJmEuZXZlbnRUeXBlJkdhP3RoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCsidXAiLGEpOih0aGlzLl9pbnB1dC50aW1lU3RhbXA9cmEoKSx0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsdGhpcy5faW5wdXQpKSl9fSksaShlYSxhYSx7ZGVmYXVsdHM6e2V2ZW50OiJyb3RhdGUiLHRocmVzaG9sZDowLHBvaW50ZXJzOjJ9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2piXX0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcyxhKSYmKE1hdGguYWJzKGEucm90YXRpb24pPnRoaXMub3B0aW9ucy50aHJlc2hvbGR8fHRoaXMuc3RhdGUmb2IpfX0pLGkoZmEsYWEse2RlZmF1bHRzOntldmVudDoic3dpcGUiLHRocmVzaG9sZDoxMCx2ZWxvY2l0eTouMyxkaXJlY3Rpb246TmF8T2EscG9pbnRlcnM6MX0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gYmEucHJvdG90eXBlLmdldFRvdWNoQWN0aW9uLmNhbGwodGhpcyl9LGF0dHJUZXN0OmZ1bmN0aW9uKGEpe3ZhciBiLGM9dGhpcy5vcHRpb25zLmRpcmVjdGlvbjtyZXR1cm4gYyYoTmF8T2EpP2I9YS5vdmVyYWxsVmVsb2NpdHk6YyZOYT9iPWEub3ZlcmFsbFZlbG9jaXR5WDpjJk9hJiYoYj1hLm92ZXJhbGxWZWxvY2l0eVkpLHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcyxhKSYmYyZhLm9mZnNldERpcmVjdGlvbiYmYS5kaXN0YW5jZT50aGlzLm9wdGlvbnMudGhyZXNob2xkJiZhLm1heFBvaW50ZXJzPT10aGlzLm9wdGlvbnMucG9pbnRlcnMmJnFhKGIpPnRoaXMub3B0aW9ucy52ZWxvY2l0eSYmYS5ldmVudFR5cGUmR2F9LGVtaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9JChhLm9mZnNldERpcmVjdGlvbik7YiYmdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50K2IsYSksdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LGEpfX0pLGkoZ2EsWSx7ZGVmYXVsdHM6e2V2ZW50OiJ0YXAiLHBvaW50ZXJzOjEsdGFwczoxLGludGVydmFsOjMwMCx0aW1lOjI1MCx0aHJlc2hvbGQ6OSxwb3NUaHJlc2hvbGQ6MTB9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2liXX0scHJvY2VzczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsYz1hLnBvaW50ZXJzLmxlbmd0aD09PWIucG9pbnRlcnMsZD1hLmRpc3RhbmNlPGIudGhyZXNob2xkLGY9YS5kZWx0YVRpbWU8Yi50aW1lO2lmKHRoaXMucmVzZXQoKSxhLmV2ZW50VHlwZSZFYSYmMD09PXRoaXMuY291bnQpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtpZihkJiZmJiZjKXtpZihhLmV2ZW50VHlwZSE9R2EpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTt2YXIgZz10aGlzLnBUaW1lP2EudGltZVN0YW1wLXRoaXMucFRpbWU8Yi5pbnRlcnZhbDohMCxoPSF0aGlzLnBDZW50ZXJ8fEgodGhpcy5wQ2VudGVyLGEuY2VudGVyKTxiLnBvc1RocmVzaG9sZDt0aGlzLnBUaW1lPWEudGltZVN0YW1wLHRoaXMucENlbnRlcj1hLmNlbnRlcixoJiZnP3RoaXMuY291bnQrPTE6dGhpcy5jb3VudD0xLHRoaXMuX2lucHV0PWE7dmFyIGk9dGhpcy5jb3VudCViLnRhcHM7aWYoMD09PWkpcmV0dXJuIHRoaXMuaGFzUmVxdWlyZUZhaWx1cmVzKCk/KHRoaXMuX3RpbWVyPWUoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPXJiLHRoaXMudHJ5RW1pdCgpfSxiLmludGVydmFsLHRoaXMpLG9iKTpyYn1yZXR1cm4gdGJ9LGZhaWxUaW1lb3V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpbWVyPWUoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPXRifSx0aGlzLm9wdGlvbnMuaW50ZXJ2YWwsdGhpcyksdGJ9LHJlc2V0OmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKX0sZW1pdDpmdW5jdGlvbigpe3RoaXMuc3RhdGU9PXJiJiYodGhpcy5faW5wdXQudGFwQ291bnQ9dGhpcy5jb3VudCx0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsdGhpcy5faW5wdXQpKX19KSxoYS5WRVJTSU9OPSIyLjAuOCIsaGEuZGVmYXVsdHM9e2RvbUV2ZW50czohMSx0b3VjaEFjdGlvbjpnYixlbmFibGU6ITAsaW5wdXRUYXJnZXQ6bnVsbCxpbnB1dENsYXNzOm51bGwscHJlc2V0OltbZWEse2VuYWJsZTohMX1dLFtjYSx7ZW5hYmxlOiExfSxbInJvdGF0ZSJdXSxbZmEse2RpcmVjdGlvbjpOYX1dLFtiYSx7ZGlyZWN0aW9uOk5hfSxbInN3aXBlIl1dLFtnYV0sW2dhLHtldmVudDoiZG91YmxldGFwIix0YXBzOjJ9LFsidGFwIl1dLFtkYV1dLGNzc1Byb3BzOnt1c2VyU2VsZWN0OiJub25lIix0b3VjaFNlbGVjdDoibm9uZSIsdG91Y2hDYWxsb3V0OiJub25lIixjb250ZW50Wm9vbWluZzoibm9uZSIsdXNlckRyYWc6Im5vbmUiLHRhcEhpZ2hsaWdodENvbG9yOiJyZ2JhKDAsMCwwLDApIn19O3ZhciB1Yj0xLHZiPTI7aWEucHJvdG90eXBlPXtzZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGxhKHRoaXMub3B0aW9ucyxhKSxhLnRvdWNoQWN0aW9uJiZ0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpLGEuaW5wdXRUYXJnZXQmJih0aGlzLmlucHV0LmRlc3Ryb3koKSx0aGlzLmlucHV0LnRhcmdldD1hLmlucHV0VGFyZ2V0LHRoaXMuaW5wdXQuaW5pdCgpKSx0aGlzfSxzdG9wOmZ1bmN0aW9uKGEpe3RoaXMuc2Vzc2lvbi5zdG9wcGVkPWE/dmI6dWJ9LHJlY29nbml6ZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnNlc3Npb247aWYoIWIuc3RvcHBlZCl7dGhpcy50b3VjaEFjdGlvbi5wcmV2ZW50RGVmYXVsdHMoYSk7dmFyIGMsZD10aGlzLnJlY29nbml6ZXJzLGU9Yi5jdXJSZWNvZ25pemVyOyghZXx8ZSYmZS5zdGF0ZSZyYikmJihlPWIuY3VyUmVjb2duaXplcj1udWxsKTtmb3IodmFyIGY9MDtmPGQubGVuZ3RoOyljPWRbZl0sYi5zdG9wcGVkPT09dmJ8fGUmJmMhPWUmJiFjLmNhblJlY29nbml6ZVdpdGgoZSk/Yy5yZXNldCgpOmMucmVjb2duaXplKGEpLCFlJiZjLnN0YXRlJihvYnxwYnxxYikmJihlPWIuY3VyUmVjb2duaXplcj1jKSxmKyt9fSxnZXQ6ZnVuY3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIFkpcmV0dXJuIGE7Zm9yKHZhciBiPXRoaXMucmVjb2duaXplcnMsYz0wO2M8Yi5sZW5ndGg7YysrKWlmKGJbY10ub3B0aW9ucy5ldmVudD09YSlyZXR1cm4gYltjXTtyZXR1cm4gbnVsbH0sYWRkOmZ1bmN0aW9uKGEpe2lmKGYoYSwiYWRkIix0aGlzKSlyZXR1cm4gdGhpczt2YXIgYj10aGlzLmdldChhLm9wdGlvbnMuZXZlbnQpO3JldHVybiBiJiZ0aGlzLnJlbW92ZShiKSx0aGlzLnJlY29nbml6ZXJzLnB1c2goYSksYS5tYW5hZ2VyPXRoaXMsdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKSxhfSxyZW1vdmU6ZnVuY3Rpb24oYSl7aWYoZihhLCJyZW1vdmUiLHRoaXMpKXJldHVybiB0aGlzO2lmKGE9dGhpcy5nZXQoYSkpe3ZhciBiPXRoaXMucmVjb2duaXplcnMsYz1yKGIsYSk7LTEhPT1jJiYoYi5zcGxpY2UoYywxKSx0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpKX1yZXR1cm4gdGhpc30sb246ZnVuY3Rpb24oYSxiKXtpZihhIT09ZCYmYiE9PWQpe3ZhciBjPXRoaXMuaGFuZGxlcnM7cmV0dXJuIGcocShhKSxmdW5jdGlvbihhKXtjW2FdPWNbYV18fFtdLGNbYV0ucHVzaChiKX0pLHRoaXN9fSxvZmY6ZnVuY3Rpb24oYSxiKXtpZihhIT09ZCl7dmFyIGM9dGhpcy5oYW5kbGVycztyZXR1cm4gZyhxKGEpLGZ1bmN0aW9uKGEpe2I/Y1thXSYmY1thXS5zcGxpY2UocihjW2FdLGIpLDEpOmRlbGV0ZSBjW2FdfSksdGhpc319LGVtaXQ6ZnVuY3Rpb24oYSxiKXt0aGlzLm9wdGlvbnMuZG9tRXZlbnRzJiZrYShhLGIpO3ZhciBjPXRoaXMuaGFuZGxlcnNbYV0mJnRoaXMuaGFuZGxlcnNbYV0uc2xpY2UoKTtpZihjJiZjLmxlbmd0aCl7Yi50eXBlPWEsYi5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe2Iuc3JjRXZlbnQucHJldmVudERlZmF1bHQoKX07Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDspY1tkXShiKSxkKyt9fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50JiZqYSh0aGlzLCExKSx0aGlzLmhhbmRsZXJzPXt9LHRoaXMuc2Vzc2lvbj17fSx0aGlzLmlucHV0LmRlc3Ryb3koKSx0aGlzLmVsZW1lbnQ9bnVsbH19LGxhKGhhLHtJTlBVVF9TVEFSVDpFYSxJTlBVVF9NT1ZFOkZhLElOUFVUX0VORDpHYSxJTlBVVF9DQU5DRUw6SGEsU1RBVEVfUE9TU0lCTEU6bmIsU1RBVEVfQkVHQU46b2IsU1RBVEVfQ0hBTkdFRDpwYixTVEFURV9FTkRFRDpxYixTVEFURV9SRUNPR05JWkVEOnJiLFNUQVRFX0NBTkNFTExFRDpzYixTVEFURV9GQUlMRUQ6dGIsRElSRUNUSU9OX05PTkU6SWEsRElSRUNUSU9OX0xFRlQ6SmEsRElSRUNUSU9OX1JJR0hUOkthLERJUkVDVElPTl9VUDpMYSxESVJFQ1RJT05fRE9XTjpNYSxESVJFQ1RJT05fSE9SSVpPTlRBTDpOYSxESVJFQ1RJT05fVkVSVElDQUw6T2EsRElSRUNUSU9OX0FMTDpQYSxNYW5hZ2VyOmlhLElucHV0OngsVG91Y2hBY3Rpb246VixUb3VjaElucHV0OlAsTW91c2VJbnB1dDpMLFBvaW50ZXJFdmVudElucHV0Ok0sVG91Y2hNb3VzZUlucHV0OlIsU2luZ2xlVG91Y2hJbnB1dDpOLFJlY29nbml6ZXI6WSxBdHRyUmVjb2duaXplcjphYSxUYXA6Z2EsUGFuOmJhLFN3aXBlOmZhLFBpbmNoOmNhLFJvdGF0ZTplYSxQcmVzczpkYSxvbjptLG9mZjpuLGVhY2g6ZyxtZXJnZTp0YSxleHRlbmQ6c2EsYXNzaWduOmxhLGluaGVyaXQ6aSxiaW5kRm46aixwcmVmaXhlZDp1fSk7dmFyIHdiPSJ1bmRlZmluZWQiIT10eXBlb2YgYT9hOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O3diLkhhbW1lcj1oYSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShmdW5jdGlvbigpe3JldHVybiBoYX0pOiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1oYTphW2NdPWhhfSh3aW5kb3csZG9jdW1lbnQsIkhhbW1lciIpOwpmdW5jdGlvbiB0Mzk2X19wYXJzZUdsb2JhbFN0eWxlQ1NTVmFyKHQpe3RyeXt2YXIgZSxuPS92YXJcKCgtLXVjLShbXi1dKyktKFteLV0rKS0oW14sXSspKSxccz8oLiopXCkvLmV4ZWModCk7aWYoIW4pcmV0dXJuO3ZhciBpPW5bMF0sYT1uWzFdLHI9blsyXSxvPW5bM10scz1uWzRdLGw9bls1XSxfLGM7aWYoIShpJiZyJiZvJiZzJiZsKSlyZXR1cm47cmV0dXJue3BhcmVudDp7aWQ6cyx0eXBlOnJ9LGZhbGxiYWNrOndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoYSl8fGwsZmllbGQ6b319Y2F0Y2gobSl7Y29uc29sZS5lcnJvcigiRXJyb3IgdHJ5aW5nIHRvIHBhcnNlIENTUyBWYXJpYWJsZSIpfX1mdW5jdGlvbiB0Mzk2X19oZXgycmdiYSh0LGUpe2lmKCF0KXJldHVybiExO3ZhciBuPXQzOTZfX3BhcnNlR2xvYmFsU3R5bGVDU1NWYXIodCk7biYmKHQ9bi5mYWxsYmFjayk7dmFyIGk9dC5yZXBsYWNlKC8jLywiIik7aWYoMz09PWkubGVuZ3RoKXt2YXIgYT1pWzBdLHI9aVsxXSxvPWlbMl07dD0iIyIrYSthK3IrcitvK299dmFyIHM9cGFyc2VJbnQodC5zdWJzdHJpbmcoMSksMTYpLGwsXyxjO3JldHVyblsoMTY3MTE2ODAmcyk+PjE2LCg2NTI4MCZzKT4+OCwyNTUmcyxwYXJzZUZsb2F0KGUpXX1mdW5jdGlvbiB0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpe3ZhciBlPVsiZ2FsbGVyeSJdLG49dC5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7cmV0dXJuIGUuaW5jbHVkZXMobil9ZnVuY3Rpb24gdDM5Nl9faXNGbGV4KHQpe3ZhciBlPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19hcnRib2FyZC1mbGV4Iiksbj10LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fZ3JvdXAtZmxleCIpO3JldHVybiBlfHxufWZ1bmN0aW9uIHQzOTZfX3NldE92ZXJmbG93VG9BbGxSZWNvcmRzKCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtpZih0KXt2YXIgZT1bIi50OTUxX19zaWRlYmFyX3N0aWNreSIsIi50MTIwNl9fY29udGVudF9zdGlja3kiLCIudDc1NF9fY29sX2ZpeGVkIiwiLnQ3NzZfX2NvbF9maXhlZCIsIi50Nzg2X19jb2xfZml4ZWQiLCIudC1zdG9yZV9fcHJvZC1wb3B1cF9fY29sX2ZpeGVkIiwiLnQtY2F0YWxvZ19fc2lkZWJhcl9zdGlja3kiXTt0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKTt2YXIgbj1Cb29sZWFuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZS5qb2luKCIsICIpKSk7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiLCJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpLHQuY2xhc3NMaXN0LmFkZChuPyJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiOiJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpfX1mdW5jdGlvbiB0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQzOTZfX292ZXJmbG93LXN0eWxlcyIpKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3QuaWQ9InQzOTZfX292ZXJmbG93LXN0eWxlcyIsdC5pbm5lckhUTUw9Ii50LXJlY29yZHNfX292ZXJmbG93LWNsaXAgeyBvdmVyZmxvdzogY2xpcDsgfVxuXHRcdFx0XHRcdFx0LnQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIHsgb3ZlcmZsb3c6IGhpZGRlbjsgfSIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KX19ZnVuY3Rpb24gdDM5Nl9fZ2V0QXJ0Ym9hcmRzKHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksbixpPWUmJiJlZGl0Ij09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKT8nLnJlY29yZFtkYXRhLXJlY29yZC10eXBlPSInK3QrJyJdIC5yOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yZWNvcmRbZGF0YS1wYXJlbnR0cGxpZD0iJyt0KyciXSAucjpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJzonLnJbZGF0YS1yZWNvcmQtdHlwZT0iJyt0KyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucltkYXRhLXBhcmVudHRwbGlkPSInK3QrJyJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQnO3JldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoaSkpfWZ1bmN0aW9uIHQzOTZfX2dldFplcm9CbG9ja3MoKXt2YXIgdD1bXS5jb25jYXQodDM5Nl9fZ2V0QXJ0Ym9hcmRzKCIzOTYiKSx0Mzk2X19nZXRBcnRib2FyZHMoIjEyMSIpKSxlO3JldHVybiB0Lmxlbmd0aD90Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3JlY29yZDp0LmNsb3Nlc3QoIi5yOm5vdCgudDM5N19fb2ZmKTpub3QoLnQzOTVfX29mZik6bm90KC50NDAwX19vZmYpIiksYXJ0Ym9hcmQ6dH19KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5yZWNvcmR9KSk6W119ZnVuY3Rpb24gdDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKHQpe2Zvcih2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO2U7KXt2YXIgbjtpZihlLnN0eWxlLnpvb20pcmV0dXJuITA7ZT1udWxsPT0obj1lLnBhcmVudEVsZW1lbnQpP3ZvaWQgMDpuLmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpfXJldHVybiExfXZhciB0Mzk2X191bmlxdWVJZF9fZ2VuZXJhdG9yPWZ1bmN0aW9uIHQoKXt2YXIgZT0wO3JldHVybiBmdW5jdGlvbigpe3ZhciB0PVN0cmluZyhlKz0xKS5wYWRTdGFydCg2LCIwIik7cmV0dXJuIiIrRGF0ZS5ub3coKSt0fX0sdDM5Nl9fZ2V0VW5pcXVlSWQ9dDM5Nl9fdW5pcXVlSWRfX2dlbmVyYXRvcigpO2Z1bmN0aW9uIHQzOTZfaXNCbG9ja1Zpc2libGUodCl7dmFyIGU9d2luZG93LmlubmVyV2lkdGgsbj10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWluIiksaT10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWF4Iik7cmV0dXJuIShuJiZlPHBhcnNlSW50KG4sMTApKSYmIShpJiZlPnBhcnNlSW50KGksMTApKX12YXIgdDM5Nl9fb25SZWFkeT1mdW5jdGlvbiB0KGUpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/ZSgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGUpfTtmdW5jdGlvbiB0Mzk2X2VsZW1fX2dldEZvcm1JbnB1dHNWYWx1ZSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19pbnB1dHMtdGV4dGFyZWEiKTtpZihlKXt2YXIgbj1lLnZhbHVlO2lmKG4pdHJ5e3JldHVybiBKU09OLnBhcnNlKG4pfWNhdGNoKHIpe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciBwYXJzaW5nIGZvcm0gaW5wdXRzIHRleHRhcmVhIHZhbHVlOiIscixuKSxbXX19dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9faW5wdXRzLWRhdGEiKTtpZihpKXt2YXIgYT1pLmdldEF0dHJpYnV0ZSgiZGF0YS12YWx1ZSIpO2lmKGEpdHJ5e3JldHVybiBKU09OLnBhcnNlKGEpfWNhdGNoKHIpe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciBwYXJzaW5nIGZvcm0gaW5wdXRzIGRhdGE6IixyLGEpLFtdfX1yZXR1cm5bXX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2hlY2tWaXNpYmlsaXR5UGFnZSgpeyJ2aXNpYmxlIj09PWRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSYmKHRfYW5pbWF0aW9uU0JTX19vblJlYWR5KHRfYW5pbWF0aW9uU0JTX19pbml0KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0X2FuaW1hdGlvblNCU19fY2hlY2tWaXNpYmlsaXR5UGFnZSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19vblJlYWR5KHQpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/dCgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0KCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxlPXQ/ImVkaXQiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpOm51bGw7ZXx8KGU9Qm9vbGVhbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZm9yX3JlZGFjdG9yX3Rvb2xiYXIiKSkpLC9Cb3QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHxkb2N1bWVudC5kb2N1bWVudE1vZGU8MTF8fGV8fCh0X2FuaW1hdGlvblNCU19fcHJvY2Vzc0hvcml6b250YWxTY3JvbGwoKSx0X2FuaW1hdGlvblNCU19faXNaZXJvQmxvY2tzUmVuZGVyZWQoKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25TQlNfaXNJbnN0YWdyYW1SZW5kZXJlZCgoZnVuY3Rpb24oKXt2YXIgdDt0X2FuaW1hdGlvblNCU19fc2V0QXV0b1NjYWxlSW5mbygpLHRfYW5pbWF0aW9uU0JTX193cmFwQW5kVXBkYXRlRWxzKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWFuaW1hdGUtc2JzLWV2ZW50XSIpKSksdF9hbmltYXRpb25TQlNfX2luaXRBbGxSZXMoZSl9KSl9KSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcm9jZXNzSG9yaXpvbnRhbFNjcm9sbCgpe3ZhciB0PSdbZGF0YS1hbmltYXRlLXNicy1ldmVudD0ic2Nyb2xsIl0nLGU9QXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpKSxuLGk7ZS5sZW5ndGgmJihlLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIil9KSkuc29tZSgoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtb3ZyZmx3Iik7cmV0dXJuWyJ2aXNpYmxlIiwidmlzaWJsZVgiXS5pbmNsdWRlcyhlKX0pKT90Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3JkcygpOih0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlcygpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU7dC5jbG9zZXN0KCIuciIpLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0aW9uLXNic19fb3ZlcmZsb3cteCIpfSkpKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlT3ZlcmZsb3dTdHlsZXMoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNicy1hbmltYXRpb24tYmxvY2stb3ZlcmZsb3ciKSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt0LmlkPSJzYnMtYW5pbWF0aW9uLWJsb2NrLW92ZXJmbG93Iix0LmlubmVySFRNTD0iLnQtYW5pbWF0aW9uLXNic19fb3ZlcmZsb3cteCB7IG92ZXJmbG93LXg6IGhpZGRlbjsgfSIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEF1dG9TY2FsZUluZm8oKXtpZih2b2lkIDA9PT13aW5kb3cuc2hvdWxkVXNlU2NhbGVGYWN0b3Ipe3ZhciB0PXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9GaXJlZm94XC8oWzAtOV0rKVwuLyksZT10P3BhcnNlSW50KHRbMV0sMTApOjEyNixuPXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcLyhbMC05XSspXC4vKSxpPW4mJnBhcnNlSW50KG5bMV0sMTApfHwwO3dpbmRvdy5pc09ubHlTY2FsYWJsZT1lPDEyNix3aW5kb3cuc2hvdWxkVXNlU2NhbGVGYWN0b3I9IXdpbmRvdy5pc09ubHlTY2FsYWJsZSYmIXQmJmk8PTEyN319ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2lzWmVyb0Jsb2Nrc1JlbmRlcmVkKHQpe3ZhciBlPXRfYW5pbWF0aW9uU0JTX19nZXRBcnRib2FyZHMoIjM5NiIpLG49dF9hbmltYXRpb25TQlNfX2dldEFydGJvYXJkcygiMTIxIiksaT1bXS5jb25jYXQoZSxuKTtpZihpLmxlbmd0aCl7dmFyIGE9ITE7aWYoaS5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpKXQoKTtlbHNlIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdFtzcmMqPSJ0aWxkYS1ibG9ja3MtMiJdLCBzY3JpcHRbc3JjKj0idGlsZGEtYmxvY2tzLTEiXScpLmxlbmd0aCl0X2FuaW1hdGlvblNCU19fYmFja3dhcmRDb21wYXRpYmlsaXR5V2FpdChpLERhdGUubm93KCksdCk7ZWxzZXt2YXIgcj1pLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpO2kuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5jbGFzc0xpc3QuY29udGFpbnMoInJlbmRlcmVkIil8fGUuYWRkRXZlbnRMaXN0ZW5lcigiYXJ0Qm9hcmRSZW5kZXJlZCIsKGZ1bmN0aW9uKCl7ci5wdXNoKGUpLHIubGVuZ3RoIT09aS5sZW5ndGh8fGF8fHQoKX0pKX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2E9ITAsci5sZW5ndGghPT1pLmxlbmd0aCYmdCgpfSksM2UzKX19fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBcnRib2FyZHModCl7dmFyIGU9Jy5yW2RhdGEtcmVjb3JkLXR5cGU9IicrdCsnIl06bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCwgLnJbZGF0YS1wYXJlbnR0cGxpZD0iJyt0KyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJztyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGUpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYmFja3dhcmRDb21wYXRpYmlsaXR5V2FpdCh0LGUsbil7aWYodC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpKW4oKTtlbHNle2lmKERhdGUubm93KCktZT4xZTQpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJhbGwgemVyby1ibG9ja3MgY2FuJ3QgYmUgcmVuZGVyZWQiKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3RfYW5pbWF0aW9uU0JTX19iYWNrd2FyZENvbXBhdGliaWxpdHlXYWl0KHQsZSxuKX0pLDUwMCl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX2lzSW5zdGFncmFtUmVuZGVyZWQodCl7aWYod2luZG93LmFuaW1hdGlvblNCU19faXNJT1MmJi0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJJbnN0YWdyYW0iKSl2YXIgZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy5pbm5lcldpZHRoIT09c2NyZWVuLndpZHRoJiZ3aW5kb3cuaW5uZXJIZWlnaHQ+d2luZG93LmlubmVyV2lkdGg/dF9hbmltYXRpb25TQlNfaXNJbnN0YWdyYW1SZW5kZXJlZCh0KTooY2xlYXJUaW1lb3V0KGUpLHQoKSl9KSwxMDApO2Vsc2UgdCgpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX193cmFwQW5kVXBkYXRlRWxzKHQpe3ZhciBlPS0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXQucXVlcnlTZWxlY3RvcigiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpO2lmKG4pey0xPT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSYmKG4uc3R5bGUuV2Via2l0QmFja2ZhY2VWaXNpYmlsaXR5PSJoaWRkZW4iLG4uc3R5bGUuYmFja2ZhY2VWaXNpYmlsaXR5PSJoaWRkZW4iKTt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksYT10X2FuaW1hdGlvblNCU19fZ2V0QW5pbU9wdGlvbnModCwicHVibGlzaGVkIixudWxsKTtpZighaSYmYSl7dmFyIHI9Z2V0Q29tcHV0ZWRTdHlsZShuKS5kaXNwbGF5LG87bi5jbGFzc0xpc3QuY29udGFpbnMoInRuLW1vbGVjdWxlIikmJiJmbGV4IiE9PXImJihuLnN0eWxlLmRpc3BsYXk9ImluaGVyaXQiKTt2YXIgcz10X2FuaW1hdGlvblNCU19fZ2V0U2NhbGVXcmFwcGVyKG4pLGw9dC5zdHlsZS50cmFuc2Zvcm0sXztsJiYtMSE9PWwuaW5kZXhPZigibWF0cml4KCIpJiYodF9hbmltYXRpb25TQlNfX3dyYXBFbChzfHxuLCJ0bi1hdG9tX19zYnMtdHJhbnNmb3JtLXdyYXBwZXIiKSwoXz10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtdHJhbnNmb3JtLXdyYXBwZXIiKSkuc3R5bGUudHJhbnNmb3JtPWwsdC5zdHlsZS50cmFuc2Zvcm09IiIpLHRfYW5pbWF0aW9uU0JTX193cmFwRWwoKF89dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLXRyYW5zZm9ybS13cmFwcGVyIikpfHxzfHxuLCJ0bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksaT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksdF9hbmltYXRpb25TQlNfX3VwZGF0ZVN0eWxlc0FmdGVyV3JhcHBpbmcodCxffHxpLGUpfX19KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldFNjYWxlV3JhcHBlcih0KXtpZighdClyZXR1cm4gbnVsbDt2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpLG49dC5jbGFzc0xpc3QuY29udGFpbnMoInRuLWF0b20iKTtyZXR1cm4gZSYmbj9udWxsOnQuY2xvc2VzdCgiLnRuLWF0b21fX3NjYWxlLXdyYXBwZXIiKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVsT25SZXNpemUodCl7aWYodC5sZW5ndGgpe3ZhciBlPXQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4hdC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpfSkpO2UubGVuZ3RoJiZ0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVscyhlKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZVN0eWxlc0FmdGVyV3JhcHBpbmcodCxlLG4pe3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpLGE9Z2V0Q29tcHV0ZWRTdHlsZSh0KSxyPXQucXVlcnlTZWxlY3RvcigiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpLG89YS5nZXRQcm9wZXJ0eVZhbHVlKCJib3JkZXItcmFkaXVzIik7InNoYXBlIiE9PWkmJiJidXR0b24iIT09aSYmImltYWdlIiE9PWl8fCFwYXJzZUludChvLDEwKXx8KGUuc3R5bGUuYm9yZGVyUmFkaXVzPW8pO3ZhciBzPVsiZmlsdGVyIiwiYmFja2Ryb3AtZmlsdGVyIl07cz0ocz1zLm1hcCgoZnVuY3Rpb24odCl7dmFyIGU9Ii13ZWJraXQtIit0LG49YS5nZXRQcm9wZXJ0eVZhbHVlKHQpO2lmKCJub25lIiE9PW4mJiIiIT09bnx8KG49YS5nZXRQcm9wZXJ0eVZhbHVlKGUpKSwibm9uZSIhPT1uJiYiIiE9PW4pcmV0dXJue2ZpbHRlcjp0LHdlYmtpdEZpbHRlcjplLHZhbHVlOm59fSkpKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpO3ZhciByPXQucXVlcnlTZWxlY3RvcigiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpLGw9Z2V0Q29tcHV0ZWRTdHlsZShyKS50cmFuc2Zvcm0sXz1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtfLmluaXRFdmVudCgiYmFja2Ryb3BGaWx0ZXJJbWdXcmFwcGVyZWQiLCEwLCEwKSxzLmZvckVhY2goKGZ1bmN0aW9uKGEpe3dpbmRvdy50X2FuaW1hdGlvblNCU19faXNGaXJlZm94JiYoZS5zdHlsZS5iYWNrZmFjZVZpc2liaWxpdHk9InZpc2libGUiKSxlLnN0eWxlW2Eud2Via2l0RmlsdGVyXT1hLnZhbHVlLGUuc3R5bGVbYS5maWx0ZXJdPWEudmFsdWUsdC5zdHlsZVthLndlYmtpdEZpbHRlcl09Im5vbmUiLHQuc3R5bGVbYS5maWx0ZXJdPSJub25lIiwiaW1hZ2UiPT09aSYmd2luZG93LnRfYW5pbWF0aW9uU0JTX19pc1NhZmFyaSYmKHQuZGlzcGF0Y2hFdmVudChfKSx0LmNsYXNzTGlzdC5hZGQoInQzOTZfX2VsZW0tLWJhY2tkcm9wLWZpbHRlci1pbWctd3JhcHBlcmVkIikpLG4mJiJiYWNrZHJvcC1maWx0ZXIiPT09YS5maWx0ZXImJihyLnN0eWxlW2Eud2Via2l0RmlsdGVyXT0iaW5oZXJpdCIsci5zdHlsZVthLmZpbHRlcl09ImluaGVyaXQiKSwibm9uZSI9PT1sJiYoci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVooMCkiKX0pKTt2YXIgYz1zLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiJiYWNrZHJvcC1maWx0ZXIiPT09dC5maWx0ZXJ9KSk7biYmYyYmdF9hbmltYXRpb25TQlNfX2Nocm9tZUZpeEJhY2tkcm9wRmlsdGVyKHIsZSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2Nocm9tZUZpeEJhY2tkcm9wRmlsdGVyKHQsZSl7dmFyIG49Z2V0Q29tcHV0ZWRTdHlsZSh0KSxpPW4uZ2V0UHJvcGVydHlWYWx1ZSgiYmFja2dyb3VuZC1jb2xvciIpLGE9bi5nZXRQcm9wZXJ0eVZhbHVlKCJvcGFjaXR5Iikscj1uLmdldFByb3BlcnR5VmFsdWUoImJveC1zaGFkb3ciKTtpZigicmdiYSgwLCAwLCAwLCAwKSIhPT1pJiYiMSIhPT1hKXt2YXIgbz1pLnN1YnN0cmluZyhpLmluZGV4T2YoIigiKSsxLGkuaW5kZXhPZigiKSIpKSxzPXRfYW5pbWF0aW9uU0JTX19wcm9jZXNzQm94U2hhZG93UkdCKHIsYSk7cyYmKGUuc3R5bGUuYm94U2hhZG93PXMsdC5zdHlsZS5ib3hTaGFkb3c9Im5vbmUiKSxlLnN0eWxlLmJhY2tncm91bmRDb2xvcj0icmdiYSgiK28rIiwiK2ErIikiLHQuc3R5bGUub3BhY2l0eT0iMSIsdC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InRyYW5zcGFyZW50Iix0LnN0eWxlLmJhY2tkcm9wRmlsdGVyPSJpbml0aWFsIix0LnN0eWxlLldlYmtpdEJhY2tkcm9wRmlsdGVyPSJpbml0aWFsIn19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3Byb2Nlc3NCb3hTaGFkb3dSR0IodCxlKXtpZighdClyZXR1cm4hMTtpZigtMT09PXQuaW5kZXhPZigicmdiYSIpJiYtMT09PXQuaW5kZXhPZigicmdiIil8fCIxIj09PWUpcmV0dXJuITE7dmFyIG49dC5zdWJzdHJpbmcodC5pbmRleE9mKCIoIikrMSx0LmluZGV4T2YoIikiKSksaT1uLnNwbGl0KCIsICIpOzM9PT1pLmxlbmd0aD9pLnB1c2goZSk6aVszXSo9ZTt2YXIgYT10LnJlcGxhY2UobixpLmpvaW4oIiwgIikpO3JldHVybi0xIT09YS5pbmRleE9mKCJyZ2IoIikmJihhPWEucmVwbGFjZSgicmdiKCIsInJnYmEoIikpLGF9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2luaXRBbGxSZXModCl7dmFyIGU9e2VsZW1lbnRzOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWFuaW1hdGUtc2JzLWV2ZW50XSIpKSxzY3JvbGxUb3A6d2luZG93LnBhZ2VZT2Zmc2V0LGlzRWRpdE1vZGU6dCxjbGlja2VkVHJpZ2dlckVsczpbXSxob3ZlclRyaWdnZXJFbHM6W119O2lmKGUuZWxlbWVudHMubGVuZ3RoKXt0X2FuaW1hdGlvblNCU19fY2FjaGVBbmRTZXREYXRhKGUpLHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lcyhlKTt2YXIgbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGk9ISFuJiYieWVzIj09PW4uZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWxhenkiKTsoInkiPT09d2luZG93Lmxhenl8fGkpJiZ0X29uRnVuY0xvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXt0X2xhenlsb2FkX3VwZGF0ZSgpfSkpO3ZhciBhPXRfYW5pbWF0aW9uU0JTX19nZXRBbmltRWxzT25WaWV3KGUuZWxlbWVudHMpLHIsbz0vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7aWYoIlJlc2l6ZU9ic2VydmVyImluIHdpbmRvdyl7dmFyIHM9dF9hbmltYXRpb25TQlNfX2dldEFsbEJyZWFrcG9pbnRzKCksbDt0X2FuaW1hdGlvblNCU19fY3JlYXRlUmVzaXplT2JzZXJ2ZXIoe2JyZWFrcG9pbnRzOnMsY3VycmVudFJlczp0X2FuaW1hdGlvblNCU19fZ2V0Q3VycmVudFJlcyhzLG8pLGlzTW9iaWxlOm99LGQpfWVsc2Ugbz93aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZCgpfSksMzAwKX0pKTp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixkKTt2YXIgXz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudDM5NiIpLGM7aWYoQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChfLChmdW5jdGlvbih0KXt0LmFkZEV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIixkKX0pKSx3aW5kb3cudF9hbmltYXRpb25TQlNfX2lzU2FmYXJpKXtmdW5jdGlvbiBtKCl7MCE9PXdpbmRvdy5wYWdlWU9mZnNldCYmZCgpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLG0pfXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLG0pfXRfYW5pbWF0aW9uU0JTX190cmlnZ2VyTm9TY3JvbGxBbmltYXRpb24oZSxhKSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hbmltYXRlLXNicy1ldmVudD0ic2Nyb2xsIl0nKS5sZW5ndGgmJih0X2FuaW1hdGlvblNCU19fdHJpZ2dlclNjcm9sbEFuaW0oZSksdF9hbmltYXRpb25TQlNfX2NoZWNrRnJhbWUoZSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXt0X2FuaW1hdGlvblNCU19fY2hhbmdlRWxWYWx1ZXMoZSl9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXsiY29tcGxldGUiIT09ZG9jdW1lbnQucmVhZHlTdGF0ZSYmdF9hbmltYXRpb25TQlNfX2NoYW5nZUVsVmFsdWVzKGUpfSksM2UzKX1mdW5jdGlvbiBkKCl7Y2xlYXJUaW1lb3V0KHIpLHI9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1hbmltYXRlLXNicy1ldmVudF0iKSk7dF9hbmltYXRpb25TQlNfX3VwZGF0ZUFuaW1hdGVkT2JqZWN0U3RhdGUoZSwiZWxlbWVudHMiLHQpLHRfYW5pbWF0aW9uU0JTX193cmFwQW5kVXBkYXRlRWxPblJlc2l6ZShlLmVsZW1lbnRzKSx0X2FuaW1hdGlvblNCU19fY2FjaGVBbmRTZXREYXRhKGUpLHRfYW5pbWF0aW9uU0JTX190cmlnZ2VyU2Nyb2xsQW5pbShlKSxhPXRfYW5pbWF0aW9uU0JTX19nZXRBbmltRWxzT25WaWV3KGUuZWxlbWVudHMpLHRfYW5pbWF0aW9uU0JTX190cmlnZ2VyTm9TY3JvbGxBbmltYXRpb24oZSxhKSx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXMoZSl9KSw1MDApfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0QW5pbUVsc09uVmlldyh0KXtyZXR1cm4gdC5maWx0ZXIoKGZ1bmN0aW9uKHQpe3ZhciBlPSJkYXRhLWFuaW1hdGUtc2JzLWV2ZW50IjtyZXR1cm4iaW50b3ZpZXciPT09dC5nZXRBdHRyaWJ1dGUoZSl8fCJibG9ja2ludG92aWV3Ij09PXQuZ2V0QXR0cmlidXRlKGUpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBbGxCcmVha3BvaW50cygpe3ZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yIC50Mzk2X19hcnRib2FyZCIpKSxlPVtdO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXRfYW5pbWF0aW9uU0JTX19nZXRSZXNPcHRzKHQpLGk9bi5icmVha3BvaW50cy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybi0xPT09ZS5pbmRleE9mKHQpfSkpOy0xPT09KGU9ZS5jb25jYXQoaSkpLmluZGV4T2Yobi5yZXNNYXgpJiZlLnB1c2gobi5yZXNNYXgpfSkpLGUuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS10fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRDdXJyZW50UmVzKHQsZSl7dmFyIG4saT1lfHwib250b3VjaGVuZCJpbiBkb2N1bWVudCYmLTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkFwcGxlV2ViS2l0Iik/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOndpbmRvdy5pbm5lcldpZHRoO3JldHVybiB0LmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiBpPnR9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZUFuaW1hdGVkT2JqZWN0U3RhdGUodCxlLG4pe3RbZV09bn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0S2V5Rm9yQW5pbWF0ZWRPYmplY3QodCxlLG4pe3RbZV18fHRfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKHQsZSxuKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY3JlYXRlUmVzaXplT2JzZXJ2ZXIodCxlKXt2YXIgbj1kb2N1bWVudC5ib2R5LmdldENsaWVudFJlY3RzKCksaT1uWzBdLmhlaWdodCxhO25ldyBSZXNpemVPYnNlcnZlcigoZnVuY3Rpb24oYSl7YS5mb3JFYWNoKChmdW5jdGlvbihhKXtpZighZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInQtYm9keV9zY3JvbGwtbG9ja2VkIikmJiFkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygidC1ib2R5X3BvcHVwc2hvd2VkIikpe3ZhciByPXRfYW5pbWF0aW9uU0JTX19nZXRDdXJyZW50UmVzKHQuYnJlYWtwb2ludHMsdC5pc01vYmlsZSk7YS5jb250ZW50UmVjdC5oZWlnaHQ9PT1pJiZ0LmN1cnJlbnRSZXM9PT1yfHwodC5jdXJyZW50UmVzPXIsaT1uWzBdLmhlaWdodCxlKCkpfX0pKX0pKS5vYnNlcnZlKGRvY3VtZW50LmJvZHkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jaGFuZ2VFbFZhbHVlcyh0KXt0LmVsZW1lbnRzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2RvY3VtZW50LmNvbnRhaW5zKGUpJiYodF9hbmltYXRpb25TQlNfX3NldEFuZENhY2hlRWxUb3BQb3MoZSx0KSwic2Nyb2xsIj09PWUuYW5pbVR5cGUmJnRfYW5pbWF0aW9uU0JTX191cGRhdGVTdGVwc1ZhbHVlcyhlKSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NoZWNrRnJhbWUodCl7dmFyIGU7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUmJih0X2FuaW1hdGlvblNCU19fY2hlY2tQb3NDaGFuZ2VzKHQpJiZ0X2FuaW1hdGlvblNCU19fdHJpZ2dlclNjcm9sbEFuaW0odCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe3RfYW5pbWF0aW9uU0JTX19jaGVja0ZyYW1lKHQpfSkpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2hlY2tQb3NDaGFuZ2VzKHQpe3ZhciBlPXQuc2Nyb2xsVG9wLG49d2luZG93LnBhZ2VZT2Zmc2V0O3JldHVybiBuPDAmJndpbmRvdy50X2FuaW1hdGlvblNCU19faXNTYWZhcmkmJihuPTApLHRfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKHQsInNjcm9sbFRvcCIsbiksZSE9PW59ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3RyaWdnZXJTY3JvbGxBbmltKHQpe3QuZWxlbWVudHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoInNjcm9sbCI9PT1lLmFuaW1UeXBlKXt2YXIgbj17b3BhY2l0eToxLGJsdXI6MCxmaXg6ITEsZml4ZWRTaGlmdFk6MCx0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHNjYWxlWDoxLHNjYWxlWToxLHJvdGF0ZTowfTt0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uQ2hlY2tTdGVwcyh0LGUsbiksdF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvblVwZGF0ZVRyYW5zZm9ybShlLG4pfX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uQ2hlY2tTdGVwcyh0LGUsbil7ZS5zdGVwcy5mb3JFYWNoKChmdW5jdGlvbihpLGEpe3ZhciByPXQuc2Nyb2xsVG9wK2UudHJpZ2dlck9mZnNldCxvPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKGUpO2Uuc2NhbGVkRGlmZmVyZW5jZSYmKHIrPWUuc2NhbGVkRGlmZmVyZW5jZSk7dmFyIHM9cj49aS5zdGFydCxsPXI8aS5zdGFydCxfPWkuZW5kPD1yLGM9aS5lbmQ+cjtpZihzJiZjKXtpLnN0YXRlPSJzdGFydGVkIixlLndyYXBwZXJFbCYmKGUud3JhcHBlckVsLnN0eWxlLndpbGxDaGFuZ2U9InRyYW5zZm9ybSIpO3ZhciBtPXItaS5zdGFydCxkPTA9PT1pLmRpc3Q/MTptL2kuZGlzdDtuLnByZXZVbmZpeGVkRGlzdD1pLnByZXZVbmZpeGVkRGlzdCx0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uQ2FsY1N0ZXBTdHlsZXMobixpLGQsYSxvKX1fJiYoaS5zdGF0ZT0iZmluaXNoZWQiLGUud3JhcHBlckVsJiYoZS53cmFwcGVyRWwuc3R5bGUud2lsbENoYW5nZT0iIiksdF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNhbGNTdGVwU3R5bGVzKG4saSwxLGEsbykpLCFsfHwic3RhcnRlZCIhPT1pLnN0YXRlJiYiZmluaXNoZWQiIT09aS5zdGF0ZXx8KGkuc3RhdGU9InVuYWN0aXZlIixlLndyYXBwZXJFbCYmKGUud3JhcHBlckVsLnN0eWxlLndpbGxDaGFuZ2U9IiIpLHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25DYWxjU3RlcFN0eWxlcyhuLGksMCxhLG8pKX0pKSxlLmNsYXNzTGlzdC5yZW1vdmUoInQzOTZfX2VsZW0tLWFuaW0taGlkZGVuIiksZS5zdGVwc1sxXSYmMD09PWUuc3RlcHNbMV0uZGlzdCYmMD09PWUuc3RlcHNbMV0uc3R5bGVzLm9wYWNpdHkmJiJ1bmFjdGl2ZSI9PT1lLnN0ZXBzWzFdLnN0YXRlJiYobi5vcGFjaXR5PTApfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25DYWxjU3RlcFN0eWxlcyh0LGUsbixpLGEpe2lmKCEwPT09ZS5zdHlsZXMuZml4JiYic3RhcnRlZCI9PT1lLnN0YXRlJiYodC5maXg9ITAsdC5maXhlZFNoaWZ0WT0wKSwhMD09PWUuc3R5bGVzLmZpeCYmImZpbmlzaGVkIj09PWUuc3RhdGUmJih0LmZpeD0hMSx0LmZpeGVkU2hpZnRZKz1lLmRpc3QvYSksITA9PT1lLnN0eWxlcy5maXgmJiJ1bmFjdGl2ZSI9PT1lLnN0YXRlKXtpZihpPjAmJiEwPT09dC5maXgpcmV0dXJuO3QuZml4PSExfXQub3BhY2l0eSs9biooZS5zdHlsZXMub3BhY2l0eS10Lm9wYWNpdHkpLHQuYmx1cis9biooZS5zdHlsZXMuYmx1ci10LmJsdXIpLHQudHJhbnNsYXRlWCs9biplLnN0eWxlcy5tb3ZlWCx0LnRyYW5zbGF0ZVkrPW4qZS5zdHlsZXMubW92ZVksdC5zY2FsZVgrPW4qKGUuc3R5bGVzLnNjYWxlWC10LnNjYWxlWCksdC5zY2FsZVkrPW4qKGUuc3R5bGVzLnNjYWxlWS10LnNjYWxlWSksdC5yb3RhdGUrPW4qZS5zdHlsZXMucm90YXRlfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25VcGRhdGVUcmFuc2Zvcm0odCxlKXtpZih0LndyYXBwZXJFbCl7dmFyIG49dF9hbmltYXRpb25TQlNfX2dldFpvb20odCksaT1nZXRDb21wdXRlZFN0eWxlKHQpLndpbGxDaGFuZ2UsYT13aW5kb3cuaXNPbmx5U2NhbGFibGV8fHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCk7aWYoITA9PT1lLmZpeCYmImZpeGVkIiE9PXQud3JhcHBlckVsLnN0eWxlLnBvc2l0aW9uKXt2YXIgcj10LnRyaWdnZXJPZmZzZXQtZS5wcmV2VW5maXhlZERpc3Q7YXx8KHIvPW4pLHQuc2NhbGVkRGlmZmVyZW5jZSYmKHIrPXQuc2NhbGVkRGlmZmVyZW5jZSksdC53cmFwcGVyRWwuc3R5bGUudG9wPXIrInB4Iix0LndyYXBwZXJFbC5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLGkmJiJhdXRvIiE9PWkmJih0LnN0eWxlLndpbGxDaGFuZ2U9InVuc2V0IiksdC56SW5kZXgmJih0LndyYXBwZXJFbC5zdHlsZS56SW5kZXg9dC56SW5kZXgpfSExPT09ZS5maXgmJiJmaXhlZCI9PT10LndyYXBwZXJFbC5zdHlsZS5wb3NpdGlvbiYmKHQud3JhcHBlckVsLnN0eWxlLnBvc2l0aW9uPSIiLHQud3JhcHBlckVsLnN0eWxlLnRvcD0iIix0LndyYXBwZXJFbC5zdHlsZS56SW5kZXg9IiIsdC56SW5kZXgmJih0LnN0eWxlLnpJbmRleD10LnpJbmRleCksdC5zdHlsZS53aWxsQ2hhbmdlPSIiKSx0LndyYXBwZXJFbC5zdHlsZS5vcGFjaXR5PWUub3BhY2l0eS50b1N0cmluZygpO3ZhciBvPSIiO2lmKGUudHJhbnNsYXRlWCl7dmFyIHM9ZS50cmFuc2xhdGVYO2EmJihzKj1uKSxvKz0idHJhbnNsYXRlWCgiK3MudG9GaXhlZCgyKSsicHgpIn1pZigwIT09ZS50cmFuc2xhdGVZfHwwIT09ZS5maXhlZFNoaWZ0WSl7dmFyIGw9ZS50cmFuc2xhdGVZK2UuZml4ZWRTaGlmdFk7YSYmKGwqPW4pLG8rPSJ0cmFuc2xhdGVZKCIrbC50b0ZpeGVkKDIpKyJweCkifTE9PT1lLnNjYWxlWCYmMT09PWUuc2NhbGVZfHwobys9InNjYWxlKCIrZS5zY2FsZVgrIiwiK2Uuc2NhbGVZKyIpIiksMCE9PWUucm90YXRlJiYobys9InJvdGF0ZSgiK2Uucm90YXRlKyJkZWcpIiksdC53cmFwcGVyRWwuc3R5bGUudHJhbnNmb3JtPW98fCJzY2FsZSgxKSJ9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lcyh0KXt2YXIgZT0iIjtpZih0LmVsZW1lbnRzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCJzY3JvbGwiIT09dC5hbmltVHlwZSl7dmFyIG49e3RpbWVEdXJhdGlvbjowfSxpPVtdLGE9dF9hbmltYXRpb25TQlNfX2NyZWF0ZUVtcHR5U3R5bGVPcHRpb25zRm9yS2V5ZnJhbWVzKHQuc3RlcHMpO3RfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29tYmluZU9iamVjdHModC5zdGVwcyxpLG4sYSksdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19jb3JyZWN0RnJhbWVzKGkpLHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY291bnRQZXJjZW50KGksbiksdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19jb3JyZWN0T3BhY2l0eU9uRmlyc3RTdGVwKHQsaSk7dmFyIHI9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRUeHRTdHlsZXModCxpKSxvO2lmKG4udGltZUR1cmF0aW9uLz0xZTMscilpZihlKz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldEZpbmFsQ3NzKHQsbixyKSwiaG92ZXIiPT09dC5hbmltVHlwZXx8ImNsaWNrIj09PXQuYW5pbVR5cGUpKCF0Lmxvb3B8fCJsb29wd2l0aHJldmVyc2UiPT09dC5sb29wKSYmKGUrPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0UmV2ZXJzZUFuaW0odCkpfX0pKSxlKXtpZih0LmlzRWRpdE1vZGUpcmV0dXJuIGU7dmFyIG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnNicy1hbmltLWtleWZyYW1lcyIpO24/bi50ZXh0Q29udGVudCE9PWUmJihuLnRleHRDb250ZW50PWUpOigobj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpKS5jbGFzc0xpc3QuYWRkKCJzYnMtYW5pbS1rZXlmcmFtZXMiKSxuLnRleHRDb250ZW50PWUsZG9jdW1lbnQuaGVhZC5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsbikpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY3JlYXRlRW1wdHlTdHlsZU9wdGlvbnNGb3JLZXlmcmFtZXModCl7cmV0dXJue21vdmVYOnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dC5zdHlsZXMubW92ZVh9KSksbW92ZVk6dC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10LnN0eWxlcy5tb3ZlWX0pKSxzY2FsZVg6dC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10LnN0eWxlcy5zY2FsZVh9KSksc2NhbGVZOnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5zdHlsZXMuc2NhbGVZfSkpLHJvdGF0ZTp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuc3R5bGVzLnJvdGF0ZX0pKSxibHVyOnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dC5zdHlsZXMuYmx1cn0pKSxvcGFjaXR5OnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5zdHlsZXMub3BhY2l0eX0pKSxmaXg6dC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuITE9PT10LnN0eWxlcy5maXh9KSl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29tYmluZU9iamVjdHModCxlLG4saSl7dC5mb3JFYWNoKChmdW5jdGlvbihhLHIpe3ZhciBvPXt9O2Zvcih2YXIgcyBpbiBvLnN0eWxlcz1hLnN0eWxlcyxpKWlbc10mJmRlbGV0ZSBvLnN0eWxlc1tzXTsie30iIT09SlNPTi5zdHJpbmdpZnkoby5zdHlsZXMpJiYoby50aW1lPTEqYS50aW1lfHwwLHIhPT10Lmxlbmd0aC0xJiYoby5lYXNlPXRbcisxXS5lYXNlKSxlLnB1c2gobyksbi50aW1lRHVyYXRpb24rPW8udGltZSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19jb3JyZWN0RnJhbWVzKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt2YXIgaT1uPT09dC5sZW5ndGgtMSxhPTA9PT1uLHI9aT9udWxsOnRbbisxXSxvPWE/bnVsbDp0W24tMV07Zm9yKHZhciBzIGluIGUuc3R5bGVzKWF8fHMgaW4gby5zdHlsZXN8fHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fYWRkU3R5bGVUb0tleWZyYW1lKGUsbyxzLDApLGl8fChzIGluIHIuc3R5bGVzPyJtb3ZlWCIhPT1zJiYibW92ZVkiIT09cyYmInJvdGF0ZSIhPT1zfHx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX3JlY2FsY3VsYXRlVmFsdWUoZSxyLHMpOnRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fYWRkU3R5bGVUb0tleWZyYW1lKGUscixzLDEpKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2FkZFN0eWxlVG9LZXlmcmFtZSh0LGUsbixpKXsiYmx1ciIhPT1uJiYicm90YXRlIiE9PW4mJiJtb3ZlWCIhPT1uJiYibW92ZVkiIT09bnx8KGUuc3R5bGVzW25dPTA9PT1pPzA6dC5zdHlsZXNbbl0pLCJvcGFjaXR5IiE9PW4mJiJzY2FsZVgiIT09biYmInNjYWxlWSIhPT1ufHwoZS5zdHlsZXNbbl09MD09PWk/MTp0LnN0eWxlc1tuXSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19yZWNhbGN1bGF0ZVZhbHVlKHQsZSxuKXtzd2l0Y2gobil7Y2FzZSJyb3RhdGUiOmUuc3R5bGVzLnJvdGF0ZSs9dC5zdHlsZXMucm90YXRlO2JyZWFrO2Nhc2UibW92ZVgiOmUuc3R5bGVzLm1vdmVYKz10LnN0eWxlcy5tb3ZlWDticmVhaztjYXNlIm1vdmVZIjplLnN0eWxlcy5tb3ZlWSs9dC5zdHlsZXMubW92ZVl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY291bnRQZXJjZW50KHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl0sYTtpZigwPT09bikwPT09ZS50aW1lRHVyYXRpb24/aS5wZXJjZW50PTA6KGE9KDEwMCppLnRpbWUvZS50aW1lRHVyYXRpb24pLnRvRml4ZWQoMiksaS5wZXJjZW50PXBhcnNlRmxvYXQoYSkpO2Vsc2UgaWYobj09PXQubGVuZ3RoLTEpaS5wZXJjZW50PTEwMDtlbHNle3ZhciByPXRbbi0xXS5wZXJjZW50O2lmKDA9PT1lLnRpbWVEdXJhdGlvbilpLnBlcmNlbnQ9MDtlbHNle2lmKGE9KDEwMCppLnRpbWUvZS50aW1lRHVyYXRpb24rcikudG9GaXhlZCgyKSwxMDA9PT1wYXJzZUludChhLDEwKSYmbj09PXQubGVuZ3RoLTImJjAhPT1uKWNvbnRpbnVlO2kucGVyY2VudD1wYXJzZUZsb2F0KGEpfWkucGVyY2VudD09PXImJihpLnBlcmNlbnQrPTEpLGkucGVyY2VudD4xMDAmJihpLnBlcmNlbnQ9OTkpfX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19jb3JyZWN0T3BhY2l0eU9uRmlyc3RTdGVwKHQsZSl7dmFyIG49ZVsxXTt0JiZ0LmNsYXNzTGlzdC5yZW1vdmUoInQzOTZfX2VsZW0tLWFuaW0taGlkZGVuIik7dmFyIGk9dD90LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIik6bnVsbDtuJiYwPT09bi50aW1lJiYwPT09bi5zdHlsZXMub3BhY2l0eT8oaSYmKGkuc3R5bGUub3BhY2l0eT0iMCIpLGVbMF0uc3R5bGVzLm9wYWNpdHk9MCk6aSYmIjAiPT09aS5zdHlsZS5vcGFjaXR5JiZpJiYoaS5zdHlsZS5vcGFjaXR5PSIiKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldFR4dFN0eWxlcyh0LGUpe3ZhciBuPSIiO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuY2hhbmdlc3x8KGUuY2hhbmdlcz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldEZyYW1lQ2hhbmdlcyh0LGUpKSxuKz0ibnVtYmVyIj09dHlwZW9mIGUucGVyY2VudD9lLnBlcmNlbnQrIiUgeyIrZS5jaGFuZ2VzKyJ9XG4iOiIifSkpLG59ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19zaG91bGRVc2Vab29tKHQsZSl7dmFyIG4saTtpZih0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpKXJldHVybiF0Mzk2X19pc0luc2lkZUdyb3VwV2l0aFpvb20odCk7dmFyIGEscj10X2FuaW1hdGlvblNCU19fZ2V0U2NhbGVXcmFwcGVyKHQucXVlcnlTZWxlY3RvcigiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpKTtyZXR1cm4hKDEhPT1lJiYhcil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRGcmFtZUNoYW5nZXModCxlKXt2YXIgbj0iIixpPSIiLGE9e3g6MSx5OjEsY2hhbmdlZDohMX0scj0xLG89dDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KTsod2luZG93LmlzT25seVNjYWxhYmxlfHxvKSYmKHI9dF9hbmltYXRpb25TQlNfX2dldFpvb20odCkpO3ZhciBzPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fc2hvdWxkVXNlWm9vbSh0LHIpO2Zvcih2YXIgbCBpbiBzfHwocj0xKSxlLnN0eWxlcylzd2l0Y2gobCl7Y2FzZSJvcGFjaXR5IjpuKz0ib3BhY2l0eToiK2Uuc3R5bGVzLm9wYWNpdHkrIjsiO2JyZWFrO2Nhc2Uic2NhbGVYIjphLng9ZS5zdHlsZXMuc2NhbGVYLGEuY2hhbmdlZD0hMDticmVhaztjYXNlInNjYWxlWSI6YS55PWUuc3R5bGVzLnNjYWxlWSxhLmNoYW5nZWQ9ITA7YnJlYWs7Y2FzZSJtb3ZlWCI6aSs9InRyYW5zbGF0ZVgoIitNYXRoLnJvdW5kKGUuc3R5bGVzLm1vdmVYKnIpKyJweCkiO2JyZWFrO2Nhc2UibW92ZVkiOmkrPSJ0cmFuc2xhdGVZKCIrTWF0aC5yb3VuZChlLnN0eWxlcy5tb3ZlWSpyKSsicHgpIjticmVhaztjYXNlInJvdGF0ZSI6aSs9InJvdGF0ZSgiK2Uuc3R5bGVzLnJvdGF0ZSsiZGVnKSJ9aWYoITA9PT1hLmNoYW5nZWQmJihpKz0ic2NhbGUoIithLngrIiwiK2EueSsiKSIpLCIiIT09aSYmKG4rPSJ0cmFuc2Zvcm06IitpKyI7Iiksdm9pZCAwIT09ZS5lYXNlKXN3aXRjaChuKz0iYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjoiLGUuZWFzZSl7Y2FzZSJlYXNlSW4iOm4rPSJlYXNlLWluOyI7YnJlYWs7Y2FzZSJlYXNlT3V0IjpuKz0iZWFzZS1vdXQ7IjticmVhaztjYXNlImVhc2VJbk91dCI6bis9ImVhc2UtaW4tb3V0OyI7YnJlYWs7Y2FzZSJib3VuY2VGaW4iOm4rPSJjdWJpYy1iZXppZXIoMC4zNCwxLjYxLDAuNywxKTsiO2JyZWFrO2RlZmF1bHQ6bis9IiI9PT1lLmVhc2UudHJpbSgpPyJsaW5lYXI7IjplLmVhc2UrIjsifXJldHVybiBufWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0RmluYWxDc3ModCxlLG4pe3ZhciBpPSIiLGE9dC51bmlxdWVJRCxyPSIudC1zYnMtYW5pbV9zdGFydGVkICMiK3QudW5pcXVlSUQsbzsicHVibGlzaGVkIiE9PXdpbmRvdy50aWxkYW1vZGUmJih0LnRpbWVEdXJhdGlvbj1lLnRpbWVEdXJhdGlvbiksaSs9cisiIHtcbmFuaW1hdGlvbjogIithKyIgIisoMD09PWUudGltZUR1cmF0aW9uPzFlLTU6ZS50aW1lRHVyYXRpb24pKyJzIjt2YXIgcz10Lmxvb3AmJi0xIT09dC5sb29wLmluZGV4T2YoImxvb3AiKTtyZXR1cm4gcyYmKGkrPSIgaW5maW5pdGUiKSxpKz0iIGxpbmVhciIscz8ibG9vcHdpdGhyZXZlcnNlIj09PXQubG9vcCYmKGkrPSIgYWx0ZXJuYXRlIik6aSs9IiBmb3J3YXJkcyIsaSs9IjtcbmJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuQGtleWZyYW1lcyAiK2ErIiB7XG4iK24rIn1cblxuIn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldFJldmVyc2VBbmltKHQpe3ZhciBlPXRfYW5pbWF0aW9uU0JTX19nZXRBdHRyaWJ1dGVTZWxlY3Rvcih0KSxuLGksYT0iWyIrZS5hdHRyaWJ1dGUrJz0iJytlLmlkKyciXScscjtyZXR1cm4iIyIrKHQuY2xvc2VzdCgiLnQtcmVjIik/dC5jbG9zZXN0KCIudC1yZWMiKS5nZXRBdHRyaWJ1dGUoImlkIik6IiIpKyIgIithKyIudC1zYnMtYW5pbV9zdGFydGVkLnQtc2JzLWFuaW1fcmV2ZXJzZWQgLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIgey13ZWJraXQtYW5pbWF0aW9uLWRpcmVjdGlvbjogcmV2ZXJzZTthbmltYXRpb24tZGlyZWN0aW9uOiByZXZlcnNlO30ifWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBdHRyaWJ1dGVTZWxlY3Rvcih0KXt2YXIgZT17ZmVlZDoiZGF0YS1mZS1lbGVtLWlkIixncm91cDoiZGF0YS1ncm91cC1pZCIsZWxlbWVudDoiZGF0YS1lbGVtLWlkIn0sbj1PYmplY3Qua2V5cyhlKS5maW5kKChmdW5jdGlvbihuKXtyZXR1cm4gdC5oYXNBdHRyaWJ1dGUoZVtuXSl9KSk7cmV0dXJuIG4mJmVbbl0/e2F0dHJpYnV0ZTplW25dLGlkOnQuZ2V0QXR0cmlidXRlKGVbbl0pfHwiIn06e2F0dHJpYnV0ZToiIixpZDoiIn19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldEFuaW1PcHRpb25zKHQsZSxuKXtpZighdClyZXR1cm4iIjt2YXIgaT1bInNicyIsIm9wdHMiXTtufHwobj0iZWRpdCI9PT1lP2kuam9pbigiIik6aS5qb2luKCItIikpO3ZhciBhPSJlZGl0Ij09PWU/ImZpZWxkIjoiYW5pbWF0ZSIscj0iZWRpdCI9PT1lPyItdmFsdWUiOiIiLG89ImVkaXQiPT09ZT8iZGF0YS1maWVsZC1hbmltbW9iaWxlLXZhbHVlIjoiZGF0YS1hbmltYXRlLW1vYmlsZSIscz0ieSI9PT10LmdldEF0dHJpYnV0ZShvKSxsLF89dF9hbmltYXRpb25TQlNfX2dldFJlc09wdHModC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSksYz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVBdHRyKGEsbixyLCExKTtpZihfLnJlcz09PV8ucmVzTWF4KXJldHVybiB0LmdldEF0dHJpYnV0ZShjKTtpZighcyYmImVkaXQiIT09ZSYmXy5yZXM8MTIwMClyZXR1cm4gdC5zdHlsZS50cmFuc2l0aW9uPSJub25lIix0LmNsYXNzTGlzdC5yZW1vdmUoInQzOTZfX2VsZW0tLWFuaW0taGlkZGVuIiksIiI7dmFyIG09dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlQXR0cihhLG4scixfLnJlcyksZD10LmdldEF0dHJpYnV0ZShtKTtyZXR1cm4gZHx8KF8uYnJlYWtwb2ludHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoIShlPD1fLnJlc3x8ZCkpe3ZhciBpPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUF0dHIoYSxuLHIsZSk7ZD10LmdldEF0dHJpYnV0ZShpKX19KSksZHx8dC5nZXRBdHRyaWJ1dGUoYyl8fCIiKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVBdHRyKHQsZSxuLGkpe3ZhciBhPSJkYXRhLSIrdCsiLSIrZTtyZXR1cm4gaSYmKGErPSItcmVzLSIraSksYSs9bn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0UmVzT3B0cyh0KXt2YXIgZT1bMTIwMCw5NjAsNjQwLDQ4MCwzMjBdO2lmKCF3aW5kb3cudG4pe3ZhciBuLGk9d2luZG93LmlubmVyV2lkdGg7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7bnx8aT49dCYmKG49dCl9KSkse3JlczpufHwzMjAscmVzTWF4OjEyMDAsYnJlYWtwb2ludHM6WzMyMCw0ODAsNjQwLDk2MF19fXZhciBhPXQ/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKToiIixuO3JldHVybiBhJiZ3aW5kb3cudG5bImFiIithXT97cmVzOndpbmRvdy50Mzk2X2RldGVjdFJlc29sdXRpb24/dDM5Nl9kZXRlY3RSZXNvbHV0aW9uKGEpOndpbmRvdy50blsiYWIiK2FdLmN1clJlc29sdXRpb24scmVzTWF4OndpbmRvdy50blsiYWIiK2FdLmN1clJlc29sdXRpb25fbWF4LGJyZWFrcG9pbnRzOndpbmRvdy50blsiYWIiK2FdLnNjcmVlbnMuc2xpY2UoMCwtMSl9OndpbmRvdy50bi5zY3JlZW5zP3tyZXM6d2luZG93LnRuLmN1clJlc29sdXRpb24scmVzTWF4OndpbmRvdy50bi50b3BSZXNvbHV0aW9uLGJyZWFrcG9pbnRzOndpbmRvdy50bi5zY3JlZW5zLnNsaWNlKDAsLTEpfTp7cmVzOm49dF9hbmltYXRpb25TQlNfX2dldEN1cnJlbnRSZXMoZSx3aW5kb3cuaXNNb2JpbGUpLHJlc01heDoxMjAwLGJyZWFrcG9pbnRzOlszMjAsNDgwLDY0MCw5NjBdfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2FjaGVBbmRTZXREYXRhKHQpe3QuZWxlbWVudHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKTtpZigic2Nyb2xsIiE9PWUuYW5pbVR5cGV8fCFufHwiZml4ZWQiIT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShuLCJwb3MiKSl7dmFyIGk9dC5pc0VkaXRNb2RlPyJkYXRhLWZpZWxkLXNic2V2ZW50LXZhbHVlIjoiZGF0YS1hbmltYXRlLXNicy1ldmVudCI7ZS5hbmltVHlwZT1lLmdldEF0dHJpYnV0ZShpKTt2YXIgYT10LmlzRWRpdE1vZGU/ImRhdGEtZmllbGQtc2JzdHJnLXZhbHVlIjoiZGF0YS1hbmltYXRlLXNicy10cmciO2UudHJpZ2dlcj1wYXJzZUZsb2F0KGUuZ2V0QXR0cmlidXRlKGEpKSxpc05hTihlLnRyaWdnZXIpJiYoZS50cmlnZ2VyPTEpLGUudHJpZ2dlckVsZW1zPXRfYW5pbWF0aW9uU0JTX19nZXRBbmltT3B0aW9ucyhlLCJwdWJsaXNoZWQiLCJzYnMtdHJnZWxzIiksZS53cmFwcGVyRWw9ZS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpO3ZhciByPXRfYW5pbWF0aW9uU0JTX19nZXRBbmltT3B0aW9ucyhlLHQuaXNFZGl0TW9kZT8iZWRpdCI6InB1Ymxpc2hlZCIsbnVsbCk7aWYoZS5zdGF0dXM9cj8iYWN0aXZlIjoiaW5uYWN0aXZlIiwiaW5uYWN0aXZlIiE9PWUuc3RhdHVzKXstMSE9PXIuaW5kZXhPZigiZml4ZWQiKSYmKGUuekluZGV4PWdldENvbXB1dGVkU3R5bGUoZSkuZ2V0UHJvcGVydHlWYWx1ZSgiei1pbmRleCIpKSxyPXIucmVwbGFjZSgvJy9nLCciJyksdF9hbmltYXRpb25TQlNfX2FkZERlbGF5VG9TdGVwcyhyPUpTT04ucGFyc2UocikpO3ZhciBvPXQuaXNFZGl0TW9kZT8iZGF0YS1maWVsZC1zYnNsb29wLXZhbHVlIjoiZGF0YS1hbmltYXRlLXNicy1sb29wIjtlLmxvb3A9ZS5nZXRBdHRyaWJ1dGUobyl8fCIiLHRfYW5pbWF0aW9uU0JTX19zZXRBbmRDYWNoZUVsVG9wUG9zKGUsdCk7dmFyIHM9dF9hbmltYXRpb25TQlNfX2dldFpvb20oZSk7ZS5zdGVwcz1bXTt2YXIgbD0wO3IuZm9yRWFjaCgoZnVuY3Rpb24odCxuKXt2YXIgaT17c3RhdGU6InVuYWN0aXZlIn07aS5zdHlsZXM9dF9hbmltYXRpb25TQlNfX2NyZWF0ZVN0ZXBTdHlsZXModCksInNjcm9sbCI9PT1lLmFuaW1UeXBlPyhpLnByZXZVbmZpeGVkRGlzdD1sLGkuZGlzdD10LmRpKnMsITE9PT1pLnN0eWxlcy5maXgmJihsKz1pLmRpc3QpLGkuc3RhcnQ9MD09PW4/ZS50b3BPZmZzZXQ6ZS5zdGVwc1tuLTFdLmVuZCxpLmVuZD1pLnN0YXJ0K2kuZGlzdCk6KGkudGltZT10LnRpLGkuZWFzZT10LmVhKSxlLnN0ZXBzLnB1c2goaSl9KSksIWUud3JhcHBlckVsfHxlLndyYXBwZXJFbC5pZCYmZS51bmlxdWVJRHx8dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlVW5pcXVlSURGb3JFbChlKSx0X2FuaW1hdGlvblNCU19fdXBkYXRlSW5mb09uSW1nTG9hZChlLHQpLHRfYW5pbWF0aW9uU0JTX191cGRhdGVNb3ZlQW5kUm90YXRlU3RlcHNTdHlsZXMoZS5zdGVwcyl9fX0pKTt2YXIgZT10LmVsZW1lbnRzLmZpbHRlcigoZnVuY3Rpb24odCl7aWYoImlubmFjdGl2ZSI9PT10LnN0YXR1cyl7dmFyIGU9dF9hbmltYXRpb25TQlNfX2dldFNpemVCYXNlZE9uRGltZW5zaW9uTW9kZSh0KSxuPWUud2lkdGgsaT1lLmhlaWdodDt0LndyYXBwZXJFbCYmdC53cmFwcGVyRWwucmVtb3ZlQXR0cmlidXRlKCJzdHlsZSIpLHQud3JhcHBlckVsJiYodC53cmFwcGVyRWwuc3R5bGUuZGlzcGxheT0iaW5oZXJpdCIpLHQud3JhcHBlckVsJiYodC53cmFwcGVyRWwuc3R5bGUud2lkdGg9biksdC53cmFwcGVyRWwmJih0LndyYXBwZXJFbC5zdHlsZS5oZWlnaHQ9aSl9cmV0dXJuImlubmFjdGl2ZSIhPT10LnN0YXR1c30pKTt0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZSh0LCJlbGVtZW50cyIsZSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlVW5pcXVlSURGb3JFbCh0KXt2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCwgLnRuLWFydGJvYXJkIiksbj0iIjtlJiYobj1lLmdldEF0dHJpYnV0ZSgiZGF0YS1yZWNvcmQtaWQiKXx8ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSk7dmFyIGksYT10X2FuaW1hdGlvblNCU19fZ2V0QXR0cmlidXRlU2VsZWN0b3IodCkuaWQ7dC51bmlxdWVJRD0ic2JzLSIrbisiLSIrYSx0LndyYXBwZXJFbC5pZD10LnVuaXF1ZUlEfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVJbmZvT25JbWdMb2FkKHQsZSl7dmFyIG49dC5xdWVyeVNlbGVjdG9yKCJpbWciKTtuJiYobi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXt0X2FuaW1hdGlvblNCU19fdXBkYXRlVmFsdWVzQXRlcklNR0xvYWRpbmcodCxlKX0pKSxuLmNvbXBsZXRlJiZ0X2FuaW1hdGlvblNCU19fdXBkYXRlVmFsdWVzQXRlcklNR0xvYWRpbmcodCxlKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZVZhbHVlc0F0ZXJJTUdMb2FkaW5nKHQsZSl7dF9hbmltYXRpb25TQlNfX3NldEFuZENhY2hlRWxUb3BQb3ModCxlKSwic2Nyb2xsIj09PXQuYW5pbVR5cGUmJnRfYW5pbWF0aW9uU0JTX191cGRhdGVTdGVwc1ZhbHVlcyh0KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdXBkYXRlU3RlcHNWYWx1ZXModCl7dC5zdGVwcy5mb3JFYWNoKChmdW5jdGlvbihlLG4pe2Uuc3RhcnQ9MD09PW4/dC50b3BPZmZzZXQ6dC5zdGVwc1tuLTFdLmVuZCxlLmVuZD1lLnN0YXJ0K2UuZGlzdH0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0QW5kQ2FjaGVFbFRvcFBvcyh0LGUpe3ZhciBuPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKHQpLGksYT1bInNjcm9sbCIsImludG92aWV3IiwiYmxvY2tpbnRvdmlldyJdLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gdC5hbmltVHlwZSE9PWV9KSk7aWYoIWUuaXNFZGl0TW9kZSYmIWEpe3ZhciByPXRfYW5pbWF0aW9uU0JTX19nZXRUb3BPZmZzZXQodCk7cis9dF9hbmltYXRpb25TQlNfX2FjY3VtdWxhdGVQYXJlbnRHcm91cE9mZnNldCh0KSwic2Nyb2xsIiE9PXQuYW5pbVR5cGUmJiJpbnRvdmlldyIhPT10LmFuaW1UeXBlfHx3aW5kb3cuaXNPbmx5U2NhbGFibGV8fHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCl8fChyKj1uKTt2YXIgbz10LmNsb3Nlc3QoIi5yIikscz1vP28uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDowLGw9byYmcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShvKS5wYWRkaW5nVG9wLDEwKXx8MDt0LnBhcmVudFJlY1RvcFBvcz1zLHQudG9wT2Zmc2V0PXMrcitsLHRfYW5pbWF0aW9uU0JTX19zZXRTY2FsZWREaWZmZXJlbmNlKHQsbiksdF9hbmltYXRpb25TQlNfX3NldFRyaWdnZXJPZmZzZXQodCl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRUb3BPZmZzZXQodCl7aWYoIXQpcmV0dXJuIDA7aWYodC5nZXRBdHRyaWJ1dGUoImRhdGEtZmUtZWxlbS1pZCIpKXJldHVybiB0Lm9mZnNldFRvcDt2YXIgZT1wYXJzZUludCh0LnN0eWxlLnRvcCwxMCk7cmV0dXJuIGlzTmFOKGUpP3Qub2Zmc2V0VG9wfHwwOmV9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2FjY3VtdWxhdGVQYXJlbnRHcm91cE9mZnNldCh0KXtmb3IodmFyIGU9MCxuPXQucGFyZW50RWxlbWVudC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtuOyllKz10X2FuaW1hdGlvblNCU19fZ2V0VG9wT2Zmc2V0KG4pLG49bi5wYXJlbnRFbGVtZW50LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO3JldHVybiBlfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRTY2FsZWREaWZmZXJlbmNlKHQsZSl7aWYoIXQuc2NhbGVkRGlmZmVyZW5jZSYmd2luZG93LmlzT25seVNjYWxhYmxlJiYiZml4ZWQiIT09dC53cmFwcGVyRWwuc3R5bGUucG9zaXRpb24mJnQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCkpe3ZhciBuPXQud3JhcHBlckVsP3Qud3JhcHBlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDowLGk9TWF0aC5hYnMoKG4qZS1uKS8yKTtpPU1hdGgucm91bmQoaSksdC5zY2FsZWREaWZmZXJlbmNlPWl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19hZGREZWxheVRvU3RlcHModCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBuPXRbZV07aWYoMCE9PWUmJihwYXJzZUludChuLmRkLDEwKXx8cGFyc2VJbnQobi5kdCwxMCkpKXt2YXIgaT1PYmplY3QuY3JlYXRlKHRbZS0xXSk7dm9pZCAwIT09bi5kdD9pLnRpPW4uZHQ6aS5kaT1uLmRkLHQuc3BsaWNlKGUsMCxpKSxlKyt9fX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdXBkYXRlTW92ZUFuZFJvdGF0ZVN0ZXBzU3R5bGVzKHQpe3ZhciBlPXRbMF0uc3R5bGVzLm1vdmVYLG49dFswXS5zdHlsZXMubW92ZVksaT10WzBdLnN0eWxlcy5yb3RhdGU7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgYT10LnN0eWxlczthLm1vdmVYLT1lLGUrPWEubW92ZVgsYS5tb3ZlWS09bixuKz1hLm1vdmVZLGEucm90YXRlLT1pLGkrPWEucm90YXRlfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jcmVhdGVTdGVwU3R5bGVzKHQpe3JldHVybnttb3ZlWDpwYXJzZUludCh0Lm14LDEwKXx8MCxtb3ZlWTpwYXJzZUludCh0Lm15LDEwKXx8MCxzY2FsZVg6aXNOYU4ocGFyc2VGbG9hdCh0LnN4KSk/MTpwYXJzZUZsb2F0KHQuc3gpLHNjYWxlWTppc05hTihwYXJzZUZsb2F0KHQuc3kpKT8xOnBhcnNlRmxvYXQodC5zeSksb3BhY2l0eTppc05hTihwYXJzZUZsb2F0KHQub3ApKT8xOnBhcnNlRmxvYXQodC5vcCkscm90YXRlOnBhcnNlSW50KHQucm8sMTApfHwwLGJsdXI6cGFyc2VJbnQodC5ibCwxMCl8fDAsZml4OiJmaXhlZCI9PT10LmZpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0VHJpZ2dlck9mZnNldCh0KXt2YXIgZT13aW5kb3cuaW5uZXJIZWlnaHQsbj10X2FuaW1hdGlvblNCU19fZ2V0Wm9vbSh0KTt0LnRyaWdnZXJPZmZzZXQ9cGFyc2VJbnQodF9hbmltYXRpb25TQlNfX2dldEFuaW1PcHRpb25zKHQsInB1Ymxpc2hlZCIsInNicy10cmdvZnN0IiksMTApLCh3aW5kb3cuaXNPbmx5U2NhbGFibGV8fCJzY3JvbGwiPT09dC5hbmltVHlwZXx8dDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KSkmJih0LnRyaWdnZXJPZmZzZXQqPW4pLHQudHJpZ2dlck9mZnNldHx8KHQudHJpZ2dlck9mZnNldD0wKSwuNSE9PXQudHJpZ2dlciYmMSE9PXQudHJpZ2dlcnx8KHQudHJpZ2dlck9mZnNldCs9ZSp0LnRyaWdnZXIsKCJpbnRvdmlldyI9PT10LmFuaW1UeXBlfHwic2Nyb2xsIj09PXQuYW5pbVR5cGUpJiZ0LnRyaWdnZXJPZmZzZXQ+dC50b3BPZmZzZXQmJnQudHJpZ2dlck9mZnNldDw9ZSp0LnRyaWdnZXImJih0LnRyaWdnZXJPZmZzZXQ9dC50b3BPZmZzZXQsdC5zY2FsZWREaWZmZXJlbmNlJiYodC50cmlnZ2VyT2Zmc2V0PDB8fHQudHJpZ2dlck9mZnNldD09PXQuc2NhbGVkRGlmZmVyZW5jZSkmJih0LnNjYWxlZERpZmZlcmVuY2U9MCkpLCJibG9ja2ludG92aWV3Ij09PXQuYW5pbVR5cGUmJnQudHJpZ2dlck9mZnNldD50LnBhcmVudFJlY1RvcFBvcyYmdC50cmlnZ2VyT2Zmc2V0PD1lKnQudHJpZ2dlciYmKHQudHJpZ2dlck9mZnNldD10LnBhcmVudFJlY1RvcFBvcykpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX190cmlnZ2VyTm9TY3JvbGxBbmltYXRpb24odCxlKXt0X2FuaW1hdGlvblNCU19fcHJvY2Vzc0Vsc0ludG9WaWV3KHQsZSksdF9hbmltYXRpb25TQlNfX3JlbW92ZUhvdmVyQ2xpY2tUcmlnZ2Vycyh0KSx0X2FuaW1hdGlvblNCU19faW5pdENsaWNrVHJpZ2dlcnModCksdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXJzKHQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcm9jZXNzRWxzSW50b1ZpZXcodCxlKXt0X2FuaW1hdGlvblNCU19fdXBkYXRlSW50b1ZpZXdFbHNTdGF0ZShlKTt2YXIgbj0wO3RfYW5pbWF0aW9uU0JTX19zZXRLZXlGb3JBbmltYXRlZE9iamVjdCh0LCJvblNjcm9sbFVwZGF0ZUVsc0ludG9WaWV3IiwoZnVuY3Rpb24oKXtufHwobj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciBlO3RfYW5pbWF0aW9uU0JTX191cGRhdGVJbnRvVmlld0Vsc1N0YXRlKHRfYW5pbWF0aW9uU0JTX19nZXRBbmltRWxzT25WaWV3KHQuZWxlbWVudHMpKSxuPTB9KSwyMDApKX0pKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0Lm9uU2Nyb2xsVXBkYXRlRWxzSW50b1ZpZXcpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHQub25TY3JvbGxVcGRhdGVFbHNJbnRvVmlldyl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3JlbW92ZUhvdmVyQ2xpY2tUcmlnZ2Vycyh0KXt2YXIgZT1bImpzLXNicy1hbmltLXRyaWdnZXJfY2xpY2siLCJqcy1zYnMtYW5pbS10cmlnZ2VyX2hvdmVyIl0sbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuIitlLmpvaW4oIiwgLiIpKTtuLmxlbmd0aCYmKChuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG4pKS5mb3JFYWNoKChmdW5jdGlvbih0KXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuY2xhc3NMaXN0LnJlbW92ZShlKX0pKX0pKSx0LmNsaWNrZWRUcmlnZ2VyRWxzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfYW5pbWF0aW9uU0JTX19pbml0Q2xpY2tDYWxsYmFjayksdF9hbmltYXRpb25TQlNfX3JlbW92ZVRyaWdnZXJMaXN0KHQsImNsaWNrIil9KSksdC5ob3ZlclRyaWdnZXJFbHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHRfYW5pbWF0aW9uU0JTX19yZW1vdmVUcmlnZ2VyTGlzdCh0LCJob3ZlciIpfSkpLHRfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKHQsImNsaWNrZWRUcmlnZ2VyRWxzIixbXSksdF9hbmltYXRpb25TQlNfX3VwZGF0ZUFuaW1hdGVkT2JqZWN0U3RhdGUodCwiaG92ZXJUcmlnZ2VyRWxzIixbXSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19yZW1vdmVUcmlnZ2VyTGlzdCh0LGUpe3RbInRyaWdnZXJMaXN0LW9uLSIrZV0mJih0WyJ0cmlnZ2VyTGlzdC1vbi0iK2VdPVtdKSx0WyJ0cmlnZ2VyT25jZUxpc3Qtb24tIitlXSYmKHRbInRyaWdnZXJPbmNlTGlzdC1vbi0iK2VdPVtdKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19faW5pdENsaWNrVHJpZ2dlcnModCl7dmFyIGU9dC5lbGVtZW50cy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiJjbGljayI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1ldmVudCIpfSkpO2lmKGUubGVuZ3RoKXt0X2FuaW1hdGlvblNCU19fY29ubmVjdFRyaWdnZXJzV2l0aEFuaW1FbHMoZSk7dmFyIG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXNicy1hbmltLXRyaWdnZXJfY2xpY2siKSk7aWYobi5sZW5ndGgpe2lmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgianMtc2JzLWFuaW0tdHJpZ2dlci1zdHlsZXMiKSl7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtpLmlkPSJqcy1zYnMtYW5pbS10cmlnZ2VyLXN0eWxlcyIsaS50ZXh0Q29udGVudD0iLmpzLXNicy1hbmltLXRyaWdnZXJfY2xpY2sgeyBjdXJzb3I6IHBvaW50ZXI7IH0iLGRvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLGkpfXQuY2xpY2tlZFRyaWdnZXJFbHM9bixuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RfYW5pbWF0aW9uU0JTX19wcmV2ZW50QW5pbWF0ZWRQYXJlbnRUcmlnZ2VyKHQpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfYW5pbWF0aW9uU0JTX19pbml0Q2xpY2tDYWxsYmFjayksdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdF9hbmltYXRpb25TQlNfX2luaXRDbGlja0NhbGxiYWNrKX0pKX19fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0Q2xpY2tDYWxsYmFjaygpe3ZhciB0PXRoaXNbInRyaWdnZXJMaXN0LW9uLWNsaWNrIl18fFtdLGU9dGhpc1sidHJpZ2dlck9uY2VMaXN0LW9uLWNsaWNrIl18fFtdOyh0Lmxlbmd0aHx8ZS5sZW5ndGgpJiYodF9hbmltYXRpb25TQlNfX3BsYXlPbmNlQW5pbWF0aW9uKHRoaXMsZSwiY2xpY2siKSx0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKSYmIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3JldmVyc2VkIik/dF9hbmltYXRpb25TQlNfX3NldEFjdGlvbk9uRW5kKHQpOnRfYW5pbWF0aW9uU0JTX19zZXRBY3Rpb25PblN0YXJ0KHQpfSkpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcGxheU9uY2VBbmltYXRpb24odCxlLG4pe2lmKGUmJmUubGVuZ3RoKXt0X2FuaW1hdGlvblNCU19fYWN0aW9uT25TdGFydChlKTt2YXIgaT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtpLmluaXRFdmVudCgidXBkYXRlQW5pbU9uY2UiLCEwLCEwKSxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZGlzcGF0Y2hFdmVudChpKX0pKSx0WyJ0cmlnZ2VyT25jZUxpc3Qtb24tIituXT1bXX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXJzKHQpe3ZhciBlPXQuZWxlbWVudHMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4iaG92ZXIiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiKX0pKTtpZihlLmxlbmd0aCl7dF9hbmltYXRpb25TQlNfX2Nvbm5lY3RUcmlnZ2Vyc1dpdGhBbmltRWxzKGUpO3ZhciBuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1zYnMtYW5pbS10cmlnZ2VyX2hvdmVyIik7bj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChuKSx0LmhvdmVyVHJpZ2dlckVscz1uLG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7dF9hbmltYXRpb25TQlNfX3ByZXZlbnRBbmltYXRlZFBhcmVudFRyaWdnZXIodCksd2luZG93LmFuaW1hdGlvblNCU19faXNJT1M/KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlcikpOih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSl9KSl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcmV2ZW50QW5pbWF0ZWRQYXJlbnRUcmlnZ2VyKHQpe2lmKCJub25lIiE9PWdldENvbXB1dGVkU3R5bGUodCkucG9pbnRlckV2ZW50cyl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudG4tbW9sZWN1bGUsIC50bi1hdG9tIik7ZSYmKHQuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIsZS5zdHlsZS5wb2ludGVyRXZlbnRzPSJhdXRvIil9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKHQpe3ZhciBlPXQuY3VycmVudFRhcmdldCxuPXQuY3VycmVudFRhcmdldFsidHJpZ2dlckxpc3Qtb24taG92ZXIiXSxpPXQuY3VycmVudFRhcmdldFsidHJpZ2dlck9uY2VMaXN0LW9uLWhvdmVyIl07ZnVuY3Rpb24gYSh0KXtlLmNsb3Nlc3QoIi50Mzk2X19lbGVtIikhPT10LnRhcmdldC5jbG9zZXN0KCIudDM5Nl9fZWxlbSIpJiYodF9hbmltYXRpb25TQlNfX2FjdGlvbk9uRW5kKG4pLGUuY2xhc3NMaXN0LnJlbW92ZSgidC1ob3Zlci1tb2ItYWN0aXZlIiksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGEpKX0obiYmbi5sZW5ndGh8fGkmJmkubGVuZ3RoKSYmKHRfYW5pbWF0aW9uU0JTX19wbGF5T25jZUFuaW1hdGlvbihlLGksImhvdmVyIiksbiYmbi5sZW5ndGgmJigibW91c2VlbnRlciI9PT10LnR5cGUmJnRfYW5pbWF0aW9uU0JTX19hY3Rpb25PblN0YXJ0KG4pLCJtb3VzZWxlYXZlIj09PXQudHlwZSYmdF9hbmltYXRpb25TQlNfX2FjdGlvbk9uRW5kKG4pLCJjbGljayI9PT10LnR5cGUmJihlLmNsYXNzTGlzdC5jb250YWlucygidC1ob3Zlci1tb2ItYWN0aXZlIil8fChzZXRUaW1lb3V0KChmdW5jdGlvbigpe3RfYW5pbWF0aW9uU0JTX19hY3Rpb25PblN0YXJ0KG4pLGUuY2xhc3NMaXN0LmFkZCgidC1ob3Zlci1tb2ItYWN0aXZlIil9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsYSl9KSkpKSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jb25uZWN0VHJpZ2dlcnNXaXRoQW5pbUVscyh0KXt2YXIgZT10WzBdLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1ldmVudCIpO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49dC50cmlnZ2VyRWxlbXM7aWYobil7dmFyIGk9bj9uLnNwbGl0KCIsIik6W10sYT10LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLHI9YT9hLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpOiIiO2kuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIGk9cituLGE7dF9hbmltYXRpb25TQlNfX3Byb2Nlc3NUcmlnZ2Vyc0VsZW1MaXN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50bi1lbGVtX18iK2krIiwgLnRuLWdyb3VwX18iK2kpLHQsZSl9KSl9ZWxzZXt2YXIgbzt0X2FuaW1hdGlvblNCU19fcHJvY2Vzc1RyaWdnZXJzRWxlbUxpc3QodC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpLHQsZSl9fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcm9jZXNzVHJpZ2dlcnNFbGVtTGlzdCh0LGUsbil7dmFyIGk7dCYmKCJvbmNlIj09PWUubG9vcD9lLmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9zdGFydGVkIil8fHRfYW5pbWF0aW9uU0JTX19pbml0VHJpZ2dlcnNMaXN0KHQsInRyaWdnZXJPbmNlTGlzdCIsbixlKTp0X2FuaW1hdGlvblNCU19faW5pdFRyaWdnZXJzTGlzdCh0LCJ0cmlnZ2VyTGlzdCIsbixlKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2luaXRUcmlnZ2Vyc0xpc3QodCxlLG4saSl7dFtlKyItb24tIituXT8tMT09PXRbZSsiLW9uLSIrbl0uaW5kZXhPZihpKSYmdFtlKyItb24tIituXS5wdXNoKGkpOnRbZSsiLW9uLSIrbl09W2ldLHRbZSsiLW9uLSIrbl0ubGVuZ3RoJiYhdC5jbGFzc0xpc3QuY29udGFpbnMoImpzLXNicy1hbmltLXRyaWdnZXJfIituKSYmdC5jbGFzc0xpc3QuYWRkKCJqcy1zYnMtYW5pbS10cmlnZ2VyXyIrbiksaS5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGVBbmltT25jZSIsKGZ1bmN0aW9uKCl7dFtlKyItb24tIituXT10W2UrIi1vbi0iK25dLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQhPT1pfSkpLHRbInRyaWdnZXJMaXN0LW9uLSIrbl0mJnRbInRyaWdnZXJMaXN0LW9uLSIrbl0ubGVuZ3RofHx0LmNsYXNzTGlzdC5yZW1vdmUoImpzLXNicy1hbmltLXRyaWdnZXJfIituKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYWN0aW9uT25TdGFydCh0KXt0LmZvckVhY2godF9hbmltYXRpb25TQlNfX3NldEFjdGlvbk9uU3RhcnQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRBY3Rpb25PblN0YXJ0KHQpe3QuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3BsYXlpbmciKT90LnNldEF0dHJpYnV0ZSgiZGF0YS1wbGFubmVkLWRpciIsInBsYXkiKTp0X2FuaW1hdGlvblNCU19fcGxheUFuaW1hdGlvbih0LCExKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYWN0aW9uT25FbmQodCl7dC5mb3JFYWNoKHRfYW5pbWF0aW9uU0JTX19zZXRBY3Rpb25PbkVuZCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEFjdGlvbk9uRW5kKHQpe3ZhciBlPXQubG9vcCxuPSJub3JldmVyc2UiPT09ZSYmImhvdmVyIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLWV2ZW50Iik7ZSYmLTEhPT1lLmluZGV4T2YoImxvb3AiKT90LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbml0ZXJhdGlvbiIsdF9hbmltYXRpb25TQlNfX3NldEl0ZXJhdGlvbkFuaW1hdGlvbik6dC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fcGxheWluZyIpJiYhbj90LnNldEF0dHJpYnV0ZSgiZGF0YS1wbGFubmVkLWRpciIsInJldmVyc2UiKTpufHx0X2FuaW1hdGlvblNCU19fcGxheUFuaW1hdGlvbih0LCEwKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0SXRlcmF0aW9uQW5pbWF0aW9uKHQpe3ZhciBlPXQudGFyZ2V0LmNsb3Nlc3QoIi50Mzk2X19lbGVtIik7aWYoZSl7aWYoImxvb3B3aXRocmV2ZXJzZSI9PT1lLmxvb3Ape3ZhciBuPXRfYW5pbWF0aW9uU0JTX19nZXRBbmltYXRpb25GdWxsVGltZShlLCEwKSxpLGE7aWYoMWUzKnQuZWxhcHNlZFRpbWUvbiUyIT0wKXJldHVybn1lLmNsYXNzTGlzdC5yZW1vdmUoInQtc2JzLWFuaW1fc3RhcnRlZCIpLGUuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9yZXZlcnNlZCIpLGUuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9wbGF5aW5nIiksZS5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25pdGVyYXRpb24iLHRfYW5pbWF0aW9uU0JTX19zZXRJdGVyYXRpb25BbmltYXRpb24pfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYW5pbWF0aW9uRW5kKHQpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIix0X2FuaW1hdGlvblNCU19fYW5pbWF0aW9uRW5kaW5nRXZlbnQpLHQuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIix0X2FuaW1hdGlvblNCU19fYW5pbWF0aW9uRW5kaW5nRXZlbnQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19hbmltYXRpb25FbmRpbmdFdmVudCgpe3RoaXMuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9wbGF5aW5nIik7dmFyIHQ9dGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtcGxhbm5lZC1kaXIiKTsicGxheSI9PT10JiZ0aGlzLmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9yZXZlcnNlZCIpP3RfYW5pbWF0aW9uU0JTX19wbGF5QW5pbWF0aW9uKHRoaXMsITEpOiJyZXZlcnNlIiE9PXR8fHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3JldmVyc2VkIil8fHRfYW5pbWF0aW9uU0JTX19wbGF5QW5pbWF0aW9uKHRoaXMsITApLHRoaXMuc2V0QXR0cmlidXRlKCJkYXRhLXBsYW5uZWQtZGlyIiwiIil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldEFuaW1hdGlvbkZ1bGxUaW1lKHQsZSl7dmFyIG4saTtyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtb3B0cyIpP0pTT04ucGFyc2UodC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtb3B0cyIpLnNwbGl0KCInIikuam9pbignIicpKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUmJih0Kz1wYXJzZUludChuLmR0LDEwKXx8MCksdCsocGFyc2VJbnQobi50aSwxMCl8fDApfSksMCk6MH1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcGxheUFuaW1hdGlvbih0LGUpe3QuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9zdGFydGVkIiksZXx8dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNicy1hbmltX3JldmVyc2VkIiksdF9hbmltYXRpb25TQlNfX2ZvcmNlUmVwYWludCh0KTt2YXIgbj10X2FuaW1hdGlvblNCU19fZ2V0QW5pbWF0aW9uRnVsbFRpbWUodCwhMSksaT1bInQtc2JzLWFuaW1fc3RhcnRlZCJdO2UmJmkucHVzaCgidC1zYnMtYW5pbV9yZXZlcnNlZCIpLG4+MCYmaS5wdXNoKCJ0LXNicy1hbmltX3BsYXlpbmciKSxpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuY2xhc3NMaXN0LmFkZChlKX0pKSx0X2FuaW1hdGlvblNCU19fYW5pbWF0aW9uRW5kKHQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19mb3JjZVJlcGFpbnQodCl7dC5vZmZzZXRXaWR0aH1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdXBkYXRlSW50b1ZpZXdFbHNTdGF0ZSh0KXt0JiZ0Lmxlbmd0aCYmdC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZihkb2N1bWVudC5jb250YWlucyh0KSl7dmFyIGU9d2luZG93LnBhZ2VZT2Zmc2V0K3QudHJpZ2dlck9mZnNldCxuPSJibG9ja2ludG92aWV3Ij09PXQuYW5pbVR5cGU/ZT49dC5wYXJlbnRSZWNUb3BQb3M6ZT49dC50b3BPZmZzZXQsaT10LmNsb3Nlc3QoIi50Mzk2IikucGFyZW50RWxlbWVudCxhLHI9WyJ0Mzk3X19vZmYiLCJ0Mzk1X19vZmYiLCJ0NDAwX19vZmYiXS5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gaS5jbGFzc0xpc3QuY29udGFpbnModCl9KSk7biYmIXImJih0LmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9zdGFydGVkIil8fHQuY2xhc3NMaXN0LmFkZCgidC1zYnMtYW5pbV9zdGFydGVkIikpfX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0Wm9vbSh0KXtpZih2b2lkIDAhPT10LnNjYWxlRmFjdG9yKXJldHVybiB0LnNjYWxlRmFjdG9yO3ZhciBlPXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIik7aWYoIWUpcmV0dXJuIDE7dmFyIG49ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKTtyZXR1cm4gZS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkX3NjYWxlIil8fCF3aW5kb3cuYW5pbWF0aW9uU0JTX19pc09sZFBhZ2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgdDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSYmIndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKGUsInVwc2NhbGUiKT9uJiZ3aW5kb3cudG5bImFiIituXSYmd2luZG93LnRuWyJhYiIrbl0uc2NhbGVGYWN0b3J8fHdpbmRvdy50bl9zY2FsZV9mYWN0b3I6MX1mdW5jdGlvbiB0X2FuaW1hdGVTYnNfX3dyYXBBdG9tRWxzKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtYW5pbWF0ZS1zYnMtZXZlbnRdIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIik7aWYoZSYmIWUuY2xvc2VzdCgiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKSl7dF9hbmltYXRpb25TQlNfX3dyYXBFbChlLCJ0bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIik7dmFyIG49dC5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIiksaT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS5nZXRQcm9wZXJ0eVZhbHVlKCJib3JkZXItcmFkaXVzIik7aWYoInNoYXBlIj09PW4mJmkmJnBhcnNlSW50KGkpKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIik7YSYmKGEuc3R5bGUuYm9yZGVyUmFkaXVzPWkpfX19KSl9ZnVuY3Rpb24gdF9hbmltYXRlU2JzX19jYXNoRWxzSW5mbyh0KXt2YXIgZT10LmVsczt0LnRyaWdnZXJFbGVtc0F0dHJOYW1lPSJlZGl0Ij09PXQubW9kZT8iZGF0YS1maWVsZC1zYnN0cmdlbHMtdmFsdWUiOiJkYXRhLWFuaW1hdGUtc2JzLXRyZ2VscyIsQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbihlKXtlLnN0YXRlPSJ1bmFjdGl2ZSIsZS5hbmltVHlwZT0iZWRpdCI9PT10Lm1vZGU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtc2JzZXZlbnQtdmFsdWUiKTplLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1ldmVudCIpLGUuY2hhbmdlVHlwZT0ic2Nyb2xsIj09PWUuYW5pbVR5cGU/InNjcm9sbCI6InRpbWUiLGUudHJpZ2dlcj0iZWRpdCI9PT10Lm1vZGU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtc2JzdHJnLXZhbHVlIik6ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtdHJnIiksZS50cmlnZ2VyPWUudHJpZ2dlcj9lLnRyaWdnZXI6MSxlLnRyaWdnZXJFbGVtcz1lLmdldEF0dHJpYnV0ZSh0LnRyaWdnZXJFbGVtc0F0dHJOYW1lKSxlLndyYXBwZXJFbD1lLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksZS5zdGVwcz1bXTt2YXIgbj0iZWRpdCI9PT10Lm1vZGU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtc2Jzb3B0cy12YWx1ZSIpOmUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLW9wdHMiKTtpZihuKXstMSE9PW4uaW5kZXhPZigiZml4ZWQiKSYmKGUuekluZGV4PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLmdldFByb3BlcnR5VmFsdWUoInotaW5kZXgiKSksbj1uLnJlcGxhY2UoLycvZywnIicpO3ZhciBpPUpTT04ucGFyc2Uobik7dF9hbmltYXRpb25TQlNfX2FkZERlbGF5VG9TdGVwcyhpKSxlLmxvb3A9ImVkaXQiPT09dC5tb2RlP2UuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLXNic2xvb3AtdmFsdWUiKTplLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1sb29wIiksdF9hbmltYXRpb25TQlNfX3NldEFuZENhY2hlRWxUb3BQb3MoZSx0KTtmb3IodmFyIGE9MCxyPTA7cjxpLmxlbmd0aDtyKyspe3ZhciBvPXtzdGF0ZToidW5hY3RpdmUifTtvLnN0eWxlcz10X2FuaW1hdGlvblNCU19fY3JlYXRlU3RlcFN0eWxlcyhpW3JdKSwic2Nyb2xsIj09PWUuY2hhbmdlVHlwZT8oby5wcmV2VW5maXhlZERpc3Q9YSxvLmRpc3Q9aVtyXS5kaSwhMT09PW8uc3R5bGVzLmZpeCYmKGErPU51bWJlcihvLmRpc3QpKSxvLnN0YXJ0PTA9PT1yP2UudG9wT2Zmc2V0OmUuc3RlcHNbci0xXS5lbmQsby5lbmQ9by5zdGFydCsxKm8uZGlzdCk6KG8udGltZT1pW3JdLnRpLG8uZWFzZT1pW3JdLmVhKSxlLnN0ZXBzLnB1c2gobyl9dF9hbmltYXRpb25TQlNfX3VwZGF0ZUluZm9PbkltZ0xvYWQoZSx0KSx0X2FuaW1hdGlvblNCU19fdXBkYXRlTW92ZUFuZFJvdGF0ZVN0ZXBzU3R5bGVzKGUuc3RlcHMpfX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVTYnNfX3Jlc2V0KHQpe2Zvcih2YXIgZT10LmVscyxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPWVbbl0uYW5pbVR5cGU7aWYoImludG92aWV3Ij09PWl8fCJibG9ja2ludG92aWV3Ij09PWl8fCJjbGljayI9PT1pfHwiaG92ZXIiPT09aSl7ZVtuXS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKTt2YXIgYT1lW25dLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIik7YSYmKGEuc3R5bGUub3BhY2l0eT0iIil9ZWxzZXtlW25dLnN0YXRlPSJyZXNldGVkIjt2YXIgcj1lW25dLndyYXBwZXJFbDtyJiYoci5zdHlsZS50cmFuc2Zvcm09IiIsci5zdHlsZS5wb3NpdGlvbj0iIixyLnN0eWxlLnRvcD0iIixyLnN0eWxlLm9wYWNpdHk9IiIpfX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldFNpemVCYXNlZE9uRGltZW5zaW9uTW9kZSh0KXtpZighdClyZXR1cm57d2lkdGg6ImluaGVyaXQiLGhlaWdodDoiaW5oZXJpdCJ9O3ZhciBlPXQucGFyZW50Tm9kZS5jbG9zZXN0KCIudG4tZ3JvdXAiKXx8dC5wYXJlbnROb2RlLG4saSxhO3JldHVybiBlJiZ0Mzk2X19pc0ZsZXgoZSk/e3dpZHRoOiJmaWxsIj09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSh0LCJ3aWR0aG1vZGUiKT8iMTAwJSI6ImluaGVyaXQiLGhlaWdodDoiZmlsbCI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0bW9kZSIpPyIxMDAlIjoiaW5oZXJpdCJ9Ont3aWR0aDoiaW5oZXJpdCIsaGVpZ2h0OiJpbmhlcml0In19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3dyYXBFbCh0LGUpe2lmKCF0KXJldHVybiExO3ZhciBuPXQucGFyZW50Tm9kZSxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGE9dF9hbmltYXRpb25TQlNfX2dldFNpemVCYXNlZE9uRGltZW5zaW9uTW9kZShuKSxyPWEud2lkdGgsbz1hLmhlaWdodDsic3RyaW5nIj09dHlwZW9mIGU/aS5jbGFzc0xpc3QuYWRkKGUpOmUuZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5jbGFzc0xpc3QuYWRkKHQpfSkpLGkuc3R5bGUuZGlzcGxheT0iaW5oZXJpdCIsaS5zdHlsZS53aWR0aD1yLGkuc3R5bGUuaGVpZ2h0PW8saS5hcHBlbmRDaGlsZCh0KSxuJiZuLmFwcGVuZENoaWxkKGkpfXdpbmRvdy50X2FuaW1hdGlvblNCU19faXNGaXJlZm94PS0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5zZWFyY2goIkZpcmVmb3giKSx3aW5kb3cudF9hbmltYXRpb25TQlNfX2lzU2FmYXJpPS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksd2luZG93LmFuaW1hdGlvblNCU19faXNJT1M9L2lQaG9uZXxpUGFkfGlQb2QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwib250b3VjaGVuZCJpbiBkb2N1bWVudCYmL01hY2ludG9zaC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx3aW5kb3cuYW5pbWF0aW9uU0JTX19pc09sZFBhZ2U9Qm9vbGVhbihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj0idGlsZGEtYmxvY2tzLTIuNyJdJykpLCJ2aXNpYmxlIj09PWRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZT8ibG9hZGluZyIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP3RfYW5pbWF0aW9uU0JTX19pbml0KCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsdF9hbmltYXRpb25TQlNfX2luaXQpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHRfYW5pbWF0aW9uU0JTX19jaGVja1Zpc2liaWxpdHlQYWdlKTsKCmZ1bmN0aW9uIHQzOTZfc2NhbGVCbG9jayhlKXt2YXIgdD10Mzk2X2RldGVjdFJlc29sdXRpb24oZSksbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIitlKTtpZihsKXt2YXIgYTsiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnQzOTZfX2dldEN1cnJlbnRTY2FsZUZhY3Rvcj9hPXQzOTZfX2dldEN1cnJlbnRTY2FsZUZhY3RvcihlKTooYT13aW5kb3cudG4mJndpbmRvdy50blsiYWIiK2VdJiZ3aW5kb3cudG5bImFiIitlXS5zY2FsZUZhY3Rvcil8fChhPXdpbmRvdy50bl9zY2FsZV9mYWN0b3IpO3ZhciBvPWwucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIiksbj10Mzk2X3NjYWxlX19jb2xsZWN0U2NhbGVEYXRhKG8sYSk7aWYobyl7dmFyIHI9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShvLCJoZWlnaHQiKSxpPU1hdGguZmxvb3IociphKSxjLF87aWYodDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShvLCJoZWlnaHRfdmgiKSl7dmFyIHM9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShvLCJoZWlnaHQiKSxkPXQzOTZfYWJfX2dldEhlaWdodChvKSx1PXMqYTtpPXU+PWQ/dTpkfWlmKHQzOTZfc2NhbGVfX3VwZGF0ZUFydGJvYXJkU3RhdGUobyxpKSwwIT09bi5sZW5ndGgpaWYodDM5Nl9pc09ubHlTY2FsYWJsZUJyb3dzZXIoKSl0Mzk2X3NjYWxlX19zY2FsZUlzT25seVNjYWxhYmxlQmxvY2sobik7ZWxzZXt2YXIgbT1uLmZpbHRlcigoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5lbGVtVHlwZTtyZXR1cm4idGV4dCI9PT10fHwiYnV0dG9uIj09PXR9KSksaD1uLmZpbHRlcigoZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuInNoYXBlIj09PWUuZWxlbVR5cGV9KSkscD0vXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGY7cCYmdDM5Nl9zY2FsZV9fc2NoZWR1bGVfX3NjYWxlVGV4dEVsZW1lbnRzKG0pLHQzOTZfc2NhbGVfX3NjaGVkdWxlX19zY2FsZVNoYXBlRWxlbWVudHMoaCksbi5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbD1lLmVsZW1lbnQsbz1lLmVsZW1lbnRDb3JlLG49ZS5lbGVtVHlwZSxyPSJnYWxsZXJ5Ij09PW4saT0idmlkZW8iPT09bjtpZigieWVzIj09PWwuZ2V0QXR0cmlidXRlKCJkYXRhLXNjYWxlLW9mZiIpfHxyfHwobC5zdHlsZS56b29tPWEpLHImJihsLnN0eWxlLnpvb209bnVsbCksaSl7dmFyIGM9bC5xdWVyeVNlbGVjdG9yKCJpZnJhbWUiKTtjJiYoYy5zdHlsZS56b29tPTEvYSl9InRleHQiPT09biYmdDwxMjAwJiZvJiYhcCYmKG8uc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3Q9ImF1dG8iKSxvJiYoby5zdHlsZS50cmFuc2Zvcm1PcmlnaW49ImNlbnRlciIpfSkpLEFycmF5LmZyb20oby5xdWVyeVNlbGVjdG9yQWxsKCI6c2NvcGUgPiAudDM5Nl9fZWxlbSwgOnNjb3BlID4gLnQzOTZfX2dyb3VwIikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0OygibGVmdCIhPT10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUoZSwiYXhpc3giKXx8InRvcCIhPT10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUoZSwiYXhpc3kiKSkmJih0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChlLCJsZWZ0IiksdDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoZSwidG9wIikpfSkpfX19fWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3NjaGVkdWxlX19zY2FsZVRleHRFbGVtZW50cyhlKXt3aW5kb3cudG58fCh3aW5kb3cudG49e30pLHdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZXx8KHdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZT1bXSksd2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlPXdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZS5jb25jYXQoZSksY2xlYXJUaW1lb3V0KHdpbmRvdy50bi50ZXh0RWxlbWVudHNTY2FsZVRpbWVyKSx3aW5kb3cudG4udGV4dEVsZW1lbnRzU2NhbGVUaW1lcj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfc2NhbGVfX3NjYWxlVGV4dEVsZW1lbnRzKHdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZSksd2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlPVtdfSksMSl9ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fc2NhbGVUZXh0RWxlbWVudHMoZSl7dmFyIHQ9dDM5Nl9faW5pdEZhc3RET00oKTt0LndyaXRlKChmdW5jdGlvbigpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5lbGVtZW50LnN0eWxlLnpvb209IiJ9KSl9KSksdC5yZWFkKChmdW5jdGlvbigpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5jYWNoZWRGb250U2l6ZT1wYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoZS5lbGVtZW50Q29yZSkuZm9udFNpemUpLGUuY2FjaGVkVGV4dFNpemVBZGp1c3Q9ZS5lbGVtZW50Q29yZS5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdH0pKX0pKSx0LndyaXRlKChmdW5jdGlvbigpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5lbGVtZW50Q29yZS5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdD0ibm9uZSIsZS5lbGVtZW50LnN0eWxlLnpvb209ZS5zY2FsZUZhY3Rvcn0pKX0pKSx0LnJlYWQoKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmN1cnJlbnRGb250U2l6ZT1wYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoZS5lbGVtZW50Q29yZSkuZm9udFNpemUpfSkpfSkpLHQud3JpdGUoKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmFicyhlLmNhY2hlZEZvbnRTaXplLWUuY3VycmVudEZvbnRTaXplKTtlLmVsZW1lbnRDb3JlLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PXQ+PTE/Im5vbmUiOmUuY2FjaGVkVGV4dFNpemVBZGp1c3QsdD49MSYmKGUuZWxlbWVudENvcmUuc3R5bGUuZm9udFNpemU9TWF0aC5yb3VuZChlLmNhY2hlZEZvbnRTaXplKmUuc2NhbGVGYWN0b3IpKyJweCIpfSkpfSkpfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3NjaGVkdWxlX19zY2FsZVNoYXBlRWxlbWVudHMoZSl7d2luZG93LnRufHwod2luZG93LnRuPXt9KSx3aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlfHwod2luZG93LnRuLnNjaGVkdWxlZFNoYXBlRWxlbWVudHNGb3JTY2FsZT1bXSksd2luZG93LnRuLnNjaGVkdWxlZFNoYXBlRWxlbWVudHNGb3JTY2FsZT13aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlLmNvbmNhdChlKSxjbGVhclRpbWVvdXQod2luZG93LnRuLnNoYXBlRWxlbWVudHNTY2FsZVRpbWVyKSx3aW5kb3cudG4uc2hhcGVFbGVtZW50c1NjYWxlVGltZXI9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Mzk2X3NjYWxlX19zY2FsZVNoYXBlRWxlbWVudHMod2luZG93LnRuLnNjaGVkdWxlZFNoYXBlRWxlbWVudHNGb3JTY2FsZSksd2luZG93LnRuLnNjaGVkdWxlZFNoYXBlRWxlbWVudHNGb3JTY2FsZT1bXX0pLDEpfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3NjYWxlU2hhcGVFbGVtZW50cyhlKXt2YXIgdD10Mzk2X19pbml0RmFzdERPTSgpO3QucmVhZCgoZnVuY3Rpb24oKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLmVsZW1lbnQsImhlaWdodCIpO3Q9dDM5Nl9lbGVtX19nZXRIZWlnaHQoZS5lbGVtZW50LHQpLHQ9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGUuZWxlbWVudCwiaGVpZ2h0Iix0KTt2YXIgbD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZS5lbGVtZW50LCJ3aWR0aCIpO2w9dDM5Nl9lbGVtX19nZXRXaWR0aChlLmVsZW1lbnQsbCksbD10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoZS5lbGVtZW50LCJ3aWR0aCIsbCk7dmFyIGE9cGFyc2VGbG9hdCh0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZS5lbGVtZW50LCJ0b3AiKSk7YT10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoZS5lbGVtZW50LCJ0b3AiLGEpO3ZhciBvPXBhcnNlRmxvYXQodDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUuZWxlbWVudCwibGVmdCIpKTtvPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLmVsZW1lbnQsImxlZnQiLG8pLGUuc2hhcGVTaXplPXt0b3A6YSxsZWZ0Om8sd2lkdGg6bCxoZWlnaHQ6dH19KSl9KSk7dmFyIGw9ZS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNoYXBlU2l6ZS53aWR0aDw9Mnx8ZS5zaGFwZVNpemUuaGVpZ2h0PD0yfSkpO3QucmVhZCgoZnVuY3Rpb24oKXtsLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUuZWxlbWVudENvcmUpO2UuYm9yZGVyV2lkdGg9dC5ib3JkZXJXaWR0aCxlLmlzSW1hZ2U9Im5vbmUiIT09dC5iYWNrZ3JvdW5kSW1hZ2UsZS5pc0FuaW1hdGVkPWUuZWxlbWVudC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiKX0pKX0pKSx0LndyaXRlKChmdW5jdGlvbigpe2wuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoIjBweCI9PT1lLmJvcmRlcldpZHRoJiYhZS5pc0ltYWdlJiYhZS5pc0FuaW1hdGVkKXtlLmVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoInpvb20iKTt2YXIgdD1lLnNoYXBlU2l6ZS53aWR0aCplLnNjYWxlRmFjdG9yLGw9ZS5zaGFwZVNpemUuaGVpZ2h0KmUuc2NhbGVGYWN0b3IsYT1lLnNoYXBlU2l6ZS50b3AqZS5zY2FsZUZhY3RvcixvPWUuc2hhcGVTaXplLmxlZnQqZS5zY2FsZUZhY3RvcjtlLmVsZW1lbnQuc3R5bGUud2lkdGg9cGFyc2VGbG9hdCh0KSsicHgiLGUuZWxlbWVudC5zdHlsZS5oZWlnaHQ9cGFyc2VGbG9hdChsKSsicHgiLGUuZWxlbWVudC5zdHlsZS50b3A9TWF0aC5yb3VuZChhKSsicHgiLGUuZWxlbWVudC5zdHlsZS5sZWZ0PU1hdGgucm91bmQobykrInB4IixlLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLXNjYWxlLW9mZiIsInllcyIpfX0pKX0pKX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19jb2xsZWN0U2NhbGVEYXRhKGUsdCl7dmFyIGw7cmV0dXJuIHQzOTZfc2NhbGVfX2dldEVsZW1lbnRzVG9TY2FsZShlKS5tYXAoKGZ1bmN0aW9uKGUpe3ZhciBsPWUucXVlcnlTZWxlY3RvcigiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpLGE9dDM5Nl9zY2FsZV9fZ2V0RWxlbWVudFR5cGUoZSksbz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwiY29udGFpbmVyIik7aWYob3x8Imdyb3VwIiE9PWF8fChvPSJncmlkIiksbCYmImdyaWQiPT09bylyZXR1cm57ZWxlbWVudDplLGVsZW1lbnRDb3JlOmwsZWxlbVR5cGU6YSxzY2FsZUZhY3Rvcjp0fX0pKS5maWx0ZXIoQm9vbGVhbil9ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fc2NhbGVJc09ubHlTY2FsYWJsZUJsb2NrKGUpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5lbGVtZW50LGw9ZS5lbGVtZW50Q29yZSxhPWUuZWxlbVR5cGUsbz1sLmNsb3Nlc3QoIi50bi1hdG9tX19zY2FsZS13cmFwcGVyIik7b3x8KHQzOTZfc2NhbGVfX3dyYXBFbGVtZW50KGwsY3VycmVudFNjYWxlRmFjdG9yLCJ0bi1hdG9tX19zY2FsZS13cmFwcGVyIiksbz1sLmNsb3Nlc3QoIi50bi1hdG9tX19zY2FsZS13cmFwcGVyIikpLHQuc3R5bGUuem9vbT0iIix0Mzk2X3NjYWxlX19wcm9jZXNzQmFja2Ryb3BGaWx0ZXIodCxsLG8pLHQzOTZfc2NhbGVfX3Byb2Nlc3NCYWNrZ3JvdW5kRm9yU2hhcGUodCxsLGEsY3VycmVudFNjYWxlRmFjdG9yKX0pKX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19nZXRFbGVtZW50c1RvU2NhbGUoZSl7cmV0dXJuIGU/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5jaGlsZHJlbikuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZSYmKGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIil8fGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cCIpKX0pKTpbXX1mdW5jdGlvbiB0Mzk2X3NjYWxlX191cGRhdGVBcnRib2FyZFN0YXRlKGUsdCl7ZS5jbGFzc0xpc3QuYWRkKCJ0Mzk2X19hcnRib2FyZF9zY2FsZSIpO3ZhciBsPWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksYTtpZighKCJodWciPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0bW9kZSIpKSl7dmFyIG89JzxzdHlsZSBjbGFzcz0idDM5Nl9fc2NhbGUtc3R5bGUiPi50LXJlYyNyZWMnK2wrIiB7IG92ZXJmbG93OiB2aXNpYmxlOyB9I3JlYyIrbCsiIC50Mzk2X19hcnRib2FyZDpub3QoLnQzOTZfX2FydGJvYXJkLWZsZXgpLCNyZWMiK2wrIiAudDM5Nl9fYXJ0Ym9hcmQ6bm90KC50Mzk2X19hcnRib2FyZC1mbGV4KSAudDM5Nl9fY2FycmllciwjcmVjIitsKyIgLnQzOTZfX2FydGJvYXJkOm5vdCgudDM5Nl9fYXJ0Ym9hcmQtZmxleCkgLnQzOTZfX2ZpbHRlciB7IHdpZHRoOiAxMDB2dyAhaW1wb3J0YW50OyBtYXgtd2lkdGg6IDEwMCU7fSNyZWMiK2wrIiAudDM5Nl9fY2FycmllciwjcmVjIitsKyIgLnQzOTZfX2ZpbHRlciwjcmVjIitsKyIgLnQzOTZfX2FydGJvYXJkIHtoZWlnaHQ6ICIrdCsicHggIWltcG9ydGFudDt9PC9zdHlsZT4iO2UuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLG8pfX1mdW5jdGlvbiB0Mzk2X3NjYWxlX193cmFwRWxlbWVudChlLHQsbCl7aWYoZSl7dmFyIGE9ZS5wYXJlbnROb2RlO2lmKGEpe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uY2xhc3NMaXN0LmFkZChsKSxvLnN0eWxlLnRyYW5zZm9ybT0ic2NhbGUoIit0KyIpIixvLmFwcGVuZENoaWxkKGUpLGEuYXBwZW5kQ2hpbGQobyl9fX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19wcm9jZXNzQmFja2Ryb3BGaWx0ZXIoZSx0LGwpeyJub25lIj09PWUuc3R5bGUuYmFja2Ryb3BGaWx0ZXImJihlLnN0eWxlLmJhY2tkcm9wRmlsdGVyPSIiKTt2YXIgYT1nZXRDb21wdXRlZFN0eWxlKGUpLmJhY2tkcm9wRmlsdGVyO2lmKGEpe2Uuc3R5bGUuYmFja2Ryb3BGaWx0ZXI9Im5vbmUiLGwuc3R5bGUuYmFja2Ryb3BGaWx0ZXI9YTt2YXIgbz1nZXRDb21wdXRlZFN0eWxlKHQpLmJvcmRlclJhZGl1czsiMHB4IiE9PW8mJihsLnN0eWxlLmJvcmRlclJhZGl1cz1vKX19ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fcHJvY2Vzc0JhY2tncm91bmRGb3JTaGFwZShlLHQsbCxhKXtpZigic2hhcGUiPT09bCl7dmFyIG89dCYmZ2V0Q29tcHV0ZWRTdHlsZSh0KSxuO2lmKG8paWYoKG8mJm8uYmFja2dyb3VuZEltYWdlfHx0LmdldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbCIpKSYmImZpeGVkIj09PW8uYmFja2dyb3VuZEF0dGFjaG1lbnQpe2UucmVtb3ZlQ2hpbGQodC5wYXJlbnROb2RlKSxlLmFwcGVuZENoaWxkKHQpO3ZhciByPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJoZWlnaHQiKTtyPXQzOTZfZWxlbV9fZ2V0SGVpZ2h0KGUscikscj10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoZSwiaGVpZ2h0IixyKTt2YXIgaT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwid2lkdGgiKTtpPXQzOTZfZWxlbV9fZ2V0V2lkdGgoZSxpKSxpPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLCJ3aWR0aCIsaSk7dmFyIGM9cGFyc2VGbG9hdCh0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwidG9wIikpLF89cGFyc2VGbG9hdCh0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwibGVmdCIpKTtlLnN0eWxlLnRvcD1jKmErInB4IixlLnN0eWxlLmxlZnQ9XyphKyJweCIsZS5zdHlsZS5oZWlnaHQ9ciphKyJweCIsZS5zdHlsZS53aWR0aD1pKmErInB4IixlLnNldEF0dHJpYnV0ZSgiZGF0YS1zY2FsZS1vZmYiLCJ5ZXMiKX19fWZ1bmN0aW9uIHQzOTZfc2NhbGVfX2dldEVsZW1lbnRUeXBlKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO3JldHVybiF0JiZlLmNsYXNzTGlzdC5jb250YWlucygidG4tZ3JvdXAiKSYmKHQ9Imdyb3VwIiksdH13aW5kb3cudDM5Nl9pbml0aWFsU2NhbGV8fCh3aW5kb3cudDM5Nl9pbml0aWFsU2NhbGU9ZnVuY3Rpb24oKXt9KTsKCndpbmRvdy5UaWxkYT13aW5kb3cuVGlsZGF8fHt9LGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSx0PS0xIT09ZS5pbmRleE9mKCJtc2llIikmJnBhcnNlSW50KGUuc3BsaXQoIm1zaWUiKVsxXSk7aWYoOD09PXR8fDk9PT10KXt2YXIgcj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1idG4iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJocmVmIik7ZS5xdWVyeVNlbGVjdG9yKCJ0YWJsZSIpJiZ0JiYtMT09PXQuaW5kZXhPZigiI3BvcHVwOiIpJiYtMT09PXQuaW5kZXhPZigiI3ByaWNlOiIpJiZlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQuZ2V0QXR0cmlidXRlKCJocmVmIik7ZS5wcmV2ZW50RGVmYXVsdCgpLHdpbmRvdy5sb2NhdGlvbi5ocmVmPXR9KSl9KSl9dHJ5e3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksaT1hP2EuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWNvb2tpZSIpOm51bGw7YSYmIm5vIj09PWl8fFRpbGRhLnNhdmVVVE0oKX1jYXRjaChuKXt9dmFyIG89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnIiKTtmdW5jdGlvbiBjKGUpe3ZhciB0PWUudGFyZ2V0LmNsb3Nlc3QoImEuanMtY2xpY2stc3RhdCIpfHxlLnRhcmdldC5jbG9zZXN0KCIuanMtY2xpY2stemVyby1zdGF0Iik7aWYoZS50YXJnZXQmJnQpe3ZhciByPWUuY3VycmVudFRhcmdldCxhO2lmKHQuY2xvc2VzdCgiLnIiKSE9PXIpcmV0dXJuO3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWV2ZW50LW5hbWUiKSxvPXQudGV4dENvbnRlbnQsYz10LmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiIixkPXQuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKSxuO2lmKCFpKWk9Ii90aWxkYS9jbGljay8iKyhyP3IuZ2V0QXR0cmlidXRlKCJpZCIpOiIiKSsiLz91cmw9IitjO2lmKFRpbGRhLnNlbmRFdmVudFRvU3RhdGlzdGljcyhpLG8pLCJodHRwIj09PWMuc3Vic3RyaW5nKDAsNCkmJi0xPT09Yy5pbmRleE9mKCIudHlwZWZvcm0uY29tLyIpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dCgoZnVuY3Rpb24oKXt3aW5kb3cub3BlbihjLCJfYmxhbmsiPT09ZD8iX2JsYW5rIjoiX3NlbGYiKX0pLCJfYmxhbmsiPT09ZD8wOjMwMCksZS5wcmV2ZW50RGVmYXVsdCgpLCExfX1BcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKGUpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGMpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGMpfSkpO3ZhciBkPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0LmpzLWFtb3VudCIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZCwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS52YWx1ZTt0PXQucmVwbGFjZSgvLC9nLCIuIiksdD1wYXJzZUZsb2F0KHQucmVwbGFjZSgvW14wLTlcLl0vZywiIikpLGUudmFsdWU9dH0pKX1UaWxkYS5zZW5kRWNvbW1lcmNlRXZlbnQ9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10fHwwPT09dC5sZW5ndGgpcmV0dXJuITE7aWYodm9pZCAwPT09ZXx8ImFkZCIhPT1lJiYicmVtb3ZlIiE9PWUmJiJwdXJjaGFzZSIhPT1lJiYiZGV0YWlsIiE9PWUpcmV0dXJuITE7Zm9yKHZhciByLGE9IiIsaT0wLG89W10sYyxkLG49IiIsbT0iIixsPSIiLHU9MDt1PHQubGVuZ3RoO3UrKyl7YT4iIiYmKGErPSIsICIpLGErPShkPXRbdV0pLm5hbWUsaSs9ZC5wcmljZSxjPSIiLHZvaWQgMCE9PWQub3B0aW9ucyYmZC5vcHRpb25zLmxlbmd0aD4wJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQub3B0aW9ucywoZnVuY3Rpb24oZSl7Yys9ZS5vcHRpb24rIjogIitlLnZhcmlhbnQrIjsgIn0pKTt2YXIgcD17bmFtZTpkLm5hbWUscHJpY2U6ZC5wcmljZSx2YXJpYW50OmMscXVhbnRpdHk6MX07ZC5pZCYmZC5pZD4wJiYoaWQ9ZC5pZCxwLmlkPWQuaWQpLGQudWlkJiZkLnVpZD4wJiYobT1kLnVpZCxwLnVpZD1kLnVpZCksZC5yZWNpZCYmZC5yZWNpZD4wJiYobj1kLnJlY2lkLHAucmVjaWQ9ZC5yZWNpZCksZC5saWQmJmQubGlkPjAmJihsPWQubGlkLHAubGlkPWQubGlkKSxkLnNrdSYmZC5za3U+MCYmKHAuc2t1PWQuc2t1KSxvW28ubGVuZ3RoXT1wfXZhciBwOyJhZGQiIT09ZSYmInJlbW92ZSIhPT1lfHwocj0iL3RpbGRhL2NhcnQvIitlKyIvIixuPjAmJihyKz0iIituKSxtPjA/cis9Ii11IittOmw+MCYmKHIrPSItIitsKSksImRldGFpbCI9PT1lJiYocj0iL3RpbGRhL3Byb2R1Y3QvZGV0YWlsLyIsbT4wP3IrPW0rIi8iOihuPjAmJihyKz0iciIrbiksbD4wJiYocis9Ii1sIitsKSkpLCJwdXJjaGFzZSI9PT1lJiYocj0iL3RpbGRhL3JlYyIrbisiL3BheW1lbnQvIiksKHA9e2Vjb21tZXJjZTp7fX0pLmVjb21tZXJjZVtlXT17cHJvZHVjdHM6b30sVGlsZGEuc2VuZEV2ZW50VG9TdGF0aXN0aWNzKHIsYSxwLGkpfSxUaWxkYS5zZW5kRXZlbnRUb1N0YXRpc3RpY3M9ZnVuY3Rpb24oZSx0LHIsYSl7dmFyIGk9Ii8iPT09ZS5zdWJzdHJpbmcoMCwxKSxvPVtdLGMsZDsoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpKSYmKGQ9bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkYXRhLWZiLWV2ZW50Iik/Yy5nZXRBdHRyaWJ1dGUoImRhdGEtZmItZXZlbnQiKTp3aW5kb3cualF1ZXJ5JiZ2b2lkIDAhPT1qUXVlcnkoIiNhbGxyZWNvcmRzIikuZGF0YSgiZmItZXZlbnQiKT9qUXVlcnkoIiNhbGxyZWNvcmRzIikuZGF0YSgiZmItZXZlbnQiKTpudWxsKTt2YXIgbj0hKCFkfHwibm9zZW5kIiE9PWQpLG09Yz9jLmdldEF0dHJpYnV0ZSgiZGF0YS12ay1ldmVudCIpOm51bGw7YyYmKG09bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkYXRhLXZrLWV2ZW50Iik/Yy5nZXRBdHRyaWJ1dGUoImRhdGEtdmstZXZlbnQiKTp3aW5kb3cualF1ZXJ5JiZ2b2lkIDAhPT1qUXVlcnkoIiNhbGxyZWNvcmRzIikuZGF0YSgidmstZXZlbnQiKT9qUXVlcnkoIiNhbGxyZWNvcmRzIikuZGF0YSgidmstZXZlbnQiKTpudWxsKTt2YXIgbD0hKCFtfHwibm9zZW5kIiE9PW0pLHU9IiIscD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDcwNiIpO2lmKHU9Yy5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtY3VycmVuY3kiKT9jLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1jdXJyZW5jeSIpOnAmJnAuZ2V0QXR0cmlidXRlKCJkYXRhLXByb2plY3QtY3VycmVuY3ktY29kZSIpP3AuZ2V0QXR0cmlidXRlKCJkYXRhLXByb2plY3QtY3VycmVuY3ktY29kZSIpOiJSVUIiLHJ8fChyPXdpbmRvdy5sb2NhdGlvbi5ocmVmKSwoYT1hP3BhcnNlRmxvYXQoYSk6MCk+MClpZih3aW5kb3cuZGF0YUxheWVyfHwod2luZG93LmRhdGFMYXllcj1bXSksLTEhPT1lLmluZGV4T2YoIi90aWxkYS8iKSYmLTEhPT1lLmluZGV4T2YoIi9wYXltZW50LyIpJiZ3aW5kb3cudGlsZGFGb3JtJiZ3aW5kb3cudGlsZGFGb3JtLm9yZGVySWRGb3JTdGF0PiIiKXI9e2Vjb21tZXJjZTp7cHVyY2hhc2U6e2FjdGlvbkZpZWxkOntpZDp3aW5kb3cudGlsZGFGb3JtLm9yZGVySWRGb3JTdGF0LHJldmVudWU6d2luZG93LnRpbGRhRm9ybS5hbW91bnRGb3JTdGF0fSxwcm9kdWN0czp3aW5kb3cudGlsZGFGb3JtLmFyUHJvZHVjdHNGb3JTdGF0fX19LHdpbmRvdy50aWxkYUZvcm0udGlsZGFwYXltZW50JiZ3aW5kb3cudGlsZGFGb3JtLnRpbGRhcGF5bWVudC5wcm9tb2NvZGUmJihyLmVjb21tZXJjZS5wdXJjaGFzZS5hY3Rpb25GaWVsZC5jb3Vwb249d2luZG93LnRpbGRhRm9ybS50aWxkYXBheW1lbnQucHJvbW9jb2RlKSxyLmV2ZW50PSJwdXJjaGFzZSI7ZWxzZSBpZihyJiZyLmVjb21tZXJjZSYmKHIuZWNvbW1lcmNlLmFkZCYmci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzP289ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzOnIuZWNvbW1lcmNlLnJlbW92ZSYmci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzP289ci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzOnIuZWNvbW1lcmNlLmRldGFpbCYmci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzJiYobz1yLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHMpLG8mJm8ubGVuZ3RoPjApKXtmb3IodmFyIHM9MDtzPG8ubGVuZ3RoO3MrKylvW3NdLmlkfHwob1tzXS51aWQ/b1tzXS5pZD1vW3NdLnVpZDpvW3NdLnNrdT9vW3NdLmlkPW9bc10uc2t1Om9bc10ucmVjaWQmJm9bc10ubGlkJiYob1tzXS5pZD1vW3NdLnJlY2lkKyJfIitvW3NdLmxpZCkpO3IuZWNvbW1lcmNlLmFkZCYmci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzPyhyLmVjb21tZXJjZS5hZGQucHJvZHVjdHM9byxyLmV2ZW50PSJhZGRUb0NhcnQiKTpyLmVjb21tZXJjZS5yZW1vdmUmJnIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0cz8oci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzPW8sci5ldmVudD0icmVtb3ZlRnJvbUNhcnQiKTpyLmVjb21tZXJjZS5kZXRhaWwmJnIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0cz8oci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzPW8sci5ldmVudD0idmlld1Byb2R1Y3QiKTooaT8oci5ldmVudD0icGFnZVZpZXciLHIuZXZlbnRBY3Rpb249ZSk6ci5ldmVudD1lLHIudGl0bGU9dCxyLnZhbHVlPWEpfXZvaWQgMCE9PXdpbmRvdy5kYXRhTGF5ZXImJihpP2E+MD9yJiZyLmVjb21tZXJjZT93aW5kb3cuZGF0YUxheWVyLnB1c2gocik6d2luZG93LmRhdGFMYXllci5wdXNoKHtldmVudDoicGFnZVZpZXciLGV2ZW50QWN0aW9uOmUsdGl0bGU6dCx2YWx1ZTphLHByb2R1Y3Q6cn0pOndpbmRvdy5kYXRhTGF5ZXIucHVzaCh7ZXZlbnQ6InBhZ2VWaWV3IixldmVudEFjdGlvbjplLHRpdGxlOnQscmVmZXJlcjpyfSk6ciYmci5lY29tbWVyY2U/d2luZG93LmRhdGFMYXllci5wdXNoKHIpOndpbmRvdy5kYXRhTGF5ZXIucHVzaCh7ZXZlbnQ6ZSxldmVudEFjdGlvbjp0LHZhbHVlOmEscmVmZXJlcjpyfSkpO3RyeXt2YXIgdjtpZih3aW5kb3cuZ3RhZ1RyYWNrZXJJRCYmImd0YWciPT09d2luZG93Lm1haW5UcmFja2VyKWlmKGkpaWYociYmci5ldmVudClpZigicHVyY2hhc2UiPT09ci5ldmVudCl7Zm9yKHZhciBvPXIuZWNvbW1lcmNlLnB1cmNoYXNlLnByb2R1Y3RzLHc9MCxnPTA7ZzxvLmxlbmd0aDtnKyspaWYoImRlbGl2ZXJ5Ij09PW9bZ10uaWQpe3c9b1tnXTticmVha31ndGFnKCJldmVudCIsInB1cmNoYXNlIix7dHJhbnNhY3Rpb25faWQ6ci5lY29tbWVyY2UucHVyY2hhc2UuYWN0aW9uRmllbGQuaWQsdmFsdWU6cGFyc2VGbG9hdChhKS50b0ZpeGVkKDIpLGN1cnJlbmN5OnUsc2hpcHBpbmc6dyxpdGVtczpyLmVjb21tZXJjZS5wdXJjaGFzZS5wcm9kdWN0c30pfWVsc2UiYWRkVG9DYXJ0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmFkZD9ndGFnKCJldmVudCIsImFkZF90b19jYXJ0Iix7aXRlbXM6ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzfSk6InJlbW92ZUZyb21DYXJ0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLnJlbW92ZT9ndGFnKCJldmVudCIsInJlbW92ZV9mcm9tX2NhcnQiLHtpdGVtczpyLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHN9KToidmlld1Byb2R1Y3QiPT09ci5ldmVudCYmci5lY29tbWVyY2UuZGV0YWlsJiZndGFnKCJldmVudCIsInZpZXdfaXRlbSIse2l0ZW1zOnIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0c30pO2Vsc2UhIXdpbmRvdy5ndGFnVHJhY2tlcklEJiYtMSE9PXdpbmRvdy5ndGFnVHJhY2tlcklELmluZGV4T2YoIlVBLSIpP2d0YWcoImNvbmZpZyIsd2luZG93Lmd0YWdUcmFja2VySUQse3BhZ2VfdGl0bGU6dCxwYWdlX3BhdGg6ZX0pOmd0YWcoImV2ZW50Iix3aW5kb3cuZ3RhZ1RyYWNrZXJJRCx7cGFnZV90aXRsZTp0LHBhZ2VfcGF0aDplLHNlbmRfdG86d2luZG93Lmd0YWdUcmFja2VySUR9KTtlbHNlIGd0YWcoImV2ZW50IixlLHtldmVudF9jYXRlZ29yeToidGlsZGEiLGV2ZW50X2xhYmVsOnQsdmFsdWU6YX0pfWNhdGNoKHgpe31pZih3aW5kb3cuZ2EmJiJ0aWxkYSIhPT13aW5kb3cubWFpblRyYWNrZXImJiJndGFnIiE9PXdpbmRvdy5tYWluVHJhY2tlcilpZihpKWlmKHImJnIuZXZlbnQpe3RyeXtpZih3aW5kb3cuVGlsZGEuaXNMb2FkR0FFY29tbWVyY2V8fCh3aW5kb3cuVGlsZGEuaXNMb2FkR0FFY29tbWVyY2U9ITAsZ2EoInJlcXVpcmUiLCJlYyIpKSxnYSgic2V0IiwiY3VycmVuY3lDb2RlIix1KSwicHVyY2hhc2UiPT09ci5ldmVudCl7Zm9yKHZhciBmLHk9ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHMubGVuZ3RoLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHNbZ10sZ2EoImVjOmFkZFByb2R1Y3QiLHtpZDpmLmlkfHxnLG5hbWU6Zi5uYW1lLHByaWNlOnBhcnNlRmxvYXQoZi5wcmljZSkudG9GaXhlZCgyKSxxdWFudGl0eTpmLnF1YW50aXR5fSk7Z2EoImVjOnNldEFjdGlvbiIsInB1cmNoYXNlIix7aWQ6ci5lY29tbWVyY2UucHVyY2hhc2UuYWN0aW9uRmllbGQuaWQscmV2ZW51ZTpwYXJzZUZsb2F0KGEpLnRvRml4ZWQoMil9KX1lbHNlIGlmKCJhZGRUb0NhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UuYWRkKXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHMubGVuZ3RoLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzW2ddLGdhKCJlYzphZGRQcm9kdWN0Iix7aWQ6Zi5pZHx8ZyxuYW1lOmYubmFtZSxwcmljZTpwYXJzZUZsb2F0KGYucHJpY2UpLnRvRml4ZWQoMikscXVhbnRpdHk6Zi5xdWFudGl0eX0pO2dhKCJlYzpzZXRBY3Rpb24iLCJhZGQiKX1lbHNlIGlmKCJyZW1vdmVGcm9tQ2FydCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5yZW1vdmUpe2Zvcih2YXIgZix5PXIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0cy5sZW5ndGgsZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHNbZ10sZ2EoImVjOmFkZFByb2R1Y3QiLHtpZDpmLmlkfHxnLG5hbWU6Zi5uYW1lLHByaWNlOnBhcnNlRmxvYXQoZi5wcmljZSkudG9GaXhlZCgyKSxxdWFudGl0eTpmLnF1YW50aXR5fSk7Z2EoImVjOnNldEFjdGlvbiIsInJlbW92ZSIpfWVsc2UgaWYoInZpZXdQcm9kdWN0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmRldGFpbCl7Zm9yKHZhciBmLHk9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzLmxlbmd0aCxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0c1tnXSxnYSgiZWM6YWRkUHJvZHVjdCIse2lkOmYuaWR8fGcsbmFtZTpmLm5hbWUscHJpY2U6cGFyc2VGbG9hdChmLnByaWNlKS50b0ZpeGVkKDIpLHF1YW50aXR5OmYucXVhbnRpdHl9KTtnYSgiZWM6c2V0QWN0aW9uIiwiZGV0YWlsIil9fWNhdGNoKHgpe31nYSgic2VuZCIse2hpdFR5cGU6InBhZ2V2aWV3IixwYWdlOmUsdGl0bGU6dCxwYXJhbXM6cn0pfWVsc2UgZ2EoInNlbmQiLHtoaXRUeXBlOiJwYWdldmlldyIscGFnZTplLHRpdGxlOnR9KTtlbHNlIGdhKCJzZW5kIix7aGl0VHlwZToiZXZlbnQiLGV2ZW50Q2F0ZWdvcnk6InRpbGRhIixldmVudEFjdGlvbjplLGV2ZW50TGFiZWw6dCxldmVudFZhbHVlOmF9KTtpZih3aW5kb3cubWFpbk1ldHJpa2FJZCYmd2luZG93Lm1haW5NZXRyaWthSWQ+MCYmImZ1bmN0aW9uIj09dHlwZW9mIHltKWlmKGkpe3ZhciBoPXt0aXRsZTp0fTthPjA/KGgucGFyYW1zPXtvcmRlcl9wcmljZTphfSx1JiYoaC5wYXJhbXMuY3VycmVuY3k9dSkseW0od2luZG93Lm1haW5NZXRyaWthSWQsImhpdCIsZSxoKSk6eW0od2luZG93Lm1haW5NZXRyaWthSWQsImhpdCIsZSxoKX1lbHNlIGE+MD8oaD17b3JkZXJfcHJpY2U6YX0sdSYmKGguY3VycmVuY3k9dSkseW0od2luZG93Lm1haW5NZXRyaWthSWQsInJlYWNoR29hbCIsZSxoKSk6eW0od2luZG93Lm1haW5NZXRyaWthSWQsInJlYWNoR29hbCIsZSk7aWYod2luZG93Lm1haW5NZXRyaWthPiIiJiZ3aW5kb3dbd2luZG93Lm1haW5NZXRyaWthXSYmKGk/YT4wP3dpbmRvd1t3aW5kb3cubWFpbk1ldHJpa2FdLmhpdChlLHt0aXRsZTp0LG9yZGVyX3ByaWNlOmEscGFyYW1zOnJ9KTp3aW5kb3dbd2luZG93Lm1haW5NZXRyaWthXS5oaXQoZSx7dGl0bGU6dH0pOmE+MD93aW5kb3dbd2luZG93Lm1haW5NZXRyaWthXS5yZWFjaEdvYWwoZSx7dGl0bGU6dCxwYXJhbXM6cixvcmRlcl9wcmljZTphfSk6d2luZG93W3dpbmRvdy5tYWluTWV0cmlrYV0ucmVhY2hHb2FsKGUse3RpdGxlOnQscmVmZXJlcjpyfSkpLHZvaWQgMCE9PXdpbmRvdy5mYnEmJiExPT09bil0cnl7aWYoaSlpZigtMT09PWUuaW5kZXhPZigidGlsZGEvIil8fC0xPT09ZS5pbmRleE9mKCIvcGF5bWVudC8iKSYmLTE9PT1lLmluZGV4T2YoIi9zdWJtaXR0ZWQvIikpaWYociYmci5ldmVudCYmYT4wKWlmKCJhZGRUb0NhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UuYWRkKXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHMubGVuZ3RoLGs9W10sZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHNbZ10say5wdXNoKGYuaWR8fGYudWlkfHxmLm5hbWUpO3dpbmRvdy5mYnEoInRyYWNrIiwiQWRkVG9DYXJ0Iix7Y29udGVudF9pZHM6ayxjb250ZW50X3R5cGU6InByb2R1Y3QiLHZhbHVlOmEsY3VycmVuY3k6dX0pfWVsc2UgaWYoInZpZXdQcm9kdWN0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmRldGFpbCl7Zm9yKHZhciBmLHk9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzW2ddLGsucHVzaChmLmlkfHxmLnVpZHx8Zi5uYW1lKTt3aW5kb3cuZmJxKCJ0cmFjayIsIlZpZXdDb250ZW50Iix7Y29udGVudF9pZHM6ayxjb250ZW50X3R5cGU6InByb2R1Y3QiLHZhbHVlOmEsY3VycmVuY3k6dX0pfWVsc2UgZS5pbmRleE9mKCJ0aWxkYS9wb3B1cCIpLHdpbmRvdy5mYnEoInRyYWNrIiwiVmlld0NvbnRlbnQiLHtjb250ZW50X25hbWU6dCxjb250ZW50X2NhdGVnb3J5OmV9KTtlbHNlIGUuaW5kZXhPZigidGlsZGEvcG9wdXAiKSx3aW5kb3cuZmJxKCJ0cmFjayIsIlZpZXdDb250ZW50Iix7Y29udGVudF9uYW1lOnQsY29udGVudF9jYXRlZ29yeTplfSk7ZWxzZSBhPjAmJnU/d2luZG93LmZicSgidHJhY2siLCJJbml0aWF0ZUNoZWNrb3V0Iix7Y29udGVudF9uYW1lOnQsY29udGVudF9jYXRlZ29yeTplLHZhbHVlOmEsY3VycmVuY3k6dX0pOndpbmRvdy5mYnEoInRyYWNrIiwiTGVhZCIse2NvbnRlbnRfbmFtZTp0LGNvbnRlbnRfY2F0ZWdvcnk6ZX0pO2Vsc2Ugd2luZG93LmZicSgidHJhY2siLGUse2NvbnRlbnRfbmFtZTp0LHZhbHVlOmF9KX1jYXRjaCh4KXt9aWYodm9pZCAwIT09d2luZG93LlZLJiZ2b2lkIDAhPT13aW5kb3cuVksuUmV0YXJnZXRpbmcmJiExPT09bCl0cnl7aWYoaSl7dmFyIGMsXz0oYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpKT9jLmdldEF0dHJpYnV0ZSgiZGF0YS12ay1wcmljZS1saXN0LWlkIik6bnVsbCxiPV8mJnBhcnNlSW50KF8pfHwwLFQ9IiIsQT0hMSxGLEYsRixGLEY7aWYociYmci5ldmVudClpZihBPXtwcm9kdWN0czpbXSxjdXJyZW5jeV9jb2RlOiIiLHRvdGFsX3ByaWNlOjB9LCJwdXJjaGFzZSI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5wdXJjaGFzZSlpZihhPjAmJmI+MCl7dmFyIGY7QS5jdXJyZW5jeV9jb2RlPXU7Zm9yKHZhciB5PXIuZWNvbW1lcmNlLnB1cmNoYXNlLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHNbZ10sQS5wcm9kdWN0cy5wdXNoKHtpZDpmLmlkfHxmLnVpZHx8Zi5uYW1lLHByaWNlOmYucHJpY2U/Zi5wcmljZTowfSksQS50b3RhbF9wcmljZT1hO1Q9ImluaXRfY2hlY2tvdXQifWVsc2UgVD0idC1wdXJjaGFzZSI7ZWxzZSBpZigiYWRkVG9DYXJ0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmFkZClpZihhPjAmJmI+MCl7dmFyIGY7QS5jdXJyZW5jeV9jb2RlPXU7Zm9yKHZhciB5PXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cy5sZW5ndGgsaz1bXSxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0c1tnXSxBLnByb2R1Y3RzLnB1c2goe2lkOmYuaWR8fGYudWlkfHxmLm5hbWUscHJpY2U6Zi5wcmljZT9mLnByaWNlOjB9KSxBLnRvdGFsX3ByaWNlPWE7VD0iYWRkX3RvX2NhcnQifWVsc2UgVD0idC1hZGQtdG8tY2FydCIsci5lY29tbWVyY2UuYWRkWzBdJiZyLmVjb21tZXJjZS5hZGRbMF0udWlkJiYoVCs9Ii0iK3IuZWNvbW1lcmNlLmFkZFswXS51aWQpO2Vsc2UgaWYoInZpZXdQcm9kdWN0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmRldGFpbClpZihhPjAmJmI+MCl7dmFyIGY7QS5jdXJyZW5jeV9jb2RlPXU7Zm9yKHZhciB5PXIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0cy5sZW5ndGgsaz1bXSxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0c1tnXSxBLnByb2R1Y3RzLnB1c2goe2lkOmYuaWR8fGYudWlkfHxmLm5hbWUscHJpY2U6Zi5wcmljZT9mLnByaWNlOjB9KSxBLnRvdGFsX3ByaWNlPWE7VD0idmlld19wcm9kdWN0In1lbHNlIFQ9InQtdmlldy1wcm9kdWN0IixyLmVjb21tZXJjZS5kZXRhaWxbMF0mJnIuZWNvbW1lcmNlLmRldGFpbFswXS51aWQmJihUKz0iLSIrci5lY29tbWVyY2UuZGV0YWlsWzBdLnVpZCk7ZWxzZSBpZigicmVtb3ZlRnJvbUNhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UucmVtbW92ZSlpZihhPjAmJmI+MCl7dmFyIGY7QS5jdXJyZW5jeV9jb2RlPXU7Zm9yKHZhciB5PXIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0cy5sZW5ndGgsaz1bXSxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0c1tnXSxBLnByb2R1Y3RzLnB1c2goe2lkOmYuaWR8fGYudWlkfHxmLm5hbWUscHJpY2U6Zi5wcmljZT9mLnByaWNlOjB9KSxBLnRvdGFsX3ByaWNlPWE7VD0icmVtb3ZlX2Zyb21fY2FydCJ9ZWxzZSBUPSJ0LXJlbW92ZS1wcm9kdWN0IixyLmVjb21tZXJjZS5yZW1vdmVbMF0mJnIuZWNvbW1lcmNlLnJlbW92ZVswXS51aWQmJihUKz0iLSIrci5lY29tbWVyY2UucmVtb3ZlWzBdLnVpZCk7ZWxzZSBUPXIuZXZlbnQ7ZWxzZSBpZigtMSE9PWUuaW5kZXhPZigidGlsZGEvIikmJi0xIT09ZS5pbmRleE9mKCIvcGF5bWVudC8iKSlUPSJ0LXB1cmNoYXNlLSIrKEY9KEY9KEY9ZS5yZXBsYWNlKCIvdGlsZGEvIiwiIikpLnJlcGxhY2UoInRpbGRhLyIsIiIpKS5yZXBsYWNlKCIvcGF5bWVudC8iLCIiKSk7ZWxzZSBpZigtMSE9PWUuaW5kZXhPZigidGlsZGEvIikmJi0xIT09ZS5pbmRleE9mKCIvc3VibWl0dGVkLyIpKVQ9InQtbGVhZC0iKyhGPShGPShGPWUucmVwbGFjZSgiL3RpbGRhLyIsIiIpKS5yZXBsYWNlKCJ0aWxkYS8iLCIiKSkucmVwbGFjZSgiL3N1Ym1pdHRlZC8iLCIiKSk7ZWxzZSBpZigtMSE9PWUuaW5kZXhPZigidGlsZGEvcG9wdXAiKSlUPSJ0LSIrKEY9KEY9ZS5yZXBsYWNlKCIvdGlsZGEvIiwiIikpLnJlcGxhY2UoIi8iLCItIikpO2Vsc2UgaWYoLTEhPT1lLmluZGV4T2YoInRpbGRhL2NsaWNrIikpVD0idC0iKyhGPShGPWUucmVwbGFjZSgiL3RpbGRhLyIsIiIpKS5yZXBsYWNlKCIvIiwiLSIpKTtlbHNlIFQ9InQtIisoRj1lLnJlcGxhY2UoIi8iLCItIikpO2I+MCYmQSYmQS5jdXJyZW5jeV9jb2RlPyhWSy5SZXRhcmdldGluZy5FdmVudCgicHVyY2hhc2UiKSxWSy5SZXRhcmdldGluZy5Qcm9kdWN0RXZlbnQoYixULEEpKTooVksuUmV0YXJnZXRpbmcuRXZlbnQoVCksInQtcHVyY2hhc2UiPT09VC5zdWJzdHJpbmcoMCwxMCk/VksuR29hbCgicHVyY2hhc2UiKToidC1sZWFkIj09PVQuc3Vic3RyaW5nKDAsNikmJlZLLkdvYWwoImxlYWQiKSl9ZWxzZSBWSy5SZXRhcmdldGluZy5FdmVudChlKX1jYXRjaCh4KXt9aWYod2luZG93Lm1haW5NYWlscnVJZD4iMCIpe3ZhciBFPXdpbmRvdy5fdG1yfHwod2luZG93Ll90bXI9W10pO2k/YT4wP0UucHVzaCh7aWQ6IiIrd2luZG93Lm1haW5NYWlscnVJZCx0eXBlOiJwYWdlVmlldyIsdXJsOmUsdmFsdWU6YSxzdGFydDoobmV3IERhdGUpLmdldFRpbWUoKX0pOkUucHVzaCh7aWQ6IiIrd2luZG93Lm1haW5NYWlscnVJZCx0eXBlOiJwYWdlVmlldyIsdXJsOmUsc3RhcnQ6KG5ldyBEYXRlKS5nZXRUaW1lKCl9KTphPjA/RS5wdXNoKHtpZDoiIit3aW5kb3cubWFpbk1haWxydUlkLHR5cGU6InJlYWNoR29hbCIsZ29hbDplLHZhbHVlOmF9KTpFLnB1c2goe2lkOiIiK3dpbmRvdy5tYWluTWFpbHJ1SWQsdHlwZToicmVhY2hHb2FsIixnb2FsOmV9KX0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnRpbGRhc3RhdCYmKGk/KGUuaW5kZXhPZigicGF5bWVudCIpPjAmJmUuaW5kZXhPZigidGlsZGEvZm9ybSIpPi0xJiYoZT1lLnJlcGxhY2UoInRpbGRhL2Zvcm0iLCJ0aWxkYS9yZWMiKSksd2luZG93LnRpbGRhc3RhdCgicGFnZXZpZXciLHtwYWdlOmV9KSk6d2luZG93LnRpbGRhc3RhdCgicGFnZXZpZXciLHtwYWdlOiIvdGlsZGEvZXZlbnQvIitlfSkpfSxUaWxkYS5zYXZlVVRNPWZ1bmN0aW9uKCl7dHJ5e3ZhciBlPXdpbmRvdy5sb2NhdGlvbi5ocmVmLHQ9IiIscj0iIjtpZigtMSE9PWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJ1dG1fIikmJiJzdHJpbmciPT10eXBlb2YodD0odD0oZT1lLnRvTG93ZXJDYXNlKCkpLnNwbGl0KCI/IikpWzFdKSl7dmFyIGEsaT10LnNwbGl0KCImIik7Zm9yKHZhciBvIGluIGkpImFtcDsiPT09KGE9aVtvXS5zcGxpdCgiPSIpKVswXS5zdWJzdHJpbmcoMCw0KSYmKGFbMF09YVswXS5zdWJzdHJpbmcoNCkpLCJ1dG1fIj09PWFbMF0uc3Vic3RyaW5nKDAsNCkmJihyPXIraVtvXSsifHx8Iik7aWYoci5sZW5ndGg+MCl7dmFyIGM9bmV3IERhdGU7Yy5zZXREYXRlKGMuZ2V0RGF0ZSgpKzMwKSxkb2N1bWVudC5jb29raWU9IlRJTERBVVRNPSIrZW5jb2RlVVJJQ29tcG9uZW50KHIpKyI7IHBhdGg9LzsgZXhwaXJlcz0iK2MudG9VVENTdHJpbmcoKX19fWNhdGNoKGQpe319LCJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/ZSgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGUpfSgpLEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXN8fChFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzPUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLm1vek1hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5vTWF0Y2hlc1NlbGVjdG9yKSxFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0fHwoRWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpczt0JiYxPT09dC5ub2RlVHlwZTspe2lmKEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMuY2FsbCh0LGUpKXJldHVybiB0O3Q9dC5wYXJlbnRFbGVtZW50fHx0LnBhcmVudE5vZGV9cmV0dXJuIG51bGx9KTsKCiFmdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7ZnVuY3Rpb24gdCgpe3ZhciBlPU1hdGguZmxvb3IoODk5OTk5Kk1hdGgucmFuZG9tKCkpKzFlNTtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKSsiLiIrZX1mdW5jdGlvbiBuKGUpe3ZhciB0PWUucmVwbGFjZSgvKFtcLiQ/Knx7fVwoXClcW1xdXFxcL1wrXl0pL2csIlxcJDEiKSxuPW5ldyBSZWdFeHAoIig/Ol58OyApIit0KyI9KFteO10qKSIpLG89ZG9jdW1lbnQuY29va2llLm1hdGNoKG4pO2lmKG8pcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChvWzFdKX1mdW5jdGlvbiBvKGUsdCxuKXt2YXIgbz1uLmV4cGlyZXM7aWYoIW8pcmV0dXJuITE7aWYoIm51bWJlciI9PXR5cGVvZiBvKXt2YXIgaT0obmV3IERhdGUpLmdldFRpbWUoKSsxZTMqbzsobz1uZXcgRGF0ZShpKSkudG9VVENTdHJpbmcmJihuLmV4cGlyZXM9by50b1VUQ1N0cmluZygpKX12YXIgYT1lKyI9IisodD1lbmNvZGVVUklDb21wb25lbnQodCkpO2Zvcih2YXIgciBpbiBuKWErPSI7ICIrciwhMCE9PW5bcl0mJihhKz0iPSIrbltyXSk7ZG9jdW1lbnQuY29va2llPWF9ZnVuY3Rpb24gaShlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBhKGUpe3ZhciB0PSEwO2lmKCFlKXRocm93IG5ldyBFcnJvcigibm8gY2FsbGJhY2sgZ2l2ZW4iKTtmdW5jdGlvbiBuKCl7dHx8ZSh0PSEwKX1mdW5jdGlvbiBvKCl7dCYmZSh0PSExKX0iaGlkZGVuImluIGRvY3VtZW50JiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwoZnVuY3Rpb24oKXsoZG9jdW1lbnQuaGlkZGVuP286bikoKX0pKSwibW96SGlkZGVuImluIGRvY3VtZW50JiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3p2aXNpYmlsaXR5Y2hhbmdlIiwoZnVuY3Rpb24oKXsoZG9jdW1lbnQubW96SGlkZGVuP286bikoKX0pKSwid2Via2l0SGlkZGVuImluIGRvY3VtZW50JiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXR2aXNpYmlsaXR5Y2hhbmdlIiwoZnVuY3Rpb24oKXsoZG9jdW1lbnQud2Via2l0SGlkZGVuP286bikoKX0pKSwibXNIaWRkZW4iaW4gZG9jdW1lbnQmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1zdmlzaWJpbGl0eWNoYW5nZSIsKGZ1bmN0aW9uKCl7KGRvY3VtZW50Lm1zSGlkZGVuP286bikoKX0pKSwib25mb2N1c2luImluIGRvY3VtZW50JiYoZG9jdW1lbnQub25mb2N1c2luPW4sZG9jdW1lbnQub25mb2N1c291dD1vKSx3aW5kb3cub25wYWdlc2hvdz13aW5kb3cub25mb2N1cz1uLHdpbmRvdy5vbnBhZ2VoaWRlPXdpbmRvdy5vbmJsdXI9b31mdW5jdGlvbiByKCl7dmFyIGU9d2luZG93LnBhZ2VZT2Zmc2V0LHQ9d2luZG93LmlubmVySGVpZ2h0LG49TWF0aC5tYXgoZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCxkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpLG89MCxpPTA7dj0hMDt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidC1oZWFkZXIiKSxyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0LWZvb3RlciIpLGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbGRhY29weSIpO2EmJihvPWEub2Zmc2V0SGVpZ2h0KSxyJiYoaT1yLm9mZnNldEhlaWdodCksZCYmKGkrPWQub2Zmc2V0SGVpZ2h0KTt2YXIgYz1NYXRoLmZsb29yKDEwMCooZS1vK3QpLyhuLW8taSkpO2lmKCEoYzwxMCkpZm9yKHZhciBzPVsxMCwyNSw1MCw3NSw5MF0sbD0wO2w8cy5sZW5ndGg7bCsrKXt2YXIgdT1zW2xdLGc9cy5sZW5ndGgtMTtpZigwPT09bCYmYz49dSYmIXdbInAiK3VdKW0ucGFnZT0iL3RpbGRhL3Njcm9sbC8iK3UrIi8iLHdpbmRvdy50aWxkYXN0YXQoInBhZ2V2aWV3Iiksd1sicCIrdV09ITA7ZWxzZSBpZihjPj11LTEpe2lmKDA9PT13WyJwIit1XSl7bS5wYWdlPSIvdGlsZGEvc2Nyb2xsLyIrdSsiLyIsd2luZG93LnRpbGRhc3RhdCgicGFnZXZpZXciKSx3WyJwIit1XT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2NsZWFyVGltZW91dCh3WyJwIit1XSksd1sicCIrdV09LTF9KSw1ZTMpO2JyZWFrfWlmKChsIT09ZyYmYzxzW2wrMV18fGw9PT1nKSYmLTE9PT13WyJwIit1XSl7d1sicCIrdV09MDticmVha319fX1mdW5jdGlvbiBkKCl7dmFyIGU9MD09PXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5pbmRleE9mKCJ3d3cuIik/d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNsaWNlKDQpOndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtyZXR1cm4gZS5sYXN0SW5kZXhPZigiLiIpPT09ZS5sZW5ndGgtMSYmKGU9ZS5zbGljZSgwLC0xKSksZSt3aW5kb3cubG9jYXRpb24ucGF0aG5hbWV9ZnVuY3Rpb24gYyhlKXtmb3IodmFyIHQ9QXJyYXkoZS5sZW5ndGgpLG49MDtuPGUubGVuZ3RoO24rKyl0W25dPW47cmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0LChmdW5jdGlvbih0KXtyZXR1cm4gZS5jaGFyQ29kZUF0KHQpLnRvU3RyaW5nKDE2KX0pKS5qb2luKCIiKX1mdW5jdGlvbiBzKCl7dmFyIGU9KG5hdmlnYXRvci5jb29raWVFbmFibGVkPyJjVCI6ImNGIikrInwiKyhuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5PyJkbSIrbmF2aWdhdG9yLmRldmljZU1lbW9yeToiZG0iKSsifCIrKG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5PyJoYyIrbmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3k6ImhjIikrInwiKyhuYXZpZ2F0b3IubGFuZ3VhZ2VzPyJsIituYXZpZ2F0b3IubGFuZ3VhZ2VzLmpvaW4oIiwiKToibCIpKyJ8IjtpZihuYXZpZ2F0b3IucGxhdGZvcm18fG5hdmlnYXRvci5hcHBOYW1lP2UrPShuYXZpZ2F0b3IucGxhdGZvcm0/InAiK25hdmlnYXRvci5wbGF0Zm9ybToicCIpKyJ8IisobmF2aWdhdG9yLnZlbmRvcj8idiIrbmF2aWdhdG9yLnZlbmRvcjoidiIpKyJ8IisobmF2aWdhdG9yLmFwcENvZGVOYW1lPyJhIituYXZpZ2F0b3IuYXBwQ29kZU5hbWU6ImEiKSsifCIrKG5hdmlnYXRvci5hcHBOYW1lPyJuIituYXZpZ2F0b3IuYXBwTmFtZToibiIpKyJ8IjplKz0obmF2aWdhdG9yLnVzZXJBZ2VudD8idWEiK25hdmlnYXRvci51c2VyQWdlbnQ6InVhIikrInwiLG5hdmlnYXRvci5wbHVnaW5zKXt2YXIgdCxuLG89IiI7Zm9yKG49bmF2aWdhdG9yLnBsdWdpbnMubGVuZ3RoPjIwPzIwOm5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aCx0PTA7dDxuO3QrKyluYXZpZ2F0b3IucGx1Z2luc1t0XSYmbmF2aWdhdG9yLnBsdWdpbnNbdF0uZmlsZW5hbWU/bys9bmF2aWdhdG9yLnBsdWdpbnNbdF0uZmlsZW5hbWU6bmF2aWdhdG9yLnBsdWdpbnNbdF0mJm5hdmlnYXRvci5wbHVnaW5zW3RdLm5hbWUmJihvKz1uYXZpZ2F0b3IucGx1Z2luc1t0XS5uYW1lKTtlKz0icGwiK28rInwifXJldHVybiBlKz0icHIiK3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKyJ8IixlKz0idyIrKHNjcmVlbiYmc2NyZWVuLndpZHRoP3NjcmVlbi53aWR0aDp3aW5kb3cuaW5uZXJXaWR0aCkrImgiKyhzY3JlZW4mJnNjcmVlbi5oZWlnaHQ/c2NyZWVuLmhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHQpKyJ8IixlKz0iY0QiKyhzY3JlZW4uY29sb3JEZXB0aD9zY3JlZW4uY29sb3JEZXB0aDoiIikrInwiLGUrPSJ0TyIrKG5ldyBEYXRlKS5nZXRUaW1lem9uZU9mZnNldCgpKyJ8IixlPWMoZSs9Im1UIisodm9pZCAwIT09bmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzP25hdmlnYXRvci5tYXhUb3VjaFBvaW50czp2b2lkIDAhPT1uYXZpZ2F0b3IubXNNYXhUb3VjaFBvaW50cz9uYXZpZ2F0b3IubXNNYXhUb3VjaFBvaW50czoiIikrInwiKX1mdW5jdGlvbiBsKCl7eD1uKCJ0aWxkYXVpZCIpLEU9bigidGlsZGFzaWQiKSxoPyh4fHwoeD0ic2ltcGxlIiksRXx8KEU9InNpbXBsZSIpKTooeHx8KHg9dCgpKSxFfHwoRT10KCkpKX1mdW5jdGlvbiB1KCl7dmFyIGU7aHx8KG8oInRpbGRhdWlkIix4LHtleHBpcmVzOjc3NzZlMyxwYXRoOiIvIn0pLG8oInRpbGRhc2lkIixFLHtleHBpcmVzOjE4MDAscGF0aDoiLyJ9KSl9ZnVuY3Rpb24gZyh0KXtpZihtLnVzZXJfYWdlbnQ+IiImJi0xIT1tLnVzZXJfYWdlbnQuaW5kZXhPZigiYm90IikpcmV0dXJuITE7aWYoImh0dHA6IiE9d2luZG93LmxvY2F0aW9uLnByb3RvY29sJiYiaHR0cHM6IiE9d2luZG93LmxvY2F0aW9uLnByb3RvY29sKXJldHVybiBjb25zb2xlLmxvZygiVGlsZGFTdGF0OiBjYW5ub3Qgd29yayBvbiBsb2NhbCBwYWdlIiksITE7dmFyIG47bCgpLHUoKSxtLnBhZ2U9ZCgpLG0ucmVmZXJyZXI9ZG9jdW1lbnQucmVmZXJyZXJ8fCIiLG0udXNlcmlkPXgsbS5zZXNzaW9uaWQ9RSxtLnVzZXJfYWdlbnQ9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsbS51c2VyX2xhbmd1YWdlPXdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlLGUmJihtLnByb2plY3RpZD1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wcm9qZWN0LWlkIil8fCIwIixtLnBhZ2VpZD1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wYWdlLWlkIil8fCIwIixtLnBhZ2VhbGlhcz1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wYWdlLWFsaWFzIil8fCIiLG0uZm9ybXNrZXk9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtZm9ybXNrZXkiKXx8IiIpLG0ucGFyYW1zPXt9O3RyeXtuPWRlY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uc2VhcmNoKX1jYXRjaChjKXtuPXdpbmRvdy5sb2NhdGlvbi5zZWFyY2h9aWYobj4iPyImJihtLnBhZ2VxdWVyeT1uLnN1YnN0cmluZygxKS50b0xvd2VyQ2FzZSgpLH5tLnBhZ2VxdWVyeS5pbmRleE9mKCJ1dG1fIikpKXt2YXIgbyxpPW0ucGFnZXF1ZXJ5LnNwbGl0KCImIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbihlKXsobz1lLnNwbGl0KCI9IikpLmxlbmd0aD4xPyJ1dG1fcmVmZXJyZXIiIT09b1swXXx8bS5yZWZlcnJlciYmIX5tLnJlZmVycmVyLmluZGV4T2YoIm9oaW84LnYiKT9tLnBhcmFtc1tvWzBdXT1vWzFdOm0ucmVmZXJyZXI9b1sxXTptLnBhcmFtc1tvWzBdXT0iIn0pKX12YXIgcj0hMTtpZigvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihyPSEwKSxtLmlzbW9iaWxlPXIsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbGRhc3RhdHNjcmlwdCIpJiYobS50aWxkYXN0YXRjb2RlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYXN0YXRzY3JpcHQiKS5rZXkpLGspdHJ5e2EoKGZ1bmN0aW9uKGUpe3Y9ISFlfSkpLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V3aGVlbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2PSEwfSksMWUzKSksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dj0hMH0pLDFlMykpLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigia2V5cHJlc3MiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dj0hMH0pLDFlMykpLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dj0hMH0pLDFlMykpfWNhdGNoKGMpe31tLmZpbmdlcnByaW50PXMoKSxUPSEwfWZ1bmN0aW9uIHAoZSl7dmFyIHQ9Imh0dHBzOi8vc3RhdC50aWxkYWFwaS4iK0woKSsiL2V2ZW50LyIsaTtofHwobigidGlsZGFzaWQiKXx8IiIpIT1tLnNlc3Npb25pZCYmbygidGlsZGFzaWQiLG0uc2Vzc2lvbmlkLHtleHBpcmVzOjE4MDAscGF0aDoiLyJ9KTsiIj09PW0ucmVmZXJyZXImJihtLnJlZmVycmVyPW4oInByZXZpb3VzVXJsIil8fCIiKSxtLnRpbGRhdXRtPW4oIlRJTERBVVRNIil8fCIiLG0ucGFnZXx8KGNvbnNvbGUubG9nKCJUaWxkYVN0YXQ6IHBhZ2UgZW1wdHkiKSxtLnBhZ2U9ZCgpLHdpbmRvdy5sb2NhdGlvbi5oYXNoJiYwPT09d2luZG93LmxvY2F0aW9uLmhhc2guaW5kZXhPZigiIyEiKSYmKG0ucGFnZSs9d2luZG93LmxvY2F0aW9uLmhhc2gpKSwiLyI9PT1tLnBhZ2Uuc3Vic3RyaW5nKDAsMSkmJihtLnBhZ2U9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lK20ucGFnZSk7dmFyIGE9ZihtKSxyPW5ldyBYTUxIdHRwUmVxdWVzdDtyLm9wZW4oIlBPU1QiLHQsITApLHIud2l0aENyZWRlbnRpYWxzPSExLHIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04Iiksci5vbmVycm9yPWZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoIlRpbGRhU3RhdDogZmFpbCBwYWdldmlldyAiKSxjb25zb2xlLmVycm9yKGUpfSxyLnRpbWVvdXQ9M2UzLHIuc2VuZChhKSxtLnBhZ2UmJi0xPT09bS5wYWdlLmluZGV4T2YoInRpbGRhL3Njcm9sbCIpJiYtMT09PW0ucGFnZS5pbmRleE9mKCJ0aWxkYS9yZWFkdGltZSIpJiYtMT09PW0ucGFnZS5pbmRleE9mKCJ0aWxkYS9jbGljayIpJiYtMT09PW0ucGFnZS5pbmRleE9mKCJ0aWxkYS9jb29raWVlbmFibGVkIikmJihtLnJlZmVycmVyPW0ucGFnZSxofHxvKCJwcmV2aW91c1VybCIsbS5wYWdlLHtwYXRoOiIvIixleHBpcmVzOjE4MDB9KSksbS5wYWdlPSIiLHdpbmRvdy50aWxkYXN0YXRsb2FkPSEwfWZ1bmN0aW9uIGYoZSl7dmFyIHQ9IiI7Zm9yKHZhciBuIGluIGUpaWYoIiIhPXQmJiJvYmplY3QiIT10eXBlb2YgZVtuXSYmKHQrPSImIiksIm9iamVjdCI9PXR5cGVvZiBlW25dKXtpZihPYmplY3Qua2V5cyhlW25dKS5sZW5ndGgpZm9yKHZhciBvIGluIGVbbl0pdCs9IiYiK24rIlsiK28rIl09IitlbmNvZGVVUklDb21wb25lbnQoZVtuXVtvXSl9ZWxzZSB0Kz1uKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtuXSk7cmV0dXJuIHR9d2luZG93LnRpbGRhc3RhdD1mdW5jdGlvbihlLHQpe2lmKCFlKXJldHVybiExO2lmKCJjcmVhdGUiIT09ZSYmIVQpcmV0dXJuIHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7d2luZG93LnRpbGRhc3RhdChlLHQpfSksMWUzKSwhMTtzd2l0Y2godCYmaShtLHQpLGUpe2Nhc2UiY3JlYXRlIjpnKHQpO2JyZWFrO2Nhc2UicGFnZXZpZXciOnAodCk7YnJlYWs7Y2FzZSJyZWFkdGltZSI6ayYmKHYmJihtLnBhZ2U9Ii90aWxkYS9yZWFkdGltZS8iLHY9ITEscCh0KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt3aW5kb3cudGlsZGFzdGF0KCJyZWFkdGltZSIpfSksMTVlMykpO2JyZWFrO2Nhc2Uic2Nyb2xsIjprJiYiZnVuY3Rpb24iPT10eXBlb2YgdF90aHJvdHRsZSYmd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtyKCl9KSwxZTMpKTticmVhaztjYXNlImNvb2tpZWVuYWJsZWQiOmg9ITEsbCgpLHUoKSxtLnVzZXJpZD14LG0uc2Vzc2lvbmlkPUUsbS5wYWdlPSIvdGlsZGEvY29va2llZW5hYmxlZC8iLHAodCk7YnJlYWs7Y2FzZSJmaW5nZXJwcmludCI6cmV0dXJuIHMoKX19O3ZhciBtPXt9LHc9e3AxMDowLHAyNTowLHA1MDowLHA3NTowLHA5MDowfSx2PSEwLGg9Im5vIj09PXdpbmRvdy50aWxkYXN0YXRjb29raWUseTtpZigod2luZG93LnRpbGRhc3RhdGNvb2tpZXx8ZSYmKGg9Im5vIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWNvb2tpZSIpKSwieWVzIj09PXdpbmRvdy50aWxkYXN0YXRjb29raWVnZHByJiYhMT09PWgpJiYoaD0hMCwhMD09PW4oInRfY29va2llc0NvbnNlbnRHaXZlbiIpKSl7dmFyIGI9bigidF9jb29raWVzQ2F0ZWdvcmllcyIpOyJzdHJpbmciPT10eXBlb2YgYiYmYi5pbmRleE9mKCJhbmFseXRpY3MiKT4tMSYmKGg9ITEpfXZhciBrPSJ5ZXMiPT09d2luZG93LnRpbGRhc3RhdHNjcm9sbDt2b2lkIDA9PT13aW5kb3cudGlsZGFzdGF0c2Nyb2xsJiZlJiYoaz0ieWVzIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXN0YXQtc2Nyb2xsIikpO3ZhciB4PSIiLEU9IiIsVD0hMTt3aW5kb3cudGlsZGFzdGF0KCJjcmVhdGUiKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy50aWxkYXN0YXQoInBhZ2V2aWV3Iiksd2luZG93LnRpbGRhc3RhdCgicmVhZHRpbWUiKSx3aW5kb3cudGlsZGFzdGF0KCJzY3JvbGwiKX0pLDUwMCk7dmFyIGo9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7aWYoKCJvYmplY3QiPT10eXBlb2Ygd2luZG93LnRfanNlcnJvcnMmJndpbmRvdy50X2pzZXJyb3JzLmxlbmd0aD4wfHwib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy50X2NkbmVycm9ycyYmd2luZG93LnRfY2RuZXJyb3JzLmxlbmd0aD4wfHwib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy50X2FqYXhlcnJvcnMmJndpbmRvdy50X2FqYXhlcnJvcnMubGVuZ3RoPjApJiYiZnVuY3Rpb24iIT10eXBlb2YgdF9lcnJvcnNfX3NlbmRKU0Vycm9ycyl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5zcmM9Imh0dHBzOi8vc3RhdGljLnRpbGRhY2RuLiIrTCgpKyIvanMvdGlsZGEtZXJyb3JzLTEuMC5taW4uanMiLGUuYXN5bmM9ITAsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKSxjbGVhckludGVydmFsKGopfX0pLDJlMyksTz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJsaW5rW3JlbCo9J3Nob3J0Y3V0IGljb24nXSIpLF89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgibGlua1tocmVmKj0ndGlsZGEud3MvcHJvamVjdCddIikubGVuZ3RoO198fChfPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImxpbmtbaHJlZio9J3dzLnRpbGRhY2RuLmNvbS9wcm9qZWN0J10iKS5sZW5ndGgpO3ZhciBBPU8/Ty5nZXRBdHRyaWJ1dGUoImhyZWYiKToiIixIPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtzcmMqPSdqcy90aWxkYS1zY3JpcHRzJ10iKSxDPSEhSCYmLTE9PT1ILnNyYy5pbmRleE9mKCJ0aWxkYWNkbiIpLEk7KEN8fChDPU8mJi0xIT09QS5pbmRleE9mKCJzdGF0aWMudGlsZGFjZG4uIitMKCkpJiYtMSE9PUEuaW5kZXhPZigidGlsZGEuIikmJi0xIT09QS5pbmRleE9mKCIvdGlsZGFmYXZpY29uLmljbyIpJiYhZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidGFibGUjYWxscmVjb3JkcyIpJiYhKC0xIT09d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLmluZGV4T2YoIi50aWxkYS53cyIpKSYmIV8pLHZvaWQgMD09PW5hdmlnYXRvci5zZW5kQmVhY29ufHwvQm90L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8Qyl8fDE9PT1NYXRoLmZsb29yKDUqTWF0aC5yYW5kb20oKSkmJlMoKGZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5hc3luYz0hMCxlLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZS5zcmM9Imh0dHBzOi8vc3RhdGljLnRpbGRhY2RuLiIrTCgpKyIvanMvdGlsZGEtcGVyZm9ybWFuY2UtMS4wLm1pbi5qcyIsZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsZSl9KSk7ZnVuY3Rpb24gUyhlKXsiY29tcGxldGUiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9lKCk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUpfWZ1bmN0aW9uIEwoKXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLHQ7cmV0dXJuIGUmJmUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXJvb3Qtem9uZSIpfHwiY29tIn19KCk7Cgp0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdGlhbFNjYWxlJyxmdW5jdGlvbigpIHt0Mzk2X2luaXRpYWxTY2FsZSgnMjA3MjczMTM2MScpO30pO3Rfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCcyMDcyNzMxMzYxJyk7fSk7fSk7CnRfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCcyMDcyNjI4MzIxJyk7fSk7fSk7CnRfb25GdW5jTG9hZCgndDM5Nl9pbml0aWFsU2NhbGUnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdGlhbFNjYWxlKCcyMDcyNzI1ODkxJyk7fSk7dF9vblJlYWR5KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDM5Nl9pbml0JyxmdW5jdGlvbigpIHt0Mzk2X2luaXQoJzIwNzI3MjU4OTEnKTt9KTt9KTsKdF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXRpYWxTY2FsZScsZnVuY3Rpb24oKSB7dDM5Nl9pbml0aWFsU2NhbGUoJzIwNTg3NDExNDEnKTt9KTt0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMjA1ODc0MTE0MScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMjA3Mjg1NzY1MScpO30pO30pOw== | |
| js | /_next/static/widgets/footer.js | |
| js | /_next/static/widgets/subscribe.js?31381d5b6ea6 | |
| js | /assets/new/build/main-page.js?31381d5b6ea6 |
Серверные заголовки
Кол-во: 9
HTTP-заголовки ответа сервера
?
Заголовки сервера передают браузеру и поисковику служебную информацию: кеширование, безопасность (CSP, HSTS), сжатие (gzip). Правильная настройка ускоряет загрузку и повышает защищённость.
Найдены серверные заголовки 9шт. Подробнее про серверные заголовки.
Показать полный список серверных заголовков
| Ключ | Значение |
|---|---|
| Server | ddos-guard |
| Set-Cookie | __ddg8_=LA0Ru0G0I4izITSb; Domain=.mann-ivanov-ferber.ru; Path=/; Expires=Thu, 20-Aug-2026 14:31:37 GMT |
| Content-Security-Policy | upgrade-insecure-requests; |
| Date | Thu, 20 Aug 2026 14:11:37 GMT |
| X-Powered-By | PHP/7.4.30 |
| Cache-Control | must-revalidate, max-age=0, private |
| x-test | GET |
| x-uuid | Cuf854MgWBISpPzz6fbbPzRiVPtJ3S9qh |
| X-Frame-Options | SAMEORIGIN |
CMS
Система управления сайтом (движок)
?
CMS — это движок, на котором работает сайт (WordPress, 1C-Bitrix, Tilda и др.). Знание CMS помогает понять возможности SEO-оптимизации и подобрать подходящие инструменты. «Не определена» — вероятно, самописный сайт или нестандартная сборка.
Сайт работает на CMS Tilda.
Веб-сервер
Программное обеспечение сервера
?
Веб-сервер — это ПО, которое отдаёт страницы посетителям (nginx, Apache, IIS, LiteSpeed и др.). Определяется по серверным заголовкам ответа (Server, X-Powered-By и т.п.). «Не определён» — сервер намеренно скрывает эти заголовки, это нормальная практика безопасности.
Сайт работает на веб-сервере DDoS-Guard.
Мета-теги Готовность: 48%
Title
Подписка на рассылку МИФа
Заголовок страницы в браузере и поисковой выдаче
?
Title — главный SEO-заголовок страницы. Влияет на CTR в поиске и ранжирование. Оптимальная длина: 50–70 символов. Ключевые слова — ближе к началу.
Необходимо увеличить число символов в title (текущее значение: 25, оптимально: от 40 до 45)
Дублей словоформ в title не найдено.
Description
Описание страницы в поисковой выдаче (сниппет)
?
Meta Description — текст под заголовком в выдаче. Напрямую на позиции не влияет, но влияет на CTR. Оптимальная длина: 120–160 символов.
Установите мета-тег description!
Keywords
Список ключевых слов страницы (устаревший тег)
?
Meta Keywords не учитывается Яндексом и Google для ранжирования с 2009–2012 годов. Заполнение не обязательно, но не вредит. Конкурент может использовать содержимое для анализа.
Установите мета-тег keywords!
Канонический Url
Указывает поисковику основную версию страницы
?
Canonical (rel=canonical) предотвращает проблему дублей страниц. Должен точно совпадать с URL проверяемой страницы. Неправильный canonical может передать ссылочный вес на другую страницу.
Рекомендуем прописать канонический Url.
Robots
Ошибок нет
Директивы для поисковых роботов на уровне страницы
?
Meta Robots управляет индексацией конкретной страницы: index/noindex — индексировать ли, follow/nofollow — следовать ли по ссылкам. Noindex полностью исключает страницу из поиска.
Meta-тег robots не указан. Страница свободна для индексации.
Адаптивность
width=device-width, initial-scale=1.0
Настройка масштабирования на мобильных устройствах
?
Тег viewport (<meta name="viewport">) сообщает браузеру, как масштабировать страницу на мобильных. Стандарт: width=device-width, initial-scale=1. Отсутствие — признак отсутствия мобильной версии.
Meta-тег viewport со значением-константой width=device-width задаёт ширину страницы в соответствии с размером экрана.
Meta-тег viewport со значением initial-scale=1.0 определяет масштаб 1:1, т.е. «не масштабировать».
Разметка OpenGraph
Кол-во: 6
Мета-теги для красивых превью в соцсетях
?
OpenGraph (og:title, og:description, og:image) управляет тем, как страница выглядит при репосте в социальных сетях и мессенджерах. Отсутствие OG-тегов — невзрачный превью при шеринге.
Разметка OpenGraph задана. Страница оптимизирована под социальные сети.
Показать полный список og мета-тегов
| Тип | Значение |
|---|---|
| og:type | article |
| og:title | Подписка на рассылку МИФа |
| og:description | |
| og:image | https://www.mann-ivanov-ferber.ru/assets/templates/site/img/logo-big.jpg |
| og:site_name | Издательство &laquo;МИФ&raquo; |
| og:url | https://www.mann-ivanov-ferber.ru/subscribe-mif/ |
Все мета-теги
Кол-во: 11
Полный список мета-тегов страницы
?
Таблица всех meta-тегов, включая нестандартные. Позволяет найти опечатки, дубли и лишние теги.
Найдены мета-теги 11шт. Мета-теги не видимы для человека и предназначены для обмена информацией между веб-страницей и поисковыми системами, браузерами и другими веб-службами. С ними роботы 🤖 и устройства ведут себя более ожидаемо.
Показать полный список мета-тегов
| Тип | Название | Значение |
|---|---|---|
| name | viewport | width=device-width, initial-scale=1.0 |
| name | description | |
| name | keywords | |
| name | yandex-verification | 439047a0861cf992 |
| property | og:type | article |
| property | og:title | Подписка на рассылку МИФа |
| property | og:description | |
| property | og:image | https://www.mann-ivanov-ferber.ru/assets/templates/site/img/logo-big.jpg |
| property | og:site_name | Издательство &laquo;МИФ&raquo; |
| property | og:url | https://www.mann-ivanov-ferber.ru/subscribe-mif/ |
| property | fb:admins | 1093864394 |
Оптимизация Готовность: 48%
Структура
Ошибок нет
Семантические HTML-элементы страницы
?
Проверяет наличие основных структурных элементов: nav, header, footer, main. Корректная семантическая структура помогает поисковику понять архитектуру страницы.
Структура документа корректна (теги <html> и <body> присутствуют в одном экземпляре).
Контент
Есть ошибки
Объём и качество текстового содержимого
?
Анализирует объём полезного текста на странице. Слишком мало — страница может считаться малополезной. Слишком много — ухудшается читаемость и восприятие.
Слова из title 2 встречаются в тексте редко. Добавьте в контент страницы слова из тега <title>!
Абзацев с текстом 0 слишком мало. Добавьте больше абзацев с текстом (тег <p>)!
Среднее число слов в абзаце 0 слишком мало. Сделайте контент более читаемым!
Кол-во слов 449 не очень много. Добавьте побольше текста (хотя бы 800 слов)!
Кол-во знаков контента 3611 на странице оптимально.
Заголовки
Ошибок нет
Иерархия заголовков H1–H6
?
H1 должен быть один и содержать ключевой запрос. H2–H6 описывают подразделы. Пропуск уровней (H1 → H3) и несколько H1 — типичные ошибки, снижающие понятность страницы для поисковика.
На странице присутствуют заголовки <h1> 1. Это прекрасно.
Тошнота
2,65
Насколько одно слово доминирует в тексте
?
Классическая тошнота = √(частота самого повторяющегося слова). Норма до 7–8: текст воспринимается естественно. Выше — поисковик может счесть страницу переспамленной.
Тошнота страницы в пределах нормы 3.
Академич. тошнота
4,23%
Насколько текст перенасыщен ключевыми словами
?
Академическая тошнота = (частота слова / общее количество слов) × 100%. Показывает долю конкретного слова в тексте. Норма 5–15%.
Академическая тошнота не дотягивает до нормы 5-15%. Измените текст страницы!
Семантическое ядро
20
Наиболее часто встречающиеся слова на странице
?
Топ слов по частоте использования. Показывает, какие слова доминируют в тексте с точки зрения поисковика.
Контент страницы содержит осмысленный текст и слова.
Показать список слов
| Слово | Кол-во | Частота |
|---|---|---|
| комиксы | 7 | 1,56% |
| психология | 7 | 1,56% |
| литература | 5 | 1,11% |
| развитие | 5 | 1,11% |
| творчество | 5 | 1,11% |
| бизнес | 5 | 1,11% |
| подарки | 5 | 1,11% |
| обучение | 3 | 0,67% |
| подарочные | 3 | 0,67% |
| аудиокниги | 3 | 0,67% |
| истории | 3 | 0,67% |
| культура | 3 | 0,67% |
| искусство | 3 | 0,67% |
| саморазвитие | 3 | 0,67% |
| мышление | 3 | 0,67% |
| маркетинг | 3 | 0,67% |
| бизнеса | 3 | 0,67% |
| компаний | 3 | 0,67% |
| современная | 2 | 0,45% |
| родителей | 2 | 0,45% |
Индексация Готовность: 40%
Индексирование
Есть ошибки
Разрешено ли индексирование страницы
?
Проверяет, не закрыта ли страница от индексации через robots.txt, meta robots или X-Robots-Tag. Страница, закрытая от индексации, не появится в поисковой выдаче.
Анкоров на странице 213 слишком много. Проведите ревизию и оптимизацию ссылок сайта.
Robots.txt
Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 1627 байт. Загружен за: 28мсек.
Проверяемая страница не запрещена в robots.txt.
Robots.txt доступен по постоянному адресу
Показать содержимое robots.txt
User-agent: *
Disallow: *?
Disallow: /login/
Disallow: /cart/
Disallow: /assets/components/
Disallow: /assets/snippets/
Disallow: /assets/templates/site/elements/
Disallow: /b2b/index.php
Disallow: /b2b/library/index.php
Disallow: /b2b/liga/newsletter/$
Disallow: /b2b/liga/office-library/$
Disallow: /b2b/liga/office-library/case/$
Disallow: /b2b/presents/index.php
Disallow: /b2b/sponsorship/index.php
Disallow: /black-friday-week/
Disallow: /book/export/yml/yandex/catalog.xml
Disallow: /cgi-bin/
Disallow: /children-books-new/
Disallow: /connectors/
Disallow: /core/
Disallow: /index.php
Disallow: /kvest1/
Disallow: /kvest2/
Disallow: /kvest3/
Disallow: /kvest4/
Disallow: /kvest5/
Disallow: /kvest6/
Disallow: /kvest7/
Disallow: /kvest8/
Disallow: /kvest9/
Disallow: /kvest10/
Disallow: /kvest11/
Disallow: /kvest12/
Disallow: /kvest13/
Disallow: /kvest14/
Disallow: /kvest-dyra/
Disallow: /kvest-dyra1/
Disallow: /kvest-dyra2/
Disallow: /kvest-dyra3/
Disallow: /kvest-dyra4/
Disallow: /kvest-dyra5/
Disallow: /kvest-dyra6/
Disallow: /kvest-dyra7/
Disallow: /kvest-dyra8/
Disallow: /kvest-spat/
Disallow: /kvest-spat1/
Disallow: /kvest-spat2/
Disallow: /kvest-spat3/
Disallow: /kvest-spat4/
Disallow: /kvest-spat5/
Disallow: /kvest-spat6/
Disallow: /kvest-spat7/
Disallow: /kvest-spat8/
Disallow: /main/
Disallow: /manager/
Disallow: /socialstat/
Disallow: /socialstat.html
Disallow: /book/book/download.ajax
Allow: /assets/new/build/
User-agent: AdsBot-Google
Allow: *?
Allow: /books/selection/
User-agent: AdsBot-Google-Mobile
Allow: *?
Allow: /books/selection/
Sitemap: https://www.mann-ivanov-ferber.ru/sitemap.xml
Sitemap
Кол-во: 1
XML-карта сайта для поисковиков
?
Sitemap.xml помогает поисковику быстрее находить и индексировать страницы. Особенно важен для крупных сайтов и новых страниц, на которые ещё нет входящих ссылок.
Robots.txt содержит карту сайта. Это прекрасно!
Robots.txt не содержит ошибок в карте сайта.
Показать карту сайта
| Url | Статус |
|---|---|
| https://www.mann-ivanov-ferber.ru/sitemap.xml |
|
Внутренние ссылки
Не найдено
Ссылки на другие страницы своего сайта
?
Внутренние ссылки распределяют ссылочный вес между страницами и помогают поисковику обходить сайт. Пустые анкоры и ссылки на запрещённые robots.txt страницы — типичные ошибки.
Внутренних ссылок на странице 0 оптимально.
Внешние ссылки
Кол-во: 203
Ссылки на сторонние сайты
?
Исходящие внешние ссылки передают часть ссылочного веса на чужие сайты. Ссылки на авторитетные ресурсы безопасны; ссылки на мусорные сайты могут навредить репутации страницы.
Внешних ссылок на странице 203 слишком много. Спрячьте лишние ссылки в тег noindex или атрибут rel='nofollow'!
На странице ссылки с атрибутом rel='nofollow' 1.
Показать первые 100 внешних ссылок
| Url | Анкор |
|---|---|
| mann-ivanov-ferber.ru |
Книги
|
| mann-ivanov-ferber.ru |
Проза
|
| mann-ivanov-ferber.ru |
Остросюжетная проза
|
| mann-ivanov-ferber.ru |
Молодёжная литература
|
| mann-ivanov-ferber.ru |
Современная зарубежная литература
|
| mann-ivanov-ferber.ru |
Классическая литература
|
| mann-ivanov-ferber.ru |
Интеллектуальная проза
|
| mann-ivanov-ferber.ru |
Романы взросления
|
| mann-ivanov-ferber.ru |
Детство
|
| mann-ivanov-ferber.ru |
Художественная литература для детей
|
| mann-ivanov-ferber.ru |
Научно-познавательные книги для детей
|
| mann-ivanov-ferber.ru |
KUMON
|
| mann-ivanov-ferber.ru |
Чевостик
|
| mann-ivanov-ferber.ru |
Развитие и обучение детей
|
| mann-ivanov-ferber.ru |
Досуг и творчество детей
|
| mann-ivanov-ferber.ru |
Книги для подростков
|
| mann-ivanov-ferber.ru |
Для родителей
|
| mann-ivanov-ferber.ru |
Комиксы для детей
|
| mann-ivanov-ferber.ru |
Детское творчество
|
| mann-ivanov-ferber.ru |
Умные книжки
|
| mann-ivanov-ferber.ru |
Подготовка к школе
|
| mann-ivanov-ferber.ru |
Необычный формат
|
| mann-ivanov-ferber.ru |
Подарочные
|
| mann-ivanov-ferber.ru |
Психология
|
| mann-ivanov-ferber.ru |
Популярная психология
|
| mann-ivanov-ferber.ru |
Стресс и эмоции
|
| mann-ivanov-ferber.ru |
Любовь и отношения
|
| mann-ivanov-ferber.ru |
Осознанность и медитация
|
| mann-ivanov-ferber.ru |
Книги для родителей
|
| mann-ivanov-ferber.ru |
Быть подростком
|
| mann-ivanov-ferber.ru |
Защита от токсичности
|
| mann-ivanov-ferber.ru |
Бизнес
|
| mann-ivanov-ferber.ru |
Аудиокниги
|
| mann-ivanov-ferber.ru |
Менеджмент
|
| mann-ivanov-ferber.ru |
Продажи
|
| mann-ivanov-ferber.ru |
Истории успеха
|
| mann-ivanov-ferber.ru |
Развитие сотрудников
|
| mann-ivanov-ferber.ru |
Предпринимателю
|
| mann-ivanov-ferber.ru |
Управление компанией
|
| mann-ivanov-ferber.ru |
Стратегия
|
| mann-ivanov-ferber.ru |
Управление проектами
|
| mann-ivanov-ferber.ru |
Переговоры
|
| mann-ivanov-ferber.ru |
Публичные выступления
|
| mann-ivanov-ferber.ru |
Подбор персонала
|
| mann-ivanov-ferber.ru |
Российский бизнес
|
| mann-ivanov-ferber.ru |
ИТ
|
| mann-ivanov-ferber.ru |
Культура
|
| mann-ivanov-ferber.ru |
Биографии
|
| mann-ivanov-ferber.ru |
Серия «Таро МИФ»
|
| mann-ivanov-ferber.ru |
Серия «Мифы от и до»
|
| mann-ivanov-ferber.ru |
Подарочные книги
|
| mann-ivanov-ferber.ru |
Культурные истории, страноведение
|
| mann-ivanov-ferber.ru |
Искусство и архитектура
|
| mann-ivanov-ferber.ru |
Театр и кино, музыка, литература
|
| mann-ivanov-ferber.ru |
Серия «Главное в истории»
|
| mann-ivanov-ferber.ru |
Саморазвитие
|
| mann-ivanov-ferber.ru |
Спокойствие и душевное равновесие
|
| mann-ivanov-ferber.ru |
Аудиокниги
|
| mann-ivanov-ferber.ru |
Мечты и цели
|
| mann-ivanov-ferber.ru |
Мотивация
|
| mann-ivanov-ferber.ru |
Мозг и интеллект
|
| mann-ivanov-ferber.ru |
Продуктивность
|
| mann-ivanov-ferber.ru |
Психология
|
| mann-ivanov-ferber.ru |
Общение
|
| mann-ivanov-ferber.ru |
Сила воли
|
| mann-ivanov-ferber.ru |
Тайм-менеджмент
|
| mann-ivanov-ferber.ru |
Деньги
|
| mann-ivanov-ferber.ru |
Обучение
|
| mann-ivanov-ferber.ru |
Выбор профессии
|
| mann-ivanov-ferber.ru |
Принятие решений
|
| mann-ivanov-ferber.ru |
Осознанность
|
| mann-ivanov-ferber.ru |
Стиль жизни
|
| mann-ivanov-ferber.ru |
Современная магия
|
| mann-ivanov-ferber.ru |
Дом и сад
|
| mann-ivanov-ferber.ru |
Кулинария
|
| mann-ivanov-ferber.ru |
Творчество
|
| mann-ivanov-ferber.ru |
Вдохновение и мотивация
|
| mann-ivanov-ferber.ru |
Творчество «своими руками»
|
| mann-ivanov-ferber.ru |
Рисование для начинающих
|
| mann-ivanov-ferber.ru |
Рисование для продолжающих
|
| mann-ivanov-ferber.ru |
Шрифты и каллиграфия
|
| mann-ivanov-ferber.ru |
Писательство
|
| mann-ivanov-ferber.ru |
Фотомастерская
|
| mann-ivanov-ferber.ru |
Раскраски для взрослых и альбомы
|
| mann-ivanov-ferber.ru |
Легендарная серия Барбары Шер
|
| mann-ivanov-ferber.ru |
Психология творчества
|
| mann-ivanov-ferber.ru |
Дизайн
|
| mann-ivanov-ferber.ru |
Развитие творчества
|
| mann-ivanov-ferber.ru |
Творческий бизнес
|
| mann-ivanov-ferber.ru |
Визуальное мышление
|
| mann-ivanov-ferber.ru |
Творческое мышление
|
| mann-ivanov-ferber.ru |
МАК МИФ
|
| mann-ivanov-ferber.ru |
Комиксы
|
| mann-ivanov-ferber.ru |
Детские комиксы
|
| mann-ivanov-ferber.ru |
Взрослые комиксы
|
| mann-ivanov-ferber.ru |
Молодежные комиксы
|
| mann-ivanov-ferber.ru |
Серии
|
| mann-ivanov-ferber.ru |
Познавательные комиксы
|
| mann-ivanov-ferber.ru |
Здоровье и медицина
|
| mann-ivanov-ferber.ru |
Правильное питание
|
Конкуренты Готовность: 6%
Конкуренты в Яндексе
Кол-во: 0
Топ сайтов-конкурентов в Яндексе
?
Сайты, чаще всего появляющиеся в ТОПе Яндекса по запросам из семантического ядра этой страницы.
Мы не нашли у вас конкурентов в Яндексе. Сайт или очень молодой или плохо продвигается.
Конкурентов в ТОП-10 Яндекса не нашлось.
Показать конкурентов в Яндексе
| Url | % в ТОПе |
|---|---|
| www.mann-ivanov-ferber.ru | 11,11% |
Конкуренты в Google
Найдены конкуренты: 39
Топ сайтов-конкурентов в Google
?
Сайты, чаще всего появляющиеся в ТОПе Google по запросам из семантического ядра этой страницы.
Конкурентов в ТОП-10 Google не нашлось.
У вас есть конкуренты, которые догоняют вас в ТОП-10 Google. Ваш % от ТОП'а составляет 11.
Показать конкурентов в Google
| Url | % в ТОПе |
|---|---|
| www.mann-ivanov-ferber.ru | 11,11% |
| www.ozon.ru | 11,11% |
| ru.wikipedia.org | 7,41% |
| www.nur.kz | 3,70% |
ФЗ-152: ПД Готовность: 40%
РКН
ОК
Сайт не заблокирован
Контакты
https://www.mann-ivanov-ferber.ru/about/contact/
Страница с контактами найдена
Политика ПД
https://www.mann-ivanov-ferber.ru/policy/
Страница политики обработки ПД найдена
Согласие
https://www.mann-ivanov-ferber.ru/personal/
Страница согласия на обработку ПД найдена
Чекбокс согласия
Не найден
Чекбокс согласия на обработку ПД в формах сайта не найден
Куки-баннер
Найден
Баннер согласия с использованием cookie найден
Счётчики до согласия
ОК
Счётчики аналитики не собирают данные до согласия пользователя
ЗоЗПП: права потребителей Готовность: 100%
Нарушения
Не выявлены
Признаков дистанционной продажи товаров (интернет-магазина) не обнаружено — требования ЗоЗПП о раскрытии информации продавца к сайту не применяются. Нарушений нет.
ФЗ-149: рекомендательные технологии Готовность: 100%
Нарушения
Не выявлены
Рекомендательные блоки («с этим покупают», «похожие товары» и т.п.) на сайте не обнаружены — требования ст. 10.7 ФЗ-149 к сайту не применяются. Нарушений нет.
ФЗ-38: реклама Готовность: 100%
Нарушения
Не выявлены
Рекламных тематик с обязательными оговорками (медицина, БАД, кредиты и займы, новостройки) на сайте не обнаружено. Нарушений нет.
ФЗ-436: защита детей Готовность: 0%
Возрастная маркировка
Нарушение
Знак возрастной категории (0+, 6+, 12+, 16+ или 18+)
?
Ст. 11–12 ФЗ-436: информационная продукция (новости, видео, книги, игры, курсы) должна сопровождаться знаком возрастной категории. Разместите знак на видном месте — обычно в шапке или подвале сайта.
Информационная продукция без возрастной маркировки (ст. 11 ФЗ-436)
Вердикт
Страница https://www.mann-ivanov-ferber.ru/subscribe-mif/ готова к продвижению на 59%. Чтобы еще улучшить страницу и попасть на первые места поисковой выдачи необходимо:
Исправьте ошибки в мета-тегах.
Исправьте ошибки оптимизации.
Исправьте ошибки индексации.
Поделитесь с друзьями: