Анализ страницы https://www.mann-ivanov-ferber.ru/business/
Основное Готовность: 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-сертификат действителен до 30.10.2026 12:32:55.
Поздравляем! Сайт не содержится в реестре РКН.
Кодировка
UTF-8
Кодировка символов страницы
?
Стандарт — UTF-8. Неправильная кодировка вызывает нечитаемые символы и мешает поисковику корректно распознать текст страницы.
Указана кодировка на странице UTF-8.
Язык
ru
Атрибут lang в HTML-теге
?
Атрибут lang (<html lang="ru">) сообщает поисковикам и браузерам, на каком языке написана страница. Помогает при ранжировании в региональном поиске.
Указан язык документа ru.
Скорость загрузки
~0,21сек
Время отклика сервера (TTFB)
?
Time To First Byte — время до получения первого байта от сервера. Норма до 200 мс. Медленный отклик ухудшает пользовательский опыт и ранжирование: Яндекс и Google учитывают скорость страниц.
Скорость загрузки сайта 0,21сек оптимальна.
Объем документа
1434Кб
Размер HTML-кода страницы
?
Слишком большой HTML замедляет парсинг браузером и сканирование поисковым роботом. Рекомендуется не более 200 Кб.
Объем html-документа 1434Кб оптимален.
Структура 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/KHRfb25SZWFkeSgoZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY3VzdG9tc3R5bGU9InllcyJdJyksZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZmllbGRdIHNwYW4sIFtmaWVsZF0gc3Ryb25nLCBbZmllbGRdIGVtLCBbZmllbGRdIGEiKSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl07cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4yNiYmKGkuc3R5bGUuZm9udFNpemU9bnVsbCxpLnN0eWxlLmxpbmVIZWlnaHQ9bnVsbCl9Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPWVbbl07cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4yNiYmKGkuc3R5bGUuZm9udFNpemU9bnVsbCl9byg0ODApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtvKDQ4MCl9KSw1MDApfSkpfSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixuKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bigpfSksNTAwKX0pKSk6KHdpbmRvdy5pbm5lcldpZHRoPDkwMHx8d2luZG93LmlzTW9iaWxlJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg8OTAwfHx0JiZzY3JlZW4ud2lkdGg8OTAwKSYmdF9vblJlYWR5KChmdW5jdGlvbigpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jdXN0b21zdHlsZT0ieWVzIl0nKSxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltmaWVsZF0gc3BhbiwgW2ZpZWxkXSBzdHJvbmcsIFtmaWVsZF0gZW0sIFtmaWVsZF0gYSIpLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIG89dFtuXTtwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLmZvbnRTaXplLnJlcGxhY2UoInB4IiwiIikpPjMwJiYoby5zdHlsZS5mb250U2l6ZT1udWxsLG8uc3R5bGUubGluZUhlaWdodD1udWxsKX1mb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLmZvbnRTaXplLnJlcGxhY2UoInB4IiwiIikpPjMwJiYoby5zdHlsZS5mb250U2l6ZT1udWxsKX1mb3IodmFyIGk9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnQtdGV4dDpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LW5hbWU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC10aXRsZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LWRlc2NyOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtaGVhZGluZzpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXRleHQtaW1wYWN0Om5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtc3VidGl0bGU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC11cHRpdGxlOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKScpLG49MDtuPGkubGVuZ3RoO24rKyl7dmFyIG8scj0obz1pW25dKS5nZXRBdHRyaWJ1dGUoInN0eWxlIik7aWYociYmci5pbmRleE9mKCJmb250LXNpemUiKT4tMSYmcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShvKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4zMClpZigicmVtIj09PW8uZ2V0QXR0cmlidXRlKCJkYXRhLWF1dG8tY29ycmVjdC1mb250LXNpemUiKSl7dmFyIGE9ci5yZXBsYWNlKC9mb250LXNpemUuKnB4Oy9naSwiZm9udC1zaXplOiAxLjZyZW07IikucmVwbGFjZSgibGluZS1oZWlnaHQiLCJsaW5laGVpZ2h0Iik7by5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKX1lbHNle3ZhciBhPXIucmVwbGFjZSgiZm9udC1zaXplIiwiZm9udHNpemUiKS5yZXBsYWNlKCJsaW5lLWhlaWdodCIsImxpbmVoZWlnaHQiKTtvLnNldEF0dHJpYnV0ZSgic3R5bGUiLGEpfX19KSkpfSgpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZePSJodHRwIl1bdGFyZ2V0PSJfYmxhbmsiXScpLGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIG49dFtlXSxvPW4uZ2V0QXR0cmlidXRlKCJyZWwiKXx8IiI7IiI9PT1vP24uc2V0QXR0cmlidXRlKCJyZWwiLCJub29wZW5lciIpOi0xPT09by5pbmRleE9mKCJub29wZW5lciIpJiZuLnNldEF0dHJpYnV0ZSgicmVsIixvKyIgbm9vcGVuZXIiKX19KSwyNTAwKX0pKSxmdW5jdGlvbih0LGUpe3Qub25lcnJvcj1mdW5jdGlvbihlLG4sbyxpLHIpeyJvYmplY3QiIT10eXBlb2YgdC50X2pzZXJyb3JzJiYodC50X2pzZXJyb3JzPVtdKSx0LnRfanNlcnJvcnMucHVzaCh7bWVzc2FnZTplLGZpbGVuYW1lOm4sbGluZW5vOm8sY29sbm86aSxlcnJvcjpyfSl9fSh3aW5kb3csTWF0aCksdF9vblJlYWR5KChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigicG9wdXBTaG93ZWQiLHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9faW5pdCksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJwb3B1cEhpZGRlbiIsKGZ1bmN0aW9uKCl7dmFyIHQ9d2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I7dCYmKHQuY2FuY2VsVGltZW91dCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodC5jYW5jZWxUaW1lb3V0KSx0LmNhbmNlbFRpbWVvdXQ9bnVsbCksdC5jYW5jZWxUaW1lb3V0PXdpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuY2FuY2VsVGltZW91dD1udWxsLHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fY2FuY2VsKCl9KSxNYXRoLm1pbigzMDAsdC5kZWxheSkpKX0pKX0pKSx3aW5kb3cuc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcjsKCmZ1bmN0aW9uIHRfdGhyb3R0bGUoZm4sdGhyZXNoaG9sZCxzY29wZSl7dmFyIGxhc3Q7dmFyIGRlZmVyVGltZXI7dGhyZXNoaG9sZHx8KHRocmVzaGhvbGQ9MjUwKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgY29udGV4dD1zY29wZXx8dGhpczt2YXIgbm93PStuZXcgRGF0ZSgpO3ZhciBhcmdzPWFyZ3VtZW50cztpZihsYXN0JiZub3c8bGFzdCt0aHJlc2hob2xkKXtjbGVhclRpbWVvdXQoZGVmZXJUaW1lcik7ZGVmZXJUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bGFzdD1ub3c7Zm4uYXBwbHkoY29udGV4dCxhcmdzKX0sdGhyZXNoaG9sZCl9ZWxzZXtsYXN0PW5vdztmbi5hcHBseShjb250ZXh0LGFyZ3MpfX19CmZ1bmN0aW9uIHQ4NjhfaW5pdFBvcHVwKHJlY2lkKXt2YXIgcmVjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWMnK3JlY2lkKTtpZighcmVjKXJldHVybjtyZWMuc2V0QXR0cmlidXRlKCdkYXRhLWFuaW1hdGlvbmFwcGVhcicsJ29mZicpO3JlYy5zdHlsZS5vcGFjaXR5PScxJzt2YXIgcG9wdXA9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50LXBvcHVwJyk7aWYoIXBvcHVwKXJldHVybjt2YXIgaG9vaz1wb3B1cC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdG9vbHRpcC1ob29rJyk7aWYoIWhvb2spcmV0dXJuO3ZhciBhbmFsaXRpY3M9cG9wdXAuZ2V0QXR0cmlidXRlKCdkYXRhLXRyYWNrLXBvcHVwJyk7dmFyIGN1c3RvbUNvZGVIVE1MPXQ4NjhfX3JlYWRDdXN0b21Db2RlKHJlYyk7dmFyIHJlY0Jsb2Nrcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucicpO2Zvcih2YXIgaT0wO2k8cmVjQmxvY2tzLmxlbmd0aDtpKyspe3JlY0Jsb2Nrc1tpXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZXZlbnQpe3ZhciB0YXJnZXQ9ZXZlbnQudGFyZ2V0O3ZhciBocmVmPXRhcmdldC5jbG9zZXN0KCdhW2hyZWYkPSInK2hvb2srJyJdJyk/dGFyZ2V0OiExO2lmKCFocmVmKXJldHVybjtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3Q4Njhfc2hvd1BvcHVwKHJlYyxjdXN0b21Db2RlSFRNTCk7dF9vbkZ1bmNMb2FkKCd0X3BvcHVwX19yZXNpemVQb3B1cCcsZnVuY3Rpb24oKXt0X3BvcHVwX19yZXNpemVQb3B1cChyZWNpZCl9KTtpZihob29rLnN1YnN0cmluZygwLDcpPT09JyNwb3B1cDonJiZhbmFsaXRpY3MmJndpbmRvdy5UaWxkYSl7dmFyIHZpcnRUaXRsZT1ob29rO3ZpcnRUaXRsZT12aXJ0VGl0bGUuc3Vic3RyaW5nKDcpO1RpbGRhLnNlbmRFdmVudFRvU3RhdGlzdGljcyhhbmFsaXRpY3MsdmlydFRpdGxlKX19KX0KaWYoIXBvcHVwLmdldEF0dHJpYnV0ZSgnZGF0YS1wb3B1cC1pbml0ZWQnKSYmJ011dGF0aW9uT2JzZXJ2ZXInIGluIHdpbmRvdyl7cG9wdXAuc2V0QXR0cmlidXRlKCdkYXRhLXBvcHVwLWluaXRlZCcsJ3llcycpO3ZhciBzdG9yZXM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYm9keSAudC1zdG9yZScpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoc3RvcmVzLGZ1bmN0aW9uKHN0b3JlKXtuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnNMaXN0KXtmb3IodmFyIG11dGF0aW9uIGluIG11dGF0aW9uc0xpc3Qpe3ZhciBldmVudD1tdXRhdGlvbnNMaXN0W211dGF0aW9uXTtpZihldmVudC50eXBlPT09J2F0dHJpYnV0ZXMnKXtpZihldmVudC50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ3QtcG9wdXBfc2hvdycpIT09LTEpe3BvcHVwLnN0eWxlLnpJbmRleD0nOTk5OTk5OTknO3Q4NjhfaW5pdFBvcHVwKHJlY2lkKTt9fX19KS5vYnNlcnZlKHN0b3JlLHthdHRyaWJ1dGVzOiEwLGF0dHJpYnV0ZUZpbHRlcjpbJ2NsYXNzJ10sc3VidHJlZTohMCx9KX0pfX0KZnVuY3Rpb24gdDg2OF9fcmVhZEN1c3RvbUNvZGUocmVjKXt2YXIgY29kZVdyYXA9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50ODY4IC50ODY4X19jb2RlLXdyYXAnKTtpZighY29kZVdyYXApcmV0dXJuO3ZhciBjdXN0b21Db2RlPWNvZGVXcmFwLmlubmVySFRNTDtyZXR1cm4gY3VzdG9tQ29kZX0KZnVuY3Rpb24gdDg2OF9zaG93UG9wdXAocmVjKXt2YXIgcG9wdXA9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50LXBvcHVwJyk7aWYoIXBvcHVwKXJldHVybjt2YXIgcG9wdXBDb250YWluZXI9cG9wdXAucXVlcnlTZWxlY3RvcignLnQtcG9wdXBfX2NvbnRhaW5lcicpO2lmKCFwb3B1cENvbnRhaW5lcilyZXR1cm47dmFyIGNvZGVXcmFwPXBvcHVwLnF1ZXJ5U2VsZWN0b3IoJy50ODY4X19jb2RlLXdyYXAnKTtpZighY29kZVdyYXApcmV0dXJuO3ZhciB3aW5kb3dXaWR0aD13aW5kb3cuaW5uZXJXaWR0aDt2YXIgc2NyZWVuTWluPXJlYy5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2NyZWVuLW1pbicpO3ZhciBzY3JlZW5NYXg9cmVjLmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JlZW4tbWF4Jyk7aWYoc2NyZWVuTWluJiZ3aW5kb3dXaWR0aDxwYXJzZUludChzY3JlZW5NaW4sMTApKXJldHVybjtpZihzY3JlZW5NYXgmJndpbmRvd1dpZHRoPnBhcnNlSW50KHNjcmVlbk1heCwxMCkpcmV0dXJuO3BvcHVwLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJztjb2RlV3JhcC5zdHlsZS5kaXNwbGF5PSdibG9jayc7dDg2OF9zZXRIZWlnaHQocmVjKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cG9wdXBDb250YWluZXIuY2xhc3NMaXN0LmFkZCgndC1wb3B1cF9fY29udGFpbmVyLWFuaW1hdGVkJyk7cG9wdXAuY2xhc3NMaXN0LmFkZCgndC1wb3B1cF9zaG93Jyl9LDEwMCk7aWYodHlwZW9mIHRfdHJpZ2dlckV2ZW50PT09J2Z1bmN0aW9uJyl0X3RyaWdnZXJFdmVudChkb2N1bWVudC5ib2R5LCdwb3B1cFNob3dlZCcpO2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgndC1ib2R5X3BvcHVwc2hvd2VkJyk7cG9wdXAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGV2ZW50KXt2YXIgY29udGFpbmVyPWV2ZW50LnRhcmdldC5jbG9zZXN0KCcudC1wb3B1cF9fY29udGFpbmVyJyk7aWYoIWNvbnRhaW5lcil0ODY4X2Nsb3NlUG9wdXAocmVjKX0pO3ZhciBjbG9zZUJ1dHRvbj1yZWMucXVlcnlTZWxlY3RvcignLnQtcG9wdXBfX2Nsb3NlJyk7aWYoY2xvc2VCdXR0b24pe2Nsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe3Q4NjhfY2xvc2VQb3B1cChyZWMpfSl9CnZhciBidXR0b25zPXJlYy5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWYqPSIjIl0nKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGJ1dHRvbnMsZnVuY3Rpb24oYnV0dG9uKXtidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7dmFyIHVybD1idXR0b24uZ2V0QXR0cmlidXRlKCdocmVmJyk7aWYodXJsLmluZGV4T2YoJyNvcmRlcicpIT09LTEpe3ZhciBwb3B1cENvbnRhaW5lcj1yZWMucXVlcnlTZWxlY3RvcignLnQtcG9wdXBfX2NvbnRhaW5lcicpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt3aGlsZShwb3B1cENvbnRhaW5lci5maXJzdENoaWxkKXtwb3B1cENvbnRhaW5lci5yZW1vdmVDaGlsZChwb3B1cENvbnRhaW5lci5maXJzdENoaWxkKX19LDYwMCl9CmlmKCF1cmx8fHVybC5zdWJzdHJpbmcoMCw3KSE9PScjcHJpY2U6Jyl7dDg2OF9jbG9zZVBvcHVwKHJlYyk7aWYoIXVybHx8dXJsLnN1YnN0cmluZygwLDcpPT09JyNwb3B1cDonKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYodHlwZW9mIHRfdHJpZ2dlckV2ZW50PT09J2Z1bmN0aW9uJyl0X3RyaWdnZXJFdmVudChkb2N1bWVudC5ib2R5LCdwb3B1cFNob3dlZCcpO2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgndC1ib2R5X3BvcHVwc2hvd2VkJyl9LDMwMCl9fX0pfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50LmtleUNvZGU9PT0yNyl7dDg2OF9jbG9zZVBvcHVwKHJlYyl9fSl9CmZ1bmN0aW9uIHQ4NjhfY2xvc2VQb3B1cChyZWMpe3ZhciBwb3B1cD1yZWMucXVlcnlTZWxlY3RvcignLnQtcG9wdXAnKTt2YXIgY29kZVdyYXA9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50ODY4IC50ODY4X19jb2RlLXdyYXAnKTtpZih0eXBlb2YgdF90cmlnZ2VyRXZlbnQ9PT0nZnVuY3Rpb24nKXRfdHJpZ2dlckV2ZW50KGRvY3VtZW50LmJvZHksJ3BvcHVwSGlkZGVuJyk7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCd0LWJvZHlfcG9wdXBzaG93ZWQnKTtwb3B1cC5jbGFzc0xpc3QucmVtb3ZlKCd0LXBvcHVwX3Nob3cnKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoIXBvcHVwLmNsYXNzTGlzdC5jb250YWlucygnLnQtcG9wdXBfc2hvdycpKXtwb3B1cC5zdHlsZS5kaXNwbGF5PSdub25lJztpZihjb2RlV3JhcCl7Y29kZVdyYXAuc3R5bGUuZGlzcGxheT0nbm9uZSd9fX0sMzAwKX0KZnVuY3Rpb24gdDg2OF9zZXRIZWlnaHQocmVjKXt2YXIgdmlkZW9DYXJpZXI9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50ODY4X192aWRlby1jYXJpZXInKTtpZighdmlkZW9DYXJpZXIpcmV0dXJuO3ZhciBwYWRkaW5nTGVmdD1wYXJzZUludCh2aWRlb0Nhcmllci5zdHlsZS5wYWRkaW5nTGVmdCwxMCl8fDA7dmFyIHBhZGRpbmdSaWdodD1wYXJzZUludCh2aWRlb0Nhcmllci5zdHlsZS5wYWRkaW5nUmlnaHQsMTApfHwwO3ZhciBoZWlnaHQ9KHZpZGVvQ2FyaWVyLmNsaWVudFdpZHRoLShwYWRkaW5nTGVmdCtwYWRkaW5nUmlnaHQpKS8oMTYvOSk7dmlkZW9DYXJpZXIuc3R5bGUuaGVpZ2h0PWhlaWdodDtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHZpZGVvQ2FyaWVyLmNsb3Nlc3QsZnVuY3Rpb24ocGFyZW50KXtwYXJlbnQuc3R5bGUuaGVpZ2h0PWhlaWdodH0pfQppZighRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyl7RWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcz1FbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5tb3pNYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUub01hdGNoZXNTZWxlY3Rvcn0KaWYoIUVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3Qpe0VsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3Q9ZnVuY3Rpb24ocyl7dmFyIGVsPXRoaXM7d2hpbGUoZWwmJmVsLm5vZGVUeXBlPT09MSl7aWYoRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcy5jYWxsKGVsLHMpKXtyZXR1cm4gZWx9CmVsPWVsLnBhcmVudEVsZW1lbnR8fGVsLnBhcmVudE5vZGV9CnJldHVybiBudWxsfX0KZnVuY3Rpb24gdDM5M19hcHBlYXJNZW51KHJlY0lkKXtpZih3aW5kb3cuaW5uZXJXaWR0aD45ODApe3ZhciByZWNzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50MzkzJyk7dmFyIHNjcm9sbFRvcD13aW5kb3cucGFnZVlPZmZzZXQ7dmFyIGJvZHk9ZG9jdW1lbnQuYm9keTt2YXIgaHRtbD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7dmFyIGRvY3VtZW50SGVpZ2h0PU1hdGgubWF4KGJvZHkuc2Nyb2xsSGVpZ2h0LGJvZHkub2Zmc2V0SGVpZ2h0LGh0bWwuY2xpZW50SGVpZ2h0LGh0bWwuc2Nyb2xsSGVpZ2h0LGh0bWwub2Zmc2V0SGVpZ2h0KTtmb3IodmFyIGk9MDtpPHJlY3MubGVuZ3RoO2krKyl7dmFyIHJlYz1yZWNzW2ldO3ZhciBhcHBlYXJPZmZzZXQ9cmVjLmdldEF0dHJpYnV0ZSgnZGF0YS1hcHBlYXJvZmZzZXQnKTt2YXIgaGlkZU9mZnNldD1yZWMuZ2V0QXR0cmlidXRlKCdkYXRhLWhpZGVvZmZzZXQnKTtpZihhcHBlYXJPZmZzZXQpe2lmKGFwcGVhck9mZnNldC5pbmRleE9mKCd2aCcpPi0xKXthcHBlYXJPZmZzZXQ9TWF0aC5mbG9vcih3aW5kb3cuaW5uZXJIZWlnaHQqKHBhcnNlSW50KGFwcGVhck9mZnNldCkvMTAwKSl9CmFwcGVhck9mZnNldD1wYXJzZUludChhcHBlYXJPZmZzZXQsMTApO2lmKHNjcm9sbFRvcD49YXBwZWFyT2Zmc2V0KXtpZihyZWMuc3R5bGUudmlzaWJpbGl0eT09PSdoaWRkZW4nKXtyZWMuc3R5bGUudmlzaWJpbGl0eT0ndmlzaWJsZSc7dDM5M19fZmFkZUluKHJlYyl9fWVsc2V7cmVjLnN0eWxlLnZpc2liaWxpdHk9J2hpZGRlbid9fQppZihoaWRlT2Zmc2V0KXtpZihoaWRlT2Zmc2V0LmluZGV4T2YoJ3ZoJyk+LTEpe2hpZGVPZmZzZXQ9TWF0aC5mbG9vcih3aW5kb3cuaW5uZXJIZWlnaHQqKHBhcnNlSW50KGhpZGVPZmZzZXQpLzEwMCkpfQpoaWRlT2Zmc2V0PXBhcnNlSW50KGhpZGVPZmZzZXQsMTApO2lmKHNjcm9sbFRvcCt3aW5kb3cuaW5uZXJIZWlnaHQ+PWRvY3VtZW50SGVpZ2h0LWhpZGVPZmZzZXQpe2lmKHJlYy5zdHlsZS52aXNpYmlsaXR5IT09J2hpZGRlbicpe3JlYy5zdHlsZS52aXNpYmlsaXR5PSdoaWRkZW4nfX1lbHNlIGlmKGFwcGVhck9mZnNldCl7aWYoc2Nyb2xsVG9wPj1hcHBlYXJPZmZzZXQpe3JlYy5zdHlsZS52aXNpYmlsaXR5PSd2aXNpYmxlJ319ZWxzZXtyZWMuc3R5bGUudmlzaWJpbGl0eT0ndmlzaWJsZSd9fX19fQpmdW5jdGlvbiB0MzkzX19mYWRlSW4oZWwpe2lmKGVsLnN0eWxlLmRpc3BsYXk9PT0nYmxvY2snKXJldHVybjt2YXIgb3BhY2l0eT0wO2VsLnN0eWxlLm9wYWNpdHk9b3BhY2l0eTtlbC5zdHlsZS5kaXNwbGF5PSdibG9jayc7dmFyIHRpbWVyPXNldEludGVydmFsKGZ1bmN0aW9uKCl7ZWwuc3R5bGUub3BhY2l0eT1vcGFjaXR5O29wYWNpdHkrPTAuMTtpZihvcGFjaXR5Pj0xLjApe2NsZWFySW50ZXJ2YWwodGltZXIpO2VsLnN0eWxlLmRpc3BsYXk9Jyd9fSwzMCl9CmZ1bmN0aW9uIHQ5NDNfaW5pdChyZWNJZCxwcmV2aWV3TW9kZSl7dDk0M19zaG93QnV0dG9uKHJlY0lkLHByZXZpZXdNb2RlKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyx0X3Rocm90dGxlKGZ1bmN0aW9uKCl7dDk0M19zaG93QnV0dG9uKHJlY0lkLHByZXZpZXdNb2RlKX0sMjAwKSl9CmZ1bmN0aW9uIHQ5NDNfc2hvd0J1dHRvbihyZWNJZCxwcmV2aWV3TW9kZSl7dmFyIHJlYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjJytyZWNJZCk7aWYoIXJlYylyZXR1cm47dmFyIGJ1dHRvbldyYXBwZXI9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50OTQzX19idXR0b253cmFwcGVyJyk7aWYoIWJ1dHRvbldyYXBwZXIpcmV0dXJuO3ZhciBidXR0b249cmVjLnF1ZXJ5U2VsZWN0b3IoJy50OTQzX19idG4nKTtpZighYnV0dG9uKXJldHVybjt2YXIgYm9keT1kb2N1bWVudC5ib2R5O3ZhciBodG1sPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDt2YXIgd2luZG93V2lkdGg9d2luZG93LmlubmVyV2lkdGg7dmFyIHdpbmRvd0hlaWdodD1zY3JlZW4uaGVpZ2h0O3ZhciBzY3JvbGxIZWlnaHQ9TWF0aC5tYXgoYm9keS5zY3JvbGxIZWlnaHQsYm9keS5vZmZzZXRIZWlnaHQsaHRtbC5jbGllbnRIZWlnaHQsaHRtbC5zY3JvbGxIZWlnaHQsaHRtbC5vZmZzZXRIZWlnaHQpO3ZhciBzY3JvbGxUb3A9d2luZG93LnNjcm9sbFk7dmFyIGFwcGVhck9mZnNldD1idXR0b24uZ2V0QXR0cmlidXRlKCdkYXRhLWFwcGVhcm9mZnNldCcpO3ZhciBoaWRlT2Zmc2V0PWJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2RhdGEtaGlkZW9mZnNldCcpO2lmKHByZXZpZXdNb2RlJiZhcHBlYXJPZmZzZXQmJndpbmRvd1dpZHRoPDk2MCl7aWYoYXBwZWFyT2Zmc2V0LmluZGV4T2YoJ3ZoJyk+LTEpe2FwcGVhck9mZnNldD1NYXRoLmZsb29yKHNjcmVlbi5oZWlnaHQqKHBhcnNlSW50KGFwcGVhck9mZnNldCkvMTAwKSl9CmFwcGVhck9mZnNldD1wYXJzZUludChhcHBlYXJPZmZzZXQsMTApO2lmKHNjcm9sbFRvcD49YXBwZWFyT2Zmc2V0KXtidXR0b24uY2xhc3NMaXN0LnJlbW92ZSgndDk0M19fYnRuX2hpZGRlbicpO2J1dHRvbldyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgndDk0M19fYnRud3JhcHBlcl9oaWRkZW4nKX1lbHNle2J1dHRvbi5jbGFzc0xpc3QuYWRkKCd0OTQzX19idG5faGlkZGVuJyk7YnV0dG9uV3JhcHBlci5jbGFzc0xpc3QuYWRkKCd0OTQzX19idG53cmFwcGVyX2hpZGRlbicpfX0KaWYocHJldmlld01vZGUmJmhpZGVPZmZzZXQmJndpbmRvd1dpZHRoPDk2MCl7aWYoaGlkZU9mZnNldC5pbmRleE9mKCd2aCcpPi0xKXtoaWRlT2Zmc2V0PU1hdGguZmxvb3Ioc2NyZWVuLmhlaWdodCoocGFyc2VJbnQoaGlkZU9mZnNldCkvMTAwKSl9CmhpZGVPZmZzZXQ9cGFyc2VJbnQoaGlkZU9mZnNldCwxMCk7aWYoc2Nyb2xsSGVpZ2h0LWhpZGVPZmZzZXQ8PXdpbmRvd0hlaWdodCtzY3JvbGxUb3Ape2J1dHRvbi5jbGFzc0xpc3QuYWRkKCd0OTQzX19idG5faGlkZGVuJyk7YnV0dG9uV3JhcHBlci5jbGFzc0xpc3QuYWRkKCd0OTQzX19idG53cmFwcGVyX2hpZGRlbicpfWVsc2UgaWYoIWFwcGVhck9mZnNldCYmc2Nyb2xsVG9wPmFwcGVhck9mZnNldCl7YnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ3Q5NDNfX2J0bl9oaWRkZW4nKTtidXR0b25XcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ3Q5NDNfX2J0bndyYXBwZXJfaGlkZGVuJyl9fX0KZnVuY3Rpb24gdF9sYXp5bG9hZF91cGRhdGUoKXsidW5kZWZpbmVkIiE9dHlwZW9mIGxhenlsb2FkX2NvdmVyJiZsYXp5bG9hZF9jb3Zlci51cGRhdGUoKSwidW5kZWZpbmVkIiE9dHlwZW9mIGxhenlsb2FkX2ltZyYmbGF6eWxvYWRfaW1nLnVwZGF0ZSgpLCJ1bmRlZmluZWQiIT10eXBlb2YgbGF6eWxvYWRfYmdpbWcmJmxhenlsb2FkX2JnaW1nLnVwZGF0ZSgpLCJ1bmRlZmluZWQiIT10eXBlb2YgbGF6eWxvYWRfaWZyYW1lJiZsYXp5bG9hZF9pZnJhbWUudXBkYXRlKCl9ZnVuY3Rpb24gdF9sYXp5bG9hZF91cGRhdGVSZXNpemVfZWxlbShlKXtpZih3aW5kb3cualF1ZXJ5JiZlIGluc3RhbmNlb2YgalF1ZXJ5KXtpZigwPT1lLmxlbmd0aClyZXR1cm47ZT1lLmdldCgwKX1pZihudWxsIT1lKXt2YXIgdD1lLnRhZ05hbWU7aWYoIklNRyI9PXQpdmFyIG89ZS5nZXRBdHRyaWJ1dGUoInNyYyIpLG49Ii0vcmVzaXplLyI7ZWxzZSBpZigidW5kZWZpbmVkIiE9dHlwZW9mIGdldENvbXB1dGVkU3R5bGUpe3ZhciBvPWdldENvbXB1dGVkU3R5bGUoZSlbImJhY2tncm91bmQtaW1hZ2UiXS5yZXBsYWNlKCJ1cmwoIiwiIikucmVwbGFjZSgiKSIsIiIpLnJlcGxhY2UoLyIvZ2ksIiIpLGk7aWYoImNvbnRhaW4iPT1nZXRDb21wdXRlZFN0eWxlKGUpWyJiYWNrZ3JvdW5kLXNpemUiXSl2YXIgbj0iLS9jb250YWluLyI7ZWxzZSB2YXIgbj0iLS9jb3Zlci8ifWVsc2UgdmFyIG49Ii0vY292ZXIvIjtpZighKG51bGw9PW98fC0xPT09by5pbmRleE9mKG4pfHxvLmluZGV4T2YoIi5zdmciKT4wfHxvLmluZGV4T2YoIi5naWYiKT4wfHxvLmluZGV4T2YoIi5pY28iKT4wfHwtMT09PW8uaW5kZXhPZigidGh1bWIudGlsZGFjZG4uY29tIil8fG8uaW5kZXhPZigiLS9lbXB0eS8iKT4wJiZvLmluZGV4T2YoIi0vcmVzaXplYi8iKT4wKSl7dmFyIGw9by5pbmRleE9mKG4pK24ubGVuZ3RoLGE9by5pbmRleE9mKCIvIixsKTtpZihsPjAmJmE+MCl7dmFyIHI9by5zbGljZShsLGEpLnNwbGl0KCJ4Iikscz1lLmNsaWVudFdpZHRoLGM9ZS5jbGllbnRIZWlnaHQ7aWYocz4wJiZjPjAmJihyWzBdPjB8fHJbMV0+MCkmJihyWzBdPjAmJnM+clswXXx8clsxXT4wJiZjPnJbMV0pJiYoclswXT4wJiZzLXJbMF0+MTAwfHxyWzFdPjAmJmMtclsxXT4xMDApKXt2YXIgZD1vLnNsaWNlKDAsbCkrKHJbMF0+MD9zOiIiKSsieCIrKHJbMV0+MD9jOiIiKStvLnN1YnN0cmluZyhhKTsiSU1HIj09dD9lLnNldEF0dHJpYnV0ZSgic3JjIixkKTplLnN0eWxlLmJhY2tncm91bmRJbWFnZT0idXJsKCciK2QrIicpIn19fX19IWZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sdCk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPXQoKTplLkxhenlMb2FkPXQoKX0od2luZG93LChmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXttfHwoaD17ZWxlbWVudHNfc2VsZWN0b3I6ImltZyIsY29udGFpbmVyOndpbmRvdyx0aHJlc2hvbGQ6MzAwLHRocm90dGxlOjUwLGRhdGFfc3JjOiJvcmlnaW5hbCIsZGF0YV9zcmNzZXQ6Im9yaWdpbmFsLXNldCIsY2xhc3NfbG9hZGluZzoibG9hZGluZyIsY2xhc3NfbG9hZGVkOiJsb2FkZWQiLHNraXBfaW52aXNpYmxlOiEwLHNob3dfd2hpbGVfbG9hZGluZzohMCxjYWxsYmFja19sb2FkOm51bGwsY2FsbGJhY2tfZXJyb3I6bnVsbCxjYWxsYmFja19zZXQ6bnVsbCxjYWxsYmFja19wcm9jZXNzZWQ6bnVsbCxwbGFjZWhvbGRlcjoiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBQUFBQVAvLy95SDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUJSQUE3In0scD0hIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyLGY9ISF3aW5kb3cuYXR0YWNoRXZlbnQsZz0hIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LG09ITApfWZ1bmN0aW9uIHQoZSx0LG8pe3ZhciBuO3A/ZS5hZGRFdmVudExpc3RlbmVyKHQsbyk6ZiYmKGUuYXR0YWNoRXZlbnQoIm9uIit0LChuPWUsZnVuY3Rpb24oKXtvLmNhbGwobix3aW5kb3cuZXZlbnQpfSkpLGU9bnVsbCl9ZnVuY3Rpb24gbyhlLHQsbyl7cD9lLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxvKTpmJiZlLmRldGFjaEV2ZW50KCJvbiIrdCxvKX1mdW5jdGlvbiBuKGUsdCxvKXt2YXIgbixpLGw7ZnVuY3Rpb24gYSgpe3JldHVybiB3aW5kb3cuaW5uZXJXaWR0aHx8bi5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh8fGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGh9ZnVuY3Rpb24gcigpe3JldHVybiB3aW5kb3cuaW5uZXJIZWlnaHR8fG4uZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodHx8ZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHR9ZnVuY3Rpb24gcyhlKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AraS1uLmRvY3VtZW50RWxlbWVudC5jbGllbnRUb3B9ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0K2wtbi5kb2N1bWVudEVsZW1lbnQuY2xpZW50TGVmdH1mdW5jdGlvbiBkKCl7dmFyIG47cmV0dXJuKG49dD09PXdpbmRvdz9yKCkraTpzKHQpK3Qub2Zmc2V0SGVpZ2h0KTw9cyhlKS1vfWZ1bmN0aW9uIHUoKXt2YXIgbjtyZXR1cm4obj10PT09d2luZG93P2EoKSt3aW5kb3cucGFnZVhPZmZzZXQ6Yyh0KSthKCkpPD1jKGUpLW99ZnVuY3Rpb24gXygpe3ZhciBvLG49MTIwMDtyZXR1cm4obz10PT09d2luZG93P2k6cyh0KSk+PXMoZSkrbitlLm9mZnNldEhlaWdodH1mdW5jdGlvbiBoKCl7dmFyIG47cmV0dXJuKG49dD09PXdpbmRvdz9sOmModCkpPj1jKGUpK28rZS5vZmZzZXRXaWR0aH1yZXR1cm4gbj1lLm93bmVyRG9jdW1lbnQsaT13aW5kb3cucGFnZVlPZmZzZXR8fG4uYm9keS5zY3JvbGxUb3AsbD13aW5kb3cucGFnZVhPZmZzZXR8fG4uYm9keS5zY3JvbGxMZWZ0LCJmaXhlZCI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1jb250ZW50LWNvdmVyLXBhcmFsbGF4IikmJmUuY2xvc2VzdCYmZS5jbG9zZXN0KCIudC1jb3Zlcl9fY29udGFpbmVyIikmJihlPWUuY2xvc2VzdCgiLnQtY292ZXJfX2NvbnRhaW5lciIpKSwhKGQoKXx8XygpfHx1KCl8fGgoKSl9ZnVuY3Rpb24gaSgpe3ZhciBlO3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfWZ1bmN0aW9uIGwoZSx0KXt2YXIgbz17fSxuO2ZvcihuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKG9bbl09ZVtuXSk7Zm9yKG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiYob1tuXT10W25dKTtyZXR1cm4gb31mdW5jdGlvbiBhKGUpe3ZhciB0O3RyeXt0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpfWNhdGNoKGwpe3ZhciBvPVtdLG4saT1lLmxlbmd0aDtmb3Iobj0wO248aTtuKyspby5wdXNoKGVbbl0pO3Q9b31yZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmlzU2tpcEJ5UG9zaXRpb249bnVsbD09PWUub2Zmc2V0UGFyZW50JiYwPT09cihlLCIudDM5Nl9fY2Fycmllci13cmFwcGVyIikubGVuZ3RoJiYiZml4ZWQiIT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtY29udGVudC1jb3Zlci1wYXJhbGxheCIpLGUuaXNOb3RVbmRlclNjcmVlblJhbmdlPTA9PT1yKGUsIi50LXJlY1tkYXRhLXNjcmVlbi1tYXhdIikubGVuZ3RoJiYwPT09cihlLCIudC1yZWNbZGF0YS1zY3JlZW4tbWluXSIpLmxlbmd0aH0pKSx0fWZ1bmN0aW9uIHIoZSx0KXtmb3IodmFyIG89W107KGU9ZS5wYXJlbnROb2RlKSYmZSE9PWRvY3VtZW50Oyl0JiYhZS5tYXRjaGVzKHQpfHxvLnVuc2hpZnQoZSk7cmV0dXJuIG99ZnVuY3Rpb24gcyhlLHQpe2c/ZS5jbGFzc0xpc3QuYWRkKHQpOmUuY2xhc3NOYW1lKz0oZS5jbGFzc05hbWU/IiAiOiIiKSt0fWZ1bmN0aW9uIGMoZSx0KXtnP2UuY2xhc3NMaXN0LnJlbW92ZSh0KTplLmNsYXNzTmFtZT1lLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoIihefFxccyspIit0KyIoXFxzK3wkKSIpLCIgIikucmVwbGFjZSgvXlxzKy8sIiIpLnJlcGxhY2UoL1xzKyQvLCIiKX1mdW5jdGlvbiBkKGUsdCxvLG4pe3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbiksbD10LmdldEF0dHJpYnV0ZSgiZGF0YS0iK28pLGE9ZS50YWdOYW1lO3JldHVybiJJTUciPT09YT8obCYmZS5zZXRBdHRyaWJ1dGUoInNyY3NldCIsbCksdm9pZChpJiZlLnNldEF0dHJpYnV0ZSgic3JjIixpKSkpOiJJRlJBTUUiPT09YT92b2lkKGkmJmUuc2V0QXR0cmlidXRlKCJzcmMiLGkpKTp2b2lkKGUuc3R5bGUuYmFja2dyb3VuZEltYWdlPSJ1cmwoIitpKyIpIil9ZnVuY3Rpb24gdShlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHQsYXJndW1lbnRzKX19ZnVuY3Rpb24gXyhvKXtlKCksdGhpcy5fc2V0dGluZ3M9bChoLG8pLHRoaXMuX3F1ZXJ5T3JpZ2luTm9kZT10aGlzLl9zZXR0aW5ncy5jb250YWluZXI9PT13aW5kb3c/ZG9jdW1lbnQ6dGhpcy5fc2V0dGluZ3MuY29udGFpbmVyLHRoaXMuX3ByZXZpb3VzTG9vcFRpbWU9MCx0aGlzLl9sb29wVGltZW91dD1udWxsLHRoaXMuX2hhbmRsZVNjcm9sbEZuPXUodGhpcy5oYW5kbGVTY3JvbGwsdGhpcyksdCh3aW5kb3csInJlc2l6ZSIsdGhpcy5faGFuZGxlU2Nyb2xsRm4pLHRoaXMudXBkYXRlKCl9d2luZG93LnRfbGF6eWxvYWRfc2V0U291cmNlcz1kO3ZhciBoLHAsZixnLG09ITE7cmV0dXJuIF8ucHJvdG90eXBlLl9zaG93T25Mb2FkPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXtudWxsIT09bCYmKGwuY2FsbGJhY2tfbG9hZCYmbC5jYWxsYmFja19sb2FkKGUpLGQoZSxlLGwuZGF0YV9zcmNzZXQsbC5kYXRhX3NyYyksbC5jYWxsYmFja19zZXQmJmwuY2FsbGJhY2tfc2V0KGUpLGMoZSxsLmNsYXNzX2xvYWRpbmcpLHMoZSxsLmNsYXNzX2xvYWRlZCksbyhpLCJsb2FkIixuKSl9dmFyIGksbD10aGlzLl9zZXR0aW5ncztlLmdldEF0dHJpYnV0ZSgic3JjIil8fGUuc2V0QXR0cmlidXRlKCJzcmMiLGwucGxhY2Vob2xkZXIpLHQoaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSwibG9hZCIsbiksdChpLCJlcnJvciIsKGZ1bmN0aW9uKCl7YyhlLGwuY2xhc3NfbG9hZGluZyksbC5jYWxsYmFja19lcnJvciYmbC5jYWxsYmFja19lcnJvcihlKX0pKSxzKGUsbC5jbGFzc19sb2FkaW5nKSxkKGksZSxsLmRhdGFfc3Jjc2V0LGwuZGF0YV9zcmMpfSxfLnByb3RvdHlwZS5fc2hvd09uQXBwZWFyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXtudWxsIT09aSYmKGkuY2FsbGJhY2tfbG9hZCYmaS5jYWxsYmFja19sb2FkKGUpLGMoZSxpLmNsYXNzX2xvYWRpbmcpLHMoZSxpLmNsYXNzX2xvYWRlZCksbyhlLCJsb2FkIixuKSl9dmFyIGk9dGhpcy5fc2V0dGluZ3M7KCJJTUciPT09ZS50YWdOYW1lfHwiSUZSQU1FIj09PWUudGFnTmFtZSkmJih0KGUsImxvYWQiLG4pLHQoZSwiZXJyb3IiLChmdW5jdGlvbigpe28oZSwibG9hZCIsbiksYyhlLGkuY2xhc3NfbG9hZGluZyksaS5jYWxsYmFja19lcnJvciYmaS5jYWxsYmFja19lcnJvcihlKX0pKSxzKGUsaS5jbGFzc19sb2FkaW5nKSksZChlLGUsaS5kYXRhX3NyY3NldCxpLmRhdGFfc3JjKSxpLmNhbGxiYWNrX3NldCYmaS5jYWxsYmFja19zZXQoZSl9LF8ucHJvdG90eXBlLl9sb29wVGhyb3VnaEVsZW1lbnRzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvPXRoaXMuX3NldHRpbmdzLGk9dGhpcy5fZWxlbWVudHMsbD1pP2kubGVuZ3RoOjAsYT1bXTtmb3IoZT0wO2w+ZTtlKyspdD1pW2VdLG8uc2tpcF9pbnZpc2libGUmJnQuaXNTa2lwQnlQb3NpdGlvbnx8bih0LG8uY29udGFpbmVyLG8udGhyZXNob2xkKSYmKG8uc2hvd193aGlsZV9sb2FkaW5nP3RoaXMuX3Nob3dPbkFwcGVhcih0KTp0aGlzLl9zaG93T25Mb2FkKHQpLGEucHVzaChlKSx0Lndhc1Byb2Nlc3NlZD0hMCk7Zm9yKDthLmxlbmd0aD4wOylpLnNwbGljZShhLnBvcCgpLDEpLG8uY2FsbGJhY2tfcHJvY2Vzc2VkJiZvLmNhbGxiYWNrX3Byb2Nlc3NlZChpLmxlbmd0aCk7MD09PWwmJnRoaXMuX3N0b3BTY3JvbGxIYW5kbGVyKCl9LF8ucHJvdG90eXBlLl9wdXJnZUVsZW1lbnRzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvPXRoaXMuX2VsZW1lbnRzLG49by5sZW5ndGgsaT1bXTtmb3IoZT0wO24+ZTtlKyspKHQ9b1tlXSkud2FzUHJvY2Vzc2VkJiZpLnB1c2goZSk7Zm9yKDtpLmxlbmd0aD4wOylvLnNwbGljZShpLnBvcCgpLDEpfSxfLnByb3RvdHlwZS5fc3RhcnRTY3JvbGxIYW5kbGVyPWZ1bmN0aW9uKCl7dGhpcy5faXNIYW5kbGluZ1Njcm9sbHx8KHRoaXMuX2lzSGFuZGxpbmdTY3JvbGw9ITAsdCh0aGlzLl9zZXR0aW5ncy5jb250YWluZXIsInNjcm9sbCIsdGhpcy5faGFuZGxlU2Nyb2xsRm4pKX0sXy5wcm90b3R5cGUuX3N0b3BTY3JvbGxIYW5kbGVyPWZ1bmN0aW9uKCl7dGhpcy5faXNIYW5kbGluZ1Njcm9sbCYmKHRoaXMuX2lzSGFuZGxpbmdTY3JvbGw9ITEsbyh0aGlzLl9zZXR0aW5ncy5jb250YWluZXIsInNjcm9sbCIsdGhpcy5faGFuZGxlU2Nyb2xsRm4pKX0sXy5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsPWZ1bmN0aW9uKCl7dmFyIGUsdCxvO3RoaXMuX3NldHRpbmdzJiYodD1pKCksMCE9PShvPXRoaXMuX3NldHRpbmdzLnRocm90dGxlKT8wPj0oZT1vLSh0LXRoaXMuX3ByZXZpb3VzTG9vcFRpbWUpKXx8ZT5vPyh0aGlzLl9sb29wVGltZW91dCYmKGNsZWFyVGltZW91dCh0aGlzLl9sb29wVGltZW91dCksdGhpcy5fbG9vcFRpbWVvdXQ9bnVsbCksdGhpcy5fcHJldmlvdXNMb29wVGltZT10LHRoaXMuX2xvb3BUaHJvdWdoRWxlbWVudHMoKSk6dGhpcy5fbG9vcFRpbWVvdXR8fCh0aGlzLl9sb29wVGltZW91dD1zZXRUaW1lb3V0KHUoKGZ1bmN0aW9uKCl7dGhpcy5fcHJldmlvdXNMb29wVGltZT1pKCksdGhpcy5fbG9vcFRpbWVvdXQ9bnVsbCx0aGlzLl9sb29wVGhyb3VnaEVsZW1lbnRzKCl9KSx0aGlzKSxlKSk6dGhpcy5fbG9vcFRocm91Z2hFbGVtZW50cygpKX0sXy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fZWxlbWVudHM9YSh0aGlzLl9xdWVyeU9yaWdpbk5vZGUucXVlcnlTZWxlY3RvckFsbCh0aGlzLl9zZXR0aW5ncy5lbGVtZW50c19zZWxlY3RvcikpLHRoaXMuX3B1cmdlRWxlbWVudHMoKSx0aGlzLl9sb29wVGhyb3VnaEVsZW1lbnRzKCksdGhpcy5fc3RhcnRTY3JvbGxIYW5kbGVyKCl9LF8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtvKHdpbmRvdywicmVzaXplIix0aGlzLl9oYW5kbGVTY3JvbGxGbiksdGhpcy5fbG9vcFRpbWVvdXQmJihjbGVhclRpbWVvdXQodGhpcy5fbG9vcFRpbWVvdXQpLHRoaXMuX2xvb3BUaW1lb3V0PW51bGwpLHRoaXMuX3N0b3BTY3JvbGxIYW5kbGVyKCksdGhpcy5fZWxlbWVudHM9bnVsbCx0aGlzLl9xdWVyeU9yaWdpbk5vZGU9bnVsbCx0aGlzLl9zZXR0aW5ncz1udWxsfSxffSkpLHdpbmRvdy5sYXp5PSJ5Iix0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtsYXp5bG9hZF9jb3Zlcj1uZXcgTGF6eUxvYWQoe2VsZW1lbnRzX3NlbGVjdG9yOiIudC1jb3Zlcl9fY2FycmllciIsc2hvd193aGlsZV9sb2FkaW5nOiExLGRhdGFfc3JjOiJjb250ZW50LWNvdmVyLWJnIixwbGFjZWhvbGRlcjoiIix0aHJlc2hvbGQ6NzAwfSl9KSwxMDApLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aWYobGF6eWxvYWRfaW1nPW5ldyBMYXp5TG9hZCh7ZWxlbWVudHNfc2VsZWN0b3I6Ii50LWltZyIsdGhyZXNob2xkOjgwMH0pLGxhenlsb2FkX2JnaW1nPW5ldyBMYXp5TG9hZCh7ZWxlbWVudHNfc2VsZWN0b3I6Ii50LWJnaW1nIixzaG93X3doaWxlX2xvYWRpbmc6ITEscGxhY2Vob2xkZXI6IiIsdGhyZXNob2xkOjgwMH0pLGxhenlsb2FkX2lmcmFtZT1uZXcgTGF6eUxvYWQoe2VsZW1lbnRzX3NlbGVjdG9yOiIudC1pZnJhbWUifSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2xpZGUuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbihlKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2xhenlsb2FkX2NvdmVyLnVwZGF0ZSgpLGxhenlsb2FkX2ltZy51cGRhdGUoKSxsYXp5bG9hZF9iZ2ltZy51cGRhdGUoKX0pLDUwMCl9KSksL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3Qpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuY2xhc3NMaXN0LmFkZCgidC1tYmZpeCIpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtbWJmaXgiKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuY2xhc3NMaXN0LmFkZCgidC1tYmZpeF9oaWRlIil9KSw1MCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtudWxsIT09dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9KSwxZTMpfX0pLDUwMCl9KSk7CgpmdW5jdGlvbiB0X2FuaW1hdGVfX2luaXQoKXt0X2FuaW1hdGVfX2NoZWNrQW5pbWF0aW9uQXZhaWxhYmlsaXR5KCkmJih0X2FuaW1hdGVfX2dlbmVyYXRlU3R5bGVzKCksdF9hbmltYXRlX193cmFwVGV4dFdpdGhPcGFjaXR5KCksdF9hbmltYXRlX19hZGROb0hvdmVyQ2xhc3NUb0J0bnMoKSx0X2FuaW1hdGVfX3ByZXZlbnRIb3Jpem9udGFsU2Nyb2xsKCksZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoPj0xMjAwJiZ0X2FuaW1hdGVfX3BhcnNlTnVtYmVyVGV4dCgpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9hbmltYXRlX19zdGFydEFuaW1hdGlvbigpfSksMTUwMCkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hlY2tNb2JpbGUodCl7cmV0dXJuIHQuZmlsdGVyKChmdW5jdGlvbih0KXt2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19lbGVtLCAudDM5Nl9fZ3JvdXAiKSxhLG47cmV0dXJuISghZXx8InkiIT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1tb2JpbGUiKSl8fCh0LmNsYXNzTGlzdC5jb250YWlucygiciIpP0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIiksKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCwiIil9KSk6dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LCIiKSwhMSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LGUpe2lmKHQpe3ZhciBhPSJ0LWFuaW1hdGUiO3QuY2xhc3NMaXN0LnJlbW92ZShhKSxlJiYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pLGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49YSsiXyIrZTt0LmNsYXNzTGlzdC5yZW1vdmUobil9KSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX3ByZXZlbnRIb3Jpem9udGFsU2Nyb2xsKCl7dmFyIHQsZT1BcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmxlZnQiXScpKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCwgLnQtY292ZXIiKSYmdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodD53aW5kb3cuaW5uZXJXaWR0aH0pKTshZS5sZW5ndGh8fHdpbmRvdy5pbm5lcldpZHRoPDk4MHx8ZS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZTt0LmNsb3Nlc3QoIi5yIikuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19vdmVyZmxvdy14LWhpZGRlbiIpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hlY2tBbmltYXRpb25BdmFpbGFiaWxpdHkoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1yZWNvcmRzIiksZT10P3QuZ2V0QXR0cmlidXRlKCJkYXRhLWJsb2Nrcy1hbmltYXRpb25vZmYiKTpudWxsLGE9dD90LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik6bnVsbDtpZigvQm90L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8InllcyI9PT1lfHx0X2FuaW1hdGVfX2NoZWNrSUUoKXx8ImVkaXQiPT09YSl7dmFyIG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO3JldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCwiIil9KSksITF9cmV0dXJuITB9ZnVuY3Rpb24gdF9hbmltYXRlX19nZW5lcmF0ZVN0eWxlcygpe3ZhciB0O2lmKCEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQzOTYiKSl7Zm9yKHZhciBlPXRfYW5pbWF0ZV9fZ2V0QnJlYWtwb2ludHNBcnIoKSxhPScudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWluIl0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbnVwIl0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmRvd24iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlubGVmdCJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5yaWdodCJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29taW4iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iem9vbW91dCJdIHtvcGFjaXR5OiAwOy13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgdHJhbnNmb3JtO3RyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHksIHRyYW5zZm9ybTstd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDFzO3RyYW5zaXRpb24tZHVyYXRpb246IDFzOy13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE5LCAxLCAwLjIyLCAxKTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTksIDEsIDAuMjIsIDEpOy13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjt9JyxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW4iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJmYWRlaW51cCJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9ImZhZGVpbmRvd24iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJmYWRlaW5sZWZ0Il0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLScraS5taW5SZXMrJz0iZmFkZWlucmlnaHQiXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJ6b29taW4iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJ6b29tb3V0Il0ge29wYWNpdHk6IDA7LXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5LCB0cmFuc2Zvcm07dHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgdHJhbnNmb3JtOy13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7dHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTksIDEsIDAuMjIsIDEpO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xOSwgMSwgMC4yMiwgMSk7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO319Jyl9YSs9Jy50Mzk2IC50LXRpdGxlLnQtYW5pbWF0ZSB7LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAxLjJzO3RyYW5zaXRpb24tZHVyYXRpb246IDEuMnM7fS50Mzk2IC50LWRlc2NyLnQtYW5pbWF0ZSwudDM5NiAudC11cHRpdGxlLnQtYW5pbWF0ZSwudDM5NiAudC1zdWJ0aXRsZS50LWFuaW1hdGUsLnQzOTYgLnQtdGV4dC50LWFuaW1hdGUgey13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC43czt0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjdzO30udDM5NiAudC1pdGVtLnQtYW5pbWF0ZSB7LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjVzO3RyYW5zaXRpb24tZHVyYXRpb246IDAuNXM7fS50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW4iXSB7b3BhY2l0eTogMDt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW4iXSB7b3BhY2l0eTogMDt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWluIl0ge29wYWNpdHk6IDE7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbiJdIHtvcGFjaXR5OiAxO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW51cCJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDEwMHB4KTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAxMDBweCk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW51cCJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDEwMHB4KTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAxMDBweCk7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWludXAiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbnVwIl0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7dHJhbnNmb3JtOiBub25lO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5kb3duIl0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTEwMHB4KTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMTAwcHgpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWluZG93biJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC0xMDBweCk7dHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTEwMHB4KTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5kb3duIl0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7dHJhbnNmb3JtOiBub25lO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW5kb3duIl0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7dHJhbnNmb3JtOiBub25lO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5sZWZ0Il0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTAwcHgsIDApO3RyYW5zZm9ybTogdHJhbnNsYXRlKDEwMHB4LCAwKTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbmxlZnQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMDBweCwgMCk7dHJhbnNmb3JtOiB0cmFuc2xhdGUoMTAwcHgsIDApO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmxlZnQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbmxlZnQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbnJpZ2h0Il0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTEwMHB4LCAwKTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTAwcHgsIDApO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWlucmlnaHQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTAwcHgsIDApO3RyYW5zZm9ybTogdHJhbnNsYXRlKC0xMDBweCwgMCk7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlucmlnaHQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbnJpZ2h0Il0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7dHJhbnNmb3JtOiBub25lO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29taW4iXSB7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuOSk7dHJhbnNmb3JtOiBzY2FsZSgwLjkpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iem9vbWluIl0gey13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjkpO3RyYW5zZm9ybTogc2NhbGUoMC45KTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29taW4iXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7dHJhbnNmb3JtOiBzY2FsZSgxKTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iem9vbWluIl0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO3RyYW5zZm9ybTogc2NhbGUoMSk7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9Inpvb21vdXQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMik7dHJhbnNmb3JtOiBzY2FsZSgxLjIpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iem9vbW91dCJdIHstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4yKTt0cmFuc2Zvcm06IHNjYWxlKDEuMik7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iem9vbW91dCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTt0cmFuc2Zvcm06IHNjYWxlKDEpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29tb3V0Il0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO3RyYW5zZm9ybTogc2NhbGUoMSk7fX0nKX1hKz0iLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1kaXN0YW5jZV0sLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zY2FsZV17LXdlYmtpdC10cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDt0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDt9Ijtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtZGlzdGFuY2UtcmVzLSIraS5taW5SZXMrIl0sI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29tb3V0Il0gey13ZWJraXQtdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7dHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7fX0nKX12YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLG89ZG9jdW1lbnQuaGVhZHx8ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaGVhZCIpO3IudGV4dENvbnRlbnQ9YSxvLmFwcGVuZENoaWxkKHIpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldEJyZWFrcG9pbnRzQXJyKCl7dmFyIHQ9W10sZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucltkYXRhLXJlY29yZC10eXBlPSIzOTYiXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucltkYXRhLXBhcmVudHRwbGlkPSIzOTYiXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJykpO3JldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKGUpe2lmKGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19hcnRib2FyZCIpKXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1zY3JlZW5zIiksbj0oYT0oYT1hP2Euc3BsaXQoIiwiKTpbMTIwMCw5NjAsNjQwLDQ4MCwzMjBdKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBwYXJzZUludCh0LDEwKX0pKSkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4tMT09PXQuaW5kZXhPZihlKX0pKTt0PXQuY29uY2F0KG4pfX0pKSx0PXRfYW5pbWF0ZV9fc29ydEFycih0KX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkodCxlKXt2YXIgYT0iIixuPSExLGk9dFtlKzFdLHI9dFtlXS0xLG89ZT09PXQubGVuZ3RoLTEscz1lPT09dC5sZW5ndGgtMjtyZXR1cm4gbz9uPSEwOmErPXM/IkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICIrcisicHgpIHsiOiJAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAiK2krInB4KSBhbmQgKG1heC13aWR0aDogIityKyJweCkgeyIse3RleHQ6YSxpc0NvbnRpbnVlOm4sbWluUmVzOml9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc29ydEFycih0KXtyZXR1cm4gdC5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBlLXR9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19zdGFydEFuaW1hdGlvbigpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yIiksZT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodCwoZnVuY3Rpb24odCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtZ3JvdXA9eWVzXSIpfSkpLGE9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHQsKGZ1bmN0aW9uKHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3IoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLWNoYWluPSJ5ZXMiXScpfSkpLG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO2lmKG49QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKGZ1bmN0aW9uKHQpe3JldHVybiEoInllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWdyb3VwIil8fCJ5ZXMiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1jaGFpbiIpfHx0LmdldEF0dHJpYnV0ZSgib2JzZXJ2ZXItcmVhZHkiKSl9KSksd2luZG93LmlubmVyV2lkdGg8MTIwMCYmKGU9dF9hbmltYXRlX19jaGVja01vYmlsZShlKSxhPXRfYW5pbWF0ZV9fY2hlY2tNb2JpbGUoYSksbj10X2FuaW1hdGVfX2NoZWNrTW9iaWxlKG4pKSxlLmxlbmd0aHx8bi5sZW5ndGh8fGEubGVuZ3RoKXt0X2FuaW1hdGVfX3NldEFuaW1hdGlvblN0YXRlKGUsYSxuKSxlPXRfYW5pbWF0ZV9faGFzV2FpdEFuaW1hdGlvbihlKSxuPXRfYW5pbWF0ZV9faGFzV2FpdEFuaW1hdGlvbihuKSxhPXRfYW5pbWF0ZV9faGFzV2FpdEFuaW1hdGlvbihhKTt2YXIgaT0idW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmL14oKD8hY2hyb21lfGFuZHJvaWQpLikqKHNhZmFyaXxtb2JpbGUpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmLyhvcyB8dmVyc2lvblwvKTE1KC58XylbNC05XS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7aWYoIkludGVyc2VjdGlvbk9ic2VydmVyImluIHdpbmRvdyYmIWkpe2lmKGUubGVuZ3RoKXt2YXIgcj1bXTtlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZSIpLGEsbjtpZigiZmFkZWluZG93biI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0eWxlIikmJmUuY2xvc2VzdCgiLnQtY292ZXIiKSl7dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlOm5vdCg6Zmlyc3QtY2hpbGQpIik7aSYmKGU9aSl9ci5wdXNoKGUpfSkpLHIuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9e3Jvb3RNYXJnaW46dC5vZmZzZXRIZWlnaHQvNSotMSsicHggMHB4In0sYTtuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKHQsZSl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0LmlzSW50ZXJzZWN0aW5nKXt2YXIgYT10LnRhcmdldDtlLnVub2JzZXJ2ZShhKTt2YXIgbj1hLmNsb3Nlc3QoIi5yIikucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO249QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKGZ1bmN0aW9uKHQpe3JldHVybiEodC5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZV9fYnRuLXdhaXQtY2hhaW4iKXx8InllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWNoYWluIikpfSkpLHRfYW5pbWF0ZV9fbWFrZVNlY3Rpb25CdXR0b25XYWl0KGEpLHRfYW5pbWF0ZV9fc2F2ZVNlY3Rpb25IZWFkZXJTdGFydFRpbWUoYSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV93YWl0IiksdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMSl9KSl9fSkpfSksZSkub2JzZXJ2ZSh0KX0pKX12YXIgbztpZihuLmxlbmd0aCYmbi5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT17fSxhPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJ0cmlnZ2VyLW9mZnNldCIpO2EmJihlLnJvb3RNYXJnaW49IjBweCAwcHggIistMSphLnJlcGxhY2UoInB4IiwiIikrInB4IDBweCIpO3ZhciBuPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24odCxlKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBhPXQudGFyZ2V0O2lmKCFhLmRlbWFuZFRyYW5zZm9ybSYmYS5zdHlsZS50cmFuc2Zvcm0pYS5kZW1hbmRUcmFuc2Zvcm09YS5zdHlsZS50cmFuc2Zvcm0sYS5zdHlsZS50cmFuc2Zvcm09InVuc2V0IjtlbHNle3ZhciBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnRyYW5zZm9ybTthLnN0eWxlLnRyYW5zZm9ybXx8Im5vbmUiPT09bnx8KGEuZGVtYW5kVHJhbnNmb3JtPW4sYS5zdHlsZS50cmFuc2Zvcm09InVuc2V0Iil9aWYodC5pc0ludGVyc2VjdGluZyl7YS5jbG9zZXN0KCIudDEwOTMiKXx8ZS51bm9ic2VydmUoYSk7dmFyIGk9YS5zdHlsZS50cmFuc2l0aW9uRGVsYXl8fCIwbXMiO2k9LTEhPT1pLmluZGV4T2YoIm1zIik/cGFyc2VJbnQoaSkrMjUwOjFlMypwYXJzZUZsb2F0KGkpKzI1MDt2YXIgcj1mdW5jdGlvbiB0KCl7YS5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfd2FpdCIpLHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnMoYSksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKGEsITApLCJhbmltYXRlZG51bWJlciI9PT10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UoYSwic3R5bGUiKSYmdF9hbmltYXRlX19hbmltYXRlTnVtYmVycyhhKX07YS5kZW1hbmRUcmFuc2Zvcm0mJi0xIT09YS5kZW1hbmRUcmFuc2Zvcm0uaW5kZXhPZigibWF0cml4IikmJihhLnN0eWxlLnRyYW5zZm9ybT0iIiksYS5kZW1hbmRUcmFuc2Zvcm0mJiJ1bnNldCI9PT1hLnN0eWxlLnRyYW5zZm9ybSYmKGEuc3R5bGUudHJhbnNmb3JtPWEuZGVtYW5kVHJhbnNmb3JtLGRlbGV0ZSBhLmRlbWFuZFRyYW5zZm9ybSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyKCl9KSxpKX19KSl9KSxlKTt0LmRhdGFzZXQub2JzZXJ2ZXJSZWFkeT0hMCxuLm9ic2VydmUodCl9KSksYS5sZW5ndGgpKG89ZnVuY3Rpb24gdCgpe3RfYW5pbWF0ZV9fZ2V0Q2hhaW5PZmZzZXRzKGEpfSkoKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3Rocm90dGxlKChmdW5jdGlvbigpe28oKX0pKSksc2V0SW50ZXJ2YWwobyw1ZTMpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dmFyIHQsZT13aW5kb3cucGFnZVlPZmZzZXQrd2luZG93LmlubmVySGVpZ2h0O3RfYW5pbWF0ZV9fYW5pbWF0ZUNoYWluc0Jsb2NrcyhhLGUpfSkpKX1lbHNle3ZhciBvOyhvPWZ1bmN0aW9uIHQoKXt0X2FuaW1hdGVfX2dldEdyb3Vwc09mZnNldHMoZSksdF9hbmltYXRlX19nZXRDaGFpbk9mZnNldHMoYSksdF9hbmltYXRlX19nZXRFbGVtc09mZnNldHMobil9KSgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUobykpLHNldEludGVydmFsKG8sNWUzKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3ZhciB0PXRfYW5pbWF0ZV9fZGVsZXRlQW5pbWF0ZWRFbHMoZSxuKTtuPXRbMF07dmFyIGk9dF9hbmltYXRlX19hbmltYXRlT25TY3JvbGwoZT10WzFdLGEsbik7aSYmaS5sZW5ndGgmJihlPWlbMF0sYT1pWzFdLG49aVsyXSl9KSkpfUFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cCIpO2UmJmUuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3ZhciB0PXdpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQ7aWYoZS5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZSIpJiYieWVzIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtY2hhaW4iKXx8ZS5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIikpe3ZhciBhPVtlXTt0X2FuaW1hdGVfX3NldEFuaW1hdGlvblN0YXRlQ2hhaW5zKGEpLHRfYW5pbWF0ZV9fZ2V0Q2hhaW5PZmZzZXRzKGE9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGEsKGZ1bmN0aW9uKHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGVfd2FpdCIpfSkpKSx0X2FuaW1hdGVfX2FuaW1hdGVDaGFpbnNCbG9ja3MoYSx0KX19KSkpfSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FuaW1hdGVPblNjcm9sbCh0LGUsYSl7aWYodC5sZW5ndGh8fGUubGVuZ3RofHxhLmxlbmd0aCl7dmFyIG49d2luZG93LnBhZ2VZT2Zmc2V0LGk9bit3aW5kb3cuaW5uZXJIZWlnaHQscixvLHM7cmV0dXJuW3RfYW5pbWF0ZV9fYW5pbWF0ZUdyb3Vwcyh0LGksbiksdF9hbmltYXRlX19hbmltYXRlQ2hhaW5zQmxvY2tzKGUsaSxuKSx0X2FuaW1hdGVfX2FuaW1hdGVFbGVtcyhhLGksbildfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FuaW1hdGVHcm91cHModCxlKXtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0LmN1clRvcE9mZnNldDxlKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGUiKTthPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLChmdW5jdGlvbih0KXtyZXR1cm4hKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfX2J0bi13YWl0LWNoYWluIil8fCJ5ZXMiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1jaGFpbiIpKX0pKSx0X2FuaW1hdGVfX21ha2VTZWN0aW9uQnV0dG9uV2FpdCh0KSx0X2FuaW1hdGVfX3NhdmVTZWN0aW9uSGVhZGVyU3RhcnRUaW1lKHQpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSwoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfd2FpdCIpLHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKHQsITEpfSkpfX0pKSx0fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZUNoYWluc0Jsb2Nrcyh0LGUpe3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuaXRlbXNPZmZzZXRzWzBdPGUmJnQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV93YWl0IikubGVuZ3RoJiYodF9hbmltYXRlX19hbmltYXRlQ2hhaW5JdGVtc09uU2Nyb2xsKHQsZSksdC5pdGVtc09mZnNldHMubGVuZ3RoJiZ0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbl9fb3V0T2ZUdXJuKHQpKX0pKSx0fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZUVsZW1zKHQsZSxhKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBuPXRfYW5pbWF0ZV9fZGV0ZWN0RWxlbVRyaWdnZXJPZmZzZXQodCxlKTtyZXR1cm4gdC5jdXJUb3BPZmZzZXQ8bj8odC5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfd2FpdCIpLHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKHQsITEpLCJhbmltYXRlZG51bWJlciI9PT10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwic3R5bGUiKSYmdF9hbmltYXRlX19hbmltYXRlTnVtYmVycyh0KSwhMCk6ISh0LmN1clRvcE9mZnNldDxhKSYmdm9pZCAwfSkpLHR9ZnVuY3Rpb24gdF9hbmltYXRlX19kZWxldGVBbmltYXRlZEVscyh0LGUpe3ZhciBhPXdpbmRvdy5wYWdlWU9mZnNldCxuPVtdLGk9W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYodC5jdXJUb3BPZmZzZXQ8PWEpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24odCl7dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LFsid2FpdCIsIm5vLWhvdmVyIl0pfSkpfWVsc2Ugbi5wdXNoKHQpfSkpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jdXJUb3BPZmZzZXQ8PWE/KHRfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCxbIndhaXQiLCJuby1ob3ZlciJdKSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMSkpOmkucHVzaCh0KX0pKSxbaSxuXX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FuaW1hdGVDaGFpbkl0ZW1zT25TY3JvbGwodCxlKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfd2FpdFtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpO2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSk7dmFyIG49MCxpPTAscj10Lml0ZW1zT2Zmc2V0c1swXSxvPS4xNixzPXRfYW5pbWF0ZV9fZ2V0RGVsYXlGcm9tUHJldmlvdXNTY3JvbGxFdmVudCh0LG8pLGw9dF9hbmltYXRlX19nZXRTZWN0aW9uSGVhZERlYWx5KHQpO2EubGVuZ3RoJiZhWzBdLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93Iik7Zm9yKHZhciBtPTA7bTxhLmxlbmd0aDttKyspe3ZhciBjPWFbbV0sXz10Lml0ZW1zT2Zmc2V0c1ttXTtpZighKF88ZSkpYnJlYWs7XyE9PXImJihjLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93Iiksbj0rK2kscj1fKTt2YXIgZj1uKm8rcytsO2Muc3R5bGUudHJhbnNpdGlvbkRlbGF5PWYrInMiLGMuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX3dhaXQiKSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3MoYywhMSksYy5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIixEYXRlLm5vdygpKzFlMypmKSxjWzBdPT09YVthLmxlbmd0aC0xXSYmdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb24odCxmKSwrXz09K3ImJm4rKyxhLnNwbGljZShtLDEpLHQuaXRlbXNPZmZzZXRzLnNwbGljZShtLDEpLG0tLX10X2FuaW1hdGVfX2NhdGNoVHJhbnNpdGlvbkVuZEV2ZW50KHQpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0U2VjdGlvbkhlYWREZWFseSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNlY3Rpb25fX3RpdGxlLnQtYW5pbWF0ZSIpLGE9dC5xdWVyeVNlbGVjdG9yKCIudC1zZWN0aW9uX19kZXNjci50LWFuaW1hdGUiKSxuPTA7aWYoZSl7dmFyIGk9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIil8fDA7aWYoRGF0ZS5ub3coKS1pPD0xNjApcmV0dXJuIG49LjE2fWlmKGEpe3ZhciByPWEuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3RhcnQtdGltZSIpfHwwO2lmKERhdGUubm93KCktcjw9MTYwKXJldHVybiBuPS4xNn1yZXR1cm4gbn1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldERlbGF5RnJvbVByZXZpb3VzU2Nyb2xsRXZlbnQodCxlKXt2YXIgYT0hdC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlX3N0YXJ0ZWQiKS5sZW5ndGgsbj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfX2NoYWluX2ZpcnN0LWluLXJvdy50LWFuaW1hdGVfc3RhcnRlZCIpO2lmKG49QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX19jaGFpbl9zaG93ZWQiKX0pKSxhfHwhbi5sZW5ndGgpcmV0dXJuIDA7aWYobi5sZW5ndGgpe3ZhciBpLHIsbz0obltuLmxlbmd0aC0xXS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIil8fDApLURhdGUubm93KCk7cmV0dXJuIG88PTA/ZTpvLzFlMytlfX1mdW5jdGlvbiB0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCxlKXtpZih0KXtpZihlKXt2YXIgYT0idC1hbmltYXRlLWZvci13cmFwcGVyIixuPXQuY2xvc2VzdCgiLiIrYSk7biYmbi5jbGFzc0xpc3QucmVtb3ZlKGEpfXZhciBpO2lmKHQuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX3N0YXJ0ZWQiKSwiZmFkZWlubGVmdCI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0eWxlIikpe3ZhciByPXQuY2xvc2VzdCgiLnQtYW5pbWF0ZV9fb3ZlcmZsb3cteC1oaWRkZW4iKTtyJiYhci5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5sZWZ0Il06bm90KC50LWFuaW1hdGVfc3RhcnRlZCknKSYmci5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfX292ZXJmbG93LXgtaGlkZGVuIil9fX1mdW5jdGlvbiB0X2FuaW1hdGVfX2NhdGNoVHJhbnNpdGlvbkVuZEV2ZW50KHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93LnQtYW5pbWF0ZV9zdGFydGVkIik7ZT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoZSwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfX2NoYWluX3Nob3dlZCIpfSkpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24odCl7dmFyIGU7WyJ0cmFuc2l0aW9uZW5kIiwid2Via2l0VHJhbnNpdGlvbkVuZCIsIm9UcmFuc2l0aW9uRW5kIiwib3RyYW5zaXRpb25lbmQiLCJNU1RyYW5zaXRpb25FbmQiXS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmFkZEV2ZW50TGlzdGVuZXIoZSwoZnVuY3Rpb24oKXt0X2FuaW1hdGVfX2FkZEV2ZW50T25BbmltYXRlQ2hhaW4odCl9KSksdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsKGZ1bmN0aW9uKCl7dF9hbmltYXRlX19hZGRFdmVudE9uQW5pbWF0ZUNoYWluKHQpfSkpfSkpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fcGFyc2VOdW1iZXJUZXh0KCl7dmFyIHQ9d2luZG93LnBhZ2VZT2Zmc2V0LGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9J2FuaW1hdGVkbnVtYmVyJ10iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKGUpe3ZhciBhLG49IiIsaT1lLnF1ZXJ5U2VsZWN0b3JBbGwoInNwYW4iKTtpZihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe24rPXQuZ2V0QXR0cmlidXRlKCJzdHlsZSIpfHwiIix0LnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKSx0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1yZWRhY3Rvci1zdHlsZSIpfSkpLGUucXVlcnlTZWxlY3RvckFsbCgnZGl2W2RhdGEtY3VzdG9tc3R5bGU9InllcyJdJykubGVuZ3RoKXt2YXIgcj1lLnF1ZXJ5U2VsZWN0b3IoJ2RpdltkYXRhLWN1c3RvbXN0eWxlPSJ5ZXMiXScpO2E9cj9yLmlubmVySFRNTDoiIjt2YXIgbz1lLmdldEF0dHJpYnV0ZSgic3R5bGUiKXx8IiIscz1lLnF1ZXJ5U2VsZWN0b3IoImRpdltkYXRhLWN1c3RvbXN0eWxlXSIpLGw9cz9zLmdldEF0dHJpYnV0ZSgic3R5bGUiKToiIjtsJiYobys9bCksZS5zZXRBdHRyaWJ1dGUoInN0eWxlIixvKX1lbHNlIGE9ZS5pbm5lckhUTUw7aWYobj1uLnNwbGl0KCI7IikuZmlsdGVyKChmdW5jdGlvbih0LGUpe3JldHVybiBuLnNwbGl0KCI7IikuaW5kZXhPZih0KT09PWV9KSkuam9pbigiOyIpLCEoZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0PHQtNTAwKSYmYS5sZW5ndGgpe3ZhciBtPWEucmVwbGFjZSgvPGJyPi9nLCIgIikucmVwbGFjZSgvW15cZC4sIF0rL2csIiIpLnJlcGxhY2UoLyAoXC58LCkvZywiIikucmVwbGFjZSgvKFxkKSg/PVxkKSAvZywiJDEiKS50cmltKCksYz1tO2lmKC0xPT09YS5pbmRleE9mKG0pJiYoYz1tPW0uc3BsaXQoIiAiKVswXSksIiIhPT1tKXtlLnNldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW51bWJlci1jb3VudCIsYSksdF9hbmltYXRlX19jaGFuZ2VOdW1iZXJPblplcm8oZSxhLnJlcGxhY2UoYywibnVtIikpO3ZhciBfPWUucXVlcnlTZWxlY3RvckFsbCgic3BhbiIpO189QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKF8sKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygiLnQtYW5pbWF0ZV9fbnVtYmVyIil9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChfLChmdW5jdGlvbih0KXt0LnNldEF0dHJpYnV0ZSgic3R5bGUiLG4pfSkpfX19KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGFuZ2VOdW1iZXJPblplcm8odCxlKXt0LmlubmVySFRNTD1lLnJlcGxhY2UoL251bS9nLCc8c3BhbiBjbGFzcz0idC1hbmltYXRlX19udW1iZXIiPjA8L3NwYW4+Jyl9ZnVuY3Rpb24gdF9hbmltYXRlX19hbmltYXRlTnVtYmVycyh0KXtpZighdClyZXR1cm4hMTt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW51bWJlci1jb3VudCIpLGE9W10sbj10LnF1ZXJ5U2VsZWN0b3JBbGwoInNwYW4iKTsobj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCIudC1hbmltYXRlX19udW1iZXIiKX0pKSkubGVuZ3RoJiYoYT1uWzBdLmdldEF0dHJpYnV0ZSgic3R5bGUiKXx8IiIpO3ZhciBpPVtdLHI9bnVsbDtpZihlKXtyPWUubWF0Y2goL1xkK1wuXGQrfFxkKyxcZCsvZyk7dmFyIG89ZS5tYXRjaCgvXGQrL2cpLHMsbDtlLnJlcGxhY2UoLyhcZCkoPz0gXGQpIC9nLCIkMSIpLnNwbGl0KCIgIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7aXNOYU4ocGFyc2VJbnQodC5yZXBsYWNlKC9bXlxkLiwgXSsvZywiIiksMTApKXx8aS5wdXNoKHQucmVwbGFjZSgvW15cZC4sIF0rL2csIiIpKX0pKX12YXIgbT0wLGM9ITEsXz0hMTt0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW51bWJlci1jb3VudCIpLG51bGwhPT1yJiYoXz0tMSE9PXJbMF0uaW5kZXhPZigiLCIpKSxpLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7dmFyIGE7bnVsbCE9PXImJigtMSE9PXQuaW5kZXhPZigiLCIpJiYoYT10LnNwbGl0KCIsIikpLC0xIT09dC5pbmRleE9mKCIuIikmJihhPXQuc3BsaXQoIi4iKSksLTE9PT10LmluZGV4T2YoIiwiKSYmLTE9PT10LmluZGV4T2YoIi4iKXx8KG09YVsxXS5sZW5ndGgsaVtlXT0rYS5qb2luKCIuIiksYz0hMCkpfSkpO3ZhciBmPXQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZV9fbnVtYmVyIik7aWYoaVswXSl7dmFyIGQ9TnVtYmVyKGlbMF0pfHwwLHU9MCx5PU1hdGgucG93KDEwLG0pO2MmJihkKj15LHUqPXkpO3ZhciBwPTEyLGg9MCxnPXNldEludGVydmFsKChmdW5jdGlvbigpe2lmKHUrPWQvMTA4LGg9Yz8oTWF0aC5yb3VuZCh1KS95KS50b0ZpeGVkKG0pKyIiOk1hdGguZmxvb3IodSkrIiIsby5sZW5ndGg+MSYmKGg9aC5yZXBsYWNlKC8oXGQpKD89KFxkezN9KSsoW15cZF18JCkpL2csIiQxICIpKSxfJiYoaD1oLnJlcGxhY2UoL1wuL2csIiwiKSksZiYmKGYudGV4dENvbnRlbnQ9aCksdT49ZCl7Y2xlYXJJbnRlcnZhbChnKSx0LmlubmVySFRNTD1lO3ZhciBuPXQucXVlcnlTZWxlY3RvckFsbCgic3BhbiIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKX0pKX19KSxwKX19ZnVuY3Rpb24gdF9hbmltYXRlX19zZXRBbmltYXRpb25TdGF0ZSh0LGUsYSl7dmFyIG49d2luZG93LnBhZ2VZT2Zmc2V0LGk9bit3aW5kb3cuaW5uZXJIZWlnaHQ7dF9hbmltYXRlX19zZXRHcm91cHNCbG9ja3NTdGF0ZSh0LG4saSksZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0X2FuaW1hdGVfX2Fzc2lnbkNoYWluRGVsYXkodCxpLG4pLHRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uX19vdXRPZlR1cm4odCl9KSksdF9hbmltYXRlX19zZXRBbmltRUxlbXNTdGF0ZShhLG4saSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSh0X2FuaW1hdGVfX3JlbW92ZUlubGluZUFuaW1TdHlsZXMpKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3NldEFuaW1FTGVtc1N0YXRlKHQsZSxhKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDtpZihuPGUtNTAwKXJldHVybiB0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsIm5vLWhvdmVyIiksImFuaW1hdGVkbnVtYmVyIj09PXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJzdHlsZSIpJiZ0X2FuaW1hdGVfX2FuaW1hdGVOdW1iZXJzKHQpLCEwO3ZhciBpPXRfYW5pbWF0ZV9fZGV0ZWN0RWxlbVRyaWdnZXJPZmZzZXQodCxhKTt0X2FuaW1hdGVfX3NldEN1c3RvbUFuaW1TZXR0aW5ncyh0LG4sYSksbjxpJiYhdC5jbG9zZXN0KCIudDEwOTMiKSYmKHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKHQsITApLCJhbmltYXRlZG51bWJlciI9PT10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwic3R5bGUiKSYmdF9hbmltYXRlX19hbmltYXRlTnVtYmVycyh0KSksKG4+PWl8fHQuY2xvc2VzdCgiLnQxMDkzIikpJiZ0LmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV93YWl0Iil9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19zZXRHcm91cHNCbG9ja3NTdGF0ZSh0LGUsYSl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGUiKTtuPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChuLChmdW5jdGlvbih0KXtyZXR1cm4hKCJ5ZXMiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1jaGFpbiIpKX0pKTt2YXIgaT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ7dF9hbmltYXRlX19yZW1vdmVBbmltRnJvbUhpZGRlblNsaWRlcyh0KTt2YXIgcj10X2FuaW1hdGVfX2Fzc2lnblNlY3Rpb25EZWxheSh0KTt0X2FuaW1hdGVfX2Fzc2lnbkdyb3VwRGVsYXkodCxyKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKG4pe3ZhciByPW4uY2xvc2VzdCgiLnQzOTdfX29mZiIpfHxuLmNsb3Nlc3QoIi50Mzk1X19vZmYiKXx8bi5jbG9zZXN0KCIudDQwMF9fb2ZmIik7aWYobi5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZV9uby1ob3ZlciIpJiZyJiZuLmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV9uby1ob3ZlciIpLGk8PWUtMTAwKXJldHVybiB0X2FuaW1hdGVfX3NhdmVTZWN0aW9uSGVhZGVyU3RhcnRUaW1lKHQpLHRfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3Mobiwibm8taG92ZXIiKSxuLnN0eWxlLnRyYW5zaXRpb25EZWxheT0iIiwhMDtpPGEmJmk+ZS0xMDAmJih0X2FuaW1hdGVfX21ha2VTZWN0aW9uQnV0dG9uV2FpdCh0KSxuLmNsYXNzTGlzdC5jb250YWlucygiLnQtYW5pbWF0ZV9fYnRuLXdhaXQtY2hhaW4iKXx8KHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnMobikscj9uLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV93YWl0Iik6dF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKG4sITEpKSksaT49YSYmbi5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfd2FpdCIpfSkpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2V0QW5pbWF0aW9uU3RhdGVDaGFpbnModCl7aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm4hMTt2YXIgZT13aW5kb3cucGFnZVlPZmZzZXQsYT1lK3dpbmRvdy5pbm5lckhlaWdodDtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fYXNzaWduQ2hhaW5EZWxheSh0LGEsZSksdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb25fX291dE9mVHVybih0KX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2Fzc2lnblNlY3Rpb25EZWxheSh0KXt2YXIgZT0wLGE9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX190aXRsZS50LWFuaW1hdGUiKSxuPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fZGVzY3IudC1hbmltYXRlIik7cmV0dXJuIGEubGVuZ3RoJiYoZT0uMTYpLG4ubGVuZ3RoJiYoQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1lKyJzIn0pKSxlKz0uMTYpLGV9ZnVuY3Rpb24gdF9hbmltYXRlX19hc3NpZ25Hcm91cERlbGF5KHQsZSl7dmFyIGE9MDtpZih0LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWFuaW1hdGUtb3JkZXJdIikubGVuZ3RoKXRfYW5pbWF0ZV9fYXNzaWduT3JkZXJlZEVsZW1zRGVsYXkodCxlKTtlbHNle3ZhciBuPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtaW1nLnQtYW5pbWF0ZSIpLGk9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC11cHRpdGxlLnQtYW5pbWF0ZSIpLHI9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC10aXRsZS50LWFuaW1hdGUiKTtyPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChyLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2VjdGlvbl9fdGl0bGUiKX0pKTt2YXIgbz10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWRlc2NyLnQtYW5pbWF0ZSIpO289QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG8sKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygidC1zZWN0aW9uX19kZXNjciIpfSkpO3ZhciBzPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYnRuLnQtYW5pbWF0ZSwgLnQtYnRud3JhcHBlci50LWFuaW1hdGUiKTtzPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChzLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbG9zZXN0KCIudC1zZWN0aW9uX19ib3R0b213cmFwcGVyIil9KSk7dmFyIGw9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC10aW1lci50LWFuaW1hdGUiKSxtPXQucXVlcnlTZWxlY3RvckFsbCgiZm9ybS50LWFuaW1hdGUiKTtuLmxlbmd0aCYmKGE9LjUpLHIubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpLHIubGVuZ3RoJiYoYSs9LjMpLG8ubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpLG8ubGVuZ3RoJiYoYSs9LjMpLGkubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpLGkubGVuZ3RoJiYoYSs9LjMpLChpLmxlbmd0aHx8ci5sZW5ndGh8fG8ubGVuZ3RoKSYmKGErPS4yKSxsLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSxsLmxlbmd0aCYmKGErPS41KSxzLmxlbmd0aCYmKHNbMF0uc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMiKSwyPT09cy5sZW5ndGgmJihhKz0uNCksMj09PXMubGVuZ3RoJiYoc1sxXS5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyIpLDAhPT1tLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKX19ZnVuY3Rpb24gdF9hbmltYXRlX19hc3NpZ25PcmRlcmVkRWxlbXNEZWxheSh0LGUpe3ZhciBhPTA7ZSYmKGE9ZSk7dmFyIG49dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iMSJdJyksaT10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSIyIl0nKSxyPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjMiXScpLG89dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iNCJdJykscz10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSI1Il0nKSxsPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjYiXScpLG09dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iNyJdJyksYz10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSI4Il0nKSxfPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjkiXScpO24ubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpLG4ubGVuZ3RoJiZpLmxlbmd0aCYmKGErPTEqdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKGlbMF0sImRlbGF5IiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSksKG4ubGVuZ3RofHxpLmxlbmd0aCkmJnIubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UoclswXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aCkmJm8ubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2Uob1swXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGgpJiZzLmxlbmd0aCYmKGErPTEqdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHNbMF0sImRlbGF5IiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSksKG4ubGVuZ3RofHxpLmxlbmd0aHx8ci5sZW5ndGh8fG8ubGVuZ3RofHxzLmxlbmd0aCkmJmwubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UobFswXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGwsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGh8fHMubGVuZ3RofHxsLmxlbmd0aCkmJm0ubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UobVswXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG0sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGh8fHMubGVuZ3RofHxsLmxlbmd0aHx8bS5sZW5ndGgpJiZjLmxlbmd0aCYmKGErPTEqdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKGNbMF0sImRlbGF5IiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSksKG4ubGVuZ3RofHxpLmxlbmd0aHx8ci5sZW5ndGh8fG8ubGVuZ3RofHxzLmxlbmd0aHx8bC5sZW5ndGh8fG0ubGVuZ3RofHxjLmxlbmd0aCkmJl8ubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UoX1swXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKF8sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2Fzc2lnbkNoYWluRGVsYXkodCxlLGEpe3ZhciBuPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpLGk9MDtpZihuLmxlbmd0aCl7dmFyIHI9blswXSxvPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDtyLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93Iik7dmFyIHM9dF9hbmltYXRlX19nZXRDdXJCbG9ja1NlY3Rpb25IZWFkRGVsYXkodCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbihsKXt2YXIgbT1sLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ7aWYobTxhKXJldHVybiB0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKGwsIiIpLCEwO2lmKG08ZSl7bSE9PW8mJihsLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93Iiksbz1tKTt2YXIgYz0uMTYqaStzLF87bC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YysicyIsdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKGwsITEpLGwuc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3RhcnQtdGltZSIsRGF0ZS5ub3coKSsxZTMqYykscj09PW5bbi5sZW5ndGgtMV0mJnRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uKHQsYyksaSsrLFsidHJhbnNpdGlvbmVuZCIsIndlYmtpdFRyYW5zaXRpb25FbmQiLCJvVHJhbnNpdGlvbkVuZCIsIm90cmFuc2l0aW9uZW5kIiwiTVNUcmFuc2l0aW9uRW5kIl0uZm9yRWFjaCgoZnVuY3Rpb24odCl7bC5hZGRFdmVudExpc3RlbmVyKHQsKGZ1bmN0aW9uKCl7dF9hbmltYXRlX19hZGRFdmVudE9uQW5pbWF0ZUNoYWluKGwpfSkpLGwucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LChmdW5jdGlvbigpe3RfYW5pbWF0ZV9fYWRkRXZlbnRPbkFuaW1hdGVDaGFpbihsKX0pKX0pKX1lbHNlIGwuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX3dhaXQiKX0pKX19ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsZSl7dmFyIGEsbj10LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpO2lmKCFuKXJldHVybiB0LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLSIrZSk7dmFyIGkscj0iYWIiK24uZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksbyxzLGw7dm9pZCAwIT09d2luZG93LnRuW3JdPyhvPXdpbmRvdy50bltyXS5jdXJSZXNvbHV0aW9uLHM9d2luZG93LnRuW3JdLmN1clJlc29sdXRpb25fbWF4LGw9d2luZG93LnRuW3JdLnNjcmVlbnMuc2xpY2UoKSk6KG89d2luZG93LnRuLmN1clJlc29sdXRpb24scz0xMjAwLGw9WzMyMCw0ODAsNjQwLDk2MCwxMjAwXSk7dmFyIG09dC5jbG9zZXN0KCIudDM5Nl9fZWxlbSwgLnQzOTZfX2dyb3VwIiksYz1tJiZtLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW1vYmlsZSIpO2lmKG89PT1zKWE9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS0iK2UpO2Vsc2V7aWYoInkiIT09YyYmbzwxMjAwKXJldHVybiB0LnN0eWxlLnRyYW5zaXRpb249Im5vbmUiLG51bGw7YT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLSIrZSsiLXJlcy0iK28pfWlmKCFhJiYiIiE9PWEpZm9yKHZhciBfPTA7XzxsLmxlbmd0aDtfKyspe3ZhciBmPWxbX107aWYoIShmPD1vKSYmKGE9Zj09PXM/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS0iK2UpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtIitlKyItcmVzLSIrZikpKWJyZWFrfXJldHVybiBhfWZ1bmN0aW9uIHRfYW5pbWF0ZV9faGFzV2FpdEFuaW1hdGlvbih0KXtyZXR1cm4gdC5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX3dhaXQiKXx8dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlX3dhaXQiKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FkZEV2ZW50T25BbmltYXRlQ2hhaW4odCl7dC5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfX2NoYWluX3Nob3dlZCIpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2V0Q3VzdG9tQW5pbVNldHRpbmdzKHQsZSxhKXt2YXIgbj10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwic3R5bGUiKSxpPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJkaXN0YW5jZSIpO2lmKGkmJiIiIT09aSl7c3dpdGNoKGk9aS5yZXBsYWNlKCJweCIsIiIpLHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIwcyIsdC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9IjBzIixuKXtjYXNlImZhZGVpbnVwIjp0LnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlM2QoMCwiK2krInB4LDApIjticmVhaztjYXNlImZhZGVpbmRvd24iOnQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgwLC0iK2krInB4LDApIjticmVhaztjYXNlImZhZGVpbmxlZnQiOnQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgiK2krInB4LDAsMCkiO2JyZWFrO2Nhc2UiZmFkZWlucmlnaHQiOnQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgtIitpKyJweCwwLDApIn10X2FuaW1hdGVfX2ZvcmNlRWxlbUluVmlld1BvcnRSZXBhaW50KHQsZSxhKSx0LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iIix0LnN0eWxlLnRyYW5zaXRpb25EZWxheT0iIn12YXIgcj10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwic2NhbGUiKTtyJiYodC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IjBzIix0LnN0eWxlLnRyYW5zaXRpb25EZWxheT0iMHMiLHQuc3R5bGUudHJhbnNmb3JtPSJzY2FsZSgiK3IrIikiLHRfYW5pbWF0ZV9fZm9yY2VFbGVtSW5WaWV3UG9ydFJlcGFpbnQodCxlLGEpLHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIiLHQuc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIiKTt2YXIgbz10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwiZGVsYXkiKTtvJiYodC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9bysicyIpO3ZhciBzPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJkdXJhdGlvbiIpO3MmJih0LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj1zKyJzIil9ZnVuY3Rpb24gdF9hbmltYXRlX19yZW1vdmVJbmxpbmVBbmltU3R5bGVzKCl7aWYod2luZG93LmlubmVyV2lkdGg8OTgwKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudDM5Nl9fZWxlbS50LWFuaW1hdGU6bm90KC50LWFuaW1hdGVfd2FpdCkiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNmb3JtPSIiLHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIiLHQuc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIifSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2ZvcmNlRWxlbUluVmlld1BvcnRSZXBhaW50KHQsZSxhKXt0JiZlPGErNTAwJiZ0Lm9mZnNldEhlaWdodH1mdW5jdGlvbiB0X2FuaW1hdGVfX2RldGVjdEVsZW1UcmlnZ2VyT2Zmc2V0KHQsZSl7dmFyIGE9dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsInRyaWdnZXItb2Zmc2V0Iiksbj1lO3JldHVybiBhJiYobj1lLTEqKGE9YS5yZXBsYWNlKCJweCIsIiIpKSksbn1mdW5jdGlvbiB0X2FuaW1hdGVfX3NhdmVTZWN0aW9uSGVhZGVyU3RhcnRUaW1lKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fdGl0bGUudC1hbmltYXRlIiksYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNlY3Rpb25fX2Rlc2NyLnQtYW5pbWF0ZSIpO2UubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3RhcnQtdGltZSIsRGF0ZS5ub3coKSl9KSksYS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSwoZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIixEYXRlLm5vdygpKzE2MCl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRDdXJCbG9ja1NlY3Rpb25IZWFkRGVsYXkodCl7dmFyIGU9MDtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX190aXRsZS50LWFuaW1hdGUiKS5sZW5ndGgmJihlKz0uMTYpLHQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fZGVzY3IudC1hbmltYXRlIikubGVuZ3RoJiYoZSs9LjE2KSxlfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fbWFrZVNlY3Rpb25CdXR0b25XYWl0KHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpLmxlbmd0aCxhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fYm90dG9td3JhcHBlciAudC1idG4udC1hbmltYXRlIik7ZS5sZW5ndGgmJmEubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uKHQsZSl7dmFyIGE9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpO2EubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWUrLjE2KyJzIix0X2FuaW1hdGVfX3JlbW92ZU5vSG92ZXJDbGFzc0Zyb21CdG5zKHQpLHQuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyh0LCExKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbl9fb3V0T2ZUdXJuKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpLGE7KGU9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGUsKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX3N0YXJ0ZWQiKX0pKSkubGVuZ3RofHx0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbih0LC4xNil9ZnVuY3Rpb24gdF9hbmltYXRlX19hZGROb0hvdmVyQ2xhc3NUb0J0bnMoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1idG4udC1hbmltYXRlIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9uby1ob3ZlciIpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCl7aWYoIXQpcmV0dXJuITE7dmFyIGU9dC5jbGFzc0xpc3QuY29udGFpbnMoInQtYnRuIik/dDpudWxsO2UmJihlLm9udHJhbnNpdGlvbmVuZD1mdW5jdGlvbih0KXsib3BhY2l0eSIhPT10LnByb3BlcnR5TmFtZSYmInRyYW5zZm9ybSIhPT10LnByb3BlcnR5TmFtZXx8KGUuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX25vLWhvdmVyIiksZS5zdHlsZS50cmFuc2l0aW9uRGVsYXk9IiIsZS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IiIsdGhpcy5vbnRyYW5zaXRpb25lbmQ9bnVsbCl9KX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldEdyb3Vwc09mZnNldHModCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGUiKTtpZihlKXt0LmN1clRvcE9mZnNldD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ7dmFyIGE9dF9hbmltYXRpb25fX2dldFpvb20odCk7d2luZG93LmlzT25seVNjYWxhYmxlfHwodC5jdXJUb3BPZmZzZXQqPWEpfX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvbl9fZ2V0Wm9vbSh0KXtpZih2b2lkIDAhPT10LnNjYWxlRmFjdG9yKXJldHVybiB0LnNjYWxlRmFjdG9yO3ZhciBlPXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIik7aWYoIWUpcmV0dXJuIDE7dmFyIGE9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9InRpbGRhLWJsb2Nrcy0yLjciXScpO3JldHVybiBlLmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmRfc2NhbGUiKXx8IWEmJiJ1bmRlZmluZWQiIT10eXBlb2YgdDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSYmIndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKGUsInVwc2NhbGUiKT93aW5kb3cudG5fc2NhbGVfZmFjdG9yOjF9ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRDaGFpbk9mZnNldHModCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfd2FpdFtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpO3QuaXRlbXNPZmZzZXRzPVtdLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24oZSxhKXt0Lml0ZW1zT2Zmc2V0c1thXT1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXR9KSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRFbGVtc09mZnNldHModCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmN1clRvcE9mZnNldD13aW5kb3cucGFnZVlPZmZzZXQrdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7dmFyIGU9dF9hbmltYXRpb25fX2dldFpvb20odCk7d2luZG93LmlzT25seVNjYWxhYmxlfHwodC5jdXJUb3BPZmZzZXQqPWUpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fcmVtb3ZlQW5pbUZyb21IaWRkZW5TbGlkZXModCl7dmFyIGU7aWYodC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGlkZXMiKS5sZW5ndGgpe3ZhciBhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xpZGVzX19pdGVtIik7YT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYSwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsaWRlc19faXRlbV9hY3RpdmUiKX0pKTt2YXIgbj1bXTthLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZSIpO2UmJm4ucHVzaChlKX0pKSxuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCwibm8taG92ZXIiKX0pKX19ZnVuY3Rpb24gdF9hbmltYXRlX193cmFwVGV4dFdpdGhPcGFjaXR5KCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtdGl0bGUudC1hbmltYXRlLCAudC1kZXNjci50LWFuaW1hdGUsIC50LXVwdGl0bGUudC1hbmltYXRlLCAudC10ZXh0LnQtYW5pbWF0ZSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoInN0eWxlIik7aWYoZSYmLTEhPT1lLmluZGV4T2YoIm9wYWNpdHkiKSl7dmFyIGE9dC5zdHlsZS5vcGFjaXR5O2lmKGEmJmE+MCl7dC5zdHlsZS5vcGFjaXR5PSIiO3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uc3R5bGUub3BhY2l0eT1hO3ZhciBpPXQuY2hpbGROb2RlcztBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xvbmVOb2RlKCEwKTtuLmFwcGVuZENoaWxkKGUpfSkpLHQuaW5uZXJIVE1MPSIiLHQuYXBwZW5kQ2hpbGQobil9fX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2NoZWNrSUUoKXt2YXIgdD13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxlPXQuaW5kZXhPZigiTVNJRSIpLGE9IiIsbj0hMTtyZXR1cm4gZT4wJiYoOCE9PShhPXBhcnNlSW50KHQuc3Vic3RyaW5nKGUrNSx0LmluZGV4T2YoIi4iLGUpKSkpJiY5IT09YXx8KG49ITApKSxufSJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/dF9hbmltYXRlX19pbml0KCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsdF9hbmltYXRlX19pbml0KTsKCmZ1bmN0aW9uIHRfcG9wdXBfX3RyYXBGb2N1cyh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoJ2EsIGJ1dHRvbiwgaW5wdXQ6bm90KFt0eXBlPSJoaWRkZW4iXSk6bm90KC5qcy1mb3JtLXNwZWMtY29tbWVudHMpLCBzZWxlY3QsIHRleHRhcmVhLCBlbWJlZCwgdmlkZW8sIGlmcmFtZSwgW3RhYmluZGV4PSIwIl0nKSxvPWVbMF0scD1lW2UubGVuZ3RoLTFdO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLChmdW5jdGlvbih0KXtpZihkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygidC1ib2R5X3BvcHVwc2hvd2VkIikpe3ZhciBlPSJUYWIiPT09dC5rZXl8fDk9PT10LmtleUNvZGUsbjsoZXx8ZSYmdC5zaGlmdEtleSkmJih0LnNoaWZ0S2V5JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygidC1wb3B1cF9zaG93IikmJnAuZm9jdXMoKSwiVGFiIiE9PXQua2V5fHx0LnNoaWZ0S2V5fHxkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09cHx8KHQucHJldmVudERlZmF1bHQoKSxvLmZvY3VzKCkpLCJUYWIiPT09dC5rZXkmJnQuc2hpZnRLZXkmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1vJiYodC5wcmV2ZW50RGVmYXVsdCgpLHAuZm9jdXMoKSkpfX0pKX1mdW5jdGlvbiB0X3BvcHVwX19hZGRBdHRyaWJ1dGVzRm9yQWNjZXNzaWJpbGl0eSh0KXt2YXIgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWY9IicrdCsnIl0nKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKHQpe3QmJih0LnNldEF0dHJpYnV0ZSgicm9sZSIsImJ1dHRvbiIpLHQuc2V0QXR0cmlidXRlKCJhcmlhLWhhc3BvcHVwIiwiZGlhbG9nIikpfSkpfWZ1bmN0aW9uIHRfcG9wdXBfX3Jlc2l6ZVBvcHVwKHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpO2lmKGUpe3ZhciBvPWUucXVlcnlTZWxlY3RvcigiLnQtcG9wdXBfX2NvbnRhaW5lciIpO2lmKG8pe3ZhciBwPWdldENvbXB1dGVkU3R5bGUobyxudWxsKSxuPXBhcnNlSW50KHAucGFkZGluZ1RvcCl8fDAscj1wYXJzZUludChwLnBhZGRpbmdCb3R0b20pfHwwLHM9by5jbGllbnRIZWlnaHQtKG4rciksYz0xMjAsdT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1wYXJlbnR0cGxpZCIpfHxlLmdldEF0dHJpYnV0ZSgiZGF0YS1yZWNvcmQtdHlwZSIpLGEsaT0iMTA5MyI9PT11fHwiMTIxIj09PXUmJmUucXVlcnlTZWxlY3RvcigiLnQxMDkzIik7IjM2NCIhPT11JiYiMzY1IiE9PXV8fChjPTMwKSwoIjg2OCI9PT11fHwiMzMxIj09PXV8fCIzNTgiPT09dXx8IjEwMTMiPT09dXx8Ijc0NiI9PT11fHxpKSYmKGM9MCkscz53aW5kb3cuaW5uZXJIZWlnaHQtYz9vLmNsYXNzTGlzdC5hZGQoInQtcG9wdXBfX2NvbnRhaW5lci1zdGF0aWMiKTpvLmNsYXNzTGlzdC5yZW1vdmUoInQtcG9wdXBfX2NvbnRhaW5lci1zdGF0aWMiKX19fWZ1bmN0aW9uIHRfcG9wdXBfX3Nob3dQb3B1cCh0KXt0JiYodC5zdHlsZS5kaXNwbGF5PSJibG9jayIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5mb2N1cygpO3ZhciBlPXQ/dC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cF9fY29udGFpbmVyIik6bnVsbDtlJiZlLmNsYXNzTGlzdC5hZGQoInQtcG9wdXBfX2NvbnRhaW5lci1hbmltYXRlZCIpLHQmJnQuY2xhc3NMaXN0LmFkZCgidC1wb3B1cF9zaG93IiksdF9vbkZ1bmNMb2FkKCJ0X3BvcHVwX190cmFwRm9jdXMiLChmdW5jdGlvbigpe3RfcG9wdXBfX3RyYXBGb2N1cyh0KX0pKX0pLDUwKX1mdW5jdGlvbiB0X3BvcHVwX19jbG9zZVBvcHVwKHQpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwLnQtcG9wdXBfc2hvdyIpLG89dC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cF9fY29udGFpbmVyIik7aWYodD09PWUpe3ZhciBwPWRvY3VtZW50LmJvZHk7cC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicG9wdXBIaWRkZW4iKSkscC5jbGFzc0xpc3QucmVtb3ZlKCJ0LWJvZHlfcG9wdXBzaG93ZWQiKSxwLmNsYXNzTGlzdC5yZW1vdmUoInQtcXVpel9fYm9keV9wb3B1cHNob3dlZCIpfXQuY2xhc3NMaXN0LnJlbW92ZSgidC1wb3B1cF9zaG93Iiksby5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNpdGlvbiIpLG8uY2xhc3NMaXN0LnJlbW92ZSgidC1wb3B1cF9fY29udGFpbmVyX25vLXRyYW5zZm9ybSIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIHQ7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtcG9wdXA6bm90KC50LXBvcHVwX3Nob3cpIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5zdHlsZS5kaXNwbGF5PSJub25lIn0pKX0pLDMwMCksdF9wb3B1cF9fYWRkRm9jdXNPblRyaWdnZXJCdXR0b24oKX1mdW5jdGlvbiB0X3BvcHVwX19hZGRDbGFzc09uVHJpZ2dlckJ1dHRvbih0LGUpe3ZhciBvPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXBvcHVwX190cmlnZ2VyZWQtYnRuIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtcG9wdXBfX3RyaWdnZXJlZC1idG4iKX0pKSx0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLChmdW5jdGlvbih0KXtpZigxMz09PXQua2V5Q29kZSl7dmFyIG89dC50YXJnZXQscD0hIW8uY2xvc2VzdCgnYVtocmVmPSInK2UrJyJdJykmJm87aWYoIXApcmV0dXJuO3dpbmRvdy5pc01vYmlsZXx8cC5jbGFzc0xpc3QuYWRkKCJ0LXBvcHVwX190cmlnZ2VyZWQtYnRuIil9fSkpfWZ1bmN0aW9uIHRfcG9wdXBfX2FkZEZvY3VzT25UcmlnZ2VyQnV0dG9uKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtcG9wdXBfX3RyaWdnZXJlZC1idG4iKTt0JiYhdC5jbGFzc0xpc3QuY29udGFpbnMoInQ3MjRfX29wZW5lciIpJiYodC5mb2N1cygpLHQuY2xhc3NMaXN0LnJlbW92ZSgidC1wb3B1cF9fdHJpZ2dlcmVkLWJ0biIpKX1FbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzfHwoRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcz1FbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5tb3pNYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUub01hdGNoZXNTZWxlY3RvciksRWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdHx8KEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXM7ZSYmMT09PWUubm9kZVR5cGU7KXtpZihFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzLmNhbGwoZSx0KSlyZXR1cm4gZTtlPWUucGFyZW50RWxlbWVudHx8ZS5wYXJlbnROb2RlfXJldHVybiBudWxsfSk7CgpmdW5jdGlvbiB0Mzk2X19wYXJzZUdsb2JhbFN0eWxlQ1NTVmFyKHQpe3RyeXt2YXIgZSxpPS92YXJcKCgtLXVjLShbXi1dKyktKFteLV0rKS0oW14sXSspKSxccz8oLiopXCkvLmV4ZWModCk7aWYoIWkpcmV0dXJuO3ZhciByPWlbMF0sbz1pWzFdLG49aVsyXSxhPWlbM10sbD1pWzRdLGQ9aVs1XSxfLHM7aWYoIShyJiZuJiZhJiZsJiZkKSlyZXR1cm47cmV0dXJue3BhcmVudDp7aWQ6bCx0eXBlOm59LGZhbGxiYWNrOndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUobyl8fGQsZmllbGQ6YX19Y2F0Y2godSl7Y29uc29sZS5lcnJvcigiRXJyb3IgdHJ5aW5nIHRvIHBhcnNlIENTUyBWYXJpYWJsZSIpfX1mdW5jdGlvbiB0Mzk2X19oZXgycmdiYSh0LGUpe2lmKCF0KXJldHVybiExO3ZhciBpPXQzOTZfX3BhcnNlR2xvYmFsU3R5bGVDU1NWYXIodCk7aSYmKHQ9aS5mYWxsYmFjayk7dmFyIHI9dC5yZXBsYWNlKC8jLywiIik7aWYoMz09PXIubGVuZ3RoKXt2YXIgbz1yWzBdLG49clsxXSxhPXJbMl07dD0iIyIrbytvK24rbithK2F9dmFyIGw9cGFyc2VJbnQodC5zdWJzdHJpbmcoMSksMTYpLGQsXyxzO3JldHVyblsoMTY3MTE2ODAmbCk+PjE2LCg2NTI4MCZsKT4+OCwyNTUmbCxwYXJzZUZsb2F0KGUpXX1mdW5jdGlvbiB0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpe3ZhciBlPVsiZ2FsbGVyeSJdLGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7cmV0dXJuIGUuaW5jbHVkZXMoaSl9ZnVuY3Rpb24gdDM5Nl9faXNGbGV4KHQpe3ZhciBlPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19hcnRib2FyZC1mbGV4IiksaT10LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fZ3JvdXAtZmxleCIpO3JldHVybiBlfHxpfWZ1bmN0aW9uIHQzOTZfX3NldE92ZXJmbG93VG9BbGxSZWNvcmRzKCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtpZih0KXt2YXIgZT1bIi50OTUxX19zaWRlYmFyX3N0aWNreSIsIi50MTIwNl9fY29udGVudF9zdGlja3kiLCIudDc1NF9fY29sX2ZpeGVkIiwiLnQ3NzZfX2NvbF9maXhlZCIsIi50Nzg2X19jb2xfZml4ZWQiLCIudC1zdG9yZV9fcHJvZC1wb3B1cF9fY29sX2ZpeGVkIiwiLnQtY2F0YWxvZ19fc2lkZWJhcl9zdGlja3kiXTt0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKTt2YXIgaT1Cb29sZWFuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZS5qb2luKCIsICIpKSk7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiLCJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpLHQuY2xhc3NMaXN0LmFkZChpPyJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiOiJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpfX1mdW5jdGlvbiB0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQzOTZfX292ZXJmbG93LXN0eWxlcyIpKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3QuaWQ9InQzOTZfX292ZXJmbG93LXN0eWxlcyIsdC5pbm5lckhUTUw9Ii50LXJlY29yZHNfX292ZXJmbG93LWNsaXAgeyBvdmVyZmxvdzogY2xpcDsgfVxuXHRcdFx0XHRcdFx0LnQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIHsgb3ZlcmZsb3c6IGhpZGRlbjsgfSIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KX19ZnVuY3Rpb24gdDM5Nl9fZ2V0QXJ0Ym9hcmRzKHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksaSxyPWUmJiJlZGl0Ij09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKT8nLnJlY29yZFtkYXRhLXJlY29yZC10eXBlPSInK3QrJyJdIC5yOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yZWNvcmRbZGF0YS1wYXJlbnR0cGxpZD0iJyt0KyciXSAucjpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJzonLnJbZGF0YS1yZWNvcmQtdHlwZT0iJyt0KyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucltkYXRhLXBhcmVudHRwbGlkPSInK3QrJyJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQnO3JldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocikpfWZ1bmN0aW9uIHQzOTZfX2dldFplcm9CbG9ja3MoKXt2YXIgdD1bXS5jb25jYXQodDM5Nl9fZ2V0QXJ0Ym9hcmRzKCIzOTYiKSx0Mzk2X19nZXRBcnRib2FyZHMoIjEyMSIpKSxlO3JldHVybiB0Lmxlbmd0aD90Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3JlY29yZDp0LmNsb3Nlc3QoIi5yOm5vdCgudDM5N19fb2ZmKTpub3QoLnQzOTVfX29mZik6bm90KC50NDAwX19vZmYpIiksYXJ0Ym9hcmQ6dH19KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5yZWNvcmR9KSk6W119ZnVuY3Rpb24gdDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKHQpe2Zvcih2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO2U7KXt2YXIgaTtpZihlLnN0eWxlLnpvb20pcmV0dXJuITA7ZT1udWxsPT0oaT1lLnBhcmVudEVsZW1lbnQpP3ZvaWQgMDppLmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpfXJldHVybiExfXZhciB0Mzk2X191bmlxdWVJZF9fZ2VuZXJhdG9yPWZ1bmN0aW9uIHQoKXt2YXIgZT0wO3JldHVybiBmdW5jdGlvbigpe3ZhciB0PVN0cmluZyhlKz0xKS5wYWRTdGFydCg2LCIwIik7cmV0dXJuIiIrRGF0ZS5ub3coKSt0fX0sdDM5Nl9fZ2V0VW5pcXVlSWQ9dDM5Nl9fdW5pcXVlSWRfX2dlbmVyYXRvcigpO2Z1bmN0aW9uIHQzOTZfaXNCbG9ja1Zpc2libGUodCl7dmFyIGU9d2luZG93LmlubmVyV2lkdGgsaT10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWluIikscj10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWF4Iik7cmV0dXJuIShpJiZlPHBhcnNlSW50KGksMTApKSYmIShyJiZlPnBhcnNlSW50KHIsMTApKX12YXIgdDM5Nl9fb25SZWFkeT1mdW5jdGlvbiB0KGUpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/ZSgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGUpfTtmdW5jdGlvbiB0Mzk2X2VsZW1fX2dldEZvcm1JbnB1dHNWYWx1ZSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19pbnB1dHMtdGV4dGFyZWEiKTtpZihlKXt2YXIgaT1lLnZhbHVlO2lmKGkpdHJ5e3JldHVybiBKU09OLnBhcnNlKGkpfWNhdGNoKG4pe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciBwYXJzaW5nIGZvcm0gaW5wdXRzIHRleHRhcmVhIHZhbHVlOiIsbixpKSxbXX19dmFyIHI9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9faW5wdXRzLWRhdGEiKTtpZihyKXt2YXIgbz1yLmdldEF0dHJpYnV0ZSgiZGF0YS12YWx1ZSIpO2lmKG8pdHJ5e3JldHVybiBKU09OLnBhcnNlKG8pfWNhdGNoKG4pe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciBwYXJzaW5nIGZvcm0gaW5wdXRzIGRhdGE6IixuLG8pLFtdfX1yZXR1cm5bXX1mdW5jdGlvbiB0Mzk2X2luaXQodCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksaT1lP2UucXVlcnlTZWxlY3RvcigiLnQzOTYiKTpudWxsLHI9ZT9lLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19hcnRib2FyZCIpOm51bGw7aWYocil7dDM5Nl9pbml0VE5vYmoodCxyKSx0Mzk2X19pbml0T25seVNjYWxhYmxlKCk7dmFyIG89IiIsbj10Mzk2X2RldGVjdFJlc29sdXRpb24odCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGw9YSYmImVkaXQiPT09YS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpO3ZvaWQgMD09PXdpbmRvdy50bi5pc0VkaXRNb2RlJiYod2luZG93LnRuLmlzRWRpdE1vZGU9bCksdDM5Nl9zd2l0Y2hSZXNvbHV0aW9uKHQsbik7dmFyIGQ9IndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHIsInVwc2NhbGUiKSxfPXQzOTZfX3NldEdsb2JhbFNjYWxlVmFyaWFibGVzKHQsbixkKTtpZih0Mzk2X19zZXRTY2FsZUZhY3RvckZvckVsZW1lbnRzKHQsXyksdDM5Nl91cGRhdGVUTm9iaih0KSx0Mzk2X2FydGJvYXJkX2J1aWxkKG8sdCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9faW5pdGlhbGl6ZUFydGJvYXJkT3ZlcmZsb3coYSxyKX0pKSx3aW5kb3cudGlsZGFNZW1iZXJzJiYiTXV0YXRpb25PYnNlcnZlciJpbiB3aW5kb3cpe3ZhciBzPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbihlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyJhdHRyaWJ1dGVzIj09PWUudHlwZSYmImNsYXNzIj09PWUuYXR0cmlidXRlTmFtZSYmZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bGstY291cnNlc19wYWdlIikmJih0Mzk2X2RvUmVzaXplKHQsITApLHMuZGlzY29ubmVjdCgpKX0pKX0pKTtzLm9ic2VydmUoZG9jdW1lbnQuYm9keSx7YXR0cmlidXRlczohMH0pfWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50ODMwIikmJnRfb25SZWFkeSgoZnVuY3Rpb24oKXt2YXIgZSxpO1sidDgzMF9fYWxscmVjb3Jkc19wYWRkIiwidDgzMF9fYWxscmVjb3Jkc19wYWRkLXNtYWxsIl0uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIGEuY2xhc3NMaXN0LmNvbnRhaW5zKHQpfSkpP3QzOTZfZG9SZXNpemUodCwhMCk6YS5hZGRFdmVudExpc3RlbmVyKCJhbGxSZWNQYWRkaW5nSW5pdCIsKGZ1bmN0aW9uKCl7dDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKX0pKSxlJiZpJiZyJiYieWVzIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWNvbm5lY3Qtd2l0aC10YWIiKSYmaS5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsKGZ1bmN0aW9uKCl7dDM5Nl9hbGxlbGVtc19fcmVuZGVyVmlldyhyKSx0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyhyKSx0Mzk2X2RvUmVzaXplKHQsITApfSkpO3ZhciB1PSJodWciPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0bW9kZSIpLGM7aWYodSl7dmFyIGY9dF90aHJvdHRsZSgoZnVuY3Rpb24oKXt0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KHIpfSksMTAwKTtmKCksc2V0SW50ZXJ2YWwoZiwzZTMpLGRvY3VtZW50LmZvbnRzJiZkb2N1bWVudC5mb250cy5yZWFkeS50aGVuKGYpLHIucXVlcnlTZWxlY3RvckFsbCgiaW1nIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5vbmxvYWQ9Zn0pKSxuZXcgTXV0YXRpb25PYnNlcnZlcihmKS5vYnNlcnZlKHIse3N1YnRyZWU6ITAsY2hhcmFjdGVyRGF0YTohMCxjaGFyYWN0ZXJEYXRhT2xkVmFsdWU6ITB9KSxuZXcgTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24odCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZTsiY2hpbGRMaXN0Ij09PXQudHlwZSYmKEFycmF5LmZyb20odC5hZGRlZE5vZGVzKS5jb25jYXQoQXJyYXkuZnJvbSh0LnJlbW92ZWROb2RlcykpLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiAzIT09dC5ub2RlVHlwZSYmKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIil8fHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cCIpKX0pKSYmZigpKX0pKX0pKS5vYnNlcnZlKHIse3N1YnRyZWU6ITAsY2hpbGRMaXN0OiEwfSl9KGEuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0MjM1X19iZWZvcmVyZWFkeSIpfHxlJiZlLmNsb3Nlc3QoIiNhbGxyZWNvcmRzdGFibGUiKXx8YS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yZWNvcmQtdHlwZT0iMjYzIl0nKSkmJmkmJnImJmkuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKTt2YXIgZz0hIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50NjM1X190ZXh0aG9sZGVyIik7ZSYmZyYmaSYmciYmaS5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25Jbml0ZWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKSxlJiZkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDQzMSIpJiZpJiZyJiZ0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Mzk2X2RvUmVzaXplKHQsITApfSkpfSkpLC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJmkmJmkuY2xhc3NMaXN0LmFkZCgidDM5Nl9zYWZhcmkiKSxkJiYhbCYmdF9vbkZ1bmNMb2FkKCJ0Mzk2X3NjYWxlQmxvY2siLChmdW5jdGlvbigpe3QzOTZfc2NhbGVCbG9jayh0KX0pKSxsfHwieSIhPT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHIsImZpeGVkLW5lZWQtanMiKXx8dF9vbkZ1bmNMb2FkKCJ0Mzk2X19wcm9jZXNzRml4ZWRBcnRCb2FyZCIsKGZ1bmN0aW9uKCl7dDM5Nl9fcHJvY2Vzc0ZpeGVkQXJ0Qm9hcmQocil9KSksdDM5Nl9fcHJvY2Vzc0Fic29sdXRlQXJ0Qm9hcmQociksdDM5Nl9fcHJvY2Vzc1RvcFNoaWZ0KHIsdCwhMSksd2luZG93LnQzOTZfX2lzTW9iaWxlfHx1fHx0Mzk2X19yZW1vdmVJbmxpbmVIZWlnaHQoW3Isci5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fY2FycmllciIpLHIucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpXSksbHx8dDM5Nl9faW50aWFsaXplVW5kZXJjdXQoZSl9fXdpbmRvdy50Mzk2X19pc01vYmlsZT0vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiSW5zdGFncmFtIik+LTEsd2luZG93LnQzOTZfX2lzSVBhZD0ib250b3VjaGVuZCJpbiBkb2N1bWVudCYmLTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkFwcGxlV2ViS2l0Iiksd2luZG93LnQzOTZfX2lzU2FmYXJpPS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksd2luZG93LnQzOTZfX2lzVG91Y2hEZXZpY2U9Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQsd2luZG93LnQzOTZfX2lzSW5BcHBCcm93c2VyPS9XZWJWaWV3fChpUGhvbmV8aVBvZHxpUGFkKSg/IS4qU2FmYXJpKS9naS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy50Mzk2X19pc0ZhY2Vib29rTWVzc2VuZ2VySW5BcHA9L0ZCQU58RkJBVi9naS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZ3aW5kb3cudDM5Nl9faXNJbkFwcEJyb3dzZXIsd2luZG93LnQzOTZfX2lzSW5zdGFncmFtSW5BcHA9L1xiSW5zdGFncmFtL2dpLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJndpbmRvdy50Mzk2X19pc0luQXBwQnJvd3Nlcix0X29uUmVhZHkodDM5Nl9fZ2xvYmFsSW5pdCk7dmFyIHQzOTZfd2FpdEZvckZpbmFsRXZlbnQ9ZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gZnVuY3Rpb24oZSxpLHIpe3ZhciBvPXJ8fCJEb24ndCBjYWxsIHRoaXMgdHdpY2Ugd2l0aG91dCBhIHVuaXF1ZUlkIjt0W29dJiZjbGVhclRpbWVvdXQodFtvXSksdFtvXT1zZXRUaW1lb3V0KGUsaSl9fSgpO2Z1bmN0aW9uIHQzOTZfX2hhbmRsZVJlc2l6ZU9wZW5lZFBvcHVwKCl7dDM5Nl9fd2FpdEZvclBvcHVwKCkudGhlbigoZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKTtlJiZ0Mzk2X2RvUmVzaXplKGUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpfX0pKX1mdW5jdGlvbiB0Mzk2X19pbml0UG9wdXBSZXNpemUoKXtkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvcHVwU2hvd2VkIix0Mzk2X19oYW5kbGVSZXNpemVPcGVuZWRQb3B1cCksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJwb3B1cFNob3dlZCIsdDM5Nl9faGFuZGxlUmVzaXplT3BlbmVkUG9wdXApfWZ1bmN0aW9uIHQzOTZfYWJfX2dldFdpbmRvd0hlaWdodCh0KXtyZXR1cm4gdDM5Nl9fc2hvdWxkVXNlVmlzdWFsVmlld3BvcnRIZWlnaHQoKSYmdDM5Nl9faXNJblBvcHVwKHQpP3dpbmRvdy52aXN1YWxWaWV3cG9ydC5oZWlnaHQ6dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLmhlaWdodDt2YXIgZSxpfWZ1bmN0aW9uIHQzOTZfYWJfX2dldFdpbmRvd1dpZHRoKHQpe3JldHVybiB0Mzk2X19pc0luUG9wdXAodCk/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOnQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aDt2YXIgZSxpfWZ1bmN0aW9uIHQzOTZfX2dldFROV2luZG93SGVpZ2h0KCl7cmV0dXJuIHdpbmRvdy50Mzk2X19pc01vYmlsZXx8d2luZG93LnQzOTZfX2lzSVBhZD9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OndpbmRvdy5pbm5lckhlaWdodH1mdW5jdGlvbiB0Mzk2X19nZXRUTldpbmRvd1dpZHRoKCl7dmFyIHQ9dDM5Nl9fZ2V0QmxvY2tFZGl0b3JXaWR0aCgpO2lmKHQpcmV0dXJuIHQ7dmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLGk9dDM5Nl9fZ2V0QXhpc1hQYWRkaW5nKCk7cmV0dXJuIGkmJihlLT1pKSxlfWZ1bmN0aW9uIHQzOTZfX2dldENTU1dpbmRvd1dpZHRoKCl7dmFyIHQ9dDM5Nl9fZ2V0QmxvY2tFZGl0b3JXaWR0aCgpLGU7cmV0dXJuIHR8fCh3aW5kb3cudDM5Nl9faXNNb2JpbGV8fHdpbmRvdy50Mzk2X19pc0lQYWR8fHdpbmRvdy50Mzk2X19pc1NhZmFyaT9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6d2luZG93LmlubmVyV2lkdGgpfWZ1bmN0aW9uIHQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnModCl7dmFyIGUsaT0odHx8e30pLmZvcmNlVXBkYXRlLHI9dm9pZCAwIT09aSYmaSxvPSF3aW5kb3cudG4ud2luZG93X3dpZHRofHwhd2luZG93LnRuLndpbmRvd19oZWlnaHR8fCF3aW5kb3cudG4ud2luZG93X3dpZHRoX2NzcyxuO3JldHVybihyfHxvKSYmdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpLHt3aWR0aDp3aW5kb3cudG4ud2luZG93X3dpZHRoLGhlaWdodDp3aW5kb3cudG4ud2luZG93X2hlaWdodCxjc3NXaWR0aDp3aW5kb3cudG4ud2luZG93X3dpZHRoX2Nzc319ZnVuY3Rpb24gdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpe3dpbmRvdy50bi53aW5kb3dfd2lkdGg9dDM5Nl9fZ2V0VE5XaW5kb3dXaWR0aCgpLHdpbmRvdy50bi53aW5kb3dfaGVpZ2h0PXQzOTZfX2dldFROV2luZG93SGVpZ2h0KCksd2luZG93LnRuLndpbmRvd193aWR0aF9jc3M9dDM5Nl9fZ2V0Q1NTV2luZG93V2lkdGgoKX1mdW5jdGlvbiB0Mzk2X19yZXZhbGlkYXRlRGltZW5zaW9ucygpe3ZhciB0LGU9dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLndpZHRoLGkscjtyZXR1cm4gdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpLGUhPT10Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKCkud2lkdGh9ZnVuY3Rpb24gdDM5Nl9fcmVtb3ZlSW5saW5lSGVpZ2h0KHQpeyIxLjAiIT09d2luZG93LlROX1NDQUxFX0lOSVRJQUxfVkVSJiZ0LmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0JiYodC5zdHlsZS5oZWlnaHQ9IiIpfSkpfWZ1bmN0aW9uIHQzOTZfX2NsZWFySW5pdGlhbFNjYWxlU3R5bGVzKCl7aWYoIjEuMCI9PT13aW5kb3cuVE5fU0NBTEVfSU5JVElBTF9WRVIpe3ZhciB0PWZ1bmN0aW9uIHQoZSl7dmFyIGk7ZSYmKCJ2YXIoLS1pbml0aWFsLXNjYWxlLWhlaWdodCkiPT09ZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCJoZWlnaHQiKSYmZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiaGVpZ2h0IikpfSxlO3QzOTZfX2dldFplcm9CbG9ja3MoKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgaT1lLmFydGJvYXJkO2kmJihpLnN0eWxlLnJlbW92ZVByb3BlcnR5KCItLWluaXRpYWwtc2NhbGUtaGVpZ2h0IiksdChpKSx0KGkucXVlcnlTZWxlY3RvcigiLnQzOTZfX2NhcnJpZXIiKSksdChpLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19maWx0ZXIiKSkpfSkpfX1mdW5jdGlvbiB0Mzk2X19nbG9iYWxJbml0KCl7d2luZG93LnRufHx0Mzk2X2luaXRUTm9ial9fY3JlYXRlRGVmYXVsdCgpLHQzOTZfX2lzQWxsWmVyb0Jsb2Nrc1JlbmRlcmVkKChmdW5jdGlvbigpe3QzOTZfX2FwcGx5Rml4ZXNGb3JBbGxFbGVtZW50cygpLHQzOTZfX2luaXRpYWxpemVBbmNob3JMaW5rT3ZlcmZsb3dGaXgoKSx0Mzk2X19pbml0UG9wdXBSZXNpemUoKSx0Mzk2X19jbGVhckluaXRpYWxTY2FsZVN0eWxlcygpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHQzOTZfX29uUmVzaXplKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLHQzOTZfX29uT3JpZW50YXRpb25DaGFuZ2UpfSkpfWZ1bmN0aW9uIHQzOTZfX29uUmVzaXplKCl7dDM5Nl93YWl0Rm9yRmluYWxFdmVudCgoZnVuY3Rpb24oKXt2YXIgdDt0Mzk2X19yZXZhbGlkYXRlRGltZW5zaW9ucygpJiYodDM5Nl9fZ2V0WmVyb0Jsb2NrcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucmVjb3JkO2lmKGUmJnQzOTZfaXNCbG9ja1Zpc2libGUoZSkpdHJ5e3QzOTZfZG9SZXNpemUoZS5pZC5yZXBsYWNlKCJyZWMiLCIiKSl9Y2F0Y2goaSl7Y29uc29sZS5lcnJvcigiRXJyb3IgdHJ5aW5nIHRvIHJlc2l6ZSAiK2UuaWQsaSl9fSkpLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJ6ZXJvOndpbmRvdy13aWR0aC1jaGFuZ2VkIikpKX0pLDUwMCwiZ2xvYmFsX3Jlc2l6ZV96ZXJvX3VuaXF1ZV9pZCIpfWZ1bmN0aW9uIHQzOTZfX29uT3JpZW50YXRpb25DaGFuZ2UoKXt0Mzk2X3dhaXRGb3JGaW5hbEV2ZW50KChmdW5jdGlvbigpe3QzOTZfX3VwZGF0ZVdpbmRvd0RpbWVuc2lvbnMoKSx0Mzk2X19nZXRaZXJvQmxvY2tzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5yZWNvcmQ7ZSYmdDM5Nl9pc0Jsb2NrVmlzaWJsZShlKSYmdDM5Nl9kb1Jlc2l6ZShlLmlkLnJlcGxhY2UoInJlYyIsIiIpKX0pKX0pLDYwMCwiZ2xvYmFsX29yaWVudGF0aW9uY2hhbmdlX3plcm9fdW5pcXVlX2lkIil9ZnVuY3Rpb24gdDM5Nl9pc09ubHlTY2FsYWJsZUJyb3dzZXIoKXtyZXR1cm4gd2luZG93LmlzT25seVNjYWxhYmxlfWZ1bmN0aW9uIHQzOTZfX2luaXRPbmx5U2NhbGFibGUoKXtpZih2b2lkIDA9PT13aW5kb3cuaXNPbmx5U2NhbGFibGUpe3ZhciB0PXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9GaXJlZm94XC8oWzAtOV0rKVwuLyksZT10P3BhcnNlSW50KHRbMV0sMTApOjEyNixpPXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcLyhbMC05XSspXC4vKSxyPWkmJnBhcnNlSW50KGlbMV0sMTApfHwwO3dpbmRvdy5pc09ubHlTY2FsYWJsZT1lPDEyNix3aW5kb3cuc2hvdWxkVXNlU2NhbGVGYWN0b3I9IXdpbmRvdy5pc09ubHlTY2FsYWJsZSYmIXQmJnI8PTEyN319ZnVuY3Rpb24gdDM5Nl9fc2V0R2xvYmFsU2NhbGVWYXJpYWJsZXModCxlLGkpe3ZhciByPTEsbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KSxuPW8/by5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKTpudWxsO2lmKCFuKXJldHVybiAxO3ZhciBhPXQzOTZfYWJfX2dldFdpbmRvd1dpZHRoKG4pLGw9aT9wYXJzZUZsb2F0KChhL2UpLnRvRml4ZWQoMykpOjEsZD0iYWIiK3Q7d2luZG93LnRuW2RdLnNjYWxlRmFjdG9yPWwsd2luZG93LnRuX3NjYWxlX2ZhY3Rvcj1sO3ZhciBfPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpO3JldHVybiBfJiYhd2luZG93LnRuLmlzRWRpdE1vZGUmJl8uc3R5bGUuc2V0UHJvcGVydHkoIi0tem9vbSIsbC50b1N0cmluZygpKSxsfWZ1bmN0aW9uIHQzOTZfX3Byb2Nlc3NUb3BTaGlmdCh0LGUsaSl7ImZ1bmN0aW9uIiE9dHlwZW9mIHdpbmRvdy50Mzk2X191cGRhdGVUb3BTaGlmdHx8InkiIT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJzaGlmdC1wcm9jZXNzZWQiKSYmInkiIT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJmaXhlZC1zaGlmdCIpfHx3aW5kb3cudDM5Nl9fdXBkYXRlVG9wU2hpZnQoZSxpKX1mdW5jdGlvbiB0Mzk2X2RvUmVzaXplKHQsZSl7ZSYmdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpO3ZhciBpPXQzOTZfaXNPbmx5U2NhbGFibGVCcm93c2VyKCkscj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KSxvPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksbj10Mzk2X2RldGVjdFJlc29sdXRpb24odCksYTtpZih0Mzk2X3JlbW92ZUVsZW1lbnRGcm9tRE9NKHI/ci5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fc2NhbGUtc3R5bGUiKTpudWxsKSxpKXt2YXIgbD1yP3IucXVlcnlTZWxlY3RvckFsbCgiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpOltdO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobCwoZnVuY3Rpb24odCl7aWYoIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1hdG9tIil8fCF0LmNsb3Nlc3QoIi50bi1tb2xlY3VsZSIpKXt2YXIgZT10LmNsb3Nlc3QoIi50bi1hdG9tX19zY2FsZS13cmFwcGVyIiksaT1lP2UucGFyZW50Tm9kZTpudWxsO2kmJmkucmVtb3ZlQ2hpbGQoZSksaSYmaS5hcHBlbmRDaGlsZCh0KX19KSl9ZWxzZXt2YXIgZD1yP3IucXVlcnlTZWxlY3RvckFsbCgiLnQzOTZfX2VsZW0sIC50Mzk2X19ncm91cCIpOltdO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZCwoZnVuY3Rpb24odCl7dC5zdHlsZS56b29tPSIiO3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTtlJiYoZS5zdHlsZS50cmFuc2Zvcm1PcmlnaW49IiIsZS5zdHlsZS5mb250U2l6ZT0iIixlLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PSIiKX0pKX10Mzk2X3N3aXRjaFJlc29sdXRpb24odCxuKTt2YXIgXz1yP3IucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbCxzPSJ3aW5kb3ciPT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShfLCJ1cHNjYWxlIiksdT10Mzk2X19zZXRHbG9iYWxTY2FsZVZhcmlhYmxlcyh0LG4scyk7dDM5Nl9fc2V0U2NhbGVGYWN0b3JGb3JFbGVtZW50cyh0LHUpLHQzOTZfdXBkYXRlVE5vYmoodCksdDM5Nl9hYl9fcmVuZGVyVmlldyhfKTt2YXIgYz1vP28uZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKToiIjtzJiYiZWRpdCIhPT1jJiZ0X29uRnVuY0xvYWQoInQzOTZfc2NhbGVCbG9jayIsKGZ1bmN0aW9uKCl7dDM5Nl9zY2FsZUJsb2NrKHQpfSkpLCJlZGl0IiE9PWMmJiJ5Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoXywiZml4ZWQtbmVlZC1qcyIpJiZ0X29uRnVuY0xvYWQoInQzOTZfX3Byb2Nlc3NGaXhlZEFydEJvYXJkIiwoZnVuY3Rpb24oKXt0Mzk2X19wcm9jZXNzRml4ZWRBcnRCb2FyZChfKX0pKSx0Mzk2X19wcm9jZXNzQWJzb2x1dGVBcnRCb2FyZChfKSx0Mzk2X19wcm9jZXNzVG9wU2hpZnQoXyx0LCEwKSx0Mzk2X2FsbGVsZW1zX19yZW5kZXJWaWV3KF8pLHQzOTZfYWxsZ3JvdXBzX19yZW5kZXJWaWV3KF8pLHQzOTZfX2FwcGx5Rml4ZXNGb3JBbGxFbGVtZW50cygpLHQzOTZfX3VwZGF0ZUF1dG9IZWlnaHQoXyksXyYmXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiYXJ0Qm9hcmRSZXNpemVkIikpO3ZhciBmPSJodWciPT09Xy5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0bW9kZSIpO18mJiFmJiYod2luZG93LnQzOTZfX2lzTW9iaWxlfHx0Mzk2X19yZW1vdmVJbmxpbmVIZWlnaHQoW18sXy5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fY2FycmllciIpLF8ucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpXSkpfWZ1bmN0aW9uIHQzOTZfX3VwZGF0ZUF1dG9IZWlnaHQodCl7dmFyIGUsaTtpZigiaHVnIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLWhlaWdodG1vZGUiKSl7dmFyIHI9dDM5Nl9fZ2V0QXV0b0hlaWdodCh0KSxvPXQub2Zmc2V0SGVpZ2h0O2lmKCEoTWF0aC5hYnMoci1vKTw9LjcpKXt2YXIgbixhPSJhYiIrdC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxsPXdpbmRvdy50blthXS5jdXJSZXNvbHV0aW9uLGQ7bD09PXdpbmRvdy50blthXS5jdXJSZXNvbHV0aW9uX21heD90LnNldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHQiLHIpOnQuc2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLWhlaWdodC1yZXMtIitsLHIpLHQzOTZfYWJfX3JlbmRlclZpZXcodCksbnVsbD09KGU9dC5jbG9zZXN0KCIudDM5NiIpKXx8ZS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiemVybzpoZWlnaHQtY2hhbmdlZCIpKX19fWZ1bmN0aW9uIHQzOTZfX2dldEF1dG9IZWlnaHQodCl7dmFyIGUsaT10LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmQtZmxleCIpLHI9QXJyYXkuZnJvbSh0LnF1ZXJ5U2VsZWN0b3JBbGwoIjpzY29wZSA+IC50bi1ncm91cCwgOnNjb3BlID4gLnRuLWVsZW0iKSksbz10LnN0eWxlLmhlaWdodCxuO2lmKHQzOTZfX2F1dG9IZWlnaHRfX2NhbkF1dG9jYWxjdWxhdGVIZWlnaHQodCxyKSYmbyl7dmFyIGE9dC5zdHlsZS5oZWlnaHQ7dC5zdHlsZS5oZWlnaHQ9ImF1dG8iLGU9dC5vZmZzZXRIZWlnaHQsdC5zdHlsZS5oZWlnaHQ9YX1lbHNlIGU9ci5yZWR1Y2UoKGZ1bmN0aW9uKGUscil7dmFyIG89dDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHIsImF4aXN5Iiksbj10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUociwidG9wdW5pdHMiKSxhPXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZShyLCJoZWlnaHR1bml0cyIpO2lmKCIlIj09PW58fCIlIj09PWF8fCJib3R0b20iPT09b3x8ImNlbnRlciI9PT1vKXJldHVybiBlO3ZhciBsPTA7aWYoImdhbGxlcnkiPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIikmJihsPXQzOTZfX2F1dG9IZWlnaHRfX2dldEFkZGl0aW9uYWxPZmZzZXRGb3JHYWxsZXJ5KHIpKSxpKXt2YXIgZD10Mzk2X19hYl9fZ2V0UGFkZGluZ1ZhbHVlKHQsInBhZGRpbmdib3R0b20iKTtsKz1wYXJzZUludChkLDEwKX12YXIgXz1yLm9mZnNldFRvcCtyLm9mZnNldEhlaWdodCtsLHMsdSxjOyJ3aW5kb3ciIT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJ1cHNjYWxlIil8fHdpbmRvdy50bi5pc0VkaXRNb2RlfHwoXyo9dDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpKTtyZXR1cm4gXz5lP186ZX0pLC0xLzApO3JldHVybiBlPT09LTEvMD8wOmV9ZnVuY3Rpb24gdDM5Nl9fYXV0b0hlaWdodF9fZ2V0QWRkaXRpb25hbE9mZnNldEZvckdhbGxlcnkodCl7dmFyIGU9MCxpPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fdGl0bGUiKSxyPSJub25lIiE9PXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZSh0LCJzbGRzX2RvdHNjb250cm9scyIpLG89InVuZGVyIj09PXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZSh0LCJzbGRzX2Fycm93Y29udHJvbHMiKTtpZihpfHxyfHxvKXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX3RpdGxlIiksYT1uP24ub2Zmc2V0SGVpZ2h0OjAsbD10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NhcHRpb24udC1zbGRzX19jYXB0aW9uLWFjdGl2ZSIpLGQ9Z2V0Q29tcHV0ZWRTdHlsZShsKSxfO2UrPXBhcnNlSW50KGQubWFyZ2luVG9wLDEwKSthfXJldHVybiBpfHwhciYmIW98fChlLT0yMCksZX1mdW5jdGlvbiB0Mzk2X19hdXRvSGVpZ2h0X19jYW5BdXRvY2FsY3VsYXRlSGVpZ2h0KHQsZSl7dmFyIGkscjtpZighdC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZsZXgiKSlyZXR1cm4hMTtpZihlLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiJnYWxsZXJ5Ij09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpfSkpKXt2YXIgbz10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsImZsZXhkaXJlY3Rpb24iKSxuPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiZmxleGFsaWduaXRlbXMiKSxhPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiZmxleGp1c3RpZnljb250ZW50IiksbDtyZXR1cm4icm93Ij09PW8mJiJmbGV4LWVuZCI9PT1ufHwiY29sdW1uIj09PW8mJiJmbGV4LWVuZCI9PT1hfXJldHVybiEwfWZ1bmN0aW9uIHQzOTZfX2FiX19nZXRQYWRkaW5nVmFsdWUodCxlKXt2YXIgaT0odDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJwYWRkaW5nIil8fCIwcHggMHB4IDBweCAwcHgiKS5zcGxpdCgiICIpLHI9e3BhZGRpbmd0b3A6aVswXSxwYWRkaW5ncmlnaHQ6aVsxXSxwYWRkaW5nYm90dG9tOmlbMl0scGFkZGluZ2xlZnQ6aVszXX07cmV0dXJuIHBhcnNlSW50KHJbZV0sMTApfHwwfWZ1bmN0aW9uIHQzOTZfX3Byb2Nlc3NBYnNvbHV0ZUFydEJvYXJkKHQpe2lmKHQpe3ZhciBlPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwicG9zIik7aWYoImZpeGVkIiE9PWUpe3ZhciBpPSJ0Mzk2X19hcnRib2FyZC1maXhlZC1uby1iZyI7aWYoImFic29sdXRlIj09PWUpe3ZhciByPWdldENvbXB1dGVkU3R5bGUodCksbz10LnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19maWx0ZXIiKSxuPSFvfHwibm9uZSI9PT1nZXRDb21wdXRlZFN0eWxlKG8pLmJhY2tncm91bmRJbWFnZSxhLGw9InJnYmEoMCwgMCwgMCwgMCkiPT09ci5iYWNrZ3JvdW5kQ29sb3ImJiJub25lIj09PXIuYmFja2dyb3VuZEltYWdlJiZuPyJhZGQiOiJyZW1vdmUiO3QuY2xhc3NMaXN0W2xdKGkpfWVsc2UgdC5jbGFzc0xpc3QucmVtb3ZlKGkpfX19ZnVuY3Rpb24gdDM5Nl9kZXRlY3RSZXNvbHV0aW9uKHQpe2lmKCF0KXJldHVybiBudWxsO3ZhciBlLGk9dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLmNzc1dpZHRoLHI9ImFiIit0LG87cmV0dXJuIHdpbmRvdy50bltyXS5zY3JlZW5zLmZvckVhY2goKGZ1bmN0aW9uKHQpe2k+PXQmJihvPXQpfSkpLHZvaWQgMD09PW8mJihvPXdpbmRvdy50bltyXS5zY3JlZW5zWzBdKSxvfWZ1bmN0aW9uIHQzOTZfaW5pdFROb2JqX19jcmVhdGVEZWZhdWx0KCl7d2luZG93LnRuPXt9LHdpbmRvdy50bi5hYl9maWVsZHM9WyJoZWlnaHQiLCJ3aWR0aCIsImJnY29sb3IiLCJiZ2ltZyIsImJnYXR0YWNobWVudCIsImJncG9zaXRpb24iLCJmaWx0ZXJvcGFjaXR5IiwiZmlsdGVyY29sb3IiLCJmaWx0ZXJvcGFjaXR5MiIsImZpbHRlcmNvbG9yMiIsImhlaWdodF92aCIsInZhbGlnbiJdfWZ1bmN0aW9uIHQzOTZfaW5pdFROb2JqKHQsZSl7ZSYmKHdpbmRvdy50bnx8dDM5Nl9pbml0VE5vYmpfX2NyZWF0ZURlZmF1bHQoKSx0Mzk2X3NldFNjcmVlbnNUTm9iaih0LGUpKX1mdW5jdGlvbiB0Mzk2X3NldFNjcmVlbnNUTm9iaih0LGUpe3ZhciBpPSJhYiIrdDt3aW5kb3cudG5baV09e30sd2luZG93LnRuW2ldLnNjcmVlbnM9W107dmFyIHI9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtc2NyZWVucyIpO3I/KHI9ci5zcGxpdCgiLCIpKS5mb3JFYWNoKChmdW5jdGlvbih0KXt3aW5kb3cudG5baV0uc2NyZWVucy5wdXNoKHBhcnNlSW50KHQsMTApKX0pKTp3aW5kb3cudG5baV0uc2NyZWVucz1bMzIwLDQ4MCw2NDAsOTYwLDEyMDBdfWZ1bmN0aW9uIHQzOTZfX2dldEF4aXNYUGFkZGluZygpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksZT1Cb29sZWFuKHdpbmRvdy50aWxkYU1lbWJlcnMpfHwiYWxscmVjb3JkcyI9PT13aW5kb3cuemVyb193aW5kb3dfd2lkdGhfaG9vayxpLHI7cmV0dXJuIHQmJmUmJltkb2N1bWVudC5ib2R5LHRdLnJlZHVjZSgoZnVuY3Rpb24odCxlKXt2YXIgaT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5wYWRkaW5nTGVmdCxyPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLnBhZGRpbmdSaWdodDtyZXR1cm4gdCtwYXJzZUludChpLDEwKStwYXJzZUludChyLDEwKX0pLDApfHwwfWZ1bmN0aW9uIHQzOTZfdXBkYXRlVE5vYmoodCl7Zm9yKHZhciBlLGk9dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLndpZHRoLHI9ImFiIit0LG89d2luZG93LnRuW3JdLnNjcmVlbnMuc2xpY2UoKS5yZXZlcnNlKCksbj0wO248by5sZW5ndGg7bisrKXdpbmRvdy50bltyXS5jdXJSZXNvbHV0aW9uPT09b1tuXSYmKHdpbmRvdy50bltyXS5jYW52YXNfbWluX3dpZHRoPW9bbl0sd2luZG93LnRuW3JdLmNhbnZhc19tYXhfd2lkdGg9MD09PW4/aTpvW24tMV0pO3ZhciBhPSJhbGxyZWNvcmRzIj09PXdpbmRvdy56ZXJvX3dpbmRvd193aWR0aF9ob29rO3dpbmRvdy50bltyXS5ncmlkX3dpZHRoPXdpbmRvdy50bltyXS5jYW52YXNfbWluX3dpZHRoO3ZhciBsPShpLXdpbmRvdy50bltyXS5ncmlkX3dpZHRoKS8yO3dpbmRvdy50bltyXS5ncmlkX29mZnNldF9sZWZ0PWw8MCYmYT8wOmx9ZnVuY3Rpb24gdDM5Nl9zd2l0Y2hSZXNvbHV0aW9uKHQsZSl7dmFyIGk9ImFiIit0LHI9d2luZG93LnRuW2ldLnNjcmVlbnNbd2luZG93LnRuW2ldLnNjcmVlbnMubGVuZ3RoLTFdO3dpbmRvdy50bltpXS5jdXJSZXNvbHV0aW9uPWUsd2luZG93LnRuW2ldLmN1clJlc29sdXRpb25fbWF4PXIsd2luZG93LnRuLmN1clJlc29sdXRpb249ZSx3aW5kb3cudG4uY3VyUmVzb2x1dGlvbl9tYXg9cn1mdW5jdGlvbiB0Mzk2X2FydGJvYXJkX2J1aWxkKHQsZSl7dmFyIGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrZSkscj1pP2kucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbDtpZihyKXt0Mzk2X2FiX19yZW5kZXJWaWV3KHIpLHQzOTZfYWxsZ3JvdXBzX19yZW5kZXJWaWV3KHIpO3ZhciBvPXIucXVlcnlTZWxlY3RvckFsbCgiLnRuLWVsZW0iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3ZhciBpO3N3aXRjaCh0LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSl7Y2FzZSJ0ZXh0Ijp0Mzk2X2FkZFRleHQocix0KTticmVhaztjYXNlImltYWdlIjp0Mzk2X2FkZEltYWdlKHIsdCk7YnJlYWs7Y2FzZSJzaGFwZSI6dDM5Nl9hZGRTaGFwZShyLHQpO2JyZWFrO2Nhc2UiYnV0dG9uIjp0Mzk2X2FkZEJ1dHRvbihyLHQpO2JyZWFrO2Nhc2UidmlkZW8iOnQzOTZfYWRkVmlkZW8ocix0KTticmVhaztjYXNlImh0bWwiOnQzOTZfYWRkSHRtbChyLHQpO2JyZWFrO2Nhc2UidG9vbHRpcCI6dDM5Nl9hZGRUb29sdGlwKHIsdCk7YnJlYWs7Y2FzZSJmb3JtIjp0Mzk2X2FkZEZvcm0ocix0LGUpO2JyZWFrO2Nhc2UiZ2FsbGVyeSI6dDM5Nl9hZGRHYWxsZXJ5KHIsdCxlKTticmVhaztjYXNlInZlY3RvciI6dDM5Nl9hZGRWZWN0b3Iocix0KX19KSksci5jbGFzc0xpc3QucmVtb3ZlKCJyZW5kZXJpbmciKSxyLmNsYXNzTGlzdC5hZGQoInJlbmRlcmVkIiksci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgiYXJ0Qm9hcmRSZW5kZXJlZCIse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMH0pKTt2YXIgbj1yLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1vdnJmbHciKTtpZihbInZpc2libGUiLCJ2aXNpYmxlWCJdLmluY2x1ZGVzKG4pJiYodDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoInRTdG9yZUdhbGxlcnlJbml0aWFsaXplZCIsKGZ1bmN0aW9uKCl7dDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKX0pKSksImF1dG8iPT09bil7dmFyIGE9TWF0aC5hYnMoci5vZmZzZXRIZWlnaHQtci5jbGllbnRIZWlnaHQpOzAhPT1hJiYoci5zdHlsZS5wYWRkaW5nQm90dG9tPWErInB4Iil9aWYod2luZG93LnQzOTZfX2lzTW9iaWxlfHx3aW5kb3cudDM5Nl9faXNJUGFkKXt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2wudGV4dENvbnRlbnQ9IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDoxMzY2cHgpIGFuZCAob3JpZW50YXRpb246bGFuZHNjYXBlKSBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzoyKSB7LnQzOTZfX2NhcnJpZXIge2JhY2tncm91bmQtYXR0YWNobWVudDpzY3JvbGwhaW1wb3J0YW50O319IixpLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIixsKX19fWZ1bmN0aW9uIHQzOTZfYWJfX3JlbmRlclZpZXcodCl7aWYodCl7Zm9yKHZhciBlPXdpbmRvdy50bi5hYl9maWVsZHMsaT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLHIsbz0wO288ZS5sZW5ndGg7bysrKXQzOTZfYWJfX3JlbmRlclZpZXdPbmVGaWVsZCh0LGVbb10pO3ZhciBuPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0IiksYT10Mzk2X2FiX19nZXRIZWlnaHQodCksbCxkPXQzOTZfX2dldEN1cnJlbnRTY2FsZUZhY3Rvcih0LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpKSxfPSEhaSYmImVkaXQiPT09aS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpLHM9IndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsInVwc2NhbGUiKSx1LGMsZjtpZihyPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0X3ZoIikscyYmIV8mJnImJih1PXBhcnNlSW50KG4sMTApKmQpLG49PT1hfHx1JiZ1Pj1hKWM9MDtlbHNlIHN3aXRjaCh0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsInZhbGlnbiIpKXtjYXNlInRvcCI6ZGVmYXVsdDpjPTA7YnJlYWs7Y2FzZSJjZW50ZXIiOmM9dT9wYXJzZUZsb2F0KCgoYS11KS8yKS50b0ZpeGVkKDEpKTpwYXJzZUZsb2F0KCgoYS1uKS8yKS50b0ZpeGVkKDEpKTticmVhaztjYXNlImJvdHRvbSI6Yz11P3BhcnNlRmxvYXQoKGEtdSkudG9GaXhlZCgxKSk6cGFyc2VGbG9hdCgoYS1uKS50b0ZpeGVkKDEpKTticmVhaztjYXNlInN0cmV0Y2giOmM9MCxuPWF9dC5zZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWluLW9mZnNldC10b3AiLGMpLHQuc2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1pbi1oZWlnaHQiLG4pLHQuc2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1heC1oZWlnaHQiLGEpO3ZhciBnPXQucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpLHc9dC5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fY2FycmllciIpLHA7aWYocj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsImhlaWdodF92aCIpLHI9cGFyc2VGbG9hdChyKSwod2luZG93LnQzOTZfX2lzTW9iaWxlfHx3aW5kb3cudDM5Nl9faXNJUGFkKSYmcil7dmFyIGg9dDM5Nl9hYl9fZ2V0V2luZG93SGVpZ2h0KHQpKnIvMTAwO3Quc3R5bGUuaGVpZ2h0PWgrInB4IixnJiYoZy5zdHlsZS5oZWlnaHQ9aCsicHgiKSx3JiYody5zdHlsZS5oZWlnaHQ9aCsicHgiKX0iaHVnIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLWhlaWdodG1vZGUiKSYmIXImJih0LnN0eWxlLmhlaWdodD1uKyJweCIsZyYmKGcuc3R5bGUuaGVpZ2h0PW4rInB4IiksdyYmKHcuc3R5bGUuaGVpZ2h0PW4rInB4IikpfX1mdW5jdGlvbiB0Mzk2X19nZXRDdXJyZW50U2NhbGVGYWN0b3IodCl7dmFyIGU9ImFiIit0LGk7cmV0dXJuIHdpbmRvdy50biYmd2luZG93LnRuW2VdJiZ3aW5kb3cudG5bZV0uc2NhbGVGYWN0b3J8fHdpbmRvdy50bl9zY2FsZV9mYWN0b3J9ZnVuY3Rpb24gdDM5Nl9fc2V0U2NhbGVGYWN0b3JGb3JFbGVtZW50cyh0LGUpe3ZhciBpPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpLHI9aT9pLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19hcnRib2FyZCIpOm51bGw7aWYocil7dmFyIG89ci5xdWVyeVNlbGVjdG9yQWxsKCIudDM5Nl9fZWxlbSwgLnRuLWdyb3VwIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0KXt0LnNjYWxlRmFjdG9yPWV9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkVGV4dCh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoaSl7dmFyIHI9InRvcCxsZWZ0LHdpZHRoLGhlaWdodCxjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiO2kuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpfX1mdW5jdGlvbiB0Mzk2X2FkZEltYWdlKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0iaW1nLHdpZHRoLGZpbGV3aWR0aCxmaWxlaGVpZ2h0LHRvcCxsZWZ0LGNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyI7aS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSk7dmFyIG89aS5xdWVyeVNlbGVjdG9yKCJpbWciKTtvJiYoby5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXtkb2N1bWVudC5jb250YWlucyhvKSYmKHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpLG8uc3JjJiZzZXRUaW1lb3V0KChmdW5jdGlvbigpe2RvY3VtZW50LmNvbnRhaW5zKG8pJiYodDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwidG9wIiksdDM5Nl9fdXBkYXRlQXV0b0hlaWdodCh0KSl9KSwyZTMpKX0pKSxvLmNvbXBsZXRlJiYodDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwidG9wIiksby5zcmMmJnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZG9jdW1lbnQuY29udGFpbnMobykmJih0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKSx0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KHQpKX0pLDJlMykpLG8uYWRkRXZlbnRMaXN0ZW5lcigidHV3aWRnZXRfZG9uZSIsKGZ1bmN0aW9uKCl7dDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwidG9wIil9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Mzk2X2NoYW5nZUZpbHRlck9uU2FmYXJpKGkpfSkpKX19ZnVuY3Rpb24gdDM5Nl9hZGRTaGFwZSh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoaSl7dmFyIHI9IndpZHRoLGhlaWdodCx0b3AsbGVmdCwiO3IrPSJjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxoZWlnaHR1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiLGkuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpfX1mdW5jdGlvbiB0Mzk2X2NoYW5nZUZpbHRlck9uU2FmYXJpKHQpe3ZhciBlO2lmKC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJih0Mzk2X19jaGVja0NvbnRhaW5CYWNrZHJvcEZpbHRlcih0KSYmIkludGVyc2VjdGlvbk9ic2VydmVyImluIHdpbmRvdykpe3ZhciBpPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKSxyO25ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24oZSxpKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKGUuaXNJbnRlcnNlY3Rpbmcpe3ZhciByPWUudGFyZ2V0O2kudW5vYnNlcnZlKHIpLHQzOTZfX3Byb2Nlc3NCYWNrZHJvcEZpbHRlck9uSW1hZ2UodCl9fSkpfSkpLm9ic2VydmUoaSl9fWZ1bmN0aW9uIHQzOTZfX2NoZWNrQ29udGFpbkJhY2tkcm9wRmlsdGVyKHQpe2lmKCF0KXJldHVybiExO3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLndlYmtpdEJhY2tkcm9wRmlsdGVyO2lmKGUmJiJub25lIiE9PWUpcmV0dXJuITA7dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciwgLnRuLWF0b21fX3ByeC13cmFwcGVyLCAudG4tYXRvbV9fc3RpY2t5LXdyYXBwZXIiKTtpZighaSlyZXR1cm4hMTt2YXIgcj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpKS53ZWJraXRCYWNrZHJvcEZpbHRlcjtyZXR1cm4gciYmIm5vbmUiIT09cn1mdW5jdGlvbiB0Mzk2X19wcm9jZXNzQmFja2Ryb3BGaWx0ZXJPbkltYWdlKHQpe2lmKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLW9wdHMiKSxpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtcHJ4Iil8fHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtZml4Iikscj1lfHxpLG89dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2VsZW0tLWJhY2tkcm9wLWZpbHRlci1pbWctd3JhcHBlcmVkIik7ciYmb3x8IXI/dDM5Nl9fdXBkYXRlQmFja2Ryb3BGaWx0ZXJPbkltYWdlKHQpOnQuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2Ryb3BGaWx0ZXJJbWdXcmFwcGVyZWQiLChmdW5jdGlvbigpe3QzOTZfX3VwZGF0ZUJhY2tkcm9wRmlsdGVyT25JbWFnZSh0KX0pKX19ZnVuY3Rpb24gdDM5Nl9fdXBkYXRlQmFja2Ryb3BGaWx0ZXJPbkltYWdlKHQpe2lmKHQpe3ZhciBlPXQsaT1lLnF1ZXJ5U2VsZWN0b3IoImltZyIpLHI9ZS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciwgLnRuLWF0b21fX3ByeC13cmFwcGVyLCAudG4tYXRvbV9fc3RpY2t5LXdyYXBwZXIiKSxvPSIiO3ImJihlPXIsbz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS53ZWJraXRCYWNrZHJvcEZpbHRlcnx8IiIpLGUuc3R5bGUud2Via2l0QmFja2Ryb3BGaWx0ZXI9Im5vbmUiLHQzOTZfd2FpdEZvclVwbG9hZEltZyhpLChmdW5jdGlvbigpe2Uuc3R5bGUud2Via2l0QmFja2Ryb3BGaWx0ZXI9b30pKX19ZnVuY3Rpb24gdDM5Nl93YWl0Rm9yVXBsb2FkSW1nKHQsZSl7aWYoInkiPT09d2luZG93LmxhenkpdmFyIGk9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0LmNsYXNzTGlzdC5jb250YWlucygibG9hZGVkIikmJnQuY2xpZW50V2lkdGgmJnQuc3JjPyhlKCksY2xlYXJUaW1lb3V0KGkpKTp0Mzk2X3dhaXRGb3JVcGxvYWRJbWcodCxlKX0pLDMwMCk7ZWxzZSBlKCl9ZnVuY3Rpb24gdDM5Nl9hZGRCdXR0b24odCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKCFpKXJldHVybiBudWxsO3ZhciByPSJ0b3AsbGVmdCx3aWR0aCxoZWlnaHQsY29udGFpbmVyLGF4aXN4LGF4aXN5LGNhcHRpb24sbGVmdHVuaXRzLHRvcHVuaXRzIjtyZXR1cm4gaS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSksaX1mdW5jdGlvbiB0Mzk2X2FkZFZpZGVvKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0id2lkdGgsaGVpZ2h0LHRvcCxsZWZ0LCI7cis9ImNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGhlaWdodHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyIsaS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSksdF9vbkZ1bmNMb2FkKCJ0Mzk2X2luaXRWaWRlbyIsKGZ1bmN0aW9uKCl7dDM5Nl9pbml0VmlkZW8oaSl9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkSHRtbCh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoaSl7dmFyIHI9IndpZHRoLGhlaWdodCx0b3AsbGVmdCwiO3IrPSJjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxoZWlnaHR1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiLGkuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpfX1mdW5jdGlvbiB0Mzk2X2FkZFRvb2x0aXAodCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKGkpe3ZhciByPSJ3aWR0aCxoZWlnaHQsdG9wLGxlZnQsIjtyKz0iY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsaGVpZ2h0dW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzLHRpcHBvc2l0aW9uIixpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKSx0X29uRnVuY0xvYWQoInQzOTZfaW5pdFRvb2x0aXAiLChmdW5jdGlvbigpe3QzOTZfaW5pdFRvb2x0aXAoaSl9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkRm9ybSh0LGUsaSl7dmFyIHI9dDM5Nl9nZXRFbChlKTtpZihyKXt2YXIgbz0id2lkdGgsdG9wLGxlZnQsIjtvKz0iaW5wdXRzLGNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyIsci5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixvKTt2YXIgbj10Mzk2X2VsZW1fX2dldEZvcm1JbnB1dHNWYWx1ZShyKSxhPXIuZ2V0QXR0cmlidXRlKCJkYXRhLWZlLWVsZW0taWQiKXx8ci5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpO3Rfb25GdW5jTG9hZCgidF96ZXJvRm9ybXNfX2luaXQiLChmdW5jdGlvbigpe3QzOTZfZWxlbV9fcmVuZGVyVmlldyhyKSx0X3plcm9Gb3Jtc19faW5pdChpLGEsbiksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KHIpfSkpfX1mdW5jdGlvbiB0Mzk2X2FkZEdhbGxlcnkodCxlLGkpe3ZhciByPXQzOTZfZ2V0RWwoZSk7aWYocil7dmFyIG89IndpZHRoLGhlaWdodCx0b3AsbGVmdCwiO28rPSJpbWdzLGNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGhlaWdodHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyIsci5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixvKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcocik7dmFyIG49ci5nZXRBdHRyaWJ1dGUoImRhdGEtZmUtZWxlbS1pZCIpfHxyLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIik7dF9vbkZ1bmNMb2FkKCJ0X3plcm9HYWxsZXJ5X19pbml0IiwoZnVuY3Rpb24oKXt0X3plcm9HYWxsZXJ5X19pbml0KGksbil9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkVmVjdG9yKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0id2lkdGgsZmlsZXdpZHRoLGZpbGVoZWlnaHQsdG9wLGxlZnQsY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIjtpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKX19ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbCh0KTtpZighaSlyZXR1cm4gbnVsbDtpZihpLmNsYXNzTGlzdC5jb250YWlucygidG4tZ3JvdXAiKSlyZXR1cm4gdDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZShpLGUpO3ZhciByPWkuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIiksbz1yLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG49ImFiIitvLGE7dm9pZCAwPT09d2luZG93LnRuW25dJiYodDM5Nl9pbml0VE5vYmoobyxyKSx0Mzk2X3N3aXRjaFJlc29sdXRpb24obyx0Mzk2X2RldGVjdFJlc29sdXRpb24obykpKTt2YXIgbD13aW5kb3cudG5bbl0uY3VyUmVzb2x1dGlvbixkPXdpbmRvdy50bltuXS5jdXJSZXNvbHV0aW9uX21heCxfPXdpbmRvdy50bltuXS5zY3JlZW5zLHM7aWYoIShzPWw9PT1kP2kuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLSIrZSsiLXZhbHVlIik6aS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtIitlKyItcmVzLSIrbCsiLXZhbHVlIikpJiYiIiE9PXMpZm9yKHZhciB1PTA7dTxfLmxlbmd0aDt1Kyspe3ZhciBjPV9bdV07aWYoIShjPD1sKSYmKHM9Yz09PWQ/aS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtIitlKyItdmFsdWUiKTppLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC0iK2UrIi1yZXMtIitjKyItdmFsdWUiKSkpYnJlYWt9dmFyIGY9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihzKTtyZXR1cm4gZiYmKHM9Zi5mYWxsYmFjayksc31mdW5jdGlvbiB0Mzk2X2VsZW1fX3JlbmRlclZpZXcodCl7dmFyIGU9dDM5Nl9nZXRFbCh0KSxpPWU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIik6IiI7aSYmKGk9aS5zcGxpdCgiLCIpKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChlLHQpfSkpfWZ1bmN0aW9uIHQzOTZfZ3JvdXBfX3JlbmRlclZpZXcodCl7dmFyIGU9dD90LmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiKToiIjtlJiYoZT1lLnNwbGl0KCIsIikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBpPXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCxlKTtzd2l0Y2goZSl7Y2FzZSJsZWZ0IjppPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZSh0LGUsaSksdC5zdHlsZS5sZWZ0PXBhcnNlRmxvYXQoaSkudG9GaXhlZCgxKSsicHgiO2JyZWFrO2Nhc2UidG9wIjppPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZSh0LGUsaSksdC5zdHlsZS50b3A9cGFyc2VGbG9hdChpKS50b0ZpeGVkKDEpKyJweCI7YnJlYWs7Y2FzZSJjb250YWluZXIiOnQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKHQsImxlZnQiKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZCh0LCJ0b3AiKX19KSl9ZnVuY3Rpb24gdDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQodCxlKXt2YXIgaT10Mzk2X2dldEVsKHQpO2lmKGkpe3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksbz1yP3IuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKToiIixuLGE9IndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKGkuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIiksInVwc2NhbGUiKTtpZigieWVzIiE9PWkuZ2V0QXR0cmlidXRlKCJkYXRhLXNjYWxlLW9mZiIpfHwhYXx8ImVkaXQiPT09byl7dmFyIGw9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksZSksZCxfPVsiZmlsbCIsImh1ZyJdLHM9dDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbShpKTtzd2l0Y2goZSl7Y2FzZSJsZWZ0IjpsPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShpLGUsbCksbD1zP3QzOTZfX3pvb21pZnlWYWx1ZShpLGwpOnBhcnNlRmxvYXQobCkudG9GaXhlZCgxKSsicHgiLGkuc3R5bGUubGVmdD1sO2JyZWFrO2Nhc2UidG9wIjpsPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShpLGUsbCksbD1zP3QzOTZfX3pvb21pZnlWYWx1ZShpLGwpOnBhcnNlRmxvYXQobCkudG9GaXhlZCgxKSsicHgiLGkuc3R5bGUudG9wPWw7YnJlYWs7Y2FzZSJ3aWR0aCI6ZD1pLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTt2YXIgdT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwid2lkdGhtb2RlIiksYztpZigoYz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwidGV4dGZpdCIpKXx8KCJidXR0b24iPT09ZD9jPSJmaXhlZHNpemUiOiJ0ZXh0Ij09PWQmJihjPSJhdXRvaGVpZ2h0IikpLCgidGV4dCI9PT1kfHwiYnV0dG9uIj09PWQpJiYiYXV0b3dpZHRoIj09PWMpcmV0dXJuIHZvaWQoaS5zdHlsZS53aWR0aD0iYXV0byIpO2lmKF8uaW5jbHVkZXModSkpcmV0dXJuIHZvaWQoaS5zdHlsZS53aWR0aD0iIik7c3dpdGNoKGw9dDM5Nl9lbGVtX19nZXRXaWR0aChpLGwpLGkuc3R5bGUud2lkdGg9cGFyc2VGbG9hdChsKS50b0ZpeGVkKDEpKyJweCIsZCl7Y2FzZSJ0b29sdGlwIjp2YXIgZj1pLnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1hdG9tX19waW4taWNvbiIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZiwoZnVuY3Rpb24odCl7dmFyIGU9cGFyc2VGbG9hdChsKS50b0ZpeGVkKDEpKyJweCI7dC5zdHlsZS53aWR0aD1lLHQuc3R5bGUuaGVpZ2h0PWV9KSksaS5zdHlsZS5oZWlnaHQ9cGFyc2VJbnQobCkudG9GaXhlZCgxKSsicHgiO2JyZWFrO2Nhc2UiZ2FsbGVyeSI6dDM5Nl9lbGVtX19zZXRHYWxsZXJ5U2l6ZShpLCJ3aWR0aCIsbCl9YnJlYWs7Y2FzZSJoZWlnaHQiOmQ9aS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7dmFyIGc9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksImhlaWdodG1vZGUiKSxjO2lmKChjPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ0ZXh0Zml0IikpfHwoImJ1dHRvbiI9PT1kP2M9ImZpeGVkc2l6ZSI6InRleHQiPT09ZCYmKGM9ImF1dG9oZWlnaHQiKSksKCJ0ZXh0Ij09PWR8fCJidXR0b24iPT09ZCkmJlsiYXV0b3dpZHRoIiwiYXV0b2hlaWdodCIsInNpbmdsZWxpbmUiXS5pbmNsdWRlcyhjKSlyZXR1cm4gdm9pZChpLnN0eWxlLmhlaWdodD0iYXV0byIpO2lmKF8uaW5jbHVkZXMoZykmJiJ0b29sdGlwIiE9PWQpcmV0dXJuIHZvaWQoaS5zdHlsZS5oZWlnaHQ9IiIpO2lmKCJ0b29sdGlwIj09PWQpcmV0dXJuO2w9dDM5Nl9lbGVtX19nZXRIZWlnaHQoaSxsKSxpLnN0eWxlLmhlaWdodD1wYXJzZUZsb2F0KGwpLnRvRml4ZWQoMSkrInB4IiwiZ2FsbGVyeSI9PT1kJiZ0Mzk2X2VsZW1fX3NldEdhbGxlcnlTaXplKGksImhlaWdodCIsbCk7YnJlYWs7Y2FzZSJjb250YWluZXIiOnQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksImxlZnQiKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKTticmVhaztjYXNlImlucHV0cyI6dHJ5e2w9dDM5Nl9lbGVtX19nZXRGb3JtSW5wdXRzVmFsdWUoaSksd2luZG93LnRfemVyb0Zvcm1zX19yZW5kZXJGb3JtKGksbCl9Y2F0Y2godyl7fX0id2lkdGgiIT09ZSYmImhlaWdodCIhPT1lJiYiZm9udHNpemUiIT09ZSYmImZvbnRmYW1pbHkiIT09ZSYmImxldHRlcnNwYWNpbmciIT09ZSYmImZvbnR3ZWlnaHQiIT09ZSYmImltZyIhPT1lfHwodDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwibGVmdCIpLHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpKX19fWZ1bmN0aW9uIHQzOTZfZWxlbV9fc2V0R2FsbGVyeVNpemUodCxlLGkpe3ZhciByPWksbz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodCwiYm9yZGVyd2lkdGgiKSxuPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSh0LCJib3JkZXJzdHlsZSIpO24mJm8mJiJub25lIiE9PW58fChvPTApLHItPTIqbzt2YXIgYT1NYXRoLnJvdW5kKHBhcnNlRmxvYXQocikpKyJweCI7YT0id2lkdGgiPT09ZXx8ImhlaWdodCI9PT1lP3QzOTZfX3pvb21pZnlWYWx1ZSh0LGEse3JvdW5kOiEwfSk6dDM5Nl9fem9vbWlmeVZhbHVlKHQsYSk7dmFyIGw9dC5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19tYWluIiksZD10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1hdG9tX19zbGRzLWltZyIpO3Quc3R5bGVbZV09YSxsJiYobC5zdHlsZVtlXT1hKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQsKGZ1bmN0aW9uKHQpe3Quc3R5bGVbZV09YX0pKX1mdW5jdGlvbiB0Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUodCxlLGkpe3ZhciByPXQzOTZfZ2V0RWwodCk7aWYoIXIpcmV0dXJuIG51bGw7dmFyIG89ci5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSxuPW8uZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksYT0iYWIiK24sbD10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKG8sInZhbGlnbiIpLGQ9IndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKG8sInVwc2NhbGUiKSxfPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikscyx1PSJlZGl0Ij09PShfP18uZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKToiIiksYz10Mzk2X2lzT25seVNjYWxhYmxlQnJvd3NlcigpLGY9IXUmJmQmJmMsZz0hdSYmZCYmIWMsdz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUociwiYXhpc3kiKSxwPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShyLCJheGlzeCIpLGg9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHIsImNvbnRhaW5lciIpLG09ci5jbGFzc0xpc3QuY29udGFpbnMoInRuLWdyb3VwIikmJiJwaHlzaWNhbCI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKHIsInR5cGUiKSxiPXIucGFyZW50Tm9kZS5jbG9zZXN0KCIudG4tZ3JvdXAiKSx2PSJwaHlzaWNhbCI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGIsInR5cGUiKTttJiYoaD1ofHwiZ3JpZCIpO3ZhciB5PXBhcnNlSW50KGkpLEYsQSxTLHgsVixFLEksaz10Mzk2X19nZXRDdXJyZW50U2NhbGVGYWN0b3Iobik7c3dpdGNoKGUpe2Nhc2UibGVmdCI6dmFyIHosTD10Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKCkud2lkdGgsQjtpZihGPSJncmlkIj09PWg/ImdyaWQiOiJ3aW5kb3ciLEE9ImdyaWQiPT09aD93aW5kb3cudG5bYV0uZ3JpZF9vZmZzZXRfbGVmdDowLFY9ImdyaWQiPT09aD93aW5kb3cudG5bYV0uZ3JpZF93aWR0aDpMLCIlIj09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShyLCJsZWZ0dW5pdHMiKSYmKHk9dDM5Nl9yb3VuZEZsb2F0KFYqeS8xMDApKSx2KXt2YXIgTz1wYXJzZUludCh0Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGIsImxlZnQiKSwxMCkscTsiJSI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGIsImxlZnR1bml0cyIpJiYoTz10Mzk2X3JvdW5kRmxvYXQoVipPLzEwMCkpLHktPU87YnJlYWt9IXUmJmQ/ImdyaWQiPT09aCYmYyYmKHkqPWspOnk9QSt5LCJjZW50ZXIiPT09cCYmKHg9dDM5Nl9lbGVtX19nZXRXaWR0aChyKSxmJiYid2luZG93IiE9PUYmJihWKj1rLHgqPWspLHk9Vi8yLXgvMit5KSwicmlnaHQiPT09cCYmKHg9dDM5Nl9lbGVtX19nZXRXaWR0aChyKSxmJiYid2luZG93IiE9PUYmJihWKj1rLHgqPWspLHk9Vi14K3kpLGYmJiJ3aW5kb3ciIT09RiYmKHkrPSgoeD10Mzk2X2VsZW1fX2dldFdpZHRoKHIpKSprLXgpLzIpO2JyZWFrO2Nhc2UidG9wIjp2YXIgUj1yLmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLFQ9Uj9SLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1wcm94eS1taW4tb2Zmc2V0LXRvcCIpOiIwIixXPVI/Ui5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWluLWhlaWdodCIpOiIwIixIPVI/Ui5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWF4LWhlaWdodCIpOiIwIixDPWZ1bmN0aW9uIHQoZSl7dmFyIGk9dDM5Nl9lbGVtX19nZXRIZWlnaHQoZSk7aWYoZSYmImltYWdlIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpKXt2YXIgcj10Mzk2X2VsZW1fX2dldFdpZHRoKGUpLG89dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUsImZpbGV3aWR0aCIpLG49dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUsImZpbGVoZWlnaHQiKSxhO2lmKG8mJm4paT1yLyhwYXJzZUludChvKS9wYXJzZUludChuKSl9cmV0dXJuIGl9LFA7aWYoRj0iZ3JpZCI9PT1oPyJncmlkIjoid2luZG93IixTPSJncmlkIj09PWg/cGFyc2VGbG9hdChUKTowLEk9ImdyaWQiPT09aD9wYXJzZUZsb2F0KFcpOnBhcnNlRmxvYXQoSCksIiUiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHIsInRvcHVuaXRzIikmJih5PUkqKHkvMTAwKSksdil7dmFyIE09cGFyc2VJbnQodDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZShiLCJ0b3AiKSwxMCksTjsiJSI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGIsInRvcHVuaXRzIikmJihNPXQzOTZfcm91bmRGbG9hdChJKk0vMTAwKSkseS09TTticmVha31mJiYid2luZG93IiE9PUYmJih5Kj1rKSxnJiYid2luZG93IiE9PUYmJihTPSJzdHJldGNoIj09PWw/MDpTL2spLHk9Uyt5O3ZhciBEPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoUiwiaGVpZ2h0X3ZoIiksaj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKFIsImhlaWdodCIpLEc9dDM5Nl9hYl9fZ2V0SGVpZ2h0KFIpLFo7aWYoZCYmIXUmJkQmJihaPXBhcnNlSW50KGosMTApKmspLCJjZW50ZXIiPT09dyYmKEU9QyhyKSxmJiYid2luZG93IiE9PUYmJigic3RyZXRjaCIhPT1sP0kqPWs6ST1aP1o+Rz9aOkc6Ui5jbGllbnRIZWlnaHQsRSo9ayksdXx8IWR8fGN8fCJ3aW5kb3ciPT09Rnx8InN0cmV0Y2giIT09bHx8KEk9Wj9aPkc/WjpHOlIuY2xpZW50SGVpZ2h0LEkvPWspLHk9SS8yLUUvMit5KSwiYm90dG9tIj09PXcmJihFPUMociksZiYmIndpbmRvdyIhPT1GJiYoInN0cmV0Y2giIT09bD9JKj1rOkk9Wj9aPkc/WjpHOlIuY2xpZW50SGVpZ2h0LEUqPWspLHV8fCFkfHxjfHwid2luZG93Ij09PUZ8fCJzdHJldGNoIiE9PWx8fChJPVo/Wj5HP1o6RzpSLmNsaWVudEhlaWdodCxJLz1rKSx5PUktRSt5KSxmJiYid2luZG93IiE9PUYpe3ZhciBVPSgoRT1DKHIpKSprLUUpLzI7eSs9VT1NYXRoLnJvdW5kKFUpfX1yZXR1cm4geX1mdW5jdGlvbiB0Mzk2X2VsZW1fZmluZEZpcnN0TGV2ZWxQYXJlbnRHcm91cCh0KXtmb3IodmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtlOyl7dmFyIGk9ZS5wYXJlbnRFbGVtZW50LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO2lmKCFpKWJyZWFrO2U9aX1yZXR1cm4gZX1mdW5jdGlvbiB0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGkscj10LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG89ImFiIityLG47dm9pZCAwPT09d2luZG93LnRuW29dJiYodDM5Nl9pbml0VE5vYmoocix0KSx0Mzk2X3N3aXRjaFJlc29sdXRpb24ocix0Mzk2X2RldGVjdFJlc29sdXRpb24ocikpKTt2YXIgYT13aW5kb3cudG5bb10uY3VyUmVzb2x1dGlvbixsPXdpbmRvdy50bltvXS5jdXJSZXNvbHV0aW9uX21heCxkPXdpbmRvdy50bltvXS5zY3JlZW5zO2lmKG51bGw9PT0oaT1hPT09bD90LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC0iK2UpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLSIrZSsiLXJlcy0iK2EpKSlmb3IodmFyIF89MDtfPGQubGVuZ3RoO18rKyl7dmFyIHM9ZFtfXTtpZighKHM8PWEpJiZudWxsIT09KGk9cz09PWw/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtIitlKTp0LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC0iK2UrIi1yZXMtIitzKSkpYnJlYWt9dmFyIHU9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihpKTtyZXR1cm4gdSYmKGk9dS5mYWxsYmFjayksaX1mdW5jdGlvbiB0Mzk2X2FiX19yZW5kZXJWaWV3T25lRmllbGQodCxlKXt0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsZSl9ZnVuY3Rpb24gdDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHQsZSl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIik/dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsZSk6dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZSh0LGUpfWZ1bmN0aW9uIHQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCxlKXtpZighdClyZXR1cm4gbnVsbDt2YXIgaSxyLG89ImFiIit0LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG49d2luZG93LnRuW29dLmN1clJlc29sdXRpb24sYT13aW5kb3cudG5bb10uY3VyUmVzb2x1dGlvbl9tYXgsbD13aW5kb3cudG5bb10uc2NyZWVucyxkPVsid2lkdGhtb2RlIiwiaGVpZ2h0bW9kZSIsImZsZXgiXS5pbmNsdWRlcyhlKT8iIjoiLXZhbHVlIjtpZihudWxsPT09KGk9bj09PWE/dC5nZXRBdHRyaWJ1dGUoImRhdGEtZ3JvdXAtIitlK2QpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWdyb3VwLSIrZSsiLXJlcy0iK24rZCkpKWZvcih2YXIgXz0wO188bC5sZW5ndGg7XysrKXt2YXIgcz1sW19dO2lmKCEoczw9bikmJm51bGwhPT0oaT1zPT09YT90LmdldEF0dHJpYnV0ZSgiZGF0YS1ncm91cC0iK2UrZCk6dC5nZXRBdHRyaWJ1dGUoImRhdGEtZ3JvdXAtIitlKyItcmVzLSIrcytkKSkpYnJlYWt9dmFyIHU9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihpKTtyZXR1cm4gdSYmKGk9dS5mYWxsYmFjayksaX1mdW5jdGlvbiB0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyh0KXtpZih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1ncm91cCIpLGk9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGUsKGZ1bmN0aW9uKHQpe3JldHVybiJwaHlzaWNhbCI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKHQsInR5cGUiKX0pKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3QzOTZfZ3JvdXBfX3JlbmRlclZpZXcodCksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXdBdXRvbGF5b3V0KHQpfSkpfX1mdW5jdGlvbiB0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlld0F1dG9sYXlvdXQodCl7aWYodCYmdC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2dyb3VwLWZsZXgiKSl7dmFyIGU9dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZSh0LCJ3aWR0aG1vZGUiKSxpPXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0bW9kZSIpOyJmaWxsIj09PWU/KHQuc3R5bGUud2lkdGg9IjEwMCUiLHQuc3R5bGUuZmxleFNocmluaz0iMSIpOih0LnN0eWxlLndpZHRoPSJodWciPT09ZT8ibWluLWNvbnRlbnQiOiIiLHQuc3R5bGUuaGVpZ2h0PSJodWciPT09aT8iaW5pdGlhbCI6IiIsdC5zdHlsZS5mbGV4U2hyaW5rPSIiKX19ZnVuY3Rpb24gdDM5Nl9hbGxlbGVtc19fcmVuZGVyVmlldyh0KXtpZih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1lbGVtIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt0Mzk2X2VsZW1fX3JlbmRlclZpZXcodCl9KSl9fWZ1bmN0aW9uIHQzOTZfYWJfX2dldEhlaWdodCh0LGUpe3ZhciBpPWU7aXx8KGk9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJoZWlnaHQiKSksaT1wYXJzZUZsb2F0KGkpO3ZhciByPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0X3ZoIik7aWYociYmKHI9cGFyc2VGbG9hdChyKSwhaXNOYU4ocikpKXt2YXIgbz10Mzk2X2FiX19nZXRXaW5kb3dIZWlnaHQodCkqci8xMDA7aTxvJiYoaT1vKX1yZXR1cm4gaX1mdW5jdGlvbiB0Mzk2X2VsZW1fX2dldFdpZHRoKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbCh0KSxyLG8sbj0iYWIiK2kuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIikuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksYT1lLGwsZCxfLHM7KGF8fChhPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ3aWR0aCIpKSxhPXBhcnNlRmxvYXQoYSksIiUiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksIndpZHRodW5pdHMiKSkmJihhPSJ3aW5kb3ciPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksImNvbnRhaW5lciIpP3QzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aCphLzEwMDp3aW5kb3cudG5bbl0uZ3JpZF93aWR0aCphLzEwMCk7cmV0dXJuIGF9ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRIZWlnaHQodCxlKXt2YXIgaT10Mzk2X2dldEVsKHQpLHI9ZTtyfHwocj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwiaGVpZ2h0IikpLHI9cGFyc2VGbG9hdChyKTt2YXIgbz1pLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSxuPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ0ZXh0Zml0IiksYTtpZihufHwoImJ1dHRvbiI9PT1vP249ImZpeGVkc2l6ZSI6InRleHQiPT09byYmKG49ImF1dG9oZWlnaHQiKSksInNoYXBlIj09PW98fCJ2aWRlbyI9PT1vfHwiaHRtbCI9PT1vfHwiZ2FsbGVyeSI9PT1vfHwoInRleHQiPT09b3x8ImJ1dHRvbiI9PT1vKSYmImZpeGVkc2l6ZSI9PT1uKXt2YXIgbDtpZigiJSI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwiaGVpZ2h0dW5pdHMiKSl7dmFyIGQ9aS5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSxfPWQ/ZC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWluLWhlaWdodCIpOiIwIixzPWQ/ZC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWF4LWhlaWdodCIpOiIwIix1PXBhcnNlRmxvYXQoXyksYz1wYXJzZUZsb2F0KHMpLGY7cj0id2luZG93Ij09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJjb250YWluZXIiKT9jKihyLzEwMCk6dSooci8xMDApfXJldHVybiByfWlmKCJ0ZXh0Ij09PW8pe3ZhciBnPWkucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTtnJiYoZy5zdHlsZS5saW5lSGVpZ2h0PSIiKX1yZXR1cm4gaS5jbGllbnRIZWlnaHR9ZnVuY3Rpb24gdDM5Nl9yb3VuZEZsb2F0KHQpe3JldHVybiBNYXRoLnJvdW5kKDEwMCp0KS8xMDB9ZnVuY3Rpb24gdDM5Nl9yZW1vdmVFbGVtZW50RnJvbURPTSh0KXt2YXIgZT10Mzk2X2dldEVsKHQpO2UmJmUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfWZ1bmN0aW9uIHQzOTZfZ2V0RWwodCl7cmV0dXJuIHdpbmRvdy5qUXVlcnkmJnQgaW5zdGFuY2VvZiBqUXVlcnk/dC5sZW5ndGg/dC5nZXQoMCk6bnVsbDp0fWZ1bmN0aW9uIHQzOTZfX2dldEJsb2NrRWRpdG9yV2lkdGgoKXtpZighd2luZG93LnRuLmlzRWRpdE1vZGUpcmV0dXJuIDA7dmFyIHQsZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCItLXBhZ2Utdmlldy13aWR0aCIpO3JldHVybiBlJiYiMTAwJSIhPT1lP3BhcnNlSW50KGUsMTApOjB9ZnVuY3Rpb24gdDM5Nl9faXNBbGxaZXJvQmxvY2tzUmVuZGVyZWQodCxlKXt2b2lkIDA9PT1lJiYoZT0wKTt2YXIgaT10Mzk2X19nZXRaZXJvQmxvY2tzKCkscj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLG89ciYmImVkaXQiPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpLG49InJlYWR5Ij09PWRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCJkYXRhLXJlYWR5LXN0YXR1cyIpLGE9ITE7aWYoaS5sZW5ndGh8fCFvfHxuKXtpZighaS5sZW5ndGgmJm8mJm4pcmV0dXJuIGU+MzA/dm9pZCB0KCk6dm9pZCBzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfX2lzQWxsWmVyb0Jsb2Nrc1JlbmRlcmVkKHQsZSsxKX0pLDEwMCk7dmFyIGw9aS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmFydGJvYXJkfSkpLGQ7aWYobC5sZW5ndGg+MCYmbC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpKXQoKTtlbHNle3ZhciBfPWwuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoInJlbmRlcmVkIil9KSk7bC5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmNsYXNzTGlzdC5jb250YWlucygicmVuZGVyZWQiKXx8ZS5hZGRFdmVudExpc3RlbmVyKCJhcnRCb2FyZFJlbmRlcmVkIiwoZnVuY3Rpb24oKXtfLnB1c2goZSksXy5sZW5ndGghPT1sLmxlbmd0aHx8YXx8dCgpfSkpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7YT0hMCxfLmxlbmd0aCE9PWwubGVuZ3RoJiZ0KCl9KSwzZTMpfX1lbHNle3ZhciBzPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbihlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyJyZWFkeSI9PT1lLnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEtcmVhZHktc3RhdHVzIikmJihzLmRpc2Nvbm5lY3QoKSx0Mzk2X19pc0FsbFplcm9CbG9ja3NSZW5kZXJlZCh0KSl9KSl9KSk7cy5vYnNlcnZlKGRvY3VtZW50LmJvZHkse2F0dHJpYnV0ZXM6ITAsYXR0cmlidXRlRmlsdGVyOlsiZGF0YS1yZWFkeS1zdGF0dXMiXX0pfX1mdW5jdGlvbiB0Mzk2X19wcm9jZXNzRWxlbWVudHNUcmFuc2Zvcm0odCl7dmFyIGU9dDM5Nl9faW5pdEZhc3RET00oKSxpPVtdO2UucmVhZCgoZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO2lmKCJ0ZXh0Ij09PWV8fCJpbWFnZSI9PT1lfHwic2hhcGUiPT09ZXx8ImJ1dHRvbiI9PT1lfHwidmVjdG9yIj09PWUpe3ZhciByPWdldENvbXB1dGVkU3R5bGUodCksbz1yLmJhY2tkcm9wRmlsdGVyJiYibm9uZSIhPT1yLmJhY2tkcm9wRmlsdGVyfHxyLndlYmtpdEJhY2tkcm9wRmlsdGVyJiYibm9uZSIhPT1yLndlYmtpdEJhY2tkcm9wRmlsdGVyLG49dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdHlsZSIpO2lmKG8mJiFuKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIiksbD1hP3dpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnRyYW5zZm9ybToibm9uZSI7Im1hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKSI9PT1sJiYobD0ibm9uZSIpLCJub25lIiE9PWwmJmkucHVzaCh7ZWxlbWVudDp0LGF0b206YSxhdG9tVHJhbnNmb3JtOmx9KX19fSkpfSkpLGUud3JpdGUoKGZ1bmN0aW9uKCl7aS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmF0b20uc3R5bGUudHJhbnNmb3JtPSJub25lIix0LmVsZW1lbnQuc3R5bGUudHJhbnNmb3JtPXQuYXRvbVRyYW5zZm9ybX0pKX0pKX1mdW5jdGlvbiB0Mzk2X19maXhFbGVtZW50c0xpbmVIZWlnaHRzKHQpe3ZhciBlPXQzOTZfX2luaXRGYXN0RE9NKCksaT1bXTtlLnJlYWQoKGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZTtpZigidGV4dCI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSl7dmFyIHI9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbSIpO2lmKHImJiF0Mzk2X19pc0luc2lkZUdyb3VwV2l0aFpvb20odCkpe3ZhciBvPXQuc3R5bGUuem9vbSxuPXIuc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3QsYT1yLnN0eWxlLmZvbnRTaXplO2kucHVzaCh7ZWxlbWVudDp0LGF0b206cix6b29tOm8sdGV4dFNpemVBZGp1c3Q6bixmb250U2l6ZTphfSl9fX0pKX0pKSxlLndyaXRlKChmdW5jdGlvbigpe2kuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5hdG9tLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJsaW5lLWhlaWdodCIpLHdpbmRvdy50Mzk2X19pc1NhZmFyaSYmdC56b29tJiYodC5hdG9tLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PSJub25lIix0LmF0b20uc3R5bGUuZm9udFNpemU9IiIsdC5lbGVtZW50LnN0eWxlLnpvb209IiIpfSkpfSkpLGUucmVhZCgoZnVuY3Rpb24oKXtpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY29tcHV0ZWRMaW5lSGVpZ2h0PXBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodC5hdG9tKS5saW5lSGVpZ2h0KX0pKX0pKSxlLndyaXRlKChmdW5jdGlvbigpe2kuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5jb21wdXRlZExpbmVIZWlnaHQ7d2luZG93LnQzOTZfX2lzU2FmYXJpJiZ0Lnpvb20mJih0LmF0b20uc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3Q9dC50ZXh0U2l6ZUFkanVzdCx0LmF0b20uc3R5bGUuZm9udFNpemU9dC5mb250U2l6ZSx0Lnpvb20mJih0LmVsZW1lbnQuc3R5bGUuem9vbT10Lnpvb20pKSxlJiYhaXNOYU4oZSkmJih0LmF0b20uc3R5bGUubGluZUhlaWdodD1NYXRoLnJvdW5kKGUpKyJweCIpfSkpfSkpfWZ1bmN0aW9uIHQzOTZfX2ZpeEVsZW1lbnRzRm9udFNpemVzKHQpe3ZhciBlO2lmKCF3aW5kb3cudDM5Nl9faXNNb2JpbGUmJndpbmRvdy50Mzk2X19pc0lQYWR8fHdpbmRvdy50Mzk2X19pc0ZhY2Vib29rTWVzc2VuZ2VySW5BcHB8fHdpbmRvdy50Mzk2X19pc0luc3RhZ3JhbUluQXBwKXt2YXIgaT10Mzk2X19pbml0RmFzdERPTSgpLHI9W107aS5yZWFkKChmdW5jdGlvbigpe0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7aWYoInRleHQiPT09ZXx8ImJ1dHRvbiI9PT1lKXt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIik7aWYoaSl7dmFyIG89dDM5Nl9lbGVtX2ZpbmRGaXJzdExldmVsUGFyZW50R3JvdXAodCksbj17ZWxlbWVudDp0LGF0b206aSx6b29tOjEsZWxlbWVudFR5cGU6ZX07aWYobyYmby5zdHlsZS56b29tJiYobi56b29tPXBhcnNlRmxvYXQoby5zdHlsZS56b29tKSksMSE9PW4uem9vbSl7dmFyIGE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsImZvbnRzaXplIik7YSYmKG4uZmllbGRGb250U2l6ZT1wYXJzZUZsb2F0KGEpKSxyLnB1c2gobil9fX19KSl9KSksaS53cml0ZSgoZnVuY3Rpb24oKXtyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuYXRvbS5zdHlsZS5mb250U2l6ZT0iIn0pKX0pKSxpLnJlYWQoKGZ1bmN0aW9uKCl7ci5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1wYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQuYXRvbSkuZm9udFNpemUpLGk9dC5maWVsZEZvbnRTaXplJiZNYXRoLmFicyh0LmZpZWxkRm9udFNpemUtZSk8PS4wMSxyPU51bWJlci5pc0ludGVnZXIoZSk7dC5jb3JyZWN0Rm9udFNpemU9aXx8cj8iY2FsYygiK2UrInB4ICogdmFyKC0tem9vbSwgMSkpIjoiY2FsYygiK2UrInB4ICogdmFyKC0tem9vbSwgMSkgKiB2YXIoLS16b29tLCAxKSkifSkpfSkpLGkud3JpdGUoKGZ1bmN0aW9uKCl7ci5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmF0b20uc3R5bGUuZm9udFNpemU9dC5jb3JyZWN0Rm9udFNpemV9KSl9KSl9fWZ1bmN0aW9uIHQzOTZfX2luaXRGYXN0RE9NKCl7cmV0dXJue3JlYWQ6ZnVuY3Rpb24gdChlKXtlKCl9LHdyaXRlOmZ1bmN0aW9uIHQoZSl7ZSgpfX19ZnVuY3Rpb24gdDM5Nl9fYXBwbHlGaXhlc0ZvckFsbEVsZW1lbnRzKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQzOTZfX2VsZW0iKSxlPXdpbmRvdy50Mzk2X19pc1NhZmFyaXx8d2luZG93LnQzOTZfX2lzRmFjZWJvb2tNZXNzZW5nZXJJbkFwcHx8d2luZG93LnQzOTZfX2lzSW5zdGFncmFtSW5BcHA7ZG9jdW1lbnQuZm9udHMmJmU/ZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbigoZnVuY3Rpb24oKXt0Mzk2X19maXhFbGVtZW50c0ZvbnRTaXplcyh0KSx0Mzk2X19maXhFbGVtZW50c0xpbmVIZWlnaHRzKHQpfSkpOnQzOTZfX2ZpeEVsZW1lbnRzTGluZUhlaWdodHModCksdDM5Nl9fcHJvY2Vzc0VsZW1lbnRzVHJhbnNmb3JtKHQpfWZ1bmN0aW9uIHQzOTZfX3pvb21pZnlWYWx1ZSh0LGUsaSl7dm9pZCAwPT09aSYmKGk9e30pO3ZhciByLG89ZSsoU3RyaW5nKGUpLmVuZHNXaXRoKCJweCIpPyIiOiJweCIpLG47aWYodDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKHQpKXJldHVybiBvO3ZhciBhPXdpbmRvdy5DU1MmJndpbmRvdy5DU1Muc3VwcG9ydHMmJkNTUy5zdXBwb3J0cygid2lkdGgiLCJyb3VuZCgxMHB4LCAxcHgpIik7cmV0dXJuIGkucm91bmQmJmE/InJvdW5kKCIrbysiICogdmFyKC0tem9vbSwgMSksIDFweCkiOiJjYWxjKCIrbysiICogdmFyKC0tem9vbSwgMSkpIn1mdW5jdGlvbiB0Mzk2X19pc0luUG9wdXAodCl7aWYoIXQpcmV0dXJuITE7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxpLHI7cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK2UpLnBhcmVudE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXBvcHVwX19jb250YWluZXIiKX1mdW5jdGlvbiB0Mzk2X193YWl0Rm9yUG9wdXAoKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQpe3ZhciBlPTAsaT01O2Z1bmN0aW9uIHIoKXt2YXIgaT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cF9zaG93Iik7aT90KGkpOmU+PTU/dChudWxsKTooZSsrLHNldFRpbWVvdXQociwxMDAqZSkpfXIoKX0pKX1mdW5jdGlvbiB0Mzk2X19zaG91bGRVc2VWaXN1YWxWaWV3cG9ydEhlaWdodCgpe3JldHVybiJ2aXN1YWxWaWV3cG9ydCJpbiB3aW5kb3cmJndpbmRvdy50Mzk2X19pc01vYmlsZSYmd2luZG93LnQzOTZfX2lzU2FmYXJpfWZ1bmN0aW9uIHQzOTZfX2dldFJvb3Rab25lKCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxlO3JldHVybiB0JiZ0LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1yb290LXpvbmUiKXx8ImNvbSJ9ZnVuY3Rpb24gdDM5Nl9faW50aWFsaXplVW5kZXJjdXQodCl7aWYodCYmdC5xdWVyeVNlbGVjdG9yKCIucWwtdW5kZXJjdXQiKSl7dmFyIGUsaT0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIit0Mzk2X19nZXRSb290Wm9uZSgpKyIvanMvdGlsZGEtdW5kZXJjdXQtMS4wLm1pbi5qcyI7dF9vbkZ1bmNMb2FkKCJ0X2xvYWRKc0ZpbGUiLChmdW5jdGlvbigpe3RfbG9hZEpzRmlsZShpLChmdW5jdGlvbigpe3Rfb25GdW5jTG9hZCgidF9xdWlsbFVuZGVyY3V0X3BhcnNlTm9kZXMiLChmdW5jdGlvbigpe3RfcXVpbGxVbmRlcmN1dF9wYXJzZU5vZGVzKHQpfSkpfSkpfSkpfX1mdW5jdGlvbiB0Mzk2X19pbml0aWFsaXplQXJ0Ym9hcmRPdmVyZmxvdyh0LGUpe2lmKGUmJnQpe3ZhciBpPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLmdldFByb3BlcnR5VmFsdWUoIm92ZXJmbG93Iik7aWYoImF1dG8iPT09aSl7dmFyIHI9dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpOyJ5IiE9PXdpbmRvdy5sYXp5JiYieWVzIiE9PXJ8fHRfb25GdW5jTG9hZCgidF9sYXp5bG9hZF91cGRhdGUiLChmdW5jdGlvbigpe2UuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKHdpbmRvdy50X2xhenlsb2FkX3VwZGF0ZSw1MDApKX0pKX0iIiE9PXdpbmRvdy5sb2NhdGlvbi5oYXNoJiYidmlzaWJsZSI9PT1pJiYoZS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Uuc3R5bGUub3ZlcmZsb3c9InZpc2libGUifSksMSkpfX1mdW5jdGlvbiB0Mzk2X19pbml0aWFsaXplQW5jaG9yTGlua092ZXJmbG93Rml4KCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYXJ0Ym9hcmQtb3ZyZmx3PSJ2aXNpYmxlIl0nKTt0Lmxlbmd0aCYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbihlKXt2YXIgaTtlLnRhcmdldC5jbG9zZXN0KCdhW2hyZWZePSIjIl0nKSYmKHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIn0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5zdHlsZS5vdmVyZmxvdz0idmlzaWJsZSJ9KSl9KSkpfSkpfQoKZnVuY3Rpb24gdF9zbGlkZXJfX2luaXQoZSx0KXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIitlKTtpZihyKXt2YXIgaT1yLnF1ZXJ5U2VsZWN0b3IoIi4iK3QrIl9fc2xpZGVyIik7aWYoaSl7dmFyIG49aS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHQrIl9faXRlbSIpO2lmKG4ubGVuZ3RoKXt0X3NsaWRlcl9fY2FsY01heFNsaWRlSGVpZ2h0KHQsaSk7dmFyIGw9ci5xdWVyeVNlbGVjdG9yKCIuIit0KyJfX2NvbnRyb2xfbGVmdCIpLGQ9ci5xdWVyeVNlbGVjdG9yKCIuIit0KyJfX2NvbnRyb2xfcmlnaHQiKSxhPSExLG89ZnVuY3Rpb24gZSh0KXthfHwoYT0hMCx0X3NsaWRlcl9fbmV4dFNsaWRlKGksbix0KS50aGVuKChmdW5jdGlvbigpe2E9ITF9KSkpfTtsJiZsLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixvLmJpbmQobnVsbCwiYmFja3dhcmRzIikpLGQmJmQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLG8uYmluZChudWxsLCJmb3J3YXJkcyIpKTt2YXIgcz1wYXJzZUludChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS10aW1lb3V0IiksMTApfHwwLHU9e3RpbWVvdXRJZDpudWxsfSxjPXRfc2xpZGVyX19zdG9wQXV0b1NsaWRlcy5iaW5kKG51bGwsdSksXz10X3NsaWRlcl9fc3RhcnRBdXRvU2xpZGVzLmJpbmQobnVsbCxpLG4scyx1KSxmO2lmKHMpe2kuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsYyksaS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixfKSxpLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsYyx7b25jZTohMH0pLGkuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsYyk7dmFyIHY9ZnVuY3Rpb24gZSh0LHIsaSl7dC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixyKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGkpLHQuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHIpLHQuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsaSl9LG07bCYmdihsLGMsXyksZCYmdihkLGMsXyksbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChmdW5jdGlvbihlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuaXNJbnRlcnNlY3Rpbmc/KGkuc2V0QXR0cmlidXRlKCJkYXRhLXZpc2libGUiLCJ0cnVlIiksXygpKTooaS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtdmlzaWJsZSIpLGMoKSl9KSl9KSx7dGhyZXNob2xkOi4xfSkub2JzZXJ2ZShpKX1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi4iK3QrIl9fcGxheS1idG4iKS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0X3NsaWRlcl9faGFuZGxlUGxheUNsaWNrLmJpbmQobnVsbCxpLGUsYyx0KSl9KSk7dmFyIGc9ci5xdWVyeVNlbGVjdG9yKCIuIit0KTtnJiZbInRpbGRhY2xhbXA6dXBkYXRlIiwiZGlzcGxheUNoYW5nZWQiXS5mb3JFYWNoKChmdW5jdGlvbihlKXtnLmFkZEV2ZW50TGlzdGVuZXIoZSwoZnVuY3Rpb24oKXt0X3NsaWRlcl9fY2FsY01heFNsaWRlSGVpZ2h0KHQsaSl9KSl9KSksaS5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt0X3NsaWRlcl9faGFuZGxlV2hlZWwoaSxuKX0pLDMwMCkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dF9zbGlkZXJfX2NhbGNNYXhTbGlkZUhlaWdodCh0LGkpfSksMzAwKSksdF9zbGlkZXJfX2RyYWdTbGlkZSh0LGkpLHRfc2xpZGVyX19pbml0Q2hhbmdlTGlzdGVuZXJJbkVkaXRNb2RlKGksbil9fX19ZnVuY3Rpb24gdF9zbGlkZXJfX2RyYWdTbGlkZShlLHQpe3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksaTtpZighKHImJiJlZGl0Ij09PXIuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKSkpe3ZhciBuPXtzdGFydFNjcm9sbExlZnQ6MCxzdGFydENsaWVudFg6MCxpc0RyYWdnaW5nOiExLG1pbkRlbHRhOjEwfSxsPWZ1bmN0aW9uIHIoaSl7aS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBsPWkuY2xpZW50WC1uLnN0YXJ0Q2xpZW50WDtuLmlzRHJhZ2dpbmc/KHQuc2Nyb2xsTGVmdD1uLnN0YXJ0U2Nyb2xsTGVmdC0xLjUqbCx0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJ3aGVlbCIpKSk6TWF0aC5hYnMobCk+bi5taW5EZWx0YSYmKHQuY2xhc3NMaXN0LmFkZChlKyJfX3NsaWRlcl9kcmFnZ2luZyIpLG4uaXNEcmFnZ2luZz0hMCl9LGQ9ZnVuY3Rpb24gcigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsbCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsZCksbi5zdGFydFNjcm9sbExlZnQ9MCxuLnN0YXJ0Q2xpZW50WD0wLG4uaXNEcmFnZ2luZz0hMSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoInVzZXItc2VsZWN0IiksZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCItd2Via2l0LXVzZXItc2VsZWN0IiksdC5jbGFzc0xpc3QucmVtb3ZlKGUrIl9fc2xpZGVyX2RyYWdnaW5nIil9O3QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwoZnVuY3Rpb24oZSl7bi5zdGFydFNjcm9sbExlZnQ9dC5zY3JvbGxMZWZ0LG4uc3RhcnRDbGllbnRYPWUuY2xpZW50WCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLGwpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGQpLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgidXNlci1zZWxlY3QiLCJub25lIiksZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCItd2Via2l0LXVzZXItc2VsZWN0Iiwibm9uZSIpfSkpfX1mdW5jdGlvbiB0X3NsaWRlcl9faW5pdENoYW5nZUxpc3RlbmVySW5FZGl0TW9kZShlLHQpe3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksaSxuO3ImJiJlZGl0Ij09PXIuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKSYmIk11dGF0aW9uT2JzZXJ2ZXIiaW4gd2luZG93JiZuZXcgTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24ocil7ci5mb3JFYWNoKChmdW5jdGlvbihyKXtpZigiY2hpbGRMaXN0Ij09PXIudHlwZSYmKHIuYWRkZWROb2Rlcy5sZW5ndGh8fHIucmVtb3ZlZE5vZGVzLmxlbmd0aCkpe3ZhciBpPXBhcnNlSW50KGUuZ2V0QXR0cmlidXRlKCJkYXRhLWFjdGl2ZS1zbGlkZS1pbmRleCIpLDEwKXx8MCxuPXRbaV07aWYobil7dmFyIGw9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSksZD1wYXJzZUludChsLmdldFByb3BlcnR5VmFsdWUoInBhZGRpbmctbGVmdCIpLDEwKXx8MDtlLnNjcm9sbExlZnQ9bi5vZmZzZXRMZWZ0LWR9fX0pKX0pKS5vYnNlcnZlKGUse2NoaWxkTGlzdDohMH0pfWZ1bmN0aW9uIHRfc2xpZGVyX19zdGFydEF1dG9TbGlkZXMoZSx0LHIsaSl7aS50aW1lb3V0SWR8fCJ0cnVlIiE9PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXZpc2libGUiKXx8InRydWUiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW8tcGxheWluZyIpfHwoaS50aW1lb3V0SWQ9d2luZG93LnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9zbGlkZXJfX25leHRTbGlkZShlLHQsImZvcndhcmRzIikudGhlbigoZnVuY3Rpb24oKXtpLnRpbWVvdXRJZCYmKGkudGltZW91dElkPW51bGwsdF9zbGlkZXJfX3N0YXJ0QXV0b1NsaWRlcyhlLHQscixpKSl9KSl9KSxyKSl9ZnVuY3Rpb24gdF9zbGlkZXJfX3N0b3BBdXRvU2xpZGVzKGUpe3dpbmRvdy5jbGVhclRpbWVvdXQoZS50aW1lb3V0SWQpLGUudGltZW91dElkPW51bGx9ZnVuY3Rpb24gdF9zbGlkZXJfX25leHRTbGlkZShlLHQscil7dm9pZCAwPT09ciYmKHI9ImZvcndhcmRzIik7dmFyIGk9dF9zbGlkZXJfX2dldEN1cnJlbnRTbGlkZUluZGV4KHQ9QXJyYXkuZnJvbSh0KSksbj10W2ldLGw9dF9zbGlkZXJfX2dldE5leHRTbGlkZUluZGV4KGUsdCxyLGkpLGQ9dFtsXTtuLnNldEF0dHJpYnV0ZSgiYXJpYS1jdXJyZW50IiwiZmFsc2UiKSxkLnNldEF0dHJpYnV0ZSgiYXJpYS1jdXJyZW50IiwidHJ1ZSIpO3ZhciBhPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLG89cGFyc2VJbnQoYS5nZXRQcm9wZXJ0eVZhbHVlKCJwYWRkaW5nLWxlZnQiKSwxMCl8fDA7IW8mJmUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0MTE0OF9fc2xpZGVyX292ZXJmbG93IikmJihvPXBhcnNlSW50KGEuZ2V0UHJvcGVydHlWYWx1ZSgibWFyZ2luLWxlZnQiKSwxMCl8fDApO3ZhciBzPWQub2Zmc2V0TGVmdC1vO3JldHVybiBlLnNldEF0dHJpYnV0ZSgiZGF0YS1hY3RpdmUtc2xpZGUtaW5kZXgiLGwpLHRfc2xpZGVyX19zbW9vdGhNb3ZlVG9OZXh0U2xpZGUoZSxzKSxuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7dmFyIHQ9NjAwO3dpbmRvdy5zZXRUaW1lb3V0KGUsdCl9KSl9ZnVuY3Rpb24gdF9zbGlkZXJfX3Ntb290aE1vdmVUb05leHRTbGlkZShlLHQscil7aWYodm9pZCAwPT09ciYmKHI9NjAwKSxlKXt2YXIgaT1lLnNjcm9sbExlZnQsbj10LWk7aWYobil7ZS5zdHlsZS5zY3JvbGxTbmFwVHlwZT0ibm9uZSI7dmFyIGw9ZS5zY3JvbGxMZWZ0LGQ9cGVyZm9ybWFuY2Uubm93KCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGEpfX1mdW5jdGlvbiBhKGkpe3ZhciBvPWktZCxzPU1hdGgubWluKG8vciwxKTtlLnNjcm9sbExlZnQ9bCtuKnRfc2xpZGVyX19hZGp1c3RlZEVhc2luZyhzKSxzPDE/cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGEpOihlLnNjcm9sbExlZnQ9dCxlLnN0eWxlLnNjcm9sbFNuYXBUeXBlPSIiKX19ZnVuY3Rpb24gdF9zbGlkZXJfX2FkanVzdGVkRWFzaW5nKGUpe3ZhciB0PS4wNSxyPU1hdGgubWluKGUrdCooMS1lKSwxKTtyZXR1cm4gcjwuNT80Kk1hdGgucG93KHIsMyk6MS1NYXRoLnBvdygtMipyKzIsMykvMn1mdW5jdGlvbiB0X3NsaWRlcl9fZ2V0TmV4dFNsaWRlSW5kZXgoZSx0LHIsaSl7dmFyIG49ImZvcndhcmRzIj09PXIsbCxkPWkrKG4/MTotMSksYTtpZihkPj10Lmxlbmd0aCYmKGQ9MCksZDwwJiYoZD10Lmxlbmd0aC0xKSxlLnNjcm9sbFdpZHRoLWUuc2Nyb2xsTGVmdC1lLmNsaWVudFdpZHRoPDEpaWYobilkPTA7ZWxzZSBmb3IoO2Q+MDspe3ZhciBvO2lmKHRbZF0ub2Zmc2V0TGVmdDxlLnNjcm9sbExlZnQpYnJlYWs7ZC0tfXJldHVybiBkfWZ1bmN0aW9uIHRfc2xpZGVyX19nZXRDdXJyZW50U2xpZGVJbmRleChlKXtyZXR1cm4gTWF0aC5tYXgoZS5maW5kSW5kZXgodCksMCk7ZnVuY3Rpb24gdChlKXtyZXR1cm4idHJ1ZSI9PT1lLmdldEF0dHJpYnV0ZSgiYXJpYS1jdXJyZW50Iil9fWZ1bmN0aW9uIHRfc2xpZGVyX19oYW5kbGVXaGVlbChlLHQpe3ZhciByPSh0PUFycmF5LmZyb20odCkpLmZpbmRJbmRleCgoZnVuY3Rpb24oZSl7cmV0dXJuInRydWUiPT09ZS5nZXRBdHRyaWJ1dGUoImFyaWEtY3VycmVudCIpfSkpLGksbjstMT09PXImJihyPTApLHRbcl0uc2V0QXR0cmlidXRlKCJhcmlhLWN1cnJlbnQiLCJmYWxzZSIpO2Zvcih2YXIgbD1lLnNjcm9sbExlZnQsZD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKSxhPXBhcnNlSW50KGQuZ2V0UHJvcGVydHlWYWx1ZSgicGFkZGluZy1sZWZ0IiksMTApfHwwLG89dC5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLm9mZnNldExlZnQtbH0pKSxzPXt9LHU9by5maWx0ZXIoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+PWEtMSYmKHNbdF09ZSwhMCl9KSksYz1NYXRoLm1pbi5hcHBseShudWxsLHUpLF89LTEsZj0wLHY9T2JqZWN0LmVudHJpZXMocyk7Zjx2Lmxlbmd0aDtmKyspe3ZhciBtPXZbZl07aWYobVsxXT09PWMpe189K21bMF07YnJlYWt9fS0xPT09XyYmKF89MCksdFtfXS5zZXRBdHRyaWJ1dGUoImFyaWEtY3VycmVudCIsInRydWUiKSxlLnNldEF0dHJpYnV0ZSgiZGF0YS1hY3RpdmUtc2xpZGUtaW5kZXgiLF8pfWZ1bmN0aW9uIHRfc2xpZGVyX19oYW5kbGVQbGF5Q2xpY2soZSx0LHIsaSl7aWYoIXQuZGlzYWJsZWQpe3Rfc2xpZGVyX19zdG9wVmlkZW9zKGUsaSksdC5kaXNhYmxlZD0hMDt2YXIgbj10LmNsb3Nlc3QoIi4iK2krIl9faXRlbSIpO2lmKG4pe3ZhciBsPW4ucXVlcnlTZWxlY3RvcigiLnQtdmlkZW8tbGF6eWxvYWQiKTtsJiYoZS5zZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW8tcGxheWluZyIsInRydWUiKSxyKCksdF9vbkZ1bmNMb2FkKCJ0X3ZpZGVvX2xhenlsb2FkX19hZGRWaWRlbyIsKGZ1bmN0aW9uKCl7bi5jbGFzc0xpc3QuYWRkKGkrIl9faXRlbV92aWRlby1wbGF5aW5nIiksdF92aWRlb19sYXp5bG9hZF9fYWRkVmlkZW8obCl9KSkpfX19ZnVuY3Rpb24gdF9zbGlkZXJfX3N0b3BWaWRlb3MoZSx0KXt2YXIgcjtlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS12aWRlby1wbGF5aW5nIiksZS5xdWVyeVNlbGVjdG9yQWxsKCIuIit0KyJfX2l0ZW0iKS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmNsYXNzTGlzdC5yZW1vdmUodCsiX19pdGVtX3ZpZGVvLXBsYXlpbmciKTt2YXIgcj1lLnF1ZXJ5U2VsZWN0b3IoIi4iK3QrIl9fdmlkZW8gLnQtdmlkZW8tbGF6eWxvYWQiKTtyJiYoci5pbm5lckhUTUw9IiIsci5zZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW9sYXp5LWxvYWQiLCJmYWxzZSIpKTt2YXIgaT1lLnF1ZXJ5U2VsZWN0b3IoIi4iK3QrIl9fcGxheS1idG4iKTtpJiYoaS5kaXNhYmxlZD0hMSl9KSl9ZnVuY3Rpb24gdF9zbGlkZXJfX2NhbGNNYXhTbGlkZUhlaWdodChlLHQpe2lmKCJ0MTE4NiI9PT1lKXt2YXIgcj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi4iK2UrIl9fY2FyZCIpLGk9MDtyLmZvckVhY2goKGZ1bmN0aW9uKGUpe2Uuc3R5bGUuaGVpZ2h0PSIifSkpLHIuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5xdWVyeVNlbGVjdG9yKCIudC10ZXh0LWNsYW1wX19pbm5lciIpO3QmJiJ0cnVlIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWV4cGFuZGVkIil8fGUuY2xpZW50SGVpZ2h0PmkmJihpPWUuY2xpZW50SGVpZ2h0KX0pKSxyLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiLnQtdGV4dC1jbGFtcF9faW5uZXIiKTt0JiYidHJ1ZSI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1leHBhbmRlZCIpfHwoZS5zdHlsZS5oZWlnaHQ9aSsicHgiKX0pKX19CgpmdW5jdGlvbiB0X3NsZHNJbml0KHQsZSl7dmFyIHM9dF9zbGRzX19nZXRSZWModCk7aWYocyl7dmFyIHI9cy5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksaTtpZihyKWlmKCFyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaW5pdGlhbGl6ZWQiKSl7dmFyIGE9ci5jbGFzc0xpc3QuY29udGFpbnMoImpzLWZlZWQtY29udGFpbmVyIiksbD1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIik7aWYobCl7ZSYmZS5yYW5kb21Tb3J0JiYobD10X3NsZHNfcmFuZG9tU29ydEVsZW1lbnRzKGwpKTt2YXIgZD1sLmxlbmd0aCxvPWxbMF0sbj1sW2wubGVuZ3RoLTFdLGM9d2luZG93LmlubmVyV2lkdGgsXz1wYXJzZUludChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IiksMTApfHwwLHU9ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSxwPXBhcnNlRmxvYXQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRyYW5zaXRpb24iKSksZjtpZihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGwsKGZ1bmN0aW9uKHQsZSl7dC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiLGUrMSl9KSksInRydWUiIT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3AiKSl7cHx8MD09PXB8fChwPTMwMCksaXNOYU4ocCkmJnIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10cmFuc2l0aW9uIiwiMzAwIiksci5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xkc19hbmltYXRlZC1mYXN0Iil8fHIuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfYW5pbWF0ZWQtc2xvdyIpfHxyLmNsYXNzTGlzdC5jb250YWlucygidC1zbGRzX2FuaW1hdGVkLW5vbmUiKXx8ci5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQtZmFzdCIpO3ZhciBtPV87dF9zbGRzX3NldEl0ZW1zSW5Sb3codCksdF9zbGRzX2NoYW5nZUltYWdlVXJsKHQpO3ZhciB5PTg9PT1kb2N1bWVudC5kb2N1bWVudE1vZGV8fDk9PT1kb2N1bWVudC5kb2N1bWVudE1vZGU7eSYmKHIuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLWZhc3QiKSxyLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1zbG93Iiksci5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpLHIuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2llIiksci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0IiwidHJ1ZSIpLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciLDEpKSxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaW5pdGlhbGl6ZWQiLCJ0cnVlIiksci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIil8fHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIsZCk7dmFyIHY9MSxnPXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiKTtnP3Y9cGFyc2VJbnQoZywxMCk6ci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsMSksci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIiwiIiksci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWFuaW1hdGVkIiwiIiksYXx8dF9zbGRzX19jcmVhdGVEdW1taWVzKG8sbixyKSxfPXBhcnNlSW50KHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKSwxMCl8fDA7dmFyIGI9cy5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd193cmFwcGVyLXJpZ2h0Iik7Yi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYiwoZnVuY3Rpb24odCl7dC5zdHlsZS5kaXNwbGF5PSJmYWxzZSI9PT11JiZkLV88PTA/Im5vbmUiOiIifSkpLGF8fHRfc2xkc19TbGlkZXJXaWR0aCh0KSwidHJ1ZSI9PXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodCIpJiZ0X3NsZHNfU2xpZGVySGVpZ2h0KHQpLHRfc2xkc19TbGlkZXJBcnJvd3NIZWlnaHQodCksdF9zbGRzX0FjdGl2ZVNsaWRlKHQsdixkKSx0X3NsZHNfQWN0aXZlQ2FwdGlvbih0LHYsZCksYT9jPjk2MCYmKCJ0cnVlIj09PXIuZ2V0QXR0cmlidXRlKCJkYXRhLWZlZWRzLXBvc3RzLWxvYWRlZCIpPyh0X3NsZHNfX2luaXRGZWVkc1NsaWRlcih0LHMsZSksdF9zbGRzX2luaXRTbGlkZXJDb250cm9scyh0LGUpKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmZWVkc0xvYWRQb3N0cyIsKGZ1bmN0aW9uKCl7dF9zbGRzX19pbml0RmVlZHNTbGlkZXIodCxzLGUpLHRfc2xkc19pbml0U2xpZGVyQ29udHJvbHModCxlKX0pKSk6KHl8fHRfc2xkc19vbkhhbW1lckxvYWQoIkhhbW1lciIsKGZ1bmN0aW9uKCl7dF9zbGRzX2luaXRTbGlkZXJTd2lwZSh0LGQsYyl9KSksdF9zbGRzX2luaXRTbGlkZXJDb250cm9scyh0LGUpLHRfc2xkc191cGRhdGVTbGlkZXIodCkpLHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10aW1lb3V0Iik+MD90X3NsZHNfaW5pdEF1dG9QbGF5KHQsdixkLGUpOnIuYWRkRXZlbnRMaXN0ZW5lcigic2xpZGVBdXRvcGxheVRpbWVyUmVhZHkiLChmdW5jdGlvbigpe3IuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10aW1lb3V0Iik+MCYmdF9zbGRzX2luaXRBdXRvUGxheSh0LHYsZCxlKX0pKSxzLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW0tbG9hZGVkIikubGVuZ3RoPGQrMiYmdF9zbGRzX1VwZGF0ZUltYWdlcyh0LHYpLCJ5ZXMiPT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItYXJyb3dzLW5lYXJwaWMiKSYmdF9zbGRzX3Bvc2l0aW9uQXJyb3dzKHQpO3ZhciBoPXMucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkcyIpO2gubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGgsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudmlzaWJpbGl0eT0iIn0pKSx0X3NsZHNfX3NldFRhYmluZGV4Rm9yRm9jdXNhYmxlRWxlbWVudHModCkscy5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsdF9zbGRzX3VwZGF0ZU9uRGlzcGxheUNoYW5nZSkscy5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsdF9zbGRzX3VwZGF0ZU9uRGlzcGxheUNoYW5nZSh0LG0pKSxhJiYocy5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsdF9zbGRzX3VwZGF0ZUZlZWRzU2xpZGVyT25SZXNpemUpLHMuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLChmdW5jdGlvbigpe3Rfc2xkc191cGRhdGVGZWVkc1NsaWRlck9uUmVzaXplKHQscyxlKX0pKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Rfc2xkc19zZXRJdGVtc0luUm93KHQsbSksdF9zbGRzX3VwZGF0ZVNsaWRlcih0KSx0X3NsZHNfcG9zaXRpb25BcnJvd3ModCksYSYmdF9zbGRzX3VwZGF0ZUZlZWRzU2xpZGVyT25SZXNpemUodCxzLGUpfSksMTAwKX0pKSksd2luZG93LnRfc2xkc19faXNpT1MmJigiY29tcGxldGUiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZT90X3NsZHNfX2hpZGVNb2JpbGVTbGlkZXMocy5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpKTp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7dF9zbGRzX19oaWRlTW9iaWxlU2xpZGVzKHMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbV9hY3RpdmUiKSl9KSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXsidHJ1ZSI9PXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodCIpJiZ0X3NsZHNfVXBkYXRlU2xpZGVySGVpZ2h0KHQpLHRfc2xkc19VcGRhdGVTbGlkZXJBcnJvd3NIZWlnaHQodCl9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X3NsZHNfVXBkYXRlU2xpZGVyQXJyb3dzSGVpZ2h0KHQpfSksNTAwKTt2YXIgQT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYWxscmVjb3JkcyIpO0EmJkEuYWRkRXZlbnRMaXN0ZW5lcigiYWxsUmVjUGFkZGluZ0luaXQiLChmdW5jdGlvbigpe3Rfc2xkc191cGRhdGVTbGlkZXIodCl9KSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfc2xkc19fcmVtb3ZlQXV0b3BsYXlCeVZpZGVvKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdF9zbGRzX19yZW1vdmVBdXRvcGxheUJ5VmlkZW8pfX19fX1mdW5jdGlvbiB0X3NsZHNfX3JlbW92ZUF1dG9wbGF5QnlWaWRlbyh0KXt2YXIgZT10LnRhcmdldC5jbG9zZXN0KCIudC1zbGRzX19pdGVtIikscz1udWxsPT1lP3ZvaWQgMDplLnF1ZXJ5U2VsZWN0b3IoIltkYXRhLXNsaWRlci12aWRlby10eXBlXSwgW2RhdGEtdmlkZW9sYXp5LXR5cGVdLCBpZnJhbWUiKTtpZihzKXt2YXIgcj1zLmNsb3Nlc3QoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxpO2lmKHIpci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWludGVydmFsLWlkIikmJihyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZCIsInllcyIpLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkLWJ5LXZpZGVvIiwieSIpKX19ZnVuY3Rpb24gdF9zbGRzX19pbml0RmVlZHNTbGlkZXIodCxlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihzKXt2YXIgcj1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIiksaT1wYXJzZUludChzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiKSwxMCl8fDAsYT1yWzBdLGw9cltyLmxlbmd0aC0xXSxkPXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIik7dF9zbGRzX19jcmVhdGVEdW1taWVzKGEsbCxzKSx0X3NsZHNfdXBkYXRlU2xpZGVyKHQpO3ZhciBvPXBhcnNlSW50KHMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKSwxMCl8fDAsbj1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93X3dyYXBwZXItcmlnaHQiKTtuLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LnN0eWxlLmRpc3BsYXk9ImZhbHNlIj09PWQmJmktbzw9MD8ibm9uZSI6IiJ9KSksInRydWUiPT1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQiKSYmdF9zbGRzX1NsaWRlckhlaWdodCh0KX19ZnVuY3Rpb24gdF9zbGRzX19jcmVhdGVEdW1taWVzKHQsZSxzKXt2YXIgcixpPXMucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbTpub3QoLnQtc2xkc19faXRlbV9kdW1teSkiKS5sZW5ndGgsYT1wYXJzZUludChzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IiksMTApfHwwLGw9cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSxkPXMuY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1mZWVkLWNvbnRhaW5lciIpLG89ITEsbj0hMSxjLF87aWYodCYmKGM9dC5xdWVyeVNlbGVjdG9yKCdbZGF0YS16b29tYWJsZT0ieWVzIl0nKSkmJihvPSEwLGMuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXpvb21hYmxlIikmJmMuY2xhc3NMaXN0LnJlbW92ZSgidC16b29tYWJsZSIpLGMucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXpvb21hYmxlIikpLGUmJihfPWUucXVlcnlTZWxlY3RvcignW2RhdGEtem9vbWFibGU9InllcyJdJykpJiYobj0hMCxfLmNsYXNzTGlzdC5jb250YWlucygidC16b29tYWJsZSIpJiZfLmNsYXNzTGlzdC5yZW1vdmUoInQtem9vbWFibGUiKSxfLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS16b29tYWJsZSIpKSxlJiYwPT1zLnF1ZXJ5U2VsZWN0b3JBbGwoJy50LXNsZHNfX2l0ZW1bZGF0YS1zbGlkZS1pbmRleD0iMCJdJykubGVuZ3RoKXt2YXIgdT1lLmNsb25lTm9kZSghMCk7dS5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiLCIwIiksdS5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpO3ZhciBwPXQucGFyZW50Tm9kZTtwLmluc2VydEJlZm9yZSh1LHQpO3ZhciBmPXAucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtc2xpZGUtaW5kZXg9IjAiXSBbZmllbGRdJyk7Zi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZiwoZnVuY3Rpb24odCl7dC5yZW1vdmVBdHRyaWJ1dGUoImZpZWxkIil9KSl9aWYoIWQmJnQmJiFzLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1bZGF0YS1zbGlkZS1pbmRleD0iJysoaSsxKSsnIl0nKSl7dmFyIG09dC5jbG9uZU5vZGUoITApO2lmKG0uc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IixpKzEpLG0uY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX19pdGVtX2FjdGl2ZSIpLG0uc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKSxlLmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJlbmQiLG0pLGUuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtLWxvYWRlZCIpLGE+MCYmInRydWUiPT09bClmb3IodmFyIHk9dCx2PWUsZz0wO2c8YS0xO2crKyl7dmFyIGI9eS5uZXh0RWxlbWVudFNpYmxpbmcuY2xvbmVOb2RlKCEwKTtiLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIsaStnKzEpLHYubmV4dEVsZW1lbnRTaWJsaW5nLmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJlbmQiLGIpLHY9di5uZXh0RWxlbWVudFNpYmxpbmcseT15Lm5leHRFbGVtZW50U2libGluZ319byYmYyYmKGMuY2xhc3NMaXN0LmFkZCgidC16b29tYWJsZSIpLGMuc2V0QXR0cmlidXRlKCJkYXRhLXpvb21hYmxlIiwieWVzIikpLG4mJl8mJihfLmNsYXNzTGlzdC5hZGQoInQtem9vbWFibGUiKSxfLnNldEF0dHJpYnV0ZSgiZGF0YS16b29tYWJsZSIsInllcyIpKX1mdW5jdGlvbiB0X3NsZHNfX2hpZGVNb2JpbGVTbGlkZXModCl7aWYodCl7dmFyIGU9dC5jbG9zZXN0KCIudC1zbGRzX19pdGVtcy13cmFwcGVyIikscz1lJiZnZXRDb21wdXRlZFN0eWxlKGUpO2lmKCFzfHwic2Nyb2xsIiE9PXMub3ZlcmZsb3dYfHwiZmxleCIhPT1zLmRpc3BsYXkpe3ZhciByPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbTpub3QoLnQtc2xkc19faXRlbV9kdW1teSkiKSksaT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg+OTYwPzU6MztpZighKHIubGVuZ3RoPD0yKmkpKXtmb3IodmFyIGE9dC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiKSxsPVthPXBhcnNlSW50KGEsMTApXSxkPTE7ZDxpO2QrKylhK2Q8PXIubGVuZ3RoP2wucHVzaChhK2QpOmwucHVzaChkKSxhLWQ+MD9sLnB1c2goYS1kKTpsLnB1c2goci5sZW5ndGgrMS1kKTt2YXIgbz0idC1zbGRzX19pdGVtLWlubmFjdGl2ZSI7ci5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZTtsLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBwYXJzZUludCh0LmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIpLDEwKT09PWV9KSk/dC5jbGFzc0xpc3QucmVtb3ZlKG8pOnQuY2xhc3NMaXN0LmFkZChvKX0pKX19fX1mdW5jdGlvbiB0X3NsZHNfdXBkYXRlT25EaXNwbGF5Q2hhbmdlKHQsZSl7dF90aHJvdHRsZSgoZnVuY3Rpb24oKXt0X3NsZHNfc2V0SXRlbXNJblJvdyh0LGUpLHRfc2xkc191cGRhdGVTbGlkZXIodCksdF9zbGRzX3Bvc2l0aW9uQXJyb3dzKHQpfSkpfWZ1bmN0aW9uIHRfc2xkc191cGRhdGVGZWVkc1NsaWRlck9uUmVzaXplKHQsZSxzKXt2YXIgcj1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxpO3ImJihyLmNsYXNzTGlzdC5jb250YWlucygianMtZmVlZC1jb250YWluZXIiKSYmKHdpbmRvdy5pbm5lcldpZHRoPjk2MD8idHJ1ZSI9PT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1mZWVkcy1wb3N0cy1sb2FkZWQiKT8odF9zbGRzX19pbml0RmVlZHNTbGlkZXIodCxlLHMpLHRfc2xkc19pbml0U2xpZGVyQ29udHJvbHModCxzKSk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZmVlZHNMb2FkUG9zdHMiLChmdW5jdGlvbigpe3Rfc2xkc19faW5pdEZlZWRzU2xpZGVyKHQsZSxzKSx0X3NsZHNfaW5pdFNsaWRlckNvbnRyb2xzKHQscyl9KSk6ci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoMCkiKSl9ZnVuY3Rpb24gdF9zbGRzX3NldEl0ZW1zSW5Sb3codCxlKXt2YXIgcz10X3NsZHNfX2dldFJlYyh0KTtpZihzKXt2YXIgcj1zLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxpLGE7aWYocikoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpfHwwKSYmKHdpbmRvdy5pbm5lcldpZHRoPD05NjAmJihhPTIpLHdpbmRvdy5pbm5lcldpZHRoPD02NDAmJihhPTEpLHdpbmRvdy5pbm5lcldpZHRoPjk2MCYmKGE9ZSkpLGEmJnIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciLGEpfX1mdW5jdGlvbiB0X3NsZHNfaW5pdFNsaWRlckNvbnRyb2xzKHQsZSl7dmFyIHM9dF9zbGRzX19nZXRSZWModCk7aWYocyl7dmFyIHI9cy5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYocil7dmFyIGk9ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpfHwwLGE9cy5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIgLnQtc2xkc19faXRlbSIpLGw9cy5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIiKSxkPWk+MCYmYSYmbD9hLm9mZnNldFdpZHRoOmwub2Zmc2V0V2lkdGgsbztpZigidHJ1ZSIhPT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcCIpKXtyLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWCgtIitkKyJweCkiO3ZhciBuPXMucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYXJyb3dfd3JhcHBlciIpO24ubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKGkpe2kuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbigpe3ZhciBpPXRfc2xkc19nZXRDdXJyZW50VHJhbnNsYXRlKHMpLGE9ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWFuaW1hdGVkIiksbD1wYXJzZUZsb2F0KHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiKSksZD1wYXJzZUZsb2F0KHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpKSxvPXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIiksbj0iIixjOyIiPT1hJiYoci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWFuaW1hdGVkIiwieWVzIiksImxlZnQiPT09dGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtZGlyZWN0aW9uIik/ImZhbHNlIj09byYmMT09bD9sPTE6bC0tOiJmYWxzZSI9PW8mJmw9PWQ/bD1kOmwrKyxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixsKSxsIT1kKzEmJjAhPWx8fChuPSJ5ZXMiKSxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiLG4pLHRfc2xpZGVNb3ZlV2l0aG91dEFuaW1hdGlvbih0LCExLGUsaSkpO3Rfc2xkc191cGRhdGVTbGlkZXIodCl9KSl9KSk7dmFyIGM9cy5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19idWxsZXQiKTtjLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLChmdW5jdGlvbihpKXtpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoZnVuY3Rpb24oKXt2YXIgYT1wYXJzZUludChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1idWxsZXQtZm9yIiksMTApLGw7aWYocGFyc2VJbnQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpLDEwKSE9PWEpe3ZhciBkPXRfc2xkc19nZXRDdXJyZW50VHJhbnNsYXRlKHMpO3Iuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLGEpLHRfc2xpZGVNb3ZlV2l0aG91dEFuaW1hdGlvbih0LCExLGUsZCksdF9zbGRzX3VwZGF0ZVNsaWRlcih0KX19KSl9KSl9fX19ZnVuY3Rpb24gdF9zbGRzX2FuaW1hdGUodCxlLHMpe3ZhciByPXBlcmZvcm1hbmNlLm5vdygpO3JlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24gaShhKXt2YXIgbD0oYS1yKS9zO2w+MSYmKGw9MSk7dmFyIGQ9dChsKTtlKGQpLGw8MT9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSk6InkiIT09d2luZG93LmxhenkmJiJ5ZXMiIT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FsbHJlY29yZHMiKS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpfHx0X3NsZHNfb25IYW1tZXJMb2FkKCJ0X2xhenlsb2FkX3VwZGF0ZSIsKGZ1bmN0aW9uKCl7dF9sYXp5bG9hZF91cGRhdGUoKX0pKX0pKX1mdW5jdGlvbiB0X3NsaWRlX01vdmVBbmltYXRpb24odCxlLHMscil7aWYodCl7dC5zdHlsZS50cmFuc2l0aW9uPSJoZWlnaHQgZWFzZS1pbi1vdXQgLjVzLCB0cmFuc2Zvcm0gZWFzZS1pbi1vdXQgMHMiO3ZhciBpPS1NYXRoLmFicyhlKnMpLGE9LXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUodCkudHJhbnNmb3JtLm1hdGNoKC9cZCsvKVswXSksbD1hLWk7MCE9PWwmJnRfc2xkc19hbmltYXRlKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pLChmdW5jdGlvbihlKXt0LnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWCgiKyhhLWwqZSkrInB4KSJ9KSxyKX19ZnVuY3Rpb24gdF9zbGlkZU1vdmVXaXRob3V0QW5pbWF0aW9uKHQsZSxzKXt2YXIgcj10X3NsZHNfX2dldFJlYyh0KTtpZihyKXt2YXIgaT1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihpKXt2YXIgYT1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiKSksbCxkPShpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93Iil8fDApPjA/ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIgLnQtc2xkc19faXRlbSIpLm9mZnNldFdpZHRoOnIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIikub2Zmc2V0V2lkdGgsbz1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpKSxuPWkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpO2E+bysxJiYoYT0xKTt2YXIgYz1yLmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fZWxlbSIpLF89dF9zbGRzX2dldEV2ZW50c0Zvclplcm9CbG9jaygpLHU9Xy5tb3ZlU2xpZGVTdGFydEV2ZW50LHA9Xy5tb3ZlU2xpZGVFbmRFdmVudDtpZihjJiZyLmRpc3BhdGNoRXZlbnQodSksbil7dmFyIGY9ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpLG09ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtIik7aWYoZiYmMD09PXIucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbV9kdW1teSIpLmxlbmd0aCl7dmFyIHk9Zi5jbG9uZU5vZGUoITApLHY7eS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW1fZHVtbXkiKSx5LnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIseS5zdHlsZS5sZWZ0PWQqYSsicHgiLGkuYXBwZW5kQ2hpbGQoeSksKHY9ci5jbGFzc0xpc3QuY29udGFpbnMoImpzLXByb2R1Y3QiKT9yOnIucXVlcnlTZWxlY3RvcigiLnQtY2F0YWxvZywgLnQtc3RvcmUiKXx8ci5xdWVyeVNlbGVjdG9yKCIuanMtcHJvZHVjdCIpKT8odF9zbGRzX2ZhZGVPdXQoeSwxNTAsKGZ1bmN0aW9uKCl7bnVsbCE9PXkucGFyZW50Tm9kZSYmeS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHkpfSkpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobSwoZnVuY3Rpb24odCl7dF9zbGRzX2ZhZGVJbih0LDE1MCl9KSkpOihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG0sKGZ1bmN0aW9uKHQpe3Quc3R5bGUub3BhY2l0eT0wfSkpLHRfc2xkc19mYWRlT3V0KHksNDAwLChmdW5jdGlvbigpe251bGwhPT15LnBhcmVudE5vZGUmJnkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh5KX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobSwoZnVuY3Rpb24odCl7dF9zbGRzX2ZhZGVJbih0KX0pKSxjJiZyLmRpc3BhdGNoRXZlbnQocCl9KSw1MCkpfWkuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLWNhbmNlbCIpfXRfc2xpZGVNb3ZlKHQsZSxzKSxuJiZpLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1jYW5jZWwiKSxjJiZyLmRpc3BhdGNoRXZlbnQocCl9fX1mdW5jdGlvbiB0X3NsaWRlTW92ZUluc3RhbnRseSh0LGUscyl7dmFyIHI9dF9zbGRzX19nZXRSZWModCk7aWYocil7dmFyIGk9ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYoaSl7dmFyIGE9cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIikpLGwsZD0oaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpfHwwKT4wP3IucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIC50LXNsZHNfX2l0ZW0iKS5vZmZzZXRXaWR0aDpyLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciIpLm9mZnNldFdpZHRoLG89cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiKSksbj1pLmNsYXNzTGlzdC5jb250YWlucygidC1zbGRzX2FuaW1hdGVkLW5vbmUiKTtpZihhPm8rMSYmKGE9MSksbil7dmFyIGM9ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpO2lmKGMmJjA9PT1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW1fZHVtbXkiKS5sZW5ndGgpe3ZhciBfPWMuY2xvbmVOb2RlKCEwKTtfLmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbV9kdW1teSIpLF8uc3R5bGUucG9zaXRpb249ImFic29sdXRlIixfLnN0eWxlLmxlZnQ9ZCphKyJweCIsaS5hcHBlbmRDaGlsZChfKSx0X3NsZHNfZmFkZU91dChfLDQwMCwoZnVuY3Rpb24oKXtudWxsIT09Xy5wYXJlbnROb2RlJiZfLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoXyl9KSl9aS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQiKSxpLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZC1jYW5jZWwiKX1lbHNlIGkuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkIiksaS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQtY2FuY2VsIik7dF9zbGlkZU1vdmUodCxlLHMpLGkuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkIiksaS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtY2FuY2VsIil9fX1mdW5jdGlvbiB0X3NsaWRlTW92ZSh0LGUscyl7dmFyIHI9dF9zbGRzX19nZXRSZWModCk7aWYocil7dmFyIGk9ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYoaSl7dmFyIGE9ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpLGw9aS5jbGFzc0xpc3QuY29udGFpbnMoImpzLWZlZWQtY29udGFpbmVyIiksZD1wYXJzZUludChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93Iil8fDApLG89cGFyc2VJbnQoaS5nZXRBdHRyaWJ1dGUoImRhdGEtZmVlZC1zaG93LWNvdW50Iil8fDApLG49ZD4wP3IucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIC50LXNsZHNfX2l0ZW0iKS5vZmZzZXRXaWR0aDpyLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciIpLm9mZnNldFdpZHRoLGM9cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdHJhbnNpdGlvbiIpKSxfPXBhcnNlRmxvYXQoaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpKSx1PXBhcnNlRmxvYXQoaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIikpLHA9aS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIiksZj1pLmNsYXNzTGlzdC5jb250YWlucygidC1zbGRzX2FuaW1hdGVkLW5vbmUiKSxtPWkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10aW1lb3V0Iik+MCx5PXIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3dfd3JhcHBlci1yaWdodCIpLHY9ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvd193cmFwcGVyLWxlZnQiKSxnOyJvZmYiPT09aS5nZXRBdHRyaWJ1dGUoImFyaWEtbGl2ZSIpJiZpLnNldEF0dHJpYnV0ZSgiYXJpYS1saXZlIiwicG9saXRlIik7dmFyIGI9MDtpZigvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKXt2YXIgaD1uYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvVmVyc2lvblwvKFxkKylcLihcZCspXC4/KFxkKyk/IFNhZmFyaS8pO251bGwhPT1oJiYoYj1wYXJzZUludChoWzFdLDEwKSl9dmFyIEE9ISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKCJDcmlPUyIpLFM7aWYoY3x8MD09PWN8fChjPTMwMCksXz51KzEmJihfPTEsaS5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsMSkpLCJ0cnVlIiE9PWkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wIikpe2lmKHkpaWYobCl7dmFyIHc9YVthLmxlbmd0aC0xXSxFPXBhcnNlSW50KHcuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IiksMTApO2lmKGQ8dSYmdF9zbGRzX2ZhZGVJbih5LDMwMCksRTx1JiZkPjAmJihfPT1FLW8rMXx8RT09PW8pKXt2YXIgcT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtxLmluaXRFdmVudCgiZmVlZHNMYXN0U2xpZGUiLCEwLCEwKSxpLmRpc3BhdGNoRXZlbnQocSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZmVlZHNMb2FkU2xpZGUiLChmdW5jdGlvbigpe3Rfc2xkc191cGRhdGVTbGlkZXIodCksImZ1bmN0aW9uIj09dHlwZW9mIHRfYW5pbWF0ZV9fc3RhcnRBbmltYXRpb24mJnRfYW5pbWF0ZV9fc3RhcnRBbmltYXRpb24oKX0pKSx0X3NsZHNfZmFkZUluKHksMzAwKX1lbHNlIEU9PT11JiZfPT09dS1kKzEmJnRfc2xkc19mYWRlT3V0KHksMzAwKX1lbHNlImZhbHNlIj09aS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSYmKF89PXV8fGQ+MSYmXz09dS1kKzEpP3Rfc2xkc19mYWRlT3V0KHksMzAwKTp0X3NsZHNfZmFkZUluKHksMzAwKTt2JiYoImZhbHNlIj09aS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSYmMT09Xz90X3NsZHNfZmFkZU91dCh2LDMwMCk6dF9zbGRzX2ZhZGVJbih2LDMwMCkpLGkuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkIiksYj49MTMmJkEmJiFmP3Rfc2xpZGVfTW92ZUFuaW1hdGlvbihpLF8sbixjKTppLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWCgtIituKl8rInB4KSIsdF90cmlnZ2VyRXZlbnQoaSwic2xpZGVDaGFuZ2VTdGFydCIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQiKSxpLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItYW5pbWF0ZWQiLCIiKSwieWVzIj09KHA9aS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIikpJiYoXz09dSsxJiYoXz0xKSwwPT1fJiYoXz11KSxiPj0xMyYmQSYmIWY/dF9zbGlkZV9Nb3ZlQW5pbWF0aW9uKGksXyxuLDApOmkuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKC0iK24qXysicHgpIiwhMCE9PWYmJnRfc2xkc19BY3RpdmVTbGlkZSh0LF8sdSxzKSxpLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixfKSksKCJ5Ij09PXdpbmRvdy5sYXp5fHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYWxscmVjb3JkcyIpJiYieWVzIj09PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhbGxyZWNvcmRzIikuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWxhenkiKSkmJnRfc2xkc19vbkhhbW1lckxvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXt0X2xhenlsb2FkX3VwZGF0ZSgpfSkpLCFlJiZtJiZ0X3NsZHNfaW5pdEF1dG9QbGF5KHQsXyx1LHMpfSksYyksdF9zbGRzX0FjdGl2ZUJ1bGxldCh0LF8sdSxzKSx0X3NsZHNfQWN0aXZlU2xpZGUodCxfLHUpLCJ0cnVlIj09aS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0IikmJnRfc2xkc19TbGlkZXJIZWlnaHQodCksdF9zbGRzX1NsaWRlckFycm93c0hlaWdodCh0KSx0X3NsZHNfQWN0aXZlQ2FwdGlvbih0LF8sdSksci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtLWxvYWRlZCIpLmxlbmd0aDx1KzImJnRfc2xkc19VcGRhdGVJbWFnZXModCxfKSx0X3RyaWdnZXJFdmVudChpLCJzbGlkZUNoYW5nZUVuZCIpfX19fWZ1bmN0aW9uIHRfc2xkc191cGRhdGVTbGlkZXIodCl7dmFyIGU9dF9zbGRzX19nZXRSZWModCk7aWYoZSl7dF9zbGRzX1NsaWRlcldpZHRoKHQpO3ZhciBzPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKHMpe3ZhciByPXBhcnNlSW50KHMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKSwxMCl8fDEsaT1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciAudC1zbGRzX19pdGVtIiksYT1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciIpLGw9cj4wJiZhJiZpP2kub2Zmc2V0V2lkdGg6YS5vZmZzZXRXaWR0aCxkPXBhcnNlSW50KHMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiKSwxMCksbz1wYXJzZUludChzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiKSwxMCksbj1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpLGM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvd193cmFwcGVyLXJpZ2h0Iik7aWYoZD5vKzEmJihkPTEscy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsMSkpLGMmJiJmYWxzZSI9PT1uKXt2YXIgXyx1PW8tcjw9MHx8ZCtyLTE9PT1vO2Muc3R5bGUuZGlzcGxheT11PyJub25lIjoiIn1zLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWCgtIitsKmQrInB4KSIsInRydWUiPT1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQiKSYmdF9zbGRzX1VwZGF0ZVNsaWRlckhlaWdodCh0KSx0X3NsZHNfVXBkYXRlU2xpZGVyQXJyb3dzSGVpZ2h0KHQpLCJ5Ij09PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkLWJ5LXZpZGVvIikmJnMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkLWJ5LXZpZGVvIiwiIil9fX1mdW5jdGlvbiB0X3NsZHNfVXBkYXRlSW1hZ2VzKHQsZSl7dmFyIHM9dF9zbGRzX19nZXRSZWModCk7aWYocyl7dmFyIHI9cy5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IicrZSsnIl0nKTtyJiYoci5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW0tbG9hZGVkIiksci5uZXh0RWxlbWVudFNpYmxpbmcmJnIubmV4dEVsZW1lbnRTaWJsaW5nLmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbS1sb2FkZWQiKSxyLnByZXZpb3VzRWxlbWVudFNpYmxpbmcmJnIucHJldmlvdXNFbGVtZW50U2libGluZy5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW0tbG9hZGVkIikpfX1mdW5jdGlvbiB0X3NsZHNfQWN0aXZlQ2FwdGlvbih0LGUscyl7dmFyIHI9dF9zbGRzX19nZXRSZWModCk7aWYocil7dmFyIGk9ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19jYXB0aW9uIiksYT1yLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2NhcHRpb25bZGF0YS1zbGlkZS1jYXB0aW9uPSInK2UrJyJdJyk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19fY2FwdGlvbi1hY3RpdmUiKX0pKSwwPT1lP2E9ci5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19jYXB0aW9uW2RhdGEtc2xpZGUtY2FwdGlvbj0iJytzKyciXScpOmU9PXMrMSYmKGE9ci5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19jYXB0aW9uW2RhdGEtc2xpZGUtY2FwdGlvbj0iMSJdJykpLGEmJmEuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19jYXB0aW9uLWFjdGl2ZSIpfX1mdW5jdGlvbiB0X3NsZHNfc2Nyb2xsSW1hZ2VzKHQsZSl7dmFyIHM9dF9zbGRzX19nZXRSZWModCk7aWYocyl7dmFyIHI9KGU8MD8iIjoiLSIpK01hdGguYWJzKGUpLnRvU3RyaW5nKCk7cy5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIikuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKCIrcisicHgpIn19ZnVuY3Rpb24gdF9zbGRzX0FjdGl2ZUJ1bGxldCh0LGUscyxyKXt2YXIgaTtpZihyJiZyLnRodW1ic2J1bGxldEdhbGxlcnkpe3ZhciBhPXBhcnNlSW50KHIuc3RvcmVPcHRpb25zLnBvcHVwX29wdHMuY29sdW1ucyksbD0rci5zdG9yZU9wdGlvbnMuc2xpZGVyX3NsaWRlc09wdHMucmF0aW87InRfc3RvcmVfcHJvZFBvcHVwX2dhbGxlcnlfY2FsY01heFRodW1ic0NvdW50ImluIHdpbmRvdz9pPXRfc3RvcmVfcHJvZFBvcHVwX2dhbGxlcnlfY2FsY01heFRodW1ic0NvdW50KGEsbCw2MCwxMCk6InRfY2F0YWxvZ19wcm9kUG9wdXBfZ2FsbGVyeV9jYWxjTWF4VGh1bWJzQ291bnQiaW4gd2luZG93JiYoaT10X2NhdGFsb2dfcHJvZFBvcHVwX2dhbGxlcnlfY2FsY01heFRodW1ic0NvdW50KGEsbCw2MCwxMCkpfXZhciBkPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGQpe3ZhciBvPWQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYnVsbGV0Iiksbj1kLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2J1bGxldFtkYXRhLXNsaWRlLWJ1bGxldC1mb3I9IicrZSsnIl0nKTtpZihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX19idWxsZXRfYWN0aXZlIik7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19idWxsZXRfYm9keSIpO2UmJmUucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWN1cnJlbnQiKX0pKSxyJiZyLnRodW1ic2J1bGxldEdhbGxlcnkmJmU+PWkmJmUhPXMrMXx8cz49aSYmMD09ZT9uPWQucXVlcnlTZWxlY3RvcignLnQtc2xkc19fYnVsbGV0W2RhdGEtc2xpZGUtYnVsbGV0LWZvcj0iJytpKyciXScpOjA9PWU/bj1kLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2J1bGxldFtkYXRhLXNsaWRlLWJ1bGxldC1mb3I9IicrcysnIl0nKTplPT1zKzEmJihuPWQucXVlcnlTZWxlY3RvcignLnQtc2xkc19fYnVsbGV0W2RhdGEtc2xpZGUtYnVsbGV0LWZvcj0iMSJdJykpLG4pe24uY2xhc3NMaXN0LmFkZCgidC1zbGRzX19idWxsZXRfYWN0aXZlIik7dmFyIGM9bi5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19idWxsZXRfYm9keSIpO2MmJmMuc2V0QXR0cmlidXRlKCJhcmlhLWN1cnJlbnQiLCEwKX19fWZ1bmN0aW9uIHRfc2xkc19BY3RpdmVTbGlkZSh0LGUscyl7dmFyIHI9dF9zbGRzX19nZXRSZWModCk7aWYocil7dmFyIGk9ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksYT1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW0iKSxsPXIucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSInK2UrJyJdJyksZD0hIWkmJmkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpLG89ci5xdWVyeVNlbGVjdG9yQWxsKCIudC12aWRlby1sYXp5bG9hZCIpO2lmKG8ubGVuZ3RoKXRfb25GdW5jTG9hZCgidF92aWRlb19fZ2V0UGxheWVyIiwoZnVuY3Rpb24oKXtvLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlO2lmKCJmYWxzZSIhPT10LmdldEF0dHJpYnV0ZSgiZGF0YS12aWRlb2xhenktbG9hZCIpKXt2YXIgcz10LmNsb3Nlc3QoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIik7aWYocyl7dmFyIHI9dF92aWRlb19fZ2V0UGxheWVyKHMpO3I/ci5wYXVzZSgpOnRfc2xkc19fcHJvY2Nlc3NWaWRlbyhzKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gdC5wYXVzZSgpfSkpLmNhdGNoKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKX19fSkpfSkpO2Vsc2V7dmFyIG49ci5xdWVyeVNlbGVjdG9yQWxsKCJpZnJhbWUiKSxjPXIucXVlcnlTZWxlY3RvckFsbCgidmlkZW8iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3Quc3JjJiYoLTEhPT10LnNyYy5pbmRleE9mKCImZW5hYmxlanNhcGk9MSIpJiZ0LmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoJ3siZXZlbnQiOiJjb21tYW5kIiwiZnVuYyI6InBhdXNlVmlkZW8iLCJhcmdzIjoiIn0nLCIqIiksLTE9PT10LnNyYy5pbmRleE9mKCJ2aW1lbyIpfHwtMT09PXQuc3JjLmluZGV4T2YoIiZhbXA7YXBpPTEiKSYmLTE9PT10LnNyYy5pbmRleE9mKCImYXBpPTEiKXx8dC5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCd7Im1ldGhvZCI6InBhdXNlIiwidmFsdWUiOiJ0cnVlIn0nLCIqIikpfSkpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYywoZnVuY3Rpb24odCl7dC5wYXVzZSgpfSkpfWlmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSwoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIiksdC5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpfSkpLDA9PWUmJiExPT09ZClyLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1bZGF0YS1zbGlkZS1pbmRleD0iJytzKyciXScpLmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbV9hY3RpdmUiKSxyLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJmYWxzZSIpO2Vsc2UgaWYoMD09ZSYmITA9PT1kKWw9ci5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IicrcysnIl0nKTtlbHNlIGlmKGU9PXMrMSYmITE9PT1kKXt2YXIgXz1yLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1bZGF0YS1zbGlkZS1pbmRleD0iMSJdJyk7XyYmKF8uY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtX2FjdGl2ZSIpLF8uc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsImZhbHNlIikpfWVsc2UgZT09cysxJiYhMD09PWQmJihsPXIucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSIxIl0nKSk7bCYmKGwuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtX2FjdGl2ZSIpLGwuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsImZhbHNlIikpLHdpbmRvdy50X3NsZHNfX2lzaU9TJiZ0X3NsZHNfX2hpZGVNb2JpbGVTbGlkZXMobCksdF9zbGRzX19zZXRUYWJpbmRleEZvckZvY3VzYWJsZUVsZW1lbnRzKHQpfX1mdW5jdGlvbiB0X3NsZHNfX3NldFRhYmluZGV4Rm9yRm9jdXNhYmxlRWxlbWVudHModCl7dmFyIGU9dF9zbGRzX19nZXRSZWModCk7aWYoZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIikscj1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIik7aWYocil7dmFyIGk9J2EsIGJ1dHRvbiwgaW5wdXQ6bm90KFt0eXBlPSJoaWRkZW4iXSksIHNlbGVjdCwgdGV4dGFyZWEsIHZpZGVvLCBpZnJhbWUnLGE9cy5xdWVyeVNlbGVjdG9yQWxsKGkpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSwoZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKX0pKTt2YXIgbD1yLnF1ZXJ5U2VsZWN0b3JBbGwoaSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsLChmdW5jdGlvbih0KXt0LnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCIwIil9KSl9fX1mdW5jdGlvbiB0X3NsZHNfU2xpZGVyV2lkdGgodCl7dmFyIGU9dF9zbGRzX19nZXRSZWModCk7aWYoZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIiKTtpZihzKXt2YXIgcj1nZXRDb21wdXRlZFN0eWxlKHMpLGk9cGFyc2VJbnQoci5wYWRkaW5nTGVmdCl8fDAsYT1wYXJzZUludChyLnBhZGRpbmdSaWdodCl8fDAsbD1zLmNsaWVudFdpZHRoLShpK2EpLGQ9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpLmxlbmd0aCxvPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLG47aWYoInRydWUiIT1vLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcCIpKXt2YXIgYz0wO28mJihjPW8uZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKSxvLnN0eWxlLndpZHRoPWwqZCsicHgiKSx3aW5kb3cuaW5uZXJXaWR0aDw9NjQwP2M9MTp3aW5kb3cuaW5uZXJXaWR0aDw9OTYwJiZjPjEmJihjPTIpO3ZhciBfPWM+MT9sL2M6bDtpZihfPjApe3ZhciB1PWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbSIpO28mJih1PW8ucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbSIpKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHUsKGZ1bmN0aW9uKHQpe3Quc3R5bGUud2lkdGg9XysicHgifSkpfX19fX1mdW5jdGlvbiB0X3NsZHNfU2xpZGVySGVpZ2h0KHQpe3ZhciBlPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGUpe3ZhciBzPWUucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbXMtd3JhcHBlcjpub3QoW2RhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0PSJmYWxzZSJdKScpO2lmKHMpe3ZhciByPXMuY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1mZWVkLWNvbnRhaW5lciIpLGk9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpLGE7aWYoaSl7dmFyIGw9cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5wYWRkaW5nVG9wKXx8MCxkPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoaSkucGFkZGluZ0JvdHRvbSl8fDA7YT1pLmNsaWVudEhlaWdodC0obCtkKX1hJiZzJiYocy5zdHlsZS5oZWlnaHQ9cj8iIjphKyJweCIpfX19ZnVuY3Rpb24gdF9zbGRzX1VwZGF0ZVNsaWRlckhlaWdodCh0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1zLXdyYXBwZXI6bm90KFtkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodD0iZmFsc2UiXSknKTtpZihzKXt2YXIgcj1zLmNsYXNzTGlzdC5jb250YWlucygianMtZmVlZC1jb250YWluZXIiKSxpPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbV9hY3RpdmUiKSxhO2lmKGkpe3ZhciBsPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoaSkucGFkZGluZ1RvcCl8fDAsZD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGkpLnBhZGRpbmdCb3R0b20pfHwwO2E9aS5jbGllbnRIZWlnaHQtKGwrZCl9MCE9PWEmJnMmJihzLnN0eWxlLmhlaWdodD1yPyIiOmErInB4Iil9fX1mdW5jdGlvbiB0X3NsZHNfU2xpZGVyQXJyb3dzSGVpZ2h0KHQpe3ZhciBlPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGUpe3ZhciBzPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbV9hY3RpdmUiKSxyPS9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxpLGE9MDtpZihzKXt2YXIgbDtzLnF1ZXJ5U2VsZWN0b3IoIltkYXRhLXNsaWRlci12aWRlby10eXBlXSIpJiZyJiYoYT00MCk7dmFyIGQ9cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShzKS5wYWRkaW5nVG9wKXx8MCxvPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUocykucGFkZGluZ0JvdHRvbSl8fDA7aT1zLmNsaWVudEhlaWdodC0oZCtvKS1hfXZhciBuPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYXJyb3dfd3JhcHBlciIpO2kmJm4ubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3Quc3R5bGUuaGVpZ2h0PWkrInB4Ijt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93Iik7ZSYmKGUuc3R5bGUubWFyZ2luVG9wPWEvMisicHgiKX0pKSx0X3NsZHNfZml4QXJyb3dzSW5DYXRhbG9nKGUscyxuLHIpfX1mdW5jdGlvbiB0X3NsZHNfVXBkYXRlU2xpZGVyQXJyb3dzSGVpZ2h0KHQpe3ZhciBlPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGUpe3ZhciBzPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbV9hY3RpdmUiKSxyPS9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxpLGE9MDtpZihzKXt2YXIgbDtzLnF1ZXJ5U2VsZWN0b3IoIltkYXRhLXNsaWRlci12aWRlby10eXBlXSIpJiZyJiYoYT00MCk7dmFyIGQ9cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShzKS5wYWRkaW5nVG9wKXx8MCxvPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUocykucGFkZGluZ0JvdHRvbSl8fDA7aT1zLmNsaWVudEhlaWdodC0oZCtvKS1hfXZhciBuPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYXJyb3dfd3JhcHBlciIpO2kmJm4ubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3Quc3R5bGUuaGVpZ2h0PWkrInB4Ijt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93Iik7ZSYmKGUuc3R5bGUubWFyZ2luVG9wPWEvMisicHgiKX0pKSx0X3NsZHNfZml4QXJyb3dzSW5DYXRhbG9nKGUscyxuLHIpfX1mdW5jdGlvbiB0X3NsZHNfZml4QXJyb3dzSW5DYXRhbG9nKHQsZSxzLHIpe2lmKGUmJnImJih0LmNsYXNzTGlzdC5jb250YWlucygidC1jYXRhbG9nX19yZWxldmFudHMtZ3JpZC1jb250Iil8fHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXN0b3JlX19yZWxldmFudHMtZ3JpZC1jb250IikpKXt2YXIgaT1lLnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0LWltZyIpO2lmKGkpe3ZhciBhPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGkpLGw9KHBhcnNlRmxvYXQoYS5tYXJnaW5Ub3ApfHwwKSsocGFyc2VGbG9hdChhLm1hcmdpbkJvdHRvbSl8fDApLGQ9TWF0aC5jZWlsKGkub2Zmc2V0SGVpZ2h0K2wpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwocywoZnVuY3Rpb24odCl7dmFyIGU9dC5vZmZzZXRIZWlnaHQscz0oZC1lKS8yO3Quc3R5bGUudG9wPXMrInB4Iix0LnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWSgwKSJ9KSl9fX1mdW5jdGlvbiB0X3NsZHNfaW5pdEF1dG9QbGF5KHQsZSxzLHIpe3ZhciBpPSJvYmplY3QiPT10eXBlb2YgdCxhPWk/dFswXTpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmVjIit0KTtpZihhKXt2YXIgbD1hLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHMiKSxkPWEucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKGQpe3ZhciBvPXBhcnNlRmxvYXQoZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRpbWVvdXQiKSksbj0iIixjPWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pbnRlcnZhbC1pZCIpLF89ZSx1O2lmKGMmJmNsZWFySW50ZXJ2YWwoYyksInRydWUiIT09ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3AiKSl7dmFyIHA7IS9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmbCYmKGwuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwoZnVuY3Rpb24oKXtkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZCIsInllcyIpfSkpLGwuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLChmdW5jdGlvbigpeyJ5IiE9PWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkLWJ5LXZpZGVvIikmJmQuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwiIil9KSkpO3ZhciBmPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldCxtPWYrYS5vZmZzZXRIZWlnaHQseSx2O3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7Zj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQsbT1mK2Eub2Zmc2V0SGVpZ2h0fSkpKSx2b2lkIDAhPT1kb2N1bWVudC5oaWRkZW4/KHk9ImhpZGRlbiIsdj0idmlzaWJpbGl0eWNoYW5nZSIpOnZvaWQgMCE9PWRvY3VtZW50Lm1zSGlkZGVuPyh5PSJtc0hpZGRlbiIsdj0ibXN2aXNpYmlsaXR5Y2hhbmdlIik6dm9pZCAwIT09ZG9jdW1lbnQud2Via2l0SGlkZGVuJiYoeT0id2Via2l0SGlkZGVuIix2PSJ3ZWJraXR2aXNpYmlsaXR5Y2hhbmdlIiksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih2LChmdW5jdGlvbigpe2lmKGRvY3VtZW50W3ldKWQuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwieWVzIik7ZWxzZXt2YXIgdD1nZXRDb21wdXRlZFN0eWxlKGEpLmRpc3BsYXksZT13aW5kb3cucGFnZVlPZmZzZXQscz1lK3dpbmRvdy5pbm5lckhlaWdodDtmPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldCwobT1mK2Eub2Zmc2V0SGVpZ2h0KT5lJiZmPHMmJiJub25lIiE9PXQmJiJ5IiE9PWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkLWJ5LXZpZGVvIikmJmQuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwiIil9fSksITEpLDE9PT1hLmxlbmd0aCYmd2luZG93LmJpbmQoInNjcm9sbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2YXIgdD1nZXRDb21wdXRlZFN0eWxlKGEpLmRpc3BsYXksZT13aW5kb3cucGFnZVlPZmZzZXQscz1lK3dpbmRvdy5pbm5lckhlaWdodDsibm9uZSIhPT10PyhmPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldCwobT1mK2Eub2Zmc2V0SGVpZ2h0KT5lJiZmPHMmJiJ5IiE9PWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkLWJ5LXZpZGVvIik/ZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCIiKToiIj09PWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIikmJmQuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwieWVzIikpOml8fGQuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwieWVzIil9KSkpO3ZhciBnPXNldEludGVydmFsKChmdW5jdGlvbigpe3ZhciBlPWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiksaT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItYXV0b3BsYXktaWdub3JlLWhvdmVyIiksbD1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG91Y2giKSxvPXRfc2xkc19nZXRDdXJyZW50VHJhbnNsYXRlKGEpOyJ5ZXMiIT1lJiYieWVzIiE9aSYmInllcyIhPWwmJigiZmFsc2UiPT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpJiZfPT1zP189czpfKyssZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsXyksXyE9cysxJiYwIT1ffHwobj0ieWVzIiksdF9zbGlkZU1vdmVXaXRob3V0QW5pbWF0aW9uKHQsITAscixvKSx0X3NsZHNfdXBkYXRlU2xpZGVyKHQpLCJ5ZXMiPT1uJiYoXz09cysxJiYoXz0xKSwwPT1fJiYoXz1zKSxkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixfKSksZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIixuKSl9KSxvKTtkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaW50ZXJ2YWwtaWQiLGcpfX19fWZ1bmN0aW9uIHRfc2xkc19wb3NpdGlvbkFycm93cyh0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93X2NvbnRhaW5lci1vdXRzaWRlIikscj1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW0iKTtpZihyKXt2YXIgaT1yLm9mZnNldFdpZHRoLGE9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1sZWZ0Iik/ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1sZWZ0Iikub2Zmc2V0V2lkdGg6MCxsPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ctcmlnaHQiKT9lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93LXJpZ2h0Iikub2Zmc2V0V2lkdGg6MDtzJiYocy5zdHlsZS5tYXhXaWR0aD1hK2wraSsxMjArInB4Iil9fX1mdW5jdGlvbiB0X3NsZHNfaW5pdFNsaWRlclN3aXBlKHQsZSxzLHIpe3ZhciBpPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGkpe3ZhciBhPWkucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fbWFpbiIpO2lmKGEpe3ZhciBsPWkucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKGwpe3ZhciBkLG89ITEsbj0hMSxjLF87aWYoInRydWUiIT09bC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3AiKSlpZigidHJ1ZSIhPT1sLmdldEF0dHJpYnV0ZSgiZGF0YS1zd2lwZXItaW5pdGlhbGl6ZWQiKSl7ZGVsZXRlIEhhbW1lci5kZWZhdWx0cy5jc3NQcm9wcy51c2VyU2VsZWN0LHdpbmRvdy5oYW1tZXI9bmV3IEhhbW1lcihhLHtkb21FdmVudHM6ITAsaW5wdXRDbGFzczpIYW1tZXIuVG91Y2hJbnB1dCxyZWNvZ25pemVyczpbW0hhbW1lci5QYW4se2RpcmVjdGlvbjpIYW1tZXIuRElSRUNUSU9OX0hPUklaT05UQUx9XV19KSxsLnNldEF0dHJpYnV0ZSgiZGF0YS1zd2lwZXItaW5pdGlhbGl6ZWQiLCJ0cnVlIik7dmFyIHU9ZnVuY3Rpb24gdChlKXt3aW5kb3cucGFnZVlPZmZzZXQ+aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20rd2luZG93LnBhZ2VZT2Zmc2V0fHx3aW5kb3cucGFnZVlPZmZzZXQrZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDxpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ/bC5zZXRBdHRyaWJ1dGUoZSwieWVzIik6InkiIT09bC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iKSYmbC5zZXRBdHRyaWJ1dGUoZSwiIil9LHA9Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQ/ImRhdGEtc2xpZGVyLXRvdWNoIjoiZGF0YS1zbGlkZXItc3RvcHBlZCIsZjtpZigiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiaW4gd2luZG93KW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24odCl7dmFyIGU9dFswXTtsLnNldEF0dHJpYnV0ZShwLGUuaXNJbnRlcnNlY3Rpbmc/IiI6InllcyIpfSkpLm9ic2VydmUoaSk7ZWxzZSB1KHApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLChmdW5jdGlvbigpe289ITAsY2xlYXJUaW1lb3V0KGQpLGQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt1KHApLG89ITF9KSwyNTApfSkpO2lmKDEhPWUpe3ZhciBtPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIW58fChlLnByZXZlbnREZWZhdWx0KCksITEpfSx5PWkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIiksdj10X3NsZHNfZ2V0RXZlbnRzRm9yWmVyb0Jsb2NrKCksZz12Lm1vdmVTbGlkZVN0YXJ0RXZlbnQsYj12Lm1vdmVTbGlkZUVuZEV2ZW50O3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLG0se3Bhc3NpdmU6ITF9KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixtLHtwYXNzaXZlOiExfSksd2luZG93LmhhbW1lci5vbigicGFuIiwoZnVuY3Rpb24oZSl7aWYobylyZXR1cm4hMTtuPSEwLHkmJmkuZGlzcGF0Y2hFdmVudChnKTt2YXIgcz1pLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxhPXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKXx8MCxsPWE+MSxkPWw/aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIgLnQtc2xkc19faXRlbSIpLm9mZnNldFdpZHRoOmkucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIikub2Zmc2V0V2lkdGgsYz1wYXJzZUZsb2F0KHMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiKSksXz1wYXJzZUZsb2F0KHMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpKSx1PSIiLHA9ZS5kZWx0YVgsZj0xMDAvXyplLmRlbHRhWC93aW5kb3cuaW5uZXJXaWR0aCxtPTMwLHY7aWYoInRydWUiPT09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3AiKSlyZXR1cm4hMTtpZihzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG91Y2giLCJ5ZXMiKSx0X3NsZHNfc2Nyb2xsSW1hZ2VzKHQsZCpjLXApLGUuaXNGaW5hbCl7aWYoZS52ZWxvY2l0eVg+LjQpImZhbHNlIj09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSYmMT09Yz9jPTE6Yy0tLHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLGMpLDA9PWMmJih1PSJ5ZXMiKSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiLHUpLHRfc2xpZGVNb3ZlKHQsITEscik7ZWxzZSBpZihlLnZlbG9jaXR5WDwtLjQpe2lmKCJmYWxzZSI9PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikmJihjPT1ffHxsJiZjPT1fLWErMSkpYz1sP18tYTpfO2Vsc2V7dmFyIGI9aS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpLGg9YltiLmxlbmd0aC0xXSxBPXBhcnNlRmxvYXQoaC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiKSwxMCk7aWYoQTxfJiZjPT1BKXt2YXIgUz1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtTLmluaXRFdmVudCgiZmVlZHNMYXN0U2xpZGUiLCEwLCEwKSxzLmRpc3BhdGNoRXZlbnQoUyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZmVlZHNMb2FkU2xpZGUiLChmdW5jdGlvbigpe3Rfc2xkc191cGRhdGVTbGlkZXIodCl9KSl9YysrfXMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLGMpLGM9PV8rMSYmKHU9InllcyIpLHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIsdSksdF9zbGlkZU1vdmUodCwhMSxyKX1lbHNlIGY8PS0zMC9fPygiZmFsc2UiPT1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpJiYoYz09X3x8bCYmYz09Xy1hKzEpP2M9bD9fLWE6XzpjKysscy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsYyksYz09XysxJiYodT0ieWVzIikscy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIix1KSx0X3NsaWRlTW92ZSh0LCExLHIpKTpmPj1tL18/KCJmYWxzZSI9PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikmJjE9PWM/Yz0xOmMtLSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixjKSwwPT1jJiYodT0ieWVzIikscy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIix1KSx0X3NsaWRlTW92ZSh0LCExLHIpKTp0X3NsaWRlTW92ZSh0LCExLHIpO3Muc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3VjaCIsIiIpLG49ITF9cmV0dXJuITB9KSksd2luZG93LmhhbW1lci5vbigicGFuZW5kIiwoZnVuY3Rpb24oKXt5JiZpLmRpc3BhdGNoRXZlbnQoYiksdF9zbGlkZU1vdmUodCwhMSxyKSxuPSExfSkpfX19fX19ZnVuY3Rpb24gdF9zbGRzX2dldEN1cnJlbnRUcmFuc2xhdGUodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYoZSl7dmFyIHM9Z2V0Q29tcHV0ZWRTdHlsZShlKS50cmFuc2Zvcm07aWYodm9pZCAwIT09cyYmIiIhPT1zKXt2YXIgcj1zLm1hdGNoKC9cZCsvZyk7aWYobnVsbCE9PXIpcmV0dXJuIHBhcnNlSW50KHJbMF0sMTApfX19ZnVuY3Rpb24gdF9zbGRzX2NoYW5nZUltYWdlVXJsKHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikscz1lJiYieWVzIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWxhenkiKSxyPXRfc2xkc19fZ2V0UmVjKHQpLGk7ciYmKGk9cz9yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2ltZzpub3QoW2RhdGEtb3JpZ2luYWxdKSIpOnIucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faW1nIiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS1zcmMiKTtlJiYodC5zZXRBdHRyaWJ1dGUoInNyYyIsZSksdC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtc3JjIikpfSkpKX1mdW5jdGlvbiB0X3NsZHNfb25IYW1tZXJMb2FkKHQsZSxzKXtpZigiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93W3RdKWUoKTtlbHNlIHZhciByPURhdGUubm93KCksaT1zZXRUaW1lb3V0KChmdW5jdGlvbiBhKCl7dmFyIGw9RGF0ZS5ub3coKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygd2luZG93W3RdKXtpZihsLXI+N2UzKXRocm93IG5ldyBFcnJvcih0KyIgaXMgdW5kZWZpbmVkIik7aT1zZXRUaW1lb3V0KGEsc3x8MTAwKX1lbHNlIGUoKX0pKX1mdW5jdGlvbiB0X3NsZHNfZmFkZU91dCh0LGUscyl7aWYoIm5vbmUiIT09dC5zdHlsZS5kaXNwbGF5JiYhdC5nZXRBdHRyaWJ1dGUoImRhdGEtZmFkZW91dC10aW1lb3V0Iikpe3ZhciByPTEsaT1wYXJzZUludChlKSxhLGw9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7dC5zdHlsZS5vcGFjaXR5PXIsKHItPS4xKTw9LjEmJihjbGVhckludGVydmFsKGwpLHQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLWZhZGVvdXQtdGltZW91dCIpLHQuc3R5bGUuZGlzcGxheT0ibm9uZSIsImZ1bmN0aW9uIj09dHlwZW9mIHMmJnMoKSl9KSxpPjA/aS8xMDo0MCk7dC5zZXRBdHRyaWJ1dGUoImRhdGEtZmFkZW91dC10aW1lb3V0IixsKX19ZnVuY3Rpb24gdF9zbGRzX2ZhZGVJbih0LGUscyl7aWYoKCIxIiE9PWdldENvbXB1dGVkU3R5bGUodCkub3BhY2l0eSYmIiIhPT1nZXRDb21wdXRlZFN0eWxlKHQpLm9wYWNpdHl8fCJub25lIj09PWdldENvbXB1dGVkU3R5bGUodCkuZGlzcGxheSkmJiF0LmdldEF0dHJpYnV0ZSgiZGF0YS1mYWRlaW4tdGltZW91dCIpKXt2YXIgcj0wLGk9cGFyc2VJbnQoZSksYT1pPjA/aS8xMDo0MDt0LnN0eWxlLm9wYWNpdHk9cix0LnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt2YXIgbD1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXt0LnN0eWxlLm9wYWNpdHk9ciwocis9LjEpPj0xJiYoY2xlYXJJbnRlcnZhbChsKSx0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1mYWRlaW4tdGltZW91dCIpLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiZzKCkpfSksYSk7dC5zZXRBdHRyaWJ1dGUoImRhdGEtZmFkZWluLXRpbWVvdXQiLGwpfX1mdW5jdGlvbiB0X3NsZHNfcmFuZG9tU29ydEVsZW1lbnRzKHQpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpO2lmKCFlLmxlbmd0aClyZXR1cm5bXTtlLnNvcnQoKGZ1bmN0aW9uKCl7cmV0dXJuLjUtTWF0aC5yYW5kb20oKX0pKTt2YXIgcz10WzBdLnBhcmVudE5vZGU7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7cy5hcHBlbmRDaGlsZCh0KX0pKSxlfWZ1bmN0aW9uIHRfc2xkc19fcHJvY2Nlc3NWaWRlbyh0KXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGUscyl7dF9vbkZ1bmNMb2FkKCJ0X3ZpZGVvX19jcmVhdGVQbGF5ZXIiLChmdW5jdGlvbigpe3RfdmlkZW9fX2NyZWF0ZVBsYXllcih0KS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gZSh0KX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHModCl9KSl9KSl9KSl9ZnVuY3Rpb24gdF9zbGRzX2dldEV2ZW50c0Zvclplcm9CbG9jaygpe3ZhciB0LGU7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD8odD1uZXcgQ3VzdG9tRXZlbnQoInRpbGRhU2xkc01vdmVTbGlkZVN0YXJ0IiksZT1uZXcgQ3VzdG9tRXZlbnQoInRpbGRhU2xkc01vdmVTbGlkZUVuZCIpKTooKHQ9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IikpLmluaXRDdXN0b21FdmVudCgidGlsZGFTbGRzTW92ZVNsaWRlU3RhcnQiLCEwLCEwKSwoZT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSkuaW5pdEN1c3RvbUV2ZW50KCJ0aWxkYVNsZHNNb3ZlU2xpZGVFbmQiLCEwLCEwKSkse21vdmVTbGlkZVN0YXJ0RXZlbnQ6dCxtb3ZlU2xpZGVFbmRFdmVudDplfX1mdW5jdGlvbiB0X3NsZHNfX2dldFJlYyh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3JlYyIrdCk6dCBpbnN0YW5jZW9mIEVsZW1lbnQ/dDp0WzBdfWZ1bmN0aW9uIHRfdHJpZ2dlckV2ZW50KHQsZSl7dmFyIHM7ZG9jdW1lbnQuY3JlYXRlRXZlbnQ/KHM9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkhUTUxFdmVudHMiKSkuaW5pdEV2ZW50KGUsITAsITEpOmRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0JiYoKHM9ZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKSkuZXZlbnRUeXBlPWUpLHMuZXZlbnROYW1lPWUsdC5kaXNwYXRjaEV2ZW50P3QuZGlzcGF0Y2hFdmVudChzKTp0LmZpcmVFdmVudD90LmZpcmVFdmVudCgib24iK3MuZXZlbnRUeXBlLHMpOnRbZV0/dFtlXSgpOnRbIm9uIitlXSYmdFsib24iK2VdKCl9d2luZG93LnRfc2xkc19faXNpT1M9L2lQaG9uZXxpUGFkfGlQb2QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHxuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1hY2ludG9zaCIpJiYib250b3VjaGVuZCJpbiBkb2N1bWVudDt2YXIgREVCVUc9ITE7ZnVuY3Rpb24gc2V0SW1wb3J0YW50U3R5bGUodCxlLHMpe3Quc3R5bGUuc2V0UHJvcGVydHkoZSxzLCJpbXBvcnRhbnQiKX1mdW5jdGlvbiBnZXRHYWxsZXJ5Q29udGFpbmVyKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtcG9wdXAiKTtpZih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LWNhdGFsb2dfX3JlbGV2YW50c19fY29udGFpbmVyLCAudC1zdG9yZV9fcmVsZXZhbnRzX19jb250YWluZXIiKTtpZihlKXJldHVybiBlfXJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1jYXRhbG9nX19yZWxldmFudHNfX2NvbnRhaW5lciwgLnQtc3RvcmVfX3JlbGV2YW50c19fY29udGFpbmVyIil9ZnVuY3Rpb24gYXBwbHlCYXNlU3R5bGVzKHQpe2Zvcih2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1wcm9kdWN0Iikscz0wO3M8ZS5sZW5ndGg7cysrKWZvcih2YXIgcixpPWVbc10ucXVlcnlTZWxlY3RvckFsbCgiLnQtY2F0YWxvZ19fY2FyZF9fdGV4dHdyYXBwZXIsIC50LXN0b3JlX19jYXJkX190ZXh0d3JhcHBlciIpLGE9MDthPGkubGVuZ3RoO2ErKyl7dmFyIGw9aVthXTtzZXRJbXBvcnRhbnRTdHlsZShsLCJtYXJnaW4tYm90dG9tIiwiMHB4Iiksc2V0SW1wb3J0YW50U3R5bGUobCwibWFyZ2luLXRvcCIsImF1dG8iKSxzZXRJbXBvcnRhbnRTdHlsZShsLCJqdXN0aWZ5LWNvbnRlbnQiLCJmbGV4LXN0YXJ0Iik7dmFyIGQ9bC5xdWVyeVNlbGVjdG9yKCIuanMtY2F0YWxvZy1wcm9kLW5hbWUsIC5qcy1zdG9yZS1wcm9kLW5hbWUiKTtkJiYoc2V0SW1wb3J0YW50U3R5bGUoZCwiZGlzcGxheSIsIi13ZWJraXQtYm94Iiksc2V0SW1wb3J0YW50U3R5bGUoZCwiLXdlYmtpdC1ib3gtb3JpZW50IiwidmVydGljYWwiKSxzZXRJbXBvcnRhbnRTdHlsZShkLCItd2Via2l0LWxpbmUtY2xhbXAiLCIyIiksc2V0SW1wb3J0YW50U3R5bGUoZCwib3ZlcmZsb3ciLCJoaWRkZW4iKSxzZXRJbXBvcnRhbnRTdHlsZShkLCJ0ZXh0LW92ZXJmbG93IiwiZWxsaXBzaXMiKSxzZXRJbXBvcnRhbnRTdHlsZShkLCJtYXgtaGVpZ2h0IiwiY2FsYygxLjVlbSAqIDIpIiksc2V0SW1wb3J0YW50U3R5bGUoZCwicGFkZGluZy1ib3R0b20iLCJ1bnNldCIpKTt2YXIgbz1sLnF1ZXJ5U2VsZWN0b3IoIi5qcy1jYXRhbG9nLXByb2QtZGVzY3IsIC5qcy1zdG9yZS1wcm9kLWRlc2NyIik7byYmKHNldEltcG9ydGFudFN0eWxlKG8sImRpc3BsYXkiLCItd2Via2l0LWJveCIpLHNldEltcG9ydGFudFN0eWxlKG8sIi13ZWJraXQtYm94LW9yaWVudCIsInZlcnRpY2FsIiksc2V0SW1wb3J0YW50U3R5bGUobywiLXdlYmtpdC1saW5lLWNsYW1wIiwiMSIpLHNldEltcG9ydGFudFN0eWxlKG8sIm92ZXJmbG93IiwiaGlkZGVuIiksc2V0SW1wb3J0YW50U3R5bGUobywidGV4dC1vdmVyZmxvdyIsImVsbGlwc2lzIiksc2V0SW1wb3J0YW50U3R5bGUobywicGFkZGluZy1ib3R0b20iLCJ1bnNldCIpKX1ERUJVRyYmY29uc29sZS5pbmZvKCLQkdCw0LfQvtCy0YvQtSDRgdGC0LjQu9C4INC/0YDQuNC80LXQvdC10L3Riy4iKX1mdW5jdGlvbiBnZXRSZWZlcmVuY2VIZWlnaHQoKXt2YXIgdD1nZXRHYWxsZXJ5Q29udGFpbmVyKCk7aWYoIXQpcmV0dXJuIDA7dC5vZmZzZXRIZWlnaHQ7Zm9yKHZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QiKSxzPTA7czxlLmxlbmd0aDtzKyspe3ZhciByPWVbc107aWYoIm5vbmUiIT09d2luZG93LmdldENvbXB1dGVkU3R5bGUocikuZGlzcGxheSYmMCE9PXIub2Zmc2V0SGVpZ2h0JiZyLnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0LWltZyIpKXt2YXIgaT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtyZXR1cm4gREVCVUcmJmNvbnNvbGUuaW5mbygi0J7Qv9C+0YDQvdCw0Y8g0LrQsNGA0YLQvtGH0LrQsCDQvdCw0LnQtNC10L3QsC4g0JLRi9GB0L7RgtCwOiIsaSksaX19cmV0dXJuIERFQlVHJiZjb25zb2xlLmluZm8oItCd0LUg0L3QsNC50LTQtdC90LAg0LLQuNC00LjQvNCw0Y8g0LrQsNGA0YLQvtGH0LrQsCDRgSDQuNC30L7QsdGA0LDQttC10L3QuNC10LwuIiksMH1mdW5jdGlvbiB1cGRhdGVOb0ltYWdlQ2FyZEhlaWdodHMoKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7dmFyIHQ9Z2V0UmVmZXJlbmNlSGVpZ2h0KCk7aWYoISh0PD0wKSl7dmFyIGU9Z2V0R2FsbGVyeUNvbnRhaW5lcigpO2lmKGUpZm9yKHZhciBzPWUucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QiKSxyPTA7cjxzLmxlbmd0aDtyKyspe3ZhciBpPXNbcl07aS5xdWVyeVNlbGVjdG9yKCIuanMtcHJvZHVjdC1pbWciKT9pLnN0eWxlLmhlaWdodD0iIjooaS5zdHlsZS5jc3NUZXh0Kz0iOyBoZWlnaHQ6ICIrdCsicHggIWltcG9ydGFudDsiLERFQlVHJiZjb25zb2xlLmluZm8oItCj0YHRgtCw0L3QvtCy0LvQtdC90LAg0LLRi9GB0L7RgtCwINC00LvRjyDQutCw0YDRgtC+0YfQutC4INCx0LXQtyDQuNC30L7QsdGA0LDQttC10L3QuNGPOiIsdCkpfX19KSl9ZnVuY3Rpb24gYXR0YWNoSW1hZ2VMb2FkTGlzdGVuZXJzKCl7dmFyIHQ9Z2V0R2FsbGVyeUNvbnRhaW5lcigpO2lmKHQpZm9yKHZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QtaW1nIikscz0wO3M8ZS5sZW5ndGg7cysrKXt2YXIgcj1lW3NdO3IuY29tcGxldGV8fHIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7REVCVUcmJmNvbnNvbGUuaW5mbygi0JjQt9C+0LHRgNCw0LbQtdC90LjQtSDQt9Cw0LPRgNGD0LfQuNC70L7RgdGMLCDQvtCx0L3QvtCy0LvRj9C10Lwg0LLRi9GB0L7RgtGDIiksdXBkYXRlTm9JbWFnZUNhcmRIZWlnaHRzKCl9KSl9fWZ1bmN0aW9uIGFkZEVtcHR5RGVzY3JQbGFjZWhvbGRlcih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi5qcy1jYXRhbG9nLXByb2QtZGVzY3IudC1jYXRhbG9nX19jYXJkX19kZXNjciwgLmpzLXN0b3JlLXByb2QtZGVzY3IudC1zdG9yZV9fY2FyZF9fZGVzY3IiKTtpZihlKXt2YXIgcz1nZXRDb21wdXRlZFN0eWxlKGUpLHI9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQsaT1zLnBhZGRpbmdUb3A7dC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtcHJvZHVjdCIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCF0LnF1ZXJ5U2VsZWN0b3IoIi5qcy1jYXRhbG9nLXByb2QtZGVzY3IudC1jYXRhbG9nX19jYXJkX19kZXNjciwgLmpzLXN0b3JlLXByb2QtZGVzY3IudC1zdG9yZV9fY2FyZF9fZGVzY3IiKSl7dmFyIHM9dC5xdWVyeVNlbGVjdG9yKCIudC1jYXRhbG9nX19jYXJkX190ZXh0d3JhcHBlciwgLnQtc3RvcmVfX2NhcmRfX3RleHR3cmFwcGVyIiksYT1zJiZzLnF1ZXJ5U2VsZWN0b3IoIi5qcy1jYXRhbG9nLXByaWNlLXdyYXBwZXIsIC5qcy1zdG9yZS1wcmljZS13cmFwcGVyIik7aWYocyYmYSl7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5jbGFzc05hbWU9ZS5jbGFzc05hbWUsbC5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IixyKyJweCIsImltcG9ydGFudCIpLGwuc3R5bGUuc2V0UHJvcGVydHkoInBhZGRpbmctdG9wIixpLCJpbXBvcnRhbnQiKSxsLnN0eWxlLnNldFByb3BlcnR5KCJtYXJnaW4tYm90dG9tIiwiMHB4IiwiaW1wb3J0YW50IiksbC5zdHlsZS5zZXRQcm9wZXJ0eSgiZGlzcGxheSIsIi13ZWJraXQtYm94IiwiaW1wb3J0YW50IiksbC5zdHlsZS5zZXRQcm9wZXJ0eSgiLXdlYmtpdC1ib3gtb3JpZW50IiwidmVydGljYWwiLCJpbXBvcnRhbnQiKSxsLnN0eWxlLnNldFByb3BlcnR5KCItd2Via2l0LWxpbmUtY2xhbXAiLCIxIiwiaW1wb3J0YW50IiksbC5zdHlsZS5zZXRQcm9wZXJ0eSgib3ZlcmZsb3ciLCJoaWRkZW4iLCJpbXBvcnRhbnQiKSxsLnN0eWxlLnNldFByb3BlcnR5KCJ0ZXh0LW92ZXJmbG93IiwiZWxsaXBzaXMiLCJpbXBvcnRhbnQiKSxzLmluc2VydEJlZm9yZShsLGEpfX19KSl9fWZ1bmN0aW9uIGluaXRHYWxsZXJ5KCl7dmFyIHQ9Z2V0R2FsbGVyeUNvbnRhaW5lcigpO2lmKHQpe3QucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXN0eWxlcy1hcHBsaWVkIiksYXBwbHlCYXNlU3R5bGVzKHQpLHQuZGF0YXNldC5zdHlsZXNBcHBsaWVkPSJ0cnVlIixhZGRFbXB0eURlc2NyUGxhY2Vob2xkZXIodCksREVCVUcmJmNvbnNvbGUuaW5mbygi0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0LPQsNC70LXRgNC10Lgg0LfQsNCy0LXRgNGI0LXQvdCwLiIpO2Zvcih2YXIgZT1bNTAwLDFlMywxNTAwXSxzPTA7czxlLmxlbmd0aDtzKyspe3ZhciByO3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7YXR0YWNoSW1hZ2VMb2FkTGlzdGVuZXJzKCksdXBkYXRlTm9JbWFnZUNhcmRIZWlnaHRzKCl9KSxlW3NdKX19ZWxzZSBERUJVRyYmY29uc29sZS5pbmZvKCLQmtC+0L3RgtC10LnQvdC10YAg0LPQsNC70LXRgNC10Lgg0L3QtSDQvdCw0LnQtNC10L0uIil9ZnVuY3Rpb24gb2JzZXJ2ZVBvcHVwKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtcG9wdXAiKSxlO3QmJigiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiaW4gd2luZG93P25ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24odCxlKXtmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIHI7aWYodFtzXS5pc0ludGVyc2VjdGluZyl7REVCVUcmJmNvbnNvbGUuaW5mbygi0J/QvtC/0LDQvyDQstC40LTQuNC8LiDQmNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyDQs9Cw0LvQtdGA0LXQuCDRh9C10YDQtdC3IDE1MDAg0LzRgSIpLGUuZGlzY29ubmVjdCgpLHNldFRpbWVvdXQoaW5pdEdhbGxlcnksMTUwMCk7YnJlYWt9fX0pKS5vYnNlcnZlKHQpOnNldFRpbWVvdXQoaW5pdEdhbGxlcnksMTUwMCkpfWZ1bmN0aW9uIG9uUmVzaXplKCl7REVCVUcmJmNvbnNvbGUuaW5mbygiUmVzaXplIOKAkyDQvtCx0L3QvtCy0LvQtdC90LjQtSDQstGL0YHQvtGC0Ysg0LrQsNGA0YLQvtGH0LXQuiIpLHVwZGF0ZU5vSW1hZ2VDYXJkSGVpZ2h0cygpfWZ1bmN0aW9uIG9uUG9wc3RhdGUoKXtERUJVRyYmY29uc29sZS5pbmZvKCJQb3BzdGF0ZSDigJMg0LjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0LPQsNC70LXRgNC10LgiKSxzZXRUaW1lb3V0KGluaXRHYWxsZXJ5LDUwMCl9ZnVuY3Rpb24gb25QYWdlc2hvdyh0KXt0LnBlcnNpc3RlZCYmKERFQlVHJiZjb25zb2xlLmluZm8oIlBhZ2VzaG93ICjQuNC3INC60Y3RiNCwKSDigJMg0LjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0LPQsNC70LXRgNC10LgiKSxpbml0R2FsbGVyeSgpKX1mdW5jdGlvbiBvbldpbmRvd0xvYWQoKXtpbml0R2FsbGVyeSgpLG9ic2VydmVQb3B1cCgpfWlmKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLG9uUmVzaXplKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLG9uUG9wc3RhdGUpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwYWdlc2hvdyIsb25QYWdlc2hvdyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLG9uV2luZG93TG9hZCksZG9jdW1lbnQuYm9keSYmIk11dGF0aW9uT2JzZXJ2ZXIiaW4gd2luZG93KXt2YXIgZG9tT2JzZXJ2ZXI9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKCl7aW5pdEdhbGxlcnkoKX0pKTtkb21PYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9dmFyIHBvbGxDb3VudD0wLHBvbGxJbnRlcnZhbD1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtpbml0R2FsbGVyeSgpLCsrcG9sbENvdW50Pj0yMCYmY2xlYXJJbnRlcnZhbChwb2xsSW50ZXJ2YWwpfSksNTAwKTsKCmZ1bmN0aW9uIHQzOTZfX3BhcnNlR2xvYmFsU3R5bGVDU1NWYXIoZSl7dHJ5e3ZhciB0LHI9L3ZhclwoKC0tdWMtKFteLV0rKS0oW14tXSspLShbXixdKykpLFxzPyguKilcKS8uZXhlYyhlKTtpZighcilyZXR1cm47dmFyIGw9clswXSxhPXJbMV0sbz1yWzJdLHM9clszXSxfPXJbNF0sbj1yWzVdLGksZDtpZighKGwmJm8mJnMmJl8mJm4pKXJldHVybjtyZXR1cm57cGFyZW50OntpZDpfLHR5cGU6b30sZmFsbGJhY2s6d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZShhKXx8bixmaWVsZDpzfX1jYXRjaChjKXtjb25zb2xlLmVycm9yKCJFcnJvciB0cnlpbmcgdG8gcGFyc2UgQ1NTIFZhcmlhYmxlIil9fWZ1bmN0aW9uIHQzOTZfX2hleDJyZ2JhKGUsdCl7aWYoIWUpcmV0dXJuITE7dmFyIHI9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihlKTtyJiYoZT1yLmZhbGxiYWNrKTt2YXIgbD1lLnJlcGxhY2UoLyMvLCIiKTtpZigzPT09bC5sZW5ndGgpe3ZhciBhPWxbMF0sbz1sWzFdLHM9bFsyXTtlPSIjIithK2ErbytvK3Mrc312YXIgXz1wYXJzZUludChlLnN1YnN0cmluZygxKSwxNiksbixpLGQ7cmV0dXJuWygxNjcxMTY4MCZfKT4+MTYsKDY1MjgwJl8pPj44LDI1NSZfLHBhcnNlRmxvYXQodCldfWZ1bmN0aW9uIHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20oZSl7dmFyIHQ9WyJnYWxsZXJ5Il0scj1lLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTtyZXR1cm4gdC5pbmNsdWRlcyhyKX1mdW5jdGlvbiB0Mzk2X19pc0ZsZXgoZSl7dmFyIHQ9ZS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZsZXgiKSxyPWUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cC1mbGV4Iik7cmV0dXJuIHR8fHJ9ZnVuY3Rpb24gdDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2lmKGUpe3ZhciB0PVsiLnQ5NTFfX3NpZGViYXJfc3RpY2t5IiwiLnQxMjA2X19jb250ZW50X3N0aWNreSIsIi50NzU0X19jb2xfZml4ZWQiLCIudDc3Nl9fY29sX2ZpeGVkIiwiLnQ3ODZfX2NvbF9maXhlZCIsIi50LXN0b3JlX19wcm9kLXBvcHVwX19jb2xfZml4ZWQiLCIudC1jYXRhbG9nX19zaWRlYmFyX3N0aWNreSJdO3QzOTZfX2dlbmVyYXRlT3ZlcmZsb3dTdHlsZSgpO3ZhciByPUJvb2xlYW4oZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0LmpvaW4oIiwgIikpKTtlLmNsYXNzTGlzdC5yZW1vdmUoInQtcmVjb3Jkc19fb3ZlcmZsb3ctY2xpcCIsInQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIiksZS5jbGFzc0xpc3QuYWRkKHI/InQtcmVjb3Jkc19fb3ZlcmZsb3ctY2xpcCI6InQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIil9fWZ1bmN0aW9uIHQzOTZfX2dlbmVyYXRlT3ZlcmZsb3dTdHlsZSgpe2lmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidDM5Nl9fb3ZlcmZsb3ctc3R5bGVzIikpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7ZS5pZD0idDM5Nl9fb3ZlcmZsb3ctc3R5bGVzIixlLmlubmVySFRNTD0iLnQtcmVjb3Jkc19fb3ZlcmZsb3ctY2xpcCB7IG92ZXJmbG93OiBjbGlwOyB9XG5cdFx0XHRcdFx0XHQudC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4geyBvdmVyZmxvdzogaGlkZGVuOyB9Iixkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUpfX1mdW5jdGlvbiB0Mzk2X19nZXRBcnRib2FyZHMoZSl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxyLGw9dCYmImVkaXQiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpPycucmVjb3JkW2RhdGEtcmVjb3JkLXR5cGU9IicrZSsnIl0gLnI6bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCwgLnJlY29yZFtkYXRhLXBhcmVudHRwbGlkPSInK2UrJyJdIC5yOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQnOicucltkYXRhLXJlY29yZC10eXBlPSInK2UrJyJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yW2RhdGEtcGFyZW50dHBsaWQ9IicrZSsnIl06bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCc7cmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChsKSl9ZnVuY3Rpb24gdDM5Nl9fZ2V0WmVyb0Jsb2Nrcygpe3ZhciBlPVtdLmNvbmNhdCh0Mzk2X19nZXRBcnRib2FyZHMoIjM5NiIpLHQzOTZfX2dldEFydGJvYXJkcygiMTIxIikpLHQ7cmV0dXJuIGUubGVuZ3RoP2UubWFwKChmdW5jdGlvbihlKXtyZXR1cm57cmVjb3JkOmUuY2xvc2VzdCgiLnI6bm90KC50Mzk3X19vZmYpOm5vdCgudDM5NV9fb2ZmKTpub3QoLnQ0MDBfX29mZikiKSxhcnRib2FyZDplfX0pKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlY29yZH0pKTpbXX1mdW5jdGlvbiB0Mzk2X19pc0luc2lkZUdyb3VwV2l0aFpvb20oZSl7Zm9yKHZhciB0PWUuY2xvc2VzdCgiLnQzOTZfX2dyb3VwIik7dDspe3ZhciByO2lmKHQuc3R5bGUuem9vbSlyZXR1cm4hMDt0PW51bGw9PShyPXQucGFyZW50RWxlbWVudCk/dm9pZCAwOnIuY2xvc2VzdCgiLnQzOTZfX2dyb3VwIil9cmV0dXJuITF9dmFyIHQzOTZfX3VuaXF1ZUlkX19nZW5lcmF0b3I9ZnVuY3Rpb24gZSgpe3ZhciB0PTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9U3RyaW5nKHQrPTEpLnBhZFN0YXJ0KDYsIjAiKTtyZXR1cm4iIitEYXRlLm5vdygpK2V9fSx0Mzk2X19nZXRVbmlxdWVJZD10Mzk2X191bmlxdWVJZF9fZ2VuZXJhdG9yKCk7ZnVuY3Rpb24gdDM5Nl9pc0Jsb2NrVmlzaWJsZShlKXt2YXIgdD13aW5kb3cuaW5uZXJXaWR0aCxyPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1taW4iKSxsPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1tYXgiKTtyZXR1cm4hKHImJnQ8cGFyc2VJbnQociwxMCkpJiYhKGwmJnQ+cGFyc2VJbnQobCwxMCkpfXZhciB0Mzk2X19vblJlYWR5PWZ1bmN0aW9uIGUodCl7ImxvYWRpbmciIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT90KCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsdCl9O2Z1bmN0aW9uIHQzOTZfZWxlbV9fZ2V0Rm9ybUlucHV0c1ZhbHVlKGUpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX2lucHV0cy10ZXh0YXJlYSIpO2lmKHQpe3ZhciByPXQudmFsdWU7aWYocil0cnl7cmV0dXJuIEpTT04ucGFyc2Uocil9Y2F0Y2gobyl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIkVycm9yIHBhcnNpbmcgZm9ybSBpbnB1dHMgdGV4dGFyZWEgdmFsdWU6IixvLHIpLFtdfX12YXIgbD1lLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19pbnB1dHMtZGF0YSIpO2lmKGwpe3ZhciBhPWwuZ2V0QXR0cmlidXRlKCJkYXRhLXZhbHVlIik7aWYoYSl0cnl7cmV0dXJuIEpTT04ucGFyc2UoYSl9Y2F0Y2gobyl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIkVycm9yIHBhcnNpbmcgZm9ybSBpbnB1dHMgZGF0YToiLG8sYSksW119fXJldHVybltdfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2luaXQoZSx0KXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIitlKSxsPScudG4tZWxlbVtkYXRhLWZlLWVsZW0taWQ9IicrdCsnIl0sIC50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJyt0KyciXScsYT1yP3IucXVlcnlTZWxlY3RvcihsKTpudWxsO2lmKCFhKXJldHVybiExO3ZhciBvPSJmdW5jdGlvbiI9PXR5cGVvZiBqUXVlcnk7dF9vbkZ1bmNMb2FkKCJ0X3NsZHNJbml0IiwoZnVuY3Rpb24oKXt0X29uRnVuY0xvYWQoInQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSIsKGZ1bmN0aW9uKCl7dF96ZXJvR2FsbGVyeV9fcHJvY2Vzc0dhbGxlcnlXaXRoR2VvTGFuZGluZyhyLChmdW5jdGlvbigpe3RfemVyb0dhbGxlcnlfX3JlbmRlcihhPXIucXVlcnlTZWxlY3RvcihsKSksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KG8/JChhKTphKSx0X3NsZHNJbml0KG8/JChhKTpbYV0pLHRfb25GdW5jTG9hZCgidF9zbGRzX3VwZGF0ZVNsaWRlciIsKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X3NsZHNfdXBkYXRlU2xpZGVyKG8/JChhKTpbYV0pLHRfemVyb0dhbGxlcnlfX3JlbmRlcl9uZXh0KGEsZSl9KSl9KSl9KSl9KSksWyJlZGl0IiwiemVybyJdLmluY2x1ZGVzKHdpbmRvdy50aWxkYW1vZGUpfHwieSIhPT1hLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC16b29tYWJsZS12YWx1ZSIpfHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC16b29tZXJfX3dyYXBwZXIiKS5sZW5ndGh8fHRfb25GdW5jTG9hZCgidF9pbml0Wm9vbSIsKGZ1bmN0aW9uKCl7dF9pbml0Wm9vbSgpfSkpLHRfemVyb0dhbGxlcnlfX2hhbmRsZU1vdmVTbGlkZXIoYSk7dmFyIHQ9ci5xdWVyeVNlbGVjdG9yKCIudDM5NiIpO3QmJigidW5kZWZpbmVkIiE9dHlwZW9mIGpRdWVyeT8oJCh0KS51bmJpbmQoImRpc3BsYXlDaGFuZ2VkIix0X3plcm9HYWxsZXJ5X191cGRhdGVTbGlkZXJIYW5kbGVyKSwkKHQpLmJpbmQoImRpc3BsYXlDaGFuZ2VkIix0X3plcm9HYWxsZXJ5X191cGRhdGVTbGlkZXJIYW5kbGVyKSk6KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLHRfemVyb0dhbGxlcnlfX3VwZGF0ZVNsaWRlckhhbmRsZXIpLHQuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLHRfemVyb0dhbGxlcnlfX3VwZGF0ZVNsaWRlckhhbmRsZXIpKSk7dmFyIHM9YS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzIik7cyYmKHMuc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSIpfSkpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2dsb2JhbEluaXQoKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ6ZXJvOndpbmRvdy13aWR0aC1jaGFuZ2VkIiwoZnVuY3Rpb24oKXt2YXIgZTt0X3plcm9HYWxsZXJ5X19vblJlc2l6ZSh0Mzk2X19nZXRaZXJvQmxvY2tzKCkpfSkpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX29uUmVzaXplKGUpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZWNvcmQscjt0JiYodDM5Nl9pc0Jsb2NrVmlzaWJsZSh0KSYmdC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1lbGVtLXR5cGU9ImdhbGxlcnkiXScpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3Rfc2xkc191cGRhdGVTbGlkZXIoZSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyX25leHQoZSx0LmlkLnJlcGxhY2UoInJlYyIsIiIpKX0pKSl9KSl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9faGFuZGxlTW92ZVNsaWRlcihlKXt2YXIgdDtpZighKC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQpKXt2YXIgcj1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxsPXIucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbSIpLGE9cGFyc2VGbG9hdChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdHJhbnNpdGlvbiIpKTthfHwwPT09YXx8KGE9MzAwKTt2YXIgbz0xNDA7dF96ZXJvR2FsbGVyeV9fc2V0U2xpZGVzT3BhY2l0eShsLCIwIiksZS5hZGRFdmVudExpc3RlbmVyKCJ0aWxkYVNsZHNNb3ZlU2xpZGVTdGFydCIsKGZ1bmN0aW9uKCl7dF96ZXJvR2FsbGVyeV9fc2V0U2xpZGVzT3BhY2l0eShsLCIxIil9KSksZS5hZGRFdmVudExpc3RlbmVyKCJ0aWxkYVNsZHNNb3ZlU2xpZGVFbmQiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF96ZXJvR2FsbGVyeV9fc2V0U2xpZGVzT3BhY2l0eShsLCIwIil9KSxhK28pfSkpfX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19zZXRTbGlkZXNPcGFjaXR5KGUsdCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbihlKXtlLmNsYXNzTGlzdC5jb250YWlucygidC1zbGRzX19pdGVtX2FjdGl2ZSIpfHwoZS5zdHlsZS5vcGFjaXR5PXQpfSkpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3Byb2Nlc3NHYWxsZXJ5V2l0aEdlb0xhbmRpbmcoZSx0KXt2YXIgcj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDgwNCIpLGw9ISFlLnRleHRDb250ZW50JiYtMSE9PWUudGV4dENvbnRlbnQuaW5kZXhPZigiJSUiKSxhPWUucXVlcnlTZWxlY3RvcigiW2RhdGEtcmVwbGFjZS1rZXldIiksbz0icHVibGlzaGVkIiE9PXRfemVyb0dhbGxlcnlfX2dldFRpbGRhTW9kZSgpOyFyfHwhbHx8YXx8bz90KCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVwbGFjaW5nQ29tcGxldGVkIix0KX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X191cGRhdGVTbGlkZXJIYW5kbGVyKGUpe3Rfc2xkc191cGRhdGVTbGlkZXIoZS50YXJnZXQpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2dldFRpbGRhTW9kZSgpe2lmKHZvaWQgMCE9PXdpbmRvdy50aWxkYW1vZGUpcmV0dXJuIHdpbmRvdy50aWxkYW1vZGU7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSx0O3N3aXRjaChlP2UuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKToiIil7Y2FzZSJlZGl0Ijp3aW5kb3cudGlsZGFtb2RlPSJlZGl0IjticmVhaztjYXNlInByZXZpZXciOndpbmRvdy50aWxkYW1vZGU9InByZXZpZXciO2JyZWFrO2RlZmF1bHQ6d2luZG93LnRpbGRhbW9kZT0icHVibGlzaGVkIn1yZXR1cm4gd2luZG93LnRpbGRhbW9kZX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19yZW5kZXIoZSl7d2luZG93LmpRdWVyeSYmZSBpbnN0YW5jZW9mIGpRdWVyeSYmKGU9ZS5sZW5ndGg/ZS5nZXQoMCk6bnVsbCk7dmFyIHQ9ZT9lLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC1pbWdzLXZhbHVlIik6IiI7aWYoIXQpe3ZhciByPWU/ZS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2xkcy1pbWdzLXRleHRhcmVhIik6bnVsbDt0PXI/ci52YWx1ZToiIn12YXIgbD0iZnVuY3Rpb24iPT10eXBlb2YgalF1ZXJ5LGE9dD9KU09OLnBhcnNlKHQpOltdO2E9YS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiF0X3plcm9HYWxsZXJ5X19pc0VtcHR5T2JqKGUpfSkpO3ZhciBvPWU/ZS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbSIpOm51bGw7byYmKG8uaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJ0LXNsZHMiIHN0eWxlPSJ2aXNpYmlsaXR5OiBoaWRkZW47Ij48ZGl2IGNsYXNzPSJ0LXNsZHNfX21haW4iPjxkaXYgY2xhc3M9InQtc2xkc19fY29udGFpbmVyIj48ZGl2IGNsYXNzPSJ0LXNsZHNfX2l0ZW1zLXdyYXBwZXIiIGRhdGEtc2xpZGVyLXRyYW5zaXRpb249IiIgZGF0YS1zbGlkZXItd2l0aC1jeWNsZT0idHJ1ZSIgZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQ9InRydWUiIGRhdGEtYXV0by1jb3JyZWN0LW1vYmlsZS13aWR0aD0iZmFsc2UiICBkYXRhLXNsaWRlci1pcy1wcmV2aWV3PSJ0cnVlIj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJ0LXNsZHNfX2J1bGxldF93cmFwcGVyIj48L2Rpdj48ZGl2IGNsYXNzPSJ0LXNsZHNfX2NhcHRpb25fX2NvbnRhaW5lciI+PC9kaXY+PGRpdiBjbGFzcz0idC1zbGRzX19hcnJvd19jb250YWluZXIiPjxkaXYgY2xhc3M9InQtc2xkc19fYXJyb3dfd3JhcHBlciB0LXNsZHNfX2Fycm93X3dyYXBwZXItbGVmdCIgZGF0YS1zbGlkZS1kaXJlY3Rpb249ImxlZnQiIHN0eWxlPSJoZWlnaHQ6IDQ4OHB4OyI+PGRpdiBjbGFzcz0idC1zbGRzX19hcnJvdyB0LXNsZHNfX2Fycm93LWxlZnQiPjxkaXYgY2xhc3M9InQtc2xkc19fYXJyb3dfYm9keSB0LXNsZHNfX2Fycm93X2JvZHktbGVmdCI+PHN2ZyBjbGFzcz0idC1udWxsX19zbGRzLWFycm93IHQtbnVsbF9fc2xkcy1hcnJvd18xIiB3aWR0aD0iOTQiIGhlaWdodD0iOTQiIHZpZXdCb3g9IjAgMCA5NCA5NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMzkgNjhMNjAgNDdMMzkgMjYiIHN0cm9rZT0iYmxhY2siIHZlY3Rvci1lZmZlY3Q9Im5vbi1zY2FsaW5nLXN0cm9rZSIvPjwvc3ZnPjxzdmcgY2xhc3M9InQtbnVsbF9fc2xkcy1hcnJvdyB0LW51bGxfX3NsZHMtYXJyb3dfMiIgIHdpZHRoPSI5NCIgaGVpZ2h0PSI5NCIgdmlld0JveD0iMCAwIDk0IDk0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik02MyA0Ny45MTdIMzAiIHN0cm9rZT0iYmxhY2siIHZlY3Rvci1lZmZlY3Q9Im5vbi1zY2FsaW5nLXN0cm9rZSIvPjxwYXRoIGQ9Ik00Ni45MTcgNjRMNjMgNDcuOTE3TDQ2LjkxNyAzMS44MzQiIHN0cm9rZT0iYmxhY2siIHZlY3Rvci1lZmZlY3Q9Im5vbi1zY2FsaW5nLXN0cm9rZSIvPjwvc3ZnPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InQtc2xkc19fYXJyb3dfd3JhcHBlciB0LXNsZHNfX2Fycm93X3dyYXBwZXItcmlnaHQiIGRhdGEtc2xpZGUtZGlyZWN0aW9uPSJyaWdodCIgc3R5bGU9ImhlaWdodDogNDg4cHg7Ij48ZGl2IGNsYXNzPSJ0LXNsZHNfX2Fycm93IHQtc2xkc19fYXJyb3ctcmlnaHQgIj48ZGl2IGNsYXNzPSJ0LXNsZHNfX2Fycm93X2JvZHkgdC1zbGRzX19hcnJvd19ib2R5LXJpZ2h0Ij48c3ZnIGNsYXNzPSJ0LW51bGxfX3NsZHMtYXJyb3cgdC1udWxsX19zbGRzLWFycm93XzEiIHdpZHRoPSI5NCIgaGVpZ2h0PSI5NCIgdmlld0JveD0iMCAwIDk0IDk0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0zOSA2OEw2MCA0N0wzOSAyNiIgc3Ryb2tlPSJibGFjayIgdmVjdG9yLWVmZmVjdD0ibm9uLXNjYWxpbmctc3Ryb2tlIi8+PC9zdmc+PHN2ZyBjbGFzcz0idC1udWxsX19zbGRzLWFycm93IHQtbnVsbF9fc2xkcy1hcnJvd18yIiAgd2lkdGg9Ijk0IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgOTQgOTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTYzIDQ3LjkxN0gzMCIgc3Ryb2tlPSJibGFjayIgdmVjdG9yLWVmZmVjdD0ibm9uLXNjYWxpbmctc3Ryb2tlIi8+PHBhdGggZD0iTTQ2LjkxNyA2NEw2MyA0Ny45MTdMNDYuOTE3IDMxLjgzNCIgc3Ryb2tlPSJibGFjayIgdmVjdG9yLWVmZmVjdD0ibm9uLXNjYWxpbmctc3Ryb2tlIi8+PC9zdmc+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+Jyk7Zm9yKHZhciBzPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLF89InB1Ymxpc2hlZCI9PT10X3plcm9HYWxsZXJ5X19nZXRUaWxkYU1vZGUoKSYmInkiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJ6b29tYWJsZSIpLG49ITEsaT10X3plcm9HYWxsZXJ5X19pc0xhenlMb2FkaW5nT25FbGVtKGUsbCksZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgYz1hW2RdLHU9dF96ZXJvR2FsbGVyeV9fZ2V0VmlkZW9LZXlzKCkuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIGNbZV19KSk7KHV8fGMubGlfaW1ndXJsKSYmKG49ITApLF89XyYmIWMubGlfaW1ndXJsJiYhdSxjLnpvb21hYmxlPV8sYy53aXRoTGF6eT1pO3ZhciB5PXRfemVyb0dhbGxlcnlfX2dlbmVyYXRlU2xpZGUoYyxkKTt5JiYobnVsbD09c3x8cy5hcHBlbmRDaGlsZCh5KSk7dmFyIG09ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19idWxsZXRfd3JhcHBlciIpO2lmKG0pe3ZhciBwPSc8ZGl2IGNsYXNzPSJ0LXNsZHNfX2J1bGxldCcrKDA9PT1kPyIgdC1zbGRzX19idWxsZXRfYWN0aXZlIjoiIikrJyIgZGF0YS1zbGlkZS1idWxsZXQtZm9yPSInKyhkKzEpKyciPjxkaXYgY2xhc3M9InQtc2xkc19fYnVsbGV0X2JvZHkiIHN0eWxlPSJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O2JhY2tncm91bmQtY29sb3I6IHdoaXRlOyI+PC9kaXY+PC9kaXY+JzttLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIixwKX10X3plcm9HYWxsZXJ5X19hcHBlbmRDYXB0aW9uKGUsYyxkKX1pZighXyYmIW4pe3ZhciBnPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fY29udGFpbmVyIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChnLChmdW5jdGlvbihlKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0X3plcm9HYWxsZXJ5X19zZXRTaWRlSGFuZGxlcnMpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfemVyb0dhbGxlcnlfX3NldFNpZGVIYW5kbGVycyl9KSl9aWYoaSYmdF9vbkZ1bmNMb2FkKCJ0X2xhenlsb2FkX3VwZGF0ZSIsKGZ1bmN0aW9uKCl7dF9sYXp5bG9hZF91cGRhdGUoKX0pKSxlJiZlLmNsb3Nlc3QoJ1tkYXRhLWZlLXJvbGU9InBvc3RzIl0nKSl7dF96ZXJvR2FsbGVyeV9fc2V0Qm9yZGVyU3R5bGVzRnJvbUZlZWQobyk7dmFyIGY9ZS5jbG9zZXN0KCdbZGF0YS1mZS1yb2xlPSJwb3N0cyJdID4gLnRuLW1vbGVjdWxlJyk7bnVsbD09Znx8Zi5hZGRFdmVudExpc3RlbmVyKCJmZWVkczpkcmF3LXBvc3RzIiwoZnVuY3Rpb24oKXt0X3plcm9HYWxsZXJ5X19zZXRCb3JkZXJTdHlsZXNGcm9tRmVlZChvKX0pLHtvbmNlOiEwfSl9fWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3NldEJvcmRlclN0eWxlc0Zyb21GZWVkKGUpe2lmKGUmJmUuY2xvc2VzdCgiW2RhdGEtZmUtZWxlbS1pZF1bZGF0YS1mZS1ib3JkZXItY29sb3JdIikpe3ZhciB0PWUuc3R5bGUscj10LmJvcmRlckNvbG9yLGw9dC5ib3JkZXJXaWR0aCxhPXQuYm9yZGVyU3R5bGUsbz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX21haW4iKTtpZihvKXtyJiYoby5zdHlsZS5ib3JkZXJDb2xvcj1yKTt2YXIgcz1nZXRDb21wdXRlZFN0eWxlKG8pO2wmJiIwcHgiPT09cy5ib3JkZXJXaWR0aCYmKG8uc3R5bGUuYm9yZGVyV2lkdGg9bCksYSYmIm5vbmUiPT09cy5ib3JkZXJTdHlsZSYmKG8uc3R5bGUuYm9yZGVyU3R5bGU9YSl9fX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19hcHBlbmRDYXB0aW9uKGUsdCxyKXt2YXIgbD1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NhcHRpb25fX2NvbnRhaW5lciIpO251bGw9PWx8fGwuYXBwZW5kQ2hpbGQodF96ZXJvR2FsbGVyeV9fY3JlYXRlQ2FwdGlvbih0LHIpKX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19jcmVhdGVDYXB0aW9uKGUsdCl7dmFyIHI9ZS5saV9pbWd0aXRsZXx8IiIsbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoInQtc2xkc19fY2FwdGlvbiIpLDA9PT10JiZsLmNsYXNzTGlzdC5hZGQoInQtc2xkc19fY2FwdGlvbi1hY3RpdmUiKSxsLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1jYXB0aW9uIix0KzEpO3ZhciBhLG89ci5zdGFydHNXaXRoKCI8c3BhbiBkYXRhLXJlcGxhY2Uta2V5IikmJnIuZW5kc1dpdGgoIjwvc3Bhbj4iKT9yOnRfemVyb0dhbGxlcnlfX2VzY2FwZUh0bWwocik7cmV0dXJuIGwuaW5uZXJIVE1MPW8/JzxkaXYgY2xhc3M9InQtc2xkc19fY2FwdGlvbl93cmFwcGVyIj48ZGl2IGNsYXNzPSJ0LXNsZHNfX3RpdGxlIj4nK28rIjwvZGl2PjwvZGl2PiI6IiIsbH1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19nZW5lcmF0ZVNsaWRlKGUsdCl7dmFyIHIsbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxhPVsidC1zbGRzX19pdGVtIl07MD09PXQmJmEucHVzaCgidC1zbGRzX19pdGVtX2FjdGl2ZSIpLChyPWwuY2xhc3NMaXN0KS5hZGQuYXBwbHkocixhKSxsLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIsdCsxKTt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gby5jbGFzc0xpc3QuYWRkKCJ0LXdpZHRoIiwidC1udWxsX19zbGRzLXdyYXBwZXIiLCJ0LXNsZHNfX3dyYXBwZXIiLCJ0LXNsZHNfX3dyYXBwZXJfMTAwIiwidC1hbGlnbl9jZW50ZXIiKSxsLmFwcGVuZENoaWxkKG8pLGUubGlfaW1nYWx0JiZlLmxpX2ltZyYmKG8uaW5uZXJIVE1MPSc8bWV0YSBpdGVtcHJvcD0iaW1hZ2UiIGNvbnRlbnQ9IicrdF96ZXJvR2FsbGVyeV9fZXNjYXBlSHRtbChlLmxpX2ltZykrJyI+XG5cdFx0XHQ8bWV0YSBpdGVtcHJvcD0iY2FwdGlvbiIgY29udGVudD0iJyt0X3plcm9HYWxsZXJ5X19lc2NhcGVIdG1sKGUubGlfaW1nYWx0KSsnIj5cblx0XHRcdCcpLG8uYXBwZW5kQ2hpbGQodF96ZXJvR2FsbGVyeV9fZ2VuZXJhdGVTbGlkZUNvbnRlbnQoZSx0KSksbH1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19nZW5lcmF0ZVNsaWRlQ29udGVudChlLHQpe3ZhciByPXRfemVyb0dhbGxlcnlfX2dldFZpZGVvS2V5cygpLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfSkpLGw9ZS5saV9pbWd1cmwmJiFyLGE9ZS5saV9pbWd0YXJnZXQmJiFyLG89ZS5saV9pbWdub2ZvbGxvdyYmIXIscz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGw/ImEiOiJkaXYiKTtpZihzLnNldEF0dHJpYnV0ZSgiZGF0YS1pbWctbGlkIixlLmxpZCksbCYmcy5zZXRBdHRyaWJ1dGUoImhyZWYiLGUubGlfaW1ndXJsKSxhJiZzLnNldEF0dHJpYnV0ZSgidGFyZ2V0IiwiX2JsYW5rIiksbyYmcy5zZXRBdHRyaWJ1dGUoInJlbCIsIm5vZm9sbG93IiksZS56b29tYWJsZSYmKHMuc2V0QXR0cmlidXRlKCJkYXRhLXpvb20tdGFyZ2V0Iix0KzEpLHMuc2V0QXR0cmlidXRlKCJkYXRhLXpvb21hYmxlIiwieWVzIikscy5zZXRBdHRyaWJ1dGUoImRhdGEtaW1nLXpvb20tdXJsIixlLmxpX2ltZykscy5jbGFzc0xpc3QuYWRkKCJ0LXpvb21hYmxlIikpLGUud2l0aExhenkmJihzLmNsYXNzTGlzdC5hZGQoInQtYmdpbWciKSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbCIsZS5saV9pbWcpKSxzLmNsYXNzTGlzdC5hZGQoInRuLWF0b21fX3NsZHMtaW1nIikscy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9dF96ZXJvR2FsbGVyeV9fcGFyc2VJbWFnZVVybChlLmxpX2ltZyxlLndpdGhMYXp5KSxyKXt2YXIgXz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtfLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX3ZpZGVvLXdyYXBwZXIiKSxfLmFwcGVuZENoaWxkKHMpO3ZhciBuPXRfemVyb0dhbGxlcnlfX2NyZWF0ZVBsYXlCdXR0b25Gb3JWaWRlbyhlKTtyZXR1cm4gbiYmXy5hcHBlbmRDaGlsZChuKSxffXJldHVybiBzfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3BhcnNlSW1hZ2VVcmwoZSx0KXtpZighZSlyZXR1cm4iIjtpZighdHx8ZS5pbmNsdWRlcygiLnN2ZyIpfHwhZS5pbmNsdWRlcygiaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIikpcmV0dXJuInVybCgiK2UrIikiO3ZhciByPWUuc3BsaXQoIi8iKTtyZXR1cm4gci5zcGxpY2UoLTEsMCwiLS9yZXNpemUvMjB4LyIpLCJ1cmwoIityLmpvaW4oIi8iKSsiKSJ9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fY3JlYXRlUGxheUJ1dHRvbkZvclZpZGVvKGUpe3ZhciB0PXRfemVyb0dhbGxlcnlfX2dldFZpZGVvS2V5cygpLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfSkpLHI9KG51bGw9PXQ/dm9pZCAwOnQucmVwbGFjZSgibGlfIiwiIikpfHwiIixsPWVbdF18fCIiO2lmKCFyfHwhbClyZXR1cm4gbnVsbDt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gYS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19wbGF5IiksYS5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXZpZGVvLXR5cGUiLHIpLGEuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci12aWRlby11cmwiLGwpLGEuaW5uZXJIVE1MPSc8c3ZnIHZpZXdCb3g9IjAgMCA2MCA2MCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZyBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0iIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZyBjbGFzcz0idG4tZWxlbV9fZ2FsbGVyeV9fcGxheV9pY29uX19jb2xvci1ob2xkZXIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02OTEuMDAwMDAwLCAtMzUxNC4wMDAwMDApIiBmaWxsPSIjRkZGRkZGIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8cGF0aCBkPSJNNzIxLDM1NzQgQzczNy41Njg1NDIsMzU3NCA3NTEsMzU2MC41Njg1NCA3NTEsMzU0NCBDNzUxLDM1MjcuNDMxNDYgNzM3LjU2ODU0MiwzNTE0IDcyMSwzNTE0IEM3MDQuNDMxNDU4LDM1MTQgNjkxLDM1MjcuNDMxNDYgNjkxLDM1NDQgQzY5MSwzNTYwLjU2ODU0IDcwNC40MzE0NTgsMzU3NCA3MjEsMzU3NCBaIE03MTUsMzUzNCBMNzMyLDM1NDQuNSBMNzE1LDM1NTUgTDcxNSwzNTM0IFoiPjwvcGF0aD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9nPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9nPlxuXHRcdFx0XHRcdFx0XHRcdDwvc3ZnPicsYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdF96ZXJvR2FsbGVyeV9fcGxheVZpZGVvKSxhfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3NldFNpZGVIYW5kbGVycyhlKXt2YXIgdD1lLnRhcmdldCxyPXQuY2xvc2VzdCgiLnQtc2xkcyIpLGw9ZS5vZmZzZXRYLGE9dC5vZmZzZXRXaWR0aCxvPXI/ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1sZWZ0Iik6bnVsbCxzPXI/ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1yaWdodCIpOm51bGw7bDw9NjAmJm8mJm8uY2xpY2soKSxhLWw8PTYwJiZzLmNsaWNrKCl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9faXNFbXB0eU9iaihlKXtpZighZSlyZXR1cm4hMDt2YXIgdD1bXTtmb3IodmFyIHIgaW4gZSllW3JdfHx0LnB1c2goInkiKTtyZXR1cm4gdC5sZW5ndGg9PT1PYmplY3Qua2V5cyhlKS5sZW5ndGh9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fcmVuZGVyX25leHQoZSx0KXt2YXIgcjtbInNsZHNfYXJyb3dzaXplIiwic2xkc19hcnJvd2xpbmVzaXplIiwic2xkc19hcnJvd2NvbG9yIiwic2xkc19hcnJvd2NvbG9yaG92ZXIiLCJzbGRzX2Fycm93Ymdjb2xvciIsInNsZHNfYXJyb3diZ2NvbG9yaG92ZXIiLCJzbGRzX2Fycm93YmdvcGFjaXR5Iiwic2xkc19hcnJvd2Jnb3BhY2l0eWhvdmVyIiwic2xkc19kb3Rzc2l6ZSIsInNsZHNfZG90c2JnY29sb3IiLCJzbGRzX2RvdHNiZ2NvbG9yYWN0aXZlIiwic2xkc19sb29wIiwic2xkc19zcGVlZCIsInNsZHNfYXV0b3BsYXkiLCJzbGRzX2Fycm93Y29udHJvbHMiLCJzbGRzX2RvdHNjb250cm9scyIsInNsZHNfc3RyZXRjaCIsInNsZHNfcGxheWljb25zaXplIiwic2xkc19wbGF5aWNvbmNvbG9yIiwic2xkc19jYXB0aW9udG9wbWFyZ2luIiwic2xkc19kb3Rzdm1hcmdpbiIsInNsZHNfY2FwdGlvbndpZHRoIiwic2xkc19hcnJvd2htYXJnaW4iLCJzbGRzX2Fycm93dm1hcmdpbiIsInNsZHNfZG90c2htYXJnaW4iLCJzbGRzX2Fycm93YWxpZ24iLCJzbGRzX2Fycm93YmV0d2Vlbm1hcmdpbiIsInNsZHNfYXJyb3d0eXBlIiwic2xkc19jdXJzb3Jjb250cm9sIiwic2xkc19pbWdwb3NpdGlvbiIsInNsZHNfYXJyb3dib3JkZXIiXS5mb3JFYWNoKChmdW5jdGlvbihyKXt0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LHIpfSkpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2dldEFycm93U2l6ZShlKXt2YXIgdDtyZXR1cm57czozMCxtOjQwLGw6NDUseGw6NTB9W2VdfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQscil7dmFyIGw9ImZ1bmN0aW9uIj09dHlwZW9mIGpRdWVyeTtpZihkb2N1bWVudC5jb250YWlucyhlKSl7dmFyIGE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLHIpLG89ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIiKSxzPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3dfY29udGFpbmVyIiksXz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2J1bGxldF93cmFwcGVyIiksbj1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxpPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYXJyb3ciKSxkPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ctcmlnaHQiKSxjPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ctbGVmdCIpLHU9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19idWxsZXRfYm9keSIpLHksbSxwLGcsZix2LHc7c3dpdGNoKHZvaWQgMD09PWEmJihhPSIiKSxyKXtjYXNlInNsZHNfaW1ncG9zaXRpb24iOnZhciBiO2F8fChhPSJjZW50ZXIgY2VudGVyIiksdF96ZXJvR2FsbGVyeV9fcmVtb3ZlRWxlbWVudChlLnF1ZXJ5U2VsZWN0b3IoIi50bi1lbGVtX19nYWxsZXJ5X19wb3NpdGlvbi1zdHlsZXMiKSksbyYmKCh3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX3Bvc2l0aW9uLXN0eWxlcyIpLHcudGV4dENvbnRlbnQ9IiNyZWMiK3QrJyAudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudG4tYXRvbV9fc2xkcy1pbWd7YmFja2dyb3VuZC1wb3NpdGlvbjogJythKyI7fSIsby5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsdykpO2JyZWFrO2Nhc2Uic2xkc19zdHJldGNoIjp2YXIgaDthfHwoYT0iY292ZXIiKSx0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fX2dhbGxlcnlfX3N0cmV0Y2gtc3R5bGVzIikpLG8mJigodz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpKS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19zdHJldGNoLXN0eWxlcyIpLHcudGV4dENvbnRlbnQ9IiNyZWMiK3QrJyAudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudG4tYXRvbV9fc2xkcy1pbWcge2JhY2tncm91bmQtc2l6ZTogJythKyI7fSIsby5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsdykpO2JyZWFrO2Nhc2Uic2xkc19jdXJzb3Jjb250cm9sIjphfHwoYT0ibm9uZSIpLGUuY2xhc3NMaXN0LnJlbW92ZSgidG4tZWxlbV9fZ2FsbGVyeV9hcnJvd3MtY3Vyc29yIiksIm9uIj09PWEmJmUuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9hcnJvd3MtY3Vyc29yIik7YnJlYWs7Y2FzZSJzbGRzX2Fycm93Y29udHJvbHMiOmlmKGF8fChhPSJuZWFyIiksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0bi1lbGVtX19nYWxsZXJ5X2Fycm93cy1pbiIsInRuLWVsZW1fX2dhbGxlcnlfYXJyb3dzLW5lYXIiLCJ0bi1lbGVtX19nYWxsZXJ5X2Fycm93cy1ub25lIiwidG4tZWxlbV9fZ2FsbGVyeV9hcnJvd3MtYWJvdmUiLCJ0bi1lbGVtX19nYWxsZXJ5X2Fycm93cy11bmRlciIpLGUuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9hcnJvd3MtIithKSwiYWJvdmUiPT09YXx8InVuZGVyIj09PWEpe3k9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93c2l6ZSIpO3ZhciB6PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2JldHdlZW5tYXJnaW4iKTtpZih6fHwoej0iMTAiKSx5fHwoeT0icyIpLHk9dF96ZXJvR2FsbGVyeV9fZ2V0QXJyb3dTaXplKHkpLHMpe3ZhciBHPTIqeStwYXJzZUludCh6LDEwKTtzLnN0eWxlLndpZHRoPXQzOTZfX3pvb21pZnlWYWx1ZShlLEcpfX1lbHNlIHMmJihzLnN0eWxlLndpZHRoPSIxMDAlIiksdDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQobD8kKGUpOmUsImJvcmRlcndpZHRoIik7ImluIj09PWEmJmUucXVlcnlTZWxlY3RvcigiW2RhdGEtc2xpZGVyLXZpZGVvLXR5cGVdIikmJmUuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fd2l0aC12aWRlbyIpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3dobWFyZ2luIiksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd3ZtYXJnaW4iKSwidW5kZXIiPT09YSYmdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19jYXB0aW9udG9wbWFyZ2luIik7YnJlYWs7Y2FzZSJzbGRzX2RvdHNobWFyZ2luIjp2YXIgUzthfHwoYT0iMjAiKSx0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fX2dhbGxlcnlfX2J1bGxldC1obWFyZ2luLXN0eWxlcyIpKSxvJiYoKHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9fYnVsbGV0LWhtYXJnaW4tc3R5bGVzIiksdy50ZXh0Q29udGVudD0iI3JlYyIrdCsnIC50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50LXNsZHNfX2J1bGxldCB7cGFkZGluZzogMTBweCAnK2EvMisicHg7bWFyZ2luOiAwcHg7fSIsby5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsdykpO2JyZWFrO2Nhc2Uic2xkc19kb3RzY29udHJvbHMiOmF8fChhPSJub25lIiksXyYmKF8uc3R5bGUuZGlzcGxheT0iYmxvY2siKSxmPXBhcnNlSW50KHQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19kb3Rzc2l6ZSIpLDEwKSwibmVhciI9PT1hJiZfJiYoXy5zdHlsZS5ib3R0b209LTIwLWYrInB4IiksImluIj09PWEmJl8mJihfLnN0eWxlLmJvdHRvbT0iMCIpLCJub25lIj09PWEmJl8mJihfLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2RvdHN2bWFyZ2luIiksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd3ZtYXJnaW4iKTticmVhaztjYXNlInNsZHNfcGxheWljb25zaXplIjp2YXIgQTthfHwoYT0iNzAiKSx0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fX2dhbGxlcnlfX2ljb24tc2l6ZS1zdHlsZXMiKSksbyYmKCh3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX2ljb24tc2l6ZS1zdHlsZXMiKSx3LnRleHRDb250ZW50PSIjcmVjIit0KycgLnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK2UuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKSsnIl0gLnRuLWVsZW1fX2dhbGxlcnlfX3BsYXkge3dpZHRoOiAnK3BhcnNlSW50KGEsMTApKyJweDtoZWlnaHQ6ICIrcGFyc2VJbnQoYSwxMCkrInB4O2xlZnQ6IGNhbGMoNTAlIC0gIitwYXJzZUludChhLDEwKS8yKyJweCk7dG9wOiBjYWxjKDUwJSAtICIrcGFyc2VJbnQoYSwxMCkvMisicHgpO30iLG8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLHcpKTticmVhaztjYXNlInNsZHNfcGxheWljb25jb2xvciI6dmFyIEU7YXx8KGE9IiNmZmYiKSx0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fX2dhbGxlcnlfX2ljb24tY29sb3Itc3R5bGVzIikpLG8mJigodz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpKS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19pY29uLWNvbG9yLXN0eWxlcyIpLHcudGV4dENvbnRlbnQ9IiNyZWMiK3QrJyAudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudG4tZWxlbV9fZ2FsbGVyeV9fcGxheV9pY29uX19jb2xvci1ob2xkZXIge2ZpbGw6ICcrYSsiO30iLG8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLHcpKTticmVhaztjYXNlInNsZHNfYXJyb3d0eXBlIjphfHwoYT0iMSIpO3ZhciBMPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtbnVsbF9fc2xkcy1hcnJvdyIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTCwoZnVuY3Rpb24oZSl7ZS5zdHlsZS5kaXNwbGF5PSJub25lIn0pKTt2YXIgaz1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LW51bGxfX3NsZHMtYXJyb3dfIithKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGssKGZ1bmN0aW9uKGUpe2Uuc3R5bGUuZGlzcGxheT0iYmxvY2sifSkpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3dzaXplIik7YnJlYWs7Y2FzZSJzbGRzX2Fycm93Ym9yZGVyIjp2YXIgVjtpZihhfHwoYT0ibm9uZSIpLHRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZS5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fZ2FsbGVyeV9fYXJyb3ctYm9yZGVyLXN0eWxlcyIpKSwibm9uZSIhPT1hKXt2YXIgRj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3dsaW5lc2l6ZSIpfHwiMSIseD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb2xvciIpfHwiIzIyMiIscT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb2xvcmhvdmVyIil8fHg7byYmKCh3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX2Fycm93LWJvcmRlci1zdHlsZXMiKSx3LnRleHRDb250ZW50PScudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudC1zbGRzX19hcnJvd19ib2R5OmJlZm9yZSB7Ym9yZGVyOiAnK0YrInB4IHNvbGlkICIreCsnO30udG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudC1zbGRzX19hcnJvd19ib2R5OmhvdmVyOmJlZm9yZSB7Ym9yZGVyOiAnK0YrInB4IHNvbGlkICIrcSsiO30iLG8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLHcpKX1icmVhaztjYXNlInNsZHNfYXJyb3dzaXplIjphfHwoYT0icyIpLGE9dF96ZXJvR2FsbGVyeV9fZ2V0QXJyb3dTaXplKGEpO3ZhciBDPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYXJyb3dfYm9keSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoQywoZnVuY3Rpb24odCl7dC5zdHlsZS5zZXRQcm9wZXJ0eSgid2lkdGgiLHQzOTZfX3pvb21pZnlWYWx1ZShlLHBhcnNlSW50KGEsMTApKSwiaW1wb3J0YW50Iil9KSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2JnY29sb3IiKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93YmV0d2Vlbm1hcmdpbiIpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3d2bWFyZ2luIik7YnJlYWs7Y2FzZSJzbGRzX2Fycm93bGluZXNpemUiOmF8fChhPSIxIik7dmFyIE89ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd19ib2R5IHBvbHlsaW5lLCAudC1zbGRzX19hcnJvd19ib2R5IHBhdGgiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKE8sKGZ1bmN0aW9uKGUpe2Uuc3R5bGUuc3Ryb2tlV2lkdGg9cGFyc2VJbnQoYSwxMCkrInB4In0pKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93Ym9yZGVyIik7YnJlYWs7Y2FzZSJzbGRzX2Fycm93Y29sb3IiOmF8fChhPSIjMjIyIik7dmFyIEk9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd19jb250YWluZXIgcG9seWxpbmUsIC50LXNsZHNfX2Fycm93X2NvbnRhaW5lciBwYXRoIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChJLChmdW5jdGlvbihlKXtlLnN0eWxlLnN0cm9rZT1hfSkpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3dib3JkZXIiKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93Y29sb3Job3ZlciIpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3diZ2NvbG9yIik7YnJlYWs7Y2FzZSJzbGRzX2RvdHNiZ2NvbG9yIjphfHwoYT0iI2ZmZiIpLHY9LTEhPT1hLmluZGV4T2YoIi1ncmFkaWVudCgiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHUsKGZ1bmN0aW9uKGUpe3Y/ZS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9YTplLnN0eWxlLmJhY2tncm91bmRDb2xvcj1hfSkpO2JyZWFrO2Nhc2Uic2xkc19kb3RzYmdjb2xvcmFjdGl2ZSI6dmFyIEI7aWYoYXx8KGE9IiMyMjIiKSx2PS0xIT09YS5pbmRleE9mKCItZ3JhZGllbnQoIiksdF96ZXJvR2FsbGVyeV9fcmVtb3ZlRWxlbWVudChlLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2J1bGxldF93cmFwcGVyIHN0eWxlIikpLF8pe3c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt2YXIgTT0iI3JlYyIrdCsnIC50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdJyxqPShNKz0iIC50LXNsZHNfX2J1bGxldF9hY3RpdmUgLnQtc2xkc19fYnVsbGV0X2JvZHkiKSsieyI7ais9dj8iYmFja2dyb3VuZC1pbWFnZTogIithKyIgIWltcG9ydGFudDsgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsiOiJiYWNrZ3JvdW5kLWNvbG9yOiAiK2ErIiAhaW1wb3J0YW50OyBiYWNrZ3JvdW5kLWltYWdlOiBub25lICFpbXBvcnRhbnQ7IixqKz0ifSIsdy50ZXh0Q29udGVudD1qLF8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLHcpfWJyZWFrO2Nhc2Uic2xkc19hdXRvcGxheSI6aWYoYXx8KGE9IjAiKSxuJiYobi5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRpbWVvdXQiLCgxZTMqcGFyc2VGbG9hdChhKSkudG9TdHJpbmcoKSksdF9vbkZ1bmNMb2FkKCJ0X3NsaWRlTW92ZSIsKGZ1bmN0aW9uKCl7dF9zbGlkZU1vdmUobD8kKGUpOmUpfSkpLDFlMypwYXJzZUZsb2F0KGEpKSl7dmFyIEg9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7SC5pbml0RXZlbnQoInNsaWRlQXV0b3BsYXlUaW1lclJlYWR5IiwhMCwhMCksbi5kaXNwYXRjaEV2ZW50KEgpfWJyZWFrO2Nhc2Uic2xkc19hcnJvd2JnY29sb3IiOnZhciBUPXRfemVyb0dhbGxlcnlfX2dldEFycm93U2l6ZSh5PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd3NpemUiKSksVz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3diZ29wYWNpdHkiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe2E/KHQuc3R5bGUud2lkdGg9dDM5Nl9fem9vbWlmeVZhbHVlKGUsVCksdC5zdHlsZS5oZWlnaHQ9dDM5Nl9fem9vbWlmeVZhbHVlKGUsVCksdC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Vz8icmdiYSgiK3QzOTZfX2hleDJyZ2JhKGEsVykrIikiOmEpOih0LnN0eWxlLndpZHRoPXQzOTZfX3pvb21pZnlWYWx1ZShlLFQpLHQuc3R5bGUuaGVpZ2h0PXQzOTZfX3pvb21pZnlWYWx1ZShlLFQpLHQuc3R5bGUuYmFja2dyb3VuZENvbG9yPSJ0cmFuc3BhcmVudCIpfSkpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3diZ2NvbG9yaG92ZXIiKTticmVhaztjYXNlInNsZHNfYXJyb3diZ29wYWNpdHkiOnRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3diZ2NvbG9yIik7YnJlYWs7Y2FzZSJzbGRzX2Fycm93YWxpZ24iOmF8fChhPSJjZW50ZXIiKSxzJiYocy5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfX2Fycm93X2NvbnRhaW5lci1sZWZ0IiwidC1zbGRzX19hcnJvd19jb250YWluZXItY2VudGVyIiwidC1zbGRzX19hcnJvd19jb250YWluZXItcmlnaHQiKSxzLmNsYXNzTGlzdC5hZGQoInQtc2xkc19fYXJyb3dfY29udGFpbmVyLSIrYSkpO2JyZWFrO2Nhc2Uic2xkc19kb3Rzc2l6ZSI6YXx8KGE9IjEwIiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh1LChmdW5jdGlvbih0KXt0LnN0eWxlLndpZHRoPXQzOTZfX3pvb21pZnlWYWx1ZShlLGEpLHQuc3R5bGUuaGVpZ2h0PXQzOTZfX3pvb21pZnlWYWx1ZShlLGEpfSkpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfZG90c2NvbnRyb2xzIik7YnJlYWs7Y2FzZSJzbGRzX2xvb3AiOmF8fChhPSJsb29wIiksIm5vbmUiPT09YSYmKG4mJm4uc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIiwiZmFsc2UiKSxzJiZzLmNsYXNzTGlzdC5hZGQoInQtc2xkc19fbm9jeWNsZSIpKSwibG9vcCI9PT1hJiYobiYmbi5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiLCJ0cnVlIikscyYmcy5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfX25vY3ljbGUiKSk7YnJlYWs7Y2FzZSJzbGRzX3NwZWVkIjphfHwoYT0ibm9uZSIpLCJub25lIj09PWEmJm4mJihuLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdHJhbnNpdGlvbiIsIiIpLG4uY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLXNsb3ciKSxuLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1mYXN0Iiksbi5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpKSwic2xvdyI9PT1hJiZuJiYobi5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRyYW5zaXRpb24iLCI1MDAiKSxuLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1mYXN0Iiksbi5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpLG4uY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLXNsb3ciKSksImZhc3QiPT09YSYmbiYmKG4uc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10cmFuc2l0aW9uIiwiMzAwIiksbi5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtc2xvdyIpLG4uY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLW5vbmUiKSxuLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZC1mYXN0IikpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd2NvbG9yaG92ZXIiOnRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3dib3JkZXIiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3ZhciByPXQucXVlcnlTZWxlY3RvckFsbCgicG9seWxpbmUsIHBhdGgiKTt0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLChmdW5jdGlvbigpe2F8fChhPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbG9yaG92ZXIiKSksYXx8KGE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Y29sb3IiKSksYXx8KGE9IiMyMjIiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKGUpe2Uuc3R5bGUuc3Ryb2tlPWF9KSl9KSksdC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwoZnVuY3Rpb24oKXt2YXIgdD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb2xvciIpO3R8fCh0PSIjMjIyIiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChyLChmdW5jdGlvbihlKXtlLnN0eWxlLnN0cm9rZT10fSkpfSkpfSkpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd2JnY29sb3Job3ZlciI6QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXt0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLChmdW5jdGlvbigpe3ZhciByPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2Jnb3BhY2l0eWhvdmVyIik7cnx8KHI9IjEuMCIpLGF8fChhPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2JnY29sb3IiKSksYXx8KGE9InRyYW5zcGFyZW50Iik7dmFyIG89YTsidHJhbnNwYXJlbnQiIT09YSYmKG89InJnYmEoIit0Mzk2X19oZXgycmdiYShhLHIpKyIpIiksdC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9b30pKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLChmdW5jdGlvbigpe3ZhciByPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2JnY29sb3IiKTtpZihyfHwocj0idHJhbnNwYXJlbnQiKSwidHJhbnNwYXJlbnQiIT09cil7dmFyIGE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93YmdvcGFjaXR5Iik7YXx8KGE9IjEuMCIpLHI9InJnYmEoIit0Mzk2X19oZXgycmdiYShyLGEpKyIpIn10LnN0eWxlLmJhY2tncm91bmRDb2xvcj1yfSkpfSkpO2JyZWFrO2Nhc2Uic2xkc19kb3Rzdm1hcmdpbiI6YXx8KGE9IjE2IikscD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfZG90c2NvbnRyb2xzIiksXyYmKCJuZWFyIj09PXA/KF8uc3R5bGUubWFyZ2luQm90dG9tPS1hKyJweCIsXy5zdHlsZS5wYWRkaW5nQm90dG9tPSIwIik6KF8uc3R5bGUubWFyZ2luQm90dG9tPSIwIixfLnN0eWxlLnBhZGRpbmdCb3R0b209YSsicHgiKSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19jYXB0aW9udG9wbWFyZ2luIiksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd3ZtYXJnaW4iKTticmVhaztjYXNlInNsZHNfY2FwdGlvbnRvcG1hcmdpbiI6dmFyIFI9dDM5Nl9nZXRFbChsPyQoZSk6ZSksWj1udWxsPT1SP3ZvaWQgMDpSLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX3RpdGxlIik7YSYmWnx8KGE9IjIwIikscD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfZG90c2NvbnRyb2xzIiksbT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb250cm9scyIpO3ZhciBQPTAsUTtpZigibmVhciI9PT1wJiYoKGc9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2RvdHN2bWFyZ2luIikpfHwoZz0iMTYiKSwoZj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfZG90c3NpemUiKSl8fChmPSIxMCIpLFA9MjArcGFyc2VJbnQoZiwxMCkrcGFyc2VJbnQoZywxMCkpLCJ1bmRlciI9PT1tKXt2YXIgVT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3dzaXplIiksTj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3d2bWFyZ2luIik7Tnx8KE49IjEwIiksVXx8KFU9InMiKSxVPXRfemVyb0dhbGxlcnlfX2dldEFycm93U2l6ZShVKSxQPVArcGFyc2VJbnQoVSwxMCkrcGFyc2VJbnQoTiwxMCl9dF96ZXJvR2FsbGVyeV9fcmVtb3ZlRWxlbWVudChlLnF1ZXJ5U2VsZWN0b3IoIi50bi1lbGVtX19nYWxsZXJ5X19jYXB0aW9uLXBvc2l0aW9uLXN0eWxlcyIpKSxvJiYoKHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9fY2FwdGlvbi1wb3NpdGlvbi1zdHlsZXMiKSx3LnRleHRDb250ZW50PSIjcmVjIit0KycgLnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK2UuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKSsnIl0gLnQtc2xkc19fY2FwdGlvbiB7bWFyZ2luLXRvcDogJysoUCtwYXJzZUludChhLDEwKSkrInB4O30iLG8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLHcpKTticmVhaztjYXNlInNsZHNfY2FwdGlvbndpZHRoIjp2YXIgSzthfHwoYT0iODAiKSx0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fX2dhbGxlcnlfX2NhcHRpb24td2lkdGgtc3R5bGVzIikpLG8mJigodz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpKS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19jYXB0aW9uLXdpZHRoLXN0eWxlcyIpLHcudGV4dENvbnRlbnQ9IiNyZWMiK3QrJyAudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudC1zbGRzX19jYXB0aW9uIHt3aWR0aDogJytwYXJzZUludChhLDEwKSsiJTt9IixvLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIix3KSk7YnJlYWs7Y2FzZSJzbGRzX2Fycm93aG1hcmdpbiI6YXx8KGE9IjMwIiksbT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb250cm9scyIpLGQmJmMmJigibmVhciI9PT1tPyhkLnN0eWxlLmxlZnQ9dDM5Nl9fem9vbWlmeVZhbHVlKGUsYSksZC5zdHlsZS5yaWdodD0iYXV0byIsYy5zdHlsZS5sZWZ0PSJhdXRvIixjLnN0eWxlLnJpZ2h0PXQzOTZfX3pvb21pZnlWYWx1ZShlLGEpKTooZC5zdHlsZS5sZWZ0PSJhdXRvIixkLnN0eWxlLnJpZ2h0PXQzOTZfX3pvb21pZnlWYWx1ZShlLGEpLGMuc3R5bGUubGVmdD10Mzk2X196b29taWZ5VmFsdWUoZSxhKSxjLnN0eWxlLnJpZ2h0PSJhdXRvIikpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd3ZtYXJnaW4iOmF8fChhPSIxMCIpO3ZhciBKPXt9O2lmKCJhYm92ZSI9PT0obT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb250cm9scyIpKSlKLnRvcD0tYSsicHgiLEouYm90dG9tPSJhdXRvIixBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKGUpe2Uuc3R5bGUubWFyZ2luVG9wPSIwIn0pKTtlbHNlIGlmKCJ1bmRlciI9PT1tKXt2YXIgRD0wOyJuZWFyIj09PShwPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19kb3RzY29udHJvbHMiKSkmJihnPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19kb3Rzdm1hcmdpbiIpLGY9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2RvdHNzaXplIiksRD0yMCtwYXJzZUludChmLDEwKStwYXJzZUludChnLDEwKSksYT1wYXJzZUludChhLDEwKStELEouYm90dG9tPS1hKyJweCIsSi50b3A9ImF1dG8iLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24oZSl7ZS5zdHlsZS5tYXJnaW5Ub3A9IjAifSkpfWVsc2UgSi50b3A9IiIsSi5ib3R0b209IiI7cyYmKHMuc3R5bGUudG9wPUoudG9wLHMuc3R5bGUuYm90dG9tPUouYm90dG9tKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2NhcHRpb250b3BtYXJnaW4iKTticmVhaztjYXNlInNsZHNfYXJyb3diZXR3ZWVubWFyZ2luIjphfHwoYT0iMTAiKSwoImFib3ZlIj09PShtPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbnRyb2xzIikpfHwidW5kZXIiPT09bSkmJmQmJmMmJihkLnN0eWxlLm1hcmdpbkxlZnQ9YS8yKyJweCIsYy5zdHlsZS5tYXJnaW5SaWdodD1hLzIrInB4Iix0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93Y29udHJvbHMiKSl9fX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUpe2UmJmUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3BsYXlWaWRlbyhlKXt2YXIgdD1lLmN1cnJlbnRUYXJnZXQ7aWYodCl7dmFyIHIsbCxhPXRfemVyb0dhbGxlcnlfX2dlbmVyYXRlVmlkZW8odC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXZpZGVvLXR5cGUiKSx0LmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdmlkZW8tdXJsIikpO2EmJnQucGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChhKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0X3plcm9HYWxsZXJ5X19wbGF5VmlkZW8pfX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19nZW5lcmF0ZVZpZGVvKGUsdCl7aWYoIWV8fCF0KXJldHVybiBudWxsO3ZhciByPVsieW91dHViZSIsInZpbWVvIl0uaW5jbHVkZXMoZSksbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX2ZyYW1lIik7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChyPyJpZnJhbWUiOiJ2aWRlbyIpO3JldHVybiBhLmNsYXNzTGlzdC5hZGQocj8idG4tZWxlbV9fZ2FsbGVyeV9faWZyYW1lIjoidG4tZWxlbV9fZ2FsbGVyeV9fdmlkZW8iKSxhLnNyYz10X3plcm9HYWxsZXJ5X19nZXRVUkxCeVZpZGVvVHlwZSh0LGUpLHI/KGEuYWxsb3c9ImF1dG9wbGF5IixhLnNldEF0dHJpYnV0ZSgiYWxsb3dmdWxsc2NyZWVuIiwiIikpOihhLnNldEF0dHJpYnV0ZSgiY29udHJvbHMiLCJjb250cm9scyIpLGEuc2V0QXR0cmlidXRlKCJhdXRvcGxheSIsImF1dG9wbGF5IiksYS5zZXRBdHRyaWJ1dGUoInBsYXlzaW5saW5lIiwicGxheXNpbmxpbmUiKSksbC5hcHBlbmRDaGlsZChhKSxsfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2dldFVSTEJ5VmlkZW9UeXBlKGUsdCl7cmV0dXJuInZpbWVvIj09PXQ/Imh0dHBzOi8vcGxheWVyLnZpbWVvLmNvbS92aWRlby8iK2UrIj9oPSZhcGk9MSZhdXRvcGxheT0xIjoieW91dHViZSI9PT10PyJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8iK2UrIj9hdXRvcGxheT0xJmVuYWJsZWpzYXBpPTEiOmV8fCIifWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2lzTGF6eUxvYWRpbmdPbkVsZW0oZSx0KXt2YXIgcj0ieSI9PT13aW5kb3cubGF6eTtpZighcil7dmFyIGw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtyPSEhbCYmInllcyI9PT1sLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5Iil9cmV0dXJuISFyJiYieSIhPT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodD8kKGUpOmUsImxhenlvZmYiKX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19nZXRWaWRlb0tleXMoKXtyZXR1cm5bImxpX3ZpbWVvIiwibGlfeW91dHViZSIsImxpX21wNCIsImxpX3dlYm0iXX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19lc2NhcGVIdG1sKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC8iL2csIiZxdW90OyIpLnJlcGxhY2UoLycvZywiJiMwMzk7Iil9dDM5Nl9fb25SZWFkeSh0X3plcm9HYWxsZXJ5X19nbG9iYWxJbml0KSx3aW5kb3cudGlsZGFfemVyb19nYWxsZXJ5X2pzX3Zlcj0xOwoKLyohIEhhbW1lci5KUyAtIHYyLjAuOCAtIDIwMTYtMDQtMjMKICogaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby8KICoKICogQ29weXJpZ2h0IChjKSAyMDE2IEpvcmlrIFRhbmdlbGRlcjsKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlICovCiFmdW5jdGlvbihhLGIsYyxkKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShhLGIsYyl7cmV0dXJuIHNldFRpbWVvdXQoaihhLGMpLGIpfWZ1bmN0aW9uIGYoYSxiLGMpe3JldHVybiBBcnJheS5pc0FycmF5KGEpPyhnKGEsY1tiXSxjKSwhMCk6ITF9ZnVuY3Rpb24gZyhhLGIsYyl7dmFyIGU7aWYoYSlpZihhLmZvckVhY2gpYS5mb3JFYWNoKGIsYyk7ZWxzZSBpZihhLmxlbmd0aCE9PWQpZm9yKGU9MDtlPGEubGVuZ3RoOyliLmNhbGwoYyxhW2VdLGUsYSksZSsrO2Vsc2UgZm9yKGUgaW4gYSlhLmhhc093blByb3BlcnR5KGUpJiZiLmNhbGwoYyxhW2VdLGUsYSl9ZnVuY3Rpb24gaChiLGMsZCl7dmFyIGU9IkRFUFJFQ0FURUQgTUVUSE9EOiAiK2MrIlxuIitkKyIgQVQgXG4iO3JldHVybiBmdW5jdGlvbigpe3ZhciBjPW5ldyBFcnJvcigiZ2V0LXN0YWNrLXRyYWNlIiksZD1jJiZjLnN0YWNrP2Muc3RhY2sucmVwbGFjZSgvXlteXChdKz9bXG4kXS9nbSwiIikucmVwbGFjZSgvXlxzK2F0XHMrL2dtLCIiKS5yZXBsYWNlKC9eT2JqZWN0Ljxhbm9ueW1vdXM+XHMqXCgvZ20sInthbm9ueW1vdXN9KClAIik6IlVua25vd24gU3RhY2sgVHJhY2UiLGY9YS5jb25zb2xlJiYoYS5jb25zb2xlLndhcm58fGEuY29uc29sZS5sb2cpO3JldHVybiBmJiZmLmNhbGwoYS5jb25zb2xlLGUsZCksYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIGkoYSxiLGMpe3ZhciBkLGU9Yi5wcm90b3R5cGU7ZD1hLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUpLGQuY29uc3RydWN0b3I9YSxkLl9zdXBlcj1lLGMmJmxhKGQsYyl9ZnVuY3Rpb24gaihhLGIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGIsYXJndW1lbnRzKX19ZnVuY3Rpb24gayhhLGIpe3JldHVybiB0eXBlb2YgYT09b2E/YS5hcHBseShiP2JbMF18fGQ6ZCxiKTphfWZ1bmN0aW9uIGwoYSxiKXtyZXR1cm4gYT09PWQ/YjphfWZ1bmN0aW9uIG0oYSxiLGMpe2cocShiKSxmdW5jdGlvbihiKXthLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX0pfWZ1bmN0aW9uIG4oYSxiLGMpe2cocShiKSxmdW5jdGlvbihiKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKX0pfWZ1bmN0aW9uIG8oYSxiKXtmb3IoO2E7KXtpZihhPT1iKXJldHVybiEwO2E9YS5wYXJlbnROb2RlfXJldHVybiExfWZ1bmN0aW9uIHAoYSxiKXtyZXR1cm4gYS5pbmRleE9mKGIpPi0xfWZ1bmN0aW9uIHEoYSl7cmV0dXJuIGEudHJpbSgpLnNwbGl0KC9ccysvZyl9ZnVuY3Rpb24gcihhLGIsYyl7aWYoYS5pbmRleE9mJiYhYylyZXR1cm4gYS5pbmRleE9mKGIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7KXtpZihjJiZhW2RdW2NdPT1ifHwhYyYmYVtkXT09PWIpcmV0dXJuIGQ7ZCsrfXJldHVybi0xfWZ1bmN0aW9uIHMoYSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsMCl9ZnVuY3Rpb24gdChhLGIsYyl7Zm9yKHZhciBkPVtdLGU9W10sZj0wO2Y8YS5sZW5ndGg7KXt2YXIgZz1iP2FbZl1bYl06YVtmXTtyKGUsZyk8MCYmZC5wdXNoKGFbZl0pLGVbZl09ZyxmKyt9cmV0dXJuIGMmJihkPWI/ZC5zb3J0KGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFbYl0+Y1tiXX0pOmQuc29ydCgpKSxkfWZ1bmN0aW9uIHUoYSxiKXtmb3IodmFyIGMsZSxmPWJbMF0udG9VcHBlckNhc2UoKStiLnNsaWNlKDEpLGc9MDtnPG1hLmxlbmd0aDspe2lmKGM9bWFbZ10sZT1jP2MrZjpiLGUgaW4gYSlyZXR1cm4gZTtnKyt9cmV0dXJuIGR9ZnVuY3Rpb24gdigpe3JldHVybiB1YSsrfWZ1bmN0aW9uIHcoYil7dmFyIGM9Yi5vd25lckRvY3VtZW50fHxiO3JldHVybiBjLmRlZmF1bHRWaWV3fHxjLnBhcmVudFdpbmRvd3x8YX1mdW5jdGlvbiB4KGEsYil7dmFyIGM9dGhpczt0aGlzLm1hbmFnZXI9YSx0aGlzLmNhbGxiYWNrPWIsdGhpcy5lbGVtZW50PWEuZWxlbWVudCx0aGlzLnRhcmdldD1hLm9wdGlvbnMuaW5wdXRUYXJnZXQsdGhpcy5kb21IYW5kbGVyPWZ1bmN0aW9uKGIpe2soYS5vcHRpb25zLmVuYWJsZSxbYV0pJiZjLmhhbmRsZXIoYil9LHRoaXMuaW5pdCgpfWZ1bmN0aW9uIHkoYSl7dmFyIGIsYz1hLm9wdGlvbnMuaW5wdXRDbGFzcztyZXR1cm4gbmV3KGI9Yz9jOnhhP006eWE/UDp3YT9SOkwpKGEseil9ZnVuY3Rpb24geihhLGIsYyl7dmFyIGQ9Yy5wb2ludGVycy5sZW5ndGgsZT1jLmNoYW5nZWRQb2ludGVycy5sZW5ndGgsZj1iJkVhJiZkLWU9PT0wLGc9YiYoR2F8SGEpJiZkLWU9PT0wO2MuaXNGaXJzdD0hIWYsYy5pc0ZpbmFsPSEhZyxmJiYoYS5zZXNzaW9uPXt9KSxjLmV2ZW50VHlwZT1iLEEoYSxjKSxhLmVtaXQoImhhbW1lci5pbnB1dCIsYyksYS5yZWNvZ25pemUoYyksYS5zZXNzaW9uLnByZXZJbnB1dD1jfWZ1bmN0aW9uIEEoYSxiKXt2YXIgYz1hLnNlc3Npb24sZD1iLnBvaW50ZXJzLGU9ZC5sZW5ndGg7Yy5maXJzdElucHV0fHwoYy5maXJzdElucHV0PUQoYikpLGU+MSYmIWMuZmlyc3RNdWx0aXBsZT9jLmZpcnN0TXVsdGlwbGU9RChiKToxPT09ZSYmKGMuZmlyc3RNdWx0aXBsZT0hMSk7dmFyIGY9Yy5maXJzdElucHV0LGc9Yy5maXJzdE11bHRpcGxlLGg9Zz9nLmNlbnRlcjpmLmNlbnRlcixpPWIuY2VudGVyPUUoZCk7Yi50aW1lU3RhbXA9cmEoKSxiLmRlbHRhVGltZT1iLnRpbWVTdGFtcC1mLnRpbWVTdGFtcCxiLmFuZ2xlPUkoaCxpKSxiLmRpc3RhbmNlPUgoaCxpKSxCKGMsYiksYi5vZmZzZXREaXJlY3Rpb249RyhiLmRlbHRhWCxiLmRlbHRhWSk7dmFyIGo9RihiLmRlbHRhVGltZSxiLmRlbHRhWCxiLmRlbHRhWSk7Yi5vdmVyYWxsVmVsb2NpdHlYPWoueCxiLm92ZXJhbGxWZWxvY2l0eVk9ai55LGIub3ZlcmFsbFZlbG9jaXR5PXFhKGoueCk+cWEoai55KT9qLng6ai55LGIuc2NhbGU9Zz9LKGcucG9pbnRlcnMsZCk6MSxiLnJvdGF0aW9uPWc/SihnLnBvaW50ZXJzLGQpOjAsYi5tYXhQb2ludGVycz1jLnByZXZJbnB1dD9iLnBvaW50ZXJzLmxlbmd0aD5jLnByZXZJbnB1dC5tYXhQb2ludGVycz9iLnBvaW50ZXJzLmxlbmd0aDpjLnByZXZJbnB1dC5tYXhQb2ludGVyczpiLnBvaW50ZXJzLmxlbmd0aCxDKGMsYik7dmFyIGs9YS5lbGVtZW50O28oYi5zcmNFdmVudC50YXJnZXQsaykmJihrPWIuc3JjRXZlbnQudGFyZ2V0KSxiLnRhcmdldD1rfWZ1bmN0aW9uIEIoYSxiKXt2YXIgYz1iLmNlbnRlcixkPWEub2Zmc2V0RGVsdGF8fHt9LGU9YS5wcmV2RGVsdGF8fHt9LGY9YS5wcmV2SW5wdXR8fHt9O2IuZXZlbnRUeXBlIT09RWEmJmYuZXZlbnRUeXBlIT09R2F8fChlPWEucHJldkRlbHRhPXt4OmYuZGVsdGFYfHwwLHk6Zi5kZWx0YVl8fDB9LGQ9YS5vZmZzZXREZWx0YT17eDpjLngseTpjLnl9KSxiLmRlbHRhWD1lLngrKGMueC1kLngpLGIuZGVsdGFZPWUueSsoYy55LWQueSl9ZnVuY3Rpb24gQyhhLGIpe3ZhciBjLGUsZixnLGg9YS5sYXN0SW50ZXJ2YWx8fGIsaT1iLnRpbWVTdGFtcC1oLnRpbWVTdGFtcDtpZihiLmV2ZW50VHlwZSE9SGEmJihpPkRhfHxoLnZlbG9jaXR5PT09ZCkpe3ZhciBqPWIuZGVsdGFYLWguZGVsdGFYLGs9Yi5kZWx0YVktaC5kZWx0YVksbD1GKGksaixrKTtlPWwueCxmPWwueSxjPXFhKGwueCk+cWEobC55KT9sLng6bC55LGc9RyhqLGspLGEubGFzdEludGVydmFsPWJ9ZWxzZSBjPWgudmVsb2NpdHksZT1oLnZlbG9jaXR5WCxmPWgudmVsb2NpdHlZLGc9aC5kaXJlY3Rpb247Yi52ZWxvY2l0eT1jLGIudmVsb2NpdHlYPWUsYi52ZWxvY2l0eVk9ZixiLmRpcmVjdGlvbj1nfWZ1bmN0aW9uIEQoYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEucG9pbnRlcnMubGVuZ3RoOyliW2NdPXtjbGllbnRYOnBhKGEucG9pbnRlcnNbY10uY2xpZW50WCksY2xpZW50WTpwYShhLnBvaW50ZXJzW2NdLmNsaWVudFkpfSxjKys7cmV0dXJue3RpbWVTdGFtcDpyYSgpLHBvaW50ZXJzOmIsY2VudGVyOkUoYiksZGVsdGFYOmEuZGVsdGFYLGRlbHRhWTphLmRlbHRhWX19ZnVuY3Rpb24gRShhKXt2YXIgYj1hLmxlbmd0aDtpZigxPT09YilyZXR1cm57eDpwYShhWzBdLmNsaWVudFgpLHk6cGEoYVswXS5jbGllbnRZKX07Zm9yKHZhciBjPTAsZD0wLGU9MDtiPmU7KWMrPWFbZV0uY2xpZW50WCxkKz1hW2VdLmNsaWVudFksZSsrO3JldHVybnt4OnBhKGMvYikseTpwYShkL2IpfX1mdW5jdGlvbiBGKGEsYixjKXtyZXR1cm57eDpiL2F8fDAseTpjL2F8fDB9fWZ1bmN0aW9uIEcoYSxiKXtyZXR1cm4gYT09PWI/SWE6cWEoYSk+PXFhKGIpPzA+YT9KYTpLYTowPmI/TGE6TWF9ZnVuY3Rpb24gSChhLGIsYyl7Y3x8KGM9UWEpO3ZhciBkPWJbY1swXV0tYVtjWzBdXSxlPWJbY1sxXV0tYVtjWzFdXTtyZXR1cm4gTWF0aC5zcXJ0KGQqZCtlKmUpfWZ1bmN0aW9uIEkoYSxiLGMpe2N8fChjPVFhKTt2YXIgZD1iW2NbMF1dLWFbY1swXV0sZT1iW2NbMV1dLWFbY1sxXV07cmV0dXJuIDE4MCpNYXRoLmF0YW4yKGUsZCkvTWF0aC5QSX1mdW5jdGlvbiBKKGEsYil7cmV0dXJuIEkoYlsxXSxiWzBdLFJhKStJKGFbMV0sYVswXSxSYSl9ZnVuY3Rpb24gSyhhLGIpe3JldHVybiBIKGJbMF0sYlsxXSxSYSkvSChhWzBdLGFbMV0sUmEpfWZ1bmN0aW9uIEwoKXt0aGlzLmV2RWw9VGEsdGhpcy5ldldpbj1VYSx0aGlzLnByZXNzZWQ9ITEseC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gTSgpe3RoaXMuZXZFbD1YYSx0aGlzLmV2V2luPVlhLHguYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuc3RvcmU9dGhpcy5tYW5hZ2VyLnNlc3Npb24ucG9pbnRlckV2ZW50cz1bXX1mdW5jdGlvbiBOKCl7dGhpcy5ldlRhcmdldD0kYSx0aGlzLmV2V2luPV9hLHRoaXMuc3RhcnRlZD0hMSx4LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBPKGEsYil7dmFyIGM9cyhhLnRvdWNoZXMpLGQ9cyhhLmNoYW5nZWRUb3VjaGVzKTtyZXR1cm4gYiYoR2F8SGEpJiYoYz10KGMuY29uY2F0KGQpLCJpZGVudGlmaWVyIiwhMCkpLFtjLGRdfWZ1bmN0aW9uIFAoKXt0aGlzLmV2VGFyZ2V0PWJiLHRoaXMudGFyZ2V0SWRzPXt9LHguYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIFEoYSxiKXt2YXIgYz1zKGEudG91Y2hlcyksZD10aGlzLnRhcmdldElkcztpZihiJihFYXxGYSkmJjE9PT1jLmxlbmd0aClyZXR1cm4gZFtjWzBdLmlkZW50aWZpZXJdPSEwLFtjLGNdO3ZhciBlLGYsZz1zKGEuY2hhbmdlZFRvdWNoZXMpLGg9W10saT10aGlzLnRhcmdldDtpZihmPWMuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBvKGEudGFyZ2V0LGkpfSksYj09PUVhKWZvcihlPTA7ZTxmLmxlbmd0aDspZFtmW2VdLmlkZW50aWZpZXJdPSEwLGUrKztmb3IoZT0wO2U8Zy5sZW5ndGg7KWRbZ1tlXS5pZGVudGlmaWVyXSYmaC5wdXNoKGdbZV0pLGImKEdhfEhhKSYmZGVsZXRlIGRbZ1tlXS5pZGVudGlmaWVyXSxlKys7cmV0dXJuIGgubGVuZ3RoP1t0KGYuY29uY2F0KGgpLCJpZGVudGlmaWVyIiwhMCksaF06dm9pZCAwfWZ1bmN0aW9uIFIoKXt4LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYT1qKHRoaXMuaGFuZGxlcix0aGlzKTt0aGlzLnRvdWNoPW5ldyBQKHRoaXMubWFuYWdlcixhKSx0aGlzLm1vdXNlPW5ldyBMKHRoaXMubWFuYWdlcixhKSx0aGlzLnByaW1hcnlUb3VjaD1udWxsLHRoaXMubGFzdFRvdWNoZXM9W119ZnVuY3Rpb24gUyhhLGIpe2EmRWE/KHRoaXMucHJpbWFyeVRvdWNoPWIuY2hhbmdlZFBvaW50ZXJzWzBdLmlkZW50aWZpZXIsVC5jYWxsKHRoaXMsYikpOmEmKEdhfEhhKSYmVC5jYWxsKHRoaXMsYil9ZnVuY3Rpb24gVChhKXt2YXIgYj1hLmNoYW5nZWRQb2ludGVyc1swXTtpZihiLmlkZW50aWZpZXI9PT10aGlzLnByaW1hcnlUb3VjaCl7dmFyIGM9e3g6Yi5jbGllbnRYLHk6Yi5jbGllbnRZfTt0aGlzLmxhc3RUb3VjaGVzLnB1c2goYyk7dmFyIGQ9dGhpcy5sYXN0VG91Y2hlcyxlPWZ1bmN0aW9uKCl7dmFyIGE9ZC5pbmRleE9mKGMpO2E+LTEmJmQuc3BsaWNlKGEsMSl9O3NldFRpbWVvdXQoZSxjYil9fWZ1bmN0aW9uIFUoYSl7Zm9yKHZhciBiPWEuc3JjRXZlbnQuY2xpZW50WCxjPWEuc3JjRXZlbnQuY2xpZW50WSxkPTA7ZDx0aGlzLmxhc3RUb3VjaGVzLmxlbmd0aDtkKyspe3ZhciBlPXRoaXMubGFzdFRvdWNoZXNbZF0sZj1NYXRoLmFicyhiLWUueCksZz1NYXRoLmFicyhjLWUueSk7aWYoZGI+PWYmJmRiPj1nKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFYoYSxiKXt0aGlzLm1hbmFnZXI9YSx0aGlzLnNldChiKX1mdW5jdGlvbiBXKGEpe2lmKHAoYSxqYikpcmV0dXJuIGpiO3ZhciBiPXAoYSxrYiksYz1wKGEsbGIpO3JldHVybiBiJiZjP2piOmJ8fGM/Yj9rYjpsYjpwKGEsaWIpP2liOmhifWZ1bmN0aW9uIFgoKXtpZighZmIpcmV0dXJuITE7dmFyIGI9e30sYz1hLkNTUyYmYS5DU1Muc3VwcG9ydHM7cmV0dXJuWyJhdXRvIiwibWFuaXB1bGF0aW9uIiwicGFuLXkiLCJwYW4teCIsInBhbi14IHBhbi15Iiwibm9uZSJdLmZvckVhY2goZnVuY3Rpb24oZCl7YltkXT1jP2EuQ1NTLnN1cHBvcnRzKCJ0b3VjaC1hY3Rpb24iLGQpOiEwfSksYn1mdW5jdGlvbiBZKGEpe3RoaXMub3B0aW9ucz1sYSh7fSx0aGlzLmRlZmF1bHRzLGF8fHt9KSx0aGlzLmlkPXYoKSx0aGlzLm1hbmFnZXI9bnVsbCx0aGlzLm9wdGlvbnMuZW5hYmxlPWwodGhpcy5vcHRpb25zLmVuYWJsZSwhMCksdGhpcy5zdGF0ZT1uYix0aGlzLnNpbXVsdGFuZW91cz17fSx0aGlzLnJlcXVpcmVGYWlsPVtdfWZ1bmN0aW9uIFooYSl7cmV0dXJuIGEmc2I/ImNhbmNlbCI6YSZxYj8iZW5kIjphJnBiPyJtb3ZlIjphJm9iPyJzdGFydCI6IiJ9ZnVuY3Rpb24gJChhKXtyZXR1cm4gYT09TWE/ImRvd24iOmE9PUxhPyJ1cCI6YT09SmE/ImxlZnQiOmE9PUthPyJyaWdodCI6IiJ9ZnVuY3Rpb24gXyhhLGIpe3ZhciBjPWIubWFuYWdlcjtyZXR1cm4gYz9jLmdldChhKTphfWZ1bmN0aW9uIGFhKCl7WS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gYmEoKXthYS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wWD1udWxsLHRoaXMucFk9bnVsbH1mdW5jdGlvbiBjYSgpe2FhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBkYSgpe1kuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3RpbWVyPW51bGwsdGhpcy5faW5wdXQ9bnVsbH1mdW5jdGlvbiBlYSgpe2FhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBmYSgpe2FhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBnYSgpe1kuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucFRpbWU9ITEsdGhpcy5wQ2VudGVyPSExLHRoaXMuX3RpbWVyPW51bGwsdGhpcy5faW5wdXQ9bnVsbCx0aGlzLmNvdW50PTB9ZnVuY3Rpb24gaGEoYSxiKXtyZXR1cm4gYj1ifHx7fSxiLnJlY29nbml6ZXJzPWwoYi5yZWNvZ25pemVycyxoYS5kZWZhdWx0cy5wcmVzZXQpLG5ldyBpYShhLGIpfWZ1bmN0aW9uIGlhKGEsYil7dGhpcy5vcHRpb25zPWxhKHt9LGhhLmRlZmF1bHRzLGJ8fHt9KSx0aGlzLm9wdGlvbnMuaW5wdXRUYXJnZXQ9dGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0fHxhLHRoaXMuaGFuZGxlcnM9e30sdGhpcy5zZXNzaW9uPXt9LHRoaXMucmVjb2duaXplcnM9W10sdGhpcy5vbGRDc3NQcm9wcz17fSx0aGlzLmVsZW1lbnQ9YSx0aGlzLmlucHV0PXkodGhpcyksdGhpcy50b3VjaEFjdGlvbj1uZXcgVih0aGlzLHRoaXMub3B0aW9ucy50b3VjaEFjdGlvbiksamEodGhpcywhMCksZyh0aGlzLm9wdGlvbnMucmVjb2duaXplcnMsZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hZGQobmV3IGFbMF0oYVsxXSkpO2FbMl0mJmIucmVjb2duaXplV2l0aChhWzJdKSxhWzNdJiZiLnJlcXVpcmVGYWlsdXJlKGFbM10pfSx0aGlzKX1mdW5jdGlvbiBqYShhLGIpe3ZhciBjPWEuZWxlbWVudDtpZihjLnN0eWxlKXt2YXIgZDtnKGEub3B0aW9ucy5jc3NQcm9wcyxmdW5jdGlvbihlLGYpe2Q9dShjLnN0eWxlLGYpLGI/KGEub2xkQ3NzUHJvcHNbZF09Yy5zdHlsZVtkXSxjLnN0eWxlW2RdPWUpOmMuc3R5bGVbZF09YS5vbGRDc3NQcm9wc1tkXXx8IiJ9KSxifHwoYS5vbGRDc3NQcm9wcz17fSl9fWZ1bmN0aW9uIGthKGEsYyl7dmFyIGQ9Yi5jcmVhdGVFdmVudCgiRXZlbnQiKTtkLmluaXRFdmVudChhLCEwLCEwKSxkLmdlc3R1cmU9YyxjLnRhcmdldC5kaXNwYXRjaEV2ZW50KGQpfXZhciBsYSxtYT1bIiIsIndlYmtpdCIsIk1veiIsIk1TIiwibXMiLCJvIl0sbmE9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKSxvYT0iZnVuY3Rpb24iLHBhPU1hdGgucm91bmQscWE9TWF0aC5hYnMscmE9RGF0ZS5ub3c7bGE9ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24/ZnVuY3Rpb24oYSl7aWYoYT09PWR8fG51bGw9PT1hKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCIpO2Zvcih2YXIgYj1PYmplY3QoYSksYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspe3ZhciBlPWFyZ3VtZW50c1tjXTtpZihlIT09ZCYmbnVsbCE9PWUpZm9yKHZhciBmIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShmKSYmKGJbZl09ZVtmXSl9cmV0dXJuIGJ9Ok9iamVjdC5hc3NpZ247dmFyIHNhPWgoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZT1PYmplY3Qua2V5cyhiKSxmPTA7ZjxlLmxlbmd0aDspKCFjfHxjJiZhW2VbZl1dPT09ZCkmJihhW2VbZl1dPWJbZVtmXV0pLGYrKztyZXR1cm4gYX0sImV4dGVuZCIsIlVzZSBgYXNzaWduYC4iKSx0YT1oKGZ1bmN0aW9uKGEsYil7cmV0dXJuIHNhKGEsYiwhMCl9LCJtZXJnZSIsIlVzZSBgYXNzaWduYC4iKSx1YT0xLHZhPS9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWQvaSx3YT0ib250b3VjaHN0YXJ0ImluIGEseGE9dShhLCJQb2ludGVyRXZlbnQiKSE9PWQseWE9d2EmJnZhLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksemE9InRvdWNoIixBYT0icGVuIixCYT0ibW91c2UiLENhPSJraW5lY3QiLERhPTI1LEVhPTEsRmE9MixHYT00LEhhPTgsSWE9MSxKYT0yLEthPTQsTGE9OCxNYT0xNixOYT1KYXxLYSxPYT1MYXxNYSxQYT1OYXxPYSxRYT1bIngiLCJ5Il0sUmE9WyJjbGllbnRYIiwiY2xpZW50WSJdO3gucHJvdG90eXBlPXtoYW5kbGVyOmZ1bmN0aW9uKCl7fSxpbml0OmZ1bmN0aW9uKCl7dGhpcy5ldkVsJiZtKHRoaXMuZWxlbWVudCx0aGlzLmV2RWwsdGhpcy5kb21IYW5kbGVyKSx0aGlzLmV2VGFyZ2V0JiZtKHRoaXMudGFyZ2V0LHRoaXMuZXZUYXJnZXQsdGhpcy5kb21IYW5kbGVyKSx0aGlzLmV2V2luJiZtKHcodGhpcy5lbGVtZW50KSx0aGlzLmV2V2luLHRoaXMuZG9tSGFuZGxlcil9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmV2RWwmJm4odGhpcy5lbGVtZW50LHRoaXMuZXZFbCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZUYXJnZXQmJm4odGhpcy50YXJnZXQsdGhpcy5ldlRhcmdldCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZXaW4mJm4odyh0aGlzLmVsZW1lbnQpLHRoaXMuZXZXaW4sdGhpcy5kb21IYW5kbGVyKX19O3ZhciBTYT17bW91c2Vkb3duOkVhLG1vdXNlbW92ZTpGYSxtb3VzZXVwOkdhfSxUYT0ibW91c2Vkb3duIixVYT0ibW91c2Vtb3ZlIG1vdXNldXAiO2koTCx4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPVNhW2EudHlwZV07YiZFYSYmMD09PWEuYnV0dG9uJiYodGhpcy5wcmVzc2VkPSEwKSxiJkZhJiYxIT09YS53aGljaCYmKGI9R2EpLHRoaXMucHJlc3NlZCYmKGImR2EmJih0aGlzLnByZXNzZWQ9ITEpLHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGIse3BvaW50ZXJzOlthXSxjaGFuZ2VkUG9pbnRlcnM6W2FdLHBvaW50ZXJUeXBlOkJhLHNyY0V2ZW50OmF9KSl9fSk7dmFyIFZhPXtwb2ludGVyZG93bjpFYSxwb2ludGVybW92ZTpGYSxwb2ludGVydXA6R2EscG9pbnRlcmNhbmNlbDpIYSxwb2ludGVyb3V0OkhhfSxXYT17Mjp6YSwzOkFhLDQ6QmEsNTpDYX0sWGE9InBvaW50ZXJkb3duIixZYT0icG9pbnRlcm1vdmUgcG9pbnRlcnVwIHBvaW50ZXJjYW5jZWwiO2EuTVNQb2ludGVyRXZlbnQmJiFhLlBvaW50ZXJFdmVudCYmKFhhPSJNU1BvaW50ZXJEb3duIixZYT0iTVNQb2ludGVyTW92ZSBNU1BvaW50ZXJVcCBNU1BvaW50ZXJDYW5jZWwiKSxpKE0seCx7aGFuZGxlcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnN0b3JlLGM9ITEsZD1hLnR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCJtcyIsIiIpLGU9VmFbZF0sZj1XYVthLnBvaW50ZXJUeXBlXXx8YS5wb2ludGVyVHlwZSxnPWY9PXphLGg9cihiLGEucG9pbnRlcklkLCJwb2ludGVySWQiKTtlJkVhJiYoMD09PWEuYnV0dG9ufHxnKT8wPmgmJihiLnB1c2goYSksaD1iLmxlbmd0aC0xKTplJihHYXxIYSkmJihjPSEwKSwwPmh8fChiW2hdPWEsdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsZSx7cG9pbnRlcnM6YixjaGFuZ2VkUG9pbnRlcnM6W2FdLHBvaW50ZXJUeXBlOmYsc3JjRXZlbnQ6YX0pLGMmJmIuc3BsaWNlKGgsMSkpfX0pO3ZhciBaYT17dG91Y2hzdGFydDpFYSx0b3VjaG1vdmU6RmEsdG91Y2hlbmQ6R2EsdG91Y2hjYW5jZWw6SGF9LCRhPSJ0b3VjaHN0YXJ0IixfYT0idG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWwiO2koTix4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPVphW2EudHlwZV07aWYoYj09PUVhJiYodGhpcy5zdGFydGVkPSEwKSx0aGlzLnN0YXJ0ZWQpe3ZhciBjPU8uY2FsbCh0aGlzLGEsYik7YiYoR2F8SGEpJiZjWzBdLmxlbmd0aC1jWzFdLmxlbmd0aD09PTAmJih0aGlzLnN0YXJ0ZWQ9ITEpLHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGIse3BvaW50ZXJzOmNbMF0sY2hhbmdlZFBvaW50ZXJzOmNbMV0scG9pbnRlclR5cGU6emEsc3JjRXZlbnQ6YX0pfX19KTt2YXIgYWI9e3RvdWNoc3RhcnQ6RWEsdG91Y2htb3ZlOkZhLHRvdWNoZW5kOkdhLHRvdWNoY2FuY2VsOkhhfSxiYj0idG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWwiO2koUCx4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPWFiW2EudHlwZV0sYz1RLmNhbGwodGhpcyxhLGIpO2MmJnRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGIse3BvaW50ZXJzOmNbMF0sY2hhbmdlZFBvaW50ZXJzOmNbMV0scG9pbnRlclR5cGU6emEsc3JjRXZlbnQ6YX0pfX0pO3ZhciBjYj0yNTAwLGRiPTI1O2koUix4LHtoYW5kbGVyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1jLnBvaW50ZXJUeXBlPT16YSxlPWMucG9pbnRlclR5cGU9PUJhO2lmKCEoZSYmYy5zb3VyY2VDYXBhYmlsaXRpZXMmJmMuc291cmNlQ2FwYWJpbGl0aWVzLmZpcmVzVG91Y2hFdmVudHMpKXtpZihkKVMuY2FsbCh0aGlzLGIsYyk7ZWxzZSBpZihlJiZVLmNhbGwodGhpcyxjKSlyZXR1cm47dGhpcy5jYWxsYmFjayhhLGIsYyl9fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy50b3VjaC5kZXN0cm95KCksdGhpcy5tb3VzZS5kZXN0cm95KCl9fSk7dmFyIGViPXUobmEuc3R5bGUsInRvdWNoQWN0aW9uIiksZmI9ZWIhPT1kLGdiPSJjb21wdXRlIixoYj0iYXV0byIsaWI9Im1hbmlwdWxhdGlvbiIsamI9Im5vbmUiLGtiPSJwYW4teCIsbGI9InBhbi15IixtYj1YKCk7Vi5wcm90b3R5cGU9e3NldDpmdW5jdGlvbihhKXthPT1nYiYmKGE9dGhpcy5jb21wdXRlKCkpLGZiJiZ0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZSYmbWJbYV0mJih0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZVtlYl09YSksdGhpcy5hY3Rpb25zPWEudG9Mb3dlckNhc2UoKS50cmltKCl9LHVwZGF0ZTpmdW5jdGlvbigpe3RoaXMuc2V0KHRoaXMubWFuYWdlci5vcHRpb25zLnRvdWNoQWN0aW9uKX0sY29tcHV0ZTpmdW5jdGlvbigpe3ZhciBhPVtdO3JldHVybiBnKHRoaXMubWFuYWdlci5yZWNvZ25pemVycyxmdW5jdGlvbihiKXtrKGIub3B0aW9ucy5lbmFibGUsW2JdKSYmKGE9YS5jb25jYXQoYi5nZXRUb3VjaEFjdGlvbigpKSl9KSxXKGEuam9pbigiICIpKX0scHJldmVudERlZmF1bHRzOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc3JjRXZlbnQsYz1hLm9mZnNldERpcmVjdGlvbjtpZih0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQpcmV0dXJuIHZvaWQgYi5wcmV2ZW50RGVmYXVsdCgpO3ZhciBkPXRoaXMuYWN0aW9ucyxlPXAoZCxqYikmJiFtYltqYl0sZj1wKGQsbGIpJiYhbWJbbGJdLGc9cChkLGtiKSYmIW1iW2tiXTtpZihlKXt2YXIgaD0xPT09YS5wb2ludGVycy5sZW5ndGgsaT1hLmRpc3RhbmNlPDIsaj1hLmRlbHRhVGltZTwyNTA7aWYoaCYmaSYmailyZXR1cm59cmV0dXJuIGcmJmY/dm9pZCAwOmV8fGYmJmMmTmF8fGcmJmMmT2E/dGhpcy5wcmV2ZW50U3JjKGIpOnZvaWQgMH0scHJldmVudFNyYzpmdW5jdGlvbihhKXt0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQ9ITAsYS5wcmV2ZW50RGVmYXVsdCgpfX07dmFyIG5iPTEsb2I9MixwYj00LHFiPTgscmI9cWIsc2I9MTYsdGI9MzI7WS5wcm90b3R5cGU9e2RlZmF1bHRzOnt9LHNldDpmdW5jdGlvbihhKXtyZXR1cm4gbGEodGhpcy5vcHRpb25zLGEpLHRoaXMubWFuYWdlciYmdGhpcy5tYW5hZ2VyLnRvdWNoQWN0aW9uLnVwZGF0ZSgpLHRoaXN9LHJlY29nbml6ZVdpdGg6ZnVuY3Rpb24oYSl7aWYoZihhLCJyZWNvZ25pemVXaXRoIix0aGlzKSlyZXR1cm4gdGhpczt2YXIgYj10aGlzLnNpbXVsdGFuZW91cztyZXR1cm4gYT1fKGEsdGhpcyksYlthLmlkXXx8KGJbYS5pZF09YSxhLnJlY29nbml6ZVdpdGgodGhpcykpLHRoaXN9LGRyb3BSZWNvZ25pemVXaXRoOmZ1bmN0aW9uKGEpe3JldHVybiBmKGEsImRyb3BSZWNvZ25pemVXaXRoIix0aGlzKT90aGlzOihhPV8oYSx0aGlzKSxkZWxldGUgdGhpcy5zaW11bHRhbmVvdXNbYS5pZF0sdGhpcyl9LHJlcXVpcmVGYWlsdXJlOmZ1bmN0aW9uKGEpe2lmKGYoYSwicmVxdWlyZUZhaWx1cmUiLHRoaXMpKXJldHVybiB0aGlzO3ZhciBiPXRoaXMucmVxdWlyZUZhaWw7cmV0dXJuIGE9XyhhLHRoaXMpLC0xPT09cihiLGEpJiYoYi5wdXNoKGEpLGEucmVxdWlyZUZhaWx1cmUodGhpcykpLHRoaXN9LGRyb3BSZXF1aXJlRmFpbHVyZTpmdW5jdGlvbihhKXtpZihmKGEsImRyb3BSZXF1aXJlRmFpbHVyZSIsdGhpcykpcmV0dXJuIHRoaXM7YT1fKGEsdGhpcyk7dmFyIGI9cih0aGlzLnJlcXVpcmVGYWlsLGEpO3JldHVybiBiPi0xJiZ0aGlzLnJlcXVpcmVGYWlsLnNwbGljZShiLDEpLHRoaXN9LGhhc1JlcXVpcmVGYWlsdXJlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aD4wfSxjYW5SZWNvZ25pemVXaXRoOmZ1bmN0aW9uKGEpe3JldHVybiEhdGhpcy5zaW11bHRhbmVvdXNbYS5pZF19LGVtaXQ6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtjLm1hbmFnZXIuZW1pdChiLGEpfXZhciBjPXRoaXMsZD10aGlzLnN0YXRlO3FiPmQmJmIoYy5vcHRpb25zLmV2ZW50K1ooZCkpLGIoYy5vcHRpb25zLmV2ZW50KSxhLmFkZGl0aW9uYWxFdmVudCYmYihhLmFkZGl0aW9uYWxFdmVudCksZD49cWImJmIoYy5vcHRpb25zLmV2ZW50K1ooZCkpfSx0cnlFbWl0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNhbkVtaXQoKT90aGlzLmVtaXQoYSk6dm9pZCh0aGlzLnN0YXRlPXRiKX0sY2FuRW1pdDpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5yZXF1aXJlRmFpbC5sZW5ndGg7KXtpZighKHRoaXMucmVxdWlyZUZhaWxbYV0uc3RhdGUmKHRifG5iKSkpcmV0dXJuITE7YSsrfXJldHVybiEwfSxyZWNvZ25pemU6ZnVuY3Rpb24oYSl7dmFyIGI9bGEoe30sYSk7cmV0dXJuIGsodGhpcy5vcHRpb25zLmVuYWJsZSxbdGhpcyxiXSk/KHRoaXMuc3RhdGUmKHJifHNifHRiKSYmKHRoaXMuc3RhdGU9bmIpLHRoaXMuc3RhdGU9dGhpcy5wcm9jZXNzKGIpLHZvaWQodGhpcy5zdGF0ZSYob2J8cGJ8cWJ8c2IpJiZ0aGlzLnRyeUVtaXQoYikpKToodGhpcy5yZXNldCgpLHZvaWQodGhpcy5zdGF0ZT10YikpfSxwcm9jZXNzOmZ1bmN0aW9uKGEpe30sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXt9LHJlc2V0OmZ1bmN0aW9uKCl7fX0saShhYSxZLHtkZWZhdWx0czp7cG9pbnRlcnM6MX0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLnBvaW50ZXJzO3JldHVybiAwPT09Ynx8YS5wb2ludGVycy5sZW5ndGg9PT1ifSxwcm9jZXNzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc3RhdGUsYz1hLmV2ZW50VHlwZSxkPWImKG9ifHBiKSxlPXRoaXMuYXR0clRlc3QoYSk7cmV0dXJuIGQmJihjJkhhfHwhZSk/YnxzYjpkfHxlP2MmR2E/YnxxYjpiJm9iP2J8cGI6b2I6dGJ9fSksaShiYSxhYSx7ZGVmYXVsdHM6e2V2ZW50OiJwYW4iLHRocmVzaG9sZDoxMCxwb2ludGVyczoxLGRpcmVjdGlvbjpQYX0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMuZGlyZWN0aW9uLGI9W107cmV0dXJuIGEmTmEmJmIucHVzaChsYiksYSZPYSYmYi5wdXNoKGtiKSxifSxkaXJlY3Rpb25UZXN0OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucyxjPSEwLGQ9YS5kaXN0YW5jZSxlPWEuZGlyZWN0aW9uLGY9YS5kZWx0YVgsZz1hLmRlbHRhWTtyZXR1cm4gZSZiLmRpcmVjdGlvbnx8KGIuZGlyZWN0aW9uJk5hPyhlPTA9PT1mP0lhOjA+Zj9KYTpLYSxjPWYhPXRoaXMucFgsZD1NYXRoLmFicyhhLmRlbHRhWCkpOihlPTA9PT1nP0lhOjA+Zz9MYTpNYSxjPWchPXRoaXMucFksZD1NYXRoLmFicyhhLmRlbHRhWSkpKSxhLmRpcmVjdGlvbj1lLGMmJmQ+Yi50aHJlc2hvbGQmJmUmYi5kaXJlY3Rpb259LGF0dHJUZXN0OmZ1bmN0aW9uKGEpe3JldHVybiBhYS5wcm90b3R5cGUuYXR0clRlc3QuY2FsbCh0aGlzLGEpJiYodGhpcy5zdGF0ZSZvYnx8ISh0aGlzLnN0YXRlJm9iKSYmdGhpcy5kaXJlY3Rpb25UZXN0KGEpKX0sZW1pdDpmdW5jdGlvbihhKXt0aGlzLnBYPWEuZGVsdGFYLHRoaXMucFk9YS5kZWx0YVk7dmFyIGI9JChhLmRpcmVjdGlvbik7YiYmKGEuYWRkaXRpb25hbEV2ZW50PXRoaXMub3B0aW9ucy5ldmVudCtiKSx0aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcyxhKX19KSxpKGNhLGFhLHtkZWZhdWx0czp7ZXZlbnQ6InBpbmNoIix0aHJlc2hvbGQ6MCxwb2ludGVyczoyfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybltqYl19LGF0dHJUZXN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsYSkmJihNYXRoLmFicyhhLnNjYWxlLTEpPnRoaXMub3B0aW9ucy50aHJlc2hvbGR8fHRoaXMuc3RhdGUmb2IpfSxlbWl0OmZ1bmN0aW9uKGEpe2lmKDEhPT1hLnNjYWxlKXt2YXIgYj1hLnNjYWxlPDE/ImluIjoib3V0IjthLmFkZGl0aW9uYWxFdmVudD10aGlzLm9wdGlvbnMuZXZlbnQrYn10aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcyxhKX19KSxpKGRhLFkse2RlZmF1bHRzOntldmVudDoicHJlc3MiLHBvaW50ZXJzOjEsdGltZToyNTEsdGhyZXNob2xkOjl9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2hiXX0scHJvY2VzczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsYz1hLnBvaW50ZXJzLmxlbmd0aD09PWIucG9pbnRlcnMsZD1hLmRpc3RhbmNlPGIudGhyZXNob2xkLGY9YS5kZWx0YVRpbWU+Yi50aW1lO2lmKHRoaXMuX2lucHV0PWEsIWR8fCFjfHxhLmV2ZW50VHlwZSYoR2F8SGEpJiYhZil0aGlzLnJlc2V0KCk7ZWxzZSBpZihhLmV2ZW50VHlwZSZFYSl0aGlzLnJlc2V0KCksdGhpcy5fdGltZXI9ZShmdW5jdGlvbigpe3RoaXMuc3RhdGU9cmIsdGhpcy50cnlFbWl0KCl9LGIudGltZSx0aGlzKTtlbHNlIGlmKGEuZXZlbnRUeXBlJkdhKXJldHVybiByYjtyZXR1cm4gdGJ9LHJlc2V0OmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKX0sZW1pdDpmdW5jdGlvbihhKXt0aGlzLnN0YXRlPT09cmImJihhJiZhLmV2ZW50VHlwZSZHYT90aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQrInVwIixhKToodGhpcy5faW5wdXQudGltZVN0YW1wPXJhKCksdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LHRoaXMuX2lucHV0KSkpfX0pLGkoZWEsYWEse2RlZmF1bHRzOntldmVudDoicm90YXRlIix0aHJlc2hvbGQ6MCxwb2ludGVyczoyfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybltqYl19LGF0dHJUZXN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsYSkmJihNYXRoLmFicyhhLnJvdGF0aW9uKT50aGlzLm9wdGlvbnMudGhyZXNob2xkfHx0aGlzLnN0YXRlJm9iKX19KSxpKGZhLGFhLHtkZWZhdWx0czp7ZXZlbnQ6InN3aXBlIix0aHJlc2hvbGQ6MTAsdmVsb2NpdHk6LjMsZGlyZWN0aW9uOk5hfE9hLHBvaW50ZXJzOjF9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGJhLnByb3RvdHlwZS5nZXRUb3VjaEFjdGlvbi5jYWxsKHRoaXMpfSxhdHRyVGVzdDpmdW5jdGlvbihhKXt2YXIgYixjPXRoaXMub3B0aW9ucy5kaXJlY3Rpb247cmV0dXJuIGMmKE5hfE9hKT9iPWEub3ZlcmFsbFZlbG9jaXR5OmMmTmE/Yj1hLm92ZXJhbGxWZWxvY2l0eVg6YyZPYSYmKGI9YS5vdmVyYWxsVmVsb2NpdHlZKSx0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsYSkmJmMmYS5vZmZzZXREaXJlY3Rpb24mJmEuZGlzdGFuY2U+dGhpcy5vcHRpb25zLnRocmVzaG9sZCYmYS5tYXhQb2ludGVycz09dGhpcy5vcHRpb25zLnBvaW50ZXJzJiZxYShiKT50aGlzLm9wdGlvbnMudmVsb2NpdHkmJmEuZXZlbnRUeXBlJkdhfSxlbWl0OmZ1bmN0aW9uKGEpe3ZhciBiPSQoYS5vZmZzZXREaXJlY3Rpb24pO2ImJnRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCtiLGEpLHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCxhKX19KSxpKGdhLFkse2RlZmF1bHRzOntldmVudDoidGFwIixwb2ludGVyczoxLHRhcHM6MSxpbnRlcnZhbDozMDAsdGltZToyNTAsdGhyZXNob2xkOjkscG9zVGhyZXNob2xkOjEwfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybltpYl19LHByb2Nlc3M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLGM9YS5wb2ludGVycy5sZW5ndGg9PT1iLnBvaW50ZXJzLGQ9YS5kaXN0YW5jZTxiLnRocmVzaG9sZCxmPWEuZGVsdGFUaW1lPGIudGltZTtpZih0aGlzLnJlc2V0KCksYS5ldmVudFR5cGUmRWEmJjA9PT10aGlzLmNvdW50KXJldHVybiB0aGlzLmZhaWxUaW1lb3V0KCk7aWYoZCYmZiYmYyl7aWYoYS5ldmVudFR5cGUhPUdhKXJldHVybiB0aGlzLmZhaWxUaW1lb3V0KCk7dmFyIGc9dGhpcy5wVGltZT9hLnRpbWVTdGFtcC10aGlzLnBUaW1lPGIuaW50ZXJ2YWw6ITAsaD0hdGhpcy5wQ2VudGVyfHxIKHRoaXMucENlbnRlcixhLmNlbnRlcik8Yi5wb3NUaHJlc2hvbGQ7dGhpcy5wVGltZT1hLnRpbWVTdGFtcCx0aGlzLnBDZW50ZXI9YS5jZW50ZXIsaCYmZz90aGlzLmNvdW50Kz0xOnRoaXMuY291bnQ9MSx0aGlzLl9pbnB1dD1hO3ZhciBpPXRoaXMuY291bnQlYi50YXBzO2lmKDA9PT1pKXJldHVybiB0aGlzLmhhc1JlcXVpcmVGYWlsdXJlcygpPyh0aGlzLl90aW1lcj1lKGZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT1yYix0aGlzLnRyeUVtaXQoKX0sYi5pbnRlcnZhbCx0aGlzKSxvYik6cmJ9cmV0dXJuIHRifSxmYWlsVGltZW91dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90aW1lcj1lKGZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT10Yn0sdGhpcy5vcHRpb25zLmludGVydmFsLHRoaXMpLHRifSxyZXNldDpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLl90aW1lcil9LGVtaXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXRlPT1yYiYmKHRoaXMuX2lucHV0LnRhcENvdW50PXRoaXMuY291bnQsdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LHRoaXMuX2lucHV0KSl9fSksaGEuVkVSU0lPTj0iMi4wLjgiLGhhLmRlZmF1bHRzPXtkb21FdmVudHM6ITEsdG91Y2hBY3Rpb246Z2IsZW5hYmxlOiEwLGlucHV0VGFyZ2V0Om51bGwsaW5wdXRDbGFzczpudWxsLHByZXNldDpbW2VhLHtlbmFibGU6ITF9XSxbY2Ese2VuYWJsZTohMX0sWyJyb3RhdGUiXV0sW2ZhLHtkaXJlY3Rpb246TmF9XSxbYmEse2RpcmVjdGlvbjpOYX0sWyJzd2lwZSJdXSxbZ2FdLFtnYSx7ZXZlbnQ6ImRvdWJsZXRhcCIsdGFwczoyfSxbInRhcCJdXSxbZGFdXSxjc3NQcm9wczp7dXNlclNlbGVjdDoibm9uZSIsdG91Y2hTZWxlY3Q6Im5vbmUiLHRvdWNoQ2FsbG91dDoibm9uZSIsY29udGVudFpvb21pbmc6Im5vbmUiLHVzZXJEcmFnOiJub25lIix0YXBIaWdobGlnaHRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fTt2YXIgdWI9MSx2Yj0yO2lhLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKGEpe3JldHVybiBsYSh0aGlzLm9wdGlvbnMsYSksYS50b3VjaEFjdGlvbiYmdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKSxhLmlucHV0VGFyZ2V0JiYodGhpcy5pbnB1dC5kZXN0cm95KCksdGhpcy5pbnB1dC50YXJnZXQ9YS5pbnB1dFRhcmdldCx0aGlzLmlucHV0LmluaXQoKSksdGhpc30sc3RvcDpmdW5jdGlvbihhKXt0aGlzLnNlc3Npb24uc3RvcHBlZD1hP3ZiOnVifSxyZWNvZ25pemU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5zZXNzaW9uO2lmKCFiLnN0b3BwZWQpe3RoaXMudG91Y2hBY3Rpb24ucHJldmVudERlZmF1bHRzKGEpO3ZhciBjLGQ9dGhpcy5yZWNvZ25pemVycyxlPWIuY3VyUmVjb2duaXplcjsoIWV8fGUmJmUuc3RhdGUmcmIpJiYoZT1iLmN1clJlY29nbml6ZXI9bnVsbCk7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDspYz1kW2ZdLGIuc3RvcHBlZD09PXZifHxlJiZjIT1lJiYhYy5jYW5SZWNvZ25pemVXaXRoKGUpP2MucmVzZXQoKTpjLnJlY29nbml6ZShhKSwhZSYmYy5zdGF0ZSYob2J8cGJ8cWIpJiYoZT1iLmN1clJlY29nbml6ZXI9YyksZisrfX0sZ2V0OmZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBZKXJldHVybiBhO2Zvcih2YXIgYj10aGlzLnJlY29nbml6ZXJzLGM9MDtjPGIubGVuZ3RoO2MrKylpZihiW2NdLm9wdGlvbnMuZXZlbnQ9PWEpcmV0dXJuIGJbY107cmV0dXJuIG51bGx9LGFkZDpmdW5jdGlvbihhKXtpZihmKGEsImFkZCIsdGhpcykpcmV0dXJuIHRoaXM7dmFyIGI9dGhpcy5nZXQoYS5vcHRpb25zLmV2ZW50KTtyZXR1cm4gYiYmdGhpcy5yZW1vdmUoYiksdGhpcy5yZWNvZ25pemVycy5wdXNoKGEpLGEubWFuYWdlcj10aGlzLHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCksYX0scmVtb3ZlOmZ1bmN0aW9uKGEpe2lmKGYoYSwicmVtb3ZlIix0aGlzKSlyZXR1cm4gdGhpcztpZihhPXRoaXMuZ2V0KGEpKXt2YXIgYj10aGlzLnJlY29nbml6ZXJzLGM9cihiLGEpOy0xIT09YyYmKGIuc3BsaWNlKGMsMSksdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKSl9cmV0dXJuIHRoaXN9LG9uOmZ1bmN0aW9uKGEsYil7aWYoYSE9PWQmJmIhPT1kKXt2YXIgYz10aGlzLmhhbmRsZXJzO3JldHVybiBnKHEoYSksZnVuY3Rpb24oYSl7Y1thXT1jW2FdfHxbXSxjW2FdLnB1c2goYil9KSx0aGlzfX0sb2ZmOmZ1bmN0aW9uKGEsYil7aWYoYSE9PWQpe3ZhciBjPXRoaXMuaGFuZGxlcnM7cmV0dXJuIGcocShhKSxmdW5jdGlvbihhKXtiP2NbYV0mJmNbYV0uc3BsaWNlKHIoY1thXSxiKSwxKTpkZWxldGUgY1thXX0pLHRoaXN9fSxlbWl0OmZ1bmN0aW9uKGEsYil7dGhpcy5vcHRpb25zLmRvbUV2ZW50cyYma2EoYSxiKTt2YXIgYz10aGlzLmhhbmRsZXJzW2FdJiZ0aGlzLmhhbmRsZXJzW2FdLnNsaWNlKCk7aWYoYyYmYy5sZW5ndGgpe2IudHlwZT1hLGIucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXtiLnNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCl9O2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7KWNbZF0oYiksZCsrfX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudCYmamEodGhpcywhMSksdGhpcy5oYW5kbGVycz17fSx0aGlzLnNlc3Npb249e30sdGhpcy5pbnB1dC5kZXN0cm95KCksdGhpcy5lbGVtZW50PW51bGx9fSxsYShoYSx7SU5QVVRfU1RBUlQ6RWEsSU5QVVRfTU9WRTpGYSxJTlBVVF9FTkQ6R2EsSU5QVVRfQ0FOQ0VMOkhhLFNUQVRFX1BPU1NJQkxFOm5iLFNUQVRFX0JFR0FOOm9iLFNUQVRFX0NIQU5HRUQ6cGIsU1RBVEVfRU5ERUQ6cWIsU1RBVEVfUkVDT0dOSVpFRDpyYixTVEFURV9DQU5DRUxMRUQ6c2IsU1RBVEVfRkFJTEVEOnRiLERJUkVDVElPTl9OT05FOklhLERJUkVDVElPTl9MRUZUOkphLERJUkVDVElPTl9SSUdIVDpLYSxESVJFQ1RJT05fVVA6TGEsRElSRUNUSU9OX0RPV046TWEsRElSRUNUSU9OX0hPUklaT05UQUw6TmEsRElSRUNUSU9OX1ZFUlRJQ0FMOk9hLERJUkVDVElPTl9BTEw6UGEsTWFuYWdlcjppYSxJbnB1dDp4LFRvdWNoQWN0aW9uOlYsVG91Y2hJbnB1dDpQLE1vdXNlSW5wdXQ6TCxQb2ludGVyRXZlbnRJbnB1dDpNLFRvdWNoTW91c2VJbnB1dDpSLFNpbmdsZVRvdWNoSW5wdXQ6TixSZWNvZ25pemVyOlksQXR0clJlY29nbml6ZXI6YWEsVGFwOmdhLFBhbjpiYSxTd2lwZTpmYSxQaW5jaDpjYSxSb3RhdGU6ZWEsUHJlc3M6ZGEsb246bSxvZmY6bixlYWNoOmcsbWVyZ2U6dGEsZXh0ZW5kOnNhLGFzc2lnbjpsYSxpbmhlcml0OmksYmluZEZuOmoscHJlZml4ZWQ6dX0pO3ZhciB3Yj0idW5kZWZpbmVkIiE9dHlwZW9mIGE/YToidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTt3Yi5IYW1tZXI9aGEsImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZnVuY3Rpb24oKXtyZXR1cm4gaGF9KToidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9aGE6YVtjXT1oYX0od2luZG93LGRvY3VtZW50LCJIYW1tZXIiKTsKZnVuY3Rpb24gdDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1Zhcih0KXt0cnl7dmFyIGUsbj0vdmFyXCgoLS11Yy0oW14tXSspLShbXi1dKyktKFteLF0rKSksXHM/KC4qKVwpLy5leGVjKHQpO2lmKCFuKXJldHVybjt2YXIgaT1uWzBdLGE9blsxXSxyPW5bMl0sbz1uWzNdLHM9bls0XSxsPW5bNV0sXyxjO2lmKCEoaSYmciYmbyYmcyYmbCkpcmV0dXJuO3JldHVybntwYXJlbnQ6e2lkOnMsdHlwZTpyfSxmYWxsYmFjazp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKGEpfHxsLGZpZWxkOm99fWNhdGNoKG0pe2NvbnNvbGUuZXJyb3IoIkVycm9yIHRyeWluZyB0byBwYXJzZSBDU1MgVmFyaWFibGUiKX19ZnVuY3Rpb24gdDM5Nl9faGV4MnJnYmEodCxlKXtpZighdClyZXR1cm4hMTt2YXIgbj10Mzk2X19wYXJzZUdsb2JhbFN0eWxlQ1NTVmFyKHQpO24mJih0PW4uZmFsbGJhY2spO3ZhciBpPXQucmVwbGFjZSgvIy8sIiIpO2lmKDM9PT1pLmxlbmd0aCl7dmFyIGE9aVswXSxyPWlbMV0sbz1pWzJdO3Q9IiMiK2ErYStyK3IrbytvfXZhciBzPXBhcnNlSW50KHQuc3Vic3RyaW5nKDEpLDE2KSxsLF8sYztyZXR1cm5bKDE2NzExNjgwJnMpPj4xNiwoNjUyODAmcyk+PjgsMjU1JnMscGFyc2VGbG9hdChlKV19ZnVuY3Rpb24gdDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KXt2YXIgZT1bImdhbGxlcnkiXSxuPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO3JldHVybiBlLmluY2x1ZGVzKG4pfWZ1bmN0aW9uIHQzOTZfX2lzRmxleCh0KXt2YXIgZT10LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmQtZmxleCIpLG49dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2dyb3VwLWZsZXgiKTtyZXR1cm4gZXx8bn1mdW5jdGlvbiB0Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3Jkcygpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYodCl7dmFyIGU9WyIudDk1MV9fc2lkZWJhcl9zdGlja3kiLCIudDEyMDZfX2NvbnRlbnRfc3RpY2t5IiwiLnQ3NTRfX2NvbF9maXhlZCIsIi50Nzc2X19jb2xfZml4ZWQiLCIudDc4Nl9fY29sX2ZpeGVkIiwiLnQtc3RvcmVfX3Byb2QtcG9wdXBfX2NvbF9maXhlZCIsIi50LWNhdGFsb2dfX3NpZGViYXJfc3RpY2t5Il07dDM5Nl9fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlKCk7dmFyIG49Qm9vbGVhbihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUuam9pbigiLCAiKSkpO3QuY2xhc3NMaXN0LnJlbW92ZSgidC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIiwidC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4iKSx0LmNsYXNzTGlzdC5hZGQobj8idC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIjoidC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4iKX19ZnVuY3Rpb24gdDM5Nl9fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlKCl7aWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0Mzk2X19vdmVyZmxvdy1zdHlsZXMiKSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt0LmlkPSJ0Mzk2X19vdmVyZmxvdy1zdHlsZXMiLHQuaW5uZXJIVE1MPSIudC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIHsgb3ZlcmZsb3c6IGNsaXA7IH1cblx0XHRcdFx0XHRcdC50LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiB7IG92ZXJmbG93OiBoaWRkZW47IH0iLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9fWZ1bmN0aW9uIHQzOTZfX2dldEFydGJvYXJkcyh0KXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLG4saT1lJiYiZWRpdCI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik/Jy5yZWNvcmRbZGF0YS1yZWNvcmQtdHlwZT0iJyt0KyciXSAucjpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucmVjb3JkW2RhdGEtcGFyZW50dHBsaWQ9IicrdCsnIl0gLnI6bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCc6Jy5yW2RhdGEtcmVjb3JkLXR5cGU9IicrdCsnIl06bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCwgLnJbZGF0YS1wYXJlbnR0cGxpZD0iJyt0KyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJztyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGkpKX1mdW5jdGlvbiB0Mzk2X19nZXRaZXJvQmxvY2tzKCl7dmFyIHQ9W10uY29uY2F0KHQzOTZfX2dldEFydGJvYXJkcygiMzk2IiksdDM5Nl9fZ2V0QXJ0Ym9hcmRzKCIxMjEiKSksZTtyZXR1cm4gdC5sZW5ndGg/dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntyZWNvcmQ6dC5jbG9zZXN0KCIucjpub3QoLnQzOTdfX29mZik6bm90KC50Mzk1X19vZmYpOm5vdCgudDQwMF9fb2ZmKSIpLGFydGJvYXJkOnR9fSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVjb3JkfSkpOltdfWZ1bmN0aW9uIHQzOTZfX2lzSW5zaWRlR3JvdXBXaXRoWm9vbSh0KXtmb3IodmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtlOyl7dmFyIG47aWYoZS5zdHlsZS56b29tKXJldHVybiEwO2U9bnVsbD09KG49ZS5wYXJlbnRFbGVtZW50KT92b2lkIDA6bi5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKX1yZXR1cm4hMX12YXIgdDM5Nl9fdW5pcXVlSWRfX2dlbmVyYXRvcj1mdW5jdGlvbiB0KCl7dmFyIGU9MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1TdHJpbmcoZSs9MSkucGFkU3RhcnQoNiwiMCIpO3JldHVybiIiK0RhdGUubm93KCkrdH19LHQzOTZfX2dldFVuaXF1ZUlkPXQzOTZfX3VuaXF1ZUlkX19nZW5lcmF0b3IoKTtmdW5jdGlvbiB0Mzk2X2lzQmxvY2tWaXNpYmxlKHQpe3ZhciBlPXdpbmRvdy5pbm5lcldpZHRoLG49dC5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1pbiIpLGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1heCIpO3JldHVybiEobiYmZTxwYXJzZUludChuLDEwKSkmJiEoaSYmZT5wYXJzZUludChpLDEwKSl9dmFyIHQzOTZfX29uUmVhZHk9ZnVuY3Rpb24gdChlKXsibG9hZGluZyIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP2UoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixlKX07ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRGb3JtSW5wdXRzVmFsdWUodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9faW5wdXRzLXRleHRhcmVhIik7aWYoZSl7dmFyIG49ZS52YWx1ZTtpZihuKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShuKX1jYXRjaChyKXtyZXR1cm4gY29uc29sZS5lcnJvcigiRXJyb3IgcGFyc2luZyBmb3JtIGlucHV0cyB0ZXh0YXJlYSB2YWx1ZToiLHIsbiksW119fXZhciBpPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX2lucHV0cy1kYXRhIik7aWYoaSl7dmFyIGE9aS5nZXRBdHRyaWJ1dGUoImRhdGEtdmFsdWUiKTtpZihhKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShhKX1jYXRjaChyKXtyZXR1cm4gY29uc29sZS5lcnJvcigiRXJyb3IgcGFyc2luZyBmb3JtIGlucHV0cyBkYXRhOiIscixhKSxbXX19cmV0dXJuW119ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NoZWNrVmlzaWJpbGl0eVBhZ2UoKXsidmlzaWJsZSI9PT1kb2N1bWVudC52aXNpYmlsaXR5U3RhdGUmJih0X2FuaW1hdGlvblNCU19fb25SZWFkeSh0X2FuaW1hdGlvblNCU19faW5pdCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdF9hbmltYXRpb25TQlNfX2NoZWNrVmlzaWJpbGl0eVBhZ2UpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fb25SZWFkeSh0KXsibG9hZGluZyIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP3QoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix0KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19faW5pdCgpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksZT10PyJlZGl0Ij09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKTpudWxsO2V8fChlPUJvb2xlYW4oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZvcl9yZWRhY3Rvcl90b29sYmFyIikpKSwvQm90L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlPDExfHxlfHwodF9hbmltYXRpb25TQlNfX3Byb2Nlc3NIb3Jpem9udGFsU2Nyb2xsKCksdF9hbmltYXRpb25TQlNfX2lzWmVyb0Jsb2Nrc1JlbmRlcmVkKChmdW5jdGlvbigpe3RfYW5pbWF0aW9uU0JTX2lzSW5zdGFncmFtUmVuZGVyZWQoKGZ1bmN0aW9uKCl7dmFyIHQ7dF9hbmltYXRpb25TQlNfX3NldEF1dG9TY2FsZUluZm8oKSx0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVscyhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1hbmltYXRlLXNicy1ldmVudF0iKSkpLHRfYW5pbWF0aW9uU0JTX19pbml0QWxsUmVzKGUpfSkpfSkpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcHJvY2Vzc0hvcml6b250YWxTY3JvbGwoKXt2YXIgdD0nW2RhdGEtYW5pbWF0ZS1zYnMtZXZlbnQ9InNjcm9sbCJdJyxlPUFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0KSksbixpO2UubGVuZ3RoJiYoZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpfSkpLnNvbWUoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLW92cmZsdyIpO3JldHVyblsidmlzaWJsZSIsInZpc2libGVYIl0uaW5jbHVkZXMoZSl9KSk/dDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKToodF9hbmltYXRpb25TQlNfX2dlbmVyYXRlT3ZlcmZsb3dTdHlsZXMoKSxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlO3QuY2xvc2VzdCgiLnIiKS5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGlvbi1zYnNfX292ZXJmbG93LXgiKX0pKSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZU92ZXJmbG93U3R5bGVzKCl7aWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzYnMtYW5pbWF0aW9uLWJsb2NrLW92ZXJmbG93Iikpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7dC5pZD0ic2JzLWFuaW1hdGlvbi1ibG9jay1vdmVyZmxvdyIsdC5pbm5lckhUTUw9Ii50LWFuaW1hdGlvbi1zYnNfX292ZXJmbG93LXggeyBvdmVyZmxvdy14OiBoaWRkZW47IH0iLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRBdXRvU2NhbGVJbmZvKCl7aWYodm9pZCAwPT09d2luZG93LnNob3VsZFVzZVNjYWxlRmFjdG9yKXt2YXIgdD13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRmlyZWZveFwvKFswLTldKylcLi8pLGU9dD9wYXJzZUludCh0WzFdLDEwKToxMjYsbj13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXC8oWzAtOV0rKVwuLyksaT1uJiZwYXJzZUludChuWzFdLDEwKXx8MDt3aW5kb3cuaXNPbmx5U2NhbGFibGU9ZTwxMjYsd2luZG93LnNob3VsZFVzZVNjYWxlRmFjdG9yPSF3aW5kb3cuaXNPbmx5U2NhbGFibGUmJiF0JiZpPD0xMjd9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pc1plcm9CbG9ja3NSZW5kZXJlZCh0KXt2YXIgZT10X2FuaW1hdGlvblNCU19fZ2V0QXJ0Ym9hcmRzKCIzOTYiKSxuPXRfYW5pbWF0aW9uU0JTX19nZXRBcnRib2FyZHMoIjEyMSIpLGk9W10uY29uY2F0KGUsbik7aWYoaS5sZW5ndGgpe3ZhciBhPSExO2lmKGkuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygicmVuZGVyZWQiKX0pKSl0KCk7ZWxzZSBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHRbc3JjKj0idGlsZGEtYmxvY2tzLTIiXSwgc2NyaXB0W3NyYyo9InRpbGRhLWJsb2Nrcy0xIl0nKS5sZW5ndGgpdF9hbmltYXRpb25TQlNfX2JhY2t3YXJkQ29tcGF0aWJpbGl0eVdhaXQoaSxEYXRlLm5vdygpLHQpO2Vsc2V7dmFyIHI9aS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygicmVuZGVyZWQiKX0pKTtpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfHxlLmFkZEV2ZW50TGlzdGVuZXIoImFydEJvYXJkUmVuZGVyZWQiLChmdW5jdGlvbigpe3IucHVzaChlKSxyLmxlbmd0aCE9PWkubGVuZ3RofHxhfHx0KCl9KSl9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXthPSEwLHIubGVuZ3RoIT09aS5sZW5ndGgmJnQoKX0pLDNlMyl9fX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0QXJ0Ym9hcmRzKHQpe3ZhciBlPScucltkYXRhLXJlY29yZC10eXBlPSInK3QrJyJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yW2RhdGEtcGFyZW50dHBsaWQ9IicrdCsnIl06bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCc7cmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2JhY2t3YXJkQ29tcGF0aWJpbGl0eVdhaXQodCxlLG4pe2lmKHQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygicmVuZGVyZWQiKX0pKSluKCk7ZWxzZXtpZihEYXRlLm5vdygpLWU+MWU0KXJldHVybiB2b2lkIGNvbnNvbGUud2FybigiYWxsIHplcm8tYmxvY2tzIGNhbid0IGJlIHJlbmRlcmVkIik7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X2FuaW1hdGlvblNCU19fYmFja3dhcmRDb21wYXRpYmlsaXR5V2FpdCh0LGUsbil9KSw1MDApfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19pc0luc3RhZ3JhbVJlbmRlcmVkKHQpe2lmKHdpbmRvdy5hbmltYXRpb25TQlNfX2lzSU9TJiYtMSE9PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiSW5zdGFncmFtIikpdmFyIGU9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt3aW5kb3cuaW5uZXJXaWR0aCE9PXNjcmVlbi53aWR0aCYmd2luZG93LmlubmVySGVpZ2h0PndpbmRvdy5pbm5lcldpZHRoP3RfYW5pbWF0aW9uU0JTX2lzSW5zdGFncmFtUmVuZGVyZWQodCk6KGNsZWFyVGltZW91dChlKSx0KCkpfSksMTAwKTtlbHNlIHQoKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVscyh0KXt2YXIgZT0tMSE9PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIik7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKTtpZihuKXstMT09PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIikmJihuLnN0eWxlLldlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eT0iaGlkZGVuIixuLnN0eWxlLmJhY2tmYWNlVmlzaWJpbGl0eT0iaGlkZGVuIik7dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpLGE9dF9hbmltYXRpb25TQlNfX2dldEFuaW1PcHRpb25zKHQsInB1Ymxpc2hlZCIsbnVsbCk7aWYoIWkmJmEpe3ZhciByPWdldENvbXB1dGVkU3R5bGUobikuZGlzcGxheSxvO24uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1tb2xlY3VsZSIpJiYiZmxleCIhPT1yJiYobi5zdHlsZS5kaXNwbGF5PSJpbmhlcml0Iik7dmFyIHM9dF9hbmltYXRpb25TQlNfX2dldFNjYWxlV3JhcHBlcihuKSxsPXQuc3R5bGUudHJhbnNmb3JtLF87bCYmLTEhPT1sLmluZGV4T2YoIm1hdHJpeCgiKSYmKHRfYW5pbWF0aW9uU0JTX193cmFwRWwoc3x8biwidG4tYXRvbV9fc2JzLXRyYW5zZm9ybS13cmFwcGVyIiksKF89dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLXRyYW5zZm9ybS13cmFwcGVyIikpLnN0eWxlLnRyYW5zZm9ybT1sLHQuc3R5bGUudHJhbnNmb3JtPSIiKSx0X2FuaW1hdGlvblNCU19fd3JhcEVsKChfPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy10cmFuc2Zvcm0td3JhcHBlciIpKXx8c3x8biwidG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpLGk9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpLHRfYW5pbWF0aW9uU0JTX191cGRhdGVTdHlsZXNBZnRlcldyYXBwaW5nKHQsX3x8aSxlKX19fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRTY2FsZVdyYXBwZXIodCl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKSxuPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1hdG9tIik7cmV0dXJuIGUmJm4/bnVsbDp0LmNsb3Nlc3QoIi50bi1hdG9tX19zY2FsZS13cmFwcGVyIil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3dyYXBBbmRVcGRhdGVFbE9uUmVzaXplKHQpe2lmKHQubGVuZ3RoKXt2YXIgZT10LmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKX0pKTtlLmxlbmd0aCYmdF9hbmltYXRpb25TQlNfX3dyYXBBbmRVcGRhdGVFbHMoZSl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVTdHlsZXNBZnRlcldyYXBwaW5nKHQsZSxuKXt2YXIgaT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSxhPWdldENvbXB1dGVkU3R5bGUodCkscj10LnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKSxvPWEuZ2V0UHJvcGVydHlWYWx1ZSgiYm9yZGVyLXJhZGl1cyIpOyJzaGFwZSIhPT1pJiYiYnV0dG9uIiE9PWkmJiJpbWFnZSIhPT1pfHwhcGFyc2VJbnQobywxMCl8fChlLnN0eWxlLmJvcmRlclJhZGl1cz1vKTt2YXIgcz1bImZpbHRlciIsImJhY2tkcm9wLWZpbHRlciJdO3M9KHM9cy5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPSItd2Via2l0LSIrdCxuPWEuZ2V0UHJvcGVydHlWYWx1ZSh0KTtpZigibm9uZSIhPT1uJiYiIiE9PW58fChuPWEuZ2V0UHJvcGVydHlWYWx1ZShlKSksIm5vbmUiIT09biYmIiIhPT1uKXJldHVybntmaWx0ZXI6dCx3ZWJraXRGaWx0ZXI6ZSx2YWx1ZTpufX0pKSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKTt2YXIgcj10LnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKSxsPWdldENvbXB1dGVkU3R5bGUocikudHJhbnNmb3JtLF89ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7Xy5pbml0RXZlbnQoImJhY2tkcm9wRmlsdGVySW1nV3JhcHBlcmVkIiwhMCwhMCkscy5mb3JFYWNoKChmdW5jdGlvbihhKXt3aW5kb3cudF9hbmltYXRpb25TQlNfX2lzRmlyZWZveCYmKGUuc3R5bGUuYmFja2ZhY2VWaXNpYmlsaXR5PSJ2aXNpYmxlIiksZS5zdHlsZVthLndlYmtpdEZpbHRlcl09YS52YWx1ZSxlLnN0eWxlW2EuZmlsdGVyXT1hLnZhbHVlLHQuc3R5bGVbYS53ZWJraXRGaWx0ZXJdPSJub25lIix0LnN0eWxlW2EuZmlsdGVyXT0ibm9uZSIsImltYWdlIj09PWkmJndpbmRvdy50X2FuaW1hdGlvblNCU19faXNTYWZhcmkmJih0LmRpc3BhdGNoRXZlbnQoXyksdC5jbGFzc0xpc3QuYWRkKCJ0Mzk2X19lbGVtLS1iYWNrZHJvcC1maWx0ZXItaW1nLXdyYXBwZXJlZCIpKSxuJiYiYmFja2Ryb3AtZmlsdGVyIj09PWEuZmlsdGVyJiYoci5zdHlsZVthLndlYmtpdEZpbHRlcl09ImluaGVyaXQiLHIuc3R5bGVbYS5maWx0ZXJdPSJpbmhlcml0IiksIm5vbmUiPT09bCYmKHIuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVaKDApIil9KSk7dmFyIGM9cy5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4iYmFja2Ryb3AtZmlsdGVyIj09PXQuZmlsdGVyfSkpO24mJmMmJnRfYW5pbWF0aW9uU0JTX19jaHJvbWVGaXhCYWNrZHJvcEZpbHRlcihyLGUpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jaHJvbWVGaXhCYWNrZHJvcEZpbHRlcih0LGUpe3ZhciBuPWdldENvbXB1dGVkU3R5bGUodCksaT1uLmdldFByb3BlcnR5VmFsdWUoImJhY2tncm91bmQtY29sb3IiKSxhPW4uZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpLHI9bi5nZXRQcm9wZXJ0eVZhbHVlKCJib3gtc2hhZG93Iik7aWYoInJnYmEoMCwgMCwgMCwgMCkiIT09aSYmIjEiIT09YSl7dmFyIG89aS5zdWJzdHJpbmcoaS5pbmRleE9mKCIoIikrMSxpLmluZGV4T2YoIikiKSkscz10X2FuaW1hdGlvblNCU19fcHJvY2Vzc0JveFNoYWRvd1JHQihyLGEpO3MmJihlLnN0eWxlLmJveFNoYWRvdz1zLHQuc3R5bGUuYm94U2hhZG93PSJub25lIiksZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJnYmEoIitvKyIsIithKyIpIix0LnN0eWxlLm9wYWNpdHk9IjEiLHQuc3R5bGUuYmFja2dyb3VuZENvbG9yPSJ0cmFuc3BhcmVudCIsdC5zdHlsZS5iYWNrZHJvcEZpbHRlcj0iaW5pdGlhbCIsdC5zdHlsZS5XZWJraXRCYWNrZHJvcEZpbHRlcj0iaW5pdGlhbCJ9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcm9jZXNzQm94U2hhZG93UkdCKHQsZSl7aWYoIXQpcmV0dXJuITE7aWYoLTE9PT10LmluZGV4T2YoInJnYmEiKSYmLTE9PT10LmluZGV4T2YoInJnYiIpfHwiMSI9PT1lKXJldHVybiExO3ZhciBuPXQuc3Vic3RyaW5nKHQuaW5kZXhPZigiKCIpKzEsdC5pbmRleE9mKCIpIikpLGk9bi5zcGxpdCgiLCAiKTszPT09aS5sZW5ndGg/aS5wdXNoKGUpOmlbM10qPWU7dmFyIGE9dC5yZXBsYWNlKG4saS5qb2luKCIsICIpKTtyZXR1cm4tMSE9PWEuaW5kZXhPZigicmdiKCIpJiYoYT1hLnJlcGxhY2UoInJnYigiLCJyZ2JhKCIpKSxhfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0QWxsUmVzKHQpe3ZhciBlPXtlbGVtZW50czpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1hbmltYXRlLXNicy1ldmVudF0iKSksc2Nyb2xsVG9wOndpbmRvdy5wYWdlWU9mZnNldCxpc0VkaXRNb2RlOnQsY2xpY2tlZFRyaWdnZXJFbHM6W10saG92ZXJUcmlnZ2VyRWxzOltdfTtpZihlLmVsZW1lbnRzLmxlbmd0aCl7dF9hbmltYXRpb25TQlNfX2NhY2hlQW5kU2V0RGF0YShlKSx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXMoZSk7dmFyIG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxpPSEhbiYmInllcyI9PT1uLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5Iik7KCJ5Ij09PXdpbmRvdy5sYXp5fHxpKSYmdF9vbkZ1bmNMb2FkKCJ0X2xhenlsb2FkX3VwZGF0ZSIsKGZ1bmN0aW9uKCl7dF9sYXp5bG9hZF91cGRhdGUoKX0pKTt2YXIgYT10X2FuaW1hdGlvblNCU19fZ2V0QW5pbUVsc09uVmlldyhlLmVsZW1lbnRzKSxyLG89L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKCJSZXNpemVPYnNlcnZlciJpbiB3aW5kb3cpe3ZhciBzPXRfYW5pbWF0aW9uU0JTX19nZXRBbGxCcmVha3BvaW50cygpLGw7dF9hbmltYXRpb25TQlNfX2NyZWF0ZVJlc2l6ZU9ic2VydmVyKHticmVha3BvaW50czpzLGN1cnJlbnRSZXM6dF9hbmltYXRpb25TQlNfX2dldEN1cnJlbnRSZXMocyxvKSxpc01vYmlsZTpvfSxkKX1lbHNlIG8/d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIiwoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2QoKX0pLDMwMCl9KSk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZCk7dmFyIF89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQzOTYiKSxjO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoXywoZnVuY3Rpb24odCl7dC5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsZCl9KSksd2luZG93LnRfYW5pbWF0aW9uU0JTX19pc1NhZmFyaSl7ZnVuY3Rpb24gbSgpezAhPT13aW5kb3cucGFnZVlPZmZzZXQmJmQoKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixtKX13aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixtKX10X2FuaW1hdGlvblNCU19fdHJpZ2dlck5vU2Nyb2xsQW5pbWF0aW9uKGUsYSksZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYW5pbWF0ZS1zYnMtZXZlbnQ9InNjcm9sbCJdJykubGVuZ3RoJiYodF9hbmltYXRpb25TQlNfX3RyaWdnZXJTY3JvbGxBbmltKGUpLHRfYW5pbWF0aW9uU0JTX19jaGVja0ZyYW1lKGUpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25TQlNfX2NoYW5nZUVsVmFsdWVzKGUpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ImNvbXBsZXRlIiE9PWRvY3VtZW50LnJlYWR5U3RhdGUmJnRfYW5pbWF0aW9uU0JTX19jaGFuZ2VFbFZhbHVlcyhlKX0pLDNlMyl9ZnVuY3Rpb24gZCgpe2NsZWFyVGltZW91dChyKSxyPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtYW5pbWF0ZS1zYnMtZXZlbnRdIikpO3RfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKGUsImVsZW1lbnRzIix0KSx0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVsT25SZXNpemUoZS5lbGVtZW50cyksdF9hbmltYXRpb25TQlNfX2NhY2hlQW5kU2V0RGF0YShlKSx0X2FuaW1hdGlvblNCU19fdHJpZ2dlclNjcm9sbEFuaW0oZSksYT10X2FuaW1hdGlvblNCU19fZ2V0QW5pbUVsc09uVmlldyhlLmVsZW1lbnRzKSx0X2FuaW1hdGlvblNCU19fdHJpZ2dlck5vU2Nyb2xsQW5pbWF0aW9uKGUsYSksdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzKGUpfSksNTAwKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldEFuaW1FbHNPblZpZXcodCl7cmV0dXJuIHQuZmlsdGVyKChmdW5jdGlvbih0KXt2YXIgZT0iZGF0YS1hbmltYXRlLXNicy1ldmVudCI7cmV0dXJuImludG92aWV3Ij09PXQuZ2V0QXR0cmlidXRlKGUpfHwiYmxvY2tpbnRvdmlldyI9PT10LmdldEF0dHJpYnV0ZShlKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0QWxsQnJlYWtwb2ludHMoKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuciAudDM5Nl9fYXJ0Ym9hcmQiKSksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10X2FuaW1hdGlvblNCU19fZ2V0UmVzT3B0cyh0KSxpPW4uYnJlYWtwb2ludHMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4tMT09PWUuaW5kZXhPZih0KX0pKTstMT09PShlPWUuY29uY2F0KGkpKS5pbmRleE9mKG4ucmVzTWF4KSYmZS5wdXNoKG4ucmVzTWF4KX0pKSxlLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0Q3VycmVudFJlcyh0LGUpe3ZhciBuLGk9ZXx8Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQmJi0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJBcHBsZVdlYktpdCIpP2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDp3aW5kb3cuaW5uZXJXaWR0aDtyZXR1cm4gdC5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gaT50fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKHQsZSxuKXt0W2VdPW59ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEtleUZvckFuaW1hdGVkT2JqZWN0KHQsZSxuKXt0W2VdfHx0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZSh0LGUsbil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NyZWF0ZVJlc2l6ZU9ic2VydmVyKHQsZSl7dmFyIG49ZG9jdW1lbnQuYm9keS5nZXRDbGllbnRSZWN0cygpLGk9blswXS5oZWlnaHQsYTtuZXcgUmVzaXplT2JzZXJ2ZXIoKGZ1bmN0aW9uKGEpe2EuZm9yRWFjaCgoZnVuY3Rpb24oYSl7aWYoIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWJvZHlfc2Nyb2xsLWxvY2tlZCIpJiYhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInQtYm9keV9wb3B1cHNob3dlZCIpKXt2YXIgcj10X2FuaW1hdGlvblNCU19fZ2V0Q3VycmVudFJlcyh0LmJyZWFrcG9pbnRzLHQuaXNNb2JpbGUpO2EuY29udGVudFJlY3QuaGVpZ2h0PT09aSYmdC5jdXJyZW50UmVzPT09cnx8KHQuY3VycmVudFJlcz1yLGk9blswXS5oZWlnaHQsZSgpKX19KSl9KSkub2JzZXJ2ZShkb2N1bWVudC5ib2R5KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2hhbmdlRWxWYWx1ZXModCl7dC5lbGVtZW50cy5mb3JFYWNoKChmdW5jdGlvbihlKXtkb2N1bWVudC5jb250YWlucyhlKSYmKHRfYW5pbWF0aW9uU0JTX19zZXRBbmRDYWNoZUVsVG9wUG9zKGUsdCksInNjcm9sbCI9PT1lLmFuaW1UeXBlJiZ0X2FuaW1hdGlvblNCU19fdXBkYXRlU3RlcHNWYWx1ZXMoZSkpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jaGVja0ZyYW1lKHQpe3ZhciBlOyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lJiYodF9hbmltYXRpb25TQlNfX2NoZWNrUG9zQ2hhbmdlcyh0KSYmdF9hbmltYXRpb25TQlNfX3RyaWdnZXJTY3JvbGxBbmltKHQpLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24oKXt0X2FuaW1hdGlvblNCU19fY2hlY2tGcmFtZSh0KX0pKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NoZWNrUG9zQ2hhbmdlcyh0KXt2YXIgZT10LnNjcm9sbFRvcCxuPXdpbmRvdy5wYWdlWU9mZnNldDtyZXR1cm4gbjwwJiZ3aW5kb3cudF9hbmltYXRpb25TQlNfX2lzU2FmYXJpJiYobj0wKSx0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZSh0LCJzY3JvbGxUb3AiLG4pLGUhPT1ufWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX190cmlnZ2VyU2Nyb2xsQW5pbSh0KXt0LmVsZW1lbnRzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKCJzY3JvbGwiPT09ZS5hbmltVHlwZSl7dmFyIG49e29wYWNpdHk6MSxibHVyOjAsZml4OiExLGZpeGVkU2hpZnRZOjAsdHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxzY2FsZVg6MSxzY2FsZVk6MSxyb3RhdGU6MH07dF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNoZWNrU3RlcHModCxlLG4pLHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25VcGRhdGVUcmFuc2Zvcm0oZSxuKX19KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNoZWNrU3RlcHModCxlLG4pe2Uuc3RlcHMuZm9yRWFjaCgoZnVuY3Rpb24oaSxhKXt2YXIgcj10LnNjcm9sbFRvcCtlLnRyaWdnZXJPZmZzZXQsbz10X2FuaW1hdGlvblNCU19fZ2V0Wm9vbShlKTtlLnNjYWxlZERpZmZlcmVuY2UmJihyKz1lLnNjYWxlZERpZmZlcmVuY2UpO3ZhciBzPXI+PWkuc3RhcnQsbD1yPGkuc3RhcnQsXz1pLmVuZDw9cixjPWkuZW5kPnI7aWYocyYmYyl7aS5zdGF0ZT0ic3RhcnRlZCIsZS53cmFwcGVyRWwmJihlLndyYXBwZXJFbC5zdHlsZS53aWxsQ2hhbmdlPSJ0cmFuc2Zvcm0iKTt2YXIgbT1yLWkuc3RhcnQsZD0wPT09aS5kaXN0PzE6bS9pLmRpc3Q7bi5wcmV2VW5maXhlZERpc3Q9aS5wcmV2VW5maXhlZERpc3QsdF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNhbGNTdGVwU3R5bGVzKG4saSxkLGEsbyl9XyYmKGkuc3RhdGU9ImZpbmlzaGVkIixlLndyYXBwZXJFbCYmKGUud3JhcHBlckVsLnN0eWxlLndpbGxDaGFuZ2U9IiIpLHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25DYWxjU3RlcFN0eWxlcyhuLGksMSxhLG8pKSwhbHx8InN0YXJ0ZWQiIT09aS5zdGF0ZSYmImZpbmlzaGVkIiE9PWkuc3RhdGV8fChpLnN0YXRlPSJ1bmFjdGl2ZSIsZS53cmFwcGVyRWwmJihlLndyYXBwZXJFbC5zdHlsZS53aWxsQ2hhbmdlPSIiKSx0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uQ2FsY1N0ZXBTdHlsZXMobixpLDAsYSxvKSl9KSksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0Mzk2X19lbGVtLS1hbmltLWhpZGRlbiIpLGUuc3RlcHNbMV0mJjA9PT1lLnN0ZXBzWzFdLmRpc3QmJjA9PT1lLnN0ZXBzWzFdLnN0eWxlcy5vcGFjaXR5JiYidW5hY3RpdmUiPT09ZS5zdGVwc1sxXS5zdGF0ZSYmKG4ub3BhY2l0eT0wKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uQ2FsY1N0ZXBTdHlsZXModCxlLG4saSxhKXtpZighMD09PWUuc3R5bGVzLmZpeCYmInN0YXJ0ZWQiPT09ZS5zdGF0ZSYmKHQuZml4PSEwLHQuZml4ZWRTaGlmdFk9MCksITA9PT1lLnN0eWxlcy5maXgmJiJmaW5pc2hlZCI9PT1lLnN0YXRlJiYodC5maXg9ITEsdC5maXhlZFNoaWZ0WSs9ZS5kaXN0L2EpLCEwPT09ZS5zdHlsZXMuZml4JiYidW5hY3RpdmUiPT09ZS5zdGF0ZSl7aWYoaT4wJiYhMD09PXQuZml4KXJldHVybjt0LmZpeD0hMX10Lm9wYWNpdHkrPW4qKGUuc3R5bGVzLm9wYWNpdHktdC5vcGFjaXR5KSx0LmJsdXIrPW4qKGUuc3R5bGVzLmJsdXItdC5ibHVyKSx0LnRyYW5zbGF0ZVgrPW4qZS5zdHlsZXMubW92ZVgsdC50cmFuc2xhdGVZKz1uKmUuc3R5bGVzLm1vdmVZLHQuc2NhbGVYKz1uKihlLnN0eWxlcy5zY2FsZVgtdC5zY2FsZVgpLHQuc2NhbGVZKz1uKihlLnN0eWxlcy5zY2FsZVktdC5zY2FsZVkpLHQucm90YXRlKz1uKmUuc3R5bGVzLnJvdGF0ZX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uVXBkYXRlVHJhbnNmb3JtKHQsZSl7aWYodC53cmFwcGVyRWwpe3ZhciBuPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKHQpLGk9Z2V0Q29tcHV0ZWRTdHlsZSh0KS53aWxsQ2hhbmdlLGE9d2luZG93LmlzT25seVNjYWxhYmxlfHx0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpO2lmKCEwPT09ZS5maXgmJiJmaXhlZCIhPT10LndyYXBwZXJFbC5zdHlsZS5wb3NpdGlvbil7dmFyIHI9dC50cmlnZ2VyT2Zmc2V0LWUucHJldlVuZml4ZWREaXN0O2F8fChyLz1uKSx0LnNjYWxlZERpZmZlcmVuY2UmJihyKz10LnNjYWxlZERpZmZlcmVuY2UpLHQud3JhcHBlckVsLnN0eWxlLnRvcD1yKyJweCIsdC53cmFwcGVyRWwuc3R5bGUucG9zaXRpb249ImZpeGVkIixpJiYiYXV0byIhPT1pJiYodC5zdHlsZS53aWxsQ2hhbmdlPSJ1bnNldCIpLHQuekluZGV4JiYodC53cmFwcGVyRWwuc3R5bGUuekluZGV4PXQuekluZGV4KX0hMT09PWUuZml4JiYiZml4ZWQiPT09dC53cmFwcGVyRWwuc3R5bGUucG9zaXRpb24mJih0LndyYXBwZXJFbC5zdHlsZS5wb3NpdGlvbj0iIix0LndyYXBwZXJFbC5zdHlsZS50b3A9IiIsdC53cmFwcGVyRWwuc3R5bGUuekluZGV4PSIiLHQuekluZGV4JiYodC5zdHlsZS56SW5kZXg9dC56SW5kZXgpLHQuc3R5bGUud2lsbENoYW5nZT0iIiksdC53cmFwcGVyRWwuc3R5bGUub3BhY2l0eT1lLm9wYWNpdHkudG9TdHJpbmcoKTt2YXIgbz0iIjtpZihlLnRyYW5zbGF0ZVgpe3ZhciBzPWUudHJhbnNsYXRlWDthJiYocyo9biksbys9InRyYW5zbGF0ZVgoIitzLnRvRml4ZWQoMikrInB4KSJ9aWYoMCE9PWUudHJhbnNsYXRlWXx8MCE9PWUuZml4ZWRTaGlmdFkpe3ZhciBsPWUudHJhbnNsYXRlWStlLmZpeGVkU2hpZnRZO2EmJihsKj1uKSxvKz0idHJhbnNsYXRlWSgiK2wudG9GaXhlZCgyKSsicHgpIn0xPT09ZS5zY2FsZVgmJjE9PT1lLnNjYWxlWXx8KG8rPSJzY2FsZSgiK2Uuc2NhbGVYKyIsIitlLnNjYWxlWSsiKSIpLDAhPT1lLnJvdGF0ZSYmKG8rPSJyb3RhdGUoIitlLnJvdGF0ZSsiZGVnKSIpLHQud3JhcHBlckVsLnN0eWxlLnRyYW5zZm9ybT1vfHwic2NhbGUoMSkifX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXModCl7dmFyIGU9IiI7aWYodC5lbGVtZW50cy5mb3JFYWNoKChmdW5jdGlvbih0KXtpZigic2Nyb2xsIiE9PXQuYW5pbVR5cGUpe3ZhciBuPXt0aW1lRHVyYXRpb246MH0saT1bXSxhPXRfYW5pbWF0aW9uU0JTX19jcmVhdGVFbXB0eVN0eWxlT3B0aW9uc0ZvcktleWZyYW1lcyh0LnN0ZXBzKTt0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvbWJpbmVPYmplY3RzKHQuc3RlcHMsaSxuLGEpLHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdEZyYW1lcyhpKSx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvdW50UGVyY2VudChpLG4pLHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdE9wYWNpdHlPbkZpcnN0U3RlcCh0LGkpO3ZhciByPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0VHh0U3R5bGVzKHQsaSksbztpZihuLnRpbWVEdXJhdGlvbi89MWUzLHIpaWYoZSs9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRGaW5hbENzcyh0LG4sciksImhvdmVyIj09PXQuYW5pbVR5cGV8fCJjbGljayI9PT10LmFuaW1UeXBlKSghdC5sb29wfHwibG9vcHdpdGhyZXZlcnNlIj09PXQubG9vcCkmJihlKz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldFJldmVyc2VBbmltKHQpKX19KSksZSl7aWYodC5pc0VkaXRNb2RlKXJldHVybiBlO3ZhciBuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5zYnMtYW5pbS1rZXlmcmFtZXMiKTtuP24udGV4dENvbnRlbnQhPT1lJiYobi50ZXh0Q29udGVudD1lKTooKG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgic2JzLWFuaW0ta2V5ZnJhbWVzIiksbi50ZXh0Q29udGVudD1lLGRvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLG4pKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NyZWF0ZUVtcHR5U3R5bGVPcHRpb25zRm9yS2V5ZnJhbWVzKHQpe3JldHVybnttb3ZlWDp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuc3R5bGVzLm1vdmVYfSkpLG1vdmVZOnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dC5zdHlsZXMubW92ZVl9KSksc2NhbGVYOnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5zdHlsZXMuc2NhbGVYfSkpLHNjYWxlWTp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQuc3R5bGVzLnNjYWxlWX0pKSxyb3RhdGU6dC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10LnN0eWxlcy5yb3RhdGV9KSksYmx1cjp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuc3R5bGVzLmJsdXJ9KSksb3BhY2l0eTp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQuc3R5bGVzLm9wYWNpdHl9KSksZml4OnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiExPT09dC5zdHlsZXMuZml4fSkpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvbWJpbmVPYmplY3RzKHQsZSxuLGkpe3QuZm9yRWFjaCgoZnVuY3Rpb24oYSxyKXt2YXIgbz17fTtmb3IodmFyIHMgaW4gby5zdHlsZXM9YS5zdHlsZXMsaSlpW3NdJiZkZWxldGUgby5zdHlsZXNbc107Int9IiE9PUpTT04uc3RyaW5naWZ5KG8uc3R5bGVzKSYmKG8udGltZT0xKmEudGltZXx8MCxyIT09dC5sZW5ndGgtMSYmKG8uZWFzZT10W3IrMV0uZWFzZSksZS5wdXNoKG8pLG4udGltZUR1cmF0aW9uKz1vLnRpbWUpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdEZyYW1lcyh0KXt0LmZvckVhY2goKGZ1bmN0aW9uKGUsbil7dmFyIGk9bj09PXQubGVuZ3RoLTEsYT0wPT09bixyPWk/bnVsbDp0W24rMV0sbz1hP251bGw6dFtuLTFdO2Zvcih2YXIgcyBpbiBlLnN0eWxlcylhfHxzIGluIG8uc3R5bGVzfHx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2FkZFN0eWxlVG9LZXlmcmFtZShlLG8scywwKSxpfHwocyBpbiByLnN0eWxlcz8ibW92ZVgiIT09cyYmIm1vdmVZIiE9PXMmJiJyb3RhdGUiIT09c3x8dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19yZWNhbGN1bGF0ZVZhbHVlKGUscixzKTp0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2FkZFN0eWxlVG9LZXlmcmFtZShlLHIscywxKSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19hZGRTdHlsZVRvS2V5ZnJhbWUodCxlLG4saSl7ImJsdXIiIT09biYmInJvdGF0ZSIhPT1uJiYibW92ZVgiIT09biYmIm1vdmVZIiE9PW58fChlLnN0eWxlc1tuXT0wPT09aT8wOnQuc3R5bGVzW25dKSwib3BhY2l0eSIhPT1uJiYic2NhbGVYIiE9PW4mJiJzY2FsZVkiIT09bnx8KGUuc3R5bGVzW25dPTA9PT1pPzE6dC5zdHlsZXNbbl0pfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fcmVjYWxjdWxhdGVWYWx1ZSh0LGUsbil7c3dpdGNoKG4pe2Nhc2Uicm90YXRlIjplLnN0eWxlcy5yb3RhdGUrPXQuc3R5bGVzLnJvdGF0ZTticmVhaztjYXNlIm1vdmVYIjplLnN0eWxlcy5tb3ZlWCs9dC5zdHlsZXMubW92ZVg7YnJlYWs7Y2FzZSJtb3ZlWSI6ZS5zdHlsZXMubW92ZVkrPXQuc3R5bGVzLm1vdmVZfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvdW50UGVyY2VudCh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT10W25dLGE7aWYoMD09PW4pMD09PWUudGltZUR1cmF0aW9uP2kucGVyY2VudD0wOihhPSgxMDAqaS50aW1lL2UudGltZUR1cmF0aW9uKS50b0ZpeGVkKDIpLGkucGVyY2VudD1wYXJzZUZsb2F0KGEpKTtlbHNlIGlmKG49PT10Lmxlbmd0aC0xKWkucGVyY2VudD0xMDA7ZWxzZXt2YXIgcj10W24tMV0ucGVyY2VudDtpZigwPT09ZS50aW1lRHVyYXRpb24paS5wZXJjZW50PTA7ZWxzZXtpZihhPSgxMDAqaS50aW1lL2UudGltZUR1cmF0aW9uK3IpLnRvRml4ZWQoMiksMTAwPT09cGFyc2VJbnQoYSwxMCkmJm49PT10Lmxlbmd0aC0yJiYwIT09biljb250aW51ZTtpLnBlcmNlbnQ9cGFyc2VGbG9hdChhKX1pLnBlcmNlbnQ9PT1yJiYoaS5wZXJjZW50Kz0xKSxpLnBlcmNlbnQ+MTAwJiYoaS5wZXJjZW50PTk5KX19fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdE9wYWNpdHlPbkZpcnN0U3RlcCh0LGUpe3ZhciBuPWVbMV07dCYmdC5jbGFzc0xpc3QucmVtb3ZlKCJ0Mzk2X19lbGVtLS1hbmltLWhpZGRlbiIpO3ZhciBpPXQ/dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpOm51bGw7biYmMD09PW4udGltZSYmMD09PW4uc3R5bGVzLm9wYWNpdHk/KGkmJihpLnN0eWxlLm9wYWNpdHk9IjAiKSxlWzBdLnN0eWxlcy5vcGFjaXR5PTApOmkmJiIwIj09PWkuc3R5bGUub3BhY2l0eSYmaSYmKGkuc3R5bGUub3BhY2l0eT0iIil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRUeHRTdHlsZXModCxlKXt2YXIgbj0iIjtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmNoYW5nZXN8fChlLmNoYW5nZXM9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRGcmFtZUNoYW5nZXModCxlKSksbis9Im51bWJlciI9PXR5cGVvZiBlLnBlcmNlbnQ/ZS5wZXJjZW50KyIlIHsiK2UuY2hhbmdlcysifVxuIjoiIn0pKSxufWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fc2hvdWxkVXNlWm9vbSh0LGUpe3ZhciBuLGk7aWYodDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KSlyZXR1cm4hdDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKHQpO3ZhciBhLHI9dF9hbmltYXRpb25TQlNfX2dldFNjYWxlV3JhcHBlcih0LnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKSk7cmV0dXJuISgxIT09ZSYmIXIpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0RnJhbWVDaGFuZ2VzKHQsZSl7dmFyIG49IiIsaT0iIixhPXt4OjEseToxLGNoYW5nZWQ6ITF9LHI9MSxvPXQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCk7KHdpbmRvdy5pc09ubHlTY2FsYWJsZXx8bykmJihyPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKHQpKTt2YXIgcz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX3Nob3VsZFVzZVpvb20odCxyKTtmb3IodmFyIGwgaW4gc3x8KHI9MSksZS5zdHlsZXMpc3dpdGNoKGwpe2Nhc2Uib3BhY2l0eSI6bis9Im9wYWNpdHk6IitlLnN0eWxlcy5vcGFjaXR5KyI7IjticmVhaztjYXNlInNjYWxlWCI6YS54PWUuc3R5bGVzLnNjYWxlWCxhLmNoYW5nZWQ9ITA7YnJlYWs7Y2FzZSJzY2FsZVkiOmEueT1lLnN0eWxlcy5zY2FsZVksYS5jaGFuZ2VkPSEwO2JyZWFrO2Nhc2UibW92ZVgiOmkrPSJ0cmFuc2xhdGVYKCIrTWF0aC5yb3VuZChlLnN0eWxlcy5tb3ZlWCpyKSsicHgpIjticmVhaztjYXNlIm1vdmVZIjppKz0idHJhbnNsYXRlWSgiK01hdGgucm91bmQoZS5zdHlsZXMubW92ZVkqcikrInB4KSI7YnJlYWs7Y2FzZSJyb3RhdGUiOmkrPSJyb3RhdGUoIitlLnN0eWxlcy5yb3RhdGUrImRlZykifWlmKCEwPT09YS5jaGFuZ2VkJiYoaSs9InNjYWxlKCIrYS54KyIsIithLnkrIikiKSwiIiE9PWkmJihuKz0idHJhbnNmb3JtOiIraSsiOyIpLHZvaWQgMCE9PWUuZWFzZSlzd2l0Y2gobis9ImFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IixlLmVhc2Upe2Nhc2UiZWFzZUluIjpuKz0iZWFzZS1pbjsiO2JyZWFrO2Nhc2UiZWFzZU91dCI6bis9ImVhc2Utb3V0OyI7YnJlYWs7Y2FzZSJlYXNlSW5PdXQiOm4rPSJlYXNlLWluLW91dDsiO2JyZWFrO2Nhc2UiYm91bmNlRmluIjpuKz0iY3ViaWMtYmV6aWVyKDAuMzQsMS42MSwwLjcsMSk7IjticmVhaztkZWZhdWx0Om4rPSIiPT09ZS5lYXNlLnRyaW0oKT8ibGluZWFyOyI6ZS5lYXNlKyI7In1yZXR1cm4gbn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldEZpbmFsQ3NzKHQsZSxuKXt2YXIgaT0iIixhPXQudW5pcXVlSUQscj0iLnQtc2JzLWFuaW1fc3RhcnRlZCAjIit0LnVuaXF1ZUlELG87InB1Ymxpc2hlZCIhPT13aW5kb3cudGlsZGFtb2RlJiYodC50aW1lRHVyYXRpb249ZS50aW1lRHVyYXRpb24pLGkrPXIrIiB7XG5hbmltYXRpb246ICIrYSsiICIrKDA9PT1lLnRpbWVEdXJhdGlvbj8xZS01OmUudGltZUR1cmF0aW9uKSsicyI7dmFyIHM9dC5sb29wJiYtMSE9PXQubG9vcC5pbmRleE9mKCJsb29wIik7cmV0dXJuIHMmJihpKz0iIGluZmluaXRlIiksaSs9IiBsaW5lYXIiLHM/Imxvb3B3aXRocmV2ZXJzZSI9PT10Lmxvb3AmJihpKz0iIGFsdGVybmF0ZSIpOmkrPSIgZm9yd2FyZHMiLGkrPSI7XG5iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbkBrZXlmcmFtZXMgIithKyIge1xuIituKyJ9XG5cbiJ9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRSZXZlcnNlQW5pbSh0KXt2YXIgZT10X2FuaW1hdGlvblNCU19fZ2V0QXR0cmlidXRlU2VsZWN0b3IodCksbixpLGE9IlsiK2UuYXR0cmlidXRlKyc9IicrZS5pZCsnIl0nLHI7cmV0dXJuIiMiKyh0LmNsb3Nlc3QoIi50LXJlYyIpP3QuY2xvc2VzdCgiLnQtcmVjIikuZ2V0QXR0cmlidXRlKCJpZCIpOiIiKSsiICIrYSsiLnQtc2JzLWFuaW1fc3RhcnRlZC50LXNicy1hbmltX3JldmVyc2VkIC50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIHstd2Via2l0LWFuaW1hdGlvbi1kaXJlY3Rpb246IHJldmVyc2U7YW5pbWF0aW9uLWRpcmVjdGlvbjogcmV2ZXJzZTt9In1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0QXR0cmlidXRlU2VsZWN0b3IodCl7dmFyIGU9e2ZlZWQ6ImRhdGEtZmUtZWxlbS1pZCIsZ3JvdXA6ImRhdGEtZ3JvdXAtaWQiLGVsZW1lbnQ6ImRhdGEtZWxlbS1pZCJ9LG49T2JqZWN0LmtleXMoZSkuZmluZCgoZnVuY3Rpb24obil7cmV0dXJuIHQuaGFzQXR0cmlidXRlKGVbbl0pfSkpO3JldHVybiBuJiZlW25dP3thdHRyaWJ1dGU6ZVtuXSxpZDp0LmdldEF0dHJpYnV0ZShlW25dKXx8IiJ9OnthdHRyaWJ1dGU6IiIsaWQ6IiJ9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBbmltT3B0aW9ucyh0LGUsbil7aWYoIXQpcmV0dXJuIiI7dmFyIGk9WyJzYnMiLCJvcHRzIl07bnx8KG49ImVkaXQiPT09ZT9pLmpvaW4oIiIpOmkuam9pbigiLSIpKTt2YXIgYT0iZWRpdCI9PT1lPyJmaWVsZCI6ImFuaW1hdGUiLHI9ImVkaXQiPT09ZT8iLXZhbHVlIjoiIixvPSJlZGl0Ij09PWU/ImRhdGEtZmllbGQtYW5pbW1vYmlsZS12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1tb2JpbGUiLHM9InkiPT09dC5nZXRBdHRyaWJ1dGUobyksbCxfPXRfYW5pbWF0aW9uU0JTX19nZXRSZXNPcHRzKHQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIikpLGM9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlQXR0cihhLG4sciwhMSk7aWYoXy5yZXM9PT1fLnJlc01heClyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoYyk7aWYoIXMmJiJlZGl0IiE9PWUmJl8ucmVzPDEyMDApcmV0dXJuIHQuc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsdC5jbGFzc0xpc3QucmVtb3ZlKCJ0Mzk2X19lbGVtLS1hbmltLWhpZGRlbiIpLCIiO3ZhciBtPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUF0dHIoYSxuLHIsXy5yZXMpLGQ9dC5nZXRBdHRyaWJ1dGUobSk7cmV0dXJuIGR8fChfLmJyZWFrcG9pbnRzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKCEoZTw9Xy5yZXN8fGQpKXt2YXIgaT10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVBdHRyKGEsbixyLGUpO2Q9dC5nZXRBdHRyaWJ1dGUoaSl9fSkpLGR8fHQuZ2V0QXR0cmlidXRlKGMpfHwiIil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlQXR0cih0LGUsbixpKXt2YXIgYT0iZGF0YS0iK3QrIi0iK2U7cmV0dXJuIGkmJihhKz0iLXJlcy0iK2kpLGErPW59ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldFJlc09wdHModCl7dmFyIGU9WzEyMDAsOTYwLDY0MCw0ODAsMzIwXTtpZighd2luZG93LnRuKXt2YXIgbixpPXdpbmRvdy5pbm5lcldpZHRoO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKHQpe258fGk+PXQmJihuPXQpfSkpLHtyZXM6bnx8MzIwLHJlc01heDoxMjAwLGJyZWFrcG9pbnRzOlszMjAsNDgwLDY0MCw5NjBdfX12YXIgYT10P3QuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIik6IiIsbjtyZXR1cm4gYSYmd2luZG93LnRuWyJhYiIrYV0/e3Jlczp3aW5kb3cudDM5Nl9kZXRlY3RSZXNvbHV0aW9uP3QzOTZfZGV0ZWN0UmVzb2x1dGlvbihhKTp3aW5kb3cudG5bImFiIithXS5jdXJSZXNvbHV0aW9uLHJlc01heDp3aW5kb3cudG5bImFiIithXS5jdXJSZXNvbHV0aW9uX21heCxicmVha3BvaW50czp3aW5kb3cudG5bImFiIithXS5zY3JlZW5zLnNsaWNlKDAsLTEpfTp3aW5kb3cudG4uc2NyZWVucz97cmVzOndpbmRvdy50bi5jdXJSZXNvbHV0aW9uLHJlc01heDp3aW5kb3cudG4udG9wUmVzb2x1dGlvbixicmVha3BvaW50czp3aW5kb3cudG4uc2NyZWVucy5zbGljZSgwLC0xKX06e3JlczpuPXRfYW5pbWF0aW9uU0JTX19nZXRDdXJyZW50UmVzKGUsd2luZG93LmlzTW9iaWxlKSxyZXNNYXg6MTIwMCxicmVha3BvaW50czpbMzIwLDQ4MCw2NDAsOTYwXX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NhY2hlQW5kU2V0RGF0YSh0KXt0LmVsZW1lbnRzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWUuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIik7aWYoInNjcm9sbCIhPT1lLmFuaW1UeXBlfHwhbnx8ImZpeGVkIiE9PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobiwicG9zIikpe3ZhciBpPXQuaXNFZGl0TW9kZT8iZGF0YS1maWVsZC1zYnNldmVudC12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiO2UuYW5pbVR5cGU9ZS5nZXRBdHRyaWJ1dGUoaSk7dmFyIGE9dC5pc0VkaXRNb2RlPyJkYXRhLWZpZWxkLXNic3RyZy12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1zYnMtdHJnIjtlLnRyaWdnZXI9cGFyc2VGbG9hdChlLmdldEF0dHJpYnV0ZShhKSksaXNOYU4oZS50cmlnZ2VyKSYmKGUudHJpZ2dlcj0xKSxlLnRyaWdnZXJFbGVtcz10X2FuaW1hdGlvblNCU19fZ2V0QW5pbU9wdGlvbnMoZSwicHVibGlzaGVkIiwic2JzLXRyZ2VscyIpLGUud3JhcHBlckVsPWUucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKTt2YXIgcj10X2FuaW1hdGlvblNCU19fZ2V0QW5pbU9wdGlvbnMoZSx0LmlzRWRpdE1vZGU/ImVkaXQiOiJwdWJsaXNoZWQiLG51bGwpO2lmKGUuc3RhdHVzPXI/ImFjdGl2ZSI6ImlubmFjdGl2ZSIsImlubmFjdGl2ZSIhPT1lLnN0YXR1cyl7LTEhPT1yLmluZGV4T2YoImZpeGVkIikmJihlLnpJbmRleD1nZXRDb21wdXRlZFN0eWxlKGUpLmdldFByb3BlcnR5VmFsdWUoInotaW5kZXgiKSkscj1yLnJlcGxhY2UoLycvZywnIicpLHRfYW5pbWF0aW9uU0JTX19hZGREZWxheVRvU3RlcHMocj1KU09OLnBhcnNlKHIpKTt2YXIgbz10LmlzRWRpdE1vZGU/ImRhdGEtZmllbGQtc2JzbG9vcC12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1zYnMtbG9vcCI7ZS5sb29wPWUuZ2V0QXR0cmlidXRlKG8pfHwiIix0X2FuaW1hdGlvblNCU19fc2V0QW5kQ2FjaGVFbFRvcFBvcyhlLHQpO3ZhciBzPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKGUpO2Uuc3RlcHM9W107dmFyIGw9MDtyLmZvckVhY2goKGZ1bmN0aW9uKHQsbil7dmFyIGk9e3N0YXRlOiJ1bmFjdGl2ZSJ9O2kuc3R5bGVzPXRfYW5pbWF0aW9uU0JTX19jcmVhdGVTdGVwU3R5bGVzKHQpLCJzY3JvbGwiPT09ZS5hbmltVHlwZT8oaS5wcmV2VW5maXhlZERpc3Q9bCxpLmRpc3Q9dC5kaSpzLCExPT09aS5zdHlsZXMuZml4JiYobCs9aS5kaXN0KSxpLnN0YXJ0PTA9PT1uP2UudG9wT2Zmc2V0OmUuc3RlcHNbbi0xXS5lbmQsaS5lbmQ9aS5zdGFydCtpLmRpc3QpOihpLnRpbWU9dC50aSxpLmVhc2U9dC5lYSksZS5zdGVwcy5wdXNoKGkpfSkpLCFlLndyYXBwZXJFbHx8ZS53cmFwcGVyRWwuaWQmJmUudW5pcXVlSUR8fHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZVVuaXF1ZUlERm9yRWwoZSksdF9hbmltYXRpb25TQlNfX3VwZGF0ZUluZm9PbkltZ0xvYWQoZSx0KSx0X2FuaW1hdGlvblNCU19fdXBkYXRlTW92ZUFuZFJvdGF0ZVN0ZXBzU3R5bGVzKGUuc3RlcHMpfX19KSk7dmFyIGU9dC5lbGVtZW50cy5maWx0ZXIoKGZ1bmN0aW9uKHQpe2lmKCJpbm5hY3RpdmUiPT09dC5zdGF0dXMpe3ZhciBlPXRfYW5pbWF0aW9uU0JTX19nZXRTaXplQmFzZWRPbkRpbWVuc2lvbk1vZGUodCksbj1lLndpZHRoLGk9ZS5oZWlnaHQ7dC53cmFwcGVyRWwmJnQud3JhcHBlckVsLnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKSx0LndyYXBwZXJFbCYmKHQud3JhcHBlckVsLnN0eWxlLmRpc3BsYXk9ImluaGVyaXQiKSx0LndyYXBwZXJFbCYmKHQud3JhcHBlckVsLnN0eWxlLndpZHRoPW4pLHQud3JhcHBlckVsJiYodC53cmFwcGVyRWwuc3R5bGUuaGVpZ2h0PWkpfXJldHVybiJpbm5hY3RpdmUiIT09dC5zdGF0dXN9KSk7dF9hbmltYXRpb25TQlNfX3VwZGF0ZUFuaW1hdGVkT2JqZWN0U3RhdGUodCwiZWxlbWVudHMiLGUpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZVVuaXF1ZUlERm9yRWwodCl7dmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQsIC50bi1hcnRib2FyZCIpLG49IiI7ZSYmKG49ZS5nZXRBdHRyaWJ1dGUoImRhdGEtcmVjb3JkLWlkIil8fGUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpO3ZhciBpLGE9dF9hbmltYXRpb25TQlNfX2dldEF0dHJpYnV0ZVNlbGVjdG9yKHQpLmlkO3QudW5pcXVlSUQ9InNicy0iK24rIi0iK2EsdC53cmFwcGVyRWwuaWQ9dC51bmlxdWVJRH1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdXBkYXRlSW5mb09uSW1nTG9hZCh0LGUpe3ZhciBuPXQucXVlcnlTZWxlY3RvcigiaW1nIik7biYmKG4uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25TQlNfX3VwZGF0ZVZhbHVlc0F0ZXJJTUdMb2FkaW5nKHQsZSl9KSksbi5jb21wbGV0ZSYmdF9hbmltYXRpb25TQlNfX3VwZGF0ZVZhbHVlc0F0ZXJJTUdMb2FkaW5nKHQsZSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVWYWx1ZXNBdGVySU1HTG9hZGluZyh0LGUpe3RfYW5pbWF0aW9uU0JTX19zZXRBbmRDYWNoZUVsVG9wUG9zKHQsZSksInNjcm9sbCI9PT10LmFuaW1UeXBlJiZ0X2FuaW1hdGlvblNCU19fdXBkYXRlU3RlcHNWYWx1ZXModCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZVN0ZXBzVmFsdWVzKHQpe3Quc3RlcHMuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXtlLnN0YXJ0PTA9PT1uP3QudG9wT2Zmc2V0OnQuc3RlcHNbbi0xXS5lbmQsZS5lbmQ9ZS5zdGFydCtlLmRpc3R9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEFuZENhY2hlRWxUb3BQb3ModCxlKXt2YXIgbj10X2FuaW1hdGlvblNCU19fZ2V0Wm9vbSh0KSxpLGE9WyJzY3JvbGwiLCJpbnRvdmlldyIsImJsb2NraW50b3ZpZXciXS5ldmVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuYW5pbVR5cGUhPT1lfSkpO2lmKCFlLmlzRWRpdE1vZGUmJiFhKXt2YXIgcj10X2FuaW1hdGlvblNCU19fZ2V0VG9wT2Zmc2V0KHQpO3IrPXRfYW5pbWF0aW9uU0JTX19hY2N1bXVsYXRlUGFyZW50R3JvdXBPZmZzZXQodCksInNjcm9sbCIhPT10LmFuaW1UeXBlJiYiaW50b3ZpZXciIT09dC5hbmltVHlwZXx8d2luZG93LmlzT25seVNjYWxhYmxlfHx0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpfHwocio9bik7dmFyIG89dC5jbG9zZXN0KCIuciIpLHM9bz9vLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ6MCxsPW8mJnBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUobykucGFkZGluZ1RvcCwxMCl8fDA7dC5wYXJlbnRSZWNUb3BQb3M9cyx0LnRvcE9mZnNldD1zK3IrbCx0X2FuaW1hdGlvblNCU19fc2V0U2NhbGVkRGlmZmVyZW5jZSh0LG4pLHRfYW5pbWF0aW9uU0JTX19zZXRUcmlnZ2VyT2Zmc2V0KHQpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0VG9wT2Zmc2V0KHQpe2lmKCF0KXJldHVybiAwO2lmKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWZlLWVsZW0taWQiKSlyZXR1cm4gdC5vZmZzZXRUb3A7dmFyIGU9cGFyc2VJbnQodC5zdHlsZS50b3AsMTApO3JldHVybiBpc05hTihlKT90Lm9mZnNldFRvcHx8MDplfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19hY2N1bXVsYXRlUGFyZW50R3JvdXBPZmZzZXQodCl7Zm9yKHZhciBlPTAsbj10LnBhcmVudEVsZW1lbnQuY2xvc2VzdCgiLnQzOTZfX2dyb3VwIik7bjspZSs9dF9hbmltYXRpb25TQlNfX2dldFRvcE9mZnNldChuKSxuPW4ucGFyZW50RWxlbWVudC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtyZXR1cm4gZX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0U2NhbGVkRGlmZmVyZW5jZSh0LGUpe2lmKCF0LnNjYWxlZERpZmZlcmVuY2UmJndpbmRvdy5pc09ubHlTY2FsYWJsZSYmImZpeGVkIiE9PXQud3JhcHBlckVsLnN0eWxlLnBvc2l0aW9uJiZ0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpKXt2YXIgbj10LndyYXBwZXJFbD90LndyYXBwZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ6MCxpPU1hdGguYWJzKChuKmUtbikvMik7aT1NYXRoLnJvdW5kKGkpLHQuc2NhbGVkRGlmZmVyZW5jZT1pfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYWRkRGVsYXlUb1N0ZXBzKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXt2YXIgbj10W2VdO2lmKDAhPT1lJiYocGFyc2VJbnQobi5kZCwxMCl8fHBhcnNlSW50KG4uZHQsMTApKSl7dmFyIGk9T2JqZWN0LmNyZWF0ZSh0W2UtMV0pO3ZvaWQgMCE9PW4uZHQ/aS50aT1uLmR0OmkuZGk9bi5kZCx0LnNwbGljZShlLDAsaSksZSsrfX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZU1vdmVBbmRSb3RhdGVTdGVwc1N0eWxlcyh0KXt2YXIgZT10WzBdLnN0eWxlcy5tb3ZlWCxuPXRbMF0uc3R5bGVzLm1vdmVZLGk9dFswXS5zdHlsZXMucm90YXRlO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGE9dC5zdHlsZXM7YS5tb3ZlWC09ZSxlKz1hLm1vdmVYLGEubW92ZVktPW4sbis9YS5tb3ZlWSxhLnJvdGF0ZS09aSxpKz1hLnJvdGF0ZX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY3JlYXRlU3RlcFN0eWxlcyh0KXtyZXR1cm57bW92ZVg6cGFyc2VJbnQodC5teCwxMCl8fDAsbW92ZVk6cGFyc2VJbnQodC5teSwxMCl8fDAsc2NhbGVYOmlzTmFOKHBhcnNlRmxvYXQodC5zeCkpPzE6cGFyc2VGbG9hdCh0LnN4KSxzY2FsZVk6aXNOYU4ocGFyc2VGbG9hdCh0LnN5KSk/MTpwYXJzZUZsb2F0KHQuc3kpLG9wYWNpdHk6aXNOYU4ocGFyc2VGbG9hdCh0Lm9wKSk/MTpwYXJzZUZsb2F0KHQub3ApLHJvdGF0ZTpwYXJzZUludCh0LnJvLDEwKXx8MCxibHVyOnBhcnNlSW50KHQuYmwsMTApfHwwLGZpeDoiZml4ZWQiPT09dC5maX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldFRyaWdnZXJPZmZzZXQodCl7dmFyIGU9d2luZG93LmlubmVySGVpZ2h0LG49dF9hbmltYXRpb25TQlNfX2dldFpvb20odCk7dC50cmlnZ2VyT2Zmc2V0PXBhcnNlSW50KHRfYW5pbWF0aW9uU0JTX19nZXRBbmltT3B0aW9ucyh0LCJwdWJsaXNoZWQiLCJzYnMtdHJnb2ZzdCIpLDEwKSwod2luZG93LmlzT25seVNjYWxhYmxlfHwic2Nyb2xsIj09PXQuYW5pbVR5cGV8fHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCkpJiYodC50cmlnZ2VyT2Zmc2V0Kj1uKSx0LnRyaWdnZXJPZmZzZXR8fCh0LnRyaWdnZXJPZmZzZXQ9MCksLjUhPT10LnRyaWdnZXImJjEhPT10LnRyaWdnZXJ8fCh0LnRyaWdnZXJPZmZzZXQrPWUqdC50cmlnZ2VyLCgiaW50b3ZpZXciPT09dC5hbmltVHlwZXx8InNjcm9sbCI9PT10LmFuaW1UeXBlKSYmdC50cmlnZ2VyT2Zmc2V0PnQudG9wT2Zmc2V0JiZ0LnRyaWdnZXJPZmZzZXQ8PWUqdC50cmlnZ2VyJiYodC50cmlnZ2VyT2Zmc2V0PXQudG9wT2Zmc2V0LHQuc2NhbGVkRGlmZmVyZW5jZSYmKHQudHJpZ2dlck9mZnNldDwwfHx0LnRyaWdnZXJPZmZzZXQ9PT10LnNjYWxlZERpZmZlcmVuY2UpJiYodC5zY2FsZWREaWZmZXJlbmNlPTApKSwiYmxvY2tpbnRvdmlldyI9PT10LmFuaW1UeXBlJiZ0LnRyaWdnZXJPZmZzZXQ+dC5wYXJlbnRSZWNUb3BQb3MmJnQudHJpZ2dlck9mZnNldDw9ZSp0LnRyaWdnZXImJih0LnRyaWdnZXJPZmZzZXQ9dC5wYXJlbnRSZWNUb3BQb3MpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdHJpZ2dlck5vU2Nyb2xsQW5pbWF0aW9uKHQsZSl7dF9hbmltYXRpb25TQlNfX3Byb2Nlc3NFbHNJbnRvVmlldyh0LGUpLHRfYW5pbWF0aW9uU0JTX19yZW1vdmVIb3ZlckNsaWNrVHJpZ2dlcnModCksdF9hbmltYXRpb25TQlNfX2luaXRDbGlja1RyaWdnZXJzKHQpLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2Vycyh0KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcHJvY2Vzc0Vsc0ludG9WaWV3KHQsZSl7dF9hbmltYXRpb25TQlNfX3VwZGF0ZUludG9WaWV3RWxzU3RhdGUoZSk7dmFyIG49MDt0X2FuaW1hdGlvblNCU19fc2V0S2V5Rm9yQW5pbWF0ZWRPYmplY3QodCwib25TY3JvbGxVcGRhdGVFbHNJbnRvVmlldyIsKGZ1bmN0aW9uKCl7bnx8KG49c2V0VGltZW91dCgoZnVuY3Rpb24oKXt2YXIgZTt0X2FuaW1hdGlvblNCU19fdXBkYXRlSW50b1ZpZXdFbHNTdGF0ZSh0X2FuaW1hdGlvblNCU19fZ2V0QW5pbUVsc09uVmlldyh0LmVsZW1lbnRzKSksbj0wfSksMjAwKSl9KSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdC5vblNjcm9sbFVwZGF0ZUVsc0ludG9WaWV3KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0Lm9uU2Nyb2xsVXBkYXRlRWxzSW50b1ZpZXcpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19yZW1vdmVIb3ZlckNsaWNrVHJpZ2dlcnModCl7dmFyIGU9WyJqcy1zYnMtYW5pbS10cmlnZ2VyX2NsaWNrIiwianMtc2JzLWFuaW0tdHJpZ2dlcl9ob3ZlciJdLG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLiIrZS5qb2luKCIsIC4iKSk7bi5sZW5ndGgmJigobj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChuKSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNsYXNzTGlzdC5yZW1vdmUoZSl9KSl9KSksdC5jbGlja2VkVHJpZ2dlckVscy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0X2FuaW1hdGlvblNCU19faW5pdENsaWNrQ2FsbGJhY2spLHRfYW5pbWF0aW9uU0JTX19yZW1vdmVUcmlnZ2VyTGlzdCh0LCJjbGljayIpfSkpLHQuaG92ZXJUcmlnZ2VyRWxzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0X2FuaW1hdGlvblNCU19fcmVtb3ZlVHJpZ2dlckxpc3QodCwiaG92ZXIiKX0pKSx0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZSh0LCJjbGlja2VkVHJpZ2dlckVscyIsW10pLHRfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKHQsImhvdmVyVHJpZ2dlckVscyIsW10pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcmVtb3ZlVHJpZ2dlckxpc3QodCxlKXt0WyJ0cmlnZ2VyTGlzdC1vbi0iK2VdJiYodFsidHJpZ2dlckxpc3Qtb24tIitlXT1bXSksdFsidHJpZ2dlck9uY2VMaXN0LW9uLSIrZV0mJih0WyJ0cmlnZ2VyT25jZUxpc3Qtb24tIitlXT1bXSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2luaXRDbGlja1RyaWdnZXJzKHQpe3ZhciBlPXQuZWxlbWVudHMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4iY2xpY2siPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiKX0pKTtpZihlLmxlbmd0aCl7dF9hbmltYXRpb25TQlNfX2Nvbm5lY3RUcmlnZ2Vyc1dpdGhBbmltRWxzKGUpO3ZhciBuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1zYnMtYW5pbS10cmlnZ2VyX2NsaWNrIikpO2lmKG4ubGVuZ3RoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImpzLXNicy1hbmltLXRyaWdnZXItc3R5bGVzIikpe3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7aS5pZD0ianMtc2JzLWFuaW0tdHJpZ2dlci1zdHlsZXMiLGkudGV4dENvbnRlbnQ9Ii5qcy1zYnMtYW5pbS10cmlnZ2VyX2NsaWNrIHsgY3Vyc29yOiBwb2ludGVyOyB9Iixkb2N1bWVudC5oZWFkLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIixpKX10LmNsaWNrZWRUcmlnZ2VyRWxzPW4sbi5mb3JFYWNoKChmdW5jdGlvbih0KXt0X2FuaW1hdGlvblNCU19fcHJldmVudEFuaW1hdGVkUGFyZW50VHJpZ2dlcih0KSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0X2FuaW1hdGlvblNCU19faW5pdENsaWNrQ2FsbGJhY2spLHQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfYW5pbWF0aW9uU0JTX19pbml0Q2xpY2tDYWxsYmFjayl9KSl9fX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19faW5pdENsaWNrQ2FsbGJhY2soKXt2YXIgdD10aGlzWyJ0cmlnZ2VyTGlzdC1vbi1jbGljayJdfHxbXSxlPXRoaXNbInRyaWdnZXJPbmNlTGlzdC1vbi1jbGljayJdfHxbXTsodC5sZW5ndGh8fGUubGVuZ3RoKSYmKHRfYW5pbWF0aW9uU0JTX19wbGF5T25jZUFuaW1hdGlvbih0aGlzLGUsImNsaWNrIiksdC5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9zdGFydGVkIikmJiF0LmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9yZXZlcnNlZCIpP3RfYW5pbWF0aW9uU0JTX19zZXRBY3Rpb25PbkVuZCh0KTp0X2FuaW1hdGlvblNCU19fc2V0QWN0aW9uT25TdGFydCh0KX0pKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3BsYXlPbmNlQW5pbWF0aW9uKHQsZSxuKXtpZihlJiZlLmxlbmd0aCl7dF9hbmltYXRpb25TQlNfX2FjdGlvbk9uU3RhcnQoZSk7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7aS5pbml0RXZlbnQoInVwZGF0ZUFuaW1PbmNlIiwhMCwhMCksZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmRpc3BhdGNoRXZlbnQoaSl9KSksdFsidHJpZ2dlck9uY2VMaXN0LW9uLSIrbl09W119fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2Vycyh0KXt2YXIgZT10LmVsZW1lbnRzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuImhvdmVyIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLWV2ZW50Iil9KSk7aWYoZS5sZW5ndGgpe3RfYW5pbWF0aW9uU0JTX19jb25uZWN0VHJpZ2dlcnNXaXRoQW5pbUVscyhlKTt2YXIgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtc2JzLWFuaW0tdHJpZ2dlcl9ob3ZlciIpO249QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobiksdC5ob3ZlclRyaWdnZXJFbHM9bixuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RfYW5pbWF0aW9uU0JTX19wcmV2ZW50QW5pbWF0ZWRQYXJlbnRUcmlnZ2VyKHQpLHdpbmRvdy5hbmltYXRpb25TQlNfX2lzSU9TPyh0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlciksdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpKToodC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlciksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlciksdC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlciksdC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlcikpfSkpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcHJldmVudEFuaW1hdGVkUGFyZW50VHJpZ2dlcih0KXtpZigibm9uZSIhPT1nZXRDb21wdXRlZFN0eWxlKHQpLnBvaW50ZXJFdmVudHMpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpO2UmJih0LnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiLGUuc3R5bGUucG9pbnRlckV2ZW50cz0iYXV0byIpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlcih0KXt2YXIgZT10LmN1cnJlbnRUYXJnZXQsbj10LmN1cnJlbnRUYXJnZXRbInRyaWdnZXJMaXN0LW9uLWhvdmVyIl0saT10LmN1cnJlbnRUYXJnZXRbInRyaWdnZXJPbmNlTGlzdC1vbi1ob3ZlciJdO2Z1bmN0aW9uIGEodCl7ZS5jbG9zZXN0KCIudDM5Nl9fZWxlbSIpIT09dC50YXJnZXQuY2xvc2VzdCgiLnQzOTZfX2VsZW0iKSYmKHRfYW5pbWF0aW9uU0JTX19hY3Rpb25PbkVuZChuKSxlLmNsYXNzTGlzdC5yZW1vdmUoInQtaG92ZXItbW9iLWFjdGl2ZSIpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixhKSl9KG4mJm4ubGVuZ3RofHxpJiZpLmxlbmd0aCkmJih0X2FuaW1hdGlvblNCU19fcGxheU9uY2VBbmltYXRpb24oZSxpLCJob3ZlciIpLG4mJm4ubGVuZ3RoJiYoIm1vdXNlZW50ZXIiPT09dC50eXBlJiZ0X2FuaW1hdGlvblNCU19fYWN0aW9uT25TdGFydChuKSwibW91c2VsZWF2ZSI9PT10LnR5cGUmJnRfYW5pbWF0aW9uU0JTX19hY3Rpb25PbkVuZChuKSwiY2xpY2siPT09dC50eXBlJiYoZS5jbGFzc0xpc3QuY29udGFpbnMoInQtaG92ZXItbW9iLWFjdGl2ZSIpfHwoc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X2FuaW1hdGlvblNCU19fYWN0aW9uT25TdGFydChuKSxlLmNsYXNzTGlzdC5hZGQoInQtaG92ZXItbW9iLWFjdGl2ZSIpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGEpfSkpKSkpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY29ubmVjdFRyaWdnZXJzV2l0aEFuaW1FbHModCl7dmFyIGU9dFswXS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiKTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXQudHJpZ2dlckVsZW1zO2lmKG4pe3ZhciBpPW4/bi5zcGxpdCgiLCIpOltdLGE9dC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSxyPWE/YS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKToiIjtpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPXIrbixhO3RfYW5pbWF0aW9uU0JTX19wcm9jZXNzVHJpZ2dlcnNFbGVtTGlzdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fIitpKyIsIC50bi1ncm91cF9fIitpKSx0LGUpfSkpfWVsc2V7dmFyIG87dF9hbmltYXRpb25TQlNfX3Byb2Nlc3NUcmlnZ2Vyc0VsZW1MaXN0KHQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKSx0LGUpfX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcHJvY2Vzc1RyaWdnZXJzRWxlbUxpc3QodCxlLG4pe3ZhciBpO3QmJigib25jZSI9PT1lLmxvb3A/ZS5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fc3RhcnRlZCIpfHx0X2FuaW1hdGlvblNCU19faW5pdFRyaWdnZXJzTGlzdCh0LCJ0cmlnZ2VyT25jZUxpc3QiLG4sZSk6dF9hbmltYXRpb25TQlNfX2luaXRUcmlnZ2Vyc0xpc3QodCwidHJpZ2dlckxpc3QiLG4sZSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0VHJpZ2dlcnNMaXN0KHQsZSxuLGkpe3RbZSsiLW9uLSIrbl0/LTE9PT10W2UrIi1vbi0iK25dLmluZGV4T2YoaSkmJnRbZSsiLW9uLSIrbl0ucHVzaChpKTp0W2UrIi1vbi0iK25dPVtpXSx0W2UrIi1vbi0iK25dLmxlbmd0aCYmIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1zYnMtYW5pbS10cmlnZ2VyXyIrbikmJnQuY2xhc3NMaXN0LmFkZCgianMtc2JzLWFuaW0tdHJpZ2dlcl8iK24pLGkuYWRkRXZlbnRMaXN0ZW5lcigidXBkYXRlQW5pbU9uY2UiLChmdW5jdGlvbigpe3RbZSsiLW9uLSIrbl09dFtlKyItb24tIituXS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0IT09aX0pKSx0WyJ0cmlnZ2VyTGlzdC1vbi0iK25dJiZ0WyJ0cmlnZ2VyTGlzdC1vbi0iK25dLmxlbmd0aHx8dC5jbGFzc0xpc3QucmVtb3ZlKCJqcy1zYnMtYW5pbS10cmlnZ2VyXyIrbil9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2FjdGlvbk9uU3RhcnQodCl7dC5mb3JFYWNoKHRfYW5pbWF0aW9uU0JTX19zZXRBY3Rpb25PblN0YXJ0KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0QWN0aW9uT25TdGFydCh0KXt0LmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9wbGF5aW5nIik/dC5zZXRBdHRyaWJ1dGUoImRhdGEtcGxhbm5lZC1kaXIiLCJwbGF5Iik6dF9hbmltYXRpb25TQlNfX3BsYXlBbmltYXRpb24odCwhMSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2FjdGlvbk9uRW5kKHQpe3QuZm9yRWFjaCh0X2FuaW1hdGlvblNCU19fc2V0QWN0aW9uT25FbmQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRBY3Rpb25PbkVuZCh0KXt2YXIgZT10Lmxvb3Asbj0ibm9yZXZlcnNlIj09PWUmJiJob3ZlciI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1ldmVudCIpO2UmJi0xIT09ZS5pbmRleE9mKCJsb29wIik/dC5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25pdGVyYXRpb24iLHRfYW5pbWF0aW9uU0JTX19zZXRJdGVyYXRpb25BbmltYXRpb24pOnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3BsYXlpbmciKSYmIW4/dC5zZXRBdHRyaWJ1dGUoImRhdGEtcGxhbm5lZC1kaXIiLCJyZXZlcnNlIik6bnx8dF9hbmltYXRpb25TQlNfX3BsYXlBbmltYXRpb24odCwhMCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEl0ZXJhdGlvbkFuaW1hdGlvbih0KXt2YXIgZT10LnRhcmdldC5jbG9zZXN0KCIudDM5Nl9fZWxlbSIpO2lmKGUpe2lmKCJsb29wd2l0aHJldmVyc2UiPT09ZS5sb29wKXt2YXIgbj10X2FuaW1hdGlvblNCU19fZ2V0QW5pbWF0aW9uRnVsbFRpbWUoZSwhMCksaSxhO2lmKDFlMyp0LmVsYXBzZWRUaW1lL24lMiE9MClyZXR1cm59ZS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKSxlLmNsYXNzTGlzdC5yZW1vdmUoInQtc2JzLWFuaW1fcmV2ZXJzZWQiKSxlLmNsYXNzTGlzdC5yZW1vdmUoInQtc2JzLWFuaW1fcGxheWluZyIpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uaXRlcmF0aW9uIix0X2FuaW1hdGlvblNCU19fc2V0SXRlcmF0aW9uQW5pbWF0aW9uKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2FuaW1hdGlvbkVuZCh0KXt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsdF9hbmltYXRpb25TQlNfX2FuaW1hdGlvbkVuZGluZ0V2ZW50KSx0LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsdF9hbmltYXRpb25TQlNfX2FuaW1hdGlvbkVuZGluZ0V2ZW50KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYW5pbWF0aW9uRW5kaW5nRXZlbnQoKXt0aGlzLmNsYXNzTGlzdC5yZW1vdmUoInQtc2JzLWFuaW1fcGxheWluZyIpO3ZhciB0PXRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLXBsYW5uZWQtZGlyIik7InBsYXkiPT09dCYmdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fcmV2ZXJzZWQiKT90X2FuaW1hdGlvblNCU19fcGxheUFuaW1hdGlvbih0aGlzLCExKToicmV2ZXJzZSIhPT10fHx0aGlzLmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9yZXZlcnNlZCIpfHx0X2FuaW1hdGlvblNCU19fcGxheUFuaW1hdGlvbih0aGlzLCEwKSx0aGlzLnNldEF0dHJpYnV0ZSgiZGF0YS1wbGFubmVkLWRpciIsIiIpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBbmltYXRpb25GdWxsVGltZSh0LGUpe3ZhciBuLGk7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLW9wdHMiKT9KU09OLnBhcnNlKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLW9wdHMiKS5zcGxpdCgiJyIpLmpvaW4oJyInKSkucmVkdWNlKChmdW5jdGlvbih0LG4pe3JldHVybiBlJiYodCs9cGFyc2VJbnQobi5kdCwxMCl8fDApLHQrKHBhcnNlSW50KG4udGksMTApfHwwKX0pLDApOjB9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3BsYXlBbmltYXRpb24odCxlKXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtc2JzLWFuaW1fc3RhcnRlZCIpLGV8fHQuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9yZXZlcnNlZCIpLHRfYW5pbWF0aW9uU0JTX19mb3JjZVJlcGFpbnQodCk7dmFyIG49dF9hbmltYXRpb25TQlNfX2dldEFuaW1hdGlvbkZ1bGxUaW1lKHQsITEpLGk9WyJ0LXNicy1hbmltX3N0YXJ0ZWQiXTtlJiZpLnB1c2goInQtc2JzLWFuaW1fcmV2ZXJzZWQiKSxuPjAmJmkucHVzaCgidC1zYnMtYW5pbV9wbGF5aW5nIiksaS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNsYXNzTGlzdC5hZGQoZSl9KSksdF9hbmltYXRpb25TQlNfX2FuaW1hdGlvbkVuZCh0KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZm9yY2VSZXBhaW50KHQpe3Qub2Zmc2V0V2lkdGh9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZUludG9WaWV3RWxzU3RhdGUodCl7dCYmdC5sZW5ndGgmJnQuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoZG9jdW1lbnQuY29udGFpbnModCkpe3ZhciBlPXdpbmRvdy5wYWdlWU9mZnNldCt0LnRyaWdnZXJPZmZzZXQsbj0iYmxvY2tpbnRvdmlldyI9PT10LmFuaW1UeXBlP2U+PXQucGFyZW50UmVjVG9wUG9zOmU+PXQudG9wT2Zmc2V0LGk9dC5jbG9zZXN0KCIudDM5NiIpLnBhcmVudEVsZW1lbnQsYSxyPVsidDM5N19fb2ZmIiwidDM5NV9fb2ZmIiwidDQwMF9fb2ZmIl0uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIGkuY2xhc3NMaXN0LmNvbnRhaW5zKHQpfSkpO24mJiFyJiYodC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fc3RhcnRlZCIpfHx0LmNsYXNzTGlzdC5hZGQoInQtc2JzLWFuaW1fc3RhcnRlZCIpKX19KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldFpvb20odCl7aWYodm9pZCAwIT09dC5zY2FsZUZhY3RvcilyZXR1cm4gdC5zY2FsZUZhY3Rvcjt2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpO2lmKCFlKXJldHVybiAxO3ZhciBuPWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIik7cmV0dXJuIGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19hcnRib2FyZF9zY2FsZSIpfHwhd2luZG93LmFuaW1hdGlvblNCU19faXNPbGRQYWdlJiYidW5kZWZpbmVkIiE9dHlwZW9mIHQzOTZfYWJfX2dldEZpZWxkVmFsdWUmJiJ3aW5kb3ciPT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShlLCJ1cHNjYWxlIik/biYmd2luZG93LnRuWyJhYiIrbl0mJndpbmRvdy50blsiYWIiK25dLnNjYWxlRmFjdG9yfHx3aW5kb3cudG5fc2NhbGVfZmFjdG9yOjF9ZnVuY3Rpb24gdF9hbmltYXRlU2JzX193cmFwQXRvbUVscygpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWFuaW1hdGUtc2JzLWV2ZW50XSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbSIpO2lmKGUmJiFlLmNsb3Nlc3QoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIikpe3RfYW5pbWF0aW9uU0JTX193cmFwRWwoZSwidG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpO3ZhciBuPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpLGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUodCkuZ2V0UHJvcGVydHlWYWx1ZSgiYm9yZGVyLXJhZGl1cyIpO2lmKCJzaGFwZSI9PT1uJiZpJiZwYXJzZUludChpKSl7dmFyIGE9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpO2EmJihhLnN0eWxlLmJvcmRlclJhZGl1cz1pKX19fSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZVNic19fY2FzaEVsc0luZm8odCl7dmFyIGU9dC5lbHM7dC50cmlnZ2VyRWxlbXNBdHRyTmFtZT0iZWRpdCI9PT10Lm1vZGU/ImRhdGEtZmllbGQtc2JzdHJnZWxzLXZhbHVlIjoiZGF0YS1hbmltYXRlLXNicy10cmdlbHMiLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24oZSl7ZS5zdGF0ZT0idW5hY3RpdmUiLGUuYW5pbVR5cGU9ImVkaXQiPT09dC5tb2RlP2UuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLXNic2V2ZW50LXZhbHVlIik6ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiKSxlLmNoYW5nZVR5cGU9InNjcm9sbCI9PT1lLmFuaW1UeXBlPyJzY3JvbGwiOiJ0aW1lIixlLnRyaWdnZXI9ImVkaXQiPT09dC5tb2RlP2UuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLXNic3RyZy12YWx1ZSIpOmUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLXRyZyIpLGUudHJpZ2dlcj1lLnRyaWdnZXI/ZS50cmlnZ2VyOjEsZS50cmlnZ2VyRWxlbXM9ZS5nZXRBdHRyaWJ1dGUodC50cmlnZ2VyRWxlbXNBdHRyTmFtZSksZS53cmFwcGVyRWw9ZS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpLGUuc3RlcHM9W107dmFyIG49ImVkaXQiPT09dC5tb2RlP2UuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLXNic29wdHMtdmFsdWUiKTplLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1vcHRzIik7aWYobil7LTEhPT1uLmluZGV4T2YoImZpeGVkIikmJihlLnpJbmRleD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5nZXRQcm9wZXJ0eVZhbHVlKCJ6LWluZGV4IikpLG49bi5yZXBsYWNlKC8nL2csJyInKTt2YXIgaT1KU09OLnBhcnNlKG4pO3RfYW5pbWF0aW9uU0JTX19hZGREZWxheVRvU3RlcHMoaSksZS5sb29wPSJlZGl0Ij09PXQubW9kZT9lLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC1zYnNsb29wLXZhbHVlIik6ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtbG9vcCIpLHRfYW5pbWF0aW9uU0JTX19zZXRBbmRDYWNoZUVsVG9wUG9zKGUsdCk7Zm9yKHZhciBhPTAscj0wO3I8aS5sZW5ndGg7cisrKXt2YXIgbz17c3RhdGU6InVuYWN0aXZlIn07by5zdHlsZXM9dF9hbmltYXRpb25TQlNfX2NyZWF0ZVN0ZXBTdHlsZXMoaVtyXSksInNjcm9sbCI9PT1lLmNoYW5nZVR5cGU/KG8ucHJldlVuZml4ZWREaXN0PWEsby5kaXN0PWlbcl0uZGksITE9PT1vLnN0eWxlcy5maXgmJihhKz1OdW1iZXIoby5kaXN0KSksby5zdGFydD0wPT09cj9lLnRvcE9mZnNldDplLnN0ZXBzW3ItMV0uZW5kLG8uZW5kPW8uc3RhcnQrMSpvLmRpc3QpOihvLnRpbWU9aVtyXS50aSxvLmVhc2U9aVtyXS5lYSksZS5zdGVwcy5wdXNoKG8pfXRfYW5pbWF0aW9uU0JTX191cGRhdGVJbmZvT25JbWdMb2FkKGUsdCksdF9hbmltYXRpb25TQlNfX3VwZGF0ZU1vdmVBbmRSb3RhdGVTdGVwc1N0eWxlcyhlLnN0ZXBzKX19KSl9ZnVuY3Rpb24gdF9hbmltYXRlU2JzX19yZXNldCh0KXtmb3IodmFyIGU9dC5lbHMsbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaT1lW25dLmFuaW1UeXBlO2lmKCJpbnRvdmlldyI9PT1pfHwiYmxvY2tpbnRvdmlldyI9PT1pfHwiY2xpY2siPT09aXx8ImhvdmVyIj09PWkpe2Vbbl0uY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9zdGFydGVkIik7dmFyIGE9ZVtuXS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpO2EmJihhLnN0eWxlLm9wYWNpdHk9IiIpfWVsc2V7ZVtuXS5zdGF0ZT0icmVzZXRlZCI7dmFyIHI9ZVtuXS53cmFwcGVyRWw7ciYmKHIuc3R5bGUudHJhbnNmb3JtPSIiLHIuc3R5bGUucG9zaXRpb249IiIsci5zdHlsZS50b3A9IiIsci5zdHlsZS5vcGFjaXR5PSIiKX19fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRTaXplQmFzZWRPbkRpbWVuc2lvbk1vZGUodCl7aWYoIXQpcmV0dXJue3dpZHRoOiJpbmhlcml0IixoZWlnaHQ6ImluaGVyaXQifTt2YXIgZT10LnBhcmVudE5vZGUuY2xvc2VzdCgiLnRuLWdyb3VwIil8fHQucGFyZW50Tm9kZSxuLGksYTtyZXR1cm4gZSYmdDM5Nl9faXNGbGV4KGUpP3t3aWR0aDoiZmlsbCI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodCwid2lkdGhtb2RlIik/IjEwMCUiOiJpbmhlcml0IixoZWlnaHQ6ImZpbGwiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsImhlaWdodG1vZGUiKT8iMTAwJSI6ImluaGVyaXQifTp7d2lkdGg6ImluaGVyaXQiLGhlaWdodDoiaW5oZXJpdCJ9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX193cmFwRWwodCxlKXtpZighdClyZXR1cm4hMTt2YXIgbj10LnBhcmVudE5vZGUsaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxhPXRfYW5pbWF0aW9uU0JTX19nZXRTaXplQmFzZWRPbkRpbWVuc2lvbk1vZGUobikscj1hLndpZHRoLG89YS5oZWlnaHQ7InN0cmluZyI9PXR5cGVvZiBlP2kuY2xhc3NMaXN0LmFkZChlKTplLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuY2xhc3NMaXN0LmFkZCh0KX0pKSxpLnN0eWxlLmRpc3BsYXk9ImluaGVyaXQiLGkuc3R5bGUud2lkdGg9cixpLnN0eWxlLmhlaWdodD1vLGkuYXBwZW5kQ2hpbGQodCksbiYmbi5hcHBlbmRDaGlsZChpKX13aW5kb3cudF9hbmltYXRpb25TQlNfX2lzRmlyZWZveD0tMSE9PW5hdmlnYXRvci51c2VyQWdlbnQuc2VhcmNoKCJGaXJlZm94Iiksd2luZG93LnRfYW5pbWF0aW9uU0JTX19pc1NhZmFyaT0vXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy5hbmltYXRpb25TQlNfX2lzSU9TPS9pUGhvbmV8aVBhZHxpUG9kL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQmJi9NYWNpbnRvc2gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksd2luZG93LmFuaW1hdGlvblNCU19faXNPbGRQYWdlPUJvb2xlYW4oZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9InRpbGRhLWJsb2Nrcy0yLjciXScpKSwidmlzaWJsZSI9PT1kb2N1bWVudC52aXNpYmlsaXR5U3RhdGU/ImxvYWRpbmciIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT90X2FuaW1hdGlvblNCU19faW5pdCgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHRfYW5pbWF0aW9uU0JTX19pbml0KTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0X2FuaW1hdGlvblNCU19fY2hlY2tWaXNpYmlsaXR5UGFnZSk7CgpmdW5jdGlvbiB0Mzk2X3NjYWxlQmxvY2soZSl7dmFyIHQ9dDM5Nl9kZXRlY3RSZXNvbHV0aW9uKGUpLGw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrZSk7aWYobCl7dmFyIGE7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50Mzk2X19nZXRDdXJyZW50U2NhbGVGYWN0b3I/YT10Mzk2X19nZXRDdXJyZW50U2NhbGVGYWN0b3IoZSk6KGE9d2luZG93LnRuJiZ3aW5kb3cudG5bImFiIitlXSYmd2luZG93LnRuWyJhYiIrZV0uc2NhbGVGYWN0b3IpfHwoYT13aW5kb3cudG5fc2NhbGVfZmFjdG9yKTt2YXIgbz1sLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19hcnRib2FyZCIpLG49dDM5Nl9zY2FsZV9fY29sbGVjdFNjYWxlRGF0YShvLGEpO2lmKG8pe3ZhciByPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobywiaGVpZ2h0IiksaT1NYXRoLmZsb29yKHIqYSksYyxfO2lmKHQzOTZfYWJfX2dldEZpZWxkVmFsdWUobywiaGVpZ2h0X3ZoIikpe3ZhciBzPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobywiaGVpZ2h0IiksZD10Mzk2X2FiX19nZXRIZWlnaHQobyksdT1zKmE7aT11Pj1kP3U6ZH1pZih0Mzk2X3NjYWxlX191cGRhdGVBcnRib2FyZFN0YXRlKG8saSksMCE9PW4ubGVuZ3RoKWlmKHQzOTZfaXNPbmx5U2NhbGFibGVCcm93c2VyKCkpdDM5Nl9zY2FsZV9fc2NhbGVJc09ubHlTY2FsYWJsZUJsb2NrKG4pO2Vsc2V7dmFyIG09bi5maWx0ZXIoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZWxlbVR5cGU7cmV0dXJuInRleHQiPT09dHx8ImJ1dHRvbiI9PT10fSkpLGg9bi5maWx0ZXIoKGZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiJzaGFwZSI9PT1lLmVsZW1UeXBlfSkpLHA9L14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxmO3AmJnQzOTZfc2NhbGVfX3NjaGVkdWxlX19zY2FsZVRleHRFbGVtZW50cyhtKSx0Mzk2X3NjYWxlX19zY2hlZHVsZV9fc2NhbGVTaGFwZUVsZW1lbnRzKGgpLG4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIGw9ZS5lbGVtZW50LG89ZS5lbGVtZW50Q29yZSxuPWUuZWxlbVR5cGUscj0iZ2FsbGVyeSI9PT1uOyJ5ZXMiPT09bC5nZXRBdHRyaWJ1dGUoImRhdGEtc2NhbGUtb2ZmIil8fHJ8fChsLnN0eWxlLnpvb209YSksciYmKGwuc3R5bGUuem9vbT1udWxsKSwidGV4dCI9PT1uJiZ0PDEyMDAmJm8mJiFwJiYoby5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdD0iYXV0byIpLG8mJihvLnN0eWxlLnRyYW5zZm9ybU9yaWdpbj0iY2VudGVyIil9KSksQXJyYXkuZnJvbShvLnF1ZXJ5U2VsZWN0b3JBbGwoIjpzY29wZSA+IC50Mzk2X19lbGVtLCA6c2NvcGUgPiAudDM5Nl9fZ3JvdXAiKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ7KCJsZWZ0IiE9PXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZShlLCJheGlzeCIpfHwidG9wIiE9PXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZShlLCJheGlzeSIpKSYmKHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGUsImxlZnQiKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChlLCJ0b3AiKSl9KSl9fX19ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fc2NoZWR1bGVfX3NjYWxlVGV4dEVsZW1lbnRzKGUpe3dpbmRvdy50bnx8KHdpbmRvdy50bj17fSksd2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlfHwod2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlPVtdKSx3aW5kb3cudG4uc2NoZWR1bGVkVGV4dEVsZW1lbnRzRm9yU2NhbGU9d2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlLmNvbmNhdChlKSxjbGVhclRpbWVvdXQod2luZG93LnRuLnRleHRFbGVtZW50c1NjYWxlVGltZXIpLHdpbmRvdy50bi50ZXh0RWxlbWVudHNTY2FsZVRpbWVyPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dDM5Nl9zY2FsZV9fc2NhbGVUZXh0RWxlbWVudHMod2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlKSx3aW5kb3cudG4uc2NoZWR1bGVkVGV4dEVsZW1lbnRzRm9yU2NhbGU9W119KSwxKX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19zY2FsZVRleHRFbGVtZW50cyhlKXt2YXIgdD10Mzk2X19pbml0RmFzdERPTSgpO3Qud3JpdGUoKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmVsZW1lbnQuc3R5bGUuem9vbT0iIn0pKX0pKSx0LnJlYWQoKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmNhY2hlZEZvbnRTaXplPXBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShlLmVsZW1lbnRDb3JlKS5mb250U2l6ZSksZS5jYWNoZWRUZXh0U2l6ZUFkanVzdD1lLmVsZW1lbnRDb3JlLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0fSkpfSkpLHQud3JpdGUoKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmVsZW1lbnRDb3JlLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PSJub25lIixlLmVsZW1lbnQuc3R5bGUuem9vbT1lLnNjYWxlRmFjdG9yfSkpfSkpLHQucmVhZCgoZnVuY3Rpb24oKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuY3VycmVudEZvbnRTaXplPXBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShlLmVsZW1lbnRDb3JlKS5mb250U2l6ZSl9KSl9KSksdC53cml0ZSgoZnVuY3Rpb24oKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PU1hdGguYWJzKGUuY2FjaGVkRm9udFNpemUtZS5jdXJyZW50Rm9udFNpemUpO2UuZWxlbWVudENvcmUuc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3Q9dD49MT8ibm9uZSI6ZS5jYWNoZWRUZXh0U2l6ZUFkanVzdCx0Pj0xJiYoZS5lbGVtZW50Q29yZS5zdHlsZS5mb250U2l6ZT1NYXRoLnJvdW5kKGUuY2FjaGVkRm9udFNpemUqZS5zY2FsZUZhY3RvcikrInB4Iil9KSl9KSl9ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fc2NoZWR1bGVfX3NjYWxlU2hhcGVFbGVtZW50cyhlKXt3aW5kb3cudG58fCh3aW5kb3cudG49e30pLHdpbmRvdy50bi5zY2hlZHVsZWRTaGFwZUVsZW1lbnRzRm9yU2NhbGV8fCh3aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlPVtdKSx3aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlPXdpbmRvdy50bi5zY2hlZHVsZWRTaGFwZUVsZW1lbnRzRm9yU2NhbGUuY29uY2F0KGUpLGNsZWFyVGltZW91dCh3aW5kb3cudG4uc2hhcGVFbGVtZW50c1NjYWxlVGltZXIpLHdpbmRvdy50bi5zaGFwZUVsZW1lbnRzU2NhbGVUaW1lcj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfc2NhbGVfX3NjYWxlU2hhcGVFbGVtZW50cyh3aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlKSx3aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlPVtdfSksMSl9ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fc2NhbGVTaGFwZUVsZW1lbnRzKGUpe3ZhciB0PXQzOTZfX2luaXRGYXN0RE9NKCk7dC5yZWFkKChmdW5jdGlvbigpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUuZWxlbWVudCwiaGVpZ2h0Iik7dD10Mzk2X2VsZW1fX2dldEhlaWdodChlLmVsZW1lbnQsdCksdD10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoZS5lbGVtZW50LCJoZWlnaHQiLHQpO3ZhciBsPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLmVsZW1lbnQsIndpZHRoIik7bD10Mzk2X2VsZW1fX2dldFdpZHRoKGUuZWxlbWVudCxsKSxsPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLmVsZW1lbnQsIndpZHRoIixsKTt2YXIgYT1wYXJzZUZsb2F0KHQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLmVsZW1lbnQsInRvcCIpKTthPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLmVsZW1lbnQsInRvcCIsYSk7dmFyIG89cGFyc2VGbG9hdCh0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZS5lbGVtZW50LCJsZWZ0IikpO289dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGUuZWxlbWVudCwibGVmdCIsbyksZS5zaGFwZVNpemU9e3RvcDphLGxlZnQ6byx3aWR0aDpsLGhlaWdodDp0fX0pKX0pKTt2YXIgbD1lLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2hhcGVTaXplLndpZHRoPD0yfHxlLnNoYXBlU2l6ZS5oZWlnaHQ8PTJ9KSk7dC5yZWFkKChmdW5jdGlvbigpe2wuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZS5lbGVtZW50Q29yZSk7ZS5ib3JkZXJXaWR0aD10LmJvcmRlcldpZHRoLGUuaXNJbWFnZT0ibm9uZSIhPT10LmJhY2tncm91bmRJbWFnZSxlLmlzQW5pbWF0ZWQ9ZS5lbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1ldmVudCIpfSkpfSkpLHQud3JpdGUoKGZ1bmN0aW9uKCl7bC5mb3JFYWNoKChmdW5jdGlvbihlKXtpZigiMHB4Ij09PWUuYm9yZGVyV2lkdGgmJiFlLmlzSW1hZ2UmJiFlLmlzQW5pbWF0ZWQpe2UuZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiem9vbSIpO3ZhciB0PWUuc2hhcGVTaXplLndpZHRoKmUuc2NhbGVGYWN0b3IsbD1lLnNoYXBlU2l6ZS5oZWlnaHQqZS5zY2FsZUZhY3RvcixhPWUuc2hhcGVTaXplLnRvcCplLnNjYWxlRmFjdG9yLG89ZS5zaGFwZVNpemUubGVmdCplLnNjYWxlRmFjdG9yO2UuZWxlbWVudC5zdHlsZS53aWR0aD1wYXJzZUZsb2F0KHQpKyJweCIsZS5lbGVtZW50LnN0eWxlLmhlaWdodD1wYXJzZUZsb2F0KGwpKyJweCIsZS5lbGVtZW50LnN0eWxlLnRvcD1NYXRoLnJvdW5kKGEpKyJweCIsZS5lbGVtZW50LnN0eWxlLmxlZnQ9TWF0aC5yb3VuZChvKSsicHgiLGUuZWxlbWVudC5zZXRBdHRyaWJ1dGUoImRhdGEtc2NhbGUtb2ZmIiwieWVzIil9fSkpfSkpfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX2NvbGxlY3RTY2FsZURhdGEoZSx0KXt2YXIgbDtyZXR1cm4gdDM5Nl9zY2FsZV9fZ2V0RWxlbWVudHNUb1NjYWxlKGUpLm1hcCgoZnVuY3Rpb24oZSl7dmFyIGw9ZS5xdWVyeVNlbGVjdG9yKCIudG4tbW9sZWN1bGUsIC50bi1hdG9tIiksYT10Mzk2X3NjYWxlX19nZXRFbGVtZW50VHlwZShlKSxvPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJjb250YWluZXIiKTtpZihvfHwiZ3JvdXAiIT09YXx8KG89ImdyaWQiKSxsJiYiZ3JpZCI9PT1vKXJldHVybntlbGVtZW50OmUsZWxlbWVudENvcmU6bCxlbGVtVHlwZTphLHNjYWxlRmFjdG9yOnR9fSkpLmZpbHRlcihCb29sZWFuKX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19zY2FsZUlzT25seVNjYWxhYmxlQmxvY2soZSl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD1lLmVsZW1lbnQsbD1lLmVsZW1lbnRDb3JlLGE9ZS5lbGVtVHlwZSxvPWwuY2xvc2VzdCgiLnRuLWF0b21fX3NjYWxlLXdyYXBwZXIiKTtvfHwodDM5Nl9zY2FsZV9fd3JhcEVsZW1lbnQobCxjdXJyZW50U2NhbGVGYWN0b3IsInRuLWF0b21fX3NjYWxlLXdyYXBwZXIiKSxvPWwuY2xvc2VzdCgiLnRuLWF0b21fX3NjYWxlLXdyYXBwZXIiKSksdC5zdHlsZS56b29tPSIiLHQzOTZfc2NhbGVfX3Byb2Nlc3NCYWNrZHJvcEZpbHRlcih0LGwsbyksdDM5Nl9zY2FsZV9fcHJvY2Vzc0JhY2tncm91bmRGb3JTaGFwZSh0LGwsYSxjdXJyZW50U2NhbGVGYWN0b3IpfSkpfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX2dldEVsZW1lbnRzVG9TY2FsZShlKXtyZXR1cm4gZT9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmNoaWxkcmVuKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlJiYoZS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2VsZW0iKXx8ZS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2dyb3VwIikpfSkpOltdfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3VwZGF0ZUFydGJvYXJkU3RhdGUoZSx0KXtlLmNsYXNzTGlzdC5hZGQoInQzOTZfX2FydGJvYXJkX3NjYWxlIik7dmFyIGw9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxhO2lmKCEoImh1ZyI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHRtb2RlIikpKXt2YXIgbz0nPHN0eWxlIGNsYXNzPSJ0Mzk2X19zY2FsZS1zdHlsZSI+LnQtcmVjI3JlYycrbCsiIHsgb3ZlcmZsb3c6IHZpc2libGU7IH0jcmVjIitsKyIgLnQzOTZfX2FydGJvYXJkOm5vdCgudDM5Nl9fYXJ0Ym9hcmQtZmxleCksI3JlYyIrbCsiIC50Mzk2X19hcnRib2FyZDpub3QoLnQzOTZfX2FydGJvYXJkLWZsZXgpIC50Mzk2X19jYXJyaWVyLCNyZWMiK2wrIiAudDM5Nl9fYXJ0Ym9hcmQ6bm90KC50Mzk2X19hcnRib2FyZC1mbGV4KSAudDM5Nl9fZmlsdGVyIHsgd2lkdGg6IDEwMHZ3ICFpbXBvcnRhbnQ7IG1heC13aWR0aDogMTAwJTt9I3JlYyIrbCsiIC50Mzk2X19jYXJyaWVyLCNyZWMiK2wrIiAudDM5Nl9fZmlsdGVyLCNyZWMiK2wrIiAudDM5Nl9fYXJ0Ym9hcmQge2hlaWdodDogIit0KyJweCAhaW1wb3J0YW50O308L3N0eWxlPiI7ZS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsbyl9fWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3dyYXBFbGVtZW50KGUsdCxsKXtpZihlKXt2YXIgYT1lLnBhcmVudE5vZGU7aWYoYSl7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7by5jbGFzc0xpc3QuYWRkKGwpLG8uc3R5bGUudHJhbnNmb3JtPSJzY2FsZSgiK3QrIikiLG8uYXBwZW5kQ2hpbGQoZSksYS5hcHBlbmRDaGlsZChvKX19fWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3Byb2Nlc3NCYWNrZHJvcEZpbHRlcihlLHQsbCl7Im5vbmUiPT09ZS5zdHlsZS5iYWNrZHJvcEZpbHRlciYmKGUuc3R5bGUuYmFja2Ryb3BGaWx0ZXI9IiIpO3ZhciBhPWdldENvbXB1dGVkU3R5bGUoZSkuYmFja2Ryb3BGaWx0ZXI7aWYoYSl7ZS5zdHlsZS5iYWNrZHJvcEZpbHRlcj0ibm9uZSIsbC5zdHlsZS5iYWNrZHJvcEZpbHRlcj1hO3ZhciBvPWdldENvbXB1dGVkU3R5bGUodCkuYm9yZGVyUmFkaXVzOyIwcHgiIT09byYmKGwuc3R5bGUuYm9yZGVyUmFkaXVzPW8pfX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19wcm9jZXNzQmFja2dyb3VuZEZvclNoYXBlKGUsdCxsLGEpe2lmKCJzaGFwZSI9PT1sKXt2YXIgbz10JiZnZXRDb21wdXRlZFN0eWxlKHQpLG47aWYobylpZigobyYmby5iYWNrZ3JvdW5kSW1hZ2V8fHQuZ2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsIikpJiYiZml4ZWQiPT09by5iYWNrZ3JvdW5kQXR0YWNobWVudCl7ZS5yZW1vdmVDaGlsZCh0LnBhcmVudE5vZGUpLGUuYXBwZW5kQ2hpbGQodCk7dmFyIHI9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUsImhlaWdodCIpO3I9dDM5Nl9lbGVtX19nZXRIZWlnaHQoZSxyKSxyPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLCJoZWlnaHQiLHIpO3ZhciBpPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJ3aWR0aCIpO2k9dDM5Nl9lbGVtX19nZXRXaWR0aChlLGkpLGk9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGUsIndpZHRoIixpKTt2YXIgYz1wYXJzZUZsb2F0KHQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJ0b3AiKSksXz1wYXJzZUZsb2F0KHQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJsZWZ0IikpO2Uuc3R5bGUudG9wPWMqYSsicHgiLGUuc3R5bGUubGVmdD1fKmErInB4IixlLnN0eWxlLmhlaWdodD1yKmErInB4IixlLnN0eWxlLndpZHRoPWkqYSsicHgiLGUuc2V0QXR0cmlidXRlKCJkYXRhLXNjYWxlLW9mZiIsInllcyIpfX19ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fZ2V0RWxlbWVudFR5cGUoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7cmV0dXJuIXQmJmUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1ncm91cCIpJiYodD0iZ3JvdXAiKSx0fXdpbmRvdy50Mzk2X2luaXRpYWxTY2FsZXx8KHdpbmRvdy50Mzk2X2luaXRpYWxTY2FsZT1mdW5jdGlvbigpe30pOwoKd2luZG93LlRpbGRhPXdpbmRvdy5UaWxkYXx8e30sZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dmFyIGU9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLHQ9LTEhPT1lLmluZGV4T2YoIm1zaWUiKSYmcGFyc2VJbnQoZS5zcGxpdCgibXNpZSIpWzFdKTtpZig4PT09dHx8OT09PXQpe3ZhciByPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWJ0biIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwociwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKTtlLnF1ZXJ5U2VsZWN0b3IoInRhYmxlIikmJnQmJi0xPT09dC5pbmRleE9mKCIjcG9wdXA6IikmJi0xPT09dC5pbmRleE9mKCIjcHJpY2U6IikmJmUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbihlKXt2YXIgdD1lLnRhcmdldC5nZXRBdHRyaWJ1dGUoImhyZWYiKTtlLnByZXZlbnREZWZhdWx0KCksd2luZG93LmxvY2F0aW9uLmhyZWY9dH0pKX0pKX10cnl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxpPWE/YS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtY29va2llIik6bnVsbDthJiYibm8iPT09aXx8VGlsZGEuc2F2ZVVUTSgpfWNhdGNoKG4pe312YXIgbz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuciIpO2Z1bmN0aW9uIGMoZSl7dmFyIHQ9ZS50YXJnZXQuY2xvc2VzdCgiYS5qcy1jbGljay1zdGF0Iil8fGUudGFyZ2V0LmNsb3Nlc3QoIi5qcy1jbGljay16ZXJvLXN0YXQiKTtpZihlLnRhcmdldCYmdCl7dmFyIHI9ZS5jdXJyZW50VGFyZ2V0LGE7aWYodC5jbG9zZXN0KCIuciIpIT09cilyZXR1cm47dmFyIGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtZXZlbnQtbmFtZSIpLG89dC50ZXh0Q29udGVudCxjPXQuZ2V0QXR0cmlidXRlKCJocmVmIil8fCIiLGQ9dC5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLG47aWYoIWkpaT0iL3RpbGRhL2NsaWNrLyIrKHI/ci5nZXRBdHRyaWJ1dGUoImlkIik6IiIpKyIvP3VybD0iK2M7aWYoVGlsZGEuc2VuZEV2ZW50VG9TdGF0aXN0aWNzKGksbyksImh0dHAiPT09Yy5zdWJzdHJpbmcoMCw0KSYmLTE9PT1jLmluZGV4T2YoIi50eXBlZm9ybS5jb20vIikpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy5vcGVuKGMsIl9ibGFuayI9PT1kPyJfYmxhbmsiOiJfc2VsZiIpfSksIl9ibGFuayI9PT1kPzA6MzAwKSxlLnByZXZlbnREZWZhdWx0KCksITF9fUFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24oZSl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsYyksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsYyl9KSk7dmFyIGQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiaW5wdXQuanMtYW1vdW50Iik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkLChmdW5jdGlvbihlKXt2YXIgdD1lLnZhbHVlO3Q9dC5yZXBsYWNlKC8sL2csIi4iKSx0PXBhcnNlRmxvYXQodC5yZXBsYWNlKC9bXjAtOVwuXS9nLCIiKSksZS52YWx1ZT10fSkpfVRpbGRhLnNlbmRFY29tbWVyY2VFdmVudD1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXR8fDA9PT10Lmxlbmd0aClyZXR1cm4hMTtpZih2b2lkIDA9PT1lfHwiYWRkIiE9PWUmJiJyZW1vdmUiIT09ZSYmInB1cmNoYXNlIiE9PWUmJiJkZXRhaWwiIT09ZSlyZXR1cm4hMTtmb3IodmFyIHIsYT0iIixpPTAsbz1bXSxjLGQsbj0iIixtPSIiLGw9IiIsdT0wO3U8dC5sZW5ndGg7dSsrKXthPiIiJiYoYSs9IiwgIiksYSs9KGQ9dFt1XSkubmFtZSxpKz1kLnByaWNlLGM9IiIsdm9pZCAwIT09ZC5vcHRpb25zJiZkLm9wdGlvbnMubGVuZ3RoPjAmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZC5vcHRpb25zLChmdW5jdGlvbihlKXtjKz1lLm9wdGlvbisiOiAiK2UudmFyaWFudCsiOyAifSkpO3ZhciBwPXtuYW1lOmQubmFtZSxwcmljZTpkLnByaWNlLHZhcmlhbnQ6YyxxdWFudGl0eToxfTtkLmlkJiZkLmlkPjAmJihpZD1kLmlkLHAuaWQ9ZC5pZCksZC51aWQmJmQudWlkPjAmJihtPWQudWlkLHAudWlkPWQudWlkKSxkLnJlY2lkJiZkLnJlY2lkPjAmJihuPWQucmVjaWQscC5yZWNpZD1kLnJlY2lkKSxkLmxpZCYmZC5saWQ+MCYmKGw9ZC5saWQscC5saWQ9ZC5saWQpLGQuc2t1JiZkLnNrdT4wJiYocC5za3U9ZC5za3UpLG9bby5sZW5ndGhdPXB9dmFyIHA7ImFkZCIhPT1lJiYicmVtb3ZlIiE9PWV8fChyPSIvdGlsZGEvY2FydC8iK2UrIi8iLG4+MCYmKHIrPSIiK24pLG0+MD9yKz0iLXUiK206bD4wJiYocis9Ii0iK2wpKSwiZGV0YWlsIj09PWUmJihyPSIvdGlsZGEvcHJvZHVjdC9kZXRhaWwvIixtPjA/cis9bSsiLyI6KG4+MCYmKHIrPSJyIituKSxsPjAmJihyKz0iLWwiK2wpKSksInB1cmNoYXNlIj09PWUmJihyPSIvdGlsZGEvcmVjIituKyIvcGF5bWVudC8iKSwocD17ZWNvbW1lcmNlOnt9fSkuZWNvbW1lcmNlW2VdPXtwcm9kdWN0czpvfSxUaWxkYS5zZW5kRXZlbnRUb1N0YXRpc3RpY3MocixhLHAsaSl9LFRpbGRhLnNlbmRFdmVudFRvU3RhdGlzdGljcz1mdW5jdGlvbihlLHQscixhKXt2YXIgaT0iLyI9PT1lLnN1YnN0cmluZygwLDEpLG89W10sYyxkOyhjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikpJiYoZD1udWxsIT09Yy5nZXRBdHRyaWJ1dGUoImRhdGEtZmItZXZlbnQiKT9jLmdldEF0dHJpYnV0ZSgiZGF0YS1mYi1ldmVudCIpOndpbmRvdy5qUXVlcnkmJnZvaWQgMCE9PWpRdWVyeSgiI2FsbHJlY29yZHMiKS5kYXRhKCJmYi1ldmVudCIpP2pRdWVyeSgiI2FsbHJlY29yZHMiKS5kYXRhKCJmYi1ldmVudCIpOm51bGwpO3ZhciBuPSEoIWR8fCJub3NlbmQiIT09ZCksbT1jP2MuZ2V0QXR0cmlidXRlKCJkYXRhLXZrLWV2ZW50Iik6bnVsbDtjJiYobT1udWxsIT09Yy5nZXRBdHRyaWJ1dGUoImRhdGEtdmstZXZlbnQiKT9jLmdldEF0dHJpYnV0ZSgiZGF0YS12ay1ldmVudCIpOndpbmRvdy5qUXVlcnkmJnZvaWQgMCE9PWpRdWVyeSgiI2FsbHJlY29yZHMiKS5kYXRhKCJ2ay1ldmVudCIpP2pRdWVyeSgiI2FsbHJlY29yZHMiKS5kYXRhKCJ2ay1ldmVudCIpOm51bGwpO3ZhciBsPSEoIW18fCJub3NlbmQiIT09bSksdT0iIixwPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50NzA2Iik7aWYodT1jLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1jdXJyZW5jeSIpP2MuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWN1cnJlbmN5Iik6cCYmcC5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvamVjdC1jdXJyZW5jeS1jb2RlIik/cC5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvamVjdC1jdXJyZW5jeS1jb2RlIik6IlJVQiIscnx8KHI9d2luZG93LmxvY2F0aW9uLmhyZWYpLChhPWE/cGFyc2VGbG9hdChhKTowKT4wKWlmKHdpbmRvdy5kYXRhTGF5ZXJ8fCh3aW5kb3cuZGF0YUxheWVyPVtdKSwtMSE9PWUuaW5kZXhPZigiL3RpbGRhLyIpJiYtMSE9PWUuaW5kZXhPZigiL3BheW1lbnQvIikmJndpbmRvdy50aWxkYUZvcm0mJndpbmRvdy50aWxkYUZvcm0ub3JkZXJJZEZvclN0YXQ+IiIpcj17ZWNvbW1lcmNlOntwdXJjaGFzZTp7YWN0aW9uRmllbGQ6e2lkOndpbmRvdy50aWxkYUZvcm0ub3JkZXJJZEZvclN0YXQscmV2ZW51ZTp3aW5kb3cudGlsZGFGb3JtLmFtb3VudEZvclN0YXR9LHByb2R1Y3RzOndpbmRvdy50aWxkYUZvcm0uYXJQcm9kdWN0c0ZvclN0YXR9fX0sd2luZG93LnRpbGRhRm9ybS50aWxkYXBheW1lbnQmJndpbmRvdy50aWxkYUZvcm0udGlsZGFwYXltZW50LnByb21vY29kZSYmKHIuZWNvbW1lcmNlLnB1cmNoYXNlLmFjdGlvbkZpZWxkLmNvdXBvbj13aW5kb3cudGlsZGFGb3JtLnRpbGRhcGF5bWVudC5wcm9tb2NvZGUpLHIuZXZlbnQ9InB1cmNoYXNlIjtlbHNlIGlmKHImJnIuZWNvbW1lcmNlJiYoci5lY29tbWVyY2UuYWRkJiZyLmVjb21tZXJjZS5hZGQucHJvZHVjdHM/bz1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHM6ci5lY29tbWVyY2UucmVtb3ZlJiZyLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHM/bz1yLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHM6ci5lY29tbWVyY2UuZGV0YWlsJiZyLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHMmJihvPXIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0cyksbyYmby5sZW5ndGg+MCkpe2Zvcih2YXIgcz0wO3M8by5sZW5ndGg7cysrKW9bc10uaWR8fChvW3NdLnVpZD9vW3NdLmlkPW9bc10udWlkOm9bc10uc2t1P29bc10uaWQ9b1tzXS5za3U6b1tzXS5yZWNpZCYmb1tzXS5saWQmJihvW3NdLmlkPW9bc10ucmVjaWQrIl8iK29bc10ubGlkKSk7ci5lY29tbWVyY2UuYWRkJiZyLmVjb21tZXJjZS5hZGQucHJvZHVjdHM/KHIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cz1vLHIuZXZlbnQ9ImFkZFRvQ2FydCIpOnIuZWNvbW1lcmNlLnJlbW92ZSYmci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzPyhyLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHM9byxyLmV2ZW50PSJyZW1vdmVGcm9tQ2FydCIpOnIuZWNvbW1lcmNlLmRldGFpbCYmci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzPyhyLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHM9byxyLmV2ZW50PSJ2aWV3UHJvZHVjdCIpOihpPyhyLmV2ZW50PSJwYWdlVmlldyIsci5ldmVudEFjdGlvbj1lKTpyLmV2ZW50PWUsci50aXRsZT10LHIudmFsdWU9YSl9dm9pZCAwIT09d2luZG93LmRhdGFMYXllciYmKGk/YT4wP3ImJnIuZWNvbW1lcmNlP3dpbmRvdy5kYXRhTGF5ZXIucHVzaChyKTp3aW5kb3cuZGF0YUxheWVyLnB1c2goe2V2ZW50OiJwYWdlVmlldyIsZXZlbnRBY3Rpb246ZSx0aXRsZTp0LHZhbHVlOmEscHJvZHVjdDpyfSk6d2luZG93LmRhdGFMYXllci5wdXNoKHtldmVudDoicGFnZVZpZXciLGV2ZW50QWN0aW9uOmUsdGl0bGU6dCxyZWZlcmVyOnJ9KTpyJiZyLmVjb21tZXJjZT93aW5kb3cuZGF0YUxheWVyLnB1c2gocik6d2luZG93LmRhdGFMYXllci5wdXNoKHtldmVudDplLGV2ZW50QWN0aW9uOnQsdmFsdWU6YSxyZWZlcmVyOnJ9KSk7dHJ5e3ZhciB2O2lmKHdpbmRvdy5ndGFnVHJhY2tlcklEJiYiZ3RhZyI9PT13aW5kb3cubWFpblRyYWNrZXIpaWYoaSlpZihyJiZyLmV2ZW50KWlmKCJwdXJjaGFzZSI9PT1yLmV2ZW50KXtmb3IodmFyIG89ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHMsdz0wLGc9MDtnPG8ubGVuZ3RoO2crKylpZigiZGVsaXZlcnkiPT09b1tnXS5pZCl7dz1vW2ddO2JyZWFrfWd0YWcoImV2ZW50IiwicHVyY2hhc2UiLHt0cmFuc2FjdGlvbl9pZDpyLmVjb21tZXJjZS5wdXJjaGFzZS5hY3Rpb25GaWVsZC5pZCx2YWx1ZTpwYXJzZUZsb2F0KGEpLnRvRml4ZWQoMiksY3VycmVuY3k6dSxzaGlwcGluZzp3LGl0ZW1zOnIuZWNvbW1lcmNlLnB1cmNoYXNlLnByb2R1Y3RzfSl9ZWxzZSJhZGRUb0NhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UuYWRkP2d0YWcoImV2ZW50IiwiYWRkX3RvX2NhcnQiLHtpdGVtczpyLmVjb21tZXJjZS5hZGQucHJvZHVjdHN9KToicmVtb3ZlRnJvbUNhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UucmVtb3ZlP2d0YWcoImV2ZW50IiwicmVtb3ZlX2Zyb21fY2FydCIse2l0ZW1zOnIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0c30pOiJ2aWV3UHJvZHVjdCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5kZXRhaWwmJmd0YWcoImV2ZW50Iiwidmlld19pdGVtIix7aXRlbXM6ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzfSk7ZWxzZSEhd2luZG93Lmd0YWdUcmFja2VySUQmJi0xIT09d2luZG93Lmd0YWdUcmFja2VySUQuaW5kZXhPZigiVUEtIik/Z3RhZygiY29uZmlnIix3aW5kb3cuZ3RhZ1RyYWNrZXJJRCx7cGFnZV90aXRsZTp0LHBhZ2VfcGF0aDplfSk6Z3RhZygiZXZlbnQiLHdpbmRvdy5ndGFnVHJhY2tlcklELHtwYWdlX3RpdGxlOnQscGFnZV9wYXRoOmUsc2VuZF90bzp3aW5kb3cuZ3RhZ1RyYWNrZXJJRH0pO2Vsc2UgZ3RhZygiZXZlbnQiLGUse2V2ZW50X2NhdGVnb3J5OiJ0aWxkYSIsZXZlbnRfbGFiZWw6dCx2YWx1ZTphfSl9Y2F0Y2goeCl7fWlmKHdpbmRvdy5nYSYmInRpbGRhIiE9PXdpbmRvdy5tYWluVHJhY2tlciYmImd0YWciIT09d2luZG93Lm1haW5UcmFja2VyKWlmKGkpaWYociYmci5ldmVudCl7dHJ5e2lmKHdpbmRvdy5UaWxkYS5pc0xvYWRHQUVjb21tZXJjZXx8KHdpbmRvdy5UaWxkYS5pc0xvYWRHQUVjb21tZXJjZT0hMCxnYSgicmVxdWlyZSIsImVjIikpLGdhKCJzZXQiLCJjdXJyZW5jeUNvZGUiLHUpLCJwdXJjaGFzZSI9PT1yLmV2ZW50KXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5wdXJjaGFzZS5wcm9kdWN0cy5sZW5ndGgsZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5wdXJjaGFzZS5wcm9kdWN0c1tnXSxnYSgiZWM6YWRkUHJvZHVjdCIse2lkOmYuaWR8fGcsbmFtZTpmLm5hbWUscHJpY2U6cGFyc2VGbG9hdChmLnByaWNlKS50b0ZpeGVkKDIpLHF1YW50aXR5OmYucXVhbnRpdHl9KTtnYSgiZWM6c2V0QWN0aW9uIiwicHVyY2hhc2UiLHtpZDpyLmVjb21tZXJjZS5wdXJjaGFzZS5hY3Rpb25GaWVsZC5pZCxyZXZlbnVlOnBhcnNlRmxvYXQoYSkudG9GaXhlZCgyKX0pfWVsc2UgaWYoImFkZFRvQ2FydCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5hZGQpe2Zvcih2YXIgZix5PXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cy5sZW5ndGgsZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHNbZ10sZ2EoImVjOmFkZFByb2R1Y3QiLHtpZDpmLmlkfHxnLG5hbWU6Zi5uYW1lLHByaWNlOnBhcnNlRmxvYXQoZi5wcmljZSkudG9GaXhlZCgyKSxxdWFudGl0eTpmLnF1YW50aXR5fSk7Z2EoImVjOnNldEFjdGlvbiIsImFkZCIpfWVsc2UgaWYoInJlbW92ZUZyb21DYXJ0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLnJlbW92ZSl7Zm9yKHZhciBmLHk9ci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzLmxlbmd0aCxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0c1tnXSxnYSgiZWM6YWRkUHJvZHVjdCIse2lkOmYuaWR8fGcsbmFtZTpmLm5hbWUscHJpY2U6cGFyc2VGbG9hdChmLnByaWNlKS50b0ZpeGVkKDIpLHF1YW50aXR5OmYucXVhbnRpdHl9KTtnYSgiZWM6c2V0QWN0aW9uIiwicmVtb3ZlIil9ZWxzZSBpZigidmlld1Byb2R1Y3QiPT09ci5ldmVudCYmci5lY29tbWVyY2UuZGV0YWlsKXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHMubGVuZ3RoLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzW2ddLGdhKCJlYzphZGRQcm9kdWN0Iix7aWQ6Zi5pZHx8ZyxuYW1lOmYubmFtZSxwcmljZTpwYXJzZUZsb2F0KGYucHJpY2UpLnRvRml4ZWQoMikscXVhbnRpdHk6Zi5xdWFudGl0eX0pO2dhKCJlYzpzZXRBY3Rpb24iLCJkZXRhaWwiKX19Y2F0Y2goeCl7fWdhKCJzZW5kIix7aGl0VHlwZToicGFnZXZpZXciLHBhZ2U6ZSx0aXRsZTp0LHBhcmFtczpyfSl9ZWxzZSBnYSgic2VuZCIse2hpdFR5cGU6InBhZ2V2aWV3IixwYWdlOmUsdGl0bGU6dH0pO2Vsc2UgZ2EoInNlbmQiLHtoaXRUeXBlOiJldmVudCIsZXZlbnRDYXRlZ29yeToidGlsZGEiLGV2ZW50QWN0aW9uOmUsZXZlbnRMYWJlbDp0LGV2ZW50VmFsdWU6YX0pO2lmKHdpbmRvdy5tYWluTWV0cmlrYUlkJiZ3aW5kb3cubWFpbk1ldHJpa2FJZD4wJiYiZnVuY3Rpb24iPT10eXBlb2YgeW0paWYoaSl7dmFyIGg9e3RpdGxlOnR9O2E+MD8oaC5wYXJhbXM9e29yZGVyX3ByaWNlOmF9LHUmJihoLnBhcmFtcy5jdXJyZW5jeT11KSx5bSh3aW5kb3cubWFpbk1ldHJpa2FJZCwiaGl0IixlLGgpKTp5bSh3aW5kb3cubWFpbk1ldHJpa2FJZCwiaGl0IixlLGgpfWVsc2UgYT4wPyhoPXtvcmRlcl9wcmljZTphfSx1JiYoaC5jdXJyZW5jeT11KSx5bSh3aW5kb3cubWFpbk1ldHJpa2FJZCwicmVhY2hHb2FsIixlLGgpKTp5bSh3aW5kb3cubWFpbk1ldHJpa2FJZCwicmVhY2hHb2FsIixlKTtpZih3aW5kb3cubWFpbk1ldHJpa2E+IiImJndpbmRvd1t3aW5kb3cubWFpbk1ldHJpa2FdJiYoaT9hPjA/d2luZG93W3dpbmRvdy5tYWluTWV0cmlrYV0uaGl0KGUse3RpdGxlOnQsb3JkZXJfcHJpY2U6YSxwYXJhbXM6cn0pOndpbmRvd1t3aW5kb3cubWFpbk1ldHJpa2FdLmhpdChlLHt0aXRsZTp0fSk6YT4wP3dpbmRvd1t3aW5kb3cubWFpbk1ldHJpa2FdLnJlYWNoR29hbChlLHt0aXRsZTp0LHBhcmFtczpyLG9yZGVyX3ByaWNlOmF9KTp3aW5kb3dbd2luZG93Lm1haW5NZXRyaWthXS5yZWFjaEdvYWwoZSx7dGl0bGU6dCxyZWZlcmVyOnJ9KSksdm9pZCAwIT09d2luZG93LmZicSYmITE9PT1uKXRyeXtpZihpKWlmKC0xPT09ZS5pbmRleE9mKCJ0aWxkYS8iKXx8LTE9PT1lLmluZGV4T2YoIi9wYXltZW50LyIpJiYtMT09PWUuaW5kZXhPZigiL3N1Ym1pdHRlZC8iKSlpZihyJiZyLmV2ZW50JiZhPjApaWYoImFkZFRvQ2FydCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5hZGQpe2Zvcih2YXIgZix5PXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cy5sZW5ndGgsaz1bXSxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0c1tnXSxrLnB1c2goZi5pZHx8Zi51aWR8fGYubmFtZSk7d2luZG93LmZicSgidHJhY2siLCJBZGRUb0NhcnQiLHtjb250ZW50X2lkczprLGNvbnRlbnRfdHlwZToicHJvZHVjdCIsdmFsdWU6YSxjdXJyZW5jeTp1fSl9ZWxzZSBpZigidmlld1Byb2R1Y3QiPT09ci5ldmVudCYmci5lY29tbWVyY2UuZGV0YWlsKXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHMubGVuZ3RoLGs9W10sZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHNbZ10say5wdXNoKGYuaWR8fGYudWlkfHxmLm5hbWUpO3dpbmRvdy5mYnEoInRyYWNrIiwiVmlld0NvbnRlbnQiLHtjb250ZW50X2lkczprLGNvbnRlbnRfdHlwZToicHJvZHVjdCIsdmFsdWU6YSxjdXJyZW5jeTp1fSl9ZWxzZSBlLmluZGV4T2YoInRpbGRhL3BvcHVwIiksd2luZG93LmZicSgidHJhY2siLCJWaWV3Q29udGVudCIse2NvbnRlbnRfbmFtZTp0LGNvbnRlbnRfY2F0ZWdvcnk6ZX0pO2Vsc2UgZS5pbmRleE9mKCJ0aWxkYS9wb3B1cCIpLHdpbmRvdy5mYnEoInRyYWNrIiwiVmlld0NvbnRlbnQiLHtjb250ZW50X25hbWU6dCxjb250ZW50X2NhdGVnb3J5OmV9KTtlbHNlIGE+MCYmdT93aW5kb3cuZmJxKCJ0cmFjayIsIkluaXRpYXRlQ2hlY2tvdXQiLHtjb250ZW50X25hbWU6dCxjb250ZW50X2NhdGVnb3J5OmUsdmFsdWU6YSxjdXJyZW5jeTp1fSk6d2luZG93LmZicSgidHJhY2siLCJMZWFkIix7Y29udGVudF9uYW1lOnQsY29udGVudF9jYXRlZ29yeTplfSk7ZWxzZSB3aW5kb3cuZmJxKCJ0cmFjayIsZSx7Y29udGVudF9uYW1lOnQsdmFsdWU6YX0pfWNhdGNoKHgpe31pZih2b2lkIDAhPT13aW5kb3cuVksmJnZvaWQgMCE9PXdpbmRvdy5WSy5SZXRhcmdldGluZyYmITE9PT1sKXRyeXtpZihpKXt2YXIgYyxfPShjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikpP2MuZ2V0QXR0cmlidXRlKCJkYXRhLXZrLXByaWNlLWxpc3QtaWQiKTpudWxsLGI9XyYmcGFyc2VJbnQoXyl8fDAsVD0iIixBPSExLEYsRixGLEYsRjtpZihyJiZyLmV2ZW50KWlmKEE9e3Byb2R1Y3RzOltdLGN1cnJlbmN5X2NvZGU6IiIsdG90YWxfcHJpY2U6MH0sInB1cmNoYXNlIj09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLnB1cmNoYXNlKWlmKGE+MCYmYj4wKXt2YXIgZjtBLmN1cnJlbmN5X2NvZGU9dTtmb3IodmFyIHk9ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHMubGVuZ3RoLGs9W10sZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5wdXJjaGFzZS5wcm9kdWN0c1tnXSxBLnByb2R1Y3RzLnB1c2goe2lkOmYuaWR8fGYudWlkfHxmLm5hbWUscHJpY2U6Zi5wcmljZT9mLnByaWNlOjB9KSxBLnRvdGFsX3ByaWNlPWE7VD0iaW5pdF9jaGVja291dCJ9ZWxzZSBUPSJ0LXB1cmNoYXNlIjtlbHNlIGlmKCJhZGRUb0NhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UuYWRkKWlmKGE+MCYmYj4wKXt2YXIgZjtBLmN1cnJlbmN5X2NvZGU9dTtmb3IodmFyIHk9ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzW2ddLEEucHJvZHVjdHMucHVzaCh7aWQ6Zi5pZHx8Zi51aWR8fGYubmFtZSxwcmljZTpmLnByaWNlP2YucHJpY2U6MH0pLEEudG90YWxfcHJpY2U9YTtUPSJhZGRfdG9fY2FydCJ9ZWxzZSBUPSJ0LWFkZC10by1jYXJ0IixyLmVjb21tZXJjZS5hZGRbMF0mJnIuZWNvbW1lcmNlLmFkZFswXS51aWQmJihUKz0iLSIrci5lY29tbWVyY2UuYWRkWzBdLnVpZCk7ZWxzZSBpZigidmlld1Byb2R1Y3QiPT09ci5ldmVudCYmci5lY29tbWVyY2UuZGV0YWlsKWlmKGE+MCYmYj4wKXt2YXIgZjtBLmN1cnJlbmN5X2NvZGU9dTtmb3IodmFyIHk9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzW2ddLEEucHJvZHVjdHMucHVzaCh7aWQ6Zi5pZHx8Zi51aWR8fGYubmFtZSxwcmljZTpmLnByaWNlP2YucHJpY2U6MH0pLEEudG90YWxfcHJpY2U9YTtUPSJ2aWV3X3Byb2R1Y3QifWVsc2UgVD0idC12aWV3LXByb2R1Y3QiLHIuZWNvbW1lcmNlLmRldGFpbFswXSYmci5lY29tbWVyY2UuZGV0YWlsWzBdLnVpZCYmKFQrPSItIityLmVjb21tZXJjZS5kZXRhaWxbMF0udWlkKTtlbHNlIGlmKCJyZW1vdmVGcm9tQ2FydCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5yZW1tb3ZlKWlmKGE+MCYmYj4wKXt2YXIgZjtBLmN1cnJlbmN5X2NvZGU9dTtmb3IodmFyIHk9ci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzW2ddLEEucHJvZHVjdHMucHVzaCh7aWQ6Zi5pZHx8Zi51aWR8fGYubmFtZSxwcmljZTpmLnByaWNlP2YucHJpY2U6MH0pLEEudG90YWxfcHJpY2U9YTtUPSJyZW1vdmVfZnJvbV9jYXJ0In1lbHNlIFQ9InQtcmVtb3ZlLXByb2R1Y3QiLHIuZWNvbW1lcmNlLnJlbW92ZVswXSYmci5lY29tbWVyY2UucmVtb3ZlWzBdLnVpZCYmKFQrPSItIityLmVjb21tZXJjZS5yZW1vdmVbMF0udWlkKTtlbHNlIFQ9ci5ldmVudDtlbHNlIGlmKC0xIT09ZS5pbmRleE9mKCJ0aWxkYS8iKSYmLTEhPT1lLmluZGV4T2YoIi9wYXltZW50LyIpKVQ9InQtcHVyY2hhc2UtIisoRj0oRj0oRj1lLnJlcGxhY2UoIi90aWxkYS8iLCIiKSkucmVwbGFjZSgidGlsZGEvIiwiIikpLnJlcGxhY2UoIi9wYXltZW50LyIsIiIpKTtlbHNlIGlmKC0xIT09ZS5pbmRleE9mKCJ0aWxkYS8iKSYmLTEhPT1lLmluZGV4T2YoIi9zdWJtaXR0ZWQvIikpVD0idC1sZWFkLSIrKEY9KEY9KEY9ZS5yZXBsYWNlKCIvdGlsZGEvIiwiIikpLnJlcGxhY2UoInRpbGRhLyIsIiIpKS5yZXBsYWNlKCIvc3VibWl0dGVkLyIsIiIpKTtlbHNlIGlmKC0xIT09ZS5pbmRleE9mKCJ0aWxkYS9wb3B1cCIpKVQ9InQtIisoRj0oRj1lLnJlcGxhY2UoIi90aWxkYS8iLCIiKSkucmVwbGFjZSgiLyIsIi0iKSk7ZWxzZSBpZigtMSE9PWUuaW5kZXhPZigidGlsZGEvY2xpY2siKSlUPSJ0LSIrKEY9KEY9ZS5yZXBsYWNlKCIvdGlsZGEvIiwiIikpLnJlcGxhY2UoIi8iLCItIikpO2Vsc2UgVD0idC0iKyhGPWUucmVwbGFjZSgiLyIsIi0iKSk7Yj4wJiZBJiZBLmN1cnJlbmN5X2NvZGU/KFZLLlJldGFyZ2V0aW5nLkV2ZW50KCJwdXJjaGFzZSIpLFZLLlJldGFyZ2V0aW5nLlByb2R1Y3RFdmVudChiLFQsQSkpOihWSy5SZXRhcmdldGluZy5FdmVudChUKSwidC1wdXJjaGFzZSI9PT1ULnN1YnN0cmluZygwLDEwKT9WSy5Hb2FsKCJwdXJjaGFzZSIpOiJ0LWxlYWQiPT09VC5zdWJzdHJpbmcoMCw2KSYmVksuR29hbCgibGVhZCIpKX1lbHNlIFZLLlJldGFyZ2V0aW5nLkV2ZW50KGUpfWNhdGNoKHgpe31pZih3aW5kb3cubWFpbk1haWxydUlkPiIwIil7dmFyIEU9d2luZG93Ll90bXJ8fCh3aW5kb3cuX3Rtcj1bXSk7aT9hPjA/RS5wdXNoKHtpZDoiIit3aW5kb3cubWFpbk1haWxydUlkLHR5cGU6InBhZ2VWaWV3Iix1cmw6ZSx2YWx1ZTphLHN0YXJ0OihuZXcgRGF0ZSkuZ2V0VGltZSgpfSk6RS5wdXNoKHtpZDoiIit3aW5kb3cubWFpbk1haWxydUlkLHR5cGU6InBhZ2VWaWV3Iix1cmw6ZSxzdGFydDoobmV3IERhdGUpLmdldFRpbWUoKX0pOmE+MD9FLnB1c2goe2lkOiIiK3dpbmRvdy5tYWluTWFpbHJ1SWQsdHlwZToicmVhY2hHb2FsIixnb2FsOmUsdmFsdWU6YX0pOkUucHVzaCh7aWQ6IiIrd2luZG93Lm1haW5NYWlscnVJZCx0eXBlOiJyZWFjaEdvYWwiLGdvYWw6ZX0pfSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudGlsZGFzdGF0JiYoaT8oZS5pbmRleE9mKCJwYXltZW50Iik+MCYmZS5pbmRleE9mKCJ0aWxkYS9mb3JtIik+LTEmJihlPWUucmVwbGFjZSgidGlsZGEvZm9ybSIsInRpbGRhL3JlYyIpKSx3aW5kb3cudGlsZGFzdGF0KCJwYWdldmlldyIse3BhZ2U6ZX0pKTp3aW5kb3cudGlsZGFzdGF0KCJwYWdldmlldyIse3BhZ2U6Ii90aWxkYS9ldmVudC8iK2V9KSl9LFRpbGRhLnNhdmVVVE09ZnVuY3Rpb24oKXt0cnl7dmFyIGU9d2luZG93LmxvY2F0aW9uLmhyZWYsdD0iIixyPSIiO2lmKC0xIT09ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInV0bV8iKSYmInN0cmluZyI9PXR5cGVvZih0PSh0PShlPWUudG9Mb3dlckNhc2UoKSkuc3BsaXQoIj8iKSlbMV0pKXt2YXIgYSxpPXQuc3BsaXQoIiYiKTtmb3IodmFyIG8gaW4gaSkiYW1wOyI9PT0oYT1pW29dLnNwbGl0KCI9IikpWzBdLnN1YnN0cmluZygwLDQpJiYoYVswXT1hWzBdLnN1YnN0cmluZyg0KSksInV0bV8iPT09YVswXS5zdWJzdHJpbmcoMCw0KSYmKHI9citpW29dKyJ8fHwiKTtpZihyLmxlbmd0aD4wKXt2YXIgYz1uZXcgRGF0ZTtjLnNldERhdGUoYy5nZXREYXRlKCkrMzApLGRvY3VtZW50LmNvb2tpZT0iVElMREFVVE09IitlbmNvZGVVUklDb21wb25lbnQocikrIjsgcGF0aD0vOyBleHBpcmVzPSIrYy50b1VUQ1N0cmluZygpfX19Y2F0Y2goZCl7fX0sImxvYWRpbmciIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9lKCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZSl9KCksRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlc3x8KEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXM9RWxlbWVudC5wcm90b3R5cGUubWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUubW96TWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLm9NYXRjaGVzU2VsZWN0b3IpLEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3R8fChFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzO3QmJjE9PT10Lm5vZGVUeXBlOyl7aWYoRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcy5jYWxsKHQsZSkpcmV0dXJuIHQ7dD10LnBhcmVudEVsZW1lbnR8fHQucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH0pOwoKIWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtmdW5jdGlvbiB0KCl7dmFyIGU9TWF0aC5mbG9vcig4OTk5OTkqTWF0aC5yYW5kb20oKSkrMWU1O3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpKyIuIitlfWZ1bmN0aW9uIG4oZSl7dmFyIHQ9ZS5yZXBsYWNlKC8oW1wuJD8qfHt9XChcKVxbXF1cXFwvXCteXSkvZywiXFwkMSIpLG49bmV3IFJlZ0V4cCgiKD86Xnw7ICkiK3QrIj0oW147XSopIiksbz1kb2N1bWVudC5jb29raWUubWF0Y2gobik7aWYobylyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KG9bMV0pfWZ1bmN0aW9uIG8oZSx0LG4pe3ZhciBvPW4uZXhwaXJlcztpZighbylyZXR1cm4hMTtpZigibnVtYmVyIj09dHlwZW9mIG8pe3ZhciBpPShuZXcgRGF0ZSkuZ2V0VGltZSgpKzFlMypvOyhvPW5ldyBEYXRlKGkpKS50b1VUQ1N0cmluZyYmKG4uZXhwaXJlcz1vLnRvVVRDU3RyaW5nKCkpfXZhciBhPWUrIj0iKyh0PWVuY29kZVVSSUNvbXBvbmVudCh0KSk7Zm9yKHZhciByIGluIG4pYSs9IjsgIityLCEwIT09bltyXSYmKGErPSI9IituW3JdKTtkb2N1bWVudC5jb29raWU9YX1mdW5jdGlvbiBpKGUsdCl7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO3JldHVybiBlfWZ1bmN0aW9uIGEoZSl7dmFyIHQ9ITA7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJubyBjYWxsYmFjayBnaXZlbiIpO2Z1bmN0aW9uIG4oKXt0fHxlKHQ9ITApfWZ1bmN0aW9uIG8oKXt0JiZlKHQ9ITEpfSJoaWRkZW4iaW4gZG9jdW1lbnQmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLChmdW5jdGlvbigpeyhkb2N1bWVudC5oaWRkZW4/bzpuKSgpfSkpLCJtb3pIaWRkZW4iaW4gZG9jdW1lbnQmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1venZpc2liaWxpdHljaGFuZ2UiLChmdW5jdGlvbigpeyhkb2N1bWVudC5tb3pIaWRkZW4/bzpuKSgpfSkpLCJ3ZWJraXRIaWRkZW4iaW4gZG9jdW1lbnQmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdHZpc2liaWxpdHljaGFuZ2UiLChmdW5jdGlvbigpeyhkb2N1bWVudC53ZWJraXRIaWRkZW4/bzpuKSgpfSkpLCJtc0hpZGRlbiJpbiBkb2N1bWVudCYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibXN2aXNpYmlsaXR5Y2hhbmdlIiwoZnVuY3Rpb24oKXsoZG9jdW1lbnQubXNIaWRkZW4/bzpuKSgpfSkpLCJvbmZvY3VzaW4iaW4gZG9jdW1lbnQmJihkb2N1bWVudC5vbmZvY3VzaW49bixkb2N1bWVudC5vbmZvY3Vzb3V0PW8pLHdpbmRvdy5vbnBhZ2VzaG93PXdpbmRvdy5vbmZvY3VzPW4sd2luZG93Lm9ucGFnZWhpZGU9d2luZG93Lm9uYmx1cj1vfWZ1bmN0aW9uIHIoKXt2YXIgZT13aW5kb3cucGFnZVlPZmZzZXQsdD13aW5kb3cuaW5uZXJIZWlnaHQsbj1NYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQsZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCksbz0wLGk9MDt2PSEwO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0LWhlYWRlciIpLHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQtZm9vdGVyIiksZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFjb3B5Iik7YSYmKG89YS5vZmZzZXRIZWlnaHQpLHImJihpPXIub2Zmc2V0SGVpZ2h0KSxkJiYoaSs9ZC5vZmZzZXRIZWlnaHQpO3ZhciBjPU1hdGguZmxvb3IoMTAwKihlLW8rdCkvKG4tby1pKSk7aWYoIShjPDEwKSlmb3IodmFyIHM9WzEwLDI1LDUwLDc1LDkwXSxsPTA7bDxzLmxlbmd0aDtsKyspe3ZhciB1PXNbbF0sZz1zLmxlbmd0aC0xO2lmKDA9PT1sJiZjPj11JiYhd1sicCIrdV0pbS5wYWdlPSIvdGlsZGEvc2Nyb2xsLyIrdSsiLyIsd2luZG93LnRpbGRhc3RhdCgicGFnZXZpZXciKSx3WyJwIit1XT0hMDtlbHNlIGlmKGM+PXUtMSl7aWYoMD09PXdbInAiK3VdKXttLnBhZ2U9Ii90aWxkYS9zY3JvbGwvIit1KyIvIix3aW5kb3cudGlsZGFzdGF0KCJwYWdldmlldyIpLHdbInAiK3VdPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHdbInAiK3VdKSx3WyJwIit1XT0tMX0pLDVlMyk7YnJlYWt9aWYoKGwhPT1nJiZjPHNbbCsxXXx8bD09PWcpJiYtMT09PXdbInAiK3VdKXt3WyJwIit1XT0wO2JyZWFrfX19fWZ1bmN0aW9uIGQoKXt2YXIgZT0wPT09d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLmluZGV4T2YoInd3dy4iKT93aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc2xpY2UoNCk6d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lO3JldHVybiBlLmxhc3RJbmRleE9mKCIuIik9PT1lLmxlbmd0aC0xJiYoZT1lLnNsaWNlKDAsLTEpKSxlK3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX1mdW5jdGlvbiBjKGUpe2Zvcih2YXIgdD1BcnJheShlLmxlbmd0aCksbj0wO248ZS5sZW5ndGg7bisrKXRbbl09bjtyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3JldHVybiBlLmNoYXJDb2RlQXQodCkudG9TdHJpbmcoMTYpfSkpLmpvaW4oIiIpfWZ1bmN0aW9uIHMoKXt2YXIgZT0obmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQ/ImNUIjoiY0YiKSsifCIrKG5hdmlnYXRvci5kZXZpY2VNZW1vcnk/ImRtIituYXZpZ2F0b3IuZGV2aWNlTWVtb3J5OiJkbSIpKyJ8IisobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3k/ImhjIituYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeToiaGMiKSsifCIrKG5hdmlnYXRvci5sYW5ndWFnZXM/ImwiK25hdmlnYXRvci5sYW5ndWFnZXMuam9pbigiLCIpOiJsIikrInwiO2lmKG5hdmlnYXRvci5wbGF0Zm9ybXx8bmF2aWdhdG9yLmFwcE5hbWU/ZSs9KG5hdmlnYXRvci5wbGF0Zm9ybT8icCIrbmF2aWdhdG9yLnBsYXRmb3JtOiJwIikrInwiKyhuYXZpZ2F0b3IudmVuZG9yPyJ2IituYXZpZ2F0b3IudmVuZG9yOiJ2IikrInwiKyhuYXZpZ2F0b3IuYXBwQ29kZU5hbWU/ImEiK25hdmlnYXRvci5hcHBDb2RlTmFtZToiYSIpKyJ8IisobmF2aWdhdG9yLmFwcE5hbWU/Im4iK25hdmlnYXRvci5hcHBOYW1lOiJuIikrInwiOmUrPShuYXZpZ2F0b3IudXNlckFnZW50PyJ1YSIrbmF2aWdhdG9yLnVzZXJBZ2VudDoidWEiKSsifCIsbmF2aWdhdG9yLnBsdWdpbnMpe3ZhciB0LG4sbz0iIjtmb3Iobj1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg+MjA/MjA6bmF2aWdhdG9yLnBsdWdpbnMubGVuZ3RoLHQ9MDt0PG47dCsrKW5hdmlnYXRvci5wbHVnaW5zW3RdJiZuYXZpZ2F0b3IucGx1Z2luc1t0XS5maWxlbmFtZT9vKz1uYXZpZ2F0b3IucGx1Z2luc1t0XS5maWxlbmFtZTpuYXZpZ2F0b3IucGx1Z2luc1t0XSYmbmF2aWdhdG9yLnBsdWdpbnNbdF0ubmFtZSYmKG8rPW5hdmlnYXRvci5wbHVnaW5zW3RdLm5hbWUpO2UrPSJwbCIrbysifCJ9cmV0dXJuIGUrPSJwciIrd2luZG93LmRldmljZVBpeGVsUmF0aW8rInwiLGUrPSJ3Iisoc2NyZWVuJiZzY3JlZW4ud2lkdGg/c2NyZWVuLndpZHRoOndpbmRvdy5pbm5lcldpZHRoKSsiaCIrKHNjcmVlbiYmc2NyZWVuLmhlaWdodD9zY3JlZW4uaGVpZ2h0OndpbmRvdy5pbm5lckhlaWdodCkrInwiLGUrPSJjRCIrKHNjcmVlbi5jb2xvckRlcHRoP3NjcmVlbi5jb2xvckRlcHRoOiIiKSsifCIsZSs9InRPIisobmV3IERhdGUpLmdldFRpbWV6b25lT2Zmc2V0KCkrInwiLGU9YyhlKz0ibVQiKyh2b2lkIDAhPT1uYXZpZ2F0b3IubWF4VG91Y2hQb2ludHM/bmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzOnZvaWQgMCE9PW5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzP25hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzOiIiKSsifCIpfWZ1bmN0aW9uIGwoKXt4PW4oInRpbGRhdWlkIiksRT1uKCJ0aWxkYXNpZCIpLGg/KHh8fCh4PSJzaW1wbGUiKSxFfHwoRT0ic2ltcGxlIikpOih4fHwoeD10KCkpLEV8fChFPXQoKSkpfWZ1bmN0aW9uIHUoKXt2YXIgZTtofHwobygidGlsZGF1aWQiLHgse2V4cGlyZXM6Nzc3NmUzLHBhdGg6Ii8ifSksbygidGlsZGFzaWQiLEUse2V4cGlyZXM6MTgwMCxwYXRoOiIvIn0pKX1mdW5jdGlvbiBnKHQpe2lmKG0udXNlcl9hZ2VudD4iIiYmLTEhPW0udXNlcl9hZ2VudC5pbmRleE9mKCJib3QiKSlyZXR1cm4hMTtpZigiaHR0cDoiIT13aW5kb3cubG9jYXRpb24ucHJvdG9jb2wmJiJodHRwczoiIT13aW5kb3cubG9jYXRpb24ucHJvdG9jb2wpcmV0dXJuIGNvbnNvbGUubG9nKCJUaWxkYVN0YXQ6IGNhbm5vdCB3b3JrIG9uIGxvY2FsIHBhZ2UiKSwhMTt2YXIgbjtsKCksdSgpLG0ucGFnZT1kKCksbS5yZWZlcnJlcj1kb2N1bWVudC5yZWZlcnJlcnx8IiIsbS51c2VyaWQ9eCxtLnNlc3Npb25pZD1FLG0udXNlcl9hZ2VudD13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxtLnVzZXJfbGFuZ3VhZ2U9d2luZG93Lm5hdmlnYXRvci51c2VyTGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UsZSYmKG0ucHJvamVjdGlkPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXByb2plY3QtaWQiKXx8IjAiLG0ucGFnZWlkPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXBhZ2UtaWQiKXx8IjAiLG0ucGFnZWFsaWFzPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXBhZ2UtYWxpYXMiKXx8IiIsbS5mb3Jtc2tleT1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1mb3Jtc2tleSIpfHwiIiksbS5wYXJhbXM9e307dHJ5e249ZGVjb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpfWNhdGNoKGMpe249d2luZG93LmxvY2F0aW9uLnNlYXJjaH1pZihuPiI/IiYmKG0ucGFnZXF1ZXJ5PW4uc3Vic3RyaW5nKDEpLnRvTG93ZXJDYXNlKCksfm0ucGFnZXF1ZXJ5LmluZGV4T2YoInV0bV8iKSkpe3ZhciBvLGk9bS5wYWdlcXVlcnkuc3BsaXQoIiYiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKGUpeyhvPWUuc3BsaXQoIj0iKSkubGVuZ3RoPjE/InV0bV9yZWZlcnJlciIhPT1vWzBdfHxtLnJlZmVycmVyJiYhfm0ucmVmZXJyZXIuaW5kZXhPZigib2hpbzgudiIpP20ucGFyYW1zW29bMF1dPW9bMV06bS5yZWZlcnJlcj1vWzFdOm0ucGFyYW1zW29bMF1dPSIifSkpfXZhciByPSExO2lmKC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKHI9ITApLG0uaXNtb2JpbGU9cixkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFzdGF0c2NyaXB0IikmJihtLnRpbGRhc3RhdGNvZGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbGRhc3RhdHNjcmlwdCIpLmtleSksayl0cnl7YSgoZnVuY3Rpb24oZSl7dj0hIWV9KSksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXdoZWVsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3Y9ITB9KSwxZTMpKSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2PSEwfSksMWUzKSksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJrZXlwcmVzcyIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2PSEwfSksMWUzKSksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2PSEwfSksMWUzKSl9Y2F0Y2goYyl7fW0uZmluZ2VycHJpbnQ9cygpLFQ9ITB9ZnVuY3Rpb24gcChlKXt2YXIgdD0iaHR0cHM6Ly9zdGF0LnRpbGRhYXBpLiIrTCgpKyIvZXZlbnQvIixpO2h8fChuKCJ0aWxkYXNpZCIpfHwiIikhPW0uc2Vzc2lvbmlkJiZvKCJ0aWxkYXNpZCIsbS5zZXNzaW9uaWQse2V4cGlyZXM6MTgwMCxwYXRoOiIvIn0pOyIiPT09bS5yZWZlcnJlciYmKG0ucmVmZXJyZXI9bigicHJldmlvdXNVcmwiKXx8IiIpLG0udGlsZGF1dG09bigiVElMREFVVE0iKXx8IiIsbS5wYWdlfHwoY29uc29sZS5sb2coIlRpbGRhU3RhdDogcGFnZSBlbXB0eSIpLG0ucGFnZT1kKCksd2luZG93LmxvY2F0aW9uLmhhc2gmJjA9PT13aW5kb3cubG9jYXRpb24uaGFzaC5pbmRleE9mKCIjISIpJiYobS5wYWdlKz13aW5kb3cubG9jYXRpb24uaGFzaCkpLCIvIj09PW0ucGFnZS5zdWJzdHJpbmcoMCwxKSYmKG0ucGFnZT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUrbS5wYWdlKTt2YXIgYT1mKG0pLHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3Iub3BlbigiUE9TVCIsdCwhMCksci53aXRoQ3JlZGVudGlhbHM9ITEsci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiKSxyLm9uZXJyb3I9ZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcigiVGlsZGFTdGF0OiBmYWlsIHBhZ2V2aWV3ICIpLGNvbnNvbGUuZXJyb3IoZSl9LHIudGltZW91dD0zZTMsci5zZW5kKGEpLG0ucGFnZSYmLTE9PT1tLnBhZ2UuaW5kZXhPZigidGlsZGEvc2Nyb2xsIikmJi0xPT09bS5wYWdlLmluZGV4T2YoInRpbGRhL3JlYWR0aW1lIikmJi0xPT09bS5wYWdlLmluZGV4T2YoInRpbGRhL2NsaWNrIikmJi0xPT09bS5wYWdlLmluZGV4T2YoInRpbGRhL2Nvb2tpZWVuYWJsZWQiKSYmKG0ucmVmZXJyZXI9bS5wYWdlLGh8fG8oInByZXZpb3VzVXJsIixtLnBhZ2Use3BhdGg6Ii8iLGV4cGlyZXM6MTgwMH0pKSxtLnBhZ2U9IiIsd2luZG93LnRpbGRhc3RhdGxvYWQ9ITB9ZnVuY3Rpb24gZihlKXt2YXIgdD0iIjtmb3IodmFyIG4gaW4gZSlpZigiIiE9dCYmIm9iamVjdCIhPXR5cGVvZiBlW25dJiYodCs9IiYiKSwib2JqZWN0Ij09dHlwZW9mIGVbbl0pe2lmKE9iamVjdC5rZXlzKGVbbl0pLmxlbmd0aClmb3IodmFyIG8gaW4gZVtuXSl0Kz0iJiIrbisiWyIrbysiXT0iK2VuY29kZVVSSUNvbXBvbmVudChlW25dW29dKX1lbHNlIHQrPW4rIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW25dKTtyZXR1cm4gdH13aW5kb3cudGlsZGFzdGF0PWZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuITE7aWYoImNyZWF0ZSIhPT1lJiYhVClyZXR1cm4gc2V0VGltZW91dCgoZnVuY3Rpb24oKXt3aW5kb3cudGlsZGFzdGF0KGUsdCl9KSwxZTMpLCExO3N3aXRjaCh0JiZpKG0sdCksZSl7Y2FzZSJjcmVhdGUiOmcodCk7YnJlYWs7Y2FzZSJwYWdldmlldyI6cCh0KTticmVhaztjYXNlInJlYWR0aW1lIjprJiYodiYmKG0ucGFnZT0iL3RpbGRhL3JlYWR0aW1lLyIsdj0hMSxwKHQpKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy50aWxkYXN0YXQoInJlYWR0aW1lIil9KSwxNWUzKSk7YnJlYWs7Y2FzZSJzY3JvbGwiOmsmJiJmdW5jdGlvbiI9PXR5cGVvZiB0X3Rocm90dGxlJiZ3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3IoKX0pLDFlMykpO2JyZWFrO2Nhc2UiY29va2llZW5hYmxlZCI6aD0hMSxsKCksdSgpLG0udXNlcmlkPXgsbS5zZXNzaW9uaWQ9RSxtLnBhZ2U9Ii90aWxkYS9jb29raWVlbmFibGVkLyIscCh0KTticmVhaztjYXNlImZpbmdlcnByaW50IjpyZXR1cm4gcygpfX07dmFyIG09e30sdz17cDEwOjAscDI1OjAscDUwOjAscDc1OjAscDkwOjB9LHY9ITAsaD0ibm8iPT09d2luZG93LnRpbGRhc3RhdGNvb2tpZSx5O2lmKCh3aW5kb3cudGlsZGFzdGF0Y29va2llfHxlJiYoaD0ibm8iPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtY29va2llIikpLCJ5ZXMiPT09d2luZG93LnRpbGRhc3RhdGNvb2tpZWdkcHImJiExPT09aCkmJihoPSEwLCEwPT09bigidF9jb29raWVzQ29uc2VudEdpdmVuIikpKXt2YXIgYj1uKCJ0X2Nvb2tpZXNDYXRlZ29yaWVzIik7InN0cmluZyI9PXR5cGVvZiBiJiZiLmluZGV4T2YoImFuYWx5dGljcyIpPi0xJiYoaD0hMSl9dmFyIGs9InllcyI9PT13aW5kb3cudGlsZGFzdGF0c2Nyb2xsO3ZvaWQgMD09PXdpbmRvdy50aWxkYXN0YXRzY3JvbGwmJmUmJihrPSJ5ZXMiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtc3RhdC1zY3JvbGwiKSk7dmFyIHg9IiIsRT0iIixUPSExO3dpbmRvdy50aWxkYXN0YXQoImNyZWF0ZSIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7d2luZG93LnRpbGRhc3RhdCgicGFnZXZpZXciKSx3aW5kb3cudGlsZGFzdGF0KCJyZWFkdGltZSIpLHdpbmRvdy50aWxkYXN0YXQoInNjcm9sbCIpfSksNTAwKTt2YXIgaj1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtpZigoIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cudF9qc2Vycm9ycyYmd2luZG93LnRfanNlcnJvcnMubGVuZ3RoPjB8fCJvYmplY3QiPT10eXBlb2Ygd2luZG93LnRfY2RuZXJyb3JzJiZ3aW5kb3cudF9jZG5lcnJvcnMubGVuZ3RoPjB8fCJvYmplY3QiPT10eXBlb2Ygd2luZG93LnRfYWpheGVycm9ycyYmd2luZG93LnRfYWpheGVycm9ycy5sZW5ndGg+MCkmJiJmdW5jdGlvbiIhPXR5cGVvZiB0X2Vycm9yc19fc2VuZEpTRXJyb3JzKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLnNyYz0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIitMKCkrIi9qcy90aWxkYS1lcnJvcnMtMS4wLm1pbi5qcyIsZS5hc3luYz0hMCxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpLGNsZWFySW50ZXJ2YWwoail9fSksMmUzKSxPPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImxpbmtbcmVsKj0nc2hvcnRjdXQgaWNvbiddIiksXz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJsaW5rW2hyZWYqPSd0aWxkYS53cy9wcm9qZWN0J10iKS5sZW5ndGg7X3x8KF89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgibGlua1tocmVmKj0nd3MudGlsZGFjZG4uY29tL3Byb2plY3QnXSIpLmxlbmd0aCk7dmFyIEE9Tz9PLmdldEF0dHJpYnV0ZSgiaHJlZiIpOiIiLEg9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W3NyYyo9J2pzL3RpbGRhLXNjcmlwdHMnXSIpLEM9ISFIJiYtMT09PUguc3JjLmluZGV4T2YoInRpbGRhY2RuIiksSTsoQ3x8KEM9TyYmLTEhPT1BLmluZGV4T2YoInN0YXRpYy50aWxkYWNkbi4iK0woKSkmJi0xIT09QS5pbmRleE9mKCJ0aWxkYS4iKSYmLTEhPT1BLmluZGV4T2YoIi90aWxkYWZhdmljb24uaWNvIikmJiFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0YWJsZSNhbGxyZWNvcmRzIikmJiEoLTEhPT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuaW5kZXhPZigiLnRpbGRhLndzIikpJiYhXyksdm9pZCAwPT09bmF2aWdhdG9yLnNlbmRCZWFjb258fC9Cb3QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHxDKXx8MT09PU1hdGguZmxvb3IoNSpNYXRoLnJhbmRvbSgpKSYmUygoZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLmFzeW5jPSEwLGUudHlwZT0idGV4dC9qYXZhc2NyaXB0IixlLnNyYz0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIitMKCkrIi9qcy90aWxkYS1wZXJmb3JtYW5jZS0xLjAubWluLmpzIixkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIixlKX0pKTtmdW5jdGlvbiBTKGUpeyJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlP2UoKTp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZSl9ZnVuY3Rpb24gTCgpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksdDtyZXR1cm4gZSYmZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtcm9vdC16b25lIil8fCJjb20ifX0oKTsKCnRfb25SZWFkeShmdW5jdGlvbigpIHtzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDg2OF9pbml0UG9wdXAnLGZ1bmN0aW9uKCkge3Q4NjhfaW5pdFBvcHVwKCcyMDk5NzM0MjYxJyk7fSk7fSw1MDApO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dmFyIHJlYz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcmVjMjE4NTE4MzIxMScpO2lmKCFyZWMpIHJldHVybjtyZWMuc2V0QXR0cmlidXRlKCdkYXRhLWFuaW1hdGlvbmFwcGVhcicsJ29mZicpO3JlYy5zdHlsZS5vcGFjaXR5PTE7cmVjLnF1ZXJ5U2VsZWN0b3IoJy50MzkzJykuY2xhc3NMaXN0LnJlbW92ZSgndDM5M19fYmVmb3JlcmVhZHknKTt0X29uRnVuY0xvYWQoJ3QzOTNfYXBwZWFyTWVudScsZnVuY3Rpb24oKXt0MzkzX2FwcGVhck1lbnUoJzIxODUxODMyMTEnKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyx0X3Rocm90dGxlKGZ1bmN0aW9uKCl7dDM5M19hcHBlYXJNZW51KCcyMTg1MTgzMjExJyk7fSkpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0OTQzX2luaXQnLGZ1bmN0aW9uKCkge3Q5NDNfaW5pdCgnMjE4NTE4MzQ2MScsJ3llcycpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMjA5OTczNDI4MScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMjA5OTczNDI5MScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMjA5OTczNDMwMScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMjA5OTczNDMzMScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0X3NsaWRlcl9faW5pdCcsZnVuY3Rpb24oKSB7dF9zbGlkZXJfX2luaXQoJzIxMDAxMjkwODEnLCd0MTE5NicpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMjA5OTczNDM0MScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMjA5OTczNDM1MScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMjA5OTczNDM2MScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMjA5OTczNDM3MScpO30pO30pOw== | |
| 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_=2FZeEo5VCHs0yTdH; Domain=.mann-ivanov-ferber.ru; Path=/; Expires=Thu, 20-Aug-2026 14:31:32 GMT |
| Content-Security-Policy | upgrade-insecure-requests; |
| Date | Thu, 20 Aug 2026 14:11:31 GMT |
| X-Powered-By | PHP/7.4.30 |
| Cache-Control | must-revalidate, max-age=0, private |
| x-test | GET |
| x-uuid | OZ0JyqXfoAQAG79AjATwLFmDKCAbZ1Gaq |
| X-Frame-Options | SAMEORIGIN |
CMS
Система управления сайтом (движок)
?
CMS — это движок, на котором работает сайт (WordPress, 1C-Bitrix, Tilda и др.). Знание CMS помогает понять возможности SEO-оптимизации и подобрать подходящие инструменты. «Не определена» — вероятно, самописный сайт или нестандартная сборка.
Сайт работает на CMS Tilda.
Веб-сервер
Программное обеспечение сервера
?
Веб-сервер — это ПО, которое отдаёт страницы посетителям (nginx, Apache, IIS, LiteSpeed и др.). Определяется по серверным заголовкам ответа (Server, X-Powered-By и т.п.). «Не определён» — сервер намеренно скрывает эти заголовки, это нормальная практика безопасности.
Сайт работает на веб-сервере DDoS-Guard.
Мета-теги Готовность: 50%
Title
МИФ для бизнеса
Заголовок страницы в браузере и поисковой выдаче
?
Title — главный SEO-заголовок страницы. Влияет на CTR в поиске и ранжирование. Оптимальная длина: 50–70 символов. Ключевые слова — ближе к началу.
Необходимо увеличить число символов в title (текущее значение мало: 15, минимум: 25, оптимально: от 40 до 45)
Дублей словоформ в title не найдено.
Description
Поможем усилить бренд, прокачать команду и войти в историю
Описание страницы в поисковой выдаче (сниппет)
?
Meta Description — текст под заголовком в выдаче. Напрямую на позиции не влияет, но влияет на CTR. Оптимальная длина: 120–160 символов.
Необходимо увеличить число символов в description (текущее значение мало: 58, минимум: 80, оптимально: от 120 до 130)
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/media/b2b/b2b-all-1200x667.jpg |
| og:site_name | Издательство &laquo;МИФ&raquo; |
| og:url | https://www.mann-ivanov-ferber.ru/business/ |
Все мета-теги
Кол-во: 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/media/b2b/b2b-all-1200x667.jpg |
| property | og:site_name | Издательство &laquo;МИФ&raquo; |
| property | og:url | https://www.mann-ivanov-ferber.ru/business/ |
| property | fb:admins | 1093864394 |
Оптимизация Готовность: 48%
Структура
Ошибок нет
Семантические HTML-элементы страницы
?
Проверяет наличие основных структурных элементов: nav, header, footer, main. Корректная семантическая структура помогает поисковику понять архитектуру страницы.
Структура документа корректна (теги <html> и <body> присутствуют в одном экземпляре).
Контент
Есть ошибки
Объём и качество текстового содержимого
?
Анализирует объём полезного текста на странице. Слишком мало — страница может считаться малополезной. Слишком много — ухудшается читаемость и восприятие.
Слова из title 2 встречаются в тексте редко. Добавьте в контент страницы слова из тега <title>!
Абзацев с текстом 0 слишком мало. Добавьте больше абзацев с текстом (тег <p>)!
Среднее число слов в абзаце 0 слишком мало. Сделайте контент более читаемым!
Кол-во слов 574 не очень много. Добавьте побольше текста (хотя бы 800 слов)!
Кол-во знаков контента 3869 на странице оптимально.
Заголовки
Ошибок нет
Иерархия заголовков H1–H6
?
H1 должен быть один и содержать ключевой запрос. H2–H6 описывают подразделы. Пропуск уровней (H1 → H3) и несколько H1 — типичные ошибки, снижающие понятность страницы для поисковика.
На странице присутствуют заголовки <h1> 1. Это прекрасно.
Тошнота
2,65
Насколько одно слово доминирует в тексте
?
Классическая тошнота = √(частота самого повторяющегося слова). Норма до 7–8: текст воспринимается естественно. Выше — поисковик может счесть страницу переспамленной.
Тошнота страницы в пределах нормы 3.
Академич. тошнота
3,31%
Насколько текст перенасыщен ключевыми словами
?
Академическая тошнота = (частота слова / общее количество слов) × 100%. Показывает долю конкретного слова в тексте. Норма 5–15%.
Академическая тошнота не дотягивает до нормы 5-15%. Измените текст страницы!
Семантическое ядро
20
Наиболее часто встречающиеся слова на странице
?
Топ слов по частоте использования. Показывает, какие слова доминируют в тексте с точки зрения поисковика.
Контент страницы содержит осмысленный текст и слова.
Показать список слов
| Слово | Кол-во | Частота |
|---|---|---|
| комиксы | 7 | 1,22% |
| психология | 7 | 1,22% |
| литература | 5 | 0,87% |
| развитие | 5 | 0,87% |
| творчество | 5 | 0,87% |
| бизнес | 5 | 0,87% |
| подарки | 5 | 0,87% |
| бизнеса | 4 | 0,70% |
| обучение | 3 | 0,52% |
| подарочные | 3 | 0,52% |
| аудиокниги | 3 | 0,52% |
| истории | 3 | 0,52% |
| культура | 3 | 0,52% |
| искусство | 3 | 0,52% |
| саморазвитие | 3 | 0,52% |
| мышление | 3 | 0,52% |
| маркетинг | 3 | 0,52% |
| компаний | 3 | 0,52% |
| setters | 3 | 0,52% |
| современная | 2 | 0,35% |
Индексация Готовность: 40%
Индексирование
Есть ошибки
Разрешено ли индексирование страницы
?
Проверяет, не закрыта ли страница от индексации через robots.txt, meta robots или X-Robots-Tag. Страница, закрытая от индексации, не появится в поисковой выдаче.
Анкоров на странице 248 слишком много. Проведите ревизию и оптимизацию ссылок сайта.
Robots.txt
Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 1627 байт. Загружен за: 19мсек.
Проверяемая страница не запрещена в 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 оптимально.
Внешние ссылки
Кол-во: 233
Ссылки на сторонние сайты
?
Исходящие внешние ссылки передают часть ссылочного веса на чужие сайты. Ссылки на авторитетные ресурсы безопасны; ссылки на мусорные сайты могут навредить репутации страницы.
Внешних ссылок на странице 233 слишком много. Спрячьте лишние ссылки в тег 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/business/ готова к продвижению на 60%. Чтобы еще улучшить страницу и попасть на первые места поисковой выдачи необходимо:
Исправьте ошибки в мета-тегах.
Исправьте ошибки оптимизации.
Исправьте ошибки индексации.
Поделитесь с друзьями: