МегаФон
5 449

«МегаФон» за год: смена стратегии, новое позиционирование и попадание в тройку сильнейших брендов России

Процесс трансформации оператора.

В закладки

С марта 2015 года «МегаФон» продвигал свои услуги под слоганом «По-настоящему рядом». Компания обращалась к семейным людям в возрасте 25–40 лет, предлагая им оставаться на связи с близкими даже находясь на расстоянии. Оператор использовал для продвижения короткометражные эмоциональные ролики со звёздами российского кинематографа, демонстрируя случаи, когда общения только голосом бывает недостаточно.

Первый рекламный ролик позиционирования «По-настоящему» рядом

Для людей «МегаФон» старался быть помощником, который предоставляет хорошую связь и помогает сэкономить. Но такая стратегия оказалась не очень эффективной с точки зрения бизнеса и изменений в объемах потреблении информации. Причина тому — падение выручки от голосовых услуг. Люди всё больше общаются в мессенджерах и меньше говорят по телефону. Рост категории цифровых абонентов оказался слишком быстрым, отказ от простых телефонов и «фичафонов» в пользу смартфонов — невероятно стремительным.

Новая стратегия

Весной 2017 года совет директоров «МегаФона» утвердил новую стратегию развития компании. В её основу легли изменения, которые коснулись всего телекома. Раньше операторы строили вышки, увеличивали зону покрытия и вводили новые стандарты связи, чтобы клиентская база становилась больше. Сейчас количество пользователей значительно не увеличивается, но меняется культура потребления и глубина использования услуг.

В новой стратегии компания решила сосредоточиться на работе с «цифровыми клиентами». Раньше под это определение подходили только продвинутые пользователи, сейчас немного иначе: в городах с населением более 100 тысяч человек около 70% пользователей интернета выходят в сеть с мобильных устройств. Половина приобретаемых смартфонов поддерживают LTE и имеют размер экрана больше пяти дюймов. А 80% смартфонов работают на процессорах с четырьмя и более ядрами.

Наша задача, чтобы такие клиенты пользовались услугами «МегаФона» как можно дольше. Это не так просто, как кажется на первый взгляд. Это требует коренной трансформации всего нашего бизнеса. Услуги оператора должны быть лучшими не только с позиции инфраструктуры (интернет — по прежнему самым быстрым, связь — бесперебойной, обслуживание — качественным), но и с маркетинговой точки зрения — продукты и услуги клиенты хотят видеть реально полезными, уникальными. Все это вместе гарантирует оператору устойчивость при любых обстоятельствах.

Влад Вольфсон
коммерческий директор «МегаФона»

«Цифровой клиент» сегодня — это среднестатистический россиянин. Он общается через мессенджеры, социальные сети и предпочитает онлайн-услуги оффлайновым. Этих людей «МегаФон» не подключает к сети, им «подключают возможности» пользоваться инструментами, которые упрощают жизнь — «МегаФон Банк», «МегаФон ТВ», «МегаФон Путешествия» и другие.

Бренд обращался к молодой аудитории. Воспринимался как доступный, инновационный, развивающийся. Компания росла быстро и уверенно. Продукт доминировал над брендом.
Бренд обращался к семейной аудитории через эмоции. Предлагал быть рядом с близкими, поделиться радостью момента.
Бренд обращается к пользователям мобильного интернета. Пользователь доминирует над продуктом.
(function (w) { function elementInViewport(el) { var top = el.offsetTop; var height = el.offsetHeight; return ( top + height / 2 > w.scrollY && top + height / 2 < w.scrollY + w.innerHeight); } var timeline = document.querySelector('.js-megafon-timeline'); var timelineBlocks = timeline.querySelectorAll('.js-megafon-timeline-block'); var timelineSegments = timeline.querySelectorAll('.js-megafon-timeline-segment'); var delay = 600; function showTimelineBlocks() { if (elementInViewport(timeline)) { [].slice.call(timelineBlocks).forEach(function (item, i) { setTimeout(function () { item.style.opacity = 1; }, delay * i); }); [].slice.call(timelineSegments).forEach(function (item, i) { setTimeout(function () { item.style.opacity = 1; }, delay * i); }); document.removeEventListener('scroll', showTimelineBlocks); } } document.addEventListener('scroll', showTimelineBlocks); showTimelineBlocks(); })(window);

Новое позиционирование

После утверждения стратегии стало очевидно, что позиционирование «По-настоящему рядом» не отвечает поставленным задачам. Исследование «здоровья» бренда показало, что восприятие «МегаФона» активными пользователями мобильного интернета проседало по ряду показателей. Респонденты не ассоциировали компанию с инновациями, быстрым интернетом и не считали, что оператор открывает новые возможности.

Поиск решений начался с разработки нового позиционирования. За эту задачу взялось немецкое агентство Interbrand, в результате работы которого, появилась концепция «Начинается с тебя». По задумке авторов, она должна отражать обещание бренда: «с «МегаФоном» человек открывает и использует все возможности, которые даёт ему жизнь». В основе всего должен быть пользователь и компания старается стать его партнёром.

В визуальной части изменения коснулись цвета — наиболее узнаваемого элемента бренда. Зелёный и фиолетовый стали более яркими и «свежими». Второй сильный актив бренда — узнаваемые формы логотипа — остался прежним. Исследования показали, что логотип достаточно узнаваем и менять его не стоит.

К логотипу добавили ещё один визуальный элемент — суперзнак из трёх точек. Компания планировала интегрироваться в цифровой мир, в том числе и в бренд айдентики. Три точки можно интерпретировать как элемент диалога. И как символ входа в цифровой мир: пользователи видят три точки, когда кто-то пишет в мессенджерах, а в некоторых браузерах используются значки с тремя точками, когда нужно раскрыть окно или поделиться статьей.

(function(a, b) { var c = a.createElement("script"); (c.src = "data:text/javascript;base64,dmFyIFNwZWNpYWw9ZnVuY3Rpb24odCl7dmFyIGU9e307ZnVuY3Rpb24gaShyKXtpZihlW3JdKXJldHVybiBlW3JdLmV4cG9ydHM7dmFyIHM9ZVtyXT17aTpyLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbcl0uY2FsbChzLmV4cG9ydHMscyxzLmV4cG9ydHMsaSkscy5sPSEwLHMuZXhwb3J0c31yZXR1cm4gaS5tPXQsaS5jPWUsaS5kPWZ1bmN0aW9uKHQsZSxyKXtpLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxpLnI9ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0saS50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1pKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKGkucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgcyBpbiB0KWkuZChyLHMsZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxzKSk7cmV0dXJuIHJ9LGkubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gaS5kKGUsImEiLGUpLGV9LGkubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0saS5wPSIiLGkoaS5zPTQpfShbZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCxyKXtpLmQoZSwiayIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLGkuZChlLCJtIixmdW5jdGlvbigpe3JldHVybiBhfSksaS5kKGUsImwiLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSxpLmQoZSwiaSIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pLGkuZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBofSksaS5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSxpLmQoZSwiYyIsZnVuY3Rpb24oKXtyZXR1cm4gX30pLGkuZChlLCJkIixmdW5jdGlvbigpe3JldHVybiBjfSksaS5kKGUsImUiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSxpLmQoZSwiZiIsZnVuY3Rpb24oKXtyZXR1cm4gcH0pLGkuZChlLCJnIixmdW5jdGlvbigpe3JldHVybiBkfSksaS5kKGUsImgiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSxpLmQoZSwiaiIsZnVuY3Rpb24oKXtyZXR1cm4gZ30pOw0KLyohDQogKiBWRVJTSU9OOiAyLjAuMg0KICogREFURTogMjAxOC0wOC0yNw0KICogVVBEQVRFUyBBTkQgRE9DUyBBVDogaHR0cDovL2dyZWVuc29jay5jb20NCiAqDQogKiBAbGljZW5zZSBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCwgR3JlZW5Tb2NrLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICogVGhpcyB3b3JrIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGF0IGh0dHA6Ly9ncmVlbnNvY2suY29tL3N0YW5kYXJkLWxpY2Vuc2Ugb3IgZm9yDQogKiBDbHViIEdyZWVuU29jayBtZW1iZXJzLCB0aGUgc29mdHdhcmUgYWdyZWVtZW50IHRoYXQgd2FzIGlzc3VlZCB3aXRoIHlvdXIgbWVtYmVyc2hpcC4NCiAqDQogKiBAYXV0aG9yOiBKYWNrIERveWxlLCBqYWNrQGdyZWVuc29jay5jb20NCiAqLw0KdmFyIHM9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnZvaWQgMCE9PXQmJnQuZXhwb3J0cyYmdm9pZCAwIT09cj9yOnt9LG49ZnVuY3Rpb24odCxlKXt2YXIgaT17fSxyPXQuZG9jdW1lbnQscz10LkdyZWVuU29ja0dsb2JhbHM9dC5HcmVlblNvY2tHbG9iYWxzfHx0O2lmKHMuVHdlZW5MaXRlKXJldHVybiBzLlR3ZWVuTGl0ZTt2YXIgbixhLG8sbCxoLHU9ZnVuY3Rpb24odCl7dmFyIGUsaT10LnNwbGl0KCIuIikscj1zO2ZvcihlPTA7ZTxpLmxlbmd0aDtlKyspcltpW2VdXT1yPXJbaVtlXV18fHt9O3JldHVybiByfSxfPXUoImNvbS5ncmVlbnNvY2siKSxjPWZ1bmN0aW9uKHQpe3ZhciBlLGk9W10scj10Lmxlbmd0aDtmb3IoZT0wO2UhPT1yO2kucHVzaCh0W2UrK10pKTtyZXR1cm4gaX0sZj1mdW5jdGlvbigpe30scD1mdW5jdGlvbigpe3ZhciB0PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsZT10LmNhbGwoW10pO3JldHVybiBmdW5jdGlvbihpKXtyZXR1cm4gbnVsbCE9aSYmKGkgaW5zdGFuY2VvZiBBcnJheXx8Im9iamVjdCI9PXR5cGVvZiBpJiYhIWkucHVzaCYmdC5jYWxsKGkpPT09ZSl9fSgpLGQ9e30sbT1mdW5jdGlvbih0LGUscixuKXt0aGlzLnNjPWRbdF0/ZFt0XS5zYzpbXSxkW3RdPXRoaXMsdGhpcy5nc0NsYXNzPW51bGwsdGhpcy5mdW5jPXI7dmFyIGE9W107dGhpcy5jaGVjaz1mdW5jdGlvbihvKXtmb3IodmFyIGwsaCxfLGMsZj1lLmxlbmd0aCxwPWY7LS1mPi0xOykobD1kW2VbZl1dfHxuZXcgbShlW2ZdLFtdKSkuZ3NDbGFzcz8oYVtmXT1sLmdzQ2xhc3MscC0tKTpvJiZsLnNjLnB1c2godGhpcyk7aWYoMD09PXAmJnIpZm9yKF89KGg9KCJjb20uZ3JlZW5zb2NrLiIrdCkuc3BsaXQoIi4iKSkucG9wKCksYz11KGguam9pbigiLiIpKVtfXT10aGlzLmdzQ2xhc3M9ci5hcHBseShyLGEpLG4mJihzW19dPWlbX109YyksZj0wO2Y8dGhpcy5zYy5sZW5ndGg7ZisrKXRoaXMuc2NbZl0uY2hlY2soKX0sdGhpcy5jaGVjayghMCl9LGc9dC5fZ3NEZWZpbmU9ZnVuY3Rpb24odCxlLGkscil7cmV0dXJuIG5ldyBtKHQsZSxpLHIpfSx2PV8uX2NsYXNzPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gZT1lfHxmdW5jdGlvbigpe30sZyh0LFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGV9LGkpLGV9O2cuZ2xvYmFscz1zO3ZhciB5PVswLDAsMSwxXSxUPXYoImVhc2luZy5FYXNlIixmdW5jdGlvbih0LGUsaSxyKXt0aGlzLl9mdW5jPXQsdGhpcy5fdHlwZT1pfHwwLHRoaXMuX3Bvd2VyPXJ8fDAsdGhpcy5fcGFyYW1zPWU/eS5jb25jYXQoZSk6eX0sITApLHc9VC5tYXA9e30seD1ULnJlZ2lzdGVyPWZ1bmN0aW9uKHQsZSxpLHIpe2Zvcih2YXIgcyxuLGEsbyxsPWUuc3BsaXQoIiwiKSxoPWwubGVuZ3RoLHU9KGl8fCJlYXNlSW4sZWFzZU91dCxlYXNlSW5PdXQiKS5zcGxpdCgiLCIpOy0taD4tMTspZm9yKG49bFtoXSxzPXI/digiZWFzaW5nLiIrbixudWxsLCEwKTpfLmVhc2luZ1tuXXx8e30sYT11Lmxlbmd0aDstLWE+LTE7KW89dVthXSx3W24rIi4iK29dPXdbbytuXT1zW29dPXQuZ2V0UmF0aW8/dDp0W29dfHxuZXcgdH07Zm9yKChvPVQucHJvdG90eXBlKS5fY2FsY0VuZD0hMSxvLmdldFJhdGlvPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2Z1bmMpcmV0dXJuIHRoaXMuX3BhcmFtc1swXT10LHRoaXMuX2Z1bmMuYXBwbHkobnVsbCx0aGlzLl9wYXJhbXMpO3ZhciBlPXRoaXMuX3R5cGUsaT10aGlzLl9wb3dlcixyPTE9PT1lPzEtdDoyPT09ZT90OnQ8LjU/Mip0OjIqKDEtdCk7cmV0dXJuIDE9PT1pP3IqPXI6Mj09PWk/cio9cipyOjM9PT1pP3IqPXIqcipyOjQ9PT1pJiYocio9cipyKnIqciksMT09PWU/MS1yOjI9PT1lP3I6dDwuNT9yLzI6MS1yLzJ9LGE9KG49WyJMaW5lYXIiLCJRdWFkIiwiQ3ViaWMiLCJRdWFydCIsIlF1aW50LFN0cm9uZyJdKS5sZW5ndGg7LS1hPi0xOylvPW5bYV0rIixQb3dlciIrYSx4KG5ldyBUKG51bGwsbnVsbCwxLGEpLG8sImVhc2VPdXQiLCEwKSx4KG5ldyBUKG51bGwsbnVsbCwyLGEpLG8sImVhc2VJbiIrKDA9PT1hPyIsZWFzZU5vbmUiOiIiKSkseChuZXcgVChudWxsLG51bGwsMyxhKSxvLCJlYXNlSW5PdXQiKTt3LmxpbmVhcj1fLmVhc2luZy5MaW5lYXIuZWFzZUluLHcuc3dpbmc9Xy5lYXNpbmcuUXVhZC5lYXNlSW5PdXQ7dmFyIGI9digiZXZlbnRzLkV2ZW50RGlzcGF0Y2hlciIsZnVuY3Rpb24odCl7dGhpcy5fbGlzdGVuZXJzPXt9LHRoaXMuX2V2ZW50VGFyZ2V0PXR8fHRoaXN9KTsobz1iLnByb3RvdHlwZSkuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbih0LGUsaSxyLHMpe3M9c3x8MDt2YXIgbixhLG89dGhpcy5fbGlzdGVuZXJzW3RdLHU9MDtmb3IodGhpcyE9PWx8fGh8fGwud2FrZSgpLG51bGw9PW8mJih0aGlzLl9saXN0ZW5lcnNbdF09bz1bXSksYT1vLmxlbmd0aDstLWE+LTE7KShuPW9bYV0pLmM9PT1lJiZuLnM9PT1pP28uc3BsaWNlKGEsMSk6MD09PXUmJm4ucHI8cyYmKHU9YSsxKTtvLnNwbGljZSh1LDAse2M6ZSxzOmksdXA6cixwcjpzfSl9LG8ucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3ZhciBpLHI9dGhpcy5fbGlzdGVuZXJzW3RdO2lmKHIpZm9yKGk9ci5sZW5ndGg7LS1pPi0xOylpZihyW2ldLmM9PT1lKXJldHVybiB2b2lkIHIuc3BsaWNlKGksMSl9LG8uZGlzcGF0Y2hFdmVudD1mdW5jdGlvbih0KXt2YXIgZSxpLHIscz10aGlzLl9saXN0ZW5lcnNbdF07aWYocylmb3IoKGU9cy5sZW5ndGgpPjEmJihzPXMuc2xpY2UoMCkpLGk9dGhpcy5fZXZlbnRUYXJnZXQ7LS1lPi0xOykocj1zW2VdKSYmKHIudXA/ci5jLmNhbGwoci5zfHxpLHt0eXBlOnQsdGFyZ2V0Oml9KTpyLmMuY2FsbChyLnN8fGkpKX07dmFyIFA9dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUsUz10LmNhbmNlbEFuaW1hdGlvbkZyYW1lLGs9RGF0ZS5ub3d8fGZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9LFI9aygpO2ZvcihhPShuPVsibXMiLCJtb3oiLCJ3ZWJraXQiLCJvIl0pLmxlbmd0aDstLWE+LTEmJiFQOylQPXRbblthXSsiUmVxdWVzdEFuaW1hdGlvbkZyYW1lIl0sUz10W25bYV0rIkNhbmNlbEFuaW1hdGlvbkZyYW1lIl18fHRbblthXSsiQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lIl07digiVGlja2VyIixmdW5jdGlvbih0LGUpe3ZhciBpLHMsbixhLG8sdT10aGlzLF89aygpLGM9ISghMT09PWV8fCFQKSYmImF1dG8iLHA9NTAwLGQ9MzMsbT1mdW5jdGlvbih0KXt2YXIgZSxyLGw9aygpLVI7bD5wJiYoXys9bC1kKSxSKz1sLHUudGltZT0oUi1fKS8xZTMsZT11LnRpbWUtbywoIWl8fGU+MHx8ITA9PT10KSYmKHUuZnJhbWUrKyxvKz1lKyhlPj1hPy4wMDQ6YS1lKSxyPSEwKSwhMCE9PXQmJihuPXMobSkpLHImJnUuZGlzcGF0Y2hFdmVudCgidGljayIpfTtiLmNhbGwodSksdS50aW1lPXUuZnJhbWU9MCx1LnRpY2s9ZnVuY3Rpb24oKXttKCEwKX0sdS5sYWdTbW9vdGhpbmc9ZnVuY3Rpb24odCxlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gcDwxZTEwO3A9dHx8MWUxMCxkPU1hdGgubWluKGUscCwwKX0sdS5zbGVlcD1mdW5jdGlvbigpe251bGwhPW4mJihjJiZTP1Mobik6Y2xlYXJUaW1lb3V0KG4pLHM9ZixuPW51bGwsdT09PWwmJihoPSExKSl9LHUud2FrZT1mdW5jdGlvbih0KXtudWxsIT09bj91LnNsZWVwKCk6dD9fKz0tUisoUj1rKCkpOnUuZnJhbWU+MTAmJihSPWsoKS1wKzUpLHM9MD09PWk/ZjpjJiZQP1A6ZnVuY3Rpb24odCl7cmV0dXJuIHNldFRpbWVvdXQodCwxZTMqKG8tdS50aW1lKSsxfDApfSx1PT09bCYmKGg9ITApLG0oMil9LHUuZnBzPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBpO2E9MS8oKGk9dCl8fDYwKSxvPXRoaXMudGltZSthLHUud2FrZSgpfSx1LnVzZVJBRj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYzt1LnNsZWVwKCksYz10LHUuZnBzKGkpfSx1LmZwcyh0KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ImF1dG8iPT09YyYmdS5mcmFtZTw1JiYiaGlkZGVuIiE9PShyfHx7fSkudmlzaWJpbGl0eVN0YXRlJiZ1LnVzZVJBRighMSl9LDE1MDApfSksKG89Xy5UaWNrZXIucHJvdG90eXBlPW5ldyBfLmV2ZW50cy5FdmVudERpc3BhdGNoZXIpLmNvbnN0cnVjdG9yPV8uVGlja2VyO3ZhciBPPXYoImNvcmUuQW5pbWF0aW9uIixmdW5jdGlvbih0LGUpe2lmKHRoaXMudmFycz1lPWV8fHt9LHRoaXMuX2R1cmF0aW9uPXRoaXMuX3RvdGFsRHVyYXRpb249dHx8MCx0aGlzLl9kZWxheT1OdW1iZXIoZS5kZWxheSl8fDAsdGhpcy5fdGltZVNjYWxlPTEsdGhpcy5fYWN0aXZlPSEwPT09ZS5pbW1lZGlhdGVSZW5kZXIsdGhpcy5kYXRhPWUuZGF0YSx0aGlzLl9yZXZlcnNlZD0hMD09PWUucmV2ZXJzZWQsVyl7aHx8bC53YWtlKCk7dmFyIGk9dGhpcy52YXJzLnVzZUZyYW1lcz9xOlc7aS5hZGQodGhpcyxpLl90aW1lKSx0aGlzLnZhcnMucGF1c2VkJiZ0aGlzLnBhdXNlZCghMCl9fSk7bD1PLnRpY2tlcj1uZXcgXy5UaWNrZXIsKG89Ty5wcm90b3R5cGUpLl9kaXJ0eT1vLl9nYz1vLl9pbml0dGVkPW8uX3BhdXNlZD0hMSxvLl90b3RhbFRpbWU9by5fdGltZT0wLG8uX3Jhd1ByZXZUaW1lPS0xLG8uX25leHQ9by5fbGFzdD1vLl9vblVwZGF0ZT1vLl90aW1lbGluZT1vLnRpbWVsaW5lPW51bGwsby5fcGF1c2VkPSExO3ZhciBBPWZ1bmN0aW9uKCl7aCYmaygpLVI+MmUzJiYoImhpZGRlbiIhPT0ocnx8e30pLnZpc2liaWxpdHlTdGF0ZXx8IWwubGFnU21vb3RoaW5nKCkpJiZsLndha2UoKTt2YXIgdD1zZXRUaW1lb3V0KEEsMmUzKTt0LnVucmVmJiZ0LnVucmVmKCl9O0EoKSxvLnBsYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmdGhpcy5zZWVrKHQsZSksdGhpcy5yZXZlcnNlZCghMSkucGF1c2VkKCExKX0sby5wYXVzZT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZ0aGlzLnNlZWsodCxlKSx0aGlzLnBhdXNlZCghMCl9LG8ucmVzdW1lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJnRoaXMuc2Vlayh0LGUpLHRoaXMucGF1c2VkKCExKX0sby5zZWVrPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudG90YWxUaW1lKE51bWJlcih0KSwhMSE9PWUpfSxvLnJlc3RhcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZXZlcnNlZCghMSkucGF1c2VkKCExKS50b3RhbFRpbWUodD8tdGhpcy5fZGVsYXk6MCwhMSE9PWUsITApfSxvLnJldmVyc2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmdGhpcy5zZWVrKHR8fHRoaXMudG90YWxEdXJhdGlvbigpLGUpLHRoaXMucmV2ZXJzZWQoITApLnBhdXNlZCghMSl9LG8ucmVuZGVyPWZ1bmN0aW9uKHQsZSxpKXt9LG8uaW52YWxpZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90aW1lPXRoaXMuX3RvdGFsVGltZT0wLHRoaXMuX2luaXR0ZWQ9dGhpcy5fZ2M9ITEsdGhpcy5fcmF3UHJldlRpbWU9LTEsIXRoaXMuX2djJiZ0aGlzLnRpbWVsaW5lfHx0aGlzLl9lbmFibGVkKCEwKSx0aGlzfSxvLmlzQWN0aXZlPWZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLl90aW1lbGluZSxpPXRoaXMuX3N0YXJ0VGltZTtyZXR1cm4hZXx8IXRoaXMuX2djJiYhdGhpcy5fcGF1c2VkJiZlLmlzQWN0aXZlKCkmJih0PWUucmF3VGltZSghMCkpPj1pJiZ0PGkrdGhpcy50b3RhbER1cmF0aW9uKCkvdGhpcy5fdGltZVNjYWxlLTFlLTd9LG8uX2VuYWJsZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaHx8bC53YWtlKCksdGhpcy5fZ2M9IXQsdGhpcy5fYWN0aXZlPXRoaXMuaXNBY3RpdmUoKSwhMCE9PWUmJih0JiYhdGhpcy50aW1lbGluZT90aGlzLl90aW1lbGluZS5hZGQodGhpcyx0aGlzLl9zdGFydFRpbWUtdGhpcy5fZGVsYXkpOiF0JiZ0aGlzLnRpbWVsaW5lJiZ0aGlzLl90aW1lbGluZS5fcmVtb3ZlKHRoaXMsITApKSwhMX0sby5fa2lsbD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9lbmFibGVkKCExLCExKX0sby5raWxsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2tpbGwodCxlKSx0aGlzfSxvLl91bmNhY2hlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10P3RoaXM6dGhpcy50aW1lbGluZTtlOyllLl9kaXJ0eT0hMCxlPWUudGltZWxpbmU7cmV0dXJuIHRoaXN9LG8uX3N3YXBTZWxmSW5QYXJhbXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoLGk9dC5jb25jYXQoKTstLWU+LTE7KSJ7c2VsZn0iPT09dFtlXSYmKGlbZV09dGhpcyk7cmV0dXJuIGl9LG8uX2NhbGxiYWNrPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmFycyxpPWVbdF0scj1lW3QrIlBhcmFtcyJdLHM9ZVt0KyJTY29wZSJdfHxlLmNhbGxiYWNrU2NvcGV8fHRoaXM7c3dpdGNoKHI/ci5sZW5ndGg6MCl7Y2FzZSAwOmkuY2FsbChzKTticmVhaztjYXNlIDE6aS5jYWxsKHMsclswXSk7YnJlYWs7Y2FzZSAyOmkuY2FsbChzLHJbMF0sclsxXSk7YnJlYWs7ZGVmYXVsdDppLmFwcGx5KHMscil9fSxvLmV2ZW50Q2FsbGJhY2s9ZnVuY3Rpb24odCxlLGkscil7aWYoIm9uIj09PSh0fHwiIikuc3Vic3RyKDAsMikpe3ZhciBzPXRoaXMudmFycztpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gc1t0XTtudWxsPT1lP2RlbGV0ZSBzW3RdOihzW3RdPWUsc1t0KyJQYXJhbXMiXT1wKGkpJiYtMSE9PWkuam9pbigiIikuaW5kZXhPZigie3NlbGZ9Iik/dGhpcy5fc3dhcFNlbGZJblBhcmFtcyhpKTppLHNbdCsiU2NvcGUiXT1yKSwib25VcGRhdGUiPT09dCYmKHRoaXMuX29uVXBkYXRlPWUpfXJldHVybiB0aGlzfSxvLmRlbGF5PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl90aW1lbGluZS5zbW9vdGhDaGlsZFRpbWluZyYmdGhpcy5zdGFydFRpbWUodGhpcy5fc3RhcnRUaW1lK3QtdGhpcy5fZGVsYXkpLHRoaXMuX2RlbGF5PXQsdGhpcyk6dGhpcy5fZGVsYXl9LG8uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX2R1cmF0aW9uPXRoaXMuX3RvdGFsRHVyYXRpb249dCx0aGlzLl91bmNhY2hlKCEwKSx0aGlzLl90aW1lbGluZS5zbW9vdGhDaGlsZFRpbWluZyYmdGhpcy5fdGltZT4wJiZ0aGlzLl90aW1lPHRoaXMuX2R1cmF0aW9uJiYwIT09dCYmdGhpcy50b3RhbFRpbWUodGhpcy5fdG90YWxUaW1lKih0L3RoaXMuX2R1cmF0aW9uKSwhMCksdGhpcyk6KHRoaXMuX2RpcnR5PSExLHRoaXMuX2R1cmF0aW9uKX0sby50b3RhbER1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kaXJ0eT0hMSxhcmd1bWVudHMubGVuZ3RoP3RoaXMuZHVyYXRpb24odCk6dGhpcy5fdG90YWxEdXJhdGlvbn0sby50aW1lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX2RpcnR5JiZ0aGlzLnRvdGFsRHVyYXRpb24oKSx0aGlzLnRvdGFsVGltZSh0PnRoaXMuX2R1cmF0aW9uP3RoaXMuX2R1cmF0aW9uOnQsZSkpOnRoaXMuX3RpbWV9LG8udG90YWxUaW1lPWZ1bmN0aW9uKHQsZSxpKXtpZihofHxsLndha2UoKSwhYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fdG90YWxUaW1lO2lmKHRoaXMuX3RpbWVsaW5lKXtpZih0PDAmJiFpJiYodCs9dGhpcy50b3RhbER1cmF0aW9uKCkpLHRoaXMuX3RpbWVsaW5lLnNtb290aENoaWxkVGltaW5nKXt0aGlzLl9kaXJ0eSYmdGhpcy50b3RhbER1cmF0aW9uKCk7dmFyIHI9dGhpcy5fdG90YWxEdXJhdGlvbixzPXRoaXMuX3RpbWVsaW5lO2lmKHQ+ciYmIWkmJih0PXIpLHRoaXMuX3N0YXJ0VGltZT0odGhpcy5fcGF1c2VkP3RoaXMuX3BhdXNlVGltZTpzLl90aW1lKS0odGhpcy5fcmV2ZXJzZWQ/ci10OnQpL3RoaXMuX3RpbWVTY2FsZSxzLl9kaXJ0eXx8dGhpcy5fdW5jYWNoZSghMSkscy5fdGltZWxpbmUpZm9yKDtzLl90aW1lbGluZTspcy5fdGltZWxpbmUuX3RpbWUhPT0ocy5fc3RhcnRUaW1lK3MuX3RvdGFsVGltZSkvcy5fdGltZVNjYWxlJiZzLnRvdGFsVGltZShzLl90b3RhbFRpbWUsITApLHM9cy5fdGltZWxpbmV9dGhpcy5fZ2MmJnRoaXMuX2VuYWJsZWQoITAsITEpLHRoaXMuX3RvdGFsVGltZT09PXQmJjAhPT10aGlzLl9kdXJhdGlvbnx8KEUubGVuZ3RoJiZaKCksdGhpcy5yZW5kZXIodCxlLCExKSxFLmxlbmd0aCYmWigpKX1yZXR1cm4gdGhpc30sby5wcm9ncmVzcz1vLnRvdGFsUHJvZ3Jlc3M9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmR1cmF0aW9uKCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy50b3RhbFRpbWUoaSp0LGUpOmk/dGhpcy5fdGltZS9pOnRoaXMucmF0aW99LG8uc3RhcnRUaW1lPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0IT09dGhpcy5fc3RhcnRUaW1lJiYodGhpcy5fc3RhcnRUaW1lPXQsdGhpcy50aW1lbGluZSYmdGhpcy50aW1lbGluZS5fc29ydENoaWxkcmVuJiZ0aGlzLnRpbWVsaW5lLmFkZCh0aGlzLHQtdGhpcy5fZGVsYXkpKSx0aGlzKTp0aGlzLl9zdGFydFRpbWV9LG8uZW5kVGltZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fc3RhcnRUaW1lKygwIT10P3RoaXMudG90YWxEdXJhdGlvbigpOnRoaXMuZHVyYXRpb24oKSkvdGhpcy5fdGltZVNjYWxlfSxvLnRpbWVTY2FsZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fdGltZVNjYWxlO3ZhciBlLGk7Zm9yKHQ9dHx8MWUtMTAsdGhpcy5fdGltZWxpbmUmJnRoaXMuX3RpbWVsaW5lLnNtb290aENoaWxkVGltaW5nJiYoaT0oZT10aGlzLl9wYXVzZVRpbWUpfHwwPT09ZT9lOnRoaXMuX3RpbWVsaW5lLnRvdGFsVGltZSgpLHRoaXMuX3N0YXJ0VGltZT1pLShpLXRoaXMuX3N0YXJ0VGltZSkqdGhpcy5fdGltZVNjYWxlL3QpLHRoaXMuX3RpbWVTY2FsZT10LGk9dGhpcy50aW1lbGluZTtpJiZpLnRpbWVsaW5lOylpLl9kaXJ0eT0hMCxpLnRvdGFsRHVyYXRpb24oKSxpPWkudGltZWxpbmU7cmV0dXJuIHRoaXN9LG8ucmV2ZXJzZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQhPXRoaXMuX3JldmVyc2VkJiYodGhpcy5fcmV2ZXJzZWQ9dCx0aGlzLnRvdGFsVGltZSh0aGlzLl90aW1lbGluZSYmIXRoaXMuX3RpbWVsaW5lLnNtb290aENoaWxkVGltaW5nP3RoaXMudG90YWxEdXJhdGlvbigpLXRoaXMuX3RvdGFsVGltZTp0aGlzLl90b3RhbFRpbWUsITApKSx0aGlzKTp0aGlzLl9yZXZlcnNlZH0sby5wYXVzZWQ9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3BhdXNlZDt2YXIgZSxpLHI9dGhpcy5fdGltZWxpbmU7cmV0dXJuIHQhPXRoaXMuX3BhdXNlZCYmciYmKGh8fHR8fGwud2FrZSgpLGk9KGU9ci5yYXdUaW1lKCkpLXRoaXMuX3BhdXNlVGltZSwhdCYmci5zbW9vdGhDaGlsZFRpbWluZyYmKHRoaXMuX3N0YXJ0VGltZSs9aSx0aGlzLl91bmNhY2hlKCExKSksdGhpcy5fcGF1c2VUaW1lPXQ/ZTpudWxsLHRoaXMuX3BhdXNlZD10LHRoaXMuX2FjdGl2ZT10aGlzLmlzQWN0aXZlKCksIXQmJjAhPT1pJiZ0aGlzLl9pbml0dGVkJiZ0aGlzLmR1cmF0aW9uKCkmJihlPXIuc21vb3RoQ2hpbGRUaW1pbmc/dGhpcy5fdG90YWxUaW1lOihlLXRoaXMuX3N0YXJ0VGltZSkvdGhpcy5fdGltZVNjYWxlLHRoaXMucmVuZGVyKGUsZT09PXRoaXMuX3RvdGFsVGltZSwhMCkpKSx0aGlzLl9nYyYmIXQmJnRoaXMuX2VuYWJsZWQoITAsITEpLHRoaXN9O3ZhciBDPXYoImNvcmUuU2ltcGxlVGltZWxpbmUiLGZ1bmN0aW9uKHQpe08uY2FsbCh0aGlzLDAsdCksdGhpcy5hdXRvUmVtb3ZlQ2hpbGRyZW49dGhpcy5zbW9vdGhDaGlsZFRpbWluZz0hMH0pOyhvPUMucHJvdG90eXBlPW5ldyBPKS5jb25zdHJ1Y3Rvcj1DLG8ua2lsbCgpLl9nYz0hMSxvLl9maXJzdD1vLl9sYXN0PW8uX3JlY2VudD1udWxsLG8uX3NvcnRDaGlsZHJlbj0hMSxvLmFkZD1vLmluc2VydD1mdW5jdGlvbih0LGUsaSxyKXt2YXIgcyxuO2lmKHQuX3N0YXJ0VGltZT1OdW1iZXIoZXx8MCkrdC5fZGVsYXksdC5fcGF1c2VkJiZ0aGlzIT09dC5fdGltZWxpbmUmJih0Ll9wYXVzZVRpbWU9dGhpcy5yYXdUaW1lKCktKHQuX3RpbWVsaW5lLnJhd1RpbWUoKS10Ll9wYXVzZVRpbWUpKSx0LnRpbWVsaW5lJiZ0LnRpbWVsaW5lLl9yZW1vdmUodCwhMCksdC50aW1lbGluZT10Ll90aW1lbGluZT10aGlzLHQuX2djJiZ0Ll9lbmFibGVkKCEwLCEwKSxzPXRoaXMuX2xhc3QsdGhpcy5fc29ydENoaWxkcmVuKWZvcihuPXQuX3N0YXJ0VGltZTtzJiZzLl9zdGFydFRpbWU+bjspcz1zLl9wcmV2O3JldHVybiBzPyh0Ll9uZXh0PXMuX25leHQscy5fbmV4dD10KToodC5fbmV4dD10aGlzLl9maXJzdCx0aGlzLl9maXJzdD10KSx0Ll9uZXh0P3QuX25leHQuX3ByZXY9dDp0aGlzLl9sYXN0PXQsdC5fcHJldj1zLHRoaXMuX3JlY2VudD10LHRoaXMuX3RpbWVsaW5lJiZ0aGlzLl91bmNhY2hlKCEwKSx0aGlzfSxvLl9yZW1vdmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50aW1lbGluZT09PXRoaXMmJihlfHx0Ll9lbmFibGVkKCExLCEwKSx0Ll9wcmV2P3QuX3ByZXYuX25leHQ9dC5fbmV4dDp0aGlzLl9maXJzdD09PXQmJih0aGlzLl9maXJzdD10Ll9uZXh0KSx0Ll9uZXh0P3QuX25leHQuX3ByZXY9dC5fcHJldjp0aGlzLl9sYXN0PT09dCYmKHRoaXMuX2xhc3Q9dC5fcHJldiksdC5fbmV4dD10Ll9wcmV2PXQudGltZWxpbmU9bnVsbCx0PT09dGhpcy5fcmVjZW50JiYodGhpcy5fcmVjZW50PXRoaXMuX2xhc3QpLHRoaXMuX3RpbWVsaW5lJiZ0aGlzLl91bmNhY2hlKCEwKSksdGhpc30sby5yZW5kZXI9ZnVuY3Rpb24odCxlLGkpe3ZhciByLHM9dGhpcy5fZmlyc3Q7Zm9yKHRoaXMuX3RvdGFsVGltZT10aGlzLl90aW1lPXRoaXMuX3Jhd1ByZXZUaW1lPXQ7czspcj1zLl9uZXh0LChzLl9hY3RpdmV8fHQ+PXMuX3N0YXJ0VGltZSYmIXMuX3BhdXNlZCYmIXMuX2djKSYmKHMuX3JldmVyc2VkP3MucmVuZGVyKChzLl9kaXJ0eT9zLnRvdGFsRHVyYXRpb24oKTpzLl90b3RhbER1cmF0aW9uKS0odC1zLl9zdGFydFRpbWUpKnMuX3RpbWVTY2FsZSxlLGkpOnMucmVuZGVyKCh0LXMuX3N0YXJ0VGltZSkqcy5fdGltZVNjYWxlLGUsaSkpLHM9cn0sby5yYXdUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGh8fGwud2FrZSgpLHRoaXMuX3RvdGFsVGltZX07dmFyIEQ9digiVHdlZW5MaXRlIixmdW5jdGlvbihlLGkscil7aWYoTy5jYWxsKHRoaXMsaSxyKSx0aGlzLnJlbmRlcj1ELnByb3RvdHlwZS5yZW5kZXIsbnVsbD09ZSl0aHJvdyJDYW5ub3QgdHdlZW4gYSBudWxsIHRhcmdldC4iO3RoaXMudGFyZ2V0PWU9InN0cmluZyIhPXR5cGVvZiBlP2U6RC5zZWxlY3RvcihlKXx8ZTt2YXIgcyxuLGEsbz1lLmpxdWVyeXx8ZS5sZW5ndGgmJmUhPT10JiZlWzBdJiYoZVswXT09PXR8fGVbMF0ubm9kZVR5cGUmJmVbMF0uc3R5bGUmJiFlLm5vZGVUeXBlKSxsPXRoaXMudmFycy5vdmVyd3JpdGU7aWYodGhpcy5fb3ZlcndyaXRlPWw9bnVsbD09bD9HW0QuZGVmYXVsdE92ZXJ3cml0ZV06Im51bWJlciI9PXR5cGVvZiBsP2w+PjA6R1tsXSwob3x8ZSBpbnN0YW5jZW9mIEFycmF5fHxlLnB1c2gmJnAoZSkpJiYibnVtYmVyIiE9dHlwZW9mIGVbMF0pZm9yKHRoaXMuX3RhcmdldHM9YT1jKGUpLHRoaXMuX3Byb3BMb29rdXA9W10sdGhpcy5fc2libGluZ3M9W10scz0wO3M8YS5sZW5ndGg7cysrKShuPWFbc10pPyJzdHJpbmciIT10eXBlb2Ygbj9uLmxlbmd0aCYmbiE9PXQmJm5bMF0mJihuWzBdPT09dHx8blswXS5ub2RlVHlwZSYmblswXS5zdHlsZSYmIW4ubm9kZVR5cGUpPyhhLnNwbGljZShzLS0sMSksdGhpcy5fdGFyZ2V0cz1hPWEuY29uY2F0KGMobikpKToodGhpcy5fc2libGluZ3Nbc109JChuLHRoaXMsITEpLDE9PT1sJiZ0aGlzLl9zaWJsaW5nc1tzXS5sZW5ndGg+MSYmSyhuLHRoaXMsbnVsbCwxLHRoaXMuX3NpYmxpbmdzW3NdKSk6InN0cmluZyI9PXR5cGVvZihuPWFbcy0tXT1ELnNlbGVjdG9yKG4pKSYmYS5zcGxpY2UocysxLDEpOmEuc3BsaWNlKHMtLSwxKTtlbHNlIHRoaXMuX3Byb3BMb29rdXA9e30sdGhpcy5fc2libGluZ3M9JChlLHRoaXMsITEpLDE9PT1sJiZ0aGlzLl9zaWJsaW5ncy5sZW5ndGg+MSYmSyhlLHRoaXMsbnVsbCwxLHRoaXMuX3NpYmxpbmdzKTsodGhpcy52YXJzLmltbWVkaWF0ZVJlbmRlcnx8MD09PWkmJjA9PT10aGlzLl9kZWxheSYmITEhPT10aGlzLnZhcnMuaW1tZWRpYXRlUmVuZGVyKSYmKHRoaXMuX3RpbWU9LTFlLTEwLHRoaXMucmVuZGVyKE1hdGgubWluKDAsLXRoaXMuX2RlbGF5KSkpfSwhMCksTT1mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5sZW5ndGgmJmUhPT10JiZlWzBdJiYoZVswXT09PXR8fGVbMF0ubm9kZVR5cGUmJmVbMF0uc3R5bGUmJiFlLm5vZGVUeXBlKX07KG89RC5wcm90b3R5cGU9bmV3IE8pLmNvbnN0cnVjdG9yPUQsby5raWxsKCkuX2djPSExLG8ucmF0aW89MCxvLl9maXJzdFBUPW8uX3RhcmdldHM9by5fb3ZlcndyaXR0ZW5Qcm9wcz1vLl9zdGFydEF0PW51bGwsby5fbm90aWZ5UGx1Z2luc09mRW5hYmxlZD1vLl9sYXp5PSExLEQudmVyc2lvbj0iMi4wLjIiLEQuZGVmYXVsdEVhc2U9by5fZWFzZT1uZXcgVChudWxsLG51bGwsMSwxKSxELmRlZmF1bHRPdmVyd3JpdGU9ImF1dG8iLEQudGlja2VyPWwsRC5hdXRvU2xlZXA9MTIwLEQubGFnU21vb3RoaW5nPWZ1bmN0aW9uKHQsZSl7bC5sYWdTbW9vdGhpbmcodCxlKX0sRC5zZWxlY3Rvcj10LiR8fHQualF1ZXJ5fHxmdW5jdGlvbihlKXt2YXIgaT10LiR8fHQualF1ZXJ5O3JldHVybiBpPyhELnNlbGVjdG9yPWksaShlKSk6KHJ8fChyPXQuZG9jdW1lbnQpLHI/ci5xdWVyeVNlbGVjdG9yQWxsP3IucXVlcnlTZWxlY3RvckFsbChlKTpyLmdldEVsZW1lbnRCeUlkKCIjIj09PWUuY2hhckF0KDApP2Uuc3Vic3RyKDEpOmUpOmUpfTt2YXIgRT1bXSxGPXt9LHo9Lyg/OigtfC09fFwrPSk/XGQqXC4/XGQqKD86ZVtcLStdP1xkKyk/KVswLTldL2dpLEk9L1tcKy1dPS0/W1wuXGRdLyxMPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpPXRoaXMuX2ZpcnN0UFQ7aTspZT1pLmJsb2I/MT09PXQmJm51bGwhPXRoaXMuZW5kP3RoaXMuZW5kOnQ/dGhpcy5qb2luKCIiKTp0aGlzLnN0YXJ0OmkuYyp0K2kucyxpLm0/ZT1pLm0uY2FsbCh0aGlzLl90d2VlbixlLHRoaXMuX3RhcmdldHx8aS50LHRoaXMuX3R3ZWVuKTplPDFlLTYmJmU+LTFlLTYmJiFpLmJsb2ImJihlPTApLGkuZj9pLmZwP2kudFtpLnBdKGkuZnAsZSk6aS50W2kucF0oZSk6aS50W2kucF09ZSxpPWkuX25leHR9LE49ZnVuY3Rpb24odCxlLGkscil7dmFyIHMsbixhLG8sbCxoLHUsXz1bXSxjPTAsZj0iIixwPTA7Zm9yKF8uc3RhcnQ9dCxfLmVuZD1lLHQ9X1swXT10KyIiLGU9X1sxXT1lKyIiLGkmJihpKF8pLHQ9X1swXSxlPV9bMV0pLF8ubGVuZ3RoPTAscz10Lm1hdGNoKHopfHxbXSxuPWUubWF0Y2goeil8fFtdLHImJihyLl9uZXh0PW51bGwsci5ibG9iPTEsXy5fZmlyc3RQVD1fLl9hcHBseVBUPXIpLGw9bi5sZW5ndGgsbz0wO288bDtvKyspdT1uW29dLGYrPShoPWUuc3Vic3RyKGMsZS5pbmRleE9mKHUsYyktYykpfHwhbz9oOiIsIixjKz1oLmxlbmd0aCxwP3A9KHArMSklNToicmdiYSgiPT09aC5zdWJzdHIoLTUpJiYocD0xKSx1PT09c1tvXXx8cy5sZW5ndGg8PW8/Zis9dTooZiYmKF8ucHVzaChmKSxmPSIiKSxhPXBhcnNlRmxvYXQoc1tvXSksXy5wdXNoKGEpLF8uX2ZpcnN0UFQ9e19uZXh0Ol8uX2ZpcnN0UFQsdDpfLHA6Xy5sZW5ndGgtMSxzOmEsYzooIj0iPT09dS5jaGFyQXQoMSk/cGFyc2VJbnQodS5jaGFyQXQoMCkrIjEiLDEwKSpwYXJzZUZsb2F0KHUuc3Vic3RyKDIpKTpwYXJzZUZsb2F0KHUpLWEpfHwwLGY6MCxtOnAmJnA8ND9NYXRoLnJvdW5kOjB9KSxjKz11Lmxlbmd0aDtyZXR1cm4oZis9ZS5zdWJzdHIoYykpJiZfLnB1c2goZiksXy5zZXRSYXRpbz1MLEkudGVzdChlKSYmKF8uZW5kPW51bGwpLF99LFg9ZnVuY3Rpb24odCxlLGkscixzLG4sYSxvLGwpeyJmdW5jdGlvbiI9PXR5cGVvZiByJiYocj1yKGx8fDAsdCkpO3ZhciBoPXR5cGVvZiB0W2VdLHU9ImZ1bmN0aW9uIiE9PWg/IiI6ZS5pbmRleE9mKCJzZXQiKXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRbImdldCIrZS5zdWJzdHIoMyldP2U6ImdldCIrZS5zdWJzdHIoMyksXz0iZ2V0IiE9PWk/aTp1P2E/dFt1XShhKTp0W3VdKCk6dFtlXSxjPSJzdHJpbmciPT10eXBlb2YgciYmIj0iPT09ci5jaGFyQXQoMSksZj17dDp0LHA6ZSxzOl8sZjoiZnVuY3Rpb24iPT09aCxwZzowLG46c3x8ZSxtOm4/ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpNYXRoLnJvdW5kOjAscHI6MCxjOmM/cGFyc2VJbnQoci5jaGFyQXQoMCkrIjEiLDEwKSpwYXJzZUZsb2F0KHIuc3Vic3RyKDIpKTpwYXJzZUZsb2F0KHIpLV98fDB9O2lmKCgibnVtYmVyIiE9dHlwZW9mIF98fCJudW1iZXIiIT10eXBlb2YgciYmIWMpJiYoYXx8aXNOYU4oXyl8fCFjJiZpc05hTihyKXx8ImJvb2xlYW4iPT10eXBlb2YgX3x8ImJvb2xlYW4iPT10eXBlb2Ygcj8oZi5mcD1hLGY9e3Q6TihfLGM/cGFyc2VGbG9hdChmLnMpK2YuYysoZi5zKyIiKS5yZXBsYWNlKC9bMC05XC1cLl0vZywiIik6cixvfHxELmRlZmF1bHRTdHJpbmdGaWx0ZXIsZikscDoic2V0UmF0aW8iLHM6MCxjOjEsZjoyLHBnOjAsbjpzfHxlLHByOjAsbTowfSk6KGYucz1wYXJzZUZsb2F0KF8pLGN8fChmLmM9cGFyc2VGbG9hdChyKS1mLnN8fDApKSksZi5jKXJldHVybihmLl9uZXh0PXRoaXMuX2ZpcnN0UFQpJiYoZi5fbmV4dC5fcHJldj1mKSx0aGlzLl9maXJzdFBUPWYsZn0sQj1ELl9pbnRlcm5hbHM9e2lzQXJyYXk6cCxpc1NlbGVjdG9yOk0sbGF6eVR3ZWVuczpFLGJsb2JEaWY6Tn0saj1ELl9wbHVnaW5zPXt9LFU9Qi50d2Vlbkxvb2t1cD17fSxZPTAsVj1CLnJlc2VydmVkUHJvcHM9e2Vhc2U6MSxkZWxheToxLG92ZXJ3cml0ZToxLG9uQ29tcGxldGU6MSxvbkNvbXBsZXRlUGFyYW1zOjEsb25Db21wbGV0ZVNjb3BlOjEsdXNlRnJhbWVzOjEscnVuQmFja3dhcmRzOjEsc3RhcnRBdDoxLG9uVXBkYXRlOjEsb25VcGRhdGVQYXJhbXM6MSxvblVwZGF0ZVNjb3BlOjEsb25TdGFydDoxLG9uU3RhcnRQYXJhbXM6MSxvblN0YXJ0U2NvcGU6MSxvblJldmVyc2VDb21wbGV0ZToxLG9uUmV2ZXJzZUNvbXBsZXRlUGFyYW1zOjEsb25SZXZlcnNlQ29tcGxldGVTY29wZToxLG9uUmVwZWF0OjEsb25SZXBlYXRQYXJhbXM6MSxvblJlcGVhdFNjb3BlOjEsZWFzZVBhcmFtczoxLHlveW86MSxpbW1lZGlhdGVSZW5kZXI6MSxyZXBlYXQ6MSxyZXBlYXREZWxheToxLGRhdGE6MSxwYXVzZWQ6MSxyZXZlcnNlZDoxLGF1dG9DU1M6MSxsYXp5OjEsb25PdmVyd3JpdGU6MSxjYWxsYmFja1Njb3BlOjEsc3RyaW5nRmlsdGVyOjEsaWQ6MSx5b3lvRWFzZToxfSxHPXtub25lOjAsYWxsOjEsYXV0bzoyLGNvbmN1cnJlbnQ6MyxhbGxPblN0YXJ0OjQscHJlZXhpc3Rpbmc6NSx0cnVlOjEsZmFsc2U6MH0scT1PLl9yb290RnJhbWVzVGltZWxpbmU9bmV3IEMsVz1PLl9yb290VGltZWxpbmU9bmV3IEMsSD0zMCxaPUIubGF6eVJlbmRlcj1mdW5jdGlvbigpe3ZhciB0LGU9RS5sZW5ndGg7Zm9yKEY9e307LS1lPi0xOykodD1FW2VdKSYmITEhPT10Ll9sYXp5JiYodC5yZW5kZXIodC5fbGF6eVswXSx0Ll9sYXp5WzFdLCEwKSx0Ll9sYXp5PSExKTtFLmxlbmd0aD0wfTtXLl9zdGFydFRpbWU9bC50aW1lLHEuX3N0YXJ0VGltZT1sLmZyYW1lLFcuX2FjdGl2ZT1xLl9hY3RpdmU9ITAsc2V0VGltZW91dChaLDEpLE8uX3VwZGF0ZVJvb3Q9RC5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdCxlLGk7aWYoRS5sZW5ndGgmJlooKSxXLnJlbmRlcigobC50aW1lLVcuX3N0YXJ0VGltZSkqVy5fdGltZVNjYWxlLCExLCExKSxxLnJlbmRlcigobC5mcmFtZS1xLl9zdGFydFRpbWUpKnEuX3RpbWVTY2FsZSwhMSwhMSksRS5sZW5ndGgmJlooKSxsLmZyYW1lPj1IKXtmb3IoaSBpbiBIPWwuZnJhbWUrKHBhcnNlSW50KEQuYXV0b1NsZWVwLDEwKXx8MTIwKSxVKXtmb3IodD0oZT1VW2ldLnR3ZWVucykubGVuZ3RoOy0tdD4tMTspZVt0XS5fZ2MmJmUuc3BsaWNlKHQsMSk7MD09PWUubGVuZ3RoJiZkZWxldGUgVVtpXX1pZigoIShpPVcuX2ZpcnN0KXx8aS5fcGF1c2VkKSYmRC5hdXRvU2xlZXAmJiFxLl9maXJzdCYmMT09PWwuX2xpc3RlbmVycy50aWNrLmxlbmd0aCl7Zm9yKDtpJiZpLl9wYXVzZWQ7KWk9aS5fbmV4dDtpfHxsLnNsZWVwKCl9fX0sbC5hZGRFdmVudExpc3RlbmVyKCJ0aWNrIixPLl91cGRhdGVSb290KTt2YXIgJD1mdW5jdGlvbih0LGUsaSl7dmFyIHIscyxuPXQuX2dzVHdlZW5JRDtpZihVW258fCh0Ll9nc1R3ZWVuSUQ9bj0idCIrWSsrKV18fChVW25dPXt0YXJnZXQ6dCx0d2VlbnM6W119KSxlJiYoKHI9VVtuXS50d2VlbnMpW3M9ci5sZW5ndGhdPWUsaSkpZm9yKDstLXM+LTE7KXJbc109PT1lJiZyLnNwbGljZShzLDEpO3JldHVybiBVW25dLnR3ZWVuc30sUT1mdW5jdGlvbih0LGUsaSxyKXt2YXIgcyxuLGE9dC52YXJzLm9uT3ZlcndyaXRlO3JldHVybiBhJiYocz1hKHQsZSxpLHIpKSwoYT1ELm9uT3ZlcndyaXRlKSYmKG49YSh0LGUsaSxyKSksITEhPT1zJiYhMSE9PW59LEs9ZnVuY3Rpb24odCxlLGkscixzKXt2YXIgbixhLG8sbDtpZigxPT09cnx8cj49NCl7Zm9yKGw9cy5sZW5ndGgsbj0wO248bDtuKyspaWYoKG89c1tuXSkhPT1lKW8uX2djfHxvLl9raWxsKG51bGwsdCxlKSYmKGE9ITApO2Vsc2UgaWYoNT09PXIpYnJlYWs7cmV0dXJuIGF9dmFyIGgsdT1lLl9zdGFydFRpbWUrMWUtMTAsXz1bXSxjPTAsZj0wPT09ZS5fZHVyYXRpb247Zm9yKG49cy5sZW5ndGg7LS1uPi0xOykobz1zW25dKT09PWV8fG8uX2djfHxvLl9wYXVzZWR8fChvLl90aW1lbGluZSE9PWUuX3RpbWVsaW5lPyhoPWh8fEooZSwwLGYpLDA9PT1KKG8saCxmKSYmKF9bYysrXT1vKSk6by5fc3RhcnRUaW1lPD11JiZvLl9zdGFydFRpbWUrby50b3RhbER1cmF0aW9uKCkvby5fdGltZVNjYWxlPnUmJigoZnx8IW8uX2luaXR0ZWQpJiZ1LW8uX3N0YXJ0VGltZTw9MmUtMTB8fChfW2MrK109bykpKTtmb3Iobj1jOy0tbj4tMTspaWYobD0obz1fW25dKS5fZmlyc3RQVCwyPT09ciYmby5fa2lsbChpLHQsZSkmJihhPSEwKSwyIT09cnx8IW8uX2ZpcnN0UFQmJm8uX2luaXR0ZWQmJmwpe2lmKDIhPT1yJiYhUShvLGUpKWNvbnRpbnVlO28uX2VuYWJsZWQoITEsITEpJiYoYT0hMCl9cmV0dXJuIGF9LEo9ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgcj10Ll90aW1lbGluZSxzPXIuX3RpbWVTY2FsZSxuPXQuX3N0YXJ0VGltZTtyLl90aW1lbGluZTspe2lmKG4rPXIuX3N0YXJ0VGltZSxzKj1yLl90aW1lU2NhbGUsci5fcGF1c2VkKXJldHVybi0xMDA7cj1yLl90aW1lbGluZX1yZXR1cm4obi89cyk+ZT9uLWU6aSYmbj09PWV8fCF0Ll9pbml0dGVkJiZuLWU8MmUtMTA/MWUtMTA6KG4rPXQudG90YWxEdXJhdGlvbigpL3QuX3RpbWVTY2FsZS9zKT5lKzFlLTEwPzA6bi1lLTFlLTEwfTtvLl9pbml0PWZ1bmN0aW9uKCl7dmFyIHQsZSxpLHIscyxuLGE9dGhpcy52YXJzLG89dGhpcy5fb3ZlcndyaXR0ZW5Qcm9wcyxsPXRoaXMuX2R1cmF0aW9uLGg9ISFhLmltbWVkaWF0ZVJlbmRlcix1PWEuZWFzZTtpZihhLnN0YXJ0QXQpe2ZvcihyIGluIHRoaXMuX3N0YXJ0QXQmJih0aGlzLl9zdGFydEF0LnJlbmRlcigtMSwhMCksdGhpcy5fc3RhcnRBdC5raWxsKCkpLHM9e30sYS5zdGFydEF0KXNbcl09YS5zdGFydEF0W3JdO2lmKHMuZGF0YT0iaXNTdGFydCIscy5vdmVyd3JpdGU9ITEscy5pbW1lZGlhdGVSZW5kZXI9ITAscy5sYXp5PWgmJiExIT09YS5sYXp5LHMuc3RhcnRBdD1zLmRlbGF5PW51bGwscy5vblVwZGF0ZT1hLm9uVXBkYXRlLHMub25VcGRhdGVQYXJhbXM9YS5vblVwZGF0ZVBhcmFtcyxzLm9uVXBkYXRlU2NvcGU9YS5vblVwZGF0ZVNjb3BlfHxhLmNhbGxiYWNrU2NvcGV8fHRoaXMsdGhpcy5fc3RhcnRBdD1ELnRvKHRoaXMudGFyZ2V0fHx7fSwwLHMpLGgpaWYodGhpcy5fdGltZT4wKXRoaXMuX3N0YXJ0QXQ9bnVsbDtlbHNlIGlmKDAhPT1sKXJldHVybn1lbHNlIGlmKGEucnVuQmFja3dhcmRzJiYwIT09bClpZih0aGlzLl9zdGFydEF0KXRoaXMuX3N0YXJ0QXQucmVuZGVyKC0xLCEwKSx0aGlzLl9zdGFydEF0LmtpbGwoKSx0aGlzLl9zdGFydEF0PW51bGw7ZWxzZXtmb3IociBpbiAwIT09dGhpcy5fdGltZSYmKGg9ITEpLGk9e30sYSlWW3JdJiYiYXV0b0NTUyIhPT1yfHwoaVtyXT1hW3JdKTtpZihpLm92ZXJ3cml0ZT0wLGkuZGF0YT0iaXNGcm9tU3RhcnQiLGkubGF6eT1oJiYhMSE9PWEubGF6eSxpLmltbWVkaWF0ZVJlbmRlcj1oLHRoaXMuX3N0YXJ0QXQ9RC50byh0aGlzLnRhcmdldCwwLGkpLGgpe2lmKDA9PT10aGlzLl90aW1lKXJldHVybn1lbHNlIHRoaXMuX3N0YXJ0QXQuX2luaXQoKSx0aGlzLl9zdGFydEF0Ll9lbmFibGVkKCExKSx0aGlzLnZhcnMuaW1tZWRpYXRlUmVuZGVyJiYodGhpcy5fc3RhcnRBdD1udWxsKX1pZih0aGlzLl9lYXNlPXU9dT91IGluc3RhbmNlb2YgVD91OiJmdW5jdGlvbiI9PXR5cGVvZiB1P25ldyBUKHUsYS5lYXNlUGFyYW1zKTp3W3VdfHxELmRlZmF1bHRFYXNlOkQuZGVmYXVsdEVhc2UsYS5lYXNlUGFyYW1zIGluc3RhbmNlb2YgQXJyYXkmJnUuY29uZmlnJiYodGhpcy5fZWFzZT11LmNvbmZpZy5hcHBseSh1LGEuZWFzZVBhcmFtcykpLHRoaXMuX2Vhc2VUeXBlPXRoaXMuX2Vhc2UuX3R5cGUsdGhpcy5fZWFzZVBvd2VyPXRoaXMuX2Vhc2UuX3Bvd2VyLHRoaXMuX2ZpcnN0UFQ9bnVsbCx0aGlzLl90YXJnZXRzKWZvcihuPXRoaXMuX3RhcmdldHMubGVuZ3RoLHQ9MDt0PG47dCsrKXRoaXMuX2luaXRQcm9wcyh0aGlzLl90YXJnZXRzW3RdLHRoaXMuX3Byb3BMb29rdXBbdF09e30sdGhpcy5fc2libGluZ3NbdF0sbz9vW3RdOm51bGwsdCkmJihlPSEwKTtlbHNlIGU9dGhpcy5faW5pdFByb3BzKHRoaXMudGFyZ2V0LHRoaXMuX3Byb3BMb29rdXAsdGhpcy5fc2libGluZ3MsbywwKTtpZihlJiZELl9vblBsdWdpbkV2ZW50KCJfb25Jbml0QWxsUHJvcHMiLHRoaXMpLG8mJih0aGlzLl9maXJzdFBUfHwiZnVuY3Rpb24iIT10eXBlb2YgdGhpcy50YXJnZXQmJnRoaXMuX2VuYWJsZWQoITEsITEpKSxhLnJ1bkJhY2t3YXJkcylmb3IoaT10aGlzLl9maXJzdFBUO2k7KWkucys9aS5jLGkuYz0taS5jLGk9aS5fbmV4dDt0aGlzLl9vblVwZGF0ZT1hLm9uVXBkYXRlLHRoaXMuX2luaXR0ZWQ9ITB9LG8uX2luaXRQcm9wcz1mdW5jdGlvbihlLGkscixzLG4pe3ZhciBhLG8sbCxoLHUsXztpZihudWxsPT1lKXJldHVybiExO2ZvcihhIGluIEZbZS5fZ3NUd2VlbklEXSYmWigpLHRoaXMudmFycy5jc3N8fGUuc3R5bGUmJmUhPT10JiZlLm5vZGVUeXBlJiZqLmNzcyYmITEhPT10aGlzLnZhcnMuYXV0b0NTUyYmZnVuY3Rpb24odCxlKXt2YXIgaSxyPXt9O2ZvcihpIGluIHQpVltpXXx8aSBpbiBlJiYidHJhbnNmb3JtIiE9PWkmJiJ4IiE9PWkmJiJ5IiE9PWkmJiJ3aWR0aCIhPT1pJiYiaGVpZ2h0IiE9PWkmJiJjbGFzc05hbWUiIT09aSYmImJvcmRlciIhPT1pfHwhKCFqW2ldfHxqW2ldJiZqW2ldLl9hdXRvQ1NTKXx8KHJbaV09dFtpXSxkZWxldGUgdFtpXSk7dC5jc3M9cn0odGhpcy52YXJzLGUpLHRoaXMudmFycylpZihfPXRoaXMudmFyc1thXSxWW2FdKV8mJihfIGluc3RhbmNlb2YgQXJyYXl8fF8ucHVzaCYmcChfKSkmJi0xIT09Xy5qb2luKCIiKS5pbmRleE9mKCJ7c2VsZn0iKSYmKHRoaXMudmFyc1thXT1fPXRoaXMuX3N3YXBTZWxmSW5QYXJhbXMoXyx0aGlzKSk7ZWxzZSBpZihqW2FdJiYoaD1uZXcgalthXSkuX29uSW5pdFR3ZWVuKGUsdGhpcy52YXJzW2FdLHRoaXMsbikpe2Zvcih0aGlzLl9maXJzdFBUPXU9e19uZXh0OnRoaXMuX2ZpcnN0UFQsdDpoLHA6InNldFJhdGlvIixzOjAsYzoxLGY6MSxuOmEscGc6MSxwcjpoLl9wcmlvcml0eSxtOjB9LG89aC5fb3ZlcndyaXRlUHJvcHMubGVuZ3RoOy0tbz4tMTspaVtoLl9vdmVyd3JpdGVQcm9wc1tvXV09dGhpcy5fZmlyc3RQVDsoaC5fcHJpb3JpdHl8fGguX29uSW5pdEFsbFByb3BzKSYmKGw9ITApLChoLl9vbkRpc2FibGV8fGguX29uRW5hYmxlKSYmKHRoaXMuX25vdGlmeVBsdWdpbnNPZkVuYWJsZWQ9ITApLHUuX25leHQmJih1Ll9uZXh0Ll9wcmV2PXUpfWVsc2UgaVthXT1YLmNhbGwodGhpcyxlLGEsImdldCIsXyxhLDAsbnVsbCx0aGlzLnZhcnMuc3RyaW5nRmlsdGVyLG4pO3JldHVybiBzJiZ0aGlzLl9raWxsKHMsZSk/dGhpcy5faW5pdFByb3BzKGUsaSxyLHMsbik6dGhpcy5fb3ZlcndyaXRlPjEmJnRoaXMuX2ZpcnN0UFQmJnIubGVuZ3RoPjEmJksoZSx0aGlzLGksdGhpcy5fb3ZlcndyaXRlLHIpPyh0aGlzLl9raWxsKGksZSksdGhpcy5faW5pdFByb3BzKGUsaSxyLHMsbikpOih0aGlzLl9maXJzdFBUJiYoITEhPT10aGlzLnZhcnMubGF6eSYmdGhpcy5fZHVyYXRpb258fHRoaXMudmFycy5sYXp5JiYhdGhpcy5fZHVyYXRpb24pJiYoRltlLl9nc1R3ZWVuSURdPSEwKSxsKX0sby5yZW5kZXI9ZnVuY3Rpb24odCxlLGkpe3ZhciByLHMsbixhLG89dGhpcy5fdGltZSxsPXRoaXMuX2R1cmF0aW9uLGg9dGhpcy5fcmF3UHJldlRpbWU7aWYodD49bC0xZS03JiZ0Pj0wKXRoaXMuX3RvdGFsVGltZT10aGlzLl90aW1lPWwsdGhpcy5yYXRpbz10aGlzLl9lYXNlLl9jYWxjRW5kP3RoaXMuX2Vhc2UuZ2V0UmF0aW8oMSk6MSx0aGlzLl9yZXZlcnNlZHx8KHI9ITAscz0ib25Db21wbGV0ZSIsaT1pfHx0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4pLDA9PT1sJiYodGhpcy5faW5pdHRlZHx8IXRoaXMudmFycy5sYXp5fHxpKSYmKHRoaXMuX3N0YXJ0VGltZT09PXRoaXMuX3RpbWVsaW5lLl9kdXJhdGlvbiYmKHQ9MCksKGg8MHx8dDw9MCYmdD49LTFlLTd8fDFlLTEwPT09aCYmImlzUGF1c2UiIT09dGhpcy5kYXRhKSYmaCE9PXQmJihpPSEwLGg+MWUtMTAmJihzPSJvblJldmVyc2VDb21wbGV0ZSIpKSx0aGlzLl9yYXdQcmV2VGltZT1hPSFlfHx0fHxoPT09dD90OjFlLTEwKTtlbHNlIGlmKHQ8MWUtNyl0aGlzLl90b3RhbFRpbWU9dGhpcy5fdGltZT0wLHRoaXMucmF0aW89dGhpcy5fZWFzZS5fY2FsY0VuZD90aGlzLl9lYXNlLmdldFJhdGlvKDApOjAsKDAhPT1vfHwwPT09bCYmaD4wKSYmKHM9Im9uUmV2ZXJzZUNvbXBsZXRlIixyPXRoaXMuX3JldmVyc2VkKSx0PDAmJih0aGlzLl9hY3RpdmU9ITEsMD09PWwmJih0aGlzLl9pbml0dGVkfHwhdGhpcy52YXJzLmxhenl8fGkpJiYoaD49MCYmKDFlLTEwIT09aHx8ImlzUGF1c2UiIT09dGhpcy5kYXRhKSYmKGk9ITApLHRoaXMuX3Jhd1ByZXZUaW1lPWE9IWV8fHR8fGg9PT10P3Q6MWUtMTApKSwoIXRoaXMuX2luaXR0ZWR8fHRoaXMuX3N0YXJ0QXQmJnRoaXMuX3N0YXJ0QXQucHJvZ3Jlc3MoKSkmJihpPSEwKTtlbHNlIGlmKHRoaXMuX3RvdGFsVGltZT10aGlzLl90aW1lPXQsdGhpcy5fZWFzZVR5cGUpe3ZhciB1PXQvbCxfPXRoaXMuX2Vhc2VUeXBlLGM9dGhpcy5fZWFzZVBvd2VyOygxPT09X3x8Mz09PV8mJnU+PS41KSYmKHU9MS11KSwzPT09XyYmKHUqPTIpLDE9PT1jP3UqPXU6Mj09PWM/dSo9dSp1OjM9PT1jP3UqPXUqdSp1OjQ9PT1jJiYodSo9dSp1KnUqdSksdGhpcy5yYXRpbz0xPT09Xz8xLXU6Mj09PV8/dTp0L2w8LjU/dS8yOjEtdS8yfWVsc2UgdGhpcy5yYXRpbz10aGlzLl9lYXNlLmdldFJhdGlvKHQvbCk7aWYodGhpcy5fdGltZSE9PW98fGkpe2lmKCF0aGlzLl9pbml0dGVkKXtpZih0aGlzLl9pbml0KCksIXRoaXMuX2luaXR0ZWR8fHRoaXMuX2djKXJldHVybjtpZighaSYmdGhpcy5fZmlyc3RQVCYmKCExIT09dGhpcy52YXJzLmxhenkmJnRoaXMuX2R1cmF0aW9ufHx0aGlzLnZhcnMubGF6eSYmIXRoaXMuX2R1cmF0aW9uKSlyZXR1cm4gdGhpcy5fdGltZT10aGlzLl90b3RhbFRpbWU9byx0aGlzLl9yYXdQcmV2VGltZT1oLEUucHVzaCh0aGlzKSx2b2lkKHRoaXMuX2xhenk9W3QsZV0pO3RoaXMuX3RpbWUmJiFyP3RoaXMucmF0aW89dGhpcy5fZWFzZS5nZXRSYXRpbyh0aGlzLl90aW1lL2wpOnImJnRoaXMuX2Vhc2UuX2NhbGNFbmQmJih0aGlzLnJhdGlvPXRoaXMuX2Vhc2UuZ2V0UmF0aW8oMD09PXRoaXMuX3RpbWU/MDoxKSl9Zm9yKCExIT09dGhpcy5fbGF6eSYmKHRoaXMuX2xhenk9ITEpLHRoaXMuX2FjdGl2ZXx8IXRoaXMuX3BhdXNlZCYmdGhpcy5fdGltZSE9PW8mJnQ+PTAmJih0aGlzLl9hY3RpdmU9ITApLDA9PT1vJiYodGhpcy5fc3RhcnRBdCYmKHQ+PTA/dGhpcy5fc3RhcnRBdC5yZW5kZXIodCwhMCxpKTpzfHwocz0iX2R1bW15R1MiKSksdGhpcy52YXJzLm9uU3RhcnQmJigwPT09dGhpcy5fdGltZSYmMCE9PWx8fGV8fHRoaXMuX2NhbGxiYWNrKCJvblN0YXJ0IikpKSxuPXRoaXMuX2ZpcnN0UFQ7bjspbi5mP24udFtuLnBdKG4uYyp0aGlzLnJhdGlvK24ucyk6bi50W24ucF09bi5jKnRoaXMucmF0aW8rbi5zLG49bi5fbmV4dDt0aGlzLl9vblVwZGF0ZSYmKHQ8MCYmdGhpcy5fc3RhcnRBdCYmLTFlLTQhPT10JiZ0aGlzLl9zdGFydEF0LnJlbmRlcih0LCEwLGkpLGV8fCh0aGlzLl90aW1lIT09b3x8cnx8aSkmJnRoaXMuX2NhbGxiYWNrKCJvblVwZGF0ZSIpKSxzJiYodGhpcy5fZ2MmJiFpfHwodDwwJiZ0aGlzLl9zdGFydEF0JiYhdGhpcy5fb25VcGRhdGUmJi0xZS00IT09dCYmdGhpcy5fc3RhcnRBdC5yZW5kZXIodCwhMCxpKSxyJiYodGhpcy5fdGltZWxpbmUuYXV0b1JlbW92ZUNoaWxkcmVuJiZ0aGlzLl9lbmFibGVkKCExLCExKSx0aGlzLl9hY3RpdmU9ITEpLCFlJiZ0aGlzLnZhcnNbc10mJnRoaXMuX2NhbGxiYWNrKHMpLDA9PT1sJiYxZS0xMD09PXRoaXMuX3Jhd1ByZXZUaW1lJiYxZS0xMCE9PWEmJih0aGlzLl9yYXdQcmV2VGltZT0wKSkpfX0sby5fa2lsbD1mdW5jdGlvbih0LGUsaSl7aWYoImFsbCI9PT10JiYodD1udWxsKSxudWxsPT10JiYobnVsbD09ZXx8ZT09PXRoaXMudGFyZ2V0KSlyZXR1cm4gdGhpcy5fbGF6eT0hMSx0aGlzLl9lbmFibGVkKCExLCExKTtlPSJzdHJpbmciIT10eXBlb2YgZT9lfHx0aGlzLl90YXJnZXRzfHx0aGlzLnRhcmdldDpELnNlbGVjdG9yKGUpfHxlO3ZhciByLHMsbixhLG8sbCxoLHUsXyxjPWkmJnRoaXMuX3RpbWUmJmkuX3N0YXJ0VGltZT09PXRoaXMuX3N0YXJ0VGltZSYmdGhpcy5fdGltZWxpbmU9PT1pLl90aW1lbGluZSxmPXRoaXMuX2ZpcnN0UFQ7aWYoKHAoZSl8fE0oZSkpJiYibnVtYmVyIiE9dHlwZW9mIGVbMF0pZm9yKHI9ZS5sZW5ndGg7LS1yPi0xOyl0aGlzLl9raWxsKHQsZVtyXSxpKSYmKGw9ITApO2Vsc2V7aWYodGhpcy5fdGFyZ2V0cyl7Zm9yKHI9dGhpcy5fdGFyZ2V0cy5sZW5ndGg7LS1yPi0xOylpZihlPT09dGhpcy5fdGFyZ2V0c1tyXSl7bz10aGlzLl9wcm9wTG9va3VwW3JdfHx7fSx0aGlzLl9vdmVyd3JpdHRlblByb3BzPXRoaXMuX292ZXJ3cml0dGVuUHJvcHN8fFtdLHM9dGhpcy5fb3ZlcndyaXR0ZW5Qcm9wc1tyXT10P3RoaXMuX292ZXJ3cml0dGVuUHJvcHNbcl18fHt9OiJhbGwiO2JyZWFrfX1lbHNle2lmKGUhPT10aGlzLnRhcmdldClyZXR1cm4hMTtvPXRoaXMuX3Byb3BMb29rdXAscz10aGlzLl9vdmVyd3JpdHRlblByb3BzPXQ/dGhpcy5fb3ZlcndyaXR0ZW5Qcm9wc3x8e306ImFsbCJ9aWYobyl7aWYoaD10fHxvLHU9dCE9PXMmJiJhbGwiIT09cyYmdCE9PW8mJigib2JqZWN0IiE9dHlwZW9mIHR8fCF0Ll90ZW1wS2lsbCksaSYmKEQub25PdmVyd3JpdGV8fHRoaXMudmFycy5vbk92ZXJ3cml0ZSkpe2ZvcihuIGluIGgpb1tuXSYmKF98fChfPVtdKSxfLnB1c2gobikpO2lmKChffHwhdCkmJiFRKHRoaXMsaSxlLF8pKXJldHVybiExfWZvcihuIGluIGgpKGE9b1tuXSkmJihjJiYoYS5mP2EudFthLnBdKGEucyk6YS50W2EucF09YS5zLGw9ITApLGEucGcmJmEudC5fa2lsbChoKSYmKGw9ITApLGEucGcmJjAhPT1hLnQuX292ZXJ3cml0ZVByb3BzLmxlbmd0aHx8KGEuX3ByZXY/YS5fcHJldi5fbmV4dD1hLl9uZXh0OmE9PT10aGlzLl9maXJzdFBUJiYodGhpcy5fZmlyc3RQVD1hLl9uZXh0KSxhLl9uZXh0JiYoYS5fbmV4dC5fcHJldj1hLl9wcmV2KSxhLl9uZXh0PWEuX3ByZXY9bnVsbCksZGVsZXRlIG9bbl0pLHUmJihzW25dPTEpOyF0aGlzLl9maXJzdFBUJiZ0aGlzLl9pbml0dGVkJiZmJiZ0aGlzLl9lbmFibGVkKCExLCExKX19cmV0dXJuIGx9LG8uaW52YWxpZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub3RpZnlQbHVnaW5zT2ZFbmFibGVkJiZELl9vblBsdWdpbkV2ZW50KCJfb25EaXNhYmxlIix0aGlzKSx0aGlzLl9maXJzdFBUPXRoaXMuX292ZXJ3cml0dGVuUHJvcHM9dGhpcy5fc3RhcnRBdD10aGlzLl9vblVwZGF0ZT1udWxsLHRoaXMuX25vdGlmeVBsdWdpbnNPZkVuYWJsZWQ9dGhpcy5fYWN0aXZlPXRoaXMuX2xhenk9ITEsdGhpcy5fcHJvcExvb2t1cD10aGlzLl90YXJnZXRzP3t9OltdLE8ucHJvdG90eXBlLmludmFsaWRhdGUuY2FsbCh0aGlzKSx0aGlzLnZhcnMuaW1tZWRpYXRlUmVuZGVyJiYodGhpcy5fdGltZT0tMWUtMTAsdGhpcy5yZW5kZXIoTWF0aC5taW4oMCwtdGhpcy5fZGVsYXkpKSksdGhpc30sby5fZW5hYmxlZD1mdW5jdGlvbih0LGUpe2lmKGh8fGwud2FrZSgpLHQmJnRoaXMuX2djKXt2YXIgaSxyPXRoaXMuX3RhcmdldHM7aWYocilmb3IoaT1yLmxlbmd0aDstLWk+LTE7KXRoaXMuX3NpYmxpbmdzW2ldPSQocltpXSx0aGlzLCEwKTtlbHNlIHRoaXMuX3NpYmxpbmdzPSQodGhpcy50YXJnZXQsdGhpcywhMCl9cmV0dXJuIE8ucHJvdG90eXBlLl9lbmFibGVkLmNhbGwodGhpcyx0LGUpLCEoIXRoaXMuX25vdGlmeVBsdWdpbnNPZkVuYWJsZWR8fCF0aGlzLl9maXJzdFBUKSYmRC5fb25QbHVnaW5FdmVudCh0PyJfb25FbmFibGUiOiJfb25EaXNhYmxlIix0aGlzKX0sRC50bz1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIG5ldyBEKHQsZSxpKX0sRC5mcm9tPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gaS5ydW5CYWNrd2FyZHM9ITAsaS5pbW1lZGlhdGVSZW5kZXI9MCE9aS5pbW1lZGlhdGVSZW5kZXIsbmV3IEQodCxlLGkpfSxELmZyb21Ubz1mdW5jdGlvbih0LGUsaSxyKXtyZXR1cm4gci5zdGFydEF0PWksci5pbW1lZGlhdGVSZW5kZXI9MCE9ci5pbW1lZGlhdGVSZW5kZXImJjAhPWkuaW1tZWRpYXRlUmVuZGVyLG5ldyBEKHQsZSxyKX0sRC5kZWxheWVkQ2FsbD1mdW5jdGlvbih0LGUsaSxyLHMpe3JldHVybiBuZXcgRChlLDAse2RlbGF5OnQsb25Db21wbGV0ZTplLG9uQ29tcGxldGVQYXJhbXM6aSxjYWxsYmFja1Njb3BlOnIsb25SZXZlcnNlQ29tcGxldGU6ZSxvblJldmVyc2VDb21wbGV0ZVBhcmFtczppLGltbWVkaWF0ZVJlbmRlcjohMSxsYXp5OiExLHVzZUZyYW1lczpzLG92ZXJ3cml0ZTowfSl9LEQuc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBEKHQsMCxlKX0sRC5nZXRUd2VlbnNPZj1mdW5jdGlvbih0LGUpe2lmKG51bGw9PXQpcmV0dXJuW107dmFyIGkscixzLG47aWYodD0ic3RyaW5nIiE9dHlwZW9mIHQ/dDpELnNlbGVjdG9yKHQpfHx0LChwKHQpfHxNKHQpKSYmIm51bWJlciIhPXR5cGVvZiB0WzBdKXtmb3IoaT10Lmxlbmd0aCxyPVtdOy0taT4tMTspcj1yLmNvbmNhdChELmdldFR3ZWVuc09mKHRbaV0sZSkpO2ZvcihpPXIubGVuZ3RoOy0taT4tMTspZm9yKG49cltpXSxzPWk7LS1zPi0xOyluPT09cltzXSYmci5zcGxpY2UoaSwxKX1lbHNlIGlmKHQuX2dzVHdlZW5JRClmb3IoaT0ocj0kKHQpLmNvbmNhdCgpKS5sZW5ndGg7LS1pPi0xOykocltpXS5fZ2N8fGUmJiFyW2ldLmlzQWN0aXZlKCkpJiZyLnNwbGljZShpLDEpO3JldHVybiByfHxbXX0sRC5raWxsVHdlZW5zT2Y9RC5raWxsRGVsYXllZENhbGxzVG89ZnVuY3Rpb24odCxlLGkpeyJvYmplY3QiPT10eXBlb2YgZSYmKGk9ZSxlPSExKTtmb3IodmFyIHI9RC5nZXRUd2VlbnNPZih0LGUpLHM9ci5sZW5ndGg7LS1zPi0xOylyW3NdLl9raWxsKGksdCl9O3ZhciB0dD12KCJwbHVnaW5zLlR3ZWVuUGx1Z2luIixmdW5jdGlvbih0LGUpe3RoaXMuX292ZXJ3cml0ZVByb3BzPSh0fHwiIikuc3BsaXQoIiwiKSx0aGlzLl9wcm9wTmFtZT10aGlzLl9vdmVyd3JpdGVQcm9wc1swXSx0aGlzLl9wcmlvcml0eT1lfHwwLHRoaXMuX3N1cGVyPXR0LnByb3RvdHlwZX0sITApO2lmKG89dHQucHJvdG90eXBlLHR0LnZlcnNpb249IjEuMTkuMCIsdHQuQVBJPTIsby5fZmlyc3RQVD1udWxsLG8uX2FkZFR3ZWVuPVgsby5zZXRSYXRpbz1MLG8uX2tpbGw9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLl9vdmVyd3JpdGVQcm9wcyxyPXRoaXMuX2ZpcnN0UFQ7aWYobnVsbCE9dFt0aGlzLl9wcm9wTmFtZV0pdGhpcy5fb3ZlcndyaXRlUHJvcHM9W107ZWxzZSBmb3IoZT1pLmxlbmd0aDstLWU+LTE7KW51bGwhPXRbaVtlXV0mJmkuc3BsaWNlKGUsMSk7Zm9yKDtyOyludWxsIT10W3Iubl0mJihyLl9uZXh0JiYoci5fbmV4dC5fcHJldj1yLl9wcmV2KSxyLl9wcmV2PyhyLl9wcmV2Ll9uZXh0PXIuX25leHQsci5fcHJldj1udWxsKTp0aGlzLl9maXJzdFBUPT09ciYmKHRoaXMuX2ZpcnN0UFQ9ci5fbmV4dCkpLHI9ci5fbmV4dDtyZXR1cm4hMX0sby5fbW9kPW8uX3JvdW5kUHJvcHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9dGhpcy5fZmlyc3RQVDtpOykoZT10W3RoaXMuX3Byb3BOYW1lXXx8bnVsbCE9aS5uJiZ0W2kubi5zcGxpdCh0aGlzLl9wcm9wTmFtZSsiXyIpLmpvaW4oIiIpXSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYoMj09PWkuZj9pLnQuX2FwcGx5UFQubT1lOmkubT1lKSxpPWkuX25leHR9LEQuX29uUGx1Z2luRXZlbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaSxyLHMsbixhLG89ZS5fZmlyc3RQVDtpZigiX29uSW5pdEFsbFByb3BzIj09PXQpe2Zvcig7bzspe2ZvcihhPW8uX25leHQscj1zO3ImJnIucHI+by5wcjspcj1yLl9uZXh0OyhvLl9wcmV2PXI/ci5fcHJldjpuKT9vLl9wcmV2Ll9uZXh0PW86cz1vLChvLl9uZXh0PXIpP3IuX3ByZXY9bzpuPW8sbz1hfW89ZS5fZmlyc3RQVD1zfWZvcig7bzspby5wZyYmImZ1bmN0aW9uIj09dHlwZW9mIG8udFt0XSYmby50W3RdKCkmJihpPSEwKSxvPW8uX25leHQ7cmV0dXJuIGl9LHR0LmFjdGl2YXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDstLWU+LTE7KXRbZV0uQVBJPT09dHQuQVBJJiYoalsobmV3IHRbZV0pLl9wcm9wTmFtZV09dFtlXSk7cmV0dXJuITB9LGcucGx1Z2luPWZ1bmN0aW9uKHQpe2lmKCEodCYmdC5wcm9wTmFtZSYmdC5pbml0JiZ0LkFQSSkpdGhyb3ciaWxsZWdhbCBwbHVnaW4gZGVmaW5pdGlvbi4iO3ZhciBlLGk9dC5wcm9wTmFtZSxyPXQucHJpb3JpdHl8fDAscz10Lm92ZXJ3cml0ZVByb3BzLG49e2luaXQ6Il9vbkluaXRUd2VlbiIsc2V0OiJzZXRSYXRpbyIsa2lsbDoiX2tpbGwiLHJvdW5kOiJfbW9kIixtb2Q6Il9tb2QiLGluaXRBbGw6Il9vbkluaXRBbGxQcm9wcyJ9LGE9digicGx1Z2lucy4iK2kuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkraS5zdWJzdHIoMSkrIlBsdWdpbiIsZnVuY3Rpb24oKXt0dC5jYWxsKHRoaXMsaSxyKSx0aGlzLl9vdmVyd3JpdGVQcm9wcz1zfHxbXX0sITA9PT10Lmdsb2JhbCksbz1hLnByb3RvdHlwZT1uZXcgdHQoaSk7Zm9yKGUgaW4gby5jb25zdHJ1Y3Rvcj1hLGEuQVBJPXQuQVBJLG4pImZ1bmN0aW9uIj09dHlwZW9mIHRbZV0mJihvW25bZV1dPXRbZV0pO3JldHVybiBhLnZlcnNpb249dC52ZXJzaW9uLHR0LmFjdGl2YXRlKFthXSksYX0sbj10Ll9nc1F1ZXVlKXtmb3IoYT0wO2E8bi5sZW5ndGg7YSsrKW5bYV0oKTtmb3IobyBpbiBkKWRbb10uZnVuY3x8dC5jb25zb2xlLmxvZygiR1NBUCBlbmNvdW50ZXJlZCBtaXNzaW5nIGRlcGVuZGVuY3k6ICIrbyl9cmV0dXJuIGg9ITEsRH0ocyksYT1zLkdyZWVuU29ja0dsb2JhbHMsbz1hLmNvbS5ncmVlbnNvY2ssbD1vLmNvcmUuU2ltcGxlVGltZWxpbmUsaD1vLmNvcmUuQW5pbWF0aW9uLHU9YS5FYXNlLF89YS5MaW5lYXIsYz1fLGY9YS5Qb3dlcjEscD1hLlBvd2VyMixkPWEuUG93ZXIzLG09YS5Qb3dlcjQsZz1hLlR3ZWVuUGx1Z2luO28uZXZlbnRzLkV2ZW50RGlzcGF0Y2hlcn0pLmNhbGwodGhpcyxpKDUpKHQpLGkoMSkpfSxmdW5jdGlvbih0LGUpe3ZhciBpO2k9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7aT1pfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfHwoMCxldmFsKSgidGhpcyIpfWNhdGNoKHQpeyJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYoaT13aW5kb3cpfXQuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsaSl7dmFyIHIsczsNCi8qIQ0KICogU2Nyb2xsTWFnaWMgdjIuMC42ICgyMDE4LTEwLTA4KQ0KICogVGhlIGphdmFzY3JpcHQgbGlicmFyeSBmb3IgbWFnaWNhbCBzY3JvbGwgaW50ZXJhY3Rpb25zLg0KICogKGMpIDIwMTggSmFuIFBhZXBrZSAoQGphbnBhZXBrZSkNCiAqIFByb2plY3QgV2Vic2l0ZTogaHR0cDovL3Njcm9sbG1hZ2ljLmlvDQogKiANCiAqIEB2ZXJzaW9uIDIuMC42DQogKiBAbGljZW5zZSBEdWFsIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlIGFuZCBHUEwuDQogKiBAYXV0aG9yIEphbiBQYWVwa2UgLSBlLW1haWxAamFucGFlcGtlLmRlDQogKg0KICogQGZpbGUgU2Nyb2xsTWFnaWMgbWFpbiBsaWJyYXJ5Lg0KICovdm9pZCAwPT09KHM9ImZ1bmN0aW9uIj09dHlwZW9mKHI9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIHQ9ZnVuY3Rpb24oKXtyLmxvZygyLCIoQ09NUEFUSUJJTElUWSBOT1RJQ0UpIC0+IEFzIG9mIFNjcm9sbE1hZ2ljIDIuMC4wIHlvdSBuZWVkIHRvIHVzZSAnbmV3IFNjcm9sbE1hZ2ljLkNvbnRyb2xsZXIoKScgdG8gY3JlYXRlIGEgbmV3IGNvbnRyb2xsZXIgaW5zdGFuY2UuIFVzZSAnbmV3IFNjcm9sbE1hZ2ljLlNjZW5lKCknIHRvIGluc3RhbmNlIGEgc2NlbmUuIil9O3QudmVyc2lvbj0iMi4wLjYiLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXdoZWVsIixmdW5jdGlvbigpe30pLHQuQ29udHJvbGxlcj1mdW5jdGlvbihpKXt2YXIgcyxuLGE9IlNjcm9sbE1hZ2ljLkNvbnRyb2xsZXIiLG89ZS5kZWZhdWx0cyxsPXRoaXMsaD1yLmV4dGVuZCh7fSxvLGkpLHU9W10sXz0hMSxjPTAsZj0iUEFVU0VEIixwPSEwLGQ9MCxtPSEwLGc9ZnVuY3Rpb24oKXtoLnJlZnJlc2hJbnRlcnZhbD4wJiYobj13aW5kb3cuc2V0VGltZW91dChQLGgucmVmcmVzaEludGVydmFsKSl9LHY9ZnVuY3Rpb24oKXtyZXR1cm4gaC52ZXJ0aWNhbD9yLmdldC5zY3JvbGxUb3AoaC5jb250YWluZXIpOnIuZ2V0LnNjcm9sbExlZnQoaC5jb250YWluZXIpfSx5PWZ1bmN0aW9uKCl7cmV0dXJuIGgudmVydGljYWw/ci5nZXQuaGVpZ2h0KGguY29udGFpbmVyKTpyLmdldC53aWR0aChoLmNvbnRhaW5lcil9LFQ9dGhpcy5fc2V0U2Nyb2xsUG9zPWZ1bmN0aW9uKHQpe2gudmVydGljYWw/cD93aW5kb3cuc2Nyb2xsVG8oci5nZXQuc2Nyb2xsTGVmdCgpLHQpOmguY29udGFpbmVyLnNjcm9sbFRvcD10OnA/d2luZG93LnNjcm9sbFRvKHQsci5nZXQuc2Nyb2xsVG9wKCkpOmguY29udGFpbmVyLnNjcm9sbExlZnQ9dH0sdz1mdW5jdGlvbigpe2lmKG0mJl8pe3ZhciB0PXIudHlwZS5BcnJheShfKT9fOnUuc2xpY2UoMCk7Xz0hMTt2YXIgZT1jLGk9KGM9bC5zY3JvbGxQb3MoKSktZTswIT09aSYmKGY9aT4wPyJGT1JXQVJEIjoiUkVWRVJTRSIpLCJSRVZFUlNFIj09PWYmJnQucmV2ZXJzZSgpLHQuZm9yRWFjaChmdW5jdGlvbihlLGkpe1MoMywidXBkYXRpbmcgU2NlbmUgIisoaSsxKSsiLyIrdC5sZW5ndGgrIiAoIit1Lmxlbmd0aCsiIHRvdGFsKSIpLGUudXBkYXRlKCEwKX0pLDA9PT10Lmxlbmd0aCYmaC5sb2dsZXZlbD49MyYmUygzLCJ1cGRhdGluZyAwIFNjZW5lcyAobm90aGluZyBhZGRlZCB0byBjb250cm9sbGVyKSIpfX0seD1mdW5jdGlvbigpe3M9ci5yQUYodyl9LGI9ZnVuY3Rpb24odCl7UygzLCJldmVudCBmaXJlZCBjYXVzaW5nIGFuIHVwZGF0ZToiLHQudHlwZSksInJlc2l6ZSI9PXQudHlwZSYmKGQ9eSgpLGY9IlBBVVNFRCIpLCEwIT09XyYmKF89ITAseCgpKX0sUD1mdW5jdGlvbigpe2lmKCFwJiZkIT15KCkpe3ZhciB0O3RyeXt0PW5ldyBFdmVudCgicmVzaXplIix7YnViYmxlczohMSxjYW5jZWxhYmxlOiExfSl9Y2F0Y2goZSl7KHQ9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IikpLmluaXRFdmVudCgicmVzaXplIiwhMSwhMSl9aC5jb250YWluZXIuZGlzcGF0Y2hFdmVudCh0KX11LmZvckVhY2goZnVuY3Rpb24odCxlKXt0LnJlZnJlc2goKX0pLGcoKX0sUz10aGlzLl9sb2c9ZnVuY3Rpb24odCxlKXtoLmxvZ2xldmVsPj10JiYoQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGFyZ3VtZW50cywxLDAsIigiK2ErIikgLT4iKSxyLmxvZy5hcHBseSh3aW5kb3csYXJndW1lbnRzKSl9O3RoaXMuX29wdGlvbnM9aDt2YXIgaz1mdW5jdGlvbih0KXtpZih0Lmxlbmd0aDw9MSlyZXR1cm4gdDt2YXIgZT10LnNsaWNlKDApO3JldHVybiBlLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zY3JvbGxPZmZzZXQoKT5lLnNjcm9sbE9mZnNldCgpPzE6LTF9KSxlfTtyZXR1cm4gdGhpcy5hZGRTY2VuZT1mdW5jdGlvbihlKXtpZihyLnR5cGUuQXJyYXkoZSkpZS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7bC5hZGRTY2VuZSh0KX0pO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIHQuU2NlbmUpe2lmKGUuY29udHJvbGxlcigpIT09bCllLmFkZFRvKGwpO2Vsc2UgaWYodS5pbmRleE9mKGUpPDApe2Zvcih2YXIgaSBpbiB1LnB1c2goZSksdT1rKHUpLGUub24oInNoaWZ0LmNvbnRyb2xsZXJfc29ydCIsZnVuY3Rpb24oKXt1PWsodSl9KSxoLmdsb2JhbFNjZW5lT3B0aW9ucyllW2ldJiZlW2ldLmNhbGwoZSxoLmdsb2JhbFNjZW5lT3B0aW9uc1tpXSk7UygzLCJhZGRpbmcgU2NlbmUgKG5vdyAiK3UubGVuZ3RoKyIgdG90YWwpIil9fWVsc2UgUygxLCJFUlJPUjogaW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCBmb3IgJy5hZGRTY2VuZSgpJyIpO3JldHVybiBsfSx0aGlzLnJlbW92ZVNjZW5lPWZ1bmN0aW9uKHQpe2lmKHIudHlwZS5BcnJheSh0KSl0LmZvckVhY2goZnVuY3Rpb24odCxlKXtsLnJlbW92ZVNjZW5lKHQpfSk7ZWxzZXt2YXIgZT11LmluZGV4T2YodCk7ZT4tMSYmKHQub2ZmKCJzaGlmdC5jb250cm9sbGVyX3NvcnQiKSx1LnNwbGljZShlLDEpLFMoMywicmVtb3ZpbmcgU2NlbmUgKG5vdyAiK3UubGVuZ3RoKyIgbGVmdCkiKSx0LnJlbW92ZSgpKX1yZXR1cm4gbH0sdGhpcy51cGRhdGVTY2VuZT1mdW5jdGlvbihlLGkpe3JldHVybiByLnR5cGUuQXJyYXkoZSk/ZS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7bC51cGRhdGVTY2VuZSh0LGkpfSk6aT9lLnVwZGF0ZSghMCk6ITAhPT1fJiZlIGluc3RhbmNlb2YgdC5TY2VuZSYmKC0xPT0oXz1ffHxbXSkuaW5kZXhPZihlKSYmXy5wdXNoKGUpLF89ayhfKSx4KCkpLGx9LHRoaXMudXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBiKHt0eXBlOiJyZXNpemUifSksdCYmdygpLGx9LHRoaXMuc2Nyb2xsVG89ZnVuY3Rpb24oZSxpKXtpZihyLnR5cGUuTnVtYmVyKGUpKVQuY2FsbChoLmNvbnRhaW5lcixlLGkpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIHQuU2NlbmUpZS5jb250cm9sbGVyKCk9PT1sP2wuc2Nyb2xsVG8oZS5zY3JvbGxPZmZzZXQoKSxpKTpTKDIsInNjcm9sbFRvKCk6IFRoZSBzdXBwbGllZCBzY2VuZSBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBjb250cm9sbGVyLiBTY3JvbGwgY2FuY2VsbGVkLiIsZSk7ZWxzZSBpZihyLnR5cGUuRnVuY3Rpb24oZSkpVD1lO2Vsc2V7dmFyIHM9ci5nZXQuZWxlbWVudHMoZSlbMF07aWYocyl7Zm9yKDtzLnBhcmVudE5vZGUuaGFzQXR0cmlidXRlKCJkYXRhLXNjcm9sbG1hZ2ljLXBpbi1zcGFjZXIiKTspcz1zLnBhcmVudE5vZGU7dmFyIG49aC52ZXJ0aWNhbD8idG9wIjoibGVmdCIsYT1yLmdldC5vZmZzZXQoaC5jb250YWluZXIpLG89ci5nZXQub2Zmc2V0KHMpO3B8fChhW25dLT1sLnNjcm9sbFBvcygpKSxsLnNjcm9sbFRvKG9bbl0tYVtuXSxpKX1lbHNlIFMoMiwic2Nyb2xsVG8oKTogVGhlIHN1cHBsaWVkIGFyZ3VtZW50IGlzIGludmFsaWQuIFNjcm9sbCBjYW5jZWxsZWQuIixlKX1yZXR1cm4gbH0sdGhpcy5zY3JvbGxQb3M9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHIudHlwZS5GdW5jdGlvbih0KT92PXQ6UygyLCJQcm92aWRlZCB2YWx1ZSBmb3IgbWV0aG9kICdzY3JvbGxQb3MnIGlzIG5vdCBhIGZ1bmN0aW9uLiBUbyBjaGFuZ2UgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIHVzZSAnc2Nyb2xsVG8oKScuIiksbCk6di5jYWxsKGwpfSx0aGlzLmluZm89ZnVuY3Rpb24odCl7dmFyIGU9e3NpemU6ZCx2ZXJ0aWNhbDpoLnZlcnRpY2FsLHNjcm9sbFBvczpjLHNjcm9sbERpcmVjdGlvbjpmLGNvbnRhaW5lcjpoLmNvbnRhaW5lcixpc0RvY3VtZW50OnB9O3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3ZvaWQgMCE9PWVbdF0/ZVt0XTp2b2lkIFMoMSwnRVJST1I6IG9wdGlvbiAiJyt0KyciIGlzIG5vdCBhdmFpbGFibGUnKTplfSx0aGlzLmxvZ2xldmVsPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoLmxvZ2xldmVsIT10JiYoaC5sb2dsZXZlbD10KSxsKTpoLmxvZ2xldmVsfSx0aGlzLmVuYWJsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG0hPXQmJihtPSEhdCxsLnVwZGF0ZVNjZW5lKHUsITApKSxsKTptfSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24odCl7d2luZG93LmNsZWFyVGltZW91dChuKTtmb3IodmFyIGU9dS5sZW5ndGg7ZS0tOyl1W2VdLmRlc3Ryb3kodCk7cmV0dXJuIGguY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsYiksaC5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixiKSxyLmNBRihzKSxTKDMsImRlc3Ryb3llZCAiK2ErIiAocmVzZXQ6ICIrKHQ/InRydWUiOiJmYWxzZSIpKyIpIiksbnVsbH0sZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gaClvLmhhc093blByb3BlcnR5KGUpfHwoUygyLCdXQVJOSU5HOiBVbmtub3duIG9wdGlvbiAiJytlKyciJyksZGVsZXRlIGhbZV0pO2lmKGguY29udGFpbmVyPXIuZ2V0LmVsZW1lbnRzKGguY29udGFpbmVyKVswXSwhaC5jb250YWluZXIpdGhyb3cgUygxLCJFUlJPUiBjcmVhdGluZyBvYmplY3QgIithKyI6IE5vIHZhbGlkIHNjcm9sbCBjb250YWluZXIgc3VwcGxpZWQiKSxhKyIgaW5pdCBmYWlsZWQuIjsocD1oLmNvbnRhaW5lcj09PXdpbmRvd3x8aC5jb250YWluZXI9PT1kb2N1bWVudC5ib2R5fHwhZG9jdW1lbnQuYm9keS5jb250YWlucyhoLmNvbnRhaW5lcikpJiYoaC5jb250YWluZXI9d2luZG93KSxkPXkoKSxoLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGIpLGguY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsYik7dmFyIGk9cGFyc2VJbnQoaC5yZWZyZXNoSW50ZXJ2YWwsMTApO2gucmVmcmVzaEludGVydmFsPXIudHlwZS5OdW1iZXIoaSk/aTpvLnJlZnJlc2hJbnRlcnZhbCxnKCksUygzLCJhZGRlZCBuZXcgIithKyIgY29udHJvbGxlciAodiIrdC52ZXJzaW9uKyIpIil9KCksbH07dmFyIGU9e2RlZmF1bHRzOntjb250YWluZXI6d2luZG93LHZlcnRpY2FsOiEwLGdsb2JhbFNjZW5lT3B0aW9uczp7fSxsb2dsZXZlbDoyLHJlZnJlc2hJbnRlcnZhbDoxMDB9fTt0LkNvbnRyb2xsZXIuYWRkT3B0aW9uPWZ1bmN0aW9uKHQsaSl7ZS5kZWZhdWx0c1t0XT1pfSx0LkNvbnRyb2xsZXIuZXh0ZW5kPWZ1bmN0aW9uKGUpe3ZhciBpPXRoaXM7dC5Db250cm9sbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuJHN1cGVyPXIuZXh0ZW5kKHt9LHRoaXMpLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfSxyLmV4dGVuZCh0LkNvbnRyb2xsZXIsaSksdC5Db250cm9sbGVyLnByb3RvdHlwZT1pLnByb3RvdHlwZSx0LkNvbnRyb2xsZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQuQ29udHJvbGxlcn0sdC5TY2VuZT1mdW5jdGlvbihlKXt2YXIgcyxuLGE9IlNjcm9sbE1hZ2ljLlNjZW5lIixvPWkuZGVmYXVsdHMsbD10aGlzLGg9ci5leHRlbmQoe30sbyxlKSx1PSJCRUZPUkUiLF89MCxjPXtzdGFydDowLGVuZDowfSxmPTAscD0hMCxkPXt9O3RoaXMub249ZnVuY3Rpb24odCxlKXtyZXR1cm4gci50eXBlLkZ1bmN0aW9uKGUpPyh0PXQudHJpbSgpLnNwbGl0KCIgIikpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGk9dC5zcGxpdCgiLiIpLHI9aVswXSxzPWlbMV07IioiIT1yJiYoZFtyXXx8KGRbcl09W10pLGRbcl0ucHVzaCh7bmFtZXNwYWNlOnN8fCIiLGNhbGxiYWNrOmV9KSl9KTptKDEsIkVSUk9SIHdoZW4gY2FsbGluZyAnLm9uKCknOiBTdXBwbGllZCBjYWxsYmFjayBmb3IgJyIrdCsiJyBpcyBub3QgYSB2YWxpZCBmdW5jdGlvbiEiKSxsfSx0aGlzLm9mZj1mdW5jdGlvbih0LGUpe3JldHVybiB0PygodD10LnRyaW0oKS5zcGxpdCgiICIpKS5mb3JFYWNoKGZ1bmN0aW9uKHQsaSl7dmFyIHI9dC5zcGxpdCgiLiIpLHM9clswXSxuPXJbMV18fCIiLGE9IioiPT09cz9PYmplY3Qua2V5cyhkKTpbc107YS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgaT1kW3RdfHxbXSxyPWkubGVuZ3RoO3ItLTspe3ZhciBzPWlbcl07IXN8fG4hPT1zLm5hbWVzcGFjZSYmIioiIT09bnx8ZSYmZSE9cy5jYWxsYmFja3x8aS5zcGxpY2UociwxKX1pLmxlbmd0aHx8ZGVsZXRlIGRbdF19KX0pLGwpOihtKDEsIkVSUk9SOiBJbnZhbGlkIGV2ZW50IG5hbWUgc3VwcGxpZWQuIiksbCl9LHRoaXMudHJpZ2dlcj1mdW5jdGlvbihlLGkpe2lmKGUpe3ZhciByPWUudHJpbSgpLnNwbGl0KCIuIikscz1yWzBdLG49clsxXSxhPWRbc107bSgzLCJldmVudCBmaXJlZDoiLHMsaT8iLT4iOiIiLGl8fCIiKSxhJiZhLmZvckVhY2goZnVuY3Rpb24oZSxyKXtuJiZuIT09ZS5uYW1lc3BhY2V8fGUuY2FsbGJhY2suY2FsbChsLG5ldyB0LkV2ZW50KHMsZS5uYW1lc3BhY2UsbCxpKSl9KX1lbHNlIG0oMSwiRVJST1I6IEludmFsaWQgZXZlbnQgbmFtZSBzdXBwbGllZC4iKTtyZXR1cm4gbH0sbC5vbigiY2hhbmdlLmludGVybmFsIixmdW5jdGlvbih0KXsibG9nbGV2ZWwiIT09dC53aGF0JiYidHdlZW5DaGFuZ2VzIiE9PXQud2hhdCYmKCJ0cmlnZ2VyRWxlbWVudCI9PT10LndoYXQ/dygpOiJyZXZlcnNlIj09PXQud2hhdCYmbC51cGRhdGUoKSl9KS5vbigic2hpZnQuaW50ZXJuYWwiLGZ1bmN0aW9uKHQpe3koKSxsLnVwZGF0ZSgpfSk7dmFyIG09dGhpcy5fbG9nPWZ1bmN0aW9uKHQsZSl7aC5sb2dsZXZlbD49dCYmKEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhcmd1bWVudHMsMSwwLCIoIithKyIpIC0+Iiksci5sb2cuYXBwbHkod2luZG93LGFyZ3VtZW50cykpfTt0aGlzLmFkZFRvPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdC5Db250cm9sbGVyP24hPWUmJihuJiZuLnJlbW92ZVNjZW5lKGwpLG49ZSxQKCksVCghMCksdyghMCkseSgpLG4uaW5mbygiY29udGFpbmVyIikuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix4KSxlLmFkZFNjZW5lKGwpLGwudHJpZ2dlcigiYWRkIix7Y29udHJvbGxlcjpufSksbSgzLCJhZGRlZCAiK2ErIiB0byBjb250cm9sbGVyIiksbC51cGRhdGUoKSk6bSgxLCJFUlJPUjogc3VwcGxpZWQgYXJndW1lbnQgb2YgJ2FkZFRvKCknIGlzIG5vdCBhIHZhbGlkIFNjcm9sbE1hZ2ljIENvbnRyb2xsZXIiKSxsfSx0aGlzLmVuYWJsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHAhPXQmJihwPSEhdCxsLnVwZGF0ZSghMCkpLGwpOnB9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKCl7aWYobil7bi5pbmZvKCJjb250YWluZXIiKS5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLHgpO3ZhciB0PW47bj12b2lkIDAsdC5yZW1vdmVTY2VuZShsKSxsLnRyaWdnZXIoInJlbW92ZSIpLG0oMywicmVtb3ZlZCAiK2ErIiBmcm9tIGNvbnRyb2xsZXIiKX1yZXR1cm4gbH0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKHQpe3JldHVybiBsLnRyaWdnZXIoImRlc3Ryb3kiLHtyZXNldDp0fSksbC5yZW1vdmUoKSxsLm9mZigiKi4qIiksbSgzLCJkZXN0cm95ZWQgIithKyIgKHJlc2V0OiAiKyh0PyJ0cnVlIjoiZmFsc2UiKSsiKSIpLG51bGx9LHRoaXMudXBkYXRlPWZ1bmN0aW9uKHQpe2lmKG4paWYodClpZihuLmVuYWJsZWQoKSYmcCl7dmFyIGUsaT1uLmluZm8oInNjcm9sbFBvcyIpO2U9aC5kdXJhdGlvbj4wPyhpLWMuc3RhcnQpLyhjLmVuZC1jLnN0YXJ0KTppPj1jLnN0YXJ0PzE6MCxsLnRyaWdnZXIoInVwZGF0ZSIse3N0YXJ0UG9zOmMuc3RhcnQsZW5kUG9zOmMuZW5kLHNjcm9sbFBvczppfSksbC5wcm9ncmVzcyhlKX1lbHNlIGcmJiJEVVJJTkciPT09dSYmUighMCk7ZWxzZSBuLnVwZGF0ZVNjZW5lKGwsITEpO3JldHVybiBsfSx0aGlzLnJlZnJlc2g9ZnVuY3Rpb24oKXtyZXR1cm4gVCgpLHcoKSxsfSx0aGlzLnByb2dyZXNzPWZ1bmN0aW9uKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPSExLGk9dSxyPW4/bi5pbmZvKCJzY3JvbGxEaXJlY3Rpb24iKToiUEFVU0VEIixzPWgucmV2ZXJzZXx8dD49XztpZigwPT09aC5kdXJhdGlvbj8oZT1fIT10LHU9MD09KF89dDwxJiZzPzA6MSk/IkJFRk9SRSI6IkRVUklORyIpOnQ8MCYmIkJFRk9SRSIhPT11JiZzPyhfPTAsdT0iQkVGT1JFIixlPSEwKTp0Pj0wJiZ0PDEmJnM/KF89dCx1PSJEVVJJTkciLGU9ITApOnQ+PTEmJiJBRlRFUiIhPT11PyhfPTEsdT0iQUZURVIiLGU9ITApOiJEVVJJTkciIT09dXx8c3x8UigpLGUpe3ZhciBhPXtwcm9ncmVzczpfLHN0YXRlOnUsc2Nyb2xsRGlyZWN0aW9uOnJ9LG89dSE9aSxjPWZ1bmN0aW9uKHQpe2wudHJpZ2dlcih0LGEpfTtvJiYiRFVSSU5HIiE9PWkmJihjKCJlbnRlciIpLGMoIkJFRk9SRSI9PT1pPyJzdGFydCI6ImVuZCIpKSxjKCJwcm9ncmVzcyIpLG8mJiJEVVJJTkciIT09dSYmKGMoIkJFRk9SRSI9PT11PyJzdGFydCI6ImVuZCIpLGMoImxlYXZlIikpfXJldHVybiBsfXJldHVybiBffTt2YXIgZyx2LHk9ZnVuY3Rpb24oKXtjPXtzdGFydDpmK2gub2Zmc2V0fSxuJiZoLnRyaWdnZXJFbGVtZW50JiYoYy5zdGFydC09bi5pbmZvKCJzaXplIikqaC50cmlnZ2VySG9vayksYy5lbmQ9Yy5zdGFydCtoLmR1cmF0aW9ufSxUPWZ1bmN0aW9uKHQpe3MmJlMoImR1cmF0aW9uIixzLmNhbGwobCkpJiYhdCYmKGwudHJpZ2dlcigiY2hhbmdlIix7d2hhdDoiZHVyYXRpb24iLG5ld3ZhbDpoLmR1cmF0aW9ufSksbC50cmlnZ2VyKCJzaGlmdCIse3JlYXNvbjoiZHVyYXRpb24ifSkpfSx3PWZ1bmN0aW9uKHQpe3ZhciBlPTAsaT1oLnRyaWdnZXJFbGVtZW50O2lmKG4mJihpfHxmPjApKXtpZihpKWlmKGkucGFyZW50Tm9kZSl7Zm9yKHZhciBzPW4uaW5mbygpLGE9ci5nZXQub2Zmc2V0KHMuY29udGFpbmVyKSxvPXMudmVydGljYWw/InRvcCI6ImxlZnQiO2kucGFyZW50Tm9kZS5oYXNBdHRyaWJ1dGUoImRhdGEtc2Nyb2xsbWFnaWMtcGluLXNwYWNlciIpOylpPWkucGFyZW50Tm9kZTt2YXIgdT1yLmdldC5vZmZzZXQoaSk7cy5pc0RvY3VtZW50fHwoYVtvXS09bi5zY3JvbGxQb3MoKSksZT11W29dLWFbb119ZWxzZSBtKDIsIldBUk5JTkc6IHRyaWdnZXJFbGVtZW50IHdhcyByZW1vdmVkIGZyb20gRE9NIGFuZCB3aWxsIGJlIHJlc2V0IHRvIix2b2lkIDApLGwudHJpZ2dlckVsZW1lbnQodm9pZCAwKTt2YXIgXz1lIT1mO2Y9ZSxfJiYhdCYmbC50cmlnZ2VyKCJzaGlmdCIse3JlYXNvbjoidHJpZ2dlckVsZW1lbnRQb3NpdGlvbiJ9KX19LHg9ZnVuY3Rpb24odCl7aC50cmlnZ2VySG9vaz4wJiZsLnRyaWdnZXIoInNoaWZ0Iix7cmVhc29uOiJjb250YWluZXJSZXNpemUifSl9LGI9ci5leHRlbmQoaS52YWxpZGF0ZSx7ZHVyYXRpb246ZnVuY3Rpb24odCl7aWYoci50eXBlLlN0cmluZyh0KSYmdC5tYXRjaCgvXihcLnxcZCkqXGQrJSQvKSl7dmFyIGU9cGFyc2VGbG9hdCh0KS8xMDA7dD1mdW5jdGlvbigpe3JldHVybiBuP24uaW5mbygic2l6ZSIpKmU6MH19aWYoci50eXBlLkZ1bmN0aW9uKHQpKXtzPXQ7dHJ5e3Q9cGFyc2VGbG9hdChzKCkpfWNhdGNoKGUpe3Q9LTF9fWlmKHQ9cGFyc2VGbG9hdCh0KSwhci50eXBlLk51bWJlcih0KXx8dDwwKXRocm93IHM/KHM9dm9pZCAwLFsnSW52YWxpZCByZXR1cm4gdmFsdWUgb2Ygc3VwcGxpZWQgZnVuY3Rpb24gZm9yIG9wdGlvbiAiZHVyYXRpb24iOicsdF0pOlsnSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uICJkdXJhdGlvbiI6Jyx0XTtyZXR1cm4gdH19KSxQPWZ1bmN0aW9uKHQpeyh0PWFyZ3VtZW50cy5sZW5ndGg/W3RdOk9iamVjdC5rZXlzKGIpKS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIGk7aWYoYlt0XSl0cnl7aT1iW3RdKGhbdF0pfWNhdGNoKGUpe2k9b1t0XTt2YXIgcz1yLnR5cGUuU3RyaW5nKGUpP1tlXTplO3IudHlwZS5BcnJheShzKT8oc1swXT0iRVJST1I6ICIrc1swXSxzLnVuc2hpZnQoMSksbS5hcHBseSh0aGlzLHMpKTptKDEsIkVSUk9SOiBQcm9ibGVtIGV4ZWN1dGluZyB2YWxpZGF0aW9uIGNhbGxiYWNrIGZvciBvcHRpb24gJyIrdCsiJzoiLGUubWVzc2FnZSl9ZmluYWxseXtoW3RdPWl9fSl9LFM9ZnVuY3Rpb24odCxlKXt2YXIgaT0hMSxyPWhbdF07cmV0dXJuIGhbdF0hPWUmJihoW3RdPWUsUCh0KSxpPXIhPWhbdF0pLGl9LGs9ZnVuY3Rpb24odCl7bFt0XXx8KGxbdF09ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KCJkdXJhdGlvbiI9PT10JiYocz12b2lkIDApLFModCxlKSYmKGwudHJpZ2dlcigiY2hhbmdlIix7d2hhdDp0LG5ld3ZhbDpoW3RdfSksaS5zaGlmdHMuaW5kZXhPZih0KT4tMSYmbC50cmlnZ2VyKCJzaGlmdCIse3JlYXNvbjp0fSkpLGwpOmhbdF19KX07dGhpcy5jb250cm9sbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIG59LHRoaXMuc3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdX0sdGhpcy5zY3JvbGxPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gYy5zdGFydH0sdGhpcy50cmlnZ2VyUG9zaXRpb249ZnVuY3Rpb24oKXt2YXIgdD1oLm9mZnNldDtyZXR1cm4gbiYmKGgudHJpZ2dlckVsZW1lbnQ/dCs9Zjp0Kz1uLmluZm8oInNpemUiKSpsLnRyaWdnZXJIb29rKCkpLHR9LGwub24oInNoaWZ0LmludGVybmFsIixmdW5jdGlvbih0KXt2YXIgZT0iZHVyYXRpb24iPT09dC5yZWFzb247KCJBRlRFUiI9PT11JiZlfHwiRFVSSU5HIj09PXUmJjA9PT1oLmR1cmF0aW9uKSYmUigpLGUmJk8oKX0pLm9uKCJwcm9ncmVzcy5pbnRlcm5hbCIsZnVuY3Rpb24odCl7UigpfSkub24oImFkZC5pbnRlcm5hbCIsZnVuY3Rpb24odCl7TygpfSkub24oImRlc3Ryb3kuaW50ZXJuYWwiLGZ1bmN0aW9uKHQpe2wucmVtb3ZlUGluKHQucmVzZXQpfSk7dmFyIFI9ZnVuY3Rpb24odCl7aWYoZyYmbil7dmFyIGU9bi5pbmZvKCksaT12LnNwYWNlci5maXJzdENoaWxkO2lmKHR8fCJEVVJJTkciIT09dSl7dmFyIHM9e3Bvc2l0aW9uOnYuaW5GbG93PyJyZWxhdGl2ZSI6ImFic29sdXRlIix0b3A6MCxsZWZ0OjB9LGE9ci5jc3MoaSwicG9zaXRpb24iKSE9cy5wb3NpdGlvbjt2LnB1c2hGb2xsb3dlcnM/aC5kdXJhdGlvbj4wJiYoIkFGVEVSIj09PXUmJjA9PT1wYXJzZUZsb2F0KHIuY3NzKHYuc3BhY2VyLCJwYWRkaW5nLXRvcCIpKT9hPSEwOiJCRUZPUkUiPT09dSYmMD09PXBhcnNlRmxvYXQoci5jc3Modi5zcGFjZXIsInBhZGRpbmctYm90dG9tIikpJiYoYT0hMCkpOnNbZS52ZXJ0aWNhbD8idG9wIjoibGVmdCJdPWguZHVyYXRpb24qXyxyLmNzcyhpLHMpLGEmJk8oKX1lbHNleyJmaXhlZCIhPXIuY3NzKGksInBvc2l0aW9uIikmJihyLmNzcyhpLHtwb3NpdGlvbjoiZml4ZWQifSksTygpKTt2YXIgbz1yLmdldC5vZmZzZXQodi5zcGFjZXIsITApLGw9aC5yZXZlcnNlfHwwPT09aC5kdXJhdGlvbj9lLnNjcm9sbFBvcy1jLnN0YXJ0Ok1hdGgucm91bmQoXypoLmR1cmF0aW9uKjEwKS8xMDtvW2UudmVydGljYWw/InRvcCI6ImxlZnQiXSs9bCxyLmNzcyh2LnNwYWNlci5maXJzdENoaWxkLHt0b3A6by50b3AsbGVmdDpvLmxlZnR9KX19fSxPPWZ1bmN0aW9uKCl7aWYoZyYmbiYmdi5pbkZsb3cpe3ZhciB0PSJEVVJJTkciPT09dSxlPW4uaW5mbygidmVydGljYWwiKSxpPXYuc3BhY2VyLmZpcnN0Q2hpbGQscz1yLmlzTWFyZ2luQ29sbGFwc2VUeXBlKHIuY3NzKHYuc3BhY2VyLCJkaXNwbGF5IikpLGE9e307di5yZWxTaXplLndpZHRofHx2LnJlbFNpemUuYXV0b0Z1bGxXaWR0aD90P3IuY3NzKGcse3dpZHRoOnIuZ2V0LndpZHRoKHYuc3BhY2VyKX0pOnIuY3NzKGcse3dpZHRoOiIxMDAlIn0pOihhWyJtaW4td2lkdGgiXT1yLmdldC53aWR0aChlP2c6aSwhMCwhMCksYS53aWR0aD10P2FbIm1pbi13aWR0aCJdOiJhdXRvIiksdi5yZWxTaXplLmhlaWdodD90P3IuY3NzKGcse2hlaWdodDpyLmdldC5oZWlnaHQodi5zcGFjZXIpLSh2LnB1c2hGb2xsb3dlcnM/aC5kdXJhdGlvbjowKX0pOnIuY3NzKGcse2hlaWdodDoiMTAwJSJ9KTooYVsibWluLWhlaWdodCJdPXIuZ2V0LmhlaWdodChlP2k6ZywhMCwhcyksYS5oZWlnaHQ9dD9hWyJtaW4taGVpZ2h0Il06ImF1dG8iKSx2LnB1c2hGb2xsb3dlcnMmJihhWyJwYWRkaW5nIisoZT8iVG9wIjoiTGVmdCIpXT1oLmR1cmF0aW9uKl8sYVsicGFkZGluZyIrKGU/IkJvdHRvbSI6IlJpZ2h0IildPWguZHVyYXRpb24qKDEtXykpLHIuY3NzKHYuc3BhY2VyLGEpfX0sQT1mdW5jdGlvbigpe24mJmcmJiJEVVJJTkciPT09dSYmIW4uaW5mbygiaXNEb2N1bWVudCIpJiZSKCl9LEM9ZnVuY3Rpb24oKXtuJiZnJiYiRFVSSU5HIj09PXUmJigodi5yZWxTaXplLndpZHRofHx2LnJlbFNpemUuYXV0b0Z1bGxXaWR0aCkmJnIuZ2V0LndpZHRoKHdpbmRvdykhPXIuZ2V0LndpZHRoKHYuc3BhY2VyLnBhcmVudE5vZGUpfHx2LnJlbFNpemUuaGVpZ2h0JiZyLmdldC5oZWlnaHQod2luZG93KSE9ci5nZXQuaGVpZ2h0KHYuc3BhY2VyLnBhcmVudE5vZGUpKSYmTygpfSxEPWZ1bmN0aW9uKHQpe24mJmcmJiJEVVJJTkciPT09dSYmIW4uaW5mbygiaXNEb2N1bWVudCIpJiYodC5wcmV2ZW50RGVmYXVsdCgpLG4uX3NldFNjcm9sbFBvcyhuLmluZm8oInNjcm9sbFBvcyIpLSgodC53aGVlbERlbHRhfHx0W24uaW5mbygidmVydGljYWwiKT8id2hlZWxEZWx0YVkiOiJ3aGVlbERlbHRhWCJdKS8zfHwzMCotdC5kZXRhaWwpKSl9O3RoaXMuc2V0UGluPWZ1bmN0aW9uKHQsZSl7aWYoZT1yLmV4dGVuZCh7fSx7cHVzaEZvbGxvd2VyczohMCxzcGFjZXJDbGFzczoic2Nyb2xsbWFnaWMtcGluLXNwYWNlciJ9LGUpLCEodD1yLmdldC5lbGVtZW50cyh0KVswXSkpcmV0dXJuIG0oMSwiRVJST1IgY2FsbGluZyBtZXRob2QgJ3NldFBpbigpJzogSW52YWxpZCBwaW4gZWxlbWVudCBzdXBwbGllZC4iKSxsO2lmKCJmaXhlZCI9PT1yLmNzcyh0LCJwb3NpdGlvbiIpKXJldHVybiBtKDEsIkVSUk9SIGNhbGxpbmcgbWV0aG9kICdzZXRQaW4oKSc6IFBpbiBkb2VzIG5vdCB3b3JrIHdpdGggZWxlbWVudHMgdGhhdCBhcmUgcG9zaXRpb25lZCAnZml4ZWQnLiIpLGw7aWYoZyl7aWYoZz09PXQpcmV0dXJuIGw7bC5yZW1vdmVQaW4oKX12YXIgaT0oZz10KS5wYXJlbnROb2RlLnN0eWxlLmRpc3BsYXkscz1bInRvcCIsImxlZnQiLCJib3R0b20iLCJyaWdodCIsIm1hcmdpbiIsIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCIsIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSJdO2cucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5PSJub25lIjt2YXIgbj0iYWJzb2x1dGUiIT1yLmNzcyhnLCJwb3NpdGlvbiIpLGE9ci5jc3MoZyxzLmNvbmNhdChbImRpc3BsYXkiXSkpLG89ci5jc3MoZyxbIndpZHRoIiwiaGVpZ2h0Il0pO2cucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5PWksIW4mJmUucHVzaEZvbGxvd2VycyYmKG0oMiwiV0FSTklORzogSWYgdGhlIHBpbm5lZCBlbGVtZW50IGlzIHBvc2l0aW9uZWQgYWJzb2x1dGVseSBwdXNoRm9sbG93ZXJzIHdpbGwgYmUgZGlzYWJsZWQuIiksZS5wdXNoRm9sbG93ZXJzPSExKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2cmJjA9PT1oLmR1cmF0aW9uJiZlLnB1c2hGb2xsb3dlcnMmJm0oMiwiV0FSTklORzogcHVzaEZvbGxvd2VycyA9IiwhMCwiaGFzIG5vIGVmZmVjdCwgd2hlbiBzY2VuZSBkdXJhdGlvbiBpcyAwLiIpfSwwKTt2YXIgdT1nLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGcpLF89ci5leHRlbmQoYSx7cG9zaXRpb246bj8icmVsYXRpdmUiOiJhYnNvbHV0ZSIsYm94U2l6aW5nOiJjb250ZW50LWJveCIsbW96Qm94U2l6aW5nOiJjb250ZW50LWJveCIsd2Via2l0Qm94U2l6aW5nOiJjb250ZW50LWJveCJ9KTtpZihufHxyLmV4dGVuZChfLHIuY3NzKGcsWyJ3aWR0aCIsImhlaWdodCJdKSksci5jc3ModSxfKSx1LnNldEF0dHJpYnV0ZSgiZGF0YS1zY3JvbGxtYWdpYy1waW4tc3BhY2VyIiwiIiksci5hZGRDbGFzcyh1LGUuc3BhY2VyQ2xhc3MpLHY9e3NwYWNlcjp1LHJlbFNpemU6e3dpZHRoOiIlIj09PW8ud2lkdGguc2xpY2UoLTEpLGhlaWdodDoiJSI9PT1vLmhlaWdodC5zbGljZSgtMSksYXV0b0Z1bGxXaWR0aDoiYXV0byI9PT1vLndpZHRoJiZuJiZyLmlzTWFyZ2luQ29sbGFwc2VUeXBlKGEuZGlzcGxheSl9LHB1c2hGb2xsb3dlcnM6ZS5wdXNoRm9sbG93ZXJzLGluRmxvdzpufSwhZy5fX19vcmlnU3R5bGUpe2cuX19fb3JpZ1N0eWxlPXt9O3ZhciBjPWcuc3R5bGUsZj1zLmNvbmNhdChbIndpZHRoIiwiaGVpZ2h0IiwicG9zaXRpb24iLCJib3hTaXppbmciLCJtb3pCb3hTaXppbmciLCJ3ZWJraXRCb3hTaXppbmciXSk7Zi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2cuX19fb3JpZ1N0eWxlW3RdPWNbdF18fCIifSl9cmV0dXJuIHYucmVsU2l6ZS53aWR0aCYmci5jc3ModSx7d2lkdGg6by53aWR0aH0pLHYucmVsU2l6ZS5oZWlnaHQmJnIuY3NzKHUse2hlaWdodDpvLmhlaWdodH0pLHUuYXBwZW5kQ2hpbGQoZyksci5jc3MoZyx7cG9zaXRpb246bj8icmVsYXRpdmUiOiJhYnNvbHV0ZSIsbWFyZ2luOiJhdXRvIix0b3A6ImF1dG8iLGxlZnQ6ImF1dG8iLGJvdHRvbToiYXV0byIscmlnaHQ6ImF1dG8ifSksKHYucmVsU2l6ZS53aWR0aHx8di5yZWxTaXplLmF1dG9GdWxsV2lkdGgpJiZyLmNzcyhnLHtib3hTaXppbmc6ImJvcmRlci1ib3giLG1vekJveFNpemluZzoiYm9yZGVyLWJveCIsd2Via2l0Qm94U2l6aW5nOiJib3JkZXItYm94In0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLEEpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLEEpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLEMpLGcuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V3aGVlbCIsRCksZy5hZGRFdmVudExpc3RlbmVyKCJET01Nb3VzZVNjcm9sbCIsRCksbSgzLCJhZGRlZCBwaW4iKSxSKCksbH0sdGhpcy5yZW1vdmVQaW49ZnVuY3Rpb24odCl7aWYoZyl7aWYoIkRVUklORyI9PT11JiZSKCEwKSx0fHwhbil7dmFyIGU9di5zcGFjZXIuZmlyc3RDaGlsZDtpZihlLmhhc0F0dHJpYnV0ZSgiZGF0YS1zY3JvbGxtYWdpYy1waW4tc3BhY2VyIikpe3ZhciBpPXYuc3BhY2VyLnN0eWxlLHM9e307WyJtYXJnaW4iLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3NbdF09aVt0XXx8IiJ9KSxyLmNzcyhlLHMpfXYuc3BhY2VyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdi5zcGFjZXIpLHYuc3BhY2VyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodi5zcGFjZXIpLGcucGFyZW50Tm9kZS5oYXNBdHRyaWJ1dGUoImRhdGEtc2Nyb2xsbWFnaWMtcGluLXNwYWNlciIpfHwoci5jc3MoZyxnLl9fX29yaWdTdHlsZSksZGVsZXRlIGcuX19fb3JpZ1N0eWxlKX13aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixBKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixBKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixDKSxnLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNld2hlZWwiLEQpLGcucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLEQpLGc9dm9pZCAwLG0oMywicmVtb3ZlZCBwaW4gKHJlc2V0OiAiKyh0PyJ0cnVlIjoiZmFsc2UiKSsiKSIpfXJldHVybiBsfTt2YXIgTSxFPVtdO3JldHVybiBsLm9uKCJkZXN0cm95LmludGVybmFsIixmdW5jdGlvbih0KXtsLnJlbW92ZUNsYXNzVG9nZ2xlKHQucmVzZXQpfSksdGhpcy5zZXRDbGFzc1RvZ2dsZT1mdW5jdGlvbih0LGUpe3ZhciBpPXIuZ2V0LmVsZW1lbnRzKHQpO3JldHVybiAwIT09aS5sZW5ndGgmJnIudHlwZS5TdHJpbmcoZSk/KEUubGVuZ3RoPjAmJmwucmVtb3ZlQ2xhc3NUb2dnbGUoKSxNPWUsRT1pLGwub24oImVudGVyLmludGVybmFsX2NsYXNzIGxlYXZlLmludGVybmFsX2NsYXNzIixmdW5jdGlvbih0KXt2YXIgZT0iZW50ZXIiPT09dC50eXBlP3IuYWRkQ2xhc3M6ci5yZW1vdmVDbGFzcztFLmZvckVhY2goZnVuY3Rpb24odCxpKXtlKHQsTSl9KX0pLGwpOihtKDEsIkVSUk9SIGNhbGxpbmcgbWV0aG9kICdzZXRDbGFzc1RvZ2dsZSgpJzogSW52YWxpZCAiKygwPT09aS5sZW5ndGg/ImVsZW1lbnQiOiJjbGFzc2VzIikrIiBzdXBwbGllZC4iKSxsKX0sdGhpcy5yZW1vdmVDbGFzc1RvZ2dsZT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmRS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7ci5yZW1vdmVDbGFzcyh0LE0pfSksbC5vZmYoInN0YXJ0LmludGVybmFsX2NsYXNzIGVuZC5pbnRlcm5hbF9jbGFzcyIpLE09dm9pZCAwLEU9W10sbH0sZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gaClvLmhhc093blByb3BlcnR5KHQpfHwobSgyLCdXQVJOSU5HOiBVbmtub3duIG9wdGlvbiAiJyt0KyciJyksZGVsZXRlIGhbdF0pO2Zvcih2YXIgZSBpbiBvKWsoZSk7UCgpfSgpLGx9O3ZhciBpPXtkZWZhdWx0czp7ZHVyYXRpb246MCxvZmZzZXQ6MCx0cmlnZ2VyRWxlbWVudDp2b2lkIDAsdHJpZ2dlckhvb2s6LjUscmV2ZXJzZTohMCxsb2dsZXZlbDoyfSx2YWxpZGF0ZTp7b2Zmc2V0OmZ1bmN0aW9uKHQpe2lmKHQ9cGFyc2VGbG9hdCh0KSwhci50eXBlLk51bWJlcih0KSl0aHJvd1snSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uICJvZmZzZXQiOicsdF07cmV0dXJuIHR9LHRyaWdnZXJFbGVtZW50OmZ1bmN0aW9uKHQpe2lmKHQ9dHx8dm9pZCAwKXt2YXIgZT1yLmdldC5lbGVtZW50cyh0KVswXTtpZighZXx8IWUucGFyZW50Tm9kZSl0aHJvd1snRWxlbWVudCBkZWZpbmVkIGluIG9wdGlvbiAidHJpZ2dlckVsZW1lbnQiIHdhcyBub3QgZm91bmQ6Jyx0XTt0PWV9cmV0dXJuIHR9LHRyaWdnZXJIb29rOmZ1bmN0aW9uKHQpe3ZhciBlPXtvbkNlbnRlcjouNSxvbkVudGVyOjEsb25MZWF2ZTowfTtpZihyLnR5cGUuTnVtYmVyKHQpKXQ9TWF0aC5tYXgoMCxNYXRoLm1pbihwYXJzZUZsb2F0KHQpLDEpKTtlbHNle2lmKCEodCBpbiBlKSl0aHJvd1snSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uICJ0cmlnZ2VySG9vayI6ICcsdF07dD1lW3RdfXJldHVybiB0fSxyZXZlcnNlOmZ1bmN0aW9uKHQpe3JldHVybiEhdH0sbG9nbGV2ZWw6ZnVuY3Rpb24odCl7aWYodD1wYXJzZUludCh0KSwhci50eXBlLk51bWJlcih0KXx8dDwwfHx0PjMpdGhyb3dbJ0ludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiAibG9nbGV2ZWwiOicsdF07cmV0dXJuIHR9fSxzaGlmdHM6WyJkdXJhdGlvbiIsIm9mZnNldCIsInRyaWdnZXJIb29rIl19O3QuU2NlbmUuYWRkT3B0aW9uPWZ1bmN0aW9uKGUscixzLG4pe2UgaW4gaS5kZWZhdWx0cz90Ll91dGlsLmxvZygxLCJbc3RhdGljXSBTY3JvbGxNYWdpYy5TY2VuZSAtPiBDYW5ub3QgYWRkIFNjZW5lIG9wdGlvbiAnIitlKyInLCBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLiIpOihpLmRlZmF1bHRzW2VdPXIsaS52YWxpZGF0ZVtlXT1zLG4mJmkuc2hpZnRzLnB1c2goZSkpfSx0LlNjZW5lLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgaT10aGlzO3QuU2NlbmU9ZnVuY3Rpb24oKXtyZXR1cm4gaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy4kc3VwZXI9ci5leHRlbmQoe30sdGhpcyksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9LHIuZXh0ZW5kKHQuU2NlbmUsaSksdC5TY2VuZS5wcm90b3R5cGU9aS5wcm90b3R5cGUsdC5TY2VuZS5wcm90b3R5cGUuY29uc3RydWN0b3I9dC5TY2VuZX0sdC5FdmVudD1mdW5jdGlvbih0LGUsaSxyKXtmb3IodmFyIHMgaW4gcj1yfHx7fSl0aGlzW3NdPXJbc107cmV0dXJuIHRoaXMudHlwZT10LHRoaXMudGFyZ2V0PXRoaXMuY3VycmVudFRhcmdldD1pLHRoaXMubmFtZXNwYWNlPWV8fCIiLHRoaXMudGltZVN0YW1wPXRoaXMudGltZXN0YW1wPURhdGUubm93KCksdGhpc307dmFyIHI9dC5fdXRpbD1mdW5jdGlvbih0KXt2YXIgZSxpPXt9LHI9ZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlRmxvYXQodCl8fDB9LHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY3VycmVudFN0eWxlP2UuY3VycmVudFN0eWxlOnQuZ2V0Q29tcHV0ZWRTdHlsZShlKX0sbj1mdW5jdGlvbihlLGksbixhKXtpZigoaT1pPT09ZG9jdW1lbnQ/dDppKT09PXQpYT0hMTtlbHNlIGlmKCFwLkRvbUVsZW1lbnQoaSkpcmV0dXJuIDA7ZT1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk7dmFyIG89KG4/aVsib2Zmc2V0IitlXXx8aVsib3V0ZXIiK2VdOmlbImNsaWVudCIrZV18fGlbImlubmVyIitlXSl8fDA7aWYobiYmYSl7dmFyIGw9cyhpKTtvKz0iSGVpZ2h0Ij09PWU/cihsLm1hcmdpblRvcCkrcihsLm1hcmdpbkJvdHRvbSk6cihsLm1hcmdpbkxlZnQpK3IobC5tYXJnaW5SaWdodCl9cmV0dXJuIG99LGE9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvXlteYS16XSsoW2Etel0pL2csIiQxIikucmVwbGFjZSgvLShbYS16XSkvZyxmdW5jdGlvbih0KXtyZXR1cm4gdFsxXS50b1VwcGVyQ2FzZSgpfSl9O2kuZXh0ZW5kPWZ1bmN0aW9uKHQpe2Zvcih0PXR8fHt9LGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKWlmKGFyZ3VtZW50c1tlXSlmb3IodmFyIGkgaW4gYXJndW1lbnRzW2VdKWFyZ3VtZW50c1tlXS5oYXNPd25Qcm9wZXJ0eShpKSYmKHRbaV09YXJndW1lbnRzW2VdW2ldKTtyZXR1cm4gdH0saS5pc01hcmdpbkNvbGxhcHNlVHlwZT1mdW5jdGlvbih0KXtyZXR1cm5bImJsb2NrIiwiZmxleCIsImxpc3QtaXRlbSIsInRhYmxlIiwiLXdlYmtpdC1ib3giXS5pbmRleE9mKHQpPi0xfTt2YXIgbz0wLGw9WyJtcyIsIm1veiIsIndlYmtpdCIsIm8iXSxoPXQucmVxdWVzdEFuaW1hdGlvbkZyYW1lLHU9dC5jYW5jZWxBbmltYXRpb25GcmFtZTtmb3IoZT0wOyFoJiZlPGwubGVuZ3RoOysrZSloPXRbbFtlXSsiUmVxdWVzdEFuaW1hdGlvbkZyYW1lIl0sdT10W2xbZV0rIkNhbmNlbEFuaW1hdGlvbkZyYW1lIl18fHRbbFtlXSsiQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lIl07aHx8KGg9ZnVuY3Rpb24oZSl7dmFyIGk9KG5ldyBEYXRlKS5nZXRUaW1lKCkscj1NYXRoLm1heCgwLDE2LShpLW8pKSxzPXQuc2V0VGltZW91dChmdW5jdGlvbigpe2UoaStyKX0scik7cmV0dXJuIG89aStyLHN9KSx1fHwodT1mdW5jdGlvbihlKXt0LmNsZWFyVGltZW91dChlKX0pLGkuckFGPWguYmluZCh0KSxpLmNBRj11LmJpbmQodCk7dmFyIF89WyJlcnJvciIsIndhcm4iLCJsb2ciXSxjPXQuY29uc29sZXx8e307Zm9yKGMubG9nPWMubG9nfHxmdW5jdGlvbigpe30sZT0wO2U8Xy5sZW5ndGg7ZSsrKXt2YXIgZj1fW2VdO2NbZl18fChjW2ZdPWMubG9nKX1pLmxvZz1mdW5jdGlvbih0KXsodD5fLmxlbmd0aHx8dDw9MCkmJih0PV8ubGVuZ3RoKTt2YXIgZT1uZXcgRGF0ZSxpPSgiMCIrZS5nZXRIb3VycygpKS5zbGljZSgtMikrIjoiKygiMCIrZS5nZXRNaW51dGVzKCkpLnNsaWNlKC0yKSsiOiIrKCIwIitlLmdldFNlY29uZHMoKSkuc2xpY2UoLTIpKyI6IisoIjAwIitlLmdldE1pbGxpc2Vjb25kcygpKS5zbGljZSgtMykscj1fW3QtMV0scz1BcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYXJndW1lbnRzLDEpLG49RnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuY2FsbChjW3JdLGMpO3MudW5zaGlmdChpKSxuLmFwcGx5KGMscyl9O3ZhciBwPWkudHlwZT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLnJlcGxhY2UoL15cW29iamVjdCAoLispXF0kLywiJDEiKS50b0xvd2VyQ2FzZSgpfTtwLlN0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09PXAodCl9LHAuRnVuY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09PXAodCl9LHAuQXJyYXk9ZnVuY3Rpb24odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl9LHAuTnVtYmVyPWZ1bmN0aW9uKHQpe3JldHVybiFwLkFycmF5KHQpJiZ0LXBhcnNlRmxvYXQodCkrMT49MH0scC5Eb21FbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgSFRNTEVsZW1lbnQ/dCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50OnQmJiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXQmJjE9PT10Lm5vZGVUeXBlJiYic3RyaW5nIj09dHlwZW9mIHQubm9kZU5hbWV9O3ZhciBkPWkuZ2V0PXt9O3JldHVybiBkLmVsZW1lbnRzPWZ1bmN0aW9uKGUpe3ZhciBpPVtdO2lmKHAuU3RyaW5nKGUpKXRyeXtlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZSl9Y2F0Y2godCl7cmV0dXJuIGl9aWYoIm5vZGVsaXN0Ij09PXAoZSl8fHAuQXJyYXkoZSkpZm9yKHZhciByPTAscz1pLmxlbmd0aD1lLmxlbmd0aDtyPHM7cisrKXt2YXIgbj1lW3JdO2lbcl09cC5Eb21FbGVtZW50KG4pP246ZC5lbGVtZW50cyhuKX1lbHNlKHAuRG9tRWxlbWVudChlKXx8ZT09PWRvY3VtZW50fHxlPT09dCkmJihpPVtlXSk7cmV0dXJuIGl9LGQuc2Nyb2xsVG9wPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYibnVtYmVyIj09dHlwZW9mIGUuc2Nyb2xsVG9wP2Uuc2Nyb2xsVG9wOnQucGFnZVlPZmZzZXR8fDB9LGQuc2Nyb2xsTGVmdD1mdW5jdGlvbihlKXtyZXR1cm4gZSYmIm51bWJlciI9PXR5cGVvZiBlLnNjcm9sbExlZnQ/ZS5zY3JvbGxMZWZ0OnQucGFnZVhPZmZzZXR8fDB9LGQud2lkdGg9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuKCJ3aWR0aCIsdCxlLGkpfSxkLmhlaWdodD1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIG4oImhlaWdodCIsdCxlLGkpfSxkLm9mZnNldD1mdW5jdGlvbih0LGUpe3ZhciBpPXt0b3A6MCxsZWZ0OjB9O2lmKHQmJnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXt2YXIgcj10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2kudG9wPXIudG9wLGkubGVmdD1yLmxlZnQsZXx8KGkudG9wKz1kLnNjcm9sbFRvcCgpLGkubGVmdCs9ZC5zY3JvbGxMZWZ0KCkpfXJldHVybiBpfSxpLmFkZENsYXNzPWZ1bmN0aW9uKHQsZSl7ZSYmKHQuY2xhc3NMaXN0P3QuY2xhc3NMaXN0LmFkZChlKTp0LmNsYXNzTmFtZSs9IiAiK2UpfSxpLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKHQsZSl7ZSYmKHQuY2xhc3NMaXN0P3QuY2xhc3NMaXN0LnJlbW92ZShlKTp0LmNsYXNzTmFtZT10LmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoIihefFxcYikiK2Uuc3BsaXQoIiAiKS5qb2luKCJ8IikrIihcXGJ8JCkiLCJnaSIpLCIgIikpfSxpLmNzcz1mdW5jdGlvbih0LGUpe2lmKHAuU3RyaW5nKGUpKXJldHVybiBzKHQpW2EoZSldO2lmKHAuQXJyYXkoZSkpe3ZhciBpPXt9LHI9cyh0KTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7aVt0XT1yW2EodCldfSksaX1mb3IodmFyIG4gaW4gZSl7dmFyIG89ZVtuXTtvPT1wYXJzZUZsb2F0KG8pJiYobys9InB4IiksdC5zdHlsZVthKG4pXT1vfX0saX0od2luZG93fHx7fSk7cmV0dXJuIHQuU2NlbmUucHJvdG90eXBlLmFkZEluZGljYXRvcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdC5fdXRpbC5sb2coMSwiKFNjcm9sbE1hZ2ljLlNjZW5lKSAtPiBFUlJPUiBjYWxsaW5nIGFkZEluZGljYXRvcnMoKSBkdWUgdG8gbWlzc2luZyBQbHVnaW4gJ2RlYnVnLmFkZEluZGljYXRvcnMnLiBQbGVhc2UgbWFrZSBzdXJlIHRvIGluY2x1ZGUgcGx1Z2lucy9kZWJ1Zy5hZGRJbmRpY2F0b3JzLmpzIiksdGhpc30sdC5TY2VuZS5wcm90b3R5cGUucmVtb3ZlSW5kaWNhdG9ycz1mdW5jdGlvbigpe3JldHVybiB0Ll91dGlsLmxvZygxLCIoU2Nyb2xsTWFnaWMuU2NlbmUpIC0+IEVSUk9SIGNhbGxpbmcgcmVtb3ZlSW5kaWNhdG9ycygpIGR1ZSB0byBtaXNzaW5nIFBsdWdpbiAnZGVidWcuYWRkSW5kaWNhdG9ycycuIFBsZWFzZSBtYWtlIHN1cmUgdG8gaW5jbHVkZSBwbHVnaW5zL2RlYnVnLmFkZEluZGljYXRvcnMuanMiKSx0aGlzfSx0LlNjZW5lLnByb3RvdHlwZS5zZXRUd2Vlbj1mdW5jdGlvbigpe3JldHVybiB0Ll91dGlsLmxvZygxLCIoU2Nyb2xsTWFnaWMuU2NlbmUpIC0+IEVSUk9SIGNhbGxpbmcgc2V0VHdlZW4oKSBkdWUgdG8gbWlzc2luZyBQbHVnaW4gJ2FuaW1hdGlvbi5nc2FwJy4gUGxlYXNlIG1ha2Ugc3VyZSB0byBpbmNsdWRlIHBsdWdpbnMvYW5pbWF0aW9uLmdzYXAuanMiKSx0aGlzfSx0LlNjZW5lLnByb3RvdHlwZS5yZW1vdmVUd2Vlbj1mdW5jdGlvbigpe3JldHVybiB0Ll91dGlsLmxvZygxLCIoU2Nyb2xsTWFnaWMuU2NlbmUpIC0+IEVSUk9SIGNhbGxpbmcgcmVtb3ZlVHdlZW4oKSBkdWUgdG8gbWlzc2luZyBQbHVnaW4gJ2FuaW1hdGlvbi5nc2FwJy4gUGxlYXNlIG1ha2Ugc3VyZSB0byBpbmNsdWRlIHBsdWdpbnMvYW5pbWF0aW9uLmdzYXAuanMiKSx0aGlzfSx0LlNjZW5lLnByb3RvdHlwZS5zZXRWZWxvY2l0eT1mdW5jdGlvbigpe3JldHVybiB0Ll91dGlsLmxvZygxLCIoU2Nyb2xsTWFnaWMuU2NlbmUpIC0+IEVSUk9SIGNhbGxpbmcgc2V0VmVsb2NpdHkoKSBkdWUgdG8gbWlzc2luZyBQbHVnaW4gJ2FuaW1hdGlvbi52ZWxvY2l0eScuIFBsZWFzZSBtYWtlIHN1cmUgdG8gaW5jbHVkZSBwbHVnaW5zL2FuaW1hdGlvbi52ZWxvY2l0eS5qcyIpLHRoaXN9LHQuU2NlbmUucHJvdG90eXBlLnJlbW92ZVZlbG9jaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIHQuX3V0aWwubG9nKDEsIihTY3JvbGxNYWdpYy5TY2VuZSkgLT4gRVJST1IgY2FsbGluZyByZW1vdmVWZWxvY2l0eSgpIGR1ZSB0byBtaXNzaW5nIFBsdWdpbiAnYW5pbWF0aW9uLnZlbG9jaXR5Jy4gUGxlYXNlIG1ha2Ugc3VyZSB0byBpbmNsdWRlIHBsdWdpbnMvYW5pbWF0aW9uLnZlbG9jaXR5LmpzIiksdGhpc30sdH0pP3IuY2FsbChlLGksZSx0KTpyKXx8KHQuZXhwb3J0cz1zKX0sZnVuY3Rpb24odCxlLGkpeyhmdW5jdGlvbihpKXt2YXIgcjsNCi8qIQ0KICogVkVSU0lPTjogMi4wLjINCiAqIERBVEU6IDIwMTgtMDgtMjcNCiAqIFVQREFURVMgQU5EIERPQ1MgQVQ6IGh0dHA6Ly9ncmVlbnNvY2suY29tDQogKg0KICogQGxpY2Vuc2UgQ29weXJpZ2h0IChjKSAyMDA4LTIwMTgsIEdyZWVuU29jay4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAqIFRoaXMgd29yayBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhdCBodHRwOi8vZ3JlZW5zb2NrLmNvbS9zdGFuZGFyZC1saWNlbnNlIG9yIGZvcg0KICogQ2x1YiBHcmVlblNvY2sgbWVtYmVycywgdGhlIHNvZnR3YXJlIGFncmVlbWVudCB0aGF0IHdhcyBpc3N1ZWQgd2l0aCB5b3VyIG1lbWJlcnNoaXAuDQogKiANCiAqIEBhdXRob3I6IEphY2sgRG95bGUsIGphY2tAZ3JlZW5zb2NrLmNvbQ0KICovDQovKiENCiAqIFZFUlNJT046IDIuMC4yDQogKiBEQVRFOiAyMDE4LTA4LTI3DQogKiBVUERBVEVTIEFORCBET0NTIEFUOiBodHRwOi8vZ3JlZW5zb2NrLmNvbQ0KICoNCiAqIEBsaWNlbnNlIENvcHlyaWdodCAoYykgMjAwOC0yMDE4LCBHcmVlblNvY2suIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKiBUaGlzIHdvcmsgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYXQgaHR0cDovL2dyZWVuc29jay5jb20vc3RhbmRhcmQtbGljZW5zZSBvciBmb3INCiAqIENsdWIgR3JlZW5Tb2NrIG1lbWJlcnMsIHRoZSBzb2Z0d2FyZSBhZ3JlZW1lbnQgdGhhdCB3YXMgaXNzdWVkIHdpdGggeW91ciBtZW1iZXJzaGlwLg0KICogDQogKiBAYXV0aG9yOiBKYWNrIERveWxlLCBqYWNrQGdyZWVuc29jay5jb20NCiAqLw0KIWZ1bmN0aW9uKGkscyl7InVzZSBzdHJpY3QiO3ZhciBuPXt9LGE9aS5kb2N1bWVudCxvPWkuR3JlZW5Tb2NrR2xvYmFscz1pLkdyZWVuU29ja0dsb2JhbHN8fGksbD1vLlR3ZWVuTGl0ZTtpZihsKXJldHVybiB2b2lkIDAhPT10JiZ0LmV4cG9ydHMmJih0LmV4cG9ydHM9bCksbDt2YXIgaCx1LF8sYyxmLHA9ZnVuY3Rpb24odCl7dmFyIGUsaT10LnNwbGl0KCIuIikscj1vO2ZvcihlPTA7ZTxpLmxlbmd0aDtlKyspcltpW2VdXT1yPXJbaVtlXV18fHt9O3JldHVybiByfSxkPXAoImNvbS5ncmVlbnNvY2siKSxtPWZ1bmN0aW9uKHQpe3ZhciBlLGk9W10scj10Lmxlbmd0aDtmb3IoZT0wO2UhPT1yO2kucHVzaCh0W2UrK10pKTtyZXR1cm4gaX0sZz1mdW5jdGlvbigpe30sdj1mdW5jdGlvbigpe3ZhciB0PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsZT10LmNhbGwoW10pO3JldHVybiBmdW5jdGlvbihpKXtyZXR1cm4gbnVsbCE9aSYmKGkgaW5zdGFuY2VvZiBBcnJheXx8Im9iamVjdCI9PXR5cGVvZiBpJiYhIWkucHVzaCYmdC5jYWxsKGkpPT09ZSl9fSgpLHk9e30sVD1mdW5jdGlvbihpLHMsYSxsKXt0aGlzLnNjPXlbaV0/eVtpXS5zYzpbXSx5W2ldPXRoaXMsdGhpcy5nc0NsYXNzPW51bGwsdGhpcy5mdW5jPWE7dmFyIGg9W107dGhpcy5jaGVjaz1mdW5jdGlvbih1KXtmb3IodmFyIF8sYyxmLGQsbT1zLmxlbmd0aCxnPW07LS1tPi0xOykoXz15W3NbbV1dfHxuZXcgVChzW21dLFtdKSkuZ3NDbGFzcz8oaFttXT1fLmdzQ2xhc3MsZy0tKTp1JiZfLnNjLnB1c2godGhpcyk7aWYoMD09PWcmJmEpe2lmKGY9KGM9KCJjb20uZ3JlZW5zb2NrLiIraSkuc3BsaXQoIi4iKSkucG9wKCksZD1wKGMuam9pbigiLiIpKVtmXT10aGlzLmdzQ2xhc3M9YS5hcHBseShhLGgpLGwpaWYob1tmXT1uW2ZdPWQsdm9pZCAwIT09dCYmdC5leHBvcnRzKWlmKCJUd2VlbkxpdGUiPT09aSlmb3IobSBpbiB0LmV4cG9ydHM9bi5Ud2VlbkxpdGU9ZCxuKWRbbV09blttXTtlbHNlIG4uVHdlZW5MaXRlJiYobi5Ud2VlbkxpdGVbZl09ZCk7ZWxzZSB2b2lkIDA9PT0ocj1mdW5jdGlvbigpe3JldHVybiBkfS5hcHBseShlLFtdKSl8fCh0LmV4cG9ydHM9cik7Zm9yKG09MDttPHRoaXMuc2MubGVuZ3RoO20rKyl0aGlzLnNjW21dLmNoZWNrKCl9fSx0aGlzLmNoZWNrKCEwKX0sdz1pLl9nc0RlZmluZT1mdW5jdGlvbih0LGUsaSxyKXtyZXR1cm4gbmV3IFQodCxlLGkscil9LHg9ZC5fY2xhc3M9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBlPWV8fGZ1bmN0aW9uKCl7fSx3KHQsW10sZnVuY3Rpb24oKXtyZXR1cm4gZX0saSksZX07dy5nbG9iYWxzPW87dmFyIGI9WzAsMCwxLDFdLFA9eCgiZWFzaW5nLkVhc2UiLGZ1bmN0aW9uKHQsZSxpLHIpe3RoaXMuX2Z1bmM9dCx0aGlzLl90eXBlPWl8fDAsdGhpcy5fcG93ZXI9cnx8MCx0aGlzLl9wYXJhbXM9ZT9iLmNvbmNhdChlKTpifSwhMCksUz1QLm1hcD17fSxrPVAucmVnaXN0ZXI9ZnVuY3Rpb24odCxlLGkscil7Zm9yKHZhciBzLG4sYSxvLGw9ZS5zcGxpdCgiLCIpLGg9bC5sZW5ndGgsdT0oaXx8ImVhc2VJbixlYXNlT3V0LGVhc2VJbk91dCIpLnNwbGl0KCIsIik7LS1oPi0xOylmb3Iobj1sW2hdLHM9cj94KCJlYXNpbmcuIituLG51bGwsITApOmQuZWFzaW5nW25dfHx7fSxhPXUubGVuZ3RoOy0tYT4tMTspbz11W2FdLFNbbisiLiIrb109U1tvK25dPXNbb109dC5nZXRSYXRpbz90OnRbb118fG5ldyB0fTtmb3IoKF89UC5wcm90b3R5cGUpLl9jYWxjRW5kPSExLF8uZ2V0UmF0aW89ZnVuY3Rpb24odCl7aWYodGhpcy5fZnVuYylyZXR1cm4gdGhpcy5fcGFyYW1zWzBdPXQsdGhpcy5fZnVuYy5hcHBseShudWxsLHRoaXMuX3BhcmFtcyk7dmFyIGU9dGhpcy5fdHlwZSxpPXRoaXMuX3Bvd2VyLHI9MT09PWU/MS10OjI9PT1lP3Q6dDwuNT8yKnQ6MiooMS10KTtyZXR1cm4gMT09PWk/cio9cjoyPT09aT9yKj1yKnI6Mz09PWk/cio9cipyKnI6ND09PWkmJihyKj1yKnIqcipyKSwxPT09ZT8xLXI6Mj09PWU/cjp0PC41P3IvMjoxLXIvMn0sdT0oaD1bIkxpbmVhciIsIlF1YWQiLCJDdWJpYyIsIlF1YXJ0IiwiUXVpbnQsU3Ryb25nIl0pLmxlbmd0aDstLXU+LTE7KV89aFt1XSsiLFBvd2VyIit1LGsobmV3IFAobnVsbCxudWxsLDEsdSksXywiZWFzZU91dCIsITApLGsobmV3IFAobnVsbCxudWxsLDIsdSksXywiZWFzZUluIisoMD09PXU/IixlYXNlTm9uZSI6IiIpKSxrKG5ldyBQKG51bGwsbnVsbCwzLHUpLF8sImVhc2VJbk91dCIpO1MubGluZWFyPWQuZWFzaW5nLkxpbmVhci5lYXNlSW4sUy5zd2luZz1kLmVhc2luZy5RdWFkLmVhc2VJbk91dDt2YXIgUj14KCJldmVudHMuRXZlbnREaXNwYXRjaGVyIixmdW5jdGlvbih0KXt0aGlzLl9saXN0ZW5lcnM9e30sdGhpcy5fZXZlbnRUYXJnZXQ9dHx8dGhpc30pOyhfPVIucHJvdG90eXBlKS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSxpLHIscyl7cz1zfHwwO3ZhciBuLGEsbz10aGlzLl9saXN0ZW5lcnNbdF0sbD0wO2Zvcih0aGlzIT09Y3x8Znx8Yy53YWtlKCksbnVsbD09byYmKHRoaXMuX2xpc3RlbmVyc1t0XT1vPVtdKSxhPW8ubGVuZ3RoOy0tYT4tMTspKG49b1thXSkuYz09PWUmJm4ucz09PWk/by5zcGxpY2UoYSwxKTowPT09bCYmbi5wcjxzJiYobD1hKzEpO28uc3BsaWNlKGwsMCx7YzplLHM6aSx1cDpyLHByOnN9KX0sXy5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIGkscj10aGlzLl9saXN0ZW5lcnNbdF07aWYocilmb3IoaT1yLmxlbmd0aDstLWk+LTE7KWlmKHJbaV0uYz09PWUpcmV0dXJuIHZvaWQgci5zcGxpY2UoaSwxKX0sXy5kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKHQpe3ZhciBlLGkscixzPXRoaXMuX2xpc3RlbmVyc1t0XTtpZihzKWZvcigoZT1zLmxlbmd0aCk+MSYmKHM9cy5zbGljZSgwKSksaT10aGlzLl9ldmVudFRhcmdldDstLWU+LTE7KShyPXNbZV0pJiYoci51cD9yLmMuY2FsbChyLnN8fGkse3R5cGU6dCx0YXJnZXQ6aX0pOnIuYy5jYWxsKHIuc3x8aSkpfTt2YXIgTz1pLnJlcXVlc3RBbmltYXRpb25GcmFtZSxBPWkuY2FuY2VsQW5pbWF0aW9uRnJhbWUsQz1EYXRlLm5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sRD1DKCk7Zm9yKHU9KGg9WyJtcyIsIm1veiIsIndlYmtpdCIsIm8iXSkubGVuZ3RoOy0tdT4tMSYmIU87KU89aVtoW3VdKyJSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiXSxBPWlbaFt1XSsiQ2FuY2VsQW5pbWF0aW9uRnJhbWUiXXx8aVtoW3VdKyJDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiXTt4KCJUaWNrZXIiLGZ1bmN0aW9uKHQsZSl7dmFyIGkscixzLG4sbyxsPXRoaXMsaD1DKCksdT0hKCExPT09ZXx8IU8pJiYiYXV0byIsXz01MDAscD0zMyxkPWZ1bmN0aW9uKHQpe3ZhciBlLGEsdT1DKCktRDt1Pl8mJihoKz11LXApLEQrPXUsbC50aW1lPShELWgpLzFlMyxlPWwudGltZS1vLCghaXx8ZT4wfHwhMD09PXQpJiYobC5mcmFtZSsrLG8rPWUrKGU+PW4/LjAwNDpuLWUpLGE9ITApLCEwIT09dCYmKHM9cihkKSksYSYmbC5kaXNwYXRjaEV2ZW50KCJ0aWNrIil9O1IuY2FsbChsKSxsLnRpbWU9bC5mcmFtZT0wLGwudGljaz1mdW5jdGlvbigpe2QoITApfSxsLmxhZ1Ntb290aGluZz1mdW5jdGlvbih0LGUpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBfPDFlMTA7Xz10fHwxZTEwLHA9TWF0aC5taW4oZSxfLDApfSxsLnNsZWVwPWZ1bmN0aW9uKCl7bnVsbCE9cyYmKHUmJkE/QShzKTpjbGVhclRpbWVvdXQocykscj1nLHM9bnVsbCxsPT09YyYmKGY9ITEpKX0sbC53YWtlPWZ1bmN0aW9uKHQpe251bGwhPT1zP2wuc2xlZXAoKTp0P2grPS1EKyhEPUMoKSk6bC5mcmFtZT4xMCYmKEQ9QygpLV8rNSkscj0wPT09aT9nOnUmJk8/TzpmdW5jdGlvbih0KXtyZXR1cm4gc2V0VGltZW91dCh0LDFlMyooby1sLnRpbWUpKzF8MCl9LGw9PT1jJiYoZj0hMCksZCgyKX0sbC5mcHM9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGk7bj0xLygoaT10KXx8NjApLG89dGhpcy50aW1lK24sbC53YWtlKCl9LGwudXNlUkFGPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB1O2wuc2xlZXAoKSx1PXQsbC5mcHMoaSl9LGwuZnBzKHQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXsiYXV0byI9PT11JiZsLmZyYW1lPDUmJiJoaWRkZW4iIT09KGF8fHt9KS52aXNpYmlsaXR5U3RhdGUmJmwudXNlUkFGKCExKX0sMTUwMCl9KSwoXz1kLlRpY2tlci5wcm90b3R5cGU9bmV3IGQuZXZlbnRzLkV2ZW50RGlzcGF0Y2hlcikuY29uc3RydWN0b3I9ZC5UaWNrZXI7dmFyIE09eCgiY29yZS5BbmltYXRpb24iLGZ1bmN0aW9uKHQsZSl7aWYodGhpcy52YXJzPWU9ZXx8e30sdGhpcy5fZHVyYXRpb249dGhpcy5fdG90YWxEdXJhdGlvbj10fHwwLHRoaXMuX2RlbGF5PU51bWJlcihlLmRlbGF5KXx8MCx0aGlzLl90aW1lU2NhbGU9MSx0aGlzLl9hY3RpdmU9ITA9PT1lLmltbWVkaWF0ZVJlbmRlcix0aGlzLmRhdGE9ZS5kYXRhLHRoaXMuX3JldmVyc2VkPSEwPT09ZS5yZXZlcnNlZCxRKXtmfHxjLndha2UoKTt2YXIgaT10aGlzLnZhcnMudXNlRnJhbWVzPyQ6UTtpLmFkZCh0aGlzLGkuX3RpbWUpLHRoaXMudmFycy5wYXVzZWQmJnRoaXMucGF1c2VkKCEwKX19KTtjPU0udGlja2VyPW5ldyBkLlRpY2tlciwoXz1NLnByb3RvdHlwZSkuX2RpcnR5PV8uX2djPV8uX2luaXR0ZWQ9Xy5fcGF1c2VkPSExLF8uX3RvdGFsVGltZT1fLl90aW1lPTAsXy5fcmF3UHJldlRpbWU9LTEsXy5fbmV4dD1fLl9sYXN0PV8uX29uVXBkYXRlPV8uX3RpbWVsaW5lPV8udGltZWxpbmU9bnVsbCxfLl9wYXVzZWQ9ITE7dmFyIEU9ZnVuY3Rpb24oKXtmJiZDKCktRD4yZTMmJigiaGlkZGVuIiE9PShhfHx7fSkudmlzaWJpbGl0eVN0YXRlfHwhYy5sYWdTbW9vdGhpbmcoKSkmJmMud2FrZSgpO3ZhciB0PXNldFRpbWVvdXQoRSwyZTMpO3QudW5yZWYmJnQudW5yZWYoKX07RSgpLF8ucGxheT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZ0aGlzLnNlZWsodCxlKSx0aGlzLnJldmVyc2VkKCExKS5wYXVzZWQoITEpfSxfLnBhdXNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJnRoaXMuc2Vlayh0LGUpLHRoaXMucGF1c2VkKCEwKX0sXy5yZXN1bWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmdGhpcy5zZWVrKHQsZSksdGhpcy5wYXVzZWQoITEpfSxfLnNlZWs9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy50b3RhbFRpbWUoTnVtYmVyKHQpLCExIT09ZSl9LF8ucmVzdGFydD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJldmVyc2VkKCExKS5wYXVzZWQoITEpLnRvdGFsVGltZSh0Py10aGlzLl9kZWxheTowLCExIT09ZSwhMCl9LF8ucmV2ZXJzZT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZ0aGlzLnNlZWsodHx8dGhpcy50b3RhbER1cmF0aW9uKCksZSksdGhpcy5yZXZlcnNlZCghMCkucGF1c2VkKCExKX0sXy5yZW5kZXI9ZnVuY3Rpb24odCxlLGkpe30sXy5pbnZhbGlkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpbWU9dGhpcy5fdG90YWxUaW1lPTAsdGhpcy5faW5pdHRlZD10aGlzLl9nYz0hMSx0aGlzLl9yYXdQcmV2VGltZT0tMSwhdGhpcy5fZ2MmJnRoaXMudGltZWxpbmV8fHRoaXMuX2VuYWJsZWQoITApLHRoaXN9LF8uaXNBY3RpdmU9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuX3RpbWVsaW5lLGk9dGhpcy5fc3RhcnRUaW1lO3JldHVybiFlfHwhdGhpcy5fZ2MmJiF0aGlzLl9wYXVzZWQmJmUuaXNBY3RpdmUoKSYmKHQ9ZS5yYXdUaW1lKCEwKSk+PWkmJnQ8aSt0aGlzLnRvdGFsRHVyYXRpb24oKS90aGlzLl90aW1lU2NhbGUtMWUtN30sXy5fZW5hYmxlZD1mdW5jdGlvbih0LGUpe3JldHVybiBmfHxjLndha2UoKSx0aGlzLl9nYz0hdCx0aGlzLl9hY3RpdmU9dGhpcy5pc0FjdGl2ZSgpLCEwIT09ZSYmKHQmJiF0aGlzLnRpbWVsaW5lP3RoaXMuX3RpbWVsaW5lLmFkZCh0aGlzLHRoaXMuX3N0YXJ0VGltZS10aGlzLl9kZWxheSk6IXQmJnRoaXMudGltZWxpbmUmJnRoaXMuX3RpbWVsaW5lLl9yZW1vdmUodGhpcywhMCkpLCExfSxfLl9raWxsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2VuYWJsZWQoITEsITEpfSxfLmtpbGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fa2lsbCh0LGUpLHRoaXN9LF8uX3VuY2FjaGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQ/dGhpczp0aGlzLnRpbWVsaW5lO2U7KWUuX2RpcnR5PSEwLGU9ZS50aW1lbGluZTtyZXR1cm4gdGhpc30sXy5fc3dhcFNlbGZJblBhcmFtcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGgsaT10LmNvbmNhdCgpOy0tZT4tMTspIntzZWxmfSI9PT10W2VdJiYoaVtlXT10aGlzKTtyZXR1cm4gaX0sXy5fY2FsbGJhY2s9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52YXJzLGk9ZVt0XSxyPWVbdCsiUGFyYW1zIl0scz1lW3QrIlNjb3BlIl18fGUuY2FsbGJhY2tTY29wZXx8dGhpcztzd2l0Y2gocj9yLmxlbmd0aDowKXtjYXNlIDA6aS5jYWxsKHMpO2JyZWFrO2Nhc2UgMTppLmNhbGwocyxyWzBdKTticmVhaztjYXNlIDI6aS5jYWxsKHMsclswXSxyWzFdKTticmVhaztkZWZhdWx0OmkuYXBwbHkocyxyKX19LF8uZXZlbnRDYWxsYmFjaz1mdW5jdGlvbih0LGUsaSxyKXtpZigib24iPT09KHR8fCIiKS5zdWJzdHIoMCwyKSl7dmFyIHM9dGhpcy52YXJzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBzW3RdO251bGw9PWU/ZGVsZXRlIHNbdF06KHNbdF09ZSxzW3QrIlBhcmFtcyJdPXYoaSkmJi0xIT09aS5qb2luKCIiKS5pbmRleE9mKCJ7c2VsZn0iKT90aGlzLl9zd2FwU2VsZkluUGFyYW1zKGkpOmksc1t0KyJTY29wZSJdPXIpLCJvblVwZGF0ZSI9PT10JiYodGhpcy5fb25VcGRhdGU9ZSl9cmV0dXJuIHRoaXN9LF8uZGVsYXk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3RpbWVsaW5lLnNtb290aENoaWxkVGltaW5nJiZ0aGlzLnN0YXJ0VGltZSh0aGlzLl9zdGFydFRpbWUrdC10aGlzLl9kZWxheSksdGhpcy5fZGVsYXk9dCx0aGlzKTp0aGlzLl9kZWxheX0sXy5kdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5fZHVyYXRpb249dGhpcy5fdG90YWxEdXJhdGlvbj10LHRoaXMuX3VuY2FjaGUoITApLHRoaXMuX3RpbWVsaW5lLnNtb290aENoaWxkVGltaW5nJiZ0aGlzLl90aW1lPjAmJnRoaXMuX3RpbWU8dGhpcy5fZHVyYXRpb24mJjAhPT10JiZ0aGlzLnRvdGFsVGltZSh0aGlzLl90b3RhbFRpbWUqKHQvdGhpcy5fZHVyYXRpb24pLCEwKSx0aGlzKToodGhpcy5fZGlydHk9ITEsdGhpcy5fZHVyYXRpb24pfSxfLnRvdGFsRHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RpcnR5PSExLGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5kdXJhdGlvbih0KTp0aGlzLl90b3RhbER1cmF0aW9ufSxfLnRpbWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5fZGlydHkmJnRoaXMudG90YWxEdXJhdGlvbigpLHRoaXMudG90YWxUaW1lKHQ+dGhpcy5fZHVyYXRpb24/dGhpcy5fZHVyYXRpb246dCxlKSk6dGhpcy5fdGltZX0sXy50b3RhbFRpbWU9ZnVuY3Rpb24odCxlLGkpe2lmKGZ8fGMud2FrZSgpLCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl90b3RhbFRpbWU7aWYodGhpcy5fdGltZWxpbmUpe2lmKHQ8MCYmIWkmJih0Kz10aGlzLnRvdGFsRHVyYXRpb24oKSksdGhpcy5fdGltZWxpbmUuc21vb3RoQ2hpbGRUaW1pbmcpe3RoaXMuX2RpcnR5JiZ0aGlzLnRvdGFsRHVyYXRpb24oKTt2YXIgcj10aGlzLl90b3RhbER1cmF0aW9uLHM9dGhpcy5fdGltZWxpbmU7aWYodD5yJiYhaSYmKHQ9ciksdGhpcy5fc3RhcnRUaW1lPSh0aGlzLl9wYXVzZWQ/dGhpcy5fcGF1c2VUaW1lOnMuX3RpbWUpLSh0aGlzLl9yZXZlcnNlZD9yLXQ6dCkvdGhpcy5fdGltZVNjYWxlLHMuX2RpcnR5fHx0aGlzLl91bmNhY2hlKCExKSxzLl90aW1lbGluZSlmb3IoO3MuX3RpbWVsaW5lOylzLl90aW1lbGluZS5fdGltZSE9PShzLl9zdGFydFRpbWUrcy5fdG90YWxUaW1lKS9zLl90aW1lU2NhbGUmJnMudG90YWxUaW1lKHMuX3RvdGFsVGltZSwhMCkscz1zLl90aW1lbGluZX10aGlzLl9nYyYmdGhpcy5fZW5hYmxlZCghMCwhMSksdGhpcy5fdG90YWxUaW1lPT09dCYmMCE9PXRoaXMuX2R1cmF0aW9ufHwoTC5sZW5ndGgmJkooKSx0aGlzLnJlbmRlcih0LGUsITEpLEwubGVuZ3RoJiZKKCkpfXJldHVybiB0aGlzfSxfLnByb2dyZXNzPV8udG90YWxQcm9ncmVzcz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZHVyYXRpb24oKTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnRvdGFsVGltZShpKnQsZSk6aT90aGlzLl90aW1lL2k6dGhpcy5yYXRpb30sXy5zdGFydFRpbWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQhPT10aGlzLl9zdGFydFRpbWUmJih0aGlzLl9zdGFydFRpbWU9dCx0aGlzLnRpbWVsaW5lJiZ0aGlzLnRpbWVsaW5lLl9zb3J0Q2hpbGRyZW4mJnRoaXMudGltZWxpbmUuYWRkKHRoaXMsdC10aGlzLl9kZWxheSkpLHRoaXMpOnRoaXMuX3N0YXJ0VGltZX0sXy5lbmRUaW1lPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zdGFydFRpbWUrKDAhPXQ/dGhpcy50b3RhbER1cmF0aW9uKCk6dGhpcy5kdXJhdGlvbigpKS90aGlzLl90aW1lU2NhbGV9LF8udGltZVNjYWxlPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl90aW1lU2NhbGU7dmFyIGUsaTtmb3IodD10fHwxZS0xMCx0aGlzLl90aW1lbGluZSYmdGhpcy5fdGltZWxpbmUuc21vb3RoQ2hpbGRUaW1pbmcmJihpPShlPXRoaXMuX3BhdXNlVGltZSl8fDA9PT1lP2U6dGhpcy5fdGltZWxpbmUudG90YWxUaW1lKCksdGhpcy5fc3RhcnRUaW1lPWktKGktdGhpcy5fc3RhcnRUaW1lKSp0aGlzLl90aW1lU2NhbGUvdCksdGhpcy5fdGltZVNjYWxlPXQsaT10aGlzLnRpbWVsaW5lO2kmJmkudGltZWxpbmU7KWkuX2RpcnR5PSEwLGkudG90YWxEdXJhdGlvbigpLGk9aS50aW1lbGluZTtyZXR1cm4gdGhpc30sXy5yZXZlcnNlZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odCE9dGhpcy5fcmV2ZXJzZWQmJih0aGlzLl9yZXZlcnNlZD10LHRoaXMudG90YWxUaW1lKHRoaXMuX3RpbWVsaW5lJiYhdGhpcy5fdGltZWxpbmUuc21vb3RoQ2hpbGRUaW1pbmc/dGhpcy50b3RhbER1cmF0aW9uKCktdGhpcy5fdG90YWxUaW1lOnRoaXMuX3RvdGFsVGltZSwhMCkpLHRoaXMpOnRoaXMuX3JldmVyc2VkfSxfLnBhdXNlZD1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fcGF1c2VkO3ZhciBlLGkscj10aGlzLl90aW1lbGluZTtyZXR1cm4gdCE9dGhpcy5fcGF1c2VkJiZyJiYoZnx8dHx8Yy53YWtlKCksaT0oZT1yLnJhd1RpbWUoKSktdGhpcy5fcGF1c2VUaW1lLCF0JiZyLnNtb290aENoaWxkVGltaW5nJiYodGhpcy5fc3RhcnRUaW1lKz1pLHRoaXMuX3VuY2FjaGUoITEpKSx0aGlzLl9wYXVzZVRpbWU9dD9lOm51bGwsdGhpcy5fcGF1c2VkPXQsdGhpcy5fYWN0aXZlPXRoaXMuaXNBY3RpdmUoKSwhdCYmMCE9PWkmJnRoaXMuX2luaXR0ZWQmJnRoaXMuZHVyYXRpb24oKSYmKGU9ci5zbW9vdGhDaGlsZFRpbWluZz90aGlzLl90b3RhbFRpbWU6KGUtdGhpcy5fc3RhcnRUaW1lKS90aGlzLl90aW1lU2NhbGUsdGhpcy5yZW5kZXIoZSxlPT09dGhpcy5fdG90YWxUaW1lLCEwKSkpLHRoaXMuX2djJiYhdCYmdGhpcy5fZW5hYmxlZCghMCwhMSksdGhpc307dmFyIEY9eCgiY29yZS5TaW1wbGVUaW1lbGluZSIsZnVuY3Rpb24odCl7TS5jYWxsKHRoaXMsMCx0KSx0aGlzLmF1dG9SZW1vdmVDaGlsZHJlbj10aGlzLnNtb290aENoaWxkVGltaW5nPSEwfSk7KF89Ri5wcm90b3R5cGU9bmV3IE0pLmNvbnN0cnVjdG9yPUYsXy5raWxsKCkuX2djPSExLF8uX2ZpcnN0PV8uX2xhc3Q9Xy5fcmVjZW50PW51bGwsXy5fc29ydENoaWxkcmVuPSExLF8uYWRkPV8uaW5zZXJ0PWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBzLG47aWYodC5fc3RhcnRUaW1lPU51bWJlcihlfHwwKSt0Ll9kZWxheSx0Ll9wYXVzZWQmJnRoaXMhPT10Ll90aW1lbGluZSYmKHQuX3BhdXNlVGltZT10aGlzLnJhd1RpbWUoKS0odC5fdGltZWxpbmUucmF3VGltZSgpLXQuX3BhdXNlVGltZSkpLHQudGltZWxpbmUmJnQudGltZWxpbmUuX3JlbW92ZSh0LCEwKSx0LnRpbWVsaW5lPXQuX3RpbWVsaW5lPXRoaXMsdC5fZ2MmJnQuX2VuYWJsZWQoITAsITApLHM9dGhpcy5fbGFzdCx0aGlzLl9zb3J0Q2hpbGRyZW4pZm9yKG49dC5fc3RhcnRUaW1lO3MmJnMuX3N0YXJ0VGltZT5uOylzPXMuX3ByZXY7cmV0dXJuIHM/KHQuX25leHQ9cy5fbmV4dCxzLl9uZXh0PXQpOih0Ll9uZXh0PXRoaXMuX2ZpcnN0LHRoaXMuX2ZpcnN0PXQpLHQuX25leHQ/dC5fbmV4dC5fcHJldj10OnRoaXMuX2xhc3Q9dCx0Ll9wcmV2PXMsdGhpcy5fcmVjZW50PXQsdGhpcy5fdGltZWxpbmUmJnRoaXMuX3VuY2FjaGUoITApLHRoaXN9LF8uX3JlbW92ZT1mdW5jdGlvbih0LGUpe3JldHVybiB0LnRpbWVsaW5lPT09dGhpcyYmKGV8fHQuX2VuYWJsZWQoITEsITApLHQuX3ByZXY/dC5fcHJldi5fbmV4dD10Ll9uZXh0OnRoaXMuX2ZpcnN0PT09dCYmKHRoaXMuX2ZpcnN0PXQuX25leHQpLHQuX25leHQ/dC5fbmV4dC5fcHJldj10Ll9wcmV2OnRoaXMuX2xhc3Q9PT10JiYodGhpcy5fbGFzdD10Ll9wcmV2KSx0Ll9uZXh0PXQuX3ByZXY9dC50aW1lbGluZT1udWxsLHQ9PT10aGlzLl9yZWNlbnQmJih0aGlzLl9yZWNlbnQ9dGhpcy5fbGFzdCksdGhpcy5fdGltZWxpbmUmJnRoaXMuX3VuY2FjaGUoITApKSx0aGlzfSxfLnJlbmRlcj1mdW5jdGlvbih0LGUsaSl7dmFyIHIscz10aGlzLl9maXJzdDtmb3IodGhpcy5fdG90YWxUaW1lPXRoaXMuX3RpbWU9dGhpcy5fcmF3UHJldlRpbWU9dDtzOylyPXMuX25leHQsKHMuX2FjdGl2ZXx8dD49cy5fc3RhcnRUaW1lJiYhcy5fcGF1c2VkJiYhcy5fZ2MpJiYocy5fcmV2ZXJzZWQ/cy5yZW5kZXIoKHMuX2RpcnR5P3MudG90YWxEdXJhdGlvbigpOnMuX3RvdGFsRHVyYXRpb24pLSh0LXMuX3N0YXJ0VGltZSkqcy5fdGltZVNjYWxlLGUsaSk6cy5yZW5kZXIoKHQtcy5fc3RhcnRUaW1lKSpzLl90aW1lU2NhbGUsZSxpKSkscz1yfSxfLnJhd1RpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gZnx8Yy53YWtlKCksdGhpcy5fdG90YWxUaW1lfTt2YXIgej14KCJUd2VlbkxpdGUiLGZ1bmN0aW9uKHQsZSxyKXtpZihNLmNhbGwodGhpcyxlLHIpLHRoaXMucmVuZGVyPXoucHJvdG90eXBlLnJlbmRlcixudWxsPT10KXRocm93IkNhbm5vdCB0d2VlbiBhIG51bGwgdGFyZ2V0LiI7dGhpcy50YXJnZXQ9dD0ic3RyaW5nIiE9dHlwZW9mIHQ/dDp6LnNlbGVjdG9yKHQpfHx0O3ZhciBzLG4sYSxvPXQuanF1ZXJ5fHx0Lmxlbmd0aCYmdCE9PWkmJnRbMF0mJih0WzBdPT09aXx8dFswXS5ub2RlVHlwZSYmdFswXS5zdHlsZSYmIXQubm9kZVR5cGUpLGw9dGhpcy52YXJzLm92ZXJ3cml0ZTtpZih0aGlzLl9vdmVyd3JpdGU9bD1udWxsPT1sP1pbei5kZWZhdWx0T3ZlcndyaXRlXToibnVtYmVyIj09dHlwZW9mIGw/bD4+MDpaW2xdLChvfHx0IGluc3RhbmNlb2YgQXJyYXl8fHQucHVzaCYmdih0KSkmJiJudW1iZXIiIT10eXBlb2YgdFswXSlmb3IodGhpcy5fdGFyZ2V0cz1hPW0odCksdGhpcy5fcHJvcExvb2t1cD1bXSx0aGlzLl9zaWJsaW5ncz1bXSxzPTA7czxhLmxlbmd0aDtzKyspKG49YVtzXSk/InN0cmluZyIhPXR5cGVvZiBuP24ubGVuZ3RoJiZuIT09aSYmblswXSYmKG5bMF09PT1pfHxuWzBdLm5vZGVUeXBlJiZuWzBdLnN0eWxlJiYhbi5ub2RlVHlwZSk/KGEuc3BsaWNlKHMtLSwxKSx0aGlzLl90YXJnZXRzPWE9YS5jb25jYXQobShuKSkpOih0aGlzLl9zaWJsaW5nc1tzXT10dChuLHRoaXMsITEpLDE9PT1sJiZ0aGlzLl9zaWJsaW5nc1tzXS5sZW5ndGg+MSYmaXQobix0aGlzLG51bGwsMSx0aGlzLl9zaWJsaW5nc1tzXSkpOiJzdHJpbmciPT10eXBlb2Yobj1hW3MtLV09ei5zZWxlY3RvcihuKSkmJmEuc3BsaWNlKHMrMSwxKTphLnNwbGljZShzLS0sMSk7ZWxzZSB0aGlzLl9wcm9wTG9va3VwPXt9LHRoaXMuX3NpYmxpbmdzPXR0KHQsdGhpcywhMSksMT09PWwmJnRoaXMuX3NpYmxpbmdzLmxlbmd0aD4xJiZpdCh0LHRoaXMsbnVsbCwxLHRoaXMuX3NpYmxpbmdzKTsodGhpcy52YXJzLmltbWVkaWF0ZVJlbmRlcnx8MD09PWUmJjA9PT10aGlzLl9kZWxheSYmITEhPT10aGlzLnZhcnMuaW1tZWRpYXRlUmVuZGVyKSYmKHRoaXMuX3RpbWU9LTFlLTEwLHRoaXMucmVuZGVyKE1hdGgubWluKDAsLXRoaXMuX2RlbGF5KSkpfSwhMCksST1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGgmJnQhPT1pJiZ0WzBdJiYodFswXT09PWl8fHRbMF0ubm9kZVR5cGUmJnRbMF0uc3R5bGUmJiF0Lm5vZGVUeXBlKX07KF89ei5wcm90b3R5cGU9bmV3IE0pLmNvbnN0cnVjdG9yPXosXy5raWxsKCkuX2djPSExLF8ucmF0aW89MCxfLl9maXJzdFBUPV8uX3RhcmdldHM9Xy5fb3ZlcndyaXR0ZW5Qcm9wcz1fLl9zdGFydEF0PW51bGwsXy5fbm90aWZ5UGx1Z2luc09mRW5hYmxlZD1fLl9sYXp5PSExLHoudmVyc2lvbj0iMi4wLjIiLHouZGVmYXVsdEVhc2U9Xy5fZWFzZT1uZXcgUChudWxsLG51bGwsMSwxKSx6LmRlZmF1bHRPdmVyd3JpdGU9ImF1dG8iLHoudGlja2VyPWMsei5hdXRvU2xlZXA9MTIwLHoubGFnU21vb3RoaW5nPWZ1bmN0aW9uKHQsZSl7Yy5sYWdTbW9vdGhpbmcodCxlKX0sei5zZWxlY3Rvcj1pLiR8fGkualF1ZXJ5fHxmdW5jdGlvbih0KXt2YXIgZT1pLiR8fGkualF1ZXJ5O3JldHVybiBlPyh6LnNlbGVjdG9yPWUsZSh0KSk6KGF8fChhPWkuZG9jdW1lbnQpLGE/YS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbCh0KTphLmdldEVsZW1lbnRCeUlkKCIjIj09PXQuY2hhckF0KDApP3Quc3Vic3RyKDEpOnQpOnQpfTt2YXIgTD1bXSxOPXt9LFg9Lyg/OigtfC09fFwrPSk/XGQqXC4/XGQqKD86ZVtcLStdP1xkKyk/KVswLTldL2dpLEI9L1tcKy1dPS0/W1wuXGRdLyxqPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpPXRoaXMuX2ZpcnN0UFQ7aTspZT1pLmJsb2I/MT09PXQmJm51bGwhPXRoaXMuZW5kP3RoaXMuZW5kOnQ/dGhpcy5qb2luKCIiKTp0aGlzLnN0YXJ0OmkuYyp0K2kucyxpLm0/ZT1pLm0uY2FsbCh0aGlzLl90d2VlbixlLHRoaXMuX3RhcmdldHx8aS50LHRoaXMuX3R3ZWVuKTplPDFlLTYmJmU+LTFlLTYmJiFpLmJsb2ImJihlPTApLGkuZj9pLmZwP2kudFtpLnBdKGkuZnAsZSk6aS50W2kucF0oZSk6aS50W2kucF09ZSxpPWkuX25leHR9LFU9ZnVuY3Rpb24odCxlLGkscil7dmFyIHMsbixhLG8sbCxoLHUsXz1bXSxjPTAsZj0iIixwPTA7Zm9yKF8uc3RhcnQ9dCxfLmVuZD1lLHQ9X1swXT10KyIiLGU9X1sxXT1lKyIiLGkmJihpKF8pLHQ9X1swXSxlPV9bMV0pLF8ubGVuZ3RoPTAscz10Lm1hdGNoKFgpfHxbXSxuPWUubWF0Y2goWCl8fFtdLHImJihyLl9uZXh0PW51bGwsci5ibG9iPTEsXy5fZmlyc3RQVD1fLl9hcHBseVBUPXIpLGw9bi5sZW5ndGgsbz0wO288bDtvKyspdT1uW29dLGYrPShoPWUuc3Vic3RyKGMsZS5pbmRleE9mKHUsYyktYykpfHwhbz9oOiIsIixjKz1oLmxlbmd0aCxwP3A9KHArMSklNToicmdiYSgiPT09aC5zdWJzdHIoLTUpJiYocD0xKSx1PT09c1tvXXx8cy5sZW5ndGg8PW8/Zis9dTooZiYmKF8ucHVzaChmKSxmPSIiKSxhPXBhcnNlRmxvYXQoc1tvXSksXy5wdXNoKGEpLF8uX2ZpcnN0UFQ9e19uZXh0Ol8uX2ZpcnN0UFQsdDpfLHA6Xy5sZW5ndGgtMSxzOmEsYzooIj0iPT09dS5jaGFyQXQoMSk/cGFyc2VJbnQodS5jaGFyQXQoMCkrIjEiLDEwKSpwYXJzZUZsb2F0KHUuc3Vic3RyKDIpKTpwYXJzZUZsb2F0KHUpLWEpfHwwLGY6MCxtOnAmJnA8ND9NYXRoLnJvdW5kOjB9KSxjKz11Lmxlbmd0aDtyZXR1cm4oZis9ZS5zdWJzdHIoYykpJiZfLnB1c2goZiksXy5zZXRSYXRpbz1qLEIudGVzdChlKSYmKF8uZW5kPW51bGwpLF99LFk9ZnVuY3Rpb24odCxlLGkscixzLG4sYSxvLGwpeyJmdW5jdGlvbiI9PXR5cGVvZiByJiYocj1yKGx8fDAsdCkpO3ZhciBoPXR5cGVvZiB0W2VdLHU9ImZ1bmN0aW9uIiE9PWg/IiI6ZS5pbmRleE9mKCJzZXQiKXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRbImdldCIrZS5zdWJzdHIoMyldP2U6ImdldCIrZS5zdWJzdHIoMyksXz0iZ2V0IiE9PWk/aTp1P2E/dFt1XShhKTp0W3VdKCk6dFtlXSxjPSJzdHJpbmciPT10eXBlb2YgciYmIj0iPT09ci5jaGFyQXQoMSksZj17dDp0LHA6ZSxzOl8sZjoiZnVuY3Rpb24iPT09aCxwZzowLG46c3x8ZSxtOm4/ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpNYXRoLnJvdW5kOjAscHI6MCxjOmM/cGFyc2VJbnQoci5jaGFyQXQoMCkrIjEiLDEwKSpwYXJzZUZsb2F0KHIuc3Vic3RyKDIpKTpwYXJzZUZsb2F0KHIpLV98fDB9O2lmKCgibnVtYmVyIiE9dHlwZW9mIF98fCJudW1iZXIiIT10eXBlb2YgciYmIWMpJiYoYXx8aXNOYU4oXyl8fCFjJiZpc05hTihyKXx8ImJvb2xlYW4iPT10eXBlb2YgX3x8ImJvb2xlYW4iPT10eXBlb2Ygcj8oZi5mcD1hLGY9e3Q6VShfLGM/cGFyc2VGbG9hdChmLnMpK2YuYysoZi5zKyIiKS5yZXBsYWNlKC9bMC05XC1cLl0vZywiIik6cixvfHx6LmRlZmF1bHRTdHJpbmdGaWx0ZXIsZikscDoic2V0UmF0aW8iLHM6MCxjOjEsZjoyLHBnOjAsbjpzfHxlLHByOjAsbTowfSk6KGYucz1wYXJzZUZsb2F0KF8pLGN8fChmLmM9cGFyc2VGbG9hdChyKS1mLnN8fDApKSksZi5jKXJldHVybihmLl9uZXh0PXRoaXMuX2ZpcnN0UFQpJiYoZi5fbmV4dC5fcHJldj1mKSx0aGlzLl9maXJzdFBUPWYsZn0sVj16Ll9pbnRlcm5hbHM9e2lzQXJyYXk6dixpc1NlbGVjdG9yOkksbGF6eVR3ZWVuczpMLGJsb2JEaWY6VX0sRz16Ll9wbHVnaW5zPXt9LHE9Vi50d2Vlbkxvb2t1cD17fSxXPTAsSD1WLnJlc2VydmVkUHJvcHM9e2Vhc2U6MSxkZWxheToxLG92ZXJ3cml0ZToxLG9uQ29tcGxldGU6MSxvbkNvbXBsZXRlUGFyYW1zOjEsb25Db21wbGV0ZVNjb3BlOjEsdXNlRnJhbWVzOjEscnVuQmFja3dhcmRzOjEsc3RhcnRBdDoxLG9uVXBkYXRlOjEsb25VcGRhdGVQYXJhbXM6MSxvblVwZGF0ZVNjb3BlOjEsb25TdGFydDoxLG9uU3RhcnRQYXJhbXM6MSxvblN0YXJ0U2NvcGU6MSxvblJldmVyc2VDb21wbGV0ZToxLG9uUmV2ZXJzZUNvbXBsZXRlUGFyYW1zOjEsb25SZXZlcnNlQ29tcGxldGVTY29wZToxLG9uUmVwZWF0OjEsb25SZXBlYXRQYXJhbXM6MSxvblJlcGVhdFNjb3BlOjEsZWFzZVBhcmFtczoxLHlveW86MSxpbW1lZGlhdGVSZW5kZXI6MSxyZXBlYXQ6MSxyZXBlYXREZWxheToxLGRhdGE6MSxwYXVzZWQ6MSxyZXZlcnNlZDoxLGF1dG9DU1M6MSxsYXp5OjEsb25PdmVyd3JpdGU6MSxjYWxsYmFja1Njb3BlOjEsc3RyaW5nRmlsdGVyOjEsaWQ6MSx5b3lvRWFzZToxfSxaPXtub25lOjAsYWxsOjEsYXV0bzoyLGNvbmN1cnJlbnQ6MyxhbGxPblN0YXJ0OjQscHJlZXhpc3Rpbmc6NSx0cnVlOjEsZmFsc2U6MH0sJD1NLl9yb290RnJhbWVzVGltZWxpbmU9bmV3IEYsUT1NLl9yb290VGltZWxpbmU9bmV3IEYsSz0zMCxKPVYubGF6eVJlbmRlcj1mdW5jdGlvbigpe3ZhciB0LGU9TC5sZW5ndGg7Zm9yKE49e307LS1lPi0xOykodD1MW2VdKSYmITEhPT10Ll9sYXp5JiYodC5yZW5kZXIodC5fbGF6eVswXSx0Ll9sYXp5WzFdLCEwKSx0Ll9sYXp5PSExKTtMLmxlbmd0aD0wfTtRLl9zdGFydFRpbWU9Yy50aW1lLCQuX3N0YXJ0VGltZT1jLmZyYW1lLFEuX2FjdGl2ZT0kLl9hY3RpdmU9ITAsc2V0VGltZW91dChKLDEpLE0uX3VwZGF0ZVJvb3Q9ei5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdCxlLGk7aWYoTC5sZW5ndGgmJkooKSxRLnJlbmRlcigoYy50aW1lLVEuX3N0YXJ0VGltZSkqUS5fdGltZVNjYWxlLCExLCExKSwkLnJlbmRlcigoYy5mcmFtZS0kLl9zdGFydFRpbWUpKiQuX3RpbWVTY2FsZSwhMSwhMSksTC5sZW5ndGgmJkooKSxjLmZyYW1lPj1LKXtmb3IoaSBpbiBLPWMuZnJhbWUrKHBhcnNlSW50KHouYXV0b1NsZWVwLDEwKXx8MTIwKSxxKXtmb3IodD0oZT1xW2ldLnR3ZWVucykubGVuZ3RoOy0tdD4tMTspZVt0XS5fZ2MmJmUuc3BsaWNlKHQsMSk7MD09PWUubGVuZ3RoJiZkZWxldGUgcVtpXX1pZigoIShpPVEuX2ZpcnN0KXx8aS5fcGF1c2VkKSYmei5hdXRvU2xlZXAmJiEkLl9maXJzdCYmMT09PWMuX2xpc3RlbmVycy50aWNrLmxlbmd0aCl7Zm9yKDtpJiZpLl9wYXVzZWQ7KWk9aS5fbmV4dDtpfHxjLnNsZWVwKCl9fX0sYy5hZGRFdmVudExpc3RlbmVyKCJ0aWNrIixNLl91cGRhdGVSb290KTt2YXIgdHQ9ZnVuY3Rpb24odCxlLGkpe3ZhciByLHMsbj10Ll9nc1R3ZWVuSUQ7aWYocVtufHwodC5fZ3NUd2VlbklEPW49InQiK1crKyldfHwocVtuXT17dGFyZ2V0OnQsdHdlZW5zOltdfSksZSYmKChyPXFbbl0udHdlZW5zKVtzPXIubGVuZ3RoXT1lLGkpKWZvcig7LS1zPi0xOylyW3NdPT09ZSYmci5zcGxpY2UocywxKTtyZXR1cm4gcVtuXS50d2VlbnN9LGV0PWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBzLG4sYT10LnZhcnMub25PdmVyd3JpdGU7cmV0dXJuIGEmJihzPWEodCxlLGkscikpLChhPXoub25PdmVyd3JpdGUpJiYobj1hKHQsZSxpLHIpKSwhMSE9PXMmJiExIT09bn0saXQ9ZnVuY3Rpb24odCxlLGkscixzKXt2YXIgbixhLG8sbDtpZigxPT09cnx8cj49NCl7Zm9yKGw9cy5sZW5ndGgsbj0wO248bDtuKyspaWYoKG89c1tuXSkhPT1lKW8uX2djfHxvLl9raWxsKG51bGwsdCxlKSYmKGE9ITApO2Vsc2UgaWYoNT09PXIpYnJlYWs7cmV0dXJuIGF9dmFyIGgsdT1lLl9zdGFydFRpbWUrMWUtMTAsXz1bXSxjPTAsZj0wPT09ZS5fZHVyYXRpb247Zm9yKG49cy5sZW5ndGg7LS1uPi0xOykobz1zW25dKT09PWV8fG8uX2djfHxvLl9wYXVzZWR8fChvLl90aW1lbGluZSE9PWUuX3RpbWVsaW5lPyhoPWh8fHJ0KGUsMCxmKSwwPT09cnQobyxoLGYpJiYoX1tjKytdPW8pKTpvLl9zdGFydFRpbWU8PXUmJm8uX3N0YXJ0VGltZStvLnRvdGFsRHVyYXRpb24oKS9vLl90aW1lU2NhbGU+dSYmKChmfHwhby5faW5pdHRlZCkmJnUtby5fc3RhcnRUaW1lPD0yZS0xMHx8KF9bYysrXT1vKSkpO2ZvcihuPWM7LS1uPi0xOylpZihsPShvPV9bbl0pLl9maXJzdFBULDI9PT1yJiZvLl9raWxsKGksdCxlKSYmKGE9ITApLDIhPT1yfHwhby5fZmlyc3RQVCYmby5faW5pdHRlZCYmbCl7aWYoMiE9PXImJiFldChvLGUpKWNvbnRpbnVlO28uX2VuYWJsZWQoITEsITEpJiYoYT0hMCl9cmV0dXJuIGF9LHJ0PWZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIHI9dC5fdGltZWxpbmUscz1yLl90aW1lU2NhbGUsbj10Ll9zdGFydFRpbWU7ci5fdGltZWxpbmU7KXtpZihuKz1yLl9zdGFydFRpbWUscyo9ci5fdGltZVNjYWxlLHIuX3BhdXNlZClyZXR1cm4tMTAwO3I9ci5fdGltZWxpbmV9cmV0dXJuKG4vPXMpPmU/bi1lOmkmJm49PT1lfHwhdC5faW5pdHRlZCYmbi1lPDJlLTEwPzFlLTEwOihuKz10LnRvdGFsRHVyYXRpb24oKS90Ll90aW1lU2NhbGUvcyk+ZSsxZS0xMD8wOm4tZS0xZS0xMH07Xy5faW5pdD1mdW5jdGlvbigpe3ZhciB0LGUsaSxyLHMsbixhPXRoaXMudmFycyxvPXRoaXMuX292ZXJ3cml0dGVuUHJvcHMsbD10aGlzLl9kdXJhdGlvbixoPSEhYS5pbW1lZGlhdGVSZW5kZXIsdT1hLmVhc2U7aWYoYS5zdGFydEF0KXtmb3IociBpbiB0aGlzLl9zdGFydEF0JiYodGhpcy5fc3RhcnRBdC5yZW5kZXIoLTEsITApLHRoaXMuX3N0YXJ0QXQua2lsbCgpKSxzPXt9LGEuc3RhcnRBdClzW3JdPWEuc3RhcnRBdFtyXTtpZihzLmRhdGE9ImlzU3RhcnQiLHMub3ZlcndyaXRlPSExLHMuaW1tZWRpYXRlUmVuZGVyPSEwLHMubGF6eT1oJiYhMSE9PWEubGF6eSxzLnN0YXJ0QXQ9cy5kZWxheT1udWxsLHMub25VcGRhdGU9YS5vblVwZGF0ZSxzLm9uVXBkYXRlUGFyYW1zPWEub25VcGRhdGVQYXJhbXMscy5vblVwZGF0ZVNjb3BlPWEub25VcGRhdGVTY29wZXx8YS5jYWxsYmFja1Njb3BlfHx0aGlzLHRoaXMuX3N0YXJ0QXQ9ei50byh0aGlzLnRhcmdldHx8e30sMCxzKSxoKWlmKHRoaXMuX3RpbWU+MCl0aGlzLl9zdGFydEF0PW51bGw7ZWxzZSBpZigwIT09bClyZXR1cm59ZWxzZSBpZihhLnJ1bkJhY2t3YXJkcyYmMCE9PWwpaWYodGhpcy5fc3RhcnRBdCl0aGlzLl9zdGFydEF0LnJlbmRlcigtMSwhMCksdGhpcy5fc3RhcnRBdC5raWxsKCksdGhpcy5fc3RhcnRBdD1udWxsO2Vsc2V7Zm9yKHIgaW4gMCE9PXRoaXMuX3RpbWUmJihoPSExKSxpPXt9LGEpSFtyXSYmImF1dG9DU1MiIT09cnx8KGlbcl09YVtyXSk7aWYoaS5vdmVyd3JpdGU9MCxpLmRhdGE9ImlzRnJvbVN0YXJ0IixpLmxhenk9aCYmITEhPT1hLmxhenksaS5pbW1lZGlhdGVSZW5kZXI9aCx0aGlzLl9zdGFydEF0PXoudG8odGhpcy50YXJnZXQsMCxpKSxoKXtpZigwPT09dGhpcy5fdGltZSlyZXR1cm59ZWxzZSB0aGlzLl9zdGFydEF0Ll9pbml0KCksdGhpcy5fc3RhcnRBdC5fZW5hYmxlZCghMSksdGhpcy52YXJzLmltbWVkaWF0ZVJlbmRlciYmKHRoaXMuX3N0YXJ0QXQ9bnVsbCl9aWYodGhpcy5fZWFzZT11PXU/dSBpbnN0YW5jZW9mIFA/dToiZnVuY3Rpb24iPT10eXBlb2YgdT9uZXcgUCh1LGEuZWFzZVBhcmFtcyk6U1t1XXx8ei5kZWZhdWx0RWFzZTp6LmRlZmF1bHRFYXNlLGEuZWFzZVBhcmFtcyBpbnN0YW5jZW9mIEFycmF5JiZ1LmNvbmZpZyYmKHRoaXMuX2Vhc2U9dS5jb25maWcuYXBwbHkodSxhLmVhc2VQYXJhbXMpKSx0aGlzLl9lYXNlVHlwZT10aGlzLl9lYXNlLl90eXBlLHRoaXMuX2Vhc2VQb3dlcj10aGlzLl9lYXNlLl9wb3dlcix0aGlzLl9maXJzdFBUPW51bGwsdGhpcy5fdGFyZ2V0cylmb3Iobj10aGlzLl90YXJnZXRzLmxlbmd0aCx0PTA7dDxuO3QrKyl0aGlzLl9pbml0UHJvcHModGhpcy5fdGFyZ2V0c1t0XSx0aGlzLl9wcm9wTG9va3VwW3RdPXt9LHRoaXMuX3NpYmxpbmdzW3RdLG8/b1t0XTpudWxsLHQpJiYoZT0hMCk7ZWxzZSBlPXRoaXMuX2luaXRQcm9wcyh0aGlzLnRhcmdldCx0aGlzLl9wcm9wTG9va3VwLHRoaXMuX3NpYmxpbmdzLG8sMCk7aWYoZSYmei5fb25QbHVnaW5FdmVudCgiX29uSW5pdEFsbFByb3BzIix0aGlzKSxvJiYodGhpcy5fZmlyc3RQVHx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXMudGFyZ2V0JiZ0aGlzLl9lbmFibGVkKCExLCExKSksYS5ydW5CYWNrd2FyZHMpZm9yKGk9dGhpcy5fZmlyc3RQVDtpOylpLnMrPWkuYyxpLmM9LWkuYyxpPWkuX25leHQ7dGhpcy5fb25VcGRhdGU9YS5vblVwZGF0ZSx0aGlzLl9pbml0dGVkPSEwfSxfLl9pbml0UHJvcHM9ZnVuY3Rpb24odCxlLHIscyxuKXt2YXIgYSxvLGwsaCx1LF87aWYobnVsbD09dClyZXR1cm4hMTtmb3IoYSBpbiBOW3QuX2dzVHdlZW5JRF0mJkooKSx0aGlzLnZhcnMuY3NzfHx0LnN0eWxlJiZ0IT09aSYmdC5ub2RlVHlwZSYmRy5jc3MmJiExIT09dGhpcy52YXJzLmF1dG9DU1MmJmZ1bmN0aW9uKHQsZSl7dmFyIGkscj17fTtmb3IoaSBpbiB0KUhbaV18fGkgaW4gZSYmInRyYW5zZm9ybSIhPT1pJiYieCIhPT1pJiYieSIhPT1pJiYid2lkdGgiIT09aSYmImhlaWdodCIhPT1pJiYiY2xhc3NOYW1lIiE9PWkmJiJib3JkZXIiIT09aXx8ISghR1tpXXx8R1tpXSYmR1tpXS5fYXV0b0NTUyl8fChyW2ldPXRbaV0sZGVsZXRlIHRbaV0pO3QuY3NzPXJ9KHRoaXMudmFycyx0KSx0aGlzLnZhcnMpaWYoXz10aGlzLnZhcnNbYV0sSFthXSlfJiYoXyBpbnN0YW5jZW9mIEFycmF5fHxfLnB1c2gmJnYoXykpJiYtMSE9PV8uam9pbigiIikuaW5kZXhPZigie3NlbGZ9IikmJih0aGlzLnZhcnNbYV09Xz10aGlzLl9zd2FwU2VsZkluUGFyYW1zKF8sdGhpcykpO2Vsc2UgaWYoR1thXSYmKGg9bmV3IEdbYV0pLl9vbkluaXRUd2Vlbih0LHRoaXMudmFyc1thXSx0aGlzLG4pKXtmb3IodGhpcy5fZmlyc3RQVD11PXtfbmV4dDp0aGlzLl9maXJzdFBULHQ6aCxwOiJzZXRSYXRpbyIsczowLGM6MSxmOjEsbjphLHBnOjEscHI6aC5fcHJpb3JpdHksbTowfSxvPWguX292ZXJ3cml0ZVByb3BzLmxlbmd0aDstLW8+LTE7KWVbaC5fb3ZlcndyaXRlUHJvcHNbb11dPXRoaXMuX2ZpcnN0UFQ7KGguX3ByaW9yaXR5fHxoLl9vbkluaXRBbGxQcm9wcykmJihsPSEwKSwoaC5fb25EaXNhYmxlfHxoLl9vbkVuYWJsZSkmJih0aGlzLl9ub3RpZnlQbHVnaW5zT2ZFbmFibGVkPSEwKSx1Ll9uZXh0JiYodS5fbmV4dC5fcHJldj11KX1lbHNlIGVbYV09WS5jYWxsKHRoaXMsdCxhLCJnZXQiLF8sYSwwLG51bGwsdGhpcy52YXJzLnN0cmluZ0ZpbHRlcixuKTtyZXR1cm4gcyYmdGhpcy5fa2lsbChzLHQpP3RoaXMuX2luaXRQcm9wcyh0LGUscixzLG4pOnRoaXMuX292ZXJ3cml0ZT4xJiZ0aGlzLl9maXJzdFBUJiZyLmxlbmd0aD4xJiZpdCh0LHRoaXMsZSx0aGlzLl9vdmVyd3JpdGUscik/KHRoaXMuX2tpbGwoZSx0KSx0aGlzLl9pbml0UHJvcHModCxlLHIscyxuKSk6KHRoaXMuX2ZpcnN0UFQmJighMSE9PXRoaXMudmFycy5sYXp5JiZ0aGlzLl9kdXJhdGlvbnx8dGhpcy52YXJzLmxhenkmJiF0aGlzLl9kdXJhdGlvbikmJihOW3QuX2dzVHdlZW5JRF09ITApLGwpfSxfLnJlbmRlcj1mdW5jdGlvbih0LGUsaSl7dmFyIHIscyxuLGEsbz10aGlzLl90aW1lLGw9dGhpcy5fZHVyYXRpb24saD10aGlzLl9yYXdQcmV2VGltZTtpZih0Pj1sLTFlLTcmJnQ+PTApdGhpcy5fdG90YWxUaW1lPXRoaXMuX3RpbWU9bCx0aGlzLnJhdGlvPXRoaXMuX2Vhc2UuX2NhbGNFbmQ/dGhpcy5fZWFzZS5nZXRSYXRpbygxKToxLHRoaXMuX3JldmVyc2VkfHwocj0hMCxzPSJvbkNvbXBsZXRlIixpPWl8fHRoaXMuX3RpbWVsaW5lLmF1dG9SZW1vdmVDaGlsZHJlbiksMD09PWwmJih0aGlzLl9pbml0dGVkfHwhdGhpcy52YXJzLmxhenl8fGkpJiYodGhpcy5fc3RhcnRUaW1lPT09dGhpcy5fdGltZWxpbmUuX2R1cmF0aW9uJiYodD0wKSwoaDwwfHx0PD0wJiZ0Pj0tMWUtN3x8MWUtMTA9PT1oJiYiaXNQYXVzZSIhPT10aGlzLmRhdGEpJiZoIT09dCYmKGk9ITAsaD4xZS0xMCYmKHM9Im9uUmV2ZXJzZUNvbXBsZXRlIikpLHRoaXMuX3Jhd1ByZXZUaW1lPWE9IWV8fHR8fGg9PT10P3Q6MWUtMTApO2Vsc2UgaWYodDwxZS03KXRoaXMuX3RvdGFsVGltZT10aGlzLl90aW1lPTAsdGhpcy5yYXRpbz10aGlzLl9lYXNlLl9jYWxjRW5kP3RoaXMuX2Vhc2UuZ2V0UmF0aW8oMCk6MCwoMCE9PW98fDA9PT1sJiZoPjApJiYocz0ib25SZXZlcnNlQ29tcGxldGUiLHI9dGhpcy5fcmV2ZXJzZWQpLHQ8MCYmKHRoaXMuX2FjdGl2ZT0hMSwwPT09bCYmKHRoaXMuX2luaXR0ZWR8fCF0aGlzLnZhcnMubGF6eXx8aSkmJihoPj0wJiYoMWUtMTAhPT1ofHwiaXNQYXVzZSIhPT10aGlzLmRhdGEpJiYoaT0hMCksdGhpcy5fcmF3UHJldlRpbWU9YT0hZXx8dHx8aD09PXQ/dDoxZS0xMCkpLCghdGhpcy5faW5pdHRlZHx8dGhpcy5fc3RhcnRBdCYmdGhpcy5fc3RhcnRBdC5wcm9ncmVzcygpKSYmKGk9ITApO2Vsc2UgaWYodGhpcy5fdG90YWxUaW1lPXRoaXMuX3RpbWU9dCx0aGlzLl9lYXNlVHlwZSl7dmFyIHU9dC9sLF89dGhpcy5fZWFzZVR5cGUsYz10aGlzLl9lYXNlUG93ZXI7KDE9PT1ffHwzPT09XyYmdT49LjUpJiYodT0xLXUpLDM9PT1fJiYodSo9MiksMT09PWM/dSo9dToyPT09Yz91Kj11KnU6Mz09PWM/dSo9dSp1KnU6ND09PWMmJih1Kj11KnUqdSp1KSx0aGlzLnJhdGlvPTE9PT1fPzEtdToyPT09Xz91OnQvbDwuNT91LzI6MS11LzJ9ZWxzZSB0aGlzLnJhdGlvPXRoaXMuX2Vhc2UuZ2V0UmF0aW8odC9sKTtpZih0aGlzLl90aW1lIT09b3x8aSl7aWYoIXRoaXMuX2luaXR0ZWQpe2lmKHRoaXMuX2luaXQoKSwhdGhpcy5faW5pdHRlZHx8dGhpcy5fZ2MpcmV0dXJuO2lmKCFpJiZ0aGlzLl9maXJzdFBUJiYoITEhPT10aGlzLnZhcnMubGF6eSYmdGhpcy5fZHVyYXRpb258fHRoaXMudmFycy5sYXp5JiYhdGhpcy5fZHVyYXRpb24pKXJldHVybiB0aGlzLl90aW1lPXRoaXMuX3RvdGFsVGltZT1vLHRoaXMuX3Jhd1ByZXZUaW1lPWgsTC5wdXNoKHRoaXMpLHZvaWQodGhpcy5fbGF6eT1bdCxlXSk7dGhpcy5fdGltZSYmIXI/dGhpcy5yYXRpbz10aGlzLl9lYXNlLmdldFJhdGlvKHRoaXMuX3RpbWUvbCk6ciYmdGhpcy5fZWFzZS5fY2FsY0VuZCYmKHRoaXMucmF0aW89dGhpcy5fZWFzZS5nZXRSYXRpbygwPT09dGhpcy5fdGltZT8wOjEpKX1mb3IoITEhPT10aGlzLl9sYXp5JiYodGhpcy5fbGF6eT0hMSksdGhpcy5fYWN0aXZlfHwhdGhpcy5fcGF1c2VkJiZ0aGlzLl90aW1lIT09byYmdD49MCYmKHRoaXMuX2FjdGl2ZT0hMCksMD09PW8mJih0aGlzLl9zdGFydEF0JiYodD49MD90aGlzLl9zdGFydEF0LnJlbmRlcih0LCEwLGkpOnN8fChzPSJfZHVtbXlHUyIpKSx0aGlzLnZhcnMub25TdGFydCYmKDA9PT10aGlzLl90aW1lJiYwIT09bHx8ZXx8dGhpcy5fY2FsbGJhY2soIm9uU3RhcnQiKSkpLG49dGhpcy5fZmlyc3RQVDtuOyluLmY/bi50W24ucF0obi5jKnRoaXMucmF0aW8rbi5zKTpuLnRbbi5wXT1uLmMqdGhpcy5yYXRpbytuLnMsbj1uLl9uZXh0O3RoaXMuX29uVXBkYXRlJiYodDwwJiZ0aGlzLl9zdGFydEF0JiYtMWUtNCE9PXQmJnRoaXMuX3N0YXJ0QXQucmVuZGVyKHQsITAsaSksZXx8KHRoaXMuX3RpbWUhPT1vfHxyfHxpKSYmdGhpcy5fY2FsbGJhY2soIm9uVXBkYXRlIikpLHMmJih0aGlzLl9nYyYmIWl8fCh0PDAmJnRoaXMuX3N0YXJ0QXQmJiF0aGlzLl9vblVwZGF0ZSYmLTFlLTQhPT10JiZ0aGlzLl9zdGFydEF0LnJlbmRlcih0LCEwLGkpLHImJih0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4mJnRoaXMuX2VuYWJsZWQoITEsITEpLHRoaXMuX2FjdGl2ZT0hMSksIWUmJnRoaXMudmFyc1tzXSYmdGhpcy5fY2FsbGJhY2socyksMD09PWwmJjFlLTEwPT09dGhpcy5fcmF3UHJldlRpbWUmJjFlLTEwIT09YSYmKHRoaXMuX3Jhd1ByZXZUaW1lPTApKSl9fSxfLl9raWxsPWZ1bmN0aW9uKHQsZSxpKXtpZigiYWxsIj09PXQmJih0PW51bGwpLG51bGw9PXQmJihudWxsPT1lfHxlPT09dGhpcy50YXJnZXQpKXJldHVybiB0aGlzLl9sYXp5PSExLHRoaXMuX2VuYWJsZWQoITEsITEpO2U9InN0cmluZyIhPXR5cGVvZiBlP2V8fHRoaXMuX3RhcmdldHN8fHRoaXMudGFyZ2V0Onouc2VsZWN0b3IoZSl8fGU7dmFyIHIscyxuLGEsbyxsLGgsdSxfLGM9aSYmdGhpcy5fdGltZSYmaS5fc3RhcnRUaW1lPT09dGhpcy5fc3RhcnRUaW1lJiZ0aGlzLl90aW1lbGluZT09PWkuX3RpbWVsaW5lLGY9dGhpcy5fZmlyc3RQVDtpZigodihlKXx8SShlKSkmJiJudW1iZXIiIT10eXBlb2YgZVswXSlmb3Iocj1lLmxlbmd0aDstLXI+LTE7KXRoaXMuX2tpbGwodCxlW3JdLGkpJiYobD0hMCk7ZWxzZXtpZih0aGlzLl90YXJnZXRzKXtmb3Iocj10aGlzLl90YXJnZXRzLmxlbmd0aDstLXI+LTE7KWlmKGU9PT10aGlzLl90YXJnZXRzW3JdKXtvPXRoaXMuX3Byb3BMb29rdXBbcl18fHt9LHRoaXMuX292ZXJ3cml0dGVuUHJvcHM9dGhpcy5fb3ZlcndyaXR0ZW5Qcm9wc3x8W10scz10aGlzLl9vdmVyd3JpdHRlblByb3BzW3JdPXQ/dGhpcy5fb3ZlcndyaXR0ZW5Qcm9wc1tyXXx8e306ImFsbCI7YnJlYWt9fWVsc2V7aWYoZSE9PXRoaXMudGFyZ2V0KXJldHVybiExO289dGhpcy5fcHJvcExvb2t1cCxzPXRoaXMuX292ZXJ3cml0dGVuUHJvcHM9dD90aGlzLl9vdmVyd3JpdHRlblByb3BzfHx7fToiYWxsIn1pZihvKXtpZihoPXR8fG8sdT10IT09cyYmImFsbCIhPT1zJiZ0IT09byYmKCJvYmplY3QiIT10eXBlb2YgdHx8IXQuX3RlbXBLaWxsKSxpJiYoei5vbk92ZXJ3cml0ZXx8dGhpcy52YXJzLm9uT3ZlcndyaXRlKSl7Zm9yKG4gaW4gaClvW25dJiYoX3x8KF89W10pLF8ucHVzaChuKSk7aWYoKF98fCF0KSYmIWV0KHRoaXMsaSxlLF8pKXJldHVybiExfWZvcihuIGluIGgpKGE9b1tuXSkmJihjJiYoYS5mP2EudFthLnBdKGEucyk6YS50W2EucF09YS5zLGw9ITApLGEucGcmJmEudC5fa2lsbChoKSYmKGw9ITApLGEucGcmJjAhPT1hLnQuX292ZXJ3cml0ZVByb3BzLmxlbmd0aHx8KGEuX3ByZXY/YS5fcHJldi5fbmV4dD1hLl9uZXh0OmE9PT10aGlzLl9maXJzdFBUJiYodGhpcy5fZmlyc3RQVD1hLl9uZXh0KSxhLl9uZXh0JiYoYS5fbmV4dC5fcHJldj1hLl9wcmV2KSxhLl9uZXh0PWEuX3ByZXY9bnVsbCksZGVsZXRlIG9bbl0pLHUmJihzW25dPTEpOyF0aGlzLl9maXJzdFBUJiZ0aGlzLl9pbml0dGVkJiZmJiZ0aGlzLl9lbmFibGVkKCExLCExKX19cmV0dXJuIGx9LF8uaW52YWxpZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub3RpZnlQbHVnaW5zT2ZFbmFibGVkJiZ6Ll9vblBsdWdpbkV2ZW50KCJfb25EaXNhYmxlIix0aGlzKSx0aGlzLl9maXJzdFBUPXRoaXMuX292ZXJ3cml0dGVuUHJvcHM9dGhpcy5fc3RhcnRBdD10aGlzLl9vblVwZGF0ZT1udWxsLHRoaXMuX25vdGlmeVBsdWdpbnNPZkVuYWJsZWQ9dGhpcy5fYWN0aXZlPXRoaXMuX2xhenk9ITEsdGhpcy5fcHJvcExvb2t1cD10aGlzLl90YXJnZXRzP3t9OltdLE0ucHJvdG90eXBlLmludmFsaWRhdGUuY2FsbCh0aGlzKSx0aGlzLnZhcnMuaW1tZWRpYXRlUmVuZGVyJiYodGhpcy5fdGltZT0tMWUtMTAsdGhpcy5yZW5kZXIoTWF0aC5taW4oMCwtdGhpcy5fZGVsYXkpKSksdGhpc30sXy5fZW5hYmxlZD1mdW5jdGlvbih0LGUpe2lmKGZ8fGMud2FrZSgpLHQmJnRoaXMuX2djKXt2YXIgaSxyPXRoaXMuX3RhcmdldHM7aWYocilmb3IoaT1yLmxlbmd0aDstLWk+LTE7KXRoaXMuX3NpYmxpbmdzW2ldPXR0KHJbaV0sdGhpcywhMCk7ZWxzZSB0aGlzLl9zaWJsaW5ncz10dCh0aGlzLnRhcmdldCx0aGlzLCEwKX1yZXR1cm4gTS5wcm90b3R5cGUuX2VuYWJsZWQuY2FsbCh0aGlzLHQsZSksISghdGhpcy5fbm90aWZ5UGx1Z2luc09mRW5hYmxlZHx8IXRoaXMuX2ZpcnN0UFQpJiZ6Ll9vblBsdWdpbkV2ZW50KHQ/Il9vbkVuYWJsZSI6Il9vbkRpc2FibGUiLHRoaXMpfSx6LnRvPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbmV3IHoodCxlLGkpfSx6LmZyb209ZnVuY3Rpb24odCxlLGkpe3JldHVybiBpLnJ1bkJhY2t3YXJkcz0hMCxpLmltbWVkaWF0ZVJlbmRlcj0wIT1pLmltbWVkaWF0ZVJlbmRlcixuZXcgeih0LGUsaSl9LHouZnJvbVRvPWZ1bmN0aW9uKHQsZSxpLHIpe3JldHVybiByLnN0YXJ0QXQ9aSxyLmltbWVkaWF0ZVJlbmRlcj0wIT1yLmltbWVkaWF0ZVJlbmRlciYmMCE9aS5pbW1lZGlhdGVSZW5kZXIsbmV3IHoodCxlLHIpfSx6LmRlbGF5ZWRDYWxsPWZ1bmN0aW9uKHQsZSxpLHIscyl7cmV0dXJuIG5ldyB6KGUsMCx7ZGVsYXk6dCxvbkNvbXBsZXRlOmUsb25Db21wbGV0ZVBhcmFtczppLGNhbGxiYWNrU2NvcGU6cixvblJldmVyc2VDb21wbGV0ZTplLG9uUmV2ZXJzZUNvbXBsZXRlUGFyYW1zOmksaW1tZWRpYXRlUmVuZGVyOiExLGxhenk6ITEsdXNlRnJhbWVzOnMsb3ZlcndyaXRlOjB9KX0sei5zZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHoodCwwLGUpfSx6LmdldFR3ZWVuc09mPWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dClyZXR1cm5bXTt2YXIgaSxyLHMsbjtpZih0PSJzdHJpbmciIT10eXBlb2YgdD90Onouc2VsZWN0b3IodCl8fHQsKHYodCl8fEkodCkpJiYibnVtYmVyIiE9dHlwZW9mIHRbMF0pe2ZvcihpPXQubGVuZ3RoLHI9W107LS1pPi0xOylyPXIuY29uY2F0KHouZ2V0VHdlZW5zT2YodFtpXSxlKSk7Zm9yKGk9ci5sZW5ndGg7LS1pPi0xOylmb3Iobj1yW2ldLHM9aTstLXM+LTE7KW49PT1yW3NdJiZyLnNwbGljZShpLDEpfWVsc2UgaWYodC5fZ3NUd2VlbklEKWZvcihpPShyPXR0KHQpLmNvbmNhdCgpKS5sZW5ndGg7LS1pPi0xOykocltpXS5fZ2N8fGUmJiFyW2ldLmlzQWN0aXZlKCkpJiZyLnNwbGljZShpLDEpO3JldHVybiByfHxbXX0sei5raWxsVHdlZW5zT2Y9ei5raWxsRGVsYXllZENhbGxzVG89ZnVuY3Rpb24odCxlLGkpeyJvYmplY3QiPT10eXBlb2YgZSYmKGk9ZSxlPSExKTtmb3IodmFyIHI9ei5nZXRUd2VlbnNPZih0LGUpLHM9ci5sZW5ndGg7LS1zPi0xOylyW3NdLl9raWxsKGksdCl9O3ZhciBzdD14KCJwbHVnaW5zLlR3ZWVuUGx1Z2luIixmdW5jdGlvbih0LGUpe3RoaXMuX292ZXJ3cml0ZVByb3BzPSh0fHwiIikuc3BsaXQoIiwiKSx0aGlzLl9wcm9wTmFtZT10aGlzLl9vdmVyd3JpdGVQcm9wc1swXSx0aGlzLl9wcmlvcml0eT1lfHwwLHRoaXMuX3N1cGVyPXN0LnByb3RvdHlwZX0sITApO2lmKF89c3QucHJvdG90eXBlLHN0LnZlcnNpb249IjEuMTkuMCIsc3QuQVBJPTIsXy5fZmlyc3RQVD1udWxsLF8uX2FkZFR3ZWVuPVksXy5zZXRSYXRpbz1qLF8uX2tpbGw9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLl9vdmVyd3JpdGVQcm9wcyxyPXRoaXMuX2ZpcnN0UFQ7aWYobnVsbCE9dFt0aGlzLl9wcm9wTmFtZV0pdGhpcy5fb3ZlcndyaXRlUHJvcHM9W107ZWxzZSBmb3IoZT1pLmxlbmd0aDstLWU+LTE7KW51bGwhPXRbaVtlXV0mJmkuc3BsaWNlKGUsMSk7Zm9yKDtyOyludWxsIT10W3Iubl0mJihyLl9uZXh0JiYoci5fbmV4dC5fcHJldj1yLl9wcmV2KSxyLl9wcmV2PyhyLl9wcmV2Ll9uZXh0PXIuX25leHQsci5fcHJldj1udWxsKTp0aGlzLl9maXJzdFBUPT09ciYmKHRoaXMuX2ZpcnN0UFQ9ci5fbmV4dCkpLHI9ci5fbmV4dDtyZXR1cm4hMX0sXy5fbW9kPV8uX3JvdW5kUHJvcHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9dGhpcy5fZmlyc3RQVDtpOykoZT10W3RoaXMuX3Byb3BOYW1lXXx8bnVsbCE9aS5uJiZ0W2kubi5zcGxpdCh0aGlzLl9wcm9wTmFtZSsiXyIpLmpvaW4oIiIpXSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYoMj09PWkuZj9pLnQuX2FwcGx5UFQubT1lOmkubT1lKSxpPWkuX25leHR9LHouX29uUGx1Z2luRXZlbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaSxyLHMsbixhLG89ZS5fZmlyc3RQVDtpZigiX29uSW5pdEFsbFByb3BzIj09PXQpe2Zvcig7bzspe2ZvcihhPW8uX25leHQscj1zO3ImJnIucHI+by5wcjspcj1yLl9uZXh0OyhvLl9wcmV2PXI/ci5fcHJldjpuKT9vLl9wcmV2Ll9uZXh0PW86cz1vLChvLl9uZXh0PXIpP3IuX3ByZXY9bzpuPW8sbz1hfW89ZS5fZmlyc3RQVD1zfWZvcig7bzspby5wZyYmImZ1bmN0aW9uIj09dHlwZW9mIG8udFt0XSYmby50W3RdKCkmJihpPSEwKSxvPW8uX25leHQ7cmV0dXJuIGl9LHN0LmFjdGl2YXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDstLWU+LTE7KXRbZV0uQVBJPT09c3QuQVBJJiYoR1sobmV3IHRbZV0pLl9wcm9wTmFtZV09dFtlXSk7cmV0dXJuITB9LHcucGx1Z2luPWZ1bmN0aW9uKHQpe2lmKCEodCYmdC5wcm9wTmFtZSYmdC5pbml0JiZ0LkFQSSkpdGhyb3ciaWxsZWdhbCBwbHVnaW4gZGVmaW5pdGlvbi4iO3ZhciBlLGk9dC5wcm9wTmFtZSxyPXQucHJpb3JpdHl8fDAscz10Lm92ZXJ3cml0ZVByb3BzLG49e2luaXQ6Il9vbkluaXRUd2VlbiIsc2V0OiJzZXRSYXRpbyIsa2lsbDoiX2tpbGwiLHJvdW5kOiJfbW9kIixtb2Q6Il9tb2QiLGluaXRBbGw6Il9vbkluaXRBbGxQcm9wcyJ9LGE9eCgicGx1Z2lucy4iK2kuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkraS5zdWJzdHIoMSkrIlBsdWdpbiIsZnVuY3Rpb24oKXtzdC5jYWxsKHRoaXMsaSxyKSx0aGlzLl9vdmVyd3JpdGVQcm9wcz1zfHxbXX0sITA9PT10Lmdsb2JhbCksbz1hLnByb3RvdHlwZT1uZXcgc3QoaSk7Zm9yKGUgaW4gby5jb25zdHJ1Y3Rvcj1hLGEuQVBJPXQuQVBJLG4pImZ1bmN0aW9uIj09dHlwZW9mIHRbZV0mJihvW25bZV1dPXRbZV0pO3JldHVybiBhLnZlcnNpb249dC52ZXJzaW9uLHN0LmFjdGl2YXRlKFthXSksYX0saD1pLl9nc1F1ZXVlKXtmb3IodT0wO3U8aC5sZW5ndGg7dSsrKWhbdV0oKTtmb3IoXyBpbiB5KXlbX10uZnVuY3x8aS5jb25zb2xlLmxvZygiR1NBUCBlbmNvdW50ZXJlZCBtaXNzaW5nIGRlcGVuZGVuY3k6ICIrXyl9Zj0hMX0odm9pZCAwIT09dCYmdC5leHBvcnRzJiZ2b2lkIDAhPT1pP2k6dGhpc3x8d2luZG93KX0pLmNhbGwodGhpcyxpKDEpKX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIHI9ZVtpXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24oZSxpLHIpe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLHImJnQoZSxyKSxlfX0oKSxzPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0oaSgyKSksbj1pKDkpO2koNik7dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIGU9dGhpcyxpPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtyZXR1cm4gZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KSx0aGlzLnBhcmFtcz17cHJldk9mZnNldDowfSxPYmplY3QuYXNzaWduKHRoaXMucGFyYW1zLGkpLHRoaXMud3JhcHBlcj10aGlzLnBhcmFtcy53cmFwcGVyLHRoaXMuY29udGFpbmVyPXRoaXMucGFyYW1zLmNvbnRhaW5lcix0aGlzLmltYWdlPXRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIltkYXRhLWltZ10iKSx0aGlzLmltYWdlV3JhcHBlcj10aGlzLmltYWdlLnBhcmVudEVsZW1lbnQsdGhpcy5pbWc9dGhpcy5pbWFnZS5xdWVyeVNlbGVjdG9yKCJpbWciKSx0aGlzLmluaXQ9dGhpcy5pbml0LmJpbmQodGhpcyksdGhpcy5vbkluaXQ9dGhpcy5vbkluaXQuYmluZCh0aGlzKSx0aGlzLmluaXRFdmVudD1uZXcgQ3VzdG9tRXZlbnQoImNpdHlsaWdodEluaXQiLHt9KSx0aGlzLmltZz8oZnVuY3Rpb24odCxlKXt0LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUpLGZ1bmN0aW9uKHQpe3JldHVybiEoIXQuY29tcGxldGV8fHZvaWQgMCE9PXQubmF0dXJhbFdpZHRoJiYwPT09dC5uYXR1cmFsV2lkdGgpfSh0KSYmdC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgibG9hZCIpKX0odGhpcy5pbWcsZnVuY3Rpb24oKXtlLmluaXQoKX0pLHRoaXMpOnt9fXJldHVybiByKHQsW3trZXk6ImNyZWF0ZVRyaWdnZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy50cmlnZ2VyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMudHJpZ2dlci5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudHJpZ2dlci5zdHlsZS50b3A9ZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiBlPWV8fDAsaS50b3Ard2luZG93LnNjcm9sbFkraS5oZWlnaHQvMitlfSh0aGlzLmNvbnRhaW5lcix0aGlzLnBhcmFtcy5wcmV2T2Zmc2V0KSsicHgiLHRoaXMudHJpZ2dlci5zdHlsZS5sZWZ0PTAsdGhpcy50cmlnZ2VyLnN0eWxlLnJpZ2h0PTAsdGhpcy50cmlnZ2VyLnN0eWxlLndpZHRoPSIxMDAlIix0aGlzLnRyaWdnZXIuc3R5bGUuaGVpZ2h0PSIxMHB4Iixkb2N1bWVudC5ib2R5Lmluc2VydEJlZm9yZSh0aGlzLnRyaWdnZXIsZG9jdW1lbnQuYm9keS5maXJzdEVsZW1lbnRDaGlsZCl9fSx7a2V5OiJvbkluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0aGlzLmluaXRpYWw/dCh0aGlzLm9mZnNldCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2l0eWxpZ2h0SW5pdCIsZnVuY3Rpb24oKXt0KGUub2Zmc2V0KX0se29uY2U6ITB9KSl9fSx7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuY3JlYXRlVHJpZ2dlcigpO3ZhciB0PXRoaXMuaW1hZ2UuZGF0YXNldC5kaXJlY3Rpb247dGhpcy5vZmZzZXQ9IngiPT09dD90aGlzLmltZy5vZmZzZXRXaWR0aC10aGlzLmltYWdlV3JhcHBlci5vZmZzZXRXaWR0aDp0aGlzLmltZy5vZmZzZXRIZWlnaHQtdGhpcy5pbWFnZVdyYXBwZXIub2Zmc2V0SGVpZ2h0O3ZhciBlPSJ4Ij09PXQ/e2Zyb206e3g6MH0sdG86e3g6LXRoaXMub2Zmc2V0fX06e2Zyb206e3k6MH0sdG86e3k6LXRoaXMub2Zmc2V0fX07ZS50by5lYXNlPUxpbmVhci5lYXNlTm9uZTt2YXIgaT1uZXcgcy5kZWZhdWx0LkNvbnRyb2xsZXIscj0obmV3IG4uVGltZWxpbmVNYXgpLmFkZChbbi5Ud2Vlbk1heC5mcm9tVG8odGhpcy5pbWFnZSwxLGUuZnJvbSxlLnRvKV0pLGE9bmV3IHMuZGVmYXVsdC5TY2VuZSh7dHJpZ2dlckVsZW1lbnQ6dGhpcy50cmlnZ2VyLGR1cmF0aW9uOnRoaXMub2Zmc2V0fSk7YS5zZXRUd2VlbihyKSxhLnNldFBpbih0aGlzLndyYXBwZXIpLGEuYWRkVG8oaSksdGhpcy5pbml0aWFsPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5pbml0RXZlbnQpfX1dKSx0fSgpO3QuZXhwb3J0cy5DaXR5bGlnaHQ9YX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIXQud2VicGFja1BvbHlmaWxsKXt2YXIgZT1PYmplY3QuY3JlYXRlKHQpO2UuY2hpbGRyZW58fChlLmNoaWxkcmVuPVtdKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwibG9hZGVkIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5sfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJpZCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuaX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiZXhwb3J0cyIse2VudW1lcmFibGU6ITB9KSxlLndlYnBhY2tQb2x5ZmlsbD0xfXJldHVybiBlfX0sZnVuY3Rpb24odCxlLGkpe3ZhciByLHMsbjsNCi8qIQ0KICogU2Nyb2xsTWFnaWMgdjIuMC42ICgyMDE4LTEwLTA4KQ0KICogVGhlIGphdmFzY3JpcHQgbGlicmFyeSBmb3IgbWFnaWNhbCBzY3JvbGwgaW50ZXJhY3Rpb25zLg0KICogKGMpIDIwMTggSmFuIFBhZXBrZSAoQGphbnBhZXBrZSkNCiAqIFByb2plY3QgV2Vic2l0ZTogaHR0cDovL3Njcm9sbG1hZ2ljLmlvDQogKiANCiAqIEB2ZXJzaW9uIDIuMC42DQogKiBAbGljZW5zZSBEdWFsIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlIGFuZCBHUEwuDQogKiBAYXV0aG9yIEphbiBQYWVwa2UgLSBlLW1haWxAamFucGFlcGtlLmRlDQogKg0KICogQGZpbGUgU2Nyb2xsTWFnaWMgR1NBUCBBbmltYXRpb24gUGx1Z2luLg0KICoNCiAqIHJlcXVpcmVzOiBHU0FQIH4xLjE0DQogKiBQb3dlcmVkIGJ5IHRoZSBHcmVlbnNvY2sgQW5pbWF0aW9uIFBsYXRmb3JtIChHU0FQKTogaHR0cDovL3d3dy5ncmVlbnNvY2suY29tL2pzDQogKiBHcmVlbnNvY2sgTGljZW5zZSBpbmZvIGF0IGh0dHA6Ly93d3cuZ3JlZW5zb2NrLmNvbS9saWNlbnNpbmcvDQogKi9zPVtpKDIpLGkoNyksaSg4KV0sdm9pZCAwPT09KG49ImZ1bmN0aW9uIj09dHlwZW9mKHI9ZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgcj13aW5kb3cuY29uc29sZXx8e30scz1GdW5jdGlvbi5wcm90b3R5cGUuYmluZC5jYWxsKHIuZXJyb3J8fHIubG9nfHxmdW5jdGlvbigpe30scik7dHx8cygiKGFuaW1hdGlvbi5nc2FwKSAtPiBFUlJPUjogVGhlIFNjcm9sbE1hZ2ljIG1haW4gbW9kdWxlIGNvdWxkIG5vdCBiZSBmb3VuZC4gUGxlYXNlIG1ha2Ugc3VyZSBpdCdzIGxvYWRlZCBiZWZvcmUgdGhpcyBwbHVnaW4gb3IgdXNlIGFuIGFzeW5jaHJvbm91cyBsb2FkZXIgbGlrZSByZXF1aXJlanMuIiksZXx8cygiKGFuaW1hdGlvbi5nc2FwKSAtPiBFUlJPUjogVHdlZW5MaXRlIG9yIFR3ZWVuTWF4IGNvdWxkIG5vdCBiZSBmb3VuZC4gUGxlYXNlIG1ha2Ugc3VyZSBHU0FQIGlzIGxvYWRlZCBiZWZvcmUgU2Nyb2xsTWFnaWMgb3IgdXNlIGFuIGFzeW5jaHJvbm91cyBsb2FkZXIgbGlrZSByZXF1aXJlanMuIiksdC5TY2VuZS5hZGRPcHRpb24oInR3ZWVuQ2hhbmdlcyIsITEsZnVuY3Rpb24odCl7cmV0dXJuISF0fSksdC5TY2VuZS5leHRlbmQoZnVuY3Rpb24oKXt2YXIgdCxyPXRoaXMscz1mdW5jdGlvbigpe3IuX2xvZyYmKEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhcmd1bWVudHMsMSwwLCIoYW5pbWF0aW9uLmdzYXApIiwiLT4iKSxyLl9sb2cuYXBwbHkodGhpcyxhcmd1bWVudHMpKX07ci5vbigicHJvZ3Jlc3MucGx1Z2luX2dzYXAiLGZ1bmN0aW9uKCl7bigpfSksci5vbigiZGVzdHJveS5wbHVnaW5fZ3NhcCIsZnVuY3Rpb24odCl7ci5yZW1vdmVUd2Vlbih0LnJlc2V0KX0pO3ZhciBuPWZ1bmN0aW9uKCl7aWYodCl7dmFyIGU9ci5wcm9ncmVzcygpLGk9ci5zdGF0ZSgpO3QucmVwZWF0JiYtMT09PXQucmVwZWF0KCk/IkRVUklORyI9PT1pJiZ0LnBhdXNlZCgpP3QucGxheSgpOiJEVVJJTkciPT09aXx8dC5wYXVzZWQoKXx8dC5wYXVzZSgpOmUhPXQucHJvZ3Jlc3MoKSYmKDA9PT1yLmR1cmF0aW9uKCk/ZT4wP3QucGxheSgpOnQucmV2ZXJzZSgpOnIudHdlZW5DaGFuZ2VzKCkmJnQudHdlZW5Ubz90LnR3ZWVuVG8oZSp0LmR1cmF0aW9uKCkpOnQucHJvZ3Jlc3MoZSkucGF1c2UoKSl9fTtyLnNldFR3ZWVuPWZ1bmN0aW9uKGEsbyxsKXt2YXIgaDthcmd1bWVudHMubGVuZ3RoPjEmJihhcmd1bWVudHMubGVuZ3RoPDMmJihsPW8sbz0xKSxhPWUudG8oYSxvLGwpKTt0cnl7KGg9aT9uZXcgaSh7c21vb3RoQ2hpbGRUaW1pbmc6ITB9KS5hZGQoYSk6YSkucGF1c2UoKX1jYXRjaCh0KXtyZXR1cm4gcygxLCJFUlJPUiBjYWxsaW5nIG1ldGhvZCAnc2V0VHdlZW4oKSc6IFN1cHBsaWVkIGFyZ3VtZW50IGlzIG5vdCBhIHZhbGlkIFR3ZWVuT2JqZWN0Iikscn1pZih0JiZyLnJlbW92ZVR3ZWVuKCksdD1oLGEucmVwZWF0JiYtMT09PWEucmVwZWF0KCkmJih0LnJlcGVhdCgtMSksdC55b3lvKGEueW95bygpKSksci50d2VlbkNoYW5nZXMoKSYmIXQudHdlZW5UbyYmcygyLCJXQVJOSU5HOiB0d2VlbkNoYW5nZXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIFRpbWVsaW5lTWF4IG9iamVjdCBpcyBhdmFpbGFibGUgZm9yIFNjcm9sbE1hZ2ljLiIpLHQmJnIuY29udHJvbGxlcigpJiZyLnRyaWdnZXJFbGVtZW50KCkmJnIubG9nbGV2ZWwoKT49Mil7dmFyIHU9ZS5nZXRUd2VlbnNPZihyLnRyaWdnZXJFbGVtZW50KCkpLF89ci5jb250cm9sbGVyKCkuaW5mbygidmVydGljYWwiKTt1LmZvckVhY2goZnVuY3Rpb24odCxlKXt2YXIgaT10LnZhcnMuY3NzfHx0LnZhcnMscj1fP3ZvaWQgMCE9PWkudG9wfHx2b2lkIDAhPT1pLmJvdHRvbTp2b2lkIDAhPT1pLmxlZnR8fHZvaWQgMCE9PWkucmlnaHQ7aWYocilyZXR1cm4gcygyLCJXQVJOSU5HOiBUd2VlbmluZyB0aGUgcG9zaXRpb24gb2YgdGhlIHRyaWdnZXIgZWxlbWVudCBhZmZlY3RzIHRoZSBzY2VuZSB0aW1pbmcgYW5kIHNob3VsZCBiZSBhdm9pZGVkISIpLCExfSl9aWYocGFyc2VGbG9hdChUd2VlbkxpdGUudmVyc2lvbik+PTEuMTQpZm9yKHZhciBjLGYscD10LmdldENoaWxkcmVuP3QuZ2V0Q2hpbGRyZW4oITAsITAsITEpOlt0XSxkPWZ1bmN0aW9uKCl7cygyLCJXQVJOSU5HOiB0d2VlbiB3YXMgb3ZlcndyaXR0ZW4gYnkgYW5vdGhlci4gVG8gbGVhcm4gaG93IHRvIGF2b2lkIHRoaXMgaXNzdWUgc2VlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5wYWVwa2UvU2Nyb2xsTWFnaWMvd2lraS9XQVJOSU5HOi10d2Vlbi13YXMtb3ZlcndyaXR0ZW4tYnktYW5vdGhlciIpfSxtPTA7bTxwLmxlbmd0aDttKyspYz1wW21dLGYhPT1kJiYoZj1jLnZhcnMub25PdmVyd3JpdGUsYy52YXJzLm9uT3ZlcndyaXRlPWZ1bmN0aW9uKCl7ZiYmZi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KTtyZXR1cm4gcygzLCJhZGRlZCB0d2VlbiIpLG4oKSxyfSxyLnJlbW92ZVR3ZWVuPWZ1bmN0aW9uKGUpe3JldHVybiB0JiYoZSYmdC5wcm9ncmVzcygwKS5wYXVzZSgpLHQua2lsbCgpLHQ9dm9pZCAwLHMoMywicmVtb3ZlZCB0d2VlbiAocmVzZXQ6ICIrKGU/InRydWUiOiJmYWxzZSIpKyIpIikpLHJ9fSl9KT9yLmFwcGx5KGUscyk6cil8fCh0LmV4cG9ydHM9bil9LGZ1bmN0aW9uKHQsZSxpKXsoZnVuY3Rpb24oaSl7dmFyIHIscz12b2lkIDAhPT10JiZ0LmV4cG9ydHMmJnZvaWQgMCE9PWk/aTp0aGlzfHx3aW5kb3c7DQovKiENCiAqIFZFUlNJT046IDIuMC4yDQogKiBEQVRFOiAyMDE4LTA4LTI3DQogKiBVUERBVEVTIEFORCBET0NTIEFUOiBodHRwOi8vZ3JlZW5zb2NrLmNvbQ0KICogDQogKiBJbmNsdWRlcyBhbGwgb2YgdGhlIGZvbGxvd2luZzogVHdlZW5MaXRlLCBUd2Vlbk1heCwgVGltZWxpbmVMaXRlLCBUaW1lbGluZU1heCwgRWFzZVBhY2ssIENTU1BsdWdpbiwgUm91bmRQcm9wc1BsdWdpbiwgQmV6aWVyUGx1Z2luLCBBdHRyUGx1Z2luLCBEaXJlY3Rpb25hbFJvdGF0aW9uUGx1Z2luDQogKg0KICogQGxpY2Vuc2UgQ29weXJpZ2h0IChjKSAyMDA4LTIwMTgsIEdyZWVuU29jay4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAqIFRoaXMgd29yayBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhdCBodHRwOi8vZ3JlZW5zb2NrLmNvbS9zdGFuZGFyZC1saWNlbnNlIG9yIGZvcg0KICogQ2x1YiBHcmVlblNvY2sgbWVtYmVycywgdGhlIHNvZnR3YXJlIGFncmVlbWVudCB0aGF0IHdhcyBpc3N1ZWQgd2l0aCB5b3VyIG1lbWJlcnNoaXAuDQogKiANCiAqIEBhdXRob3I6IEphY2sgRG95bGUsIGphY2tAZ3JlZW5zb2NrLmNvbQ0KICoqLyhzLl9nc1F1ZXVlfHwocy5fZ3NRdWV1ZT1bXSkpLnB1c2goZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7cy5fZ3NEZWZpbmUoIlR3ZWVuTWF4IixbImNvcmUuQW5pbWF0aW9uIiwiY29yZS5TaW1wbGVUaW1lbGluZSIsIlR3ZWVuTGl0ZSJdLGZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1mdW5jdGlvbih0KXt2YXIgZSxpPVtdLHI9dC5sZW5ndGg7Zm9yKGU9MDtlIT09cjtpLnB1c2godFtlKytdKSk7cmV0dXJuIGl9LHM9ZnVuY3Rpb24odCxlLGkpe3ZhciByLHMsbj10LmN5Y2xlO2ZvcihyIGluIG4pcz1uW3JdLHRbcl09ImZ1bmN0aW9uIj09dHlwZW9mIHM/cyhpLGVbaV0pOnNbaSVzLmxlbmd0aF07ZGVsZXRlIHQuY3ljbGV9LG49ZnVuY3Rpb24odCxlLHIpe2kuY2FsbCh0aGlzLHQsZSxyKSx0aGlzLl9jeWNsZT0wLHRoaXMuX3lveW89ITA9PT10aGlzLnZhcnMueW95b3x8ISF0aGlzLnZhcnMueW95b0Vhc2UsdGhpcy5fcmVwZWF0PXRoaXMudmFycy5yZXBlYXR8fDAsdGhpcy5fcmVwZWF0RGVsYXk9dGhpcy52YXJzLnJlcGVhdERlbGF5fHwwLHRoaXMuX3JlcGVhdCYmdGhpcy5fdW5jYWNoZSghMCksdGhpcy5yZW5kZXI9bi5wcm90b3R5cGUucmVuZGVyfSxhPWkuX2ludGVybmFscyxvPWEuaXNTZWxlY3RvcixsPWEuaXNBcnJheSxoPW4ucHJvdG90eXBlPWkudG8oe30sLjEse30pLHU9W107bi52ZXJzaW9uPSIyLjAuMiIsaC5jb25zdHJ1Y3Rvcj1uLGgua2lsbCgpLl9nYz0hMSxuLmtpbGxUd2VlbnNPZj1uLmtpbGxEZWxheWVkQ2FsbHNUbz1pLmtpbGxUd2VlbnNPZixuLmdldFR3ZWVuc09mPWkuZ2V0VHdlZW5zT2Ysbi5sYWdTbW9vdGhpbmc9aS5sYWdTbW9vdGhpbmcsbi50aWNrZXI9aS50aWNrZXIsbi5yZW5kZXI9aS5yZW5kZXIsaC5pbnZhbGlkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3lveW89ITA9PT10aGlzLnZhcnMueW95b3x8ISF0aGlzLnZhcnMueW95b0Vhc2UsdGhpcy5fcmVwZWF0PXRoaXMudmFycy5yZXBlYXR8fDAsdGhpcy5fcmVwZWF0RGVsYXk9dGhpcy52YXJzLnJlcGVhdERlbGF5fHwwLHRoaXMuX3lveW9FYXNlPW51bGwsdGhpcy5fdW5jYWNoZSghMCksaS5wcm90b3R5cGUuaW52YWxpZGF0ZS5jYWxsKHRoaXMpfSxoLnVwZGF0ZVRvPWZ1bmN0aW9uKHQsZSl7dmFyIHIscz10aGlzLnJhdGlvLG49dGhpcy52YXJzLmltbWVkaWF0ZVJlbmRlcnx8dC5pbW1lZGlhdGVSZW5kZXI7Zm9yKHIgaW4gZSYmdGhpcy5fc3RhcnRUaW1lPHRoaXMuX3RpbWVsaW5lLl90aW1lJiYodGhpcy5fc3RhcnRUaW1lPXRoaXMuX3RpbWVsaW5lLl90aW1lLHRoaXMuX3VuY2FjaGUoITEpLHRoaXMuX2djP3RoaXMuX2VuYWJsZWQoITAsITEpOnRoaXMuX3RpbWVsaW5lLmluc2VydCh0aGlzLHRoaXMuX3N0YXJ0VGltZS10aGlzLl9kZWxheSkpLHQpdGhpcy52YXJzW3JdPXRbcl07aWYodGhpcy5faW5pdHRlZHx8bilpZihlKXRoaXMuX2luaXR0ZWQ9ITEsbiYmdGhpcy5yZW5kZXIoMCwhMCwhMCk7ZWxzZSBpZih0aGlzLl9nYyYmdGhpcy5fZW5hYmxlZCghMCwhMSksdGhpcy5fbm90aWZ5UGx1Z2luc09mRW5hYmxlZCYmdGhpcy5fZmlyc3RQVCYmaS5fb25QbHVnaW5FdmVudCgiX29uRGlzYWJsZSIsdGhpcyksdGhpcy5fdGltZS90aGlzLl9kdXJhdGlvbj4uOTk4KXt2YXIgYT10aGlzLl90b3RhbFRpbWU7dGhpcy5yZW5kZXIoMCwhMCwhMSksdGhpcy5faW5pdHRlZD0hMSx0aGlzLnJlbmRlcihhLCEwLCExKX1lbHNlIGlmKHRoaXMuX2luaXR0ZWQ9ITEsdGhpcy5faW5pdCgpLHRoaXMuX3RpbWU+MHx8bilmb3IodmFyIG8sbD0xLygxLXMpLGg9dGhpcy5fZmlyc3RQVDtoOylvPWgucytoLmMsaC5jKj1sLGgucz1vLWguYyxoPWguX25leHQ7cmV0dXJuIHRoaXN9LGgucmVuZGVyPWZ1bmN0aW9uKHQsZSxyKXt0aGlzLl9pbml0dGVkfHwwPT09dGhpcy5fZHVyYXRpb24mJnRoaXMudmFycy5yZXBlYXQmJnRoaXMuaW52YWxpZGF0ZSgpO3ZhciBzLG4sbyxsLGgsdSxfLGMsZixwPXRoaXMuX2RpcnR5P3RoaXMudG90YWxEdXJhdGlvbigpOnRoaXMuX3RvdGFsRHVyYXRpb24sZD10aGlzLl90aW1lLG09dGhpcy5fdG90YWxUaW1lLGc9dGhpcy5fY3ljbGUsdj10aGlzLl9kdXJhdGlvbix5PXRoaXMuX3Jhd1ByZXZUaW1lO2lmKHQ+PXAtMWUtNyYmdD49MD8odGhpcy5fdG90YWxUaW1lPXAsdGhpcy5fY3ljbGU9dGhpcy5fcmVwZWF0LHRoaXMuX3lveW8mJjAhPSgxJnRoaXMuX2N5Y2xlKT8odGhpcy5fdGltZT0wLHRoaXMucmF0aW89dGhpcy5fZWFzZS5fY2FsY0VuZD90aGlzLl9lYXNlLmdldFJhdGlvKDApOjApOih0aGlzLl90aW1lPXYsdGhpcy5yYXRpbz10aGlzLl9lYXNlLl9jYWxjRW5kP3RoaXMuX2Vhc2UuZ2V0UmF0aW8oMSk6MSksdGhpcy5fcmV2ZXJzZWR8fChzPSEwLG49Im9uQ29tcGxldGUiLHI9cnx8dGhpcy5fdGltZWxpbmUuYXV0b1JlbW92ZUNoaWxkcmVuKSwwPT09diYmKHRoaXMuX2luaXR0ZWR8fCF0aGlzLnZhcnMubGF6eXx8cikmJih0aGlzLl9zdGFydFRpbWU9PT10aGlzLl90aW1lbGluZS5fZHVyYXRpb24mJih0PTApLCh5PDB8fHQ8PTAmJnQ+PS0xZS03fHwxZS0xMD09PXkmJiJpc1BhdXNlIiE9PXRoaXMuZGF0YSkmJnkhPT10JiYocj0hMCx5PjFlLTEwJiYobj0ib25SZXZlcnNlQ29tcGxldGUiKSksdGhpcy5fcmF3UHJldlRpbWU9Yz0hZXx8dHx8eT09PXQ/dDoxZS0xMCkpOnQ8MWUtNz8odGhpcy5fdG90YWxUaW1lPXRoaXMuX3RpbWU9dGhpcy5fY3ljbGU9MCx0aGlzLnJhdGlvPXRoaXMuX2Vhc2UuX2NhbGNFbmQ/dGhpcy5fZWFzZS5nZXRSYXRpbygwKTowLCgwIT09bXx8MD09PXYmJnk+MCkmJihuPSJvblJldmVyc2VDb21wbGV0ZSIscz10aGlzLl9yZXZlcnNlZCksdDwwJiYodGhpcy5fYWN0aXZlPSExLDA9PT12JiYodGhpcy5faW5pdHRlZHx8IXRoaXMudmFycy5sYXp5fHxyKSYmKHk+PTAmJihyPSEwKSx0aGlzLl9yYXdQcmV2VGltZT1jPSFlfHx0fHx5PT09dD90OjFlLTEwKSksdGhpcy5faW5pdHRlZHx8KHI9ITApKToodGhpcy5fdG90YWxUaW1lPXRoaXMuX3RpbWU9dCwwIT09dGhpcy5fcmVwZWF0JiYobD12K3RoaXMuX3JlcGVhdERlbGF5LHRoaXMuX2N5Y2xlPXRoaXMuX3RvdGFsVGltZS9sPj4wLDAhPT10aGlzLl9jeWNsZSYmdGhpcy5fY3ljbGU9PT10aGlzLl90b3RhbFRpbWUvbCYmbTw9dCYmdGhpcy5fY3ljbGUtLSx0aGlzLl90aW1lPXRoaXMuX3RvdGFsVGltZS10aGlzLl9jeWNsZSpsLHRoaXMuX3lveW8mJjAhPSgxJnRoaXMuX2N5Y2xlKSYmKHRoaXMuX3RpbWU9di10aGlzLl90aW1lLChmPXRoaXMuX3lveW9FYXNlfHx0aGlzLnZhcnMueW95b0Vhc2UpJiYodGhpcy5feW95b0Vhc2V8fCghMCE9PWZ8fHRoaXMuX2luaXR0ZWQ/dGhpcy5feW95b0Vhc2U9Zj0hMD09PWY/dGhpcy5fZWFzZTpmIGluc3RhbmNlb2YgRWFzZT9mOkVhc2UubWFwW2ZdOihmPXRoaXMudmFycy5lYXNlLHRoaXMuX3lveW9FYXNlPWY9Zj9mIGluc3RhbmNlb2YgRWFzZT9mOiJmdW5jdGlvbiI9PXR5cGVvZiBmP25ldyBFYXNlKGYsdGhpcy52YXJzLmVhc2VQYXJhbXMpOkVhc2UubWFwW2ZdfHxpLmRlZmF1bHRFYXNlOmkuZGVmYXVsdEVhc2UpKSx0aGlzLnJhdGlvPWY/MS1mLmdldFJhdGlvKCh2LXRoaXMuX3RpbWUpL3YpOjApKSx0aGlzLl90aW1lPnY/dGhpcy5fdGltZT12OnRoaXMuX3RpbWU8MCYmKHRoaXMuX3RpbWU9MCkpLHRoaXMuX2Vhc2VUeXBlJiYhZj8oaD10aGlzLl90aW1lL3YsdT10aGlzLl9lYXNlVHlwZSxfPXRoaXMuX2Vhc2VQb3dlciwoMT09PXV8fDM9PT11JiZoPj0uNSkmJihoPTEtaCksMz09PXUmJihoKj0yKSwxPT09Xz9oKj1oOjI9PT1fP2gqPWgqaDozPT09Xz9oKj1oKmgqaDo0PT09XyYmKGgqPWgqaCpoKmgpLDE9PT11P3RoaXMucmF0aW89MS1oOjI9PT11P3RoaXMucmF0aW89aDp0aGlzLl90aW1lL3Y8LjU/dGhpcy5yYXRpbz1oLzI6dGhpcy5yYXRpbz0xLWgvMik6Znx8KHRoaXMucmF0aW89dGhpcy5fZWFzZS5nZXRSYXRpbyh0aGlzLl90aW1lL3YpKSksZCE9PXRoaXMuX3RpbWV8fHJ8fGchPT10aGlzLl9jeWNsZSl7aWYoIXRoaXMuX2luaXR0ZWQpe2lmKHRoaXMuX2luaXQoKSwhdGhpcy5faW5pdHRlZHx8dGhpcy5fZ2MpcmV0dXJuO2lmKCFyJiZ0aGlzLl9maXJzdFBUJiYoITEhPT10aGlzLnZhcnMubGF6eSYmdGhpcy5fZHVyYXRpb258fHRoaXMudmFycy5sYXp5JiYhdGhpcy5fZHVyYXRpb24pKXJldHVybiB0aGlzLl90aW1lPWQsdGhpcy5fdG90YWxUaW1lPW0sdGhpcy5fcmF3UHJldlRpbWU9eSx0aGlzLl9jeWNsZT1nLGEubGF6eVR3ZWVucy5wdXNoKHRoaXMpLHZvaWQodGhpcy5fbGF6eT1bdCxlXSk7IXRoaXMuX3RpbWV8fHN8fGY/cyYmdGhpcy5fZWFzZS5fY2FsY0VuZCYmIWYmJih0aGlzLnJhdGlvPXRoaXMuX2Vhc2UuZ2V0UmF0aW8oMD09PXRoaXMuX3RpbWU/MDoxKSk6dGhpcy5yYXRpbz10aGlzLl9lYXNlLmdldFJhdGlvKHRoaXMuX3RpbWUvdil9Zm9yKCExIT09dGhpcy5fbGF6eSYmKHRoaXMuX2xhenk9ITEpLHRoaXMuX2FjdGl2ZXx8IXRoaXMuX3BhdXNlZCYmdGhpcy5fdGltZSE9PWQmJnQ+PTAmJih0aGlzLl9hY3RpdmU9ITApLDA9PT1tJiYoMj09PXRoaXMuX2luaXR0ZWQmJnQ+MCYmdGhpcy5faW5pdCgpLHRoaXMuX3N0YXJ0QXQmJih0Pj0wP3RoaXMuX3N0YXJ0QXQucmVuZGVyKHQsITAscik6bnx8KG49Il9kdW1teUdTIikpLHRoaXMudmFycy5vblN0YXJ0JiYoMD09PXRoaXMuX3RvdGFsVGltZSYmMCE9PXZ8fGV8fHRoaXMuX2NhbGxiYWNrKCJvblN0YXJ0IikpKSxvPXRoaXMuX2ZpcnN0UFQ7bzspby5mP28udFtvLnBdKG8uYyp0aGlzLnJhdGlvK28ucyk6by50W28ucF09by5jKnRoaXMucmF0aW8rby5zLG89by5fbmV4dDt0aGlzLl9vblVwZGF0ZSYmKHQ8MCYmdGhpcy5fc3RhcnRBdCYmdGhpcy5fc3RhcnRUaW1lJiZ0aGlzLl9zdGFydEF0LnJlbmRlcih0LCEwLHIpLGV8fCh0aGlzLl90b3RhbFRpbWUhPT1tfHxuKSYmdGhpcy5fY2FsbGJhY2soIm9uVXBkYXRlIikpLHRoaXMuX2N5Y2xlIT09ZyYmKGV8fHRoaXMuX2djfHx0aGlzLnZhcnMub25SZXBlYXQmJnRoaXMuX2NhbGxiYWNrKCJvblJlcGVhdCIpKSxuJiYodGhpcy5fZ2MmJiFyfHwodDwwJiZ0aGlzLl9zdGFydEF0JiYhdGhpcy5fb25VcGRhdGUmJnRoaXMuX3N0YXJ0VGltZSYmdGhpcy5fc3RhcnRBdC5yZW5kZXIodCwhMCxyKSxzJiYodGhpcy5fdGltZWxpbmUuYXV0b1JlbW92ZUNoaWxkcmVuJiZ0aGlzLl9lbmFibGVkKCExLCExKSx0aGlzLl9hY3RpdmU9ITEpLCFlJiZ0aGlzLnZhcnNbbl0mJnRoaXMuX2NhbGxiYWNrKG4pLDA9PT12JiYxZS0xMD09PXRoaXMuX3Jhd1ByZXZUaW1lJiYxZS0xMCE9PWMmJih0aGlzLl9yYXdQcmV2VGltZT0wKSkpfWVsc2UgbSE9PXRoaXMuX3RvdGFsVGltZSYmdGhpcy5fb25VcGRhdGUmJihlfHx0aGlzLl9jYWxsYmFjaygib25VcGRhdGUiKSl9LG4udG89ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuZXcgbih0LGUsaSl9LG4uZnJvbT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIGkucnVuQmFja3dhcmRzPSEwLGkuaW1tZWRpYXRlUmVuZGVyPTAhPWkuaW1tZWRpYXRlUmVuZGVyLG5ldyBuKHQsZSxpKX0sbi5mcm9tVG89ZnVuY3Rpb24odCxlLGkscil7cmV0dXJuIHIuc3RhcnRBdD1pLHIuaW1tZWRpYXRlUmVuZGVyPTAhPXIuaW1tZWRpYXRlUmVuZGVyJiYwIT1pLmltbWVkaWF0ZVJlbmRlcixuZXcgbih0LGUscil9LG4uc3RhZ2dlclRvPW4uYWxsVG89ZnVuY3Rpb24odCxlLGEsaCxfLGMsZil7aD1ofHwwO3ZhciBwLGQsbSxnLHY9MCx5PVtdLFQ9ZnVuY3Rpb24oKXthLm9uQ29tcGxldGUmJmEub25Db21wbGV0ZS5hcHBseShhLm9uQ29tcGxldGVTY29wZXx8dGhpcyxhcmd1bWVudHMpLF8uYXBwbHkoZnx8YS5jYWxsYmFja1Njb3BlfHx0aGlzLGN8fHUpfSx3PWEuY3ljbGUseD1hLnN0YXJ0QXQmJmEuc3RhcnRBdC5jeWNsZTtmb3IobCh0KXx8KCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9aS5zZWxlY3Rvcih0KXx8dCksbyh0KSYmKHQ9cih0KSkpLHQ9dHx8W10saDwwJiYoKHQ9cih0KSkucmV2ZXJzZSgpLGgqPS0xKSxwPXQubGVuZ3RoLTEsbT0wO208PXA7bSsrKXtmb3IoZyBpbiBkPXt9LGEpZFtnXT1hW2ddO2lmKHcmJihzKGQsdCxtKSxudWxsIT1kLmR1cmF0aW9uJiYoZT1kLmR1cmF0aW9uLGRlbGV0ZSBkLmR1cmF0aW9uKSkseCl7Zm9yKGcgaW4geD1kLnN0YXJ0QXQ9e30sYS5zdGFydEF0KXhbZ109YS5zdGFydEF0W2ddO3MoZC5zdGFydEF0LHQsbSl9ZC5kZWxheT12KyhkLmRlbGF5fHwwKSxtPT09cCYmXyYmKGQub25Db21wbGV0ZT1UKSx5W21dPW5ldyBuKHRbbV0sZSxkKSx2Kz1ofXJldHVybiB5fSxuLnN0YWdnZXJGcm9tPW4uYWxsRnJvbT1mdW5jdGlvbih0LGUsaSxyLHMsYSxvKXtyZXR1cm4gaS5ydW5CYWNrd2FyZHM9ITAsaS5pbW1lZGlhdGVSZW5kZXI9MCE9aS5pbW1lZGlhdGVSZW5kZXIsbi5zdGFnZ2VyVG8odCxlLGkscixzLGEsbyl9LG4uc3RhZ2dlckZyb21Ubz1uLmFsbEZyb21Ubz1mdW5jdGlvbih0LGUsaSxyLHMsYSxvLGwpe3JldHVybiByLnN0YXJ0QXQ9aSxyLmltbWVkaWF0ZVJlbmRlcj0wIT1yLmltbWVkaWF0ZVJlbmRlciYmMCE9aS5pbW1lZGlhdGVSZW5kZXIsbi5zdGFnZ2VyVG8odCxlLHIscyxhLG8sbCl9LG4uZGVsYXllZENhbGw9ZnVuY3Rpb24odCxlLGkscixzKXtyZXR1cm4gbmV3IG4oZSwwLHtkZWxheTp0LG9uQ29tcGxldGU6ZSxvbkNvbXBsZXRlUGFyYW1zOmksY2FsbGJhY2tTY29wZTpyLG9uUmV2ZXJzZUNvbXBsZXRlOmUsb25SZXZlcnNlQ29tcGxldGVQYXJhbXM6aSxpbW1lZGlhdGVSZW5kZXI6ITEsdXNlRnJhbWVzOnMsb3ZlcndyaXRlOjB9KX0sbi5zZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG4odCwwLGUpfSxuLmlzVHdlZW5pbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGkuZ2V0VHdlZW5zT2YodCwhMCkubGVuZ3RoPjB9O3ZhciBfPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPVtdLHM9MCxuPXQuX2ZpcnN0O247KW4gaW5zdGFuY2VvZiBpP3JbcysrXT1uOihlJiYocltzKytdPW4pLHM9KHI9ci5jb25jYXQoXyhuLGUpKSkubGVuZ3RoKSxuPW4uX25leHQ7cmV0dXJuIHJ9LGM9bi5nZXRBbGxUd2VlbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIF8odC5fcm9vdFRpbWVsaW5lLGUpLmNvbmNhdChfKHQuX3Jvb3RGcmFtZXNUaW1lbGluZSxlKSl9O24ua2lsbEFsbD1mdW5jdGlvbih0LGkscixzKXtudWxsPT1pJiYoaT0hMCksbnVsbD09ciYmKHI9ITApO3ZhciBuLGEsbyxsPWMoMCE9cyksaD1sLmxlbmd0aCx1PWkmJnImJnM7Zm9yKG89MDtvPGg7bysrKWE9bFtvXSwodXx8YSBpbnN0YW5jZW9mIGV8fChuPWEudGFyZ2V0PT09YS52YXJzLm9uQ29tcGxldGUpJiZyfHxpJiYhbikmJih0P2EudG90YWxUaW1lKGEuX3JldmVyc2VkPzA6YS50b3RhbER1cmF0aW9uKCkpOmEuX2VuYWJsZWQoITEsITEpKX0sbi5raWxsQ2hpbGRUd2VlbnNPZj1mdW5jdGlvbih0LGUpe2lmKG51bGwhPXQpe3ZhciBzLGgsdSxfLGMsZj1hLnR3ZWVuTG9va3VwO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9aS5zZWxlY3Rvcih0KXx8dCksbyh0KSYmKHQ9cih0KSksbCh0KSlmb3IoXz10Lmxlbmd0aDstLV8+LTE7KW4ua2lsbENoaWxkVHdlZW5zT2YodFtfXSxlKTtlbHNle2Zvcih1IGluIHM9W10sZilmb3IoaD1mW3VdLnRhcmdldC5wYXJlbnROb2RlO2g7KWg9PT10JiYocz1zLmNvbmNhdChmW3VdLnR3ZWVucykpLGg9aC5wYXJlbnROb2RlO2ZvcihjPXMubGVuZ3RoLF89MDtfPGM7XysrKWUmJnNbX10udG90YWxUaW1lKHNbX10udG90YWxEdXJhdGlvbigpKSxzW19dLl9lbmFibGVkKCExLCExKX19fTt2YXIgZj1mdW5jdGlvbih0LGkscixzKXtpPSExIT09aSxyPSExIT09cjtmb3IodmFyIG4sYSxvPWMocz0hMSE9PXMpLGw9aSYmciYmcyxoPW8ubGVuZ3RoOy0taD4tMTspYT1vW2hdLChsfHxhIGluc3RhbmNlb2YgZXx8KG49YS50YXJnZXQ9PT1hLnZhcnMub25Db21wbGV0ZSkmJnJ8fGkmJiFuKSYmYS5wYXVzZWQodCl9O3JldHVybiBuLnBhdXNlQWxsPWZ1bmN0aW9uKHQsZSxpKXtmKCEwLHQsZSxpKX0sbi5yZXN1bWVBbGw9ZnVuY3Rpb24odCxlLGkpe2YoITEsdCxlLGkpfSxuLmdsb2JhbFRpbWVTY2FsZT1mdW5jdGlvbihlKXt2YXIgcj10Ll9yb290VGltZWxpbmUscz1pLnRpY2tlci50aW1lO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWV8fDFlLTEwLHIuX3N0YXJ0VGltZT1zLShzLXIuX3N0YXJ0VGltZSkqci5fdGltZVNjYWxlL2Uscj10Ll9yb290RnJhbWVzVGltZWxpbmUscz1pLnRpY2tlci5mcmFtZSxyLl9zdGFydFRpbWU9cy0ocy1yLl9zdGFydFRpbWUpKnIuX3RpbWVTY2FsZS9lLHIuX3RpbWVTY2FsZT10Ll9yb290VGltZWxpbmUuX3RpbWVTY2FsZT1lLGUpOnIuX3RpbWVTY2FsZX0saC5wcm9ncmVzcz1mdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMudG90YWxUaW1lKHRoaXMuZHVyYXRpb24oKSoodGhpcy5feW95byYmMCE9KDEmdGhpcy5fY3ljbGUpPzEtdDp0KSt0aGlzLl9jeWNsZSoodGhpcy5fZHVyYXRpb24rdGhpcy5fcmVwZWF0RGVsYXkpLGUpOnRoaXMuX3RpbWUvdGhpcy5kdXJhdGlvbigpfSxoLnRvdGFsUHJvZ3Jlc3M9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnRvdGFsVGltZSh0aGlzLnRvdGFsRHVyYXRpb24oKSp0LGUpOnRoaXMuX3RvdGFsVGltZS90aGlzLnRvdGFsRHVyYXRpb24oKX0saC50aW1lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX2RpcnR5JiZ0aGlzLnRvdGFsRHVyYXRpb24oKSx0PnRoaXMuX2R1cmF0aW9uJiYodD10aGlzLl9kdXJhdGlvbiksdGhpcy5feW95byYmMCE9KDEmdGhpcy5fY3ljbGUpP3Q9dGhpcy5fZHVyYXRpb24tdCt0aGlzLl9jeWNsZSoodGhpcy5fZHVyYXRpb24rdGhpcy5fcmVwZWF0RGVsYXkpOjAhPT10aGlzLl9yZXBlYXQmJih0Kz10aGlzLl9jeWNsZSoodGhpcy5fZHVyYXRpb24rdGhpcy5fcmVwZWF0RGVsYXkpKSx0aGlzLnRvdGFsVGltZSh0LGUpKTp0aGlzLl90aW1lfSxoLmR1cmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QucHJvdG90eXBlLmR1cmF0aW9uLmNhbGwodGhpcyxlKTp0aGlzLl9kdXJhdGlvbn0saC50b3RhbER1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPy0xPT09dGhpcy5fcmVwZWF0P3RoaXM6dGhpcy5kdXJhdGlvbigodC10aGlzLl9yZXBlYXQqdGhpcy5fcmVwZWF0RGVsYXkpLyh0aGlzLl9yZXBlYXQrMSkpOih0aGlzLl9kaXJ0eSYmKHRoaXMuX3RvdGFsRHVyYXRpb249LTE9PT10aGlzLl9yZXBlYXQ/OTk5OTk5OTk5OTk5OnRoaXMuX2R1cmF0aW9uKih0aGlzLl9yZXBlYXQrMSkrdGhpcy5fcmVwZWF0RGVsYXkqdGhpcy5fcmVwZWF0LHRoaXMuX2RpcnR5PSExKSx0aGlzLl90b3RhbER1cmF0aW9uKX0saC5yZXBlYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3JlcGVhdD10LHRoaXMuX3VuY2FjaGUoITApKTp0aGlzLl9yZXBlYXR9LGgucmVwZWF0RGVsYXk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3JlcGVhdERlbGF5PXQsdGhpcy5fdW5jYWNoZSghMCkpOnRoaXMuX3JlcGVhdERlbGF5fSxoLnlveW89ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3lveW89dCx0aGlzKTp0aGlzLl95b3lvfSxufSwhMCkscy5fZ3NEZWZpbmUoIlRpbWVsaW5lTGl0ZSIsWyJjb3JlLkFuaW1hdGlvbiIsImNvcmUuU2ltcGxlVGltZWxpbmUiLCJUd2VlbkxpdGUiXSxmdW5jdGlvbih0LGUsaSl7dmFyIHI9ZnVuY3Rpb24odCl7ZS5jYWxsKHRoaXMsdCksdGhpcy5fbGFiZWxzPXt9LHRoaXMuYXV0b1JlbW92ZUNoaWxkcmVuPSEwPT09dGhpcy52YXJzLmF1dG9SZW1vdmVDaGlsZHJlbix0aGlzLnNtb290aENoaWxkVGltaW5nPSEwPT09dGhpcy52YXJzLnNtb290aENoaWxkVGltaW5nLHRoaXMuX3NvcnRDaGlsZHJlbj0hMCx0aGlzLl9vblVwZGF0ZT10aGlzLnZhcnMub25VcGRhdGU7dmFyIGkscixzPXRoaXMudmFycztmb3IociBpbiBzKWk9c1tyXSxsKGkpJiYtMSE9PWkuam9pbigiIikuaW5kZXhPZigie3NlbGZ9IikmJihzW3JdPXRoaXMuX3N3YXBTZWxmSW5QYXJhbXMoaSkpO2wocy50d2VlbnMpJiZ0aGlzLmFkZChzLnR3ZWVucywwLHMuYWxpZ24scy5zdGFnZ2VyKX0sbj1pLl9pbnRlcm5hbHMsYT1yLl9pbnRlcm5hbHM9e30sbz1uLmlzU2VsZWN0b3IsbD1uLmlzQXJyYXksaD1uLmxhenlUd2VlbnMsdT1uLmxhenlSZW5kZXIsXz1zLl9nc0RlZmluZS5nbG9iYWxzLGM9ZnVuY3Rpb24odCl7dmFyIGUsaT17fTtmb3IoZSBpbiB0KWlbZV09dFtlXTtyZXR1cm4gaX0sZj1mdW5jdGlvbih0LGUsaSl7dmFyIHIscyxuPXQuY3ljbGU7Zm9yKHIgaW4gbilzPW5bcl0sdFtyXT0iZnVuY3Rpb24iPT10eXBlb2Ygcz9zKGksZVtpXSk6c1tpJXMubGVuZ3RoXTtkZWxldGUgdC5jeWNsZX0scD1hLnBhdXNlQ2FsbGJhY2s9ZnVuY3Rpb24oKXt9LGQ9ZnVuY3Rpb24odCl7dmFyIGUsaT1bXSxyPXQubGVuZ3RoO2ZvcihlPTA7ZSE9PXI7aS5wdXNoKHRbZSsrXSkpO3JldHVybiBpfSxtPXIucHJvdG90eXBlPW5ldyBlO3JldHVybiByLnZlcnNpb249IjIuMC4yIixtLmNvbnN0cnVjdG9yPXIsbS5raWxsKCkuX2djPW0uX2ZvcmNpbmdQbGF5aGVhZD1tLl9oYXNQYXVzZT0hMSxtLnRvPWZ1bmN0aW9uKHQsZSxyLHMpe3ZhciBuPXIucmVwZWF0JiZfLlR3ZWVuTWF4fHxpO3JldHVybiBlP3RoaXMuYWRkKG5ldyBuKHQsZSxyKSxzKTp0aGlzLnNldCh0LHIscyl9LG0uZnJvbT1mdW5jdGlvbih0LGUscixzKXtyZXR1cm4gdGhpcy5hZGQoKHIucmVwZWF0JiZfLlR3ZWVuTWF4fHxpKS5mcm9tKHQsZSxyKSxzKX0sbS5mcm9tVG89ZnVuY3Rpb24odCxlLHIscyxuKXt2YXIgYT1zLnJlcGVhdCYmXy5Ud2Vlbk1heHx8aTtyZXR1cm4gZT90aGlzLmFkZChhLmZyb21Ubyh0LGUscixzKSxuKTp0aGlzLnNldCh0LHMsbil9LG0uc3RhZ2dlclRvPWZ1bmN0aW9uKHQsZSxzLG4sYSxsLGgsdSl7dmFyIF8scCxtPW5ldyByKHtvbkNvbXBsZXRlOmwsb25Db21wbGV0ZVBhcmFtczpoLGNhbGxiYWNrU2NvcGU6dSxzbW9vdGhDaGlsZFRpbWluZzp0aGlzLnNtb290aENoaWxkVGltaW5nfSksZz1zLmN5Y2xlO2Zvcigic3RyaW5nIj09dHlwZW9mIHQmJih0PWkuc2VsZWN0b3IodCl8fHQpLG8odD10fHxbXSkmJih0PWQodCkpLChuPW58fDApPDAmJigodD1kKHQpKS5yZXZlcnNlKCksbio9LTEpLHA9MDtwPHQubGVuZ3RoO3ArKykoXz1jKHMpKS5zdGFydEF0JiYoXy5zdGFydEF0PWMoXy5zdGFydEF0KSxfLnN0YXJ0QXQuY3ljbGUmJmYoXy5zdGFydEF0LHQscCkpLGcmJihmKF8sdCxwKSxudWxsIT1fLmR1cmF0aW9uJiYoZT1fLmR1cmF0aW9uLGRlbGV0ZSBfLmR1cmF0aW9uKSksbS50byh0W3BdLGUsXyxwKm4pO3JldHVybiB0aGlzLmFkZChtLGEpfSxtLnN0YWdnZXJGcm9tPWZ1bmN0aW9uKHQsZSxpLHIscyxuLGEsbyl7cmV0dXJuIGkuaW1tZWRpYXRlUmVuZGVyPTAhPWkuaW1tZWRpYXRlUmVuZGVyLGkucnVuQmFja3dhcmRzPSEwLHRoaXMuc3RhZ2dlclRvKHQsZSxpLHIscyxuLGEsbyl9LG0uc3RhZ2dlckZyb21Ubz1mdW5jdGlvbih0LGUsaSxyLHMsbixhLG8sbCl7cmV0dXJuIHIuc3RhcnRBdD1pLHIuaW1tZWRpYXRlUmVuZGVyPTAhPXIuaW1tZWRpYXRlUmVuZGVyJiYwIT1pLmltbWVkaWF0ZVJlbmRlcix0aGlzLnN0YWdnZXJUbyh0LGUscixzLG4sYSxvLGwpfSxtLmNhbGw9ZnVuY3Rpb24odCxlLHIscyl7cmV0dXJuIHRoaXMuYWRkKGkuZGVsYXllZENhbGwoMCx0LGUscikscyl9LG0uc2V0PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcj10aGlzLl9wYXJzZVRpbWVPckxhYmVsKHIsMCwhMCksbnVsbD09ZS5pbW1lZGlhdGVSZW5kZXImJihlLmltbWVkaWF0ZVJlbmRlcj1yPT09dGhpcy5fdGltZSYmIXRoaXMuX3BhdXNlZCksdGhpcy5hZGQobmV3IGkodCwwLGUpLHIpfSxyLmV4cG9ydFJvb3Q9ZnVuY3Rpb24odCxlKXtudWxsPT0odD10fHx7fSkuc21vb3RoQ2hpbGRUaW1pbmcmJih0LnNtb290aENoaWxkVGltaW5nPSEwKTt2YXIgcyxuLGEsbyxsPW5ldyByKHQpLGg9bC5fdGltZWxpbmU7Zm9yKG51bGw9PWUmJihlPSEwKSxoLl9yZW1vdmUobCwhMCksbC5fc3RhcnRUaW1lPTAsbC5fcmF3UHJldlRpbWU9bC5fdGltZT1sLl90b3RhbFRpbWU9aC5fdGltZSxhPWguX2ZpcnN0O2E7KW89YS5fbmV4dCxlJiZhIGluc3RhbmNlb2YgaSYmYS50YXJnZXQ9PT1hLnZhcnMub25Db21wbGV0ZXx8KChuPWEuX3N0YXJ0VGltZS1hLl9kZWxheSk8MCYmKHM9MSksbC5hZGQoYSxuKSksYT1vO3JldHVybiBoLmFkZChsLDApLHMmJmwudG90YWxEdXJhdGlvbigpLGx9LG0uYWRkPWZ1bmN0aW9uKHMsbixhLG8pe3ZhciBoLHUsXyxjLGYscDtpZigibnVtYmVyIiE9dHlwZW9mIG4mJihuPXRoaXMuX3BhcnNlVGltZU9yTGFiZWwobiwwLCEwLHMpKSwhKHMgaW5zdGFuY2VvZiB0KSl7aWYocyBpbnN0YW5jZW9mIEFycmF5fHxzJiZzLnB1c2gmJmwocykpe2ZvcihhPWF8fCJub3JtYWwiLG89b3x8MCxoPW4sdT1zLmxlbmd0aCxfPTA7Xzx1O18rKylsKGM9c1tfXSkmJihjPW5ldyByKHt0d2VlbnM6Y30pKSx0aGlzLmFkZChjLGgpLCJzdHJpbmciIT10eXBlb2YgYyYmImZ1bmN0aW9uIiE9dHlwZW9mIGMmJigic2VxdWVuY2UiPT09YT9oPWMuX3N0YXJ0VGltZStjLnRvdGFsRHVyYXRpb24oKS9jLl90aW1lU2NhbGU6InN0YXJ0Ij09PWEmJihjLl9zdGFydFRpbWUtPWMuZGVsYXkoKSkpLGgrPW87cmV0dXJuIHRoaXMuX3VuY2FjaGUoITApfWlmKCJzdHJpbmciPT10eXBlb2YgcylyZXR1cm4gdGhpcy5hZGRMYWJlbChzLG4pO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBzKXRocm93IkNhbm5vdCBhZGQgIitzKyIgaW50byB0aGUgdGltZWxpbmU7IGl0IGlzIG5vdCBhIHR3ZWVuLCB0aW1lbGluZSwgZnVuY3Rpb24sIG9yIHN0cmluZy4iO3M9aS5kZWxheWVkQ2FsbCgwLHMpfWlmKGUucHJvdG90eXBlLmFkZC5jYWxsKHRoaXMscyxuKSxzLl90aW1lJiYoaD1NYXRoLm1heCgwLE1hdGgubWluKHMudG90YWxEdXJhdGlvbigpLCh0aGlzLnJhd1RpbWUoKS1zLl9zdGFydFRpbWUpKnMuX3RpbWVTY2FsZSkpLE1hdGguYWJzKGgtcy5fdG90YWxUaW1lKT4xZS01JiZzLnJlbmRlcihoLCExLCExKSksKHRoaXMuX2djfHx0aGlzLl90aW1lPT09dGhpcy5fZHVyYXRpb24pJiYhdGhpcy5fcGF1c2VkJiZ0aGlzLl9kdXJhdGlvbjx0aGlzLmR1cmF0aW9uKCkpZm9yKHA9KGY9dGhpcykucmF3VGltZSgpPnMuX3N0YXJ0VGltZTtmLl90aW1lbGluZTspcCYmZi5fdGltZWxpbmUuc21vb3RoQ2hpbGRUaW1pbmc/Zi50b3RhbFRpbWUoZi5fdG90YWxUaW1lLCEwKTpmLl9nYyYmZi5fZW5hYmxlZCghMCwhMSksZj1mLl90aW1lbGluZTtyZXR1cm4gdGhpc30sbS5yZW1vdmU9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIHQpe3RoaXMuX3JlbW92ZShlLCExKTt2YXIgaT1lLl90aW1lbGluZT1lLnZhcnMudXNlRnJhbWVzP3QuX3Jvb3RGcmFtZXNUaW1lbGluZTp0Ll9yb290VGltZWxpbmU7cmV0dXJuIGUuX3N0YXJ0VGltZT0oZS5fcGF1c2VkP2UuX3BhdXNlVGltZTppLl90aW1lKS0oZS5fcmV2ZXJzZWQ/ZS50b3RhbER1cmF0aW9uKCktZS5fdG90YWxUaW1lOmUuX3RvdGFsVGltZSkvZS5fdGltZVNjYWxlLHRoaXN9aWYoZSBpbnN0YW5jZW9mIEFycmF5fHxlJiZlLnB1c2gmJmwoZSkpe2Zvcih2YXIgcj1lLmxlbmd0aDstLXI+LTE7KXRoaXMucmVtb3ZlKGVbcl0pO3JldHVybiB0aGlzfXJldHVybiJzdHJpbmciPT10eXBlb2YgZT90aGlzLnJlbW92ZUxhYmVsKGUpOnRoaXMua2lsbChudWxsLGUpfSxtLl9yZW1vdmU9ZnVuY3Rpb24odCxpKXtyZXR1cm4gZS5wcm90b3R5cGUuX3JlbW92ZS5jYWxsKHRoaXMsdCxpKSx0aGlzLl9sYXN0P3RoaXMuX3RpbWU+dGhpcy5kdXJhdGlvbigpJiYodGhpcy5fdGltZT10aGlzLl9kdXJhdGlvbix0aGlzLl90b3RhbFRpbWU9dGhpcy5fdG90YWxEdXJhdGlvbik6dGhpcy5fdGltZT10aGlzLl90b3RhbFRpbWU9dGhpcy5fZHVyYXRpb249dGhpcy5fdG90YWxEdXJhdGlvbj0wLHRoaXN9LG0uYXBwZW5kPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYWRkKHQsdGhpcy5fcGFyc2VUaW1lT3JMYWJlbChudWxsLGUsITAsdCkpfSxtLmluc2VydD1tLmluc2VydE11bHRpcGxlPWZ1bmN0aW9uKHQsZSxpLHIpe3JldHVybiB0aGlzLmFkZCh0LGV8fDAsaSxyKX0sbS5hcHBlbmRNdWx0aXBsZT1mdW5jdGlvbih0LGUsaSxyKXtyZXR1cm4gdGhpcy5hZGQodCx0aGlzLl9wYXJzZVRpbWVPckxhYmVsKG51bGwsZSwhMCx0KSxpLHIpfSxtLmFkZExhYmVsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2xhYmVsc1t0XT10aGlzLl9wYXJzZVRpbWVPckxhYmVsKGUpLHRoaXN9LG0uYWRkUGF1c2U9ZnVuY3Rpb24odCxlLHIscyl7dmFyIG49aS5kZWxheWVkQ2FsbCgwLHAscixzfHx0aGlzKTtyZXR1cm4gbi52YXJzLm9uQ29tcGxldGU9bi52YXJzLm9uUmV2ZXJzZUNvbXBsZXRlPWUsbi5kYXRhPSJpc1BhdXNlIix0aGlzLl9oYXNQYXVzZT0hMCx0aGlzLmFkZChuLHQpfSxtLnJlbW92ZUxhYmVsPWZ1bmN0aW9uKHQpe3JldHVybiBkZWxldGUgdGhpcy5fbGFiZWxzW3RdLHRoaXN9LG0uZ2V0TGFiZWxUaW1lPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10aGlzLl9sYWJlbHNbdF0/dGhpcy5fbGFiZWxzW3RdOi0xfSxtLl9wYXJzZVRpbWVPckxhYmVsPWZ1bmN0aW9uKGUsaSxyLHMpe3ZhciBuLGE7aWYocyBpbnN0YW5jZW9mIHQmJnMudGltZWxpbmU9PT10aGlzKXRoaXMucmVtb3ZlKHMpO2Vsc2UgaWYocyYmKHMgaW5zdGFuY2VvZiBBcnJheXx8cy5wdXNoJiZsKHMpKSlmb3IoYT1zLmxlbmd0aDstLWE+LTE7KXNbYV1pbnN0YW5jZW9mIHQmJnNbYV0udGltZWxpbmU9PT10aGlzJiZ0aGlzLnJlbW92ZShzW2FdKTtpZihuPSJudW1iZXIiIT10eXBlb2YgZXx8aT90aGlzLmR1cmF0aW9uKCk+OTk5OTk5OTk5OTk/dGhpcy5yZWNlbnQoKS5lbmRUaW1lKCExKTp0aGlzLl9kdXJhdGlvbjowLCJzdHJpbmciPT10eXBlb2YgaSlyZXR1cm4gdGhpcy5fcGFyc2VUaW1lT3JMYWJlbChpLHImJiJudW1iZXIiPT10eXBlb2YgZSYmbnVsbD09dGhpcy5fbGFiZWxzW2ldP2UtbjowLHIpO2lmKGk9aXx8MCwic3RyaW5nIiE9dHlwZW9mIGV8fCFpc05hTihlKSYmbnVsbD09dGhpcy5fbGFiZWxzW2VdKW51bGw9PWUmJihlPW4pO2Vsc2V7aWYoLTE9PT0oYT1lLmluZGV4T2YoIj0iKSkpcmV0dXJuIG51bGw9PXRoaXMuX2xhYmVsc1tlXT9yP3RoaXMuX2xhYmVsc1tlXT1uK2k6aTp0aGlzLl9sYWJlbHNbZV0raTtpPXBhcnNlSW50KGUuY2hhckF0KGEtMSkrIjEiLDEwKSpOdW1iZXIoZS5zdWJzdHIoYSsxKSksZT1hPjE/dGhpcy5fcGFyc2VUaW1lT3JMYWJlbChlLnN1YnN0cigwLGEtMSksMCxyKTpufXJldHVybiBOdW1iZXIoZSkraX0sbS5zZWVrPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudG90YWxUaW1lKCJudW1iZXIiPT10eXBlb2YgdD90OnRoaXMuX3BhcnNlVGltZU9yTGFiZWwodCksITEhPT1lKX0sbS5zdG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGF1c2VkKCEwKX0sbS5nb3RvQW5kUGxheT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnBsYXkodCxlKX0sbS5nb3RvQW5kU3RvcD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnBhdXNlKHQsZSl9LG0ucmVuZGVyPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9nYyYmdGhpcy5fZW5hYmxlZCghMCwhMSk7dmFyIHIscyxuLGEsbyxsLF8sYz10aGlzLl90aW1lLGY9dGhpcy5fZGlydHk/dGhpcy50b3RhbER1cmF0aW9uKCk6dGhpcy5fdG90YWxEdXJhdGlvbixwPXRoaXMuX3N0YXJ0VGltZSxkPXRoaXMuX3RpbWVTY2FsZSxtPXRoaXMuX3BhdXNlZDtpZihjIT09dGhpcy5fdGltZSYmKHQrPXRoaXMuX3RpbWUtYyksdD49Zi0xZS03JiZ0Pj0wKXRoaXMuX3RvdGFsVGltZT10aGlzLl90aW1lPWYsdGhpcy5fcmV2ZXJzZWR8fHRoaXMuX2hhc1BhdXNlZENoaWxkKCl8fChzPSEwLGE9Im9uQ29tcGxldGUiLG89ISF0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4sMD09PXRoaXMuX2R1cmF0aW9uJiYodDw9MCYmdD49LTFlLTd8fHRoaXMuX3Jhd1ByZXZUaW1lPDB8fDFlLTEwPT09dGhpcy5fcmF3UHJldlRpbWUpJiZ0aGlzLl9yYXdQcmV2VGltZSE9PXQmJnRoaXMuX2ZpcnN0JiYobz0hMCx0aGlzLl9yYXdQcmV2VGltZT4xZS0xMCYmKGE9Im9uUmV2ZXJzZUNvbXBsZXRlIikpKSx0aGlzLl9yYXdQcmV2VGltZT10aGlzLl9kdXJhdGlvbnx8IWV8fHR8fHRoaXMuX3Jhd1ByZXZUaW1lPT09dD90OjFlLTEwLHQ9ZisxZS00O2Vsc2UgaWYodDwxZS03KWlmKHRoaXMuX3RvdGFsVGltZT10aGlzLl90aW1lPTAsKDAhPT1jfHwwPT09dGhpcy5fZHVyYXRpb24mJjFlLTEwIT09dGhpcy5fcmF3UHJldlRpbWUmJih0aGlzLl9yYXdQcmV2VGltZT4wfHx0PDAmJnRoaXMuX3Jhd1ByZXZUaW1lPj0wKSkmJihhPSJvblJldmVyc2VDb21wbGV0ZSIscz10aGlzLl9yZXZlcnNlZCksdDwwKXRoaXMuX2FjdGl2ZT0hMSx0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4mJnRoaXMuX3JldmVyc2VkPyhvPXM9ITAsYT0ib25SZXZlcnNlQ29tcGxldGUiKTp0aGlzLl9yYXdQcmV2VGltZT49MCYmdGhpcy5fZmlyc3QmJihvPSEwKSx0aGlzLl9yYXdQcmV2VGltZT10O2Vsc2V7aWYodGhpcy5fcmF3UHJldlRpbWU9dGhpcy5fZHVyYXRpb258fCFlfHx0fHx0aGlzLl9yYXdQcmV2VGltZT09PXQ/dDoxZS0xMCwwPT09dCYmcylmb3Iocj10aGlzLl9maXJzdDtyJiYwPT09ci5fc3RhcnRUaW1lOylyLl9kdXJhdGlvbnx8KHM9ITEpLHI9ci5fbmV4dDt0PTAsdGhpcy5faW5pdHRlZHx8KG89ITApfWVsc2V7aWYodGhpcy5faGFzUGF1c2UmJiF0aGlzLl9mb3JjaW5nUGxheWhlYWQmJiFlKXtpZih0Pj1jKWZvcihyPXRoaXMuX2ZpcnN0O3ImJnIuX3N0YXJ0VGltZTw9dCYmIWw7KXIuX2R1cmF0aW9ufHwiaXNQYXVzZSIhPT1yLmRhdGF8fHIucmF0aW98fDA9PT1yLl9zdGFydFRpbWUmJjA9PT10aGlzLl9yYXdQcmV2VGltZXx8KGw9cikscj1yLl9uZXh0O2Vsc2UgZm9yKHI9dGhpcy5fbGFzdDtyJiZyLl9zdGFydFRpbWU+PXQmJiFsOylyLl9kdXJhdGlvbnx8ImlzUGF1c2UiPT09ci5kYXRhJiZyLl9yYXdQcmV2VGltZT4wJiYobD1yKSxyPXIuX3ByZXY7bCYmKHRoaXMuX3RpbWU9dD1sLl9zdGFydFRpbWUsdGhpcy5fdG90YWxUaW1lPXQrdGhpcy5fY3ljbGUqKHRoaXMuX3RvdGFsRHVyYXRpb24rdGhpcy5fcmVwZWF0RGVsYXkpKX10aGlzLl90b3RhbFRpbWU9dGhpcy5fdGltZT10aGlzLl9yYXdQcmV2VGltZT10fWlmKHRoaXMuX3RpbWUhPT1jJiZ0aGlzLl9maXJzdHx8aXx8b3x8bCl7aWYodGhpcy5faW5pdHRlZHx8KHRoaXMuX2luaXR0ZWQ9ITApLHRoaXMuX2FjdGl2ZXx8IXRoaXMuX3BhdXNlZCYmdGhpcy5fdGltZSE9PWMmJnQ+MCYmKHRoaXMuX2FjdGl2ZT0hMCksMD09PWMmJnRoaXMudmFycy5vblN0YXJ0JiYoMD09PXRoaXMuX3RpbWUmJnRoaXMuX2R1cmF0aW9ufHxlfHx0aGlzLl9jYWxsYmFjaygib25TdGFydCIpKSwoXz10aGlzLl90aW1lKT49Yylmb3Iocj10aGlzLl9maXJzdDtyJiYobj1yLl9uZXh0LF89PT10aGlzLl90aW1lJiYoIXRoaXMuX3BhdXNlZHx8bSkpOykoci5fYWN0aXZlfHxyLl9zdGFydFRpbWU8PV8mJiFyLl9wYXVzZWQmJiFyLl9nYykmJihsPT09ciYmdGhpcy5wYXVzZSgpLHIuX3JldmVyc2VkP3IucmVuZGVyKChyLl9kaXJ0eT9yLnRvdGFsRHVyYXRpb24oKTpyLl90b3RhbER1cmF0aW9uKS0odC1yLl9zdGFydFRpbWUpKnIuX3RpbWVTY2FsZSxlLGkpOnIucmVuZGVyKCh0LXIuX3N0YXJ0VGltZSkqci5fdGltZVNjYWxlLGUsaSkpLHI9bjtlbHNlIGZvcihyPXRoaXMuX2xhc3Q7ciYmKG49ci5fcHJldixfPT09dGhpcy5fdGltZSYmKCF0aGlzLl9wYXVzZWR8fG0pKTspe2lmKHIuX2FjdGl2ZXx8ci5fc3RhcnRUaW1lPD1jJiYhci5fcGF1c2VkJiYhci5fZ2Mpe2lmKGw9PT1yKXtmb3IobD1yLl9wcmV2O2wmJmwuZW5kVGltZSgpPnRoaXMuX3RpbWU7KWwucmVuZGVyKGwuX3JldmVyc2VkP2wudG90YWxEdXJhdGlvbigpLSh0LWwuX3N0YXJ0VGltZSkqbC5fdGltZVNjYWxlOih0LWwuX3N0YXJ0VGltZSkqbC5fdGltZVNjYWxlLGUsaSksbD1sLl9wcmV2O2w9bnVsbCx0aGlzLnBhdXNlKCl9ci5fcmV2ZXJzZWQ/ci5yZW5kZXIoKHIuX2RpcnR5P3IudG90YWxEdXJhdGlvbigpOnIuX3RvdGFsRHVyYXRpb24pLSh0LXIuX3N0YXJ0VGltZSkqci5fdGltZVNjYWxlLGUsaSk6ci5yZW5kZXIoKHQtci5fc3RhcnRUaW1lKSpyLl90aW1lU2NhbGUsZSxpKX1yPW59dGhpcy5fb25VcGRhdGUmJihlfHwoaC5sZW5ndGgmJnUoKSx0aGlzLl9jYWxsYmFjaygib25VcGRhdGUiKSkpLGEmJih0aGlzLl9nY3x8cCE9PXRoaXMuX3N0YXJ0VGltZSYmZD09PXRoaXMuX3RpbWVTY2FsZXx8KDA9PT10aGlzLl90aW1lfHxmPj10aGlzLnRvdGFsRHVyYXRpb24oKSkmJihzJiYoaC5sZW5ndGgmJnUoKSx0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4mJnRoaXMuX2VuYWJsZWQoITEsITEpLHRoaXMuX2FjdGl2ZT0hMSksIWUmJnRoaXMudmFyc1thXSYmdGhpcy5fY2FsbGJhY2soYSkpKX19LG0uX2hhc1BhdXNlZENoaWxkPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2ZpcnN0O3Q7KXtpZih0Ll9wYXVzZWR8fHQgaW5zdGFuY2VvZiByJiZ0Ll9oYXNQYXVzZWRDaGlsZCgpKXJldHVybiEwO3Q9dC5fbmV4dH1yZXR1cm4hMX0sbS5nZXRDaGlsZHJlbj1mdW5jdGlvbih0LGUscixzKXtzPXN8fC05OTk5OTk5OTk5O2Zvcih2YXIgbj1bXSxhPXRoaXMuX2ZpcnN0LG89MDthOylhLl9zdGFydFRpbWU8c3x8KGEgaW5zdGFuY2VvZiBpPyExIT09ZSYmKG5bbysrXT1hKTooITEhPT1yJiYobltvKytdPWEpLCExIT09dCYmKG89KG49bi5jb25jYXQoYS5nZXRDaGlsZHJlbighMCxlLHIpKSkubGVuZ3RoKSkpLGE9YS5fbmV4dDtyZXR1cm4gbn0sbS5nZXRUd2VlbnNPZj1mdW5jdGlvbih0LGUpe3ZhciByLHMsbj10aGlzLl9nYyxhPVtdLG89MDtmb3IobiYmdGhpcy5fZW5hYmxlZCghMCwhMCkscz0ocj1pLmdldFR3ZWVuc09mKHQpKS5sZW5ndGg7LS1zPi0xOykocltzXS50aW1lbGluZT09PXRoaXN8fGUmJnRoaXMuX2NvbnRhaW5zKHJbc10pKSYmKGFbbysrXT1yW3NdKTtyZXR1cm4gbiYmdGhpcy5fZW5hYmxlZCghMSwhMCksYX0sbS5yZWNlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVjZW50fSxtLl9jb250YWlucz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC50aW1lbGluZTtlOyl7aWYoZT09PXRoaXMpcmV0dXJuITA7ZT1lLnRpbWVsaW5lfXJldHVybiExfSxtLnNoaWZ0Q2hpbGRyZW49ZnVuY3Rpb24odCxlLGkpe2k9aXx8MDtmb3IodmFyIHIscz10aGlzLl9maXJzdCxuPXRoaXMuX2xhYmVscztzOylzLl9zdGFydFRpbWU+PWkmJihzLl9zdGFydFRpbWUrPXQpLHM9cy5fbmV4dDtpZihlKWZvcihyIGluIG4pbltyXT49aSYmKG5bcl0rPXQpO3JldHVybiB0aGlzLl91bmNhY2hlKCEwKX0sbS5fa2lsbD1mdW5jdGlvbih0LGUpe2lmKCF0JiYhZSlyZXR1cm4gdGhpcy5fZW5hYmxlZCghMSwhMSk7Zm9yKHZhciBpPWU/dGhpcy5nZXRUd2VlbnNPZihlKTp0aGlzLmdldENoaWxkcmVuKCEwLCEwLCExKSxyPWkubGVuZ3RoLHM9ITE7LS1yPi0xOylpW3JdLl9raWxsKHQsZSkmJihzPSEwKTtyZXR1cm4gc30sbS5jbGVhcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldENoaWxkcmVuKCExLCEwLCEwKSxpPWUubGVuZ3RoO2Zvcih0aGlzLl90aW1lPXRoaXMuX3RvdGFsVGltZT0wOy0taT4tMTspZVtpXS5fZW5hYmxlZCghMSwhMSk7cmV0dXJuITEhPT10JiYodGhpcy5fbGFiZWxzPXt9KSx0aGlzLl91bmNhY2hlKCEwKX0sbS5pbnZhbGlkYXRlPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuX2ZpcnN0O2U7KWUuaW52YWxpZGF0ZSgpLGU9ZS5fbmV4dDtyZXR1cm4gdC5wcm90b3R5cGUuaW52YWxpZGF0ZS5jYWxsKHRoaXMpfSxtLl9lbmFibGVkPWZ1bmN0aW9uKHQsaSl7aWYodD09PXRoaXMuX2djKWZvcih2YXIgcj10aGlzLl9maXJzdDtyOylyLl9lbmFibGVkKHQsITApLHI9ci5fbmV4dDtyZXR1cm4gZS5wcm90b3R5cGUuX2VuYWJsZWQuY2FsbCh0aGlzLHQsaSl9LG0udG90YWxUaW1lPWZ1bmN0aW9uKGUsaSxyKXt0aGlzLl9mb3JjaW5nUGxheWhlYWQ9ITA7dmFyIHM9dC5wcm90b3R5cGUudG90YWxUaW1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5fZm9yY2luZ1BsYXloZWFkPSExLHN9LG0uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KDAhPT10aGlzLmR1cmF0aW9uKCkmJjAhPT10JiZ0aGlzLnRpbWVTY2FsZSh0aGlzLl9kdXJhdGlvbi90KSx0aGlzKToodGhpcy5fZGlydHkmJnRoaXMudG90YWxEdXJhdGlvbigpLHRoaXMuX2R1cmF0aW9uKX0sbS50b3RhbER1cmF0aW9uPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXtpZih0aGlzLl9kaXJ0eSl7Zm9yKHZhciBlLGkscj0wLHM9dGhpcy5fbGFzdCxuPTk5OTk5OTk5OTk5OTtzOyllPXMuX3ByZXYscy5fZGlydHkmJnMudG90YWxEdXJhdGlvbigpLHMuX3N0YXJ0VGltZT5uJiZ0aGlzLl9zb3J0Q2hpbGRyZW4mJiFzLl9wYXVzZWQmJiF0aGlzLl9jYWxjdWxhdGluZ0R1cmF0aW9uPyh0aGlzLl9jYWxjdWxhdGluZ0R1cmF0aW9uPTEsdGhpcy5hZGQocyxzLl9zdGFydFRpbWUtcy5fZGVsYXkpLHRoaXMuX2NhbGN1bGF0aW5nRHVyYXRpb249MCk6bj1zLl9zdGFydFRpbWUscy5fc3RhcnRUaW1lPDAmJiFzLl9wYXVzZWQmJihyLT1zLl9zdGFydFRpbWUsdGhpcy5fdGltZWxpbmUuc21vb3RoQ2hpbGRUaW1pbmcmJih0aGlzLl9zdGFydFRpbWUrPXMuX3N0YXJ0VGltZS90aGlzLl90aW1lU2NhbGUsdGhpcy5fdGltZS09cy5fc3RhcnRUaW1lLHRoaXMuX3RvdGFsVGltZS09cy5fc3RhcnRUaW1lLHRoaXMuX3Jhd1ByZXZUaW1lLT1zLl9zdGFydFRpbWUpLHRoaXMuc2hpZnRDaGlsZHJlbigtcy5fc3RhcnRUaW1lLCExLC05OTk5OTk5OTk5KSxuPTApLChpPXMuX3N0YXJ0VGltZStzLl90b3RhbER1cmF0aW9uL3MuX3RpbWVTY2FsZSk+ciYmKHI9aSkscz1lO3RoaXMuX2R1cmF0aW9uPXRoaXMuX3RvdGFsRHVyYXRpb249cix0aGlzLl9kaXJ0eT0hMX1yZXR1cm4gdGhpcy5fdG90YWxEdXJhdGlvbn1yZXR1cm4gdCYmdGhpcy50b3RhbER1cmF0aW9uKCk/dGhpcy50aW1lU2NhbGUodGhpcy5fdG90YWxEdXJhdGlvbi90KTp0aGlzfSxtLnBhdXNlZD1mdW5jdGlvbihlKXtpZighZSlmb3IodmFyIGk9dGhpcy5fZmlyc3Qscj10aGlzLl90aW1lO2k7KWkuX3N0YXJ0VGltZT09PXImJiJpc1BhdXNlIj09PWkuZGF0YSYmKGkuX3Jhd1ByZXZUaW1lPTApLGk9aS5fbmV4dDtyZXR1cm4gdC5wcm90b3R5cGUucGF1c2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sbS51c2VzRnJhbWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuX3RpbWVsaW5lO2UuX3RpbWVsaW5lOyllPWUuX3RpbWVsaW5lO3JldHVybiBlPT09dC5fcm9vdEZyYW1lc1RpbWVsaW5lfSxtLnJhd1RpbWU9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJih0aGlzLl9wYXVzZWR8fHRoaXMuX3JlcGVhdCYmdGhpcy50aW1lKCk+MCYmdGhpcy50b3RhbFByb2dyZXNzKCk8MSk/dGhpcy5fdG90YWxUaW1lJSh0aGlzLl9kdXJhdGlvbit0aGlzLl9yZXBlYXREZWxheSk6dGhpcy5fcGF1c2VkP3RoaXMuX3RvdGFsVGltZToodGhpcy5fdGltZWxpbmUucmF3VGltZSh0KS10aGlzLl9zdGFydFRpbWUpKnRoaXMuX3RpbWVTY2FsZX0scn0sITApLHMuX2dzRGVmaW5lKCJUaW1lbGluZU1heCIsWyJUaW1lbGluZUxpdGUiLCJUd2VlbkxpdGUiLCJlYXNpbmcuRWFzZSJdLGZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1mdW5jdGlvbihlKXt0LmNhbGwodGhpcyxlKSx0aGlzLl9yZXBlYXQ9dGhpcy52YXJzLnJlcGVhdHx8MCx0aGlzLl9yZXBlYXREZWxheT10aGlzLnZhcnMucmVwZWF0RGVsYXl8fDAsdGhpcy5fY3ljbGU9MCx0aGlzLl95b3lvPSEwPT09dGhpcy52YXJzLnlveW8sdGhpcy5fZGlydHk9ITB9LG49ZS5faW50ZXJuYWxzLGE9bi5sYXp5VHdlZW5zLG89bi5sYXp5UmVuZGVyLGw9cy5fZ3NEZWZpbmUuZ2xvYmFscyxoPW5ldyBpKG51bGwsbnVsbCwxLDApLHU9ci5wcm90b3R5cGU9bmV3IHQ7cmV0dXJuIHUuY29uc3RydWN0b3I9cix1LmtpbGwoKS5fZ2M9ITEsci52ZXJzaW9uPSIyLjAuMiIsdS5pbnZhbGlkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3lveW89ITA9PT10aGlzLnZhcnMueW95byx0aGlzLl9yZXBlYXQ9dGhpcy52YXJzLnJlcGVhdHx8MCx0aGlzLl9yZXBlYXREZWxheT10aGlzLnZhcnMucmVwZWF0RGVsYXl8fDAsdGhpcy5fdW5jYWNoZSghMCksdC5wcm90b3R5cGUuaW52YWxpZGF0ZS5jYWxsKHRoaXMpfSx1LmFkZENhbGxiYWNrPWZ1bmN0aW9uKHQsaSxyLHMpe3JldHVybiB0aGlzLmFkZChlLmRlbGF5ZWRDYWxsKDAsdCxyLHMpLGkpfSx1LnJlbW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHQsZSl7aWYodClpZihudWxsPT1lKXRoaXMuX2tpbGwobnVsbCx0KTtlbHNlIGZvcih2YXIgaT10aGlzLmdldFR3ZWVuc09mKHQsITEpLHI9aS5sZW5ndGgscz10aGlzLl9wYXJzZVRpbWVPckxhYmVsKGUpOy0tcj4tMTspaVtyXS5fc3RhcnRUaW1lPT09cyYmaVtyXS5fZW5hYmxlZCghMSwhMSk7cmV0dXJuIHRoaXN9LHUucmVtb3ZlUGF1c2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVtb3ZlQ2FsbGJhY2sodC5faW50ZXJuYWxzLnBhdXNlQ2FsbGJhY2ssZSl9LHUudHdlZW5Ubz1mdW5jdGlvbih0LGkpe2k9aXx8e307dmFyIHIscyxuLGE9e2Vhc2U6aCx1c2VGcmFtZXM6dGhpcy51c2VzRnJhbWVzKCksaW1tZWRpYXRlUmVuZGVyOiExLGxhenk6ITF9LG89aS5yZXBlYXQmJmwuVHdlZW5NYXh8fGU7Zm9yKHMgaW4gaSlhW3NdPWlbc107cmV0dXJuIGEudGltZT10aGlzLl9wYXJzZVRpbWVPckxhYmVsKHQpLHI9TWF0aC5hYnMoTnVtYmVyKGEudGltZSktdGhpcy5fdGltZSkvdGhpcy5fdGltZVNjYWxlfHwuMDAxLG49bmV3IG8odGhpcyxyLGEpLGEub25TdGFydD1mdW5jdGlvbigpe24udGFyZ2V0LnBhdXNlZCghMCksbi52YXJzLnRpbWU9PT1uLnRhcmdldC50aW1lKCl8fHIhPT1uLmR1cmF0aW9uKCl8fG4uaXNGcm9tVG98fG4uZHVyYXRpb24oTWF0aC5hYnMobi52YXJzLnRpbWUtbi50YXJnZXQudGltZSgpKS9uLnRhcmdldC5fdGltZVNjYWxlKS5yZW5kZXIobi50aW1lKCksITAsITApLGkub25TdGFydCYmaS5vblN0YXJ0LmFwcGx5KGkub25TdGFydFNjb3BlfHxpLmNhbGxiYWNrU2NvcGV8fG4saS5vblN0YXJ0UGFyYW1zfHxbXSl9LG59LHUudHdlZW5Gcm9tVG89ZnVuY3Rpb24odCxlLGkpe2k9aXx8e30sdD10aGlzLl9wYXJzZVRpbWVPckxhYmVsKHQpLGkuc3RhcnRBdD17b25Db21wbGV0ZTp0aGlzLnNlZWssb25Db21wbGV0ZVBhcmFtczpbdF0sY2FsbGJhY2tTY29wZTp0aGlzfSxpLmltbWVkaWF0ZVJlbmRlcj0hMSE9PWkuaW1tZWRpYXRlUmVuZGVyO3ZhciByPXRoaXMudHdlZW5UbyhlLGkpO3JldHVybiByLmlzRnJvbVRvPTEsci5kdXJhdGlvbihNYXRoLmFicyhyLnZhcnMudGltZS10KS90aGlzLl90aW1lU2NhbGV8fC4wMDEpfSx1LnJlbmRlcj1mdW5jdGlvbih0LGUsaSl7dGhpcy5fZ2MmJnRoaXMuX2VuYWJsZWQoITAsITEpO3ZhciByLHMsbixsLGgsdSxfLGMsZj10aGlzLl90aW1lLHA9dGhpcy5fZGlydHk/dGhpcy50b3RhbER1cmF0aW9uKCk6dGhpcy5fdG90YWxEdXJhdGlvbixkPXRoaXMuX2R1cmF0aW9uLG09dGhpcy5fdG90YWxUaW1lLGc9dGhpcy5fc3RhcnRUaW1lLHY9dGhpcy5fdGltZVNjYWxlLHk9dGhpcy5fcmF3UHJldlRpbWUsVD10aGlzLl9wYXVzZWQsdz10aGlzLl9jeWNsZTtpZihmIT09dGhpcy5fdGltZSYmKHQrPXRoaXMuX3RpbWUtZiksdD49cC0xZS03JiZ0Pj0wKXRoaXMuX2xvY2tlZHx8KHRoaXMuX3RvdGFsVGltZT1wLHRoaXMuX2N5Y2xlPXRoaXMuX3JlcGVhdCksdGhpcy5fcmV2ZXJzZWR8fHRoaXMuX2hhc1BhdXNlZENoaWxkKCl8fChzPSEwLGw9Im9uQ29tcGxldGUiLGg9ISF0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4sMD09PXRoaXMuX2R1cmF0aW9uJiYodDw9MCYmdD49LTFlLTd8fHk8MHx8MWUtMTA9PT15KSYmeSE9PXQmJnRoaXMuX2ZpcnN0JiYoaD0hMCx5PjFlLTEwJiYobD0ib25SZXZlcnNlQ29tcGxldGUiKSkpLHRoaXMuX3Jhd1ByZXZUaW1lPXRoaXMuX2R1cmF0aW9ufHwhZXx8dHx8dGhpcy5fcmF3UHJldlRpbWU9PT10P3Q6MWUtMTAsdGhpcy5feW95byYmMCE9KDEmdGhpcy5fY3ljbGUpP3RoaXMuX3RpbWU9dD0wOih0aGlzLl90aW1lPWQsdD1kKzFlLTQpO2Vsc2UgaWYodDwxZS03KWlmKHRoaXMuX2xvY2tlZHx8KHRoaXMuX3RvdGFsVGltZT10aGlzLl9jeWNsZT0wKSx0aGlzLl90aW1lPTAsKDAhPT1mfHwwPT09ZCYmMWUtMTAhPT15JiYoeT4wfHx0PDAmJnk+PTApJiYhdGhpcy5fbG9ja2VkKSYmKGw9Im9uUmV2ZXJzZUNvbXBsZXRlIixzPXRoaXMuX3JldmVyc2VkKSx0PDApdGhpcy5fYWN0aXZlPSExLHRoaXMuX3RpbWVsaW5lLmF1dG9SZW1vdmVDaGlsZHJlbiYmdGhpcy5fcmV2ZXJzZWQ/KGg9cz0hMCxsPSJvblJldmVyc2VDb21wbGV0ZSIpOnk+PTAmJnRoaXMuX2ZpcnN0JiYoaD0hMCksdGhpcy5fcmF3UHJldlRpbWU9dDtlbHNle2lmKHRoaXMuX3Jhd1ByZXZUaW1lPWR8fCFlfHx0fHx0aGlzLl9yYXdQcmV2VGltZT09PXQ/dDoxZS0xMCwwPT09dCYmcylmb3Iocj10aGlzLl9maXJzdDtyJiYwPT09ci5fc3RhcnRUaW1lOylyLl9kdXJhdGlvbnx8KHM9ITEpLHI9ci5fbmV4dDt0PTAsdGhpcy5faW5pdHRlZHx8KGg9ITApfWVsc2UgaWYoMD09PWQmJnk8MCYmKGg9ITApLHRoaXMuX3RpbWU9dGhpcy5fcmF3UHJldlRpbWU9dCx0aGlzLl9sb2NrZWR8fCh0aGlzLl90b3RhbFRpbWU9dCwwIT09dGhpcy5fcmVwZWF0JiYodT1kK3RoaXMuX3JlcGVhdERlbGF5LHRoaXMuX2N5Y2xlPXRoaXMuX3RvdGFsVGltZS91Pj4wLDAhPT10aGlzLl9jeWNsZSYmdGhpcy5fY3ljbGU9PT10aGlzLl90b3RhbFRpbWUvdSYmbTw9dCYmdGhpcy5fY3ljbGUtLSx0aGlzLl90aW1lPXRoaXMuX3RvdGFsVGltZS10aGlzLl9jeWNsZSp1LHRoaXMuX3lveW8mJjAhPSgxJnRoaXMuX2N5Y2xlKSYmKHRoaXMuX3RpbWU9ZC10aGlzLl90aW1lKSx0aGlzLl90aW1lPmQ/KHRoaXMuX3RpbWU9ZCx0PWQrMWUtNCk6dGhpcy5fdGltZTwwP3RoaXMuX3RpbWU9dD0wOnQ9dGhpcy5fdGltZSkpLHRoaXMuX2hhc1BhdXNlJiYhdGhpcy5fZm9yY2luZ1BsYXloZWFkJiYhZSl7aWYoKHQ9dGhpcy5fdGltZSk+PWZ8fHRoaXMuX3JlcGVhdCYmdyE9PXRoaXMuX2N5Y2xlKWZvcihyPXRoaXMuX2ZpcnN0O3ImJnIuX3N0YXJ0VGltZTw9dCYmIV87KXIuX2R1cmF0aW9ufHwiaXNQYXVzZSIhPT1yLmRhdGF8fHIucmF0aW98fDA9PT1yLl9zdGFydFRpbWUmJjA9PT10aGlzLl9yYXdQcmV2VGltZXx8KF89cikscj1yLl9uZXh0O2Vsc2UgZm9yKHI9dGhpcy5fbGFzdDtyJiZyLl9zdGFydFRpbWU+PXQmJiFfOylyLl9kdXJhdGlvbnx8ImlzUGF1c2UiPT09ci5kYXRhJiZyLl9yYXdQcmV2VGltZT4wJiYoXz1yKSxyPXIuX3ByZXY7XyYmXy5fc3RhcnRUaW1lPGQmJih0aGlzLl90aW1lPXQ9Xy5fc3RhcnRUaW1lLHRoaXMuX3RvdGFsVGltZT10K3RoaXMuX2N5Y2xlKih0aGlzLl90b3RhbER1cmF0aW9uK3RoaXMuX3JlcGVhdERlbGF5KSl9aWYodGhpcy5fY3ljbGUhPT13JiYhdGhpcy5fbG9ja2VkKXt2YXIgeD10aGlzLl95b3lvJiYwIT0oMSZ3KSxiPXg9PT0odGhpcy5feW95byYmMCE9KDEmdGhpcy5fY3ljbGUpKSxQPXRoaXMuX3RvdGFsVGltZSxTPXRoaXMuX2N5Y2xlLGs9dGhpcy5fcmF3UHJldlRpbWUsUj10aGlzLl90aW1lO2lmKHRoaXMuX3RvdGFsVGltZT13KmQsdGhpcy5fY3ljbGU8dz94PSF4OnRoaXMuX3RvdGFsVGltZSs9ZCx0aGlzLl90aW1lPWYsdGhpcy5fcmF3UHJldlRpbWU9MD09PWQ/eS0xZS00OnksdGhpcy5fY3ljbGU9dyx0aGlzLl9sb2NrZWQ9ITAsZj14PzA6ZCx0aGlzLnJlbmRlcihmLGUsMD09PWQpLGV8fHRoaXMuX2djfHx0aGlzLnZhcnMub25SZXBlYXQmJih0aGlzLl9jeWNsZT1TLHRoaXMuX2xvY2tlZD0hMSx0aGlzLl9jYWxsYmFjaygib25SZXBlYXQiKSksZiE9PXRoaXMuX3RpbWUpcmV0dXJuO2lmKGImJih0aGlzLl9jeWNsZT13LHRoaXMuX2xvY2tlZD0hMCxmPXg/ZCsxZS00Oi0xZS00LHRoaXMucmVuZGVyKGYsITAsITEpKSx0aGlzLl9sb2NrZWQ9ITEsdGhpcy5fcGF1c2VkJiYhVClyZXR1cm47dGhpcy5fdGltZT1SLHRoaXMuX3RvdGFsVGltZT1QLHRoaXMuX2N5Y2xlPVMsdGhpcy5fcmF3UHJldlRpbWU9a31pZih0aGlzLl90aW1lIT09ZiYmdGhpcy5fZmlyc3R8fGl8fGh8fF8pe2lmKHRoaXMuX2luaXR0ZWR8fCh0aGlzLl9pbml0dGVkPSEwKSx0aGlzLl9hY3RpdmV8fCF0aGlzLl9wYXVzZWQmJnRoaXMuX3RvdGFsVGltZSE9PW0mJnQ+MCYmKHRoaXMuX2FjdGl2ZT0hMCksMD09PW0mJnRoaXMudmFycy5vblN0YXJ0JiYoMD09PXRoaXMuX3RvdGFsVGltZSYmdGhpcy5fdG90YWxEdXJhdGlvbnx8ZXx8dGhpcy5fY2FsbGJhY2soIm9uU3RhcnQiKSksKGM9dGhpcy5fdGltZSk+PWYpZm9yKHI9dGhpcy5fZmlyc3Q7ciYmKG49ci5fbmV4dCxjPT09dGhpcy5fdGltZSYmKCF0aGlzLl9wYXVzZWR8fFQpKTspKHIuX2FjdGl2ZXx8ci5fc3RhcnRUaW1lPD10aGlzLl90aW1lJiYhci5fcGF1c2VkJiYhci5fZ2MpJiYoXz09PXImJnRoaXMucGF1c2UoKSxyLl9yZXZlcnNlZD9yLnJlbmRlcigoci5fZGlydHk/ci50b3RhbER1cmF0aW9uKCk6ci5fdG90YWxEdXJhdGlvbiktKHQtci5fc3RhcnRUaW1lKSpyLl90aW1lU2NhbGUsZSxpKTpyLnJlbmRlcigodC1yLl9zdGFydFRpbWUpKnIuX3RpbWVTY2FsZSxlLGkpKSxyPW47ZWxzZSBmb3Iocj10aGlzLl9sYXN0O3ImJihuPXIuX3ByZXYsYz09PXRoaXMuX3RpbWUmJighdGhpcy5fcGF1c2VkfHxUKSk7KXtpZihyLl9hY3RpdmV8fHIuX3N0YXJ0VGltZTw9ZiYmIXIuX3BhdXNlZCYmIXIuX2djKXtpZihfPT09cil7Zm9yKF89ci5fcHJldjtfJiZfLmVuZFRpbWUoKT50aGlzLl90aW1lOylfLnJlbmRlcihfLl9yZXZlcnNlZD9fLnRvdGFsRHVyYXRpb24oKS0odC1fLl9zdGFydFRpbWUpKl8uX3RpbWVTY2FsZToodC1fLl9zdGFydFRpbWUpKl8uX3RpbWVTY2FsZSxlLGkpLF89Xy5fcHJldjtfPW51bGwsdGhpcy5wYXVzZSgpfXIuX3JldmVyc2VkP3IucmVuZGVyKChyLl9kaXJ0eT9yLnRvdGFsRHVyYXRpb24oKTpyLl90b3RhbER1cmF0aW9uKS0odC1yLl9zdGFydFRpbWUpKnIuX3RpbWVTY2FsZSxlLGkpOnIucmVuZGVyKCh0LXIuX3N0YXJ0VGltZSkqci5fdGltZVNjYWxlLGUsaSl9cj1ufXRoaXMuX29uVXBkYXRlJiYoZXx8KGEubGVuZ3RoJiZvKCksdGhpcy5fY2FsbGJhY2soIm9uVXBkYXRlIikpKSxsJiYodGhpcy5fbG9ja2VkfHx0aGlzLl9nY3x8ZyE9PXRoaXMuX3N0YXJ0VGltZSYmdj09PXRoaXMuX3RpbWVTY2FsZXx8KDA9PT10aGlzLl90aW1lfHxwPj10aGlzLnRvdGFsRHVyYXRpb24oKSkmJihzJiYoYS5sZW5ndGgmJm8oKSx0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4mJnRoaXMuX2VuYWJsZWQoITEsITEpLHRoaXMuX2FjdGl2ZT0hMSksIWUmJnRoaXMudmFyc1tsXSYmdGhpcy5fY2FsbGJhY2sobCkpKX1lbHNlIG0hPT10aGlzLl90b3RhbFRpbWUmJnRoaXMuX29uVXBkYXRlJiYoZXx8dGhpcy5fY2FsbGJhY2soIm9uVXBkYXRlIikpfSx1LmdldEFjdGl2ZT1mdW5jdGlvbih0LGUsaSl7bnVsbD09dCYmKHQ9ITApLG51bGw9PWUmJihlPSEwKSxudWxsPT1pJiYoaT0hMSk7dmFyIHIscyxuPVtdLGE9dGhpcy5nZXRDaGlsZHJlbih0LGUsaSksbz0wLGw9YS5sZW5ndGg7Zm9yKHI9MDtyPGw7cisrKShzPWFbcl0pLmlzQWN0aXZlKCkmJihuW28rK109cyk7cmV0dXJuIG59LHUuZ2V0TGFiZWxBZnRlcj1mdW5jdGlvbih0KXt0fHwwIT09dCYmKHQ9dGhpcy5fdGltZSk7dmFyIGUsaT10aGlzLmdldExhYmVsc0FycmF5KCkscj1pLmxlbmd0aDtmb3IoZT0wO2U8cjtlKyspaWYoaVtlXS50aW1lPnQpcmV0dXJuIGlbZV0ubmFtZTtyZXR1cm4gbnVsbH0sdS5nZXRMYWJlbEJlZm9yZT1mdW5jdGlvbih0KXtudWxsPT10JiYodD10aGlzLl90aW1lKTtmb3IodmFyIGU9dGhpcy5nZXRMYWJlbHNBcnJheSgpLGk9ZS5sZW5ndGg7LS1pPi0xOylpZihlW2ldLnRpbWU8dClyZXR1cm4gZVtpXS5uYW1lO3JldHVybiBudWxsfSx1LmdldExhYmVsc0FycmF5PWZ1bmN0aW9uKCl7dmFyIHQsZT1bXSxpPTA7Zm9yKHQgaW4gdGhpcy5fbGFiZWxzKWVbaSsrXT17dGltZTp0aGlzLl9sYWJlbHNbdF0sbmFtZTp0fTtyZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudGltZS1lLnRpbWV9KSxlfSx1LmludmFsaWRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9ja2VkPSExLHQucHJvdG90eXBlLmludmFsaWRhdGUuY2FsbCh0aGlzKX0sdS5wcm9ncmVzcz1mdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMudG90YWxUaW1lKHRoaXMuZHVyYXRpb24oKSoodGhpcy5feW95byYmMCE9KDEmdGhpcy5fY3ljbGUpPzEtdDp0KSt0aGlzLl9jeWNsZSoodGhpcy5fZHVyYXRpb24rdGhpcy5fcmVwZWF0RGVsYXkpLGUpOnRoaXMuX3RpbWUvdGhpcy5kdXJhdGlvbigpfHwwfSx1LnRvdGFsUHJvZ3Jlc3M9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnRvdGFsVGltZSh0aGlzLnRvdGFsRHVyYXRpb24oKSp0LGUpOnRoaXMuX3RvdGFsVGltZS90aGlzLnRvdGFsRHVyYXRpb24oKXx8MH0sdS50b3RhbER1cmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPy0xIT09dGhpcy5fcmVwZWF0JiZlP3RoaXMudGltZVNjYWxlKHRoaXMudG90YWxEdXJhdGlvbigpL2UpOnRoaXM6KHRoaXMuX2RpcnR5JiYodC5wcm90b3R5cGUudG90YWxEdXJhdGlvbi5jYWxsKHRoaXMpLHRoaXMuX3RvdGFsRHVyYXRpb249LTE9PT10aGlzLl9yZXBlYXQ/OTk5OTk5OTk5OTk5OnRoaXMuX2R1cmF0aW9uKih0aGlzLl9yZXBlYXQrMSkrdGhpcy5fcmVwZWF0RGVsYXkqdGhpcy5fcmVwZWF0KSx0aGlzLl90b3RhbER1cmF0aW9uKX0sdS50aW1lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX2RpcnR5JiZ0aGlzLnRvdGFsRHVyYXRpb24oKSx0PnRoaXMuX2R1cmF0aW9uJiYodD10aGlzLl9kdXJhdGlvbiksdGhpcy5feW95byYmMCE9KDEmdGhpcy5fY3ljbGUpP3Q9dGhpcy5fZHVyYXRpb24tdCt0aGlzLl9jeWNsZSoodGhpcy5fZHVyYXRpb24rdGhpcy5fcmVwZWF0RGVsYXkpOjAhPT10aGlzLl9yZXBlYXQmJih0Kz10aGlzLl9jeWNsZSoodGhpcy5fZHVyYXRpb24rdGhpcy5fcmVwZWF0RGVsYXkpKSx0aGlzLnRvdGFsVGltZSh0LGUpKTp0aGlzLl90aW1lfSx1LnJlcGVhdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5fcmVwZWF0PXQsdGhpcy5fdW5jYWNoZSghMCkpOnRoaXMuX3JlcGVhdH0sdS5yZXBlYXREZWxheT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5fcmVwZWF0RGVsYXk9dCx0aGlzLl91bmNhY2hlKCEwKSk6dGhpcy5fcmVwZWF0RGVsYXl9LHUueW95bz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feW95bz10LHRoaXMpOnRoaXMuX3lveW99LHUuY3VycmVudExhYmVsPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuc2Vlayh0LCEwKTp0aGlzLmdldExhYmVsQmVmb3JlKHRoaXMuX3RpbWUrMWUtOCl9LHJ9LCEwKSxmdW5jdGlvbigpe3ZhciB0PTE4MC9NYXRoLlBJLGU9W10saT1bXSxyPVtdLG49e30sYT1zLl9nc0RlZmluZS5nbG9iYWxzLG89ZnVuY3Rpb24odCxlLGkscil7aT09PXImJihpPXItKHItZSkvMWU2KSx0PT09ZSYmKGU9dCsoaS10KS8xZTYpLHRoaXMuYT10LHRoaXMuYj1lLHRoaXMuYz1pLHRoaXMuZD1yLHRoaXMuZGE9ci10LHRoaXMuY2E9aS10LHRoaXMuYmE9ZS10fSxsPWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBzPXthOnR9LG49e30sYT17fSxvPXtjOnJ9LGw9KHQrZSkvMixoPShlK2kpLzIsdT0oaStyKS8yLF89KGwraCkvMixjPShoK3UpLzIsZj0oYy1fKS84O3JldHVybiBzLmI9bCsodC1sKS80LG4uYj1fK2Yscy5jPW4uYT0ocy5iK24uYikvMixuLmM9YS5hPShfK2MpLzIsYS5iPWMtZixvLmI9dSsoci11KS80LGEuYz1vLmE9KGEuYitvLmIpLzIsW3MsbixhLG9dfSxoPWZ1bmN0aW9uKHQscyxuLGEsbyl7dmFyIGgsdSxfLGMsZixwLGQsbSxnLHYseSxULHcseD10Lmxlbmd0aC0xLGI9MCxQPXRbMF0uYTtmb3IoaD0wO2g8eDtoKyspdT0oZj10W2JdKS5hLF89Zi5kLGM9dFtiKzFdLmQsbz8oeT1lW2hdLHc9KChUPWlbaF0pK3kpKnMqLjI1LyhhPy41OnJbaF18fC41KSxtPV8tKChwPV8tKF8tdSkqKGE/LjUqczowIT09eT93L3k6MCkpKygoKGQ9XysoYy1fKSooYT8uNSpzOjAhPT1UP3cvVDowKSktcCkqKDMqeS8oeStUKSsuNSkvNHx8MCkpKTptPV8tKChwPV8tKF8tdSkqcyouNSkrKGQ9XysoYy1fKSpzKi41KSkvMixwKz1tLGQrPW0sZi5jPWc9cCxmLmI9MCE9PWg/UDpQPWYuYSsuNiooZi5jLWYuYSksZi5kYT1fLXUsZi5jYT1nLXUsZi5iYT1QLXUsbj8odj1sKHUsUCxnLF8pLHQuc3BsaWNlKGIsMSx2WzBdLHZbMV0sdlsyXSx2WzNdKSxiKz00KTpiKyssUD1kOyhmPXRbYl0pLmI9UCxmLmM9UCsuNCooZi5kLVApLGYuZGE9Zi5kLWYuYSxmLmNhPWYuYy1mLmEsZi5iYT1QLWYuYSxuJiYodj1sKGYuYSxQLGYuYyxmLmQpLHQuc3BsaWNlKGIsMSx2WzBdLHZbMV0sdlsyXSx2WzNdKSl9LHU9ZnVuY3Rpb24odCxyLHMsbil7dmFyIGEsbCxoLHUsXyxjLGY9W107aWYobilmb3IobD0odD1bbl0uY29uY2F0KHQpKS5sZW5ndGg7LS1sPi0xOykic3RyaW5nIj09dHlwZW9mKGM9dFtsXVtyXSkmJiI9Ij09PWMuY2hhckF0KDEpJiYodFtsXVtyXT1uW3JdK051bWJlcihjLmNoYXJBdCgwKStjLnN1YnN0cigyKSkpO2lmKChhPXQubGVuZ3RoLTIpPDApcmV0dXJuIGZbMF09bmV3IG8odFswXVtyXSwwLDAsdFswXVtyXSksZjtmb3IobD0wO2w8YTtsKyspaD10W2xdW3JdLHU9dFtsKzFdW3JdLGZbbF09bmV3IG8oaCwwLDAsdSkscyYmKF89dFtsKzJdW3JdLGVbbF09KGVbbF18fDApKyh1LWgpKih1LWgpLGlbbF09KGlbbF18fDApKyhfLXUpKihfLXUpKTtyZXR1cm4gZltsXT1uZXcgbyh0W2xdW3JdLDAsMCx0W2wrMV1bcl0pLGZ9LF89ZnVuY3Rpb24odCxzLGEsbyxsLF8pe3ZhciBjLGYscCxkLG0sZyx2LHksVD17fSx3PVtdLHg9X3x8dFswXTtmb3IoZiBpbiBsPSJzdHJpbmciPT10eXBlb2YgbD8iLCIrbCsiLCI6Iix4LHkseixsZWZ0LHRvcCxyaWdodCxib3R0b20sbWFyZ2luVG9wLG1hcmdpbkxlZnQsbWFyZ2luUmlnaHQsbWFyZ2luQm90dG9tLHBhZGRpbmdMZWZ0LHBhZGRpbmdUb3AscGFkZGluZ1JpZ2h0LHBhZGRpbmdCb3R0b20sYmFja2dyb3VuZFBvc2l0aW9uLGJhY2tncm91bmRQb3NpdGlvbl95LCIsbnVsbD09cyYmKHM9MSksdFswXSl3LnB1c2goZik7aWYodC5sZW5ndGg+MSl7Zm9yKHk9dFt0Lmxlbmd0aC0xXSx2PSEwLGM9dy5sZW5ndGg7LS1jPi0xOylpZihmPXdbY10sTWF0aC5hYnMoeFtmXS15W2ZdKT4uMDUpe3Y9ITE7YnJlYWt9diYmKHQ9dC5jb25jYXQoKSxfJiZ0LnVuc2hpZnQoXyksdC5wdXNoKHRbMV0pLF89dFt0Lmxlbmd0aC0zXSl9Zm9yKGUubGVuZ3RoPWkubGVuZ3RoPXIubGVuZ3RoPTAsYz13Lmxlbmd0aDstLWM+LTE7KWY9d1tjXSxuW2ZdPS0xIT09bC5pbmRleE9mKCIsIitmKyIsIiksVFtmXT11KHQsZixuW2ZdLF8pO2ZvcihjPWUubGVuZ3RoOy0tYz4tMTspZVtjXT1NYXRoLnNxcnQoZVtjXSksaVtjXT1NYXRoLnNxcnQoaVtjXSk7aWYoIW8pe2ZvcihjPXcubGVuZ3RoOy0tYz4tMTspaWYobltmXSlmb3IoZz0ocD1UW3dbY11dKS5sZW5ndGgtMSxkPTA7ZDxnO2QrKyltPXBbZCsxXS5kYS9pW2RdK3BbZF0uZGEvZVtkXXx8MCxyW2RdPShyW2RdfHwwKSttKm07Zm9yKGM9ci5sZW5ndGg7LS1jPi0xOylyW2NdPU1hdGguc3FydChyW2NdKX1mb3IoYz13Lmxlbmd0aCxkPWE/NDoxOy0tYz4tMTspcD1UW2Y9d1tjXV0saChwLHMsYSxvLG5bZl0pLHYmJihwLnNwbGljZSgwLGQpLHAuc3BsaWNlKHAubGVuZ3RoLWQsZCkpO3JldHVybiBUfSxjPWZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIHIscyxuLGEsbyxsLGgsdSxfLGMsZixwPTEvaSxkPXQubGVuZ3RoOy0tZD4tMTspZm9yKG49KGM9dFtkXSkuYSxhPWMuZC1uLG89Yy5jLW4sbD1jLmItbixyPXM9MCx1PTE7dTw9aTt1Kyspcj1zLShzPSgoaD1wKnUpKmgqYSszKihfPTEtaCkqKGgqbytfKmwpKSpoKSxlW2Y9ZCppK3UtMV09KGVbZl18fDApK3Iqcn0sZj1zLl9nc0RlZmluZS5wbHVnaW4oe3Byb3BOYW1lOiJiZXppZXIiLHByaW9yaXR5Oi0xLHZlcnNpb246IjEuMy44IixBUEk6MixnbG9iYWw6ITAsaW5pdDpmdW5jdGlvbih0LGUsaSl7dGhpcy5fdGFyZ2V0PXQsZSBpbnN0YW5jZW9mIEFycmF5JiYoZT17dmFsdWVzOmV9KSx0aGlzLl9mdW5jPXt9LHRoaXMuX21vZD17fSx0aGlzLl9wcm9wcz1bXSx0aGlzLl90aW1lUmVzPW51bGw9PWUudGltZVJlc29sdXRpb24/NjpwYXJzZUludChlLnRpbWVSZXNvbHV0aW9uLDEwKTt2YXIgcixzLG4sYSxsLGg9ZS52YWx1ZXN8fFtdLHU9e30sZj1oWzBdLHA9ZS5hdXRvUm90YXRlfHxpLnZhcnMub3JpZW50VG9CZXppZXI7Zm9yKHIgaW4gdGhpcy5fYXV0b1JvdGF0ZT1wP3AgaW5zdGFuY2VvZiBBcnJheT9wOltbIngiLCJ5Iiwicm90YXRpb24iLCEwPT09cD8wOk51bWJlcihwKXx8MF1dOm51bGwsZil0aGlzLl9wcm9wcy5wdXNoKHIpO2ZvcihuPXRoaXMuX3Byb3BzLmxlbmd0aDstLW4+LTE7KXI9dGhpcy5fcHJvcHNbbl0sdGhpcy5fb3ZlcndyaXRlUHJvcHMucHVzaChyKSxzPXRoaXMuX2Z1bmNbcl09ImZ1bmN0aW9uIj09dHlwZW9mIHRbcl0sdVtyXT1zP3Rbci5pbmRleE9mKCJzZXQiKXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRbImdldCIrci5zdWJzdHIoMyldP3I6ImdldCIrci5zdWJzdHIoMyldKCk6cGFyc2VGbG9hdCh0W3JdKSxsfHx1W3JdIT09aFswXVtyXSYmKGw9dSk7aWYodGhpcy5fYmV6aWVycz0iY3ViaWMiIT09ZS50eXBlJiYicXVhZHJhdGljIiE9PWUudHlwZSYmInNvZnQiIT09ZS50eXBlP18oaCxpc05hTihlLmN1cnZpbmVzcyk/MTplLmN1cnZpbmVzcywhMSwidGhydUJhc2ljIj09PWUudHlwZSxlLmNvcnJlbGF0ZSxsKTpmdW5jdGlvbih0LGUsaSl7dmFyIHIscyxuLGEsbCxoLHUsXyxjLGYscCxkPXt9LG09ImN1YmljIj09PShlPWV8fCJzb2Z0Iik/MzoyLGc9InNvZnQiPT09ZSx2PVtdO2lmKGcmJmkmJih0PVtpXS5jb25jYXQodCkpLG51bGw9PXR8fHQubGVuZ3RoPG0rMSl0aHJvdyJpbnZhbGlkIEJlemllciBkYXRhIjtmb3IoYyBpbiB0WzBdKXYucHVzaChjKTtmb3IoaD12Lmxlbmd0aDstLWg+LTE7KXtmb3IoZFtjPXZbaF1dPWw9W10sZj0wLF89dC5sZW5ndGgsdT0wO3U8Xzt1Kyspcj1udWxsPT1pP3RbdV1bY106InN0cmluZyI9PXR5cGVvZihwPXRbdV1bY10pJiYiPSI9PT1wLmNoYXJBdCgxKT9pW2NdK051bWJlcihwLmNoYXJBdCgwKStwLnN1YnN0cigyKSk6TnVtYmVyKHApLGcmJnU+MSYmdTxfLTEmJihsW2YrK109KHIrbFtmLTJdKS8yKSxsW2YrK109cjtmb3IoXz1mLW0rMSxmPTAsdT0wO3U8Xzt1Kz1tKXI9bFt1XSxzPWxbdSsxXSxuPWxbdSsyXSxhPTI9PT1tPzA6bFt1KzNdLGxbZisrXT1wPTM9PT1tP25ldyBvKHIscyxuLGEpOm5ldyBvKHIsKDIqcytyKS8zLCgyKnMrbikvMyxuKTtsLmxlbmd0aD1mfXJldHVybiBkfShoLGUudHlwZSx1KSx0aGlzLl9zZWdDb3VudD10aGlzLl9iZXppZXJzW3JdLmxlbmd0aCx0aGlzLl90aW1lUmVzKXt2YXIgZD1mdW5jdGlvbih0LGUpe3ZhciBpLHIscyxuLGE9W10sbz1bXSxsPTAsaD0wLHU9KGU9ZT4+MHx8NiktMSxfPVtdLGY9W107Zm9yKGkgaW4gdCljKHRbaV0sYSxlKTtmb3Iocz1hLmxlbmd0aCxyPTA7cjxzO3IrKylsKz1NYXRoLnNxcnQoYVtyXSksZltuPXIlZV09bCxuPT09dSYmKGgrPWwsX1tuPXIvZT4+MF09ZixvW25dPWgsbD0wLGY9W10pO3JldHVybntsZW5ndGg6aCxsZW5ndGhzOm8sc2VnbWVudHM6X319KHRoaXMuX2JlemllcnMsdGhpcy5fdGltZVJlcyk7dGhpcy5fbGVuZ3RoPWQubGVuZ3RoLHRoaXMuX2xlbmd0aHM9ZC5sZW5ndGhzLHRoaXMuX3NlZ21lbnRzPWQuc2VnbWVudHMsdGhpcy5fbDE9dGhpcy5fbGk9dGhpcy5fczE9dGhpcy5fc2k9MCx0aGlzLl9sMj10aGlzLl9sZW5ndGhzWzBdLHRoaXMuX2N1clNlZz10aGlzLl9zZWdtZW50c1swXSx0aGlzLl9zMj10aGlzLl9jdXJTZWdbMF0sdGhpcy5fcHJlYz0xL3RoaXMuX2N1clNlZy5sZW5ndGh9aWYocD10aGlzLl9hdXRvUm90YXRlKWZvcih0aGlzLl9pbml0aWFsUm90YXRpb25zPVtdLHBbMF1pbnN0YW5jZW9mIEFycmF5fHwodGhpcy5fYXV0b1JvdGF0ZT1wPVtwXSksbj1wLmxlbmd0aDstLW4+LTE7KXtmb3IoYT0wO2E8MzthKyspcj1wW25dW2FdLHRoaXMuX2Z1bmNbcl09ImZ1bmN0aW9uIj09dHlwZW9mIHRbcl0mJnRbci5pbmRleE9mKCJzZXQiKXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRbImdldCIrci5zdWJzdHIoMyldP3I6ImdldCIrci5zdWJzdHIoMyldO3I9cFtuXVsyXSx0aGlzLl9pbml0aWFsUm90YXRpb25zW25dPSh0aGlzLl9mdW5jW3JdP3RoaXMuX2Z1bmNbcl0uY2FsbCh0aGlzLl90YXJnZXQpOnRoaXMuX3RhcmdldFtyXSl8fDAsdGhpcy5fb3ZlcndyaXRlUHJvcHMucHVzaChyKX1yZXR1cm4gdGhpcy5fc3RhcnRSYXRpbz1pLnZhcnMucnVuQmFja3dhcmRzPzE6MCwhMH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciBpLHIscyxuLGEsbyxsLGgsdSxfLGM9dGhpcy5fc2VnQ291bnQsZj10aGlzLl9mdW5jLHA9dGhpcy5fdGFyZ2V0LGQ9ZSE9PXRoaXMuX3N0YXJ0UmF0aW87aWYodGhpcy5fdGltZVJlcyl7aWYodT10aGlzLl9sZW5ndGhzLF89dGhpcy5fY3VyU2VnLGUqPXRoaXMuX2xlbmd0aCxzPXRoaXMuX2xpLGU+dGhpcy5fbDImJnM8Yy0xKXtmb3IoaD1jLTE7czxoJiYodGhpcy5fbDI9dVsrK3NdKTw9ZTspO3RoaXMuX2wxPXVbcy0xXSx0aGlzLl9saT1zLHRoaXMuX2N1clNlZz1fPXRoaXMuX3NlZ21lbnRzW3NdLHRoaXMuX3MyPV9bdGhpcy5fczE9dGhpcy5fc2k9MF19ZWxzZSBpZihlPHRoaXMuX2wxJiZzPjApe2Zvcig7cz4wJiYodGhpcy5fbDE9dVstLXNdKT49ZTspOzA9PT1zJiZlPHRoaXMuX2wxP3RoaXMuX2wxPTA6cysrLHRoaXMuX2wyPXVbc10sdGhpcy5fbGk9cyx0aGlzLl9jdXJTZWc9Xz10aGlzLl9zZWdtZW50c1tzXSx0aGlzLl9zMT1fWyh0aGlzLl9zaT1fLmxlbmd0aC0xKS0xXXx8MCx0aGlzLl9zMj1fW3RoaXMuX3NpXX1pZihpPXMsZS09dGhpcy5fbDEscz10aGlzLl9zaSxlPnRoaXMuX3MyJiZzPF8ubGVuZ3RoLTEpe2ZvcihoPV8ubGVuZ3RoLTE7czxoJiYodGhpcy5fczI9X1srK3NdKTw9ZTspO3RoaXMuX3MxPV9bcy0xXSx0aGlzLl9zaT1zfWVsc2UgaWYoZTx0aGlzLl9zMSYmcz4wKXtmb3IoO3M+MCYmKHRoaXMuX3MxPV9bLS1zXSk+PWU7KTswPT09cyYmZTx0aGlzLl9zMT90aGlzLl9zMT0wOnMrKyx0aGlzLl9zMj1fW3NdLHRoaXMuX3NpPXN9bz0ocysoZS10aGlzLl9zMSkvKHRoaXMuX3MyLXRoaXMuX3MxKSkqdGhpcy5fcHJlY3x8MH1lbHNlIG89KGUtKGk9ZTwwPzA6ZT49MT9jLTE6YyplPj4wKSooMS9jKSkqYztmb3Iocj0xLW8scz10aGlzLl9wcm9wcy5sZW5ndGg7LS1zPi0xOyluPXRoaXMuX3Byb3BzW3NdLGw9KG8qbyooYT10aGlzLl9iZXppZXJzW25dW2ldKS5kYSszKnIqKG8qYS5jYStyKmEuYmEpKSpvK2EuYSx0aGlzLl9tb2Rbbl0mJihsPXRoaXMuX21vZFtuXShsLHApKSxmW25dP3Bbbl0obCk6cFtuXT1sO2lmKHRoaXMuX2F1dG9Sb3RhdGUpe3ZhciBtLGcsdix5LFQsdyx4LGI9dGhpcy5fYXV0b1JvdGF0ZTtmb3Iocz1iLmxlbmd0aDstLXM+LTE7KW49YltzXVsyXSx3PWJbc11bM118fDAseD0hMD09PWJbc11bNF0/MTp0LGE9dGhpcy5fYmV6aWVyc1tiW3NdWzBdXSxtPXRoaXMuX2JlemllcnNbYltzXVsxXV0sYSYmbSYmKGE9YVtpXSxtPW1baV0sZz1hLmErKGEuYi1hLmEpKm8sZys9KCh5PWEuYisoYS5jLWEuYikqbyktZykqbyx5Kz0oYS5jKyhhLmQtYS5jKSpvLXkpKm8sdj1tLmErKG0uYi1tLmEpKm8sdis9KChUPW0uYisobS5jLW0uYikqbyktdikqbyxUKz0obS5jKyhtLmQtbS5jKSpvLVQpKm8sbD1kP01hdGguYXRhbjIoVC12LHktZykqeCt3OnRoaXMuX2luaXRpYWxSb3RhdGlvbnNbc10sdGhpcy5fbW9kW25dJiYobD10aGlzLl9tb2Rbbl0obCxwKSksZltuXT9wW25dKGwpOnBbbl09bCl9fX0pLHA9Zi5wcm90b3R5cGU7Zi5iZXppZXJUaHJvdWdoPV8sZi5jdWJpY1RvUXVhZHJhdGljPWwsZi5fYXV0b0NTUz0hMCxmLnF1YWRyYXRpY1RvQ3ViaWM9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuZXcgbyh0LCgyKmUrdCkvMywoMiplK2kpLzMsaSl9LGYuX2Nzc1JlZ2lzdGVyPWZ1bmN0aW9uKCl7dmFyIHQ9YS5DU1NQbHVnaW47aWYodCl7dmFyIGU9dC5faW50ZXJuYWxzLGk9ZS5fcGFyc2VUb1Byb3h5LHI9ZS5fc2V0UGx1Z2luUmF0aW8scz1lLkNTU1Byb3BUd2VlbjtlLl9yZWdpc3RlckNvbXBsZXhTcGVjaWFsUHJvcCgiYmV6aWVyIix7cGFyc2VyOmZ1bmN0aW9uKHQsZSxuLGEsbyxsKXtlIGluc3RhbmNlb2YgQXJyYXkmJihlPXt2YWx1ZXM6ZX0pLGw9bmV3IGY7dmFyIGgsdSxfLGM9ZS52YWx1ZXMscD1jLmxlbmd0aC0xLGQ9W10sbT17fTtpZihwPDApcmV0dXJuIG87Zm9yKGg9MDtoPD1wO2grKylfPWkodCxjW2hdLGEsbyxsLHAhPT1oKSxkW2hdPV8uZW5kO2Zvcih1IGluIGUpbVt1XT1lW3VdO3JldHVybiBtLnZhbHVlcz1kLChvPW5ldyBzKHQsImJlemllciIsMCwwLF8ucHQsMikpLmRhdGE9XyxvLnBsdWdpbj1sLG8uc2V0UmF0aW89ciwwPT09bS5hdXRvUm90YXRlJiYobS5hdXRvUm90YXRlPSEwKSwhbS5hdXRvUm90YXRlfHxtLmF1dG9Sb3RhdGUgaW5zdGFuY2VvZiBBcnJheXx8KGg9ITA9PT1tLmF1dG9Sb3RhdGU/MDpOdW1iZXIobS5hdXRvUm90YXRlKSxtLmF1dG9Sb3RhdGU9bnVsbCE9Xy5lbmQubGVmdD9bWyJsZWZ0IiwidG9wIiwicm90YXRpb24iLGgsITFdXTpudWxsIT1fLmVuZC54JiZbWyJ4IiwieSIsInJvdGF0aW9uIixoLCExXV0pLG0uYXV0b1JvdGF0ZSYmKGEuX3RyYW5zZm9ybXx8YS5fZW5hYmxlVHJhbnNmb3JtcyghMSksXy5hdXRvUm90YXRlPWEuX3RhcmdldC5fZ3NUcmFuc2Zvcm0sXy5wcm94eS5yb3RhdGlvbj1fLmF1dG9Sb3RhdGUucm90YXRpb258fDAsYS5fb3ZlcndyaXRlUHJvcHMucHVzaCgicm90YXRpb24iKSksbC5fb25Jbml0VHdlZW4oXy5wcm94eSxtLGEuX3R3ZWVuKSxvfX0pfX0scC5fbW9kPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpPXRoaXMuX292ZXJ3cml0ZVByb3BzLHI9aS5sZW5ndGg7LS1yPi0xOykoZT10W2lbcl1dKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJih0aGlzLl9tb2RbaVtyXV09ZSl9LHAuX2tpbGw9ZnVuY3Rpb24odCl7dmFyIGUsaSxyPXRoaXMuX3Byb3BzO2ZvcihlIGluIHRoaXMuX2JlemllcnMpaWYoZSBpbiB0KWZvcihkZWxldGUgdGhpcy5fYmV6aWVyc1tlXSxkZWxldGUgdGhpcy5fZnVuY1tlXSxpPXIubGVuZ3RoOy0taT4tMTspcltpXT09PWUmJnIuc3BsaWNlKGksMSk7aWYocj10aGlzLl9hdXRvUm90YXRlKWZvcihpPXIubGVuZ3RoOy0taT4tMTspdFtyW2ldWzJdXSYmci5zcGxpY2UoaSwxKTtyZXR1cm4gdGhpcy5fc3VwZXIuX2tpbGwuY2FsbCh0aGlzLHQpfX0oKSxzLl9nc0RlZmluZSgicGx1Z2lucy5DU1NQbHVnaW4iLFsicGx1Z2lucy5Ud2VlblBsdWdpbiIsIlR3ZWVuTGl0ZSJdLGZ1bmN0aW9uKHQsZSl7dmFyIGkscixuLGEsbz1mdW5jdGlvbigpe3QuY2FsbCh0aGlzLCJjc3MiKSx0aGlzLl9vdmVyd3JpdGVQcm9wcy5sZW5ndGg9MCx0aGlzLnNldFJhdGlvPW8ucHJvdG90eXBlLnNldFJhdGlvfSxsPXMuX2dzRGVmaW5lLmdsb2JhbHMsaD17fSx1PW8ucHJvdG90eXBlPW5ldyB0KCJjc3MiKTt1LmNvbnN0cnVjdG9yPW8sby52ZXJzaW9uPSIyLjAuMiIsby5BUEk9MixvLmRlZmF1bHRUcmFuc2Zvcm1QZXJzcGVjdGl2ZT0wLG8uZGVmYXVsdFNrZXdUeXBlPSJjb21wZW5zYXRlZCIsby5kZWZhdWx0U21vb3RoT3JpZ2luPSEwLHU9InB4IixvLnN1ZmZpeE1hcD17dG9wOnUscmlnaHQ6dSxib3R0b206dSxsZWZ0OnUsd2lkdGg6dSxoZWlnaHQ6dSxmb250U2l6ZTp1LHBhZGRpbmc6dSxtYXJnaW46dSxwZXJzcGVjdGl2ZTp1LGxpbmVIZWlnaHQ6IiJ9O3ZhciBfLGMsZixwLGQsbSxnLHYseT0vKD86XC18XC58XGIpKFxkfFwufGVcLSkrL2csVD0vKD86XGR8XC1cZHxcLlxkfFwtXC5cZHxcKz1cZHxcLT1cZHxcKz0uXGR8XC09XC5cZCkrL2csdz0vKD86XCs9fFwtPXxcLXxcYilbXGRcLVwuXStbYS16QS1aMC05XSooPzolfFxiKS9naSx4PS8oPyFbKy1dP1xkKlwuP1xkK3xbKy1dfGVbKy1dXGQrKVteMC05XS9nLGI9Lyg/OlxkfFwtfFwrfD18I3xcLikqL2csUD0vb3BhY2l0eSAqPSAqKFteKV0qKS9pLFM9L29wYWNpdHk6KFteO10qKS9pLGs9L2FscGhhXChvcGFjaXR5ICo9Lis/XCkvaSxSPS9eKHJnYnxoc2wpLyxPPS8oW0EtWl0pL2csQT0vLShbYS16XSkvZ2ksQz0vKF4oPzp1cmxcKFwifHVybFwoKSl8KD86KFwiXCkpJHxcKSQpL2dpLEQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpfSxNPS8oPzpMZWZ0fFJpZ2h0fFdpZHRoKS9pLEU9LyhNMTF8TTEyfE0yMXxNMjIpPVtcZFwtXC5lXSsvZ2ksRj0vcHJvZ2lkXDpEWEltYWdlVHJhbnNmb3JtXC5NaWNyb3NvZnRcLk1hdHJpeFwoLis/XCkvaSx6PS8sKD89W15cKV0qKD86XCh8JCkpL2dpLEk9L1tccyxcKF0vaSxMPU1hdGguUEkvMTgwLE49MTgwL01hdGguUEksWD17fSxCPXtzdHlsZTp7fX0saj1zLmRvY3VtZW50fHx7Y3JlYXRlRWxlbWVudDpmdW5jdGlvbigpe3JldHVybiBCfX0sVT1mdW5jdGlvbih0LGUpe3JldHVybiBqLmNyZWF0ZUVsZW1lbnROUz9qLmNyZWF0ZUVsZW1lbnROUyhlfHwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsdCk6ai5jcmVhdGVFbGVtZW50KHQpfSxZPVUoImRpdiIpLFY9VSgiaW1nIiksRz1vLl9pbnRlcm5hbHM9e19zcGVjaWFsUHJvcHM6aH0scT0ocy5uYXZpZ2F0b3J8fHt9KS51c2VyQWdlbnR8fCIiLFc9ZnVuY3Rpb24oKXt2YXIgdD1xLmluZGV4T2YoIkFuZHJvaWQiKSxlPVUoImEiKTtyZXR1cm4gZj0tMSE9PXEuaW5kZXhPZigiU2FmYXJpIikmJi0xPT09cS5pbmRleE9mKCJDaHJvbWUiKSYmKC0xPT09dHx8cGFyc2VGbG9hdChxLnN1YnN0cih0KzgsMikpPjMpLGQ9ZiYmcGFyc2VGbG9hdChxLnN1YnN0cihxLmluZGV4T2YoIlZlcnNpb24vIikrOCwyKSk8NixwPS0xIT09cS5pbmRleE9mKCJGaXJlZm94IiksKC9NU0lFIChbMC05XXsxLH1bXC4wLTldezAsfSkvLmV4ZWMocSl8fC9UcmlkZW50XC8uKnJ2OihbMC05XXsxLH1bXC4wLTldezAsfSkvLmV4ZWMocSkpJiYobT1wYXJzZUZsb2F0KFJlZ0V4cC4kMSkpLCEhZSYmKGUuc3R5bGUuY3NzVGV4dD0idG9wOjFweDtvcGFjaXR5Oi41NTsiLC9eMC41NS8udGVzdChlLnN0eWxlLm9wYWNpdHkpKX0oKSxIPWZ1bmN0aW9uKHQpe3JldHVybiBQLnRlc3QoInN0cmluZyI9PXR5cGVvZiB0P3Q6KHQuY3VycmVudFN0eWxlP3QuY3VycmVudFN0eWxlLmZpbHRlcjp0LnN0eWxlLmZpbHRlcil8fCIiKT9wYXJzZUZsb2F0KFJlZ0V4cC4kMSkvMTAwOjF9LFo9ZnVuY3Rpb24odCl7cy5jb25zb2xlJiZjb25zb2xlLmxvZyh0KX0sJD0iIixRPSIiLEs9ZnVuY3Rpb24odCxlKXt2YXIgaSxyLHM9KGU9ZXx8WSkuc3R5bGU7aWYodm9pZCAwIT09c1t0XSlyZXR1cm4gdDtmb3IodD10LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpLGk9WyJPIiwiTW96IiwibXMiLCJNcyIsIldlYmtpdCJdLHI9NTstLXI+LTEmJnZvaWQgMD09PXNbaVtyXSt0XTspO3JldHVybiByPj0wPygkPSItIisoUT0zPT09cj8ibXMiOmlbcl0pLnRvTG93ZXJDYXNlKCkrIi0iLFErdCk6bnVsbH0sSj0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OmouZGVmYXVsdFZpZXd8fHtnZXRDb21wdXRlZFN0eWxlOmZ1bmN0aW9uKCl7fX0pLmdldENvbXB1dGVkU3R5bGUsdHQ9by5nZXRTdHlsZT1mdW5jdGlvbih0LGUsaSxyLHMpe3ZhciBuO3JldHVybiBXfHwib3BhY2l0eSIhPT1lPyghciYmdC5zdHlsZVtlXT9uPXQuc3R5bGVbZV06KGk9aXx8Sih0KSk/bj1pW2VdfHxpLmdldFByb3BlcnR5VmFsdWUoZSl8fGkuZ2V0UHJvcGVydHlWYWx1ZShlLnJlcGxhY2UoTywiLSQxIikudG9Mb3dlckNhc2UoKSk6dC5jdXJyZW50U3R5bGUmJihuPXQuY3VycmVudFN0eWxlW2VdKSxudWxsPT1zfHxuJiYibm9uZSIhPT1uJiYiYXV0byIhPT1uJiYiYXV0byBhdXRvIiE9PW4/bjpzKTpIKHQpfSxldD1HLmNvbnZlcnRUb1BpeGVscz1mdW5jdGlvbih0LGkscixzLG4pe2lmKCJweCI9PT1zfHwhcyYmImxpbmVIZWlnaHQiIT09aSlyZXR1cm4gcjtpZigiYXV0byI9PT1zfHwhcilyZXR1cm4gMDt2YXIgYSxsLGgsdT1NLnRlc3QoaSksXz10LGM9WS5zdHlsZSxmPXI8MCxwPTE9PT1yO2lmKGYmJihyPS1yKSxwJiYocio9MTAwKSwibGluZUhlaWdodCIhPT1pfHxzKWlmKCIlIj09PXMmJi0xIT09aS5pbmRleE9mKCJib3JkZXIiKSlhPXIvMTAwKih1P3QuY2xpZW50V2lkdGg6dC5jbGllbnRIZWlnaHQpO2Vsc2V7aWYoYy5jc3NUZXh0PSJib3JkZXI6MCBzb2xpZCByZWQ7cG9zaXRpb246Iit0dCh0LCJwb3NpdGlvbiIpKyI7bGluZS1oZWlnaHQ6MDsiLCIlIiE9PXMmJl8uYXBwZW5kQ2hpbGQmJiJ2IiE9PXMuY2hhckF0KDApJiYicmVtIiE9PXMpY1t1PyJib3JkZXJMZWZ0V2lkdGgiOiJib3JkZXJUb3BXaWR0aCJdPXIrcztlbHNle2lmKF89dC5wYXJlbnROb2RlfHxqLmJvZHksLTEhPT10dChfLCJkaXNwbGF5IikuaW5kZXhPZigiZmxleCIpJiYoYy5wb3NpdGlvbj0iYWJzb2x1dGUiKSxsPV8uX2dzQ2FjaGUsaD1lLnRpY2tlci5mcmFtZSxsJiZ1JiZsLnRpbWU9PT1oKXJldHVybiBsLndpZHRoKnIvMTAwO2NbdT8id2lkdGgiOiJoZWlnaHQiXT1yK3N9Xy5hcHBlbmRDaGlsZChZKSxhPXBhcnNlRmxvYXQoWVt1PyJvZmZzZXRXaWR0aCI6Im9mZnNldEhlaWdodCJdKSxfLnJlbW92ZUNoaWxkKFkpLHUmJiIlIj09PXMmJiExIT09by5jYWNoZVdpZHRocyYmKChsPV8uX2dzQ2FjaGU9Xy5fZ3NDYWNoZXx8e30pLnRpbWU9aCxsLndpZHRoPWEvcioxMDApLDAhPT1hfHxufHwoYT1ldCh0LGkscixzLCEwKSl9ZWxzZSBsPUoodCkubGluZUhlaWdodCx0LnN0eWxlLmxpbmVIZWlnaHQ9cixhPXBhcnNlRmxvYXQoSih0KS5saW5lSGVpZ2h0KSx0LnN0eWxlLmxpbmVIZWlnaHQ9bDtyZXR1cm4gcCYmKGEvPTEwMCksZj8tYTphfSxpdD1HLmNhbGN1bGF0ZU9mZnNldD1mdW5jdGlvbih0LGUsaSl7aWYoImFic29sdXRlIiE9PXR0KHQsInBvc2l0aW9uIixpKSlyZXR1cm4gMDt2YXIgcj0ibGVmdCI9PT1lPyJMZWZ0IjoiVG9wIixzPXR0KHQsIm1hcmdpbiIrcixpKTtyZXR1cm4gdFsib2Zmc2V0IityXS0oZXQodCxlLHBhcnNlRmxvYXQocykscy5yZXBsYWNlKGIsIiIpKXx8MCl9LHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIGkscixzLG49e307aWYoZT1lfHxKKHQsbnVsbCkpaWYoaT1lLmxlbmd0aClmb3IoOy0taT4tMTspLTEhPT0ocz1lW2ldKS5pbmRleE9mKCItdHJhbnNmb3JtIikmJkN0IT09c3x8KG5bcy5yZXBsYWNlKEEsRCldPWUuZ2V0UHJvcGVydHlWYWx1ZShzKSk7ZWxzZSBmb3IoaSBpbiBlKS0xIT09aS5pbmRleE9mKCJUcmFuc2Zvcm0iKSYmQXQhPT1pfHwobltpXT1lW2ldKTtlbHNlIGlmKGU9dC5jdXJyZW50U3R5bGV8fHQuc3R5bGUpZm9yKGkgaW4gZSkic3RyaW5nIj09dHlwZW9mIGkmJnZvaWQgMD09PW5baV0mJihuW2kucmVwbGFjZShBLEQpXT1lW2ldKTtyZXR1cm4gV3x8KG4ub3BhY2l0eT1IKHQpKSxyPVl0KHQsZSwhMSksbi5yb3RhdGlvbj1yLnJvdGF0aW9uLG4uc2tld1g9ci5za2V3WCxuLnNjYWxlWD1yLnNjYWxlWCxuLnNjYWxlWT1yLnNjYWxlWSxuLng9ci54LG4ueT1yLnksTXQmJihuLno9ci56LG4ucm90YXRpb25YPXIucm90YXRpb25YLG4ucm90YXRpb25ZPXIucm90YXRpb25ZLG4uc2NhbGVaPXIuc2NhbGVaKSxuLmZpbHRlcnMmJmRlbGV0ZSBuLmZpbHRlcnMsbn0sc3Q9ZnVuY3Rpb24odCxlLGkscixzKXt2YXIgbixhLG8sbD17fSxoPXQuc3R5bGU7Zm9yKGEgaW4gaSkiY3NzVGV4dCIhPT1hJiYibGVuZ3RoIiE9PWEmJmlzTmFOKGEpJiYoZVthXSE9PShuPWlbYV0pfHxzJiZzW2FdKSYmLTE9PT1hLmluZGV4T2YoIk9yaWdpbiIpJiYoIm51bWJlciIhPXR5cGVvZiBuJiYic3RyaW5nIiE9dHlwZW9mIG58fChsW2FdPSJhdXRvIiE9PW58fCJsZWZ0IiE9PWEmJiJ0b3AiIT09YT8iIiE9PW4mJiJhdXRvIiE9PW4mJiJub25lIiE9PW58fCJzdHJpbmciIT10eXBlb2YgZVthXXx8IiI9PT1lW2FdLnJlcGxhY2UoeCwiIik/bjowOml0KHQsYSksdm9pZCAwIT09aFthXSYmKG89bmV3IHl0KGgsYSxoW2FdLG8pKSkpO2lmKHIpZm9yKGEgaW4gcikiY2xhc3NOYW1lIiE9PWEmJihsW2FdPXJbYV0pO3JldHVybntkaWZzOmwsZmlyc3RNUFQ6b319LG50PXt3aWR0aDpbIkxlZnQiLCJSaWdodCJdLGhlaWdodDpbIlRvcCIsIkJvdHRvbSJdfSxhdD1bIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCIsIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSJdLG90PWZ1bmN0aW9uKHQsZSxpKXtpZigic3ZnIj09PSh0Lm5vZGVOYW1lKyIiKS50b0xvd2VyQ2FzZSgpKXJldHVybihpfHxKKHQpKVtlXXx8MDtpZih0LmdldENUTSYmQnQodCkpcmV0dXJuIHQuZ2V0QkJveCgpW2VdfHwwO3ZhciByPXBhcnNlRmxvYXQoIndpZHRoIj09PWU/dC5vZmZzZXRXaWR0aDp0Lm9mZnNldEhlaWdodCkscz1udFtlXSxuPXMubGVuZ3RoO2ZvcihpPWl8fEoodCxudWxsKTstLW4+LTE7KXItPXBhcnNlRmxvYXQodHQodCwicGFkZGluZyIrc1tuXSxpLCEwKSl8fDAsci09cGFyc2VGbG9hdCh0dCh0LCJib3JkZXIiK3Nbbl0rIldpZHRoIixpLCEwKSl8fDA7cmV0dXJuIHJ9LGx0PWZ1bmN0aW9uKHQsZSl7aWYoImNvbnRhaW4iPT09dHx8ImF1dG8iPT09dHx8ImF1dG8gYXV0byI9PT10KXJldHVybiB0KyIgIjtudWxsIT10JiYiIiE9PXR8fCh0PSIwIDAiKTt2YXIgaSxyPXQuc3BsaXQoIiAiKSxzPS0xIT09dC5pbmRleE9mKCJsZWZ0Iik/IjAlIjotMSE9PXQuaW5kZXhPZigicmlnaHQiKT8iMTAwJSI6clswXSxuPS0xIT09dC5pbmRleE9mKCJ0b3AiKT8iMCUiOi0xIT09dC5pbmRleE9mKCJib3R0b20iKT8iMTAwJSI6clsxXTtpZihyLmxlbmd0aD4zJiYhZSl7Zm9yKHI9dC5zcGxpdCgiLCAiKS5qb2luKCIsIikuc3BsaXQoIiwiKSx0PVtdLGk9MDtpPHIubGVuZ3RoO2krKyl0LnB1c2gobHQocltpXSkpO3JldHVybiB0LmpvaW4oIiwiKX1yZXR1cm4gbnVsbD09bj9uPSJjZW50ZXIiPT09cz8iNTAlIjoiMCI6ImNlbnRlciI9PT1uJiYobj0iNTAlIiksKCJjZW50ZXIiPT09c3x8aXNOYU4ocGFyc2VGbG9hdChzKSkmJi0xPT09KHMrIiIpLmluZGV4T2YoIj0iKSkmJihzPSI1MCUiKSx0PXMrIiAiK24rKHIubGVuZ3RoPjI/IiAiK3JbMl06IiIpLGUmJihlLm94cD0tMSE9PXMuaW5kZXhPZigiJSIpLGUub3lwPS0xIT09bi5pbmRleE9mKCIlIiksZS5veHI9Ij0iPT09cy5jaGFyQXQoMSksZS5veXI9Ij0iPT09bi5jaGFyQXQoMSksZS5veD1wYXJzZUZsb2F0KHMucmVwbGFjZSh4LCIiKSksZS5veT1wYXJzZUZsb2F0KG4ucmVwbGFjZSh4LCIiKSksZS52PXQpLGV8fHR9LGh0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQodixnKSksInN0cmluZyI9PXR5cGVvZiB0JiYiPSI9PT10LmNoYXJBdCgxKT9wYXJzZUludCh0LmNoYXJBdCgwKSsiMSIsMTApKnBhcnNlRmxvYXQodC5zdWJzdHIoMikpOnBhcnNlRmxvYXQodCktcGFyc2VGbG9hdChlKXx8MH0sdXQ9ZnVuY3Rpb24odCxlKXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dCh2LGcpKTt2YXIgaT0ic3RyaW5nIj09dHlwZW9mIHQmJiI9Ij09PXQuY2hhckF0KDEpO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmInYiPT09dC5jaGFyQXQodC5sZW5ndGgtMikmJih0PShpP3Quc3Vic3RyKDAsMik6MCkrd2luZG93WyJpbm5lciIrKCJ2aCI9PT10LnN1YnN0cigtMik/IkhlaWdodCI6IldpZHRoIildKihwYXJzZUZsb2F0KGk/dC5zdWJzdHIoMik6dCkvMTAwKSksbnVsbD09dD9lOmk/cGFyc2VJbnQodC5jaGFyQXQoMCkrIjEiLDEwKSpwYXJzZUZsb2F0KHQuc3Vic3RyKDIpKStlOnBhcnNlRmxvYXQodCl8fDB9LF90PWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBzLG4sYSxvLGw7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQodixnKSksbnVsbD09dD9vPWU6Im51bWJlciI9PXR5cGVvZiB0P289dDoocz0zNjAsbj10LnNwbGl0KCJfIiksYT0oKGw9Ij0iPT09dC5jaGFyQXQoMSkpP3BhcnNlSW50KHQuY2hhckF0KDApKyIxIiwxMCkqcGFyc2VGbG9hdChuWzBdLnN1YnN0cigyKSk6cGFyc2VGbG9hdChuWzBdKSkqKC0xPT09dC5pbmRleE9mKCJyYWQiKT8xOk4pLShsPzA6ZSksbi5sZW5ndGgmJihyJiYocltpXT1lK2EpLC0xIT09dC5pbmRleE9mKCJzaG9ydCIpJiYoYSU9cykhPT1hJShzLzIpJiYoYT1hPDA/YStzOmEtcyksLTEhPT10LmluZGV4T2YoIl9jdyIpJiZhPDA/YT0oYSs5OTk5OTk5OTk5KnMpJXMtKGEvc3wwKSpzOi0xIT09dC5pbmRleE9mKCJjY3ciKSYmYT4wJiYoYT0oYS05OTk5OTk5OTk5KnMpJXMtKGEvc3wwKSpzKSksbz1lK2EpLG88MWUtNiYmbz4tMWUtNiYmKG89MCksb30sY3Q9e2FxdWE6WzAsMjU1LDI1NV0sbGltZTpbMCwyNTUsMF0sc2lsdmVyOlsxOTIsMTkyLDE5Ml0sYmxhY2s6WzAsMCwwXSxtYXJvb246WzEyOCwwLDBdLHRlYWw6WzAsMTI4LDEyOF0sYmx1ZTpbMCwwLDI1NV0sbmF2eTpbMCwwLDEyOF0sd2hpdGU6WzI1NSwyNTUsMjU1XSxmdWNoc2lhOlsyNTUsMCwyNTVdLG9saXZlOlsxMjgsMTI4LDBdLHllbGxvdzpbMjU1LDI1NSwwXSxvcmFuZ2U6WzI1NSwxNjUsMF0sZ3JheTpbMTI4LDEyOCwxMjhdLHB1cnBsZTpbMTI4LDAsMTI4XSxncmVlbjpbMCwxMjgsMF0scmVkOlsyNTUsMCwwXSxwaW5rOlsyNTUsMTkyLDIwM10sY3lhbjpbMCwyNTUsMjU1XSx0cmFuc3BhcmVudDpbMjU1LDI1NSwyNTUsMF19LGZ0PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gMjU1Kig2Kih0PXQ8MD90KzE6dD4xP3QtMTp0KTwxP2UrKGktZSkqdCo2OnQ8LjU/aTozKnQ8Mj9lKyhpLWUpKigyLzMtdCkqNjplKSsuNXwwfSxwdD1vLnBhcnNlQ29sb3I9ZnVuY3Rpb24odCxlKXt2YXIgaSxyLHMsbixhLG8sbCxoLHUsXyxjO2lmKHQpaWYoIm51bWJlciI9PXR5cGVvZiB0KWk9W3Q+PjE2LHQ+PjgmMjU1LDI1NSZ0XTtlbHNle2lmKCIsIj09PXQuY2hhckF0KHQubGVuZ3RoLTEpJiYodD10LnN1YnN0cigwLHQubGVuZ3RoLTEpKSxjdFt0XSlpPWN0W3RdO2Vsc2UgaWYoIiMiPT09dC5jaGFyQXQoMCkpND09PXQubGVuZ3RoJiYodD0iIyIrKHI9dC5jaGFyQXQoMSkpK3IrKHM9dC5jaGFyQXQoMikpK3MrKG49dC5jaGFyQXQoMykpK24pLGk9Wyh0PXBhcnNlSW50KHQuc3Vic3RyKDEpLDE2KSk+PjE2LHQ+PjgmMjU1LDI1NSZ0XTtlbHNlIGlmKCJoc2wiPT09dC5zdWJzdHIoMCwzKSlpZihpPWM9dC5tYXRjaCh5KSxlKXtpZigtMSE9PXQuaW5kZXhPZigiPSIpKXJldHVybiB0Lm1hdGNoKFQpfWVsc2UgYT1OdW1iZXIoaVswXSklMzYwLzM2MCxvPU51bWJlcihpWzFdKS8xMDAscj0yKihsPU51bWJlcihpWzJdKS8xMDApLShzPWw8PS41P2wqKG8rMSk6bCtvLWwqbyksaS5sZW5ndGg+MyYmKGlbM109TnVtYmVyKGlbM10pKSxpWzBdPWZ0KGErMS8zLHIscyksaVsxXT1mdChhLHIscyksaVsyXT1mdChhLTEvMyxyLHMpO2Vsc2UgaT10Lm1hdGNoKHkpfHxjdC50cmFuc3BhcmVudDtpWzBdPU51bWJlcihpWzBdKSxpWzFdPU51bWJlcihpWzFdKSxpWzJdPU51bWJlcihpWzJdKSxpLmxlbmd0aD4zJiYoaVszXT1OdW1iZXIoaVszXSkpfWVsc2UgaT1jdC5ibGFjaztyZXR1cm4gZSYmIWMmJihyPWlbMF0vMjU1LHM9aVsxXS8yNTUsbj1pWzJdLzI1NSxsPSgoaD1NYXRoLm1heChyLHMsbikpKyh1PU1hdGgubWluKHIscyxuKSkpLzIsaD09PXU/YT1vPTA6KF89aC11LG89bD4uNT9fLygyLWgtdSk6Xy8oaCt1KSxhPWg9PT1yPyhzLW4pL18rKHM8bj82OjApOmg9PT1zPyhuLXIpL18rMjooci1zKS9fKzQsYSo9NjApLGlbMF09YSsuNXwwLGlbMV09MTAwKm8rLjV8MCxpWzJdPTEwMCpsKy41fDApLGl9LGR0PWZ1bmN0aW9uKHQsZSl7dmFyIGkscixzLG49dC5tYXRjaChtdCl8fFtdLGE9MCxvPSIiO2lmKCFuLmxlbmd0aClyZXR1cm4gdDtmb3IoaT0wO2k8bi5sZW5ndGg7aSsrKXI9bltpXSxhKz0ocz10LnN1YnN0cihhLHQuaW5kZXhPZihyLGEpLWEpKS5sZW5ndGgrci5sZW5ndGgsMz09PShyPXB0KHIsZSkpLmxlbmd0aCYmci5wdXNoKDEpLG8rPXMrKGU/ImhzbGEoIityWzBdKyIsIityWzFdKyIlLCIrclsyXSsiJSwiK3JbM106InJnYmEoIityLmpvaW4oIiwiKSkrIikiO3JldHVybiBvK3Quc3Vic3RyKGEpfSxtdD0iKD86XFxiKD86KD86cmdifHJnYmF8aHNsfGhzbGEpXFwoLis/XFwpKXxcXEIjKD86WzAtOWEtZl17M30pezEsMn1cXGIiO2Zvcih1IGluIGN0KW10Kz0ifCIrdSsiXFxiIjttdD1uZXcgUmVnRXhwKG10KyIpIiwiZ2kiKSxvLmNvbG9yU3RyaW5nRmlsdGVyPWZ1bmN0aW9uKHQpe3ZhciBlLGk9dFswXSsiICIrdFsxXTttdC50ZXN0KGkpJiYoZT0tMSE9PWkuaW5kZXhPZigiaHNsKCIpfHwtMSE9PWkuaW5kZXhPZigiaHNsYSgiKSx0WzBdPWR0KHRbMF0sZSksdFsxXT1kdCh0WzFdLGUpKSxtdC5sYXN0SW5kZXg9MH0sZS5kZWZhdWx0U3RyaW5nRmlsdGVyfHwoZS5kZWZhdWx0U3RyaW5nRmlsdGVyPW8uY29sb3JTdHJpbmdGaWx0ZXIpO3ZhciBndD1mdW5jdGlvbih0LGUsaSxyKXtpZihudWxsPT10KXJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdH07dmFyIHMsbj1lPyh0Lm1hdGNoKG10KXx8WyIiXSlbMF06IiIsYT10LnNwbGl0KG4pLmpvaW4oIiIpLm1hdGNoKHcpfHxbXSxvPXQuc3Vic3RyKDAsdC5pbmRleE9mKGFbMF0pKSxsPSIpIj09PXQuY2hhckF0KHQubGVuZ3RoLTEpPyIpIjoiIixoPS0xIT09dC5pbmRleE9mKCIgIik/IiAiOiIsIix1PWEubGVuZ3RoLF89dT4wP2FbMF0ucmVwbGFjZSh5LCIiKToiIjtyZXR1cm4gdT9zPWU/ZnVuY3Rpb24odCl7dmFyIGUsYyxmLHA7aWYoIm51bWJlciI9PXR5cGVvZiB0KXQrPV87ZWxzZSBpZihyJiZ6LnRlc3QodCkpe2ZvcihwPXQucmVwbGFjZSh6LCJ8Iikuc3BsaXQoInwiKSxmPTA7ZjxwLmxlbmd0aDtmKyspcFtmXT1zKHBbZl0pO3JldHVybiBwLmpvaW4oIiwiKX1pZihlPSh0Lm1hdGNoKG10KXx8W25dKVswXSxmPShjPXQuc3BsaXQoZSkuam9pbigiIikubWF0Y2godyl8fFtdKS5sZW5ndGgsdT5mLS0pZm9yKDsrK2Y8dTspY1tmXT1pP2NbKGYtMSkvMnwwXTphW2ZdO3JldHVybiBvK2Muam9pbihoKStoK2UrbCsoLTEhPT10LmluZGV4T2YoImluc2V0Iik/IiBpbnNldCI6IiIpfTpmdW5jdGlvbih0KXt2YXIgZSxuLGM7aWYoIm51bWJlciI9PXR5cGVvZiB0KXQrPV87ZWxzZSBpZihyJiZ6LnRlc3QodCkpe2ZvcihuPXQucmVwbGFjZSh6LCJ8Iikuc3BsaXQoInwiKSxjPTA7YzxuLmxlbmd0aDtjKyspbltjXT1zKG5bY10pO3JldHVybiBuLmpvaW4oIiwiKX1pZihjPShlPXQubWF0Y2godyl8fFtdKS5sZW5ndGgsdT5jLS0pZm9yKDsrK2M8dTspZVtjXT1pP2VbKGMtMSkvMnwwXTphW2NdO3JldHVybiBvK2Uuam9pbihoKStsfTpmdW5jdGlvbih0KXtyZXR1cm4gdH19LHZ0PWZ1bmN0aW9uKHQpe3JldHVybiB0PXQuc3BsaXQoIiwiKSxmdW5jdGlvbihlLGkscixzLG4sYSxvKXt2YXIgbCxoPShpKyIiKS5zcGxpdCgiICIpO2ZvcihvPXt9LGw9MDtsPDQ7bCsrKW9bdFtsXV09aFtsXT1oW2xdfHxoWyhsLTEpLzI+PjBdO3JldHVybiBzLnBhcnNlKGUsbyxuLGEpfX0seXQ9KEcuX3NldFBsdWdpblJhdGlvPWZ1bmN0aW9uKHQpe3RoaXMucGx1Z2luLnNldFJhdGlvKHQpO2Zvcih2YXIgZSxpLHIscyxuLGE9dGhpcy5kYXRhLG89YS5wcm94eSxsPWEuZmlyc3RNUFQ7bDspZT1vW2wudl0sbC5yP2U9bC5yKGUpOmU8MWUtNiYmZT4tMWUtNiYmKGU9MCksbC50W2wucF09ZSxsPWwuX25leHQ7aWYoYS5hdXRvUm90YXRlJiYoYS5hdXRvUm90YXRlLnJvdGF0aW9uPWEubW9kP2EubW9kLmNhbGwodGhpcy5fdHdlZW4sby5yb3RhdGlvbix0aGlzLnQsdGhpcy5fdHdlZW4pOm8ucm90YXRpb24pLDE9PT10fHwwPT09dClmb3IobD1hLmZpcnN0TVBULG49MT09PXQ/ImUiOiJiIjtsOyl7aWYoKGk9bC50KS50eXBlKXtpZigxPT09aS50eXBlKXtmb3Iocz1pLnhzMCtpLnMraS54czEscj0xO3I8aS5sO3IrKylzKz1pWyJ4biIrcl0raVsieHMiKyhyKzEpXTtpW25dPXN9fWVsc2UgaVtuXT1pLnMraS54czA7bD1sLl9uZXh0fX0sZnVuY3Rpb24odCxlLGkscixzKXt0aGlzLnQ9dCx0aGlzLnA9ZSx0aGlzLnY9aSx0aGlzLnI9cyxyJiYoci5fcHJldj10aGlzLHRoaXMuX25leHQ9cil9KSxUdD0oRy5fcGFyc2VUb1Byb3h5PWZ1bmN0aW9uKHQsZSxpLHIscyxuKXt2YXIgYSxvLGwsaCx1LF89cixjPXt9LGY9e30scD1pLl90cmFuc2Zvcm0sZD1YO2ZvcihpLl90cmFuc2Zvcm09bnVsbCxYPWUscj11PWkucGFyc2UodCxlLHIscyksWD1kLG4mJihpLl90cmFuc2Zvcm09cCxfJiYoXy5fcHJldj1udWxsLF8uX3ByZXYmJihfLl9wcmV2Ll9uZXh0PW51bGwpKSk7ciYmciE9PV87KXtpZihyLnR5cGU8PTEmJihmW289ci5wXT1yLnMrci5jLGNbb109ci5zLG58fChoPW5ldyB5dChyLCJzIixvLGgsci5yKSxyLmM9MCksMT09PXIudHlwZSkpZm9yKGE9ci5sOy0tYT4wOylsPSJ4biIrYSxmW289ci5wKyJfIitsXT1yLmRhdGFbbF0sY1tvXT1yW2xdLG58fChoPW5ldyB5dChyLGwsbyxoLHIucnhwW2xdKSk7cj1yLl9uZXh0fXJldHVybntwcm94eTpjLGVuZDpmLGZpcnN0TVBUOmgscHQ6dX19LEcuQ1NTUHJvcFR3ZWVuPWZ1bmN0aW9uKHQsZSxyLHMsbixvLGwsaCx1LF8sYyl7dGhpcy50PXQsdGhpcy5wPWUsdGhpcy5zPXIsdGhpcy5jPXMsdGhpcy5uPWx8fGUsdCBpbnN0YW5jZW9mIFR0fHxhLnB1c2godGhpcy5uKSx0aGlzLnI9aD8iZnVuY3Rpb24iPT10eXBlb2YgaD9oOk1hdGgucm91bmQ6aCx0aGlzLnR5cGU9b3x8MCx1JiYodGhpcy5wcj11LGk9ITApLHRoaXMuYj12b2lkIDA9PT1fP3I6Xyx0aGlzLmU9dm9pZCAwPT09Yz9yK3M6YyxuJiYodGhpcy5fbmV4dD1uLG4uX3ByZXY9dGhpcyl9KSx3dD1mdW5jdGlvbih0LGUsaSxyLHMsbil7dmFyIGE9bmV3IFR0KHQsZSxpLHItaSxzLC0xLG4pO3JldHVybiBhLmI9aSxhLmU9YS54czA9cixhfSx4dD1vLnBhcnNlQ29tcGxleD1mdW5jdGlvbih0LGUsaSxyLHMsbixhLGwsaCx1KXtpPWl8fG58fCIiLCJmdW5jdGlvbiI9PXR5cGVvZiByJiYocj1yKHYsZykpLGE9bmV3IFR0KHQsZSwwLDAsYSx1PzI6MSxudWxsLCExLGwsaSxyKSxyKz0iIixzJiZtdC50ZXN0KHIraSkmJihyPVtpLHJdLG8uY29sb3JTdHJpbmdGaWx0ZXIociksaT1yWzBdLHI9clsxXSk7dmFyIGMsZixwLGQsbSx3LHgsYixQLFMsayxSLE8sQT1pLnNwbGl0KCIsICIpLmpvaW4oIiwiKS5zcGxpdCgiICIpLEM9ci5zcGxpdCgiLCAiKS5qb2luKCIsIikuc3BsaXQoIiAiKSxEPUEubGVuZ3RoLE09ITEhPT1fO2ZvcigtMT09PXIuaW5kZXhPZigiLCIpJiYtMT09PWkuaW5kZXhPZigiLCIpfHwoLTEhPT0ocitpKS5pbmRleE9mKCJyZ2IiKXx8LTEhPT0ocitpKS5pbmRleE9mKCJoc2wiKT8oQT1BLmpvaW4oIiAiKS5yZXBsYWNlKHosIiwgIikuc3BsaXQoIiAiKSxDPUMuam9pbigiICIpLnJlcGxhY2UoeiwiLCAiKS5zcGxpdCgiICIpKTooQT1BLmpvaW4oIiAiKS5zcGxpdCgiLCIpLmpvaW4oIiwgIikuc3BsaXQoIiAiKSxDPUMuam9pbigiICIpLnNwbGl0KCIsIikuam9pbigiLCAiKS5zcGxpdCgiICIpKSxEPUEubGVuZ3RoKSxEIT09Qy5sZW5ndGgmJihEPShBPShufHwiIikuc3BsaXQoIiAiKSkubGVuZ3RoKSxhLnBsdWdpbj1oLGEuc2V0UmF0aW89dSxtdC5sYXN0SW5kZXg9MCxjPTA7YzxEO2MrKylpZihkPUFbY10sbT1DW2NdKyIiLChiPXBhcnNlRmxvYXQoZCkpfHwwPT09YilhLmFwcGVuZFh0cmEoIiIsYixodChtLGIpLG0ucmVwbGFjZShULCIiKSwhKCFNfHwtMT09PW0uaW5kZXhPZigicHgiKSkmJk1hdGgucm91bmQsITApO2Vsc2UgaWYocyYmbXQudGVzdChkKSlSPSIpIisoKFI9bS5pbmRleE9mKCIpIikrMSk/bS5zdWJzdHIoUik6IiIpLE89LTEhPT1tLmluZGV4T2YoImhzbCIpJiZXLFM9bSxkPXB0KGQsTyksbT1wdChtLE8pLChQPWQubGVuZ3RoK20ubGVuZ3RoPjYpJiYhVyYmMD09PW1bM10/KGFbInhzIithLmxdKz1hLmw/IiB0cmFuc3BhcmVudCI6InRyYW5zcGFyZW50IixhLmU9YS5lLnNwbGl0KENbY10pLmpvaW4oInRyYW5zcGFyZW50IikpOihXfHwoUD0hMSksTz9hLmFwcGVuZFh0cmEoUy5zdWJzdHIoMCxTLmluZGV4T2YoImhzbCIpKSsoUD8iaHNsYSgiOiJoc2woIiksZFswXSxodChtWzBdLGRbMF0pLCIsIiwhMSwhMCkuYXBwZW5kWHRyYSgiIixkWzFdLGh0KG1bMV0sZFsxXSksIiUsIiwhMSkuYXBwZW5kWHRyYSgiIixkWzJdLGh0KG1bMl0sZFsyXSksUD8iJSwiOiIlIitSLCExKTphLmFwcGVuZFh0cmEoUy5zdWJzdHIoMCxTLmluZGV4T2YoInJnYiIpKSsoUD8icmdiYSgiOiJyZ2IoIiksZFswXSxtWzBdLWRbMF0sIiwiLE1hdGgucm91bmQsITApLmFwcGVuZFh0cmEoIiIsZFsxXSxtWzFdLWRbMV0sIiwiLE1hdGgucm91bmQpLmFwcGVuZFh0cmEoIiIsZFsyXSxtWzJdLWRbMl0sUD8iLCI6UixNYXRoLnJvdW5kKSxQJiYoZD1kLmxlbmd0aDw0PzE6ZFszXSxhLmFwcGVuZFh0cmEoIiIsZCwobS5sZW5ndGg8ND8xOm1bM10pLWQsUiwhMSkpKSxtdC5sYXN0SW5kZXg9MDtlbHNlIGlmKHc9ZC5tYXRjaCh5KSl7aWYoISh4PW0ubWF0Y2goVCkpfHx4Lmxlbmd0aCE9PXcubGVuZ3RoKXJldHVybiBhO2ZvcihwPTAsZj0wO2Y8dy5sZW5ndGg7ZisrKWs9d1tmXSxTPWQuaW5kZXhPZihrLHApLGEuYXBwZW5kWHRyYShkLnN1YnN0cihwLFMtcCksTnVtYmVyKGspLGh0KHhbZl0sayksIiIsISghTXx8InB4IiE9PWQuc3Vic3RyKFMray5sZW5ndGgsMikpJiZNYXRoLnJvdW5kLDA9PT1mKSxwPVMray5sZW5ndGg7YVsieHMiK2EubF0rPWQuc3Vic3RyKHApfWVsc2UgYVsieHMiK2EubF0rPWEubHx8YVsieHMiK2EubF0/IiAiK206bTtpZigtMSE9PXIuaW5kZXhPZigiPSIpJiZhLmRhdGEpe2ZvcihSPWEueHMwK2EuZGF0YS5zLGM9MTtjPGEubDtjKyspUis9YVsieHMiK2NdK2EuZGF0YVsieG4iK2NdO2EuZT1SK2FbInhzIitjXX1yZXR1cm4gYS5sfHwoYS50eXBlPS0xLGEueHMwPWEuZSksYS54Zmlyc3R8fGF9LGJ0PTk7Zm9yKCh1PVR0LnByb3RvdHlwZSkubD11LnByPTA7LS1idD4wOyl1WyJ4biIrYnRdPTAsdVsieHMiK2J0XT0iIjt1LnhzMD0iIix1Ll9uZXh0PXUuX3ByZXY9dS54Zmlyc3Q9dS5kYXRhPXUucGx1Z2luPXUuc2V0UmF0aW89dS5yeHA9bnVsbCx1LmFwcGVuZFh0cmE9ZnVuY3Rpb24odCxlLGkscixzLG4pe3ZhciBhPXRoaXMsbz1hLmw7cmV0dXJuIGFbInhzIitvXSs9biYmKG98fGFbInhzIitvXSk/IiAiK3Q6dHx8IiIsaXx8MD09PW98fGEucGx1Z2luPyhhLmwrKyxhLnR5cGU9YS5zZXRSYXRpbz8yOjEsYVsieHMiK2EubF09cnx8IiIsbz4wPyhhLmRhdGFbInhuIitvXT1lK2ksYS5yeHBbInhuIitvXT1zLGFbInhuIitvXT1lLGEucGx1Z2lufHwoYS54Zmlyc3Q9bmV3IFR0KGEsInhuIitvLGUsaSxhLnhmaXJzdHx8YSwwLGEubixzLGEucHIpLGEueGZpcnN0LnhzMD0wKSxhKTooYS5kYXRhPXtzOmUraX0sYS5yeHA9e30sYS5zPWUsYS5jPWksYS5yPXMsYSkpOihhWyJ4cyIrb10rPWUrKHJ8fCIiKSxhKX07dmFyIFB0PWZ1bmN0aW9uKHQsZSl7ZT1lfHx7fSx0aGlzLnA9ZS5wcmVmaXgmJksodCl8fHQsaFt0XT1oW3RoaXMucF09dGhpcyx0aGlzLmZvcm1hdD1lLmZvcm1hdHRlcnx8Z3QoZS5kZWZhdWx0VmFsdWUsZS5jb2xvcixlLmNvbGxhcHNpYmxlLGUubXVsdGkpLGUucGFyc2VyJiYodGhpcy5wYXJzZT1lLnBhcnNlciksdGhpcy5jbHJzPWUuY29sb3IsdGhpcy5tdWx0aT1lLm11bHRpLHRoaXMua2V5d29yZD1lLmtleXdvcmQsdGhpcy5kZmx0PWUuZGVmYXVsdFZhbHVlLHRoaXMucHI9ZS5wcmlvcml0eXx8MH0sU3Q9Ry5fcmVnaXN0ZXJDb21wbGV4U3BlY2lhbFByb3A9ZnVuY3Rpb24odCxlLGkpeyJvYmplY3QiIT10eXBlb2YgZSYmKGU9e3BhcnNlcjppfSk7dmFyIHIscz10LnNwbGl0KCIsIiksbj1lLmRlZmF1bHRWYWx1ZTtmb3IoaT1pfHxbbl0scj0wO3I8cy5sZW5ndGg7cisrKWUucHJlZml4PTA9PT1yJiZlLnByZWZpeCxlLmRlZmF1bHRWYWx1ZT1pW3JdfHxuLG5ldyBQdChzW3JdLGUpfSxrdD1HLl9yZWdpc3RlclBsdWdpblByb3A9ZnVuY3Rpb24odCl7aWYoIWhbdF0pe3ZhciBlPXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSkrIlBsdWdpbiI7U3QodCx7cGFyc2VyOmZ1bmN0aW9uKHQsaSxyLHMsbixhLG8pe3ZhciB1PWwuY29tLmdyZWVuc29jay5wbHVnaW5zW2VdO3JldHVybiB1Pyh1Ll9jc3NSZWdpc3RlcigpLGhbcl0ucGFyc2UodCxpLHIscyxuLGEsbykpOihaKCJFcnJvcjogIitlKyIganMgZmlsZSBub3QgbG9hZGVkLiIpLG4pfX0pfX07KHU9UHQucHJvdG90eXBlKS5wYXJzZUNvbXBsZXg9ZnVuY3Rpb24odCxlLGkscixzLG4pe3ZhciBhLG8sbCxoLHUsXyxjPXRoaXMua2V5d29yZDtpZih0aGlzLm11bHRpJiYoei50ZXN0KGkpfHx6LnRlc3QoZSk/KG89ZS5yZXBsYWNlKHosInwiKS5zcGxpdCgifCIpLGw9aS5yZXBsYWNlKHosInwiKS5zcGxpdCgifCIpKTpjJiYobz1bZV0sbD1baV0pKSxsKXtmb3IoaD1sLmxlbmd0aD5vLmxlbmd0aD9sLmxlbmd0aDpvLmxlbmd0aCxhPTA7YTxoO2ErKyllPW9bYV09b1thXXx8dGhpcy5kZmx0LGk9bFthXT1sW2FdfHx0aGlzLmRmbHQsYyYmKHU9ZS5pbmRleE9mKGMpKSE9PShfPWkuaW5kZXhPZihjKSkmJigtMT09PV8/b1thXT1vW2FdLnNwbGl0KGMpLmpvaW4oIiIpOi0xPT09dSYmKG9bYV0rPSIgIitjKSk7ZT1vLmpvaW4oIiwgIiksaT1sLmpvaW4oIiwgIil9cmV0dXJuIHh0KHQsdGhpcy5wLGUsaSx0aGlzLmNscnMsdGhpcy5kZmx0LHIsdGhpcy5wcixzLG4pfSx1LnBhcnNlPWZ1bmN0aW9uKHQsZSxpLHIscyxhLG8pe3JldHVybiB0aGlzLnBhcnNlQ29tcGxleCh0LnN0eWxlLHRoaXMuZm9ybWF0KHR0KHQsdGhpcy5wLG4sITEsdGhpcy5kZmx0KSksdGhpcy5mb3JtYXQoZSkscyxhKX0sby5yZWdpc3RlclNwZWNpYWxQcm9wPWZ1bmN0aW9uKHQsZSxpKXtTdCh0LHtwYXJzZXI6ZnVuY3Rpb24odCxyLHMsbixhLG8sbCl7dmFyIGg9bmV3IFR0KHQscywwLDAsYSwyLHMsITEsaSk7cmV0dXJuIGgucGx1Z2luPW8saC5zZXRSYXRpbz1lKHQscixuLl90d2VlbixzKSxofSxwcmlvcml0eTppfSl9LG8udXNlU1ZHVHJhbnNmb3JtQXR0cj0hMDt2YXIgUnQsT3Q9InNjYWxlWCxzY2FsZVksc2NhbGVaLHgseSx6LHNrZXdYLHNrZXdZLHJvdGF0aW9uLHJvdGF0aW9uWCxyb3RhdGlvblkscGVyc3BlY3RpdmUseFBlcmNlbnQseVBlcmNlbnQiLnNwbGl0KCIsIiksQXQ9SygidHJhbnNmb3JtIiksQ3Q9JCsidHJhbnNmb3JtIixEdD1LKCJ0cmFuc2Zvcm1PcmlnaW4iKSxNdD1udWxsIT09SygicGVyc3BlY3RpdmUiKSxFdD1HLlRyYW5zZm9ybT1mdW5jdGlvbigpe3RoaXMucGVyc3BlY3RpdmU9cGFyc2VGbG9hdChvLmRlZmF1bHRUcmFuc2Zvcm1QZXJzcGVjdGl2ZSl8fDAsdGhpcy5mb3JjZTNEPSEoITE9PT1vLmRlZmF1bHRGb3JjZTNEfHwhTXQpJiYoby5kZWZhdWx0Rm9yY2UzRHx8ImF1dG8iKX0sRnQ9cy5TVkdFbGVtZW50LHp0PWZ1bmN0aW9uKHQsZSxpKXt2YXIgcixzPWouY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdCksbj0vKFthLXpdKShbQS1aXSkvZztmb3IociBpbiBpKXMuc2V0QXR0cmlidXRlTlMobnVsbCxyLnJlcGxhY2UobiwiJDEtJDIiKS50b0xvd2VyQ2FzZSgpLGlbcl0pO3JldHVybiBlLmFwcGVuZENoaWxkKHMpLHN9LEl0PWouZG9jdW1lbnRFbGVtZW50fHx7fSxMdD1mdW5jdGlvbigpe3ZhciB0LGUsaSxyPW18fC9BbmRyb2lkL2kudGVzdChxKSYmIXMuY2hyb21lO3JldHVybiBqLmNyZWF0ZUVsZW1lbnROUyYmIXImJih0PXp0KCJzdmciLEl0KSxpPShlPXp0KCJyZWN0Iix0LHt3aWR0aDoxMDAsaGVpZ2h0OjUwLHg6MTAwfSkpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLGUuc3R5bGVbRHRdPSI1MCUgNTAlIixlLnN0eWxlW0F0XT0ic2NhbGVYKDAuNSkiLHI9aT09PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgmJiEocCYmTXQpLEl0LnJlbW92ZUNoaWxkKHQpKSxyfSgpLE50PWZ1bmN0aW9uKHQsZSxpLHIscyxuKXt2YXIgYSxsLGgsdSxfLGMsZixwLGQsbSxnLHYseSxULHc9dC5fZ3NUcmFuc2Zvcm0seD1VdCh0LCEwKTt3JiYoeT13LnhPcmlnaW4sVD13LnlPcmlnaW4pLCghcnx8KGE9ci5zcGxpdCgiICIpKS5sZW5ndGg8MikmJigwPT09KGY9dC5nZXRCQm94KCkpLngmJjA9PT1mLnkmJmYud2lkdGgrZi5oZWlnaHQ9PT0wJiYoZj17eDpwYXJzZUZsb2F0KHQuaGFzQXR0cmlidXRlKCJ4Iik/dC5nZXRBdHRyaWJ1dGUoIngiKTp0Lmhhc0F0dHJpYnV0ZSgiY3giKT90LmdldEF0dHJpYnV0ZSgiY3giKTowKXx8MCx5OnBhcnNlRmxvYXQodC5oYXNBdHRyaWJ1dGUoInkiKT90LmdldEF0dHJpYnV0ZSgieSIpOnQuaGFzQXR0cmlidXRlKCJjeSIpP3QuZ2V0QXR0cmlidXRlKCJjeSIpOjApfHwwLHdpZHRoOjAsaGVpZ2h0OjB9KSxhPVsoLTEhPT0oZT1sdChlKS5zcGxpdCgiICIpKVswXS5pbmRleE9mKCIlIik/cGFyc2VGbG9hdChlWzBdKS8xMDAqZi53aWR0aDpwYXJzZUZsb2F0KGVbMF0pKStmLngsKC0xIT09ZVsxXS5pbmRleE9mKCIlIik/cGFyc2VGbG9hdChlWzFdKS8xMDAqZi5oZWlnaHQ6cGFyc2VGbG9hdChlWzFdKSkrZi55XSksaS54T3JpZ2luPXU9cGFyc2VGbG9hdChhWzBdKSxpLnlPcmlnaW49Xz1wYXJzZUZsb2F0KGFbMV0pLHImJnghPT1qdCYmKGM9eFswXSxmPXhbMV0scD14WzJdLGQ9eFszXSxtPXhbNF0sZz14WzVdLCh2PWMqZC1mKnApJiYobD11KihkL3YpK18qKC1wL3YpKyhwKmctZCptKS92LGg9dSooLWYvdikrXyooYy92KS0oYypnLWYqbSkvdix1PWkueE9yaWdpbj1hWzBdPWwsXz1pLnlPcmlnaW49YVsxXT1oKSksdyYmKG4mJihpLnhPZmZzZXQ9dy54T2Zmc2V0LGkueU9mZnNldD13LnlPZmZzZXQsdz1pKSxzfHwhMSE9PXMmJiExIT09by5kZWZhdWx0U21vb3RoT3JpZ2luPyhsPXUteSxoPV8tVCx3LnhPZmZzZXQrPWwqeFswXStoKnhbMl0tbCx3LnlPZmZzZXQrPWwqeFsxXStoKnhbM10taCk6dy54T2Zmc2V0PXcueU9mZnNldD0wKSxufHx0LnNldEF0dHJpYnV0ZSgiZGF0YS1zdmctb3JpZ2luIixhLmpvaW4oIiAiKSl9LFh0PWZ1bmN0aW9uKHQpe3ZhciBlLGk9VSgic3ZnIix0aGlzLm93bmVyU1ZHRWxlbWVudCYmdGhpcy5vd25lclNWR0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ4bWxucyIpfHwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciKSxyPXRoaXMucGFyZW50Tm9kZSxzPXRoaXMubmV4dFNpYmxpbmcsbj10aGlzLnN0eWxlLmNzc1RleHQ7aWYoSXQuYXBwZW5kQ2hpbGQoaSksaS5hcHBlbmRDaGlsZCh0aGlzKSx0aGlzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0KXRyeXtlPXRoaXMuZ2V0QkJveCgpLHRoaXMuX29yaWdpbmFsR2V0QkJveD10aGlzLmdldEJCb3gsdGhpcy5nZXRCQm94PVh0fWNhdGNoKHQpe31lbHNlIHRoaXMuX29yaWdpbmFsR2V0QkJveCYmKGU9dGhpcy5fb3JpZ2luYWxHZXRCQm94KCkpO3JldHVybiBzP3IuaW5zZXJ0QmVmb3JlKHRoaXMscyk6ci5hcHBlbmRDaGlsZCh0aGlzKSxJdC5yZW1vdmVDaGlsZChpKSx0aGlzLnN0eWxlLmNzc1RleHQ9bixlfSxCdD1mdW5jdGlvbih0KXtyZXR1cm4hKCFGdHx8IXQuZ2V0Q1RNfHx0LnBhcmVudE5vZGUmJiF0Lm93bmVyU1ZHRWxlbWVudHx8IWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gdC5nZXRCQm94KCl9Y2F0Y2goZSl7cmV0dXJuIFh0LmNhbGwodCwhMCl9fSh0KSl9LGp0PVsxLDAsMCwxLDAsMF0sVXQ9ZnVuY3Rpb24odCxlKXt2YXIgaSxyLHMsbixhLG8sbD10Ll9nc1RyYW5zZm9ybXx8bmV3IEV0LGg9dC5zdHlsZTtpZihBdD9yPXR0KHQsQ3QsbnVsbCwhMCk6dC5jdXJyZW50U3R5bGUmJihyPShyPXQuY3VycmVudFN0eWxlLmZpbHRlci5tYXRjaChFKSkmJjQ9PT1yLmxlbmd0aD9bclswXS5zdWJzdHIoNCksTnVtYmVyKHJbMl0uc3Vic3RyKDQpKSxOdW1iZXIoclsxXS5zdWJzdHIoNCkpLHJbM10uc3Vic3RyKDQpLGwueHx8MCxsLnl8fDBdLmpvaW4oIiwiKToiIiksaT0hcnx8Im5vbmUiPT09cnx8Im1hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKSI9PT1yLCFBdHx8IShvPSFKKHQpfHwibm9uZSI9PT1KKHQpLmRpc3BsYXkpJiZ0LnBhcmVudE5vZGV8fChvJiYobj1oLmRpc3BsYXksaC5kaXNwbGF5PSJibG9jayIpLHQucGFyZW50Tm9kZXx8KGE9MSxJdC5hcHBlbmRDaGlsZCh0KSksaT0hKHI9dHQodCxDdCxudWxsLCEwKSl8fCJub25lIj09PXJ8fCJtYXRyaXgoMSwgMCwgMCwgMSwgMCwgMCkiPT09cixuP2guZGlzcGxheT1uOm8mJld0KGgsImRpc3BsYXkiKSxhJiZJdC5yZW1vdmVDaGlsZCh0KSksKGwuc3ZnfHx0LmdldENUTSYmQnQodCkpJiYoaSYmLTEhPT0oaFtBdF0rIiIpLmluZGV4T2YoIm1hdHJpeCIpJiYocj1oW0F0XSxpPTApLHM9dC5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpLGkmJnMmJihyPSJtYXRyaXgoIisocz10LnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkubWF0cml4KS5hKyIsIitzLmIrIiwiK3MuYysiLCIrcy5kKyIsIitzLmUrIiwiK3MuZisiKSIsaT0wKSksaSlyZXR1cm4ganQ7Zm9yKHM9KHJ8fCIiKS5tYXRjaCh5KXx8W10sYnQ9cy5sZW5ndGg7LS1idD4tMTspbj1OdW1iZXIoc1tidF0pLHNbYnRdPShhPW4tKG58PTApKT8oMWU1KmErKGE8MD8tLjU6LjUpfDApLzFlNStuOm47cmV0dXJuIGUmJnMubGVuZ3RoPjY/W3NbMF0sc1sxXSxzWzRdLHNbNV0sc1sxMl0sc1sxM11dOnN9LFl0PUcuZ2V0VHJhbnNmb3JtPWZ1bmN0aW9uKHQsaSxyLHMpe2lmKHQuX2dzVHJhbnNmb3JtJiZyJiYhcylyZXR1cm4gdC5fZ3NUcmFuc2Zvcm07dmFyIG4sYSxsLGgsdSxfLGM9ciYmdC5fZ3NUcmFuc2Zvcm18fG5ldyBFdCxmPWMuc2NhbGVYPDAscD1NdCYmKHBhcnNlRmxvYXQodHQodCxEdCxpLCExLCIwIDAgMCIpLnNwbGl0KCIgIilbMl0pfHxjLnpPcmlnaW4pfHwwLGQ9cGFyc2VGbG9hdChvLmRlZmF1bHRUcmFuc2Zvcm1QZXJzcGVjdGl2ZSl8fDA7aWYoYy5zdmc9ISghdC5nZXRDVE18fCFCdCh0KSksYy5zdmcmJihOdCh0LHR0KHQsRHQsaSwhMSwiNTAlIDUwJSIpKyIiLGMsdC5nZXRBdHRyaWJ1dGUoImRhdGEtc3ZnLW9yaWdpbiIpKSxSdD1vLnVzZVNWR1RyYW5zZm9ybUF0dHJ8fEx0KSwobj1VdCh0KSkhPT1qdCl7aWYoMTY9PT1uLmxlbmd0aCl7dmFyIG0sZyx2LHksVCx3PW5bMF0seD1uWzFdLGI9blsyXSxQPW5bM10sUz1uWzRdLGs9bls1XSxSPW5bNl0sTz1uWzddLEE9bls4XSxDPW5bOV0sRD1uWzEwXSxNPW5bMTJdLEU9blsxM10sRj1uWzE0XSx6PW5bMTFdLEk9TWF0aC5hdGFuMihSLEQpO2Muek9yaWdpbiYmKE09QSooRj0tYy56T3JpZ2luKS1uWzEyXSxFPUMqRi1uWzEzXSxGPUQqRitjLnpPcmlnaW4tblsxNF0pLGMucm90YXRpb25YPUkqTixJJiYobT1TKih5PU1hdGguY29zKC1JKSkrQSooVD1NYXRoLnNpbigtSSkpLGc9ayp5K0MqVCx2PVIqeStEKlQsQT1TKi1UK0EqeSxDPWsqLVQrQyp5LEQ9UiotVCtEKnksej1PKi1UK3oqeSxTPW0saz1nLFI9diksST1NYXRoLmF0YW4yKC1iLEQpLGMucm90YXRpb25ZPUkqTixJJiYoZz14Kih5PU1hdGguY29zKC1JKSktQyooVD1NYXRoLnNpbigtSSkpLHY9Yip5LUQqVCxDPXgqVCtDKnksRD1iKlQrRCp5LHo9UCpUK3oqeSx3PW09dyp5LUEqVCx4PWcsYj12KSxJPU1hdGguYXRhbjIoeCx3KSxjLnJvdGF0aW9uPUkqTixJJiYobT13Kih5PU1hdGguY29zKEkpKSt4KihUPU1hdGguc2luKEkpKSxnPVMqeStrKlQsdj1BKnkrQypULHg9eCp5LXcqVCxrPWsqeS1TKlQsQz1DKnktQSpULHc9bSxTPWcsQT12KSxjLnJvdGF0aW9uWCYmTWF0aC5hYnMoYy5yb3RhdGlvblgpK01hdGguYWJzKGMucm90YXRpb24pPjM1OS45JiYoYy5yb3RhdGlvblg9Yy5yb3RhdGlvbj0wLGMucm90YXRpb25ZPTE4MC1jLnJvdGF0aW9uWSksST1NYXRoLmF0YW4yKFMsayksYy5zY2FsZVg9KDFlNSpNYXRoLnNxcnQodyp3K3gqeCtiKmIpKy41fDApLzFlNSxjLnNjYWxlWT0oMWU1Kk1hdGguc3FydChrKmsrUipSKSsuNXwwKS8xZTUsYy5zY2FsZVo9KDFlNSpNYXRoLnNxcnQoQSpBK0MqQytEKkQpKy41fDApLzFlNSx3Lz1jLnNjYWxlWCxTLz1jLnNjYWxlWSx4Lz1jLnNjYWxlWCxrLz1jLnNjYWxlWSxNYXRoLmFicyhJKT4yZS01PyhjLnNrZXdYPUkqTixTPTAsInNpbXBsZSIhPT1jLnNrZXdUeXBlJiYoYy5zY2FsZVkqPTEvTWF0aC5jb3MoSSkpKTpjLnNrZXdYPTAsYy5wZXJzcGVjdGl2ZT16PzEvKHo8MD8tejp6KTowLGMueD1NLGMueT1FLGMuej1GLGMuc3ZnJiYoYy54LT1jLnhPcmlnaW4tKGMueE9yaWdpbip3LWMueU9yaWdpbipTKSxjLnktPWMueU9yaWdpbi0oYy55T3JpZ2luKngtYy54T3JpZ2luKmspKX1lbHNlIGlmKCFNdHx8c3x8IW4ubGVuZ3RofHxjLnghPT1uWzRdfHxjLnkhPT1uWzVdfHwhYy5yb3RhdGlvblgmJiFjLnJvdGF0aW9uWSl7dmFyIEw9bi5sZW5ndGg+PTYsWD1MP25bMF06MSxCPW5bMV18fDAsaj1uWzJdfHwwLFU9TD9uWzNdOjE7Yy54PW5bNF18fDAsYy55PW5bNV18fDAsbD1NYXRoLnNxcnQoWCpYK0IqQiksaD1NYXRoLnNxcnQoVSpVK2oqaiksdT1YfHxCP01hdGguYXRhbjIoQixYKSpOOmMucm90YXRpb258fDAsXz1qfHxVP01hdGguYXRhbjIoaixVKSpOK3U6Yy5za2V3WHx8MCxjLnNjYWxlWD1sLGMuc2NhbGVZPWgsYy5yb3RhdGlvbj11LGMuc2tld1g9XyxNdCYmKGMucm90YXRpb25YPWMucm90YXRpb25ZPWMuej0wLGMucGVyc3BlY3RpdmU9ZCxjLnNjYWxlWj0xKSxjLnN2ZyYmKGMueC09Yy54T3JpZ2luLShjLnhPcmlnaW4qWCtjLnlPcmlnaW4qaiksYy55LT1jLnlPcmlnaW4tKGMueE9yaWdpbipCK2MueU9yaWdpbipVKSl9Zm9yKGEgaW4gTWF0aC5hYnMoYy5za2V3WCk+OTAmJk1hdGguYWJzKGMuc2tld1gpPDI3MCYmKGY/KGMuc2NhbGVYKj0tMSxjLnNrZXdYKz1jLnJvdGF0aW9uPD0wPzE4MDotMTgwLGMucm90YXRpb24rPWMucm90YXRpb248PTA/MTgwOi0xODApOihjLnNjYWxlWSo9LTEsYy5za2V3WCs9Yy5za2V3WDw9MD8xODA6LTE4MCkpLGMuek9yaWdpbj1wLGMpY1thXTwyZS01JiZjW2FdPi0yZS01JiYoY1thXT0wKX1yZXR1cm4gciYmKHQuX2dzVHJhbnNmb3JtPWMsYy5zdmcmJihSdCYmdC5zdHlsZVtBdF0/ZS5kZWxheWVkQ2FsbCguMDAxLGZ1bmN0aW9uKCl7V3QodC5zdHlsZSxBdCl9KTohUnQmJnQuZ2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iKSYmZS5kZWxheWVkQ2FsbCguMDAxLGZ1bmN0aW9uKCl7dC5yZW1vdmVBdHRyaWJ1dGUoInRyYW5zZm9ybSIpfSkpKSxjfSxWdD1mdW5jdGlvbih0KXt2YXIgZSxpLHI9dGhpcy5kYXRhLHM9LXIucm90YXRpb24qTCxuPXMrci5za2V3WCpMLGE9KE1hdGguY29zKHMpKnIuc2NhbGVYKjFlNXwwKS8xZTUsbz0oTWF0aC5zaW4ocykqci5zY2FsZVgqMWU1fDApLzFlNSxsPShNYXRoLnNpbihuKSotci5zY2FsZVkqMWU1fDApLzFlNSxoPShNYXRoLmNvcyhuKSpyLnNjYWxlWSoxZTV8MCkvMWU1LHU9dGhpcy50LnN0eWxlLF89dGhpcy50LmN1cnJlbnRTdHlsZTtpZihfKXtpPW8sbz0tbCxsPS1pLGU9Xy5maWx0ZXIsdS5maWx0ZXI9IiI7dmFyIGMsZixwPXRoaXMudC5vZmZzZXRXaWR0aCxkPXRoaXMudC5vZmZzZXRIZWlnaHQsZz0iYWJzb2x1dGUiIT09Xy5wb3NpdGlvbix2PSJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuTWF0cml4KE0xMT0iK2ErIiwgTTEyPSIrbysiLCBNMjE9IitsKyIsIE0yMj0iK2gseT1yLngrcCpyLnhQZXJjZW50LzEwMCxUPXIueStkKnIueVBlcmNlbnQvMTAwO2lmKG51bGwhPXIub3gmJih5Kz0oYz0oci5veHA/cCpyLm94Ki4wMTpyLm94KS1wLzIpLShjKmErKGY9KHIub3lwP2Qqci5veSouMDE6ci5veSktZC8yKSpvKSxUKz1mLShjKmwrZipoKSksdis9Zz8iLCBEeD0iKygoYz1wLzIpLShjKmErKGY9ZC8yKSpvKSt5KSsiLCBEeT0iKyhmLShjKmwrZipoKStUKSsiKSI6Iiwgc2l6aW5nTWV0aG9kPSdhdXRvIGV4cGFuZCcpIiwtMSE9PWUuaW5kZXhPZigiRFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuTWF0cml4KCIpP3UuZmlsdGVyPWUucmVwbGFjZShGLHYpOnUuZmlsdGVyPXYrIiAiK2UsMCE9PXQmJjEhPT10fHwxPT09YSYmMD09PW8mJjA9PT1sJiYxPT09aCYmKGcmJi0xPT09di5pbmRleE9mKCJEeD0wLCBEeT0wIil8fFAudGVzdChlKSYmMTAwIT09cGFyc2VGbG9hdChSZWdFeHAuJDEpfHwtMT09PWUuaW5kZXhPZihlLmluZGV4T2YoIkFscGhhIikpJiZ1LnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIikpLCFnKXt2YXIgdyx4LFMsaz1tPDg/MTotMTtmb3IoYz1yLmllT2Zmc2V0WHx8MCxmPXIuaWVPZmZzZXRZfHwwLHIuaWVPZmZzZXRYPU1hdGgucm91bmQoKHAtKChhPDA/LWE6YSkqcCsobzwwPy1vOm8pKmQpKS8yK3kpLHIuaWVPZmZzZXRZPU1hdGgucm91bmQoKGQtKChoPDA/LWg6aCkqZCsobDwwPy1sOmwpKnApKS8yK1QpLGJ0PTA7YnQ8NDtidCsrKVM9KGk9LTEhPT0odz1fW3g9YXRbYnRdXSkuaW5kZXhPZigicHgiKT9wYXJzZUZsb2F0KHcpOmV0KHRoaXMudCx4LHBhcnNlRmxvYXQodyksdy5yZXBsYWNlKGIsIiIpKXx8MCkhPT1yW3hdP2J0PDI/LXIuaWVPZmZzZXRYOi1yLmllT2Zmc2V0WTpidDwyP2Mtci5pZU9mZnNldFg6Zi1yLmllT2Zmc2V0WSx1W3hdPShyW3hdPU1hdGgucm91bmQoaS1TKigwPT09YnR8fDI9PT1idD8xOmspKSkrInB4In19fSxHdD1HLnNldDNEVHJhbnNmb3JtUmF0aW89Ry5zZXRUcmFuc2Zvcm1SYXRpbz1mdW5jdGlvbih0KXt2YXIgZSxpLHIscyxuLGEsbyxsLGgsdSxfLGMsZixkLG0sZyx2LHksVCx3LHgsYj10aGlzLmRhdGEsUD10aGlzLnQuc3R5bGUsUz1iLnJvdGF0aW9uLGs9Yi5yb3RhdGlvblgsUj1iLnJvdGF0aW9uWSxPPWIuc2NhbGVYLEE9Yi5zY2FsZVksQz1iLnNjYWxlWixEPWIueCxNPWIueSxFPWIueixGPWIuc3ZnLHo9Yi5wZXJzcGVjdGl2ZSxJPWIuZm9yY2UzRCxOPWIuc2tld1ksWD1iLnNrZXdYO2lmKE4mJihYKz1OLFMrPU4pLCEoKDEhPT10JiYwIT09dHx8ImF1dG8iIT09SXx8dGhpcy50d2Vlbi5fdG90YWxUaW1lIT09dGhpcy50d2Vlbi5fdG90YWxEdXJhdGlvbiYmdGhpcy50d2Vlbi5fdG90YWxUaW1lKSYmSXx8RXx8enx8Unx8a3x8MSE9PUMpfHxSdCYmRnx8IU10KVN8fFh8fEY/KFMqPUwsdz1YKkwseD0xZTUsaT1NYXRoLmNvcyhTKSpPLG49TWF0aC5zaW4oUykqTyxyPU1hdGguc2luKFMtdykqLUEsYT1NYXRoLmNvcyhTLXcpKkEsdyYmInNpbXBsZSI9PT1iLnNrZXdUeXBlJiYoZT1NYXRoLnRhbih3LU4qTCkscio9ZT1NYXRoLnNxcnQoMStlKmUpLGEqPWUsTiYmKGU9TWF0aC50YW4oTipMKSxpKj1lPU1hdGguc3FydCgxK2UqZSksbio9ZSkpLEYmJihEKz1iLnhPcmlnaW4tKGIueE9yaWdpbippK2IueU9yaWdpbipyKStiLnhPZmZzZXQsTSs9Yi55T3JpZ2luLShiLnhPcmlnaW4qbitiLnlPcmlnaW4qYSkrYi55T2Zmc2V0LFJ0JiYoYi54UGVyY2VudHx8Yi55UGVyY2VudCkmJihtPXRoaXMudC5nZXRCQm94KCksRCs9LjAxKmIueFBlcmNlbnQqbS53aWR0aCxNKz0uMDEqYi55UGVyY2VudCptLmhlaWdodCksRDwobT0xZS02KSYmRD4tbSYmKEQ9MCksTTxtJiZNPi1tJiYoTT0wKSksVD0oaSp4fDApL3grIiwiKyhuKnh8MCkveCsiLCIrKHIqeHwwKS94KyIsIisoYSp4fDApL3grIiwiK0QrIiwiK00rIikiLEYmJlJ0P3RoaXMudC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsIm1hdHJpeCgiK1QpOlBbQXRdPShiLnhQZXJjZW50fHxiLnlQZXJjZW50PyJ0cmFuc2xhdGUoIitiLnhQZXJjZW50KyIlLCIrYi55UGVyY2VudCsiJSkgbWF0cml4KCI6Im1hdHJpeCgiKStUKTpQW0F0XT0oYi54UGVyY2VudHx8Yi55UGVyY2VudD8idHJhbnNsYXRlKCIrYi54UGVyY2VudCsiJSwiK2IueVBlcmNlbnQrIiUpIG1hdHJpeCgiOiJtYXRyaXgoIikrTysiLDAsMCwiK0ErIiwiK0QrIiwiK00rIikiO2Vsc2V7aWYocCYmKE88KG09MWUtNCkmJk8+LW0mJihPPUM9MmUtNSksQTxtJiZBPi1tJiYoQT1DPTJlLTUpLCF6fHxiLnp8fGIucm90YXRpb25YfHxiLnJvdGF0aW9uWXx8KHo9MCkpLFN8fFgpUyo9TCxnPWk9TWF0aC5jb3MoUyksdj1uPU1hdGguc2luKFMpLFgmJihTLT1YKkwsZz1NYXRoLmNvcyhTKSx2PU1hdGguc2luKFMpLCJzaW1wbGUiPT09Yi5za2V3VHlwZSYmKGU9TWF0aC50YW4oKFgtTikqTCksZyo9ZT1NYXRoLnNxcnQoMStlKmUpLHYqPWUsYi5za2V3WSYmKGU9TWF0aC50YW4oTipMKSxpKj1lPU1hdGguc3FydCgxK2UqZSksbio9ZSkpKSxyPS12LGE9ZztlbHNle2lmKCEoUnx8a3x8MSE9PUN8fHp8fEYpKXJldHVybiB2b2lkKFBbQXRdPShiLnhQZXJjZW50fHxiLnlQZXJjZW50PyJ0cmFuc2xhdGUoIitiLnhQZXJjZW50KyIlLCIrYi55UGVyY2VudCsiJSkgdHJhbnNsYXRlM2QoIjoidHJhbnNsYXRlM2QoIikrRCsicHgsIitNKyJweCwiK0UrInB4KSIrKDEhPT1PfHwxIT09QT8iIHNjYWxlKCIrTysiLCIrQSsiKSI6IiIpKTtpPWE9MSxyPW49MH11PTEscz1vPWw9aD1fPWM9MCxmPXo/LTEvejowLGQ9Yi56T3JpZ2luLG09MWUtNiwiLCIsIjAiLChTPVIqTCkmJihnPU1hdGguY29zKFMpLGw9LSh2PU1hdGguc2luKFMpKSxfPWYqLXYscz1pKnYsbz1uKnYsdT1nLGYqPWcsaSo9ZyxuKj1nKSwoUz1rKkwpJiYoZT1yKihnPU1hdGguY29zKFMpKStzKih2PU1hdGguc2luKFMpKSx5PWEqZytvKnYsaD11KnYsYz1mKnYscz1yKi12K3MqZyxvPWEqLXYrbypnLHUqPWcsZio9ZyxyPWUsYT15KSwxIT09QyYmKHMqPUMsbyo9Qyx1Kj1DLGYqPUMpLDEhPT1BJiYocio9QSxhKj1BLGgqPUEsYyo9QSksMSE9PU8mJihpKj1PLG4qPU8sbCo9TyxfKj1PKSwoZHx8RikmJihkJiYoRCs9cyotZCxNKz1vKi1kLEUrPXUqLWQrZCksRiYmKEQrPWIueE9yaWdpbi0oYi54T3JpZ2luKmkrYi55T3JpZ2luKnIpK2IueE9mZnNldCxNKz1iLnlPcmlnaW4tKGIueE9yaWdpbipuK2IueU9yaWdpbiphKStiLnlPZmZzZXQpLEQ8bSYmRD4tbSYmKEQ9IjAiKSxNPG0mJk0+LW0mJihNPSIwIiksRTxtJiZFPi1tJiYoRT0wKSksVD1iLnhQZXJjZW50fHxiLnlQZXJjZW50PyJ0cmFuc2xhdGUoIitiLnhQZXJjZW50KyIlLCIrYi55UGVyY2VudCsiJSkgbWF0cml4M2QoIjoibWF0cml4M2QoIixUKz0oaTxtJiZpPi1tPyIwIjppKSsiLCIrKG48bSYmbj4tbT8iMCI6bikrIiwiKyhsPG0mJmw+LW0/IjAiOmwpLFQrPSIsIisoXzxtJiZfPi1tPyIwIjpfKSsiLCIrKHI8bSYmcj4tbT8iMCI6cikrIiwiKyhhPG0mJmE+LW0/IjAiOmEpLGt8fFJ8fDEhPT1DPyhUKz0iLCIrKGg8bSYmaD4tbT8iMCI6aCkrIiwiKyhjPG0mJmM+LW0/IjAiOmMpKyIsIisoczxtJiZzPi1tPyIwIjpzKSxUKz0iLCIrKG88bSYmbz4tbT8iMCI6bykrIiwiKyh1PG0mJnU+LW0/IjAiOnUpKyIsIisoZjxtJiZmPi1tPyIwIjpmKSsiLCIpOlQrPSIsMCwwLDAsMCwxLDAsIixUKz1EKyIsIitNKyIsIitFKyIsIisoej8xKy1FL3o6MSkrIikiLFBbQXRdPVR9fTsodT1FdC5wcm90b3R5cGUpLng9dS55PXUuej11LnNrZXdYPXUuc2tld1k9dS5yb3RhdGlvbj11LnJvdGF0aW9uWD11LnJvdGF0aW9uWT11LnpPcmlnaW49dS54UGVyY2VudD11LnlQZXJjZW50PXUueE9mZnNldD11LnlPZmZzZXQ9MCx1LnNjYWxlWD11LnNjYWxlWT11LnNjYWxlWj0xLFN0KCJ0cmFuc2Zvcm0sc2NhbGUsc2NhbGVYLHNjYWxlWSxzY2FsZVoseCx5LHoscm90YXRpb24scm90YXRpb25YLHJvdGF0aW9uWSxyb3RhdGlvblosc2tld1gsc2tld1ksc2hvcnRSb3RhdGlvbixzaG9ydFJvdGF0aW9uWCxzaG9ydFJvdGF0aW9uWSxzaG9ydFJvdGF0aW9uWix0cmFuc2Zvcm1PcmlnaW4sc3ZnT3JpZ2luLHRyYW5zZm9ybVBlcnNwZWN0aXZlLGRpcmVjdGlvbmFsUm90YXRpb24scGFyc2VUcmFuc2Zvcm0sZm9yY2UzRCxza2V3VHlwZSx4UGVyY2VudCx5UGVyY2VudCxzbW9vdGhPcmlnaW4iLHtwYXJzZXI6ZnVuY3Rpb24odCxlLGkscixzLGEsbCl7aWYoci5fbGFzdFBhcnNlZFRyYW5zZm9ybT09PWwpcmV0dXJuIHM7ci5fbGFzdFBhcnNlZFRyYW5zZm9ybT1sO3ZhciBoLHU9bC5zY2FsZSYmImZ1bmN0aW9uIj09dHlwZW9mIGwuc2NhbGU/bC5zY2FsZTowOyJmdW5jdGlvbiI9PXR5cGVvZiBsW2ldJiYoaD1sW2ldLGxbaV09ZSksdSYmKGwuc2NhbGU9dSh2LHQpKTt2YXIgXyxjLGYscCxkLG0seSxULHcseD10Ll9nc1RyYW5zZm9ybSxiPXQuc3R5bGUsUD1PdC5sZW5ndGgsUz1sLGs9e30sUj1ZdCh0LG4sITAsUy5wYXJzZVRyYW5zZm9ybSksTz1TLnRyYW5zZm9ybSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBTLnRyYW5zZm9ybT9TLnRyYW5zZm9ybSh2LGcpOlMudHJhbnNmb3JtKTtpZihSLnNrZXdUeXBlPVMuc2tld1R5cGV8fFIuc2tld1R5cGV8fG8uZGVmYXVsdFNrZXdUeXBlLHIuX3RyYW5zZm9ybT1SLCJyb3RhdGlvbloiaW4gUyYmKFMucm90YXRpb249Uy5yb3RhdGlvblopLE8mJiJzdHJpbmciPT10eXBlb2YgTyYmQXQpKGM9WS5zdHlsZSlbQXRdPU8sYy5kaXNwbGF5PSJibG9jayIsYy5wb3NpdGlvbj0iYWJzb2x1dGUiLC0xIT09Ty5pbmRleE9mKCIlIikmJihjLndpZHRoPXR0KHQsIndpZHRoIiksYy5oZWlnaHQ9dHQodCwiaGVpZ2h0IikpLGouYm9keS5hcHBlbmRDaGlsZChZKSxfPVl0KFksbnVsbCwhMSksInNpbXBsZSI9PT1SLnNrZXdUeXBlJiYoXy5zY2FsZVkqPU1hdGguY29zKF8uc2tld1gqTCkpLFIuc3ZnJiYobT1SLnhPcmlnaW4seT1SLnlPcmlnaW4sXy54LT1SLnhPZmZzZXQsXy55LT1SLnlPZmZzZXQsKFMudHJhbnNmb3JtT3JpZ2lufHxTLnN2Z09yaWdpbikmJihPPXt9LE50KHQsbHQoUy50cmFuc2Zvcm1PcmlnaW4pLE8sUy5zdmdPcmlnaW4sUy5zbW9vdGhPcmlnaW4sITApLG09Ty54T3JpZ2luLHk9Ty55T3JpZ2luLF8ueC09Ty54T2Zmc2V0LVIueE9mZnNldCxfLnktPU8ueU9mZnNldC1SLnlPZmZzZXQpLChtfHx5KSYmKFQ9VXQoWSwhMCksXy54LT1tLShtKlRbMF0reSpUWzJdKSxfLnktPXktKG0qVFsxXSt5KlRbM10pKSksai5ib2R5LnJlbW92ZUNoaWxkKFkpLF8ucGVyc3BlY3RpdmV8fChfLnBlcnNwZWN0aXZlPVIucGVyc3BlY3RpdmUpLG51bGwhPVMueFBlcmNlbnQmJihfLnhQZXJjZW50PXV0KFMueFBlcmNlbnQsUi54UGVyY2VudCkpLG51bGwhPVMueVBlcmNlbnQmJihfLnlQZXJjZW50PXV0KFMueVBlcmNlbnQsUi55UGVyY2VudCkpO2Vsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiBTKXtpZihfPXtzY2FsZVg6dXQobnVsbCE9Uy5zY2FsZVg/Uy5zY2FsZVg6Uy5zY2FsZSxSLnNjYWxlWCksc2NhbGVZOnV0KG51bGwhPVMuc2NhbGVZP1Muc2NhbGVZOlMuc2NhbGUsUi5zY2FsZVkpLHNjYWxlWjp1dChTLnNjYWxlWixSLnNjYWxlWikseDp1dChTLngsUi54KSx5OnV0KFMueSxSLnkpLHo6dXQoUy56LFIueikseFBlcmNlbnQ6dXQoUy54UGVyY2VudCxSLnhQZXJjZW50KSx5UGVyY2VudDp1dChTLnlQZXJjZW50LFIueVBlcmNlbnQpLHBlcnNwZWN0aXZlOnV0KFMudHJhbnNmb3JtUGVyc3BlY3RpdmUsUi5wZXJzcGVjdGl2ZSl9LG51bGwhPShkPVMuZGlyZWN0aW9uYWxSb3RhdGlvbikpaWYoIm9iamVjdCI9PXR5cGVvZiBkKWZvcihjIGluIGQpU1tjXT1kW2NdO2Vsc2UgUy5yb3RhdGlvbj1kOyJzdHJpbmciPT10eXBlb2YgUy54JiYtMSE9PVMueC5pbmRleE9mKCIlIikmJihfLng9MCxfLnhQZXJjZW50PXV0KFMueCxSLnhQZXJjZW50KSksInN0cmluZyI9PXR5cGVvZiBTLnkmJi0xIT09Uy55LmluZGV4T2YoIiUiKSYmKF8ueT0wLF8ueVBlcmNlbnQ9dXQoUy55LFIueVBlcmNlbnQpKSxfLnJvdGF0aW9uPV90KCJyb3RhdGlvbiJpbiBTP1Mucm90YXRpb246InNob3J0Um90YXRpb24iaW4gUz9TLnNob3J0Um90YXRpb24rIl9zaG9ydCI6Ui5yb3RhdGlvbixSLnJvdGF0aW9uLCJyb3RhdGlvbiIsayksTXQmJihfLnJvdGF0aW9uWD1fdCgicm90YXRpb25YImluIFM/Uy5yb3RhdGlvblg6InNob3J0Um90YXRpb25YImluIFM/Uy5zaG9ydFJvdGF0aW9uWCsiX3Nob3J0IjpSLnJvdGF0aW9uWHx8MCxSLnJvdGF0aW9uWCwicm90YXRpb25YIixrKSxfLnJvdGF0aW9uWT1fdCgicm90YXRpb25ZImluIFM/Uy5yb3RhdGlvblk6InNob3J0Um90YXRpb25ZImluIFM/Uy5zaG9ydFJvdGF0aW9uWSsiX3Nob3J0IjpSLnJvdGF0aW9uWXx8MCxSLnJvdGF0aW9uWSwicm90YXRpb25ZIixrKSksXy5za2V3WD1fdChTLnNrZXdYLFIuc2tld1gpLF8uc2tld1k9X3QoUy5za2V3WSxSLnNrZXdZKX1mb3IoTXQmJm51bGwhPVMuZm9yY2UzRCYmKFIuZm9yY2UzRD1TLmZvcmNlM0QscD0hMCksKGY9Ui5mb3JjZTNEfHxSLnp8fFIucm90YXRpb25YfHxSLnJvdGF0aW9uWXx8Xy56fHxfLnJvdGF0aW9uWHx8Xy5yb3RhdGlvbll8fF8ucGVyc3BlY3RpdmUpfHxudWxsPT1TLnNjYWxlfHwoXy5zY2FsZVo9MSk7LS1QPi0xOykoKE89X1t3PU90W1BdXS1SW3ddKT4xZS02fHxPPC0xZS02fHxudWxsIT1TW3ddfHxudWxsIT1YW3ddKSYmKHA9ITAscz1uZXcgVHQoUix3LFJbd10sTyxzKSx3IGluIGsmJihzLmU9a1t3XSkscy54czA9MCxzLnBsdWdpbj1hLHIuX292ZXJ3cml0ZVByb3BzLnB1c2gocy5uKSk7cmV0dXJuIE89Uy50cmFuc2Zvcm1PcmlnaW4sUi5zdmcmJihPfHxTLnN2Z09yaWdpbikmJihtPVIueE9mZnNldCx5PVIueU9mZnNldCxOdCh0LGx0KE8pLF8sUy5zdmdPcmlnaW4sUy5zbW9vdGhPcmlnaW4pLHM9d3QoUiwieE9yaWdpbiIsKHg/UjpfKS54T3JpZ2luLF8ueE9yaWdpbixzLCJ0cmFuc2Zvcm1PcmlnaW4iKSxzPXd0KFIsInlPcmlnaW4iLCh4P1I6XykueU9yaWdpbixfLnlPcmlnaW4scywidHJhbnNmb3JtT3JpZ2luIiksbT09PVIueE9mZnNldCYmeT09PVIueU9mZnNldHx8KHM9d3QoUiwieE9mZnNldCIseD9tOlIueE9mZnNldCxSLnhPZmZzZXQscywidHJhbnNmb3JtT3JpZ2luIikscz13dChSLCJ5T2Zmc2V0Iix4P3k6Ui55T2Zmc2V0LFIueU9mZnNldCxzLCJ0cmFuc2Zvcm1PcmlnaW4iKSksTz0iMHB4IDBweCIpLChPfHxNdCYmZiYmUi56T3JpZ2luKSYmKEF0PyhwPSEwLHc9RHQsTz0oT3x8dHQodCx3LG4sITEsIjUwJSA1MCUiKSkrIiIsKHM9bmV3IFR0KGIsdywwLDAscywtMSwidHJhbnNmb3JtT3JpZ2luIikpLmI9Ylt3XSxzLnBsdWdpbj1hLE10PyhjPVIuek9yaWdpbixPPU8uc3BsaXQoIiAiKSxSLnpPcmlnaW49KE8ubGVuZ3RoPjImJigwPT09Y3x8IjBweCIhPT1PWzJdKT9wYXJzZUZsb2F0KE9bMl0pOmMpfHwwLHMueHMwPXMuZT1PWzBdKyIgIisoT1sxXXx8IjUwJSIpKyIgMHB4Iiwocz1uZXcgVHQoUiwiek9yaWdpbiIsMCwwLHMsLTEscy5uKSkuYj1jLHMueHMwPXMuZT1SLnpPcmlnaW4pOnMueHMwPXMuZT1PKTpsdChPKyIiLFIpKSxwJiYoci5fdHJhbnNmb3JtVHlwZT1SLnN2ZyYmUnR8fCFmJiYzIT09dGhpcy5fdHJhbnNmb3JtVHlwZT8yOjMpLGgmJihsW2ldPWgpLHUmJihsLnNjYWxlPXUpLHN9LHByZWZpeDohMH0pLFN0KCJib3hTaGFkb3ciLHtkZWZhdWx0VmFsdWU6IjBweCAwcHggMHB4IDBweCAjOTk5IixwcmVmaXg6ITAsY29sb3I6ITAsbXVsdGk6ITAsa2V5d29yZDoiaW5zZXQifSksU3QoImJvcmRlclJhZGl1cyIse2RlZmF1bHRWYWx1ZToiMHB4IixwYXJzZXI6ZnVuY3Rpb24odCxlLGkscyxhLG8pe2U9dGhpcy5mb3JtYXQoZSk7dmFyIGwsaCx1LF8sYyxmLHAsZCxtLGcsdix5LFQsdyx4LGIsUD1bImJvcmRlclRvcExlZnRSYWRpdXMiLCJib3JkZXJUb3BSaWdodFJhZGl1cyIsImJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tTGVmdFJhZGl1cyJdLFM9dC5zdHlsZTtmb3IobT1wYXJzZUZsb2F0KHQub2Zmc2V0V2lkdGgpLGc9cGFyc2VGbG9hdCh0Lm9mZnNldEhlaWdodCksbD1lLnNwbGl0KCIgIiksaD0wO2g8UC5sZW5ndGg7aCsrKXRoaXMucC5pbmRleE9mKCJib3JkZXIiKSYmKFBbaF09SyhQW2hdKSksLTEhPT0oYz1fPXR0KHQsUFtoXSxuLCExLCIwcHgiKSkuaW5kZXhPZigiICIpJiYoYz0oXz1jLnNwbGl0KCIgIikpWzBdLF89X1sxXSksZj11PWxbaF0scD1wYXJzZUZsb2F0KGMpLHk9Yy5zdWJzdHIoKHArIiIpLmxlbmd0aCksKFQ9Ij0iPT09Zi5jaGFyQXQoMSkpPyhkPXBhcnNlSW50KGYuY2hhckF0KDApKyIxIiwxMCksZj1mLnN1YnN0cigyKSxkKj1wYXJzZUZsb2F0KGYpLHY9Zi5zdWJzdHIoKGQrIiIpLmxlbmd0aC0oZDwwPzE6MCkpfHwiIik6KGQ9cGFyc2VGbG9hdChmKSx2PWYuc3Vic3RyKChkKyIiKS5sZW5ndGgpKSwiIj09PXYmJih2PXJbaV18fHkpLHYhPT15JiYodz1ldCh0LCJib3JkZXJMZWZ0IixwLHkpLHg9ZXQodCwiYm9yZGVyVG9wIixwLHkpLCIlIj09PXY/KGM9dy9tKjEwMCsiJSIsXz14L2cqMTAwKyIlIik6ImVtIj09PXY/KGM9dy8oYj1ldCh0LCJib3JkZXJMZWZ0IiwxLCJlbSIpKSsiZW0iLF89eC9iKyJlbSIpOihjPXcrInB4IixfPXgrInB4IiksVCYmKGY9cGFyc2VGbG9hdChjKStkK3YsdT1wYXJzZUZsb2F0KF8pK2QrdikpLGE9eHQoUyxQW2hdLGMrIiAiK18sZisiICIrdSwhMSwiMHB4IixhKTtyZXR1cm4gYX0scHJlZml4OiEwLGZvcm1hdHRlcjpndCgiMHB4IDBweCAwcHggMHB4IiwhMSwhMCl9KSxTdCgiYm9yZGVyQm90dG9tTGVmdFJhZGl1cyxib3JkZXJCb3R0b21SaWdodFJhZGl1cyxib3JkZXJUb3BMZWZ0UmFkaXVzLGJvcmRlclRvcFJpZ2h0UmFkaXVzIix7ZGVmYXVsdFZhbHVlOiIwcHgiLHBhcnNlcjpmdW5jdGlvbih0LGUsaSxyLHMsYSl7cmV0dXJuIHh0KHQuc3R5bGUsaSx0aGlzLmZvcm1hdCh0dCh0LGksbiwhMSwiMHB4IDBweCIpKSx0aGlzLmZvcm1hdChlKSwhMSwiMHB4IixzKX0scHJlZml4OiEwLGZvcm1hdHRlcjpndCgiMHB4IDBweCIsITEsITApfSksU3QoImJhY2tncm91bmRQb3NpdGlvbiIse2RlZmF1bHRWYWx1ZToiMCAwIixwYXJzZXI6ZnVuY3Rpb24odCxlLGkscixzLGEpe3ZhciBvLGwsaCx1LF8sYyxmPSJiYWNrZ3JvdW5kLXBvc2l0aW9uIixwPW58fEoodCxudWxsKSxkPXRoaXMuZm9ybWF0KChwP20/cC5nZXRQcm9wZXJ0eVZhbHVlKGYrIi14IikrIiAiK3AuZ2V0UHJvcGVydHlWYWx1ZShmKyIteSIpOnAuZ2V0UHJvcGVydHlWYWx1ZShmKTp0LmN1cnJlbnRTdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb25YKyIgIit0LmN1cnJlbnRTdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb25ZKXx8IjAgMCIpLGc9dGhpcy5mb3JtYXQoZSk7aWYoLTEhPT1kLmluZGV4T2YoIiUiKSE9KC0xIT09Zy5pbmRleE9mKCIlIikpJiZnLnNwbGl0KCIsIikubGVuZ3RoPDImJihjPXR0KHQsImJhY2tncm91bmRJbWFnZSIpLnJlcGxhY2UoQywiIikpJiYibm9uZSIhPT1jKXtmb3Iobz1kLnNwbGl0KCIgIiksbD1nLnNwbGl0KCIgIiksVi5zZXRBdHRyaWJ1dGUoInNyYyIsYyksaD0yOy0taD4tMTspKHU9LTEhPT0oZD1vW2hdKS5pbmRleE9mKCIlIikpIT09KC0xIT09bFtoXS5pbmRleE9mKCIlIikpJiYoXz0wPT09aD90Lm9mZnNldFdpZHRoLVYud2lkdGg6dC5vZmZzZXRIZWlnaHQtVi5oZWlnaHQsb1toXT11P3BhcnNlRmxvYXQoZCkvMTAwKl8rInB4IjpwYXJzZUZsb2F0KGQpL18qMTAwKyIlIik7ZD1vLmpvaW4oIiAiKX1yZXR1cm4gdGhpcy5wYXJzZUNvbXBsZXgodC5zdHlsZSxkLGcscyxhKX0sZm9ybWF0dGVyOmx0fSksU3QoImJhY2tncm91bmRTaXplIix7ZGVmYXVsdFZhbHVlOiIwIDAiLGZvcm1hdHRlcjpmdW5jdGlvbih0KXtyZXR1cm4iY28iPT09KHQrPSIiKS5zdWJzdHIoMCwyKT90Omx0KC0xPT09dC5pbmRleE9mKCIgIik/dCsiICIrdDp0KX19KSxTdCgicGVyc3BlY3RpdmUiLHtkZWZhdWx0VmFsdWU6IjBweCIscHJlZml4OiEwfSksU3QoInBlcnNwZWN0aXZlT3JpZ2luIix7ZGVmYXVsdFZhbHVlOiI1MCUgNTAlIixwcmVmaXg6ITB9KSxTdCgidHJhbnNmb3JtU3R5bGUiLHtwcmVmaXg6ITB9KSxTdCgiYmFja2ZhY2VWaXNpYmlsaXR5Iix7cHJlZml4OiEwfSksU3QoInVzZXJTZWxlY3QiLHtwcmVmaXg6ITB9KSxTdCgibWFyZ2luIix7cGFyc2VyOnZ0KCJtYXJnaW5Ub3AsbWFyZ2luUmlnaHQsbWFyZ2luQm90dG9tLG1hcmdpbkxlZnQiKX0pLFN0KCJwYWRkaW5nIix7cGFyc2VyOnZ0KCJwYWRkaW5nVG9wLHBhZGRpbmdSaWdodCxwYWRkaW5nQm90dG9tLHBhZGRpbmdMZWZ0Iil9KSxTdCgiY2xpcCIse2RlZmF1bHRWYWx1ZToicmVjdCgwcHgsMHB4LDBweCwwcHgpIixwYXJzZXI6ZnVuY3Rpb24odCxlLGkscixzLGEpe3ZhciBvLGwsaDtyZXR1cm4gbTw5PyhsPXQuY3VycmVudFN0eWxlLGg9bTw4PyIgIjoiLCIsbz0icmVjdCgiK2wuY2xpcFRvcCtoK2wuY2xpcFJpZ2h0K2grbC5jbGlwQm90dG9tK2grbC5jbGlwTGVmdCsiKSIsZT10aGlzLmZvcm1hdChlKS5zcGxpdCgiLCIpLmpvaW4oaCkpOihvPXRoaXMuZm9ybWF0KHR0KHQsdGhpcy5wLG4sITEsdGhpcy5kZmx0KSksZT10aGlzLmZvcm1hdChlKSksdGhpcy5wYXJzZUNvbXBsZXgodC5zdHlsZSxvLGUscyxhKX19KSxTdCgidGV4dFNoYWRvdyIse2RlZmF1bHRWYWx1ZToiMHB4IDBweCAwcHggIzk5OSIsY29sb3I6ITAsbXVsdGk6ITB9KSxTdCgiYXV0b1JvdW5kLHN0cmljdFVuaXRzIix7cGFyc2VyOmZ1bmN0aW9uKHQsZSxpLHIscyl7cmV0dXJuIHN9fSksU3QoImJvcmRlciIse2RlZmF1bHRWYWx1ZToiMHB4IHNvbGlkICMwMDAiLHBhcnNlcjpmdW5jdGlvbih0LGUsaSxyLHMsYSl7dmFyIG89dHQodCwiYm9yZGVyVG9wV2lkdGgiLG4sITEsIjBweCIpLGw9dGhpcy5mb3JtYXQoZSkuc3BsaXQoIiAiKSxoPWxbMF0ucmVwbGFjZShiLCIiKTtyZXR1cm4icHgiIT09aCYmKG89cGFyc2VGbG9hdChvKS9ldCh0LCJib3JkZXJUb3BXaWR0aCIsMSxoKStoKSx0aGlzLnBhcnNlQ29tcGxleCh0LnN0eWxlLHRoaXMuZm9ybWF0KG8rIiAiK3R0KHQsImJvcmRlclRvcFN0eWxlIixuLCExLCJzb2xpZCIpKyIgIit0dCh0LCJib3JkZXJUb3BDb2xvciIsbiwhMSwiIzAwMCIpKSxsLmpvaW4oIiAiKSxzLGEpfSxjb2xvcjohMCxmb3JtYXR0ZXI6ZnVuY3Rpb24odCl7dmFyIGU9dC5zcGxpdCgiICIpO3JldHVybiBlWzBdKyIgIisoZVsxXXx8InNvbGlkIikrIiAiKyh0Lm1hdGNoKG10KXx8WyIjMDAwIl0pWzBdfX0pLFN0KCJib3JkZXJXaWR0aCIse3BhcnNlcjp2dCgiYm9yZGVyVG9wV2lkdGgsYm9yZGVyUmlnaHRXaWR0aCxib3JkZXJCb3R0b21XaWR0aCxib3JkZXJMZWZ0V2lkdGgiKX0pLFN0KCJmbG9hdCxjc3NGbG9hdCxzdHlsZUZsb2F0Iix7cGFyc2VyOmZ1bmN0aW9uKHQsZSxpLHIscyxuKXt2YXIgYT10LnN0eWxlLG89ImNzc0Zsb2F0ImluIGE/ImNzc0Zsb2F0Ijoic3R5bGVGbG9hdCI7cmV0dXJuIG5ldyBUdChhLG8sMCwwLHMsLTEsaSwhMSwwLGFbb10sZSl9fSk7dmFyIHF0PWZ1bmN0aW9uKHQpe3ZhciBlLGk9dGhpcy50LHI9aS5maWx0ZXJ8fHR0KHRoaXMuZGF0YSwiZmlsdGVyIil8fCIiLHM9dGhpcy5zK3RoaXMuYyp0fDA7MTAwPT09cyYmKC0xPT09ci5pbmRleE9mKCJhdHJpeCgiKSYmLTE9PT1yLmluZGV4T2YoInJhZGllbnQoIikmJi0xPT09ci5pbmRleE9mKCJvYWRlcigiKT8oaS5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLGU9IXR0KHRoaXMuZGF0YSwiZmlsdGVyIikpOihpLmZpbHRlcj1yLnJlcGxhY2UoaywiIiksZT0hMCkpLGV8fCh0aGlzLnhuMSYmKGkuZmlsdGVyPXI9cnx8ImFscGhhKG9wYWNpdHk9IitzKyIpIiksLTE9PT1yLmluZGV4T2YoInBhY2l0eSIpPzA9PT1zJiZ0aGlzLnhuMXx8KGkuZmlsdGVyPXIrIiBhbHBoYShvcGFjaXR5PSIrcysiKSIpOmkuZmlsdGVyPXIucmVwbGFjZShQLCJvcGFjaXR5PSIrcykpfTtTdCgib3BhY2l0eSxhbHBoYSxhdXRvQWxwaGEiLHtkZWZhdWx0VmFsdWU6IjEiLHBhcnNlcjpmdW5jdGlvbih0LGUsaSxyLHMsYSl7dmFyIG89cGFyc2VGbG9hdCh0dCh0LCJvcGFjaXR5IixuLCExLCIxIikpLGw9dC5zdHlsZSxoPSJhdXRvQWxwaGEiPT09aTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJiI9Ij09PWUuY2hhckF0KDEpJiYoZT0oIi0iPT09ZS5jaGFyQXQoMCk/LTE6MSkqcGFyc2VGbG9hdChlLnN1YnN0cigyKSkrbyksaCYmMT09PW8mJiJoaWRkZW4iPT09dHQodCwidmlzaWJpbGl0eSIsbikmJjAhPT1lJiYobz0wKSxXP3M9bmV3IFR0KGwsIm9wYWNpdHkiLG8sZS1vLHMpOigocz1uZXcgVHQobCwib3BhY2l0eSIsMTAwKm8sMTAwKihlLW8pLHMpKS54bjE9aD8xOjAsbC56b29tPTEscy50eXBlPTIscy5iPSJhbHBoYShvcGFjaXR5PSIrcy5zKyIpIixzLmU9ImFscGhhKG9wYWNpdHk9Iisocy5zK3MuYykrIikiLHMuZGF0YT10LHMucGx1Z2luPWEscy5zZXRSYXRpbz1xdCksaCYmKChzPW5ldyBUdChsLCJ2aXNpYmlsaXR5IiwwLDAscywtMSxudWxsLCExLDAsMCE9PW8/ImluaGVyaXQiOiJoaWRkZW4iLDA9PT1lPyJoaWRkZW4iOiJpbmhlcml0IikpLnhzMD0iaW5oZXJpdCIsci5fb3ZlcndyaXRlUHJvcHMucHVzaChzLm4pLHIuX292ZXJ3cml0ZVByb3BzLnB1c2goaSkpLHN9fSk7dmFyIFd0PWZ1bmN0aW9uKHQsZSl7ZSYmKHQucmVtb3ZlUHJvcGVydHk/KCJtcyIhPT1lLnN1YnN0cigwLDIpJiYid2Via2l0IiE9PWUuc3Vic3RyKDAsNil8fChlPSItIitlKSx0LnJlbW92ZVByb3BlcnR5KGUucmVwbGFjZShPLCItJDEiKS50b0xvd2VyQ2FzZSgpKSk6dC5yZW1vdmVBdHRyaWJ1dGUoZSkpfSxIdD1mdW5jdGlvbih0KXtpZih0aGlzLnQuX2dzQ2xhc3NQVD10aGlzLDE9PT10fHwwPT09dCl7dGhpcy50LnNldEF0dHJpYnV0ZSgiY2xhc3MiLDA9PT10P3RoaXMuYjp0aGlzLmUpO2Zvcih2YXIgZT10aGlzLmRhdGEsaT10aGlzLnQuc3R5bGU7ZTspZS52P2lbZS5wXT1lLnY6V3QoaSxlLnApLGU9ZS5fbmV4dDsxPT09dCYmdGhpcy50Ll9nc0NsYXNzUFQ9PT10aGlzJiYodGhpcy50Ll9nc0NsYXNzUFQ9bnVsbCl9ZWxzZSB0aGlzLnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIT09dGhpcy5lJiZ0aGlzLnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5lKX07U3QoImNsYXNzTmFtZSIse3BhcnNlcjpmdW5jdGlvbih0LGUscixzLGEsbyxsKXt2YXIgaCx1LF8sYyxmLHA9dC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiLGQ9dC5zdHlsZS5jc3NUZXh0O2lmKChhPXMuX2NsYXNzTmFtZVBUPW5ldyBUdCh0LHIsMCwwLGEsMikpLnNldFJhdGlvPUh0LGEucHI9LTExLGk9ITAsYS5iPXAsdT1ydCh0LG4pLF89dC5fZ3NDbGFzc1BUKXtmb3IoYz17fSxmPV8uZGF0YTtmOyljW2YucF09MSxmPWYuX25leHQ7Xy5zZXRSYXRpbygxKX1yZXR1cm4gdC5fZ3NDbGFzc1BUPWEsYS5lPSI9IiE9PWUuY2hhckF0KDEpP2U6cC5yZXBsYWNlKG5ldyBSZWdFeHAoIig/Olxcc3xeKSIrZS5zdWJzdHIoMikrIig/IVtcXHctXSkiKSwiIikrKCIrIj09PWUuY2hhckF0KDApPyIgIitlLnN1YnN0cigyKToiIiksdC5zZXRBdHRyaWJ1dGUoImNsYXNzIixhLmUpLGg9c3QodCx1LHJ0KHQpLGwsYyksdC5zZXRBdHRyaWJ1dGUoImNsYXNzIixwKSxhLmRhdGE9aC5maXJzdE1QVCx0LnN0eWxlLmNzc1RleHQ9ZCxhPWEueGZpcnN0PXMucGFyc2UodCxoLmRpZnMsYSxvKX19KTt2YXIgWnQ9ZnVuY3Rpb24odCl7aWYoKDE9PT10fHwwPT09dCkmJnRoaXMuZGF0YS5fdG90YWxUaW1lPT09dGhpcy5kYXRhLl90b3RhbER1cmF0aW9uJiYiaXNGcm9tU3RhcnQiIT09dGhpcy5kYXRhLmRhdGEpe3ZhciBlLGkscixzLG4sYT10aGlzLnQuc3R5bGUsbz1oLnRyYW5zZm9ybS5wYXJzZTtpZigiYWxsIj09PXRoaXMuZSlhLmNzc1RleHQ9IiIscz0hMDtlbHNlIGZvcihyPShlPXRoaXMuZS5zcGxpdCgiICIpLmpvaW4oIiIpLnNwbGl0KCIsIikpLmxlbmd0aDstLXI+LTE7KWk9ZVtyXSxoW2ldJiYoaFtpXS5wYXJzZT09PW8/cz0hMDppPSJ0cmFuc2Zvcm1PcmlnaW4iPT09aT9EdDpoW2ldLnApLFd0KGEsaSk7cyYmKFd0KGEsQXQpLChuPXRoaXMudC5fZ3NUcmFuc2Zvcm0pJiYobi5zdmcmJih0aGlzLnQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXN2Zy1vcmlnaW4iKSx0aGlzLnQucmVtb3ZlQXR0cmlidXRlKCJ0cmFuc2Zvcm0iKSksZGVsZXRlIHRoaXMudC5fZ3NUcmFuc2Zvcm0pKX19O2ZvcihTdCgiY2xlYXJQcm9wcyIse3BhcnNlcjpmdW5jdGlvbih0LGUscixzLG4pe3JldHVybihuPW5ldyBUdCh0LHIsMCwwLG4sMikpLnNldFJhdGlvPVp0LG4uZT1lLG4ucHI9LTEwLG4uZGF0YT1zLl90d2VlbixpPSEwLG59fSksdT0iYmV6aWVyLHRocm93UHJvcHMscGh5c2ljc1Byb3BzLHBoeXNpY3MyRCIuc3BsaXQoIiwiKSxidD11Lmxlbmd0aDtidC0tOylrdCh1W2J0XSk7KHU9by5wcm90b3R5cGUpLl9maXJzdFBUPXUuX2xhc3RQYXJzZWRUcmFuc2Zvcm09dS5fdHJhbnNmb3JtPW51bGwsdS5fb25Jbml0VHdlZW49ZnVuY3Rpb24odCxlLHMsbCl7aWYoIXQubm9kZVR5cGUpcmV0dXJuITE7dGhpcy5fdGFyZ2V0PWc9dCx0aGlzLl90d2Vlbj1zLHRoaXMuX3ZhcnM9ZSx2PWwsXz1lLmF1dG9Sb3VuZCxpPSExLHI9ZS5zdWZmaXhNYXB8fG8uc3VmZml4TWFwLG49Sih0LCIiKSxhPXRoaXMuX292ZXJ3cml0ZVByb3BzO3ZhciB1LHAsbSx5LFQsdyx4LGIsUCxrPXQuc3R5bGU7aWYoYyYmIiI9PT1rLnpJbmRleCYmKCJhdXRvIiE9PSh1PXR0KHQsInpJbmRleCIsbikpJiYiIiE9PXV8fHRoaXMuX2FkZExhenlTZXQoaywiekluZGV4IiwwKSksInN0cmluZyI9PXR5cGVvZiBlJiYoeT1rLmNzc1RleHQsdT1ydCh0LG4pLGsuY3NzVGV4dD15KyI7IitlLHU9c3QodCx1LHJ0KHQpKS5kaWZzLCFXJiZTLnRlc3QoZSkmJih1Lm9wYWNpdHk9cGFyc2VGbG9hdChSZWdFeHAuJDEpKSxlPXUsay5jc3NUZXh0PXkpLGUuY2xhc3NOYW1lP3RoaXMuX2ZpcnN0UFQ9cD1oLmNsYXNzTmFtZS5wYXJzZSh0LGUuY2xhc3NOYW1lLCJjbGFzc05hbWUiLHRoaXMsbnVsbCxudWxsLGUpOnRoaXMuX2ZpcnN0UFQ9cD10aGlzLnBhcnNlKHQsZSxudWxsKSx0aGlzLl90cmFuc2Zvcm1UeXBlKXtmb3IoUD0zPT09dGhpcy5fdHJhbnNmb3JtVHlwZSxBdD9mJiYoYz0hMCwiIj09PWsuekluZGV4JiYoImF1dG8iIT09KHg9dHQodCwiekluZGV4IixuKSkmJiIiIT09eHx8dGhpcy5fYWRkTGF6eVNldChrLCJ6SW5kZXgiLDApKSxkJiZ0aGlzLl9hZGRMYXp5U2V0KGssIldlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eSIsdGhpcy5fdmFycy5XZWJraXRCYWNrZmFjZVZpc2liaWxpdHl8fChQPyJ2aXNpYmxlIjoiaGlkZGVuIikpKTprLnpvb209MSxtPXA7bSYmbS5fbmV4dDspbT1tLl9uZXh0O2I9bmV3IFR0KHQsInRyYW5zZm9ybSIsMCwwLG51bGwsMiksdGhpcy5fbGlua0NTU1AoYixudWxsLG0pLGIuc2V0UmF0aW89QXQ/R3Q6VnQsYi5kYXRhPXRoaXMuX3RyYW5zZm9ybXx8WXQodCxuLCEwKSxiLnR3ZWVuPXMsYi5wcj0tMSxhLnBvcCgpfWlmKGkpe2Zvcig7cDspe2Zvcih3PXAuX25leHQsbT15O20mJm0ucHI+cC5wcjspbT1tLl9uZXh0OyhwLl9wcmV2PW0/bS5fcHJldjpUKT9wLl9wcmV2Ll9uZXh0PXA6eT1wLChwLl9uZXh0PW0pP20uX3ByZXY9cDpUPXAscD13fXRoaXMuX2ZpcnN0UFQ9eX1yZXR1cm4hMH0sdS5wYXJzZT1mdW5jdGlvbih0LGUsaSxzKXt2YXIgYSxvLGwsdSxjLGYscCxkLG0seSxUPXQuc3R5bGU7Zm9yKGEgaW4gZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mKGY9ZVthXSkmJihmPWYodixnKSksbz1oW2FdKWk9by5wYXJzZSh0LGYsYSx0aGlzLGkscyxlKTtlbHNle2lmKCItLSI9PT1hLnN1YnN0cigwLDIpKXt0aGlzLl90d2Vlbi5fcHJvcExvb2t1cFthXT10aGlzLl9hZGRUd2Vlbi5jYWxsKHRoaXMuX3R3ZWVuLHQuc3R5bGUsInNldFByb3BlcnR5IixKKHQpLmdldFByb3BlcnR5VmFsdWUoYSkrIiIsZisiIixhLCExLGEpO2NvbnRpbnVlfWM9dHQodCxhLG4pKyIiLG09InN0cmluZyI9PXR5cGVvZiBmLCJjb2xvciI9PT1hfHwiZmlsbCI9PT1hfHwic3Ryb2tlIj09PWF8fC0xIT09YS5pbmRleE9mKCJDb2xvciIpfHxtJiZSLnRlc3QoZik/KG18fChmPSgoZj1wdChmKSkubGVuZ3RoPjM/InJnYmEoIjoicmdiKCIpK2Yuam9pbigiLCIpKyIpIiksaT14dChULGEsYyxmLCEwLCJ0cmFuc3BhcmVudCIsaSwwLHMpKTptJiZJLnRlc3QoZik/aT14dChULGEsYyxmLCEwLG51bGwsaSwwLHMpOihwPShsPXBhcnNlRmxvYXQoYykpfHwwPT09bD9jLnN1YnN0cigobCsiIikubGVuZ3RoKToiIiwiIiE9PWMmJiJhdXRvIiE9PWN8fCgid2lkdGgiPT09YXx8ImhlaWdodCI9PT1hPyhsPW90KHQsYSxuKSxwPSJweCIpOiJsZWZ0Ij09PWF8fCJ0b3AiPT09YT8obD1pdCh0LGEsbikscD0icHgiKToobD0ib3BhY2l0eSIhPT1hPzA6MSxwPSIiKSksKHk9bSYmIj0iPT09Zi5jaGFyQXQoMSkpPyh1PXBhcnNlSW50KGYuY2hhckF0KDApKyIxIiwxMCksZj1mLnN1YnN0cigyKSx1Kj1wYXJzZUZsb2F0KGYpLGQ9Zi5yZXBsYWNlKGIsIiIpKToodT1wYXJzZUZsb2F0KGYpLGQ9bT9mLnJlcGxhY2UoYiwiIik6IiIpLCIiPT09ZCYmKGQ9YSBpbiByP3JbYV06cCksZj11fHwwPT09dT8oeT91K2w6dSkrZDplW2FdLHAhPT1kJiYoIiI9PT1kJiYibGluZUhlaWdodCIhPT1hfHwodXx8MD09PXUpJiZsJiYobD1ldCh0LGEsbCxwKSwiJSI9PT1kPyhsLz1ldCh0LGEsMTAwLCIlIikvMTAwLCEwIT09ZS5zdHJpY3RVbml0cyYmKGM9bCsiJSIpKToiZW0iPT09ZHx8InJlbSI9PT1kfHwidnciPT09ZHx8InZoIj09PWQ/bC89ZXQodCxhLDEsZCk6InB4IiE9PWQmJih1PWV0KHQsYSx1LGQpLGQ9InB4IikseSYmKHV8fDA9PT11KSYmKGY9dStsK2QpKSkseSYmKHUrPWwpLCFsJiYwIT09bHx8IXUmJjAhPT11P3ZvaWQgMCE9PVRbYV0mJihmfHxmKyIiIT0iTmFOIiYmbnVsbCE9Zik/KGk9bmV3IFR0KFQsYSx1fHxsfHwwLDAsaSwtMSxhLCExLDAsYyxmKSkueHMwPSJub25lIiE9PWZ8fCJkaXNwbGF5IiE9PWEmJi0xPT09YS5pbmRleE9mKCJTdHlsZSIpP2Y6YzpaKCJpbnZhbGlkICIrYSsiIHR3ZWVuIHZhbHVlOiAiK2VbYV0pOihpPW5ldyBUdChULGEsbCx1LWwsaSwwLGEsITEhPT1fJiYoInB4Ij09PWR8fCJ6SW5kZXgiPT09YSksMCxjLGYpKS54czA9ZCl9cyYmaSYmIWkucGx1Z2luJiYoaS5wbHVnaW49cyl9cmV0dXJuIGl9LHUuc2V0UmF0aW89ZnVuY3Rpb24odCl7dmFyIGUsaSxyLHM9dGhpcy5fZmlyc3RQVDtpZigxIT09dHx8dGhpcy5fdHdlZW4uX3RpbWUhPT10aGlzLl90d2Vlbi5fZHVyYXRpb24mJjAhPT10aGlzLl90d2Vlbi5fdGltZSlpZih0fHx0aGlzLl90d2Vlbi5fdGltZSE9PXRoaXMuX3R3ZWVuLl9kdXJhdGlvbiYmMCE9PXRoaXMuX3R3ZWVuLl90aW1lfHwtMWUtNj09PXRoaXMuX3R3ZWVuLl9yYXdQcmV2VGltZSlmb3IoO3M7KXtpZihlPXMuYyp0K3MucyxzLnI/ZT1zLnIoZSk6ZTwxZS02JiZlPi0xZS02JiYoZT0wKSxzLnR5cGUpaWYoMT09PXMudHlwZSlpZigyPT09KHI9cy5sKSlzLnRbcy5wXT1zLnhzMCtlK3MueHMxK3MueG4xK3MueHMyO2Vsc2UgaWYoMz09PXIpcy50W3MucF09cy54czArZStzLnhzMStzLnhuMStzLnhzMitzLnhuMitzLnhzMztlbHNlIGlmKDQ9PT1yKXMudFtzLnBdPXMueHMwK2Urcy54czErcy54bjErcy54czIrcy54bjIrcy54czMrcy54bjMrcy54czQ7ZWxzZSBpZig1PT09cilzLnRbcy5wXT1zLnhzMCtlK3MueHMxK3MueG4xK3MueHMyK3MueG4yK3MueHMzK3MueG4zK3MueHM0K3MueG40K3MueHM1O2Vsc2V7Zm9yKGk9cy54czArZStzLnhzMSxyPTE7cjxzLmw7cisrKWkrPXNbInhuIityXStzWyJ4cyIrKHIrMSldO3MudFtzLnBdPWl9ZWxzZS0xPT09cy50eXBlP3MudFtzLnBdPXMueHMwOnMuc2V0UmF0aW8mJnMuc2V0UmF0aW8odCk7ZWxzZSBzLnRbcy5wXT1lK3MueHMwO3M9cy5fbmV4dH1lbHNlIGZvcig7czspMiE9PXMudHlwZT9zLnRbcy5wXT1zLmI6cy5zZXRSYXRpbyh0KSxzPXMuX25leHQ7ZWxzZSBmb3IoO3M7KXtpZigyIT09cy50eXBlKWlmKHMuciYmLTEhPT1zLnR5cGUpaWYoZT1zLnIocy5zK3MuYykscy50eXBlKXtpZigxPT09cy50eXBlKXtmb3Iocj1zLmwsaT1zLnhzMCtlK3MueHMxLHI9MTtyPHMubDtyKyspaSs9c1sieG4iK3JdK3NbInhzIisocisxKV07cy50W3MucF09aX19ZWxzZSBzLnRbcy5wXT1lK3MueHMwO2Vsc2Ugcy50W3MucF09cy5lO2Vsc2Ugcy5zZXRSYXRpbyh0KTtzPXMuX25leHR9fSx1Ll9lbmFibGVUcmFuc2Zvcm1zPWZ1bmN0aW9uKHQpe3RoaXMuX3RyYW5zZm9ybT10aGlzLl90cmFuc2Zvcm18fFl0KHRoaXMuX3RhcmdldCxuLCEwKSx0aGlzLl90cmFuc2Zvcm1UeXBlPXRoaXMuX3RyYW5zZm9ybS5zdmcmJlJ0fHwhdCYmMyE9PXRoaXMuX3RyYW5zZm9ybVR5cGU/MjozfTt2YXIgJHQ9ZnVuY3Rpb24odCl7dGhpcy50W3RoaXMucF09dGhpcy5lLHRoaXMuZGF0YS5fbGlua0NTU1AodGhpcyx0aGlzLl9uZXh0LG51bGwsITApfTt1Ll9hZGRMYXp5U2V0PWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLl9maXJzdFBUPW5ldyBUdCh0LGUsMCwwLHRoaXMuX2ZpcnN0UFQsMik7ci5lPWksci5zZXRSYXRpbz0kdCxyLmRhdGE9dGhpc30sdS5fbGlua0NTU1A9ZnVuY3Rpb24odCxlLGkscil7cmV0dXJuIHQmJihlJiYoZS5fcHJldj10KSx0Ll9uZXh0JiYodC5fbmV4dC5fcHJldj10Ll9wcmV2KSx0Ll9wcmV2P3QuX3ByZXYuX25leHQ9dC5fbmV4dDp0aGlzLl9maXJzdFBUPT09dCYmKHRoaXMuX2ZpcnN0UFQ9dC5fbmV4dCxyPSEwKSxpP2kuX25leHQ9dDpyfHxudWxsIT09dGhpcy5fZmlyc3RQVHx8KHRoaXMuX2ZpcnN0UFQ9dCksdC5fbmV4dD1lLHQuX3ByZXY9aSksdH0sdS5fbW9kPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9maXJzdFBUO2U7KSJmdW5jdGlvbiI9PXR5cGVvZiB0W2UucF0mJihlLnI9dFtlLnBdKSxlPWUuX25leHR9LHUuX2tpbGw9ZnVuY3Rpb24oZSl7dmFyIGkscixzLG49ZTtpZihlLmF1dG9BbHBoYXx8ZS5hbHBoYSl7Zm9yKHIgaW4gbj17fSxlKW5bcl09ZVtyXTtuLm9wYWNpdHk9MSxuLmF1dG9BbHBoYSYmKG4udmlzaWJpbGl0eT0xKX1mb3IoZS5jbGFzc05hbWUmJihpPXRoaXMuX2NsYXNzTmFtZVBUKSYmKChzPWkueGZpcnN0KSYmcy5fcHJldj90aGlzLl9saW5rQ1NTUChzLl9wcmV2LGkuX25leHQscy5fcHJldi5fcHJldik6cz09PXRoaXMuX2ZpcnN0UFQmJih0aGlzLl9maXJzdFBUPWkuX25leHQpLGkuX25leHQmJnRoaXMuX2xpbmtDU1NQKGkuX25leHQsaS5fbmV4dC5fbmV4dCxzLl9wcmV2KSx0aGlzLl9jbGFzc05hbWVQVD1udWxsKSxpPXRoaXMuX2ZpcnN0UFQ7aTspaS5wbHVnaW4mJmkucGx1Z2luIT09ciYmaS5wbHVnaW4uX2tpbGwmJihpLnBsdWdpbi5fa2lsbChlKSxyPWkucGx1Z2luKSxpPWkuX25leHQ7cmV0dXJuIHQucHJvdG90eXBlLl9raWxsLmNhbGwodGhpcyxuKX07dmFyIFF0PWZ1bmN0aW9uKHQsZSxpKXt2YXIgcixzLG4sYTtpZih0LnNsaWNlKWZvcihzPXQubGVuZ3RoOy0tcz4tMTspUXQodFtzXSxlLGkpO2Vsc2UgZm9yKHM9KHI9dC5jaGlsZE5vZGVzKS5sZW5ndGg7LS1zPi0xOylhPShuPXJbc10pLnR5cGUsbi5zdHlsZSYmKGUucHVzaChydChuKSksaSYmaS5wdXNoKG4pKSwxIT09YSYmOSE9PWEmJjExIT09YXx8IW4uY2hpbGROb2Rlcy5sZW5ndGh8fFF0KG4sZSxpKX07cmV0dXJuIG8uY2FzY2FkZVRvPWZ1bmN0aW9uKHQsaSxyKXt2YXIgcyxuLGEsbyxsPWUudG8odCxpLHIpLGg9W2xdLHU9W10sXz1bXSxjPVtdLGY9ZS5faW50ZXJuYWxzLnJlc2VydmVkUHJvcHM7Zm9yKHQ9bC5fdGFyZ2V0c3x8bC50YXJnZXQsUXQodCx1LGMpLGwucmVuZGVyKGksITAsITApLFF0KHQsXyksbC5yZW5kZXIoMCwhMCwhMCksbC5fZW5hYmxlZCghMCkscz1jLmxlbmd0aDstLXM+LTE7KWlmKChuPXN0KGNbc10sdVtzXSxfW3NdKSkuZmlyc3RNUFQpe2ZvcihhIGluIG49bi5kaWZzLHIpZlthXSYmKG5bYV09clthXSk7Zm9yKGEgaW4gbz17fSxuKW9bYV09dVtzXVthXTtoLnB1c2goZS5mcm9tVG8oY1tzXSxpLG8sbikpfXJldHVybiBofSx0LmFjdGl2YXRlKFtvXSksb30sITApLGZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24odCl7dmFyIGU9dDwxP01hdGgucG93KDEwLCh0KyIiKS5sZW5ndGgtMik6MTtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuKE1hdGgucm91bmQoaS90KSp0KmV8MCkvZX19LGU9ZnVuY3Rpb24odCxlKXtmb3IoO3Q7KXQuZnx8dC5ibG9ifHwodC5tPWV8fE1hdGgucm91bmQpLHQ9dC5fbmV4dH0saT1zLl9nc0RlZmluZS5wbHVnaW4oe3Byb3BOYW1lOiJyb3VuZFByb3BzIix2ZXJzaW9uOiIxLjcuMCIscHJpb3JpdHk6LTEsQVBJOjIsaW5pdDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMuX3R3ZWVuPWksITB9fSkucHJvdG90eXBlO2kuX29uSW5pdEFsbFByb3BzPWZ1bmN0aW9uKCl7dmFyIGkscixzLG4sYT10aGlzLl90d2VlbixvPWEudmFycy5yb3VuZFByb3BzLGw9e30saD1hLl9wcm9wTG9va3VwLnJvdW5kUHJvcHM7aWYoIm9iamVjdCIhPXR5cGVvZiBvfHxvLnB1c2gpZm9yKCJzdHJpbmciPT10eXBlb2YgbyYmKG89by5zcGxpdCgiLCIpKSxzPW8ubGVuZ3RoOy0tcz4tMTspbFtvW3NdXT1NYXRoLnJvdW5kO2Vsc2UgZm9yKG4gaW4gbylsW25dPXQob1tuXSk7Zm9yKG4gaW4gbClmb3IoaT1hLl9maXJzdFBUO2k7KXI9aS5fbmV4dCxpLnBnP2kudC5fbW9kKGwpOmkubj09PW4mJigyPT09aS5mJiZpLnQ/ZShpLnQuX2ZpcnN0UFQsbFtuXSk6KHRoaXMuX2FkZChpLnQsbixpLnMsaS5jLGxbbl0pLHImJihyLl9wcmV2PWkuX3ByZXYpLGkuX3ByZXY/aS5fcHJldi5fbmV4dD1yOmEuX2ZpcnN0UFQ9PT1pJiYoYS5fZmlyc3RQVD1yKSxpLl9uZXh0PWkuX3ByZXY9bnVsbCxhLl9wcm9wTG9va3VwW25dPWgpKSxpPXI7cmV0dXJuITF9LGkuX2FkZD1mdW5jdGlvbih0LGUsaSxyLHMpe3RoaXMuX2FkZFR3ZWVuKHQsZSxpLGkrcixlLHN8fE1hdGgucm91bmQpLHRoaXMuX292ZXJ3cml0ZVByb3BzLnB1c2goZSl9fSgpLHMuX2dzRGVmaW5lLnBsdWdpbih7cHJvcE5hbWU6ImF0dHIiLEFQSToyLHZlcnNpb246IjAuNi4xIixpbml0OmZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBzLG47aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQuc2V0QXR0cmlidXRlKXJldHVybiExO2ZvcihzIGluIGUpImZ1bmN0aW9uIj09dHlwZW9mKG49ZVtzXSkmJihuPW4ocix0KSksdGhpcy5fYWRkVHdlZW4odCwic2V0QXR0cmlidXRlIix0LmdldEF0dHJpYnV0ZShzKSsiIixuKyIiLHMsITEscyksdGhpcy5fb3ZlcndyaXRlUHJvcHMucHVzaChzKTtyZXR1cm4hMH19KSxzLl9nc0RlZmluZS5wbHVnaW4oe3Byb3BOYW1lOiJkaXJlY3Rpb25hbFJvdGF0aW9uIix2ZXJzaW9uOiIwLjMuMSIsQVBJOjIsaW5pdDpmdW5jdGlvbih0LGUsaSxyKXsib2JqZWN0IiE9dHlwZW9mIGUmJihlPXtyb3RhdGlvbjplfSksdGhpcy5maW5hbHM9e307dmFyIHMsbixhLG8sbCxoLHU9ITA9PT1lLnVzZVJhZGlhbnM/MipNYXRoLlBJOjM2MDtmb3IocyBpbiBlKSJ1c2VSYWRpYW5zIiE9PXMmJigiZnVuY3Rpb24iPT10eXBlb2Yobz1lW3NdKSYmKG89byhyLHQpKSxuPShoPShvKyIiKS5zcGxpdCgiXyIpKVswXSxhPXBhcnNlRmxvYXQoImZ1bmN0aW9uIiE9dHlwZW9mIHRbc10/dFtzXTp0W3MuaW5kZXhPZigic2V0Iil8fCJmdW5jdGlvbiIhPXR5cGVvZiB0WyJnZXQiK3Muc3Vic3RyKDMpXT9zOiJnZXQiK3Muc3Vic3RyKDMpXSgpKSxsPShvPXRoaXMuZmluYWxzW3NdPSJzdHJpbmciPT10eXBlb2YgbiYmIj0iPT09bi5jaGFyQXQoMSk/YStwYXJzZUludChuLmNoYXJBdCgwKSsiMSIsMTApKk51bWJlcihuLnN1YnN0cigyKSk6TnVtYmVyKG4pfHwwKS1hLGgubGVuZ3RoJiYoLTEhPT0obj1oLmpvaW4oIl8iKSkuaW5kZXhPZigic2hvcnQiKSYmKGwlPXUpIT09bCUodS8yKSYmKGw9bDwwP2wrdTpsLXUpLC0xIT09bi5pbmRleE9mKCJfY3ciKSYmbDwwP2w9KGwrOTk5OTk5OTk5OSp1KSV1LShsL3V8MCkqdTotMSE9PW4uaW5kZXhPZigiY2N3IikmJmw+MCYmKGw9KGwtOTk5OTk5OTk5OSp1KSV1LShsL3V8MCkqdSkpLChsPjFlLTZ8fGw8LTFlLTYpJiYodGhpcy5fYWRkVHdlZW4odCxzLGEsYStsLHMpLHRoaXMuX292ZXJ3cml0ZVByb3BzLnB1c2gocykpKTtyZXR1cm4hMH0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlO2lmKDEhPT10KXRoaXMuX3N1cGVyLnNldFJhdGlvLmNhbGwodGhpcyx0KTtlbHNlIGZvcihlPXRoaXMuX2ZpcnN0UFQ7ZTspZS5mP2UudFtlLnBdKHRoaXMuZmluYWxzW2UucF0pOmUudFtlLnBdPXRoaXMuZmluYWxzW2UucF0sZT1lLl9uZXh0fX0pLl9hdXRvQ1NTPSEwLHMuX2dzRGVmaW5lKCJlYXNpbmcuQmFjayIsWyJlYXNpbmcuRWFzZSJdLGZ1bmN0aW9uKHQpe3ZhciBlLGkscixuLGE9cy5HcmVlblNvY2tHbG9iYWxzfHxzLG89YS5jb20uZ3JlZW5zb2NrLGw9MipNYXRoLlBJLGg9TWF0aC5QSS8yLHU9by5fY2xhc3MsXz1mdW5jdGlvbihlLGkpe3ZhciByPXUoImVhc2luZy4iK2UsZnVuY3Rpb24oKXt9LCEwKSxzPXIucHJvdG90eXBlPW5ldyB0O3JldHVybiBzLmNvbnN0cnVjdG9yPXIscy5nZXRSYXRpbz1pLHJ9LGM9dC5yZWdpc3Rlcnx8ZnVuY3Rpb24oKXt9LGY9ZnVuY3Rpb24odCxlLGkscixzKXt2YXIgbj11KCJlYXNpbmcuIit0LHtlYXNlT3V0Om5ldyBlLGVhc2VJbjpuZXcgaSxlYXNlSW5PdXQ6bmV3IHJ9LCEwKTtyZXR1cm4gYyhuLHQpLG59LHA9ZnVuY3Rpb24odCxlLGkpe3RoaXMudD10LHRoaXMudj1lLGkmJih0aGlzLm5leHQ9aSxpLnByZXY9dGhpcyx0aGlzLmM9aS52LWUsdGhpcy5nYXA9aS50LXQpfSxkPWZ1bmN0aW9uKGUsaSl7dmFyIHI9dSgiZWFzaW5nLiIrZSxmdW5jdGlvbih0KXt0aGlzLl9wMT10fHwwPT09dD90OjEuNzAxNTgsdGhpcy5fcDI9MS41MjUqdGhpcy5fcDF9LCEwKSxzPXIucHJvdG90eXBlPW5ldyB0O3JldHVybiBzLmNvbnN0cnVjdG9yPXIscy5nZXRSYXRpbz1pLHMuY29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcih0KX0scn0sbT1mKCJCYWNrIixkKCJCYWNrT3V0IixmdW5jdGlvbih0KXtyZXR1cm4odC09MSkqdCooKHRoaXMuX3AxKzEpKnQrdGhpcy5fcDEpKzF9KSxkKCJCYWNrSW4iLGZ1bmN0aW9uKHQpe3JldHVybiB0KnQqKCh0aGlzLl9wMSsxKSp0LXRoaXMuX3AxKX0pLGQoIkJhY2tJbk91dCIsZnVuY3Rpb24odCl7cmV0dXJuKHQqPTIpPDE/LjUqdCp0KigodGhpcy5fcDIrMSkqdC10aGlzLl9wMik6LjUqKCh0LT0yKSp0KigodGhpcy5fcDIrMSkqdCt0aGlzLl9wMikrMil9KSksZz11KCJlYXNpbmcuU2xvd01vIixmdW5jdGlvbih0LGUsaSl7ZT1lfHwwPT09ZT9lOi43LG51bGw9PXQ/dD0uNzp0PjEmJih0PTEpLHRoaXMuX3A9MSE9PXQ/ZTowLHRoaXMuX3AxPSgxLXQpLzIsdGhpcy5fcDI9dCx0aGlzLl9wMz10aGlzLl9wMSt0aGlzLl9wMix0aGlzLl9jYWxjRW5kPSEwPT09aX0sITApLHY9Zy5wcm90b3R5cGU9bmV3IHQ7cmV0dXJuIHYuY29uc3RydWN0b3I9Zyx2LmdldFJhdGlvPWZ1bmN0aW9uKHQpe3ZhciBlPXQrKC41LXQpKnRoaXMuX3A7cmV0dXJuIHQ8dGhpcy5fcDE/dGhpcy5fY2FsY0VuZD8xLSh0PTEtdC90aGlzLl9wMSkqdDplLSh0PTEtdC90aGlzLl9wMSkqdCp0KnQqZTp0PnRoaXMuX3AzP3RoaXMuX2NhbGNFbmQ/MT09PXQ/MDoxLSh0PSh0LXRoaXMuX3AzKS90aGlzLl9wMSkqdDplKyh0LWUpKih0PSh0LXRoaXMuX3AzKS90aGlzLl9wMSkqdCp0KnQ6dGhpcy5fY2FsY0VuZD8xOmV9LGcuZWFzZT1uZXcgZyguNywuNyksdi5jb25maWc9Zy5jb25maWc9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuZXcgZyh0LGUsaSl9LCh2PShlPXUoImVhc2luZy5TdGVwcGVkRWFzZSIsZnVuY3Rpb24odCxlKXt0PXR8fDEsdGhpcy5fcDE9MS90LHRoaXMuX3AyPXQrKGU/MDoxKSx0aGlzLl9wMz1lPzE6MH0sITApKS5wcm90b3R5cGU9bmV3IHQpLmNvbnN0cnVjdG9yPWUsdi5nZXRSYXRpbz1mdW5jdGlvbih0KXtyZXR1cm4gdDwwP3Q9MDp0Pj0xJiYodD0uOTk5OTk5OTk5KSwoKHRoaXMuX3AyKnR8MCkrdGhpcy5fcDMpKnRoaXMuX3AxfSx2LmNvbmZpZz1lLmNvbmZpZz1mdW5jdGlvbih0LGkpe3JldHVybiBuZXcgZSh0LGkpfSwodj0oaT11KCJlYXNpbmcuRXhwb1NjYWxlRWFzZSIsZnVuY3Rpb24odCxlLGkpe3RoaXMuX3AxPU1hdGgubG9nKGUvdCksdGhpcy5fcDI9ZS10LHRoaXMuX3AzPXQsdGhpcy5fZWFzZT1pfSwhMCkpLnByb3RvdHlwZT1uZXcgdCkuY29uc3RydWN0b3I9aSx2LmdldFJhdGlvPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9lYXNlJiYodD10aGlzLl9lYXNlLmdldFJhdGlvKHQpKSwodGhpcy5fcDMqTWF0aC5leHAodGhpcy5fcDEqdCktdGhpcy5fcDMpL3RoaXMuX3AyfSx2LmNvbmZpZz1pLmNvbmZpZz1mdW5jdGlvbih0LGUscil7cmV0dXJuIG5ldyBpKHQsZSxyKX0sKHY9KHI9dSgiZWFzaW5nLlJvdWdoRWFzZSIsZnVuY3Rpb24oZSl7Zm9yKHZhciBpLHIscyxuLGEsbyxsPShlPWV8fHt9KS50YXBlcnx8Im5vbmUiLGg9W10sdT0wLF89MHwoZS5wb2ludHN8fDIwKSxjPV8sZj0hMSE9PWUucmFuZG9taXplLGQ9ITA9PT1lLmNsYW1wLG09ZS50ZW1wbGF0ZSBpbnN0YW5jZW9mIHQ/ZS50ZW1wbGF0ZTpudWxsLGc9Im51bWJlciI9PXR5cGVvZiBlLnN0cmVuZ3RoPy40KmUuc3RyZW5ndGg6LjQ7LS1jPi0xOylpPWY/TWF0aC5yYW5kb20oKToxL18qYyxyPW0/bS5nZXRSYXRpbyhpKTppLHM9Im5vbmUiPT09bD9nOiJvdXQiPT09bD8obj0xLWkpKm4qZzoiaW4iPT09bD9pKmkqZzppPC41PyhuPTIqaSkqbiouNSpnOihuPTIqKDEtaSkpKm4qLjUqZyxmP3IrPU1hdGgucmFuZG9tKCkqcy0uNSpzOmMlMj9yKz0uNSpzOnItPS41KnMsZCYmKHI+MT9yPTE6cjwwJiYocj0wKSksaFt1KytdPXt4OmkseTpyfTtmb3IoaC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQueC1lLnh9KSxvPW5ldyBwKDEsMSxudWxsKSxjPV87LS1jPi0xOylhPWhbY10sbz1uZXcgcChhLngsYS55LG8pO3RoaXMuX3ByZXY9bmV3IHAoMCwwLDAhPT1vLnQ/bzpvLm5leHQpfSwhMCkpLnByb3RvdHlwZT1uZXcgdCkuY29uc3RydWN0b3I9cix2LmdldFJhdGlvPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3ByZXY7aWYodD5lLnQpe2Zvcig7ZS5uZXh0JiZ0Pj1lLnQ7KWU9ZS5uZXh0O2U9ZS5wcmV2fWVsc2UgZm9yKDtlLnByZXYmJnQ8PWUudDspZT1lLnByZXY7cmV0dXJuIHRoaXMuX3ByZXY9ZSxlLnYrKHQtZS50KS9lLmdhcCplLmN9LHYuY29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcih0KX0sci5lYXNlPW5ldyByLGYoIkJvdW5jZSIsXygiQm91bmNlT3V0IixmdW5jdGlvbih0KXtyZXR1cm4gdDwxLzIuNzU/Ny41NjI1KnQqdDp0PDIvMi43NT83LjU2MjUqKHQtPTEuNS8yLjc1KSp0Ky43NTp0PDIuNS8yLjc1PzcuNTYyNSoodC09Mi4yNS8yLjc1KSp0Ky45Mzc1OjcuNTYyNSoodC09Mi42MjUvMi43NSkqdCsuOTg0Mzc1fSksXygiQm91bmNlSW4iLGZ1bmN0aW9uKHQpe3JldHVybih0PTEtdCk8MS8yLjc1PzEtNy41NjI1KnQqdDp0PDIvMi43NT8xLSg3LjU2MjUqKHQtPTEuNS8yLjc1KSp0Ky43NSk6dDwyLjUvMi43NT8xLSg3LjU2MjUqKHQtPTIuMjUvMi43NSkqdCsuOTM3NSk6MS0oNy41NjI1Kih0LT0yLjYyNS8yLjc1KSp0Ky45ODQzNzUpfSksXygiQm91bmNlSW5PdXQiLGZ1bmN0aW9uKHQpe3ZhciBlPXQ8LjU7cmV0dXJuKHQ9ZT8xLTIqdDoyKnQtMSk8MS8yLjc1P3QqPTcuNTYyNSp0OnQ9dDwyLzIuNzU/Ny41NjI1Kih0LT0xLjUvMi43NSkqdCsuNzU6dDwyLjUvMi43NT83LjU2MjUqKHQtPTIuMjUvMi43NSkqdCsuOTM3NTo3LjU2MjUqKHQtPTIuNjI1LzIuNzUpKnQrLjk4NDM3NSxlPy41KigxLXQpOi41KnQrLjV9KSksZigiQ2lyYyIsXygiQ2lyY091dCIsZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydCgxLSh0LT0xKSp0KX0pLF8oIkNpcmNJbiIsZnVuY3Rpb24odCl7cmV0dXJuLShNYXRoLnNxcnQoMS10KnQpLTEpfSksXygiQ2lyY0luT3V0IixmdW5jdGlvbih0KXtyZXR1cm4odCo9Mik8MT8tLjUqKE1hdGguc3FydCgxLXQqdCktMSk6LjUqKE1hdGguc3FydCgxLSh0LT0yKSp0KSsxKX0pKSxmKCJFbGFzdGljIiwobj1mdW5jdGlvbihlLGkscil7dmFyIHM9dSgiZWFzaW5nLiIrZSxmdW5jdGlvbih0LGUpe3RoaXMuX3AxPXQ+PTE/dDoxLHRoaXMuX3AyPShlfHxyKS8odDwxP3Q6MSksdGhpcy5fcDM9dGhpcy5fcDIvbCooTWF0aC5hc2luKDEvdGhpcy5fcDEpfHwwKSx0aGlzLl9wMj1sL3RoaXMuX3AyfSwhMCksbj1zLnByb3RvdHlwZT1uZXcgdDtyZXR1cm4gbi5jb25zdHJ1Y3Rvcj1zLG4uZ2V0UmF0aW89aSxuLmNvbmZpZz1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgcyh0LGUpfSxzfSkoIkVsYXN0aWNPdXQiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wMSpNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigodC10aGlzLl9wMykqdGhpcy5fcDIpKzF9LC4zKSxuKCJFbGFzdGljSW4iLGZ1bmN0aW9uKHQpe3JldHVybi10aGlzLl9wMSpNYXRoLnBvdygyLDEwKih0LT0xKSkqTWF0aC5zaW4oKHQtdGhpcy5fcDMpKnRoaXMuX3AyKX0sLjMpLG4oIkVsYXN0aWNJbk91dCIsZnVuY3Rpb24odCl7cmV0dXJuKHQqPTIpPDE/dGhpcy5fcDEqTWF0aC5wb3coMiwxMCoodC09MSkpKk1hdGguc2luKCh0LXRoaXMuX3AzKSp0aGlzLl9wMikqLS41OnRoaXMuX3AxKk1hdGgucG93KDIsLTEwKih0LT0xKSkqTWF0aC5zaW4oKHQtdGhpcy5fcDMpKnRoaXMuX3AyKSouNSsxfSwuNDUpKSxmKCJFeHBvIixfKCJFeHBvT3V0IixmdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnBvdygyLC0xMCp0KX0pLF8oIkV4cG9JbiIsZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDIsMTAqKHQtMSkpLS4wMDF9KSxfKCJFeHBvSW5PdXQiLGZ1bmN0aW9uKHQpe3JldHVybih0Kj0yKTwxPy41Kk1hdGgucG93KDIsMTAqKHQtMSkpOi41KigyLU1hdGgucG93KDIsLTEwKih0LTEpKSl9KSksZigiU2luZSIsXygiU2luZU91dCIsZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc2luKHQqaCl9KSxfKCJTaW5lSW4iLGZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguY29zKHQqaCl9KSxfKCJTaW5lSW5PdXQiLGZ1bmN0aW9uKHQpe3JldHVybi0uNSooTWF0aC5jb3MoTWF0aC5QSSp0KS0xKX0pKSx1KCJlYXNpbmcuRWFzZUxvb2t1cCIse2ZpbmQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHQubWFwW2VdfX0sITApLGMoYS5TbG93TW8sIlNsb3dNbyIsImVhc2UsIiksYyhyLCJSb3VnaEVhc2UiLCJlYXNlLCIpLGMoZSwiU3RlcHBlZEVhc2UiLCJlYXNlLCIpLG19LCEwKX0pLHMuX2dzRGVmaW5lJiZzLl9nc1F1ZXVlLnBvcCgpKCksZnVuY3Rpb24oaSxzKXsidXNlIHN0cmljdCI7dmFyIG49e30sYT1pLmRvY3VtZW50LG89aS5HcmVlblNvY2tHbG9iYWxzPWkuR3JlZW5Tb2NrR2xvYmFsc3x8aSxsPW8uVHdlZW5NYXg7aWYobClyZXR1cm4gdm9pZCAwIT09dCYmdC5leHBvcnRzJiYodC5leHBvcnRzPWwpLGw7dmFyIGgsdSxfLGMsZixwPWZ1bmN0aW9uKHQpe3ZhciBlLGk9dC5zcGxpdCgiLiIpLHI9bztmb3IoZT0wO2U8aS5sZW5ndGg7ZSsrKXJbaVtlXV09cj1yW2lbZV1dfHx7fTtyZXR1cm4gcn0sZD1wKCJjb20uZ3JlZW5zb2NrIiksbT1mdW5jdGlvbih0KXt2YXIgZSxpPVtdLHI9dC5sZW5ndGg7Zm9yKGU9MDtlIT09cjtpLnB1c2godFtlKytdKSk7cmV0dXJuIGl9LGc9ZnVuY3Rpb24oKXt9LHY9ZnVuY3Rpb24oKXt2YXIgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGU9dC5jYWxsKFtdKTtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuIG51bGwhPWkmJihpIGluc3RhbmNlb2YgQXJyYXl8fCJvYmplY3QiPT10eXBlb2YgaSYmISFpLnB1c2gmJnQuY2FsbChpKT09PWUpfX0oKSx5PXt9LFQ9ZnVuY3Rpb24oaSxzLGEsbCl7dGhpcy5zYz15W2ldP3lbaV0uc2M6W10seVtpXT10aGlzLHRoaXMuZ3NDbGFzcz1udWxsLHRoaXMuZnVuYz1hO3ZhciBoPVtdO3RoaXMuY2hlY2s9ZnVuY3Rpb24odSl7Zm9yKHZhciBfLGMsZixkLG09cy5sZW5ndGgsZz1tOy0tbT4tMTspKF89eVtzW21dXXx8bmV3IFQoc1ttXSxbXSkpLmdzQ2xhc3M/KGhbbV09Xy5nc0NsYXNzLGctLSk6dSYmXy5zYy5wdXNoKHRoaXMpO2lmKDA9PT1nJiZhKXtpZihmPShjPSgiY29tLmdyZWVuc29jay4iK2kpLnNwbGl0KCIuIikpLnBvcCgpLGQ9cChjLmpvaW4oIi4iKSlbZl09dGhpcy5nc0NsYXNzPWEuYXBwbHkoYSxoKSxsKWlmKG9bZl09bltmXT1kLHZvaWQgMCE9PXQmJnQuZXhwb3J0cylpZigiVHdlZW5NYXgiPT09aSlmb3IobSBpbiB0LmV4cG9ydHM9bi5Ud2Vlbk1heD1kLG4pZFttXT1uW21dO2Vsc2Ugbi5Ud2Vlbk1heCYmKG4uVHdlZW5NYXhbZl09ZCk7ZWxzZSB2b2lkIDA9PT0ocj1mdW5jdGlvbigpe3JldHVybiBkfS5hcHBseShlLFtdKSl8fCh0LmV4cG9ydHM9cik7Zm9yKG09MDttPHRoaXMuc2MubGVuZ3RoO20rKyl0aGlzLnNjW21dLmNoZWNrKCl9fSx0aGlzLmNoZWNrKCEwKX0sdz1pLl9nc0RlZmluZT1mdW5jdGlvbih0LGUsaSxyKXtyZXR1cm4gbmV3IFQodCxlLGkscil9LHg9ZC5fY2xhc3M9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBlPWV8fGZ1bmN0aW9uKCl7fSx3KHQsW10sZnVuY3Rpb24oKXtyZXR1cm4gZX0saSksZX07dy5nbG9iYWxzPW87dmFyIGI9WzAsMCwxLDFdLFA9eCgiZWFzaW5nLkVhc2UiLGZ1bmN0aW9uKHQsZSxpLHIpe3RoaXMuX2Z1bmM9dCx0aGlzLl90eXBlPWl8fDAsdGhpcy5fcG93ZXI9cnx8MCx0aGlzLl9wYXJhbXM9ZT9iLmNvbmNhdChlKTpifSwhMCksUz1QLm1hcD17fSxrPVAucmVnaXN0ZXI9ZnVuY3Rpb24odCxlLGkscil7Zm9yKHZhciBzLG4sYSxvLGw9ZS5zcGxpdCgiLCIpLGg9bC5sZW5ndGgsdT0oaXx8ImVhc2VJbixlYXNlT3V0LGVhc2VJbk91dCIpLnNwbGl0KCIsIik7LS1oPi0xOylmb3Iobj1sW2hdLHM9cj94KCJlYXNpbmcuIituLG51bGwsITApOmQuZWFzaW5nW25dfHx7fSxhPXUubGVuZ3RoOy0tYT4tMTspbz11W2FdLFNbbisiLiIrb109U1tvK25dPXNbb109dC5nZXRSYXRpbz90OnRbb118fG5ldyB0fTtmb3IoKF89UC5wcm90b3R5cGUpLl9jYWxjRW5kPSExLF8uZ2V0UmF0aW89ZnVuY3Rpb24odCl7aWYodGhpcy5fZnVuYylyZXR1cm4gdGhpcy5fcGFyYW1zWzBdPXQsdGhpcy5fZnVuYy5hcHBseShudWxsLHRoaXMuX3BhcmFtcyk7dmFyIGU9dGhpcy5fdHlwZSxpPXRoaXMuX3Bvd2VyLHI9MT09PWU/MS10OjI9PT1lP3Q6dDwuNT8yKnQ6MiooMS10KTtyZXR1cm4gMT09PWk/cio9cjoyPT09aT9yKj1yKnI6Mz09PWk/cio9cipyKnI6ND09PWkmJihyKj1yKnIqcipyKSwxPT09ZT8xLXI6Mj09PWU/cjp0PC41P3IvMjoxLXIvMn0sdT0oaD1bIkxpbmVhciIsIlF1YWQiLCJDdWJpYyIsIlF1YXJ0IiwiUXVpbnQsU3Ryb25nIl0pLmxlbmd0aDstLXU+LTE7KV89aFt1XSsiLFBvd2VyIit1LGsobmV3IFAobnVsbCxudWxsLDEsdSksXywiZWFzZU91dCIsITApLGsobmV3IFAobnVsbCxudWxsLDIsdSksXywiZWFzZUluIisoMD09PXU/IixlYXNlTm9uZSI6IiIpKSxrKG5ldyBQKG51bGwsbnVsbCwzLHUpLF8sImVhc2VJbk91dCIpO1MubGluZWFyPWQuZWFzaW5nLkxpbmVhci5lYXNlSW4sUy5zd2luZz1kLmVhc2luZy5RdWFkLmVhc2VJbk91dDt2YXIgUj14KCJldmVudHMuRXZlbnREaXNwYXRjaGVyIixmdW5jdGlvbih0KXt0aGlzLl9saXN0ZW5lcnM9e30sdGhpcy5fZXZlbnRUYXJnZXQ9dHx8dGhpc30pOyhfPVIucHJvdG90eXBlKS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSxpLHIscyl7cz1zfHwwO3ZhciBuLGEsbz10aGlzLl9saXN0ZW5lcnNbdF0sbD0wO2Zvcih0aGlzIT09Y3x8Znx8Yy53YWtlKCksbnVsbD09byYmKHRoaXMuX2xpc3RlbmVyc1t0XT1vPVtdKSxhPW8ubGVuZ3RoOy0tYT4tMTspKG49b1thXSkuYz09PWUmJm4ucz09PWk/by5zcGxpY2UoYSwxKTowPT09bCYmbi5wcjxzJiYobD1hKzEpO28uc3BsaWNlKGwsMCx7YzplLHM6aSx1cDpyLHByOnN9KX0sXy5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIGkscj10aGlzLl9saXN0ZW5lcnNbdF07aWYocilmb3IoaT1yLmxlbmd0aDstLWk+LTE7KWlmKHJbaV0uYz09PWUpcmV0dXJuIHZvaWQgci5zcGxpY2UoaSwxKX0sXy5kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKHQpe3ZhciBlLGkscixzPXRoaXMuX2xpc3RlbmVyc1t0XTtpZihzKWZvcigoZT1zLmxlbmd0aCk+MSYmKHM9cy5zbGljZSgwKSksaT10aGlzLl9ldmVudFRhcmdldDstLWU+LTE7KShyPXNbZV0pJiYoci51cD9yLmMuY2FsbChyLnN8fGkse3R5cGU6dCx0YXJnZXQ6aX0pOnIuYy5jYWxsKHIuc3x8aSkpfTt2YXIgTz1pLnJlcXVlc3RBbmltYXRpb25GcmFtZSxBPWkuY2FuY2VsQW5pbWF0aW9uRnJhbWUsQz1EYXRlLm5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sRD1DKCk7Zm9yKHU9KGg9WyJtcyIsIm1veiIsIndlYmtpdCIsIm8iXSkubGVuZ3RoOy0tdT4tMSYmIU87KU89aVtoW3VdKyJSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiXSxBPWlbaFt1XSsiQ2FuY2VsQW5pbWF0aW9uRnJhbWUiXXx8aVtoW3VdKyJDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiXTt4KCJUaWNrZXIiLGZ1bmN0aW9uKHQsZSl7dmFyIGkscixzLG4sbyxsPXRoaXMsaD1DKCksdT0hKCExPT09ZXx8IU8pJiYiYXV0byIsXz01MDAscD0zMyxkPWZ1bmN0aW9uKHQpe3ZhciBlLGEsdT1DKCktRDt1Pl8mJihoKz11LXApLEQrPXUsbC50aW1lPShELWgpLzFlMyxlPWwudGltZS1vLCghaXx8ZT4wfHwhMD09PXQpJiYobC5mcmFtZSsrLG8rPWUrKGU+PW4/LjAwNDpuLWUpLGE9ITApLCEwIT09dCYmKHM9cihkKSksYSYmbC5kaXNwYXRjaEV2ZW50KCJ0aWNrIil9O1IuY2FsbChsKSxsLnRpbWU9bC5mcmFtZT0wLGwudGljaz1mdW5jdGlvbigpe2QoITApfSxsLmxhZ1Ntb290aGluZz1mdW5jdGlvbih0LGUpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBfPDFlMTA7Xz10fHwxZTEwLHA9TWF0aC5taW4oZSxfLDApfSxsLnNsZWVwPWZ1bmN0aW9uKCl7bnVsbCE9cyYmKHUmJkE/QShzKTpjbGVhclRpbWVvdXQocykscj1nLHM9bnVsbCxsPT09YyYmKGY9ITEpKX0sbC53YWtlPWZ1bmN0aW9uKHQpe251bGwhPT1zP2wuc2xlZXAoKTp0P2grPS1EKyhEPUMoKSk6bC5mcmFtZT4xMCYmKEQ9QygpLV8rNSkscj0wPT09aT9nOnUmJk8/TzpmdW5jdGlvbih0KXtyZXR1cm4gc2V0VGltZW91dCh0LDFlMyooby1sLnRpbWUpKzF8MCl9LGw9PT1jJiYoZj0hMCksZCgyKX0sbC5mcHM9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGk7bj0xLygoaT10KXx8NjApLG89dGhpcy50aW1lK24sbC53YWtlKCl9LGwudXNlUkFGPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB1O2wuc2xlZXAoKSx1PXQsbC5mcHMoaSl9LGwuZnBzKHQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXsiYXV0byI9PT11JiZsLmZyYW1lPDUmJiJoaWRkZW4iIT09KGF8fHt9KS52aXNpYmlsaXR5U3RhdGUmJmwudXNlUkFGKCExKX0sMTUwMCl9KSwoXz1kLlRpY2tlci5wcm90b3R5cGU9bmV3IGQuZXZlbnRzLkV2ZW50RGlzcGF0Y2hlcikuY29uc3RydWN0b3I9ZC5UaWNrZXI7dmFyIE09eCgiY29yZS5BbmltYXRpb24iLGZ1bmN0aW9uKHQsZSl7aWYodGhpcy52YXJzPWU9ZXx8e30sdGhpcy5fZHVyYXRpb249dGhpcy5fdG90YWxEdXJhdGlvbj10fHwwLHRoaXMuX2RlbGF5PU51bWJlcihlLmRlbGF5KXx8MCx0aGlzLl90aW1lU2NhbGU9MSx0aGlzLl9hY3RpdmU9ITA9PT1lLmltbWVkaWF0ZVJlbmRlcix0aGlzLmRhdGE9ZS5kYXRhLHRoaXMuX3JldmVyc2VkPSEwPT09ZS5yZXZlcnNlZCxRKXtmfHxjLndha2UoKTt2YXIgaT10aGlzLnZhcnMudXNlRnJhbWVzPyQ6UTtpLmFkZCh0aGlzLGkuX3RpbWUpLHRoaXMudmFycy5wYXVzZWQmJnRoaXMucGF1c2VkKCEwKX19KTtjPU0udGlja2VyPW5ldyBkLlRpY2tlciwoXz1NLnByb3RvdHlwZSkuX2RpcnR5PV8uX2djPV8uX2luaXR0ZWQ9Xy5fcGF1c2VkPSExLF8uX3RvdGFsVGltZT1fLl90aW1lPTAsXy5fcmF3UHJldlRpbWU9LTEsXy5fbmV4dD1fLl9sYXN0PV8uX29uVXBkYXRlPV8uX3RpbWVsaW5lPV8udGltZWxpbmU9bnVsbCxfLl9wYXVzZWQ9ITE7dmFyIEU9ZnVuY3Rpb24oKXtmJiZDKCktRD4yZTMmJigiaGlkZGVuIiE9PShhfHx7fSkudmlzaWJpbGl0eVN0YXRlfHwhYy5sYWdTbW9vdGhpbmcoKSkmJmMud2FrZSgpO3ZhciB0PXNldFRpbWVvdXQoRSwyZTMpO3QudW5yZWYmJnQudW5yZWYoKX07RSgpLF8ucGxheT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZ0aGlzLnNlZWsodCxlKSx0aGlzLnJldmVyc2VkKCExKS5wYXVzZWQoITEpfSxfLnBhdXNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJnRoaXMuc2Vlayh0LGUpLHRoaXMucGF1c2VkKCEwKX0sXy5yZXN1bWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmdGhpcy5zZWVrKHQsZSksdGhpcy5wYXVzZWQoITEpfSxfLnNlZWs9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy50b3RhbFRpbWUoTnVtYmVyKHQpLCExIT09ZSl9LF8ucmVzdGFydD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJldmVyc2VkKCExKS5wYXVzZWQoITEpLnRvdGFsVGltZSh0Py10aGlzLl9kZWxheTowLCExIT09ZSwhMCl9LF8ucmV2ZXJzZT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZ0aGlzLnNlZWsodHx8dGhpcy50b3RhbER1cmF0aW9uKCksZSksdGhpcy5yZXZlcnNlZCghMCkucGF1c2VkKCExKX0sXy5yZW5kZXI9ZnVuY3Rpb24odCxlLGkpe30sXy5pbnZhbGlkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpbWU9dGhpcy5fdG90YWxUaW1lPTAsdGhpcy5faW5pdHRlZD10aGlzLl9nYz0hMSx0aGlzLl9yYXdQcmV2VGltZT0tMSwhdGhpcy5fZ2MmJnRoaXMudGltZWxpbmV8fHRoaXMuX2VuYWJsZWQoITApLHRoaXN9LF8uaXNBY3RpdmU9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuX3RpbWVsaW5lLGk9dGhpcy5fc3RhcnRUaW1lO3JldHVybiFlfHwhdGhpcy5fZ2MmJiF0aGlzLl9wYXVzZWQmJmUuaXNBY3RpdmUoKSYmKHQ9ZS5yYXdUaW1lKCEwKSk+PWkmJnQ8aSt0aGlzLnRvdGFsRHVyYXRpb24oKS90aGlzLl90aW1lU2NhbGUtMWUtN30sXy5fZW5hYmxlZD1mdW5jdGlvbih0LGUpe3JldHVybiBmfHxjLndha2UoKSx0aGlzLl9nYz0hdCx0aGlzLl9hY3RpdmU9dGhpcy5pc0FjdGl2ZSgpLCEwIT09ZSYmKHQmJiF0aGlzLnRpbWVsaW5lP3RoaXMuX3RpbWVsaW5lLmFkZCh0aGlzLHRoaXMuX3N0YXJ0VGltZS10aGlzLl9kZWxheSk6IXQmJnRoaXMudGltZWxpbmUmJnRoaXMuX3RpbWVsaW5lLl9yZW1vdmUodGhpcywhMCkpLCExfSxfLl9raWxsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2VuYWJsZWQoITEsITEpfSxfLmtpbGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fa2lsbCh0LGUpLHRoaXN9LF8uX3VuY2FjaGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQ/dGhpczp0aGlzLnRpbWVsaW5lO2U7KWUuX2RpcnR5PSEwLGU9ZS50aW1lbGluZTtyZXR1cm4gdGhpc30sXy5fc3dhcFNlbGZJblBhcmFtcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGgsaT10LmNvbmNhdCgpOy0tZT4tMTspIntzZWxmfSI9PT10W2VdJiYoaVtlXT10aGlzKTtyZXR1cm4gaX0sXy5fY2FsbGJhY2s9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52YXJzLGk9ZVt0XSxyPWVbdCsiUGFyYW1zIl0scz1lW3QrIlNjb3BlIl18fGUuY2FsbGJhY2tTY29wZXx8dGhpcztzd2l0Y2gocj9yLmxlbmd0aDowKXtjYXNlIDA6aS5jYWxsKHMpO2JyZWFrO2Nhc2UgMTppLmNhbGwocyxyWzBdKTticmVhaztjYXNlIDI6aS5jYWxsKHMsclswXSxyWzFdKTticmVhaztkZWZhdWx0OmkuYXBwbHkocyxyKX19LF8uZXZlbnRDYWxsYmFjaz1mdW5jdGlvbih0LGUsaSxyKXtpZigib24iPT09KHR8fCIiKS5zdWJzdHIoMCwyKSl7dmFyIHM9dGhpcy52YXJzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBzW3RdO251bGw9PWU/ZGVsZXRlIHNbdF06KHNbdF09ZSxzW3QrIlBhcmFtcyJdPXYoaSkmJi0xIT09aS5qb2luKCIiKS5pbmRleE9mKCJ7c2VsZn0iKT90aGlzLl9zd2FwU2VsZkluUGFyYW1zKGkpOmksc1t0KyJTY29wZSJdPXIpLCJvblVwZGF0ZSI9PT10JiYodGhpcy5fb25VcGRhdGU9ZSl9cmV0dXJuIHRoaXN9LF8uZGVsYXk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3RpbWVsaW5lLnNtb290aENoaWxkVGltaW5nJiZ0aGlzLnN0YXJ0VGltZSh0aGlzLl9zdGFydFRpbWUrdC10aGlzLl9kZWxheSksdGhpcy5fZGVsYXk9dCx0aGlzKTp0aGlzLl9kZWxheX0sXy5kdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5fZHVyYXRpb249dGhpcy5fdG90YWxEdXJhdGlvbj10LHRoaXMuX3VuY2FjaGUoITApLHRoaXMuX3RpbWVsaW5lLnNtb290aENoaWxkVGltaW5nJiZ0aGlzLl90aW1lPjAmJnRoaXMuX3RpbWU8dGhpcy5fZHVyYXRpb24mJjAhPT10JiZ0aGlzLnRvdGFsVGltZSh0aGlzLl90b3RhbFRpbWUqKHQvdGhpcy5fZHVyYXRpb24pLCEwKSx0aGlzKToodGhpcy5fZGlydHk9ITEsdGhpcy5fZHVyYXRpb24pfSxfLnRvdGFsRHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RpcnR5PSExLGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5kdXJhdGlvbih0KTp0aGlzLl90b3RhbER1cmF0aW9ufSxfLnRpbWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5fZGlydHkmJnRoaXMudG90YWxEdXJhdGlvbigpLHRoaXMudG90YWxUaW1lKHQ+dGhpcy5fZHVyYXRpb24/dGhpcy5fZHVyYXRpb246dCxlKSk6dGhpcy5fdGltZX0sXy50b3RhbFRpbWU9ZnVuY3Rpb24odCxlLGkpe2lmKGZ8fGMud2FrZSgpLCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl90b3RhbFRpbWU7aWYodGhpcy5fdGltZWxpbmUpe2lmKHQ8MCYmIWkmJih0Kz10aGlzLnRvdGFsRHVyYXRpb24oKSksdGhpcy5fdGltZWxpbmUuc21vb3RoQ2hpbGRUaW1pbmcpe3RoaXMuX2RpcnR5JiZ0aGlzLnRvdGFsRHVyYXRpb24oKTt2YXIgcj10aGlzLl90b3RhbER1cmF0aW9uLHM9dGhpcy5fdGltZWxpbmU7aWYodD5yJiYhaSYmKHQ9ciksdGhpcy5fc3RhcnRUaW1lPSh0aGlzLl9wYXVzZWQ/dGhpcy5fcGF1c2VUaW1lOnMuX3RpbWUpLSh0aGlzLl9yZXZlcnNlZD9yLXQ6dCkvdGhpcy5fdGltZVNjYWxlLHMuX2RpcnR5fHx0aGlzLl91bmNhY2hlKCExKSxzLl90aW1lbGluZSlmb3IoO3MuX3RpbWVsaW5lOylzLl90aW1lbGluZS5fdGltZSE9PShzLl9zdGFydFRpbWUrcy5fdG90YWxUaW1lKS9zLl90aW1lU2NhbGUmJnMudG90YWxUaW1lKHMuX3RvdGFsVGltZSwhMCkscz1zLl90aW1lbGluZX10aGlzLl9nYyYmdGhpcy5fZW5hYmxlZCghMCwhMSksdGhpcy5fdG90YWxUaW1lPT09dCYmMCE9PXRoaXMuX2R1cmF0aW9ufHwoTC5sZW5ndGgmJkooKSx0aGlzLnJlbmRlcih0LGUsITEpLEwubGVuZ3RoJiZKKCkpfXJldHVybiB0aGlzfSxfLnByb2dyZXNzPV8udG90YWxQcm9ncmVzcz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZHVyYXRpb24oKTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnRvdGFsVGltZShpKnQsZSk6aT90aGlzLl90aW1lL2k6dGhpcy5yYXRpb30sXy5zdGFydFRpbWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQhPT10aGlzLl9zdGFydFRpbWUmJih0aGlzLl9zdGFydFRpbWU9dCx0aGlzLnRpbWVsaW5lJiZ0aGlzLnRpbWVsaW5lLl9zb3J0Q2hpbGRyZW4mJnRoaXMudGltZWxpbmUuYWRkKHRoaXMsdC10aGlzLl9kZWxheSkpLHRoaXMpOnRoaXMuX3N0YXJ0VGltZX0sXy5lbmRUaW1lPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zdGFydFRpbWUrKDAhPXQ/dGhpcy50b3RhbER1cmF0aW9uKCk6dGhpcy5kdXJhdGlvbigpKS90aGlzLl90aW1lU2NhbGV9LF8udGltZVNjYWxlPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl90aW1lU2NhbGU7dmFyIGUsaTtmb3IodD10fHwxZS0xMCx0aGlzLl90aW1lbGluZSYmdGhpcy5fdGltZWxpbmUuc21vb3RoQ2hpbGRUaW1pbmcmJihpPShlPXRoaXMuX3BhdXNlVGltZSl8fDA9PT1lP2U6dGhpcy5fdGltZWxpbmUudG90YWxUaW1lKCksdGhpcy5fc3RhcnRUaW1lPWktKGktdGhpcy5fc3RhcnRUaW1lKSp0aGlzLl90aW1lU2NhbGUvdCksdGhpcy5fdGltZVNjYWxlPXQsaT10aGlzLnRpbWVsaW5lO2kmJmkudGltZWxpbmU7KWkuX2RpcnR5PSEwLGkudG90YWxEdXJhdGlvbigpLGk9aS50aW1lbGluZTtyZXR1cm4gdGhpc30sXy5yZXZlcnNlZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odCE9dGhpcy5fcmV2ZXJzZWQmJih0aGlzLl9yZXZlcnNlZD10LHRoaXMudG90YWxUaW1lKHRoaXMuX3RpbWVsaW5lJiYhdGhpcy5fdGltZWxpbmUuc21vb3RoQ2hpbGRUaW1pbmc/dGhpcy50b3RhbER1cmF0aW9uKCktdGhpcy5fdG90YWxUaW1lOnRoaXMuX3RvdGFsVGltZSwhMCkpLHRoaXMpOnRoaXMuX3JldmVyc2VkfSxfLnBhdXNlZD1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fcGF1c2VkO3ZhciBlLGkscj10aGlzLl90aW1lbGluZTtyZXR1cm4gdCE9dGhpcy5fcGF1c2VkJiZyJiYoZnx8dHx8Yy53YWtlKCksaT0oZT1yLnJhd1RpbWUoKSktdGhpcy5fcGF1c2VUaW1lLCF0JiZyLnNtb290aENoaWxkVGltaW5nJiYodGhpcy5fc3RhcnRUaW1lKz1pLHRoaXMuX3VuY2FjaGUoITEpKSx0aGlzLl9wYXVzZVRpbWU9dD9lOm51bGwsdGhpcy5fcGF1c2VkPXQsdGhpcy5fYWN0aXZlPXRoaXMuaXNBY3RpdmUoKSwhdCYmMCE9PWkmJnRoaXMuX2luaXR0ZWQmJnRoaXMuZHVyYXRpb24oKSYmKGU9ci5zbW9vdGhDaGlsZFRpbWluZz90aGlzLl90b3RhbFRpbWU6KGUtdGhpcy5fc3RhcnRUaW1lKS90aGlzLl90aW1lU2NhbGUsdGhpcy5yZW5kZXIoZSxlPT09dGhpcy5fdG90YWxUaW1lLCEwKSkpLHRoaXMuX2djJiYhdCYmdGhpcy5fZW5hYmxlZCghMCwhMSksdGhpc307dmFyIEY9eCgiY29yZS5TaW1wbGVUaW1lbGluZSIsZnVuY3Rpb24odCl7TS5jYWxsKHRoaXMsMCx0KSx0aGlzLmF1dG9SZW1vdmVDaGlsZHJlbj10aGlzLnNtb290aENoaWxkVGltaW5nPSEwfSk7KF89Ri5wcm90b3R5cGU9bmV3IE0pLmNvbnN0cnVjdG9yPUYsXy5raWxsKCkuX2djPSExLF8uX2ZpcnN0PV8uX2xhc3Q9Xy5fcmVjZW50PW51bGwsXy5fc29ydENoaWxkcmVuPSExLF8uYWRkPV8uaW5zZXJ0PWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBzLG47aWYodC5fc3RhcnRUaW1lPU51bWJlcihlfHwwKSt0Ll9kZWxheSx0Ll9wYXVzZWQmJnRoaXMhPT10Ll90aW1lbGluZSYmKHQuX3BhdXNlVGltZT10aGlzLnJhd1RpbWUoKS0odC5fdGltZWxpbmUucmF3VGltZSgpLXQuX3BhdXNlVGltZSkpLHQudGltZWxpbmUmJnQudGltZWxpbmUuX3JlbW92ZSh0LCEwKSx0LnRpbWVsaW5lPXQuX3RpbWVsaW5lPXRoaXMsdC5fZ2MmJnQuX2VuYWJsZWQoITAsITApLHM9dGhpcy5fbGFzdCx0aGlzLl9zb3J0Q2hpbGRyZW4pZm9yKG49dC5fc3RhcnRUaW1lO3MmJnMuX3N0YXJ0VGltZT5uOylzPXMuX3ByZXY7cmV0dXJuIHM/KHQuX25leHQ9cy5fbmV4dCxzLl9uZXh0PXQpOih0Ll9uZXh0PXRoaXMuX2ZpcnN0LHRoaXMuX2ZpcnN0PXQpLHQuX25leHQ/dC5fbmV4dC5fcHJldj10OnRoaXMuX2xhc3Q9dCx0Ll9wcmV2PXMsdGhpcy5fcmVjZW50PXQsdGhpcy5fdGltZWxpbmUmJnRoaXMuX3VuY2FjaGUoITApLHRoaXN9LF8uX3JlbW92ZT1mdW5jdGlvbih0LGUpe3JldHVybiB0LnRpbWVsaW5lPT09dGhpcyYmKGV8fHQuX2VuYWJsZWQoITEsITApLHQuX3ByZXY/dC5fcHJldi5fbmV4dD10Ll9uZXh0OnRoaXMuX2ZpcnN0PT09dCYmKHRoaXMuX2ZpcnN0PXQuX25leHQpLHQuX25leHQ/dC5fbmV4dC5fcHJldj10Ll9wcmV2OnRoaXMuX2xhc3Q9PT10JiYodGhpcy5fbGFzdD10Ll9wcmV2KSx0Ll9uZXh0PXQuX3ByZXY9dC50aW1lbGluZT1udWxsLHQ9PT10aGlzLl9yZWNlbnQmJih0aGlzLl9yZWNlbnQ9dGhpcy5fbGFzdCksdGhpcy5fdGltZWxpbmUmJnRoaXMuX3VuY2FjaGUoITApKSx0aGlzfSxfLnJlbmRlcj1mdW5jdGlvbih0LGUsaSl7dmFyIHIscz10aGlzLl9maXJzdDtmb3IodGhpcy5fdG90YWxUaW1lPXRoaXMuX3RpbWU9dGhpcy5fcmF3UHJldlRpbWU9dDtzOylyPXMuX25leHQsKHMuX2FjdGl2ZXx8dD49cy5fc3RhcnRUaW1lJiYhcy5fcGF1c2VkJiYhcy5fZ2MpJiYocy5fcmV2ZXJzZWQ/cy5yZW5kZXIoKHMuX2RpcnR5P3MudG90YWxEdXJhdGlvbigpOnMuX3RvdGFsRHVyYXRpb24pLSh0LXMuX3N0YXJ0VGltZSkqcy5fdGltZVNjYWxlLGUsaSk6cy5yZW5kZXIoKHQtcy5fc3RhcnRUaW1lKSpzLl90aW1lU2NhbGUsZSxpKSkscz1yfSxfLnJhd1RpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gZnx8Yy53YWtlKCksdGhpcy5fdG90YWxUaW1lfTt2YXIgej14KCJUd2VlbkxpdGUiLGZ1bmN0aW9uKHQsZSxyKXtpZihNLmNhbGwodGhpcyxlLHIpLHRoaXMucmVuZGVyPXoucHJvdG90eXBlLnJlbmRlcixudWxsPT10KXRocm93IkNhbm5vdCB0d2VlbiBhIG51bGwgdGFyZ2V0LiI7dGhpcy50YXJnZXQ9dD0ic3RyaW5nIiE9dHlwZW9mIHQ/dDp6LnNlbGVjdG9yKHQpfHx0O3ZhciBzLG4sYSxvPXQuanF1ZXJ5fHx0Lmxlbmd0aCYmdCE9PWkmJnRbMF0mJih0WzBdPT09aXx8dFswXS5ub2RlVHlwZSYmdFswXS5zdHlsZSYmIXQubm9kZVR5cGUpLGw9dGhpcy52YXJzLm92ZXJ3cml0ZTtpZih0aGlzLl9vdmVyd3JpdGU9bD1udWxsPT1sP1pbei5kZWZhdWx0T3ZlcndyaXRlXToibnVtYmVyIj09dHlwZW9mIGw/bD4+MDpaW2xdLChvfHx0IGluc3RhbmNlb2YgQXJyYXl8fHQucHVzaCYmdih0KSkmJiJudW1iZXIiIT10eXBlb2YgdFswXSlmb3IodGhpcy5fdGFyZ2V0cz1hPW0odCksdGhpcy5fcHJvcExvb2t1cD1bXSx0aGlzLl9zaWJsaW5ncz1bXSxzPTA7czxhLmxlbmd0aDtzKyspKG49YVtzXSk/InN0cmluZyIhPXR5cGVvZiBuP24ubGVuZ3RoJiZuIT09aSYmblswXSYmKG5bMF09PT1pfHxuWzBdLm5vZGVUeXBlJiZuWzBdLnN0eWxlJiYhbi5ub2RlVHlwZSk/KGEuc3BsaWNlKHMtLSwxKSx0aGlzLl90YXJnZXRzPWE9YS5jb25jYXQobShuKSkpOih0aGlzLl9zaWJsaW5nc1tzXT10dChuLHRoaXMsITEpLDE9PT1sJiZ0aGlzLl9zaWJsaW5nc1tzXS5sZW5ndGg+MSYmaXQobix0aGlzLG51bGwsMSx0aGlzLl9zaWJsaW5nc1tzXSkpOiJzdHJpbmciPT10eXBlb2Yobj1hW3MtLV09ei5zZWxlY3RvcihuKSkmJmEuc3BsaWNlKHMrMSwxKTphLnNwbGljZShzLS0sMSk7ZWxzZSB0aGlzLl9wcm9wTG9va3VwPXt9LHRoaXMuX3NpYmxpbmdzPXR0KHQsdGhpcywhMSksMT09PWwmJnRoaXMuX3NpYmxpbmdzLmxlbmd0aD4xJiZpdCh0LHRoaXMsbnVsbCwxLHRoaXMuX3NpYmxpbmdzKTsodGhpcy52YXJzLmltbWVkaWF0ZVJlbmRlcnx8MD09PWUmJjA9PT10aGlzLl9kZWxheSYmITEhPT10aGlzLnZhcnMuaW1tZWRpYXRlUmVuZGVyKSYmKHRoaXMuX3RpbWU9LTFlLTEwLHRoaXMucmVuZGVyKE1hdGgubWluKDAsLXRoaXMuX2RlbGF5KSkpfSwhMCksST1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGgmJnQhPT1pJiZ0WzBdJiYodFswXT09PWl8fHRbMF0ubm9kZVR5cGUmJnRbMF0uc3R5bGUmJiF0Lm5vZGVUeXBlKX07KF89ei5wcm90b3R5cGU9bmV3IE0pLmNvbnN0cnVjdG9yPXosXy5raWxsKCkuX2djPSExLF8ucmF0aW89MCxfLl9maXJzdFBUPV8uX3RhcmdldHM9Xy5fb3ZlcndyaXR0ZW5Qcm9wcz1fLl9zdGFydEF0PW51bGwsXy5fbm90aWZ5UGx1Z2luc09mRW5hYmxlZD1fLl9sYXp5PSExLHoudmVyc2lvbj0iMi4wLjIiLHouZGVmYXVsdEVhc2U9Xy5fZWFzZT1uZXcgUChudWxsLG51bGwsMSwxKSx6LmRlZmF1bHRPdmVyd3JpdGU9ImF1dG8iLHoudGlja2VyPWMsei5hdXRvU2xlZXA9MTIwLHoubGFnU21vb3RoaW5nPWZ1bmN0aW9uKHQsZSl7Yy5sYWdTbW9vdGhpbmcodCxlKX0sei5zZWxlY3Rvcj1pLiR8fGkualF1ZXJ5fHxmdW5jdGlvbih0KXt2YXIgZT1pLiR8fGkualF1ZXJ5O3JldHVybiBlPyh6LnNlbGVjdG9yPWUsZSh0KSk6KGF8fChhPWkuZG9jdW1lbnQpLGE/YS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbCh0KTphLmdldEVsZW1lbnRCeUlkKCIjIj09PXQuY2hhckF0KDApP3Quc3Vic3RyKDEpOnQpOnQpfTt2YXIgTD1bXSxOPXt9LFg9Lyg/OigtfC09fFwrPSk/XGQqXC4/XGQqKD86ZVtcLStdP1xkKyk/KVswLTldL2dpLEI9L1tcKy1dPS0/W1wuXGRdLyxqPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpPXRoaXMuX2ZpcnN0UFQ7aTspZT1pLmJsb2I/MT09PXQmJm51bGwhPXRoaXMuZW5kP3RoaXMuZW5kOnQ/dGhpcy5qb2luKCIiKTp0aGlzLnN0YXJ0OmkuYyp0K2kucyxpLm0/ZT1pLm0uY2FsbCh0aGlzLl90d2VlbixlLHRoaXMuX3RhcmdldHx8aS50LHRoaXMuX3R3ZWVuKTplPDFlLTYmJmU+LTFlLTYmJiFpLmJsb2ImJihlPTApLGkuZj9pLmZwP2kudFtpLnBdKGkuZnAsZSk6aS50W2kucF0oZSk6aS50W2kucF09ZSxpPWkuX25leHR9LFU9ZnVuY3Rpb24odCxlLGkscil7dmFyIHMsbixhLG8sbCxoLHUsXz1bXSxjPTAsZj0iIixwPTA7Zm9yKF8uc3RhcnQ9dCxfLmVuZD1lLHQ9X1swXT10KyIiLGU9X1sxXT1lKyIiLGkmJihpKF8pLHQ9X1swXSxlPV9bMV0pLF8ubGVuZ3RoPTAscz10Lm1hdGNoKFgpfHxbXSxuPWUubWF0Y2goWCl8fFtdLHImJihyLl9uZXh0PW51bGwsci5ibG9iPTEsXy5fZmlyc3RQVD1fLl9hcHBseVBUPXIpLGw9bi5sZW5ndGgsbz0wO288bDtvKyspdT1uW29dLGYrPShoPWUuc3Vic3RyKGMsZS5pbmRleE9mKHUsYyktYykpfHwhbz9oOiIsIixjKz1oLmxlbmd0aCxwP3A9KHArMSklNToicmdiYSgiPT09aC5zdWJzdHIoLTUpJiYocD0xKSx1PT09c1tvXXx8cy5sZW5ndGg8PW8/Zis9dTooZiYmKF8ucHVzaChmKSxmPSIiKSxhPXBhcnNlRmxvYXQoc1tvXSksXy5wdXNoKGEpLF8uX2ZpcnN0UFQ9e19uZXh0Ol8uX2ZpcnN0UFQsdDpfLHA6Xy5sZW5ndGgtMSxzOmEsYzooIj0iPT09dS5jaGFyQXQoMSk/cGFyc2VJbnQodS5jaGFyQXQoMCkrIjEiLDEwKSpwYXJzZUZsb2F0KHUuc3Vic3RyKDIpKTpwYXJzZUZsb2F0KHUpLWEpfHwwLGY6MCxtOnAmJnA8ND9NYXRoLnJvdW5kOjB9KSxjKz11Lmxlbmd0aDtyZXR1cm4oZis9ZS5zdWJzdHIoYykpJiZfLnB1c2goZiksXy5zZXRSYXRpbz1qLEIudGVzdChlKSYmKF8uZW5kPW51bGwpLF99LFk9ZnVuY3Rpb24odCxlLGkscixzLG4sYSxvLGwpeyJmdW5jdGlvbiI9PXR5cGVvZiByJiYocj1yKGx8fDAsdCkpO3ZhciBoPXR5cGVvZiB0W2VdLHU9ImZ1bmN0aW9uIiE9PWg/IiI6ZS5pbmRleE9mKCJzZXQiKXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRbImdldCIrZS5zdWJzdHIoMyldP2U6ImdldCIrZS5zdWJzdHIoMyksXz0iZ2V0IiE9PWk/aTp1P2E/dFt1XShhKTp0W3VdKCk6dFtlXSxjPSJzdHJpbmciPT10eXBlb2YgciYmIj0iPT09ci5jaGFyQXQoMSksZj17dDp0LHA6ZSxzOl8sZjoiZnVuY3Rpb24iPT09aCxwZzowLG46c3x8ZSxtOm4/ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpNYXRoLnJvdW5kOjAscHI6MCxjOmM/cGFyc2VJbnQoci5jaGFyQXQoMCkrIjEiLDEwKSpwYXJzZUZsb2F0KHIuc3Vic3RyKDIpKTpwYXJzZUZsb2F0KHIpLV98fDB9O2lmKCgibnVtYmVyIiE9dHlwZW9mIF98fCJudW1iZXIiIT10eXBlb2YgciYmIWMpJiYoYXx8aXNOYU4oXyl8fCFjJiZpc05hTihyKXx8ImJvb2xlYW4iPT10eXBlb2YgX3x8ImJvb2xlYW4iPT10eXBlb2Ygcj8oZi5mcD1hLGY9e3Q6VShfLGM/cGFyc2VGbG9hdChmLnMpK2YuYysoZi5zKyIiKS5yZXBsYWNlKC9bMC05XC1cLl0vZywiIik6cixvfHx6LmRlZmF1bHRTdHJpbmdGaWx0ZXIsZikscDoic2V0UmF0aW8iLHM6MCxjOjEsZjoyLHBnOjAsbjpzfHxlLHByOjAsbTowfSk6KGYucz1wYXJzZUZsb2F0KF8pLGN8fChmLmM9cGFyc2VGbG9hdChyKS1mLnN8fDApKSksZi5jKXJldHVybihmLl9uZXh0PXRoaXMuX2ZpcnN0UFQpJiYoZi5fbmV4dC5fcHJldj1mKSx0aGlzLl9maXJzdFBUPWYsZn0sVj16Ll9pbnRlcm5hbHM9e2lzQXJyYXk6dixpc1NlbGVjdG9yOkksbGF6eVR3ZWVuczpMLGJsb2JEaWY6VX0sRz16Ll9wbHVnaW5zPXt9LHE9Vi50d2Vlbkxvb2t1cD17fSxXPTAsSD1WLnJlc2VydmVkUHJvcHM9e2Vhc2U6MSxkZWxheToxLG92ZXJ3cml0ZToxLG9uQ29tcGxldGU6MSxvbkNvbXBsZXRlUGFyYW1zOjEsb25Db21wbGV0ZVNjb3BlOjEsdXNlRnJhbWVzOjEscnVuQmFja3dhcmRzOjEsc3RhcnRBdDoxLG9uVXBkYXRlOjEsb25VcGRhdGVQYXJhbXM6MSxvblVwZGF0ZVNjb3BlOjEsb25TdGFydDoxLG9uU3RhcnRQYXJhbXM6MSxvblN0YXJ0U2NvcGU6MSxvblJldmVyc2VDb21wbGV0ZToxLG9uUmV2ZXJzZUNvbXBsZXRlUGFyYW1zOjEsb25SZXZlcnNlQ29tcGxldGVTY29wZToxLG9uUmVwZWF0OjEsb25SZXBlYXRQYXJhbXM6MSxvblJlcGVhdFNjb3BlOjEsZWFzZVBhcmFtczoxLHlveW86MSxpbW1lZGlhdGVSZW5kZXI6MSxyZXBlYXQ6MSxyZXBlYXREZWxheToxLGRhdGE6MSxwYXVzZWQ6MSxyZXZlcnNlZDoxLGF1dG9DU1M6MSxsYXp5OjEsb25PdmVyd3JpdGU6MSxjYWxsYmFja1Njb3BlOjEsc3RyaW5nRmlsdGVyOjEsaWQ6MSx5b3lvRWFzZToxfSxaPXtub25lOjAsYWxsOjEsYXV0bzoyLGNvbmN1cnJlbnQ6MyxhbGxPblN0YXJ0OjQscHJlZXhpc3Rpbmc6NSx0cnVlOjEsZmFsc2U6MH0sJD1NLl9yb290RnJhbWVzVGltZWxpbmU9bmV3IEYsUT1NLl9yb290VGltZWxpbmU9bmV3IEYsSz0zMCxKPVYubGF6eVJlbmRlcj1mdW5jdGlvbigpe3ZhciB0LGU9TC5sZW5ndGg7Zm9yKE49e307LS1lPi0xOykodD1MW2VdKSYmITEhPT10Ll9sYXp5JiYodC5yZW5kZXIodC5fbGF6eVswXSx0Ll9sYXp5WzFdLCEwKSx0Ll9sYXp5PSExKTtMLmxlbmd0aD0wfTtRLl9zdGFydFRpbWU9Yy50aW1lLCQuX3N0YXJ0VGltZT1jLmZyYW1lLFEuX2FjdGl2ZT0kLl9hY3RpdmU9ITAsc2V0VGltZW91dChKLDEpLE0uX3VwZGF0ZVJvb3Q9ei5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdCxlLGk7aWYoTC5sZW5ndGgmJkooKSxRLnJlbmRlcigoYy50aW1lLVEuX3N0YXJ0VGltZSkqUS5fdGltZVNjYWxlLCExLCExKSwkLnJlbmRlcigoYy5mcmFtZS0kLl9zdGFydFRpbWUpKiQuX3RpbWVTY2FsZSwhMSwhMSksTC5sZW5ndGgmJkooKSxjLmZyYW1lPj1LKXtmb3IoaSBpbiBLPWMuZnJhbWUrKHBhcnNlSW50KHouYXV0b1NsZWVwLDEwKXx8MTIwKSxxKXtmb3IodD0oZT1xW2ldLnR3ZWVucykubGVuZ3RoOy0tdD4tMTspZVt0XS5fZ2MmJmUuc3BsaWNlKHQsMSk7MD09PWUubGVuZ3RoJiZkZWxldGUgcVtpXX1pZigoIShpPVEuX2ZpcnN0KXx8aS5fcGF1c2VkKSYmei5hdXRvU2xlZXAmJiEkLl9maXJzdCYmMT09PWMuX2xpc3RlbmVycy50aWNrLmxlbmd0aCl7Zm9yKDtpJiZpLl9wYXVzZWQ7KWk9aS5fbmV4dDtpfHxjLnNsZWVwKCl9fX0sYy5hZGRFdmVudExpc3RlbmVyKCJ0aWNrIixNLl91cGRhdGVSb290KTt2YXIgdHQ9ZnVuY3Rpb24odCxlLGkpe3ZhciByLHMsbj10Ll9nc1R3ZWVuSUQ7aWYocVtufHwodC5fZ3NUd2VlbklEPW49InQiK1crKyldfHwocVtuXT17dGFyZ2V0OnQsdHdlZW5zOltdfSksZSYmKChyPXFbbl0udHdlZW5zKVtzPXIubGVuZ3RoXT1lLGkpKWZvcig7LS1zPi0xOylyW3NdPT09ZSYmci5zcGxpY2UocywxKTtyZXR1cm4gcVtuXS50d2VlbnN9LGV0PWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBzLG4sYT10LnZhcnMub25PdmVyd3JpdGU7cmV0dXJuIGEmJihzPWEodCxlLGkscikpLChhPXoub25PdmVyd3JpdGUpJiYobj1hKHQsZSxpLHIpKSwhMSE9PXMmJiExIT09bn0saXQ9ZnVuY3Rpb24odCxlLGkscixzKXt2YXIgbixhLG8sbDtpZigxPT09cnx8cj49NCl7Zm9yKGw9cy5sZW5ndGgsbj0wO248bDtuKyspaWYoKG89c1tuXSkhPT1lKW8uX2djfHxvLl9raWxsKG51bGwsdCxlKSYmKGE9ITApO2Vsc2UgaWYoNT09PXIpYnJlYWs7cmV0dXJuIGF9dmFyIGgsdT1lLl9zdGFydFRpbWUrMWUtMTAsXz1bXSxjPTAsZj0wPT09ZS5fZHVyYXRpb247Zm9yKG49cy5sZW5ndGg7LS1uPi0xOykobz1zW25dKT09PWV8fG8uX2djfHxvLl9wYXVzZWR8fChvLl90aW1lbGluZSE9PWUuX3RpbWVsaW5lPyhoPWh8fHJ0KGUsMCxmKSwwPT09cnQobyxoLGYpJiYoX1tjKytdPW8pKTpvLl9zdGFydFRpbWU8PXUmJm8uX3N0YXJ0VGltZStvLnRvdGFsRHVyYXRpb24oKS9vLl90aW1lU2NhbGU+dSYmKChmfHwhby5faW5pdHRlZCkmJnUtby5fc3RhcnRUaW1lPD0yZS0xMHx8KF9bYysrXT1vKSkpO2ZvcihuPWM7LS1uPi0xOylpZihsPShvPV9bbl0pLl9maXJzdFBULDI9PT1yJiZvLl9raWxsKGksdCxlKSYmKGE9ITApLDIhPT1yfHwhby5fZmlyc3RQVCYmby5faW5pdHRlZCYmbCl7aWYoMiE9PXImJiFldChvLGUpKWNvbnRpbnVlO28uX2VuYWJsZWQoITEsITEpJiYoYT0hMCl9cmV0dXJuIGF9LHJ0PWZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIHI9dC5fdGltZWxpbmUscz1yLl90aW1lU2NhbGUsbj10Ll9zdGFydFRpbWU7ci5fdGltZWxpbmU7KXtpZihuKz1yLl9zdGFydFRpbWUscyo9ci5fdGltZVNjYWxlLHIuX3BhdXNlZClyZXR1cm4tMTAwO3I9ci5fdGltZWxpbmV9cmV0dXJuKG4vPXMpPmU/bi1lOmkmJm49PT1lfHwhdC5faW5pdHRlZCYmbi1lPDJlLTEwPzFlLTEwOihuKz10LnRvdGFsRHVyYXRpb24oKS90Ll90aW1lU2NhbGUvcyk+ZSsxZS0xMD8wOm4tZS0xZS0xMH07Xy5faW5pdD1mdW5jdGlvbigpe3ZhciB0LGUsaSxyLHMsbixhPXRoaXMudmFycyxvPXRoaXMuX292ZXJ3cml0dGVuUHJvcHMsbD10aGlzLl9kdXJhdGlvbixoPSEhYS5pbW1lZGlhdGVSZW5kZXIsdT1hLmVhc2U7aWYoYS5zdGFydEF0KXtmb3IociBpbiB0aGlzLl9zdGFydEF0JiYodGhpcy5fc3RhcnRBdC5yZW5kZXIoLTEsITApLHRoaXMuX3N0YXJ0QXQua2lsbCgpKSxzPXt9LGEuc3RhcnRBdClzW3JdPWEuc3RhcnRBdFtyXTtpZihzLmRhdGE9ImlzU3RhcnQiLHMub3ZlcndyaXRlPSExLHMuaW1tZWRpYXRlUmVuZGVyPSEwLHMubGF6eT1oJiYhMSE9PWEubGF6eSxzLnN0YXJ0QXQ9cy5kZWxheT1udWxsLHMub25VcGRhdGU9YS5vblVwZGF0ZSxzLm9uVXBkYXRlUGFyYW1zPWEub25VcGRhdGVQYXJhbXMscy5vblVwZGF0ZVNjb3BlPWEub25VcGRhdGVTY29wZXx8YS5jYWxsYmFja1Njb3BlfHx0aGlzLHRoaXMuX3N0YXJ0QXQ9ei50byh0aGlzLnRhcmdldHx8e30sMCxzKSxoKWlmKHRoaXMuX3RpbWU+MCl0aGlzLl9zdGFydEF0PW51bGw7ZWxzZSBpZigwIT09bClyZXR1cm59ZWxzZSBpZihhLnJ1bkJhY2t3YXJkcyYmMCE9PWwpaWYodGhpcy5fc3RhcnRBdCl0aGlzLl9zdGFydEF0LnJlbmRlcigtMSwhMCksdGhpcy5fc3RhcnRBdC5raWxsKCksdGhpcy5fc3RhcnRBdD1udWxsO2Vsc2V7Zm9yKHIgaW4gMCE9PXRoaXMuX3RpbWUmJihoPSExKSxpPXt9LGEpSFtyXSYmImF1dG9DU1MiIT09cnx8KGlbcl09YVtyXSk7aWYoaS5vdmVyd3JpdGU9MCxpLmRhdGE9ImlzRnJvbVN0YXJ0IixpLmxhenk9aCYmITEhPT1hLmxhenksaS5pbW1lZGlhdGVSZW5kZXI9aCx0aGlzLl9zdGFydEF0PXoudG8odGhpcy50YXJnZXQsMCxpKSxoKXtpZigwPT09dGhpcy5fdGltZSlyZXR1cm59ZWxzZSB0aGlzLl9zdGFydEF0Ll9pbml0KCksdGhpcy5fc3RhcnRBdC5fZW5hYmxlZCghMSksdGhpcy52YXJzLmltbWVkaWF0ZVJlbmRlciYmKHRoaXMuX3N0YXJ0QXQ9bnVsbCl9aWYodGhpcy5fZWFzZT11PXU/dSBpbnN0YW5jZW9mIFA/dToiZnVuY3Rpb24iPT10eXBlb2YgdT9uZXcgUCh1LGEuZWFzZVBhcmFtcyk6U1t1XXx8ei5kZWZhdWx0RWFzZTp6LmRlZmF1bHRFYXNlLGEuZWFzZVBhcmFtcyBpbnN0YW5jZW9mIEFycmF5JiZ1LmNvbmZpZyYmKHRoaXMuX2Vhc2U9dS5jb25maWcuYXBwbHkodSxhLmVhc2VQYXJhbXMpKSx0aGlzLl9lYXNlVHlwZT10aGlzLl9lYXNlLl90eXBlLHRoaXMuX2Vhc2VQb3dlcj10aGlzLl9lYXNlLl9wb3dlcix0aGlzLl9maXJzdFBUPW51bGwsdGhpcy5fdGFyZ2V0cylmb3Iobj10aGlzLl90YXJnZXRzLmxlbmd0aCx0PTA7dDxuO3QrKyl0aGlzLl9pbml0UHJvcHModGhpcy5fdGFyZ2V0c1t0XSx0aGlzLl9wcm9wTG9va3VwW3RdPXt9LHRoaXMuX3NpYmxpbmdzW3RdLG8/b1t0XTpudWxsLHQpJiYoZT0hMCk7ZWxzZSBlPXRoaXMuX2luaXRQcm9wcyh0aGlzLnRhcmdldCx0aGlzLl9wcm9wTG9va3VwLHRoaXMuX3NpYmxpbmdzLG8sMCk7aWYoZSYmei5fb25QbHVnaW5FdmVudCgiX29uSW5pdEFsbFByb3BzIix0aGlzKSxvJiYodGhpcy5fZmlyc3RQVHx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXMudGFyZ2V0JiZ0aGlzLl9lbmFibGVkKCExLCExKSksYS5ydW5CYWNrd2FyZHMpZm9yKGk9dGhpcy5fZmlyc3RQVDtpOylpLnMrPWkuYyxpLmM9LWkuYyxpPWkuX25leHQ7dGhpcy5fb25VcGRhdGU9YS5vblVwZGF0ZSx0aGlzLl9pbml0dGVkPSEwfSxfLl9pbml0UHJvcHM9ZnVuY3Rpb24odCxlLHIscyxuKXt2YXIgYSxvLGwsaCx1LF87aWYobnVsbD09dClyZXR1cm4hMTtmb3IoYSBpbiBOW3QuX2dzVHdlZW5JRF0mJkooKSx0aGlzLnZhcnMuY3NzfHx0LnN0eWxlJiZ0IT09aSYmdC5ub2RlVHlwZSYmRy5jc3MmJiExIT09dGhpcy52YXJzLmF1dG9DU1MmJmZ1bmN0aW9uKHQsZSl7dmFyIGkscj17fTtmb3IoaSBpbiB0KUhbaV18fGkgaW4gZSYmInRyYW5zZm9ybSIhPT1pJiYieCIhPT1pJiYieSIhPT1pJiYid2lkdGgiIT09aSYmImhlaWdodCIhPT1pJiYiY2xhc3NOYW1lIiE9PWkmJiJib3JkZXIiIT09aXx8ISghR1tpXXx8R1tpXSYmR1tpXS5fYXV0b0NTUyl8fChyW2ldPXRbaV0sZGVsZXRlIHRbaV0pO3QuY3NzPXJ9KHRoaXMudmFycyx0KSx0aGlzLnZhcnMpaWYoXz10aGlzLnZhcnNbYV0sSFthXSlfJiYoXyBpbnN0YW5jZW9mIEFycmF5fHxfLnB1c2gmJnYoXykpJiYtMSE9PV8uam9pbigiIikuaW5kZXhPZigie3NlbGZ9IikmJih0aGlzLnZhcnNbYV09Xz10aGlzLl9zd2FwU2VsZkluUGFyYW1zKF8sdGhpcykpO2Vsc2UgaWYoR1thXSYmKGg9bmV3IEdbYV0pLl9vbkluaXRUd2Vlbih0LHRoaXMudmFyc1thXSx0aGlzLG4pKXtmb3IodGhpcy5fZmlyc3RQVD11PXtfbmV4dDp0aGlzLl9maXJzdFBULHQ6aCxwOiJzZXRSYXRpbyIsczowLGM6MSxmOjEsbjphLHBnOjEscHI6aC5fcHJpb3JpdHksbTowfSxvPWguX292ZXJ3cml0ZVByb3BzLmxlbmd0aDstLW8+LTE7KWVbaC5fb3ZlcndyaXRlUHJvcHNbb11dPXRoaXMuX2ZpcnN0UFQ7KGguX3ByaW9yaXR5fHxoLl9vbkluaXRBbGxQcm9wcykmJihsPSEwKSwoaC5fb25EaXNhYmxlfHxoLl9vbkVuYWJsZSkmJih0aGlzLl9ub3RpZnlQbHVnaW5zT2ZFbmFibGVkPSEwKSx1Ll9uZXh0JiYodS5fbmV4dC5fcHJldj11KX1lbHNlIGVbYV09WS5jYWxsKHRoaXMsdCxhLCJnZXQiLF8sYSwwLG51bGwsdGhpcy52YXJzLnN0cmluZ0ZpbHRlcixuKTtyZXR1cm4gcyYmdGhpcy5fa2lsbChzLHQpP3RoaXMuX2luaXRQcm9wcyh0LGUscixzLG4pOnRoaXMuX292ZXJ3cml0ZT4xJiZ0aGlzLl9maXJzdFBUJiZyLmxlbmd0aD4xJiZpdCh0LHRoaXMsZSx0aGlzLl9vdmVyd3JpdGUscik/KHRoaXMuX2tpbGwoZSx0KSx0aGlzLl9pbml0UHJvcHModCxlLHIscyxuKSk6KHRoaXMuX2ZpcnN0UFQmJighMSE9PXRoaXMudmFycy5sYXp5JiZ0aGlzLl9kdXJhdGlvbnx8dGhpcy52YXJzLmxhenkmJiF0aGlzLl9kdXJhdGlvbikmJihOW3QuX2dzVHdlZW5JRF09ITApLGwpfSxfLnJlbmRlcj1mdW5jdGlvbih0LGUsaSl7dmFyIHIscyxuLGEsbz10aGlzLl90aW1lLGw9dGhpcy5fZHVyYXRpb24saD10aGlzLl9yYXdQcmV2VGltZTtpZih0Pj1sLTFlLTcmJnQ+PTApdGhpcy5fdG90YWxUaW1lPXRoaXMuX3RpbWU9bCx0aGlzLnJhdGlvPXRoaXMuX2Vhc2UuX2NhbGNFbmQ/dGhpcy5fZWFzZS5nZXRSYXRpbygxKToxLHRoaXMuX3JldmVyc2VkfHwocj0hMCxzPSJvbkNvbXBsZXRlIixpPWl8fHRoaXMuX3RpbWVsaW5lLmF1dG9SZW1vdmVDaGlsZHJlbiksMD09PWwmJih0aGlzLl9pbml0dGVkfHwhdGhpcy52YXJzLmxhenl8fGkpJiYodGhpcy5fc3RhcnRUaW1lPT09dGhpcy5fdGltZWxpbmUuX2R1cmF0aW9uJiYodD0wKSwoaDwwfHx0PD0wJiZ0Pj0tMWUtN3x8MWUtMTA9PT1oJiYiaXNQYXVzZSIhPT10aGlzLmRhdGEpJiZoIT09dCYmKGk9ITAsaD4xZS0xMCYmKHM9Im9uUmV2ZXJzZUNvbXBsZXRlIikpLHRoaXMuX3Jhd1ByZXZUaW1lPWE9IWV8fHR8fGg9PT10P3Q6MWUtMTApO2Vsc2UgaWYodDwxZS03KXRoaXMuX3RvdGFsVGltZT10aGlzLl90aW1lPTAsdGhpcy5yYXRpbz10aGlzLl9lYXNlLl9jYWxjRW5kP3RoaXMuX2Vhc2UuZ2V0UmF0aW8oMCk6MCwoMCE9PW98fDA9PT1sJiZoPjApJiYocz0ib25SZXZlcnNlQ29tcGxldGUiLHI9dGhpcy5fcmV2ZXJzZWQpLHQ8MCYmKHRoaXMuX2FjdGl2ZT0hMSwwPT09bCYmKHRoaXMuX2luaXR0ZWR8fCF0aGlzLnZhcnMubGF6eXx8aSkmJihoPj0wJiYoMWUtMTAhPT1ofHwiaXNQYXVzZSIhPT10aGlzLmRhdGEpJiYoaT0hMCksdGhpcy5fcmF3UHJldlRpbWU9YT0hZXx8dHx8aD09PXQ/dDoxZS0xMCkpLCghdGhpcy5faW5pdHRlZHx8dGhpcy5fc3RhcnRBdCYmdGhpcy5fc3RhcnRBdC5wcm9ncmVzcygpKSYmKGk9ITApO2Vsc2UgaWYodGhpcy5fdG90YWxUaW1lPXRoaXMuX3RpbWU9dCx0aGlzLl9lYXNlVHlwZSl7dmFyIHU9dC9sLF89dGhpcy5fZWFzZVR5cGUsYz10aGlzLl9lYXNlUG93ZXI7KDE9PT1ffHwzPT09XyYmdT49LjUpJiYodT0xLXUpLDM9PT1fJiYodSo9MiksMT09PWM/dSo9dToyPT09Yz91Kj11KnU6Mz09PWM/dSo9dSp1KnU6ND09PWMmJih1Kj11KnUqdSp1KSx0aGlzLnJhdGlvPTE9PT1fPzEtdToyPT09Xz91OnQvbDwuNT91LzI6MS11LzJ9ZWxzZSB0aGlzLnJhdGlvPXRoaXMuX2Vhc2UuZ2V0UmF0aW8odC9sKTtpZih0aGlzLl90aW1lIT09b3x8aSl7aWYoIXRoaXMuX2luaXR0ZWQpe2lmKHRoaXMuX2luaXQoKSwhdGhpcy5faW5pdHRlZHx8dGhpcy5fZ2MpcmV0dXJuO2lmKCFpJiZ0aGlzLl9maXJzdFBUJiYoITEhPT10aGlzLnZhcnMubGF6eSYmdGhpcy5fZHVyYXRpb258fHRoaXMudmFycy5sYXp5JiYhdGhpcy5fZHVyYXRpb24pKXJldHVybiB0aGlzLl90aW1lPXRoaXMuX3RvdGFsVGltZT1vLHRoaXMuX3Jhd1ByZXZUaW1lPWgsTC5wdXNoKHRoaXMpLHZvaWQodGhpcy5fbGF6eT1bdCxlXSk7dGhpcy5fdGltZSYmIXI/dGhpcy5yYXRpbz10aGlzLl9lYXNlLmdldFJhdGlvKHRoaXMuX3RpbWUvbCk6ciYmdGhpcy5fZWFzZS5fY2FsY0VuZCYmKHRoaXMucmF0aW89dGhpcy5fZWFzZS5nZXRSYXRpbygwPT09dGhpcy5fdGltZT8wOjEpKX1mb3IoITEhPT10aGlzLl9sYXp5JiYodGhpcy5fbGF6eT0hMSksdGhpcy5fYWN0aXZlfHwhdGhpcy5fcGF1c2VkJiZ0aGlzLl90aW1lIT09byYmdD49MCYmKHRoaXMuX2FjdGl2ZT0hMCksMD09PW8mJih0aGlzLl9zdGFydEF0JiYodD49MD90aGlzLl9zdGFydEF0LnJlbmRlcih0LCEwLGkpOnN8fChzPSJfZHVtbXlHUyIpKSx0aGlzLnZhcnMub25TdGFydCYmKDA9PT10aGlzLl90aW1lJiYwIT09bHx8ZXx8dGhpcy5fY2FsbGJhY2soIm9uU3RhcnQiKSkpLG49dGhpcy5fZmlyc3RQVDtuOyluLmY/bi50W24ucF0obi5jKnRoaXMucmF0aW8rbi5zKTpuLnRbbi5wXT1uLmMqdGhpcy5yYXRpbytuLnMsbj1uLl9uZXh0O3RoaXMuX29uVXBkYXRlJiYodDwwJiZ0aGlzLl9zdGFydEF0JiYtMWUtNCE9PXQmJnRoaXMuX3N0YXJ0QXQucmVuZGVyKHQsITAsaSksZXx8KHRoaXMuX3RpbWUhPT1vfHxyfHxpKSYmdGhpcy5fY2FsbGJhY2soIm9uVXBkYXRlIikpLHMmJih0aGlzLl9nYyYmIWl8fCh0PDAmJnRoaXMuX3N0YXJ0QXQmJiF0aGlzLl9vblVwZGF0ZSYmLTFlLTQhPT10JiZ0aGlzLl9zdGFydEF0LnJlbmRlcih0LCEwLGkpLHImJih0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4mJnRoaXMuX2VuYWJsZWQoITEsITEpLHRoaXMuX2FjdGl2ZT0hMSksIWUmJnRoaXMudmFyc1tzXSYmdGhpcy5fY2FsbGJhY2socyksMD09PWwmJjFlLTEwPT09dGhpcy5fcmF3UHJldlRpbWUmJjFlLTEwIT09YSYmKHRoaXMuX3Jhd1ByZXZUaW1lPTApKSl9fSxfLl9raWxsPWZ1bmN0aW9uKHQsZSxpKXtpZigiYWxsIj09PXQmJih0PW51bGwpLG51bGw9PXQmJihudWxsPT1lfHxlPT09dGhpcy50YXJnZXQpKXJldHVybiB0aGlzLl9sYXp5PSExLHRoaXMuX2VuYWJsZWQoITEsITEpO2U9InN0cmluZyIhPXR5cGVvZiBlP2V8fHRoaXMuX3RhcmdldHN8fHRoaXMudGFyZ2V0Onouc2VsZWN0b3IoZSl8fGU7dmFyIHIscyxuLGEsbyxsLGgsdSxfLGM9aSYmdGhpcy5fdGltZSYmaS5fc3RhcnRUaW1lPT09dGhpcy5fc3RhcnRUaW1lJiZ0aGlzLl90aW1lbGluZT09PWkuX3RpbWVsaW5lLGY9dGhpcy5fZmlyc3RQVDtpZigodihlKXx8SShlKSkmJiJudW1iZXIiIT10eXBlb2YgZVswXSlmb3Iocj1lLmxlbmd0aDstLXI+LTE7KXRoaXMuX2tpbGwodCxlW3JdLGkpJiYobD0hMCk7ZWxzZXtpZih0aGlzLl90YXJnZXRzKXtmb3Iocj10aGlzLl90YXJnZXRzLmxlbmd0aDstLXI+LTE7KWlmKGU9PT10aGlzLl90YXJnZXRzW3JdKXtvPXRoaXMuX3Byb3BMb29rdXBbcl18fHt9LHRoaXMuX292ZXJ3cml0dGVuUHJvcHM9dGhpcy5fb3ZlcndyaXR0ZW5Qcm9wc3x8W10scz10aGlzLl9vdmVyd3JpdHRlblByb3BzW3JdPXQ/dGhpcy5fb3ZlcndyaXR0ZW5Qcm9wc1tyXXx8e306ImFsbCI7YnJlYWt9fWVsc2V7aWYoZSE9PXRoaXMudGFyZ2V0KXJldHVybiExO289dGhpcy5fcHJvcExvb2t1cCxzPXRoaXMuX292ZXJ3cml0dGVuUHJvcHM9dD90aGlzLl9vdmVyd3JpdHRlblByb3BzfHx7fToiYWxsIn1pZihvKXtpZihoPXR8fG8sdT10IT09cyYmImFsbCIhPT1zJiZ0IT09byYmKCJvYmplY3QiIT10eXBlb2YgdHx8IXQuX3RlbXBLaWxsKSxpJiYoei5vbk92ZXJ3cml0ZXx8dGhpcy52YXJzLm9uT3ZlcndyaXRlKSl7Zm9yKG4gaW4gaClvW25dJiYoX3x8KF89W10pLF8ucHVzaChuKSk7aWYoKF98fCF0KSYmIWV0KHRoaXMsaSxlLF8pKXJldHVybiExfWZvcihuIGluIGgpKGE9b1tuXSkmJihjJiYoYS5mP2EudFthLnBdKGEucyk6YS50W2EucF09YS5zLGw9ITApLGEucGcmJmEudC5fa2lsbChoKSYmKGw9ITApLGEucGcmJjAhPT1hLnQuX292ZXJ3cml0ZVByb3BzLmxlbmd0aHx8KGEuX3ByZXY/YS5fcHJldi5fbmV4dD1hLl9uZXh0OmE9PT10aGlzLl9maXJzdFBUJiYodGhpcy5fZmlyc3RQVD1hLl9uZXh0KSxhLl9uZXh0JiYoYS5fbmV4dC5fcHJldj1hLl9wcmV2KSxhLl9uZXh0PWEuX3ByZXY9bnVsbCksZGVsZXRlIG9bbl0pLHUmJihzW25dPTEpOyF0aGlzLl9maXJzdFBUJiZ0aGlzLl9pbml0dGVkJiZmJiZ0aGlzLl9lbmFibGVkKCExLCExKX19cmV0dXJuIGx9LF8uaW52YWxpZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub3RpZnlQbHVnaW5zT2ZFbmFibGVkJiZ6Ll9vblBsdWdpbkV2ZW50KCJfb25EaXNhYmxlIix0aGlzKSx0aGlzLl9maXJzdFBUPXRoaXMuX292ZXJ3cml0dGVuUHJvcHM9dGhpcy5fc3RhcnRBdD10aGlzLl9vblVwZGF0ZT1udWxsLHRoaXMuX25vdGlmeVBsdWdpbnNPZkVuYWJsZWQ9dGhpcy5fYWN0aXZlPXRoaXMuX2xhenk9ITEsdGhpcy5fcHJvcExvb2t1cD10aGlzLl90YXJnZXRzP3t9OltdLE0ucHJvdG90eXBlLmludmFsaWRhdGUuY2FsbCh0aGlzKSx0aGlzLnZhcnMuaW1tZWRpYXRlUmVuZGVyJiYodGhpcy5fdGltZT0tMWUtMTAsdGhpcy5yZW5kZXIoTWF0aC5taW4oMCwtdGhpcy5fZGVsYXkpKSksdGhpc30sXy5fZW5hYmxlZD1mdW5jdGlvbih0LGUpe2lmKGZ8fGMud2FrZSgpLHQmJnRoaXMuX2djKXt2YXIgaSxyPXRoaXMuX3RhcmdldHM7aWYocilmb3IoaT1yLmxlbmd0aDstLWk+LTE7KXRoaXMuX3NpYmxpbmdzW2ldPXR0KHJbaV0sdGhpcywhMCk7ZWxzZSB0aGlzLl9zaWJsaW5ncz10dCh0aGlzLnRhcmdldCx0aGlzLCEwKX1yZXR1cm4gTS5wcm90b3R5cGUuX2VuYWJsZWQuY2FsbCh0aGlzLHQsZSksISghdGhpcy5fbm90aWZ5UGx1Z2luc09mRW5hYmxlZHx8IXRoaXMuX2ZpcnN0UFQpJiZ6Ll9vblBsdWdpbkV2ZW50KHQ/Il9vbkVuYWJsZSI6Il9vbkRpc2FibGUiLHRoaXMpfSx6LnRvPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbmV3IHoodCxlLGkpfSx6LmZyb209ZnVuY3Rpb24odCxlLGkpe3JldHVybiBpLnJ1bkJhY2t3YXJkcz0hMCxpLmltbWVkaWF0ZVJlbmRlcj0wIT1pLmltbWVkaWF0ZVJlbmRlcixuZXcgeih0LGUsaSl9LHouZnJvbVRvPWZ1bmN0aW9uKHQsZSxpLHIpe3JldHVybiByLnN0YXJ0QXQ9aSxyLmltbWVkaWF0ZVJlbmRlcj0wIT1yLmltbWVkaWF0ZVJlbmRlciYmMCE9aS5pbW1lZGlhdGVSZW5kZXIsbmV3IHoodCxlLHIpfSx6LmRlbGF5ZWRDYWxsPWZ1bmN0aW9uKHQsZSxpLHIscyl7cmV0dXJuIG5ldyB6KGUsMCx7ZGVsYXk6dCxvbkNvbXBsZXRlOmUsb25Db21wbGV0ZVBhcmFtczppLGNhbGxiYWNrU2NvcGU6cixvblJldmVyc2VDb21wbGV0ZTplLG9uUmV2ZXJzZUNvbXBsZXRlUGFyYW1zOmksaW1tZWRpYXRlUmVuZGVyOiExLGxhenk6ITEsdXNlRnJhbWVzOnMsb3ZlcndyaXRlOjB9KX0sei5zZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHoodCwwLGUpfSx6LmdldFR3ZWVuc09mPWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dClyZXR1cm5bXTt2YXIgaSxyLHMsbjtpZih0PSJzdHJpbmciIT10eXBlb2YgdD90Onouc2VsZWN0b3IodCl8fHQsKHYodCl8fEkodCkpJiYibnVtYmVyIiE9dHlwZW9mIHRbMF0pe2ZvcihpPXQubGVuZ3RoLHI9W107LS1pPi0xOylyPXIuY29uY2F0KHouZ2V0VHdlZW5zT2YodFtpXSxlKSk7Zm9yKGk9ci5sZW5ndGg7LS1pPi0xOylmb3Iobj1yW2ldLHM9aTstLXM+LTE7KW49PT1yW3NdJiZyLnNwbGljZShpLDEpfWVsc2UgaWYodC5fZ3NUd2VlbklEKWZvcihpPShyPXR0KHQpLmNvbmNhdCgpKS5sZW5ndGg7LS1pPi0xOykocltpXS5fZ2N8fGUmJiFyW2ldLmlzQWN0aXZlKCkpJiZyLnNwbGljZShpLDEpO3JldHVybiByfHxbXX0sei5raWxsVHdlZW5zT2Y9ei5raWxsRGVsYXllZENhbGxzVG89ZnVuY3Rpb24odCxlLGkpeyJvYmplY3QiPT10eXBlb2YgZSYmKGk9ZSxlPSExKTtmb3IodmFyIHI9ei5nZXRUd2VlbnNPZih0LGUpLHM9ci5sZW5ndGg7LS1zPi0xOylyW3NdLl9raWxsKGksdCl9O3ZhciBzdD14KCJwbHVnaW5zLlR3ZWVuUGx1Z2luIixmdW5jdGlvbih0LGUpe3RoaXMuX292ZXJ3cml0ZVByb3BzPSh0fHwiIikuc3BsaXQoIiwiKSx0aGlzLl9wcm9wTmFtZT10aGlzLl9vdmVyd3JpdGVQcm9wc1swXSx0aGlzLl9wcmlvcml0eT1lfHwwLHRoaXMuX3N1cGVyPXN0LnByb3RvdHlwZX0sITApO2lmKF89c3QucHJvdG90eXBlLHN0LnZlcnNpb249IjEuMTkuMCIsc3QuQVBJPTIsXy5fZmlyc3RQVD1udWxsLF8uX2FkZFR3ZWVuPVksXy5zZXRSYXRpbz1qLF8uX2tpbGw9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLl9vdmVyd3JpdGVQcm9wcyxyPXRoaXMuX2ZpcnN0UFQ7aWYobnVsbCE9dFt0aGlzLl9wcm9wTmFtZV0pdGhpcy5fb3ZlcndyaXRlUHJvcHM9W107ZWxzZSBmb3IoZT1pLmxlbmd0aDstLWU+LTE7KW51bGwhPXRbaVtlXV0mJmkuc3BsaWNlKGUsMSk7Zm9yKDtyOyludWxsIT10W3Iubl0mJihyLl9uZXh0JiYoci5fbmV4dC5fcHJldj1yLl9wcmV2KSxyLl9wcmV2PyhyLl9wcmV2Ll9uZXh0PXIuX25leHQsci5fcHJldj1udWxsKTp0aGlzLl9maXJzdFBUPT09ciYmKHRoaXMuX2ZpcnN0UFQ9ci5fbmV4dCkpLHI9ci5fbmV4dDtyZXR1cm4hMX0sXy5fbW9kPV8uX3JvdW5kUHJvcHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9dGhpcy5fZmlyc3RQVDtpOykoZT10W3RoaXMuX3Byb3BOYW1lXXx8bnVsbCE9aS5uJiZ0W2kubi5zcGxpdCh0aGlzLl9wcm9wTmFtZSsiXyIpLmpvaW4oIiIpXSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYoMj09PWkuZj9pLnQuX2FwcGx5UFQubT1lOmkubT1lKSxpPWkuX25leHR9LHouX29uUGx1Z2luRXZlbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaSxyLHMsbixhLG89ZS5fZmlyc3RQVDtpZigiX29uSW5pdEFsbFByb3BzIj09PXQpe2Zvcig7bzspe2ZvcihhPW8uX25leHQscj1zO3ImJnIucHI+by5wcjspcj1yLl9uZXh0OyhvLl9wcmV2PXI/ci5fcHJldjpuKT9vLl9wcmV2Ll9uZXh0PW86cz1vLChvLl9uZXh0PXIpP3IuX3ByZXY9bzpuPW8sbz1hfW89ZS5fZmlyc3RQVD1zfWZvcig7bzspby5wZyYmImZ1bmN0aW9uIj09dHlwZW9mIG8udFt0XSYmby50W3RdKCkmJihpPSEwKSxvPW8uX25leHQ7cmV0dXJuIGl9LHN0LmFjdGl2YXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDstLWU+LTE7KXRbZV0uQVBJPT09c3QuQVBJJiYoR1sobmV3IHRbZV0pLl9wcm9wTmFtZV09dFtlXSk7cmV0dXJuITB9LHcucGx1Z2luPWZ1bmN0aW9uKHQpe2lmKCEodCYmdC5wcm9wTmFtZSYmdC5pbml0JiZ0LkFQSSkpdGhyb3ciaWxsZWdhbCBwbHVnaW4gZGVmaW5pdGlvbi4iO3ZhciBlLGk9dC5wcm9wTmFtZSxyPXQucHJpb3JpdHl8fDAscz10Lm92ZXJ3cml0ZVByb3BzLG49e2luaXQ6Il9vbkluaXRUd2VlbiIsc2V0OiJzZXRSYXRpbyIsa2lsbDoiX2tpbGwiLHJvdW5kOiJfbW9kIixtb2Q6Il9tb2QiLGluaXRBbGw6Il9vbkluaXRBbGxQcm9wcyJ9LGE9eCgicGx1Z2lucy4iK2kuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkraS5zdWJzdHIoMSkrIlBsdWdpbiIsZnVuY3Rpb24oKXtzdC5jYWxsKHRoaXMsaSxyKSx0aGlzLl9vdmVyd3JpdGVQcm9wcz1zfHxbXX0sITA9PT10Lmdsb2JhbCksbz1hLnByb3RvdHlwZT1uZXcgc3QoaSk7Zm9yKGUgaW4gby5jb25zdHJ1Y3Rvcj1hLGEuQVBJPXQuQVBJLG4pImZ1bmN0aW9uIj09dHlwZW9mIHRbZV0mJihvW25bZV1dPXRbZV0pO3JldHVybiBhLnZlcnNpb249dC52ZXJzaW9uLHN0LmFjdGl2YXRlKFthXSksYX0saD1pLl9nc1F1ZXVlKXtmb3IodT0wO3U8aC5sZW5ndGg7dSsrKWhbdV0oKTtmb3IoXyBpbiB5KXlbX10uZnVuY3x8aS5jb25zb2xlLmxvZygiR1NBUCBlbmNvdW50ZXJlZCBtaXNzaW5nIGRlcGVuZGVuY3k6ICIrXyl9Zj0hMX0odm9pZCAwIT09dCYmdC5leHBvcnRzJiZ2b2lkIDAhPT1pP2k6dGhpc3x8d2luZG93KX0pLmNhbGwodGhpcyxpKDEpKX0sZnVuY3Rpb24odCxlLGkpeyhmdW5jdGlvbihyKXt2YXIgcyxuLGEsbz12b2lkIDAhPT10JiZ0LmV4cG9ydHMmJnZvaWQgMCE9PXI/cjp0aGlzfHx3aW5kb3c7DQovKiENCiAqIFZFUlNJT046IDIuMC4yDQogKiBEQVRFOiAyMDE4LTA4LTI3DQogKiBVUERBVEVTIEFORCBET0NTIEFUOiBodHRwOi8vZ3JlZW5zb2NrLmNvbQ0KICoNCiAqIEBsaWNlbnNlIENvcHlyaWdodCAoYykgMjAwOC0yMDE4LCBHcmVlblNvY2suIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKiBUaGlzIHdvcmsgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYXQgaHR0cDovL2dyZWVuc29jay5jb20vc3RhbmRhcmQtbGljZW5zZSBvciBmb3INCiAqIENsdWIgR3JlZW5Tb2NrIG1lbWJlcnMsIHRoZSBzb2Z0d2FyZSBhZ3JlZW1lbnQgdGhhdCB3YXMgaXNzdWVkIHdpdGggeW91ciBtZW1iZXJzaGlwLg0KICogDQogKiBAYXV0aG9yOiBKYWNrIERveWxlLCBqYWNrQGdyZWVuc29jay5jb20NCiAqLyhvLl9nc1F1ZXVlfHwoby5fZ3NRdWV1ZT1bXSkpLnB1c2goZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7by5fZ3NEZWZpbmUoIlRpbWVsaW5lTWF4IixbIlRpbWVsaW5lTGl0ZSIsIlR3ZWVuTGl0ZSIsImVhc2luZy5FYXNlIl0sZnVuY3Rpb24odCxlLGkpe3ZhciByPWZ1bmN0aW9uKGUpe3QuY2FsbCh0aGlzLGUpLHRoaXMuX3JlcGVhdD10aGlzLnZhcnMucmVwZWF0fHwwLHRoaXMuX3JlcGVhdERlbGF5PXRoaXMudmFycy5yZXBlYXREZWxheXx8MCx0aGlzLl9jeWNsZT0wLHRoaXMuX3lveW89ITA9PT10aGlzLnZhcnMueW95byx0aGlzLl9kaXJ0eT0hMH0scz1lLl9pbnRlcm5hbHMsbj1zLmxhenlUd2VlbnMsYT1zLmxhenlSZW5kZXIsbD1vLl9nc0RlZmluZS5nbG9iYWxzLGg9bmV3IGkobnVsbCxudWxsLDEsMCksdT1yLnByb3RvdHlwZT1uZXcgdDtyZXR1cm4gdS5jb25zdHJ1Y3Rvcj1yLHUua2lsbCgpLl9nYz0hMSxyLnZlcnNpb249IjIuMC4yIix1LmludmFsaWRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feW95bz0hMD09PXRoaXMudmFycy55b3lvLHRoaXMuX3JlcGVhdD10aGlzLnZhcnMucmVwZWF0fHwwLHRoaXMuX3JlcGVhdERlbGF5PXRoaXMudmFycy5yZXBlYXREZWxheXx8MCx0aGlzLl91bmNhY2hlKCEwKSx0LnByb3RvdHlwZS5pbnZhbGlkYXRlLmNhbGwodGhpcyl9LHUuYWRkQ2FsbGJhY2s9ZnVuY3Rpb24odCxpLHIscyl7cmV0dXJuIHRoaXMuYWRkKGUuZGVsYXllZENhbGwoMCx0LHIscyksaSl9LHUucmVtb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtpZih0KWlmKG51bGw9PWUpdGhpcy5fa2lsbChudWxsLHQpO2Vsc2UgZm9yKHZhciBpPXRoaXMuZ2V0VHdlZW5zT2YodCwhMSkscj1pLmxlbmd0aCxzPXRoaXMuX3BhcnNlVGltZU9yTGFiZWwoZSk7LS1yPi0xOylpW3JdLl9zdGFydFRpbWU9PT1zJiZpW3JdLl9lbmFibGVkKCExLCExKTtyZXR1cm4gdGhpc30sdS5yZW1vdmVQYXVzZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZW1vdmVDYWxsYmFjayh0Ll9pbnRlcm5hbHMucGF1c2VDYWxsYmFjayxlKX0sdS50d2VlblRvPWZ1bmN0aW9uKHQsaSl7aT1pfHx7fTt2YXIgcixzLG4sYT17ZWFzZTpoLHVzZUZyYW1lczp0aGlzLnVzZXNGcmFtZXMoKSxpbW1lZGlhdGVSZW5kZXI6ITEsbGF6eTohMX0sbz1pLnJlcGVhdCYmbC5Ud2Vlbk1heHx8ZTtmb3IocyBpbiBpKWFbc109aVtzXTtyZXR1cm4gYS50aW1lPXRoaXMuX3BhcnNlVGltZU9yTGFiZWwodCkscj1NYXRoLmFicyhOdW1iZXIoYS50aW1lKS10aGlzLl90aW1lKS90aGlzLl90aW1lU2NhbGV8fC4wMDEsbj1uZXcgbyh0aGlzLHIsYSksYS5vblN0YXJ0PWZ1bmN0aW9uKCl7bi50YXJnZXQucGF1c2VkKCEwKSxuLnZhcnMudGltZT09PW4udGFyZ2V0LnRpbWUoKXx8ciE9PW4uZHVyYXRpb24oKXx8bi5pc0Zyb21Ub3x8bi5kdXJhdGlvbihNYXRoLmFicyhuLnZhcnMudGltZS1uLnRhcmdldC50aW1lKCkpL24udGFyZ2V0Ll90aW1lU2NhbGUpLnJlbmRlcihuLnRpbWUoKSwhMCwhMCksaS5vblN0YXJ0JiZpLm9uU3RhcnQuYXBwbHkoaS5vblN0YXJ0U2NvcGV8fGkuY2FsbGJhY2tTY29wZXx8bixpLm9uU3RhcnRQYXJhbXN8fFtdKX0sbn0sdS50d2VlbkZyb21Ubz1mdW5jdGlvbih0LGUsaSl7aT1pfHx7fSx0PXRoaXMuX3BhcnNlVGltZU9yTGFiZWwodCksaS5zdGFydEF0PXtvbkNvbXBsZXRlOnRoaXMuc2VlayxvbkNvbXBsZXRlUGFyYW1zOlt0XSxjYWxsYmFja1Njb3BlOnRoaXN9LGkuaW1tZWRpYXRlUmVuZGVyPSExIT09aS5pbW1lZGlhdGVSZW5kZXI7dmFyIHI9dGhpcy50d2VlblRvKGUsaSk7cmV0dXJuIHIuaXNGcm9tVG89MSxyLmR1cmF0aW9uKE1hdGguYWJzKHIudmFycy50aW1lLXQpL3RoaXMuX3RpbWVTY2FsZXx8LjAwMSl9LHUucmVuZGVyPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9nYyYmdGhpcy5fZW5hYmxlZCghMCwhMSk7dmFyIHIscyxvLGwsaCx1LF8sYyxmPXRoaXMuX3RpbWUscD10aGlzLl9kaXJ0eT90aGlzLnRvdGFsRHVyYXRpb24oKTp0aGlzLl90b3RhbER1cmF0aW9uLGQ9dGhpcy5fZHVyYXRpb24sbT10aGlzLl90b3RhbFRpbWUsZz10aGlzLl9zdGFydFRpbWUsdj10aGlzLl90aW1lU2NhbGUseT10aGlzLl9yYXdQcmV2VGltZSxUPXRoaXMuX3BhdXNlZCx3PXRoaXMuX2N5Y2xlO2lmKGYhPT10aGlzLl90aW1lJiYodCs9dGhpcy5fdGltZS1mKSx0Pj1wLTFlLTcmJnQ+PTApdGhpcy5fbG9ja2VkfHwodGhpcy5fdG90YWxUaW1lPXAsdGhpcy5fY3ljbGU9dGhpcy5fcmVwZWF0KSx0aGlzLl9yZXZlcnNlZHx8dGhpcy5faGFzUGF1c2VkQ2hpbGQoKXx8KHM9ITAsbD0ib25Db21wbGV0ZSIsaD0hIXRoaXMuX3RpbWVsaW5lLmF1dG9SZW1vdmVDaGlsZHJlbiwwPT09dGhpcy5fZHVyYXRpb24mJih0PD0wJiZ0Pj0tMWUtN3x8eTwwfHwxZS0xMD09PXkpJiZ5IT09dCYmdGhpcy5fZmlyc3QmJihoPSEwLHk+MWUtMTAmJihsPSJvblJldmVyc2VDb21wbGV0ZSIpKSksdGhpcy5fcmF3UHJldlRpbWU9dGhpcy5fZHVyYXRpb258fCFlfHx0fHx0aGlzLl9yYXdQcmV2VGltZT09PXQ/dDoxZS0xMCx0aGlzLl95b3lvJiYwIT0oMSZ0aGlzLl9jeWNsZSk/dGhpcy5fdGltZT10PTA6KHRoaXMuX3RpbWU9ZCx0PWQrMWUtNCk7ZWxzZSBpZih0PDFlLTcpaWYodGhpcy5fbG9ja2VkfHwodGhpcy5fdG90YWxUaW1lPXRoaXMuX2N5Y2xlPTApLHRoaXMuX3RpbWU9MCwoMCE9PWZ8fDA9PT1kJiYxZS0xMCE9PXkmJih5PjB8fHQ8MCYmeT49MCkmJiF0aGlzLl9sb2NrZWQpJiYobD0ib25SZXZlcnNlQ29tcGxldGUiLHM9dGhpcy5fcmV2ZXJzZWQpLHQ8MCl0aGlzLl9hY3RpdmU9ITEsdGhpcy5fdGltZWxpbmUuYXV0b1JlbW92ZUNoaWxkcmVuJiZ0aGlzLl9yZXZlcnNlZD8oaD1zPSEwLGw9Im9uUmV2ZXJzZUNvbXBsZXRlIik6eT49MCYmdGhpcy5fZmlyc3QmJihoPSEwKSx0aGlzLl9yYXdQcmV2VGltZT10O2Vsc2V7aWYodGhpcy5fcmF3UHJldlRpbWU9ZHx8IWV8fHR8fHRoaXMuX3Jhd1ByZXZUaW1lPT09dD90OjFlLTEwLDA9PT10JiZzKWZvcihyPXRoaXMuX2ZpcnN0O3ImJjA9PT1yLl9zdGFydFRpbWU7KXIuX2R1cmF0aW9ufHwocz0hMSkscj1yLl9uZXh0O3Q9MCx0aGlzLl9pbml0dGVkfHwoaD0hMCl9ZWxzZSBpZigwPT09ZCYmeTwwJiYoaD0hMCksdGhpcy5fdGltZT10aGlzLl9yYXdQcmV2VGltZT10LHRoaXMuX2xvY2tlZHx8KHRoaXMuX3RvdGFsVGltZT10LDAhPT10aGlzLl9yZXBlYXQmJih1PWQrdGhpcy5fcmVwZWF0RGVsYXksdGhpcy5fY3ljbGU9dGhpcy5fdG90YWxUaW1lL3U+PjAsMCE9PXRoaXMuX2N5Y2xlJiZ0aGlzLl9jeWNsZT09PXRoaXMuX3RvdGFsVGltZS91JiZtPD10JiZ0aGlzLl9jeWNsZS0tLHRoaXMuX3RpbWU9dGhpcy5fdG90YWxUaW1lLXRoaXMuX2N5Y2xlKnUsdGhpcy5feW95byYmMCE9KDEmdGhpcy5fY3ljbGUpJiYodGhpcy5fdGltZT1kLXRoaXMuX3RpbWUpLHRoaXMuX3RpbWU+ZD8odGhpcy5fdGltZT1kLHQ9ZCsxZS00KTp0aGlzLl90aW1lPDA/dGhpcy5fdGltZT10PTA6dD10aGlzLl90aW1lKSksdGhpcy5faGFzUGF1c2UmJiF0aGlzLl9mb3JjaW5nUGxheWhlYWQmJiFlKXtpZigodD10aGlzLl90aW1lKT49Znx8dGhpcy5fcmVwZWF0JiZ3IT09dGhpcy5fY3ljbGUpZm9yKHI9dGhpcy5fZmlyc3Q7ciYmci5fc3RhcnRUaW1lPD10JiYhXzspci5fZHVyYXRpb258fCJpc1BhdXNlIiE9PXIuZGF0YXx8ci5yYXRpb3x8MD09PXIuX3N0YXJ0VGltZSYmMD09PXRoaXMuX3Jhd1ByZXZUaW1lfHwoXz1yKSxyPXIuX25leHQ7ZWxzZSBmb3Iocj10aGlzLl9sYXN0O3ImJnIuX3N0YXJ0VGltZT49dCYmIV87KXIuX2R1cmF0aW9ufHwiaXNQYXVzZSI9PT1yLmRhdGEmJnIuX3Jhd1ByZXZUaW1lPjAmJihfPXIpLHI9ci5fcHJldjtfJiZfLl9zdGFydFRpbWU8ZCYmKHRoaXMuX3RpbWU9dD1fLl9zdGFydFRpbWUsdGhpcy5fdG90YWxUaW1lPXQrdGhpcy5fY3ljbGUqKHRoaXMuX3RvdGFsRHVyYXRpb24rdGhpcy5fcmVwZWF0RGVsYXkpKX1pZih0aGlzLl9jeWNsZSE9PXcmJiF0aGlzLl9sb2NrZWQpe3ZhciB4PXRoaXMuX3lveW8mJjAhPSgxJncpLGI9eD09PSh0aGlzLl95b3lvJiYwIT0oMSZ0aGlzLl9jeWNsZSkpLFA9dGhpcy5fdG90YWxUaW1lLFM9dGhpcy5fY3ljbGUsaz10aGlzLl9yYXdQcmV2VGltZSxSPXRoaXMuX3RpbWU7aWYodGhpcy5fdG90YWxUaW1lPXcqZCx0aGlzLl9jeWNsZTx3P3g9IXg6dGhpcy5fdG90YWxUaW1lKz1kLHRoaXMuX3RpbWU9Zix0aGlzLl9yYXdQcmV2VGltZT0wPT09ZD95LTFlLTQ6eSx0aGlzLl9jeWNsZT13LHRoaXMuX2xvY2tlZD0hMCxmPXg/MDpkLHRoaXMucmVuZGVyKGYsZSwwPT09ZCksZXx8dGhpcy5fZ2N8fHRoaXMudmFycy5vblJlcGVhdCYmKHRoaXMuX2N5Y2xlPVMsdGhpcy5fbG9ja2VkPSExLHRoaXMuX2NhbGxiYWNrKCJvblJlcGVhdCIpKSxmIT09dGhpcy5fdGltZSlyZXR1cm47aWYoYiYmKHRoaXMuX2N5Y2xlPXcsdGhpcy5fbG9ja2VkPSEwLGY9eD9kKzFlLTQ6LTFlLTQsdGhpcy5yZW5kZXIoZiwhMCwhMSkpLHRoaXMuX2xvY2tlZD0hMSx0aGlzLl9wYXVzZWQmJiFUKXJldHVybjt0aGlzLl90aW1lPVIsdGhpcy5fdG90YWxUaW1lPVAsdGhpcy5fY3ljbGU9Uyx0aGlzLl9yYXdQcmV2VGltZT1rfWlmKHRoaXMuX3RpbWUhPT1mJiZ0aGlzLl9maXJzdHx8aXx8aHx8Xyl7aWYodGhpcy5faW5pdHRlZHx8KHRoaXMuX2luaXR0ZWQ9ITApLHRoaXMuX2FjdGl2ZXx8IXRoaXMuX3BhdXNlZCYmdGhpcy5fdG90YWxUaW1lIT09bSYmdD4wJiYodGhpcy5fYWN0aXZlPSEwKSwwPT09bSYmdGhpcy52YXJzLm9uU3RhcnQmJigwPT09dGhpcy5fdG90YWxUaW1lJiZ0aGlzLl90b3RhbER1cmF0aW9ufHxlfHx0aGlzLl9jYWxsYmFjaygib25TdGFydCIpKSwoYz10aGlzLl90aW1lKT49Zilmb3Iocj10aGlzLl9maXJzdDtyJiYobz1yLl9uZXh0LGM9PT10aGlzLl90aW1lJiYoIXRoaXMuX3BhdXNlZHx8VCkpOykoci5fYWN0aXZlfHxyLl9zdGFydFRpbWU8PXRoaXMuX3RpbWUmJiFyLl9wYXVzZWQmJiFyLl9nYykmJihfPT09ciYmdGhpcy5wYXVzZSgpLHIuX3JldmVyc2VkP3IucmVuZGVyKChyLl9kaXJ0eT9yLnRvdGFsRHVyYXRpb24oKTpyLl90b3RhbER1cmF0aW9uKS0odC1yLl9zdGFydFRpbWUpKnIuX3RpbWVTY2FsZSxlLGkpOnIucmVuZGVyKCh0LXIuX3N0YXJ0VGltZSkqci5fdGltZVNjYWxlLGUsaSkpLHI9bztlbHNlIGZvcihyPXRoaXMuX2xhc3Q7ciYmKG89ci5fcHJldixjPT09dGhpcy5fdGltZSYmKCF0aGlzLl9wYXVzZWR8fFQpKTspe2lmKHIuX2FjdGl2ZXx8ci5fc3RhcnRUaW1lPD1mJiYhci5fcGF1c2VkJiYhci5fZ2Mpe2lmKF89PT1yKXtmb3IoXz1yLl9wcmV2O18mJl8uZW5kVGltZSgpPnRoaXMuX3RpbWU7KV8ucmVuZGVyKF8uX3JldmVyc2VkP18udG90YWxEdXJhdGlvbigpLSh0LV8uX3N0YXJ0VGltZSkqXy5fdGltZVNjYWxlOih0LV8uX3N0YXJ0VGltZSkqXy5fdGltZVNjYWxlLGUsaSksXz1fLl9wcmV2O189bnVsbCx0aGlzLnBhdXNlKCl9ci5fcmV2ZXJzZWQ/ci5yZW5kZXIoKHIuX2RpcnR5P3IudG90YWxEdXJhdGlvbigpOnIuX3RvdGFsRHVyYXRpb24pLSh0LXIuX3N0YXJ0VGltZSkqci5fdGltZVNjYWxlLGUsaSk6ci5yZW5kZXIoKHQtci5fc3RhcnRUaW1lKSpyLl90aW1lU2NhbGUsZSxpKX1yPW99dGhpcy5fb25VcGRhdGUmJihlfHwobi5sZW5ndGgmJmEoKSx0aGlzLl9jYWxsYmFjaygib25VcGRhdGUiKSkpLGwmJih0aGlzLl9sb2NrZWR8fHRoaXMuX2djfHxnIT09dGhpcy5fc3RhcnRUaW1lJiZ2PT09dGhpcy5fdGltZVNjYWxlfHwoMD09PXRoaXMuX3RpbWV8fHA+PXRoaXMudG90YWxEdXJhdGlvbigpKSYmKHMmJihuLmxlbmd0aCYmYSgpLHRoaXMuX3RpbWVsaW5lLmF1dG9SZW1vdmVDaGlsZHJlbiYmdGhpcy5fZW5hYmxlZCghMSwhMSksdGhpcy5fYWN0aXZlPSExKSwhZSYmdGhpcy52YXJzW2xdJiZ0aGlzLl9jYWxsYmFjayhsKSkpfWVsc2UgbSE9PXRoaXMuX3RvdGFsVGltZSYmdGhpcy5fb25VcGRhdGUmJihlfHx0aGlzLl9jYWxsYmFjaygib25VcGRhdGUiKSl9LHUuZ2V0QWN0aXZlPWZ1bmN0aW9uKHQsZSxpKXtudWxsPT10JiYodD0hMCksbnVsbD09ZSYmKGU9ITApLG51bGw9PWkmJihpPSExKTt2YXIgcixzLG49W10sYT10aGlzLmdldENoaWxkcmVuKHQsZSxpKSxvPTAsbD1hLmxlbmd0aDtmb3Iocj0wO3I8bDtyKyspKHM9YVtyXSkuaXNBY3RpdmUoKSYmKG5bbysrXT1zKTtyZXR1cm4gbn0sdS5nZXRMYWJlbEFmdGVyPWZ1bmN0aW9uKHQpe3R8fDAhPT10JiYodD10aGlzLl90aW1lKTt2YXIgZSxpPXRoaXMuZ2V0TGFiZWxzQXJyYXkoKSxyPWkubGVuZ3RoO2ZvcihlPTA7ZTxyO2UrKylpZihpW2VdLnRpbWU+dClyZXR1cm4gaVtlXS5uYW1lO3JldHVybiBudWxsfSx1LmdldExhYmVsQmVmb3JlPWZ1bmN0aW9uKHQpe251bGw9PXQmJih0PXRoaXMuX3RpbWUpO2Zvcih2YXIgZT10aGlzLmdldExhYmVsc0FycmF5KCksaT1lLmxlbmd0aDstLWk+LTE7KWlmKGVbaV0udGltZTx0KXJldHVybiBlW2ldLm5hbWU7cmV0dXJuIG51bGx9LHUuZ2V0TGFiZWxzQXJyYXk9ZnVuY3Rpb24oKXt2YXIgdCxlPVtdLGk9MDtmb3IodCBpbiB0aGlzLl9sYWJlbHMpZVtpKytdPXt0aW1lOnRoaXMuX2xhYmVsc1t0XSxuYW1lOnR9O3JldHVybiBlLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50aW1lLWUudGltZX0pLGV9LHUuaW52YWxpZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2NrZWQ9ITEsdC5wcm90b3R5cGUuaW52YWxpZGF0ZS5jYWxsKHRoaXMpfSx1LnByb2dyZXNzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy50b3RhbFRpbWUodGhpcy5kdXJhdGlvbigpKih0aGlzLl95b3lvJiYwIT0oMSZ0aGlzLl9jeWNsZSk/MS10OnQpK3RoaXMuX2N5Y2xlKih0aGlzLl9kdXJhdGlvbit0aGlzLl9yZXBlYXREZWxheSksZSk6dGhpcy5fdGltZS90aGlzLmR1cmF0aW9uKCl8fDB9LHUudG90YWxQcm9ncmVzcz1mdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMudG90YWxUaW1lKHRoaXMudG90YWxEdXJhdGlvbigpKnQsZSk6dGhpcy5fdG90YWxUaW1lL3RoaXMudG90YWxEdXJhdGlvbigpfHwwfSx1LnRvdGFsRHVyYXRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/LTEhPT10aGlzLl9yZXBlYXQmJmU/dGhpcy50aW1lU2NhbGUodGhpcy50b3RhbER1cmF0aW9uKCkvZSk6dGhpczoodGhpcy5fZGlydHkmJih0LnByb3RvdHlwZS50b3RhbER1cmF0aW9uLmNhbGwodGhpcyksdGhpcy5fdG90YWxEdXJhdGlvbj0tMT09PXRoaXMuX3JlcGVhdD85OTk5OTk5OTk5OTk6dGhpcy5fZHVyYXRpb24qKHRoaXMuX3JlcGVhdCsxKSt0aGlzLl9yZXBlYXREZWxheSp0aGlzLl9yZXBlYXQpLHRoaXMuX3RvdGFsRHVyYXRpb24pfSx1LnRpbWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5fZGlydHkmJnRoaXMudG90YWxEdXJhdGlvbigpLHQ+dGhpcy5fZHVyYXRpb24mJih0PXRoaXMuX2R1cmF0aW9uKSx0aGlzLl95b3lvJiYwIT0oMSZ0aGlzLl9jeWNsZSk/dD10aGlzLl9kdXJhdGlvbi10K3RoaXMuX2N5Y2xlKih0aGlzLl9kdXJhdGlvbit0aGlzLl9yZXBlYXREZWxheSk6MCE9PXRoaXMuX3JlcGVhdCYmKHQrPXRoaXMuX2N5Y2xlKih0aGlzLl9kdXJhdGlvbit0aGlzLl9yZXBlYXREZWxheSkpLHRoaXMudG90YWxUaW1lKHQsZSkpOnRoaXMuX3RpbWV9LHUucmVwZWF0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl9yZXBlYXQ9dCx0aGlzLl91bmNhY2hlKCEwKSk6dGhpcy5fcmVwZWF0fSx1LnJlcGVhdERlbGF5PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl9yZXBlYXREZWxheT10LHRoaXMuX3VuY2FjaGUoITApKTp0aGlzLl9yZXBlYXREZWxheX0sdS55b3lvPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl95b3lvPXQsdGhpcyk6dGhpcy5feW95b30sdS5jdXJyZW50TGFiZWw9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5zZWVrKHQsITApOnRoaXMuZ2V0TGFiZWxCZWZvcmUodGhpcy5fdGltZSsxZS04KX0scn0sITApLG8uX2dzRGVmaW5lKCJUaW1lbGluZUxpdGUiLFsiY29yZS5BbmltYXRpb24iLCJjb3JlLlNpbXBsZVRpbWVsaW5lIiwiVHdlZW5MaXRlIl0sZnVuY3Rpb24odCxlLGkpe3ZhciByPWZ1bmN0aW9uKHQpe2UuY2FsbCh0aGlzLHQpLHRoaXMuX2xhYmVscz17fSx0aGlzLmF1dG9SZW1vdmVDaGlsZHJlbj0hMD09PXRoaXMudmFycy5hdXRvUmVtb3ZlQ2hpbGRyZW4sdGhpcy5zbW9vdGhDaGlsZFRpbWluZz0hMD09PXRoaXMudmFycy5zbW9vdGhDaGlsZFRpbWluZyx0aGlzLl9zb3J0Q2hpbGRyZW49ITAsdGhpcy5fb25VcGRhdGU9dGhpcy52YXJzLm9uVXBkYXRlO3ZhciBpLHIscz10aGlzLnZhcnM7Zm9yKHIgaW4gcylpPXNbcl0sbChpKSYmLTEhPT1pLmpvaW4oIiIpLmluZGV4T2YoIntzZWxmfSIpJiYoc1tyXT10aGlzLl9zd2FwU2VsZkluUGFyYW1zKGkpKTtsKHMudHdlZW5zKSYmdGhpcy5hZGQocy50d2VlbnMsMCxzLmFsaWduLHMuc3RhZ2dlcil9LHM9aS5faW50ZXJuYWxzLG49ci5faW50ZXJuYWxzPXt9LGE9cy5pc1NlbGVjdG9yLGw9cy5pc0FycmF5LGg9cy5sYXp5VHdlZW5zLHU9cy5sYXp5UmVuZGVyLF89by5fZ3NEZWZpbmUuZ2xvYmFscyxjPWZ1bmN0aW9uKHQpe3ZhciBlLGk9e307Zm9yKGUgaW4gdClpW2VdPXRbZV07cmV0dXJuIGl9LGY9ZnVuY3Rpb24odCxlLGkpe3ZhciByLHMsbj10LmN5Y2xlO2ZvcihyIGluIG4pcz1uW3JdLHRbcl09ImZ1bmN0aW9uIj09dHlwZW9mIHM/cyhpLGVbaV0pOnNbaSVzLmxlbmd0aF07ZGVsZXRlIHQuY3ljbGV9LHA9bi5wYXVzZUNhbGxiYWNrPWZ1bmN0aW9uKCl7fSxkPWZ1bmN0aW9uKHQpe3ZhciBlLGk9W10scj10Lmxlbmd0aDtmb3IoZT0wO2UhPT1yO2kucHVzaCh0W2UrK10pKTtyZXR1cm4gaX0sbT1yLnByb3RvdHlwZT1uZXcgZTtyZXR1cm4gci52ZXJzaW9uPSIyLjAuMiIsbS5jb25zdHJ1Y3Rvcj1yLG0ua2lsbCgpLl9nYz1tLl9mb3JjaW5nUGxheWhlYWQ9bS5faGFzUGF1c2U9ITEsbS50bz1mdW5jdGlvbih0LGUscixzKXt2YXIgbj1yLnJlcGVhdCYmXy5Ud2Vlbk1heHx8aTtyZXR1cm4gZT90aGlzLmFkZChuZXcgbih0LGUscikscyk6dGhpcy5zZXQodCxyLHMpfSxtLmZyb209ZnVuY3Rpb24odCxlLHIscyl7cmV0dXJuIHRoaXMuYWRkKChyLnJlcGVhdCYmXy5Ud2Vlbk1heHx8aSkuZnJvbSh0LGUscikscyl9LG0uZnJvbVRvPWZ1bmN0aW9uKHQsZSxyLHMsbil7dmFyIGE9cy5yZXBlYXQmJl8uVHdlZW5NYXh8fGk7cmV0dXJuIGU/dGhpcy5hZGQoYS5mcm9tVG8odCxlLHIscyksbik6dGhpcy5zZXQodCxzLG4pfSxtLnN0YWdnZXJUbz1mdW5jdGlvbih0LGUscyxuLG8sbCxoLHUpe3ZhciBfLHAsbT1uZXcgcih7b25Db21wbGV0ZTpsLG9uQ29tcGxldGVQYXJhbXM6aCxjYWxsYmFja1Njb3BlOnUsc21vb3RoQ2hpbGRUaW1pbmc6dGhpcy5zbW9vdGhDaGlsZFRpbWluZ30pLGc9cy5jeWNsZTtmb3IoInN0cmluZyI9PXR5cGVvZiB0JiYodD1pLnNlbGVjdG9yKHQpfHx0KSxhKHQ9dHx8W10pJiYodD1kKHQpKSwobj1ufHwwKTwwJiYoKHQ9ZCh0KSkucmV2ZXJzZSgpLG4qPS0xKSxwPTA7cDx0Lmxlbmd0aDtwKyspKF89YyhzKSkuc3RhcnRBdCYmKF8uc3RhcnRBdD1jKF8uc3RhcnRBdCksXy5zdGFydEF0LmN5Y2xlJiZmKF8uc3RhcnRBdCx0LHApKSxnJiYoZihfLHQscCksbnVsbCE9Xy5kdXJhdGlvbiYmKGU9Xy5kdXJhdGlvbixkZWxldGUgXy5kdXJhdGlvbikpLG0udG8odFtwXSxlLF8scCpuKTtyZXR1cm4gdGhpcy5hZGQobSxvKX0sbS5zdGFnZ2VyRnJvbT1mdW5jdGlvbih0LGUsaSxyLHMsbixhLG8pe3JldHVybiBpLmltbWVkaWF0ZVJlbmRlcj0wIT1pLmltbWVkaWF0ZVJlbmRlcixpLnJ1bkJhY2t3YXJkcz0hMCx0aGlzLnN0YWdnZXJUbyh0LGUsaSxyLHMsbixhLG8pfSxtLnN0YWdnZXJGcm9tVG89ZnVuY3Rpb24odCxlLGkscixzLG4sYSxvLGwpe3JldHVybiByLnN0YXJ0QXQ9aSxyLmltbWVkaWF0ZVJlbmRlcj0wIT1yLmltbWVkaWF0ZVJlbmRlciYmMCE9aS5pbW1lZGlhdGVSZW5kZXIsdGhpcy5zdGFnZ2VyVG8odCxlLHIscyxuLGEsbyxsKX0sbS5jYWxsPWZ1bmN0aW9uKHQsZSxyLHMpe3JldHVybiB0aGlzLmFkZChpLmRlbGF5ZWRDYWxsKDAsdCxlLHIpLHMpfSxtLnNldD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHI9dGhpcy5fcGFyc2VUaW1lT3JMYWJlbChyLDAsITApLG51bGw9PWUuaW1tZWRpYXRlUmVuZGVyJiYoZS5pbW1lZGlhdGVSZW5kZXI9cj09PXRoaXMuX3RpbWUmJiF0aGlzLl9wYXVzZWQpLHRoaXMuYWRkKG5ldyBpKHQsMCxlKSxyKX0sci5leHBvcnRSb290PWZ1bmN0aW9uKHQsZSl7bnVsbD09KHQ9dHx8e30pLnNtb290aENoaWxkVGltaW5nJiYodC5zbW9vdGhDaGlsZFRpbWluZz0hMCk7dmFyIHMsbixhLG8sbD1uZXcgcih0KSxoPWwuX3RpbWVsaW5lO2ZvcihudWxsPT1lJiYoZT0hMCksaC5fcmVtb3ZlKGwsITApLGwuX3N0YXJ0VGltZT0wLGwuX3Jhd1ByZXZUaW1lPWwuX3RpbWU9bC5fdG90YWxUaW1lPWguX3RpbWUsYT1oLl9maXJzdDthOylvPWEuX25leHQsZSYmYSBpbnN0YW5jZW9mIGkmJmEudGFyZ2V0PT09YS52YXJzLm9uQ29tcGxldGV8fCgobj1hLl9zdGFydFRpbWUtYS5fZGVsYXkpPDAmJihzPTEpLGwuYWRkKGEsbikpLGE9bztyZXR1cm4gaC5hZGQobCwwKSxzJiZsLnRvdGFsRHVyYXRpb24oKSxsfSxtLmFkZD1mdW5jdGlvbihzLG4sYSxvKXt2YXIgaCx1LF8sYyxmLHA7aWYoIm51bWJlciIhPXR5cGVvZiBuJiYobj10aGlzLl9wYXJzZVRpbWVPckxhYmVsKG4sMCwhMCxzKSksIShzIGluc3RhbmNlb2YgdCkpe2lmKHMgaW5zdGFuY2VvZiBBcnJheXx8cyYmcy5wdXNoJiZsKHMpKXtmb3IoYT1hfHwibm9ybWFsIixvPW98fDAsaD1uLHU9cy5sZW5ndGgsXz0wO188dTtfKyspbChjPXNbX10pJiYoYz1uZXcgcih7dHdlZW5zOmN9KSksdGhpcy5hZGQoYyxoKSwic3RyaW5nIiE9dHlwZW9mIGMmJiJmdW5jdGlvbiIhPXR5cGVvZiBjJiYoInNlcXVlbmNlIj09PWE/aD1jLl9zdGFydFRpbWUrYy50b3RhbER1cmF0aW9uKCkvYy5fdGltZVNjYWxlOiJzdGFydCI9PT1hJiYoYy5fc3RhcnRUaW1lLT1jLmRlbGF5KCkpKSxoKz1vO3JldHVybiB0aGlzLl91bmNhY2hlKCEwKX1pZigic3RyaW5nIj09dHlwZW9mIHMpcmV0dXJuIHRoaXMuYWRkTGFiZWwocyxuKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcyl0aHJvdyJDYW5ub3QgYWRkICIrcysiIGludG8gdGhlIHRpbWVsaW5lOyBpdCBpcyBub3QgYSB0d2VlbiwgdGltZWxpbmUsIGZ1bmN0aW9uLCBvciBzdHJpbmcuIjtzPWkuZGVsYXllZENhbGwoMCxzKX1pZihlLnByb3RvdHlwZS5hZGQuY2FsbCh0aGlzLHMsbikscy5fdGltZSYmKGg9TWF0aC5tYXgoMCxNYXRoLm1pbihzLnRvdGFsRHVyYXRpb24oKSwodGhpcy5yYXdUaW1lKCktcy5fc3RhcnRUaW1lKSpzLl90aW1lU2NhbGUpKSxNYXRoLmFicyhoLXMuX3RvdGFsVGltZSk+MWUtNSYmcy5yZW5kZXIoaCwhMSwhMSkpLCh0aGlzLl9nY3x8dGhpcy5fdGltZT09PXRoaXMuX2R1cmF0aW9uKSYmIXRoaXMuX3BhdXNlZCYmdGhpcy5fZHVyYXRpb248dGhpcy5kdXJhdGlvbigpKWZvcihwPShmPXRoaXMpLnJhd1RpbWUoKT5zLl9zdGFydFRpbWU7Zi5fdGltZWxpbmU7KXAmJmYuX3RpbWVsaW5lLnNtb290aENoaWxkVGltaW5nP2YudG90YWxUaW1lKGYuX3RvdGFsVGltZSwhMCk6Zi5fZ2MmJmYuX2VuYWJsZWQoITAsITEpLGY9Zi5fdGltZWxpbmU7cmV0dXJuIHRoaXN9LG0ucmVtb3ZlPWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiB0KXt0aGlzLl9yZW1vdmUoZSwhMSk7dmFyIGk9ZS5fdGltZWxpbmU9ZS52YXJzLnVzZUZyYW1lcz90Ll9yb290RnJhbWVzVGltZWxpbmU6dC5fcm9vdFRpbWVsaW5lO3JldHVybiBlLl9zdGFydFRpbWU9KGUuX3BhdXNlZD9lLl9wYXVzZVRpbWU6aS5fdGltZSktKGUuX3JldmVyc2VkP2UudG90YWxEdXJhdGlvbigpLWUuX3RvdGFsVGltZTplLl90b3RhbFRpbWUpL2UuX3RpbWVTY2FsZSx0aGlzfWlmKGUgaW5zdGFuY2VvZiBBcnJheXx8ZSYmZS5wdXNoJiZsKGUpKXtmb3IodmFyIHI9ZS5sZW5ndGg7LS1yPi0xOyl0aGlzLnJlbW92ZShlW3JdKTtyZXR1cm4gdGhpc31yZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/dGhpcy5yZW1vdmVMYWJlbChlKTp0aGlzLmtpbGwobnVsbCxlKX0sbS5fcmVtb3ZlPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIGUucHJvdG90eXBlLl9yZW1vdmUuY2FsbCh0aGlzLHQsaSksdGhpcy5fbGFzdD90aGlzLl90aW1lPnRoaXMuZHVyYXRpb24oKSYmKHRoaXMuX3RpbWU9dGhpcy5fZHVyYXRpb24sdGhpcy5fdG90YWxUaW1lPXRoaXMuX3RvdGFsRHVyYXRpb24pOnRoaXMuX3RpbWU9dGhpcy5fdG90YWxUaW1lPXRoaXMuX2R1cmF0aW9uPXRoaXMuX3RvdGFsRHVyYXRpb249MCx0aGlzfSxtLmFwcGVuZD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmFkZCh0LHRoaXMuX3BhcnNlVGltZU9yTGFiZWwobnVsbCxlLCEwLHQpKX0sbS5pbnNlcnQ9bS5pbnNlcnRNdWx0aXBsZT1mdW5jdGlvbih0LGUsaSxyKXtyZXR1cm4gdGhpcy5hZGQodCxlfHwwLGkscil9LG0uYXBwZW5kTXVsdGlwbGU9ZnVuY3Rpb24odCxlLGkscil7cmV0dXJuIHRoaXMuYWRkKHQsdGhpcy5fcGFyc2VUaW1lT3JMYWJlbChudWxsLGUsITAsdCksaSxyKX0sbS5hZGRMYWJlbD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9sYWJlbHNbdF09dGhpcy5fcGFyc2VUaW1lT3JMYWJlbChlKSx0aGlzfSxtLmFkZFBhdXNlPWZ1bmN0aW9uKHQsZSxyLHMpe3ZhciBuPWkuZGVsYXllZENhbGwoMCxwLHIsc3x8dGhpcyk7cmV0dXJuIG4udmFycy5vbkNvbXBsZXRlPW4udmFycy5vblJldmVyc2VDb21wbGV0ZT1lLG4uZGF0YT0iaXNQYXVzZSIsdGhpcy5faGFzUGF1c2U9ITAsdGhpcy5hZGQobix0KX0sbS5yZW1vdmVMYWJlbD1mdW5jdGlvbih0KXtyZXR1cm4gZGVsZXRlIHRoaXMuX2xhYmVsc1t0XSx0aGlzfSxtLmdldExhYmVsVGltZT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dGhpcy5fbGFiZWxzW3RdP3RoaXMuX2xhYmVsc1t0XTotMX0sbS5fcGFyc2VUaW1lT3JMYWJlbD1mdW5jdGlvbihlLGkscixzKXt2YXIgbixhO2lmKHMgaW5zdGFuY2VvZiB0JiZzLnRpbWVsaW5lPT09dGhpcyl0aGlzLnJlbW92ZShzKTtlbHNlIGlmKHMmJihzIGluc3RhbmNlb2YgQXJyYXl8fHMucHVzaCYmbChzKSkpZm9yKGE9cy5sZW5ndGg7LS1hPi0xOylzW2FdaW5zdGFuY2VvZiB0JiZzW2FdLnRpbWVsaW5lPT09dGhpcyYmdGhpcy5yZW1vdmUoc1thXSk7aWYobj0ibnVtYmVyIiE9dHlwZW9mIGV8fGk/dGhpcy5kdXJhdGlvbigpPjk5OTk5OTk5OTk5P3RoaXMucmVjZW50KCkuZW5kVGltZSghMSk6dGhpcy5fZHVyYXRpb246MCwic3RyaW5nIj09dHlwZW9mIGkpcmV0dXJuIHRoaXMuX3BhcnNlVGltZU9yTGFiZWwoaSxyJiYibnVtYmVyIj09dHlwZW9mIGUmJm51bGw9PXRoaXMuX2xhYmVsc1tpXT9lLW46MCxyKTtpZihpPWl8fDAsInN0cmluZyIhPXR5cGVvZiBlfHwhaXNOYU4oZSkmJm51bGw9PXRoaXMuX2xhYmVsc1tlXSludWxsPT1lJiYoZT1uKTtlbHNle2lmKC0xPT09KGE9ZS5pbmRleE9mKCI9IikpKXJldHVybiBudWxsPT10aGlzLl9sYWJlbHNbZV0/cj90aGlzLl9sYWJlbHNbZV09bitpOmk6dGhpcy5fbGFiZWxzW2VdK2k7aT1wYXJzZUludChlLmNoYXJBdChhLTEpKyIxIiwxMCkqTnVtYmVyKGUuc3Vic3RyKGErMSkpLGU9YT4xP3RoaXMuX3BhcnNlVGltZU9yTGFiZWwoZS5zdWJzdHIoMCxhLTEpLDAscik6bn1yZXR1cm4gTnVtYmVyKGUpK2l9LG0uc2Vlaz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnRvdGFsVGltZSgibnVtYmVyIj09dHlwZW9mIHQ/dDp0aGlzLl9wYXJzZVRpbWVPckxhYmVsKHQpLCExIT09ZSl9LG0uc3RvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBhdXNlZCghMCl9LG0uZ290b0FuZFBsYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wbGF5KHQsZSl9LG0uZ290b0FuZFN0b3A9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wYXVzZSh0LGUpfSxtLnJlbmRlcj1mdW5jdGlvbih0LGUsaSl7dGhpcy5fZ2MmJnRoaXMuX2VuYWJsZWQoITAsITEpO3ZhciByLHMsbixhLG8sbCxfLGM9dGhpcy5fdGltZSxmPXRoaXMuX2RpcnR5P3RoaXMudG90YWxEdXJhdGlvbigpOnRoaXMuX3RvdGFsRHVyYXRpb24scD10aGlzLl9zdGFydFRpbWUsZD10aGlzLl90aW1lU2NhbGUsbT10aGlzLl9wYXVzZWQ7aWYoYyE9PXRoaXMuX3RpbWUmJih0Kz10aGlzLl90aW1lLWMpLHQ+PWYtMWUtNyYmdD49MCl0aGlzLl90b3RhbFRpbWU9dGhpcy5fdGltZT1mLHRoaXMuX3JldmVyc2VkfHx0aGlzLl9oYXNQYXVzZWRDaGlsZCgpfHwocz0hMCxhPSJvbkNvbXBsZXRlIixvPSEhdGhpcy5fdGltZWxpbmUuYXV0b1JlbW92ZUNoaWxkcmVuLDA9PT10aGlzLl9kdXJhdGlvbiYmKHQ8PTAmJnQ+PS0xZS03fHx0aGlzLl9yYXdQcmV2VGltZTwwfHwxZS0xMD09PXRoaXMuX3Jhd1ByZXZUaW1lKSYmdGhpcy5fcmF3UHJldlRpbWUhPT10JiZ0aGlzLl9maXJzdCYmKG89ITAsdGhpcy5fcmF3UHJldlRpbWU+MWUtMTAmJihhPSJvblJldmVyc2VDb21wbGV0ZSIpKSksdGhpcy5fcmF3UHJldlRpbWU9dGhpcy5fZHVyYXRpb258fCFlfHx0fHx0aGlzLl9yYXdQcmV2VGltZT09PXQ/dDoxZS0xMCx0PWYrMWUtNDtlbHNlIGlmKHQ8MWUtNylpZih0aGlzLl90b3RhbFRpbWU9dGhpcy5fdGltZT0wLCgwIT09Y3x8MD09PXRoaXMuX2R1cmF0aW9uJiYxZS0xMCE9PXRoaXMuX3Jhd1ByZXZUaW1lJiYodGhpcy5fcmF3UHJldlRpbWU+MHx8dDwwJiZ0aGlzLl9yYXdQcmV2VGltZT49MCkpJiYoYT0ib25SZXZlcnNlQ29tcGxldGUiLHM9dGhpcy5fcmV2ZXJzZWQpLHQ8MCl0aGlzLl9hY3RpdmU9ITEsdGhpcy5fdGltZWxpbmUuYXV0b1JlbW92ZUNoaWxkcmVuJiZ0aGlzLl9yZXZlcnNlZD8obz1zPSEwLGE9Im9uUmV2ZXJzZUNvbXBsZXRlIik6dGhpcy5fcmF3UHJldlRpbWU+PTAmJnRoaXMuX2ZpcnN0JiYobz0hMCksdGhpcy5fcmF3UHJldlRpbWU9dDtlbHNle2lmKHRoaXMuX3Jhd1ByZXZUaW1lPXRoaXMuX2R1cmF0aW9ufHwhZXx8dHx8dGhpcy5fcmF3UHJldlRpbWU9PT10P3Q6MWUtMTAsMD09PXQmJnMpZm9yKHI9dGhpcy5fZmlyc3Q7ciYmMD09PXIuX3N0YXJ0VGltZTspci5fZHVyYXRpb258fChzPSExKSxyPXIuX25leHQ7dD0wLHRoaXMuX2luaXR0ZWR8fChvPSEwKX1lbHNle2lmKHRoaXMuX2hhc1BhdXNlJiYhdGhpcy5fZm9yY2luZ1BsYXloZWFkJiYhZSl7aWYodD49Yylmb3Iocj10aGlzLl9maXJzdDtyJiZyLl9zdGFydFRpbWU8PXQmJiFsOylyLl9kdXJhdGlvbnx8ImlzUGF1c2UiIT09ci5kYXRhfHxyLnJhdGlvfHwwPT09ci5fc3RhcnRUaW1lJiYwPT09dGhpcy5fcmF3UHJldlRpbWV8fChsPXIpLHI9ci5fbmV4dDtlbHNlIGZvcihyPXRoaXMuX2xhc3Q7ciYmci5fc3RhcnRUaW1lPj10JiYhbDspci5fZHVyYXRpb258fCJpc1BhdXNlIj09PXIuZGF0YSYmci5fcmF3UHJldlRpbWU+MCYmKGw9cikscj1yLl9wcmV2O2wmJih0aGlzLl90aW1lPXQ9bC5fc3RhcnRUaW1lLHRoaXMuX3RvdGFsVGltZT10K3RoaXMuX2N5Y2xlKih0aGlzLl90b3RhbER1cmF0aW9uK3RoaXMuX3JlcGVhdERlbGF5KSl9dGhpcy5fdG90YWxUaW1lPXRoaXMuX3RpbWU9dGhpcy5fcmF3UHJldlRpbWU9dH1pZih0aGlzLl90aW1lIT09YyYmdGhpcy5fZmlyc3R8fGl8fG98fGwpe2lmKHRoaXMuX2luaXR0ZWR8fCh0aGlzLl9pbml0dGVkPSEwKSx0aGlzLl9hY3RpdmV8fCF0aGlzLl9wYXVzZWQmJnRoaXMuX3RpbWUhPT1jJiZ0PjAmJih0aGlzLl9hY3RpdmU9ITApLDA9PT1jJiZ0aGlzLnZhcnMub25TdGFydCYmKDA9PT10aGlzLl90aW1lJiZ0aGlzLl9kdXJhdGlvbnx8ZXx8dGhpcy5fY2FsbGJhY2soIm9uU3RhcnQiKSksKF89dGhpcy5fdGltZSk+PWMpZm9yKHI9dGhpcy5fZmlyc3Q7ciYmKG49ci5fbmV4dCxfPT09dGhpcy5fdGltZSYmKCF0aGlzLl9wYXVzZWR8fG0pKTspKHIuX2FjdGl2ZXx8ci5fc3RhcnRUaW1lPD1fJiYhci5fcGF1c2VkJiYhci5fZ2MpJiYobD09PXImJnRoaXMucGF1c2UoKSxyLl9yZXZlcnNlZD9yLnJlbmRlcigoci5fZGlydHk/ci50b3RhbER1cmF0aW9uKCk6ci5fdG90YWxEdXJhdGlvbiktKHQtci5fc3RhcnRUaW1lKSpyLl90aW1lU2NhbGUsZSxpKTpyLnJlbmRlcigodC1yLl9zdGFydFRpbWUpKnIuX3RpbWVTY2FsZSxlLGkpKSxyPW47ZWxzZSBmb3Iocj10aGlzLl9sYXN0O3ImJihuPXIuX3ByZXYsXz09PXRoaXMuX3RpbWUmJighdGhpcy5fcGF1c2VkfHxtKSk7KXtpZihyLl9hY3RpdmV8fHIuX3N0YXJ0VGltZTw9YyYmIXIuX3BhdXNlZCYmIXIuX2djKXtpZihsPT09cil7Zm9yKGw9ci5fcHJldjtsJiZsLmVuZFRpbWUoKT50aGlzLl90aW1lOylsLnJlbmRlcihsLl9yZXZlcnNlZD9sLnRvdGFsRHVyYXRpb24oKS0odC1sLl9zdGFydFRpbWUpKmwuX3RpbWVTY2FsZToodC1sLl9zdGFydFRpbWUpKmwuX3RpbWVTY2FsZSxlLGkpLGw9bC5fcHJldjtsPW51bGwsdGhpcy5wYXVzZSgpfXIuX3JldmVyc2VkP3IucmVuZGVyKChyLl9kaXJ0eT9yLnRvdGFsRHVyYXRpb24oKTpyLl90b3RhbER1cmF0aW9uKS0odC1yLl9zdGFydFRpbWUpKnIuX3RpbWVTY2FsZSxlLGkpOnIucmVuZGVyKCh0LXIuX3N0YXJ0VGltZSkqci5fdGltZVNjYWxlLGUsaSl9cj1ufXRoaXMuX29uVXBkYXRlJiYoZXx8KGgubGVuZ3RoJiZ1KCksdGhpcy5fY2FsbGJhY2soIm9uVXBkYXRlIikpKSxhJiYodGhpcy5fZ2N8fHAhPT10aGlzLl9zdGFydFRpbWUmJmQ9PT10aGlzLl90aW1lU2NhbGV8fCgwPT09dGhpcy5fdGltZXx8Zj49dGhpcy50b3RhbER1cmF0aW9uKCkpJiYocyYmKGgubGVuZ3RoJiZ1KCksdGhpcy5fdGltZWxpbmUuYXV0b1JlbW92ZUNoaWxkcmVuJiZ0aGlzLl9lbmFibGVkKCExLCExKSx0aGlzLl9hY3RpdmU9ITEpLCFlJiZ0aGlzLnZhcnNbYV0mJnRoaXMuX2NhbGxiYWNrKGEpKSl9fSxtLl9oYXNQYXVzZWRDaGlsZD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9maXJzdDt0Oyl7aWYodC5fcGF1c2VkfHx0IGluc3RhbmNlb2YgciYmdC5faGFzUGF1c2VkQ2hpbGQoKSlyZXR1cm4hMDt0PXQuX25leHR9cmV0dXJuITF9LG0uZ2V0Q2hpbGRyZW49ZnVuY3Rpb24odCxlLHIscyl7cz1zfHwtOTk5OTk5OTk5OTtmb3IodmFyIG49W10sYT10aGlzLl9maXJzdCxvPTA7YTspYS5fc3RhcnRUaW1lPHN8fChhIGluc3RhbmNlb2YgaT8hMSE9PWUmJihuW28rK109YSk6KCExIT09ciYmKG5bbysrXT1hKSwhMSE9PXQmJihvPShuPW4uY29uY2F0KGEuZ2V0Q2hpbGRyZW4oITAsZSxyKSkpLmxlbmd0aCkpKSxhPWEuX25leHQ7cmV0dXJuIG59LG0uZ2V0VHdlZW5zT2Y9ZnVuY3Rpb24odCxlKXt2YXIgcixzLG49dGhpcy5fZ2MsYT1bXSxvPTA7Zm9yKG4mJnRoaXMuX2VuYWJsZWQoITAsITApLHM9KHI9aS5nZXRUd2VlbnNPZih0KSkubGVuZ3RoOy0tcz4tMTspKHJbc10udGltZWxpbmU9PT10aGlzfHxlJiZ0aGlzLl9jb250YWlucyhyW3NdKSkmJihhW28rK109cltzXSk7cmV0dXJuIG4mJnRoaXMuX2VuYWJsZWQoITEsITApLGF9LG0ucmVjZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlY2VudH0sbS5fY29udGFpbnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQudGltZWxpbmU7ZTspe2lmKGU9PT10aGlzKXJldHVybiEwO2U9ZS50aW1lbGluZX1yZXR1cm4hMX0sbS5zaGlmdENoaWxkcmVuPWZ1bmN0aW9uKHQsZSxpKXtpPWl8fDA7Zm9yKHZhciByLHM9dGhpcy5fZmlyc3Qsbj10aGlzLl9sYWJlbHM7czspcy5fc3RhcnRUaW1lPj1pJiYocy5fc3RhcnRUaW1lKz10KSxzPXMuX25leHQ7aWYoZSlmb3IociBpbiBuKW5bcl0+PWkmJihuW3JdKz10KTtyZXR1cm4gdGhpcy5fdW5jYWNoZSghMCl9LG0uX2tpbGw9ZnVuY3Rpb24odCxlKXtpZighdCYmIWUpcmV0dXJuIHRoaXMuX2VuYWJsZWQoITEsITEpO2Zvcih2YXIgaT1lP3RoaXMuZ2V0VHdlZW5zT2YoZSk6dGhpcy5nZXRDaGlsZHJlbighMCwhMCwhMSkscj1pLmxlbmd0aCxzPSExOy0tcj4tMTspaVtyXS5fa2lsbCh0LGUpJiYocz0hMCk7cmV0dXJuIHN9LG0uY2xlYXI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRDaGlsZHJlbighMSwhMCwhMCksaT1lLmxlbmd0aDtmb3IodGhpcy5fdGltZT10aGlzLl90b3RhbFRpbWU9MDstLWk+LTE7KWVbaV0uX2VuYWJsZWQoITEsITEpO3JldHVybiExIT09dCYmKHRoaXMuX2xhYmVscz17fSksdGhpcy5fdW5jYWNoZSghMCl9LG0uaW52YWxpZGF0ZT1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLl9maXJzdDtlOyllLmludmFsaWRhdGUoKSxlPWUuX25leHQ7cmV0dXJuIHQucHJvdG90eXBlLmludmFsaWRhdGUuY2FsbCh0aGlzKX0sbS5fZW5hYmxlZD1mdW5jdGlvbih0LGkpe2lmKHQ9PT10aGlzLl9nYylmb3IodmFyIHI9dGhpcy5fZmlyc3Q7cjspci5fZW5hYmxlZCh0LCEwKSxyPXIuX25leHQ7cmV0dXJuIGUucHJvdG90eXBlLl9lbmFibGVkLmNhbGwodGhpcyx0LGkpfSxtLnRvdGFsVGltZT1mdW5jdGlvbihlLGkscil7dGhpcy5fZm9yY2luZ1BsYXloZWFkPSEwO3ZhciBzPXQucHJvdG90eXBlLnRvdGFsVGltZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMuX2ZvcmNpbmdQbGF5aGVhZD0hMSxzfSxtLmR1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPygwIT09dGhpcy5kdXJhdGlvbigpJiYwIT09dCYmdGhpcy50aW1lU2NhbGUodGhpcy5fZHVyYXRpb24vdCksdGhpcyk6KHRoaXMuX2RpcnR5JiZ0aGlzLnRvdGFsRHVyYXRpb24oKSx0aGlzLl9kdXJhdGlvbil9LG0udG90YWxEdXJhdGlvbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aCl7aWYodGhpcy5fZGlydHkpe2Zvcih2YXIgZSxpLHI9MCxzPXRoaXMuX2xhc3Qsbj05OTk5OTk5OTk5OTk7czspZT1zLl9wcmV2LHMuX2RpcnR5JiZzLnRvdGFsRHVyYXRpb24oKSxzLl9zdGFydFRpbWU+biYmdGhpcy5fc29ydENoaWxkcmVuJiYhcy5fcGF1c2VkJiYhdGhpcy5fY2FsY3VsYXRpbmdEdXJhdGlvbj8odGhpcy5fY2FsY3VsYXRpbmdEdXJhdGlvbj0xLHRoaXMuYWRkKHMscy5fc3RhcnRUaW1lLXMuX2RlbGF5KSx0aGlzLl9jYWxjdWxhdGluZ0R1cmF0aW9uPTApOm49cy5fc3RhcnRUaW1lLHMuX3N0YXJ0VGltZTwwJiYhcy5fcGF1c2VkJiYoci09cy5fc3RhcnRUaW1lLHRoaXMuX3RpbWVsaW5lLnNtb290aENoaWxkVGltaW5nJiYodGhpcy5fc3RhcnRUaW1lKz1zLl9zdGFydFRpbWUvdGhpcy5fdGltZVNjYWxlLHRoaXMuX3RpbWUtPXMuX3N0YXJ0VGltZSx0aGlzLl90b3RhbFRpbWUtPXMuX3N0YXJ0VGltZSx0aGlzLl9yYXdQcmV2VGltZS09cy5fc3RhcnRUaW1lKSx0aGlzLnNoaWZ0Q2hpbGRyZW4oLXMuX3N0YXJ0VGltZSwhMSwtOTk5OTk5OTk5OSksbj0wKSwoaT1zLl9zdGFydFRpbWUrcy5fdG90YWxEdXJhdGlvbi9zLl90aW1lU2NhbGUpPnImJihyPWkpLHM9ZTt0aGlzLl9kdXJhdGlvbj10aGlzLl90b3RhbER1cmF0aW9uPXIsdGhpcy5fZGlydHk9ITF9cmV0dXJuIHRoaXMuX3RvdGFsRHVyYXRpb259cmV0dXJuIHQmJnRoaXMudG90YWxEdXJhdGlvbigpP3RoaXMudGltZVNjYWxlKHRoaXMuX3RvdGFsRHVyYXRpb24vdCk6dGhpc30sbS5wYXVzZWQ9ZnVuY3Rpb24oZSl7aWYoIWUpZm9yKHZhciBpPXRoaXMuX2ZpcnN0LHI9dGhpcy5fdGltZTtpOylpLl9zdGFydFRpbWU9PT1yJiYiaXNQYXVzZSI9PT1pLmRhdGEmJihpLl9yYXdQcmV2VGltZT0wKSxpPWkuX25leHQ7cmV0dXJuIHQucHJvdG90eXBlLnBhdXNlZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG0udXNlc0ZyYW1lcz1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLl90aW1lbGluZTtlLl90aW1lbGluZTspZT1lLl90aW1lbGluZTtyZXR1cm4gZT09PXQuX3Jvb3RGcmFtZXNUaW1lbGluZX0sbS5yYXdUaW1lPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYodGhpcy5fcGF1c2VkfHx0aGlzLl9yZXBlYXQmJnRoaXMudGltZSgpPjAmJnRoaXMudG90YWxQcm9ncmVzcygpPDEpP3RoaXMuX3RvdGFsVGltZSUodGhpcy5fZHVyYXRpb24rdGhpcy5fcmVwZWF0RGVsYXkpOnRoaXMuX3BhdXNlZD90aGlzLl90b3RhbFRpbWU6KHRoaXMuX3RpbWVsaW5lLnJhd1RpbWUodCktdGhpcy5fc3RhcnRUaW1lKSp0aGlzLl90aW1lU2NhbGV9LHJ9LCEwKX0pLG8uX2dzRGVmaW5lJiZvLl9nc1F1ZXVlLnBvcCgpKCksZnVuY3Rpb24ocil7InVzZSBzdHJpY3QiO3ZhciBsPWZ1bmN0aW9uKCl7cmV0dXJuKG8uR3JlZW5Tb2NrR2xvYmFsc3x8bykuVGltZWxpbmVNYXh9O3ZvaWQgMCE9PXQmJnQuZXhwb3J0cz8oaSgzKSx0LmV4cG9ydHM9bCgpKToobj1baSgzKV0sdm9pZCAwPT09KGE9ImZ1bmN0aW9uIj09dHlwZW9mKHM9bCk/cy5hcHBseShlLG4pOnMpfHwodC5leHBvcnRzPWEpKX0oKX0pLmNhbGwodGhpcyxpKDEpKX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtpLnIoZSk7dmFyIHI9aSgwKTsNCi8qIQ0KICogVkVSU0lPTjogMi4wLjINCiAqIERBVEU6IDIwMTgtMDgtMjcNCiAqIFVQREFURVMgQU5EIERPQ1MgQVQ6IGh0dHA6Ly9ncmVlbnNvY2suY29tDQogKg0KICogQGxpY2Vuc2UgQ29weXJpZ2h0IChjKSAyMDA4LTIwMTgsIEdyZWVuU29jay4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAqIFRoaXMgd29yayBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhdCBodHRwOi8vZ3JlZW5zb2NrLmNvbS9zdGFuZGFyZC1saWNlbnNlIG9yIGZvcg0KICogQ2x1YiBHcmVlblNvY2sgbWVtYmVycywgdGhlIHNvZnR3YXJlIGFncmVlbWVudCB0aGF0IHdhcyBpc3N1ZWQgd2l0aCB5b3VyIG1lbWJlcnNoaXAuDQogKiANCiAqIEBhdXRob3I6IEphY2sgRG95bGUsIGphY2tAZ3JlZW5zb2NrLmNvbQ0KICovci5rLl9nc0RlZmluZSgiVGltZWxpbmVMaXRlIixbImNvcmUuQW5pbWF0aW9uIiwiY29yZS5TaW1wbGVUaW1lbGluZSIsIlR3ZWVuTGl0ZSJdLGZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24odCl7ci5pLmNhbGwodGhpcyx0KSx0aGlzLl9sYWJlbHM9e30sdGhpcy5hdXRvUmVtb3ZlQ2hpbGRyZW49ITA9PT10aGlzLnZhcnMuYXV0b1JlbW92ZUNoaWxkcmVuLHRoaXMuc21vb3RoQ2hpbGRUaW1pbmc9ITA9PT10aGlzLnZhcnMuc21vb3RoQ2hpbGRUaW1pbmcsdGhpcy5fc29ydENoaWxkcmVuPSEwLHRoaXMuX29uVXBkYXRlPXRoaXMudmFycy5vblVwZGF0ZTt2YXIgZSxpLHM9dGhpcy52YXJzO2ZvcihpIGluIHMpZT1zW2ldLG4oZSkmJi0xIT09ZS5qb2luKCIiKS5pbmRleE9mKCJ7c2VsZn0iKSYmKHNbaV09dGhpcy5fc3dhcFNlbGZJblBhcmFtcyhlKSk7bihzLnR3ZWVucykmJnRoaXMuYWRkKHMudHdlZW5zLDAscy5hbGlnbixzLnN0YWdnZXIpfSxlPXIubC5faW50ZXJuYWxzLGk9dC5faW50ZXJuYWxzPXt9LHM9ZS5pc1NlbGVjdG9yLG49ZS5pc0FycmF5LGE9ZS5sYXp5VHdlZW5zLG89ZS5sYXp5UmVuZGVyLGw9ci5rLl9nc0RlZmluZS5nbG9iYWxzLGg9ZnVuY3Rpb24odCl7dmFyIGUsaT17fTtmb3IoZSBpbiB0KWlbZV09dFtlXTtyZXR1cm4gaX0sdT1mdW5jdGlvbih0LGUsaSl7dmFyIHIscyxuPXQuY3ljbGU7Zm9yKHIgaW4gbilzPW5bcl0sdFtyXT0iZnVuY3Rpb24iPT10eXBlb2Ygcz9zKGksZVtpXSk6c1tpJXMubGVuZ3RoXTtkZWxldGUgdC5jeWNsZX0sXz1pLnBhdXNlQ2FsbGJhY2s9ZnVuY3Rpb24oKXt9LGM9ZnVuY3Rpb24odCl7dmFyIGUsaT1bXSxyPXQubGVuZ3RoO2ZvcihlPTA7ZSE9PXI7aS5wdXNoKHRbZSsrXSkpO3JldHVybiBpfSxmPXQucHJvdG90eXBlPW5ldyByLmk7cmV0dXJuIHQudmVyc2lvbj0iMi4wLjIiLGYuY29uc3RydWN0b3I9dCxmLmtpbGwoKS5fZ2M9Zi5fZm9yY2luZ1BsYXloZWFkPWYuX2hhc1BhdXNlPSExLGYudG89ZnVuY3Rpb24odCxlLGkscyl7dmFyIG49aS5yZXBlYXQmJmwuVHdlZW5NYXh8fHIubDtyZXR1cm4gZT90aGlzLmFkZChuZXcgbih0LGUsaSkscyk6dGhpcy5zZXQodCxpLHMpfSxmLmZyb209ZnVuY3Rpb24odCxlLGkscyl7cmV0dXJuIHRoaXMuYWRkKChpLnJlcGVhdCYmbC5Ud2Vlbk1heHx8ci5sKS5mcm9tKHQsZSxpKSxzKX0sZi5mcm9tVG89ZnVuY3Rpb24odCxlLGkscyxuKXt2YXIgYT1zLnJlcGVhdCYmbC5Ud2Vlbk1heHx8ci5sO3JldHVybiBlP3RoaXMuYWRkKGEuZnJvbVRvKHQsZSxpLHMpLG4pOnRoaXMuc2V0KHQscyxuKX0sZi5zdGFnZ2VyVG89ZnVuY3Rpb24oZSxpLG4sYSxvLGwsXyxmKXt2YXIgcCxkLG09bmV3IHQoe29uQ29tcGxldGU6bCxvbkNvbXBsZXRlUGFyYW1zOl8sY2FsbGJhY2tTY29wZTpmLHNtb290aENoaWxkVGltaW5nOnRoaXMuc21vb3RoQ2hpbGRUaW1pbmd9KSxnPW4uY3ljbGU7Zm9yKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9ci5sLnNlbGVjdG9yKGUpfHxlKSxzKGU9ZXx8W10pJiYoZT1jKGUpKSwoYT1hfHwwKTwwJiYoKGU9YyhlKSkucmV2ZXJzZSgpLGEqPS0xKSxkPTA7ZDxlLmxlbmd0aDtkKyspKHA9aChuKSkuc3RhcnRBdCYmKHAuc3RhcnRBdD1oKHAuc3RhcnRBdCkscC5zdGFydEF0LmN5Y2xlJiZ1KHAuc3RhcnRBdCxlLGQpKSxnJiYodShwLGUsZCksbnVsbCE9cC5kdXJhdGlvbiYmKGk9cC5kdXJhdGlvbixkZWxldGUgcC5kdXJhdGlvbikpLG0udG8oZVtkXSxpLHAsZCphKTtyZXR1cm4gdGhpcy5hZGQobSxvKX0sZi5zdGFnZ2VyRnJvbT1mdW5jdGlvbih0LGUsaSxyLHMsbixhLG8pe3JldHVybiBpLmltbWVkaWF0ZVJlbmRlcj0wIT1pLmltbWVkaWF0ZVJlbmRlcixpLnJ1bkJhY2t3YXJkcz0hMCx0aGlzLnN0YWdnZXJUbyh0LGUsaSxyLHMsbixhLG8pfSxmLnN0YWdnZXJGcm9tVG89ZnVuY3Rpb24odCxlLGkscixzLG4sYSxvLGwpe3JldHVybiByLnN0YXJ0QXQ9aSxyLmltbWVkaWF0ZVJlbmRlcj0wIT1yLmltbWVkaWF0ZVJlbmRlciYmMCE9aS5pbW1lZGlhdGVSZW5kZXIsdGhpcy5zdGFnZ2VyVG8odCxlLHIscyxuLGEsbyxsKX0sZi5jYWxsPWZ1bmN0aW9uKHQsZSxpLHMpe3JldHVybiB0aGlzLmFkZChyLmwuZGVsYXllZENhbGwoMCx0LGUsaSkscyl9LGYuc2V0PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gaT10aGlzLl9wYXJzZVRpbWVPckxhYmVsKGksMCwhMCksbnVsbD09ZS5pbW1lZGlhdGVSZW5kZXImJihlLmltbWVkaWF0ZVJlbmRlcj1pPT09dGhpcy5fdGltZSYmIXRoaXMuX3BhdXNlZCksdGhpcy5hZGQobmV3IHIubCh0LDAsZSksaSl9LHQuZXhwb3J0Um9vdD1mdW5jdGlvbihlLGkpe251bGw9PShlPWV8fHt9KS5zbW9vdGhDaGlsZFRpbWluZyYmKGUuc21vb3RoQ2hpbGRUaW1pbmc9ITApO3ZhciBzLG4sYSxvLGw9bmV3IHQoZSksaD1sLl90aW1lbGluZTtmb3IobnVsbD09aSYmKGk9ITApLGguX3JlbW92ZShsLCEwKSxsLl9zdGFydFRpbWU9MCxsLl9yYXdQcmV2VGltZT1sLl90aW1lPWwuX3RvdGFsVGltZT1oLl90aW1lLGE9aC5fZmlyc3Q7YTspbz1hLl9uZXh0LGkmJmEgaW5zdGFuY2VvZiByLmwmJmEudGFyZ2V0PT09YS52YXJzLm9uQ29tcGxldGV8fCgobj1hLl9zdGFydFRpbWUtYS5fZGVsYXkpPDAmJihzPTEpLGwuYWRkKGEsbikpLGE9bztyZXR1cm4gaC5hZGQobCwwKSxzJiZsLnRvdGFsRHVyYXRpb24oKSxsfSxmLmFkZD1mdW5jdGlvbihlLGkscyxhKXt2YXIgbyxsLGgsdSxfLGM7aWYoIm51bWJlciIhPXR5cGVvZiBpJiYoaT10aGlzLl9wYXJzZVRpbWVPckxhYmVsKGksMCwhMCxlKSksIShlIGluc3RhbmNlb2Ygci5hKSl7aWYoZSBpbnN0YW5jZW9mIEFycmF5fHxlJiZlLnB1c2gmJm4oZSkpe2ZvcihzPXN8fCJub3JtYWwiLGE9YXx8MCxvPWksbD1lLmxlbmd0aCxoPTA7aDxsO2grKyluKHU9ZVtoXSkmJih1PW5ldyB0KHt0d2VlbnM6dX0pKSx0aGlzLmFkZCh1LG8pLCJzdHJpbmciIT10eXBlb2YgdSYmImZ1bmN0aW9uIiE9dHlwZW9mIHUmJigic2VxdWVuY2UiPT09cz9vPXUuX3N0YXJ0VGltZSt1LnRvdGFsRHVyYXRpb24oKS91Ll90aW1lU2NhbGU6InN0YXJ0Ij09PXMmJih1Ll9zdGFydFRpbWUtPXUuZGVsYXkoKSkpLG8rPWE7cmV0dXJuIHRoaXMuX3VuY2FjaGUoITApfWlmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gdGhpcy5hZGRMYWJlbChlLGkpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IkNhbm5vdCBhZGQgIitlKyIgaW50byB0aGUgdGltZWxpbmU7IGl0IGlzIG5vdCBhIHR3ZWVuLCB0aW1lbGluZSwgZnVuY3Rpb24sIG9yIHN0cmluZy4iO2U9ci5sLmRlbGF5ZWRDYWxsKDAsZSl9aWYoci5pLnByb3RvdHlwZS5hZGQuY2FsbCh0aGlzLGUsaSksZS5fdGltZSYmKG89TWF0aC5tYXgoMCxNYXRoLm1pbihlLnRvdGFsRHVyYXRpb24oKSwodGhpcy5yYXdUaW1lKCktZS5fc3RhcnRUaW1lKSplLl90aW1lU2NhbGUpKSxNYXRoLmFicyhvLWUuX3RvdGFsVGltZSk+MWUtNSYmZS5yZW5kZXIobywhMSwhMSkpLCh0aGlzLl9nY3x8dGhpcy5fdGltZT09PXRoaXMuX2R1cmF0aW9uKSYmIXRoaXMuX3BhdXNlZCYmdGhpcy5fZHVyYXRpb248dGhpcy5kdXJhdGlvbigpKWZvcihjPShfPXRoaXMpLnJhd1RpbWUoKT5lLl9zdGFydFRpbWU7Xy5fdGltZWxpbmU7KWMmJl8uX3RpbWVsaW5lLnNtb290aENoaWxkVGltaW5nP18udG90YWxUaW1lKF8uX3RvdGFsVGltZSwhMCk6Xy5fZ2MmJl8uX2VuYWJsZWQoITAsITEpLF89Xy5fdGltZWxpbmU7cmV0dXJuIHRoaXN9LGYucmVtb3ZlPWZ1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiByLmEpe3RoaXMuX3JlbW92ZSh0LCExKTt2YXIgZT10Ll90aW1lbGluZT10LnZhcnMudXNlRnJhbWVzP3IuYS5fcm9vdEZyYW1lc1RpbWVsaW5lOnIuYS5fcm9vdFRpbWVsaW5lO3JldHVybiB0Ll9zdGFydFRpbWU9KHQuX3BhdXNlZD90Ll9wYXVzZVRpbWU6ZS5fdGltZSktKHQuX3JldmVyc2VkP3QudG90YWxEdXJhdGlvbigpLXQuX3RvdGFsVGltZTp0Ll90b3RhbFRpbWUpL3QuX3RpbWVTY2FsZSx0aGlzfWlmKHQgaW5zdGFuY2VvZiBBcnJheXx8dCYmdC5wdXNoJiZuKHQpKXtmb3IodmFyIGk9dC5sZW5ndGg7LS1pPi0xOyl0aGlzLnJlbW92ZSh0W2ldKTtyZXR1cm4gdGhpc31yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/dGhpcy5yZW1vdmVMYWJlbCh0KTp0aGlzLmtpbGwobnVsbCx0KX0sZi5fcmVtb3ZlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIuaS5wcm90b3R5cGUuX3JlbW92ZS5jYWxsKHRoaXMsdCxlKSx0aGlzLl9sYXN0P3RoaXMuX3RpbWU+dGhpcy5kdXJhdGlvbigpJiYodGhpcy5fdGltZT10aGlzLl9kdXJhdGlvbix0aGlzLl90b3RhbFRpbWU9dGhpcy5fdG90YWxEdXJhdGlvbik6dGhpcy5fdGltZT10aGlzLl90b3RhbFRpbWU9dGhpcy5fZHVyYXRpb249dGhpcy5fdG90YWxEdXJhdGlvbj0wLHRoaXN9LGYuYXBwZW5kPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYWRkKHQsdGhpcy5fcGFyc2VUaW1lT3JMYWJlbChudWxsLGUsITAsdCkpfSxmLmluc2VydD1mLmluc2VydE11bHRpcGxlPWZ1bmN0aW9uKHQsZSxpLHIpe3JldHVybiB0aGlzLmFkZCh0LGV8fDAsaSxyKX0sZi5hcHBlbmRNdWx0aXBsZT1mdW5jdGlvbih0LGUsaSxyKXtyZXR1cm4gdGhpcy5hZGQodCx0aGlzLl9wYXJzZVRpbWVPckxhYmVsKG51bGwsZSwhMCx0KSxpLHIpfSxmLmFkZExhYmVsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2xhYmVsc1t0XT10aGlzLl9wYXJzZVRpbWVPckxhYmVsKGUpLHRoaXN9LGYuYWRkUGF1c2U9ZnVuY3Rpb24odCxlLGkscyl7dmFyIG49ci5sLmRlbGF5ZWRDYWxsKDAsXyxpLHN8fHRoaXMpO3JldHVybiBuLnZhcnMub25Db21wbGV0ZT1uLnZhcnMub25SZXZlcnNlQ29tcGxldGU9ZSxuLmRhdGE9ImlzUGF1c2UiLHRoaXMuX2hhc1BhdXNlPSEwLHRoaXMuYWRkKG4sdCl9LGYucmVtb3ZlTGFiZWw9ZnVuY3Rpb24odCl7cmV0dXJuIGRlbGV0ZSB0aGlzLl9sYWJlbHNbdF0sdGhpc30sZi5nZXRMYWJlbFRpbWU9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXRoaXMuX2xhYmVsc1t0XT90aGlzLl9sYWJlbHNbdF06LTF9LGYuX3BhcnNlVGltZU9yTGFiZWw9ZnVuY3Rpb24odCxlLGkscyl7dmFyIGEsbztpZihzIGluc3RhbmNlb2Ygci5hJiZzLnRpbWVsaW5lPT09dGhpcyl0aGlzLnJlbW92ZShzKTtlbHNlIGlmKHMmJihzIGluc3RhbmNlb2YgQXJyYXl8fHMucHVzaCYmbihzKSkpZm9yKG89cy5sZW5ndGg7LS1vPi0xOylzW29daW5zdGFuY2VvZiByLmEmJnNbb10udGltZWxpbmU9PT10aGlzJiZ0aGlzLnJlbW92ZShzW29dKTtpZihhPSJudW1iZXIiIT10eXBlb2YgdHx8ZT90aGlzLmR1cmF0aW9uKCk+OTk5OTk5OTk5OTk/dGhpcy5yZWNlbnQoKS5lbmRUaW1lKCExKTp0aGlzLl9kdXJhdGlvbjowLCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gdGhpcy5fcGFyc2VUaW1lT3JMYWJlbChlLGkmJiJudW1iZXIiPT10eXBlb2YgdCYmbnVsbD09dGhpcy5fbGFiZWxzW2VdP3QtYTowLGkpO2lmKGU9ZXx8MCwic3RyaW5nIiE9dHlwZW9mIHR8fCFpc05hTih0KSYmbnVsbD09dGhpcy5fbGFiZWxzW3RdKW51bGw9PXQmJih0PWEpO2Vsc2V7aWYoLTE9PT0obz10LmluZGV4T2YoIj0iKSkpcmV0dXJuIG51bGw9PXRoaXMuX2xhYmVsc1t0XT9pP3RoaXMuX2xhYmVsc1t0XT1hK2U6ZTp0aGlzLl9sYWJlbHNbdF0rZTtlPXBhcnNlSW50KHQuY2hhckF0KG8tMSkrIjEiLDEwKSpOdW1iZXIodC5zdWJzdHIobysxKSksdD1vPjE/dGhpcy5fcGFyc2VUaW1lT3JMYWJlbCh0LnN1YnN0cigwLG8tMSksMCxpKTphfXJldHVybiBOdW1iZXIodCkrZX0sZi5zZWVrPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudG90YWxUaW1lKCJudW1iZXIiPT10eXBlb2YgdD90OnRoaXMuX3BhcnNlVGltZU9yTGFiZWwodCksITEhPT1lKX0sZi5zdG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGF1c2VkKCEwKX0sZi5nb3RvQW5kUGxheT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnBsYXkodCxlKX0sZi5nb3RvQW5kU3RvcD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnBhdXNlKHQsZSl9LGYucmVuZGVyPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9nYyYmdGhpcy5fZW5hYmxlZCghMCwhMSk7dmFyIHIscyxuLGwsaCx1LF8sYz10aGlzLl90aW1lLGY9dGhpcy5fZGlydHk/dGhpcy50b3RhbER1cmF0aW9uKCk6dGhpcy5fdG90YWxEdXJhdGlvbixwPXRoaXMuX3N0YXJ0VGltZSxkPXRoaXMuX3RpbWVTY2FsZSxtPXRoaXMuX3BhdXNlZDtpZihjIT09dGhpcy5fdGltZSYmKHQrPXRoaXMuX3RpbWUtYyksdD49Zi0xZS03JiZ0Pj0wKXRoaXMuX3RvdGFsVGltZT10aGlzLl90aW1lPWYsdGhpcy5fcmV2ZXJzZWR8fHRoaXMuX2hhc1BhdXNlZENoaWxkKCl8fChzPSEwLGw9Im9uQ29tcGxldGUiLGg9ISF0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4sMD09PXRoaXMuX2R1cmF0aW9uJiYodDw9MCYmdD49LTFlLTd8fHRoaXMuX3Jhd1ByZXZUaW1lPDB8fDFlLTEwPT09dGhpcy5fcmF3UHJldlRpbWUpJiZ0aGlzLl9yYXdQcmV2VGltZSE9PXQmJnRoaXMuX2ZpcnN0JiYoaD0hMCx0aGlzLl9yYXdQcmV2VGltZT4xZS0xMCYmKGw9Im9uUmV2ZXJzZUNvbXBsZXRlIikpKSx0aGlzLl9yYXdQcmV2VGltZT10aGlzLl9kdXJhdGlvbnx8IWV8fHR8fHRoaXMuX3Jhd1ByZXZUaW1lPT09dD90OjFlLTEwLHQ9ZisxZS00O2Vsc2UgaWYodDwxZS03KWlmKHRoaXMuX3RvdGFsVGltZT10aGlzLl90aW1lPTAsKDAhPT1jfHwwPT09dGhpcy5fZHVyYXRpb24mJjFlLTEwIT09dGhpcy5fcmF3UHJldlRpbWUmJih0aGlzLl9yYXdQcmV2VGltZT4wfHx0PDAmJnRoaXMuX3Jhd1ByZXZUaW1lPj0wKSkmJihsPSJvblJldmVyc2VDb21wbGV0ZSIscz10aGlzLl9yZXZlcnNlZCksdDwwKXRoaXMuX2FjdGl2ZT0hMSx0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4mJnRoaXMuX3JldmVyc2VkPyhoPXM9ITAsbD0ib25SZXZlcnNlQ29tcGxldGUiKTp0aGlzLl9yYXdQcmV2VGltZT49MCYmdGhpcy5fZmlyc3QmJihoPSEwKSx0aGlzLl9yYXdQcmV2VGltZT10O2Vsc2V7aWYodGhpcy5fcmF3UHJldlRpbWU9dGhpcy5fZHVyYXRpb258fCFlfHx0fHx0aGlzLl9yYXdQcmV2VGltZT09PXQ/dDoxZS0xMCwwPT09dCYmcylmb3Iocj10aGlzLl9maXJzdDtyJiYwPT09ci5fc3RhcnRUaW1lOylyLl9kdXJhdGlvbnx8KHM9ITEpLHI9ci5fbmV4dDt0PTAsdGhpcy5faW5pdHRlZHx8KGg9ITApfWVsc2V7aWYodGhpcy5faGFzUGF1c2UmJiF0aGlzLl9mb3JjaW5nUGxheWhlYWQmJiFlKXtpZih0Pj1jKWZvcihyPXRoaXMuX2ZpcnN0O3ImJnIuX3N0YXJ0VGltZTw9dCYmIXU7KXIuX2R1cmF0aW9ufHwiaXNQYXVzZSIhPT1yLmRhdGF8fHIucmF0aW98fDA9PT1yLl9zdGFydFRpbWUmJjA9PT10aGlzLl9yYXdQcmV2VGltZXx8KHU9cikscj1yLl9uZXh0O2Vsc2UgZm9yKHI9dGhpcy5fbGFzdDtyJiZyLl9zdGFydFRpbWU+PXQmJiF1OylyLl9kdXJhdGlvbnx8ImlzUGF1c2UiPT09ci5kYXRhJiZyLl9yYXdQcmV2VGltZT4wJiYodT1yKSxyPXIuX3ByZXY7dSYmKHRoaXMuX3RpbWU9dD11Ll9zdGFydFRpbWUsdGhpcy5fdG90YWxUaW1lPXQrdGhpcy5fY3ljbGUqKHRoaXMuX3RvdGFsRHVyYXRpb24rdGhpcy5fcmVwZWF0RGVsYXkpKX10aGlzLl90b3RhbFRpbWU9dGhpcy5fdGltZT10aGlzLl9yYXdQcmV2VGltZT10fWlmKHRoaXMuX3RpbWUhPT1jJiZ0aGlzLl9maXJzdHx8aXx8aHx8dSl7aWYodGhpcy5faW5pdHRlZHx8KHRoaXMuX2luaXR0ZWQ9ITApLHRoaXMuX2FjdGl2ZXx8IXRoaXMuX3BhdXNlZCYmdGhpcy5fdGltZSE9PWMmJnQ+MCYmKHRoaXMuX2FjdGl2ZT0hMCksMD09PWMmJnRoaXMudmFycy5vblN0YXJ0JiYoMD09PXRoaXMuX3RpbWUmJnRoaXMuX2R1cmF0aW9ufHxlfHx0aGlzLl9jYWxsYmFjaygib25TdGFydCIpKSwoXz10aGlzLl90aW1lKT49Yylmb3Iocj10aGlzLl9maXJzdDtyJiYobj1yLl9uZXh0LF89PT10aGlzLl90aW1lJiYoIXRoaXMuX3BhdXNlZHx8bSkpOykoci5fYWN0aXZlfHxyLl9zdGFydFRpbWU8PV8mJiFyLl9wYXVzZWQmJiFyLl9nYykmJih1PT09ciYmdGhpcy5wYXVzZSgpLHIuX3JldmVyc2VkP3IucmVuZGVyKChyLl9kaXJ0eT9yLnRvdGFsRHVyYXRpb24oKTpyLl90b3RhbER1cmF0aW9uKS0odC1yLl9zdGFydFRpbWUpKnIuX3RpbWVTY2FsZSxlLGkpOnIucmVuZGVyKCh0LXIuX3N0YXJ0VGltZSkqci5fdGltZVNjYWxlLGUsaSkpLHI9bjtlbHNlIGZvcihyPXRoaXMuX2xhc3Q7ciYmKG49ci5fcHJldixfPT09dGhpcy5fdGltZSYmKCF0aGlzLl9wYXVzZWR8fG0pKTspe2lmKHIuX2FjdGl2ZXx8ci5fc3RhcnRUaW1lPD1jJiYhci5fcGF1c2VkJiYhci5fZ2Mpe2lmKHU9PT1yKXtmb3IodT1yLl9wcmV2O3UmJnUuZW5kVGltZSgpPnRoaXMuX3RpbWU7KXUucmVuZGVyKHUuX3JldmVyc2VkP3UudG90YWxEdXJhdGlvbigpLSh0LXUuX3N0YXJ0VGltZSkqdS5fdGltZVNjYWxlOih0LXUuX3N0YXJ0VGltZSkqdS5fdGltZVNjYWxlLGUsaSksdT11Ll9wcmV2O3U9bnVsbCx0aGlzLnBhdXNlKCl9ci5fcmV2ZXJzZWQ/ci5yZW5kZXIoKHIuX2RpcnR5P3IudG90YWxEdXJhdGlvbigpOnIuX3RvdGFsRHVyYXRpb24pLSh0LXIuX3N0YXJ0VGltZSkqci5fdGltZVNjYWxlLGUsaSk6ci5yZW5kZXIoKHQtci5fc3RhcnRUaW1lKSpyLl90aW1lU2NhbGUsZSxpKX1yPW59dGhpcy5fb25VcGRhdGUmJihlfHwoYS5sZW5ndGgmJm8oKSx0aGlzLl9jYWxsYmFjaygib25VcGRhdGUiKSkpLGwmJih0aGlzLl9nY3x8cCE9PXRoaXMuX3N0YXJ0VGltZSYmZD09PXRoaXMuX3RpbWVTY2FsZXx8KDA9PT10aGlzLl90aW1lfHxmPj10aGlzLnRvdGFsRHVyYXRpb24oKSkmJihzJiYoYS5sZW5ndGgmJm8oKSx0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4mJnRoaXMuX2VuYWJsZWQoITEsITEpLHRoaXMuX2FjdGl2ZT0hMSksIWUmJnRoaXMudmFyc1tsXSYmdGhpcy5fY2FsbGJhY2sobCkpKX19LGYuX2hhc1BhdXNlZENoaWxkPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuX2ZpcnN0O2U7KXtpZihlLl9wYXVzZWR8fGUgaW5zdGFuY2VvZiB0JiZlLl9oYXNQYXVzZWRDaGlsZCgpKXJldHVybiEwO2U9ZS5fbmV4dH1yZXR1cm4hMX0sZi5nZXRDaGlsZHJlbj1mdW5jdGlvbih0LGUsaSxzKXtzPXN8fC05OTk5OTk5OTk5O2Zvcih2YXIgbj1bXSxhPXRoaXMuX2ZpcnN0LG89MDthOylhLl9zdGFydFRpbWU8c3x8KGEgaW5zdGFuY2VvZiByLmw/ITEhPT1lJiYobltvKytdPWEpOighMSE9PWkmJihuW28rK109YSksITEhPT10JiYobz0obj1uLmNvbmNhdChhLmdldENoaWxkcmVuKCEwLGUsaSkpKS5sZW5ndGgpKSksYT1hLl9uZXh0O3JldHVybiBufSxmLmdldFR3ZWVuc09mPWZ1bmN0aW9uKHQsZSl7dmFyIGkscyxuPXRoaXMuX2djLGE9W10sbz0wO2ZvcihuJiZ0aGlzLl9lbmFibGVkKCEwLCEwKSxzPShpPXIubC5nZXRUd2VlbnNPZih0KSkubGVuZ3RoOy0tcz4tMTspKGlbc10udGltZWxpbmU9PT10aGlzfHxlJiZ0aGlzLl9jb250YWlucyhpW3NdKSkmJihhW28rK109aVtzXSk7cmV0dXJuIG4mJnRoaXMuX2VuYWJsZWQoITEsITApLGF9LGYucmVjZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlY2VudH0sZi5fY29udGFpbnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQudGltZWxpbmU7ZTspe2lmKGU9PT10aGlzKXJldHVybiEwO2U9ZS50aW1lbGluZX1yZXR1cm4hMX0sZi5zaGlmdENoaWxkcmVuPWZ1bmN0aW9uKHQsZSxpKXtpPWl8fDA7Zm9yKHZhciByLHM9dGhpcy5fZmlyc3Qsbj10aGlzLl9sYWJlbHM7czspcy5fc3RhcnRUaW1lPj1pJiYocy5fc3RhcnRUaW1lKz10KSxzPXMuX25leHQ7aWYoZSlmb3IociBpbiBuKW5bcl0+PWkmJihuW3JdKz10KTtyZXR1cm4gdGhpcy5fdW5jYWNoZSghMCl9LGYuX2tpbGw9ZnVuY3Rpb24odCxlKXtpZighdCYmIWUpcmV0dXJuIHRoaXMuX2VuYWJsZWQoITEsITEpO2Zvcih2YXIgaT1lP3RoaXMuZ2V0VHdlZW5zT2YoZSk6dGhpcy5nZXRDaGlsZHJlbighMCwhMCwhMSkscj1pLmxlbmd0aCxzPSExOy0tcj4tMTspaVtyXS5fa2lsbCh0LGUpJiYocz0hMCk7cmV0dXJuIHN9LGYuY2xlYXI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRDaGlsZHJlbighMSwhMCwhMCksaT1lLmxlbmd0aDtmb3IodGhpcy5fdGltZT10aGlzLl90b3RhbFRpbWU9MDstLWk+LTE7KWVbaV0uX2VuYWJsZWQoITEsITEpO3JldHVybiExIT09dCYmKHRoaXMuX2xhYmVscz17fSksdGhpcy5fdW5jYWNoZSghMCl9LGYuaW52YWxpZGF0ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9maXJzdDt0Oyl0LmludmFsaWRhdGUoKSx0PXQuX25leHQ7cmV0dXJuIHIuYS5wcm90b3R5cGUuaW52YWxpZGF0ZS5jYWxsKHRoaXMpfSxmLl9lbmFibGVkPWZ1bmN0aW9uKHQsZSl7aWYodD09PXRoaXMuX2djKWZvcih2YXIgaT10aGlzLl9maXJzdDtpOylpLl9lbmFibGVkKHQsITApLGk9aS5fbmV4dDtyZXR1cm4gci5pLnByb3RvdHlwZS5fZW5hYmxlZC5jYWxsKHRoaXMsdCxlKX0sZi50b3RhbFRpbWU9ZnVuY3Rpb24odCxlLGkpe3RoaXMuX2ZvcmNpbmdQbGF5aGVhZD0hMDt2YXIgcz1yLmEucHJvdG90eXBlLnRvdGFsVGltZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMuX2ZvcmNpbmdQbGF5aGVhZD0hMSxzfSxmLmR1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPygwIT09dGhpcy5kdXJhdGlvbigpJiYwIT09dCYmdGhpcy50aW1lU2NhbGUodGhpcy5fZHVyYXRpb24vdCksdGhpcyk6KHRoaXMuX2RpcnR5JiZ0aGlzLnRvdGFsRHVyYXRpb24oKSx0aGlzLl9kdXJhdGlvbil9LGYudG90YWxEdXJhdGlvbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aCl7aWYodGhpcy5fZGlydHkpe2Zvcih2YXIgZSxpLHI9MCxzPXRoaXMuX2xhc3Qsbj05OTk5OTk5OTk5OTk7czspZT1zLl9wcmV2LHMuX2RpcnR5JiZzLnRvdGFsRHVyYXRpb24oKSxzLl9zdGFydFRpbWU+biYmdGhpcy5fc29ydENoaWxkcmVuJiYhcy5fcGF1c2VkJiYhdGhpcy5fY2FsY3VsYXRpbmdEdXJhdGlvbj8odGhpcy5fY2FsY3VsYXRpbmdEdXJhdGlvbj0xLHRoaXMuYWRkKHMscy5fc3RhcnRUaW1lLXMuX2RlbGF5KSx0aGlzLl9jYWxjdWxhdGluZ0R1cmF0aW9uPTApOm49cy5fc3RhcnRUaW1lLHMuX3N0YXJ0VGltZTwwJiYhcy5fcGF1c2VkJiYoci09cy5fc3RhcnRUaW1lLHRoaXMuX3RpbWVsaW5lLnNtb290aENoaWxkVGltaW5nJiYodGhpcy5fc3RhcnRUaW1lKz1zLl9zdGFydFRpbWUvdGhpcy5fdGltZVNjYWxlLHRoaXMuX3RpbWUtPXMuX3N0YXJ0VGltZSx0aGlzLl90b3RhbFRpbWUtPXMuX3N0YXJ0VGltZSx0aGlzLl9yYXdQcmV2VGltZS09cy5fc3RhcnRUaW1lKSx0aGlzLnNoaWZ0Q2hpbGRyZW4oLXMuX3N0YXJ0VGltZSwhMSwtOTk5OTk5OTk5OSksbj0wKSwoaT1zLl9zdGFydFRpbWUrcy5fdG90YWxEdXJhdGlvbi9zLl90aW1lU2NhbGUpPnImJihyPWkpLHM9ZTt0aGlzLl9kdXJhdGlvbj10aGlzLl90b3RhbER1cmF0aW9uPXIsdGhpcy5fZGlydHk9ITF9cmV0dXJuIHRoaXMuX3RvdGFsRHVyYXRpb259cmV0dXJuIHQmJnRoaXMudG90YWxEdXJhdGlvbigpP3RoaXMudGltZVNjYWxlKHRoaXMuX3RvdGFsRHVyYXRpb24vdCk6dGhpc30sZi5wYXVzZWQ9ZnVuY3Rpb24odCl7aWYoIXQpZm9yKHZhciBlPXRoaXMuX2ZpcnN0LGk9dGhpcy5fdGltZTtlOyllLl9zdGFydFRpbWU9PT1pJiYiaXNQYXVzZSI9PT1lLmRhdGEmJihlLl9yYXdQcmV2VGltZT0wKSxlPWUuX25leHQ7cmV0dXJuIHIuYS5wcm90b3R5cGUucGF1c2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZi51c2VzRnJhbWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX3RpbWVsaW5lO3QuX3RpbWVsaW5lOyl0PXQuX3RpbWVsaW5lO3JldHVybiB0PT09ci5hLl9yb290RnJhbWVzVGltZWxpbmV9LGYucmF3VGltZT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmKHRoaXMuX3BhdXNlZHx8dGhpcy5fcmVwZWF0JiZ0aGlzLnRpbWUoKT4wJiZ0aGlzLnRvdGFsUHJvZ3Jlc3MoKTwxKT90aGlzLl90b3RhbFRpbWUlKHRoaXMuX2R1cmF0aW9uK3RoaXMuX3JlcGVhdERlbGF5KTp0aGlzLl9wYXVzZWQ/dGhpcy5fdG90YWxUaW1lOih0aGlzLl90aW1lbGluZS5yYXdUaW1lKHQpLXRoaXMuX3N0YXJ0VGltZSkqdGhpcy5fdGltZVNjYWxlfSx0fSwhMCk7dmFyIHM9ci5tLlRpbWVsaW5lTGl0ZTsNCi8qIQ0KICogVkVSU0lPTjogMi4wLjINCiAqIERBVEU6IDIwMTgtMDgtMjcNCiAqIFVQREFURVMgQU5EIERPQ1MgQVQ6IGh0dHA6Ly9ncmVlbnNvY2suY29tDQogKg0KICogQGxpY2Vuc2UgQ29weXJpZ2h0IChjKSAyMDA4LTIwMTgsIEdyZWVuU29jay4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAqIFRoaXMgd29yayBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhdCBodHRwOi8vZ3JlZW5zb2NrLmNvbS9zdGFuZGFyZC1saWNlbnNlIG9yIGZvcg0KICogQ2x1YiBHcmVlblNvY2sgbWVtYmVycywgdGhlIHNvZnR3YXJlIGFncmVlbWVudCB0aGF0IHdhcyBpc3N1ZWQgd2l0aCB5b3VyIG1lbWJlcnNoaXAuDQogKiANCiAqIEBhdXRob3I6IEphY2sgRG95bGUsIGphY2tAZ3JlZW5zb2NrLmNvbQ0KICovci5rLl9nc0RlZmluZSgiVGltZWxpbmVNYXgiLFsiVGltZWxpbmVMaXRlIiwiVHdlZW5MaXRlIiwiZWFzaW5nLkVhc2UiXSxmdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKHQpe3MuY2FsbCh0aGlzLHQpLHRoaXMuX3JlcGVhdD10aGlzLnZhcnMucmVwZWF0fHwwLHRoaXMuX3JlcGVhdERlbGF5PXRoaXMudmFycy5yZXBlYXREZWxheXx8MCx0aGlzLl9jeWNsZT0wLHRoaXMuX3lveW89ITA9PT10aGlzLnZhcnMueW95byx0aGlzLl9kaXJ0eT0hMH0sZT1yLmwuX2ludGVybmFscyxpPWUubGF6eVR3ZWVucyxuPWUubGF6eVJlbmRlcixhPXIuay5fZ3NEZWZpbmUuZ2xvYmFscyxvPW5ldyByLmIobnVsbCxudWxsLDEsMCksbD10LnByb3RvdHlwZT1uZXcgcztyZXR1cm4gbC5jb25zdHJ1Y3Rvcj10LGwua2lsbCgpLl9nYz0hMSx0LnZlcnNpb249IjIuMC4yIixsLmludmFsaWRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feW95bz0hMD09PXRoaXMudmFycy55b3lvLHRoaXMuX3JlcGVhdD10aGlzLnZhcnMucmVwZWF0fHwwLHRoaXMuX3JlcGVhdERlbGF5PXRoaXMudmFycy5yZXBlYXREZWxheXx8MCx0aGlzLl91bmNhY2hlKCEwKSxzLnByb3RvdHlwZS5pbnZhbGlkYXRlLmNhbGwodGhpcyl9LGwuYWRkQ2FsbGJhY2s9ZnVuY3Rpb24odCxlLGkscyl7cmV0dXJuIHRoaXMuYWRkKHIubC5kZWxheWVkQ2FsbCgwLHQsaSxzKSxlKX0sbC5yZW1vdmVDYWxsYmFjaz1mdW5jdGlvbih0LGUpe2lmKHQpaWYobnVsbD09ZSl0aGlzLl9raWxsKG51bGwsdCk7ZWxzZSBmb3IodmFyIGk9dGhpcy5nZXRUd2VlbnNPZih0LCExKSxyPWkubGVuZ3RoLHM9dGhpcy5fcGFyc2VUaW1lT3JMYWJlbChlKTstLXI+LTE7KWlbcl0uX3N0YXJ0VGltZT09PXMmJmlbcl0uX2VuYWJsZWQoITEsITEpO3JldHVybiB0aGlzfSxsLnJlbW92ZVBhdXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlbW92ZUNhbGxiYWNrKHMuX2ludGVybmFscy5wYXVzZUNhbGxiYWNrLHQpfSxsLnR3ZWVuVG89ZnVuY3Rpb24odCxlKXtlPWV8fHt9O3ZhciBpLHMsbixsPXtlYXNlOm8sdXNlRnJhbWVzOnRoaXMudXNlc0ZyYW1lcygpLGltbWVkaWF0ZVJlbmRlcjohMSxsYXp5OiExfSxoPWUucmVwZWF0JiZhLlR3ZWVuTWF4fHxyLmw7Zm9yKHMgaW4gZSlsW3NdPWVbc107cmV0dXJuIGwudGltZT10aGlzLl9wYXJzZVRpbWVPckxhYmVsKHQpLGk9TWF0aC5hYnMoTnVtYmVyKGwudGltZSktdGhpcy5fdGltZSkvdGhpcy5fdGltZVNjYWxlfHwuMDAxLG49bmV3IGgodGhpcyxpLGwpLGwub25TdGFydD1mdW5jdGlvbigpe24udGFyZ2V0LnBhdXNlZCghMCksbi52YXJzLnRpbWU9PT1uLnRhcmdldC50aW1lKCl8fGkhPT1uLmR1cmF0aW9uKCl8fG4uaXNGcm9tVG98fG4uZHVyYXRpb24oTWF0aC5hYnMobi52YXJzLnRpbWUtbi50YXJnZXQudGltZSgpKS9uLnRhcmdldC5fdGltZVNjYWxlKS5yZW5kZXIobi50aW1lKCksITAsITApLGUub25TdGFydCYmZS5vblN0YXJ0LmFwcGx5KGUub25TdGFydFNjb3BlfHxlLmNhbGxiYWNrU2NvcGV8fG4sZS5vblN0YXJ0UGFyYW1zfHxbXSl9LG59LGwudHdlZW5Gcm9tVG89ZnVuY3Rpb24odCxlLGkpe2k9aXx8e30sdD10aGlzLl9wYXJzZVRpbWVPckxhYmVsKHQpLGkuc3RhcnRBdD17b25Db21wbGV0ZTp0aGlzLnNlZWssb25Db21wbGV0ZVBhcmFtczpbdF0sY2FsbGJhY2tTY29wZTp0aGlzfSxpLmltbWVkaWF0ZVJlbmRlcj0hMSE9PWkuaW1tZWRpYXRlUmVuZGVyO3ZhciByPXRoaXMudHdlZW5UbyhlLGkpO3JldHVybiByLmlzRnJvbVRvPTEsci5kdXJhdGlvbihNYXRoLmFicyhyLnZhcnMudGltZS10KS90aGlzLl90aW1lU2NhbGV8fC4wMDEpfSxsLnJlbmRlcj1mdW5jdGlvbih0LGUscil7dGhpcy5fZ2MmJnRoaXMuX2VuYWJsZWQoITAsITEpO3ZhciBzLGEsbyxsLGgsdSxfLGMsZj10aGlzLl90aW1lLHA9dGhpcy5fZGlydHk/dGhpcy50b3RhbER1cmF0aW9uKCk6dGhpcy5fdG90YWxEdXJhdGlvbixkPXRoaXMuX2R1cmF0aW9uLG09dGhpcy5fdG90YWxUaW1lLGc9dGhpcy5fc3RhcnRUaW1lLHY9dGhpcy5fdGltZVNjYWxlLHk9dGhpcy5fcmF3UHJldlRpbWUsVD10aGlzLl9wYXVzZWQsdz10aGlzLl9jeWNsZTtpZihmIT09dGhpcy5fdGltZSYmKHQrPXRoaXMuX3RpbWUtZiksdD49cC0xZS03JiZ0Pj0wKXRoaXMuX2xvY2tlZHx8KHRoaXMuX3RvdGFsVGltZT1wLHRoaXMuX2N5Y2xlPXRoaXMuX3JlcGVhdCksdGhpcy5fcmV2ZXJzZWR8fHRoaXMuX2hhc1BhdXNlZENoaWxkKCl8fChhPSEwLGw9Im9uQ29tcGxldGUiLGg9ISF0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4sMD09PXRoaXMuX2R1cmF0aW9uJiYodDw9MCYmdD49LTFlLTd8fHk8MHx8MWUtMTA9PT15KSYmeSE9PXQmJnRoaXMuX2ZpcnN0JiYoaD0hMCx5PjFlLTEwJiYobD0ib25SZXZlcnNlQ29tcGxldGUiKSkpLHRoaXMuX3Jhd1ByZXZUaW1lPXRoaXMuX2R1cmF0aW9ufHwhZXx8dHx8dGhpcy5fcmF3UHJldlRpbWU9PT10P3Q6MWUtMTAsdGhpcy5feW95byYmMCE9KDEmdGhpcy5fY3ljbGUpP3RoaXMuX3RpbWU9dD0wOih0aGlzLl90aW1lPWQsdD1kKzFlLTQpO2Vsc2UgaWYodDwxZS03KWlmKHRoaXMuX2xvY2tlZHx8KHRoaXMuX3RvdGFsVGltZT10aGlzLl9jeWNsZT0wKSx0aGlzLl90aW1lPTAsKDAhPT1mfHwwPT09ZCYmMWUtMTAhPT15JiYoeT4wfHx0PDAmJnk+PTApJiYhdGhpcy5fbG9ja2VkKSYmKGw9Im9uUmV2ZXJzZUNvbXBsZXRlIixhPXRoaXMuX3JldmVyc2VkKSx0PDApdGhpcy5fYWN0aXZlPSExLHRoaXMuX3RpbWVsaW5lLmF1dG9SZW1vdmVDaGlsZHJlbiYmdGhpcy5fcmV2ZXJzZWQ/KGg9YT0hMCxsPSJvblJldmVyc2VDb21wbGV0ZSIpOnk+PTAmJnRoaXMuX2ZpcnN0JiYoaD0hMCksdGhpcy5fcmF3UHJldlRpbWU9dDtlbHNle2lmKHRoaXMuX3Jhd1ByZXZUaW1lPWR8fCFlfHx0fHx0aGlzLl9yYXdQcmV2VGltZT09PXQ/dDoxZS0xMCwwPT09dCYmYSlmb3Iocz10aGlzLl9maXJzdDtzJiYwPT09cy5fc3RhcnRUaW1lOylzLl9kdXJhdGlvbnx8KGE9ITEpLHM9cy5fbmV4dDt0PTAsdGhpcy5faW5pdHRlZHx8KGg9ITApfWVsc2UgaWYoMD09PWQmJnk8MCYmKGg9ITApLHRoaXMuX3RpbWU9dGhpcy5fcmF3UHJldlRpbWU9dCx0aGlzLl9sb2NrZWR8fCh0aGlzLl90b3RhbFRpbWU9dCwwIT09dGhpcy5fcmVwZWF0JiYodT1kK3RoaXMuX3JlcGVhdERlbGF5LHRoaXMuX2N5Y2xlPXRoaXMuX3RvdGFsVGltZS91Pj4wLDAhPT10aGlzLl9jeWNsZSYmdGhpcy5fY3ljbGU9PT10aGlzLl90b3RhbFRpbWUvdSYmbTw9dCYmdGhpcy5fY3ljbGUtLSx0aGlzLl90aW1lPXRoaXMuX3RvdGFsVGltZS10aGlzLl9jeWNsZSp1LHRoaXMuX3lveW8mJjAhPSgxJnRoaXMuX2N5Y2xlKSYmKHRoaXMuX3RpbWU9ZC10aGlzLl90aW1lKSx0aGlzLl90aW1lPmQ/KHRoaXMuX3RpbWU9ZCx0PWQrMWUtNCk6dGhpcy5fdGltZTwwP3RoaXMuX3RpbWU9dD0wOnQ9dGhpcy5fdGltZSkpLHRoaXMuX2hhc1BhdXNlJiYhdGhpcy5fZm9yY2luZ1BsYXloZWFkJiYhZSl7aWYoKHQ9dGhpcy5fdGltZSk+PWZ8fHRoaXMuX3JlcGVhdCYmdyE9PXRoaXMuX2N5Y2xlKWZvcihzPXRoaXMuX2ZpcnN0O3MmJnMuX3N0YXJ0VGltZTw9dCYmIV87KXMuX2R1cmF0aW9ufHwiaXNQYXVzZSIhPT1zLmRhdGF8fHMucmF0aW98fDA9PT1zLl9zdGFydFRpbWUmJjA9PT10aGlzLl9yYXdQcmV2VGltZXx8KF89cykscz1zLl9uZXh0O2Vsc2UgZm9yKHM9dGhpcy5fbGFzdDtzJiZzLl9zdGFydFRpbWU+PXQmJiFfOylzLl9kdXJhdGlvbnx8ImlzUGF1c2UiPT09cy5kYXRhJiZzLl9yYXdQcmV2VGltZT4wJiYoXz1zKSxzPXMuX3ByZXY7XyYmXy5fc3RhcnRUaW1lPGQmJih0aGlzLl90aW1lPXQ9Xy5fc3RhcnRUaW1lLHRoaXMuX3RvdGFsVGltZT10K3RoaXMuX2N5Y2xlKih0aGlzLl90b3RhbER1cmF0aW9uK3RoaXMuX3JlcGVhdERlbGF5KSl9aWYodGhpcy5fY3ljbGUhPT13JiYhdGhpcy5fbG9ja2VkKXt2YXIgeD10aGlzLl95b3lvJiYwIT0oMSZ3KSxiPXg9PT0odGhpcy5feW95byYmMCE9KDEmdGhpcy5fY3ljbGUpKSxQPXRoaXMuX3RvdGFsVGltZSxTPXRoaXMuX2N5Y2xlLGs9dGhpcy5fcmF3UHJldlRpbWUsUj10aGlzLl90aW1lO2lmKHRoaXMuX3RvdGFsVGltZT13KmQsdGhpcy5fY3ljbGU8dz94PSF4OnRoaXMuX3RvdGFsVGltZSs9ZCx0aGlzLl90aW1lPWYsdGhpcy5fcmF3UHJldlRpbWU9MD09PWQ/eS0xZS00OnksdGhpcy5fY3ljbGU9dyx0aGlzLl9sb2NrZWQ9ITAsZj14PzA6ZCx0aGlzLnJlbmRlcihmLGUsMD09PWQpLGV8fHRoaXMuX2djfHx0aGlzLnZhcnMub25SZXBlYXQmJih0aGlzLl9jeWNsZT1TLHRoaXMuX2xvY2tlZD0hMSx0aGlzLl9jYWxsYmFjaygib25SZXBlYXQiKSksZiE9PXRoaXMuX3RpbWUpcmV0dXJuO2lmKGImJih0aGlzLl9jeWNsZT13LHRoaXMuX2xvY2tlZD0hMCxmPXg/ZCsxZS00Oi0xZS00LHRoaXMucmVuZGVyKGYsITAsITEpKSx0aGlzLl9sb2NrZWQ9ITEsdGhpcy5fcGF1c2VkJiYhVClyZXR1cm47dGhpcy5fdGltZT1SLHRoaXMuX3RvdGFsVGltZT1QLHRoaXMuX2N5Y2xlPVMsdGhpcy5fcmF3UHJldlRpbWU9a31pZih0aGlzLl90aW1lIT09ZiYmdGhpcy5fZmlyc3R8fHJ8fGh8fF8pe2lmKHRoaXMuX2luaXR0ZWR8fCh0aGlzLl9pbml0dGVkPSEwKSx0aGlzLl9hY3RpdmV8fCF0aGlzLl9wYXVzZWQmJnRoaXMuX3RvdGFsVGltZSE9PW0mJnQ+MCYmKHRoaXMuX2FjdGl2ZT0hMCksMD09PW0mJnRoaXMudmFycy5vblN0YXJ0JiYoMD09PXRoaXMuX3RvdGFsVGltZSYmdGhpcy5fdG90YWxEdXJhdGlvbnx8ZXx8dGhpcy5fY2FsbGJhY2soIm9uU3RhcnQiKSksKGM9dGhpcy5fdGltZSk+PWYpZm9yKHM9dGhpcy5fZmlyc3Q7cyYmKG89cy5fbmV4dCxjPT09dGhpcy5fdGltZSYmKCF0aGlzLl9wYXVzZWR8fFQpKTspKHMuX2FjdGl2ZXx8cy5fc3RhcnRUaW1lPD10aGlzLl90aW1lJiYhcy5fcGF1c2VkJiYhcy5fZ2MpJiYoXz09PXMmJnRoaXMucGF1c2UoKSxzLl9yZXZlcnNlZD9zLnJlbmRlcigocy5fZGlydHk/cy50b3RhbER1cmF0aW9uKCk6cy5fdG90YWxEdXJhdGlvbiktKHQtcy5fc3RhcnRUaW1lKSpzLl90aW1lU2NhbGUsZSxyKTpzLnJlbmRlcigodC1zLl9zdGFydFRpbWUpKnMuX3RpbWVTY2FsZSxlLHIpKSxzPW87ZWxzZSBmb3Iocz10aGlzLl9sYXN0O3MmJihvPXMuX3ByZXYsYz09PXRoaXMuX3RpbWUmJighdGhpcy5fcGF1c2VkfHxUKSk7KXtpZihzLl9hY3RpdmV8fHMuX3N0YXJ0VGltZTw9ZiYmIXMuX3BhdXNlZCYmIXMuX2djKXtpZihfPT09cyl7Zm9yKF89cy5fcHJldjtfJiZfLmVuZFRpbWUoKT50aGlzLl90aW1lOylfLnJlbmRlcihfLl9yZXZlcnNlZD9fLnRvdGFsRHVyYXRpb24oKS0odC1fLl9zdGFydFRpbWUpKl8uX3RpbWVTY2FsZToodC1fLl9zdGFydFRpbWUpKl8uX3RpbWVTY2FsZSxlLHIpLF89Xy5fcHJldjtfPW51bGwsdGhpcy5wYXVzZSgpfXMuX3JldmVyc2VkP3MucmVuZGVyKChzLl9kaXJ0eT9zLnRvdGFsRHVyYXRpb24oKTpzLl90b3RhbER1cmF0aW9uKS0odC1zLl9zdGFydFRpbWUpKnMuX3RpbWVTY2FsZSxlLHIpOnMucmVuZGVyKCh0LXMuX3N0YXJ0VGltZSkqcy5fdGltZVNjYWxlLGUscil9cz1vfXRoaXMuX29uVXBkYXRlJiYoZXx8KGkubGVuZ3RoJiZuKCksdGhpcy5fY2FsbGJhY2soIm9uVXBkYXRlIikpKSxsJiYodGhpcy5fbG9ja2VkfHx0aGlzLl9nY3x8ZyE9PXRoaXMuX3N0YXJ0VGltZSYmdj09PXRoaXMuX3RpbWVTY2FsZXx8KDA9PT10aGlzLl90aW1lfHxwPj10aGlzLnRvdGFsRHVyYXRpb24oKSkmJihhJiYoaS5sZW5ndGgmJm4oKSx0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4mJnRoaXMuX2VuYWJsZWQoITEsITEpLHRoaXMuX2FjdGl2ZT0hMSksIWUmJnRoaXMudmFyc1tsXSYmdGhpcy5fY2FsbGJhY2sobCkpKX1lbHNlIG0hPT10aGlzLl90b3RhbFRpbWUmJnRoaXMuX29uVXBkYXRlJiYoZXx8dGhpcy5fY2FsbGJhY2soIm9uVXBkYXRlIikpfSxsLmdldEFjdGl2ZT1mdW5jdGlvbih0LGUsaSl7bnVsbD09dCYmKHQ9ITApLG51bGw9PWUmJihlPSEwKSxudWxsPT1pJiYoaT0hMSk7dmFyIHIscyxuPVtdLGE9dGhpcy5nZXRDaGlsZHJlbih0LGUsaSksbz0wLGw9YS5sZW5ndGg7Zm9yKHI9MDtyPGw7cisrKShzPWFbcl0pLmlzQWN0aXZlKCkmJihuW28rK109cyk7cmV0dXJuIG59LGwuZ2V0TGFiZWxBZnRlcj1mdW5jdGlvbih0KXt0fHwwIT09dCYmKHQ9dGhpcy5fdGltZSk7dmFyIGUsaT10aGlzLmdldExhYmVsc0FycmF5KCkscj1pLmxlbmd0aDtmb3IoZT0wO2U8cjtlKyspaWYoaVtlXS50aW1lPnQpcmV0dXJuIGlbZV0ubmFtZTtyZXR1cm4gbnVsbH0sbC5nZXRMYWJlbEJlZm9yZT1mdW5jdGlvbih0KXtudWxsPT10JiYodD10aGlzLl90aW1lKTtmb3IodmFyIGU9dGhpcy5nZXRMYWJlbHNBcnJheSgpLGk9ZS5sZW5ndGg7LS1pPi0xOylpZihlW2ldLnRpbWU8dClyZXR1cm4gZVtpXS5uYW1lO3JldHVybiBudWxsfSxsLmdldExhYmVsc0FycmF5PWZ1bmN0aW9uKCl7dmFyIHQsZT1bXSxpPTA7Zm9yKHQgaW4gdGhpcy5fbGFiZWxzKWVbaSsrXT17dGltZTp0aGlzLl9sYWJlbHNbdF0sbmFtZTp0fTtyZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudGltZS1lLnRpbWV9KSxlfSxsLmludmFsaWRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9ja2VkPSExLHMucHJvdG90eXBlLmludmFsaWRhdGUuY2FsbCh0aGlzKX0sbC5wcm9ncmVzcz1mdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMudG90YWxUaW1lKHRoaXMuZHVyYXRpb24oKSoodGhpcy5feW95byYmMCE9KDEmdGhpcy5fY3ljbGUpPzEtdDp0KSt0aGlzLl9jeWNsZSoodGhpcy5fZHVyYXRpb24rdGhpcy5fcmVwZWF0RGVsYXkpLGUpOnRoaXMuX3RpbWUvdGhpcy5kdXJhdGlvbigpfHwwfSxsLnRvdGFsUHJvZ3Jlc3M9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnRvdGFsVGltZSh0aGlzLnRvdGFsRHVyYXRpb24oKSp0LGUpOnRoaXMuX3RvdGFsVGltZS90aGlzLnRvdGFsRHVyYXRpb24oKXx8MH0sbC50b3RhbER1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPy0xIT09dGhpcy5fcmVwZWF0JiZ0P3RoaXMudGltZVNjYWxlKHRoaXMudG90YWxEdXJhdGlvbigpL3QpOnRoaXM6KHRoaXMuX2RpcnR5JiYocy5wcm90b3R5cGUudG90YWxEdXJhdGlvbi5jYWxsKHRoaXMpLHRoaXMuX3RvdGFsRHVyYXRpb249LTE9PT10aGlzLl9yZXBlYXQ/OTk5OTk5OTk5OTk5OnRoaXMuX2R1cmF0aW9uKih0aGlzLl9yZXBlYXQrMSkrdGhpcy5fcmVwZWF0RGVsYXkqdGhpcy5fcmVwZWF0KSx0aGlzLl90b3RhbER1cmF0aW9uKX0sbC50aW1lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX2RpcnR5JiZ0aGlzLnRvdGFsRHVyYXRpb24oKSx0PnRoaXMuX2R1cmF0aW9uJiYodD10aGlzLl9kdXJhdGlvbiksdGhpcy5feW95byYmMCE9KDEmdGhpcy5fY3ljbGUpP3Q9dGhpcy5fZHVyYXRpb24tdCt0aGlzLl9jeWNsZSoodGhpcy5fZHVyYXRpb24rdGhpcy5fcmVwZWF0RGVsYXkpOjAhPT10aGlzLl9yZXBlYXQmJih0Kz10aGlzLl9jeWNsZSoodGhpcy5fZHVyYXRpb24rdGhpcy5fcmVwZWF0RGVsYXkpKSx0aGlzLnRvdGFsVGltZSh0LGUpKTp0aGlzLl90aW1lfSxsLnJlcGVhdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5fcmVwZWF0PXQsdGhpcy5fdW5jYWNoZSghMCkpOnRoaXMuX3JlcGVhdH0sbC5yZXBlYXREZWxheT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5fcmVwZWF0RGVsYXk9dCx0aGlzLl91bmNhY2hlKCEwKSk6dGhpcy5fcmVwZWF0RGVsYXl9LGwueW95bz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feW95bz10LHRoaXMpOnRoaXMuX3lveW99LGwuY3VycmVudExhYmVsPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuc2Vlayh0LCEwKTp0aGlzLmdldExhYmVsQmVmb3JlKHRoaXMuX3RpbWUrMWUtOCl9LHR9LCEwKTt2YXIgbj1yLm0uVGltZWxpbmVNYXg7DQovKiENCiAqIFZFUlNJT046IDIuMC4yDQogKiBEQVRFOiAyMDE4LTA4LTI3DQogKiBVUERBVEVTIEFORCBET0NTIEFUOiBodHRwOi8vZ3JlZW5zb2NrLmNvbQ0KICoNCiAqIEBsaWNlbnNlIENvcHlyaWdodCAoYykgMjAwOC0yMDE4LCBHcmVlblNvY2suIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKiBUaGlzIHdvcmsgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYXQgaHR0cDovL2dyZWVuc29jay5jb20vc3RhbmRhcmQtbGljZW5zZSBvciBmb3INCiAqIENsdWIgR3JlZW5Tb2NrIG1lbWJlcnMsIHRoZSBzb2Z0d2FyZSBhZ3JlZW1lbnQgdGhhdCB3YXMgaXNzdWVkIHdpdGggeW91ciBtZW1iZXJzaGlwLg0KICogDQogKiBAYXV0aG9yOiBKYWNrIERveWxlLCBqYWNrQGdyZWVuc29jay5jb20NCiAqKi9yLmsuX2dzRGVmaW5lKCJUd2Vlbk1heCIsWyJjb3JlLkFuaW1hdGlvbiIsImNvcmUuU2ltcGxlVGltZWxpbmUiLCJUd2VlbkxpdGUiXSxmdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKHQpe3ZhciBlLGk9W10scj10Lmxlbmd0aDtmb3IoZT0wO2UhPT1yO2kucHVzaCh0W2UrK10pKTtyZXR1cm4gaX0sZT1mdW5jdGlvbih0LGUsaSl7dmFyIHIscyxuPXQuY3ljbGU7Zm9yKHIgaW4gbilzPW5bcl0sdFtyXT0iZnVuY3Rpb24iPT10eXBlb2Ygcz9zKGksZVtpXSk6c1tpJXMubGVuZ3RoXTtkZWxldGUgdC5jeWNsZX0saT1mdW5jdGlvbih0LGUscyl7ci5sLmNhbGwodGhpcyx0LGUscyksdGhpcy5fY3ljbGU9MCx0aGlzLl95b3lvPSEwPT09dGhpcy52YXJzLnlveW98fCEhdGhpcy52YXJzLnlveW9FYXNlLHRoaXMuX3JlcGVhdD10aGlzLnZhcnMucmVwZWF0fHwwLHRoaXMuX3JlcGVhdERlbGF5PXRoaXMudmFycy5yZXBlYXREZWxheXx8MCx0aGlzLl9yZXBlYXQmJnRoaXMuX3VuY2FjaGUoITApLHRoaXMucmVuZGVyPWkucHJvdG90eXBlLnJlbmRlcn0scz1yLmwuX2ludGVybmFscyxuPXMuaXNTZWxlY3RvcixhPXMuaXNBcnJheSxvPWkucHJvdG90eXBlPXIubC50byh7fSwuMSx7fSksbD1bXTtpLnZlcnNpb249IjIuMC4yIixvLmNvbnN0cnVjdG9yPWksby5raWxsKCkuX2djPSExLGkua2lsbFR3ZWVuc09mPWkua2lsbERlbGF5ZWRDYWxsc1RvPXIubC5raWxsVHdlZW5zT2YsaS5nZXRUd2VlbnNPZj1yLmwuZ2V0VHdlZW5zT2YsaS5sYWdTbW9vdGhpbmc9ci5sLmxhZ1Ntb290aGluZyxpLnRpY2tlcj1yLmwudGlja2VyLGkucmVuZGVyPXIubC5yZW5kZXIsby5pbnZhbGlkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3lveW89ITA9PT10aGlzLnZhcnMueW95b3x8ISF0aGlzLnZhcnMueW95b0Vhc2UsdGhpcy5fcmVwZWF0PXRoaXMudmFycy5yZXBlYXR8fDAsdGhpcy5fcmVwZWF0RGVsYXk9dGhpcy52YXJzLnJlcGVhdERlbGF5fHwwLHRoaXMuX3lveW9FYXNlPW51bGwsdGhpcy5fdW5jYWNoZSghMCksci5sLnByb3RvdHlwZS5pbnZhbGlkYXRlLmNhbGwodGhpcyl9LG8udXBkYXRlVG89ZnVuY3Rpb24odCxlKXt2YXIgaSxzPXRoaXMucmF0aW8sbj10aGlzLnZhcnMuaW1tZWRpYXRlUmVuZGVyfHx0LmltbWVkaWF0ZVJlbmRlcjtmb3IoaSBpbiBlJiZ0aGlzLl9zdGFydFRpbWU8dGhpcy5fdGltZWxpbmUuX3RpbWUmJih0aGlzLl9zdGFydFRpbWU9dGhpcy5fdGltZWxpbmUuX3RpbWUsdGhpcy5fdW5jYWNoZSghMSksdGhpcy5fZ2M/dGhpcy5fZW5hYmxlZCghMCwhMSk6dGhpcy5fdGltZWxpbmUuaW5zZXJ0KHRoaXMsdGhpcy5fc3RhcnRUaW1lLXRoaXMuX2RlbGF5KSksdCl0aGlzLnZhcnNbaV09dFtpXTtpZih0aGlzLl9pbml0dGVkfHxuKWlmKGUpdGhpcy5faW5pdHRlZD0hMSxuJiZ0aGlzLnJlbmRlcigwLCEwLCEwKTtlbHNlIGlmKHRoaXMuX2djJiZ0aGlzLl9lbmFibGVkKCEwLCExKSx0aGlzLl9ub3RpZnlQbHVnaW5zT2ZFbmFibGVkJiZ0aGlzLl9maXJzdFBUJiZyLmwuX29uUGx1Z2luRXZlbnQoIl9vbkRpc2FibGUiLHRoaXMpLHRoaXMuX3RpbWUvdGhpcy5fZHVyYXRpb24+Ljk5OCl7dmFyIGE9dGhpcy5fdG90YWxUaW1lO3RoaXMucmVuZGVyKDAsITAsITEpLHRoaXMuX2luaXR0ZWQ9ITEsdGhpcy5yZW5kZXIoYSwhMCwhMSl9ZWxzZSBpZih0aGlzLl9pbml0dGVkPSExLHRoaXMuX2luaXQoKSx0aGlzLl90aW1lPjB8fG4pZm9yKHZhciBvLGw9MS8oMS1zKSxoPXRoaXMuX2ZpcnN0UFQ7aDspbz1oLnMraC5jLGguYyo9bCxoLnM9by1oLmMsaD1oLl9uZXh0O3JldHVybiB0aGlzfSxvLnJlbmRlcj1mdW5jdGlvbih0LGUsaSl7dGhpcy5faW5pdHRlZHx8MD09PXRoaXMuX2R1cmF0aW9uJiZ0aGlzLnZhcnMucmVwZWF0JiZ0aGlzLmludmFsaWRhdGUoKTt2YXIgbixhLG8sbCxoLHUsXyxjLGYscD10aGlzLl9kaXJ0eT90aGlzLnRvdGFsRHVyYXRpb24oKTp0aGlzLl90b3RhbER1cmF0aW9uLGQ9dGhpcy5fdGltZSxtPXRoaXMuX3RvdGFsVGltZSxnPXRoaXMuX2N5Y2xlLHY9dGhpcy5fZHVyYXRpb24seT10aGlzLl9yYXdQcmV2VGltZTtpZih0Pj1wLTFlLTcmJnQ+PTA/KHRoaXMuX3RvdGFsVGltZT1wLHRoaXMuX2N5Y2xlPXRoaXMuX3JlcGVhdCx0aGlzLl95b3lvJiYwIT0oMSZ0aGlzLl9jeWNsZSk/KHRoaXMuX3RpbWU9MCx0aGlzLnJhdGlvPXRoaXMuX2Vhc2UuX2NhbGNFbmQ/dGhpcy5fZWFzZS5nZXRSYXRpbygwKTowKToodGhpcy5fdGltZT12LHRoaXMucmF0aW89dGhpcy5fZWFzZS5fY2FsY0VuZD90aGlzLl9lYXNlLmdldFJhdGlvKDEpOjEpLHRoaXMuX3JldmVyc2VkfHwobj0hMCxhPSJvbkNvbXBsZXRlIixpPWl8fHRoaXMuX3RpbWVsaW5lLmF1dG9SZW1vdmVDaGlsZHJlbiksMD09PXYmJih0aGlzLl9pbml0dGVkfHwhdGhpcy52YXJzLmxhenl8fGkpJiYodGhpcy5fc3RhcnRUaW1lPT09dGhpcy5fdGltZWxpbmUuX2R1cmF0aW9uJiYodD0wKSwoeTwwfHx0PD0wJiZ0Pj0tMWUtN3x8MWUtMTA9PT15JiYiaXNQYXVzZSIhPT10aGlzLmRhdGEpJiZ5IT09dCYmKGk9ITAseT4xZS0xMCYmKGE9Im9uUmV2ZXJzZUNvbXBsZXRlIikpLHRoaXMuX3Jhd1ByZXZUaW1lPWM9IWV8fHR8fHk9PT10P3Q6MWUtMTApKTp0PDFlLTc/KHRoaXMuX3RvdGFsVGltZT10aGlzLl90aW1lPXRoaXMuX2N5Y2xlPTAsdGhpcy5yYXRpbz10aGlzLl9lYXNlLl9jYWxjRW5kP3RoaXMuX2Vhc2UuZ2V0UmF0aW8oMCk6MCwoMCE9PW18fDA9PT12JiZ5PjApJiYoYT0ib25SZXZlcnNlQ29tcGxldGUiLG49dGhpcy5fcmV2ZXJzZWQpLHQ8MCYmKHRoaXMuX2FjdGl2ZT0hMSwwPT09diYmKHRoaXMuX2luaXR0ZWR8fCF0aGlzLnZhcnMubGF6eXx8aSkmJih5Pj0wJiYoaT0hMCksdGhpcy5fcmF3UHJldlRpbWU9Yz0hZXx8dHx8eT09PXQ/dDoxZS0xMCkpLHRoaXMuX2luaXR0ZWR8fChpPSEwKSk6KHRoaXMuX3RvdGFsVGltZT10aGlzLl90aW1lPXQsMCE9PXRoaXMuX3JlcGVhdCYmKGw9dit0aGlzLl9yZXBlYXREZWxheSx0aGlzLl9jeWNsZT10aGlzLl90b3RhbFRpbWUvbD4+MCwwIT09dGhpcy5fY3ljbGUmJnRoaXMuX2N5Y2xlPT09dGhpcy5fdG90YWxUaW1lL2wmJm08PXQmJnRoaXMuX2N5Y2xlLS0sdGhpcy5fdGltZT10aGlzLl90b3RhbFRpbWUtdGhpcy5fY3ljbGUqbCx0aGlzLl95b3lvJiYwIT0oMSZ0aGlzLl9jeWNsZSkmJih0aGlzLl90aW1lPXYtdGhpcy5fdGltZSwoZj10aGlzLl95b3lvRWFzZXx8dGhpcy52YXJzLnlveW9FYXNlKSYmKHRoaXMuX3lveW9FYXNlfHwoITAhPT1mfHx0aGlzLl9pbml0dGVkP3RoaXMuX3lveW9FYXNlPWY9ITA9PT1mP3RoaXMuX2Vhc2U6ZiBpbnN0YW5jZW9mIHIuYj9mOnIuYi5tYXBbZl06KGY9dGhpcy52YXJzLmVhc2UsdGhpcy5feW95b0Vhc2U9Zj1mP2YgaW5zdGFuY2VvZiByLmI/ZjoiZnVuY3Rpb24iPT10eXBlb2YgZj9uZXcgci5iKGYsdGhpcy52YXJzLmVhc2VQYXJhbXMpOnIuYi5tYXBbZl18fHIubC5kZWZhdWx0RWFzZTpyLmwuZGVmYXVsdEVhc2UpKSx0aGlzLnJhdGlvPWY/MS1mLmdldFJhdGlvKCh2LXRoaXMuX3RpbWUpL3YpOjApKSx0aGlzLl90aW1lPnY/dGhpcy5fdGltZT12OnRoaXMuX3RpbWU8MCYmKHRoaXMuX3RpbWU9MCkpLHRoaXMuX2Vhc2VUeXBlJiYhZj8oaD10aGlzLl90aW1lL3YsdT10aGlzLl9lYXNlVHlwZSxfPXRoaXMuX2Vhc2VQb3dlciwoMT09PXV8fDM9PT11JiZoPj0uNSkmJihoPTEtaCksMz09PXUmJihoKj0yKSwxPT09Xz9oKj1oOjI9PT1fP2gqPWgqaDozPT09Xz9oKj1oKmgqaDo0PT09XyYmKGgqPWgqaCpoKmgpLDE9PT11P3RoaXMucmF0aW89MS1oOjI9PT11P3RoaXMucmF0aW89aDp0aGlzLl90aW1lL3Y8LjU/dGhpcy5yYXRpbz1oLzI6dGhpcy5yYXRpbz0xLWgvMik6Znx8KHRoaXMucmF0aW89dGhpcy5fZWFzZS5nZXRSYXRpbyh0aGlzLl90aW1lL3YpKSksZCE9PXRoaXMuX3RpbWV8fGl8fGchPT10aGlzLl9jeWNsZSl7aWYoIXRoaXMuX2luaXR0ZWQpe2lmKHRoaXMuX2luaXQoKSwhdGhpcy5faW5pdHRlZHx8dGhpcy5fZ2MpcmV0dXJuO2lmKCFpJiZ0aGlzLl9maXJzdFBUJiYoITEhPT10aGlzLnZhcnMubGF6eSYmdGhpcy5fZHVyYXRpb258fHRoaXMudmFycy5sYXp5JiYhdGhpcy5fZHVyYXRpb24pKXJldHVybiB0aGlzLl90aW1lPWQsdGhpcy5fdG90YWxUaW1lPW0sdGhpcy5fcmF3UHJldlRpbWU9eSx0aGlzLl9jeWNsZT1nLHMubGF6eVR3ZWVucy5wdXNoKHRoaXMpLHZvaWQodGhpcy5fbGF6eT1bdCxlXSk7IXRoaXMuX3RpbWV8fG58fGY/biYmdGhpcy5fZWFzZS5fY2FsY0VuZCYmIWYmJih0aGlzLnJhdGlvPXRoaXMuX2Vhc2UuZ2V0UmF0aW8oMD09PXRoaXMuX3RpbWU/MDoxKSk6dGhpcy5yYXRpbz10aGlzLl9lYXNlLmdldFJhdGlvKHRoaXMuX3RpbWUvdil9Zm9yKCExIT09dGhpcy5fbGF6eSYmKHRoaXMuX2xhenk9ITEpLHRoaXMuX2FjdGl2ZXx8IXRoaXMuX3BhdXNlZCYmdGhpcy5fdGltZSE9PWQmJnQ+PTAmJih0aGlzLl9hY3RpdmU9ITApLDA9PT1tJiYoMj09PXRoaXMuX2luaXR0ZWQmJnQ+MCYmdGhpcy5faW5pdCgpLHRoaXMuX3N0YXJ0QXQmJih0Pj0wP3RoaXMuX3N0YXJ0QXQucmVuZGVyKHQsITAsaSk6YXx8KGE9Il9kdW1teUdTIikpLHRoaXMudmFycy5vblN0YXJ0JiYoMD09PXRoaXMuX3RvdGFsVGltZSYmMCE9PXZ8fGV8fHRoaXMuX2NhbGxiYWNrKCJvblN0YXJ0IikpKSxvPXRoaXMuX2ZpcnN0UFQ7bzspby5mP28udFtvLnBdKG8uYyp0aGlzLnJhdGlvK28ucyk6by50W28ucF09by5jKnRoaXMucmF0aW8rby5zLG89by5fbmV4dDt0aGlzLl9vblVwZGF0ZSYmKHQ8MCYmdGhpcy5fc3RhcnRBdCYmdGhpcy5fc3RhcnRUaW1lJiZ0aGlzLl9zdGFydEF0LnJlbmRlcih0LCEwLGkpLGV8fCh0aGlzLl90b3RhbFRpbWUhPT1tfHxhKSYmdGhpcy5fY2FsbGJhY2soIm9uVXBkYXRlIikpLHRoaXMuX2N5Y2xlIT09ZyYmKGV8fHRoaXMuX2djfHx0aGlzLnZhcnMub25SZXBlYXQmJnRoaXMuX2NhbGxiYWNrKCJvblJlcGVhdCIpKSxhJiYodGhpcy5fZ2MmJiFpfHwodDwwJiZ0aGlzLl9zdGFydEF0JiYhdGhpcy5fb25VcGRhdGUmJnRoaXMuX3N0YXJ0VGltZSYmdGhpcy5fc3RhcnRBdC5yZW5kZXIodCwhMCxpKSxuJiYodGhpcy5fdGltZWxpbmUuYXV0b1JlbW92ZUNoaWxkcmVuJiZ0aGlzLl9lbmFibGVkKCExLCExKSx0aGlzLl9hY3RpdmU9ITEpLCFlJiZ0aGlzLnZhcnNbYV0mJnRoaXMuX2NhbGxiYWNrKGEpLDA9PT12JiYxZS0xMD09PXRoaXMuX3Jhd1ByZXZUaW1lJiYxZS0xMCE9PWMmJih0aGlzLl9yYXdQcmV2VGltZT0wKSkpfWVsc2UgbSE9PXRoaXMuX3RvdGFsVGltZSYmdGhpcy5fb25VcGRhdGUmJihlfHx0aGlzLl9jYWxsYmFjaygib25VcGRhdGUiKSl9LGkudG89ZnVuY3Rpb24odCxlLHIpe3JldHVybiBuZXcgaSh0LGUscil9LGkuZnJvbT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHIucnVuQmFja3dhcmRzPSEwLHIuaW1tZWRpYXRlUmVuZGVyPTAhPXIuaW1tZWRpYXRlUmVuZGVyLG5ldyBpKHQsZSxyKX0saS5mcm9tVG89ZnVuY3Rpb24odCxlLHIscyl7cmV0dXJuIHMuc3RhcnRBdD1yLHMuaW1tZWRpYXRlUmVuZGVyPTAhPXMuaW1tZWRpYXRlUmVuZGVyJiYwIT1yLmltbWVkaWF0ZVJlbmRlcixuZXcgaSh0LGUscyl9LGkuc3RhZ2dlclRvPWkuYWxsVG89ZnVuY3Rpb24ocyxvLGgsdSxfLGMsZil7dT11fHwwO3ZhciBwLGQsbSxnLHY9MCx5PVtdLFQ9ZnVuY3Rpb24oKXtoLm9uQ29tcGxldGUmJmgub25Db21wbGV0ZS5hcHBseShoLm9uQ29tcGxldGVTY29wZXx8dGhpcyxhcmd1bWVudHMpLF8uYXBwbHkoZnx8aC5jYWxsYmFja1Njb3BlfHx0aGlzLGN8fGwpfSx3PWguY3ljbGUseD1oLnN0YXJ0QXQmJmguc3RhcnRBdC5jeWNsZTtmb3IoYShzKXx8KCJzdHJpbmciPT10eXBlb2YgcyYmKHM9ci5sLnNlbGVjdG9yKHMpfHxzKSxuKHMpJiYocz10KHMpKSkscz1zfHxbXSx1PDAmJigocz10KHMpKS5yZXZlcnNlKCksdSo9LTEpLHA9cy5sZW5ndGgtMSxtPTA7bTw9cDttKyspe2ZvcihnIGluIGQ9e30saClkW2ddPWhbZ107aWYodyYmKGUoZCxzLG0pLG51bGwhPWQuZHVyYXRpb24mJihvPWQuZHVyYXRpb24sZGVsZXRlIGQuZHVyYXRpb24pKSx4KXtmb3IoZyBpbiB4PWQuc3RhcnRBdD17fSxoLnN0YXJ0QXQpeFtnXT1oLnN0YXJ0QXRbZ107ZShkLnN0YXJ0QXQscyxtKX1kLmRlbGF5PXYrKGQuZGVsYXl8fDApLG09PT1wJiZfJiYoZC5vbkNvbXBsZXRlPVQpLHlbbV09bmV3IGkoc1ttXSxvLGQpLHYrPXV9cmV0dXJuIHl9LGkuc3RhZ2dlckZyb209aS5hbGxGcm9tPWZ1bmN0aW9uKHQsZSxyLHMsbixhLG8pe3JldHVybiByLnJ1bkJhY2t3YXJkcz0hMCxyLmltbWVkaWF0ZVJlbmRlcj0wIT1yLmltbWVkaWF0ZVJlbmRlcixpLnN0YWdnZXJUbyh0LGUscixzLG4sYSxvKX0saS5zdGFnZ2VyRnJvbVRvPWkuYWxsRnJvbVRvPWZ1bmN0aW9uKHQsZSxyLHMsbixhLG8sbCl7cmV0dXJuIHMuc3RhcnRBdD1yLHMuaW1tZWRpYXRlUmVuZGVyPTAhPXMuaW1tZWRpYXRlUmVuZGVyJiYwIT1yLmltbWVkaWF0ZVJlbmRlcixpLnN0YWdnZXJUbyh0LGUscyxuLGEsbyxsKX0saS5kZWxheWVkQ2FsbD1mdW5jdGlvbih0LGUscixzLG4pe3JldHVybiBuZXcgaShlLDAse2RlbGF5OnQsb25Db21wbGV0ZTplLG9uQ29tcGxldGVQYXJhbXM6cixjYWxsYmFja1Njb3BlOnMsb25SZXZlcnNlQ29tcGxldGU6ZSxvblJldmVyc2VDb21wbGV0ZVBhcmFtczpyLGltbWVkaWF0ZVJlbmRlcjohMSx1c2VGcmFtZXM6bixvdmVyd3JpdGU6MH0pfSxpLnNldD1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgaSh0LDAsZSl9LGkuaXNUd2VlbmluZz1mdW5jdGlvbih0KXtyZXR1cm4gci5sLmdldFR3ZWVuc09mKHQsITApLmxlbmd0aD4wfTt2YXIgaD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1bXSxzPTAsbj10Ll9maXJzdDtuOyluIGluc3RhbmNlb2Ygci5sP2lbcysrXT1uOihlJiYoaVtzKytdPW4pLHM9KGk9aS5jb25jYXQoaChuLGUpKSkubGVuZ3RoKSxuPW4uX25leHQ7cmV0dXJuIGl9LHU9aS5nZXRBbGxUd2VlbnM9ZnVuY3Rpb24odCl7cmV0dXJuIGgoci5hLl9yb290VGltZWxpbmUsdCkuY29uY2F0KGgoci5hLl9yb290RnJhbWVzVGltZWxpbmUsdCkpfTtpLmtpbGxBbGw9ZnVuY3Rpb24odCxlLGkscyl7bnVsbD09ZSYmKGU9ITApLG51bGw9PWkmJihpPSEwKTt2YXIgbixhLG8sbD11KDAhPXMpLGg9bC5sZW5ndGgsXz1lJiZpJiZzO2ZvcihvPTA7bzxoO28rKylhPWxbb10sKF98fGEgaW5zdGFuY2VvZiByLml8fChuPWEudGFyZ2V0PT09YS52YXJzLm9uQ29tcGxldGUpJiZpfHxlJiYhbikmJih0P2EudG90YWxUaW1lKGEuX3JldmVyc2VkPzA6YS50b3RhbER1cmF0aW9uKCkpOmEuX2VuYWJsZWQoITEsITEpKX0saS5raWxsQ2hpbGRUd2VlbnNPZj1mdW5jdGlvbihlLG8pe2lmKG51bGwhPWUpe3ZhciBsLGgsdSxfLGMsZj1zLnR3ZWVuTG9va3VwO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9ci5sLnNlbGVjdG9yKGUpfHxlKSxuKGUpJiYoZT10KGUpKSxhKGUpKWZvcihfPWUubGVuZ3RoOy0tXz4tMTspaS5raWxsQ2hpbGRUd2VlbnNPZihlW19dLG8pO2Vsc2V7Zm9yKHUgaW4gbD1bXSxmKWZvcihoPWZbdV0udGFyZ2V0LnBhcmVudE5vZGU7aDspaD09PWUmJihsPWwuY29uY2F0KGZbdV0udHdlZW5zKSksaD1oLnBhcmVudE5vZGU7Zm9yKGM9bC5sZW5ndGgsXz0wO188YztfKyspbyYmbFtfXS50b3RhbFRpbWUobFtfXS50b3RhbER1cmF0aW9uKCkpLGxbX10uX2VuYWJsZWQoITEsITEpfX19O3ZhciBfPWZ1bmN0aW9uKHQsZSxpLHMpe2U9ITEhPT1lLGk9ITEhPT1pO2Zvcih2YXIgbixhLG89dShzPSExIT09cyksbD1lJiZpJiZzLGg9by5sZW5ndGg7LS1oPi0xOylhPW9baF0sKGx8fGEgaW5zdGFuY2VvZiByLml8fChuPWEudGFyZ2V0PT09YS52YXJzLm9uQ29tcGxldGUpJiZpfHxlJiYhbikmJmEucGF1c2VkKHQpfTtyZXR1cm4gaS5wYXVzZUFsbD1mdW5jdGlvbih0LGUsaSl7XyghMCx0LGUsaSl9LGkucmVzdW1lQWxsPWZ1bmN0aW9uKHQsZSxpKXtfKCExLHQsZSxpKX0saS5nbG9iYWxUaW1lU2NhbGU9ZnVuY3Rpb24odCl7dmFyIGU9ci5hLl9yb290VGltZWxpbmUsaT1yLmwudGlja2VyLnRpbWU7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9dHx8MWUtMTAsZS5fc3RhcnRUaW1lPWktKGktZS5fc3RhcnRUaW1lKSplLl90aW1lU2NhbGUvdCxlPXIuYS5fcm9vdEZyYW1lc1RpbWVsaW5lLGk9ci5sLnRpY2tlci5mcmFtZSxlLl9zdGFydFRpbWU9aS0oaS1lLl9zdGFydFRpbWUpKmUuX3RpbWVTY2FsZS90LGUuX3RpbWVTY2FsZT1yLmEuX3Jvb3RUaW1lbGluZS5fdGltZVNjYWxlPXQsdCk6ZS5fdGltZVNjYWxlfSxvLnByb2dyZXNzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy50b3RhbFRpbWUodGhpcy5kdXJhdGlvbigpKih0aGlzLl95b3lvJiYwIT0oMSZ0aGlzLl9jeWNsZSk/MS10OnQpK3RoaXMuX2N5Y2xlKih0aGlzLl9kdXJhdGlvbit0aGlzLl9yZXBlYXREZWxheSksZSk6dGhpcy5fdGltZS90aGlzLmR1cmF0aW9uKCl9LG8udG90YWxQcm9ncmVzcz1mdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMudG90YWxUaW1lKHRoaXMudG90YWxEdXJhdGlvbigpKnQsZSk6dGhpcy5fdG90YWxUaW1lL3RoaXMudG90YWxEdXJhdGlvbigpfSxvLnRpbWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5fZGlydHkmJnRoaXMudG90YWxEdXJhdGlvbigpLHQ+dGhpcy5fZHVyYXRpb24mJih0PXRoaXMuX2R1cmF0aW9uKSx0aGlzLl95b3lvJiYwIT0oMSZ0aGlzLl9jeWNsZSk/dD10aGlzLl9kdXJhdGlvbi10K3RoaXMuX2N5Y2xlKih0aGlzLl9kdXJhdGlvbit0aGlzLl9yZXBlYXREZWxheSk6MCE9PXRoaXMuX3JlcGVhdCYmKHQrPXRoaXMuX2N5Y2xlKih0aGlzLl9kdXJhdGlvbit0aGlzLl9yZXBlYXREZWxheSkpLHRoaXMudG90YWxUaW1lKHQsZSkpOnRoaXMuX3RpbWV9LG8uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ci5hLnByb3RvdHlwZS5kdXJhdGlvbi5jYWxsKHRoaXMsdCk6dGhpcy5fZHVyYXRpb259LG8udG90YWxEdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8tMT09PXRoaXMuX3JlcGVhdD90aGlzOnRoaXMuZHVyYXRpb24oKHQtdGhpcy5fcmVwZWF0KnRoaXMuX3JlcGVhdERlbGF5KS8odGhpcy5fcmVwZWF0KzEpKToodGhpcy5fZGlydHkmJih0aGlzLl90b3RhbER1cmF0aW9uPS0xPT09dGhpcy5fcmVwZWF0Pzk5OTk5OTk5OTk5OTp0aGlzLl9kdXJhdGlvbioodGhpcy5fcmVwZWF0KzEpK3RoaXMuX3JlcGVhdERlbGF5KnRoaXMuX3JlcGVhdCx0aGlzLl9kaXJ0eT0hMSksdGhpcy5fdG90YWxEdXJhdGlvbil9LG8ucmVwZWF0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl9yZXBlYXQ9dCx0aGlzLl91bmNhY2hlKCEwKSk6dGhpcy5fcmVwZWF0fSxvLnJlcGVhdERlbGF5PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl9yZXBlYXREZWxheT10LHRoaXMuX3VuY2FjaGUoITApKTp0aGlzLl9yZXBlYXREZWxheX0sby55b3lvPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl95b3lvPXQsdGhpcyk6dGhpcy5feW95b30saX0sITApO3ZhciBhPXIubS5Ud2Vlbk1heDsNCi8qIQ0KICogVkVSU0lPTjogMi4wLjINCiAqIERBVEU6IDIwMTgtMDgtMjcNCiAqIFVQREFURVMgQU5EIERPQ1MgQVQ6IGh0dHA6Ly9ncmVlbnNvY2suY29tDQogKg0KICogQGxpY2Vuc2UgQ29weXJpZ2h0IChjKSAyMDA4LTIwMTgsIEdyZWVuU29jay4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAqIFRoaXMgd29yayBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhdCBodHRwOi8vZ3JlZW5zb2NrLmNvbS9zdGFuZGFyZC1saWNlbnNlIG9yIGZvcg0KICogQ2x1YiBHcmVlblNvY2sgbWVtYmVycywgdGhlIHNvZnR3YXJlIGFncmVlbWVudCB0aGF0IHdhcyBpc3N1ZWQgd2l0aCB5b3VyIG1lbWJlcnNoaXAuDQogKiANCiAqIEBhdXRob3I6IEphY2sgRG95bGUsIGphY2tAZ3JlZW5zb2NrLmNvbQ0KICovDQpyLmsuX2dzRGVmaW5lKCJwbHVnaW5zLkNTU1BsdWdpbiIsWyJwbHVnaW5zLlR3ZWVuUGx1Z2luIiwiVHdlZW5MaXRlIl0sZnVuY3Rpb24oKXt2YXIgdCxlLGkscyxuPWZ1bmN0aW9uKCl7ci5qLmNhbGwodGhpcywiY3NzIiksdGhpcy5fb3ZlcndyaXRlUHJvcHMubGVuZ3RoPTAsdGhpcy5zZXRSYXRpbz1uLnByb3RvdHlwZS5zZXRSYXRpb30sYT1yLmsuX2dzRGVmaW5lLmdsb2JhbHMsbz17fSxsPW4ucHJvdG90eXBlPW5ldyByLmooImNzcyIpO2wuY29uc3RydWN0b3I9bixuLnZlcnNpb249IjIuMC4yIixuLkFQST0yLG4uZGVmYXVsdFRyYW5zZm9ybVBlcnNwZWN0aXZlPTAsbi5kZWZhdWx0U2tld1R5cGU9ImNvbXBlbnNhdGVkIixuLmRlZmF1bHRTbW9vdGhPcmlnaW49ITAsbD0icHgiLG4uc3VmZml4TWFwPXt0b3A6bCxyaWdodDpsLGJvdHRvbTpsLGxlZnQ6bCx3aWR0aDpsLGhlaWdodDpsLGZvbnRTaXplOmwscGFkZGluZzpsLG1hcmdpbjpsLHBlcnNwZWN0aXZlOmwsbGluZUhlaWdodDoiIn07dmFyIGgsdSxfLGMsZixwLGQsbSxnPS8oPzpcLXxcLnxcYikoXGR8XC58ZVwtKSsvZyx2PS8oPzpcZHxcLVxkfFwuXGR8XC1cLlxkfFwrPVxkfFwtPVxkfFwrPS5cZHxcLT1cLlxkKSsvZyx5PS8oPzpcKz18XC09fFwtfFxiKVtcZFwtXC5dK1thLXpBLVowLTldKig/OiV8XGIpL2dpLFQ9Lyg/IVsrLV0/XGQqXC4/XGQrfFsrLV18ZVsrLV1cZCspW14wLTldL2csdz0vKD86XGR8XC18XCt8PXwjfFwuKSovZyx4PS9vcGFjaXR5ICo9ICooW14pXSopL2ksYj0vb3BhY2l0eTooW147XSopL2ksUD0vYWxwaGFcKG9wYWNpdHkgKj0uKz9cKS9pLFM9L14ocmdifGhzbCkvLGs9LyhbQS1aXSkvZyxSPS8tKFthLXpdKS9naSxPPS8oXig/OnVybFwoXCJ8dXJsXCgpKXwoPzooXCJcKSkkfFwpJCkvZ2ksQT1mdW5jdGlvbih0LGUpe3JldHVybiBlLnRvVXBwZXJDYXNlKCl9LEM9Lyg/OkxlZnR8UmlnaHR8V2lkdGgpL2ksRD0vKE0xMXxNMTJ8TTIxfE0yMik9W1xkXC1cLmVdKy9naSxNPS9wcm9naWRcOkRYSW1hZ2VUcmFuc2Zvcm1cLk1pY3Jvc29mdFwuTWF0cml4XCguKz9cKS9pLEU9LywoPz1bXlwpXSooPzpcKHwkKSkvZ2ksRj0vW1xzLFwoXS9pLHo9TWF0aC5QSS8xODAsST0xODAvTWF0aC5QSSxMPXt9LE49e3N0eWxlOnt9fSxYPXIuay5kb2N1bWVudHx8e2NyZWF0ZUVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gTn19LEI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gWC5jcmVhdGVFbGVtZW50TlM/WC5jcmVhdGVFbGVtZW50TlMoZXx8Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLHQpOlguY3JlYXRlRWxlbWVudCh0KX0saj1CKCJkaXYiKSxVPUIoImltZyIpLFk9bi5faW50ZXJuYWxzPXtfc3BlY2lhbFByb3BzOm99LFY9KHIuay5uYXZpZ2F0b3J8fHt9KS51c2VyQWdlbnR8fCIiLEc9ZnVuY3Rpb24oKXt2YXIgdD1WLmluZGV4T2YoIkFuZHJvaWQiKSxlPUIoImEiKTtyZXR1cm4gXz0tMSE9PVYuaW5kZXhPZigiU2FmYXJpIikmJi0xPT09Vi5pbmRleE9mKCJDaHJvbWUiKSYmKC0xPT09dHx8cGFyc2VGbG9hdChWLnN1YnN0cih0KzgsMikpPjMpLGY9XyYmcGFyc2VGbG9hdChWLnN1YnN0cihWLmluZGV4T2YoIlZlcnNpb24vIikrOCwyKSk8NixjPS0xIT09Vi5pbmRleE9mKCJGaXJlZm94IiksKC9NU0lFIChbMC05XXsxLH1bXC4wLTldezAsfSkvLmV4ZWMoVil8fC9UcmlkZW50XC8uKnJ2OihbMC05XXsxLH1bXC4wLTldezAsfSkvLmV4ZWMoVikpJiYocD1wYXJzZUZsb2F0KFJlZ0V4cC4kMSkpLCEhZSYmKGUuc3R5bGUuY3NzVGV4dD0idG9wOjFweDtvcGFjaXR5Oi41NTsiLC9eMC41NS8udGVzdChlLnN0eWxlLm9wYWNpdHkpKX0oKSxxPWZ1bmN0aW9uKHQpe3JldHVybiB4LnRlc3QoInN0cmluZyI9PXR5cGVvZiB0P3Q6KHQuY3VycmVudFN0eWxlP3QuY3VycmVudFN0eWxlLmZpbHRlcjp0LnN0eWxlLmZpbHRlcil8fCIiKT9wYXJzZUZsb2F0KFJlZ0V4cC4kMSkvMTAwOjF9LFc9ZnVuY3Rpb24odCl7ci5rLmNvbnNvbGUmJmNvbnNvbGUubG9nKHQpfSxIPSIiLFo9IiIsJD1mdW5jdGlvbih0LGUpe3ZhciBpLHIscz0oZT1lfHxqKS5zdHlsZTtpZih2b2lkIDAhPT1zW3RdKXJldHVybiB0O2Zvcih0PXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSksaT1bIk8iLCJNb3oiLCJtcyIsIk1zIiwiV2Via2l0Il0scj01Oy0tcj4tMSYmdm9pZCAwPT09c1tpW3JdK3RdOyk7cmV0dXJuIHI+PTA/KEg9Ii0iKyhaPTM9PT1yPyJtcyI6aVtyXSkudG9Mb3dlckNhc2UoKSsiLSIsWit0KTpudWxsfSxRPSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6WC5kZWZhdWx0Vmlld3x8e2dldENvbXB1dGVkU3R5bGU6ZnVuY3Rpb24oKXt9fSkuZ2V0Q29tcHV0ZWRTdHlsZSxLPW4uZ2V0U3R5bGU9ZnVuY3Rpb24odCxlLGkscixzKXt2YXIgbjtyZXR1cm4gR3x8Im9wYWNpdHkiIT09ZT8oIXImJnQuc3R5bGVbZV0/bj10LnN0eWxlW2VdOihpPWl8fFEodCkpP249aVtlXXx8aS5nZXRQcm9wZXJ0eVZhbHVlKGUpfHxpLmdldFByb3BlcnR5VmFsdWUoZS5yZXBsYWNlKGssIi0kMSIpLnRvTG93ZXJDYXNlKCkpOnQuY3VycmVudFN0eWxlJiYobj10LmN1cnJlbnRTdHlsZVtlXSksbnVsbD09c3x8biYmIm5vbmUiIT09biYmImF1dG8iIT09biYmImF1dG8gYXV0byIhPT1uP246cyk6cSh0KX0sSj1ZLmNvbnZlcnRUb1BpeGVscz1mdW5jdGlvbih0LGUsaSxzLGEpe2lmKCJweCI9PT1zfHwhcyYmImxpbmVIZWlnaHQiIT09ZSlyZXR1cm4gaTtpZigiYXV0byI9PT1zfHwhaSlyZXR1cm4gMDt2YXIgbyxsLGgsdT1DLnRlc3QoZSksXz10LGM9ai5zdHlsZSxmPWk8MCxwPTE9PT1pO2lmKGYmJihpPS1pKSxwJiYoaSo9MTAwKSwibGluZUhlaWdodCIhPT1lfHxzKWlmKCIlIj09PXMmJi0xIT09ZS5pbmRleE9mKCJib3JkZXIiKSlvPWkvMTAwKih1P3QuY2xpZW50V2lkdGg6dC5jbGllbnRIZWlnaHQpO2Vsc2V7aWYoYy5jc3NUZXh0PSJib3JkZXI6MCBzb2xpZCByZWQ7cG9zaXRpb246IitLKHQsInBvc2l0aW9uIikrIjtsaW5lLWhlaWdodDowOyIsIiUiIT09cyYmXy5hcHBlbmRDaGlsZCYmInYiIT09cy5jaGFyQXQoMCkmJiJyZW0iIT09cyljW3U/ImJvcmRlckxlZnRXaWR0aCI6ImJvcmRlclRvcFdpZHRoIl09aStzO2Vsc2V7aWYoXz10LnBhcmVudE5vZGV8fFguYm9keSwtMSE9PUsoXywiZGlzcGxheSIpLmluZGV4T2YoImZsZXgiKSYmKGMucG9zaXRpb249ImFic29sdXRlIiksbD1fLl9nc0NhY2hlLGg9ci5sLnRpY2tlci5mcmFtZSxsJiZ1JiZsLnRpbWU9PT1oKXJldHVybiBsLndpZHRoKmkvMTAwO2NbdT8id2lkdGgiOiJoZWlnaHQiXT1pK3N9Xy5hcHBlbmRDaGlsZChqKSxvPXBhcnNlRmxvYXQoalt1PyJvZmZzZXRXaWR0aCI6Im9mZnNldEhlaWdodCJdKSxfLnJlbW92ZUNoaWxkKGopLHUmJiIlIj09PXMmJiExIT09bi5jYWNoZVdpZHRocyYmKChsPV8uX2dzQ2FjaGU9Xy5fZ3NDYWNoZXx8e30pLnRpbWU9aCxsLndpZHRoPW8vaSoxMDApLDAhPT1vfHxhfHwobz1KKHQsZSxpLHMsITApKX1lbHNlIGw9USh0KS5saW5lSGVpZ2h0LHQuc3R5bGUubGluZUhlaWdodD1pLG89cGFyc2VGbG9hdChRKHQpLmxpbmVIZWlnaHQpLHQuc3R5bGUubGluZUhlaWdodD1sO3JldHVybiBwJiYoby89MTAwKSxmPy1vOm99LHR0PVkuY2FsY3VsYXRlT2Zmc2V0PWZ1bmN0aW9uKHQsZSxpKXtpZigiYWJzb2x1dGUiIT09Syh0LCJwb3NpdGlvbiIsaSkpcmV0dXJuIDA7dmFyIHI9ImxlZnQiPT09ZT8iTGVmdCI6IlRvcCIscz1LKHQsIm1hcmdpbiIrcixpKTtyZXR1cm4gdFsib2Zmc2V0IityXS0oSih0LGUscGFyc2VGbG9hdChzKSxzLnJlcGxhY2UodywiIikpfHwwKX0sZXQ9ZnVuY3Rpb24odCxlKXt2YXIgaSxyLHMsbj17fTtpZihlPWV8fFEodCxudWxsKSlpZihpPWUubGVuZ3RoKWZvcig7LS1pPi0xOyktMSE9PShzPWVbaV0pLmluZGV4T2YoIi10cmFuc2Zvcm0iKSYmT3QhPT1zfHwobltzLnJlcGxhY2UoUixBKV09ZS5nZXRQcm9wZXJ0eVZhbHVlKHMpKTtlbHNlIGZvcihpIGluIGUpLTEhPT1pLmluZGV4T2YoIlRyYW5zZm9ybSIpJiZSdCE9PWl8fChuW2ldPWVbaV0pO2Vsc2UgaWYoZT10LmN1cnJlbnRTdHlsZXx8dC5zdHlsZSlmb3IoaSBpbiBlKSJzdHJpbmciPT10eXBlb2YgaSYmdm9pZCAwPT09bltpXSYmKG5baS5yZXBsYWNlKFIsQSldPWVbaV0pO3JldHVybiBHfHwobi5vcGFjaXR5PXEodCkpLHI9anQodCxlLCExKSxuLnJvdGF0aW9uPXIucm90YXRpb24sbi5za2V3WD1yLnNrZXdYLG4uc2NhbGVYPXIuc2NhbGVYLG4uc2NhbGVZPXIuc2NhbGVZLG4ueD1yLngsbi55PXIueSxDdCYmKG4uej1yLnosbi5yb3RhdGlvblg9ci5yb3RhdGlvblgsbi5yb3RhdGlvblk9ci5yb3RhdGlvblksbi5zY2FsZVo9ci5zY2FsZVopLG4uZmlsdGVycyYmZGVsZXRlIG4uZmlsdGVycyxufSxpdD1mdW5jdGlvbih0LGUsaSxyLHMpe3ZhciBuLGEsbyxsPXt9LGg9dC5zdHlsZTtmb3IoYSBpbiBpKSJjc3NUZXh0IiE9PWEmJiJsZW5ndGgiIT09YSYmaXNOYU4oYSkmJihlW2FdIT09KG49aVthXSl8fHMmJnNbYV0pJiYtMT09PWEuaW5kZXhPZigiT3JpZ2luIikmJigibnVtYmVyIiE9dHlwZW9mIG4mJiJzdHJpbmciIT10eXBlb2Ygbnx8KGxbYV09ImF1dG8iIT09bnx8ImxlZnQiIT09YSYmInRvcCIhPT1hPyIiIT09biYmImF1dG8iIT09biYmIm5vbmUiIT09bnx8InN0cmluZyIhPXR5cGVvZiBlW2FdfHwiIj09PWVbYV0ucmVwbGFjZShULCIiKT9uOjA6dHQodCxhKSx2b2lkIDAhPT1oW2FdJiYobz1uZXcgZ3QoaCxhLGhbYV0sbykpKSk7aWYocilmb3IoYSBpbiByKSJjbGFzc05hbWUiIT09YSYmKGxbYV09clthXSk7cmV0dXJue2RpZnM6bCxmaXJzdE1QVDpvfX0scnQ9e3dpZHRoOlsiTGVmdCIsIlJpZ2h0Il0saGVpZ2h0OlsiVG9wIiwiQm90dG9tIl19LHN0PVsibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIl0sbnQ9ZnVuY3Rpb24odCxlLGkpe2lmKCJzdmciPT09KHQubm9kZU5hbWUrIiIpLnRvTG93ZXJDYXNlKCkpcmV0dXJuKGl8fFEodCkpW2VdfHwwO2lmKHQuZ2V0Q1RNJiZOdCh0KSlyZXR1cm4gdC5nZXRCQm94KClbZV18fDA7dmFyIHI9cGFyc2VGbG9hdCgid2lkdGgiPT09ZT90Lm9mZnNldFdpZHRoOnQub2Zmc2V0SGVpZ2h0KSxzPXJ0W2VdLG49cy5sZW5ndGg7Zm9yKGk9aXx8USh0LG51bGwpOy0tbj4tMTspci09cGFyc2VGbG9hdChLKHQsInBhZGRpbmciK3Nbbl0saSwhMCkpfHwwLHItPXBhcnNlRmxvYXQoSyh0LCJib3JkZXIiK3Nbbl0rIldpZHRoIixpLCEwKSl8fDA7cmV0dXJuIHJ9LGF0PWZ1bmN0aW9uKHQsZSl7aWYoImNvbnRhaW4iPT09dHx8ImF1dG8iPT09dHx8ImF1dG8gYXV0byI9PT10KXJldHVybiB0KyIgIjtudWxsIT10JiYiIiE9PXR8fCh0PSIwIDAiKTt2YXIgaSxyPXQuc3BsaXQoIiAiKSxzPS0xIT09dC5pbmRleE9mKCJsZWZ0Iik/IjAlIjotMSE9PXQuaW5kZXhPZigicmlnaHQiKT8iMTAwJSI6clswXSxuPS0xIT09dC5pbmRleE9mKCJ0b3AiKT8iMCUiOi0xIT09dC5pbmRleE9mKCJib3R0b20iKT8iMTAwJSI6clsxXTtpZihyLmxlbmd0aD4zJiYhZSl7Zm9yKHI9dC5zcGxpdCgiLCAiKS5qb2luKCIsIikuc3BsaXQoIiwiKSx0PVtdLGk9MDtpPHIubGVuZ3RoO2krKyl0LnB1c2goYXQocltpXSkpO3JldHVybiB0LmpvaW4oIiwiKX1yZXR1cm4gbnVsbD09bj9uPSJjZW50ZXIiPT09cz8iNTAlIjoiMCI6ImNlbnRlciI9PT1uJiYobj0iNTAlIiksKCJjZW50ZXIiPT09c3x8aXNOYU4ocGFyc2VGbG9hdChzKSkmJi0xPT09KHMrIiIpLmluZGV4T2YoIj0iKSkmJihzPSI1MCUiKSx0PXMrIiAiK24rKHIubGVuZ3RoPjI/IiAiK3JbMl06IiIpLGUmJihlLm94cD0tMSE9PXMuaW5kZXhPZigiJSIpLGUub3lwPS0xIT09bi5pbmRleE9mKCIlIiksZS5veHI9Ij0iPT09cy5jaGFyQXQoMSksZS5veXI9Ij0iPT09bi5jaGFyQXQoMSksZS5veD1wYXJzZUZsb2F0KHMucmVwbGFjZShULCIiKSksZS5veT1wYXJzZUZsb2F0KG4ucmVwbGFjZShULCIiKSksZS52PXQpLGV8fHR9LG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQobSxkKSksInN0cmluZyI9PXR5cGVvZiB0JiYiPSI9PT10LmNoYXJBdCgxKT9wYXJzZUludCh0LmNoYXJBdCgwKSsiMSIsMTApKnBhcnNlRmxvYXQodC5zdWJzdHIoMikpOnBhcnNlRmxvYXQodCktcGFyc2VGbG9hdChlKXx8MH0sbHQ9ZnVuY3Rpb24odCxlKXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dChtLGQpKTt2YXIgaT0ic3RyaW5nIj09dHlwZW9mIHQmJiI9Ij09PXQuY2hhckF0KDEpO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmInYiPT09dC5jaGFyQXQodC5sZW5ndGgtMikmJih0PShpP3Quc3Vic3RyKDAsMik6MCkrd2luZG93WyJpbm5lciIrKCJ2aCI9PT10LnN1YnN0cigtMik/IkhlaWdodCI6IldpZHRoIildKihwYXJzZUZsb2F0KGk/dC5zdWJzdHIoMik6dCkvMTAwKSksbnVsbD09dD9lOmk/cGFyc2VJbnQodC5jaGFyQXQoMCkrIjEiLDEwKSpwYXJzZUZsb2F0KHQuc3Vic3RyKDIpKStlOnBhcnNlRmxvYXQodCl8fDB9LGh0PWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBzLG4sYSxvLGw7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQobSxkKSksbnVsbD09dD9vPWU6Im51bWJlciI9PXR5cGVvZiB0P289dDoocz0zNjAsbj10LnNwbGl0KCJfIiksYT0oKGw9Ij0iPT09dC5jaGFyQXQoMSkpP3BhcnNlSW50KHQuY2hhckF0KDApKyIxIiwxMCkqcGFyc2VGbG9hdChuWzBdLnN1YnN0cigyKSk6cGFyc2VGbG9hdChuWzBdKSkqKC0xPT09dC5pbmRleE9mKCJyYWQiKT8xOkkpLShsPzA6ZSksbi5sZW5ndGgmJihyJiYocltpXT1lK2EpLC0xIT09dC5pbmRleE9mKCJzaG9ydCIpJiYoYSU9cykhPT1hJShzLzIpJiYoYT1hPDA/YStzOmEtcyksLTEhPT10LmluZGV4T2YoIl9jdyIpJiZhPDA/YT0oYSs5OTk5OTk5OTk5KnMpJXMtKGEvc3wwKSpzOi0xIT09dC5pbmRleE9mKCJjY3ciKSYmYT4wJiYoYT0oYS05OTk5OTk5OTk5KnMpJXMtKGEvc3wwKSpzKSksbz1lK2EpLG88MWUtNiYmbz4tMWUtNiYmKG89MCksb30sdXQ9e2FxdWE6WzAsMjU1LDI1NV0sbGltZTpbMCwyNTUsMF0sc2lsdmVyOlsxOTIsMTkyLDE5Ml0sYmxhY2s6WzAsMCwwXSxtYXJvb246WzEyOCwwLDBdLHRlYWw6WzAsMTI4LDEyOF0sYmx1ZTpbMCwwLDI1NV0sbmF2eTpbMCwwLDEyOF0sd2hpdGU6WzI1NSwyNTUsMjU1XSxmdWNoc2lhOlsyNTUsMCwyNTVdLG9saXZlOlsxMjgsMTI4LDBdLHllbGxvdzpbMjU1LDI1NSwwXSxvcmFuZ2U6WzI1NSwxNjUsMF0sZ3JheTpbMTI4LDEyOCwxMjhdLHB1cnBsZTpbMTI4LDAsMTI4XSxncmVlbjpbMCwxMjgsMF0scmVkOlsyNTUsMCwwXSxwaW5rOlsyNTUsMTkyLDIwM10sY3lhbjpbMCwyNTUsMjU1XSx0cmFuc3BhcmVudDpbMjU1LDI1NSwyNTUsMF19LF90PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gMjU1Kig2Kih0PXQ8MD90KzE6dD4xP3QtMTp0KTwxP2UrKGktZSkqdCo2OnQ8LjU/aTozKnQ8Mj9lKyhpLWUpKigyLzMtdCkqNjplKSsuNXwwfSxjdD1uLnBhcnNlQ29sb3I9ZnVuY3Rpb24odCxlKXt2YXIgaSxyLHMsbixhLG8sbCxoLHUsXyxjO2lmKHQpaWYoIm51bWJlciI9PXR5cGVvZiB0KWk9W3Q+PjE2LHQ+PjgmMjU1LDI1NSZ0XTtlbHNle2lmKCIsIj09PXQuY2hhckF0KHQubGVuZ3RoLTEpJiYodD10LnN1YnN0cigwLHQubGVuZ3RoLTEpKSx1dFt0XSlpPXV0W3RdO2Vsc2UgaWYoIiMiPT09dC5jaGFyQXQoMCkpND09PXQubGVuZ3RoJiYodD0iIyIrKHI9dC5jaGFyQXQoMSkpK3IrKHM9dC5jaGFyQXQoMikpK3MrKG49dC5jaGFyQXQoMykpK24pLGk9Wyh0PXBhcnNlSW50KHQuc3Vic3RyKDEpLDE2KSk+PjE2LHQ+PjgmMjU1LDI1NSZ0XTtlbHNlIGlmKCJoc2wiPT09dC5zdWJzdHIoMCwzKSlpZihpPWM9dC5tYXRjaChnKSxlKXtpZigtMSE9PXQuaW5kZXhPZigiPSIpKXJldHVybiB0Lm1hdGNoKHYpfWVsc2UgYT1OdW1iZXIoaVswXSklMzYwLzM2MCxvPU51bWJlcihpWzFdKS8xMDAscj0yKihsPU51bWJlcihpWzJdKS8xMDApLShzPWw8PS41P2wqKG8rMSk6bCtvLWwqbyksaS5sZW5ndGg+MyYmKGlbM109TnVtYmVyKGlbM10pKSxpWzBdPV90KGErMS8zLHIscyksaVsxXT1fdChhLHIscyksaVsyXT1fdChhLTEvMyxyLHMpO2Vsc2UgaT10Lm1hdGNoKGcpfHx1dC50cmFuc3BhcmVudDtpWzBdPU51bWJlcihpWzBdKSxpWzFdPU51bWJlcihpWzFdKSxpWzJdPU51bWJlcihpWzJdKSxpLmxlbmd0aD4zJiYoaVszXT1OdW1iZXIoaVszXSkpfWVsc2UgaT11dC5ibGFjaztyZXR1cm4gZSYmIWMmJihyPWlbMF0vMjU1LHM9aVsxXS8yNTUsbj1pWzJdLzI1NSxsPSgoaD1NYXRoLm1heChyLHMsbikpKyh1PU1hdGgubWluKHIscyxuKSkpLzIsaD09PXU/YT1vPTA6KF89aC11LG89bD4uNT9fLygyLWgtdSk6Xy8oaCt1KSxhPWg9PT1yPyhzLW4pL18rKHM8bj82OjApOmg9PT1zPyhuLXIpL18rMjooci1zKS9fKzQsYSo9NjApLGlbMF09YSsuNXwwLGlbMV09MTAwKm8rLjV8MCxpWzJdPTEwMCpsKy41fDApLGl9LGZ0PWZ1bmN0aW9uKHQsZSl7dmFyIGkscixzLG49dC5tYXRjaChwdCl8fFtdLGE9MCxvPSIiO2lmKCFuLmxlbmd0aClyZXR1cm4gdDtmb3IoaT0wO2k8bi5sZW5ndGg7aSsrKXI9bltpXSxhKz0ocz10LnN1YnN0cihhLHQuaW5kZXhPZihyLGEpLWEpKS5sZW5ndGgrci5sZW5ndGgsMz09PShyPWN0KHIsZSkpLmxlbmd0aCYmci5wdXNoKDEpLG8rPXMrKGU/ImhzbGEoIityWzBdKyIsIityWzFdKyIlLCIrclsyXSsiJSwiK3JbM106InJnYmEoIityLmpvaW4oIiwiKSkrIikiO3JldHVybiBvK3Quc3Vic3RyKGEpfSxwdD0iKD86XFxiKD86KD86cmdifHJnYmF8aHNsfGhzbGEpXFwoLis/XFwpKXxcXEIjKD86WzAtOWEtZl17M30pezEsMn1cXGIiO2ZvcihsIGluIHV0KXB0Kz0ifCIrbCsiXFxiIjtwdD1uZXcgUmVnRXhwKHB0KyIpIiwiZ2kiKSxuLmNvbG9yU3RyaW5nRmlsdGVyPWZ1bmN0aW9uKHQpe3ZhciBlLGk9dFswXSsiICIrdFsxXTtwdC50ZXN0KGkpJiYoZT0tMSE9PWkuaW5kZXhPZigiaHNsKCIpfHwtMSE9PWkuaW5kZXhPZigiaHNsYSgiKSx0WzBdPWZ0KHRbMF0sZSksdFsxXT1mdCh0WzFdLGUpKSxwdC5sYXN0SW5kZXg9MH0sci5sLmRlZmF1bHRTdHJpbmdGaWx0ZXJ8fChyLmwuZGVmYXVsdFN0cmluZ0ZpbHRlcj1uLmNvbG9yU3RyaW5nRmlsdGVyKTt2YXIgZHQ9ZnVuY3Rpb24odCxlLGkscil7aWYobnVsbD09dClyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHR9O3ZhciBzLG49ZT8odC5tYXRjaChwdCl8fFsiIl0pWzBdOiIiLGE9dC5zcGxpdChuKS5qb2luKCIiKS5tYXRjaCh5KXx8W10sbz10LnN1YnN0cigwLHQuaW5kZXhPZihhWzBdKSksbD0iKSI9PT10LmNoYXJBdCh0Lmxlbmd0aC0xKT8iKSI6IiIsaD0tMSE9PXQuaW5kZXhPZigiICIpPyIgIjoiLCIsdT1hLmxlbmd0aCxfPXU+MD9hWzBdLnJlcGxhY2UoZywiIik6IiI7cmV0dXJuIHU/cz1lP2Z1bmN0aW9uKHQpe3ZhciBlLGMsZixwO2lmKCJudW1iZXIiPT10eXBlb2YgdCl0Kz1fO2Vsc2UgaWYociYmRS50ZXN0KHQpKXtmb3IocD10LnJlcGxhY2UoRSwifCIpLnNwbGl0KCJ8IiksZj0wO2Y8cC5sZW5ndGg7ZisrKXBbZl09cyhwW2ZdKTtyZXR1cm4gcC5qb2luKCIsIil9aWYoZT0odC5tYXRjaChwdCl8fFtuXSlbMF0sZj0oYz10LnNwbGl0KGUpLmpvaW4oIiIpLm1hdGNoKHkpfHxbXSkubGVuZ3RoLHU+Zi0tKWZvcig7KytmPHU7KWNbZl09aT9jWyhmLTEpLzJ8MF06YVtmXTtyZXR1cm4gbytjLmpvaW4oaCkraCtlK2wrKC0xIT09dC5pbmRleE9mKCJpbnNldCIpPyIgaW5zZXQiOiIiKX06ZnVuY3Rpb24odCl7dmFyIGUsbixjO2lmKCJudW1iZXIiPT10eXBlb2YgdCl0Kz1fO2Vsc2UgaWYociYmRS50ZXN0KHQpKXtmb3Iobj10LnJlcGxhY2UoRSwifCIpLnNwbGl0KCJ8IiksYz0wO2M8bi5sZW5ndGg7YysrKW5bY109cyhuW2NdKTtyZXR1cm4gbi5qb2luKCIsIil9aWYoYz0oZT10Lm1hdGNoKHkpfHxbXSkubGVuZ3RoLHU+Yy0tKWZvcig7KytjPHU7KWVbY109aT9lWyhjLTEpLzJ8MF06YVtjXTtyZXR1cm4gbytlLmpvaW4oaCkrbH06ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSxtdD1mdW5jdGlvbih0KXtyZXR1cm4gdD10LnNwbGl0KCIsIiksZnVuY3Rpb24oZSxpLHIscyxuLGEsbyl7dmFyIGwsaD0oaSsiIikuc3BsaXQoIiAiKTtmb3Iobz17fSxsPTA7bDw0O2wrKylvW3RbbF1dPWhbbF09aFtsXXx8aFsobC0xKS8yPj4wXTtyZXR1cm4gcy5wYXJzZShlLG8sbixhKX19LGd0PShZLl9zZXRQbHVnaW5SYXRpbz1mdW5jdGlvbih0KXt0aGlzLnBsdWdpbi5zZXRSYXRpbyh0KTtmb3IodmFyIGUsaSxyLHMsbixhPXRoaXMuZGF0YSxvPWEucHJveHksbD1hLmZpcnN0TVBUO2w7KWU9b1tsLnZdLGwucj9lPWwucihlKTplPDFlLTYmJmU+LTFlLTYmJihlPTApLGwudFtsLnBdPWUsbD1sLl9uZXh0O2lmKGEuYXV0b1JvdGF0ZSYmKGEuYXV0b1JvdGF0ZS5yb3RhdGlvbj1hLm1vZD9hLm1vZC5jYWxsKHRoaXMuX3R3ZWVuLG8ucm90YXRpb24sdGhpcy50LHRoaXMuX3R3ZWVuKTpvLnJvdGF0aW9uKSwxPT09dHx8MD09PXQpZm9yKGw9YS5maXJzdE1QVCxuPTE9PT10PyJlIjoiYiI7bDspe2lmKChpPWwudCkudHlwZSl7aWYoMT09PWkudHlwZSl7Zm9yKHM9aS54czAraS5zK2kueHMxLHI9MTtyPGkubDtyKyspcys9aVsieG4iK3JdK2lbInhzIisocisxKV07aVtuXT1zfX1lbHNlIGlbbl09aS5zK2kueHMwO2w9bC5fbmV4dH19LGZ1bmN0aW9uKHQsZSxpLHIscyl7dGhpcy50PXQsdGhpcy5wPWUsdGhpcy52PWksdGhpcy5yPXMsciYmKHIuX3ByZXY9dGhpcyx0aGlzLl9uZXh0PXIpfSksdnQ9KFkuX3BhcnNlVG9Qcm94eT1mdW5jdGlvbih0LGUsaSxyLHMsbil7dmFyIGEsbyxsLGgsdSxfPXIsYz17fSxmPXt9LHA9aS5fdHJhbnNmb3JtLGQ9TDtmb3IoaS5fdHJhbnNmb3JtPW51bGwsTD1lLHI9dT1pLnBhcnNlKHQsZSxyLHMpLEw9ZCxuJiYoaS5fdHJhbnNmb3JtPXAsXyYmKF8uX3ByZXY9bnVsbCxfLl9wcmV2JiYoXy5fcHJldi5fbmV4dD1udWxsKSkpO3ImJnIhPT1fOyl7aWYoci50eXBlPD0xJiYoZltvPXIucF09ci5zK3IuYyxjW29dPXIucyxufHwoaD1uZXcgZ3QociwicyIsbyxoLHIuciksci5jPTApLDE9PT1yLnR5cGUpKWZvcihhPXIubDstLWE+MDspbD0ieG4iK2EsZltvPXIucCsiXyIrbF09ci5kYXRhW2xdLGNbb109cltsXSxufHwoaD1uZXcgZ3QocixsLG8saCxyLnJ4cFtsXSkpO3I9ci5fbmV4dH1yZXR1cm57cHJveHk6YyxlbmQ6ZixmaXJzdE1QVDpoLHB0OnV9fSxZLkNTU1Byb3BUd2Vlbj1mdW5jdGlvbihlLGkscixuLGEsbyxsLGgsdSxfLGMpe3RoaXMudD1lLHRoaXMucD1pLHRoaXMucz1yLHRoaXMuYz1uLHRoaXMubj1sfHxpLGUgaW5zdGFuY2VvZiB2dHx8cy5wdXNoKHRoaXMubiksdGhpcy5yPWg/ImZ1bmN0aW9uIj09dHlwZW9mIGg/aDpNYXRoLnJvdW5kOmgsdGhpcy50eXBlPW98fDAsdSYmKHRoaXMucHI9dSx0PSEwKSx0aGlzLmI9dm9pZCAwPT09Xz9yOl8sdGhpcy5lPXZvaWQgMD09PWM/cituOmMsYSYmKHRoaXMuX25leHQ9YSxhLl9wcmV2PXRoaXMpfSkseXQ9ZnVuY3Rpb24odCxlLGkscixzLG4pe3ZhciBhPW5ldyB2dCh0LGUsaSxyLWkscywtMSxuKTtyZXR1cm4gYS5iPWksYS5lPWEueHMwPXIsYX0sVHQ9bi5wYXJzZUNvbXBsZXg9ZnVuY3Rpb24odCxlLGkscixzLGEsbyxsLHUsXyl7aT1pfHxhfHwiIiwiZnVuY3Rpb24iPT10eXBlb2YgciYmKHI9cihtLGQpKSxvPW5ldyB2dCh0LGUsMCwwLG8sXz8yOjEsbnVsbCwhMSxsLGkscikscis9IiIscyYmcHQudGVzdChyK2kpJiYocj1baSxyXSxuLmNvbG9yU3RyaW5nRmlsdGVyKHIpLGk9clswXSxyPXJbMV0pO3ZhciBjLGYscCx5LFQsdyx4LGIsUCxTLGssUixPLEE9aS5zcGxpdCgiLCAiKS5qb2luKCIsIikuc3BsaXQoIiAiKSxDPXIuc3BsaXQoIiwgIikuam9pbigiLCIpLnNwbGl0KCIgIiksRD1BLmxlbmd0aCxNPSExIT09aDtmb3IoLTE9PT1yLmluZGV4T2YoIiwiKSYmLTE9PT1pLmluZGV4T2YoIiwiKXx8KC0xIT09KHIraSkuaW5kZXhPZigicmdiIil8fC0xIT09KHIraSkuaW5kZXhPZigiaHNsIik/KEE9QS5qb2luKCIgIikucmVwbGFjZShFLCIsICIpLnNwbGl0KCIgIiksQz1DLmpvaW4oIiAiKS5yZXBsYWNlKEUsIiwgIikuc3BsaXQoIiAiKSk6KEE9QS5qb2luKCIgIikuc3BsaXQoIiwiKS5qb2luKCIsICIpLnNwbGl0KCIgIiksQz1DLmpvaW4oIiAiKS5zcGxpdCgiLCIpLmpvaW4oIiwgIikuc3BsaXQoIiAiKSksRD1BLmxlbmd0aCksRCE9PUMubGVuZ3RoJiYoRD0oQT0oYXx8IiIpLnNwbGl0KCIgIikpLmxlbmd0aCksby5wbHVnaW49dSxvLnNldFJhdGlvPV8scHQubGFzdEluZGV4PTAsYz0wO2M8RDtjKyspaWYoeT1BW2NdLFQ9Q1tjXSsiIiwoYj1wYXJzZUZsb2F0KHkpKXx8MD09PWIpby5hcHBlbmRYdHJhKCIiLGIsb3QoVCxiKSxULnJlcGxhY2UodiwiIiksISghTXx8LTE9PT1ULmluZGV4T2YoInB4IikpJiZNYXRoLnJvdW5kLCEwKTtlbHNlIGlmKHMmJnB0LnRlc3QoeSkpUj0iKSIrKChSPVQuaW5kZXhPZigiKSIpKzEpP1Quc3Vic3RyKFIpOiIiKSxPPS0xIT09VC5pbmRleE9mKCJoc2wiKSYmRyxTPVQseT1jdCh5LE8pLFQ9Y3QoVCxPKSwoUD15Lmxlbmd0aCtULmxlbmd0aD42KSYmIUcmJjA9PT1UWzNdPyhvWyJ4cyIrby5sXSs9by5sPyIgdHJhbnNwYXJlbnQiOiJ0cmFuc3BhcmVudCIsby5lPW8uZS5zcGxpdChDW2NdKS5qb2luKCJ0cmFuc3BhcmVudCIpKTooR3x8KFA9ITEpLE8/by5hcHBlbmRYdHJhKFMuc3Vic3RyKDAsUy5pbmRleE9mKCJoc2wiKSkrKFA/ImhzbGEoIjoiaHNsKCIpLHlbMF0sb3QoVFswXSx5WzBdKSwiLCIsITEsITApLmFwcGVuZFh0cmEoIiIseVsxXSxvdChUWzFdLHlbMV0pLCIlLCIsITEpLmFwcGVuZFh0cmEoIiIseVsyXSxvdChUWzJdLHlbMl0pLFA/IiUsIjoiJSIrUiwhMSk6by5hcHBlbmRYdHJhKFMuc3Vic3RyKDAsUy5pbmRleE9mKCJyZ2IiKSkrKFA/InJnYmEoIjoicmdiKCIpLHlbMF0sVFswXS15WzBdLCIsIixNYXRoLnJvdW5kLCEwKS5hcHBlbmRYdHJhKCIiLHlbMV0sVFsxXS15WzFdLCIsIixNYXRoLnJvdW5kKS5hcHBlbmRYdHJhKCIiLHlbMl0sVFsyXS15WzJdLFA/IiwiOlIsTWF0aC5yb3VuZCksUCYmKHk9eS5sZW5ndGg8ND8xOnlbM10sby5hcHBlbmRYdHJhKCIiLHksKFQubGVuZ3RoPDQ/MTpUWzNdKS15LFIsITEpKSkscHQubGFzdEluZGV4PTA7ZWxzZSBpZih3PXkubWF0Y2goZykpe2lmKCEoeD1ULm1hdGNoKHYpKXx8eC5sZW5ndGghPT13Lmxlbmd0aClyZXR1cm4gbztmb3IocD0wLGY9MDtmPHcubGVuZ3RoO2YrKylrPXdbZl0sUz15LmluZGV4T2YoayxwKSxvLmFwcGVuZFh0cmEoeS5zdWJzdHIocCxTLXApLE51bWJlcihrKSxvdCh4W2ZdLGspLCIiLCEoIU18fCJweCIhPT15LnN1YnN0cihTK2subGVuZ3RoLDIpKSYmTWF0aC5yb3VuZCwwPT09ZikscD1TK2subGVuZ3RoO29bInhzIitvLmxdKz15LnN1YnN0cihwKX1lbHNlIG9bInhzIitvLmxdKz1vLmx8fG9bInhzIitvLmxdPyIgIitUOlQ7aWYoLTEhPT1yLmluZGV4T2YoIj0iKSYmby5kYXRhKXtmb3IoUj1vLnhzMCtvLmRhdGEucyxjPTE7YzxvLmw7YysrKVIrPW9bInhzIitjXStvLmRhdGFbInhuIitjXTtvLmU9UitvWyJ4cyIrY119cmV0dXJuIG8ubHx8KG8udHlwZT0tMSxvLnhzMD1vLmUpLG8ueGZpcnN0fHxvfSx3dD05O2ZvcigobD12dC5wcm90b3R5cGUpLmw9bC5wcj0wOy0td3Q+MDspbFsieG4iK3d0XT0wLGxbInhzIit3dF09IiI7bC54czA9IiIsbC5fbmV4dD1sLl9wcmV2PWwueGZpcnN0PWwuZGF0YT1sLnBsdWdpbj1sLnNldFJhdGlvPWwucnhwPW51bGwsbC5hcHBlbmRYdHJhPWZ1bmN0aW9uKHQsZSxpLHIscyxuKXt2YXIgYT10aGlzLG89YS5sO3JldHVybiBhWyJ4cyIrb10rPW4mJihvfHxhWyJ4cyIrb10pPyIgIit0OnR8fCIiLGl8fDA9PT1vfHxhLnBsdWdpbj8oYS5sKyssYS50eXBlPWEuc2V0UmF0aW8/MjoxLGFbInhzIithLmxdPXJ8fCIiLG8+MD8oYS5kYXRhWyJ4biIrb109ZStpLGEucnhwWyJ4biIrb109cyxhWyJ4biIrb109ZSxhLnBsdWdpbnx8KGEueGZpcnN0PW5ldyB2dChhLCJ4biIrbyxlLGksYS54Zmlyc3R8fGEsMCxhLm4scyxhLnByKSxhLnhmaXJzdC54czA9MCksYSk6KGEuZGF0YT17czplK2l9LGEucnhwPXt9LGEucz1lLGEuYz1pLGEucj1zLGEpKTooYVsieHMiK29dKz1lKyhyfHwiIiksYSl9O3ZhciB4dD1mdW5jdGlvbih0LGUpe2U9ZXx8e30sdGhpcy5wPWUucHJlZml4JiYkKHQpfHx0LG9bdF09b1t0aGlzLnBdPXRoaXMsdGhpcy5mb3JtYXQ9ZS5mb3JtYXR0ZXJ8fGR0KGUuZGVmYXVsdFZhbHVlLGUuY29sb3IsZS5jb2xsYXBzaWJsZSxlLm11bHRpKSxlLnBhcnNlciYmKHRoaXMucGFyc2U9ZS5wYXJzZXIpLHRoaXMuY2xycz1lLmNvbG9yLHRoaXMubXVsdGk9ZS5tdWx0aSx0aGlzLmtleXdvcmQ9ZS5rZXl3b3JkLHRoaXMuZGZsdD1lLmRlZmF1bHRWYWx1ZSx0aGlzLnByPWUucHJpb3JpdHl8fDB9LGJ0PVkuX3JlZ2lzdGVyQ29tcGxleFNwZWNpYWxQcm9wPWZ1bmN0aW9uKHQsZSxpKXsib2JqZWN0IiE9dHlwZW9mIGUmJihlPXtwYXJzZXI6aX0pO3ZhciByLHM9dC5zcGxpdCgiLCIpLG49ZS5kZWZhdWx0VmFsdWU7Zm9yKGk9aXx8W25dLHI9MDtyPHMubGVuZ3RoO3IrKyllLnByZWZpeD0wPT09ciYmZS5wcmVmaXgsZS5kZWZhdWx0VmFsdWU9aVtyXXx8bixuZXcgeHQoc1tyXSxlKX0sUHQ9WS5fcmVnaXN0ZXJQbHVnaW5Qcm9wPWZ1bmN0aW9uKHQpe2lmKCFvW3RdKXt2YXIgZT10LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpKyJQbHVnaW4iO2J0KHQse3BhcnNlcjpmdW5jdGlvbih0LGkscixzLG4sbCxoKXt2YXIgdT1hLmNvbS5ncmVlbnNvY2sucGx1Z2luc1tlXTtyZXR1cm4gdT8odS5fY3NzUmVnaXN0ZXIoKSxvW3JdLnBhcnNlKHQsaSxyLHMsbixsLGgpKTooVygiRXJyb3I6ICIrZSsiIGpzIGZpbGUgbm90IGxvYWRlZC4iKSxuKX19KX19OyhsPXh0LnByb3RvdHlwZSkucGFyc2VDb21wbGV4PWZ1bmN0aW9uKHQsZSxpLHIscyxuKXt2YXIgYSxvLGwsaCx1LF8sYz10aGlzLmtleXdvcmQ7aWYodGhpcy5tdWx0aSYmKEUudGVzdChpKXx8RS50ZXN0KGUpPyhvPWUucmVwbGFjZShFLCJ8Iikuc3BsaXQoInwiKSxsPWkucmVwbGFjZShFLCJ8Iikuc3BsaXQoInwiKSk6YyYmKG89W2VdLGw9W2ldKSksbCl7Zm9yKGg9bC5sZW5ndGg+by5sZW5ndGg/bC5sZW5ndGg6by5sZW5ndGgsYT0wO2E8aDthKyspZT1vW2FdPW9bYV18fHRoaXMuZGZsdCxpPWxbYV09bFthXXx8dGhpcy5kZmx0LGMmJih1PWUuaW5kZXhPZihjKSkhPT0oXz1pLmluZGV4T2YoYykpJiYoLTE9PT1fP29bYV09b1thXS5zcGxpdChjKS5qb2luKCIiKTotMT09PXUmJihvW2FdKz0iICIrYykpO2U9by5qb2luKCIsICIpLGk9bC5qb2luKCIsICIpfXJldHVybiBUdCh0LHRoaXMucCxlLGksdGhpcy5jbHJzLHRoaXMuZGZsdCxyLHRoaXMucHIscyxuKX0sbC5wYXJzZT1mdW5jdGlvbih0LGUscixzLG4sYSxvKXtyZXR1cm4gdGhpcy5wYXJzZUNvbXBsZXgodC5zdHlsZSx0aGlzLmZvcm1hdChLKHQsdGhpcy5wLGksITEsdGhpcy5kZmx0KSksdGhpcy5mb3JtYXQoZSksbixhKX0sbi5yZWdpc3RlclNwZWNpYWxQcm9wPWZ1bmN0aW9uKHQsZSxpKXtidCh0LHtwYXJzZXI6ZnVuY3Rpb24odCxyLHMsbixhLG8sbCl7dmFyIGg9bmV3IHZ0KHQscywwLDAsYSwyLHMsITEsaSk7cmV0dXJuIGgucGx1Z2luPW8saC5zZXRSYXRpbz1lKHQscixuLl90d2VlbixzKSxofSxwcmlvcml0eTppfSl9LG4udXNlU1ZHVHJhbnNmb3JtQXR0cj0hMDt2YXIgU3Qsa3Q9InNjYWxlWCxzY2FsZVksc2NhbGVaLHgseSx6LHNrZXdYLHNrZXdZLHJvdGF0aW9uLHJvdGF0aW9uWCxyb3RhdGlvblkscGVyc3BlY3RpdmUseFBlcmNlbnQseVBlcmNlbnQiLnNwbGl0KCIsIiksUnQ9JCgidHJhbnNmb3JtIiksT3Q9SCsidHJhbnNmb3JtIixBdD0kKCJ0cmFuc2Zvcm1PcmlnaW4iKSxDdD1udWxsIT09JCgicGVyc3BlY3RpdmUiKSxEdD1ZLlRyYW5zZm9ybT1mdW5jdGlvbigpe3RoaXMucGVyc3BlY3RpdmU9cGFyc2VGbG9hdChuLmRlZmF1bHRUcmFuc2Zvcm1QZXJzcGVjdGl2ZSl8fDAsdGhpcy5mb3JjZTNEPSEoITE9PT1uLmRlZmF1bHRGb3JjZTNEfHwhQ3QpJiYobi5kZWZhdWx0Rm9yY2UzRHx8ImF1dG8iKX0sTXQ9ci5rLlNWR0VsZW1lbnQsRXQ9ZnVuY3Rpb24odCxlLGkpe3ZhciByLHM9WC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix0KSxuPS8oW2Etel0pKFtBLVpdKS9nO2ZvcihyIGluIGkpcy5zZXRBdHRyaWJ1dGVOUyhudWxsLHIucmVwbGFjZShuLCIkMS0kMiIpLnRvTG93ZXJDYXNlKCksaVtyXSk7cmV0dXJuIGUuYXBwZW5kQ2hpbGQocyksc30sRnQ9WC5kb2N1bWVudEVsZW1lbnR8fHt9LHp0PWZ1bmN0aW9uKCl7dmFyIHQsZSxpLHM9cHx8L0FuZHJvaWQvaS50ZXN0KFYpJiYhci5rLmNocm9tZTtyZXR1cm4gWC5jcmVhdGVFbGVtZW50TlMmJiFzJiYodD1FdCgic3ZnIixGdCksaT0oZT1FdCgicmVjdCIsdCx7d2lkdGg6MTAwLGhlaWdodDo1MCx4OjEwMH0pKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxlLnN0eWxlW0F0XT0iNTAlIDUwJSIsZS5zdHlsZVtSdF09InNjYWxlWCgwLjUpIixzPWk9PT1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoJiYhKGMmJkN0KSxGdC5yZW1vdmVDaGlsZCh0KSksc30oKSxJdD1mdW5jdGlvbih0LGUsaSxyLHMsYSl7dmFyIG8sbCxoLHUsXyxjLGYscCxkLG0sZyx2LHksVCx3PXQuX2dzVHJhbnNmb3JtLHg9QnQodCwhMCk7dyYmKHk9dy54T3JpZ2luLFQ9dy55T3JpZ2luKSwoIXJ8fChvPXIuc3BsaXQoIiAiKSkubGVuZ3RoPDIpJiYoMD09PShmPXQuZ2V0QkJveCgpKS54JiYwPT09Zi55JiZmLndpZHRoK2YuaGVpZ2h0PT09MCYmKGY9e3g6cGFyc2VGbG9hdCh0Lmhhc0F0dHJpYnV0ZSgieCIpP3QuZ2V0QXR0cmlidXRlKCJ4Iik6dC5oYXNBdHRyaWJ1dGUoImN4Iik/dC5nZXRBdHRyaWJ1dGUoImN4Iik6MCl8fDAseTpwYXJzZUZsb2F0KHQuaGFzQXR0cmlidXRlKCJ5Iik/dC5nZXRBdHRyaWJ1dGUoInkiKTp0Lmhhc0F0dHJpYnV0ZSgiY3kiKT90LmdldEF0dHJpYnV0ZSgiY3kiKTowKXx8MCx3aWR0aDowLGhlaWdodDowfSksbz1bKC0xIT09KGU9YXQoZSkuc3BsaXQoIiAiKSlbMF0uaW5kZXhPZigiJSIpP3BhcnNlRmxvYXQoZVswXSkvMTAwKmYud2lkdGg6cGFyc2VGbG9hdChlWzBdKSkrZi54LCgtMSE9PWVbMV0uaW5kZXhPZigiJSIpP3BhcnNlRmxvYXQoZVsxXSkvMTAwKmYuaGVpZ2h0OnBhcnNlRmxvYXQoZVsxXSkpK2YueV0pLGkueE9yaWdpbj11PXBhcnNlRmxvYXQob1swXSksaS55T3JpZ2luPV89cGFyc2VGbG9hdChvWzFdKSxyJiZ4IT09WHQmJihjPXhbMF0sZj14WzFdLHA9eFsyXSxkPXhbM10sbT14WzRdLGc9eFs1XSwodj1jKmQtZipwKSYmKGw9dSooZC92KStfKigtcC92KSsocCpnLWQqbSkvdixoPXUqKC1mL3YpK18qKGMvdiktKGMqZy1mKm0pL3YsdT1pLnhPcmlnaW49b1swXT1sLF89aS55T3JpZ2luPW9bMV09aCkpLHcmJihhJiYoaS54T2Zmc2V0PXcueE9mZnNldCxpLnlPZmZzZXQ9dy55T2Zmc2V0LHc9aSksc3x8ITEhPT1zJiYhMSE9PW4uZGVmYXVsdFNtb290aE9yaWdpbj8obD11LXksaD1fLVQsdy54T2Zmc2V0Kz1sKnhbMF0raCp4WzJdLWwsdy55T2Zmc2V0Kz1sKnhbMV0raCp4WzNdLWgpOncueE9mZnNldD13LnlPZmZzZXQ9MCksYXx8dC5zZXRBdHRyaWJ1dGUoImRhdGEtc3ZnLW9yaWdpbiIsby5qb2luKCIgIikpfSxMdD1mdW5jdGlvbih0KXt2YXIgZSxpPUIoInN2ZyIsdGhpcy5vd25lclNWR0VsZW1lbnQmJnRoaXMub3duZXJTVkdFbGVtZW50LmdldEF0dHJpYnV0ZSgieG1sbnMiKXx8Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIikscj10aGlzLnBhcmVudE5vZGUscz10aGlzLm5leHRTaWJsaW5nLG49dGhpcy5zdHlsZS5jc3NUZXh0O2lmKEZ0LmFwcGVuZENoaWxkKGkpLGkuYXBwZW5kQ2hpbGQodGhpcyksdGhpcy5zdHlsZS5kaXNwbGF5PSJibG9jayIsdCl0cnl7ZT10aGlzLmdldEJCb3goKSx0aGlzLl9vcmlnaW5hbEdldEJCb3g9dGhpcy5nZXRCQm94LHRoaXMuZ2V0QkJveD1MdH1jYXRjaCh0KXt9ZWxzZSB0aGlzLl9vcmlnaW5hbEdldEJCb3gmJihlPXRoaXMuX29yaWdpbmFsR2V0QkJveCgpKTtyZXR1cm4gcz9yLmluc2VydEJlZm9yZSh0aGlzLHMpOnIuYXBwZW5kQ2hpbGQodGhpcyksRnQucmVtb3ZlQ2hpbGQoaSksdGhpcy5zdHlsZS5jc3NUZXh0PW4sZX0sTnQ9ZnVuY3Rpb24odCl7cmV0dXJuISghTXR8fCF0LmdldENUTXx8dC5wYXJlbnROb2RlJiYhdC5vd25lclNWR0VsZW1lbnR8fCFmdW5jdGlvbih0KXt0cnl7cmV0dXJuIHQuZ2V0QkJveCgpfWNhdGNoKGUpe3JldHVybiBMdC5jYWxsKHQsITApfX0odCkpfSxYdD1bMSwwLDAsMSwwLDBdLEJ0PWZ1bmN0aW9uKHQsZSl7dmFyIGkscixzLG4sYSxvLGw9dC5fZ3NUcmFuc2Zvcm18fG5ldyBEdCxoPXQuc3R5bGU7aWYoUnQ/cj1LKHQsT3QsbnVsbCwhMCk6dC5jdXJyZW50U3R5bGUmJihyPShyPXQuY3VycmVudFN0eWxlLmZpbHRlci5tYXRjaChEKSkmJjQ9PT1yLmxlbmd0aD9bclswXS5zdWJzdHIoNCksTnVtYmVyKHJbMl0uc3Vic3RyKDQpKSxOdW1iZXIoclsxXS5zdWJzdHIoNCkpLHJbM10uc3Vic3RyKDQpLGwueHx8MCxsLnl8fDBdLmpvaW4oIiwiKToiIiksaT0hcnx8Im5vbmUiPT09cnx8Im1hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKSI9PT1yLCFSdHx8IShvPSFRKHQpfHwibm9uZSI9PT1RKHQpLmRpc3BsYXkpJiZ0LnBhcmVudE5vZGV8fChvJiYobj1oLmRpc3BsYXksaC5kaXNwbGF5PSJibG9jayIpLHQucGFyZW50Tm9kZXx8KGE9MSxGdC5hcHBlbmRDaGlsZCh0KSksaT0hKHI9Syh0LE90LG51bGwsITApKXx8Im5vbmUiPT09cnx8Im1hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKSI9PT1yLG4/aC5kaXNwbGF5PW46byYmR3QoaCwiZGlzcGxheSIpLGEmJkZ0LnJlbW92ZUNoaWxkKHQpKSwobC5zdmd8fHQuZ2V0Q1RNJiZOdCh0KSkmJihpJiYtMSE9PShoW1J0XSsiIikuaW5kZXhPZigibWF0cml4IikmJihyPWhbUnRdLGk9MCkscz10LmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiksaSYmcyYmKHI9Im1hdHJpeCgiKyhzPXQudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKS5tYXRyaXgpLmErIiwiK3MuYisiLCIrcy5jKyIsIitzLmQrIiwiK3MuZSsiLCIrcy5mKyIpIixpPTApKSxpKXJldHVybiBYdDtmb3Iocz0ocnx8IiIpLm1hdGNoKGcpfHxbXSx3dD1zLmxlbmd0aDstLXd0Pi0xOyluPU51bWJlcihzW3d0XSksc1t3dF09KGE9bi0obnw9MCkpPygxZTUqYSsoYTwwPy0uNTouNSl8MCkvMWU1K246bjtyZXR1cm4gZSYmcy5sZW5ndGg+Nj9bc1swXSxzWzFdLHNbNF0sc1s1XSxzWzEyXSxzWzEzXV06c30sanQ9WS5nZXRUcmFuc2Zvcm09ZnVuY3Rpb24odCxlLGkscyl7aWYodC5fZ3NUcmFuc2Zvcm0mJmkmJiFzKXJldHVybiB0Ll9nc1RyYW5zZm9ybTt2YXIgYSxvLGwsaCx1LF8sYz1pJiZ0Ll9nc1RyYW5zZm9ybXx8bmV3IER0LGY9Yy5zY2FsZVg8MCxwPUN0JiYocGFyc2VGbG9hdChLKHQsQXQsZSwhMSwiMCAwIDAiKS5zcGxpdCgiICIpWzJdKXx8Yy56T3JpZ2luKXx8MCxkPXBhcnNlRmxvYXQobi5kZWZhdWx0VHJhbnNmb3JtUGVyc3BlY3RpdmUpfHwwO2lmKGMuc3ZnPSEoIXQuZ2V0Q1RNfHwhTnQodCkpLGMuc3ZnJiYoSXQodCxLKHQsQXQsZSwhMSwiNTAlIDUwJSIpKyIiLGMsdC5nZXRBdHRyaWJ1dGUoImRhdGEtc3ZnLW9yaWdpbiIpKSxTdD1uLnVzZVNWR1RyYW5zZm9ybUF0dHJ8fHp0KSwoYT1CdCh0KSkhPT1YdCl7aWYoMTY9PT1hLmxlbmd0aCl7dmFyIG0sZyx2LHksVCx3PWFbMF0seD1hWzFdLGI9YVsyXSxQPWFbM10sUz1hWzRdLGs9YVs1XSxSPWFbNl0sTz1hWzddLEE9YVs4XSxDPWFbOV0sRD1hWzEwXSxNPWFbMTJdLEU9YVsxM10sRj1hWzE0XSx6PWFbMTFdLEw9TWF0aC5hdGFuMihSLEQpO2Muek9yaWdpbiYmKE09QSooRj0tYy56T3JpZ2luKS1hWzEyXSxFPUMqRi1hWzEzXSxGPUQqRitjLnpPcmlnaW4tYVsxNF0pLGMucm90YXRpb25YPUwqSSxMJiYobT1TKih5PU1hdGguY29zKC1MKSkrQSooVD1NYXRoLnNpbigtTCkpLGc9ayp5K0MqVCx2PVIqeStEKlQsQT1TKi1UK0EqeSxDPWsqLVQrQyp5LEQ9UiotVCtEKnksej1PKi1UK3oqeSxTPW0saz1nLFI9diksTD1NYXRoLmF0YW4yKC1iLEQpLGMucm90YXRpb25ZPUwqSSxMJiYoZz14Kih5PU1hdGguY29zKC1MKSktQyooVD1NYXRoLnNpbigtTCkpLHY9Yip5LUQqVCxDPXgqVCtDKnksRD1iKlQrRCp5LHo9UCpUK3oqeSx3PW09dyp5LUEqVCx4PWcsYj12KSxMPU1hdGguYXRhbjIoeCx3KSxjLnJvdGF0aW9uPUwqSSxMJiYobT13Kih5PU1hdGguY29zKEwpKSt4KihUPU1hdGguc2luKEwpKSxnPVMqeStrKlQsdj1BKnkrQypULHg9eCp5LXcqVCxrPWsqeS1TKlQsQz1DKnktQSpULHc9bSxTPWcsQT12KSxjLnJvdGF0aW9uWCYmTWF0aC5hYnMoYy5yb3RhdGlvblgpK01hdGguYWJzKGMucm90YXRpb24pPjM1OS45JiYoYy5yb3RhdGlvblg9Yy5yb3RhdGlvbj0wLGMucm90YXRpb25ZPTE4MC1jLnJvdGF0aW9uWSksTD1NYXRoLmF0YW4yKFMsayksYy5zY2FsZVg9KDFlNSpNYXRoLnNxcnQodyp3K3gqeCtiKmIpKy41fDApLzFlNSxjLnNjYWxlWT0oMWU1Kk1hdGguc3FydChrKmsrUipSKSsuNXwwKS8xZTUsYy5zY2FsZVo9KDFlNSpNYXRoLnNxcnQoQSpBK0MqQytEKkQpKy41fDApLzFlNSx3Lz1jLnNjYWxlWCxTLz1jLnNjYWxlWSx4Lz1jLnNjYWxlWCxrLz1jLnNjYWxlWSxNYXRoLmFicyhMKT4yZS01PyhjLnNrZXdYPUwqSSxTPTAsInNpbXBsZSIhPT1jLnNrZXdUeXBlJiYoYy5zY2FsZVkqPTEvTWF0aC5jb3MoTCkpKTpjLnNrZXdYPTAsYy5wZXJzcGVjdGl2ZT16PzEvKHo8MD8tejp6KTowLGMueD1NLGMueT1FLGMuej1GLGMuc3ZnJiYoYy54LT1jLnhPcmlnaW4tKGMueE9yaWdpbip3LWMueU9yaWdpbipTKSxjLnktPWMueU9yaWdpbi0oYy55T3JpZ2luKngtYy54T3JpZ2luKmspKX1lbHNlIGlmKCFDdHx8c3x8IWEubGVuZ3RofHxjLnghPT1hWzRdfHxjLnkhPT1hWzVdfHwhYy5yb3RhdGlvblgmJiFjLnJvdGF0aW9uWSl7dmFyIE49YS5sZW5ndGg+PTYsWD1OP2FbMF06MSxCPWFbMV18fDAsaj1hWzJdfHwwLFU9Tj9hWzNdOjE7Yy54PWFbNF18fDAsYy55PWFbNV18fDAsbD1NYXRoLnNxcnQoWCpYK0IqQiksaD1NYXRoLnNxcnQoVSpVK2oqaiksdT1YfHxCP01hdGguYXRhbjIoQixYKSpJOmMucm90YXRpb258fDAsXz1qfHxVP01hdGguYXRhbjIoaixVKSpJK3U6Yy5za2V3WHx8MCxjLnNjYWxlWD1sLGMuc2NhbGVZPWgsYy5yb3RhdGlvbj11LGMuc2tld1g9XyxDdCYmKGMucm90YXRpb25YPWMucm90YXRpb25ZPWMuej0wLGMucGVyc3BlY3RpdmU9ZCxjLnNjYWxlWj0xKSxjLnN2ZyYmKGMueC09Yy54T3JpZ2luLShjLnhPcmlnaW4qWCtjLnlPcmlnaW4qaiksYy55LT1jLnlPcmlnaW4tKGMueE9yaWdpbipCK2MueU9yaWdpbipVKSl9Zm9yKG8gaW4gTWF0aC5hYnMoYy5za2V3WCk+OTAmJk1hdGguYWJzKGMuc2tld1gpPDI3MCYmKGY/KGMuc2NhbGVYKj0tMSxjLnNrZXdYKz1jLnJvdGF0aW9uPD0wPzE4MDotMTgwLGMucm90YXRpb24rPWMucm90YXRpb248PTA/MTgwOi0xODApOihjLnNjYWxlWSo9LTEsYy5za2V3WCs9Yy5za2V3WDw9MD8xODA6LTE4MCkpLGMuek9yaWdpbj1wLGMpY1tvXTwyZS01JiZjW29dPi0yZS01JiYoY1tvXT0wKX1yZXR1cm4gaSYmKHQuX2dzVHJhbnNmb3JtPWMsYy5zdmcmJihTdCYmdC5zdHlsZVtSdF0/ci5sLmRlbGF5ZWRDYWxsKC4wMDEsZnVuY3Rpb24oKXtHdCh0LnN0eWxlLFJ0KX0pOiFTdCYmdC5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpJiZyLmwuZGVsYXllZENhbGwoLjAwMSxmdW5jdGlvbigpe3QucmVtb3ZlQXR0cmlidXRlKCJ0cmFuc2Zvcm0iKX0pKSksY30sVXQ9ZnVuY3Rpb24odCl7dmFyIGUsaSxyPXRoaXMuZGF0YSxzPS1yLnJvdGF0aW9uKnosbj1zK3Iuc2tld1gqeixhPShNYXRoLmNvcyhzKSpyLnNjYWxlWCoxZTV8MCkvMWU1LG89KE1hdGguc2luKHMpKnIuc2NhbGVYKjFlNXwwKS8xZTUsbD0oTWF0aC5zaW4obikqLXIuc2NhbGVZKjFlNXwwKS8xZTUsaD0oTWF0aC5jb3Mobikqci5zY2FsZVkqMWU1fDApLzFlNSx1PXRoaXMudC5zdHlsZSxfPXRoaXMudC5jdXJyZW50U3R5bGU7aWYoXyl7aT1vLG89LWwsbD0taSxlPV8uZmlsdGVyLHUuZmlsdGVyPSIiO3ZhciBjLGYsZD10aGlzLnQub2Zmc2V0V2lkdGgsbT10aGlzLnQub2Zmc2V0SGVpZ2h0LGc9ImFic29sdXRlIiE9PV8ucG9zaXRpb24sdj0icHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0Lk1hdHJpeChNMTE9IithKyIsIE0xMj0iK28rIiwgTTIxPSIrbCsiLCBNMjI9IitoLHk9ci54K2Qqci54UGVyY2VudC8xMDAsVD1yLnkrbSpyLnlQZXJjZW50LzEwMDtpZihudWxsIT1yLm94JiYoeSs9KGM9KHIub3hwP2Qqci5veCouMDE6ci5veCktZC8yKS0oYyphKyhmPShyLm95cD9tKnIub3kqLjAxOnIub3kpLW0vMikqbyksVCs9Zi0oYypsK2YqaCkpLHYrPWc/IiwgRHg9IisoKGM9ZC8yKS0oYyphKyhmPW0vMikqbykreSkrIiwgRHk9IisoZi0oYypsK2YqaCkrVCkrIikiOiIsIHNpemluZ01ldGhvZD0nYXV0byBleHBhbmQnKSIsLTEhPT1lLmluZGV4T2YoIkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0Lk1hdHJpeCgiKT91LmZpbHRlcj1lLnJlcGxhY2UoTSx2KTp1LmZpbHRlcj12KyIgIitlLDAhPT10JiYxIT09dHx8MT09PWEmJjA9PT1vJiYwPT09bCYmMT09PWgmJihnJiYtMT09PXYuaW5kZXhPZigiRHg9MCwgRHk9MCIpfHx4LnRlc3QoZSkmJjEwMCE9PXBhcnNlRmxvYXQoUmVnRXhwLiQxKXx8LTE9PT1lLmluZGV4T2YoZS5pbmRleE9mKCJBbHBoYSIpKSYmdS5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpKSwhZyl7dmFyIGIsUCxTLGs9cDw4PzE6LTE7Zm9yKGM9ci5pZU9mZnNldFh8fDAsZj1yLmllT2Zmc2V0WXx8MCxyLmllT2Zmc2V0WD1NYXRoLnJvdW5kKChkLSgoYTwwPy1hOmEpKmQrKG88MD8tbzpvKSptKSkvMit5KSxyLmllT2Zmc2V0WT1NYXRoLnJvdW5kKChtLSgoaDwwPy1oOmgpKm0rKGw8MD8tbDpsKSpkKSkvMitUKSx3dD0wO3d0PDQ7d3QrKylTPShpPS0xIT09KGI9X1tQPXN0W3d0XV0pLmluZGV4T2YoInB4Iik/cGFyc2VGbG9hdChiKTpKKHRoaXMudCxQLHBhcnNlRmxvYXQoYiksYi5yZXBsYWNlKHcsIiIpKXx8MCkhPT1yW1BdP3d0PDI/LXIuaWVPZmZzZXRYOi1yLmllT2Zmc2V0WTp3dDwyP2Mtci5pZU9mZnNldFg6Zi1yLmllT2Zmc2V0WSx1W1BdPShyW1BdPU1hdGgucm91bmQoaS1TKigwPT09d3R8fDI9PT13dD8xOmspKSkrInB4In19fSxZdD1ZLnNldDNEVHJhbnNmb3JtUmF0aW89WS5zZXRUcmFuc2Zvcm1SYXRpbz1mdW5jdGlvbih0KXt2YXIgZSxpLHIscyxuLGEsbyxsLGgsdSxfLGYscCxkLG0sZyx2LHksVCx3LHgsYj10aGlzLmRhdGEsUD10aGlzLnQuc3R5bGUsUz1iLnJvdGF0aW9uLGs9Yi5yb3RhdGlvblgsUj1iLnJvdGF0aW9uWSxPPWIuc2NhbGVYLEE9Yi5zY2FsZVksQz1iLnNjYWxlWixEPWIueCxNPWIueSxFPWIueixGPWIuc3ZnLEk9Yi5wZXJzcGVjdGl2ZSxMPWIuZm9yY2UzRCxOPWIuc2tld1ksWD1iLnNrZXdYO2lmKE4mJihYKz1OLFMrPU4pLCEoKDEhPT10JiYwIT09dHx8ImF1dG8iIT09THx8dGhpcy50d2Vlbi5fdG90YWxUaW1lIT09dGhpcy50d2Vlbi5fdG90YWxEdXJhdGlvbiYmdGhpcy50d2Vlbi5fdG90YWxUaW1lKSYmTHx8RXx8SXx8Unx8a3x8MSE9PUMpfHxTdCYmRnx8IUN0KVN8fFh8fEY/KFMqPXosdz1YKnoseD0xZTUsaT1NYXRoLmNvcyhTKSpPLG49TWF0aC5zaW4oUykqTyxyPU1hdGguc2luKFMtdykqLUEsYT1NYXRoLmNvcyhTLXcpKkEsdyYmInNpbXBsZSI9PT1iLnNrZXdUeXBlJiYoZT1NYXRoLnRhbih3LU4qeikscio9ZT1NYXRoLnNxcnQoMStlKmUpLGEqPWUsTiYmKGU9TWF0aC50YW4oTip6KSxpKj1lPU1hdGguc3FydCgxK2UqZSksbio9ZSkpLEYmJihEKz1iLnhPcmlnaW4tKGIueE9yaWdpbippK2IueU9yaWdpbipyKStiLnhPZmZzZXQsTSs9Yi55T3JpZ2luLShiLnhPcmlnaW4qbitiLnlPcmlnaW4qYSkrYi55T2Zmc2V0LFN0JiYoYi54UGVyY2VudHx8Yi55UGVyY2VudCkmJihtPXRoaXMudC5nZXRCQm94KCksRCs9LjAxKmIueFBlcmNlbnQqbS53aWR0aCxNKz0uMDEqYi55UGVyY2VudCptLmhlaWdodCksRDwobT0xZS02KSYmRD4tbSYmKEQ9MCksTTxtJiZNPi1tJiYoTT0wKSksVD0oaSp4fDApL3grIiwiKyhuKnh8MCkveCsiLCIrKHIqeHwwKS94KyIsIisoYSp4fDApL3grIiwiK0QrIiwiK00rIikiLEYmJlN0P3RoaXMudC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsIm1hdHJpeCgiK1QpOlBbUnRdPShiLnhQZXJjZW50fHxiLnlQZXJjZW50PyJ0cmFuc2xhdGUoIitiLnhQZXJjZW50KyIlLCIrYi55UGVyY2VudCsiJSkgbWF0cml4KCI6Im1hdHJpeCgiKStUKTpQW1J0XT0oYi54UGVyY2VudHx8Yi55UGVyY2VudD8idHJhbnNsYXRlKCIrYi54UGVyY2VudCsiJSwiK2IueVBlcmNlbnQrIiUpIG1hdHJpeCgiOiJtYXRyaXgoIikrTysiLDAsMCwiK0ErIiwiK0QrIiwiK00rIikiO2Vsc2V7aWYoYyYmKE88KG09MWUtNCkmJk8+LW0mJihPPUM9MmUtNSksQTxtJiZBPi1tJiYoQT1DPTJlLTUpLCFJfHxiLnp8fGIucm90YXRpb25YfHxiLnJvdGF0aW9uWXx8KEk9MCkpLFN8fFgpUyo9eixnPWk9TWF0aC5jb3MoUyksdj1uPU1hdGguc2luKFMpLFgmJihTLT1YKnosZz1NYXRoLmNvcyhTKSx2PU1hdGguc2luKFMpLCJzaW1wbGUiPT09Yi5za2V3VHlwZSYmKGU9TWF0aC50YW4oKFgtTikqeiksZyo9ZT1NYXRoLnNxcnQoMStlKmUpLHYqPWUsYi5za2V3WSYmKGU9TWF0aC50YW4oTip6KSxpKj1lPU1hdGguc3FydCgxK2UqZSksbio9ZSkpKSxyPS12LGE9ZztlbHNle2lmKCEoUnx8a3x8MSE9PUN8fEl8fEYpKXJldHVybiB2b2lkKFBbUnRdPShiLnhQZXJjZW50fHxiLnlQZXJjZW50PyJ0cmFuc2xhdGUoIitiLnhQZXJjZW50KyIlLCIrYi55UGVyY2VudCsiJSkgdHJhbnNsYXRlM2QoIjoidHJhbnNsYXRlM2QoIikrRCsicHgsIitNKyJweCwiK0UrInB4KSIrKDEhPT1PfHwxIT09QT8iIHNjYWxlKCIrTysiLCIrQSsiKSI6IiIpKTtpPWE9MSxyPW49MH11PTEscz1vPWw9aD1fPWY9MCxwPUk/LTEvSTowLGQ9Yi56T3JpZ2luLG09MWUtNiwiLCIsIjAiLChTPVIqeikmJihnPU1hdGguY29zKFMpLGw9LSh2PU1hdGguc2luKFMpKSxfPXAqLXYscz1pKnYsbz1uKnYsdT1nLHAqPWcsaSo9ZyxuKj1nKSwoUz1rKnopJiYoZT1yKihnPU1hdGguY29zKFMpKStzKih2PU1hdGguc2luKFMpKSx5PWEqZytvKnYsaD11KnYsZj1wKnYscz1yKi12K3MqZyxvPWEqLXYrbypnLHUqPWcscCo9ZyxyPWUsYT15KSwxIT09QyYmKHMqPUMsbyo9Qyx1Kj1DLHAqPUMpLDEhPT1BJiYocio9QSxhKj1BLGgqPUEsZio9QSksMSE9PU8mJihpKj1PLG4qPU8sbCo9TyxfKj1PKSwoZHx8RikmJihkJiYoRCs9cyotZCxNKz1vKi1kLEUrPXUqLWQrZCksRiYmKEQrPWIueE9yaWdpbi0oYi54T3JpZ2luKmkrYi55T3JpZ2luKnIpK2IueE9mZnNldCxNKz1iLnlPcmlnaW4tKGIueE9yaWdpbipuK2IueU9yaWdpbiphKStiLnlPZmZzZXQpLEQ8bSYmRD4tbSYmKEQ9IjAiKSxNPG0mJk0+LW0mJihNPSIwIiksRTxtJiZFPi1tJiYoRT0wKSksVD1iLnhQZXJjZW50fHxiLnlQZXJjZW50PyJ0cmFuc2xhdGUoIitiLnhQZXJjZW50KyIlLCIrYi55UGVyY2VudCsiJSkgbWF0cml4M2QoIjoibWF0cml4M2QoIixUKz0oaTxtJiZpPi1tPyIwIjppKSsiLCIrKG48bSYmbj4tbT8iMCI6bikrIiwiKyhsPG0mJmw+LW0/IjAiOmwpLFQrPSIsIisoXzxtJiZfPi1tPyIwIjpfKSsiLCIrKHI8bSYmcj4tbT8iMCI6cikrIiwiKyhhPG0mJmE+LW0/IjAiOmEpLGt8fFJ8fDEhPT1DPyhUKz0iLCIrKGg8bSYmaD4tbT8iMCI6aCkrIiwiKyhmPG0mJmY+LW0/IjAiOmYpKyIsIisoczxtJiZzPi1tPyIwIjpzKSxUKz0iLCIrKG88bSYmbz4tbT8iMCI6bykrIiwiKyh1PG0mJnU+LW0/IjAiOnUpKyIsIisocDxtJiZwPi1tPyIwIjpwKSsiLCIpOlQrPSIsMCwwLDAsMCwxLDAsIixUKz1EKyIsIitNKyIsIitFKyIsIisoST8xKy1FL0k6MSkrIikiLFBbUnRdPVR9fTsobD1EdC5wcm90b3R5cGUpLng9bC55PWwuej1sLnNrZXdYPWwuc2tld1k9bC5yb3RhdGlvbj1sLnJvdGF0aW9uWD1sLnJvdGF0aW9uWT1sLnpPcmlnaW49bC54UGVyY2VudD1sLnlQZXJjZW50PWwueE9mZnNldD1sLnlPZmZzZXQ9MCxsLnNjYWxlWD1sLnNjYWxlWT1sLnNjYWxlWj0xLGJ0KCJ0cmFuc2Zvcm0sc2NhbGUsc2NhbGVYLHNjYWxlWSxzY2FsZVoseCx5LHoscm90YXRpb24scm90YXRpb25YLHJvdGF0aW9uWSxyb3RhdGlvblosc2tld1gsc2tld1ksc2hvcnRSb3RhdGlvbixzaG9ydFJvdGF0aW9uWCxzaG9ydFJvdGF0aW9uWSxzaG9ydFJvdGF0aW9uWix0cmFuc2Zvcm1PcmlnaW4sc3ZnT3JpZ2luLHRyYW5zZm9ybVBlcnNwZWN0aXZlLGRpcmVjdGlvbmFsUm90YXRpb24scGFyc2VUcmFuc2Zvcm0sZm9yY2UzRCxza2V3VHlwZSx4UGVyY2VudCx5UGVyY2VudCxzbW9vdGhPcmlnaW4iLHtwYXJzZXI6ZnVuY3Rpb24odCxlLHIscyxhLG8sbCl7aWYocy5fbGFzdFBhcnNlZFRyYW5zZm9ybT09PWwpcmV0dXJuIGE7cy5fbGFzdFBhcnNlZFRyYW5zZm9ybT1sO3ZhciBoLHU9bC5zY2FsZSYmImZ1bmN0aW9uIj09dHlwZW9mIGwuc2NhbGU/bC5zY2FsZTowOyJmdW5jdGlvbiI9PXR5cGVvZiBsW3JdJiYoaD1sW3JdLGxbcl09ZSksdSYmKGwuc2NhbGU9dShtLHQpKTt2YXIgXyxjLGYscCxnLHYseSxULHcseD10Ll9nc1RyYW5zZm9ybSxiPXQuc3R5bGUsUD1rdC5sZW5ndGgsUz1sLGs9e30sUj1qdCh0LGksITAsUy5wYXJzZVRyYW5zZm9ybSksTz1TLnRyYW5zZm9ybSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBTLnRyYW5zZm9ybT9TLnRyYW5zZm9ybShtLGQpOlMudHJhbnNmb3JtKTtpZihSLnNrZXdUeXBlPVMuc2tld1R5cGV8fFIuc2tld1R5cGV8fG4uZGVmYXVsdFNrZXdUeXBlLHMuX3RyYW5zZm9ybT1SLCJyb3RhdGlvbloiaW4gUyYmKFMucm90YXRpb249Uy5yb3RhdGlvblopLE8mJiJzdHJpbmciPT10eXBlb2YgTyYmUnQpKGM9ai5zdHlsZSlbUnRdPU8sYy5kaXNwbGF5PSJibG9jayIsYy5wb3NpdGlvbj0iYWJzb2x1dGUiLC0xIT09Ty5pbmRleE9mKCIlIikmJihjLndpZHRoPUsodCwid2lkdGgiKSxjLmhlaWdodD1LKHQsImhlaWdodCIpKSxYLmJvZHkuYXBwZW5kQ2hpbGQoaiksXz1qdChqLG51bGwsITEpLCJzaW1wbGUiPT09Ui5za2V3VHlwZSYmKF8uc2NhbGVZKj1NYXRoLmNvcyhfLnNrZXdYKnopKSxSLnN2ZyYmKHY9Ui54T3JpZ2luLHk9Ui55T3JpZ2luLF8ueC09Ui54T2Zmc2V0LF8ueS09Ui55T2Zmc2V0LChTLnRyYW5zZm9ybU9yaWdpbnx8Uy5zdmdPcmlnaW4pJiYoTz17fSxJdCh0LGF0KFMudHJhbnNmb3JtT3JpZ2luKSxPLFMuc3ZnT3JpZ2luLFMuc21vb3RoT3JpZ2luLCEwKSx2PU8ueE9yaWdpbix5PU8ueU9yaWdpbixfLngtPU8ueE9mZnNldC1SLnhPZmZzZXQsXy55LT1PLnlPZmZzZXQtUi55T2Zmc2V0KSwodnx8eSkmJihUPUJ0KGosITApLF8ueC09di0odipUWzBdK3kqVFsyXSksXy55LT15LSh2KlRbMV0reSpUWzNdKSkpLFguYm9keS5yZW1vdmVDaGlsZChqKSxfLnBlcnNwZWN0aXZlfHwoXy5wZXJzcGVjdGl2ZT1SLnBlcnNwZWN0aXZlKSxudWxsIT1TLnhQZXJjZW50JiYoXy54UGVyY2VudD1sdChTLnhQZXJjZW50LFIueFBlcmNlbnQpKSxudWxsIT1TLnlQZXJjZW50JiYoXy55UGVyY2VudD1sdChTLnlQZXJjZW50LFIueVBlcmNlbnQpKTtlbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgUyl7aWYoXz17c2NhbGVYOmx0KG51bGwhPVMuc2NhbGVYP1Muc2NhbGVYOlMuc2NhbGUsUi5zY2FsZVgpLHNjYWxlWTpsdChudWxsIT1TLnNjYWxlWT9TLnNjYWxlWTpTLnNjYWxlLFIuc2NhbGVZKSxzY2FsZVo6bHQoUy5zY2FsZVosUi5zY2FsZVopLHg6bHQoUy54LFIueCkseTpsdChTLnksUi55KSx6Omx0KFMueixSLnopLHhQZXJjZW50Omx0KFMueFBlcmNlbnQsUi54UGVyY2VudCkseVBlcmNlbnQ6bHQoUy55UGVyY2VudCxSLnlQZXJjZW50KSxwZXJzcGVjdGl2ZTpsdChTLnRyYW5zZm9ybVBlcnNwZWN0aXZlLFIucGVyc3BlY3RpdmUpfSxudWxsIT0oZz1TLmRpcmVjdGlvbmFsUm90YXRpb24pKWlmKCJvYmplY3QiPT10eXBlb2YgZylmb3IoYyBpbiBnKVNbY109Z1tjXTtlbHNlIFMucm90YXRpb249Zzsic3RyaW5nIj09dHlwZW9mIFMueCYmLTEhPT1TLnguaW5kZXhPZigiJSIpJiYoXy54PTAsXy54UGVyY2VudD1sdChTLngsUi54UGVyY2VudCkpLCJzdHJpbmciPT10eXBlb2YgUy55JiYtMSE9PVMueS5pbmRleE9mKCIlIikmJihfLnk9MCxfLnlQZXJjZW50PWx0KFMueSxSLnlQZXJjZW50KSksXy5yb3RhdGlvbj1odCgicm90YXRpb24iaW4gUz9TLnJvdGF0aW9uOiJzaG9ydFJvdGF0aW9uImluIFM/Uy5zaG9ydFJvdGF0aW9uKyJfc2hvcnQiOlIucm90YXRpb24sUi5yb3RhdGlvbiwicm90YXRpb24iLGspLEN0JiYoXy5yb3RhdGlvblg9aHQoInJvdGF0aW9uWCJpbiBTP1Mucm90YXRpb25YOiJzaG9ydFJvdGF0aW9uWCJpbiBTP1Muc2hvcnRSb3RhdGlvblgrIl9zaG9ydCI6Ui5yb3RhdGlvblh8fDAsUi5yb3RhdGlvblgsInJvdGF0aW9uWCIsayksXy5yb3RhdGlvblk9aHQoInJvdGF0aW9uWSJpbiBTP1Mucm90YXRpb25ZOiJzaG9ydFJvdGF0aW9uWSJpbiBTP1Muc2hvcnRSb3RhdGlvblkrIl9zaG9ydCI6Ui5yb3RhdGlvbll8fDAsUi5yb3RhdGlvblksInJvdGF0aW9uWSIsaykpLF8uc2tld1g9aHQoUy5za2V3WCxSLnNrZXdYKSxfLnNrZXdZPWh0KFMuc2tld1ksUi5za2V3WSl9Zm9yKEN0JiZudWxsIT1TLmZvcmNlM0QmJihSLmZvcmNlM0Q9Uy5mb3JjZTNELHA9ITApLChmPVIuZm9yY2UzRHx8Ui56fHxSLnJvdGF0aW9uWHx8Ui5yb3RhdGlvbll8fF8uenx8Xy5yb3RhdGlvblh8fF8ucm90YXRpb25ZfHxfLnBlcnNwZWN0aXZlKXx8bnVsbD09Uy5zY2FsZXx8KF8uc2NhbGVaPTEpOy0tUD4tMTspKChPPV9bdz1rdFtQXV0tUlt3XSk+MWUtNnx8TzwtMWUtNnx8bnVsbCE9U1t3XXx8bnVsbCE9TFt3XSkmJihwPSEwLGE9bmV3IHZ0KFIsdyxSW3ddLE8sYSksdyBpbiBrJiYoYS5lPWtbd10pLGEueHMwPTAsYS5wbHVnaW49byxzLl9vdmVyd3JpdGVQcm9wcy5wdXNoKGEubikpO3JldHVybiBPPVMudHJhbnNmb3JtT3JpZ2luLFIuc3ZnJiYoT3x8Uy5zdmdPcmlnaW4pJiYodj1SLnhPZmZzZXQseT1SLnlPZmZzZXQsSXQodCxhdChPKSxfLFMuc3ZnT3JpZ2luLFMuc21vb3RoT3JpZ2luKSxhPXl0KFIsInhPcmlnaW4iLCh4P1I6XykueE9yaWdpbixfLnhPcmlnaW4sYSwidHJhbnNmb3JtT3JpZ2luIiksYT15dChSLCJ5T3JpZ2luIiwoeD9SOl8pLnlPcmlnaW4sXy55T3JpZ2luLGEsInRyYW5zZm9ybU9yaWdpbiIpLHY9PT1SLnhPZmZzZXQmJnk9PT1SLnlPZmZzZXR8fChhPXl0KFIsInhPZmZzZXQiLHg/djpSLnhPZmZzZXQsUi54T2Zmc2V0LGEsInRyYW5zZm9ybU9yaWdpbiIpLGE9eXQoUiwieU9mZnNldCIseD95OlIueU9mZnNldCxSLnlPZmZzZXQsYSwidHJhbnNmb3JtT3JpZ2luIikpLE89IjBweCAwcHgiKSwoT3x8Q3QmJmYmJlIuek9yaWdpbikmJihSdD8ocD0hMCx3PUF0LE89KE98fEsodCx3LGksITEsIjUwJSA1MCUiKSkrIiIsKGE9bmV3IHZ0KGIsdywwLDAsYSwtMSwidHJhbnNmb3JtT3JpZ2luIikpLmI9Ylt3XSxhLnBsdWdpbj1vLEN0PyhjPVIuek9yaWdpbixPPU8uc3BsaXQoIiAiKSxSLnpPcmlnaW49KE8ubGVuZ3RoPjImJigwPT09Y3x8IjBweCIhPT1PWzJdKT9wYXJzZUZsb2F0KE9bMl0pOmMpfHwwLGEueHMwPWEuZT1PWzBdKyIgIisoT1sxXXx8IjUwJSIpKyIgMHB4IiwoYT1uZXcgdnQoUiwiek9yaWdpbiIsMCwwLGEsLTEsYS5uKSkuYj1jLGEueHMwPWEuZT1SLnpPcmlnaW4pOmEueHMwPWEuZT1PKTphdChPKyIiLFIpKSxwJiYocy5fdHJhbnNmb3JtVHlwZT1SLnN2ZyYmU3R8fCFmJiYzIT09dGhpcy5fdHJhbnNmb3JtVHlwZT8yOjMpLGgmJihsW3JdPWgpLHUmJihsLnNjYWxlPXUpLGF9LHByZWZpeDohMH0pLGJ0KCJib3hTaGFkb3ciLHtkZWZhdWx0VmFsdWU6IjBweCAwcHggMHB4IDBweCAjOTk5IixwcmVmaXg6ITAsY29sb3I6ITAsbXVsdGk6ITAsa2V5d29yZDoiaW5zZXQifSksYnQoImJvcmRlclJhZGl1cyIse2RlZmF1bHRWYWx1ZToiMHB4IixwYXJzZXI6ZnVuY3Rpb24odCxyLHMsbixhLG8pe3I9dGhpcy5mb3JtYXQocik7dmFyIGwsaCx1LF8sYyxmLHAsZCxtLGcsdix5LFQsdyx4LGIsUD1bImJvcmRlclRvcExlZnRSYWRpdXMiLCJib3JkZXJUb3BSaWdodFJhZGl1cyIsImJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tTGVmdFJhZGl1cyJdLFM9dC5zdHlsZTtmb3IobT1wYXJzZUZsb2F0KHQub2Zmc2V0V2lkdGgpLGc9cGFyc2VGbG9hdCh0Lm9mZnNldEhlaWdodCksbD1yLnNwbGl0KCIgIiksaD0wO2g8UC5sZW5ndGg7aCsrKXRoaXMucC5pbmRleE9mKCJib3JkZXIiKSYmKFBbaF09JChQW2hdKSksLTEhPT0oYz1fPUsodCxQW2hdLGksITEsIjBweCIpKS5pbmRleE9mKCIgIikmJihjPShfPWMuc3BsaXQoIiAiKSlbMF0sXz1fWzFdKSxmPXU9bFtoXSxwPXBhcnNlRmxvYXQoYykseT1jLnN1YnN0cigocCsiIikubGVuZ3RoKSwoVD0iPSI9PT1mLmNoYXJBdCgxKSk/KGQ9cGFyc2VJbnQoZi5jaGFyQXQoMCkrIjEiLDEwKSxmPWYuc3Vic3RyKDIpLGQqPXBhcnNlRmxvYXQoZiksdj1mLnN1YnN0cigoZCsiIikubGVuZ3RoLShkPDA/MTowKSl8fCIiKTooZD1wYXJzZUZsb2F0KGYpLHY9Zi5zdWJzdHIoKGQrIiIpLmxlbmd0aCkpLCIiPT09diYmKHY9ZVtzXXx8eSksdiE9PXkmJih3PUoodCwiYm9yZGVyTGVmdCIscCx5KSx4PUoodCwiYm9yZGVyVG9wIixwLHkpLCIlIj09PXY/KGM9dy9tKjEwMCsiJSIsXz14L2cqMTAwKyIlIik6ImVtIj09PXY/KGM9dy8oYj1KKHQsImJvcmRlckxlZnQiLDEsImVtIikpKyJlbSIsXz14L2IrImVtIik6KGM9dysicHgiLF89eCsicHgiKSxUJiYoZj1wYXJzZUZsb2F0KGMpK2Qrdix1PXBhcnNlRmxvYXQoXykrZCt2KSksYT1UdChTLFBbaF0sYysiICIrXyxmKyIgIit1LCExLCIwcHgiLGEpO3JldHVybiBhfSxwcmVmaXg6ITAsZm9ybWF0dGVyOmR0KCIwcHggMHB4IDBweCAwcHgiLCExLCEwKX0pLGJ0KCJib3JkZXJCb3R0b21MZWZ0UmFkaXVzLGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzLGJvcmRlclRvcExlZnRSYWRpdXMsYm9yZGVyVG9wUmlnaHRSYWRpdXMiLHtkZWZhdWx0VmFsdWU6IjBweCIscGFyc2VyOmZ1bmN0aW9uKHQsZSxyLHMsbixhKXtyZXR1cm4gVHQodC5zdHlsZSxyLHRoaXMuZm9ybWF0KEsodCxyLGksITEsIjBweCAwcHgiKSksdGhpcy5mb3JtYXQoZSksITEsIjBweCIsbil9LHByZWZpeDohMCxmb3JtYXR0ZXI6ZHQoIjBweCAwcHgiLCExLCEwKX0pLGJ0KCJiYWNrZ3JvdW5kUG9zaXRpb24iLHtkZWZhdWx0VmFsdWU6IjAgMCIscGFyc2VyOmZ1bmN0aW9uKHQsZSxyLHMsbixhKXt2YXIgbyxsLGgsdSxfLGMsZj0iYmFja2dyb3VuZC1wb3NpdGlvbiIsZD1pfHxRKHQsbnVsbCksbT10aGlzLmZvcm1hdCgoZD9wP2QuZ2V0UHJvcGVydHlWYWx1ZShmKyIteCIpKyIgIitkLmdldFByb3BlcnR5VmFsdWUoZisiLXkiKTpkLmdldFByb3BlcnR5VmFsdWUoZik6dC5jdXJyZW50U3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uWCsiICIrdC5jdXJyZW50U3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uWSl8fCIwIDAiKSxnPXRoaXMuZm9ybWF0KGUpO2lmKC0xIT09bS5pbmRleE9mKCIlIikhPSgtMSE9PWcuaW5kZXhPZigiJSIpKSYmZy5zcGxpdCgiLCIpLmxlbmd0aDwyJiYoYz1LKHQsImJhY2tncm91bmRJbWFnZSIpLnJlcGxhY2UoTywiIikpJiYibm9uZSIhPT1jKXtmb3Iobz1tLnNwbGl0KCIgIiksbD1nLnNwbGl0KCIgIiksVS5zZXRBdHRyaWJ1dGUoInNyYyIsYyksaD0yOy0taD4tMTspKHU9LTEhPT0obT1vW2hdKS5pbmRleE9mKCIlIikpIT09KC0xIT09bFtoXS5pbmRleE9mKCIlIikpJiYoXz0wPT09aD90Lm9mZnNldFdpZHRoLVUud2lkdGg6dC5vZmZzZXRIZWlnaHQtVS5oZWlnaHQsb1toXT11P3BhcnNlRmxvYXQobSkvMTAwKl8rInB4IjpwYXJzZUZsb2F0KG0pL18qMTAwKyIlIik7bT1vLmpvaW4oIiAiKX1yZXR1cm4gdGhpcy5wYXJzZUNvbXBsZXgodC5zdHlsZSxtLGcsbixhKX0sZm9ybWF0dGVyOmF0fSksYnQoImJhY2tncm91bmRTaXplIix7ZGVmYXVsdFZhbHVlOiIwIDAiLGZvcm1hdHRlcjpmdW5jdGlvbih0KXtyZXR1cm4iY28iPT09KHQrPSIiKS5zdWJzdHIoMCwyKT90OmF0KC0xPT09dC5pbmRleE9mKCIgIik/dCsiICIrdDp0KX19KSxidCgicGVyc3BlY3RpdmUiLHtkZWZhdWx0VmFsdWU6IjBweCIscHJlZml4OiEwfSksYnQoInBlcnNwZWN0aXZlT3JpZ2luIix7ZGVmYXVsdFZhbHVlOiI1MCUgNTAlIixwcmVmaXg6ITB9KSxidCgidHJhbnNmb3JtU3R5bGUiLHtwcmVmaXg6ITB9KSxidCgiYmFja2ZhY2VWaXNpYmlsaXR5Iix7cHJlZml4OiEwfSksYnQoInVzZXJTZWxlY3QiLHtwcmVmaXg6ITB9KSxidCgibWFyZ2luIix7cGFyc2VyOm10KCJtYXJnaW5Ub3AsbWFyZ2luUmlnaHQsbWFyZ2luQm90dG9tLG1hcmdpbkxlZnQiKX0pLGJ0KCJwYWRkaW5nIix7cGFyc2VyOm10KCJwYWRkaW5nVG9wLHBhZGRpbmdSaWdodCxwYWRkaW5nQm90dG9tLHBhZGRpbmdMZWZ0Iil9KSxidCgiY2xpcCIse2RlZmF1bHRWYWx1ZToicmVjdCgwcHgsMHB4LDBweCwwcHgpIixwYXJzZXI6ZnVuY3Rpb24odCxlLHIscyxuLGEpe3ZhciBvLGwsaDtyZXR1cm4gcDw5PyhsPXQuY3VycmVudFN0eWxlLGg9cDw4PyIgIjoiLCIsbz0icmVjdCgiK2wuY2xpcFRvcCtoK2wuY2xpcFJpZ2h0K2grbC5jbGlwQm90dG9tK2grbC5jbGlwTGVmdCsiKSIsZT10aGlzLmZvcm1hdChlKS5zcGxpdCgiLCIpLmpvaW4oaCkpOihvPXRoaXMuZm9ybWF0KEsodCx0aGlzLnAsaSwhMSx0aGlzLmRmbHQpKSxlPXRoaXMuZm9ybWF0KGUpKSx0aGlzLnBhcnNlQ29tcGxleCh0LnN0eWxlLG8sZSxuLGEpfX0pLGJ0KCJ0ZXh0U2hhZG93Iix7ZGVmYXVsdFZhbHVlOiIwcHggMHB4IDBweCAjOTk5Iixjb2xvcjohMCxtdWx0aTohMH0pLGJ0KCJhdXRvUm91bmQsc3RyaWN0VW5pdHMiLHtwYXJzZXI6ZnVuY3Rpb24odCxlLGkscixzKXtyZXR1cm4gc319KSxidCgiYm9yZGVyIix7ZGVmYXVsdFZhbHVlOiIwcHggc29saWQgIzAwMCIscGFyc2VyOmZ1bmN0aW9uKHQsZSxyLHMsbixhKXt2YXIgbz1LKHQsImJvcmRlclRvcFdpZHRoIixpLCExLCIwcHgiKSxsPXRoaXMuZm9ybWF0KGUpLnNwbGl0KCIgIiksaD1sWzBdLnJlcGxhY2UodywiIik7cmV0dXJuInB4IiE9PWgmJihvPXBhcnNlRmxvYXQobykvSih0LCJib3JkZXJUb3BXaWR0aCIsMSxoKStoKSx0aGlzLnBhcnNlQ29tcGxleCh0LnN0eWxlLHRoaXMuZm9ybWF0KG8rIiAiK0sodCwiYm9yZGVyVG9wU3R5bGUiLGksITEsInNvbGlkIikrIiAiK0sodCwiYm9yZGVyVG9wQ29sb3IiLGksITEsIiMwMDAiKSksbC5qb2luKCIgIiksbixhKX0sY29sb3I6ITAsZm9ybWF0dGVyOmZ1bmN0aW9uKHQpe3ZhciBlPXQuc3BsaXQoIiAiKTtyZXR1cm4gZVswXSsiICIrKGVbMV18fCJzb2xpZCIpKyIgIisodC5tYXRjaChwdCl8fFsiIzAwMCJdKVswXX19KSxidCgiYm9yZGVyV2lkdGgiLHtwYXJzZXI6bXQoImJvcmRlclRvcFdpZHRoLGJvcmRlclJpZ2h0V2lkdGgsYm9yZGVyQm90dG9tV2lkdGgsYm9yZGVyTGVmdFdpZHRoIil9KSxidCgiZmxvYXQsY3NzRmxvYXQsc3R5bGVGbG9hdCIse3BhcnNlcjpmdW5jdGlvbih0LGUsaSxyLHMsbil7dmFyIGE9dC5zdHlsZSxvPSJjc3NGbG9hdCJpbiBhPyJjc3NGbG9hdCI6InN0eWxlRmxvYXQiO3JldHVybiBuZXcgdnQoYSxvLDAsMCxzLC0xLGksITEsMCxhW29dLGUpfX0pO3ZhciBWdD1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMudCxyPWkuZmlsdGVyfHxLKHRoaXMuZGF0YSwiZmlsdGVyIil8fCIiLHM9dGhpcy5zK3RoaXMuYyp0fDA7MTAwPT09cyYmKC0xPT09ci5pbmRleE9mKCJhdHJpeCgiKSYmLTE9PT1yLmluZGV4T2YoInJhZGllbnQoIikmJi0xPT09ci5pbmRleE9mKCJvYWRlcigiKT8oaS5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLGU9IUsodGhpcy5kYXRhLCJmaWx0ZXIiKSk6KGkuZmlsdGVyPXIucmVwbGFjZShQLCIiKSxlPSEwKSksZXx8KHRoaXMueG4xJiYoaS5maWx0ZXI9cj1yfHwiYWxwaGEob3BhY2l0eT0iK3MrIikiKSwtMT09PXIuaW5kZXhPZigicGFjaXR5Iik/MD09PXMmJnRoaXMueG4xfHwoaS5maWx0ZXI9cisiIGFscGhhKG9wYWNpdHk9IitzKyIpIik6aS5maWx0ZXI9ci5yZXBsYWNlKHgsIm9wYWNpdHk9IitzKSl9O2J0KCJvcGFjaXR5LGFscGhhLGF1dG9BbHBoYSIse2RlZmF1bHRWYWx1ZToiMSIscGFyc2VyOmZ1bmN0aW9uKHQsZSxyLHMsbixhKXt2YXIgbz1wYXJzZUZsb2F0KEsodCwib3BhY2l0eSIsaSwhMSwiMSIpKSxsPXQuc3R5bGUsaD0iYXV0b0FscGhhIj09PXI7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiYiPSI9PT1lLmNoYXJBdCgxKSYmKGU9KCItIj09PWUuY2hhckF0KDApPy0xOjEpKnBhcnNlRmxvYXQoZS5zdWJzdHIoMikpK28pLGgmJjE9PT1vJiYiaGlkZGVuIj09PUsodCwidmlzaWJpbGl0eSIsaSkmJjAhPT1lJiYobz0wKSxHP249bmV3IHZ0KGwsIm9wYWNpdHkiLG8sZS1vLG4pOigobj1uZXcgdnQobCwib3BhY2l0eSIsMTAwKm8sMTAwKihlLW8pLG4pKS54bjE9aD8xOjAsbC56b29tPTEsbi50eXBlPTIsbi5iPSJhbHBoYShvcGFjaXR5PSIrbi5zKyIpIixuLmU9ImFscGhhKG9wYWNpdHk9Iisobi5zK24uYykrIikiLG4uZGF0YT10LG4ucGx1Z2luPWEsbi5zZXRSYXRpbz1WdCksaCYmKChuPW5ldyB2dChsLCJ2aXNpYmlsaXR5IiwwLDAsbiwtMSxudWxsLCExLDAsMCE9PW8/ImluaGVyaXQiOiJoaWRkZW4iLDA9PT1lPyJoaWRkZW4iOiJpbmhlcml0IikpLnhzMD0iaW5oZXJpdCIscy5fb3ZlcndyaXRlUHJvcHMucHVzaChuLm4pLHMuX292ZXJ3cml0ZVByb3BzLnB1c2gocikpLG59fSk7dmFyIEd0PWZ1bmN0aW9uKHQsZSl7ZSYmKHQucmVtb3ZlUHJvcGVydHk/KCJtcyIhPT1lLnN1YnN0cigwLDIpJiYid2Via2l0IiE9PWUuc3Vic3RyKDAsNil8fChlPSItIitlKSx0LnJlbW92ZVByb3BlcnR5KGUucmVwbGFjZShrLCItJDEiKS50b0xvd2VyQ2FzZSgpKSk6dC5yZW1vdmVBdHRyaWJ1dGUoZSkpfSxxdD1mdW5jdGlvbih0KXtpZih0aGlzLnQuX2dzQ2xhc3NQVD10aGlzLDE9PT10fHwwPT09dCl7dGhpcy50LnNldEF0dHJpYnV0ZSgiY2xhc3MiLDA9PT10P3RoaXMuYjp0aGlzLmUpO2Zvcih2YXIgZT10aGlzLmRhdGEsaT10aGlzLnQuc3R5bGU7ZTspZS52P2lbZS5wXT1lLnY6R3QoaSxlLnApLGU9ZS5fbmV4dDsxPT09dCYmdGhpcy50Ll9nc0NsYXNzUFQ9PT10aGlzJiYodGhpcy50Ll9nc0NsYXNzUFQ9bnVsbCl9ZWxzZSB0aGlzLnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIT09dGhpcy5lJiZ0aGlzLnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5lKX07YnQoImNsYXNzTmFtZSIse3BhcnNlcjpmdW5jdGlvbihlLHIscyxuLGEsbyxsKXt2YXIgaCx1LF8sYyxmLHA9ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiLGQ9ZS5zdHlsZS5jc3NUZXh0O2lmKChhPW4uX2NsYXNzTmFtZVBUPW5ldyB2dChlLHMsMCwwLGEsMikpLnNldFJhdGlvPXF0LGEucHI9LTExLHQ9ITAsYS5iPXAsdT1ldChlLGkpLF89ZS5fZ3NDbGFzc1BUKXtmb3IoYz17fSxmPV8uZGF0YTtmOyljW2YucF09MSxmPWYuX25leHQ7Xy5zZXRSYXRpbygxKX1yZXR1cm4gZS5fZ3NDbGFzc1BUPWEsYS5lPSI9IiE9PXIuY2hhckF0KDEpP3I6cC5yZXBsYWNlKG5ldyBSZWdFeHAoIig/Olxcc3xeKSIrci5zdWJzdHIoMikrIig/IVtcXHctXSkiKSwiIikrKCIrIj09PXIuY2hhckF0KDApPyIgIityLnN1YnN0cigyKToiIiksZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixhLmUpLGg9aXQoZSx1LGV0KGUpLGwsYyksZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixwKSxhLmRhdGE9aC5maXJzdE1QVCxlLnN0eWxlLmNzc1RleHQ9ZCxhPWEueGZpcnN0PW4ucGFyc2UoZSxoLmRpZnMsYSxvKX19KTt2YXIgV3Q9ZnVuY3Rpb24odCl7aWYoKDE9PT10fHwwPT09dCkmJnRoaXMuZGF0YS5fdG90YWxUaW1lPT09dGhpcy5kYXRhLl90b3RhbER1cmF0aW9uJiYiaXNGcm9tU3RhcnQiIT09dGhpcy5kYXRhLmRhdGEpe3ZhciBlLGkscixzLG4sYT10aGlzLnQuc3R5bGUsbD1vLnRyYW5zZm9ybS5wYXJzZTtpZigiYWxsIj09PXRoaXMuZSlhLmNzc1RleHQ9IiIscz0hMDtlbHNlIGZvcihyPShlPXRoaXMuZS5zcGxpdCgiICIpLmpvaW4oIiIpLnNwbGl0KCIsIikpLmxlbmd0aDstLXI+LTE7KWk9ZVtyXSxvW2ldJiYob1tpXS5wYXJzZT09PWw/cz0hMDppPSJ0cmFuc2Zvcm1PcmlnaW4iPT09aT9BdDpvW2ldLnApLEd0KGEsaSk7cyYmKEd0KGEsUnQpLChuPXRoaXMudC5fZ3NUcmFuc2Zvcm0pJiYobi5zdmcmJih0aGlzLnQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXN2Zy1vcmlnaW4iKSx0aGlzLnQucmVtb3ZlQXR0cmlidXRlKCJ0cmFuc2Zvcm0iKSksZGVsZXRlIHRoaXMudC5fZ3NUcmFuc2Zvcm0pKX19O2ZvcihidCgiY2xlYXJQcm9wcyIse3BhcnNlcjpmdW5jdGlvbihlLGkscixzLG4pe3JldHVybihuPW5ldyB2dChlLHIsMCwwLG4sMikpLnNldFJhdGlvPVd0LG4uZT1pLG4ucHI9LTEwLG4uZGF0YT1zLl90d2Vlbix0PSEwLG59fSksbD0iYmV6aWVyLHRocm93UHJvcHMscGh5c2ljc1Byb3BzLHBoeXNpY3MyRCIuc3BsaXQoIiwiKSx3dD1sLmxlbmd0aDt3dC0tOylQdChsW3d0XSk7KGw9bi5wcm90b3R5cGUpLl9maXJzdFBUPWwuX2xhc3RQYXJzZWRUcmFuc2Zvcm09bC5fdHJhbnNmb3JtPW51bGwsbC5fb25Jbml0VHdlZW49ZnVuY3Rpb24ocixhLGwsYyl7aWYoIXIubm9kZVR5cGUpcmV0dXJuITE7dGhpcy5fdGFyZ2V0PWQ9cix0aGlzLl90d2Vlbj1sLHRoaXMuX3ZhcnM9YSxtPWMsaD1hLmF1dG9Sb3VuZCx0PSExLGU9YS5zdWZmaXhNYXB8fG4uc3VmZml4TWFwLGk9UShyLCIiKSxzPXRoaXMuX292ZXJ3cml0ZVByb3BzO3ZhciBwLGcsdix5LFQsdyx4LFAsUyxrPXIuc3R5bGU7aWYodSYmIiI9PT1rLnpJbmRleCYmKCJhdXRvIiE9PShwPUsociwiekluZGV4IixpKSkmJiIiIT09cHx8dGhpcy5fYWRkTGF6eVNldChrLCJ6SW5kZXgiLDApKSwic3RyaW5nIj09dHlwZW9mIGEmJih5PWsuY3NzVGV4dCxwPWV0KHIsaSksay5jc3NUZXh0PXkrIjsiK2EscD1pdChyLHAsZXQocikpLmRpZnMsIUcmJmIudGVzdChhKSYmKHAub3BhY2l0eT1wYXJzZUZsb2F0KFJlZ0V4cC4kMSkpLGE9cCxrLmNzc1RleHQ9eSksYS5jbGFzc05hbWU/dGhpcy5fZmlyc3RQVD1nPW8uY2xhc3NOYW1lLnBhcnNlKHIsYS5jbGFzc05hbWUsImNsYXNzTmFtZSIsdGhpcyxudWxsLG51bGwsYSk6dGhpcy5fZmlyc3RQVD1nPXRoaXMucGFyc2UocixhLG51bGwpLHRoaXMuX3RyYW5zZm9ybVR5cGUpe2ZvcihTPTM9PT10aGlzLl90cmFuc2Zvcm1UeXBlLFJ0P18mJih1PSEwLCIiPT09ay56SW5kZXgmJigiYXV0byIhPT0oeD1LKHIsInpJbmRleCIsaSkpJiYiIiE9PXh8fHRoaXMuX2FkZExhenlTZXQoaywiekluZGV4IiwwKSksZiYmdGhpcy5fYWRkTGF6eVNldChrLCJXZWJraXRCYWNrZmFjZVZpc2liaWxpdHkiLHRoaXMuX3ZhcnMuV2Via2l0QmFja2ZhY2VWaXNpYmlsaXR5fHwoUz8idmlzaWJsZSI6ImhpZGRlbiIpKSk6ay56b29tPTEsdj1nO3YmJnYuX25leHQ7KXY9di5fbmV4dDtQPW5ldyB2dChyLCJ0cmFuc2Zvcm0iLDAsMCxudWxsLDIpLHRoaXMuX2xpbmtDU1NQKFAsbnVsbCx2KSxQLnNldFJhdGlvPVJ0P1l0OlV0LFAuZGF0YT10aGlzLl90cmFuc2Zvcm18fGp0KHIsaSwhMCksUC50d2Vlbj1sLFAucHI9LTEscy5wb3AoKX1pZih0KXtmb3IoO2c7KXtmb3Iodz1nLl9uZXh0LHY9eTt2JiZ2LnByPmcucHI7KXY9di5fbmV4dDsoZy5fcHJldj12P3YuX3ByZXY6VCk/Zy5fcHJldi5fbmV4dD1nOnk9ZywoZy5fbmV4dD12KT92Ll9wcmV2PWc6VD1nLGc9d310aGlzLl9maXJzdFBUPXl9cmV0dXJuITB9LGwucGFyc2U9ZnVuY3Rpb24odCxyLHMsbil7dmFyIGEsbCx1LF8sYyxmLHAsZyx2LHksVD10LnN0eWxlO2ZvcihhIGluIHIpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZihmPXJbYV0pJiYoZj1mKG0sZCkpLGw9b1thXSlzPWwucGFyc2UodCxmLGEsdGhpcyxzLG4scik7ZWxzZXtpZigiLS0iPT09YS5zdWJzdHIoMCwyKSl7dGhpcy5fdHdlZW4uX3Byb3BMb29rdXBbYV09dGhpcy5fYWRkVHdlZW4uY2FsbCh0aGlzLl90d2Vlbix0LnN0eWxlLCJzZXRQcm9wZXJ0eSIsUSh0KS5nZXRQcm9wZXJ0eVZhbHVlKGEpKyIiLGYrIiIsYSwhMSxhKTtjb250aW51ZX1jPUsodCxhLGkpKyIiLHY9InN0cmluZyI9PXR5cGVvZiBmLCJjb2xvciI9PT1hfHwiZmlsbCI9PT1hfHwic3Ryb2tlIj09PWF8fC0xIT09YS5pbmRleE9mKCJDb2xvciIpfHx2JiZTLnRlc3QoZik/KHZ8fChmPSgoZj1jdChmKSkubGVuZ3RoPjM/InJnYmEoIjoicmdiKCIpK2Yuam9pbigiLCIpKyIpIikscz1UdChULGEsYyxmLCEwLCJ0cmFuc3BhcmVudCIscywwLG4pKTp2JiZGLnRlc3QoZik/cz1UdChULGEsYyxmLCEwLG51bGwscywwLG4pOihwPSh1PXBhcnNlRmxvYXQoYykpfHwwPT09dT9jLnN1YnN0cigodSsiIikubGVuZ3RoKToiIiwiIiE9PWMmJiJhdXRvIiE9PWN8fCgid2lkdGgiPT09YXx8ImhlaWdodCI9PT1hPyh1PW50KHQsYSxpKSxwPSJweCIpOiJsZWZ0Ij09PWF8fCJ0b3AiPT09YT8odT10dCh0LGEsaSkscD0icHgiKToodT0ib3BhY2l0eSIhPT1hPzA6MSxwPSIiKSksKHk9diYmIj0iPT09Zi5jaGFyQXQoMSkpPyhfPXBhcnNlSW50KGYuY2hhckF0KDApKyIxIiwxMCksZj1mLnN1YnN0cigyKSxfKj1wYXJzZUZsb2F0KGYpLGc9Zi5yZXBsYWNlKHcsIiIpKTooXz1wYXJzZUZsb2F0KGYpLGc9dj9mLnJlcGxhY2UodywiIik6IiIpLCIiPT09ZyYmKGc9YSBpbiBlP2VbYV06cCksZj1ffHwwPT09Xz8oeT9fK3U6XykrZzpyW2FdLHAhPT1nJiYoIiI9PT1nJiYibGluZUhlaWdodCIhPT1hfHwoX3x8MD09PV8pJiZ1JiYodT1KKHQsYSx1LHApLCIlIj09PWc/KHUvPUoodCxhLDEwMCwiJSIpLzEwMCwhMCE9PXIuc3RyaWN0VW5pdHMmJihjPXUrIiUiKSk6ImVtIj09PWd8fCJyZW0iPT09Z3x8InZ3Ij09PWd8fCJ2aCI9PT1nP3UvPUoodCxhLDEsZyk6InB4IiE9PWcmJihfPUoodCxhLF8sZyksZz0icHgiKSx5JiYoX3x8MD09PV8pJiYoZj1fK3UrZykpKSx5JiYoXys9dSksIXUmJjAhPT11fHwhXyYmMCE9PV8/dm9pZCAwIT09VFthXSYmKGZ8fGYrIiIhPSJOYU4iJiZudWxsIT1mKT8ocz1uZXcgdnQoVCxhLF98fHV8fDAsMCxzLC0xLGEsITEsMCxjLGYpKS54czA9Im5vbmUiIT09Znx8ImRpc3BsYXkiIT09YSYmLTE9PT1hLmluZGV4T2YoIlN0eWxlIik/ZjpjOlcoImludmFsaWQgIithKyIgdHdlZW4gdmFsdWU6ICIrclthXSk6KHM9bmV3IHZ0KFQsYSx1LF8tdSxzLDAsYSwhMSE9PWgmJigicHgiPT09Z3x8InpJbmRleCI9PT1hKSwwLGMsZikpLnhzMD1nKX1uJiZzJiYhcy5wbHVnaW4mJihzLnBsdWdpbj1uKX1yZXR1cm4gc30sbC5zZXRSYXRpbz1mdW5jdGlvbih0KXt2YXIgZSxpLHIscz10aGlzLl9maXJzdFBUO2lmKDEhPT10fHx0aGlzLl90d2Vlbi5fdGltZSE9PXRoaXMuX3R3ZWVuLl9kdXJhdGlvbiYmMCE9PXRoaXMuX3R3ZWVuLl90aW1lKWlmKHR8fHRoaXMuX3R3ZWVuLl90aW1lIT09dGhpcy5fdHdlZW4uX2R1cmF0aW9uJiYwIT09dGhpcy5fdHdlZW4uX3RpbWV8fC0xZS02PT09dGhpcy5fdHdlZW4uX3Jhd1ByZXZUaW1lKWZvcig7czspe2lmKGU9cy5jKnQrcy5zLHMucj9lPXMucihlKTplPDFlLTYmJmU+LTFlLTYmJihlPTApLHMudHlwZSlpZigxPT09cy50eXBlKWlmKDI9PT0ocj1zLmwpKXMudFtzLnBdPXMueHMwK2Urcy54czErcy54bjErcy54czI7ZWxzZSBpZigzPT09cilzLnRbcy5wXT1zLnhzMCtlK3MueHMxK3MueG4xK3MueHMyK3MueG4yK3MueHMzO2Vsc2UgaWYoND09PXIpcy50W3MucF09cy54czArZStzLnhzMStzLnhuMStzLnhzMitzLnhuMitzLnhzMytzLnhuMytzLnhzNDtlbHNlIGlmKDU9PT1yKXMudFtzLnBdPXMueHMwK2Urcy54czErcy54bjErcy54czIrcy54bjIrcy54czMrcy54bjMrcy54czQrcy54bjQrcy54czU7ZWxzZXtmb3IoaT1zLnhzMCtlK3MueHMxLHI9MTtyPHMubDtyKyspaSs9c1sieG4iK3JdK3NbInhzIisocisxKV07cy50W3MucF09aX1lbHNlLTE9PT1zLnR5cGU/cy50W3MucF09cy54czA6cy5zZXRSYXRpbyYmcy5zZXRSYXRpbyh0KTtlbHNlIHMudFtzLnBdPWUrcy54czA7cz1zLl9uZXh0fWVsc2UgZm9yKDtzOykyIT09cy50eXBlP3MudFtzLnBdPXMuYjpzLnNldFJhdGlvKHQpLHM9cy5fbmV4dDtlbHNlIGZvcig7czspe2lmKDIhPT1zLnR5cGUpaWYocy5yJiYtMSE9PXMudHlwZSlpZihlPXMucihzLnMrcy5jKSxzLnR5cGUpe2lmKDE9PT1zLnR5cGUpe2ZvcihyPXMubCxpPXMueHMwK2Urcy54czEscj0xO3I8cy5sO3IrKylpKz1zWyJ4biIrcl0rc1sieHMiKyhyKzEpXTtzLnRbcy5wXT1pfX1lbHNlIHMudFtzLnBdPWUrcy54czA7ZWxzZSBzLnRbcy5wXT1zLmU7ZWxzZSBzLnNldFJhdGlvKHQpO3M9cy5fbmV4dH19LGwuX2VuYWJsZVRyYW5zZm9ybXM9ZnVuY3Rpb24odCl7dGhpcy5fdHJhbnNmb3JtPXRoaXMuX3RyYW5zZm9ybXx8anQodGhpcy5fdGFyZ2V0LGksITApLHRoaXMuX3RyYW5zZm9ybVR5cGU9dGhpcy5fdHJhbnNmb3JtLnN2ZyYmU3R8fCF0JiYzIT09dGhpcy5fdHJhbnNmb3JtVHlwZT8yOjN9O3ZhciBIdD1mdW5jdGlvbih0KXt0aGlzLnRbdGhpcy5wXT10aGlzLmUsdGhpcy5kYXRhLl9saW5rQ1NTUCh0aGlzLHRoaXMuX25leHQsbnVsbCwhMCl9O2wuX2FkZExhenlTZXQ9ZnVuY3Rpb24odCxlLGkpe3ZhciByPXRoaXMuX2ZpcnN0UFQ9bmV3IHZ0KHQsZSwwLDAsdGhpcy5fZmlyc3RQVCwyKTtyLmU9aSxyLnNldFJhdGlvPUh0LHIuZGF0YT10aGlzfSxsLl9saW5rQ1NTUD1mdW5jdGlvbih0LGUsaSxyKXtyZXR1cm4gdCYmKGUmJihlLl9wcmV2PXQpLHQuX25leHQmJih0Ll9uZXh0Ll9wcmV2PXQuX3ByZXYpLHQuX3ByZXY/dC5fcHJldi5fbmV4dD10Ll9uZXh0OnRoaXMuX2ZpcnN0UFQ9PT10JiYodGhpcy5fZmlyc3RQVD10Ll9uZXh0LHI9ITApLGk/aS5fbmV4dD10OnJ8fG51bGwhPT10aGlzLl9maXJzdFBUfHwodGhpcy5fZmlyc3RQVD10KSx0Ll9uZXh0PWUsdC5fcHJldj1pKSx0fSxsLl9tb2Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2ZpcnN0UFQ7ZTspImZ1bmN0aW9uIj09dHlwZW9mIHRbZS5wXSYmKGUucj10W2UucF0pLGU9ZS5fbmV4dH0sbC5fa2lsbD1mdW5jdGlvbih0KXt2YXIgZSxpLHMsbj10O2lmKHQuYXV0b0FscGhhfHx0LmFscGhhKXtmb3IoaSBpbiBuPXt9LHQpbltpXT10W2ldO24ub3BhY2l0eT0xLG4uYXV0b0FscGhhJiYobi52aXNpYmlsaXR5PTEpfWZvcih0LmNsYXNzTmFtZSYmKGU9dGhpcy5fY2xhc3NOYW1lUFQpJiYoKHM9ZS54Zmlyc3QpJiZzLl9wcmV2P3RoaXMuX2xpbmtDU1NQKHMuX3ByZXYsZS5fbmV4dCxzLl9wcmV2Ll9wcmV2KTpzPT09dGhpcy5fZmlyc3RQVCYmKHRoaXMuX2ZpcnN0UFQ9ZS5fbmV4dCksZS5fbmV4dCYmdGhpcy5fbGlua0NTU1AoZS5fbmV4dCxlLl9uZXh0Ll9uZXh0LHMuX3ByZXYpLHRoaXMuX2NsYXNzTmFtZVBUPW51bGwpLGU9dGhpcy5fZmlyc3RQVDtlOyllLnBsdWdpbiYmZS5wbHVnaW4hPT1pJiZlLnBsdWdpbi5fa2lsbCYmKGUucGx1Z2luLl9raWxsKHQpLGk9ZS5wbHVnaW4pLGU9ZS5fbmV4dDtyZXR1cm4gci5qLnByb3RvdHlwZS5fa2lsbC5jYWxsKHRoaXMsbil9O3ZhciBadD1mdW5jdGlvbih0LGUsaSl7dmFyIHIscyxuLGE7aWYodC5zbGljZSlmb3Iocz10Lmxlbmd0aDstLXM+LTE7KVp0KHRbc10sZSxpKTtlbHNlIGZvcihzPShyPXQuY2hpbGROb2RlcykubGVuZ3RoOy0tcz4tMTspYT0obj1yW3NdKS50eXBlLG4uc3R5bGUmJihlLnB1c2goZXQobikpLGkmJmkucHVzaChuKSksMSE9PWEmJjkhPT1hJiYxMSE9PWF8fCFuLmNoaWxkTm9kZXMubGVuZ3RofHxadChuLGUsaSl9O3JldHVybiBuLmNhc2NhZGVUbz1mdW5jdGlvbih0LGUsaSl7dmFyIHMsbixhLG8sbD1yLmwudG8odCxlLGkpLGg9W2xdLHU9W10sXz1bXSxjPVtdLGY9ci5sLl9pbnRlcm5hbHMucmVzZXJ2ZWRQcm9wcztmb3IodD1sLl90YXJnZXRzfHxsLnRhcmdldCxadCh0LHUsYyksbC5yZW5kZXIoZSwhMCwhMCksWnQodCxfKSxsLnJlbmRlcigwLCEwLCEwKSxsLl9lbmFibGVkKCEwKSxzPWMubGVuZ3RoOy0tcz4tMTspaWYoKG49aXQoY1tzXSx1W3NdLF9bc10pKS5maXJzdE1QVCl7Zm9yKGEgaW4gbj1uLmRpZnMsaSlmW2FdJiYoblthXT1pW2FdKTtmb3IoYSBpbiBvPXt9LG4pb1thXT11W3NdW2FdO2gucHVzaChyLmwuZnJvbVRvKGNbc10sZSxvLG4pKX1yZXR1cm4gaH0sci5qLmFjdGl2YXRlKFtuXSksbn0sITApO3ZhciBvPXIubS5DU1NQbHVnaW4sbD1yLmsuX2dzRGVmaW5lLnBsdWdpbih7cHJvcE5hbWU6ImF0dHIiLEFQSToyLHZlcnNpb246IjAuNi4xIixpbml0OmZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBzLG47aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQuc2V0QXR0cmlidXRlKXJldHVybiExO2ZvcihzIGluIGUpImZ1bmN0aW9uIj09dHlwZW9mKG49ZVtzXSkmJihuPW4ocix0KSksdGhpcy5fYWRkVHdlZW4odCwic2V0QXR0cmlidXRlIix0LmdldEF0dHJpYnV0ZShzKSsiIixuKyIiLHMsITEscyksdGhpcy5fb3ZlcndyaXRlUHJvcHMucHVzaChzKTtyZXR1cm4hMH19KSxoPXIuay5fZ3NEZWZpbmUucGx1Z2luKHtwcm9wTmFtZToicm91bmRQcm9wcyIsdmVyc2lvbjoiMS43LjAiLHByaW9yaXR5Oi0xLEFQSToyLGluaXQ6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLl90d2Vlbj1pLCEwfX0pLHU9ZnVuY3Rpb24odCl7dmFyIGU9dDwxP01hdGgucG93KDEwLCh0KyIiKS5sZW5ndGgtMik6MTtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuKE1hdGgucm91bmQoaS90KSp0KmV8MCkvZX19LF89ZnVuY3Rpb24odCxlKXtmb3IoO3Q7KXQuZnx8dC5ibG9ifHwodC5tPWV8fE1hdGgucm91bmQpLHQ9dC5fbmV4dH0sYz1oLnByb3RvdHlwZTsNCi8qIQ0KICogVkVSU0lPTjogMC42LjENCiAqIERBVEU6IDIwMTgtMDgtMjcNCiAqIFVQREFURVMgQU5EIERPQ1MgQVQ6IGh0dHA6Ly9ncmVlbnNvY2suY29tDQogKg0KICogQGxpY2Vuc2UgQ29weXJpZ2h0IChjKSAyMDA4LTIwMTgsIEdyZWVuU29jay4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAqIFRoaXMgd29yayBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhdCBodHRwOi8vZ3JlZW5zb2NrLmNvbS9zdGFuZGFyZC1saWNlbnNlIG9yIGZvcg0KICogQ2x1YiBHcmVlblNvY2sgbWVtYmVycywgdGhlIHNvZnR3YXJlIGFncmVlbWVudCB0aGF0IHdhcyBpc3N1ZWQgd2l0aCB5b3VyIG1lbWJlcnNoaXAuDQogKiANCiAqIEBhdXRob3I6IEphY2sgRG95bGUsIGphY2tAZ3JlZW5zb2NrLmNvbQ0KICovYy5fb25Jbml0QWxsUHJvcHM9ZnVuY3Rpb24oKXt2YXIgdCxlLGkscixzPXRoaXMuX3R3ZWVuLG49cy52YXJzLnJvdW5kUHJvcHMsYT17fSxvPXMuX3Byb3BMb29rdXAucm91bmRQcm9wcztpZigib2JqZWN0IiE9dHlwZW9mIG58fG4ucHVzaClmb3IoInN0cmluZyI9PXR5cGVvZiBuJiYobj1uLnNwbGl0KCIsIikpLGk9bi5sZW5ndGg7LS1pPi0xOylhW25baV1dPU1hdGgucm91bmQ7ZWxzZSBmb3IociBpbiBuKWFbcl09dShuW3JdKTtmb3IociBpbiBhKWZvcih0PXMuX2ZpcnN0UFQ7dDspZT10Ll9uZXh0LHQucGc/dC50Ll9tb2QoYSk6dC5uPT09ciYmKDI9PT10LmYmJnQudD9fKHQudC5fZmlyc3RQVCxhW3JdKToodGhpcy5fYWRkKHQudCxyLHQucyx0LmMsYVtyXSksZSYmKGUuX3ByZXY9dC5fcHJldiksdC5fcHJldj90Ll9wcmV2Ll9uZXh0PWU6cy5fZmlyc3RQVD09PXQmJihzLl9maXJzdFBUPWUpLHQuX25leHQ9dC5fcHJldj1udWxsLHMuX3Byb3BMb29rdXBbcl09bykpLHQ9ZTtyZXR1cm4hMX0sYy5fYWRkPWZ1bmN0aW9uKHQsZSxpLHIscyl7dGhpcy5fYWRkVHdlZW4odCxlLGksaStyLGUsc3x8TWF0aC5yb3VuZCksdGhpcy5fb3ZlcndyaXRlUHJvcHMucHVzaChlKX07DQovKiENCiAqIFZFUlNJT046IDAuMy4xDQogKiBEQVRFOiAyMDE4LTA4LTI3DQogKiBVUERBVEVTIEFORCBET0NTIEFUOiBodHRwOi8vZ3JlZW5zb2NrLmNvbQ0KICoNCiAqIEBsaWNlbnNlIENvcHlyaWdodCAoYykgMjAwOC0yMDE4LCBHcmVlblNvY2suIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKiBUaGlzIHdvcmsgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYXQgaHR0cDovL2dyZWVuc29jay5jb20vc3RhbmRhcmQtbGljZW5zZSBvciBmb3INCiAqIENsdWIgR3JlZW5Tb2NrIG1lbWJlcnMsIHRoZSBzb2Z0d2FyZSBhZ3JlZW1lbnQgdGhhdCB3YXMgaXNzdWVkIHdpdGggeW91ciBtZW1iZXJzaGlwLg0KICogDQogKiBAYXV0aG9yOiBKYWNrIERveWxlLCBqYWNrQGdyZWVuc29jay5jb20NCiAqKi8NCnZhciBmPXIuay5fZ3NEZWZpbmUucGx1Z2luKHtwcm9wTmFtZToiZGlyZWN0aW9uYWxSb3RhdGlvbiIsdmVyc2lvbjoiMC4zLjEiLEFQSToyLGluaXQ6ZnVuY3Rpb24odCxlLGkscil7Im9iamVjdCIhPXR5cGVvZiBlJiYoZT17cm90YXRpb246ZX0pLHRoaXMuZmluYWxzPXt9O3ZhciBzLG4sYSxvLGwsaCx1PSEwPT09ZS51c2VSYWRpYW5zPzIqTWF0aC5QSTozNjA7Zm9yKHMgaW4gZSkidXNlUmFkaWFucyIhPT1zJiYoImZ1bmN0aW9uIj09dHlwZW9mKG89ZVtzXSkmJihvPW8ocix0KSksbj0oaD0obysiIikuc3BsaXQoIl8iKSlbMF0sYT1wYXJzZUZsb2F0KCJmdW5jdGlvbiIhPXR5cGVvZiB0W3NdP3Rbc106dFtzLmluZGV4T2YoInNldCIpfHwiZnVuY3Rpb24iIT10eXBlb2YgdFsiZ2V0IitzLnN1YnN0cigzKV0/czoiZ2V0IitzLnN1YnN0cigzKV0oKSksbD0obz10aGlzLmZpbmFsc1tzXT0ic3RyaW5nIj09dHlwZW9mIG4mJiI9Ij09PW4uY2hhckF0KDEpP2ErcGFyc2VJbnQobi5jaGFyQXQoMCkrIjEiLDEwKSpOdW1iZXIobi5zdWJzdHIoMikpOk51bWJlcihuKXx8MCktYSxoLmxlbmd0aCYmKC0xIT09KG49aC5qb2luKCJfIikpLmluZGV4T2YoInNob3J0IikmJihsJT11KSE9PWwlKHUvMikmJihsPWw8MD9sK3U6bC11KSwtMSE9PW4uaW5kZXhPZigiX2N3IikmJmw8MD9sPShsKzk5OTk5OTk5OTkqdSkldS0obC91fDApKnU6LTEhPT1uLmluZGV4T2YoImNjdyIpJiZsPjAmJihsPShsLTk5OTk5OTk5OTkqdSkldS0obC91fDApKnUpKSwobD4xZS02fHxsPC0xZS02KSYmKHRoaXMuX2FkZFR3ZWVuKHQscyxhLGErbCxzKSx0aGlzLl9vdmVyd3JpdGVQcm9wcy5wdXNoKHMpKSk7cmV0dXJuITB9LHNldDpmdW5jdGlvbih0KXt2YXIgZTtpZigxIT09dCl0aGlzLl9zdXBlci5zZXRSYXRpby5jYWxsKHRoaXMsdCk7ZWxzZSBmb3IoZT10aGlzLl9maXJzdFBUO2U7KWUuZj9lLnRbZS5wXSh0aGlzLmZpbmFsc1tlLnBdKTplLnRbZS5wXT10aGlzLmZpbmFsc1tlLnBdLGU9ZS5fbmV4dH19KTtmLl9hdXRvQ1NTPSEwOw0KLyohDQogKiBWRVJTSU9OOiAxLjMuOA0KICogREFURTogMjAxOC0wNS0zMA0KICogVVBEQVRFUyBBTkQgRE9DUyBBVDogaHR0cDovL2dyZWVuc29jay5jb20NCiAqDQogKiBAbGljZW5zZSBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCwgR3JlZW5Tb2NrLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICogVGhpcyB3b3JrIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGF0IGh0dHA6Ly9ncmVlbnNvY2suY29tL3N0YW5kYXJkLWxpY2Vuc2Ugb3IgZm9yDQogKiBDbHViIEdyZWVuU29jayBtZW1iZXJzLCB0aGUgc29mdHdhcmUgYWdyZWVtZW50IHRoYXQgd2FzIGlzc3VlZCB3aXRoIHlvdXIgbWVtYmVyc2hpcC4NCiAqIA0KICogQGF1dGhvcjogSmFjayBEb3lsZSwgamFja0BncmVlbnNvY2suY29tDQogKiovDQp2YXIgcD0xODAvTWF0aC5QSSxkPVtdLG09W10sZz1bXSx2PXt9LHk9ci5rLl9nc0RlZmluZS5nbG9iYWxzLFQ9ZnVuY3Rpb24odCxlLGkscil7aT09PXImJihpPXItKHItZSkvMWU2KSx0PT09ZSYmKGU9dCsoaS10KS8xZTYpLHRoaXMuYT10LHRoaXMuYj1lLHRoaXMuYz1pLHRoaXMuZD1yLHRoaXMuZGE9ci10LHRoaXMuY2E9aS10LHRoaXMuYmE9ZS10fSx3PWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBzPXthOnR9LG49e30sYT17fSxvPXtjOnJ9LGw9KHQrZSkvMixoPShlK2kpLzIsdT0oaStyKS8yLF89KGwraCkvMixjPShoK3UpLzIsZj0oYy1fKS84O3JldHVybiBzLmI9bCsodC1sKS80LG4uYj1fK2Yscy5jPW4uYT0ocy5iK24uYikvMixuLmM9YS5hPShfK2MpLzIsYS5iPWMtZixvLmI9dSsoci11KS80LGEuYz1vLmE9KGEuYitvLmIpLzIsW3MsbixhLG9dfSx4PWZ1bmN0aW9uKHQsZSxpLHIscyl7dmFyIG4sYSxvLGwsaCx1LF8sYyxmLHAsdix5LFQseD10Lmxlbmd0aC0xLGI9MCxQPXRbMF0uYTtmb3Iobj0wO248eDtuKyspYT0oaD10W2JdKS5hLG89aC5kLGw9dFtiKzFdLmQscz8odj1kW25dLFQ9KCh5PW1bbl0pK3YpKmUqLjI1LyhyPy41Omdbbl18fC41KSxjPW8tKCh1PW8tKG8tYSkqKHI/LjUqZTowIT09dj9UL3Y6MCkpKygoKF89bysobC1vKSoocj8uNSplOjAhPT15P1QveTowKSktdSkqKDMqdi8odit5KSsuNSkvNHx8MCkpKTpjPW8tKCh1PW8tKG8tYSkqZSouNSkrKF89bysobC1vKSplKi41KSkvMix1Kz1jLF8rPWMsaC5jPWY9dSxoLmI9MCE9PW4/UDpQPWguYSsuNiooaC5jLWguYSksaC5kYT1vLWEsaC5jYT1mLWEsaC5iYT1QLWEsaT8ocD13KGEsUCxmLG8pLHQuc3BsaWNlKGIsMSxwWzBdLHBbMV0scFsyXSxwWzNdKSxiKz00KTpiKyssUD1fOyhoPXRbYl0pLmI9UCxoLmM9UCsuNCooaC5kLVApLGguZGE9aC5kLWguYSxoLmNhPWguYy1oLmEsaC5iYT1QLWguYSxpJiYocD13KGguYSxQLGguYyxoLmQpLHQuc3BsaWNlKGIsMSxwWzBdLHBbMV0scFsyXSxwWzNdKSl9LGI9ZnVuY3Rpb24odCxlLGkscil7dmFyIHMsbixhLG8sbCxoLHU9W107aWYocilmb3Iobj0odD1bcl0uY29uY2F0KHQpKS5sZW5ndGg7LS1uPi0xOykic3RyaW5nIj09dHlwZW9mKGg9dFtuXVtlXSkmJiI9Ij09PWguY2hhckF0KDEpJiYodFtuXVtlXT1yW2VdK051bWJlcihoLmNoYXJBdCgwKStoLnN1YnN0cigyKSkpO2lmKChzPXQubGVuZ3RoLTIpPDApcmV0dXJuIHVbMF09bmV3IFQodFswXVtlXSwwLDAsdFswXVtlXSksdTtmb3Iobj0wO248cztuKyspYT10W25dW2VdLG89dFtuKzFdW2VdLHVbbl09bmV3IFQoYSwwLDAsbyksaSYmKGw9dFtuKzJdW2VdLGRbbl09KGRbbl18fDApKyhvLWEpKihvLWEpLG1bbl09KG1bbl18fDApKyhsLW8pKihsLW8pKTtyZXR1cm4gdVtuXT1uZXcgVCh0W25dW2VdLDAsMCx0W24rMV1bZV0pLHV9LFA9ZnVuY3Rpb24odCxlLGkscixzLG4pe3ZhciBhLG8sbCxoLHUsXyxjLGYscD17fSx5PVtdLFQ9bnx8dFswXTtmb3IobyBpbiBzPSJzdHJpbmciPT10eXBlb2Ygcz8iLCIrcysiLCI6Iix4LHkseixsZWZ0LHRvcCxyaWdodCxib3R0b20sbWFyZ2luVG9wLG1hcmdpbkxlZnQsbWFyZ2luUmlnaHQsbWFyZ2luQm90dG9tLHBhZGRpbmdMZWZ0LHBhZGRpbmdUb3AscGFkZGluZ1JpZ2h0LHBhZGRpbmdCb3R0b20sYmFja2dyb3VuZFBvc2l0aW9uLGJhY2tncm91bmRQb3NpdGlvbl95LCIsbnVsbD09ZSYmKGU9MSksdFswXSl5LnB1c2gobyk7aWYodC5sZW5ndGg+MSl7Zm9yKGY9dFt0Lmxlbmd0aC0xXSxjPSEwLGE9eS5sZW5ndGg7LS1hPi0xOylpZihvPXlbYV0sTWF0aC5hYnMoVFtvXS1mW29dKT4uMDUpe2M9ITE7YnJlYWt9YyYmKHQ9dC5jb25jYXQoKSxuJiZ0LnVuc2hpZnQobiksdC5wdXNoKHRbMV0pLG49dFt0Lmxlbmd0aC0zXSl9Zm9yKGQubGVuZ3RoPW0ubGVuZ3RoPWcubGVuZ3RoPTAsYT15Lmxlbmd0aDstLWE+LTE7KW89eVthXSx2W29dPS0xIT09cy5pbmRleE9mKCIsIitvKyIsIikscFtvXT1iKHQsbyx2W29dLG4pO2ZvcihhPWQubGVuZ3RoOy0tYT4tMTspZFthXT1NYXRoLnNxcnQoZFthXSksbVthXT1NYXRoLnNxcnQobVthXSk7aWYoIXIpe2ZvcihhPXkubGVuZ3RoOy0tYT4tMTspaWYodltvXSlmb3IoXz0obD1wW3lbYV1dKS5sZW5ndGgtMSxoPTA7aDxfO2grKyl1PWxbaCsxXS5kYS9tW2hdK2xbaF0uZGEvZFtoXXx8MCxnW2hdPShnW2hdfHwwKSt1KnU7Zm9yKGE9Zy5sZW5ndGg7LS1hPi0xOylnW2FdPU1hdGguc3FydChnW2FdKX1mb3IoYT15Lmxlbmd0aCxoPWk/NDoxOy0tYT4tMTspbD1wW289eVthXV0seChsLGUsaSxyLHZbb10pLGMmJihsLnNwbGljZSgwLGgpLGwuc3BsaWNlKGwubGVuZ3RoLWgsaCkpO3JldHVybiBwfSxTPWZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIHIscyxuLGEsbyxsLGgsdSxfLGMsZixwPTEvaSxkPXQubGVuZ3RoOy0tZD4tMTspZm9yKG49KGM9dFtkXSkuYSxhPWMuZC1uLG89Yy5jLW4sbD1jLmItbixyPXM9MCx1PTE7dTw9aTt1Kyspcj1zLShzPSgoaD1wKnUpKmgqYSszKihfPTEtaCkqKGgqbytfKmwpKSpoKSxlW2Y9ZCppK3UtMV09KGVbZl18fDApK3Iqcn0saz1yLmsuX2dzRGVmaW5lLnBsdWdpbih7cHJvcE5hbWU6ImJlemllciIscHJpb3JpdHk6LTEsdmVyc2lvbjoiMS4zLjgiLEFQSToyLGdsb2JhbDohMCxpbml0OmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl90YXJnZXQ9dCxlIGluc3RhbmNlb2YgQXJyYXkmJihlPXt2YWx1ZXM6ZX0pLHRoaXMuX2Z1bmM9e30sdGhpcy5fbW9kPXt9LHRoaXMuX3Byb3BzPVtdLHRoaXMuX3RpbWVSZXM9bnVsbD09ZS50aW1lUmVzb2x1dGlvbj82OnBhcnNlSW50KGUudGltZVJlc29sdXRpb24sMTApO3ZhciByLHMsbixhLG8sbD1lLnZhbHVlc3x8W10saD17fSx1PWxbMF0sXz1lLmF1dG9Sb3RhdGV8fGkudmFycy5vcmllbnRUb0Jlemllcjtmb3IociBpbiB0aGlzLl9hdXRvUm90YXRlPV8/XyBpbnN0YW5jZW9mIEFycmF5P186W1sieCIsInkiLCJyb3RhdGlvbiIsITA9PT1fPzA6TnVtYmVyKF8pfHwwXV06bnVsbCx1KXRoaXMuX3Byb3BzLnB1c2gocik7Zm9yKG49dGhpcy5fcHJvcHMubGVuZ3RoOy0tbj4tMTspcj10aGlzLl9wcm9wc1tuXSx0aGlzLl9vdmVyd3JpdGVQcm9wcy5wdXNoKHIpLHM9dGhpcy5fZnVuY1tyXT0iZnVuY3Rpb24iPT10eXBlb2YgdFtyXSxoW3JdPXM/dFtyLmluZGV4T2YoInNldCIpfHwiZnVuY3Rpb24iIT10eXBlb2YgdFsiZ2V0IityLnN1YnN0cigzKV0/cjoiZ2V0IityLnN1YnN0cigzKV0oKTpwYXJzZUZsb2F0KHRbcl0pLG98fGhbcl0hPT1sWzBdW3JdJiYobz1oKTtpZih0aGlzLl9iZXppZXJzPSJjdWJpYyIhPT1lLnR5cGUmJiJxdWFkcmF0aWMiIT09ZS50eXBlJiYic29mdCIhPT1lLnR5cGU/UChsLGlzTmFOKGUuY3VydmluZXNzKT8xOmUuY3VydmluZXNzLCExLCJ0aHJ1QmFzaWMiPT09ZS50eXBlLGUuY29ycmVsYXRlLG8pOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcixzLG4sYSxvLGwsaCx1LF8sYyxmLHA9e30sZD0iY3ViaWMiPT09KGU9ZXx8InNvZnQiKT8zOjIsbT0ic29mdCI9PT1lLGc9W107aWYobSYmaSYmKHQ9W2ldLmNvbmNhdCh0KSksbnVsbD09dHx8dC5sZW5ndGg8ZCsxKXRocm93ImludmFsaWQgQmV6aWVyIGRhdGEiO2ZvcihfIGluIHRbMF0pZy5wdXNoKF8pO2ZvcihsPWcubGVuZ3RoOy0tbD4tMTspe2ZvcihwW189Z1tsXV09bz1bXSxjPTAsdT10Lmxlbmd0aCxoPTA7aDx1O2grKylyPW51bGw9PWk/dFtoXVtfXToic3RyaW5nIj09dHlwZW9mKGY9dFtoXVtfXSkmJiI9Ij09PWYuY2hhckF0KDEpP2lbX10rTnVtYmVyKGYuY2hhckF0KDApK2Yuc3Vic3RyKDIpKTpOdW1iZXIoZiksbSYmaD4xJiZoPHUtMSYmKG9bYysrXT0ocitvW2MtMl0pLzIpLG9bYysrXT1yO2Zvcih1PWMtZCsxLGM9MCxoPTA7aDx1O2grPWQpcj1vW2hdLHM9b1toKzFdLG49b1toKzJdLGE9Mj09PWQ/MDpvW2grM10sb1tjKytdPWY9Mz09PWQ/bmV3IFQocixzLG4sYSk6bmV3IFQociwoMipzK3IpLzMsKDIqcytuKS8zLG4pO28ubGVuZ3RoPWN9cmV0dXJuIHB9KGwsZS50eXBlLGgpLHRoaXMuX3NlZ0NvdW50PXRoaXMuX2JlemllcnNbcl0ubGVuZ3RoLHRoaXMuX3RpbWVSZXMpe3ZhciBjPWZ1bmN0aW9uKHQsZSl7dmFyIGkscixzLG4sYT1bXSxvPVtdLGw9MCxoPTAsdT0oZT1lPj4wfHw2KS0xLF89W10sYz1bXTtmb3IoaSBpbiB0KVModFtpXSxhLGUpO2ZvcihzPWEubGVuZ3RoLHI9MDtyPHM7cisrKWwrPU1hdGguc3FydChhW3JdKSxjW249ciVlXT1sLG49PT11JiYoaCs9bCxfW249ci9lPj4wXT1jLG9bbl09aCxsPTAsYz1bXSk7cmV0dXJue2xlbmd0aDpoLGxlbmd0aHM6byxzZWdtZW50czpffX0odGhpcy5fYmV6aWVycyx0aGlzLl90aW1lUmVzKTt0aGlzLl9sZW5ndGg9Yy5sZW5ndGgsdGhpcy5fbGVuZ3Rocz1jLmxlbmd0aHMsdGhpcy5fc2VnbWVudHM9Yy5zZWdtZW50cyx0aGlzLl9sMT10aGlzLl9saT10aGlzLl9zMT10aGlzLl9zaT0wLHRoaXMuX2wyPXRoaXMuX2xlbmd0aHNbMF0sdGhpcy5fY3VyU2VnPXRoaXMuX3NlZ21lbnRzWzBdLHRoaXMuX3MyPXRoaXMuX2N1clNlZ1swXSx0aGlzLl9wcmVjPTEvdGhpcy5fY3VyU2VnLmxlbmd0aH1pZihfPXRoaXMuX2F1dG9Sb3RhdGUpZm9yKHRoaXMuX2luaXRpYWxSb3RhdGlvbnM9W10sX1swXWluc3RhbmNlb2YgQXJyYXl8fCh0aGlzLl9hdXRvUm90YXRlPV89W19dKSxuPV8ubGVuZ3RoOy0tbj4tMTspe2ZvcihhPTA7YTwzO2ErKylyPV9bbl1bYV0sdGhpcy5fZnVuY1tyXT0iZnVuY3Rpb24iPT10eXBlb2YgdFtyXSYmdFtyLmluZGV4T2YoInNldCIpfHwiZnVuY3Rpb24iIT10eXBlb2YgdFsiZ2V0IityLnN1YnN0cigzKV0/cjoiZ2V0IityLnN1YnN0cigzKV07cj1fW25dWzJdLHRoaXMuX2luaXRpYWxSb3RhdGlvbnNbbl09KHRoaXMuX2Z1bmNbcl0/dGhpcy5fZnVuY1tyXS5jYWxsKHRoaXMuX3RhcmdldCk6dGhpcy5fdGFyZ2V0W3JdKXx8MCx0aGlzLl9vdmVyd3JpdGVQcm9wcy5wdXNoKHIpfXJldHVybiB0aGlzLl9zdGFydFJhdGlvPWkudmFycy5ydW5CYWNrd2FyZHM/MTowLCEwfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGUsaSxyLHMsbixhLG8sbCxoLHUsXz10aGlzLl9zZWdDb3VudCxjPXRoaXMuX2Z1bmMsZj10aGlzLl90YXJnZXQsZD10IT09dGhpcy5fc3RhcnRSYXRpbztpZih0aGlzLl90aW1lUmVzKXtpZihoPXRoaXMuX2xlbmd0aHMsdT10aGlzLl9jdXJTZWcsdCo9dGhpcy5fbGVuZ3RoLHI9dGhpcy5fbGksdD50aGlzLl9sMiYmcjxfLTEpe2ZvcihsPV8tMTtyPGwmJih0aGlzLl9sMj1oWysrcl0pPD10Oyk7dGhpcy5fbDE9aFtyLTFdLHRoaXMuX2xpPXIsdGhpcy5fY3VyU2VnPXU9dGhpcy5fc2VnbWVudHNbcl0sdGhpcy5fczI9dVt0aGlzLl9zMT10aGlzLl9zaT0wXX1lbHNlIGlmKHQ8dGhpcy5fbDEmJnI+MCl7Zm9yKDtyPjAmJih0aGlzLl9sMT1oWy0tcl0pPj10Oyk7MD09PXImJnQ8dGhpcy5fbDE/dGhpcy5fbDE9MDpyKyssdGhpcy5fbDI9aFtyXSx0aGlzLl9saT1yLHRoaXMuX2N1clNlZz11PXRoaXMuX3NlZ21lbnRzW3JdLHRoaXMuX3MxPXVbKHRoaXMuX3NpPXUubGVuZ3RoLTEpLTFdfHwwLHRoaXMuX3MyPXVbdGhpcy5fc2ldfWlmKGU9cix0LT10aGlzLl9sMSxyPXRoaXMuX3NpLHQ+dGhpcy5fczImJnI8dS5sZW5ndGgtMSl7Zm9yKGw9dS5sZW5ndGgtMTtyPGwmJih0aGlzLl9zMj11Wysrcl0pPD10Oyk7dGhpcy5fczE9dVtyLTFdLHRoaXMuX3NpPXJ9ZWxzZSBpZih0PHRoaXMuX3MxJiZyPjApe2Zvcig7cj4wJiYodGhpcy5fczE9dVstLXJdKT49dDspOzA9PT1yJiZ0PHRoaXMuX3MxP3RoaXMuX3MxPTA6cisrLHRoaXMuX3MyPXVbcl0sdGhpcy5fc2k9cn1hPShyKyh0LXRoaXMuX3MxKS8odGhpcy5fczItdGhpcy5fczEpKSp0aGlzLl9wcmVjfHwwfWVsc2UgYT0odC0oZT10PDA/MDp0Pj0xP18tMTpfKnQ+PjApKigxL18pKSpfO2ZvcihpPTEtYSxyPXRoaXMuX3Byb3BzLmxlbmd0aDstLXI+LTE7KXM9dGhpcy5fcHJvcHNbcl0sbz0oYSphKihuPXRoaXMuX2JlemllcnNbc11bZV0pLmRhKzMqaSooYSpuLmNhK2kqbi5iYSkpKmErbi5hLHRoaXMuX21vZFtzXSYmKG89dGhpcy5fbW9kW3NdKG8sZikpLGNbc10/ZltzXShvKTpmW3NdPW87aWYodGhpcy5fYXV0b1JvdGF0ZSl7dmFyIG0sZyx2LHksVCx3LHgsYj10aGlzLl9hdXRvUm90YXRlO2ZvcihyPWIubGVuZ3RoOy0tcj4tMTspcz1iW3JdWzJdLHc9YltyXVszXXx8MCx4PSEwPT09YltyXVs0XT8xOnAsbj10aGlzLl9iZXppZXJzW2Jbcl1bMF1dLG09dGhpcy5fYmV6aWVyc1tiW3JdWzFdXSxuJiZtJiYobj1uW2VdLG09bVtlXSxnPW4uYSsobi5iLW4uYSkqYSxnKz0oKHk9bi5iKyhuLmMtbi5iKSphKS1nKSphLHkrPShuLmMrKG4uZC1uLmMpKmEteSkqYSx2PW0uYSsobS5iLW0uYSkqYSx2Kz0oKFQ9bS5iKyhtLmMtbS5iKSphKS12KSphLFQrPShtLmMrKG0uZC1tLmMpKmEtVCkqYSxvPWQ/TWF0aC5hdGFuMihULXYseS1nKSp4K3c6dGhpcy5faW5pdGlhbFJvdGF0aW9uc1tyXSx0aGlzLl9tb2Rbc10mJihvPXRoaXMuX21vZFtzXShvLGYpKSxjW3NdP2Zbc10obyk6ZltzXT1vKX19fSksUj1rLnByb3RvdHlwZTtrLmJlemllclRocm91Z2g9UCxrLmN1YmljVG9RdWFkcmF0aWM9dyxrLl9hdXRvQ1NTPSEwLGsucXVhZHJhdGljVG9DdWJpYz1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIG5ldyBUKHQsKDIqZSt0KS8zLCgyKmUraSkvMyxpKX0say5fY3NzUmVnaXN0ZXI9ZnVuY3Rpb24oKXt2YXIgdD15LkNTU1BsdWdpbjtpZih0KXt2YXIgZT10Ll9pbnRlcm5hbHMsaT1lLl9wYXJzZVRvUHJveHkscj1lLl9zZXRQbHVnaW5SYXRpbyxzPWUuQ1NTUHJvcFR3ZWVuO2UuX3JlZ2lzdGVyQ29tcGxleFNwZWNpYWxQcm9wKCJiZXppZXIiLHtwYXJzZXI6ZnVuY3Rpb24odCxlLG4sYSxvLGwpe2UgaW5zdGFuY2VvZiBBcnJheSYmKGU9e3ZhbHVlczplfSksbD1uZXcgazt2YXIgaCx1LF8sYz1lLnZhbHVlcyxmPWMubGVuZ3RoLTEscD1bXSxkPXt9O2lmKGY8MClyZXR1cm4gbztmb3IoaD0wO2g8PWY7aCsrKV89aSh0LGNbaF0sYSxvLGwsZiE9PWgpLHBbaF09Xy5lbmQ7Zm9yKHUgaW4gZSlkW3VdPWVbdV07cmV0dXJuIGQudmFsdWVzPXAsKG89bmV3IHModCwiYmV6aWVyIiwwLDAsXy5wdCwyKSkuZGF0YT1fLG8ucGx1Z2luPWwsby5zZXRSYXRpbz1yLDA9PT1kLmF1dG9Sb3RhdGUmJihkLmF1dG9Sb3RhdGU9ITApLCFkLmF1dG9Sb3RhdGV8fGQuYXV0b1JvdGF0ZSBpbnN0YW5jZW9mIEFycmF5fHwoaD0hMD09PWQuYXV0b1JvdGF0ZT8wOk51bWJlcihkLmF1dG9Sb3RhdGUpLGQuYXV0b1JvdGF0ZT1udWxsIT1fLmVuZC5sZWZ0P1tbImxlZnQiLCJ0b3AiLCJyb3RhdGlvbiIsaCwhMV1dOm51bGwhPV8uZW5kLngmJltbIngiLCJ5Iiwicm90YXRpb24iLGgsITFdXSksZC5hdXRvUm90YXRlJiYoYS5fdHJhbnNmb3JtfHxhLl9lbmFibGVUcmFuc2Zvcm1zKCExKSxfLmF1dG9Sb3RhdGU9YS5fdGFyZ2V0Ll9nc1RyYW5zZm9ybSxfLnByb3h5LnJvdGF0aW9uPV8uYXV0b1JvdGF0ZS5yb3RhdGlvbnx8MCxhLl9vdmVyd3JpdGVQcm9wcy5wdXNoKCJyb3RhdGlvbiIpKSxsLl9vbkluaXRUd2VlbihfLnByb3h5LGQsYS5fdHdlZW4pLG99fSl9fSxSLl9tb2Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9dGhpcy5fb3ZlcndyaXRlUHJvcHMscj1pLmxlbmd0aDstLXI+LTE7KShlPXRbaVtyXV0pJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHRoaXMuX21vZFtpW3JdXT1lKX0sUi5fa2lsbD1mdW5jdGlvbih0KXt2YXIgZSxpLHI9dGhpcy5fcHJvcHM7Zm9yKGUgaW4gdGhpcy5fYmV6aWVycylpZihlIGluIHQpZm9yKGRlbGV0ZSB0aGlzLl9iZXppZXJzW2VdLGRlbGV0ZSB0aGlzLl9mdW5jW2VdLGk9ci5sZW5ndGg7LS1pPi0xOylyW2ldPT09ZSYmci5zcGxpY2UoaSwxKTtpZihyPXRoaXMuX2F1dG9Sb3RhdGUpZm9yKGk9ci5sZW5ndGg7LS1pPi0xOyl0W3JbaV1bMl1dJiZyLnNwbGljZShpLDEpO3JldHVybiB0aGlzLl9zdXBlci5fa2lsbC5jYWxsKHRoaXMsdCl9LA0KLyohDQogKiBWRVJTSU9OOiAxLjE2LjENCiAqIERBVEU6IDIwMTgtMDgtMjcNCiAqIFVQREFURVMgQU5EIERPQ1MgQVQ6IGh0dHA6Ly9ncmVlbnNvY2suY29tDQogKg0KICogQGxpY2Vuc2UgQ29weXJpZ2h0IChjKSAyMDA4LTIwMTgsIEdyZWVuU29jay4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAqIFRoaXMgd29yayBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhdCBodHRwOi8vZ3JlZW5zb2NrLmNvbS9zdGFuZGFyZC1saWNlbnNlIG9yIGZvcg0KICogQ2x1YiBHcmVlblNvY2sgbWVtYmVycywgdGhlIHNvZnR3YXJlIGFncmVlbWVudCB0aGF0IHdhcyBpc3N1ZWQgd2l0aCB5b3VyIG1lbWJlcnNoaXAuDQogKiANCiAqIEBhdXRob3I6IEphY2sgRG95bGUsIGphY2tAZ3JlZW5zb2NrLmNvbQ0KICoqLw0Kci5rLl9nc0RlZmluZSgiZWFzaW5nLkJhY2siLFsiZWFzaW5nLkVhc2UiXSxmdW5jdGlvbigpe3ZhciB0LGUsaSxzLG49ci5rLkdyZWVuU29ja0dsb2JhbHN8fHIuayxhPW4uY29tLmdyZWVuc29jayxvPTIqTWF0aC5QSSxsPU1hdGguUEkvMixoPWEuX2NsYXNzLHU9ZnVuY3Rpb24odCxlKXt2YXIgaT1oKCJlYXNpbmcuIit0LGZ1bmN0aW9uKCl7fSwhMCkscz1pLnByb3RvdHlwZT1uZXcgci5iO3JldHVybiBzLmNvbnN0cnVjdG9yPWkscy5nZXRSYXRpbz1lLGl9LF89ci5iLnJlZ2lzdGVyfHxmdW5jdGlvbigpe30sYz1mdW5jdGlvbih0LGUsaSxyLHMpe3ZhciBuPWgoImVhc2luZy4iK3Qse2Vhc2VPdXQ6bmV3IGUsZWFzZUluOm5ldyBpLGVhc2VJbk91dDpuZXcgcn0sITApO3JldHVybiBfKG4sdCksbn0sZj1mdW5jdGlvbih0LGUsaSl7dGhpcy50PXQsdGhpcy52PWUsaSYmKHRoaXMubmV4dD1pLGkucHJldj10aGlzLHRoaXMuYz1pLnYtZSx0aGlzLmdhcD1pLnQtdCl9LHA9ZnVuY3Rpb24odCxlKXt2YXIgaT1oKCJlYXNpbmcuIit0LGZ1bmN0aW9uKHQpe3RoaXMuX3AxPXR8fDA9PT10P3Q6MS43MDE1OCx0aGlzLl9wMj0xLjUyNSp0aGlzLl9wMX0sITApLHM9aS5wcm90b3R5cGU9bmV3IHIuYjtyZXR1cm4gcy5jb25zdHJ1Y3Rvcj1pLHMuZ2V0UmF0aW89ZSxzLmNvbmZpZz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGkodCl9LGl9LGQ9YygiQmFjayIscCgiQmFja091dCIsZnVuY3Rpb24odCl7cmV0dXJuKHQtPTEpKnQqKCh0aGlzLl9wMSsxKSp0K3RoaXMuX3AxKSsxfSkscCgiQmFja0luIixmdW5jdGlvbih0KXtyZXR1cm4gdCp0KigodGhpcy5fcDErMSkqdC10aGlzLl9wMSl9KSxwKCJCYWNrSW5PdXQiLGZ1bmN0aW9uKHQpe3JldHVybih0Kj0yKTwxPy41KnQqdCooKHRoaXMuX3AyKzEpKnQtdGhpcy5fcDIpOi41KigodC09MikqdCooKHRoaXMuX3AyKzEpKnQrdGhpcy5fcDIpKzIpfSkpLG09aCgiZWFzaW5nLlNsb3dNbyIsZnVuY3Rpb24odCxlLGkpe2U9ZXx8MD09PWU/ZTouNyxudWxsPT10P3Q9Ljc6dD4xJiYodD0xKSx0aGlzLl9wPTEhPT10P2U6MCx0aGlzLl9wMT0oMS10KS8yLHRoaXMuX3AyPXQsdGhpcy5fcDM9dGhpcy5fcDErdGhpcy5fcDIsdGhpcy5fY2FsY0VuZD0hMD09PWl9LCEwKSxnPW0ucHJvdG90eXBlPW5ldyByLmI7cmV0dXJuIGcuY29uc3RydWN0b3I9bSxnLmdldFJhdGlvPWZ1bmN0aW9uKHQpe3ZhciBlPXQrKC41LXQpKnRoaXMuX3A7cmV0dXJuIHQ8dGhpcy5fcDE/dGhpcy5fY2FsY0VuZD8xLSh0PTEtdC90aGlzLl9wMSkqdDplLSh0PTEtdC90aGlzLl9wMSkqdCp0KnQqZTp0PnRoaXMuX3AzP3RoaXMuX2NhbGNFbmQ/MT09PXQ/MDoxLSh0PSh0LXRoaXMuX3AzKS90aGlzLl9wMSkqdDplKyh0LWUpKih0PSh0LXRoaXMuX3AzKS90aGlzLl9wMSkqdCp0KnQ6dGhpcy5fY2FsY0VuZD8xOmV9LG0uZWFzZT1uZXcgbSguNywuNyksZy5jb25maWc9bS5jb25maWc9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuZXcgbSh0LGUsaSl9LChnPSh0PWgoImVhc2luZy5TdGVwcGVkRWFzZSIsZnVuY3Rpb24odCxlKXt0PXR8fDEsdGhpcy5fcDE9MS90LHRoaXMuX3AyPXQrKGU/MDoxKSx0aGlzLl9wMz1lPzE6MH0sITApKS5wcm90b3R5cGU9bmV3IHIuYikuY29uc3RydWN0b3I9dCxnLmdldFJhdGlvPWZ1bmN0aW9uKHQpe3JldHVybiB0PDA/dD0wOnQ+PTEmJih0PS45OTk5OTk5OTkpLCgodGhpcy5fcDIqdHwwKSt0aGlzLl9wMykqdGhpcy5fcDF9LGcuY29uZmlnPXQuY29uZmlnPWZ1bmN0aW9uKGUsaSl7cmV0dXJuIG5ldyB0KGUsaSl9LChnPShlPWgoImVhc2luZy5FeHBvU2NhbGVFYXNlIixmdW5jdGlvbih0LGUsaSl7dGhpcy5fcDE9TWF0aC5sb2coZS90KSx0aGlzLl9wMj1lLXQsdGhpcy5fcDM9dCx0aGlzLl9lYXNlPWl9LCEwKSkucHJvdG90eXBlPW5ldyByLmIpLmNvbnN0cnVjdG9yPWUsZy5nZXRSYXRpbz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZWFzZSYmKHQ9dGhpcy5fZWFzZS5nZXRSYXRpbyh0KSksKHRoaXMuX3AzKk1hdGguZXhwKHRoaXMuX3AxKnQpLXRoaXMuX3AzKS90aGlzLl9wMn0sZy5jb25maWc9ZS5jb25maWc9ZnVuY3Rpb24odCxpLHIpe3JldHVybiBuZXcgZSh0LGkscil9LChnPShpPWgoImVhc2luZy5Sb3VnaEVhc2UiLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpLHMsbixhLG8sbD0odD10fHx7fSkudGFwZXJ8fCJub25lIixoPVtdLHU9MCxfPTB8KHQucG9pbnRzfHwyMCksYz1fLHA9ITEhPT10LnJhbmRvbWl6ZSxkPSEwPT09dC5jbGFtcCxtPXQudGVtcGxhdGUgaW5zdGFuY2VvZiByLmI/dC50ZW1wbGF0ZTpudWxsLGc9Im51bWJlciI9PXR5cGVvZiB0LnN0cmVuZ3RoPy40KnQuc3RyZW5ndGg6LjQ7LS1jPi0xOyllPXA/TWF0aC5yYW5kb20oKToxL18qYyxpPW0/bS5nZXRSYXRpbyhlKTplLHM9Im5vbmUiPT09bD9nOiJvdXQiPT09bD8obj0xLWUpKm4qZzoiaW4iPT09bD9lKmUqZzplPC41PyhuPTIqZSkqbiouNSpnOihuPTIqKDEtZSkpKm4qLjUqZyxwP2krPU1hdGgucmFuZG9tKCkqcy0uNSpzOmMlMj9pKz0uNSpzOmktPS41KnMsZCYmKGk+MT9pPTE6aTwwJiYoaT0wKSksaFt1KytdPXt4OmUseTppfTtmb3IoaC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQueC1lLnh9KSxvPW5ldyBmKDEsMSxudWxsKSxjPV87LS1jPi0xOylhPWhbY10sbz1uZXcgZihhLngsYS55LG8pO3RoaXMuX3ByZXY9bmV3IGYoMCwwLDAhPT1vLnQ/bzpvLm5leHQpfSwhMCkpLnByb3RvdHlwZT1uZXcgci5iKS5jb25zdHJ1Y3Rvcj1pLGcuZ2V0UmF0aW89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcHJldjtpZih0PmUudCl7Zm9yKDtlLm5leHQmJnQ+PWUudDspZT1lLm5leHQ7ZT1lLnByZXZ9ZWxzZSBmb3IoO2UucHJldiYmdDw9ZS50OyllPWUucHJldjtyZXR1cm4gdGhpcy5fcHJldj1lLGUudisodC1lLnQpL2UuZ2FwKmUuY30sZy5jb25maWc9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBpKHQpfSxpLmVhc2U9bmV3IGksYygiQm91bmNlIix1KCJCb3VuY2VPdXQiLGZ1bmN0aW9uKHQpe3JldHVybiB0PDEvMi43NT83LjU2MjUqdCp0OnQ8Mi8yLjc1PzcuNTYyNSoodC09MS41LzIuNzUpKnQrLjc1OnQ8Mi41LzIuNzU/Ny41NjI1Kih0LT0yLjI1LzIuNzUpKnQrLjkzNzU6Ny41NjI1Kih0LT0yLjYyNS8yLjc1KSp0Ky45ODQzNzV9KSx1KCJCb3VuY2VJbiIsZnVuY3Rpb24odCl7cmV0dXJuKHQ9MS10KTwxLzIuNzU/MS03LjU2MjUqdCp0OnQ8Mi8yLjc1PzEtKDcuNTYyNSoodC09MS41LzIuNzUpKnQrLjc1KTp0PDIuNS8yLjc1PzEtKDcuNTYyNSoodC09Mi4yNS8yLjc1KSp0Ky45Mzc1KToxLSg3LjU2MjUqKHQtPTIuNjI1LzIuNzUpKnQrLjk4NDM3NSl9KSx1KCJCb3VuY2VJbk91dCIsZnVuY3Rpb24odCl7dmFyIGU9dDwuNTtyZXR1cm4odD1lPzEtMip0OjIqdC0xKTwxLzIuNzU/dCo9Ny41NjI1KnQ6dD10PDIvMi43NT83LjU2MjUqKHQtPTEuNS8yLjc1KSp0Ky43NTp0PDIuNS8yLjc1PzcuNTYyNSoodC09Mi4yNS8yLjc1KSp0Ky45Mzc1OjcuNTYyNSoodC09Mi42MjUvMi43NSkqdCsuOTg0Mzc1LGU/LjUqKDEtdCk6LjUqdCsuNX0pKSxjKCJDaXJjIix1KCJDaXJjT3V0IixmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KDEtKHQtPTEpKnQpfSksdSgiQ2lyY0luIixmdW5jdGlvbih0KXtyZXR1cm4tKE1hdGguc3FydCgxLXQqdCktMSl9KSx1KCJDaXJjSW5PdXQiLGZ1bmN0aW9uKHQpe3JldHVybih0Kj0yKTwxPy0uNSooTWF0aC5zcXJ0KDEtdCp0KS0xKTouNSooTWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpfSkpLGMoIkVsYXN0aWMiLChzPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcz1oKCJlYXNpbmcuIit0LGZ1bmN0aW9uKHQsZSl7dGhpcy5fcDE9dD49MT90OjEsdGhpcy5fcDI9KGV8fGkpLyh0PDE/dDoxKSx0aGlzLl9wMz10aGlzLl9wMi9vKihNYXRoLmFzaW4oMS90aGlzLl9wMSl8fDApLHRoaXMuX3AyPW8vdGhpcy5fcDJ9LCEwKSxuPXMucHJvdG90eXBlPW5ldyByLmI7cmV0dXJuIG4uY29uc3RydWN0b3I9cyxuLmdldFJhdGlvPWUsbi5jb25maWc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHModCxlKX0sc30pKCJFbGFzdGljT3V0IixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcDEqTWF0aC5wb3coMiwtMTAqdCkqTWF0aC5zaW4oKHQtdGhpcy5fcDMpKnRoaXMuX3AyKSsxfSwuMykscygiRWxhc3RpY0luIixmdW5jdGlvbih0KXtyZXR1cm4tdGhpcy5fcDEqTWF0aC5wb3coMiwxMCoodC09MSkpKk1hdGguc2luKCh0LXRoaXMuX3AzKSp0aGlzLl9wMil9LC4zKSxzKCJFbGFzdGljSW5PdXQiLGZ1bmN0aW9uKHQpe3JldHVybih0Kj0yKTwxP3RoaXMuX3AxKk1hdGgucG93KDIsMTAqKHQtPTEpKSpNYXRoLnNpbigodC10aGlzLl9wMykqdGhpcy5fcDIpKi0uNTp0aGlzLl9wMSpNYXRoLnBvdygyLC0xMCoodC09MSkpKk1hdGguc2luKCh0LXRoaXMuX3AzKSp0aGlzLl9wMikqLjUrMX0sLjQ1KSksYygiRXhwbyIsdSgiRXhwb091dCIsZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5wb3coMiwtMTAqdCl9KSx1KCJFeHBvSW4iLGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdygyLDEwKih0LTEpKS0uMDAxfSksdSgiRXhwb0luT3V0IixmdW5jdGlvbih0KXtyZXR1cm4odCo9Mik8MT8uNSpNYXRoLnBvdygyLDEwKih0LTEpKTouNSooMi1NYXRoLnBvdygyLC0xMCoodC0xKSkpfSkpLGMoIlNpbmUiLHUoIlNpbmVPdXQiLGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNpbih0KmwpfSksdSgiU2luZUluIixmdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLmNvcyh0KmwpfSksdSgiU2luZUluT3V0IixmdW5jdGlvbih0KXtyZXR1cm4tLjUqKE1hdGguY29zKE1hdGguUEkqdCktMSl9KSksaCgiZWFzaW5nLkVhc2VMb29rdXAiLHtmaW5kOmZ1bmN0aW9uKHQpe3JldHVybiByLmIubWFwW3RdfX0sITApLF8obi5TbG93TW8sIlNsb3dNbyIsImVhc2UsIiksXyhpLCJSb3VnaEVhc2UiLCJlYXNlLCIpLF8odCwiU3RlcHBlZEVhc2UiLCJlYXNlLCIpLGR9LCEwKTt2YXIgTz1yLm0uQmFjayxBPXIubS5FbGFzdGljLEM9ci5tLkJvdW5jZSxEPXIubS5Sb3VnaEVhc2UsTT1yLm0uU2xvd01vLEU9ci5tLlN0ZXBwZWRFYXNlLEY9ci5tLkNpcmMsej1yLm0uRXhwbyxJPXIubS5TaW5lLEw9ci5tLkV4cG9TY2FsZUVhc2UsTj1hO04uX2F1dG9BY3RpdmF0ZWQ9W3MsbixvLGwsayxoLGYsTyxBLEMsRCxNLEUsRix6LEksTF0saS5kKGUsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIE59KSxpLmQoZSwiVHdlZW5MaXRlIixmdW5jdGlvbigpe3JldHVybiByLmx9KSxpLmQoZSwiVHdlZW5NYXgiLGZ1bmN0aW9uKCl7cmV0dXJuIE59KSxpLmQoZSwiVGltZWxpbmVMaXRlIixmdW5jdGlvbigpe3JldHVybiBzfSksaS5kKGUsIlRpbWVsaW5lTWF4IixmdW5jdGlvbigpe3JldHVybiBufSksaS5kKGUsIkNTU1BsdWdpbiIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLGkuZChlLCJBdHRyUGx1Z2luIixmdW5jdGlvbigpe3JldHVybiBsfSksaS5kKGUsIkJlemllclBsdWdpbiIsZnVuY3Rpb24oKXtyZXR1cm4ga30pLGkuZChlLCJSb3VuZFByb3BzUGx1Z2luIixmdW5jdGlvbigpe3JldHVybiBofSksaS5kKGUsIkRpcmVjdGlvbmFsUm90YXRpb25QbHVnaW4iLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSxpLmQoZSwiVHdlZW5QbHVnaW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHIuan0pLGkuZChlLCJFYXNlIixmdW5jdGlvbigpe3JldHVybiByLmJ9KSxpLmQoZSwiUG93ZXIwIixmdW5jdGlvbigpe3JldHVybiByLmR9KSxpLmQoZSwiUG93ZXIxIixmdW5jdGlvbigpe3JldHVybiByLmV9KSxpLmQoZSwiUG93ZXIyIixmdW5jdGlvbigpe3JldHVybiByLmZ9KSxpLmQoZSwiUG93ZXIzIixmdW5jdGlvbigpe3JldHVybiByLmd9KSxpLmQoZSwiUG93ZXI0IixmdW5jdGlvbigpe3JldHVybiByLmh9KSxpLmQoZSwiTGluZWFyIixmdW5jdGlvbigpe3JldHVybiByLmN9KSxpLmQoZSwiQmFjayIsZnVuY3Rpb24oKXtyZXR1cm4gT30pLGkuZChlLCJFbGFzdGljIixmdW5jdGlvbigpe3JldHVybiBBfSksaS5kKGUsIkJvdW5jZSIsZnVuY3Rpb24oKXtyZXR1cm4gQ30pLGkuZChlLCJSb3VnaEVhc2UiLGZ1bmN0aW9uKCl7cmV0dXJuIER9KSxpLmQoZSwiU2xvd01vIixmdW5jdGlvbigpe3JldHVybiBNfSksaS5kKGUsIlN0ZXBwZWRFYXNlIixmdW5jdGlvbigpe3JldHVybiBFfSksaS5kKGUsIkNpcmMiLGZ1bmN0aW9uKCl7cmV0dXJuIEZ9KSxpLmQoZSwiRXhwbyIsZnVuY3Rpb24oKXtyZXR1cm4gen0pLGkuZChlLCJTaW5lIixmdW5jdGlvbigpe3JldHVybiBJfSksaS5kKGUsIkV4cG9TY2FsZUVhc2UiLGZ1bmN0aW9uKCl7cmV0dXJuIEx9KSxpLmQoZSwiX2dzU2NvcGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHIua30pfV0pOw=="), (c.async = !0); var e = a.getElementById("page_wrapper"), f = a.querySelectorAll(".js-citylight"); (c.onload = function() { var g = null; [].slice.call(f).forEach(function(h) { g ? g.onInit(function(i) { g = new Special.Citylight({ wrapper: e, container: h, prevOffset: i }); }) : (g = new Special.Citylight({ wrapper: e, container: h, prevOffset: 0 })); }); }), a.body.appendChild(c); })(document, 0);

Развитие основного бизнеса

Новый подход в отношениях с клиентами требовал изменений в продуктовой линейке «МегаФона». В первую очередь это касалось тарифов.

До недавнего времени ценообразование тарифов строилось по простому принципу: чем больше пакет услуг, тем больше денег платит абонент. По этому принципу была устроена линейка «Всё включено». Но чаще всего лимиты пакетов не расходовались полностью, то есть фактически клиенты переплачивали за услуги.

Чтобы создать ценность без ценовой конкуренции, «МегаФон» проанализировал большие данные. На основе поведения 2 млн абонентов специалисты оператора выяснили, чем пользуются люди в рамках своих тарифов.

Оказалось, что всех абонентов можно разделить на сегменты по поведению. На основе этого «МегаФон» разработал линейку тарифов «Включайся!» Например, «Включайся! Общайся» — для тех, кто чаще всего пользуется мессенджерами и соцсетями. В этом тарифе трафик за их использование не тарифицируется. У пользователей «Включайся! Слушай» небольшой голосовой пакет, но есть доступ к музыкальным сервисам, подписка на которые уже включена в стоимость.

6,9 ГБ

трафика в среднем приходится на абонента «Включайся!» На одного абонента предыдущей линейки тарифов «Всё включено» — 4,7 ГБ

Стоимость тарифов увеличилась, но вместе с этим абоненты стали использовать больше услуг. Для них такой подход оказался выгодным.

Вместе с новыми тарифами «МегаФон» ввёл опцию «Роуминг, гудбай!», разработал персональные систему персональных рекомендаций услуг в личном кабинете и вернул безлимитный интернет. Все эти нововведения подкрепляют посыл бренда: «МегаФон» отталкивается от потребностей пользователей.

Развитие экосистемы

Одна из главных целей новой стратегии «МегаФона» — стать брендом, который пользователи выбирают для решения повседневных задач. Клиент должен получить все необходимые услуги с помощью своего смартфона. Есть несколько сфер, над которыми компания работает сегодня.

  • Мобильные финансы. Банковская карта «МегаФона», счёт которой связан со счётом мобильного телефона. Обладает всеми функциями обычной банковской карты. С марта 2018-го года МегаФон предоставил возможность своим абонентам привязывать счёт мобильного телефона напрямую к платежным системам Apple Pay, Samsung Pay и Google Pay через выпуск виртуальной карты. Аналогов таких проектов пока в мире нет.
  • Потоковый видеосервис. «МегаФон ТВ» — мобильное телевидение, которое можно смотреть где угодно на любом устройстве. Трафик на тарифах «Включайся!» не тарифицируется.
  • Партнёрство с музыкальными сервисами. Подписка на «Яндекс.Музыку», Boom и Zvook по специальным сниженным ценам для абонентов оператора и полностью с безлимитном трафиком.

  • «Кэшбек-сервис #Специи». Возможность вернуть часть средств за покупки в 430 магазинах-партнёрах: от Aliexpress и LaModa до косметики и бытовых магазинов. У некоторых партнёров кэшбек достигает 30%. Использовать средства можно на оплату связи, подключение дополнительных услуг, мобильную коммерцию и даже снять наличные с банковской карты «МегаФона».

  • «МегаФон Путешествия». Абоненты могут купить билеты на самолёт, поезд, автобус, забронировать отель или комплексный тур, выбрать страховку, экскурсии или трансфер. Кэшбек возвращается на счёт реальными деньгами.

  • «МегаФон Здоровье». Сервис позволяет общаться с врачами через мобильное приложение. Документы всегда под рукой в электронной медицинской карте. Более 40 специальностей, клиники со всей России.

  • VIP-привилегии. Московские абоненты, которые ежемесячно тратят на услуги от 1000 рублей, получают ряд привилегий. Например, чуть большую скорость на мобильный интернет и скидки на концерты, мероприятия, такси, сервисы доставки еды и услуги связи.

Трансформация коснулась не только продуктов и услуг оператора. Компания поменяла подход в корпоративной культуре и HR-бренде. Подробнее об этом «МегаФон» расскажет в будущих публикациях в блоге.

Результаты

Лучше всего результаты по смене стратегии иллюстрирует исследование независимой консалтинговой компании Brand Finance, опубликованное в августе 2018 года. «МегаФон» вошёл в тройку самых сильных российских брендов, уступив лишь «Аэрофлоту» и Сбербанку. Ценность бренда за год увеличилась на 33% — по этому показателю «МегаФон» занял второе место среди телеком компаний и 11 место среди всех российских брендов.

Чуть меньше года назад мы представили новое позиционирование бренда «МегаФон» и кампанию со слоганом «Начинается с тебя», обновив платформу бренда. За год с новым позиционированием, выстроенным вокруг наших клиентов, мы успели сделать многое: бренд стал ярче, поменялось его восприятие. Мы активно развиваемся в области цифровых проектов, партнёрств и сервисов, создавая полноценную цифровую экосистему полезных продуктов и сервисов для наших клиентов, чтобы они, выбирая нас, оставались с нами надолго, а лучше навсегда. Всё это помогло нам войти сегодня в тройку сильнейших брендов России».

Снежана Черногорцева
директор по бренду и маркетинговым коммуникациям «МегаФона»
{ "author_name": "МегаФон", "author_type": "editor", "tags": ["\u0441\u043f\u0435\u0446\u0438\u0438"], "comments": 29, "likes": 14, "favorites": 1, "is_advertisement": false, "subsite_label": "megafon", "id": 48809, "is_wide": true, "is_ugc": false, "date": "Mon, 29 Oct 2018 11:18:56 +0300" }
{ "id": 48809, "author_id": 199689, "diff_limit": 1000, "urls": {"diff":"\/comments\/48809\/get","add":"\/comments\/48809\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/48809"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199689, "possessions": [] }

29 комментариев 29 комм.

Популярные

По порядку

Написать комментарий...
22

Но чаще всего лимиты пакетов не расходовались полностью, то есть фактически клиенты переплачивали за услуги.

Поэтому мы придумали линейку тарифов, на которых клиенты буду платить больше за еще большие пакеты того, что им не нужно. Привязка зоны действия тарифа к "толщине" пакета, а как следствия и его стоимости - просто жесть!
Очень рад, что для меня этот год был последним годом сотрудничества с Мегафоном

Ответить
13

Особенно радует звонок оператора.
- Здравствуйте! Я вижу вы платите 600 руб. в месяц. Предлагаю вам со скидкой платить 850 руб, вместо 1000 руб. Я уверяю, вам понравится платить нам больше!
- Мне хватает, тех услуг, которые я получаю за 600 руб.
- За 850 руб, вам будет хватать еще больше...

Ответить
3

Вам будет хватать больше и нам будет хватать больше! Всем будет хватать больше! Win-Win!

Ответить
1

После аналогичного предложения, Мегафон и начал для меня стремительное падение к днищу.
Весной этого года раздался телефонный звонок, где представитель оператора активно продавал мне новый шикарный тариф за еще больше и еще дороже. На мои возражения, что мне и так хватает, он достал туз из рукава - отсутствие роуминга при поездках по России. Я даже возмутился! У меня и так на тарифе вот уже три года как все успешно работало из единого пакета по всей стране (со стандартными оговорками про Восточную Сибирь и Крым). Попрощались каждый на своем, в общем.
Дальше пошла жара!
Где-то через неделю, при попытке войти в личный кабинет, приложение оператора постоянно выдавало мне "внутреннюю ошибку" и невозможность авторизации. Переустановка, сброс пароля - ничего не помогало. В техподдержке в итоге подтвердили, что доступ к ЛК у меня ограничен. Создали заявку. Неделя разборов. Сообщат по смс. Короче, суть да дело, "разбанили" ЛК мне только через 2,5 месяца.
Дали 100 рублей компенсации!
Вау, думаю, ну и сервис! Но где дали, там и взяли. Без всякого объявления войны - повысили абонентскую плату на тарифе. И если в предыдущий раз, хотя бы уведомляли по смс, мол, ваш тариф - в архив, цена теперь такая. Не устраивает, меняйте его на такой-то или такой-то. Это хотя бы честно! Тут просто втихаря (где-нибудь в недрах сайта мегафона обязательно была об этом новость, но кто же их читает) накинули 45 рублей. Тут у меня начало уже кое-где зудеть.
Многие жалуются на то, что оператор "ворует" у них деньги, у меня же началась просто иррациональная тревога за то, что мой оператор связи неадекватный и мысли о том, каких еще закидонов от него теперь стоит ожидать. А ждать и не пришлось.
В сентябре, после приезда из отпуска из другой страны (телефон все это время был выключен из сети, "режим полета") - они мне просто отключили биллинг. Я задним умом понимал, что сумма на счету уже должна быть меньше ноля, но телефон упорно показывал мне положительный баланс, детализация - ноль расходов, а ежесуточные списания абонентской платы перестали существовать, как явление. Обращение в техподдержку, с вопросом почему не списывают абонентскую плату. И вот цитата:

Я рассмотрела ваше обращение по вопросу списания абонентской платы. Списание абонентской платы будет произведено в этом месяце и дальше будет списываться днем перехода на тарифный план.

Вот тут я совсем, извините, охуел!
Заявление MNP и, как вишенка на торте после этого полугодичного маразма, звонок от оператора (ух, сейчас меня будут просить не уходить):

Здравствуйте! В целях обеспечения качества обслуживания, все разговоры с оператором записываются.

И тридцать секунд тишины

Ответить
9

один из самых гнилых операторов, который до сих пор только обманом и зарабатывает...

Ответить
1

что значит один из самых, остались еще другие?)

Ответить
8

Чуваки, перекрашивание логотипа и рассуждения о возрастании его цены это хорошо, но возможно скоро вы потеряете свою базу клиентов. Сейчас МГТС предлагает за 200 р сверху к цене домашнего интернета симку с 500 минут и 20Гб. В мегафоне за 350р я получаю 300 минут и 4Гб. "Ну вы понели".

Ответить
0

Danycom за 199 дает 300 минут и 10 Гб

Ответить
8

Интересно, кто-то кроме Снежаны считает, что с рекламой, где одни летают на гоночных подах из звездных войн, муравьи танцуют на наушниках под уму турман, а костюшкин предлагает с экрана совершить "покупочный акт", восприятие бренда изменилось в лучшую сторону? Just asking

Ответить
6

Отвратительный оператор.
Воровство денег постоянными "подписками" и "услугами", которые сами же и подключают.
Обращение в поддержку отъедает пол часа времени, а благодаря воровству этим приходится заниматься раз в пару месяцев. Саппорт и не пытается помочь, пока не начнешь требовать старшего.
К сожалению, выбор из трех помоек не велик.
Очень надеюсь, что когда нибудь ситуация переломится и появится хоть один нормальный оператор, который будет честно зарабатывать.

Ответить
0

В этом плане сейчас хорошо у новых операторах, они делают себе имя и не гонятся за быстрыми деньгами. Я на Danycom перешла, он хоршо себя зарекомендовал

Ответить
0

а Yota вам на что?

Ответить
6

создавая полноценную цифровую экосистему полезных продуктов и сервисов для наших клиентов, чтобы они, выбирая нас, оставались с нами надолго, а лучше навсегда

Кхм

Ответить
5

В новом позиционировании Мегафон перестанет молча <s>воровать</s> подключать платные услуги типа кастомного гудка и "кто звонил+"?

Ответить
4

Это какой-то ужас, а не оператор. О постоянных сбоях, списаниях и просто тухлом трафике, который у тебя есть и даже не расходуется, потому что скорость как у черепахи.
Говорить о том что ни на одном из этажей нашего города выше 9 этажа связь не ловит, половине сложнодоступных мест города - нет связи. Все время глюки и списания. Больше 15 лет сижу на Мегафоне, вспоминается самое начало Мегафона году в 2000, когда все вокруг говорили что они "воруют" деньги с телефона, ну чтож 2019 год на носу, возвращаемся к тем же манипуляциям что и раньше. И я понимаю телефон бы был старый или у меня одной такие проблемы...но нет, с кем не разговариваю, у кого мегафон - точно такие же проблемы.

Ответить
3

А зачем вы уже 15 лет с ними?

Ответить
1

Раньше таких проблем не было) У меня есть основная симка, которая уже давно не мегафон, а эта видимо чтобы бесить осталась))

Ответить
4

Вот я вам использую почти 10 лет (если считать Йоту за Мегафон, без Йоты - 8) и могу сказать вроде вы прикладываете кучу усилий развивая свои сервисы, но одновременно остаётся чувство того что не сегодня-завтра вы побалуетесь и закроете свои сервисы. По мне устойчивое развитие и перспективы имеет Мегафон.Банк и МегафонТВ, всё остальное (Гид, инвестиции, доктор и т.д) обречено на гибель. По настоящему, чтобы совершить прорыв нужно:
1. Убрать все "псевдо" подписки. Смотрите на Тинькофф.Мобайл, они развиваются партнёрство с кучей компаний, можно подписаться на Megogo, музыкальные стриминги и т.д. Если у вас пропадут обманные подписки, которые вы специально подключаете для воровства денег, и появится партнёрство с Яндекс, Google, Apple, Amediateka, Okko и остальными сервисами, то уровень доверия станет просто космическим.
2. Убрать плату за удержание вызова, "кто звонил", активация iMessage и другие услуги, которые можно активировать случайно.
3. Добавить удобную детализацию. В нынешняя сделана для максимального запутывания пользователя.
4. Уменьшить округление трафика до 1 килобайта для честного потребления трафика.
5. Доведение интерфейса МегафонТВ до ума. Там до сих пор нету Apple Pay, нету списка загрузок, при нажатии на трейлер он показывает кусок фильма, какой-то богомерзкий русский перевод (я про качество перевода) на некоторых фильмах и множество других недоделок.
6. Мегафон.Банк удобен при оплате на ноунейм сайтах при небольших суммах, но список провайдеров услуг при оплате, интерфейс и комиссия вызывают удивление. Притом кэшбек мегабайтами и отсутствие скидки при использовании Мегафон.Банком не вызывают желания регулярно платить картой.
7. Хочется каких-то коллабов вместе с компаниями из Mail.ru Group да и не только с ними. У Сбербанк и Сбербанк-Мобайл например при оплате тарифа часть стоимости возвращают баллами Спасибо. У вас есть WiFire, Yota и друзья по Mail.ru Group. Можете придумать какие-то совместные акции.

Ответить
3

Некогда объяснять, нужно чтобы абонент тратил в месяц не менее 300 (сейчас наверное 500) рублей, для этого и составляются сложные тарифы и пакеты, где в конце мелким шрифтом со звездочками написаны все отмазки, почему были списаны деньги.

Ответить
2

Не читая натив.
МЕГАФОН! доведи до ума лагающую облачную АТС и найди денег на сотрудников суппорта АТС.
Мы те самые мыши что залезли на Вашу АТС и жрём этот кактус 3й год!
Регулярно, запредельные пинги перевода звонков порой 30 - 50 сек с ожидания до гудка у нас.
Еженедельно - проёбанные звонки, при том что Ваша новая статистика показывает как 100% ОК за все 3 года!

Ответить
2

На развитие клиентского сервиса надо деньги тратить, а не на перекрашивание логотипа.
Как обкрадывали своих абонентов, так и продолжают это делать.

Ответить
2

Странная стратегия: "Клиент должен получить все необходимые услуги с помощью своего смартфона" Я и так получаю. Причем тут Магафон?

Руководство Мегафон не особо врубается, что такое цифровая экономика и как там делать бизнес. Начать нужно было не со смены стратегии, а со смены некомпетентного руководства. Пригласить executives профессионала из Digital мира, понимающего, что такие цифровые сервисы и как их развивать.

Ответить
2

Ни одного положительного комментария. Как тебе такое, Мегафон? Хотя, очевидно, что ты не сильно обеспокоен этим) И пока нет достойного и честного игрока на рынке, ты и дальше будешь качать бабло из своих клиентов.

Свежий кейс. Увидев статью, полез в личный кабинет, и что я вижу там?) Подключена платная опция, которая снова появилась после предыдущей "зачистки". Нужно каждый месяц заходить и проверять, не проявил ли дорогой и любимый оператор заботу обо мне, подключив какую-нибудь услугу "кто звонил", за месяц пользования которой я так и не заметил что она у меня есть, пока не зашел в личный кабинет. Еще жаль пользователей старших поколений, они чаще всего просто не понимают как их обманывают.

Ответить
1

Хех, пользовался мегафоном в студенчестве, но с каждым месяцем пользования скорость интернета падала, в итоге платил безлимит м - 500-600 рублей, а инета не стало совсем, не то что скорости, просто грузил раз в сто попыток. Перешёл на др.оператора - кайфанул от скорости. Такое себе удержание цифровых молодых клиентов качеством продукта.

Ответить
1

Я как ознакомился летом сего года с изменёнными условиями ваших тарифов, так и перенёс номер к другому оператору.
Не понимаю, зачем надо было городить огороды с платными звонками на домашние номера и всю эту чепуху с домашним/местным/другими регионами. Я даже смирился с уменьшенным трафиком - оптимизировал его использование. Но со звонками - полный бред, фэйспалм и *вынос мозга у джеки чана.jpg*.
И это в то время, когда виртуальные опсосы даже не первого - второго уровня, такого себе не позволяют.
Одно у вас хорошо - инфраструктура (Москва и область, Тольятти и вокруг, причём в реально глухих местах). Знаю, что многих качество связи и интернета не устраивает, но у меня такой проблемы не было от слова совсем, в отличие от опыта с другими операторами. Edge под горой в Самарской Луке - это нормально, тем более что на самой горе есть 3G/4G. Я так понимаю, Band20 решает в таких кейсах, а то народ напокупает себе китайских версий без оного и жалуется.
Но вы какие-то комсомольцы, которые сами себе трудности создают и потом их преодолевают, а вот успешно ли? Испоганить тарифную сетку, наподключать каких-то драных подписок из лихих нулевых и лаяться в чате техподдержки с обманутыми пользователями, потерять в итоге тучу народу - а теперь давайте бренд освежим.
Да драл я бренд, его позиционирование и маркетологов, которые это делают, когда этот бренд занимается хуетой. Не вернусь я к вам более.

Ответить

0

Всё устраивает. Провалы в зоне покрытия есть у любого оператора. Есть лишь одна "проблема". Для звонков мне удобней пользоваться обычным кнопочным телефоном. Для интернета, видео и т.д. есть другой телефон. Если бы была возможность как то разделять услуги или использовать один номер в двух устройствах, вообще здорово было бы.

Ответить
0

Никогда не пользовался мегафоном, только МТС (на смартфоне) / Yota (для ноутбука).
Много хорошего говорят и плохого про мегафон, как про оператора, но вот честно, раз здесь пишут о бренде и экосистеме, значит им действительно нужна реклама.

Люблю исследовать историю и проникаться идеями бренда, но это не про мегафон. Он всегда казался незаметным и неопределенным, никогда не слышал про экосистему. Будем считать, что логотип не менялся (давайте будем честны), как и сам посыл (он остался неопределенным, это просто оператор который есть среди других). Вероятно маркетологи либо побоялись кардинальных изменений с целью сохраниться в памяти людей, либо там все же не уделяют бренду особого внимания (или строго прислушиваются к чьему-то своеобразному мнению)

Ответить
0

Тариф МТС "Смарт для своих". Покупается за 1200 рублей. 200р (!!!) абонентка - 600 минут, 600СМС и 10Гб интернета. Из лимитов ни разу не вылезал.

Мегафон оставил как второй номер. Заплатил за 4 месяца 0 рублей. Выгоду посчитайте сами :))

Ответить
0

Почему мой дебильный мегафон совсем не ловит в метро? Потому что сволочи из мтс и максимы телеком его глушат?

Ответить
0
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Нейронная сеть научилась читать стихи
голосом Пастернака и смотреть в окно на осень
Подписаться на push-уведомления
{ "page_type": "default" }