Аудит

Данные на 13 февраля 2024

Добавить сайт в список

133

Показатели сайта

0
0
0
Узнайте больше об этом сайте
ИКС сайта 30
SSL-сертификат Есть SSL-сертификат

Содержимое

Заголовок (тег title) Такском личный кабинет: вход в онлайн кассы и регистрация
Заголовок (тег h1) Как пользоваться личным кабинетом ОФД Такском
Описание сайта (description) Инструкция по регистрации в личном кабинете Taxcom и вход в систему, плюсы и минусы, функционал сервиса и дополнительные программы, доступные клиентам. 
Автор (менеджер сайта)

Главная страница сайта

URL сайта https://vlichnyi-kabinet.ru/crm/ofd-taxcom/
Локализация сайта Альтернативных страниц нет
Кодировка страниц UTF-8
Тексты 290
HTML теги 784
a62 article1 blockquote5 body1 br18 button3 comment5 div106 footer1 form2 h11 h28 h310 head1 header7 html1 iframe4 img41 input9 label6 li68 link12 main1 mark1 meta51 nav1 noscript26 ol6 p50 script31 small1 span81 strong2 style11 table4 tbody4 td84 textarea2 th10 thead3 time1 title1 tr33 ul7 unknown1
Скрипты на сайте 31
Обнаружены скрипты:
Яндекс.Метрика
Все скрипты:
data:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp2YXIgZXhwZXJ0X3Jldmlld19hamF4ID0geyJ1cmwiOiJodHRwczpcL1wvdmxpY2hueWkta2FiaW5ldC5ydVwvd3AtYWRtaW5cL2FkbWluLWFqYXgucGhwIiwibm9uY2UiOiIwY2VmYmRlYmVhIiwiY29tbWVudF90b19zY3JvbGxfc2VsZWN0b3IiOiIiLCJhc2tfcXVlc3Rpb25fbGlua19uZXdfdGFiIjoiMCIsImkxOG4iOnsicXVlc3Rpb25fcG9wdXBfbmFtZSI6Ilx1MDQxOFx1MDQzY1x1MDQ0ZiIsInF1ZXN0aW9uX3BvcHVwX2VtYWlsIjoiRW1haWwiLCJxdWVzdGlvbl9wb3B1cF9waG9uZSI6Ilx1MDQyMlx1MDQzNVx1MDQzYlx1MDQzNVx1MDQ0NFx1MDQzZVx1MDQzZCIsInF1ZXN0aW9uX3BvcHVwX3F1ZXN0aW9uIjoiXHUwNDEyXHUwNDNlXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxIiwicXVlc3Rpb25fcG9wdXBfc3VibWl0IjoiXHUwNDFlXHUwNDQyXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRjIiwicXVlc3Rpb25fcG9wdXBfY2FuY2VsIjoiXHUwNDFlXHUwNDQyXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDMwIiwicXVlc3Rpb25fc3VibWl0dGVkIjoiXHUwNDEyXHUwNDNlXHUwNDNmXHUwNDQwXHUwNDNlXHUwNDQxIFx1MDQ0M1x1MDQ0MVx1MDQzZlx1MDQzNVx1MDQ0OFx1MDQzZFx1MDQzZSBcdTA0M2VcdTA0NDJcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M2JcdTA0MzVcdTA0M2QiLCJsZWdhY3lfZm9ybSI6Ilx1MDQxZFx1MDQzNVx1MDQzZVx1MDQzMVx1MDQ0NVx1MDQzZVx1MDQzNFx1MDQzOFx1MDQzY1x1MDQzZSBcdTA0M2VcdTA0MzFcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NGMgXHUwNDNhXHUwNDNlXHUwNDM0IFx1MDQzM1x1MDQzNVx1MDQzZFx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NGNcdTA0MzdcdTA0M2VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M2JcdTA0NGNcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzkgXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDRiIiwiZmllbGRfY2Fubm90X2JlX2VtcHR5IjoiXHUwNDFmXHUwNDNlXHUwNDNiXHUwNDM1IFx1MDQzZFx1MDQzNSBcdTA0M2NcdTA0M2VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQ0Ylx1MDQzYyIsImZpZWxkX211c3RfYmVfY2hlY2tlZCI6Ilx1MDQxZlx1MDQzZVx1MDQzYlx1MDQzNSBcdTA0MzRcdTA0M2VcdTA0M2JcdTA0MzZcdTA0M2RcdTA0M2UgXHUwNDMxXHUwNDRiXHUwNDQyXHUwNDRjIFx1MDQzZVx1MDQ0Mlx1MDQzY1x1MDQzNVx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQzZSIsImNvbnNlbnQiOiJcdTA0MjFcdTA0M2VcdTA0MzNcdTA0M2JcdTA0MzBcdTA0NDFcdTA0MzhcdTA0MzUgXHUwNDNkXHUwNDMwIFx1MDQzZVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzYVx1MDQ0MyBcdTA0M2ZcdTA0MzVcdTA0NDBcdTA0NDFcdTA0M2VcdTA0M2RcdTA0MzBcdTA0M2JcdTA0NGNcdTA0M2RcdTA0NGJcdTA0NDUgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDQ1In0sImNvbnNlbnQiOiIwIn07Ci8qIF1dPiAqLwo=
data:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp2YXIgc2V0dGluZ3NfYXJyYXkgPSB7InJhdGluZ190ZXh0X2F2ZXJhZ2UiOiJcdTA0NDFcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M2RcdTA0MzVcdTA0MzUiLCJyYXRpbmdfdGV4dF9mcm9tIjoiXHUwNDM4XHUwNDM3IiwibGlnaHRib3hfZW5hYmxlZCI6IiJ9Owp2YXIgd3BzX2FqYXggPSB7InVybCI6Imh0dHBzOlwvXC92bGljaG55aS1rYWJpbmV0LnJ1XC93cC1hZG1pblwvYWRtaW4tYWpheC5waHAiLCJub25jZSI6IjBjZWZiZGViZWEifTsKLyogXV0+ICovCg==
data:text/javascript;base64,CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvbkVycm9yUGxhY2luZygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhY2hlUGxhY2luZyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNhY2hlUGxhY2luZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygd2luZG93LmpzSW5wdXRlckxhdW5jaCAhPT0gJ3VuZGVmaW5lZCcgJiYgWzE1LCAxMF0uaW5jbHVkZXMod2luZG93LmpzSW5wdXRlckxhdW5jaCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9ySW5mbyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVBsYWNpbmcoJ2xvdycsZXJyb3JJbmZvKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3JQbGFjaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICB4aHIub3BlbignR0VUJywiLy9uZXdyb3RhdG9ybWFyY2gyMy5iaWQvMWR3dmYuanNvbiIsdHJ1ZSk7CiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOwogICAgICAgICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzICE9IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1c1RleHQgIT0gJ2Fib3J0JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvclBsYWNpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpOwogICAgICAgICAgICA=
data:text/javascript;base64,CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvbkVycm9yUGxhY2luZygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhY2hlUGxhY2luZyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNhY2hlUGxhY2luZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygd2luZG93LmpzSW5wdXRlckxhdW5jaCAhPT0gJ3VuZGVmaW5lZCcgJiYgWzE1LCAxMF0uaW5jbHVkZXMod2luZG93LmpzSW5wdXRlckxhdW5jaCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9ySW5mbyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVBsYWNpbmcoJ2xvdycsZXJyb3JJbmZvKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3JQbGFjaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICB4aHIub3BlbignR0VUJywiLy9uZXdyb3RhdG9ybWFyY2gyMy5iaWQvMWR3dmYubWluLmpzIix0cnVlKTsKICAgICAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7CiAgICAgICAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgIT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzVGV4dCAhPSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yUGxhY2luZygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7CiAgICAgICAgICAgIA==
data:text/javascript;base64,CiAgICAgICAgICAgIHZhciBjb3UxID0gMDsKICAgICAgICAgICAgaWYgKHR5cGVvZiBibG9ja1NldHRpbmdBcnJheT09PSJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB2YXIgYmxvY2tTZXR0aW5nQXJyYXkgPSBbXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJsb2NrU2V0dGluZ0FycmF5KSkgewogICAgICAgICAgICAgICAgICAgIGNvdTEgPSBibG9ja1NldHRpbmdBcnJheS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBibG9ja1NldHRpbmdBcnJheSA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhjSWRDbGFzcz09PSJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB2YXIgZXhjSWRDbGFzcyA9IFsiLnBlcmNlbnRQb2ludGVyQ2xhc3MiLCIuY29udGVudF9yYiIsIi5jbnQzMl9ybF9iZ19zdHIiLCIucmxfY250X2JnIiwiLmFkZGVkSW5zZXJ0aW5nIiwiI3RvY19jb250YWluZXIiLCJ0YWJsZSIsImJsb2NrcXVvdGUiXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mIGJsb2NrRHVwbGljYXRlPT09InVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHZhciBibG9ja0R1cGxpY2F0ZSA9ICJubyI7CiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmxpZ2F0b3J5TWFyZ2luPT09InVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHZhciBvYmxpZ2F0b3J5TWFyZ2luID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHR5cGVvZiB0YWdzTGlzdEZvclRleHRMZW5ndGg9PT0idW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdmFyIHRhZ3NMaXN0Rm9yVGV4dExlbmd0aCA9IFsiUCIsIkgxIiwiSDIiLCJIMyIsIkg0IiwiSDUiLCJINiIsIkRJViIsIk9MIiwiVUwiLCJMSSIsIkJMT0NLUVVPVEUiLCJJTkRFWCIsIlRBQkxFIiwiQVJUSUNMRSIsIlNFQ1RJT04iXTsKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheVtjb3UxXSA9IFtdOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluU3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heFN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5IZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4SGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImlkIl0gPSAnMTQnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgY2xhc3M9XCJybF9jbnRfYmdcIiBkYXRhLWlkPVwiMzQ3MjM4XCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDE7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnQiXSA9ICJwIjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UG9zaXRpb24iXSA9IDA7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSAxOyAKY291MSsrOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXSA9IFtdOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluU3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heFN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5IZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4SGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImlkIl0gPSAnMTUnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgY2xhc3M9XCJybF9jbnRfYmdcIiBkYXRhLWlkPVwiMzQ3MjQxXCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDE7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnQiXSA9ICJoMiI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBvc2l0aW9uIl0gPSAwOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gMTsgCmNvdTErKzsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV0gPSBbXTsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pblN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhTeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluSGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heEhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJpZCJdID0gJzE2JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzYyJdID0gJzAnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInRleHQiXSA9ICc8ZGl2IGNsYXNzPVwicmxfY250X2JnXCIgZGF0YS1pZD1cIjM0NzI0MlwiPjwvZGl2Pic7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2V0dGluZ190eXBlIl0gPSAxOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRDc3MiXSA9ICJkZWZhdWx0IjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Il0gPSAiaDIiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQb3NpdGlvbiJdID0gMDsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UGxhY2UiXSA9IDI7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICcxNyc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2MiXSA9ICcwJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJ0ZXh0Il0gPSAnPGRpdiBjbGFzcz1cInJsX2NudF9iZ1wiIGRhdGEtaWQ9XCIzNDcyNDNcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gMTsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudCJdID0gImgyIjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UG9zaXRpb24iXSA9IDA7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSAzOyAKY291MSsrOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXSA9IFtdOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluU3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heFN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5IZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4SGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImlkIl0gPSAnMTgnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgY2xhc3M9XCJybF9jbnRfYmdcIiBkYXRhLWlkPVwiMzQ3MjQ0XCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDE7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnQiXSA9ICJoMiI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBvc2l0aW9uIl0gPSAwOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gNDsgCmNvdTErKzsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV0gPSBbXTsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pblN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhTeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluSGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heEhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJpZCJdID0gJzE5JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzYyJdID0gJzAnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInRleHQiXSA9ICc8ZGl2IGNsYXNzPVwicmxfY250X2JnXCIgZGF0YS1pZD1cIjM0NzI0NVwiPjwvZGl2Pic7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2V0dGluZ190eXBlIl0gPSAxOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRDc3MiXSA9ICJkZWZhdWx0IjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Il0gPSAiaDIiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQb3NpdGlvbiJdID0gMDsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UGxhY2UiXSA9IDU7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICcyMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2MiXSA9ICcwJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJ0ZXh0Il0gPSAnPGRpdiBjbGFzcz1cInJsX2NudF9iZ1wiIGRhdGEtaWQ9XCIzNDcyNDZcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gMTsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudCJdID0gImgyIjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UG9zaXRpb24iXSA9IDA7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSA2OyAKY291MSsrOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXSA9IFtdOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluU3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heFN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5IZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4SGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImlkIl0gPSAnMjEnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgY2xhc3M9XCJybF9jbnRfYmdcIiBkYXRhLWlkPVwiMzQ3MjQ3XCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDE7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnQiXSA9ICJoMiI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBvc2l0aW9uIl0gPSAwOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gNzsgCmNvdTErKzsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV0gPSBbXTsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pblN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhTeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluSGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heEhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJpZCJdID0gJzIyJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzYyJdID0gJzAnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInRleHQiXSA9ICc8ZGl2IGNsYXNzPVwicmxfY250X2JnXCIgZGF0YS1pZD1cIjM0NzI0OFwiPjwvZGl2Pic7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2V0dGluZ190eXBlIl0gPSAxOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRDc3MiXSA9ICJkZWZhdWx0IjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Il0gPSAiaDIiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQb3NpdGlvbiJdID0gMDsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UGxhY2UiXSA9IDg7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICcyMyc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2MiXSA9ICcwJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJ0ZXh0Il0gPSAnPGRpdiBjbGFzcz1cInJsX2NudF9iZ1wiIGRhdGEtaWQ9XCIzNDcyNDlcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gMTsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudCJdID0gImgyIjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UG9zaXRpb24iXSA9IDA7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSA5OyAKY291MSsrOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXSA9IFtdOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluU3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heFN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5IZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4SGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImlkIl0gPSAnMjQnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgY2xhc3M9XCJybF9jbnRfYmdcIiBkYXRhLWlkPVwiMzQ3MjUwXCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDE7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnQiXSA9ICJoMiI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBvc2l0aW9uIl0gPSAwOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gMTA7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICcyNSc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2MiXSA9ICcwJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJ0ZXh0Il0gPSAnPGRpdiBjbGFzcz1cInJsX2NudF9iZ1wiIGRhdGEtaWQ9XCIzNDcyNTFcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gMTsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudCJdID0gImgyIjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UG9zaXRpb24iXSA9IDA7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSAxMTsgCmNvdTErKzsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV0gPSBbXTsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pblN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhTeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluSGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heEhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJpZCJdID0gJzI2JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzYyJdID0gJzAnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInRleHQiXSA9ICc8ZGl2IGNsYXNzPVwicmxfY250X2JnXCIgZGF0YS1pZD1cIjM0NzIzOVwiPjwvZGl2Pic7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2V0dGluZ190eXBlIl0gPSAxOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRDc3MiXSA9ICJkZWZhdWx0IjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Il0gPSAicCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBvc2l0aW9uIl0gPSAwOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gMTsgCmNvdTErKzsKY29uc29sZS5sb2coImJzYS1sOiAiK2Jsb2NrU2V0dGluZ0FycmF5Lmxlbmd0aCk7Cg==
data:text/javascript;base64,CiAgICBpZiAodHlwZW9mIHdpbmRvdy5qc0lucHV0ZXJMYXVuY2ggPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgd2luZG93LmpzSW5wdXRlckxhdW5jaCA9IC0xOwogICAgfQogICAgaWYgKHR5cGVvZiBjb250ZW50U2VhcmNoQ291bnQgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgdmFyIGNvbnRlbnRTZWFyY2hDb3VudCA9IDA7CiAgICB9CiAgICBpZiAodHlwZW9mIGxhdW5jaEFzeW5jRnVuY3Rpb25MYXVuY2hlciA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICBmdW5jdGlvbiBsYXVuY2hBc3luY0Z1bmN0aW9uTGF1bmNoZXIoKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYXN5bmNGdW5jdGlvbkxhdW5jaGVyICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgYXN5bmNGdW5jdGlvbkxhdW5jaGVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICBhc3luY0Z1bmN0aW9uTGF1bmNoZXIoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGxhdW5jaEFzeW5jRnVuY3Rpb25MYXVuY2hlcigpOwogICAgICAgICAgICAgICAgfSwgMTAwKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKHR5cGVvZiBsYXVuY2hHYXRoZXJDb250ZW50QmxvY2sgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgZnVuY3Rpb24gbGF1bmNoR2F0aGVyQ29udGVudEJsb2NrKCkgewogICAgICAgICAgICBpZiAodHlwZW9mIGdhdGhlckNvbnRlbnRCbG9jayAhPT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mIGdhdGhlckNvbnRlbnRCbG9jayA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgZ2F0aGVyQ29udGVudEJsb2NrKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBsYXVuY2hHYXRoZXJDb250ZW50QmxvY2soKTsKICAgICAgICAgICAgICAgIH0sIDEwMCkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRlbnRNb25pdG9yaW5nKCkgewogICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmpzSW5wdXRlckxhdW5jaD09PSd1bmRlZmluZWQnfHwodHlwZW9mIHdpbmRvdy5qc0lucHV0ZXJMYXVuY2ghPT0ndW5kZWZpbmVkJyYmd2luZG93LmpzSW5wdXRlckxhdW5jaD09LTEpKSB7CiAgICAgICAgICAgIGxldCBwb3NzaWJsZUNsYXNzZXMgPSBbJy50YXhvbm9teS1kZXNjcmlwdGlvbicsJy5lbnRyeS1jb250ZW50JywnLnBvc3Qtd3JhcCcsJy5wb3N0LWJvZHknLCcjYmxvZy1lbnRyaWVzJywnLmNvbnRlbnQnLCcuYXJjaGl2ZS1wb3N0c19faXRlbS10ZXh0JywnLnNpbmdsZS1jb21wYW55X3dyYXBwZXInLCcucG9zdHMtY29udGFpbmVyJywnLmNvbnRlbnQtYXJlYScsJy5wb3N0LWxpc3RpbmcnLCcudGQtY2F0ZWdvcnktZGVzY3JpcHRpb24nLCcuamVnX3Bvc3RzX3dyYXAnXTsKICAgICAgICAgICAgbGV0IGRlbmllZENsYXNzZXMgPSBbJy5wZXJjZW50UG9pbnRlckNsYXNzJywnLmFkZGVkSW5zZXJ0aW5nJywnI3RvY19jb250YWluZXInXTsKICAgICAgICAgICAgbGV0IGRlbmllZFN0cmluZyA9ICIiOwogICAgICAgICAgICBsZXQgY29udGVudFNlbGVjdG9yID0gJyc7CiAgICAgICAgICAgIGxldCBjb250ZW50Q2hlY2sgPSBudWxsOwogICAgICAgICAgICBpZiAoY29udGVudFNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICBjb250ZW50Q2hlY2sgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNvbnRlbnRTZWxlY3Rvcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChibG9ja19jbGFzc2VzICYmIGJsb2NrX2NsYXNzZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja19jbGFzc2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrX2NsYXNzZXNbaV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVuaWVkQ2xhc3Nlcy5wdXNoKCcuJyArIGJsb2NrX2NsYXNzZXNbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRlbmllZENsYXNzZXMmJmRlbmllZENsYXNzZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZW5pZWRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgZGVuaWVkU3RyaW5nICs9ICI6bm90KCIrZGVuaWVkQ2xhc3Nlc1tpXSsiKSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghY29udGVudENoZWNrKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc3NpYmxlQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbnRlbnRDaGVjayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocG9zc2libGVDbGFzc2VzW2ldK2RlbmllZFN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRDaGVjaykgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFjb250ZW50Q2hlY2spIHsKICAgICAgICAgICAgICAgIGNvbnRlbnRDaGVjayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tpdGVtcHJvcD1hcnRpY2xlQm9keV0nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29udGVudENoZWNrKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29udGVudCBpcyBoZXJlJyk7CiAgICAgICAgICAgICAgICBsZXQgY29udGVudFBvaW50ZXJDaGVjayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50X3BvaW50ZXJfaWQnKTsKICAgICAgICAgICAgICAgIGxldCBjcFNwYW4KICAgICAgICAgICAgICAgIGlmIChjb250ZW50UG9pbnRlckNoZWNrICYmIGNvbnRlbnRDaGVjay5jb250YWlucyhjb250ZW50UG9pbnRlckNoZWNrKSkgewogICAgICAgICAgICAgICAgICAgIGNwU3BhbiA9IGNvbnRlbnRQb2ludGVyQ2hlY2s7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50UG9pbnRlckNoZWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludGVyQ2hlY2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjb250ZW50UG9pbnRlckNoZWNrKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY3BTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnU1BBTicpOyAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjcFNwYW4uc2V0QXR0cmlidXRlKCdpZCcsICdjb250ZW50X3BvaW50ZXJfaWQnKTsKICAgICAgICAgICAgICAgIGNwU3Bhbi5jbGFzc0xpc3QuYWRkKCduby1jb250ZW50Jyk7CiAgICAgICAgICAgICAgICBjcFNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLWNvbnRlbnQtbGVuZ3RoJywgJzAnKTsKICAgICAgICAgICAgICAgIGNwU3Bhbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYWNjZXB0ZWQtYmxvY2tzJywgJzE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2Jyk7CiAgICAgICAgICAgICAgICBjcFNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLXJlamVjdGVkLWJsb2NrcycsICcwJyk7CiAgICAgICAgICAgICAgICB3aW5kb3cuanNJbnB1dGVyTGF1bmNoID0gMTA7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICghY3BTcGFuLnBhcmVudE5vZGUpIGNvbnRlbnRDaGVjay5wcmVwZW5kKGNwU3Bhbik7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGxhdW5jaEFzeW5jRnVuY3Rpb25MYXVuY2hlcigpOwogICAgICAgICAgICAgICAgbGF1bmNoR2F0aGVyQ29udGVudEJsb2NrKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29udGVudE1vbml0b3JpbmcgdHJ5Jyk7CiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgY29udGVudFNlYXJjaENvdW50Kys7CiAgICAgICAgICAgICAgICBpZiAoY29udGVudFNlYXJjaENvdW50IDwgMjApIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudE1vbml0b3JpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb250ZW50Q2hlY2sgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJib2R5IitkZW5pZWRTdHJpbmcrIiBkaXYiK2RlbmllZFN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRDaGVjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29udGVudCBpcyBoZXJlIGhhcmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNwU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1NQQU4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgY3BTcGFuLnNldEF0dHJpYnV0ZSgnaWQnLCAnY29udGVudF9wb2ludGVyX2lkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNwU3Bhbi5jbGFzc0xpc3QuYWRkKCduby1jb250ZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNwU3Bhbi5jbGFzc0xpc3QuYWRkKCdoYXJkLWNvbnRlbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgY3BTcGFuLnNldEF0dHJpYnV0ZSgnZGF0YS1jb250ZW50LWxlbmd0aCcsICcwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNwU3Bhbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYWNjZXB0ZWQtYmxvY2tzJywgJzE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNwU3Bhbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVqZWN0ZWQtYmxvY2tzJywgJzAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmpzSW5wdXRlckxhdW5jaCA9IDEwOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudENoZWNrLnByZXBlbmQoY3BTcGFuKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGF1bmNoQXN5bmNGdW5jdGlvbkxhdW5jaGVyKCk7CiAgICAgICAgICAgICAgICAgICAgfSAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2pzSW5wdXRlckxhdW5jaCBpcyBoZXJlJyk7CiAgICAgICAgICAgIGxhdW5jaEdhdGhlckNvbnRlbnRCbG9jaygpOwogICAgICAgIH0KICAgIH0KICAgIGNvbnRlbnRNb25pdG9yaW5nKCk7Cg==
data:text/javascript;base64,CmlmICh0eXBlb2YgcmJfYWpheHVybD09PSd1bmRlZmluZWQnKSB7dmFyIHJiX2FqYXh1cmwgPSAnaHR0cHM6Ly92bGljaG55aS1rYWJpbmV0LnJ1L3dwLWFkbWluL2FkbWluLWFqYXgucGhwJzt9CmlmICh0eXBlb2YgZ2F0aGVyX2NvbnRlbnQ9PT0ndW5kZWZpbmVkJykge3ZhciBnYXRoZXJfY29udGVudCA9IHRydWU7fQppZiAodHlwZW9mIGVuZGVkU2M9PT0ndW5kZWZpbmVkJykge3ZhciBlbmRlZFNjID0gZmFsc2U7fQ0KaWYgKHR5cGVvZiBlbmRlZENjPT09J3VuZGVmaW5lZCcpIHt2YXIgZW5kZWRDYyA9IGZhbHNlO30NCmlmICh0eXBlb2YgdXNlZEFkQmxvY2tzQXJyYXk9PT0ndW5kZWZpbmVkJykge3ZhciB1c2VkQWRCbG9ja3NBcnJheSA9IFtdO30NCmlmICh0eXBlb2YgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzPT09J3VuZGVmaW5lZCcpIHt2YXIgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzID0gW107fQ0KaWYgKHR5cGVvZiBzYW1lRWxlbWVudEFmdGVyV2lkdGg9PT0ndW5kZWZpbmVkJykge3ZhciBzYW1lRWxlbWVudEFmdGVyV2lkdGggPSBmYWxzZTt9DQppZiAodHlwZW9mIHNhbWVFbGVtZW50QWZ0ZXJFeGNDbGFzc0lkPT09J3VuZGVmaW5lZCcpIHt2YXIgc2FtZUVsZW1lbnRBZnRlckV4Y0NsYXNzSWQgPSBmYWxzZTt9DQppZiAodHlwZW9mIHNhbWVFbGVtZW50QWZ0ZXJGcm9tQ29uc3RydWN0aW9uPT09J3VuZGVmaW5lZCcpIHt2YXIgc2FtZUVsZW1lbnRBZnRlckZyb21Db25zdHJ1Y3Rpb24gPSBmYWxzZTt9DQppZiAodHlwZW9mIHJiX3RlbXBFbGVtZW50X2NoZWNrPT09J3VuZGVmaW5lZCcpIHt2YXIgcmJfdGVtcEVsZW1lbnRfY2hlY2sgPSBmYWxzZTt9DQppZiAodHlwZW9mIHJiX3RlbXBFbGVtZW50PT09J3VuZGVmaW5lZCcpIHt2YXIgcmJfdGVtcEVsZW1lbnQgPSBudWxsO30NCmlmICh0eXBlb2Ygd2luZG93LmpzSW5wdXRlckxhdW5jaD09PSd1bmRlZmluZWQnKSB7d2luZG93LmpzSW5wdXRlckxhdW5jaCA9IC0xO30NCg0KZnVuY3Rpb24gbGF1bmNoVXBkYXRlUmJEaXNwbGF5cygpIHsNCiAgICBpZiAoKHR5cGVvZiB1cGRhdGVSYkRpc3BsYXlzICE9PSAndW5kZWZpbmVkJykmJih0eXBlb2YgdXBkYXRlUmJEaXNwbGF5cyA9PT0gJ2Z1bmN0aW9uJykpIHsNCiAgICAgICAgdXBkYXRlUmJEaXNwbGF5cygpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgbGF1bmNoVXBkYXRlUmJEaXNwbGF5cygpOw0KICAgICAgICB9LCAyMDApOw0KICAgIH0NCn0NCg0KLyogInNjIiBpbiB2YXJpYWJsZXMgLSBtYXJrIGZvciBzaG9ydGNvZGUgdmFyaWFibGUgKi8NCmZ1bmN0aW9uIHNob3J0Y29kZXNJbnNlcnQoKSB7DQogICAgbGV0IGdhdGhlcmVkQmxvY2tzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBlcmNlbnRQb2ludGVyQ2xhc3Muc2NNYXJrJyksDQogICAgICAgIHNjQmxvY2tJZCA9IC0xLA0KICAgICAgICBzY0FkSWQgPSAtMSwNCiAgICAgICAgYmxvY2tTdGF0dXMgPSAnJywNCiAgICAgICAgZGF0YUZ1bGwgPSAtMSwNCiAgICAgICAgZ2F0aGVyZWRCbG9ja0NoaWxkLA0KICAgICAgICBva1N0YXRlcyA9IFsnZG9uZScsJ3JlZnJlc2gtd2FpdCcsJ25vLWJsb2NrJywnZmV0Y2hlZCddLA0KICAgICAgICBzY0NvbnRhaW5lciwNCiAgICAgICAgc2NpLA0KICAgICAgICBpMSA9IDAsDQogICAgICAgIHNreXNjcmFwZXJDaGVjayA9IFtdLA0KICAgICAgICBza3lzY3JhcGVyU3RhdHVzID0gZmFsc2UsDQogICAgICAgIHNwbGl0ZWRTa3lzY3JhcGVyID0gW10sDQogICAgICAgIGdhdGhlcmVkQmxvY2tDaGlsZFNreVBhcnRzID0gW10sDQogICAgICAgIHN0aWNreVN0YXR1cyA9IGZhbHNlLA0KICAgICAgICBzdGlja3lDaGVjayA9IFtdLA0KICAgICAgICBzdGlja3lGaXhlZFN0YXR1cyA9IGZhbHNlLA0KICAgICAgICBzdGlja3lGaXhlZENoZWNrID0gW10sDQogICAgICAgIG92ZXJmbG93Q2hlY2sgPSBbXSwNCiAgICAgICAgb3ZlcmZsb3dTdGF0dXMgPSBmYWxzZSwNCiAgICAgICAgcmVwZWF0YWJsZUlkZW50aWZpZXIgPSAiIiwNCiAgICAgICAgZGF0YUNpZElkZW50aWZpZXIgPSBudWxsLA0KICAgICAgICBkaXZDaWRFbGVtZW50ID0gJyc7DQoNCiAgICBpZiAodHlwZW9mIHNjQXJyYXkgIT09ICd1bmRlZmluZWQnKSB7DQogICAgICAgIGlmIChzY0FycmF5JiZzY0FycmF5Lmxlbmd0aCA+IDAmJmdhdGhlcmVkQmxvY2tzJiZnYXRoZXJlZEJsb2Nrcy5sZW5ndGggPiAwJiZ0eXBlb2Ygd2luZG93LnJ1bHZXNWdudGIgIT09ICd1bmRlZmluZWQnKSB7DQogICAgICAgICAgICBkYXRhQ2lkSWRlbnRpZmllciA9IHdpbmRvdy5ydWx2VzVnbnRiOw0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnYXRoZXJlZEJsb2Nrcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGdhdGhlcmVkQmxvY2tDaGlsZCA9IGdhdGhlcmVkQmxvY2tzW2ldLmNoaWxkcmVuWzBdOw0KICAgICAgICAgICAgICAgIGlmICghZ2F0aGVyZWRCbG9ja0NoaWxkKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBzY0FkSWQgPSAtMzsNCiAgICAgICAgICAgICAgICBibG9ja1N0YXR1cyA9IG51bGw7DQogICAgICAgICAgICAgICAgc2NDb250YWluZXIgPSBudWxsOw0KICAgICAgICAgICAgICAgIGRhdGFGdWxsID0gLTE7DQogICAgICAgICAgICAgICAgc2t5c2NyYXBlclN0YXR1cyA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIHNwbGl0ZWRTa3lzY3JhcGVyID0gW107DQogICAgICAgICAgICAgICAgZ2F0aGVyZWRCbG9ja0NoaWxkU2t5UGFydHMgPSBbXTsNCiAgICAgICAgICAgICAgICBzdGlja3lTdGF0dXMgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBzdGlja3lDaGVjayA9IFtdOw0KICAgICAgICAgICAgICAgIHN0aWNreUZpeGVkU3RhdHVzID0gZmFsc2U7DQogICAgICAgICAgICAgICAgc3RpY2t5Rml4ZWRDaGVjayA9IFtdOw0KICAgICAgICAgICAgICAgIHJlcGVhdGFibGVJZGVudGlmaWVyID0gIiI7DQogICAgICAgICAgICAgICAgZGl2Q2lkRWxlbWVudCA9IG51bGw7DQoNCiAgICAgICAgICAgICAgICBzY0FkSWQgPSBnYXRoZXJlZEJsb2NrQ2hpbGQuZ2V0QXR0cmlidXRlKCdkYXRhLWFpZCcpOw0KICAgICAgICAgICAgICAgIHNjQmxvY2tJZCA9IGdhdGhlcmVkQmxvY2tDaGlsZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKTsNCiAgICAgICAgICAgICAgICBibG9ja1N0YXR1cyA9IGdhdGhlcmVkQmxvY2tDaGlsZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdGUnKTsNCiAgICAgICAgICAgICAgICBkYXRhRnVsbCA9IGdhdGhlcmVkQmxvY2tDaGlsZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZnVsbCcpOw0KDQogICAgICAgICAgICAgICAgaWYgKHNjQmxvY2tJZCYmc2NBZElkID4gMCkgew0KICAgICAgICAgICAgICAgICAgICBzY2kgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgc2NBcnJheS5sZW5ndGg7IGkxKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY0Jsb2NrSWQgPT0gc2NBcnJheVtpMV1bJ2Jsb2NrSWQnXSYmc2NBZElkID09IHNjQXJyYXlbaTFdWydhZElkJ10pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2kgPSBpMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGlmIChzY2kgPiAtMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrU3RhdHVzJiZva1N0YXRlcy5pbmNsdWRlcyhibG9ja1N0YXR1cykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tTdGF0dXM9PSduby1ibG9jaycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F0aGVyZWRCbG9ja0NoaWxkLmlubmVySFRNTCA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJsb2NrU3RhdHVzPT0nZmV0Y2hlZCcmJmRhdGFGdWxsPT0xKXx8IVsnbm8tYmxvY2snLCdmZXRjaGVkJ10uaW5jbHVkZXMoYmxvY2tTdGF0dXMpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNsMSA9IDA7IGNsMSA8IGdhdGhlcmVkQmxvY2tzW2ldLmNsYXNzTGlzdC5sZW5ndGg7IGNsMSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2F0aGVyZWRCbG9ja3NbaV0uY2xhc3NMaXN0W2NsMV0uaW5jbHVkZXMoInJlcGVhdGFibGUtbWFyayIpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0YWJsZUlkZW50aWZpZXIgPSBnYXRoZXJlZEJsb2Nrc1tpXS5jbGFzc0xpc3RbY2wxXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRhYmxlSWRlbnRpZmllcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2Q2lkRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5wZXJjZW50UG9pbnRlckNsYXNzLnNjTWFyay4iK3JlcGVhdGFibGVJZGVudGlmaWVyKycgZGl2W2RhdGEtY2lkPSInK2RhdGFDaWRJZGVudGlmaWVyKyciXScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2Q2lkRWxlbWVudCA9IGdhdGhlcmVkQmxvY2tDaGlsZC5xdWVyeVNlbGVjdG9yQWxsKCdkaXZbZGF0YS1jaWQ9IicrZGF0YUNpZElkZW50aWZpZXIrJyJdJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IHNjQXJyYXlbc2NpXVsndGV4dCddOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGl2Q2lkRWxlbWVudCYmZGl2Q2lkRWxlbWVudC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDwgZGl2Q2lkRWxlbWVudC5sZW5ndGg7IGkyKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoZGl2Q2lkRWxlbWVudFtpMl0pLmh0bWwodGV4dCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoZ2F0aGVyZWRCbG9ja0NoaWxkKS5odG1sKHRleHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaFVwZGF0ZVJiRGlzcGxheXMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrU3RhdHVzIT0nZmV0Y2hlZCd8fChibG9ja1N0YXR1cz09J2ZldGNoZWQnJiZkYXRhRnVsbD09MSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgc2NBcnJheS5sZW5ndGg7IGkxKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY0Jsb2NrSWQgPT0gc2NBcnJheVtpMV1bJ2Jsb2NrSWQnXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjQXJyYXkuc3BsaWNlKGkxLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMS0tOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdGhlcmVkQmxvY2tzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ3NjTWFyaycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NCbG9ja0lkJiZzY0FkSWQgPCAxJiZbJ25vLWJsb2NrJywnZmV0Y2hlZCddLmluY2x1ZGVzKGJsb2NrU3RhdHVzKSkgew0KICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCBzY0FycmF5Lmxlbmd0aDsgaTErKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjQmxvY2tJZCA9PSBzY0FycmF5W2kxXVsnYmxvY2tJZCddKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NBcnJheS5zcGxpY2UoaTEsIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxLS07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZ2F0aGVyZWRCbG9ja3NbaV0uY2xhc3NMaXN0LnJlbW92ZSgnc2NNYXJrJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKCFzY0FycmF5fHwoc2NBcnJheSYmc2NBcnJheS5sZW5ndGggPCAxKSkgew0KICAgICAgICAgICAgZW5kZWRTYyA9IHRydWU7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBlbmRlZFNjID0gdHJ1ZTsNCiAgICB9DQoNCiAgICBpZiAoIWVuZGVkU2MpIHsNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBzaG9ydGNvZGVzSW5zZXJ0KCk7DQogICAgICAgIH0sIDIwMCk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBjbGVhclVuc3VpdGFibGVDYWNoZShjdWNfY291KSB7DQogICAgbGV0IHNjQWRJZCA9IC0xOw0KICAgIGxldCBjY1JlcGVhdCA9IGZhbHNlOw0KDQogICAgbGV0IGdhdGhlcmVkQmxvY2tzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBlcmNlbnRQb2ludGVyQ2xhc3MgLicgKyBibG9ja19jbGFzc2VzLmpvaW4oJywgLnBlcmNlbnRQb2ludGVyQ2xhc3MgLicpKTsNCg0KICAgIGlmIChnYXRoZXJlZEJsb2NrcyYmZ2F0aGVyZWRCbG9ja3MubGVuZ3RoID4gMCkgew0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdhdGhlcmVkQmxvY2tzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoZ2F0aGVyZWRCbG9ja3NbaV1bJ2RhdGFzZXQnXVsnYWlkJ10mJmdhdGhlcmVkQmxvY2tzW2ldWydkYXRhc2V0J11bJ2FpZCddIDwgMCkgew0KICAgICAgICAgICAgICAgIGlmICgoZ2F0aGVyZWRCbG9ja3NbaV1bJ2RhdGFzZXQnXVsic3RhdGUiXT09J25vLWJsb2NrJyl8fChbJ2RvbmUnLCdmZXRjaGVkJywncmVmcmVzaC13YWl0J10uaW5jbHVkZXMoZ2F0aGVyZWRCbG9ja3NbaV1bJ2RhdGFzZXQnXVsic3RhdGUiXSkpKSB7DQogICAgICAgICAgICAgICAgICAgIGdhdGhlcmVkQmxvY2tzW2ldWydpbm5lckhUTUwnXSA9ICcnOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGNjUmVwZWF0ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2UgaWYgKCFnYXRoZXJlZEJsb2Nrc1tpXVsnZGF0YXNldCddWydhaWQnXSkgew0KICAgICAgICAgICAgICAgIGNjUmVwZWF0ID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoY3VjX2NvdSA8IDUwKSB7DQogICAgICAgICAgICBpZiAoY2NSZXBlYXQpIHsNCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgY2xlYXJVbnN1aXRhYmxlQ2FjaGUoY3VjX2NvdSsxKTsNCiAgICAgICAgICAgICAgICB9LCAxMDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZW5kZWRDYyA9IHRydWU7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBlbmRlZENjID0gdHJ1ZTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGJsb2Nrc1JlcG9zaXRpb25Vc2UoY29udGFpbmVyU3RyaW5nLCBibFR5cGUsIHNlYXJjaFR5cGUsIGNvbnRlbnRFbGVtZW50KSB7DQogICAgbGV0IGJsb2Nrc0luQ29udGFpbmVyOw0KICAgIGxldCBibExvY2FsID0gYmxUeXBlOw0KICAgIGxldCBjdXJyZW50QmxvY2s7DQogICAgbGV0IGN1cnJlbnRCbG9ja0lkOw0KICAgIGxldCBjdXJyZW50QmxvY2tQb3NpdGlvbjsNCiAgICBsZXQgY3VycmVudENvbnRhaW5lcjsNCiAgICBsZXQgaSA9IDA7DQogICAgbGV0IGogPSAwOw0KICAgIGxldCBibG9ja1N0ckpzID0gJyAucGVyY2VudFBvaW50ZXJDbGFzcy5tYXJrZWQnOw0KICAgIGxldCBibG9ja1N0clBocCA9ICcgLnBlcmNlbnRQb2ludGVyQ2xhc3M6bm90KC5tYXJrZWQpJzsNCiAgICBsZXQgYmxvY2tTdHIgPSAnIC5wZXJjZW50UG9pbnRlckNsYXNzJzsNCiAgICBsZXQgY2hlY2tQb2ludGVyID0gbnVsbDsNCiAgICBsZXQgYmxvY2tSZXBlYXRFbmQgPSBmYWxzZTsNCg0KICAgIGlmIChzZWFyY2hUeXBlKSB7DQogICAgICAgIGlmIChzZWFyY2hUeXBlID09ICdtYXJrZWQnKSB7DQogICAgICAgICAgICB3aGlsZSAoIWJsb2NrUmVwZWF0RW5kKSB7DQogICAgICAgICAgICAgICAgYmxMb2NhbCA9IGJsTG9jYWwucGFyZW50RWxlbWVudDsNCiAgICAgICAgICAgICAgICBpZiAoYmxMb2NhbCkgew0KICAgICAgICAgICAgICAgICAgICBjaGVja1BvaW50ZXIgPSBibExvY2FsLnF1ZXJ5U2VsZWN0b3IoIiNjb250ZW50X3BvaW50ZXJfaWQiKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja1BvaW50ZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc0luQ29udGFpbmVyID0galF1ZXJ5KGJsTG9jYWwpLnBhcmVudChjb250YWluZXJTdHJpbmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2Nrc0luQ29udGFpbmVyICYmIGJsb2Nrc0luQ29udGFpbmVyLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVja1BvaW50ZXIgPSBibG9ja3NJbkNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjY29udGVudF9wb2ludGVyX2lkIik7ICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tQb2ludGVyID0galF1ZXJ5KGJsb2Nrc0luQ29udGFpbmVyKS5maW5kKCIjY29udGVudF9wb2ludGVyX2lkIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrUG9pbnRlciAmJiBjaGVja1BvaW50ZXIubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NJbkNvbnRhaW5lciA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrUmVwZWF0RW5kID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrUmVwZWF0RW5kID0gdHJ1ZQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2tSZXBlYXRFbmQgPSB0cnVlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLyogYmxvY2tzSW5Db250YWluZXIgPSBqUXVlcnkoYmxUeXBlKS5wYXJlbnQoY29udGFpbmVyU3RyaW5nKTsgKi8NCiAgICAgICAgICAgIGlmIChibG9ja3NJbkNvbnRhaW5lciYmYmxvY2tzSW5Db250YWluZXIubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIC8qIGJsb2Nrc0luQ29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHJiX3RlbXBFbGVtZW50LCBibG9ja3NJbkNvbnRhaW5lcik7ICovDQogICAgICAgICAgICAgICAgYmxvY2tzSW5Db250YWluZXJbMF0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocmJfdGVtcEVsZW1lbnQsIGJsb2Nrc0luQ29udGFpbmVyWzBdKTsNCg0KICAgICAgICAgICAgICAgIHNhbWVFbGVtZW50QWZ0ZXJFeGNDbGFzc0lkID0gZmFsc2U7DQogICAgICAgICAgICAgICAgcmV0dXJuIGJsb2Nrc0luQ29udGFpbmVyWzBdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGJsVHlwZTsNCiAgICAgICAgfSBlbHNlIGlmIChzZWFyY2hUeXBlID09ICdub24tbWFya2VkJykgew0KICAgICAgICAgICAgYmxvY2tzSW5Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGJsVHlwZSArIGNvbnRhaW5lclN0cmluZyArIGJsb2NrU3RyUGhwKTsNCiAgICAgICAgICAgIGlmIChibG9ja3NJbkNvbnRhaW5lciAmJiBibG9ja3NJbkNvbnRhaW5lci5sZW5ndGggPiAwICYmIHVzZWRCbG9ja1NldHRpbmdBcnJheSAmJiB1c2VkQmxvY2tTZXR0aW5nQXJyYXkubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3NJbkNvbnRhaW5lci5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2sgPSBibG9ja3NJbkNvbnRhaW5lcltpXTsNCiAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrSWQgPSBjdXJyZW50QmxvY2sucXVlcnlTZWxlY3RvcignLicgKyBibG9ja19jbGFzc2VzLmpvaW4oJywgLicpKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKTsNCiAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbnRhaW5lciA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB1c2VkQmxvY2tTZXR0aW5nQXJyYXkubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VkQmxvY2tTZXR0aW5nQXJyYXlbaV1bJ2lkJ10gPT0gY3VycmVudEJsb2NrSWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2tQb3NpdGlvbiA9IHVzZWRCbG9ja1NldHRpbmdBcnJheVtpXVsnZWxlbWVudFBvc2l0aW9uJ107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbnRhaW5lciA9IGN1cnJlbnRCbG9jay5jbG9zZXN0KGJsVHlwZSArIGNvbnRhaW5lclN0cmluZyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCbG9ja1Bvc2l0aW9uID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjdXJyZW50QmxvY2ssIGN1cnJlbnRDb250YWluZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY3VycmVudEJsb2NrLCBjdXJyZW50Q29udGFpbmVyLm5leHRTaWJsaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBjcmVhdGVTdHlsZUVsZW1lbnQoYmxvY2tOdW1iZXIsIGxvY2FsRWxlbWVudENzcykgew0KICAgIGxldCBodG1sVG9BZGQgPSAnJzsNCiAgICBsZXQgbWFyZ2luU3RyaW5nOw0KICAgIGxldCB0ZXh0QWxpZ25TdHJpbmc7DQogICAgbGV0IGNvbnRQb2k7DQogICAgbGV0IGVtcHR5VmFsdWVzID0gZmFsc2U7DQogICAgbGV0IGVsZW1lbnRUb0FkZFN0eWxlTG9jYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmxvY2tzQWxpZ25TdHlsZScpOw0KICAgIGlmICghZWxlbWVudFRvQWRkU3R5bGVMb2NhbCkgew0KICAgICAgICBjb250UG9pID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NvbnRlbnRfcG9pbnRlcl9pZCcpOw0KICAgICAgICBpZiAoIWNvbnRQb2kpIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGVsZW1lbnRUb0FkZFN0eWxlTG9jYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOw0KICAgICAgICBlbGVtZW50VG9BZGRTdHlsZUxvY2FsLnNldEF0dHJpYnV0ZSgnaWQnLCAnYmxvY2tzQWxpZ25TdHlsZScpOw0KICAgICAgICBjb250UG9pLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnRUb0FkZFN0eWxlTG9jYWwsIGNvbnRQb2kpOw0KICAgIH0NCg0KICAgIHN3aXRjaCAobG9jYWxFbGVtZW50Q3NzKSB7DQogICAgICAgIGNhc2UgJ2xlZnQnOg0KICAgICAgICAgICAgZW1wdHlWYWx1ZXMgPSBmYWxzZTsNCiAgICAgICAgICAgIG1hcmdpblN0cmluZyA9ICcwIGF1dG8gMCAwJzsNCiAgICAgICAgICAgIHRleHRBbGlnblN0cmluZyA9ICdsZWZ0JzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdyaWdodCc6DQogICAgICAgICAgICBlbXB0eVZhbHVlcyA9IGZhbHNlOw0KICAgICAgICAgICAgbWFyZ2luU3RyaW5nID0gJzAgMCAwIGF1dG8nOw0KICAgICAgICAgICAgdGV4dEFsaWduU3RyaW5nID0gJ3JpZ2h0JzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdjZW50ZXInOg0KICAgICAgICAgICAgZW1wdHlWYWx1ZXMgPSBmYWxzZTsNCiAgICAgICAgICAgIG1hcmdpblN0cmluZyA9ICcwIGF1dG8nOw0KICAgICAgICAgICAgdGV4dEFsaWduU3RyaW5nID0gJ2NlbnRlcic7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnZGVmYXVsdCc6DQogICAgICAgICAgICBlbXB0eVZhbHVlcyA9IHRydWU7DQogICAgICAgICAgICBtYXJnaW5TdHJpbmcgPSAnZGVmYXVsdCc7DQogICAgICAgICAgICB0ZXh0QWxpZ25TdHJpbmcgPSAnZGVmYXVsdCc7DQogICAgICAgICAgICAvKiogaGVyZSB3aWxsIGJlIGNzcyAqLw0KICAgICAgICAgICAgYnJlYWs7DQogICAgfQ0KICAgIGlmICghZW1wdHlWYWx1ZXMpIHsNCiAgICAgICAgaHRtbFRvQWRkID0gJy5wZXJjZW50UG9pbnRlckNsYXNzICA+ICpbZGF0YS1pZD0iJytibG9ja051bWJlcisnIl0ge1xuJyArDQogICAgICAgICAgICAnICAgIG1hcmdpbjogJyttYXJnaW5TdHJpbmcrJztcbicgKw0KICAgICAgICAgICAgJ31cbic7DQogICAgfQ0KDQogICAgZWxlbWVudFRvQWRkU3R5bGVMb2NhbC5pbm5lckhUTUwgKz0gaHRtbFRvQWRkOw0KICAgIHJldHVybiB0ZXh0QWxpZ25TdHJpbmc7DQp9DQoNCmZ1bmN0aW9uIGluaXRUYXJnZXRUb0luc2VydChwb3NpdGlvbiwgdHlwZSwgY3VycmVudEVsZW1lbnQpIHsNCiAgICBsZXQgcG9zQ3VycmVudEVsZW1lbnQ7DQogICAgbGV0IHVzZWRFbGVtZW50Ow0KICAgIGlmICh0eXBlID09ICdlbGVtZW50Jykgew0KICAgICAgICBpZiAocG9zaXRpb24gPT0gMCkgew0KICAgICAgICAgICAgcG9zQ3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudDsNCiAgICAgICAgICAgIGlmICghKHR5cGVvZiBvYmxpZ2F0b3J5TWFyZ2luIT09J3VuZGVmaW5lZCcmJm9ibGlnYXRvcnlNYXJnaW49PT0xKSkgew0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Jmd3BfcmVtb3ZlZE1hcmdpblRvcCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcG9zQ3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5uZXh0U2libGluZzsNCiAgICAgICAgICAgIGlmICghKHR5cGVvZiBvYmxpZ2F0b3J5TWFyZ2luIT09J3VuZGVmaW5lZCcmJm9ibGlnYXRvcnlNYXJnaW49PT0xKSkgew0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Jmd3BfcmVtb3ZlZE1hcmdpbkJvdHRvbScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGN1cnJlbnRFbGVtZW50LnN0eWxlLmNsZWFyID0gJ2JvdGgnOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHVzZWRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQ7DQogICAgICAgIGlmIChwb3NpdGlvbiA9PSAwKSB7DQogICAgICAgICAgICBwb3NDdXJyZW50RWxlbWVudCA9IHVzZWRFbGVtZW50Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcG9zQ3VycmVudEVsZW1lbnQgPSB1c2VkRWxlbWVudC5uZXh0U2libGluZzsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gcG9zQ3VycmVudEVsZW1lbnQ7DQp9DQoNCmZ1bmN0aW9uIGNoZWNrQWRzV2lkdGgoY29udGVudF9wb2ludGVyLCBwb3NDdXJyZW50RWxlbWVudCwgY3VycmVudEVsZW1lbnQpIHsNCiAgICBsZXQgd2lkdGhDaGVja2VyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3dpZHRoQ2hlY2tlcicpOw0KICAgIGxldCB3aWR0aENoZWNrZXJTdHlsZSA9IG51bGw7DQogICAgbGV0IGNvbnRlbnRfcG9pbnRlclN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjb250ZW50X3BvaW50ZXIpOw0KICAgIC8qIGxldCBnZXRQb3NpdGlvbkZvclRlbXBFbGVtZW50ID0gbnVsbDsNCiAgICBsZXQgdGVzdEltZ0RldGVjdGVkID0gZmFsc2U7DQogICAgbGV0IHRlc3RJbWc7DQogICAgbGV0IHRlc3RJbWFnZUNvbXBXaWR0aDsNCiAgICBsZXQgdGVzdEltZ0NvdSA9IDANCiAgICBsZXQgZmlndXJlQ2hpbGRzOw0KICAgIGxldCBmaWd1cmVDb21XaWR0aDsNCiAgICBsZXQgZmNDb3UgPSAwOyAqLw0KICAgIGxldCBjb250ZW50ID0gY29udGVudF9wb2ludGVyLnBhcmVudEVsZW1lbnQ7DQoNCiAgICBpZiAoIXdpZHRoQ2hlY2tlcikgew0KICAgICAgICB3aWR0aENoZWNrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICAgICAgd2lkdGhDaGVja2VyLnNldEF0dHJpYnV0ZSgnaWQnLCd3aWR0aENoZWNrZXInKTsNCiAgICAgICAgd2lkdGhDaGVja2VyLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7DQogICAgfQ0KDQogICAgaWYgKGNvbnRlbnQpIHsNCiAgICAgICAgcG9zQ3VycmVudEVsZW1lbnQgPSBpbml0VGFyZ2V0VG9JbnNlcnQocG9zQ3VycmVudEVsZW1lbnQsICd0ZXJtJywgY3VycmVudEVsZW1lbnQpOw0KICAgICAgICBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh3aWR0aENoZWNrZXIsIHBvc0N1cnJlbnRFbGVtZW50KTsNCiAgICAgICAgd2lkdGhDaGVja2VyU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHdpZHRoQ2hlY2tlcik7DQogICAgICAgIC8qIHRlc3RJbWcgPSBjdXJyZW50RWxlbWVudC5wcmV2aW91c1NpYmxpbmc7DQogICAgICAgIGlmICh0ZXN0SW1nKSB7DQogICAgICAgICAgICB3aGlsZSAoIXRlc3RJbWdEZXRlY3RlZCYmdGVzdEltZ0NvdTw0KSB7DQogICAgICAgICAgICAgICAgaWYgKHRlc3RJbWcmJnRlc3RJbWcubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZpZ3VyZScpIHsNCiAgICAgICAgICAgICAgICAgICAgZmlndXJlQ29tV2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKHRlc3RJbWcpOw0KICAgICAgICAgICAgICAgICAgICBmaWd1cmVDb21XaWR0aCA9IHBhcnNlSW50KGZpZ3VyZUNvbVdpZHRoLndpZHRoKTsNCiAgICAgICAgICAgICAgICAgICAgZmlndXJlQ2hpbGRzID0gdGVzdEltZy5jaGlsZE5vZGVzOw0KICAgICAgICAgICAgICAgICAgICBpZiAoZmlndXJlQ2hpbGRzJiZmaWd1cmVDaGlsZHMubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCF0ZXN0SW1nRGV0ZWN0ZWQmJmZpZ3VyZUNoaWxkc1tmY0NvdV0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlndXJlQ2hpbGRzW2ZjQ291XSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEltZ0RldGVjdGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEltYWdlQ29tcFdpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZShmaWd1cmVDaGlsZHNbZmNDb3VdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEltYWdlQ29tcFdpZHRoID0gcGFyc2VJbnQodGVzdEltYWdlQ29tcFdpZHRoLndpZHRoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2ltZ19mX3c6JytmaWd1cmVDb21XaWR0aCsnOyBpbWdfdzonK3Rlc3RJbWFnZUNvbXBXaWR0aCsnOycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY0NvdSsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICh0ZXN0SW1nIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICB0ZXN0SW1nRGV0ZWN0ZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB0ZXN0SW1hZ2VDb21wV2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKHRlc3RJbWcpOw0KICAgICAgICAgICAgICAgICAgICB0ZXN0SW1hZ2VDb21wV2lkdGggPSBwYXJzZUludCh0ZXN0SW1hZ2VDb21wV2lkdGgud2lkdGgpOw0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnaW1nX3c6Jyt0ZXN0SW1hZ2VDb21wV2lkdGgrJzsnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCF0ZXN0SW1nLnByZXZpb3VzU2libGluZykgew0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGVzdEltZyA9IHRlc3RJbWcucHJldmlvdXNTaWJsaW5nOw0KICAgICAgICAgICAgICAgIHRlc3RJbWdDb3UrKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBjb25zb2xlLmxvZygnY3BfdzonK3BhcnNlSW50KGNvbnRlbnRfcG9pbnRlclN0eWxlLndpZHRoKSsnOyB3Y193OicrcGFyc2VJbnQod2lkdGhDaGVja2VyU3R5bGUud2lkdGgpKyc7Jyk7ICovDQogICAgICAgIGlmIChwYXJzZUludCh3aWR0aENoZWNrZXJTdHlsZS53aWR0aCkgPj0gKHBhcnNlSW50KGNvbnRlbnRfcG9pbnRlclN0eWxlLndpZHRoKSAtIDUwKSkgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICB9DQogICAgY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocmJfdGVtcEVsZW1lbnQsIGN1cnJlbnRFbGVtZW50Lm5leHRTaWJsaW5nKTsNCiAgICByYl90ZW1wRWxlbWVudF9jaGVjayA9IHRydWU7DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQovKiBmdW5jdGlvbiBjdXJyZW50RWxlbWVudFJlY2VpdmVyKHJldmVydCwgY3VyU3VtLCBlbExpc3QsIGN1cnJlbnRFbGVtZW50KSB7DQogICAgbGV0IG9yaWdDdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50Ow0KICAgIGxldCBjb250ZW50X3BvaW50ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjY29udGVudF9wb2ludGVyX2lkIik7DQogICAgbGV0IHNhbWVFbGVtZW50QWZ0ZXJXaWR0aCA9IGZhbHNlOw0KICAgIGxldCB0ZXN0Q291ID0gMDsNCiAgICB3aGlsZSAoZWxMaXN0W2N1clN1bV0mJnNhbWVFbGVtZW50QWZ0ZXJXaWR0aD09ZmFsc2UmJnRlc3RDb3UgPCA1KSB7DQogICAgICAgIGN1cnJlbnRFbGVtZW50ID0gZWxMaXN0W2N1clN1bV07DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICBzYW1lRWxlbWVudEFmdGVyV2lkdGg9dHJ1ZTsNCiAgICAgICAgICAgIHNhbWVFbGVtZW50QWZ0ZXJXaWR0aCA9IGNoZWNrQWRzV2lkdGgoY29udGVudF9wb2ludGVyLCAwLCBjdXJyZW50RWxlbWVudCk7DQogICAgICAgIH0gY2F0Y2ggKGV4KSB7DQogICAgICAgICAgICBjb25zb2xlLmxvZyhleC5tZXNzYWdlKTsNCiAgICAgICAgfQ0KICAgICAgICByZXZlcnQ/IGN1clN1bS0tOiBjdXJTdW0rKzsNCiAgICAgICAgdGVzdENvdSsrOw0KICAgIH0NCiAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ/Y3VycmVudEVsZW1lbnQ6b3JpZ0N1cnJlbnRFbGVtZW50Ow0KfSAqLw0KDQpmdW5jdGlvbiBjdXJyZW50RWxlbWVudFJlY2VpdmVyU3BlYyhyZXZlcnQsIGN1clN1bSwgZWxMaXN0LCBjdXJyZW50RWxlbWVudCkgew0KICAgIGxldCBvcmlnQ3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudDsNCiAgICBsZXQgY29udGVudF9wb2ludGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2NvbnRlbnRfcG9pbnRlcl9pZCIpOyAvKiBvcmlnICovDQogICAgbGV0IHNhbWVFbGVtZW50QWZ0ZXJXaWR0aCA9IGZhbHNlOw0KICAgIGxldCB0ZXN0Q291ID0gMDsNCiAgICB3aGlsZSAoZWxMaXN0W2N1clN1bV0mJnNhbWVFbGVtZW50QWZ0ZXJXaWR0aD09ZmFsc2UmJnRlc3RDb3UgPCA1KSB7DQogICAgICAgIGN1cnJlbnRFbGVtZW50ID0gZWxMaXN0W2N1clN1bV1bJ2VsZW1lbnQnXTsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIHNhbWVFbGVtZW50QWZ0ZXJXaWR0aD10cnVlOw0KICAgICAgICAgICAgc2FtZUVsZW1lbnRBZnRlcldpZHRoID0gY2hlY2tBZHNXaWR0aChjb250ZW50X3BvaW50ZXIsIDAsIGN1cnJlbnRFbGVtZW50KTsNCiAgICAgICAgfSBjYXRjaCAoZXgpIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4Lm1lc3NhZ2UpOw0KICAgICAgICB9DQogICAgICAgIHJldmVydD8gY3VyU3VtLS06IGN1clN1bSsrOw0KICAgICAgICB0ZXN0Q291Kys7DQogICAgfQ0KICAgIHJldHVybiBjdXJyZW50RWxlbWVudD9jdXJyZW50RWxlbWVudDpvcmlnQ3VycmVudEVsZW1lbnQ7DQp9DQoNCmZ1bmN0aW9uIGV4Y0lkQ2xVbnBhY2tlcigpIHsNCiAgICBsZXQgZXhjQXJyID0gW10sDQogICAgICAgIGNvdSA9IDAsDQogICAgICAgIGN1cnJFeGNTdHIgPSAnJywNCiAgICAgICAgY3VyRXhjRmlyc3QgPSAnJzsNCiAgICBleGNBcnJbJ2lkJ10gPSBbXTsNCiAgICBleGNBcnJbJ2NsYXNzJ10gPSBbXTsNCiAgICBleGNBcnJbJ3RhZyddID0gW107DQogICAgaWYgKGV4Y0lkQ2xhc3MmJmV4Y0lkQ2xhc3MubGVuZ3RoID4gMCkgew0KICAgICAgICB3aGlsZSAoZXhjSWRDbGFzc1tjb3VdKSB7DQogICAgICAgICAgICBjdXJyRXhjU3RyID0gZXhjSWRDbGFzc1tjb3VdOw0KICAgICAgICAgICAgaWYgKGN1cnJFeGNTdHIubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIGN1ckV4Y0ZpcnN0ID0gY3VyckV4Y1N0ci5zdWJzdHJpbmcoMCwxKTsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1ckV4Y0ZpcnN0KSB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJyMnOg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJFeGNTdHIubGVuZ3RoID4gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJFeGNTdHIgPSBjdXJyRXhjU3RyLnN1YnN0cmluZygxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNBcnJbJ2lkJ10ucHVzaChjdXJyRXhjU3RyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICcuJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyRXhjU3RyLmxlbmd0aCA+IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyRXhjU3RyID0gY3VyckV4Y1N0ci5zdWJzdHJpbmcoMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjQXJyWydjbGFzcyddLnB1c2goY3VyckV4Y1N0cik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y0FyclsndGFnJ10ucHVzaChjdXJyRXhjU3RyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjb3UrKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gZXhjQXJyOw0KfQ0KDQpmdW5jdGlvbiBhc3luY0Jsb2Nrc0luc2VydGluZ0Z1bmN0aW9uKGJsb2NrU2V0dGluZ0FycmF5KSB7DQogICAgdHJ5IHsNCiAgICAgICAgdmFyIGNvbnRlbnRfcG9pbnRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNjb250ZW50X3BvaW50ZXJfaWQiKTsgLyogb3JpZyAqLw0KICAgICAgICB2YXIgcGFyZW50X3dpdGhfY29udGVudCA9IGNvbnRlbnRfcG9pbnRlci5wYXJlbnRFbGVtZW50Ow0KICAgICAgICB2YXIgbG9yZE9mRWxlbWVudHMgPSBwYXJlbnRfd2l0aF9jb250ZW50Ow0KICAgICAgICBwYXJlbnRfd2l0aF9jb250ZW50ID0gcGFyZW50X3dpdGhfY29udGVudC5wYXJlbnRFbGVtZW50Ow0KICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICB2YXIgZWxlbWVudFRvQWRkOw0KICAgICAgICB2YXIgZWxlbWVudFRvQWRkU3R5bGU7DQogICAgICAgIHZhciBwb29sYmFja0kgPSAwOw0KICAgICAgICB2YXIgY291bnRlciA9IDA7DQogICAgICAgIHZhciBjdXJyZW50RWxlbWVudDsNCiAgICAgICAgdmFyIHJlcGVhdGFibGVDdXJyZW50RWxlbWVudDsNCiAgICAgICAgdmFyIHJlcGVhdGFibGVTdWNjZXNzOw0KICAgICAgICB2YXIgcmVDb3U7DQogICAgICAgIHZhciBjdXJGaXJzdFBsYWNlOw0KICAgICAgICB2YXIgY3VyRWxlbWVudENvdW50Ow0KICAgICAgICB2YXIgY3VyRWxlbWVudFN0ZXA7DQogICAgICAgIHZhciBiYWNrRWxlbWVudCA9IDA7DQogICAgICAgIHZhciBzdW1SZXN1bHQgPSAwOw0KICAgICAgICB2YXIgY3VyU3VtUmVzdWx0ID0gMDsNCiAgICAgICAgdmFyIHJlcGVhdCA9IGZhbHNlOw0KICAgICAgICB2YXIgY3VycmVudEVsZW1lbnRDaGVja2VyID0gZmFsc2U7DQogICAgICAgIGxldCBjb250YWluZXJGb3I2dGggPSBbXTsNCiAgICAgICAgbGV0IGNvbnRhaW5lckZvcjd0aCA9IFtdOw0KICAgICAgICB2YXIgcG9zQ3VycmVudEVsZW1lbnQ7DQogICAgICAgIHZhciBibG9ja19udW1iZXI7DQogICAgICAgIGxldCBjb250ZW50TGVuZ3RoID0gY29udGVudF9wb2ludGVyLmdldEF0dHJpYnV0ZSgnZGF0YS1jb250ZW50LWxlbmd0aCcpOw0KICAgICAgICBsZXQgcmVqZWN0ZWRCbG9ja3MgPSBjb250ZW50X3BvaW50ZXIuZ2V0QXR0cmlidXRlKCdkYXRhLXJlamVjdGVkLWJsb2NrcycpOw0KICAgICAgICBpZiAocmVqZWN0ZWRCbG9ja3MmJnJlamVjdGVkQmxvY2tzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIHJlamVjdGVkQmxvY2tzID0gcmVqZWN0ZWRCbG9ja3Muc3BsaXQoJywnKTsNCiAgICAgICAgfQ0KICAgICAgICBsZXQgd2lkdGhDaGVjayA9IGZhbHNlOw0KICAgICAgICBsZXQgY3VycmVudEVsZW1lbnRMaXN0Ow0KICAgICAgICB2YXIgdGVzdEVsZW1lbnQxID0gbnVsbDsNCiAgICAgICAgdmFyIHRlcm1vcmFyaXR5X3BhcmVudF93aXRoX2NvbnRlbnQgPSBwYXJlbnRfd2l0aF9jb250ZW50Ow0KICAgICAgICB2YXIgdGVybW9yYXJpdHlfcGFyZW50X3dpdGhfY29udGVudF9sZW5ndGggPSAwOw0KICAgICAgICB2YXIgaGVhZGVyc0xpc3QgPSBbJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2J107DQogICAgICAgIGZvciAodmFyIGhjMSA9IDA7IGhjMSA8IGhlYWRlcnNMaXN0Lmxlbmd0aDsgaGMxKyspIHsNCiAgICAgICAgICAgIHRlcm1vcmFyaXR5X3BhcmVudF93aXRoX2NvbnRlbnRfbGVuZ3RoICs9IHRlcm1vcmFyaXR5X3BhcmVudF93aXRoX2NvbnRlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaGVhZGVyc0xpc3RbaGMxXSkubGVuZ3RoOw0KICAgICAgICB9DQoNCiAgICAgICAgbGV0IGRldGFpbGVkRWxlbWVudExpc3Q7DQogICAgICAgIGxldCBFeGNTdHJDb3UgPSAxOw0KICAgICAgICBsZXQgZGV0YWlsZWRRdWVyeVN0cmluZzsNCiAgICAgICAgbGV0IHVzZWRFbGVtZW50Ow0KICAgICAgICBsZXQgdGFnTGlzdCA9IFtdOw0KICAgICAgICBsZXQgbG9jYWxTdW1SZXN1bHQ7DQogICAgICAgIGxldCBiaW5kZXJOYW1lOw0KDQogICAgICAgIHZhciByZW1vdmVDbGVhcmluZzsNCiAgICAgICAgdmFyIHJlcGVhdGFibGVCbG9ja0lkZW50aWZpZXIgPSAwOw0KDQogICAgICAgIHZhciBpOw0KDQogICAgICAgIGlmIChjb250ZW50TGVuZ3RoIDwgMSkgew0KICAgICAgICAgICAgY29udGVudExlbmd0aCA9IHBhcmVudF93aXRoX2NvbnRlbnQuaW5uZXJUZXh0Lmxlbmd0aA0KICAgICAgICB9DQoNCiAgICAgICAgcmJfdGVtcEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcmJfdGVtcEVsZW1lbnQnKTsNCiAgICAgICAgaWYgKCFyYl90ZW1wRWxlbWVudCkgew0KICAgICAgICAgICAgcmJfdGVtcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQogICAgICAgICAgICByYl90ZW1wRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgJ3JiX3RlbXBFbGVtZW50Jyk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBnZXRGcm9tQ29uc3RydWN0aW9ucyhjdXJyZW50RWxlbWVudCkgew0KICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICJibG9ja3F1b3RlIikgew0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDsNCiAgICAgICAgICAgICAgICAvKiBpbml0VGFyZ2V0VG9JbnNlcnQoYmxvY2tTZXR0aW5nQXJyYXksICdlbGVtZW50JywgY3VycmVudEVsZW1lbnQpOyAqLw0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHJiX3RlbXBFbGVtZW50LCBjdXJyZW50RWxlbWVudCk7DQogICAgICAgICAgICAgICAgcmJfdGVtcEVsZW1lbnRfY2hlY2sgPSB0cnVlOw0KICAgICAgICAgICAgICAgIHNhbWVFbGVtZW50QWZ0ZXJGcm9tQ29uc3RydWN0aW9uPWZhbHNlOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChbInRyIiwidGQiLCJ0aCIsInRoZWFkIiwidGJvZHkiLCJ0YWJsZSJdLmluY2x1ZGVzKGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSkgew0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDsNCiAgICAgICAgICAgICAgICB3aGlsZSAoWyJ0ciIsInRkIiwidGgiLCJ0aGVhZCIsInRib2R5IiwidGFibGUiXS5pbmNsdWRlcyhjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyYl90ZW1wRWxlbWVudCwgY3VycmVudEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgIHJiX3RlbXBFbGVtZW50X2NoZWNrID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBzYW1lRWxlbWVudEFmdGVyRnJvbUNvbnN0cnVjdGlvbj1mYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudDsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIGRpcmVjdENsYXNzRWxlbWVudERldGVjdGluZyhibG9ja1NldHRpbmdBcnJheSwgZGlyZWN0RWxlbWVudCkgew0KICAgICAgICAgICAgbGV0IGZpbmRRdWVyeSA9IDA7DQogICAgICAgICAgICBsZXQgZGlyZWN0Q2xhc3NFbGVtZW50UmVzdWx0ID0gW107DQoNCiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChkaXJlY3RFbGVtZW50KTsNCiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWydlbGVtZW50UGxhY2UnXSA+IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lmxlbmd0aCA+PSBibG9ja1NldHRpbmdBcnJheVtpXVsnZWxlbWVudFBsYWNlJ10pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnRbYmxvY2tTZXR0aW5nQXJyYXlbaV1bJ2VsZW1lbnRQbGFjZSddLTFdOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRFbGVtZW50Lmxlbmd0aCA8IGJsb2NrU2V0dGluZ0FycmF5W2ldWydlbGVtZW50UGxhY2UnXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudFtjdXJyZW50RWxlbWVudC5sZW5ndGggLSAxXTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRRdWVyeSA9IDE7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWydlbGVtZW50UGxhY2UnXSA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50RWxlbWVudC5sZW5ndGggKyBibG9ja1NldHRpbmdBcnJheVtpXVsnZWxlbWVudFBsYWNlJ10gKyAxKSA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnRbY3VycmVudEVsZW1lbnQubGVuZ3RoICsgYmxvY2tTZXR0aW5nQXJyYXlbaV1bJ2VsZW1lbnRQbGFjZSddXTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRRdWVyeSA9IDE7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBmaW5kUXVlcnkgPSAxOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZmluZFF1ZXJ5ID0gMTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZGlyZWN0Q2xhc3NFbGVtZW50UmVzdWx0WydmaW5kUXVlcnknXSA9IGZpbmRRdWVyeTsNCiAgICAgICAgICAgIGRpcmVjdENsYXNzRWxlbWVudFJlc3VsdFsnY3VycmVudEVsZW1lbnQnXSA9IGN1cnJlbnRFbGVtZW50Ow0KDQogICAgICAgICAgICByZXR1cm4gZGlyZWN0Q2xhc3NFbGVtZW50UmVzdWx0Ow0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gcGxhY2luZ1RvSDEodXNlZEVsZW1lbnQsIGVsZW1lbnRUYWdUb0ZpbmQpIHsNCiAgICAgICAgICAgIGxldCB1c2VsZXNzTGV0Ow0KICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSB1c2VkRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKGVsZW1lbnRUYWdUb0ZpbmQpOw0KDQogICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQubGVuZ3RoIDwgMSkgew0KICAgICAgICAgICAgICAgIGlmICh1c2VkRWxlbWVudC5wYXJlbnRFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgICAgIHVzZWxlc3NMZXQgPSBwbGFjaW5nVG9IMSh1c2VkRWxlbWVudC5wYXJlbnRFbGVtZW50LCBlbGVtZW50VGFnVG9GaW5kKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBlbGVtZW50c0NsZWFuaW5nKGV4Y0FyciwgZWxMaXN0LCBwd2NMb2NhbCwgZ2F0aGVyU3RyaW5nKSB7DQogICAgICAgICAgICBsZXQgbWFya2VkQ2xhc3MgPSAncmJfbV9pbmMnOw0KICAgICAgICAgICAgbGV0IG1hcmtlZENsYXNzQmFkID0gJ3JiX21fZXhjJzsNCiAgICAgICAgICAgIGxldCBjb3UgPSAwOw0KICAgICAgICAgICAgbGV0IGNvdTEgPSAwOw0KICAgICAgICAgICAgbGV0IGZpbmFsQXJyID0gW107DQogICAgICAgICAgICBsZXQgZmluYWxBcnJDbGVhciA9IFtdOw0KICAgICAgICAgICAgbGV0IGNoZWNrTmVhcmVzdDsNCiAgICAgICAgICAgIGxldCBvdXRPZlJhbmdlQ2hlY2s7DQogICAgICAgICAgICBsZXQgZ2F0aGVyUmVqZWN0ZWQ7DQogICAgICAgICAgICBsZXQgYWxsb3dlcjsNCg0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICB3aGlsZSAoZWxMaXN0W2NvdV0pIHsNCiAgICAgICAgICAgICAgICAgICAgYWxsb3dlciA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIGlmICghZWxMaXN0W2NvdV0uY2xhc3NMaXN0LmNvbnRhaW5zKG1hcmtlZENsYXNzQmFkKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y0FyciYmZXhjQXJyLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3UxID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZXhjQXJyW2NvdTFdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTmVhcmVzdCA9IGVsTGlzdFtjb3VdLnBhcmVudEVsZW1lbnQuY2xvc2VzdChleGNBcnJbY291MV0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tOZWFyZXN0KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja05lYXJlc3QuY2xhc3NMaXN0LmFkZCgnY3VyckNsb3Nlc3QnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dE9mUmFuZ2VDaGVjayA9IHB3Y0xvY2FsLnF1ZXJ5U2VsZWN0b3IoJy5jdXJyQ2xvc2VzdCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dE9mUmFuZ2VDaGVjaykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZXIgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja05lYXJlc3QuY2xhc3NMaXN0LmFkZChtYXJrZWRDbGFzcyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F0aGVyUmVqZWN0ZWQgPSBjaGVja05lYXJlc3QucXVlcnlTZWxlY3RvckFsbChnYXRoZXJTdHJpbmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYXRoZXJSZWplY3RlZC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkxID0gMDsgaTEgPCBnYXRoZXJSZWplY3RlZC5sZW5ndGg7IGkxKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdGhlclJlamVjdGVkW2kxXS5jbGFzc0xpc3QuYWRkKG1hcmtlZENsYXNzQmFkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTmVhcmVzdC5jbGFzc0xpc3QucmVtb3ZlKCdjdXJyQ2xvc2VzdCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdTErKzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlcj09PXRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbExpc3RbY291XS5jbGFzc0xpc3QuYWRkKG1hcmtlZENsYXNzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaW5hbEFyci5wdXNoKGVsTGlzdFtjb3VdKTsgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb3UrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZmluYWxBcnIgPSBwd2NMb2NhbC5xdWVyeVNlbGVjdG9yQWxsKCcuJyttYXJrZWRDbGFzcysnOm5vdCgnK21hcmtlZENsYXNzQmFkKycpJyk7DQogICAgICAgICAgICAgICAgZmluYWxBcnJDbGVhciA9IHB3Y0xvY2FsLnF1ZXJ5U2VsZWN0b3JBbGwoJy4nK21hcmtlZENsYXNzKycsLicrbWFya2VkQ2xhc3NCYWQpOw0KICAgICAgICAgICAgICAgIGlmIChmaW5hbEFyckNsZWFyJiZmaW5hbEFyckNsZWFyLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaTEgPSAwOyBpMSA8IGZpbmFsQXJyQ2xlYXIubGVuZ3RoOyBpMSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmaW5hbEFyckNsZWFyW2kxXS5jbGFzc0xpc3QucmVtb3ZlKG1hcmtlZENsYXNzLG1hcmtlZENsYXNzQmFkKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gY2F0Y2ggKGVyKSB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXIubWVzc2FnZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZmluYWxBcnI7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBjdXJlZW50RWxlbWVudHNHYXRoZXIodXNlZEVsZW1lbnQsIGxvb3BMaW1pdCA9IDIsIGxvY2FsUHdjID0gcGFyZW50X3dpdGhfY29udGVudCkgew0KICAgICAgICAgICAgbGV0IGN1ckVsZW1lbnRTZWFyY2hSZXBlYXRlciA9IHRydWU7DQogICAgICAgICAgICBsZXQgY3VyRWxlbWVudFNlYXJjaENvdW50ZXIgPSAwOw0KICAgICAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50TG9jID0gbnVsbDsNCiAgICAgICAgICAgIGxldCBFeGNsdWRlZFN0cmluZ0JlZ2luID0gJyc7DQogICAgICAgICAgICBsZXQgRXhjbHVkZWRTdHJpbmcgPSAnJzsNCiAgICAgICAgICAgIGxldCBFeGNsdWRlZFN0cmluZ0VuZCA9ICcnOw0KICAgICAgICAgICAgbGV0IHRhZ0xpc3RTdHJpbmcgPSAnJzsNCiAgICAgICAgICAgIGxldCB0YWdMaXN0U3RyaW5nRXhjID0gJyc7DQogICAgICAgICAgICBsZXQgY291ID0gMDsNCiAgICAgICAgICAgIC8qIGxldCBleGNBcnIgPSBleGNJZENsVW5wYWNrZXIoKTsgKi8NCiAgICAgICAgICAgIGxldCB0YWdMaXN0Q291ID0gMDsNCg0KICAgICAgICAgICAgaWYgKHVzZWRFbGVtZW50PT0naDEnKSB7DQogICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRMb2MgPSBwbGFjaW5nVG9IMShsb2NhbFB3YywgdXNlZEVsZW1lbnQpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBpZiAodXNlZEVsZW1lbnQ9PSdoMi00Jykge3RhZ0xpc3QgPSBbJ2gyJywnaDMnLCdoMyddO30NCiAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAge3RhZ0xpc3QgPSBbdXNlZEVsZW1lbnRdOyAgIH0NCiAgICAgICAgICAgICAgICB3aGlsZSAodGFnTGlzdFt0YWdMaXN0Q291XSkgew0KICAgICAgICAgICAgICAgICAgICB0YWdMaXN0U3RyaW5nICs9ICgoY291Kys+MCk/JywnOicnKSt0YWdMaXN0W3RhZ0xpc3RDb3VdOw0KICAgICAgICAgICAgICAgICAgICB0YWdMaXN0U3RyaW5nRXhjICs9ICc6bm90KCcrdGFnTGlzdFt0YWdMaXN0Q291XSsnKSc7DQogICAgICAgICAgICAgICAgICAgIHRhZ0xpc3RDb3UrKzsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBFeGNsdWRlZFN0cmluZyA9ICcnOw0KICAgICAgICAgICAgICAgIGlmIChleGNJZENsYXNzJiZleGNJZENsYXNzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IGV4Y0lkQ2xhc3MubGVuZ3RoOyBpMisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhjSWRDbGFzc1tpMl0ubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1ZGVkU3RyaW5nICs9IChpMj4wPycsJzonJykrZXhjSWRDbGFzc1tpMl0rdGFnTGlzdFN0cmluZ0V4YzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBkZXRhaWxlZFF1ZXJ5U3RyaW5nICs9IHRhZ0xpc3RTdHJpbmcrJywnK0V4Y2x1ZGVkU3RyaW5nOw0KDQogICAgICAgICAgICAgICAgLyogY29uc29sZS5sb2coZGV0YWlsZWRRdWVyeVN0cmluZyk7ICovDQogICAgICAgICAgICAgICAgd2hpbGUgKGN1ckVsZW1lbnRTZWFyY2hSZXBlYXRlciYmY3VyRWxlbWVudFNlYXJjaENvdW50ZXIgPCBsb29wTGltaXQpIHsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50TG9jID0gbG9jYWxQd2MucXVlcnlTZWxlY3RvckFsbCh0YWdMaXN0U3RyaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZTEpIHtjb25zb2xlLmxvZyhlMS5tZXNzYWdlKTt9DQogICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudEVsZW1lbnRMb2MpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFB3Yy5wYXJlbnRFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxQd2MgPSBsb2NhbFB3Yy5wYXJlbnRFbGVtZW50Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50TG9jID0gZWxlbWVudHNDbGVhbmluZyhleGNJZENsYXNzLCBjdXJyZW50RWxlbWVudExvYywgbG9jYWxQd2MsIGRldGFpbGVkUXVlcnlTdHJpbmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY3VyRWxlbWVudFNlYXJjaFJlcGVhdGVyID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY3VyRWxlbWVudFNlYXJjaENvdW50ZXIrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnRMb2M7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBjdXJyZW50RWxlbWVudFJlY2VpdmVyKHJldmVydCwgbG9jYWxDdXJFbCA9IGN1cnJlbnRFbGVtZW50KSB7DQogICAgICAgICAgICBsZXQgb3JpZ0N1ckVsID0gbG9jYWxDdXJFbDsNCiAgICAgICAgICAgIGN1clN1bVJlc3VsdCA9IHN1bVJlc3VsdDsNCiAgICAgICAgICAgIGRldGFpbGVkRWxlbWVudExpc3QgPSBsb2NhbEN1ckVsOw0KICAgICAgICAgICAgc2FtZUVsZW1lbnRBZnRlcldpZHRoID0gZmFsc2U7DQogICAgICAgICAgICBsZXQgdGVzdENvdSA9IDA7DQogICAgICAgICAgICB3aGlsZSAoZGV0YWlsZWRFbGVtZW50TGlzdFtjdXJTdW1SZXN1bHRdJiZzYW1lRWxlbWVudEFmdGVyV2lkdGg9PWZhbHNlJiZ0ZXN0Q291IDwgOCkgew0KICAgICAgICAgICAgICAgIGxvY2FsQ3VyRWwgPSBkZXRhaWxlZEVsZW1lbnRMaXN0W2N1clN1bVJlc3VsdF07DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgc2FtZUVsZW1lbnRBZnRlcldpZHRoPXRydWU7DQogICAgICAgICAgICAgICAgICAgIHNhbWVFbGVtZW50QWZ0ZXJXaWR0aCA9IGNoZWNrQWRzV2lkdGgoY29udGVudF9wb2ludGVyLCBibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudFBvc2l0aW9uIl0sIGxvY2FsQ3VyRWwpOw0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4Lm1lc3NhZ2UpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXZlcnQ/IGN1clN1bVJlc3VsdC0tOiBjdXJTdW1SZXN1bHQrKzsNCiAgICAgICAgICAgICAgICB0ZXN0Q291Kys7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobG9jYWxDdXJFbCkgew0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Q2hlY2tlciA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbG9jYWxDdXJFbD9sb2NhbEN1ckVsOm9yaWdDdXJFbDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgZnVuY3Rpb24gZW5kaW5nQWN0aW9ucyhibG9ja19udW1iZXIpIHsNCiAgICAgICAgICAgIHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcy5wdXNoKGJsb2NrX251bWJlcik7DQogICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheS5zcGxpY2UoaS0tLCAxKTsNCiAgICAgICAgICAgIHBvb2xiYWNrSSA9IDE7DQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tTZXR0aW5nQXJyYXkubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gbnVsbDsNCiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Q2hlY2tlciA9IGZhbHNlOw0KICAgICAgICAgICAgc2FtZUVsZW1lbnRBZnRlcldpZHRoID0gZmFsc2U7DQogICAgICAgICAgICBzYW1lRWxlbWVudEFmdGVyRXhjQ2xhc3NJZCA9IGZhbHNlOw0KICAgICAgICAgICAgc2FtZUVsZW1lbnRBZnRlckZyb21Db25zdHJ1Y3Rpb24gPSBmYWxzZTsNCiAgICAgICAgICAgIHRhZ0xpc3RDb3UgPSAwOw0KICAgICAgICAgICAgcG9vbGJhY2tJID0gMDsNCiAgICAgICAgICAgIGRldGFpbGVkUXVlcnlTdHJpbmcgPSAnJzsNCiAgICAgICAgICAgIGJpbmRlck5hbWUgPSBlbGVtZW50QmluZGVyTmFtZUdlbmVyYXRvcigpOw0KDQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGlmICghYmxvY2tTZXR0aW5nQXJyYXlbaV1bInRleHQiXQ0KICAgICAgICAgICAgICAgICAgICB8fChibG9ja1NldHRpbmdBcnJheVtpXVsidGV4dCJdJiZibG9ja1NldHRpbmdBcnJheVtpXVsidGV4dCJdLmxlbmd0aCA8IDEpDQogICAgICAgICAgICAgICAgICAgIHx8KHJlamVjdGVkQmxvY2tzJiZyZWplY3RlZEJsb2Nrcy5pbmNsdWRlcyhibG9ja1NldHRpbmdBcnJheVtpXVsiaWQiXSkpDQogICAgICAgICAgICAgICAgICAgIHx8KChibG9ja1NldHRpbmdBcnJheVtpXVsibWF4SGVhZGVycyJdID4gMCkmJihibG9ja1NldHRpbmdBcnJheVtpXVsibWF4SGVhZGVycyJdIDwgcGFyc2VJbnQodGVybW9yYXJpdHlfcGFyZW50X3dpdGhfY29udGVudF9sZW5ndGgpKSkNCiAgICAgICAgICAgICAgICAgICAgfHwoKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJtYXhTeW1ib2xzIl0gPiAwKSYmKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJtYXhTeW1ib2xzIl0gPCBwYXJzZUludChjb250ZW50TGVuZ3RoKSkpDQogICAgICAgICAgICAgICAgICAgIHx8KGNvbnRlbnRfcG9pbnRlci5jbGFzc0xpc3QuY29udGFpbnMoImhhcmQtY29udGVudCIpJiZibG9ja1NldHRpbmdBcnJheVtpXVsic2V0dGluZ190eXBlIl0hPTMpDQogICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5LnNwbGljZShpLS0sIDEpOw0KICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBibG9ja19udW1iZXIgPSAwOw0KDQogICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmNsYXNzTGlzdC5hZGQoInBlcmNlbnRQb2ludGVyQ2xhc3MiKTsNCiAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LmFkZCgibWFya2VkIik7DQogICAgICAgICAgICAgICAgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJzYyJdPT0xKSB7DQogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QuYWRkKCJzY01hcmsiKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmlubmVySFRNTCA9IGJsb2NrU2V0dGluZ0FycmF5W2ldWyJ0ZXh0Il07DQogICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmRhdGFzZXQucmJpbmRlciA9IGJpbmRlck5hbWU7DQogICAgICAgICAgICAgICAgYmxvY2tfbnVtYmVyID0gZWxlbWVudFRvQWRkLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXNbJ2RhdGEtaWQnXS52YWx1ZTsNCg0KICAgICAgICAgICAgICAgIGlmIChibG9ja0R1cGxpY2F0ZSA9PSAnbm8nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaTEgPSAwOyBpMSA8IHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcy5sZW5ndGg7IGkxKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tfbnVtYmVyPT11c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHNbaTFdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5LnNwbGljZShpLS0sIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9vbGJhY2tJID09IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZFN0eWxlID0gY3JlYXRlU3R5bGVFbGVtZW50KGJsb2NrX251bWJlciwgYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRDc3MiXSk7DQoNCiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFRvQWRkU3R5bGUmJmVsZW1lbnRUb0FkZFN0eWxlIT0nZGVmYXVsdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLnN0eWxlLnRleHRBbGlnbiA9IGVsZW1lbnRUb0FkZFN0eWxlOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICgoYmxvY2tTZXR0aW5nQXJyYXlbaV1bIm1pbkhlYWRlcnMiXSA+IDApJiYoYmxvY2tTZXR0aW5nQXJyYXlbaV1bIm1pbkhlYWRlcnMiXSA+IHRlcm1vcmFyaXR5X3BhcmVudF93aXRoX2NvbnRlbnRfbGVuZ3RoKSkge2NvbnRpbnVlO30NCiAgICAgICAgICAgICAgICBpZiAoYmxvY2tTZXR0aW5nQXJyYXlbaV1bIm1pblN5bWJvbHMiXSA+IGNvbnRlbnRMZW5ndGgpIHtjb250aW51ZTt9DQoNCiAgICAgICAgICAgICAgICBpZiAoYmxvY2tTZXR0aW5nQXJyYXlbaV1bInNldHRpbmdfdHlwZSJdID09IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJlZW50RWxlbWVudHNHYXRoZXIoYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnQiXS50b0xvd2VyQ2FzZSgpKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRQbGFjZSJdIDwgMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bVJlc3VsdCA9IGN1cnJlbnRFbGVtZW50Lmxlbmd0aCArIGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50UGxhY2UiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VtUmVzdWx0ID49IDAgJiYgc3VtUmVzdWx0IDwgY3VycmVudEVsZW1lbnQubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnRSZWNlaXZlcih0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bVJlc3VsdCA9IGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50UGxhY2UiXSAtIDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1bVJlc3VsdCA8IGN1cnJlbnRFbGVtZW50Lmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50UmVjZWl2ZXIoZmFsc2UpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQgIT0gdW5kZWZpbmVkICYmIGN1cnJlbnRFbGVtZW50ICE9IG51bGwgJiYgY3VycmVudEVsZW1lbnRDaGVja2VyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwb3NDdXJyZW50RWxlbWVudCA9IGluaXRUYXJnZXRUb0luc2VydChibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudFBvc2l0aW9uIl0sICdlbGVtZW50JywgY3VycmVudEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudFRvQWRkLCBwb3NDdXJyZW50RWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdyYmluZGVyLScrYmluZGVyTmFtZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LnJlbW92ZSgnY292ZXJlZEFkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXkuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmJfdGVtcEVsZW1lbnRfY2hlY2sgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYmxvY2tTZXR0aW5nQXJyYXlbaV1bInNldHRpbmdfdHlwZSJdID09IDIpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrRHVwbGljYXRlID09ICdubycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50Q291bnQiXSA9IDE7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmVwZWF0YWJsZUN1cnJlbnRFbGVtZW50ID0gW107DQogICAgICAgICAgICAgICAgICAgIHJlQ291ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgY3VyRmlyc3RQbGFjZSA9IGJsb2NrU2V0dGluZ0FycmF5W2ldWyJmaXJzdFBsYWNlIl07DQogICAgICAgICAgICAgICAgICAgIGN1ckVsZW1lbnRDb3VudCA9IGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50Q291bnQiXTsNCiAgICAgICAgICAgICAgICAgICAgY3VyRWxlbWVudFN0ZXAgPSBibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudFN0ZXAiXTsNCiAgICAgICAgICAgICAgICAgICAgcmVwZWF0YWJsZVN1Y2Nlc3MgPSBmYWxzZTsNCg0KICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGRTdHlsZSA9IGNyZWF0ZVN0eWxlRWxlbWVudChibG9ja19udW1iZXIsIGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50Q3NzIl0pOw0KDQogICAgICAgICAgICAgICAgICAgIHJlcGVhdGFibGVDdXJyZW50RWxlbWVudCA9IGN1cmVlbnRFbGVtZW50c0dhdGhlcihibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudCJdLnRvTG93ZXJDYXNlKCkpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmVwZWF0YWJsZUN1cnJlbnRFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpMSA9IDA7IGkxIDwgYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRDb3VudCJdOyBpMSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRDaGVja2VyID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcEVsZW1lbnRUb0FkZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcEVsZW1lbnRUb0FkZC5jbGFzc0xpc3QuYWRkKCJwZXJjZW50UG9pbnRlckNsYXNzIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwRWxlbWVudFRvQWRkLmNsYXNzTGlzdC5hZGQoIm1hcmtlZCIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9ja1NldHRpbmdBcnJheVtpXVsic2MiXT09MSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBFbGVtZW50VG9BZGQuY2xhc3NMaXN0LmFkZCgic2NNYXJrIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcEVsZW1lbnRUb0FkZC5jbGFzc0xpc3QuYWRkKCJyZXBlYXRhYmxlLW1hcmstIityZXBlYXRhYmxlQmxvY2tJZGVudGlmaWVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBFbGVtZW50VG9BZGQuaW5uZXJIVE1MID0gYmxvY2tTZXR0aW5nQXJyYXlbaV1bInRleHQiXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50VG9BZGRTdHlsZSYmZWxlbWVudFRvQWRkU3R5bGUhPSdkZWZhdWx0Jykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBFbGVtZW50VG9BZGQuc3R5bGUudGV4dEFsaWduID0gZWxlbWVudFRvQWRkU3R5bGU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtUmVzdWx0ID0gTWF0aC5yb3VuZChwYXJzZUludChibG9ja1NldHRpbmdBcnJheVtpXVsiZmlyc3RQbGFjZSJdKSArIChpMSpwYXJzZUludChibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudFN0ZXAiXSkpIC0gMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1bVJlc3VsdCA8IHJlcGVhdGFibGVDdXJyZW50RWxlbWVudC5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudFJlY2VpdmVyKGZhbHNlLCByZXBlYXRhYmxlQ3VycmVudEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudCAhPSB1bmRlZmluZWQgJiYgY3VycmVudEVsZW1lbnQgIT0gbnVsbCAmJiBjdXJyZW50RWxlbWVudENoZWNrZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zQ3VycmVudEVsZW1lbnQgPSBpbml0VGFyZ2V0VG9JbnNlcnQoYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRQb3NpdGlvbiJdLCAnZWxlbWVudCcsIGN1cnJlbnRFbGVtZW50KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocmVwRWxlbWVudFRvQWRkLCBwb3NDdXJyZW50RWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3JiaW5kZXItJytiaW5kZXJOYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwRWxlbWVudFRvQWRkLmNsYXNzTGlzdC5yZW1vdmUoJ2NvdmVyZWRBZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJGaXJzdFBsYWNlID0gc3VtUmVzdWx0ICsgcGFyc2VJbnQoYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRTdGVwIl0pICsgMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyRWxlbWVudENvdW50LS07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGFibGVTdWNjZXNzID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRhYmxlU3VjY2VzcyA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGVhdGFibGVTdWNjZXNzPT10cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXkuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0YWJsZUJsb2NrSWRlbnRpZmllcisrOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFibG9ja1NldHRpbmdBcnJheVtpXVsidW5zdWNjZXNzIl0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheVtpXVsidW5zdWNjZXNzIl0gPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheVtpXVsidW5zdWNjZXNzIl0gPSBNYXRoLnJvdW5kKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJ1bnN1Y2Nlc3MiXSArIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJ1bnN1Y2Nlc3MiXSA+IDEwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzLnB1c2goYmxvY2tfbnVtYmVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheS5zcGxpY2UoaS0tLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheVtpXVsiZmlyc3RQbGFjZSJdID0gY3VyRmlyc3RQbGFjZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudENvdW50Il0gPSBjdXJFbGVtZW50Q291bnQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRTdGVwIl0gPSBjdXJFbGVtZW50U3RlcDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJzZXR0aW5nX3R5cGUiXSA9PSAzKSB7DQogICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50VHlwZVN5bWJvbCA9ICcnOw0KICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudFNwYWNlU3ltYm9sID0gJyc7DQogICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50TmFtZSA9ICcnOw0KICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudFR5cGUgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRUYWcgID0gJyc7DQogICAgICAgICAgICAgICAgICAgIGxldCBmaW5kUXVlcnkgPSAwOw0KICAgICAgICAgICAgICAgICAgICBsZXQgZGlyZWN0Q2xhc3NSZXN1bHQgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGRpcmVjdEVsZW1lbnQgPSBibG9ja1NldHRpbmdBcnJheVtpXVsiZGlyZWN0RWxlbWVudCJdLnRyaW0oKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0RWxlbWVudC5zZWFyY2goJyMnKSA+IC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmaW5kUXVlcnkgPSAxOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChkaXJlY3RFbGVtZW50LnNlYXJjaCgnIycpIDwgMCkmJihkaXJlY3RFbGVtZW50LnNlYXJjaCgnLicpID4gLTEpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RDbGFzc1Jlc3VsdCA9IGRpcmVjdENsYXNzRWxlbWVudERldGVjdGluZyhibG9ja1NldHRpbmdBcnJheSwgZGlyZWN0RWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICBmaW5kUXVlcnkgPSBkaXJlY3RDbGFzc1Jlc3VsdFsnZmluZFF1ZXJ5J107DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGRpcmVjdENsYXNzUmVzdWx0WydjdXJyZW50RWxlbWVudCddOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChmaW5kUXVlcnkgPT0gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGRpcmVjdEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRDaGVja2VyID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudCAhPSB1bmRlZmluZWQgJiYgY3VycmVudEVsZW1lbnQgIT0gbnVsbCAmJiBjdXJyZW50RWxlbWVudENoZWNrZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBvc0N1cnJlbnRFbGVtZW50ID0gaW5pdFRhcmdldFRvSW5zZXJ0KGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50UG9zaXRpb24iXSwgJ2VsZW1lbnQnLCBjdXJyZW50RWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtZW50VG9BZGQsIHBvc0N1cnJlbnRFbGVtZW50KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QucmVtb3ZlKCdjb3ZlcmVkQWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3JiaW5kZXItJytiaW5kZXJOYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcy5wdXNoKGJsb2NrX251bWJlcik7DQogICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheS5zcGxpY2UoaS0tLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xiYWNrSSA9IDE7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXBlYXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJzZXR0aW5nX3R5cGUiXSA9PSA0KSB7DQogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNjb250ZW50X3BvaW50ZXJfaWQiKS5wYXJlbnRFbGVtZW50LmFwcGVuZChlbGVtZW50VG9BZGQpOw0KICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheS5zcGxpY2UoaS0tLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYmxvY2tTZXR0aW5nQXJyYXlbaV1bInNldHRpbmdfdHlwZSJdID09IDUpIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50TGlzdCA9IGN1cmVlbnRFbGVtZW50c0dhdGhlcigncCcsIDEsIGNvbnRlbnRfcG9pbnRlci5wYXJlbnRFbGVtZW50KTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50TGlzdCYmY3VycmVudEVsZW1lbnRMaXN0Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwQ291bnQgPSBjdXJyZW50RWxlbWVudExpc3QubGVuZ3RoOw0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnROdW1iZXIgPSBNYXRoLnJvdW5kKHBDb3VudC8yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ291bnQgPiAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudExpc3RbZWxlbWVudE51bWJlcisxXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudCAhPSB1bmRlZmluZWQgJiYgY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ291bnQgPiAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnRUb0FkZCwgY3VycmVudEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnRUb0FkZCwgY3VycmVudEVsZW1lbnQubmV4dFNpYmxpbmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LnJlbW92ZSgnY292ZXJlZEFkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncmJpbmRlci0nK2JpbmRlck5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcy5wdXNoKGJsb2NrX251bWJlcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXkuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYmxvY2tTZXR0aW5nQXJyYXlbaV1bInNldHRpbmdfdHlwZSJdID09IDYpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lckZvcjZ0aC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbnRhaW5lckZvcjZ0aC5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGb3I2dGhbal1bImVsZW1lbnRQbGFjZSJdPmJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50UGxhY2UiXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aW51ZTsgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gY29udGFpbmVyRm9yNnRoLmxlbmd0aC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJGb3I2dGgucHVzaChibG9ja1NldHRpbmdBcnJheVtpXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2VkQWRCbG9ja3NBcnJheS5wdXNoKGNoZWNrSWZCbG9ja1VzZWQpOyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzLnB1c2goYmxvY2tfbnVtYmVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5LnNwbGljZShpLS0sIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IGNvbnRhaW5lckZvcjZ0aC5sZW5ndGgtMTsgayA+IGotMTsgay0tKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJGb3I2dGhbayArIDFdID0gY29udGFpbmVyRm9yNnRoW2tdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckZvcjZ0aFtqXSA9IGJsb2NrU2V0dGluZ0FycmF5W2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2VkQWRCbG9ja3NBcnJheS5wdXNoKGNoZWNrSWZCbG9ja1VzZWQpOyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheS5zcGxpY2UoaS0tLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRm9yNnRoLnB1c2goYmxvY2tTZXR0aW5nQXJyYXlbaV0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzLnB1c2goYmxvY2tfbnVtYmVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5LnNwbGljZShpLS0sIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8qIHZpZHByYXZ1dHUgdiB2aWRzdGlpbnVrIGRseWEgNmhvIHRpcGEgKi8NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYmxvY2tTZXR0aW5nQXJyYXlbaV1bInNldHRpbmdfdHlwZSJdID09IDcpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lckZvcjd0aC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbnRhaW5lckZvcjd0aC5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGb3I3dGhbal1bImVsZW1lbnRQbGFjZSJdPmJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50UGxhY2UiXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aW51ZTsgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gY29udGFpbmVyRm9yN3RoLmxlbmd0aC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJGb3I3dGgucHVzaChibG9ja1NldHRpbmdBcnJheVtpXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXkuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gY29udGFpbmVyRm9yN3RoLmxlbmd0aC0xOyBrID4gai0xOyBrLS0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckZvcjd0aFtrICsgMV0gPSBjb250YWluZXJGb3I3dGhba107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRm9yN3RoW2pdID0gYmxvY2tTZXR0aW5nQXJyYXlbaV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcy5wdXNoKGJsb2NrX251bWJlcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5LnNwbGljZShpLS0sIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJGb3I3dGgucHVzaChibG9ja1NldHRpbmdBcnJheVtpXSk7DQogICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXkuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLyogdmlkcHJhdnV0dSB2IHZpZHN0aWludWsgZGx5YSA3aG8gdGlwYSAqLw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGFycmF5ID0gdGV4dExlbmd0aEdhdGhlcmVyKGxvcmRPZkVsZW1lbnRzKSwNCiAgICAgICAgICAgIHRsQXJyYXkgPSBhcnJheS5hcnJheSwNCiAgICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsNCg0KICAgICAgICBpZiAoY29udGFpbmVyRm9yNnRoLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIHBlcmNlbnRJbnNlcnRlcihsb3JkT2ZFbGVtZW50cywgY29udGFpbmVyRm9yNnRoLCB0bEFycmF5LCBsZW5ndGgpOw0KICAgICAgICB9DQogICAgICAgIGlmIChjb250YWluZXJGb3I3dGgubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgc3ltYm9sSW5zZXJ0ZXIobG9yZE9mRWxlbWVudHMsIGNvbnRhaW5lckZvcjd0aCwgdGxBcnJheSk7DQogICAgICAgIH0NCiAgICAgICAgc2hvcnRjb2Rlc0luc2VydCgpOw0KICAgICAgICBsZXQgc3RvcHBlciA9IDA7DQoNCiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBpZiAocmVwZWF0ID0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAvKiBhc3luY0Jsb2Nrc0luc2VydGluZ0Z1bmN0aW9uKGJsb2NrU2V0dGluZ0FycmF5LCBjb250ZW50TGVuZ3RoKSAqLw0KICAgICAgICAgICAgICAgICAgICBhc3luY0Jsb2Nrc0luc2VydGluZ0Z1bmN0aW9uKGJsb2NrU2V0dGluZ0FycmF5KTsNCiAgICAgICAgICAgICAgICB9LCAxMDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9IGNhdGNoIChlKSB7DQogICAgICAgIGNvbnNvbGUubG9nKGUubWVzc2FnZSk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBwb3NzaWJsZVRhZ3NJbkNoZWNrQ29uZmlybWVyKHBvc3NpYmxlVGFnc0FycmF5LCBwb3NzaWJsZVRhZ3NJbkNoZWNrKSB7DQogICAgaWYgKHBvc3NpYmxlVGFnc0FycmF5LmluY2x1ZGVzKCJMSSIpKSB7DQogICAgICAgIGlmIChwb3NzaWJsZVRhZ3NBcnJheS5pbmNsdWRlcygiVUwiKSkgew0KICAgICAgICAgICAgcG9zc2libGVUYWdzSW5DaGVjay5wdXNoKCJVTCIpOw0KICAgICAgICB9DQogICAgICAgIGlmIChwb3NzaWJsZVRhZ3NBcnJheS5pbmNsdWRlcygiT0wiKSkgew0KICAgICAgICAgICAgcG9zc2libGVUYWdzSW5DaGVjay5wdXNoKCJPTCIpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiB0ZXh0TGVuZ3RoR2F0aGVyZXIobG9yZE9mRWxlbWVudHNMb2MpIHsNCiAgICB2YXIgcG9zc2libGVUYWdzQXJyYXk7DQogICAgaWYgKHR5cGVvZiB0YWdzTGlzdEZvclRleHRMZW5ndGghPT0idW5kZWZpbmVkIikgew0KICAgICAgICBwb3NzaWJsZVRhZ3NBcnJheSA9IHRhZ3NMaXN0Rm9yVGV4dExlbmd0aDsNCiAgICB9IGVsc2Ugew0KICAgICAgICBwb3NzaWJsZVRhZ3NBcnJheSA9IFsiUCIsICJIMSIsICJIMiIsICJIMyIsICJINCIsICJINSIsICJINiIsICJESVYiLCAiQkxPQ0tRVU9URSIsICJJTkRFWCIsICJBUlRJQ0xFIiwgIlNFQ1RJT04iXTsNCiAgICB9DQogICAgbGV0IHBvc3NpYmxlVGFnc0luQ2hlY2sgPSBbIkRJViIsICJJTkRFWCIsICJTRUNUSU9OIl07DQoNCiAgICBwb3NzaWJsZVRhZ3NJbkNoZWNrQ29uZmlybWVyKHBvc3NpYmxlVGFnc0FycmF5LCBwb3NzaWJsZVRhZ3NJbkNoZWNrKTsNCiAgICBsZXQgZXhjQXJyID0gZXhjSWRDbFVucGFja2VyKCksDQogICAgICAgIHRleHRMZW5ndGggPSAwLA0KICAgICAgICB0bEFycmF5ID0gW107DQoNCiAgICBmdW5jdGlvbiB0ZXh0TGVuZ3RoR2F0aGVyZXJSZWMobG9yZE9mRWxlbWVudHNMb2MpIHsNCiAgICAgICAgbGV0IGFsbG93ZWQ7DQogICAgICAgIGxldCBjb3UxOw0KICAgICAgICBsZXQgY2xhc3Nlc0FycmF5Ow0KICAgICAgICBsZXQgY291bnRTdWNjZXNzID0gMDsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBpZiAocG9zc2libGVUYWdzQXJyYXkuaW5jbHVkZXMobG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0udGFnTmFtZSkNCiAgICAgICAgICAgICAgICAgICAgJiYhbG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0uY2xhc3NMaXN0LmNvbnRhaW5zKCJwZXJjZW50UG9pbnRlckNsYXNzIikNCiAgICAgICAgICAgICAgICAgICAgJiZsb3JkT2ZFbGVtZW50c0xvYy5jaGlsZHJlbltpXS5pZCE9InRvY19jb250YWluZXIiDQogICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChwb3NzaWJsZVRhZ3NJbkNoZWNrLmluY2x1ZGVzKGxvcmRPZkVsZW1lbnRzTG9jLmNoaWxkcmVuW2ldLnRhZ05hbWUpDQogICAgICAgICAgICAgICAgICAgICAgICAmJihsb3JkT2ZFbGVtZW50c0xvYy5jaGlsZHJlbltpXS5jaGlsZHJlbi5sZW5ndGggPiAwKQ0KICAgICAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvcmRPZkVsZW1lbnRzTG9jLmNoaWxkcmVuW2ldLmlkJiZleGNBcnJbJ2lkJ10ubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdTEgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChleGNBcnJbJ2lkJ11bY291MV0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvcmRPZkVsZW1lbnRzTG9jLmNoaWxkcmVuW2ldLmlkLnRvTG93ZXJDYXNlKCk9PWV4Y0FyclsnaWQnXVtjb3UxXS50b0xvd2VyQ2FzZSgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3UxKys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0uY2xhc3NMaXN0Lmxlbmd0aCA+IDAmJmV4Y0FyclsnY2xhc3MnXS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291MSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGV4Y0FyclsnY2xhc3MnXVtjb3UxXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzQXJyYXkgPSBleGNBcnJbJ2NsYXNzJ11bY291MV0uc3BsaXQoJy4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzZXNBcnJheS5ldmVyeShjbGFzc05hbWUgPT4gbG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0uY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3UxKys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhjQXJyWyd0YWcnXS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291MSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGV4Y0FyclsndGFnJ11bY291MV0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvcmRPZkVsZW1lbnRzTG9jLmNoaWxkcmVuW2ldLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09ZXhjQXJyWyd0YWcnXVtjb3UxXS50b0xvd2VyQ2FzZSgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3UxKys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0TGVuZ3RoR2F0aGVyZXJSZWMobG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0sIGV4Y0FyciwgcG9zc2libGVUYWdzQXJyYXksIHBvc3NpYmxlVGFnc0luQ2hlY2spKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50U3VjY2VzcysrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdGV4dExlbmd0aCA9IHRleHRMZW5ndGggKyBsb3JkT2ZFbGVtZW50c0xvYy5jaGlsZHJlbltpXS5pbm5lclRleHQubGVuZ3RoOw0KICAgICAgICAgICAgICAgICAgICB0bEFycmF5LnB1c2goew0KICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiBsb3JkT2ZFbGVtZW50c0xvYy5jaGlsZHJlbltpXS50YWdOYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBsb3JkT2ZFbGVtZW50c0xvYy5jaGlsZHJlbltpXS5pbm5lclRleHQubGVuZ3RoLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoU3VtOiB0ZXh0TGVuZ3RoLA0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogbG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0NCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIGNvdW50U3VjY2VzcysrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBjYXRjaCAoZXIpIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyLm1lc3NhZ2UpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBjb3VudFN1Y2Nlc3MgPiAwOw0KICAgIH0NCg0KICAgIHRleHRMZW5ndGhHYXRoZXJlclJlYyhsb3JkT2ZFbGVtZW50c0xvYyk7DQoNCiAgICByZXR1cm4ge2FycmF5OiB0bEFycmF5LCBsZW5ndGg6IHRleHRMZW5ndGh9Ow0KfQ0KDQp3aW5kb3cuYXN5bmNGdW5jdGlvbkxhdW5jaGVyID0gZnVuY3Rpb24oKSB7DQogICAgaWYgKHdpbmRvdy5qc0lucHV0ZXJMYXVuY2ggIT09IHVuZGVmaW5lZA0KICAgICAgICAmJlsxNSwgMTBdLmluY2x1ZGVzKHdpbmRvdy5qc0lucHV0ZXJMYXVuY2gpDQogICAgICAgICYmKHR5cGVvZiBhc3luY0Jsb2Nrc0luc2VydGluZ0Z1bmN0aW9uICE9PSAndW5kZWZpbmVkJyApDQogICAgICAgICYmKHR5cGVvZiBhc3luY0Jsb2Nrc0luc2VydGluZ0Z1bmN0aW9uID09PSAnZnVuY3Rpb24nKQ0KICAgICAgICAmJnR5cGVvZiBlbmRlZFNjIT09J3VuZGVmaW5lZCcmJg0KICAgICAgICB0eXBlb2YgZW5kZWRDYyE9PSd1bmRlZmluZWQnJiYNCiAgICAgICAgdHlwZW9mIHVzZWRBZEJsb2Nrc0FycmF5IT09J3VuZGVmaW5lZCcmJg0KICAgICAgICB0eXBlb2YgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzIT09J3VuZGVmaW5lZCcmJg0KICAgICAgICB0eXBlb2Ygc2FtZUVsZW1lbnRBZnRlcldpZHRoIT09J3VuZGVmaW5lZCcmJg0KICAgICAgICB0eXBlb2Ygc2FtZUVsZW1lbnRBZnRlckV4Y0NsYXNzSWQhPT0ndW5kZWZpbmVkJyYmDQogICAgICAgIHR5cGVvZiBzYW1lRWxlbWVudEFmdGVyRnJvbUNvbnN0cnVjdGlvbiE9PSd1bmRlZmluZWQnJiYNCiAgICAgICAgdHlwZW9mIHJiX3RlbXBFbGVtZW50X2NoZWNrIT09J3VuZGVmaW5lZCcmJg0KICAgICAgICB0eXBlb2YgcmJfdGVtcEVsZW1lbnQhPT0ndW5kZWZpbmVkJyYmDQogICAgICAgIHR5cGVvZiB3aW5kb3cuanNJbnB1dGVyTGF1bmNoIT09J3VuZGVmaW5lZCcpIHsNCiAgICAgICAgLyogYXN5bmNCbG9ja3NJbnNlcnRpbmdGdW5jdGlvbihibG9ja1NldHRpbmdBcnJheSwgY29udGVudExlbmd0aCk7ICovDQogICAgICAgIGFzeW5jQmxvY2tzSW5zZXJ0aW5nRnVuY3Rpb24oYmxvY2tTZXR0aW5nQXJyYXkpOw0KICAgICAgICBpZiAoIWVuZGVkU2MpIHsNCiAgICAgICAgICAgIHNob3J0Y29kZXNJbnNlcnQoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWVuZGVkQ2MpIHsNCiAgICAgICAgICAgIC8qIGNsZWFyVW5zdWl0YWJsZUNhY2hlKDApOyAqLw0KICAgICAgICB9DQogICAgICAgIC8qIGJsb2Nrc1JlcG9zaXRpb24oKTsNCiAgICAgICAgY2FjaGVQbGFjaW5nKCk7DQogICAgICAgIHN5bWJvbE1hcmtlcnNQbGFjZWQoKTsgKi8NCiAgICB9IGVsc2Ugew0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGFzeW5jRnVuY3Rpb25MYXVuY2hlcigpOw0KICAgICAgICB9LCA1MCk7DQogICAgfQ0KfTsNCi8qIGFzeW5jRnVuY3Rpb25MYXVuY2hlcigpOyAqLw0KDQpmdW5jdGlvbiBhc3luY0luc2VydGluZ3NJbnNlcnRpbmdGdW5jdGlvbihpbnNlcnRpbmdzQXJyYXkpIHsNCiAgICBsZXQgY3VycmVudEVsZW1lbnRGb3JJbnNlcnRpbmcgPSAwOw0KICAgIGxldCBjdXJyZW50RWxlbWVudFRvTW92ZSA9IDA7DQogICAgbGV0IHBvc2l0aW9uRWxlbWVudCA9IDA7DQogICAgbGV0IHBvc2l0aW9uID0gMDsNCiAgICBsZXQgaW5zZXJ0VG9BZGQgPSAwOw0KICAgIGxldCBwb3N0SWQgPSAwOw0KICAgIGxldCByZXBlYXRTZWFyY2ggPSAwOw0KICAgIGlmIChpbnNlcnRpbmdzQXJyYXkmJmluc2VydGluZ3NBcnJheS5sZW5ndGggPiAwKSB7DQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zZXJ0aW5nc0FycmF5Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIWluc2VydGluZ3NBcnJheVtpXVsndXNlZCddfHwoaW5zZXJ0aW5nc0FycmF5W2ldWyd1c2VkJ10mJmluc2VydGluZ3NBcnJheVtpXVsndXNlZCddPT0wKSkgew0KICAgICAgICAgICAgICAgIHBvc2l0aW9uRWxlbWVudCA9IGluc2VydGluZ3NBcnJheVtpXVsncG9zaXRpb25fZWxlbWVudCddOw0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gaW5zZXJ0aW5nc0FycmF5W2ldWydwb3NpdGlvbiddOw0KICAgICAgICAgICAgICAgIGluc2VydFRvQWRkID0gaW5zZXJ0aW5nc0FycmF5W2ldWydjb250ZW50J107DQogICAgICAgICAgICAgICAgcG9zdElkID0gaW5zZXJ0aW5nc0FycmF5W2ldWydwb3N0SWQnXTsNCg0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Rm9ySW5zZXJ0aW5nID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihwb3NpdGlvbkVsZW1lbnQpOw0KDQogICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRUb01vdmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY292ZXJlZEluc2VydGluZ3NbZGF0YS1pZD0iJytwb3N0SWQrJyJdJyk7DQogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Rm9ySW5zZXJ0aW5nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbj09MCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRGb3JJbnNlcnRpbmcucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY3VycmVudEVsZW1lbnRUb01vdmUsIGN1cnJlbnRFbGVtZW50Rm9ySW5zZXJ0aW5nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50VG9Nb3ZlLmNsYXNzTGlzdC5yZW1vdmUoJ2NvdmVyZWRJbnNlcnRpbmdzJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpbmdzQXJyYXlbaV1bJ3VzZWQnXSA9IDE7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudEZvckluc2VydGluZy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjdXJyZW50RWxlbWVudFRvTW92ZSwgY3VycmVudEVsZW1lbnRGb3JJbnNlcnRpbmcubmV4dFNpYmxpbmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRUb01vdmUuY2xhc3NMaXN0LnJlbW92ZSgnY292ZXJlZEluc2VydGluZ3MnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGluZ3NBcnJheVtpXVsndXNlZCddID0gMTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJlcGVhdFNlYXJjaCA9IDE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChyZXBlYXRTZWFyY2ggPT0gMSkgew0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGFzeW5jSW5zZXJ0aW5nc0luc2VydGluZ0Z1bmN0aW9uKGluc2VydGluZ3NBcnJheSk7DQogICAgICAgIH0sIDEwMCkNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGluc2VydGluZ3NGdW5jdGlvbkxhdW5jaCgpIHsNCiAgICBpZiAod2luZG93LmpzSW5zZXJ0aW5nc0xhdW5jaCAhPT0gdW5kZWZpbmVkJiZqc0luc2VydGluZ3NMYXVuY2ggPT0gMjUpIHsNCiAgICAgICAgYXN5bmNJbnNlcnRpbmdzSW5zZXJ0aW5nRnVuY3Rpb24oaW5zZXJ0aW5nc0FycmF5KTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGluc2VydGluZ3NGdW5jdGlvbkxhdW5jaCgpOw0KICAgICAgICB9LCAxMDApDQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBzZXRMb25nQ2FjaGUoKSB7DQogICAgbGV0IHhodHRwID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQogICAgbGV0IHNlbmREYXRhID0gJ2FjdGlvbj1zZXRMb25nQ2FjaGUmdHlwZT1sb25nQ2F0Y2hpbmcnOw0KICAgIHhodHRwLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKHJlZGF0YSkgew0KICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IDQgJiYgdGhpcy5zdGF0dXMgPT0gMjAwKSB7DQogICAgICAgICAgICBjb25zb2xlLmxvZygnbG9uZyBjYWNoZSBkZXBsb3llZCcpOw0KICAgICAgICB9DQogICAgfTsNCiAgICB4aHR0cC5vcGVuKCJQT1NUIiwgcmJfYWpheHVybCwgdHJ1ZSk7DQogICAgeGh0dHAuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOw0KICAgIHhodHRwLnNlbmQoc2VuZERhdGEpOw0KfQ0KDQpmdW5jdGlvbiBjYWNoZVBsYWNpbmcoYWxlcnRfdHlwZSwgZXJyb3JJbmZvPW51bGwpIHsNCiAgICBsZXQgYWRCbG9ja3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGVyY2VudFBvaW50ZXJDbGFzcyAuJyArIGJsb2NrX2NsYXNzZXMuam9pbignLCAucGVyY2VudFBvaW50ZXJDbGFzcyAuJykpOw0KICAgIGxldCBjdXJBZEJsb2NrOw0KICAgIGxldCBva1N0YXRlcyA9IFsnZG9uZScsJ3JlZnJlc2gtd2FpdCcsJ25vLWJsb2NrJywnZmV0Y2hlZCddOw0KICAgIC8qIGxldCBhZElkID0gLTE7ICovDQogICAgbGV0IGJsb2NrQWlkID0gbnVsbDsNCiAgICBsZXQgYmxvY2tJZDsNCg0KICAgIGlmICh0eXBlb2YgY2FjaGVkQmxvY2tzQXJyYXkgIT09ICd1bmRlZmluZWQnJiZjYWNoZWRCbG9ja3NBcnJheSYmY2FjaGVkQmxvY2tzQXJyYXkubGVuZ3RoID4gMCYmYWRCbG9ja3MmJmFkQmxvY2tzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZEJsb2Nrcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgYmxvY2tBaWQgPSBhZEJsb2Nrc1tpXVsnZGF0YXNldCddWydhaWQnXTsNCg0KICAgICAgICAgICAgaWYgKCFibG9ja0FpZCkgew0KICAgICAgICAgICAgICAgIGJsb2NrSWQgPSBhZEJsb2Nrc1tpXVsnZGF0YXNldCddWydpZCddOw0KICAgICAgICAgICAgICAgIGlmIChjYWNoZWRCbG9ja3NBcnJheVtibG9ja0lkXSkgew0KICAgICAgICAgICAgICAgICAgICBqUXVlcnkoYWRCbG9ja3NbaV0pLmh0bWwoY2FjaGVkQmxvY2tzQXJyYXlbYmxvY2tJZF0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmIChhbGVydF90eXBlJiZhbGVydF90eXBlPT0naGlnaCcpIHsNCiAgICAgICAgc2V0TG9uZ0NhY2hlKCk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBzeW1ib2xJbnNlcnRlcihsb3JkT2ZFbGVtZW50cywgY29udGFpbmVyRm9yN3RoLCB0bEFycmF5KSB7DQogICAgdHJ5IHsNCiAgICAgICAgdmFyIGN1cnJlbnRDaGlsZHJlbkxlbmd0aCA9IDA7DQogICAgICAgIGxldCBwcmV2aW91c0JyZWFrID0gMDsNCiAgICAgICAgbGV0IG5lZWRsZUxlbmd0aDsNCiAgICAgICAgbGV0IGN1cnJlbnRTdW1MZW5ndGg7DQogICAgICAgIGxldCBlbGVtZW50VG9BZGQ7DQogICAgICAgIGxldCBlbGVtZW50VG9CaW5kOw0KICAgICAgICBsZXQgZWxlbWVudFRvQWRkU3R5bGU7DQogICAgICAgIGxldCBibG9ja19udW1iZXI7DQogICAgICAgIGxldCBiaW5kZXJOYW1lOw0KDQogICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1hcmtlZFNwYW4xIikpIHsNCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGFpbmVyRm9yN3RoLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgcHJldmlvdXNCcmVhayA9IDA7DQogICAgICAgICAgICAgICAgY3VycmVudENoaWxkcmVuTGVuZ3RoID0gMDsNCiAgICAgICAgICAgICAgICBjdXJyZW50U3VtTGVuZ3RoID0gMDsNCiAgICAgICAgICAgICAgICBuZWVkbGVMZW5ndGggPSBNYXRoLmFicyhjb250YWluZXJGb3I3dGhbaV1bJ2VsZW1lbnRQbGFjZSddKTsNCiAgICAgICAgICAgICAgICBiaW5kZXJOYW1lID0gZWxlbWVudEJpbmRlck5hbWVHZW5lcmF0b3IoKTsNCg0KICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QuYWRkKCJwZXJjZW50UG9pbnRlckNsYXNzIik7DQogICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmNsYXNzTGlzdC5hZGQoIm1hcmtlZCIpOw0KICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGb3I3dGhbaV1bInNjIl09PTEpIHsNCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmNsYXNzTGlzdC5hZGQoInNjTWFyayIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuZGF0YXNldC5yYmluZGVyID0gYmluZGVyTmFtZTsNCiAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuaW5uZXJIVE1MID0gY29udGFpbmVyRm9yN3RoW2ldWyJ0ZXh0Il07DQogICAgICAgICAgICAgICAgYmxvY2tfbnVtYmVyID0gZWxlbWVudFRvQWRkLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXNbJ2RhdGEtaWQnXS52YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRUb0FkZCkgew0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGRTdHlsZSA9IGNyZWF0ZVN0eWxlRWxlbWVudChibG9ja19udW1iZXIsIGNvbnRhaW5lckZvcjd0aFtpXVsiZWxlbWVudENzcyJdKTsNCg0KICAgICAgICAgICAgICAgIGlmIChlbGVtZW50VG9BZGRTdHlsZSYmZWxlbWVudFRvQWRkU3R5bGUhPSdkZWZhdWx0Jykgew0KICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuc3R5bGUudGV4dEFsaWduID0gZWxlbWVudFRvQWRkU3R5bGU7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lckZvcjd0aFtpXVsnZWxlbWVudFBsYWNlJ10gPCAwKSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSB0bEFycmF5Lmxlbmd0aC0xOyBqID4gLTE7IGotLSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN1bUxlbmd0aCA9IGN1cnJlbnRTdW1MZW5ndGggKyB0bEFycmF5W2pdWydsZW5ndGgnXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkbGVMZW5ndGggPCBjdXJyZW50U3VtTGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZCA9IHRsQXJyYXlbal1bJ2VsZW1lbnQnXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9CaW5kID0gY3VycmVudEVsZW1lbnRSZWNlaXZlclNwZWModHJ1ZSwgaiwgdGxBcnJheSwgZWxlbWVudFRvQmluZCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtZW50VG9BZGQsIGVsZW1lbnRUb0JpbmQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQuY2xhc3NMaXN0LmFkZCgncmJpbmRlci0nK2JpbmRlck5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QucmVtb3ZlKCdjb3ZlcmVkQWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyRm9yN3RoW2ldWydlbGVtZW50UGxhY2UnXSA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQgPSB0bEFycmF5WzBdWydlbGVtZW50J107DQogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudFRvQWRkLCBlbGVtZW50VG9CaW5kKTsNCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZC5jbGFzc0xpc3QuYWRkKCdyYmluZGVyLScrYmluZGVyTmFtZSk7DQogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QucmVtb3ZlKCdjb3ZlcmVkQWQnKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRsQXJyYXkubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdW1MZW5ndGggPSBjdXJyZW50U3VtTGVuZ3RoICsgdGxBcnJheVtqXVsnbGVuZ3RoJ107DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVlZGxlTGVuZ3RoIDwgY3VycmVudFN1bUxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQgPSB0bEFycmF5W2pdWydlbGVtZW50J107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZCA9IGN1cnJlbnRFbGVtZW50UmVjZWl2ZXJTcGVjKGZhbHNlLCBqLCB0bEFycmF5LCBlbGVtZW50VG9CaW5kKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9CaW5kLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnRUb0FkZCwgZWxlbWVudFRvQmluZC5uZXh0U2libGluZyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZC5jbGFzc0xpc3QuYWRkKCdyYmluZGVyLScrYmluZGVyTmFtZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmNsYXNzTGlzdC5yZW1vdmUoJ2NvdmVyZWRBZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgc3Bhbk1hcmtlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsNCiAgICAgICAgICAgIHNwYW5NYXJrZXIuc2V0QXR0cmlidXRlKCJpZCIsICJtYXJrZWRTcGFuMSIpOw0KICAgICAgICAgICAgbG9yZE9mRWxlbWVudHMucHJlcGVuZChzcGFuTWFya2VyKTsNCiAgICAgICAgfQ0KICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgY29uc29sZS5sb2coZSk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBwZXJjZW50SW5zZXJ0ZXIobG9yZE9mRWxlbWVudHMsIGNvbnRhaW5lckZvcjZ0aCwgdGxBcnJheSwgdGV4dExlbmd0aCkgew0KICAgIHRyeSB7DQogICAgICAgIHZhciB0ZXh0TmVlZHlMZW5ndGggPSAwOw0KICAgICAgICBsZXQgZWxlbWVudFRvQWRkOw0KICAgICAgICB2YXIgZWxlbWVudFRvQmluZDsNCiAgICAgICAgbGV0IGVsZW1lbnRUb0FkZFN0eWxlOw0KICAgICAgICBsZXQgYmxvY2tfbnVtYmVyOw0KICAgICAgICB2YXIgYmluZGVyTmFtZTsNCiAgICAgICAgLyogdmFyIGNoZWNrSWZCbG9ja1VzZWQgPSAwOyAqLw0KDQogICAgICAgIGZ1bmN0aW9uIGluc2VydEJ5UGVyY2VudHModGV4dExlbmd0aCkgew0KICAgICAgICAgICAgbGV0IGxvY2FsTWlkZGxlVmFsdWUgPSAwOw0KDQogICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbnRhaW5lckZvcjZ0aC5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgIHRleHROZWVkeUxlbmd0aCA9IE1hdGgucm91bmQodGV4dExlbmd0aCAqIChjb250YWluZXJGb3I2dGhbal1bImVsZW1lbnRQbGFjZSJdLzEwMCkpOw0KICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGxBcnJheS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAodGxBcnJheVtpXVsnbGVuZ3RoU3VtJ10gPj0gdGV4dE5lZWR5TGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBiaW5kZXJOYW1lID0gZWxlbWVudEJpbmRlck5hbWVHZW5lcmF0b3IoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LmFkZCgicGVyY2VudFBvaW50ZXJDbGFzcyIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmNsYXNzTGlzdC5hZGQoIm1hcmtlZCIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lckZvcjZ0aFtqXVsic2MiXT09MSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QuYWRkKCJzY01hcmsiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5kYXRhc2V0LnJiaW5kZXIgPSBiaW5kZXJOYW1lOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmlubmVySFRNTCA9IGNvbnRhaW5lckZvcjZ0aFtqXVsidGV4dCJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50VG9BZGQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX251bWJlciA9IGVsZW1lbnRUb0FkZC5jaGlsZHJlblswXS5hdHRyaWJ1dGVzWydkYXRhLWlkJ10udmFsdWU7DQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGRTdHlsZSA9IGNyZWF0ZVN0eWxlRWxlbWVudChibG9ja19udW1iZXIsIGNvbnRhaW5lckZvcjZ0aFtqXVsiZWxlbWVudENzcyJdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50VG9BZGRTdHlsZSYmZWxlbWVudFRvQWRkU3R5bGUhPSdkZWZhdWx0Jykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5zdHlsZS50ZXh0QWxpZ24gPSBlbGVtZW50VG9BZGRTdHlsZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxNaWRkbGVWYWx1ZSA9IHRsQXJyYXlbaV1bJ2xlbmd0aFN1bSddIC0gTWF0aC5yb3VuZCh0bEFycmF5W2ldWydsZW5ndGgnXS8yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQgPSB0bEFycmF5W2ldWydlbGVtZW50J107DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudFJlY2VpdmVyU3BlYyhmYWxzZSwgaSwgdGxBcnJheSwgZWxlbWVudFRvQmluZCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dE5lZWR5TGVuZ3RoIDwgbG9jYWxNaWRkbGVWYWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudFRvQWRkLCBlbGVtZW50VG9CaW5kKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtZW50VG9BZGQsIGVsZW1lbnRUb0JpbmQubmV4dFNpYmxpbmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZC5jbGFzc0xpc3QuYWRkKCdyYmluZGVyLScrYmluZGVyTmFtZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LnJlbW92ZSgnY292ZXJlZEFkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIGNsZWFyVGxNYXJrcygpIHsNCiAgICAgICAgICAgIGxldCBtYXJrc0ZvckRlbGV0aW5nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRleHRMZW5ndGhNYXJrZXInKTsNCg0KICAgICAgICAgICAgaWYgKG1hcmtzRm9yRGVsZXRpbmcubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya3NGb3JEZWxldGluZy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBtYXJrc0ZvckRlbGV0aW5nW2ldLnJlbW92ZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1hcmtlZFNwYW4iKSkgew0KICAgICAgICAgICAgaW5zZXJ0QnlQZXJjZW50cyh0ZXh0TGVuZ3RoKTsNCiAgICAgICAgICAgIGNsZWFyVGxNYXJrcygpOw0KICAgICAgICAgICAgdmFyIHNwYW5NYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7DQogICAgICAgICAgICBzcGFuTWFya2VyLnNldEF0dHJpYnV0ZSgiaWQiLCAibWFya2VkU3BhbiIpOw0KICAgICAgICAgICAgbG9yZE9mRWxlbWVudHMucHJlcGVuZChzcGFuTWFya2VyKTsNCiAgICAgICAgfQ0KICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgY29uc29sZS5sb2coZS5tZXNzYWdlKTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIHNhdmVDb250ZW50QmxvY2soY29udGVudENvbnRhaW5lcikgew0KICAgIHRyeSB7DQogICAgICAgIGlmICghZ2F0aGVyX2NvbnRlbnQpIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb250ZW50IGdhdGhlciBzYXZlIGZ1bmN0aW9uIGVudGVyZWQnKTsNCiAgICAgICAgICAgIGxldCB4aHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOw0KICAgICAgICAgICAgbGV0IHNlbmREYXRhID0gJ2FjdGlvbj1SRldQX3NhdmVDb250ZW50Q29udGFpbmVyJnR5cGU9Z2F0aGVyQ29udGVudEJsb2NrJmRhdGE9Jytjb250ZW50Q29udGFpbmVyOw0KICAgICAgICAgICAgeGh0dHAub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24ocmVkYXRhKSB7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSA0ICYmIHRoaXMuc3RhdHVzID09IDIwMCkgew0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29udGVudCBnYXRoZXIgc3VjY2VlZCcpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb250ZW50IGdhdGhlciBnb25lIHdyb25nJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHhodHRwLm9wZW4oIlBPU1QiLCByYl9hamF4dXJsLCB0cnVlKTsNCiAgICAgICAgICAgIHhodHRwLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsNCiAgICAgICAgICAgIHhodHRwLnNlbmQoc2VuZERhdGEpOw0KICAgICAgICB9DQogICAgfSBjYXRjaCAoZXIpIHsNCiAgICAgICAgY29uc29sZS5sb2coJ2NvbnRlbnQgZ2F0aGVyIGVycm9yOiAnK2VyKyc7Jyk7DQogICAgfQ0KfQ0KDQp3aW5kb3cuZ2F0aGVyQ29udGVudEJsb2NrID0gZnVuY3Rpb24oKSB7DQogICAgbGV0IGNQb2ludGVyID0gbnVsbCwNCiAgICAgICAgY1BvaW50ZXJQYXJlbnQgPSBudWxsLA0KICAgICAgICBjUG9pbnRlclBhcmVudFN0cmluZyA9IG51bGwsDQogICAgICAgIGNsYXNzV29yZHMgPSBbJ2NvbnRlbnQnLCdlbnRyeScsJ3Bvc3QnLCd3cmFwJywnZGVzY3JpcHRpb24nLCd0YXhvbm9teSddLA0KICAgICAgICBjbGFzc0Nob29zZWQgPSBmYWxzZTsNCg0KICAgIGNQb2ludGVyID0gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50X3BvaW50ZXJfaWQnKTsNCiAgICBpZiAoY1BvaW50ZXIpIHsNCiAgICAgICAgaWYgKHdpbmRvdy5qc0lucHV0ZXJMYXVuY2ghPT0xNSkgew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIGNQb2ludGVyUGFyZW50ID0gY1BvaW50ZXIucGFyZW50RWxlbWVudDsNCiAgICAgICAgaWYgKGNQb2ludGVyUGFyZW50KSB7DQogICAgICAgICAgICBpZiAoY1BvaW50ZXJQYXJlbnQuaWQpIHsNCiAgICAgICAgICAgICAgICBjUG9pbnRlclBhcmVudFN0cmluZyA9ICcjJytjUG9pbnRlclBhcmVudC5pZDsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgaWYgKGNQb2ludGVyUGFyZW50LmNsYXNzTGlzdC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgIGNQb2ludGVyUGFyZW50U3RyaW5nID0gJy4nK2NQb2ludGVyUGFyZW50LmNsYXNzTGlzdFswXTsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjbGFzc1dvcmRzLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNQb2ludGVyUGFyZW50LmNsYXNzTGlzdC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjUG9pbnRlclBhcmVudC5jbGFzc0xpc3RbaV0uaW5jbHVkZXMoY2xhc3NXb3Jkc1tqXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1BvaW50ZXJQYXJlbnRTdHJpbmcgPSAnLicrY1BvaW50ZXJQYXJlbnQuY2xhc3NMaXN0W2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0Nob29zZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NDaG9vc2VkPT09dHJ1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGNQb2ludGVyUGFyZW50U3RyaW5nKSB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvbnRlbnQgZ2F0aGVyIGNvbnRlbnQgYmxvY2sgZGV0ZWN0ZWQnKTsNCiAgICAgICAgICAgICAgICAvKiBjUG9pbnRlclBhcmVudFN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGNQb2ludGVyUGFyZW50U3RyaW5nKTsgKi8NCiAgICAgICAgICAgICAgICBzYXZlQ29udGVudEJsb2NrKGNQb2ludGVyUGFyZW50U3RyaW5nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgIGNvbnNvbGUubG9nKCdjb250ZW50IGdhdGhlciBkZWxheWVkJyk7DQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgZ2F0aGVyQ29udGVudEJsb2NrKCk7DQogICAgICAgIH0sIDUwMCk7DQogICAgfQ0KfTsNCg0Kd2luZG93LnJlbW92ZU1hcmdpbkNsYXNzID0gZnVuY3Rpb24oYmxvY2tPYmplY3QpIHsNCiAgICBpZiAoYmxvY2tPYmplY3QgJiYgdHlwZW9mIHdpbmRvdy5qc0lucHV0ZXJMYXVuY2ggIT09ICd1bmRlZmluZWQnICYmIFsxNSwgMTBdLmluY2x1ZGVzKHdpbmRvdy5qc0lucHV0ZXJMYXVuY2gpKSB7DQogICAgICAgIGxldCBiaW5kZXJOYW1lLA0KICAgICAgICAgICAgbmVlZGVkRWxlbWVudCwNCiAgICAgICAgICAgIGN1cnJlbnREaXJlY3Rpb24sDQogICAgICAgICAgICBzZWVrZXJJdGVyYXRpb25Db3VudCwNCiAgICAgICAgICAgIGN1cnJlbnRTdWJsaW5nOw0KDQogICAgICAgIGJpbmRlck5hbWUgPSBibG9ja09iamVjdC5kYXRhc2V0LnJiaW5kZXI7DQogICAgICAgIGlmIChiaW5kZXJOYW1lKSB7DQogICAgICAgICAgICBzZWVrZXJJdGVyYXRpb25Db3VudCA9IDA7DQogICAgICAgICAgICBjdXJyZW50RGlyZWN0aW9uID0gJ2JlZm9yZSc7DQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgc2Vla2VySXRlcmF0aW9uQ291bnQrKzsNCiAgICAgICAgICAgICAgICBjdXJyZW50U3VibGluZyA9IGJsb2NrT2JqZWN0Lm5leHRFbGVtZW50U2libGluZzsNCiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN1YmxpbmcmJmN1cnJlbnRTdWJsaW5nLmNsYXNzTGlzdC5jb250YWlucygncmJpbmRlci0nK2JpbmRlck5hbWUpKSB7DQogICAgICAgICAgICAgICAgICAgIG5lZWRlZEVsZW1lbnQgPSBjdXJyZW50U3VibGluZzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IHdoaWxlIChjdXJyZW50U3VibGluZyYmIW5lZWRlZEVsZW1lbnQmJnNlZWtlckl0ZXJhdGlvbkNvdW50IDwgNSk7DQoNCiAgICAgICAgICAgIGlmICghbmVlZGVkRWxlbWVudCkgew0KICAgICAgICAgICAgICAgIHNlZWtlckl0ZXJhdGlvbkNvdW50ID0gMDsNCiAgICAgICAgICAgICAgICBjdXJyZW50RGlyZWN0aW9uID0gJ2FmdGVyJzsNCiAgICAgICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgICAgIHNlZWtlckl0ZXJhdGlvbkNvdW50Kys7DQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdWJsaW5nID0gYmxvY2tPYmplY3QucHJldmlvdXNFbGVtZW50U2libGluZzsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdWJsaW5nJiZjdXJyZW50U3VibGluZy5jbGFzc0xpc3QuY29udGFpbnMoJ3JiaW5kZXItJytiaW5kZXJOYW1lKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkRWxlbWVudCA9IGN1cnJlbnRTdWJsaW5nOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSB3aGlsZSAoY3VycmVudFN1YmxpbmcmJiFuZWVkZWRFbGVtZW50JiZzZWVrZXJJdGVyYXRpb25Db3VudCA8IDUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG5lZWRlZEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICBpZiAoY3VycmVudERpcmVjdGlvbiA9PT0gJ2JlZm9yZScpIHsNCiAgICAgICAgICAgICAgICAgICAgbmVlZGVkRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdyZndwX3JlbW92ZWRNYXJnaW5Ub3AnKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBuZWVkZWRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Jmd3BfcmVtb3ZlZE1hcmdpbkJvdHRvbScpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiBmYWxzZTsNCn07DQoNCmZ1bmN0aW9uIGVsZW1lbnRCaW5kZXJOYW1lR2VuZXJhdG9yKCkgew0KICAgIGxldCBiaW5kZXJOYW1lID0gJycsDQogICAgICAgIGNoZWNrZWRFbGVtZW50cywNCiAgICAgICAgcGFzc2VkID0gZmFsc2U7DQoNCiAgICB3aGlsZSAocGFzc2VkPT09ZmFsc2UpIHsNCiAgICAgICAgYmluZGVyTmFtZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxMDAwMDApOw0KICAgICAgICBjaGVja2VkRWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yYmluZGVyPSInK2JpbmRlck5hbWUrJyJdJyk7DQogICAgICAgIGlmIChjaGVja2VkRWxlbWVudHMubGVuZ3RoIDwgMSkgew0KICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiBiaW5kZXJOYW1lOw0KfQo=
data:text/javascript;base64,CnZhciBjYWNoZWRCbG9ja3NBcnJheSA9IFtdOwpjYWNoZWRCbG9ja3NBcnJheVszNDcyNTFdID0gIjwhLS0gWWFuZGV4LlJUQiBSLUEtMzM2MjM5NS02IC0tPjxkaXYgaWQ9XCJ5YW5kZXhfcnRiX1ItQS0zMzYyMzk1LTZcIj48XC9kaXY+PHNjciIrImlwdD53aW5kb3cueWFDb250ZXh0Q2IucHVzaCgoKT0+e1lhLkNvbnRleHQuQWR2TWFuYWdlci5yZW5kZXIoe1wiYmxvY2tJZFwiOiBcIlItQS0zMzYyMzk1LTZcIixcInJlbmRlclRvXCI6IFwieWFuZGV4X3J0Yl9SLUEtMzM2MjM5NS02XCJ9KX0pPFwvc2NyIisiaXB0PiI7CmNhY2hlZEJsb2Nrc0FycmF5WzM0NzI1MF0gPSAiPCEtLSBZYW5kZXguUlRCIFItQS0zMzYyMzk1LTExIC0tPjxkaXYgaWQ9XCJ5YW5kZXhfcnRiX1ItQS0zMzYyMzk1LTExXCI+PFwvZGl2PjxzY3IiKyJpcHQ+d2luZG93LnlhQ29udGV4dENiLnB1c2goKCk9PntZYS5Db250ZXh0LkFkdk1hbmFnZXIucmVuZGVyKHtcImJsb2NrSWRcIjogXCJSLUEtMzM2MjM5NS0xMVwiLFwicmVuZGVyVG9cIjogXCJ5YW5kZXhfcnRiX1ItQS0zMzYyMzk1LTExXCJ9KX0pPFwvc2NyIisiaXB0PiI7CmNhY2hlZEJsb2Nrc0FycmF5WzM0NzI0OV0gPSAiPCEtLSBZYW5kZXguUlRCIFItQS0zMzYyMzk1LTUgLS0+PGRpdiBpZD1cInlhbmRleF9ydGJfUi1BLTMzNjIzOTUtNVwiPjxcL2Rpdj48c2NyIisiaXB0PndpbmRvdy55YUNvbnRleHRDYi5wdXNoKCgpPT57WWEuQ29udGV4dC5BZHZNYW5hZ2VyLnJlbmRlcih7XCJibG9ja0lkXCI6IFwiUi1BLTMzNjIzOTUtNVwiLFwicmVuZGVyVG9cIjogXCJ5YW5kZXhfcnRiX1ItQS0zMzYyMzk1LTVcIn0pfSk8XC9zY3IiKyJpcHQ+IjsKY2FjaGVkQmxvY2tzQXJyYXlbMzQ3MjQ4XSA9ICI8IS0tIFlhbmRleC5SVEIgUi1BLTMzNjIzOTUtMTAgLS0+PGRpdiBpZD1cInlhbmRleF9ydGJfUi1BLTMzNjIzOTUtMTBcIj48XC9kaXY+PHNjciIrImlwdD53aW5kb3cueWFDb250ZXh0Q2IucHVzaCgoKT0+e1lhLkNvbnRleHQuQWR2TWFuYWdlci5yZW5kZXIoe1wiYmxvY2tJZFwiOiBcIlItQS0zMzYyMzk1LTEwXCIsXCJyZW5kZXJUb1wiOiBcInlhbmRleF9ydGJfUi1BLTMzNjIzOTUtMTBcIn0pfSk8XC9zY3IiKyJpcHQ+IjsKY2FjaGVkQmxvY2tzQXJyYXlbMzQ3MjQ2XSA9ICI8IS0tIFlhbmRleC5SVEIgUi1BLTMzNjIzOTUtOSAtLT48ZGl2IGlkPVwieWFuZGV4X3J0Yl9SLUEtMzM2MjM5NS05XCI+PFwvZGl2PjxzY3IiKyJpcHQ+d2luZG93LnlhQ29udGV4dENiLnB1c2goKCk9PntZYS5Db250ZXh0LkFkdk1hbmFnZXIucmVuZGVyKHtcImJsb2NrSWRcIjogXCJSLUEtMzM2MjM5NS05XCIsXCJyZW5kZXJUb1wiOiBcInlhbmRleF9ydGJfUi1BLTMzNjIzOTUtOVwifSl9KTxcL3NjciIrImlwdD4iOwpjYWNoZWRCbG9ja3NBcnJheVszNDcyNDddID0gIjwhLS0gWWFuZGV4LlJUQiBSLUEtMzM2MjM5NS00IC0tPjxkaXYgaWQ9XCJ5YW5kZXhfcnRiX1ItQS0zMzYyMzk1LTRcIj48XC9kaXY+PHNjciIrImlwdD53aW5kb3cueWFDb250ZXh0Q2IucHVzaCgoKT0+e1lhLkNvbnRleHQuQWR2TWFuYWdlci5yZW5kZXIoe1wiYmxvY2tJZFwiOiBcIlItQS0zMzYyMzk1LTRcIixcInJlbmRlclRvXCI6IFwieWFuZGV4X3J0Yl9SLUEtMzM2MjM5NS00XCJ9KX0pPFwvc2NyIisiaXB0PiI7CmNhY2hlZEJsb2Nrc0FycmF5WzM0NzI0NV0gPSAiPCEtLSBZYW5kZXguUlRCIFItQS0zMzYyMzk1LTMgLS0+PGRpdiBpZD1cInlhbmRleF9ydGJfUi1BLTMzNjIzOTUtM1wiPjxcL2Rpdj48c2NyIisiaXB0PndpbmRvdy55YUNvbnRleHRDYi5wdXNoKCgpPT57WWEuQ29udGV4dC5BZHZNYW5hZ2VyLnJlbmRlcih7XCJibG9ja0lkXCI6IFwiUi1BLTMzNjIzOTUtM1wiLFwicmVuZGVyVG9cIjogXCJ5YW5kZXhfcnRiX1ItQS0zMzYyMzk1LTNcIn0pfSk8XC9zY3IiKyJpcHQ+IjsKY2FjaGVkQmxvY2tzQXJyYXlbMzQ3MjM4XSA9ICIiOwpjYWNoZWRCbG9ja3NBcnJheVszNDcyNDRdID0gIjwhLS0gWWFuZGV4LlJUQiBSLUEtMzM2MjM5NS04IC0tPjxkaXYgaWQ9XCJ5YW5kZXhfcnRiX1ItQS0zMzYyMzk1LThcIj48XC9kaXY+PHNjciIrImlwdD53aW5kb3cueWFDb250ZXh0Q2IucHVzaCgoKT0+e1lhLkNvbnRleHQuQWR2TWFuYWdlci5yZW5kZXIoe1wiYmxvY2tJZFwiOiBcIlItQS0zMzYyMzk1LThcIixcInJlbmRlclRvXCI6IFwieWFuZGV4X3J0Yl9SLUEtMzM2MjM5NS04XCJ9KX0pPFwvc2NyIisiaXB0PiI7CmNhY2hlZEJsb2Nrc0FycmF5WzM0NzI0M10gPSAiPCEtLSBZYW5kZXguUlRCIFItQS0zMzYyMzk1LTIgLS0+PGRpdiBpZD1cInlhbmRleF9ydGJfUi1BLTMzNjIzOTUtMlwiPjxcL2Rpdj48c2NyIisiaXB0PndpbmRvdy55YUNvbnRleHRDYi5wdXNoKCgpPT57WWEuQ29udGV4dC5BZHZNYW5hZ2VyLnJlbmRlcih7XCJibG9ja0lkXCI6IFwiUi1BLTMzNjIzOTUtMlwiLFwicmVuZGVyVG9cIjogXCJ5YW5kZXhfcnRiX1ItQS0zMzYyMzk1LTJcIn0pfSk8XC9zY3IiKyJpcHQ+IjsKY2FjaGVkQmxvY2tzQXJyYXlbMzQ3MjQyXSA9ICI8IS0tIFlhbmRleC5SVEIgUi1BLTMzNjIzOTUtNyAtLT48ZGl2IGlkPVwieWFuZGV4X3J0Yl9SLUEtMzM2MjM5NS03XCI+PFwvZGl2PjxzY3IiKyJpcHQ+d2luZG93LnlhQ29udGV4dENiLnB1c2goKCk9PntZYS5Db250ZXh0LkFkdk1hbmFnZXIucmVuZGVyKHtcImJsb2NrSWRcIjogXCJSLUEtMzM2MjM5NS03XCIsXCJyZW5kZXJUb1wiOiBcInlhbmRleF9ydGJfUi1BLTMzNjIzOTUtN1wifSl9KTxcL3NjciIrImlwdD4iOwpjYWNoZWRCbG9ja3NBcnJheVszNDcyNTJdID0gIjwhLS0gWWFuZGV4LlJUQiBSLUEtMzM2MjM5NS0yNiAtLT48ZGl2IGlkPVwieWFuZGV4X3J0Yl9SLUEtMzM2MjM5NS0yNlwiPjxcL2Rpdj48c2NyIisiaXB0PndpbmRvdy55YUNvbnRleHRDYi5wdXNoKCgpPT57WWEuQ29udGV4dC5BZHZNYW5hZ2VyLnJlbmRlcih7XCJibG9ja0lkXCI6IFwiUi1BLTMzNjIzOTUtMjZcIixcInJlbmRlclRvXCI6IFwieWFuZGV4X3J0Yl9SLUEtMzM2MjM5NS0yNlwifSl9KTxcL3NjciIrImlwdD4iOwpjYWNoZWRCbG9ja3NBcnJheVszNDcyNDBdID0gIjwhLS0gWWFuZGV4LlJUQiBSLUEtMzM2MjM5NS0yNSAtLT48ZGl2IGlkPVwieWFuZGV4X3J0Yl9SLUEtMzM2MjM5NS0yNVwiPjxcL2Rpdj48c2NyIisiaXB0PndpbmRvdy55YUNvbnRleHRDYi5wdXNoKCgpPT57WWEuQ29udGV4dC5BZHZNYW5hZ2VyLnJlbmRlcih7XCJibG9ja0lkXCI6IFwiUi1BLTMzNjIzOTUtMjVcIixcInJlbmRlclRvXCI6IFwieWFuZGV4X3J0Yl9SLUEtMzM2MjM5NS0yNVwifSl9KTxcL3NjciIrImlwdD4iOwpjYWNoZWRCbG9ja3NBcnJheVszNDcyNDFdID0gIjwhLS0gWWFuZGV4LlJUQiBSLUEtMzM2MjM5NS0xIC0tPjxkaXYgaWQ9XCJ5YW5kZXhfcnRiX1ItQS0zMzYyMzk1LTFcIj48XC9kaXY+PHNjciIrImlwdD53aW5kb3cueWFDb250ZXh0Q2IucHVzaCgoKT0+e1lhLkNvbnRleHQuQWR2TWFuYWdlci5yZW5kZXIoe1wiYmxvY2tJZFwiOiBcIlItQS0zMzYyMzk1LTFcIixcInJlbmRlclRvXCI6IFwieWFuZGV4X3J0Yl9SLUEtMzM2MjM5NS0xXCJ9KX0pPFwvc2NyIisiaXB0PiI7Cg==
data:text/javascript;base64,CndpbmRvdy5qc0lucHV0ZXJMYXVuY2ggPSAxNTsKaWYgKHR5cGVvZiBsYXVuY2hBc3luY0Z1bmN0aW9uTGF1bmNoZXIgPT09ICJ1bmRlZmluZWQiKSB7CiAgICBmdW5jdGlvbiBsYXVuY2hBc3luY0Z1bmN0aW9uTGF1bmNoZXIoKSB7CiAgICAgICAgaWYgKHR5cGVvZiBhc3luY0Z1bmN0aW9uTGF1bmNoZXIgIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBhc3luY0Z1bmN0aW9uTGF1bmNoZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgYXN5bmNGdW5jdGlvbkxhdW5jaGVyKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBsYXVuY2hBc3luY0Z1bmN0aW9uTGF1bmNoZXIoKTsKICAgICAgICAgICAgfSwgMTAwKQogICAgICAgIH0KICAgIH0KfQpsYXVuY2hBc3luY0Z1bmN0aW9uTGF1bmNoZXIoKTsK
data:text/javascript;base64,DQogICAgdmFyIGJsb2NrX2NsYXNzZXMgPSBbImNvbnRlbnRfcmIiLCAiY250MzJfcmxfYmdfc3RyIiwgInJsX2NudF9iZyJdOw0KDQogICAgZnVuY3Rpb24gYWRkQXR0ckl0ZW0oY2xhc3NOYW1lKSB7DQogICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuIiArIGNsYXNzTmFtZSkgJiYgIWJsb2NrX2NsYXNzZXMuaW5jbHVkZXMoY2xhc3NOYW1lKSkgew0KICAgICAgICAgICAgYmxvY2tfY2xhc3Nlcy5wdXNoKGNsYXNzTmFtZSk7DQogICAgICAgIH0NCiAgICB9DQo=
data:text/javascript;base64,IChmdW5jdGlvbihtLGUsdCxyLGksayxhKXttW2ldPW1baV18fGZ1bmN0aW9uKCl7KG1baV0uYT1tW2ldLmF8fFtdKS5wdXNoKGFyZ3VtZW50cyl9OyBtW2ldLmw9MSpuZXcgRGF0ZSgpO2s9ZS5jcmVhdGVFbGVtZW50KHQpLGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KVswXSxrLmFzeW5jPTEsay5zcmM9cixhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGssYSl9KSAod2luZG93LCBkb2N1bWVudCwgInNjcmlwdCIsICJodHRwczovL21jLnlhbmRleC5ydS9tZXRyaWthL3RhZy5qcyIsICJ5bSIpOyB5bSg4MzAzNjQ2NiwgImluaXQiLCB7IGNsaWNrbWFwOnRydWUsIHRyYWNrTGlua3M6dHJ1ZSwgYWNjdXJhdGVUcmFja0JvdW5jZTp0cnVlIH0pOyA=
data:text/javascript;base64,IHJiQ29uZmlnPXtzdGFydDpwZXJmb3JtYW5jZS5ub3coKSxyYkRvbWFpbjonbmV3cm90YXRvcm1hcmNoMjMuYmlkJyxyb3RhdG9yOicxZHd2Zid9O3Rva2VuPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCcxZHd2ZicpfHwoMWU2KycnKS5yZXBsYWNlKC9bMDE4XS9nLCBjID0+IChjIF4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxKSlbMF0gJiAxNSA+PiBjIC8gNCkudG9TdHJpbmcoMTYpKTtyc2RmaHNlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyByc2RmaHNlLnNldEF0dHJpYnV0ZSgnc3JjJywnLy9uZXdyb3RhdG9ybWFyY2gyMy5iaWQvMWR3dmYubWluLmpzPycrdG9rZW4pO3JzZGZoc2Uuc2V0QXR0cmlidXRlKCdhc3luYycsJ2FzeW5jJyk7cnNkZmhzZS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCd0ZXh0L2phdmFzY3JpcHQnKTtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHJzZGZoc2UpOyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnMWR3dmYnLCB0b2tlbik7
data:text/javascript;base64,IWZ1bmN0aW9uKCl7dmFyIHQ9ITE7dHJ5e3ZhciBlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe3Q9ITB9fSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLG51bGwsZSl9Y2F0Y2godCl7fXJldHVybiB0fSgpfHxmdW5jdGlvbihpKXt2YXIgbz0hMCxzPSExO0V2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0ib2JqZWN0Ij09dHlwZW9mIG4sYT1yP24uY2FwdHVyZTpuO249cj9uOnt9LCJ0b3VjaHN0YXJ0IiE9dCYmInNjcm9sbCIhPXQmJiJ3aGVlbCIhPXR8fChuLnBhc3NpdmU9dm9pZCAwIT09bi5wYXNzaXZlP24ucGFzc2l2ZTpvKSxuLmNhcHR1cmU9dm9pZCAwIT09YT9hOnMsaS5jYWxsKHRoaXMsdCxlLG4pfX0oRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIpOw==
data:text/javascript;base64,Y29uc29sZS5sb2coJ2FkOiBoZWFkZXIgZXJyb3InKQ==
data:text/javascript;base64,ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY29weSIsIChldmVudCkgPT4ge3ZhciBwYWdlbGluayA9ICJcbtCY0YHRgtC+0YfQvdC40Lo6IGh0dHBzOi8vdmxpY2hueWkta2FiaW5ldC5ydS9jcm0vb2ZkLXRheGNvbSI7ZXZlbnQuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCJ0ZXh0IiwgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCkgKyBwYWdlbGluayk7ZXZlbnQucHJldmVudERlZmF1bHQoKTt9KTs=
data:text/javascript;base64,ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICJha19qc18xIiApLnNldEF0dHJpYnV0ZSggInZhbHVlIiwgKCBuZXcgRGF0ZSgpICkuZ2V0VGltZSgpICk7
data:text/javascript;base64,ZnVuY3Rpb24gZGlzYWJsZV9rZXlzdHJva2VzKGUpIHtpZiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSl7dmFyIGtleTtpZih3aW5kb3cuZXZlbnQpa2V5ID0gd2luZG93LmV2ZW50LmtleUNvZGU7ZWxzZSBrZXkgPSBlLndoaWNoO2lmIChrZXkgPT0gNjcgfHwga2V5ID09IDg4IHx8IGtleSA9PSA2NSB8fCBrZXkgPT0gODUgfHwga2V5ID09IDgzKXJldHVybiBmYWxzZTtlbHNlIHJldHVybiB0cnVlO319ZG9jdW1lbnQub25rZXlkb3duID0gZGlzYWJsZV9rZXlzdHJva2VzOw==
data:text/javascript;base64,ZnVuY3Rpb24gbGF6eUxvYWRUaHVtYihlKXt2YXIgdD0nPGltZyBsb2FkaW5nPSJsYXp5IiBkYXRhLWxhenktc3JjPSJodHRwczovL2kueXRpbWcuY29tL3ZpL0lEL2hxZGVmYXVsdC5qcGciIGFsdD0iIiB3aWR0aD0iNDgwIiBoZWlnaHQ9IjM2MCI+PG5vc2NyaXB0PjxpbWcgc3JjPSJodHRwczovL2kueXRpbWcuY29tL3ZpL0lEL2hxZGVmYXVsdC5qcGciIGFsdD0iIiB3aWR0aD0iNDgwIiBoZWlnaHQ9IjM2MCI+PC9ub3NjcmlwdD4nLGE9JzxkaXYgY2xhc3M9InBsYXkiPjwvZGl2Pic7cmV0dXJuIHQucmVwbGFjZSgiSUQiLGUpK2F9ZnVuY3Rpb24gbGF6eUxvYWRZb3V0dWJlSWZyYW1lKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksdD0iSUQ/YXV0b3BsYXk9MSI7dCs9MD09PXRoaXMuZGF0YXNldC5xdWVyeS5sZW5ndGg/Jyc6JyYnK3RoaXMuZGF0YXNldC5xdWVyeTtlLnNldEF0dHJpYnV0ZSgic3JjIix0LnJlcGxhY2UoIklEIix0aGlzLmRhdGFzZXQuc3JjKSksZS5zZXRBdHRyaWJ1dGUoImZyYW1lYm9yZGVyIiwiMCIpLGUuc2V0QXR0cmlidXRlKCJhbGxvd2Z1bGxzY3JlZW4iLCIxIiksZS5zZXRBdHRyaWJ1dGUoImFsbG93IiwgImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlIiksdGhpcy5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLHRoaXMpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGZ1bmN0aW9uKCl7dmFyIGUsdCxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInJsbC15b3V0dWJlLXBsYXllciIpO2Zvcih0PTA7dDxhLmxlbmd0aDt0KyspZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlLnNldEF0dHJpYnV0ZSgiZGF0YS1pZCIsYVt0XS5kYXRhc2V0LmlkKSxlLnNldEF0dHJpYnV0ZSgiZGF0YS1xdWVyeSIsIGFbdF0uZGF0YXNldC5xdWVyeSksZS5zZXRBdHRyaWJ1dGUoImRhdGEtc3JjIiwgYVt0XS5kYXRhc2V0LnNyYyksZS5pbm5lckhUTUw9bGF6eUxvYWRUaHVtYihhW3RdLmRhdGFzZXQuaWQpLGUub25jbGljaz1sYXp5TG9hZFlvdXR1YmVJZnJhbWUsYVt0XS5hcHBlbmRDaGlsZChlKX0pOw==
data:text/javascript;base64,d2luZG93LmxhenlMb2FkT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgIGVsZW1lbnRzX3NlbGVjdG9yOiAiaW1nW2RhdGEtbGF6eS1zcmNdLC5yb2NrZXQtbGF6eWxvYWQsaWZyYW1lW2RhdGEtbGF6eS1zcmNdIiwKICAgICAgICAgICAgICAgIGRhdGFfc3JjOiAibGF6eS1zcmMiLAogICAgICAgICAgICAgICAgZGF0YV9zcmNzZXQ6ICJsYXp5LXNyY3NldCIsCiAgICAgICAgICAgICAgICBkYXRhX3NpemVzOiAibGF6eS1zaXplcyIsCiAgICAgICAgICAgICAgICBjbGFzc19sb2FkaW5nOiAibGF6eWxvYWRpbmciLAogICAgICAgICAgICAgICAgY2xhc3NfbG9hZGVkOiAibGF6eWxvYWRlZCIsCiAgICAgICAgICAgICAgICB0aHJlc2hvbGQ6IDMwMCwKICAgICAgICAgICAgICAgIGNhbGxiYWNrX2xvYWRlZDogZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgIGlmICggZWxlbWVudC50YWdOYW1lID09PSAiSUZSQU1FIiAmJiBlbGVtZW50LmRhdGFzZXQucm9ja2V0TGF6eWxvYWQgPT0gImZpdHZpZHNjb21wYXRpYmxlIiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsYXp5bG9hZGVkIikgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5qUXVlcnkgIT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalF1ZXJ5LmZuLmZpdFZpZHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KGVsZW1lbnQpLnBhcmVudCgpLmZpdFZpZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9fTsKICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignTGF6eUxvYWQ6OkluaXRpYWxpemVkJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGxhenlMb2FkSW5zdGFuY2UgPSBlLmRldGFpbC5pbnN0YW5jZTsKCiAgICAgICAgICAgIGlmICh3aW5kb3cuTXV0YXRpb25PYnNlcnZlcikgewogICAgICAgICAgICAgICAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24obXV0YXRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGltYWdlX2NvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICB2YXIgaWZyYW1lX2NvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICB2YXIgcm9ja2V0bGF6eV9jb3VudCA9IDA7CgogICAgICAgICAgICAgICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKG11dGF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG11dGF0aW9uLmFkZGVkTm9kZXNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG11dGF0aW9uLmFkZGVkTm9kZXNbaV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMgPSBtdXRhdGlvbi5hZGRlZE5vZGVzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2ltYWdlID0gbXV0YXRpb24uYWRkZWROb2Rlc1tpXS50YWdOYW1lID09ICJJTUciOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lcyA9IG11dGF0aW9uLmFkZGVkTm9kZXNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lmcmFtZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfaWZyYW1lID0gbXV0YXRpb24uYWRkZWROb2Rlc1tpXS50YWdOYW1lID09ICJJRlJBTUUiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9ja2V0X2xhenkgPSBtdXRhdGlvbi5hZGRlZE5vZGVzW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3JvY2tldC1sYXp5bG9hZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX2NvdW50ICs9IGltYWdlcy5sZW5ndGg7CgkJCSAgICAgICAgICAgICAgICBpZnJhbWVfY291bnQgKz0gaWZyYW1lcy5sZW5ndGg7CgkJCSAgICAgICAgICAgICAgICByb2NrZXRsYXp5X2NvdW50ICs9IHJvY2tldF9sYXp5Lmxlbmd0aDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc19pbWFnZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfY291bnQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc19pZnJhbWUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZV9jb3VudCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSApOwoKICAgICAgICAgICAgICAgICAgICBpZihpbWFnZV9jb3VudCA+IDAgfHwgaWZyYW1lX2NvdW50ID4gMCB8fCByb2NrZXRsYXp5X2NvdW50ID4gMCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhenlMb2FkSW5zdGFuY2UudXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSApOwoKICAgICAgICAgICAgICAgIHZhciBiICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdOwogICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH07CgogICAgICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShiLCBjb25maWcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgZmFsc2UpOw==
data:text/javascript;base64,d2luZG93LnlhQ29udGV4dENiPXdpbmRvdy55YUNvbnRleHRDYnx8W10=
data:text/javascript;base64,dmFyIGNvb2tpZV9jbGVhcmZ5X2hpZGUgPSBkb2N1bWVudC5jb29raWUucmVwbGFjZSgvKD86KD86XnwuKjtccyopY2xlYXJmeV9jb29raWVfaGlkZVxzKlw9XHMqKFteO10qKS4qJCl8Xi4qJC8sICIkMSIpO2lmICggISBjb29raWVfY2xlYXJmeV9oaWRlLmxlbmd0aCApIHsgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjbGVhcmZ5LWNvb2tpZSIpLmNsYXNzTGlzdC5yZW1vdmUoImNsZWFyZnktY29va2llLWhpZGUiKTt9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjbGVhcmZ5LWNvb2tpZS1hY2NlcHQiKS5vbmNsaWNrID0gZnVuY3Rpb24oKSB7IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjbGVhcmZ5LWNvb2tpZSIpLmNsYXNzTmFtZSArPSAiIGNsZWFyZnktY29va2llLWhpZGUiOyB2YXIgY2xlYXJmeV9jb29raWVfZGF0ZSA9IG5ldyBEYXRlKG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgMzE1MzYwMDAgKiAxMDAwKTsgZG9jdW1lbnQuY29va2llID0gImNsZWFyZnlfY29va2llX2hpZGU9eWVzOyBwYXRoPS87IGV4cGlyZXM9IiArIGNsZWFyZnlfY29va2llX2RhdGUudG9VVENTdHJpbmcoKTsgc2V0VGltZW91dChmdW5jdGlvbigpIHsgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNsZWFyZnktY29va2llIikucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNsZWFyZnktY29va2llIikgKTsgfSwgMzAwKTt9
data:text/javascript;base64,dmFyIHBzZXVkb19saW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5wc2V1ZG8tY2xlYXJmeS1saW5rIik7Zm9yICh2YXIgaT0wO2k8cHNldWRvX2xpbmtzLmxlbmd0aDtpKysgKSB7IHBzZXVkb19saW5rc1tpXS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKGUpeyAgIHdpbmRvdy5vcGVuKCBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEtdXJpIikgKTsgfSk7IH0=
https://vlichnyi-kabinet.ru/wp-content/cache/autoptimize/autoptimize_single_891fcc7dda345a0d31fdcef57dd29d96.php?ver=1.0.4
https://vlichnyi-kabinet.ru/wp-content/cache/autoptimize/autoptimize_single_94bc4228bb5941670e191e40a6bc44bd.php
https://vlichnyi-kabinet.ru/wp-content/plugins/expert-review/assets/public/js/scripts.min.js
https://vlichnyi-kabinet.ru/wp-content/plugins/rocket-lazy-load/assets/js/16.1/lazyload.min.js
https://vlichnyi-kabinet.ru/wp-content/themes/root/assets/js/scripts.min.js
https://vlichnyi-kabinet.ru/wp-includes/js/comment-reply.min.js
https://vlichnyi-kabinet.ru/wp-includes/js/jquery/jquery.min.js
https://yandex.ru/ads/system/context.js
Внешние ссылки 2
Внутренние ссылки 60

meta-теги

viewportwidth=device-width, initial-scale=1
robotsindex, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1
author(менеджер сайта)
twitter:cardsummary_large_image
twitter:label1Написано автором
twitter:data1(менеджер сайта)
twitter:label2Примерное время для чтения
twitter:data22 минуты
msapplication-TileImagehttps://vlichnyi-kabinet.ru/wp-content/uploads/cropped-logo-8008439-3934006-270x270.jpeg
og:localeru_RU
og:typearticle
og:titleТакском личный кабинет: вход в онлайн кассы и регистрация
og:descriptionИнструкция по регистрации в личном кабинете Taxcom и вход в систему, плюсы и минусы, функционал сервиса и дополнительные программы, доступные клиентам. 
og:urlhttps://vlichnyi-kabinet.ru/crm/ofd-taxcom/
og:site_nameВсе личные кабинеты
article:published_time2023-11-24T05:16:27+00:00
article:modified_time2023-11-24T05:18:33+00:00
og:imagehttps://vlichnyi-kabinet.ru/wp-content/uploads/registratsiya3-7966467-1387857..png
og:image:width1188
og:image:height626
og:image:typeimage/png

Скриншот сайта

Скриншота нет

Сервер сайта

IP адрес сайта 45.130.41.81
Веб-сервер nginx-reuseport/1.21.1
Версия HTTP HTTP 3
DNS сервера ns1.beget.pro
ns2.beget.com
ns2.beget.ru
ns2.beget.pro
ns1.beget.com
ns1.beget.ru
DNS записи 11
A записи
1: ip: 45.130.41.81
NS записи
2: target: ns1.beget.pro
3: target: ns2.beget.com
4: target: ns2.beget.ru
5: target: ns2.beget.pro
6: target: ns1.beget.com
7: target: ns1.beget.ru
SOA записи
8: mname: ns1.beget.com
8: rname: hostmaster.beget.com
8: serial: 1665482899
8: refresh: 300
8: retry: 600
8: expire: 86400
8: minimum-ttl: 300
MX записи
9: pri: 10
9: target: mx1.beget.com
10: pri: 20
10: target: mx2.beget.com
TXT записи
11: txt: v=spf1 redirect=beget.com
11: entries: 0: v=spf1 redirect=beget.com

Ответ сервера

Группы заголовков: заголовки безопасности, заголовки кэширования.
status HTTP/2 200
server nginx-reuseport/1.21.1
date Tue, 13 Feb 2024 16:11:42 GMT
content-type text/html; charset=UTF-8
vary User-Agent
last-modified Mon, 18 Dec 2023 16:01:48 GMT
cache-control max-age=0, no-cache, no-store, must-revalidate
pragma no-cache
expires Mon, 29 Oct 1923 20:30:00 GMT
content-encoding gzip

Оцените сайт

Не ставьте оценку если отвечаете на другой отзыв или пишите комментарий:

Можно добавить текст отзыва, ответ на другой отзыв, или просто комментарий к сайту:
captcha