#!/usr/bin/php
<?php
/*
tools/distributionBuilder/ydocview
YeAPF 0.8.64-11 built on 2021-01-22 16:32 (-3 DST)
Copyright (C) 2004-2021 Esteban Daniel Dortta - dortta@yahoo.com - MIT License
2019-08-02 07:57:22 (-3 DST)
*/

if (!function_exists("objet2array")) {
  function object2array($object) {
    return @json_decode(@json_encode($object), 1);
  }
}

global $outputFiles, $ofNdx, $aSequence, $aMap, $toDebug;
$ofNdx       = -1;
$aSequence   = -1;
$aMap        = array();
$outputFiles = array();
$toDebug     = false;

// ydocviewer.min.js
$ydocviewer_min_js=base64_decode("dmFyIHlEb2NWaWV3ZXJPYmo9ZnVuY3Rpb24oKXt2YXIgYz17ZXhwYW5kRG9jdW1lbnRCeUlkOmZ1bmN0aW9uKGEpe3ZhciBiPXkkKCIuZG9jRW50cnkiKSxjPSExO2ImJihiLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zdHlsZS5kaXNwbGF5PSJub25lIn0pLGI9eSQoYSl8fGJbMF0sYT1iLmlkLGImJihiLnN0eWxlLmRpc3BsYXk9IiIsYT15JCgiLmV4cGFuZGVyLSIrYSkpKSYmKGE9YVswXSxhLmFkZENsYXNzKCJmYS1yb3RhdGUtOTAiKSx3aW5kb3cuaG9tZUhpc3RvcnlQb3NpdGlvbi0tLGM9ITApO3JldHVybiBjfX0sZD1mdW5jdGlvbihhKXthJiZhLnRhcmdldCYmKHkkKCIuZXhwYW5kLWRvY3VtZW50IikuZm9yRWFjaChmdW5jdGlvbihhKXthLmRlbGV0ZUNsYXNzKCJmYS1yb3RhdGUtOTAiKX0pLGE9YS50YXJnZXQuY2xvc2VzdCgiQSIpLmdldEF0dHJpYnV0ZSgiZGF0YS1pZCIpLGMuZXhwYW5kRG9jdW1lbnRCeUlkKGEpKX07cmV0dXJuIGZ1bmN0aW9uKCl7YWRkRXZlbnQoImV4cGFuZC1kb2N1bWVudCIsCiJjbGljayIsZCk7dmFyIGE9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5zcGxpdCgiIyIpfHxbXTsyPT1hLmxlbmd0aD9jLmV4cGFuZERvY3VtZW50QnlJZChhWzFdKXx8KHdpbmRvdy5ob21lSGlzdG9yeVBvc2l0aW9uPS0xKTooYT15JCgiLmV4cGFuZC1kb2N1bWVudCIpLDE9PWEubGVuZ3RoJiYoYy5leHBhbmREb2N1bWVudEJ5SWQoYVswXS5nZXRBdHRyaWJ1dGUoImRhdGEtaWQiKSkscmV0PSEwKSl9KCl9O2FkZE9uTG9hZE1hbmFnZXIoZnVuY3Rpb24oKXt3aW5kb3cueURvY1ZpZXdlcj15RG9jVmlld2VyT2JqKCl9KTsK");

//yloader.min.js
$yloader_min_js=base64_decode("LyogWWVBUEYgMC44LjYyLTEzMyBidWlsdCBvbiAyMDE5LTA1LTE1IDEwOjAyICgtMyBEU1QpIENvcHlyaWdodCAoQykgMjAwNC0yMDE5IEVzdGViYW4gRGFuaWVsIERvcnR0YSAtIGRvcnR0YUB5YWhvby5jb20gKi8KaWYoInVuZGVmaW5lZCI9PT10eXBlb2YgY29uc29sZSl2YXIgY29uc29sZT0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3cuY29uc29sZT13aW5kb3cuY29uc29sZXx8e306e307KGZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJhc3NlcnQgY2xlYXIgY291bnQgZGVidWcgZGlyIGRpcnhtbCBlcnJvciBleGNlcHRpb24gZ3JvdXAgZ3JvdXBDb2xsYXBzZWQgZ3JvdXBFbmQgaW5mbyBsb2cgbWFya1RpbWVsaW5lIHByb2ZpbGUgcHJvZmlsZUVuZCB0YWJsZSB0aW1lIHRpbWVFbmQgdGltZVN0YW1wIHRyYWNlIHdhcm4iLnNwbGl0KCIgIiksYixjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLGNvbnNvbGVbYl18fChjb25zb2xlW2JdPWZ1bmN0aW9uKCl7fSl9KSgpO2NvbnNvbGUubG9nKCJZZUFQRiAwLjguNjItMTMzIGJ1aWx0IG9uIDIwMTktMDUtMTUgMTA6MDIgKC0zIERTVCkiKTsKZnVuY3Rpb24gZ2V0SW50ZXJuZXRFeHBsb3JlclZlcnNpb24oKXt2YXIgYT0tMTsiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIj09bmF2aWdhdG9yLmFwcE5hbWUmJm51bGwhPS9NU0lFIChbMC05XXsxLH1bLjAtOV17MCx9KS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KSYmKGE9cGFyc2VGbG9hdChSZWdFeHAuJDEpKTtyZXR1cm4gYX1mdW5jdGlvbiBpc0ludGVybmV0RXhwbG9yZXIoKXtyZXR1cm4gMDw9Z2V0SW50ZXJuZXRFeHBsb3JlclZlcnNpb24oKX1mdW5jdGlvbiBJc1NhZmFyaSgpe3JldHVybi0xPG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJzYWZhcmkvIil9ZnVuY3Rpb24gZ2V0QW5kcm9pZFZlcnNpb24oYSl7YT0oYXx8bmF2aWdhdG9yLnVzZXJBZ2VudCkudG9Mb3dlckNhc2UoKTtyZXR1cm4oYT1hLm1hdGNoKC9hbmRyb2lkXHMoWzAtOVwuXSopLykpP2FbMV06ITF9CmZ1bmN0aW9uIGlzT25Nb2JpbGUoKXt2YXIgYT0hMTtyZXR1cm4gYT0idW5kZWZpbmVkIiE9dHlwZW9mIG1vc3luYz9tb3N5bmMuaXNBbmRyb2lkfHxtb3N5bmMuaXNJT1N8fG1vc3luYy5pc1dpbmRvd3NQaG9uZTovQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl9eWRiZz1mdW5jdGlvbigpe3JldHVybntsb2dMZXZlbDowLGxvZ0ZsYWc6MH19O2Z1bmN0aW9uIF9fZHVtcF9fKGEpeyJvYmplY3QiPT10eXBlb2YgbW9zeW5jP21vc3luYy5ybG9nKGEpOmNvbnNvbGUubG9nKGEpfWZ1bmN0aW9uIF9kdW1wKCl7Zm9yKHZhciBhPSIiLGIsYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspIiI8YSYmKGErPSIsICIpLGI9YXJndW1lbnRzW2NdLCJvYmplY3QiPT10eXBlb2YgYiYmKGI9Yi50b1N0cmluZygpKSxhKz1iO19fZHVtcF9fKGEpfQpmdW5jdGlvbiBfc2V0TG9nRmxhZ0xldmVsKGEsYil7eWRiZy5sb2dGbGFnPWE7eWRiZy5sb2dMZXZlbD1ifWZ1bmN0aW9uIF9kdW1weShhLGIpe2lmKHlkYmcubG9nRmxhZyZhJiZ5ZGJnLmxvZ0xldmVsPj1iKXt2YXIgYz0iIixkLGU7ZD1uZXcgRGF0ZTtlPSgiMCIrZC5nZXRIb3VycygpKS5zbGljZSgtMikrIjoiKygiMCIrZC5nZXRNaW51dGVzKCkpLnNsaWNlKC0yKSsiOiIrKCIwIitkLmdldFNlY29uZHMoKSkuc2xpY2UoLTIpKyIgIjtmb3IodmFyIGY9MjtmPGFyZ3VtZW50cy5sZW5ndGg7ZisrKSIiPGMmJihjKz0iLCAiKSxkPWFyZ3VtZW50c1tmXSwib2JqZWN0Ij09dHlwZW9mIGQmJihkPWQudG9TdHJpbmcoKSksYys9ZDtfX2R1bXBfXyhlK2MpfX0KdmFyIHlsb2FkZXJCYXNlPWZ1bmN0aW9uKCl7dmFyIGE9e307KGZ1bmN0aW9uKCl7dmFyIGI7Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudD8oYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IiksYj1iW2IubGVuZ3RoLTFdLnNyYy5zcGxpdCgiPyIpWzBdLnNwbGl0KCIvIikuc2xpY2UoMCwtMSkuam9pbigiLyIpKyIvIik6Yj0iLi8iO2Euc2VsZkxvY2F0aW9uPWI7X2R1bXAoIkxvYWRpbmcgZnJvbSAiK2IpfSkoKTt2YXIgYj0idW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdz97fTp3aW5kb3csYz0idW5kZWZpbmVkIj09dHlwZW9mIG5hdmlnYXRvcj97dXNlckFnZW50OiJub2RlanMifTpuYXZpZ2F0b3I7YS5pc05vZGU9InVuZGVmaW5lZCIhPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0czthLmlzV29ya2VyPSJmdW5jdGlvbiI9PXR5cGVvZiBpbXBvcnRTY3JpcHRzO2EuaXNNb2JpbGU9IWEuaXNXb3JrZXImJiJ1bmRlZmluZWQiIT09dHlwZW9mIGIub3JpZW50YXRpb247CmEuaXNDaHJvbWVFeHRlbnNpb249IWEuaXNXb3JrZXImJihiLmNocm9tZSYmY2hyb21lLnJ1bnRpbWUmJmNocm9tZS5ydW50aW1lLmlkfHwiY2hyb21lLWV4dGVuc2lvbjoiPT1hLnNlbGZMb2NhdGlvbi5zdWJzdHIoMCwxNykpO2EuaXNDaHJvbWVTYW5kYm94PSFhLmlzV29ya2VyJiZhLmlzQ2hyb21lRXh0ZW5zaW9uJiYhY2hyb21lLnN0b3JhZ2U7YS5pc1dlYmtpdD0vKHNhZmFyaXxjaHJvbWUpLy50ZXN0KGMudXNlckFnZW50LnRvTG93ZXJDYXNlKCkpO2Eud2ViS2l0VmVyc2lvbj1mdW5jdGlvbigpe2Zvcih2YXIgYT0iNTMwLjAwIixiPWMudXNlckFnZW50Lm1hdGNoKC8oW0EtWmEtel0qKVwvKFswLTlBLVphLXpcLl0qKS9nKSxmPTA7ZjwoYnx8W10pLmxlbmd0aDtmKyspIkFwcGxlV2ViS2l0Ij09YltmXS5zdWJzdHIoMCwxMSkmJihhPWJbZl0uc3Vic3RyKDEyKSk7cmV0dXJuIGF9KCk7YS5vcGVyYXRpbmdTeXN0ZW09ZnVuY3Rpb24oKXtmb3IodmFyIGE9KChjLnVzZXJBZ2VudC5tYXRjaCgvKFwoW0EtelwgMC05XC5cO1wsXC1cL1w6XSopXCkvZyl8fApbXSlbMF18fCIiKS5yZXBsYWNlKC9bXmEtekEtWjAtOVwgXC5cO10rL2csIiIpLnNwbGl0KCI7Iil8fFsiVW5rbm93biIsIlVua25vd24iXSxiPTA7YjwoYXx8W10pLmxlbmd0aDtiKyspYVtiXT10cmltKGFbYl18fCJVbmtub3duIik7cmV0dXJuIGF9KCk7YS5sb2FkTGlicmFyeT1mdW5jdGlvbihiLGMsZil7dmFyIGc7aWYoIiI8Yil7aWYoImNocm9tZS1leHRlbnNpb246IiE9YS5zZWxmTG9jYXRpb24uc3Vic3RyKDAsMTcpKWI9YS5zZWxmTG9jYXRpb24rIi8iK2IrIj92PTAuOC42MiI7ZWxzZXtmb3IodmFyIGg9YS5zZWxmTG9jYXRpb24uc3BsaXQoIi8iKSxrPSIiLGw9MztsPGgubGVuZ3RoO2wrKykiIjxoW2xdJiYoIiI8ayYmKGsrPSIvIiksays9aFtsXSk7Yj1rKyIvIitiKyI/dj0wLjguMzQifWI9Yi5yZXBsYWNlKC9cL1wvL2csIi8iKTtiPWIucmVwbGFjZSgiaHR0cDovIiwiaHR0cDovLyIpO2I9Yi5yZXBsYWNlKCJodHRwczovIiwiaHR0cHM6Ly8iKTtiPWIucmVwbGFjZSgiZmlsZTovIiwKImZpbGU6Ly8iKTtoPWIuc3BsaXQoIi8iKTswPGgubGVuZ3RoJiYoZz1oW2gubGVuZ3RoLTFdKTsiZnVuY3Rpb24iPT10eXBlb2YgaW1wb3J0U2NyaXB0cz9pbXBvcnRTY3JpcHRzKGIpOihoPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0sMD5iLmluZGV4T2YoIi5jc3MiKT8oYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxjLnR5cGU9MDxiLmluZGV4T2YoIi5qcyIpPyJ0ZXh0L2phdmFzY3JpcHQiOiJ0ZXh0L3RleHQiLGMub25sb2FkPWYsYy5zcmM9YixoLmFwcGVuZENoaWxkKGMpKTooaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIiksay5pZD1jfHxnLGsucmVsPSJzdHlsZXNoZWV0IixrLnR5cGU9InRleHQvY3NzIixrLm1lZGlhPSJhbGwiLGsub25sb2FkPWYsay5ocmVmPWIsaC5hcHBlbmRDaGlsZChrKSkpO19kdW1wKGcrIiBhZGRlZCIpfX07YS5pc1dvcmtlcnx8YS5pc05vZGV8fHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwKZnVuY3Rpb24oKXt2YXIgYT0iQ1NTMUNvbXBhdCI9PT1kb2N1bWVudC5jb21wYXRNb2RlP2RvY3VtZW50LmRvY3VtZW50RWxlbWVudDpkb2N1bWVudC5ib2R5LGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNjcmVlbiIpO2ImJihiLnN0eWxlLndpZHRoPWEuY2xpZW50V2lkdGgrInB4Iil9KTtyZXR1cm4gYX07X2R1bXAoIlIxIik7dmFyIHlsb2FkZXI9eWxvYWRlckJhc2UoKTtfZHVtcCgiUjIiKTsKKGZ1bmN0aW9uKCl7eSQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmIiI8YSlpZigiIyI9PWEuc3Vic3RyKDAsMSkmJigwPGEuaW5kZXhPZigiICIpP2Q9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhKTphPWEuc3Vic3RyKDEpKSxkfHwoZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSksZHx8KGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoYSksZC5sZW5ndGg/KDE9PWQubGVuZ3RoJiYoZD1kWzBdKSwwPT09ZC5sZW5ndGgmJihkPXZvaWQgMCkpOmQ9dm9pZCAwKSxkKSJ1bmRlZmluZWQiIT09dHlwZW9mIGImJihjPTArYyxkLmdldEVsZW1lbnRzQnlUYWdOYW1lJiYoZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLDA8ZS5sZW5ndGgmJihkPWVbY10pKSk7ZWxzZXtkPWEuc3BsaXQoIiAiKTt2YXIgZTthPSEwO2ZvcihjPTA7YzxkLmxlbmd0aDtjKyspYj10cmltKGRbY10pLCIuIj09Yi5zdWJzdHIoMCwxKSYmKGI9Yi5zdWJzdHIoMSkpLGI9CmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZG9jdW1lbnQsIioiLGIpLDA8Yi5sZW5ndGgmJihhP2U9YjooYT0hMSxlPWFycmF5X2ludGVyc2VjdChlfHxbXSxiKSkpO2Q9ZX1yZXR1cm4gZH19KSgpOyJ1bmRlZmluZWQiPT10eXBlb2YgJCYmKCQ9eSQpOyJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYod2luZG93LmNyZWF0ZURPTUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7aXNPbk1vYmlsZSgpPyhiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KGEsITAsITApKTpiPW5ldyBFdmVudChhKTtyZXR1cm4gYn0pOwpmdW5jdGlvbiAkZnJhbWUoYSl7Ii4vIj09YS5zdWJzdHIoMCwyKSYmKGE9YS5zdWJzdHIoMikpO3ZhciBiOyIuLi8iPT1hLnN1YnN0cigwLDMpPyhiPXBhcmVudCxhPWEuc3Vic3RyKDMpKToiLyI9PWE/KGE9IiIsYj10b3ApOiIvIj09YS5zdWJzdHIoMCwxKT8oYj10b3AsYT1hLnN1YnN0cigxKSk6Yj1zZWxmO2lmKCIiPGEpe2E9YS5zcGxpdCgiLyIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9Yi5mcmFtZXNbYVtjXV19cmV0dXJuIGJ9ZnVuY3Rpb24gJGZyYW1lQnlOYW1lKGEpe19zZWFyY2hGcmFtZUJ5TmFtZV89ZnVuY3Rpb24oYSxjKXt2YXIgZD1udWxsO2lmKGEuZnJhbWVzKWZvcih2YXIgZT0wO251bGw9PT1kJiZlPGEuZnJhbWVzLmxlbmd0aDtlKyspZD1hLmZyYW1lc1tlXS5uYW1lPT1jP2EuZnJhbWVzW2VdOl9zZWFyY2hGcmFtZUJ5TmFtZV8oYS5mcmFtZXNbZV0sYyk7cmV0dXJuIGR9O3JldHVybiBfc2VhcmNoRnJhbWVCeU5hbWVfKHRvcCxhKX0KZnVuY3Rpb24gJGZyYW1lT3duZXIoYSxiKXtfc2VhcmNoRnVuY3Rpb25JbkZyYW1lXz1mdW5jdGlvbihhLGIsYyl7dmFyIGc7aWYoZXZhbCgidHlwZW9mIGYuIithKyI9PSciK2IrIiciKSlnPWM7ZWxzZXt2YXIgaD0wO2lmKGMuZnJhbWVzKWZvcig7aDxjLmZyYW1lcy5sZW5ndGgmJnZvaWQgMD09PWc7KWc9X3NlYXJjaEZ1bmN0aW9uSW5GcmFtZV8oYSxiLGMuZnJhbWVzW2grK10pfXJldHVybiBnfTt2YXIgYz0kZnJhbWUoIi8iKTtyZXR1cm4gX3NlYXJjaEZ1bmN0aW9uSW5GcmFtZV8oYSxiLGMpfWZ1bmN0aW9uIGlzU1NMKCl7cmV0dXJuIDA9PT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJodHRwczovLyIpfQpmdW5jdGlvbiB1cmxWYWx1ZShhKXt2YXIgYj1kb2N1bWVudC5sb2NhdGlvbi5zZWFyY2guc3BsaXQoIiYiKSxjPW51bGwsZCxlOzA8Yi5sZW5ndGgmJihiWzBdPWJbMF0uc3BsaXQoIj8iKVsxXSk7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylpZihlPWJbZF0uc3BsaXQoIj0iKSxlWzBdPT1hKXtjPWVbMV07YnJlYWt9cmV0dXJuIGN9CmZ1bmN0aW9uIHByb2R1Y2VXYWl0TXNnKGEpe3JldHVybic8c3R5bGUgdHlwZT0idGV4dC9jc3MiPlx4M2MhLS0ueVdhcm5CYW5uZXIgeyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7ICBmb250LXNpemU6IDE2cHg7ICBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyAgdGV4dC10cmFuc2Zvcm06IG5vbmU7IG1hcmdpbjogMTZweDsgcGFkZGluZzogOHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjREZFRUYyOyAgYm9yZGVyOiAxcHggZG90dGVkICMzODc1ODk7IGxpbmUtaGVpZ2h0OiAyNHB4O30tLVx4M2U8L3N0eWxlPicrJzxkaXYgY2xhc3M9eVdhcm5CYW5uZXI+PGltZyBzcmM9ImltYWdlcy93YWl0SWNvbi5naWYiIGhlaWdodD0xOHB4PiZuYnNwO3swfSZuYnNwOzwvZGl2PicuZm9ybWF0KGEpfQpmdW5jdGlvbiBjb3VudENoZWNrZWRFbGVtZW50cyhhKXthPXkkKGEpO3ZhciBiPTA7aWYoYSl7aXNBcnJheShhKXx8KGE9W2FdKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdLmNoZWNrZWQmJmIrK31yZXR1cm4gYn0KdmFyIEJhc2U2ND17X2tleVN0cjoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLGVuY29kZTpmdW5jdGlvbihhKXt2YXIgYj0iIixjLGQsZSxmLGcsaCxrPTA7Zm9yKGE9QmFzZTY0Ll91dGY4X2VuY29kZShhKTtrPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChrKyspLGQ9YS5jaGFyQ29kZUF0KGsrKyksZT1hLmNoYXJDb2RlQXQoaysrKSxmPWM+PjIsYz0oYyYzKTw8NHxkPj40LGc9KGQmMTUpPDwyfGU+PjYsaD1lJjYzLGlzTmFOKGQpP2c9aD02NDppc05hTihlKSYmKGg9NjQpLGI9Yit0aGlzLl9rZXlTdHIuY2hhckF0KGYpK3RoaXMuX2tleVN0ci5jaGFyQXQoYykrdGhpcy5fa2V5U3RyLmNoYXJBdChnKSt0aGlzLl9rZXlTdHIuY2hhckF0KGgpO3JldHVybiBifSxkZWNvZGU6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYyxkLGUsZixnLGg9MDtmb3IoYT1hLnJlcGxhY2UoL1teQS1aYS16MC05XCtcL1w9XS9nLCIiKTtoPAphLmxlbmd0aDspYz10aGlzLl9rZXlTdHIuaW5kZXhPZihhLmNoYXJBdChoKyspKSxkPXRoaXMuX2tleVN0ci5pbmRleE9mKGEuY2hhckF0KGgrKykpLGY9dGhpcy5fa2V5U3RyLmluZGV4T2YoYS5jaGFyQXQoaCsrKSksZz10aGlzLl9rZXlTdHIuaW5kZXhPZihhLmNoYXJBdChoKyspKSxjPWM8PDJ8ZD4+NCxkPShkJjE1KTw8NHxmPj4yLGU9KGYmMyk8PDZ8ZyxiKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGMpLDY0IT1mJiYoYis9U3RyaW5nLmZyb21DaGFyQ29kZShkKSksNjQhPWcmJihiKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpKTtyZXR1cm4gYj1CYXNlNjQuX3V0ZjhfZGVjb2RlKGIpfSxfdXRmOF9lbmNvZGU6ZnVuY3Rpb24oYSl7YT1hLnJlcGxhY2UoL1xyXG4vZywiXG4iKTtmb3IodmFyIGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hLmNoYXJDb2RlQXQoYyk7MTI4PmQ/Yis9U3RyaW5nLmZyb21DaGFyQ29kZShkKTooMTI3PGQmJjIwNDg+ZD9iKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGQ+Pgo2fDE5Mik6KGIrPVN0cmluZy5mcm9tQ2hhckNvZGUoZD4+MTJ8MjI0KSxiKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjYmNjN8MTI4KSksYis9U3RyaW5nLmZyb21DaGFyQ29kZShkJjYzfDEyOCkpfXJldHVybiBifSxfdXRmOF9kZWNvZGU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MCxkPWMxPWMyPTA7YzxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoYyksMTI4PmQ/KGIrPVN0cmluZy5mcm9tQ2hhckNvZGUoZCksYysrKToxOTE8ZCYmMjI0PmQ/KGMyPWEuY2hhckNvZGVBdChjKzEpLGIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKGQmMzEpPDw2fGMyJjYzKSxjKz0yKTooYzI9YS5jaGFyQ29kZUF0KGMrMSksYzM9YS5jaGFyQ29kZUF0KGMrMiksYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoZCYxNSk8PDEyfChjMiY2Myk8PDZ8YzMmNjMpLGMrPTMpO3JldHVybiBifX07CmZ1bmN0aW9uIGdldEVsZW1lbnRzQnlBdHRyaWJ1dGUoYSxiLGMsZCl7Y29uc29sZS5sb2coImdldEVsZW1lbnRzQnlBdHRyaWJ1dGUoKSIpO2E9YS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKTtiPVtdO2Zvcih2YXIgZT0idW5kZWZpbmVkIiE9dHlwZW9mIGQ/bmV3IFJlZ0V4cCgiKF58XFxzKSIrZCsiKFxcc3wkKSIsImkiKTpudWxsLGYsZyxoPTA7aDxhLmxlbmd0aDtoKyspZj1hW2hdLGc9Zi5nZXRBdHRyaWJ1dGUmJmYuZ2V0QXR0cmlidXRlKGMpLCJzdHJpbmciPT10eXBlb2YgZyYmMDxnLmxlbmd0aCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgZHx8ZSYmZS50ZXN0KGcpKSYmYi5wdXNoKGYpO3JldHVybiBifQoib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmInVuZGVmaW5lZCI9PXR5cGVvZiBnZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiYoY29uc29sZS5sb2coIlVzaW5nIG93biAnZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgpJyBmdW5jdGlvbiIpLHdpbmRvdy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPWZ1bmN0aW9uKGEsYixjKXthPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYik7Yj1bXTtmb3IodmFyIGQsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0pJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5oYXNDbGFzcyYmZC5oYXNDbGFzcyhjKSYmYi5wdXNoKGQpO251bGw9PT1iJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGMpKTtyZXR1cm4gYn0pOwpmdW5jdGlvbiBnZXRTdHlsZVJ1bGVWYWx1ZShhLGIpe2E9YXx8IiI7Zm9yKHZhciBjPTA7Yzxkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7YysrKWZvcih2YXIgZD1kb2N1bWVudC5zdHlsZVNoZWV0c1tjXSxkPWQuY3NzUnVsZXM/ZC5jc3NSdWxlczpkLnJ1bGVzLGU9MDtlPGQubGVuZ3RoO2UrKylpZihkW2VdLnNlbGVjdG9yVGV4dCYmZFtlXS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKT09PWEpcmV0dXJuInN0cmluZyI9PXR5cGVvZiBiP2RbZV0uc3R5bGVbYl06ZFtlXS5zdHlsZX0KZnVuY3Rpb24gc2V0U3R5bGVSdWxlVmFsdWUoYSxiLGMpe2E9YXx8IiI7Zm9yKHZhciBkPTA7ZDxkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7ZCsrKWZvcih2YXIgZT1kb2N1bWVudC5zdHlsZVNoZWV0c1tkXSxlPWUuY3NzUnVsZXM/ZS5jc3NSdWxlczplLnJ1bGVzLGY9MDtmPGUubGVuZ3RoO2YrKyllW2ZdLnNlbGVjdG9yVGV4dCYmZVtmXS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKT09PWEmJigic3RyaW5nIj09dHlwZW9mIGI/ZVtmXS5zdHlsZVtiXT1jOmVbZl0uc3R5bGU9Yyl9CmZ1bmN0aW9uIGNyZWF0ZVN0eWxlUnVsZShhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7Yy50eXBlPSJ0ZXh0L2NzcyI7YXV4PSIuezB9IHsiLmZvcm1hdChhKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiYoYXV4Kz0iXG5cdHswfTogezF9OyIuZm9ybWF0KGQsYltkXSkpO2F1eCs9In1cbiI7Yy5pbm5lckhUTUw9YXV4O2RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoYyl9ZnVuY3Rpb24gZXh0cmFjdFN0eWxlUnVsZShhKXt2YXIgYj17fTthPWdldFN0eWxlUnVsZVZhbHVlKGEpO2Zvcih2YXIgYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJiIiPGFbY10mJihpc051bWJlcihjKXx8KGJbY109YVtjXSkpO3JldHVybiBifQp2YXIgZ2V0Q2xpZW50U2l6ZT1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50JiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OntjbGllbnRXaWR0aDo4MDAsY2xpZW50SGVpZ2h0OjYwMH0sYj13aW5kb3c/d2luZG93Ontpbm5lcldpZHRoOjgwMCxpbm5lckhlaWdodDo2MDB9LGM9TWF0aC5tYXgoYS5jbGllbnRXaWR0aCxiLmlubmVyV2lkdGh8fDApLGE9TWF0aC5tYXgoYS5jbGllbnRIZWlnaHQsYi5pbm5lckhlaWdodHx8MCk7cmV0dXJuW2MsYV19OwppZigidW5kZWZpbmVkIj09dHlwZW9mIHJlc2l6ZUlmcmFtZSl2YXIgcmVzaXplSWZyYW1lPWZ1bmN0aW9uKGEsYil7Yj1ifHx7fTtiLndpZHRoPWIud2lkdGh8fDA7Yi5oZWlnaHQ9Yi5oZWlnaHR8fDA7dmFyIGMsZDtjPXNjcmVlbi5oZWlnaHQ7ZD0oYS5jb250ZW50V2luZG93fHxhLmNvbnRlbnREb2N1bWVudHx8YSkuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQrNDAtYi5oZWlnaHQ7Yz1NYXRoLm1heChjLGQpO2Euc3R5bGUuaGVpZ2h0PWMrInB4IjtjPXNjcmVlbi53aWR0aDtkPShhLmNvbnRlbnRXaW5kb3d8fGEuY29udGVudERvY3VtZW50fHxhKS5kb2N1bWVudC5ib2R5LnNjcm9sbFdpZHRoKzQwLWIud2lkdGg7Yz1NYXRoLm1heChjLGQpO2Euc3R5bGUud2lkdGg9YysicHgiOyhjPWEuZ2V0QXR0cmlidXRlKCJvblJlc2l6ZSIpKSYmZXZhbChjKX07CiJ1bmRlZmluZWQiIT09dHlwZW9mIEVsZW1lbnQmJihFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzfHwoRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcz1FbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yKSxFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0fHwoRWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdD1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2lmKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMoYikpcmV0dXJuIG51bGw7ZG97aWYoYi5tYXRjaGVzKGEpKXJldHVybiBiO2I9Yi5wYXJlbnRFbGVtZW50fHxiLnBhcmVudE5vZGV9d2hpbGUobnVsbCE9PWIpO3JldHVybiBudWxsfSkpOwppZigib2JqZWN0Ij09dHlwZW9mIEhUTUxFbGVtZW50fHwiZnVuY3Rpb24iPT10eXBlb2YgSFRNTEVsZW1lbnQpSFRNTEVsZW1lbnQucHJvdG90eXBlLmhhc0NsYXNzPWZ1bmN0aW9uKGEpe3ZhciBiPSExO2lmKHRoaXMuY2xhc3NOYW1lKWZvcih2YXIgYz1hLmluZGV4T2YoIioiKSxkPXRoaXMuY2xhc3NOYW1lLnNwbGl0KCIgIiksZT0wO2U8ZC5sZW5ndGg7ZSsrKTA8PWM/ZFtlXS5zdWJzdHIoMCxjKT09YS5zdWJzdHIoMCxjKSYmKGI9ITApOmRbZV09PWEmJihiPSEwKTtyZXR1cm4gYn0sSFRNTEVsZW1lbnQucHJvdG90eXBlLnNldE9wYWNpdHk9ZnVuY3Rpb24oYSl7YT1NYXRoLm1heCgwLE1hdGgubWluKGEsMTAwKSk7dGhpcy5zdHlsZS5vcGFjaXR5PWEvMTAwO3RoaXMuc3R5bGUuZmlsdGVyPSJhbHBoYShvcGFjaXR5PXswfSkiLmZvcm1hdChhKX0sSFRNTEVsZW1lbnQucHJvdG90eXBlLmRlbGV0ZUNsYXNzPWZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9dGhpcy5jbGFzc05hbWUuc3BsaXQoIiAiKTsKYT0oYXx8IiIpLnNwbGl0KCIgIik7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspMD5hLmluZGV4T2YoY1tkXSkmJihiPWIrIiAiK2NbZF0pO3RoaXMuY2xhc3NOYW1lPXRyaW0oYik7cmV0dXJuIHRoaXN9LEhUTUxFbGVtZW50LnByb3RvdHlwZS5yZW1vdmVDbGFzcz1IVE1MRWxlbWVudC5wcm90b3R5cGUuZGVsZXRlQ2xhc3MsSFRNTEVsZW1lbnQucHJvdG90eXBlLmFkZENsYXNzPWZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9dGhpcy5jbGFzc05hbWUsZD10aGlzLmNsYXNzTmFtZS5zcGxpdCgiICIpO2E9KGF8fCIiKS5zcGxpdCgiICIpO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKTA+ZC5pbmRleE9mKGFbZV0pJiYoYz1jKyIgIithW2VdLGI9ITApO2ImJih0aGlzLmNsYXNzTmFtZT10cmltKGMpKTtyZXR1cm4gdGhpc30sSFRNTEVsZW1lbnQucHJvdG90eXBlLnNpYmxpbmdzPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkLGI9W107YTspYSE9CnRoaXMmJjE9PWEubm9kZVR5cGUmJmIucHVzaChhKSxhPWEubmV4dFNpYmxpbmc7cmV0dXJuIGJ9LEhUTUxFbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGV8fChIVE1MRWxlbWVudC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoO2MrKyl0aGlzLmF0dHJpYnV0ZXNbY10ubmFtZT09YSYmKGI9YXR0cmlidXRlc1tjXS52YWx1ZSk7cmV0dXJuIGJ9KSxIVE1MRWxlbWVudC5wcm90b3R5cGUuYmxvY2t8fChIVE1MRWxlbWVudC5wcm90b3R5cGUuYmxvY2s9ZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSgiYmxvY2tlZCIsImJsb2NrZWQiKTtyZXR1cm4gdGhpc30pLEhUTUxFbGVtZW50LnByb3RvdHlwZS51bmJsb2NrfHwoSFRNTEVsZW1lbnQucHJvdG90eXBlLnVuYmxvY2s9ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYmxvY2tlZCIpO3JldHVybiB0aGlzfSksSFRNTEVsZW1lbnQucHJvdG90eXBlLmlzQmxvY2tlZHx8CihIVE1MRWxlbWVudC5wcm90b3R5cGUuaXNCbG9ja2VkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRBdHRyaWJ1dGUoImJsb2NrZWQiKTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGEmJiJibG9ja2VkIj09YS50b0xvd2VyQ2FzZSgpfSksSFRNTEVsZW1lbnQucHJvdG90eXBlLmxvY2t8fChIVE1MRWxlbWVudC5wcm90b3R5cGUubG9jaz1mdW5jdGlvbigpe3RoaXMuaXNCbG9ja2VkKCl8fCh0aGlzLnJlYWRPbmx5PSEwKTtyZXR1cm4gdGhpc30pLEhUTUxFbGVtZW50LnByb3RvdHlwZS51bmxvY2t8fChIVE1MRWxlbWVudC5wcm90b3R5cGUudW5sb2NrPWZ1bmN0aW9uKCl7dGhpcy5pc0Jsb2NrZWQoKXx8KHRoaXMucmVhZE9ubHk9ITEpO3JldHVybiB0aGlzfSksSFRNTEVsZW1lbnQucHJvdG90eXBlLnNlbGVjdGVkfHwoSFRNTEVsZW1lbnQucHJvdG90eXBlLnNlbGVjdGVkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMubGlzdCl7dmFyIGI9dHJpbSh0aGlzLnZhbHVlKSwKYz10aGlzLmxpc3Qub3B0aW9ucyxkO2ZvcihkIGluIGMpaWYoYy5oYXNPd25Qcm9wZXJ0eShkKSYmdHJpbShjW2RdLmlubmVySFRNTCk9PWIpe2E9Y1tkXTticmVha319cmV0dXJuIGF9KTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaHx8KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGEpe2lmKHZvaWQgMD09PXRoaXN8fG51bGw9PT10aGlzKXRocm93IG5ldyBUeXBlRXJyb3I7dmFyIGI9T2JqZWN0KHRoaXMpLGM9Yi5sZW5ndGg+Pj4wO2lmKCJmdW5jdGlvbiIhPT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yO2Zvcih2YXIgZD0yPD1hcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50c1sxXTp2b2lkIDAsZT0wO2U8YztlKyspZSBpbiBiJiZhLmNhbGwoZCxiW2VdLGUsYil9KTsKQXJyYXkucHJvdG90eXBlLnVuaXF1ZXx8KEFycmF5LnByb3RvdHlwZS51bmlxdWU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihiLGMpe3JldHVybiBhLmluZGV4T2YoYik9PWN9KX0pO3ZhciBtZXJnZU9iamVjdD1mdW5jdGlvbihhLGIsYyl7dm9pZCAwPT09YyYmKGM9ITEpO2I9Ynx8e307Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmKHZvaWQgMD09PWJbZF18fGMpJiYoYltkXT1hW2RdKX07ZnVuY3Rpb24gaXNQcm9wZXJ0eVN1cHBvcnRlZChhKXtyZXR1cm4gYSBpbiBkb2N1bWVudC5ib2R5LnN0eWxlfWZ1bmN0aW9uIGlzRW1wdHkoYSl7Zm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSlyZXR1cm4hMTtyZXR1cm4hMH0KU3RyaW5nLnByb3RvdHlwZS5hc1Bob25lfHwoU3RyaW5nLnByb3RvdHlwZS5hc1Bob25lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVwbGFjZSgvXEQrL2csIiIpLnJlcGxhY2UoLyhcZHsyLDN9KShcZHszfSkoXGR7M30pLywiJDEtJDItJDMiKX0pOwpTdHJpbmcucHJvdG90eXBlLmFiYnJldmlhdGV8fChTdHJpbmcucHJvdG90eXBlLmFiYnJldmlhdGU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1mdW5jdGlvbigpeyIiPHYmJihoLmxlbmd0aCtrLmxlbmd0aCt2Lmxlbmd0aCsoMDxoLmxlbmd0aD8xOjA8MCtrLmxlbmd0aD8xOjApPGE/KGs9dHJpbSh2KyIgIitrKSx3KyspOmgubGVuZ3RoK2subGVuZ3RoKzE8YSYmKGs9dHJpbSh2LnN1YnN0cigwLDEpKyIuIitrKSx3KyspKX0sZD1mdW5jdGlvbigpeyIiPGwmJihoLmxlbmd0aCtrLmxlbmd0aCtsLmxlbmd0aCsoMDxoLmxlbmd0aD8xOjA8MCtrLmxlbmd0aD8xOjApPGE/KGg9dHJpbShoKyIgIitsKSx3KyspOmgubGVuZ3RoK2subGVuZ3RoKzE8YSYmKGg9dHJpbShoKyIgIitsLnN1YnN0cigwLDEpKyIuIiksdysrKSl9O2I9Ynx8ITE7YT1zdHIyaW50KGEpO2lmKDA8dGhpcy5pbmRleE9mKCIgIikpe2Zvcih2YXIgZSxmLGc9dGhpcy50b1N0cmluZygpLGg9IiIsaz0iIixsLHYsdztoLmxlbmd0aCsKay5sZW5ndGgrMTw9YSYmKGc9dHJpbShnKSxlPWcuaW5kZXhPZigiICIpLDA+ZSYmKGU9Zy5sZW5ndGgpLGY9Zy5sYXN0SW5kZXhPZigiICIpLGw9dHJpbShnLnN1YnN0cigwLGUpKSx2PSIiLGU8ZiYmKHY9dHJpbShnLnN1YnN0cihmKSksZz10cmltKGcuc3Vic3RyKDAsZikpKSxnPXRyaW0oZy5zdWJzdHIoZSkpLHc9MCxiP2QoKTpjKCksbCE9diYmKGI/YygpOmQoKSksMCE9PXcpOyk7cmV0dXJuIHRyaW0oaCsiICIrayl9cmV0dXJuIHRoaXMuc3Vic3RyKDAsYSl9KTtTdHJpbmcucHJvdG90eXBlLnVjRmlyc3R8fChTdHJpbmcucHJvdG90eXBlLnVjRmlyc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0aGlzLnNsaWNlKDEpfSk7U3RyaW5nLnByb3RvdHlwZS5sY0ZpcnN0fHwoU3RyaW5nLnByb3RvdHlwZS5sY0ZpcnN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkrdGhpcy5zbGljZSgxKX0pOwpTdHJpbmcucHJvdG90eXBlLnN0cmlwVGFnc3x8KFN0cmluZy5wcm90b3R5cGUuc3RyaXBUYWdzPWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXN8fCIiKS5yZXBsYWNlKC88KD86LnxcbikqPz4vZ20sIiIpfSk7U3RyaW5nLnByb3RvdHlwZS5yZXBlYXR8fChTdHJpbmcucHJvdG90eXBlLnJlcGVhdD1mdW5jdGlvbihhLGIpe3JldHVybiBBcnJheSgoYXx8MSkrMSkuam9pbihifHx0aGlzKX0pO1N0cmluZy5wcm90b3R5cGUucXVvdGVTdHJpbmd8fChTdHJpbmcucHJvdG90eXBlLnF1b3RlU3RyaW5nPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPSExKTt2YXIgYj10aGlzLnZhbHVlT2YoKTtpc051bWJlcihiKT9iPXBhcnNlRmxvYXQoYik6YSYmIiI9PT1iP2I9bnVsbDooYj10aGlzLnJlcGxhY2UoL1wiL2csJ1xcIicpLGI9JyInK2IrJyInKTtyZXR1cm4gYn0pOwpTdHJpbmcucHJvdG90eXBlLnF1b3RlfHwoU3RyaW5nLnByb3RvdHlwZS5xdW90ZT1mdW5jdGlvbigpe3JldHVybiciJyt0aGlzLnJlcGxhY2UoL1wiL2csJ1xcIicpKyciJ30pO1N0cmluZy5wcm90b3R5cGUudW5xdW90ZXx8KFN0cmluZy5wcm90b3R5cGUudW5xdW90ZT1mdW5jdGlvbigpe3ZhciBhPSIiLGI9IiI7cmV0dXJuIDE8dGhpcy5sZW5ndGg/KGE9dGhpcy5zdWJzdHIoMCwxKSxiPXRoaXMuc3Vic3RyKHRoaXMubGVuZ3RoLTEsMSksYT09Yj8nIic9PWJ8fCInIj09Yj90aGlzLnN1YnN0cigxLHRoaXMubGVuZ3RoLTIpOnRoaXMudG9TdHJpbmcoKSsiIjoiKCI9PWEmJiIpIj09Ynx8IlsiPT1hJiYiXSI9PWJ8fCJ7Ij09YSYmIn0iPT1iP3RoaXMuc3Vic3RyKDEsdGhpcy5sZW5ndGgtMik6dGhpcy50b1N0cmluZygpKyIiKTp0aGlzLnRvU3RyaW5nKCkrIiJ9KTsKU3RyaW5nLnByb3RvdHlwZS5mb3JtYXR8fChTdHJpbmcucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50cztyZXR1cm4gdGhpcy5yZXBsYWNlKC97KFxkKyl9L2csZnVuY3Rpb24oYixjKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGFbY10/YVtjXTpifSl9KTsKU3RyaW5nLnByb3RvdHlwZS5leHRlbnNvPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bInplcm8gdW0gZG9pcyB0clx1MDBjM1x1MDBhYXMgcXVhdHJvIGNpbmNvIHNlaXMgc2V0ZSBvaXRvIG5vdmUgZGV6IG9uemUgZG96ZSB0cmV6ZSBxdWF0b3J6ZSBxdWluemUgZGV6ZXNzZWlzIGRlemVzc2V0ZSBkZXpvaXRvIGRlemVub3ZlIi5zcGxpdCgiICIpLCJkZXogdmludGUgdHJpbnRhIHF1YXJlbnRhIGNpbnFcdTAwYzNcdTAwYmNlbnRhIHNlc3NlbnRhIHNldGVudGEgb2l0ZW50YSBub3ZlbnRhIi5zcGxpdCgiICIpLCJjZW0gY2VudG8gZHV6ZW50b3MgdHJlemVudG9zIHF1YXRyb2NlbnRvcyBxdWluaGVudG9zIHNlaXNjZW50b3Mgc2V0ZWNlbnRvcyBvaXRvY2VudG9zIG5vdmVjZW50b3MiLnNwbGl0KCIgIiksIm1pbCBtaWxoXHUwMGMzXHUwMGEzbyBiaWxoXHUwMGMzXHUwMGEzbyB0cmlsaFx1MDBjM1x1MDBhM28gcXVhZHJpbGhcdTAwYzNcdTAwYTNvIHF1aW50aWxoXHUwMGMzXHUwMGEzbyBzZXh0aWxoXHUwMGMzXHUwMGEzbyBzZXRpbGhcdTAwYzNcdTAwYTNvIG9jdGlsaFx1MDBjM1x1MDBhM28gbm9uaWxoXHUwMGMzXHUwMGEzbyBkZWNpbGhcdTAwYzNcdTAwYTNvIHVuZGVjaWxoXHUwMGMzXHUwMGEzbyBkb2RlY2lsaFx1MDBjM1x1MDBhM28gdHJlZGVjaWxoXHUwMGMzXHUwMGEzbyBxdWF0cm9kZWNpbGhcdTAwYzNcdTAwYTNvIHF1aW5kZWNpbGhcdTAwYzNcdTAwYTNvIHNlZGVjaWxoXHUwMGMzXHUwMGEzbyBzZXB0ZW5kZWNpbGhcdTAwYzNcdTAwYTNvIG9jdGVuY2lsaFx1MDBjM1x1MDBhM28gbm9uZW5jaWxoXHUwMGMzXHUwMGEzbyIuc3BsaXQoIiAiKV0sCmMsZCxlLGY9dGhpcy5yZXBsYWNlKGE/L1teLFxkXS9nOi9cRC9nLCIiKS5zcGxpdCgiLCIpLGc9Zi5sZW5ndGgtMSxoLGs9LTEsbD1bXSx2PVtdLHc9IiI7KytrPD1nO3Y9W10paWYoayYmKGZba109KDEqKCIuIitmW2tdKSkudG9GaXhlZCgyKS5zbGljZSgyKSksKGM9KGQ9ZltrXSkuc2xpY2UoKGg9ZC5sZW5ndGgpJTMpLm1hdGNoKC9cZHszfS9nKSxkPWglMz9bZC5zbGljZSgwLGglMyldOltdLGQ9Yz9kLmNvbmNhdChjKTpkKS5sZW5ndGgpe2M9LTE7Zm9yKGg9ZC5sZW5ndGg7KytjPGg7dz0iIilpZihlPTEqZFtjXSkyMD5lJTEwMCYmKHcrPWJbMF1bZSUxMDBdKXx8ZSUxMDArMSYmKHcrPWJbMV1bKGUlMTAwLzEwPj4wKS0xXSsoZSUxMD8iIGUgIitiWzBdW2UlMTBdOiIiKSksdi5wdXNoKCgxMDA+ZT93OmUlMTAwP2JbMl1bZS8xMDA+PjBdKyIgZSAiK3c6YlsyXVsxMDA9PWU/MDplLzEwMD4+MF0pKygtMTwodz1oLWMtMik/IiAiKygxPGUmJjA8dz9iWzNdW3ddLnJlcGxhY2UoIlx1MDBjM1x1MDBhM28iLAoiXHUwMGMzXHUwMGI1ZXMiKTpiWzNdW3ddKToiIikpOyhjPTE8di5sZW5ndGg/KGM9di5wb3AoKSx2LmpvaW4oIiAiKSsiIGUgIitjKTp2LmpvaW4oIiIpfHwoIWsmJjA8MSpmW2srMV18fGwubGVuZ3RoPyIiOmJbMF1bMF0pKSYmbC5wdXNoKGMrKGE/IiAiKygxPDEqZC5qb2luKCIiKT9rPyJjZW50YXZvcyI6KC8wezYsfSQvLnRlc3QoZlswXSk/ImRlICI6IiIpKyJyZWFsIi5yZXBsYWNlKCJsIiwiaXMiKTprPyJjZW50YXZvIjoicmVhbCIpOiIiKSl9cmV0dXJuIGwuam9pbigiIGUgIil9OwpTdHJpbmcucHJvdG90eXBlLmlzUElTfHwoU3RyaW5nLnByb3RvdHlwZS5pc1BJUz1mdW5jdGlvbigpe3ZhciBhLGIsYz10aGlzLGQ9WzMsMiw5LDgsNyw2LDUsNCwzLDJdLGU9ITE7aWYoMTE9PShjPWMucmVwbGFjZSgvW15cZF0vZywiIikuc3BsaXQoIiIpKS5sZW5ndGgpe2E9Y1swXTtmb3IoYj0xO2I8Yy5sZW5ndGgmJmNbYl09PWE7KWIrKztpZihiPGMubGVuZ3RoKXtmb3IoYj1hPTA7MTA+YjtiKyspYSs9Y1tiXSpkW2JdO3Jlc3RvPTExLWElMTE7cmVzdG89MTA9PXJlc3RvfHwoMTE9PXJlc3RvPzA6cmVzdG8pO2RpZ2l0bz1jWzEwXTtlPXJlc3RvPT1kaWdpdG99fXJldHVybiBlfSk7ClN0cmluZy5wcm90b3R5cGUuaXNDTlN8fChTdHJpbmcucHJvdG90eXBlLmlzQ05TPWZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnJlcGxhY2UoL1teXGRdL2csIiIpLGM9MDtpZihiLm1hdGNoKCJbMS0yXVxcZHsxMH0wMFswLTFdXFxkIil8fGIubWF0Y2goIls3LTldXFxkezE0fSIpKXtiPWIuc3BsaXQoIiIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYys9TWF0aC5mbG9vcihiW2FdLDEwKSooMTUtYSk7YT0wPT1jJTExfXJldHVybiBhfSk7CmlmKCFTdHJpbmcucHJvdG90eXBlLmlzQ1BGKXt2YXIgX21vZF89ZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5yb3VuZChhLU1hdGguZmxvb3IoYS9iKSpiKX07U3RyaW5nLnByb3RvdHlwZS5pc0NQRj1mdW5jdGlvbigpe3ZhciBhLGI9dGhpcztpZigxMSE9KGI9Yi5yZXBsYWNlKC9bXlxkXS9nLCIiKS5zcGxpdCgiIikpLmxlbmd0aHx8KG5ldyBSZWdFeHAoIl4iK2JbMF0rInsxMX0kIikpLnRlc3QoYi5qb2luKCIiKSkpcmV0dXJuITE7YT0xMDtmb3IoaT1uPTA7Mjw9YTtuKz1iW2krK10qYS0tKTtpZihiWzldIT0oMj4obiU9MTEpPzA6MTEtbikpcmV0dXJuITE7YT0xMTtmb3IoaT1uPTA7Mjw9YTtuKz1iW2krK10qYS0tKTtyZXR1cm4gYlsxMF0hPSgyPihuJT0xMSk/MDoxMS1uKT8hMTohMH07U3RyaW5nLnByb3RvdHlwZS5nZXJhckNOUEo9ZnVuY3Rpb24oKXt2YXIgYT1NYXRoLnJvdW5kKDkqTWF0aC5yYW5kb20oKSksYj1NYXRoLnJvdW5kKDkqTWF0aC5yYW5kb20oKSksYz1NYXRoLnJvdW5kKDkqCk1hdGgucmFuZG9tKCkpLGQ9TWF0aC5yb3VuZCg5Kk1hdGgucmFuZG9tKCkpLGU9TWF0aC5yb3VuZCg5Kk1hdGgucmFuZG9tKCkpLGY9TWF0aC5yb3VuZCg5Kk1hdGgucmFuZG9tKCkpLGc9TWF0aC5yb3VuZCg5Kk1hdGgucmFuZG9tKCkpLGg9TWF0aC5yb3VuZCg5Kk1hdGgucmFuZG9tKCkpLGs7az1fbW9kXyg1KmErNCpiKzMqYysyKmQrOSplKzgqZis3KmcrNipoKzIsMTEpO3ZhciBsPTI+az8wOjExLWs7az1fbW9kXyg2KmErNSpiKzQqYyszKmQrMiplKzkqZis4KmcrNypoKzMrMipsLDExKTtyZXR1cm4iIithK2IrIi4iK2MrZCtlKyIuIitmK2craCsiLzAwMDEtIitsKygyPms/MDoxMS1rKX07U3RyaW5nLnByb3RvdHlwZS5nZXJhckNQRj1mdW5jdGlvbigpe3ZhciBhPU1hdGgucm91bmQoOSpNYXRoLnJhbmRvbSgpKSxiPU1hdGgucm91bmQoOSpNYXRoLnJhbmRvbSgpKSxjPU1hdGgucm91bmQoOSpNYXRoLnJhbmRvbSgpKSxkPU1hdGgucm91bmQoOSpNYXRoLnJhbmRvbSgpKSxlPQpNYXRoLnJvdW5kKDkqTWF0aC5yYW5kb20oKSksZj1NYXRoLnJvdW5kKDkqTWF0aC5yYW5kb20oKSksZz1NYXRoLnJvdW5kKDkqTWF0aC5yYW5kb20oKSksaD1NYXRoLnJvdW5kKDkqTWF0aC5yYW5kb20oKSksaz1NYXRoLnJvdW5kKDkqTWF0aC5yYW5kb20oKSksbDtsPV9tb2RfKDEwKmErOSpiKzgqYys3KmQrNiplKzUqZis0KmcrMypoKzIqaywxMSk7dmFyIHY9Mj5sPzA6MTEtbDtsPV9tb2RfKDExKmErMTAqYis5KmMrOCpkKzcqZSs2KmYrNSpnKzQqaCszKmsrMip2LDExKTtyZXR1cm4iIithK2IrYysiLiIrZCtlK2YrIi4iK2craCtrKyItIit2KygyPmw/MDoxMS1sKX07U3RyaW5nLnByb3RvdHlwZS5hc0NQRj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcGxhY2UoLyhcZHszfSkoXGR7M30pKFxkezN9KShcZHsyfSkvZywiJDEuJDIuJDMtJDQiKX07U3RyaW5nLnByb3RvdHlwZS5hc0NOUEo9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXBsYWNlKC8oXGR7Mn0pKFxkezN9KShcZHszfSkoXGR7NH0pKFxkezJ9KS9nLAoiJDEuJDIuJDMvJDQtJDUiKX07U3RyaW5nLnByb3RvdHlwZS5hc0NFUD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcGxhY2UoLyhcZHsyfSkoXGR7M30pKFxkezN9KS9nLCIkMSQyLSQzIil9O1N0cmluZy5wcm90b3R5cGUuYXNQaG9uZT1mdW5jdGlvbihhKXthPWF8fCExO2Zvcih2YXIgYj0iIit0aGlzLnJlcGxhY2UoL1xEL2csIiIpOyIwIj09Yi5zdWJzdHIoMCwxKTspYj1iLnN1YnN0cigxKTtpZig4PT1iLmxlbmd0aClyZXR1cm4gYi5yZXBsYWNlKC8oXGR7NH0pKFxkezR9KS9nLCIkMS0kMiIpO2lmKDk9PWIubGVuZ3RoKXJldHVybiBhP2IucmVwbGFjZSgvKFxkezN9KShcZHszfSkoXGR7M30pL2csIiQxLSQyLSQzIik6Yi5yZXBsYWNlKC8oXGR7MX0pKFxkezR9KShcZHs0fSkvZywiJDEgJDItJDMiKTtpZigxMD09Yi5sZW5ndGgpcmV0dXJuIGIucmVwbGFjZSgvKFxkezJ9KShcZHs0fSkoXGR7NH0pL2csIigkMSkgJDItJDMiKTtpZigxMT09Yi5sZW5ndGgpcmV0dXJuIGE/Yi5yZXBsYWNlKC8oXGR7Mn0pKFxkezN9KShcZHszfSkoXGR7M30pL2csCiIoJDEpICQyICQzICQ0Iik6Yi5yZXBsYWNlKC8oXGR7Mn0pKFxkezF9KShcZHs0fSkoXGR7NH0pL2csIigkMSkgJDIgJDMtJDQiKTtpZigxMj09Yi5sZW5ndGgpcmV0dXJuIGIucmVwbGFjZSgvKFxkezJ9KShcZHsyfSkoXGR7NH0pKFxkezR9KS9nLCIrJDEgKCQyKSAkMy0kNCIpO2lmKDEzPT1iLmxlbmd0aClyZXR1cm4gYT9iLnJlcGxhY2UoLyhcZHsyfSkoXGR7Mn0pKFxkezN9KShcZHszfSkoXGR7M30pL2csIiskMSAoJDIpICQzLSQ0LSQ1Iik6Yi5yZXBsYWNlKC8oXGR7Mn0pKFxkezJ9KShcZHsxfSkoXGR7NH0pKFxkezR9KS9nLCIrJDEgKCQyKSAkMyAkNC0kNSIpfTtTdHJpbmcucHJvdG90eXBlLmFzUkc9ZnVuY3Rpb24oKXt2YXIgYT0iIit0aGlzLnJlcGxhY2UoL1teYS16QS1aMC05XSsvZywiIik7cmV0dXJuIDg9PWEubGVuZ3RoP2EucmVwbGFjZSgvKFx3ezF9KShcZHs0fSkoXGR7Mn0pKFxkezF9KSQvLCIkMS4kMi4kMy0kNCIpOmEucmVwbGFjZSgvKFxkezJ9KShcZHszfSkoXGR7M30pKFxkezF9KSQvLAoiJDEuJDIuJDMtJDQiKX19U3RyaW5nLnByb3RvdHlwZS5pc0NOSHx8KFN0cmluZy5wcm90b3R5cGUuaXNDTkg9ZnVuY3Rpb24oKXtpZigxMT09dGhpcy5sZW5ndGgpe3ZhciBhLGIsYyxkLGUsZixnO2Y9dGhpcy5zdWJzdHIoMCw5KTtnPXRoaXMuc3Vic3RyKDksMik7Yz1lPTA7Yj05O2ZvcihhPTA7OT5hO2ErKyljKz1zdHIyaW50KGYuc3Vic3RyKGEsMSkpKmIsYi0tO2Q9YyUxMTsxMD09ZCYmKGU9LTIpOzk8ZCYmKGQ9MCk7Yz0wO2I9MTtmb3IoYT0wOzk+YTthKyspYys9c3RyMmludChmLnN1YnN0cihhLDEpKSpiLGIrKzthPTA+YyUxMStlPzExK2MlMTErZTpjJTExK2U7OTxhJiYoYT0wKTtyZXR1cm4iIitkKyIiK2E9PWd9fSk7ClN0cmluZy5wcm90b3R5cGUuaXNDcmVkaXRDYXJkfHwoU3RyaW5nLnByb3RvdHlwZS5pc0NyZWRpdENhcmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGY7Yz0hMDtkPTA7dmFyIGc9dGhpcy5yZXBsYWNlKC9cRC9nLCIiKTtiPShnKyIiKS5zcGxpdCgiIikucmV2ZXJzZSgpO2U9MDtmb3IoZj1iLmxlbmd0aDtlPGY7ZSsrKXthPWJbZV07YT1wYXJzZUludChhLDEwKTtpZihjPSFjKWEqPTI7OTxhJiYoYS09OSk7ZCs9YX1yZXR1cm4gMDxnLmxlbmd0aCYmMD09PWQlMTB9KTtTdHJpbmcucHJvdG90eXBlLmlzRW1haWx8fChTdHJpbmcucHJvdG90eXBlLmlzRW1haWw9ZnVuY3Rpb24oKXtyZXR1cm4gaXNFbWFpbCh0aGlzKX0pOwpTdHJpbmcucHJvdG90eXBlLmlzQ05QSnx8KFN0cmluZy5wcm90b3R5cGUuaXNDTlBKPWZ1bmN0aW9uKCl7dmFyIGEsYj1bNiw1LDQsMywyLDksOCw3LDYsNSw0LDMsMl0sYz10aGlzO2lmKDE0IT0oYz1jLnJlcGxhY2UoL1teXGRdL2csIiIpLnNwbGl0KCIiKSkubGVuZ3RoKXJldHVybiExO2ZvcihuPWE9MDsxMj5hO24rPWNbYV0qYlsrK2FdKTtpZihjWzEyXSE9KDI+KG4lPTExKT8wOjExLW4pKXJldHVybiExO2ZvcihuPWE9MDsxMj49YTtuKz1jW2FdKmJbYSsrXSk7cmV0dXJuIGNbMTNdIT0oMj4obiU9MTEpPzA6MTEtbik/ITE6ITB9KTsKU3RyaW5nLnByb3RvdHlwZS50b0Zsb2F0fHwoU3RyaW5nLnByb3RvdHlwZS50b0Zsb2F0PWZ1bmN0aW9uKCl7bj10aGlzO2lmKG4ubWF0Y2goL14tPygoXGQqWywuXSl7MSw0fSk/XGQqJC8pKXt2YXIgYT1uLmluZGV4T2YoIi4iKSxiPW4uaW5kZXhPZigiLCIpO2E8YiYmKG49bi5yZXBsYWNlKCIuIiwiIikpO249bi5yZXBsYWNlKCIsIiwiLiIpO3JldHVybiBwYXJzZUZsb2F0KG4pfXJldHVybiBOYU59KTtGdW5jdGlvbi5wcm90b3R5cGUubWV0aG9kPWZ1bmN0aW9uKGEsYil7dGhpcy5wcm90b3R5cGVbYV09YjtyZXR1cm4gdGhpc307RnVuY3Rpb24ubWV0aG9kKCJpbmhlcml0cyIsZnVuY3Rpb24oYSl7dGhpcy5wcm90b3R5cGU9bmV3IGE7cmV0dXJuIHRoaXN9KTsiZnVuY3Rpb24iIT09dHlwZW9mIE9iamVjdC5jcmVhdGUmJihPYmplY3QuY3JlYXRlPWZ1bmN0aW9uKGEpe3ZhciBiPWZ1bmN0aW9uKCl7fTtiLnByb3RvdHlwZT1hO3JldHVybiBuZXcgYn0pOwpBcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8KEFycmF5LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5sZW5ndGg+Pj4wLGQ9TnVtYmVyKGIpfHwwLGQ9MD5kP01hdGguY2VpbChkKTpNYXRoLmZsb29yKGQpO2ZvcigwPmQmJihkKz1jKTtkPGM7ZCsrKWlmKGQgaW4gdGhpcyYmdGhpc1tkXT09PWEpcmV0dXJuIGQ7cmV0dXJuLTF9KTt2YXIgZm9yY2VTdHJpbmdWYWx1ZT1mdW5jdGlvbihhLGIpe3JldHVybigoYVtiXXx8IiIpKyIiKS51bnF1b3RlKCl9O2FycmF5X2ludGVyc2VjdD1mdW5jdGlvbihhLGIpe3ZhciBjPWI7Yi5sZW5ndGg+YS5sZW5ndGgmJihiPWEsYT1jKTtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7aWYoLTEhPT1iLmluZGV4T2YoYSkpcmV0dXJuITB9KX07CnZhciBzdWdnZXN0S2V5TmFtZT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1udWxsO2lmKGIpe3ZhciBmO2lmKGlzQXJyYXkoYSkpe2Y9e307Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspYUNvbE5hbWU9YVtnXSxmW2FDb2xOYW1lXT1hQ29sTmFtZX1lbHNlIGY9YTthPWIudG9VcHBlckNhc2UoKTtmb3IodmFyIGggaW4gZilmLmhhc093blByb3BlcnR5KGgpJiZoLnRvVXBwZXJDYXNlKCk9PWEmJihlPWgpOyhjfHxkKSYmbnVsbD09PWUmJihjPWN8fCIiLGQ9ZHx8IiIsYS5zdWJzdHIoMCxjLmxlbmd0aCk9PWMudG9VcHBlckNhc2UoKSYmKGI9Yi5zdWJzdHIoYy5sZW5ndGgpLGU9c3VnZ2VzdEtleU5hbWUoZixiKSksbnVsbD09PWUmJmEuc3Vic3RyKGEubGVuZ3RoLWQubGVuZ3RoKT09ZC50b1VwcGVyQ2FzZSgpJiYoYj1iLnN1YnN0cigwLGIubGVuZ3RoLWQubGVuZ3RoKSxlPXN1Z2dlc3RLZXlOYW1lKGYsYikpKX1yZXR1cm4gZX07CiJ1bmRlZmluZWQiPT10eXBlb2YgRGF0ZS5wcm90b3R5cGUuZ2V0Rmlyc3REYXlPZldlZWsmJihEYXRlLnByb3RvdHlwZS5nZXRGaXJzdERheU9mV2Vlaz1mdW5jdGlvbihhKXthPWF8fDA7dmFyIGI9bmV3IERhdGUodGhpcy5nZXRUaW1lKCkpO2ZvcihiLnNldEhvdXJzKDAsMCwwLDApO2IuZ2V0RGF5KCkhPWE7KWIuc2V0RGF0ZShiLmdldERhdGUoKS0xKSxiLnNldEhvdXJzKDAsMCwwLDApO3JldHVybiBifSk7InVuZGVmaW5lZCI9PXR5cGVvZiBEYXRlLnByb3RvdHlwZS5tb250aEZpcnN0RE9XJiYoRGF0ZS5wcm90b3R5cGUubW9udGhGaXJzdERPVz1mdW5jdGlvbihhKXthPW5ldyBEYXRlKChhfHx0aGlzKS5nZXRUaW1lKCkpO2Euc2V0RGF0ZSgxKTtyZXR1cm4gYS5nZXREYXkoKX0pOwoidW5kZWZpbmVkIj09dHlwZW9mIERhdGUucHJvdG90eXBlLm1vbnRoTGFzdERheSYmKERhdGUucHJvdG90eXBlLm1vbnRoTGFzdERheT1mdW5jdGlvbihhKXthPW5ldyBEYXRlKChhfHx0aGlzKS5nZXRUaW1lKCkpO3JldHVybihuZXcgRGF0ZShhLmdldFllYXIoKSxhLmdldE1vbnRoKCkrMSwwKSkuZ2V0RGF0ZSgpfSk7InVuZGVmaW5lZCI9PXR5cGVvZiBEYXRlLnByb3RvdHlwZS5tb250aExhc3RET1cmJihEYXRlLnByb3RvdHlwZS5tb250aExhc3RET1c9ZnVuY3Rpb24oYSl7YT1uZXcgRGF0ZSgoYXx8dGhpcykuZ2V0VGltZSgpKTthLnNldERhdGUodGhpcy5tb250aExhc3REYXkoYSkpO3JldHVybiBhLmdldERheSgpfSk7CiJ1bmRlZmluZWQiPT10eXBlb2YgRGF0ZS5wcm90b3R5cGUubmV4dE1vbnRoJiYoRGF0ZS5wcm90b3R5cGUubmV4dE1vbnRoPWZ1bmN0aW9uKGEpe2E9bmV3IERhdGUoKGF8fHRoaXMpLmdldFRpbWUoKSk7dmFyIGI9YS5nZXRNb250aCgpO2Euc2V0TW9udGgoYisxKTthLmdldE1vbnRoKCkhPWIrMSYmMCE9PWEuZ2V0TW9udGgoKSYmYS5zZXREYXRlKDApO3JldHVybiBhfSk7InVuZGVmaW5lZCI9PXR5cGVvZiBEYXRlLnByb3RvdHlwZS5wcmV2TW9udGgmJihEYXRlLnByb3RvdHlwZS5wcmV2TW9udGg9ZnVuY3Rpb24oYSl7YT1uZXcgRGF0ZSgoYXx8dGhpcykuZ2V0VGltZSgpKTt2YXIgYj1hLmdldE1vbnRoKCk7YS5zZXRNb250aChiLTEpO2EuZ2V0TW9udGgoKSE9Yi0xJiYoMTEhPWEuZ2V0TW9udGgoKXx8MTE9PWImJjE9PWEuZ2V0RGF0ZSgpKSYmYS5zZXREYXRlKDApO3JldHVybiBhfSk7CiJ1bmRlZmluZWQiPT10eXBlb2YgRGF0ZS5wcm90b3R5cGUuaW5jTW9udGgmJihEYXRlLnByb3RvdHlwZS5pbmNNb250aD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldE1vbnRoKCk7dGhpcy5zZXRNb250aChiK2EpO3RoaXMuZ2V0TW9udGgoKSE9YithJiYoMTEhPXRoaXMuZ2V0TW9udGgoKXx8MTE9PWImJjE9PXRoaXMuZ2V0RGF0ZSgpKSYmdGhpcy5zZXREYXRlKDApfSk7InVuZGVmaW5lZCI9PXR5cGVvZiBEYXRlLnByb3RvdHlwZS5pbmNEYXkmJihEYXRlLnByb3RvdHlwZS5pbmNEYXk9ZnVuY3Rpb24oKXt0aGlzLnNldERhdGUodGhpcy5nZXREYXRlKCkrMSl9KTsidW5kZWZpbmVkIj09dHlwZW9mIERhdGUucHJvdG90eXBlLmRlY0RheSYmKERhdGUucHJvdG90eXBlLmRlY0RheT1mdW5jdGlvbigpe3RoaXMuc2V0RGF0ZSh0aGlzLmdldERhdGUoKS0xKX0pOwoidW5kZWZpbmVkIj09dHlwZW9mIERhdGUucHJvdG90eXBlLmluY1dlZWsmJihEYXRlLnByb3RvdHlwZS5pbmNXZWVrPWZ1bmN0aW9uKCl7dGhpcy5zZXREYXRlKHRoaXMuZ2V0RGF0ZSgpKzcpfSk7InVuZGVmaW5lZCI9PXR5cGVvZiBEYXRlLnByb3RvdHlwZS5kZWNXZWVrJiYoRGF0ZS5wcm90b3R5cGUuZGVjV2Vlaz1mdW5jdGlvbigpe3RoaXMuc2V0RGF0ZSh0aGlzLmdldERhdGUoKS03KX0pOyJ1bmRlZmluZWQiPT10eXBlb2YgRGF0ZS5wcm90b3R5cGUuZGF5c0luTW9udGgmJihEYXRlLnByb3RvdHlwZS5kYXlzSW5Nb250aD1mdW5jdGlvbihhLGIpe2J8fChiPXRoaXMuZ2V0RnVsbFllYXIoKSk7YXx8KGE9dGhpcy5nZXRNb250aCgpKzEpO3JldHVybiAzMi0obmV3IERhdGUocGFyc2VJbnQoYikscGFyc2VJbnQoYSktMSwzMikpLmdldERhdGUoKX0pOwoidW5kZWZpbmVkIj09dHlwZW9mIERhdGUucHJvdG90eXBlLnRvRnJlbmNoU3RyaW5nJiYoRGF0ZS5wcm90b3R5cGUudG9GcmVuY2hTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iIit0aGlzLmdldERhdGUoKSsiLyIrKHRoaXMuZ2V0TW9udGgoKSsxKSsiLyIrdGhpcy5nZXRGdWxsWWVhcigpfSk7InVuZGVmaW5lZCI9PXR5cGVvZiBEYXRlLnByb3RvdHlwZS50b1VEYXRlJiYoRGF0ZS5wcm90b3R5cGUudG9VRGF0ZT1mdW5jdGlvbigpe3JldHVybiIiK3BhZCh0aGlzLmdldEZ1bGxZZWFyKCksNCkrcGFkKHRoaXMuZ2V0TW9udGgoKSsxLDIpK3BhZCh0aGlzLmdldERhdGUoKSwyKStwYWQodGhpcy5nZXRIb3VycygpLDIpK3BhZCh0aGlzLmdldE1pbnV0ZXMoKSwyKStwYWQodGhpcy5nZXRTZWNvbmRzKCksMil9KTsKInVuZGVmaW5lZCI9PXR5cGVvZiBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyYmKERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VVRDRnVsbFllYXIoKSsiLSIrcGFkKHRoaXMuZ2V0VVRDTW9udGgoKSsxLDIpKyItIitwYWQodGhpcy5nZXRVVENEYXRlKCksMikrIlQiK3BhZCh0aGlzLmdldFVUQ0hvdXJzKCksMikrIjoiK3BhZCh0aGlzLmdldFVUQ01pbnV0ZXMoKSwyKSsiOiIrcGFkKHRoaXMuZ2V0VVRDU2Vjb25kcygpLDIpKyIuIitTdHJpbmcoKHRoaXMuZ2V0VVRDTWlsbGlzZWNvbmRzKCkvMUUzKS50b0ZpeGVkKDMpKS5zbGljZSgyLDUpKyJaIn0pOyJ1bmRlZmluZWQiPT10eXBlb2YgRGF0ZS5wcm90b3R5cGUuZnJlbmNoRm9ybWF0JiYoRGF0ZS5wcm90b3R5cGUuZnJlbmNoRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RGF0ZSgpKyIvIisodGhpcy5nZXRNb250aCgpKzEpKyIvIit0aGlzLmdldEZ1bGxZZWFyKCl9KTsKdmFyIGV4dHJhY3REYXRlVmFsdWVzPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj0oYS5tYXRjaCgvXC8vZyl8fFtdKS5sZW5ndGg7YT0oYS5tYXRjaCgvXC0vZyl8fFtdKS5sZW5ndGg7cmV0dXJuIGI+YT8iLyI6MDxhPyItIjoiIn0sZT1kKGIpLGY9ZChhKSxnPW51bGw7aWYoIiI8ZSl7Zm9yKHZhciBnPVtdLGg9Yi5zcGxpdChlKSxkPTA7ZDxoLmxlbmd0aDtkKyspZ1toW2RdLnN1YnN0cigwLDEpXT1kO2ZvcihkPWEuc3BsaXQoZSk7ZC5sZW5ndGg8aC5sZW5ndGg7KWE9YStlKyIwMSIsZFtkLmxlbmd0aF09MH1kPWZ1bmN0aW9uKGMpe3ZhciBkPWIuaW5kZXhPZihjKSxmPTA7aWYoMDw9ZCl7Zm9yKHZhciBrO2QrZjxiLmxlbmd0aCYmYi5zdWJzdHIoZCtmLDEpPT1jOylmKys7az0wPChjLm1hdGNoKC9beSxtLGRdL2cpfHxbXSkubGVuZ3RoJiZudWxsIT09Zz9hLnNwbGl0KGUpW2dbY11dLnNwbGl0KCIgIilbMF06c3RyMmludChhLnN1YnN0cihkLGYpKTtyZXR1cm5bZCwKayxjLGZdfXJldHVybltudWxsLG51bGwsY119O2g9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXVsxXTtudWxsIT09ZCYmKGQ9ZC50b1N0cmluZygpLDE9PWQubGVuZ3RoP2Q9cGFkKGQsMik6Mz09ZC5sZW5ndGgmJihkPXBhZChkLDQpKSk7YlthW2NdWzJdXT1kfXJldHVybiBifTt2b2lkIDA9PT1iJiYoYj0ieXl5eS1tbS1kZFRoaDptbTpzcyIpO2lmKCIiPT09YSlyZXR1cm4gYz1bXSxjLnk9IiIsYy5kPSIiLGMubT0iIixjLkg9IiIsYy5NPSIiLGMuUz0iIixjO3ZvaWQgMD09PWMmJihjPXt9KTtjLmVsZW1zPVtkKCJ5IiksZCgibSIpLGQoImQiKSxkKCJIIiksZCgiTSIpLGQoIlMiKV07aWYoZj09ZSYmMDxjLmVsZW1zWzFdWzFdJiYxMz5jLmVsZW1zWzFdWzFdJiYxPD1jLmVsZW1zWzJdWzFdJiYzMT49Yy5lbGVtc1syXVsxXSljPWgoYy5lbGVtcyk7ZWxzZXtjPWMuZWxlbXM7Yy5zb3J0KGZ1bmN0aW9uKGEsYil7aWYobnVsbD09CmJbMF0pcmV0dXJuLTE7aWYobnVsbD09YVswXSlyZXR1cm4gMTtpZihhWzBdPT09YlswXSlyZXR1cm4gMDtpZihhWzBdPGJbMF0pcmV0dXJuLTE7aWYoYVswXT5iWzBdKXJldHVybiAxfSk7Zm9yKHZhciBmPWEubWF0Y2goL1xiW1xkXStcYi9nKSxrPTEsZD0wO2Q8Yy5sZW5ndGgmJmQ8KGZ8fFtdKS5sZW5ndGg7ZCsrKWNbZF1bMV09ZltkXSxrKj1jW2RdWzFdO2M9MDxrP2goYyk6bnVsbH1yZXR1cm4gY30sYXJyYXkyZGF0ZT1mdW5jdGlvbihhKXtyZXR1cm4gcGFkKGEuZCwyKSsiLSIrcGFkKGEubSwyKSsiLSIrYS55fTsKZnVuY3Rpb24gdGltZTJtaW51dGVzKGEpe2lmKHZvaWQgMD09PWF8fCJOYU4iPT1hKWE9MDt2YXIgYj0wLGM9MDsiIjxhJiYoYT0iIithKyIgIixjPWEuaW5kZXhPZigiaCIpLDA+YyYmKGM9YS5pbmRleE9mKCI6IikpLDA8PWM/KGI9YS5zdWJzdHJpbmcoMCxjKSxjPXBhcnNlSW50KGEuc3Vic3RyaW5nKGMrMSkpLGlzTmFOKGMpJiYoYz0wKSk6KGI9MCxjPXBhcnNlSW50KGEpKSxhPTYwKmIrYyk7MD5hJiYoYT0wKTtyZXR1cm4gYX1mdW5jdGlvbiBtaW51dGVzMnRpbWUoYSl7dmFyIGI9cGFkKE1hdGguZmxvb3IoYS82MCksMik7YT1wYWQoYSU2MCwyKTtyZXR1cm4gYisiOiIrYX1mdW5jdGlvbiB0aW1lc3RhbXAyZGF5T2ZXZWVrKGEpe3ZhciBiPW5ldyBEYXRlO2Iuc2V0VGltZSgxRTMqYSk7cmV0dXJuIGIuZ2V0RGF5KCl9CkRhdGUucHJvdG90eXBlLmdldFdlZWtOdW1iZXI9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZShEYXRlLlVUQyh0aGlzLmdldEZ1bGxZZWFyKCksdGhpcy5nZXRNb250aCgpLHRoaXMuZ2V0RGF0ZSgpKSksYj1hLmdldFVUQ0RheSgpfHw3O2Euc2V0VVRDRGF0ZShhLmdldFVUQ0RhdGUoKSs0LWIpO2I9bmV3IERhdGUoRGF0ZS5VVEMoYS5nZXRVVENGdWxsWWVhcigpLDAsMSkpO3JldHVybiBNYXRoLmNlaWwoKChhLWIpLzg2NEU1KzEpLzcpfTtEYXRlLnByb3RvdHlwZS5zdGRUaW1lem9uZU9mZnNldD1mdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlKHRoaXMuZ2V0RnVsbFllYXIoKSwwLDEpLGI9bmV3IERhdGUodGhpcy5nZXRGdWxsWWVhcigpLDYsMSk7cmV0dXJuIE1hdGgubWF4KGEuZ2V0VGltZXpvbmVPZmZzZXQoKSxiLmdldFRpbWV6b25lT2Zmc2V0KCkpfTtEYXRlLnByb3RvdHlwZS5kc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRUaW1lem9uZU9mZnNldCgpPHRoaXMuc3RkVGltZXpvbmVPZmZzZXQoKX07CmZ1bmN0aW9uIFRpbWV6b25lRGV0ZWN0KCl7dmFyIGE9bmV3IERhdGUoIjEvMS8iKyhuZXcgRGF0ZSkuZ2V0VVRDRnVsbFllYXIoKSksYj0xRTQsYztmb3IoYz0wOzEyPmM7YysrKWEuc2V0VVRDTW9udGgoYS5nZXRVVENNb250aCgpKzEpLGI+LTEqYS5nZXRUaW1lem9uZU9mZnNldCgpJiYoYj0tMSphLmdldFRpbWV6b25lT2Zmc2V0KCkpO3JldHVybiBifWZ1bmN0aW9uIHRpbWVzdGFtcDJkYXRlKGEpe2lmKCFpc05hTihhKSYmIiI8YSl7dmFyIGI9bmV3IERhdGU7Yi5zZXRUaW1lKDFFMyphKzZFNCooLVRpbWV6b25lRGV0ZWN0KCktYi5nZXRUaW1lem9uZU9mZnNldCgpKSk7cmV0dXJuIHBhZChiLmdldERhdGUoKSwyKSsiLyIrcGFkKGIuZ2V0TW9udGgoKSsxLDIpKyIvIitwYWQoYi5nZXRGdWxsWWVhcigpLDQpfXJldHVybiIifQpmdW5jdGlvbiB0aW1lc3RhbXAydGltZShhLGIpe3ZhciBjO2lmKHZvaWQgMD09PWEpYz0iIjtlbHNlIGlmKCIiPT09YXx8aXNOYU4oYSkpYz0iIjtlbHNle3ZvaWQgMD09PWImJihiPSExKTt2YXIgZD1uZXcgRGF0ZTtkLnNldFRpbWUoMUUzKmEpO2M9cGFkKGQuZ2V0SG91cnMoKSwyKSsiOiIrcGFkKGQuZ2V0TWludXRlcygpLDIpO2ImJihjPWMrIjoiK3BhZChkLmdldFNlY29uZHMoKSwyKSl9cmV0dXJuIGN9CmZ1bmN0aW9uIEZEYXRlMlVEYXRlKGEpe2E9YXx8KG5ldyBEYXRlKCIxLzEvMTkwMCIpKS50b0ZyZW5jaFN0cmluZygpO2E9MDxhLmluZGV4T2YoIi8iKT9hLnNwbGl0KCIvIik6YS5zcGxpdCgiLSIpO3ZhciBiPWFbMl18fCIiLGI9Yi5zcGxpdCgiICIpO2FbMl09YlswXTtiPWJbMV07dm9pZCAwPT09YiYmKGI9IjAwOjAwOjAwIik7Yj1iLnNwbGl0KCI6Iik7dm9pZCAwPT09YlsxXSYmKGJbMV09MCk7dm9pZCAwPT09YlsyXSYmKGJbMl09MCk7cmV0dXJuIHBhZChhWzJdLDQpKyItIitwYWQoYVsxXSwyKSsiLSIrcGFkKGFbMF0sMikrIiAiK3BhZChiWzBdLDIpKyI6IitwYWQoYlsxXSwyKSsiOiIrcGFkKGJbMl0sMil9ZnVuY3Rpb24gVURhdGUySlNEYXRlKGEpe2E9ZXh0cmFjdERhdGVWYWx1ZXMoYSwieXl5eW1tZGRISE1NU1MiKTtyZXR1cm4gbmV3IERhdGUoYS55LGEubS0xLGEuZCxhLkgsYS5NLGEuUyl9CmZ1bmN0aW9uIFVEYXRlMkRhdGUoYSxiKXsidW5kZWZpbmVkIj09PXR5cGVvZiBiJiYoYj0iZC9tL3kiKTt2YXIgYz0iIixkPWV4dHJhY3REYXRlVmFsdWVzKGEsInl5eXltbWRkSEhNTVNTIik7aWYobnVsbCE9PWQpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspYz0vXltkLG0seV0rJC8udGVzdChiW2VdKT9jK2RbYltlXV06YytiW2VdOyIvLyI9PWMmJihjPSIiKTtyZXR1cm4gY31mdW5jdGlvbiBVRGF0ZTJUaW1lKGEsYil7InVuZGVmaW5lZCI9PT10eXBlb2YgYiYmKGI9Ikg6TTpTIik7dmFyIGM9IiIsZD1leHRyYWN0RGF0ZVZhbHVlcyhhLCJ5eXl5bW1kZEhITU1TUyIpO2lmKGQpZm9yKHZhciBjPSIiLGU9MDtlPGIubGVuZ3RoO2UrKyljPS9eW0gsTSxTXSskLy50ZXN0KGJbZV0pP2MrZFtiW2VdXTpjK2JbZV07Ijo6Ij09YyYmKGM9IiIpO3JldHVybiBjfQpmdW5jdGlvbiBJQkRhdGUyRGF0ZShhKXt2YXIgYj0iIjsoYT1leHRyYWN0RGF0ZVZhbHVlcyhhLCJtbWRkeXl5eUhITU1TUyIpKSYmKGI9YS5kKyItIithLm0rIi0iK2EueSk7cmV0dXJuIGJ9ZnVuY3Rpb24gZGF0ZTJJQkRhdGUoYSl7dmFyIGI9IiI7KGE9ZXh0cmFjdERhdGVWYWx1ZXMoYSwiZGRtbXl5eXlISE1NU1MiKSkmJihiPXBhZChhLm0sMikrIi0iK3BhZChhLmQsMikrIi0iK2EueSk7cmV0dXJuIGJ9ZnVuY3Rpb24gZGF0ZTJVRGF0ZShhKXt2YXIgYj0iIjsoYT1leHRyYWN0RGF0ZVZhbHVlcyhhLCJkZG1teXl5eUhITU1TUyIpKSYmKGI9cGFkKGEueSw0KSsiLSIrcGFkKGEubSwyKSsiLSIrcGFkKGEuZCwyKSk7cmV0dXJuIGJ9ZnVuY3Rpb24gSUJEYXRlMnRpbWVzdGFtcChhKXthPUlCRGF0ZTJEYXRlKGEpO3JldHVybiBhPWRhdGUydGltZXN0YW1wKGEpfQpmdW5jdGlvbiB0aW1lc3RhbXAySUJEYXRlKGEpe2E9dGltZXN0YW1wMmRhdGUoYSk7cmV0dXJuIGE9ZGF0ZTJJQkRhdGUoYSl9CnZhciBkYXRlVHJhbnNmb3JtPWZ1bmN0aW9uKGEsYixjKXtpZihhKXt2YXIgZD1jO2lmKGE9ZXh0cmFjdERhdGVWYWx1ZXMoYSxiKSlmb3IoYj17fSxleHRyYWN0RGF0ZVZhbHVlcygiMTExMTExMTExMTExIixjLGIpLGM9MDtjPGIuZWxlbXMubGVuZ3RoO2MrKyl7dmFyIGU9Yi5lbGVtc1tjXTtpZihudWxsIT09ZVswXSl7Zm9yKHZhciBmPXBhZChhW2VbMl1dLGVbM10pO2QubGVuZ3RoPGVbMF0rZVszXTspZCs9IiAiO2Q9ZC5zdWJzdHIoMCxlWzBdKStmK2Quc3Vic3RyKGVbMF0rZVszXSxkLmxlbmd0aCl9fXJldHVybiBkfXJldHVybiBudWxsfSxpc1ZhbGlkRGF0ZT1mdW5jdGlvbihhKXt2YXIgYj0hMCxjOyJzdHJpbmciPT10eXBlb2YgYSYmKGE9ZGF0ZVRyYW5zZm9ybShhLCJkZC9tbS95eXl5IiwieXl5eS1tbS1kZFQxMjo1OTo1OSIpKTt0cnl7Yz1uZXcgRGF0ZShhKX1jYXRjaChkKXtiPSExfWImJihiPWlzTmFOKGMuZ2V0VGltZSgpKT8hMTpkYXRlVHJhbnNmb3JtKGMuZ2V0RnVsbFllYXIoKSsKIi8iKyhjLmdldE1vbnRoKCkrMSkrIi8iK2MuZ2V0RGF0ZSgpLCJ5eXl5L21tL2RkIiwieXl5eS1tbS1kZFQxMjo1OTo1OSIpPT1hKTtyZXR1cm4gYn0saXNWYWxpZFRpbWU9ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YT0oYXx8IiIpLm1hdGNoKC9eXGR7MSwyfTpcZHsxLDJ9KDpcZHsxLDJ9KXswLDF9JC8pfHxbXTtpZigwPGEubGVuZ3RoKXtmb3IoYT1hWzBdLnNwbGl0KCI6Iik7Mz5hLmxlbmd0aDspYVthLmxlbmd0aF09IjAwIjtiPTA8PWFbMF0mJjIzPj1hWzBdJiYwPD1hWzFdJiY1OT49YVsxXSYmMDw9YVsyXSYmNTk+PWFbMl19cmV0dXJuIGJ9LGRhdGVJblJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0hMTtpc1ZhbGlkRGF0ZShhKSYmKGI9Ynx8KG5ldyBEYXRlKS50b0ZyZW5jaFN0cmluZygpLGM9Y3x8KG5ldyBEYXRlKS50b0ZyZW5jaFN0cmluZygpLGlzVmFsaWREYXRlKGIpJiZpc1ZhbGlkRGF0ZShjKSYmKGE9ZGF0ZVRyYW5zZm9ybShhLCJkZC9tbS95eXl5IiwieXl5eS1tbS1kZCIpLApiPWRhdGVUcmFuc2Zvcm0oYiwiZGQvbW0veXl5eSIsInl5eXktbW0tZGQiKSxjPWRhdGVUcmFuc2Zvcm0oYywiZGQvbW0veXl5eSIsInl5eXktbW0tZGQiKSxkPWE+PWImJmE8PWMpKTtyZXR1cm4gZH07ZnVuY3Rpb24gaXNJbmZpbml0eShhKXtyZXR1cm4gdm9pZCAwIT09YT9hLlBPU0lUSVZFX0lORklOSVRZfHxhLk5FR0FUSVZFX0lORklOSVRZfHwiSW5maW5pdHkiPT1hOiEwfWZ1bmN0aW9uIGlzTnVtYmVyKGEpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpe3ZhciBiPWEudG9GbG9hdCgpO2lzTmFOKGIpfHwoYT1iKX1yZXR1cm4haXNOYU4ocGFyc2VGbG9hdChhKSkmJmlzRmluaXRlKGEpfWZ1bmN0aW9uIGlzT3BlcmF0b3IoYSl7dmFyIGI9ITE7InN0cmluZyI9PXR5cGVvZiBhJiYoYj0iPCI9PWF8fCI+Ij09YXx8IiEiPT1hfHwiIT09Ij09YXx8IiE9Ij09YXx8Ij4iPT1hfHwiPD0iPT1hfHwiPj0iPT1hfHwiPT0iPT1hKTtyZXR1cm4gYn0KdmFyIGlzQXJyYXk9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJiJvYmplY3QiPT09dHlwZW9mIGEmJiJudW1iZXIiPT09dHlwZW9mIGEubGVuZ3RoJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuc3BsaWNlJiYhYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgibGVuZ3RoIil9O2Z1bmN0aW9uIGlzRW1haWwoYSl7YT1hJiZhLnVucXVvdGUoKXx8IiI7cmV0dXJuL14oKFteXCo8PigpW1xdXFwuLDs6XHNAXCJdKyhcLlteXCo8PigpW1xdXFwuLDs6XHNAXCJdKykqKXwoXCIuK1wiKSlAKChcW1swLTldezEsM31cLlswLTldezEsM31cLlswLTldezEsM31cLlswLTldezEsM31cXSl8KChbYS16QS1aXC0wLTldK1wuKStbYS16QS1aXXsyLH0pKSQvLnRlc3QoYSl9ZnVuY3Rpb24gcGFkKGEsYil7Zm9yKHZhciBjPSIiK2E7Yy5sZW5ndGg8YjspYz0iMCIrYztyZXR1cm4gY30KZnVuY3Rpb24gdW5tYXNrSFRNTChhKXtpZigic3RyaW5nIj09dHlwZW9mIGEpe2lmKDA8YS5sZW5ndGgpe3ZhciBiPWEuc3Vic3RyKDAsMSk7aWYoJyInPT1ifHwiJyI9PWIpe3ZhciBjPWEuc3Vic3RyKGEubGVuZ3RoLTEpO2I9PWMmJihhPWEuc3Vic3RyKDEsYS5sZW5ndGgtMikpfX1mb3IoOzA8PWEuaW5kZXhPZigiISEiKTspYT1hLnJlcGxhY2UoIiEhIiwiJiIpO2E9YS5yZXBsYWNlKC9cWy9nLCI8Iik7YT1hLnJlcGxhY2UoL1xdL2csIj4iKTthPWEucmVwbGFjZSgvXCZcIzkxXDsvZywiWyIpO2E9YS5yZXBsYWNlKC9cJlwjOTNcOy9nLCJdIil9ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIGEpYT1hLnRvU3RyaW5nKCk7ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIGEpZm9yKGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYVtiXT11bm1hc2tIVE1MKGFbYl0pKTtlbHNlIGE9IiI7cmV0dXJuIGF9CmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChhKXtyZXR1cm4gYS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8XFtcXVwvXFxdKS9nLCJcXCQxIil9ZnVuY3Rpb24gbWFza0hUTUwoYSl7YT1hfHwiIjtpZigic3RyaW5nIj09dHlwZW9mIGEpe2Zvcig7MDw9YS5pbmRleE9mKCI8Iik7KWE9YS5yZXBsYWNlKC9cPC8sIlsiKTtmb3IoOzA8PWEuaW5kZXhPZigiPiIpOylhPWEucmVwbGFjZSgvXD4vLCJdIik7Zm9yKDswPD1hLmluZGV4T2YoIiYiKTspYT1hLnJlcGxhY2UoIiYiLCIhISIpfXJldHVybiBhfWZ1bmN0aW9uIHRyaW0oYSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBhP2EucmVwbGFjZSgvXlxzK3xccyskL2csIiIpOiIifVN0cmluZy5wcm90b3R5cGUudHJpbXx8KFN0cmluZy5wcm90b3R5cGUudHJpbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0pOwpmdW5jdGlvbiB1bnBhcmVudGVzaXMoYSl7MTxhLmxlbmd0aCYmKCIoIj09YS5zdWJzdHJpbmcoMCwxKXx8IlsiPT1hLnN1YnN0cmluZygwLDEpfHwieyI9PWEuc3Vic3RyaW5nKDAsMSkpJiYoYT1hLnN1YnN0cmluZygxLGEubGVuZ3RoLTEpKTtyZXR1cm4gYX1mdW5jdGlvbiB3b3Jkd3JhcChhLGIsYyxkKXtjPWN8fCJcbiI7Yj1ifHw3NTtyZXR1cm4gYT9hLm1hdGNoKFJlZ0V4cCgiLnsxLCIrYisifShcXHN8JCkiKyhkPyJ8LnsiK2IrIn18LiskIjoifFxcUys/KFxcc3wkKSIpLCJnIikpLmpvaW4oYyk6YX1mdW5jdGlvbiBubDJicihhKXt2YXIgYj0iIjt2b2lkIDAhPT1hJiYoYj1hLnJlcGxhY2UoLyhbXj5cclxuXT8pKFxyXG58XG5ccnxccnxcbikvZywiJDE8YnI+JDIiKSk7cmV0dXJuIGJ9CmZ1bmN0aW9uIGRlYzJkZWcoYSxiKXtiPSJ1bmRlZmluZWQiPT10eXBlb2YgYj8hMDpiO2lmKDAhPXNpZ24oYSkpe3ZhciBjPTA8c2lnbihhKSxkLGUsZjthPU1hdGguYWJzKGEpO2Q9cGFyc2VJbnQoYSk7Zj02MCooYS0xKmQpO2U9Zi0xKnBhcnNlSW50KGYpO2Y9cGFyc2VJbnQoZik7ZT1wYXJzZUludCg2MCplKTtyZXR1cm4gZCsiJmRlZzsgIitmKyInICIrZSsiJycgIisoYj9jPyJOIjoiUyI6Yz8iRSI6IlciKX1yZXR1cm4iTlVMTCJ9ZnVuY3Rpb24gZGVnMmRlYyhhKXt2YXIgYj1hLnJlcGxhY2UoL1teU05FV10rL2csIiIpO2E9YS5yZXBsYWNlKC9bXFdfXSsvZywiICIpLnNwbGl0KCIgIik7Zm9yKHZhciBjPTA7Mj5jO2MrKylhW2NdPXN0cjJpbnQoYVtjXXx8MCk7YT1hWzBdK2FbMV0vNjArYVsyXS8zNjAwO2lmKCJTIj09Ynx8IlciPT1iKWEqPS0xO3JldHVybiBhfQpmdW5jdGlvbiBzdHIyZG91YmxlKGEpeyJ1bmRlZmluZWQiPT09dHlwZW9mIGEmJihhPSIwIik7YT0iIithO3ZhciBiPSIiLGI9MDxhLmluZGV4T2YoIiwiKSYmMDxhLmluZGV4T2YoIi4iKT9hLnJlcGxhY2UoIi4iLCIiKTphLGI9Yi5yZXBsYWNlKCIsIiwiLiIpOyIiPT09YiYmKGI9IjAuMDAiKTtiPXBhcnNlRmxvYXQoYik7aXNOYU4oYikmJihiPTApO2E9cGFyc2VGbG9hdChiKTtyZXR1cm4gYT1wYXJzZUZsb2F0KGEpfWZ1bmN0aW9uIHN0cjJpbnQoYSl7YT1wYXJzZUludChhKTtyZXR1cm4gbnVsbD09PWF8fGlzTmFOKGEpPzA6YX1mdW5jdGlvbiBzdHIyYm9vbChhLGIpe3ZvaWQgMD09PWImJihiPSExKTtyZXR1cm4gYT12b2lkIDA9PT1hP2I6IlRSVUUiPT1hLnRvVXBwZXJDYXNlKCl9ZnVuY3Rpb24gYm9vbDJzdHIoYSl7cmV0dXJuIGE/IlRSVUUiOiJGQUxTRSJ9ZnVuY3Rpb24gc2lnbihhKXthPXN0cjJpbnQoYSk7cmV0dXJuIDA9PWE/MDowPmE/LTE6MX0KZnVuY3Rpb24gZGVjMmhleChhKXtyZXR1cm4gYS50b1N0cmluZygxNil9ZnVuY3Rpb24gaGV4MmRlYyhhKXtyZXR1cm4gcGFyc2VJbnQoYSwxNil9dmFyIHJvd0NvbG9yU3BlY0Jhc2U9ZnVuY3Rpb24oKXtyZXR1cm57Y2ZnQ29sb3JzOlsiI0YyRjBGMCIsIiNDRkNGQ0YiXSxzdWdnZXN0Um93Q29sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY2ZnQ29sb3JzW2ElMl19LHNldFJvd0NvbG9yczpmdW5jdGlvbihhLGIpe3RoaXMuY2ZnQ29sb3JzWzBdPWF8fHRoaXMuY2ZnQ29sb3JzWzBdO3RoaXMuY2ZnQ29sb3JzWzFdPWJ8fHRoaXMuY2ZnQ29sb3JzWzFdfX19LHJvd0NvbG9yU3BlYz1yb3dDb2xvclNwZWNCYXNlKCk7CmZ1bmN0aW9uIGRlY29tcG9zZUNvbG9yKGEpe2lmKCJyZ2IoIj09YS5zdWJzdHIoMCw0KSl7dmFyIGI9YS5yZXBsYWNlKC9bXlxkLF0vZywiIikuc3BsaXQoIiwiKSxjPVtdO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspY1thXT1zdHIyaW50KGJbYV0pO3JldHVybiBjfSIjIj09YS5zdWJzdHIoMCwxKSYmKGE9YS5zdWJzdHIoMSkpO2I9aGV4MmRlYyhhLnN1YnN0cigwLDIpKTtjPWhleDJkZWMoYS5zdWJzdHIoMiwyKSk7YT1oZXgyZGVjKGEuc3Vic3RyKDQsMikpO3JldHVybltiLGMsYV19ZnVuY3Rpb24gY29tcGxlbWVudGFyeUNvbG9yKGEpe2E9ZGVjb21wb3NlQ29sb3IoYSk7Zm9yKHZhciBiPTA7Mz5iO2IrKylhW2JdPU1hdGguZmxvb3IoYVtiXS8zKSxhW2JdPTMyKk1hdGguZmxvb3IoYVtiXS8zMiksYVtiXT0yNTAtTWF0aC5taW4oMjUwLGFbYl0pO3JldHVybiIjIisoZGVjMmhleChhWzBdKStkZWMyaGV4KGFbMV0pK2RlYzJoZXgoYVsyXSkpfQpmdW5jdGlvbiBncmF5Q29sb3IoYSl7YT1kZWNvbXBvc2VDb2xvcihhKTthPSgzMipNYXRoLmZsb29yKGFbMF0vMzIpKzMyKk1hdGguZmxvb3IoYVsxXS8zMikrMzIqTWF0aC5mbG9vcihhWzJdLzMyKSkvMzthPWRlYzJoZXgoYSk7cmV0dXJuIGErYSthfWZ1bmN0aW9uIHJnYjJoZXgoYSl7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYS5iP3BhZChkZWMyaGV4KGFbMF0pLDIpK3BhZChkZWMyaGV4KGFbMV0pLDIpK3BhZChkZWMyaGV4KGFbMl0pLDIpOnBhZChkZWMyaGV4KGEuciksMikrcGFkKGRlYzJoZXgoYS5nKSwyKStwYWQoZGVjMmhleChhLmIpLDIpfQpmdW5jdGlvbiBwaWNrQ29sb3JGcm9tR3JhZGllbnQoYSxiLGMpe2M9TWF0aC5tYXgoMCxNYXRoLm1pbihjLDEwMCkpLzEwMDt2YXIgZD0xLWM7YT1kZWNvbXBvc2VDb2xvcihhKTtiPWRlY29tcG9zZUNvbG9yKGIpO2I9W01hdGgucm91bmQoYVswXSpjK2JbMF0qZCksTWF0aC5yb3VuZChhWzFdKmMrYlsxXSpkKSxNYXRoLnJvdW5kKGFbMl0qYytiWzJdKmQpXTtyZXR1cm4gcmdiMmhleChiKX1mdW5jdGlvbiBicmlnaHRlckNvbG9yKGEsYil7Yj1ifHw1MDthPWRlY29tcG9zZUNvbG9yKGEpO3ZhciBjPXBhcnNlSW50KGFbMF0pLGQ9cGFyc2VJbnQoYVsxXSksZT1wYXJzZUludChhWzJdKTtyZXR1cm4iIyIrKDB8MjU2K2MrKDI1Ni1jKSpiLzEwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigxKSsoMHwyNTYrZCsoMjU2LWQpKmIvMTAwKS50b1N0cmluZygxNikuc3Vic3RyKDEpKygwfDI1NitlKygyNTYtZSkqYi8xMDApLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSl9CnZhciBoc21Db2xvckJhc2U9ZnVuY3Rpb24oKXtyZXR1cm57SHVlU2hpZnQ6ZnVuY3Rpb24oYSxiKXtmb3IoYSs9YjszNjA8PWE7KWEtPTM2MDtmb3IoOzA+YTspYSs9MzYwO3JldHVybiBhfSxSR0IySFNWOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM7InVuZGVmaW5lZCI9PXR5cGVvZiBhLnImJihhPXtyOmFbMF0sZzphWzFdLGI6YVsyXX0pO2M9YS5yO3ZhciBkPWEuZyxlPWEuYjtjPWM+ZD9jPmU/YzplOmQ+ZT9kOmU7dmFyIGQ9YS5yLGU9YS5nLGY9YS5iLGQ9Yy0oZDxlP2Q8Zj9kOmY6ZTxmP2U6Zik7Yi5zYXR1cmF0aW9uPTA9PT1jPzA6MTAwKmQvYzswPT09Yi5zYXR1cmF0aW9uP2IuaHVlPTA6YS5yPT1jP2IuaHVlPTYwKihhLmctYS5iKS9kOmEuZz09Yz9iLmh1ZT0xMjArNjAqKGEuYi1hLnIpL2Q6YS5iPT1jJiYoYi5odWU9MjQwKzYwKihhLnItYS5nKS9kKTswPmIuaHVlJiYoYi5odWUrPTM2MCk7Yi52YWx1ZT1NYXRoLnJvdW5kKDEwMCpjLzI1NSk7Yi5odWU9TWF0aC5yb3VuZChiLmh1ZSk7CmIuc2F0dXJhdGlvbj1NYXRoLnJvdW5kKGIuc2F0dXJhdGlvbik7cmV0dXJuIGJ9LEhTVjJSR0I6ZnVuY3Rpb24oYSxiKXtiPWJ8fCEwO3ZhciBjPXt9LGQ9e307aWYoMD09YS5zYXR1cmF0aW9uKWMucj1jLmc9Yy5iPU1hdGgucm91bmQoMi41NSphLnZhbHVlKTtlbHNle2EuaHVlLz02MDthLnNhdHVyYXRpb24vPTEwMDthLnZhbHVlLz0xMDA7dmFyIGU9TWF0aC5mbG9vcihhLmh1ZSksZj1hLmh1ZS1lLGc9YS52YWx1ZSooMS1hLnNhdHVyYXRpb24pLGg9YS52YWx1ZSooMS1hLnNhdHVyYXRpb24qZiksZj1hLnZhbHVlKigxLWEuc2F0dXJhdGlvbiooMS1mKSk7c3dpdGNoKGUpe2Nhc2UgMDpjLnI9YS52YWx1ZTtjLmc9ZjtjLmI9ZzticmVhaztjYXNlIDE6Yy5yPWg7Yy5nPWEudmFsdWU7Yy5iPWc7YnJlYWs7Y2FzZSAyOmMucj1nO2MuZz1hLnZhbHVlO2MuYj1mO2JyZWFrO2Nhc2UgMzpjLnI9ZztjLmc9aDtjLmI9YS52YWx1ZTticmVhaztjYXNlIDQ6Yy5yPWY7Yy5nPWc7Yy5iPWEudmFsdWU7CmJyZWFrO2RlZmF1bHQ6Yy5yPWEudmFsdWUsYy5nPWcsYy5iPWh9Yy5yPU1hdGgucm91bmQoMjU1KmMucik7Yy5nPU1hdGgucm91bmQoMjU1KmMuZyk7Yy5iPU1hdGgucm91bmQoMjU1KmMuYil9Yj8oZFswXT1jLnIsZFsxXT1jLmcsZFsyXT1jLmIpOmQ9YztyZXR1cm4gZH19fSxoc21Db2xvcj1oc21Db2xvckJhc2UoKSx4bWwyYXJyYXk9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPXt9O2Qubm90X3doaXRlc3BhY2U9bmV3IFJlZ0V4cCgvW15cc10vKTtkLnBhcmVudF9jb3VudD1udWxsO2QueG1sMmFycmF5PWZ1bmN0aW9uKGEsYixnKXt2YXIgaCxrLGwsdj0iIjtiPWJ8fHt9O2c9Z3x8MDthLm5vZGVOYW1lJiYiIyIhPWEubm9kZU5hbWUuY2hhckF0KDApJiYxPGEuY2hpbGROb2Rlcy5sZW5ndGgmJihoPXt9LHY9YS5ub2RlTmFtZSk7dmFyIHc9YS5ub2RlVmFsdWU7YS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUubm9kZU5hbWUmJncmJmQubm90X3doaXRlc3BhY2UudGVzdCh3KSYmKGg9e30sCmhbYS5wYXJlbnROb2RlLm5vZGVOYW1lXT13KTtpZihhLmNoaWxkTm9kZXMubGVuZ3RoKWlmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaD1kLnhtbDJhcnJheShhLmNoaWxkTm9kZXNbMF0sYixnKTtlbHNle2h8fChoPVtdKTtmb3IodmFyIHg9dz0wO3g8YS5jaGlsZE5vZGVzLmxlbmd0aDt4KyspaWYobD1kLnhtbDJhcnJheShhLmNoaWxkTm9kZXNbeF0sYixnKSl7az0hMTt2YXIgcz0wLHA9bnVsbDtmb3IoYyBpbiBsKWlmKGwuaGFzT3duUHJvcGVydHkoYykmJihwPWMsaXNOYU4oYykmJihrPSEwKSxzKyssMjxzKSlicmVhaztpZihrJiYxPT1zKWlmKGhbcF0pYiYmYltwXXx8KGJbcF09MCxrPWhbcF0saFtwXT17fSxoW3BdWzBdPWspLGJbcF0rKyxoW3BdW2JbcF1dPWxbcF07ZWxzZXtpZihiW3BdPTAsaFtwXT1sW3BdLGEuY2hpbGROb2Rlc1t4XS5hdHRyaWJ1dGVzJiZhLmNoaWxkTm9kZXNbeF0uYXR0cmlidXRlcy5sZW5ndGgpZm9yKGw9MDtsPGEuY2hpbGROb2Rlc1t4XS5hdHRyaWJ1dGVzLmxlbmd0aDtsKyspaWYocz0KYS5jaGlsZE5vZGVzW3hdLmF0dHJpYnV0ZXNbbF0ubm9kZU5hbWUpZz8oaz1oW3BdLGhbcF09e30saFtwXS52YWx1ZT1rLGhbcF1bImF0dHJpYnV0ZV8iK3NdPWEuY2hpbGROb2Rlc1t4XS5hdHRyaWJ1dGVzW2xdLm5vZGVWYWx1ZSk6aFtzXT1hLmNoaWxkTm9kZXNbeF0uYXR0cmlidXRlc1tsXS52YWx1ZX1lbHNlIGhbd109bCx3Kyt9fXYmJmgmJihsPWgsaD17fSxoW3ZdPWwpO3JldHVybiBofTtyZXR1cm4gZC54bWwyYXJyYXkoYSl9LHV0ZjhfZGVjb2RlPWZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9MCxkPTAsZT0wLGY9MCxnPTAsaD0wO2ZvcihhKz0iIjtjPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChjKSwxOTE+PWU/KGJbZCsrXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLGMrKyk6MjIzPj1lPyhmPWEuY2hhckNvZGVBdChjKzEpLGJbZCsrXT1TdHJpbmcuZnJvbUNoYXJDb2RlKChlJjMxKTw8NnxmJjYzKSxjKz0yKToyMzk+PWU/KGY9YS5jaGFyQ29kZUF0KGMrMSksZz1hLmNoYXJDb2RlQXQoYysKMiksYltkKytdPVN0cmluZy5mcm9tQ2hhckNvZGUoKGUmMTUpPDwxMnwoZiY2Myk8PDZ8ZyY2MyksYys9Myk6KGY9YS5jaGFyQ29kZUF0KGMrMSksZz1hLmNoYXJDb2RlQXQoYysyKSxoPWEuY2hhckNvZGVBdChjKzMpLGU9KGUmNyk8PDE4fChmJjYzKTw8MTJ8KGcmNjMpPDw2fGgmNjMsZS09NjU1MzYsYltkKytdPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8ZT4+MTAmMTAyMyksYltkKytdPVN0cmluZy5mcm9tQ2hhckNvZGUoNTYzMjB8ZSYxMDIzKSxjKz00KTtyZXR1cm4gYi5qb2luKCIiKX0sdXRmOF9lbmNvZGU9ZnVuY3Rpb24oYSl7aWYobnVsbD09PWF8fCJ1bmRlZmluZWQiPT09dHlwZW9mIGEpcmV0dXJuIiI7YSs9IiI7dmFyIGI9IiIsYyxkLGU9MDtjPWQ9MDtmb3IodmFyIGU9YS5sZW5ndGgsZj0wO2Y8ZTtmKyspe3ZhciBnPWEuY2hhckNvZGVBdChmKSxoPW51bGw7aWYoMTI4PmcpZCsrO2Vsc2UgaWYoMTI3PGcmJjIwNDg+ZyloPVN0cmluZy5mcm9tQ2hhckNvZGUoZz4+CjZ8MTkyLGcmNjN8MTI4KTtlbHNlIGlmKDU1Mjk2IT0oZyY2MzQ4OCkpaD1TdHJpbmcuZnJvbUNoYXJDb2RlKGc+PjEyfDIyNCxnPj42JjYzfDEyOCxnJjYzfDEyOCk7ZWxzZXtpZig1NTI5NiE9KGcmNjQ1MTIpKXRocm93IG5ldyBSYW5nZUVycm9yKCJVbm1hdGNoZWQgdHJhaWwgc3Vycm9nYXRlIGF0ICIrZik7aD1hLmNoYXJDb2RlQXQoKytmKTtpZig1NjMyMCE9KGgmNjQ1MTIpKXRocm93IG5ldyBSYW5nZUVycm9yKCJVbm1hdGNoZWQgbGVhZCBzdXJyb2dhdGUgYXQgIisoZi0xKSk7Zz0oKGcmMTAyMyk8PDEwKSsoaCYxMDIzKSs2NTUzNjtoPVN0cmluZy5mcm9tQ2hhckNvZGUoZz4+MTh8MjQwLGc+PjEyJjYzfDEyOCxnPj42JjYzfDEyOCxnJjYzfDEyOCl9bnVsbCE9PWgmJihkPmMmJihiKz1hLnNsaWNlKGMsZCkpLGIrPWgsYz1kPWYrMSl9ZD5jJiYoYis9YS5zbGljZShjLGUpKTtyZXR1cm4gYn07CmZ1bmN0aW9uIHV0ZjhfdG9fYXNjaWkoYSl7dmFyIGI9IiIsYyxkPWEubGVuZ3RoLGU7Zm9yKGM9MDtjPGQ7YysrKTEyOD5hLmNoYXJDb2RlQXQoYyk/Yis9YS5jaGFyQXQoYyk6KGU9IiIrYS5jaGFyQ29kZUF0KGMpLnRvU3RyaW5nKDE2KSxiKz0iXFx1IisoMj09PWUubGVuZ3RoPyIwMCIrZTozPT09ZS5sZW5ndGg/IjAiK2U6ZSkpO3JldHVybiBifQpmdW5jdGlvbiByZXBsYWNlRGlhY3JpdGljcyhhKXtbe2NoYXI6IkEiLGJhc2U6L1tcMzAwLVwzMDZdL2d9LHtjaGFyOiJhIixiYXNlOi9bXDM0MC1cMzQ2XS9nfSx7Y2hhcjoiRSIsYmFzZTovW1wzMTAtXDMxM10vZ30se2NoYXI6ImUiLGJhc2U6L1tcMzUwLVwzNTNdL2d9LHtjaGFyOiJJIixiYXNlOi9bXDMxNC1cMzE3XS9nfSx7Y2hhcjoiaSIsYmFzZTovW1wzNTQtXDM1N10vZ30se2NoYXI6Ik8iLGJhc2U6L1tcMzIyLVwzMzBdL2d9LHtjaGFyOiJvIixiYXNlOi9bXDM2Mi1cMzcwXS9nfSx7Y2hhcjoiVSIsYmFzZTovW1wzMzEtXDMzNF0vZ30se2NoYXI6InUiLGJhc2U6L1tcMzcxLVwzNzRdL2d9LHtjaGFyOiJOIixiYXNlOi9bXDMyMV0vZ30se2NoYXI6Im4iLGJhc2U6L1tcMzYxXS9nfSx7Y2hhcjoiQyIsYmFzZTovW1wzMDddL2d9LHtjaGFyOiJjIixiYXNlOi9bXDM0N10vZ31dLmZvckVhY2goZnVuY3Rpb24oYil7YT1hLnJlcGxhY2UoYi5iYXNlLGIuY2hhcil9KTtyZXR1cm4gYX0KdmFyIGdlbmVyYXRlVVVJRD1mdW5jdGlvbigpe3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5wZXJmb3JtYW5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cucGVyZm9ybWFuY2Uubm93JiYoYSs9cGVyZm9ybWFuY2Uubm93KCkpO3JldHVybiJ4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgiLnJlcGxhY2UoL1t4eV0vZyxmdW5jdGlvbihiKXt2YXIgYz0oYSsxNipNYXRoLnJhbmRvbSgpKSUxNnwwO2E9TWF0aC5mbG9vcihhLzE2KTtyZXR1cm4oIngiPT1iP2M6YyYzfDgpLnRvU3RyaW5nKDE2KX0pfTtmdW5jdGlvbiBndWlkKCl7ZnVuY3Rpb24gYSgpe3JldHVybiBNYXRoLmZsb29yKDY1NTM2KigxK01hdGgucmFuZG9tKCkpKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpfXJldHVybiBhKCkrYSgpKyItNCIrYSgpLnN1YnN0cigwLDMpKyItIithKCkrIi0iK2EoKSsiLSIrYSgpK2EoKSthKCl9CmZ1bmN0aW9uIG5ld0lkZW50aWZpZXIoKXtucm89KG5ldyBEYXRlKS5nZXRUaW1lKCk7dmFyIGE9IiI7bnJvPXRyaW0oIiAiK25ybyk7bnJvPW5ybysiIitNYXRoLmZsb29yKDg5Kk1hdGgucmFuZG9tKCkrMTEpO25ybz1ucm8rIiIrTWF0aC5mbG9vcig4OSpNYXRoLnJhbmRvbSgpKzExKTtucm89bnJvKyIiK01hdGguZmxvb3IoODkqTWF0aC5yYW5kb20oKSsxMSk7Zm9yKHZhciBiPTA7YjxNYXRoLmNlaWwobnJvLmxlbmd0aC8yKTtiKyspe3ZhciBjPXBhcnNlSW50KG5yby5zdWJzdHIoMipiLDIpKSxjPWRlYzJoZXgoYyksYT1hK3BhZChjLDIpOzA9PShiKzEpJTMmJihhKz0iLSIpfXJldHVybiBhfQp2YXIgZ2VuZXJhdGVTbWFsbFNlc3Npb25VbmlxdWVJZD1mdW5jdGlvbigpe3ZhciBhPVswLDAsMF0sYj0iOGk3dTZ5NXQ0cjNlMncxcTlvMHAiLnNwbGl0KCIiKSxjPWIubGVuZ3RoO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWFbMF0sZT1hWzFdLGY9YVsyXSxnPWJbZF0rYltlXStiW2ZdLGQ9KytkJWM7ZHx8KGU9KytlJWMpfHwoZj0rK2YlYyk7YT1bZCxlLGZdO3JldHVybiBnfX0oKSxtZDU9ZnVuY3Rpb24oYSl7dmFyIGI9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnO2U9YSYyMTQ3NDgzNjQ4O2Y9YiYyMTQ3NDgzNjQ4O2M9YSYxMDczNzQxODI0O2Q9YiYxMDczNzQxODI0O2c9KGEmMTA3Mzc0MTgyMykrKGImMTA3Mzc0MTgyMyk7cmV0dXJuIGMmZD9nXjIxNDc0ODM2NDheZV5mOmN8ZD9nJjEwNzM3NDE4MjQ/Z14zMjIxMjI1NDcyXmVeZjpnXjEwNzM3NDE4MjReZV5mOmdeZV5mfSxjPWZ1bmN0aW9uKGEsYyxkLGUsZixnLGspe2E9YihhLGIoYihjJmR8fmMmZSxmKSxrKSk7cmV0dXJuIGIoYTw8Cmd8YT4+PjMyLWcsYyl9LGQ9ZnVuY3Rpb24oYSxjLGQsZSxmLGcsayl7YT1iKGEsYihiKGMmZXxkJn5lLGYpLGspKTtyZXR1cm4gYihhPDxnfGE+Pj4zMi1nLGMpfSxlPWZ1bmN0aW9uKGEsYyxkLGUsZixnLGspe2E9YihhLGIoYihjXmReZSxmKSxrKSk7cmV0dXJuIGIoYTw8Z3xhPj4+MzItZyxjKX0sZj1mdW5jdGlvbihhLGMsZCxlLGYsZyxrKXthPWIoYSxiKGIoZF4oY3x+ZSksZiksaykpO3JldHVybiBiKGE8PGd8YT4+PjMyLWcsYyl9LGc9ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0iIixkO2ZvcihkPTA7Mz49ZDtkKyspYz1hPj4+OCpkJjI1NSxjPSIwIitjLnRvU3RyaW5nKDE2KSxiKz1jLnN1YnN0cihjLmxlbmd0aC0yLDIpO3JldHVybiBifSxoPVtdLGssbCx2LHcseCxzLHAscSx0O2E9dGhpcy51dGY4X2VuY29kZShhKTtoPWZ1bmN0aW9uKGEpe3ZhciBiLGM9YS5sZW5ndGg7Yj1jKzg7Zm9yKHZhciBkPTE2KigoYi1iJTY0KS82NCsxKSxlPUFycmF5KGQtMSksZj0wLGc9MDtnPApjOyliPShnLWclNCkvNCxmPWclNCo4LGVbYl18PWEuY2hhckNvZGVBdChnKTw8ZixnKys7Yj0oZy1nJTQpLzQ7ZVtiXXw9MTI4PDxnJTQqODtlW2QtMl09Yzw8MztlW2QtMV09Yz4+PjI5O3JldHVybiBlfShhKTtzPTE3MzI1ODQxOTM7cD00MDIzMjMzNDE3O3E9MjU2MjM4MzEwMjt0PTI3MTczMzg3ODthPWgubGVuZ3RoO2ZvcihrPTA7azxhO2srPTE2KWw9cyx2PXAsdz1xLHg9dCxzPWMocyxwLHEsdCxoW2srMF0sNywzNjE0MDkwMzYwKSx0PWModCxzLHAscSxoW2srMV0sMTIsMzkwNTQwMjcxMCkscT1jKHEsdCxzLHAsaFtrKzJdLDE3LDYwNjEwNTgxOSkscD1jKHAscSx0LHMsaFtrKzNdLDIyLDMyNTA0NDE5NjYpLHM9YyhzLHAscSx0LGhbays0XSw3LDQxMTg1NDgzOTkpLHQ9Yyh0LHMscCxxLGhbays1XSwxMiwxMjAwMDgwNDI2KSxxPWMocSx0LHMscCxoW2srNl0sMTcsMjgyMTczNTk1NSkscD1jKHAscSx0LHMsaFtrKzddLDIyLDQyNDkyNjEzMTMpLHM9YyhzLHAscSx0LGhbaysKOF0sNywxNzcwMDM1NDE2KSx0PWModCxzLHAscSxoW2srOV0sMTIsMjMzNjU1Mjg3OSkscT1jKHEsdCxzLHAsaFtrKzEwXSwxNyw0Mjk0OTI1MjMzKSxwPWMocCxxLHQscyxoW2srMTFdLDIyLDIzMDQ1NjMxMzQpLHM9YyhzLHAscSx0LGhbaysxMl0sNywxODA0NjAzNjgyKSx0PWModCxzLHAscSxoW2srMTNdLDEyLDQyNTQ2MjYxOTUpLHE9YyhxLHQscyxwLGhbaysxNF0sMTcsMjc5Mjk2NTAwNikscD1jKHAscSx0LHMsaFtrKzE1XSwyMiwxMjM2NTM1MzI5KSxzPWQocyxwLHEsdCxoW2srMV0sNSw0MTI5MTcwNzg2KSx0PWQodCxzLHAscSxoW2srNl0sOSwzMjI1NDY1NjY0KSxxPWQocSx0LHMscCxoW2srMTFdLDE0LDY0MzcxNzcxMykscD1kKHAscSx0LHMsaFtrKzBdLDIwLDM5MjEwNjk5OTQpLHM9ZChzLHAscSx0LGhbays1XSw1LDM1OTM0MDg2MDUpLHQ9ZCh0LHMscCxxLGhbaysxMF0sOSwzODAxNjA4MykscT1kKHEsdCxzLHAsaFtrKzE1XSwxNCwzNjM0NDg4OTYxKSxwPWQocCxxLAp0LHMsaFtrKzRdLDIwLDM4ODk0Mjk0NDgpLHM9ZChzLHAscSx0LGhbays5XSw1LDU2ODQ0NjQzOCksdD1kKHQscyxwLHEsaFtrKzE0XSw5LDMyNzUxNjM2MDYpLHE9ZChxLHQscyxwLGhbayszXSwxNCw0MTA3NjAzMzM1KSxwPWQocCxxLHQscyxoW2srOF0sMjAsMTE2MzUzMTUwMSkscz1kKHMscCxxLHQsaFtrKzEzXSw1LDI4NTAyODU4MjkpLHQ9ZCh0LHMscCxxLGhbaysyXSw5LDQyNDM1NjM1MTIpLHE9ZChxLHQscyxwLGhbays3XSwxNCwxNzM1MzI4NDczKSxwPWQocCxxLHQscyxoW2srMTJdLDIwLDIzNjgzNTk1NjIpLHM9ZShzLHAscSx0LGhbays1XSw0LDQyOTQ1ODg3MzgpLHQ9ZSh0LHMscCxxLGhbays4XSwxMSwyMjcyMzkyODMzKSxxPWUocSx0LHMscCxoW2srMTFdLDE2LDE4MzkwMzA1NjIpLHA9ZShwLHEsdCxzLGhbaysxNF0sMjMsNDI1OTY1Nzc0MCkscz1lKHMscCxxLHQsaFtrKzFdLDQsMjc2Mzk3NTIzNiksdD1lKHQscyxwLHEsaFtrKzRdLDExLDEyNzI4OTMzNTMpLHE9CmUocSx0LHMscCxoW2srN10sMTYsNDEzOTQ2OTY2NCkscD1lKHAscSx0LHMsaFtrKzEwXSwyMywzMjAwMjM2NjU2KSxzPWUocyxwLHEsdCxoW2srMTNdLDQsNjgxMjc5MTc0KSx0PWUodCxzLHAscSxoW2srMF0sMTEsMzkzNjQzMDA3NCkscT1lKHEsdCxzLHAsaFtrKzNdLDE2LDM1NzI0NDUzMTcpLHA9ZShwLHEsdCxzLGhbays2XSwyMyw3NjAyOTE4OSkscz1lKHMscCxxLHQsaFtrKzldLDQsMzY1NDYwMjgwOSksdD1lKHQscyxwLHEsaFtrKzEyXSwxMSwzODczMTUxNDYxKSxxPWUocSx0LHMscCxoW2srMTVdLDE2LDUzMDc0MjUyMCkscD1lKHAscSx0LHMsaFtrKzJdLDIzLDMyOTk2Mjg2NDUpLHM9ZihzLHAscSx0LGhbayswXSw2LDQwOTYzMzY0NTIpLHQ9Zih0LHMscCxxLGhbays3XSwxMCwxMTI2ODkxNDE1KSxxPWYocSx0LHMscCxoW2srMTRdLDE1LDI4Nzg2MTIzOTEpLHA9ZihwLHEsdCxzLGhbays1XSwyMSw0MjM3NTMzMjQxKSxzPWYocyxwLHEsdCxoW2srMTJdLDYsMTcwMDQ4NTU3MSksCnQ9Zih0LHMscCxxLGhbayszXSwxMCwyMzk5OTgwNjkwKSxxPWYocSx0LHMscCxoW2srMTBdLDE1LDQyOTM5MTU3NzMpLHA9ZihwLHEsdCxzLGhbaysxXSwyMSwyMjQwMDQ0NDk3KSxzPWYocyxwLHEsdCxoW2srOF0sNiwxODczMzEzMzU5KSx0PWYodCxzLHAscSxoW2srMTVdLDEwLDQyNjQzNTU1NTIpLHE9ZihxLHQscyxwLGhbays2XSwxNSwyNzM0NzY4OTE2KSxwPWYocCxxLHQscyxoW2srMTNdLDIxLDEzMDkxNTE2NDkpLHM9ZihzLHAscSx0LGhbays0XSw2LDQxNDk0NDQyMjYpLHQ9Zih0LHMscCxxLGhbaysxMV0sMTAsMzE3NDc1NjkxNykscT1mKHEsdCxzLHAsaFtrKzJdLDE1LDcxODc4NzI1OSkscD1mKHAscSx0LHMsaFtrKzldLDIxLDM5NTE0ODE3NDUpLHM9YihzLGwpLHA9YihwLHYpLHE9YihxLHcpLHQ9Yih0LHgpO3JldHVybihnKHMpK2cocCkrZyhxKStnKHQpKS50b0xvd2VyQ2FzZSgpfTsKaWYoIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJiJ1bmRlZmluZWQiPT10eXBlb2YgX29uTG9hZE1ldGhvZHMpe3ZhciBfb25Mb2FkTWV0aG9kcz1bXSxfc3RhcnR1cFN0YWdlXz0tMTt3aW5kb3cuYWRkT25Mb2FkTWFuYWdlcj1mdW5jdGlvbihhKXtfb25Mb2FkTWV0aG9kc1tfb25Mb2FkTWV0aG9kcy5sZW5ndGhdPWE7aWYoMD09X3N0YXJ0dXBTdGFnZV8pe3ZhciBiPWZ1bmN0aW9uKCl7MT09X3N0YXJ0dXBTdGFnZV8/YSgpOnNldFRpbWVvdXQoYiwxNTApfTtiKCl9ZWxzZSAxPT1fc3RhcnR1cFN0YWdlXyYmYSgpfTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixmdW5jdGlvbihhKXttVGFiTmF2JiZtVGFiTmF2LmluaXQoKX0pO19fc3RhcnR1cD1mdW5jdGlvbigpe2Zvcih2YXIgYT1fc3RhcnR1cFN0YWdlXz0wO2E8X29uTG9hZE1ldGhvZHMubGVuZ3RoO2ErKylpZihfb25Mb2FkTWV0aG9kcy5oYXNPd25Qcm9wZXJ0eShhKSYmdm9pZCAwIT09X29uTG9hZE1ldGhvZHNbYV0pX29uTG9hZE1ldGhvZHNbYV0oKTsKX3N0YXJ0dXBTdGFnZV89MX07Im9iamVjdCI9PXR5cGVvZiBjb3Jkb3ZhP2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5IixfX3N0YXJ0dXAsITEpOndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixmdW5jdGlvbigpe19fc3RhcnR1cCgpO2lmKCFpc09uTW9iaWxlKCkpe3ZhciBhPW5ldyBFdmVudCgiZGV2aWNlcmVhZHkiKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfX0sITEpO3ZhciBhZGRFdmVudD1mdW5jdGlvbihhLGIsYyl7InN0cmluZyI9PXR5cGVvZiBhJiYoYT15JChhKSk7aWYobnVsbCE9PWEmJiJ1bmRlZmluZWQiIT09dHlwZW9mIGEpe3ZhciBkO2lmKCJTRUxFQ1QiIT1hLm5vZGVOYW1lJiYoaXNBcnJheShhKXx8Im9iamVjdCI9PXR5cGVvZiBhJiYibnVtYmVyIj09dHlwZW9mIGEubGVuZ3RoKSlmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWFkZEV2ZW50KGFbZF0sYixjKTtlbHNle2I9Yi5zcGxpdCgiICIpO3ZhciBlO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZT0KYltkXSxhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKGUsYywiY2hhbmdlIj09ZS50b1VwcGVyQ2FzZSgpKTphLmF0dGFjaEV2ZW50P2EuYXR0YWNoRXZlbnQoIm9uIitlLGMpOmFbIm9uIitlXT1jfX19LHJlbW92ZUV2ZW50PWZ1bmN0aW9uKGEsYixjKXsic3RyaW5nIj09dHlwZW9mIGEmJihhPXkkKGEpKTtpZihudWxsIT09YSYmInVuZGVmaW5lZCIhPT10eXBlb2YgYSlpZihpc0FycmF5KGEpKWZvcihiPTA7YjxhLmxlbmd0aDtiKyspcmVtb3ZlRXZlbnQoYVtiXSxjKTtlbHNle3ZhciBkPWIuc3BsaXQoIiAiKSxlO2ZvcihiPTA7YjxkLmxlbmd0aDtiKyspZT1kW2JdLGEuYWRkRXZlbnRMaXN0ZW5lcj9hLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxjLCExKTphLmRldGFjaEV2ZW50P2EuZGV0YWNoRXZlbnQoIm9uIitlLGMpOmFbIm9uIitlXT1udWxsfX19X2R1bXAoInltaXNjIik7CmZ1bmN0aW9uIHlBbmFsaXNlKGEsYixjKXtpZih2b2lkIDAhPT1hKXthPXVubWFza0hUTUwoYSk7Yz0hMD09PXdpbmRvdy5fX2FsbG93SW5zZWN1cmVKU0NhbGxzX18/Y3x8d2luZG93OmN8fHt9O3ZhciBkPS9cJSh8XHcrKVwoL2dpLGUsZixnLGgsaztmb3IoZj0iIjsic3RyaW5nIj09dHlwZW9mIGEmJjA8PShlPWEuc2VhcmNoKGQpKTspaWYoZj1hLnNsaWNlKGUpLnNlYXJjaCgvXCgvKSwwPD1mKXtnPWEuc2xpY2UoZStmKzEsZStmKzIpO2lmKCciJz09Z3x8IiciPT1nKXtrPWUrZisxO2RvIGsrKyxoPWEuc2xpY2UoayxrKzEpO3doaWxlKGghPWcmJms8YS5sZW5ndGgpO2c9aythLnNsaWNlKGspLnNlYXJjaCgvXCkvKS1lfWVsc2UgZz1hLnNsaWNlKGUpLnNlYXJjaCgvXCkvKTt2YXIgbD1hLnNsaWNlKGUrMSxlK2YpO2g9YS5zbGljZShlK2YrMSxlK2cpO2s9bnVsbDtoPWguc3BsaXQoIiwiKTtmb3Ioaz0wO2s8aC5sZW5ndGg7aysrKWhba109KGhba118fCIiKS50cmltKCksaFtrXT0KeUFuYWxpc2UoaFtrXSxiLGMpO2Y9dm9pZCAwO2s9aFswXS50b1VwcGVyQ2FzZSgpO3ZhciB2PWhbMF07aWYodm9pZCAwIT09YilpZih2b2lkIDA9PWJbMF0pZj1iW2tdP3lBbmFsaXNlKGJba10sYixjKTp5QW5hbGlzZShiW3ZdLGIsYyk7ZWxzZSBmb3IodmFyIHc9Yi5sZW5ndGgtMTswPD13JiZ2b2lkIDA9PWY7dy0tKXZvaWQgMCE9Ylt3XVtrXT9mPXlBbmFsaXNlKGJbd11ba10sYixjKTp2b2lkIDAhPWJbd11bdl0mJihmPXlBbmFsaXNlKGJbd11bdl0sYixjKSk7ZWxzZSBmPSIiPT12PyIiOiIuIiE9di5zdWJzdHIoMCwxKSYmInN0cmluZyI9PWV2YWwoInR5cGVvZiAiK3YpP2V2YWwodik6eUFuYWxpc2UodixudWxsLGMpO3ZvaWQgMD09ZiYmKGY9IiIpO2hbMF09Zjtzd2l0Y2gobCl7Y2FzZSAiaW50ZWdlciI6Y2FzZSAiaW50IjpjYXNlICJpbnR6IjpjYXNlICJpbnRuIjpmPXN0cjJpbnQoZik7MD09ZiYmKCJpbnR6Ij09bD9mPSItIjoiaW50biI9PWwmJihmPSIiKSk7YnJlYWs7CmNhc2UgImRlY2ltYWwiOmg9TWF0aC5tYXgoMCxwYXJzZUludChoWzFdKSk7Zj1zdHIyZG91YmxlKGYpO2Y9Zi50b0ZpeGVkKGgpO2JyZWFrO2Nhc2UgInBob25lIjpmPShmfHwiIikuYXNQaG9uZSgpO2JyZWFrO2Nhc2UgImxvbjJkZWciOmY9ZGVjMmRlZyhmLCExKTticmVhaztjYXNlICJsYXQyZGVnIjpmPWRlYzJkZWcoZiwhMCk7YnJlYWs7Y2FzZSAiZGVnMmRlYyI6Zj1kZWcyZGVjKGYsITEpO2JyZWFrO2Nhc2UgImliZGF0ZSI6Zj1JQkRhdGUyRGF0ZShmKTticmVhaztjYXNlICJ0c2RhdGUiOmY9dGltZXN0YW1wMmRhdGUoZik7YnJlYWs7Y2FzZSAidHN0aW1lIjpmPXRpbWVzdGFtcDJ0aW1lKGYpO2JyZWFrO2Nhc2UgInRzZGF0ZXRpbWUiOmY9dGltZXN0YW1wMmRhdGUoZikrIiAiK3RpbWVzdGFtcDJ0aW1lKGYpO2JyZWFrO2Nhc2UgImRhdGUiOmY9aFsxXT9VRGF0ZTJEYXRlKGYsaFsxXSk6VURhdGUyRGF0ZShmKTticmVhaztjYXNlICJ0aW1lIjpmPWhbMV0/VURhdGUyVGltZShmLApoWzFdKTpVRGF0ZTJUaW1lKGYpO2JyZWFrO2Nhc2UgInJnIjpmPSgiIisoZnx8IiIpKS5hc1JHKCk7YnJlYWs7Y2FzZSAiY3BmIjpmPSgiIisoZnx8IiIpKS5hc0NQRigpO2JyZWFrO2Nhc2UgImNucGoiOmY9KCIiKyhmfHwiIikpLmFzQ05QSigpO2JyZWFrO2Nhc2UgImJyRG9jdG8iOmY9IiIrKGZ8fCIiKTtmPWYuaXNDTlBKKCk/Zi5hc0NOUEooKTpmLmlzQ1BGKCk/Zi5hc0NQRigpOmYuYXNSRygpO2JyZWFrO2Nhc2UgInBob25lIjpmPSgiIisoZnx8IiIpKS5hc1Bob25lKGhbMV0pO2JyZWFrO2Nhc2UgImNlcCI6Zj0oIiIrKGZ8fCIiKSkuYXNDRVAoKTticmVhaztjYXNlICJubDJiciI6Zj1mLnJlcGxhY2UoLyhbXj5cclxuXT8pKFxyXG58XG5ccnxccnxcbikvZywiJDE8YnI+JDIiKTticmVhaztjYXNlICJhYmJyZXZpYXRlIjpmPWYuYWJicmV2aWF0ZShoWzFdfHwyMCxoWzJdfHwhMSk7YnJlYWs7Y2FzZSAid29yZHMiOmw9Zi5zcGxpdCgiICIpO3Y9TWF0aC5tYXgoMCxzdHIyaW50KGhbMV0pKTsKdz1NYXRoLm1heChsLmxlbmd0aC0xLHN0cjJpbnQoaFsyXSkpO2g9TWF0aC5tYXgoMCxzdHIyaW50KGhbM10pKTtmPSIiO2ZvcihrPXY7azx2K3c7aysrKXt2YXIgeD1vbmx5RGVmaW5lZFZhbHVlKGxba10pOyIiPHgmJihmKz0iICIreCl9MDxoJiYoZj13b3Jkd3JhcChmLGgsIjxicj4iLCEwKSk7YnJlYWs7Y2FzZSAicXVvdGVkIjpmPSgnIicrZikudHJpbSgpKyciJzticmVhaztjYXNlICJzaW5nbGVRdW90ZWQiOmY9KCInIitmKS50cmltKCkrIiciO2JyZWFrO2Nhc2UgImNvbmRMYWJlbCI6YnJlYWs7Y2FzZSAiY2hlY2tlZCI6Zj1jb3VudENoZWNrZWRFbGVtZW50cyhmKTticmVhaztkZWZhdWx0OiIiPGwmJigiZnVuY3Rpb24iPT10eXBlb2YgY1tsXT9mPWNbbF0uYXBwbHkobnVsbCxoKToib2JqZWN0Ij09dHlwZW9mIGNbbF0/Zj0iZnVuY3Rpb24iPT10eXBlb2YgY1tsXVtmXT9jW2xdW2ZdLmFwcGx5KG51bGwsaCk6Y1tsXToidW5kZWZpbmVkIiE9PXR5cGVvZiBjW2xdJiYoZj1jW2xdKSl9YT0KYS5zbGljZSgwLGUpK2YrYS5zbGljZShlK2crMSl9ZWxzZXtjb25zb2xlLmVycm9yKCJIQUxUSU5HIHlBbmFsaXNlIGFzIGVudGVyaW5nIGluIGxvb3AiKTticmVha319ZWxzZSBhPSIiO3JldHVybiBhfQp2YXIgeUxleE9iaj1mdW5jdGlvbihhLGIpe3ZhciBjPXt9O2MuX2RlYnVnPSEwPT09KGJ8fCExKTtjLm9wdGFibGU9eyIhIjoiRVhDTEFNQVRJT04iLCIjIjoiTlVNQkVSX1NJR04iLCQ6IkRPTExBUiIsIiUiOiJNT0RVTFVTIiwiXiI6IlBPV0VSIiwiJiI6IkFNUEVSU0FORCIsIigiOiJMX1BBUkVOIiwiKSI6IlJfUEFSRU4iLCIqIjoiTVVMVElQTElDQVRJT04iLCIrIjoiQURESVRJT04iLCIsIjoiQ09NTUEiLCItIjoiU1VCU1RSQUNUSU9OIiwiLiI6IlBFUklPRCIsIi8iOiJESVZJU0lPTiIsIjoiOiJDT0xPTiIsIjsiOiJTRU1JQ09MT04iLCI8IjoiTEVTU19USEFOIiwiPSI6IkVRVUFMUyIsIj4iOiJHUkVBVEVSX1RIQU4iLCI/IjoiUVVFU1RJT04iLCJbIjoiTF9CUkFDS0VUIiwiXFwiOiJCQUNLU0xBU0giLCJdIjoiUl9CUkFDS0VUIiwieyI6IkxfQlJBQ0UiLCJ8IjoiUElQRSIsIn0iOiJSX0JSQUNFIiwifiI6IlRJTERFIiwiKysiOiJJTkNSRU1FTlQiLCItLSI6IkRFQ1JFTUVOVCIsCiI9PSI6IkVRVUFMMiIsIiE9IjoiTk9UX0VRVUFMMiIsIj49IjoiR1JFQVRFUl9FUVVBTFMyIiwiPD0iOiJMRVNTX0VRVUFMUzIifTtjLm9wcHJlY2VkZW5jZT17TElLRTo2LCI8Ijo2LCI+Ijo2LCI8PSI6NiwiPj0iOjYsIj09Ijo2LCJeIjo0LCIvIjo0LCIqIjo0LEFORDo0LE9SOjMsIisiOjIsIi0iOjIsIigiOjF9O2MuX0FMUEhBPTE7Yy5fQUxQSEFfTlVNPTI7Yy5fTkVXX0xJTkU9NDtjLl9ESUdJVD04O2MuX1FVT1RFPTE2O2Mudm9pZFRva2VuPXt0eXBlOm51bGwsdG9rZW46bnVsbCx0b2tlbl9zdHJpbmc6bnVsbCxwb3M6bnVsbH07Yy5lcnJvcj1mdW5jdGlvbigpe3ZhciBhPXt9O21lcmdlT2JqZWN0KGMudm9pZFRva2VuLGEpO2EudHlwZT0iRVJST1IiO2EucG9zPWMucG9zO3JldHVybiBhfTtjLm9uZUNoYXI9ZnVuY3Rpb24oYSl7cmV0dXJuIGMuYnVmLmNoYXJBdChjLnBvcysoYXx8MCkpfTtjLl9pc25ld2xpbmU9ZnVuY3Rpb24oYSl7YT1jLm9uZUNoYXIoKTtyZXR1cm4iXHIiPT09CmF8fCJcbiI9PT1hP2MuX05FV19MSU5FOjB9O2MuX2lzZGlnaXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIjAiPD1hJiYiOSI+PWE/Yy5fRElHSVQ6MH07Yy5faXNhbHBoYT1mdW5jdGlvbihhKXtyZXR1cm4iYSI8PWEmJiJ6Ij49YXx8IkEiPD1hJiYiWiI+PWF8fCJfIj09PWF8fCIkIj09PWE/Yy5fQUxQSEE6MH07Yy5faXNhbHBoYW51bT1mdW5jdGlvbihhKXtyZXR1cm4gYy5faXNkaWdpdChhKXxjLl9pc2FscGhhKGEpfTtjLl9pc3F1b3RlPWZ1bmN0aW9uKGEpe3JldHVybiInIj09YXx8JyInPT1hP2MuX1FVT1RFOjB9O2MuX3doYXRpcz1mdW5jdGlvbihhKXtyZXR1cm4gYy5faXNhbHBoYShhKXxjLl9pc2RpZ2l0KGEpfGMuX2lzcXVvdGUoYSl9O2MuX3Byb2Nlc3NfcXVvdGU9ZnVuY3Rpb24oKXt2YXIgYT1jLm9uZUNoYXIoKSxhPWMuYnVmLmluZGV4T2YoYSxjLnBvcysxKSxiPWMuZXJyb3IoKTthPmMucG9zJiYoYj17dHlwZToiTElURVJBTCIsdG9rZW46Yy5idWYuc3Vic3RyaW5nKGMucG9zKwoxLGEpLHBvczpjLnBvc30sYi50b2tlbl9zdHJpbmc9Yi50b2tlbixjLnBvcz1hKzEpO3JldHVybiBifTtjLl9wcm9jZXNzX2lkZW50aWZpZXI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MSxiPWMuZXJyb3IoKTtjLnBvcythPGMuYnVmLmxlbmd0aCYmYy5faXNhbHBoYShjLm9uZUNoYXIoYSkpOylhKys7Yj17dHlwZToiSURFTlRJRklFUiIsdG9rZW46Yy5idWYuc3Vic3RyaW5nKGMucG9zLGMucG9zK2EpLHBvczpjLnBvc307Yi50b2tlbl9zdHJpbmc9Yi50b2tlbjtjLnBvcys9YTtyZXR1cm4gYn07Yy5fcHJvY2Vzc19udW1iZXI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MSxiPWMuZXJyb3IoKTtjLnBvcythPGMuYnVmLmxlbmd0aCYmYy5faXNkaWdpdChjLm9uZUNoYXIoYSkpOylhKys7Yj17dHlwZToiTlVNQkVSIix0b2tlbjpjLmJ1Zi5zdWJzdHJpbmcoYy5wb3MsYy5wb3MrYSkscG9zOmMucG9zfTtiLnRva2VuX3N0cmluZz1iLnRva2VuO2MucG9zKz1hO3JldHVybiBifTtjLmdldFRva2VuPQpmdW5jdGlvbigpe2Zvcih2YXIgYSxiPWMuZXJyb3IoKTtjLnBvczxjLmJ1Zi5sZW5ndGg7KWlmKGE9Yy5vbmVDaGFyKCksLTE8IiBcdFxyXG4iLmluZGV4T2YoYSkpYy5wb3MrKztlbHNlIGJyZWFrO2lmKGMucG9zPGMuYnVmLmxlbmd0aCl7aWYoIi8iPT1hJiYiKiIhPWMub25lQ2hhcigxKSljLm9uZUNoYXIoMSk7dmFyIGY9Yy5vcHRhYmxlW2FdO2lmKHZvaWQgMD09PWYpc3dpdGNoKGMuX3doYXRpcyhhKSl7Y2FzZSBjLl9BTFBIQTpiPWMuX3Byb2Nlc3NfaWRlbnRpZmllcigpO2E9U3RyaW5nKGIudG9rZW5fc3RyaW5nKS50b1VwcGVyQ2FzZSgpO2lmKCJBTkQiPT1hfHwiT1IiPT1hfHwiTElLRSI9PWEpYi50b2tlbl9zdHJpbmc9YSxiLnR5cGU9Ik9QRVJBVE9SIjticmVhaztjYXNlIGMuX0RJR0lUOmI9Yy5fcHJvY2Vzc19udW1iZXIoKTticmVhaztjYXNlIGMuX1FVT1RFOmI9Yy5fcHJvY2Vzc19xdW90ZSgpfWVsc2V7dmFyIGI9YSxnPWMub25lQ2hhcigxKSxoPWMudm9pZFRva2VuLAprPWMucG9zO2lmKGMub3B0YWJsZVthK2ddKWErPWcsZj1jLm9wdGFibGVbYV0sYj1hO2Vsc2UgaWYoMDw9Ii0rIi5pbmRleE9mKGEpKXt2YXIgbD1jLnByaW9yVG9rZW4udHlwZTtpZihudWxsPT09bHx8Ik9QRVJBVE9SIj09bCYmIkxfUEFSRU4iPT1jLnByaW9yVG9rZW4udG9rZW4pZz1jLl93aGF0aXMoZyksZz09Yy5fRElHSVQ/aD1jLl9wcm9jZXNzX251bWJlcigpOmc9PWMuX0FMUEhBJiYoaD1jLl9wcm9jZXNzX2lkZW50aWZpZXIoKSl9Yj17dHlwZTpoLnR5cGV8fCJPUEVSQVRPUiIsdG9rZW46aC50b2tlbnx8Zixwb3M6ayx0b2tlbl9zdHJpbmc6aC50b2tlbl9zdHJpbmd8fGJ9O2MucG9zKz1hLmxlbmd0aH19ZWxzZSBiLnR5cGU9IkVPRiIsYi50b2tlbj1udWxsO3JldHVybiBjLnByaW9yVG9rZW49Yn07Yy50b2tlblR5cGVJcz1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0oIiwiK2IrIiwiKS5pbmRleE9mKCIsIithLnR5cGUrIiwiKX07Yy5nZXRFeHBlY3RlZFRva2VuPWZ1bmN0aW9uKGEpe3ZhciBiPQpjLnBvcyxmPWMuZ2V0VG9rZW4oKTtpZihjLnRva2VuVHlwZUlzKGYsYSkpcmV0dXJuIGY7Yy5wb3M9YjtyZXR1cm4hMX07Yy5fYW5hbGlzZVRleHQ9ZnVuY3Rpb24oKXt2YXIgYSxiPWMudm9pZFRva2VuLGYsZztkbyBpZigoYT1jLmdldFRva2VuKCkpJiYiRU9GIiE9YS50eXBlKWlmKDA8Yy5zeW1TdGFjay5sZW5ndGgmJihiPWMuc3ltU3RhY2tbYy5zeW1TdGFjay5sZW5ndGgtMV0pLGI9Ynx8Yy52b2lkVG9rZW4sIigiPT1hLnRva2VuX3N0cmluZyljLnN5bVN0YWNrLnB1c2goYSk7ZWxzZSBpZigiKSI9PWEudG9rZW5fc3RyaW5nKWZvcihiPWMuc3ltU3RhY2sucG9wKCk7YiYmIigiIT1iLnRva2VuX3N0cmluZzspYy5wb3N0Rml4U3RhY2sucHVzaChiKSxiPWMuc3ltU3RhY2sucG9wKCk7ZWxzZSBpZigiT1BFUkFUT1IiPT1hLnR5cGUpe2Zvcih2YXIgaD0hMDtoOyloPSExLDA8Yy5zeW1TdGFjay5sZW5ndGgmJihiPShiPWMuc3ltU3RhY2tbYy5zeW1TdGFjay5sZW5ndGgtMV0pfHwKYy52b2lkVG9rZW4sZj1jLm9wcHJlY2VkZW5jZVthLnRva2VuX3N0cmluZ118fDk5LGc9Yy5vcHByZWNlZGVuY2VbYi50b2tlbl9zdHJpbmddfHwxMCxnPmYmJihoPSEwLGI9Yy5zeW1TdGFjay5wb3AoKSxjLnBvc3RGaXhTdGFjay5wdXNoKGIpKSk7Yy5zeW1TdGFjay5wdXNoKGEpfWVsc2UgYy5wb3N0Rml4U3RhY2sucHVzaChhKTt3aGlsZSgiRVJST1IiIT1hLnR5cGUmJiJFT0YiIT1hLnR5cGUpO2RvKGI9Yy5zeW1TdGFjay5wb3AoKSkmJiJFT0YiIT1iLnR5cGUmJmMucG9zdEZpeFN0YWNrLnB1c2goYik7d2hpbGUoYiYmIkVPRiIhPWIudHlwZSk7Yy5fZGVidWcmJihfZHVtcHkoMzIsMiwicG9zdEZpeFN0YWNrOiIpLGMuc2hvd1N0YWNrKGMucG9zdEZpeFN0YWNrKSxfZHVtcHkoMzIsMiwic3ltU3RhY2s6IiksYy5zaG93U3RhY2soYy5zeW1TdGFjaykpfTtjLnNvbHZlPWZ1bmN0aW9uKGEpe3ZhciBiLGY9W10sZyxoLGssbCx2O2s9IiI7YT1hfHx7fTthWyJ0cnVlIl09ITA7YVsiZmFsc2UiXT0KITE7Zm9yKGI9MDtiPGMucG9zdEZpeFN0YWNrLmxlbmd0aDtiKyspaWYoaz0hMSxnPWMucG9zdEZpeFN0YWNrW2JdKXtpZigiTlVNQkVSIj09Zy50eXBlfHwiTElURVJBTCI9PWcudHlwZSloPWcudG9rZW5fc3RyaW5nLGlzTnVtYmVyKGgpfHwoaD1TdHJpbmcoaCkudG9VcHBlckNhc2UoKSksaz0hMDsiSURFTlRJRklFUiI9PWcudHlwZSYmKGg9YVtnLnRva2VuX3N0cmluZ10sInVuZGVmaW5lZCI9PXR5cGVvZiBoPyhrPSInIitnLnRva2VuX3N0cmluZysiJyBpcyBub3QgZGVmaW5lZCBvbiBkYXRhIixfZHVtcHkoMzIsMSxrKSxoPSExKToic3RyaW5nIj09dHlwZW9mIGgmJihoPVN0cmluZyhoKS50b1VwcGVyQ2FzZSgpKSxrPSEwKTtpZihrKWYucHVzaChoKTtlbHNle2w9Zi5wb3AoKTtrPWYucG9wKCk7c3dpdGNoKCgiIitnLnRva2VuX3N0cmluZykudG9VcHBlckNhc2UoKSl7Y2FzZSAiKyI6dj1zdHIyZG91YmxlKGspK3N0cjJkb3VibGUobCk7YnJlYWs7Y2FzZSAiLSI6dj1zdHIyZG91YmxlKGspLQpzdHIyZG91YmxlKGwpO2JyZWFrO2Nhc2UgIioiOnY9c3RyMmRvdWJsZShrKSpzdHIyZG91YmxlKGwpO2JyZWFrO2Nhc2UgIi8iOnY9c3RyMmRvdWJsZShrKS9zdHIyZG91YmxlKGwpO2JyZWFrO2Nhc2UgIl4iOnY9TWF0aC5wb3coc3RyMmRvdWJsZShrKSxzdHIyZG91YmxlKGwpKTticmVhaztjYXNlICI+Ijp2PWs+bDticmVhaztjYXNlICI8Ijp2PWs8bDticmVhaztjYXNlICI+PSI6dj1rPj1sO2JyZWFrO2Nhc2UgIjw9Ijp2PWs8PWw7YnJlYWs7Y2FzZSAiPD4iOmNhc2UgIiE9Ijp2PWshPWw7YnJlYWs7Y2FzZSAiPT0iOnY9az09bDticmVhaztjYXNlICJBTkQiOmNhc2UgIiYmIjp2PWsmJmw7YnJlYWs7Y2FzZSAiT1IiOmNhc2UgInx8Ijp2PWt8fGw7YnJlYWs7Y2FzZSAiTElLRSI6az1TdHJpbmcoaykudG9VcHBlckNhc2UoKTtsPVN0cmluZyhsKS50b1VwcGVyQ2FzZSgpO3Y9bC5yZXBsYWNlKC9cJS9nLCIiKTt2PSIlIiE9bC5zdWJzdHIoMCwxKT8iJSIhPWwuc3Vic3RyKGwubGVuZ3RoLQoxKT9rPT1sOmsuc3Vic3RyKDAsdi5sZW5ndGgpPT12OiIlIj09bC5zdWJzdHIobC5sZW5ndGgtMSwxKT8wPD1rLmluZGV4T2Yodik6ay5zdWJzdHIoay5sZW5ndGgtdi5sZW5ndGgpPT12O2JyZWFrO2RlZmF1bHQ6dGhyb3cgaz0iJyIrZy50b2tlbl9zdHJpbmcrIicgaXMgbm90IGEgcmVjb2duaXplZCBvcGVyYXRvciIsY29uc29sZS5lcnJvcihrKSxFcnJvcigpO31jLl9kZWJ1ZyYmX2R1bXB5KDMyLDIsInswfSA9IHsxfSB7Mn0gezN9Ii5mb3JtYXQodixrLGcudG9rZW5fc3RyaW5nLGwpKTtudWxsIT09diYmZi5wdXNoKHYpfX12PWYucG9wKCk7Yy5fZGVidWcmJl9kdW1weSgzMiwyLEpTT04uc3RyaW5naWZ5KHYpKTtyZXR1cm4gdn07Yy5zaG93U3RhY2s9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSJcdCIsYz0wO2M8YS5sZW5ndGg7YysrKWIrPWFbY10udG9rZW5fc3RyaW5nKyIgIjtfZHVtcHkoMzIsMixiKX07Yy5wYXJzZT1mdW5jdGlvbigpe2MucmVzZXQoKTtjLl9hbmFsaXNlVGV4dCgpOwpyZXR1cm4gYy5zdGFja307Yy5yZXNldD1mdW5jdGlvbigpe2MucG9zPTA7Yy5zeW1TdGFjaz1bXTtjLnBvc3RGaXhTdGFjaz1bXTtjLnByaW9yVG9rZW49Yy52b2lkVG9rZW47cmV0dXJuIGN9O2MuaW5pdD1mdW5jdGlvbihhKXtjLmJ1Zj1hfHxjLmJ1Znx8IiI7Yy5wYXJzZSgpO3JldHVybiBjfTtyZXR1cm4gYy5pbml0KGEpfTtfZHVtcCgieWFuYWxpc2UiKTsKdmFyIGNmZ0RCYmFzZT1mdW5jdGlvbigpe3JldHVybntnZXRDb25uUGFyYW1zOmZ1bmN0aW9uKCl7dmFyIGE9W107YS5zZXJ2ZXI9eXN0b3JhZ2UuZ2V0SXRlbSgic2VydmVyIik7YS51c2VyPXlzdG9yYWdlLmdldEl0ZW0oInVzZXIiKTthLnBhc3N3b3JkPXlzdG9yYWdlLmdldEl0ZW0oInBhc3N3b3JkIik7YS50b2tlbj15c3RvcmFnZS5nZXRJdGVtKCJ0b2tlbiIpO3JldHVybiBhfSxzZXRDb25uUGFyYW1zOmZ1bmN0aW9uKGEpe3lzdG9yYWdlLnNldEl0ZW0oInNlcnZlciIsYS5zZXJ2ZXIpO3lzdG9yYWdlLnNldEl0ZW0oInVzZXIiLGEudXNlcik7eXN0b3JhZ2Uuc2V0SXRlbSgicGFzc3dvcmQiLGEucGFzc3dvcmQpO3lzdG9yYWdlLnNldEl0ZW0oInRva2VuIixhLnRva2VuKX19fSxjZmdEQj1jZmdEQmJhc2UoKTtfZHVtcCgieWNmZ2RiIik7CnZhciB5ZHJhZ2Ryb3BCYXNlPWZ1bmN0aW9uKCl7dmFyIGE9e2luZm86e3N0YXJ0WDowLHN0YXJ0WTowLG9mZnNldFg6MCxvZmZzZXRZOjAsZHJhZ0VsZW1lbnQ6bnVsbCxvdmVyRWxlbWVudDpudWxsLG9sZFpJbmRleDowLGxhc3RIaWdoTGlnaHQ6bnVsbH0saGlnaGxpZ2h0OmZ1bmN0aW9uKGIpe251bGwhPWEuaW5mby5sYXN0SGlnaExpZ2h0JiZhLmluZm8ubGFzdEhpZ2hMaWdodC5kZWxldGVDbGFzcygiaGlnaGxpZ2h0Iik7KGEuaW5mby5sYXN0SGlnaExpZ2h0PWIpJiZhLmluZm8ubGFzdEhpZ2hMaWdodC5hZGRDbGFzcygiaGlnaGxpZ2h0Iil9LGdldFRhcmdldDpmdW5jdGlvbihhKXthfHwoYT13aW5kb3cuZXZlbnQpO3JldHVybiBhLnRhcmdldD9hLnRhcmdldDphLnNyY0VsZW1lbnQ/YS5zcmNFbGVtZW50OndpbmRvdy5ldmVudH0sb25Nb3VzZURvd246ZnVuY3Rpb24oYil7bnVsbD09YiYmKGI9d2luZG93LmV2ZW50KTt2YXIgYz1hLmdldFRhcmdldChiKTsiY2FwdGlvbiI9PQpjLmNsYXNzTmFtZSYmKGM9Yy5wYXJlbnROb2RlKTsidGl0bGUiPT1jLmNsYXNzTmFtZSYmKGM9Yy5wYXJlbnROb2RlKTtpZigoMT09Yi5idXR0b24mJm51bGwhPXdpbmRvdy5ldmVudHx8MD09Yi5idXR0b24pJiYieWVzIj09Yy5nZXRBdHRyaWJ1dGUoImRyYWdnYWJsZSIpKXJldHVybiBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcj0ibW92ZSIsYS5pbmZvLnN0YXJ0WD1iLmNsaWVudFgsYS5pbmZvLnN0YXJ0WT1iLmNsaWVudFksYS5pbmZvLm9mZnNldFg9c3RyMmludChjLnN0eWxlLmxlZnQpLGEuaW5mby5vZmZzZXRZPXN0cjJpbnQoYy5zdHlsZS50b3ApLGEuaW5mby5vbGRaSW5kZXg9Yy5zdHlsZS56SW5kZXgsYS5pbmZvLmRyYWdFbGVtZW50PWMsZG9jdW1lbnQuYm9keS5mb2N1cygpLGRvY3VtZW50Lm9uc2VsZWN0c3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYy5vbmRyYWdzdGFydD1mdW5jdGlvbigpe3JldHVybiExfSwhMX0sb25Nb3VzZU1vdmU6ZnVuY3Rpb24oYil7Ynx8CihiPXdpbmRvdy5ldmVudCk7dmFyIGM9Yi5jbGllbnRYLGQ9Yi5jbGllbnRZO2I9ZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChjLGQpO251bGwhPWEuaW5mby5kcmFnRWxlbWVudD8oYS5pbmZvLm92ZXJFbGVtZW50PWIsYS5pbmZvLmRyYWdFbGVtZW50LnN0eWxlLmxlZnQ9YS5pbmZvLm9mZnNldFgrYy1hLmluZm8uc3RhcnRYKyJweCIsYS5pbmZvLmRyYWdFbGVtZW50LnN0eWxlLnRvcD1hLmluZm8ub2Zmc2V0WStkLWEuaW5mby5zdGFydFkrInB4IixjPSEwLGImJihjPSJ5ZXMiPT1iLmdldEF0dHJpYnV0ZSgiZHJvcHBhYmxlIiksImZ1bmN0aW9uIj09dHlwZW9mIGIub25kcmFnb3ZlciYmKGM9Yi5vbmRyYWdvdmVyKGEuaW5mby5kcmFnRWxlbWVudCkpLGM/YS5oaWdobGlnaHQoYik6YS5oaWdobGlnaHQobnVsbCkpLGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yPWM/ImNyb3NzaGFpciI6Im1vdmUiKTpiJiZkb2N1bWVudC5ib2R5JiYoInllcyI9PWIuZ2V0QXR0cmlidXRlKCJkcmFnZ2FibGUiKT8KZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiOmRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yPSJkZWZhdWx0Iil9LG9uTW91c2VVcDpmdW5jdGlvbihiKXtpZihudWxsIT1hLmluZm8uZHJhZ0VsZW1lbnQmJihkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcj0iZGVmYXVsdCIsZG9jdW1lbnQub25zZWxlY3RzdGFydD1udWxsLGEuaW5mby5kcmFnRWxlbWVudC5vbmRyYWdzdGFydD1udWxsLGEuaGlnaGxpZ2h0KG51bGwpLGI9YS5pbmZvLmRyYWdFbGVtZW50LGEuaW5mby5kcmFnRWxlbWVudD1udWxsLGEuaW5mby5vdmVyRWxlbWVudCkpe19kdW1weSgyLDEsIm1vdXNlIHVwIG92ZXIiK2EuaW5mby5vdmVyRWxlbWVudC5pZCk7dmFyIGM9InllcyI9PWEuaW5mby5vdmVyRWxlbWVudC5nZXRBdHRyaWJ1dGUoImRyb3BwYWJsZSIpO2lmKGMmJigiZnVuY3Rpb24iPT10eXBlb2YgYS5pbmZvLm92ZXJFbGVtZW50Lm9uZHJhZ292ZXImJihjPWEuaW5mby5vdmVyRWxlbWVudC5vbmRyYWdvdmVyKGIpKSwKImZ1bmN0aW9uIj09dHlwZW9mIGEuaW5mby5vdmVyRWxlbWVudC5vbmRyb3AmJmMpKWEuaW5mby5vdmVyRWxlbWVudC5vbmRyb3AoYil9fX07Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmKGRvY3VtZW50Lm9ubW91c2Vkb3duPWEub25Nb3VzZURvd24sZG9jdW1lbnQub25tb3VzZXVwPWEub25Nb3VzZVVwLGRvY3VtZW50Lm9ubW91c2Vtb3ZlPWEub25Nb3VzZU1vdmUpO3JldHVybiBhfSx5ZHJhZ2Ryb3A9eWRyYWdkcm9wQmFzZSgpO19kdW1wKCJ5ZHJhZ2Ryb3AiKTsKdmFyIHRhYk5hdkJhc2U9ZnVuY3Rpb24oKXt2YXIgYT17fTsidW5kZWZpbmVkIiE9PXR5cGVvZiBjcmVhdGVET01FdmVudCYmKGEudGFiY2hhbmdlRXZlbnQ9Y3JlYXRlRE9NRXZlbnQoInRhYmNoYW5nZSIpLGEudGFiYmx1ckV2ZW50PWNyZWF0ZURPTUV2ZW50KCJ0YWJibHVyIiksYS50YWJmb2N1c0V2ZW50PWNyZWF0ZURPTUV2ZW50KCJ0YWJmb2N1cyIpLGEudGFic2hvd0V2ZW50PWNyZWF0ZURPTUV2ZW50KCJ0YWJzaG93IikpO2EuY3VycmVudFRhYk5keD0tMTthLmN1cnJlbnRDb250YWluZXJOZHg9LTE7YS5jb250YWluZXJMaXN0PVtdO2EudGFiTGlzdD1bXTthLnN0b3JhZ2U9bnVsbDthLmluaXRpYWxpemVkPS0xO2EubG9jaz17cmV0dXJuVGFiSWQ6bnVsbCxsb2NrZWQ6ITF9O2EuaXNDb250YWluZXI9ZnVuY3Rpb24oYSl7dmFyIGM9ITE7YSYmKGM9YS5oYXNDbGFzcygidG5Db250YWluZXIiKSk7cmV0dXJuIGN9O2EuaXNUYWI9ZnVuY3Rpb24oYSl7dmFyIGM9ITE7YSYmKGM9CmEuaGFzQ2xhc3MoInRuVGFiIikpO3JldHVybiBjfTthLmdldENvbnRhaW5lcj1mdW5jdGlvbihiKXtyZXR1cm4gYS5jb250YWluZXJMaXN0W2JdfTthLmdldEN1cnJlbnRDb250YWluZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXRDb250YWluZXIoYS5jdXJyZW50Q29udGFpbmVyTmR4KX07YS5nZXRDb250YWluZXJCeUlkPWZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1udWxsLGQ9MDtkPGEuY29udGFpbmVyTGlzdC5sZW5ndGg7ZCsrKWEuY29udGFpbmVyTGlzdFtkXS5lbGVtZW50LmlkPT1iJiYoYz1hLmNvbnRhaW5lckxpc3RbZF0pO3JldHVybiBjfTthLmdldFRhYkNvbnRhaW5lcj1mdW5jdGlvbihiKXt2YXIgYz1udWxsO2lmKGIpZm9yKHZhciBkPTA7ZDxhLmNvbnRhaW5lckxpc3QubGVuZ3RoJiZudWxsPT1jO2QrKylmb3IodmFyIGU9MDtlPGEuY29udGFpbmVyTGlzdFtkXS5jaGlsZHMubGVuZ3RoJiZudWxsPT1jO2UrKykic3RyaW5nIj09dHlwZW9mIGI/YS5jb250YWluZXJMaXN0W2RdLmNoaWxkc1tlXS5pZD09CmImJihjPWEuY29udGFpbmVyTGlzdFtkXSk6YS5jb250YWluZXJMaXN0W2RdLmNoaWxkc1tlXT09YiYmKGM9YS5jb250YWluZXJMaXN0W2RdKTtyZXR1cm4gY307YS5nZXRGaXJzdFRhYkluQ29udGFpbmVyPWZ1bmN0aW9uKGIpe3ZhciBjPW51bGwsZDsic3RyaW5nIj09dHlwZW9mIGImJihiPXkkKGIpKTthLmlzVGFiKGIpP2Q9YS5nZXRUYWJDb250YWluZXIoYik6KGI9YS5nZXRDb250YWluZXJOZHgoYiksMDw9YiYmKGQ9YS5jb250YWluZXJMaXN0W2JdKSk7ZCYmKGM9ZC5jaGlsZHNbMF0pO3JldHVybiBjfTthLmdldEZpcnN0Q2hpbGRUYWI9ZnVuY3Rpb24oYil7dmFyIGM9bnVsbDsic3RyaW5nIj09dHlwZW9mIGImJihiPXkkKGIpKTtpZihhLmlzVGFiKGIpKXt2YXIgZD1iLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInRuQ29udGFpbmVyIik7ZC5oYXNPd25Qcm9wZXJ0eSgiMCIpPyhiPWEuZ2V0Q29udGFpbmVyTmR4KGRbMF0pLDA8PWImJihjPWEuY29udGFpbmVyTGlzdFtiXS5jaGlsZHNbMF0pKToKYz1ifXJldHVybiBjfTthLmdldENvbnRhaW5lckZyb21QYXJhbT1mdW5jdGlvbihiLGMpe3ZvaWQgMD09Yj9iPXZvaWQgMD09Yz9hLmdldEN1cnJlbnRDb250YWluZXIoKTphLmdldFRhYkNvbnRhaW5lcihjKToic3RyaW5nIj09dHlwZW9mIGI/Yj1hLmdldENvbnRhaW5lckJ5SWQoYik6aXNOdW1iZXIoYik/Yj1hLmdldENvbnRhaW5lcihiKToib2JqZWN0IiE9dHlwZW9mIGImJihfZHVtcCgiZ2V0Q29udGFpbmVyRnJvbVBhcmFtKCkgcGFyYW1ldGVyIGlzIG5vdCBudWxsLCB2YWxpZCBzdHJpbmcsIG9iamVjdCBub3IgYSBudW1iZXIiKSxiPW51bGwpO3JldHVybiBifTthLmdldEN1cnJlbnRUYWJOZHg9ZnVuY3Rpb24oYil7dmFyIGM9LTE7aWYoYj1hLmdldENvbnRhaW5lckZyb21QYXJhbShiKSljPWIuY3VycmVudFRhYk5keDtyZXR1cm4gY307YS5zZXRDdXJyZW50Q29udGFpbmVyPWZ1bmN0aW9uKGIpezA+YS5pbml0aWFsaXplZCYmYS5pbml0KCk7YS5jdXJyZW50Q29udGFpbmVyTmR4PQpiJWEuY29udGFpbmVyTGlzdC5sZW5ndGh9O2EuZ2V0Q29udGFpbmVyTmR4PWZ1bmN0aW9uKGIpe2Zvcih2YXIgYz0tMSxkPTA7ZDxhLmNvbnRhaW5lckxpc3QubGVuZ3RoO2QrKylhLmNvbnRhaW5lckxpc3RbZF0uZWxlbWVudD09YiYmKGM9ZCk7cmV0dXJuIGN9O2EuYWRkQ29udGFpbmVyPWZ1bmN0aW9uKGIpezA+YS5pbml0aWFsaXplZCYmYS5pbml0KCk7aWYoYil7dmFyIGM9YS5nZXRDb250YWluZXJOZHgoYik7MD5jPyhjPWEuY29udGFpbmVyTGlzdC5sZW5ndGgsYS5jb250YWluZXJMaXN0W2NdPXtjaGlsZHM6W10sZWxlbWVudDpiLGN1cnJlbnRUYWJOZHg6LTF9KTphLmNvbnRhaW5lckxpc3RbY10uY2hpbGRzPVtdO2I9Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ0blRhYiIpO2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJiJvYmplY3QiPT10eXBlb2YgYltkXSYmKGEuY29udGFpbmVyTGlzdFtjXS5jaGlsZHNbYS5jb250YWluZXJMaXN0W2NdLmNoaWxkcy5sZW5ndGhdPQpiW2RdLGEuaGlkZVRhYihiW2RdKSk7YS5jdXJyZW50Q29udGFpbmVyTmR4PWN9fTthLmFkZFRhYj1mdW5jdGlvbihiKXswPmEuaW5pdGlhbGl6ZWQmJmEuaW5pdCgpO2lmKGIpe3ZhciBjPWEuZ2V0Q3VycmVudENvbnRhaW5lcigpLmNoaWxkczswPmMuaW5kZXhPZihiKSYmKGNbYy5sZW5ndGhdPWIpfX07YS5pbml0PWZ1bmN0aW9uKGIpe2lmKDA+YS5pbml0aWFsaXplZCl7X2R1bXAoIkluaXRpYWxpemluZyB0YWJzIik7YS5pbml0aWFsaXplZD0wO2I9eSQoInRuQ29udGFpbmVyIik7dmFyIGM9bnVsbCxkPW51bGwsYz0wO2lmKGIpZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylkPWJbY10sYS5hZGRDb250YWluZXIoZCk7ZWxzZSBfZHVtcCgiRVJST1I6IE5vIGNvbnRhaW5lcnMgZGVmaW5lZC4gVXNlICd0bkNvbnRhaW5lcicgY2xhc3Mgb24gYSBESVYiKTtpZihiPXkkKCJ0blRhYiIpKWZvcihjPTA7YzxiLmxlbmd0aDtjKyspYS5oaWRlVGFiKGJbY10pO2Vsc2UgX2R1bXAoIkVSUk9SOiBObyB0YWJzIGRlZmluZWQuIFVzZSAndG5UYWInIGNsYXNzIG9uIGEgRElWIik7CjA8YS5jb250YWluZXJMaXN0Lmxlbmd0aCYmKGM9YS5jb250YWluZXJMaXN0WzBdLmNoaWxkc1swXSxhLmRpc3BsYXlUYWIoYS5nZXRGaXJzdENoaWxkVGFiKGMpKSk7YS5jdXJyZW50Q29udGFpbmVyTmR4PTA7YS5pbml0aWFsaXplZD0xfXljb21tJiZ5Y29tbS5zZXRXYWl0SWNvbkNvbnRyb2woYS53YWl0SWNvbkNvbnRyb2wpO3JldHVybiBhfTthLmN1cnJlbnRUYWJJZD1mdW5jdGlvbigpe3JldHVybiBhLl9jdXJyZW50VGFifHwiIn07YS5jdXJyZW50VGFiPWZ1bmN0aW9uKCl7cmV0dXJuIHkkKGEuY3VycmVudFRhYklkKCkpfTthLmNyZWF0ZVRhYj1mdW5jdGlvbihiLGMpe3ZhciBkPW51bGw7dm9pZCAwPT15JChjKSYmKGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZC5jbGFzc05hbWU9InRuVGFiIixkLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQuaWQ9YyxiLmFwcGVuZENoaWxkKGQpLGEuYWRkVGFiKGQpLGEuaGlkZVRhYihkKSk7cmV0dXJuIGR9O2EuZGVsVGFiPWZ1bmN0aW9uKGEpe307CmEuZGlzcGxheVRhYj1mdW5jdGlvbihiLGMpe2lmKCFhLmNoYW5naW5nVmlldyl7YS5jaGFuZ2luZ1ZpZXc9ITA7dHJ5e2lmKCFhLmxvY2tlZCgpJiZiKXswPmEuaW5pdGlhbGl6ZWQmJmEuaW5pdCgpO19kdW1weSg2NCwxLCJkaXNwbGF5VGFiICIrYi5pZCk7dmFyIGQ9ITAsZT0wO2lmKGQ9Yi5kaXNwYXRjaEV2ZW50KGEudGFiY2hhbmdlRXZlbnQpfHxkKXt2YXIgZj1hLmdldENvbnRhaW5lckZyb21QYXJhbShjKTtpZihmKXtfZHVtcHkoNjQsMSwiY2FuY2hhbmdlIik7Zm9yKHZhciBkPS0xLGc9ITEsZT0wO2U8Zi5jaGlsZHMubGVuZ3RoO2UrKylmLmNoaWxkc1tlXSE9Yj9nfD0hYS5oaWRlVGFiKGYuY2hpbGRzW2VdLGIsZik6ZD1lO19kdW1weSg2NCwxLCJyZWFkeXRvY2hhbmdlICIrIWcpO2lmKGcpX2R1bXB5KDY0LDEsImZyZWV6ZSIpO2Vsc2V7YS5zZXRDdXJyZW50Q29udGFpbmVyKGEuZ2V0Q29udGFpbmVyTmR4KGYpKTtmLmN1cnJlbnRUYWJOZHg9ZDthLl9jdXJyZW50VGFiPQpiLmlkO2IuZGlzcGF0Y2hFdmVudChhLnRhYmZvY3VzRXZlbnQpO2Iuc3R5bGUuZGlzcGxheT0iIjtmb3IoZj1iO2YmJmYhPWRvY3VtZW50LmJvZHk7KWYuc3R5bGUuZGlzcGxheT0iIixmPWYucGFyZW50Tm9kZTtmb3IodmFyIGg9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLGU9MDtlPGgubGVuZ3RoOyl7aWYoImNoZWNrYm94Ij09aFtlXS50eXBlfHwicmFkaW8iPT1oW2VdLnR5cGV8fCJwYXNzd29yZCI9PWhbZV0udHlwZXx8ImhpZGRlbiI9PWhbZV0udHlwZXx8InRleHQiPT1oW2VdLnR5cGV8fCJzZWxlY3Qtb25lIj09aFtlXS50eXBlfHwidGV4dGFyZWEiPT1oW2VdLnR5cGUpe2hbZV0uZm9jdXMoKTticmVha31lKyt9c2V0VGltZW91dChmdW5jdGlvbigpe3dpbmRvdy5kaXNwYXRjaEV2ZW50KGEudGFic2hvd0V2ZW50KX0sMTI1KX19fV9kdW1weSg2NCwxLCJyZXR1cm4iKX19ZmluYWxseXthLmNoYW5naW5nVmlldz0hMX19fTthLnNob3dXYWl0SWNvbj1mdW5jdGlvbigpe3kkKCJ3YWl0SWNvbiIpJiYKKGlzUHJvcGVydHlTdXBwb3J0ZWQoIm9wYWNpdHkiKSYmKHkkKCJ3YWl0SWNvbiIpLnN0eWxlLm9wYWNpdHk9Ii45OSIpLHkkKCJ3YWl0SWNvbiIpLnN0eWxlLmRpc3BsYXk9IiIpfTthLmhpZGVXYWl0SWNvbj1mdW5jdGlvbigpe3kkKCJ3YWl0SWNvbiIpJiYoaXNQcm9wZXJ0eVN1cHBvcnRlZCgib3BhY2l0eSIpJiYoeSQoIndhaXRJY29uIikuc3R5bGUub3BhY2l0eT0wKSx5JCgid2FpdEljb24iKS5zdHlsZS5kaXNwbGF5PSJub25lIil9O2Eud2FpdEljb25Db250cm9sPWZ1bmN0aW9uKGIpe3ZvaWQgMCE9YiYmKGI/YS5zaG93V2FpdEljb24oKTphLmhpZGVXYWl0SWNvbigpKX07YS5pc0lubmVyVGFiPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGU9YTtlJiZlLnBhcmVudCE9ZTspYz09ZSYmKGQ9ITApLGU9ZS5wYXJlbnROb2RlO3JldHVybiBkfTthLmhpZGVUYWI9ZnVuY3Rpb24oYixjLGQpe2lmKCFhLmxvY2tlZCgpKXtfZHVtcHkoNjQsMSwiaGlkZVRhYiAiKwpiLmlkKTt2YXIgZT0hMDtpZihkPWEuZ2V0Q29udGFpbmVyRnJvbVBhcmFtKGQpKWlmKGQuY2hpbGRzLmluZGV4T2YoYik9PWQuY3VycmVudFRhYk5keCl7aWYoZT1iLmRpc3BhdGNoRXZlbnQoYS50YWJibHVyRXZlbnQpfHxlKWQuY3VycmVudFRhYk5keD0tMX1lbHNlIGU9ITA7ZSYmIm9iamVjdCI9PXR5cGVvZiBiJiYhYS5pc0lubmVyVGFiKGMsYikmJihiLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTtyZXR1cm4gZX19O2Euc2hvd05leHQ9ZnVuY3Rpb24oYil7aWYoYj1hLmdldENvbnRhaW5lckZyb21QYXJhbShiKSl7dmFyIGM9Yi5jdXJyZW50VGFiTmR4O2M8Yi5jaGlsZHMubGVuZ3RoLTE/YS5kaXNwbGF5VGFiKGIuY2hpbGRzW2MrMV0sYik6YS5kaXNwbGF5VGFiKGIuY2hpbGRzWzBdLGIpfX07YS5zaG93UHJpb3I9ZnVuY3Rpb24oYil7aWYoYj1hLmdldENvbnRhaW5lckZyb21QYXJhbShiKSl7dmFyIGM9Yi5jdXJyZW50VGFiTmR4OzA8Yz9hLmRpc3BsYXlUYWIoYi5jaGlsZHNbYy0KMV0sYik6YS5kaXNwbGF5VGFiKGIuY2hpbGRzW2IuY2hpbGRzLmxlbmd0aC0xXSxiKX19O2EuZ2V0Q3VycmVudFRhYklkPWZ1bmN0aW9uKGIpe3ZhciBjPW51bGw7aWYoYj1hLmdldENvbnRhaW5lckZyb21QYXJhbShiKSl7dmFyIGQ9Yi5jdXJyZW50VGFiTmR4Oy0xPGQmJihjPWIuY2hpbGRzW2RdLmlkKX1yZXR1cm4gY307YS5zaG93VGFiPWZ1bmN0aW9uKGIsYyxkKXtpZighYS5sb2NrZWQoKSl7ZD1hLmdldENvbnRhaW5lckZyb21QYXJhbShkLGIpO3ZvaWQgMD09YiYmKGI9ZC5jaGlsZHNbMF0uaWQpO3ZvaWQgMD09YyYmKGM9ITEpO3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpLGY9IiI7ZT8oYyYmKGY9YS5nZXRDdXJyZW50VGFiSWQoZCkpLGEuZGlzcGxheVRhYihlLGQpLGMmJmEubG9ja1RhYihiLGYpKTphbGVydChiKyIgbm90IGZvdW5kIil9fTthLmxvY2tlZD1mdW5jdGlvbigpe3JldHVybiBhLmxvY2subG9ja2VkfTthLnJlbGVhc2VMb2NrZWRUYWJzPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPQowO2I8YS5nZXRDdXJyZW50Q29udGFpbmVyKCkuY2hpbGRzLmxlbmd0aDtiKyspYS5nZXRDdXJyZW50Q29udGFpbmVyKCkuY2hpbGRzW2JdLmxvY2tlZCYmKGEuZ2V0Q3VycmVudENvbnRhaW5lcigpLmNoaWxkc1tiXS5sb2NrZWQ9ITEpO2EubG9jay5sb2NrZWQ9ITE7YS5sb2NrLnJldHVyblRhYklkPW51bGx9O2EubG9ja1RhYj1mdW5jdGlvbihiLGMpe2EubG9ja2VkKCkmJmEucmVsZWFzZUxvY2tlZFRhYnMoKTt5JChiKSYmKGEubG9jay5sb2NrZWQ9ITAseSQoYikubG9ja2VkPSEwLGEubG9jay5yZXR1cm5UYWJJZD15JChjKT9jOm51bGwpfTthLnVubG9ja1RhYj1mdW5jdGlvbihiKXthLmxvY2tlZCgpJiZ5JChiKSYmeSQoYikubG9ja2VkJiYoYj1hLmxvY2sucmV0dXJuVGFiSWQsYS5yZWxlYXNlTG9ja2VkVGFicygpLG51bGwhPWImJmEuc2hvd1RhYihiKSl9O3JldHVybiBhfSxtVGFiTmF2PXRhYk5hdkJhc2UoKTtfZHVtcCgieXRhYm5hdiIpOwpmdW5jdGlvbiBwcm9jZXNzRXJyb3IoYSl7dmFyIGI9YS5lcnJObyxjPWEuZXJyTXNnO2E9YS5lcnJEZXRhaWw7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgZD1hcnJheTJ0ZXh0KGFbInN5cy5zdGFjayJdLCExKTt2b2lkIDAhPT1kJiYoZD0iXG49PVtzdGFja109PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIitkKTt2YXIgZT1hWyJzeXMuc3FsVHJhY2UiXTt2b2lkIDAhPT1lJiYoZT0iXG49PVtzcWxdPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIrZSk7YT1hWyJzeXMuc3FsRXJyb3IiXStlK2R9cmV0dXJuIkVyciAjIitiKyJcbi0tLS0tLS0tICIrYysiXG4tLS0tLS0tLSAiK2F9CnZhciB5UmVzdFRpbWVDb250cm9sPWZ1bmN0aW9uKGEpe3ZhciBiPXtzZXRSZXN0VGltZTpmdW5jdGlvbihhKXtiLl9yZXN0VGltZT1NYXRoLm1pbihNYXRoLm1heCgxMjUsYSksMTQ0RTUpfSxhZGp1c3RSZXN0VGltZTpmdW5jdGlvbihhKXthPShuZXcgRGF0ZSkuZ2V0VGltZSgpLWE7Yi5zZXRSZXN0VGltZShiLl9yZXN0VGltZS0oYi5fcmVzdFRpbWUtYSkvMil9LGluaXQ6ZnVuY3Rpb24oKXtiLnNldFJlc3RUaW1lKGEpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJyZXN0VGltZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBiLl9yZXN0VGltZX0sc2V0OmIuc2V0UmVzdFRpbWV9KTtyZXR1cm4gYn19O3JldHVybiBiLmluaXQoKX0seWNvbW1CYXNlPWZ1bmN0aW9uKCl7dmFyIGE9e3VybENvZGlmaWNhdGlvbjp7IiUyMCI6IiAiLCIlMjEiOiIhIiwiJTJBIjoiKiIsIiUyNyI6IiciLCIlMjgiOiIoIiwiJTI5IjoiKSIsIiUzQiI6IjsiLCIlM0EiOiI6IiwiJTQwIjoiQCIsIiUyNiI6IiYiLAoiJTNEIjoiPSIsIiUyQiI6IisiLCIlMjQiOiIkIiwiJTJDIjoiLCIsIiUyRiI6Ii8iLCIlM0YiOiI/IiwiJTIzIjoiIyIsIiU1QiI6IlsiLCIlNUQiOiJdIiwiJTIyIjonIicsIiUyNyI6IicifSxfQXN5bmNNb2RlOiEwLF9kdW1teVdhaXRJY29uQ29udHJvbDpmdW5jdGlvbigpe30sc2V0QXN5bmNNb2RlOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPSEwKTtfQXN5bmNNb2RlPWF9LHhxX3VybEVuY29kZTpmdW5jdGlvbihiLGMpeyJ1bmRlZmluZWQiPT10eXBlb2YgYyYmKGM9ITApO2lmKCJzdHJpbmciPT10eXBlb2YgYiYmIiI8Yil7Yj1iLnJlcGxhY2UoLyUvZywiJTI1Iik7Yj1iLnJlcGxhY2UoLywvZywiXFwsIik7Zm9yKHZhciBkIGluIGEudXJsQ29kaWZpY2F0aW9uKWlmKGEudXJsQ29kaWZpY2F0aW9uLmhhc093blByb3BlcnR5KGQpKXt2YXIgZT1uZXcgUmVnRXhwKGVzY2FwZVJlZ0V4cChhLnVybENvZGlmaWNhdGlvbltkXSksImciKTtiPWIucmVwbGFjZShlLGQpfSInIiE9CmIuc3Vic3RyaW5nKDAsMSkmJiciJyE9Yi5zdWJzdHJpbmcoMCwxKSYmKGlzTnVtYmVyKGIpfHxjJiYoYj0nIicrYisnIicpKX1yZXR1cm4gYn0sdXJsSnNvbkFzUGFyYW1zOmZ1bmN0aW9uKGIpe3ZhciBjPSIiLGQ9IiIsZT0iIixmO2ZvcihmIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShmKSYmKCIiPGMmJihjKz0iLCIsZCs9IiwiKSxjKz1mLGU9YltmXSwiYm9vbGVhbiI9PXR5cGVvZiBlJiYoZT1lPyJZRVMiOiJOTyIpLGU9bWFza0hUTUwoYS54cV91cmxFbmNvZGUoZSwhMSkpLGQrPWUpO3JldHVyblsiKCIrYysiKSIsIigiK2QrIikiXX0sYnVpbGRDb21tb25VUkw6ZnVuY3Rpb24oYixjLGQsZSl7InVuZGVmaW5lZCI9PXR5cGVvZiBkJiYoZD17fSk7dmFyIGY9YS51cmxKc29uQXNQYXJhbXMoZCk7ZD1mWzBdO2Y9ZlsxXTt2b2lkIDA9PT1lJiYoZT0iIik7Yj0icz17MH0mYT17MX0mdT17Mn0mZmllbGROYW1lPXszfSZmaWVsZFZhbHVlPXs0fSIuZm9ybWF0KGIsYyxlfHwiIixkLGYpOwpjPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3JldHVybiBiPWIrKCImdHM9IitjKSsoIiZfcmFwXyIrYysiPTEiKX0sc2V0V2FpdEljb25Db250cm9sOmZ1bmN0aW9uKGIpe2Eud2FpdEljb25Db250cm9sPWJ8fGEuX2R1bW15V2FpdEljb25Db250cm9sfSxwaW5nZXI6e2NhblBpbmc6ITEscGluZ2VyV2F0Y2hkb2c6bnVsbCxwaW5nQ291bnQ6MCxwaW5nVGltZW91dDoxNUUzLHBpbmdJbnRlcmxlYXZlOjE1MDAsb25TdWNjZXNzOm51bGwsb25FcnJvcjpudWxsLHBvbmc6ZnVuY3Rpb24oYixjLGQpe2EucGluZ2VyLnBpbmdlcldhdGNoZG9nJiZjbGVhclRpbWVvdXQoYS5waW5nZXIucGluZ2VyV2F0Y2hkb2cpO19kdW1weSg0LDEsInBpbmcgYW5zd2VyIGxvYzp7MH0gcmVtOnsxfSIuZm9ybWF0KGEucGluZ2VyLnBpbmdDb3VudCxkLnBpbmdDb3VudHx8MCkpO2EucGluZ2VyLnBpbmdDb3VudDw9ZC5waW5nQ291bnQmJihhLnBpbmdlci5waW5nQ291bnQ9MCk7X2R1bXB5KDQsMSwicGluZyBhbnN3ZXIgcmVjZWl2ZWQgezB9L3sxfSIuZm9ybWF0KGEucGluZ2VyLnBpbmdDb3VudCwKZC5waW5nQ291bnQpKTtpZihudWxsIT09YS5waW5nZXIub25TdWNjZXNzKWEucGluZ2VyLm9uU3VjY2VzcygpO2EucGluZ2VyLmNhblBpbmcmJihhLnBpbmdlci5waW5nZXJXYXRjaGRvZz1zZXRUaW1lb3V0KGEucGluZ2VyLnBpbmcsYS5waW5nZXIucGluZ0ludGVybGVhdmUpKX0sbm90QW5zd2VyOmZ1bmN0aW9uKCl7YS5waW5nZXIucGluZ2VyV2F0Y2hkb2cmJmNsZWFyVGltZW91dChhLnBpbmdlci5waW5nZXJXYXRjaGRvZyk7X2R1bXB5KDQsMSwicGluZyB0aW1lb3V0Iik7aWYobnVsbCE9PWEucGluZ2VyLm9uRXJyb3IpYS5waW5nZXIub25FcnJvcigpO2Vsc2UgX2R1bXB5KDQsMSwicGluZyB3aXRob3V0ICdvbkVycm9yJyBldmVudCIpO2EucGluZ2VyLmNhblBpbmcmJihfZHVtcHkoNCwxLCJwaW5nIFNjaGVkdWxpbmcgYSBuZXcgY2FsbCBmb3IgezB9bXMiLmZvcm1hdChhLnBpbmdlci5waW5nSW50ZXJsZWF2ZS8yKSksYS5waW5nZXIucGluZ2VyV2F0Y2hkb2c9c2V0VGltZW91dChhLnBpbmdlci5waW5nLAphLnBpbmdlci5waW5nSW50ZXJsZWF2ZS8yKSl9LHBpbmc6ZnVuY3Rpb24oYixjLGQpe2EucGluZ2VyLnBpbmdlcldhdGNoZG9nJiZjbGVhclRpbWVvdXQoYS5waW5nZXIucGluZ2VyV2F0Y2hkb2cpO19kdW1weSg0LDEsInBpbmcgYmVpbmcgY2FsbGVkIik7YS5waW5nZXIuY2FuUGluZz1kfHwhMTthLnBpbmdlci5vblN1Y2Nlc3M9Ynx8YS5waW5nZXIub25TdWNjZXNzO2EucGluZ2VyLm9uRXJyb3I9Y3x8YS5waW5nZXIub25FcnJvcjthLnBpbmdlci5waW5nQ291bnQrKzt5Y29tbS5jcmF2ZSgieWVhcGYiLCJwaW5nIix7cGluZ0NvdW50OmEucGluZ2VyLnBpbmdDb3VudH0sInljb21tLnBpbmdlci5wb25nIik7YS5waW5nZXIucGluZ2VyV2F0Y2hkb2c9c2V0VGltZW91dChhLnBpbmdlci5ub3RBbnN3ZXIsYS5waW5nZXIucGluZ1RpbWVvdXQpfSxzdG9wUGluZzpmdW5jdGlvbigpe2EucGluZ2VyLnBpbmdlcldhdGNoZG9nJiZjbGVhclRpbWVvdXQoYS5waW5nZXIucGluZ2VyV2F0Y2hkb2cpOwpfZHVtcHkoNCwxLCJwaW5nIHN0b3BwaW5nIik7YS5waW5nZXIuY2FuUGluZz0hMX19LGluaXQ6ZnVuY3Rpb24oKXthLl9jb21tX3RpbWVvdXQ9MTJFNDthLl93aGF0Y2hkb2dfaW50ZXJsZWF2ZT0yNTA7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsInRpbWVvdXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5fY29tbV90aW1lb3V0fSxzZXQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChifHwwKTthLl9jb21tX3RpbWVvdXQ9TWF0aC5taW4oMThFNixNYXRoLm1heCgxMjUsYikpO19kdW1weSg0LDAsInBpbmcgQWRqdXN0aW5nIGNhbGwgdGltZW91dCB0byB7MH1tcyIuZm9ybWF0KGEuX2NvbW1fdGltZW91dCkpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJ3ZF9pbnRlcnZhbCIse2dldDpmdW5jdGlvbigpe3JldHVybiBhLl93aGF0Y2hkb2dfaW50ZXJsZWF2ZX0sc2V0OmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYnx8MCk7YS5fd2hhdGNoZG9nX2ludGVybGVhdmU9TWF0aC5taW4oMyoKYS50aW1lb3V0LzQsTWF0aC5tYXgoMTAwLGIpKTtfZHVtcHkoNCwwLCJwaW5nIEFkanVzdGluZyB3YXRjaGRvZyBpbnRlcmxlYXZlIHRvIHswfW1zIi5mb3JtYXQoYS5fd2hhdGNoZG9nX2ludGVybGVhdmUpKX19KTthLnNldFdhaXRJY29uQ29udHJvbCgpO3JldHVybiBhfX07cmV0dXJuIGEuaW5pdCgpfSx5Y29tbT15Y29tbUJhc2UoKTtfZHVtcCgieWNvbW0iKTsKaWYoInVuZGVmaW5lZCI9PXR5cGVvZiB4QWpheCl7Y29uc29sZS5sb2coIlVzaW5nIG93biB4QWpheCgpIGltcGxlbWVudGF0aW9uIik7dmFyIHhBamF4PWZ1bmN0aW9uKCl7dmFyIGE9e307YS54bWxodHRwPSJ1bmRlZmluZWQiIT09dHlwZW9mIFhNTEh0dHBSZXF1ZXN0P25ldyBYTUxIdHRwUmVxdWVzdDpuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKTthLlJlcXVlc3Q9ZnVuY3Rpb24oYixjKXthLnhtbGh0dHAub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoMDxhLnhtbGh0dHAucmVhZHlTdGF0ZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBjLm9uUHJvZ3Jlc3MpYy5vblByb2dyZXNzKGEueG1saHR0cCk7aWYoND09YS54bWxodHRwLnJlYWR5U3RhdGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgYy5vbkNvbXBsZXRlKWMub25Db21wbGV0ZShhLnhtbGh0dHApfTthLnhtbGh0dHAub250aW1lb3V0PWZ1bmN0aW9uKCl7fTt5bG9hZGVyLmlzV29ya2VyP2MuYXN5bmNocm9ub3VzPQohMTpjLm11bHRpcGFydCYmKGMuYXN5bmNocm9ub3VzPSEwKTtpZigiUE9TVCI9PShjLm1ldGhvZHx8IlBPU1QiKS50b1VwcGVyQ2FzZSgpKWEueG1saHR0cC5vcGVuKGMubWV0aG9kfHwiUE9TVCIsYixjLmFzeW5jaHJvbm91cyksYS54bWxodHRwLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiksYS54bWxodHRwLnNlbmQoYy5wYXJhbWV0ZXJzKTtlbHNle3ZhciBkO2Q9LTEhPT1iLmluZGV4T2YoIj8iKT8iJiI6Ij8iO2EueG1saHR0cC5vcGVuKGMubWV0aG9kLGIrZCtjLnBhcmFtZXRlcnMsYy5hc3luY2hyb25vdXMpO2EueG1saHR0cC5zZW5kKCl9fTtyZXR1cm4gYX19eWNvbW0uc2NyaXB0TmFtZT15bG9hZGVyLmlzV29ya2VyPyIuLi9xdWVyeS5waHAiOiJxdWVyeS5waHAiO3ljb21tLmRlZmF1bHRNZXRob2Q9InBvc3QiO3ljb21tLmNhblJlY2VpdmVNZXNzYWdlcz0hMDsKeWNvbW0uZXhwbG9kZURhdGE9ZnVuY3Rpb24oYSl7dmFyIGIsYzthPXhtbDJhcnJheShhKS5yb290fHx7fTt2YXIgZD1hLmRhdGFDb250ZXh0fHx7fSxlPWEuZXJyb3J8fGQuZXJyb3J8fGQubGFzdEVycm9yLGY9bnVsbCxnPWQudXNlck1zZyxoPWQuc3lzTXNnO2lmKHhTdGFjaz1kLnN0YWNrKXt2YXIgaz1kLnMsbD1kLmEsdj1kLnY7Y29uc29sZS5sb2coIi8tLS0tLS0tIHswfS57MX0udnsyfSAtLS0iLmZvcm1hdChrLGwsdikpO2ZvcihiIGluIHhTdGFjayljb25zb2xlLmxvZygifCBTVEFDSzogJWMiK3hTdGFja1tiXSwiY29sb3I6ICNGRjRENDgiKTtjb25zb2xlLmxvZygiLS0tLS0tLSB7MH0uezF9LnZ7Mn0gLS0tIi5mb3JtYXQoayxsLHYpKX1pZihoJiZoLm1zZyYmImxvZ29mZiI9PWgubXNnKXt5Y29tbS5jYW5SZWNlaXZlTWVzc2FnZXM9ITE7Zm9yKGs9d2luZG93O2sub3BlbmVyOylsPWssaz1rLm9wZW5lcixsLmNsb3NlKCk7Zm9yKDtrLnBhcmVudCE9azspaz1rLnBhcmVudDsKaC5iYW5uZXImJihfZHVtcHkoNCwxLGguYmFubmVyKSxhbGVydChoLmJhbm5lcikpO2suZG9jdW1lbnQubG9jYXRpb249ImJvZHkucGhwP3M9eWVhcGYmYT1sb2dvZmYifWlmKHljb21tLmNhblJlY2VpdmVNZXNzYWdlcyl7aWYoZCl7aWYoZC5yZXF1aXJlZEZpZWxkcylmb3IoaD1kLnJlcXVpcmVkRmllbGRzLnNwbGl0KCIsIiksYj0wO2I8aC5sZW5ndGg7YisrKWZpZWxkTmFtZT1oW2JdLHkkKGZpZWxkTmFtZSkmJnkkKGZpZWxkTmFtZSkuYWRkQ2xhc3MoImZpZWxkV2FybmluZyIpO2lmKGQuZm9ybUVycm9yKXtoPSIiO2ZvcihiIGluIGQuZm9ybUVycm9yKWQuZm9ybUVycm9yLmhhc093blByb3BlcnR5KGIpJiYoIiI8aCYmKGgrPSJcbiIpLGgrPWQuZm9ybUVycm9yW2JdKTthbGVydChoKX19aWYoYSl7dm9pZCAwIT1kLmZvcm1JRCYmIiI9PWZvcm1JRCYmKGZvcm1JRD1kLmZvcm1JRCk7ZC5maXJzdFJvdz1wYXJzZUludChkLmZpcnN0Um93KTtkLnJvd0NvdW50PXBhcnNlSW50KGQucm93Q291bnQpOwpkLnJlcXVlc3RlZFJvd3M9cGFyc2VJbnQoZC5yZXF1ZXN0ZWRSb3dzKTtoPWQucm93Q291bnQ7Yj1hLmRhdGE/YS5kYXRhLnJvdzphLnJvdzsxPT1oJiYoYj1BcnJheShiKSk7aWYoYil7Yz1bXTtmb3IodmFyIHcgaW4gYilpZihiLmhhc093blByb3BlcnR5KHcpKXtjW3ddPXt9O2Zvcih2YXIgeCBpbiBiW3ddKWJbd10uaGFzT3duUHJvcGVydHkoeCkmJihjW3ddW3hdPXVubWFza0hUTUwoYlt3XVt4XSkpfX12b2lkIDAhPT1hLmRhdGEmJihmPWEuZGF0YS5nZW9tZXRyeSl9fXJldHVybntkYXRhOmMsZ2VvbWV0cnk6ZixkYXRhQ29udGV4dDpkLGVycm9yOmUsdXNlck1zZzpnfX07Cnljb21tLnJlZ2lzdGVyQ2FsbD1mdW5jdGlvbihhLGIsYyl7eWRiZyYmMDwoeWRiZy5sb2dGbGFnJjgpJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBfeWNvbW1fc3RhdCYmKHdpbmRvdy5feWNvbW1fc3RhdD1bXSksInVuZGVmaW5lZCI9PXR5cGVvZiBfeWNvbW1fc3RhdFthXSYmKF95Y29tbV9zdGF0W2FdPVtdKSwidW5kZWZpbmVkIj09dHlwZW9mIF95Y29tbV9zdGF0W2FdW2JdJiYoX3ljb21tX3N0YXRbYV1bYl09W10pLCJ1bmRlZmluZWQiPT10eXBlb2YgX3ljb21tX3N0YXRbYV1bYl1bY10mJihfeWNvbW1fc3RhdFthXVtiXVtjXT17Y291bnQ6MH0pLF95Y29tbV9zdGF0W2FdW2JdW2NdLmNvdW50KyssX2R1bXB5KDQsMiwidmlhOiB7MH0gczogezF9IGE6IHsyfSBjb3VudDogezN9Ii5mb3JtYXQoYSxiLGMsX3ljb21tX3N0YXRbYV1bYl1bY10uY291bnQpKSl9Owp5Y29tbS50ZXh0MmRhdGE9ZnVuY3Rpb24oYSl7dmFyIGI9e307ImZ1bmN0aW9uIj09dHlwZW9mIERPTVBhcnNlciYmKGE9KG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJhcHBsaWNhdGlvbi94bWwiKSxiPXljb21tLmV4cGxvZGVEYXRhKGEpKTtyZXR1cm4gYn07eWNvbW0uZGF0YUxlbmd0aD1mdW5jdGlvbihhKXt2YXIgYj0wO2lmKGEpZm9yKHZhciBjIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShjKSYmYisrO3JldHVybiBifTsKeWNvbW0uaW52b2tlPWZ1bmN0aW9uKGEsYixjLGQsZSl7InVuZGVmaW5lZCI9PXR5cGVvZiBlJiYoZT0hMCk7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXt2YXIgZj1hO2E9Zi5zO2I9Zi5hO2M9Zi5saW1pdHM7ZD1mLmNhbGxiYWNrRnVuY3Rpb259Zj0idW5kZWZpbmVkIj09dHlwZW9mIHU/IiI6dTtlJiZ5Y29tbS53YWl0SWNvbkNvbnRyb2woITApO3ZhciBnPXljb21tLmJ1aWxkQ29tbW9uVVJMKGF8fCIiLGJ8fCIiLGN8fHt9LGYpO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihjLGYpeyJ1bmRlZmluZWQiIT10eXBlb2YgeEFqYXg/KHljb21tLnJlZ2lzdGVyQ2FsbCgiaW52b2tlIixhLGIpLHhBamF4KCkuUmVxdWVzdCh5Y29tbS5zY3JpcHROYW1lLHttZXRob2Q6eWNvbW0uZGVmYXVsdE1ldGhvZCxhc3luY2hyb25vdXM6IXlsb2FkZXIuaXNXb3JrZXIscGFyYW1ldGVyczpnLG9uVGltZW91dDpmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJYTUxIdHRwUmVxdWVzdCB0aW1lb3V0Iik7CmUmJnljb21tLndhaXRJY29uQ29udHJvbCghMSk7ZCg0MDQse30sW3t9XSxudWxsLG51bGwsbnVsbCk7Zih7c3RhdHVzOjQwNCxtZXNzYWdlOiJUaW1lb3V0In0pfSxvbkNvbXBsZXRlOmZ1bmN0aW9uKGEpe3ZhciBiPXtkYXRhOm51bGwsZ2VvbWV0cnk6bnVsbCxkYXRhQ29udGV4dDpudWxsLGVycm9yOm51bGwsdXNlck1zZzpudWxsfSxlPW51bGw7MjAwPT1hLnN0YXR1cz8oeWNvbW0ubXNnJiYiZnVuY3Rpb24iPT10eXBlb2YgeWNvbW0ubXNnLm5vdGlmeVNlcnZlck9ubGluZSYmeWNvbW0ubXNnLm5vdGlmeVNlcnZlck9ubGluZSgpLGEucmVzcG9uc2VYTUw/ZT1hLnJlc3BvbnNlWE1MOiJmdW5jdGlvbiI9PXR5cGVvZiBET01wYXJzZXImJihlPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsImFwcGxpY2F0aW9uL3htbCIpKSxudWxsIT09ZSYmKGI9eWNvbW0uZXhwbG9kZURhdGEoZSkpLGMoe3N0YXR1czoyMDAscmV0dXJuOmJ9KSk6KGNvbnNvbGUubG9nKGEuc3RhdHVzVGV4dCksCnljb21tLm1zZyYmImZ1bmN0aW9uIj09dHlwZW9mIHljb21tLm1zZy5ub3RpZnlTZXJ2ZXJPZmZsaW5lJiZ5Y29tbS5tc2cubm90aWZ5U2VydmVyT2ZmbGluZSgpLGYoe3N0YXR1czphLnN0YXR1c30pKTt5Y29tbS53YWl0SWNvbkNvbnRyb2woITEpO2lmKGIuZXJyb3IpaWYoInN0cmluZyI9PXR5cGVvZiBiLmVycm9yKWNvbnNvbGUuZXJyb3IoYi5lcnJvcik7ZWxzZSBmb3IodmFyIGcgaW4gYi5lcnJvciliLmVycm9yLmhhc093blByb3BlcnR5KGcpJiZjb25zb2xlLmVycm9yKGIuZXJyb3JbZ10pOyJmdW5jdGlvbiI9PXR5cGVvZiBkJiYoeWxvYWRlci5pc1dvcmtlcj9kKGEucmVzcG9uc2VUZXh0KTpkKGEuc3RhdHVzLGIuZXJyb3IsYi5kYXRhLGIudXNlck1zZyxiLmRhdGFDb250ZXh0LGIuZ2VvbWV0cnkpKX19KSk6KGNvbnNvbGUubG9nKCJOb3QgcmVhZHkgdG8gY2FsbCAiK2cpLGNvbnNvbGUubG9nKCJwcm90b3R5cGUgbGlicmFyeSBub3QgbG9hZGVkIiksZih7c3RhdHVzOi0xLAptZXNzYWdlOiJ4QWpheCBub3QgZm91bmQifSkpfSl9O19kdW1wKCJ5Y29tbS1hamF4Iik7eWNvbW0uc2V0RGF0YUxvY2F0aW9uPWZ1bmN0aW9uKGEsYil7eWNvbW0uX2RhdGFMb2NhdGlvbl89YTt5Y29tbS5fZGV2aWNlSWRfPWJ8fGd1aWQoKX07eWNvbW0uZ2V0RGF0YUxvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHljb21tLl9kYXRhTG9jYXRpb25ffTt5Y29tbS5fc2NyaXB0U2VxdWVuY2U9MDt5Y29tbS5fbWF4U2NyaXB0U2VxdWVuY2VSZWNlaXZlZD0wO3ljb21tLl9DQlNlcT0xRTM7eWNvbW0uX0NCQ29udHJvbD17fTt5Y29tbS5fbG9hZD0wO3ljb21tLl9xdWV1ZT0wO3ljb21tLl9tYXhEaXJlY3RDYWxsPTEwOwp5Y29tbS5fZGF0YUxvY2F0aW9uXz1mdW5jdGlvbigpe3ZhciBhPSJvYmplY3QiPT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmxvY2F0aW9uJiZkb2N1bWVudC5sb2NhdGlvbi5ocmVmP2RvY3VtZW50LmxvY2F0aW9uLmhyZWY6IiIsYj1hLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuIGEuc3Vic3RyKDAsYisxKSsicmVzdC5waHAifSgpO3ljb21tLmdldExvYWQ9ZnVuY3Rpb24oKXtyZXR1cm4geWNvbW0uX2xvYWR9Owp5Y29tbS5fcmVtb3ZlSlNPTlA9ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5oZWFkLGQ9InJlc3RfIithLGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk7dm9pZCAwIT09YyYmdm9pZCAwIT09ZT8oY2xlYXJUaW1lb3V0KGUuX3doYXRjaGRvZ18pLCJmdW5jdGlvbiI9PT10eXBlb2YgZS5hYm9ydCYmZS5hYm9ydCgpLGMucmVtb3ZlQ2hpbGQoZSksX2R1bXB5KDQsMSwiQ2xlYW4gIitkKyIgYWZ0ZXIgY2FsbCB0byAiK2IrIigpIikpOl9kdW1weSg0LDEsIlNjcmlwdCBub3QgZm91bmQ6ICIrZCsiIGFkcmVzc2VkIHRvICIrYisiKCkiKTtfZHVtcHkoNCwxLHljb21tLmdldFN0YXR1cygpKX07Cnljb21tLmJyaW5nPWZ1bmN0aW9uKGEsYil7dmFyIGM7Yz1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdO2ImJnljb21tLndhaXRJY29uQ29udHJvbCghMCk7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7X2R1bXB5KDQsMSxhKTt2YXIgZT1udWxsLGY9bnVsbCxnPWEuc3Vic3RyKGEuaW5kZXhPZigiPyIpKzEpLnNwbGl0KCImIiksaDtmb3IoaCBpbiBnKWlmKGcuaGFzT3duUHJvcGVydHkoaCkpe3ZhciBrPWdbaF0uc3BsaXQoIj0iKTsic2NyaXB0U2VxdWVuY2UiPT1rWzBdJiYoZT1rWzFdKTsiY2FsbGJhY2siPT1rWzBdJiYoZj1rWzFdKX15Y29tbS5fbWF4U2NyaXB0U2VxdWVuY2VSZWNlaXZlZD1NYXRoLm1heCh5Y29tbS5fbWF4U2NyaXB0U2VxdWVuY2VSZWNlaXZlZCxlKTtkLlVVSUQ9Z2VuZXJhdGVVVUlEKCk7ZC5tYXhXYWl0Q291bnQ9eWNvbW0udGltZW91dC95Y29tbS53ZF9pbnRlcnZhbCsyO2QuY2FsbGJhY2tGdW5jdGlvbk5hbWU9CmY7ZC5kaXNwbGF5V2FpdEljb249YjtkLnR5cGU9InRleHQvamF2YXNjcmlwdCI7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXswPHljb21tLl9sb2FkJiZ5Y29tbS5fbG9hZC0tO3RoaXMuYWJvcnQ9bnVsbDt0aGlzLmRpc3BsYXlXYWl0SWNvbiYmeWNvbW0ud2FpdEljb25Db250cm9sKCExKX07ZC5hYm9ydD1mdW5jdGlvbigpezA8eWNvbW0uX2xvYWQmJnljb21tLl9sb2FkLS07X2R1bXB5KDQsMSwiQ2FsbGluZyB7MH0oNDA0KTsiLmZvcm1hdChmKSk7c2V0VGltZW91dCgiezB9KDQwNCx7bWVzc2FnZTogJ1NlcnZlciBkbyBub3QgcmVzcG9uZCAoezF9KSd9LCB7fSkiLmZvcm1hdChmLGEpLDEwMCl9O2QucG9vbD1mdW5jdGlvbigpe19kdW1weSg0LDUsdGhpcy5VVUlEKyIgOiAiK3RoaXMubWF4V2FpdENvdW50KTt0aGlzLm1heFdhaXRDb3VudC0tOzA8dGhpcy5tYXhXYWl0Q291bnQ/dGhpcy5fd2hhdGNoZG9nXz1zZXRUaW1lb3V0KHRoaXMuaWQrIi5wb29sKCkiLHljb21tLndkX2ludGVydmFsKToKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuYWJvcnQmJnRoaXMuYWJvcnQoKX07ZC5pZD0icmVzdF8iK2U7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7dHJ5e19kdW1weSg0LDIsIkNyZWF0aW5nIHswfSBhcyB7MX0iLmZvcm1hdChkLlVVSUQsZC5zcmMpKSxjLmFwcGVuZENoaWxkKGQpLHNldFRpbWVvdXQoZC5pZCsiLnBvb2woKSIseWNvbW0ud2RfaW50ZXJ2YWwpfWNhdGNoKGwpe19kdW1wKCJFeGNlcHRpb246IHswfSIuZm9ybWF0KGwubWVzc2FnZSkpfXNldFRpbWVvdXQoInljb21tLl9yZW1vdmVKU09OUCgiK2UrIiwnIitmKyInKTsiLHljb21tLnRpbWVvdXQpfTsKeWNvbW0uY3JhdmU9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnPSJ1bmRlZmluZWQiPT10eXBlb2YgdT8iIjp1O2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZnx8bnVsbD09PWYpZj0wO2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZXx8bnVsbD09PWUpZT0hMDt5Y29tbS5yZWdpc3RlckNhbGwoImNyYXZlIixhLGIpO3ljb21tLl9zY3JpcHRTZXF1ZW5jZSsrO2lmKHljb21tLmdldERhdGFMb2NhdGlvbigpKXt2YXIgaDsiZnVuY3Rpb24iPT10eXBlb2YgZD8oaD0ieWNiIisgKyt5Y29tbS5fQ0JTZXEseWNvbW0uX0NCQ29udHJvbFtoXT17cmVhZHk6ITF9LCh3aW5kb3d8fHNlbGYpW2hdPWZ1bmN0aW9uKGEsYixjLGUsZixnKXtkKGEsYixjLGUsZixnKTtfZHVtcHkoNCwxLGgpfSk6InN0cmluZyI9PXR5cGVvZiBkP2g9ZDpjb25zb2xlLmVycm9yKCJwYXJhbSBjYWxsQmFja0Z1bmN0aW9uIG5lZWQgdG8gYmUgZnVuY3Rpb24gb3Igc3RyaW5nIik7IiI8aCYmKHljb21tLl9sb2FkKyssYT15Y29tbS5idWlsZENvbW1vblVSTChhfHwKIiIsYnx8IiIsY3x8e30sZyksYT0iezB9P3sxfSZjYWxsYmFjaz17Mn0mY2FsbGJhY2tJZD17M30mc2NyaXB0U2VxdWVuY2U9ezR9JmRldmljZUlkPXs1fSIuZm9ybWF0KHljb21tLl9kYXRhTG9jYXRpb25fLGEsaCxmLHljb21tLl9zY3JpcHRTZXF1ZW5jZSx5Y29tbS5fZGV2aWNlSWRfKSx5Y29tbS5nZXRMb2FkKCk8PXljb21tLl9tYXhEaXJlY3RDYWxsP3ljb21tLmJyaW5nKGEsZSk6c2V0VGltZW91dCgieWNvbW0uYnJpbmcoJyIrYSsiJyk7IiwoLjUrTWF0aC5hYnMoeWNvbW0uZ2V0TG9hZCgpLXljb21tLl9tYXhEaXJlY3RDYWxsKSkqeWNvbW0ud2RfaW50ZXJ2YWwqMikpfWVsc2UgY29uc29sZS5lcnJvcigiWW91IG5lZWQgdG8gZGVmaW5lIGRhdGFMb2NhdGlvbiBiZWZvcmUgJ2NyYXZlJyBpdCIpfTt5Y29tbS5pc0lkbGU9ZnVuY3Rpb24oKXtyZXR1cm4geWNvbW0uX21heFNjcmlwdFNlcXVlbmNlUmVjZWl2ZWQ9PXljb21tLl9zY3JpcHRTZXF1ZW5jZX07Cnljb21tLmdldFN0YXR1cz1mdW5jdGlvbigpe3JldHVybiJpc0lkbGUoKSA9IHswfSBnZXRMb2FkKCkgPSB7MX0iLmZvcm1hdCh5Y29tbS5pc0lkbGUoKSx5Y29tbS5nZXRMb2FkKCkpfTtfZHVtcCgieWNvbW0tcmVzdCIpO3ljb21tLmRvbT17X2VsZW1fdGVtcGxhdGVzOltdfTt5Y29tbS5kb20uZmlsbElucGxhY2VEYXRhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShjKSYmKCJkYXRhLSI9PWMuc3Vic3RyKDAsNSk/YS5zZXRBdHRyaWJ1dGUoYyxiW2NdKTphLnNldEF0dHJpYnV0ZSgiZGF0YS0iK2MsYltjXSkpfTt5Y29tbS5kb20uZ2V0SW5wbGFjZURhdGE9ZnVuY3Rpb24oYSl7YT1hLmF0dHJpYnV0ZXM7dmFyIGI9e30sYyxkLGU7Zm9yKGUgaW4gYSlhLmhhc093blByb3BlcnR5KGUpJiYoYz1hW2VdLGQ9Yy5ub2RlTmFtZSwiZGF0YS0iPT0oZHx8IiIpLnN1YnN0cigwLDUpJiYoYltkXT1jLm5vZGVWYWx1ZSkpO3JldHVybiBifTsKeWNvbW0uZG9tLmZpbGxFbGVtZW50PWZ1bmN0aW9uKGEsYixjLGQpe2lmKHZvaWQgMD09PWN8fG51bGw9PT1jKWM9e307ImJvb2xlYW4iPT10eXBlb2YgZCYmKGQ9e2RlbGV0ZVJvd3M6ZH0pO2Q9ZHx8e307InVuZGVmaW5lZCI9PXR5cGVvZiBkLmRlbGV0ZVJvd3MmJihkLmRlbGV0ZVJvd3M9ITApOyJ1bmRlZmluZWQiPT10eXBlb2YgZC5wYWludFJvd3MmJihkLnBhaW50Um93cz0hMCk7InVuZGVmaW5lZCI9PXR5cGVvZiBkLmluc2VydEF0VG9wJiYoZC5pbnNlcnRBdFRvcD0hMSk7dmFyIGUsZixnLGgsaz15JChhKSxsPSJ1bmRlZmluZWQiPT10eXBlb2YgeWNvbW0uZG9tLl9lbGVtX3RlbXBsYXRlc1thXTtlPWMuaWRGaWVsZE5hbWV8fCJpZCI7ImJvb2xlYW4iPT10eXBlb2YgZC51bmxlYXJuJiYobD1kLnVubGVhcm4pO3ZhciB2PWZ1bmN0aW9uKGEpe2EuZG9jJiZhLmlkJiZhLnZhbHVlJiYoYT1hLmRvYyk7cmV0dXJuIGF9LHc9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIiE9CnR5cGVvZiBjLmlucGxhY2VEYXRhKWZvcih2YXIgZD0wO2Q8Yy5pbnBsYWNlRGF0YS5sZW5ndGg7ZCsrKWlmKCJ1bmRlZmluZWQiIT09dHlwZW9mIGJbYy5pbnBsYWNlRGF0YVtkXV0pe3ZhciBlPWMuaW5wbGFjZURhdGFbZF07YS5zZXRBdHRyaWJ1dGUoImRhdGEtIitlLGJbZV18fCIiKX19LHg9ZnVuY3Rpb24oYSl7dmFyIGYsZz12KGJbcV0pO0M9MDsiVFIiPT1hLm5vZGVOYW1lJiZkLnBhaW50Um93cyYmKGEuc3R5bGUuYmFja2dyb3VuZENvbG9yPXJvd0NvbG9yU3BlYy5zdWdnZXN0Um93Q29sb3IoRikpO2lmKGdbZV0paWYoeSQoZ1tlXSkpe2ZvcihmPTA7eSQoZ1tlXSsiXyIrZik7KWYrKzthLmlkPWdbZV0rIl8iK2Z9ZWxzZSBhLmlkPWdbZV07dyhhLGcpOyhjLm9uQ2xpY2t8fGMub25TZWxlY3QpJiZhLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixjLm9uQ2xpY2t8fGMub25TZWxlY3QsITEpfSxzPWZ1bmN0aW9uKGQpe2lmKGQhPWUpe3ZhciBmPWcuaW5zZXJ0Q2VsbChDKSxrPQp2KGJbcV0pLGw9bnVsbCE9PWQ/dW5tYXNrSFRNTChrW2RdfHwiIik6dW5tYXNrSFRNTChrKTtjLmNvbHVtbnMmJmMuY29sdW1uc1tkXSYmKGMuY29sdW1uc1tkXS5hbGlnbiYmKGYuc3R5bGUudGV4dEFsaWduPWMuY29sdW1uc1tkXS5hbGlnbiksYy5jb2x1bW5zW2RdLnR5cGUmJihsPXlBbmFsaXNlKCIlIitjLmNvbHVtbnNbZF0udHlwZSsiKCIrbCsiKSIpKSk7aHx8Zi5hZGRDbGFzcygid2FybmluZyIpO2YuaW5uZXJIVE1MPTA9PT1sLmxlbmd0aD8iJm5ic3A7IjpsO2Yuc3R5bGUudmVydGljYWxBbGlnbj0idG9wIjtmLmlkPWErIl8iK0MrIl8iK3Aucm93cy5sZW5ndGg7Zi5zZXRBdHRyaWJ1dGUoImNvbE5hbWUiLGQpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBjLm9uTmV3SXRlbSljLm9uTmV3SXRlbShhLGYsayk7Qys9MX19LHAscSx0LEMsRT0obmV3IERhdGUpLmdldFRpbWUoKS0xNDQ3MjY1NzM1NDcwLHk7InVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3cuX2V2dEZpbGxlZCYmKHdpbmRvdy5fZXZ0RmlsbGVkPQp3aW5kb3cuY3JlYXRlRE9NRXZlbnQoImZpbGxlZCIpKTtpZihrKWlmKCJUQUJMRSI9PWsubm9kZU5hbWUpe3A9MDxrLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aD9rLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdOms7MDxwLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCYmKHA9cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXSk7aWYobClpZigidW5kZWZpbmVkIj09dHlwZW9mKGMuY29sdW1uc3x8Yy5yb3dzfHxjLmh0bWwpKXtpZih5Y29tbS5kb20uX2VsZW1fdGVtcGxhdGVzW2FdPXt9LDA8cC5yb3dzLmxlbmd0aClmb3IoeWNvbW0uZG9tLl9lbGVtX3RlbXBsYXRlc1thXS5yb3dzPVtdLGw9MDtsPHAucm93cy5sZW5ndGg7bCsrKXljb21tLmRvbS5fZWxlbV90ZW1wbGF0ZXNbYV0ucm93c1tsXT10cmltKHAucm93c1tsXS5pbm5lckhUTUwrIiIpLnJlcGxhY2UoL1wgXHMrL2csIiIpfWVsc2UgeWNvbW0uZG9tLl9lbGVtX3RlbXBsYXRlc1thXT0Ke30seWNvbW0uZG9tLl9lbGVtX3RlbXBsYXRlc1thXS5jb2x1bW5zPWMuY29sdW1ucyx5Y29tbS5kb20uX2VsZW1fdGVtcGxhdGVzW2FdLnJvd3M9Yy5yb3dzLHljb21tLmRvbS5fZWxlbV90ZW1wbGF0ZXNbYV0uaHRtbD1jLmh0bWw7bWVyZ2VPYmplY3QoeWNvbW0uZG9tLl9lbGVtX3RlbXBsYXRlc1thXSxjLCEwKTtpZighMD09PWQuZGVsZXRlUm93cylmb3IoOzA8cC5yb3dzLmxlbmd0aDspcC5kZWxldGVSb3cocC5yb3dzLmxlbmd0aC0xKTt2YXIgRj1wLnJvd3MubGVuZ3RoJTI7Qz1udWxsO2ZvcihxIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShxKSl7eT12KGJbcV0pO0YrKztoPSEwO2lmKCFkLmRlbGV0ZVJvd3MmJnlbZV0pZm9yKGw9MDtoJiZsPHAucm93cy5sZW5ndGg7bCsrKWlmKHAucm93c1tsXS5pZD09eVtlXSl7Zm9yKGc9cC5yb3dzW2xdOzA8Zy5jZWxscy5sZW5ndGg7KWcuZGVsZXRlQ2VsbCgwKTtoPSExO3kucm93aWQ9bH1oJiYoZz1kLmluc2VydEF0VG9wP3AuaW5zZXJ0Um93KDApOgpwLmluc2VydFJvdyhwLnJvd3MubGVuZ3RoKSk7RSsrO3kucm93aWQ9ZC5pbnNlcnRBdFRvcHx8InVuZGVmaW5lZCI9PT10eXBlb2YgZy5yb3dJbmRleD9FKyIiOmcucm93SW5kZXg7eS5fZWxlbWVudGlkXz1hO3goZyk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGMub25CZWZvcmVOZXdJdGVtKWMub25CZWZvcmVOZXdJdGVtKGEseSk7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBjLmh0bWwmJiJ1bmRlZmluZWQiPT10eXBlb2YgYy5yb3dzJiYidW5kZWZpbmVkIj09dHlwZW9mIGMuY29sdW1ucylpZigic3RyaW5nIj09dHlwZW9mIHkpcyhudWxsKTtlbHNlIGZvcihmIGluIHkpeS5oYXNPd25Qcm9wZXJ0eShmKSYmZiE9ZSYmInJvd2lkIiE9ZiYmIl9lbGVtZW50aWRfIiE9ZiYmcyhmKTtlbHNlIGlmKCJ1bmRlZmluZWQiIT10eXBlb2YgYy5jb2x1bW5zKWlmKGlzQXJyYXkoYy5jb2x1bW5zKSlmb3IodD0wO3Q8Yy5jb2x1bW5zLmxlbmd0aDt0KyspcyhjLmNvbHVtbnNbdF0pO2Vsc2UgZm9yKHQgaW4gYy5jb2x1bW5zKWMuY29sdW1ucy5oYXNPd25Qcm9wZXJ0eSh0KSYmCnModCk7ZWxzZSBpZigidW5kZWZpbmVkIiE9dHlwZW9mIGMuaHRtbCl7aWYobD1nLmluc2VydENlbGwoMCksbC5pbm5lckhUTUw9eUFuYWxpc2UoYy5odG1sLHkpLGwuc3R5bGUudmVydGljYWxBbGlnbj0idG9wIixsLmlkPWErIl8iK0MrIl8iK3Aucm93cy5sZW5ndGgsImZ1bmN0aW9uIj09dHlwZW9mIGMub25OZXdJdGVtKWMub25OZXdJdGVtKGEsbCx5KX1lbHNlIGlmKCJ1bmRlZmluZWQiIT10eXBlb2YgYy5yb3dzKWZvcihsPSEwLHI9MDtyPGMucm93cy5sZW5ndGg7cisrKXtsfHwoZz1wLmluc2VydFJvdyhwLnJvd3MubGVuZ3RoKSx4KGcpKTtnLmlubmVySFRNTD15QW5hbGlzZShjLnJvd3Nbcl0seSk7aWYoIWgmJmQuZGVsZXRlUm93cylmb3IodD0wO3Q8Zy5jZWxscy5sZW5ndGg7dCsrKWcuY2VsbHNbdF0uc3R5bGUuYm9yZGVyTGVmdD0ic29saWQgMXB4IHJlZCI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGMub25OZXdJdGVtKWMub25OZXdJdGVtKGEsZyx5KTtsPSExfWlmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYy5vbk5ld1Jvd1JlYWR5KWMub25OZXdSb3dSZWFkeShhLGcpfWsuZGlzcGF0Y2hFdmVudCh3aW5kb3cuX2V2dEZpbGxlZCl9ZWxzZSBpZigiVUwiPT1rLm5vZGVOYW1lKXtpZihsKWlmKCJ1bmRlZmluZWQiPT10eXBlb2YoYy5jb2x1bW5zfHxjLnJvd3N8fGMuaHRtbCkpe2lmKHljb21tLmRvbS5fZWxlbV90ZW1wbGF0ZXNbYV09e30sMDxrLmNoaWxkcmVuLmxlbmd0aClmb3IoeWNvbW0uZG9tLl9lbGVtX3RlbXBsYXRlc1thXS5yb3dzPVtdLGw9MDtsPGsuY2hpbGRyZW4ubGVuZ3RoO2wrKyl5Y29tbS5kb20uX2VsZW1fdGVtcGxhdGVzW2FdLnJvd3NbbF09dHJpbShrLmNoaWxkcmVuW2xdLmlubmVySFRNTCsiIikucmVwbGFjZSgvXCBccysvZywiIil9ZWxzZSB5Y29tbS5kb20uX2VsZW1fdGVtcGxhdGVzW2FdPXt9LHljb21tLmRvbS5fZWxlbV90ZW1wbGF0ZXNbYV0uY29sdW1ucz1jLmNvbHVtbnMseWNvbW0uZG9tLl9lbGVtX3RlbXBsYXRlc1thXS5yb3dzPWMucm93cywKeWNvbW0uZG9tLl9lbGVtX3RlbXBsYXRlc1thXS5odG1sPWMuaHRtbDttZXJnZU9iamVjdCh5Y29tbS5kb20uX2VsZW1fdGVtcGxhdGVzW2FdLGMsITApO2lmKGQuZGVsZXRlUm93cylmb3IoO2suZmlyc3RDaGlsZDspay5yZW1vdmVDaGlsZChrLmZpcnN0Q2hpbGQpO2ZvcihxIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShxKSl7eT12KGJbcV0pO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBjLm9uQmVmb3JlTmV3SXRlbSljLm9uQmVmb3JlTmV3SXRlbShhLHkpO2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKTt3KGwseSk7dD0iIjtzPSExO2lmKCJvYmplY3QiPT10eXBlb2YgYy5yb3dzKXtmb3Iocj0wO3I8Yy5yb3dzLmxlbmd0aDtyKyspdD10K3lBbmFsaXNlKGMucm93c1tyXSx5KSsiIjtzPSEwfWVsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBjLmh0bWwpdD10K3lBbmFsaXNlKGMuaHRtbCx5KSsiIixzPSEwO2Vsc2UgZm9yKGYgaW4geSkiIj09PXQmJnkuaGFzT3duUHJvcGVydHkoZikmJgpmIT1lJiYicm93aWQiIT1mJiYiX2VsZW1lbnRpZF8iIT1mJiYodCs9eVtmXXx8IiIpO3gobCk7cz9sLmlubmVySFRNTD10OmwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodCkpOyJzdHJpbmciPT10eXBlb2YgYy5iZWZvcmVFbGVtZW50Pyh0PXkkKGMuYmVmb3JlRWxlbWVudCksay5pbnNlcnRCZWZvcmUobCx0KSk6ay5hcHBlbmRDaGlsZChsKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgYy5vbk5ld0l0ZW0pYy5vbk5ld0l0ZW0oYSxsLHkpfWsuZGlzcGF0Y2hFdmVudCh3aW5kb3cuX2V2dEZpbGxlZCl9ZWxzZSBpZigiTElTVEJPWCI9PWsubm9kZU5hbWUpe2lmKGQuZGVsZXRlUm93cylmb3IoOzA8ay5jaGlsZEVsZW1lbnRDb3VudDspay5jaGlsZE5vZGVzWzBdLnJlbW92ZSgpO3g9MDtmb3IocSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkocSkpe3k9dihiW3FdKTt5Ll9lbGVtZW50aWRfPWE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGMub25CZWZvcmVOZXdJdGVtKWMub25CZWZvcmVOZXdJdGVtKGEsCnkpO2c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGlzdGl0ZW0iKTtDPTA7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBjLmNvbHVtbnMpaWYoInN0cmluZyI9PXR5cGVvZiB5KV9kdW1weSgyLDEsIkVSUk86IHllYXBmLWRvbS5qcyAtIHN0cmluZyBjZWxsIG5vdCBpbXBsZW1lbnRlZCIpO2Vsc2UgZm9yKGYgaW4geSl7aWYoeS5oYXNPd25Qcm9wZXJ0eShmKSYmZiE9ZSYmInJvd2lkIiE9ZiYmIl9lbGVtZW50aWRfIiE9Zil7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaXN0Y2VsbCIpO2wuaW5uZXJIVE1MPXlbZl18fCIiO2wuaWQ9YSsiXyIrQysiXyIreDtpZigiZnVuY3Rpb24iPT10eXBlb2YgYy5vbk5ld0l0ZW0pYy5vbk5ld0l0ZW0oYSxsLHkpO0MrPTE7Zy5hcHBlbmRDaGlsZChsKX19ZWxzZSBmb3IoZiBpbiBjLmNvbHVtbnMpaWYoZiE9ZSl7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaXN0Y2VsbCIpO2wuaW5uZXJIVE1MPXlbZl18fCIiO2wuaWQ9YSsiXyIrQysiXyIreDsKaWYoImZ1bmN0aW9uIj09dHlwZW9mIGMub25OZXdJdGVtKWMub25OZXdJdGVtKGEsbCx5KTtDKz0xO2cuYXBwZW5kQ2hpbGQobCl9dyhnLHkpO2suYXBwZW5kQ2hpbGQoZyk7eCsrfWsuZGlzcGF0Y2hFdmVudCh3aW5kb3cuX2V2dEZpbGxlZCl9ZWxzZSBpZigiU0VMRUNUIj09ay5ub2RlTmFtZXx8IkRBVEFMSVNUIj09ay5ub2RlTmFtZSl7aWYoZC5kZWxldGVSb3dzKWZvcig7MDxrLm9wdGlvbnMubGVuZ3RoOylrLnJlbW92ZUNoaWxkKGsub3B0aW9uc1swXSk7Qz0wO2ZvcihxIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShxKSl7eT12KGJbcV0pO3kuX2VsZW1lbnRpZF89YTtpZigiZnVuY3Rpb24iPT10eXBlb2YgYy5vbkJlZm9yZU5ld0l0ZW0pYy5vbkJlZm9yZU5ld0l0ZW0oYSx5KTtsPSIiO2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgYy5jb2x1bW5zKWlmKCJzdHJpbmciPT10eXBlb2YgeSlfZHVtcHkoMiwxLCJFUlJPOiB5ZWFwZi1kb20uanMgLSBzdHJpbmcgY2VsbCBub3QgaW1wbGVtZW50ZWQiKTsKZWxzZSBmb3IoZiBpbiB5KXkuaGFzT3duUHJvcGVydHkoZikmJmYhPWUmJiJyb3dpZCIhPWYmJiJfZWxlbWVudGlkXyIhPWYmJihsKz15W2ZdfHwiIik7ZWxzZSBpZih4PWMuc2VwfHwiIixpc0FycmF5KGMuY29sdW1ucykpZm9yKHQ9MDt0PGMuY29sdW1ucy5sZW5ndGg7dCsrKSIiPGwmJihsKz14KSxsKz15W2MuY29sdW1uc1t0XV18fCIiO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiB5KV9kdW1weSgyLDEsIkVSUk86IHllYXBmLWRvbS5qcyAtIHN0cmluZyBjZWxsIG5vdCBpbXBsZW1lbnRlZCIpO2Vsc2UgZm9yKGYgaW4gYy5jb2x1bW5zKWYhPWUmJihsPWwrKHlbZl18fCIiKSt4KTt4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOyJ1bmRlZmluZWQiIT10eXBlb2YgeVtlXSYmKCJEQVRBTElTVCI9PWsubm9kZU5hbWU/eC5zZXRBdHRyaWJ1dGUoImRhdGEtIitlLHlbZV0pOngudmFsdWU9eVtlXSk7eC5pbm5lckhUTUw9bDt4LmlkPWErIl8iK0M7dyh4LHkpO2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYy5vbk5ld0l0ZW0pYy5vbk5ld0l0ZW0oYSx4LHkpO2suYXBwZW5kQ2hpbGQoeCk7QysrfWsuZGlzcGF0Y2hFdmVudCh3aW5kb3cuX2V2dEZpbGxlZCk7aWYoay5vbmNsaWNrKWsub25jbGljaygpfWVsc2UgaWYoIkZPUk0iPT1rLm5vZGVOYW1lKXt2YXIgbSxELHosQj1mdW5jdGlvbihhLGIpe3ZhciBjPSExO2lmKHpbYV0pe2I9Yi50b1VwcGVyQ2FzZSgpO3ZhciBkPXpbYV0uY2xhc3NOYW1lLnRvVXBwZXJDYXNlKCksYz1jfHwwPD1kLmluZGV4T2YoYil9cmV0dXJuIGN9O3o9ZC5kZWxldGVSb3dzP3RoaXMuY2xlYW5Gb3JtKGEpOnRoaXMuc2VsZWN0RWxlbWVudHMoYSk7aWYoYilpZigib2JqZWN0Ij09dHlwZW9mIGJ8fDE9PT1iLmxlbmd0aCl7dmFyIEE9dihiWzBdfHxiKTt3KGssQSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGMub25CZWZvcmVOZXdJdGVtKWMub25CZWZvcmVOZXdJdGVtKGEsQSk7cz1jLmVsZW1lbnRQcmVmaXhOYW1lfHxjLnByZWZpeHx8ay5nZXRBdHRyaWJ1dGUoImRhdGEtcHJlZml4Iil8fAoiIjtFPWMuZWxlbWVudFBvc3RpeE5hbWV8fGMucG9zdGZpeHx8ay5nZXRBdHRyaWJ1dGUoImRhdGEtcG9zdGZpeCIpfHwiIjtmb3IobD0wO2w8ei5sZW5ndGg7bCsrKWlmKHg9eltsXS5nZXRBdHRyaWJ1dGUoImRhdGEtZWRpdC1tYXNrIil8fHpbbF0uZ2V0QXR0cmlidXRlKCJlZGl0TWFzayIpLHQ9eltsXS5nZXRBdHRyaWJ1dGUoImRhdGEtc3RvcmFnZS1tYXNrIil8fHpbbF0uZ2V0QXR0cmlidXRlKCJzdG9yYWdlTWFzayIpLHk9eltsXS5nZXRBdHRyaWJ1dGUoImRhdGEtdmFsdWUtdHlwZSIpfHx6W2xdLmdldEF0dHJpYnV0ZSgidmFsdWVUeXBlIil8fCJ0ZXh0IixtPXN1Z2dlc3RLZXlOYW1lKEEseltsXS5uYW1lfHx6W2xdLmlkLHMsRSksZj1jLmNvbHVtbnMmJnN1Z2dlc3RLZXlOYW1lKGMuY29sdW1ucyx6W2xdLm5hbWV8fHpbbF0uaWQpfHxudWxsLCJ1bmRlZmluZWQiIT10eXBlb2YgQVttXSYmKEQ9dW5tYXNrSFRNTChBW21dKSxtPXpbbF0udHlwZS50b0xvd2VyQ2FzZSgpLCFjLmNvbHVtbnN8fAoiIjxmKSl7IiI8ZiYmIWlzQXJyYXkoYy5jb2x1bW5zKSYmKHk9Yy5jb2x1bW5zW2ZdLnR5cGUseD1jLmNvbHVtbnNbZl0uZWRpdE1hc2t8fHgsdD1jLmNvbHVtbnNbZl0uc3RvcmFnZU1hc2t8fHQpOyJ0ZXh0IiE9eSYmKCIiPHgmJiIiPHQ/MDw9eS5pbmRleE9mKCJkYXRlIikmJihEPWRhdGVUcmFuc2Zvcm0oRCx0LHgpfHwiIik6RD15QW5hbGlzZSgiJSIreSsiKCIrRCsiKSIpKTtzd2l0Y2gobSl7Y2FzZSAidGVsIjp6W2xdLnZhbHVlPSgiIitEKS5hc1Bob25lKCk7YnJlYWs7Y2FzZSAidGV4dCI6Y2FzZSAicGFzc3dvcmQiOmNhc2UgInRleHRhcmVhIjpjYXNlICJlbWFpbCI6Y2FzZSAiaGlkZGVuIjpjYXNlICJjb2xvciI6Y2FzZSAiZGF0ZSI6Y2FzZSAiZGF0ZXRpbWUiOmNhc2UgImRhdGV0aW1lLWxvY2FsIjpjYXNlICJtb250aCI6Y2FzZSAibnVtYmVyIjpjYXNlICJyYW5nZSI6Y2FzZSAic2VhcmNoIjpjYXNlICJ0aW1lIjpjYXNlICJ1cmwiOmNhc2UgIndlZWsiOnpbbF0udmFsdWU9CkQ7YnJlYWs7Y2FzZSAicmFkaW8iOmNhc2UgImNoZWNrYm94Ijp6W2xdLnZhbHVlPT1EJiYoeltsXS5jaGVja2VkPXpbbF0udmFsdWU9PT1EKTticmVhaztjYXNlICJzZWxlY3Qtb25lIjpjYXNlICJzZWxlY3QtbXVsdGkiOmZvcihxPTA7cTx6W2xdLm9wdGlvbnMubGVuZ3RoO3ErKyl6W2xdLm9wdGlvbnNbcV0udmFsdWU9PUQmJih6W2xdLnNlbGVjdGVkSW5kZXg9cSl9QihsLCJjcGYiKSYmKHpbbF0udmFsdWU9KCIiK0QpLmFzQ1BGKCkpO0IobCwiY25waiIpJiYoeltsXS52YWx1ZT0oIiIrRCkuYXNDTlBKKCkpO0IobCwicmciKSYmKHpbbF0udmFsdWU9KCIiK0QpLmFzUkcoKSk7QihsLCJjZXAiKSYmKHpbbF0udmFsdWU9KCIiK0QpLmFzQ0VQKCkpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBjLm9uTmV3SXRlbSljLm9uTmV3SXRlbShhLHpbbF0sQSl9ay5kaXNwYXRjaEV2ZW50KHdpbmRvdy5fZXZ0RmlsbGVkKX1lbHNlIDE8Yi5sZW5ndGgmJl9kdW1wKCJUaGVyZSBhcmUgbW9yZSB0aGFuIG9uZSByZWNvcmQgcmV0dXJuaW5nIGZyb20gdGhlIHNlcnZlciIpfWVsc2UgaWYoIkRJViI9PQprLm5vZGVOYW1lJiYobCYmKCJ1bmRlZmluZWQiPT10eXBlb2YoYy5jb2x1bW5zfHxjLnJvd3N8fGMuaHRtbCk/KHljb21tLmRvbS5fZWxlbV90ZW1wbGF0ZXNbYV09e30seWNvbW0uZG9tLl9lbGVtX3RlbXBsYXRlc1thXS5odG1sPWsuaW5uZXJIVE1MKTooeWNvbW0uZG9tLl9lbGVtX3RlbXBsYXRlc1thXT17fSx5Y29tbS5kb20uX2VsZW1fdGVtcGxhdGVzW2FdLmNvbHVtbnM9Yy5jb2x1bW5zLHljb21tLmRvbS5fZWxlbV90ZW1wbGF0ZXNbYV0ucm93cz1jLnJvd3MseWNvbW0uZG9tLl9lbGVtX3RlbXBsYXRlc1thXS5odG1sPWMuaHRtbCkpLG1lcmdlT2JqZWN0KHljb21tLmRvbS5fZWxlbV90ZW1wbGF0ZXNbYV0sYywhMCksZC5kZWxldGVSb3dzJiYoay5pbm5lckhUTUw9IiIpLGw9ay5pbm5lckhUTUwsYikpe2ZvcihxIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShxKSl7eT12KGJbcV0pO3coayx5KTtpZigiZnVuY3Rpb24iPT10eXBlb2YgYy5vbkJlZm9yZU5ld0l0ZW0pYy5vbkJlZm9yZU5ld0l0ZW0oYSwKeSk7aWYoYy5odG1sKWwrPXlBbmFsaXNlKGMuaHRtbCx5KTtlbHNlIGZvcihmIGluIHkpeS5oYXNPd25Qcm9wZXJ0eShmKSYmKGwrPSI8ZGl2PjxkaXYgY2xhc3M9dG5GaWVsZE5hbWU+PGI+PHNtYWxsPnswfTwvc21hbGw+PC9iPjwvZGl2PnsxfSIuZm9ybWF0KGYseVtmXXx8IiIpKX1rLmlubmVySFRNTD1sO2suZGlzcGF0Y2hFdmVudCh3aW5kb3cuX2V2dEZpbGxlZCl9fTt5Y29tbS5kb20uZ2V0Um93SWQ9ZnVuY3Rpb24oYSxiKXtpZihhKWZvcig7YSYmYS5wYXJlbnROb2RlOylhPWEucGFyZW50Tm9kZX07eWNvbW0uZG9tLmdldFJvd0J5Um93Tm89ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYz9jLnJvd3NbYl06bnVsbH07eWNvbW0uZG9tLmdldFRhYmxlUm93SWQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz15Y29tbS5kb20uZ2V0Um93QnlSb3dObyhhLGIpO3JldHVybiBjP2MuaWQ6bnVsbH07Cnljb21tLmRvbS5oaWdobGlnaHRSb3c9ZnVuY3Rpb24oYSxiLGMpe2M9Y3x8IiI7Yj0idW5kZWZpbmVkIj09dHlwZW9mIGI/LTE6Yjt2YXIgZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtpZihkKWZvcih2YXIgZT0wO2U8ZC5yb3dzLmxlbmd0aDtlKyspaWYoZT09Yilmb3IoZC5yb3dzW2VdLmFkZENsYXNzKGMpLGE9MDthPGQucm93c1tlXS5jZWxscy5sZW5ndGg7YSsrKWQucm93c1tlXS5jZWxsc1thXS5hZGRDbGFzcyhjKTtlbHNlIGZvcihkLnJvd3NbZV0ucmVtb3ZlQ2xhc3MoYyksYT0wO2E8ZC5yb3dzW2VdLmNlbGxzLmxlbmd0aDthKyspZC5yb3dzW2VdLmNlbGxzW2FdLnJlbW92ZUNsYXNzKGMpfTt5Y29tbS5kb20uZ2V0VGFibGVSb3dJbnBsYWNlRGF0YT1mdW5jdGlvbihhLGIpe3JldHVybiBhP2EuZ2V0QXR0cmlidXRlKCJkYXRhLSIrYik6bnVsbH07Cnljb21tLmRvbS5nZXRUYWJsZUlucGxhY2VEYXRhPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4oYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk/eWNvbW0uZG9tLmdldFRhYmxlUm93SW5wbGFjZURhdGEoYS5yb3dzW2JdLGMpOm51bGx9O3ljb21tLmRvbS5kZWxldGVFbGVtZW50PWZ1bmN0aW9uKGEpeyhhPXkkKGEpKSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfTsKeWNvbW0uZG9tLnNlbGVjdEVsZW1lbnRzPWZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlLGY7aWYoZD15JChhKSlmb3IoZD1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZT0wO2U8ZC5sZW5ndGg7ZSsrKWlmKGRbZV0udHlwZSl7Zj1kW2VdLnR5cGUudG9Mb3dlckNhc2UoKTtrbm93bkZpZWxkVHlwZT0hMTtiJiYwPmIuaW5kZXhPZihkW2VdLm5hbWV8fGRbZV0uaWQpJiYoZj0iLS1BVk9JRC0tIik7c3dpdGNoKGYpe2Nhc2UgInRleHQiOmNhc2UgInBhc3N3b3JkIjpjYXNlICJ0ZXh0YXJlYSI6Y2FzZSAiaGlkZGVuIjpjYXNlICJlbWFpbCI6Y2FzZSAicmFkaW8iOmNhc2UgImNoZWNrYm94IjpjYXNlICJzZWxlY3Qtb25lIjpjYXNlICJzZWxlY3QtbXVsdGkiOmNhc2UgImZpbGUiOmtub3duRmllbGRUeXBlPSEwO2JyZWFrO2Nhc2UgImNvbG9yIjpjYXNlICJkYXRlIjpjYXNlICJkYXRldGltZSI6Y2FzZSAiZGF0ZXRpbWUtbG9jYWwiOmNhc2UgIm1vbnRoIjpjYXNlICJudW1iZXIiOmNhc2UgInJhbmdlIjpjYXNlICJzZWFyY2giOmNhc2UgInRlbCI6Y2FzZSAidGltZSI6Y2FzZSAidXJsIjpjYXNlICJ3ZWVrIjprbm93bkZpZWxkVHlwZT0KITB9a25vd25GaWVsZFR5cGUmJihjW2MubGVuZ3RoXT1kW2VdKX1yZXR1cm4gY307Cnljb21tLmRvbS5jbGVhbkVsZW1lbnQ9ZnVuY3Rpb24oYSl7InN0cmluZyI9PXR5cGVvZiBhJiYoYT15JChhKSk7aWYoYSl7dmFyIGI7Yj1hLnR5cGU/YS50eXBlLnRvTG93ZXJDYXNlKCk6YS5ub2RlTmFtZT9hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk6IlVOS05PV04iO2lmKDA+WyJfX2NtZDVwX18iXS5pbmRleE9mKGEuaWQpKXN3aXRjaChiKXtjYXNlICJ0ZXh0IjpjYXNlICJwYXNzd29yZCI6Y2FzZSAidGV4dGFyZWEiOmNhc2UgImhpZGRlbiI6Y2FzZSAiY29sb3IiOmNhc2UgImRhdGUiOmNhc2UgImRhdGV0aW1lIjpjYXNlICJkYXRldGltZS1sb2NhbCI6Y2FzZSAibW9udGgiOmNhc2UgIm51bWJlciI6Y2FzZSAicmFuZ2UiOmNhc2UgInNlYXJjaCI6Y2FzZSAidGVsIjpjYXNlICJ0aW1lIjpjYXNlICJ1cmwiOmNhc2UgIndlZWsiOmEudmFsdWU9IiI7YnJlYWs7Y2FzZSAicmFkaW8iOmNhc2UgImNoZWNrYm94IjphLmNoZWNrZWQ9ITE7YnJlYWs7Y2FzZSAic2VsZWN0LW9uZSI6Y2FzZSAic2VsZWN0LW11bHRpIjphLnNlbGVjdGVkSW5kZXg9Ci0xO2JyZWFrO2Nhc2UgInRhYmxlIjpmb3IoMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCYmKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXSk7MDxhLnJvd3MubGVuZ3RoOylhLmRlbGV0ZVJvdyhhLnJvd3MubGVuZ3RoLTEpO2JyZWFrO2Nhc2UgInVsIjpmb3IoO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpfX1lbHNlIF9kdW1weSgyLDEsIm51bGwgZWxlbWVudCB3aGVuIGNhbGxpbmcgY2xlYW5FbGVtZW50KCkiKX07eWNvbW0uZG9tLmNsZWFuRm9ybT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7ZD10aGlzLnNlbGVjdEVsZW1lbnRzKGEsYik7Zm9yKGM9MDtjPGQubGVuZ3RoO2MrKyl5Y29tbS5kb20uY2xlYW5FbGVtZW50KGRbY10pO3JldHVybiBkfTsKeWNvbW0uZG9tLl9zY3JhdGNoPXt0OiJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0IGNsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCBjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LjtEdWlzIGF1dGVtIHZlbCBldW0gaXJpdXJlIGRvbG9yIGluIGhlbmRyZXJpdCBpbiB2dWxwdXRhdGUgdmVsaXQgZXNzZSBtb2xlc3RpZSBjb25zZXF1YXQsIHZlbCBpbGx1bSBkb2xvcmUgZXUgZmV1Z2lhdCBudWxsYSBmYWNpbGlzaXMgYXQgdmVybyBlcm9zIGV0IGFjY3Vtc2FuIGV0IGl1c3RvIG9kaW8gZGlnbmlzc2ltIHF1aSBibGFuZGl0IHByYWVzZW50IGx1cHRhdHVtIHp6cmlsIGRlbGVuaXQgYXVndWUgZHVpcyBkb2xvcmUgdGUgZmV1Z2FpdCBudWxsYSBmYWNpbGlzaS4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVlciBhZGlwaXNjaW5nIGVsaXQsIHNlZCBkaWFtIG5vbnVtbXkgbmliaCBldWlzbW9kIHRpbmNpZHVudCB1dCBsYW9yZWV0IGRvbG9yZSBtYWduYSBhbGlxdWFtIGVyYXQgdm9sdXRwYXQuO1V0IHdpc2kgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2kgdGF0aW9uIHVsbGFtY29ycGVyIHN1c2NpcGl0IGxvYm9ydGlzIG5pc2wgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlbSB2ZWwgZXVtIGlyaXVyZSBkb2xvciBpbiBoZW5kcmVyaXQgaW4gdnVscHV0YXRlIHZlbGl0IGVzc2UgbW9sZXN0aWUgY29uc2VxdWF0LCB2ZWwgaWxsdW0gZG9sb3JlIGV1IGZldWdpYXQgbnVsbGEgZmFjaWxpc2lzIGF0IHZlcm8gZXJvcyBldCBhY2N1bXNhbiBldCBpdXN0byBvZGlvIGRpZ25pc3NpbSBxdWkgYmxhbmRpdCBwcmFlc2VudCBsdXB0YXR1bSB6enJpbCBkZWxlbml0IGF1Z3VlIGR1aXMgZG9sb3JlIHRlIGZldWdhaXQgbnVsbGEgZmFjaWxpc2kuO05hbSBsaWJlciB0ZW1wb3IgY3VtIHNvbHV0YSBub2JpcyBlbGVpZmVuZCBvcHRpb24gY29uZ3VlIG5paGlsIGltcGVyZGlldCBkb21pbmcgaWQgcXVvZCBtYXppbSBwbGFjZXJhdCBmYWNlciBwb3NzaW0gYXNzdW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZGlhbSBub251bW15IG5pYmggZXVpc21vZCB0aW5jaWR1bnQgdXQgbGFvcmVldCBkb2xvcmUgbWFnbmEgYWxpcXVhbSBlcmF0IHZvbHV0cGF0LiBVdCB3aXNpIGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpIHRhdGlvbiB1bGxhbWNvcnBlciBzdXNjaXBpdCBsb2JvcnRpcyBuaXNsIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuO0R1aXMgYXV0ZW0gdmVsIGV1bSBpcml1cmUgZG9sb3IgaW4gaGVuZHJlcml0IGluIHZ1bHB1dGF0ZSB2ZWxpdCBlc3NlIG1vbGVzdGllIGNvbnNlcXVhdCwgdmVsIGlsbHVtIGRvbG9yZSBldSBmZXVnaWF0IG51bGxhIGZhY2lsaXNpcy47QXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCBjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0IGNsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIEF0IGFjY3VzYW0gYWxpcXV5YW0gZGlhbSBkaWFtIGRvbG9yZSBkb2xvcmVzIGR1byBlaXJtb2QgZW9zIGVyYXQsIGV0IG5vbnVteSBzZWQgdGVtcG9yIGV0IGV0IGludmlkdW50IGp1c3RvIGxhYm9yZSBTdGV0IGNsaXRhIGVhIGV0IGd1YmVyZ3Jlbiwga2FzZCBtYWduYSBubyByZWJ1bS4gc2FuY3R1cyBzZWEgc2VkIHRha2ltYXRhIHV0IHZlcm8gdm9sdXB0dWEuIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LiA7Q29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0IGNsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCBjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiIuc3BsaXQoIjsiKSxkOiJ5YWh1LmNvbSBob3RtYXlsLmNvbSBqbWFpbC5jb20geWFodS5jb20ubmggaG90bWF5bC5jb20ubmggam1haWwuY29tLm5oIi5zcGxpdCgiICIpLApwOlsiaHR0cDovLyIsImh0dHBzOi8vIiwid3M6Ly8iLCJ3c3M6Ly8iLCJmdHA6Ly8iXSxtbjoiSmFtZXMgSm9obiBSb2JlcnQgTWljaGFlbCBXaWxsaWFtIERhdmlkIFJpY2hhcmQgQ2hhcmxlcyIuc3BsaXQoIiAiKSxmbjoiTWFyeSBQYXRyaWNpYSBMaW5kYSBCYXJiYXJhIEVsaXphYmV0aCBKZW5uaWZlciBNYXJpYSBTdXNhbiIuc3BsaXQoIiAiKSxzbjoiU21pdGggSm9uZXMgVGF5bG9yIFdpbGxpYW1zIEJyb3duIERhdmllcyBFdmFucyBXaWxzb24iLnNwbGl0KCIgIiksY2g6InF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tUUFaV1NYRURDUkZWVEdCWUhOVUpNSUtPTFAwMTIzNDU2Nzg5IixuOiIwMTIzNDU2Nzg5In07Cnljb21tLmRvbS50ZXN0Rm9ybVdpdGhKdW5rPWZ1bmN0aW9uKGEpe2E9dGhpcy5zZWxlY3RFbGVtZW50cyhhKTt2YXIgYixjLGQsZSxmLGc9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIiLGU7Yz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYytiKTtmb3IoZT0wO2U8YzspYj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpLGQrPWFbYl0sZSsrO3JldHVybiBkfSxoPWZ1bmN0aW9uKGEsYixjKXtjPWN8fDA7Zm9yKGE9IiIrTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihiLWEpK2EpOygiIithKS5sZW5ndGg8YzspYT0iMCIrYTtyZXR1cm4gYX0saz1mdW5jdGlvbihhKXt2YXIgYj0hMTthPWEudG9VcHBlckNhc2UoKTtmb3IodmFyIGM9MDtjPGxDbGFzc2VzLmxlbmd0aDtjKyspYj1ifHwwPD1sQ2xhc3Nlc1tjXS5pbmRleE9mKGEpO3JldHVybiBifTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXtjPWFbYl0udHlwZS50b0xvd2VyQ2FzZSgpO2Q9YVtiXS5pZDtmPWFbYl0uZ2V0QXR0cmlidXRlKCJtYXhsZW5ndGgiKXx8CjEwMDtsQ2xhc3Nlcz1hW2JdLmNsYXNzTmFtZS5zcGxpdCgiICIpO2ZvcihlPTA7ZTxsQ2xhc3Nlcy5sZW5ndGg7ZSsrKWxDbGFzc2VzW2VdPWxDbGFzc2VzW2VdLnRvVXBwZXJDYXNlKCk7ZT0iIjtpZihkKXtzd2l0Y2goYyl7Y2FzZSAicGFzc3dvcmQiOmU9Zyh5Y29tbS5kb20uX3NjcmF0Y2guY2gsNiwxNSk7YnJlYWs7Y2FzZSAidGV4dGFyZWEiOmU9Zyh5Y29tbS5kb20uX3NjcmF0Y2gudCwxLDE1KmYpO2JyZWFrO2Nhc2UgImVtYWlsIjplPWcoeWNvbW0uZG9tLl9zY3JhdGNoLm1uLDIsMykrIkAiK2coeWNvbW0uZG9tLl9zY3JhdGNoLmQsMSwxKTticmVhaztjYXNlICJkYXRlIjplPTEqaCgtMjIwODk4MTZFNSwyNTU2MDY0OEU1KTtlPW5ldyBEYXRlKGUpO2U9ZS50b0lTT1N0cmluZygpLnN1YnN0cigwLDEwKTticmVhaztjYXNlICJjb2xvciI6Y2FzZSAiZGF0ZXRpbWUiOmNhc2UgImRhdGV0aW1lLWxvY2FsIjpjYXNlICJtb250aCI6ZT0xKmgoMSwxMik7YnJlYWs7Y2FzZSAibnVtYmVyIjpjYXNlICJyYW5nZSI6ZT0KMSpoKDEsMTAwKTticmVhaztjYXNlICJ0ZWwiOmU9MSpoKDEwLDUyKTtmb3IoYz0wOzM+YztjKyspZSs9IiAiK2goMTAwLDk5OSk7YnJlYWs7Y2FzZSAic2VhcmNoIjpjYXNlICJ0aW1lIjpjYXNlICJ3ZWVrIjplPTEqaCgxLDUyKTticmVhaztjYXNlICJ1cmwiOmU9Zyh5Y29tbS5kb20uX3NjcmF0Y2gucCwxLDEpK2coeWNvbW0uZG9tLl9zY3JhdGNoLmQsMSwxKSsiLnh5eiI7YnJlYWs7Y2FzZSAicmFkaW8iOmNhc2UgImNoZWNrYm94IjpicmVhaztjYXNlICJzZWxlY3Qtb25lIjpjYXNlICJzZWxlY3QtbXVsdGkiOmJyZWFrO2Nhc2UgImhpZGRlbiI6ZmllbFZhbHVlPSIiO2JyZWFrO2RlZmF1bHQ6aygicGFzc3dvcmQiKT9lPWcoeWNvbW0uZG9tLl9zY3JhdGNoLmNoLDYsMTUpOmsoImNwZiIpP2U9ZS5nZXJhckNQRigpOmsoImNucGoiKT9lPWUuZ2VyYXJDTlBKKCk6aygiaWUiKT9lPWcoeWNvbW0uZG9tLl9zY3JhdGNoLm4sNiwxMik6aygiY2VwIik/KGU9aCgxMCw5OSksZSs9Ii4iKwpoKDAsOTk5LDMpLGUrPSItIitoKDAsOTk5LDMpKTprKCJ6aXAiKT8oZT1oKDAsOTk5OTksNSksZSs9Ii0iK2goMCw5OTk5LDQpKTplPWcoeWNvbW0uZG9tLl9zY3JhdGNoLnQsMSxmKSxlPWUuc3Vic3RyKDAsZil9eSQoZCkudmFsdWU9ZX19fTsKeWNvbW0uZG9tLmdldEZvcm1FbGVtZW50cz1mdW5jdGlvbihhLGIsYyl7Yj1ifHx7fTt2YXIgZD17fSxlPXRoaXMuc2VsZWN0RWxlbWVudHMoYSksZixnLGgsayxsLHY9MCx3O2lmKGc9eSQoYSkpe2E9Yi5lbGVtZW50UHJlZml4TmFtZXx8Yi5wcmVmaXh8fGcuZ2V0QXR0cmlidXRlKCJkYXRhLXByZWZpeCIpfHwiIjtmb3IodmFyIHg9Yi5lbGVtZW50UG9zdGl4TmFtZXx8Yi5wb3N0Zml4fHxnLmdldEF0dHJpYnV0ZSgiZGF0YS1wb3N0Zml4Iil8fCIiLHM9MDtzPGUubGVuZ3RoO3MrKylpZihlW3NdLmdldEF0dHJpYnV0ZT8oaD1lW3NdLmdldEF0dHJpYnV0ZSgiZGF0YS1lZGl0LW1hc2siKXx8ZVtzXS5nZXRBdHRyaWJ1dGUoImVkaXRNYXNrIiksaz1lW3NdLmdldEF0dHJpYnV0ZSgiZGF0YS1zdG9yYWdlLW1hc2siKXx8ZVtzXS5nZXRBdHRyaWJ1dGUoInN0b3JhZ2VNYXNrIiksbD1lW3NdLmdldEF0dHJpYnV0ZSgiZGF0YS12YWx1ZS10eXBlIil8fGVbc10uZ2V0QXR0cmlidXRlKCJ2YWx1ZVR5cGUiKXx8CiJ0ZXh0Iik6KGs9aD0iIixsPSJ0ZXh0Iiksdz0hMCxmPWVbc10udHlwZS50b0xvd2VyQ2FzZSgpLGI9ZVtzXS5uYW1lfHxlW3NdLmlkLGIuc3Vic3RyKGIubGVuZ3RoLC14Lmxlbmd0aCk9PXgmJmIuc3Vic3RyKDAsYS5sZW5ndGgpPT1hJiYoYj1iLnN1YnN0cihhLmxlbmd0aCksYj1iLnN1YnN0cigwLGIubGVuZ3RoLXgubGVuZ3RoKSwiIjxiKSl7Zz0iIjtpZigicmFkaW8iPT1mfHwiY2hlY2tib3giPT1mKXc9ITEsInVuZGVmaW5lZCI9PXR5cGVvZiBkW2JdJiYoZFtiXT0iIik7c3dpdGNoKGYpe2Nhc2UgInRleHQiOmNhc2UgInBhc3N3b3JkIjpjYXNlICJ0ZXh0YXJlYSI6Y2FzZSAiZW1haWwiOmNhc2UgImhpZGRlbiI6Y2FzZSAiY29sb3IiOmNhc2UgImRhdGUiOmNhc2UgImRhdGV0aW1lIjpjYXNlICJkYXRldGltZS1sb2NhbCI6Y2FzZSAibW9udGgiOmNhc2UgInNlYXJjaCI6Y2FzZSAidGVsIjpjYXNlICJ0aW1lIjpjYXNlICJ1cmwiOmNhc2UgIndlZWsiOmc9ZVtzXS52YWx1ZSsKIiI7IiI8aCYmIiI8ayYmMDw9bC5pbmRleE9mKCJkYXRlIikmJihnPShnPWRhdGVUcmFuc2Zvcm0oZyxoLGspKT9nKyIiOiIiKTticmVhaztjYXNlICJudW1iZXIiOmNhc2UgInJhbmdlIjpnPWVbc10udmFsdWU7aXNOdW1iZXIoZykmJihnPWcudG9GbG9hdCgpKTticmVhaztjYXNlICJyYWRpbyI6Y2FzZSAiY2hlY2tib3giOmc9ZVtzXS5jaGVja2VkP2Vbc10udmFsdWU6IiI7dz0iIiE9PWc7YnJlYWs7Y2FzZSAic2VsZWN0LW9uZSI6Y2FzZSAic2VsZWN0LW11bHRpIjpnPWVbc10uc2VsZWN0ZWRJbmRleDtlW3NdLm9wdGlvbnNbZ10mJihnPWVbc10ub3B0aW9uc1tnXS52YWx1ZSk7YnJlYWs7Y2FzZSAiZmlsZSI6ImZ1bmN0aW9uIj09dHlwZW9mIGM/KGY9bmV3IEZpbGVSZWFkZXIsdisrLGYuX2ZpZWxkTmFtZT1iLGYuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXtkW3RoaXMuX2ZpZWxkTmFtZV09dGhpcy5yZXN1bHQ7di0tOzA+PXYmJmMoZCl9KSxmLnJlYWRBc0RhdGFVUkwoZVtzXS5maWxlc1swXSksCnc9ITEpOmc9ImFPblJlYWR5KCkgbm90IHByZXNlbnQgaW4ganMgY2FsbCB0byBnZXRGb3JtRWxlbWVudHMoKSJ9InN0cmluZyI9PXR5cGVvZiBnJiYwPD1nLmluZGV4T2YoIiwiKSYmKGc9ZW5jb2RlVVJJQ29tcG9uZW50KGcpKTt3JiYoZFtiXT1nKX19cmV0dXJuIGR9O3ljb21tLmRvbS5hZGRGb3JtRWxlbWVudD1mdW5jdGlvbihhLGIsYyl7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGIpO2Zvcih2YXIgZCBpbiBjKWMuaGFzT3duUHJvcGVydHkoZCkmJmIuc2V0QXR0cmlidXRlKGQsY1tkXSk7YS5hcHBlbmRDaGlsZChiKTtyZXR1cm4gYn07Cnljb21tLmRvbS5VUkwycG9zdD1mdW5jdGlvbihhLGIsYyl7dm9pZCAwIT09YSYmc2V0VGltZW91dChmdW5jdGlvbigpe3ZvaWQgMD09PWImJihiPSJfc2VsZiIpO3ZvaWQgMD09PWMmJihjPXdpbmRvdyk7dmFyIGQ9ImJvZHkucGhwIjthPWEuc3BsaXQoIj8iKTsyPT1hLmxlbmd0aD8oZD1hWzBdLGE9YVsxXSk6YT1hWzBdO2E9YS5zcGxpdCgiJiIpO2MuYXV4Rm9ybT1jLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImZvcm0iKTtjLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYy5hdXhGb3JtKTtjLmF1eEZvcm0uc2V0QXR0cmlidXRlKCJtZXRob2QiLCJwb3N0Iik7Yy5hdXhGb3JtLnNldEF0dHJpYnV0ZSgiYWN0aW9uIixkKTtjLmF1eEZvcm0uc2V0QXR0cmlidXRlKCJ0YXJnZXQiLGIpO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspe3ZhciBlPWFbZF0uc3BsaXQoIj0iKTsxPT1lLmxlbmd0aCYmKGVbMV09IiIpO3ljb21tLmRvbS5hZGRGb3JtRWxlbWVudChjLmF1eEZvcm0sImlucHV0IiwKe3R5cGU6ImhpZGRlbiIsaWQ6ZVswXSxuYW1lOmVbMF0sdmFsdWU6ZVsxXX0pfWMuYXV4Rm9ybS5zdWJtaXQoKX0sMUUzKX07eWNvbW0uZG9tLmRlbGV0ZUZpZWxkQ2xhc3M9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMgaW4gYSlhLmhhc093blByb3BlcnR5KGMpJiZ5JChjKS5kZWxldGVDbGFzcyhiKX07eWNvbW0uZG9tLnZpZXdwb3J0PWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXdpbmRvdyxiPSJpbm5lciI7YS5wYXJlbnQhPWE7KWE9YS5wYXJlbnQ7ImlubmVyV2lkdGgiaW4gd2luZG93fHwoYj0iY2xpZW50IixhPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keSk7cmV0dXJue3dpZHRoOmFbYisiV2lkdGgiXSxoZWlnaHQ6YVtiKyJIZWlnaHQiXX19O3ljb21tLmRvbS5nZXRMZWZ0PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2E7KWIrPWEub2Zmc2V0TGVmdCxhPWEub2Zmc2V0UGFyZW50O3JldHVybiBifTsKeWNvbW0uZG9tLmdldFRvcD1mdW5jdGlvbihhKXtmb3IodmFyIGI9MDthOyliKz1hLm9mZnNldFRvcCxhPWEub2Zmc2V0UGFyZW50O3JldHVybiBifTt5Y29tbS5kb20uZ2V0UG9zPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9MDtudWxsIT09YTthPWEub2Zmc2V0UGFyZW50KWIrPWEub2Zmc2V0TGVmdCxjKz1hLm9mZnNldFRvcDtyZXR1cm57eDpiLHk6Y319O19kdW1wKCJ5Y29tbS1kb20iKTsKdmFyIHljb21tTXNnQmFzZT1mdW5jdGlvbigpe3ZhciBhPXttZXNzYWdlUGVla2VyVGltZXI6bnVsbCxtZXNzYWdlU3RhY2s6W10sbXNnUHJvY3M6W10sX2RiZ0ZsYWdfbm9NZXNzYWdlUHJvY2Vzc29yUHJlc2VudDohMSxtc2dDb3VudDowLHNlcnZlck9mZmxpbmVGbGFnOm51bGwsZ3JhbnRNc2dQcm9jOmZ1bmN0aW9uKGIpe2lmKHZvaWQgMD09PWJ8fDA+PWIpYj1NYXRoLm1pbigyRTQsMiptZXNzYWdlUGVla2VySW50ZXJ2YWwpO3ZvaWQgMD09PWEubWVzc2FnZVBlZWtlclRpbWVyPygwPT09YS5tc2dDb3VudCYmX2R1bXB5KDE2LDEsIkNvbmZpZ3VyaW5nIHJlY2VpdmVycyBpbnRlcnZhbCB0byAiK2IrIm1zIiksYS5tZXNzYWdlUGVla2VyVGltZXI9c2V0VGltZW91dCh5Y29tbS5tc2cucGVlayxiKSk6X2R1bXB5KDE2LDEsIlJlY2VpdmVycyBpbnRlcnZhbCBhbHJlYWR5IGRlZmluZWQiKX0sZmVlZEJhY2s6ZnVuY3Rpb24oKXtpZigwPGRSb3dDb3VudCl7YS5tc2dDb3VudCsrO2Zvcih2YXIgYiBpbiB4RGF0YSlpZighaXNOYU4ocGFyc2VJbnQoYikpKXt2YXIgYz0KeERhdGFbYl07YS5tZXNzYWdlU3RhY2sucHVzaChbYy5zb3VyY2VVc2VySWQsYy5tZXNzYWdlLGMud1BhcmFtLGMubFBhcmFtXSl9aWYoMDxhLm1lc3NhZ2VTdGFjay5sZW5ndGgpaWYoMD09YS5tc2dQcm9jcy5sZW5ndGgpYS5fZGJnRmxhZ19ub01lc3NhZ2VQcm9jZXNzb3JQcmVzZW50fHxqc0R1bXBFbmFibGVkJiZ3aW5kb3cuYWxlcnQoIk1lc3NhZ2VzIGFycml2aW5nIGF0ICAnIitfQ3VycmVudEZpbGVOYW1lKyInICBidXQgdGhlcmUgaXMgbm90XG5hIHJlZ2lzdGVyZWQgbWVzc2FnZSBwcm9jZXNzb3IgaW4gb3JkZXIgdG8gcmVjZWl2ZSBpdC5cblVzZSBfcmVnaXN0ZXJNc2dQcm9jKCkgdG8gcmVnaXN0ZXIgaXQiKSxhLl9kYmdGbGFnX25vTWVzc2FnZVByb2Nlc3NvclByZXNlbnQ9ITA7ZWxzZSBmb3IoOzA8YS5tZXNzYWdlU3RhY2subGVuZ3RoOyl7Yj1hLm1lc3NhZ2VTdGFjay5sZW5ndGg7Zm9yKGM9MDtjPGEubXNnUHJvY3MubGVuZ3RoO2MrKykoIjxzY3JpcHQ+IithLm1zZ1Byb2NzW2NdKwoiKCk7XHgzYy9zY3JpcHQ+IikuZXZhbFNjcmlwdHMoKTtiPT1hLm1lc3NhZ2VTdGFjay5sZW5ndGgmJmEubWVzc2FnZVN0YWNrLnNoaWZ0KCl9fWEuZ3JhbnRNc2dQcm9jKG1lc3NhZ2VQZWVrZXJJbnRlcnZhbCl9LHBlZWs6ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoYS5tZXNzYWdlUGVla2VyVGltZXIpO2EubWVzc2FnZVBlZWtlclRpbWVyPW51bGw7dmFyIGI9InM9eV9tc2cmdT0iK3UrIiZhPXBlZWtNZXNzYWdlJmZvcm1JRD0iK2Zvcm1JRCsiJnRzPSIrKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiZjYWxsQmFja0Z1bmN0aW9uPXljb21tLm1zZy5mZWVkQmFjayZtZXNzYWdlUGVla2VySW50ZXJ2YWw9IittZXNzYWdlUGVla2VySW50ZXJ2YWw7bmV3IEFqYXguUmVxdWVzdCgicXVlcnkucGhwIix7bWV0aG9kOiJnZXQiLGFzeW5jaHJvbm91czohMCxwYXJhbWV0ZXJzOmIsb25Db21wbGV0ZTpmdW5jdGlvbihiKXsyMDA9PWIuc3RhdHVzP19RVUVSWV9SRVRVUk4oYik6KF9kdW1weSgxNiwKMSwiKioqIFhNTEh0dHBSZXF1ZXN0IGNhbGwgZmFpbHVyZSIpLHNldFRpbWVvdXQoYS5ub3RpZnlTZXJ2ZXJPZmZsaW5lLDUwMCkpfX0pfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGMsZCxlLGYpe2E9InM9eV9tc2cmdT0iK3UrIiZhPXBvc3RNZXNzYWdlIisodm9pZCAwIT1mPycmdGFyZ2V0VXNlcj0qJmJyb2FkY2FzdENvbmRpdGlvbj0iJytmKyciJzoiJmJyb2FkY2FzdENvbmRpdGlvbj0mdGFyZ2V0VXNlcj0iK2EpKyImZm9ybUlEPSIrZm9ybUlEKyImbWVzc2FnZT0iK2MrIiZ3UGFyYW09IitkKyImbFBhcmFtPSIrZSsiJnRzPSIrKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiZjYWxsQmFja0Z1bmN0aW9uPXljb21tLm1zZy5mZWVkQmFjayI7bmV3IEFqYXguUmVxdWVzdCgicXVlcnkucGhwIix7bWV0aG9kOiJnZXQiLGFzeW5jaHJvbm91czohMSxwYXJhbWV0ZXJzOmEsb25Db21wbGV0ZTpfUVVFUllfUkVUVVJOfSl9LGNsZWFuTXNnUXVldWU6ZnVuY3Rpb24oKXthLm1zZ1Byb2NzLmxlbmd0aD0KMH0sbm90aWZ5U2VydmVyT25saW5lOmZ1bmN0aW9uKCl7aWYobnVsbD09YS5zZXJ2ZXJPZmZsaW5lRmxhZ3x8MDxhLnNlcnZlck9mZmxpbmVGbGFnKXthLnNlcnZlck9mZmxpbmVGbGFnPTA7dmFyIGI9eSQoIm5vdGlmaWNhdGlvbkFyZWEiKTtiJiYoYi5zdHlsZS5kaXNwbGF5PSJub25lIik7ImZ1bmN0aW9uIj09dHlwZW9mIF9ub3RpZnlTZXJ2ZXJPbmxpbmUmJnNldFRpbWVvdXQoX25vdGlmeVNlcnZlck9ubGluZSw1MDApfX0sbm90aWZ5U2VydmVyT2ZmbGluZTpmdW5jdGlvbigpe2Euc2VydmVyT2ZmbGluZUZsYWc9KGEuc2VydmVyT2ZmbGluZUZsYWd8fDApKzE7dmFyIGI9eSQoIm5vdGlmaWNhdGlvbkFyZWEiKTtifHwoYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxiLmlkPSJub3RpZmljYXRpb25BcmVhIixiLnNldE9wYWNpdHkoOTApLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYiksZ2V0U3R5bGVSdWxlVmFsdWUoIi5ub3RpZmljYXRpb25BcmVhIik/Yi5jbGFzc05hbWU9CiJub3RpZmljYXRpb25BcmVhIjooYi5zdHlsZS56SW5kZXg9MUUzLGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLmxlZnQ9IjBweCIsYi5zdHlsZS50b3A9IjBweCIsYi5zdHlsZS5ib3JkZXI9IjFweCAjOTAwIHNvbGlkIixiLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iI2ZlZmVmZSIpLGIuaW5uZXJIVE1MPSI8ZGl2IHN0eWxlPSdwYWRkaW5nOiAzMnB4Jz48YmlnPjxiPlNlcnZlciBPZmZsaW5lPC9iPjwvYmlnPjxocj5Zb3VyIHNlcnZlciBoYXMgYmVjb21lIG9mZmxpbmUgb3IgaXMgbWlzc3BlbGxpbmcgYW5zd2VycyB3aGVuIHJlcXVlc3RlZC48YnI+V2FpdCBhIGZldyBtaW51dGVzIGFuZCB0cnkgYWdhaW4gbGF0ZXIsIG9yIHdhaXQgd2hpbGUgWWVBUEYgdHJ5IGFnYWluIGJ5IGl0c2VsZjwvZGl2PiZuYnNwOzxicj48aW1nIHNyYz0naHR0cDovL3llYXBmLmNvbS9pbWFnZXMveWVhcGYtbG9nby5wbmcnIHN0eWxlPSd3aWR0aDogMTI4cHgnPiIpO2Iuc3R5bGUud2lkdGg9CmRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD1kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCsicHgiO2Iuc3R5bGUuZGlzcGxheT0iIjsiZnVuY3Rpb24iPT10eXBlb2YgX25vdGlmeVNlcnZlck9mZmxpbmUmJnNldFRpbWVvdXQoX25vdGlmeVNlcnZlck9mZmxpbmUsNTAwKTthLmdyYW50TXNnUHJvYygpfSxyZWdpc3Rlck1zZ1Byb2M6ZnVuY3Rpb24oYil7dmFyIGM9ITA7X2R1bXB5KDE2LDEsIlJlZ2lzdGVyaW5nIG1lc3NhZ2UgcmVjZWl2ZXI6ICIrYik7Zm9yKHZhciBkPTA7ZDxhLm1zZ1Byb2NzLmxlbmd0aDtkKyspYS5tc2dQcm9jc1tkXT09YiYmKGM9ITEpO2MmJihhLm1zZ1Byb2NzW2EubXNnUHJvY3MubGVuZ3RoXT1iKTthLmdyYW50TXNnUHJvYyhtZXNzYWdlUGVla2VySW50ZXJ2YWwpfSxzdG9wTXNnUHJvYzpmdW5jdGlvbigpe2NsZWFyVGltZW91dChhLm1lc3NhZ2VQZWVrZXJUaW1lcil9fTtyZXR1cm4gYX07CiJmdW5jdGlvbiI9PXR5cGVvZiBhZGRPbkxvYWRNYW5hZ2VyJiZhZGRPbkxvYWRNYW5hZ2VyKGZ1bmN0aW9uKCl7InVuZGVmaW5lZCI9PXR5cGVvZiBtZXNzYWdlUGVla2VySW50ZXJ2YWwmJigidW5kZWZpbmVkIj09dHlwZW9mIGpzRHVtcEVuYWJsZWQmJihqc0R1bXBFbmFibGVkPTApLG1lc3NhZ2VQZWVrZXJJbnRlcnZhbD0xPT1qc0R1bXBFbmFibGVkPzE1RTM6NzUwKX0pO3ljb21tLm1zZz15Y29tbU1zZ0Jhc2UoKTtfZHVtcCgieWNvbW0tbXNnIik7CnZhciB5Y29tbVNTRUJhc2U9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3dpbmRvdy5TU0VfVU5JTklUSUFMSVpFRD0tMTt3aW5kb3cuU1NFX0NMT1NJTkc9MDt3aW5kb3cuU1NFX05PTk9QRVJBVElPTkFMPTE7d2luZG93LlNTRV9PUEVSQVRJT05BTD0yO3ZhciBnPXtwb2xsVGltZW91dDpNYXRoLm1pbig5RTUsTWF0aC5tYXgoIm51bWJlciI9PXR5cGVvZiBkP2Q6NkU0LDZFNCkpLHByZWZHYXRld2F5OihlfHwiU1NFIikudG9VcHBlckNhc2UoKSxkYmdEaXY6eSQoZiksZGVidWdFbmFibGVkOiExLHNldERlYnVnOmZ1bmN0aW9uKGEpe2cuZGVidWdFbmFibGVkPWF8fCExfSxkZWJ1ZzpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGIsYz1iPSExO2lmKGcuZGVidWdFbmFibGVkKXtmb3IodmFyIGE9cGFkKGEuZ2V0SG91cnMoKSwyKSsiOiIrcGFkKGEuZ2V0TWludXRlcygpLDIpKyI6IitwYWQoYS5nZXRTZWNvbmRzKCksMikrIiBTU0U6ICIsZD0wO2Q8YXJndW1lbnRzLmxlbmd0aDtkKyspYSs9CmFyZ3VtZW50c1tkXS50cmltKCkrIiAiLDA8PWFyZ3VtZW50c1tkXS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoIkVSUk9SIikmJihiPSEwKSwwPD1hcmd1bWVudHNbZF0udG9VcHBlckNhc2UoKS5pbmRleE9mKCJTVEFUVVMiKSYmKGM9ITApLDA8PWFyZ3VtZW50c1tkXS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoIldBUk4iKSYmKGM9ITApO2I/KGNvbnNvbGUuZXJyb3IoYSksYj0ibGFiZWwtZGFuZ2VyIik6Yz8oY29uc29sZS53YXJuKGEpLGI9ImxhYmVsLXdhcm5pbmciKTooY29uc29sZS5sb2coYSksYj0iIik7InVuZGVmaW5lZCIhPXR5cGVvZiBnLmRiZ0RpdiYmKGE9IjxkaXYgY2xhc3M9J2xhYmVsIHswfScgc3R5bGU9J2Rpc3BsYXk6IGlubGluZS1ibG9jayc+ezF9PC9kaXY+PGJyPiIuZm9ybWF0KGIsYSksYj1nLmRiZ0Rpdi5pbm5lckhUTUwuc3BsaXQoIjxicj4iKSwxMDA8Yi5sZW5ndGgmJihiLnNwbGljZSgwLDEwMC1iLmxlbmd0aCksZy5kYmdEaXYuaW5uZXJIVE1MPWIuam9pbigiPGJyPiIpKSwKZy5kYmdEaXYuaW5uZXJIVE1MKz1hKX19LGdldExvY2F0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQubG9jYXRpb24mJmRvY3VtZW50LmxvY2F0aW9uLmhyZWY/ZG9jdW1lbnQubG9jYXRpb24uaHJlZjoiIn0sZ2V0Rm9sZGVyOmZ1bmN0aW9uKGEpe3ZhciBiPWEubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4gYS5zdWJzdHIoMCxiKzEpfSxycGM6ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9OyJ1bmRlZmluZWQiIT10eXBlb2YgZy5zc2Vfc2Vzc2lvbl9pZCYmKGIuc3NlX3Nlc3Npb25faWQ9Zy5zc2Vfc2Vzc2lvbl9pZCk7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGMsZCl7Zy5kZWJ1ZygiT1VUOiAiK2EpO2cucnBjTWV0aG9kKCJfc3NlIixhLGIsZnVuY3Rpb24oYSxiLGUpezIwMD09YT9jKGUpOmQoYSl9LCExKX0pfSxwb2xsOmZ1bmN0aW9uKCl7Zy5wb2xsRW5hYmxlZCYmZy5ycGMoInBlZWtNZXNzYWdlIikudGhlbihmdW5jdGlvbihhKXtpZihhKXtnLmRlYnVnKCJJTjogZGF0YTogIisKSlNPTi5zdHJpbmdpZnkoYSkpO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWcuZGlzcGF0Y2hFdmVudChhW2JdLmV2ZW50LHtkYXRhOmFbYl0uZGF0YX0pfHxnLm1lc3NhZ2Uoe2RhdGE6YVtiXS5kYXRhfSl9c2V0VGltZW91dChnLnBvbGwsZy5wb2xsVGltZW91dCl9KX0sdXNlckFsaXZlOmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGcuX3VzZXJBbGl2ZVNjaGVkdWxlcik7dmFyIGE9ZnVuY3Rpb24oYSl7dmFyIGM9ITE7YSYmKGM9IkNMT1NFIj09KChhWzBdfHxhKS5ldmVudHx8IiIpLnRvVXBwZXJDYXNlKCkpO2M/YigpOihnLmRlYnVnKCJJTjogVXNlciBpcyBhbGl2ZSIpLGcuc3RhdGUhPVNTRV9PUEVSQVRJT05BTCYmZy5kZWJ1ZygiVW5leHBlY3RlZCBTU0Ugc3RhdGU6ICIrZy5zdGF0ZSksZy5zY2hlZHVsZVVzZXJBbGl2ZShnLnVzZXJBbGl2ZUludGVydmFsKSl9LGI9ZnVuY3Rpb24oYSl7Zy5kZWJ1ZygiU1RBVFVTOiBVc2VyIGxvZ2dlZCBvdXQiKTtnLmNsb3NlKGEpfTtnLnN0YXRlPT0KU1NFX09QRVJBVElPTkFMP2cucnBjKCJ1c2VyQWxpdmUiKS50aGVuKGEpLmNhdGNoKGIpOmcuc2NoZWR1bGVVc2VyQWxpdmUoTWF0aC5tYXgoMTAwLGcudXNlckFsaXZlSW50ZXJ2YWwvMTAwKSl9LHNjaGVkdWxlVXNlckFsaXZlOmZ1bmN0aW9uKGEpe2E9YXx8Zy51c2VyQWxpdmVJbnRlcnZhbDtjbGVhclRpbWVvdXQoZy5fdXNlckFsaXZlU2NoZWR1bGVyKTtjb25zb2xlLmxvZygiJWMgc2NoZWR1bGluZyBVc2VyQWxpdmUgaW5kaWNhdG9yIGZvciB7MH1tcyIuZm9ybWF0KGEpLCJiYWNrZ3JvdW5kOiAjMjIyOyBjb2xvcjogIzQyOUJEQSIpO2cuX3VzZXJBbGl2ZVNjaGVkdWxlcj1zZXRUaW1lb3V0KGcudXNlckFsaXZlLGEpfSxhdHRhY2hVc2VyOmZ1bmN0aW9uKGIpe2cucnBjKCJhdHRhY2hVc2VyIix7dzphLHVzZXI6Zy51c2VyfSkudGhlbihmdW5jdGlvbihjKXtnLmRlYnVnKCJJTjogYXR0YWNoIGluZm8iKTtjJiYoYz1jWzBdfHxjLGMub2smJihnLnc9YSxnLnNzZV9zZXNzaW9uX2lkPQpjLnNzZV9zZXNzaW9uX2lkLGcudXNlckFsaXZlSW50ZXJ2YWw9MUUzKk1hdGgubWluKDkwMCxNYXRoLm1heCg2MSxjLnVzZXJBbGl2ZUludGVydmFsKSksZy5kZWJ1Zygic2V0IHVzZXJBbGl2ZUludGVydmFsIHZhbHVlIHRvIHswfW1zICIuZm9ybWF0KGcudXNlckFsaXZlSW50ZXJ2YWwpKSxiKCkpKX0pfSxzZW5kUGluZzpmdW5jdGlvbihiKXtnLnN0YXRlPT1TU0VfT1BFUkFUSU9OQUwmJmcucnBjKCJwaW5nIix7dzphLHVzZXI6Zy51c2VyfSkudGhlbihiKX0sYWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIpeyJ1bmRlZmluZWQiPT10eXBlb2YgZy5ldmVudHMmJihnLmV2ZW50cz17fSk7InVuZGVmaW5lZCI9PXR5cGVvZiBnLmV2ZW50c1thXSYmKGcuZXZlbnRzW2FdPVtdKTtnLmV2ZW50c1thXS5wdXNoKFtnLnN0YXRlLGJdKTtnLnN0YXRlPT1TU0VfT1BFUkFUSU9OQUwmJihnLnBvbGxFbmFibGVkfHxnLmV2dFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKGEsYiksInJlYWR5Ij09CnRyaW0oYS50b0xvd2VyQ2FzZSgpKSYmZy5kaXNwYXRjaEV2ZW50KCJyZWFkeSIpKTtyZXR1cm4gZ30sZGlzcGF0Y2hFdmVudDpmdW5jdGlvbihhLGIpe3ZhciBjPSExO2lmKGcuc3RhdGU9PVNTRV9PUEVSQVRJT05BTHx8Im9uZXJyb3IiPT1hKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiBnLmV2ZW50cylmb3IodmFyIGQ9MDtkPChnLmV2ZW50c1thXXx8W10pLmxlbmd0aDtkKyspZy5ldmVudHNbYV1bZF1bMV0oYiksY3w9MTtldmVudE5hbWUxPWE7ZXZlbnROYW1lMj0ib25fIithOyJmdW5jdGlvbiI9PXR5cGVvZiBnW2V2ZW50TmFtZTFdPyhnW2V2ZW50TmFtZTFdKGIpLGN8PTEpOiJmdW5jdGlvbiI9PXR5cGVvZiBnW2V2ZW50TmFtZTJdPyhnW2V2ZW50TmFtZTJdKGIpLGN8PTEpOmN8PTB9cmV0dXJuIGN9LHN0YXJ0UG9sbGluZzpmdW5jdGlvbigpe2NsZWFyVGltZW91dChnLmV2dEd1YXJkaWFuKTtnLnBvbGxFbmFibGVkPSEwO2cuc3RhdGU9U1NFX09QRVJBVElPTkFMO2cuZGlzcGF0Y2hFdmVudCgicmVhZHkiLAp7Z2F0ZXdheToiUG9sbGluZyJ9KTtzZXRUaW1lb3V0KGcucG9sbCwxMjUpO2cuZGVidWcoIlNUQVRVUzogcG9sbGluZyBmb3IgbWVzc2FnZXMuIHBvbGxUaW1lb3V0OiB7MH1tcyIuZm9ybWF0KGcucG9sbFRpbWVvdXQpKX0sZ3VhcmRpYW5UaW1lb3V0OmZ1bmN0aW9uKGEpe2cuZGVidWcoIkd1YXJkaWFuIFRpbWVvdXQhIExldCdzIHVzZSBwb2xsaW5nIG1vZGUiKTtjbGVhclRpbWVvdXQoZy5ldnRHdWFyZGlhbik7Zy5fX2Rlc3Ryb3lfXygpO2cuc3RhcnRQb2xsaW5nKCl9LF9fZGVzdHJveV9fOmZ1bmN0aW9uKCl7Zy5jbG9zaW5nPSEwO2NsZWFyVGltZW91dChnLmV2dEd1YXJkaWFuKTtnLmRlYnVnKCJERVNUUk9ZSU5HIik7Zy5zdGF0ZT1TU0VfVU5JTklUSUFMSVpFRDtnLmV2dFNvdXJjZT1udWxsO2cuR1VJRD1udWxsfSxjbG9zZTpmdW5jdGlvbihiKXtjbGVhclRpbWVvdXQoZy5ldnRHdWFyZGlhbik7Zy5jbG9zaW5nfHwoZy5jbG9zaW5nPSEwLGcuc3RhdGU9U1NFX0NMT1NJTkcsCmcuZGVidWcoIlNUQVRVUzogQ0xPU0UiKSxnLnJwYygiZGV0YWNoVXNlciIse3c6YSx1c2VyOmcudXNlcn0pLnRoZW4oZnVuY3Rpb24oKXtnLnN0YXRlPVNTRV9VTklOSVRJQUxJWkVEO2cucG9sbEVuYWJsZWQ9ITE7Zy5fX2Rlc3Ryb3lfXygpO2cuY2xvc2luZz0hMX0pLmNhdGNoKGZ1bmN0aW9uKCl7Zy5jbG9zaW5nPSExO3NldFRpbWVvdXQoZy5jbG9zZSwxNTAwKX0pKX0sY2xvc2VFdmVudDpmdW5jdGlvbihhKXtjbGVhclRpbWVvdXQoZy5ldnRHdWFyZGlhbik7Y29uc29sZS5sb2coIiVjIGNsb3NlOiB7MH0iLmZvcm1hdChhLmRhdGF8fCJOVUxMIiksImNvbG9yOiAjODc4N0ZGIik7Zy5fX2Rlc3Ryb3lfXygpfSxlcnJvckV2ZW50OmZ1bmN0aW9uKGEpe2NsZWFyVGltZW91dChnLmV2dEd1YXJkaWFuKTtjb25zb2xlLmxvZygiJWMgZXJyb3I6IHswfSIuZm9ybWF0KGEuZGF0YXx8Ik5VTEwiKSwiY29sb3I6ICM4Nzg3RkYiKTtnLmRlYnVnKCJFUlJPUjogd2hpbGUgdXNpbmcgU1NFIik7CmcuZGlzcGF0Y2hFdmVudCgib25lcnJvciIpO2cuc3RhdGU9U1NFX05PTk9QRVJBVElPTkFMO3NldFRpbWVvdXQoZy5zdGFydHVwLDI1MDApfSxvcGVuRXZlbnQ6ZnVuY3Rpb24oYSl7Y2xlYXJUaW1lb3V0KGcuZXZ0R3VhcmRpYW4pO2NvbnNvbGUubG9nKCIlYyBvcGVuOiB7MH0iLmZvcm1hdChhLmRhdGF8fCJOVUxMIiksImNvbG9yOiAjODc4N0ZGIik7Zy5kZWJ1ZygiU1RBVFVTOiBPUEVOIik7Zy5zY2hlZHVsZVVzZXJBbGl2ZShnLnVzZXJBbGl2ZUludGVydmFsLzEwMCk7Zy5kaXNwYXRjaEV2ZW50KCJvbm9wZW4iKTt5Y29tbS5tc2cmJiJmdW5jdGlvbiI9PXR5cGVvZiB5Y29tbS5tc2cubm90aWZ5U2VydmVyT25saW5lJiZ5Y29tbS5tc2cubm90aWZ5U2VydmVyT25saW5lKCl9LG1lc3NhZ2VFdmVudDpmdW5jdGlvbihhKXtjbGVhclRpbWVvdXQoZy5ldnRHdWFyZGlhbik7Y29uc29sZS5sb2coIiVjIG1lc3NhZ2U6IHswfSIuZm9ybWF0KGEuZGF0YXx8Ik5VTEwiKSwiY29sb3I6ICM4Nzg3RkYiKTsKaWYoYSYmMiE9YS50YXJnZXQucmVhZHlTdGF0ZSl7Zy5kZWJ1ZygiTUVTU0FHRSIpO2lmKGcuc3RhdGU+U1NFX0NMT1NJTkcpe2cuc3RhdGU9U1NFX09QRVJBVElPTkFMO2cuZGVidWcoInVzZXJBbGl2ZUludGVydmFsOiB7MH1tcyIuZm9ybWF0KGcudXNlckFsaXZlSW50ZXJ2YWwpKTtmb3IodmFyIGIgaW4gZy5ldmVudHMpaWYoZy5ldmVudHMuaGFzT3duUHJvcGVydHkoYikpZm9yKHZhciBjPTA7YzxnLmV2ZW50c1tiXS5sZW5ndGg7YysrKXt2YXIgZD1nLmV2ZW50c1tiXVtjXTsxPmRbMF0mJihkWzBdPTEsZy5ldnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihiLGRbMV0pKX1nLmRpc3BhdGNoRXZlbnQoIm9ucmVhZHkiLHtnYXRld2F5OiJTU0UifSl9aWYoZy5zdGF0ZT5TU0VfVU5JTklUSUFMSVpFRCYmImZ1bmN0aW9uIj09dHlwZW9mIGcub25tZXNzYWdlKWcub25tZXNzYWdlKGEuZGF0YSl9ZWxzZSBnLmNsb3NlKCl9LHBpbmdFdmVudDpmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiJWMgcGluZzogezB9Ii5mb3JtYXQoYS5kYXRhfHwKIk5VTEwiKSwiY29sb3I6ICM4Nzg3RkYiKX0sc3RhcnR1cDpmdW5jdGlvbihhKXthPShhfHxnLnByZWZHYXRld2F5fHwiU1NFIikudG9VcHBlckNhc2UoKTtjb25zb2xlLmxvZygiJWMgc3RhcnR1cDogezB9Ii5mb3JtYXQoYSksImNvbG9yOiAjODc4N0ZGIik7Zy5wcmVmR2F0ZXdheT1hO2cuZXZ0R3VhcmRpYW4mJmNsZWFyVGltZW91dChnLmV2dEd1YXJkaWFuKTsic3RyaW5nIiE9dHlwZW9mIGcuR1VJRHx8Zy5zdGF0ZTw9U1NFX05PTk9QRVJBVElPTkFMPygic3RyaW5nIiE9dHlwZW9mIGcuR1VJRCYmKGcuR1VJRD1nZW5lcmF0ZVVVSUQoKSksZy5hdHRhY2hVc2VyKGZ1bmN0aW9uKCl7Zy5zdGF0ZT1TU0VfTk9OT1BFUkFUSU9OQUw7IlNTRSI9PWcucHJlZkdhdGV3YXkmJiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuRXZlbnRTb3VyY2U/KGcuZGVidWcoIklORk86IEF0dGFjaGluZyBldmVudHMiKSxnLmV2dFNvdXJjZT9nLmRlYnVnKCJJTkZPOiBSZXVzaW5nIGNvbXBvbmVudCIpOgooZy5kZWJ1ZygiSU5GTzogQWxsIG5ldyBldnRTb3VyY2UiKSxnLmV2dFNvdXJjZT1uZXcgRXZlbnRTb3VyY2UoZy5fZGF0YUxvY2F0aW9uXysiP3NpPSIrbWQ1KGcuc3NlX3Nlc3Npb25faWQpKSxnLmV2dFNvdXJjZS5vbmVycm9yPWcuZXJyb3JFdmVudCksZy5ldnRTb3VyY2Uub25vcGVuPWcub3BlbkV2ZW50LGcuZXZ0U291cmNlLm9uY2xvc2U9Zy5jbG9zZUV2ZW50LGcuZXZ0U291cmNlLm9ubWVzc2FnZT1nLm1lc3NhZ2VFdmVudCxnLmFkZEV2ZW50TGlzdGVuZXIoInBpbmciLGcucGluZ0V2ZW50LCExKSxnLmFkZEV2ZW50TGlzdGVuZXIoInJlc2V0IixnLnJlc2V0RXZlbnQsITEpLGcuZGVidWcoIklORk86IENvbmZpZ3VyaW5nIGd1YXJkaWFuVGltZW91dCB0byB7MH1tcyIuZm9ybWF0KDEuNSpnLnVzZXJBbGl2ZUludGVydmFsKSksZy5ldnRHdWFyZGlhbj1zZXRUaW1lb3V0KGcuZ3VhcmRpYW5UaW1lb3V0LDEuNSpnLnVzZXJBbGl2ZUludGVydmFsKSxnLnNjaGVkdWxlVXNlckFsaXZlKGcudXNlckFsaXZlSW50ZXJ2YWwvCjEwMCkpOmcuc3RhcnRQb2xsaW5nKCl9KSk6KGcuZGVidWdFbmFibGVkPSEwLGcuZGVidWcoIkVSUk9SOiBTU0Ugb2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQiKSl9LHJlc2V0RXZlbnQ6ZnVuY3Rpb24oKXtnLmNsb3NlKCk7Zy5fX2Rlc3Ryb3lfXygpO2cuc3RhdGU9U1NFX05PTk9QRVJBVElPTkFMO3NldFRpbWVvdXQoZy5zdGFydHVwLDM1MDApfSxpbml0OmZ1bmN0aW9uKCl7Zy5zdGF0ZT1TU0VfVU5JTklUSUFMSVpFRDtpZigidW5kZWZpbmVkIj09dHlwZW9mIGN8fG51bGw9PT1jKXt2YXIgYT1nLGQ7ZD1nLmdldExvY2F0aW9uKCk7dmFyIGU9ZC5sYXN0SW5kZXhPZigiLyIpO2Q9ZC5zdWJzdHIoMCxlKzEpKyJzc2UucGhwIjthLl9kYXRhTG9jYXRpb25fPWR9ZWxzZSBnLl9kYXRhTG9jYXRpb25fPWM7ImZpbGU6Ij09Zy5fZGF0YUxvY2F0aW9uXy5zdWJzdHIoMCw1KT9nLmRlYnVnKCJFUlJPUjogJyIrZy5fZGF0YUxvY2F0aW9uXysiJyBpcyBub3QgYSBjb3JyZWN0IGRhdGEgbG9jYXRpb24iKToKKGcudXNlcj1udWxsIT09YiYmInVuZGVmaW5lZCIhPXR5cGVvZiBiP2I6Z2VuZXJhdGVVVUlEKCksYT1nLmdldEZvbGRlcihnLmdldExvY2F0aW9uKCkpLGQ9Zy5nZXRGb2xkZXIoZy5fZGF0YUxvY2F0aW9uXyksZy5ycGNNZXRob2Q9YT09ZD95Y29tbS5pbnZva2U6eWNvbW0uY3JhdmUsZy5zdGFydHVwKCkpO3JldHVybiBnfX0saD0tMjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZywic3RhdGUiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaH0sc2V0OmZ1bmN0aW9uKGEpe2EhPWgmJihjb25zb2xlLmxvZygiJWMgU1NFIHN0YXRlIGNoYW5nZWQgZnJvbSB7MH0gdG8gezF9Ii5mb3JtYXQoaCxhKSwiYmFja2dyb3VuZDogIzIyMjsgY29sb3I6ICNiYWRhNTUiKSxoPWEpfX0pO3JldHVybiBnLmluaXQoKX07X2R1bXAoInljb21tLXNzZSIpOwp2YXIgeWNvbW1XZWJTb2NrZXRDbGllbnRPYmo9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt5YW5rOmZ1bmN0aW9uKGEsYixjLGQpe2NvbnNvbGUubG9nKCJiYWQgY29uZmlndXJlZCIpOyJmdW5jdGlvbiI9PXR5cGVvZiBkJiZkKDUwMSwiQmFkIGNvbmZpZ3VyZWQiLG51bGwsbnVsbCxudWxsKX19LGU9e30sZj1ifHxndWlkKCksZyxoLGs9bnVsbCxsPSJGIitndWlkKCkucmVwbGFjZSgvLS9nLCIiKS50b0xvd2VyQ2FzZSgpLnN1YnN0cig4LDEyKSsiXyIsdj0xRTMsdz1bXSx4PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj1hLmdldEhvdXJzKCksYz1hLmdldE1pbnV0ZXMoKSxiPSgxMD5iPyIwIitiOmIpKyI6IisoMTA+Yz8iMCIrYzpjKTtyZXR1cm4gYS5nZXRGdWxsWWVhcigpKyIvIisoYS5nZXRNb250aCgpKzEpKyIvIithLmdldERhdGUoKSsiICAiK2J9LHM9ZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIiVjIHswfSB7MX0iLmZvcm1hdCh4KCksYXx8IiIpLCJjb2xvcjogIyM1MTU3RkYiKX0sCnA9ZnVuY3Rpb24oKXtoJiZjbGVhckludGVydmFsKGgpO3RyeXtnPW5ldyBXZWJTb2NrZXQoaykscygiV2ViU29ja2V0IC0gc3RhdHVzICIrZy5yZWFkeVN0YXRlKSxnLm9ub3Blbj1mdW5jdGlvbihhKXtzKCJXZWxjb21lIC0gc3RhdHVzICIrdGhpcy5yZWFkeVN0YXRlKTtnLnNlbmQoInVuYW1lOiIrZik7aD1zZXRJbnRlcnZhbChxLDNFNCk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUub25vcGVuKWUub25vcGVuKGEpfSxnLm9ubWVzc2FnZT1mdW5jdGlvbihhKXtfZHVtcHkoNCwxLCI8Yj4iK2EuZGF0YSsiPC9iPiIpO3RyeXt2YXIgYj1KU09OLnBhcnNlKGEuZGF0YSk7aWYoYi5jYWxsYmFja0lkJiYidW5kZWZpbmVkIiE9dFtiLmNhbGxiYWNrSWRdKXRbYi5jYWxsYmFja0lkXSgyMDAsYi5lcnJvcixiLmRhdGEsYi51c2VyTXNnLGIuZGF0YUNvbnRleHQsYi5nZW9tZXRyeSk7dmFyIGM9KGIucGFyYW1ldGVyc3x8W10pLnN8fCJ1bmtub3duIixkPSgoYi5wYXJhbWV0ZXJzfHxbXSkuc3x8CiJ1bmtub3duIikrIi4iKygoYi5wYXJhbWV0ZXJzfHxbXSkuYXx8InVua25vd24iKTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygd1tjXSl3W2NdKChiLnBhcmFtZXRlcnN8fFtdKS5hLGIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3W2RdKXdbZF0oYik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUub25tZXNzYWdlKWUub25tZXNzYWdlKGEpfWNhdGNoKGYpe319LGcub25jbG9zZT1mdW5jdGlvbihhKXtoJiZjbGVhckludGVydmFsKGgpO3MoIkRpc2Nvbm5lY3RlZCAtIHN0YXR1cyAiK3RoaXMucmVhZHlTdGF0ZSk7c2V0VGltZW91dChwLDE1MDApO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uY2xvc2UpZS5vbmNsb3NlKGEpfX1jYXRjaChhKXtzKGEpfX0scT1mdW5jdGlvbigpezE9PWcucmVhZHlTdGF0ZT9nLnNlbmQoIi4iKTplLnJlY29ubmVjdCgpfTtlLnF1aXQ9ZnVuY3Rpb24oKXtudWxsIT1nJiYocygiR29vZGJ5ZSEiKSxnLmNsb3NlKCksZz1udWxsKX07ZS5yZWNvbm5lY3Q9ZnVuY3Rpb24oKXtlLnF1aXQoKTsKc2V0VGltZW91dChwLDE1MDApfTt2YXIgdD13aW5kb3d8fHNlbGYsQz1mdW5jdGlvbihhKXtjb25zb2xlLmxvZygiZGVsZXRpbmcgIithKTtkZWxldGUgdFthXX07ZS5zZXRFdmVudEhhbmRsZXI9ZnVuY3Rpb24oYSxiLGMpeyJzdHJpbmciPT10eXBlb2YgYiYmKCJzdHJpbmciPT10eXBlb2YgYz8idW5kZWZpbmVkIj09dHlwZW9mIGE/ZGVsZXRlIHdbYisiLiIrY106d1tiKyIuIitjXT1hOiJ1bmRlZmluZWQiPT10eXBlb2YgYT9kZWxldGUgd1tiXTp3W2JdPWEpfTtlLnlhbms9ZnVuY3Rpb24oYSxiLGMsZCl7ZD1kfHxmdW5jdGlvbigpe307dmFyIGU9Kyt2LGY9bCtlO3ljb21tLl9DQkNvbnRyb2xbZl09e3JlYWR5OiExfTt0W2ZdPWZ1bmN0aW9uKGEsYixjLGUsZyxoKXtkKGEsYixjLGUsZyxoKTtfZHVtcHkoNCwxLGYpO0MoZil9O2MueHFfYnlwYXNzPSJib29sZWFuIj09dHlwZW9mIGMueHFfYnlwYXNzP2MueHFfYnlwYXNzOiExO2MueHFfYnlwYXNzPSEwPT09Yy54cV9ieXBhc3N8fAoiWUVTIj09KGMueHFfYnlwYXNzfHwiTk8iKS50b1VwcGVyQ2FzZSgpO2M9eWNvbW0udXJsSnNvbkFzUGFyYW1zKGMpO2cuc2VuZChKU09OLnN0cmluZ2lmeSh7czphLGE6YixmaWVsZE5hbWU6Y1swXSxmaWVsZFZhbHVlOmNbMV0sY2FsbGJhY2tJZDpmfSkpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtDKGYpfSwxNUUzKX07YT1hfHwiIjsiIjxhPyhrPWEsX2RldmljZUlkPWN8fGd1aWQoKSxzZXRUaW1lb3V0KHAsMTUwMCksYT1lKTooY29uc29sZS5hbGVydCgiWW91IG5lZWQgdG8gaW5kaWNhdGUgdGhlIHdlYlNlcnZpY2UgVVJMIGluIG9yZGVyIHRvIHVzZSB5Y29tbVdlYlNvY2tldENsaWVudE9iaigpIiksYT1kKTtyZXR1cm4gYX07X2R1bXAoInljb21tLXdlYnNvY2tldCIpOwp2YXIgeUNhbGVuZGFyPWZ1bmN0aW9uKGEpe3ZhciBiPXt9O2IuY2ZnPWF8fHt9O2IuY2ZnLnZpZXc9KyhiLmNmZy52aWV3fHwwKTtiLmNmZy5vcmllbnRhdGlvbj0rKGIuY2ZnLm9yaWVudGF0aW9ufHwwKTtiLmNmZy5kYXRlPWIuY2ZnLmRhdGV8fG5ldyBEYXRlO2IuY2ZnLmRheUVudHJ5RGl2aXNpb249Yi5jZmcuZGF5RW50cnlEaXZpc2lvbnx8MjA7Yi5jZmcuY2VsbFNpemU/KGIuY2ZnLmNlbGxTaXplLndpZHRoPWIuY2ZnLmNlbGxTaXplLndpZHRofHxudWxsLGIuY2ZnLmNlbGxTaXplLmhlaWdodD1iLmNmZy5jZWxsU2l6ZS5oZWlnaHR8fG51bGwpOmIuY2ZnLmNlbGxTaXplPXt3aWR0aDpudWxsLGhlaWdodDpudWxsfTtiLmNmZy5kaXZDb250YWluZXJOYW1lPWIuY2ZnLmRpdkNvbnRhaW5lck5hbWV8fCIiO2IuY2ZnLmNhbGxiYWNrPWIuY2ZnLmNhbGxiYWNrfHxudWxsO2IuY29udGV4dD17fTtiLmNvbnRleHQuZGF0ZVNjb3BlPXtmaXJzdDoiIixsYXN0OiIifTtiLmNvbnRleHQubkNvbHM9CjA7Yi5jb250ZXh0Lm5Sb3dzPTA7Yi5zZXREaXZDb250YWluZXJOYW1lPWZ1bmN0aW9uKGEpe2IuY2ZnLmRpdkNvbnRhaW5lck5hbWU9YTtyZXR1cm4gYn07Yi5zZXRDZWxsU2l6ZT1mdW5jdGlvbihhLGQpe2IuY2ZnLmNlbGxTaXplLndpZHRoPWIuY2ZnLmNlbGxTaXplLndpZHRofHxhO2IuY2ZnLmNlbGxTaXplLmhlaWdodD1iLmNmZy5jZWxsU2l6ZS5oZWlnaHR8fGQ7cmV0dXJuIGJ9O2Iuc2V0Vmlldz1mdW5jdGlvbihhKXtiLmNmZy52aWV3PSthJTM7cmV0dXJuIGJ9O2Iuc2V0Q2FsbGJhY2s9ZnVuY3Rpb24oYSl7Yi5jZmcuY2FsbGJhY2s9YTtyZXR1cm4gYn07Yi5zZXREYXRlPWZ1bmN0aW9uKGEpe2IuY2ZnLmRhdGU9YXx8Yi5jZmcuZGF0ZTtyZXR1cm4gYn07Yi5nZXREYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIGIuY2ZnLmRhdGV9O2Iuc2V0T3JpZW50YXRpb249ZnVuY3Rpb24oYSl7Yi5jZmcub3JpZW50YXRpb249K2ElMjtyZXR1cm4gYn07Yi5kcmF3PWZ1bmN0aW9uKGEpe3ZhciBkPQpbIkwiLCJQIl07aWYoYT15JChiLmNmZy5kaXZDb250YWluZXJOYW1lKSl7dHJ5e2IuY2ZnLnN0YXR1cz0wO251bGwhPWIuY2ZnLmNhbGxiYWNrJiZiLmNmZy5jYWxsYmFjayhiLCJET01Mb2NrZWQiLGEpO2Zvcih2YXIgZT1udWxsLGY9bnVsbCxnPW51bGwsaD1udWxsLGs9bnVsbCxsPW51bGwsdj1udWxsLHc9Mj5iLmNmZy52aWV3Pzg2NEU1OjZFNCpiLmNmZy5kYXlFbnRyeURpdmlzaW9uLHg9MCxzPTAscD0iY2FsRGF5IitkW2IuY2ZnLnZpZXclMl07YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpO2IuY29udGV4dC5vQ2FsVGFibGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGFibGUiKTtiLmNvbnRleHQub0NhbFRhYmxlLmNlbGxQYWRkaW5nPTA7Yi5jb250ZXh0Lm9DYWxUYWJsZS5jZWxsU3BhY2luZz0wO3ZhciBxPWIuY29udGV4dC5vQ2FsVGFibGUuaW5zZXJ0Um93KC0xKSx0PXEuaW5zZXJ0Q2VsbCgpO3QuY2xhc3NOYW1lPSJjYWxCYW5kIjsKdmFyIGQ9ITAsQz0wLEU9e307bnVsbCE9Yi5jZmcuY2VsbFNpemUuaGVpZ2h0JiYoRS5oZWlnaHQ9cGFyc2VJbnQoYi5jZmcuY2VsbFNpemUuaGVpZ2h0KSsicHgiKTtudWxsIT1iLmNmZy5jZWxsU2l6ZS53aWR0aCYmKEUud2lkdGg9cGFyc2VJbnQoYi5jZmcuY2VsbFNpemUud2lkdGgpKyJweCIpO3ZhciB5PWIuY29udGV4dC5kYXRlU2NvcGUuZmlyc3QsRj1iLmNvbnRleHQuZGF0ZVNjb3BlLmxhc3Q7eS5zZXRIb3VycygxMik7Ri5zZXRIb3VycygxMik7dmFyIG09ZnVuY3Rpb24oKXtmPWIuY2ZnLmRpdkNvbnRhaW5lck5hbWUrIl9lbXB0eV8iK0M7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bWVyZ2VPYmplY3QoRSxhLnN0eWxlKTthLmlkPWY7YS5jbGFzc05hbWU9cCsiQ2VsbCAiK3ArIkVtcHR5Q2VsbCI7dC5hcHBlbmRDaGlsZChhKTswPT1iLmNmZy5vcmllbnRhdGlvbiYmeCsrO0MrKztudWxsIT1iLmNmZy5jYWxsYmFjayYmYi5jZmcuY2FsbGJhY2soYiwiZ2V0RW1wdHlEYXlDb250ZW50IiwKYSl9LEQ9ZnVuY3Rpb24oYSl7MD09YT8oZj1iLmNmZy5kaXZDb250YWluZXJOYW1lKyJfZGF5XyIrei50b1VEYXRlKCkuc3Vic3RyaW5nKDAsOCksZT16LmdldERhdGUoKSk6KGU9ei5nZXRIb3VycygpKyI6Iit6LmdldE1pbnV0ZXMoKSxmPWIuY2ZnLmRpdkNvbnRhaW5lck5hbWUrIl9kYXlfIit6LnRvVURhdGUoKS5zdWJzdHJpbmcoMCwxMikpfSx6PW5ldyBEYXRlKHkpLEI9KEYteikvdysxO2lmKDA9PT1iLmNmZy52aWV3KWlmKDA9PWIuY2ZnLm9yaWVudGF0aW9uKWZvcihuPTA7bjx5LmdldERheSgpO24rKyltKCk7ZWxzZXt6LnNldERhdGUoei5nZXREYXRlKCkteS5nZXREYXkoKSk7dmFyIEE9W10sSD1uZXcgRGF0ZSh6KTtmb3Iobj0wO248Yi5jb250ZXh0Lm5Sb3dzO24rKylBW25dPW5ldyBEYXRlKEgpLEguc2V0RGF0ZShILmdldERhdGUoKSsxKX1mb3IoOzA8QjspZHx8KHE9Yi5jb250ZXh0Lm9DYWxUYWJsZS5pbnNlcnRSb3coLTEpLHQ9cS5pbnNlcnRDZWxsKCksdC5jbGFzc05hbWU9CiJjYWxCYW5kIixkPSEwKSxlPSIiLDE9PWIuY2ZnLm9yaWVudGF0aW9uP3o8eXx8ej5GP20oKTowPT09Yi5jZmcudmlld3x8MT09PWIuY2ZnLnZpZXc/RCgwKToyPT09Yi5jZmcudmlldz9EKDEpOl9kdW1weSg4LDEsIk5vdCBpbXBsZW1lbnRlZCIpOjA9PWIuY2ZnLm9yaWVudGF0aW9uJiYoMD09PWIuY2ZnLnZpZXd8fDE9PT1iLmNmZy52aWV3P0QoMCk6Mj09PWIuY2ZnLnZpZXc/RCgxKTpfZHVtcHkoOCwxLCJOb3QgaW1wbGVtZW50ZWQiKSksIiI8ZSYmKGc9cCsiQ2VsbCIsMD09PXouZ2V0RGF5KCkmJihnKz0iICIrcCsiRnJlZUNlbGwiKSx6LmdldERhdGUoKT09Yi5jZmcuZGF0ZS5nZXREYXRlKCkmJihnKz0iICIrcCsiSGlnaGxpZ2h0Iiksaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxtZXJnZU9iamVjdChFLGsuc3R5bGUpLGsuaWQ9ZixrLmNsYXNzTmFtZT1nLG1lcmdlT2JqZWN0KEUsay5zdHlsZSksay5kYXRlPXosbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIiksCmwuaWQ9ZisiX3RhZyIsbC5jbGFzc05hbWU9ImNhbFRhZyIsbnVsbCE9Yi5jZmcuY2FsbGJhY2smJihoPWIuY2ZnLmNhbGxiYWNrKGIsImdldFRhZ0NvbnRlbnQiLGwpfHwiIiwiIjxoJiYoZT1oKSksbC5pbm5lckhUTUw9ZSxrLmFwcGVuZENoaWxkKGwpLG51bGwhPWIuY2ZnLmNhbGxiYWNrJiYodj1iLmNmZy5jYWxsYmFjayhiLCJnZXRDZWxsQ29udGVudCIsayl8fCIiLCIiPHYmJihrLmlubmVySFRNTCs9dikpLHQuYXBwZW5kQ2hpbGQoaykpLDE9PWIuY2ZnLm9yaWVudGF0aW9uP3ouc2V0VGltZSh6LmdldFRpbWUoKSt3KmIuY29udGV4dC5uUm93cyk6ei5zZXRUaW1lKHouZ2V0VGltZSgpK3cpLHgrKyx4Pj1iLmNvbnRleHQubkNvbHMmJih4PTAscysrLGQ9ITEsMT09Yi5jZmcub3JpZW50YXRpb24mJih6PUFbc10pKSxCLS07aWYoZCl7Zm9yKDt4PGIuY29udGV4dC5uQ29sczspbSgpO3g9MDtkPSExfWEuYXBwZW5kQ2hpbGQoYi5jb250ZXh0Lm9DYWxUYWJsZSl9Y2F0Y2goRyl7X2R1bXB5KDgsCjEsIkVSUk9SOiAiK0cubWVzc2FnZSl9Yi5jZmcuc3RhdHVzPTE7bnVsbCE9Yi5jZmcuY2FsbGJhY2smJmIuY2ZnLmNhbGxiYWNrKGIsIkRPTVJlbGVhc2VkIixhKX1yZXR1cm4gYn07Yi5idWlsZD1mdW5jdGlvbihhLGQsZSl7Yi5jZmcub3JpZW50YXRpb249ZXx8Yi5jZmcub3JpZW50YXRpb247Yi5jZmcudmlldz1kfHxiLmNmZy52aWV3O2IuY2ZnLmRhdGU9YXx8Yi5jZmcuZGF0ZTtpZih5JChiLmNmZy5kaXZDb250YWluZXJOYW1lKSl7YT1uZXcgRGF0ZShiLmNmZy5kYXRlKTtkPW51bGw7dmFyIGY9ZT0wO3N3aXRjaChiLmNmZy52aWV3KXtjYXNlIDA6ZT03O2Y9NTthLnNldERhdGUoMSk7ZD1uZXcgRGF0ZShhKTtkLnNldERhdGUoYS5kYXlzSW5Nb250aCgpKTticmVhaztjYXNlIDE6ZT0xO2Y9Nztmb3IoYT1uZXcgRGF0ZShiLmNmZy5kYXRlKTswPGEuZ2V0RGF5KCk7KWEuc2V0VGltZShhLmdldFRpbWUoKS04NjRFNSk7ZD1uZXcgRGF0ZShhKTtkLnNldFRpbWUoYS5nZXRUaW1lKCkrCjUxODRFNSk7YnJlYWs7Y2FzZSAyOmU9MTtmPU1hdGgucm91bmQoMTQ0MC9iLmNmZy5kYXlFbnRyeURpdmlzaW9uKTthLnNldEhvdXJzKDYpO2Euc2V0TWludXRlcygwKTtkPW5ldyBEYXRlKGEpO2Quc2V0SG91cnMoMjEpO2Quc2V0TWludXRlcyg2MC1iLmNmZy5kYXlFbnRyeURpdmlzaW9uKTticmVhaztkZWZhdWx0Ol9kdW1weSg4LDEsIk5vdCBpbXBsZW1lbnRlZCIpfWIuY29udGV4dC5kYXRlU2NvcGUuZmlyc3Q9YTtiLmNvbnRleHQuZGF0ZVNjb3BlLmxhc3Q9ZDsxPT09Yi5jZmcub3JpZW50YXRpb24/KGIuY29udGV4dC5uQ29scz1mLGIuY29udGV4dC5uUm93cz1lKTooYi5jb250ZXh0Lm5Db2xzPWUsYi5jb250ZXh0Lm5Sb3dzPWYpO2IuZHJhdyhiKTtfZHVtcHkoOCwxLCJCdWlsZCBjYWxlbmRhciBvbiAiK2IuY2ZnLmRhdGUudG9VRGF0ZSgpKyIgVmlldzogIitiLmNmZy52aWV3KyIgT3JpZW50YXRpb246ICIrYi5jZmcub3JpZW50YXRpb24rIiBjb2xzOiAiK2UrIiByb3dzOiAiKwpmKX1lbHNlIF9kdW1weSg4LDEsIkVSUk9SOiAiK2IuY2ZnLmRpdkNvbnRhaW5lck5hbWUrIiBub3QgZm91bmQgb24gdGhhdCBwYWdlIik7cmV0dXJuIGJ9O2IuZWFjaD1mdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSYmYi5jb250ZXh0Lm9DYWxUYWJsZSl7dmFyIGQ9Yi5jZmcuZGl2Q29udGFpbmVyTmFtZSsiX2RheV8iLGU9ZnVuY3Rpb24oZSl7ZT1iLmNvbnRleHQub0NhbFRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO2Zvcih2YXIgZz0wO2c8ZS5sZW5ndGg7ZysrKWVbZ10uaWQuc3Vic3RyKDAsZC5sZW5ndGgpPT1kJiZhKGVbZ10pfTtlKCJkaXYiKTtlKCJzcGFuIil9cmV0dXJuIGJ9O3JldHVybiBifTtfZHVtcCgieWNhbGVuZGFyIik7CmZ1bmN0aW9uIF9keW5DaGVja0NoaWxkcyhhLGIpe3ZhciBjPWIuY2hpbGRPcGVuQ29uZGl0aW9uO2lmKCIiPGMpe3ZhciBjPVBhcnNlci5ldmFsdWF0ZShjLGEpLGQ9eSQoYi5uYW1lKyJfY2hpbGRzIik7ZCYmKGQuc3R5bGUuZGlzcGxheT1jPyJibG9jayI6Im5vbmUiKX19ZnVuY3Rpb24gZHluQ2hlY2tDaGlkcyhhLGIpe3ZvaWQgMD09YiYmKGI9d2luZG93LmV2ZW50fHxhcmd1bWVudHMuY2FsbGVlLmNhbGxlci5hcmd1bWVudHNbMF0pO2IudGFyZ2V0JiYoYj1iLnRhcmdldCk7dmFyIGM9W10sZDtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJnkkKGQpJiYoY1tkXT15JChkKS52YWx1ZSk7aWYoYVtiLmlkXSlfZHluQ2hlY2tDaGlsZHMoYyxhW2IuaWRdKTtlbHNlIGZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmX2R5bkNoZWNrQ2hpbGRzKGMsYVtkXSl9CmZ1bmN0aW9uIF9keW5Db25maWdPbkNoYW5nZShhLGIpe2EmJmEub25jaGFuZ2UhPV9fY2JPbkNoYW5nZV9fJiYoYS5keW5PbkNoYW5nZT1hLm9uY2hhbmdlLGEub25jaGFuZ2U9dm9pZCAwPT1iP19fZHluT25DaGFuZ2VfXzpiKX1mdW5jdGlvbiBkeW5Db25maWdPbmNoYW5nZShhLGIpe3ZhciBjPSJvYmplY3QiIT10eXBlb2YgYT9hLnNwbGl0KCIsIik6YTtpZigwPGMubGVuZ3RoKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKV9keW5Db25maWdPbkNoYW5nZSh5JChjW2RdKSxiKTtlbHNlIGZvcihkIGluIGMpYy5oYXNPd25Qcm9wZXJ0eShkKSYmX2R5bkNvbmZpZ09uQ2hhbmdlKHkkKGQpLGIpfQpmdW5jdGlvbiBkeW5Db25maWdDaGVja0JveENoaWxkcyhhLGIpe3ZvaWQgMD09YiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikpO3ZvaWQgMD09YSYmKGE9ITEpO2Zvcih2YXIgYyxkLGU9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxmPTA7ZjxiLmxlbmd0aDtmKyspe2M9ITE7aWYoImNoZWNrYm94Ij09YltmXS50eXBlKXtjPWJbZl0uaWQrIi4iO2Q9MDtmb3IodmFyIGc9ZisxO2c8ZS5sZW5ndGg7ZysrKXt2YXIgaD1lW2ddLmlkOyJzdHJpbmciPT10eXBlb2YgaCYmaC5zdWJzdHIoMCxjLmxlbmd0aCk9PWMmJihkeW5TZXRFbGVtZW50RGlzcGxheShlW2ddLmlkLGJbZl0uaWQsYltmXS52YWx1ZSksZCsrKX1jPSEwfWVsc2UidGV4dCI9PWJbZl0udHlwZSYmKGM9ITApO2MmJmJbZl0ub25jaGFuZ2UhPV9fY2JPbkNoYW5nZV9fJiYoYltmXS5keW5PbkNoYW5nZT1iW2ZdLm9uY2hhbmdlLGJbZl0ub25jaGFuZ2U9X19jYk9uQ2hhbmdlX18sCmJbZl0uZHluU2F2ZU9uQ2hhbmdlPWEpfX1mdW5jdGlvbiBkeW5UYWJsZUVudW1lcmF0ZUNlbGxFbGVtZW50cyhhLGIsYyl7Zm9yKHZvaWQgMD09YyYmKGM9Mik7YzxhLnJvd3MubGVuZ3RoO2MrKylmb3IodmFyIGQ9MDtkPGEucm93c1tjXS5jZWxscy5sZW5ndGg7ZCsrKXthQ2VsbD1hLnJvd3NbY10uY2VsbHNbZF07dmFyIGU9YUNlbGwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxmO2ZvcihmIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShmKSYmYihlW2ZdKX19CmZ1bmN0aW9uIGR5blJlbnVtYmVyRWxlbWVudHMoYSxiLGMpe3ZhciBkPVtdLGU9MDtkeW5UYWJsZUVudW1lcmF0ZUNlbGxFbGVtZW50cyhiLGZ1bmN0aW9uKGEpeyJ1bmRlZmluZWQiIT10eXBlb2YgYS5pZCYmKGE9YS5pZC5zcGxpdCgiLiIpLDA8Yy5pbmRleE9mKGFbMF0pJiYoYT1zdHIyaW50KGFbMV0pLDA+ZC5pbmRleE9mKGEpJiYoZFtlKytdPWEpKSl9LDEpO2Zvcih2YXIgZiBpbiBkKWlmKGQuaGFzT3duUHJvcGVydHkoZikpe2E9ZFtmXTtmb3IodmFyIGcgaW4gYyljLmhhc093blByb3BlcnR5KGcpJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY1tnXSsiLiIremVyb1BhZChhLDIpKS5pZD1jW2ddKyIuIit6ZXJvUGFkKGYsMikpfX1mdW5jdGlvbiBfZHluQ2xlYW5UYWJsZVJvdyhhLGIsYyl7Zm9yKHZhciBkPTA7ZDxiLnJvd3NbY10uY2hpbGROb2Rlcy5sZW5ndGg7ZCsrKWR5bkNsZWFuQ2hpbGRzKGEsYi5yb3dzW2NdLmNoaWxkTm9kZXNbZF0sITApfQpmdW5jdGlvbiBkeW5DbGVhbkNoaWxkcyhhLGIsYyxkKXtiIGluc3RhbmNlb2YgVGV4dCYmKGI9Yi5uZXh0U2libGluZyk7aWYodm9pZCAwIT1iKXt2b2lkIDA9PWMmJihjPSExKTt2b2lkIDA9PWQmJihkPSEwKTt2YXIgZTtlPXZvaWQgMCE9YSYmbnVsbCE9YT9hLmlkKyIuIjoiKi4iO2I9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKXt2YXIgZz1iW2ZdLmlkO2lmKCJzdHJpbmciPT10eXBlb2YgZyYmKGcuc3Vic3RyKDAsZS5sZW5ndGgpPT1lfHxjfHwiKi4iPT1lKSYmKGQmJiIqLiIhPWUmJmR5blNldEVsZW1lbnREaXNwbGF5KGJbZl0uaWQsYS5pZCxhLnZhbHVlKSwiKi4iPT1lfHwhYS5jaGVja2VkKSlpZigiY2hlY2tib3giPT1iW2ZdLnR5cGUmJihiW2ZdLmNoZWNrZWQ9ITEpLCJyYWRpbyI9PWJbZl0udHlwZSYmKGJbZl0uY2hlY2tlZD0hMSksInRleHQiPT1iW2ZdLnR5cGUmJihiW2ZdLnZhbHVlPSIiKSwibnVtYmVyIj09YltmXS50eXBlJiYKKGJbZl0udmFsdWU9IiIpLHZvaWQgMCE9YltmXS5yb3dzKXtmb3IoOzI8YltmXS5yb3dzLmxlbmd0aDspX2R5bkNsZWFuVGFibGVSb3coYSxiW2ZdLDIpLGJbZl0uZGVsZXRlUm93KDIpO2lmKDE8YltmXS5yb3dzLmxlbmd0aClmb3IoZz0wO2c8YltmXS5yb3dzWzFdLmNoaWxkTm9kZXMubGVuZ3RoO2crKylkeW5DbGVhbkNoaWxkcyhhLGJbZl0ucm93c1sxXS5jaGlsZE5vZGVzW2ddLCEwLCExKX1lbHNlIGlmKHZvaWQgMCE9YltmXS5jZWxscylmb3IoZz0wO2c8YltmXS5jZWxscy5sZW5ndGg7ZysrKWR5bkNsZWFuQ2hpbGRzKGEsYltmXS5jZWxsc1tnXSwhMCxkKTtlbHNlIHZvaWQgMCE9YltmXS50eXBlJiZfX2NiT25DaGFuZ2VfXyhiW2ZdKX19fQpmdW5jdGlvbiBkeW5UYWJsZURlbFJvdyhhLGIpe2Zvcih2b2lkIDA9PWImJihiPTIpO3ZvaWQgMCE9YSYmIShhIGluc3RhbmNlb2YgSFRNTFRhYmxlUm93RWxlbWVudCk7KWE9YS5wYXJlbnROb2RlO2lmKGEpe3ZhciBjPWEucGFyZW50Tm9kZTtjLnJvd3MubGVuZ3RoPmI/KF9keW5DbGVhblRhYmxlUm93KGEsYyxhLnJvd0luZGV4KSxjLmRlbGV0ZVJvdyhhLnJvd0luZGV4KSk6X2R5bkNsZWFuVGFibGVSb3coYSxjLGEucm93SW5kZXgpfWVsc2UgYWxlcnQoIllvdXIgYnV0dG9uIGlzIG91dHNpZGUgYSB0YWJsZSIpfWZ1bmN0aW9uIGR5blRhYmxlRGVsQWxsUm93cyhhKXtmb3IoOzA8YS5yb3dzLmxlbmd0aDspZHluVGFibGVEZWxSb3coYS5yb3dzWzBdLDApfWZ1bmN0aW9uIF9keW5FeHBsb2RlVGFnKGEpe3ZhciBiPWEubWF0Y2goL1xkKyQvKVswXTtyZXR1cm5bYS5zdWJzdHIoMCxhLmxlbmd0aC1iLmxlbmd0aCksYl19CmZ1bmN0aW9uIGR5blRhYmxlQ2xvbmVSb3coYSxiKXtmb3IoO3ZvaWQgMCE9YSYmIShhIGluc3RhbmNlb2YgSFRNTFRhYmxlUm93RWxlbWVudCk7KWE9YS5wYXJlbnROb2RlO2lmKGEpe2Zvcih2YXIgYz1hLnBhcmVudE5vZGUsZD1hLmNsb25lTm9kZSghMCksZT0wO2U8ZC5jZWxscy5sZW5ndGg7ZSsrKWZvcih2YXIgZj1kLmNlbGxzW2VdLGc9MDtnPGYuY2hpbGROb2Rlcy5sZW5ndGg7ZysrKXt2YXIgaD1mLmNoaWxkTm9kZXNbZ107aWYoIiI8aC5pZCl7Zm9yKHZhciBrPV9keW5FeHBsb2RlVGFnKGguaWQpLGw9a1sxXSxsPTA7eSQoa1swXSt6ZXJvUGFkKGwsMikpOylsKys7aC5pZD1rWzBdK3plcm9QYWQobCwyKTtoLm5hbWU9aC5pZDtoLm9uY2hhbmdlPWJ9aC52YWx1ZT1udWxsfXJldHVybiBjLmluc2VydEJlZm9yZShkLGEubmV4dFNpYmxpbmcpfWFsZXJ0KCJZb3VyIGJ1dHRvbiBpcyBvdXRzaWRlIGEgdGFibGUiKTtyZXR1cm4gbnVsbH0KZnVuY3Rpb24gZHluVGFibGVDbG9uZUxhc3RSb3coYSl7YT15JChhKTswPGEucm93cy5sZW5ndGgmJmR5blRhYmxlQ2xvbmVSb3coYS5yb3dzW2Eucm93cy5sZW5ndGgtMV0pfQpmdW5jdGlvbiBkeW5TZXRFbGVtZW50RGlzcGxheShhLGIsYyl7aWYoYT15JChhKSl7dmFyIGQ9eSQoYik7aWYoZCl7dmFyIGU7aWYoInJhZGlvIj09ZC50eXBlKWZvcihiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKGIpLHZvaWQgMD09YyYmMDxiLmxlbmd0aCYmKGM9YltiLmxlbmd0aC0xXS52YWx1ZSksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWJbZF0uY2hlY2tlZCYmKGU9YltkXS52YWx1ZSk7ZWxzZSJjaGVja2JveCI9PWQudHlwZT9kLmNoZWNrZWQmJihlPWQudmFsdWUpOmU9ZC52YWx1ZTt2b2lkIDA9PWMmJihjPWUpO2M9Yz09ZT8iIjoibm9uZSI7aWYoInRhYmxlIj09YS50eXBlKWZvcihlPTA7ZTxhLnJvd3MubGVuZ3RoO2UrKylhLnJvd3NbZV0uc3R5bGUuZGlzcGxheT1jO2Vsc2UgYS5zdHlsZS5kaXNwbGF5PWN9fX0KZnVuY3Rpb24gZHluU2V0RGlzcGxheShhLGIpe2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uc3R5bGUuZGlzcGxheT1iLF9kdW1weSgyLDEsYVtjXS5pZCxhW2NdLnN0eWxlLmRpc3BsYXkpfWZ1bmN0aW9uIGR5blNldFZpc2liaWxpdHkoYSxiKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdLnN0eWxlLnZpc2liaWxpdHk9YixfZHVtcHkoMiwxLGFbY10uaWQsYVtjXS5zdHlsZS52aXNpYmlsaXR5KX1mdW5jdGlvbiBkeW5SZW1vdmVFbGVtZW50cyhhKXtmb3IodmFyIGI9YS5sZW5ndGgtMTswPD1iO2ItLSlhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9ZnVuY3Rpb24gZHluVGFibGVQcmludChhLGIsYyl7fQpmdW5jdGlvbiBjYWxjR3JpZEFkZEl0ZW0oYSxiLGMsZCxlLGYsZyxoLGssbCl7dm9pZCAwPT1oJiYoaD0hMSk7dm9pZCAwPT1rJiYoaz0iIik7dm9pZCAwPT1sJiYobD0iMiIpO3ZhciB2PSEwLHc9ZS5zcGxpdCgiLCIpO2lmKCFoKWZvcih2YXIgeCBpbiB3KXcuaGFzT3duUHJvcGVydHkoeCkmJnZvaWQgMD09Ylt3W3hdXSYmKHY9ITEpO3Y/dm9pZCAwPT1hW2NdPyhhW2NdPVtdLGFbY10udGl0bGU9ZCxhW2NdLmZpZWxkTGlzdD1lLGFbY10uY2FsY0V4cHI9ZixhW2NdLnJlc3VsdENlbGxQb3N0Zml4PWcsYVtjXS51bml0cz1rLGFbY10uZGVjaW1hbFBsYWNlcz1sKTpjb25zb2xlLmxvZygiRmllbGQgJyIrYysiJyBhbHJlYWR5IGV4aXN0cyBpbiBjYWxjR3JpZCIpOmNvbnNvbGUubG9nKCJTb21lIGZpZWxkcyBkb2VzIG5vdCBleGlzdHMgaW4gKCIrYisiKSBsaXN0Iil9dmFyIF9jZ19ydWxlcz1bXTsKZnVuY3Rpb24gY2FsY0dyaWRTZXRSdWxlcyhhLGIsYyl7dm9pZCAwPT1fY2dfcnVsZXNbYS5pZF0mJihfY2dfcnVsZXNbYS5pZF09W10pO19jZ19ydWxlc1thLmlkXS5ydWxlcz1iO19jZ19ydWxlc1thLmlkXS5vbkNvbHVtbnM9Y31mdW5jdGlvbiBjYWxjR3JpZFNldENlbGxzR3VpZGVzKGEsYixjKXt2b2lkIDA9PV9jZ19ydWxlc1thLmlkXSYmKF9jZ19ydWxlc1thLmlkXT1bXSk7X2NnX3J1bGVzW2EuaWRdLmFyZWE9W107X2NnX3J1bGVzW2EuaWRdLmFyZWEuY29sU2V0PWI7X2NnX3J1bGVzW2EuaWRdLmFyZWEucm93U2V0PWN9ZnVuY3Rpb24gY2FsY0dyaWRHZXRDb2xzR3VpZGUoYSl7dmFyIGI9bnVsbDt2b2lkIDAhPWEmJnZvaWQgMCE9X2NnX3J1bGVzW2EuaWRdJiYoYj1fY2dfcnVsZXNbYS5pZF0uYXJlYS5jb2xTZXQpO3JldHVybiBifQpmdW5jdGlvbiBjYWxjR3JpZEdldFJvd3NHdWlkZShhKXt2YXIgYj1udWxsO3ZvaWQgMCE9YSYmdm9pZCAwIT1fY2dfcnVsZXNbYS5pZF0mJihiPV9jZ19ydWxlc1thLmlkXS5hcmVhLnJvd1NldCk7cmV0dXJuIGJ9ZnVuY3Rpb24gY2FsY0dyaWRFbnVtZXJhdGVDZWxscyhhLGIsYyl7dmFyIGQ9ITE7aWYoZD1fY2dfcnVsZXNbYS5pZF0pe2E9ZC5hcmVhLmNvbFNldDt2YXIgZT1kLmFyZWEucm93U2V0LGY7Zm9yKGYgaW4gZSlpZihlLmhhc093blByb3BlcnR5KGYpKWZvcih2YXIgZyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZykpe3ZhciBoPXkkKGYrIl8iK2FbZ10ubmFtZSk7aCYmKHZvaWQgMCE9Yz8oZD0hMSxjLmVkaXRhYmxlJiYoZD1hW2ddLmVkaXRhYmxlJiZlW2ZdLmVkaXRhYmxlKSxjLm5hbWUmJihkPWR8fGFbZ10ubmFtZT09Yy5uYW1lfHxlW2ZdLm5hbWU9PWMubmFtZSkpOmQ9ITAsZCYmYihoKSl9fX0KZnVuY3Rpb24gY2FsY0dyaWRDbGVhbkNvbnRlbnQoYSl7dmFyIGI9W107Yi52YWx1ZT0iIjtiLmNhbGNHcmlkU2V0PWEuaWQ7Y2FsY0dyaWRFbnVtZXJhdGVDZWxscyhhLGZ1bmN0aW9uKGEpe2R5blNldENlbGxWYWx1ZShhLmlkLGIpfSl9ZnVuY3Rpb24gY2FsY0dyaWRDbGVhbkNvbHVtbihhLGIpe3ZhciBjPV9jZ19ydWxlc1thLmlkXTtpZihjKXt2YXIgZD1jLmFyZWEucm93U2V0LGM9Yy5hcmVhLmNvbFNldFtiXSxlO2lmKGMpZm9yKHZhciBmIGluIGQpZC5oYXNPd25Qcm9wZXJ0eShmKSYmKGU9eSQoZisiXyIrYy5uYW1lKSkmJmR5blNldENlbGxWYWx1ZShlLmlkLCIiKX19ZnVuY3Rpb24gY2FsY0dyaWRHZXRSdWxlcyhhKXtyZXR1cm4oYT1fY2dfcnVsZXNbYS5pZF0pP2EucnVsZXM6e319CmZ1bmN0aW9uIGNhbGNHcmlkR2V0QXNzb2NpYXRlZFJ1bGUoYSxiKXt2YXIgYz1udWxsLGQ9Y2FsY0dyaWRHZXRSdWxlcyhhKSxlO2ZvcihlIGluIGQpbnVsbD09YyYmZC5oYXNPd25Qcm9wZXJ0eShlKSYmYj09ZSYmKGM9ZFtlXSk7cmV0dXJuIGN9ZnVuY3Rpb24gY2FsY0dyaWRHZXRSdWxlVGl0bGUoYSxiKXt2YXIgYz1udWxsLGQ9Y2FsY0dyaWRHZXRBc3NvY2lhdGVkUnVsZShhLGIpO251bGwhPWQmJihjPWQudGl0bGUpO3JldHVybiBjfWZ1bmN0aW9uIGNhbGNHcmlkR2V0TmV4dEZpZWxkTmFtZShhLGIpe3ZhciBjPW51bGwsZD1jYWxjR3JpZEdldFJ1bGVzKGEpLGU9ITEsZjtmb3IoZiBpbiBkKW51bGw9PWMmJmQuaGFzT3duUHJvcGVydHkoZikmJihlJiYoYz1mKSxlPWY9PWIpO3JldHVybiBjfQpmdW5jdGlvbiBjYWxjR3JpZFJlY2FsYyhhLGIpe3ZhciBjPV9jZ19ydWxlc1thLmlkXTtpZihjKXt2YXIgYz1jLnJ1bGVzLGQ7Zm9yKGQgaW4gYylpZihjLmhhc093blByb3BlcnR5KGQpKXt2YXIgZT1jW2RdO2lmKGUuZmllbGRMaXN0JiYwPD1lLmZpZWxkTGlzdC5pbmRleE9mKGIpKXt2YXIgZj1lLmZpZWxkTGlzdC5zcGxpdCgiLCIpLGc9W10saDtmb3IoaCBpbiBmKWYuaGFzT3duUHJvcGVydHkoaCkmJihnW2ZbaF1dPXkkKGZbaF0pLmlubmVySFRNTCk7dmFyIGY9IiI8ZS5yZXN1bHRDZWxsUHJlZml4P2UucmVzdWx0Q2VsbFByZWZpeCsiXyIrZDoiIjxlLnJlc3VsdENlbGxQb3N0Zml4P2QrIl8iK2UucmVzdWx0Q2VsbFBvc3RmaXg6ZCxnPVBhcnNlci5ldmFsdWF0ZShlLmNhbGNFeHByLGcpLGs9MCxrPWsudG9GaXhlZChlLmRlY2ltYWxQbGFjZXMpLGc9Zy50b0ZpeGVkKGUuZGVjaW1hbFBsYWNlcyksZz1pc05hTihnKT9rOmlzSW5maW5pdHkoZyk/azpnK2UudW5pdHM7eSQoZikuaW5uZXJIVE1MPQpnO3kkKGYpLnN0eWxlLmJvcmRlcj0ic29saWQgMXB4ICM5NkNCRkYifX19fWZ1bmN0aW9uIGR5blRhYmxlR2V0Q2VsbFBhcmVudEdyaWQoYSl7Zm9yKGE9eSQoYSkucGFyZW50Tm9kZTsiVEFCTEUiIT1hLnRhZ05hbWU7KWE9YS5wYXJlbnROb2RlO3JldHVybiJUQUJMRSI9PWEudGFnTmFtZT9hOm51bGx9ZnVuY3Rpb24gZHluVGFibGVDcmVhdGUoYSxiKXtpZihhKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpO2MuaWQ9YjtjLm5hbWU9YjthLmFwcGVuZENoaWxkKGMpfWVsc2UgY29uc29sZS5sb2coIkVycm9yOiBZb3UgY2Fubm90IGNyZWF0ZSBhIGR5blRhYmxlIHdpdGhvdXQgYSBkaXYgdG8gY29udGFpbiBpdCIpO3JldHVybiBjfQpmdW5jdGlvbiBkeW5UYWJsZVNldFJvd1RpdGxlcyhhLGIsYyxkKXtmb3IodmFyIGUgaW4gYylpZihjLmhhc093blByb3BlcnR5KGUpJiYiX2NvbnRleHRfIiE9ZSl7Zm9yKDthLnJvd3MubGVuZ3RoPGI7KXZhciBmPWEuaW5zZXJ0Um93KGEucm93cy5sZW5ndGgpLGY9Zi5pbnNlcnRDZWxsKDApO2Y9YS5pbnNlcnRSb3coYS5yb3dzLmxlbmd0aCk7Zj1mLmluc2VydENlbGwoMCk7Zi5pZD1lOyIiPGNbZV0ucGFyZW50JiYoZi5zdHlsZS5wYWRkaW5nTGVmdD0iMThweCIsZi5zdHlsZS5mb250U2l6ZT0iODAlIik7dmFyIGc9Y1tlXS50aXRsZTt2b2lkIDAhPWQmJmNbZV0uZ3JhcGgmJihnPSc8YSBocmVmPSJqYXZhc2NyaXB0OicrZCsiKCciK2EuaWQrIicsJyIrZSsiJylcIj4iK2crIjwvYT4iKTtmLmlubmVySFRNTD1nfX0KZnVuY3Rpb24gZHluVGFibGVTZXRDb2xUaXRsZXMoYSxiLGMpe3ZhciBkLGU9YixmO2ZvcihmIGluIGMpaWYoYy5oYXNPd25Qcm9wZXJ0eShmKSl7Zm9yKHZhciBnPTA7ZzxhLnJvd3MubGVuZ3RoO2crKyl7Zm9yKGQ9YS5yb3dzW2ddO2QuY2VsbHMubGVuZ3RoPGI7KWQuaW5zZXJ0Q2VsbChkLmNlbGxzLmxlbmd0aCk7ZD1kLmluc2VydENlbGwoZSk7MD09ZyYmKGQuaW5uZXJIVE1MPWNbZl0udGl0bGUpO2QuaWQ9YS5yb3dzW2ddLmNlbGxzWzBdLmlkKyJfIitjW2ZdLm5hbWU7ZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciJ9ZSsrfX0KZnVuY3Rpb24gZHluVGFibGVTZXRDb2xXaWR0aChhLGIsYyxkKXt2b2lkIDA9PWMmJihjPTApO3ZvaWQgMD09ZCYmKGQ9YS5yb3dzW2Eucm93cy5sZW5ndGgtMV0uY2VsbHMubGVuZ3RoKTtmb3IoO2M8PWQ7YysrKWZvcih2YXIgZT0wO2U8YS5yb3dzLmxlbmd0aDtlKyspdm9pZCAwIT1hLnJvd3NbZV0uY2VsbHNbY10mJihhLnJvd3NbZV0uY2VsbHNbY10uc3R5bGUubWluV2lkdGg9YisicHgiKX1mdW5jdGlvbiBkeW5UYWJsZVNldFJvd0hlaWdodChhLGIsYyxkKXt2b2lkIDA9PWMmJihjPTApO2Zvcih2b2lkIDA9PWQmJihkPWEucm93cy5sZW5ndGgtMSk7Yzw9ZDtjKyspYS5yb3dzW2NdLnN0eWxlLmhlaWdodD1iKyJweCJ9CmZ1bmN0aW9uIGR5blNldENlbGxWYWx1ZShhLGIpe2lmKHkkKGEpKXt2YXIgYz1hLnNwbGl0KCJfIiksZD1keW5UYWJsZUdldENlbGxQYXJlbnRHcmlkKGEpLGU9Y2FsY0dyaWRHZXRBc3NvY2lhdGVkUnVsZShkLGNbMF0pO2lmKHZvaWQgMD09Zyl7dmFyIGY9Y2FsY0dyaWRHZXRSdWxlcyhkKSxnPVtdLGg7Zm9yKGggaW4gZil2b2lkIDAhPWgmJiJfY29udGV4dF8iIT1oJiZmLmhhc093blByb3BlcnR5KGgpJiYoZ1toXT15JChoKyJfIitjWzFdKS5pbm5lckhUTUwpfWY9ITA7IiIhPXkkKGEpLmlubmVySFRNTCYmKHZvaWQgMCE9ZS5taW5WYWwmJiIiPGUubWluVmFsJiYoaD1zdHIyaW50KGIudmFsdWUpKyIgPj0gIitlLm1pblZhbCxmPVBhcnNlci5ldmFsdWF0ZShoLGcpLGNvbnNvbGUubG9nKGgrIiA9ICIrZikpLGYmJnZvaWQgMCE9ZS5tYXhWYWwmJiIiIT1lLm1heFZhbCYmKGg9ZS5tYXhWYWwrIiA+PSAiK3N0cjJpbnQoYi52YWx1ZSksZj1QYXJzZXIuZXZhbHVhdGUoaCxnKSxjb25zb2xlLmxvZyhoKwoiID0gIitmKSkpO2lmKGYpe2c9Y1swXSsiX3RvdGFsIjtmPXN0cjJpbnQoeSQoYSkuaW5uZXJIVE1MKTt5JChhKS5pbm5lckhUTUw9Yi52YWx1ZTtpZih5JChnKSl7aD1zdHIyaW50KHkkKGcpLmlubmVySFRNTCk7aD1oLWYrc3RyMmludChiLnZhbHVlKTt5JChnKS5pbm5lckhUTUw9aDt2YXIgZj1iLmNhbGNHcmlkU2V0LnNwbGl0KCIsIiksaztmb3IoayBpbiBmKWYuaGFzT3duUHJvcGVydHkoaykmJiIiPGZba10mJihoPXkkKGZba10pLGNhbGNHcmlkUmVjYWxjKGgsZykpfXZvaWQgMCE9ZSYmKGU9ZS5ub3RpZmljYXRpb25Gb3JtSWQsIiI8ZSYmKGU9dGhpc1siZmxfIitlXSkpJiYoZS5fcG9zaXRpb249W10sZS5fcG9zaXRpb24ubmFtZT0iX3Bvc2l0aW9uIixlLl9wb3NpdGlvbi50eXBlPSJoaWRkZW4iLGUuX3Bvc2l0aW9uLnZhbHVlPXt4OjEwMCx5OjB9LGFza1ZhbHVlKCIvIiwiamF2YXNjcmlwdDpkeW5TYXZlRm9ybSgpIixlKSk7Yi5vcGVuTmV4dEZpZWxkJiYoYz1jYWxjR3JpZEdldE5leHRGaWVsZE5hbWUoZCwKY1swXSkrIl8iK2NbMV0seSQoYykmJnkkKGMpLmNsaWNrKCkpfWVsc2UgY29uc29sZS5sb2coIk8gVmFsb3Igblx1MDBjM1x1MDBhM28gcG9kZSBzZXIgbGFuXHUwMGMzXHUwMGE3YWRvIHBvciBuXHUwMGMzXHUwMGEzbyBjdW1wcmlyIGNvbmRpXHUwMGMzXHUwMGE3XHUwMGMzXHUwMGI1ZXMgZGUgZXhpc3RcdTAwYzNcdTAwYWFuY2lhIiksd2luZG93LmFsZXJ0KCJPIHZhbG9yIG5cdTAwYzNcdTAwYTNvIFx1MDBjM1x1MDBhOSBjb25zaXN0ZW50ZS5cblJldmlzZSB2YWxvcmVzIGRvIGNhbXBvIHBhaSBlIG8gcHJcdTAwYzNcdTAwYjNwcmlvIHZhbG9yIGxhblx1MDBjM1x1MDBhN2Fkb1xuVGVudGUgbm92YW1lbnRlIikseSQoYSkuY2xpY2soKX19CmZ1bmN0aW9uIHNob3dDZWxsSW5mbyhhLGIsYyl7dmFyIGQ9IiI7YSYmKGQ9YS5wYXJlbnRFbGVtZW50LmZpcnN0Q2hpbGQuaW5uZXJIVE1MKyI8YnI+PHNtYWxsPkRpYTogIithLmNlbGxJbmRleCsiPC9zbWFsbD4iKTtkPSI8ZGl2IHN0eWxlPSciKyhjPyJmb250LXdlaWdodDogODAwOyBjb2xvcjpibGFjayI6ImNvbG9yOiNhYWEiKSsiJz4iK2QrIjwvZGl2PiI7aWYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlwRGl2IikpYiYmKGMuc3R5bGUuZGlzcGxheT0iYmxvY2siLGI9Z2V0WChhKSthLm9mZnNldFdpZHRoLGE9Z2V0WShhKSthLm9mZnNldEhlaWdodCxuZXcgRWZmZWN0Lk1vdmUoInRpcERpdiIse3g6Yix5OmEsbW9kZToiYWJzb2x1dGUiLGR1cmF0aW9uOi4zfSkpLGMuaW5uZXJIVE1MPWR9CmZ1bmN0aW9uIGR5blNldEVkaXRhYmxlQ2VsbChhLGIsYyxkLGUsZil7dmFyIGc9eSQoYysiXyIrYik7ZyYmKGcub25tb3VzZW92ZXI9ZnVuY3Rpb24oKXtzaG93Q2VsbEluZm8odGhpcywhMCxlKX0sZy5vbm1vdXNlb3V0PWZ1bmN0aW9uKCl7c2hvd0NlbGxJbmZvKHRoaXMsITEsZSl9LGcub25jbGljaz1lP2Z1bmN0aW9uKCl7dmFyIGE9Y2FsY0dyaWRHZXRSdWxlVGl0bGUodGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZSxjKTtudWxsPT1hJiYoYT0iVmFsb3IiKTt2YXIgZT1bXTtlLnZhbG9yPVtdO2UudmFsb3IudGl0bGU9YSsiIC8gIitiO2UudmFsb3IubmFtZT0idmFsdWUiO2UudmFsb3IudHlwZT0iaW50ZWdlciI7ZS52YWxvci53aWR0aD0iNCI7ZS52YWxvci52YWx1ZT1nLmlubmVySFRNTDtlLmNhbGNHcmlkU2V0PVtdO2UuY2FsY0dyaWRTZXQubmFtZT0iY2FsY0dyaWRTZXQiO2UuY2FsY0dyaWRTZXQudHlwZT0iaGlkZGVuIjtlLmNhbGNHcmlkU2V0LnZhbHVlPQpkO2Uub3Blbk5leHRGaWVsZD1bXTtlLm9wZW5OZXh0RmllbGQubmFtZT0ib3Blbk5leHRGaWVsZCI7ZS5vcGVuTmV4dEZpZWxkLnR5cGU9ImhpZGRlbiI7ZS5vcGVuTmV4dEZpZWxkLnZhbHVlPTE7dmFyIGE9Z2V0WChnKStwYXJzZUludChnLm9mZnNldFdpZHRoKSxsPWdldFkoZykrcGFyc2VJbnQoZy5vZmZzZXRIZWlnaHQpO2UuX3Bvc2l0aW9uPVtdO2UuX3Bvc2l0aW9uLm5hbWU9Il9wb3NpdGlvbiI7ZS5fcG9zaXRpb24udHlwZT0iaGlkZGVuIjtlLl9wb3NpdGlvbi52YWx1ZT17eDphLHk6bH07ZS5fcG9zaXRpb24ub25DaGFuZ2VzRnVuY05hbWU9Zjthc2tWYWx1ZSgiLyIsJ2phdmFzY3JpcHQ6ZHluU2V0Q2VsbFZhbHVlKCInK2MrIl8iK2IrJyIpJyxlKX06bnVsbCl9CmZ1bmN0aW9uIGR5blNldEVkaXRhYmxlQ2VsbHMoYSxiLGMsZCl7Zm9yKHZhciBlIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShlKSlmb3IodmFyIGYgaW4gYyljLmhhc093blByb3BlcnR5KGYpJiZkeW5TZXRFZGl0YWJsZUNlbGwoYSxjW2ZdLm5hbWUsYltlXS5uYW1lLFtjW2ZdLmNhbGNHcmlkQXNzb2MsYltlXS5jYWxjR3JpZEFzc29jXSxjW2ZdLmVkaXRhYmxlJiZiW2VdLmVkaXRhYmxlLGQpfWZ1bmN0aW9uIGR5blNldENsaWNrYWJsZUhlYWRlcnMoYSxiLGMsZCl7Zm9yKHZhciBlIGluIGMpYy5oYXNPd25Qcm9wZXJ0eShlKSYmKGE9eSQoIl8iK2NbZV0ubmFtZSkpJiYoYS5vbmNsaWNrPWQpfWZ1bmN0aW9uIGR5blNldENsaWNrYWJsZVJvd0hlYWRlcnMoYSxiLGMsZCl7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmKGE9eSQoYltlXS5uYW1lKSkmJihhLm9uY2xpY2s9ZCl9CmZ1bmN0aW9uIHNlcXVlbmNlU2V0VmFsdWUoYSxiLGMpe2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJihhW2RdW2JdPWMpfWZ1bmN0aW9uIHNlcXVlbmNlQWRkKGEsYil7YVtiLm5hbWVdPWJ9ZnVuY3Rpb24gc2VxdWVuY2VQcm9kdWNlcihhLGIsYyl7dmFyIGQ9W107aWYoMDxjKWZvcig7YTw9YjthKz1jKXt2YXIgZT1bXTtlLnRpdGxlPWE7ZS5uYW1lPWE7c2VxdWVuY2VBZGQoZCxlKX1lbHNlIDA+Y3x8Y29uc29sZS5sb2coIllvdSBjYW5ub3QgY3JlYXRlIGEgbm9uIGluY3JlbWVudCBzZXF1ZW5jZSIpO3JldHVybiBkfQpmdW5jdGlvbiBmaWxsVGFibGUoYSxiLGMsZCxlLGYsZyxoLGspe3ljb21tLmludm9rZSgieWVhcGZEQiIsImRvU1FMIix7c3FsOiciJytiKyciJ30sZnVuY3Rpb24oYixoLGspe2NvbnNvbGUubG9nKGIsYSk7Yj1jLnNwbGl0KCIsIik7aD0iIjtmb3IodmFyIHg9MDt4PGIubGVuZ3RoO3grKyloKz0nPHRkPjxhIGhyZWY9InsxfSI+JSh7MH0pPC9hPjwvdGQ+Jy5mb3JtYXQoYlt4XSxkKTt5Y29tbS5kb20uZmlsbEVsZW1lbnQoYSxrLHtvbk5ld0l0ZW06Zixyb3dzOltoXSxpbnBsYWNlRGF0YTpbZV0sb25OZXdJdGVtOmYsb25SZWFkeTpnfSl9KX1mdW5jdGlvbiBnZXRDaGVja2JveFRhYmxlKGEpe3JldHVybiB5JChhKS5wYXJlbnRFbGVtZW50P3kkKGEpLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDpudWxsfQpmdW5jdGlvbiBnZXRBbGxDaGVja2JveEluVGFibGUoYSl7dmFyIGI9e307YT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpO2Zvcih2YXIgYz1hLmxlbmd0aCxkPTAsZT0wO2U8YztlKyspImNoZWNrYm94Ij09PWFbZV0udHlwZSYmKGJbZCsrXT1hW2VdKTtyZXR1cm4gYn1mdW5jdGlvbiBnZXRGb3JtU2VsZWN0T3B0aW9ucyhhLGIsYyxkKXthLmxlbmd0aD0wO3ljb21tLmludm9rZSgieWVhcGZEQiIsImdldEZvcm1TZWxlY3RPcHRpb25zIix7Zm9ybU5hbWU6JyInK2IrJyInLGZvcm1GaWVsZDonIicrYysnIid9LGZ1bmN0aW9uKGUsZixnKXtjb25zb2xlLmxvZyhlLGIrIi4iK2MpO2Zvcih2YXIgaCBpbiBnKWlmKGcuaGFzT3duUHJvcGVydHkoaCkpZm9yKHZhciBrIGluIGdbaF0pZ1toXS5oYXNPd25Qcm9wZXJ0eShrKSYmInJvd2lkIiE9ayYmKGFba109Z1toXVtrXSk7dm9pZCAwIT1kJiZkKGEsYixjKX0pfQpmdW5jdGlvbiAkdmFsdWUoYSxiKXt2YXIgYz15JChhKTtyZXR1cm4gYz9jLnZhbHVlOmJ9ZnVuY3Rpb24gX19zYXZlRm9ybUluZm8oYSl7dmFyIGI9JHZhbHVlKCJzIiwiIiksYz0kdmFsdWUoImEiLCIiKSxjPSJzYXZlIitjLnVjRmlyc3QoKSxkPSR2YWx1ZSgiaWQiLCIiKSxlOyJjaGVja2JveCI9PWEudHlwZT9lPWEuY2hlY2tlZD9hLnZhbHVlOiIiOiJ0ZXh0Ij09YS50eXBlJiYoZT1hLnZhbHVlKTt2YXIgZj1hLmlkLGY9Zi5yZXBsYWNlKCIuIiwiXyIpO19kdW1weSgyLDEsInUiLHUsInMiLGIsImEiLGMsImlkIixkLCJlSUQiLGEuaWQsInYiLGUpO19ETyhiLGMsIihpZCwiK2YrIikiLCIoIitkKyIsIitlKyIpIil9CmZ1bmN0aW9uIF9fZHluT25DaGFuZ2VfXyhhKXt2b2lkIDA9PWEmJihhPXdpbmRvdy5ldmVudHx8YXJndW1lbnRzLmNhbGxlZS5jYWxsZXIuYXJndW1lbnRzWzBdKTthLnRhcmdldCYmKGE9YS50YXJnZXQpO2EuY2hpbGRPcGVuQ29uZGl0aW9uJiZjb25zb2xlLmxvZyhhLmNoaWxkT3BlbkNvbmRpdGlvbil9ZnVuY3Rpb24gX19jYk9uQ2hhbmdlX18oYSxiKXt2b2lkIDA9PWEmJihhPXdpbmRvdy5ldmVudHx8YXJndW1lbnRzLmNhbGxlZS5jYWxsZXIuYXJndW1lbnRzWzBdKTthLnRhcmdldCYmKGE9YS50YXJnZXQpO3ZvaWQgMD09YiYmKGI9YS5keW5TYXZlT25DaGFuZ2UpO19kdW1weSgyLDEsImNoZWNrICIsYS5pZCxhLmNoZWNrZWQpO3ZvaWQgMCE9YS5keW5PbkNoYW5nZSYmYS5keW5PbkNoYW5nZSgpO2ImJl9fc2F2ZUZvcm1JbmZvKGEpO2R5bkNsZWFuQ2hpbGRzKGEsZG9jdW1lbnQpfV9kdW1wKCJ5ZHludGFibGUiKTsKdmFyIHlJbnRlcmZhY2VPYmo9ZnVuY3Rpb24oKXt2YXIgYT17b3BlblRhYjpmdW5jdGlvbihiKXt2YXIgYz15JCgiLm9wLW1lbnUiKTtpZihjKWlmKGMuZm9yRWFjaChmdW5jdGlvbihhKXthLmRlbGV0ZUNsYXNzKCJhY3RpdmUiKX0pLCJvYmplY3QiPT10eXBlb2YgYil7Yi50YXJnZXQmJihiPWIudGFyZ2V0KTtmb3IoO2ImJm51bGw9PT1iLmdldEF0dHJpYnV0ZSgiZGF0YS10YWIiKSYmIkxJIiE9Yi5ub2RlTmFtZTspYj1iLnBhcmVudE5vZGU7Yi5oYXNDbGFzcygiZGlzYWJsZWQiKXx8KGIuYWRkQ2xhc3MoImFjdGl2ZSIpLGM9Yi5nZXRBdHRyaWJ1dGUoImRhdGEtdGFiIiksInN0cmluZyI9PXR5cGVvZiBjP21UYWJOYXYuc2hvd1RhYihjKTpjb25zb2xlLndhcm4oKGIuaWR8fCJ1bmlkZW50aWZpZWQiKSsiIGRvZXMgbm90IGhhcyBkYXRhLXRhYiBhdHRyaWJ1dGUiKSl9ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGIpZm9yKHZhciBkLGM9MDtjPGRvY3VtZW50LmxpbmtzLmxlbmd0aDtjKyspZD0KZG9jdW1lbnQubGlua3NbY10uZ2V0QXR0cmlidXRlKCJocmVmIiksZD09YiYmKGEub3BlblRhYihkb2N1bWVudC5saW5rc1tjXSksYz1kb2N1bWVudC5saW5rcy5sZW5ndGgpfSxnZXRSb3dDb3VudDpmdW5jdGlvbihhLGMpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihkLGUpe3ljb21tLmludm9rZShhLCJnZXRSb3dDb3VudCIsY3x8e30sZnVuY3Rpb24oYSxiLGMsayxsKXsyMDA9PWE/YyYmY1swXT8oY1swXS5jYz1jWzBdLmNjfHxjWzBdLkNDfHwwLGQoY1swXSkpOmUoInN0YXR1czogIithKTplKCJzdGF0dXM6ICIrYSl9KX0pfSxtb3VudFBhZ2VzSW5kZXg6ZnVuY3Rpb24oYixjKXt2YXIgZD15JChiKSxlLGYsZyxoLGssbCx2LHc7az1nZXRDbGllbnRTaXplKCk7aWYoZCYmKGU9eSQoZC5nZXRBdHRyaWJ1dGUoImRhdGEtcGFnaW5hdG9yIikpKSl7Yz1jfHxkLmdldEF0dHJpYnV0ZSgiZGF0YS1jdXJyZW50UGFnZSIpO2Y9ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc3ViamVjdCIpOwpnPXN0cjJpbnQoZC5nZXRBdHRyaWJ1dGUoImRhdGEtcGFnZUNvdW50IikpO2M9TWF0aC5taW4oZ3x8MSxNYXRoLm1heCgxLGN8fDApKTtlLmlubmVySFRNTD0iIjtoPU1hdGgubWF4KDEsYy0yKTt3PU1hdGguY2VpbChNYXRoLm1heChrWzBdLGUucGFyZW50Tm9kZS5vZmZzZXRXaWR0aCkvNjApO2s9TWF0aC5taW4oZyxoKzQpO3c9TWF0aC5tYXgoMSxNYXRoLmNlaWwoZy8ody0oay1oKSkpKTtkLnNldEF0dHJpYnV0ZSgiZGF0YS1wYWdlU3RlcCIsdyk7Zm9yKGQ9MTtkPDErZzspdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJBIiksdi5zZXRBdHRyaWJ1dGUoImhyZWYiLCIjIitmKSx2LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJwYWdlLSIrZiksdi5zZXRBdHRyaWJ1dGUoImRhdGEtc3ViamVjdCIsZiksdi5zZXRBdHRyaWJ1dGUoImRhdGEtdGFibGUiLGIpLHYuc2V0QXR0cmlidXRlKCJkYXRhLXBhZ2VObyIsZCksdi5pbm5lckhUTUw9ZCxsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkxJIiksCmwuYXBwZW5kQ2hpbGQodiksZD09YyYmbC5hZGRDbGFzcygiYWN0aXZlIiksZS5hcHBlbmRDaGlsZChsKSxkPGg/KGQrPXcsZD5oJiYoZD1oKSk6ZD5rP2QrPXc6ZCsrO2FkZEV2ZW50KCIucGFnZS0iK2YsImNsaWNrIixhLmdvdG9QYWdlKX19LGluaXRpYWxpemVQYWdpbmF0aW9uOmZ1bmN0aW9uKGIsYyxkLGUsZil7Yz1jfHwidGJsLSIrYjtkPWR8fCJwYWdpbmF0aW9uLSIrYjtlPU1hdGgubWF4KDEsZXx8MjApO3ZhciBnPXkkKGQpLGg9eSQoYyk7aWYoaCl7Zj1mfHx7fTt2YXIgaz1KU09OLnBhcnNlKGguZ2V0QXR0cmlidXRlKCJkYXRhLXBhcmFtcyIpfHwie30iKTttZXJnZU9iamVjdChmLGssITApO2sucGFnZUxlbj1lO2guc2V0QXR0cmlidXRlKCJkYXRhLXBhcmFtcyIsSlNPTi5zdHJpbmdpZnkoaykpO2guc2V0QXR0cmlidXRlKCJkYXRhLXN1YmplY3QiLGIpO2guc2V0QXR0cmlidXRlKCJkYXRhLXBhZ2luYXRvciIsZCl9cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGQsZil7Zz8KKGcuaW5uZXJIVE1MPSIiLGEuZ2V0Um93Q291bnQoYixrKS50aGVuKGZ1bmN0aW9uKGIpe2I9TWF0aC5jZWlsKGIuY2MvZSk7aC5zZXRBdHRyaWJ1dGUoImRhdGEtcGFnZUNvdW50IixiKTthLm1vdW50UGFnZXNJbmRleChjKTtkKCl9KS5jYXRjaChmdW5jdGlvbihhKXtjb25zb2xlLmVycm9yKCJFcnJvciBkb2luZyB7MH0uZ2V0Um93Q291bnQiLmZvcm1hdChiKSk7ZihhKX0pKTpmKCJlcnJvcjogcGFnaW5hdG9yIG5vdCBmb3VuZCIpfSl9LGdvdG9QYWdlOmZ1bmN0aW9uKGIpe2I9Yi50YXJnZXQ7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoImRhdGEtcGFnZU5vIiksZD1iLmdldEF0dHJpYnV0ZSgiZGF0YS10YWJsZSIpO2EubG9hZFRhYmxlUGFnZShiLmdldEF0dHJpYnV0ZSgiZGF0YS1zdWJqZWN0IiksYyxkKX0sbG9hZFRhYmxlUGFnZTpmdW5jdGlvbihiLGMsZCxlKXtkPWR8fCJ0YmwtIitiO2M9LTE9PT1jP2M6TWF0aC5tYXgoMSxjfHwwKTt2YXIgZj15JChkKSxnPXt9LGgsayxsLHY7CmlmKGYpe2w9Zi5nZXRBdHRyaWJ1dGUoImRhdGEtcGFnZVN0ZXAiKXx8MDtrPWYuZ2V0QXR0cmlidXRlKCJkYXRhLXBhZ2VDb3VudCIpfHwwO3Y9KHkkKGYuZ2V0QXR0cmlidXRlKCJkYXRhLXBhZ2luYXRvciIpKXx8e2NoaWxkcmVuOltdfSkuY2hpbGRyZW47eWNvbW0uZG9tLmZpbGxFbGVtZW50KGQse30pOy0xPT09YyYmKGM9ayk7aWYoMTxsKWEubW91bnRQYWdlc0luZGV4KGQsYyk7ZWxzZXtmb3Ioaz0wO2s8di5sZW5ndGg7aysrKXZba10uZGVsZXRlQ2xhc3MoImFjdGl2ZSIpO3ZbYy0xXSYmdltjLTFdLmFkZENsYXNzKCJhY3RpdmUiKX1nPUpTT04ucGFyc2UoZi5nZXRBdHRyaWJ1dGUoImRhdGEtcGFyYW1zIil8fCJ7fSIpO2g9Zy5wYWdlTGVuO2h8fChjb25zb2xlLndhcm4oIkNhbGwgaW5pdGlhbGl6ZVBhZ2luYXRpb24oKSBmaXJzdCIpLGEuaW5pdGlhbGl6ZVBhZ2luYXRpb24oYixkKSk7aD1NYXRoLm1heCgxLGh8fDIwKTttZXJnZU9iamVjdChlfHx7fSxnLCEwKTtmLnNldEF0dHJpYnV0ZSgiZGF0YS1wYXJhbXMiLApKU09OLnN0cmluZ2lmeShnKSk7Zi5zZXRBdHRyaWJ1dGUoImRhdGEtc3ViamVjdCIsYik7Zi5zZXRBdHRyaWJ1dGUoImRhdGEtY3VycmVudFBhZ2UiLGMpO2U9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxlKXt2YXIgaz0wLGw9YypoLHY9ITEsdD1mdW5jdGlvbigpe21lcmdlT2JqZWN0KHt4cV9zdGFydDooYy0xKSpoK2sseHFfcmVxdWVzdGVkUm93czpofSxnLCEwKTt5Y29tbS5pbnZva2UoYiwibG9hZFRhYmxlIixnLGZ1bmN0aW9uKGIsZixnLEYsbSl7MjAwPT1iPyh5Y29tbS5kb20uZmlsbEVsZW1lbnQoZCxnLHt9LHtkZWxldGVSb3dzOjA9PWt9KSxtJiZtLnJvd0NvdW50Pj1tLnJlcXVlc3RlZFJvd3M/KGsrPW0ucm93Q291bnQsMDxtLnJvd0NvdW50JiYoYy0xKSpoK2s8bD9zZXRUaW1lb3V0KHQsMTI1KTp2PSEwKTp2PSEwLHYmJihiPW5ldyBFdmVudCgicmVhZHkiKSx5JChkKS5kaXNwYXRjaEV2ZW50KGIpLGEoZykpKTplKCJzdGF0dXM6ICIrYil9KX07Zj9zZXRUaW1lb3V0KHQsCjEyNSk6ZSgiZXJyb3I6IHRhYmxlIGNhbm5vdCBiZSBmaW5kIil9KX1lbHNlIGU9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YigiRXJybzogNTAwIil9LDEyNSl9KTtyZXR1cm4gZX0sbG9hZFRhYmxlOmZ1bmN0aW9uKGEsYyxkKXtjPWN8fCJ0YmwtIithO3ZhciBlPXkkKGMpLGY9e307ZSYmKGY9SlNPTi5wYXJzZShlLmdldEF0dHJpYnV0ZSgiZGF0YS1wYXJhbXMiKXx8Int9IikpO21lcmdlT2JqZWN0KGR8fHt9LGYsITApO2Uuc2V0QXR0cmlidXRlKCJkYXRhLXBhcmFtcyIsSlNPTi5zdHJpbmdpZnkoZikpO2Uuc2V0QXR0cmlidXRlKCJkYXRhLXN1YmplY3QiLGEpO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihkLGgpe3ZhciBrPTAsbD1mdW5jdGlvbigpe21lcmdlT2JqZWN0KHt4cV9zdGFydDprfSxmLCEwKTt5Y29tbS5pbnZva2UoYSwibG9hZFRhYmxlIixmLGZ1bmN0aW9uKGEsYixlLGYscCl7MjAwPT1hPyh5Y29tbS5kb20uZmlsbEVsZW1lbnQoYywKZSx7fSx7ZGVsZXRlUm93czowPT1rfSkscC5yb3dDb3VudD49cC5yZXF1ZXN0ZWRSb3dzPyhrKz1wLnJvd0NvdW50LHNldFRpbWVvdXQobCwxMjUpKTooYT1uZXcgRXZlbnQoInJlYWR5IikseSQoYykuZGlzcGF0Y2hFdmVudChhKSxkKGUpKSk6aCgic3RhdHVzOiAiK2EpfSl9O2U/c2V0VGltZW91dChsLDEyNSk6aCgiZXJyb3I6IHRhYmxlIGNhbm5vdCBiZSBmaW5kIil9KX0scHVsbEFsbERhdGE6ZnVuY3Rpb24oYSxjKXtjPWN8fHt9O3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihkLGUpe3ZhciBmPTAsZz1bXSxoPWZ1bmN0aW9uKCl7bWVyZ2VPYmplY3Qoe3hxX3N0YXJ0OmZ9LGMsITApO3ljb21tLmludm9rZShhLCJsb2FkVGFibGUiLGMsZnVuY3Rpb24oYSxiLGMsdyx4KXsyMDA9PWE/KGc9Zy5jb25jYXQoYykseC5yb3dDb3VudD49eC5yZXF1ZXN0ZWRSb3dzPyhmKz14LnJvd0NvdW50LHNldFRpbWVvdXQoaCwxMjUpKTpkKGcpKTplKCJzdGF0dXM6ICIrYSl9KX07c2V0VGltZW91dChoLAoxMjUpfSl9LGdldEJ1dHRvbkNvbnRleHQ6ZnVuY3Rpb24oYSl7YT1hLnRhcmdldDsiQlVUVE9OIiE9YS5ub2RlTmFtZSYmKGE9YS5wYXJlbnROb2RlKTtyZXR1cm4geSQoYS5nZXRBdHRyaWJ1dGUoImRhdGEtdGFibGUiKSl9LHJlZnJlc2hUYWJsZTpmdW5jdGlvbihiKXt2YXIgYz1hLmdldEJ1dHRvbkNvbnRleHQoYiksZCxlO2MmJihiPWMuZ2V0QXR0cmlidXRlKCJpZCIpLGQ9SlNPTi5wYXJzZShjLmdldEF0dHJpYnV0ZSgiZGF0YS1wYXJhbXMiKSl8fHt9LGU9Yy5nZXRBdHRyaWJ1dGUoImRhdGEtc3ViamVjdCIpLGM9Yy5nZXRBdHRyaWJ1dGUoImRhdGEtY3VycmVudFBhZ2UiKSxkLnBhZ2VMZW4/YS5sb2FkVGFibGVQYWdlKGUsYyxiLGQpOmEubG9hZFRhYmxlKGUsYixkKSl9LGluc2VydERhdGE6ZnVuY3Rpb24oYil7dmFyIGM9YS5nZXRCdXR0b25Db250ZXh0KGIpLGQsZTtpZihjJiYoYy5nZXRBdHRyaWJ1dGUoImRhdGEtc3ViamVjdCIpLGI9Yy5nZXRBdHRyaWJ1dGUoImRhdGEtZm9ybSIpLApkPWMuZ2V0QXR0cmlidXRlKCJkYXRhLXRhYiIpLHRhYmxlX21vZGFsPWMuZ2V0QXR0cmlidXRlKCJkYXRhLW1vZGFsIiksYz1jLmdldEF0dHJpYnV0ZSgiZGF0YS1wYXJhbXMiKSx0YWJsZV9tb2RhbCYmJCh0YWJsZV9tb2RhbCkubW9kYWwoInNob3ciKSxkJiZtVGFiTmF2LnNob3dUYWIoZCksYikpZm9yKGUgaW4geWNvbW0uZG9tLmNsZWFuRm9ybShiKSx5Y29tbS5kb20uZmlsbEVsZW1lbnQoYixbSlNPTi5wYXJzZShjKV0pLGI9eWNvbW0uZG9tLmdldEZvcm1FbGVtZW50cyhiKSxiKWIuaGFzT3duUHJvcGVydHkoZSkmJihkPXkkKGUpKSYmKGQ9ZC5jbG9zZXN0KCJkaXYiKSxkLmRlbGV0ZUNsYXNzKCJoYXMtZXJyb3IiKSl9LGdldEZvcm06ZnVuY3Rpb24oYixjLGQsZSxmLGcpe3ZhciBoPSEwO2EuYWxsb3dDYWNoZUZvcm0mJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5fZm9ybXNfY2FjaGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5fZm9ybXNfY2FjaGVbYysiLiIrZF0mJihoPSExLGEuYnVpbGRGb3JtRnJvbUpTT04oZCwKYS5fZm9ybXNfY2FjaGVbYysiLiIrZF0sZSxmKS50aGVuKGcpKTtoJiYoY29uc29sZS5sb2coIlJlcXVlc3RpbmcgZm9ybSAnezB9JyIuZm9ybWF0KGQpKSx5Y29tbS5pbnZva2UoYywiZ2V0Rm9ybSIse30sZnVuY3Rpb24oaCxsLHYpezIwMD09aCYmKHYmJnZbMF0/KGNvbnNvbGUubG9nKGQrIiBjaGVnb3UgIiksInVuZGVmaW5lZCI9PXR5cGVvZiBhLl9mb3Jtc19jYWNoZSYmKGEuX2Zvcm1zX2NhY2hlPVtdKSxhLl9mb3Jtc19jYWNoZVtjKyIuIitkXT12WzBdLGEuYnVpbGRGb3JtRnJvbUpTT04oYixkLHZbMF0sZSxmKS50aGVuKGcpKTpjb25zb2xlLmVycm9yKCInezB9JyBuXHUwMGMzXHUwMGEzbyBlc3RcdTAwYzNcdTAwYTEgZGV2b2x2ZSByZXN1bHRhZG8gYW8gZmF6ZXIgJ2dldEZvcm0nIi5mb3JtYXQoYykpKX0pKX0saW5wdXRfY2xlYW5fYXNzb2NpYXRlZF9maWVsZDpmdW5jdGlvbihhKXtmb3IodmFyIGM9YS5jbG9zZXN0KCJGT1JNIiksZD1jLmdldEF0dHJpYnV0ZSgiZGF0YS1wcmVmaXgiKXx8CiIiLGM9Yy5nZXRBdHRyaWJ1dGUoImRhdGEtcG9zdGZpeCIpfHwiIixlPUpTT04ucGFyc2UoYS5nZXRBdHRyaWJ1dGUoImRhdGEtcmVzdWx0LXNwZWMiKXx8IltdIiksZj1udWxsLGY9bnVsbCxnPTA7ZzxlLmxlbmd0aDtnKyspaWYoZj1kK2VbZ10udG8rYyxmIT1hLmlkJiYoZj15JChmKSkpZi52YWx1ZT0iIn0saW5wdXRfaW5wdXQ6ZnVuY3Rpb24oYil7Yi50YXJnZXQmJihiPWIudGFyZ2V0KTtpZihiJiYidHJ1ZSI9PWIuZ2V0QXR0cmlidXRlKCJkYXRhLWxpc3QtcmVhZHkiKSl7dmFyIGM9dHJpbShiLnZhbHVlKS50b1VwcGVyQ2FzZSgpLGQ9Yi5saXN0LmNoaWxkTm9kZXMsZT1iLmNsb3Nlc3QoIkZPUk0iKSxmLGcsaD0hMSxrLGwsdix3PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXByZWZpeCIpfHwiIix4PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXBvc3RmaXgiKXx8IiIscz1KU09OLnBhcnNlKGIuZ2V0QXR0cmlidXRlKCJkYXRhLXJlc3VsdC1zcGVjIil8fCJbXSIpLGU9ZnVuY3Rpb24oYSl7aD0KITA7Zm9yKGc9MDtnPHMubGVuZ3RoO2crKylpZihrPXkkKHcrc1tnXS50byt4KSlsPSJkYXRhLSIrc1tnXS5mcm9tLHY9YS5nZXRBdHRyaWJ1dGUobCksay52YWx1ZT12fTthLmlucHV0X2NsZWFuX2Fzc29jaWF0ZWRfZmllbGQoYik7Zm9yKGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLnZhbHVlLnRvVXBwZXJDYXNlKCk9PT1jJiZlKGRbZl0pO2lmKCFoJiYoYj1KU09OLnBhcnNlKGIuZ2V0QXR0cmlidXRlKCJkYXRhLWxpbmUtc3BlYyIpfHwie30iKSxiLmNvbHVtbnMpKWZvcihiPWIuY29sdW1uc1swXSxmPTA7ZjxkLmxlbmd0aDtmKyspKGRbZl0uZ2V0QXR0cmlidXRlKCJkYXRhLSIrYil8fCIiKS50b1VwcGVyQ2FzZSgpPT09YyYmZShkW2ZdKX19LGlucHV0X2tleXVwOmZ1bmN0aW9uKGIpe3ZhciBjPSJCYWNrc3BhY2UiPT1iLmtleTtpZihiPWIudGFyZ2V0KXt2YXIgZD1iLmdldEF0dHJpYnV0ZSgiZGF0YS1zdWJqZWN0IiksZT1iLmdldEF0dHJpYnV0ZSgiZGF0YS1hY3Rpb24iKSxmPQpiLmdldEF0dHJpYnV0ZSgibGlzdCIpLGc9Yi5nZXRBdHRyaWJ1dGUoImRhdGEtbGluZS1zcGVjIil8fCJ7fSIsaD10cmltKGIudmFsdWUpOyIiPT1nJiYoZz0ie30iKTtnPUpTT04ucGFyc2UoZyk7Y3x8MyE9aC5sZW5ndGg/Mz5oLmxlbmd0aCYmKHljb21tLmRvbS5maWxsRWxlbWVudChmLHt9KSxhLmlucHV0X2NsZWFuX2Fzc29jaWF0ZWRfZmllbGQoYikpOihiLnNldEF0dHJpYnV0ZSgiZGF0YS1saXN0LXJlYWR5IiwiZmFsc2UiKSxhLmxvZygiQ2FsbGluZyB7MH0uezF9IHdpdGggJ3syfSciLmZvcm1hdChkLGUsaCkpLHljb21tLmludm9rZShkLGUse3NlYXJjaDpofSxmdW5jdGlvbihjLGQsZSl7MjAwPT1jJiZlJiZlWzBdJiYoeWNvbW0uZG9tLmZpbGxFbGVtZW50KGYsZSxnKSxiLnNldEF0dHJpYnV0ZSgiZGF0YS1saXN0LXJlYWR5IiwidHJ1ZSIpLGEuaW5wdXRfaW5wdXQoYikpfSkpfX0sbG9nOmZ1bmN0aW9uKCl7dmFyIGI9MT09PWFyZ3VtZW50cy5sZW5ndGg/W2FyZ3VtZW50c1swXV06CkFycmF5LmFwcGx5KG51bGwsYXJndW1lbnRzKSxjPWEubG9nRnVuY3Rpb24/Y29uc29sZS5sb2c6bnVsbDtpZihjKXtmb3IodmFyIGQ9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWQrPWJbZV0rIiAiO2MoZCl9fX07d2luZG93LkRPTV9kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGEsYyl7dmFyIGQ9bmV3IEV2ZW50KGEpLGU9eSQoYyk7aWYoZSlpZihpc0FycmF5KGUpKWZvcih2YXIgZj0wO2Y8ZS5sZW5ndGg7ZisrKWVbZl0uZGlzcGF0Y2hFdmVudChkKTtlbHNlIGUuZGlzcGF0Y2hFdmVudChkKX07d2luZG93LkRPTV9zaG93PWZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyI9PXR5cGVvZiBhKWlmKGE9YS51bnF1b3RlKCksMDw9YS5pbmRleE9mKCIgIikpe2E9YS5zcGxpdCgiICIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKURPTV9zaG93KGEoYykpO2E9bnVsbH1lbHNlIGE9eSQoYSk7aWYoYSlpZigibnVtYmVyIj09dHlwZW9mIGEubGVuZ3RoKWZvcihjPTA7YzxhLmxlbmd0aDtjKyspRE9NX3Nob3coYVtjXSk7CmVsc2UgaWYoYT1hLmNsb3Nlc3QoImRpdi5mb3JtLWdyb3VwIikpYS5zdHlsZS5kaXNwbGF5PSIifTt3aW5kb3cuRE9NX2hpZGU9ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIj09dHlwZW9mIGEpaWYoYT1hLnVucXVvdGUoKSwwPD1hLmluZGV4T2YoIiAiKSl7YT1hLnNwbGl0KCIgIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspRE9NX2hpZGUoYShjKSk7YT1udWxsfWVsc2UgYT15JChhKTtpZihhKWlmKCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgpZm9yKGM9MDtjPGEubGVuZ3RoO2MrKylET01faGlkZShhW2NdKTtlbHNlIGlmKGE9YS5jbG9zZXN0KCJkaXYuZm9ybS1ncm91cCIpKWEuc3R5bGUuZGlzcGxheT0ibm9uZSJ9O3dpbmRvdy5ET01fZW5hYmxlPWZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyI9PXR5cGVvZiBhKWlmKGE9YS51bnF1b3RlKCksMDw9YS5pbmRleE9mKCIgIikpe2E9YS5zcGxpdCgiICIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKURPTV9lbmFibGUoYShjKSk7CmE9bnVsbH1lbHNlIGE9eSQoYSk7aWYoYSlpZigibnVtYmVyIj09dHlwZW9mIGEubGVuZ3RoKWZvcihjPTA7YzxhLmxlbmd0aDtjKyspRE9NX2VuYWJsZShhW2NdKTtlbHNlIGEuZGlzYWJsZWQ9ITF9O3dpbmRvdy5ET01fZGlzYWJsZT1mdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciPT10eXBlb2YgYSlpZihhPWEudW5xdW90ZSgpLDA8PWEuaW5kZXhPZigiICIpKXthPWEuc3BsaXQoIiAiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylET01fZGlzYWJsZShhKGMpKTthPW51bGx9ZWxzZSBhPXkkKGEpO2lmKGEpaWYoIm51bWJlciI9PXR5cGVvZiBhLmxlbmd0aClmb3IoYz0wO2M8YS5sZW5ndGg7YysrKURPTV9kaXNhYmxlKGFbY10pO2Vsc2UgYS5kaXNhYmxlZD0hMH07d2luZG93LkRPTV9zZXRWYWx1ZT1mdW5jdGlvbihhLGMpe2E9KGF8fCIiKS51bnF1b3RlKCk7Yz10cmltKGMpLnVucXVvdGUoKTt2YXIgZD1mdW5jdGlvbihhKXsiSU5QVVQiPT1hLm5vZGVOYW1lJiYoImNoZWNrYm94Ij09CmEudHlwZXx8InJhZGlvIj09YS50eXBlP2EuY2hlY2tlZD0iVFJVRSI9PShjfHwiIikudG9VcHBlckNhc2UoKXx8KGN8fCIiKS50b1VwcGVyQ2FzZSgpPT1hLnZhbHVlOmEudmFsdWU9Yyl9LGU9eSQoYSk7aWYoZSlpZigibnVtYmVyIj09dHlwZW9mIGUubGVuZ3RoKWZvcih2YXIgZj0wO2Y8ZS5sZW5ndGg7ZisrKWQoZVtmXSk7ZWxzZSBkKGUpfTt3aW5kb3cuRE9NX2FkZENsYXNzPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9eSQoYSk7aWYoZCl7Yz1jLnNwbGl0KCIgIik7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspaWYoZC5sZW5ndGgpZm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKyspZFtmXS5hZGRDbGFzcyhjW2VdKTtlbHNlIGQuYWRkQ2xhc3MoY1tlXSl9fTt3aW5kb3cuRE9NX3JlbW92ZUNsYXNzPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9eSQoYSk7aWYoZCl7Yz1jLnNwbGl0KCIgIik7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspaWYoZC5sZW5ndGgpZm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKyspZFtmXS5yZW1vdmVDbGFzcyhjW2VdKTsKZWxzZSBkLnJlbW92ZUNsYXNzKGNbZV0pfX07YS5ldmFsdWF0ZUZpZWxkPWZ1bmN0aW9uKGIsYyxkLGUpe2ImJihiPWIudGFyZ2V0KTtpZihiKWZvcihjPWIuY2xhc3NOYW1lLnNwbGl0KCIgIiksIiI8KGIuaWR8fCIiKSYmKGNbYy5sZW5ndGhdPWIuaWQpLGI9MDtiPGMubGVuZ3RoO2IrKylpZihkPXZvaWQgMCwidW5kZWZpbmVkIiE9PXR5cGVvZiB5SW50ZXJmYWNlLl9zZW5zaXRpdmVGaWVsZHNbY1tiXV0mJihkPXlJbnRlcmZhY2UuX3NlbnNpdGl2ZUZpZWxkc1tjW2JdXSksInVuZGVmaW5lZCIhPT10eXBlb2YgeUludGVyZmFjZS5fc2Vuc2l0aXZlRmllbGRzWyIuIitjW2JdXSYmKGQ9eUludGVyZmFjZS5fc2Vuc2l0aXZlRmllbGRzWyIuIitjW2JdXSksZCl7dmFyIGY7ZT15QW5hbGlzZShkLmV2YWwsdm9pZCAwLGZvcm1EaW4pO2Y9ITA9PT15TGV4T2JqKGUpLnNvbHZlKCk7YS5sb2coImV2YWx1YXRlICgiK2QuZXZhbCwiKSByZXR1cm5zICIsZSwiID0gIixmKTtkPWRbZl07Zm9yKHZhciBnPQp2b2lkIDAsZz1mPWU9dm9pZCAwLGg9MDtkJiZoPGQubGVuZ3RoO2grKylpZihnPWRbaF0uc3BsaXQoIi4iKSwxPT1nLmxlbmd0aCYmKGdbMV09Z1swXSxnWzBdPSJ3aW5kb3ciKSxlPWdbMF0sIm9iamVjdCI9PXR5cGVvZiB3aW5kb3dbZV0paWYoZ1sxXT1nWzFdLnNwbGl0KCIoIiksZj1nWzFdWzBdLCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3dbZV1bZl0pe2Zvcih2YXIgZz10cmltKGdbMV1bMV0pLGc9Zy5zdWJzdHIoMCxnLmxlbmd0aC0xKSxnPWcuc3BsaXQoIiwiKSxrPTA7azxnLmxlbmd0aDtrKyspZ1trXT10cmltKGdba118fCIiKS51bnF1b3RlKCk7d2luZG93W2VdW2ZdLmFwcGx5KG51bGwsZyl9ZWxzZSBhLmxvZygiJ3sxfScgaXMgbm90IGEgZnVuY3Rpb24gaW4gJ3swfSciLmZvcm1hdChlLGYpKTtlbHNlIGEubG9nKCInezB9JyBkb2VzIG5vdCBleGlzdHMgb3IgaXMgbm90IGFuIG9iamVjdCIuZm9ybWF0KGUpKX19O2EuZm9ybUZpbGxlZD1mdW5jdGlvbihhKXtjb25zb2xlLmxvZygiRk9STUZJTExFRCAiKwphLnRhcmdldC5pZCl9O2EuZW1wdHlGb3JtPWZ1bmN0aW9uKCl7cmV0dXJue2dldEF0dHJpYnV0ZTpmdW5jdGlvbigpe3JldHVybiIifSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKCl7fX19O2EuYnVpbGRGb3JtRnJvbUpTT049ZnVuY3Rpb24oYixjLGQsZSxmKXtmdW5jdGlvbiBnKGQsaCl7dmFyIGs9IiIsbCxwLG0scT0iIix6PSIiLEI9IiIsQTtoPWh8fHt9OyJzdHJpbmciPT10eXBlb2YgaCYmKEI9eSQoaCksaD17fSxCJiYoaC5tYXhDb3VudD1CLmdldEF0dHJpYnV0ZSgiZGF0YS1tYXgtY291bnQiKSxoLmNsYXNzPUIuZ2V0QXR0cmlidXRlKCJkYXRhLWNsYXNzIiksaC5pdGVtQ291bnRlcj1CLmdldEF0dHJpYnV0ZSgiZGF0YS1pdGVtLWNvdW50ZXIiKSxoLmlkPUIuaWQpKTsidW5kZWZpbmVkIj09dHlwZW9mIGgubWF4Q291bnQmJihoLm1heENvdW50PS0xKTsidW5kZWZpbmVkIj09dHlwZW9mIGguaXRlbUNvdW50ZXImJihoLml0ZW1Db3VudGVyPTEpO3ZhciBIPWZ1bmN0aW9uKGIsCmMsZCl7ZnVuY3Rpb24gZSgpe3ZhciBrPXt4cV9zdGFydDpmfTttZXJnZU9iamVjdChiLnBhcmFtcyxrKTt5Y29tbS5pbnZva2UoYi5zdWJqZWN0LGIuYWN0aW9uLGssZnVuY3Rpb24oayxsLG0sdCxwKXt5Y29tbS5kb20uZmlsbEVsZW1lbnQoYyxtLHt9LHtkZWxldGVSb3dzOjA9PWZ9KTtpZigyMDA9PWspe2grKztmKz1wLnJvd0NvdW50O2lmKHAucmVxdWVzdGVkUm93cz09cC5yb3dDb3VudClzZXRUaW1lb3V0KGUsMTI1KTtlbHNle2lmKGQpZm9yKGs9eSQoYykub3B0aW9ucyxsPTA7bDxrLmxlbmd0aDtsKyspa1tsXS5kaXNhYmxlZD0iZGlzYWJsZWQiO2s9KChuZXcgRGF0ZSkuZ2V0VGltZSgpLWcpLzFFMzthLmxvZygiQVBJIHswfS57MX0gdG9vayB7Mn0gc2Vjb25kcyBhbmQgezR9IGNhbGwocykgdG8gZmlsbCAnezN9JyIuZm9ybWF0KGIuc3ViamVjdCxiLmFjdGlvbixrLGMsaCkpfShrPXkkKGMpKSYmay5hZGRFdmVudExpc3RlbmVyKCJyZWZyZXNoIixmdW5jdGlvbihhKXtIKGIsCmMsZCl9KX19KX12YXIgZj0wLGc9KG5ldyBEYXRlKS5nZXRUaW1lKCksaD0wO2EubG9nKCJSZXF1ZXN0aW5nIG9wdGlvbnMgZm9yICd7MH0nIHVzaW5nICd7MX0uezJ9JyIuZm9ybWF0KGMsYi5zdWJqZWN0LGIuYWN0aW9uKSk7ZSgpfSxHPWZ1bmN0aW9uKGEsYixjKXsidW5kZWZpbmVkIj09dHlwZW9mIHdbYV0mJih3W2FdPVtdKTsidW5kZWZpbmVkIj09dHlwZW9mIHdbYV1bYl0mJih3W2FdW2JdPVtdKTt3W2FdW2JdW3dbYV1bYl0ubGVuZ3RoXT1jfTtpZigtMT09aC5tYXhDb3VudHx8aC5pdGVtQ291bnRlcjw9aC5tYXhDb3VudCl7aC5jb250cm9sRmllbGQmJihkWyJjb250cm9sRmllbGQiK3ZdPWguY29udHJvbEZpZWxkKTtmb3IobSBpbiBkKWlmKGQuaGFzT3duUHJvcGVydHkobSkpe3YrKztoLmlkfHwiIj4iIj8oQj1oLml0ZW1Db3VudGVyfHwxLGRbbV0ubGFiZWxzJiYocT1NYXRoLm1pbihCLGRbbV0ubGFiZWxzLmxlbmd0aCktMSxkW21dLmxhYmVsPWRbbV0ubGFiZWxzW3FdLApkW21dLnN1ZmZpeGVzJiYocT1NYXRoLm1pbihxKzEsZFttXS5zdWZmaXhlcy5sZW5ndGgpLTEsQj1kW21dLnN1ZmZpeGVzW3FdK0IpKSxCPSIiK0IsQT1lKyhkW21dLmlkfHxtKStCK2YpOkE9IllFUyI9PShkW21dLmlzQ29udHJvbEJ1dHRvbnx8IiIpLnRvVXBwZXJDYXNlKCk/ZSsoZFttXS5pZHx8bSkrIiIrditmOmUrKGRbbV0uaWR8fG0pK2Y7InVuZGVmaW5lZCI9PXR5cGVvZiBkW21dLm9yZGVyJiYoZFttXS5vcmRlcj12KTt6PXE9IiI7ZFttXS5ncm91cCYmKHErPSJjbGFzcz0nezB9JyIuZm9ybWF0KGRbbV0uZ3JvdXApLHorPSIgIitkW21dLmdyb3VwKTtkW21dLnF1ZXJ5JiYoQj1kW21dLnF1ZXJ5LnN1YmplY3QrIi4iK2RbbV0ucXVlcnkuYWN0aW9uLCJ1bmRlZmluZWQiPT10eXBlb2YgeFtCXSYmKHhbQl09W10pLCJ1bmRlZmluZWQiPT10eXBlb2YgeFtCXVtBXSYmKHhbQl1bQV09MCkseFtCXVtBXSsrKTtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiBkW21dLmV2ZW50cylmb3IobD0KMDtsPGRbbV0uZXZlbnRzLmxlbmd0aDtsKyspZm9yKHAgaW4gZFttXS5ldmVudHNbbF0pZFttXS5ldmVudHNbbF0uaGFzT3duUHJvcGVydHkocCkmJkcoQSxwLGRbbV0uZXZlbnRzW2xdW3BdKTtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiBkW21dLmNvbmRpdGlvbmFsKWZvcihCPWRbbV0uY29uZGl0aW9uYWwuc2Vuc2l0aXZpdHkuc3BsaXQoIiAiKSxsPTA7bDxCLmxlbmd0aDtsKyspRyhCW2xdLCJjaGFuZ2VPckJsdXIiLGEuZXZhbHVhdGVGaWVsZCksInVuZGVmaW5lZCI9PXR5cGVvZiBhLl9zZW5zaXRpdmVGaWVsZHMmJihhLl9zZW5zaXRpdmVGaWVsZHM9W10pLCJ1bmRlZmluZWQiPT10eXBlb2YgYS5fc2Vuc2l0aXZlRmllbGRzW0JbbF1dJiYoYS5fc2Vuc2l0aXZlRmllbGRzW0JbbF1dPWRbbV0uY29uZGl0aW9uYWwpO3ZhciBCPSIiLEk7Zm9yKEkgaW4gZFttXSkiZGF0YS0iPT1JLnN1YnN0cigwLDUpJiYoQis9InswfT0nezF9JyAiLmZvcm1hdChJLGRbbV1bSV0pKTtpZigiUk9XIj09CihkW21dLmRvbVR5cGV8fGRbbV0udHlwZXx8IiIpLnRvVXBwZXJDYXNlKCkpays9IjxkaXYgY2xhc3M9J3JvdycgaWQ9ezB9PiIuZm9ybWF0KGRbbV0uaWR8fCJyb3dfIitjKyJfIit2KSxrKz1nKGRbbV0uZmllbGRzKSxrKz0iPC9kaXY+IjtlbHNlIGlmKCJBUlJBWSI9PShkW21dLmRvbVR5cGV8fGRbbV0udHlwZXx8IiIpLnRvVXBwZXJDYXNlKCkpcT0oZFttXS5pZHx8QSkrIl8iK2MsQT17bWF4Q291bnQ6ZFttXS5tYXhDb3VudCxjbGFzczpkW21dLmNsYXNzLGl0ZW1Db3VudGVyOjEsaWQ6cX0sZFttXS5maWVsZHMuX2NvbnRyb2xGaWVsZD17ImNsYXNzIjoiY29sLW1kLTIiLHR5cGU6ImNvbHVtbiIsZmllbGRzOlt7dHlwZToiYnV0dG9uIixpZDoiYXJyYXlfY29udHJvbF9idG5fYWRkXyIsImNsYXNzIjoiYnRuIGJ0bi1wcmltYXJ5IGJ0bi14cyIsImRhdGEtbWFzdGVyLW9iamVjdC1pZCI6cSxpc0NvbnRyb2xCdXR0b246InllcyIsImRhdGEtYWN0aW9uIjoiYWRkIixpY29uQ2xhc3M6ImdseXBoaWNvbiBnbHlwaGljb24tcGx1cy1zaWduIn0sCnt0eXBlOiJidXR0b24iLGlkOiJhcnJheV9jb250cm9sX2J0bl9yZW1vdmVfIiwiY2xhc3MiOiJidG4gYnRuLWRhbmdlciBidG4teHMiLCJkYXRhLW1hc3Rlci1vYmplY3QtaWQiOnEsaXNDb250cm9sQnV0dG9uOiJ5ZXMiLCJkYXRhLWFjdGlvbiI6InJlbW92ZSIsaWNvbkNsYXNzOiJnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZS1zaWduIn1dfSxhLl9yZXBlYXRhYmxlRmllbGRJbmZvW3FdPWRbbV0uZmllbGRzLGsrPSI8ZGl2IGlkPXswfSBkYXRhLWNsYXNzPSd7MX0nIGRhdGEtbWF4LWNvdW50PSd7Mn0nIGRhdGEtaXRlbS1jb3VudGVyPScyJz4iLmZvcm1hdChxLGRbbV0uY2xhc3N8fCJjb2wtbWQtMTIiLGRbbV0ubWF4Q291bnQpLGsrPWcoZFttXS5maWVsZHMsQSksays9IjwvZGl2PiI7ZWxzZSBpZigiQ09MVU1OIj09KGRbbV0uZG9tVHlwZXx8ZFttXS50eXBlfHwiIikudG9VcHBlckNhc2UoKSlrKz0iPGRpdiBjbGFzcz0nezB9JyBpZD0nezF9Jz4iLmZvcm1hdChkW21dLmNsYXNzfHwKIiIsZFttXS5pZHx8ImRpdl8iK2MrIl8iK3YpLGRbbV0ubGFiZWwmJihrKz0iPGgyPnswfTwvaDI+Ii5mb3JtYXQoZFttXS5sYWJlbCkpLGsrPWcoZFttXS5maWVsZHMpLGsrPSI8L2Rpdj4iO2Vsc2UgaWYoIlAiPT0oZFttXS5kb21UeXBlfHxkW21dLnR5cGV8fCIiKS50b1VwcGVyQ2FzZSgpKWsrPSI8ZGl2IGNsYXNzPSdmb3JtLWdyb3VwIHsxfScgaWQ9J3swfSc+PGxhYmVsPnsyfTwvbGFiZWw+PGRpdiB7NH0gXHgzYyEtLVVTRVJEQVRBLS1ceDNlID48cD57M308L3A+PC9kaXY+PC9kaXY+Ii5mb3JtYXQoQSxkW21dLmNsYXNzfHwiY29sLW1kLTEyIixkW21dLmxhYmVsfHwiIixkW21dLmNvbnRlbnR8fCIiLHEsIllFUyI9PShkW21dLnJlYWRPbmx5fHwiIikudG9VcHBlckNhc2UoKT8iZGlzYWJsZWQ9eWVzIjoiIik7ZWxzZSBpZigiQlVUVE9OIj09KGRbbV0uZG9tVHlwZXx8ZFttXS50eXBlfHwiIikudG9VcHBlckNhc2UoKSkiWUVTIj09KGRbbV0uaXNDb250cm9sQnV0dG9ufHwiIikudG9VcHBlckNhc2UoKSYmCkcoQSwiY2xpY2siLHMpLGsrPSI8YnV0dG9uIHR5cGU9J2J1dHRvbicgY2xhc3M9J3sxfScgaWQ9J3swfScgezR9IHs1fSBceDNjIS0tVVNFUkRBVEEtLVx4M2UgPjxpIGNsYXNzPSd7M30nPjwvaT57Mn08L2J1dHRvbj4iLmZvcm1hdChBLGRbbV0uY2xhc3N8fCJjb2wtbWQtMTIiLGRbbV0ubGFiZWx8fCIiLGRbbV0uaWNvbkNsYXNzfHwiIixxLCJZRVMiPT0oZFttXS5yZWFkT25seXx8IiIpLnRvVXBwZXJDYXNlKCk/InJlYWRvbmx5IjoiIik7ZWxzZSBpZigiRk9STSI9PShkW21dLmRvbVR5cGV8fGRbbV0udHlwZXx8IiIpLnRvVXBwZXJDYXNlKCkpays9Ijxmb3JtIHJvbGU9J2Zvcm0nIGlkPSd7MH0nIGRhdGEtcHJlZml4PSd7Mn0nIGNsYXNzPSd7MX0nIHszfSBceDNjIS0tVVNFUkRBVEEtLVx4M2UgPns0fTwvZm9ybT4iLmZvcm1hdChBLGRbbV0uY2xhc3N8fCJjb2wtbWQtMTIiLGRbbV0uZGF0YVByZWZpeHx8IiIscSwiIiwiWUVTIj09KGRbbV0ucmVhZE9ubHl8fCIiKS50b1VwcGVyQ2FzZSgpPwoiZGlzYWJsZWQ9eWVzIjoiIik7ZWxzZSBpZigiU0VMRUNUIj09KGRbbV0uZG9tVHlwZXx8ZFttXS50eXBlfHwiIikudG9VcHBlckNhc2UoKSlpZihkW21dLnF1ZXJ5KXt2YXIgaz1rKyI8ZGl2IGNsYXNzPSdmb3JtLWdyb3VwIHsxfScgaWQ9J2dycF97MH0nPjxsYWJlbCBmb3I9ezB9PnsyfTwvbGFiZWw+PHNlbGVjdCBpZD0nezB9JyBjbGFzcz0nZm9ybS1jb250cm9sJyB7M30gezR9IFx4M2MhLS1VU0VSREFUQS0tXHgzZSA+PC9zZWxlY3Q+PC9kaXY+Ii5mb3JtYXQoQSxkW21dLmNsYXNzLGRbbV0ubGFiZWx8fCIiLHEsbnVsbCksSjtmb3IoSiBpbiBkW21dLnF1ZXJ5LnBhcmFtcylkW21dLnF1ZXJ5LnBhcmFtcy5oYXNPd25Qcm9wZXJ0eShKKSYmKGRbbV0ucXVlcnkucGFyYW1zW0pdPXlBbmFsaXNlKGRbbV0ucXVlcnkucGFyYW1zW0pdLHZvaWQgMCxiKSk7SChkW21dLnF1ZXJ5LEEsIllFUyI9PShkW21dLnJlYWRPbmx5fHwiIikudG9VcHBlckNhc2UoKSl9ZWxzZXtpZihkW21dLm9wdGlvbnMpe3ZhciB6PQoiIixLO2ZvcihLIGluIGRbbV0ub3B0aW9ucylkW21dLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoSykmJih6Kz0iPG9wdGlvbiB2YWx1ZT0nezB9Jz57MX08L29wdGlvbj4iLmZvcm1hdChkW21dLm9wdGlvbnNbS10udmFsdWUsZFttXS5vcHRpb25zW0tdLmxhYmVsKSk7ays9IjxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAgezF9JyBpZD0nZ3JwX3swfSc+PGxhYmVsIGZvcj17MH0+ezJ9PC9sYWJlbD48c2VsZWN0IGlkPSd7MH0nIGNsYXNzPSdmb3JtLWNvbnRyb2wnIHszfSB7NH0gXHgzYyEtLVVTRVJEQVRBLS1ceDNlID57NX08L3NlbGVjdD48L2Rpdj4iLmZvcm1hdChBLGRbbV0uY2xhc3MsZFttXS5sYWJlbHx8IiIscSxudWxsLHopfX1lbHNlIGlmKCJURVhUQVJFQSI9PShkW21dLmRvbVR5cGV8fGRbbV0udHlwZXx8IiIpLnRvVXBwZXJDYXNlKCkpays9IjxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAgezF9JyBpZD0nZ3JwX3swfSc+PGxhYmVsIGZvcj0nezB9Jz57Mn08L2xhYmVsPjx0ZXh0YXJlYSBjbGFzcz0nZm9ybS1jb250cm9sJyBpZD0nezB9JyBjb2xzPSd7M30nIHJvd3M9J3s0fScgezV9IHs2fSBceDNjIS0tVVNFUkRBVEEtLVx4M2UgPjwvdGV4dGFyZWE+PC9kaXY+Ii5mb3JtYXQoQSwKZFttXS5jbGFzc3x8ImNvbC1tZC0xMiIsZFttXS5sYWJlbHx8IiIsZFttXS5jb2xzfHwiODAiLGRbbV0ucm93c3x8IjQiLHEsIllFUyI9PShkW21dLnJlYWRPbmx5fHwiIikudG9VcHBlckNhc2UoKT8iZGlzYWJsZWQ9eWVzIjoiIik7ZWxzZSBpZigiQ0hFQ0tCT1giPT0oZFttXS5kb21UeXBlfHxkW21dLnR5cGV8fCIiKS50b1VwcGVyQ2FzZSgpKWsrPSI8ZGl2IGNsYXNzPSdmb3JtLWdyb3VwIHsxfScgaWQ9J2dycF97MH0nPjxsYWJlbD57NH08L2xhYmVsPjxkaXYgY2xhc3M9J2NoZWNrYm94Jz48bGFiZWw+PGlucHV0IHR5cGU9J2NoZWNrYm94JyB2YWx1ZT0nezN9JyBpZD0nezB9JyB7NX0gezZ9IFx4M2MhLS1VU0VSREFUQS0tXHgzZSA+ezJ9PC9sYWJlbD48L2Rpdj48L2Rpdj4iLmZvcm1hdChBLGRbbV0uY2xhc3N8fCJjb2wtbWQtMTIiLGRbbV0uZGVzY3JpcHRpb258fCIiLGRbbV0udmFsdWUsZFttXS5sYWJlbHx8IiIscSwiWUVTIj09KGRbbV0ucmVhZE9ubHl8fCIiKS50b1VwcGVyQ2FzZSgpPwoiZGlzYWJsZWQ9eWVzIjoiIik7ZWxzZSBpZigiUkFESU8iPT0oZFttXS5kb21UeXBlfHxkW21dLnR5cGV8fCIiKS50b1VwcGVyQ2FzZSgpKXtrKz0iPGRpdiBjbGFzcz0nZm9ybS1ncm91cCB7MX0gcm93Jz48bGFiZWw+ezB9PC9sYWJlbD48ZGl2IGNsYXNzPSdyb3cnPiIuZm9ybWF0KGRbbV0ubGFiZWx8fCIiLGRbbV0uY2xhc3N8fCIiKTtmb3IobD0wO2w8KGRbbV0ub3B0aW9uc3x8e2xlbmd0aDowfSkubGVuZ3RoO2wrKylrKz0iPGRpdiBjbGFzcz0nezF9JyBpZD0nZ3JwX3swfSc+PGRpdiBjbGFzcz0ncmFkaW8nPjxsYWJlbD48aW5wdXQgdHlwZT0ncmFkaW8nIG5hbWU9J3szfScgaWQ9J3swfScgdmFsdWU9J3s0fScgezV9IFx4M2MhLS1VU0VSREFUQS0tXHgzZSA+ezJ9PC9sYWJlbD48L2Rpdj48L2Rpdj4iLmZvcm1hdChBKyJfIisoIiIrKGRbbV0ub3B0aW9uc1tsXS52YWx1ZXx8bCkpLnJlcGxhY2UoL1teMC05YS16XS9naSwiIiksZFttXS5vcHRpb25zW2xdLmNsYXNzfHxkW21dLmRlZmF1bHRPcHRpb25DbGFzc3x8CiJjb2wtbWQtMTIiLGRbbV0ub3B0aW9uc1tsXS5sYWJlbHx8IiIsQSxkW21dLm9wdGlvbnNbbF0udmFsdWUscSwiWUVTIj09KGRbbV0ucmVhZE9ubHl8fCIiKS50b1VwcGVyQ2FzZSgpPyJkaXNhYmxlZD15ZXMiOiIiKTtrKz0iPC9kaXY+PC9kaXY+In1lbHNlIklOUFVUIj09KGRbbV0uZG9tVHlwZXx8ZFttXS50eXBlfHwiIikudG9VcHBlckNhc2UoKT8iWUVTIj09KGRbbV0uaGlkZGVufHwiIikudG9VcHBlckNhc2UoKT9rKz0iPGlucHV0IHR5cGU9aGlkZGVuIGlkPSd7MH0nIHsxfSB2YWx1ZT0nezJ9JyBceDNjIS0tVVNFUkRBVEEtLVx4M2UgLz4iLmZvcm1hdChBLHEsZFttXS52YWx1ZXx8IiIpOmRbbV0ucXVlcnk/KHYrKyxrKz0iPGRpdiBjbGFzcz0nZm9ybS1ncm91cCB7MX0nIGlkPSdncnBfezB9Jz48bGFiZWwgZm9yPSd7MH0nPnszfTwvbGFiZWw+PGlucHV0IHR5cGU9J3syfScgY2xhc3M9J2Zvcm0tY29udHJvbCB7NX0nIGlkPSd7MH0nIHs0fSB7MTF9IGxpc3Q9J3s2fScgZGF0YS1zdWJqZWN0PSd7N30nIGRhdGEtYWN0aW9uPSd7OH0nIGRhdGEtbGluZS1zcGVjPSd7OX0nIGRhdGEtcmVzdWx0LXNwZWM9J3sxMH0nIFx4M2MhLS1VU0VSREFUQS0tXHgzZSAvPjxkYXRhbGlzdCBpZD0nezZ9Jz48L2RhdGFsaXN0PjwvZGl2PiIuZm9ybWF0KEEsCmRbbV0uY2xhc3N8fCJjb2wtbWQtMTIiLGRbbV0uaW5wdXRNb2RlfHwidGV4dCIsZFttXS5sYWJlbHx8IiIsIllFUyI9PShkW21dLnJlYWRPbmx5fHwiIikudG9VcHBlckNhc2UoKT8icmVhZG9ubHkiOiIiLHosQSsiX2RhdGFsaXN0XyIrdixkW21dLnF1ZXJ5LnN1YmplY3QsZFttXS5xdWVyeS5hY3Rpb24sSlNPTi5zdHJpbmdpZnkoZFttXS5xdWVyeS5saW5lU3BlY3x8e30pLEpTT04uc3RyaW5naWZ5KGRbbV0ucmVzdWx0U3BlY3x8e30pKSxHKEEsImtleXVwIiwieUludGVyZmFjZS5pbnB1dF9rZXl1cCIpLEcoQSwiaW5wdXQiLCJ5SW50ZXJmYWNlLmlucHV0X2lucHV0IikpOms9InVuZGVmaW5lZCIhPXR5cGVvZiBkW21dLnJpZ2h0QWRkb24/aysiPGRpdiBjbGFzcz0nZm9ybS1ncm91cCB7MX0nIGlkPSdncnBfezB9Jz48bGFiZWwgZm9yPSd7MH0nPnszfTwvbGFiZWw+PGRpdiBjbGFzcz0naW5wdXQtZ3JvdXAnPjxpbnB1dCB0eXBlPSd7Mn0nIGF1dG9jb21wbGV0ZT0nb2ZmJyBjbGFzcz0nZm9ybS1jb250cm9sIHs1fScgaWQ9J3swfScgezR9IHs2fSBceDNjIS0tVVNFUkRBVEEtLVx4M2UgLz48c3BhbiBjbGFzcz0naW5wdXQtZ3JvdXAtYWRkb24nPns3fTwvc3Bhbj48L2Rpdj48L2Rpdj4iLmZvcm1hdChBLApkW21dLmNsYXNzfHwiY29sLW1kLTEyIixkW21dLmlucHV0TW9kZXx8InRleHQiLGRbbV0ubGFiZWx8fCIiLCJZRVMiPT0oZFttXS5yZWFkT25seXx8IiIpLnRvVXBwZXJDYXNlKCk/InJlYWRvbmx5IjoiIix6LCIiLGRbbV0ucmlnaHRBZGRvbik6InVuZGVmaW5lZCIhPXR5cGVvZiBkW21dLmxlZnRBZGRvbj9rKyI8ZGl2IGNsYXNzPSdmb3JtLWdyb3VwIHsxfScgaWQ9J2dycF97MH0nPjxsYWJlbCBmb3I9J3swfSc+ezN9PC9sYWJlbD48ZGl2IGNsYXNzPSdpbnB1dC1ncm91cCc+PHNwYW4gY2xhc3M9J2lucHV0LWdyb3VwLWFkZG9uJz57N308L3NwYW4+PGlucHV0IHR5cGU9J3syfScgYXV0b2NvbXBsZXRlPSdvZmYnIGNsYXNzPSdmb3JtLWNvbnRyb2wgezV9JyBpZD0nezB9JyB7NH0gezZ9IFx4M2MhLS1VU0VSREFUQS0tXHgzZSAvPjwvZGl2PjwvZGl2PiIuZm9ybWF0KEEsZFttXS5jbGFzc3x8ImNvbC1tZC0xMiIsZFttXS5pbnB1dE1vZGV8fCJ0ZXh0IixkW21dLmxhYmVsfHwiIiwKIllFUyI9PShkW21dLnJlYWRPbmx5fHwiIikudG9VcHBlckNhc2UoKT8icmVhZG9ubHkiOiIiLHosIiIsZFttXS5sZWZ0QWRkb24pOmsrIjxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAgezF9JyBpZD0nZ3JwX3swfSc+PGxhYmVsIGZvcj0nezB9Jz57M308L2xhYmVsPjxpbnB1dCB0eXBlPSd7Mn0nIGF1dG9jb21wbGV0ZT0nb2ZmJyBjbGFzcz0nZm9ybS1jb250cm9sIHs1fScgaWQ9J3swfScgezR9IHs2fSBceDNjIS0tVVNFUkRBVEEtLVx4M2UgLz48L2Rpdj4iLmZvcm1hdChBLGRbbV0uY2xhc3N8fCJjb2wtbWQtMTIiLGRbbV0uaW5wdXRNb2RlfHwidGV4dCIsZFttXS5sYWJlbHx8IiIsIllFUyI9PShkW21dLnJlYWRPbmx5fHwiIikudG9VcHBlckNhc2UoKT8icmVhZG9ubHkiOiIiLHosIiIpOihhLmxvZygiJ3swfScgaXMgbm90IGEgRE9NIG9iamVjdC4gVHJlYXRpbmcgaXQgYXMgSElEREVOIi5mb3JtYXQoQSkpLGsrPSI8aW5wdXQgdHlwZT1oaWRkZW4gaWQ9J3swfScgezF9IHZhbHVlPSd7Mn0nIFx4M2MhLS1VU0VSREFUQS0tXHgzZSAvPiIuZm9ybWF0KEEsCnEsZFttXS52YWx1ZXx8IiIpKTtrPWsucmVwbGFjZSgvXHgzYyEtLVVTRVJEQVRBLS1ceDNlL2csQil9aC5pdGVtQ291bnRlcisrO2lmKGguaWR8fCIiPiIiKWs9IjxkaXYgY2xhc3M9ezB9PnsxfTwvZGl2PiIuZm9ybWF0KGguY2xhc3Msayk7KEI9eSQoaC5pZCkpJiZCLnNldEF0dHJpYnV0ZSgiZGF0YS1pdGVtLWNvdW50ZXIiLGguaXRlbUNvdW50ZXIpfXJldHVybiBrfXZhciBoPXkkKGMpfHxhLmVtcHR5Rm9ybSgpLGs9SlNPTi5wYXJzZSgoZHx8e30pLmZvcm18fCJ7fSIpLGw9eSQoInNvdXJjZUNvZGVWaWV3ZXIiKTtsJiYobC5pbm5lckhUTUw9ZnVuY3Rpb24oKXt2YXIgYT1KU09OLnN0cmluZ2lmeShkLmZvcm0sdm9pZCAwLDIpLGE9YS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvXG4vZywiKiIpLnJlcGxhY2UoJ1xcIicsJyInKTtyZXR1cm4nPHByZSBzdHlsZT0id2hpdGUtc3BhY2U6IHByZS13cmFwOyB3b3JkLWJyZWFrOiBrZWVwLWFsbDsiPicrCmEucmVwbGFjZSgvKCIoXFx1W2EtekEtWjAtOV17NH18XFxbXnVdfFteXFwiXSkqIihccyo6KT98XGIodHJ1ZXxmYWxzZXxudWxsKVxifC0/XGQrKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPykvZyxmdW5jdGlvbihhKXt2YXIgYj0ibnVtYmVyIjsvXiIvLnRlc3QoYSk/Yj0vOiQvLnRlc3QoYSk/ImtleSI6InN0cmluZyI6L3RydWV8ZmFsc2UvLnRlc3QoYSk/Yj0iYm9vbGVhbiI6L251bGwvLnRlc3QoYSkmJihiPSJudWxsIik7cmV0dXJuJzxzcGFuIGNsYXNzPSInK2IrJyI+JythKyI8L3NwYW4+In0pKyI8L3ByZT4ifSgpKTtlPWV8fGguZ2V0QXR0cmlidXRlKCJkYXRhLXByZWZpeCIpfHwiIjtmPWZ8fGguZ2V0QXR0cmlidXRlKCJkYXRhLXBvc3RmaXgiKXx8IiI7YS5fc2Vuc2l0aXZlRmllbGRzPVtdO3ZhciB2PShuZXcgRGF0ZSkuZ2V0VGltZSgpLHc9W10seD1bXSxzPWZ1bmN0aW9uKGIpe2I9Yi50YXJnZXQ7dj0obmV3IERhdGUpLmdldFRpbWUoKTt3PVtdO3g9W107dmFyIGM9CmIuY2xvc2VzdCgiYnV0dG9uIiksZD1jLmdldEF0dHJpYnV0ZSgiZGF0YS1hY3Rpb24iKTtiPWMuZ2V0QXR0cmlidXRlKCJkYXRhLW1hc3Rlci1vYmplY3QtaWQiKTt2YXIgZT15JChiKTsiYWRkIj09ZD8oYz1nKGEuX3JlcGVhdGFibGVGaWVsZEluZm9bYl0sYiksZS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsYyksYS5sb2coIkNvbXBsZW1lbnRpbmcgezB9IGF0IHsxfSIuZm9ybWF0KGguaWQsYikpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtwKHtldmVudExpc3Q6dyxhcGlVc2FnZTp4fSl9LDEyNSkpOiJyZW1vdmUiPT1kJiYoYj1jLnBhcmVudE5vZGUucGFyZW50Tm9kZSkmJmIucmVtb3ZlKCl9LHA9ZnVuY3Rpb24oYil7dmFyIGM7YS5sb2coIkFQSSBVc2FnZSIpO2Zvcih2YXIgZCBpbiBiLmFwaVVzYWdlKWlmKGIuYXBpVXNhZ2UuaGFzT3duUHJvcGVydHkoZCkpZm9yKGMgaW4gYS5sb2coIiZuYnNwOyZuYnNwOyIrZCksYi5hcGlVc2FnZVtkXSliLmFwaVVzYWdlW2RdLmhhc093blByb3BlcnR5KGMpJiYKYS5sb2coIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3VzZWQgYnkgJ3swfSciLmZvcm1hdChjKSk7dmFyIGU9ZnVuY3Rpb24oYixjLGQpe2lmKCJjaGFuZ2VPckJsdXIiPT1jKXt2YXIgZz15JChiKTtpZigidW5kZWZpbmVkIj09dHlwZW9mKGd8fHt9KS5sZW5ndGgpIklOUFVUIj09Zy5ub2RlTmFtZSYmInJhZGlvIiE9Zy50eXBlJiYiY2hlY2tib3giIT1nLnR5cGU/ZShiLCJibHVyIixkKTplKGIsImNoYW5nZSIsZCk7ZWxzZSBmb3IoYj0wO2I8KGd8fHt9KS5sZW5ndGg7YisrKWUoZ1tiXS5pZCxjLGQpfWVsc2UgYWRkRXZlbnQoYixjLGQpLCJjaGFuZ2UiIT1jJiYiYmx1ciIhPWN8fCJ1bmRlZmluZWQiIT10eXBlb2YgZlsiezB9LnsxfSIuZm9ybWF0KGMsYildfHwoZlsiezB9LnsxfSIuZm9ybWF0KGMsYildPSEwLGEubG9nKCJkaXNwYXRjaGluZyBldmVudCB7MH0gb257MX0iLmZvcm1hdChiLGMpKSxET01fZGlzcGF0Y2hFdmVudChjLGIpKX07YS5sb2coIkRPTSBFdmVudHMiKTt2YXIgZj0KW107Zm9yKGMgaW4gYi5ldmVudExpc3QpaWYoYi5ldmVudExpc3QuaGFzT3duUHJvcGVydHkoYykpe2EubG9nKCImbmJzcDsmbmJzcDtGb3IgJ3swfSciLmZvcm1hdChjKSk7Zm9yKHZhciBnIGluIGIuZXZlbnRMaXN0W2NdKWlmKGIuZXZlbnRMaXN0W2NdLmhhc093blByb3BlcnR5KGcpKWZvcihkPTA7ZDxiLmV2ZW50TGlzdFtjXVtnXS5sZW5ndGg7ZCsrKXt2YXIgaD1iLmV2ZW50TGlzdFtjXVtnXVtkXTtpZigiZnVuY3Rpb24iPT10eXBlb2YgaCllKGMsZyxoKTtlbHNle3ZhciBoPWguc3BsaXQoIi4iKSxrPSIiOyJvYmplY3QiPT10eXBlb2Ygd2luZG93W2hbMF1dPyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3dbaFswXV1baFsxXV0/ZShjLGcsd2luZG93W2hbMF1dW2hbMV1dKTprPSInezB9JyBub3QgZm91bmQgaW4gJ3sxfSciLmZvcm1hdChoWzFdLGhbMF0pOms9Iid7MH0nIHdhcyBub3QgZm91bmQgb3IgaXMgbm90IGFuIG9iamVjdCIuZm9ybWF0KGhbMF0pOyIiPGsmJihrPSIoRXJyb3I6IHswfSkiLmZvcm1hdChrKSk7CmEubG9nKCImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt7MX0gLT4gezJ9LnszfSgpIHs0fSIuZm9ybWF0KGMsZyxoWzBdLGhbMV0saykpfX19InVuZGVmaW5lZCIhPXR5cGVvZiBmbGF0cGlja3ImJmZsYXRwaWNrcigiLmRhdGUtc2VsZWN0LWZpZWxkIix7ZGF0ZUZvcm1hdDoiZC9tL1kifSk7InVuZGVmaW5lZCIhPXR5cGVvZiBJbnB1dE1hc2s/KChuZXcgSW5wdXRNYXNrKS5Jbml0aWFsaXplKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5tYXNrZWQteWVhci1maWVsZCIpLHttYXNrOklucHV0TWFza0RlZmF1bHRNYXNrLkRhdGVNb250aFllYXIscGxhY2VIb2xkZXI6Inl5eXkifSksKG5ldyBJbnB1dE1hc2spLkluaXRpYWxpemUoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLm1hc2tlZC1tb250aC15ZWFyLWZpZWxkIikse21hc2s6SW5wdXRNYXNrRGVmYXVsdE1hc2suRGF0ZU1vbnRoWWVhcixwbGFjZUhvbGRlcjoibW0veXl5eSJ9KSwobmV3IElucHV0TWFzaykuSW5pdGlhbGl6ZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIubWFza2VkLWRhdGUtZmllbGQiKSwKe21hc2s6SW5wdXRNYXNrRGVmYXVsdE1hc2suRGF0ZSxwbGFjZUhvbGRlcjoiZGQvbW0veXl5eSJ9KSwobmV3IElucHV0TWFzaykuSW5pdGlhbGl6ZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIubWFza2VkLXRpbWUtZmllbGQiKSx7bWFzazpJbnB1dE1hc2tEZWZhdWx0TWFzay5UaW1lU2hvcnQscGxhY2VIb2xkZXI6ImhoOm1tIn0pKTpjb25zb2xlLndhcm4oIklucHV0TWFzayBub3QgZm91bmQgKGh0dHBzOi8vd3d3LmNzc3NjcmlwdC5jb20vbGlnaHR3ZWlnaHQtcHVyZS1qYXZhc2NyaXB0LWlucHV0LW1hc2svKSIpfSxxPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7YSh7aHRtbDoiPGRpdiBjbGFzcz0nanNvbi1keW4tZm9ybSc+IitnKGspKyI8L2Rpdj4iLGV2ZW50TGlzdDp3LGFwaVVzYWdlOnh9KX0pO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihiLGMpe3EudGhlbihmdW5jdGlvbihjKXtoLnJlbW92ZUV2ZW50TGlzdGVuZXIoImZpbGxlZCIsYS5mb3JtRmlsbGVkKTsKYS5sb2coIkZpbGxpbmcgezB9Ii5mb3JtYXQoaC5pZCkpO2guaW5uZXJIVE1MPWMuaHRtbDtwKGMpO2IoKTtoLmFkZEV2ZW50TGlzdGVuZXIoImZpbGxlZCIsYS5mb3JtRmlsbGVkKX0pLmNhdGNoKGMpfSl9O2EuaW5pdD1mdW5jdGlvbigpe2EucmVxdWVzdEZ1bmN0aW9uPXljb21tLmludm9rZTthZGRFdmVudCgiLm9wLW1lbnUiLCJjbGljayIsYS5vcGVuVGFiKTthZGRFdmVudCgiLmJ0bi1hdHVhbGl6YXIiLCJjbGljayIsYS5yZWZyZXNoVGFibGUpO2FkZEV2ZW50KCIuYnRuLWFkaWNpb25hciIsImNsaWNrIixhLmluc2VydERhdGEpO2FkZEV2ZW50KCIuYnRuLXVwZGF0ZSIsImNsaWNrIixhLnJlZnJlc2hUYWJsZSk7YWRkRXZlbnQoIi5idG4tYWRkIiwiY2xpY2siLGEuaW5zZXJ0RGF0YSk7YS5hbGxvd0NhY2hlRm9ybT0hMTthLl9yZXBlYXRhYmxlRmllbGRJbmZvPVtdO3ZhciBiPXkkKCIudGFibGUiKTtiJiZiLmZvckVhY2goZnVuY3Rpb24oYSl7InllcyI9PShhLmdldEF0dHJpYnV0ZSgiZGF0YS1kYnRhYmxlIil8fAoibm8iKSYmeWNvbW0uZG9tLmZpbGxFbGVtZW50KGEuaWQse30pfSk7c2V0VGltZW91dChmdW5jdGlvbigpe2Eub3BlblRhYih3aW5kb3cubG9jYXRpb24uaGFzaCl9LDUxMik7cmV0dXJuIGF9O3JldHVybiBhLmluaXQoKX07ImZ1bmN0aW9uIj09dHlwZW9mIGFkZE9uTG9hZE1hbmFnZXImJmFkZE9uTG9hZE1hbmFnZXIoZnVuY3Rpb24oKXt5SW50ZXJmYWNlPXlJbnRlcmZhY2VPYmooKX0pO19kdW1wKCJ5aW50ZXJmYWNlIik7");


function solveReferenceFromFile($targetFile, $hostFile) {
  global $baseToExport;
  if (substr($targetFile, 0, strlen($baseToExport)) == $baseToExport)
    $targetFile = substr($targetFile, strlen($baseToExport));
  if (substr($hostFile, 0, strlen($baseToExport)) == $baseToExport)
    $hostFile = substr($hostFile, strlen($baseToExport));
  $slashCount = substr_count($hostFile, "/") - 1;
  $ret = str_replace("//", "/", str_repeat("../", $slashCount).$targetFile);
  if (dirname($targetFile)==dirname($hostFile))
    $ret = basename($ret);
  if ($GLOBALS['toDebug']) {
    echo "+---------------------------------------------\n";
    echo "| $targetFile\n";
    echo "| $hostFile\n";
    echo "+---------------------------------------------\n";
    echo "| $ret\n";
    echo "+---------------------------------------------\n";
  }
  return $ret;
}

  function cssSource ($hostFile) {
    global $cssSourceArray;
    $ret = "\n";
    foreach($cssSourceArray as $key=>$value) {
      if (substr($value, 0, 2)=='//')
        $source = $value;
      else
        $source = solveReferenceFromFile($value, $hostFile);
      $ret.="\t<link rel='stylesheet' href='$source' />\n";
    }
    return $ret;
  }

function writeHTMLHeader($margin, $title="", $htmlFilename="") {
  global $outputFiles, $ofNdx, $baseToExport;
  if ($htmlFilename=="")
    $htmlFilename=$outputFiles[$ofNdx];

  $auxBase = str_replace("//", "/", dirname($htmlFilename));
  $auxBase = y_solve_parent_reference($auxBase);
  $slashCount = substr_count($auxBase,"/") - 1;
  $base     = str_repeat("../", $slashCount);
  $title=str_replace("//", "/", $title);
  $thisFileName=$title;
  if ($title=="")
    $thisFileName=$htmlFilename;
  $thisFileName=str_replace("//", "/", $thisFileName);

  $thisFileName=str_replace(".html", "", $thisFileName);
  $thisFileName="<a onclick='goBack()'><i class='fa fa-chevron-left' aria-hidden='true'></i></a>&nbsp;$thisFileName";

  file_put_contents($htmlFilename, "\n<!-- [ $base ] -->\n", FILE_APPEND);

  $cssSource = cssSource($htmlFilename);

  if (true) {
    $htmlText = "<!DOCTYPE html>
                  <html lang='en'>
                    <head>
                      <meta charset='utf-8' />
                      <meta http-equiv='x-ua-compatible' content='ie=edge' />
                      <meta name='viewport' content='width=device-width, initial-scale=1' />

                      <title>$title</title>

                      $cssSource

                      <link rel='icon' href='".$base."images/favicon.png' />
                      <script src='".$base."js/yloader.min.js'></script>
                      <script src='".$base."js/ydocviewer.min.js'></script>
                    </head>

                    <style>
                      .docEntry {
                        padding-left: 16px;
                      }
                    </style>

                    <script>
                    window.homeHistoryPosition = 0;
                      function goBack() {window.history.go(homeHistoryPosition);}
                    </script>

                    <body><h2>$thisFileName</h2>\n";
  } else {
    $htmlText="<!DOCTYPE html><html lang='en'><body>\n";
  }
  $htmlText .= "\n<!-- ".dirname($htmlFilename)."/$base -->\n";
  if ($GLOBALS['toDebug']) echo "@DEBUG  Writting $htmlFilename header --------\\\n";
  file_put_contents($htmlFilename, $htmlText, FILE_APPEND);
  chmod($htmlFilename, 0755);
}

function writeHTMLFooter($margin, $htmlFilename="") {
  global $outputFiles, $ofNdx;
  if ($htmlFilename=="")
    $htmlFilename=$outputFiles[$ofNdx];

  $htmlText = "<hr>\n";
  if ($margin<=1)
    $htmlText.="<small>YeAPF documenter 0.8.64 - Copyright (C) 2004-2021 Esteban Daniel Dortta - dortta@yahoo.com - MIT License</small></body></html>\n";
  if ($GLOBALS['toDebug']) echo "@DEBUG  Writting $htmlFilename footer --------/\n";
  file_put_contents($htmlFilename, $htmlText, FILE_APPEND);
  chmod($htmlFilename, 0755);
}

function replace_extension($filename, $new_extension) {
    $info = pathinfo($filename);
    $currentExt = '.'.$info['extension'];
    return $info['dirname'].'/'.$info['filename'] . $new_extension;
}



function processMDFile($sourceFilename) {
  global $baseToExport, $currentSourceFileName, $mdSourceFolder;

  $lastSourceFileName = $currentSourceFileName;
  $currentSourceFileName=$sourceFilename;

  $Parsedown = new Parsedown();
  $sourceFileContent = @file_get_contents($currentSourceFileName);
  $sourceFileContent = convertLatin1ToHtml($sourceFileContent);
  // $sourceFileContent = htmlentities($sourceFileContent, ENT_COMPAT | ENT_HTML5, ini_get("default_charset"), false );
  $currentSourceFileName = y_solve_parent_reference(substr($currentSourceFileName, strlen($baseToExport)));
  // echo "$currentSourceFileName\n";
  $ret = $Parsedown->text($sourceFileContent."\n\n>$currentSourceFileName");

  $pattern = '/<a[^>]+href=([\'"])(?<href>[\/.][a-z\-\/\.\#\_]*)\1[^>]*>/i';
  $ret = preg_replace_callback($pattern, function ($matches) {
            global $baseToExport, $currentSourceFileName, $toDestroy,
                   $mdSourceFolder, $dictionaryIndex;
            $auxHRef=$matches[0];
            $auxURL = $matches[2];
            $absoluteRef=(substr($auxURL, 0, 1) == "/");

            $cM = substr_count($matches[0], "/");
            $cB = substr_count($baseToExport, "/");

            if ((substr($auxURL, 0, 3) == "../")) {
              $cSlash = 0;
            } else {
              if ($absoluteRef)
                $cSlash = $cM - 1;
              else
                $cSlash = $cM - $cB + 1;
            }
            if ($GLOBALS['toDebug']) {
              print_r($matches);
              echo "\n@DEBUG URL m:$cM b:$cB cSlash: $cSlash auxHRef: $auxHRef\n";
            }
            //$c=substr_count($currentSourceFileName, "/")-1;

            $cc=preg_match('/([\'\"])(?<href>[\/.][a-z\-\/\.\#\_]*)\1[^>]*>/i', $matches[0], $arranjo);
            if ($cc) {
              $quote = $arranjo[1];
              $target = $arranjo[2];

              if ($absoluteRef) {
                $fileLocation = str_replace('//', '/', $baseToExport."/".$target);
              } else {
                $fileLocation = str_replace('//', '/', $baseToExport.dirname($currentSourceFileName)."/".str_repeat("../", $cSlash).$target);
              }
              $target = str_repeat("../", $cSlash).$target;
              if ($GLOBALS['toDebug']) echo "Crude:  ".$fileLocation."\n";
              $fileLocation=y_solve_parent_reference($fileLocation);
              if ($GLOBALS['toDebug']) echo "Solved: ".$fileLocation."\n";

              $auxTarget = solveReferenceFromFile($fileLocation, $currentSourceFileName);

              if ($GLOBALS['toDebug']) echo "MDFILE: $fileLocation \n  +---->( TGT: $target CURRENT: $currentSourceFileName ASREF: $auxTarget CSlash: $cSlash )\n";

              $fileResourceLocation = explode("#", $fileLocation);
              $ext = pathinfo($fileResourceLocation[0], PATHINFO_EXTENSION);
              if (mb_strtolower($ext)=="md") {

                $mdSource=explode(",", $mdSourceFolder);
                $found=false;
                $sourceInnerFilename = $fileResourceLocation[0];
                $importFolder = $baseToExport;
                for($c=0; $c<count($mdSource) && !$found; $c++) {
                  $folder=$mdSource[$c];
                  if ($folder!=$baseToExport) {
                    $auxSourceFilename = str_replace($baseToExport, $folder, $sourceInnerFilename);
                    $found=file_exists($auxSourceFilename);
                    if ($found) {
                      $importFolder = $folder;
                      $sourceInnerFilename=$auxSourceFilename;
                    }
                  }
                }

                if (file_exists($sourceInnerFilename)) {
                  // echo "$baseToExport\n$sourceInnerFilename ($importFolder)\n";
                  $auxTarget = str_replace(".$ext", ".html", $auxTarget);

                  $newFilename = str_replace(".$ext", ".html", $sourceInnerFilename);
                  $newFilename = str_replace($importFolder, $baseToExport, $newFilename);


                  $sourceTimestamp = filemtime($sourceInnerFilename);
                  if (file_exists($newFilename))
                    $targetTimestamp = filemtime($newFilename);
                  else {
                    $targetTimestamp = 0;
                  }

                  $simplifiedName = substr($newFilename, strlen($baseToExport));

                  if (!isset($dictionaryIndex[$simplifiedName])) {
                    $dictionaryIndex[$simplifiedName] = 0;
                  }
                  $dictionaryIndex[$simplifiedName]++;


                  if ($targetTimestamp<=$sourceTimestamp) {

                    $htmlTextFromMD = processMDFile($sourceInnerFilename);

                    $aName=basename($currentSourceFileName);

                    $htmlText = "<style>\n.crossRef { margin-left: 8px; padding-right: 8px; border-left: solid 2px #929eaa; margin-right: 8px; padding-left: 16px; }\n</style>\n";

                    $htmlText .= "<div class='container'><div class='row'><div class='column'><div class='docEntry' id='$aName' style='display:block'>$htmlTextFromMD</div></div></div></div>";

                    echo "Writting $newFilename\n";
                    if (!is_dir(dirname($newFilename))) {
                      echo "Creating ".dirname($newFilename)."\n";
                      mkdir(dirname($newFilename));
                    }

                    if (file_exists($newFilename))
                      unlink($newFilename);
                    writeHTMLHeader(0, $target, $newFilename);
                    if ($GLOBALS['toDebug']) echo "@DEBUG  Writting $newFilename content\n";
                    if (!@file_put_contents($newFilename, $htmlText, FILE_APPEND)) {
                      die("Was not possible to write $newFilename\n");
                    }

                  }
                  $retroTarget = str_replace(".$ext", ".html", solveReferenceFromFile($currentSourceFileName, $fileLocation));
                  if ($GLOBALS['toDebug']) echo "@DEBUG [ $retroTarget ]\n";

                  $c3 = preg_match('/(\.){2}(\/([a-z\-]*))*\.(([a-z])*)/i', $retroTarget, $expRetroHref);
                  if ($c3>0) {
                    $retroTarget = $expRetroHref[0];
                  }
                  $extRetroRef = pathinfo($retroTarget, PATHINFO_EXTENSION);

                  $retroHref = str_replace(".$extRetroRef", ".$extRetroRef.html", $retroTarget);
                  $retroHref = "<span class='crossRef'><em><a href='$retroHref'>$retroHref</a></em></span>";

                  $auxHTML = file_get_contents($newFilename);
                  if (!strpos($auxHTML, $retroHref))
                    file_put_contents($newFilename, $retroHref, FILE_APPEND);
                } else {
                  echo "WARNING: File not found: $sourceInnerFilename\n";
                }
              }


              $url=$auxTarget;
              $url=str_replace('//', '/', $url);
              if ($GLOBALS['toDebug']) echo "@DEBUG URL: $url\n";
              $href="<a href=\"$url\">";
            }
            return $href;
        }, $ret);
  $currentSourceFileName = $lastSourceFileName;
  return $ret;
}

function writeHTMLInfo($htmlText, $detailName="", $detail=null) {
  global $baseToExport, $mdSourceFolder, $toExport, $outputFiles, $ofNdx, $aMap, $aSequence, $doPartial,
         $currentSourceFileName;

  $canDo = false;
  if ($toExport) {
    $htmlText = trim($htmlText);
    if ($htmlText > '') {
      $aSequence++;
      $aName          = $detailName; //md5($aSequence);
      $targetFileName = substr($outputFiles[$ofNdx], strlen($baseToExport) + 1);
      if ($detailName > "") {
        $sourceFilename = replace_extension($outputFiles[$ofNdx], ".auxmd");
        $sourceFilename = str_replace(".auxmd", "-$detailName.md", $sourceFilename);
        if (!file_exists($sourceFilename)) {
          $mdSource=explode(",", $mdSourceFolder);
          $found=false;
          for($c=0; $c<count($mdSource) && !$found; $c++) {
            $folder=$mdSource[$c];
            if ($folder!=$baseToExport) {
              $auxSourceFilename = str_replace($baseToExport, $folder, $sourceFilename);
              $found=file_exists($auxSourceFilename);
              if ($found)
                $sourceFilename=$auxSourceFilename;
            }
          }
        }
        if (file_exists($sourceFilename)) {
          $documentationText = processMDFile($sourceFilename);
          $canDo=true;
        } else {
          $documentationText="File <b>$sourceFilename</b> not found.";
          $canDo = !$doPartial;
        }
      } else {
        $documentationText="Write your doc here...";
        $canDo=true;
      }
      if ($canDo) {
        /* main index entry */
        if (!isset($aMap[$targetFileName]))
          $aMap[$targetFileName] = array();
        $aMap[$targetFileName][$htmlText] = $targetFileName . "#$aName";

        if (is_array($detail)) {
          if ((isset($detail['code'])) && (!$doPartial)) {
            $codeInfo = ' md5: '.$detail['code']['md5'].' start: '.$detail['code']['start'].' end: '.$detail['code']['end'];
            $documentationText = "\n\n<div><pre>$codeInfo</pre></div>\n\n$documentationText\n\n";
          }
        }
        /* html body */
        $htmlText = "<div class='container'><div class='row'><div class='column'><a name='$aName'></a><h3><a href='#$aName' class='expand-document' data-id='$aName'><i class='fa fa-caret-right expander-$aName'></i>&nbsp;&nbsp;$htmlText</a></h3></div></div><div class='row'><div class='column'><div class='docEntry' id='$aName' style='display: none'>$documentationText</div></div></div></div>";
        file_put_contents($outputFiles[$ofNdx], $htmlText, FILE_APPEND);
        chmod($outputFiles[$ofNdx], 0755);
      }
    }
  }
  return $canDo;
}

function showXdbInfo($margin, $xml, $type = 'file') {
  global $baseToExport, $toExport, $outputFiles, $ofNdx, $toDestroy;

  $toDebug = true;

  $oldOfNdx = $ofNdx;

  $textReturn = "";
  if (isset($xml)) {
    $xml       = object2array($xml);
    $marginStr = str_repeat(" ", $margin * 2);
    foreach ($xml as $info => $detail) {
      if ($type == 'file') {
        if (isset($detail['folder'])) {
          $textReturn .= urldecode($marginStr . "$info at " . $detail['folder'] . "\n");
          if ($toExport) {
            $auxOutFolder = urldecode("$baseToExport/" . $detail['folder']);
            if (!file_exists($auxOutFolder))
              mkdir($auxOutFolder, 0755, true);
            $ofNdx++;
            $outputFiles[$ofNdx] = "$auxOutFolder/$info.html";
            if ($toExport) {
              if (file_exists($outputFiles[$ofNdx])) {
                if ($toDestroy) {
                  if (!unlink($outputFiles[$ofNdx]))
                    die("'" . $outputFiles[$ofNdx] . "' cannot be deleted");
                } else
                  die("'" . $outputFiles[$ofNdx] . "' already exists. Use '-d' to destroy\n");
              }
            }
          }
        }
      } else if ($type == 'func') {
        if (!is_numeric($info)) {
          if (isset($detail['name']))
            $detailName = $detail['name'];
          else
            $detailName = "";
          $funcDeclaration = urldecode($marginStr . "function " . $detailName . " (");
          $pCount          = 0;
          if (isset($detail['parameters'])) {
            foreach ($detail['parameters'] as $paramName => $dummy) {
              if ($pCount++ > 0)
                $funcDeclaration .= ", ";
              $funcDeclaration .= $paramName;
            }
          }
          $funcDeclaration .= ")\n";
          if (writeHTMLInfo($funcDeclaration, $detailName, $detail)) {
            if ($detailName>"") {
              $textReturn .= $funcDeclaration;
            }
          }

        }
      } else if ($type == 'class') {
        if (!is_numeric($info)) {
          $textReturn .= urldecode($marginStr . "class $info\n");
          writeHTMLInfo("class $info");
        }
      } else if ($type == 'inner') {
        $textReturn .= "*";
      }
      if ($type == 'file') {
        writeHTMLHeader($margin, $outputFiles[$ofNdx]);
      }
      $insideInfo = viewInside($margin, $detail);
      if ($type == 'file') {
        writeHTMLFooter($margin);
      }
      $textReturn .= $insideInfo;
    }
  }
  $ofNdx = $oldOfNdx;
  return $textReturn;
}

function deleteHTMLFiles($folder) {
  foreach (glob("$folder/*") as $filename) {
    if (is_dir($filename)) {
      deleteHTMLFiles($filename);
    } else {
      if (fnmatch("*.html", $filename)) {
        unlink($filename);
      }
    }
  }
}

function viewInside($margin, $detail) {

  $textReturn = "";
  $marginStr  = str_repeat(" ", $margin * 2);

  if (isset($detail['inner'])) {
    $textReturn .= viewInside($margin + 1, $detail['inner']);
  }
  if (isset($detail['classes'])) {
    $textReturn .= showXdbInfo($margin + 1, $detail['classes'], 'class');
  }
  if (isset($detail['functions'])) {
    $textReturn .= showXdbInfo($margin + 1, $detail['functions'], 'func');
  }

  return $textReturn;
}

$mydir      = dirname($_SERVER['SCRIPT_FILENAME']);
$cmRequired = false;
if (file_exists("$mydir/yclilib.php"))
  $cmLocation = "$mydir/yclilib.php";
else
  $cmLocation = "$mydir/../yclilib.php";

(@include_once "$cmLocation") or die("yclilib.php not found\n");

$parseDownLibPresent=false;
if (file_exists("$mydir/lib/Parsedown.php")) {
  (@include_once "$mydir/lib/Parsedown.php") or die("$mydir/lib/Parsedown.php not found\n");
  $parseDownLibPresent=true;
}
else
  echo "Parsedown library ($mydir/lib/Parsedown.php) not found.\nYou cannot do partial documentation\n";

$cwd            = getcwd();
$args           = new ArgumentsProcessor(false);
$myself         = basename($argv[0]);
$filename       = $args->getSrc(0);
$baseToExport   = $args->getSrc(1);
$fileTitle      = $args->argValue('title;t', basename($filename));
$mdSourceFolder = $args->argValue('mdsource;s', $baseToExport);
$toHelp         = $args->argValue('help;h', __FALSE__) == __TRUE__;
$toDestroy      = $args->argValue('destroy;d', __FALSE__) == __TRUE__;
$doQuiet        = $args->argValue('quiet;q', __FALSE__) == __TRUE__;
$doPartial      = ($args->argValue('partial;p', __FALSE__) == __TRUE__) && ($parseDownLibPresent);
$toExport       = trim($baseToExport) > '';

if (substr($baseToExport, strlen($baseToExport)-1,1)=="/")
  $baseToExport=substr($baseToExport, 0, strlen($baseToExport)-1);
$mdSourceFolder.=",$baseToExport";
$dictionaryIndex = array();


echo "YeAPF 0.8.64 $myself\nCopyright (C) 2004-2021 Esteban Daniel Dortta - dortta@yahoo.com - MIT License\n";
if (($toHelp) || (trim($filename) == '')) {
  echo "usage:\n";
  echo "\t$myself <filename> [output-folder] [--destroy] [--partial] [--quiet]\n";
  echo "\t\tfilename\tis a .xdb created by ydocbuilder\n";
  echo "\t\toutput-folder\tis used to write html files\n";
  echo "\t\t--title   \t(-t) file title (defaults to filename)\n";
  echo "\t\t--quiet   \t(-q) shows minimal information\n";
  echo "\t\t--destroy \t(-d) clean the output-folder (delete all html files in folder)\n";
  echo "\t\t--partial \t(-p) write information only for those items that have a .md correspondent file\n";
  echo "\t\t--mdsource\t(-s) indicate where .md files are located. By default are at 'output-folder'. use ',' to split folders\n";
  echo "In orther to create your .md files, you can use a tool like https://stackedit.io/app#\n";
  echo "In such case, you need to create each file with .md extension\n";
  echo "For example: lib/grant_rights.js will become lib/grant_rights.js.md\n";
  echo "NOTE: .md files are not deleted with -d parameter\n";
  exit(0);
}

clearstatcache();

$dbConnect='no';
error_reporting(E_ALL);
ini_set('display_errors', 1);
_LOAD_YEAPF_();

if (!$doQuiet) {
  echo "Processing $filename\n";
}

if (file_exists($filename)) {

  if ($toDestroy) {
    deleteHTMLFiles($baseToExport);
  }

  $xml = simplexml_load_file($filename);
  if ($toExport) {
    if (is_dir($baseToExport)) {
      if (file_exists("$baseToExport/$filename.html")) {
        if ($toDestroy) {
          if (!unlink("$baseToExport/$filename.html"))
            die("\nimpossible to delete '$baseToExport/$filename.html'\n");
        } else
          die("\n'$baseToExport/$filename.html' already exists. You can use '-d' parameter to destroy it\n");
      }
    } else if (!mkdir($baseToExport))
      die("\nimpossible to create '$baseToExport'\n");
  } else {
    echo "File not found: $filename\n";
  }

  if (file_exists("$baseToExport/css/normalize.css")) {
    $cssSourceArray = array( 'css/normalize.css',
                             'css/milligram.css',
                             'css/roboto.css',
                             'css/font-awesome.css');
  } else {
    $cssSourceArray = array(
                             '//cdn.rawgit.com/necolas/normalize.css/master/normalize.css',
                             '//cdn.rawgit.com/milligram/milligram/master/dist/milligram.min.css',
                             '//fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic',
                             '//stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css');
  }

  $mainIndexFilename = "$baseToExport/" . basename($filename) . ".html";
  $cssSource = cssSource($mainIndexFilename);

  $xdbInfo = showXdbInfo(0, $xml);
  if (!$doQuiet)
    echo $xdbInfo;
  $docMap = "<!DOCTYPE html>
              <html lang='en'>
                <head>
                  <meta charset='utf-8' />
                  <meta http-equiv='x-ua-compatible' content='ie=edge' />
                  <meta name='viewport' content='width=device-width, initial-scale=1' />

                  <title>$fileTitle</title>

                  $cssSource

                  <link rel='icon' href='images/favicon.png' />
                  <script src='js/yloader.min.js'></script>
                  <script src='js/ydocviewer.js'></script>
                </head>

                <style>
                  .docEntry {
                    padding-left: 16px;
                  }
                </style>

                <body><div class='container'><div class='row'><div class='column'><h1>YeAPF Documenter</h1><h3>YeAPF 0.8.64</h3><strong>Copyright (C) 2004-2021 Esteban Daniel Dortta - dortta@yahoo.com - MIT License</strong></div></div><a href='#crossReference'>Cross Reference</a><hr>\n";

  $dictionaryIndexText = "";
  ksort($dictionaryIndex);
  foreach ($dictionaryIndex as $indexEntry => $count) {
    echo "\t$indexEntry ($count)\n";
    if (substr($indexEntry,0,1)=="/")
      $indexEntry = substr($indexEntry,1);
    $indexEntryTag=basename($indexEntry);
    $dictionaryIndexText.="<li><a href='$indexEntry'>$indexEntryTag</a></li>\n";
  }
  $dictionaryIndexText="<div class='row'><div class='column'><H2><strong>Cross reference</strong></H2><ul>$dictionaryIndexText</ul></div></div>";

  ksort($aMap);

  foreach ($aMap as $auxFileName => $elements) {
    $auxFileName = str_replace(".html", "", $auxFileName);
    $docMap .= "\n\n<div class='row'><div class='column'><h2>$auxFileName</h2></div></div>\n";
    $docMap .= "<div class='row'><div class='column'><ul>";
    foreach ($elements as $elemName => $aHref)
      $docMap .= "\t<li><a href='$aHref'>$elemName</a></li>\n";
    $docMap .= "</ul>\n</div><!--column-->\n</div><!--row-->\n";
  }
  $docMap .= "\n<a name='crossReference'></a>\n$dictionaryIndexText\n</div><!--container-->\n</body>\n</html>\n";
  file_put_contents($mainIndexFilename, $docMap);
  if (!$doQuiet)
    echo "End.\n";


  if (!file_exists("$baseToExport/js/ydocviewer.min.js")) {
    if (!is_dir("$baseToExport/js")) {
      if (!@mkdir("$baseToExport/js")) {
        echo "$baseToExport/js cannot be created\n";
        exit(20);
      }
    }
    echo "Writting $baseToExport/js/ydocviewer.min.js\n";
    if (false===@file_put_contents("$baseToExport/js/ydocviewer.min.js", $ydocviewer_min_js)) {
      echo "Was not possible to create '$baseToExport/js/ydocviewer.min.js'\n";
      exit(20);
    }
  }

  if (!file_exists("$baseToExport/js/yloader.min.js")) {
    if (!is_dir("$baseToExport/js")) {
      if (!@mkdir("$baseToExport/js")) {
        echo "$baseToExport/js cannot be created\n";
        exit(20);
      }
    }
    echo "Writting $baseToExport/js/yloader.min.js\n";
    if (false===@file_put_contents("$baseToExport/js/yloader.min.js", $yloader_min_js)) {
      echo "Was not possible to create '$baseToExport/js/yloader.min.js'\n";
      exit(20);
    }
  }

} else
  die("\nfile '$filename' not found\n");
?>
