diff options
70 files changed, 2003 insertions, 1658 deletions
diff --git a/README.html b/README.html index f9d8eff9..df7ac712 100644 --- a/README.html +++ b/README.html @@ -4,7 +4,7 @@ <head> -<meta charset="utf-8"> +<meta charset="utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="generator" content="pandoc" /> @@ -19,7 +19,7 @@ <script src="data:application/x-javascript;base64,LyohCiAqIEJvb3RzdHJhcCB2My4zLjUgKGh0dHA6Ly9nZXRib290c3RyYXAuY29tKQogKiBDb3B5cmlnaHQgMjAxMS0yMDE1IFR3aXR0ZXIsIEluYy4KICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqLwppZigidW5kZWZpbmVkIj09dHlwZW9mIGpRdWVyeSl0aHJvdyBuZXcgRXJyb3IoIkJvb3RzdHJhcCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5Iik7K2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgYj1hLmZuLmpxdWVyeS5zcGxpdCgiICIpWzBdLnNwbGl0KCIuIik7aWYoYlswXTwyJiZiWzFdPDl8fDE9PWJbMF0mJjk9PWJbMV0mJmJbMl08MSl0aHJvdyBuZXcgRXJyb3IoIkJvb3RzdHJhcCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5IHZlcnNpb24gMS45LjEgb3IgaGlnaGVyIil9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYm9vdHN0cmFwIiksYj17V2Via2l0VHJhbnNpdGlvbjoid2Via2l0VHJhbnNpdGlvbkVuZCIsTW96VHJhbnNpdGlvbjoidHJhbnNpdGlvbmVuZCIsT1RyYW5zaXRpb246Im9UcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kIix0cmFuc2l0aW9uOiJ0cmFuc2l0aW9uZW5kIn07Zm9yKHZhciBjIGluIGIpaWYodm9pZCAwIT09YS5zdHlsZVtjXSlyZXR1cm57ZW5kOmJbY119O3JldHVybiExfWEuZm4uZW11bGF0ZVRyYW5zaXRpb25FbmQ9ZnVuY3Rpb24oYil7dmFyIGM9ITEsZD10aGlzO2EodGhpcykub25lKCJic1RyYW5zaXRpb25FbmQiLGZ1bmN0aW9uKCl7Yz0hMH0pO3ZhciBlPWZ1bmN0aW9uKCl7Y3x8YShkKS50cmlnZ2VyKGEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCl9O3JldHVybiBzZXRUaW1lb3V0KGUsYiksdGhpc30sYShmdW5jdGlvbigpe2Euc3VwcG9ydC50cmFuc2l0aW9uPWIoKSxhLnN1cHBvcnQudHJhbnNpdGlvbiYmKGEuZXZlbnQuc3BlY2lhbC5ic1RyYW5zaXRpb25FbmQ9e2JpbmRUeXBlOmEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCxkZWxlZ2F0ZVR5cGU6YS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLGhhbmRsZTpmdW5jdGlvbihiKXtyZXR1cm4gYShiLnRhcmdldCkuaXModGhpcyk/Yi5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfX0pfSl9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGU9Yy5kYXRhKCJicy5hbGVydCIpO2V8fGMuZGF0YSgiYnMuYWxlcnQiLGU9bmV3IGQodGhpcykpLCJzdHJpbmciPT10eXBlb2YgYiYmZVtiXS5jYWxsKGMpfSl9dmFyIGM9J1tkYXRhLWRpc21pc3M9ImFsZXJ0Il0nLGQ9ZnVuY3Rpb24oYil7YShiKS5vbigiY2xpY2siLGMsdGhpcy5jbG9zZSl9O2QuVkVSU0lPTj0iMy4zLjUiLGQuVFJBTlNJVElPTl9EVVJBVElPTj0xNTAsZC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYygpe2cuZGV0YWNoKCkudHJpZ2dlcigiY2xvc2VkLmJzLmFsZXJ0IikucmVtb3ZlKCl9dmFyIGU9YSh0aGlzKSxmPWUuYXR0cigiZGF0YS10YXJnZXQiKTtmfHwoZj1lLmF0dHIoImhyZWYiKSxmPWYmJmYucmVwbGFjZSgvLiooPz0jW15cc10qJCkvLCIiKSk7dmFyIGc9YShmKTtiJiZiLnByZXZlbnREZWZhdWx0KCksZy5sZW5ndGh8fChnPWUuY2xvc2VzdCgiLmFsZXJ0IikpLGcudHJpZ2dlcihiPWEuRXZlbnQoImNsb3NlLmJzLmFsZXJ0IikpLGIuaXNEZWZhdWx0UHJldmVudGVkKCl8fChnLnJlbW92ZUNsYXNzKCJpbiIpLGEuc3VwcG9ydC50cmFuc2l0aW9uJiZnLmhhc0NsYXNzKCJmYWRlIik/Zy5vbmUoImJzVHJhbnNpdGlvbkVuZCIsYykuZW11bGF0ZVRyYW5zaXRpb25FbmQoZC5UUkFOU0lUSU9OX0RVUkFUSU9OKTpjKCkpfTt2YXIgZT1hLmZuLmFsZXJ0O2EuZm4uYWxlcnQ9YixhLmZuLmFsZXJ0LkNvbnN0cnVjdG9yPWQsYS5mbi5hbGVydC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4uYWxlcnQ9ZSx0aGlzfSxhKGRvY3VtZW50KS5vbigiY2xpY2suYnMuYWxlcnQuZGF0YS1hcGkiLGMsZC5wcm90b3R5cGUuY2xvc2UpfShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YSgiYnMuYnV0dG9uIiksZj0ib2JqZWN0Ij09dHlwZW9mIGImJmI7ZXx8ZC5kYXRhKCJicy5idXR0b24iLGU9bmV3IGModGhpcyxmKSksInRvZ2dsZSI9PWI/ZS50b2dnbGUoKTpiJiZlLnNldFN0YXRlKGIpfSl9dmFyIGM9ZnVuY3Rpb24oYixkKXt0aGlzLiRlbGVtZW50PWEoYiksdGhpcy5vcHRpb25zPWEuZXh0ZW5kKHt9LGMuREVGQVVMVFMsZCksdGhpcy5pc0xvYWRpbmc9ITF9O2MuVkVSU0lPTj0iMy4zLjUiLGMuREVGQVVMVFM9e2xvYWRpbmdUZXh0OiJsb2FkaW5nLi4uIn0sYy5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oYil7dmFyIGM9ImRpc2FibGVkIixkPXRoaXMuJGVsZW1lbnQsZT1kLmlzKCJpbnB1dCIpPyJ2YWwiOiJodG1sIixmPWQuZGF0YSgpO2IrPSJUZXh0IixudWxsPT1mLnJlc2V0VGV4dCYmZC5kYXRhKCJyZXNldFRleHQiLGRbZV0oKSksc2V0VGltZW91dChhLnByb3h5KGZ1bmN0aW9uKCl7ZFtlXShudWxsPT1mW2JdP3RoaXMub3B0aW9uc1tiXTpmW2JdKSwibG9hZGluZ1RleHQiPT1iPyh0aGlzLmlzTG9hZGluZz0hMCxkLmFkZENsYXNzKGMpLmF0dHIoYyxjKSk6dGhpcy5pc0xvYWRpbmcmJih0aGlzLmlzTG9hZGluZz0hMSxkLnJlbW92ZUNsYXNzKGMpLnJlbW92ZUF0dHIoYykpfSx0aGlzKSwwKX0sYy5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKCl7dmFyIGE9ITAsYj10aGlzLiRlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLXRvZ2dsZT0iYnV0dG9ucyJdJyk7aWYoYi5sZW5ndGgpe3ZhciBjPXRoaXMuJGVsZW1lbnQuZmluZCgiaW5wdXQiKTsicmFkaW8iPT1jLnByb3AoInR5cGUiKT8oYy5wcm9wKCJjaGVja2VkIikmJihhPSExKSxiLmZpbmQoIi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIiksdGhpcy4kZWxlbWVudC5hZGRDbGFzcygiYWN0aXZlIikpOiJjaGVja2JveCI9PWMucHJvcCgidHlwZSIpJiYoYy5wcm9wKCJjaGVja2VkIikhPT10aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJhY3RpdmUiKSYmKGE9ITEpLHRoaXMuJGVsZW1lbnQudG9nZ2xlQ2xhc3MoImFjdGl2ZSIpKSxjLnByb3AoImNoZWNrZWQiLHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImFjdGl2ZSIpKSxhJiZjLnRyaWdnZXIoImNoYW5nZSIpfWVsc2UgdGhpcy4kZWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLCF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJhY3RpdmUiKSksdGhpcy4kZWxlbWVudC50b2dnbGVDbGFzcygiYWN0aXZlIil9O3ZhciBkPWEuZm4uYnV0dG9uO2EuZm4uYnV0dG9uPWIsYS5mbi5idXR0b24uQ29uc3RydWN0b3I9YyxhLmZuLmJ1dHRvbi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4uYnV0dG9uPWQsdGhpc30sYShkb2N1bWVudCkub24oImNsaWNrLmJzLmJ1dHRvbi5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZV49ImJ1dHRvbiJdJyxmdW5jdGlvbihjKXt2YXIgZD1hKGMudGFyZ2V0KTtkLmhhc0NsYXNzKCJidG4iKXx8KGQ9ZC5jbG9zZXN0KCIuYnRuIikpLGIuY2FsbChkLCJ0b2dnbGUiKSxhKGMudGFyZ2V0KS5pcygnaW5wdXRbdHlwZT0icmFkaW8iXScpfHxhKGMudGFyZ2V0KS5pcygnaW5wdXRbdHlwZT0iY2hlY2tib3giXScpfHxjLnByZXZlbnREZWZhdWx0KCl9KS5vbigiZm9jdXMuYnMuYnV0dG9uLmRhdGEtYXBpIGJsdXIuYnMuYnV0dG9uLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlXj0iYnV0dG9uIl0nLGZ1bmN0aW9uKGIpe2EoYi50YXJnZXQpLmNsb3Nlc3QoIi5idG4iKS50b2dnbGVDbGFzcygiZm9jdXMiLC9eZm9jdXMoaW4pPyQvLnRlc3QoYi50eXBlKSl9KX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGIoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1kLmRhdGEoImJzLmNhcm91c2VsIiksZj1hLmV4dGVuZCh7fSxjLkRFRkFVTFRTLGQuZGF0YSgpLCJvYmplY3QiPT10eXBlb2YgYiYmYiksZz0ic3RyaW5nIj09dHlwZW9mIGI/YjpmLnNsaWRlO2V8fGQuZGF0YSgiYnMuY2Fyb3VzZWwiLGU9bmV3IGModGhpcyxmKSksIm51bWJlciI9PXR5cGVvZiBiP2UudG8oYik6Zz9lW2ddKCk6Zi5pbnRlcnZhbCYmZS5wYXVzZSgpLmN5Y2xlKCl9KX12YXIgYz1mdW5jdGlvbihiLGMpe3RoaXMuJGVsZW1lbnQ9YShiKSx0aGlzLiRpbmRpY2F0b3JzPXRoaXMuJGVsZW1lbnQuZmluZCgiLmNhcm91c2VsLWluZGljYXRvcnMiKSx0aGlzLm9wdGlvbnM9Yyx0aGlzLnBhdXNlZD1udWxsLHRoaXMuc2xpZGluZz1udWxsLHRoaXMuaW50ZXJ2YWw9bnVsbCx0aGlzLiRhY3RpdmU9bnVsbCx0aGlzLiRpdGVtcz1udWxsLHRoaXMub3B0aW9ucy5rZXlib2FyZCYmdGhpcy4kZWxlbWVudC5vbigia2V5ZG93bi5icy5jYXJvdXNlbCIsYS5wcm94eSh0aGlzLmtleWRvd24sdGhpcykpLCJob3ZlciI9PXRoaXMub3B0aW9ucy5wYXVzZSYmISgib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkmJnRoaXMuJGVsZW1lbnQub24oIm1vdXNlZW50ZXIuYnMuY2Fyb3VzZWwiLGEucHJveHkodGhpcy5wYXVzZSx0aGlzKSkub24oIm1vdXNlbGVhdmUuYnMuY2Fyb3VzZWwiLGEucHJveHkodGhpcy5jeWNsZSx0aGlzKSl9O2MuVkVSU0lPTj0iMy4zLjUiLGMuVFJBTlNJVElPTl9EVVJBVElPTj02MDAsYy5ERUZBVUxUUz17aW50ZXJ2YWw6NWUzLHBhdXNlOiJob3ZlciIsd3JhcDohMCxrZXlib2FyZDohMH0sYy5wcm90b3R5cGUua2V5ZG93bj1mdW5jdGlvbihhKXtpZighL2lucHV0fHRleHRhcmVhL2kudGVzdChhLnRhcmdldC50YWdOYW1lKSl7c3dpdGNoKGEud2hpY2gpe2Nhc2UgMzc6dGhpcy5wcmV2KCk7YnJlYWs7Y2FzZSAzOTp0aGlzLm5leHQoKTticmVhaztkZWZhdWx0OnJldHVybn1hLnByZXZlbnREZWZhdWx0KCl9fSxjLnByb3RvdHlwZS5jeWNsZT1mdW5jdGlvbihiKXtyZXR1cm4gYnx8KHRoaXMucGF1c2VkPSExKSx0aGlzLmludGVydmFsJiZjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpLHRoaXMub3B0aW9ucy5pbnRlcnZhbCYmIXRoaXMucGF1c2VkJiYodGhpcy5pbnRlcnZhbD1zZXRJbnRlcnZhbChhLnByb3h5KHRoaXMubmV4dCx0aGlzKSx0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpKSx0aGlzfSxjLnByb3RvdHlwZS5nZXRJdGVtSW5kZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuJGl0ZW1zPWEucGFyZW50KCkuY2hpbGRyZW4oIi5pdGVtIiksdGhpcy4kaXRlbXMuaW5kZXgoYXx8dGhpcy4kYWN0aXZlKX0sYy5wcm90b3R5cGUuZ2V0SXRlbUZvckRpcmVjdGlvbj1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZ2V0SXRlbUluZGV4KGIpLGQ9InByZXYiPT1hJiYwPT09Y3x8Im5leHQiPT1hJiZjPT10aGlzLiRpdGVtcy5sZW5ndGgtMTtpZihkJiYhdGhpcy5vcHRpb25zLndyYXApcmV0dXJuIGI7dmFyIGU9InByZXYiPT1hPy0xOjEsZj0oYytlKSV0aGlzLiRpdGVtcy5sZW5ndGg7cmV0dXJuIHRoaXMuJGl0ZW1zLmVxKGYpfSxjLnByb3RvdHlwZS50bz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9dGhpcy5nZXRJdGVtSW5kZXgodGhpcy4kYWN0aXZlPXRoaXMuJGVsZW1lbnQuZmluZCgiLml0ZW0uYWN0aXZlIikpO3JldHVybiBhPnRoaXMuJGl0ZW1zLmxlbmd0aC0xfHwwPmE/dm9pZCAwOnRoaXMuc2xpZGluZz90aGlzLiRlbGVtZW50Lm9uZSgic2xpZC5icy5jYXJvdXNlbCIsZnVuY3Rpb24oKXtiLnRvKGEpfSk6Yz09YT90aGlzLnBhdXNlKCkuY3ljbGUoKTp0aGlzLnNsaWRlKGE+Yz8ibmV4dCI6InByZXYiLHRoaXMuJGl0ZW1zLmVxKGEpKX0sYy5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oYil7cmV0dXJuIGJ8fCh0aGlzLnBhdXNlZD0hMCksdGhpcy4kZWxlbWVudC5maW5kKCIubmV4dCwgLnByZXYiKS5sZW5ndGgmJmEuc3VwcG9ydC50cmFuc2l0aW9uJiYodGhpcy4kZWxlbWVudC50cmlnZ2VyKGEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCksdGhpcy5jeWNsZSghMCkpLHRoaXMuaW50ZXJ2YWw9Y2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKSx0aGlzfSxjLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2xpZGluZz92b2lkIDA6dGhpcy5zbGlkZSgibmV4dCIpfSxjLnByb3RvdHlwZS5wcmV2PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2xpZGluZz92b2lkIDA6dGhpcy5zbGlkZSgicHJldiIpfSxjLnByb3RvdHlwZS5zbGlkZT1mdW5jdGlvbihiLGQpe3ZhciBlPXRoaXMuJGVsZW1lbnQuZmluZCgiLml0ZW0uYWN0aXZlIiksZj1kfHx0aGlzLmdldEl0ZW1Gb3JEaXJlY3Rpb24oYixlKSxnPXRoaXMuaW50ZXJ2YWwsaD0ibmV4dCI9PWI/ImxlZnQiOiJyaWdodCIsaT10aGlzO2lmKGYuaGFzQ2xhc3MoImFjdGl2ZSIpKXJldHVybiB0aGlzLnNsaWRpbmc9ITE7dmFyIGo9ZlswXSxrPWEuRXZlbnQoInNsaWRlLmJzLmNhcm91c2VsIix7cmVsYXRlZFRhcmdldDpqLGRpcmVjdGlvbjpofSk7aWYodGhpcy4kZWxlbWVudC50cmlnZ2VyKGspLCFrLmlzRGVmYXVsdFByZXZlbnRlZCgpKXtpZih0aGlzLnNsaWRpbmc9ITAsZyYmdGhpcy5wYXVzZSgpLHRoaXMuJGluZGljYXRvcnMubGVuZ3RoKXt0aGlzLiRpbmRpY2F0b3JzLmZpbmQoIi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIik7dmFyIGw9YSh0aGlzLiRpbmRpY2F0b3JzLmNoaWxkcmVuKClbdGhpcy5nZXRJdGVtSW5kZXgoZildKTtsJiZsLmFkZENsYXNzKCJhY3RpdmUiKX12YXIgbT1hLkV2ZW50KCJzbGlkLmJzLmNhcm91c2VsIix7cmVsYXRlZFRhcmdldDpqLGRpcmVjdGlvbjpofSk7cmV0dXJuIGEuc3VwcG9ydC50cmFuc2l0aW9uJiZ0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJzbGlkZSIpPyhmLmFkZENsYXNzKGIpLGZbMF0ub2Zmc2V0V2lkdGgsZS5hZGRDbGFzcyhoKSxmLmFkZENsYXNzKGgpLGUub25lKCJic1RyYW5zaXRpb25FbmQiLGZ1bmN0aW9uKCl7Zi5yZW1vdmVDbGFzcyhbYixoXS5qb2luKCIgIikpLmFkZENsYXNzKCJhY3RpdmUiKSxlLnJlbW92ZUNsYXNzKFsiYWN0aXZlIixoXS5qb2luKCIgIikpLGkuc2xpZGluZz0hMSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS4kZWxlbWVudC50cmlnZ2VyKG0pfSwwKX0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTikpOihlLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSxmLmFkZENsYXNzKCJhY3RpdmUiKSx0aGlzLnNsaWRpbmc9ITEsdGhpcy4kZWxlbWVudC50cmlnZ2VyKG0pKSxnJiZ0aGlzLmN5Y2xlKCksdGhpc319O3ZhciBkPWEuZm4uY2Fyb3VzZWw7YS5mbi5jYXJvdXNlbD1iLGEuZm4uY2Fyb3VzZWwuQ29uc3RydWN0b3I9YyxhLmZuLmNhcm91c2VsLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5jYXJvdXNlbD1kLHRoaXN9O3ZhciBlPWZ1bmN0aW9uKGMpe3ZhciBkLGU9YSh0aGlzKSxmPWEoZS5hdHRyKCJkYXRhLXRhcmdldCIpfHwoZD1lLmF0dHIoImhyZWYiKSkmJmQucmVwbGFjZSgvLiooPz0jW15cc10rJCkvLCIiKSk7aWYoZi5oYXNDbGFzcygiY2Fyb3VzZWwiKSl7dmFyIGc9YS5leHRlbmQoe30sZi5kYXRhKCksZS5kYXRhKCkpLGg9ZS5hdHRyKCJkYXRhLXNsaWRlLXRvIik7aCYmKGcuaW50ZXJ2YWw9ITEpLGIuY2FsbChmLGcpLGgmJmYuZGF0YSgiYnMuY2Fyb3VzZWwiKS50byhoKSxjLnByZXZlbnREZWZhdWx0KCl9fTthKGRvY3VtZW50KS5vbigiY2xpY2suYnMuY2Fyb3VzZWwuZGF0YS1hcGkiLCJbZGF0YS1zbGlkZV0iLGUpLm9uKCJjbGljay5icy5jYXJvdXNlbC5kYXRhLWFwaSIsIltkYXRhLXNsaWRlLXRvXSIsZSksYSh3aW5kb3cpLm9uKCJsb2FkIixmdW5jdGlvbigpe2EoJ1tkYXRhLXJpZGU9ImNhcm91c2VsIl0nKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKTtiLmNhbGwoYyxjLmRhdGEoKSl9KX0pfShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXt2YXIgYyxkPWIuYXR0cigiZGF0YS10YXJnZXQiKXx8KGM9Yi5hdHRyKCJocmVmIikpJiZjLnJlcGxhY2UoLy4qKD89I1teXHNdKyQpLywiIik7cmV0dXJuIGEoZCl9ZnVuY3Rpb24gYyhiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxlPWMuZGF0YSgiYnMuY29sbGFwc2UiKSxmPWEuZXh0ZW5kKHt9LGQuREVGQVVMVFMsYy5kYXRhKCksIm9iamVjdCI9PXR5cGVvZiBiJiZiKTshZSYmZi50b2dnbGUmJi9zaG93fGhpZGUvLnRlc3QoYikmJihmLnRvZ2dsZT0hMSksZXx8Yy5kYXRhKCJicy5jb2xsYXBzZSIsZT1uZXcgZCh0aGlzLGYpKSwic3RyaW5nIj09dHlwZW9mIGImJmVbYl0oKX0pfXZhciBkPWZ1bmN0aW9uKGIsYyl7dGhpcy4kZWxlbWVudD1hKGIpLHRoaXMub3B0aW9ucz1hLmV4dGVuZCh7fSxkLkRFRkFVTFRTLGMpLHRoaXMuJHRyaWdnZXI9YSgnW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2hyZWY9IiMnK2IuaWQrJyJdLFtkYXRhLXRvZ2dsZT0iY29sbGFwc2UiXVtkYXRhLXRhcmdldD0iIycrYi5pZCsnIl0nKSx0aGlzLnRyYW5zaXRpb25pbmc9bnVsbCx0aGlzLm9wdGlvbnMucGFyZW50P3RoaXMuJHBhcmVudD10aGlzLmdldFBhcmVudCgpOnRoaXMuYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuJGVsZW1lbnQsdGhpcy4kdHJpZ2dlciksdGhpcy5vcHRpb25zLnRvZ2dsZSYmdGhpcy50b2dnbGUoKX07ZC5WRVJTSU9OPSIzLjMuNSIsZC5UUkFOU0lUSU9OX0RVUkFUSU9OPTM1MCxkLkRFRkFVTFRTPXt0b2dnbGU6ITB9LGQucHJvdG90eXBlLmRpbWVuc2lvbj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoIndpZHRoIik7cmV0dXJuIGE/IndpZHRoIjoiaGVpZ2h0In0sZC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe2lmKCF0aGlzLnRyYW5zaXRpb25pbmcmJiF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJpbiIpKXt2YXIgYixlPXRoaXMuJHBhcmVudCYmdGhpcy4kcGFyZW50LmNoaWxkcmVuKCIucGFuZWwiKS5jaGlsZHJlbigiLmluLCAuY29sbGFwc2luZyIpO2lmKCEoZSYmZS5sZW5ndGgmJihiPWUuZGF0YSgiYnMuY29sbGFwc2UiKSxiJiZiLnRyYW5zaXRpb25pbmcpKSl7dmFyIGY9YS5FdmVudCgic2hvdy5icy5jb2xsYXBzZSIpO2lmKHRoaXMuJGVsZW1lbnQudHJpZ2dlcihmKSwhZi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7ZSYmZS5sZW5ndGgmJihjLmNhbGwoZSwiaGlkZSIpLGJ8fGUuZGF0YSgiYnMuY29sbGFwc2UiLG51bGwpKTt2YXIgZz10aGlzLmRpbWVuc2lvbigpO3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoImNvbGxhcHNlIikuYWRkQ2xhc3MoImNvbGxhcHNpbmciKVtnXSgwKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMCksdGhpcy4kdHJpZ2dlci5yZW1vdmVDbGFzcygiY29sbGFwc2VkIikuYXR0cigiYXJpYS1leHBhbmRlZCIsITApLHRoaXMudHJhbnNpdGlvbmluZz0xO3ZhciBoPWZ1bmN0aW9uKCl7dGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcygiY29sbGFwc2luZyIpLmFkZENsYXNzKCJjb2xsYXBzZSBpbiIpW2ddKCIiKSx0aGlzLnRyYW5zaXRpb25pbmc9MCx0aGlzLiRlbGVtZW50LnRyaWdnZXIoInNob3duLmJzLmNvbGxhcHNlIil9O2lmKCFhLnN1cHBvcnQudHJhbnNpdGlvbilyZXR1cm4gaC5jYWxsKHRoaXMpO3ZhciBpPWEuY2FtZWxDYXNlKFsic2Nyb2xsIixnXS5qb2luKCItIikpO3RoaXMuJGVsZW1lbnQub25lKCJic1RyYW5zaXRpb25FbmQiLGEucHJveHkoaCx0aGlzKSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoZC5UUkFOU0lUSU9OX0RVUkFUSU9OKVtnXSh0aGlzLiRlbGVtZW50WzBdW2ldKX19fX0sZC5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe2lmKCF0aGlzLnRyYW5zaXRpb25pbmcmJnRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImluIikpe3ZhciBiPWEuRXZlbnQoImhpZGUuYnMuY29sbGFwc2UiKTtpZih0aGlzLiRlbGVtZW50LnRyaWdnZXIoYiksIWIuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciBjPXRoaXMuZGltZW5zaW9uKCk7dGhpcy4kZWxlbWVudFtjXSh0aGlzLiRlbGVtZW50W2NdKCkpWzBdLm9mZnNldEhlaWdodCx0aGlzLiRlbGVtZW50LmFkZENsYXNzKCJjb2xsYXBzaW5nIikucmVtb3ZlQ2xhc3MoImNvbGxhcHNlIGluIikuYXR0cigiYXJpYS1leHBhbmRlZCIsITEpLHRoaXMuJHRyaWdnZXIuYWRkQ2xhc3MoImNvbGxhcHNlZCIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCExKSx0aGlzLnRyYW5zaXRpb25pbmc9MTt2YXIgZT1mdW5jdGlvbigpe3RoaXMudHJhbnNpdGlvbmluZz0wLHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoImNvbGxhcHNpbmciKS5hZGRDbGFzcygiY29sbGFwc2UiKS50cmlnZ2VyKCJoaWRkZW4uYnMuY29sbGFwc2UiKX07cmV0dXJuIGEuc3VwcG9ydC50cmFuc2l0aW9uP3ZvaWQgdGhpcy4kZWxlbWVudFtjXSgwKS5vbmUoImJzVHJhbnNpdGlvbkVuZCIsYS5wcm94eShlLHRoaXMpKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChkLlRSQU5TSVRJT05fRFVSQVRJT04pOmUuY2FsbCh0aGlzKX19fSxkLnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24oKXt0aGlzW3RoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImluIik/ImhpZGUiOiJzaG93Il0oKX0sZC5wcm90b3R5cGUuZ2V0UGFyZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcy5vcHRpb25zLnBhcmVudCkuZmluZCgnW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2RhdGEtcGFyZW50PSInK3RoaXMub3B0aW9ucy5wYXJlbnQrJyJdJykuZWFjaChhLnByb3h5KGZ1bmN0aW9uKGMsZCl7dmFyIGU9YShkKTt0aGlzLmFkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhiKGUpLGUpfSx0aGlzKSkuZW5kKCl9LGQucHJvdG90eXBlLmFkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcz1mdW5jdGlvbihhLGIpe3ZhciBjPWEuaGFzQ2xhc3MoImluIik7YS5hdHRyKCJhcmlhLWV4cGFuZGVkIixjKSxiLnRvZ2dsZUNsYXNzKCJjb2xsYXBzZWQiLCFjKS5hdHRyKCJhcmlhLWV4cGFuZGVkIixjKX07dmFyIGU9YS5mbi5jb2xsYXBzZTthLmZuLmNvbGxhcHNlPWMsYS5mbi5jb2xsYXBzZS5Db25zdHJ1Y3Rvcj1kLGEuZm4uY29sbGFwc2Uubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLmNvbGxhcHNlPWUsdGhpc30sYShkb2N1bWVudCkub24oImNsaWNrLmJzLmNvbGxhcHNlLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdJyxmdW5jdGlvbihkKXt2YXIgZT1hKHRoaXMpO2UuYXR0cigiZGF0YS10YXJnZXQiKXx8ZC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBmPWIoZSksZz1mLmRhdGEoImJzLmNvbGxhcHNlIiksaD1nPyJ0b2dnbGUiOmUuZGF0YSgpO2MuY2FsbChmLGgpfSl9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGIpe3ZhciBjPWIuYXR0cigiZGF0YS10YXJnZXQiKTtjfHwoYz1iLmF0dHIoImhyZWYiKSxjPWMmJi8jW0EtWmEtel0vLnRlc3QoYykmJmMucmVwbGFjZSgvLiooPz0jW15cc10qJCkvLCIiKSk7dmFyIGQ9YyYmYShjKTtyZXR1cm4gZCYmZC5sZW5ndGg/ZDpiLnBhcmVudCgpfWZ1bmN0aW9uIGMoYyl7YyYmMz09PWMud2hpY2h8fChhKGUpLnJlbW92ZSgpLGEoZikuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1iKGQpLGY9e3JlbGF0ZWRUYXJnZXQ6dGhpc307ZS5oYXNDbGFzcygib3BlbiIpJiYoYyYmImNsaWNrIj09Yy50eXBlJiYvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGMudGFyZ2V0LnRhZ05hbWUpJiZhLmNvbnRhaW5zKGVbMF0sYy50YXJnZXQpfHwoZS50cmlnZ2VyKGM9YS5FdmVudCgiaGlkZS5icy5kcm9wZG93biIsZikpLGMuaXNEZWZhdWx0UHJldmVudGVkKCl8fChkLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpLGUucmVtb3ZlQ2xhc3MoIm9wZW4iKS50cmlnZ2VyKCJoaWRkZW4uYnMuZHJvcGRvd24iLGYpKSkpfSkpfWZ1bmN0aW9uIGQoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1jLmRhdGEoImJzLmRyb3Bkb3duIik7ZHx8Yy5kYXRhKCJicy5kcm9wZG93biIsZD1uZXcgZyh0aGlzKSksInN0cmluZyI9PXR5cGVvZiBiJiZkW2JdLmNhbGwoYyl9KX12YXIgZT0iLmRyb3Bkb3duLWJhY2tkcm9wIixmPSdbZGF0YS10b2dnbGU9ImRyb3Bkb3duIl0nLGc9ZnVuY3Rpb24oYil7YShiKS5vbigiY2xpY2suYnMuZHJvcGRvd24iLHRoaXMudG9nZ2xlKX07Zy5WRVJTSU9OPSIzLjMuNSIsZy5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKGQpe3ZhciBlPWEodGhpcyk7aWYoIWUuaXMoIi5kaXNhYmxlZCwgOmRpc2FibGVkIikpe3ZhciBmPWIoZSksZz1mLmhhc0NsYXNzKCJvcGVuIik7aWYoYygpLCFnKXsib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmIWYuY2xvc2VzdCgiLm5hdmJhci1uYXYiKS5sZW5ndGgmJmEoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmFkZENsYXNzKCJkcm9wZG93bi1iYWNrZHJvcCIpLmluc2VydEFmdGVyKGEodGhpcykpLm9uKCJjbGljayIsYyk7dmFyIGg9e3JlbGF0ZWRUYXJnZXQ6dGhpc307aWYoZi50cmlnZ2VyKGQ9YS5FdmVudCgic2hvdy5icy5kcm9wZG93biIsaCkpLGQuaXNEZWZhdWx0UHJldmVudGVkKCkpcmV0dXJuO2UudHJpZ2dlcigiZm9jdXMiKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwidHJ1ZSIpLGYudG9nZ2xlQ2xhc3MoIm9wZW4iKS50cmlnZ2VyKCJzaG93bi5icy5kcm9wZG93biIsaCl9cmV0dXJuITF9fSxnLnByb3RvdHlwZS5rZXlkb3duPWZ1bmN0aW9uKGMpe2lmKC8oMzh8NDB8Mjd8MzIpLy50ZXN0KGMud2hpY2gpJiYhL2lucHV0fHRleHRhcmVhL2kudGVzdChjLnRhcmdldC50YWdOYW1lKSl7dmFyIGQ9YSh0aGlzKTtpZihjLnByZXZlbnREZWZhdWx0KCksYy5zdG9wUHJvcGFnYXRpb24oKSwhZC5pcygiLmRpc2FibGVkLCA6ZGlzYWJsZWQiKSl7dmFyIGU9YihkKSxnPWUuaGFzQ2xhc3MoIm9wZW4iKTtpZighZyYmMjchPWMud2hpY2h8fGcmJjI3PT1jLndoaWNoKXJldHVybiAyNz09Yy53aGljaCYmZS5maW5kKGYpLnRyaWdnZXIoImZvY3VzIiksZC50cmlnZ2VyKCJjbGljayIpO3ZhciBoPSIgbGk6bm90KC5kaXNhYmxlZCk6dmlzaWJsZSBhIixpPWUuZmluZCgiLmRyb3Bkb3duLW1lbnUiK2gpO2lmKGkubGVuZ3RoKXt2YXIgaj1pLmluZGV4KGMudGFyZ2V0KTszOD09Yy53aGljaCYmaj4wJiZqLS0sNDA9PWMud2hpY2gmJmo8aS5sZW5ndGgtMSYmaisrLH5qfHwoaj0wKSxpLmVxKGopLnRyaWdnZXIoImZvY3VzIil9fX19O3ZhciBoPWEuZm4uZHJvcGRvd247YS5mbi5kcm9wZG93bj1kLGEuZm4uZHJvcGRvd24uQ29uc3RydWN0b3I9ZyxhLmZuLmRyb3Bkb3duLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5kcm9wZG93bj1oLHRoaXN9LGEoZG9jdW1lbnQpLm9uKCJjbGljay5icy5kcm9wZG93bi5kYXRhLWFwaSIsYykub24oImNsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpIiwiLmRyb3Bkb3duIGZvcm0iLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KS5vbigiY2xpY2suYnMuZHJvcGRvd24uZGF0YS1hcGkiLGYsZy5wcm90b3R5cGUudG9nZ2xlKS5vbigia2V5ZG93bi5icy5kcm9wZG93bi5kYXRhLWFwaSIsZixnLnByb3RvdHlwZS5rZXlkb3duKS5vbigia2V5ZG93bi5icy5kcm9wZG93bi5kYXRhLWFwaSIsIi5kcm9wZG93bi1tZW51IixnLnByb3RvdHlwZS5rZXlkb3duKX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGIoYixkKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9YSh0aGlzKSxmPWUuZGF0YSgiYnMubW9kYWwiKSxnPWEuZXh0ZW5kKHt9LGMuREVGQVVMVFMsZS5kYXRhKCksIm9iamVjdCI9PXR5cGVvZiBiJiZiKTtmfHxlLmRhdGEoImJzLm1vZGFsIixmPW5ldyBjKHRoaXMsZykpLCJzdHJpbmciPT10eXBlb2YgYj9mW2JdKGQpOmcuc2hvdyYmZi5zaG93KGQpfSl9dmFyIGM9ZnVuY3Rpb24oYixjKXt0aGlzLm9wdGlvbnM9Yyx0aGlzLiRib2R5PWEoZG9jdW1lbnQuYm9keSksdGhpcy4kZWxlbWVudD1hKGIpLHRoaXMuJGRpYWxvZz10aGlzLiRlbGVtZW50LmZpbmQoIi5tb2RhbC1kaWFsb2ciKSx0aGlzLiRiYWNrZHJvcD1udWxsLHRoaXMuaXNTaG93bj1udWxsLHRoaXMub3JpZ2luYWxCb2R5UGFkPW51bGwsdGhpcy5zY3JvbGxiYXJXaWR0aD0wLHRoaXMuaWdub3JlQmFja2Ryb3BDbGljaz0hMSx0aGlzLm9wdGlvbnMucmVtb3RlJiZ0aGlzLiRlbGVtZW50LmZpbmQoIi5tb2RhbC1jb250ZW50IikubG9hZCh0aGlzLm9wdGlvbnMucmVtb3RlLGEucHJveHkoZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50LnRyaWdnZXIoImxvYWRlZC5icy5tb2RhbCIpfSx0aGlzKSl9O2MuVkVSU0lPTj0iMy4zLjUiLGMuVFJBTlNJVElPTl9EVVJBVElPTj0zMDAsYy5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxjLkRFRkFVTFRTPXtiYWNrZHJvcDohMCxrZXlib2FyZDohMCxzaG93OiEwfSxjLnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNTaG93bj90aGlzLmhpZGUoKTp0aGlzLnNob3coYSl9LGMucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcyxlPWEuRXZlbnQoInNob3cuYnMubW9kYWwiLHtyZWxhdGVkVGFyZ2V0OmJ9KTt0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSksdGhpcy5pc1Nob3dufHxlLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwodGhpcy5pc1Nob3duPSEwLHRoaXMuY2hlY2tTY3JvbGxiYXIoKSx0aGlzLnNldFNjcm9sbGJhcigpLHRoaXMuJGJvZHkuYWRkQ2xhc3MoIm1vZGFsLW9wZW4iKSx0aGlzLmVzY2FwZSgpLHRoaXMucmVzaXplKCksdGhpcy4kZWxlbWVudC5vbigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIsJ1tkYXRhLWRpc21pc3M9Im1vZGFsIl0nLGEucHJveHkodGhpcy5oaWRlLHRoaXMpKSx0aGlzLiRkaWFsb2cub24oIm1vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsIixmdW5jdGlvbigpe2QuJGVsZW1lbnQub25lKCJtb3VzZXVwLmRpc21pc3MuYnMubW9kYWwiLGZ1bmN0aW9uKGIpe2EoYi50YXJnZXQpLmlzKGQuJGVsZW1lbnQpJiYoZC5pZ25vcmVCYWNrZHJvcENsaWNrPSEwKX0pfSksdGhpcy5iYWNrZHJvcChmdW5jdGlvbigpe3ZhciBlPWEuc3VwcG9ydC50cmFuc2l0aW9uJiZkLiRlbGVtZW50Lmhhc0NsYXNzKCJmYWRlIik7ZC4kZWxlbWVudC5wYXJlbnQoKS5sZW5ndGh8fGQuJGVsZW1lbnQuYXBwZW5kVG8oZC4kYm9keSksZC4kZWxlbWVudC5zaG93KCkuc2Nyb2xsVG9wKDApLGQuYWRqdXN0RGlhbG9nKCksZSYmZC4kZWxlbWVudFswXS5vZmZzZXRXaWR0aCxkLiRlbGVtZW50LmFkZENsYXNzKCJpbiIpLGQuZW5mb3JjZUZvY3VzKCk7dmFyIGY9YS5FdmVudCgic2hvd24uYnMubW9kYWwiLHtyZWxhdGVkVGFyZ2V0OmJ9KTtlP2QuJGRpYWxvZy5vbmUoImJzVHJhbnNpdGlvbkVuZCIsZnVuY3Rpb24oKXtkLiRlbGVtZW50LnRyaWdnZXIoImZvY3VzIikudHJpZ2dlcihmKX0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTik6ZC4kZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIpLnRyaWdnZXIoZil9KSl9LGMucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oYil7YiYmYi5wcmV2ZW50RGVmYXVsdCgpLGI9YS5FdmVudCgiaGlkZS5icy5tb2RhbCIpLHRoaXMuJGVsZW1lbnQudHJpZ2dlcihiKSx0aGlzLmlzU2hvd24mJiFiLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYodGhpcy5pc1Nob3duPSExLHRoaXMuZXNjYXBlKCksdGhpcy5yZXNpemUoKSxhKGRvY3VtZW50KS5vZmYoImZvY3VzaW4uYnMubW9kYWwiKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJpbiIpLm9mZigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIpLm9mZigibW91c2V1cC5kaXNtaXNzLmJzLm1vZGFsIiksdGhpcy4kZGlhbG9nLm9mZigibW91c2Vkb3duLmRpc21pc3MuYnMubW9kYWwiKSxhLnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kZWxlbWVudC5oYXNDbGFzcygiZmFkZSIpP3RoaXMuJGVsZW1lbnQub25lKCJic1RyYW5zaXRpb25FbmQiLGEucHJveHkodGhpcy5oaWRlTW9kYWwsdGhpcykpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTik6dGhpcy5oaWRlTW9kYWwoKSl9LGMucHJvdG90eXBlLmVuZm9yY2VGb2N1cz1mdW5jdGlvbigpe2EoZG9jdW1lbnQpLm9mZigiZm9jdXNpbi5icy5tb2RhbCIpLm9uKCJmb2N1c2luLmJzLm1vZGFsIixhLnByb3h5KGZ1bmN0aW9uKGEpe3RoaXMuJGVsZW1lbnRbMF09PT1hLnRhcmdldHx8dGhpcy4kZWxlbWVudC5oYXMoYS50YXJnZXQpLmxlbmd0aHx8dGhpcy4kZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIpfSx0aGlzKSl9LGMucHJvdG90eXBlLmVzY2FwZT1mdW5jdGlvbigpe3RoaXMuaXNTaG93biYmdGhpcy5vcHRpb25zLmtleWJvYXJkP3RoaXMuJGVsZW1lbnQub24oImtleWRvd24uZGlzbWlzcy5icy5tb2RhbCIsYS5wcm94eShmdW5jdGlvbihhKXsyNz09YS53aGljaCYmdGhpcy5oaWRlKCl9LHRoaXMpKTp0aGlzLmlzU2hvd258fHRoaXMuJGVsZW1lbnQub2ZmKCJrZXlkb3duLmRpc21pc3MuYnMubW9kYWwiKX0sYy5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKCl7dGhpcy5pc1Nob3duP2Eod2luZG93KS5vbigicmVzaXplLmJzLm1vZGFsIixhLnByb3h5KHRoaXMuaGFuZGxlVXBkYXRlLHRoaXMpKTphKHdpbmRvdykub2ZmKCJyZXNpemUuYnMubW9kYWwiKX0sYy5wcm90b3R5cGUuaGlkZU1vZGFsPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLiRlbGVtZW50LmhpZGUoKSx0aGlzLmJhY2tkcm9wKGZ1bmN0aW9uKCl7YS4kYm9keS5yZW1vdmVDbGFzcygibW9kYWwtb3BlbiIpLGEucmVzZXRBZGp1c3RtZW50cygpLGEucmVzZXRTY3JvbGxiYXIoKSxhLiRlbGVtZW50LnRyaWdnZXIoImhpZGRlbi5icy5tb2RhbCIpfSl9LGMucHJvdG90eXBlLnJlbW92ZUJhY2tkcm9wPWZ1bmN0aW9uKCl7dGhpcy4kYmFja2Ryb3AmJnRoaXMuJGJhY2tkcm9wLnJlbW92ZSgpLHRoaXMuJGJhY2tkcm9wPW51bGx9LGMucHJvdG90eXBlLmJhY2tkcm9wPWZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMsZT10aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJmYWRlIik/ImZhZGUiOiIiO2lmKHRoaXMuaXNTaG93biYmdGhpcy5vcHRpb25zLmJhY2tkcm9wKXt2YXIgZj1hLnN1cHBvcnQudHJhbnNpdGlvbiYmZTtpZih0aGlzLiRiYWNrZHJvcD1hKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5hZGRDbGFzcygibW9kYWwtYmFja2Ryb3AgIitlKS5hcHBlbmRUbyh0aGlzLiRib2R5KSx0aGlzLiRlbGVtZW50Lm9uKCJjbGljay5kaXNtaXNzLmJzLm1vZGFsIixhLnByb3h5KGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2s/dm9pZCh0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2s9ITEpOnZvaWQoYS50YXJnZXQ9PT1hLmN1cnJlbnRUYXJnZXQmJigic3RhdGljIj09dGhpcy5vcHRpb25zLmJhY2tkcm9wP3RoaXMuJGVsZW1lbnRbMF0uZm9jdXMoKTp0aGlzLmhpZGUoKSkpfSx0aGlzKSksZiYmdGhpcy4kYmFja2Ryb3BbMF0ub2Zmc2V0V2lkdGgsdGhpcy4kYmFja2Ryb3AuYWRkQ2xhc3MoImluIiksIWIpcmV0dXJuO2Y/dGhpcy4kYmFja2Ryb3Aub25lKCJic1RyYW5zaXRpb25FbmQiLGIpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuQkFDS0RST1BfVFJBTlNJVElPTl9EVVJBVElPTik6YigpfWVsc2UgaWYoIXRoaXMuaXNTaG93biYmdGhpcy4kYmFja2Ryb3Ape3RoaXMuJGJhY2tkcm9wLnJlbW92ZUNsYXNzKCJpbiIpO3ZhciBnPWZ1bmN0aW9uKCl7ZC5yZW1vdmVCYWNrZHJvcCgpLGImJmIoKX07YS5zdXBwb3J0LnRyYW5zaXRpb24mJnRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImZhZGUiKT90aGlzLiRiYWNrZHJvcC5vbmUoImJzVHJhbnNpdGlvbkVuZCIsZykuZW11bGF0ZVRyYW5zaXRpb25FbmQoYy5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OKTpnKCl9ZWxzZSBiJiZiKCl9LGMucHJvdG90eXBlLmhhbmRsZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuYWRqdXN0RGlhbG9nKCl9LGMucHJvdG90eXBlLmFkanVzdERpYWxvZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0PmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7dGhpcy4kZWxlbWVudC5jc3Moe3BhZGRpbmdMZWZ0OiF0aGlzLmJvZHlJc092ZXJmbG93aW5nJiZhP3RoaXMuc2Nyb2xsYmFyV2lkdGg6IiIscGFkZGluZ1JpZ2h0OnRoaXMuYm9keUlzT3ZlcmZsb3dpbmcmJiFhP3RoaXMuc2Nyb2xsYmFyV2lkdGg6IiJ9KX0sYy5wcm90b3R5cGUucmVzZXRBZGp1c3RtZW50cz1mdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQuY3NzKHtwYWRkaW5nTGVmdDoiIixwYWRkaW5nUmlnaHQ6IiJ9KX0sYy5wcm90b3R5cGUuY2hlY2tTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuaW5uZXJXaWR0aDtpZighYSl7dmFyIGI9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2E9Yi5yaWdodC1NYXRoLmFicyhiLmxlZnQpfXRoaXMuYm9keUlzT3ZlcmZsb3dpbmc9ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDxhLHRoaXMuc2Nyb2xsYmFyV2lkdGg9dGhpcy5tZWFzdXJlU2Nyb2xsYmFyKCl9LGMucHJvdG90eXBlLnNldFNjcm9sbGJhcj1mdW5jdGlvbigpe3ZhciBhPXBhcnNlSW50KHRoaXMuJGJvZHkuY3NzKCJwYWRkaW5nLXJpZ2h0Iil8fDAsMTApO3RoaXMub3JpZ2luYWxCb2R5UGFkPWRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0fHwiIix0aGlzLmJvZHlJc092ZXJmbG93aW5nJiZ0aGlzLiRib2R5LmNzcygicGFkZGluZy1yaWdodCIsYSt0aGlzLnNjcm9sbGJhcldpZHRoKX0sYy5wcm90b3R5cGUucmVzZXRTY3JvbGxiYXI9ZnVuY3Rpb24oKXt0aGlzLiRib2R5LmNzcygicGFkZGluZy1yaWdodCIsdGhpcy5vcmlnaW5hbEJvZHlQYWQpfSxjLnByb3RvdHlwZS5tZWFzdXJlU2Nyb2xsYmFyPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5jbGFzc05hbWU9Im1vZGFsLXNjcm9sbGJhci1tZWFzdXJlIix0aGlzLiRib2R5LmFwcGVuZChhKTt2YXIgYj1hLm9mZnNldFdpZHRoLWEuY2xpZW50V2lkdGg7cmV0dXJuIHRoaXMuJGJvZHlbMF0ucmVtb3ZlQ2hpbGQoYSksYn07dmFyIGQ9YS5mbi5tb2RhbDthLmZuLm1vZGFsPWIsYS5mbi5tb2RhbC5Db25zdHJ1Y3Rvcj1jLGEuZm4ubW9kYWwubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLm1vZGFsPWQsdGhpc30sYShkb2N1bWVudCkub24oImNsaWNrLmJzLm1vZGFsLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJtb2RhbCJdJyxmdW5jdGlvbihjKXt2YXIgZD1hKHRoaXMpLGU9ZC5hdHRyKCJocmVmIiksZj1hKGQuYXR0cigiZGF0YS10YXJnZXQiKXx8ZSYmZS5yZXBsYWNlKC8uKig/PSNbXlxzXSskKS8sIiIpKSxnPWYuZGF0YSgiYnMubW9kYWwiKT8idG9nZ2xlIjphLmV4dGVuZCh7cmVtb3RlOiEvIy8udGVzdChlKSYmZX0sZi5kYXRhKCksZC5kYXRhKCkpO2QuaXMoImEiKSYmYy5wcmV2ZW50RGVmYXVsdCgpLGYub25lKCJzaG93LmJzLm1vZGFsIixmdW5jdGlvbihhKXthLmlzRGVmYXVsdFByZXZlbnRlZCgpfHxmLm9uZSgiaGlkZGVuLmJzLm1vZGFsIixmdW5jdGlvbigpe2QuaXMoIjp2aXNpYmxlIikmJmQudHJpZ2dlcigiZm9jdXMiKX0pfSksYi5jYWxsKGYsZyx0aGlzKX0pfShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YSgiYnMudG9vbHRpcCIpLGY9Im9iamVjdCI9PXR5cGVvZiBiJiZiOyhlfHwhL2Rlc3Ryb3l8aGlkZS8udGVzdChiKSkmJihlfHxkLmRhdGEoImJzLnRvb2x0aXAiLGU9bmV3IGModGhpcyxmKSksInN0cmluZyI9PXR5cGVvZiBiJiZlW2JdKCkpfSl9dmFyIGM9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9bnVsbCx0aGlzLm9wdGlvbnM9bnVsbCx0aGlzLmVuYWJsZWQ9bnVsbCx0aGlzLnRpbWVvdXQ9bnVsbCx0aGlzLmhvdmVyU3RhdGU9bnVsbCx0aGlzLiRlbGVtZW50PW51bGwsdGhpcy5pblN0YXRlPW51bGwsdGhpcy5pbml0KCJ0b29sdGlwIixhLGIpfTtjLlZFUlNJT049IjMuMy41IixjLlRSQU5TSVRJT05fRFVSQVRJT049MTUwLGMuREVGQVVMVFM9e2FuaW1hdGlvbjohMCxwbGFjZW1lbnQ6InRvcCIsc2VsZWN0b3I6ITEsdGVtcGxhdGU6JzxkaXYgY2xhc3M9InRvb2x0aXAiIHJvbGU9InRvb2x0aXAiPjxkaXYgY2xhc3M9InRvb2x0aXAtYXJyb3ciPjwvZGl2PjxkaXYgY2xhc3M9InRvb2x0aXAtaW5uZXIiPjwvZGl2PjwvZGl2PicsdHJpZ2dlcjoiaG92ZXIgZm9jdXMiLHRpdGxlOiIiLGRlbGF5OjAsaHRtbDohMSxjb250YWluZXI6ITEsdmlld3BvcnQ6e3NlbGVjdG9yOiJib2R5IixwYWRkaW5nOjB9fSxjLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGIsYyxkKXtpZih0aGlzLmVuYWJsZWQ9ITAsdGhpcy50eXBlPWIsdGhpcy4kZWxlbWVudD1hKGMpLHRoaXMub3B0aW9ucz10aGlzLmdldE9wdGlvbnMoZCksdGhpcy4kdmlld3BvcnQ9dGhpcy5vcHRpb25zLnZpZXdwb3J0JiZhKGEuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMudmlld3BvcnQpP3RoaXMub3B0aW9ucy52aWV3cG9ydC5jYWxsKHRoaXMsdGhpcy4kZWxlbWVudCk6dGhpcy5vcHRpb25zLnZpZXdwb3J0LnNlbGVjdG9yfHx0aGlzLm9wdGlvbnMudmlld3BvcnQpLHRoaXMuaW5TdGF0ZT17Y2xpY2s6ITEsaG92ZXI6ITEsZm9jdXM6ITF9LHRoaXMuJGVsZW1lbnRbMF1pbnN0YW5jZW9mIGRvY3VtZW50LmNvbnN0cnVjdG9yJiYhdGhpcy5vcHRpb25zLnNlbGVjdG9yKXRocm93IG5ldyBFcnJvcigiYHNlbGVjdG9yYCBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBpbml0aWFsaXppbmcgIit0aGlzLnR5cGUrIiBvbiB0aGUgd2luZG93LmRvY3VtZW50IG9iamVjdCEiKTtmb3IodmFyIGU9dGhpcy5vcHRpb25zLnRyaWdnZXIuc3BsaXQoIiAiKSxmPWUubGVuZ3RoO2YtLTspe3ZhciBnPWVbZl07aWYoImNsaWNrIj09Zyl0aGlzLiRlbGVtZW50Lm9uKCJjbGljay4iK3RoaXMudHlwZSx0aGlzLm9wdGlvbnMuc2VsZWN0b3IsYS5wcm94eSh0aGlzLnRvZ2dsZSx0aGlzKSk7ZWxzZSBpZigibWFudWFsIiE9Zyl7dmFyIGg9ImhvdmVyIj09Zz8ibW91c2VlbnRlciI6ImZvY3VzaW4iLGk9ImhvdmVyIj09Zz8ibW91c2VsZWF2ZSI6ImZvY3Vzb3V0Ijt0aGlzLiRlbGVtZW50Lm9uKGgrIi4iK3RoaXMudHlwZSx0aGlzLm9wdGlvbnMuc2VsZWN0b3IsYS5wcm94eSh0aGlzLmVudGVyLHRoaXMpKSx0aGlzLiRlbGVtZW50Lm9uKGkrIi4iK3RoaXMudHlwZSx0aGlzLm9wdGlvbnMuc2VsZWN0b3IsYS5wcm94eSh0aGlzLmxlYXZlLHRoaXMpKX19dGhpcy5vcHRpb25zLnNlbGVjdG9yP3RoaXMuX29wdGlvbnM9YS5leHRlbmQoe30sdGhpcy5vcHRpb25zLHt0cmlnZ2VyOiJtYW51YWwiLHNlbGVjdG9yOiIifSk6dGhpcy5maXhUaXRsZSgpfSxjLnByb3RvdHlwZS5nZXREZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBjLkRFRkFVTFRTfSxjLnByb3RvdHlwZS5nZXRPcHRpb25zPWZ1bmN0aW9uKGIpe3JldHVybiBiPWEuZXh0ZW5kKHt9LHRoaXMuZ2V0RGVmYXVsdHMoKSx0aGlzLiRlbGVtZW50LmRhdGEoKSxiKSxiLmRlbGF5JiYibnVtYmVyIj09dHlwZW9mIGIuZGVsYXkmJihiLmRlbGF5PXtzaG93OmIuZGVsYXksaGlkZTpiLmRlbGF5fSksYn0sYy5wcm90b3R5cGUuZ2V0RGVsZWdhdGVPcHRpb25zPWZ1bmN0aW9uKCl7dmFyIGI9e30sYz10aGlzLmdldERlZmF1bHRzKCk7cmV0dXJuIHRoaXMuX29wdGlvbnMmJmEuZWFjaCh0aGlzLl9vcHRpb25zLGZ1bmN0aW9uKGEsZCl7Y1thXSE9ZCYmKGJbYV09ZCl9KSxifSxjLnByb3RvdHlwZS5lbnRlcj1mdW5jdGlvbihiKXt2YXIgYz1iIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9iOmEoYi5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSk7cmV0dXJuIGN8fChjPW5ldyB0aGlzLmNvbnN0cnVjdG9yKGIuY3VycmVudFRhcmdldCx0aGlzLmdldERlbGVnYXRlT3B0aW9ucygpKSxhKGIuY3VycmVudFRhcmdldCkuZGF0YSgiYnMuIit0aGlzLnR5cGUsYykpLGIgaW5zdGFuY2VvZiBhLkV2ZW50JiYoYy5pblN0YXRlWyJmb2N1c2luIj09Yi50eXBlPyJmb2N1cyI6ImhvdmVyIl09ITApLGMudGlwKCkuaGFzQ2xhc3MoImluIil8fCJpbiI9PWMuaG92ZXJTdGF0ZT92b2lkKGMuaG92ZXJTdGF0ZT0iaW4iKTooY2xlYXJUaW1lb3V0KGMudGltZW91dCksYy5ob3ZlclN0YXRlPSJpbiIsYy5vcHRpb25zLmRlbGF5JiZjLm9wdGlvbnMuZGVsYXkuc2hvdz92b2lkKGMudGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ImluIj09Yy5ob3ZlclN0YXRlJiZjLnNob3coKX0sYy5vcHRpb25zLmRlbGF5LnNob3cpKTpjLnNob3coKSl9LGMucHJvdG90eXBlLmlzSW5TdGF0ZVRydWU9ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gdGhpcy5pblN0YXRlKWlmKHRoaXMuaW5TdGF0ZVthXSlyZXR1cm4hMDtyZXR1cm4hMX0sYy5wcm90b3R5cGUubGVhdmU9ZnVuY3Rpb24oYil7dmFyIGM9YiBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YjphKGIuY3VycmVudFRhcmdldCkuZGF0YSgiYnMuIit0aGlzLnR5cGUpO3JldHVybiBjfHwoYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihiLmN1cnJlbnRUYXJnZXQsdGhpcy5nZXREZWxlZ2F0ZU9wdGlvbnMoKSksYShiLmN1cnJlbnRUYXJnZXQpLmRhdGEoImJzLiIrdGhpcy50eXBlLGMpKSxiIGluc3RhbmNlb2YgYS5FdmVudCYmKGMuaW5TdGF0ZVsiZm9jdXNvdXQiPT1iLnR5cGU/ImZvY3VzIjoiaG92ZXIiXT0hMSksYy5pc0luU3RhdGVUcnVlKCk/dm9pZCAwOihjbGVhclRpbWVvdXQoYy50aW1lb3V0KSxjLmhvdmVyU3RhdGU9Im91dCIsYy5vcHRpb25zLmRlbGF5JiZjLm9wdGlvbnMuZGVsYXkuaGlkZT92b2lkKGMudGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Im91dCI9PWMuaG92ZXJTdGF0ZSYmYy5oaWRlKCl9LGMub3B0aW9ucy5kZWxheS5oaWRlKSk6Yy5oaWRlKCkpfSxjLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIGI9YS5FdmVudCgic2hvdy5icy4iK3RoaXMudHlwZSk7aWYodGhpcy5oYXNDb250ZW50KCkmJnRoaXMuZW5hYmxlZCl7dGhpcy4kZWxlbWVudC50cmlnZ2VyKGIpO3ZhciBkPWEuY29udGFpbnModGhpcy4kZWxlbWVudFswXS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCx0aGlzLiRlbGVtZW50WzBdKTtpZihiLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwhZClyZXR1cm47dmFyIGU9dGhpcyxmPXRoaXMudGlwKCksZz10aGlzLmdldFVJRCh0aGlzLnR5cGUpO3RoaXMuc2V0Q29udGVudCgpLGYuYXR0cigiaWQiLGcpLHRoaXMuJGVsZW1lbnQuYXR0cigiYXJpYS1kZXNjcmliZWRieSIsZyksdGhpcy5vcHRpb25zLmFuaW1hdGlvbiYmZi5hZGRDbGFzcygiZmFkZSIpO3ZhciBoPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm9wdGlvbnMucGxhY2VtZW50P3RoaXMub3B0aW9ucy5wbGFjZW1lbnQuY2FsbCh0aGlzLGZbMF0sdGhpcy4kZWxlbWVudFswXSk6dGhpcy5vcHRpb25zLnBsYWNlbWVudCxpPS9ccz9hdXRvP1xzPy9pLGo9aS50ZXN0KGgpO2omJihoPWgucmVwbGFjZShpLCIiKXx8InRvcCIpLGYuZGV0YWNoKCkuY3NzKHt0b3A6MCxsZWZ0OjAsZGlzcGxheToiYmxvY2sifSkuYWRkQ2xhc3MoaCkuZGF0YSgiYnMuIit0aGlzLnR5cGUsdGhpcyksdGhpcy5vcHRpb25zLmNvbnRhaW5lcj9mLmFwcGVuZFRvKHRoaXMub3B0aW9ucy5jb250YWluZXIpOmYuaW5zZXJ0QWZ0ZXIodGhpcy4kZWxlbWVudCksdGhpcy4kZWxlbWVudC50cmlnZ2VyKCJpbnNlcnRlZC5icy4iK3RoaXMudHlwZSk7dmFyIGs9dGhpcy5nZXRQb3NpdGlvbigpLGw9ZlswXS5vZmZzZXRXaWR0aCxtPWZbMF0ub2Zmc2V0SGVpZ2h0O2lmKGope3ZhciBuPWgsbz10aGlzLmdldFBvc2l0aW9uKHRoaXMuJHZpZXdwb3J0KTtoPSJib3R0b20iPT1oJiZrLmJvdHRvbSttPm8uYm90dG9tPyJ0b3AiOiJ0b3AiPT1oJiZrLnRvcC1tPG8udG9wPyJib3R0b20iOiJyaWdodCI9PWgmJmsucmlnaHQrbD5vLndpZHRoPyJsZWZ0IjoibGVmdCI9PWgmJmsubGVmdC1sPG8ubGVmdD8icmlnaHQiOmgsZi5yZW1vdmVDbGFzcyhuKS5hZGRDbGFzcyhoKX12YXIgcD10aGlzLmdldENhbGN1bGF0ZWRPZmZzZXQoaCxrLGwsbSk7dGhpcy5hcHBseVBsYWNlbWVudChwLGgpO3ZhciBxPWZ1bmN0aW9uKCl7dmFyIGE9ZS5ob3ZlclN0YXRlO2UuJGVsZW1lbnQudHJpZ2dlcigic2hvd24uYnMuIitlLnR5cGUpLGUuaG92ZXJTdGF0ZT1udWxsLCJvdXQiPT1hJiZlLmxlYXZlKGUpfTthLnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kdGlwLmhhc0NsYXNzKCJmYWRlIik/Zi5vbmUoImJzVHJhbnNpdGlvbkVuZCIscSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoYy5UUkFOU0lUSU9OX0RVUkFUSU9OKTpxKCl9fSxjLnByb3RvdHlwZS5hcHBseVBsYWNlbWVudD1mdW5jdGlvbihiLGMpe3ZhciBkPXRoaXMudGlwKCksZT1kWzBdLm9mZnNldFdpZHRoLGY9ZFswXS5vZmZzZXRIZWlnaHQsZz1wYXJzZUludChkLmNzcygibWFyZ2luLXRvcCIpLDEwKSxoPXBhcnNlSW50KGQuY3NzKCJtYXJnaW4tbGVmdCIpLDEwKTtpc05hTihnKSYmKGc9MCksaXNOYU4oaCkmJihoPTApLGIudG9wKz1nLGIubGVmdCs9aCxhLm9mZnNldC5zZXRPZmZzZXQoZFswXSxhLmV4dGVuZCh7dXNpbmc6ZnVuY3Rpb24oYSl7ZC5jc3Moe3RvcDpNYXRoLnJvdW5kKGEudG9wKSxsZWZ0Ok1hdGgucm91bmQoYS5sZWZ0KX0pfX0sYiksMCksZC5hZGRDbGFzcygiaW4iKTt2YXIgaT1kWzBdLm9mZnNldFdpZHRoLGo9ZFswXS5vZmZzZXRIZWlnaHQ7InRvcCI9PWMmJmohPWYmJihiLnRvcD1iLnRvcCtmLWopO3ZhciBrPXRoaXMuZ2V0Vmlld3BvcnRBZGp1c3RlZERlbHRhKGMsYixpLGopO2subGVmdD9iLmxlZnQrPWsubGVmdDpiLnRvcCs9ay50b3A7dmFyIGw9L3RvcHxib3R0b20vLnRlc3QoYyksbT1sPzIqay5sZWZ0LWUraToyKmsudG9wLWYraixuPWw/Im9mZnNldFdpZHRoIjoib2Zmc2V0SGVpZ2h0IjtkLm9mZnNldChiKSx0aGlzLnJlcGxhY2VBcnJvdyhtLGRbMF1bbl0sbCl9LGMucHJvdG90eXBlLnJlcGxhY2VBcnJvdz1mdW5jdGlvbihhLGIsYyl7dGhpcy5hcnJvdygpLmNzcyhjPyJsZWZ0IjoidG9wIiw1MCooMS1hL2IpKyIlIikuY3NzKGM/InRvcCI6ImxlZnQiLCIiKX0sYy5wcm90b3R5cGUuc2V0Q29udGVudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMudGlwKCksYj10aGlzLmdldFRpdGxlKCk7YS5maW5kKCIudG9vbHRpcC1pbm5lciIpW3RoaXMub3B0aW9ucy5odG1sPyJodG1sIjoidGV4dCJdKGIpLGEucmVtb3ZlQ2xhc3MoImZhZGUgaW4gdG9wIGJvdHRvbSBsZWZ0IHJpZ2h0Iil9LGMucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZCgpeyJpbiIhPWUuaG92ZXJTdGF0ZSYmZi5kZXRhY2goKSxlLiRlbGVtZW50LnJlbW92ZUF0dHIoImFyaWEtZGVzY3JpYmVkYnkiKS50cmlnZ2VyKCJoaWRkZW4uYnMuIitlLnR5cGUpLGImJmIoKX12YXIgZT10aGlzLGY9YSh0aGlzLiR0aXApLGc9YS5FdmVudCgiaGlkZS5icy4iK3RoaXMudHlwZSk7cmV0dXJuIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihnKSxnLmlzRGVmYXVsdFByZXZlbnRlZCgpP3ZvaWQgMDooZi5yZW1vdmVDbGFzcygiaW4iKSxhLnN1cHBvcnQudHJhbnNpdGlvbiYmZi5oYXNDbGFzcygiZmFkZSIpP2Yub25lKCJic1RyYW5zaXRpb25FbmQiLGQpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTik6ZCgpLHRoaXMuaG92ZXJTdGF0ZT1udWxsLHRoaXMpfSxjLnByb3RvdHlwZS5maXhUaXRsZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGVsZW1lbnQ7KGEuYXR0cigidGl0bGUiKXx8InN0cmluZyIhPXR5cGVvZiBhLmF0dHIoImRhdGEtb3JpZ2luYWwtdGl0bGUiKSkmJmEuYXR0cigiZGF0YS1vcmlnaW5hbC10aXRsZSIsYS5hdHRyKCJ0aXRsZSIpfHwiIikuYXR0cigidGl0bGUiLCIiKX0sYy5wcm90b3R5cGUuaGFzQ29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpdGxlKCl9LGMucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKGIpe2I9Ynx8dGhpcy4kZWxlbWVudDt2YXIgYz1iWzBdLGQ9IkJPRFkiPT1jLnRhZ05hbWUsZT1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO251bGw9PWUud2lkdGgmJihlPWEuZXh0ZW5kKHt9LGUse3dpZHRoOmUucmlnaHQtZS5sZWZ0LGhlaWdodDplLmJvdHRvbS1lLnRvcH0pKTt2YXIgZj1kP3t0b3A6MCxsZWZ0OjB9OmIub2Zmc2V0KCksZz17c2Nyb2xsOmQ/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A6Yi5zY3JvbGxUb3AoKX0saD1kP3t3aWR0aDphKHdpbmRvdykud2lkdGgoKSxoZWlnaHQ6YSh3aW5kb3cpLmhlaWdodCgpfTpudWxsO3JldHVybiBhLmV4dGVuZCh7fSxlLGcsaCxmKX0sYy5wcm90b3R5cGUuZ2V0Q2FsY3VsYXRlZE9mZnNldD1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4iYm90dG9tIj09YT97dG9wOmIudG9wK2IuaGVpZ2h0LGxlZnQ6Yi5sZWZ0K2Iud2lkdGgvMi1jLzJ9OiJ0b3AiPT1hP3t0b3A6Yi50b3AtZCxsZWZ0OmIubGVmdCtiLndpZHRoLzItYy8yfToibGVmdCI9PWE/e3RvcDpiLnRvcCtiLmhlaWdodC8yLWQvMixsZWZ0OmIubGVmdC1jfTp7dG9wOmIudG9wK2IuaGVpZ2h0LzItZC8yLGxlZnQ6Yi5sZWZ0K2Iud2lkdGh9fSxjLnByb3RvdHlwZS5nZXRWaWV3cG9ydEFkanVzdGVkRGVsdGE9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9e3RvcDowLGxlZnQ6MH07aWYoIXRoaXMuJHZpZXdwb3J0KXJldHVybiBlO3ZhciBmPXRoaXMub3B0aW9ucy52aWV3cG9ydCYmdGhpcy5vcHRpb25zLnZpZXdwb3J0LnBhZGRpbmd8fDAsZz10aGlzLmdldFBvc2l0aW9uKHRoaXMuJHZpZXdwb3J0KTtpZigvcmlnaHR8bGVmdC8udGVzdChhKSl7dmFyIGg9Yi50b3AtZi1nLnNjcm9sbCxpPWIudG9wK2YtZy5zY3JvbGwrZDtoPGcudG9wP2UudG9wPWcudG9wLWg6aT5nLnRvcCtnLmhlaWdodCYmKGUudG9wPWcudG9wK2cuaGVpZ2h0LWkpfWVsc2V7dmFyIGo9Yi5sZWZ0LWYsaz1iLmxlZnQrZitjO2o8Zy5sZWZ0P2UubGVmdD1nLmxlZnQtajprPmcucmlnaHQmJihlLmxlZnQ9Zy5sZWZ0K2cud2lkdGgtayl9cmV0dXJuIGV9LGMucHJvdG90eXBlLmdldFRpdGxlPWZ1bmN0aW9uKCl7dmFyIGEsYj10aGlzLiRlbGVtZW50LGM9dGhpcy5vcHRpb25zO3JldHVybiBhPWIuYXR0cigiZGF0YS1vcmlnaW5hbC10aXRsZSIpfHwoImZ1bmN0aW9uIj09dHlwZW9mIGMudGl0bGU/Yy50aXRsZS5jYWxsKGJbMF0pOmMudGl0bGUpfSxjLnByb3RvdHlwZS5nZXRVSUQ9ZnVuY3Rpb24oYSl7ZG8gYSs9fn4oMWU2Kk1hdGgucmFuZG9tKCkpO3doaWxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTtyZXR1cm4gYX0sYy5wcm90b3R5cGUudGlwPWZ1bmN0aW9uKCl7aWYoIXRoaXMuJHRpcCYmKHRoaXMuJHRpcD1hKHRoaXMub3B0aW9ucy50ZW1wbGF0ZSksMSE9dGhpcy4kdGlwLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKHRoaXMudHlwZSsiIGB0ZW1wbGF0ZWAgb3B0aW9uIG11c3QgY29uc2lzdCBvZiBleGFjdGx5IDEgdG9wLWxldmVsIGVsZW1lbnQhIik7cmV0dXJuIHRoaXMuJHRpcH0sYy5wcm90b3R5cGUuYXJyb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYXJyb3c9dGhpcy4kYXJyb3d8fHRoaXMudGlwKCkuZmluZCgiLnRvb2x0aXAtYXJyb3ciKX0sYy5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSEwfSxjLnByb3RvdHlwZS5kaXNhYmxlPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSExfSxjLnByb3RvdHlwZS50b2dnbGVFbmFibGVkPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSF0aGlzLmVuYWJsZWR9LGMucHJvdG90eXBlLnRvZ2dsZT1mdW5jdGlvbihiKXt2YXIgYz10aGlzO2ImJihjPWEoYi5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSksY3x8KGM9bmV3IHRoaXMuY29uc3RydWN0b3IoYi5jdXJyZW50VGFyZ2V0LHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpLGEoYi5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSxjKSkpLGI/KGMuaW5TdGF0ZS5jbGljaz0hYy5pblN0YXRlLmNsaWNrLGMuaXNJblN0YXRlVHJ1ZSgpP2MuZW50ZXIoYyk6Yy5sZWF2ZShjKSk6Yy50aXAoKS5oYXNDbGFzcygiaW4iKT9jLmxlYXZlKGMpOmMuZW50ZXIoYyl9LGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2NsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpLHRoaXMuaGlkZShmdW5jdGlvbigpe2EuJGVsZW1lbnQub2ZmKCIuIithLnR5cGUpLnJlbW92ZURhdGEoImJzLiIrYS50eXBlKSxhLiR0aXAmJmEuJHRpcC5kZXRhY2goKSxhLiR0aXA9bnVsbCxhLiRhcnJvdz1udWxsLGEuJHZpZXdwb3J0PW51bGx9KX07dmFyIGQ9YS5mbi50b29sdGlwO2EuZm4udG9vbHRpcD1iLGEuZm4udG9vbHRpcC5Db25zdHJ1Y3Rvcj1jLGEuZm4udG9vbHRpcC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4udG9vbHRpcD1kLHRoaXN9fShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YSgiYnMucG9wb3ZlciIpLGY9Im9iamVjdCI9PXR5cGVvZiBiJiZiOyhlfHwhL2Rlc3Ryb3l8aGlkZS8udGVzdChiKSkmJihlfHxkLmRhdGEoImJzLnBvcG92ZXIiLGU9bmV3IGModGhpcyxmKSksInN0cmluZyI9PXR5cGVvZiBiJiZlW2JdKCkpfSl9dmFyIGM9ZnVuY3Rpb24oYSxiKXt0aGlzLmluaXQoInBvcG92ZXIiLGEsYil9O2lmKCFhLmZuLnRvb2x0aXApdGhyb3cgbmV3IEVycm9yKCJQb3BvdmVyIHJlcXVpcmVzIHRvb2x0aXAuanMiKTtjLlZFUlNJT049IjMuMy41IixjLkRFRkFVTFRTPWEuZXh0ZW5kKHt9LGEuZm4udG9vbHRpcC5Db25zdHJ1Y3Rvci5ERUZBVUxUUyx7cGxhY2VtZW50OiJyaWdodCIsdHJpZ2dlcjoiY2xpY2siLGNvbnRlbnQ6IiIsdGVtcGxhdGU6JzxkaXYgY2xhc3M9InBvcG92ZXIiIHJvbGU9InRvb2x0aXAiPjxkaXYgY2xhc3M9ImFycm93Ij48L2Rpdj48aDMgY2xhc3M9InBvcG92ZXItdGl0bGUiPjwvaDM+PGRpdiBjbGFzcz0icG9wb3Zlci1jb250ZW50Ij48L2Rpdj48L2Rpdj4nfSksYy5wcm90b3R5cGU9YS5leHRlbmQoe30sYS5mbi50b29sdGlwLkNvbnN0cnVjdG9yLnByb3RvdHlwZSksYy5wcm90b3R5cGUuY29uc3RydWN0b3I9YyxjLnByb3RvdHlwZS5nZXREZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBjLkRFRkFVTFRTfSxjLnByb3RvdHlwZS5zZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50aXAoKSxiPXRoaXMuZ2V0VGl0bGUoKSxjPXRoaXMuZ2V0Q29udGVudCgpO2EuZmluZCgiLnBvcG92ZXItdGl0bGUiKVt0aGlzLm9wdGlvbnMuaHRtbD8iaHRtbCI6InRleHQiXShiKSxhLmZpbmQoIi5wb3BvdmVyLWNvbnRlbnQiKS5jaGlsZHJlbigpLmRldGFjaCgpLmVuZCgpW3RoaXMub3B0aW9ucy5odG1sPyJzdHJpbmciPT10eXBlb2YgYz8iaHRtbCI6ImFwcGVuZCI6InRleHQiXShjKSxhLnJlbW92ZUNsYXNzKCJmYWRlIHRvcCBib3R0b20gbGVmdCByaWdodCBpbiIpLGEuZmluZCgiLnBvcG92ZXItdGl0bGUiKS5odG1sKCl8fGEuZmluZCgiLnBvcG92ZXItdGl0bGUiKS5oaWRlKCl9LGMucHJvdG90eXBlLmhhc0NvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRUaXRsZSgpfHx0aGlzLmdldENvbnRlbnQoKX0sYy5wcm90b3R5cGUuZ2V0Q29udGVudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGVsZW1lbnQsYj10aGlzLm9wdGlvbnM7cmV0dXJuIGEuYXR0cigiZGF0YS1jb250ZW50Iil8fCgiZnVuY3Rpb24iPT10eXBlb2YgYi5jb250ZW50P2IuY29udGVudC5jYWxsKGFbMF0pOmIuY29udGVudCl9LGMucHJvdG90eXBlLmFycm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGFycm93PXRoaXMuJGFycm93fHx0aGlzLnRpcCgpLmZpbmQoIi5hcnJvdyIpfTt2YXIgZD1hLmZuLnBvcG92ZXI7YS5mbi5wb3BvdmVyPWIsYS5mbi5wb3BvdmVyLkNvbnN0cnVjdG9yPWMsYS5mbi5wb3BvdmVyLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5wb3BvdmVyPWQsdGhpc319KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGMsZCl7dGhpcy4kYm9keT1hKGRvY3VtZW50LmJvZHkpLHRoaXMuJHNjcm9sbEVsZW1lbnQ9YShhKGMpLmlzKGRvY3VtZW50LmJvZHkpP3dpbmRvdzpjKSx0aGlzLm9wdGlvbnM9YS5leHRlbmQoe30sYi5ERUZBVUxUUyxkKSx0aGlzLnNlbGVjdG9yPSh0aGlzLm9wdGlvbnMudGFyZ2V0fHwiIikrIiAubmF2IGxpID4gYSIsdGhpcy5vZmZzZXRzPVtdLHRoaXMudGFyZ2V0cz1bXSx0aGlzLmFjdGl2ZVRhcmdldD1udWxsLHRoaXMuc2Nyb2xsSGVpZ2h0PTAsdGhpcy4kc2Nyb2xsRWxlbWVudC5vbigic2Nyb2xsLmJzLnNjcm9sbHNweSIsYS5wcm94eSh0aGlzLnByb2Nlc3MsdGhpcykpLHRoaXMucmVmcmVzaCgpLHRoaXMucHJvY2VzcygpfWZ1bmN0aW9uIGMoYyl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1kLmRhdGEoImJzLnNjcm9sbHNweSIpLGY9Im9iamVjdCI9PXR5cGVvZiBjJiZjO2V8fGQuZGF0YSgiYnMuc2Nyb2xsc3B5IixlPW5ldyBiKHRoaXMsZikpLCJzdHJpbmciPT10eXBlb2YgYyYmZVtjXSgpfSl9Yi5WRVJTSU9OPSIzLjMuNSIsYi5ERUZBVUxUUz17b2Zmc2V0OjEwfSxiLnByb3RvdHlwZS5nZXRTY3JvbGxIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2Nyb2xsRWxlbWVudFswXS5zY3JvbGxIZWlnaHR8fE1hdGgubWF4KHRoaXMuJGJvZHlbMF0uc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQpfSxiLnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPSJvZmZzZXQiLGQ9MDt0aGlzLm9mZnNldHM9W10sdGhpcy50YXJnZXRzPVtdLHRoaXMuc2Nyb2xsSGVpZ2h0PXRoaXMuZ2V0U2Nyb2xsSGVpZ2h0KCksYS5pc1dpbmRvdyh0aGlzLiRzY3JvbGxFbGVtZW50WzBdKXx8KGM9InBvc2l0aW9uIixkPXRoaXMuJHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wKCkpLHRoaXMuJGJvZHkuZmluZCh0aGlzLnNlbGVjdG9yKS5tYXAoZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLGU9Yi5kYXRhKCJ0YXJnZXQiKXx8Yi5hdHRyKCJocmVmIiksZj0vXiMuLy50ZXN0KGUpJiZhKGUpO3JldHVybiBmJiZmLmxlbmd0aCYmZi5pcygiOnZpc2libGUiKSYmW1tmW2NdKCkudG9wK2QsZV1dfHxudWxsfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhWzBdLWJbMF19KS5lYWNoKGZ1bmN0aW9uKCl7Yi5vZmZzZXRzLnB1c2godGhpc1swXSksYi50YXJnZXRzLnB1c2godGhpc1sxXSl9KX0sYi5wcm90b3R5cGUucHJvY2Vzcz1mdW5jdGlvbigpe3ZhciBhLGI9dGhpcy4kc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3AoKSt0aGlzLm9wdGlvbnMub2Zmc2V0LGM9dGhpcy5nZXRTY3JvbGxIZWlnaHQoKSxkPXRoaXMub3B0aW9ucy5vZmZzZXQrYy10aGlzLiRzY3JvbGxFbGVtZW50LmhlaWdodCgpLGU9dGhpcy5vZmZzZXRzLGY9dGhpcy50YXJnZXRzLGc9dGhpcy5hY3RpdmVUYXJnZXQ7aWYodGhpcy5zY3JvbGxIZWlnaHQhPWMmJnRoaXMucmVmcmVzaCgpLGI+PWQpcmV0dXJuIGchPShhPWZbZi5sZW5ndGgtMV0pJiZ0aGlzLmFjdGl2YXRlKGEpO2lmKGcmJmI8ZVswXSlyZXR1cm4gdGhpcy5hY3RpdmVUYXJnZXQ9bnVsbCx0aGlzLmNsZWFyKCk7Zm9yKGE9ZS5sZW5ndGg7YS0tOylnIT1mW2FdJiZiPj1lW2FdJiYodm9pZCAwPT09ZVthKzFdfHxiPGVbYSsxXSkmJnRoaXMuYWN0aXZhdGUoZlthXSl9LGIucHJvdG90eXBlLmFjdGl2YXRlPWZ1bmN0aW9uKGIpe3RoaXMuYWN0aXZlVGFyZ2V0PWIsdGhpcy5jbGVhcigpO3ZhciBjPXRoaXMuc2VsZWN0b3IrJ1tkYXRhLXRhcmdldD0iJytiKyciXSwnK3RoaXMuc2VsZWN0b3IrJ1tocmVmPSInK2IrJyJdJyxkPWEoYykucGFyZW50cygibGkiKS5hZGRDbGFzcygiYWN0aXZlIik7ZC5wYXJlbnQoIi5kcm9wZG93bi1tZW51IikubGVuZ3RoJiYoZD1kLmNsb3Nlc3QoImxpLmRyb3Bkb3duIikuYWRkQ2xhc3MoImFjdGl2ZSIpKSwKZC50cmlnZ2VyKCJhY3RpdmF0ZS5icy5zY3JvbGxzcHkiKX0sYi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXthKHRoaXMuc2VsZWN0b3IpLnBhcmVudHNVbnRpbCh0aGlzLm9wdGlvbnMudGFyZ2V0LCIuYWN0aXZlIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfTt2YXIgZD1hLmZuLnNjcm9sbHNweTthLmZuLnNjcm9sbHNweT1jLGEuZm4uc2Nyb2xsc3B5LkNvbnN0cnVjdG9yPWIsYS5mbi5zY3JvbGxzcHkubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLnNjcm9sbHNweT1kLHRoaXN9LGEod2luZG93KS5vbigibG9hZC5icy5zY3JvbGxzcHkuZGF0YS1hcGkiLGZ1bmN0aW9uKCl7YSgnW2RhdGEtc3B5PSJzY3JvbGwiXScpLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpO2MuY2FsbChiLGIuZGF0YSgpKX0pfSl9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hKHRoaXMpLGU9ZC5kYXRhKCJicy50YWIiKTtlfHxkLmRhdGEoImJzLnRhYiIsZT1uZXcgYyh0aGlzKSksInN0cmluZyI9PXR5cGVvZiBiJiZlW2JdKCl9KX12YXIgYz1mdW5jdGlvbihiKXt0aGlzLmVsZW1lbnQ9YShiKX07Yy5WRVJTSU9OPSIzLjMuNSIsYy5UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxjLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50LGM9Yi5jbG9zZXN0KCJ1bDpub3QoLmRyb3Bkb3duLW1lbnUpIiksZD1iLmRhdGEoInRhcmdldCIpO2lmKGR8fChkPWIuYXR0cigiaHJlZiIpLGQ9ZCYmZC5yZXBsYWNlKC8uKig/PSNbXlxzXSokKS8sIiIpKSwhYi5wYXJlbnQoImxpIikuaGFzQ2xhc3MoImFjdGl2ZSIpKXt2YXIgZT1jLmZpbmQoIi5hY3RpdmU6bGFzdCBhIiksZj1hLkV2ZW50KCJoaWRlLmJzLnRhYiIse3JlbGF0ZWRUYXJnZXQ6YlswXX0pLGc9YS5FdmVudCgic2hvdy5icy50YWIiLHtyZWxhdGVkVGFyZ2V0OmVbMF19KTtpZihlLnRyaWdnZXIoZiksYi50cmlnZ2VyKGcpLCFnLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYhZi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7dmFyIGg9YShkKTt0aGlzLmFjdGl2YXRlKGIuY2xvc2VzdCgibGkiKSxjKSx0aGlzLmFjdGl2YXRlKGgsaC5wYXJlbnQoKSxmdW5jdGlvbigpe2UudHJpZ2dlcih7dHlwZToiaGlkZGVuLmJzLnRhYiIscmVsYXRlZFRhcmdldDpiWzBdfSksYi50cmlnZ2VyKHt0eXBlOiJzaG93bi5icy50YWIiLHJlbGF0ZWRUYXJnZXQ6ZVswXX0pfSl9fX0sYy5wcm90b3R5cGUuYWN0aXZhdGU9ZnVuY3Rpb24oYixkLGUpe2Z1bmN0aW9uIGYoKXtnLnJlbW92ZUNsYXNzKCJhY3RpdmUiKS5maW5kKCI+IC5kcm9wZG93bi1tZW51ID4gLmFjdGl2ZSIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKS5lbmQoKS5maW5kKCdbZGF0YS10b2dnbGU9InRhYiJdJykuYXR0cigiYXJpYS1leHBhbmRlZCIsITEpLGIuYWRkQ2xhc3MoImFjdGl2ZSIpLmZpbmQoJ1tkYXRhLXRvZ2dsZT0idGFiIl0nKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMCksaD8oYlswXS5vZmZzZXRXaWR0aCxiLmFkZENsYXNzKCJpbiIpKTpiLnJlbW92ZUNsYXNzKCJmYWRlIiksYi5wYXJlbnQoIi5kcm9wZG93bi1tZW51IikubGVuZ3RoJiZiLmNsb3Nlc3QoImxpLmRyb3Bkb3duIikuYWRkQ2xhc3MoImFjdGl2ZSIpLmVuZCgpLmZpbmQoJ1tkYXRhLXRvZ2dsZT0idGFiIl0nKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMCksZSYmZSgpfXZhciBnPWQuZmluZCgiPiAuYWN0aXZlIiksaD1lJiZhLnN1cHBvcnQudHJhbnNpdGlvbiYmKGcubGVuZ3RoJiZnLmhhc0NsYXNzKCJmYWRlIil8fCEhZC5maW5kKCI+IC5mYWRlIikubGVuZ3RoKTtnLmxlbmd0aCYmaD9nLm9uZSgiYnNUcmFuc2l0aW9uRW5kIixmKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChjLlRSQU5TSVRJT05fRFVSQVRJT04pOmYoKSxnLnJlbW92ZUNsYXNzKCJpbiIpfTt2YXIgZD1hLmZuLnRhYjthLmZuLnRhYj1iLGEuZm4udGFiLkNvbnN0cnVjdG9yPWMsYS5mbi50YWIubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLnRhYj1kLHRoaXN9O3ZhciBlPWZ1bmN0aW9uKGMpe2MucHJldmVudERlZmF1bHQoKSxiLmNhbGwoYSh0aGlzKSwic2hvdyIpfTthKGRvY3VtZW50KS5vbigiY2xpY2suYnMudGFiLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJ0YWIiXScsZSkub24oImNsaWNrLmJzLnRhYi5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0icGlsbCJdJyxlKX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGIoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1kLmRhdGEoImJzLmFmZml4IiksZj0ib2JqZWN0Ij09dHlwZW9mIGImJmI7ZXx8ZC5kYXRhKCJicy5hZmZpeCIsZT1uZXcgYyh0aGlzLGYpKSwic3RyaW5nIj09dHlwZW9mIGImJmVbYl0oKX0pfXZhciBjPWZ1bmN0aW9uKGIsZCl7dGhpcy5vcHRpb25zPWEuZXh0ZW5kKHt9LGMuREVGQVVMVFMsZCksdGhpcy4kdGFyZ2V0PWEodGhpcy5vcHRpb25zLnRhcmdldCkub24oInNjcm9sbC5icy5hZmZpeC5kYXRhLWFwaSIsYS5wcm94eSh0aGlzLmNoZWNrUG9zaXRpb24sdGhpcykpLm9uKCJjbGljay5icy5hZmZpeC5kYXRhLWFwaSIsYS5wcm94eSh0aGlzLmNoZWNrUG9zaXRpb25XaXRoRXZlbnRMb29wLHRoaXMpKSx0aGlzLiRlbGVtZW50PWEoYiksdGhpcy5hZmZpeGVkPW51bGwsdGhpcy51bnBpbj1udWxsLHRoaXMucGlubmVkT2Zmc2V0PW51bGwsdGhpcy5jaGVja1Bvc2l0aW9uKCl9O2MuVkVSU0lPTj0iMy4zLjUiLGMuUkVTRVQ9ImFmZml4IGFmZml4LXRvcCBhZmZpeC1ib3R0b20iLGMuREVGQVVMVFM9e29mZnNldDowLHRhcmdldDp3aW5kb3d9LGMucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuJHRhcmdldC5zY3JvbGxUb3AoKSxmPXRoaXMuJGVsZW1lbnQub2Zmc2V0KCksZz10aGlzLiR0YXJnZXQuaGVpZ2h0KCk7aWYobnVsbCE9YyYmInRvcCI9PXRoaXMuYWZmaXhlZClyZXR1cm4gYz5lPyJ0b3AiOiExO2lmKCJib3R0b20iPT10aGlzLmFmZml4ZWQpcmV0dXJuIG51bGwhPWM/ZSt0aGlzLnVucGluPD1mLnRvcD8hMToiYm90dG9tIjphLWQ+PWUrZz8hMToiYm90dG9tIjt2YXIgaD1udWxsPT10aGlzLmFmZml4ZWQsaT1oP2U6Zi50b3Asaj1oP2c6YjtyZXR1cm4gbnVsbCE9YyYmYz49ZT8idG9wIjpudWxsIT1kJiZpK2o+PWEtZD8iYm90dG9tIjohMX0sYy5wcm90b3R5cGUuZ2V0UGlubmVkT2Zmc2V0PWZ1bmN0aW9uKCl7aWYodGhpcy5waW5uZWRPZmZzZXQpcmV0dXJuIHRoaXMucGlubmVkT2Zmc2V0O3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoYy5SRVNFVCkuYWRkQ2xhc3MoImFmZml4Iik7dmFyIGE9dGhpcy4kdGFyZ2V0LnNjcm9sbFRvcCgpLGI9dGhpcy4kZWxlbWVudC5vZmZzZXQoKTtyZXR1cm4gdGhpcy5waW5uZWRPZmZzZXQ9Yi50b3AtYX0sYy5wcm90b3R5cGUuY2hlY2tQb3NpdGlvbldpdGhFdmVudExvb3A9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGEucHJveHkodGhpcy5jaGVja1Bvc2l0aW9uLHRoaXMpLDEpfSxjLnByb3RvdHlwZS5jaGVja1Bvc2l0aW9uPWZ1bmN0aW9uKCl7aWYodGhpcy4kZWxlbWVudC5pcygiOnZpc2libGUiKSl7dmFyIGI9dGhpcy4kZWxlbWVudC5oZWlnaHQoKSxkPXRoaXMub3B0aW9ucy5vZmZzZXQsZT1kLnRvcCxmPWQuYm90dG9tLGc9TWF0aC5tYXgoYShkb2N1bWVudCkuaGVpZ2h0KCksYShkb2N1bWVudC5ib2R5KS5oZWlnaHQoKSk7Im9iamVjdCIhPXR5cGVvZiBkJiYoZj1lPWQpLCJmdW5jdGlvbiI9PXR5cGVvZiBlJiYoZT1kLnRvcCh0aGlzLiRlbGVtZW50KSksImZ1bmN0aW9uIj09dHlwZW9mIGYmJihmPWQuYm90dG9tKHRoaXMuJGVsZW1lbnQpKTt2YXIgaD10aGlzLmdldFN0YXRlKGcsYixlLGYpO2lmKHRoaXMuYWZmaXhlZCE9aCl7bnVsbCE9dGhpcy51bnBpbiYmdGhpcy4kZWxlbWVudC5jc3MoInRvcCIsIiIpO3ZhciBpPSJhZmZpeCIrKGg/Ii0iK2g6IiIpLGo9YS5FdmVudChpKyIuYnMuYWZmaXgiKTtpZih0aGlzLiRlbGVtZW50LnRyaWdnZXIoaiksai5pc0RlZmF1bHRQcmV2ZW50ZWQoKSlyZXR1cm47dGhpcy5hZmZpeGVkPWgsdGhpcy51bnBpbj0iYm90dG9tIj09aD90aGlzLmdldFBpbm5lZE9mZnNldCgpOm51bGwsdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyhjLlJFU0VUKS5hZGRDbGFzcyhpKS50cmlnZ2VyKGkucmVwbGFjZSgiYWZmaXgiLCJhZmZpeGVkIikrIi5icy5hZmZpeCIpfSJib3R0b20iPT1oJiZ0aGlzLiRlbGVtZW50Lm9mZnNldCh7dG9wOmctYi1mfSl9fTt2YXIgZD1hLmZuLmFmZml4O2EuZm4uYWZmaXg9YixhLmZuLmFmZml4LkNvbnN0cnVjdG9yPWMsYS5mbi5hZmZpeC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4uYWZmaXg9ZCx0aGlzfSxhKHdpbmRvdykub24oImxvYWQiLGZ1bmN0aW9uKCl7YSgnW2RhdGEtc3B5PSJhZmZpeCJdJykuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1jLmRhdGEoKTtkLm9mZnNldD1kLm9mZnNldHx8e30sbnVsbCE9ZC5vZmZzZXRCb3R0b20mJihkLm9mZnNldC5ib3R0b209ZC5vZmZzZXRCb3R0b20pLG51bGwhPWQub2Zmc2V0VG9wJiYoZC5vZmZzZXQudG9wPWQub2Zmc2V0VG9wKSxiLmNhbGwoYyxkKX0pfSl9KGpRdWVyeSk7"></script> <script src="data:application/x-javascript;base64,LyoqCiogQHByZXNlcnZlIEhUTUw1IFNoaXYgMy43LjIgfCBAYWZhcmthcyBAamRhbHRvbiBAam9uX25lYWwgQHJlbSB8IE1JVC9HUEwyIExpY2Vuc2VkCiovCi8vIE9ubHkgcnVuIHRoaXMgY29kZSBpbiBJRSA4CmlmICghIXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKCJNU0lFIDgiKSkgewohZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7dmFyIGM9YS5jcmVhdGVFbGVtZW50KCJwIiksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGEuZG9jdW1lbnRFbGVtZW50O3JldHVybiBjLmlubmVySFRNTD0ieDxzdHlsZT4iK2IrIjwvc3R5bGU+IixkLmluc2VydEJlZm9yZShjLmxhc3RDaGlsZCxkLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIGQoKXt2YXIgYT10LmVsZW1lbnRzO3JldHVybiJzdHJpbmciPT10eXBlb2YgYT9hLnNwbGl0KCIgIik6YX1mdW5jdGlvbiBlKGEsYil7dmFyIGM9dC5lbGVtZW50czsic3RyaW5nIiE9dHlwZW9mIGMmJihjPWMuam9pbigiICIpKSwic3RyaW5nIiE9dHlwZW9mIGEmJihhPWEuam9pbigiICIpKSx0LmVsZW1lbnRzPWMrIiAiK2EsaihiKX1mdW5jdGlvbiBmKGEpe3ZhciBiPXNbYVtxXV07cmV0dXJuIGJ8fChiPXt9LHIrKyxhW3FdPXIsc1tyXT1iKSxifWZ1bmN0aW9uIGcoYSxjLGQpe2lmKGN8fChjPWIpLGwpcmV0dXJuIGMuY3JlYXRlRWxlbWVudChhKTtkfHwoZD1mKGMpKTt2YXIgZTtyZXR1cm4gZT1kLmNhY2hlW2FdP2QuY2FjaGVbYV0uY2xvbmVOb2RlKCk6cC50ZXN0KGEpPyhkLmNhY2hlW2FdPWQuY3JlYXRlRWxlbShhKSkuY2xvbmVOb2RlKCk6ZC5jcmVhdGVFbGVtKGEpLCFlLmNhbkhhdmVDaGlsZHJlbnx8by50ZXN0KGEpfHxlLnRhZ1Vybj9lOmQuZnJhZy5hcHBlbmRDaGlsZChlKX1mdW5jdGlvbiBoKGEsYyl7aWYoYXx8KGE9YiksbClyZXR1cm4gYS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Yz1jfHxmKGEpO2Zvcih2YXIgZT1jLmZyYWcuY2xvbmVOb2RlKCksZz0wLGg9ZCgpLGk9aC5sZW5ndGg7aT5nO2crKyllLmNyZWF0ZUVsZW1lbnQoaFtnXSk7cmV0dXJuIGV9ZnVuY3Rpb24gaShhLGIpe2IuY2FjaGV8fChiLmNhY2hlPXt9LGIuY3JlYXRlRWxlbT1hLmNyZWF0ZUVsZW1lbnQsYi5jcmVhdGVGcmFnPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCxiLmZyYWc9Yi5jcmVhdGVGcmFnKCkpLGEuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihjKXtyZXR1cm4gdC5zaGl2TWV0aG9kcz9nKGMsYSxiKTpiLmNyZWF0ZUVsZW0oYyl9LGEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD1GdW5jdGlvbigiaCxmIiwicmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49Zi5jbG9uZU5vZGUoKSxjPW4uY3JlYXRlRWxlbWVudDtoLnNoaXZNZXRob2RzJiYoIitkKCkuam9pbigpLnJlcGxhY2UoL1tcd1wtOl0rL2csZnVuY3Rpb24oYSl7cmV0dXJuIGIuY3JlYXRlRWxlbShhKSxiLmZyYWcuY3JlYXRlRWxlbWVudChhKSwnYygiJythKyciKSd9KSsiKTtyZXR1cm4gbn0iKSh0LGIuZnJhZyl9ZnVuY3Rpb24gaihhKXthfHwoYT1iKTt2YXIgZD1mKGEpO3JldHVybiF0LnNoaXZDU1N8fGt8fGQuaGFzQ1NTfHwoZC5oYXNDU1M9ISFjKGEsImFydGljbGUsYXNpZGUsZGlhbG9nLGZpZ2NhcHRpb24sZmlndXJlLGZvb3RlcixoZWFkZXIsaGdyb3VwLG1haW4sbmF2LHNlY3Rpb257ZGlzcGxheTpibG9ja31tYXJre2JhY2tncm91bmQ6I0ZGMDtjb2xvcjojMDAwfXRlbXBsYXRle2Rpc3BsYXk6bm9uZX0iKSksbHx8aShhLGQpLGF9dmFyIGssbCxtPSIzLjcuMiIsbj1hLmh0bWw1fHx7fSxvPS9ePHxeKD86YnV0dG9ufG1hcHxzZWxlY3R8dGV4dGFyZWF8b2JqZWN0fGlmcmFtZXxvcHRpb258b3B0Z3JvdXApJC9pLHA9L14oPzphfGJ8Y29kZXxkaXZ8ZmllbGRzZXR8aDF8aDJ8aDN8aDR8aDV8aDZ8aXxsYWJlbHxsaXxvbHxwfHF8c3BhbnxzdHJvbmd8c3R5bGV8dGFibGV8dGJvZHl8dGR8dGh8dHJ8dWwpJC9pLHE9Il9odG1sNXNoaXYiLHI9MCxzPXt9OyFmdW5jdGlvbigpe3RyeXt2YXIgYT1iLmNyZWF0ZUVsZW1lbnQoImEiKTthLmlubmVySFRNTD0iPHh5ej48L3h5ej4iLGs9ImhpZGRlbiJpbiBhLGw9MT09YS5jaGlsZE5vZGVzLmxlbmd0aHx8ZnVuY3Rpb24oKXtiLmNyZWF0ZUVsZW1lbnQoImEiKTt2YXIgYT1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGEuY2xvbmVOb2RlfHwidW5kZWZpbmVkIj09dHlwZW9mIGEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudHx8InVuZGVmaW5lZCI9PXR5cGVvZiBhLmNyZWF0ZUVsZW1lbnR9KCl9Y2F0Y2goYyl7az0hMCxsPSEwfX0oKTt2YXIgdD17ZWxlbWVudHM6bi5lbGVtZW50c3x8ImFiYnIgYXJ0aWNsZSBhc2lkZSBhdWRpbyBiZGkgY2FudmFzIGRhdGEgZGF0YWxpc3QgZGV0YWlscyBkaWFsb2cgZmlnY2FwdGlvbiBmaWd1cmUgZm9vdGVyIGhlYWRlciBoZ3JvdXAgbWFpbiBtYXJrIG1ldGVyIG5hdiBvdXRwdXQgcGljdHVyZSBwcm9ncmVzcyBzZWN0aW9uIHN1bW1hcnkgdGVtcGxhdGUgdGltZSB2aWRlbyIsdmVyc2lvbjptLHNoaXZDU1M6bi5zaGl2Q1NTIT09ITEsc3VwcG9ydHNVbmtub3duRWxlbWVudHM6bCxzaGl2TWV0aG9kczpuLnNoaXZNZXRob2RzIT09ITEsdHlwZToiZGVmYXVsdCIsc2hpdkRvY3VtZW50OmosY3JlYXRlRWxlbWVudDpnLGNyZWF0ZURvY3VtZW50RnJhZ21lbnQ6aCxhZGRFbGVtZW50czplfTthLmh0bWw1PXQsaihiKX0odGhpcyxkb2N1bWVudCk7Cn07Cg=="></script> <script src="data:application/x-javascript;base64,LyohIFJlc3BvbmQuanMgdjEuNC4yOiBtaW4vbWF4LXdpZHRoIG1lZGlhIHF1ZXJ5IHBvbHlmaWxsICogQ29weXJpZ2h0IDIwMTMgU2NvdHQgSmVobAogKiBMaWNlbnNlZCB1bmRlciBodHRwczovL2dpdGh1Yi5jb20vc2NvdHRqZWhsL1Jlc3BvbmQvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVQKICogICovCgovLyBPbmx5IHJ1biB0aGlzIGNvZGUgaW4gSUUgOAppZiAoISF3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiTVNJRSA4IikpIHsKIWZ1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjthLm1hdGNoTWVkaWE9YS5tYXRjaE1lZGlhfHxmdW5jdGlvbihhKXt2YXIgYixjPWEuZG9jdW1lbnRFbGVtZW50LGQ9Yy5maXJzdEVsZW1lbnRDaGlsZHx8Yy5maXJzdENoaWxkLGU9YS5jcmVhdGVFbGVtZW50KCJib2R5IiksZj1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBmLmlkPSJtcS10ZXN0LTEiLGYuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7dG9wOi0xMDBlbSIsZS5zdHlsZS5iYWNrZ3JvdW5kPSJub25lIixlLmFwcGVuZENoaWxkKGYpLGZ1bmN0aW9uKGEpe3JldHVybiBmLmlubmVySFRNTD0nJnNoeTs8c3R5bGUgbWVkaWE9IicrYSsnIj4gI21xLXRlc3QtMSB7IHdpZHRoOiA0MnB4OyB9PC9zdHlsZT4nLGMuaW5zZXJ0QmVmb3JlKGUsZCksYj00Mj09PWYub2Zmc2V0V2lkdGgsYy5yZW1vdmVDaGlsZChlKSx7bWF0Y2hlczpiLG1lZGlhOmF9fX0oYS5kb2N1bWVudCl9KHRoaXMpLGZ1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKCl7dSghMCl9dmFyIGM9e307YS5yZXNwb25kPWMsYy51cGRhdGU9ZnVuY3Rpb24oKXt9O3ZhciBkPVtdLGU9ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj1uZXcgYS5YTUxIdHRwUmVxdWVzdH1jYXRjaChjKXtiPW5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGJ9fSgpLGY9ZnVuY3Rpb24oYSxiKXt2YXIgYz1lKCk7YyYmKGMub3BlbigiR0VUIixhLCEwKSxjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQhPT1jLnJlYWR5U3RhdGV8fDIwMCE9PWMuc3RhdHVzJiYzMDQhPT1jLnN0YXR1c3x8YihjLnJlc3BvbnNlVGV4dCl9LDQhPT1jLnJlYWR5U3RhdGUmJmMuc2VuZChudWxsKSl9O2lmKGMuYWpheD1mLGMucXVldWU9ZCxjLnJlZ2V4PXttZWRpYTovQG1lZGlhW15ce10rXHsoW15ce1x9XSpce1teXH1ce10qXH0pKy9naSxrZXlmcmFtZXM6L0AoPzpcLSg/Om98bW96fHdlYmtpdClcLSk/a2V5ZnJhbWVzW15ce10rXHsoPzpbXlx7XH1dKlx7W15cfVx7XSpcfSkrW15cfV0qXH0vZ2ksdXJsczovKHVybFwoKVsnIl0/KFteXC9cKSciXVteOlwpJyJdKylbJyJdPyhcKSkvZyxmaW5kU3R5bGVzOi9AbWVkaWEgKihbXlx7XSspXHsoW1xTXHNdKz8pJC8sb25seTovKG9ubHlccyspPyhbYS16QS1aXSspXHM/LyxtaW53Oi9cKFtcc10qbWluXC13aWR0aFxzKjpbXHNdKihbXHNdKlswLTlcLl0rKShweHxlbSlbXHNdKlwpLyxtYXh3Oi9cKFtcc10qbWF4XC13aWR0aFxzKjpbXHNdKihbXHNdKlswLTlcLl0rKShweHxlbSlbXHNdKlwpL30sYy5tZWRpYVF1ZXJpZXNTdXBwb3J0ZWQ9YS5tYXRjaE1lZGlhJiZudWxsIT09YS5tYXRjaE1lZGlhKCJvbmx5IGFsbCIpJiZhLm1hdGNoTWVkaWEoIm9ubHkgYWxsIikubWF0Y2hlcywhYy5tZWRpYVF1ZXJpZXNTdXBwb3J0ZWQpe3ZhciBnLGgsaSxqPWEuZG9jdW1lbnQsaz1qLmRvY3VtZW50RWxlbWVudCxsPVtdLG09W10sbj1bXSxvPXt9LHA9MzAscT1qLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGsscj1qLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlIilbMF0scz1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIiksdD1mdW5jdGlvbigpe3ZhciBhLGI9ai5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWouYm9keSxkPWsuc3R5bGUuZm9udFNpemUsZT1jJiZjLnN0eWxlLmZvbnRTaXplLGY9ITE7cmV0dXJuIGIuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Zm9udC1zaXplOjFlbTt3aWR0aDoxZW0iLGN8fChjPWY9ai5jcmVhdGVFbGVtZW50KCJib2R5IiksYy5zdHlsZS5iYWNrZ3JvdW5kPSJub25lIiksay5zdHlsZS5mb250U2l6ZT0iMTAwJSIsYy5zdHlsZS5mb250U2l6ZT0iMTAwJSIsYy5hcHBlbmRDaGlsZChiKSxmJiZrLmluc2VydEJlZm9yZShjLGsuZmlyc3RDaGlsZCksYT1iLm9mZnNldFdpZHRoLGY/ay5yZW1vdmVDaGlsZChjKTpjLnJlbW92ZUNoaWxkKGIpLGsuc3R5bGUuZm9udFNpemU9ZCxlJiYoYy5zdHlsZS5mb250U2l6ZT1lKSxhPWk9cGFyc2VGbG9hdChhKX0sdT1mdW5jdGlvbihiKXt2YXIgYz0iY2xpZW50V2lkdGgiLGQ9a1tjXSxlPSJDU1MxQ29tcGF0Ij09PWouY29tcGF0TW9kZSYmZHx8ai5ib2R5W2NdfHxkLGY9e30sbz1zW3MubGVuZ3RoLTFdLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCk7aWYoYiYmZyYmcD5yLWcpcmV0dXJuIGEuY2xlYXJUaW1lb3V0KGgpLGg9YS5zZXRUaW1lb3V0KHUscCksdm9pZCAwO2c9cjtmb3IodmFyIHYgaW4gbClpZihsLmhhc093blByb3BlcnR5KHYpKXt2YXIgdz1sW3ZdLHg9dy5taW53LHk9dy5tYXh3LHo9bnVsbD09PXgsQT1udWxsPT09eSxCPSJlbSI7eCYmKHg9cGFyc2VGbG9hdCh4KSooeC5pbmRleE9mKEIpPi0xP2l8fHQoKToxKSkseSYmKHk9cGFyc2VGbG9hdCh5KSooeS5pbmRleE9mKEIpPi0xP2l8fHQoKToxKSksdy5oYXNxdWVyeSYmKHomJkF8fCEoenx8ZT49eCl8fCEoQXx8eT49ZSkpfHwoZlt3Lm1lZGlhXXx8KGZbdy5tZWRpYV09W10pLGZbdy5tZWRpYV0ucHVzaChtW3cucnVsZXNdKSl9Zm9yKHZhciBDIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShDKSYmbltDXSYmbltDXS5wYXJlbnROb2RlPT09cSYmcS5yZW1vdmVDaGlsZChuW0NdKTtuLmxlbmd0aD0wO2Zvcih2YXIgRCBpbiBmKWlmKGYuaGFzT3duUHJvcGVydHkoRCkpe3ZhciBFPWouY3JlYXRlRWxlbWVudCgic3R5bGUiKSxGPWZbRF0uam9pbigiXG4iKTtFLnR5cGU9InRleHQvY3NzIixFLm1lZGlhPUQscS5pbnNlcnRCZWZvcmUoRSxvLm5leHRTaWJsaW5nKSxFLnN0eWxlU2hlZXQ/RS5zdHlsZVNoZWV0LmNzc1RleHQ9RjpFLmFwcGVuZENoaWxkKGouY3JlYXRlVGV4dE5vZGUoRikpLG4ucHVzaChFKX19LHY9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEucmVwbGFjZShjLnJlZ2V4LmtleWZyYW1lcywiIikubWF0Y2goYy5yZWdleC5tZWRpYSksZj1lJiZlLmxlbmd0aHx8MDtiPWIuc3Vic3RyaW5nKDAsYi5sYXN0SW5kZXhPZigiLyIpKTt2YXIgZz1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKGMucmVnZXgudXJscywiJDEiK2IrIiQyJDMiKX0saD0hZiYmZDtiLmxlbmd0aCYmKGIrPSIvIiksaCYmKGY9MSk7Zm9yKHZhciBpPTA7Zj5pO2krKyl7dmFyIGosayxuLG87aD8oaj1kLG0ucHVzaChnKGEpKSk6KGo9ZVtpXS5tYXRjaChjLnJlZ2V4LmZpbmRTdHlsZXMpJiZSZWdFeHAuJDEsbS5wdXNoKFJlZ0V4cC4kMiYmZyhSZWdFeHAuJDIpKSksbj1qLnNwbGl0KCIsIiksbz1uLmxlbmd0aDtmb3IodmFyIHA9MDtvPnA7cCsrKWs9bltwXSxsLnB1c2goe21lZGlhOmsuc3BsaXQoIigiKVswXS5tYXRjaChjLnJlZ2V4Lm9ubHkpJiZSZWdFeHAuJDJ8fCJhbGwiLHJ1bGVzOm0ubGVuZ3RoLTEsaGFzcXVlcnk6ay5pbmRleE9mKCIoIik+LTEsbWludzprLm1hdGNoKGMucmVnZXgubWludykmJnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsoUmVnRXhwLiQyfHwiIiksbWF4dzprLm1hdGNoKGMucmVnZXgubWF4dykmJnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsoUmVnRXhwLiQyfHwiIil9KX11KCl9LHc9ZnVuY3Rpb24oKXtpZihkLmxlbmd0aCl7dmFyIGI9ZC5zaGlmdCgpO2YoYi5ocmVmLGZ1bmN0aW9uKGMpe3YoYyxiLmhyZWYsYi5tZWRpYSksb1tiLmhyZWZdPSEwLGEuc2V0VGltZW91dChmdW5jdGlvbigpe3coKX0sMCl9KX19LHg9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPHMubGVuZ3RoO2IrKyl7dmFyIGM9c1tiXSxlPWMuaHJlZixmPWMubWVkaWEsZz1jLnJlbCYmInN0eWxlc2hlZXQiPT09Yy5yZWwudG9Mb3dlckNhc2UoKTtlJiZnJiYhb1tlXSYmKGMuc3R5bGVTaGVldCYmYy5zdHlsZVNoZWV0LnJhd0Nzc1RleHQ/KHYoYy5zdHlsZVNoZWV0LnJhd0Nzc1RleHQsZSxmKSxvW2VdPSEwKTooIS9eKFthLXpBLVo6XSpcL1wvKS8udGVzdChlKSYmIXJ8fGUucmVwbGFjZShSZWdFeHAuJDEsIiIpLnNwbGl0KCIvIilbMF09PT1hLmxvY2F0aW9uLmhvc3QpJiYoIi8vIj09PWUuc3Vic3RyaW5nKDAsMikmJihlPWEubG9jYXRpb24ucHJvdG9jb2wrZSksZC5wdXNoKHtocmVmOmUsbWVkaWE6Zn0pKSl9dygpfTt4KCksYy51cGRhdGU9eCxjLmdldEVtVmFsdWU9dCxhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGIsITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9ucmVzaXplIixiKX19KHRoaXMpOwp9Owo="></script> -<script src="data:application/x-javascript;base64,Cgp3aW5kb3cuYnVpbGRUYWJzZXRzID0gZnVuY3Rpb24odG9jSUQpIHsKCiAgLy8gYnVpbGQgYSB0YWJzZXQgZnJvbSBhIHNlY3Rpb24gZGl2IHdpdGggdGhlIC50YWJzZXQgY2xhc3MKICBmdW5jdGlvbiBidWlsZFRhYnNldCh0YWJzZXQpIHsKCiAgICAvLyBjaGVjayBmb3IgZmFkZSBhbmQgcGlsbHMgb3B0aW9ucwogICAgdmFyIGZhZGUgPSB0YWJzZXQuaGFzQ2xhc3MoInRhYnNldC1mYWRlIik7CiAgICB2YXIgcGlsbHMgPSB0YWJzZXQuaGFzQ2xhc3MoInRhYnNldC1waWxscyIpOwogICAgdmFyIG5hdkNsYXNzID0gcGlsbHMgPyAibmF2LXBpbGxzIiA6ICJuYXYtdGFicyI7CgogICAgLy8gZGV0ZXJtaW5lIHRoZSBoZWFkaW5nIGxldmVsIG9mIHRoZSB0YWJzZXQgYW5kIHRhYnMKICAgIHZhciBtYXRjaCA9IHRhYnNldC5hdHRyKCdjbGFzcycpLm1hdGNoKC9sZXZlbChcZCkgLyk7CiAgICBpZiAobWF0Y2ggPT09IG51bGwpCiAgICAgIHJldHVybjsKICAgIHZhciB0YWJzZXRMZXZlbCA9IE51bWJlcihtYXRjaFsxXSk7CiAgICB2YXIgdGFiTGV2ZWwgPSB0YWJzZXRMZXZlbCArIDE7CgogICAgLy8gZmluZCBhbGwgc3ViaGVhZGluZ3MgaW1tZWRpYXRlbHkgYmVsb3cKICAgIHZhciB0YWJzID0gdGFic2V0LmZpbmQoImRpdi5zZWN0aW9uLmxldmVsIiArIHRhYkxldmVsKTsKICAgIGlmICghdGFicy5sZW5ndGgpCiAgICAgIHJldHVybjsKCiAgICAvLyBjcmVhdGUgdGFibGlzdCBhbmQgdGFiLWNvbnRlbnQgZWxlbWVudHMKICAgIHZhciB0YWJMaXN0ID0gJCgnPHVsIGNsYXNzPSJuYXYgJyArIG5hdkNsYXNzICsgJyIgcm9sZT0idGFibGlzdCI+PC91bD4nKTsKICAgICQodGFic1swXSkuYmVmb3JlKHRhYkxpc3QpOwogICAgdmFyIHRhYkNvbnRlbnQgPSAkKCc8ZGl2IGNsYXNzPSJ0YWItY29udGVudCI+PC9kaXY+Jyk7CiAgICAkKHRhYnNbMF0pLmJlZm9yZSh0YWJDb250ZW50KTsKCiAgICAvLyBidWlsZCB0aGUgdGFic2V0CiAgICB2YXIgYWN0aXZlVGFiID0gMDsKICAgIHRhYnMuZWFjaChmdW5jdGlvbihpKSB7CgogICAgICAvLyBnZXQgdGhlIHRhYiBkaXYKICAgICAgdmFyIHRhYiA9ICQodGFic1tpXSk7CgogICAgICAvLyBnZXQgdGhlIGlkIHRoZW4gc2FuaXRpemUgaXQgZm9yIHVzZSB3aXRoIGJvb3RzdHJhcCB0YWJzCiAgICAgIHZhciBpZCA9IHRhYi5hdHRyKCdpZCcpOwoKICAgICAgLy8gc2VlIGlmIHRoaXMgaXMgbWFya2VkIGFzIHRoZSBhY3RpdmUgdGFiCiAgICAgIGlmICh0YWIuaGFzQ2xhc3MoJ2FjdGl2ZScpKQogICAgICAgIGFjdGl2ZVRhYiA9IGk7CgogICAgICAvLyByZW1vdmUgYW55IHRhYmxlIG9mIGNvbnRlbnRzIGVudHJpZXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgIC8vIHRoaXMgSUQgKHNpbmNlIHdlJ2xsIGJlIHJlbW92aW5nIHRoZSBoZWFkaW5nIGVsZW1lbnQpCiAgICAgICQoImRpdiMiICsgdG9jSUQgKyAiIGxpIGFbaHJlZj0nIyIgKyBpZCArICInXSIpLnBhcmVudCgpLnJlbW92ZSgpOwoKICAgICAgLy8gc2FuaXRpemUgdGhlIGlkIGZvciB1c2Ugd2l0aCBib290c3RyYXAgdGFicwogICAgICBpZCA9IGlkLnJlcGxhY2UoL1suXC8/JiEjPD5dL2csICcnKS5yZXBsYWNlKC9ccy9nLCAnXycpOwogICAgICB0YWIuYXR0cignaWQnLCBpZCk7CgogICAgICAvLyBnZXQgdGhlIGhlYWRpbmcgZWxlbWVudCB3aXRoaW4gaXQsIGdyYWIgaXQncyB0ZXh0LCB0aGVuIHJlbW92ZSBpdAogICAgICB2YXIgaGVhZGluZyA9IHRhYi5maW5kKCdoJyArIHRhYkxldmVsICsgJzpmaXJzdCcpOwogICAgICB2YXIgaGVhZGluZ1RleHQgPSBoZWFkaW5nLmh0bWwoKTsKICAgICAgaGVhZGluZy5yZW1vdmUoKTsKCiAgICAgIC8vIGJ1aWxkIGFuZCBhcHBlbmQgdGhlIHRhYiBsaXN0IGl0ZW0KICAgICAgdmFyIGEgPSAkKCc8YSByb2xlPSJ0YWIiIGRhdGEtdG9nZ2xlPSJ0YWIiPicgKyBoZWFkaW5nVGV4dCArICc8L2E+Jyk7CiAgICAgIGEuYXR0cignaHJlZicsICcjJyArIGlkKTsKICAgICAgYS5hdHRyKCdhcmlhLWNvbnRyb2xzJywgaWQpOwogICAgICB2YXIgbGkgPSAkKCc8bGkgcm9sZT0icHJlc2VudGF0aW9uIj48L2xpPicpOwogICAgICBsaS5hcHBlbmQoYSk7CiAgICAgIHRhYkxpc3QuYXBwZW5kKGxpKTsKCiAgICAgIC8vIHNldCBpdCdzIGF0dHJpYnV0ZXMKICAgICAgdGFiLmF0dHIoJ3JvbGUnLCAndGFicGFuZWwnKTsKICAgICAgdGFiLmFkZENsYXNzKCd0YWItcGFuZScpOwogICAgICB0YWIuYWRkQ2xhc3MoJ3RhYmJlZC1wYW5lJyk7CiAgICAgIGlmIChmYWRlKQogICAgICAgIHRhYi5hZGRDbGFzcygnZmFkZScpOwoKICAgICAgLy8gbW92ZSBpdCBpbnRvIHRoZSB0YWIgY29udGVudCBkaXYKICAgICAgdGFiLmRldGFjaCgpLmFwcGVuZFRvKHRhYkNvbnRlbnQpOwogICAgfSk7CgogICAgLy8gc2V0IGFjdGl2ZSB0YWIKICAgICQodGFiTGlzdC5jaGlsZHJlbignbGknKVthY3RpdmVUYWJdKS5hZGRDbGFzcygnYWN0aXZlJyk7CiAgICB2YXIgYWN0aXZlID0gJCh0YWJDb250ZW50LmNoaWxkcmVuKCdkaXYuc2VjdGlvbicpW2FjdGl2ZVRhYl0pOwogICAgYWN0aXZlLmFkZENsYXNzKCdhY3RpdmUnKTsKICAgIGlmIChmYWRlKQogICAgICBhY3RpdmUuYWRkQ2xhc3MoJ2luJyk7CiAgfQoKICAvLyBjb252ZXJ0IHNlY3Rpb24gZGl2cyB3aXRoIHRoZSAudGFic2V0IGNsYXNzIHRvIHRhYnNldHMKICB2YXIgdGFic2V0cyA9ICQoImRpdi5zZWN0aW9uLnRhYnNldCIpOwogIHRhYnNldHMuZWFjaChmdW5jdGlvbihpKSB7CiAgICBidWlsZFRhYnNldCgkKHRhYnNldHNbaV0pKTsKICB9KTsKfTsKCg=="></script> +<script src="data:application/x-javascript;base64,CgovKioKICogalF1ZXJ5IFBsdWdpbjogU3RpY2t5IFRhYnMKICoKICogQGF1dGhvciBBaWRhbiBMaXN0ZXIgPGFpZGFuQHBocC5uZXQ+CiAqIGFkYXB0ZWQgYnkgUnViZW4gQXJzbGFuIHRvIGFjdGl2YXRlIHBhcmVudCB0YWJzIHRvbwogKiBodHRwOi8vd3d3LmFpZGFubGlzdGVyLmNvbS8yMDE0LzAzL3BlcnNpc3RpbmctdGhlLXRhYi1zdGF0ZS1pbi1ib290c3RyYXAvCiAqLwooZnVuY3Rpb24oJCkgewogICJ1c2Ugc3RyaWN0IjsKICAkLmZuLnJtYXJrZG93blN0aWNreVRhYnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjb250ZXh0ID0gdGhpczsKICAgIC8vIFNob3cgdGhlIHRhYiBjb3JyZXNwb25kaW5nIHdpdGggdGhlIGhhc2ggaW4gdGhlIFVSTCwgb3IgdGhlIGZpcnN0IHRhYgogICAgdmFyIHNob3dTdHVmZkZyb21IYXNoID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2g7CiAgICAgIHZhciBzZWxlY3RvciA9IGhhc2ggPyAnYVtocmVmPSInICsgaGFzaCArICciXScgOiAnbGkuYWN0aXZlID4gYSc7CiAgICAgIHZhciAkc2VsZWN0b3IgPSAkKHNlbGVjdG9yLCBjb250ZXh0KTsKICAgICAgaWYoJHNlbGVjdG9yLmRhdGEoJ3RvZ2dsZScpID09PSAidGFiIikgewogICAgICAgICRzZWxlY3Rvci50YWIoJ3Nob3cnKTsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBhbmNlc3RvcnMgb2YgdGhpcyBlbGVtZW50LCBzaG93IGFueSBoaWRkZW4gdGFicwogICAgICAgICRzZWxlY3Rvci5wYXJlbnRzKCcuc2VjdGlvbi50YWJzZXQnKS5lYWNoKGZ1bmN0aW9uKGksIGVsbSkgewogICAgICAgICAgdmFyIGxpbmsgPSAkKCdhW2hyZWY9IiMnICsgJChlbG0pLmF0dHIoJ2lkJykgKyAnIl0nKTsKICAgICAgICAgIGlmKGxpbmsuZGF0YSgndG9nZ2xlJykgPT09ICJ0YWIiKSB7CiAgICAgICAgICAgIGxpbmsudGFiKCJzaG93Iik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CgoKICAgIC8vIFNldCB0aGUgY29ycmVjdCB0YWIgd2hlbiB0aGUgcGFnZSBsb2FkcwogICAgc2hvd1N0dWZmRnJvbUhhc2goY29udGV4dCk7CgogICAgLy8gU2V0IHRoZSBjb3JyZWN0IHRhYiB3aGVuIGEgdXNlciB1c2VzIHRoZWlyIGJhY2svZm9yd2FyZCBidXR0b24KICAgICQod2luZG93KS5vbignaGFzaGNoYW5nZScsIGZ1bmN0aW9uKCkgewogICAgICBzaG93U3R1ZmZGcm9tSGFzaChjb250ZXh0KTsKICAgIH0pOwoKICAgIC8vIENoYW5nZSB0aGUgVVJMIHdoZW4gdGFicyBhcmUgY2xpY2tlZAogICAgJCgnYScsIGNvbnRleHQpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgbnVsbCwgdGhpcy5ocmVmKTsKICAgICAgc2hvd1N0dWZmRnJvbUhhc2goY29udGV4dCk7CiAgICB9KTsKCiAgICByZXR1cm4gdGhpczsKICB9Owp9KGpRdWVyeSkpOwoKd2luZG93LmJ1aWxkVGFic2V0cyA9IGZ1bmN0aW9uKHRvY0lEKSB7CgogIC8vIGJ1aWxkIGEgdGFic2V0IGZyb20gYSBzZWN0aW9uIGRpdiB3aXRoIHRoZSAudGFic2V0IGNsYXNzCiAgZnVuY3Rpb24gYnVpbGRUYWJzZXQodGFic2V0KSB7CgogICAgLy8gY2hlY2sgZm9yIGZhZGUgYW5kIHBpbGxzIG9wdGlvbnMKICAgIHZhciBmYWRlID0gdGFic2V0Lmhhc0NsYXNzKCJ0YWJzZXQtZmFkZSIpOwogICAgdmFyIHBpbGxzID0gdGFic2V0Lmhhc0NsYXNzKCJ0YWJzZXQtcGlsbHMiKTsKICAgIHZhciBuYXZDbGFzcyA9IHBpbGxzID8gIm5hdi1waWxscyIgOiAibmF2LXRhYnMiOwoKICAgIC8vIGRldGVybWluZSB0aGUgaGVhZGluZyBsZXZlbCBvZiB0aGUgdGFic2V0IGFuZCB0YWJzCiAgICB2YXIgbWF0Y2ggPSB0YWJzZXQuYXR0cignY2xhc3MnKS5tYXRjaCgvbGV2ZWwoXGQpIC8pOwogICAgaWYgKG1hdGNoID09PSBudWxsKQogICAgICByZXR1cm47CiAgICB2YXIgdGFic2V0TGV2ZWwgPSBOdW1iZXIobWF0Y2hbMV0pOwogICAgdmFyIHRhYkxldmVsID0gdGFic2V0TGV2ZWwgKyAxOwoKICAgIC8vIGZpbmQgYWxsIHN1YmhlYWRpbmdzIGltbWVkaWF0ZWx5IGJlbG93CiAgICB2YXIgdGFicyA9IHRhYnNldC5maW5kKCJkaXYuc2VjdGlvbi5sZXZlbCIgKyB0YWJMZXZlbCk7CiAgICBpZiAoIXRhYnMubGVuZ3RoKQogICAgICByZXR1cm47CgogICAgLy8gY3JlYXRlIHRhYmxpc3QgYW5kIHRhYi1jb250ZW50IGVsZW1lbnRzCiAgICB2YXIgdGFiTGlzdCA9ICQoJzx1bCBjbGFzcz0ibmF2ICcgKyBuYXZDbGFzcyArICciIHJvbGU9InRhYmxpc3QiPjwvdWw+Jyk7CiAgICAkKHRhYnNbMF0pLmJlZm9yZSh0YWJMaXN0KTsKICAgIHZhciB0YWJDb250ZW50ID0gJCgnPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPjwvZGl2PicpOwogICAgJCh0YWJzWzBdKS5iZWZvcmUodGFiQ29udGVudCk7CgogICAgLy8gYnVpbGQgdGhlIHRhYnNldAogICAgdmFyIGFjdGl2ZVRhYiA9IDA7CiAgICB0YWJzLmVhY2goZnVuY3Rpb24oaSkgewoKICAgICAgLy8gZ2V0IHRoZSB0YWIgZGl2CiAgICAgIHZhciB0YWIgPSAkKHRhYnNbaV0pOwoKICAgICAgLy8gZ2V0IHRoZSBpZCB0aGVuIHNhbml0aXplIGl0IGZvciB1c2Ugd2l0aCBib290c3RyYXAgdGFicwogICAgICB2YXIgaWQgPSB0YWIuYXR0cignaWQnKTsKCiAgICAgIC8vIHNlZSBpZiB0aGlzIGlzIG1hcmtlZCBhcyB0aGUgYWN0aXZlIHRhYgogICAgICBpZiAodGFiLmhhc0NsYXNzKCdhY3RpdmUnKSkKICAgICAgICBhY3RpdmVUYWIgPSBpOwoKICAgICAgLy8gcmVtb3ZlIGFueSB0YWJsZSBvZiBjb250ZW50cyBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aAogICAgICAvLyB0aGlzIElEIChzaW5jZSB3ZSdsbCBiZSByZW1vdmluZyB0aGUgaGVhZGluZyBlbGVtZW50KQogICAgICAkKCJkaXYjIiArIHRvY0lEICsgIiBsaSBhW2hyZWY9JyMiICsgaWQgKyAiJ10iKS5wYXJlbnQoKS5yZW1vdmUoKTsKCiAgICAgIC8vIHNhbml0aXplIHRoZSBpZCBmb3IgdXNlIHdpdGggYm9vdHN0cmFwIHRhYnMKICAgICAgaWQgPSBpZC5yZXBsYWNlKC9bLlwvPyYhIzw+XS9nLCAnJykucmVwbGFjZSgvXHMvZywgJ18nKTsKICAgICAgdGFiLmF0dHIoJ2lkJywgaWQpOwoKICAgICAgLy8gZ2V0IHRoZSBoZWFkaW5nIGVsZW1lbnQgd2l0aGluIGl0LCBncmFiIGl0J3MgdGV4dCwgdGhlbiByZW1vdmUgaXQKICAgICAgdmFyIGhlYWRpbmcgPSB0YWIuZmluZCgnaCcgKyB0YWJMZXZlbCArICc6Zmlyc3QnKTsKICAgICAgdmFyIGhlYWRpbmdUZXh0ID0gaGVhZGluZy5odG1sKCk7CiAgICAgIGhlYWRpbmcucmVtb3ZlKCk7CgogICAgICAvLyBidWlsZCBhbmQgYXBwZW5kIHRoZSB0YWIgbGlzdCBpdGVtCiAgICAgIHZhciBhID0gJCgnPGEgcm9sZT0idGFiIiBkYXRhLXRvZ2dsZT0idGFiIj4nICsgaGVhZGluZ1RleHQgKyAnPC9hPicpOwogICAgICBhLmF0dHIoJ2hyZWYnLCAnIycgKyBpZCk7CiAgICAgIGEuYXR0cignYXJpYS1jb250cm9scycsIGlkKTsKICAgICAgdmFyIGxpID0gJCgnPGxpIHJvbGU9InByZXNlbnRhdGlvbiI+PC9saT4nKTsKICAgICAgbGkuYXBwZW5kKGEpOwogICAgICB0YWJMaXN0LmFwcGVuZChsaSk7CgogICAgICAvLyBzZXQgaXQncyBhdHRyaWJ1dGVzCiAgICAgIHRhYi5hdHRyKCdyb2xlJywgJ3RhYnBhbmVsJyk7CiAgICAgIHRhYi5hZGRDbGFzcygndGFiLXBhbmUnKTsKICAgICAgdGFiLmFkZENsYXNzKCd0YWJiZWQtcGFuZScpOwogICAgICBpZiAoZmFkZSkKICAgICAgICB0YWIuYWRkQ2xhc3MoJ2ZhZGUnKTsKCiAgICAgIC8vIG1vdmUgaXQgaW50byB0aGUgdGFiIGNvbnRlbnQgZGl2CiAgICAgIHRhYi5kZXRhY2goKS5hcHBlbmRUbyh0YWJDb250ZW50KTsKICAgIH0pOwoKICAgIC8vIHNldCBhY3RpdmUgdGFiCiAgICAkKHRhYkxpc3QuY2hpbGRyZW4oJ2xpJylbYWN0aXZlVGFiXSkuYWRkQ2xhc3MoJ2FjdGl2ZScpOwogICAgdmFyIGFjdGl2ZSA9ICQodGFiQ29udGVudC5jaGlsZHJlbignZGl2LnNlY3Rpb24nKVthY3RpdmVUYWJdKTsKICAgIGFjdGl2ZS5hZGRDbGFzcygnYWN0aXZlJyk7CiAgICBpZiAoZmFkZSkKICAgICAgYWN0aXZlLmFkZENsYXNzKCdpbicpOwoKICAgIGlmICh0YWJzZXQuaGFzQ2xhc3MoInRhYnNldC1zdGlja3kiKSkKICAgICAgdGFic2V0LnJtYXJrZG93blN0aWNreVRhYnMoKTsKICB9CgogIC8vIGNvbnZlcnQgc2VjdGlvbiBkaXZzIHdpdGggdGhlIC50YWJzZXQgY2xhc3MgdG8gdGFic2V0cwogIHZhciB0YWJzZXRzID0gJCgiZGl2LnNlY3Rpb24udGFic2V0Iik7CiAgdGFic2V0cy5lYWNoKGZ1bmN0aW9uKGkpIHsKICAgIGJ1aWxkVGFic2V0KCQodGFic2V0c1tpXSkpOwogIH0pOwp9OwoK"></script> <link href="data:text/css;charset=utf-8,pre%20%2Eoperator%2C%0Apre%20%2Eparen%20%7B%0Acolor%3A%20rgb%28104%2C%20118%2C%20135%29%0A%7D%0Apre%20%2Eliteral%20%7B%0Acolor%3A%20%23990073%0A%7D%0Apre%20%2Enumber%20%7B%0Acolor%3A%20%23099%3B%0A%7D%0Apre%20%2Ecomment%20%7B%0Acolor%3A%20%23998%3B%0Afont%2Dstyle%3A%20italic%0A%7D%0Apre%20%2Ekeyword%20%7B%0Acolor%3A%20%23900%3B%0Afont%2Dweight%3A%20bold%0A%7D%0Apre%20%2Eidentifier%20%7B%0Acolor%3A%20rgb%280%2C%200%2C%200%29%3B%0A%7D%0Apre%20%2Estring%20%7B%0Acolor%3A%20%23d14%3B%0A%7D%0A" rel="stylesheet" /> <script src="data:application/x-javascript;base64,dmFyIGhsanM9bmV3IGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbShwKXtyZXR1cm4gcC5yZXBsYWNlKC8mL2dtLCImYW1wOyIpLnJlcGxhY2UoLzwvZ20sIiZsdDsiKX1mdW5jdGlvbiBmKHIscSxwKXtyZXR1cm4gUmVnRXhwKHEsIm0iKyhyLmNJPyJpIjoiIikrKHA/ImciOiIiKSl9ZnVuY3Rpb24gYihyKXtmb3IodmFyIHA9MDtwPHIuY2hpbGROb2Rlcy5sZW5ndGg7cCsrKXt2YXIgcT1yLmNoaWxkTm9kZXNbcF07aWYocS5ub2RlTmFtZT09IkNPREUiKXtyZXR1cm4gcX1pZighKHEubm9kZVR5cGU9PTMmJnEubm9kZVZhbHVlLm1hdGNoKC9ccysvKSkpe2JyZWFrfX19ZnVuY3Rpb24gaCh0LHMpe3ZhciBwPSIiO2Zvcih2YXIgcj0wO3I8dC5jaGlsZE5vZGVzLmxlbmd0aDtyKyspe2lmKHQuY2hpbGROb2Rlc1tyXS5ub2RlVHlwZT09Myl7dmFyIHE9dC5jaGlsZE5vZGVzW3JdLm5vZGVWYWx1ZTtpZihzKXtxPXEucmVwbGFjZSgvXG4vZywiIil9cCs9cX1lbHNle2lmKHQuY2hpbGROb2Rlc1tyXS5ub2RlTmFtZT09IkJSIil7cCs9IlxuIn1lbHNle3ArPWgodC5jaGlsZE5vZGVzW3JdKX19fWlmKC9NU0lFIFs2NzhdLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKXtwPXAucmVwbGFjZSgvXHIvZywiXG4iKX1yZXR1cm4gcH1mdW5jdGlvbiBhKHMpe3ZhciByPXMuY2xhc3NOYW1lLnNwbGl0KC9ccysvKTtyPXIuY29uY2F0KHMucGFyZW50Tm9kZS5jbGFzc05hbWUuc3BsaXQoL1xzKy8pKTtmb3IodmFyIHE9MDtxPHIubGVuZ3RoO3ErKyl7dmFyIHA9cltxXS5yZXBsYWNlKC9ebGFuZ3VhZ2UtLywiIik7aWYoZVtwXSl7cmV0dXJuIHB9fX1mdW5jdGlvbiBjKHEpe3ZhciBwPVtdOyhmdW5jdGlvbihzLHQpe2Zvcih2YXIgcj0wO3I8cy5jaGlsZE5vZGVzLmxlbmd0aDtyKyspe2lmKHMuY2hpbGROb2Rlc1tyXS5ub2RlVHlwZT09Myl7dCs9cy5jaGlsZE5vZGVzW3JdLm5vZGVWYWx1ZS5sZW5ndGh9ZWxzZXtpZihzLmNoaWxkTm9kZXNbcl0ubm9kZU5hbWU9PSJCUiIpe3QrPTF9ZWxzZXtpZihzLmNoaWxkTm9kZXNbcl0ubm9kZVR5cGU9PTEpe3AucHVzaCh7ZXZlbnQ6InN0YXJ0IixvZmZzZXQ6dCxub2RlOnMuY2hpbGROb2Rlc1tyXX0pO3Q9YXJndW1lbnRzLmNhbGxlZShzLmNoaWxkTm9kZXNbcl0sdCk7cC5wdXNoKHtldmVudDoic3RvcCIsb2Zmc2V0OnQsbm9kZTpzLmNoaWxkTm9kZXNbcl19KX19fX1yZXR1cm4gdH0pKHEsMCk7cmV0dXJuIHB9ZnVuY3Rpb24gayh5LHcseCl7dmFyIHE9MDt2YXIgej0iIjt2YXIgcz1bXTtmdW5jdGlvbiB1KCl7aWYoeS5sZW5ndGgmJncubGVuZ3RoKXtpZih5WzBdLm9mZnNldCE9d1swXS5vZmZzZXQpe3JldHVybih5WzBdLm9mZnNldDx3WzBdLm9mZnNldCk/eTp3fWVsc2V7cmV0dXJuIHdbMF0uZXZlbnQ9PSJzdGFydCI/eTp3fX1lbHNle3JldHVybiB5Lmxlbmd0aD95Ond9fWZ1bmN0aW9uIHQoRCl7dmFyIEE9IjwiK0Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtmb3IodmFyIEI9MDtCPEQuYXR0cmlidXRlcy5sZW5ndGg7QisrKXt2YXIgQz1ELmF0dHJpYnV0ZXNbQl07QSs9IiAiK0Mubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihDLnZhbHVlIT09dW5kZWZpbmVkJiZDLnZhbHVlIT09ZmFsc2UmJkMudmFsdWUhPT1udWxsKXtBKz0nPSInK20oQy52YWx1ZSkrJyInfX1yZXR1cm4gQSsiPiJ9d2hpbGUoeS5sZW5ndGh8fHcubGVuZ3RoKXt2YXIgdj11KCkuc3BsaWNlKDAsMSlbMF07eis9bSh4LnN1YnN0cihxLHYub2Zmc2V0LXEpKTtxPXYub2Zmc2V0O2lmKHYuZXZlbnQ9PSJzdGFydCIpe3orPXQodi5ub2RlKTtzLnB1c2godi5ub2RlKX1lbHNle2lmKHYuZXZlbnQ9PSJzdG9wIil7dmFyIHAscj1zLmxlbmd0aDtkb3tyLS07cD1zW3JdO3orPSgiPC8iK3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKSsiPiIpfXdoaWxlKHAhPXYubm9kZSk7cy5zcGxpY2UociwxKTt3aGlsZShyPHMubGVuZ3RoKXt6Kz10KHNbcl0pO3IrK319fX1yZXR1cm4geittKHguc3Vic3RyKHEpKX1mdW5jdGlvbiBqKCl7ZnVuY3Rpb24gcSh4LHksdil7aWYoeC5jb21waWxlZCl7cmV0dXJufXZhciB1O3ZhciBzPVtdO2lmKHguayl7eC5sUj1mKHkseC5sfHxobGpzLklSLHRydWUpO2Zvcih2YXIgdyBpbiB4Lmspe2lmKCF4LmsuaGFzT3duUHJvcGVydHkodykpe2NvbnRpbnVlfWlmKHgua1t3XSBpbnN0YW5jZW9mIE9iamVjdCl7dT14Lmtbd119ZWxzZXt1PXguazt3PSJrZXl3b3JkIn1mb3IodmFyIHIgaW4gdSl7aWYoIXUuaGFzT3duUHJvcGVydHkocikpe2NvbnRpbnVlfXgua1tyXT1bdyx1W3JdXTtzLnB1c2gocil9fX1pZighdil7aWYoeC5iV0spe3guYj0iXFxiKCIrcy5qb2luKCJ8IikrIilcXHMifXguYlI9Zih5LHguYj94LmI6IlxcQnxcXGIiKTtpZigheC5lJiYheC5lVyl7eC5lPSJcXEJ8XFxiIn1pZih4LmUpe3guZVI9Zih5LHguZSl9fWlmKHguaSl7eC5pUj1mKHkseC5pKX1pZih4LnI9PT11bmRlZmluZWQpe3gucj0xfWlmKCF4LmMpe3guYz1bXX14LmNvbXBpbGVkPXRydWU7Zm9yKHZhciB0PTA7dDx4LmMubGVuZ3RoO3QrKyl7aWYoeC5jW3RdPT0ic2VsZiIpe3guY1t0XT14fXEoeC5jW3RdLHksZmFsc2UpfWlmKHguc3RhcnRzKXtxKHguc3RhcnRzLHksZmFsc2UpfX1mb3IodmFyIHAgaW4gZSl7aWYoIWUuaGFzT3duUHJvcGVydHkocCkpe2NvbnRpbnVlfXEoZVtwXS5kTSxlW3BdLHRydWUpfX1mdW5jdGlvbiBkKEIsQyl7aWYoIWouY2FsbGVkKXtqKCk7ai5jYWxsZWQ9dHJ1ZX1mdW5jdGlvbiBxKHIsTSl7Zm9yKHZhciBMPTA7TDxNLmMubGVuZ3RoO0wrKyl7aWYoKE0uY1tMXS5iUi5leGVjKHIpfHxbbnVsbF0pWzBdPT1yKXtyZXR1cm4gTS5jW0xdfX19ZnVuY3Rpb24gdihMLHIpe2lmKERbTF0uZSYmRFtMXS5lUi50ZXN0KHIpKXtyZXR1cm4gMX1pZihEW0xdLmVXKXt2YXIgTT12KEwtMSxyKTtyZXR1cm4gTT9NKzE6MH1yZXR1cm4gMH1mdW5jdGlvbiB3KHIsTCl7cmV0dXJuIEwuaSYmTC5pUi50ZXN0KHIpfWZ1bmN0aW9uIEsoTixPKXt2YXIgTT1bXTtmb3IodmFyIEw9MDtMPE4uYy5sZW5ndGg7TCsrKXtNLnB1c2goTi5jW0xdLmIpfXZhciByPUQubGVuZ3RoLTE7ZG97aWYoRFtyXS5lKXtNLnB1c2goRFtyXS5lKX1yLS19d2hpbGUoRFtyKzFdLmVXKTtpZihOLmkpe00ucHVzaChOLmkpfXJldHVybiBmKE8sTS5qb2luKCJ8IiksdHJ1ZSl9ZnVuY3Rpb24gcChNLEwpe3ZhciBOPURbRC5sZW5ndGgtMV07aWYoIU4udCl7Ti50PUsoTixFKX1OLnQubGFzdEluZGV4PUw7dmFyIHI9Ti50LmV4ZWMoTSk7cmV0dXJuIHI/W00uc3Vic3RyKEwsci5pbmRleC1MKSxyWzBdLGZhbHNlXTpbTS5zdWJzdHIoTCksIiIsdHJ1ZV19ZnVuY3Rpb24geihOLHIpe3ZhciBMPUUuY0k/clswXS50b0xvd2VyQ2FzZSgpOnJbMF07dmFyIE09Ti5rW0xdO2lmKE0mJk0gaW5zdGFuY2VvZiBBcnJheSl7cmV0dXJuIE19cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIEYoTCxQKXtMPW0oTCk7aWYoIVAuayl7cmV0dXJuIEx9dmFyIHI9IiI7dmFyIE89MDtQLmxSLmxhc3RJbmRleD0wO3ZhciBNPVAubFIuZXhlYyhMKTt3aGlsZShNKXtyKz1MLnN1YnN0cihPLE0uaW5kZXgtTyk7dmFyIE49eihQLE0pO2lmKE4pe3grPU5bMV07cis9JzxzcGFuIGNsYXNzPSInK05bMF0rJyI+JytNWzBdKyI8L3NwYW4+In1lbHNle3IrPU1bMF19Tz1QLmxSLmxhc3RJbmRleDtNPVAubFIuZXhlYyhMKX1yZXR1cm4gcitMLnN1YnN0cihPLEwubGVuZ3RoLU8pfWZ1bmN0aW9uIEooTCxNKXtpZihNLnNMJiZlW00uc0xdKXt2YXIgcj1kKE0uc0wsTCk7eCs9ci5rZXl3b3JkX2NvdW50O3JldHVybiByLnZhbHVlfWVsc2V7cmV0dXJuIEYoTCxNKX19ZnVuY3Rpb24gSShNLHIpe3ZhciBMPU0uY04/JzxzcGFuIGNsYXNzPSInK00uY04rJyI+JzoiIjtpZihNLnJCKXt5Kz1MO00uYnVmZmVyPSIifWVsc2V7aWYoTS5lQil7eSs9bShyKStMO00uYnVmZmVyPSIifWVsc2V7eSs9TDtNLmJ1ZmZlcj1yfX1ELnB1c2goTSk7QSs9TS5yfWZ1bmN0aW9uIEcoTixNLFEpe3ZhciBSPURbRC5sZW5ndGgtMV07aWYoUSl7eSs9SihSLmJ1ZmZlcitOLFIpO3JldHVybiBmYWxzZX12YXIgUD1xKE0sUik7aWYoUCl7eSs9SihSLmJ1ZmZlcitOLFIpO0koUCxNKTtyZXR1cm4gUC5yQn12YXIgTD12KEQubGVuZ3RoLTEsTSk7aWYoTCl7dmFyIE89Ui5jTj8iPC9zcGFuPiI6IiI7aWYoUi5yRSl7eSs9SihSLmJ1ZmZlcitOLFIpK099ZWxzZXtpZihSLmVFKXt5Kz1KKFIuYnVmZmVyK04sUikrTyttKE0pfWVsc2V7eSs9SihSLmJ1ZmZlcitOK00sUikrT319d2hpbGUoTD4xKXtPPURbRC5sZW5ndGgtMl0uY04/Ijwvc3Bhbj4iOiIiO3krPU87TC0tO0QubGVuZ3RoLS19dmFyIHI9RFtELmxlbmd0aC0xXTtELmxlbmd0aC0tO0RbRC5sZW5ndGgtMV0uYnVmZmVyPSIiO2lmKHIuc3RhcnRzKXtJKHIuc3RhcnRzLCIiKX1yZXR1cm4gUi5yRX1pZih3KE0sUikpe3Rocm93IklsbGVnYWwifX12YXIgRT1lW0JdO3ZhciBEPVtFLmRNXTt2YXIgQT0wO3ZhciB4PTA7dmFyIHk9IiI7dHJ5e3ZhciBzLHU9MDtFLmRNLmJ1ZmZlcj0iIjtkb3tzPXAoQyx1KTt2YXIgdD1HKHNbMF0sc1sxXSxzWzJdKTt1Kz1zWzBdLmxlbmd0aDtpZighdCl7dSs9c1sxXS5sZW5ndGh9fXdoaWxlKCFzWzJdKTtpZihELmxlbmd0aD4xKXt0aHJvdyJJbGxlZ2FsIn1yZXR1cm57cjpBLGtleXdvcmRfY291bnQ6eCx2YWx1ZTp5fX1jYXRjaChIKXtpZihIPT0iSWxsZWdhbCIpe3JldHVybntyOjAsa2V5d29yZF9jb3VudDowLHZhbHVlOm0oQyl9fWVsc2V7dGhyb3cgSH19fWZ1bmN0aW9uIGcodCl7dmFyIHA9e2tleXdvcmRfY291bnQ6MCxyOjAsdmFsdWU6bSh0KX07dmFyIHI9cDtmb3IodmFyIHEgaW4gZSl7aWYoIWUuaGFzT3duUHJvcGVydHkocSkpe2NvbnRpbnVlfXZhciBzPWQocSx0KTtzLmxhbmd1YWdlPXE7aWYocy5rZXl3b3JkX2NvdW50K3Mucj5yLmtleXdvcmRfY291bnQrci5yKXtyPXN9aWYocy5rZXl3b3JkX2NvdW50K3Mucj5wLmtleXdvcmRfY291bnQrcC5yKXtyPXA7cD1zfX1pZihyLmxhbmd1YWdlKXtwLnNlY29uZF9iZXN0PXJ9cmV0dXJuIHB9ZnVuY3Rpb24gaShyLHEscCl7aWYocSl7cj1yLnJlcGxhY2UoL14oKDxbXj5dKz58XHQpKykvZ20sZnVuY3Rpb24odCx3LHYsdSl7cmV0dXJuIHcucmVwbGFjZSgvXHQvZyxxKX0pfWlmKHApe3I9ci5yZXBsYWNlKC9cbi9nLCI8YnI+Iil9cmV0dXJuIHJ9ZnVuY3Rpb24gbih0LHcscil7dmFyIHg9aCh0LHIpO3ZhciB2PWEodCk7dmFyIHkscztpZih2KXt5PWQodix4KX1lbHNle3JldHVybn12YXIgcT1jKHQpO2lmKHEubGVuZ3RoKXtzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInByZSIpO3MuaW5uZXJIVE1MPXkudmFsdWU7eS52YWx1ZT1rKHEsYyhzKSx4KX15LnZhbHVlPWkoeS52YWx1ZSx3LHIpO3ZhciB1PXQuY2xhc3NOYW1lO2lmKCF1Lm1hdGNoKCIoXFxzfF4pKGxhbmd1YWdlLSk/Iit2KyIoXFxzfCQpIikpe3U9dT8odSsiICIrdik6dn1pZigvTVNJRSBbNjc4XS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmdC50YWdOYW1lPT0iQ09ERSImJnQucGFyZW50Tm9kZS50YWdOYW1lPT0iUFJFIil7cz10LnBhcmVudE5vZGU7dmFyIHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cC5pbm5lckhUTUw9IjxwcmU+PGNvZGU+Iit5LnZhbHVlKyI8L2NvZGU+PC9wcmU+Ijt0PXAuZmlyc3RDaGlsZC5maXJzdENoaWxkO3AuZmlyc3RDaGlsZC5jTj1zLmNOO3MucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQocC5maXJzdENoaWxkLHMpfWVsc2V7dC5pbm5lckhUTUw9eS52YWx1ZX10LmNsYXNzTmFtZT11O3QucmVzdWx0PXtsYW5ndWFnZTp2LGt3Onkua2V5d29yZF9jb3VudCxyZTp5LnJ9O2lmKHkuc2Vjb25kX2Jlc3Qpe3Quc2Vjb25kX2Jlc3Q9e2xhbmd1YWdlOnkuc2Vjb25kX2Jlc3QubGFuZ3VhZ2Usa3c6eS5zZWNvbmRfYmVzdC5rZXl3b3JkX2NvdW50LHJlOnkuc2Vjb25kX2Jlc3Qucn19fWZ1bmN0aW9uIG8oKXtpZihvLmNhbGxlZCl7cmV0dXJufW8uY2FsbGVkPXRydWU7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByZSIpO2Zvcih2YXIgcD0wO3A8ci5sZW5ndGg7cCsrKXt2YXIgcT1iKHJbcF0pO2lmKHEpe24ocSxobGpzLnRhYlJlcGxhY2UpfX19ZnVuY3Rpb24gbCgpe2lmKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsbyxmYWxzZSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLG8sZmFsc2UpfWVsc2V7aWYod2luZG93LmF0dGFjaEV2ZW50KXt3aW5kb3cuYXR0YWNoRXZlbnQoIm9ubG9hZCIsbyl9ZWxzZXt3aW5kb3cub25sb2FkPW99fX12YXIgZT17fTt0aGlzLkxBTkdVQUdFUz1lO3RoaXMuaGlnaGxpZ2h0PWQ7dGhpcy5oaWdobGlnaHRBdXRvPWc7dGhpcy5maXhNYXJrdXA9aTt0aGlzLmhpZ2hsaWdodEJsb2NrPW47dGhpcy5pbml0SGlnaGxpZ2h0aW5nPW87dGhpcy5pbml0SGlnaGxpZ2h0aW5nT25Mb2FkPWw7dGhpcy5JUj0iW2EtekEtWl1bYS16QS1aMC05X10qIjt0aGlzLlVJUj0iW2EtekEtWl9dW2EtekEtWjAtOV9dKiI7dGhpcy5OUj0iXFxiXFxkKyhcXC5cXGQrKT8iO3RoaXMuQ05SPSJcXGIoMFt4WF1bYS1mQS1GMC05XSt8KFxcZCsoXFwuXFxkKik/fFxcLlxcZCspKFtlRV1bLStdP1xcZCspPykiO3RoaXMuQk5SPSJcXGIoMGJbMDFdKykiO3RoaXMuUlNSPSIhfCE9fCE9PXwlfCU9fCZ8JiZ8Jj18XFwqfFxcKj18XFwrfFxcKz18LHxcXC58LXwtPXwvfC89fDp8O3w8fDw8fDw8PXw8PXw9fD09fD09PXw+fD49fD4+fD4+PXw+Pj58Pj4+PXxcXD98XFxbfFxce3xcXCh8XFxefFxcXj18XFx8fFxcfD18XFx8XFx8fH4iO3RoaXMuRVI9Iig/IVtcXHNcXFNdKSI7dGhpcy5CRT17YjoiXFxcXC4iLHI6MH07dGhpcy5BU009e2NOOiJzdHJpbmciLGI6IiciLGU6IiciLGk6IlxcbiIsYzpbdGhpcy5CRV0scjowfTt0aGlzLlFTTT17Y046InN0cmluZyIsYjonIicsZTonIicsaToiXFxuIixjOlt0aGlzLkJFXSxyOjB9O3RoaXMuQ0xDTT17Y046ImNvbW1lbnQiLGI6Ii8vIixlOiIkIn07dGhpcy5DQkxDTE09e2NOOiJjb21tZW50IixiOiIvXFwqIixlOiJcXCovIn07dGhpcy5IQ009e2NOOiJjb21tZW50IixiOiIjIixlOiIkIn07dGhpcy5OTT17Y046Im51bWJlciIsYjp0aGlzLk5SLHI6MH07dGhpcy5DTk09e2NOOiJudW1iZXIiLGI6dGhpcy5DTlIscjowfTt0aGlzLkJOTT17Y046Im51bWJlciIsYjp0aGlzLkJOUixyOjB9O3RoaXMuaW5oZXJpdD1mdW5jdGlvbihyLHMpe3ZhciBwPXt9O2Zvcih2YXIgcSBpbiByKXtwW3FdPXJbcV19aWYocyl7Zm9yKHZhciBxIGluIHMpe3BbcV09c1txXX19cmV0dXJuIHB9fSgpO2hsanMuTEFOR1VBR0VTLmJhc2g9ZnVuY3Rpb24oKXt2YXIgZT17InRydWUiOjEsImZhbHNlIjoxfTt2YXIgYj17Y046InZhcmlhYmxlIixiOiJcXCQoW2EtekEtWjAtOV9dKylcXGIifTt2YXIgYT17Y046InZhcmlhYmxlIixiOiJcXCRcXHsoKFtefV0pfChcXFxcfSkpK1xcfSIsYzpbaGxqcy5DTk1dfTt2YXIgZj17Y046InN0cmluZyIsYjonIicsZTonIicsaToiXFxuIixjOltobGpzLkJFLGIsYV0scjowfTt2YXIgYz17Y046InN0cmluZyIsYjoiJyIsZToiJyIsYzpbe2I6IicnIn1dLHI6MH07dmFyIGQ9e2NOOiJ0ZXN0X2NvbmRpdGlvbiIsYjoiIixlOiIiLGM6W2YsYyxiLGEsaGxqcy5DTk1dLGs6e2xpdGVyYWw6ZX0scjowfTtyZXR1cm57ZE06e2s6e2tleXdvcmQ6eyJpZiI6MSx0aGVuOjEsImVsc2UiOjEsZmk6MSwiZm9yIjoxLCJicmVhayI6MSwiY29udGludWUiOjEsIndoaWxlIjoxLCJpbiI6MSwiZG8iOjEsZG9uZToxLGVjaG86MSxleGl0OjEsInJldHVybiI6MSxzZXQ6MSxkZWNsYXJlOjF9LGxpdGVyYWw6ZX0sYzpbe2NOOiJzaGViYW5nIixiOiIoIyFcXC9iaW5cXC9iYXNoKXwoIyFcXC9iaW5cXC9zaCkiLHI6MTB9LGIsYSxobGpzLkhDTSxobGpzLkNOTSxmLGMsaGxqcy5pbmhlcml0KGQse2I6IlxcWyAiLGU6IiBcXF0iLHI6MH0pLGhsanMuaW5oZXJpdChkLHtiOiJcXFtcXFsgIixlOiIgXFxdXFxdIn0pXX19fSgpO2hsanMuTEFOR1VBR0VTLmNwcD1mdW5jdGlvbigpe3ZhciBhPXtrZXl3b3JkOnsiZmFsc2UiOjEsImludCI6MSwiZmxvYXQiOjEsIndoaWxlIjoxLCJwcml2YXRlIjoxLCJjaGFyIjoxLCJjYXRjaCI6MSwiZXhwb3J0IjoxLHZpcnR1YWw6MSxvcGVyYXRvcjoyLHNpemVvZjoyLGR5bmFtaWNfY2FzdDoyLHR5cGVkZWY6Mixjb25zdF9jYXN0OjIsImNvbnN0IjoxLHN0cnVjdDoxLCJmb3IiOjEsc3RhdGljX2Nhc3Q6Mix1bmlvbjoxLG5hbWVzcGFjZToxLHVuc2lnbmVkOjEsImxvbmciOjEsInRocm93IjoxLCJ2b2xhdGlsZSI6Miwic3RhdGljIjoxLCJwcm90ZWN0ZWQiOjEsYm9vbDoxLHRlbXBsYXRlOjEsbXV0YWJsZToxLCJpZiI6MSwicHVibGljIjoxLGZyaWVuZDoyLCJkbyI6MSwicmV0dXJuIjoxLCJnb3RvIjoxLGF1dG86MSwidm9pZCI6MiwiZW51bSI6MSwiZWxzZSI6MSwiYnJlYWsiOjEsIm5ldyI6MSxleHRlcm46MSx1c2luZzoxLCJ0cnVlIjoxLCJjbGFzcyI6MSxhc206MSwiY2FzZSI6MSx0eXBlaWQ6MSwic2hvcnQiOjEscmVpbnRlcnByZXRfY2FzdDoyLCJkZWZhdWx0IjoxLCJkb3VibGUiOjEscmVnaXN0ZXI6MSxleHBsaWNpdDoxLHNpZ25lZDoxLHR5cGVuYW1lOjEsInRyeSI6MSwidGhpcyI6MSwic3dpdGNoIjoxLCJjb250aW51ZSI6MSx3Y2hhcl90OjEsaW5saW5lOjEsImRlbGV0ZSI6MSxhbGlnbm9mOjEsY2hhcjE2X3Q6MSxjaGFyMzJfdDoxLGNvbnN0ZXhwcjoxLGRlY2x0eXBlOjEsbm9leGNlcHQ6MSxudWxscHRyOjEsc3RhdGljX2Fzc2VydDoxLHRocmVhZF9sb2NhbDoxLHJlc3RyaWN0OjEsX0Jvb2w6MSxjb21wbGV4OjF9LGJ1aWx0X2luOntzdGQ6MSxzdHJpbmc6MSxjaW46MSxjb3V0OjEsY2VycjoxLGNsb2c6MSxzdHJpbmdzdHJlYW06MSxpc3RyaW5nc3RyZWFtOjEsb3N0cmluZ3N0cmVhbToxLGF1dG9fcHRyOjEsZGVxdWU6MSxsaXN0OjEscXVldWU6MSxzdGFjazoxLHZlY3RvcjoxLG1hcDoxLHNldDoxLGJpdHNldDoxLG11bHRpc2V0OjEsbXVsdGltYXA6MSx1bm9yZGVyZWRfc2V0OjEsdW5vcmRlcmVkX21hcDoxLHVub3JkZXJlZF9tdWx0aXNldDoxLHVub3JkZXJlZF9tdWx0aW1hcDoxLGFycmF5OjEsc2hhcmVkX3B0cjoxfX07cmV0dXJue2RNOntrOmEsaToiPC8iLGM6W2hsanMuQ0xDTSxobGpzLkNCTENMTSxobGpzLlFTTSx7Y046InN0cmluZyIsYjoiJ1xcXFw/LiIsZToiJyIsaToiLiJ9LHtjTjoibnVtYmVyIixiOiJcXGIoXFxkKyhcXC5cXGQqKT98XFwuXFxkKykodXxVfGx8THx1bHxVTHxmfEYpIn0saGxqcy5DTk0se2NOOiJwcmVwcm9jZXNzb3IiLGI6IiMiLGU6IiQifSx7Y046InN0bF9jb250YWluZXIiLGI6IlxcYihkZXF1ZXxsaXN0fHF1ZXVlfHN0YWNrfHZlY3RvcnxtYXB8c2V0fGJpdHNldHxtdWx0aXNldHxtdWx0aW1hcHx1bm9yZGVyZWRfbWFwfHVub3JkZXJlZF9zZXR8dW5vcmRlcmVkX211bHRpc2V0fHVub3JkZXJlZF9tdWx0aW1hcHxhcnJheSlcXHMqPCIsZToiPiIsazphLHI6MTAsYzpbInNlbGYiXX1dfX19KCk7aGxqcy5MQU5HVUFHRVMuY3NzPWZ1bmN0aW9uKCl7dmFyIGE9e2NOOiJmdW5jdGlvbiIsYjpobGpzLklSKyJcXCgiLGU6IlxcKSIsYzpbe2VXOnRydWUsZUU6dHJ1ZSxjOltobGpzLk5NLGhsanMuQVNNLGhsanMuUVNNXX1dfTtyZXR1cm57Y0k6dHJ1ZSxkTTp7aToiWz0vfCddIixjOltobGpzLkNCTENMTSx7Y046ImlkIixiOiJcXCNbQS1aYS16MC05Xy1dKyJ9LHtjTjoiY2xhc3MiLGI6IlxcLltBLVphLXowLTlfLV0rIixyOjB9LHtjTjoiYXR0cl9zZWxlY3RvciIsYjoiXFxbIixlOiJcXF0iLGk6IiQifSx7Y046InBzZXVkbyIsYjoiOig6KT9bYS16QS1aMC05XFxfXFwtXFwrXFwoXFwpXFxcIlxcJ10rIn0se2NOOiJhdF9ydWxlIixiOiJAKGZvbnQtZmFjZXxwYWdlKSIsbDoiW2Etei1dKyIsazp7ImZvbnQtZmFjZSI6MSxwYWdlOjF9fSx7Y046ImF0X3J1bGUiLGI6IkAiLGU6Ilt7O10iLGVFOnRydWUsazp7ImltcG9ydCI6MSxwYWdlOjEsbWVkaWE6MSxjaGFyc2V0OjF9LGM6W2EsaGxqcy5BU00saGxqcy5RU00saGxqcy5OTV19LHtjTjoidGFnIixiOmhsanMuSVIscjowfSx7Y046InJ1bGVzIixiOiJ7IixlOiJ9IixpOiJbXlxcc10iLHI6MCxjOltobGpzLkNCTENMTSx7Y046InJ1bGUiLGI6IlteXFxzXSIsckI6dHJ1ZSxlOiI7IixlVzp0cnVlLGM6W3tjTjoiYXR0cmlidXRlIixiOiJbQS1aXFxfXFwuXFwtXSsiLGU6IjoiLGVFOnRydWUsaToiW15cXHNdIixzdGFydHM6e2NOOiJ2YWx1ZSIsZVc6dHJ1ZSxlRTp0cnVlLGM6W2EsaGxqcy5OTSxobGpzLlFTTSxobGpzLkFTTSxobGpzLkNCTENMTSx7Y046ImhleGNvbG9yIixiOiJcXCNbMC05QS1GXSsifSx7Y046ImltcG9ydGFudCIsYjoiIWltcG9ydGFudCJ9XX19XX1dfV19fX0oKTtobGpzLkxBTkdVQUdFUy5pbmk9e2NJOnRydWUsZE06e2k6IlteXFxzXSIsYzpbe2NOOiJjb21tZW50IixiOiI7IixlOiIkIn0se2NOOiJ0aXRsZSIsYjoiXlxcWyIsZToiXFxdIn0se2NOOiJzZXR0aW5nIixiOiJeW2EtejAtOV9cXFtcXF1dK1sgXFx0XSo9WyBcXHRdKiIsZToiJCIsYzpbe2NOOiJ2YWx1ZSIsZVc6dHJ1ZSxrOntvbjoxLG9mZjoxLCJ0cnVlIjoxLCJmYWxzZSI6MSx5ZXM6MSxubzoxfSxjOltobGpzLlFTTSxobGpzLk5NXX1dfV19fTtobGpzLkxBTkdVQUdFUy5wZXJsPWZ1bmN0aW9uKCl7dmFyIGQ9e2dldHB3ZW50OjEsZ2V0c2VydmVudDoxLHF1b3RlbWV0YToxLG1zZ3JjdjoxLHNjYWxhcjoxLGtpbGw6MSxkYm1jbG9zZToxLHVuZGVmOjEsbGM6MSxtYToxLHN5c3dyaXRlOjEsdHI6MSxzZW5kOjEsdW1hc2s6MSxzeXNvcGVuOjEsc2htd3JpdGU6MSx2ZWM6MSxxeDoxLHV0aW1lOjEsbG9jYWw6MSxvY3Q6MSxzZW1jdGw6MSxsb2NhbHRpbWU6MSxyZWFkcGlwZToxLCJkbyI6MSwicmV0dXJuIjoxLGZvcm1hdDoxLHJlYWQ6MSxzcHJpbnRmOjEsZGJtb3BlbjoxLHBvcDoxLGdldHBncnA6MSxub3Q6MSxnZXRwd25hbToxLHJld2luZGRpcjoxLHFxOjEsZmlsZW5vOjEscXc6MSxlbmRwcm90b2VudDoxLHdhaXQ6MSxzZXRob3N0ZW50OjEsYmxlc3M6MSxzOjAsb3BlbmRpcjoxLCJjb250aW51ZSI6MSxlYWNoOjEsc2xlZXA6MSxlbmRncmVudDoxLHNodXRkb3duOjEsZHVtcDoxLGNob21wOjEsY29ubmVjdDoxLGdldHNvY2tuYW1lOjEsZGllOjEsc29ja2V0cGFpcjoxLGNsb3NlOjEsZmxvY2s6MSxleGlzdHM6MSxpbmRleDoxLHNobWdldDoxLHN1YjoxLCJmb3IiOjEsZW5kcHdlbnQ6MSxyZWRvOjEsbHN0YXQ6MSxtc2djdGw6MSxzZXRwZ3JwOjEsYWJzOjEsZXhpdDoxLHNlbGVjdDoxLHByaW50OjEscmVmOjEsZ2V0aG9zdGJ5YWRkcjoxLHVuc2hpZnQ6MSxmY250bDoxLHN5c2NhbGw6MSwiZ290byI6MSxnZXRuZXRieWFkZHI6MSxqb2luOjEsZ210aW1lOjEsc3ltbGluazoxLHNlbWdldDoxLHNwbGljZToxLHg6MCxnZXRwZWVybmFtZToxLHJlY3Y6MSxsb2c6MSxzZXRzb2Nrb3B0OjEsY29zOjEsbGFzdDoxLHJldmVyc2U6MSxnZXRob3N0YnluYW1lOjEsZ2V0Z3JuYW06MSxzdHVkeToxLGZvcm1saW5lOjEsZW5kaG9zdGVudDoxLHRpbWVzOjEsY2hvcDoxLGxlbmd0aDoxLGdldGhvc3RlbnQ6MSxnZXRuZXRlbnQ6MSxwYWNrOjEsZ2V0cHJvdG9lbnQ6MSxnZXRzZXJ2YnluYW1lOjEscmFuZDoxLG1rZGlyOjEscG9zOjEsY2htb2Q6MSx5OjAsc3Vic3RyOjEsZW5kbmV0ZW50OjEscHJpbnRmOjEsbmV4dDoxLG9wZW46MSxtc2dzbmQ6MSxyZWFkZGlyOjEsdXNlOjEsdW5saW5rOjEsZ2V0c29ja29wdDoxLGdldHByaW9yaXR5OjEscmluZGV4OjEsd2FudGFycmF5OjEsaGV4OjEsc3lzdGVtOjEsZ2V0c2VydmJ5cG9ydDoxLGVuZHNlcnZlbnQ6MSwiaW50IjoxLGNocjoxLHVudGllOjEscm1kaXI6MSxwcm90b3R5cGU6MSx0ZWxsOjEsbGlzdGVuOjEsZm9yazoxLHNobXJlYWQ6MSx1Y2ZpcnN0OjEsc2V0cHJvdG9lbnQ6MSwiZWxzZSI6MSxzeXNzZWVrOjEsbGluazoxLGdldGdyZ2lkOjEsc2htY3RsOjEsd2FpdHBpZDoxLHVucGFjazoxLGdldG5ldGJ5bmFtZToxLHJlc2V0OjEsY2hkaXI6MSxncmVwOjEsc3BsaXQ6MSxyZXF1aXJlOjEsY2FsbGVyOjEsbGNmaXJzdDoxLHVudGlsOjEsd2FybjoxLCJ3aGlsZSI6MSx2YWx1ZXM6MSxzaGlmdDoxLHRlbGxkaXI6MSxnZXRwd3VpZDoxLG15OjEsZ2V0cHJvdG9ieW51bWJlcjoxLCJkZWxldGUiOjEsYW5kOjEsc29ydDoxLHVjOjEsZGVmaW5lZDoxLHNyYW5kOjEsYWNjZXB0OjEsInBhY2thZ2UiOjEsc2Vla2RpcjoxLGdldHByb3RvYnluYW1lOjEsc2Vtb3A6MSxvdXI6MSxyZW5hbWU6MSxzZWVrOjEsImlmIjoxLHE6MCxjaHJvb3Q6MSxzeXNyZWFkOjEsc2V0cHdlbnQ6MSxubzoxLGNyeXB0OjEsZ2V0YzoxLGNob3duOjEsc3FydDoxLHdyaXRlOjEsc2V0bmV0ZW50OjEsc2V0cHJpb3JpdHk6MSxmb3JlYWNoOjEsdGllOjEsc2luOjEsbXNnZ2V0OjEsbWFwOjEsc3RhdDoxLGdldGxvZ2luOjEsdW5sZXNzOjEsZWxzaWY6MSx0cnVuY2F0ZToxLGV4ZWM6MSxrZXlzOjEsZ2xvYjoxLHRpZWQ6MSxjbG9zZWRpcjoxLGlvY3RsOjEsc29ja2V0OjEscmVhZGxpbms6MSwiZXZhbCI6MSx4b3I6MSxyZWFkbGluZToxLGJpbm1vZGU6MSxzZXRzZXJ2ZW50OjEsZW9mOjEsb3JkOjEsYmluZDoxLGFsYXJtOjEscGlwZToxLGF0YW4yOjEsZ2V0Z3JlbnQ6MSxleHA6MSx0aW1lOjEscHVzaDoxLHNldGdyZW50OjEsZ3Q6MSxsdDoxLG9yOjEsbmU6MSxtOjB9O3ZhciBmPXtjTjoic3Vic3QiLGI6IlskQF1cXHsiLGU6IlxcfSIsazpkLHI6MTB9O3ZhciBjPXtjTjoidmFyaWFibGUiLGI6IlxcJFxcZCJ9O3ZhciBiPXtjTjoidmFyaWFibGUiLGI6IltcXCRcXCVcXEBcXCpdKFxcXlxcd1xcYnwjXFx3KyhcXDpcXDpcXHcrKSp8W15cXHNcXHd7XXx7XFx3K318XFx3KyhcXDpcXDpcXHcqKSopIn07dmFyIGg9W2hsanMuQkUsZixjLGJdO3ZhciBnPXtiOiItPiIsYzpbe2I6aGxqcy5JUn0se2I6InsiLGU6In0ifV19O3ZhciBlPXtjTjoiY29tbWVudCIsYjoiXihfX0VORF9ffF9fREFUQV9fKSIsZToiXFxuJCIscjo1fTt2YXIgYT1bYyxiLGhsanMuSENNLGUsZyx7Y046InN0cmluZyIsYjoicVtxd3hyXT9cXHMqXFwoIixlOiJcXCkiLGM6aCxyOjV9LHtjTjoic3RyaW5nIixiOiJxW3F3eHJdP1xccypcXFsiLGU6IlxcXSIsYzpoLHI6NX0se2NOOiJzdHJpbmciLGI6InFbcXd4cl0/XFxzKlxceyIsZToiXFx9IixjOmgscjo1fSx7Y046InN0cmluZyIsYjoicVtxd3hyXT9cXHMqXFx8IixlOiJcXHwiLGM6aCxyOjV9LHtjTjoic3RyaW5nIixiOiJxW3F3eHJdP1xccypcXDwiLGU6IlxcPiIsYzpoLHI6NX0se2NOOiJzdHJpbmciLGI6InF3XFxzK3EiLGU6InEiLGM6aCxyOjV9LHtjTjoic3RyaW5nIixiOiInIixlOiInIixjOltobGpzLkJFXSxyOjB9LHtjTjoic3RyaW5nIixiOiciJyxlOiciJyxjOmgscjowfSx7Y046InN0cmluZyIsYjoiYCIsZToiYCIsYzpbaGxqcy5CRV19LHtjTjoic3RyaW5nIixiOiJ7XFx3K30iLHI6MH0se2NOOiJzdHJpbmciLGI6Ii0/XFx3K1xccypcXD1cXD4iLHI6MH0se2NOOiJudW1iZXIiLGI6IihcXGIwWzAtN19dKyl8KFxcYjB4WzAtOWEtZkEtRl9dKyl8KFxcYlsxLTldWzAtOV9dKihcXC5bMC05X10rKT8pfFswX11cXGIiLHI6MH0se2I6IigiK2hsanMuUlNSKyJ8XFxiKHNwbGl0fHJldHVybnxwcmludHxyZXZlcnNlfGdyZXApXFxiKVxccyoiLGs6e3NwbGl0OjEsInJldHVybiI6MSxwcmludDoxLHJldmVyc2U6MSxncmVwOjF9LHI6MCxjOltobGpzLkhDTSxlLHtjTjoicmVnZXhwIixiOiIoc3x0cnx5KS8oXFxcXC58W14vXSkqLyhcXFxcLnxbXi9dKSovW2Etel0qIixyOjEwfSx7Y046InJlZ2V4cCIsYjoiKG18cXIpPy8iLGU6Ii9bYS16XSoiLGM6W2hsanMuQkVdLHI6MH1dfSx7Y046InN1YiIsYjoiXFxic3ViXFxiIixlOiIoXFxzKlxcKC4qP1xcKSk/Wzt7XSIsazp7c3ViOjF9LHI6NX0se2NOOiJvcGVyYXRvciIsYjoiLVxcd1xcYiIscjowfSx7Y046InBvZCIsYjoiXFw9XFx3IixlOiJcXD1jdXQifV07Zi5jPWE7Zy5jWzFdLmM9YTtyZXR1cm57ZE06e2s6ZCxjOmF9fX0oKTtobGpzLkxBTkdVQUdFUy5weXRob249ZnVuY3Rpb24oKXt2YXIgYj1be2NOOiJzdHJpbmciLGI6Iih1fGIpP3I/JycnIixlOiInJyciLHI6MTB9LHtjTjoic3RyaW5nIixiOicodXxiKT9yPyIiIicsZTonIiIiJyxyOjEwfSx7Y046InN0cmluZyIsYjoiKHV8cnx1ciknIixlOiInIixjOltobGpzLkJFXSxyOjEwfSx7Y046InN0cmluZyIsYjonKHV8cnx1cikiJyxlOiciJyxjOltobGpzLkJFXSxyOjEwfSx7Y046InN0cmluZyIsYjoiKGJ8YnIpJyIsZToiJyIsYzpbaGxqcy5CRV19LHtjTjoic3RyaW5nIixiOicoYnxicikiJyxlOiciJyxjOltobGpzLkJFXX1dLmNvbmNhdChbaGxqcy5BU00saGxqcy5RU01dKTt2YXIgZD17Y046InRpdGxlIixiOmhsanMuVUlSfTt2YXIgYz17Y046InBhcmFtcyIsYjoiXFwoIixlOiJcXCkiLGM6Yi5jb25jYXQoW2hsanMuQ05NXSl9O3ZhciBhPXtiV0s6dHJ1ZSxlOiI6IixpOiJbJHtdIixjOltkLGNdLHI6MTB9O3JldHVybntkTTp7azp7a2V5d29yZDp7YW5kOjEsZWxpZjoxLGlzOjEsZ2xvYmFsOjEsYXM6MSwiaW4iOjEsImlmIjoxLGZyb206MSxyYWlzZToxLCJmb3IiOjEsZXhjZXB0OjEsImZpbmFsbHkiOjEscHJpbnQ6MSwiaW1wb3J0IjoxLHBhc3M6MSwicmV0dXJuIjoxLGV4ZWM6MSwiZWxzZSI6MSwiYnJlYWsiOjEsbm90OjEsIndpdGgiOjEsImNsYXNzIjoxLGFzc2VydDoxLHlpZWxkOjEsInRyeSI6MSwid2hpbGUiOjEsImNvbnRpbnVlIjoxLGRlbDoxLG9yOjEsZGVmOjEsbGFtYmRhOjEsbm9ubG9jYWw6MTB9LGJ1aWx0X2luOntOb25lOjEsVHJ1ZToxLEZhbHNlOjEsRWxsaXBzaXM6MSxOb3RJbXBsZW1lbnRlZDoxfX0saToiKDwvfC0+fFxcPykiLGM6Yi5jb25jYXQoW2hsanMuSENNLGhsanMuaW5oZXJpdChhLHtjTjoiZnVuY3Rpb24iLGs6e2RlZjoxfX0pLGhsanMuaW5oZXJpdChhLHtjTjoiY2xhc3MiLGs6eyJjbGFzcyI6MX19KSxobGpzLkNOTSx7Y046ImRlY29yYXRvciIsYjoiQCIsZToiJCJ9XSl9fX0oKTtobGpzLkxBTkdVQUdFUy5yPXtkTTp7YzpbaGxqcy5IQ00se2NOOiJudW1iZXIiLGI6IlxcYjBbeFhdWzAtOWEtZkEtRl0rW0xpXT9cXGIiLGU6aGxqcy5JTU1FRElBVEVfUkUscjowfSx7Y046Im51bWJlciIsYjoiXFxiXFxkKyg/OltlRV1bK1xcLV0/XFxkKik/TFxcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjB9LHtjTjoibnVtYmVyIixiOiJcXGJcXGQrXFwuKD8hXFxkKSg/OmlcXGIpPyIsZTpobGpzLklNTUVESUFURV9SRSxyOjF9LHtjTjoibnVtYmVyIixiOiJcXGJcXGQrKD86XFwuXFxkKik/KD86W2VFXVsrXFwtXT9cXGQqKT9pP1xcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjB9LHtjTjoibnVtYmVyIixiOiJcXC5cXGQrKD86W2VFXVsrXFwtXT9cXGQqKT9pP1xcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjF9LHtjTjoia2V5d29yZCIsYjoiKD86dHJ5Q2F0Y2h8bGlicmFyeXxzZXRHZW5lcmljfHNldEdyb3VwR2VuZXJpYylcXGIiLGU6aGxqcy5JTU1FRElBVEVfUkUscjoxMH0se2NOOiJrZXl3b3JkIixiOiJcXC5cXC5cXC4iLGU6aGxqcy5JTU1FRElBVEVfUkUscjoxMH0se2NOOiJrZXl3b3JkIixiOiJcXC5cXC5cXGQrKD8hW1xcdy5dKSIsZTpobGpzLklNTUVESUFURV9SRSxyOjEwfSx7Y046ImtleXdvcmQiLGI6IlxcYig/OmZ1bmN0aW9uKSIsZTpobGpzLklNTUVESUFURV9SRSxyOjJ9LHtjTjoia2V5d29yZCIsYjoiKD86aWZ8aW58YnJlYWt8bmV4dHxyZXBlYXR8ZWxzZXxmb3J8cmV0dXJufHN3aXRjaHx3aGlsZXx0cnl8c3RvcHx3YXJuaW5nfHJlcXVpcmV8YXR0YWNofGRldGFjaHxzb3VyY2V8c2V0TWV0aG9kfHNldENsYXNzKVxcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjF9LHtjTjoibGl0ZXJhbCIsYjoiKD86TkF8TkFfaW50ZWdlcl98TkFfcmVhbF98TkFfY2hhcmFjdGVyX3xOQV9jb21wbGV4XylcXGIiLGU6aGxqcy5JTU1FRElBVEVfUkUscjoxMH0se2NOOiJsaXRlcmFsIixiOiIoPzpOVUxMfFRSVUV8RkFMU0V8VHxGfEluZnxOYU4pXFxiIixlOmhsanMuSU1NRURJQVRFX1JFLHI6MX0se2NOOiJpZGVudGlmaWVyIixiOiJbYS16QS1aLl1bYS16QS1aMC05Ll9dKlxcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjB9LHtjTjoib3BlcmF0b3IiLGI6IjxcXC0oPyFcXHMqXFxkKSIsZTpobGpzLklNTUVESUFURV9SRSxyOjJ9LHtjTjoib3BlcmF0b3IiLGI6IlxcLT58PFxcLSIsZTpobGpzLklNTUVESUFURV9SRSxyOjF9LHtjTjoib3BlcmF0b3IiLGI6IiUlfH4iLGU6aGxqcy5JTU1FRElBVEVfUkV9LHtjTjoib3BlcmF0b3IiLGI6Ij49fDw9fD09fCE9fFxcfFxcfHwmJnw9fFxcK3xcXC18XFwqfC98XFxefD58PHwhfCZ8XFx8fFxcJHw6IixlOmhsanMuSU1NRURJQVRFX1JFLHI6MH0se2NOOiJvcGVyYXRvciIsYjoiJSIsZToiJSIsaToiXFxuIixyOjF9LHtjTjoiaWRlbnRpZmllciIsYjoiYCIsZToiYCIscjowfSx7Y046InN0cmluZyIsYjonIicsZTonIicsYzpbaGxqcy5CRV0scjowfSx7Y046InN0cmluZyIsYjoiJyIsZToiJyIsYzpbaGxqcy5CRV0scjowfSx7Y046InBhcmVuIixiOiJbWyh7XFxdKX1dIixlOmhsanMuSU1NRURJQVRFX1JFLHI6MH1dfX07aGxqcy5MQU5HVUFHRVMucnVieT1mdW5jdGlvbigpe3ZhciBhPSJbYS16QS1aX11bYS16QS1aMC05X10qKFxcIXxcXD8pPyI7dmFyIGo9IlthLXpBLVpfXVxcdypbIT89XT98Wy0rfl1cXEB8PDx8Pj58PX58PT09P3w8PT58Wzw+XT0/fFxcKlxcKnxbLS8rJV4mKn5gfF18XFxbXFxdPT8iO3ZhciBmPXtrZXl3b3JkOnthbmQ6MSwiZmFsc2UiOjEsdGhlbjoxLGRlZmluZWQ6MSxtb2R1bGU6MSwiaW4iOjEsInJldHVybiI6MSxyZWRvOjEsImlmIjoxLEJFR0lOOjEscmV0cnk6MSxlbmQ6MSwiZm9yIjoxLCJ0cnVlIjoxLHNlbGY6MSx3aGVuOjEsbmV4dDoxLHVudGlsOjEsImRvIjoxLGJlZ2luOjEsdW5sZXNzOjEsRU5EOjEscmVzY3VlOjEsbmlsOjEsImVsc2UiOjEsImJyZWFrIjoxLHVuZGVmOjEsbm90OjEsInN1cGVyIjoxLCJjbGFzcyI6MSwiY2FzZSI6MSxyZXF1aXJlOjEseWllbGQ6MSxhbGlhczoxLCJ3aGlsZSI6MSxlbnN1cmU6MSxlbHNpZjoxLG9yOjEsZGVmOjF9LGtleW1ldGhvZHM6e19faWRfXzoxLF9fc2VuZF9fOjEsYWJvcnQ6MSxhYnM6MSwiYWxsPyI6MSxhbGxvY2F0ZToxLGFuY2VzdG9yczoxLCJhbnk/IjoxLGFyaXR5OjEsYXNzb2M6MSxhdDoxLGF0X2V4aXQ6MSxhdXRvbG9hZDoxLCJhdXRvbG9hZD8iOjEsImJldHdlZW4/IjoxLGJpbmRpbmc6MSxiaW5tb2RlOjEsImJsb2NrX2dpdmVuPyI6MSxjYWxsOjEsY2FsbGNjOjEsY2FsbGVyOjEsY2FwaXRhbGl6ZToxLCJjYXBpdGFsaXplISI6MSxjYXNlY21wOjEsImNhdGNoIjoxLGNlaWw6MSxjZW50ZXI6MSxjaG9tcDoxLCJjaG9tcCEiOjEsY2hvcDoxLCJjaG9wISI6MSxjaHI6MSwiY2xhc3MiOjEsY2xhc3NfZXZhbDoxLCJjbGFzc192YXJpYWJsZV9kZWZpbmVkPyI6MSxjbGFzc192YXJpYWJsZXM6MSxjbGVhcjoxLGNsb25lOjEsY2xvc2U6MSxjbG9zZV9yZWFkOjEsY2xvc2Vfd3JpdGU6MSwiY2xvc2VkPyI6MSxjb2VyY2U6MSxjb2xsZWN0OjEsImNvbGxlY3QhIjoxLGNvbXBhY3Q6MSwiY29tcGFjdCEiOjEsY29uY2F0OjEsImNvbnN0X2RlZmluZWQ/IjoxLGNvbnN0X2dldDoxLGNvbnN0X21pc3Npbmc6MSxjb25zdF9zZXQ6MSxjb25zdGFudHM6MSxjb3VudDoxLGNyeXB0OjEsImRlZmF1bHQiOjEsZGVmYXVsdF9wcm9jOjEsImRlbGV0ZSI6MSwiZGVsZXRlISI6MSxkZWxldGVfYXQ6MSxkZWxldGVfaWY6MSxkZXRlY3Q6MSxkaXNwbGF5OjEsZGl2OjEsZGl2bW9kOjEsZG93bmNhc2U6MSwiZG93bmNhc2UhIjoxLGRvd250bzoxLGR1bXA6MSxkdXA6MSxlYWNoOjEsZWFjaF9ieXRlOjEsZWFjaF9pbmRleDoxLGVhY2hfa2V5OjEsZWFjaF9saW5lOjEsZWFjaF9wYWlyOjEsZWFjaF92YWx1ZToxLGVhY2hfd2l0aF9pbmRleDoxLCJlbXB0eT8iOjEsZW50cmllczoxLGVvZjoxLCJlb2Y/IjoxLCJlcWw/IjoxLCJlcXVhbD8iOjEsImV2YWwiOjEsZXhlYzoxLGV4aXQ6MSwiZXhpdCEiOjEsZXh0ZW5kOjEsZmFpbDoxLGZjbnRsOjEsZmV0Y2g6MSxmaWxlbm86MSxmaWxsOjEsZmluZDoxLGZpbmRfYWxsOjEsZmlyc3Q6MSxmbGF0dGVuOjEsImZsYXR0ZW4hIjoxLGZsb29yOjEsZmx1c2g6MSxmb3JfZmQ6MSxmb3JlYWNoOjEsZm9yazoxLGZvcm1hdDoxLGZyZWV6ZToxLCJmcm96ZW4/IjoxLGZzeW5jOjEsZ2V0YzoxLGdldHM6MSxnbG9iYWxfdmFyaWFibGVzOjEsZ3JlcDoxLGdzdWI6MSwiZ3N1YiEiOjEsImhhc19rZXk/IjoxLCJoYXNfdmFsdWU/IjoxLGhhc2g6MSxoZXg6MSxpZDoxLGluY2x1ZGU6MSwiaW5jbHVkZT8iOjEsaW5jbHVkZWRfbW9kdWxlczoxLGluZGV4OjEsaW5kZXhlczoxLGluZGljZXM6MSxpbmR1Y2VkX2Zyb206MSxpbmplY3Q6MSxpbnNlcnQ6MSxpbnNwZWN0OjEsaW5zdGFuY2VfZXZhbDoxLGluc3RhbmNlX21ldGhvZDoxLGluc3RhbmNlX21ldGhvZHM6MSwiaW5zdGFuY2Vfb2Y/IjoxLCJpbnN0YW5jZV92YXJpYWJsZV9kZWZpbmVkPyI6MSxpbnN0YW5jZV92YXJpYWJsZV9nZXQ6MSxpbnN0YW5jZV92YXJpYWJsZV9zZXQ6MSxpbnN0YW5jZV92YXJpYWJsZXM6MSwiaW50ZWdlcj8iOjEsaW50ZXJuOjEsaW52ZXJ0OjEsaW9jdGw6MSwiaXNfYT8iOjEsaXNhdHR5OjEsIml0ZXJhdG9yPyI6MSxqb2luOjEsImtleT8iOjEsa2V5czoxLCJraW5kX29mPyI6MSxsYW1iZGE6MSxsYXN0OjEsbGVuZ3RoOjEsbGluZW5vOjEsbGp1c3Q6MSxsb2FkOjEsbG9jYWxfdmFyaWFibGVzOjEsbG9vcDoxLGxzdHJpcDoxLCJsc3RyaXAhIjoxLG1hcDoxLCJtYXAhIjoxLG1hdGNoOjEsbWF4OjEsIm1lbWJlcj8iOjEsbWVyZ2U6MSwibWVyZ2UhIjoxLG1ldGhvZDoxLCJtZXRob2RfZGVmaW5lZD8iOjEsbWV0aG9kX21pc3Npbmc6MSxtZXRob2RzOjEsbWluOjEsbW9kdWxlX2V2YWw6MSxtb2R1bG86MSxuYW1lOjEsbmVzdGluZzoxLCJuZXciOjEsbmV4dDoxLCJuZXh0ISI6MSwibmlsPyI6MSxuaXRlbXM6MSwibm9uemVybz8iOjEsb2JqZWN0X2lkOjEsb2N0OjEsb3BlbjoxLHBhY2s6MSxwYXJ0aXRpb246MSxwaWQ6MSxwaXBlOjEscG9wOjEscG9wZW46MSxwb3M6MSxwcmVjOjEscHJlY19mOjEscHJlY19pOjEscHJpbnQ6MSxwcmludGY6MSxwcml2YXRlX2NsYXNzX21ldGhvZDoxLHByaXZhdGVfaW5zdGFuY2VfbWV0aG9kczoxLCJwcml2YXRlX21ldGhvZF9kZWZpbmVkPyI6MSxwcml2YXRlX21ldGhvZHM6MSxwcm9jOjEscHJvdGVjdGVkX2luc3RhbmNlX21ldGhvZHM6MSwicHJvdGVjdGVkX21ldGhvZF9kZWZpbmVkPyI6MSxwcm90ZWN0ZWRfbWV0aG9kczoxLHB1YmxpY19jbGFzc19tZXRob2Q6MSxwdWJsaWNfaW5zdGFuY2VfbWV0aG9kczoxLCJwdWJsaWNfbWV0aG9kX2RlZmluZWQ/IjoxLHB1YmxpY19tZXRob2RzOjEscHVzaDoxLHB1dGM6MSxwdXRzOjEscXVvOjEscmFpc2U6MSxyYW5kOjEscmFzc29jOjEscmVhZDoxLHJlYWRfbm9uYmxvY2s6MSxyZWFkY2hhcjoxLHJlYWRsaW5lOjEscmVhZGxpbmVzOjEscmVhZHBhcnRpYWw6MSxyZWhhc2g6MSxyZWplY3Q6MSwicmVqZWN0ISI6MSxyZW1haW5kZXI6MSxyZW9wZW46MSxyZXBsYWNlOjEscmVxdWlyZToxLCJyZXNwb25kX3RvPyI6MSxyZXZlcnNlOjEsInJldmVyc2UhIjoxLHJldmVyc2VfZWFjaDoxLHJld2luZDoxLHJpbmRleDoxLHJqdXN0OjEscm91bmQ6MSxyc3RyaXA6MSwicnN0cmlwISI6MSxzY2FuOjEsc2VlazoxLHNlbGVjdDoxLHNlbmQ6MSxzZXRfdHJhY2VfZnVuYzoxLHNoaWZ0OjEsc2luZ2xldG9uX21ldGhvZF9hZGRlZDoxLHNpbmdsZXRvbl9tZXRob2RzOjEsc2l6ZToxLHNsZWVwOjEsc2xpY2U6MSwic2xpY2UhIjoxLHNvcnQ6MSwic29ydCEiOjEsc29ydF9ieToxLHNwbGl0OjEsc3ByaW50ZjoxLHNxdWVlemU6MSwic3F1ZWV6ZSEiOjEsc3JhbmQ6MSxzdGF0OjEsc3RlcDoxLHN0b3JlOjEsc3RyaXA6MSwic3RyaXAhIjoxLHN1YjoxLCJzdWIhIjoxLHN1Y2M6MSwic3VjYyEiOjEsc3VtOjEsc3VwZXJjbGFzczoxLHN3YXBjYXNlOjEsInN3YXBjYXNlISI6MSxzeW5jOjEsc3lzY2FsbDoxLHN5c29wZW46MSxzeXNyZWFkOjEsc3lzc2VlazoxLHN5c3RlbToxLHN5c3dyaXRlOjEsdGFpbnQ6MSwidGFpbnRlZD8iOjEsdGVsbDoxLHRlc3Q6MSwidGhyb3ciOjEsdGltZXM6MSx0b19hOjEsdG9fYXJ5OjEsdG9fZjoxLHRvX2hhc2g6MSx0b19pOjEsdG9faW50OjEsdG9faW86MSx0b19wcm9jOjEsdG9fczoxLHRvX3N0cjoxLHRvX3N5bToxLHRyOjEsInRyISI6MSx0cl9zOjEsInRyX3MhIjoxLHRyYWNlX3ZhcjoxLHRyYW5zcG9zZToxLHRyYXA6MSx0cnVuY2F0ZToxLCJ0dHk/IjoxLHR5cGU6MSx1bmdldGM6MSx1bmlxOjEsInVuaXEhIjoxLHVucGFjazoxLHVuc2hpZnQ6MSx1bnRhaW50OjEsdW50cmFjZV92YXI6MSx1cGNhc2U6MSwidXBjYXNlISI6MSx1cGRhdGU6MSx1cHRvOjEsInZhbHVlPyI6MSx2YWx1ZXM6MSx2YWx1ZXNfYXQ6MSx3YXJuOjEsd3JpdGU6MSx3cml0ZV9ub25ibG9jazoxLCJ6ZXJvPyI6MSx6aXA6MX19O3ZhciBjPXtjTjoieWFyZG9jdGFnIixiOiJAW0EtWmEtel0rIn07dmFyIGs9W3tjTjoiY29tbWVudCIsYjoiIyIsZToiJCIsYzpbY119LHtjTjoiY29tbWVudCIsYjoiXlxcPWJlZ2luIixlOiJeXFw9ZW5kIixjOltjXSxyOjEwfSx7Y046ImNvbW1lbnQiLGI6Il5fX0VORF9fIixlOiJcXG4kIn1dO3ZhciBkPXtjTjoic3Vic3QiLGI6IiNcXHsiLGU6In0iLGw6YSxrOmZ9O3ZhciBpPVtobGpzLkJFLGRdO3ZhciBiPVt7Y046InN0cmluZyIsYjoiJyIsZToiJyIsYzppLHI6MH0se2NOOiJzdHJpbmciLGI6JyInLGU6JyInLGM6aSxyOjB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT9cXCgiLGU6IlxcKSIsYzppLHI6MTB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT9cXFsiLGU6IlxcXSIsYzppLHI6MTB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT97IixlOiJ9IixjOmkscjoxMH0se2NOOiJzdHJpbmciLGI6IiVbcXddPzwiLGU6Ij4iLGM6aSxyOjEwfSx7Y046InN0cmluZyIsYjoiJVtxd10/LyIsZToiLyIsYzppLHI6MTB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT8lIixlOiIlIixjOmkscjoxMH0se2NOOiJzdHJpbmciLGI6IiVbcXddPy0iLGU6Ii0iLGM6aSxyOjEwfSx7Y046InN0cmluZyIsYjoiJVtxd10/XFx8IixlOiJcXHwiLGM6aSxyOjEwfV07dmFyIGg9e2NOOiJmdW5jdGlvbiIsYjoiXFxiZGVmXFxzKyIsZToiIHwkfDsiLGw6YSxrOmYsYzpbe2NOOiJ0aXRsZSIsYjpqLGw6YSxrOmZ9LHtjTjoicGFyYW1zIixiOiJcXCgiLGU6IlxcKSIsbDphLGs6Zn1dLmNvbmNhdChrKX07dmFyIGc9e2NOOiJpZGVudGlmaWVyIixiOmEsbDphLGs6ZixyOjB9O3ZhciBlPWsuY29uY2F0KGIuY29uY2F0KFt7Y046ImNsYXNzIixiOiJcXGIoY2xhc3N8bW9kdWxlKVxcYiIsZToiJHw7IixrOnsiY2xhc3MiOjEsbW9kdWxlOjF9LGM6W3tjTjoidGl0bGUiLGI6IltBLVphLXpfXVxcdyooOjpcXHcrKSooXFw/fFxcISk/IixyOjB9LHtjTjoiaW5oZXJpdGFuY2UiLGI6IjxcXHMqIixjOlt7Y046InBhcmVudCIsYjoiKCIraGxqcy5JUisiOjopPyIraGxqcy5JUn1dfV0uY29uY2F0KGspfSxoLHtjTjoiY29uc3RhbnQiLGI6Iig6Oik/KFtBLVpdXFx3Kig6Oik/KSsiLHI6MH0se2NOOiJzeW1ib2wiLGI6IjoiLGM6Yi5jb25jYXQoW2ddKSxyOjB9LHtjTjoibnVtYmVyIixiOiIoXFxiMFswLTdfXSspfChcXGIweFswLTlhLWZBLUZfXSspfChcXGJbMS05XVswLTlfXSooXFwuWzAtOV9dKyk/KXxbMF9dXFxiIixyOjB9LHtjTjoibnVtYmVyIixiOiJcXD9cXHcifSx7Y046InZhcmlhYmxlIixiOiIoXFwkXFxXKXwoKFxcJHxcXEBcXEA/KShcXHcrKSkifSxnLHtiOiIoIitobGpzLlJTUisiKVxccyoiLGM6ay5jb25jYXQoW3tjTjoicmVnZXhwIixiOiIvIixlOiIvW2Etel0qIixpOiJcXG4iLGM6W2hsanMuQkVdfV0pLHI6MH1dKSk7ZC5jPWU7aC5jWzFdLmM9ZTtyZXR1cm57ZE06e2w6YSxrOmYsYzplfX19KCk7aGxqcy5MQU5HVUFHRVMuc2NhbGE9ZnVuY3Rpb24oKXt2YXIgYj17Y046ImFubm90YXRpb24iLGI6IkBbQS1aYS16XSsifTt2YXIgYT17Y046InN0cmluZyIsYjondT9yPyIiIicsZTonIiIiJyxyOjEwfTtyZXR1cm57ZE06e2s6e3R5cGU6MSx5aWVsZDoxLGxhenk6MSxvdmVycmlkZToxLGRlZjoxLCJ3aXRoIjoxLHZhbDoxLCJ2YXIiOjEsImZhbHNlIjoxLCJ0cnVlIjoxLHNlYWxlZDoxLCJhYnN0cmFjdCI6MSwicHJpdmF0ZSI6MSx0cmFpdDoxLG9iamVjdDoxLCJudWxsIjoxLCJpZiI6MSwiZm9yIjoxLCJ3aGlsZSI6MSwidGhyb3ciOjEsImZpbmFsbHkiOjEsInByb3RlY3RlZCI6MSwiZXh0ZW5kcyI6MSwiaW1wb3J0IjoxLCJmaW5hbCI6MSwicmV0dXJuIjoxLCJlbHNlIjoxLCJicmVhayI6MSwibmV3IjoxLCJjYXRjaCI6MSwic3VwZXIiOjEsImNsYXNzIjoxLCJjYXNlIjoxLCJwYWNrYWdlIjoxLCJkZWZhdWx0IjoxLCJ0cnkiOjEsInRoaXMiOjEsbWF0Y2g6MSwiY29udGludWUiOjEsInRocm93cyI6MX0sYzpbe2NOOiJqYXZhZG9jIixiOiIvXFwqXFwqIixlOiJcXCovIixjOlt7Y046ImphdmFkb2N0YWciLGI6IkBbQS1aYS16XSsifV0scjoxMH0saGxqcy5DTENNLGhsanMuQ0JMQ0xNLGhsanMuQVNNLGhsanMuUVNNLGEse2NOOiJjbGFzcyIsYjoiKChjYXNlICk/Y2xhc3MgfG9iamVjdCB8dHJhaXQgKSIsZToiKHt8JCkiLGk6IjoiLGs6eyJjYXNlIjoxLCJjbGFzcyI6MSx0cmFpdDoxLG9iamVjdDoxfSxjOlt7YldLOnRydWUsazp7ImV4dGVuZHMiOjEsIndpdGgiOjF9LHI6MTB9LHtjTjoidGl0bGUiLGI6aGxqcy5VSVJ9LHtjTjoicGFyYW1zIixiOiJcXCgiLGU6IlxcKSIsYzpbaGxqcy5BU00saGxqcy5RU00sYSxiXX1dfSxobGpzLkNOTSxiXX19fSgpO2hsanMuTEFOR1VBR0VTLnNxbD17Y0k6dHJ1ZSxkTTp7aToiW15cXHNdIixjOlt7Y046Im9wZXJhdG9yIixiOiIoYmVnaW58c3RhcnR8Y29tbWl0fHJvbGxiYWNrfHNhdmVwb2ludHxsb2NrfGFsdGVyfGNyZWF0ZXxkcm9wfHJlbmFtZXxjYWxsfGRlbGV0ZXxkb3xoYW5kbGVyfGluc2VydHxsb2FkfHJlcGxhY2V8c2VsZWN0fHRydW5jYXRlfHVwZGF0ZXxzZXR8c2hvd3xwcmFnbWF8Z3JhbnQpXFxiIixlOiI7fCIraGxqcy5FUixrOntrZXl3b3JkOnthbGw6MSxwYXJ0aWFsOjEsZ2xvYmFsOjEsbW9udGg6MSxjdXJyZW50X3RpbWVzdGFtcDoxLHVzaW5nOjEsZ286MSxyZXZva2U6MSxzbWFsbGludDoxLGluZGljYXRvcjoxLCJlbmQtZXhlYyI6MSxkaXNjb25uZWN0OjEsem9uZToxLCJ3aXRoIjoxLGNoYXJhY3RlcjoxLGFzc2VydGlvbjoxLHRvOjEsYWRkOjEsY3VycmVudF91c2VyOjEsdXNhZ2U6MSxpbnB1dDoxLGxvY2FsOjEsYWx0ZXI6MSxtYXRjaDoxLGNvbGxhdGU6MSxyZWFsOjEsdGhlbjoxLHJvbGxiYWNrOjEsZ2V0OjEscmVhZDoxLHRpbWVzdGFtcDoxLHNlc3Npb25fdXNlcjoxLG5vdDoxLGludGVnZXI6MSxiaXQ6MSx1bmlxdWU6MSxkYXk6MSxtaW51dGU6MSxkZXNjOjEsaW5zZXJ0OjEsZXhlY3V0ZToxLGxpa2U6MSxpbGlrZToyLGxldmVsOjEsZGVjaW1hbDoxLGRyb3A6MSwiY29udGludWUiOjEsaXNvbGF0aW9uOjEsZm91bmQ6MSx3aGVyZToxLGNvbnN0cmFpbnRzOjEsZG9tYWluOjEscmlnaHQ6MSxuYXRpb25hbDoxLHNvbWU6MSxtb2R1bGU6MSx0cmFuc2FjdGlvbjoxLHJlbGF0aXZlOjEsc2Vjb25kOjEsY29ubmVjdDoxLGVzY2FwZToxLGNsb3NlOjEsc3lzdGVtX3VzZXI6MSwiZm9yIjoxLGRlZmVycmVkOjEsc2VjdGlvbjoxLGNhc3Q6MSxjdXJyZW50OjEsc3Fsc3RhdGU6MSxhbGxvY2F0ZToxLGludGVyc2VjdDoxLGRlYWxsb2NhdGU6MSxudW1lcmljOjEsInB1YmxpYyI6MSxwcmVzZXJ2ZToxLGZ1bGw6MSwiZ290byI6MSxpbml0aWFsbHk6MSxhc2M6MSxubzoxLGtleToxLG91dHB1dDoxLGNvbGxhdGlvbjoxLGdyb3VwOjEsYnk6MSx1bmlvbjoxLHNlc3Npb246MSxib3RoOjEsbGFzdDoxLGxhbmd1YWdlOjEsY29uc3RyYWludDoxLGNvbHVtbjoxLG9mOjEsc3BhY2U6MSxmb3JlaWduOjEsZGVmZXJyYWJsZToxLHByaW9yOjEsY29ubmVjdGlvbjoxLHVua25vd246MSxhY3Rpb246MSxjb21taXQ6MSx2aWV3OjEsb3I6MSxmaXJzdDoxLGludG86MSwiZmxvYXQiOjEseWVhcjoxLHByaW1hcnk6MSxjYXNjYWRlZDoxLGV4Y2VwdDoxLHJlc3RyaWN0OjEsc2V0OjEscmVmZXJlbmNlczoxLG5hbWVzOjEsdGFibGU6MSxvdXRlcjoxLG9wZW46MSxzZWxlY3Q6MSxzaXplOjEsYXJlOjEscm93czoxLGZyb206MSxwcmVwYXJlOjEsZGlzdGluY3Q6MSxsZWFkaW5nOjEsY3JlYXRlOjEsb25seToxLG5leHQ6MSxpbm5lcjoxLGF1dGhvcml6YXRpb246MSxzY2hlbWE6MSxjb3JyZXNwb25kaW5nOjEsb3B0aW9uOjEsZGVjbGFyZToxLHByZWNpc2lvbjoxLGltbWVkaWF0ZToxLCJlbHNlIjoxLHRpbWV6b25lX21pbnV0ZToxLGV4dGVybmFsOjEsdmFyeWluZzoxLHRyYW5zbGF0aW9uOjEsInRydWUiOjEsImNhc2UiOjEsZXhjZXB0aW9uOjEsam9pbjoxLGhvdXI6MSwiZGVmYXVsdCI6MSwiZG91YmxlIjoxLHNjcm9sbDoxLHZhbHVlOjEsY3Vyc29yOjEsZGVzY3JpcHRvcjoxLHZhbHVlczoxLGRlYzoxLGZldGNoOjEscHJvY2VkdXJlOjEsImRlbGV0ZSI6MSxhbmQ6MSwiZmFsc2UiOjEsImludCI6MSxpczoxLGRlc2NyaWJlOjEsImNoYXIiOjEsYXM6MSxhdDoxLCJpbiI6MSx2YXJjaGFyOjEsIm51bGwiOjEsdHJhaWxpbmc6MSxhbnk6MSxhYnNvbHV0ZToxLGN1cnJlbnRfdGltZToxLGVuZDoxLGdyYW50OjEscHJpdmlsZWdlczoxLHdoZW46MSxjcm9zczoxLGNoZWNrOjEsd3JpdGU6MSxjdXJyZW50X2RhdGU6MSxwYWQ6MSxiZWdpbjoxLHRlbXBvcmFyeToxLGV4ZWM6MSx0aW1lOjEsdXBkYXRlOjEsY2F0YWxvZzoxLHVzZXI6MSxzcWw6MSxkYXRlOjEsb246MSxpZGVudGl0eToxLHRpbWV6b25lX2hvdXI6MSxuYXR1cmFsOjEsd2hlbmV2ZXI6MSxpbnRlcnZhbDoxLHdvcms6MSxvcmRlcjoxLGNhc2NhZGU6MSxkaWFnbm9zdGljczoxLG5jaGFyOjEsaGF2aW5nOjEsbGVmdDoxLGNhbGw6MSwiZG8iOjEsaGFuZGxlcjoxLGxvYWQ6MSxyZXBsYWNlOjEsdHJ1bmNhdGU6MSxzdGFydDoxLGxvY2s6MSxzaG93OjEscHJhZ21hOjF9LGFnZ3JlZ2F0ZTp7Y291bnQ6MSxzdW06MSxtaW46MSxtYXg6MSxhdmc6MX19LGM6W3tjTjoic3RyaW5nIixiOiInIixlOiInIixjOltobGpzLkJFLHtiOiInJyJ9XSxyOjB9LHtjTjoic3RyaW5nIixiOiciJyxlOiciJyxjOltobGpzLkJFLHtiOiciIid9XSxyOjB9LHtjTjoic3RyaW5nIixiOiJgIixlOiJgIixjOltobGpzLkJFXX0saGxqcy5DTk1dfSxobGpzLkNCTENMTSx7Y046ImNvbW1lbnQiLGI6Ii0tIixlOiIkIn1dfX07aGxqcy5MQU5HVUFHRVMuc3Rhbj17ZE06e2M6W2hsanMuSENNLGhsanMuQ0xDTSxobGpzLlFTTSxobGpzLkNOTSx7Y046Im9wZXJhdG9yIixiOiIoPzo8LXx+fFxcfFxcfHwmJnw9PXwhPXw8PT98Pj0/fFxcK3wtfFxcLj8vfFxcXFx8XFxefFxcXnwhfCd8JXw6fCx8O3w9KVxcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjEwfSx7Y046InBhcmVuIixiOiJbWyh7XFxdKX1dIixlOmhsanMuSU1NRURJQVRFX1JFLHI6MH0se2NOOiJmdW5jdGlvbiIsYjoiKD86UGhpfFBoaV9hcHByb3h8YWJzfGFjb3N8YWNvc2h8YXBwZW5kX2NvbHxhcHBlbmRfcm93fGFzaW58YXNpbmh8YXRhbnxhdGFuMnxhdGFuaHxiZXJub3VsbGlfY2NkZl9sb2d8YmVybm91bGxpX2NkZnxiZXJub3VsbGlfY2RmX2xvZ3xiZXJub3VsbGlfbG9nfGJlcm5vdWxsaV9sb2dpdF9sb2d8YmVybm91bGxpX3JuZ3xiZXNzZWxfZmlyc3Rfa2luZHxiZXNzZWxfc2Vjb25kX2tpbmR8YmV0YV9iaW5vbWlhbF9jY2RmX2xvZ3xiZXRhX2Jpbm9taWFsX2NkZnxiZXRhX2Jpbm9taWFsX2NkZl9sb2d8YmV0YV9iaW5vbWlhbF9sb2d8YmV0YV9iaW5vbWlhbF9ybmd8YmV0YV9jY2RmX2xvZ3xiZXRhX2NkZnxiZXRhX2NkZl9sb2d8YmV0YV9sb2d8YmV0YV9ybmd8YmluYXJ5X2xvZ19sb3NzfGJpbm9taWFsX2NjZGZfbG9nfGJpbm9taWFsX2NkZnxiaW5vbWlhbF9jZGZfbG9nfGJpbm9taWFsX2NvZWZmaWNpZW50X2xvZ3xiaW5vbWlhbF9sb2d8Ymlub21pYWxfbG9naXRfbG9nfGJpbm9taWFsX3JuZ3xibG9ja3xjYXRlZ29yaWNhbF9sb2d8Y2F0ZWdvcmljYWxfbG9naXRfbG9nfGNhdGVnb3JpY2FsX3JuZ3xjYXVjaHlfY2NkZl9sb2d8Y2F1Y2h5X2NkZnxjYXVjaHlfY2RmX2xvZ3xjYXVjaHlfbG9nfGNhdWNoeV9ybmd8Y2JydHxjZWlsfGNoaV9zcXVhcmVfY2NkZl9sb2d8Y2hpX3NxdWFyZV9jZGZ8Y2hpX3NxdWFyZV9jZGZfbG9nfGNoaV9zcXVhcmVfbG9nfGNoaV9zcXVhcmVfcm5nfGNob2xlc2t5X2RlY29tcG9zZXxjb2x8Y29sc3xjb2x1bW5zX2RvdF9wcm9kdWN0fGNvbHVtbnNfZG90X3NlbGZ8Y29zfGNvc2h8Y3Jvc3Nwcm9kfGNzcl9leHRyYWN0X3V8Y3NyX2V4dHJhY3Rfdnxjc3JfZXh0cmFjdF93fGNzcl9tYXRyaXhfdGltZXNfdmVjdG9yfGNzcl90b19kZW5zZV9tYXRyaXh8Y3VtdWxhdGl2ZV9zdW18ZGV0ZXJtaW5hbnR8ZGlhZ19tYXRyaXh8ZGlhZ19wb3N0X211bHRpcGx5fGRpYWdfcHJlX211bHRpcGx5fGRpYWdvbmFsfGRpZ2FtbWF8ZGltc3xkaXJpY2hsZXRfbG9nfGRpcmljaGxldF9ybmd8ZGlzdGFuY2V8ZG90X3Byb2R1Y3R8ZG90X3NlbGZ8ZG91YmxlX2V4cG9uZW50aWFsX2NjZGZfbG9nfGRvdWJsZV9leHBvbmVudGlhbF9jZGZ8ZG91YmxlX2V4cG9uZW50aWFsX2NkZl9sb2d8ZG91YmxlX2V4cG9uZW50aWFsX2xvZ3xkb3VibGVfZXhwb25lbnRpYWxfcm5nfGV8ZWlnZW52YWx1ZXNfc3ltfGVpZ2VudmVjdG9yc19zeW18ZXJmfGVyZmN8ZXhwfGV4cDJ8ZXhwX21vZF9ub3JtYWxfY2NkZl9sb2d8ZXhwX21vZF9ub3JtYWxfY2RmfGV4cF9tb2Rfbm9ybWFsX2NkZl9sb2d8ZXhwX21vZF9ub3JtYWxfbG9nfGV4cF9tb2Rfbm9ybWFsX3JuZ3xleHBtMXxleHBvbmVudGlhbF9jY2RmX2xvZ3xleHBvbmVudGlhbF9jZGZ8ZXhwb25lbnRpYWxfY2RmX2xvZ3xleHBvbmVudGlhbF9sb2d8ZXhwb25lbnRpYWxfcm5nfGZhYnN8ZmFsbGluZ19mYWN0b3JpYWx8ZmRpbXxmbG9vcnxmbWF8Zm1heHxmbWlufGZtb2R8ZnJlY2hldF9jY2RmX2xvZ3xmcmVjaGV0X2NkZnxmcmVjaGV0X2NkZl9sb2d8ZnJlY2hldF9sb2d8ZnJlY2hldF9ybmd8Z2FtbWFfY2NkZl9sb2d8Z2FtbWFfY2RmfGdhbW1hX2NkZl9sb2d8Z2FtbWFfbG9nfGdhbW1hX3B8Z2FtbWFfcXxnYW1tYV9ybmd8Z2F1c3NpYW5fZGxtX29ic19sb2d8Z2V0X2xwfGd1bWJlbF9jY2RmX2xvZ3xndW1iZWxfY2RmfGd1bWJlbF9jZGZfbG9nfGd1bWJlbF9sb2d8Z3VtYmVsX3JuZ3xoZWFkfGh5cGVyZ2VvbWV0cmljX2xvZ3xoeXBlcmdlb21ldHJpY19ybmd8aHlwb3R8aWZfZWxzZXxpbnRfc3RlcHxpbnZ8aW52X2NoaV9zcXVhcmVfY2NkZl9sb2d8aW52X2NoaV9zcXVhcmVfY2RmfGludl9jaGlfc3F1YXJlX2NkZl9sb2d8aW52X2NoaV9zcXVhcmVfbG9nfGludl9jaGlfc3F1YXJlX3JuZ3xpbnZfY2xvZ2xvZ3xpbnZfZ2FtbWFfY2NkZl9sb2d8aW52X2dhbW1hX2NkZnxpbnZfZ2FtbWFfY2RmX2xvZ3xpbnZfZ2FtbWFfbG9nfGludl9nYW1tYV9ybmd8aW52X2xvZ2l0fGludl9waGl8aW52X3NxcnR8aW52X3NxdWFyZXxpbnZfd2lzaGFydF9sb2d8aW52X3dpc2hhcnRfcm5nfGludmVyc2V8aW52ZXJzZV9zcGR8aXNfaW5mfGlzX25hbnxsYmV0YXxsZ2FtbWF8bGtqX2NvcnJfY2hvbGVza3lfbG9nfGxral9jb3JyX2Nob2xlc2t5X3JuZ3xsa2pfY29ycl9sb2d8bGtqX2NvcnJfcm5nfGxtZ2FtbWF8bG9nfGxvZzEwfGxvZzFtfGxvZzFtX2V4cHxsb2cxbV9pbnZfbG9naXR8bG9nMXB8bG9nMXBfZXhwfGxvZzJ8bG9nX2RldGVybWluYW50fGxvZ19kaWZmX2V4cHxsb2dfZmFsbGluZ19mYWN0b3JpYWx8bG9nX2ludl9sb2dpdHxsb2dfbWl4fGxvZ19yaXNpbmdfZmFjdG9yaWFsfGxvZ19zb2Z0bWF4fGxvZ19zdW1fZXhwfGxvZ2lzdGljX2NjZGZfbG9nfGxvZ2lzdGljX2NkZnxsb2dpc3RpY19jZGZfbG9nfGxvZ2lzdGljX2xvZ3xsb2dpc3RpY19ybmd8bG9naXR8bG9nbm9ybWFsX2NjZGZfbG9nfGxvZ25vcm1hbF9jZGZ8bG9nbm9ybWFsX2NkZl9sb2d8bG9nbm9ybWFsX2xvZ3xsb2dub3JtYWxfcm5nfG1hY2hpbmVfcHJlY2lzaW9ufG1heHxtZGl2aWRlX2xlZnRfdHJpX2xvd3xtZGl2aWRlX3JpZ2h0X3RyaV9sb3d8bWVhbnxtaW58bW9kaWZpZWRfYmVzc2VsX2ZpcnN0X2tpbmR8bW9kaWZpZWRfYmVzc2VsX3NlY29uZF9raW5kfG11bHRpX2dwX2Nob2xlc2t5X2xvZ3xtdWx0aV9ncF9sb2d8bXVsdGlfbm9ybWFsX2Nob2xlc2t5X2xvZ3xtdWx0aV9ub3JtYWxfY2hvbGVza3lfcm5nfG11bHRpX25vcm1hbF9sb2d8bXVsdGlfbm9ybWFsX3ByZWNfbG9nfG11bHRpX25vcm1hbF9ybmd8bXVsdGlfc3R1ZGVudF90X2xvZ3xtdWx0aV9zdHVkZW50X3Rfcm5nfG11bHRpbm9taWFsX2xvZ3xtdWx0aW5vbWlhbF9ybmd8bXVsdGlwbHlfbG9nfG11bHRpcGx5X2xvd2VyX3RyaV9zZWxmX3RyYW5zcG9zZXxuZWdfYmlub21pYWxfMl9jY2RmX2xvZ3xuZWdfYmlub21pYWxfMl9jZGZ8bmVnX2Jpbm9taWFsXzJfY2RmX2xvZ3xuZWdfYmlub21pYWxfMl9sb2d8bmVnX2Jpbm9taWFsXzJfbG9nX2xvZ3xuZWdfYmlub21pYWxfMl9sb2dfcm5nfG5lZ19iaW5vbWlhbF8yX3JuZ3xuZWdfYmlub21pYWxfY2NkZl9sb2d8bmVnX2Jpbm9taWFsX2NkZnxuZWdfYmlub21pYWxfY2RmX2xvZ3xuZWdfYmlub21pYWxfbG9nfG5lZ19iaW5vbWlhbF9ybmd8bmVnYXRpdmVfaW5maW5pdHl8bm9ybWFsX2NjZGZfbG9nfG5vcm1hbF9jZGZ8bm9ybWFsX2NkZl9sb2d8bm9ybWFsX2xvZ3xub3JtYWxfcm5nfG5vdF9hX251bWJlcnxudW1fZWxlbWVudHN8b3JkZXJlZF9sb2dpc3RpY19sb2d8b3JkZXJlZF9sb2dpc3RpY19ybmd8b3dlbnNfdHxwYXJldG9fY2NkZl9sb2d8cGFyZXRvX2NkZnxwYXJldG9fY2RmX2xvZ3xwYXJldG9fbG9nfHBhcmV0b19ybmd8cGFyZXRvX3R5cGVfMl9jY2RmX2xvZ3xwYXJldG9fdHlwZV8yX2NkZnxwYXJldG9fdHlwZV8yX2NkZl9sb2d8cGFyZXRvX3R5cGVfMl9sb2d8cGFyZXRvX3R5cGVfMl9ybmd8cGl8cG9pc3Nvbl9jY2RmX2xvZ3xwb2lzc29uX2NkZnxwb2lzc29uX2NkZl9sb2d8cG9pc3Nvbl9sb2d8cG9pc3Nvbl9sb2dfbG9nfHBvaXNzb25fbG9nX3JuZ3xwb2lzc29uX3JuZ3xwb3NpdGl2ZV9pbmZpbml0eXxwb3d8cHJvZHxxcl9RfHFyX1J8cXVhZF9mb3JtfHF1YWRfZm9ybV9kaWFnfHF1YWRfZm9ybV9zeW18cmFua3xyYXlsZWlnaF9jY2RmX2xvZ3xyYXlsZWlnaF9jZGZ8cmF5bGVpZ2hfY2RmX2xvZ3xyYXlsZWlnaF9sb2d8cmF5bGVpZ2hfcm5nfHJlcF9hcnJheXxyZXBfbWF0cml4fHJlcF9yb3dfdmVjdG9yfHJlcF92ZWN0b3J8cmlzaW5nX2ZhY3RvcmlhbHxyb3VuZHxyb3d8cm93c3xyb3dzX2RvdF9wcm9kdWN0fHJvd3NfZG90X3NlbGZ8c2NhbGVkX2ludl9jaGlfc3F1YXJlX2NjZGZfbG9nfHNjYWxlZF9pbnZfY2hpX3NxdWFyZV9jZGZ8c2NhbGVkX2ludl9jaGlfc3F1YXJlX2NkZl9sb2d8c2NhbGVkX2ludl9jaGlfc3F1YXJlX2xvZ3xzY2FsZWRfaW52X2NoaV9zcXVhcmVfcm5nfHNkfHNlZ21lbnR8c2lufHNpbmd1bGFyX3ZhbHVlc3xzaW5ofHNpemV8c2tld19ub3JtYWxfY2NkZl9sb2d8c2tld19ub3JtYWxfY2RmfHNrZXdfbm9ybWFsX2NkZl9sb2d8c2tld19ub3JtYWxfbG9nfHNrZXdfbm9ybWFsX3JuZ3xzb2Z0bWF4fHNvcnRfYXNjfHNvcnRfZGVzY3xzb3J0X2luZGljZXNfYXNjfHNvcnRfaW5kaWNlc19kZXNjfHNxcnR8c3FydDJ8c3F1YXJlfHNxdWFyZWRfZGlzdGFuY2V8c3RlcHxzdHVkZW50X3RfY2NkZl9sb2d8c3R1ZGVudF90X2NkZnxzdHVkZW50X3RfY2RmX2xvZ3xzdHVkZW50X3RfbG9nfHN0dWRlbnRfdF9ybmd8c3ViX2NvbHxzdWJfcm93fHN1bXx0YWlsfHRhbnx0YW5ofHRjcm9zc3Byb2R8dGdhbW1hfHRvX2FycmF5XzFkfHRvX2FycmF5XzJkfHRvX21hdHJpeHx0b19yb3dfdmVjdG9yfHRvX3ZlY3Rvcnx0cmFjZXx0cmFjZV9nZW5fcXVhZF9mb3JtfHRyYWNlX3F1YWRfZm9ybXx0cmlnYW1tYXx0cnVuY3x1bmlmb3JtX2NjZGZfbG9nfHVuaWZvcm1fY2RmfHVuaWZvcm1fY2RmX2xvZ3x1bmlmb3JtX2xvZ3x1bmlmb3JtX3JuZ3x2YXJpYW5jZXx2b25fbWlzZXNfbG9nfHZvbl9taXNlc19ybmd8d2VpYnVsbF9jY2RmX2xvZ3x3ZWlidWxsX2NkZnx3ZWlidWxsX2NkZl9sb2d8d2VpYnVsbF9sb2d8d2VpYnVsbF9ybmd8d2llbmVyX2xvZ3x3aXNoYXJ0X2xvZ3x3aXNoYXJ0X3JuZylcXGIiLGU6aGxqcy5JTU1FRElBVEVfUkUscjoxMH0se2NOOiJmdW5jdGlvbiIsYjoiKD86YmVybm91bGxpfGJlcm5vdWxsaV9sb2dpdHxiZXRhfGJldGFfYmlub21pYWx8Ymlub21pYWx8Ymlub21pYWxfbG9naXR8Y2F0ZWdvcmljYWx8Y2F0ZWdvcmljYWxfbG9naXR8Y2F1Y2h5fGNoaV9zcXVhcmV8ZGlyaWNobGV0fGRvdWJsZV9leHBvbmVudGlhbHxleHBfbW9kX25vcm1hbHxleHBvbmVudGlhbHxmcmVjaGV0fGdhbW1hfGdhdXNzaWFuX2RsbV9vYnN8Z3VtYmVsfGh5cGVyZ2VvbWV0cmljfGludl9jaGlfc3F1YXJlfGludl9nYW1tYXxpbnZfd2lzaGFydHxsa2pfY29ycnxsa2pfY29ycl9jaG9sZXNreXxsb2dpc3RpY3xsb2dub3JtYWx8bXVsdGlfZ3B8bXVsdGlfZ3BfY2hvbGVza3l8bXVsdGlfbm9ybWFsfG11bHRpX25vcm1hbF9jaG9sZXNreXxtdWx0aV9ub3JtYWxfcHJlY3xtdWx0aV9zdHVkZW50X3R8bXVsdGlub21pYWx8bmVnX2Jpbm9taWFsfG5lZ19iaW5vbWlhbF8yfG5lZ19iaW5vbWlhbF8yX2xvZ3xub3JtYWx8b3JkZXJlZF9sb2dpc3RpY3xwYXJldG98cGFyZXRvX3R5cGVfMnxwb2lzc29ufHBvaXNzb25fbG9nfHJheWxlaWdofHNjYWxlZF9pbnZfY2hpX3NxdWFyZXxza2V3X25vcm1hbHxzdHVkZW50X3R8dW5pZm9ybXx2b25fbWlzZXN8d2VpYnVsbHx3aWVuZXJ8d2lzaGFydClcXGIiLGU6aGxqcy5JTU1FRElBVEVfUkUscjoxMH0se2NOOiJrZXl3b3JkIixiOiIoPzpmb3J8aW58d2hpbGV8aWZ8dGhlbnxlbHNlfHJldHVybnxsb3dlcnx1cHBlcnxwcmludHxpbmNyZW1lbnRfbG9nX3Byb2J8aW50ZWdyYXRlX29kZXxyZWplY3QpXFxiIixlOmhsanMuSU1NRURJQVRFX1JFLHI6MTB9LHtjTjoia2V5d29yZCIsYjoiKD86aW50fHJlYWx8dmVjdG9yfHNpbXBsZXh8dW5pdF92ZWN0b3J8b3JkZXJlZHxwb3NpdGl2ZV9vcmRlcmVkfHJvd192ZWN0b3J8bWF0cml4fGNob2xlc2t5X2ZhY3Rvcl9jb3Z8Y2hvbGVza3lfZmFjdG9yX2NvcnJ8Y29ycl9tYXRyaXh8Y292X21hdHJpeHx2b2lkKVxcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjV9LHtjTjoia2V5d29yZCIsYjoiKD86ZnVuY3Rpb25zfGRhdGF8dHJhbnNmb3JtZWRcXHMrZGF0YXxwYXJhbWV0ZXJzfHRyYW5zZm9ybWVkXFxzK3BhcmFtZXRlcnN8bW9kZWx8Z2VuZXJhdGVkXFxzK3F1YW50aXRpZXMpXFxiIixlOmhsanMuSU1NRURJQVRFX1JFLHI6NX1dfX07aGxqcy5MQU5HVUFHRVMueG1sPWZ1bmN0aW9uKCl7dmFyIGI9IltBLVphLXowLTlcXC5fOi1dKyI7dmFyIGE9e2VXOnRydWUsYzpbe2NOOiJhdHRyaWJ1dGUiLGI6YixyOjB9LHtiOic9IicsckI6dHJ1ZSxlOiciJyxjOlt7Y046InZhbHVlIixiOiciJyxlVzp0cnVlfV19LHtiOiI9JyIsckI6dHJ1ZSxlOiInIixjOlt7Y046InZhbHVlIixiOiInIixlVzp0cnVlfV19LHtiOiI9IixjOlt7Y046InZhbHVlIixiOiJbXlxccy8+XSsifV19XX07cmV0dXJue2NJOnRydWUsZE06e2M6W3tjTjoicGkiLGI6IjxcXD8iLGU6IlxcPz4iLHI6MTB9LHtjTjoiZG9jdHlwZSIsYjoiPCFET0NUWVBFIixlOiI+IixyOjEwLGM6W3tiOiJcXFsiLGU6IlxcXSJ9XX0se2NOOiJjb21tZW50IixiOiI8IS0tIixlOiItLT4iLHI6MTB9LHtjTjoiY2RhdGEiLGI6IjxcXCFcXFtDREFUQVxcWyIsZToiXFxdXFxdPiIscjoxMH0se2NOOiJ0YWciLGI6IjxzdHlsZSg/PVxcc3w+fCQpIixlOiI+IixrOnt0aXRsZTp7c3R5bGU6MX19LGM6W2FdLHN0YXJ0czp7Y046ImNzcyIsZToiPC9zdHlsZT4iLHJFOnRydWUsc0w6ImNzcyJ9fSx7Y046InRhZyIsYjoiPHNjcmlwdCg/PVxcc3w+fCQpIixlOiI+IixrOnt0aXRsZTp7c2NyaXB0OjF9fSxjOlthXSxzdGFydHM6e2NOOiJqYXZhc2NyaXB0IixlOiI8XC9zY3JpcHQ+IixyRTp0cnVlLHNMOiJqYXZhc2NyaXB0In19LHtjTjoidmJzY3JpcHQiLGI6IjwlIixlOiIlPiIsc0w6InZic2NyaXB0In0se2NOOiJ0YWciLGI6IjwvPyIsZToiLz8+IixjOlt7Y046InRpdGxlIixiOiJbXiAvPl0rIn0sYV19XX19fSgpOwpobGpzLmluaXRIaWdobGlnaHRpbmdPbkxvYWQoKTsKCg=="></script> @@ -138,7 +138,7 @@ $(document).ready(function () { </div> <div id="documentation" class="section level2"> <h2>Documentation</h2> -<p>The HTML documentation is available at <a href="http://pkgdown.jrwb.de/mkin">jrwb.de</a>, at <a href="http://jranke.github.io/mkin">github</a> and at <a href="http://kinfit.r-forge.r-project.org/mkin_static/index.html">R-Forge</a>.</p> +<p>The HTML documentation is available at <a href="https://pkgdown.jrwb.de/mkin">jrwb.de</a>, at <a href="http://jranke.github.io/mkin">github</a> and at <a href="http://kinfit.r-forge.r-project.org/mkin_static/index.html">R-Forge</a>.</p> </div> <div id="features" class="section level2"> <h2>Features</h2> diff --git a/_pkgdown.yml b/_pkgdown.yml index 73e2fe02..9eee0667 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -22,7 +22,6 @@ reference: - title: Work with mmkin objects desc: Functions working with aggregated results contents: - - "[.mmkin" - plot.mmkin - title: Datasets and known results contents: @@ -2,4 +2,9 @@ * preparing ‘mkin’: * checking DESCRIPTION meta-information ... OK * installing the package to build vignettes -* creating vignettes ...
\ No newline at end of file +* creating vignettes ... OK +* checking for LF line-endings in source and make files +* checking for empty or unneeded directories +* looking to see if a ‘data/datalist’ file should be added +* building ‘mkin_0.9.45.2.tar.gz’ + @@ -1,14 +1,26 @@ * using log directory ‘/home/jranke/git/mkin/mkin.Rcheck’ -* using R version 3.3.2 (2016-10-31) +* using R version 3.4.0 (2017-04-21) * using platform: x86_64-pc-linux-gnu (64-bit) * using session charset: UTF-8 * using options ‘--no-tests --as-cran’ * checking for file ‘mkin/DESCRIPTION’ ... OK * checking extension type ... Package -* this is package ‘mkin’ version ‘0.9.45’ +* this is package ‘mkin’ version ‘0.9.45.2’ * package encoding: UTF-8 -* checking CRAN incoming feasibility ... Note_to_CRAN_maintainers +* checking CRAN incoming feasibility ... NOTE Maintainer: ‘Johannes Ranke <jranke@uni-bremen.de>’ + +Found the following (possibly) invalid URLs: + URL: http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics + From: man/twa.Rd + Status: 500 + Message: Internal Server Error + URL: http://focus.jrc.ec.europa.eu/dk + From: inst/doc/mkin.html + inst/doc/twa.html + README.md + Status: 404 + Message: Not Found * checking package namespace information ... OK * checking package dependencies ... OK * checking if this is a source package ... OK @@ -18,7 +30,10 @@ Maintainer: ‘Johannes Ranke <jranke@uni-bremen.de>’ * checking for portable file names ... OK * checking for sufficient/correct file permissions ... OK * checking whether package ‘mkin’ can be installed ... OK -* checking installed package size ... OK +* checking installed package size ... NOTE + installed size is 5.4Mb + sub-directories of 1Mb or more: + doc 5.1Mb * checking package directory ... OK * checking ‘build’ directory ... OK * checking DESCRIPTION meta-information ... OK @@ -60,9 +75,4 @@ Maintainer: ‘Johannes Ranke <jranke@uni-bremen.de>’ * checking tests ... SKIPPED * checking for unstated dependencies in vignettes ... OK * checking package vignettes in ‘inst/doc’ ... OK -* checking re-building of vignette outputs ... OK -* checking PDF version of manual ... OK -* DONE - -Status: OK - +* checking re-building of vignette outputs ...
\ No newline at end of file diff --git a/docs/authors.html b/docs/authors.html index 6a5c2862..1bf46325 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -25,7 +25,7 @@ <script src="pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> diff --git a/docs/index.html b/docs/index.html index 0a353ee5..7ac6f226 100644 --- a/docs/index.html +++ b/docs/index.html @@ -9,7 +9,7 @@ <!-- jquery --><script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script><!-- Bootstrap --><link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script><!-- Font Awesome icons --><link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-T8Gy5hrqNKT+hzMclPo118YTQO6cYprQmhrYwIiQ/3axmI1hQomh7Ud2hPOy8SP1" crossorigin="anonymous"> <!-- pkgdown --><link href="pkgdown.css" rel="stylesheet"> -<script src="jquery.sticky-kit.min.js"></script><script src="pkgdown.js"></script><!-- mathjax --><script src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script><!--[if lt IE 9]> +<script src="jquery.sticky-kit.min.js"></script><script src="pkgdown.js"></script><!-- mathjax --><script src="https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script><!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> @@ -167,14 +167,12 @@ <li>Johannes Ranke <br><small class="roles"> Author, maintainer, copyright holder </small> </li> <li><a href="authors.html">All authors...</a></li> </ul> -<div> <h2>Dev status</h2> <ul class="list-unstyled"> <li><a href="https://cran.r-project.org/package=mkin"><img src="https://www.r-pkg.org/badges/version/mkin"></a></li> </ul> </div> </div> -</div> <footer><div class="copyright"> diff --git a/docs/news/index.html b/docs/news/index.html index 2e7f0e34..667c5c1f 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -102,10 +107,10 @@ <div class="contents"> <div id="mkin-0-9-45-1-2016-12-20" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-45-1-2016-12-20" class="anchor"> </a>mkin 0.9.45.1 (2016-12-20)</h1> +<a href="#mkin-0-9-45-1-2016-12-20" class="anchor"></a>mkin 0.9.45.1 (2016-12-20)</h1> <div id="new-features" class="section level2"> <h2 class="hasAnchor"> -<a href="#new-features" class="anchor"> </a>New features</h2> +<a href="#new-features" class="anchor"></a>New features</h2> <ul> <li>A <code>twa</code> function, calculating maximum time weighted average concentrations for the parent (SFO, FOMC and DFOP).</li> </ul> @@ -113,10 +118,10 @@ </div> <div id="mkin-0-9-45-2016-12-08" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-45-2016-12-08" class="anchor"> </a>mkin 0.9.45 (2016-12-08)</h1> +<a href="#mkin-0-9-45-2016-12-08" class="anchor"></a>mkin 0.9.45 (2016-12-08)</h1> <div id="minor-changes" class="section level2"> <h2 class="hasAnchor"> -<a href="#minor-changes" class="anchor"> </a>Minor changes</h2> +<a href="#minor-changes" class="anchor"></a>Minor changes</h2> <ul> <li><p><code>plot.mkinfit</code> and <code>plot.mmkin</code>: If the plotting device is <code>tikz</code>, LaTeX markup is being used for the chi2 error in the graphs.</p></li> <li><p>Use <code>pkgdown</code>, the successor of <code>staticdocs</code> for generating static HTML documentation. Include example output and graphs also for <code>dontrun</code> sections.</p></li> @@ -126,10 +131,10 @@ </div> <div id="mkin-0-9-44-2016-06-29" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-44-2016-06-29" class="anchor"> </a>mkin 0.9.44 (2016-06-29)</h1> +<a href="#mkin-0-9-44-2016-06-29" class="anchor"></a>mkin 0.9.44 (2016-06-29)</h1> <div id="bug-fixes" class="section level2"> <h2 class="hasAnchor"> -<a href="#bug-fixes" class="anchor"> </a>Bug fixes</h2> +<a href="#bug-fixes" class="anchor"></a>Bug fixes</h2> <ul> <li>The test <code>test_FOMC_ill-defined</code> failed on several architectures, so the test is now skipped</li> </ul> @@ -137,10 +142,10 @@ </div> <div id="mkin-0-9-43-2016-06-28" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-43-2016-06-28" class="anchor"> </a>mkin 0.9.43 (2016-06-28)</h1> +<a href="#mkin-0-9-43-2016-06-28" class="anchor"></a>mkin 0.9.43 (2016-06-28)</h1> <div id="major-changes" class="section level2"> <h2 class="hasAnchor"> -<a href="#major-changes" class="anchor"> </a>Major changes</h2> +<a href="#major-changes" class="anchor"></a>Major changes</h2> <ul> <li><p>The title was changed to <code>Kinetic evaluations of chemical degradation data</code></p></li> <li><p><code>plot.mkinfit</code>: Add the possibility to show fits (and residual plots if requested) separately for the observed variables</p></li> @@ -152,7 +157,7 @@ </div> <div id="minor-changes-1" class="section level2"> <h2 class="hasAnchor"> -<a href="#minor-changes-1" class="anchor"> </a>Minor changes</h2> +<a href="#minor-changes-1" class="anchor"></a>Minor changes</h2> <ul> <li><p>Remove an outdated reference to the inline package in the <code>compiled_models</code> vignette</p></li> <li><p><code>mkinfit</code>: Do not error out in cases where the fit converges, but the Jacobian for the untransformed model cost can not be estimated. Give a warning instead and return NA for the t-test results.</p></li> @@ -164,7 +169,7 @@ </div> <div id="bug-fixes-1" class="section level2"> <h2 class="hasAnchor"> -<a href="#bug-fixes-1" class="anchor"> </a>Bug fixes</h2> +<a href="#bug-fixes-1" class="anchor"></a>Bug fixes</h2> <ul> <li><p><code>endpoints</code>: When the name of a substance degrading to a metabolite (e.g. a parent compound) used in the model formulation ended in the letter <code>f</code>, some rate parameters could be listed as formation fractions with mixed up names. These would also appear in the summary.</p></li> <li><p><code>mkinfit</code>: Check for all observed variables when checking if the user tried to fix formation fractions when fitting them using ilr transformation.</p></li> @@ -175,17 +180,17 @@ </div> <div id="mkin-0-9-42-2016-03-25" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-42-2016-03-25" class="anchor"> </a>mkin 0.9.42 (2016-03-25)</h1> +<a href="#mkin-0-9-42-2016-03-25" class="anchor"></a>mkin 0.9.42 (2016-03-25)</h1> <div id="major-changes-1" class="section level2"> <h2 class="hasAnchor"> -<a href="#major-changes-1" class="anchor"> </a>Major changes</h2> +<a href="#major-changes-1" class="anchor"></a>Major changes</h2> <ul> <li>Add the argument <code>from_max_mean</code> to <code>mkinfit</code>, for fitting only the decline from the maximum observed value for models with a single observed variable</li> </ul> </div> <div id="minor-changes-2" class="section level2"> <h2 class="hasAnchor"> -<a href="#minor-changes-2" class="anchor"> </a>Minor changes</h2> +<a href="#minor-changes-2" class="anchor"></a>Minor changes</h2> <ul> <li><p>Add plots to <code>compiled_models</code> vignette</p></li> <li><p>Give an explanatory error message when mkinmod fails due to a missing definition of a target variable</p></li> @@ -195,10 +200,10 @@ </div> <div id="mkin-0-9-41-2015-11-09" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-41-2015-11-09" class="anchor"> </a>mkin 0.9-41 (2015-11-09)</h1> +<a href="#mkin-0-9-41-2015-11-09" class="anchor"></a>mkin 0.9-41 (2015-11-09)</h1> <div id="minor-changes-3" class="section level2"> <h2 class="hasAnchor"> -<a href="#minor-changes-3" class="anchor"> </a>Minor changes</h2> +<a href="#minor-changes-3" class="anchor"></a>Minor changes</h2> <ul> <li><p>Add an R6 class <code>mkinds</code> representing datasets with a printing method</p></li> <li><p>Add a printing method for mkinmod objects</p></li> @@ -208,7 +213,7 @@ </div> <div id="bug-fixes-2" class="section level2"> <h2 class="hasAnchor"> -<a href="#bug-fixes-2" class="anchor"> </a>Bug fixes</h2> +<a href="#bug-fixes-2" class="anchor"></a>Bug fixes</h2> <ul> <li> <code><a href="../reference/summary.mkinfit.html">print.summary.mkinfit()</a></code>: Avoid an error that occurred when printing summaries generated with mkin versions before 0.9-36</li> @@ -217,10 +222,10 @@ </div> <div id="mkin-0-9-40-2015-07-21" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-40-2015-07-21" class="anchor"> </a>mkin 0.9-40 (2015-07-21)</h1> +<a href="#mkin-0-9-40-2015-07-21" class="anchor"></a>mkin 0.9-40 (2015-07-21)</h1> <div id="bug-fixes-3" class="section level2"> <h2 class="hasAnchor"> -<a href="#bug-fixes-3" class="anchor"> </a>Bug fixes</h2> +<a href="#bug-fixes-3" class="anchor"></a>Bug fixes</h2> <ul> <li> <code><a href="../reference/endpoints.html">endpoints()</a></code>: For DFOP and SFORB models, where <code>optimize()</code> is used, make use of the fact that the DT50 must be between DT50_k1 and DT50_k2 (DFOP) or DT50_b1 and DT50_b2 (SFORB), as <code>optimize()</code> sometimes did not find the minimum. Likewise for finding DT90 values. Also fit on the log scale to make the function more efficient.</li> @@ -228,7 +233,7 @@ </div> <div id="internal-changes" class="section level2"> <h2 class="hasAnchor"> -<a href="#internal-changes" class="anchor"> </a>Internal changes</h2> +<a href="#internal-changes" class="anchor"></a>Internal changes</h2> <ul> <li> <code>DESCRIPTION</code>, <code>NAMESPACE</code>, <code>R/*.R</code>: Import (from) stats, graphics and methods packages, and qualify some function calls for non-base packages installed with R to avoid NOTES made by R CMD check –as-cran with upcoming R versions.</li> @@ -237,10 +242,10 @@ </div> <div id="mkin-0-9-39-2015-06-26" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-39-2015-06-26" class="anchor"> </a>mkin 0.9-39 (2015-06-26)</h1> +<a href="#mkin-0-9-39-2015-06-26" class="anchor"></a>mkin 0.9-39 (2015-06-26)</h1> <div id="major-changes-2" class="section level2"> <h2 class="hasAnchor"> -<a href="#major-changes-2" class="anchor"> </a>Major changes</h2> +<a href="#major-changes-2" class="anchor"></a>Major changes</h2> <ul> <li><p>New function <code><a href="../reference/mmkin.html">mmkin()</a></code>: This function takes a character vector of model shorthand names, or alternatively a list of mkinmod models, as well as a list of dataset as main arguments. It returns a matrix of mkinfit objects, with a row for each model and a column for each dataset. A subsetting method with single brackets is available. Fitting the models in parallel using the <code>parallel</code> package is supported.</p></li> <li><p>New function <code><a href="../reference/plot.mmkin.html">plot.mmkin()</a></code>: Plots single-row or single-column <code>mmkin</code> objects including residual plots.</p></li> @@ -248,7 +253,7 @@ </div> <div id="bug-fixes-4" class="section level2"> <h2 class="hasAnchor"> -<a href="#bug-fixes-4" class="anchor"> </a>Bug fixes</h2> +<a href="#bug-fixes-4" class="anchor"></a>Bug fixes</h2> <ul> <li> <code><a href="../reference/mkinparplot.html">mkinparplot()</a></code>: Fix the x axis scaling for rate constants and formation fractions that got confused by the introduction of the t-values of transformed parameters.</li> @@ -257,10 +262,10 @@ </div> <div id="mkin-0-9-38-2015-06-24" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-38-2015-06-24" class="anchor"> </a>mkin 0.9-38 (2015-06-24)</h1> +<a href="#mkin-0-9-38-2015-06-24" class="anchor"></a>mkin 0.9-38 (2015-06-24)</h1> <div id="minor-changes-4" class="section level2"> <h2 class="hasAnchor"> -<a href="#minor-changes-4" class="anchor"> </a>Minor changes</h2> +<a href="#minor-changes-4" class="anchor"></a>Minor changes</h2> <ul> <li><p><code>vignettes/compiled_models.html</code>: Show the performance improvement factor actually obtained when building the vignette, as well as mkin version, some system info and the CPU model used for building the vignette.</p></li> <li><p><code>GNUMakefile</code>,<code>vignettes/*</code>: Clean up vignette generation and include table of contents in HTML vignettes.</p></li> @@ -268,7 +273,7 @@ </div> <div id="bug-fixes-5" class="section level2"> <h2 class="hasAnchor"> -<a href="#bug-fixes-5" class="anchor"> </a>Bug fixes</h2> +<a href="#bug-fixes-5" class="anchor"></a>Bug fixes</h2> <ul> <li> <code><a href="../reference/mkinmod.html">mkinmod()</a></code>: When generating the C code for the derivatives, only declare the time variable when it is needed and remove the ‘-W-no-unused-variable’ compiler flag as the C compiler used in the CRAN checks on Solaris does not know it.</li> @@ -277,10 +282,10 @@ </div> <div id="mkin-0-9-36-2015-06-21" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-36-2015-06-21" class="anchor"> </a>mkin 0.9-36 (2015-06-21)</h1> +<a href="#mkin-0-9-36-2015-06-21" class="anchor"></a>mkin 0.9-36 (2015-06-21)</h1> <div id="major-changes-3" class="section level2"> <h2 class="hasAnchor"> -<a href="#major-changes-3" class="anchor"> </a>Major changes</h2> +<a href="#major-changes-3" class="anchor"></a>Major changes</h2> <ul> <li><p><code><a href="../reference/summary.mkinfit.html">summary.mkinfit()</a></code>: A one-sided t-test for significant difference of untransformed parameters from zero is now always shown, based on the assumption of normal distribution for estimators of all untransformed parameters. Use with caution, as this assumption is unrealistic e.g. for rate constants in these nonlinear kinetic models.</p></li> <li><p>If a compiler (gcc) is installed, use a version of the differential equation model compiled from C code, which is a huge performance boost for models where only the deSolve method works.</p></li> @@ -290,7 +295,7 @@ </div> <div id="minor-changes-5" class="section level2"> <h2 class="hasAnchor"> -<a href="#minor-changes-5" class="anchor"> </a>Minor changes</h2> +<a href="#minor-changes-5" class="anchor"></a>Minor changes</h2> <ul> <li>Added a simple showcase vignette with an evaluation of FOCUS example dataset D</li> </ul> @@ -298,17 +303,17 @@ </div> <div id="mkin-0-9-35-2015-05-15" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-35-2015-05-15" class="anchor"> </a>mkin 0.9-35 (2015-05-15)</h1> +<a href="#mkin-0-9-35-2015-05-15" class="anchor"></a>mkin 0.9-35 (2015-05-15)</h1> <div id="major-changes-4" class="section level2"> <h2 class="hasAnchor"> -<a href="#major-changes-4" class="anchor"> </a>Major changes</h2> +<a href="#major-changes-4" class="anchor"></a>Major changes</h2> <ul> <li>Switch from RUnit to testthat for testing</li> </ul> </div> <div id="bug-fixes-6" class="section level2"> <h2 class="hasAnchor"> -<a href="#bug-fixes-6" class="anchor"> </a>Bug fixes</h2> +<a href="#bug-fixes-6" class="anchor"></a>Bug fixes</h2> <ul> <li><p><code><a href="../reference/mkinparplot.html">mkinparplot()</a></code>: Avoid warnings that occurred when not all confidence intervals were available in the summary of the fit</p></li> <li><p><code><a href="../reference/summary.mkinfit.html">print.summary.mkinfit()</a></code>: Fix printing the summary for the case that the number of iterations is not available</p></li> @@ -318,7 +323,7 @@ </div> <div id="new-features-1" class="section level2"> <h2 class="hasAnchor"> -<a href="#new-features-1" class="anchor"> </a>New features</h2> +<a href="#new-features-1" class="anchor"></a>New features</h2> <ul> <li><p><code><a href="../reference/mkinfit.html">mkinfit()</a></code>: Report successful termination when quiet = FALSE. This is helpful for more difficult problems fitted with reweight.method = obs, as no progress is often indicated during the reweighting.</p></li> <li><p>A first test using results established in the expertise written for the German Federal Environmental Agency (UBA) was added.</p></li> @@ -329,10 +334,10 @@ </div> <div id="mkin-0-9-34-2014-11-22" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-34-2014-11-22" class="anchor"> </a>mkin 0.9-34 (2014-11-22)</h1> +<a href="#mkin-0-9-34-2014-11-22" class="anchor"></a>mkin 0.9-34 (2014-11-22)</h1> <div id="new-features-2" class="section level2"> <h2 class="hasAnchor"> -<a href="#new-features-2" class="anchor"> </a>New features</h2> +<a href="#new-features-2" class="anchor"></a>New features</h2> <ul> <li><p>Add the convenience function <code><a href="../reference/mkinsub.html">mkinsub()</a></code> for creating the lists used in <code><a href="../reference/mkinmod.html">mkinmod()</a></code></p></li> <li><p>Add the possibility to fit indeterminate order rate equation (IORE) models using an analytical solution (parent only) or a numeric solution. Paths from IORE compounds to metabolites are supported when using formation fractions (use_of_ff = ‘max’). Note that the numerical solution (method.ode = ‘deSolve’) of the IORE differential equations sometimes fails due to numerical problems.</p></li> @@ -341,7 +346,7 @@ </div> <div id="minor-changes-6" class="section level2"> <h2 class="hasAnchor"> -<a href="#minor-changes-6" class="anchor"> </a>Minor changes</h2> +<a href="#minor-changes-6" class="anchor"></a>Minor changes</h2> <ul> <li><p>The formatting of differential equations in the summary was further improved</p></li> <li><p>Always include 0 on y axis when plotting during the fit</p></li> @@ -350,10 +355,10 @@ </div> <div id="mkin-0-9-33-2014-10-22" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-33-2014-10-22" class="anchor"> </a>mkin 0.9-33 (2014-10-22)</h1> +<a href="#mkin-0-9-33-2014-10-22" class="anchor"></a>mkin 0.9-33 (2014-10-22)</h1> <div id="new-features-3" class="section level2"> <h2 class="hasAnchor"> -<a href="#new-features-3" class="anchor"> </a>New features</h2> +<a href="#new-features-3" class="anchor"></a>New features</h2> <ul> <li><p>The initial value (state.ini) for the observed variable with the highest observed residue is set to 100 in case it has no time zero observation and <code>state.ini = "auto"</code></p></li> <li><p>A basic unit test for <code><a href="../reference/mkinerrmin.html">mkinerrmin()</a></code> was written</p></li> @@ -361,7 +366,7 @@ </div> <div id="bug-fixes-7" class="section level2"> <h2 class="hasAnchor"> -<a href="#bug-fixes-7" class="anchor"> </a>Bug fixes</h2> +<a href="#bug-fixes-7" class="anchor"></a>Bug fixes</h2> <ul> <li><p><code><a href="../reference/mkinfit.html">mkinfit()</a></code>: The internally fitted parameter for <code>g</code> was named <code>g_ilr</code> even when <code>transform_fractions=FALSE</code></p></li> <li><p><code><a href="../reference/mkinfit.html">mkinfit()</a></code>: The initial value (state.ini) for the parent compound was not set when the parent was not the (only) variable with the highest value in the observed data.</p></li> @@ -371,7 +376,7 @@ </div> <div id="minor-changes-7" class="section level2"> <h2 class="hasAnchor"> -<a href="#minor-changes-7" class="anchor"> </a>Minor changes</h2> +<a href="#minor-changes-7" class="anchor"></a>Minor changes</h2> <ul> <li><p>The formatting of differential equations in the summary was improved by wrapping overly long lines</p></li> <li><p>The FOCUS_Z vignette was rebuilt with the above improvement and using a width of 70 to avoid output outside of the grey area</p></li> @@ -382,10 +387,10 @@ </div> <div id="mkin-0-9-32-2014-07-24" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-32-2014-07-24" class="anchor"> </a>mkin 0.9-32 (2014-07-24)</h1> +<a href="#mkin-0-9-32-2014-07-24" class="anchor"></a>mkin 0.9-32 (2014-07-24)</h1> <div id="new-features-4" class="section level2"> <h2 class="hasAnchor"> -<a href="#new-features-4" class="anchor"> </a>New features</h2> +<a href="#new-features-4" class="anchor"></a>New features</h2> <ul> <li><p>The number of degrees of freedom is difficult to define in the case of ilr transformation of formation fractions. Now for each source compartment the number of ilr parameters (=number of optimised parameters) is divided by the number of pathways to metabolites (=number of affected data series) which leads to fractional degrees of freedom in some cases.</p></li> <li><p>The default for the initial value for the first state value is now taken from the mean of the observations at time zero, if available.</p></li> @@ -397,7 +402,7 @@ </div> <div id="bug-fixes-8" class="section level2"> <h2 class="hasAnchor"> -<a href="#bug-fixes-8" class="anchor"> </a>Bug fixes</h2> +<a href="#bug-fixes-8" class="anchor"></a>Bug fixes</h2> <ul> <li><p>Avoid plotting an artifical 0 residual at time zero in <code>mkinresplot</code></p></li> <li><p>In the determination of the degrees of freedom in <code>mkinerrmin</code>, formation fractions were accounted for multiple times in the case of parallel formation of metabolites. See the new feature described above for the solution.</p></li> @@ -408,7 +413,7 @@ </div> <div id="minor-changes-8" class="section level2"> <h2 class="hasAnchor"> -<a href="#minor-changes-8" class="anchor"> </a>Minor changes</h2> +<a href="#minor-changes-8" class="anchor"></a>Minor changes</h2> <ul> <li><p>Vignettes were rebuilt to reflect the changes in the summary method.</p></li> <li><p>Algorithm <code>Pseudo</code> was excluded because it needs user-defined parameter limits which are not supported.</p></li> @@ -418,10 +423,10 @@ </div> <div id="mkin-0-9-31-2014-07-14" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-31-2014-07-14" class="anchor"> </a>mkin 0.9-31 (2014-07-14)</h1> +<a href="#mkin-0-9-31-2014-07-14" class="anchor"></a>mkin 0.9-31 (2014-07-14)</h1> <div id="bug-fixes-9" class="section level2"> <h2 class="hasAnchor"> -<a href="#bug-fixes-9" class="anchor"> </a>Bug fixes</h2> +<a href="#bug-fixes-9" class="anchor"></a>Bug fixes</h2> <ul> <li>The internal renaming of optimised parameters in Version 0.9-30 led to errors in the determination of the degrees of freedom for the chi2 error level calulations in <code><a href="../reference/mkinerrmin.html">mkinerrmin()</a></code> used by the summary function.</li> </ul> @@ -429,17 +434,17 @@ </div> <div id="mkin-0-9-30-2014-07-11" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-30-2014-07-11" class="anchor"> </a>mkin 0.9-30 (2014-07-11)</h1> +<a href="#mkin-0-9-30-2014-07-11" class="anchor"></a>mkin 0.9-30 (2014-07-11)</h1> <div id="new-features-5" class="section level2"> <h2 class="hasAnchor"> -<a href="#new-features-5" class="anchor"> </a>New features</h2> +<a href="#new-features-5" class="anchor"></a>New features</h2> <ul> <li>It is now possible to use formation fractions in combination with turning off the sink in <code><a href="../reference/mkinmod.html">mkinmod()</a></code>.</li> </ul> </div> <div id="major-changes-5" class="section level2"> <h2 class="hasAnchor"> -<a href="#major-changes-5" class="anchor"> </a>Major changes</h2> +<a href="#major-changes-5" class="anchor"></a>Major changes</h2> <ul> <li><p>The original and the transformed parameters now have different names (e.g. <code>k_parent</code> and <code>log_k_parent</code>. They also differ in how many they are when we have formation fractions but no pathway to sink.</p></li> <li><p>The order of some of the information blocks in <code>print.summary.mkinfit.R()</code> has been ordered in a more logical way.</p></li> @@ -447,7 +452,7 @@ </div> <div id="minor-changes-9" class="section level2"> <h2 class="hasAnchor"> -<a href="#minor-changes-9" class="anchor"> </a>Minor changes</h2> +<a href="#minor-changes-9" class="anchor"></a>Minor changes</h2> <ul> <li><p>The vignette FOCUS_Z has been simplified to use formation fractions with turning off the sink, and slightly amended to use the new versions of DT50 values calculated since mkin 0.9-29.</p></li> <li><p>All vignettes have been rebuilt so they reflect all changes.</p></li> @@ -460,7 +465,7 @@ </div> <div id="mkin-0-9-29-2014-06-27" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-29-2014-06-27" class="anchor"> </a>mkin 0.9-29 (2014-06-27)</h1> +<a href="#mkin-0-9-29-2014-06-27" class="anchor"></a>mkin 0.9-29 (2014-06-27)</h1> <ul> <li><p>R/mkinresplot.R: Make it possible to specify <code>xlim</code></p></li> <li><p>R/geometric_mean.R, man/geometric_mean.Rd: Add geometric mean function</p></li> @@ -469,7 +474,7 @@ </div> <div id="mkin-0-9-28-2014-05-20" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-28-2014-05-20" class="anchor"> </a>mkin 0.9-28 (2014-05-20)</h1> +<a href="#mkin-0-9-28-2014-05-20" class="anchor"></a>mkin 0.9-28 (2014-05-20)</h1> <ul> <li><p>Do not backtransform confidence intervals for formation fractions if more than one compound is formed, as such parameters only define the pathways as a set</p></li> <li><p>Add historical remarks and some background to the main package vignette</p></li> @@ -478,7 +483,7 @@ </div> <div id="mkin-0-9-27-2014-05-10" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-27-2014-05-10" class="anchor"> </a>mkin 0.9-27 (2014-05-10)</h1> +<a href="#mkin-0-9-27-2014-05-10" class="anchor"></a>mkin 0.9-27 (2014-05-10)</h1> <ul> <li><p>Fork the GUI into a separate package <a href="http://github.com/jranke/gmkin">gmkin</a></p></li> <li><p>DESCRIPTION, NAMESPACE, TODO: Adapt and add copyright information</p></li> @@ -501,7 +506,7 @@ </div> <div id="mkin-0-9-24-2013-11-06" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-24-2013-11-06" class="anchor"> </a>mkin 0.9-24 (2013-11-06)</h1> +<a href="#mkin-0-9-24-2013-11-06" class="anchor"></a>mkin 0.9-24 (2013-11-06)</h1> <ul> <li><p>Bugfix re-enabling the fixing of any combination of initial values for state variables</p></li> <li><p>Default values for kinetic rate constants are not all 0.1 any more but are “salted” with a small increment to avoid numeric artefacts with the eigenvalue based solutions</p></li> @@ -510,7 +515,7 @@ </div> <div id="mkin-0-9-22-2013-10-26" class="section level1"> <h1 class="hasAnchor"> -<a href="#mkin-0-9-22-2013-10-26" class="anchor"> </a>mkin 0.9-22 (2013-10-26)</h1> +<a href="#mkin-0-9-22-2013-10-26" class="anchor"></a>mkin 0.9-22 (2013-10-26)</h1> <ul> <li><p>Get rid of the optimisation step in <code>mkinerrmin</code> - this was unnecessary. Thanks to KinGUII for the inspiration - actually this is equation 6-2 in FOCUS kinetics p. 91 that I had overlooked originally</p></li> <li><p>Fix <code>plot.mkinfit</code> as it passed graphical arguments like main to the solver</p></li> diff --git a/docs/reference/DFOP.solution.html b/docs/reference/DFOP.solution.html index bad6dd57..3dbacdc1 100644 --- a/docs/reference/DFOP.solution.html +++ b/docs/reference/DFOP.solution.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — DFOP.solution • mkin</title> +<title>Double First-Order in Parallel kinetics — DFOP.solution • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Double First-Order in Parallel kinetics</h1> </div> @@ -105,23 +108,33 @@ of two exponential decline functions.</p> - <pre><span class='fu'>DFOP.solution</span>(<span class='no'>t</span>, <span class='no'>parent.0</span>, <span class='no'>k1</span>, <span class='no'>k2</span>, <span class='no'>g</span>)</pre> + <pre class="usage"><span class='fu'>DFOP.solution</span>(<span class='no'>t</span>, <span class='no'>parent.0</span>, <span class='no'>k1</span>, <span class='no'>k2</span>, <span class='no'>g</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>t</dt> - <dd> Time. </dd> - <dt>parent.0</dt> - <dd> Starting value for the response variable at time zero. </dd> - <dt>k1</dt> - <dd> First kinetic constant. </dd> - <dt>k2</dt> - <dd> Second kinetic constant. </dd> - <dt>g</dt> - <dd> Fraction of the starting value declining according to the - first kinetic constant. - </dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>t</th> + <td><p>Time.</p></td> + </tr> + <tr> + <th>parent.0</th> + <td><p>Starting value for the response variable at time zero.</p></td> + </tr> + <tr> + <th>k1</th> + <td><p>First kinetic constant.</p></td> + </tr> + <tr> + <th>k2</th> + <td><p>Second kinetic constant.</p></td> + </tr> + <tr> + <th>g</th> + <td><p>Fraction of the starting value declining according to the + first kinetic constant.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> @@ -133,7 +146,7 @@ Degradation Kinetics from Environmental Fate Studies on Pesticides in EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, - <a href = 'http://focus.jrc.ec.europa.eu/dk'>http://focus.jrc.ec.europa.eu/dk</a></p> + <a href = 'http://esdac.jrc.europa.eu/projects/degradation-kinetics'>http://esdac.jrc.europa.eu/projects/degradation-kinetics</a></p> <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> diff --git a/docs/reference/Extract.mmkin.html b/docs/reference/Extract.mmkin.html index 0131342a..135297cd 100644 --- a/docs/reference/Extract.mmkin.html +++ b/docs/reference/Extract.mmkin.html @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -102,23 +107,34 @@ <p>Subsetting method for mmkin objects.</p> - <pre># S3 method for mmkin + <pre class="usage"># S3 method for mmkin [(x, i, j, ..., drop = FALSE)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>x</dt> - <dd>An <code><a href='mmkin.html'>mmkin</a> object</code></dd> - <dt>i</dt> - <dd>Row index selecting the fits for specific models</dd> - <dt>j</dt> - <dd>Column index selecting the fits to specific datasets</dd> - <dt>...</dt> - <dd>Not used, only there to satisfy the generic method definition</dd> - <dt>drop</dt> - <dd>If FALSE, the method always returns an mmkin object, otherwise either - a list of mkinfit objects or a single mkinfit object.</dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>x</th> + <td><p>An <code><a href='mmkin.html'>mmkin</a> object</code></p></td> + </tr> + <tr> + <th>i</th> + <td><p>Row index selecting the fits for specific models</p></td> + </tr> + <tr> + <th>j</th> + <td><p>Column index selecting the fits to specific datasets</p></td> + </tr> + <tr> + <th>...</th> + <td><p>Not used, only there to satisfy the generic method definition</p></td> + </tr> + <tr> + <th>drop</th> + <td><p>If FALSE, the method always returns an mmkin object, otherwise either + a list of mkinfit objects or a single mkinfit object.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> @@ -132,23 +148,23 @@ <span class='no'>fits</span>[<span class='st'>"FOMC"</span>, ]</div><div class='output co'>#> dataset #> model B C #> FOMC List,42 List,42 -#> attr(,"class") -#> [1] "mmkin"</div><div class='input'> <span class='no'>fits</span>[, <span class='st'>"B"</span>]</div><div class='output co'>#> dataset +#> attr(,"class") +#> [1] "mmkin"</div><div class='input'> <span class='no'>fits</span>[, <span class='st'>"B"</span>]</div><div class='output co'>#> dataset #> model B #> SFO List,42 #> FOMC List,42 -#> attr(,"class") -#> [1] "mmkin"</div><div class='input'> <span class='no'>fits</span>[<span class='st'>"SFO"</span>, <span class='st'>"B"</span>]</div><div class='output co'>#> dataset +#> attr(,"class") +#> [1] "mmkin"</div><div class='input'> <span class='no'>fits</span>[<span class='st'>"SFO"</span>, <span class='st'>"B"</span>]</div><div class='output co'>#> dataset #> model B #> SFO List,42 -#> attr(,"class") -#> [1] "mmkin"</div><div class='input'> +#> attr(,"class") +#> [1] "mmkin"</div><div class='input'> <span class='fu'>head</span>( <span class='co'># This extracts an mkinfit object with lots of components</span> <span class='no'>fits</span><span class='kw'>[[</span><span class='st'>"FOMC"</span>, <span class='st'>"B"</span>]] )</div><div class='output co'>#> $par #> parent_0 log_alpha log_beta -#> 99.666193 2.549849 5.050586 +#> 99.666192 2.549849 5.050586 #> #> $ssr #> [1] 28.58291 @@ -164,7 +180,7 @@ #> 25 78 #> #> $counts -#> [1] "both X-convergence and relative convergence (5)" +#> [1] "both X-convergence and relative convergence (5)" #> </div><div class='input'> <span class='fu'>head</span>( <span class='co'># The same can be achieved by</span> @@ -188,7 +204,7 @@ #> 8 15 #> #> $counts -#> [1] "relative convergence (4)" +#> [1] "relative convergence (4)" #> #> $hessian #> parent_0 log_k_parent_sink @@ -223,7 +239,7 @@ #> [1] 6 #> #> $solution_type -#> [1] "analytical" +#> [1] "analytical" #> #> $transform_rates #> [1] TRUE @@ -232,17 +248,17 @@ #> [1] TRUE #> #> $method.modFit -#> [1] "Port" +#> [1] "Port" #> #> $maxit.modFit -#> [1] "auto" +#> [1] "auto" #> #> $calls #> [1] 29 #> #> $time #> user system elapsed -#> 0.068 0.000 0.066 +#> 0.064 0.000 0.063 #> #> $mkinmod #> <mkinmod> model generated with @@ -266,7 +282,7 @@ #> 8 parent 118 0.08 #> #> $obs_vars -#> [1] "parent" +#> [1] "parent" #> #> $predicted #> name time value @@ -380,9 +396,9 @@ #> $cost #> function (P) #> { -#> assign("calls", calls + 1, inherits = TRUE) +#> assign("calls", calls + 1, inherits = TRUE) #> if (trace_parms) -#> cat(P, "\n") +#> cat(P, "\n") #> if (length(state.ini.optim) > 0) { #> odeini <- c(P[1:length(state.ini.optim)], state.ini.fixed) #> names(odeini) <- c(state.ini.optim.boxnames, state.ini.fixed.boxnames) @@ -398,13 +414,13 @@ #> out <- mkinpredict(mkinmod, parms, odeini, outtimes, solution_type = solution_type, #> use_compiled = use_compiled, method.ode = method.ode, #> atol = atol, rtol = rtol, ...) -#> assign("out_predicted", out, inherits = TRUE) -#> mC <- modCost(out, observed, y = "value", err = err, weight = weight, +#> assign("out_predicted", out, inherits = TRUE) +#> mC <- modCost(out, observed, y = "value", err = err, weight = weight, #> scaleVar = scaleVar) #> if (mC$model < cost.old) { #> if (!quiet) -#> cat("Model cost at call ", calls, ": ", mC$model, -#> "\n") +#> cat("Model cost at call ", calls, ": ", mC$model, +#> "\n") #> if (plot) { #> outtimes_plot = seq(min(observed$time), max(observed$time), #> length.out = 100) @@ -412,9 +428,9 @@ #> solution_type = solution_type, use_compiled = use_compiled, #> method.ode = method.ode, atol = atol, rtol = rtol, #> ...) -#> plot(0, type = "n", xlim = range(observed$time), +#> plot(0, type = "n", xlim = range(observed$time), #> ylim = c(0, max(observed$value, na.rm = TRUE)), -#> xlab = "Time", ylab = "Observed") +#> xlab = "Time", ylab = "Observed") #> col_obs <- pch_obs <- 1:length(obs_vars) #> lty_obs <- rep(1, length(obs_vars)) #> names(col_obs) <- names(pch_obs) <- names(lty_obs) <- obs_vars @@ -424,14 +440,15 @@ #> } #> matlines(out_plot$time, out_plot[-1], col = col_obs, #> lty = lty_obs) -#> legend("topright", inset = c(0.05, 0.05), legend = obs_vars, +#> legend("topright", inset = c(0.05, 0.05), legend = obs_vars, #> col = col_obs, pch = pch_obs, lty = 1:length(pch_obs)) #> } -#> assign("cost.old", mC$model, inherits = TRUE) +#> assign("cost.old", mC$model, inherits = TRUE) #> } #> return(mC) #> } -#> <environment: 0x3b9eeb8> +#> <bytecode: 0x5554250> +#> <environment: 0x4eb4b18> #> #> $cost_notrans #> function (P) @@ -449,11 +466,12 @@ #> out <- mkinpredict(mkinmod, odeparms, odeini, outtimes, solution_type = solution_type, #> use_compiled = use_compiled, method.ode = method.ode, #> atol = atol, rtol = rtol, ...) -#> mC <- modCost(out, observed, y = "value", err = err, weight = weight, +#> mC <- modCost(out, observed, y = "value", err = err, weight = weight, #> scaleVar = scaleVar) #> return(mC) #> } -#> <environment: 0x3b9eeb8> +#> <bytecode: 0x5073868> +#> <environment: 0x4eb4b18> #> #> $hessian_notrans #> parent_0 k_parent_sink @@ -492,7 +510,7 @@ #> [1] 1e-10 #> #> $weight.ini -#> [1] "none" +#> [1] "none" #> #> $reweight.tol #> [1] 1e-08 @@ -516,10 +534,10 @@ #> 99.17407 #> #> $date -#> [1] "Wed Mar 15 09:44:44 2017" +#> [1] "Fri May 5 12:44:53 2017" #> -#> attr(,"class") -#> [1] "mkinfit" "modFit" +#> attr(,"class") +#> [1] "mkinfit" "modFit" #> </div></pre> </div> <div class="col-md-3 hidden-xs hidden-sm" id="sidebar"> diff --git a/docs/reference/FOCUS_2006_DFOP_ref_A_to_B.html b/docs/reference/FOCUS_2006_DFOP_ref_A_to_B.html index fff99b6c..703dc472 100644 --- a/docs/reference/FOCUS_2006_DFOP_ref_A_to_B.html +++ b/docs/reference/FOCUS_2006_DFOP_ref_A_to_B.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — FOCUS_2006_DFOP_ref_A_to_B • mkin</title> +<title>Results of fitting the DFOP model to Datasets A to B of FOCUS (2006) — FOCUS_2006_DFOP_ref_A_to_B • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Results of fitting the DFOP model to Datasets A to B of FOCUS (2006)</h1> </div> @@ -108,21 +111,20 @@ the initial concentration of the parent compound was fixed to a value of 100 in this fit.</p> - <pre><span class='fu'>data</span>(<span class='no'>FOCUS_2006_DFOP_ref_A_to_B</span>)</pre> + <pre class="usage"><span class='fu'>data</span>(<span class='no'>FOCUS_2006_DFOP_ref_A_to_B</span>)</pre> <h2 class="hasAnchor" id="format"><a class="anchor" href="#format"></a>Format</h2> - <p>A data frame containing the following variables. - <dl class='dl-horizontal'> - <dt><code>package</code></dt><dd>a factor giving the name of the software package</dd> - <dt><code>M0</code></dt><dd>The fitted initial concentration of the parent compound</dd> - <dt><code>f</code></dt><dd>The fitted f parameter</dd> - <dt><code>k1</code></dt><dd>The fitted k1 parameter</dd> - <dt><code>k2</code></dt><dd>The fitted k2 parameter</dd> - <dt><code>DT50</code></dt><dd>The resulting half-life of the parent compound</dd> - <dt><code>DT90</code></dt><dd>The resulting DT90 of the parent compound</dd> - <dt><code>dataset</code></dt><dd>The FOCUS dataset that was used</dd> - </dl></p> + <p>A data frame containing the following variables.</p><dl class='dl-horizontal'> + <dt><code>package</code></dt><dd><p>a factor giving the name of the software package</p></dd> + <dt><code>M0</code></dt><dd><p>The fitted initial concentration of the parent compound</p></dd> + <dt><code>f</code></dt><dd><p>The fitted f parameter</p></dd> + <dt><code>k1</code></dt><dd><p>The fitted k1 parameter</p></dd> + <dt><code>k2</code></dt><dd><p>The fitted k2 parameter</p></dd> + <dt><code>DT50</code></dt><dd><p>The resulting half-life of the parent compound</p></dd> + <dt><code>DT90</code></dt><dd><p>The resulting DT90 of the parent compound</p></dd> + <dt><code>dataset</code></dt><dd><p>The FOCUS dataset that was used</p></dd> + </dl> <h2 class="hasAnchor" id="source"><a class="anchor" href="#source"></a>Source</h2> @@ -130,7 +132,7 @@ in this fit.</p> Degradation Kinetics from Environmental Fate Studies on Pesticides in EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, - <a href = 'http://focus.jrc.ec.europa.eu/dk'>http://focus.jrc.ec.europa.eu/dk</a></p> + <a href = 'http://esdac.jrc.europa.eu/projects/degradation-kinetics'>http://esdac.jrc.europa.eu/projects/degradation-kinetics</a></p> <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> diff --git a/docs/reference/FOCUS_2006_FOMC_ref_A_to_F.html b/docs/reference/FOCUS_2006_FOMC_ref_A_to_F.html index 5c9feb23..eec595f0 100644 --- a/docs/reference/FOCUS_2006_FOMC_ref_A_to_F.html +++ b/docs/reference/FOCUS_2006_FOMC_ref_A_to_F.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — FOCUS_2006_FOMC_ref_A_to_F • mkin</title> +<title>Results of fitting the FOMC model to Datasets A to F of FOCUS (2006) — FOCUS_2006_FOMC_ref_A_to_F • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Results of fitting the FOMC model to Datasets A to F of FOCUS (2006)</h1> </div> @@ -108,20 +111,19 @@ the initial concentration of the parent compound was fixed to a value of 100 in this fit.</p> - <pre><span class='fu'>data</span>(<span class='no'>FOCUS_2006_FOMC_ref_A_to_F</span>)</pre> + <pre class="usage"><span class='fu'>data</span>(<span class='no'>FOCUS_2006_FOMC_ref_A_to_F</span>)</pre> <h2 class="hasAnchor" id="format"><a class="anchor" href="#format"></a>Format</h2> - <p>A data frame containing the following variables. - <dl class='dl-horizontal'> - <dt><code>package</code></dt><dd>a factor giving the name of the software package</dd> - <dt><code>M0</code></dt><dd>The fitted initial concentration of the parent compound</dd> - <dt><code>alpha</code></dt><dd>The fitted alpha parameter</dd> - <dt><code>beta</code></dt><dd>The fitted beta parameter</dd> - <dt><code>DT50</code></dt><dd>The resulting half-life of the parent compound</dd> - <dt><code>DT90</code></dt><dd>The resulting DT90 of the parent compound</dd> - <dt><code>dataset</code></dt><dd>The FOCUS dataset that was used</dd> - </dl></p> + <p>A data frame containing the following variables.</p><dl class='dl-horizontal'> + <dt><code>package</code></dt><dd><p>a factor giving the name of the software package</p></dd> + <dt><code>M0</code></dt><dd><p>The fitted initial concentration of the parent compound</p></dd> + <dt><code>alpha</code></dt><dd><p>The fitted alpha parameter</p></dd> + <dt><code>beta</code></dt><dd><p>The fitted beta parameter</p></dd> + <dt><code>DT50</code></dt><dd><p>The resulting half-life of the parent compound</p></dd> + <dt><code>DT90</code></dt><dd><p>The resulting DT90 of the parent compound</p></dd> + <dt><code>dataset</code></dt><dd><p>The FOCUS dataset that was used</p></dd> + </dl> <h2 class="hasAnchor" id="source"><a class="anchor" href="#source"></a>Source</h2> @@ -129,7 +131,7 @@ in this fit.</p> Degradation Kinetics from Environmental Fate Studies on Pesticides in EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, - <a href = 'http://focus.jrc.ec.europa.eu/dk'>http://focus.jrc.ec.europa.eu/dk</a></p> + <a href = 'http://esdac.jrc.europa.eu/projects/degradation-kinetics'>http://esdac.jrc.europa.eu/projects/degradation-kinetics</a></p> <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> diff --git a/docs/reference/FOCUS_2006_HS_ref_A_to_F.html b/docs/reference/FOCUS_2006_HS_ref_A_to_F.html index 8ccbd86a..c2a90311 100644 --- a/docs/reference/FOCUS_2006_HS_ref_A_to_F.html +++ b/docs/reference/FOCUS_2006_HS_ref_A_to_F.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — FOCUS_2006_HS_ref_A_to_F • mkin</title> +<title>Results of fitting the HS model to Datasets A to F of FOCUS (2006) — FOCUS_2006_HS_ref_A_to_F • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Results of fitting the HS model to Datasets A to F of FOCUS (2006)</h1> </div> @@ -108,21 +111,20 @@ the initial concentration of the parent compound was fixed to a value of 100 in this fit.</p> - <pre><span class='fu'>data</span>(<span class='no'>FOCUS_2006_HS_ref_A_to_F</span>)</pre> + <pre class="usage"><span class='fu'>data</span>(<span class='no'>FOCUS_2006_HS_ref_A_to_F</span>)</pre> <h2 class="hasAnchor" id="format"><a class="anchor" href="#format"></a>Format</h2> - <p>A data frame containing the following variables. - <dl class='dl-horizontal'> - <dt><code>package</code></dt><dd>a factor giving the name of the software package</dd> - <dt><code>M0</code></dt><dd>The fitted initial concentration of the parent compound</dd> - <dt><code>tb</code></dt><dd>The fitted tb parameter</dd> - <dt><code>k1</code></dt><dd>The fitted k1 parameter</dd> - <dt><code>k2</code></dt><dd>The fitted k2 parameter</dd> - <dt><code>DT50</code></dt><dd>The resulting half-life of the parent compound</dd> - <dt><code>DT90</code></dt><dd>The resulting DT90 of the parent compound</dd> - <dt><code>dataset</code></dt><dd>The FOCUS dataset that was used</dd> - </dl></p> + <p>A data frame containing the following variables.</p><dl class='dl-horizontal'> + <dt><code>package</code></dt><dd><p>a factor giving the name of the software package</p></dd> + <dt><code>M0</code></dt><dd><p>The fitted initial concentration of the parent compound</p></dd> + <dt><code>tb</code></dt><dd><p>The fitted tb parameter</p></dd> + <dt><code>k1</code></dt><dd><p>The fitted k1 parameter</p></dd> + <dt><code>k2</code></dt><dd><p>The fitted k2 parameter</p></dd> + <dt><code>DT50</code></dt><dd><p>The resulting half-life of the parent compound</p></dd> + <dt><code>DT90</code></dt><dd><p>The resulting DT90 of the parent compound</p></dd> + <dt><code>dataset</code></dt><dd><p>The FOCUS dataset that was used</p></dd> + </dl> <h2 class="hasAnchor" id="source"><a class="anchor" href="#source"></a>Source</h2> @@ -130,7 +132,7 @@ in this fit.</p> Degradation Kinetics from Environmental Fate Studies on Pesticides in EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, - <a href = 'http://focus.jrc.ec.europa.eu/dk'>http://focus.jrc.ec.europa.eu/dk</a></p> + <a href = 'http://esdac.jrc.europa.eu/projects/degradation-kinetics'>http://esdac.jrc.europa.eu/projects/degradation-kinetics</a></p> <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> diff --git a/docs/reference/FOCUS_2006_SFO_ref_A_to_F.html b/docs/reference/FOCUS_2006_SFO_ref_A_to_F.html index 263b9b31..24070b9c 100644 --- a/docs/reference/FOCUS_2006_SFO_ref_A_to_F.html +++ b/docs/reference/FOCUS_2006_SFO_ref_A_to_F.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — FOCUS_2006_SFO_ref_A_to_F • mkin</title> +<title>Results of fitting the SFO model to Datasets A to F of FOCUS (2006) — FOCUS_2006_SFO_ref_A_to_F • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Results of fitting the SFO model to Datasets A to F of FOCUS (2006)</h1> </div> @@ -108,19 +111,18 @@ the initial concentration of the parent compound was fixed to a value of 100 in this fit.</p> - <pre><span class='fu'>data</span>(<span class='no'>FOCUS_2006_SFO_ref_A_to_F</span>)</pre> + <pre class="usage"><span class='fu'>data</span>(<span class='no'>FOCUS_2006_SFO_ref_A_to_F</span>)</pre> <h2 class="hasAnchor" id="format"><a class="anchor" href="#format"></a>Format</h2> - <p>A data frame containing the following variables. - <dl class='dl-horizontal'> - <dt><code>package</code></dt><dd>a factor giving the name of the software package</dd> - <dt><code>M0</code></dt><dd>The fitted initial concentration of the parent compound</dd> - <dt><code>k</code></dt><dd>The fitted first-order degradation rate constant</dd> - <dt><code>DT50</code></dt><dd>The resulting half-life of the parent compound</dd> - <dt><code>DT90</code></dt><dd>The resulting DT90 of the parent compound</dd> - <dt><code>dataset</code></dt><dd>The FOCUS dataset that was used</dd> - </dl></p> + <p>A data frame containing the following variables.</p><dl class='dl-horizontal'> + <dt><code>package</code></dt><dd><p>a factor giving the name of the software package</p></dd> + <dt><code>M0</code></dt><dd><p>The fitted initial concentration of the parent compound</p></dd> + <dt><code>k</code></dt><dd><p>The fitted first-order degradation rate constant</p></dd> + <dt><code>DT50</code></dt><dd><p>The resulting half-life of the parent compound</p></dd> + <dt><code>DT90</code></dt><dd><p>The resulting DT90 of the parent compound</p></dd> + <dt><code>dataset</code></dt><dd><p>The FOCUS dataset that was used</p></dd> + </dl> <h2 class="hasAnchor" id="source"><a class="anchor" href="#source"></a>Source</h2> @@ -128,7 +130,7 @@ in this fit.</p> Degradation Kinetics from Environmental Fate Studies on Pesticides in EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, - <a href = 'http://focus.jrc.ec.europa.eu/dk'>http://focus.jrc.ec.europa.eu/dk</a></p> + <a href = 'http://esdac.jrc.europa.eu/projects/degradation-kinetics'>http://esdac.jrc.europa.eu/projects/degradation-kinetics</a></p> <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> diff --git a/docs/reference/FOCUS_2006_datasets.html b/docs/reference/FOCUS_2006_datasets.html index 71dbe761..93901bfa 100644 --- a/docs/reference/FOCUS_2006_datasets.html +++ b/docs/reference/FOCUS_2006_datasets.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — FOCUS_2006_datasets • mkin</title> +<title>Datasets A to F from the FOCUS Kinetics report from 2006 — FOCUS_2006_datasets • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,24 +100,22 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Datasets A to F from the FOCUS Kinetics report from 2006</h1> </div> <p>Data taken from FOCUS (2006), p. 258.</p> - <pre><span class='no'>FOCUS_2006_datasets</span></pre> + <pre class="usage"><span class='no'>FOCUS_2006_datasets</span></pre> <h2 class="hasAnchor" id="format"><a class="anchor" href="#format"></a>Format</h2> - <p>6 datasets with observations on the following variables. - <dl class='dl-horizontal'> - <dt><code>name</code></dt><dd>a factor containing the name of the observed variable</dd> - <dt><code>time</code></dt><dd>a numeric vector containing time points</dd> - <dt><code>value</code></dt><dd>a numeric vector containing concentrations in percent of applied radioactivity</dd> - </dl></p> + <p>6 datasets with observations on the following variables.</p><dl class='dl-horizontal'> + <dt><code>name</code></dt><dd><p>a factor containing the name of the observed variable</p></dd> + <dt><code>time</code></dt><dd><p>a numeric vector containing time points</p></dd> + <dt><code>value</code></dt><dd><p>a numeric vector containing concentrations in percent of applied radioactivity</p></dd> + </dl> <h2 class="hasAnchor" id="source"><a class="anchor" href="#source"></a>Source</h2> @@ -121,7 +123,7 @@ Degradation Kinetics from Environmental Fate Studies on Pesticides in EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, - <a href = 'http://focus.jrc.ec.europa.eu/dk'>http://focus.jrc.ec.europa.eu/dk</a></p> + <a href = 'http://esdac.jrc.europa.eu/projects/degradation-kinetics'>http://esdac.jrc.europa.eu/projects/degradation-kinetics</a></p> <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> diff --git a/docs/reference/FOMC.solution.html b/docs/reference/FOMC.solution.html index 8d0ed869..67a37b4f 100644 --- a/docs/reference/FOMC.solution.html +++ b/docs/reference/FOMC.solution.html @@ -6,7 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> First-Order Multi-Compartment kinetics — FOMC.solution • mkin</title> +<title>First-Order Multi-Compartment kinetics — FOMC.solution • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -95,35 +100,40 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> First-Order Multi-Compartment kinetics </h1> + <h1>First-Order Multi-Compartment kinetics</h1> </div> <p>Function describing exponential decline from a defined starting value, with a decreasing rate constant.</p> - - <p>The form given here differs slightly from the original reference by Gustafson +<p>The form given here differs slightly from the original reference by Gustafson and Holden (1990). The parameter <code>beta</code> corresponds to 1/beta in the original equation.</p> - <pre><span class='fu'>FOMC.solution</span>(<span class='no'>t</span>, <span class='no'>parent.0</span>, <span class='no'>alpha</span>, <span class='no'>beta</span>)</pre> + <pre class="usage"><span class='fu'>FOMC.solution</span>(<span class='no'>t</span>, <span class='no'>parent.0</span>, <span class='no'>alpha</span>, <span class='no'>beta</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>t</dt> - <dd> Time. </dd> - <dt>parent.0</dt> - <dd> Starting value for the response variable at time zero. </dd> - <dt>alpha</dt> - <dd> - Shape parameter determined by coefficient of variation of rate constant - values. </dd> - <dt>beta</dt> - <dd> - Location parameter. -</dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>t</th> + <td><p>Time.</p></td> + </tr> + <tr> + <th>parent.0</th> + <td><p>Starting value for the response variable at time zero.</p></td> + </tr> + <tr> + <th>alpha</th> + <td><p>Shape parameter determined by coefficient of variation of rate constant + values.</p></td> + </tr> + <tr> + <th>beta</th> + <td><p>Location parameter.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="note"><a class="anchor" href="#note"></a>Note</h2> @@ -142,8 +152,8 @@ Degradation Kinetics from Environmental Fate Studies on Pesticides in EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, - <a href = 'http://focus.jrc.ec.europa.eu/dk'>http://focus.jrc.ec.europa.eu/dk</a></p> - <p>Gustafson DI and Holden LR (1990) Nonlinear pesticide dissipation in soil: A + <a href = 'http://esdac.jrc.europa.eu/projects/degradation-kinetics'>http://esdac.jrc.europa.eu/projects/degradation-kinetics</a></p> +<p>Gustafson DI and Holden LR (1990) Nonlinear pesticide dissipation in soil: A new model based on spatial variability. <em>Environmental Science and Technology</em> <b>24</b>, 1032-1038</p> diff --git a/docs/reference/HS.solution.html b/docs/reference/HS.solution.html index b8e6f524..3d608a2f 100644 --- a/docs/reference/HS.solution.html +++ b/docs/reference/HS.solution.html @@ -6,7 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> Hockey-Stick kinetics — HS.solution • mkin</title> +<title>Hockey-Stick kinetics — HS.solution • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -95,7 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> Hockey-Stick kinetics </h1> + <h1>Hockey-Stick kinetics</h1> </div> @@ -103,23 +108,34 @@ between them.</p> - <pre><span class='fu'>HS.solution</span>(<span class='no'>t</span>, <span class='no'>parent.0</span>, <span class='no'>k1</span>, <span class='no'>k2</span>, <span class='no'>tb</span>)</pre> + <pre class="usage"><span class='fu'>HS.solution</span>(<span class='no'>t</span>, <span class='no'>parent.0</span>, <span class='no'>k1</span>, <span class='no'>k2</span>, <span class='no'>tb</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>t</dt> - <dd> Time. </dd> - <dt>parent.0</dt> - <dd> Starting value for the response variable at time zero. </dd> - <dt>k1</dt> - <dd> First kinetic constant. </dd> - <dt>k2</dt> - <dd> Second kinetic constant. </dd> - <dt>tb</dt> - <dd> Break point. Before this time, exponential decline according + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>t</th> + <td><p>Time.</p></td> + </tr> + <tr> + <th>parent.0</th> + <td><p>Starting value for the response variable at time zero.</p></td> + </tr> + <tr> + <th>k1</th> + <td><p>First kinetic constant.</p></td> + </tr> + <tr> + <th>k2</th> + <td><p>Second kinetic constant.</p></td> + </tr> + <tr> + <th>tb</th> + <td><p>Break point. Before this time, exponential decline according to <code>k1</code> is calculated, after this time, exponential decline proceeds - according to <code>k2</code>. </dd> - </dl> + according to <code>k2</code>.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> @@ -131,7 +147,7 @@ Degradation Kinetics from Environmental Fate Studies on Pesticides in EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, - <a href = 'http://focus.jrc.ec.europa.eu/dk'>http://focus.jrc.ec.europa.eu/dk</a></p> + <a href = 'http://esdac.jrc.europa.eu/projects/degradation-kinetics'>http://esdac.jrc.europa.eu/projects/degradation-kinetics</a></p> <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> diff --git a/docs/reference/IORE.solution.html b/docs/reference/IORE.solution.html index 8caef574..4a95f106 100644 --- a/docs/reference/IORE.solution.html +++ b/docs/reference/IORE.solution.html @@ -6,7 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> Indeterminate order rate equation kinetics — IORE.solution • mkin</title> +<title>Indeterminate order rate equation kinetics — IORE.solution • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -95,7 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> Indeterminate order rate equation kinetics </h1> + <h1>Indeterminate order rate equation kinetics</h1> </div> @@ -103,19 +108,28 @@ a concentration dependent rate constant.</p> - <pre><span class='fu'>IORE.solution</span>(<span class='no'>t</span>, <span class='no'>parent.0</span>, <span class='no'>k__iore</span>, <span class='no'>N</span>)</pre> + <pre class="usage"><span class='fu'>IORE.solution</span>(<span class='no'>t</span>, <span class='no'>parent.0</span>, <span class='no'>k__iore</span>, <span class='no'>N</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>t</dt> - <dd> Time. </dd> - <dt>parent.0</dt> - <dd> Starting value for the response variable at time zero. </dd> - <dt>k__iore</dt> - <dd> Rate constant. Note that this depends on the concentration units used. </dd> - <dt>N</dt> - <dd> Exponent describing the nonlinearity of the rate equation </dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>t</th> + <td><p>Time.</p></td> + </tr> + <tr> + <th>parent.0</th> + <td><p>Starting value for the response variable at time zero.</p></td> + </tr> + <tr> + <th>k__iore</th> + <td><p>Rate constant. Note that this depends on the concentration units used.</p></td> + </tr> + <tr> + <th>N</th> + <td><p>Exponent describing the nonlinearity of the rate equation</p></td> + </tr> + </table> <h2 class="hasAnchor" id="note"><a class="anchor" href="#note"></a>Note</h2> diff --git a/docs/reference/SFO.solution.html b/docs/reference/SFO.solution.html index e2c93102..08928135 100644 --- a/docs/reference/SFO.solution.html +++ b/docs/reference/SFO.solution.html @@ -6,7 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> Single First-Order kinetics — SFO.solution • mkin</title> +<title>Single First-Order kinetics — SFO.solution • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -95,24 +100,31 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> Single First-Order kinetics </h1> + <h1>Single First-Order kinetics</h1> </div> <p>Function describing exponential decline from a defined starting value.</p> - <pre><span class='fu'>SFO.solution</span>(<span class='no'>t</span>, <span class='no'>parent.0</span>, <span class='no'>k</span>)</pre> + <pre class="usage"><span class='fu'>SFO.solution</span>(<span class='no'>t</span>, <span class='no'>parent.0</span>, <span class='no'>k</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>t</dt> - <dd> Time. </dd> - <dt>parent.0</dt> - <dd> Starting value for the response variable at time zero. </dd> - <dt>k</dt> - <dd> Kinetic constant. </dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>t</th> + <td><p>Time.</p></td> + </tr> + <tr> + <th>parent.0</th> + <td><p>Starting value for the response variable at time zero.</p></td> + </tr> + <tr> + <th>k</th> + <td><p>Kinetic constant.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> @@ -124,7 +136,7 @@ Degradation Kinetics from Environmental Fate Studies on Pesticides in EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, - <a href = 'http://focus.jrc.ec.europa.eu/dk'>http://focus.jrc.ec.europa.eu/dk</a></p> + <a href = 'http://esdac.jrc.europa.eu/projects/degradation-kinetics'>http://esdac.jrc.europa.eu/projects/degradation-kinetics</a></p> <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> diff --git a/docs/reference/SFORB.solution.html b/docs/reference/SFORB.solution.html index 4a73ba9e..112e157d 100644 --- a/docs/reference/SFORB.solution.html +++ b/docs/reference/SFORB.solution.html @@ -6,7 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> Single First-Order Reversible Binding kinetics — SFORB.solution • mkin</title> +<title>Single First-Order Reversible Binding kinetics — SFORB.solution • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -95,7 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> Single First-Order Reversible Binding kinetics </h1> + <h1>Single First-Order Reversible Binding kinetics</h1> </div> @@ -106,21 +111,32 @@ no substance in the bound fraction.</p> - <pre><span class='fu'>SFORB.solution</span>(<span class='no'>t</span>, <span class='no'>parent.0</span>, <span class='no'>k_12</span>, <span class='no'>k_21</span>, <span class='no'>k_1output</span>)</pre> + <pre class="usage"><span class='fu'>SFORB.solution</span>(<span class='no'>t</span>, <span class='no'>parent.0</span>, <span class='no'>k_12</span>, <span class='no'>k_21</span>, <span class='no'>k_1output</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>t</dt> - <dd> Time. </dd> - <dt>parent.0</dt> - <dd> Starting value for the response variable at time zero. </dd> - <dt>k_12</dt> - <dd> Kinetic constant describing transfer from free to bound. </dd> - <dt>k_21</dt> - <dd> Kinetic constant describing transfer from bound to free. </dd> - <dt>k_1output</dt> - <dd> Kinetic constant describing degradation of the free fraction. </dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>t</th> + <td><p>Time.</p></td> + </tr> + <tr> + <th>parent.0</th> + <td><p>Starting value for the response variable at time zero.</p></td> + </tr> + <tr> + <th>k_12</th> + <td><p>Kinetic constant describing transfer from free to bound.</p></td> + </tr> + <tr> + <th>k_21</th> + <td><p>Kinetic constant describing transfer from bound to free.</p></td> + </tr> + <tr> + <th>k_1output</th> + <td><p>Kinetic constant describing degradation of the free fraction.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> @@ -133,7 +149,7 @@ Degradation Kinetics from Environmental Fate Studies on Pesticides in EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, - <a href = 'http://focus.jrc.ec.europa.eu/dk'>http://focus.jrc.ec.europa.eu/dk</a></p> + <a href = 'http://esdac.jrc.europa.eu/projects/degradation-kinetics'>http://esdac.jrc.europa.eu/projects/degradation-kinetics</a></p> <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> diff --git a/docs/reference/add_err.html b/docs/reference/add_err.html index aab42f56..c9e6bf3f 100644 --- a/docs/reference/add_err.html +++ b/docs/reference/add_err.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — add_err • mkin</title> +<title>Add normally distributed errors to simulated kinetic degradation data — add_err • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Add normally distributed errors to simulated kinetic degradation data</h1> </div> @@ -106,45 +109,46 @@ may depend on the predicted value and is specified as a standard deviation.</p> - <pre><span class='fu'>add_err</span>(<span class='no'>prediction</span>, <span class='no'>sdfunc</span>, + <pre class="usage"><span class='fu'>add_err</span>(<span class='no'>prediction</span>, <span class='no'>sdfunc</span>, <span class='kw'>n</span> <span class='kw'>=</span> <span class='fl'>1000</span>, <span class='kw'>LOD</span> <span class='kw'>=</span> <span class='fl'>0.1</span>, <span class='kw'>reps</span> <span class='kw'>=</span> <span class='fl'>2</span>, <span class='kw'>digits</span> <span class='kw'>=</span> <span class='fl'>1</span>, <span class='kw'>seed</span> <span class='kw'>=</span> <span class='fl'>NA</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>prediction</dt> - <dd> - A prediction from a kinetic model as produced by <code><a href='mkinpredict.html'>mkinpredict</a></code>. - </dd> - <dt>sdfunc</dt> - <dd> - A function taking the predicted value as its only argument and returning + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>prediction</th> + <td><p>A prediction from a kinetic model as produced by <code><a href='mkinpredict.html'>mkinpredict</a></code>.</p></td> + </tr> + <tr> + <th>sdfunc</th> + <td><p>A function taking the predicted value as its only argument and returning a standard deviation that should be used for generating the random error - terms for this value. - </dd> - <dt>n</dt> - <dd> - The number of datasets to be generated. - </dd> - <dt>LOD</dt> - <dd> - The limit of detection (LOD). Values that are below the LOD after adding - the random error will be set to NA. - </dd> - <dt>reps</dt> - <dd> - The number of replicates to be generated within the datasets. - </dd> - <dt>digits</dt> - <dd> - The number of digits to which the values will be rounded. - </dd> - <dt>seed</dt> - <dd> - The seed used for the generation of random numbers. If NA, the seed - is not set. - </dd> - </dl> + terms for this value.</p></td> + </tr> + <tr> + <th>n</th> + <td><p>The number of datasets to be generated.</p></td> + </tr> + <tr> + <th>LOD</th> + <td><p>The limit of detection (LOD). Values that are below the LOD after adding + the random error will be set to NA.</p></td> + </tr> + <tr> + <th>reps</th> + <td><p>The number of replicates to be generated within the datasets.</p></td> + </tr> + <tr> + <th>digits</th> + <td><p>The number of digits to which the values will be rounded.</p></td> + </tr> + <tr> + <th>seed</th> + <td><p>The seed used for the generation of random numbers. If NA, the seed + is not set.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> diff --git a/docs/reference/endpoints.html b/docs/reference/endpoints.html index 4145825a..c48854fd 100644 --- a/docs/reference/endpoints.html +++ b/docs/reference/endpoints.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — endpoints • mkin</title> +<title>Function to calculate endpoints for further use from kinetic models fitted with mkinfit — endpoints • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Function to calculate endpoints for further use from kinetic models fitted with mkinfit</h1> </div> @@ -107,15 +110,16 @@ the Eigenvalues are returned. These are equivalent to the rate constantes of the with the advantage that the SFORB model can also be used for metabolites.</p> - <pre><span class='fu'>endpoints</span>(<span class='no'>fit</span>)</pre> + <pre class="usage"><span class='fu'>endpoints</span>(<span class='no'>fit</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>fit</dt> - <dd> - An object of class <code><a href='mkinfit.html'>mkinfit</a></code>. - </dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>fit</th> + <td><p>An object of class <code><a href='mkinfit.html'>mkinfit</a></code>.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="note"><a class="anchor" href="#note"></a>Note</h2> diff --git a/docs/reference/geometric_mean.html b/docs/reference/geometric_mean.html index 828ec471..22d06fec 100644 --- a/docs/reference/geometric_mean.html +++ b/docs/reference/geometric_mean.html @@ -6,7 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> Calculate the geometric mean — geometric_mean • mkin</title> +<title>Calculate the geometric mean — geometric_mean • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -95,22 +100,27 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> Calculate the geometric mean </h1> + <h1>Calculate the geometric mean</h1> </div> <p>Function calculating the geometric mean of numeric vectors</p> - <pre><span class='fu'>geometric_mean</span>(<span class='no'>x</span>, <span class='kw'>na.rm</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>)</pre> + <pre class="usage"><span class='fu'>geometric_mean</span>(<span class='no'>x</span>, <span class='kw'>na.rm</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>x</dt> - <dd> A numeric vector </dd> - <dt>na.rm</dt> - <dd> Should NA values be ignored </dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>x</th> + <td><p>A numeric vector</p></td> + </tr> + <tr> + <th>na.rm</th> + <td><p>Should NA values be ignored</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> diff --git a/docs/reference/ilr.html b/docs/reference/ilr.html index 4262fa81..808bcdb7 100644 --- a/docs/reference/ilr.html +++ b/docs/reference/ilr.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — ilr • mkin</title> +<title>Function to perform isometric log-ratio transformation — ilr • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,25 +100,25 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Function to perform isometric log-ratio transformation</h1> </div> <p>This implementation is a special case of the class of isometric log-ratio transformations.</p> - <pre><span class='fu'>ilr</span>(<span class='no'>x</span>) + <pre class="usage"><span class='fu'>ilr</span>(<span class='no'>x</span>) <span class='fu'>invilr</span>(<span class='no'>x</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>x</dt> - <dd> - A numeric vector. Naturally, the forward transformation is only sensible for - vectors with all elements being greater than zero. - </dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>x</th> + <td><p>A numeric vector. Naturally, the forward transformation is only sensible for + vectors with all elements being greater than zero.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> diff --git a/docs/reference/index.html b/docs/reference/index.html index 2e997ef0..16280a9d 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -95,250 +100,302 @@ <div class="row"> <div class="col-md-9"> <div class="page-header"> - <h1>Function reference</h1> - <h4>version 0.9.45.1</h4> + <h1> + Reference + <small>version 0.9.45.2</small> + </h1> </div> <div class="contents"> - <h2 id="section-main-functions" class="hasAnchor"><a href="#section-main-functions" class="anchor"></a>Main functions</h2> - <p class="section-desc"><p>Essential functionality</p></p> - - - <p><a href="mkinmod.html"> -</a></p> - <ul> - <li><code><a href="mkinmod.html">mkinmod</a></code></li> - </ul> - - <p><a href="mkinfit.html"> -</a></p> - <ul> - <li><code><a href="mkinfit.html">mkinfit</a></code></li> - </ul> - - <p><a href="mmkin.html"> -</a></p> - <ul> - <li><code><a href="mmkin.html">mmkin</a></code></li> - </ul> - <h2 id="section-show-results" class="hasAnchor"><a href="#section-show-results" class="anchor"></a>Show results</h2> - <p class="section-desc"><p>Functions working with mkinfit objects</p></p> - - - <p><a href="plot.mkinfit.html"> -</a></p> - <ul> - <li><code><a href="plot.mkinfit.html">plot.mkinfit</a></code></li><li><code><a href="plot.mkinfit.html">plot_sep</a></code></li> - </ul> - - <p><a href="summary.mkinfit.html"> -</a></p> - <ul> - <li><code><a href="summary.mkinfit.html">summary.mkinfit</a></code></li><li><code><a href="summary.mkinfit.html">print.summary.mkinfit</a></code></li> - </ul> - - <p><a href="mkinresplot.html"> -</a></p> - <ul> - <li><code><a href="mkinresplot.html">mkinresplot</a></code></li> - </ul> - - <p><a href="mkinparplot.html"> -</a></p> - <ul> - <li><code><a href="mkinparplot.html">mkinparplot</a></code></li> - </ul> - - <p><a href="endpoints.html"> -</a></p> - <ul> - <li><code><a href="endpoints.html">endpoints</a></code></li> - </ul> - - <p><a href="mkinerrmin.html"> -</a></p> - <ul> - <li><code><a href="mkinerrmin.html">mkinerrmin</a></code></li> - </ul> - <h2 id="section-work-with-mmkin-objects" class="hasAnchor"><a href="#section-work-with-mmkin-objects" class="anchor"></a>Work with mmkin objects</h2> - <p class="section-desc"><p>Functions working with aggregated results</p></p> - - - <p><a href="Extract.mmkin.html">Subsetting method for mmkin objects</a></p> - <ul> - <li><code><a href="Extract.mmkin.html">[.mmkin</a></code></li> - </ul> - - <p><a href="plot.mmkin.html"> -</a></p> - <ul> - <li><code><a href="plot.mmkin.html">plot.mmkin</a></code></li> - </ul> - <h2 id="section-datasets-and-known-results" class="hasAnchor"><a href="#section-datasets-and-known-results" class="anchor"></a>Datasets and known results</h2> - <p class="section-desc"></p> - - - <p><a href="FOCUS_2006_datasets.html"> -</a></p> - <ul> - <li><code><a href="FOCUS_2006_datasets.html">FOCUS_2006_A</a></code></li><li><code><a href="FOCUS_2006_datasets.html">FOCUS_2006_B</a></code></li><li><code><a href="FOCUS_2006_datasets.html">FOCUS_2006_C</a></code></li><li><code><a href="FOCUS_2006_datasets.html">FOCUS_2006_D</a></code></li><li><code><a href="FOCUS_2006_datasets.html">FOCUS_2006_E</a></code></li><li><code><a href="FOCUS_2006_datasets.html">FOCUS_2006_F</a></code></li> - </ul> - - <p><a href="FOCUS_2006_SFO_ref_A_to_F.html"> -</a></p> - <ul> - <li><code><a href="FOCUS_2006_SFO_ref_A_to_F.html">FOCUS_2006_SFO_ref_A_to_F</a></code></li> - </ul> - - <p><a href="FOCUS_2006_FOMC_ref_A_to_F.html"> -</a></p> - <ul> - <li><code><a href="FOCUS_2006_FOMC_ref_A_to_F.html">FOCUS_2006_FOMC_ref_A_to_F</a></code></li> - </ul> - - <p><a href="FOCUS_2006_HS_ref_A_to_F.html"> -</a></p> - <ul> - <li><code><a href="FOCUS_2006_HS_ref_A_to_F.html">FOCUS_2006_HS_ref_A_to_F</a></code></li> - </ul> - - <p><a href="FOCUS_2006_DFOP_ref_A_to_B.html"> -</a></p> - <ul> - <li><code><a href="FOCUS_2006_DFOP_ref_A_to_B.html">FOCUS_2006_DFOP_ref_A_to_B</a></code></li> - </ul> - - <p><a href="mccall81_245T.html"> -</a></p> - <ul> - <li><code><a href="mccall81_245T.html">mccall81_245T</a></code></li> - </ul> - - <p><a href="schaefer07_complex_case.html"> -</a></p> - <ul> - <li><code><a href="schaefer07_complex_case.html">schaefer07_complex_case</a></code></li><li><code><a href="schaefer07_complex_case.html">schaefer07_complex_results</a></code></li> - </ul> - - <p><a href="synthetic_data_for_UBA.html"> -</a></p> - <ul> - <li><code><a href="synthetic_data_for_UBA.html">synthetic_data_for_UBA_2014</a></code></li> - </ul> - - <p><a href="mkinds.html">A dataset class for mkin</a></p> - <ul> - <li><code><a href="mkinds.html">mkinds</a></code></li> - </ul> - - <p><a href="print.mkinds.html"> -</a></p> - <ul> - <li><code><a href="print.mkinds.html">print.mkinds</a></code></li> - </ul> - <h2 id="section-helper-functions" class="hasAnchor"><a href="#section-helper-functions" class="anchor"></a>Helper functions</h2> - <p class="section-desc"></p> - - - <p><a href="mkin_wide_to_long.html"> -</a></p> - <ul> - <li><code><a href="mkin_wide_to_long.html">mkin_wide_to_long</a></code></li> - </ul> - - <p><a href="mkin_long_to_wide.html"> -</a></p> - <ul> - <li><code><a href="mkin_long_to_wide.html">mkin_long_to_wide</a></code></li> - </ul> - - <p><a href="mkinsub.html"> -</a></p> - <ul> - <li><code><a href="mkinsub.html">mkinsub</a></code></li> - </ul> - - <p><a href="print.mkinmod.html"> -</a></p> - <ul> - <li><code><a href="print.mkinmod.html">print.mkinmod</a></code></li> - </ul> - - <p><a href="mkinpredict.html"> -</a></p> - <ul> - <li><code><a href="mkinpredict.html">mkinpredict</a></code></li> - </ul> - - <p><a href="transform_odeparms.html"> -</a></p> - <ul> - <li><code><a href="transform_odeparms.html">transform_odeparms</a></code></li><li><code><a href="transform_odeparms.html">backtransform_odeparms</a></code></li> - </ul> - - <p><a href="ilr.html"> -</a></p> - <ul> - <li><code><a href="ilr.html">ilr</a></code></li><li><code><a href="ilr.html">invilr</a></code></li> - </ul> - - <p><a href="geometric_mean.html"> Calculate the geometric mean </a></p> - <ul> - <li><code><a href="geometric_mean.html">geometric_mean</a></code></li> - </ul> - <h2 id="section-analytical-solutions" class="hasAnchor"><a href="#section-analytical-solutions" class="anchor"></a>Analytical solutions</h2> - <p class="section-desc"><p>Parent only model solutions</p></p> + <table class="ref-index"> - - <p><a href="SFO.solution.html"> Single First-Order kinetics </a></p> - <ul> - <li><code><a href="SFO.solution.html">SFO.solution</a></code></li> - </ul> - - <p><a href="FOMC.solution.html"> First-Order Multi-Compartment kinetics </a></p> - <ul> - <li><code><a href="FOMC.solution.html">FOMC.solution</a></code></li> - </ul> - - <p><a href="DFOP.solution.html"> -</a></p> - <ul> - <li><code><a href="DFOP.solution.html">DFOP.solution</a></code></li> - </ul> - - <p><a href="SFORB.solution.html"> Single First-Order Reversible Binding kinetics </a></p> - <ul> - <li><code><a href="SFORB.solution.html">SFORB.solution</a></code></li> - </ul> - - <p><a href="HS.solution.html"> Hockey-Stick kinetics </a></p> - <ul> - <li><code><a href="HS.solution.html">HS.solution</a></code></li> - </ul> - - <p><a href="IORE.solution.html"> Indeterminate order rate equation kinetics </a></p> - <ul> - <li><code><a href="IORE.solution.html">IORE.solution</a></code></li> - </ul> - <h2 id="section-generate-synthetic-datasets" class="hasAnchor"><a href="#section-generate-synthetic-datasets" class="anchor"></a>Generate synthetic datasets</h2> - <p class="section-desc"></p> + <colgroup> + <col class="alias" /> + <col class="title" /> + </colgroup> - - <p><a href="add_err.html"> -</a></p> - <ul> - <li><code><a href="add_err.html">add_err</a></code></li> - </ul> - <h2 id="section-deprecated-functions" class="hasAnchor"><a href="#section-deprecated-functions" class="anchor"></a>Deprecated functions</h2> - <p class="section-desc"><p>Functions that have been superseeded</p></p> - - - <p><a href="mkinplot.html"> -</a></p> - <ul> - <li><code><a href="mkinplot.html">mkinplot</a></code></li> - </ul> - + <tbody> + <tr> + <th colspan="2"> + <h2 id="section-main-functions" class="hasAnchor"><a href="#section-main-functions" class="anchor"></a>Main functions</h2> + <p class="section-desc"><p>Essential functionality</p></p> + </th> + </tr> + <tr> + <!-- --> + <td> + <p><code><a href="mkinmod.html">mkinmod</a></code> </p> + </td> + <td><p>Function to set up a kinetic model with one or more state variables</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="mkinfit.html">mkinfit</a></code> </p> + </td> + <td><p>Fit a kinetic model to data with one or more state variables</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="mmkin.html">mmkin</a></code> </p> + </td> + <td><p>Fit one or more kinetic models with one or more state variables to one or more datasets</p></td> + </tr> + </tbody><tbody> + <tr> + <th colspan="2"> + <h2 id="section-show-results" class="hasAnchor"><a href="#section-show-results" class="anchor"></a>Show results</h2> + <p class="section-desc"><p>Functions working with mkinfit objects</p></p> + </th> + </tr> + <tr> + <!-- --> + <td> + <p><code><a href="plot.mkinfit.html">plot.mkinfit</a></code> </p> + </td> + <td><p>Plot the observed data and the fitted model of an mkinfit object</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="summary.mkinfit.html">summary</a></code> <code><a href="summary.mkinfit.html">print</a></code> </p> + </td> + <td><p>Summary method for class "mkinfit"</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="mkinresplot.html">mkinresplot</a></code> </p> + </td> + <td><p>Function to plot residuals stored in an mkin object</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="mkinparplot.html">mkinparplot</a></code> </p> + </td> + <td><p>Function to plot the confidence intervals obtained using mkinfit</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="endpoints.html">endpoints</a></code> </p> + </td> + <td><p>Function to calculate endpoints for further use from kinetic models fitted with mkinfit</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="mkinerrmin.html">mkinerrmin</a></code> </p> + </td> + <td><p>Calculate the minimum error to assume in order to pass the variance test</p></td> + </tr> + </tbody><tbody> + <tr> + <th colspan="2"> + <h2 id="section-work-with-mmkin-objects" class="hasAnchor"><a href="#section-work-with-mmkin-objects" class="anchor"></a>Work with mmkin objects</h2> + <p class="section-desc"><p>Functions working with aggregated results</p></p> + </th> + </tr> + <tr> + <!-- --> + <td> + <p><code><a href="plot.mmkin.html">plot</a></code> </p> + </td> + <td><p>Plot model fits (observed and fitted) and the residuals for a row or column of an mmkin object</p></td> + </tr> + </tbody><tbody> + <tr> + <th colspan="2"> + <h2 id="section-datasets-and-known-results" class="hasAnchor"><a href="#section-datasets-and-known-results" class="anchor"></a>Datasets and known results</h2> + <p class="section-desc"></p> + </th> + </tr> + <tr> + <!-- --> + <td> + <p><code><a href="FOCUS_2006_datasets.html">FOCUS_2006_datasets</a></code> </p> + </td> + <td><p>Datasets A to F from the FOCUS Kinetics report from 2006</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="FOCUS_2006_SFO_ref_A_to_F.html">data</a></code> </p> + </td> + <td><p>Results of fitting the SFO model to Datasets A to F of FOCUS (2006)</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="FOCUS_2006_FOMC_ref_A_to_F.html">data</a></code> </p> + </td> + <td><p>Results of fitting the FOMC model to Datasets A to F of FOCUS (2006)</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="FOCUS_2006_HS_ref_A_to_F.html">data</a></code> </p> + </td> + <td><p>Results of fitting the HS model to Datasets A to F of FOCUS (2006)</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="FOCUS_2006_DFOP_ref_A_to_B.html">data</a></code> </p> + </td> + <td><p>Results of fitting the DFOP model to Datasets A to B of FOCUS (2006)</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="mccall81_245T.html">mccall81_245T</a></code> </p> + </td> + <td><p>Datasets on aerobic soil metabolism of 2,4,5-T in six soils</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="schaefer07_complex_case.html">data</a></code> </p> + </td> + <td><p>Metabolism data set used for checking the software quality of KinGUI</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="synthetic_data_for_UBA.html">synthetic_data_for_UBA_2014</a></code> </p> + </td> + <td><p>Synthetic datasets for one parent compound with two metabolites</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="mkinds.html">mkinds</a></code> </p> + </td> + <td><p>A dataset class for mkin</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="print.mkinds.html">print</a></code> </p> + </td> + <td><p>Print mkinds objects</p></td> + </tr> + </tbody><tbody> + <tr> + <th colspan="2"> + <h2 id="section-helper-functions" class="hasAnchor"><a href="#section-helper-functions" class="anchor"></a>Helper functions</h2> + <p class="section-desc"></p> + </th> + </tr> + <tr> + <!-- --> + <td> + <p><code><a href="mkin_wide_to_long.html">mkin_wide_to_long</a></code> </p> + </td> + <td><p>Convert a dataframe with observations over time into long format</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="mkin_long_to_wide.html">mkin_long_to_wide</a></code> </p> + </td> + <td><p>Convert a dataframe from long to wide format</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="mkinsub.html">mkinsub</a></code> </p> + </td> + <td><p>Function to set up a kinetic submodel for one state variable</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="print.mkinmod.html">print</a></code> </p> + </td> + <td><p>Print mkinmod objects</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="mkinpredict.html">mkinpredict</a></code> </p> + </td> + <td><p>Produce predictions from a kinetic model using specific parameters</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="transform_odeparms.html">transform_odeparms</a></code> <code><a href="transform_odeparms.html">backtransform_odeparms</a></code> </p> + </td> + <td><p>Functions to transform and backtransform kinetic parameters for fitting</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="ilr.html">ilr</a></code> <code><a href="ilr.html">invilr</a></code> </p> + </td> + <td><p>Function to perform isometric log-ratio transformation</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="geometric_mean.html">geometric_mean</a></code> </p> + </td> + <td><p>Calculate the geometric mean</p></td> + </tr> + </tbody><tbody> + <tr> + <th colspan="2"> + <h2 id="section-analytical-solutions" class="hasAnchor"><a href="#section-analytical-solutions" class="anchor"></a>Analytical solutions</h2> + <p class="section-desc"><p>Parent only model solutions</p></p> + </th> + </tr> + <tr> + <!-- --> + <td> + <p><code><a href="SFO.solution.html">SFO.solution</a></code> </p> + </td> + <td><p>Single First-Order kinetics</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="FOMC.solution.html">FOMC.solution</a></code> </p> + </td> + <td><p>First-Order Multi-Compartment kinetics</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="DFOP.solution.html">DFOP.solution</a></code> </p> + </td> + <td><p>Double First-Order in Parallel kinetics</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="SFORB.solution.html">SFORB.solution</a></code> </p> + </td> + <td><p>Single First-Order Reversible Binding kinetics</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="HS.solution.html">HS.solution</a></code> </p> + </td> + <td><p>Hockey-Stick kinetics</p></td> + </tr><tr> + <!-- --> + <td> + <p><code><a href="IORE.solution.html">IORE.solution</a></code> </p> + </td> + <td><p>Indeterminate order rate equation kinetics</p></td> + </tr> + </tbody><tbody> + <tr> + <th colspan="2"> + <h2 id="section-generate-synthetic-datasets" class="hasAnchor"><a href="#section-generate-synthetic-datasets" class="anchor"></a>Generate synthetic datasets</h2> + <p class="section-desc"></p> + </th> + </tr> + <tr> + <!-- --> + <td> + <p><code><a href="add_err.html">add_err</a></code> </p> + </td> + <td><p>Add normally distributed errors to simulated kinetic degradation data</p></td> + </tr> + </tbody><tbody> + <tr> + <th colspan="2"> + <h2 id="section-deprecated-functions" class="hasAnchor"><a href="#section-deprecated-functions" class="anchor"></a>Deprecated functions</h2> + <p class="section-desc"><p>Functions that have been superseeded</p></p> + </th> + </tr> + <tr> + <!-- --> + <td> + <p><code><a href="mkinplot.html">mkinplot</a></code> </p> + </td> + <td><p>Plot the observed data and the fitted model of an mkinfit object</p></td> + </tr> + </tbody> + </table> </div> </div> diff --git a/docs/reference/mccall81_245T.html b/docs/reference/mccall81_245T.html index 4fa32b30..9a681191 100644 --- a/docs/reference/mccall81_245T.html +++ b/docs/reference/mccall81_245T.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — mccall81_245T • mkin</title> +<title>Datasets on aerobic soil metabolism of 2,4,5-T in six soils — mccall81_245T • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Datasets on aerobic soil metabolism of 2,4,5-T in six soils</h1> </div> @@ -106,21 +109,20 @@ extracts.</p> - <pre><span class='no'>mccall81_245T</span></pre> + <pre class="usage"><span class='no'>mccall81_245T</span></pre> <h2 class="hasAnchor" id="format"><a class="anchor" href="#format"></a>Format</h2> - <p>A dataframe containing the following variables. - <dl class='dl-horizontal'> - <dt><code>name</code></dt><dd>the name of the compound observed. Note that T245 is used as + <p>A dataframe containing the following variables.</p><dl class='dl-horizontal'> + <dt><code>name</code></dt><dd><p>the name of the compound observed. Note that T245 is used as an acronym for 2,4,5-T. T245 is a legitimate object name in R, which is necessary for specifying models using - <code><a href='mkinmod.html'>mkinmod</a></code>.</dd> - <dt><code>time</code></dt><dd>a numeric vector containing sampling times in days after - treatment</dd> - <dt><code>value</code></dt><dd>a numeric vector containing concentrations in percent of applied radioactivity</dd> - <dt><code>soil</code></dt><dd>a factor containing the name of the soil</dd> - </dl></p> + <code><a href='mkinmod.html'>mkinmod</a></code>.</p></dd> + <dt><code>time</code></dt><dd><p>a numeric vector containing sampling times in days after + treatment</p></dd> + <dt><code>value</code></dt><dd><p>a numeric vector containing concentrations in percent of applied radioactivity</p></dd> + <dt><code>soil</code></dt><dd><p>a factor containing the name of the soil</p></dd> + </dl> <h2 class="hasAnchor" id="source"><a class="anchor" href="#source"></a>Source</h2> @@ -132,16 +134,11 @@ <pre class="examples"><div class='input'> <span class='no'>SFO_SFO_SFO</span> <span class='kw'><-</span> <span class='fu'><a href='mkinmod.html'>mkinmod</a></span>(<span class='kw'>T245</span> <span class='kw'>=</span> <span class='fu'>list</span>(<span class='kw'>type</span> <span class='kw'>=</span> <span class='st'>"SFO"</span>, <span class='kw'>to</span> <span class='kw'>=</span> <span class='st'>"phenol"</span>), <span class='kw'>phenol</span> <span class='kw'>=</span> <span class='fu'>list</span>(<span class='kw'>type</span> <span class='kw'>=</span> <span class='st'>"SFO"</span>, <span class='kw'>to</span> <span class='kw'>=</span> <span class='st'>"anisole"</span>), <span class='kw'>anisole</span> <span class='kw'>=</span> <span class='fu'>list</span>(<span class='kw'>type</span> <span class='kw'>=</span> <span class='st'>"SFO"</span>))</div><div class='output co'>#> <span class='message'>Successfully compiled differential equation model from auto-generated C code.</span></div><div class='input'> - <span class='no'>fit.1</span> <span class='kw'><-</span> <span class='fu'><a href='mkinfit.html'>mkinfit</a></span>(<span class='no'>SFO_SFO_SFO</span>, <span class='fu'>subset</span>(<span class='no'>mccall81_245T</span>, <span class='no'>soil</span> <span class='kw'>==</span> <span class='st'>"Commerce"</span>), <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>)</div><div class='output co'>#> <span class='warning'>Warning: Optimisation by method Port did not converge.</span> -#> <span class='warning'>Convergence code is 1</span></div><div class='input'> <span class='fu'>summary</span>(<span class='no'>fit.1</span>, <span class='kw'>data</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>)</div><div class='output co'>#> mkin version: 0.9.45.1 -#> R version: 3.3.3 -#> Date of fit: Wed Mar 15 09:44:52 2017 -#> Date of summary: Wed Mar 15 09:44:52 2017 -#> -#> -#> Warning: Optimisation by method Port did not converge. -#> Convergence code is 1 -#> + <span class='no'>fit.1</span> <span class='kw'><-</span> <span class='fu'><a href='mkinfit.html'>mkinfit</a></span>(<span class='no'>SFO_SFO_SFO</span>, <span class='fu'>subset</span>(<span class='no'>mccall81_245T</span>, <span class='no'>soil</span> <span class='kw'>==</span> <span class='st'>"Commerce"</span>), <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>) + <span class='fu'>summary</span>(<span class='no'>fit.1</span>, <span class='kw'>data</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>)</div><div class='output co'>#> mkin version: 0.9.45.2 +#> R version: 3.4.0 +#> Date of fit: Fri May 5 12:45:02 2017 +#> Date of summary: Fri May 5 12:45:02 2017 #> #> Equations: #> d_T245/dt = - k_T245_sink * T245 - k_T245_phenol * T245 @@ -151,7 +148,7 @@ #> #> Model predictions using solution type deSolve #> -#> Fitted with method Port using 590 model solutions performed in 3.519 s +#> Fitted with method Port using 612 model solutions performed in 3.576 s #> #> Weighting: none #> @@ -183,7 +180,7 @@ #> T245_0 103.9000 NA NA NA #> log_k_T245_sink -4.1130 NA NA NA #> log_k_T245_phenol -3.6120 NA NA NA -#> log_k_phenol_sink -26.3900 NA NA NA +#> log_k_phenol_sink -26.8400 NA NA NA #> log_k_phenol_anisole -0.9037 NA NA NA #> log_k_anisole_sink -5.0090 NA NA NA #> @@ -198,8 +195,8 @@ #> Estimate t value Pr(>t) Lower Upper #> T245_0 1.039e+02 4.282e+01 7.236e-20 NA NA #> k_T245_sink 1.636e-02 8.901e-01 1.926e-01 NA NA -#> k_T245_phenol 2.701e-02 1.504e+00 7.498e-02 NA NA -#> k_phenol_sink 3.457e-12 1.230e-11 5.000e-01 NA NA +#> k_T245_phenol 2.701e-02 1.504e+00 7.499e-02 NA NA +#> k_phenol_sink 2.212e-12 7.870e-12 5.000e-01 NA NA #> k_phenol_anisole 4.051e-01 2.518e+00 1.075e-02 NA NA #> k_anisole_sink 6.679e-03 8.146e+00 9.469e-08 NA NA #> @@ -214,7 +211,7 @@ #> ff #> T245_sink 3.772e-01 #> T245_phenol 6.228e-01 -#> phenol_sink 8.534e-12 +#> phenol_sink 5.462e-12 #> phenol_anisole 1.000e+00 #> anisole_sink 1.000e+00 #> @@ -228,10 +225,10 @@ <span class='no'>fit.2</span> <span class='kw'><-</span> <span class='fu'><a href='mkinfit.html'>mkinfit</a></span>(<span class='no'>SFO_SFO_SFO</span>, <span class='fu'>subset</span>(<span class='no'>mccall81_245T</span>, <span class='no'>soil</span> <span class='kw'>==</span> <span class='st'>"Commerce"</span>), <span class='kw'>parms.ini</span> <span class='kw'>=</span> <span class='fu'>c</span>(<span class='kw'>k_phenol_sink</span> <span class='kw'>=</span> <span class='fl'>0</span>), <span class='kw'>fixed_parms</span> <span class='kw'>=</span> <span class='st'>"k_phenol_sink"</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>) - <span class='fu'>summary</span>(<span class='no'>fit.2</span>, <span class='kw'>data</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>)</div><div class='output co'>#> mkin version: 0.9.45.1 -#> R version: 3.3.3 -#> Date of fit: Wed Mar 15 09:44:54 2017 -#> Date of summary: Wed Mar 15 09:44:54 2017 + <span class='fu'>summary</span>(<span class='no'>fit.2</span>, <span class='kw'>data</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>)</div><div class='output co'>#> mkin version: 0.9.45.2 +#> R version: 3.4.0 +#> Date of fit: Fri May 5 12:45:04 2017 +#> Date of summary: Fri May 5 12:45:04 2017 #> #> Equations: #> d_T245/dt = - k_T245_sink * T245 - k_T245_phenol * T245 @@ -241,7 +238,7 @@ #> #> Model predictions using solution type deSolve #> -#> Fitted with method Port using 246 model solutions performed in 1.449 s +#> Fitted with method Port using 246 model solutions performed in 1.461 s #> #> Weighting: none #> diff --git a/docs/reference/mkin_long_to_wide.html b/docs/reference/mkin_long_to_wide.html index 9b37726e..8d6432ae 100644 --- a/docs/reference/mkin_long_to_wide.html +++ b/docs/reference/mkin_long_to_wide.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — mkin_long_to_wide • mkin</title> +<title>Convert a dataframe from long to wide format — mkin_long_to_wide • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Convert a dataframe from long to wide format</h1> </div> @@ -106,25 +109,26 @@ dependent variables as columns.</p> - <pre><span class='fu'>mkin_long_to_wide</span>(<span class='no'>long_data</span>, <span class='kw'>time</span> <span class='kw'>=</span> <span class='st'>"time"</span>, <span class='kw'>outtime</span> <span class='kw'>=</span> <span class='st'>"time"</span>)</pre> + <pre class="usage"><span class='fu'>mkin_long_to_wide</span>(<span class='no'>long_data</span>, <span class='kw'>time</span> <span class='kw'>=</span> <span class='st'>"time"</span>, <span class='kw'>outtime</span> <span class='kw'>=</span> <span class='st'>"time"</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>long_data</dt> - <dd> - The dataframe must contain one variable called "time" with the time values specified by the - <code>time</code> argument, one column called "name" with the grouping of the observed values, and - finally one column of observed values called "value". -</dd> - <dt>time</dt> - <dd> - The name of the time variable in the long input data. -</dd> - <dt>outtime</dt> - <dd> - The name of the time variable in the wide output data. -</dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>long_data</th> + <td><p>The dataframe must contain one variable called "time" with the time values specified by the + <code>time</code> argument, one column called "name" with the grouping of the observed values, and + finally one column of observed values called "value".</p></td> + </tr> + <tr> + <th>time</th> + <td><p>The name of the time variable in the long input data.</p></td> + </tr> + <tr> + <th>outtime</th> + <td><p>The name of the time variable in the wide output data.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> diff --git a/docs/reference/mkin_wide_to_long.html b/docs/reference/mkin_wide_to_long.html index 378d3691..fbb079be 100644 --- a/docs/reference/mkin_wide_to_long.html +++ b/docs/reference/mkin_wide_to_long.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — mkin_wide_to_long • mkin</title> +<title>Convert a dataframe with observations over time into long format — mkin_wide_to_long • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Convert a dataframe with observations over time into long format</h1> </div> @@ -105,20 +108,21 @@ dependent variable and converts it into the long form as required by <code>modCost</code>.</p> - <pre><span class='fu'>mkin_wide_to_long</span>(<span class='no'>wide_data</span>, <span class='kw'>time</span> <span class='kw'>=</span> <span class='st'>"t"</span>)</pre> + <pre class="usage"><span class='fu'>mkin_wide_to_long</span>(<span class='no'>wide_data</span>, <span class='kw'>time</span> <span class='kw'>=</span> <span class='st'>"t"</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>wide_data</dt> - <dd> - The dataframe must contain one variable with the time values specified by the - <code>time</code> argument and usually more than one column of observed values. -</dd> - <dt>time</dt> - <dd> - The name of the time variable. -</dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>wide_data</th> + <td><p>The dataframe must contain one variable with the time values specified by the + <code>time</code> argument and usually more than one column of observed values.</p></td> + </tr> + <tr> + <th>time</th> + <td><p>The name of the time variable.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> diff --git a/docs/reference/mkinds.html b/docs/reference/mkinds.html index 4bfd332b..1c10c54a 100644 --- a/docs/reference/mkinds.html +++ b/docs/reference/mkinds.html @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -102,7 +107,7 @@ <p>A dataset class for mkin</p> - <pre><span class='no'>mkinds</span></pre> + <pre class="usage"><span class='no'>mkinds</span></pre> <h2 class="hasAnchor" id="format"><a class="anchor" href="#format"></a>Format</h2> @@ -110,17 +115,17 @@ <h2 class="hasAnchor" id="fields"><a class="anchor" href="#fields"></a>Fields</h2> - <p></p> - <p><dl class='dl-horizontal'> -<dt><code>title</code></dt><dd>A full title for the dataset</dd></p> - <p><dt><code>sampling</code></dt><dd>times The sampling times</dd></p> - <p><dt><code>time_unit</code></dt><dd>The time unit</dd></p> - <p><dt><code>observed</code></dt><dd>Names of the observed compounds</dd></p> - <p><dt><code>unit</code></dt><dd>The unit of the observations</dd></p> - <p><dt><code>replicates</code></dt><dd>The number of replicates</dd></p> - <p><dt><code>data</code></dt><dd>A dataframe with at least the columns name, time and value -in order to be compatible with mkinfit</dd> -</dl></p> + + <dl class='dl-horizontal'> +<dt><code>title</code></dt><dd><p>A full title for the dataset</p></dd> + <dt><code>sampling</code></dt><dd><p>times The sampling times</p></dd> + <dt><code>time_unit</code></dt><dd><p>The time unit</p></dd> + <dt><code>observed</code></dt><dd><p>Names of the observed compounds</p></dd> + <dt><code>unit</code></dt><dd><p>The unit of the observations</p></dd> + <dt><code>replicates</code></dt><dd><p>The number of replicates</p></dd> + <dt><code>data</code></dt><dd><p>A dataframe with at least the columns name, time and value +in order to be compatible with mkinfit</p></dd> +</dl> <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> diff --git a/docs/reference/mkinerrmin.html b/docs/reference/mkinerrmin.html index 97616a41..678750cd 100644 --- a/docs/reference/mkinerrmin.html +++ b/docs/reference/mkinerrmin.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — mkinerrmin • mkin</title> +<title>Calculate the minimum error to assume in order to pass the variance test — mkinerrmin • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Calculate the minimum error to assume in order to pass the variance test</h1> </div> @@ -105,25 +108,33 @@ chi-squared test as defined in the FOCUS kinetics report from 2006.</p> - <pre><span class='fu'>mkinerrmin</span>(<span class='no'>fit</span>, <span class='kw'>alpha</span> <span class='kw'>=</span> <span class='fl'>0.05</span>)</pre> + <pre class="usage"><span class='fu'>mkinerrmin</span>(<span class='no'>fit</span>, <span class='kw'>alpha</span> <span class='kw'>=</span> <span class='fl'>0.05</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>fit</dt> - <dd> - an object of class <code><a href='mkinfit.html'>mkinfit</a></code>. - </dd> - <dt>alpha</dt> - <dd> - The confidence level chosen for the chi-squared test. -</dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>fit</th> + <td><p>an object of class <code><a href='mkinfit.html'>mkinfit</a></code>.</p></td> + </tr> + <tr> + <th>alpha</th> + <td><p>The confidence level chosen for the chi-squared test.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> <p>A dataframe with the following components:</p> - <p>The dataframe has one row for the total dataset and one further row for - each observed state variable in the model.</p> +<dt>err.min</dt><dd><p>The relative error, expressed as a fraction.</p></dd> + <dt>n.optim</dt><dd><p>The number of optimised parameters attributed to the data series.</p></dd> + <dt>df</dt><dd><p>The number of remaining degrees of freedom for the chi2 error level + calculations. Note that mean values are used for the chi2 statistic and + therefore every time point with observed values in the series only counts + one time.</p></dd> + The dataframe has one row for the total dataset and one further row for + each observed state variable in the model. + <h2 class="hasAnchor" id="details"><a class="anchor" href="#details"></a>Details</h2> @@ -135,7 +146,7 @@ chi-squared test as defined in the FOCUS kinetics report from 2006.</p> Degradation Kinetics from Environmental Fate Studies on Pesticides in EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, - <a href = 'http://focus.jrc.ec.europa.eu/dk'>http://focus.jrc.ec.europa.eu/dk</a></p> + <a href = 'http://esdac.jrc.europa.eu/projects/degradation-kinetics'>http://esdac.jrc.europa.eu/projects/degradation-kinetics</a></p> <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> diff --git a/docs/reference/mkinfit.html b/docs/reference/mkinfit.html index 01c930e2..875bd1dd 100644 --- a/docs/reference/mkinfit.html +++ b/docs/reference/mkinfit.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — mkinfit • mkin</title> +<title>Fit a kinetic model to data with one or more state variables — mkinfit • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Fit a kinetic model to data with one or more state variables</h1> </div> @@ -111,10 +114,10 @@ In each step of the optimsation, the kinetic model is solved using the function <code><a href='mkinpredict.html'>mkinpredict</a></code>. The variance of the residuals for each observed variable can optionally be iteratively reweighted until convergence - using the argument <code>reweight.method = "obs"</code>.</p> + using the argument <code>reweight.method = "obs"</code>.</p> - <pre><span class='fu'>mkinfit</span>(<span class='no'>mkinmod</span>, <span class='no'>observed</span>, + <pre class="usage"><span class='fu'>mkinfit</span>(<span class='no'>mkinmod</span>, <span class='no'>observed</span>, <span class='kw'>parms.ini</span> <span class='kw'>=</span> <span class='st'>"auto"</span>, <span class='kw'>state.ini</span> <span class='kw'>=</span> <span class='st'>"auto"</span>, <span class='kw'>fixed_parms</span> <span class='kw'>=</span> <span class='kw'>NULL</span>, <span class='kw'>fixed_initials</span> <span class='kw'>=</span> <span class='fu'>names</span>(<span class='no'>mkinmod</span>$<span class='no'>diffs</span>)[-<span class='fl'>1</span>], @@ -135,228 +138,225 @@ <span class='kw'>trace_parms</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>, <span class='no'>...</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>mkinmod</dt> - <dd> - A list of class <code><a href='mkinmod.html'>mkinmod</a></code>, containing the kinetic model to be - fitted to the data, or one of the shorthand names ("SFO", "FOMC", "DFOP", - "HS", "SFORB"). If a shorthand name is given, a parent only degradation + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>mkinmod</th> + <td><p>A list of class <code><a href='mkinmod.html'>mkinmod</a></code>, containing the kinetic model to be + fitted to the data, or one of the shorthand names ("SFO", "FOMC", "DFOP", + "HS", "SFORB"). If a shorthand name is given, a parent only degradation model is generated for the variable with the highest value in - <code>observed</code>. - </dd> - <dt>observed</dt> - <dd> - The observed data. It has to be in the long format as described in - <code>modFit</code>, i.e. the first column called "name" must contain the + <code>observed</code>.</p></td> + </tr> + <tr> + <th>observed</th> + <td><p>The observed data. It has to be in the long format as described in + <code>modFit</code>, i.e. the first column called "name" must contain the name of the observed variable for each data point. The second column must - contain the times of observation, named "time". The third column must be - named "value" and contain the observed values. Optionally, a further column + contain the times of observation, named "time". The third column must be + named "value" and contain the observed values. Optionally, a further column can contain weights for each data point. Its name must be passed as a further argument named <code>err</code> which is then passed on to - <code>modFit</code>. - </dd> - <dt>parms.ini</dt> - <dd> - A named vector of initial values for the parameters, including parameters + <code>modFit</code>.</p></td> + </tr> + <tr> + <th>parms.ini</th> + <td><p>A named vector of initial values for the parameters, including parameters to be optimised and potentially also fixed parameters as indicated by - <code>fixed_parms</code>. If set to "auto", initial values for rate constants + <code>fixed_parms</code>. If set to "auto", initial values for rate constants are set to default values. Using parameter names that are not in the model - gives an error. - - It is possible to only specify a subset of the parameters that the model - needs. You can use the parameter lists "bparms.ode" from a previously + gives an error.</p> +<p>It is possible to only specify a subset of the parameters that the model + needs. You can use the parameter lists "bparms.ode" from a previously fitted model, which contains the differential equation parameters from this model. This works nicely if the models are nested. An example is given - below. - </dd> - <dt>state.ini</dt> - <dd> - A named vector of initial values for the state variables of the model. In + below.</p></td> + </tr> + <tr> + <th>state.ini</th> + <td><p>A named vector of initial values for the state variables of the model. In case the observed variables are represented by more than one model variable, the names will differ from the names of the observed variables (see <code>map</code> component of <code><a href='mkinmod.html'>mkinmod</a></code>). The default is to set the initial value of the first model variable to the mean of the time zero values for the variable with the maximum observed value, and all others to 0. - If this variable has no time zero observations, its initial value is set to 100. - </dd> - <dt>fixed_parms</dt> - <dd> - The names of parameters that should not be optimised but rather kept at the - values specified in <code>parms.ini</code>. - </dd> - <dt>fixed_initials</dt> - <dd> - The names of model variables for which the initial state at time 0 should + If this variable has no time zero observations, its initial value is set to 100.</p></td> + </tr> + <tr> + <th>fixed_parms</th> + <td><p>The names of parameters that should not be optimised but rather kept at the + values specified in <code>parms.ini</code>.</p></td> + </tr> + <tr> + <th>fixed_initials</th> + <td><p>The names of model variables for which the initial state at time 0 should be excluded from the optimisation. Defaults to all state variables except - for the first one. - </dd> - <dt>from_max_mean</dt> - <dd> - If this is set to TRUE, and the model has only one observed variable, then + for the first one.</p></td> + </tr> + <tr> + <th>from_max_mean</th> + <td><p>If this is set to TRUE, and the model has only one observed variable, then data before the time of the maximum observed value (after averaging for each sampling time) are discarded, and this time is subtracted from all remaining time values, so the time of the maximum observed mean value is - the new time zero. - </dd> - <dt>solution_type</dt> - <dd> - If set to "eigen", the solution of the system of differential equations is + the new time zero.</p></td> + </tr> + <tr> + <th>solution_type</th> + <td><p>If set to "eigen", the solution of the system of differential equations is based on the spectral decomposition of the coefficient matrix in cases that - this is possible. If set to "deSolve", a numerical ode solver from package - <code>deSolve</code> is used. If set to "analytical", an analytical + this is possible. If set to "deSolve", a numerical ode solver from package + <code>deSolve</code> is used. If set to "analytical", an analytical solution of the model is used. This is only implemented for simple degradation experiments with only one state variable, i.e. with no - metabolites. The default is "auto", which uses "analytical" if possible, - otherwise "eigen" if the model can be expressed using eigenvalues and - eigenvectors, and finally "deSolve" for the remaining models (time + metabolites. The default is "auto", which uses "analytical" if possible, + otherwise "eigen" if the model can be expressed using eigenvalues and + eigenvectors, and finally "deSolve" for the remaining models (time dependence of degradation rates and metabolites). This argument is passed - on to the helper function <code><a href='mkinpredict.html'>mkinpredict</a></code>. - </dd> - <dt>method.ode</dt> - <dd> - The solution method passed via <code><a href='mkinpredict.html'>mkinpredict</a></code> to - <code>ode</code> in case the solution type is "deSolve". The default - "lsoda" is performant, but sometimes fails to converge. - </dd> - <dt>use_compiled</dt> - <dd> - If set to <code>FALSE</code>, no compiled version of the <code><a href='mkinmod.html'>mkinmod</a></code> + on to the helper function <code><a href='mkinpredict.html'>mkinpredict</a></code>.</p></td> + </tr> + <tr> + <th>method.ode</th> + <td><p>The solution method passed via <code><a href='mkinpredict.html'>mkinpredict</a></code> to + <code>ode</code> in case the solution type is "deSolve". The default + "lsoda" is performant, but sometimes fails to converge.</p></td> + </tr> + <tr> + <th>use_compiled</th> + <td><p>If set to <code>FALSE</code>, no compiled version of the <code><a href='mkinmod.html'>mkinmod</a></code> model is used, in the calls to <code><a href='mkinpredict.html'>mkinpredict</a></code> even if - a compiled verion is present. - </dd> - <dt>method.modFit</dt> - <dd> - The optimisation method passed to <code>modFit</code>. - - In order to optimally deal with problems where local minima occur, the - "Port" algorithm is now used per default as it is less prone to get trapped + a compiled verion is present.</p></td> + </tr> + <tr> + <th>method.modFit</th> + <td><p>The optimisation method passed to <code>modFit</code>.</p> +<p>In order to optimally deal with problems where local minima occur, the + "Port" algorithm is now used per default as it is less prone to get trapped in local minima and depends less on starting values for parameters than - the Levenberg Marquardt variant selected by "Marq". However, "Port" needs - more iterations. - - The former default "Marq" is the Levenberg Marquardt algorithm + the Levenberg Marquardt variant selected by "Marq". However, "Port" needs + more iterations.</p> +<p>The former default "Marq" is the Levenberg Marquardt algorithm <code>nls.lm</code> from the package <code>minpack.lm</code> and usually needs - the least number of iterations. - - The "Pseudo" algorithm is not included because it needs finite parameter bounds - which are currently not supported. - - The "Newton" algorithm is not included because its number of iterations + the least number of iterations.</p> +<p>The "Pseudo" algorithm is not included because it needs finite parameter bounds + which are currently not supported.</p> +<p>The "Newton" algorithm is not included because its number of iterations can not be controlled by <code>control.modFit</code> and it does not appear - to provide advantages over the other algorithms. - </dd> - <dt>maxit.modFit</dt> - <dd> - Maximum number of iterations in the optimisation. If not "auto", this will + to provide advantages over the other algorithms.</p></td> + </tr> + <tr> + <th>maxit.modFit</th> + <td><p>Maximum number of iterations in the optimisation. If not "auto", this will be passed to the method called by <code>modFit</code>, overriding - what may be specified in the next argument <code>control.modFit</code>. - </dd> - <dt>control.modFit</dt> - <dd> - Additional arguments passed to the optimisation method used by - <code>modFit</code>. - </dd> - <dt>transform_rates</dt> - <dd> - Boolean specifying if kinetic rate constants should be transformed in the + what may be specified in the next argument <code>control.modFit</code>.</p></td> + </tr> + <tr> + <th>control.modFit</th> + <td><p>Additional arguments passed to the optimisation method used by + <code>modFit</code>.</p></td> + </tr> + <tr> + <th>transform_rates</th> + <td><p>Boolean specifying if kinetic rate constants should be transformed in the model specification used in the fitting for better compliance with the assumption of normal distribution of the estimator. If TRUE, also alpha and beta parameters of the FOMC model are log-transformed, as well as k1 and k2 rate constants for the DFOP and HS models and the break point tb of the HS model. - If FALSE, zero is used as a lower bound for the rates in the optimisation. - </dd> - <dt>transform_fractions</dt> - <dd> - Boolean specifying if formation fractions constants should be transformed in the + If FALSE, zero is used as a lower bound for the rates in the optimisation.</p></td> + </tr> + <tr> + <th>transform_fractions</th> + <td><p>Boolean specifying if formation fractions constants should be transformed in the model specification used in the fitting for better compliance with the assumption of normal distribution of the estimator. The default (TRUE) is to do transformations. If TRUE, the g parameter of the DFOP and HS models are also transformed, as they can also be seen as compositional data. The transformation used for these transformations is the - <code><a href='ilr.html'>ilr</a></code> transformation. - </dd> - <dt>plot</dt> - <dd> - Should the observed values and the numerical solutions be plotted at each - stage of the optimisation? - </dd> - <dt>quiet</dt> - <dd> - Suppress printing out the current model cost after each improvement? - </dd> - <dt>err </dt> - <dd>either <code>NULL</code>, or the name of the column with the + <code><a href='ilr.html'>ilr</a></code> transformation.</p></td> + </tr> + <tr> + <th>plot</th> + <td><p>Should the observed values and the numerical solutions be plotted at each + stage of the optimisation?</p></td> + </tr> + <tr> + <th>quiet</th> + <td><p>Suppress printing out the current model cost after each improvement?</p></td> + </tr> + <tr> + <th>err </th> + <td><p>either <code>NULL</code>, or the name of the column with the <em>error</em> estimates, used to weigh the residuals (see details of - <code>modCost</code>); if <code>NULL</code>, then the residuals are not weighed. - </dd> - <dt>weight</dt> - <dd> - only if <code>err</code>=<code>NULL</code>: how to weight the residuals, one of "none", - "std", "mean", see details of <code>modCost</code>. - </dd> - <dt>scaleVar</dt> - <dd> - Will be passed to <code>modCost</code>. Default is not to scale Variables - according to the number of observations. - </dd> - <dt>atol</dt> - <dd> - Absolute error tolerance, passed to <code>ode</code>. Default is 1e-8, - lower than in <code>lsoda</code>. - </dd> - <dt>rtol</dt> - <dd> - Absolute error tolerance, passed to <code>ode</code>. Default is 1e-10, - much lower than in <code>lsoda</code>. - </dd> - <dt>n.outtimes</dt> - <dd> - The length of the dataseries that is produced by the model prediction + <code>modCost</code>); if <code>NULL</code>, then the residuals are not weighed.</p></td> + </tr> + <tr> + <th>weight</th> + <td><p>only if <code>err</code>=<code>NULL</code>: how to weight the residuals, one of "none", + "std", "mean", see details of <code>modCost</code>.</p></td> + </tr> + <tr> + <th>scaleVar</th> + <td><p>Will be passed to <code>modCost</code>. Default is not to scale Variables + according to the number of observations.</p></td> + </tr> + <tr> + <th>atol</th> + <td><p>Absolute error tolerance, passed to <code>ode</code>. Default is 1e-8, + lower than in <code>lsoda</code>.</p></td> + </tr> + <tr> + <th>rtol</th> + <td><p>Absolute error tolerance, passed to <code>ode</code>. Default is 1e-10, + much lower than in <code>lsoda</code>.</p></td> + </tr> + <tr> + <th>n.outtimes</th> + <td><p>The length of the dataseries that is produced by the model prediction function <code><a href='mkinpredict.html'>mkinpredict</a></code>. This impacts the accuracy of the numerical solver if that is used (see <code>solution_type</code> argument. - The default value is 100. - </dd> - <dt>reweight.method</dt> - <dd> - The method used for iteratively reweighting residuals, also known + The default value is 100.</p></td> + </tr> + <tr> + <th>reweight.method</th> + <td><p>The method used for iteratively reweighting residuals, also known as iteratively reweighted least squares (IRLS). Default is NULL, - the other method implemented is called "obs", meaning that each + the other method implemented is called "obs", meaning that each observed variable is assumed to have its own variance, this is estimated from the fit and used for weighting the residuals in each iteration until convergence of this estimate up to <code>reweight.tol</code> or up to the maximum number of iterations - specified by <code>reweight.max.iter</code>. - </dd> - <dt>reweight.tol</dt> - <dd> - Tolerance for convergence criterion for the variance components - in IRLS fits. - </dd> - <dt>reweight.max.iter</dt> - <dd> - Maximum iterations in IRLS fits. - </dd> - <dt>trace_parms</dt> - <dd> - Should a trace of the parameter values be listed? - </dd> - <dt>…</dt> - <dd> - Further arguments that will be passed to <code>modFit</code>. - </dd> - </dl> + specified by <code>reweight.max.iter</code>.</p></td> + </tr> + <tr> + <th>reweight.tol</th> + <td><p>Tolerance for convergence criterion for the variance components + in IRLS fits.</p></td> + </tr> + <tr> + <th>reweight.max.iter</th> + <td><p>Maximum iterations in IRLS fits.</p></td> + </tr> + <tr> + <th>trace_parms</th> + <td><p>Should a trace of the parameter values be listed?</p></td> + </tr> + <tr> + <th>…</th> + <td><p>Further arguments that will be passed to <code>modFit</code>.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> - <p>A list with "mkinfit" and "modFit" in the class attribute. + <p>A list with "mkinfit" and "modFit" in the class attribute. A summary can be obtained by <code><a href='summary.mkinfit.html'>summary.mkinfit</a></code>.</p> <h2 class="hasAnchor" id="see-also"><a class="anchor" href="#see-also"></a>See also</h2> <p>Plotting methods <code><a href='plot.mkinfit.html'>plot.mkinfit</a></code> and <code><a href='mkinparplot.html'>mkinparplot</a></code>.</p> - <p>Fitting of several models to several datasets in a single call to +<p>Fitting of several models to several datasets in a single call to <code><a href='mmkin.html'>mmkin</a></code>.</p> <h2 class="hasAnchor" id="note"><a class="anchor" href="#note"></a>Note</h2> @@ -368,8 +368,8 @@ <h2 class="hasAnchor" id="note"><a class="anchor" href="#note"></a>Note</h2> - <p>When using the "IORE" submodel for metabolites, fitting with - "transform_rates = TRUE" (the default) often leads to failures of the + <p>When using the "IORE" submodel for metabolites, fitting with + "transform_rates = TRUE" (the default) often leads to failures of the numerical ODE solver. In this situation it may help to switch off the internal rate transformation.</p> @@ -377,17 +377,17 @@ <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> <pre class="examples"><div class='input'><span class='co'># Use shorthand notation for parent only degradation</span> <span class='no'>fit</span> <span class='kw'><-</span> <span class='fu'>mkinfit</span>(<span class='st'>"FOMC"</span>, <span class='no'>FOCUS_2006_C</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>) -<span class='fu'>summary</span>(<span class='no'>fit</span>)</div><div class='output co'>#> mkin version: 0.9.45.1 -#> R version: 3.3.3 -#> Date of fit: Wed Mar 15 09:44:56 2017 -#> Date of summary: Wed Mar 15 09:44:56 2017 +<span class='fu'>summary</span>(<span class='no'>fit</span>)</div><div class='output co'>#> mkin version: 0.9.45.2 +#> R version: 3.4.0 +#> Date of fit: Fri May 5 12:45:06 2017 +#> Date of summary: Fri May 5 12:45:06 2017 #> #> Equations: #> d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent #> #> Model predictions using solution type analytical #> -#> Fitted with method Port using 64 model solutions performed in 0.146 s +#> Fitted with method Port using 64 model solutions performed in 0.206 s #> #> Weighting: none #> @@ -456,7 +456,7 @@ <span class='kw'>m1</span> <span class='kw'>=</span> <span class='fu'><a href='mkinsub.html'>mkinsub</a></span>(<span class='st'>"SFO"</span>))</div><div class='output co'>#> <span class='message'>Successfully compiled differential equation model from auto-generated C code.</span></div><div class='input'><span class='co'># Fit the model to the FOCUS example dataset D using defaults</span> <span class='fu'>print</span>(<span class='fu'>system.time</span>(<span class='no'>fit</span> <span class='kw'><-</span> <span class='fu'>mkinfit</span>(<span class='no'>SFO_SFO</span>, <span class='no'>FOCUS_2006_D</span>, <span class='kw'>solution_type</span> <span class='kw'>=</span> <span class='st'>"eigen"</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>)))</div><div class='output co'>#> user system elapsed -#> 1.216 1.268 0.942 </div><div class='input'><span class='fu'>coef</span>(<span class='no'>fit</span>)</div><div class='output co'>#> parent_0 log_k_parent_sink log_k_parent_m1 log_k_m1_sink +#> 0.912 0.000 0.915 </div><div class='input'><span class='fu'>coef</span>(<span class='no'>fit</span>)</div><div class='output co'>#> parent_0 log_k_parent_sink log_k_parent_m1 log_k_m1_sink #> 99.59848 -3.03822 -2.98030 -5.24750 </div><div class='input'><span class='fu'><a href='endpoints.html'>endpoints</a></span>(<span class='no'>fit</span>)</div><div class='output co'>#> $ff #> parent_sink parent_m1 m1_sink #> 0.485524 0.514476 1.000000 @@ -485,13 +485,13 @@ #> Model cost at call 33 : 874.2611 #> Model cost at call 35 : 616.2379 #> Model cost at call 37 : 616.2374 -#> Model cost at call 40 : 467.4388 +#> Model cost at call 40 : 467.4387 #> Model cost at call 42 : 467.4382 -#> Model cost at call 46 : 398.2914 -#> Model cost at call 48 : 398.2914 -#> Model cost at call 49 : 398.2913 -#> Model cost at call 51 : 395.0712 -#> Model cost at call 54 : 395.0711 +#> Model cost at call 46 : 398.2913 +#> Model cost at call 48 : 398.2912 +#> Model cost at call 49 : 398.2911 +#> Model cost at call 51 : 395.0711 +#> Model cost at call 54 : 395.071 #> Model cost at call 56 : 378.3298 #> Model cost at call 59 : 378.3298 #> Model cost at call 62 : 376.9812 @@ -514,9 +514,9 @@ #> Model cost at call 94 : 371.6464 #> Model cost at call 99 : 371.4299 #> Model cost at call 101 : 371.4299 -#> Model cost at call 104 : 371.407 -#> Model cost at call 106 : 371.407 -#> Model cost at call 107 : 371.407 +#> Model cost at call 104 : 371.4071 +#> Model cost at call 106 : 371.4071 +#> Model cost at call 107 : 371.4071 #> Model cost at call 109 : 371.2524 #> Model cost at call 113 : 371.2524 #> Model cost at call 114 : 371.2136 @@ -530,10 +530,12 @@ #> Model cost at call 126 : 371.2134 #> Model cost at call 135 : 371.2134 #> Model cost at call 147 : 371.2134 +#> Model cost at call 151 : 371.2134 #> Model cost at call 152 : 371.2134 +#> Model cost at call 153 : 371.2134 #> Optimisation by method Port successfully terminated. #> user system elapsed -#> 0.712 0.040 0.703 </div><div class='input'><span class='fu'>coef</span>(<span class='no'>fit.deSolve</span>)</div><div class='output co'>#> parent_0 log_k_parent_sink log_k_parent_m1 log_k_m1_sink +#> 0.792 0.000 0.793 </div><div class='input'><span class='fu'>coef</span>(<span class='no'>fit.deSolve</span>)</div><div class='output co'>#> parent_0 log_k_parent_sink log_k_parent_m1 log_k_m1_sink #> 99.59848 -3.03822 -2.98030 -5.24750 </div><div class='input'><span class='fu'><a href='endpoints.html'>endpoints</a></span>(<span class='no'>fit.deSolve</span>)</div><div class='output co'>#> $ff #> parent_sink parent_m1 m1_sink #> 0.485524 0.514476 1.000000 @@ -544,7 +546,7 @@ #> $distimes #> DT50 DT90 #> parent 7.022929 23.32967 -#> m1 131.760713 437.69961 +#> m1 131.760712 437.69961 #> </div><div class='input'> <span class='co'># Use stepwise fitting, using optimised parameters from parent only fit, FOMC</span> @@ -574,10 +576,10 @@ <span class='co'># Weighted fits, including IRLS</span> <span class='no'>SFO_SFO.ff</span> <span class='kw'><-</span> <span class='fu'><a href='mkinmod.html'>mkinmod</a></span>(<span class='kw'>parent</span> <span class='kw'>=</span> <span class='fu'><a href='mkinsub.html'>mkinsub</a></span>(<span class='st'>"SFO"</span>, <span class='st'>"m1"</span>), <span class='kw'>m1</span> <span class='kw'>=</span> <span class='fu'><a href='mkinsub.html'>mkinsub</a></span>(<span class='st'>"SFO"</span>), <span class='kw'>use_of_ff</span> <span class='kw'>=</span> <span class='st'>"max"</span>)</div><div class='output co'>#> <span class='message'>Successfully compiled differential equation model from auto-generated C code.</span></div><div class='input'><span class='no'>f.noweight</span> <span class='kw'><-</span> <span class='fu'>mkinfit</span>(<span class='no'>SFO_SFO.ff</span>, <span class='no'>FOCUS_2006_D</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>) -<span class='fu'>summary</span>(<span class='no'>f.noweight</span>)</div><div class='output co'>#> mkin version: 0.9.45.1 -#> R version: 3.3.3 -#> Date of fit: Wed Mar 15 09:45:07 2017 -#> Date of summary: Wed Mar 15 09:45:07 2017 +<span class='fu'>summary</span>(<span class='no'>f.noweight</span>)</div><div class='output co'>#> mkin version: 0.9.45.2 +#> R version: 3.4.0 +#> Date of fit: Fri May 5 12:45:17 2017 +#> Date of summary: Fri May 5 12:45:17 2017 #> #> Equations: #> d_parent/dt = - k_parent * parent @@ -585,7 +587,7 @@ #> #> Model predictions using solution type deSolve #> -#> Fitted with method Port using 185 model solutions performed in 0.753 s +#> Fitted with method Port using 185 model solutions performed in 0.746 s #> #> Weighting: none #> @@ -695,10 +697,10 @@ #> 100 m1 33.13 3.198e+01 1.148e+00 #> 120 m1 25.15 2.879e+01 -3.640e+00 #> 120 m1 33.31 2.879e+01 4.520e+00</div><div class='input'><span class='no'>f.irls</span> <span class='kw'><-</span> <span class='fu'>mkinfit</span>(<span class='no'>SFO_SFO.ff</span>, <span class='no'>FOCUS_2006_D</span>, <span class='kw'>reweight.method</span> <span class='kw'>=</span> <span class='st'>"obs"</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>) -<span class='fu'>summary</span>(<span class='no'>f.irls</span>)</div><div class='output co'>#> mkin version: 0.9.45.1 -#> R version: 3.3.3 -#> Date of fit: Wed Mar 15 09:45:09 2017 -#> Date of summary: Wed Mar 15 09:45:09 2017 +<span class='fu'>summary</span>(<span class='no'>f.irls</span>)</div><div class='output co'>#> mkin version: 0.9.45.2 +#> R version: 3.4.0 +#> Date of fit: Fri May 5 12:45:19 2017 +#> Date of summary: Fri May 5 12:45:19 2017 #> #> Equations: #> d_parent/dt = - k_parent * parent @@ -706,7 +708,7 @@ #> #> Model predictions using solution type deSolve #> -#> Fitted with method Port using 486 model solutions performed in 2.091 s +#> Fitted with method Port using 468 model solutions performed in 1.925 s #> #> Weighting: none then iterative reweighting method obs #> @@ -731,16 +733,16 @@ #> Optimised, transformed parameters with symmetric confidence intervals: #> Estimate Std. Error Lower Upper #> parent_0 99.67000 1.79200 96.04000 103.300 -#> log_k_parent -2.31200 0.04560 -2.40400 -2.220 +#> log_k_parent -2.31200 0.04560 -2.40400 -2.219 #> log_k_m1 -5.25100 0.12510 -5.50500 -4.998 #> f_parent_ilr_1 0.03785 0.06318 -0.09027 0.166 #> #> Parameter correlation: #> parent_0 log_k_parent log_k_m1 f_parent_ilr_1 -#> parent_0 1.0000 0.5083 -0.1979 -0.6148 +#> parent_0 1.0000 0.5083 -0.1979 -0.6147 #> log_k_parent 0.5083 1.0000 -0.3894 -0.6062 #> log_k_m1 -0.1979 -0.3894 1.0000 0.7417 -#> f_parent_ilr_1 -0.6148 -0.6062 0.7417 1.0000 +#> f_parent_ilr_1 -0.6147 -0.6062 0.7417 1.0000 #> #> Residual standard error: 1.054 on 36 degrees of freedom #> @@ -749,10 +751,10 @@ #> t-test (unrealistically) based on the assumption of normal distribution #> for estimators of untransformed parameters. #> Estimate t value Pr(>t) Lower Upper -#> parent_0 99.67000 55.630 8.183e-37 96.040000 1.033e+02 +#> parent_0 99.67000 55.630 8.181e-37 96.040000 1.033e+02 #> k_parent 0.09906 21.930 1.016e-22 0.090310 1.087e-01 #> k_m1 0.00524 7.996 8.487e-10 0.004066 6.753e-03 -#> f_parent_to_m1 0.51340 23.000 2.039e-23 0.468100 5.584e-01 +#> f_parent_to_m1 0.51340 23.000 2.038e-23 0.468100 5.584e-01 #> #> Chi2 error levels in percent: #> err.min n.optim df @@ -782,14 +784,14 @@ #> 7 parent 55.13 4.982e+01 5.309e+00 3.402 #> 14 parent 27.27 2.490e+01 2.367e+00 3.402 #> 14 parent 26.64 2.490e+01 1.737e+00 3.402 -#> 21 parent 11.50 1.245e+01 -9.477e-01 3.402 -#> 21 parent 11.64 1.245e+01 -8.077e-01 3.402 +#> 21 parent 11.50 1.245e+01 -9.476e-01 3.402 +#> 21 parent 11.64 1.245e+01 -8.076e-01 3.402 #> 35 parent 2.85 3.110e+00 -2.600e-01 3.402 #> 35 parent 2.91 3.110e+00 -2.000e-01 3.402 -#> 50 parent 0.69 7.037e-01 -1.375e-02 3.402 -#> 50 parent 0.63 7.037e-01 -7.375e-02 3.402 -#> 75 parent 0.05 5.913e-02 -9.134e-03 3.402 -#> 75 parent 0.06 5.913e-02 8.661e-04 3.402 +#> 50 parent 0.69 7.037e-01 -1.374e-02 3.402 +#> 50 parent 0.63 7.037e-01 -7.374e-02 3.402 +#> 75 parent 0.05 5.913e-02 -9.133e-03 3.402 +#> 75 parent 0.06 5.913e-02 8.666e-04 3.402 #> 100 parent NA 4.969e-03 NA 3.402 #> 100 parent NA 4.969e-03 NA 3.402 #> 120 parent NA 6.852e-04 NA 3.402 @@ -801,14 +803,14 @@ #> 3 m1 12.91 1.305e+01 -1.378e-01 2.722 #> 3 m1 12.96 1.305e+01 -8.779e-02 2.722 #> 7 m1 22.97 2.508e+01 -2.106e+00 2.722 -#> 7 m1 24.47 2.508e+01 -6.061e-01 2.722 +#> 7 m1 24.47 2.508e+01 -6.062e-01 2.722 #> 14 m1 41.69 3.671e+01 4.983e+00 2.722 #> 14 m1 33.21 3.671e+01 -3.497e+00 2.722 -#> 21 m1 44.37 4.165e+01 2.719e+00 2.722 -#> 21 m1 46.44 4.165e+01 4.789e+00 2.722 +#> 21 m1 44.37 4.165e+01 2.720e+00 2.722 +#> 21 m1 46.44 4.165e+01 4.790e+00 2.722 #> 35 m1 41.22 4.329e+01 -2.069e+00 2.722 #> 35 m1 37.95 4.329e+01 -5.339e+00 2.722 -#> 50 m1 41.19 4.119e+01 -3.388e-03 2.722 +#> 50 m1 41.19 4.119e+01 -3.376e-03 2.722 #> 50 m1 40.01 4.119e+01 -1.183e+00 2.722 #> 75 m1 40.09 3.644e+01 3.652e+00 2.722 #> 75 m1 33.85 3.644e+01 -2.588e+00 2.722 @@ -816,10 +818,10 @@ #> 100 m1 33.13 3.199e+01 1.140e+00 2.722 #> 120 m1 25.15 2.881e+01 -3.659e+00 2.722 #> 120 m1 33.31 2.881e+01 4.501e+00 2.722</div><div class='input'><span class='no'>f.w.mean</span> <span class='kw'><-</span> <span class='fu'>mkinfit</span>(<span class='no'>SFO_SFO.ff</span>, <span class='no'>FOCUS_2006_D</span>, <span class='kw'>weight</span> <span class='kw'>=</span> <span class='st'>"mean"</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>) -<span class='fu'>summary</span>(<span class='no'>f.w.mean</span>)</div><div class='output co'>#> mkin version: 0.9.45.1 -#> R version: 3.3.3 -#> Date of fit: Wed Mar 15 09:45:10 2017 -#> Date of summary: Wed Mar 15 09:45:10 2017 +<span class='fu'>summary</span>(<span class='no'>f.w.mean</span>)</div><div class='output co'>#> mkin version: 0.9.45.2 +#> R version: 3.4.0 +#> Date of fit: Fri May 5 12:45:20 2017 +#> Date of summary: Fri May 5 12:45:20 2017 #> #> Equations: #> d_parent/dt = - k_parent * parent @@ -827,7 +829,7 @@ #> #> Model predictions using solution type deSolve #> -#> Fitted with method Port using 155 model solutions performed in 0.661 s +#> Fitted with method Port using 155 model solutions performed in 0.699 s #> #> Weighting: mean #> @@ -871,7 +873,7 @@ #> for estimators of untransformed parameters. #> Estimate t value Pr(>t) Lower Upper #> parent_0 99.730000 51.630 1.166e-35 95.81000 1.036e+02 -#> k_parent 0.099360 20.670 7.304e-22 0.09007 1.096e-01 +#> k_parent 0.099360 20.670 7.303e-22 0.09007 1.096e-01 #> k_m1 0.005224 8.287 3.649e-10 0.00409 6.672e-03 #> f_parent_to_m1 0.512500 22.860 2.497e-23 0.46710 5.578e-01 #> @@ -938,10 +940,10 @@ #> 120 m1 25.15 28.824128 -3.674128 #> 120 m1 33.31 28.824128 4.485872</div><div class='input'><span class='no'>f.w.value</span> <span class='kw'><-</span> <span class='fu'>mkinfit</span>(<span class='no'>SFO_SFO.ff</span>, <span class='fu'>subset</span>(<span class='no'>FOCUS_2006_D</span>, <span class='no'>value</span> <span class='kw'>!=</span> <span class='fl'>0</span>), <span class='kw'>err</span> <span class='kw'>=</span> <span class='st'>"value"</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>) -<span class='fu'>summary</span>(<span class='no'>f.w.value</span>)</div><div class='output co'>#> mkin version: 0.9.45.1 -#> R version: 3.3.3 -#> Date of fit: Wed Mar 15 09:45:11 2017 -#> Date of summary: Wed Mar 15 09:45:11 2017 +<span class='fu'>summary</span>(<span class='no'>f.w.value</span>)</div><div class='output co'>#> mkin version: 0.9.45.2 +#> R version: 3.4.0 +#> Date of fit: Fri May 5 12:45:21 2017 +#> Date of summary: Fri May 5 12:45:21 2017 #> #> Equations: #> d_parent/dt = - k_parent * parent @@ -949,7 +951,7 @@ #> #> Model predictions using solution type deSolve #> -#> Fitted with method Port using 174 model solutions performed in 0.724 s +#> Fitted with method Port using 174 model solutions performed in 0.767 s #> #> Weighting: manual #> @@ -1060,10 +1062,10 @@ <span class='no'>errors</span> <span class='kw'><-</span> <span class='fu'>c</span>(<span class='kw'>parent</span> <span class='kw'>=</span> <span class='fl'>2</span>, <span class='kw'>m1</span> <span class='kw'>=</span> <span class='fl'>1</span>) <span class='no'>dw</span>$<span class='no'>err.man</span> <span class='kw'><-</span> <span class='no'>errors</span>[<span class='no'>FOCUS_2006_D</span>$<span class='no'>name</span>] <span class='no'>f.w.man</span> <span class='kw'><-</span> <span class='fu'>mkinfit</span>(<span class='no'>SFO_SFO.ff</span>, <span class='no'>dw</span>, <span class='kw'>err</span> <span class='kw'>=</span> <span class='st'>"err.man"</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>) -<span class='fu'>summary</span>(<span class='no'>f.w.man</span>)</div><div class='output co'>#> mkin version: 0.9.45.1 -#> R version: 3.3.3 -#> Date of fit: Wed Mar 15 09:45:12 2017 -#> Date of summary: Wed Mar 15 09:45:12 2017 +<span class='fu'>summary</span>(<span class='no'>f.w.man</span>)</div><div class='output co'>#> mkin version: 0.9.45.2 +#> R version: 3.4.0 +#> Date of fit: Fri May 5 12:45:22 2017 +#> Date of summary: Fri May 5 12:45:22 2017 #> #> Equations: #> d_parent/dt = - k_parent * parent @@ -1071,7 +1073,7 @@ #> #> Model predictions using solution type deSolve #> -#> Fitted with method Port using 316 model solutions performed in 1.31 s +#> Fitted with method Port using 297 model solutions performed in 1.276 s #> #> Weighting: manual #> @@ -1102,10 +1104,10 @@ #> #> Parameter correlation: #> parent_0 log_k_parent log_k_m1 f_parent_ilr_1 -#> parent_0 1.00000 0.5312 -0.09455 -0.3351 +#> parent_0 1.00000 0.5312 -0.09456 -0.3351 #> log_k_parent 0.53123 1.0000 -0.17800 -0.3360 -#> log_k_m1 -0.09455 -0.1780 1.00000 0.7616 -#> f_parent_ilr_1 -0.33513 -0.3360 0.76156 1.0000 +#> log_k_m1 -0.09456 -0.1780 1.00000 0.7616 +#> f_parent_ilr_1 -0.33514 -0.3360 0.76156 1.0000 #> #> Residual standard error: 2.628 on 36 degrees of freedom #> @@ -1114,7 +1116,7 @@ #> t-test (unrealistically) based on the assumption of normal distribution #> for estimators of untransformed parameters. #> Estimate t value Pr(>t) Lower Upper -#> parent_0 99.490000 74.69 2.222e-41 96.780000 1.022e+02 +#> parent_0 99.490000 74.69 2.221e-41 96.780000 1.022e+02 #> k_parent 0.098140 28.17 2.012e-26 0.091320 1.055e-01 #> k_m1 0.005292 4.70 1.873e-05 0.003437 8.148e-03 #> f_parent_to_m1 0.516200 16.30 1.686e-18 0.452000 5.798e-01 @@ -1137,10 +1139,10 @@ #> #> Data: #> time variable observed predicted residual err -#> 0 parent 99.46 99.485977 -0.025977 1 -#> 0 parent 102.04 99.485977 2.554023 1 -#> 1 parent 93.50 90.186118 3.313882 1 -#> 1 parent 92.50 90.186118 2.313882 1 +#> 0 parent 99.46 99.485976 -0.025976 1 +#> 0 parent 102.04 99.485976 2.554024 1 +#> 1 parent 93.50 90.186117 3.313883 1 +#> 1 parent 92.50 90.186117 2.313883 1 #> 3 parent 63.23 74.113162 -10.883162 1 #> 3 parent 68.99 74.113162 -5.123162 1 #> 7 parent 52.32 50.050295 2.269705 1 @@ -1169,23 +1171,23 @@ #> 7 m1 24.47 24.996945 -0.526945 2 #> 14 m1 41.69 36.663527 5.026473 2 #> 14 m1 33.21 36.663527 -3.453527 2 -#> 21 m1 44.37 41.656812 2.713188 2 -#> 21 m1 46.44 41.656812 4.783188 2 -#> 35 m1 41.22 43.350311 -2.130311 2 -#> 35 m1 37.95 43.350311 -5.400311 2 -#> 50 m1 41.19 41.256364 -0.066364 2 -#> 50 m1 40.01 41.256364 -1.246364 2 -#> 75 m1 40.09 36.460566 3.629434 2 -#> 75 m1 33.85 36.460566 -2.610566 2 +#> 21 m1 44.37 41.656813 2.713187 2 +#> 21 m1 46.44 41.656813 4.783187 2 +#> 35 m1 41.22 43.350312 -2.130312 2 +#> 35 m1 37.95 43.350312 -5.400312 2 +#> 50 m1 41.19 41.256365 -0.066365 2 +#> 50 m1 40.01 41.256365 -1.246365 2 +#> 75 m1 40.09 36.460567 3.629433 2 +#> 75 m1 33.85 36.460567 -2.610567 2 #> 100 m1 31.04 31.969288 -0.929288 2 #> 100 m1 33.13 31.969288 1.160712 2 -#> 120 m1 25.15 28.760615 -3.610615 2 -#> 120 m1 33.31 28.760615 4.549385 2</div><div class='input'><span class='no'>f.w.man.irls</span> <span class='kw'><-</span> <span class='fu'>mkinfit</span>(<span class='no'>SFO_SFO.ff</span>, <span class='no'>dw</span>, <span class='kw'>err</span> <span class='kw'>=</span> <span class='st'>"err.man"</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, +#> 120 m1 25.15 28.760616 -3.610616 2 +#> 120 m1 33.31 28.760616 4.549384 2</div><div class='input'><span class='no'>f.w.man.irls</span> <span class='kw'><-</span> <span class='fu'>mkinfit</span>(<span class='no'>SFO_SFO.ff</span>, <span class='no'>dw</span>, <span class='kw'>err</span> <span class='kw'>=</span> <span class='st'>"err.man"</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, <span class='kw'>reweight.method</span> <span class='kw'>=</span> <span class='st'>"obs"</span>) -<span class='fu'>summary</span>(<span class='no'>f.w.man.irls</span>)</div><div class='output co'>#> mkin version: 0.9.45.1 -#> R version: 3.3.3 -#> Date of fit: Wed Mar 15 09:45:15 2017 -#> Date of summary: Wed Mar 15 09:45:15 2017 +<span class='fu'>summary</span>(<span class='no'>f.w.man.irls</span>)</div><div class='output co'>#> mkin version: 0.9.45.2 +#> R version: 3.4.0 +#> Date of fit: Fri May 5 12:45:25 2017 +#> Date of summary: Fri May 5 12:45:25 2017 #> #> Equations: #> d_parent/dt = - k_parent * parent @@ -1193,7 +1195,7 @@ #> #> Model predictions using solution type deSolve #> -#> Fitted with method Port using 648 model solutions performed in 2.766 s +#> Fitted with method Port using 628 model solutions performed in 2.626 s #> #> Weighting: manual then iterative reweighting method obs #> @@ -1236,10 +1238,10 @@ #> t-test (unrealistically) based on the assumption of normal distribution #> for estimators of untransformed parameters. #> Estimate t value Pr(>t) Lower Upper -#> parent_0 99.67000 55.630 8.178e-37 96.040000 1.033e+02 +#> parent_0 99.67000 55.630 8.179e-37 96.040000 1.033e+02 #> k_parent 0.09906 21.930 1.015e-22 0.090310 1.087e-01 #> k_m1 0.00524 7.996 8.488e-10 0.004066 6.753e-03 -#> f_parent_to_m1 0.51340 23.000 2.038e-23 0.468100 5.584e-01 +#> f_parent_to_m1 0.51340 23.000 2.039e-23 0.468100 5.584e-01 #> #> Chi2 error levels in percent: #> err.min n.optim df diff --git a/docs/reference/mkinmod.html b/docs/reference/mkinmod.html index 1343abcc..de9815d4 100644 --- a/docs/reference/mkinmod.html +++ b/docs/reference/mkinmod.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — mkinmod • mkin</title> +<title>Function to set up a kinetic model with one or more state variables — mkinmod • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Function to set up a kinetic model with one or more state variables</h1> </div> @@ -105,58 +108,67 @@ a list, specifying the kinetic model type and reaction or transfer to other observed compartments. Instead of specifying several expressions, a list of lists can be given in the speclist argument.</p> - - <p>For the definition of model types and their parameters, the equations given +<p>For the definition of model types and their parameters, the equations given in the FOCUS and NAFTA guidance documents are used.</p> - <pre><span class='fu'>mkinmod</span>(<span class='no'>...</span>, <span class='kw'>use_of_ff</span> <span class='kw'>=</span> <span class='st'>"min"</span>, <span class='kw'>speclist</span> <span class='kw'>=</span> <span class='kw'>NULL</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>, <span class='kw'>verbose</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>)</pre> + <pre class="usage"><span class='fu'>mkinmod</span>(<span class='no'>...</span>, <span class='kw'>use_of_ff</span> <span class='kw'>=</span> <span class='st'>"min"</span>, <span class='kw'>speclist</span> <span class='kw'>=</span> <span class='kw'>NULL</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>, <span class='kw'>verbose</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>...</dt> - <dd> - For each observed variable, a list has to be specified as an argument, containing + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>...</th> + <td><p>For each observed variable, a list has to be specified as an argument, containing at least a component <code>type</code>, specifying the type of kinetics to use - for the variable. Currently, single first order kinetics "SFO", - indeterminate order rate equation kinetics "IORE", or - single first order with reversible binding "SFORB" are implemented for all + for the variable. Currently, single first order kinetics "SFO", + indeterminate order rate equation kinetics "IORE", or + single first order with reversible binding "SFORB" are implemented for all variables, while - "FOMC", "DFOP" and "HS" can additionally be chosen for the first + "FOMC", "DFOP" and "HS" can additionally be chosen for the first variable which is assumed to be the source compartment. Additionally, each component of the list can include a character vector <code>to</code>, specifying names of variables to which a transfer is to be assumed in the model. - If the argument <code>use_of_ff</code> is set to "min" (default) and the model for - the compartment is "SFO" or "SFORB", an additional component of the list - can be "sink=FALSE" effectively fixing the flux to sink to zero. - </dd> - <dt>use_of_ff</dt> - <dd> - Specification of the use of formation fractions in the model equations and, if - applicable, the coefficient matrix. If "min", a minimum use of formation + If the argument <code>use_of_ff</code> is set to "min" (default) and the model for + the compartment is "SFO" or "SFORB", an additional component of the list + can be "sink=FALSE" effectively fixing the flux to sink to zero.</p></td> + </tr> + <tr> + <th>use_of_ff</th> + <td><p>Specification of the use of formation fractions in the model equations and, if + applicable, the coefficient matrix. If "min", a minimum use of formation fractions is made in order to avoid fitting the product of formation fractions - and rate constants. If "max", formation fractions are always used. - </dd> - <dt>speclist</dt> - <dd> - The specification of the observed variables and their submodel types and - pathways can be given as a single list using this argument. Default is NULL. - </dd> - <dt>quiet</dt> - <dd> - Should messages be suppressed? - </dd> - <dt>verbose</dt> - <dd> - If <code>TRUE</code>, passed to <code>cfunction</code> if applicable to give - detailed information about the C function being built. - </dd> - </dl> + and rate constants. If "max", formation fractions are always used.</p></td> + </tr> + <tr> + <th>speclist</th> + <td><p>The specification of the observed variables and their submodel types and + pathways can be given as a single list using this argument. Default is NULL.</p></td> + </tr> + <tr> + <th>quiet</th> + <td><p>Should messages be suppressed?</p></td> + </tr> + <tr> + <th>verbose</th> + <td><p>If <code>TRUE</code>, passed to <code>cfunction</code> if applicable to give + detailed information about the C function being built.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> <p>A list of class <code>mkinmod</code> for use with <code><a href='mkinfit.html'>mkinfit</a></code>, containing</p> +<dt>diffs</dt><dd><p>A vector of string representations of differential equations, + one for each modelling variable.</p></dd> + <dt>parms</dt><dd><p>A vector of parameter names occurring in the differential equations.</p></dd> + <dt>map</dt><dd><p>A list containing named character vectors for each observed variable, specifying + the modelling variables by which it is represented.</p></dd> + <dt>use_of_ff</dt><dd><p>The content of <code>use_of_ff</code> is passed on in this list component.</p></dd> + <dt>coefmat</dt><dd><p>The coefficient matrix, if the system of differential equations can be + represented by one.</p></dd> + <h2 class="hasAnchor" id="note"><a class="anchor" href="#note"></a>Note</h2> @@ -170,8 +182,8 @@ Degradation Kinetics from Environmental Fate Studies on Pesticides in EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, - <a href = 'http://focus.jrc.ec.europa.eu/dk'>http://focus.jrc.ec.europa.eu/dk</a></p> - <p>NAFTA Technical Working Group on Pesticides (not dated) Guidance for + <a href = 'http://esdac.jrc.europa.eu/projects/degradation-kinetics'>http://esdac.jrc.europa.eu/projects/degradation-kinetics</a></p> +<p>NAFTA Technical Working Group on Pesticides (not dated) Guidance for Evaluating and Calculating Degradation Kinetics in Environmental Media</p> @@ -193,7 +205,7 @@ <span class='no'>SFO_SFO</span> <span class='kw'><-</span> <span class='fu'>mkinmod</span>( <span class='kw'>parent</span> <span class='kw'>=</span> <span class='fu'><a href='mkinsub.html'>mkinsub</a></span>(<span class='st'>"SFO"</span>, <span class='st'>"m1"</span>), <span class='kw'>m1</span> <span class='kw'>=</span> <span class='fu'><a href='mkinsub.html'>mkinsub</a></span>(<span class='st'>"SFO"</span>), <span class='kw'>verbose</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>)</div><div class='output co'>#> Compilation argument: -#> /usr/lib/R/bin/R CMD SHLIB file2ac5b2884c1.c 2> file2ac5b2884c1.c.err.txt +#> /usr/lib/R/bin/R CMD SHLIB file70ea30edf42a.c 2> file70ea30edf42a.c.err.txt #> Program source: #> 1: #include <R.h> #> 2: diff --git a/docs/reference/mkinparplot-4.png b/docs/reference/mkinparplot-4.png Binary files differindex 77eafd95..8b32f554 100644 --- a/docs/reference/mkinparplot-4.png +++ b/docs/reference/mkinparplot-4.png diff --git a/docs/reference/mkinparplot.html b/docs/reference/mkinparplot.html index 0682211b..b0f1e5a6 100644 --- a/docs/reference/mkinparplot.html +++ b/docs/reference/mkinparplot.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — mkinparplot • mkin</title> +<title>Function to plot the confidence intervals obtained using mkinfit — mkinparplot • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Function to plot the confidence intervals obtained using mkinfit</h1> </div> @@ -105,15 +108,16 @@ fitted using <code><a href='mkinfit.html'>mkinfit</a></code>.</p> - <pre><span class='fu'>mkinparplot</span>(<span class='no'>object</span>)</pre> + <pre class="usage"><span class='fu'>mkinparplot</span>(<span class='no'>object</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>object</dt> - <dd> - A fit represented in an <code><a href='mkinfit.html'>mkinfit</a></code> object. - </dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>object</th> + <td><p>A fit represented in an <code><a href='mkinfit.html'>mkinfit</a></code> object.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> diff --git a/docs/reference/mkinplot.html b/docs/reference/mkinplot.html index fdc61af4..7be76403 100644 --- a/docs/reference/mkinplot.html +++ b/docs/reference/mkinplot.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — mkinplot • mkin</title> +<title>Plot the observed data and the fitted model of an mkinfit object — mkinplot • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,27 +100,27 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Plot the observed data and the fitted model of an mkinfit object</h1> </div> <p>Deprecated function. It now only calls the plot method <code><a href='plot.mkinfit.html'>plot.mkinfit</a></code>.</p> - <pre><span class='fu'>mkinplot</span>(<span class='no'>fit</span>, <span class='no'>...</span>)</pre> + <pre class="usage"><span class='fu'>mkinplot</span>(<span class='no'>fit</span>, <span class='no'>...</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>fit</dt> - <dd> - an object of class <code><a href='mkinfit.html'>mkinfit</a></code>. - </dd> - <dt>…</dt> - <dd> - further arguments passed to <code><a href='plot.mkinfit.html'>plot.mkinfit</a></code>. -</dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>fit</th> + <td><p>an object of class <code><a href='mkinfit.html'>mkinfit</a></code>.</p></td> + </tr> + <tr> + <th>…</th> + <td><p>further arguments passed to <code><a href='plot.mkinfit.html'>plot.mkinfit</a></code>.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> diff --git a/docs/reference/mkinpredict.html b/docs/reference/mkinpredict.html index 2348d40e..327a7d8d 100644 --- a/docs/reference/mkinpredict.html +++ b/docs/reference/mkinpredict.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — mkinpredict • mkin</title> +<title>Produce predictions from a kinetic model using specific parameters — mkinpredict • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Produce predictions from a kinetic model using specific parameters</h1> </div> @@ -106,71 +109,72 @@ kinetic parameters and initial values for the state variables.</p> - <pre><span class='fu'>mkinpredict</span>(<span class='no'>mkinmod</span>, <span class='no'>odeparms</span>, <span class='no'>odeini</span>, <span class='no'>outtimes</span>, <span class='kw'>solution_type</span> <span class='kw'>=</span> <span class='st'>"deSolve"</span>, + <pre class="usage"><span class='fu'>mkinpredict</span>(<span class='no'>mkinmod</span>, <span class='no'>odeparms</span>, <span class='no'>odeini</span>, <span class='no'>outtimes</span>, <span class='kw'>solution_type</span> <span class='kw'>=</span> <span class='st'>"deSolve"</span>, <span class='kw'>use_compiled</span> <span class='kw'>=</span> <span class='st'>"auto"</span>, <span class='kw'>method.ode</span> <span class='kw'>=</span> <span class='st'>"lsoda"</span>, <span class='kw'>atol</span> <span class='kw'>=</span> <span class='fl'>1e-08</span>, <span class='kw'>rtol</span> <span class='kw'>=</span> <span class='fl'>1e-10</span>, <span class='kw'>map_output</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, <span class='no'>...</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>mkinmod</dt> - <dd> - A kinetic model as produced by <code><a href='mkinmod.html'>mkinmod</a></code>. - </dd> - <dt>odeparms</dt> - <dd> - A numeric vector specifying the parameters used in the kinetic model, which - is generally defined as a set of ordinary differential equations. - </dd> - <dt>odeini</dt> - <dd> - A numeric vectory containing the initial values of the state variables of + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>mkinmod</th> + <td><p>A kinetic model as produced by <code><a href='mkinmod.html'>mkinmod</a></code>.</p></td> + </tr> + <tr> + <th>odeparms</th> + <td><p>A numeric vector specifying the parameters used in the kinetic model, which + is generally defined as a set of ordinary differential equations.</p></td> + </tr> + <tr> + <th>odeini</th> + <td><p>A numeric vectory containing the initial values of the state variables of the model. Note that the state variables can differ from the observed - variables, for example in the case of the SFORB model. - </dd> - <dt>outtimes</dt> - <dd> - A numeric vector specifying the time points for which model predictions - should be generated. - </dd> - <dt>solution_type</dt> - <dd> - The method that should be used for producing the predictions. This should - generally be "analytical" if there is only one observed variable, and - usually "deSolve" in the case of several observed variables. The third - possibility "eigen" is faster but not applicable to some models e.g. - using FOMC for the parent compound. - </dd> - <dt>method.ode</dt> - <dd> - The solution method passed via <code>mkinpredict</code> to - <code>ode</code> in case the solution type is "deSolve". The default - "lsoda" is performant, but sometimes fails to converge. - </dd> - <dt>use_compiled</dt> - <dd> - If set to <code>FALSE</code>, no compiled version of the <code><a href='mkinmod.html'>mkinmod</a></code> - model is used, even if is present. - </dd> - <dt>atol</dt> - <dd> - Absolute error tolerance, passed to <code>ode</code>. Default is 1e-8, - lower than in <code>lsoda</code>. - </dd> - <dt>rtol</dt> - <dd> - Absolute error tolerance, passed to <code>ode</code>. Default is 1e-10, - much lower than in <code>lsoda</code>. - </dd> - <dt>map_output</dt> - <dd> - Boolean to specify if the output should list values for the observed - variables (default) or for all state variables (if set to FALSE). - </dd> - <dt>…</dt> - <dd> - Further arguments passed to the ode solver in case such a solver is used. - </dd> - </dl> + variables, for example in the case of the SFORB model.</p></td> + </tr> + <tr> + <th>outtimes</th> + <td><p>A numeric vector specifying the time points for which model predictions + should be generated.</p></td> + </tr> + <tr> + <th>solution_type</th> + <td><p>The method that should be used for producing the predictions. This should + generally be "analytical" if there is only one observed variable, and + usually "deSolve" in the case of several observed variables. The third + possibility "eigen" is faster but not applicable to some models e.g. + using FOMC for the parent compound.</p></td> + </tr> + <tr> + <th>method.ode</th> + <td><p>The solution method passed via <code>mkinpredict</code> to + <code>ode</code> in case the solution type is "deSolve". The default + "lsoda" is performant, but sometimes fails to converge.</p></td> + </tr> + <tr> + <th>use_compiled</th> + <td><p>If set to <code>FALSE</code>, no compiled version of the <code><a href='mkinmod.html'>mkinmod</a></code> + model is used, even if is present.</p></td> + </tr> + <tr> + <th>atol</th> + <td><p>Absolute error tolerance, passed to <code>ode</code>. Default is 1e-8, + lower than in <code>lsoda</code>.</p></td> + </tr> + <tr> + <th>rtol</th> + <td><p>Absolute error tolerance, passed to <code>ode</code>. Default is 1e-10, + much lower than in <code>lsoda</code>.</p></td> + </tr> + <tr> + <th>map_output</th> + <td><p>Boolean to specify if the output should list values for the observed + variables (default) or for all state variables (if set to FALSE).</p></td> + </tr> + <tr> + <th>…</th> + <td><p>Further arguments passed to the ode solver in case such a solver is used.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> @@ -295,17 +299,17 @@ <span class='fu'>c</span>(<span class='kw'>parent</span> <span class='kw'>=</span> <span class='fl'>100</span>, <span class='kw'>m1</span> <span class='kw'>=</span> <span class='fl'>0</span>), <span class='fu'>seq</span>(<span class='fl'>0</span>, <span class='fl'>20</span>, <span class='kw'>by</span> <span class='kw'>=</span> <span class='fl'>0.1</span>), <span class='kw'>solution_type</span> <span class='kw'>=</span> <span class='st'>"eigen"</span>)[<span class='fl'>201</span>,]))</div><div class='output co'>#> time parent m1 #> 201 20 4.978707 27.46227</div><div class='output co'>#> user system elapsed -#> 0.016 0.016 0.004 </div><div class='input'> <span class='fu'>system.time</span>( +#> 0.004 0.000 0.004 </div><div class='input'> <span class='fu'>system.time</span>( <span class='fu'>print</span>(<span class='fu'>mkinpredict</span>(<span class='no'>SFO_SFO</span>, <span class='fu'>c</span>(<span class='kw'>k_parent_m1</span> <span class='kw'>=</span> <span class='fl'>0.05</span>, <span class='kw'>k_parent_sink</span> <span class='kw'>=</span> <span class='fl'>0.1</span>, <span class='kw'>k_m1_sink</span> <span class='kw'>=</span> <span class='fl'>0.01</span>), <span class='fu'>c</span>(<span class='kw'>parent</span> <span class='kw'>=</span> <span class='fl'>100</span>, <span class='kw'>m1</span> <span class='kw'>=</span> <span class='fl'>0</span>), <span class='fu'>seq</span>(<span class='fl'>0</span>, <span class='fl'>20</span>, <span class='kw'>by</span> <span class='kw'>=</span> <span class='fl'>0.1</span>), <span class='kw'>solution_type</span> <span class='kw'>=</span> <span class='st'>"deSolve"</span>)[<span class='fl'>201</span>,]))</div><div class='output co'>#> time parent m1 #> 201 20 4.978707 27.46227</div><div class='output co'>#> user system elapsed -#> 0.016 0.004 0.002 </div><div class='input'> <span class='fu'>system.time</span>( +#> 0.004 0.000 0.002 </div><div class='input'> <span class='fu'>system.time</span>( <span class='fu'>print</span>(<span class='fu'>mkinpredict</span>(<span class='no'>SFO_SFO</span>, <span class='fu'>c</span>(<span class='kw'>k_parent_m1</span> <span class='kw'>=</span> <span class='fl'>0.05</span>, <span class='kw'>k_parent_sink</span> <span class='kw'>=</span> <span class='fl'>0.1</span>, <span class='kw'>k_m1_sink</span> <span class='kw'>=</span> <span class='fl'>0.01</span>), <span class='fu'>c</span>(<span class='kw'>parent</span> <span class='kw'>=</span> <span class='fl'>100</span>, <span class='kw'>m1</span> <span class='kw'>=</span> <span class='fl'>0</span>), <span class='fu'>seq</span>(<span class='fl'>0</span>, <span class='fl'>20</span>, <span class='kw'>by</span> <span class='kw'>=</span> <span class='fl'>0.1</span>), <span class='kw'>solution_type</span> <span class='kw'>=</span> <span class='st'>"deSolve"</span>, <span class='kw'>use_compiled</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>)[<span class='fl'>201</span>,]))</div><div class='output co'>#> time parent m1 #> 201 20 4.978707 27.46227</div><div class='output co'>#> user system elapsed -#> 0.032 0.000 0.034 </div></pre> +#> 0.032 0.000 0.033 </div></pre> </div> <div class="col-md-3 hidden-xs hidden-sm" id="sidebar"> <h2>Contents</h2> diff --git a/docs/reference/mkinresplot.html b/docs/reference/mkinresplot.html index fd5722bc..44a641b6 100644 --- a/docs/reference/mkinresplot.html +++ b/docs/reference/mkinresplot.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — mkinresplot • mkin</title> +<title>Function to plot residuals stored in an mkin object — mkinresplot • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Function to plot residuals stored in an mkin object</h1> </div> @@ -107,53 +110,55 @@ using the argument <code>show_residuals = TRUE</code>.</p> - <pre><span class='fu'>mkinresplot</span>(<span class='no'>object</span>, + <pre class="usage"><span class='fu'>mkinresplot</span>(<span class='no'>object</span>, <span class='kw'>obs_vars</span> <span class='kw'>=</span> <span class='fu'>names</span>(<span class='no'>object</span>$<span class='no'>mkinmod</span>$<span class='no'>map</span>), <span class='kw'>xlim</span> <span class='kw'>=</span> <span class='fu'>c</span>(<span class='fl'>0</span>, <span class='fl'>1.1</span> * <span class='fu'>max</span>(<span class='no'>object</span>$<span class='no'>data</span>$<span class='no'>time</span>)), <span class='kw'>xlab</span> <span class='kw'>=</span> <span class='st'>"Time"</span>, <span class='kw'>ylab</span> <span class='kw'>=</span> <span class='st'>"Residual"</span>, <span class='kw'>maxabs</span> <span class='kw'>=</span> <span class='st'>"auto"</span>, <span class='kw'>legend</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, <span class='kw'>lpos</span> <span class='kw'>=</span> <span class='st'>"topright"</span>, <span class='no'>...</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>object</dt> - <dd> - A fit represented in an <code><a href='mkinfit.html'>mkinfit</a></code> object. -</dd> - <dt>obs_vars</dt> - <dd> - A character vector of names of the observed variables for which residuals - should be plotted. Defaults to all observed variables in the model -</dd> - <dt>xlim</dt> - <dd> - plot range in x direction. - </dd> - <dt>xlab</dt> - <dd> - Label for the x axis. Defaults to "Time [days]". -</dd> - <dt>ylab</dt> - <dd> - Label for the y axis. Defaults to "Residual [% of applied radioactivity]". -</dd> - <dt>maxabs</dt> - <dd> - Maximum absolute value of the residuals. This is used for the scaling of - the y axis and defaults to "auto". -</dd> - <dt>legend</dt> - <dd> - Should a legend be plotted? Defaults to "TRUE". -</dd> - <dt>lpos</dt> - <dd> - Where should the legend be placed? Default is "topright". Will be passed on to - <code>legend</code>. </dd> - <dt>…</dt> - <dd> - further arguments passed to <code>plot</code>. -</dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>object</th> + <td><p>A fit represented in an <code><a href='mkinfit.html'>mkinfit</a></code> object.</p></td> + </tr> + <tr> + <th>obs_vars</th> + <td><p>A character vector of names of the observed variables for which residuals + should be plotted. Defaults to all observed variables in the model</p></td> + </tr> + <tr> + <th>xlim</th> + <td><p>plot range in x direction.</p></td> + </tr> + <tr> + <th>xlab</th> + <td><p>Label for the x axis. Defaults to "Time [days]".</p></td> + </tr> + <tr> + <th>ylab</th> + <td><p>Label for the y axis. Defaults to "Residual [% of applied radioactivity]".</p></td> + </tr> + <tr> + <th>maxabs</th> + <td><p>Maximum absolute value of the residuals. This is used for the scaling of + the y axis and defaults to "auto".</p></td> + </tr> + <tr> + <th>legend</th> + <td><p>Should a legend be plotted? Defaults to "TRUE".</p></td> + </tr> + <tr> + <th>lpos</th> + <td><p>Where should the legend be placed? Default is "topright". Will be passed on to + <code>legend</code>.</p></td> + </tr> + <tr> + <th>…</th> + <td><p>further arguments passed to <code>plot</code>.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> diff --git a/docs/reference/mkinsub.html b/docs/reference/mkinsub.html index aff0b593..2269b228 100644 --- a/docs/reference/mkinsub.html +++ b/docs/reference/mkinsub.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — mkinsub • mkin</title> +<title>Function to set up a kinetic submodel for one state variable — mkinsub • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Function to set up a kinetic submodel for one state variable</h1> </div> @@ -105,33 +108,34 @@ <code><a href='mkinmod.html'>mkinmod</a></code>.</p> - <pre><span class='fu'>mkinsub</span>(<span class='no'>submodel</span>, <span class='kw'>to</span> <span class='kw'>=</span> <span class='kw'>NULL</span>, <span class='kw'>sink</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, <span class='kw'>full_name</span> <span class='kw'>=</span> <span class='fl'>NA</span>)</pre> + <pre class="usage"><span class='fu'>mkinsub</span>(<span class='no'>submodel</span>, <span class='kw'>to</span> <span class='kw'>=</span> <span class='kw'>NULL</span>, <span class='kw'>sink</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, <span class='kw'>full_name</span> <span class='kw'>=</span> <span class='fl'>NA</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>submodel</dt> - <dd> - Character vector of length one to specify the submodel type. See - <code><a href='mkinmod.html'>mkinmod</a></code> for the list of allowed submodel names. - </dd> - <dt>to</dt> - <dd> - Vector of the names of the state variable to which a transformation - shall be included in the model. - </dd> - <dt>sink</dt> - <dd> - Should a pathway to sink be included in the model in addition to the - pathways to other state variables? - </dd> - <dt>full_name</dt> - <dd> - An optional name to be used e.g. for plotting fits performed with the model. + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>submodel</th> + <td><p>Character vector of length one to specify the submodel type. See + <code><a href='mkinmod.html'>mkinmod</a></code> for the list of allowed submodel names.</p></td> + </tr> + <tr> + <th>to</th> + <td><p>Vector of the names of the state variable to which a transformation + shall be included in the model.</p></td> + </tr> + <tr> + <th>sink</th> + <td><p>Should a pathway to sink be included in the model in addition to the + pathways to other state variables?</p></td> + </tr> + <tr> + <th>full_name</th> + <td><p>An optional name to be used e.g. for plotting fits performed with the model. You can use non-ASCII characters here, but then your R code will not be portable, <em>i.e.</em> may produce unintended plot results on other - operating systems or system configurations. - </dd> - </dl> + operating systems or system configurations.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> diff --git a/docs/reference/mmkin-15.png b/docs/reference/mmkin-15.png Binary files differnew file mode 100644 index 00000000..f50a6185 --- /dev/null +++ b/docs/reference/mmkin-15.png diff --git a/docs/reference/mmkin-17.png b/docs/reference/mmkin-17.png Binary files differnew file mode 100644 index 00000000..72cfc5e7 --- /dev/null +++ b/docs/reference/mmkin-17.png diff --git a/docs/reference/mmkin-19.png b/docs/reference/mmkin-19.png Binary files differnew file mode 100644 index 00000000..0b315b1a --- /dev/null +++ b/docs/reference/mmkin-19.png diff --git a/docs/reference/mmkin-21.png b/docs/reference/mmkin-21.png Binary files differnew file mode 100644 index 00000000..b98940ff --- /dev/null +++ b/docs/reference/mmkin-21.png diff --git a/docs/reference/mmkin-23.png b/docs/reference/mmkin-23.png Binary files differnew file mode 100644 index 00000000..5ca52efb --- /dev/null +++ b/docs/reference/mmkin-23.png diff --git a/docs/reference/mmkin.html b/docs/reference/mmkin.html index 67397827..fe10c88f 100644 --- a/docs/reference/mmkin.html +++ b/docs/reference/mmkin.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — mmkin • mkin</title> +<title>Fit one or more kinetic models with one or more state variables to one or more datasets — mmkin • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Fit one or more kinetic models with one or more state variables to one or more datasets</h1> </div> @@ -105,37 +108,38 @@ specified in its first two arguments.</p> - <pre><span class='fu'>mmkin</span>(<span class='no'>models</span>, <span class='no'>datasets</span>, + <pre class="usage"><span class='fu'>mmkin</span>(<span class='no'>models</span>, <span class='no'>datasets</span>, <span class='kw'>cores</span> <span class='kw'>=</span> <span class='fu'>round</span>(<span class='fu'>detectCores</span>()/<span class='fl'>2</span>), <span class='kw'>cluster</span> <span class='kw'>=</span> <span class='kw'>NULL</span>, <span class='no'>...</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>models</dt> - <dd> - Either a character vector of shorthand names ("SFO", "FOMC", "DFOP", - "HS", "SFORB"), or an optionally named list of <code><a href='mkinmod.html'>mkinmod</a></code> - objects. - </dd> - <dt>datasets</dt> - <dd> - An optionally named list of datasets suitable as observed data for - <code><a href='mkinfit.html'>mkinfit</a></code>. - </dd> - <dt>cores</dt> - <dd> - The number of cores to be used for multicore processing. This is only - used when the <code>cluster</code> argument is <code>NULL</code>. - </dd> - <dt>cluster</dt> - <dd> - A cluster as returned by <code>makeCluster</code> to be used for parallel - execution. - </dd> - <dt>…</dt> - <dd> - Further arguments that will be passed to <code><a href='mkinfit.html'>mkinfit</a></code>. - </dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>models</th> + <td><p>Either a character vector of shorthand names ("SFO", "FOMC", "DFOP", + "HS", "SFORB"), or an optionally named list of <code><a href='mkinmod.html'>mkinmod</a></code> + objects.</p></td> + </tr> + <tr> + <th>datasets</th> + <td><p>An optionally named list of datasets suitable as observed data for + <code><a href='mkinfit.html'>mkinfit</a></code>.</p></td> + </tr> + <tr> + <th>cores</th> + <td><p>The number of cores to be used for multicore processing. This is only + used when the <code>cluster</code> argument is <code>NULL</code>.</p></td> + </tr> + <tr> + <th>cluster</th> + <td><p>A cluster as returned by <code>makeCluster</code> to be used for parallel + execution.</p></td> + </tr> + <tr> + <th>…</th> + <td><p>Further arguments that will be passed to <code><a href='mkinfit.html'>mkinfit</a></code>.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> @@ -144,7 +148,7 @@ <h2 class="hasAnchor" id="see-also"><a class="anchor" href="#see-also"></a>See also</h2> - <p><code><a href='[.mmkin.html'>[.mmkin</a></code> for subsetting, <code><a href='plot.mmkin.html'>plot.mmkin</a></code> for plotting.</p> + <p><code><a href='Extract.mmkin.html'>[.mmkin</a></code> for subsetting, <code><a href='plot.mmkin.html'>plot.mmkin</a></code> for plotting.</p> <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> @@ -160,11 +164,12 @@ <span class='fu'>names</span>(<span class='no'>datasets</span>) <span class='kw'><-</span> <span class='fu'>paste</span>(<span class='st'>"Dataset"</span>, <span class='fl'>1</span>:<span class='fl'>3</span>) <span class='no'>time_default</span> <span class='kw'><-</span> <span class='fu'>system.time</span>(<span class='no'>fits.0</span> <span class='kw'><-</span> <span class='fu'>mmkin</span>(<span class='no'>models</span>, <span class='no'>datasets</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>)) -<span class='no'>time_1</span> <span class='kw'><-</span> <span class='fu'>system.time</span>(<span class='no'>fits.4</span> <span class='kw'><-</span> <span class='fu'>mmkin</span>(<span class='no'>models</span>, <span class='no'>datasets</span>, <span class='kw'>cores</span> <span class='kw'>=</span> <span class='fl'>1</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>)) - +<span class='no'>time_1</span> <span class='kw'><-</span> <span class='fu'>system.time</span>(<span class='no'>fits.4</span> <span class='kw'><-</span> <span class='fu'>mmkin</span>(<span class='no'>models</span>, <span class='no'>datasets</span>, <span class='kw'>cores</span> <span class='kw'>=</span> <span class='fl'>1</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>))</div><div class='output co'>#> <span class='warning'>Warning: Optimisation by method Port did not converge.</span> +#> <span class='warning'>Convergence code is 1</span></div><div class='output co'>#> <span class='warning'>Warning: Optimisation by method Port did not converge.</span> +#> <span class='warning'>Convergence code is 1</span></div><div class='input'> <span class='no'>time_default</span></div><div class='output co'>#> user system elapsed -#> 16.360 0.128 9.017 </div><div class='input'><span class='no'>time_1</span></div><div class='output co'>#> user system elapsed -#> 21.888 0.004 21.892 </div><div class='input'> +#> 16.092 0.132 11.761 </div><div class='input'><span class='no'>time_1</span></div><div class='output co'>#> user system elapsed +#> 25.004 0.000 25.000 </div><div class='input'> <span class='fu'><a href='endpoints.html'>endpoints</a></span>(<span class='no'>fits.0</span><span class='kw'>[[</span><span class='st'>"SFO_lin"</span>, <span class='fl'>2</span>]])</div><div class='output co'>#> $ff #> parent_M1 parent_sink M1_M2 M1_sink #> 0.7340479 0.2659521 0.7505687 0.2494313 @@ -174,17 +179,17 @@ #> #> $distimes #> DT50 DT90 -#> parent 0.8777688 2.915885 +#> parent 0.8777689 2.915885 #> M1 2.3257456 7.725960 -#> M2 33.7200881 112.015708 +#> M2 33.7200862 112.015702 #> </div><div class='input'> <span class='co'># plot.mkinfit handles rows or columns of mmkin result objects</span> -<span class='fu'>plot</span>(<span class='no'>fits.0</span>[<span class='fl'>1</span>, ])</div><img src='mmkin-12.png' alt='' width='540' height='400' /><div class='input'><span class='fu'>plot</span>(<span class='no'>fits.0</span>[<span class='fl'>1</span>, ], <span class='kw'>obs_var</span> <span class='kw'>=</span> <span class='fu'>c</span>(<span class='st'>"M1"</span>, <span class='st'>"M2"</span>))</div><img src='mmkin-14.png' alt='' width='540' height='400' /><div class='input'><span class='fu'>plot</span>(<span class='no'>fits.0</span>[, <span class='fl'>1</span>])</div><img src='mmkin-16.png' alt='' width='540' height='400' /><div class='input'><span class='co'># Use double brackets to extract a single mkinfit object, which will be plotted</span> +<span class='fu'>plot</span>(<span class='no'>fits.0</span>[<span class='fl'>1</span>, ])</div><img src='mmkin-15.png' alt='' width='540' height='400' /><div class='input'><span class='fu'>plot</span>(<span class='no'>fits.0</span>[<span class='fl'>1</span>, ], <span class='kw'>obs_var</span> <span class='kw'>=</span> <span class='fu'>c</span>(<span class='st'>"M1"</span>, <span class='st'>"M2"</span>))</div><img src='mmkin-17.png' alt='' width='540' height='400' /><div class='input'><span class='fu'>plot</span>(<span class='no'>fits.0</span>[, <span class='fl'>1</span>])</div><img src='mmkin-19.png' alt='' width='540' height='400' /><div class='input'><span class='co'># Use double brackets to extract a single mkinfit object, which will be plotted</span> <span class='co'># by plot.mkinfit and can be plotted using plot_sep</span> -<span class='fu'>plot</span>(<span class='no'>fits.0</span><span class='kw'>[[</span><span class='fl'>1</span>, <span class='fl'>1</span>]], <span class='kw'>sep_obs</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, <span class='kw'>show_residuals</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, <span class='kw'>show_errmin</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>)</div><img src='mmkin-18.png' alt='' width='540' height='400' /><div class='input'><span class='fu'><a href='plot.mkinfit.html'>plot_sep</a></span>(<span class='no'>fits.0</span><span class='kw'>[[</span><span class='fl'>1</span>, <span class='fl'>1</span>]]) +<span class='fu'>plot</span>(<span class='no'>fits.0</span><span class='kw'>[[</span><span class='fl'>1</span>, <span class='fl'>1</span>]], <span class='kw'>sep_obs</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, <span class='kw'>show_residuals</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, <span class='kw'>show_errmin</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>)</div><img src='mmkin-21.png' alt='' width='540' height='400' /><div class='input'><span class='fu'><a href='plot.mkinfit.html'>plot_sep</a></span>(<span class='no'>fits.0</span><span class='kw'>[[</span><span class='fl'>1</span>, <span class='fl'>1</span>]]) <span class='co'># Plotting with mmkin (single brackets, extracting an mmkin object) does not</span> <span class='co'># allow to plot the observed variables separately</span> -<span class='fu'>plot</span>(<span class='no'>fits.0</span>[<span class='fl'>1</span>, <span class='fl'>1</span>])</div><img src='mmkin-20.png' alt='' width='540' height='400' /><div class='input'> +<span class='fu'>plot</span>(<span class='no'>fits.0</span>[<span class='fl'>1</span>, <span class='fl'>1</span>])</div><img src='mmkin-23.png' alt='' width='540' height='400' /><div class='input'> </div></pre> </div> <div class="col-md-3 hidden-xs hidden-sm" id="sidebar"> diff --git a/docs/reference/plot.mkinfit.html b/docs/reference/plot.mkinfit.html index e77b7b54..2126c36d 100644 --- a/docs/reference/plot.mkinfit.html +++ b/docs/reference/plot.mkinfit.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — plot.mkinfit • mkin</title> +<title>Plot the observed data and the fitted model of an mkinfit object — plot.mkinfit • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,21 +100,19 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Plot the observed data and the fitted model of an mkinfit object</h1> </div> <p>Solves the differential equations with the optimised and fixed parameters from a previous successful call to <code><a href='mkinfit.html'>mkinfit</a></code> and plots the observed data together with the solution of the fitted model.</p> - - <p>If the current plot device is a <code><a href='http://www.rdocumentation.org/packages/tikzDevice/topics/tikz'>tikz</a></code> device, +<p>If the current plot device is a <code><a href='http://www.rdocumentation.org/packages/tikzDevice/topics/tikz'>tikz</a></code> device, then latex is being used for the formatting of the chi2 error level, if <code>show_errmin = TRUE</code>.</p> - <pre># S3 method for mkinfit + <pre class="usage"># S3 method for mkinfit plot(x, fit = x, obs_vars = names(fit$mkinmod$map), xlab = "Time", ylab = "Observed", @@ -126,100 +128,101 @@ plot(x, fit = x, plot_sep(fit, sep_obs = TRUE, show_residuals = TRUE, show_errmin = TRUE, …)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>x</dt> - <dd> - Alias for fit introduced for compatibility with the generic S3 method. - </dd> - <dt>fit</dt> - <dd> - An object of class <code><a href='mkinfit.html'>mkinfit</a></code>. - </dd> - <dt>obs_vars</dt> - <dd> - A character vector of names of the observed variables for which the + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>x</th> + <td><p>Alias for fit introduced for compatibility with the generic S3 method.</p></td> + </tr> + <tr> + <th>fit</th> + <td><p>An object of class <code><a href='mkinfit.html'>mkinfit</a></code>.</p></td> + </tr> + <tr> + <th>obs_vars</th> + <td><p>A character vector of names of the observed variables for which the data and the model should be plotted. Defauls to all observed variables - in the model. - </dd> - <dt>xlab</dt> - <dd> - Label for the x axis. - </dd> - <dt>ylab</dt> - <dd> - Label for the y axis. - </dd> - <dt>xlim</dt> - <dd> - Plot range in x direction. - </dd> - <dt>ylim</dt> - <dd> - Plot range in y direction. - </dd> - <dt>col_obs</dt> - <dd> - Colors used for plotting the observed data and the corresponding model prediction lines. - </dd> - <dt>pch_obs</dt> - <dd> - Symbols to be used for plotting the data. - </dd> - <dt>lty_obs</dt> - <dd> - Line types to be used for the model predictions. - </dd> - <dt>add</dt> - <dd> - Should the plot be added to an existing plot? - </dd> - <dt>legend</dt> - <dd> - Should a legend be added to the plot? - </dd> - <dt>show_residuals</dt> - <dd> - Should residuals be shown? If only one plot of the fits is shown, the + in the model.</p></td> + </tr> + <tr> + <th>xlab</th> + <td><p>Label for the x axis.</p></td> + </tr> + <tr> + <th>ylab</th> + <td><p>Label for the y axis.</p></td> + </tr> + <tr> + <th>xlim</th> + <td><p>Plot range in x direction.</p></td> + </tr> + <tr> + <th>ylim</th> + <td><p>Plot range in y direction.</p></td> + </tr> + <tr> + <th>col_obs</th> + <td><p>Colors used for plotting the observed data and the corresponding model prediction lines.</p></td> + </tr> + <tr> + <th>pch_obs</th> + <td><p>Symbols to be used for plotting the data.</p></td> + </tr> + <tr> + <th>lty_obs</th> + <td><p>Line types to be used for the model predictions.</p></td> + </tr> + <tr> + <th>add</th> + <td><p>Should the plot be added to an existing plot?</p></td> + </tr> + <tr> + <th>legend</th> + <td><p>Should a legend be added to the plot?</p></td> + </tr> + <tr> + <th>show_residuals</th> + <td><p>Should residuals be shown? If only one plot of the fits is shown, the residual plot is in the lower third of the plot? Otherwise, i.e. if - "sep_obs" is given, the residual plots will be located to the right of - the plots of the fitted curves. - </dd> - <dt>maxabs</dt> - <dd> - Maximum absolute value of the residuals. This is used for the scaling of - the y axis and defaults to "auto". - </dd> - <dt>sep_obs</dt> - <dd> - Should the observed variables be shown in separate subplots? If yes, residual plots - requested by "show_residuals" will be shown next to, not below the plot of the fits. - </dd> - <dt>rel.height.middle</dt> - <dd> - The relative height of the middle plot, if more than two rows of plots are shown. - </dd> - <dt>lpos</dt> - <dd> - Position(s) of the legend(s). Passed to <code>legend</code> as the first argument. - If not length one, this should be of the same length as the obs_var argument. - </dd> - <dt>inset</dt> - <dd> - Passed to <code>legend</code> if applicable. - </dd> - <dt>show_errmin</dt> - <dd> - Should the FOCUS chi2 error value be shown in the upper margin of the plot? - </dd> - <dt>errmin_digits</dt> - <dd> - The number of significant digits for rounding the FOCUS chi2 error percentage. - </dd> - <dt>…</dt> - <dd> - Further arguments passed to <code>plot</code>. - </dd> - </dl> + "sep_obs" is given, the residual plots will be located to the right of + the plots of the fitted curves.</p></td> + </tr> + <tr> + <th>maxabs</th> + <td><p>Maximum absolute value of the residuals. This is used for the scaling of + the y axis and defaults to "auto".</p></td> + </tr> + <tr> + <th>sep_obs</th> + <td><p>Should the observed variables be shown in separate subplots? If yes, residual plots + requested by "show_residuals" will be shown next to, not below the plot of the fits.</p></td> + </tr> + <tr> + <th>rel.height.middle</th> + <td><p>The relative height of the middle plot, if more than two rows of plots are shown.</p></td> + </tr> + <tr> + <th>lpos</th> + <td><p>Position(s) of the legend(s). Passed to <code>legend</code> as the first argument. + If not length one, this should be of the same length as the obs_var argument.</p></td> + </tr> + <tr> + <th>inset</th> + <td><p>Passed to <code>legend</code> if applicable.</p></td> + </tr> + <tr> + <th>show_errmin</th> + <td><p>Should the FOCUS chi2 error value be shown in the upper margin of the plot?</p></td> + </tr> + <tr> + <th>errmin_digits</th> + <td><p>The number of significant digits for rounding the FOCUS chi2 error percentage.</p></td> + </tr> + <tr> + <th>…</th> + <td><p>Further arguments passed to <code>plot</code>.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> diff --git a/docs/reference/plot.mmkin.html b/docs/reference/plot.mmkin.html index 1d5d0574..9f122fa8 100644 --- a/docs/reference/plot.mmkin.html +++ b/docs/reference/plot.mmkin.html @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,8 +72,14 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> +<li> + <a href="../news/index.html">News</a> +</li> </ul> <ul class="nav navbar-nav navbar-right"> @@ -96,53 +104,53 @@ </div> - <p>When x is a row selected from an mmkin object (<code><a href='[.mmkin.html'>[.mmkin</a></code>), the same model + <p>When x is a row selected from an mmkin object (<code><a href='Extract.mmkin.html'>[.mmkin</a></code>), the same model fitted for at least one dataset is shown. When it is a column, the fit of at least one model to the same dataset is shown.</p> - - <p>If the current plot device is a <code><a href='http://www.rdocumentation.org/packages/tikzDevice/topics/tikz'>tikz</a></code> device, +<p>If the current plot device is a <code><a href='http://www.rdocumentation.org/packages/tikzDevice/topics/tikz'>tikz</a></code> device, then latex is being used for the formatting of the chi2 error level.</p> - <pre><span class='co'># S3 method for mmkin</span> + <pre class="usage"><span class='co'># S3 method for mmkin</span> <span class='fu'>plot</span>(<span class='no'>x</span>, <span class='kw'>main</span> <span class='kw'>=</span> <span class='st'>"auto"</span>, <span class='kw'>legends</span> <span class='kw'>=</span> <span class='fl'>1</span>, <span class='kw'>errmin_var</span> <span class='kw'>=</span> <span class='st'>"All data"</span>, <span class='kw'>errmin_digits</span> <span class='kw'>=</span> <span class='fl'>3</span>, <span class='kw'>cex</span> <span class='kw'>=</span> <span class='fl'>0.7</span>, <span class='kw'>rel.height.middle</span> <span class='kw'>=</span> <span class='fl'>0.9</span>, <span class='no'>...</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>x</dt> - <dd> - An object of class <code><a href='mmkin.html'>mmkin</a></code>, with either one row or one column. -</dd> - <dt>main</dt> - <dd> - The main title placed on the outer margin of the plot. -</dd> - <dt>legends</dt> - <dd> - An index for the fits for which legends should be shown. -</dd> - <dt>errmin_var</dt> - <dd> - The variable for which the FOCUS chi2 error value should be shown. -</dd> - <dt>errmin_digits</dt> - <dd> - The number of significant digits for rounding the FOCUS chi2 error percentage. -</dd> - <dt>cex</dt> - <dd> - Passed to the plot functions and <code>mtext</code>. -</dd> - <dt>rel.height.middle</dt> - <dd> - The relative height of the middle plot, if more than two rows of plots are shown. -</dd> - <dt>…</dt> - <dd> - Further arguments passed to <code><a href='plot.mkinfit.html'>plot.mkinfit</a></code> and <code><a href='mkinresplot.html'>mkinresplot</a></code>. -</dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>x</th> + <td><p>An object of class <code><a href='mmkin.html'>mmkin</a></code>, with either one row or one column.</p></td> + </tr> + <tr> + <th>main</th> + <td><p>The main title placed on the outer margin of the plot.</p></td> + </tr> + <tr> + <th>legends</th> + <td><p>An index for the fits for which legends should be shown.</p></td> + </tr> + <tr> + <th>errmin_var</th> + <td><p>The variable for which the FOCUS chi2 error value should be shown.</p></td> + </tr> + <tr> + <th>errmin_digits</th> + <td><p>The number of significant digits for rounding the FOCUS chi2 error percentage.</p></td> + </tr> + <tr> + <th>cex</th> + <td><p>Passed to the plot functions and <code>mtext</code>.</p></td> + </tr> + <tr> + <th>rel.height.middle</th> + <td><p>The relative height of the middle plot, if more than two rows of plots are shown.</p></td> + </tr> + <tr> + <th>…</th> + <td><p>Further arguments passed to <code><a href='plot.mkinfit.html'>plot.mkinfit</a></code> and <code><a href='mkinresplot.html'>mkinresplot</a></code>.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> diff --git a/docs/reference/print.mkinds.html b/docs/reference/print.mkinds.html index b93f416b..50321a7a 100644 --- a/docs/reference/print.mkinds.html +++ b/docs/reference/print.mkinds.html @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -102,20 +107,21 @@ <p>Print mkinds objects.</p> - <pre><span class='co'># S3 method for mkinds</span> + <pre class="usage"><span class='co'># S3 method for mkinds</span> <span class='fu'>print</span>(<span class='no'>x</span>, <span class='no'>...</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>x</dt> - <dd> - An <code><a href='mkinds.html'>mkinds</a></code> object. - </dd> - <dt>…</dt> - <dd> - Not used. - </dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>x</th> + <td><p>An <code><a href='mkinds.html'>mkinds</a></code> object.</p></td> + </tr> + <tr> + <th>…</th> + <td><p>Not used.</p></td> + </tr> + </table> </div> diff --git a/docs/reference/print.mkinmod.html b/docs/reference/print.mkinmod.html index d63694d7..5fd9ebad 100644 --- a/docs/reference/print.mkinmod.html +++ b/docs/reference/print.mkinmod.html @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,8 +72,14 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> +<li> + <a href="../news/index.html">News</a> +</li> </ul> <ul class="nav navbar-nav navbar-right"> @@ -99,20 +107,21 @@ <p>Print mkinmod objects in a way that the user finds his way to get to its components.</p> - <pre><span class='co'># S3 method for mkinmod</span> + <pre class="usage"><span class='co'># S3 method for mkinmod</span> <span class='fu'>print</span>(<span class='no'>x</span>, <span class='no'>...</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>x</dt> - <dd> - An <code><a href='mkinmod.html'>mkinmod</a></code> object. - </dd> - <dt>…</dt> - <dd> - Not used. - </dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>x</th> + <td><p>An <code><a href='mkinmod.html'>mkinmod</a></code> object.</p></td> + </tr> + <tr> + <th>…</th> + <td><p>Not used.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> diff --git a/docs/reference/schaefer07_complex_case.html b/docs/reference/schaefer07_complex_case.html index 46f0a84b..1415d318 100644 --- a/docs/reference/schaefer07_complex_case.html +++ b/docs/reference/schaefer07_complex_case.html @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,8 +72,14 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> +<li> + <a href="../news/index.html">News</a> +</li> </ul> <ul class="nav navbar-nav navbar-right"> @@ -101,20 +109,18 @@ The results from the fitting are also included.</p> - <pre><span class='fu'>data</span>(<span class='no'>schaefer07_complex_case</span>)</pre> + <pre class="usage"><span class='fu'>data</span>(<span class='no'>schaefer07_complex_case</span>)</pre> <h2 class="hasAnchor" id="format"><a class="anchor" href="#format"></a>Format</h2> - <p>The data set is a data frame with 8 observations on the following 6 variables. - <dl class='dl-horizontal'> - <dt><code>time</code></dt><dd>a numeric vector</dd> - <dt><code>parent</code></dt><dd>a numeric vector</dd> - <dt><code>A1</code></dt><dd>a numeric vector</dd> - <dt><code>B1</code></dt><dd>a numeric vector</dd> - <dt><code>C1</code></dt><dd>a numeric vector</dd> - <dt><code>A2</code></dt><dd>a numeric vector</dd> - </dl></p> - <p>The results are a data frame with 14 results for different parameter values</p> + <p>The data set is a data frame with 8 observations on the following 6 variables.</p><dl class='dl-horizontal'> + <dt><code>time</code></dt><dd><p>a numeric vector</p></dd> + <dt><code>parent</code></dt><dd><p>a numeric vector</p></dd> + <dt><code>A1</code></dt><dd><p>a numeric vector</p></dd> + <dt><code>B1</code></dt><dd><p>a numeric vector</p></dd> + <dt><code>C1</code></dt><dd><p>a numeric vector</p></dd> + <dt><code>A2</code></dt><dd><p>a numeric vector</p></dd> + </dl><p>The results are a data frame with 14 results for different parameter values</p> <h2 class="hasAnchor" id="references"><a class="anchor" href="#references"></a>References</h2> @@ -135,7 +141,7 @@ <span class='no'>fit</span> <span class='kw'><-</span> <span class='fu'><a href='mkinfit.html'>mkinfit</a></span>(<span class='no'>model</span>, <span class='no'>data</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>) <span class='fu'>plot</span>(<span class='no'>fit</span>)</div><img src='schaefer07_complex_case-4.png' alt='' width='540' height='400' /><div class='input'> <span class='fu'><a href='endpoints.html'>endpoints</a></span>(<span class='no'>fit</span>)</div><div class='output co'>#> $ff #> parent_A1 parent_B1 parent_C1 parent_sink A1_A2 A1_sink -#> 0.3809619 0.1954668 0.4235713 0.0000000 0.4479607 0.5520393 +#> 0.3809618 0.1954667 0.4235715 0.0000000 0.4479596 0.5520404 #> #> $SFORB #> logical(0) @@ -143,10 +149,10 @@ #> $distimes #> DT50 DT90 #> parent 13.95078 46.34349 -#> A1 49.75343 165.27732 -#> B1 37.26906 123.80513 -#> C1 11.23131 37.30959 -#> A2 28.50640 94.69621 +#> A1 49.75345 165.27739 +#> B1 37.26908 123.80521 +#> C1 11.23130 37.30957 +#> A2 28.50652 94.69662 #> </div><div class='input'> <span class='co'># Compare with the results obtained in the original publication</span> <span class='fu'>print</span>(<span class='no'>schaefer07_complex_results</span>)</div><div class='output co'>#> compound parameter KinGUI ModelMaker deviation diff --git a/docs/reference/summary.mkinfit.html b/docs/reference/summary.mkinfit.html index b305410d..dbed926d 100644 --- a/docs/reference/summary.mkinfit.html +++ b/docs/reference/summary.mkinfit.html @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,8 +72,14 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> +<li> + <a href="../news/index.html">News</a> +</li> </ul> <ul class="nav navbar-nav navbar-right"> @@ -102,48 +110,66 @@ and residual values.</p> - <pre><span class='co'># S3 method for mkinfit</span> + <pre class="usage"><span class='co'># S3 method for mkinfit</span> <span class='fu'>summary</span>(<span class='no'>object</span>, <span class='kw'>data</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, <span class='kw'>distimes</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, <span class='kw'>alpha</span> <span class='kw'>=</span> <span class='fl'>0.05</span>, <span class='no'>...</span>) <span class='co'># S3 method for summary.mkinfit</span> <span class='fu'>print</span>(<span class='no'>x</span>, <span class='kw'>digits</span> <span class='kw'>=</span> <span class='fu'>max</span>(<span class='fl'>3</span>, <span class='fu'>getOption</span>(<span class='st'>"digits"</span>) - <span class='fl'>3</span>), <span class='no'>...</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>object</dt> - <dd> - an object of class <code><a href='mkinfit.html'>mkinfit</a></code>. -</dd> - <dt>x</dt> - <dd> - an object of class <code>summary.mkinfit</code>. -</dd> - <dt>data</dt> - <dd> - logical, indicating whether the data should be included in the summary. -</dd> - <dt>distimes</dt> - <dd> - logical, indicating whether DT50 and DT90 values should be included. -</dd> - <dt>alpha</dt> - <dd> - error level for confidence interval estimation from t distribution -</dd> - <dt>digits</dt> - <dd> - Number of digits to use for printing -</dd> - <dt>…</dt> - <dd> - optional arguments passed to methods like <code>print</code>. -</dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>object</th> + <td><p>an object of class <code><a href='mkinfit.html'>mkinfit</a></code>.</p></td> + </tr> + <tr> + <th>x</th> + <td><p>an object of class <code>summary.mkinfit</code>.</p></td> + </tr> + <tr> + <th>data</th> + <td><p>logical, indicating whether the data should be included in the summary.</p></td> + </tr> + <tr> + <th>distimes</th> + <td><p>logical, indicating whether DT50 and DT90 values should be included.</p></td> + </tr> + <tr> + <th>alpha</th> + <td><p>error level for confidence interval estimation from t distribution</p></td> + </tr> + <tr> + <th>digits</th> + <td><p>Number of digits to use for printing</p></td> + </tr> + <tr> + <th>…</th> + <td><p>optional arguments passed to methods like <code>print</code>.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> <p>The summary function returns a list derived from <code>summary.modFit</code>, with components, among others</p> - <p>The print method is called for its side effect, i.e. printing the summary.</p> +<dt>version, Rversion</dt><dd><p>The mkin and R versions used</p></dd> + <dt>date.fit, date.summary</dt><dd><p>The dates where the fit and the summary were produced</p></dd> + <dt>use_of_ff</dt><dd><p>Was maximum or minimum use made of formation fractions</p></dd> + <dt>residuals, residualVariance, sigma, modVariance, df</dt><dd><p>As in summary.modFit</p></dd> + <dt>cov.unscaled, cov.scaled, info, niter, stopmess, par</dt><dd><p>As in summary.modFit</p></dd> + <dt>bpar</dt><dd><p>Optimised and backtransformed parameters</p></dd> + <dt>diffs </dt><dd><p>The differential equations used in the model</p></dd> + <dt>data </dt><dd><p>The data (see Description above).</p></dd> + <dt>start </dt><dd><p>The starting values and bounds, if applicable, for optimised parameters.</p></dd> + <dt>fixed </dt><dd><p>The values of fixed parameters.</p></dd> + <dt>errmin </dt><dd><p>The chi2 error levels for each observed variable.</p></dd> + <dt>bparms.ode </dt><dd><p>All backtransformed ODE parameters, for use as starting parameters for + related models.</p></dd> + <dt>ff </dt><dd><p>The estimated formation fractions derived from the fitted model.</p></dd> + <dt>distimes </dt><dd><p>The DT50 and DT90 values for each observed variable.</p></dd> + <dt>SFORB</dt><dd><p>If applicable, eigenvalues of SFORB components of the model.</p></dd> + The print method is called for its side effect, i.e. printing the summary. + <h2 class="hasAnchor" id="references"><a class="anchor" href="#references"></a>References</h2> @@ -151,21 +177,21 @@ Degradation Kinetics from Environmental Fate Studies on Pesticides in EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, - <a href = 'http://focus.jrc.ec.europa.eu/dk'>http://focus.jrc.ec.europa.eu/dk</a></p> + <a href = 'http://esdac.jrc.europa.eu/projects/degradation-kinetics'>http://esdac.jrc.europa.eu/projects/degradation-kinetics</a></p> <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> - <pre class="examples"><div class='input'> <span class='fu'>summary</span>(<span class='fu'><a href='mkinfit.html'>mkinfit</a></span>(<span class='fu'><a href='mkinmod.html'>mkinmod</a></span>(<span class='kw'>parent</span> <span class='kw'>=</span> <span class='fu'><a href='mkinsub.html'>mkinsub</a></span>(<span class='st'>"SFO"</span>)), <span class='no'>FOCUS_2006_A</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>))</div><div class='output co'>#> mkin version: 0.9.44.9000 -#> R version: 3.3.2 -#> Date of fit: Thu Dec 8 07:57:55 2016 -#> Date of summary: Thu Dec 8 07:57:55 2016 + <pre class="examples"><div class='input'> <span class='fu'>summary</span>(<span class='fu'><a href='mkinfit.html'>mkinfit</a></span>(<span class='fu'><a href='mkinmod.html'>mkinmod</a></span>(<span class='kw'>parent</span> <span class='kw'>=</span> <span class='fu'><a href='mkinsub.html'>mkinsub</a></span>(<span class='st'>"SFO"</span>)), <span class='no'>FOCUS_2006_A</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>))</div><div class='output co'>#> mkin version: 0.9.45.2 +#> R version: 3.4.0 +#> Date of fit: Fri May 5 12:46:20 2017 +#> Date of summary: Fri May 5 12:46:20 2017 #> #> Equations: #> d_parent/dt = - k_parent_sink * parent #> #> Model predictions using solution type analytical #> -#> Fitted with method Port using 35 model solutions performed in 0.079 s +#> Fitted with method Port using 35 model solutions performed in 0.082 s #> #> Weighting: none #> diff --git a/docs/reference/synthetic_data_for_UBA.html b/docs/reference/synthetic_data_for_UBA.html index bc2bb02b..d8ff3a1e 100644 --- a/docs/reference/synthetic_data_for_UBA.html +++ b/docs/reference/synthetic_data_for_UBA.html @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,8 +72,14 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> +<li> + <a href="../news/index.html">News</a> +</li> </ul> <ul class="nav navbar-nav navbar-right"> @@ -99,39 +107,34 @@ <p>The 12 datasets were generated using four different models and three different variance components. The four models are either the SFO or the DFOP model with either two sequential or two parallel metabolites.</p> - - <p>Variance component 'a' is based on a normal distribution with standard deviation of 3, - Variance component 'b' is also based on a normal distribution, but with a standard deviation of 7. - Variance component 'c' is based on the error model from Rocke and Lorenzato (1995), with the +<p>Variance component 'a' is based on a normal distribution with standard deviation of 3, + Variance component 'b' is also based on a normal distribution, but with a standard deviation of 7. + Variance component 'c' is based on the error model from Rocke and Lorenzato (1995), with the minimum standard deviation (for small y values) of 0.5, and a proportionality constant of 0.07 for the increase of the standard deviation with y.</p> - - <p>Initial concentrations for metabolites and all values where adding the variance component resulted +<p>Initial concentrations for metabolites and all values where adding the variance component resulted in a value below the assumed limit of detection of 0.1 were set to <code>NA</code>.</p> - - <p>As an example, the first dataset has the title <code>SFO_lin_a</code> and is based on the SFO model - with two sequential metabolites (linear pathway), with added variance component 'a'.</p> - - <p>Compare also the code in the example section to see the degradation models.</p> +<p>As an example, the first dataset has the title <code>SFO_lin_a</code> and is based on the SFO model + with two sequential metabolites (linear pathway), with added variance component 'a'.</p> +<p>Compare also the code in the example section to see the degradation models.</p> - <pre><span class='no'>synthetic_data_for_UBA_2014</span></pre> + <pre class="usage"><span class='no'>synthetic_data_for_UBA_2014</span></pre> <h2 class="hasAnchor" id="format"><a class="anchor" href="#format"></a>Format</h2> - <p>A list containing datasets in the form internally used by the 'gmkin' package. + <p>A list containing datasets in the form internally used by the 'gmkin' package. The list has twelfe components. Each of the components is one dataset that has, - among others, the following components - <dl class='dl-horizontal'> - <dt><code>title</code></dt><dd>The name of the dataset, e.g. <code>SFO_lin_a</code></dd> - <dt><code>data</code></dt><dd>A data frame with the data in the form expected by <code><a href='mkinfit.html'>mkinfit</a></code></dd> - </dl></p> + among others, the following components</p><dl class='dl-horizontal'> + <dt><code>title</code></dt><dd><p>The name of the dataset, e.g. <code>SFO_lin_a</code></p></dd> + <dt><code>data</code></dt><dd><p>A data frame with the data in the form expected by <code><a href='mkinfit.html'>mkinfit</a></code></p></dd> + </dl> <h2 class="hasAnchor" id="source"><a class="anchor" href="#source"></a>Source</h2> <p>Ranke (2014) Prüfung und Validierung von Modellierungssoftware als Alternative - zu ModelMaker 4.0, Umweltbundesamt Projektnummer 27452</p> - <p>Rocke, David M. und Lorenzato, Stefan (1995) A two-component model for + zu ModelMaker 4.0, Umweltbundesamt Projektnummer 27452 + Rocke, David M. und Lorenzato, Stefan (1995) A two-component model for measurement error in analytical chemistry. Technometrics 37(2), 176-184.</p> @@ -153,10 +156,10 @@ <span class='kw'>M1</span> <span class='kw'>=</span> <span class='fu'>list</span>(<span class='kw'>type</span> <span class='kw'>=</span> <span class='st'>"SFO"</span>), <span class='kw'>M2</span> <span class='kw'>=</span> <span class='fu'>list</span>(<span class='kw'>type</span> <span class='kw'>=</span> <span class='st'>"SFO"</span>), <span class='kw'>use_of_ff</span> <span class='kw'>=</span> <span class='st'>"max"</span>)</div><div class='output co'>#> <span class='message'>Successfully compiled differential equation model from auto-generated C code.</span></div><div class='input'> <span class='no'>fit</span> <span class='kw'><-</span> <span class='fu'><a href='mkinfit.html'>mkinfit</a></span>(<span class='no'>m_synth_SFO_lin</span>, <span class='no'>synthetic_data_for_UBA_2014</span><span class='kw'>[[</span><span class='fl'>1</span>]]$<span class='no'>data</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>) -<span class='fu'><a href='plot.mkinfit.html'>plot_sep</a></span>(<span class='no'>fit</span>)</div><img src='synthetic_data_for_UBA_2014-10.png' alt='' width='540' height='400' /><div class='input'><span class='fu'>summary</span>(<span class='no'>fit</span>)</div><div class='output co'>#> mkin version: 0.9.44.9000 -#> R version: 3.3.2 -#> Date of fit: Thu Dec 8 07:57:58 2016 -#> Date of summary: Thu Dec 8 07:57:58 2016 +<span class='fu'><a href='plot.mkinfit.html'>plot_sep</a></span>(<span class='no'>fit</span>)</div><img src='synthetic_data_for_UBA_2014-10.png' alt='' width='540' height='400' /><div class='input'><span class='fu'>summary</span>(<span class='no'>fit</span>)</div><div class='output co'>#> mkin version: 0.9.45.2 +#> R version: 3.4.0 +#> Date of fit: Fri May 5 12:46:23 2017 +#> Date of summary: Fri May 5 12:46:23 2017 #> #> Equations: #> d_parent/dt = - k_parent * parent @@ -165,7 +168,7 @@ #> #> Model predictions using solution type deSolve #> -#> Fitted with method Port using 351 model solutions performed in 2.152 s +#> Fitted with method Port using 381 model solutions performed in 2.203 s #> #> Weighting: none #> @@ -205,10 +208,10 @@ #> parent_0 log_k_parent log_k_M1 log_k_M2 f_parent_ilr_1 #> parent_0 1.00000 0.40213 -0.1693 0.02912 -0.4726 #> log_k_parent 0.40213 1.00000 -0.4210 0.07241 -0.5837 -#> log_k_M1 -0.16931 -0.42102 1.0000 -0.37657 0.7438 +#> log_k_M1 -0.16931 -0.42103 1.0000 -0.37657 0.7438 #> log_k_M2 0.02912 0.07241 -0.3766 1.00000 -0.2518 #> f_parent_ilr_1 -0.47263 -0.58367 0.7438 -0.25177 1.0000 -#> f_M1_ilr_1 0.17148 0.42642 -0.8054 0.52648 -0.8602 +#> f_M1_ilr_1 0.17148 0.42643 -0.8054 0.52647 -0.8602 #> f_M1_ilr_1 #> parent_0 0.1715 #> log_k_parent 0.4264 @@ -255,8 +258,8 @@ #> time variable observed predicted residual #> 0 parent 101.5 1.021e+02 -0.56248 #> 0 parent 101.2 1.021e+02 -0.86248 -#> 1 parent 53.9 4.873e+01 5.17119 -#> 1 parent 47.5 4.873e+01 -1.22881 +#> 1 parent 53.9 4.873e+01 5.17118 +#> 1 parent 47.5 4.873e+01 -1.22882 #> 3 parent 10.4 1.111e+01 -0.70773 #> 3 parent 7.6 1.111e+01 -3.50773 #> 7 parent 1.1 5.772e-01 0.52283 @@ -273,12 +276,12 @@ #> 120 parent 3.5 -2.805e-11 3.50000 #> 0 M1 NA 0.000e+00 NA #> 0 M1 NA 0.000e+00 NA -#> 1 M1 36.4 3.479e+01 1.61089 -#> 1 M1 37.4 3.479e+01 2.61089 +#> 1 M1 36.4 3.479e+01 1.61088 +#> 1 M1 37.4 3.479e+01 2.61088 #> 3 M1 34.3 3.937e+01 -5.07027 #> 3 M1 39.8 3.937e+01 0.42973 -#> 7 M1 15.1 1.549e+01 -0.38714 -#> 7 M1 17.8 1.549e+01 2.31286 +#> 7 M1 15.1 1.549e+01 -0.38715 +#> 7 M1 17.8 1.549e+01 2.31285 #> 14 M1 5.8 1.995e+00 3.80469 #> 14 M1 1.2 1.995e+00 -0.79531 #> 28 M1 NA 3.034e-02 NA @@ -295,16 +298,16 @@ #> 1 M2 4.8 4.455e+00 0.34517 #> 3 M2 20.9 2.153e+01 -0.62527 #> 3 M2 19.3 2.153e+01 -2.22527 -#> 7 M2 42.0 4.192e+01 0.07942 -#> 7 M2 43.1 4.192e+01 1.17942 -#> 14 M2 49.4 4.557e+01 3.83354 -#> 14 M2 44.3 4.557e+01 -1.26646 +#> 7 M2 42.0 4.192e+01 0.07941 +#> 7 M2 43.1 4.192e+01 1.17941 +#> 14 M2 49.4 4.557e+01 3.83353 +#> 14 M2 44.3 4.557e+01 -1.26647 #> 28 M2 34.6 3.547e+01 -0.87275 #> 28 M2 33.0 3.547e+01 -2.47275 #> 60 M2 18.8 1.858e+01 0.21837 #> 60 M2 17.6 1.858e+01 -0.98163 -#> 90 M2 10.6 1.013e+01 0.47131 -#> 90 M2 10.8 1.013e+01 0.67131 +#> 90 M2 10.6 1.013e+01 0.47130 +#> 90 M2 10.8 1.013e+01 0.67130 #> 120 M2 9.8 5.521e+00 4.27893 #> 120 M2 3.3 5.521e+00 -2.22107</div><div class='input'> </div></pre> diff --git a/docs/reference/transform_odeparms.html b/docs/reference/transform_odeparms.html index e1fb0437..c14740c2 100644 --- a/docs/reference/transform_odeparms.html +++ b/docs/reference/transform_odeparms.html @@ -25,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -70,8 +72,14 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> +<li> + <a href="../news/index.html">News</a> +</li> </ul> <ul class="nav navbar-nav navbar-right"> @@ -102,54 +110,54 @@ simple log transformation is used. For compositional parameters, such as the formations fractions that should always sum up to 1 and can not be negative, the <code><a href='ilr.html'>ilr</a></code> transformation is used.</p> - - <p>The transformation of sets of formation fractions is fragile, as it supposes +<p>The transformation of sets of formation fractions is fragile, as it supposes the same ordering of the components in forward and backward transformation. This is no problem for the internal use in <code><a href='mkinfit.html'>mkinfit</a></code>.</p> - <pre><span class='fu'>transform_odeparms</span>(<span class='no'>parms</span>, <span class='no'>mkinmod</span>, + <pre class="usage"><span class='fu'>transform_odeparms</span>(<span class='no'>parms</span>, <span class='no'>mkinmod</span>, <span class='kw'>transform_rates</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, <span class='kw'>transform_fractions</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>) <span class='fu'>backtransform_odeparms</span>(<span class='no'>transparms</span>, <span class='no'>mkinmod</span>, <span class='kw'>transform_rates</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, <span class='kw'>transform_fractions</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>parms</dt> - <dd> - Parameters of kinetic models as used in the differential equations. - </dd> - <dt>transparms</dt> - <dd> - Transformed parameters of kinetic models as used in the fitting procedure. - </dd> - <dt>mkinmod</dt> - <dd> - The kinetic model of class <code><a href='mkinmod.html'>mkinmod</a></code>, containing the names of + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>parms</th> + <td><p>Parameters of kinetic models as used in the differential equations.</p></td> + </tr> + <tr> + <th>transparms</th> + <td><p>Transformed parameters of kinetic models as used in the fitting procedure.</p></td> + </tr> + <tr> + <th>mkinmod</th> + <td><p>The kinetic model of class <code><a href='mkinmod.html'>mkinmod</a></code>, containing the names of the model variables that are needed for grouping the formation fractions before <code><a href='ilr.html'>ilr</a></code> transformation, the parameter names and - the information if the pathway to sink is included in the model. - </dd> - <dt>transform_rates</dt> - <dd> - Boolean specifying if kinetic rate constants should be transformed in the + the information if the pathway to sink is included in the model.</p></td> + </tr> + <tr> + <th>transform_rates</th> + <td><p>Boolean specifying if kinetic rate constants should be transformed in the model specification used in the fitting for better compliance with the assumption of normal distribution of the estimator. If TRUE, also alpha and beta parameters of the FOMC model are log-transformed, as well as k1 and k2 rate constants for the DFOP and HS models and the break point tb - of the HS model. - </dd> - <dt>transform_fractions</dt> - <dd> - Boolean specifying if formation fractions constants should be transformed in the + of the HS model.</p></td> + </tr> + <tr> + <th>transform_fractions</th> + <td><p>Boolean specifying if formation fractions constants should be transformed in the model specification used in the fitting for better compliance with the assumption of normal distribution of the estimator. The default (TRUE) is to do transformations. The g parameter of the DFOP and HS models are also transformed, as they can also be seen as compositional data. The transformation used for these transformations is the <code><a href='ilr.html'>ilr</a></code> - transformation. - </dd> - </dl> + transformation.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> @@ -162,10 +170,10 @@ <span class='kw'>parent</span> <span class='kw'>=</span> <span class='fu'>list</span>(<span class='kw'>type</span> <span class='kw'>=</span> <span class='st'>"SFO"</span>, <span class='kw'>to</span> <span class='kw'>=</span> <span class='st'>"m1"</span>, <span class='kw'>sink</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>), <span class='kw'>m1</span> <span class='kw'>=</span> <span class='fu'>list</span>(<span class='kw'>type</span> <span class='kw'>=</span> <span class='st'>"SFO"</span>))</div><div class='output co'>#> <span class='message'>Successfully compiled differential equation model from auto-generated C code.</span></div><div class='input'><span class='co'># Fit the model to the FOCUS example dataset D using defaults</span> <span class='no'>fit</span> <span class='kw'><-</span> <span class='fu'><a href='mkinfit.html'>mkinfit</a></span>(<span class='no'>SFO_SFO</span>, <span class='no'>FOCUS_2006_D</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>) -<span class='fu'>summary</span>(<span class='no'>fit</span>, <span class='kw'>data</span><span class='kw'>=</span><span class='fl'>FALSE</span>) <span class='co'># See transformed and backtransformed parameters</span></div><div class='output co'>#> mkin version: 0.9.44.9000 -#> R version: 3.3.2 -#> Date of fit: Thu Dec 8 07:57:59 2016 -#> Date of summary: Thu Dec 8 07:57:59 2016 +<span class='fu'>summary</span>(<span class='no'>fit</span>, <span class='kw'>data</span><span class='kw'>=</span><span class='fl'>FALSE</span>) <span class='co'># See transformed and backtransformed parameters</span></div><div class='output co'>#> mkin version: 0.9.45.2 +#> R version: 3.4.0 +#> Date of fit: Fri May 5 12:46:24 2017 +#> Date of summary: Fri May 5 12:46:24 2017 #> #> Equations: #> d_parent/dt = - k_parent_sink * parent - k_parent_m1 * parent @@ -173,7 +181,7 @@ #> #> Model predictions using solution type deSolve #> -#> Fitted with method Port using 153 model solutions performed in 0.621 s +#> Fitted with method Port using 153 model solutions performed in 0.61 s #> #> Weighting: none #> @@ -207,7 +215,7 @@ #> parent_0 1.00000 0.6075 -0.06625 -0.1701 #> log_k_parent_sink 0.60752 1.0000 -0.08740 -0.6253 #> log_k_parent_m1 -0.06625 -0.0874 1.00000 0.4716 -#> log_k_m1_sink -0.17006 -0.6253 0.47163 1.0000 +#> log_k_m1_sink -0.17006 -0.6253 0.47164 1.0000 #> #> Residual standard error: 3.211 on 36 degrees of freedom #> @@ -239,10 +247,10 @@ #> m1 131.761 437.70</div><div class='input'> <span class='no'>fit.2</span> <span class='kw'><-</span> <span class='fu'><a href='mkinfit.html'>mkinfit</a></span>(<span class='no'>SFO_SFO</span>, <span class='no'>FOCUS_2006_D</span>, <span class='kw'>transform_rates</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>) -<span class='fu'>summary</span>(<span class='no'>fit.2</span>, <span class='kw'>data</span><span class='kw'>=</span><span class='fl'>FALSE</span>)</div><div class='output co'>#> mkin version: 0.9.44.9000 -#> R version: 3.3.2 -#> Date of fit: Thu Dec 8 07:58:01 2016 -#> Date of summary: Thu Dec 8 07:58:01 2016 +<span class='fu'>summary</span>(<span class='no'>fit.2</span>, <span class='kw'>data</span><span class='kw'>=</span><span class='fl'>FALSE</span>)</div><div class='output co'>#> mkin version: 0.9.45.2 +#> R version: 3.4.0 +#> Date of fit: Fri May 5 12:46:26 2017 +#> Date of summary: Fri May 5 12:46:26 2017 #> #> Equations: #> d_parent/dt = - k_parent_sink * parent - k_parent_m1 * parent @@ -250,7 +258,7 @@ #> #> Model predictions using solution type deSolve #> -#> Fitted with method Port using 327 model solutions performed in 1.419 s +#> Fitted with method Port using 352 model solutions performed in 1.437 s #> #> Weighting: none #> @@ -329,10 +337,10 @@ <span class='kw'>m1</span> <span class='kw'>=</span> <span class='fu'>list</span>(<span class='kw'>type</span> <span class='kw'>=</span> <span class='st'>"SFO"</span>), <span class='kw'>use_of_ff</span> <span class='kw'>=</span> <span class='st'>"max"</span>)</div><div class='output co'>#> <span class='message'>Successfully compiled differential equation model from auto-generated C code.</span></div><div class='input'> <span class='no'>fit.ff</span> <span class='kw'><-</span> <span class='fu'><a href='mkinfit.html'>mkinfit</a></span>(<span class='no'>SFO_SFO.ff</span>, <span class='no'>FOCUS_2006_D</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>) -<span class='fu'>summary</span>(<span class='no'>fit.ff</span>, <span class='kw'>data</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>)</div><div class='output co'>#> mkin version: 0.9.44.9000 -#> R version: 3.3.2 -#> Date of fit: Thu Dec 8 07:58:02 2016 -#> Date of summary: Thu Dec 8 07:58:02 2016 +<span class='fu'>summary</span>(<span class='no'>fit.ff</span>, <span class='kw'>data</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>)</div><div class='output co'>#> mkin version: 0.9.45.2 +#> R version: 3.4.0 +#> Date of fit: Fri May 5 12:46:27 2017 +#> Date of summary: Fri May 5 12:46:27 2017 #> #> Equations: #> d_parent/dt = - k_parent * parent @@ -340,7 +348,7 @@ #> #> Model predictions using solution type deSolve #> -#> Fitted with method Port using 185 model solutions performed in 0.814 s +#> Fitted with method Port using 185 model solutions performed in 0.776 s #> #> Weighting: none #> @@ -413,10 +421,10 @@ <span class='kw'>use_of_ff</span> <span class='kw'>=</span> <span class='st'>"max"</span>)</div><div class='output co'>#> <span class='message'>Successfully compiled differential equation model from auto-generated C code.</span></div><div class='input'> <span class='no'>fit.ff.2</span> <span class='kw'><-</span> <span class='fu'><a href='mkinfit.html'>mkinfit</a></span>(<span class='no'>SFO_SFO.ff.2</span>, <span class='no'>FOCUS_2006_D</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>) -<span class='fu'>summary</span>(<span class='no'>fit.ff.2</span>, <span class='kw'>data</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>)</div><div class='output co'>#> mkin version: 0.9.44.9000 -#> R version: 3.3.2 -#> Date of fit: Thu Dec 8 07:58:03 2016 -#> Date of summary: Thu Dec 8 07:58:03 2016 +<span class='fu'>summary</span>(<span class='no'>fit.ff.2</span>, <span class='kw'>data</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>)</div><div class='output co'>#> mkin version: 0.9.45.2 +#> R version: 3.4.0 +#> Date of fit: Fri May 5 12:46:28 2017 +#> Date of summary: Fri May 5 12:46:28 2017 #> #> Equations: #> d_parent/dt = - k_parent * parent @@ -424,7 +432,7 @@ #> #> Model predictions using solution type deSolve #> -#> Fitted with method Port using 104 model solutions performed in 0.436 s +#> Fitted with method Port using 104 model solutions performed in 0.433 s #> #> Weighting: none #> @@ -463,7 +471,7 @@ #> t-test (unrealistically) based on the assumption of normal distribution #> for estimators of untransformed parameters. #> Estimate t value Pr(>t) Lower Upper -#> parent_0 84.79000 28.600 3.939e-27 78.78000 90.80000 +#> parent_0 84.79000 28.600 3.938e-27 78.78000 90.80000 #> k_parent 0.06352 12.360 5.237e-15 0.05392 0.07483 #> k_m1 0.01478 8.966 4.114e-11 0.01179 0.01853 #> diff --git a/docs/reference/twa.html b/docs/reference/twa.html index 06a501a6..be76b439 100644 --- a/docs/reference/twa.html +++ b/docs/reference/twa.html @@ -6,8 +6,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title> - — twa • mkin</title> +<title>Function to calculate maximum time weighted average concentrations from kinetic models fitted with mkinfit — twa • mkin</title> <!-- jquery --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" crossorigin="anonymous"></script> @@ -26,12 +25,14 @@ <script src="../pkgdown.js"></script> <!-- mathjax --> -<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> +<script src='https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> + + </head> <body> @@ -71,6 +72,9 @@ <li> <a href="../articles/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a> </li> + <li> + <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a> + </li> </ul> </li> <li> @@ -96,8 +100,7 @@ <div class="row"> <div class="col-md-9 contents"> <div class="page-header"> - <h1> -</h1> + <h1>Function to calculate maximum time weighted average concentrations from kinetic models fitted with mkinfit</h1> </div> @@ -108,19 +111,20 @@ using the analytical formulas given in the PEC soil section of the FOCUS guidance.</p> - <pre><span class='fu'>twa</span>(<span class='no'>fit</span>, <span class='no'>windows</span>)</pre> + <pre class="usage"><span class='fu'>twa</span>(<span class='no'>fit</span>, <span class='no'>windows</span>)</pre> <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a> Arguments</h2> - <dl class="dl-horizontal"> - <dt>fit</dt> - <dd> - An object of class <code><a href='mkinfit.html'>mkinfit</a></code>. - </dd> - <dt>windows</dt> - <dd> - The width of the time windows for which the TWAs should be calculated. - </dd> - </dl> + <table class="ref-arguments"> + <colgroup><col class="name" /><col class="desc" /></colgroup> + <tr> + <th>fit</th> + <td><p>An object of class <code><a href='mkinfit.html'>mkinfit</a></code>.</p></td> + </tr> + <tr> + <th>windows</th> + <td><p>The width of the time windows for which the TWAs should be calculated.</p></td> + </tr> + </table> <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2> @@ -132,7 +136,7 @@ guidance.</p> Degradation Kinetics from Environmental Fate Studies on Pesticides in EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, - <a href = 'http://http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics'>http://http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics</a></p> + <a href = 'http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics'>http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics</a></p> <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2> diff --git a/man/DFOP.solution.Rd b/man/DFOP.solution.Rd index d24ac63f..3e23f011 100644 --- a/man/DFOP.solution.Rd +++ b/man/DFOP.solution.Rd @@ -27,7 +27,7 @@ DFOP.solution(t, parent.0, k1, k2, g) Degradation Kinetics from Environmental Fate Studies on Pesticides in EU
Registration} Report of the FOCUS Work Group on Degradation Kinetics,
EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,
- \url{http://focus.jrc.ec.europa.eu/dk}
+ \url{http://esdac.jrc.europa.eu/projects/degradation-kinetics}
}
\examples{
plot(function(x) DFOP.solution(x, 100, 5, 0.5, 0.3), 0, 4, ylim=c(0,100))
diff --git a/man/FOCUS_2006_DFOP_ref_A_to_B.Rd b/man/FOCUS_2006_DFOP_ref_A_to_B.Rd index a4ae46c1..4a4025d8 100644 --- a/man/FOCUS_2006_DFOP_ref_A_to_B.Rd +++ b/man/FOCUS_2006_DFOP_ref_A_to_B.Rd @@ -30,7 +30,7 @@ in this fit. Degradation Kinetics from Environmental Fate Studies on Pesticides in EU
Registration} Report of the FOCUS Work Group on Degradation Kinetics,
EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,
- \url{http://focus.jrc.ec.europa.eu/dk}
+ \url{http://esdac.jrc.europa.eu/projects/degradation-kinetics}
}
\examples{
data(FOCUS_2006_DFOP_ref_A_to_B)
diff --git a/man/FOCUS_2006_FOMC_ref_A_to_F.Rd b/man/FOCUS_2006_FOMC_ref_A_to_F.Rd index edbb863d..603dd6b1 100644 --- a/man/FOCUS_2006_FOMC_ref_A_to_F.Rd +++ b/man/FOCUS_2006_FOMC_ref_A_to_F.Rd @@ -29,7 +29,7 @@ in this fit. Degradation Kinetics from Environmental Fate Studies on Pesticides in EU
Registration} Report of the FOCUS Work Group on Degradation Kinetics,
EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,
- \url{http://focus.jrc.ec.europa.eu/dk}
+ \url{http://esdac.jrc.europa.eu/projects/degradation-kinetics}
}
\examples{
data(FOCUS_2006_FOMC_ref_A_to_F)
diff --git a/man/FOCUS_2006_HS_ref_A_to_F.Rd b/man/FOCUS_2006_HS_ref_A_to_F.Rd index c44d0f32..4316be18 100644 --- a/man/FOCUS_2006_HS_ref_A_to_F.Rd +++ b/man/FOCUS_2006_HS_ref_A_to_F.Rd @@ -30,7 +30,7 @@ in this fit. Degradation Kinetics from Environmental Fate Studies on Pesticides in EU
Registration} Report of the FOCUS Work Group on Degradation Kinetics,
EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,
- \url{http://focus.jrc.ec.europa.eu/dk}
+ \url{http://esdac.jrc.europa.eu/projects/degradation-kinetics}
}
\examples{
data(FOCUS_2006_HS_ref_A_to_F)
diff --git a/man/FOCUS_2006_SFO_ref_A_to_F.Rd b/man/FOCUS_2006_SFO_ref_A_to_F.Rd index 6e7316e2..aba80955 100644 --- a/man/FOCUS_2006_SFO_ref_A_to_F.Rd +++ b/man/FOCUS_2006_SFO_ref_A_to_F.Rd @@ -28,7 +28,7 @@ in this fit. Degradation Kinetics from Environmental Fate Studies on Pesticides in EU
Registration} Report of the FOCUS Work Group on Degradation Kinetics,
EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,
- \url{http://focus.jrc.ec.europa.eu/dk}
+ \url{http://esdac.jrc.europa.eu/projects/degradation-kinetics}
}
\examples{
data(FOCUS_2006_SFO_ref_A_to_F)
diff --git a/man/FOCUS_2006_datasets.Rd b/man/FOCUS_2006_datasets.Rd index 1e081c57..5d767b8e 100644 --- a/man/FOCUS_2006_datasets.Rd +++ b/man/FOCUS_2006_datasets.Rd @@ -26,7 +26,7 @@ Data taken from FOCUS (2006), p. 258. Degradation Kinetics from Environmental Fate Studies on Pesticides in EU
Registration} Report of the FOCUS Work Group on Degradation Kinetics,
EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,
- \url{http://focus.jrc.ec.europa.eu/dk}
+ \url{http://esdac.jrc.europa.eu/projects/degradation-kinetics}
}
\examples{
FOCUS_2006_C
diff --git a/man/FOMC.solution.Rd b/man/FOMC.solution.Rd index a006f6bd..673c3387 100644 --- a/man/FOMC.solution.Rd +++ b/man/FOMC.solution.Rd @@ -36,7 +36,7 @@ FOMC.solution(t, parent.0, alpha, beta) Degradation Kinetics from Environmental Fate Studies on Pesticides in EU
Registration} Report of the FOCUS Work Group on Degradation Kinetics,
EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,
- \url{http://focus.jrc.ec.europa.eu/dk}
+ \url{http://esdac.jrc.europa.eu/projects/degradation-kinetics}
Gustafson DI and Holden LR (1990) Nonlinear pesticide dissipation in soil: A
new model based on spatial variability. \emph{Environmental Science and
diff --git a/man/HS.solution.Rd b/man/HS.solution.Rd index 91c19e17..67ba500c 100644 --- a/man/HS.solution.Rd +++ b/man/HS.solution.Rd @@ -25,7 +25,7 @@ HS.solution(t, parent.0, k1, k2, tb) Degradation Kinetics from Environmental Fate Studies on Pesticides in EU
Registration} Report of the FOCUS Work Group on Degradation Kinetics,
EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,
- \url{http://focus.jrc.ec.europa.eu/dk}
+ \url{http://esdac.jrc.europa.eu/projects/degradation-kinetics}
}
\examples{
plot(function(x) HS.solution(x, 100, 2, 0.3, 0.5), 0, 2, ylim=c(0,100))
diff --git a/man/SFO.solution.Rd b/man/SFO.solution.Rd index 136420fe..747597f6 100644 --- a/man/SFO.solution.Rd +++ b/man/SFO.solution.Rd @@ -20,7 +20,7 @@ Degradation Kinetics from Environmental Fate Studies on Pesticides in EU
Registration} Report of the FOCUS Work Group on Degradation Kinetics,
EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,
- \url{http://focus.jrc.ec.europa.eu/dk}
+ \url{http://esdac.jrc.europa.eu/projects/degradation-kinetics}
}
\examples{
\dontrun{plot(function(x) SFO.solution(x, 100, 3), 0, 2)}
diff --git a/man/SFORB.solution.Rd b/man/SFORB.solution.Rd index dc891b20..4904fb0d 100644 --- a/man/SFORB.solution.Rd +++ b/man/SFORB.solution.Rd @@ -27,7 +27,7 @@ Degradation Kinetics from Environmental Fate Studies on Pesticides in EU
Registration} Report of the FOCUS Work Group on Degradation Kinetics,
EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,
- \url{http://focus.jrc.ec.europa.eu/dk}
+ \url{http://esdac.jrc.europa.eu/projects/degradation-kinetics}
}
\examples{
\dontrun{plot(function(x) SFORB.solution(x, 100, 0.5, 2, 3), 0, 2)}
diff --git a/man/mkinerrmin.Rd b/man/mkinerrmin.Rd index 9229fc7f..197d75a6 100644 --- a/man/mkinerrmin.Rd +++ b/man/mkinerrmin.Rd @@ -47,6 +47,6 @@ round(mkinerrmin(fit_FOCUS_E), 4) Degradation Kinetics from Environmental Fate Studies on Pesticides in EU
Registration} Report of the FOCUS Work Group on Degradation Kinetics,
EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,
- \url{http://focus.jrc.ec.europa.eu/dk}
+ \url{http://esdac.jrc.europa.eu/projects/degradation-kinetics}
}
\keyword{ manip }
diff --git a/man/mkinmod.Rd b/man/mkinmod.Rd index 2f007115..428fba3d 100644 --- a/man/mkinmod.Rd +++ b/man/mkinmod.Rd @@ -71,7 +71,7 @@ mkinmod(..., use_of_ff = "min", speclist = NULL, quiet = FALSE, verbose = FALSE) Degradation Kinetics from Environmental Fate Studies on Pesticides in EU
Registration} Report of the FOCUS Work Group on Degradation Kinetics,
EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,
- \url{http://focus.jrc.ec.europa.eu/dk}
+ \url{http://esdac.jrc.europa.eu/projects/degradation-kinetics}
NAFTA Technical Working Group on Pesticides (not dated) Guidance for
Evaluating and Calculating Degradation Kinetics in Environmental
diff --git a/man/summary.mkinfit.Rd b/man/summary.mkinfit.Rd index 876fc362..e7ba9760 100644 --- a/man/summary.mkinfit.Rd +++ b/man/summary.mkinfit.Rd @@ -64,7 +64,7 @@ Degradation Kinetics from Environmental Fate Studies on Pesticides in EU
Registration} Report of the FOCUS Work Group on Degradation Kinetics,
EC Document Reference Sanco/10058/2005 version 2.0, 434 pp,
- \url{http://focus.jrc.ec.europa.eu/dk}
+ \url{http://esdac.jrc.europa.eu/projects/degradation-kinetics}
}
\author{
Johannes Ranke
@@ -32,7 +32,7 @@ guidance.} Degradation Kinetics from Environmental Fate Studies on Pesticides in EU Registration} Report of the FOCUS Work Group on Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, - \url{http://http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics} + \url{http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics} } \author{ Johannes Ranke diff --git a/vignettes/FOCUS_D.html b/vignettes/FOCUS_D.html index 40edec94..5da77efa 100644 --- a/vignettes/FOCUS_D.html +++ b/vignettes/FOCUS_D.html @@ -4,14 +4,14 @@ <head> -<meta charset="utf-8"> +<meta charset="utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="generator" content="pandoc" /> <meta name="author" content="Johannes Ranke" /> -<meta name="date" content="2016-11-18" /> +<meta name="date" content="2017-05-05" /> <title>Example evaluation of FOCUS Example Dataset D</title> @@ -21,7 +21,7 @@ <script src="data:application/x-javascript;base64,LyohCiAqIEJvb3RzdHJhcCB2My4zLjUgKGh0dHA6Ly9nZXRib290c3RyYXAuY29tKQogKiBDb3B5cmlnaHQgMjAxMS0yMDE1IFR3aXR0ZXIsIEluYy4KICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqLwppZigidW5kZWZpbmVkIj09dHlwZW9mIGpRdWVyeSl0aHJvdyBuZXcgRXJyb3IoIkJvb3RzdHJhcCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5Iik7K2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0Ijt2YXIgYj1hLmZuLmpxdWVyeS5zcGxpdCgiICIpWzBdLnNwbGl0KCIuIik7aWYoYlswXTwyJiZiWzFdPDl8fDE9PWJbMF0mJjk9PWJbMV0mJmJbMl08MSl0aHJvdyBuZXcgRXJyb3IoIkJvb3RzdHJhcCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5IHZlcnNpb24gMS45LjEgb3IgaGlnaGVyIil9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYm9vdHN0cmFwIiksYj17V2Via2l0VHJhbnNpdGlvbjoid2Via2l0VHJhbnNpdGlvbkVuZCIsTW96VHJhbnNpdGlvbjoidHJhbnNpdGlvbmVuZCIsT1RyYW5zaXRpb246Im9UcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kIix0cmFuc2l0aW9uOiJ0cmFuc2l0aW9uZW5kIn07Zm9yKHZhciBjIGluIGIpaWYodm9pZCAwIT09YS5zdHlsZVtjXSlyZXR1cm57ZW5kOmJbY119O3JldHVybiExfWEuZm4uZW11bGF0ZVRyYW5zaXRpb25FbmQ9ZnVuY3Rpb24oYil7dmFyIGM9ITEsZD10aGlzO2EodGhpcykub25lKCJic1RyYW5zaXRpb25FbmQiLGZ1bmN0aW9uKCl7Yz0hMH0pO3ZhciBlPWZ1bmN0aW9uKCl7Y3x8YShkKS50cmlnZ2VyKGEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCl9O3JldHVybiBzZXRUaW1lb3V0KGUsYiksdGhpc30sYShmdW5jdGlvbigpe2Euc3VwcG9ydC50cmFuc2l0aW9uPWIoKSxhLnN1cHBvcnQudHJhbnNpdGlvbiYmKGEuZXZlbnQuc3BlY2lhbC5ic1RyYW5zaXRpb25FbmQ9e2JpbmRUeXBlOmEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCxkZWxlZ2F0ZVR5cGU6YS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLGhhbmRsZTpmdW5jdGlvbihiKXtyZXR1cm4gYShiLnRhcmdldCkuaXModGhpcyk/Yi5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfX0pfSl9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGU9Yy5kYXRhKCJicy5hbGVydCIpO2V8fGMuZGF0YSgiYnMuYWxlcnQiLGU9bmV3IGQodGhpcykpLCJzdHJpbmciPT10eXBlb2YgYiYmZVtiXS5jYWxsKGMpfSl9dmFyIGM9J1tkYXRhLWRpc21pc3M9ImFsZXJ0Il0nLGQ9ZnVuY3Rpb24oYil7YShiKS5vbigiY2xpY2siLGMsdGhpcy5jbG9zZSl9O2QuVkVSU0lPTj0iMy4zLjUiLGQuVFJBTlNJVElPTl9EVVJBVElPTj0xNTAsZC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYygpe2cuZGV0YWNoKCkudHJpZ2dlcigiY2xvc2VkLmJzLmFsZXJ0IikucmVtb3ZlKCl9dmFyIGU9YSh0aGlzKSxmPWUuYXR0cigiZGF0YS10YXJnZXQiKTtmfHwoZj1lLmF0dHIoImhyZWYiKSxmPWYmJmYucmVwbGFjZSgvLiooPz0jW15cc10qJCkvLCIiKSk7dmFyIGc9YShmKTtiJiZiLnByZXZlbnREZWZhdWx0KCksZy5sZW5ndGh8fChnPWUuY2xvc2VzdCgiLmFsZXJ0IikpLGcudHJpZ2dlcihiPWEuRXZlbnQoImNsb3NlLmJzLmFsZXJ0IikpLGIuaXNEZWZhdWx0UHJldmVudGVkKCl8fChnLnJlbW92ZUNsYXNzKCJpbiIpLGEuc3VwcG9ydC50cmFuc2l0aW9uJiZnLmhhc0NsYXNzKCJmYWRlIik/Zy5vbmUoImJzVHJhbnNpdGlvbkVuZCIsYykuZW11bGF0ZVRyYW5zaXRpb25FbmQoZC5UUkFOU0lUSU9OX0RVUkFUSU9OKTpjKCkpfTt2YXIgZT1hLmZuLmFsZXJ0O2EuZm4uYWxlcnQ9YixhLmZuLmFsZXJ0LkNvbnN0cnVjdG9yPWQsYS5mbi5hbGVydC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4uYWxlcnQ9ZSx0aGlzfSxhKGRvY3VtZW50KS5vbigiY2xpY2suYnMuYWxlcnQuZGF0YS1hcGkiLGMsZC5wcm90b3R5cGUuY2xvc2UpfShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YSgiYnMuYnV0dG9uIiksZj0ib2JqZWN0Ij09dHlwZW9mIGImJmI7ZXx8ZC5kYXRhKCJicy5idXR0b24iLGU9bmV3IGModGhpcyxmKSksInRvZ2dsZSI9PWI/ZS50b2dnbGUoKTpiJiZlLnNldFN0YXRlKGIpfSl9dmFyIGM9ZnVuY3Rpb24oYixkKXt0aGlzLiRlbGVtZW50PWEoYiksdGhpcy5vcHRpb25zPWEuZXh0ZW5kKHt9LGMuREVGQVVMVFMsZCksdGhpcy5pc0xvYWRpbmc9ITF9O2MuVkVSU0lPTj0iMy4zLjUiLGMuREVGQVVMVFM9e2xvYWRpbmdUZXh0OiJsb2FkaW5nLi4uIn0sYy5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oYil7dmFyIGM9ImRpc2FibGVkIixkPXRoaXMuJGVsZW1lbnQsZT1kLmlzKCJpbnB1dCIpPyJ2YWwiOiJodG1sIixmPWQuZGF0YSgpO2IrPSJUZXh0IixudWxsPT1mLnJlc2V0VGV4dCYmZC5kYXRhKCJyZXNldFRleHQiLGRbZV0oKSksc2V0VGltZW91dChhLnByb3h5KGZ1bmN0aW9uKCl7ZFtlXShudWxsPT1mW2JdP3RoaXMub3B0aW9uc1tiXTpmW2JdKSwibG9hZGluZ1RleHQiPT1iPyh0aGlzLmlzTG9hZGluZz0hMCxkLmFkZENsYXNzKGMpLmF0dHIoYyxjKSk6dGhpcy5pc0xvYWRpbmcmJih0aGlzLmlzTG9hZGluZz0hMSxkLnJlbW92ZUNsYXNzKGMpLnJlbW92ZUF0dHIoYykpfSx0aGlzKSwwKX0sYy5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKCl7dmFyIGE9ITAsYj10aGlzLiRlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLXRvZ2dsZT0iYnV0dG9ucyJdJyk7aWYoYi5sZW5ndGgpe3ZhciBjPXRoaXMuJGVsZW1lbnQuZmluZCgiaW5wdXQiKTsicmFkaW8iPT1jLnByb3AoInR5cGUiKT8oYy5wcm9wKCJjaGVja2VkIikmJihhPSExKSxiLmZpbmQoIi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIiksdGhpcy4kZWxlbWVudC5hZGRDbGFzcygiYWN0aXZlIikpOiJjaGVja2JveCI9PWMucHJvcCgidHlwZSIpJiYoYy5wcm9wKCJjaGVja2VkIikhPT10aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJhY3RpdmUiKSYmKGE9ITEpLHRoaXMuJGVsZW1lbnQudG9nZ2xlQ2xhc3MoImFjdGl2ZSIpKSxjLnByb3AoImNoZWNrZWQiLHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImFjdGl2ZSIpKSxhJiZjLnRyaWdnZXIoImNoYW5nZSIpfWVsc2UgdGhpcy4kZWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLCF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJhY3RpdmUiKSksdGhpcy4kZWxlbWVudC50b2dnbGVDbGFzcygiYWN0aXZlIil9O3ZhciBkPWEuZm4uYnV0dG9uO2EuZm4uYnV0dG9uPWIsYS5mbi5idXR0b24uQ29uc3RydWN0b3I9YyxhLmZuLmJ1dHRvbi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4uYnV0dG9uPWQsdGhpc30sYShkb2N1bWVudCkub24oImNsaWNrLmJzLmJ1dHRvbi5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZV49ImJ1dHRvbiJdJyxmdW5jdGlvbihjKXt2YXIgZD1hKGMudGFyZ2V0KTtkLmhhc0NsYXNzKCJidG4iKXx8KGQ9ZC5jbG9zZXN0KCIuYnRuIikpLGIuY2FsbChkLCJ0b2dnbGUiKSxhKGMudGFyZ2V0KS5pcygnaW5wdXRbdHlwZT0icmFkaW8iXScpfHxhKGMudGFyZ2V0KS5pcygnaW5wdXRbdHlwZT0iY2hlY2tib3giXScpfHxjLnByZXZlbnREZWZhdWx0KCl9KS5vbigiZm9jdXMuYnMuYnV0dG9uLmRhdGEtYXBpIGJsdXIuYnMuYnV0dG9uLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlXj0iYnV0dG9uIl0nLGZ1bmN0aW9uKGIpe2EoYi50YXJnZXQpLmNsb3Nlc3QoIi5idG4iKS50b2dnbGVDbGFzcygiZm9jdXMiLC9eZm9jdXMoaW4pPyQvLnRlc3QoYi50eXBlKSl9KX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGIoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1kLmRhdGEoImJzLmNhcm91c2VsIiksZj1hLmV4dGVuZCh7fSxjLkRFRkFVTFRTLGQuZGF0YSgpLCJvYmplY3QiPT10eXBlb2YgYiYmYiksZz0ic3RyaW5nIj09dHlwZW9mIGI/YjpmLnNsaWRlO2V8fGQuZGF0YSgiYnMuY2Fyb3VzZWwiLGU9bmV3IGModGhpcyxmKSksIm51bWJlciI9PXR5cGVvZiBiP2UudG8oYik6Zz9lW2ddKCk6Zi5pbnRlcnZhbCYmZS5wYXVzZSgpLmN5Y2xlKCl9KX12YXIgYz1mdW5jdGlvbihiLGMpe3RoaXMuJGVsZW1lbnQ9YShiKSx0aGlzLiRpbmRpY2F0b3JzPXRoaXMuJGVsZW1lbnQuZmluZCgiLmNhcm91c2VsLWluZGljYXRvcnMiKSx0aGlzLm9wdGlvbnM9Yyx0aGlzLnBhdXNlZD1udWxsLHRoaXMuc2xpZGluZz1udWxsLHRoaXMuaW50ZXJ2YWw9bnVsbCx0aGlzLiRhY3RpdmU9bnVsbCx0aGlzLiRpdGVtcz1udWxsLHRoaXMub3B0aW9ucy5rZXlib2FyZCYmdGhpcy4kZWxlbWVudC5vbigia2V5ZG93bi5icy5jYXJvdXNlbCIsYS5wcm94eSh0aGlzLmtleWRvd24sdGhpcykpLCJob3ZlciI9PXRoaXMub3B0aW9ucy5wYXVzZSYmISgib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkmJnRoaXMuJGVsZW1lbnQub24oIm1vdXNlZW50ZXIuYnMuY2Fyb3VzZWwiLGEucHJveHkodGhpcy5wYXVzZSx0aGlzKSkub24oIm1vdXNlbGVhdmUuYnMuY2Fyb3VzZWwiLGEucHJveHkodGhpcy5jeWNsZSx0aGlzKSl9O2MuVkVSU0lPTj0iMy4zLjUiLGMuVFJBTlNJVElPTl9EVVJBVElPTj02MDAsYy5ERUZBVUxUUz17aW50ZXJ2YWw6NWUzLHBhdXNlOiJob3ZlciIsd3JhcDohMCxrZXlib2FyZDohMH0sYy5wcm90b3R5cGUua2V5ZG93bj1mdW5jdGlvbihhKXtpZighL2lucHV0fHRleHRhcmVhL2kudGVzdChhLnRhcmdldC50YWdOYW1lKSl7c3dpdGNoKGEud2hpY2gpe2Nhc2UgMzc6dGhpcy5wcmV2KCk7YnJlYWs7Y2FzZSAzOTp0aGlzLm5leHQoKTticmVhaztkZWZhdWx0OnJldHVybn1hLnByZXZlbnREZWZhdWx0KCl9fSxjLnByb3RvdHlwZS5jeWNsZT1mdW5jdGlvbihiKXtyZXR1cm4gYnx8KHRoaXMucGF1c2VkPSExKSx0aGlzLmludGVydmFsJiZjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpLHRoaXMub3B0aW9ucy5pbnRlcnZhbCYmIXRoaXMucGF1c2VkJiYodGhpcy5pbnRlcnZhbD1zZXRJbnRlcnZhbChhLnByb3h5KHRoaXMubmV4dCx0aGlzKSx0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpKSx0aGlzfSxjLnByb3RvdHlwZS5nZXRJdGVtSW5kZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuJGl0ZW1zPWEucGFyZW50KCkuY2hpbGRyZW4oIi5pdGVtIiksdGhpcy4kaXRlbXMuaW5kZXgoYXx8dGhpcy4kYWN0aXZlKX0sYy5wcm90b3R5cGUuZ2V0SXRlbUZvckRpcmVjdGlvbj1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZ2V0SXRlbUluZGV4KGIpLGQ9InByZXYiPT1hJiYwPT09Y3x8Im5leHQiPT1hJiZjPT10aGlzLiRpdGVtcy5sZW5ndGgtMTtpZihkJiYhdGhpcy5vcHRpb25zLndyYXApcmV0dXJuIGI7dmFyIGU9InByZXYiPT1hPy0xOjEsZj0oYytlKSV0aGlzLiRpdGVtcy5sZW5ndGg7cmV0dXJuIHRoaXMuJGl0ZW1zLmVxKGYpfSxjLnByb3RvdHlwZS50bz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9dGhpcy5nZXRJdGVtSW5kZXgodGhpcy4kYWN0aXZlPXRoaXMuJGVsZW1lbnQuZmluZCgiLml0ZW0uYWN0aXZlIikpO3JldHVybiBhPnRoaXMuJGl0ZW1zLmxlbmd0aC0xfHwwPmE/dm9pZCAwOnRoaXMuc2xpZGluZz90aGlzLiRlbGVtZW50Lm9uZSgic2xpZC5icy5jYXJvdXNlbCIsZnVuY3Rpb24oKXtiLnRvKGEpfSk6Yz09YT90aGlzLnBhdXNlKCkuY3ljbGUoKTp0aGlzLnNsaWRlKGE+Yz8ibmV4dCI6InByZXYiLHRoaXMuJGl0ZW1zLmVxKGEpKX0sYy5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oYil7cmV0dXJuIGJ8fCh0aGlzLnBhdXNlZD0hMCksdGhpcy4kZWxlbWVudC5maW5kKCIubmV4dCwgLnByZXYiKS5sZW5ndGgmJmEuc3VwcG9ydC50cmFuc2l0aW9uJiYodGhpcy4kZWxlbWVudC50cmlnZ2VyKGEuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCksdGhpcy5jeWNsZSghMCkpLHRoaXMuaW50ZXJ2YWw9Y2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKSx0aGlzfSxjLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2xpZGluZz92b2lkIDA6dGhpcy5zbGlkZSgibmV4dCIpfSxjLnByb3RvdHlwZS5wcmV2PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2xpZGluZz92b2lkIDA6dGhpcy5zbGlkZSgicHJldiIpfSxjLnByb3RvdHlwZS5zbGlkZT1mdW5jdGlvbihiLGQpe3ZhciBlPXRoaXMuJGVsZW1lbnQuZmluZCgiLml0ZW0uYWN0aXZlIiksZj1kfHx0aGlzLmdldEl0ZW1Gb3JEaXJlY3Rpb24oYixlKSxnPXRoaXMuaW50ZXJ2YWwsaD0ibmV4dCI9PWI/ImxlZnQiOiJyaWdodCIsaT10aGlzO2lmKGYuaGFzQ2xhc3MoImFjdGl2ZSIpKXJldHVybiB0aGlzLnNsaWRpbmc9ITE7dmFyIGo9ZlswXSxrPWEuRXZlbnQoInNsaWRlLmJzLmNhcm91c2VsIix7cmVsYXRlZFRhcmdldDpqLGRpcmVjdGlvbjpofSk7aWYodGhpcy4kZWxlbWVudC50cmlnZ2VyKGspLCFrLmlzRGVmYXVsdFByZXZlbnRlZCgpKXtpZih0aGlzLnNsaWRpbmc9ITAsZyYmdGhpcy5wYXVzZSgpLHRoaXMuJGluZGljYXRvcnMubGVuZ3RoKXt0aGlzLiRpbmRpY2F0b3JzLmZpbmQoIi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIik7dmFyIGw9YSh0aGlzLiRpbmRpY2F0b3JzLmNoaWxkcmVuKClbdGhpcy5nZXRJdGVtSW5kZXgoZildKTtsJiZsLmFkZENsYXNzKCJhY3RpdmUiKX12YXIgbT1hLkV2ZW50KCJzbGlkLmJzLmNhcm91c2VsIix7cmVsYXRlZFRhcmdldDpqLGRpcmVjdGlvbjpofSk7cmV0dXJuIGEuc3VwcG9ydC50cmFuc2l0aW9uJiZ0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJzbGlkZSIpPyhmLmFkZENsYXNzKGIpLGZbMF0ub2Zmc2V0V2lkdGgsZS5hZGRDbGFzcyhoKSxmLmFkZENsYXNzKGgpLGUub25lKCJic1RyYW5zaXRpb25FbmQiLGZ1bmN0aW9uKCl7Zi5yZW1vdmVDbGFzcyhbYixoXS5qb2luKCIgIikpLmFkZENsYXNzKCJhY3RpdmUiKSxlLnJlbW92ZUNsYXNzKFsiYWN0aXZlIixoXS5qb2luKCIgIikpLGkuc2xpZGluZz0hMSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS4kZWxlbWVudC50cmlnZ2VyKG0pfSwwKX0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTikpOihlLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSxmLmFkZENsYXNzKCJhY3RpdmUiKSx0aGlzLnNsaWRpbmc9ITEsdGhpcy4kZWxlbWVudC50cmlnZ2VyKG0pKSxnJiZ0aGlzLmN5Y2xlKCksdGhpc319O3ZhciBkPWEuZm4uY2Fyb3VzZWw7YS5mbi5jYXJvdXNlbD1iLGEuZm4uY2Fyb3VzZWwuQ29uc3RydWN0b3I9YyxhLmZuLmNhcm91c2VsLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5jYXJvdXNlbD1kLHRoaXN9O3ZhciBlPWZ1bmN0aW9uKGMpe3ZhciBkLGU9YSh0aGlzKSxmPWEoZS5hdHRyKCJkYXRhLXRhcmdldCIpfHwoZD1lLmF0dHIoImhyZWYiKSkmJmQucmVwbGFjZSgvLiooPz0jW15cc10rJCkvLCIiKSk7aWYoZi5oYXNDbGFzcygiY2Fyb3VzZWwiKSl7dmFyIGc9YS5leHRlbmQoe30sZi5kYXRhKCksZS5kYXRhKCkpLGg9ZS5hdHRyKCJkYXRhLXNsaWRlLXRvIik7aCYmKGcuaW50ZXJ2YWw9ITEpLGIuY2FsbChmLGcpLGgmJmYuZGF0YSgiYnMuY2Fyb3VzZWwiKS50byhoKSxjLnByZXZlbnREZWZhdWx0KCl9fTthKGRvY3VtZW50KS5vbigiY2xpY2suYnMuY2Fyb3VzZWwuZGF0YS1hcGkiLCJbZGF0YS1zbGlkZV0iLGUpLm9uKCJjbGljay5icy5jYXJvdXNlbC5kYXRhLWFwaSIsIltkYXRhLXNsaWRlLXRvXSIsZSksYSh3aW5kb3cpLm9uKCJsb2FkIixmdW5jdGlvbigpe2EoJ1tkYXRhLXJpZGU9ImNhcm91c2VsIl0nKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKTtiLmNhbGwoYyxjLmRhdGEoKSl9KX0pfShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXt2YXIgYyxkPWIuYXR0cigiZGF0YS10YXJnZXQiKXx8KGM9Yi5hdHRyKCJocmVmIikpJiZjLnJlcGxhY2UoLy4qKD89I1teXHNdKyQpLywiIik7cmV0dXJuIGEoZCl9ZnVuY3Rpb24gYyhiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxlPWMuZGF0YSgiYnMuY29sbGFwc2UiKSxmPWEuZXh0ZW5kKHt9LGQuREVGQVVMVFMsYy5kYXRhKCksIm9iamVjdCI9PXR5cGVvZiBiJiZiKTshZSYmZi50b2dnbGUmJi9zaG93fGhpZGUvLnRlc3QoYikmJihmLnRvZ2dsZT0hMSksZXx8Yy5kYXRhKCJicy5jb2xsYXBzZSIsZT1uZXcgZCh0aGlzLGYpKSwic3RyaW5nIj09dHlwZW9mIGImJmVbYl0oKX0pfXZhciBkPWZ1bmN0aW9uKGIsYyl7dGhpcy4kZWxlbWVudD1hKGIpLHRoaXMub3B0aW9ucz1hLmV4dGVuZCh7fSxkLkRFRkFVTFRTLGMpLHRoaXMuJHRyaWdnZXI9YSgnW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2hyZWY9IiMnK2IuaWQrJyJdLFtkYXRhLXRvZ2dsZT0iY29sbGFwc2UiXVtkYXRhLXRhcmdldD0iIycrYi5pZCsnIl0nKSx0aGlzLnRyYW5zaXRpb25pbmc9bnVsbCx0aGlzLm9wdGlvbnMucGFyZW50P3RoaXMuJHBhcmVudD10aGlzLmdldFBhcmVudCgpOnRoaXMuYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuJGVsZW1lbnQsdGhpcy4kdHJpZ2dlciksdGhpcy5vcHRpb25zLnRvZ2dsZSYmdGhpcy50b2dnbGUoKX07ZC5WRVJTSU9OPSIzLjMuNSIsZC5UUkFOU0lUSU9OX0RVUkFUSU9OPTM1MCxkLkRFRkFVTFRTPXt0b2dnbGU6ITB9LGQucHJvdG90eXBlLmRpbWVuc2lvbj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoIndpZHRoIik7cmV0dXJuIGE/IndpZHRoIjoiaGVpZ2h0In0sZC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe2lmKCF0aGlzLnRyYW5zaXRpb25pbmcmJiF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJpbiIpKXt2YXIgYixlPXRoaXMuJHBhcmVudCYmdGhpcy4kcGFyZW50LmNoaWxkcmVuKCIucGFuZWwiKS5jaGlsZHJlbigiLmluLCAuY29sbGFwc2luZyIpO2lmKCEoZSYmZS5sZW5ndGgmJihiPWUuZGF0YSgiYnMuY29sbGFwc2UiKSxiJiZiLnRyYW5zaXRpb25pbmcpKSl7dmFyIGY9YS5FdmVudCgic2hvdy5icy5jb2xsYXBzZSIpO2lmKHRoaXMuJGVsZW1lbnQudHJpZ2dlcihmKSwhZi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7ZSYmZS5sZW5ndGgmJihjLmNhbGwoZSwiaGlkZSIpLGJ8fGUuZGF0YSgiYnMuY29sbGFwc2UiLG51bGwpKTt2YXIgZz10aGlzLmRpbWVuc2lvbigpO3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoImNvbGxhcHNlIikuYWRkQ2xhc3MoImNvbGxhcHNpbmciKVtnXSgwKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMCksdGhpcy4kdHJpZ2dlci5yZW1vdmVDbGFzcygiY29sbGFwc2VkIikuYXR0cigiYXJpYS1leHBhbmRlZCIsITApLHRoaXMudHJhbnNpdGlvbmluZz0xO3ZhciBoPWZ1bmN0aW9uKCl7dGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcygiY29sbGFwc2luZyIpLmFkZENsYXNzKCJjb2xsYXBzZSBpbiIpW2ddKCIiKSx0aGlzLnRyYW5zaXRpb25pbmc9MCx0aGlzLiRlbGVtZW50LnRyaWdnZXIoInNob3duLmJzLmNvbGxhcHNlIil9O2lmKCFhLnN1cHBvcnQudHJhbnNpdGlvbilyZXR1cm4gaC5jYWxsKHRoaXMpO3ZhciBpPWEuY2FtZWxDYXNlKFsic2Nyb2xsIixnXS5qb2luKCItIikpO3RoaXMuJGVsZW1lbnQub25lKCJic1RyYW5zaXRpb25FbmQiLGEucHJveHkoaCx0aGlzKSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoZC5UUkFOU0lUSU9OX0RVUkFUSU9OKVtnXSh0aGlzLiRlbGVtZW50WzBdW2ldKX19fX0sZC5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe2lmKCF0aGlzLnRyYW5zaXRpb25pbmcmJnRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImluIikpe3ZhciBiPWEuRXZlbnQoImhpZGUuYnMuY29sbGFwc2UiKTtpZih0aGlzLiRlbGVtZW50LnRyaWdnZXIoYiksIWIuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciBjPXRoaXMuZGltZW5zaW9uKCk7dGhpcy4kZWxlbWVudFtjXSh0aGlzLiRlbGVtZW50W2NdKCkpWzBdLm9mZnNldEhlaWdodCx0aGlzLiRlbGVtZW50LmFkZENsYXNzKCJjb2xsYXBzaW5nIikucmVtb3ZlQ2xhc3MoImNvbGxhcHNlIGluIikuYXR0cigiYXJpYS1leHBhbmRlZCIsITEpLHRoaXMuJHRyaWdnZXIuYWRkQ2xhc3MoImNvbGxhcHNlZCIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCExKSx0aGlzLnRyYW5zaXRpb25pbmc9MTt2YXIgZT1mdW5jdGlvbigpe3RoaXMudHJhbnNpdGlvbmluZz0wLHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoImNvbGxhcHNpbmciKS5hZGRDbGFzcygiY29sbGFwc2UiKS50cmlnZ2VyKCJoaWRkZW4uYnMuY29sbGFwc2UiKX07cmV0dXJuIGEuc3VwcG9ydC50cmFuc2l0aW9uP3ZvaWQgdGhpcy4kZWxlbWVudFtjXSgwKS5vbmUoImJzVHJhbnNpdGlvbkVuZCIsYS5wcm94eShlLHRoaXMpKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChkLlRSQU5TSVRJT05fRFVSQVRJT04pOmUuY2FsbCh0aGlzKX19fSxkLnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24oKXt0aGlzW3RoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImluIik/ImhpZGUiOiJzaG93Il0oKX0sZC5wcm90b3R5cGUuZ2V0UGFyZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcy5vcHRpb25zLnBhcmVudCkuZmluZCgnW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2RhdGEtcGFyZW50PSInK3RoaXMub3B0aW9ucy5wYXJlbnQrJyJdJykuZWFjaChhLnByb3h5KGZ1bmN0aW9uKGMsZCl7dmFyIGU9YShkKTt0aGlzLmFkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhiKGUpLGUpfSx0aGlzKSkuZW5kKCl9LGQucHJvdG90eXBlLmFkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcz1mdW5jdGlvbihhLGIpe3ZhciBjPWEuaGFzQ2xhc3MoImluIik7YS5hdHRyKCJhcmlhLWV4cGFuZGVkIixjKSxiLnRvZ2dsZUNsYXNzKCJjb2xsYXBzZWQiLCFjKS5hdHRyKCJhcmlhLWV4cGFuZGVkIixjKX07dmFyIGU9YS5mbi5jb2xsYXBzZTthLmZuLmNvbGxhcHNlPWMsYS5mbi5jb2xsYXBzZS5Db25zdHJ1Y3Rvcj1kLGEuZm4uY29sbGFwc2Uubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLmNvbGxhcHNlPWUsdGhpc30sYShkb2N1bWVudCkub24oImNsaWNrLmJzLmNvbGxhcHNlLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdJyxmdW5jdGlvbihkKXt2YXIgZT1hKHRoaXMpO2UuYXR0cigiZGF0YS10YXJnZXQiKXx8ZC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBmPWIoZSksZz1mLmRhdGEoImJzLmNvbGxhcHNlIiksaD1nPyJ0b2dnbGUiOmUuZGF0YSgpO2MuY2FsbChmLGgpfSl9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGIpe3ZhciBjPWIuYXR0cigiZGF0YS10YXJnZXQiKTtjfHwoYz1iLmF0dHIoImhyZWYiKSxjPWMmJi8jW0EtWmEtel0vLnRlc3QoYykmJmMucmVwbGFjZSgvLiooPz0jW15cc10qJCkvLCIiKSk7dmFyIGQ9YyYmYShjKTtyZXR1cm4gZCYmZC5sZW5ndGg/ZDpiLnBhcmVudCgpfWZ1bmN0aW9uIGMoYyl7YyYmMz09PWMud2hpY2h8fChhKGUpLnJlbW92ZSgpLGEoZikuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1iKGQpLGY9e3JlbGF0ZWRUYXJnZXQ6dGhpc307ZS5oYXNDbGFzcygib3BlbiIpJiYoYyYmImNsaWNrIj09Yy50eXBlJiYvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGMudGFyZ2V0LnRhZ05hbWUpJiZhLmNvbnRhaW5zKGVbMF0sYy50YXJnZXQpfHwoZS50cmlnZ2VyKGM9YS5FdmVudCgiaGlkZS5icy5kcm9wZG93biIsZikpLGMuaXNEZWZhdWx0UHJldmVudGVkKCl8fChkLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpLGUucmVtb3ZlQ2xhc3MoIm9wZW4iKS50cmlnZ2VyKCJoaWRkZW4uYnMuZHJvcGRvd24iLGYpKSkpfSkpfWZ1bmN0aW9uIGQoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1jLmRhdGEoImJzLmRyb3Bkb3duIik7ZHx8Yy5kYXRhKCJicy5kcm9wZG93biIsZD1uZXcgZyh0aGlzKSksInN0cmluZyI9PXR5cGVvZiBiJiZkW2JdLmNhbGwoYyl9KX12YXIgZT0iLmRyb3Bkb3duLWJhY2tkcm9wIixmPSdbZGF0YS10b2dnbGU9ImRyb3Bkb3duIl0nLGc9ZnVuY3Rpb24oYil7YShiKS5vbigiY2xpY2suYnMuZHJvcGRvd24iLHRoaXMudG9nZ2xlKX07Zy5WRVJTSU9OPSIzLjMuNSIsZy5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKGQpe3ZhciBlPWEodGhpcyk7aWYoIWUuaXMoIi5kaXNhYmxlZCwgOmRpc2FibGVkIikpe3ZhciBmPWIoZSksZz1mLmhhc0NsYXNzKCJvcGVuIik7aWYoYygpLCFnKXsib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmIWYuY2xvc2VzdCgiLm5hdmJhci1uYXYiKS5sZW5ndGgmJmEoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmFkZENsYXNzKCJkcm9wZG93bi1iYWNrZHJvcCIpLmluc2VydEFmdGVyKGEodGhpcykpLm9uKCJjbGljayIsYyk7dmFyIGg9e3JlbGF0ZWRUYXJnZXQ6dGhpc307aWYoZi50cmlnZ2VyKGQ9YS5FdmVudCgic2hvdy5icy5kcm9wZG93biIsaCkpLGQuaXNEZWZhdWx0UHJldmVudGVkKCkpcmV0dXJuO2UudHJpZ2dlcigiZm9jdXMiKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwidHJ1ZSIpLGYudG9nZ2xlQ2xhc3MoIm9wZW4iKS50cmlnZ2VyKCJzaG93bi5icy5kcm9wZG93biIsaCl9cmV0dXJuITF9fSxnLnByb3RvdHlwZS5rZXlkb3duPWZ1bmN0aW9uKGMpe2lmKC8oMzh8NDB8Mjd8MzIpLy50ZXN0KGMud2hpY2gpJiYhL2lucHV0fHRleHRhcmVhL2kudGVzdChjLnRhcmdldC50YWdOYW1lKSl7dmFyIGQ9YSh0aGlzKTtpZihjLnByZXZlbnREZWZhdWx0KCksYy5zdG9wUHJvcGFnYXRpb24oKSwhZC5pcygiLmRpc2FibGVkLCA6ZGlzYWJsZWQiKSl7dmFyIGU9YihkKSxnPWUuaGFzQ2xhc3MoIm9wZW4iKTtpZighZyYmMjchPWMud2hpY2h8fGcmJjI3PT1jLndoaWNoKXJldHVybiAyNz09Yy53aGljaCYmZS5maW5kKGYpLnRyaWdnZXIoImZvY3VzIiksZC50cmlnZ2VyKCJjbGljayIpO3ZhciBoPSIgbGk6bm90KC5kaXNhYmxlZCk6dmlzaWJsZSBhIixpPWUuZmluZCgiLmRyb3Bkb3duLW1lbnUiK2gpO2lmKGkubGVuZ3RoKXt2YXIgaj1pLmluZGV4KGMudGFyZ2V0KTszOD09Yy53aGljaCYmaj4wJiZqLS0sNDA9PWMud2hpY2gmJmo8aS5sZW5ndGgtMSYmaisrLH5qfHwoaj0wKSxpLmVxKGopLnRyaWdnZXIoImZvY3VzIil9fX19O3ZhciBoPWEuZm4uZHJvcGRvd247YS5mbi5kcm9wZG93bj1kLGEuZm4uZHJvcGRvd24uQ29uc3RydWN0b3I9ZyxhLmZuLmRyb3Bkb3duLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5kcm9wZG93bj1oLHRoaXN9LGEoZG9jdW1lbnQpLm9uKCJjbGljay5icy5kcm9wZG93bi5kYXRhLWFwaSIsYykub24oImNsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpIiwiLmRyb3Bkb3duIGZvcm0iLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KS5vbigiY2xpY2suYnMuZHJvcGRvd24uZGF0YS1hcGkiLGYsZy5wcm90b3R5cGUudG9nZ2xlKS5vbigia2V5ZG93bi5icy5kcm9wZG93bi5kYXRhLWFwaSIsZixnLnByb3RvdHlwZS5rZXlkb3duKS5vbigia2V5ZG93bi5icy5kcm9wZG93bi5kYXRhLWFwaSIsIi5kcm9wZG93bi1tZW51IixnLnByb3RvdHlwZS5rZXlkb3duKX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGIoYixkKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9YSh0aGlzKSxmPWUuZGF0YSgiYnMubW9kYWwiKSxnPWEuZXh0ZW5kKHt9LGMuREVGQVVMVFMsZS5kYXRhKCksIm9iamVjdCI9PXR5cGVvZiBiJiZiKTtmfHxlLmRhdGEoImJzLm1vZGFsIixmPW5ldyBjKHRoaXMsZykpLCJzdHJpbmciPT10eXBlb2YgYj9mW2JdKGQpOmcuc2hvdyYmZi5zaG93KGQpfSl9dmFyIGM9ZnVuY3Rpb24oYixjKXt0aGlzLm9wdGlvbnM9Yyx0aGlzLiRib2R5PWEoZG9jdW1lbnQuYm9keSksdGhpcy4kZWxlbWVudD1hKGIpLHRoaXMuJGRpYWxvZz10aGlzLiRlbGVtZW50LmZpbmQoIi5tb2RhbC1kaWFsb2ciKSx0aGlzLiRiYWNrZHJvcD1udWxsLHRoaXMuaXNTaG93bj1udWxsLHRoaXMub3JpZ2luYWxCb2R5UGFkPW51bGwsdGhpcy5zY3JvbGxiYXJXaWR0aD0wLHRoaXMuaWdub3JlQmFja2Ryb3BDbGljaz0hMSx0aGlzLm9wdGlvbnMucmVtb3RlJiZ0aGlzLiRlbGVtZW50LmZpbmQoIi5tb2RhbC1jb250ZW50IikubG9hZCh0aGlzLm9wdGlvbnMucmVtb3RlLGEucHJveHkoZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50LnRyaWdnZXIoImxvYWRlZC5icy5tb2RhbCIpfSx0aGlzKSl9O2MuVkVSU0lPTj0iMy4zLjUiLGMuVFJBTlNJVElPTl9EVVJBVElPTj0zMDAsYy5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxjLkRFRkFVTFRTPXtiYWNrZHJvcDohMCxrZXlib2FyZDohMCxzaG93OiEwfSxjLnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNTaG93bj90aGlzLmhpZGUoKTp0aGlzLnNob3coYSl9LGMucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcyxlPWEuRXZlbnQoInNob3cuYnMubW9kYWwiLHtyZWxhdGVkVGFyZ2V0OmJ9KTt0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSksdGhpcy5pc1Nob3dufHxlLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwodGhpcy5pc1Nob3duPSEwLHRoaXMuY2hlY2tTY3JvbGxiYXIoKSx0aGlzLnNldFNjcm9sbGJhcigpLHRoaXMuJGJvZHkuYWRkQ2xhc3MoIm1vZGFsLW9wZW4iKSx0aGlzLmVzY2FwZSgpLHRoaXMucmVzaXplKCksdGhpcy4kZWxlbWVudC5vbigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIsJ1tkYXRhLWRpc21pc3M9Im1vZGFsIl0nLGEucHJveHkodGhpcy5oaWRlLHRoaXMpKSx0aGlzLiRkaWFsb2cub24oIm1vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsIixmdW5jdGlvbigpe2QuJGVsZW1lbnQub25lKCJtb3VzZXVwLmRpc21pc3MuYnMubW9kYWwiLGZ1bmN0aW9uKGIpe2EoYi50YXJnZXQpLmlzKGQuJGVsZW1lbnQpJiYoZC5pZ25vcmVCYWNrZHJvcENsaWNrPSEwKX0pfSksdGhpcy5iYWNrZHJvcChmdW5jdGlvbigpe3ZhciBlPWEuc3VwcG9ydC50cmFuc2l0aW9uJiZkLiRlbGVtZW50Lmhhc0NsYXNzKCJmYWRlIik7ZC4kZWxlbWVudC5wYXJlbnQoKS5sZW5ndGh8fGQuJGVsZW1lbnQuYXBwZW5kVG8oZC4kYm9keSksZC4kZWxlbWVudC5zaG93KCkuc2Nyb2xsVG9wKDApLGQuYWRqdXN0RGlhbG9nKCksZSYmZC4kZWxlbWVudFswXS5vZmZzZXRXaWR0aCxkLiRlbGVtZW50LmFkZENsYXNzKCJpbiIpLGQuZW5mb3JjZUZvY3VzKCk7dmFyIGY9YS5FdmVudCgic2hvd24uYnMubW9kYWwiLHtyZWxhdGVkVGFyZ2V0OmJ9KTtlP2QuJGRpYWxvZy5vbmUoImJzVHJhbnNpdGlvbkVuZCIsZnVuY3Rpb24oKXtkLiRlbGVtZW50LnRyaWdnZXIoImZvY3VzIikudHJpZ2dlcihmKX0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTik6ZC4kZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIpLnRyaWdnZXIoZil9KSl9LGMucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oYil7YiYmYi5wcmV2ZW50RGVmYXVsdCgpLGI9YS5FdmVudCgiaGlkZS5icy5tb2RhbCIpLHRoaXMuJGVsZW1lbnQudHJpZ2dlcihiKSx0aGlzLmlzU2hvd24mJiFiLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYodGhpcy5pc1Nob3duPSExLHRoaXMuZXNjYXBlKCksdGhpcy5yZXNpemUoKSxhKGRvY3VtZW50KS5vZmYoImZvY3VzaW4uYnMubW9kYWwiKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJpbiIpLm9mZigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIpLm9mZigibW91c2V1cC5kaXNtaXNzLmJzLm1vZGFsIiksdGhpcy4kZGlhbG9nLm9mZigibW91c2Vkb3duLmRpc21pc3MuYnMubW9kYWwiKSxhLnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kZWxlbWVudC5oYXNDbGFzcygiZmFkZSIpP3RoaXMuJGVsZW1lbnQub25lKCJic1RyYW5zaXRpb25FbmQiLGEucHJveHkodGhpcy5oaWRlTW9kYWwsdGhpcykpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTik6dGhpcy5oaWRlTW9kYWwoKSl9LGMucHJvdG90eXBlLmVuZm9yY2VGb2N1cz1mdW5jdGlvbigpe2EoZG9jdW1lbnQpLm9mZigiZm9jdXNpbi5icy5tb2RhbCIpLm9uKCJmb2N1c2luLmJzLm1vZGFsIixhLnByb3h5KGZ1bmN0aW9uKGEpe3RoaXMuJGVsZW1lbnRbMF09PT1hLnRhcmdldHx8dGhpcy4kZWxlbWVudC5oYXMoYS50YXJnZXQpLmxlbmd0aHx8dGhpcy4kZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIpfSx0aGlzKSl9LGMucHJvdG90eXBlLmVzY2FwZT1mdW5jdGlvbigpe3RoaXMuaXNTaG93biYmdGhpcy5vcHRpb25zLmtleWJvYXJkP3RoaXMuJGVsZW1lbnQub24oImtleWRvd24uZGlzbWlzcy5icy5tb2RhbCIsYS5wcm94eShmdW5jdGlvbihhKXsyNz09YS53aGljaCYmdGhpcy5oaWRlKCl9LHRoaXMpKTp0aGlzLmlzU2hvd258fHRoaXMuJGVsZW1lbnQub2ZmKCJrZXlkb3duLmRpc21pc3MuYnMubW9kYWwiKX0sYy5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKCl7dGhpcy5pc1Nob3duP2Eod2luZG93KS5vbigicmVzaXplLmJzLm1vZGFsIixhLnByb3h5KHRoaXMuaGFuZGxlVXBkYXRlLHRoaXMpKTphKHdpbmRvdykub2ZmKCJyZXNpemUuYnMubW9kYWwiKX0sYy5wcm90b3R5cGUuaGlkZU1vZGFsPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLiRlbGVtZW50LmhpZGUoKSx0aGlzLmJhY2tkcm9wKGZ1bmN0aW9uKCl7YS4kYm9keS5yZW1vdmVDbGFzcygibW9kYWwtb3BlbiIpLGEucmVzZXRBZGp1c3RtZW50cygpLGEucmVzZXRTY3JvbGxiYXIoKSxhLiRlbGVtZW50LnRyaWdnZXIoImhpZGRlbi5icy5tb2RhbCIpfSl9LGMucHJvdG90eXBlLnJlbW92ZUJhY2tkcm9wPWZ1bmN0aW9uKCl7dGhpcy4kYmFja2Ryb3AmJnRoaXMuJGJhY2tkcm9wLnJlbW92ZSgpLHRoaXMuJGJhY2tkcm9wPW51bGx9LGMucHJvdG90eXBlLmJhY2tkcm9wPWZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMsZT10aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJmYWRlIik/ImZhZGUiOiIiO2lmKHRoaXMuaXNTaG93biYmdGhpcy5vcHRpb25zLmJhY2tkcm9wKXt2YXIgZj1hLnN1cHBvcnQudHJhbnNpdGlvbiYmZTtpZih0aGlzLiRiYWNrZHJvcD1hKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5hZGRDbGFzcygibW9kYWwtYmFja2Ryb3AgIitlKS5hcHBlbmRUbyh0aGlzLiRib2R5KSx0aGlzLiRlbGVtZW50Lm9uKCJjbGljay5kaXNtaXNzLmJzLm1vZGFsIixhLnByb3h5KGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2s/dm9pZCh0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2s9ITEpOnZvaWQoYS50YXJnZXQ9PT1hLmN1cnJlbnRUYXJnZXQmJigic3RhdGljIj09dGhpcy5vcHRpb25zLmJhY2tkcm9wP3RoaXMuJGVsZW1lbnRbMF0uZm9jdXMoKTp0aGlzLmhpZGUoKSkpfSx0aGlzKSksZiYmdGhpcy4kYmFja2Ryb3BbMF0ub2Zmc2V0V2lkdGgsdGhpcy4kYmFja2Ryb3AuYWRkQ2xhc3MoImluIiksIWIpcmV0dXJuO2Y/dGhpcy4kYmFja2Ryb3Aub25lKCJic1RyYW5zaXRpb25FbmQiLGIpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuQkFDS0RST1BfVFJBTlNJVElPTl9EVVJBVElPTik6YigpfWVsc2UgaWYoIXRoaXMuaXNTaG93biYmdGhpcy4kYmFja2Ryb3Ape3RoaXMuJGJhY2tkcm9wLnJlbW92ZUNsYXNzKCJpbiIpO3ZhciBnPWZ1bmN0aW9uKCl7ZC5yZW1vdmVCYWNrZHJvcCgpLGImJmIoKX07YS5zdXBwb3J0LnRyYW5zaXRpb24mJnRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImZhZGUiKT90aGlzLiRiYWNrZHJvcC5vbmUoImJzVHJhbnNpdGlvbkVuZCIsZykuZW11bGF0ZVRyYW5zaXRpb25FbmQoYy5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OKTpnKCl9ZWxzZSBiJiZiKCl9LGMucHJvdG90eXBlLmhhbmRsZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuYWRqdXN0RGlhbG9nKCl9LGMucHJvdG90eXBlLmFkanVzdERpYWxvZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0PmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7dGhpcy4kZWxlbWVudC5jc3Moe3BhZGRpbmdMZWZ0OiF0aGlzLmJvZHlJc092ZXJmbG93aW5nJiZhP3RoaXMuc2Nyb2xsYmFyV2lkdGg6IiIscGFkZGluZ1JpZ2h0OnRoaXMuYm9keUlzT3ZlcmZsb3dpbmcmJiFhP3RoaXMuc2Nyb2xsYmFyV2lkdGg6IiJ9KX0sYy5wcm90b3R5cGUucmVzZXRBZGp1c3RtZW50cz1mdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQuY3NzKHtwYWRkaW5nTGVmdDoiIixwYWRkaW5nUmlnaHQ6IiJ9KX0sYy5wcm90b3R5cGUuY2hlY2tTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuaW5uZXJXaWR0aDtpZighYSl7dmFyIGI9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2E9Yi5yaWdodC1NYXRoLmFicyhiLmxlZnQpfXRoaXMuYm9keUlzT3ZlcmZsb3dpbmc9ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDxhLHRoaXMuc2Nyb2xsYmFyV2lkdGg9dGhpcy5tZWFzdXJlU2Nyb2xsYmFyKCl9LGMucHJvdG90eXBlLnNldFNjcm9sbGJhcj1mdW5jdGlvbigpe3ZhciBhPXBhcnNlSW50KHRoaXMuJGJvZHkuY3NzKCJwYWRkaW5nLXJpZ2h0Iil8fDAsMTApO3RoaXMub3JpZ2luYWxCb2R5UGFkPWRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0fHwiIix0aGlzLmJvZHlJc092ZXJmbG93aW5nJiZ0aGlzLiRib2R5LmNzcygicGFkZGluZy1yaWdodCIsYSt0aGlzLnNjcm9sbGJhcldpZHRoKX0sYy5wcm90b3R5cGUucmVzZXRTY3JvbGxiYXI9ZnVuY3Rpb24oKXt0aGlzLiRib2R5LmNzcygicGFkZGluZy1yaWdodCIsdGhpcy5vcmlnaW5hbEJvZHlQYWQpfSxjLnByb3RvdHlwZS5tZWFzdXJlU2Nyb2xsYmFyPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5jbGFzc05hbWU9Im1vZGFsLXNjcm9sbGJhci1tZWFzdXJlIix0aGlzLiRib2R5LmFwcGVuZChhKTt2YXIgYj1hLm9mZnNldFdpZHRoLWEuY2xpZW50V2lkdGg7cmV0dXJuIHRoaXMuJGJvZHlbMF0ucmVtb3ZlQ2hpbGQoYSksYn07dmFyIGQ9YS5mbi5tb2RhbDthLmZuLm1vZGFsPWIsYS5mbi5tb2RhbC5Db25zdHJ1Y3Rvcj1jLGEuZm4ubW9kYWwubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLm1vZGFsPWQsdGhpc30sYShkb2N1bWVudCkub24oImNsaWNrLmJzLm1vZGFsLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJtb2RhbCJdJyxmdW5jdGlvbihjKXt2YXIgZD1hKHRoaXMpLGU9ZC5hdHRyKCJocmVmIiksZj1hKGQuYXR0cigiZGF0YS10YXJnZXQiKXx8ZSYmZS5yZXBsYWNlKC8uKig/PSNbXlxzXSskKS8sIiIpKSxnPWYuZGF0YSgiYnMubW9kYWwiKT8idG9nZ2xlIjphLmV4dGVuZCh7cmVtb3RlOiEvIy8udGVzdChlKSYmZX0sZi5kYXRhKCksZC5kYXRhKCkpO2QuaXMoImEiKSYmYy5wcmV2ZW50RGVmYXVsdCgpLGYub25lKCJzaG93LmJzLm1vZGFsIixmdW5jdGlvbihhKXthLmlzRGVmYXVsdFByZXZlbnRlZCgpfHxmLm9uZSgiaGlkZGVuLmJzLm1vZGFsIixmdW5jdGlvbigpe2QuaXMoIjp2aXNpYmxlIikmJmQudHJpZ2dlcigiZm9jdXMiKX0pfSksYi5jYWxsKGYsZyx0aGlzKX0pfShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YSgiYnMudG9vbHRpcCIpLGY9Im9iamVjdCI9PXR5cGVvZiBiJiZiOyhlfHwhL2Rlc3Ryb3l8aGlkZS8udGVzdChiKSkmJihlfHxkLmRhdGEoImJzLnRvb2x0aXAiLGU9bmV3IGModGhpcyxmKSksInN0cmluZyI9PXR5cGVvZiBiJiZlW2JdKCkpfSl9dmFyIGM9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9bnVsbCx0aGlzLm9wdGlvbnM9bnVsbCx0aGlzLmVuYWJsZWQ9bnVsbCx0aGlzLnRpbWVvdXQ9bnVsbCx0aGlzLmhvdmVyU3RhdGU9bnVsbCx0aGlzLiRlbGVtZW50PW51bGwsdGhpcy5pblN0YXRlPW51bGwsdGhpcy5pbml0KCJ0b29sdGlwIixhLGIpfTtjLlZFUlNJT049IjMuMy41IixjLlRSQU5TSVRJT05fRFVSQVRJT049MTUwLGMuREVGQVVMVFM9e2FuaW1hdGlvbjohMCxwbGFjZW1lbnQ6InRvcCIsc2VsZWN0b3I6ITEsdGVtcGxhdGU6JzxkaXYgY2xhc3M9InRvb2x0aXAiIHJvbGU9InRvb2x0aXAiPjxkaXYgY2xhc3M9InRvb2x0aXAtYXJyb3ciPjwvZGl2PjxkaXYgY2xhc3M9InRvb2x0aXAtaW5uZXIiPjwvZGl2PjwvZGl2PicsdHJpZ2dlcjoiaG92ZXIgZm9jdXMiLHRpdGxlOiIiLGRlbGF5OjAsaHRtbDohMSxjb250YWluZXI6ITEsdmlld3BvcnQ6e3NlbGVjdG9yOiJib2R5IixwYWRkaW5nOjB9fSxjLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGIsYyxkKXtpZih0aGlzLmVuYWJsZWQ9ITAsdGhpcy50eXBlPWIsdGhpcy4kZWxlbWVudD1hKGMpLHRoaXMub3B0aW9ucz10aGlzLmdldE9wdGlvbnMoZCksdGhpcy4kdmlld3BvcnQ9dGhpcy5vcHRpb25zLnZpZXdwb3J0JiZhKGEuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMudmlld3BvcnQpP3RoaXMub3B0aW9ucy52aWV3cG9ydC5jYWxsKHRoaXMsdGhpcy4kZWxlbWVudCk6dGhpcy5vcHRpb25zLnZpZXdwb3J0LnNlbGVjdG9yfHx0aGlzLm9wdGlvbnMudmlld3BvcnQpLHRoaXMuaW5TdGF0ZT17Y2xpY2s6ITEsaG92ZXI6ITEsZm9jdXM6ITF9LHRoaXMuJGVsZW1lbnRbMF1pbnN0YW5jZW9mIGRvY3VtZW50LmNvbnN0cnVjdG9yJiYhdGhpcy5vcHRpb25zLnNlbGVjdG9yKXRocm93IG5ldyBFcnJvcigiYHNlbGVjdG9yYCBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBpbml0aWFsaXppbmcgIit0aGlzLnR5cGUrIiBvbiB0aGUgd2luZG93LmRvY3VtZW50IG9iamVjdCEiKTtmb3IodmFyIGU9dGhpcy5vcHRpb25zLnRyaWdnZXIuc3BsaXQoIiAiKSxmPWUubGVuZ3RoO2YtLTspe3ZhciBnPWVbZl07aWYoImNsaWNrIj09Zyl0aGlzLiRlbGVtZW50Lm9uKCJjbGljay4iK3RoaXMudHlwZSx0aGlzLm9wdGlvbnMuc2VsZWN0b3IsYS5wcm94eSh0aGlzLnRvZ2dsZSx0aGlzKSk7ZWxzZSBpZigibWFudWFsIiE9Zyl7dmFyIGg9ImhvdmVyIj09Zz8ibW91c2VlbnRlciI6ImZvY3VzaW4iLGk9ImhvdmVyIj09Zz8ibW91c2VsZWF2ZSI6ImZvY3Vzb3V0Ijt0aGlzLiRlbGVtZW50Lm9uKGgrIi4iK3RoaXMudHlwZSx0aGlzLm9wdGlvbnMuc2VsZWN0b3IsYS5wcm94eSh0aGlzLmVudGVyLHRoaXMpKSx0aGlzLiRlbGVtZW50Lm9uKGkrIi4iK3RoaXMudHlwZSx0aGlzLm9wdGlvbnMuc2VsZWN0b3IsYS5wcm94eSh0aGlzLmxlYXZlLHRoaXMpKX19dGhpcy5vcHRpb25zLnNlbGVjdG9yP3RoaXMuX29wdGlvbnM9YS5leHRlbmQoe30sdGhpcy5vcHRpb25zLHt0cmlnZ2VyOiJtYW51YWwiLHNlbGVjdG9yOiIifSk6dGhpcy5maXhUaXRsZSgpfSxjLnByb3RvdHlwZS5nZXREZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBjLkRFRkFVTFRTfSxjLnByb3RvdHlwZS5nZXRPcHRpb25zPWZ1bmN0aW9uKGIpe3JldHVybiBiPWEuZXh0ZW5kKHt9LHRoaXMuZ2V0RGVmYXVsdHMoKSx0aGlzLiRlbGVtZW50LmRhdGEoKSxiKSxiLmRlbGF5JiYibnVtYmVyIj09dHlwZW9mIGIuZGVsYXkmJihiLmRlbGF5PXtzaG93OmIuZGVsYXksaGlkZTpiLmRlbGF5fSksYn0sYy5wcm90b3R5cGUuZ2V0RGVsZWdhdGVPcHRpb25zPWZ1bmN0aW9uKCl7dmFyIGI9e30sYz10aGlzLmdldERlZmF1bHRzKCk7cmV0dXJuIHRoaXMuX29wdGlvbnMmJmEuZWFjaCh0aGlzLl9vcHRpb25zLGZ1bmN0aW9uKGEsZCl7Y1thXSE9ZCYmKGJbYV09ZCl9KSxifSxjLnByb3RvdHlwZS5lbnRlcj1mdW5jdGlvbihiKXt2YXIgYz1iIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9iOmEoYi5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSk7cmV0dXJuIGN8fChjPW5ldyB0aGlzLmNvbnN0cnVjdG9yKGIuY3VycmVudFRhcmdldCx0aGlzLmdldERlbGVnYXRlT3B0aW9ucygpKSxhKGIuY3VycmVudFRhcmdldCkuZGF0YSgiYnMuIit0aGlzLnR5cGUsYykpLGIgaW5zdGFuY2VvZiBhLkV2ZW50JiYoYy5pblN0YXRlWyJmb2N1c2luIj09Yi50eXBlPyJmb2N1cyI6ImhvdmVyIl09ITApLGMudGlwKCkuaGFzQ2xhc3MoImluIil8fCJpbiI9PWMuaG92ZXJTdGF0ZT92b2lkKGMuaG92ZXJTdGF0ZT0iaW4iKTooY2xlYXJUaW1lb3V0KGMudGltZW91dCksYy5ob3ZlclN0YXRlPSJpbiIsYy5vcHRpb25zLmRlbGF5JiZjLm9wdGlvbnMuZGVsYXkuc2hvdz92b2lkKGMudGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ImluIj09Yy5ob3ZlclN0YXRlJiZjLnNob3coKX0sYy5vcHRpb25zLmRlbGF5LnNob3cpKTpjLnNob3coKSl9LGMucHJvdG90eXBlLmlzSW5TdGF0ZVRydWU9ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gdGhpcy5pblN0YXRlKWlmKHRoaXMuaW5TdGF0ZVthXSlyZXR1cm4hMDtyZXR1cm4hMX0sYy5wcm90b3R5cGUubGVhdmU9ZnVuY3Rpb24oYil7dmFyIGM9YiBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YjphKGIuY3VycmVudFRhcmdldCkuZGF0YSgiYnMuIit0aGlzLnR5cGUpO3JldHVybiBjfHwoYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihiLmN1cnJlbnRUYXJnZXQsdGhpcy5nZXREZWxlZ2F0ZU9wdGlvbnMoKSksYShiLmN1cnJlbnRUYXJnZXQpLmRhdGEoImJzLiIrdGhpcy50eXBlLGMpKSxiIGluc3RhbmNlb2YgYS5FdmVudCYmKGMuaW5TdGF0ZVsiZm9jdXNvdXQiPT1iLnR5cGU/ImZvY3VzIjoiaG92ZXIiXT0hMSksYy5pc0luU3RhdGVUcnVlKCk/dm9pZCAwOihjbGVhclRpbWVvdXQoYy50aW1lb3V0KSxjLmhvdmVyU3RhdGU9Im91dCIsYy5vcHRpb25zLmRlbGF5JiZjLm9wdGlvbnMuZGVsYXkuaGlkZT92b2lkKGMudGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Im91dCI9PWMuaG92ZXJTdGF0ZSYmYy5oaWRlKCl9LGMub3B0aW9ucy5kZWxheS5oaWRlKSk6Yy5oaWRlKCkpfSxjLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIGI9YS5FdmVudCgic2hvdy5icy4iK3RoaXMudHlwZSk7aWYodGhpcy5oYXNDb250ZW50KCkmJnRoaXMuZW5hYmxlZCl7dGhpcy4kZWxlbWVudC50cmlnZ2VyKGIpO3ZhciBkPWEuY29udGFpbnModGhpcy4kZWxlbWVudFswXS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCx0aGlzLiRlbGVtZW50WzBdKTtpZihiLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwhZClyZXR1cm47dmFyIGU9dGhpcyxmPXRoaXMudGlwKCksZz10aGlzLmdldFVJRCh0aGlzLnR5cGUpO3RoaXMuc2V0Q29udGVudCgpLGYuYXR0cigiaWQiLGcpLHRoaXMuJGVsZW1lbnQuYXR0cigiYXJpYS1kZXNjcmliZWRieSIsZyksdGhpcy5vcHRpb25zLmFuaW1hdGlvbiYmZi5hZGRDbGFzcygiZmFkZSIpO3ZhciBoPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm9wdGlvbnMucGxhY2VtZW50P3RoaXMub3B0aW9ucy5wbGFjZW1lbnQuY2FsbCh0aGlzLGZbMF0sdGhpcy4kZWxlbWVudFswXSk6dGhpcy5vcHRpb25zLnBsYWNlbWVudCxpPS9ccz9hdXRvP1xzPy9pLGo9aS50ZXN0KGgpO2omJihoPWgucmVwbGFjZShpLCIiKXx8InRvcCIpLGYuZGV0YWNoKCkuY3NzKHt0b3A6MCxsZWZ0OjAsZGlzcGxheToiYmxvY2sifSkuYWRkQ2xhc3MoaCkuZGF0YSgiYnMuIit0aGlzLnR5cGUsdGhpcyksdGhpcy5vcHRpb25zLmNvbnRhaW5lcj9mLmFwcGVuZFRvKHRoaXMub3B0aW9ucy5jb250YWluZXIpOmYuaW5zZXJ0QWZ0ZXIodGhpcy4kZWxlbWVudCksdGhpcy4kZWxlbWVudC50cmlnZ2VyKCJpbnNlcnRlZC5icy4iK3RoaXMudHlwZSk7dmFyIGs9dGhpcy5nZXRQb3NpdGlvbigpLGw9ZlswXS5vZmZzZXRXaWR0aCxtPWZbMF0ub2Zmc2V0SGVpZ2h0O2lmKGope3ZhciBuPWgsbz10aGlzLmdldFBvc2l0aW9uKHRoaXMuJHZpZXdwb3J0KTtoPSJib3R0b20iPT1oJiZrLmJvdHRvbSttPm8uYm90dG9tPyJ0b3AiOiJ0b3AiPT1oJiZrLnRvcC1tPG8udG9wPyJib3R0b20iOiJyaWdodCI9PWgmJmsucmlnaHQrbD5vLndpZHRoPyJsZWZ0IjoibGVmdCI9PWgmJmsubGVmdC1sPG8ubGVmdD8icmlnaHQiOmgsZi5yZW1vdmVDbGFzcyhuKS5hZGRDbGFzcyhoKX12YXIgcD10aGlzLmdldENhbGN1bGF0ZWRPZmZzZXQoaCxrLGwsbSk7dGhpcy5hcHBseVBsYWNlbWVudChwLGgpO3ZhciBxPWZ1bmN0aW9uKCl7dmFyIGE9ZS5ob3ZlclN0YXRlO2UuJGVsZW1lbnQudHJpZ2dlcigic2hvd24uYnMuIitlLnR5cGUpLGUuaG92ZXJTdGF0ZT1udWxsLCJvdXQiPT1hJiZlLmxlYXZlKGUpfTthLnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kdGlwLmhhc0NsYXNzKCJmYWRlIik/Zi5vbmUoImJzVHJhbnNpdGlvbkVuZCIscSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoYy5UUkFOU0lUSU9OX0RVUkFUSU9OKTpxKCl9fSxjLnByb3RvdHlwZS5hcHBseVBsYWNlbWVudD1mdW5jdGlvbihiLGMpe3ZhciBkPXRoaXMudGlwKCksZT1kWzBdLm9mZnNldFdpZHRoLGY9ZFswXS5vZmZzZXRIZWlnaHQsZz1wYXJzZUludChkLmNzcygibWFyZ2luLXRvcCIpLDEwKSxoPXBhcnNlSW50KGQuY3NzKCJtYXJnaW4tbGVmdCIpLDEwKTtpc05hTihnKSYmKGc9MCksaXNOYU4oaCkmJihoPTApLGIudG9wKz1nLGIubGVmdCs9aCxhLm9mZnNldC5zZXRPZmZzZXQoZFswXSxhLmV4dGVuZCh7dXNpbmc6ZnVuY3Rpb24oYSl7ZC5jc3Moe3RvcDpNYXRoLnJvdW5kKGEudG9wKSxsZWZ0Ok1hdGgucm91bmQoYS5sZWZ0KX0pfX0sYiksMCksZC5hZGRDbGFzcygiaW4iKTt2YXIgaT1kWzBdLm9mZnNldFdpZHRoLGo9ZFswXS5vZmZzZXRIZWlnaHQ7InRvcCI9PWMmJmohPWYmJihiLnRvcD1iLnRvcCtmLWopO3ZhciBrPXRoaXMuZ2V0Vmlld3BvcnRBZGp1c3RlZERlbHRhKGMsYixpLGopO2subGVmdD9iLmxlZnQrPWsubGVmdDpiLnRvcCs9ay50b3A7dmFyIGw9L3RvcHxib3R0b20vLnRlc3QoYyksbT1sPzIqay5sZWZ0LWUraToyKmsudG9wLWYraixuPWw/Im9mZnNldFdpZHRoIjoib2Zmc2V0SGVpZ2h0IjtkLm9mZnNldChiKSx0aGlzLnJlcGxhY2VBcnJvdyhtLGRbMF1bbl0sbCl9LGMucHJvdG90eXBlLnJlcGxhY2VBcnJvdz1mdW5jdGlvbihhLGIsYyl7dGhpcy5hcnJvdygpLmNzcyhjPyJsZWZ0IjoidG9wIiw1MCooMS1hL2IpKyIlIikuY3NzKGM/InRvcCI6ImxlZnQiLCIiKX0sYy5wcm90b3R5cGUuc2V0Q29udGVudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMudGlwKCksYj10aGlzLmdldFRpdGxlKCk7YS5maW5kKCIudG9vbHRpcC1pbm5lciIpW3RoaXMub3B0aW9ucy5odG1sPyJodG1sIjoidGV4dCJdKGIpLGEucmVtb3ZlQ2xhc3MoImZhZGUgaW4gdG9wIGJvdHRvbSBsZWZ0IHJpZ2h0Iil9LGMucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZCgpeyJpbiIhPWUuaG92ZXJTdGF0ZSYmZi5kZXRhY2goKSxlLiRlbGVtZW50LnJlbW92ZUF0dHIoImFyaWEtZGVzY3JpYmVkYnkiKS50cmlnZ2VyKCJoaWRkZW4uYnMuIitlLnR5cGUpLGImJmIoKX12YXIgZT10aGlzLGY9YSh0aGlzLiR0aXApLGc9YS5FdmVudCgiaGlkZS5icy4iK3RoaXMudHlwZSk7cmV0dXJuIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihnKSxnLmlzRGVmYXVsdFByZXZlbnRlZCgpP3ZvaWQgMDooZi5yZW1vdmVDbGFzcygiaW4iKSxhLnN1cHBvcnQudHJhbnNpdGlvbiYmZi5oYXNDbGFzcygiZmFkZSIpP2Yub25lKCJic1RyYW5zaXRpb25FbmQiLGQpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTik6ZCgpLHRoaXMuaG92ZXJTdGF0ZT1udWxsLHRoaXMpfSxjLnByb3RvdHlwZS5maXhUaXRsZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGVsZW1lbnQ7KGEuYXR0cigidGl0bGUiKXx8InN0cmluZyIhPXR5cGVvZiBhLmF0dHIoImRhdGEtb3JpZ2luYWwtdGl0bGUiKSkmJmEuYXR0cigiZGF0YS1vcmlnaW5hbC10aXRsZSIsYS5hdHRyKCJ0aXRsZSIpfHwiIikuYXR0cigidGl0bGUiLCIiKX0sYy5wcm90b3R5cGUuaGFzQ29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpdGxlKCl9LGMucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKGIpe2I9Ynx8dGhpcy4kZWxlbWVudDt2YXIgYz1iWzBdLGQ9IkJPRFkiPT1jLnRhZ05hbWUsZT1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO251bGw9PWUud2lkdGgmJihlPWEuZXh0ZW5kKHt9LGUse3dpZHRoOmUucmlnaHQtZS5sZWZ0LGhlaWdodDplLmJvdHRvbS1lLnRvcH0pKTt2YXIgZj1kP3t0b3A6MCxsZWZ0OjB9OmIub2Zmc2V0KCksZz17c2Nyb2xsOmQ/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A6Yi5zY3JvbGxUb3AoKX0saD1kP3t3aWR0aDphKHdpbmRvdykud2lkdGgoKSxoZWlnaHQ6YSh3aW5kb3cpLmhlaWdodCgpfTpudWxsO3JldHVybiBhLmV4dGVuZCh7fSxlLGcsaCxmKX0sYy5wcm90b3R5cGUuZ2V0Q2FsY3VsYXRlZE9mZnNldD1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4iYm90dG9tIj09YT97dG9wOmIudG9wK2IuaGVpZ2h0LGxlZnQ6Yi5sZWZ0K2Iud2lkdGgvMi1jLzJ9OiJ0b3AiPT1hP3t0b3A6Yi50b3AtZCxsZWZ0OmIubGVmdCtiLndpZHRoLzItYy8yfToibGVmdCI9PWE/e3RvcDpiLnRvcCtiLmhlaWdodC8yLWQvMixsZWZ0OmIubGVmdC1jfTp7dG9wOmIudG9wK2IuaGVpZ2h0LzItZC8yLGxlZnQ6Yi5sZWZ0K2Iud2lkdGh9fSxjLnByb3RvdHlwZS5nZXRWaWV3cG9ydEFkanVzdGVkRGVsdGE9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9e3RvcDowLGxlZnQ6MH07aWYoIXRoaXMuJHZpZXdwb3J0KXJldHVybiBlO3ZhciBmPXRoaXMub3B0aW9ucy52aWV3cG9ydCYmdGhpcy5vcHRpb25zLnZpZXdwb3J0LnBhZGRpbmd8fDAsZz10aGlzLmdldFBvc2l0aW9uKHRoaXMuJHZpZXdwb3J0KTtpZigvcmlnaHR8bGVmdC8udGVzdChhKSl7dmFyIGg9Yi50b3AtZi1nLnNjcm9sbCxpPWIudG9wK2YtZy5zY3JvbGwrZDtoPGcudG9wP2UudG9wPWcudG9wLWg6aT5nLnRvcCtnLmhlaWdodCYmKGUudG9wPWcudG9wK2cuaGVpZ2h0LWkpfWVsc2V7dmFyIGo9Yi5sZWZ0LWYsaz1iLmxlZnQrZitjO2o8Zy5sZWZ0P2UubGVmdD1nLmxlZnQtajprPmcucmlnaHQmJihlLmxlZnQ9Zy5sZWZ0K2cud2lkdGgtayl9cmV0dXJuIGV9LGMucHJvdG90eXBlLmdldFRpdGxlPWZ1bmN0aW9uKCl7dmFyIGEsYj10aGlzLiRlbGVtZW50LGM9dGhpcy5vcHRpb25zO3JldHVybiBhPWIuYXR0cigiZGF0YS1vcmlnaW5hbC10aXRsZSIpfHwoImZ1bmN0aW9uIj09dHlwZW9mIGMudGl0bGU/Yy50aXRsZS5jYWxsKGJbMF0pOmMudGl0bGUpfSxjLnByb3RvdHlwZS5nZXRVSUQ9ZnVuY3Rpb24oYSl7ZG8gYSs9fn4oMWU2Kk1hdGgucmFuZG9tKCkpO3doaWxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTtyZXR1cm4gYX0sYy5wcm90b3R5cGUudGlwPWZ1bmN0aW9uKCl7aWYoIXRoaXMuJHRpcCYmKHRoaXMuJHRpcD1hKHRoaXMub3B0aW9ucy50ZW1wbGF0ZSksMSE9dGhpcy4kdGlwLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKHRoaXMudHlwZSsiIGB0ZW1wbGF0ZWAgb3B0aW9uIG11c3QgY29uc2lzdCBvZiBleGFjdGx5IDEgdG9wLWxldmVsIGVsZW1lbnQhIik7cmV0dXJuIHRoaXMuJHRpcH0sYy5wcm90b3R5cGUuYXJyb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYXJyb3c9dGhpcy4kYXJyb3d8fHRoaXMudGlwKCkuZmluZCgiLnRvb2x0aXAtYXJyb3ciKX0sYy5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSEwfSxjLnByb3RvdHlwZS5kaXNhYmxlPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSExfSxjLnByb3RvdHlwZS50b2dnbGVFbmFibGVkPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSF0aGlzLmVuYWJsZWR9LGMucHJvdG90eXBlLnRvZ2dsZT1mdW5jdGlvbihiKXt2YXIgYz10aGlzO2ImJihjPWEoYi5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSksY3x8KGM9bmV3IHRoaXMuY29uc3RydWN0b3IoYi5jdXJyZW50VGFyZ2V0LHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpLGEoYi5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSxjKSkpLGI/KGMuaW5TdGF0ZS5jbGljaz0hYy5pblN0YXRlLmNsaWNrLGMuaXNJblN0YXRlVHJ1ZSgpP2MuZW50ZXIoYyk6Yy5sZWF2ZShjKSk6Yy50aXAoKS5oYXNDbGFzcygiaW4iKT9jLmxlYXZlKGMpOmMuZW50ZXIoYyl9LGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2NsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpLHRoaXMuaGlkZShmdW5jdGlvbigpe2EuJGVsZW1lbnQub2ZmKCIuIithLnR5cGUpLnJlbW92ZURhdGEoImJzLiIrYS50eXBlKSxhLiR0aXAmJmEuJHRpcC5kZXRhY2goKSxhLiR0aXA9bnVsbCxhLiRhcnJvdz1udWxsLGEuJHZpZXdwb3J0PW51bGx9KX07dmFyIGQ9YS5mbi50b29sdGlwO2EuZm4udG9vbHRpcD1iLGEuZm4udG9vbHRpcC5Db25zdHJ1Y3Rvcj1jLGEuZm4udG9vbHRpcC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4udG9vbHRpcD1kLHRoaXN9fShqUXVlcnkpLCtmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YSh0aGlzKSxlPWQuZGF0YSgiYnMucG9wb3ZlciIpLGY9Im9iamVjdCI9PXR5cGVvZiBiJiZiOyhlfHwhL2Rlc3Ryb3l8aGlkZS8udGVzdChiKSkmJihlfHxkLmRhdGEoImJzLnBvcG92ZXIiLGU9bmV3IGModGhpcyxmKSksInN0cmluZyI9PXR5cGVvZiBiJiZlW2JdKCkpfSl9dmFyIGM9ZnVuY3Rpb24oYSxiKXt0aGlzLmluaXQoInBvcG92ZXIiLGEsYil9O2lmKCFhLmZuLnRvb2x0aXApdGhyb3cgbmV3IEVycm9yKCJQb3BvdmVyIHJlcXVpcmVzIHRvb2x0aXAuanMiKTtjLlZFUlNJT049IjMuMy41IixjLkRFRkFVTFRTPWEuZXh0ZW5kKHt9LGEuZm4udG9vbHRpcC5Db25zdHJ1Y3Rvci5ERUZBVUxUUyx7cGxhY2VtZW50OiJyaWdodCIsdHJpZ2dlcjoiY2xpY2siLGNvbnRlbnQ6IiIsdGVtcGxhdGU6JzxkaXYgY2xhc3M9InBvcG92ZXIiIHJvbGU9InRvb2x0aXAiPjxkaXYgY2xhc3M9ImFycm93Ij48L2Rpdj48aDMgY2xhc3M9InBvcG92ZXItdGl0bGUiPjwvaDM+PGRpdiBjbGFzcz0icG9wb3Zlci1jb250ZW50Ij48L2Rpdj48L2Rpdj4nfSksYy5wcm90b3R5cGU9YS5leHRlbmQoe30sYS5mbi50b29sdGlwLkNvbnN0cnVjdG9yLnByb3RvdHlwZSksYy5wcm90b3R5cGUuY29uc3RydWN0b3I9YyxjLnByb3RvdHlwZS5nZXREZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBjLkRFRkFVTFRTfSxjLnByb3RvdHlwZS5zZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50aXAoKSxiPXRoaXMuZ2V0VGl0bGUoKSxjPXRoaXMuZ2V0Q29udGVudCgpO2EuZmluZCgiLnBvcG92ZXItdGl0bGUiKVt0aGlzLm9wdGlvbnMuaHRtbD8iaHRtbCI6InRleHQiXShiKSxhLmZpbmQoIi5wb3BvdmVyLWNvbnRlbnQiKS5jaGlsZHJlbigpLmRldGFjaCgpLmVuZCgpW3RoaXMub3B0aW9ucy5odG1sPyJzdHJpbmciPT10eXBlb2YgYz8iaHRtbCI6ImFwcGVuZCI6InRleHQiXShjKSxhLnJlbW92ZUNsYXNzKCJmYWRlIHRvcCBib3R0b20gbGVmdCByaWdodCBpbiIpLGEuZmluZCgiLnBvcG92ZXItdGl0bGUiKS5odG1sKCl8fGEuZmluZCgiLnBvcG92ZXItdGl0bGUiKS5oaWRlKCl9LGMucHJvdG90eXBlLmhhc0NvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRUaXRsZSgpfHx0aGlzLmdldENvbnRlbnQoKX0sYy5wcm90b3R5cGUuZ2V0Q29udGVudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGVsZW1lbnQsYj10aGlzLm9wdGlvbnM7cmV0dXJuIGEuYXR0cigiZGF0YS1jb250ZW50Iil8fCgiZnVuY3Rpb24iPT10eXBlb2YgYi5jb250ZW50P2IuY29udGVudC5jYWxsKGFbMF0pOmIuY29udGVudCl9LGMucHJvdG90eXBlLmFycm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGFycm93PXRoaXMuJGFycm93fHx0aGlzLnRpcCgpLmZpbmQoIi5hcnJvdyIpfTt2YXIgZD1hLmZuLnBvcG92ZXI7YS5mbi5wb3BvdmVyPWIsYS5mbi5wb3BvdmVyLkNvbnN0cnVjdG9yPWMsYS5mbi5wb3BvdmVyLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYS5mbi5wb3BvdmVyPWQsdGhpc319KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGMsZCl7dGhpcy4kYm9keT1hKGRvY3VtZW50LmJvZHkpLHRoaXMuJHNjcm9sbEVsZW1lbnQ9YShhKGMpLmlzKGRvY3VtZW50LmJvZHkpP3dpbmRvdzpjKSx0aGlzLm9wdGlvbnM9YS5leHRlbmQoe30sYi5ERUZBVUxUUyxkKSx0aGlzLnNlbGVjdG9yPSh0aGlzLm9wdGlvbnMudGFyZ2V0fHwiIikrIiAubmF2IGxpID4gYSIsdGhpcy5vZmZzZXRzPVtdLHRoaXMudGFyZ2V0cz1bXSx0aGlzLmFjdGl2ZVRhcmdldD1udWxsLHRoaXMuc2Nyb2xsSGVpZ2h0PTAsdGhpcy4kc2Nyb2xsRWxlbWVudC5vbigic2Nyb2xsLmJzLnNjcm9sbHNweSIsYS5wcm94eSh0aGlzLnByb2Nlc3MsdGhpcykpLHRoaXMucmVmcmVzaCgpLHRoaXMucHJvY2VzcygpfWZ1bmN0aW9uIGMoYyl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1kLmRhdGEoImJzLnNjcm9sbHNweSIpLGY9Im9iamVjdCI9PXR5cGVvZiBjJiZjO2V8fGQuZGF0YSgiYnMuc2Nyb2xsc3B5IixlPW5ldyBiKHRoaXMsZikpLCJzdHJpbmciPT10eXBlb2YgYyYmZVtjXSgpfSl9Yi5WRVJTSU9OPSIzLjMuNSIsYi5ERUZBVUxUUz17b2Zmc2V0OjEwfSxiLnByb3RvdHlwZS5nZXRTY3JvbGxIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2Nyb2xsRWxlbWVudFswXS5zY3JvbGxIZWlnaHR8fE1hdGgubWF4KHRoaXMuJGJvZHlbMF0uc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQpfSxiLnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPSJvZmZzZXQiLGQ9MDt0aGlzLm9mZnNldHM9W10sdGhpcy50YXJnZXRzPVtdLHRoaXMuc2Nyb2xsSGVpZ2h0PXRoaXMuZ2V0U2Nyb2xsSGVpZ2h0KCksYS5pc1dpbmRvdyh0aGlzLiRzY3JvbGxFbGVtZW50WzBdKXx8KGM9InBvc2l0aW9uIixkPXRoaXMuJHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wKCkpLHRoaXMuJGJvZHkuZmluZCh0aGlzLnNlbGVjdG9yKS5tYXAoZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLGU9Yi5kYXRhKCJ0YXJnZXQiKXx8Yi5hdHRyKCJocmVmIiksZj0vXiMuLy50ZXN0KGUpJiZhKGUpO3JldHVybiBmJiZmLmxlbmd0aCYmZi5pcygiOnZpc2libGUiKSYmW1tmW2NdKCkudG9wK2QsZV1dfHxudWxsfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhWzBdLWJbMF19KS5lYWNoKGZ1bmN0aW9uKCl7Yi5vZmZzZXRzLnB1c2godGhpc1swXSksYi50YXJnZXRzLnB1c2godGhpc1sxXSl9KX0sYi5wcm90b3R5cGUucHJvY2Vzcz1mdW5jdGlvbigpe3ZhciBhLGI9dGhpcy4kc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3AoKSt0aGlzLm9wdGlvbnMub2Zmc2V0LGM9dGhpcy5nZXRTY3JvbGxIZWlnaHQoKSxkPXRoaXMub3B0aW9ucy5vZmZzZXQrYy10aGlzLiRzY3JvbGxFbGVtZW50LmhlaWdodCgpLGU9dGhpcy5vZmZzZXRzLGY9dGhpcy50YXJnZXRzLGc9dGhpcy5hY3RpdmVUYXJnZXQ7aWYodGhpcy5zY3JvbGxIZWlnaHQhPWMmJnRoaXMucmVmcmVzaCgpLGI+PWQpcmV0dXJuIGchPShhPWZbZi5sZW5ndGgtMV0pJiZ0aGlzLmFjdGl2YXRlKGEpO2lmKGcmJmI8ZVswXSlyZXR1cm4gdGhpcy5hY3RpdmVUYXJnZXQ9bnVsbCx0aGlzLmNsZWFyKCk7Zm9yKGE9ZS5sZW5ndGg7YS0tOylnIT1mW2FdJiZiPj1lW2FdJiYodm9pZCAwPT09ZVthKzFdfHxiPGVbYSsxXSkmJnRoaXMuYWN0aXZhdGUoZlthXSl9LGIucHJvdG90eXBlLmFjdGl2YXRlPWZ1bmN0aW9uKGIpe3RoaXMuYWN0aXZlVGFyZ2V0PWIsdGhpcy5jbGVhcigpO3ZhciBjPXRoaXMuc2VsZWN0b3IrJ1tkYXRhLXRhcmdldD0iJytiKyciXSwnK3RoaXMuc2VsZWN0b3IrJ1tocmVmPSInK2IrJyJdJyxkPWEoYykucGFyZW50cygibGkiKS5hZGRDbGFzcygiYWN0aXZlIik7ZC5wYXJlbnQoIi5kcm9wZG93bi1tZW51IikubGVuZ3RoJiYoZD1kLmNsb3Nlc3QoImxpLmRyb3Bkb3duIikuYWRkQ2xhc3MoImFjdGl2ZSIpKSwKZC50cmlnZ2VyKCJhY3RpdmF0ZS5icy5zY3JvbGxzcHkiKX0sYi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXthKHRoaXMuc2VsZWN0b3IpLnBhcmVudHNVbnRpbCh0aGlzLm9wdGlvbnMudGFyZ2V0LCIuYWN0aXZlIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpfTt2YXIgZD1hLmZuLnNjcm9sbHNweTthLmZuLnNjcm9sbHNweT1jLGEuZm4uc2Nyb2xsc3B5LkNvbnN0cnVjdG9yPWIsYS5mbi5zY3JvbGxzcHkubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLnNjcm9sbHNweT1kLHRoaXN9LGEod2luZG93KS5vbigibG9hZC5icy5zY3JvbGxzcHkuZGF0YS1hcGkiLGZ1bmN0aW9uKCl7YSgnW2RhdGEtc3B5PSJzY3JvbGwiXScpLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpO2MuY2FsbChiLGIuZGF0YSgpKX0pfSl9KGpRdWVyeSksK2Z1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hKHRoaXMpLGU9ZC5kYXRhKCJicy50YWIiKTtlfHxkLmRhdGEoImJzLnRhYiIsZT1uZXcgYyh0aGlzKSksInN0cmluZyI9PXR5cGVvZiBiJiZlW2JdKCl9KX12YXIgYz1mdW5jdGlvbihiKXt0aGlzLmVsZW1lbnQ9YShiKX07Yy5WRVJTSU9OPSIzLjMuNSIsYy5UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxjLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50LGM9Yi5jbG9zZXN0KCJ1bDpub3QoLmRyb3Bkb3duLW1lbnUpIiksZD1iLmRhdGEoInRhcmdldCIpO2lmKGR8fChkPWIuYXR0cigiaHJlZiIpLGQ9ZCYmZC5yZXBsYWNlKC8uKig/PSNbXlxzXSokKS8sIiIpKSwhYi5wYXJlbnQoImxpIikuaGFzQ2xhc3MoImFjdGl2ZSIpKXt2YXIgZT1jLmZpbmQoIi5hY3RpdmU6bGFzdCBhIiksZj1hLkV2ZW50KCJoaWRlLmJzLnRhYiIse3JlbGF0ZWRUYXJnZXQ6YlswXX0pLGc9YS5FdmVudCgic2hvdy5icy50YWIiLHtyZWxhdGVkVGFyZ2V0OmVbMF19KTtpZihlLnRyaWdnZXIoZiksYi50cmlnZ2VyKGcpLCFnLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYhZi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7dmFyIGg9YShkKTt0aGlzLmFjdGl2YXRlKGIuY2xvc2VzdCgibGkiKSxjKSx0aGlzLmFjdGl2YXRlKGgsaC5wYXJlbnQoKSxmdW5jdGlvbigpe2UudHJpZ2dlcih7dHlwZToiaGlkZGVuLmJzLnRhYiIscmVsYXRlZFRhcmdldDpiWzBdfSksYi50cmlnZ2VyKHt0eXBlOiJzaG93bi5icy50YWIiLHJlbGF0ZWRUYXJnZXQ6ZVswXX0pfSl9fX0sYy5wcm90b3R5cGUuYWN0aXZhdGU9ZnVuY3Rpb24oYixkLGUpe2Z1bmN0aW9uIGYoKXtnLnJlbW92ZUNsYXNzKCJhY3RpdmUiKS5maW5kKCI+IC5kcm9wZG93bi1tZW51ID4gLmFjdGl2ZSIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKS5lbmQoKS5maW5kKCdbZGF0YS10b2dnbGU9InRhYiJdJykuYXR0cigiYXJpYS1leHBhbmRlZCIsITEpLGIuYWRkQ2xhc3MoImFjdGl2ZSIpLmZpbmQoJ1tkYXRhLXRvZ2dsZT0idGFiIl0nKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMCksaD8oYlswXS5vZmZzZXRXaWR0aCxiLmFkZENsYXNzKCJpbiIpKTpiLnJlbW92ZUNsYXNzKCJmYWRlIiksYi5wYXJlbnQoIi5kcm9wZG93bi1tZW51IikubGVuZ3RoJiZiLmNsb3Nlc3QoImxpLmRyb3Bkb3duIikuYWRkQ2xhc3MoImFjdGl2ZSIpLmVuZCgpLmZpbmQoJ1tkYXRhLXRvZ2dsZT0idGFiIl0nKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMCksZSYmZSgpfXZhciBnPWQuZmluZCgiPiAuYWN0aXZlIiksaD1lJiZhLnN1cHBvcnQudHJhbnNpdGlvbiYmKGcubGVuZ3RoJiZnLmhhc0NsYXNzKCJmYWRlIil8fCEhZC5maW5kKCI+IC5mYWRlIikubGVuZ3RoKTtnLmxlbmd0aCYmaD9nLm9uZSgiYnNUcmFuc2l0aW9uRW5kIixmKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChjLlRSQU5TSVRJT05fRFVSQVRJT04pOmYoKSxnLnJlbW92ZUNsYXNzKCJpbiIpfTt2YXIgZD1hLmZuLnRhYjthLmZuLnRhYj1iLGEuZm4udGFiLkNvbnN0cnVjdG9yPWMsYS5mbi50YWIubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLnRhYj1kLHRoaXN9O3ZhciBlPWZ1bmN0aW9uKGMpe2MucHJldmVudERlZmF1bHQoKSxiLmNhbGwoYSh0aGlzKSwic2hvdyIpfTthKGRvY3VtZW50KS5vbigiY2xpY2suYnMudGFiLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJ0YWIiXScsZSkub24oImNsaWNrLmJzLnRhYi5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0icGlsbCJdJyxlKX0oalF1ZXJ5KSwrZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGIoYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZT1kLmRhdGEoImJzLmFmZml4IiksZj0ib2JqZWN0Ij09dHlwZW9mIGImJmI7ZXx8ZC5kYXRhKCJicy5hZmZpeCIsZT1uZXcgYyh0aGlzLGYpKSwic3RyaW5nIj09dHlwZW9mIGImJmVbYl0oKX0pfXZhciBjPWZ1bmN0aW9uKGIsZCl7dGhpcy5vcHRpb25zPWEuZXh0ZW5kKHt9LGMuREVGQVVMVFMsZCksdGhpcy4kdGFyZ2V0PWEodGhpcy5vcHRpb25zLnRhcmdldCkub24oInNjcm9sbC5icy5hZmZpeC5kYXRhLWFwaSIsYS5wcm94eSh0aGlzLmNoZWNrUG9zaXRpb24sdGhpcykpLm9uKCJjbGljay5icy5hZmZpeC5kYXRhLWFwaSIsYS5wcm94eSh0aGlzLmNoZWNrUG9zaXRpb25XaXRoRXZlbnRMb29wLHRoaXMpKSx0aGlzLiRlbGVtZW50PWEoYiksdGhpcy5hZmZpeGVkPW51bGwsdGhpcy51bnBpbj1udWxsLHRoaXMucGlubmVkT2Zmc2V0PW51bGwsdGhpcy5jaGVja1Bvc2l0aW9uKCl9O2MuVkVSU0lPTj0iMy4zLjUiLGMuUkVTRVQ9ImFmZml4IGFmZml4LXRvcCBhZmZpeC1ib3R0b20iLGMuREVGQVVMVFM9e29mZnNldDowLHRhcmdldDp3aW5kb3d9LGMucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuJHRhcmdldC5zY3JvbGxUb3AoKSxmPXRoaXMuJGVsZW1lbnQub2Zmc2V0KCksZz10aGlzLiR0YXJnZXQuaGVpZ2h0KCk7aWYobnVsbCE9YyYmInRvcCI9PXRoaXMuYWZmaXhlZClyZXR1cm4gYz5lPyJ0b3AiOiExO2lmKCJib3R0b20iPT10aGlzLmFmZml4ZWQpcmV0dXJuIG51bGwhPWM/ZSt0aGlzLnVucGluPD1mLnRvcD8hMToiYm90dG9tIjphLWQ+PWUrZz8hMToiYm90dG9tIjt2YXIgaD1udWxsPT10aGlzLmFmZml4ZWQsaT1oP2U6Zi50b3Asaj1oP2c6YjtyZXR1cm4gbnVsbCE9YyYmYz49ZT8idG9wIjpudWxsIT1kJiZpK2o+PWEtZD8iYm90dG9tIjohMX0sYy5wcm90b3R5cGUuZ2V0UGlubmVkT2Zmc2V0PWZ1bmN0aW9uKCl7aWYodGhpcy5waW5uZWRPZmZzZXQpcmV0dXJuIHRoaXMucGlubmVkT2Zmc2V0O3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoYy5SRVNFVCkuYWRkQ2xhc3MoImFmZml4Iik7dmFyIGE9dGhpcy4kdGFyZ2V0LnNjcm9sbFRvcCgpLGI9dGhpcy4kZWxlbWVudC5vZmZzZXQoKTtyZXR1cm4gdGhpcy5waW5uZWRPZmZzZXQ9Yi50b3AtYX0sYy5wcm90b3R5cGUuY2hlY2tQb3NpdGlvbldpdGhFdmVudExvb3A9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGEucHJveHkodGhpcy5jaGVja1Bvc2l0aW9uLHRoaXMpLDEpfSxjLnByb3RvdHlwZS5jaGVja1Bvc2l0aW9uPWZ1bmN0aW9uKCl7aWYodGhpcy4kZWxlbWVudC5pcygiOnZpc2libGUiKSl7dmFyIGI9dGhpcy4kZWxlbWVudC5oZWlnaHQoKSxkPXRoaXMub3B0aW9ucy5vZmZzZXQsZT1kLnRvcCxmPWQuYm90dG9tLGc9TWF0aC5tYXgoYShkb2N1bWVudCkuaGVpZ2h0KCksYShkb2N1bWVudC5ib2R5KS5oZWlnaHQoKSk7Im9iamVjdCIhPXR5cGVvZiBkJiYoZj1lPWQpLCJmdW5jdGlvbiI9PXR5cGVvZiBlJiYoZT1kLnRvcCh0aGlzLiRlbGVtZW50KSksImZ1bmN0aW9uIj09dHlwZW9mIGYmJihmPWQuYm90dG9tKHRoaXMuJGVsZW1lbnQpKTt2YXIgaD10aGlzLmdldFN0YXRlKGcsYixlLGYpO2lmKHRoaXMuYWZmaXhlZCE9aCl7bnVsbCE9dGhpcy51bnBpbiYmdGhpcy4kZWxlbWVudC5jc3MoInRvcCIsIiIpO3ZhciBpPSJhZmZpeCIrKGg/Ii0iK2g6IiIpLGo9YS5FdmVudChpKyIuYnMuYWZmaXgiKTtpZih0aGlzLiRlbGVtZW50LnRyaWdnZXIoaiksai5pc0RlZmF1bHRQcmV2ZW50ZWQoKSlyZXR1cm47dGhpcy5hZmZpeGVkPWgsdGhpcy51bnBpbj0iYm90dG9tIj09aD90aGlzLmdldFBpbm5lZE9mZnNldCgpOm51bGwsdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyhjLlJFU0VUKS5hZGRDbGFzcyhpKS50cmlnZ2VyKGkucmVwbGFjZSgiYWZmaXgiLCJhZmZpeGVkIikrIi5icy5hZmZpeCIpfSJib3R0b20iPT1oJiZ0aGlzLiRlbGVtZW50Lm9mZnNldCh7dG9wOmctYi1mfSl9fTt2YXIgZD1hLmZuLmFmZml4O2EuZm4uYWZmaXg9YixhLmZuLmFmZml4LkNvbnN0cnVjdG9yPWMsYS5mbi5hZmZpeC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZm4uYWZmaXg9ZCx0aGlzfSxhKHdpbmRvdykub24oImxvYWQiLGZ1bmN0aW9uKCl7YSgnW2RhdGEtc3B5PSJhZmZpeCJdJykuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1jLmRhdGEoKTtkLm9mZnNldD1kLm9mZnNldHx8e30sbnVsbCE9ZC5vZmZzZXRCb3R0b20mJihkLm9mZnNldC5ib3R0b209ZC5vZmZzZXRCb3R0b20pLG51bGwhPWQub2Zmc2V0VG9wJiYoZC5vZmZzZXQudG9wPWQub2Zmc2V0VG9wKSxiLmNhbGwoYyxkKX0pfSl9KGpRdWVyeSk7"></script> <script src="data:application/x-javascript;base64,LyoqCiogQHByZXNlcnZlIEhUTUw1IFNoaXYgMy43LjIgfCBAYWZhcmthcyBAamRhbHRvbiBAam9uX25lYWwgQHJlbSB8IE1JVC9HUEwyIExpY2Vuc2VkCiovCi8vIE9ubHkgcnVuIHRoaXMgY29kZSBpbiBJRSA4CmlmICghIXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKCJNU0lFIDgiKSkgewohZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7dmFyIGM9YS5jcmVhdGVFbGVtZW50KCJwIiksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGEuZG9jdW1lbnRFbGVtZW50O3JldHVybiBjLmlubmVySFRNTD0ieDxzdHlsZT4iK2IrIjwvc3R5bGU+IixkLmluc2VydEJlZm9yZShjLmxhc3RDaGlsZCxkLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIGQoKXt2YXIgYT10LmVsZW1lbnRzO3JldHVybiJzdHJpbmciPT10eXBlb2YgYT9hLnNwbGl0KCIgIik6YX1mdW5jdGlvbiBlKGEsYil7dmFyIGM9dC5lbGVtZW50czsic3RyaW5nIiE9dHlwZW9mIGMmJihjPWMuam9pbigiICIpKSwic3RyaW5nIiE9dHlwZW9mIGEmJihhPWEuam9pbigiICIpKSx0LmVsZW1lbnRzPWMrIiAiK2EsaihiKX1mdW5jdGlvbiBmKGEpe3ZhciBiPXNbYVtxXV07cmV0dXJuIGJ8fChiPXt9LHIrKyxhW3FdPXIsc1tyXT1iKSxifWZ1bmN0aW9uIGcoYSxjLGQpe2lmKGN8fChjPWIpLGwpcmV0dXJuIGMuY3JlYXRlRWxlbWVudChhKTtkfHwoZD1mKGMpKTt2YXIgZTtyZXR1cm4gZT1kLmNhY2hlW2FdP2QuY2FjaGVbYV0uY2xvbmVOb2RlKCk6cC50ZXN0KGEpPyhkLmNhY2hlW2FdPWQuY3JlYXRlRWxlbShhKSkuY2xvbmVOb2RlKCk6ZC5jcmVhdGVFbGVtKGEpLCFlLmNhbkhhdmVDaGlsZHJlbnx8by50ZXN0KGEpfHxlLnRhZ1Vybj9lOmQuZnJhZy5hcHBlbmRDaGlsZChlKX1mdW5jdGlvbiBoKGEsYyl7aWYoYXx8KGE9YiksbClyZXR1cm4gYS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Yz1jfHxmKGEpO2Zvcih2YXIgZT1jLmZyYWcuY2xvbmVOb2RlKCksZz0wLGg9ZCgpLGk9aC5sZW5ndGg7aT5nO2crKyllLmNyZWF0ZUVsZW1lbnQoaFtnXSk7cmV0dXJuIGV9ZnVuY3Rpb24gaShhLGIpe2IuY2FjaGV8fChiLmNhY2hlPXt9LGIuY3JlYXRlRWxlbT1hLmNyZWF0ZUVsZW1lbnQsYi5jcmVhdGVGcmFnPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCxiLmZyYWc9Yi5jcmVhdGVGcmFnKCkpLGEuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihjKXtyZXR1cm4gdC5zaGl2TWV0aG9kcz9nKGMsYSxiKTpiLmNyZWF0ZUVsZW0oYyl9LGEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD1GdW5jdGlvbigiaCxmIiwicmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49Zi5jbG9uZU5vZGUoKSxjPW4uY3JlYXRlRWxlbWVudDtoLnNoaXZNZXRob2RzJiYoIitkKCkuam9pbigpLnJlcGxhY2UoL1tcd1wtOl0rL2csZnVuY3Rpb24oYSl7cmV0dXJuIGIuY3JlYXRlRWxlbShhKSxiLmZyYWcuY3JlYXRlRWxlbWVudChhKSwnYygiJythKyciKSd9KSsiKTtyZXR1cm4gbn0iKSh0LGIuZnJhZyl9ZnVuY3Rpb24gaihhKXthfHwoYT1iKTt2YXIgZD1mKGEpO3JldHVybiF0LnNoaXZDU1N8fGt8fGQuaGFzQ1NTfHwoZC5oYXNDU1M9ISFjKGEsImFydGljbGUsYXNpZGUsZGlhbG9nLGZpZ2NhcHRpb24sZmlndXJlLGZvb3RlcixoZWFkZXIsaGdyb3VwLG1haW4sbmF2LHNlY3Rpb257ZGlzcGxheTpibG9ja31tYXJre2JhY2tncm91bmQ6I0ZGMDtjb2xvcjojMDAwfXRlbXBsYXRle2Rpc3BsYXk6bm9uZX0iKSksbHx8aShhLGQpLGF9dmFyIGssbCxtPSIzLjcuMiIsbj1hLmh0bWw1fHx7fSxvPS9ePHxeKD86YnV0dG9ufG1hcHxzZWxlY3R8dGV4dGFyZWF8b2JqZWN0fGlmcmFtZXxvcHRpb258b3B0Z3JvdXApJC9pLHA9L14oPzphfGJ8Y29kZXxkaXZ8ZmllbGRzZXR8aDF8aDJ8aDN8aDR8aDV8aDZ8aXxsYWJlbHxsaXxvbHxwfHF8c3BhbnxzdHJvbmd8c3R5bGV8dGFibGV8dGJvZHl8dGR8dGh8dHJ8dWwpJC9pLHE9Il9odG1sNXNoaXYiLHI9MCxzPXt9OyFmdW5jdGlvbigpe3RyeXt2YXIgYT1iLmNyZWF0ZUVsZW1lbnQoImEiKTthLmlubmVySFRNTD0iPHh5ej48L3h5ej4iLGs9ImhpZGRlbiJpbiBhLGw9MT09YS5jaGlsZE5vZGVzLmxlbmd0aHx8ZnVuY3Rpb24oKXtiLmNyZWF0ZUVsZW1lbnQoImEiKTt2YXIgYT1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGEuY2xvbmVOb2RlfHwidW5kZWZpbmVkIj09dHlwZW9mIGEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudHx8InVuZGVmaW5lZCI9PXR5cGVvZiBhLmNyZWF0ZUVsZW1lbnR9KCl9Y2F0Y2goYyl7az0hMCxsPSEwfX0oKTt2YXIgdD17ZWxlbWVudHM6bi5lbGVtZW50c3x8ImFiYnIgYXJ0aWNsZSBhc2lkZSBhdWRpbyBiZGkgY2FudmFzIGRhdGEgZGF0YWxpc3QgZGV0YWlscyBkaWFsb2cgZmlnY2FwdGlvbiBmaWd1cmUgZm9vdGVyIGhlYWRlciBoZ3JvdXAgbWFpbiBtYXJrIG1ldGVyIG5hdiBvdXRwdXQgcGljdHVyZSBwcm9ncmVzcyBzZWN0aW9uIHN1bW1hcnkgdGVtcGxhdGUgdGltZSB2aWRlbyIsdmVyc2lvbjptLHNoaXZDU1M6bi5zaGl2Q1NTIT09ITEsc3VwcG9ydHNVbmtub3duRWxlbWVudHM6bCxzaGl2TWV0aG9kczpuLnNoaXZNZXRob2RzIT09ITEsdHlwZToiZGVmYXVsdCIsc2hpdkRvY3VtZW50OmosY3JlYXRlRWxlbWVudDpnLGNyZWF0ZURvY3VtZW50RnJhZ21lbnQ6aCxhZGRFbGVtZW50czplfTthLmh0bWw1PXQsaihiKX0odGhpcyxkb2N1bWVudCk7Cn07Cg=="></script> <script src="data:application/x-javascript;base64,LyohIFJlc3BvbmQuanMgdjEuNC4yOiBtaW4vbWF4LXdpZHRoIG1lZGlhIHF1ZXJ5IHBvbHlmaWxsICogQ29weXJpZ2h0IDIwMTMgU2NvdHQgSmVobAogKiBMaWNlbnNlZCB1bmRlciBodHRwczovL2dpdGh1Yi5jb20vc2NvdHRqZWhsL1Jlc3BvbmQvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVQKICogICovCgovLyBPbmx5IHJ1biB0aGlzIGNvZGUgaW4gSUUgOAppZiAoISF3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiTVNJRSA4IikpIHsKIWZ1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjthLm1hdGNoTWVkaWE9YS5tYXRjaE1lZGlhfHxmdW5jdGlvbihhKXt2YXIgYixjPWEuZG9jdW1lbnRFbGVtZW50LGQ9Yy5maXJzdEVsZW1lbnRDaGlsZHx8Yy5maXJzdENoaWxkLGU9YS5jcmVhdGVFbGVtZW50KCJib2R5IiksZj1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBmLmlkPSJtcS10ZXN0LTEiLGYuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7dG9wOi0xMDBlbSIsZS5zdHlsZS5iYWNrZ3JvdW5kPSJub25lIixlLmFwcGVuZENoaWxkKGYpLGZ1bmN0aW9uKGEpe3JldHVybiBmLmlubmVySFRNTD0nJnNoeTs8c3R5bGUgbWVkaWE9IicrYSsnIj4gI21xLXRlc3QtMSB7IHdpZHRoOiA0MnB4OyB9PC9zdHlsZT4nLGMuaW5zZXJ0QmVmb3JlKGUsZCksYj00Mj09PWYub2Zmc2V0V2lkdGgsYy5yZW1vdmVDaGlsZChlKSx7bWF0Y2hlczpiLG1lZGlhOmF9fX0oYS5kb2N1bWVudCl9KHRoaXMpLGZ1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKCl7dSghMCl9dmFyIGM9e307YS5yZXNwb25kPWMsYy51cGRhdGU9ZnVuY3Rpb24oKXt9O3ZhciBkPVtdLGU9ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj1uZXcgYS5YTUxIdHRwUmVxdWVzdH1jYXRjaChjKXtiPW5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGJ9fSgpLGY9ZnVuY3Rpb24oYSxiKXt2YXIgYz1lKCk7YyYmKGMub3BlbigiR0VUIixhLCEwKSxjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQhPT1jLnJlYWR5U3RhdGV8fDIwMCE9PWMuc3RhdHVzJiYzMDQhPT1jLnN0YXR1c3x8YihjLnJlc3BvbnNlVGV4dCl9LDQhPT1jLnJlYWR5U3RhdGUmJmMuc2VuZChudWxsKSl9O2lmKGMuYWpheD1mLGMucXVldWU9ZCxjLnJlZ2V4PXttZWRpYTovQG1lZGlhW15ce10rXHsoW15ce1x9XSpce1teXH1ce10qXH0pKy9naSxrZXlmcmFtZXM6L0AoPzpcLSg/Om98bW96fHdlYmtpdClcLSk/a2V5ZnJhbWVzW15ce10rXHsoPzpbXlx7XH1dKlx7W15cfVx7XSpcfSkrW15cfV0qXH0vZ2ksdXJsczovKHVybFwoKVsnIl0/KFteXC9cKSciXVteOlwpJyJdKylbJyJdPyhcKSkvZyxmaW5kU3R5bGVzOi9AbWVkaWEgKihbXlx7XSspXHsoW1xTXHNdKz8pJC8sb25seTovKG9ubHlccyspPyhbYS16QS1aXSspXHM/LyxtaW53Oi9cKFtcc10qbWluXC13aWR0aFxzKjpbXHNdKihbXHNdKlswLTlcLl0rKShweHxlbSlbXHNdKlwpLyxtYXh3Oi9cKFtcc10qbWF4XC13aWR0aFxzKjpbXHNdKihbXHNdKlswLTlcLl0rKShweHxlbSlbXHNdKlwpL30sYy5tZWRpYVF1ZXJpZXNTdXBwb3J0ZWQ9YS5tYXRjaE1lZGlhJiZudWxsIT09YS5tYXRjaE1lZGlhKCJvbmx5IGFsbCIpJiZhLm1hdGNoTWVkaWEoIm9ubHkgYWxsIikubWF0Y2hlcywhYy5tZWRpYVF1ZXJpZXNTdXBwb3J0ZWQpe3ZhciBnLGgsaSxqPWEuZG9jdW1lbnQsaz1qLmRvY3VtZW50RWxlbWVudCxsPVtdLG09W10sbj1bXSxvPXt9LHA9MzAscT1qLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGsscj1qLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlIilbMF0scz1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIiksdD1mdW5jdGlvbigpe3ZhciBhLGI9ai5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWouYm9keSxkPWsuc3R5bGUuZm9udFNpemUsZT1jJiZjLnN0eWxlLmZvbnRTaXplLGY9ITE7cmV0dXJuIGIuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Zm9udC1zaXplOjFlbTt3aWR0aDoxZW0iLGN8fChjPWY9ai5jcmVhdGVFbGVtZW50KCJib2R5IiksYy5zdHlsZS5iYWNrZ3JvdW5kPSJub25lIiksay5zdHlsZS5mb250U2l6ZT0iMTAwJSIsYy5zdHlsZS5mb250U2l6ZT0iMTAwJSIsYy5hcHBlbmRDaGlsZChiKSxmJiZrLmluc2VydEJlZm9yZShjLGsuZmlyc3RDaGlsZCksYT1iLm9mZnNldFdpZHRoLGY/ay5yZW1vdmVDaGlsZChjKTpjLnJlbW92ZUNoaWxkKGIpLGsuc3R5bGUuZm9udFNpemU9ZCxlJiYoYy5zdHlsZS5mb250U2l6ZT1lKSxhPWk9cGFyc2VGbG9hdChhKX0sdT1mdW5jdGlvbihiKXt2YXIgYz0iY2xpZW50V2lkdGgiLGQ9a1tjXSxlPSJDU1MxQ29tcGF0Ij09PWouY29tcGF0TW9kZSYmZHx8ai5ib2R5W2NdfHxkLGY9e30sbz1zW3MubGVuZ3RoLTFdLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCk7aWYoYiYmZyYmcD5yLWcpcmV0dXJuIGEuY2xlYXJUaW1lb3V0KGgpLGg9YS5zZXRUaW1lb3V0KHUscCksdm9pZCAwO2c9cjtmb3IodmFyIHYgaW4gbClpZihsLmhhc093blByb3BlcnR5KHYpKXt2YXIgdz1sW3ZdLHg9dy5taW53LHk9dy5tYXh3LHo9bnVsbD09PXgsQT1udWxsPT09eSxCPSJlbSI7eCYmKHg9cGFyc2VGbG9hdCh4KSooeC5pbmRleE9mKEIpPi0xP2l8fHQoKToxKSkseSYmKHk9cGFyc2VGbG9hdCh5KSooeS5pbmRleE9mKEIpPi0xP2l8fHQoKToxKSksdy5oYXNxdWVyeSYmKHomJkF8fCEoenx8ZT49eCl8fCEoQXx8eT49ZSkpfHwoZlt3Lm1lZGlhXXx8KGZbdy5tZWRpYV09W10pLGZbdy5tZWRpYV0ucHVzaChtW3cucnVsZXNdKSl9Zm9yKHZhciBDIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShDKSYmbltDXSYmbltDXS5wYXJlbnROb2RlPT09cSYmcS5yZW1vdmVDaGlsZChuW0NdKTtuLmxlbmd0aD0wO2Zvcih2YXIgRCBpbiBmKWlmKGYuaGFzT3duUHJvcGVydHkoRCkpe3ZhciBFPWouY3JlYXRlRWxlbWVudCgic3R5bGUiKSxGPWZbRF0uam9pbigiXG4iKTtFLnR5cGU9InRleHQvY3NzIixFLm1lZGlhPUQscS5pbnNlcnRCZWZvcmUoRSxvLm5leHRTaWJsaW5nKSxFLnN0eWxlU2hlZXQ/RS5zdHlsZVNoZWV0LmNzc1RleHQ9RjpFLmFwcGVuZENoaWxkKGouY3JlYXRlVGV4dE5vZGUoRikpLG4ucHVzaChFKX19LHY9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEucmVwbGFjZShjLnJlZ2V4LmtleWZyYW1lcywiIikubWF0Y2goYy5yZWdleC5tZWRpYSksZj1lJiZlLmxlbmd0aHx8MDtiPWIuc3Vic3RyaW5nKDAsYi5sYXN0SW5kZXhPZigiLyIpKTt2YXIgZz1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKGMucmVnZXgudXJscywiJDEiK2IrIiQyJDMiKX0saD0hZiYmZDtiLmxlbmd0aCYmKGIrPSIvIiksaCYmKGY9MSk7Zm9yKHZhciBpPTA7Zj5pO2krKyl7dmFyIGosayxuLG87aD8oaj1kLG0ucHVzaChnKGEpKSk6KGo9ZVtpXS5tYXRjaChjLnJlZ2V4LmZpbmRTdHlsZXMpJiZSZWdFeHAuJDEsbS5wdXNoKFJlZ0V4cC4kMiYmZyhSZWdFeHAuJDIpKSksbj1qLnNwbGl0KCIsIiksbz1uLmxlbmd0aDtmb3IodmFyIHA9MDtvPnA7cCsrKWs9bltwXSxsLnB1c2goe21lZGlhOmsuc3BsaXQoIigiKVswXS5tYXRjaChjLnJlZ2V4Lm9ubHkpJiZSZWdFeHAuJDJ8fCJhbGwiLHJ1bGVzOm0ubGVuZ3RoLTEsaGFzcXVlcnk6ay5pbmRleE9mKCIoIik+LTEsbWludzprLm1hdGNoKGMucmVnZXgubWludykmJnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsoUmVnRXhwLiQyfHwiIiksbWF4dzprLm1hdGNoKGMucmVnZXgubWF4dykmJnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsoUmVnRXhwLiQyfHwiIil9KX11KCl9LHc9ZnVuY3Rpb24oKXtpZihkLmxlbmd0aCl7dmFyIGI9ZC5zaGlmdCgpO2YoYi5ocmVmLGZ1bmN0aW9uKGMpe3YoYyxiLmhyZWYsYi5tZWRpYSksb1tiLmhyZWZdPSEwLGEuc2V0VGltZW91dChmdW5jdGlvbigpe3coKX0sMCl9KX19LHg9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPHMubGVuZ3RoO2IrKyl7dmFyIGM9c1tiXSxlPWMuaHJlZixmPWMubWVkaWEsZz1jLnJlbCYmInN0eWxlc2hlZXQiPT09Yy5yZWwudG9Mb3dlckNhc2UoKTtlJiZnJiYhb1tlXSYmKGMuc3R5bGVTaGVldCYmYy5zdHlsZVNoZWV0LnJhd0Nzc1RleHQ/KHYoYy5zdHlsZVNoZWV0LnJhd0Nzc1RleHQsZSxmKSxvW2VdPSEwKTooIS9eKFthLXpBLVo6XSpcL1wvKS8udGVzdChlKSYmIXJ8fGUucmVwbGFjZShSZWdFeHAuJDEsIiIpLnNwbGl0KCIvIilbMF09PT1hLmxvY2F0aW9uLmhvc3QpJiYoIi8vIj09PWUuc3Vic3RyaW5nKDAsMikmJihlPWEubG9jYXRpb24ucHJvdG9jb2wrZSksZC5wdXNoKHtocmVmOmUsbWVkaWE6Zn0pKSl9dygpfTt4KCksYy51cGRhdGU9eCxjLmdldEVtVmFsdWU9dCxhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGIsITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9ucmVzaXplIixiKX19KHRoaXMpOwp9Owo="></script> -<script src="data:application/x-javascript;base64,Cgp3aW5kb3cuYnVpbGRUYWJzZXRzID0gZnVuY3Rpb24odG9jSUQpIHsKCiAgLy8gYnVpbGQgYSB0YWJzZXQgZnJvbSBhIHNlY3Rpb24gZGl2IHdpdGggdGhlIC50YWJzZXQgY2xhc3MKICBmdW5jdGlvbiBidWlsZFRhYnNldCh0YWJzZXQpIHsKCiAgICAvLyBjaGVjayBmb3IgZmFkZSBhbmQgcGlsbHMgb3B0aW9ucwogICAgdmFyIGZhZGUgPSB0YWJzZXQuaGFzQ2xhc3MoInRhYnNldC1mYWRlIik7CiAgICB2YXIgcGlsbHMgPSB0YWJzZXQuaGFzQ2xhc3MoInRhYnNldC1waWxscyIpOwogICAgdmFyIG5hdkNsYXNzID0gcGlsbHMgPyAibmF2LXBpbGxzIiA6ICJuYXYtdGFicyI7CgogICAgLy8gZGV0ZXJtaW5lIHRoZSBoZWFkaW5nIGxldmVsIG9mIHRoZSB0YWJzZXQgYW5kIHRhYnMKICAgIHZhciBtYXRjaCA9IHRhYnNldC5hdHRyKCdjbGFzcycpLm1hdGNoKC9sZXZlbChcZCkgLyk7CiAgICBpZiAobWF0Y2ggPT09IG51bGwpCiAgICAgIHJldHVybjsKICAgIHZhciB0YWJzZXRMZXZlbCA9IE51bWJlcihtYXRjaFsxXSk7CiAgICB2YXIgdGFiTGV2ZWwgPSB0YWJzZXRMZXZlbCArIDE7CgogICAgLy8gZmluZCBhbGwgc3ViaGVhZGluZ3MgaW1tZWRpYXRlbHkgYmVsb3cKICAgIHZhciB0YWJzID0gdGFic2V0LmZpbmQoImRpdi5zZWN0aW9uLmxldmVsIiArIHRhYkxldmVsKTsKICAgIGlmICghdGFicy5sZW5ndGgpCiAgICAgIHJldHVybjsKCiAgICAvLyBjcmVhdGUgdGFibGlzdCBhbmQgdGFiLWNvbnRlbnQgZWxlbWVudHMKICAgIHZhciB0YWJMaXN0ID0gJCgnPHVsIGNsYXNzPSJuYXYgJyArIG5hdkNsYXNzICsgJyIgcm9sZT0idGFibGlzdCI+PC91bD4nKTsKICAgICQodGFic1swXSkuYmVmb3JlKHRhYkxpc3QpOwogICAgdmFyIHRhYkNvbnRlbnQgPSAkKCc8ZGl2IGNsYXNzPSJ0YWItY29udGVudCI+PC9kaXY+Jyk7CiAgICAkKHRhYnNbMF0pLmJlZm9yZSh0YWJDb250ZW50KTsKCiAgICAvLyBidWlsZCB0aGUgdGFic2V0CiAgICB2YXIgYWN0aXZlVGFiID0gMDsKICAgIHRhYnMuZWFjaChmdW5jdGlvbihpKSB7CgogICAgICAvLyBnZXQgdGhlIHRhYiBkaXYKICAgICAgdmFyIHRhYiA9ICQodGFic1tpXSk7CgogICAgICAvLyBnZXQgdGhlIGlkIHRoZW4gc2FuaXRpemUgaXQgZm9yIHVzZSB3aXRoIGJvb3RzdHJhcCB0YWJzCiAgICAgIHZhciBpZCA9IHRhYi5hdHRyKCdpZCcpOwoKICAgICAgLy8gc2VlIGlmIHRoaXMgaXMgbWFya2VkIGFzIHRoZSBhY3RpdmUgdGFiCiAgICAgIGlmICh0YWIuaGFzQ2xhc3MoJ2FjdGl2ZScpKQogICAgICAgIGFjdGl2ZVRhYiA9IGk7CgogICAgICAvLyByZW1vdmUgYW55IHRhYmxlIG9mIGNvbnRlbnRzIGVudHJpZXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgIC8vIHRoaXMgSUQgKHNpbmNlIHdlJ2xsIGJlIHJlbW92aW5nIHRoZSBoZWFkaW5nIGVsZW1lbnQpCiAgICAgICQoImRpdiMiICsgdG9jSUQgKyAiIGxpIGFbaHJlZj0nIyIgKyBpZCArICInXSIpLnBhcmVudCgpLnJlbW92ZSgpOwoKICAgICAgLy8gc2FuaXRpemUgdGhlIGlkIGZvciB1c2Ugd2l0aCBib290c3RyYXAgdGFicwogICAgICBpZCA9IGlkLnJlcGxhY2UoL1suXC8/JiEjPD5dL2csICcnKS5yZXBsYWNlKC9ccy9nLCAnXycpOwogICAgICB0YWIuYXR0cignaWQnLCBpZCk7CgogICAgICAvLyBnZXQgdGhlIGhlYWRpbmcgZWxlbWVudCB3aXRoaW4gaXQsIGdyYWIgaXQncyB0ZXh0LCB0aGVuIHJlbW92ZSBpdAogICAgICB2YXIgaGVhZGluZyA9IHRhYi5maW5kKCdoJyArIHRhYkxldmVsICsgJzpmaXJzdCcpOwogICAgICB2YXIgaGVhZGluZ1RleHQgPSBoZWFkaW5nLmh0bWwoKTsKICAgICAgaGVhZGluZy5yZW1vdmUoKTsKCiAgICAgIC8vIGJ1aWxkIGFuZCBhcHBlbmQgdGhlIHRhYiBsaXN0IGl0ZW0KICAgICAgdmFyIGEgPSAkKCc8YSByb2xlPSJ0YWIiIGRhdGEtdG9nZ2xlPSJ0YWIiPicgKyBoZWFkaW5nVGV4dCArICc8L2E+Jyk7CiAgICAgIGEuYXR0cignaHJlZicsICcjJyArIGlkKTsKICAgICAgYS5hdHRyKCdhcmlhLWNvbnRyb2xzJywgaWQpOwogICAgICB2YXIgbGkgPSAkKCc8bGkgcm9sZT0icHJlc2VudGF0aW9uIj48L2xpPicpOwogICAgICBsaS5hcHBlbmQoYSk7CiAgICAgIHRhYkxpc3QuYXBwZW5kKGxpKTsKCiAgICAgIC8vIHNldCBpdCdzIGF0dHJpYnV0ZXMKICAgICAgdGFiLmF0dHIoJ3JvbGUnLCAndGFicGFuZWwnKTsKICAgICAgdGFiLmFkZENsYXNzKCd0YWItcGFuZScpOwogICAgICB0YWIuYWRkQ2xhc3MoJ3RhYmJlZC1wYW5lJyk7CiAgICAgIGlmIChmYWRlKQogICAgICAgIHRhYi5hZGRDbGFzcygnZmFkZScpOwoKICAgICAgLy8gbW92ZSBpdCBpbnRvIHRoZSB0YWIgY29udGVudCBkaXYKICAgICAgdGFiLmRldGFjaCgpLmFwcGVuZFRvKHRhYkNvbnRlbnQpOwogICAgfSk7CgogICAgLy8gc2V0IGFjdGl2ZSB0YWIKICAgICQodGFiTGlzdC5jaGlsZHJlbignbGknKVthY3RpdmVUYWJdKS5hZGRDbGFzcygnYWN0aXZlJyk7CiAgICB2YXIgYWN0aXZlID0gJCh0YWJDb250ZW50LmNoaWxkcmVuKCdkaXYuc2VjdGlvbicpW2FjdGl2ZVRhYl0pOwogICAgYWN0aXZlLmFkZENsYXNzKCdhY3RpdmUnKTsKICAgIGlmIChmYWRlKQogICAgICBhY3RpdmUuYWRkQ2xhc3MoJ2luJyk7CiAgfQoKICAvLyBjb252ZXJ0IHNlY3Rpb24gZGl2cyB3aXRoIHRoZSAudGFic2V0IGNsYXNzIHRvIHRhYnNldHMKICB2YXIgdGFic2V0cyA9ICQoImRpdi5zZWN0aW9uLnRhYnNldCIpOwogIHRhYnNldHMuZWFjaChmdW5jdGlvbihpKSB7CiAgICBidWlsZFRhYnNldCgkKHRhYnNldHNbaV0pKTsKICB9KTsKfTsKCg=="></script> +<script src="data:application/x-javascript;base64,CgovKioKICogalF1ZXJ5IFBsdWdpbjogU3RpY2t5IFRhYnMKICoKICogQGF1dGhvciBBaWRhbiBMaXN0ZXIgPGFpZGFuQHBocC5uZXQ+CiAqIGFkYXB0ZWQgYnkgUnViZW4gQXJzbGFuIHRvIGFjdGl2YXRlIHBhcmVudCB0YWJzIHRvbwogKiBodHRwOi8vd3d3LmFpZGFubGlzdGVyLmNvbS8yMDE0LzAzL3BlcnNpc3RpbmctdGhlLXRhYi1zdGF0ZS1pbi1ib290c3RyYXAvCiAqLwooZnVuY3Rpb24oJCkgewogICJ1c2Ugc3RyaWN0IjsKICAkLmZuLnJtYXJrZG93blN0aWNreVRhYnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjb250ZXh0ID0gdGhpczsKICAgIC8vIFNob3cgdGhlIHRhYiBjb3JyZXNwb25kaW5nIHdpdGggdGhlIGhhc2ggaW4gdGhlIFVSTCwgb3IgdGhlIGZpcnN0IHRhYgogICAgdmFyIHNob3dTdHVmZkZyb21IYXNoID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2g7CiAgICAgIHZhciBzZWxlY3RvciA9IGhhc2ggPyAnYVtocmVmPSInICsgaGFzaCArICciXScgOiAnbGkuYWN0aXZlID4gYSc7CiAgICAgIHZhciAkc2VsZWN0b3IgPSAkKHNlbGVjdG9yLCBjb250ZXh0KTsKICAgICAgaWYoJHNlbGVjdG9yLmRhdGEoJ3RvZ2dsZScpID09PSAidGFiIikgewogICAgICAgICRzZWxlY3Rvci50YWIoJ3Nob3cnKTsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBhbmNlc3RvcnMgb2YgdGhpcyBlbGVtZW50LCBzaG93IGFueSBoaWRkZW4gdGFicwogICAgICAgICRzZWxlY3Rvci5wYXJlbnRzKCcuc2VjdGlvbi50YWJzZXQnKS5lYWNoKGZ1bmN0aW9uKGksIGVsbSkgewogICAgICAgICAgdmFyIGxpbmsgPSAkKCdhW2hyZWY9IiMnICsgJChlbG0pLmF0dHIoJ2lkJykgKyAnIl0nKTsKICAgICAgICAgIGlmKGxpbmsuZGF0YSgndG9nZ2xlJykgPT09ICJ0YWIiKSB7CiAgICAgICAgICAgIGxpbmsudGFiKCJzaG93Iik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CgoKICAgIC8vIFNldCB0aGUgY29ycmVjdCB0YWIgd2hlbiB0aGUgcGFnZSBsb2FkcwogICAgc2hvd1N0dWZmRnJvbUhhc2goY29udGV4dCk7CgogICAgLy8gU2V0IHRoZSBjb3JyZWN0IHRhYiB3aGVuIGEgdXNlciB1c2VzIHRoZWlyIGJhY2svZm9yd2FyZCBidXR0b24KICAgICQod2luZG93KS5vbignaGFzaGNoYW5nZScsIGZ1bmN0aW9uKCkgewogICAgICBzaG93U3R1ZmZGcm9tSGFzaChjb250ZXh0KTsKICAgIH0pOwoKICAgIC8vIENoYW5nZSB0aGUgVVJMIHdoZW4gdGFicyBhcmUgY2xpY2tlZAogICAgJCgnYScsIGNvbnRleHQpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgbnVsbCwgdGhpcy5ocmVmKTsKICAgICAgc2hvd1N0dWZmRnJvbUhhc2goY29udGV4dCk7CiAgICB9KTsKCiAgICByZXR1cm4gdGhpczsKICB9Owp9KGpRdWVyeSkpOwoKd2luZG93LmJ1aWxkVGFic2V0cyA9IGZ1bmN0aW9uKHRvY0lEKSB7CgogIC8vIGJ1aWxkIGEgdGFic2V0IGZyb20gYSBzZWN0aW9uIGRpdiB3aXRoIHRoZSAudGFic2V0IGNsYXNzCiAgZnVuY3Rpb24gYnVpbGRUYWJzZXQodGFic2V0KSB7CgogICAgLy8gY2hlY2sgZm9yIGZhZGUgYW5kIHBpbGxzIG9wdGlvbnMKICAgIHZhciBmYWRlID0gdGFic2V0Lmhhc0NsYXNzKCJ0YWJzZXQtZmFkZSIpOwogICAgdmFyIHBpbGxzID0gdGFic2V0Lmhhc0NsYXNzKCJ0YWJzZXQtcGlsbHMiKTsKICAgIHZhciBuYXZDbGFzcyA9IHBpbGxzID8gIm5hdi1waWxscyIgOiAibmF2LXRhYnMiOwoKICAgIC8vIGRldGVybWluZSB0aGUgaGVhZGluZyBsZXZlbCBvZiB0aGUgdGFic2V0IGFuZCB0YWJzCiAgICB2YXIgbWF0Y2ggPSB0YWJzZXQuYXR0cignY2xhc3MnKS5tYXRjaCgvbGV2ZWwoXGQpIC8pOwogICAgaWYgKG1hdGNoID09PSBudWxsKQogICAgICByZXR1cm47CiAgICB2YXIgdGFic2V0TGV2ZWwgPSBOdW1iZXIobWF0Y2hbMV0pOwogICAgdmFyIHRhYkxldmVsID0gdGFic2V0TGV2ZWwgKyAxOwoKICAgIC8vIGZpbmQgYWxsIHN1YmhlYWRpbmdzIGltbWVkaWF0ZWx5IGJlbG93CiAgICB2YXIgdGFicyA9IHRhYnNldC5maW5kKCJkaXYuc2VjdGlvbi5sZXZlbCIgKyB0YWJMZXZlbCk7CiAgICBpZiAoIXRhYnMubGVuZ3RoKQogICAgICByZXR1cm47CgogICAgLy8gY3JlYXRlIHRhYmxpc3QgYW5kIHRhYi1jb250ZW50IGVsZW1lbnRzCiAgICB2YXIgdGFiTGlzdCA9ICQoJzx1bCBjbGFzcz0ibmF2ICcgKyBuYXZDbGFzcyArICciIHJvbGU9InRhYmxpc3QiPjwvdWw+Jyk7CiAgICAkKHRhYnNbMF0pLmJlZm9yZSh0YWJMaXN0KTsKICAgIHZhciB0YWJDb250ZW50ID0gJCgnPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPjwvZGl2PicpOwogICAgJCh0YWJzWzBdKS5iZWZvcmUodGFiQ29udGVudCk7CgogICAgLy8gYnVpbGQgdGhlIHRhYnNldAogICAgdmFyIGFjdGl2ZVRhYiA9IDA7CiAgICB0YWJzLmVhY2goZnVuY3Rpb24oaSkgewoKICAgICAgLy8gZ2V0IHRoZSB0YWIgZGl2CiAgICAgIHZhciB0YWIgPSAkKHRhYnNbaV0pOwoKICAgICAgLy8gZ2V0IHRoZSBpZCB0aGVuIHNhbml0aXplIGl0IGZvciB1c2Ugd2l0aCBib290c3RyYXAgdGFicwogICAgICB2YXIgaWQgPSB0YWIuYXR0cignaWQnKTsKCiAgICAgIC8vIHNlZSBpZiB0aGlzIGlzIG1hcmtlZCBhcyB0aGUgYWN0aXZlIHRhYgogICAgICBpZiAodGFiLmhhc0NsYXNzKCdhY3RpdmUnKSkKICAgICAgICBhY3RpdmVUYWIgPSBpOwoKICAgICAgLy8gcmVtb3ZlIGFueSB0YWJsZSBvZiBjb250ZW50cyBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aAogICAgICAvLyB0aGlzIElEIChzaW5jZSB3ZSdsbCBiZSByZW1vdmluZyB0aGUgaGVhZGluZyBlbGVtZW50KQogICAgICAkKCJkaXYjIiArIHRvY0lEICsgIiBsaSBhW2hyZWY9JyMiICsgaWQgKyAiJ10iKS5wYXJlbnQoKS5yZW1vdmUoKTsKCiAgICAgIC8vIHNhbml0aXplIHRoZSBpZCBmb3IgdXNlIHdpdGggYm9vdHN0cmFwIHRhYnMKICAgICAgaWQgPSBpZC5yZXBsYWNlKC9bLlwvPyYhIzw+XS9nLCAnJykucmVwbGFjZSgvXHMvZywgJ18nKTsKICAgICAgdGFiLmF0dHIoJ2lkJywgaWQpOwoKICAgICAgLy8gZ2V0IHRoZSBoZWFkaW5nIGVsZW1lbnQgd2l0aGluIGl0LCBncmFiIGl0J3MgdGV4dCwgdGhlbiByZW1vdmUgaXQKICAgICAgdmFyIGhlYWRpbmcgPSB0YWIuZmluZCgnaCcgKyB0YWJMZXZlbCArICc6Zmlyc3QnKTsKICAgICAgdmFyIGhlYWRpbmdUZXh0ID0gaGVhZGluZy5odG1sKCk7CiAgICAgIGhlYWRpbmcucmVtb3ZlKCk7CgogICAgICAvLyBidWlsZCBhbmQgYXBwZW5kIHRoZSB0YWIgbGlzdCBpdGVtCiAgICAgIHZhciBhID0gJCgnPGEgcm9sZT0idGFiIiBkYXRhLXRvZ2dsZT0idGFiIj4nICsgaGVhZGluZ1RleHQgKyAnPC9hPicpOwogICAgICBhLmF0dHIoJ2hyZWYnLCAnIycgKyBpZCk7CiAgICAgIGEuYXR0cignYXJpYS1jb250cm9scycsIGlkKTsKICAgICAgdmFyIGxpID0gJCgnPGxpIHJvbGU9InByZXNlbnRhdGlvbiI+PC9saT4nKTsKICAgICAgbGkuYXBwZW5kKGEpOwogICAgICB0YWJMaXN0LmFwcGVuZChsaSk7CgogICAgICAvLyBzZXQgaXQncyBhdHRyaWJ1dGVzCiAgICAgIHRhYi5hdHRyKCdyb2xlJywgJ3RhYnBhbmVsJyk7CiAgICAgIHRhYi5hZGRDbGFzcygndGFiLXBhbmUnKTsKICAgICAgdGFiLmFkZENsYXNzKCd0YWJiZWQtcGFuZScpOwogICAgICBpZiAoZmFkZSkKICAgICAgICB0YWIuYWRkQ2xhc3MoJ2ZhZGUnKTsKCiAgICAgIC8vIG1vdmUgaXQgaW50byB0aGUgdGFiIGNvbnRlbnQgZGl2CiAgICAgIHRhYi5kZXRhY2goKS5hcHBlbmRUbyh0YWJDb250ZW50KTsKICAgIH0pOwoKICAgIC8vIHNldCBhY3RpdmUgdGFiCiAgICAkKHRhYkxpc3QuY2hpbGRyZW4oJ2xpJylbYWN0aXZlVGFiXSkuYWRkQ2xhc3MoJ2FjdGl2ZScpOwogICAgdmFyIGFjdGl2ZSA9ICQodGFiQ29udGVudC5jaGlsZHJlbignZGl2LnNlY3Rpb24nKVthY3RpdmVUYWJdKTsKICAgIGFjdGl2ZS5hZGRDbGFzcygnYWN0aXZlJyk7CiAgICBpZiAoZmFkZSkKICAgICAgYWN0aXZlLmFkZENsYXNzKCdpbicpOwoKICAgIGlmICh0YWJzZXQuaGFzQ2xhc3MoInRhYnNldC1zdGlja3kiKSkKICAgICAgdGFic2V0LnJtYXJrZG93blN0aWNreVRhYnMoKTsKICB9CgogIC8vIGNvbnZlcnQgc2VjdGlvbiBkaXZzIHdpdGggdGhlIC50YWJzZXQgY2xhc3MgdG8gdGFic2V0cwogIHZhciB0YWJzZXRzID0gJCgiZGl2LnNlY3Rpb24udGFic2V0Iik7CiAgdGFic2V0cy5lYWNoKGZ1bmN0aW9uKGkpIHsKICAgIGJ1aWxkVGFic2V0KCQodGFic2V0c1tpXSkpOwogIH0pOwp9OwoK"></script> <link href="data:text/css;charset=utf-8,pre%20%2Eoperator%2C%0Apre%20%2Eparen%20%7B%0Acolor%3A%20rgb%28104%2C%20118%2C%20135%29%0A%7D%0Apre%20%2Eliteral%20%7B%0Acolor%3A%20%23990073%0A%7D%0Apre%20%2Enumber%20%7B%0Acolor%3A%20%23099%3B%0A%7D%0Apre%20%2Ecomment%20%7B%0Acolor%3A%20%23998%3B%0Afont%2Dstyle%3A%20italic%0A%7D%0Apre%20%2Ekeyword%20%7B%0Acolor%3A%20%23900%3B%0Afont%2Dweight%3A%20bold%0A%7D%0Apre%20%2Eidentifier%20%7B%0Acolor%3A%20rgb%280%2C%200%2C%200%29%3B%0A%7D%0Apre%20%2Estring%20%7B%0Acolor%3A%20%23d14%3B%0A%7D%0A" rel="stylesheet" /> <script src="data:application/x-javascript;base64,dmFyIGhsanM9bmV3IGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbShwKXtyZXR1cm4gcC5yZXBsYWNlKC8mL2dtLCImYW1wOyIpLnJlcGxhY2UoLzwvZ20sIiZsdDsiKX1mdW5jdGlvbiBmKHIscSxwKXtyZXR1cm4gUmVnRXhwKHEsIm0iKyhyLmNJPyJpIjoiIikrKHA/ImciOiIiKSl9ZnVuY3Rpb24gYihyKXtmb3IodmFyIHA9MDtwPHIuY2hpbGROb2Rlcy5sZW5ndGg7cCsrKXt2YXIgcT1yLmNoaWxkTm9kZXNbcF07aWYocS5ub2RlTmFtZT09IkNPREUiKXtyZXR1cm4gcX1pZighKHEubm9kZVR5cGU9PTMmJnEubm9kZVZhbHVlLm1hdGNoKC9ccysvKSkpe2JyZWFrfX19ZnVuY3Rpb24gaCh0LHMpe3ZhciBwPSIiO2Zvcih2YXIgcj0wO3I8dC5jaGlsZE5vZGVzLmxlbmd0aDtyKyspe2lmKHQuY2hpbGROb2Rlc1tyXS5ub2RlVHlwZT09Myl7dmFyIHE9dC5jaGlsZE5vZGVzW3JdLm5vZGVWYWx1ZTtpZihzKXtxPXEucmVwbGFjZSgvXG4vZywiIil9cCs9cX1lbHNle2lmKHQuY2hpbGROb2Rlc1tyXS5ub2RlTmFtZT09IkJSIil7cCs9IlxuIn1lbHNle3ArPWgodC5jaGlsZE5vZGVzW3JdKX19fWlmKC9NU0lFIFs2NzhdLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKXtwPXAucmVwbGFjZSgvXHIvZywiXG4iKX1yZXR1cm4gcH1mdW5jdGlvbiBhKHMpe3ZhciByPXMuY2xhc3NOYW1lLnNwbGl0KC9ccysvKTtyPXIuY29uY2F0KHMucGFyZW50Tm9kZS5jbGFzc05hbWUuc3BsaXQoL1xzKy8pKTtmb3IodmFyIHE9MDtxPHIubGVuZ3RoO3ErKyl7dmFyIHA9cltxXS5yZXBsYWNlKC9ebGFuZ3VhZ2UtLywiIik7aWYoZVtwXSl7cmV0dXJuIHB9fX1mdW5jdGlvbiBjKHEpe3ZhciBwPVtdOyhmdW5jdGlvbihzLHQpe2Zvcih2YXIgcj0wO3I8cy5jaGlsZE5vZGVzLmxlbmd0aDtyKyspe2lmKHMuY2hpbGROb2Rlc1tyXS5ub2RlVHlwZT09Myl7dCs9cy5jaGlsZE5vZGVzW3JdLm5vZGVWYWx1ZS5sZW5ndGh9ZWxzZXtpZihzLmNoaWxkTm9kZXNbcl0ubm9kZU5hbWU9PSJCUiIpe3QrPTF9ZWxzZXtpZihzLmNoaWxkTm9kZXNbcl0ubm9kZVR5cGU9PTEpe3AucHVzaCh7ZXZlbnQ6InN0YXJ0IixvZmZzZXQ6dCxub2RlOnMuY2hpbGROb2Rlc1tyXX0pO3Q9YXJndW1lbnRzLmNhbGxlZShzLmNoaWxkTm9kZXNbcl0sdCk7cC5wdXNoKHtldmVudDoic3RvcCIsb2Zmc2V0OnQsbm9kZTpzLmNoaWxkTm9kZXNbcl19KX19fX1yZXR1cm4gdH0pKHEsMCk7cmV0dXJuIHB9ZnVuY3Rpb24gayh5LHcseCl7dmFyIHE9MDt2YXIgej0iIjt2YXIgcz1bXTtmdW5jdGlvbiB1KCl7aWYoeS5sZW5ndGgmJncubGVuZ3RoKXtpZih5WzBdLm9mZnNldCE9d1swXS5vZmZzZXQpe3JldHVybih5WzBdLm9mZnNldDx3WzBdLm9mZnNldCk/eTp3fWVsc2V7cmV0dXJuIHdbMF0uZXZlbnQ9PSJzdGFydCI/eTp3fX1lbHNle3JldHVybiB5Lmxlbmd0aD95Ond9fWZ1bmN0aW9uIHQoRCl7dmFyIEE9IjwiK0Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtmb3IodmFyIEI9MDtCPEQuYXR0cmlidXRlcy5sZW5ndGg7QisrKXt2YXIgQz1ELmF0dHJpYnV0ZXNbQl07QSs9IiAiK0Mubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihDLnZhbHVlIT09dW5kZWZpbmVkJiZDLnZhbHVlIT09ZmFsc2UmJkMudmFsdWUhPT1udWxsKXtBKz0nPSInK20oQy52YWx1ZSkrJyInfX1yZXR1cm4gQSsiPiJ9d2hpbGUoeS5sZW5ndGh8fHcubGVuZ3RoKXt2YXIgdj11KCkuc3BsaWNlKDAsMSlbMF07eis9bSh4LnN1YnN0cihxLHYub2Zmc2V0LXEpKTtxPXYub2Zmc2V0O2lmKHYuZXZlbnQ9PSJzdGFydCIpe3orPXQodi5ub2RlKTtzLnB1c2godi5ub2RlKX1lbHNle2lmKHYuZXZlbnQ9PSJzdG9wIil7dmFyIHAscj1zLmxlbmd0aDtkb3tyLS07cD1zW3JdO3orPSgiPC8iK3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKSsiPiIpfXdoaWxlKHAhPXYubm9kZSk7cy5zcGxpY2UociwxKTt3aGlsZShyPHMubGVuZ3RoKXt6Kz10KHNbcl0pO3IrK319fX1yZXR1cm4geittKHguc3Vic3RyKHEpKX1mdW5jdGlvbiBqKCl7ZnVuY3Rpb24gcSh4LHksdil7aWYoeC5jb21waWxlZCl7cmV0dXJufXZhciB1O3ZhciBzPVtdO2lmKHguayl7eC5sUj1mKHkseC5sfHxobGpzLklSLHRydWUpO2Zvcih2YXIgdyBpbiB4Lmspe2lmKCF4LmsuaGFzT3duUHJvcGVydHkodykpe2NvbnRpbnVlfWlmKHgua1t3XSBpbnN0YW5jZW9mIE9iamVjdCl7dT14Lmtbd119ZWxzZXt1PXguazt3PSJrZXl3b3JkIn1mb3IodmFyIHIgaW4gdSl7aWYoIXUuaGFzT3duUHJvcGVydHkocikpe2NvbnRpbnVlfXgua1tyXT1bdyx1W3JdXTtzLnB1c2gocil9fX1pZighdil7aWYoeC5iV0spe3guYj0iXFxiKCIrcy5qb2luKCJ8IikrIilcXHMifXguYlI9Zih5LHguYj94LmI6IlxcQnxcXGIiKTtpZigheC5lJiYheC5lVyl7eC5lPSJcXEJ8XFxiIn1pZih4LmUpe3guZVI9Zih5LHguZSl9fWlmKHguaSl7eC5pUj1mKHkseC5pKX1pZih4LnI9PT11bmRlZmluZWQpe3gucj0xfWlmKCF4LmMpe3guYz1bXX14LmNvbXBpbGVkPXRydWU7Zm9yKHZhciB0PTA7dDx4LmMubGVuZ3RoO3QrKyl7aWYoeC5jW3RdPT0ic2VsZiIpe3guY1t0XT14fXEoeC5jW3RdLHksZmFsc2UpfWlmKHguc3RhcnRzKXtxKHguc3RhcnRzLHksZmFsc2UpfX1mb3IodmFyIHAgaW4gZSl7aWYoIWUuaGFzT3duUHJvcGVydHkocCkpe2NvbnRpbnVlfXEoZVtwXS5kTSxlW3BdLHRydWUpfX1mdW5jdGlvbiBkKEIsQyl7aWYoIWouY2FsbGVkKXtqKCk7ai5jYWxsZWQ9dHJ1ZX1mdW5jdGlvbiBxKHIsTSl7Zm9yKHZhciBMPTA7TDxNLmMubGVuZ3RoO0wrKyl7aWYoKE0uY1tMXS5iUi5leGVjKHIpfHxbbnVsbF0pWzBdPT1yKXtyZXR1cm4gTS5jW0xdfX19ZnVuY3Rpb24gdihMLHIpe2lmKERbTF0uZSYmRFtMXS5lUi50ZXN0KHIpKXtyZXR1cm4gMX1pZihEW0xdLmVXKXt2YXIgTT12KEwtMSxyKTtyZXR1cm4gTT9NKzE6MH1yZXR1cm4gMH1mdW5jdGlvbiB3KHIsTCl7cmV0dXJuIEwuaSYmTC5pUi50ZXN0KHIpfWZ1bmN0aW9uIEsoTixPKXt2YXIgTT1bXTtmb3IodmFyIEw9MDtMPE4uYy5sZW5ndGg7TCsrKXtNLnB1c2goTi5jW0xdLmIpfXZhciByPUQubGVuZ3RoLTE7ZG97aWYoRFtyXS5lKXtNLnB1c2goRFtyXS5lKX1yLS19d2hpbGUoRFtyKzFdLmVXKTtpZihOLmkpe00ucHVzaChOLmkpfXJldHVybiBmKE8sTS5qb2luKCJ8IiksdHJ1ZSl9ZnVuY3Rpb24gcChNLEwpe3ZhciBOPURbRC5sZW5ndGgtMV07aWYoIU4udCl7Ti50PUsoTixFKX1OLnQubGFzdEluZGV4PUw7dmFyIHI9Ti50LmV4ZWMoTSk7cmV0dXJuIHI/W00uc3Vic3RyKEwsci5pbmRleC1MKSxyWzBdLGZhbHNlXTpbTS5zdWJzdHIoTCksIiIsdHJ1ZV19ZnVuY3Rpb24geihOLHIpe3ZhciBMPUUuY0k/clswXS50b0xvd2VyQ2FzZSgpOnJbMF07dmFyIE09Ti5rW0xdO2lmKE0mJk0gaW5zdGFuY2VvZiBBcnJheSl7cmV0dXJuIE19cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIEYoTCxQKXtMPW0oTCk7aWYoIVAuayl7cmV0dXJuIEx9dmFyIHI9IiI7dmFyIE89MDtQLmxSLmxhc3RJbmRleD0wO3ZhciBNPVAubFIuZXhlYyhMKTt3aGlsZShNKXtyKz1MLnN1YnN0cihPLE0uaW5kZXgtTyk7dmFyIE49eihQLE0pO2lmKE4pe3grPU5bMV07cis9JzxzcGFuIGNsYXNzPSInK05bMF0rJyI+JytNWzBdKyI8L3NwYW4+In1lbHNle3IrPU1bMF19Tz1QLmxSLmxhc3RJbmRleDtNPVAubFIuZXhlYyhMKX1yZXR1cm4gcitMLnN1YnN0cihPLEwubGVuZ3RoLU8pfWZ1bmN0aW9uIEooTCxNKXtpZihNLnNMJiZlW00uc0xdKXt2YXIgcj1kKE0uc0wsTCk7eCs9ci5rZXl3b3JkX2NvdW50O3JldHVybiByLnZhbHVlfWVsc2V7cmV0dXJuIEYoTCxNKX19ZnVuY3Rpb24gSShNLHIpe3ZhciBMPU0uY04/JzxzcGFuIGNsYXNzPSInK00uY04rJyI+JzoiIjtpZihNLnJCKXt5Kz1MO00uYnVmZmVyPSIifWVsc2V7aWYoTS5lQil7eSs9bShyKStMO00uYnVmZmVyPSIifWVsc2V7eSs9TDtNLmJ1ZmZlcj1yfX1ELnB1c2goTSk7QSs9TS5yfWZ1bmN0aW9uIEcoTixNLFEpe3ZhciBSPURbRC5sZW5ndGgtMV07aWYoUSl7eSs9SihSLmJ1ZmZlcitOLFIpO3JldHVybiBmYWxzZX12YXIgUD1xKE0sUik7aWYoUCl7eSs9SihSLmJ1ZmZlcitOLFIpO0koUCxNKTtyZXR1cm4gUC5yQn12YXIgTD12KEQubGVuZ3RoLTEsTSk7aWYoTCl7dmFyIE89Ui5jTj8iPC9zcGFuPiI6IiI7aWYoUi5yRSl7eSs9SihSLmJ1ZmZlcitOLFIpK099ZWxzZXtpZihSLmVFKXt5Kz1KKFIuYnVmZmVyK04sUikrTyttKE0pfWVsc2V7eSs9SihSLmJ1ZmZlcitOK00sUikrT319d2hpbGUoTD4xKXtPPURbRC5sZW5ndGgtMl0uY04/Ijwvc3Bhbj4iOiIiO3krPU87TC0tO0QubGVuZ3RoLS19dmFyIHI9RFtELmxlbmd0aC0xXTtELmxlbmd0aC0tO0RbRC5sZW5ndGgtMV0uYnVmZmVyPSIiO2lmKHIuc3RhcnRzKXtJKHIuc3RhcnRzLCIiKX1yZXR1cm4gUi5yRX1pZih3KE0sUikpe3Rocm93IklsbGVnYWwifX12YXIgRT1lW0JdO3ZhciBEPVtFLmRNXTt2YXIgQT0wO3ZhciB4PTA7dmFyIHk9IiI7dHJ5e3ZhciBzLHU9MDtFLmRNLmJ1ZmZlcj0iIjtkb3tzPXAoQyx1KTt2YXIgdD1HKHNbMF0sc1sxXSxzWzJdKTt1Kz1zWzBdLmxlbmd0aDtpZighdCl7dSs9c1sxXS5sZW5ndGh9fXdoaWxlKCFzWzJdKTtpZihELmxlbmd0aD4xKXt0aHJvdyJJbGxlZ2FsIn1yZXR1cm57cjpBLGtleXdvcmRfY291bnQ6eCx2YWx1ZTp5fX1jYXRjaChIKXtpZihIPT0iSWxsZWdhbCIpe3JldHVybntyOjAsa2V5d29yZF9jb3VudDowLHZhbHVlOm0oQyl9fWVsc2V7dGhyb3cgSH19fWZ1bmN0aW9uIGcodCl7dmFyIHA9e2tleXdvcmRfY291bnQ6MCxyOjAsdmFsdWU6bSh0KX07dmFyIHI9cDtmb3IodmFyIHEgaW4gZSl7aWYoIWUuaGFzT3duUHJvcGVydHkocSkpe2NvbnRpbnVlfXZhciBzPWQocSx0KTtzLmxhbmd1YWdlPXE7aWYocy5rZXl3b3JkX2NvdW50K3Mucj5yLmtleXdvcmRfY291bnQrci5yKXtyPXN9aWYocy5rZXl3b3JkX2NvdW50K3Mucj5wLmtleXdvcmRfY291bnQrcC5yKXtyPXA7cD1zfX1pZihyLmxhbmd1YWdlKXtwLnNlY29uZF9iZXN0PXJ9cmV0dXJuIHB9ZnVuY3Rpb24gaShyLHEscCl7aWYocSl7cj1yLnJlcGxhY2UoL14oKDxbXj5dKz58XHQpKykvZ20sZnVuY3Rpb24odCx3LHYsdSl7cmV0dXJuIHcucmVwbGFjZSgvXHQvZyxxKX0pfWlmKHApe3I9ci5yZXBsYWNlKC9cbi9nLCI8YnI+Iil9cmV0dXJuIHJ9ZnVuY3Rpb24gbih0LHcscil7dmFyIHg9aCh0LHIpO3ZhciB2PWEodCk7dmFyIHkscztpZih2KXt5PWQodix4KX1lbHNle3JldHVybn12YXIgcT1jKHQpO2lmKHEubGVuZ3RoKXtzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInByZSIpO3MuaW5uZXJIVE1MPXkudmFsdWU7eS52YWx1ZT1rKHEsYyhzKSx4KX15LnZhbHVlPWkoeS52YWx1ZSx3LHIpO3ZhciB1PXQuY2xhc3NOYW1lO2lmKCF1Lm1hdGNoKCIoXFxzfF4pKGxhbmd1YWdlLSk/Iit2KyIoXFxzfCQpIikpe3U9dT8odSsiICIrdik6dn1pZigvTVNJRSBbNjc4XS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmdC50YWdOYW1lPT0iQ09ERSImJnQucGFyZW50Tm9kZS50YWdOYW1lPT0iUFJFIil7cz10LnBhcmVudE5vZGU7dmFyIHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cC5pbm5lckhUTUw9IjxwcmU+PGNvZGU+Iit5LnZhbHVlKyI8L2NvZGU+PC9wcmU+Ijt0PXAuZmlyc3RDaGlsZC5maXJzdENoaWxkO3AuZmlyc3RDaGlsZC5jTj1zLmNOO3MucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQocC5maXJzdENoaWxkLHMpfWVsc2V7dC5pbm5lckhUTUw9eS52YWx1ZX10LmNsYXNzTmFtZT11O3QucmVzdWx0PXtsYW5ndWFnZTp2LGt3Onkua2V5d29yZF9jb3VudCxyZTp5LnJ9O2lmKHkuc2Vjb25kX2Jlc3Qpe3Quc2Vjb25kX2Jlc3Q9e2xhbmd1YWdlOnkuc2Vjb25kX2Jlc3QubGFuZ3VhZ2Usa3c6eS5zZWNvbmRfYmVzdC5rZXl3b3JkX2NvdW50LHJlOnkuc2Vjb25kX2Jlc3Qucn19fWZ1bmN0aW9uIG8oKXtpZihvLmNhbGxlZCl7cmV0dXJufW8uY2FsbGVkPXRydWU7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByZSIpO2Zvcih2YXIgcD0wO3A8ci5sZW5ndGg7cCsrKXt2YXIgcT1iKHJbcF0pO2lmKHEpe24ocSxobGpzLnRhYlJlcGxhY2UpfX19ZnVuY3Rpb24gbCgpe2lmKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsbyxmYWxzZSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLG8sZmFsc2UpfWVsc2V7aWYod2luZG93LmF0dGFjaEV2ZW50KXt3aW5kb3cuYXR0YWNoRXZlbnQoIm9ubG9hZCIsbyl9ZWxzZXt3aW5kb3cub25sb2FkPW99fX12YXIgZT17fTt0aGlzLkxBTkdVQUdFUz1lO3RoaXMuaGlnaGxpZ2h0PWQ7dGhpcy5oaWdobGlnaHRBdXRvPWc7dGhpcy5maXhNYXJrdXA9aTt0aGlzLmhpZ2hsaWdodEJsb2NrPW47dGhpcy5pbml0SGlnaGxpZ2h0aW5nPW87dGhpcy5pbml0SGlnaGxpZ2h0aW5nT25Mb2FkPWw7dGhpcy5JUj0iW2EtekEtWl1bYS16QS1aMC05X10qIjt0aGlzLlVJUj0iW2EtekEtWl9dW2EtekEtWjAtOV9dKiI7dGhpcy5OUj0iXFxiXFxkKyhcXC5cXGQrKT8iO3RoaXMuQ05SPSJcXGIoMFt4WF1bYS1mQS1GMC05XSt8KFxcZCsoXFwuXFxkKik/fFxcLlxcZCspKFtlRV1bLStdP1xcZCspPykiO3RoaXMuQk5SPSJcXGIoMGJbMDFdKykiO3RoaXMuUlNSPSIhfCE9fCE9PXwlfCU9fCZ8JiZ8Jj18XFwqfFxcKj18XFwrfFxcKz18LHxcXC58LXwtPXwvfC89fDp8O3w8fDw8fDw8PXw8PXw9fD09fD09PXw+fD49fD4+fD4+PXw+Pj58Pj4+PXxcXD98XFxbfFxce3xcXCh8XFxefFxcXj18XFx8fFxcfD18XFx8XFx8fH4iO3RoaXMuRVI9Iig/IVtcXHNcXFNdKSI7dGhpcy5CRT17YjoiXFxcXC4iLHI6MH07dGhpcy5BU009e2NOOiJzdHJpbmciLGI6IiciLGU6IiciLGk6IlxcbiIsYzpbdGhpcy5CRV0scjowfTt0aGlzLlFTTT17Y046InN0cmluZyIsYjonIicsZTonIicsaToiXFxuIixjOlt0aGlzLkJFXSxyOjB9O3RoaXMuQ0xDTT17Y046ImNvbW1lbnQiLGI6Ii8vIixlOiIkIn07dGhpcy5DQkxDTE09e2NOOiJjb21tZW50IixiOiIvXFwqIixlOiJcXCovIn07dGhpcy5IQ009e2NOOiJjb21tZW50IixiOiIjIixlOiIkIn07dGhpcy5OTT17Y046Im51bWJlciIsYjp0aGlzLk5SLHI6MH07dGhpcy5DTk09e2NOOiJudW1iZXIiLGI6dGhpcy5DTlIscjowfTt0aGlzLkJOTT17Y046Im51bWJlciIsYjp0aGlzLkJOUixyOjB9O3RoaXMuaW5oZXJpdD1mdW5jdGlvbihyLHMpe3ZhciBwPXt9O2Zvcih2YXIgcSBpbiByKXtwW3FdPXJbcV19aWYocyl7Zm9yKHZhciBxIGluIHMpe3BbcV09c1txXX19cmV0dXJuIHB9fSgpO2hsanMuTEFOR1VBR0VTLmJhc2g9ZnVuY3Rpb24oKXt2YXIgZT17InRydWUiOjEsImZhbHNlIjoxfTt2YXIgYj17Y046InZhcmlhYmxlIixiOiJcXCQoW2EtekEtWjAtOV9dKylcXGIifTt2YXIgYT17Y046InZhcmlhYmxlIixiOiJcXCRcXHsoKFtefV0pfChcXFxcfSkpK1xcfSIsYzpbaGxqcy5DTk1dfTt2YXIgZj17Y046InN0cmluZyIsYjonIicsZTonIicsaToiXFxuIixjOltobGpzLkJFLGIsYV0scjowfTt2YXIgYz17Y046InN0cmluZyIsYjoiJyIsZToiJyIsYzpbe2I6IicnIn1dLHI6MH07dmFyIGQ9e2NOOiJ0ZXN0X2NvbmRpdGlvbiIsYjoiIixlOiIiLGM6W2YsYyxiLGEsaGxqcy5DTk1dLGs6e2xpdGVyYWw6ZX0scjowfTtyZXR1cm57ZE06e2s6e2tleXdvcmQ6eyJpZiI6MSx0aGVuOjEsImVsc2UiOjEsZmk6MSwiZm9yIjoxLCJicmVhayI6MSwiY29udGludWUiOjEsIndoaWxlIjoxLCJpbiI6MSwiZG8iOjEsZG9uZToxLGVjaG86MSxleGl0OjEsInJldHVybiI6MSxzZXQ6MSxkZWNsYXJlOjF9LGxpdGVyYWw6ZX0sYzpbe2NOOiJzaGViYW5nIixiOiIoIyFcXC9iaW5cXC9iYXNoKXwoIyFcXC9iaW5cXC9zaCkiLHI6MTB9LGIsYSxobGpzLkhDTSxobGpzLkNOTSxmLGMsaGxqcy5pbmhlcml0KGQse2I6IlxcWyAiLGU6IiBcXF0iLHI6MH0pLGhsanMuaW5oZXJpdChkLHtiOiJcXFtcXFsgIixlOiIgXFxdXFxdIn0pXX19fSgpO2hsanMuTEFOR1VBR0VTLmNwcD1mdW5jdGlvbigpe3ZhciBhPXtrZXl3b3JkOnsiZmFsc2UiOjEsImludCI6MSwiZmxvYXQiOjEsIndoaWxlIjoxLCJwcml2YXRlIjoxLCJjaGFyIjoxLCJjYXRjaCI6MSwiZXhwb3J0IjoxLHZpcnR1YWw6MSxvcGVyYXRvcjoyLHNpemVvZjoyLGR5bmFtaWNfY2FzdDoyLHR5cGVkZWY6Mixjb25zdF9jYXN0OjIsImNvbnN0IjoxLHN0cnVjdDoxLCJmb3IiOjEsc3RhdGljX2Nhc3Q6Mix1bmlvbjoxLG5hbWVzcGFjZToxLHVuc2lnbmVkOjEsImxvbmciOjEsInRocm93IjoxLCJ2b2xhdGlsZSI6Miwic3RhdGljIjoxLCJwcm90ZWN0ZWQiOjEsYm9vbDoxLHRlbXBsYXRlOjEsbXV0YWJsZToxLCJpZiI6MSwicHVibGljIjoxLGZyaWVuZDoyLCJkbyI6MSwicmV0dXJuIjoxLCJnb3RvIjoxLGF1dG86MSwidm9pZCI6MiwiZW51bSI6MSwiZWxzZSI6MSwiYnJlYWsiOjEsIm5ldyI6MSxleHRlcm46MSx1c2luZzoxLCJ0cnVlIjoxLCJjbGFzcyI6MSxhc206MSwiY2FzZSI6MSx0eXBlaWQ6MSwic2hvcnQiOjEscmVpbnRlcnByZXRfY2FzdDoyLCJkZWZhdWx0IjoxLCJkb3VibGUiOjEscmVnaXN0ZXI6MSxleHBsaWNpdDoxLHNpZ25lZDoxLHR5cGVuYW1lOjEsInRyeSI6MSwidGhpcyI6MSwic3dpdGNoIjoxLCJjb250aW51ZSI6MSx3Y2hhcl90OjEsaW5saW5lOjEsImRlbGV0ZSI6MSxhbGlnbm9mOjEsY2hhcjE2X3Q6MSxjaGFyMzJfdDoxLGNvbnN0ZXhwcjoxLGRlY2x0eXBlOjEsbm9leGNlcHQ6MSxudWxscHRyOjEsc3RhdGljX2Fzc2VydDoxLHRocmVhZF9sb2NhbDoxLHJlc3RyaWN0OjEsX0Jvb2w6MSxjb21wbGV4OjF9LGJ1aWx0X2luOntzdGQ6MSxzdHJpbmc6MSxjaW46MSxjb3V0OjEsY2VycjoxLGNsb2c6MSxzdHJpbmdzdHJlYW06MSxpc3RyaW5nc3RyZWFtOjEsb3N0cmluZ3N0cmVhbToxLGF1dG9fcHRyOjEsZGVxdWU6MSxsaXN0OjEscXVldWU6MSxzdGFjazoxLHZlY3RvcjoxLG1hcDoxLHNldDoxLGJpdHNldDoxLG11bHRpc2V0OjEsbXVsdGltYXA6MSx1bm9yZGVyZWRfc2V0OjEsdW5vcmRlcmVkX21hcDoxLHVub3JkZXJlZF9tdWx0aXNldDoxLHVub3JkZXJlZF9tdWx0aW1hcDoxLGFycmF5OjEsc2hhcmVkX3B0cjoxfX07cmV0dXJue2RNOntrOmEsaToiPC8iLGM6W2hsanMuQ0xDTSxobGpzLkNCTENMTSxobGpzLlFTTSx7Y046InN0cmluZyIsYjoiJ1xcXFw/LiIsZToiJyIsaToiLiJ9LHtjTjoibnVtYmVyIixiOiJcXGIoXFxkKyhcXC5cXGQqKT98XFwuXFxkKykodXxVfGx8THx1bHxVTHxmfEYpIn0saGxqcy5DTk0se2NOOiJwcmVwcm9jZXNzb3IiLGI6IiMiLGU6IiQifSx7Y046InN0bF9jb250YWluZXIiLGI6IlxcYihkZXF1ZXxsaXN0fHF1ZXVlfHN0YWNrfHZlY3RvcnxtYXB8c2V0fGJpdHNldHxtdWx0aXNldHxtdWx0aW1hcHx1bm9yZGVyZWRfbWFwfHVub3JkZXJlZF9zZXR8dW5vcmRlcmVkX211bHRpc2V0fHVub3JkZXJlZF9tdWx0aW1hcHxhcnJheSlcXHMqPCIsZToiPiIsazphLHI6MTAsYzpbInNlbGYiXX1dfX19KCk7aGxqcy5MQU5HVUFHRVMuY3NzPWZ1bmN0aW9uKCl7dmFyIGE9e2NOOiJmdW5jdGlvbiIsYjpobGpzLklSKyJcXCgiLGU6IlxcKSIsYzpbe2VXOnRydWUsZUU6dHJ1ZSxjOltobGpzLk5NLGhsanMuQVNNLGhsanMuUVNNXX1dfTtyZXR1cm57Y0k6dHJ1ZSxkTTp7aToiWz0vfCddIixjOltobGpzLkNCTENMTSx7Y046ImlkIixiOiJcXCNbQS1aYS16MC05Xy1dKyJ9LHtjTjoiY2xhc3MiLGI6IlxcLltBLVphLXowLTlfLV0rIixyOjB9LHtjTjoiYXR0cl9zZWxlY3RvciIsYjoiXFxbIixlOiJcXF0iLGk6IiQifSx7Y046InBzZXVkbyIsYjoiOig6KT9bYS16QS1aMC05XFxfXFwtXFwrXFwoXFwpXFxcIlxcJ10rIn0se2NOOiJhdF9ydWxlIixiOiJAKGZvbnQtZmFjZXxwYWdlKSIsbDoiW2Etei1dKyIsazp7ImZvbnQtZmFjZSI6MSxwYWdlOjF9fSx7Y046ImF0X3J1bGUiLGI6IkAiLGU6Ilt7O10iLGVFOnRydWUsazp7ImltcG9ydCI6MSxwYWdlOjEsbWVkaWE6MSxjaGFyc2V0OjF9LGM6W2EsaGxqcy5BU00saGxqcy5RU00saGxqcy5OTV19LHtjTjoidGFnIixiOmhsanMuSVIscjowfSx7Y046InJ1bGVzIixiOiJ7IixlOiJ9IixpOiJbXlxcc10iLHI6MCxjOltobGpzLkNCTENMTSx7Y046InJ1bGUiLGI6IlteXFxzXSIsckI6dHJ1ZSxlOiI7IixlVzp0cnVlLGM6W3tjTjoiYXR0cmlidXRlIixiOiJbQS1aXFxfXFwuXFwtXSsiLGU6IjoiLGVFOnRydWUsaToiW15cXHNdIixzdGFydHM6e2NOOiJ2YWx1ZSIsZVc6dHJ1ZSxlRTp0cnVlLGM6W2EsaGxqcy5OTSxobGpzLlFTTSxobGpzLkFTTSxobGpzLkNCTENMTSx7Y046ImhleGNvbG9yIixiOiJcXCNbMC05QS1GXSsifSx7Y046ImltcG9ydGFudCIsYjoiIWltcG9ydGFudCJ9XX19XX1dfV19fX0oKTtobGpzLkxBTkdVQUdFUy5pbmk9e2NJOnRydWUsZE06e2k6IlteXFxzXSIsYzpbe2NOOiJjb21tZW50IixiOiI7IixlOiIkIn0se2NOOiJ0aXRsZSIsYjoiXlxcWyIsZToiXFxdIn0se2NOOiJzZXR0aW5nIixiOiJeW2EtejAtOV9cXFtcXF1dK1sgXFx0XSo9WyBcXHRdKiIsZToiJCIsYzpbe2NOOiJ2YWx1ZSIsZVc6dHJ1ZSxrOntvbjoxLG9mZjoxLCJ0cnVlIjoxLCJmYWxzZSI6MSx5ZXM6MSxubzoxfSxjOltobGpzLlFTTSxobGpzLk5NXX1dfV19fTtobGpzLkxBTkdVQUdFUy5wZXJsPWZ1bmN0aW9uKCl7dmFyIGQ9e2dldHB3ZW50OjEsZ2V0c2VydmVudDoxLHF1b3RlbWV0YToxLG1zZ3JjdjoxLHNjYWxhcjoxLGtpbGw6MSxkYm1jbG9zZToxLHVuZGVmOjEsbGM6MSxtYToxLHN5c3dyaXRlOjEsdHI6MSxzZW5kOjEsdW1hc2s6MSxzeXNvcGVuOjEsc2htd3JpdGU6MSx2ZWM6MSxxeDoxLHV0aW1lOjEsbG9jYWw6MSxvY3Q6MSxzZW1jdGw6MSxsb2NhbHRpbWU6MSxyZWFkcGlwZToxLCJkbyI6MSwicmV0dXJuIjoxLGZvcm1hdDoxLHJlYWQ6MSxzcHJpbnRmOjEsZGJtb3BlbjoxLHBvcDoxLGdldHBncnA6MSxub3Q6MSxnZXRwd25hbToxLHJld2luZGRpcjoxLHFxOjEsZmlsZW5vOjEscXc6MSxlbmRwcm90b2VudDoxLHdhaXQ6MSxzZXRob3N0ZW50OjEsYmxlc3M6MSxzOjAsb3BlbmRpcjoxLCJjb250aW51ZSI6MSxlYWNoOjEsc2xlZXA6MSxlbmRncmVudDoxLHNodXRkb3duOjEsZHVtcDoxLGNob21wOjEsY29ubmVjdDoxLGdldHNvY2tuYW1lOjEsZGllOjEsc29ja2V0cGFpcjoxLGNsb3NlOjEsZmxvY2s6MSxleGlzdHM6MSxpbmRleDoxLHNobWdldDoxLHN1YjoxLCJmb3IiOjEsZW5kcHdlbnQ6MSxyZWRvOjEsbHN0YXQ6MSxtc2djdGw6MSxzZXRwZ3JwOjEsYWJzOjEsZXhpdDoxLHNlbGVjdDoxLHByaW50OjEscmVmOjEsZ2V0aG9zdGJ5YWRkcjoxLHVuc2hpZnQ6MSxmY250bDoxLHN5c2NhbGw6MSwiZ290byI6MSxnZXRuZXRieWFkZHI6MSxqb2luOjEsZ210aW1lOjEsc3ltbGluazoxLHNlbWdldDoxLHNwbGljZToxLHg6MCxnZXRwZWVybmFtZToxLHJlY3Y6MSxsb2c6MSxzZXRzb2Nrb3B0OjEsY29zOjEsbGFzdDoxLHJldmVyc2U6MSxnZXRob3N0YnluYW1lOjEsZ2V0Z3JuYW06MSxzdHVkeToxLGZvcm1saW5lOjEsZW5kaG9zdGVudDoxLHRpbWVzOjEsY2hvcDoxLGxlbmd0aDoxLGdldGhvc3RlbnQ6MSxnZXRuZXRlbnQ6MSxwYWNrOjEsZ2V0cHJvdG9lbnQ6MSxnZXRzZXJ2YnluYW1lOjEscmFuZDoxLG1rZGlyOjEscG9zOjEsY2htb2Q6MSx5OjAsc3Vic3RyOjEsZW5kbmV0ZW50OjEscHJpbnRmOjEsbmV4dDoxLG9wZW46MSxtc2dzbmQ6MSxyZWFkZGlyOjEsdXNlOjEsdW5saW5rOjEsZ2V0c29ja29wdDoxLGdldHByaW9yaXR5OjEscmluZGV4OjEsd2FudGFycmF5OjEsaGV4OjEsc3lzdGVtOjEsZ2V0c2VydmJ5cG9ydDoxLGVuZHNlcnZlbnQ6MSwiaW50IjoxLGNocjoxLHVudGllOjEscm1kaXI6MSxwcm90b3R5cGU6MSx0ZWxsOjEsbGlzdGVuOjEsZm9yazoxLHNobXJlYWQ6MSx1Y2ZpcnN0OjEsc2V0cHJvdG9lbnQ6MSwiZWxzZSI6MSxzeXNzZWVrOjEsbGluazoxLGdldGdyZ2lkOjEsc2htY3RsOjEsd2FpdHBpZDoxLHVucGFjazoxLGdldG5ldGJ5bmFtZToxLHJlc2V0OjEsY2hkaXI6MSxncmVwOjEsc3BsaXQ6MSxyZXF1aXJlOjEsY2FsbGVyOjEsbGNmaXJzdDoxLHVudGlsOjEsd2FybjoxLCJ3aGlsZSI6MSx2YWx1ZXM6MSxzaGlmdDoxLHRlbGxkaXI6MSxnZXRwd3VpZDoxLG15OjEsZ2V0cHJvdG9ieW51bWJlcjoxLCJkZWxldGUiOjEsYW5kOjEsc29ydDoxLHVjOjEsZGVmaW5lZDoxLHNyYW5kOjEsYWNjZXB0OjEsInBhY2thZ2UiOjEsc2Vla2RpcjoxLGdldHByb3RvYnluYW1lOjEsc2Vtb3A6MSxvdXI6MSxyZW5hbWU6MSxzZWVrOjEsImlmIjoxLHE6MCxjaHJvb3Q6MSxzeXNyZWFkOjEsc2V0cHdlbnQ6MSxubzoxLGNyeXB0OjEsZ2V0YzoxLGNob3duOjEsc3FydDoxLHdyaXRlOjEsc2V0bmV0ZW50OjEsc2V0cHJpb3JpdHk6MSxmb3JlYWNoOjEsdGllOjEsc2luOjEsbXNnZ2V0OjEsbWFwOjEsc3RhdDoxLGdldGxvZ2luOjEsdW5sZXNzOjEsZWxzaWY6MSx0cnVuY2F0ZToxLGV4ZWM6MSxrZXlzOjEsZ2xvYjoxLHRpZWQ6MSxjbG9zZWRpcjoxLGlvY3RsOjEsc29ja2V0OjEscmVhZGxpbms6MSwiZXZhbCI6MSx4b3I6MSxyZWFkbGluZToxLGJpbm1vZGU6MSxzZXRzZXJ2ZW50OjEsZW9mOjEsb3JkOjEsYmluZDoxLGFsYXJtOjEscGlwZToxLGF0YW4yOjEsZ2V0Z3JlbnQ6MSxleHA6MSx0aW1lOjEscHVzaDoxLHNldGdyZW50OjEsZ3Q6MSxsdDoxLG9yOjEsbmU6MSxtOjB9O3ZhciBmPXtjTjoic3Vic3QiLGI6IlskQF1cXHsiLGU6IlxcfSIsazpkLHI6MTB9O3ZhciBjPXtjTjoidmFyaWFibGUiLGI6IlxcJFxcZCJ9O3ZhciBiPXtjTjoidmFyaWFibGUiLGI6IltcXCRcXCVcXEBcXCpdKFxcXlxcd1xcYnwjXFx3KyhcXDpcXDpcXHcrKSp8W15cXHNcXHd7XXx7XFx3K318XFx3KyhcXDpcXDpcXHcqKSopIn07dmFyIGg9W2hsanMuQkUsZixjLGJdO3ZhciBnPXtiOiItPiIsYzpbe2I6aGxqcy5JUn0se2I6InsiLGU6In0ifV19O3ZhciBlPXtjTjoiY29tbWVudCIsYjoiXihfX0VORF9ffF9fREFUQV9fKSIsZToiXFxuJCIscjo1fTt2YXIgYT1bYyxiLGhsanMuSENNLGUsZyx7Y046InN0cmluZyIsYjoicVtxd3hyXT9cXHMqXFwoIixlOiJcXCkiLGM6aCxyOjV9LHtjTjoic3RyaW5nIixiOiJxW3F3eHJdP1xccypcXFsiLGU6IlxcXSIsYzpoLHI6NX0se2NOOiJzdHJpbmciLGI6InFbcXd4cl0/XFxzKlxceyIsZToiXFx9IixjOmgscjo1fSx7Y046InN0cmluZyIsYjoicVtxd3hyXT9cXHMqXFx8IixlOiJcXHwiLGM6aCxyOjV9LHtjTjoic3RyaW5nIixiOiJxW3F3eHJdP1xccypcXDwiLGU6IlxcPiIsYzpoLHI6NX0se2NOOiJzdHJpbmciLGI6InF3XFxzK3EiLGU6InEiLGM6aCxyOjV9LHtjTjoic3RyaW5nIixiOiInIixlOiInIixjOltobGpzLkJFXSxyOjB9LHtjTjoic3RyaW5nIixiOiciJyxlOiciJyxjOmgscjowfSx7Y046InN0cmluZyIsYjoiYCIsZToiYCIsYzpbaGxqcy5CRV19LHtjTjoic3RyaW5nIixiOiJ7XFx3K30iLHI6MH0se2NOOiJzdHJpbmciLGI6Ii0/XFx3K1xccypcXD1cXD4iLHI6MH0se2NOOiJudW1iZXIiLGI6IihcXGIwWzAtN19dKyl8KFxcYjB4WzAtOWEtZkEtRl9dKyl8KFxcYlsxLTldWzAtOV9dKihcXC5bMC05X10rKT8pfFswX11cXGIiLHI6MH0se2I6IigiK2hsanMuUlNSKyJ8XFxiKHNwbGl0fHJldHVybnxwcmludHxyZXZlcnNlfGdyZXApXFxiKVxccyoiLGs6e3NwbGl0OjEsInJldHVybiI6MSxwcmludDoxLHJldmVyc2U6MSxncmVwOjF9LHI6MCxjOltobGpzLkhDTSxlLHtjTjoicmVnZXhwIixiOiIoc3x0cnx5KS8oXFxcXC58W14vXSkqLyhcXFxcLnxbXi9dKSovW2Etel0qIixyOjEwfSx7Y046InJlZ2V4cCIsYjoiKG18cXIpPy8iLGU6Ii9bYS16XSoiLGM6W2hsanMuQkVdLHI6MH1dfSx7Y046InN1YiIsYjoiXFxic3ViXFxiIixlOiIoXFxzKlxcKC4qP1xcKSk/Wzt7XSIsazp7c3ViOjF9LHI6NX0se2NOOiJvcGVyYXRvciIsYjoiLVxcd1xcYiIscjowfSx7Y046InBvZCIsYjoiXFw9XFx3IixlOiJcXD1jdXQifV07Zi5jPWE7Zy5jWzFdLmM9YTtyZXR1cm57ZE06e2s6ZCxjOmF9fX0oKTtobGpzLkxBTkdVQUdFUy5weXRob249ZnVuY3Rpb24oKXt2YXIgYj1be2NOOiJzdHJpbmciLGI6Iih1fGIpP3I/JycnIixlOiInJyciLHI6MTB9LHtjTjoic3RyaW5nIixiOicodXxiKT9yPyIiIicsZTonIiIiJyxyOjEwfSx7Y046InN0cmluZyIsYjoiKHV8cnx1ciknIixlOiInIixjOltobGpzLkJFXSxyOjEwfSx7Y046InN0cmluZyIsYjonKHV8cnx1cikiJyxlOiciJyxjOltobGpzLkJFXSxyOjEwfSx7Y046InN0cmluZyIsYjoiKGJ8YnIpJyIsZToiJyIsYzpbaGxqcy5CRV19LHtjTjoic3RyaW5nIixiOicoYnxicikiJyxlOiciJyxjOltobGpzLkJFXX1dLmNvbmNhdChbaGxqcy5BU00saGxqcy5RU01dKTt2YXIgZD17Y046InRpdGxlIixiOmhsanMuVUlSfTt2YXIgYz17Y046InBhcmFtcyIsYjoiXFwoIixlOiJcXCkiLGM6Yi5jb25jYXQoW2hsanMuQ05NXSl9O3ZhciBhPXtiV0s6dHJ1ZSxlOiI6IixpOiJbJHtdIixjOltkLGNdLHI6MTB9O3JldHVybntkTTp7azp7a2V5d29yZDp7YW5kOjEsZWxpZjoxLGlzOjEsZ2xvYmFsOjEsYXM6MSwiaW4iOjEsImlmIjoxLGZyb206MSxyYWlzZToxLCJmb3IiOjEsZXhjZXB0OjEsImZpbmFsbHkiOjEscHJpbnQ6MSwiaW1wb3J0IjoxLHBhc3M6MSwicmV0dXJuIjoxLGV4ZWM6MSwiZWxzZSI6MSwiYnJlYWsiOjEsbm90OjEsIndpdGgiOjEsImNsYXNzIjoxLGFzc2VydDoxLHlpZWxkOjEsInRyeSI6MSwid2hpbGUiOjEsImNvbnRpbnVlIjoxLGRlbDoxLG9yOjEsZGVmOjEsbGFtYmRhOjEsbm9ubG9jYWw6MTB9LGJ1aWx0X2luOntOb25lOjEsVHJ1ZToxLEZhbHNlOjEsRWxsaXBzaXM6MSxOb3RJbXBsZW1lbnRlZDoxfX0saToiKDwvfC0+fFxcPykiLGM6Yi5jb25jYXQoW2hsanMuSENNLGhsanMuaW5oZXJpdChhLHtjTjoiZnVuY3Rpb24iLGs6e2RlZjoxfX0pLGhsanMuaW5oZXJpdChhLHtjTjoiY2xhc3MiLGs6eyJjbGFzcyI6MX19KSxobGpzLkNOTSx7Y046ImRlY29yYXRvciIsYjoiQCIsZToiJCJ9XSl9fX0oKTtobGpzLkxBTkdVQUdFUy5yPXtkTTp7YzpbaGxqcy5IQ00se2NOOiJudW1iZXIiLGI6IlxcYjBbeFhdWzAtOWEtZkEtRl0rW0xpXT9cXGIiLGU6aGxqcy5JTU1FRElBVEVfUkUscjowfSx7Y046Im51bWJlciIsYjoiXFxiXFxkKyg/OltlRV1bK1xcLV0/XFxkKik/TFxcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjB9LHtjTjoibnVtYmVyIixiOiJcXGJcXGQrXFwuKD8hXFxkKSg/OmlcXGIpPyIsZTpobGpzLklNTUVESUFURV9SRSxyOjF9LHtjTjoibnVtYmVyIixiOiJcXGJcXGQrKD86XFwuXFxkKik/KD86W2VFXVsrXFwtXT9cXGQqKT9pP1xcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjB9LHtjTjoibnVtYmVyIixiOiJcXC5cXGQrKD86W2VFXVsrXFwtXT9cXGQqKT9pP1xcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjF9LHtjTjoia2V5d29yZCIsYjoiKD86dHJ5Q2F0Y2h8bGlicmFyeXxzZXRHZW5lcmljfHNldEdyb3VwR2VuZXJpYylcXGIiLGU6aGxqcy5JTU1FRElBVEVfUkUscjoxMH0se2NOOiJrZXl3b3JkIixiOiJcXC5cXC5cXC4iLGU6aGxqcy5JTU1FRElBVEVfUkUscjoxMH0se2NOOiJrZXl3b3JkIixiOiJcXC5cXC5cXGQrKD8hW1xcdy5dKSIsZTpobGpzLklNTUVESUFURV9SRSxyOjEwfSx7Y046ImtleXdvcmQiLGI6IlxcYig/OmZ1bmN0aW9uKSIsZTpobGpzLklNTUVESUFURV9SRSxyOjJ9LHtjTjoia2V5d29yZCIsYjoiKD86aWZ8aW58YnJlYWt8bmV4dHxyZXBlYXR8ZWxzZXxmb3J8cmV0dXJufHN3aXRjaHx3aGlsZXx0cnl8c3RvcHx3YXJuaW5nfHJlcXVpcmV8YXR0YWNofGRldGFjaHxzb3VyY2V8c2V0TWV0aG9kfHNldENsYXNzKVxcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjF9LHtjTjoibGl0ZXJhbCIsYjoiKD86TkF8TkFfaW50ZWdlcl98TkFfcmVhbF98TkFfY2hhcmFjdGVyX3xOQV9jb21wbGV4XylcXGIiLGU6aGxqcy5JTU1FRElBVEVfUkUscjoxMH0se2NOOiJsaXRlcmFsIixiOiIoPzpOVUxMfFRSVUV8RkFMU0V8VHxGfEluZnxOYU4pXFxiIixlOmhsanMuSU1NRURJQVRFX1JFLHI6MX0se2NOOiJpZGVudGlmaWVyIixiOiJbYS16QS1aLl1bYS16QS1aMC05Ll9dKlxcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjB9LHtjTjoib3BlcmF0b3IiLGI6IjxcXC0oPyFcXHMqXFxkKSIsZTpobGpzLklNTUVESUFURV9SRSxyOjJ9LHtjTjoib3BlcmF0b3IiLGI6IlxcLT58PFxcLSIsZTpobGpzLklNTUVESUFURV9SRSxyOjF9LHtjTjoib3BlcmF0b3IiLGI6IiUlfH4iLGU6aGxqcy5JTU1FRElBVEVfUkV9LHtjTjoib3BlcmF0b3IiLGI6Ij49fDw9fD09fCE9fFxcfFxcfHwmJnw9fFxcK3xcXC18XFwqfC98XFxefD58PHwhfCZ8XFx8fFxcJHw6IixlOmhsanMuSU1NRURJQVRFX1JFLHI6MH0se2NOOiJvcGVyYXRvciIsYjoiJSIsZToiJSIsaToiXFxuIixyOjF9LHtjTjoiaWRlbnRpZmllciIsYjoiYCIsZToiYCIscjowfSx7Y046InN0cmluZyIsYjonIicsZTonIicsYzpbaGxqcy5CRV0scjowfSx7Y046InN0cmluZyIsYjoiJyIsZToiJyIsYzpbaGxqcy5CRV0scjowfSx7Y046InBhcmVuIixiOiJbWyh7XFxdKX1dIixlOmhsanMuSU1NRURJQVRFX1JFLHI6MH1dfX07aGxqcy5MQU5HVUFHRVMucnVieT1mdW5jdGlvbigpe3ZhciBhPSJbYS16QS1aX11bYS16QS1aMC05X10qKFxcIXxcXD8pPyI7dmFyIGo9IlthLXpBLVpfXVxcdypbIT89XT98Wy0rfl1cXEB8PDx8Pj58PX58PT09P3w8PT58Wzw+XT0/fFxcKlxcKnxbLS8rJV4mKn5gfF18XFxbXFxdPT8iO3ZhciBmPXtrZXl3b3JkOnthbmQ6MSwiZmFsc2UiOjEsdGhlbjoxLGRlZmluZWQ6MSxtb2R1bGU6MSwiaW4iOjEsInJldHVybiI6MSxyZWRvOjEsImlmIjoxLEJFR0lOOjEscmV0cnk6MSxlbmQ6MSwiZm9yIjoxLCJ0cnVlIjoxLHNlbGY6MSx3aGVuOjEsbmV4dDoxLHVudGlsOjEsImRvIjoxLGJlZ2luOjEsdW5sZXNzOjEsRU5EOjEscmVzY3VlOjEsbmlsOjEsImVsc2UiOjEsImJyZWFrIjoxLHVuZGVmOjEsbm90OjEsInN1cGVyIjoxLCJjbGFzcyI6MSwiY2FzZSI6MSxyZXF1aXJlOjEseWllbGQ6MSxhbGlhczoxLCJ3aGlsZSI6MSxlbnN1cmU6MSxlbHNpZjoxLG9yOjEsZGVmOjF9LGtleW1ldGhvZHM6e19faWRfXzoxLF9fc2VuZF9fOjEsYWJvcnQ6MSxhYnM6MSwiYWxsPyI6MSxhbGxvY2F0ZToxLGFuY2VzdG9yczoxLCJhbnk/IjoxLGFyaXR5OjEsYXNzb2M6MSxhdDoxLGF0X2V4aXQ6MSxhdXRvbG9hZDoxLCJhdXRvbG9hZD8iOjEsImJldHdlZW4/IjoxLGJpbmRpbmc6MSxiaW5tb2RlOjEsImJsb2NrX2dpdmVuPyI6MSxjYWxsOjEsY2FsbGNjOjEsY2FsbGVyOjEsY2FwaXRhbGl6ZToxLCJjYXBpdGFsaXplISI6MSxjYXNlY21wOjEsImNhdGNoIjoxLGNlaWw6MSxjZW50ZXI6MSxjaG9tcDoxLCJjaG9tcCEiOjEsY2hvcDoxLCJjaG9wISI6MSxjaHI6MSwiY2xhc3MiOjEsY2xhc3NfZXZhbDoxLCJjbGFzc192YXJpYWJsZV9kZWZpbmVkPyI6MSxjbGFzc192YXJpYWJsZXM6MSxjbGVhcjoxLGNsb25lOjEsY2xvc2U6MSxjbG9zZV9yZWFkOjEsY2xvc2Vfd3JpdGU6MSwiY2xvc2VkPyI6MSxjb2VyY2U6MSxjb2xsZWN0OjEsImNvbGxlY3QhIjoxLGNvbXBhY3Q6MSwiY29tcGFjdCEiOjEsY29uY2F0OjEsImNvbnN0X2RlZmluZWQ/IjoxLGNvbnN0X2dldDoxLGNvbnN0X21pc3Npbmc6MSxjb25zdF9zZXQ6MSxjb25zdGFudHM6MSxjb3VudDoxLGNyeXB0OjEsImRlZmF1bHQiOjEsZGVmYXVsdF9wcm9jOjEsImRlbGV0ZSI6MSwiZGVsZXRlISI6MSxkZWxldGVfYXQ6MSxkZWxldGVfaWY6MSxkZXRlY3Q6MSxkaXNwbGF5OjEsZGl2OjEsZGl2bW9kOjEsZG93bmNhc2U6MSwiZG93bmNhc2UhIjoxLGRvd250bzoxLGR1bXA6MSxkdXA6MSxlYWNoOjEsZWFjaF9ieXRlOjEsZWFjaF9pbmRleDoxLGVhY2hfa2V5OjEsZWFjaF9saW5lOjEsZWFjaF9wYWlyOjEsZWFjaF92YWx1ZToxLGVhY2hfd2l0aF9pbmRleDoxLCJlbXB0eT8iOjEsZW50cmllczoxLGVvZjoxLCJlb2Y/IjoxLCJlcWw/IjoxLCJlcXVhbD8iOjEsImV2YWwiOjEsZXhlYzoxLGV4aXQ6MSwiZXhpdCEiOjEsZXh0ZW5kOjEsZmFpbDoxLGZjbnRsOjEsZmV0Y2g6MSxmaWxlbm86MSxmaWxsOjEsZmluZDoxLGZpbmRfYWxsOjEsZmlyc3Q6MSxmbGF0dGVuOjEsImZsYXR0ZW4hIjoxLGZsb29yOjEsZmx1c2g6MSxmb3JfZmQ6MSxmb3JlYWNoOjEsZm9yazoxLGZvcm1hdDoxLGZyZWV6ZToxLCJmcm96ZW4/IjoxLGZzeW5jOjEsZ2V0YzoxLGdldHM6MSxnbG9iYWxfdmFyaWFibGVzOjEsZ3JlcDoxLGdzdWI6MSwiZ3N1YiEiOjEsImhhc19rZXk/IjoxLCJoYXNfdmFsdWU/IjoxLGhhc2g6MSxoZXg6MSxpZDoxLGluY2x1ZGU6MSwiaW5jbHVkZT8iOjEsaW5jbHVkZWRfbW9kdWxlczoxLGluZGV4OjEsaW5kZXhlczoxLGluZGljZXM6MSxpbmR1Y2VkX2Zyb206MSxpbmplY3Q6MSxpbnNlcnQ6MSxpbnNwZWN0OjEsaW5zdGFuY2VfZXZhbDoxLGluc3RhbmNlX21ldGhvZDoxLGluc3RhbmNlX21ldGhvZHM6MSwiaW5zdGFuY2Vfb2Y/IjoxLCJpbnN0YW5jZV92YXJpYWJsZV9kZWZpbmVkPyI6MSxpbnN0YW5jZV92YXJpYWJsZV9nZXQ6MSxpbnN0YW5jZV92YXJpYWJsZV9zZXQ6MSxpbnN0YW5jZV92YXJpYWJsZXM6MSwiaW50ZWdlcj8iOjEsaW50ZXJuOjEsaW52ZXJ0OjEsaW9jdGw6MSwiaXNfYT8iOjEsaXNhdHR5OjEsIml0ZXJhdG9yPyI6MSxqb2luOjEsImtleT8iOjEsa2V5czoxLCJraW5kX29mPyI6MSxsYW1iZGE6MSxsYXN0OjEsbGVuZ3RoOjEsbGluZW5vOjEsbGp1c3Q6MSxsb2FkOjEsbG9jYWxfdmFyaWFibGVzOjEsbG9vcDoxLGxzdHJpcDoxLCJsc3RyaXAhIjoxLG1hcDoxLCJtYXAhIjoxLG1hdGNoOjEsbWF4OjEsIm1lbWJlcj8iOjEsbWVyZ2U6MSwibWVyZ2UhIjoxLG1ldGhvZDoxLCJtZXRob2RfZGVmaW5lZD8iOjEsbWV0aG9kX21pc3Npbmc6MSxtZXRob2RzOjEsbWluOjEsbW9kdWxlX2V2YWw6MSxtb2R1bG86MSxuYW1lOjEsbmVzdGluZzoxLCJuZXciOjEsbmV4dDoxLCJuZXh0ISI6MSwibmlsPyI6MSxuaXRlbXM6MSwibm9uemVybz8iOjEsb2JqZWN0X2lkOjEsb2N0OjEsb3BlbjoxLHBhY2s6MSxwYXJ0aXRpb246MSxwaWQ6MSxwaXBlOjEscG9wOjEscG9wZW46MSxwb3M6MSxwcmVjOjEscHJlY19mOjEscHJlY19pOjEscHJpbnQ6MSxwcmludGY6MSxwcml2YXRlX2NsYXNzX21ldGhvZDoxLHByaXZhdGVfaW5zdGFuY2VfbWV0aG9kczoxLCJwcml2YXRlX21ldGhvZF9kZWZpbmVkPyI6MSxwcml2YXRlX21ldGhvZHM6MSxwcm9jOjEscHJvdGVjdGVkX2luc3RhbmNlX21ldGhvZHM6MSwicHJvdGVjdGVkX21ldGhvZF9kZWZpbmVkPyI6MSxwcm90ZWN0ZWRfbWV0aG9kczoxLHB1YmxpY19jbGFzc19tZXRob2Q6MSxwdWJsaWNfaW5zdGFuY2VfbWV0aG9kczoxLCJwdWJsaWNfbWV0aG9kX2RlZmluZWQ/IjoxLHB1YmxpY19tZXRob2RzOjEscHVzaDoxLHB1dGM6MSxwdXRzOjEscXVvOjEscmFpc2U6MSxyYW5kOjEscmFzc29jOjEscmVhZDoxLHJlYWRfbm9uYmxvY2s6MSxyZWFkY2hhcjoxLHJlYWRsaW5lOjEscmVhZGxpbmVzOjEscmVhZHBhcnRpYWw6MSxyZWhhc2g6MSxyZWplY3Q6MSwicmVqZWN0ISI6MSxyZW1haW5kZXI6MSxyZW9wZW46MSxyZXBsYWNlOjEscmVxdWlyZToxLCJyZXNwb25kX3RvPyI6MSxyZXZlcnNlOjEsInJldmVyc2UhIjoxLHJldmVyc2VfZWFjaDoxLHJld2luZDoxLHJpbmRleDoxLHJqdXN0OjEscm91bmQ6MSxyc3RyaXA6MSwicnN0cmlwISI6MSxzY2FuOjEsc2VlazoxLHNlbGVjdDoxLHNlbmQ6MSxzZXRfdHJhY2VfZnVuYzoxLHNoaWZ0OjEsc2luZ2xldG9uX21ldGhvZF9hZGRlZDoxLHNpbmdsZXRvbl9tZXRob2RzOjEsc2l6ZToxLHNsZWVwOjEsc2xpY2U6MSwic2xpY2UhIjoxLHNvcnQ6MSwic29ydCEiOjEsc29ydF9ieToxLHNwbGl0OjEsc3ByaW50ZjoxLHNxdWVlemU6MSwic3F1ZWV6ZSEiOjEsc3JhbmQ6MSxzdGF0OjEsc3RlcDoxLHN0b3JlOjEsc3RyaXA6MSwic3RyaXAhIjoxLHN1YjoxLCJzdWIhIjoxLHN1Y2M6MSwic3VjYyEiOjEsc3VtOjEsc3VwZXJjbGFzczoxLHN3YXBjYXNlOjEsInN3YXBjYXNlISI6MSxzeW5jOjEsc3lzY2FsbDoxLHN5c29wZW46MSxzeXNyZWFkOjEsc3lzc2VlazoxLHN5c3RlbToxLHN5c3dyaXRlOjEsdGFpbnQ6MSwidGFpbnRlZD8iOjEsdGVsbDoxLHRlc3Q6MSwidGhyb3ciOjEsdGltZXM6MSx0b19hOjEsdG9fYXJ5OjEsdG9fZjoxLHRvX2hhc2g6MSx0b19pOjEsdG9faW50OjEsdG9faW86MSx0b19wcm9jOjEsdG9fczoxLHRvX3N0cjoxLHRvX3N5bToxLHRyOjEsInRyISI6MSx0cl9zOjEsInRyX3MhIjoxLHRyYWNlX3ZhcjoxLHRyYW5zcG9zZToxLHRyYXA6MSx0cnVuY2F0ZToxLCJ0dHk/IjoxLHR5cGU6MSx1bmdldGM6MSx1bmlxOjEsInVuaXEhIjoxLHVucGFjazoxLHVuc2hpZnQ6MSx1bnRhaW50OjEsdW50cmFjZV92YXI6MSx1cGNhc2U6MSwidXBjYXNlISI6MSx1cGRhdGU6MSx1cHRvOjEsInZhbHVlPyI6MSx2YWx1ZXM6MSx2YWx1ZXNfYXQ6MSx3YXJuOjEsd3JpdGU6MSx3cml0ZV9ub25ibG9jazoxLCJ6ZXJvPyI6MSx6aXA6MX19O3ZhciBjPXtjTjoieWFyZG9jdGFnIixiOiJAW0EtWmEtel0rIn07dmFyIGs9W3tjTjoiY29tbWVudCIsYjoiIyIsZToiJCIsYzpbY119LHtjTjoiY29tbWVudCIsYjoiXlxcPWJlZ2luIixlOiJeXFw9ZW5kIixjOltjXSxyOjEwfSx7Y046ImNvbW1lbnQiLGI6Il5fX0VORF9fIixlOiJcXG4kIn1dO3ZhciBkPXtjTjoic3Vic3QiLGI6IiNcXHsiLGU6In0iLGw6YSxrOmZ9O3ZhciBpPVtobGpzLkJFLGRdO3ZhciBiPVt7Y046InN0cmluZyIsYjoiJyIsZToiJyIsYzppLHI6MH0se2NOOiJzdHJpbmciLGI6JyInLGU6JyInLGM6aSxyOjB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT9cXCgiLGU6IlxcKSIsYzppLHI6MTB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT9cXFsiLGU6IlxcXSIsYzppLHI6MTB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT97IixlOiJ9IixjOmkscjoxMH0se2NOOiJzdHJpbmciLGI6IiVbcXddPzwiLGU6Ij4iLGM6aSxyOjEwfSx7Y046InN0cmluZyIsYjoiJVtxd10/LyIsZToiLyIsYzppLHI6MTB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT8lIixlOiIlIixjOmkscjoxMH0se2NOOiJzdHJpbmciLGI6IiVbcXddPy0iLGU6Ii0iLGM6aSxyOjEwfSx7Y046InN0cmluZyIsYjoiJVtxd10/XFx8IixlOiJcXHwiLGM6aSxyOjEwfV07dmFyIGg9e2NOOiJmdW5jdGlvbiIsYjoiXFxiZGVmXFxzKyIsZToiIHwkfDsiLGw6YSxrOmYsYzpbe2NOOiJ0aXRsZSIsYjpqLGw6YSxrOmZ9LHtjTjoicGFyYW1zIixiOiJcXCgiLGU6IlxcKSIsbDphLGs6Zn1dLmNvbmNhdChrKX07dmFyIGc9e2NOOiJpZGVudGlmaWVyIixiOmEsbDphLGs6ZixyOjB9O3ZhciBlPWsuY29uY2F0KGIuY29uY2F0KFt7Y046ImNsYXNzIixiOiJcXGIoY2xhc3N8bW9kdWxlKVxcYiIsZToiJHw7IixrOnsiY2xhc3MiOjEsbW9kdWxlOjF9LGM6W3tjTjoidGl0bGUiLGI6IltBLVphLXpfXVxcdyooOjpcXHcrKSooXFw/fFxcISk/IixyOjB9LHtjTjoiaW5oZXJpdGFuY2UiLGI6IjxcXHMqIixjOlt7Y046InBhcmVudCIsYjoiKCIraGxqcy5JUisiOjopPyIraGxqcy5JUn1dfV0uY29uY2F0KGspfSxoLHtjTjoiY29uc3RhbnQiLGI6Iig6Oik/KFtBLVpdXFx3Kig6Oik/KSsiLHI6MH0se2NOOiJzeW1ib2wiLGI6IjoiLGM6Yi5jb25jYXQoW2ddKSxyOjB9LHtjTjoibnVtYmVyIixiOiIoXFxiMFswLTdfXSspfChcXGIweFswLTlhLWZBLUZfXSspfChcXGJbMS05XVswLTlfXSooXFwuWzAtOV9dKyk/KXxbMF9dXFxiIixyOjB9LHtjTjoibnVtYmVyIixiOiJcXD9cXHcifSx7Y046InZhcmlhYmxlIixiOiIoXFwkXFxXKXwoKFxcJHxcXEBcXEA/KShcXHcrKSkifSxnLHtiOiIoIitobGpzLlJTUisiKVxccyoiLGM6ay5jb25jYXQoW3tjTjoicmVnZXhwIixiOiIvIixlOiIvW2Etel0qIixpOiJcXG4iLGM6W2hsanMuQkVdfV0pLHI6MH1dKSk7ZC5jPWU7aC5jWzFdLmM9ZTtyZXR1cm57ZE06e2w6YSxrOmYsYzplfX19KCk7aGxqcy5MQU5HVUFHRVMuc2NhbGE9ZnVuY3Rpb24oKXt2YXIgYj17Y046ImFubm90YXRpb24iLGI6IkBbQS1aYS16XSsifTt2YXIgYT17Y046InN0cmluZyIsYjondT9yPyIiIicsZTonIiIiJyxyOjEwfTtyZXR1cm57ZE06e2s6e3R5cGU6MSx5aWVsZDoxLGxhenk6MSxvdmVycmlkZToxLGRlZjoxLCJ3aXRoIjoxLHZhbDoxLCJ2YXIiOjEsImZhbHNlIjoxLCJ0cnVlIjoxLHNlYWxlZDoxLCJhYnN0cmFjdCI6MSwicHJpdmF0ZSI6MSx0cmFpdDoxLG9iamVjdDoxLCJudWxsIjoxLCJpZiI6MSwiZm9yIjoxLCJ3aGlsZSI6MSwidGhyb3ciOjEsImZpbmFsbHkiOjEsInByb3RlY3RlZCI6MSwiZXh0ZW5kcyI6MSwiaW1wb3J0IjoxLCJmaW5hbCI6MSwicmV0dXJuIjoxLCJlbHNlIjoxLCJicmVhayI6MSwibmV3IjoxLCJjYXRjaCI6MSwic3VwZXIiOjEsImNsYXNzIjoxLCJjYXNlIjoxLCJwYWNrYWdlIjoxLCJkZWZhdWx0IjoxLCJ0cnkiOjEsInRoaXMiOjEsbWF0Y2g6MSwiY29udGludWUiOjEsInRocm93cyI6MX0sYzpbe2NOOiJqYXZhZG9jIixiOiIvXFwqXFwqIixlOiJcXCovIixjOlt7Y046ImphdmFkb2N0YWciLGI6IkBbQS1aYS16XSsifV0scjoxMH0saGxqcy5DTENNLGhsanMuQ0JMQ0xNLGhsanMuQVNNLGhsanMuUVNNLGEse2NOOiJjbGFzcyIsYjoiKChjYXNlICk/Y2xhc3MgfG9iamVjdCB8dHJhaXQgKSIsZToiKHt8JCkiLGk6IjoiLGs6eyJjYXNlIjoxLCJjbGFzcyI6MSx0cmFpdDoxLG9iamVjdDoxfSxjOlt7YldLOnRydWUsazp7ImV4dGVuZHMiOjEsIndpdGgiOjF9LHI6MTB9LHtjTjoidGl0bGUiLGI6aGxqcy5VSVJ9LHtjTjoicGFyYW1zIixiOiJcXCgiLGU6IlxcKSIsYzpbaGxqcy5BU00saGxqcy5RU00sYSxiXX1dfSxobGpzLkNOTSxiXX19fSgpO2hsanMuTEFOR1VBR0VTLnNxbD17Y0k6dHJ1ZSxkTTp7aToiW15cXHNdIixjOlt7Y046Im9wZXJhdG9yIixiOiIoYmVnaW58c3RhcnR8Y29tbWl0fHJvbGxiYWNrfHNhdmVwb2ludHxsb2NrfGFsdGVyfGNyZWF0ZXxkcm9wfHJlbmFtZXxjYWxsfGRlbGV0ZXxkb3xoYW5kbGVyfGluc2VydHxsb2FkfHJlcGxhY2V8c2VsZWN0fHRydW5jYXRlfHVwZGF0ZXxzZXR8c2hvd3xwcmFnbWF8Z3JhbnQpXFxiIixlOiI7fCIraGxqcy5FUixrOntrZXl3b3JkOnthbGw6MSxwYXJ0aWFsOjEsZ2xvYmFsOjEsbW9udGg6MSxjdXJyZW50X3RpbWVzdGFtcDoxLHVzaW5nOjEsZ286MSxyZXZva2U6MSxzbWFsbGludDoxLGluZGljYXRvcjoxLCJlbmQtZXhlYyI6MSxkaXNjb25uZWN0OjEsem9uZToxLCJ3aXRoIjoxLGNoYXJhY3RlcjoxLGFzc2VydGlvbjoxLHRvOjEsYWRkOjEsY3VycmVudF91c2VyOjEsdXNhZ2U6MSxpbnB1dDoxLGxvY2FsOjEsYWx0ZXI6MSxtYXRjaDoxLGNvbGxhdGU6MSxyZWFsOjEsdGhlbjoxLHJvbGxiYWNrOjEsZ2V0OjEscmVhZDoxLHRpbWVzdGFtcDoxLHNlc3Npb25fdXNlcjoxLG5vdDoxLGludGVnZXI6MSxiaXQ6MSx1bmlxdWU6MSxkYXk6MSxtaW51dGU6MSxkZXNjOjEsaW5zZXJ0OjEsZXhlY3V0ZToxLGxpa2U6MSxpbGlrZToyLGxldmVsOjEsZGVjaW1hbDoxLGRyb3A6MSwiY29udGludWUiOjEsaXNvbGF0aW9uOjEsZm91bmQ6MSx3aGVyZToxLGNvbnN0cmFpbnRzOjEsZG9tYWluOjEscmlnaHQ6MSxuYXRpb25hbDoxLHNvbWU6MSxtb2R1bGU6MSx0cmFuc2FjdGlvbjoxLHJlbGF0aXZlOjEsc2Vjb25kOjEsY29ubmVjdDoxLGVzY2FwZToxLGNsb3NlOjEsc3lzdGVtX3VzZXI6MSwiZm9yIjoxLGRlZmVycmVkOjEsc2VjdGlvbjoxLGNhc3Q6MSxjdXJyZW50OjEsc3Fsc3RhdGU6MSxhbGxvY2F0ZToxLGludGVyc2VjdDoxLGRlYWxsb2NhdGU6MSxudW1lcmljOjEsInB1YmxpYyI6MSxwcmVzZXJ2ZToxLGZ1bGw6MSwiZ290byI6MSxpbml0aWFsbHk6MSxhc2M6MSxubzoxLGtleToxLG91dHB1dDoxLGNvbGxhdGlvbjoxLGdyb3VwOjEsYnk6MSx1bmlvbjoxLHNlc3Npb246MSxib3RoOjEsbGFzdDoxLGxhbmd1YWdlOjEsY29uc3RyYWludDoxLGNvbHVtbjoxLG9mOjEsc3BhY2U6MSxmb3JlaWduOjEsZGVmZXJyYWJsZToxLHByaW9yOjEsY29ubmVjdGlvbjoxLHVua25vd246MSxhY3Rpb246MSxjb21taXQ6MSx2aWV3OjEsb3I6MSxmaXJzdDoxLGludG86MSwiZmxvYXQiOjEseWVhcjoxLHByaW1hcnk6MSxjYXNjYWRlZDoxLGV4Y2VwdDoxLHJlc3RyaWN0OjEsc2V0OjEscmVmZXJlbmNlczoxLG5hbWVzOjEsdGFibGU6MSxvdXRlcjoxLG9wZW46MSxzZWxlY3Q6MSxzaXplOjEsYXJlOjEscm93czoxLGZyb206MSxwcmVwYXJlOjEsZGlzdGluY3Q6MSxsZWFkaW5nOjEsY3JlYXRlOjEsb25seToxLG5leHQ6MSxpbm5lcjoxLGF1dGhvcml6YXRpb246MSxzY2hlbWE6MSxjb3JyZXNwb25kaW5nOjEsb3B0aW9uOjEsZGVjbGFyZToxLHByZWNpc2lvbjoxLGltbWVkaWF0ZToxLCJlbHNlIjoxLHRpbWV6b25lX21pbnV0ZToxLGV4dGVybmFsOjEsdmFyeWluZzoxLHRyYW5zbGF0aW9uOjEsInRydWUiOjEsImNhc2UiOjEsZXhjZXB0aW9uOjEsam9pbjoxLGhvdXI6MSwiZGVmYXVsdCI6MSwiZG91YmxlIjoxLHNjcm9sbDoxLHZhbHVlOjEsY3Vyc29yOjEsZGVzY3JpcHRvcjoxLHZhbHVlczoxLGRlYzoxLGZldGNoOjEscHJvY2VkdXJlOjEsImRlbGV0ZSI6MSxhbmQ6MSwiZmFsc2UiOjEsImludCI6MSxpczoxLGRlc2NyaWJlOjEsImNoYXIiOjEsYXM6MSxhdDoxLCJpbiI6MSx2YXJjaGFyOjEsIm51bGwiOjEsdHJhaWxpbmc6MSxhbnk6MSxhYnNvbHV0ZToxLGN1cnJlbnRfdGltZToxLGVuZDoxLGdyYW50OjEscHJpdmlsZWdlczoxLHdoZW46MSxjcm9zczoxLGNoZWNrOjEsd3JpdGU6MSxjdXJyZW50X2RhdGU6MSxwYWQ6MSxiZWdpbjoxLHRlbXBvcmFyeToxLGV4ZWM6MSx0aW1lOjEsdXBkYXRlOjEsY2F0YWxvZzoxLHVzZXI6MSxzcWw6MSxkYXRlOjEsb246MSxpZGVudGl0eToxLHRpbWV6b25lX2hvdXI6MSxuYXR1cmFsOjEsd2hlbmV2ZXI6MSxpbnRlcnZhbDoxLHdvcms6MSxvcmRlcjoxLGNhc2NhZGU6MSxkaWFnbm9zdGljczoxLG5jaGFyOjEsaGF2aW5nOjEsbGVmdDoxLGNhbGw6MSwiZG8iOjEsaGFuZGxlcjoxLGxvYWQ6MSxyZXBsYWNlOjEsdHJ1bmNhdGU6MSxzdGFydDoxLGxvY2s6MSxzaG93OjEscHJhZ21hOjF9LGFnZ3JlZ2F0ZTp7Y291bnQ6MSxzdW06MSxtaW46MSxtYXg6MSxhdmc6MX19LGM6W3tjTjoic3RyaW5nIixiOiInIixlOiInIixjOltobGpzLkJFLHtiOiInJyJ9XSxyOjB9LHtjTjoic3RyaW5nIixiOiciJyxlOiciJyxjOltobGpzLkJFLHtiOiciIid9XSxyOjB9LHtjTjoic3RyaW5nIixiOiJgIixlOiJgIixjOltobGpzLkJFXX0saGxqcy5DTk1dfSxobGpzLkNCTENMTSx7Y046ImNvbW1lbnQiLGI6Ii0tIixlOiIkIn1dfX07aGxqcy5MQU5HVUFHRVMuc3Rhbj17ZE06e2M6W2hsanMuSENNLGhsanMuQ0xDTSxobGpzLlFTTSxobGpzLkNOTSx7Y046Im9wZXJhdG9yIixiOiIoPzo8LXx+fFxcfFxcfHwmJnw9PXwhPXw8PT98Pj0/fFxcK3wtfFxcLj8vfFxcXFx8XFxefFxcXnwhfCd8JXw6fCx8O3w9KVxcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjEwfSx7Y046InBhcmVuIixiOiJbWyh7XFxdKX1dIixlOmhsanMuSU1NRURJQVRFX1JFLHI6MH0se2NOOiJmdW5jdGlvbiIsYjoiKD86UGhpfFBoaV9hcHByb3h8YWJzfGFjb3N8YWNvc2h8YXBwZW5kX2NvbHxhcHBlbmRfcm93fGFzaW58YXNpbmh8YXRhbnxhdGFuMnxhdGFuaHxiZXJub3VsbGlfY2NkZl9sb2d8YmVybm91bGxpX2NkZnxiZXJub3VsbGlfY2RmX2xvZ3xiZXJub3VsbGlfbG9nfGJlcm5vdWxsaV9sb2dpdF9sb2d8YmVybm91bGxpX3JuZ3xiZXNzZWxfZmlyc3Rfa2luZHxiZXNzZWxfc2Vjb25kX2tpbmR8YmV0YV9iaW5vbWlhbF9jY2RmX2xvZ3xiZXRhX2Jpbm9taWFsX2NkZnxiZXRhX2Jpbm9taWFsX2NkZl9sb2d8YmV0YV9iaW5vbWlhbF9sb2d8YmV0YV9iaW5vbWlhbF9ybmd8YmV0YV9jY2RmX2xvZ3xiZXRhX2NkZnxiZXRhX2NkZl9sb2d8YmV0YV9sb2d8YmV0YV9ybmd8YmluYXJ5X2xvZ19sb3NzfGJpbm9taWFsX2NjZGZfbG9nfGJpbm9taWFsX2NkZnxiaW5vbWlhbF9jZGZfbG9nfGJpbm9taWFsX2NvZWZmaWNpZW50X2xvZ3xiaW5vbWlhbF9sb2d8Ymlub21pYWxfbG9naXRfbG9nfGJpbm9taWFsX3JuZ3xibG9ja3xjYXRlZ29yaWNhbF9sb2d8Y2F0ZWdvcmljYWxfbG9naXRfbG9nfGNhdGVnb3JpY2FsX3JuZ3xjYXVjaHlfY2NkZl9sb2d8Y2F1Y2h5X2NkZnxjYXVjaHlfY2RmX2xvZ3xjYXVjaHlfbG9nfGNhdWNoeV9ybmd8Y2JydHxjZWlsfGNoaV9zcXVhcmVfY2NkZl9sb2d8Y2hpX3NxdWFyZV9jZGZ8Y2hpX3NxdWFyZV9jZGZfbG9nfGNoaV9zcXVhcmVfbG9nfGNoaV9zcXVhcmVfcm5nfGNob2xlc2t5X2RlY29tcG9zZXxjb2x8Y29sc3xjb2x1bW5zX2RvdF9wcm9kdWN0fGNvbHVtbnNfZG90X3NlbGZ8Y29zfGNvc2h8Y3Jvc3Nwcm9kfGNzcl9leHRyYWN0X3V8Y3NyX2V4dHJhY3Rfdnxjc3JfZXh0cmFjdF93fGNzcl9tYXRyaXhfdGltZXNfdmVjdG9yfGNzcl90b19kZW5zZV9tYXRyaXh8Y3VtdWxhdGl2ZV9zdW18ZGV0ZXJtaW5hbnR8ZGlhZ19tYXRyaXh8ZGlhZ19wb3N0X211bHRpcGx5fGRpYWdfcHJlX211bHRpcGx5fGRpYWdvbmFsfGRpZ2FtbWF8ZGltc3xkaXJpY2hsZXRfbG9nfGRpcmljaGxldF9ybmd8ZGlzdGFuY2V8ZG90X3Byb2R1Y3R8ZG90X3NlbGZ8ZG91YmxlX2V4cG9uZW50aWFsX2NjZGZfbG9nfGRvdWJsZV9leHBvbmVudGlhbF9jZGZ8ZG91YmxlX2V4cG9uZW50aWFsX2NkZl9sb2d8ZG91YmxlX2V4cG9uZW50aWFsX2xvZ3xkb3VibGVfZXhwb25lbnRpYWxfcm5nfGV8ZWlnZW52YWx1ZXNfc3ltfGVpZ2VudmVjdG9yc19zeW18ZXJmfGVyZmN8ZXhwfGV4cDJ8ZXhwX21vZF9ub3JtYWxfY2NkZl9sb2d8ZXhwX21vZF9ub3JtYWxfY2RmfGV4cF9tb2Rfbm9ybWFsX2NkZl9sb2d8ZXhwX21vZF9ub3JtYWxfbG9nfGV4cF9tb2Rfbm9ybWFsX3JuZ3xleHBtMXxleHBvbmVudGlhbF9jY2RmX2xvZ3xleHBvbmVudGlhbF9jZGZ8ZXhwb25lbnRpYWxfY2RmX2xvZ3xleHBvbmVudGlhbF9sb2d8ZXhwb25lbnRpYWxfcm5nfGZhYnN8ZmFsbGluZ19mYWN0b3JpYWx8ZmRpbXxmbG9vcnxmbWF8Zm1heHxmbWlufGZtb2R8ZnJlY2hldF9jY2RmX2xvZ3xmcmVjaGV0X2NkZnxmcmVjaGV0X2NkZl9sb2d8ZnJlY2hldF9sb2d8ZnJlY2hldF9ybmd8Z2FtbWFfY2NkZl9sb2d8Z2FtbWFfY2RmfGdhbW1hX2NkZl9sb2d8Z2FtbWFfbG9nfGdhbW1hX3B8Z2FtbWFfcXxnYW1tYV9ybmd8Z2F1c3NpYW5fZGxtX29ic19sb2d8Z2V0X2xwfGd1bWJlbF9jY2RmX2xvZ3xndW1iZWxfY2RmfGd1bWJlbF9jZGZfbG9nfGd1bWJlbF9sb2d8Z3VtYmVsX3JuZ3xoZWFkfGh5cGVyZ2VvbWV0cmljX2xvZ3xoeXBlcmdlb21ldHJpY19ybmd8aHlwb3R8aWZfZWxzZXxpbnRfc3RlcHxpbnZ8aW52X2NoaV9zcXVhcmVfY2NkZl9sb2d8aW52X2NoaV9zcXVhcmVfY2RmfGludl9jaGlfc3F1YXJlX2NkZl9sb2d8aW52X2NoaV9zcXVhcmVfbG9nfGludl9jaGlfc3F1YXJlX3JuZ3xpbnZfY2xvZ2xvZ3xpbnZfZ2FtbWFfY2NkZl9sb2d8aW52X2dhbW1hX2NkZnxpbnZfZ2FtbWFfY2RmX2xvZ3xpbnZfZ2FtbWFfbG9nfGludl9nYW1tYV9ybmd8aW52X2xvZ2l0fGludl9waGl8aW52X3NxcnR8aW52X3NxdWFyZXxpbnZfd2lzaGFydF9sb2d8aW52X3dpc2hhcnRfcm5nfGludmVyc2V8aW52ZXJzZV9zcGR8aXNfaW5mfGlzX25hbnxsYmV0YXxsZ2FtbWF8bGtqX2NvcnJfY2hvbGVza3lfbG9nfGxral9jb3JyX2Nob2xlc2t5X3JuZ3xsa2pfY29ycl9sb2d8bGtqX2NvcnJfcm5nfGxtZ2FtbWF8bG9nfGxvZzEwfGxvZzFtfGxvZzFtX2V4cHxsb2cxbV9pbnZfbG9naXR8bG9nMXB8bG9nMXBfZXhwfGxvZzJ8bG9nX2RldGVybWluYW50fGxvZ19kaWZmX2V4cHxsb2dfZmFsbGluZ19mYWN0b3JpYWx8bG9nX2ludl9sb2dpdHxsb2dfbWl4fGxvZ19yaXNpbmdfZmFjdG9yaWFsfGxvZ19zb2Z0bWF4fGxvZ19zdW1fZXhwfGxvZ2lzdGljX2NjZGZfbG9nfGxvZ2lzdGljX2NkZnxsb2dpc3RpY19jZGZfbG9nfGxvZ2lzdGljX2xvZ3xsb2dpc3RpY19ybmd8bG9naXR8bG9nbm9ybWFsX2NjZGZfbG9nfGxvZ25vcm1hbF9jZGZ8bG9nbm9ybWFsX2NkZl9sb2d8bG9nbm9ybWFsX2xvZ3xsb2dub3JtYWxfcm5nfG1hY2hpbmVfcHJlY2lzaW9ufG1heHxtZGl2aWRlX2xlZnRfdHJpX2xvd3xtZGl2aWRlX3JpZ2h0X3RyaV9sb3d8bWVhbnxtaW58bW9kaWZpZWRfYmVzc2VsX2ZpcnN0X2tpbmR8bW9kaWZpZWRfYmVzc2VsX3NlY29uZF9raW5kfG11bHRpX2dwX2Nob2xlc2t5X2xvZ3xtdWx0aV9ncF9sb2d8bXVsdGlfbm9ybWFsX2Nob2xlc2t5X2xvZ3xtdWx0aV9ub3JtYWxfY2hvbGVza3lfcm5nfG11bHRpX25vcm1hbF9sb2d8bXVsdGlfbm9ybWFsX3ByZWNfbG9nfG11bHRpX25vcm1hbF9ybmd8bXVsdGlfc3R1ZGVudF90X2xvZ3xtdWx0aV9zdHVkZW50X3Rfcm5nfG11bHRpbm9taWFsX2xvZ3xtdWx0aW5vbWlhbF9ybmd8bXVsdGlwbHlfbG9nfG11bHRpcGx5X2xvd2VyX3RyaV9zZWxmX3RyYW5zcG9zZXxuZWdfYmlub21pYWxfMl9jY2RmX2xvZ3xuZWdfYmlub21pYWxfMl9jZGZ8bmVnX2Jpbm9taWFsXzJfY2RmX2xvZ3xuZWdfYmlub21pYWxfMl9sb2d8bmVnX2Jpbm9taWFsXzJfbG9nX2xvZ3xuZWdfYmlub21pYWxfMl9sb2dfcm5nfG5lZ19iaW5vbWlhbF8yX3JuZ3xuZWdfYmlub21pYWxfY2NkZl9sb2d8bmVnX2Jpbm9taWFsX2NkZnxuZWdfYmlub21pYWxfY2RmX2xvZ3xuZWdfYmlub21pYWxfbG9nfG5lZ19iaW5vbWlhbF9ybmd8bmVnYXRpdmVfaW5maW5pdHl8bm9ybWFsX2NjZGZfbG9nfG5vcm1hbF9jZGZ8bm9ybWFsX2NkZl9sb2d8bm9ybWFsX2xvZ3xub3JtYWxfcm5nfG5vdF9hX251bWJlcnxudW1fZWxlbWVudHN8b3JkZXJlZF9sb2dpc3RpY19sb2d8b3JkZXJlZF9sb2dpc3RpY19ybmd8b3dlbnNfdHxwYXJldG9fY2NkZl9sb2d8cGFyZXRvX2NkZnxwYXJldG9fY2RmX2xvZ3xwYXJldG9fbG9nfHBhcmV0b19ybmd8cGFyZXRvX3R5cGVfMl9jY2RmX2xvZ3xwYXJldG9fdHlwZV8yX2NkZnxwYXJldG9fdHlwZV8yX2NkZl9sb2d8cGFyZXRvX3R5cGVfMl9sb2d8cGFyZXRvX3R5cGVfMl9ybmd8cGl8cG9pc3Nvbl9jY2RmX2xvZ3xwb2lzc29uX2NkZnxwb2lzc29uX2NkZl9sb2d8cG9pc3Nvbl9sb2d8cG9pc3Nvbl9sb2dfbG9nfHBvaXNzb25fbG9nX3JuZ3xwb2lzc29uX3JuZ3xwb3NpdGl2ZV9pbmZpbml0eXxwb3d8cHJvZHxxcl9RfHFyX1J8cXVhZF9mb3JtfHF1YWRfZm9ybV9kaWFnfHF1YWRfZm9ybV9zeW18cmFua3xyYXlsZWlnaF9jY2RmX2xvZ3xyYXlsZWlnaF9jZGZ8cmF5bGVpZ2hfY2RmX2xvZ3xyYXlsZWlnaF9sb2d8cmF5bGVpZ2hfcm5nfHJlcF9hcnJheXxyZXBfbWF0cml4fHJlcF9yb3dfdmVjdG9yfHJlcF92ZWN0b3J8cmlzaW5nX2ZhY3RvcmlhbHxyb3VuZHxyb3d8cm93c3xyb3dzX2RvdF9wcm9kdWN0fHJvd3NfZG90X3NlbGZ8c2NhbGVkX2ludl9jaGlfc3F1YXJlX2NjZGZfbG9nfHNjYWxlZF9pbnZfY2hpX3NxdWFyZV9jZGZ8c2NhbGVkX2ludl9jaGlfc3F1YXJlX2NkZl9sb2d8c2NhbGVkX2ludl9jaGlfc3F1YXJlX2xvZ3xzY2FsZWRfaW52X2NoaV9zcXVhcmVfcm5nfHNkfHNlZ21lbnR8c2lufHNpbmd1bGFyX3ZhbHVlc3xzaW5ofHNpemV8c2tld19ub3JtYWxfY2NkZl9sb2d8c2tld19ub3JtYWxfY2RmfHNrZXdfbm9ybWFsX2NkZl9sb2d8c2tld19ub3JtYWxfbG9nfHNrZXdfbm9ybWFsX3JuZ3xzb2Z0bWF4fHNvcnRfYXNjfHNvcnRfZGVzY3xzb3J0X2luZGljZXNfYXNjfHNvcnRfaW5kaWNlc19kZXNjfHNxcnR8c3FydDJ8c3F1YXJlfHNxdWFyZWRfZGlzdGFuY2V8c3RlcHxzdHVkZW50X3RfY2NkZl9sb2d8c3R1ZGVudF90X2NkZnxzdHVkZW50X3RfY2RmX2xvZ3xzdHVkZW50X3RfbG9nfHN0dWRlbnRfdF9ybmd8c3ViX2NvbHxzdWJfcm93fHN1bXx0YWlsfHRhbnx0YW5ofHRjcm9zc3Byb2R8dGdhbW1hfHRvX2FycmF5XzFkfHRvX2FycmF5XzJkfHRvX21hdHJpeHx0b19yb3dfdmVjdG9yfHRvX3ZlY3Rvcnx0cmFjZXx0cmFjZV9nZW5fcXVhZF9mb3JtfHRyYWNlX3F1YWRfZm9ybXx0cmlnYW1tYXx0cnVuY3x1bmlmb3JtX2NjZGZfbG9nfHVuaWZvcm1fY2RmfHVuaWZvcm1fY2RmX2xvZ3x1bmlmb3JtX2xvZ3x1bmlmb3JtX3JuZ3x2YXJpYW5jZXx2b25fbWlzZXNfbG9nfHZvbl9taXNlc19ybmd8d2VpYnVsbF9jY2RmX2xvZ3x3ZWlidWxsX2NkZnx3ZWlidWxsX2NkZl9sb2d8d2VpYnVsbF9sb2d8d2VpYnVsbF9ybmd8d2llbmVyX2xvZ3x3aXNoYXJ0X2xvZ3x3aXNoYXJ0X3JuZylcXGIiLGU6aGxqcy5JTU1FRElBVEVfUkUscjoxMH0se2NOOiJmdW5jdGlvbiIsYjoiKD86YmVybm91bGxpfGJlcm5vdWxsaV9sb2dpdHxiZXRhfGJldGFfYmlub21pYWx8Ymlub21pYWx8Ymlub21pYWxfbG9naXR8Y2F0ZWdvcmljYWx8Y2F0ZWdvcmljYWxfbG9naXR8Y2F1Y2h5fGNoaV9zcXVhcmV8ZGlyaWNobGV0fGRvdWJsZV9leHBvbmVudGlhbHxleHBfbW9kX25vcm1hbHxleHBvbmVudGlhbHxmcmVjaGV0fGdhbW1hfGdhdXNzaWFuX2RsbV9vYnN8Z3VtYmVsfGh5cGVyZ2VvbWV0cmljfGludl9jaGlfc3F1YXJlfGludl9nYW1tYXxpbnZfd2lzaGFydHxsa2pfY29ycnxsa2pfY29ycl9jaG9sZXNreXxsb2dpc3RpY3xsb2dub3JtYWx8bXVsdGlfZ3B8bXVsdGlfZ3BfY2hvbGVza3l8bXVsdGlfbm9ybWFsfG11bHRpX25vcm1hbF9jaG9sZXNreXxtdWx0aV9ub3JtYWxfcHJlY3xtdWx0aV9zdHVkZW50X3R8bXVsdGlub21pYWx8bmVnX2Jpbm9taWFsfG5lZ19iaW5vbWlhbF8yfG5lZ19iaW5vbWlhbF8yX2xvZ3xub3JtYWx8b3JkZXJlZF9sb2dpc3RpY3xwYXJldG98cGFyZXRvX3R5cGVfMnxwb2lzc29ufHBvaXNzb25fbG9nfHJheWxlaWdofHNjYWxlZF9pbnZfY2hpX3NxdWFyZXxza2V3X25vcm1hbHxzdHVkZW50X3R8dW5pZm9ybXx2b25fbWlzZXN8d2VpYnVsbHx3aWVuZXJ8d2lzaGFydClcXGIiLGU6aGxqcy5JTU1FRElBVEVfUkUscjoxMH0se2NOOiJrZXl3b3JkIixiOiIoPzpmb3J8aW58d2hpbGV8aWZ8dGhlbnxlbHNlfHJldHVybnxsb3dlcnx1cHBlcnxwcmludHxpbmNyZW1lbnRfbG9nX3Byb2J8aW50ZWdyYXRlX29kZXxyZWplY3QpXFxiIixlOmhsanMuSU1NRURJQVRFX1JFLHI6MTB9LHtjTjoia2V5d29yZCIsYjoiKD86aW50fHJlYWx8dmVjdG9yfHNpbXBsZXh8dW5pdF92ZWN0b3J8b3JkZXJlZHxwb3NpdGl2ZV9vcmRlcmVkfHJvd192ZWN0b3J8bWF0cml4fGNob2xlc2t5X2ZhY3Rvcl9jb3Z8Y2hvbGVza3lfZmFjdG9yX2NvcnJ8Y29ycl9tYXRyaXh8Y292X21hdHJpeHx2b2lkKVxcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjV9LHtjTjoia2V5d29yZCIsYjoiKD86ZnVuY3Rpb25zfGRhdGF8dHJhbnNmb3JtZWRcXHMrZGF0YXxwYXJhbWV0ZXJzfHRyYW5zZm9ybWVkXFxzK3BhcmFtZXRlcnN8bW9kZWx8Z2VuZXJhdGVkXFxzK3F1YW50aXRpZXMpXFxiIixlOmhsanMuSU1NRURJQVRFX1JFLHI6NX1dfX07aGxqcy5MQU5HVUFHRVMueG1sPWZ1bmN0aW9uKCl7dmFyIGI9IltBLVphLXowLTlcXC5fOi1dKyI7dmFyIGE9e2VXOnRydWUsYzpbe2NOOiJhdHRyaWJ1dGUiLGI6YixyOjB9LHtiOic9IicsckI6dHJ1ZSxlOiciJyxjOlt7Y046InZhbHVlIixiOiciJyxlVzp0cnVlfV19LHtiOiI9JyIsckI6dHJ1ZSxlOiInIixjOlt7Y046InZhbHVlIixiOiInIixlVzp0cnVlfV19LHtiOiI9IixjOlt7Y046InZhbHVlIixiOiJbXlxccy8+XSsifV19XX07cmV0dXJue2NJOnRydWUsZE06e2M6W3tjTjoicGkiLGI6IjxcXD8iLGU6IlxcPz4iLHI6MTB9LHtjTjoiZG9jdHlwZSIsYjoiPCFET0NUWVBFIixlOiI+IixyOjEwLGM6W3tiOiJcXFsiLGU6IlxcXSJ9XX0se2NOOiJjb21tZW50IixiOiI8IS0tIixlOiItLT4iLHI6MTB9LHtjTjoiY2RhdGEiLGI6IjxcXCFcXFtDREFUQVxcWyIsZToiXFxdXFxdPiIscjoxMH0se2NOOiJ0YWciLGI6IjxzdHlsZSg/PVxcc3w+fCQpIixlOiI+IixrOnt0aXRsZTp7c3R5bGU6MX19LGM6W2FdLHN0YXJ0czp7Y046ImNzcyIsZToiPC9zdHlsZT4iLHJFOnRydWUsc0w6ImNzcyJ9fSx7Y046InRhZyIsYjoiPHNjcmlwdCg/PVxcc3w+fCQpIixlOiI+IixrOnt0aXRsZTp7c2NyaXB0OjF9fSxjOlthXSxzdGFydHM6e2NOOiJqYXZhc2NyaXB0IixlOiI8XC9zY3JpcHQ+IixyRTp0cnVlLHNMOiJqYXZhc2NyaXB0In19LHtjTjoidmJzY3JpcHQiLGI6IjwlIixlOiIlPiIsc0w6InZic2NyaXB0In0se2NOOiJ0YWciLGI6IjwvPyIsZToiLz8+IixjOlt7Y046InRpdGxlIixiOiJbXiAvPl0rIn0sYV19XX19fSgpOwpobGpzLmluaXRIaWdobGlnaHRpbmdPbkxvYWQoKTsKCg=="></script> @@ -119,7 +119,7 @@ $(document).ready(function () { <h1 class="title toc-ignore">Example evaluation of FOCUS Example Dataset D</h1> <h4 class="author"><em>Johannes Ranke</em></h4> -<h4 class="date"><em>2016-11-18</em></h4> +<h4 class="date"><em>2017-05-05</em></h4> </div> @@ -196,10 +196,10 @@ $(document).ready(function () { <p><img src="data:image/png;base64,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" /><!-- --></p> <p>A comprehensive report of the results is obtained using the <code>summary</code> method for <code>mkinfit</code> objects.</p> <pre class="r"><code>summary(fit)</code></pre> -<pre><code>## mkin version: 0.9.44.9000 -## R version: 3.3.2 -## Date of fit: Fri Nov 18 22:48:53 2016 -## Date of summary: Fri Nov 18 22:48:54 2016 +<pre><code>## mkin version: 0.9.45 +## R version: 3.4.0 +## Date of fit: Fri May 5 12:14:00 2017 +## Date of summary: Fri May 5 12:14:00 2017 ## ## Equations: ## d_parent/dt = - k_parent_sink * parent - k_parent_m1 * parent @@ -207,7 +207,7 @@ $(document).ready(function () { ## ## Model predictions using solution type deSolve ## -## Fitted with method Port using 153 model solutions performed in 0.64 s +## Fitted with method Port using 153 model solutions performed in 1.033 s ## ## Weighting: none ## @@ -241,7 +241,7 @@ $(document).ready(function () { ## parent_0 1.00000 0.6075 -0.06625 -0.1701 ## log_k_parent_sink 0.60752 1.0000 -0.08740 -0.6253 ## log_k_parent_m1 -0.06625 -0.0874 1.00000 0.4716 -## log_k_m1_sink -0.17006 -0.6253 0.47163 1.0000 +## log_k_m1_sink -0.17006 -0.6253 0.47164 1.0000 ## ## Residual standard error: 3.211 on 36 degrees of freedom ## diff --git a/vignettes/FOCUS_L.html b/vignettes/FOCUS_L.html index 315f3d98..fd531133 100644 --- a/vignettes/FOCUS_L.html +++ b/vignettes/FOCUS_L.html @@ -4,14 +4,14 @@ <head> -<meta charset="utf-8"> +<meta charset="utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="generator" content="pandoc" /> <meta name="author" content="Johannes Ranke" /> -<meta name="date" content="2016-11-18" /> +<meta name="date" content="2017-05-05" /> <title>Example evaluation of FOCUS Laboratory Data L1 to L3</title> @@ -24,7 +24,7 @@ <script src="data:application/x-javascript;base64,LyohIGpRdWVyeSBVSSAtIHYxLjExLjQgLSAyMDE2LTAxLTA1CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiBjb3JlLmpzLCB3aWRnZXQuanMsIG1vdXNlLmpzLCBwb3NpdGlvbi5qcywgZHJhZ2dhYmxlLmpzLCBkcm9wcGFibGUuanMsIHJlc2l6YWJsZS5qcywgc2VsZWN0YWJsZS5qcywgc29ydGFibGUuanMsIGFjY29yZGlvbi5qcywgYXV0b2NvbXBsZXRlLmpzLCBidXR0b24uanMsIGRpYWxvZy5qcywgbWVudS5qcywgcHJvZ3Jlc3NiYXIuanMsIHNlbGVjdG1lbnUuanMsIHNsaWRlci5qcywgc3Bpbm5lci5qcywgdGFicy5qcywgdG9vbHRpcC5qcywgZWZmZWN0LmpzLCBlZmZlY3QtYmxpbmQuanMsIGVmZmVjdC1ib3VuY2UuanMsIGVmZmVjdC1jbGlwLmpzLCBlZmZlY3QtZHJvcC5qcywgZWZmZWN0LWV4cGxvZGUuanMsIGVmZmVjdC1mYWRlLmpzLCBlZmZlY3QtZm9sZC5qcywgZWZmZWN0LWhpZ2hsaWdodC5qcywgZWZmZWN0LXB1ZmYuanMsIGVmZmVjdC1wdWxzYXRlLmpzLCBlZmZlY3Qtc2NhbGUuanMsIGVmZmVjdC1zaGFrZS5qcywgZWZmZWN0LXNpemUuanMsIGVmZmVjdC1zbGlkZS5qcywgZWZmZWN0LXRyYW5zZmVyLmpzCiogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnM7IExpY2Vuc2VkIE1JVCAqLwoKKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsianF1ZXJ5Il0sZSk6ZShqUXVlcnkpfSkoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0LHMpe3ZhciBuLGEsbyxyPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iYXJlYSI9PT1yPyhuPXQucGFyZW50Tm9kZSxhPW4ubmFtZSx0LmhyZWYmJmEmJiJtYXAiPT09bi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPyhvPWUoImltZ1t1c2VtYXA9JyMiK2ErIiddIilbMF0sISFvJiZpKG8pKTohMSk6KC9eKGlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvLnRlc3Qocik/IXQuZGlzYWJsZWQ6ImEiPT09cj90LmhyZWZ8fHM6cykmJmkodCl9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gZS5leHByLmZpbHRlcnMudmlzaWJsZSh0KSYmIWUodCkucGFyZW50cygpLmFkZEJhY2soKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4iaGlkZGVuIj09PWUuY3NzKHRoaXMsInZpc2liaWxpdHkiKX0pLmxlbmd0aH1mdW5jdGlvbiBzKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWxlbWVudC52YWwoKTtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9yZWZyZXNoKCksdCE9PXRoaXMuZWxlbWVudC52YWwoKSYmdGhpcy5fdHJpZ2dlcigiY2hhbmdlIil9fWUudWk9ZS51aXx8e30sZS5leHRlbmQoZS51aSx7dmVyc2lvbjoiMS4xMS40IixrZXlDb2RlOntCQUNLU1BBQ0U6OCxDT01NQToxODgsREVMRVRFOjQ2LERPV046NDAsRU5EOjM1LEVOVEVSOjEzLEVTQ0FQRToyNyxIT01FOjM2LExFRlQ6MzcsUEFHRV9ET1dOOjM0LFBBR0VfVVA6MzMsUEVSSU9EOjE5MCxSSUdIVDozOSxTUEFDRTozMixUQUI6OSxVUDozOH19KSxlLmZuLmV4dGVuZCh7c2Nyb2xsUGFyZW50OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuY3NzKCJwb3NpdGlvbiIpLHM9ImFic29sdXRlIj09PWksbj10Py8oYXV0b3xzY3JvbGx8aGlkZGVuKS86LyhhdXRvfHNjcm9sbCkvLGE9dGhpcy5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtyZXR1cm4gcyYmInN0YXRpYyI9PT10LmNzcygicG9zaXRpb24iKT8hMTpuLnRlc3QodC5jc3MoIm92ZXJmbG93IikrdC5jc3MoIm92ZXJmbG93LXkiKSt0LmNzcygib3ZlcmZsb3cteCIpKX0pLmVxKDApO3JldHVybiJmaXhlZCIhPT1pJiZhLmxlbmd0aD9hOmUodGhpc1swXS5vd25lckRvY3VtZW50fHxkb2N1bWVudCl9LHVuaXF1ZUlkOmZ1bmN0aW9uKCl7dmFyIGU9MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5pZHx8KHRoaXMuaWQ9InVpLWlkLSIrICsrZSl9KX19KCkscmVtb3ZlVW5pcXVlSWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7L151aS1pZC1cZCskLy50ZXN0KHRoaXMuaWQpJiZlKHRoaXMpLnJlbW92ZUF0dHIoImlkIil9KX19KSxlLmV4dGVuZChlLmV4cHJbIjoiXSx7ZGF0YTplLmV4cHIuY3JlYXRlUHNldWRvP2UuZXhwci5jcmVhdGVQc2V1ZG8oZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkpe3JldHVybiEhZS5kYXRhKGksdCl9fSk6ZnVuY3Rpb24odCxpLHMpe3JldHVybiEhZS5kYXRhKHQsc1szXSl9LGZvY3VzYWJsZTpmdW5jdGlvbihpKXtyZXR1cm4gdChpLCFpc05hTihlLmF0dHIoaSwidGFiaW5kZXgiKSkpfSx0YWJiYWJsZTpmdW5jdGlvbihpKXt2YXIgcz1lLmF0dHIoaSwidGFiaW5kZXgiKSxuPWlzTmFOKHMpO3JldHVybihufHxzPj0wKSYmdChpLCFuKX19KSxlKCI8YT4iKS5vdXRlcldpZHRoKDEpLmpxdWVyeXx8ZS5lYWNoKFsiV2lkdGgiLCJIZWlnaHQiXSxmdW5jdGlvbih0LGkpe2Z1bmN0aW9uIHModCxpLHMsYSl7cmV0dXJuIGUuZWFjaChuLGZ1bmN0aW9uKCl7aS09cGFyc2VGbG9hdChlLmNzcyh0LCJwYWRkaW5nIit0aGlzKSl8fDAscyYmKGktPXBhcnNlRmxvYXQoZS5jc3ModCwiYm9yZGVyIit0aGlzKyJXaWR0aCIpKXx8MCksYSYmKGktPXBhcnNlRmxvYXQoZS5jc3ModCwibWFyZ2luIit0aGlzKSl8fDApfSksaX12YXIgbj0iV2lkdGgiPT09aT9bIkxlZnQiLCJSaWdodCJdOlsiVG9wIiwiQm90dG9tIl0sYT1pLnRvTG93ZXJDYXNlKCksbz17aW5uZXJXaWR0aDplLmZuLmlubmVyV2lkdGgsaW5uZXJIZWlnaHQ6ZS5mbi5pbm5lckhlaWdodCxvdXRlcldpZHRoOmUuZm4ub3V0ZXJXaWR0aCxvdXRlckhlaWdodDplLmZuLm91dGVySGVpZ2h0fTtlLmZuWyJpbm5lciIraV09ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQ/b1siaW5uZXIiK2ldLmNhbGwodGhpcyk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZSh0aGlzKS5jc3MoYSxzKHRoaXMsdCkrInB4Iil9KX0sZS5mblsib3V0ZXIiK2ldPWZ1bmN0aW9uKHQsbil7cmV0dXJuIm51bWJlciIhPXR5cGVvZiB0P29bIm91dGVyIitpXS5jYWxsKHRoaXMsdCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZSh0aGlzKS5jc3MoYSxzKHRoaXMsdCwhMCxuKSsicHgiKX0pfX0pLGUuZm4uYWRkQmFja3x8KGUuZm4uYWRkQmFjaz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9KSxlKCI8YT4iKS5kYXRhKCJhLWIiLCJhIikucmVtb3ZlRGF0YSgiYS1iIikuZGF0YSgiYS1iIikmJihlLmZuLnJlbW92ZURhdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QuY2FsbCh0aGlzLGUuY2FtZWxDYXNlKGkpKTp0LmNhbGwodGhpcyl9fShlLmZuLnJlbW92ZURhdGEpKSxlLnVpLmllPSEhL21zaWUgW1x3Ll0rLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSksZS5mbi5leHRlbmQoe2ZvY3VzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpLHMpe3JldHVybiJudW1iZXIiPT10eXBlb2YgaT90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlKHQpLmZvY3VzKCkscyYmcy5jYWxsKHQpfSxpKX0pOnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oZS5mbi5mb2N1cyksZGlzYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3ZhciBlPSJvbnNlbGVjdHN0YXJ0ImluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpPyJzZWxlY3RzdGFydCI6Im1vdXNlZG93biI7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmluZChlKyIudWktZGlzYWJsZVNlbGVjdGlvbiIsZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpfSl9fSgpLGVuYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuYmluZCgiLnVpLWRpc2FibGVTZWxlY3Rpb24iKX0sekluZGV4OmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpcmV0dXJuIHRoaXMuY3NzKCJ6SW5kZXgiLHQpO2lmKHRoaXMubGVuZ3RoKWZvcih2YXIgaSxzLG49ZSh0aGlzWzBdKTtuLmxlbmd0aCYmblswXSE9PWRvY3VtZW50Oyl7aWYoaT1uLmNzcygicG9zaXRpb24iKSwoImFic29sdXRlIj09PWl8fCJyZWxhdGl2ZSI9PT1pfHwiZml4ZWQiPT09aSkmJihzPXBhcnNlSW50KG4uY3NzKCJ6SW5kZXgiKSwxMCksIWlzTmFOKHMpJiYwIT09cykpcmV0dXJuIHM7bj1uLnBhcmVudCgpfXJldHVybiAwfX0pLGUudWkucGx1Z2luPXthZGQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGE9ZS51aVt0XS5wcm90b3R5cGU7Zm9yKG4gaW4gcylhLnBsdWdpbnNbbl09YS5wbHVnaW5zW25dfHxbXSxhLnBsdWdpbnNbbl0ucHVzaChbaSxzW25dXSl9LGNhbGw6ZnVuY3Rpb24oZSx0LGkscyl7dmFyIG4sYT1lLnBsdWdpbnNbdF07aWYoYSYmKHN8fGUuZWxlbWVudFswXS5wYXJlbnROb2RlJiYxMSE9PWUuZWxlbWVudFswXS5wYXJlbnROb2RlLm5vZGVUeXBlKSlmb3Iobj0wO2EubGVuZ3RoPm47bisrKWUub3B0aW9uc1thW25dWzBdXSYmYVtuXVsxXS5hcHBseShlLmVsZW1lbnQsaSl9fTt2YXIgbj0wLGE9QXJyYXkucHJvdG90eXBlLnNsaWNlO2UuY2xlYW5EYXRhPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpKXt2YXIgcyxuLGE7Zm9yKGE9MDtudWxsIT0obj1pW2FdKTthKyspdHJ5e3M9ZS5fZGF0YShuLCJldmVudHMiKSxzJiZzLnJlbW92ZSYmZShuKS50cmlnZ2VySGFuZGxlcigicmVtb3ZlIil9Y2F0Y2gobyl7fXQoaSl9fShlLmNsZWFuRGF0YSksZS53aWRnZXQ9ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGEsbyxyLGg9e30sbD10LnNwbGl0KCIuIilbMF07cmV0dXJuIHQ9dC5zcGxpdCgiLiIpWzFdLG49bCsiLSIrdCxzfHwocz1pLGk9ZS5XaWRnZXQpLGUuZXhwclsiOiJdW24udG9Mb3dlckNhc2UoKV09ZnVuY3Rpb24odCl7cmV0dXJuISFlLmRhdGEodCxuKX0sZVtsXT1lW2xdfHx7fSxhPWVbbF1bdF0sbz1lW2xdW3RdPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX2NyZWF0ZVdpZGdldD8oYXJndW1lbnRzLmxlbmd0aCYmdGhpcy5fY3JlYXRlV2lkZ2V0KGUsdCksdm9pZCAwKTpuZXcgbyhlLHQpfSxlLmV4dGVuZChvLGEse3ZlcnNpb246cy52ZXJzaW9uLF9wcm90bzplLmV4dGVuZCh7fSxzKSxfY2hpbGRDb25zdHJ1Y3RvcnM6W119KSxyPW5ldyBpLHIub3B0aW9ucz1lLndpZGdldC5leHRlbmQoe30sci5vcHRpb25zKSxlLmVhY2gocyxmdW5jdGlvbih0LHMpe3JldHVybiBlLmlzRnVuY3Rpb24ocyk/KGhbdF09ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigpe3JldHVybiBpLnByb3RvdHlwZVt0XS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG49ZnVuY3Rpb24oZSl7cmV0dXJuIGkucHJvdG90eXBlW3RdLmFwcGx5KHRoaXMsZSl9O3JldHVybiBmdW5jdGlvbigpe3ZhciB0LGk9dGhpcy5fc3VwZXIsYT10aGlzLl9zdXBlckFwcGx5O3JldHVybiB0aGlzLl9zdXBlcj1lLHRoaXMuX3N1cGVyQXBwbHk9bix0PXMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3N1cGVyPWksdGhpcy5fc3VwZXJBcHBseT1hLHR9fSgpLHZvaWQgMCk6KGhbdF09cyx2b2lkIDApfSksby5wcm90b3R5cGU9ZS53aWRnZXQuZXh0ZW5kKHIse3dpZGdldEV2ZW50UHJlZml4OmE/ci53aWRnZXRFdmVudFByZWZpeHx8dDp0fSxoLHtjb25zdHJ1Y3RvcjpvLG5hbWVzcGFjZTpsLHdpZGdldE5hbWU6dCx3aWRnZXRGdWxsTmFtZTpufSksYT8oZS5lYWNoKGEuX2NoaWxkQ29uc3RydWN0b3JzLGZ1bmN0aW9uKHQsaSl7dmFyIHM9aS5wcm90b3R5cGU7ZS53aWRnZXQocy5uYW1lc3BhY2UrIi4iK3Mud2lkZ2V0TmFtZSxvLGkuX3Byb3RvKX0pLGRlbGV0ZSBhLl9jaGlsZENvbnN0cnVjdG9ycyk6aS5fY2hpbGRDb25zdHJ1Y3RvcnMucHVzaChvKSxlLndpZGdldC5icmlkZ2UodCxvKSxvfSxlLndpZGdldC5leHRlbmQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBpLHMsbj1hLmNhbGwoYXJndW1lbnRzLDEpLG89MCxyPW4ubGVuZ3RoO3I+bztvKyspZm9yKGkgaW4gbltvXSlzPW5bb11baV0sbltvXS5oYXNPd25Qcm9wZXJ0eShpKSYmdm9pZCAwIT09cyYmKHRbaV09ZS5pc1BsYWluT2JqZWN0KHMpP2UuaXNQbGFpbk9iamVjdCh0W2ldKT9lLndpZGdldC5leHRlbmQoe30sdFtpXSxzKTplLndpZGdldC5leHRlbmQoe30scyk6cyk7cmV0dXJuIHR9LGUud2lkZ2V0LmJyaWRnZT1mdW5jdGlvbih0LGkpe3ZhciBzPWkucHJvdG90eXBlLndpZGdldEZ1bGxOYW1lfHx0O2UuZm5bdF09ZnVuY3Rpb24obil7dmFyIG89InN0cmluZyI9PXR5cGVvZiBuLHI9YS5jYWxsKGFyZ3VtZW50cywxKSxoPXRoaXM7cmV0dXJuIG8/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGksYT1lLmRhdGEodGhpcyxzKTtyZXR1cm4iaW5zdGFuY2UiPT09bj8oaD1hLCExKTphP2UuaXNGdW5jdGlvbihhW25dKSYmIl8iIT09bi5jaGFyQXQoMCk/KGk9YVtuXS5hcHBseShhLHIpLGkhPT1hJiZ2b2lkIDAhPT1pPyhoPWkmJmkuanF1ZXJ5P2gucHVzaFN0YWNrKGkuZ2V0KCkpOmksITEpOnZvaWQgMCk6ZS5lcnJvcigibm8gc3VjaCBtZXRob2QgJyIrbisiJyBmb3IgIit0KyIgd2lkZ2V0IGluc3RhbmNlIik6ZS5lcnJvcigiY2Fubm90IGNhbGwgbWV0aG9kcyBvbiAiK3QrIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIisiYXR0ZW1wdGVkIHRvIGNhbGwgbWV0aG9kICciK24rIiciKX0pOihyLmxlbmd0aCYmKG49ZS53aWRnZXQuZXh0ZW5kLmFwcGx5KG51bGwsW25dLmNvbmNhdChyKSkpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUuZGF0YSh0aGlzLHMpO3Q/KHQub3B0aW9uKG58fHt9KSx0Ll9pbml0JiZ0Ll9pbml0KCkpOmUuZGF0YSh0aGlzLHMsbmV3IGkobix0aGlzKSl9KSksaH19LGUuV2lkZ2V0PWZ1bmN0aW9uKCl7fSxlLldpZGdldC5fY2hpbGRDb25zdHJ1Y3RvcnM9W10sZS5XaWRnZXQucHJvdG90eXBlPXt3aWRnZXROYW1lOiJ3aWRnZXQiLHdpZGdldEV2ZW50UHJlZml4OiIiLGRlZmF1bHRFbGVtZW50OiI8ZGl2PiIsb3B0aW9uczp7ZGlzYWJsZWQ6ITEsY3JlYXRlOm51bGx9LF9jcmVhdGVXaWRnZXQ6ZnVuY3Rpb24odCxpKXtpPWUoaXx8dGhpcy5kZWZhdWx0RWxlbWVudHx8dGhpcylbMF0sdGhpcy5lbGVtZW50PWUoaSksdGhpcy51dWlkPW4rKyx0aGlzLmV2ZW50TmFtZXNwYWNlPSIuIit0aGlzLndpZGdldE5hbWUrdGhpcy51dWlkLHRoaXMuYmluZGluZ3M9ZSgpLHRoaXMuaG92ZXJhYmxlPWUoKSx0aGlzLmZvY3VzYWJsZT1lKCksaSE9PXRoaXMmJihlLmRhdGEoaSx0aGlzLndpZGdldEZ1bGxOYW1lLHRoaXMpLHRoaXMuX29uKCEwLHRoaXMuZWxlbWVudCx7cmVtb3ZlOmZ1bmN0aW9uKGUpe2UudGFyZ2V0PT09aSYmdGhpcy5kZXN0cm95KCl9fSksdGhpcy5kb2N1bWVudD1lKGkuc3R5bGU/aS5vd25lckRvY3VtZW50OmkuZG9jdW1lbnR8fGkpLHRoaXMud2luZG93PWUodGhpcy5kb2N1bWVudFswXS5kZWZhdWx0Vmlld3x8dGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cpKSx0aGlzLm9wdGlvbnM9ZS53aWRnZXQuZXh0ZW5kKHt9LHRoaXMub3B0aW9ucyx0aGlzLl9nZXRDcmVhdGVPcHRpb25zKCksdCksdGhpcy5fY3JlYXRlKCksdGhpcy5fdHJpZ2dlcigiY3JlYXRlIixudWxsLHRoaXMuX2dldENyZWF0ZUV2ZW50RGF0YSgpKSx0aGlzLl9pbml0KCl9LF9nZXRDcmVhdGVPcHRpb25zOmUubm9vcCxfZ2V0Q3JlYXRlRXZlbnREYXRhOmUubm9vcCxfY3JlYXRlOmUubm9vcCxfaW5pdDplLm5vb3AsZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX2Rlc3Ryb3koKSx0aGlzLmVsZW1lbnQudW5iaW5kKHRoaXMuZXZlbnROYW1lc3BhY2UpLnJlbW92ZURhdGEodGhpcy53aWRnZXRGdWxsTmFtZSkucmVtb3ZlRGF0YShlLmNhbWVsQ2FzZSh0aGlzLndpZGdldEZ1bGxOYW1lKSksdGhpcy53aWRnZXQoKS51bmJpbmQodGhpcy5ldmVudE5hbWVzcGFjZSkucmVtb3ZlQXR0cigiYXJpYS1kaXNhYmxlZCIpLnJlbW92ZUNsYXNzKHRoaXMud2lkZ2V0RnVsbE5hbWUrIi1kaXNhYmxlZCAiKyJ1aS1zdGF0ZS1kaXNhYmxlZCIpLHRoaXMuYmluZGluZ3MudW5iaW5kKHRoaXMuZXZlbnROYW1lc3BhY2UpLHRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLHRoaXMuZm9jdXNhYmxlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSxfZGVzdHJveTplLm5vb3Asd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudH0sb3B0aW9uOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhLG89dDtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS53aWRnZXQuZXh0ZW5kKHt9LHRoaXMub3B0aW9ucyk7aWYoInN0cmluZyI9PXR5cGVvZiB0KWlmKG89e30scz10LnNwbGl0KCIuIiksdD1zLnNoaWZ0KCkscy5sZW5ndGgpe2ZvcihuPW9bdF09ZS53aWRnZXQuZXh0ZW5kKHt9LHRoaXMub3B0aW9uc1t0XSksYT0wO3MubGVuZ3RoLTE+YTthKyspbltzW2FdXT1uW3NbYV1dfHx7fSxuPW5bc1thXV07aWYodD1zLnBvcCgpLDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1uW3RdP251bGw6blt0XTtuW3RdPWl9ZWxzZXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09dGhpcy5vcHRpb25zW3RdP251bGw6dGhpcy5vcHRpb25zW3RdO29bdF09aX1yZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyhvKSx0aGlzfSxfc2V0T3B0aW9uczpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlKXRoaXMuX3NldE9wdGlvbih0LGVbdF0pO3JldHVybiB0aGlzfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub3B0aW9uc1tlXT10LCJkaXNhYmxlZCI9PT1lJiYodGhpcy53aWRnZXQoKS50b2dnbGVDbGFzcyh0aGlzLndpZGdldEZ1bGxOYW1lKyItZGlzYWJsZWQiLCEhdCksdCYmKHRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLHRoaXMuZm9jdXNhYmxlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpKSksdGhpc30sZW5hYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoe2Rpc2FibGVkOiExfSl9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyh7ZGlzYWJsZWQ6ITB9KX0sX29uOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbixhPXRoaXM7ImJvb2xlYW4iIT10eXBlb2YgdCYmKHM9aSxpPXQsdD0hMSkscz8oaT1uPWUoaSksdGhpcy5iaW5kaW5ncz10aGlzLmJpbmRpbmdzLmFkZChpKSk6KHM9aSxpPXRoaXMuZWxlbWVudCxuPXRoaXMud2lkZ2V0KCkpLGUuZWFjaChzLGZ1bmN0aW9uKHMsbyl7ZnVuY3Rpb24gcigpe3JldHVybiB0fHxhLm9wdGlvbnMuZGlzYWJsZWQhPT0hMCYmIWUodGhpcykuaGFzQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIik/KCJzdHJpbmciPT10eXBlb2Ygbz9hW29dOm8pLmFwcGx5KGEsYXJndW1lbnRzKTp2b2lkIDB9InN0cmluZyIhPXR5cGVvZiBvJiYoci5ndWlkPW8uZ3VpZD1vLmd1aWR8fHIuZ3VpZHx8ZS5ndWlkKyspO3ZhciBoPXMubWF0Y2goL14oW1x3Oi1dKilccyooLiopJC8pLGw9aFsxXSthLmV2ZW50TmFtZXNwYWNlLHU9aFsyXTt1P24uZGVsZWdhdGUodSxsLHIpOmkuYmluZChsLHIpfSl9LF9vZmY6ZnVuY3Rpb24odCxpKXtpPShpfHwiIikuc3BsaXQoIiAiKS5qb2luKHRoaXMuZXZlbnROYW1lc3BhY2UrIiAiKSt0aGlzLmV2ZW50TmFtZXNwYWNlLHQudW5iaW5kKGkpLnVuZGVsZWdhdGUoaSksdGhpcy5iaW5kaW5ncz1lKHRoaXMuYmluZGluZ3Mubm90KHQpLmdldCgpKSx0aGlzLmZvY3VzYWJsZT1lKHRoaXMuZm9jdXNhYmxlLm5vdCh0KS5nZXQoKSksdGhpcy5ob3ZlcmFibGU9ZSh0aGlzLmhvdmVyYWJsZS5ub3QodCkuZ2V0KCkpfSxfZGVsYXk6ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBpKCl7cmV0dXJuKCJzdHJpbmciPT10eXBlb2YgZT9zW2VdOmUpLmFwcGx5KHMsYXJndW1lbnRzKX12YXIgcz10aGlzO3JldHVybiBzZXRUaW1lb3V0KGksdHx8MCl9LF9ob3ZlcmFibGU6ZnVuY3Rpb24odCl7dGhpcy5ob3ZlcmFibGU9dGhpcy5ob3ZlcmFibGUuYWRkKHQpLHRoaXMuX29uKHQse21vdXNlZW50ZXI6ZnVuY3Rpb24odCl7ZSh0LmN1cnJlbnRUYXJnZXQpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSxtb3VzZWxlYXZlOmZ1bmN0aW9uKHQpe2UodC5jdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX19KX0sX2ZvY3VzYWJsZTpmdW5jdGlvbih0KXt0aGlzLmZvY3VzYWJsZT10aGlzLmZvY3VzYWJsZS5hZGQodCksdGhpcy5fb24odCx7Zm9jdXNpbjpmdW5jdGlvbih0KXtlKHQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9LGZvY3Vzb3V0OmZ1bmN0aW9uKHQpe2UodC5jdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX19KX0sX3RyaWdnZXI6ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGEsbz10aGlzLm9wdGlvbnNbdF07aWYocz1zfHx7fSxpPWUuRXZlbnQoaSksaS50eXBlPSh0PT09dGhpcy53aWRnZXRFdmVudFByZWZpeD90OnRoaXMud2lkZ2V0RXZlbnRQcmVmaXgrdCkudG9Mb3dlckNhc2UoKSxpLnRhcmdldD10aGlzLmVsZW1lbnRbMF0sYT1pLm9yaWdpbmFsRXZlbnQpZm9yKG4gaW4gYSluIGluIGl8fChpW25dPWFbbl0pO3JldHVybiB0aGlzLmVsZW1lbnQudHJpZ2dlcihpLHMpLCEoZS5pc0Z1bmN0aW9uKG8pJiZvLmFwcGx5KHRoaXMuZWxlbWVudFswXSxbaV0uY29uY2F0KHMpKT09PSExfHxpLmlzRGVmYXVsdFByZXZlbnRlZCgpKX19LGUuZWFjaCh7c2hvdzoiZmFkZUluIixoaWRlOiJmYWRlT3V0In0sZnVuY3Rpb24odCxpKXtlLldpZGdldC5wcm90b3R5cGVbIl8iK3RdPWZ1bmN0aW9uKHMsbixhKXsic3RyaW5nIj09dHlwZW9mIG4mJihuPXtlZmZlY3Q6bn0pO3ZhciBvLHI9bj9uPT09ITB8fCJudW1iZXIiPT10eXBlb2Ygbj9pOm4uZWZmZWN0fHxpOnQ7bj1ufHx7fSwibnVtYmVyIj09dHlwZW9mIG4mJihuPXtkdXJhdGlvbjpufSksbz0hZS5pc0VtcHR5T2JqZWN0KG4pLG4uY29tcGxldGU9YSxuLmRlbGF5JiZzLmRlbGF5KG4uZGVsYXkpLG8mJmUuZWZmZWN0cyYmZS5lZmZlY3RzLmVmZmVjdFtyXT9zW3RdKG4pOnIhPT10JiZzW3JdP3Nbcl0obi5kdXJhdGlvbixuLmVhc2luZyxhKTpzLnF1ZXVlKGZ1bmN0aW9uKGkpe2UodGhpcylbdF0oKSxhJiZhLmNhbGwoc1swXSksaSgpfSl9fSksZS53aWRnZXQ7dmFyIG89ITE7ZShkb2N1bWVudCkubW91c2V1cChmdW5jdGlvbigpe289ITF9KSxlLndpZGdldCgidWkubW91c2UiLHt2ZXJzaW9uOiIxLjExLjQiLG9wdGlvbnM6e2NhbmNlbDoiaW5wdXQsdGV4dGFyZWEsYnV0dG9uLHNlbGVjdCxvcHRpb24iLGRpc3RhbmNlOjEsZGVsYXk6MH0sX21vdXNlSW5pdDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5lbGVtZW50LmJpbmQoIm1vdXNlZG93bi4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbihlKXtyZXR1cm4gdC5fbW91c2VEb3duKGUpfSkuYmluZCgiY2xpY2suIit0aGlzLndpZGdldE5hbWUsZnVuY3Rpb24oaSl7cmV0dXJuITA9PT1lLmRhdGEoaS50YXJnZXQsdC53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKT8oZS5yZW1vdmVEYXRhKGkudGFyZ2V0LHQud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IiksaS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwhMSk6dm9pZCAwfSksdGhpcy5zdGFydGVkPSExfSxfbW91c2VEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnVuYmluZCgiLiIrdGhpcy53aWRnZXROYW1lKSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSYmdGhpcy5kb2N1bWVudC51bmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkudW5iaW5kKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSl9LF9tb3VzZURvd246ZnVuY3Rpb24odCl7aWYoIW8pe3RoaXMuX21vdXNlTW92ZWQ9ITEsdGhpcy5fbW91c2VTdGFydGVkJiZ0aGlzLl9tb3VzZVVwKHQpLHRoaXMuX21vdXNlRG93bkV2ZW50PXQ7dmFyIGk9dGhpcyxzPTE9PT10LndoaWNoLG49InN0cmluZyI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuY2FuY2VsJiZ0LnRhcmdldC5ub2RlTmFtZT9lKHQudGFyZ2V0KS5jbG9zZXN0KHRoaXMub3B0aW9ucy5jYW5jZWwpLmxlbmd0aDohMTtyZXR1cm4gcyYmIW4mJnRoaXMuX21vdXNlQ2FwdHVyZSh0KT8odGhpcy5tb3VzZURlbGF5TWV0PSF0aGlzLm9wdGlvbnMuZGVsYXksdGhpcy5tb3VzZURlbGF5TWV0fHwodGhpcy5fbW91c2VEZWxheVRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpLm1vdXNlRGVsYXlNZXQ9ITB9LHRoaXMub3B0aW9ucy5kZWxheSkpLHRoaXMuX21vdXNlRGlzdGFuY2VNZXQodCkmJnRoaXMuX21vdXNlRGVsYXlNZXQodCkmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9dGhpcy5fbW91c2VTdGFydCh0KSE9PSExLCF0aGlzLl9tb3VzZVN0YXJ0ZWQpPyh0LnByZXZlbnREZWZhdWx0KCksITApOighMD09PWUuZGF0YSh0LnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpJiZlLnJlbW92ZURhdGEodC50YXJnZXQsdGhpcy53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZT1mdW5jdGlvbihlKXtyZXR1cm4gaS5fbW91c2VNb3ZlKGUpfSx0aGlzLl9tb3VzZVVwRGVsZWdhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGkuX21vdXNlVXAoZSl9LHRoaXMuZG9jdW1lbnQuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS5iaW5kKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSksdC5wcmV2ZW50RGVmYXVsdCgpLG89ITAsITApKTohMH19LF9tb3VzZU1vdmU6ZnVuY3Rpb24odCl7aWYodGhpcy5fbW91c2VNb3ZlZCl7aWYoZS51aS5pZSYmKCFkb2N1bWVudC5kb2N1bWVudE1vZGV8fDk+ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKSYmIXQuYnV0dG9uKXJldHVybiB0aGlzLl9tb3VzZVVwKHQpO2lmKCF0LndoaWNoKXJldHVybiB0aGlzLl9tb3VzZVVwKHQpfXJldHVybih0LndoaWNofHx0LmJ1dHRvbikmJih0aGlzLl9tb3VzZU1vdmVkPSEwKSx0aGlzLl9tb3VzZVN0YXJ0ZWQ/KHRoaXMuX21vdXNlRHJhZyh0KSx0LnByZXZlbnREZWZhdWx0KCkpOih0aGlzLl9tb3VzZURpc3RhbmNlTWV0KHQpJiZ0aGlzLl9tb3VzZURlbGF5TWV0KHQpJiYodGhpcy5fbW91c2VTdGFydGVkPXRoaXMuX21vdXNlU3RhcnQodGhpcy5fbW91c2VEb3duRXZlbnQsdCkhPT0hMSx0aGlzLl9tb3VzZVN0YXJ0ZWQ/dGhpcy5fbW91c2VEcmFnKHQpOnRoaXMuX21vdXNlVXAodCkpLCF0aGlzLl9tb3VzZVN0YXJ0ZWQpfSxfbW91c2VVcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kb2N1bWVudC51bmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkudW5iaW5kKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSksdGhpcy5fbW91c2VTdGFydGVkJiYodGhpcy5fbW91c2VTdGFydGVkPSExLHQudGFyZ2V0PT09dGhpcy5fbW91c2VEb3duRXZlbnQudGFyZ2V0JiZlLmRhdGEodC50YXJnZXQsdGhpcy53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiLCEwKSx0aGlzLl9tb3VzZVN0b3AodCkpLG89ITEsITF9LF9tb3VzZURpc3RhbmNlTWV0OmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heChNYXRoLmFicyh0aGlzLl9tb3VzZURvd25FdmVudC5wYWdlWC1lLnBhZ2VYKSxNYXRoLmFicyh0aGlzLl9tb3VzZURvd25FdmVudC5wYWdlWS1lLnBhZ2VZKSk+PXRoaXMub3B0aW9ucy5kaXN0YW5jZX0sX21vdXNlRGVsYXlNZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tb3VzZURlbGF5TWV0fSxfbW91c2VTdGFydDpmdW5jdGlvbigpe30sX21vdXNlRHJhZzpmdW5jdGlvbigpe30sX21vdXNlU3RvcDpmdW5jdGlvbigpe30sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbigpe3JldHVybiEwfX0pLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHQsaSl7cmV0dXJuW3BhcnNlRmxvYXQoZVswXSkqKHAudGVzdChlWzBdKT90LzEwMDoxKSxwYXJzZUZsb2F0KGVbMV0pKihwLnRlc3QoZVsxXSk/aS8xMDA6MSldfWZ1bmN0aW9uIGkodCxpKXtyZXR1cm4gcGFyc2VJbnQoZS5jc3ModCxpKSwxMCl8fDB9ZnVuY3Rpb24gcyh0KXt2YXIgaT10WzBdO3JldHVybiA5PT09aS5ub2RlVHlwZT97d2lkdGg6dC53aWR0aCgpLGhlaWdodDp0LmhlaWdodCgpLG9mZnNldDp7dG9wOjAsbGVmdDowfX06ZS5pc1dpbmRvdyhpKT97d2lkdGg6dC53aWR0aCgpLGhlaWdodDp0LmhlaWdodCgpLG9mZnNldDp7dG9wOnQuc2Nyb2xsVG9wKCksbGVmdDp0LnNjcm9sbExlZnQoKX19OmkucHJldmVudERlZmF1bHQ/e3dpZHRoOjAsaGVpZ2h0OjAsb2Zmc2V0Ont0b3A6aS5wYWdlWSxsZWZ0OmkucGFnZVh9fTp7d2lkdGg6dC5vdXRlcldpZHRoKCksaGVpZ2h0OnQub3V0ZXJIZWlnaHQoKSxvZmZzZXQ6dC5vZmZzZXQoKX19ZS51aT1lLnVpfHx7fTt2YXIgbixhLG89TWF0aC5tYXgscj1NYXRoLmFicyxoPU1hdGgucm91bmQsbD0vbGVmdHxjZW50ZXJ8cmlnaHQvLHU9L3RvcHxjZW50ZXJ8Ym90dG9tLyxkPS9bXCtcLV1cZCsoXC5bXGRdKyk/JT8vLGM9L15cdysvLHA9LyUkLyxmPWUuZm4ucG9zaXRpb247ZS5wb3NpdGlvbj17c2Nyb2xsYmFyV2lkdGg6ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1uKXJldHVybiBuO3ZhciB0LGkscz1lKCI8ZGl2IHN0eWxlPSdkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6aGlkZGVuOyc+PGRpdiBzdHlsZT0naGVpZ2h0OjEwMHB4O3dpZHRoOmF1dG87Jz48L2Rpdj48L2Rpdj4iKSxhPXMuY2hpbGRyZW4oKVswXTtyZXR1cm4gZSgiYm9keSIpLmFwcGVuZChzKSx0PWEub2Zmc2V0V2lkdGgscy5jc3MoIm92ZXJmbG93Iiwic2Nyb2xsIiksaT1hLm9mZnNldFdpZHRoLHQ9PT1pJiYoaT1zWzBdLmNsaWVudFdpZHRoKSxzLnJlbW92ZSgpLG49dC1pfSxnZXRTY3JvbGxJbmZvOmZ1bmN0aW9uKHQpe3ZhciBpPXQuaXNXaW5kb3d8fHQuaXNEb2N1bWVudD8iIjp0LmVsZW1lbnQuY3NzKCJvdmVyZmxvdy14Iikscz10LmlzV2luZG93fHx0LmlzRG9jdW1lbnQ/IiI6dC5lbGVtZW50LmNzcygib3ZlcmZsb3cteSIpLG49InNjcm9sbCI9PT1pfHwiYXV0byI9PT1pJiZ0LndpZHRoPHQuZWxlbWVudFswXS5zY3JvbGxXaWR0aCxhPSJzY3JvbGwiPT09c3x8ImF1dG8iPT09cyYmdC5oZWlnaHQ8dC5lbGVtZW50WzBdLnNjcm9sbEhlaWdodDtyZXR1cm57d2lkdGg6YT9lLnBvc2l0aW9uLnNjcm9sbGJhcldpZHRoKCk6MCxoZWlnaHQ6bj9lLnBvc2l0aW9uLnNjcm9sbGJhcldpZHRoKCk6MH19LGdldFdpdGhpbkluZm86ZnVuY3Rpb24odCl7dmFyIGk9ZSh0fHx3aW5kb3cpLHM9ZS5pc1dpbmRvdyhpWzBdKSxuPSEhaVswXSYmOT09PWlbMF0ubm9kZVR5cGU7cmV0dXJue2VsZW1lbnQ6aSxpc1dpbmRvdzpzLGlzRG9jdW1lbnQ6bixvZmZzZXQ6aS5vZmZzZXQoKXx8e2xlZnQ6MCx0b3A6MH0sc2Nyb2xsTGVmdDppLnNjcm9sbExlZnQoKSxzY3JvbGxUb3A6aS5zY3JvbGxUb3AoKSx3aWR0aDpzfHxuP2kud2lkdGgoKTppLm91dGVyV2lkdGgoKSxoZWlnaHQ6c3x8bj9pLmhlaWdodCgpOmkub3V0ZXJIZWlnaHQoKX19fSxlLmZuLnBvc2l0aW9uPWZ1bmN0aW9uKG4pe2lmKCFufHwhbi5vZilyZXR1cm4gZi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bj1lLmV4dGVuZCh7fSxuKTt2YXIgcCxtLGcsdix5LGIsXz1lKG4ub2YpLHg9ZS5wb3NpdGlvbi5nZXRXaXRoaW5JbmZvKG4ud2l0aGluKSx3PWUucG9zaXRpb24uZ2V0U2Nyb2xsSW5mbyh4KSxrPShuLmNvbGxpc2lvbnx8ImZsaXAiKS5zcGxpdCgiICIpLFQ9e307cmV0dXJuIGI9cyhfKSxfWzBdLnByZXZlbnREZWZhdWx0JiYobi5hdD0ibGVmdCB0b3AiKSxtPWIud2lkdGgsZz1iLmhlaWdodCx2PWIub2Zmc2V0LHk9ZS5leHRlbmQoe30sdiksZS5lYWNoKFsibXkiLCJhdCJdLGZ1bmN0aW9uKCl7dmFyIGUsdCxpPShuW3RoaXNdfHwiIikuc3BsaXQoIiAiKTsxPT09aS5sZW5ndGgmJihpPWwudGVzdChpWzBdKT9pLmNvbmNhdChbImNlbnRlciJdKTp1LnRlc3QoaVswXSk/WyJjZW50ZXIiXS5jb25jYXQoaSk6WyJjZW50ZXIiLCJjZW50ZXIiXSksaVswXT1sLnRlc3QoaVswXSk/aVswXToiY2VudGVyIixpWzFdPXUudGVzdChpWzFdKT9pWzFdOiJjZW50ZXIiLGU9ZC5leGVjKGlbMF0pLHQ9ZC5leGVjKGlbMV0pLFRbdGhpc109W2U/ZVswXTowLHQ/dFswXTowXSxuW3RoaXNdPVtjLmV4ZWMoaVswXSlbMF0sYy5leGVjKGlbMV0pWzBdXX0pLDE9PT1rLmxlbmd0aCYmKGtbMV09a1swXSksInJpZ2h0Ij09PW4uYXRbMF0/eS5sZWZ0Kz1tOiJjZW50ZXIiPT09bi5hdFswXSYmKHkubGVmdCs9bS8yKSwiYm90dG9tIj09PW4uYXRbMV0/eS50b3ArPWc6ImNlbnRlciI9PT1uLmF0WzFdJiYoeS50b3ArPWcvMikscD10KFQuYXQsbSxnKSx5LmxlZnQrPXBbMF0seS50b3ArPXBbMV0sdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHMsbCx1PWUodGhpcyksZD11Lm91dGVyV2lkdGgoKSxjPXUub3V0ZXJIZWlnaHQoKSxmPWkodGhpcywibWFyZ2luTGVmdCIpLGI9aSh0aGlzLCJtYXJnaW5Ub3AiKSxEPWQrZitpKHRoaXMsIm1hcmdpblJpZ2h0Iikrdy53aWR0aCxTPWMrYitpKHRoaXMsIm1hcmdpbkJvdHRvbSIpK3cuaGVpZ2h0LE49ZS5leHRlbmQoe30seSksTT10KFQubXksdS5vdXRlcldpZHRoKCksdS5vdXRlckhlaWdodCgpKTsicmlnaHQiPT09bi5teVswXT9OLmxlZnQtPWQ6ImNlbnRlciI9PT1uLm15WzBdJiYoTi5sZWZ0LT1kLzIpLCJib3R0b20iPT09bi5teVsxXT9OLnRvcC09YzoiY2VudGVyIj09PW4ubXlbMV0mJihOLnRvcC09Yy8yKSxOLmxlZnQrPU1bMF0sTi50b3ArPU1bMV0sYXx8KE4ubGVmdD1oKE4ubGVmdCksTi50b3A9aChOLnRvcCkpLHM9e21hcmdpbkxlZnQ6ZixtYXJnaW5Ub3A6Yn0sZS5lYWNoKFsibGVmdCIsInRvcCJdLGZ1bmN0aW9uKHQsaSl7ZS51aS5wb3NpdGlvbltrW3RdXSYmZS51aS5wb3NpdGlvbltrW3RdXVtpXShOLHt0YXJnZXRXaWR0aDptLHRhcmdldEhlaWdodDpnLGVsZW1XaWR0aDpkLGVsZW1IZWlnaHQ6Yyxjb2xsaXNpb25Qb3NpdGlvbjpzLGNvbGxpc2lvbldpZHRoOkQsY29sbGlzaW9uSGVpZ2h0OlMsb2Zmc2V0OltwWzBdK01bMF0scFsxXStNWzFdXSxteTpuLm15LGF0Om4uYXQsd2l0aGluOngsZWxlbTp1fSl9KSxuLnVzaW5nJiYobD1mdW5jdGlvbihlKXt2YXIgdD12LmxlZnQtTi5sZWZ0LGk9dCttLWQscz12LnRvcC1OLnRvcCxhPXMrZy1jLGg9e3RhcmdldDp7ZWxlbWVudDpfLGxlZnQ6di5sZWZ0LHRvcDp2LnRvcCx3aWR0aDptLGhlaWdodDpnfSxlbGVtZW50OntlbGVtZW50OnUsbGVmdDpOLmxlZnQsdG9wOk4udG9wLHdpZHRoOmQsaGVpZ2h0OmN9LGhvcml6b250YWw6MD5pPyJsZWZ0Ijp0PjA/InJpZ2h0IjoiY2VudGVyIix2ZXJ0aWNhbDowPmE/InRvcCI6cz4wPyJib3R0b20iOiJtaWRkbGUifTtkPm0mJm0+cih0K2kpJiYoaC5ob3Jpem9udGFsPSJjZW50ZXIiKSxjPmcmJmc+cihzK2EpJiYoaC52ZXJ0aWNhbD0ibWlkZGxlIiksaC5pbXBvcnRhbnQ9byhyKHQpLHIoaSkpPm8ocihzKSxyKGEpKT8iaG9yaXpvbnRhbCI6InZlcnRpY2FsIixuLnVzaW5nLmNhbGwodGhpcyxlLGgpfSksdS5vZmZzZXQoZS5leHRlbmQoTix7dXNpbmc6bH0pKX0pfSxlLnVpLnBvc2l0aW9uPXtmaXQ6e2xlZnQ6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzPXQud2l0aGluLG49cy5pc1dpbmRvdz9zLnNjcm9sbExlZnQ6cy5vZmZzZXQubGVmdCxhPXMud2lkdGgscj1lLmxlZnQtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5MZWZ0LGg9bi1yLGw9cit0LmNvbGxpc2lvbldpZHRoLWEtbjt0LmNvbGxpc2lvbldpZHRoPmE/aD4wJiYwPj1sPyhpPWUubGVmdCtoK3QuY29sbGlzaW9uV2lkdGgtYS1uLGUubGVmdCs9aC1pKTplLmxlZnQ9bD4wJiYwPj1oP246aD5sP24rYS10LmNvbGxpc2lvbldpZHRoOm46aD4wP2UubGVmdCs9aDpsPjA/ZS5sZWZ0LT1sOmUubGVmdD1vKGUubGVmdC1yLGUubGVmdCl9LHRvcDpmdW5jdGlvbihlLHQpe3ZhciBpLHM9dC53aXRoaW4sbj1zLmlzV2luZG93P3Muc2Nyb2xsVG9wOnMub2Zmc2V0LnRvcCxhPXQud2l0aGluLmhlaWdodCxyPWUudG9wLXQuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luVG9wLGg9bi1yLGw9cit0LmNvbGxpc2lvbkhlaWdodC1hLW47dC5jb2xsaXNpb25IZWlnaHQ+YT9oPjAmJjA+PWw/KGk9ZS50b3AraCt0LmNvbGxpc2lvbkhlaWdodC1hLW4sZS50b3ArPWgtaSk6ZS50b3A9bD4wJiYwPj1oP246aD5sP24rYS10LmNvbGxpc2lvbkhlaWdodDpuOmg+MD9lLnRvcCs9aDpsPjA/ZS50b3AtPWw6ZS50b3A9byhlLnRvcC1yLGUudG9wKX19LGZsaXA6e2xlZnQ6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzLG49dC53aXRoaW4sYT1uLm9mZnNldC5sZWZ0K24uc2Nyb2xsTGVmdCxvPW4ud2lkdGgsaD1uLmlzV2luZG93P24uc2Nyb2xsTGVmdDpuLm9mZnNldC5sZWZ0LGw9ZS5sZWZ0LXQuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luTGVmdCx1PWwtaCxkPWwrdC5jb2xsaXNpb25XaWR0aC1vLWgsYz0ibGVmdCI9PT10Lm15WzBdPy10LmVsZW1XaWR0aDoicmlnaHQiPT09dC5teVswXT90LmVsZW1XaWR0aDowLHA9ImxlZnQiPT09dC5hdFswXT90LnRhcmdldFdpZHRoOiJyaWdodCI9PT10LmF0WzBdPy10LnRhcmdldFdpZHRoOjAsZj0tMip0Lm9mZnNldFswXTswPnU/KGk9ZS5sZWZ0K2MrcCtmK3QuY29sbGlzaW9uV2lkdGgtby1hLCgwPml8fHIodSk+aSkmJihlLmxlZnQrPWMrcCtmKSk6ZD4wJiYocz1lLmxlZnQtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5MZWZ0K2MrcCtmLWgsKHM+MHx8ZD5yKHMpKSYmKGUubGVmdCs9YytwK2YpKX0sdG9wOmZ1bmN0aW9uKGUsdCl7dmFyIGkscyxuPXQud2l0aGluLGE9bi5vZmZzZXQudG9wK24uc2Nyb2xsVG9wLG89bi5oZWlnaHQsaD1uLmlzV2luZG93P24uc2Nyb2xsVG9wOm4ub2Zmc2V0LnRvcCxsPWUudG9wLXQuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luVG9wLHU9bC1oLGQ9bCt0LmNvbGxpc2lvbkhlaWdodC1vLWgsYz0idG9wIj09PXQubXlbMV0scD1jPy10LmVsZW1IZWlnaHQ6ImJvdHRvbSI9PT10Lm15WzFdP3QuZWxlbUhlaWdodDowLGY9InRvcCI9PT10LmF0WzFdP3QudGFyZ2V0SGVpZ2h0OiJib3R0b20iPT09dC5hdFsxXT8tdC50YXJnZXRIZWlnaHQ6MCxtPS0yKnQub2Zmc2V0WzFdOzA+dT8ocz1lLnRvcCtwK2YrbSt0LmNvbGxpc2lvbkhlaWdodC1vLWEsKDA+c3x8cih1KT5zKSYmKGUudG9wKz1wK2YrbSkpOmQ+MCYmKGk9ZS50b3AtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5Ub3ArcCtmK20taCwoaT4wfHxkPnIoaSkpJiYoZS50b3ArPXArZittKSl9fSxmbGlwZml0OntsZWZ0OmZ1bmN0aW9uKCl7ZS51aS5wb3NpdGlvbi5mbGlwLmxlZnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudWkucG9zaXRpb24uZml0LmxlZnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0b3A6ZnVuY3Rpb24oKXtlLnVpLnBvc2l0aW9uLmZsaXAudG9wLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnVpLnBvc2l0aW9uLmZpdC50b3AuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19LGZ1bmN0aW9uKCl7dmFyIHQsaSxzLG4sbyxyPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0saD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocj8iZGl2IjoiYm9keSIpLHM9e3Zpc2liaWxpdHk6ImhpZGRlbiIsd2lkdGg6MCxoZWlnaHQ6MCxib3JkZXI6MCxtYXJnaW46MCxiYWNrZ3JvdW5kOiJub25lIn0sciYmZS5leHRlbmQocyx7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OiItMTAwMHB4Iix0b3A6Ii0xMDAwcHgifSk7Zm9yKG8gaW4gcyl0LnN0eWxlW29dPXNbb107dC5hcHBlbmRDaGlsZChoKSxpPXJ8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxpLmluc2VydEJlZm9yZSh0LGkuZmlyc3RDaGlsZCksaC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDEwLjc0MzIyMjJweDsiLG49ZShoKS5vZmZzZXQoKS5sZWZ0LGE9bj4xMCYmMTE+bix0LmlubmVySFRNTD0iIixpLnJlbW92ZUNoaWxkKHQpfSgpfSgpLGUudWkucG9zaXRpb24sZS53aWRnZXQoInVpLmRyYWdnYWJsZSIsZS51aS5tb3VzZSx7dmVyc2lvbjoiMS4xMS40Iix3aWRnZXRFdmVudFByZWZpeDoiZHJhZyIsb3B0aW9uczp7YWRkQ2xhc3NlczohMCxhcHBlbmRUbzoicGFyZW50IixheGlzOiExLGNvbm5lY3RUb1NvcnRhYmxlOiExLGNvbnRhaW5tZW50OiExLGN1cnNvcjoiYXV0byIsY3Vyc29yQXQ6ITEsZ3JpZDohMSxoYW5kbGU6ITEsaGVscGVyOiJvcmlnaW5hbCIsaWZyYW1lRml4OiExLG9wYWNpdHk6ITEscmVmcmVzaFBvc2l0aW9uczohMSxyZXZlcnQ6ITEscmV2ZXJ0RHVyYXRpb246NTAwLHNjb3BlOiJkZWZhdWx0IixzY3JvbGw6ITAsc2Nyb2xsU2Vuc2l0aXZpdHk6MjAsc2Nyb2xsU3BlZWQ6MjAsc25hcDohMSxzbmFwTW9kZToiYm90aCIsc25hcFRvbGVyYW5jZToyMCxzdGFjazohMSx6SW5kZXg6ITEsZHJhZzpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7Im9yaWdpbmFsIj09PXRoaXMub3B0aW9ucy5oZWxwZXImJnRoaXMuX3NldFBvc2l0aW9uUmVsYXRpdmUoKSx0aGlzLm9wdGlvbnMuYWRkQ2xhc3NlcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUiKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJhZ2dhYmxlLWRpc2FibGVkIiksdGhpcy5fc2V0SGFuZGxlQ2xhc3NOYW1lKCksdGhpcy5fbW91c2VJbml0KCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLl9zdXBlcihlLHQpLCJoYW5kbGUiPT09ZSYmKHRoaXMuX3JlbW92ZUhhbmRsZUNsYXNzTmFtZSgpLHRoaXMuX3NldEhhbmRsZUNsYXNzTmFtZSgpKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5oZWxwZXJ8fHRoaXMuZWxlbWVudCkuaXMoIi51aS1kcmFnZ2FibGUtZHJhZ2dpbmciKT8odGhpcy5kZXN0cm95T25DbGVhcj0hMCx2b2lkIDApOih0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWRyYWdnYWJsZSB1aS1kcmFnZ2FibGUtZHJhZ2dpbmcgdWktZHJhZ2dhYmxlLWRpc2FibGVkIiksdGhpcy5fcmVtb3ZlSGFuZGxlQ2xhc3NOYW1lKCksdGhpcy5fbW91c2VEZXN0cm95KCksdm9pZCAwKX0sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnM7cmV0dXJuIHRoaXMuX2JsdXJBY3RpdmVFbGVtZW50KHQpLHRoaXMuaGVscGVyfHxpLmRpc2FibGVkfHxlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktcmVzaXphYmxlLWhhbmRsZSIpLmxlbmd0aD4wPyExOih0aGlzLmhhbmRsZT10aGlzLl9nZXRIYW5kbGUodCksdGhpcy5oYW5kbGU/KHRoaXMuX2Jsb2NrRnJhbWVzKGkuaWZyYW1lRml4PT09ITA/ImlmcmFtZSI6aS5pZnJhbWVGaXgpLCEwKTohMSl9LF9ibG9ja0ZyYW1lczpmdW5jdGlvbih0KXt0aGlzLmlmcmFtZUJsb2Nrcz10aGlzLmRvY3VtZW50LmZpbmQodCkubWFwKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtyZXR1cm4gZSgiPGRpdj4iKS5jc3MoInBvc2l0aW9uIiwiYWJzb2x1dGUiKS5hcHBlbmRUbyh0LnBhcmVudCgpKS5vdXRlcldpZHRoKHQub3V0ZXJXaWR0aCgpKS5vdXRlckhlaWdodCh0Lm91dGVySGVpZ2h0KCkpLm9mZnNldCh0Lm9mZnNldCgpKVswXX0pfSxfdW5ibG9ja0ZyYW1lczpmdW5jdGlvbigpe3RoaXMuaWZyYW1lQmxvY2tzJiYodGhpcy5pZnJhbWVCbG9ja3MucmVtb3ZlKCksZGVsZXRlIHRoaXMuaWZyYW1lQmxvY2tzKX0sX2JsdXJBY3RpdmVFbGVtZW50OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZG9jdW1lbnRbMF07aWYodGhpcy5oYW5kbGVFbGVtZW50LmlzKHQudGFyZ2V0KSl0cnl7aS5hY3RpdmVFbGVtZW50JiYiYm9keSIhPT1pLmFjdGl2ZUVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmZShpLmFjdGl2ZUVsZW1lbnQpLmJsdXIoKX1jYXRjaChzKXt9fSxfbW91c2VTdGFydDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnM7cmV0dXJuIHRoaXMuaGVscGVyPXRoaXMuX2NyZWF0ZUhlbHBlcih0KSx0aGlzLmhlbHBlci5hZGRDbGFzcygidWktZHJhZ2dhYmxlLWRyYWdnaW5nIiksdGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpLGUudWkuZGRtYW5hZ2VyJiYoZS51aS5kZG1hbmFnZXIuY3VycmVudD10aGlzKSx0aGlzLl9jYWNoZU1hcmdpbnMoKSx0aGlzLmNzc1Bvc2l0aW9uPXRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iKSx0aGlzLnNjcm9sbFBhcmVudD10aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoITApLHRoaXMub2Zmc2V0UGFyZW50PXRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpLHRoaXMuaGFzRml4ZWRBbmNlc3Rvcj10aGlzLmhlbHBlci5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuImZpeGVkIj09PWUodGhpcykuY3NzKCJwb3NpdGlvbiIpfSkubGVuZ3RoPjAsdGhpcy5wb3NpdGlvbkFicz10aGlzLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5fcmVmcmVzaE9mZnNldHModCksdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXRoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbih0LCExKSx0aGlzLm9yaWdpbmFsUGFnZVg9dC5wYWdlWCx0aGlzLm9yaWdpbmFsUGFnZVk9dC5wYWdlWSxpLmN1cnNvckF0JiZ0aGlzLl9hZGp1c3RPZmZzZXRGcm9tSGVscGVyKGkuY3Vyc29yQXQpLHRoaXMuX3NldENvbnRhaW5tZW50KCksdGhpcy5fdHJpZ2dlcigic3RhcnQiLHQpPT09ITE/KHRoaXMuX2NsZWFyKCksITEpOih0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksZS51aS5kZG1hbmFnZXImJiFpLmRyb3BCZWhhdmlvdXImJmUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsdCksdGhpcy5fbm9ybWFsaXplUmlnaHRCb3R0b20oKSx0aGlzLl9tb3VzZURyYWcodCwhMCksZS51aS5kZG1hbmFnZXImJmUudWkuZGRtYW5hZ2VyLmRyYWdTdGFydCh0aGlzLHQpLCEwKX0sX3JlZnJlc2hPZmZzZXRzOmZ1bmN0aW9uKGUpe3RoaXMub2Zmc2V0PXt0b3A6dGhpcy5wb3NpdGlvbkFicy50b3AtdGhpcy5tYXJnaW5zLnRvcCxsZWZ0OnRoaXMucG9zaXRpb25BYnMubGVmdC10aGlzLm1hcmdpbnMubGVmdCxzY3JvbGw6ITEscGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9LHRoaXMub2Zmc2V0LmNsaWNrPXtsZWZ0OmUucGFnZVgtdGhpcy5vZmZzZXQubGVmdCx0b3A6ZS5wYWdlWS10aGlzLm9mZnNldC50b3B9fSxfbW91c2VEcmFnOmZ1bmN0aW9uKHQsaSl7aWYodGhpcy5oYXNGaXhlZEFuY2VzdG9yJiYodGhpcy5vZmZzZXQucGFyZW50PXRoaXMuX2dldFBhcmVudE9mZnNldCgpKSx0aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24odCwhMCksdGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKSwhaSl7dmFyIHM9dGhpcy5fdWlIYXNoKCk7aWYodGhpcy5fdHJpZ2dlcigiZHJhZyIsdCxzKT09PSExKXJldHVybiB0aGlzLl9tb3VzZVVwKHt9KSwhMTt0aGlzLnBvc2l0aW9uPXMucG9zaXRpb259cmV0dXJuIHRoaXMuaGVscGVyWzBdLnN0eWxlLmxlZnQ9dGhpcy5wb3NpdGlvbi5sZWZ0KyJweCIsdGhpcy5oZWxwZXJbMF0uc3R5bGUudG9wPXRoaXMucG9zaXRpb24udG9wKyJweCIsZS51aS5kZG1hbmFnZXImJmUudWkuZGRtYW5hZ2VyLmRyYWcodGhpcyx0KSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLHM9ITE7cmV0dXJuIGUudWkuZGRtYW5hZ2VyJiYhdGhpcy5vcHRpb25zLmRyb3BCZWhhdmlvdXImJihzPWUudWkuZGRtYW5hZ2VyLmRyb3AodGhpcyx0KSksdGhpcy5kcm9wcGVkJiYocz10aGlzLmRyb3BwZWQsdGhpcy5kcm9wcGVkPSExKSwiaW52YWxpZCI9PT10aGlzLm9wdGlvbnMucmV2ZXJ0JiYhc3x8InZhbGlkIj09PXRoaXMub3B0aW9ucy5yZXZlcnQmJnN8fHRoaXMub3B0aW9ucy5yZXZlcnQ9PT0hMHx8ZS5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5yZXZlcnQpJiZ0aGlzLm9wdGlvbnMucmV2ZXJ0LmNhbGwodGhpcy5lbGVtZW50LHMpP2UodGhpcy5oZWxwZXIpLmFuaW1hdGUodGhpcy5vcmlnaW5hbFBvc2l0aW9uLHBhcnNlSW50KHRoaXMub3B0aW9ucy5yZXZlcnREdXJhdGlvbiwxMCksZnVuY3Rpb24oKXtpLl90cmlnZ2VyKCJzdG9wIix0KSE9PSExJiZpLl9jbGVhcigpfSk6dGhpcy5fdHJpZ2dlcigic3RvcCIsdCkhPT0hMSYmdGhpcy5fY2xlYXIoKSwhMX0sX21vdXNlVXA6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3VuYmxvY2tGcmFtZXMoKSxlLnVpLmRkbWFuYWdlciYmZS51aS5kZG1hbmFnZXIuZHJhZ1N0b3AodGhpcyx0KSx0aGlzLmhhbmRsZUVsZW1lbnQuaXModC50YXJnZXQpJiZ0aGlzLmVsZW1lbnQuZm9jdXMoKSxlLnVpLm1vdXNlLnByb3RvdHlwZS5fbW91c2VVcC5jYWxsKHRoaXMsdCl9LGNhbmNlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhlbHBlci5pcygiLnVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpP3RoaXMuX21vdXNlVXAoe30pOnRoaXMuX2NsZWFyKCksdGhpc30sX2dldEhhbmRsZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLmhhbmRsZT8hIWUodC50YXJnZXQpLmNsb3Nlc3QodGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLmhhbmRsZSkpLmxlbmd0aDohMH0sX3NldEhhbmRsZUNsYXNzTmFtZTpmdW5jdGlvbigpe3RoaXMuaGFuZGxlRWxlbWVudD10aGlzLm9wdGlvbnMuaGFuZGxlP3RoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5oYW5kbGUpOnRoaXMuZWxlbWVudCx0aGlzLmhhbmRsZUVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZS1oYW5kbGUiKX0sX3JlbW92ZUhhbmRsZUNsYXNzTmFtZTpmdW5jdGlvbigpe3RoaXMuaGFuZGxlRWxlbWVudC5yZW1vdmVDbGFzcygidWktZHJhZ2dhYmxlLWhhbmRsZSIpfSxfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucyxzPWUuaXNGdW5jdGlvbihpLmhlbHBlciksbj1zP2UoaS5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFt0XSkpOiJjbG9uZSI9PT1pLmhlbHBlcj90aGlzLmVsZW1lbnQuY2xvbmUoKS5yZW1vdmVBdHRyKCJpZCIpOnRoaXMuZWxlbWVudDtyZXR1cm4gbi5wYXJlbnRzKCJib2R5IikubGVuZ3RofHxuLmFwcGVuZFRvKCJwYXJlbnQiPT09aS5hcHBlbmRUbz90aGlzLmVsZW1lbnRbMF0ucGFyZW50Tm9kZTppLmFwcGVuZFRvKSxzJiZuWzBdPT09dGhpcy5lbGVtZW50WzBdJiZ0aGlzLl9zZXRQb3NpdGlvblJlbGF0aXZlKCksblswXT09PXRoaXMuZWxlbWVudFswXXx8LyhmaXhlZHxhYnNvbHV0ZSkvLnRlc3Qobi5jc3MoInBvc2l0aW9uIikpfHxuLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLG59LF9zZXRQb3NpdGlvblJlbGF0aXZlOmZ1bmN0aW9uKCl7L14oPzpyfGF8ZikvLnRlc3QodGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24iKSl8fCh0aGlzLmVsZW1lbnRbMF0uc3R5bGUucG9zaXRpb249InJlbGF0aXZlIil9LF9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOmZ1bmN0aW9uKHQpeyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC5zcGxpdCgiICIpKSxlLmlzQXJyYXkodCkmJih0PXtsZWZ0Oit0WzBdLHRvcDordFsxXXx8MH0pLCJsZWZ0ImluIHQmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXQubGVmdCt0aGlzLm1hcmdpbnMubGVmdCksInJpZ2h0ImluIHQmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdC5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksInRvcCJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPXQudG9wK3RoaXMubWFyZ2lucy50b3ApLCJib3R0b20iaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10LmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wKX0sX2lzUm9vdE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuLyhodG1sfGJvZHkpL2kudGVzdChlLnRhZ05hbWUpfHxlPT09dGhpcy5kb2N1bWVudFswXX0sX2dldFBhcmVudE9mZnNldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpLGk9dGhpcy5kb2N1bWVudFswXTtyZXR1cm4iYWJzb2x1dGUiPT09dGhpcy5jc3NQb3NpdGlvbiYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPT1pJiZlLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKHQubGVmdCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpLHQudG9wKz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSksdGhpcy5faXNSb290Tm9kZSh0aGlzLm9mZnNldFBhcmVudFswXSkmJih0PXt0b3A6MCxsZWZ0OjB9KSx7dG9wOnQudG9wKyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSxsZWZ0OnQubGVmdCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApfX0sX2dldFJlbGF0aXZlT2Zmc2V0OmZ1bmN0aW9uKCl7aWYoInJlbGF0aXZlIiE9PXRoaXMuY3NzUG9zaXRpb24pcmV0dXJue3RvcDowLGxlZnQ6MH07dmFyIGU9dGhpcy5lbGVtZW50LnBvc2l0aW9uKCksdD10aGlzLl9pc1Jvb3ROb2RlKHRoaXMuc2Nyb2xsUGFyZW50WzBdKTtyZXR1cm57dG9wOmUudG9wLShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoInRvcCIpLDEwKXx8MCkrKHQ/MDp0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSksbGVmdDplLmxlZnQtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygibGVmdCIpLDEwKXx8MCkrKHQ/MDp0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCkpfX0sX2NhY2hlTWFyZ2luczpmdW5jdGlvbigpe3RoaXMubWFyZ2lucz17bGVmdDpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5MZWZ0IiksMTApfHwwLHRvcDpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5Ub3AiKSwxMCl8fDAscmlnaHQ6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luUmlnaHQiKSwxMCl8fDAsYm90dG9tOnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpbkJvdHRvbSIpLDEwKXx8MH19LF9jYWNoZUhlbHBlclByb3BvcnRpb25zOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXJQcm9wb3J0aW9ucz17d2lkdGg6dGhpcy5oZWxwZXIub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmhlbHBlci5vdXRlckhlaWdodCgpfX0sX3NldENvbnRhaW5tZW50OmZ1bmN0aW9uKCl7dmFyIHQsaSxzLG49dGhpcy5vcHRpb25zLGE9dGhpcy5kb2N1bWVudFswXTtyZXR1cm4gdGhpcy5yZWxhdGl2ZUNvbnRhaW5lcj1udWxsLG4uY29udGFpbm1lbnQ/IndpbmRvdyI9PT1uLmNvbnRhaW5tZW50Pyh0aGlzLmNvbnRhaW5tZW50PVtlKHdpbmRvdykuc2Nyb2xsTGVmdCgpLXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQsZSh3aW5kb3cpLnNjcm9sbFRvcCgpLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLGUod2luZG93KS5zY3JvbGxMZWZ0KCkrZSh3aW5kb3cpLndpZHRoKCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCxlKHdpbmRvdykuc2Nyb2xsVG9wKCkrKGUod2luZG93KS5oZWlnaHQoKXx8YS5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0KS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXSx2b2lkIDApOiJkb2N1bWVudCI9PT1uLmNvbnRhaW5tZW50Pyh0aGlzLmNvbnRhaW5tZW50PVswLDAsZShhKS53aWR0aCgpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdGhpcy5tYXJnaW5zLmxlZnQsKGUoYSkuaGVpZ2h0KCl8fGEuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF0sdm9pZCAwKTpuLmNvbnRhaW5tZW50LmNvbnN0cnVjdG9yPT09QXJyYXk/KHRoaXMuY29udGFpbm1lbnQ9bi5jb250YWlubWVudCx2b2lkIDApOigicGFyZW50Ij09PW4uY29udGFpbm1lbnQmJihuLmNvbnRhaW5tZW50PXRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUpLGk9ZShuLmNvbnRhaW5tZW50KSxzPWlbMF0scyYmKHQ9LyhzY3JvbGx8YXV0bykvLnRlc3QoaS5jc3MoIm92ZXJmbG93IikpLHRoaXMuY29udGFpbm1lbnQ9WyhwYXJzZUludChpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoaS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKSwocGFyc2VJbnQoaS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoaS5jc3MoInBhZGRpbmdUb3AiKSwxMCl8fDApLCh0P01hdGgubWF4KHMuc2Nyb2xsV2lkdGgscy5vZmZzZXRXaWR0aCk6cy5vZmZzZXRXaWR0aCktKHBhcnNlSW50KGkuY3NzKCJib3JkZXJSaWdodFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoaS5jc3MoInBhZGRpbmdSaWdodCIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdC10aGlzLm1hcmdpbnMucmlnaHQsKHQ/TWF0aC5tYXgocy5zY3JvbGxIZWlnaHQscy5vZmZzZXRIZWlnaHQpOnMub2Zmc2V0SGVpZ2h0KS0ocGFyc2VJbnQoaS5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoaS5jc3MoInBhZGRpbmdCb3R0b20iKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3AtdGhpcy5tYXJnaW5zLmJvdHRvbV0sdGhpcy5yZWxhdGl2ZUNvbnRhaW5lcj1pKSx2b2lkIDApOih0aGlzLmNvbnRhaW5tZW50PW51bGwsdm9pZCAwKX0sX2NvbnZlcnRQb3NpdGlvblRvOmZ1bmN0aW9uKGUsdCl7dHx8KHQ9dGhpcy5wb3NpdGlvbik7dmFyIGk9ImFic29sdXRlIj09PWU/MTotMSxzPXRoaXMuX2lzUm9vdE5vZGUodGhpcy5zY3JvbGxQYXJlbnRbMF0pO3JldHVybnt0b3A6dC50b3ArdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wKmkrdGhpcy5vZmZzZXQucGFyZW50LnRvcCppLSgiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5vZmZzZXQuc2Nyb2xsLnRvcDpzPzA6dGhpcy5vZmZzZXQuc2Nyb2xsLnRvcCkqaSxsZWZ0OnQubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KmkrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqaS0oImZpeGVkIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMub2Zmc2V0LnNjcm9sbC5sZWZ0OnM/MDp0aGlzLm9mZnNldC5zY3JvbGwubGVmdCkqaX19LF9nZW5lcmF0ZVBvc2l0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIGkscyxuLGEsbz10aGlzLm9wdGlvbnMscj10aGlzLl9pc1Jvb3ROb2RlKHRoaXMuc2Nyb2xsUGFyZW50WzBdKSxoPWUucGFnZVgsbD1lLnBhZ2VZO3JldHVybiByJiZ0aGlzLm9mZnNldC5zY3JvbGx8fCh0aGlzLm9mZnNldC5zY3JvbGw9e3RvcDp0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSxsZWZ0OnRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX0pLHQmJih0aGlzLmNvbnRhaW5tZW50JiYodGhpcy5yZWxhdGl2ZUNvbnRhaW5lcj8ocz10aGlzLnJlbGF0aXZlQ29udGFpbmVyLm9mZnNldCgpLGk9W3RoaXMuY29udGFpbm1lbnRbMF0rcy5sZWZ0LHRoaXMuY29udGFpbm1lbnRbMV0rcy50b3AsdGhpcy5jb250YWlubWVudFsyXStzLmxlZnQsdGhpcy5jb250YWlubWVudFszXStzLnRvcF0pOmk9dGhpcy5jb250YWlubWVudCxlLnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8aVswXSYmKGg9aVswXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0KSxlLnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDxpWzFdJiYobD1pWzFdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCksZS5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PmlbMl0mJihoPWlbMl0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksZS5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A+aVszXSYmKGw9aVszXSt0aGlzLm9mZnNldC5jbGljay50b3ApKSxvLmdyaWQmJihuPW8uZ3JpZFsxXT90aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgobC10aGlzLm9yaWdpbmFsUGFnZVkpL28uZ3JpZFsxXSkqby5ncmlkWzFdOnRoaXMub3JpZ2luYWxQYWdlWSxsPWk/bi10aGlzLm9mZnNldC5jbGljay50b3A+PWlbMV18fG4tdGhpcy5vZmZzZXQuY2xpY2sudG9wPmlbM10/bjpuLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD49aVsxXT9uLW8uZ3JpZFsxXTpuK28uZ3JpZFsxXTpuLGE9by5ncmlkWzBdP3RoaXMub3JpZ2luYWxQYWdlWCtNYXRoLnJvdW5kKChoLXRoaXMub3JpZ2luYWxQYWdlWCkvby5ncmlkWzBdKSpvLmdyaWRbMF06dGhpcy5vcmlnaW5hbFBhZ2VYLGg9aT9hLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+PWlbMF18fGEtdGhpcy5vZmZzZXQuY2xpY2subGVmdD5pWzJdP2E6YS10aGlzLm9mZnNldC5jbGljay5sZWZ0Pj1pWzBdP2Etby5ncmlkWzBdOmErby5ncmlkWzBdOmEpLCJ5Ij09PW8uYXhpcyYmKGg9dGhpcy5vcmlnaW5hbFBhZ2VYKSwieCI9PT1vLmF4aXMmJihsPXRoaXMub3JpZ2luYWxQYWdlWSkpLHt0b3A6bC10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKCJmaXhlZCI9PT10aGlzLmNzc1Bvc2l0aW9uPy10aGlzLm9mZnNldC5zY3JvbGwudG9wOnI/MDp0aGlzLm9mZnNldC5zY3JvbGwudG9wKSxsZWZ0OmgtdGhpcy5vZmZzZXQuY2xpY2subGVmdC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KygiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5vZmZzZXQuc2Nyb2xsLmxlZnQ6cj8wOnRoaXMub2Zmc2V0LnNjcm9sbC5sZWZ0KX19LF9jbGVhcjpmdW5jdGlvbigpe3RoaXMuaGVscGVyLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKSx0aGlzLmhlbHBlclswXT09PXRoaXMuZWxlbWVudFswXXx8dGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsfHx0aGlzLmhlbHBlci5yZW1vdmUoKSx0aGlzLmhlbHBlcj1udWxsLHRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSx0aGlzLmRlc3Ryb3lPbkNsZWFyJiZ0aGlzLmRlc3Ryb3koKX0sX25vcm1hbGl6ZVJpZ2h0Qm90dG9tOmZ1bmN0aW9uKCl7InkiIT09dGhpcy5vcHRpb25zLmF4aXMmJiJhdXRvIiE9PXRoaXMuaGVscGVyLmNzcygicmlnaHQiKSYmKHRoaXMuaGVscGVyLndpZHRoKHRoaXMuaGVscGVyLndpZHRoKCkpLHRoaXMuaGVscGVyLmNzcygicmlnaHQiLCJhdXRvIikpLCJ4IiE9PXRoaXMub3B0aW9ucy5heGlzJiYiYXV0byIhPT10aGlzLmhlbHBlci5jc3MoImJvdHRvbSIpJiYodGhpcy5oZWxwZXIuaGVpZ2h0KHRoaXMuaGVscGVyLmhlaWdodCgpKSx0aGlzLmhlbHBlci5jc3MoImJvdHRvbSIsImF1dG8iKSl9LF90cmlnZ2VyOmZ1bmN0aW9uKHQsaSxzKXtyZXR1cm4gcz1zfHx0aGlzLl91aUhhc2goKSxlLnVpLnBsdWdpbi5jYWxsKHRoaXMsdCxbaSxzLHRoaXNdLCEwKSwvXihkcmFnfHN0YXJ0fHN0b3ApLy50ZXN0KHQpJiYodGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKSxzLm9mZnNldD10aGlzLnBvc2l0aW9uQWJzKSxlLldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuY2FsbCh0aGlzLHQsaSxzKX0scGx1Z2luczp7fSxfdWlIYXNoOmZ1bmN0aW9uKCl7cmV0dXJue2hlbHBlcjp0aGlzLmhlbHBlcixwb3NpdGlvbjp0aGlzLnBvc2l0aW9uLG9yaWdpbmFsUG9zaXRpb246dGhpcy5vcmlnaW5hbFBvc2l0aW9uLG9mZnNldDp0aGlzLnBvc2l0aW9uQWJzfX19KSxlLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsImNvbm5lY3RUb1NvcnRhYmxlIix7c3RhcnQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPWUuZXh0ZW5kKHt9LGkse2l0ZW06cy5lbGVtZW50fSk7cy5zb3J0YWJsZXM9W10sZShzLm9wdGlvbnMuY29ubmVjdFRvU29ydGFibGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1lKHRoaXMpLnNvcnRhYmxlKCJpbnN0YW5jZSIpO2kmJiFpLm9wdGlvbnMuZGlzYWJsZWQmJihzLnNvcnRhYmxlcy5wdXNoKGkpLGkucmVmcmVzaFBvc2l0aW9ucygpLGkuX3RyaWdnZXIoImFjdGl2YXRlIix0LG4pKX0pfSxzdG9wOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1lLmV4dGVuZCh7fSxpLHtpdGVtOnMuZWxlbWVudH0pO3MuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSxlLmVhY2gocy5zb3J0YWJsZXMsZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuaXNPdmVyPyhlLmlzT3Zlcj0wLHMuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMCxlLmNhbmNlbEhlbHBlclJlbW92YWw9ITEsZS5fc3RvcmVkQ1NTPXtwb3NpdGlvbjplLnBsYWNlaG9sZGVyLmNzcygicG9zaXRpb24iKSx0b3A6ZS5wbGFjZWhvbGRlci5jc3MoInRvcCIpLGxlZnQ6ZS5wbGFjZWhvbGRlci5jc3MoImxlZnQiKX0sZS5fbW91c2VTdG9wKHQpLGUub3B0aW9ucy5oZWxwZXI9ZS5vcHRpb25zLl9oZWxwZXIpOihlLmNhbmNlbEhlbHBlclJlbW92YWw9ITAsZS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsdCxuKSl9KX0sZHJhZzpmdW5jdGlvbih0LGkscyl7ZS5lYWNoKHMuc29ydGFibGVzLGZ1bmN0aW9uKCl7dmFyIG49ITEsYT10aGlzO2EucG9zaXRpb25BYnM9cy5wb3NpdGlvbkFicyxhLmhlbHBlclByb3BvcnRpb25zPXMuaGVscGVyUHJvcG9ydGlvbnMsYS5vZmZzZXQuY2xpY2s9cy5vZmZzZXQuY2xpY2ssYS5faW50ZXJzZWN0c1dpdGgoYS5jb250YWluZXJDYWNoZSkmJihuPSEwLGUuZWFjaChzLnNvcnRhYmxlcyxmdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uQWJzPXMucG9zaXRpb25BYnMsdGhpcy5oZWxwZXJQcm9wb3J0aW9ucz1zLmhlbHBlclByb3BvcnRpb25zLHRoaXMub2Zmc2V0LmNsaWNrPXMub2Zmc2V0LmNsaWNrLHRoaXMhPT1hJiZ0aGlzLl9pbnRlcnNlY3RzV2l0aCh0aGlzLmNvbnRhaW5lckNhY2hlKSYmZS5jb250YWlucyhhLmVsZW1lbnRbMF0sdGhpcy5lbGVtZW50WzBdKSYmKG49ITEpLG4KfSkpLG4/KGEuaXNPdmVyfHwoYS5pc092ZXI9MSxzLl9wYXJlbnQ9aS5oZWxwZXIucGFyZW50KCksYS5jdXJyZW50SXRlbT1pLmhlbHBlci5hcHBlbmRUbyhhLmVsZW1lbnQpLmRhdGEoInVpLXNvcnRhYmxlLWl0ZW0iLCEwKSxhLm9wdGlvbnMuX2hlbHBlcj1hLm9wdGlvbnMuaGVscGVyLGEub3B0aW9ucy5oZWxwZXI9ZnVuY3Rpb24oKXtyZXR1cm4gaS5oZWxwZXJbMF19LHQudGFyZ2V0PWEuY3VycmVudEl0ZW1bMF0sYS5fbW91c2VDYXB0dXJlKHQsITApLGEuX21vdXNlU3RhcnQodCwhMCwhMCksYS5vZmZzZXQuY2xpY2sudG9wPXMub2Zmc2V0LmNsaWNrLnRvcCxhLm9mZnNldC5jbGljay5sZWZ0PXMub2Zmc2V0LmNsaWNrLmxlZnQsYS5vZmZzZXQucGFyZW50LmxlZnQtPXMub2Zmc2V0LnBhcmVudC5sZWZ0LWEub2Zmc2V0LnBhcmVudC5sZWZ0LGEub2Zmc2V0LnBhcmVudC50b3AtPXMub2Zmc2V0LnBhcmVudC50b3AtYS5vZmZzZXQucGFyZW50LnRvcCxzLl90cmlnZ2VyKCJ0b1NvcnRhYmxlIix0KSxzLmRyb3BwZWQ9YS5lbGVtZW50LGUuZWFjaChzLnNvcnRhYmxlcyxmdW5jdGlvbigpe3RoaXMucmVmcmVzaFBvc2l0aW9ucygpfSkscy5jdXJyZW50SXRlbT1zLmVsZW1lbnQsYS5mcm9tT3V0c2lkZT1zKSxhLmN1cnJlbnRJdGVtJiYoYS5fbW91c2VEcmFnKHQpLGkucG9zaXRpb249YS5wb3NpdGlvbikpOmEuaXNPdmVyJiYoYS5pc092ZXI9MCxhLmNhbmNlbEhlbHBlclJlbW92YWw9ITAsYS5vcHRpb25zLl9yZXZlcnQ9YS5vcHRpb25zLnJldmVydCxhLm9wdGlvbnMucmV2ZXJ0PSExLGEuX3RyaWdnZXIoIm91dCIsdCxhLl91aUhhc2goYSkpLGEuX21vdXNlU3RvcCh0LCEwKSxhLm9wdGlvbnMucmV2ZXJ0PWEub3B0aW9ucy5fcmV2ZXJ0LGEub3B0aW9ucy5oZWxwZXI9YS5vcHRpb25zLl9oZWxwZXIsYS5wbGFjZWhvbGRlciYmYS5wbGFjZWhvbGRlci5yZW1vdmUoKSxpLmhlbHBlci5hcHBlbmRUbyhzLl9wYXJlbnQpLHMuX3JlZnJlc2hPZmZzZXRzKHQpLGkucG9zaXRpb249cy5fZ2VuZXJhdGVQb3NpdGlvbih0LCEwKSxzLl90cmlnZ2VyKCJmcm9tU29ydGFibGUiLHQpLHMuZHJvcHBlZD0hMSxlLmVhY2gocy5zb3J0YWJsZXMsZnVuY3Rpb24oKXt0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKX0pKX0pfX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiY3Vyc29yIix7c3RhcnQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPWUoImJvZHkiKSxhPXMub3B0aW9ucztuLmNzcygiY3Vyc29yIikmJihhLl9jdXJzb3I9bi5jc3MoImN1cnNvciIpKSxuLmNzcygiY3Vyc29yIixhLmN1cnNvcil9LHN0b3A6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPXMub3B0aW9ucztuLl9jdXJzb3ImJmUoImJvZHkiKS5jc3MoImN1cnNvciIsbi5fY3Vyc29yKX19KSxlLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsIm9wYWNpdHkiLHtzdGFydDpmdW5jdGlvbih0LGkscyl7dmFyIG49ZShpLmhlbHBlciksYT1zLm9wdGlvbnM7bi5jc3MoIm9wYWNpdHkiKSYmKGEuX29wYWNpdHk9bi5jc3MoIm9wYWNpdHkiKSksbi5jc3MoIm9wYWNpdHkiLGEub3BhY2l0eSl9LHN0b3A6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPXMub3B0aW9ucztuLl9vcGFjaXR5JiZlKGkuaGVscGVyKS5jc3MoIm9wYWNpdHkiLG4uX29wYWNpdHkpfX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwic2Nyb2xsIix7c3RhcnQ6ZnVuY3Rpb24oZSx0LGkpe2kuc2Nyb2xsUGFyZW50Tm90SGlkZGVufHwoaS5zY3JvbGxQYXJlbnROb3RIaWRkZW49aS5oZWxwZXIuc2Nyb2xsUGFyZW50KCExKSksaS5zY3JvbGxQYXJlbnROb3RIaWRkZW5bMF0hPT1pLmRvY3VtZW50WzBdJiYiSFRNTCIhPT1pLnNjcm9sbFBhcmVudE5vdEhpZGRlblswXS50YWdOYW1lJiYoaS5vdmVyZmxvd09mZnNldD1pLnNjcm9sbFBhcmVudE5vdEhpZGRlbi5vZmZzZXQoKSl9LGRyYWc6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPXMub3B0aW9ucyxhPSExLG89cy5zY3JvbGxQYXJlbnROb3RIaWRkZW5bMF0scj1zLmRvY3VtZW50WzBdO28hPT1yJiYiSFRNTCIhPT1vLnRhZ05hbWU/KG4uYXhpcyYmIngiPT09bi5heGlzfHwocy5vdmVyZmxvd09mZnNldC50b3Arby5vZmZzZXRIZWlnaHQtdC5wYWdlWTxuLnNjcm9sbFNlbnNpdGl2aXR5P28uc2Nyb2xsVG9wPWE9by5zY3JvbGxUb3Arbi5zY3JvbGxTcGVlZDp0LnBhZ2VZLXMub3ZlcmZsb3dPZmZzZXQudG9wPG4uc2Nyb2xsU2Vuc2l0aXZpdHkmJihvLnNjcm9sbFRvcD1hPW8uc2Nyb2xsVG9wLW4uc2Nyb2xsU3BlZWQpKSxuLmF4aXMmJiJ5Ij09PW4uYXhpc3x8KHMub3ZlcmZsb3dPZmZzZXQubGVmdCtvLm9mZnNldFdpZHRoLXQucGFnZVg8bi5zY3JvbGxTZW5zaXRpdml0eT9vLnNjcm9sbExlZnQ9YT1vLnNjcm9sbExlZnQrbi5zY3JvbGxTcGVlZDp0LnBhZ2VYLXMub3ZlcmZsb3dPZmZzZXQubGVmdDxuLnNjcm9sbFNlbnNpdGl2aXR5JiYoby5zY3JvbGxMZWZ0PWE9by5zY3JvbGxMZWZ0LW4uc2Nyb2xsU3BlZWQpKSk6KG4uYXhpcyYmIngiPT09bi5heGlzfHwodC5wYWdlWS1lKHIpLnNjcm9sbFRvcCgpPG4uc2Nyb2xsU2Vuc2l0aXZpdHk/YT1lKHIpLnNjcm9sbFRvcChlKHIpLnNjcm9sbFRvcCgpLW4uc2Nyb2xsU3BlZWQpOmUod2luZG93KS5oZWlnaHQoKS0odC5wYWdlWS1lKHIpLnNjcm9sbFRvcCgpKTxuLnNjcm9sbFNlbnNpdGl2aXR5JiYoYT1lKHIpLnNjcm9sbFRvcChlKHIpLnNjcm9sbFRvcCgpK24uc2Nyb2xsU3BlZWQpKSksbi5heGlzJiYieSI9PT1uLmF4aXN8fCh0LnBhZ2VYLWUocikuc2Nyb2xsTGVmdCgpPG4uc2Nyb2xsU2Vuc2l0aXZpdHk/YT1lKHIpLnNjcm9sbExlZnQoZShyKS5zY3JvbGxMZWZ0KCktbi5zY3JvbGxTcGVlZCk6ZSh3aW5kb3cpLndpZHRoKCktKHQucGFnZVgtZShyKS5zY3JvbGxMZWZ0KCkpPG4uc2Nyb2xsU2Vuc2l0aXZpdHkmJihhPWUocikuc2Nyb2xsTGVmdChlKHIpLnNjcm9sbExlZnQoKStuLnNjcm9sbFNwZWVkKSkpKSxhIT09ITEmJmUudWkuZGRtYW5hZ2VyJiYhbi5kcm9wQmVoYXZpb3VyJiZlLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyhzLHQpfX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwic25hcCIse3N0YXJ0OmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1zLm9wdGlvbnM7cy5zbmFwRWxlbWVudHM9W10sZShuLnNuYXAuY29uc3RydWN0b3IhPT1TdHJpbmc/bi5zbmFwLml0ZW1zfHwiOmRhdGEodWktZHJhZ2dhYmxlKSI6bi5zbmFwKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKSxpPXQub2Zmc2V0KCk7dGhpcyE9PXMuZWxlbWVudFswXSYmcy5zbmFwRWxlbWVudHMucHVzaCh7aXRlbTp0aGlzLHdpZHRoOnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0Lm91dGVySGVpZ2h0KCksdG9wOmkudG9wLGxlZnQ6aS5sZWZ0fSl9KX0sZHJhZzpmdW5jdGlvbih0LGkscyl7dmFyIG4sYSxvLHIsaCxsLHUsZCxjLHAsZj1zLm9wdGlvbnMsbT1mLnNuYXBUb2xlcmFuY2UsZz1pLm9mZnNldC5sZWZ0LHY9ZytzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLHk9aS5vZmZzZXQudG9wLGI9eStzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodDtmb3IoYz1zLnNuYXBFbGVtZW50cy5sZW5ndGgtMTtjPj0wO2MtLSloPXMuc25hcEVsZW1lbnRzW2NdLmxlZnQtcy5tYXJnaW5zLmxlZnQsbD1oK3Muc25hcEVsZW1lbnRzW2NdLndpZHRoLHU9cy5zbmFwRWxlbWVudHNbY10udG9wLXMubWFyZ2lucy50b3AsZD11K3Muc25hcEVsZW1lbnRzW2NdLmhlaWdodCxoLW0+dnx8Zz5sK218fHUtbT5ifHx5PmQrbXx8IWUuY29udGFpbnMocy5zbmFwRWxlbWVudHNbY10uaXRlbS5vd25lckRvY3VtZW50LHMuc25hcEVsZW1lbnRzW2NdLml0ZW0pPyhzLnNuYXBFbGVtZW50c1tjXS5zbmFwcGluZyYmcy5vcHRpb25zLnNuYXAucmVsZWFzZSYmcy5vcHRpb25zLnNuYXAucmVsZWFzZS5jYWxsKHMuZWxlbWVudCx0LGUuZXh0ZW5kKHMuX3VpSGFzaCgpLHtzbmFwSXRlbTpzLnNuYXBFbGVtZW50c1tjXS5pdGVtfSkpLHMuc25hcEVsZW1lbnRzW2NdLnNuYXBwaW5nPSExKTooImlubmVyIiE9PWYuc25hcE1vZGUmJihuPW0+PU1hdGguYWJzKHUtYiksYT1tPj1NYXRoLmFicyhkLXkpLG89bT49TWF0aC5hYnMoaC12KSxyPW0+PU1hdGguYWJzKGwtZyksbiYmKGkucG9zaXRpb24udG9wPXMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDp1LXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGxlZnQ6MH0pLnRvcCksYSYmKGkucG9zaXRpb24udG9wPXMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpkLGxlZnQ6MH0pLnRvcCksbyYmKGkucG9zaXRpb24ubGVmdD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omgtcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aH0pLmxlZnQpLHImJihpLnBvc2l0aW9uLmxlZnQ9cy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpsfSkubGVmdCkpLHA9bnx8YXx8b3x8ciwib3V0ZXIiIT09Zi5zbmFwTW9kZSYmKG49bT49TWF0aC5hYnModS15KSxhPW0+PU1hdGguYWJzKGQtYiksbz1tPj1NYXRoLmFicyhoLWcpLHI9bT49TWF0aC5hYnMobC12KSxuJiYoaS5wb3NpdGlvbi50b3A9cy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOnUsbGVmdDowfSkudG9wKSxhJiYoaS5wb3NpdGlvbi50b3A9cy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOmQtcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsbGVmdDowfSkudG9wKSxvJiYoaS5wb3NpdGlvbi5sZWZ0PXMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6aH0pLmxlZnQpLHImJihpLnBvc2l0aW9uLmxlZnQ9cy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpsLXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGh9KS5sZWZ0KSksIXMuc25hcEVsZW1lbnRzW2NdLnNuYXBwaW5nJiYobnx8YXx8b3x8cnx8cCkmJnMub3B0aW9ucy5zbmFwLnNuYXAmJnMub3B0aW9ucy5zbmFwLnNuYXAuY2FsbChzLmVsZW1lbnQsdCxlLmV4dGVuZChzLl91aUhhc2goKSx7c25hcEl0ZW06cy5zbmFwRWxlbWVudHNbY10uaXRlbX0pKSxzLnNuYXBFbGVtZW50c1tjXS5zbmFwcGluZz1ufHxhfHxvfHxyfHxwKX19KSxlLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInN0YWNrIix7c3RhcnQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGE9cy5vcHRpb25zLG89ZS5tYWtlQXJyYXkoZShhLnN0YWNrKSkuc29ydChmdW5jdGlvbih0LGkpe3JldHVybihwYXJzZUludChlKHQpLmNzcygiekluZGV4IiksMTApfHwwKS0ocGFyc2VJbnQoZShpKS5jc3MoInpJbmRleCIpLDEwKXx8MCl9KTtvLmxlbmd0aCYmKG49cGFyc2VJbnQoZShvWzBdKS5jc3MoInpJbmRleCIpLDEwKXx8MCxlKG8pLmVhY2goZnVuY3Rpb24odCl7ZSh0aGlzKS5jc3MoInpJbmRleCIsbit0KX0pLHRoaXMuY3NzKCJ6SW5kZXgiLG4rby5sZW5ndGgpKX19KSxlLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInpJbmRleCIse3N0YXJ0OmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1lKGkuaGVscGVyKSxhPXMub3B0aW9ucztuLmNzcygiekluZGV4IikmJihhLl96SW5kZXg9bi5jc3MoInpJbmRleCIpKSxuLmNzcygiekluZGV4IixhLnpJbmRleCl9LHN0b3A6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPXMub3B0aW9ucztuLl96SW5kZXgmJmUoaS5oZWxwZXIpLmNzcygiekluZGV4IixuLl96SW5kZXgpfX0pLGUudWkuZHJhZ2dhYmxlLGUud2lkZ2V0KCJ1aS5kcm9wcGFibGUiLHt2ZXJzaW9uOiIxLjExLjQiLHdpZGdldEV2ZW50UHJlZml4OiJkcm9wIixvcHRpb25zOnthY2NlcHQ6IioiLGFjdGl2ZUNsYXNzOiExLGFkZENsYXNzZXM6ITAsZ3JlZWR5OiExLGhvdmVyQ2xhc3M6ITEsc2NvcGU6ImRlZmF1bHQiLHRvbGVyYW5jZToiaW50ZXJzZWN0IixhY3RpdmF0ZTpudWxsLGRlYWN0aXZhdGU6bnVsbCxkcm9wOm51bGwsb3V0Om51bGwsb3ZlcjpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQsaT10aGlzLm9wdGlvbnMscz1pLmFjY2VwdDt0aGlzLmlzb3Zlcj0hMSx0aGlzLmlzb3V0PSEwLHRoaXMuYWNjZXB0PWUuaXNGdW5jdGlvbihzKT9zOmZ1bmN0aW9uKGUpe3JldHVybiBlLmlzKHMpfSx0aGlzLnByb3BvcnRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9YXJndW1lbnRzWzBdLHZvaWQgMCk6dD90OnQ9e3dpZHRoOnRoaXMuZWxlbWVudFswXS5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5lbGVtZW50WzBdLm9mZnNldEhlaWdodH19LHRoaXMuX2FkZFRvTWFuYWdlcihpLnNjb3BlKSxpLmFkZENsYXNzZXMmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJvcHBhYmxlIil9LF9hZGRUb01hbmFnZXI6ZnVuY3Rpb24odCl7ZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0XT1lLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3RdfHxbXSxlLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3RdLnB1c2godGhpcyl9LF9zcGxpY2U6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7ZS5sZW5ndGg+dDt0KyspZVt0XT09PXRoaXMmJmUuc3BsaWNlKHQsMSl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dmFyIHQ9ZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0aGlzLm9wdGlvbnMuc2NvcGVdO3RoaXMuX3NwbGljZSh0KSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWRyb3BwYWJsZSB1aS1kcm9wcGFibGUtZGlzYWJsZWQiKX0sX3NldE9wdGlvbjpmdW5jdGlvbih0LGkpe2lmKCJhY2NlcHQiPT09dCl0aGlzLmFjY2VwdD1lLmlzRnVuY3Rpb24oaSk/aTpmdW5jdGlvbihlKXtyZXR1cm4gZS5pcyhpKX07ZWxzZSBpZigic2NvcGUiPT09dCl7dmFyIHM9ZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0aGlzLm9wdGlvbnMuc2NvcGVdO3RoaXMuX3NwbGljZShzKSx0aGlzLl9hZGRUb01hbmFnZXIoaSl9dGhpcy5fc3VwZXIodCxpKX0sX2FjdGl2YXRlOmZ1bmN0aW9uKHQpe3ZhciBpPWUudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7dGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSxpJiZ0aGlzLl90cmlnZ2VyKCJhY3RpdmF0ZSIsdCx0aGlzLnVpKGkpKX0sX2RlYWN0aXZhdGU6ZnVuY3Rpb24odCl7dmFyIGk9ZS51aS5kZG1hbmFnZXIuY3VycmVudDt0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLGkmJnRoaXMuX3RyaWdnZXIoImRlYWN0aXZhdGUiLHQsdGhpcy51aShpKSl9LF9vdmVyOmZ1bmN0aW9uKHQpe3ZhciBpPWUudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7aSYmKGkuY3VycmVudEl0ZW18fGkuZWxlbWVudClbMF0hPT10aGlzLmVsZW1lbnRbMF0mJnRoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLGkuY3VycmVudEl0ZW18fGkuZWxlbWVudCkmJih0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKSx0aGlzLl90cmlnZ2VyKCJvdmVyIix0LHRoaXMudWkoaSkpKX0sX291dDpmdW5jdGlvbih0KXt2YXIgaT1lLnVpLmRkbWFuYWdlci5jdXJyZW50O2kmJihpLmN1cnJlbnRJdGVtfHxpLmVsZW1lbnQpWzBdIT09dGhpcy5lbGVtZW50WzBdJiZ0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxpLmN1cnJlbnRJdGVtfHxpLmVsZW1lbnQpJiYodGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyksdGhpcy5fdHJpZ2dlcigib3V0Iix0LHRoaXMudWkoaSkpKX0sX2Ryb3A6ZnVuY3Rpb24odCxpKXt2YXIgcz1pfHxlLnVpLmRkbWFuYWdlci5jdXJyZW50LG49ITE7cmV0dXJuIHMmJihzLmN1cnJlbnRJdGVtfHxzLmVsZW1lbnQpWzBdIT09dGhpcy5lbGVtZW50WzBdPyh0aGlzLmVsZW1lbnQuZmluZCgiOmRhdGEodWktZHJvcHBhYmxlKSIpLm5vdCgiLnVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1lKHRoaXMpLmRyb3BwYWJsZSgiaW5zdGFuY2UiKTtyZXR1cm4gaS5vcHRpb25zLmdyZWVkeSYmIWkub3B0aW9ucy5kaXNhYmxlZCYmaS5vcHRpb25zLnNjb3BlPT09cy5vcHRpb25zLnNjb3BlJiZpLmFjY2VwdC5jYWxsKGkuZWxlbWVudFswXSxzLmN1cnJlbnRJdGVtfHxzLmVsZW1lbnQpJiZlLnVpLmludGVyc2VjdChzLGUuZXh0ZW5kKGkse29mZnNldDppLmVsZW1lbnQub2Zmc2V0KCl9KSxpLm9wdGlvbnMudG9sZXJhbmNlLHQpPyhuPSEwLCExKTp2b2lkIDB9KSxuPyExOnRoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLHMuY3VycmVudEl0ZW18fHMuZWxlbWVudCk/KHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksdGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyksdGhpcy5fdHJpZ2dlcigiZHJvcCIsdCx0aGlzLnVpKHMpKSx0aGlzLmVsZW1lbnQpOiExKTohMX0sdWk6ZnVuY3Rpb24oZSl7cmV0dXJue2RyYWdnYWJsZTplLmN1cnJlbnRJdGVtfHxlLmVsZW1lbnQsaGVscGVyOmUuaGVscGVyLHBvc2l0aW9uOmUucG9zaXRpb24sb2Zmc2V0OmUucG9zaXRpb25BYnN9fX0pLGUudWkuaW50ZXJzZWN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsaSl7cmV0dXJuIGU+PXQmJnQraT5lfXJldHVybiBmdW5jdGlvbih0LGkscyxuKXtpZighaS5vZmZzZXQpcmV0dXJuITE7dmFyIGE9KHQucG9zaXRpb25BYnN8fHQucG9zaXRpb24uYWJzb2x1dGUpLmxlZnQrdC5tYXJnaW5zLmxlZnQsbz0odC5wb3NpdGlvbkFic3x8dC5wb3NpdGlvbi5hYnNvbHV0ZSkudG9wK3QubWFyZ2lucy50b3Ascj1hK3QuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgsaD1vK3QuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGw9aS5vZmZzZXQubGVmdCx1PWkub2Zmc2V0LnRvcCxkPWwraS5wcm9wb3J0aW9ucygpLndpZHRoLGM9dStpLnByb3BvcnRpb25zKCkuaGVpZ2h0O3N3aXRjaChzKXtjYXNlImZpdCI6cmV0dXJuIGE+PWwmJmQ+PXImJm8+PXUmJmM+PWg7Y2FzZSJpbnRlcnNlY3QiOnJldHVybiBhK3QuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMj5sJiZkPnItdC5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yJiZvK3QuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzI+dSYmYz5oLXQuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzI7Y2FzZSJwb2ludGVyIjpyZXR1cm4gZShuLnBhZ2VZLHUsaS5wcm9wb3J0aW9ucygpLmhlaWdodCkmJmUobi5wYWdlWCxsLGkucHJvcG9ydGlvbnMoKS53aWR0aCk7Y2FzZSJ0b3VjaCI6cmV0dXJuKG8+PXUmJmM+PW98fGg+PXUmJmM+PWh8fHU+byYmaD5jKSYmKGE+PWwmJmQ+PWF8fHI+PWwmJmQ+PXJ8fGw+YSYmcj5kKTtkZWZhdWx0OnJldHVybiExfX19KCksZS51aS5kZG1hbmFnZXI9e2N1cnJlbnQ6bnVsbCxkcm9wcGFibGVzOnsiZGVmYXVsdCI6W119LHByZXBhcmVPZmZzZXRzOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhPWUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdC5vcHRpb25zLnNjb3BlXXx8W10sbz1pP2kudHlwZTpudWxsLHI9KHQuY3VycmVudEl0ZW18fHQuZWxlbWVudCkuZmluZCgiOmRhdGEodWktZHJvcHBhYmxlKSIpLmFkZEJhY2soKTtlOmZvcihzPTA7YS5sZW5ndGg+cztzKyspaWYoIShhW3NdLm9wdGlvbnMuZGlzYWJsZWR8fHQmJiFhW3NdLmFjY2VwdC5jYWxsKGFbc10uZWxlbWVudFswXSx0LmN1cnJlbnRJdGVtfHx0LmVsZW1lbnQpKSl7Zm9yKG49MDtyLmxlbmd0aD5uO24rKylpZihyW25dPT09YVtzXS5lbGVtZW50WzBdKXthW3NdLnByb3BvcnRpb25zKCkuaGVpZ2h0PTA7Y29udGludWUgZX1hW3NdLnZpc2libGU9Im5vbmUiIT09YVtzXS5lbGVtZW50LmNzcygiZGlzcGxheSIpLGFbc10udmlzaWJsZSYmKCJtb3VzZWRvd24iPT09byYmYVtzXS5fYWN0aXZhdGUuY2FsbChhW3NdLGkpLGFbc10ub2Zmc2V0PWFbc10uZWxlbWVudC5vZmZzZXQoKSxhW3NdLnByb3BvcnRpb25zKHt3aWR0aDphW3NdLmVsZW1lbnRbMF0ub2Zmc2V0V2lkdGgsaGVpZ2h0OmFbc10uZWxlbWVudFswXS5vZmZzZXRIZWlnaHR9KSl9fSxkcm9wOmZ1bmN0aW9uKHQsaSl7dmFyIHM9ITE7cmV0dXJuIGUuZWFjaCgoZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0Lm9wdGlvbnMuc2NvcGVdfHxbXSkuc2xpY2UoKSxmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMudmlzaWJsZSYmZS51aS5pbnRlcnNlY3QodCx0aGlzLHRoaXMub3B0aW9ucy50b2xlcmFuY2UsaSkmJihzPXRoaXMuX2Ryb3AuY2FsbCh0aGlzLGkpfHxzKSwhdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLnZpc2libGUmJnRoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLHQuY3VycmVudEl0ZW18fHQuZWxlbWVudCkmJih0aGlzLmlzb3V0PSEwLHRoaXMuaXNvdmVyPSExLHRoaXMuX2RlYWN0aXZhdGUuY2FsbCh0aGlzLGkpKSl9KSxzfSxkcmFnU3RhcnQ6ZnVuY3Rpb24odCxpKXt0LmVsZW1lbnQucGFyZW50c1VudGlsKCJib2R5IikuYmluZCgic2Nyb2xsLmRyb3BwYWJsZSIsZnVuY3Rpb24oKXt0Lm9wdGlvbnMucmVmcmVzaFBvc2l0aW9uc3x8ZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModCxpKX0pfSxkcmFnOmZ1bmN0aW9uKHQsaSl7dC5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnMmJmUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHQsaSksZS5lYWNoKGUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdC5vcHRpb25zLnNjb3BlXXx8W10sZnVuY3Rpb24oKXtpZighdGhpcy5vcHRpb25zLmRpc2FibGVkJiYhdGhpcy5ncmVlZHlDaGlsZCYmdGhpcy52aXNpYmxlKXt2YXIgcyxuLGEsbz1lLnVpLmludGVyc2VjdCh0LHRoaXMsdGhpcy5vcHRpb25zLnRvbGVyYW5jZSxpKSxyPSFvJiZ0aGlzLmlzb3Zlcj8iaXNvdXQiOm8mJiF0aGlzLmlzb3Zlcj8iaXNvdmVyIjpudWxsO3ImJih0aGlzLm9wdGlvbnMuZ3JlZWR5JiYobj10aGlzLm9wdGlvbnMuc2NvcGUsYT10aGlzLmVsZW1lbnQucGFyZW50cygiOmRhdGEodWktZHJvcHBhYmxlKSIpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBlKHRoaXMpLmRyb3BwYWJsZSgiaW5zdGFuY2UiKS5vcHRpb25zLnNjb3BlPT09bn0pLGEubGVuZ3RoJiYocz1lKGFbMF0pLmRyb3BwYWJsZSgiaW5zdGFuY2UiKSxzLmdyZWVkeUNoaWxkPSJpc292ZXIiPT09cikpLHMmJiJpc292ZXIiPT09ciYmKHMuaXNvdmVyPSExLHMuaXNvdXQ9ITAscy5fb3V0LmNhbGwocyxpKSksdGhpc1tyXT0hMCx0aGlzWyJpc291dCI9PT1yPyJpc292ZXIiOiJpc291dCJdPSExLHRoaXNbImlzb3ZlciI9PT1yPyJfb3ZlciI6Il9vdXQiXS5jYWxsKHRoaXMsaSkscyYmImlzb3V0Ij09PXImJihzLmlzb3V0PSExLHMuaXNvdmVyPSEwLHMuX292ZXIuY2FsbChzLGkpKSl9fSl9LGRyYWdTdG9wOmZ1bmN0aW9uKHQsaSl7dC5lbGVtZW50LnBhcmVudHNVbnRpbCgiYm9keSIpLnVuYmluZCgic2Nyb2xsLmRyb3BwYWJsZSIpLHQub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zfHxlLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0LGkpfX0sZS51aS5kcm9wcGFibGUsZS53aWRnZXQoInVpLnJlc2l6YWJsZSIsZS51aS5tb3VzZSx7dmVyc2lvbjoiMS4xMS40Iix3aWRnZXRFdmVudFByZWZpeDoicmVzaXplIixvcHRpb25zOnthbHNvUmVzaXplOiExLGFuaW1hdGU6ITEsYW5pbWF0ZUR1cmF0aW9uOiJzbG93IixhbmltYXRlRWFzaW5nOiJzd2luZyIsYXNwZWN0UmF0aW86ITEsYXV0b0hpZGU6ITEsY29udGFpbm1lbnQ6ITEsZ2hvc3Q6ITEsZ3JpZDohMSxoYW5kbGVzOiJlLHMsc2UiLGhlbHBlcjohMSxtYXhIZWlnaHQ6bnVsbCxtYXhXaWR0aDpudWxsLG1pbkhlaWdodDoxMCxtaW5XaWR0aDoxMCx6SW5kZXg6OTAscmVzaXplOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGx9LF9udW06ZnVuY3Rpb24oZSl7cmV0dXJuIHBhcnNlSW50KGUsMTApfHwwfSxfaXNOdW1iZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIWlzTmFOKHBhcnNlSW50KGUsMTApKX0sX2hhc1Njcm9sbDpmdW5jdGlvbih0LGkpe2lmKCJoaWRkZW4iPT09ZSh0KS5jc3MoIm92ZXJmbG93IikpcmV0dXJuITE7dmFyIHM9aSYmImxlZnQiPT09aT8ic2Nyb2xsTGVmdCI6InNjcm9sbFRvcCIsbj0hMTtyZXR1cm4gdFtzXT4wPyEwOih0W3NdPTEsbj10W3NdPjAsdFtzXT0wLG4pfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQsaSxzLG4sYSxvPXRoaXMscj10aGlzLm9wdGlvbnM7aWYodGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1yZXNpemFibGUiKSxlLmV4dGVuZCh0aGlzLHtfYXNwZWN0UmF0aW86ISFyLmFzcGVjdFJhdGlvLGFzcGVjdFJhdGlvOnIuYXNwZWN0UmF0aW8sb3JpZ2luYWxFbGVtZW50OnRoaXMuZWxlbWVudCxfcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50czpbXSxfaGVscGVyOnIuaGVscGVyfHxyLmdob3N0fHxyLmFuaW1hdGU/ci5oZWxwZXJ8fCJ1aS1yZXNpemFibGUtaGVscGVyIjpudWxsfSksdGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9eKGNhbnZhc3x0ZXh0YXJlYXxpbnB1dHxzZWxlY3R8YnV0dG9ufGltZykkL2kpJiYodGhpcy5lbGVtZW50LndyYXAoZSgiPGRpdiBjbGFzcz0ndWktd3JhcHBlcicgc3R5bGU9J292ZXJmbG93OiBoaWRkZW47Jz48L2Rpdj4iKS5jc3Moe3Bvc2l0aW9uOnRoaXMuZWxlbWVudC5jc3MoInBvc2l0aW9uIiksd2lkdGg6dGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCksdG9wOnRoaXMuZWxlbWVudC5jc3MoInRvcCIpLGxlZnQ6dGhpcy5lbGVtZW50LmNzcygibGVmdCIpfSkpLHRoaXMuZWxlbWVudD10aGlzLmVsZW1lbnQucGFyZW50KCkuZGF0YSgidWktcmVzaXphYmxlIix0aGlzLmVsZW1lbnQucmVzaXphYmxlKCJpbnN0YW5jZSIpKSx0aGlzLmVsZW1lbnRJc1dyYXBwZXI9ITAsdGhpcy5lbGVtZW50LmNzcyh7bWFyZ2luTGVmdDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbkxlZnQiKSxtYXJnaW5Ub3A6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5Ub3AiKSxtYXJnaW5SaWdodDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksbWFyZ2luQm90dG9tOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luQm90dG9tIil9KSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe21hcmdpbkxlZnQ6MCxtYXJnaW5Ub3A6MCxtYXJnaW5SaWdodDowLG1hcmdpbkJvdHRvbTowfSksdGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlPXRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIiksdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiLCJub25lIiksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5wdXNoKHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7cG9zaXRpb246InN0YXRpYyIsem9vbToxLGRpc3BsYXk6ImJsb2NrIn0pKSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe21hcmdpbjp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbiIpfSksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSksdGhpcy5oYW5kbGVzPXIuaGFuZGxlc3x8KGUoIi51aS1yZXNpemFibGUtaGFuZGxlIix0aGlzLmVsZW1lbnQpLmxlbmd0aD97bjoiLnVpLXJlc2l6YWJsZS1uIixlOiIudWktcmVzaXphYmxlLWUiLHM6Ii51aS1yZXNpemFibGUtcyIsdzoiLnVpLXJlc2l6YWJsZS13IixzZToiLnVpLXJlc2l6YWJsZS1zZSIsc3c6Ii51aS1yZXNpemFibGUtc3ciLG5lOiIudWktcmVzaXphYmxlLW5lIixudzoiLnVpLXJlc2l6YWJsZS1udyJ9OiJlLHMsc2UiKSx0aGlzLl9oYW5kbGVzPWUoKSx0aGlzLmhhbmRsZXMuY29uc3RydWN0b3I9PT1TdHJpbmcpZm9yKCJhbGwiPT09dGhpcy5oYW5kbGVzJiYodGhpcy5oYW5kbGVzPSJuLGUscyx3LHNlLHN3LG5lLG53IiksdD10aGlzLmhhbmRsZXMuc3BsaXQoIiwiKSx0aGlzLmhhbmRsZXM9e30saT0wO3QubGVuZ3RoPmk7aSsrKXM9ZS50cmltKHRbaV0pLGE9InVpLXJlc2l6YWJsZS0iK3Msbj1lKCI8ZGl2IGNsYXNzPSd1aS1yZXNpemFibGUtaGFuZGxlICIrYSsiJz48L2Rpdj4iKSxuLmNzcyh7ekluZGV4OnIuekluZGV4fSksInNlIj09PXMmJm4uYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1ncmlwc21hbGwtZGlhZ29uYWwtc2UiKSx0aGlzLmhhbmRsZXNbc109Ii51aS1yZXNpemFibGUtIitzLHRoaXMuZWxlbWVudC5hcHBlbmQobik7dGhpcy5fcmVuZGVyQXhpcz1mdW5jdGlvbih0KXt2YXIgaSxzLG4sYTt0PXR8fHRoaXMuZWxlbWVudDtmb3IoaSBpbiB0aGlzLmhhbmRsZXMpdGhpcy5oYW5kbGVzW2ldLmNvbnN0cnVjdG9yPT09U3RyaW5nP3RoaXMuaGFuZGxlc1tpXT10aGlzLmVsZW1lbnQuY2hpbGRyZW4odGhpcy5oYW5kbGVzW2ldKS5maXJzdCgpLnNob3coKToodGhpcy5oYW5kbGVzW2ldLmpxdWVyeXx8dGhpcy5oYW5kbGVzW2ldLm5vZGVUeXBlKSYmKHRoaXMuaGFuZGxlc1tpXT1lKHRoaXMuaGFuZGxlc1tpXSksdGhpcy5fb24odGhpcy5oYW5kbGVzW2ldLHttb3VzZWRvd246by5fbW91c2VEb3dufSkpLHRoaXMuZWxlbWVudElzV3JhcHBlciYmdGhpcy5vcmlnaW5hbEVsZW1lbnRbMF0ubm9kZU5hbWUubWF0Y2goL14odGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbikkL2kpJiYocz1lKHRoaXMuaGFuZGxlc1tpXSx0aGlzLmVsZW1lbnQpLGE9L3N3fG5lfG53fHNlfG58cy8udGVzdChpKT9zLm91dGVySGVpZ2h0KCk6cy5vdXRlcldpZHRoKCksbj1bInBhZGRpbmciLC9uZXxud3xuLy50ZXN0KGkpPyJUb3AiOi9zZXxzd3xzLy50ZXN0KGkpPyJCb3R0b20iOi9eZSQvLnRlc3QoaSk/IlJpZ2h0IjoiTGVmdCJdLmpvaW4oIiIpLHQuY3NzKG4sYSksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSksdGhpcy5faGFuZGxlcz10aGlzLl9oYW5kbGVzLmFkZCh0aGlzLmhhbmRsZXNbaV0pfSx0aGlzLl9yZW5kZXJBeGlzKHRoaXMuZWxlbWVudCksdGhpcy5faGFuZGxlcz10aGlzLl9oYW5kbGVzLmFkZCh0aGlzLmVsZW1lbnQuZmluZCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKSksdGhpcy5faGFuZGxlcy5kaXNhYmxlU2VsZWN0aW9uKCksdGhpcy5faGFuZGxlcy5tb3VzZW92ZXIoZnVuY3Rpb24oKXtvLnJlc2l6aW5nfHwodGhpcy5jbGFzc05hbWUmJihuPXRoaXMuY2xhc3NOYW1lLm1hdGNoKC91aS1yZXNpemFibGUtKHNlfHN3fG5lfG53fG58ZXxzfHcpL2kpKSxvLmF4aXM9biYmblsxXT9uWzFdOiJzZSIpfSksci5hdXRvSGlkZSYmKHRoaXMuX2hhbmRsZXMuaGlkZSgpLGUodGhpcy5lbGVtZW50KS5hZGRDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIikubW91c2VlbnRlcihmdW5jdGlvbigpe3IuZGlzYWJsZWR8fChlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKSxvLl9oYW5kbGVzLnNob3coKSl9KS5tb3VzZWxlYXZlKGZ1bmN0aW9uKCl7ci5kaXNhYmxlZHx8by5yZXNpemluZ3x8KGUodGhpcykuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpLG8uX2hhbmRsZXMuaGlkZSgpKX0pKSx0aGlzLl9tb3VzZUluaXQoKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9tb3VzZURlc3Ryb3koKTt2YXIgdCxpPWZ1bmN0aW9uKHQpe2UodCkucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZSB1aS1yZXNpemFibGUtZGlzYWJsZWQgdWktcmVzaXphYmxlLXJlc2l6aW5nIikucmVtb3ZlRGF0YSgicmVzaXphYmxlIikucmVtb3ZlRGF0YSgidWktcmVzaXphYmxlIikudW5iaW5kKCIucmVzaXphYmxlIikuZmluZCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKS5yZW1vdmUoKX07cmV0dXJuIHRoaXMuZWxlbWVudElzV3JhcHBlciYmKGkodGhpcy5lbGVtZW50KSx0PXRoaXMuZWxlbWVudCx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe3Bvc2l0aW9uOnQuY3NzKCJwb3NpdGlvbiIpLHdpZHRoOnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0Lm91dGVySGVpZ2h0KCksdG9wOnQuY3NzKCJ0b3AiKSxsZWZ0OnQuY3NzKCJsZWZ0Iil9KS5pbnNlcnRBZnRlcih0KSx0LnJlbW92ZSgpKSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIsdGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlKSxpKHRoaXMub3JpZ2luYWxFbGVtZW50KSx0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbj0hMTtmb3IoaSBpbiB0aGlzLmhhbmRsZXMpcz1lKHRoaXMuaGFuZGxlc1tpXSlbMF0sKHM9PT10LnRhcmdldHx8ZS5jb250YWlucyhzLHQudGFyZ2V0KSkmJihuPSEwKTtyZXR1cm4hdGhpcy5vcHRpb25zLmRpc2FibGVkJiZufSxfbW91c2VTdGFydDpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYT10aGlzLm9wdGlvbnMsbz10aGlzLmVsZW1lbnQ7cmV0dXJuIHRoaXMucmVzaXppbmc9ITAsdGhpcy5fcmVuZGVyUHJveHkoKSxpPXRoaXMuX251bSh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSkscz10aGlzLl9udW0odGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSksYS5jb250YWlubWVudCYmKGkrPWUoYS5jb250YWlubWVudCkuc2Nyb2xsTGVmdCgpfHwwLHMrPWUoYS5jb250YWlubWVudCkuc2Nyb2xsVG9wKCl8fDApLHRoaXMub2Zmc2V0PXRoaXMuaGVscGVyLm9mZnNldCgpLHRoaXMucG9zaXRpb249e2xlZnQ6aSx0b3A6c30sdGhpcy5zaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6dGhpcy5oZWxwZXIud2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIuaGVpZ2h0KCl9Ont3aWR0aDpvLndpZHRoKCksaGVpZ2h0Om8uaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxTaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6by5vdXRlcldpZHRoKCksaGVpZ2h0Om8ub3V0ZXJIZWlnaHQoKX06e3dpZHRoOm8ud2lkdGgoKSxoZWlnaHQ6by5oZWlnaHQoKX0sdGhpcy5zaXplRGlmZj17d2lkdGg6by5vdXRlcldpZHRoKCktby53aWR0aCgpLGhlaWdodDpvLm91dGVySGVpZ2h0KCktby5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXtsZWZ0OmksdG9wOnN9LHRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uPXtsZWZ0OnQucGFnZVgsdG9wOnQucGFnZVl9LHRoaXMuYXNwZWN0UmF0aW89Im51bWJlciI9PXR5cGVvZiBhLmFzcGVjdFJhdGlvP2EuYXNwZWN0UmF0aW86dGhpcy5vcmlnaW5hbFNpemUud2lkdGgvdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0fHwxLG49ZSgiLnVpLXJlc2l6YWJsZS0iK3RoaXMuYXhpcykuY3NzKCJjdXJzb3IiKSxlKCJib2R5IikuY3NzKCJjdXJzb3IiLCJhdXRvIj09PW4/dGhpcy5heGlzKyItcmVzaXplIjpuKSxvLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKSx0aGlzLl9wcm9wYWdhdGUoInN0YXJ0Iix0KSwhMH0sX21vdXNlRHJhZzpmdW5jdGlvbih0KXt2YXIgaSxzLG49dGhpcy5vcmlnaW5hbE1vdXNlUG9zaXRpb24sYT10aGlzLmF4aXMsbz10LnBhZ2VYLW4ubGVmdHx8MCxyPXQucGFnZVktbi50b3B8fDAsaD10aGlzLl9jaGFuZ2VbYV07cmV0dXJuIHRoaXMuX3VwZGF0ZVByZXZQcm9wZXJ0aWVzKCksaD8oaT1oLmFwcGx5KHRoaXMsW3QsbyxyXSksdGhpcy5fdXBkYXRlVmlydHVhbEJvdW5kYXJpZXModC5zaGlmdEtleSksKHRoaXMuX2FzcGVjdFJhdGlvfHx0LnNoaWZ0S2V5KSYmKGk9dGhpcy5fdXBkYXRlUmF0aW8oaSx0KSksaT10aGlzLl9yZXNwZWN0U2l6ZShpLHQpLHRoaXMuX3VwZGF0ZUNhY2hlKGkpLHRoaXMuX3Byb3BhZ2F0ZSgicmVzaXplIix0KSxzPXRoaXMuX2FwcGx5Q2hhbmdlcygpLCF0aGlzLl9oZWxwZXImJnRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpLGUuaXNFbXB0eU9iamVjdChzKXx8KHRoaXMuX3VwZGF0ZVByZXZQcm9wZXJ0aWVzKCksdGhpcy5fdHJpZ2dlcigicmVzaXplIix0LHRoaXMudWkoKSksdGhpcy5fYXBwbHlDaGFuZ2VzKCkpLCExKTohMX0sX21vdXNlU3RvcDpmdW5jdGlvbih0KXt0aGlzLnJlc2l6aW5nPSExO3ZhciBpLHMsbixhLG8scixoLGw9dGhpcy5vcHRpb25zLHU9dGhpcztyZXR1cm4gdGhpcy5faGVscGVyJiYoaT10aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLHM9aS5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3QoaVswXS5ub2RlTmFtZSksbj1zJiZ0aGlzLl9oYXNTY3JvbGwoaVswXSwibGVmdCIpPzA6dS5zaXplRGlmZi5oZWlnaHQsYT1zPzA6dS5zaXplRGlmZi53aWR0aCxvPXt3aWR0aDp1LmhlbHBlci53aWR0aCgpLWEsaGVpZ2h0OnUuaGVscGVyLmhlaWdodCgpLW59LHI9cGFyc2VJbnQodS5lbGVtZW50LmNzcygibGVmdCIpLDEwKSsodS5wb3NpdGlvbi5sZWZ0LXUub3JpZ2luYWxQb3NpdGlvbi5sZWZ0KXx8bnVsbCxoPXBhcnNlSW50KHUuZWxlbWVudC5jc3MoInRvcCIpLDEwKSsodS5wb3NpdGlvbi50b3AtdS5vcmlnaW5hbFBvc2l0aW9uLnRvcCl8fG51bGwsbC5hbmltYXRlfHx0aGlzLmVsZW1lbnQuY3NzKGUuZXh0ZW5kKG8se3RvcDpoLGxlZnQ6cn0pKSx1LmhlbHBlci5oZWlnaHQodS5zaXplLmhlaWdodCksdS5oZWxwZXIud2lkdGgodS5zaXplLndpZHRoKSx0aGlzLl9oZWxwZXImJiFsLmFuaW1hdGUmJnRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCkpLGUoImJvZHkiKS5jc3MoImN1cnNvciIsImF1dG8iKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZS1yZXNpemluZyIpLHRoaXMuX3Byb3BhZ2F0ZSgic3RvcCIsdCksdGhpcy5faGVscGVyJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSwhMX0sX3VwZGF0ZVByZXZQcm9wZXJ0aWVzOmZ1bmN0aW9uKCl7dGhpcy5wcmV2UG9zaXRpb249e3RvcDp0aGlzLnBvc2l0aW9uLnRvcCxsZWZ0OnRoaXMucG9zaXRpb24ubGVmdH0sdGhpcy5wcmV2U2l6ZT17d2lkdGg6dGhpcy5zaXplLndpZHRoLGhlaWdodDp0aGlzLnNpemUuaGVpZ2h0fX0sX2FwcGx5Q2hhbmdlczpmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiB0aGlzLnBvc2l0aW9uLnRvcCE9PXRoaXMucHJldlBvc2l0aW9uLnRvcCYmKGUudG9wPXRoaXMucG9zaXRpb24udG9wKyJweCIpLHRoaXMucG9zaXRpb24ubGVmdCE9PXRoaXMucHJldlBvc2l0aW9uLmxlZnQmJihlLmxlZnQ9dGhpcy5wb3NpdGlvbi5sZWZ0KyJweCIpLHRoaXMuc2l6ZS53aWR0aCE9PXRoaXMucHJldlNpemUud2lkdGgmJihlLndpZHRoPXRoaXMuc2l6ZS53aWR0aCsicHgiKSx0aGlzLnNpemUuaGVpZ2h0IT09dGhpcy5wcmV2U2l6ZS5oZWlnaHQmJihlLmhlaWdodD10aGlzLnNpemUuaGVpZ2h0KyJweCIpLHRoaXMuaGVscGVyLmNzcyhlKSxlfSxfdXBkYXRlVmlydHVhbEJvdW5kYXJpZXM6ZnVuY3Rpb24oZSl7dmFyIHQsaSxzLG4sYSxvPXRoaXMub3B0aW9uczthPXttaW5XaWR0aDp0aGlzLl9pc051bWJlcihvLm1pbldpZHRoKT9vLm1pbldpZHRoOjAsbWF4V2lkdGg6dGhpcy5faXNOdW1iZXIoby5tYXhXaWR0aCk/by5tYXhXaWR0aDoxLzAsbWluSGVpZ2h0OnRoaXMuX2lzTnVtYmVyKG8ubWluSGVpZ2h0KT9vLm1pbkhlaWdodDowLG1heEhlaWdodDp0aGlzLl9pc051bWJlcihvLm1heEhlaWdodCk/by5tYXhIZWlnaHQ6MS8wfSwodGhpcy5fYXNwZWN0UmF0aW98fGUpJiYodD1hLm1pbkhlaWdodCp0aGlzLmFzcGVjdFJhdGlvLHM9YS5taW5XaWR0aC90aGlzLmFzcGVjdFJhdGlvLGk9YS5tYXhIZWlnaHQqdGhpcy5hc3BlY3RSYXRpbyxuPWEubWF4V2lkdGgvdGhpcy5hc3BlY3RSYXRpbyx0PmEubWluV2lkdGgmJihhLm1pbldpZHRoPXQpLHM+YS5taW5IZWlnaHQmJihhLm1pbkhlaWdodD1zKSxhLm1heFdpZHRoPmkmJihhLm1heFdpZHRoPWkpLGEubWF4SGVpZ2h0Pm4mJihhLm1heEhlaWdodD1uKSksdGhpcy5fdkJvdW5kYXJpZXM9YX0sX3VwZGF0ZUNhY2hlOmZ1bmN0aW9uKGUpe3RoaXMub2Zmc2V0PXRoaXMuaGVscGVyLm9mZnNldCgpLHRoaXMuX2lzTnVtYmVyKGUubGVmdCkmJih0aGlzLnBvc2l0aW9uLmxlZnQ9ZS5sZWZ0KSx0aGlzLl9pc051bWJlcihlLnRvcCkmJih0aGlzLnBvc2l0aW9uLnRvcD1lLnRvcCksdGhpcy5faXNOdW1iZXIoZS5oZWlnaHQpJiYodGhpcy5zaXplLmhlaWdodD1lLmhlaWdodCksdGhpcy5faXNOdW1iZXIoZS53aWR0aCkmJih0aGlzLnNpemUud2lkdGg9ZS53aWR0aCl9LF91cGRhdGVSYXRpbzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnBvc2l0aW9uLGk9dGhpcy5zaXplLHM9dGhpcy5heGlzO3JldHVybiB0aGlzLl9pc051bWJlcihlLmhlaWdodCk/ZS53aWR0aD1lLmhlaWdodCp0aGlzLmFzcGVjdFJhdGlvOnRoaXMuX2lzTnVtYmVyKGUud2lkdGgpJiYoZS5oZWlnaHQ9ZS53aWR0aC90aGlzLmFzcGVjdFJhdGlvKSwic3ciPT09cyYmKGUubGVmdD10LmxlZnQrKGkud2lkdGgtZS53aWR0aCksZS50b3A9bnVsbCksIm53Ij09PXMmJihlLnRvcD10LnRvcCsoaS5oZWlnaHQtZS5oZWlnaHQpLGUubGVmdD10LmxlZnQrKGkud2lkdGgtZS53aWR0aCkpLGV9LF9yZXNwZWN0U2l6ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl92Qm91bmRhcmllcyxpPXRoaXMuYXhpcyxzPXRoaXMuX2lzTnVtYmVyKGUud2lkdGgpJiZ0Lm1heFdpZHRoJiZ0Lm1heFdpZHRoPGUud2lkdGgsbj10aGlzLl9pc051bWJlcihlLmhlaWdodCkmJnQubWF4SGVpZ2h0JiZ0Lm1heEhlaWdodDxlLmhlaWdodCxhPXRoaXMuX2lzTnVtYmVyKGUud2lkdGgpJiZ0Lm1pbldpZHRoJiZ0Lm1pbldpZHRoPmUud2lkdGgsbz10aGlzLl9pc051bWJlcihlLmhlaWdodCkmJnQubWluSGVpZ2h0JiZ0Lm1pbkhlaWdodD5lLmhlaWdodCxyPXRoaXMub3JpZ2luYWxQb3NpdGlvbi5sZWZ0K3RoaXMub3JpZ2luYWxTaXplLndpZHRoLGg9dGhpcy5wb3NpdGlvbi50b3ArdGhpcy5zaXplLmhlaWdodCxsPS9zd3xud3x3Ly50ZXN0KGkpLHU9L253fG5lfG4vLnRlc3QoaSk7cmV0dXJuIGEmJihlLndpZHRoPXQubWluV2lkdGgpLG8mJihlLmhlaWdodD10Lm1pbkhlaWdodCkscyYmKGUud2lkdGg9dC5tYXhXaWR0aCksbiYmKGUuaGVpZ2h0PXQubWF4SGVpZ2h0KSxhJiZsJiYoZS5sZWZ0PXItdC5taW5XaWR0aCkscyYmbCYmKGUubGVmdD1yLXQubWF4V2lkdGgpLG8mJnUmJihlLnRvcD1oLXQubWluSGVpZ2h0KSxuJiZ1JiYoZS50b3A9aC10Lm1heEhlaWdodCksZS53aWR0aHx8ZS5oZWlnaHR8fGUubGVmdHx8IWUudG9wP2Uud2lkdGh8fGUuaGVpZ2h0fHxlLnRvcHx8IWUubGVmdHx8KGUubGVmdD1udWxsKTplLnRvcD1udWxsLGV9LF9nZXRQYWRkaW5nUGx1c0JvcmRlckRpbWVuc2lvbnM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsaT1bXSxzPVtlLmNzcygiYm9yZGVyVG9wV2lkdGgiKSxlLmNzcygiYm9yZGVyUmlnaHRXaWR0aCIpLGUuY3NzKCJib3JkZXJCb3R0b21XaWR0aCIpLGUuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKV0sbj1bZS5jc3MoInBhZGRpbmdUb3AiKSxlLmNzcygicGFkZGluZ1JpZ2h0IiksZS5jc3MoInBhZGRpbmdCb3R0b20iKSxlLmNzcygicGFkZGluZ0xlZnQiKV07ND50O3QrKylpW3RdPXBhcnNlSW50KHNbdF0sMTApfHwwLGlbdF0rPXBhcnNlSW50KG5bdF0sMTApfHwwO3JldHVybntoZWlnaHQ6aVswXStpWzJdLHdpZHRoOmlbMV0raVszXX19LF9wcm9wb3J0aW9uYWxseVJlc2l6ZTpmdW5jdGlvbigpe2lmKHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoKWZvcih2YXIgZSx0PTAsaT10aGlzLmhlbHBlcnx8dGhpcy5lbGVtZW50O3RoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoPnQ7dCsrKWU9dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50c1t0XSx0aGlzLm91dGVyRGltZW5zaW9uc3x8KHRoaXMub3V0ZXJEaW1lbnNpb25zPXRoaXMuX2dldFBhZGRpbmdQbHVzQm9yZGVyRGltZW5zaW9ucyhlKSksZS5jc3Moe2hlaWdodDppLmhlaWdodCgpLXRoaXMub3V0ZXJEaW1lbnNpb25zLmhlaWdodHx8MCx3aWR0aDppLndpZHRoKCktdGhpcy5vdXRlckRpbWVuc2lvbnMud2lkdGh8fDB9KX0sX3JlbmRlclByb3h5OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50LGk9dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudE9mZnNldD10Lm9mZnNldCgpLHRoaXMuX2hlbHBlcj8odGhpcy5oZWxwZXI9dGhpcy5oZWxwZXJ8fGUoIjxkaXYgc3R5bGU9J292ZXJmbG93OmhpZGRlbjsnPjwvZGl2PiIpLHRoaXMuaGVscGVyLmFkZENsYXNzKHRoaXMuX2hlbHBlcikuY3NzKHt3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLTEsaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpLTEscG9zaXRpb246ImFic29sdXRlIixsZWZ0OnRoaXMuZWxlbWVudE9mZnNldC5sZWZ0KyJweCIsdG9wOnRoaXMuZWxlbWVudE9mZnNldC50b3ArInB4Iix6SW5kZXg6KytpLnpJbmRleH0pLHRoaXMuaGVscGVyLmFwcGVuZFRvKCJib2R5IikuZGlzYWJsZVNlbGVjdGlvbigpKTp0aGlzLmhlbHBlcj10aGlzLmVsZW1lbnR9LF9jaGFuZ2U6e2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm57d2lkdGg6dGhpcy5vcmlnaW5hbFNpemUud2lkdGgrdH19LHc6ZnVuY3Rpb24oZSx0KXt2YXIgaT10aGlzLm9yaWdpbmFsU2l6ZSxzPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57bGVmdDpzLmxlZnQrdCx3aWR0aDppLndpZHRoLXR9fSxuOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcz10aGlzLm9yaWdpbmFsU2l6ZSxuPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57dG9wOm4udG9wK2ksaGVpZ2h0OnMuaGVpZ2h0LWl9fSxzOmZ1bmN0aW9uKGUsdCxpKXtyZXR1cm57aGVpZ2h0OnRoaXMub3JpZ2luYWxTaXplLmhlaWdodCtpfX0sc2U6ZnVuY3Rpb24odCxpLHMpe3JldHVybiBlLmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLmUuYXBwbHkodGhpcyxbdCxpLHNdKSl9LHN3OmZ1bmN0aW9uKHQsaSxzKXtyZXR1cm4gZS5leHRlbmQodGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsW3QsaSxzXSkpfSxuZTpmdW5jdGlvbih0LGkscyl7cmV0dXJuIGUuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2UuZS5hcHBseSh0aGlzLFt0LGksc10pKX0sbnc6ZnVuY3Rpb24odCxpLHMpe3JldHVybiBlLmV4dGVuZCh0aGlzLl9jaGFuZ2Uubi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcyxbdCxpLHNdKSl9fSxfcHJvcGFnYXRlOmZ1bmN0aW9uKHQsaSl7ZS51aS5wbHVnaW4uY2FsbCh0aGlzLHQsW2ksdGhpcy51aSgpXSksInJlc2l6ZSIhPT10JiZ0aGlzLl90cmlnZ2VyKHQsaSx0aGlzLnVpKCkpfSxwbHVnaW5zOnt9LHVpOmZ1bmN0aW9uKCl7cmV0dXJue29yaWdpbmFsRWxlbWVudDp0aGlzLm9yaWdpbmFsRWxlbWVudCxlbGVtZW50OnRoaXMuZWxlbWVudCxoZWxwZXI6dGhpcy5oZWxwZXIscG9zaXRpb246dGhpcy5wb3NpdGlvbixzaXplOnRoaXMuc2l6ZSxvcmlnaW5hbFNpemU6dGhpcy5vcmlnaW5hbFNpemUsb3JpZ2luYWxQb3NpdGlvbjp0aGlzLm9yaWdpbmFsUG9zaXRpb259fX0pLGUudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiYW5pbWF0ZSIse3N0b3A6ZnVuY3Rpb24odCl7dmFyIGk9ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIikscz1pLm9wdGlvbnMsbj1pLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLGE9bi5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3QoblswXS5ub2RlTmFtZSksbz1hJiZpLl9oYXNTY3JvbGwoblswXSwibGVmdCIpPzA6aS5zaXplRGlmZi5oZWlnaHQscj1hPzA6aS5zaXplRGlmZi53aWR0aCxoPXt3aWR0aDppLnNpemUud2lkdGgtcixoZWlnaHQ6aS5zaXplLmhlaWdodC1vfSxsPXBhcnNlSW50KGkuZWxlbWVudC5jc3MoImxlZnQiKSwxMCkrKGkucG9zaXRpb24ubGVmdC1pLm9yaWdpbmFsUG9zaXRpb24ubGVmdCl8fG51bGwsdT1wYXJzZUludChpLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCkrKGkucG9zaXRpb24udG9wLWkub3JpZ2luYWxQb3NpdGlvbi50b3ApfHxudWxsO2kuZWxlbWVudC5hbmltYXRlKGUuZXh0ZW5kKGgsdSYmbD97dG9wOnUsbGVmdDpsfTp7fSkse2R1cmF0aW9uOnMuYW5pbWF0ZUR1cmF0aW9uLGVhc2luZzpzLmFuaW1hdGVFYXNpbmcsc3RlcDpmdW5jdGlvbigpe3ZhciBzPXt3aWR0aDpwYXJzZUludChpLmVsZW1lbnQuY3NzKCJ3aWR0aCIpLDEwKSxoZWlnaHQ6cGFyc2VJbnQoaS5lbGVtZW50LmNzcygiaGVpZ2h0IiksMTApLHRvcDpwYXJzZUludChpLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCksbGVmdDpwYXJzZUludChpLmVsZW1lbnQuY3NzKCJsZWZ0IiksMTApfTtuJiZuLmxlbmd0aCYmZShuWzBdKS5jc3Moe3dpZHRoOnMud2lkdGgsaGVpZ2h0OnMuaGVpZ2h0fSksaS5fdXBkYXRlQ2FjaGUocyksaS5fcHJvcGFnYXRlKCJyZXNpemUiLHQpfX0pfX0pLGUudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiY29udGFpbm1lbnQiLHtzdGFydDpmdW5jdGlvbigpe3ZhciB0LGkscyxuLGEsbyxyLGg9ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIiksbD1oLm9wdGlvbnMsdT1oLmVsZW1lbnQsZD1sLmNvbnRhaW5tZW50LGM9ZCBpbnN0YW5jZW9mIGU/ZC5nZXQoMCk6L3BhcmVudC8udGVzdChkKT91LnBhcmVudCgpLmdldCgwKTpkO2MmJihoLmNvbnRhaW5lckVsZW1lbnQ9ZShjKSwvZG9jdW1lbnQvLnRlc3QoZCl8fGQ9PT1kb2N1bWVudD8oaC5jb250YWluZXJPZmZzZXQ9e2xlZnQ6MCx0b3A6MH0saC5jb250YWluZXJQb3NpdGlvbj17bGVmdDowLHRvcDowfSxoLnBhcmVudERhdGE9e2VsZW1lbnQ6ZShkb2N1bWVudCksbGVmdDowLHRvcDowLHdpZHRoOmUoZG9jdW1lbnQpLndpZHRoKCksaGVpZ2h0OmUoZG9jdW1lbnQpLmhlaWdodCgpfHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0fSk6KHQ9ZShjKSxpPVtdLGUoWyJUb3AiLCJSaWdodCIsIkxlZnQiLCJCb3R0b20iXSkuZWFjaChmdW5jdGlvbihlLHMpe2lbZV09aC5fbnVtKHQuY3NzKCJwYWRkaW5nIitzKSl9KSxoLmNvbnRhaW5lck9mZnNldD10Lm9mZnNldCgpLGguY29udGFpbmVyUG9zaXRpb249dC5wb3NpdGlvbigpLGguY29udGFpbmVyU2l6ZT17aGVpZ2h0OnQuaW5uZXJIZWlnaHQoKS1pWzNdLHdpZHRoOnQuaW5uZXJXaWR0aCgpLWlbMV19LHM9aC5jb250YWluZXJPZmZzZXQsbj1oLmNvbnRhaW5lclNpemUuaGVpZ2h0LGE9aC5jb250YWluZXJTaXplLndpZHRoLG89aC5faGFzU2Nyb2xsKGMsImxlZnQiKT9jLnNjcm9sbFdpZHRoOmEscj1oLl9oYXNTY3JvbGwoYyk/Yy5zY3JvbGxIZWlnaHQ6bixoLnBhcmVudERhdGE9e2VsZW1lbnQ6YyxsZWZ0OnMubGVmdCx0b3A6cy50b3Asd2lkdGg6byxoZWlnaHQ6cn0pKX0scmVzaXplOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhLG89ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIikscj1vLm9wdGlvbnMsaD1vLmNvbnRhaW5lck9mZnNldCxsPW8ucG9zaXRpb24sdT1vLl9hc3BlY3RSYXRpb3x8dC5zaGlmdEtleSxkPXt0b3A6MCxsZWZ0OjB9LGM9by5jb250YWluZXJFbGVtZW50LHA9ITA7Y1swXSE9PWRvY3VtZW50JiYvc3RhdGljLy50ZXN0KGMuY3NzKCJwb3NpdGlvbiIpKSYmKGQ9aCksbC5sZWZ0PChvLl9oZWxwZXI/aC5sZWZ0OjApJiYoby5zaXplLndpZHRoPW8uc2l6ZS53aWR0aCsoby5faGVscGVyP28ucG9zaXRpb24ubGVmdC1oLmxlZnQ6by5wb3NpdGlvbi5sZWZ0LWQubGVmdCksdSYmKG8uc2l6ZS5oZWlnaHQ9by5zaXplLndpZHRoL28uYXNwZWN0UmF0aW8scD0hMSksby5wb3NpdGlvbi5sZWZ0PXIuaGVscGVyP2gubGVmdDowKSxsLnRvcDwoby5faGVscGVyP2gudG9wOjApJiYoby5zaXplLmhlaWdodD1vLnNpemUuaGVpZ2h0KyhvLl9oZWxwZXI/by5wb3NpdGlvbi50b3AtaC50b3A6by5wb3NpdGlvbi50b3ApLHUmJihvLnNpemUud2lkdGg9by5zaXplLmhlaWdodCpvLmFzcGVjdFJhdGlvLHA9ITEpLG8ucG9zaXRpb24udG9wPW8uX2hlbHBlcj9oLnRvcDowKSxuPW8uY29udGFpbmVyRWxlbWVudC5nZXQoMCk9PT1vLmVsZW1lbnQucGFyZW50KCkuZ2V0KDApLGE9L3JlbGF0aXZlfGFic29sdXRlLy50ZXN0KG8uY29udGFpbmVyRWxlbWVudC5jc3MoInBvc2l0aW9uIikpLG4mJmE/KG8ub2Zmc2V0LmxlZnQ9by5wYXJlbnREYXRhLmxlZnQrby5wb3NpdGlvbi5sZWZ0LG8ub2Zmc2V0LnRvcD1vLnBhcmVudERhdGEudG9wK28ucG9zaXRpb24udG9wKTooby5vZmZzZXQubGVmdD1vLmVsZW1lbnQub2Zmc2V0KCkubGVmdCxvLm9mZnNldC50b3A9by5lbGVtZW50Lm9mZnNldCgpLnRvcCksaT1NYXRoLmFicyhvLnNpemVEaWZmLndpZHRoKyhvLl9oZWxwZXI/by5vZmZzZXQubGVmdC1kLmxlZnQ6by5vZmZzZXQubGVmdC1oLmxlZnQpKSxzPU1hdGguYWJzKG8uc2l6ZURpZmYuaGVpZ2h0KyhvLl9oZWxwZXI/by5vZmZzZXQudG9wLWQudG9wOm8ub2Zmc2V0LnRvcC1oLnRvcCkpLGkrby5zaXplLndpZHRoPj1vLnBhcmVudERhdGEud2lkdGgmJihvLnNpemUud2lkdGg9by5wYXJlbnREYXRhLndpZHRoLWksdSYmKG8uc2l6ZS5oZWlnaHQ9by5zaXplLndpZHRoL28uYXNwZWN0UmF0aW8scD0hMSkpLHMrby5zaXplLmhlaWdodD49by5wYXJlbnREYXRhLmhlaWdodCYmKG8uc2l6ZS5oZWlnaHQ9by5wYXJlbnREYXRhLmhlaWdodC1zLHUmJihvLnNpemUud2lkdGg9by5zaXplLmhlaWdodCpvLmFzcGVjdFJhdGlvLHA9ITEpKSxwfHwoby5wb3NpdGlvbi5sZWZ0PW8ucHJldlBvc2l0aW9uLmxlZnQsby5wb3NpdGlvbi50b3A9by5wcmV2UG9zaXRpb24udG9wLG8uc2l6ZS53aWR0aD1vLnByZXZTaXplLndpZHRoLG8uc2l6ZS5oZWlnaHQ9by5wcmV2U2l6ZS5oZWlnaHQpfSxzdG9wOmZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIiksaT10Lm9wdGlvbnMscz10LmNvbnRhaW5lck9mZnNldCxuPXQuY29udGFpbmVyUG9zaXRpb24sYT10LmNvbnRhaW5lckVsZW1lbnQsbz1lKHQuaGVscGVyKSxyPW8ub2Zmc2V0KCksaD1vLm91dGVyV2lkdGgoKS10LnNpemVEaWZmLndpZHRoLGw9by5vdXRlckhlaWdodCgpLXQuc2l6ZURpZmYuaGVpZ2h0O3QuX2hlbHBlciYmIWkuYW5pbWF0ZSYmL3JlbGF0aXZlLy50ZXN0KGEuY3NzKCJwb3NpdGlvbiIpKSYmZSh0aGlzKS5jc3Moe2xlZnQ6ci5sZWZ0LW4ubGVmdC1zLmxlZnQsd2lkdGg6aCxoZWlnaHQ6bH0pLHQuX2hlbHBlciYmIWkuYW5pbWF0ZSYmL3N0YXRpYy8udGVzdChhLmNzcygicG9zaXRpb24iKSkmJmUodGhpcykuY3NzKHtsZWZ0OnIubGVmdC1uLmxlZnQtcy5sZWZ0LHdpZHRoOmgsaGVpZ2h0Omx9KX19KSxlLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImFsc29SZXNpemUiLHtzdGFydDpmdW5jdGlvbigpe3ZhciB0PWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLGk9dC5vcHRpb25zO2UoaS5hbHNvUmVzaXplKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTt0LmRhdGEoInVpLXJlc2l6YWJsZS1hbHNvcmVzaXplIix7d2lkdGg6cGFyc2VJbnQodC53aWR0aCgpLDEwKSxoZWlnaHQ6cGFyc2VJbnQodC5oZWlnaHQoKSwxMCksbGVmdDpwYXJzZUludCh0LmNzcygibGVmdCIpLDEwKSx0b3A6cGFyc2VJbnQodC5jc3MoInRvcCIpLDEwKX0pfSl9LHJlc2l6ZTpmdW5jdGlvbih0LGkpe3ZhciBzPWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLG49cy5vcHRpb25zLGE9cy5vcmlnaW5hbFNpemUsbz1zLm9yaWdpbmFsUG9zaXRpb24scj17aGVpZ2h0OnMuc2l6ZS5oZWlnaHQtYS5oZWlnaHR8fDAsd2lkdGg6cy5zaXplLndpZHRoLWEud2lkdGh8fDAsdG9wOnMucG9zaXRpb24udG9wLW8udG9wfHwwLGxlZnQ6cy5wb3NpdGlvbi5sZWZ0LW8ubGVmdHx8MH07ZShuLmFsc29SZXNpemUpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLHM9ZSh0aGlzKS5kYXRhKCJ1aS1yZXNpemFibGUtYWxzb3Jlc2l6ZSIpLG49e30sYT10LnBhcmVudHMoaS5vcmlnaW5hbEVsZW1lbnRbMF0pLmxlbmd0aD9bIndpZHRoIiwiaGVpZ2h0Il06WyJ3aWR0aCIsImhlaWdodCIsInRvcCIsImxlZnQiXTtlLmVhY2goYSxmdW5jdGlvbihlLHQpe3ZhciBpPShzW3RdfHwwKSsoclt0XXx8MCk7aSYmaT49MCYmKG5bdF09aXx8bnVsbCl9KSx0LmNzcyhuKX0pfSxzdG9wOmZ1bmN0aW9uKCl7ZSh0aGlzKS5yZW1vdmVEYXRhKCJyZXNpemFibGUtYWxzb3Jlc2l6ZSIpfX0pLGUudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiZ2hvc3QiLHtzdGFydDpmdW5jdGlvbigpe3ZhciB0PWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLGk9dC5vcHRpb25zLHM9dC5zaXplO3QuZ2hvc3Q9dC5vcmlnaW5hbEVsZW1lbnQuY2xvbmUoKSx0Lmdob3N0LmNzcyh7b3BhY2l0eTouMjUsZGlzcGxheToiYmxvY2siLHBvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OnMuaGVpZ2h0LHdpZHRoOnMud2lkdGgsbWFyZ2luOjAsbGVmdDowLHRvcDowfSkuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1naG9zdCIpLmFkZENsYXNzKCJzdHJpbmciPT10eXBlb2YgaS5naG9zdD9pLmdob3N0OiIiKSx0Lmdob3N0LmFwcGVuZFRvKHQuaGVscGVyKX0scmVzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIik7dC5naG9zdCYmdC5naG9zdC5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OnQuc2l6ZS5oZWlnaHQsd2lkdGg6dC5zaXplLndpZHRofSl9LHN0b3A6ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLnJlc2l6YWJsZSgiaW5zdGFuY2UiKTt0Lmdob3N0JiZ0LmhlbHBlciYmdC5oZWxwZXIuZ2V0KDApLnJlbW92ZUNoaWxkKHQuZ2hvc3QuZ2V0KDApKX19KSxlLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImdyaWQiLHtyZXNpemU6ZnVuY3Rpb24oKXt2YXIgdCxpPWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLHM9aS5vcHRpb25zLG49aS5zaXplLGE9aS5vcmlnaW5hbFNpemUsbz1pLm9yaWdpbmFsUG9zaXRpb24scj1pLmF4aXMsaD0ibnVtYmVyIj09dHlwZW9mIHMuZ3JpZD9bcy5ncmlkLHMuZ3JpZF06cy5ncmlkLGw9aFswXXx8MSx1PWhbMV18fDEsZD1NYXRoLnJvdW5kKChuLndpZHRoLWEud2lkdGgpL2wpKmwsYz1NYXRoLnJvdW5kKChuLmhlaWdodC1hLmhlaWdodCkvdSkqdSxwPWEud2lkdGgrZCxmPWEuaGVpZ2h0K2MsbT1zLm1heFdpZHRoJiZwPnMubWF4V2lkdGgsZz1zLm1heEhlaWdodCYmZj5zLm1heEhlaWdodCx2PXMubWluV2lkdGgmJnMubWluV2lkdGg+cCx5PXMubWluSGVpZ2h0JiZzLm1pbkhlaWdodD5mO3MuZ3JpZD1oLHYmJihwKz1sKSx5JiYoZis9dSksbSYmKHAtPWwpLGcmJihmLT11KSwvXihzZXxzfGUpJC8udGVzdChyKT8oaS5zaXplLndpZHRoPXAsaS5zaXplLmhlaWdodD1mKTovXihuZSkkLy50ZXN0KHIpPyhpLnNpemUud2lkdGg9cCxpLnNpemUuaGVpZ2h0PWYsaS5wb3NpdGlvbi50b3A9by50b3AtYyk6L14oc3cpJC8udGVzdChyKT8oaS5zaXplLndpZHRoPXAsaS5zaXplLmhlaWdodD1mLGkucG9zaXRpb24ubGVmdD1vLmxlZnQtZCk6KCgwPj1mLXV8fDA+PXAtbCkmJih0PWkuX2dldFBhZGRpbmdQbHVzQm9yZGVyRGltZW5zaW9ucyh0aGlzKSksZi11PjA/KGkuc2l6ZS5oZWlnaHQ9ZixpLnBvc2l0aW9uLnRvcD1vLnRvcC1jKTooZj11LXQuaGVpZ2h0LGkuc2l6ZS5oZWlnaHQ9ZixpLnBvc2l0aW9uLnRvcD1vLnRvcCthLmhlaWdodC1mKSxwLWw+MD8oaS5zaXplLndpZHRoPXAsaS5wb3NpdGlvbi5sZWZ0PW8ubGVmdC1kKToocD1sLXQud2lkdGgsaS5zaXplLndpZHRoPXAsaS5wb3NpdGlvbi5sZWZ0PW8ubGVmdCthLndpZHRoLXApKX19KSxlLnVpLnJlc2l6YWJsZSxlLndpZGdldCgidWkuc2VsZWN0YWJsZSIsZS51aS5tb3VzZSx7dmVyc2lvbjoiMS4xMS40IixvcHRpb25zOnthcHBlbmRUbzoiYm9keSIsYXV0b1JlZnJlc2g6ITAsZGlzdGFuY2U6MCxmaWx0ZXI6IioiLHRvbGVyYW5jZToidG91Y2giLHNlbGVjdGVkOm51bGwsc2VsZWN0aW5nOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGwsdW5zZWxlY3RlZDpudWxsLHVuc2VsZWN0aW5nOm51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdCxpPXRoaXM7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RhYmxlIiksdGhpcy5kcmFnZ2VkPSExLHRoaXMucmVmcmVzaD1mdW5jdGlvbigpe3Q9ZShpLm9wdGlvbnMuZmlsdGVyLGkuZWxlbWVudFswXSksdC5hZGRDbGFzcygidWktc2VsZWN0ZWUiKSx0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC5vZmZzZXQoKTtlLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIix7ZWxlbWVudDp0aGlzLCRlbGVtZW50OnQsbGVmdDppLmxlZnQsdG9wOmkudG9wLHJpZ2h0OmkubGVmdCt0Lm91dGVyV2lkdGgoKSxib3R0b206aS50b3ArdC5vdXRlckhlaWdodCgpLHN0YXJ0c2VsZWN0ZWQ6ITEsc2VsZWN0ZWQ6dC5oYXNDbGFzcygidWktc2VsZWN0ZWQiKSxzZWxlY3Rpbmc6dC5oYXNDbGFzcygidWktc2VsZWN0aW5nIiksdW5zZWxlY3Rpbmc6dC5oYXNDbGFzcygidWktdW5zZWxlY3RpbmciKX0pfSl9LHRoaXMucmVmcmVzaCgpLHRoaXMuc2VsZWN0ZWVzPXQuYWRkQ2xhc3MoInVpLXNlbGVjdGVlIiksdGhpcy5fbW91c2VJbml0KCksdGhpcy5oZWxwZXI9ZSgiPGRpdiBjbGFzcz0ndWktc2VsZWN0YWJsZS1oZWxwZXInPjwvZGl2PiIpfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWVzLnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZSIpLnJlbW92ZURhdGEoInNlbGVjdGFibGUtaXRlbSIpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0YWJsZSB1aS1zZWxlY3RhYmxlLWRpc2FibGVkIiksdGhpcy5fbW91c2VEZXN0cm95KCl9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMscz10aGlzLm9wdGlvbnM7dGhpcy5vcG9zPVt0LnBhZ2VYLHQucGFnZVldLHRoaXMub3B0aW9ucy5kaXNhYmxlZHx8KHRoaXMuc2VsZWN0ZWVzPWUocy5maWx0ZXIsdGhpcy5lbGVtZW50WzBdKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsdCksZShzLmFwcGVuZFRvKS5hcHBlbmQodGhpcy5oZWxwZXIpLHRoaXMuaGVscGVyLmNzcyh7bGVmdDp0LnBhZ2VYLHRvcDp0LnBhZ2VZLHdpZHRoOjAsaGVpZ2h0OjB9KSxzLmF1dG9SZWZyZXNoJiZ0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcy5maWx0ZXIoIi51aS1zZWxlY3RlZCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgcz1lLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7cy5zdGFydHNlbGVjdGVkPSEwLHQubWV0YUtleXx8dC5jdHJsS2V5fHwocy4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKSxzLnNlbGVjdGVkPSExLHMuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIikscy51bnNlbGVjdGluZz0hMCxpLl90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsdCx7dW5zZWxlY3Rpbmc6cy5lbGVtZW50fSkpfSksZSh0LnRhcmdldCkucGFyZW50cygpLmFkZEJhY2soKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHMsbj1lLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7cmV0dXJuIG4/KHM9IXQubWV0YUtleSYmIXQuY3RybEtleXx8IW4uJGVsZW1lbnQuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIiksbi4kZWxlbWVudC5yZW1vdmVDbGFzcyhzPyJ1aS11bnNlbGVjdGluZyI6InVpLXNlbGVjdGVkIikuYWRkQ2xhc3Mocz8idWktc2VsZWN0aW5nIjoidWktdW5zZWxlY3RpbmciKSxuLnVuc2VsZWN0aW5nPSFzLG4uc2VsZWN0aW5nPXMsbi5zZWxlY3RlZD1zLHM/aS5fdHJpZ2dlcigic2VsZWN0aW5nIix0LHtzZWxlY3Rpbmc6bi5lbGVtZW50fSk6aS5fdHJpZ2dlcigidW5zZWxlY3RpbmciLHQse3Vuc2VsZWN0aW5nOm4uZWxlbWVudH0pLCExKTp2b2lkIDB9KSl9LF9tb3VzZURyYWc6ZnVuY3Rpb24odCl7aWYodGhpcy5kcmFnZ2VkPSEwLCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpe3ZhciBpLHM9dGhpcyxuPXRoaXMub3B0aW9ucyxhPXRoaXMub3Bvc1swXSxvPXRoaXMub3Bvc1sxXSxyPXQucGFnZVgsaD10LnBhZ2VZO3JldHVybiBhPnImJihpPXIscj1hLGE9aSksbz5oJiYoaT1oLGg9byxvPWkpLHRoaXMuaGVscGVyLmNzcyh7bGVmdDphLHRvcDpvLHdpZHRoOnItYSxoZWlnaHQ6aC1vfSksdGhpcy5zZWxlY3RlZXMuZWFjaChmdW5jdGlvbigpe3ZhciBpPWUuZGF0YSh0aGlzLCJzZWxlY3RhYmxlLWl0ZW0iKSxsPSExOwppJiZpLmVsZW1lbnQhPT1zLmVsZW1lbnRbMF0mJigidG91Y2giPT09bi50b2xlcmFuY2U/bD0hKGkubGVmdD5yfHxhPmkucmlnaHR8fGkudG9wPmh8fG8+aS5ib3R0b20pOiJmaXQiPT09bi50b2xlcmFuY2UmJihsPWkubGVmdD5hJiZyPmkucmlnaHQmJmkudG9wPm8mJmg+aS5ib3R0b20pLGw/KGkuc2VsZWN0ZWQmJihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITEpLGkudW5zZWxlY3RpbmcmJihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS11bnNlbGVjdGluZyIpLGkudW5zZWxlY3Rpbmc9ITEpLGkuc2VsZWN0aW5nfHwoaS4kZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0aW5nIiksaS5zZWxlY3Rpbmc9ITAscy5fdHJpZ2dlcigic2VsZWN0aW5nIix0LHtzZWxlY3Rpbmc6aS5lbGVtZW50fSkpKTooaS5zZWxlY3RpbmcmJigodC5tZXRhS2V5fHx0LmN0cmxLZXkpJiZpLnN0YXJ0c2VsZWN0ZWQ/KGkuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIpLGkuc2VsZWN0aW5nPSExLGkuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGVkIiksaS5zZWxlY3RlZD0hMCk6KGkuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIpLGkuc2VsZWN0aW5nPSExLGkuc3RhcnRzZWxlY3RlZCYmKGkuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIiksaS51bnNlbGVjdGluZz0hMCkscy5fdHJpZ2dlcigidW5zZWxlY3RpbmciLHQse3Vuc2VsZWN0aW5nOmkuZWxlbWVudH0pKSksaS5zZWxlY3RlZCYmKHQubWV0YUtleXx8dC5jdHJsS2V5fHxpLnN0YXJ0c2VsZWN0ZWR8fChpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITEsaS4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSEwLHMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIix0LHt1bnNlbGVjdGluZzppLmVsZW1lbnR9KSkpKSl9KSwhMX19LF9tb3VzZVN0b3A6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcztyZXR1cm4gdGhpcy5kcmFnZ2VkPSExLGUoIi51aS11bnNlbGVjdGluZyIsdGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHM9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO3MuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXVuc2VsZWN0aW5nIikscy51bnNlbGVjdGluZz0hMSxzLnN0YXJ0c2VsZWN0ZWQ9ITEsaS5fdHJpZ2dlcigidW5zZWxlY3RlZCIsdCx7dW5zZWxlY3RlZDpzLmVsZW1lbnR9KX0pLGUoIi51aS1zZWxlY3RpbmciLHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe3ZhciBzPWUuZGF0YSh0aGlzLCJzZWxlY3RhYmxlLWl0ZW0iKTtzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKS5hZGRDbGFzcygidWktc2VsZWN0ZWQiKSxzLnNlbGVjdGluZz0hMSxzLnNlbGVjdGVkPSEwLHMuc3RhcnRzZWxlY3RlZD0hMCxpLl90cmlnZ2VyKCJzZWxlY3RlZCIsdCx7c2VsZWN0ZWQ6cy5lbGVtZW50fSl9KSx0aGlzLl90cmlnZ2VyKCJzdG9wIix0KSx0aGlzLmhlbHBlci5yZW1vdmUoKSwhMX19KSxlLndpZGdldCgidWkuc29ydGFibGUiLGUudWkubW91c2Use3ZlcnNpb246IjEuMTEuNCIsd2lkZ2V0RXZlbnRQcmVmaXg6InNvcnQiLHJlYWR5OiExLG9wdGlvbnM6e2FwcGVuZFRvOiJwYXJlbnQiLGF4aXM6ITEsY29ubmVjdFdpdGg6ITEsY29udGFpbm1lbnQ6ITEsY3Vyc29yOiJhdXRvIixjdXJzb3JBdDohMSxkcm9wT25FbXB0eTohMCxmb3JjZVBsYWNlaG9sZGVyU2l6ZTohMSxmb3JjZUhlbHBlclNpemU6ITEsZ3JpZDohMSxoYW5kbGU6ITEsaGVscGVyOiJvcmlnaW5hbCIsaXRlbXM6Ij4gKiIsb3BhY2l0eTohMSxwbGFjZWhvbGRlcjohMSxyZXZlcnQ6ITEsc2Nyb2xsOiEwLHNjcm9sbFNlbnNpdGl2aXR5OjIwLHNjcm9sbFNwZWVkOjIwLHNjb3BlOiJkZWZhdWx0Iix0b2xlcmFuY2U6ImludGVyc2VjdCIsekluZGV4OjFlMyxhY3RpdmF0ZTpudWxsLGJlZm9yZVN0b3A6bnVsbCxjaGFuZ2U6bnVsbCxkZWFjdGl2YXRlOm51bGwsb3V0Om51bGwsb3ZlcjpudWxsLHJlY2VpdmU6bnVsbCxyZW1vdmU6bnVsbCxzb3J0Om51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGwsdXBkYXRlOm51bGx9LF9pc092ZXJBeGlzOmZ1bmN0aW9uKGUsdCxpKXtyZXR1cm4gZT49dCYmdCtpPmV9LF9pc0Zsb2F0aW5nOmZ1bmN0aW9uKGUpe3JldHVybi9sZWZ0fHJpZ2h0Ly50ZXN0KGUuY3NzKCJmbG9hdCIpKXx8L2lubGluZXx0YWJsZS1jZWxsLy50ZXN0KGUuY3NzKCJkaXNwbGF5IikpfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5jb250YWluZXJDYWNoZT17fSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNvcnRhYmxlIiksdGhpcy5yZWZyZXNoKCksdGhpcy5vZmZzZXQ9dGhpcy5lbGVtZW50Lm9mZnNldCgpLHRoaXMuX21vdXNlSW5pdCgpLHRoaXMuX3NldEhhbmRsZUNsYXNzTmFtZSgpLHRoaXMucmVhZHk9ITB9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLl9zdXBlcihlLHQpLCJoYW5kbGUiPT09ZSYmdGhpcy5fc2V0SGFuZGxlQ2xhc3NOYW1lKCl9LF9zZXRIYW5kbGVDbGFzc05hbWU6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuZmluZCgiLnVpLXNvcnRhYmxlLWhhbmRsZSIpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oYW5kbGUiKSxlLmVhY2godGhpcy5pdGVtcyxmdW5jdGlvbigpeyh0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGFuZGxlP3RoaXMuaXRlbS5maW5kKHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oYW5kbGUpOnRoaXMuaXRlbSkuYWRkQ2xhc3MoInVpLXNvcnRhYmxlLWhhbmRsZSIpfSl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZSB1aS1zb3J0YWJsZS1kaXNhYmxlZCIpLmZpbmQoIi51aS1zb3J0YWJsZS1oYW5kbGUiKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGFuZGxlIiksdGhpcy5fbW91c2VEZXN0cm95KCk7Zm9yKHZhciBlPXRoaXMuaXRlbXMubGVuZ3RoLTE7ZT49MDtlLS0pdGhpcy5pdGVtc1tlXS5pdGVtLnJlbW92ZURhdGEodGhpcy53aWRnZXROYW1lKyItaXRlbSIpO3JldHVybiB0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKHQsaSl7dmFyIHM9bnVsbCxuPSExLGE9dGhpcztyZXR1cm4gdGhpcy5yZXZlcnRpbmc/ITE6dGhpcy5vcHRpb25zLmRpc2FibGVkfHwic3RhdGljIj09PXRoaXMub3B0aW9ucy50eXBlPyExOih0aGlzLl9yZWZyZXNoSXRlbXModCksZSh0LnRhcmdldCkucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gZS5kYXRhKHRoaXMsYS53aWRnZXROYW1lKyItaXRlbSIpPT09YT8ocz1lKHRoaXMpLCExKTp2b2lkIDB9KSxlLmRhdGEodC50YXJnZXQsYS53aWRnZXROYW1lKyItaXRlbSIpPT09YSYmKHM9ZSh0LnRhcmdldCkpLHM/IXRoaXMub3B0aW9ucy5oYW5kbGV8fGl8fChlKHRoaXMub3B0aW9ucy5oYW5kbGUscykuZmluZCgiKiIpLmFkZEJhY2soKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcz09PXQudGFyZ2V0JiYobj0hMCl9KSxuKT8odGhpcy5jdXJyZW50SXRlbT1zLHRoaXMuX3JlbW92ZUN1cnJlbnRzRnJvbUl0ZW1zKCksITApOiExOiExKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGEsbz10aGlzLm9wdGlvbnM7aWYodGhpcy5jdXJyZW50Q29udGFpbmVyPXRoaXMsdGhpcy5yZWZyZXNoUG9zaXRpb25zKCksdGhpcy5oZWxwZXI9dGhpcy5fY3JlYXRlSGVscGVyKHQpLHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSx0aGlzLl9jYWNoZU1hcmdpbnMoKSx0aGlzLnNjcm9sbFBhcmVudD10aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoKSx0aGlzLm9mZnNldD10aGlzLmN1cnJlbnRJdGVtLm9mZnNldCgpLHRoaXMub2Zmc2V0PXt0b3A6dGhpcy5vZmZzZXQudG9wLXRoaXMubWFyZ2lucy50b3AsbGVmdDp0aGlzLm9mZnNldC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0fSxlLmV4dGVuZCh0aGlzLm9mZnNldCx7Y2xpY2s6e2xlZnQ6dC5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDp0LnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH0scGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9KSx0aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiwiYWJzb2x1dGUiKSx0aGlzLmNzc1Bvc2l0aW9uPXRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iKSx0aGlzLm9yaWdpbmFsUG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbih0KSx0aGlzLm9yaWdpbmFsUGFnZVg9dC5wYWdlWCx0aGlzLm9yaWdpbmFsUGFnZVk9dC5wYWdlWSxvLmN1cnNvckF0JiZ0aGlzLl9hZGp1c3RPZmZzZXRGcm9tSGVscGVyKG8uY3Vyc29yQXQpLHRoaXMuZG9tUG9zaXRpb249e3ByZXY6dGhpcy5jdXJyZW50SXRlbS5wcmV2KClbMF0scGFyZW50OnRoaXMuY3VycmVudEl0ZW0ucGFyZW50KClbMF19LHRoaXMuaGVscGVyWzBdIT09dGhpcy5jdXJyZW50SXRlbVswXSYmdGhpcy5jdXJyZW50SXRlbS5oaWRlKCksdGhpcy5fY3JlYXRlUGxhY2Vob2xkZXIoKSxvLmNvbnRhaW5tZW50JiZ0aGlzLl9zZXRDb250YWlubWVudCgpLG8uY3Vyc29yJiYiYXV0byIhPT1vLmN1cnNvciYmKGE9dGhpcy5kb2N1bWVudC5maW5kKCJib2R5IiksdGhpcy5zdG9yZWRDdXJzb3I9YS5jc3MoImN1cnNvciIpLGEuY3NzKCJjdXJzb3IiLG8uY3Vyc29yKSx0aGlzLnN0b3JlZFN0eWxlc2hlZXQ9ZSgiPHN0eWxlPip7IGN1cnNvcjogIitvLmN1cnNvcisiICFpbXBvcnRhbnQ7IH08L3N0eWxlPiIpLmFwcGVuZFRvKGEpKSxvLm9wYWNpdHkmJih0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiKSYmKHRoaXMuX3N0b3JlZE9wYWNpdHk9dGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5IikpLHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIsby5vcGFjaXR5KSksby56SW5kZXgmJih0aGlzLmhlbHBlci5jc3MoInpJbmRleCIpJiYodGhpcy5fc3RvcmVkWkluZGV4PXRoaXMuaGVscGVyLmNzcygiekluZGV4IikpLHRoaXMuaGVscGVyLmNzcygiekluZGV4IixvLnpJbmRleCkpLHRoaXMuc2Nyb2xsUGFyZW50WzBdIT09dGhpcy5kb2N1bWVudFswXSYmIkhUTUwiIT09dGhpcy5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSYmKHRoaXMub3ZlcmZsb3dPZmZzZXQ9dGhpcy5zY3JvbGxQYXJlbnQub2Zmc2V0KCkpLHRoaXMuX3RyaWdnZXIoInN0YXJ0Iix0LHRoaXMuX3VpSGFzaCgpKSx0aGlzLl9wcmVzZXJ2ZUhlbHBlclByb3BvcnRpb25zfHx0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksIXMpZm9yKG49dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO24+PTA7bi0tKXRoaXMuY29udGFpbmVyc1tuXS5fdHJpZ2dlcigiYWN0aXZhdGUiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKTtyZXR1cm4gZS51aS5kZG1hbmFnZXImJihlLnVpLmRkbWFuYWdlci5jdXJyZW50PXRoaXMpLGUudWkuZGRtYW5hZ2VyJiYhby5kcm9wQmVoYXZpb3VyJiZlLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLHQpLHRoaXMuZHJhZ2dpbmc9ITAsdGhpcy5oZWxwZXIuYWRkQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpLHRoaXMuX21vdXNlRHJhZyh0KSwhMH0sX21vdXNlRHJhZzpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYSxvPXRoaXMub3B0aW9ucyxyPSExO2Zvcih0aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24odCksdGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKSx0aGlzLmxhc3RQb3NpdGlvbkFic3x8KHRoaXMubGFzdFBvc2l0aW9uQWJzPXRoaXMucG9zaXRpb25BYnMpLHRoaXMub3B0aW9ucy5zY3JvbGwmJih0aGlzLnNjcm9sbFBhcmVudFswXSE9PXRoaXMuZG9jdW1lbnRbMF0mJiJIVE1MIiE9PXRoaXMuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWU/KHRoaXMub3ZlcmZsb3dPZmZzZXQudG9wK3RoaXMuc2Nyb2xsUGFyZW50WzBdLm9mZnNldEhlaWdodC10LnBhZ2VZPG8uc2Nyb2xsU2Vuc2l0aXZpdHk/dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPXI9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wK28uc2Nyb2xsU3BlZWQ6dC5wYWdlWS10aGlzLm92ZXJmbG93T2Zmc2V0LnRvcDxvLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPXI9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wLW8uc2Nyb2xsU3BlZWQpLHRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdCt0aGlzLnNjcm9sbFBhcmVudFswXS5vZmZzZXRXaWR0aC10LnBhZ2VYPG8uc2Nyb2xsU2Vuc2l0aXZpdHk/dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1yPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQrby5zY3JvbGxTcGVlZDp0LnBhZ2VYLXRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdDxvLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1yPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQtby5zY3JvbGxTcGVlZCkpOih0LnBhZ2VZLXRoaXMuZG9jdW1lbnQuc2Nyb2xsVG9wKCk8by5zY3JvbGxTZW5zaXRpdml0eT9yPXRoaXMuZG9jdW1lbnQuc2Nyb2xsVG9wKHRoaXMuZG9jdW1lbnQuc2Nyb2xsVG9wKCktby5zY3JvbGxTcGVlZCk6dGhpcy53aW5kb3cuaGVpZ2h0KCktKHQucGFnZVktdGhpcy5kb2N1bWVudC5zY3JvbGxUb3AoKSk8by5zY3JvbGxTZW5zaXRpdml0eSYmKHI9dGhpcy5kb2N1bWVudC5zY3JvbGxUb3AodGhpcy5kb2N1bWVudC5zY3JvbGxUb3AoKStvLnNjcm9sbFNwZWVkKSksdC5wYWdlWC10aGlzLmRvY3VtZW50LnNjcm9sbExlZnQoKTxvLnNjcm9sbFNlbnNpdGl2aXR5P3I9dGhpcy5kb2N1bWVudC5zY3JvbGxMZWZ0KHRoaXMuZG9jdW1lbnQuc2Nyb2xsTGVmdCgpLW8uc2Nyb2xsU3BlZWQpOnRoaXMud2luZG93LndpZHRoKCktKHQucGFnZVgtdGhpcy5kb2N1bWVudC5zY3JvbGxMZWZ0KCkpPG8uc2Nyb2xsU2Vuc2l0aXZpdHkmJihyPXRoaXMuZG9jdW1lbnQuc2Nyb2xsTGVmdCh0aGlzLmRvY3VtZW50LnNjcm9sbExlZnQoKStvLnNjcm9sbFNwZWVkKSkpLHIhPT0hMSYmZS51aS5kZG1hbmFnZXImJiFvLmRyb3BCZWhhdmlvdXImJmUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsdCkpLHRoaXMucG9zaXRpb25BYnM9dGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIiksdGhpcy5vcHRpb25zLmF4aXMmJiJ5Ij09PXRoaXMub3B0aW9ucy5heGlzfHwodGhpcy5oZWxwZXJbMF0uc3R5bGUubGVmdD10aGlzLnBvc2l0aW9uLmxlZnQrInB4IiksdGhpcy5vcHRpb25zLmF4aXMmJiJ4Ij09PXRoaXMub3B0aW9ucy5heGlzfHwodGhpcy5oZWxwZXJbMF0uc3R5bGUudG9wPXRoaXMucG9zaXRpb24udG9wKyJweCIpLGk9dGhpcy5pdGVtcy5sZW5ndGgtMTtpPj0wO2ktLSlpZihzPXRoaXMuaXRlbXNbaV0sbj1zLml0ZW1bMF0sYT10aGlzLl9pbnRlcnNlY3RzV2l0aFBvaW50ZXIocyksYSYmcy5pbnN0YW5jZT09PXRoaXMuY3VycmVudENvbnRhaW5lciYmbiE9PXRoaXMuY3VycmVudEl0ZW1bMF0mJnRoaXMucGxhY2Vob2xkZXJbMT09PWE/Im5leHQiOiJwcmV2Il0oKVswXSE9PW4mJiFlLmNvbnRhaW5zKHRoaXMucGxhY2Vob2xkZXJbMF0sbikmJigic2VtaS1keW5hbWljIj09PXRoaXMub3B0aW9ucy50eXBlPyFlLmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSxuKTohMCkpe2lmKHRoaXMuZGlyZWN0aW9uPTE9PT1hPyJkb3duIjoidXAiLCJwb2ludGVyIiE9PXRoaXMub3B0aW9ucy50b2xlcmFuY2UmJiF0aGlzLl9pbnRlcnNlY3RzV2l0aFNpZGVzKHMpKWJyZWFrO3RoaXMuX3JlYXJyYW5nZSh0LHMpLHRoaXMuX3RyaWdnZXIoImNoYW5nZSIsdCx0aGlzLl91aUhhc2goKSk7YnJlYWt9cmV0dXJuIHRoaXMuX2NvbnRhY3RDb250YWluZXJzKHQpLGUudWkuZGRtYW5hZ2VyJiZlLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsdCksdGhpcy5fdHJpZ2dlcigic29ydCIsdCx0aGlzLl91aUhhc2goKSksdGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicywhMX0sX21vdXNlU3RvcDpmdW5jdGlvbih0LGkpe2lmKHQpe2lmKGUudWkuZGRtYW5hZ2VyJiYhdGhpcy5vcHRpb25zLmRyb3BCZWhhdmlvdXImJmUudWkuZGRtYW5hZ2VyLmRyb3AodGhpcyx0KSx0aGlzLm9wdGlvbnMucmV2ZXJ0KXt2YXIgcz10aGlzLG49dGhpcy5wbGFjZWhvbGRlci5vZmZzZXQoKSxhPXRoaXMub3B0aW9ucy5heGlzLG89e307YSYmIngiIT09YXx8KG8ubGVmdD1uLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQtdGhpcy5tYXJnaW5zLmxlZnQrKHRoaXMub2Zmc2V0UGFyZW50WzBdPT09dGhpcy5kb2N1bWVudFswXS5ib2R5PzA6dGhpcy5vZmZzZXRQYXJlbnRbMF0uc2Nyb2xsTGVmdCkpLGEmJiJ5IiE9PWF8fChvLnRvcD1uLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLXRoaXMubWFyZ2lucy50b3ArKHRoaXMub2Zmc2V0UGFyZW50WzBdPT09dGhpcy5kb2N1bWVudFswXS5ib2R5PzA6dGhpcy5vZmZzZXRQYXJlbnRbMF0uc2Nyb2xsVG9wKSksdGhpcy5yZXZlcnRpbmc9ITAsZSh0aGlzLmhlbHBlcikuYW5pbWF0ZShvLHBhcnNlSW50KHRoaXMub3B0aW9ucy5yZXZlcnQsMTApfHw1MDAsZnVuY3Rpb24oKXtzLl9jbGVhcih0KX0pfWVsc2UgdGhpcy5fY2xlYXIodCxpKTtyZXR1cm4hMX19LGNhbmNlbDpmdW5jdGlvbigpe2lmKHRoaXMuZHJhZ2dpbmcpe3RoaXMuX21vdXNlVXAoe3RhcmdldDpudWxsfSksIm9yaWdpbmFsIj09PXRoaXMub3B0aW9ucy5oZWxwZXI/dGhpcy5jdXJyZW50SXRlbS5jc3ModGhpcy5fc3RvcmVkQ1NTKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIik6dGhpcy5jdXJyZW50SXRlbS5zaG93KCk7Zm9yKHZhciB0PXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTt0Pj0wO3QtLSl0aGlzLmNvbnRhaW5lcnNbdF0uX3RyaWdnZXIoImRlYWN0aXZhdGUiLG51bGwsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbdF0uY29udGFpbmVyQ2FjaGUub3ZlciYmKHRoaXMuY29udGFpbmVyc1t0XS5fdHJpZ2dlcigib3V0IixudWxsLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW3RdLmNvbnRhaW5lckNhY2hlLm92ZXI9MCl9cmV0dXJuIHRoaXMucGxhY2Vob2xkZXImJih0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUmJnRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBsYWNlaG9sZGVyWzBdKSwib3JpZ2luYWwiIT09dGhpcy5vcHRpb25zLmhlbHBlciYmdGhpcy5oZWxwZXImJnRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUmJnRoaXMuaGVscGVyLnJlbW92ZSgpLGUuZXh0ZW5kKHRoaXMse2hlbHBlcjpudWxsLGRyYWdnaW5nOiExLHJldmVydGluZzohMSxfbm9GaW5hbFNvcnQ6bnVsbH0pLHRoaXMuZG9tUG9zaXRpb24ucHJldj9lKHRoaXMuZG9tUG9zaXRpb24ucHJldikuYWZ0ZXIodGhpcy5jdXJyZW50SXRlbSk6ZSh0aGlzLmRvbVBvc2l0aW9uLnBhcmVudCkucHJlcGVuZCh0aGlzLmN1cnJlbnRJdGVtKSksdGhpc30sc2VyaWFsaXplOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX2dldEl0ZW1zQXNqUXVlcnkodCYmdC5jb25uZWN0ZWQpLHM9W107cmV0dXJuIHQ9dHx8e30sZShpKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9KGUodC5pdGVtfHx0aGlzKS5hdHRyKHQuYXR0cmlidXRlfHwiaWQiKXx8IiIpLm1hdGNoKHQuZXhwcmVzc2lvbnx8LyguKylbXC09X10oLispLyk7aSYmcy5wdXNoKCh0LmtleXx8aVsxXSsiW10iKSsiPSIrKHQua2V5JiZ0LmV4cHJlc3Npb24/aVsxXTppWzJdKSl9KSwhcy5sZW5ndGgmJnQua2V5JiZzLnB1c2godC5rZXkrIj0iKSxzLmpvaW4oIiYiKX0sdG9BcnJheTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9nZXRJdGVtc0FzalF1ZXJ5KHQmJnQuY29ubmVjdGVkKSxzPVtdO3JldHVybiB0PXR8fHt9LGkuZWFjaChmdW5jdGlvbigpe3MucHVzaChlKHQuaXRlbXx8dGhpcykuYXR0cih0LmF0dHJpYnV0ZXx8ImlkIil8fCIiKX0pLHN9LF9pbnRlcnNlY3RzV2l0aDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnBvc2l0aW9uQWJzLmxlZnQsaT10K3RoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgscz10aGlzLnBvc2l0aW9uQWJzLnRvcCxuPXMrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsYT1lLmxlZnQsbz1hK2Uud2lkdGgscj1lLnRvcCxoPXIrZS5oZWlnaHQsbD10aGlzLm9mZnNldC5jbGljay50b3AsdT10aGlzLm9mZnNldC5jbGljay5sZWZ0LGQ9IngiPT09dGhpcy5vcHRpb25zLmF4aXN8fHMrbD5yJiZoPnMrbCxjPSJ5Ij09PXRoaXMub3B0aW9ucy5heGlzfHx0K3U+YSYmbz50K3UscD1kJiZjO3JldHVybiJwb2ludGVyIj09PXRoaXMub3B0aW9ucy50b2xlcmFuY2V8fHRoaXMub3B0aW9ucy5mb3JjZVBvaW50ZXJGb3JDb250YWluZXJzfHwicG9pbnRlciIhPT10aGlzLm9wdGlvbnMudG9sZXJhbmNlJiZ0aGlzLmhlbHBlclByb3BvcnRpb25zW3RoaXMuZmxvYXRpbmc/IndpZHRoIjoiaGVpZ2h0Il0+ZVt0aGlzLmZsb2F0aW5nPyJ3aWR0aCI6ImhlaWdodCJdP3A6dCt0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLzI+YSYmbz5pLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMiYmcyt0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yPnImJmg+bi10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yfSxfaW50ZXJzZWN0c1dpdGhQb2ludGVyOmZ1bmN0aW9uKGUpe3ZhciB0PSJ4Ij09PXRoaXMub3B0aW9ucy5heGlzfHx0aGlzLl9pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMudG9wK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCxlLnRvcCxlLmhlaWdodCksaT0ieSI9PT10aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5faXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLmxlZnQrdGhpcy5vZmZzZXQuY2xpY2subGVmdCxlLmxlZnQsZS53aWR0aCkscz10JiZpLG49dGhpcy5fZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uKCksYT10aGlzLl9nZXREcmFnSG9yaXpvbnRhbERpcmVjdGlvbigpO3JldHVybiBzP3RoaXMuZmxvYXRpbmc/YSYmInJpZ2h0Ij09PWF8fCJkb3duIj09PW4/MjoxOm4mJigiZG93biI9PT1uPzI6MSk6ITF9LF9pbnRlcnNlY3RzV2l0aFNpZGVzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2lzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy50b3ArdGhpcy5vZmZzZXQuY2xpY2sudG9wLGUudG9wK2UuaGVpZ2h0LzIsZS5oZWlnaHQpLGk9dGhpcy5faXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLmxlZnQrdGhpcy5vZmZzZXQuY2xpY2subGVmdCxlLmxlZnQrZS53aWR0aC8yLGUud2lkdGgpLHM9dGhpcy5fZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uKCksbj10aGlzLl9nZXREcmFnSG9yaXpvbnRhbERpcmVjdGlvbigpO3JldHVybiB0aGlzLmZsb2F0aW5nJiZuPyJyaWdodCI9PT1uJiZpfHwibGVmdCI9PT1uJiYhaTpzJiYoImRvd24iPT09cyYmdHx8InVwIj09PXMmJiF0KX0sX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMucG9zaXRpb25BYnMudG9wLXRoaXMubGFzdFBvc2l0aW9uQWJzLnRvcDtyZXR1cm4gMCE9PWUmJihlPjA/ImRvd24iOiJ1cCIpfSxfZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBvc2l0aW9uQWJzLmxlZnQtdGhpcy5sYXN0UG9zaXRpb25BYnMubGVmdDtyZXR1cm4gMCE9PWUmJihlPjA/InJpZ2h0IjoibGVmdCIpfSxyZWZyZXNoOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9yZWZyZXNoSXRlbXMoZSksdGhpcy5fc2V0SGFuZGxlQ2xhc3NOYW1lKCksdGhpcy5yZWZyZXNoUG9zaXRpb25zKCksdGhpc30sX2Nvbm5lY3RXaXRoOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zO3JldHVybiBlLmNvbm5lY3RXaXRoLmNvbnN0cnVjdG9yPT09U3RyaW5nP1tlLmNvbm5lY3RXaXRoXTplLmNvbm5lY3RXaXRofSxfZ2V0SXRlbXNBc2pRdWVyeTpmdW5jdGlvbih0KXtmdW5jdGlvbiBpKCl7ci5wdXNoKHRoaXMpfXZhciBzLG4sYSxvLHI9W10saD1bXSxsPXRoaXMuX2Nvbm5lY3RXaXRoKCk7aWYobCYmdClmb3Iocz1sLmxlbmd0aC0xO3M+PTA7cy0tKWZvcihhPWUobFtzXSx0aGlzLmRvY3VtZW50WzBdKSxuPWEubGVuZ3RoLTE7bj49MDtuLS0pbz1lLmRhdGEoYVtuXSx0aGlzLndpZGdldEZ1bGxOYW1lKSxvJiZvIT09dGhpcyYmIW8ub3B0aW9ucy5kaXNhYmxlZCYmaC5wdXNoKFtlLmlzRnVuY3Rpb24oby5vcHRpb25zLml0ZW1zKT9vLm9wdGlvbnMuaXRlbXMuY2FsbChvLmVsZW1lbnQpOmUoby5vcHRpb25zLml0ZW1zLG8uZWxlbWVudCkubm90KCIudWktc29ydGFibGUtaGVscGVyIikubm90KCIudWktc29ydGFibGUtcGxhY2Vob2xkZXIiKSxvXSk7Zm9yKGgucHVzaChbZS5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5pdGVtcyk/dGhpcy5vcHRpb25zLml0ZW1zLmNhbGwodGhpcy5lbGVtZW50LG51bGwse29wdGlvbnM6dGhpcy5vcHRpb25zLGl0ZW06dGhpcy5jdXJyZW50SXRlbX0pOmUodGhpcy5vcHRpb25zLml0ZW1zLHRoaXMuZWxlbWVudCkubm90KCIudWktc29ydGFibGUtaGVscGVyIikubm90KCIudWktc29ydGFibGUtcGxhY2Vob2xkZXIiKSx0aGlzXSkscz1oLmxlbmd0aC0xO3M+PTA7cy0tKWhbc11bMF0uZWFjaChpKTtyZXR1cm4gZShyKX0sX3JlbW92ZUN1cnJlbnRzRnJvbUl0ZW1zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jdXJyZW50SXRlbS5maW5kKCI6ZGF0YSgiK3RoaXMud2lkZ2V0TmFtZSsiLWl0ZW0pIik7dGhpcy5pdGVtcz1lLmdyZXAodGhpcy5pdGVtcyxmdW5jdGlvbihlKXtmb3IodmFyIGk9MDt0Lmxlbmd0aD5pO2krKylpZih0W2ldPT09ZS5pdGVtWzBdKXJldHVybiExO3JldHVybiEwfSl9LF9yZWZyZXNoSXRlbXM6ZnVuY3Rpb24odCl7dGhpcy5pdGVtcz1bXSx0aGlzLmNvbnRhaW5lcnM9W3RoaXNdO3ZhciBpLHMsbixhLG8scixoLGwsdT10aGlzLml0ZW1zLGQ9W1tlLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLml0ZW1zKT90aGlzLm9wdGlvbnMuaXRlbXMuY2FsbCh0aGlzLmVsZW1lbnRbMF0sdCx7aXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6ZSh0aGlzLm9wdGlvbnMuaXRlbXMsdGhpcy5lbGVtZW50KSx0aGlzXV0sYz10aGlzLl9jb25uZWN0V2l0aCgpO2lmKGMmJnRoaXMucmVhZHkpZm9yKGk9Yy5sZW5ndGgtMTtpPj0wO2ktLSlmb3Iobj1lKGNbaV0sdGhpcy5kb2N1bWVudFswXSkscz1uLmxlbmd0aC0xO3M+PTA7cy0tKWE9ZS5kYXRhKG5bc10sdGhpcy53aWRnZXRGdWxsTmFtZSksYSYmYSE9PXRoaXMmJiFhLm9wdGlvbnMuZGlzYWJsZWQmJihkLnB1c2goW2UuaXNGdW5jdGlvbihhLm9wdGlvbnMuaXRlbXMpP2Eub3B0aW9ucy5pdGVtcy5jYWxsKGEuZWxlbWVudFswXSx0LHtpdGVtOnRoaXMuY3VycmVudEl0ZW19KTplKGEub3B0aW9ucy5pdGVtcyxhLmVsZW1lbnQpLGFdKSx0aGlzLmNvbnRhaW5lcnMucHVzaChhKSk7Zm9yKGk9ZC5sZW5ndGgtMTtpPj0wO2ktLSlmb3Iobz1kW2ldWzFdLHI9ZFtpXVswXSxzPTAsbD1yLmxlbmd0aDtsPnM7cysrKWg9ZShyW3NdKSxoLmRhdGEodGhpcy53aWRnZXROYW1lKyItaXRlbSIsbyksdS5wdXNoKHtpdGVtOmgsaW5zdGFuY2U6byx3aWR0aDowLGhlaWdodDowLGxlZnQ6MCx0b3A6MH0pfSxyZWZyZXNoUG9zaXRpb25zOmZ1bmN0aW9uKHQpe3RoaXMuZmxvYXRpbmc9dGhpcy5pdGVtcy5sZW5ndGg/IngiPT09dGhpcy5vcHRpb25zLmF4aXN8fHRoaXMuX2lzRmxvYXRpbmcodGhpcy5pdGVtc1swXS5pdGVtKTohMSx0aGlzLm9mZnNldFBhcmVudCYmdGhpcy5oZWxwZXImJih0aGlzLm9mZnNldC5wYXJlbnQ9dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkpO3ZhciBpLHMsbixhO2ZvcihpPXRoaXMuaXRlbXMubGVuZ3RoLTE7aT49MDtpLS0pcz10aGlzLml0ZW1zW2ldLHMuaW5zdGFuY2UhPT10aGlzLmN1cnJlbnRDb250YWluZXImJnRoaXMuY3VycmVudENvbnRhaW5lciYmcy5pdGVtWzBdIT09dGhpcy5jdXJyZW50SXRlbVswXXx8KG49dGhpcy5vcHRpb25zLnRvbGVyYW5jZUVsZW1lbnQ/ZSh0aGlzLm9wdGlvbnMudG9sZXJhbmNlRWxlbWVudCxzLml0ZW0pOnMuaXRlbSx0fHwocy53aWR0aD1uLm91dGVyV2lkdGgoKSxzLmhlaWdodD1uLm91dGVySGVpZ2h0KCkpLGE9bi5vZmZzZXQoKSxzLmxlZnQ9YS5sZWZ0LHMudG9wPWEudG9wKTtpZih0aGlzLm9wdGlvbnMuY3VzdG9tJiZ0aGlzLm9wdGlvbnMuY3VzdG9tLnJlZnJlc2hDb250YWluZXJzKXRoaXMub3B0aW9ucy5jdXN0b20ucmVmcmVzaENvbnRhaW5lcnMuY2FsbCh0aGlzKTtlbHNlIGZvcihpPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtpPj0wO2ktLSlhPXRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50Lm9mZnNldCgpLHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS5sZWZ0PWEubGVmdCx0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUudG9wPWEudG9wLHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS53aWR0aD10aGlzLmNvbnRhaW5lcnNbaV0uZWxlbWVudC5vdXRlcldpZHRoKCksdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLmhlaWdodD10aGlzLmNvbnRhaW5lcnNbaV0uZWxlbWVudC5vdXRlckhlaWdodCgpO3JldHVybiB0aGlzfSxfY3JlYXRlUGxhY2Vob2xkZXI6ZnVuY3Rpb24odCl7dD10fHx0aGlzO3ZhciBpLHM9dC5vcHRpb25zO3MucGxhY2Vob2xkZXImJnMucGxhY2Vob2xkZXIuY29uc3RydWN0b3IhPT1TdHJpbmd8fChpPXMucGxhY2Vob2xkZXIscy5wbGFjZWhvbGRlcj17ZWxlbWVudDpmdW5jdGlvbigpe3ZhciBzPXQuY3VycmVudEl0ZW1bMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxuPWUoIjwiK3MrIj4iLHQuZG9jdW1lbnRbMF0pLmFkZENsYXNzKGl8fHQuY3VycmVudEl0ZW1bMF0uY2xhc3NOYW1lKyIgdWktc29ydGFibGUtcGxhY2Vob2xkZXIiKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIik7cmV0dXJuInRib2R5Ij09PXM/dC5fY3JlYXRlVHJQbGFjZWhvbGRlcih0LmN1cnJlbnRJdGVtLmZpbmQoInRyIikuZXEoMCksZSgiPHRyPiIsdC5kb2N1bWVudFswXSkuYXBwZW5kVG8obikpOiJ0ciI9PT1zP3QuX2NyZWF0ZVRyUGxhY2Vob2xkZXIodC5jdXJyZW50SXRlbSxuKToiaW1nIj09PXMmJm4uYXR0cigic3JjIix0LmN1cnJlbnRJdGVtLmF0dHIoInNyYyIpKSxpfHxuLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpLG59LHVwZGF0ZTpmdW5jdGlvbihlLG4peyghaXx8cy5mb3JjZVBsYWNlaG9sZGVyU2l6ZSkmJihuLmhlaWdodCgpfHxuLmhlaWdodCh0LmN1cnJlbnRJdGVtLmlubmVySGVpZ2h0KCktcGFyc2VJbnQodC5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdUb3AiKXx8MCwxMCktcGFyc2VJbnQodC5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdCb3R0b20iKXx8MCwxMCkpLG4ud2lkdGgoKXx8bi53aWR0aCh0LmN1cnJlbnRJdGVtLmlubmVyV2lkdGgoKS1wYXJzZUludCh0LmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ0xlZnQiKXx8MCwxMCktcGFyc2VJbnQodC5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdSaWdodCIpfHwwLDEwKSkpfX0pLHQucGxhY2Vob2xkZXI9ZShzLnBsYWNlaG9sZGVyLmVsZW1lbnQuY2FsbCh0LmVsZW1lbnQsdC5jdXJyZW50SXRlbSkpLHQuY3VycmVudEl0ZW0uYWZ0ZXIodC5wbGFjZWhvbGRlcikscy5wbGFjZWhvbGRlci51cGRhdGUodCx0LnBsYWNlaG9sZGVyKX0sX2NyZWF0ZVRyUGxhY2Vob2xkZXI6ZnVuY3Rpb24odCxpKXt2YXIgcz10aGlzO3QuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCl7ZSgiPHRkPiYjMTYwOzwvdGQ+IixzLmRvY3VtZW50WzBdKS5hdHRyKCJjb2xzcGFuIixlKHRoaXMpLmF0dHIoImNvbHNwYW4iKXx8MSkuYXBwZW5kVG8oaSl9KX0sX2NvbnRhY3RDb250YWluZXJzOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhLG8scixoLGwsdSxkLGM9bnVsbCxwPW51bGw7Zm9yKGk9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2k+PTA7aS0tKWlmKCFlLmNvbnRhaW5zKHRoaXMuY3VycmVudEl0ZW1bMF0sdGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnRbMF0pKWlmKHRoaXMuX2ludGVyc2VjdHNXaXRoKHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZSkpe2lmKGMmJmUuY29udGFpbnModGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnRbMF0sYy5lbGVtZW50WzBdKSljb250aW51ZTtjPXRoaXMuY29udGFpbmVyc1tpXSxwPWl9ZWxzZSB0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3ZlciYmKHRoaXMuY29udGFpbmVyc1tpXS5fdHJpZ2dlcigib3V0Iix0LHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXI9MCk7aWYoYylpZigxPT09dGhpcy5jb250YWluZXJzLmxlbmd0aCl0aGlzLmNvbnRhaW5lcnNbcF0uY29udGFpbmVyQ2FjaGUub3Zlcnx8KHRoaXMuY29udGFpbmVyc1twXS5fdHJpZ2dlcigib3ZlciIsdCx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1twXS5jb250YWluZXJDYWNoZS5vdmVyPTEpO2Vsc2V7Zm9yKG49MWU0LGE9bnVsbCx1PWMuZmxvYXRpbmd8fHRoaXMuX2lzRmxvYXRpbmcodGhpcy5jdXJyZW50SXRlbSksbz11PyJsZWZ0IjoidG9wIixyPXU/IndpZHRoIjoiaGVpZ2h0IixkPXU/ImNsaWVudFgiOiJjbGllbnRZIixzPXRoaXMuaXRlbXMubGVuZ3RoLTE7cz49MDtzLS0pZS5jb250YWlucyh0aGlzLmNvbnRhaW5lcnNbcF0uZWxlbWVudFswXSx0aGlzLml0ZW1zW3NdLml0ZW1bMF0pJiZ0aGlzLml0ZW1zW3NdLml0ZW1bMF0hPT10aGlzLmN1cnJlbnRJdGVtWzBdJiYoaD10aGlzLml0ZW1zW3NdLml0ZW0ub2Zmc2V0KClbb10sbD0hMSx0W2RdLWg+dGhpcy5pdGVtc1tzXVtyXS8yJiYobD0hMCksbj5NYXRoLmFicyh0W2RdLWgpJiYobj1NYXRoLmFicyh0W2RdLWgpLGE9dGhpcy5pdGVtc1tzXSx0aGlzLmRpcmVjdGlvbj1sPyJ1cCI6ImRvd24iKSk7aWYoIWEmJiF0aGlzLm9wdGlvbnMuZHJvcE9uRW1wdHkpcmV0dXJuO2lmKHRoaXMuY3VycmVudENvbnRhaW5lcj09PXRoaXMuY29udGFpbmVyc1twXSlyZXR1cm4gdGhpcy5jdXJyZW50Q29udGFpbmVyLmNvbnRhaW5lckNhY2hlLm92ZXJ8fCh0aGlzLmNvbnRhaW5lcnNbcF0uX3RyaWdnZXIoIm92ZXIiLHQsdGhpcy5fdWlIYXNoKCkpLHRoaXMuY3VycmVudENvbnRhaW5lci5jb250YWluZXJDYWNoZS5vdmVyPTEpLHZvaWQgMDthP3RoaXMuX3JlYXJyYW5nZSh0LGEsbnVsbCwhMCk6dGhpcy5fcmVhcnJhbmdlKHQsbnVsbCx0aGlzLmNvbnRhaW5lcnNbcF0uZWxlbWVudCwhMCksdGhpcy5fdHJpZ2dlcigiY2hhbmdlIix0LHRoaXMuX3VpSGFzaCgpKSx0aGlzLmNvbnRhaW5lcnNbcF0uX3RyaWdnZXIoImNoYW5nZSIsdCx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY3VycmVudENvbnRhaW5lcj10aGlzLmNvbnRhaW5lcnNbcF0sdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyLnVwZGF0ZSh0aGlzLmN1cnJlbnRDb250YWluZXIsdGhpcy5wbGFjZWhvbGRlciksdGhpcy5jb250YWluZXJzW3BdLl90cmlnZ2VyKCJvdmVyIix0LHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW3BdLmNvbnRhaW5lckNhY2hlLm92ZXI9MX19LF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5vcHRpb25zLHM9ZS5pc0Z1bmN0aW9uKGkuaGVscGVyKT9lKGkuaGVscGVyLmFwcGx5KHRoaXMuZWxlbWVudFswXSxbdCx0aGlzLmN1cnJlbnRJdGVtXSkpOiJjbG9uZSI9PT1pLmhlbHBlcj90aGlzLmN1cnJlbnRJdGVtLmNsb25lKCk6dGhpcy5jdXJyZW50SXRlbTtyZXR1cm4gcy5wYXJlbnRzKCJib2R5IikubGVuZ3RofHxlKCJwYXJlbnQiIT09aS5hcHBlbmRUbz9pLmFwcGVuZFRvOnRoaXMuY3VycmVudEl0ZW1bMF0ucGFyZW50Tm9kZSlbMF0uYXBwZW5kQ2hpbGQoc1swXSksc1swXT09PXRoaXMuY3VycmVudEl0ZW1bMF0mJih0aGlzLl9zdG9yZWRDU1M9e3dpZHRoOnRoaXMuY3VycmVudEl0ZW1bMF0uc3R5bGUud2lkdGgsaGVpZ2h0OnRoaXMuY3VycmVudEl0ZW1bMF0uc3R5bGUuaGVpZ2h0LHBvc2l0aW9uOnRoaXMuY3VycmVudEl0ZW0uY3NzKCJwb3NpdGlvbiIpLHRvcDp0aGlzLmN1cnJlbnRJdGVtLmNzcygidG9wIiksbGVmdDp0aGlzLmN1cnJlbnRJdGVtLmNzcygibGVmdCIpfSksKCFzWzBdLnN0eWxlLndpZHRofHxpLmZvcmNlSGVscGVyU2l6ZSkmJnMud2lkdGgodGhpcy5jdXJyZW50SXRlbS53aWR0aCgpKSwoIXNbMF0uc3R5bGUuaGVpZ2h0fHxpLmZvcmNlSGVscGVyU2l6ZSkmJnMuaGVpZ2h0KHRoaXMuY3VycmVudEl0ZW0uaGVpZ2h0KCkpLHN9LF9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOmZ1bmN0aW9uKHQpeyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC5zcGxpdCgiICIpKSxlLmlzQXJyYXkodCkmJih0PXtsZWZ0Oit0WzBdLHRvcDordFsxXXx8MH0pLCJsZWZ0ImluIHQmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXQubGVmdCt0aGlzLm1hcmdpbnMubGVmdCksInJpZ2h0ImluIHQmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdC5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksInRvcCJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPXQudG9wK3RoaXMubWFyZ2lucy50b3ApLCJib3R0b20iaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10LmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wKX0sX2dldFBhcmVudE9mZnNldDpmdW5jdGlvbigpe3RoaXMub2Zmc2V0UGFyZW50PXRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpO3ZhciB0PXRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpO3JldHVybiJhYnNvbHV0ZSI9PT10aGlzLmNzc1Bvc2l0aW9uJiZ0aGlzLnNjcm9sbFBhcmVudFswXSE9PXRoaXMuZG9jdW1lbnRbMF0mJmUuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pJiYodC5sZWZ0Kz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCksdC50b3ArPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpKSwodGhpcy5vZmZzZXRQYXJlbnRbMF09PT10aGlzLmRvY3VtZW50WzBdLmJvZHl8fHRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUmJiJodG1sIj09PXRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUudG9Mb3dlckNhc2UoKSYmZS51aS5pZSkmJih0PXt0b3A6MCxsZWZ0OjB9KSx7dG9wOnQudG9wKyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSxsZWZ0OnQubGVmdCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApfX0sX2dldFJlbGF0aXZlT2Zmc2V0OmZ1bmN0aW9uKCl7aWYoInJlbGF0aXZlIj09PXRoaXMuY3NzUG9zaXRpb24pe3ZhciBlPXRoaXMuY3VycmVudEl0ZW0ucG9zaXRpb24oKTtyZXR1cm57dG9wOmUudG9wLShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoInRvcCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCksbGVmdDplLmxlZnQtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygibGVmdCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpfX1yZXR1cm57dG9wOjAsbGVmdDowfX0sX2NhY2hlTWFyZ2luczpmdW5jdGlvbigpe3RoaXMubWFyZ2lucz17bGVmdDpwYXJzZUludCh0aGlzLmN1cnJlbnRJdGVtLmNzcygibWFyZ2luTGVmdCIpLDEwKXx8MCx0b3A6cGFyc2VJbnQodGhpcy5jdXJyZW50SXRlbS5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MH19LF9jYWNoZUhlbHBlclByb3BvcnRpb25zOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXJQcm9wb3J0aW9ucz17d2lkdGg6dGhpcy5oZWxwZXIub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmhlbHBlci5vdXRlckhlaWdodCgpfX0sX3NldENvbnRhaW5tZW50OmZ1bmN0aW9uKCl7dmFyIHQsaSxzLG49dGhpcy5vcHRpb25zOyJwYXJlbnQiPT09bi5jb250YWlubWVudCYmKG4uY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSksKCJkb2N1bWVudCI9PT1uLmNvbnRhaW5tZW50fHwid2luZG93Ij09PW4uY29udGFpbm1lbnQpJiYodGhpcy5jb250YWlubWVudD1bMC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LDAtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AsImRvY3VtZW50Ij09PW4uY29udGFpbm1lbnQ/dGhpcy5kb2N1bWVudC53aWR0aCgpOnRoaXMud2luZG93LndpZHRoKCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCwoImRvY3VtZW50Ij09PW4uY29udGFpbm1lbnQ/dGhpcy5kb2N1bWVudC53aWR0aCgpOnRoaXMud2luZG93LmhlaWdodCgpfHx0aGlzLmRvY3VtZW50WzBdLmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdKSwvXihkb2N1bWVudHx3aW5kb3d8cGFyZW50KSQvLnRlc3Qobi5jb250YWlubWVudCl8fCh0PWUobi5jb250YWlubWVudClbMF0saT1lKG4uY29udGFpbm1lbnQpLm9mZnNldCgpLHM9ImhpZGRlbiIhPT1lKHQpLmNzcygib3ZlcmZsb3ciKSx0aGlzLmNvbnRhaW5tZW50PVtpLmxlZnQrKHBhcnNlSW50KGUodCkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChlKHQpLmNzcygicGFkZGluZ0xlZnQiKSwxMCl8fDApLXRoaXMubWFyZ2lucy5sZWZ0LGkudG9wKyhwYXJzZUludChlKHQpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChlKHQpLmNzcygicGFkZGluZ1RvcCIpLDEwKXx8MCktdGhpcy5tYXJnaW5zLnRvcCxpLmxlZnQrKHM/TWF0aC5tYXgodC5zY3JvbGxXaWR0aCx0Lm9mZnNldFdpZHRoKTp0Lm9mZnNldFdpZHRoKS0ocGFyc2VJbnQoZSh0KS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCktKHBhcnNlSW50KGUodCkuY3NzKCJwYWRkaW5nUmlnaHQiKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdGhpcy5tYXJnaW5zLmxlZnQsaS50b3ArKHM/TWF0aC5tYXgodC5zY3JvbGxIZWlnaHQsdC5vZmZzZXRIZWlnaHQpOnQub2Zmc2V0SGVpZ2h0KS0ocGFyc2VJbnQoZSh0KS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoZSh0KS5jc3MoInBhZGRpbmdCb3R0b20iKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdKX0sX2NvbnZlcnRQb3NpdGlvblRvOmZ1bmN0aW9uKHQsaSl7aXx8KGk9dGhpcy5wb3NpdGlvbik7dmFyIHM9ImFic29sdXRlIj09PXQ/MTotMSxuPSJhYnNvbHV0ZSIhPT10aGlzLmNzc1Bvc2l0aW9ufHx0aGlzLnNjcm9sbFBhcmVudFswXSE9PXRoaXMuZG9jdW1lbnRbMF0mJmUuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pP3RoaXMuc2Nyb2xsUGFyZW50OnRoaXMub2Zmc2V0UGFyZW50LGE9LyhodG1sfGJvZHkpL2kudGVzdChuWzBdLnRhZ05hbWUpO3JldHVybnt0b3A6aS50b3ArdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wKnMrdGhpcy5vZmZzZXQucGFyZW50LnRvcCpzLSgiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk6YT8wOm4uc2Nyb2xsVG9wKCkpKnMsbGVmdDppLmxlZnQrdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdCpzK3RoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KnMtKCJmaXhlZCI9PT10aGlzLmNzc1Bvc2l0aW9uPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6YT8wOm4uc2Nyb2xsTGVmdCgpKSpzfX0sX2dlbmVyYXRlUG9zaXRpb246ZnVuY3Rpb24odCl7dmFyIGkscyxuPXRoaXMub3B0aW9ucyxhPXQucGFnZVgsbz10LnBhZ2VZLHI9ImFic29sdXRlIiE9PXRoaXMuY3NzUG9zaXRpb258fHRoaXMuc2Nyb2xsUGFyZW50WzBdIT09dGhpcy5kb2N1bWVudFswXSYmZS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSk/dGhpcy5zY3JvbGxQYXJlbnQ6dGhpcy5vZmZzZXRQYXJlbnQsaD0vKGh0bWx8Ym9keSkvaS50ZXN0KHJbMF0udGFnTmFtZSk7cmV0dXJuInJlbGF0aXZlIiE9PXRoaXMuY3NzUG9zaXRpb258fHRoaXMuc2Nyb2xsUGFyZW50WzBdIT09dGhpcy5kb2N1bWVudFswXSYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPT10aGlzLm9mZnNldFBhcmVudFswXXx8KHRoaXMub2Zmc2V0LnJlbGF0aXZlPXRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCkpLHRoaXMub3JpZ2luYWxQb3NpdGlvbiYmKHRoaXMuY29udGFpbm1lbnQmJih0LnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dGhpcy5jb250YWlubWVudFswXSYmKGE9dGhpcy5jb250YWlubWVudFswXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0KSx0LnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx0aGlzLmNvbnRhaW5tZW50WzFdJiYobz10aGlzLmNvbnRhaW5tZW50WzFdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCksdC5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PnRoaXMuY29udGFpbm1lbnRbMl0mJihhPXRoaXMuY29udGFpbm1lbnRbMl0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksdC5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A+dGhpcy5jb250YWlubWVudFszXSYmKG89dGhpcy5jb250YWlubWVudFszXSt0aGlzLm9mZnNldC5jbGljay50b3ApKSxuLmdyaWQmJihpPXRoaXMub3JpZ2luYWxQYWdlWStNYXRoLnJvdW5kKChvLXRoaXMub3JpZ2luYWxQYWdlWSkvbi5ncmlkWzFdKSpuLmdyaWRbMV0sbz10aGlzLmNvbnRhaW5tZW50P2ktdGhpcy5vZmZzZXQuY2xpY2sudG9wPj10aGlzLmNvbnRhaW5tZW50WzFdJiZpLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDw9dGhpcy5jb250YWlubWVudFszXT9pOmktdGhpcy5vZmZzZXQuY2xpY2sudG9wPj10aGlzLmNvbnRhaW5tZW50WzFdP2ktbi5ncmlkWzFdOmkrbi5ncmlkWzFdOmkscz10aGlzLm9yaWdpbmFsUGFnZVgrTWF0aC5yb3VuZCgoYS10aGlzLm9yaWdpbmFsUGFnZVgpL24uZ3JpZFswXSkqbi5ncmlkWzBdLGE9dGhpcy5jb250YWlubWVudD9zLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+PXRoaXMuY29udGFpbm1lbnRbMF0mJnMtdGhpcy5vZmZzZXQuY2xpY2subGVmdDw9dGhpcy5jb250YWlubWVudFsyXT9zOnMtdGhpcy5vZmZzZXQuY2xpY2subGVmdD49dGhpcy5jb250YWlubWVudFswXT9zLW4uZ3JpZFswXTpzK24uZ3JpZFswXTpzKSkse3RvcDpvLXRoaXMub2Zmc2V0LmNsaWNrLnRvcC10aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AtdGhpcy5vZmZzZXQucGFyZW50LnRvcCsoImZpeGVkIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmg/MDpyLnNjcm9sbFRvcCgpKSxsZWZ0OmEtdGhpcy5vZmZzZXQuY2xpY2subGVmdC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KygiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpOmg/MDpyLnNjcm9sbExlZnQoKSl9fSxfcmVhcnJhbmdlOmZ1bmN0aW9uKGUsdCxpLHMpe2k/aVswXS5hcHBlbmRDaGlsZCh0aGlzLnBsYWNlaG9sZGVyWzBdKTp0Lml0ZW1bMF0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5wbGFjZWhvbGRlclswXSwiZG93biI9PT10aGlzLmRpcmVjdGlvbj90Lml0ZW1bMF06dC5pdGVtWzBdLm5leHRTaWJsaW5nKSx0aGlzLmNvdW50ZXI9dGhpcy5jb3VudGVyPysrdGhpcy5jb3VudGVyOjE7dmFyIG49dGhpcy5jb3VudGVyO3RoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7bj09PXRoaXMuY291bnRlciYmdGhpcy5yZWZyZXNoUG9zaXRpb25zKCFzKX0pfSxfY2xlYXI6ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBpKGUsdCxpKXtyZXR1cm4gZnVuY3Rpb24ocyl7aS5fdHJpZ2dlcihlLHMsdC5fdWlIYXNoKHQpKX19dGhpcy5yZXZlcnRpbmc9ITE7dmFyIHMsbj1bXTtpZighdGhpcy5fbm9GaW5hbFNvcnQmJnRoaXMuY3VycmVudEl0ZW0ucGFyZW50KCkubGVuZ3RoJiZ0aGlzLnBsYWNlaG9sZGVyLmJlZm9yZSh0aGlzLmN1cnJlbnRJdGVtKSx0aGlzLl9ub0ZpbmFsU29ydD1udWxsLHRoaXMuaGVscGVyWzBdPT09dGhpcy5jdXJyZW50SXRlbVswXSl7Zm9yKHMgaW4gdGhpcy5fc3RvcmVkQ1NTKSgiYXV0byI9PT10aGlzLl9zdG9yZWRDU1Nbc118fCJzdGF0aWMiPT09dGhpcy5fc3RvcmVkQ1NTW3NdKSYmKHRoaXMuX3N0b3JlZENTU1tzXT0iIik7dGhpcy5jdXJyZW50SXRlbS5jc3ModGhpcy5fc3RvcmVkQ1NTKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIil9ZWxzZSB0aGlzLmN1cnJlbnRJdGVtLnNob3coKTtmb3IodGhpcy5mcm9tT3V0c2lkZSYmIXQmJm4ucHVzaChmdW5jdGlvbihlKXt0aGlzLl90cmlnZ2VyKCJyZWNlaXZlIixlLHRoaXMuX3VpSGFzaCh0aGlzLmZyb21PdXRzaWRlKSl9KSwhdGhpcy5mcm9tT3V0c2lkZSYmdGhpcy5kb21Qb3NpdGlvbi5wcmV2PT09dGhpcy5jdXJyZW50SXRlbS5wcmV2KCkubm90KCIudWktc29ydGFibGUtaGVscGVyIilbMF0mJnRoaXMuZG9tUG9zaXRpb24ucGFyZW50PT09dGhpcy5jdXJyZW50SXRlbS5wYXJlbnQoKVswXXx8dHx8bi5wdXNoKGZ1bmN0aW9uKGUpe3RoaXMuX3RyaWdnZXIoInVwZGF0ZSIsZSx0aGlzLl91aUhhc2goKSl9KSx0aGlzIT09dGhpcy5jdXJyZW50Q29udGFpbmVyJiYodHx8KG4ucHVzaChmdW5jdGlvbihlKXt0aGlzLl90cmlnZ2VyKCJyZW1vdmUiLGUsdGhpcy5fdWlIYXNoKCkpfSksbi5wdXNoKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtlLl90cmlnZ2VyKCJyZWNlaXZlIix0LHRoaXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jdXJyZW50Q29udGFpbmVyKSksbi5wdXNoKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtlLl90cmlnZ2VyKCJ1cGRhdGUiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmN1cnJlbnRDb250YWluZXIpKSkpLHM9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO3M+PTA7cy0tKXR8fG4ucHVzaChpKCJkZWFjdGl2YXRlIix0aGlzLHRoaXMuY29udGFpbmVyc1tzXSkpLHRoaXMuY29udGFpbmVyc1tzXS5jb250YWluZXJDYWNoZS5vdmVyJiYobi5wdXNoKGkoIm91dCIsdGhpcyx0aGlzLmNvbnRhaW5lcnNbc10pKSx0aGlzLmNvbnRhaW5lcnNbc10uY29udGFpbmVyQ2FjaGUub3Zlcj0wKTtpZih0aGlzLnN0b3JlZEN1cnNvciYmKHRoaXMuZG9jdW1lbnQuZmluZCgiYm9keSIpLmNzcygiY3Vyc29yIix0aGlzLnN0b3JlZEN1cnNvciksdGhpcy5zdG9yZWRTdHlsZXNoZWV0LnJlbW92ZSgpKSx0aGlzLl9zdG9yZWRPcGFjaXR5JiZ0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiLHRoaXMuX3N0b3JlZE9wYWNpdHkpLHRoaXMuX3N0b3JlZFpJbmRleCYmdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLCJhdXRvIj09PXRoaXMuX3N0b3JlZFpJbmRleD8iIjp0aGlzLl9zdG9yZWRaSW5kZXgpLHRoaXMuZHJhZ2dpbmc9ITEsdHx8dGhpcy5fdHJpZ2dlcigiYmVmb3JlU3RvcCIsZSx0aGlzLl91aUhhc2goKSksdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pLHRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbHx8KHRoaXMuaGVscGVyWzBdIT09dGhpcy5jdXJyZW50SXRlbVswXSYmdGhpcy5oZWxwZXIucmVtb3ZlKCksdGhpcy5oZWxwZXI9bnVsbCksIXQpe2ZvcihzPTA7bi5sZW5ndGg+cztzKyspbltzXS5jYWxsKHRoaXMsZSk7dGhpcy5fdHJpZ2dlcigic3RvcCIsZSx0aGlzLl91aUhhc2goKSl9cmV0dXJuIHRoaXMuZnJvbU91dHNpZGU9ITEsIXRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbH0sX3RyaWdnZXI6ZnVuY3Rpb24oKXtlLldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpPT09ITEmJnRoaXMuY2FuY2VsKCl9LF91aUhhc2g6ZnVuY3Rpb24odCl7dmFyIGk9dHx8dGhpcztyZXR1cm57aGVscGVyOmkuaGVscGVyLHBsYWNlaG9sZGVyOmkucGxhY2Vob2xkZXJ8fGUoW10pLHBvc2l0aW9uOmkucG9zaXRpb24sb3JpZ2luYWxQb3NpdGlvbjppLm9yaWdpbmFsUG9zaXRpb24sb2Zmc2V0OmkucG9zaXRpb25BYnMsaXRlbTppLmN1cnJlbnRJdGVtLHNlbmRlcjp0P3QuZWxlbWVudDpudWxsfX19KSxlLndpZGdldCgidWkuYWNjb3JkaW9uIix7dmVyc2lvbjoiMS4xMS40IixvcHRpb25zOnthY3RpdmU6MCxhbmltYXRlOnt9LGNvbGxhcHNpYmxlOiExLGV2ZW50OiJjbGljayIsaGVhZGVyOiI+IGxpID4gOmZpcnN0LWNoaWxkLD4gOm5vdChsaSk6ZXZlbiIsaGVpZ2h0U3R5bGU6ImF1dG8iLGljb25zOnthY3RpdmVIZWFkZXI6InVpLWljb24tdHJpYW5nbGUtMS1zIixoZWFkZXI6InVpLWljb24tdHJpYW5nbGUtMS1lIn0sYWN0aXZhdGU6bnVsbCxiZWZvcmVBY3RpdmF0ZTpudWxsfSxoaWRlUHJvcHM6e2JvcmRlclRvcFdpZHRoOiJoaWRlIixib3JkZXJCb3R0b21XaWR0aDoiaGlkZSIscGFkZGluZ1RvcDoiaGlkZSIscGFkZGluZ0JvdHRvbToiaGlkZSIsaGVpZ2h0OiJoaWRlIn0sc2hvd1Byb3BzOntib3JkZXJUb3BXaWR0aDoic2hvdyIsYm9yZGVyQm90dG9tV2lkdGg6InNob3ciLHBhZGRpbmdUb3A6InNob3ciLHBhZGRpbmdCb3R0b206InNob3ciLGhlaWdodDoic2hvdyJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnM7dGhpcy5wcmV2U2hvdz10aGlzLnByZXZIaWRlPWUoKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWFjY29yZGlvbiB1aS13aWRnZXQgdWktaGVscGVyLXJlc2V0IikuYXR0cigicm9sZSIsInRhYmxpc3QiKSx0LmNvbGxhcHNpYmxlfHx0LmFjdGl2ZSE9PSExJiZudWxsIT10LmFjdGl2ZXx8KHQuYWN0aXZlPTApLHRoaXMuX3Byb2Nlc3NQYW5lbHMoKSwwPnQuYWN0aXZlJiYodC5hY3RpdmUrPXRoaXMuaGVhZGVycy5sZW5ndGgpLHRoaXMuX3JlZnJlc2goKX0sX2dldENyZWF0ZUV2ZW50RGF0YTpmdW5jdGlvbigpe3JldHVybntoZWFkZXI6dGhpcy5hY3RpdmUscGFuZWw6dGhpcy5hY3RpdmUubGVuZ3RoP3RoaXMuYWN0aXZlLm5leHQoKTplKCl9fSxfY3JlYXRlSWNvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuaWNvbnM7dCYmKGUoIjxzcGFuPiIpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taGVhZGVyLWljb24gdWktaWNvbiAiK3QuaGVhZGVyKS5wcmVwZW5kVG8odGhpcy5oZWFkZXJzKSx0aGlzLmFjdGl2ZS5jaGlsZHJlbigiLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiIpLnJlbW92ZUNsYXNzKHQuaGVhZGVyKS5hZGRDbGFzcyh0LmFjdGl2ZUhlYWRlciksdGhpcy5oZWFkZXJzLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taWNvbnMiKSl9LF9kZXN0cm95SWNvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlYWRlcnMucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbi1pY29ucyIpLmNoaWxkcmVuKCIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIikucmVtb3ZlKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGU7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24gdWktd2lkZ2V0IHVpLWhlbHBlci1yZXNldCIpLnJlbW92ZUF0dHIoInJvbGUiKSx0aGlzLmhlYWRlcnMucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXIgdWktYWNjb3JkaW9uLWhlYWRlci1hY3RpdmUgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCB1aS1jb3JuZXItdG9wIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtZXhwYW5kZWQiKS5yZW1vdmVBdHRyKCJhcmlhLXNlbGVjdGVkIikucmVtb3ZlQXR0cigiYXJpYS1jb250cm9scyIpLnJlbW92ZUF0dHIoInRhYkluZGV4IikucmVtb3ZlVW5pcXVlSWQoKSx0aGlzLl9kZXN0cm95SWNvbnMoKSxlPXRoaXMuaGVhZGVycy5uZXh0KCkucmVtb3ZlQ2xhc3MoInVpLWhlbHBlci1yZXNldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIHVpLWFjY29yZGlvbi1jb250ZW50IHVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCIpLmNzcygiZGlzcGxheSIsIiIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLWhpZGRlbiIpLnJlbW92ZUF0dHIoImFyaWEtbGFiZWxsZWRieSIpLnJlbW92ZVVuaXF1ZUlkKCksImNvbnRlbnQiIT09dGhpcy5vcHRpb25zLmhlaWdodFN0eWxlJiZlLmNzcygiaGVpZ2h0IiwiIil9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4iYWN0aXZlIj09PWU/KHRoaXMuX2FjdGl2YXRlKHQpLHZvaWQgMCk6KCJldmVudCI9PT1lJiYodGhpcy5vcHRpb25zLmV2ZW50JiZ0aGlzLl9vZmYodGhpcy5oZWFkZXJzLHRoaXMub3B0aW9ucy5ldmVudCksdGhpcy5fc2V0dXBFdmVudHModCkpLHRoaXMuX3N1cGVyKGUsdCksImNvbGxhcHNpYmxlIiE9PWV8fHR8fHRoaXMub3B0aW9ucy5hY3RpdmUhPT0hMXx8dGhpcy5fYWN0aXZhdGUoMCksImljb25zIj09PWUmJih0aGlzLl9kZXN0cm95SWNvbnMoKSx0JiZ0aGlzLl9jcmVhdGVJY29ucygpKSwiZGlzYWJsZWQiPT09ZSYmKHRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCkuYXR0cigiYXJpYS1kaXNhYmxlZCIsdCksdGhpcy5oZWFkZXJzLmFkZCh0aGlzLmhlYWRlcnMubmV4dCgpKS50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCkpLHZvaWQgMCl9LF9rZXlkb3duOmZ1bmN0aW9uKHQpe2lmKCF0LmFsdEtleSYmIXQuY3RybEtleSl7dmFyIGk9ZS51aS5rZXlDb2RlLHM9dGhpcy5oZWFkZXJzLmxlbmd0aCxuPXRoaXMuaGVhZGVycy5pbmRleCh0LnRhcmdldCksYT0hMTtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIGkuUklHSFQ6Y2FzZSBpLkRPV046YT10aGlzLmhlYWRlcnNbKG4rMSklc107YnJlYWs7Y2FzZSBpLkxFRlQ6Y2FzZSBpLlVQOmE9dGhpcy5oZWFkZXJzWyhuLTErcyklc107YnJlYWs7Y2FzZSBpLlNQQUNFOmNhc2UgaS5FTlRFUjp0aGlzLl9ldmVudEhhbmRsZXIodCk7YnJlYWs7Y2FzZSBpLkhPTUU6YT10aGlzLmhlYWRlcnNbMF07YnJlYWs7Y2FzZSBpLkVORDphPXRoaXMuaGVhZGVyc1tzLTFdfWEmJihlKHQudGFyZ2V0KS5hdHRyKCJ0YWJJbmRleCIsLTEpLGUoYSkuYXR0cigidGFiSW5kZXgiLDApLGEuZm9jdXMoKSx0LnByZXZlbnREZWZhdWx0KCkpfX0sX3BhbmVsS2V5RG93bjpmdW5jdGlvbih0KXt0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuVVAmJnQuY3RybEtleSYmZSh0LmN1cnJlbnRUYXJnZXQpLnByZXYoKS5mb2N1cygpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zO3RoaXMuX3Byb2Nlc3NQYW5lbHMoKSx0LmFjdGl2ZT09PSExJiZ0LmNvbGxhcHNpYmxlPT09ITB8fCF0aGlzLmhlYWRlcnMubGVuZ3RoPyh0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpOnQuYWN0aXZlPT09ITE/dGhpcy5fYWN0aXZhdGUoMCk6dGhpcy5hY3RpdmUubGVuZ3RoJiYhZS5jb250YWlucyh0aGlzLmVsZW1lbnRbMF0sdGhpcy5hY3RpdmVbMF0pP3RoaXMuaGVhZGVycy5sZW5ndGg9PT10aGlzLmhlYWRlcnMuZmluZCgiLnVpLXN0YXRlLWRpc2FibGVkIikubGVuZ3RoPyh0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpOnRoaXMuX2FjdGl2YXRlKE1hdGgubWF4KDAsdC5hY3RpdmUtMSkpOnQuYWN0aXZlPXRoaXMuaGVhZGVycy5pbmRleCh0aGlzLmFjdGl2ZSksdGhpcy5fZGVzdHJveUljb25zKCksdGhpcy5fcmVmcmVzaCgpfSxfcHJvY2Vzc1BhbmVsczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaGVhZGVycyx0PXRoaXMucGFuZWxzO3RoaXMuaGVhZGVycz10aGlzLmVsZW1lbnQuZmluZCh0aGlzLm9wdGlvbnMuaGVhZGVyKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlciB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKSx0aGlzLnBhbmVscz10aGlzLmhlYWRlcnMubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudCB1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpLmZpbHRlcigiOm5vdCgudWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlKSIpLmhpZGUoKSx0JiYodGhpcy5fb2ZmKGUubm90KHRoaXMuaGVhZGVycykpLHRoaXMuX29mZih0Lm5vdCh0aGlzLnBhbmVscykpKX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdCxpPXRoaXMub3B0aW9ucyxzPWkuaGVpZ2h0U3R5bGUsbj10aGlzLmVsZW1lbnQucGFyZW50KCk7dGhpcy5hY3RpdmU9dGhpcy5fZmluZEFjdGl2ZShpLmFjdGl2ZSkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSB1aS1jb3JuZXItdG9wIikucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci1hbGwiKSx0aGlzLmFjdGl2ZS5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpLnNob3coKSx0aGlzLmhlYWRlcnMuYXR0cigicm9sZSIsInRhYiIpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC51bmlxdWVJZCgpLmF0dHIoImlkIikscz10Lm5leHQoKSxuPXMudW5pcXVlSWQoKS5hdHRyKCJpZCIpO3QuYXR0cigiYXJpYS1jb250cm9scyIsbikscy5hdHRyKCJhcmlhLWxhYmVsbGVkYnkiLGkpfSkubmV4dCgpLmF0dHIoInJvbGUiLCJ0YWJwYW5lbCIpLHRoaXMuaGVhZGVycy5ub3QodGhpcy5hY3RpdmUpLmF0dHIoeyJhcmlhLXNlbGVjdGVkIjoiZmFsc2UiLCJhcmlhLWV4cGFuZGVkIjoiZmFsc2UiLHRhYkluZGV4Oi0xfSkubmV4dCgpLmF0dHIoeyJhcmlhLWhpZGRlbiI6InRydWUifSkuaGlkZSgpLHRoaXMuYWN0aXZlLmxlbmd0aD90aGlzLmFjdGl2ZS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLCJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pLm5leHQoKS5hdHRyKHsiYXJpYS1oaWRkZW4iOiJmYWxzZSJ9KTp0aGlzLmhlYWRlcnMuZXEoMCkuYXR0cigidGFiSW5kZXgiLDApLHRoaXMuX2NyZWF0ZUljb25zKCksdGhpcy5fc2V0dXBFdmVudHMoaS5ldmVudCksImZpbGwiPT09cz8odD1uLmhlaWdodCgpLHRoaXMuZWxlbWVudC5zaWJsaW5ncygiOnZpc2libGUiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9ZSh0aGlzKSxzPWkuY3NzKCJwb3NpdGlvbiIpOyJhYnNvbHV0ZSIhPT1zJiYiZml4ZWQiIT09cyYmKHQtPWkub3V0ZXJIZWlnaHQoITApKX0pLHRoaXMuaGVhZGVycy5lYWNoKGZ1bmN0aW9uKCl7dC09ZSh0aGlzKS5vdXRlckhlaWdodCghMCl9KSx0aGlzLmhlYWRlcnMubmV4dCgpLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmhlaWdodChNYXRoLm1heCgwLHQtZSh0aGlzKS5pbm5lckhlaWdodCgpK2UodGhpcykuaGVpZ2h0KCkpKX0pLmNzcygib3ZlcmZsb3ciLCJhdXRvIikpOiJhdXRvIj09PXMmJih0PTAsdGhpcy5oZWFkZXJzLm5leHQoKS5lYWNoKGZ1bmN0aW9uKCl7dD1NYXRoLm1heCh0LGUodGhpcykuY3NzKCJoZWlnaHQiLCIiKS5oZWlnaHQoKSl9KS5oZWlnaHQodCkpfSxfYWN0aXZhdGU6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fZmluZEFjdGl2ZSh0KVswXTtpIT09dGhpcy5hY3RpdmVbMF0mJihpPWl8fHRoaXMuYWN0aXZlWzBdLHRoaXMuX2V2ZW50SGFuZGxlcih7dGFyZ2V0OmksY3VycmVudFRhcmdldDppLHByZXZlbnREZWZhdWx0OmUubm9vcH0pKX0sX2ZpbmRBY3RpdmU6ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuaGVhZGVycy5lcSh0KTplKCl9LF9zZXR1cEV2ZW50czpmdW5jdGlvbih0KXt2YXIgaT17a2V5ZG93bjoiX2tleWRvd24ifTt0JiZlLmVhY2godC5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7aVt0XT0iX2V2ZW50SGFuZGxlciJ9KSx0aGlzLl9vZmYodGhpcy5oZWFkZXJzLmFkZCh0aGlzLmhlYWRlcnMubmV4dCgpKSksdGhpcy5fb24odGhpcy5oZWFkZXJzLGkpLHRoaXMuX29uKHRoaXMuaGVhZGVycy5uZXh0KCkse2tleWRvd246Il9wYW5lbEtleURvd24ifSksdGhpcy5faG92ZXJhYmxlKHRoaXMuaGVhZGVycyksdGhpcy5fZm9jdXNhYmxlKHRoaXMuaGVhZGVycyl9LF9ldmVudEhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5vcHRpb25zLHM9dGhpcy5hY3RpdmUsbj1lKHQuY3VycmVudFRhcmdldCksYT1uWzBdPT09c1swXSxvPWEmJmkuY29sbGFwc2libGUscj1vP2UoKTpuLm5leHQoKSxoPXMubmV4dCgpLGw9e29sZEhlYWRlcjpzLG9sZFBhbmVsOmgsbmV3SGVhZGVyOm8/ZSgpOm4sbmV3UGFuZWw6cn07CnQucHJldmVudERlZmF1bHQoKSxhJiYhaS5jb2xsYXBzaWJsZXx8dGhpcy5fdHJpZ2dlcigiYmVmb3JlQWN0aXZhdGUiLHQsbCk9PT0hMXx8KGkuYWN0aXZlPW8/ITE6dGhpcy5oZWFkZXJzLmluZGV4KG4pLHRoaXMuYWN0aXZlPWE/ZSgpOm4sdGhpcy5fdG9nZ2xlKGwpLHMucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIpLGkuaWNvbnMmJnMuY2hpbGRyZW4oIi51aS1hY2NvcmRpb24taGVhZGVyLWljb24iKS5yZW1vdmVDbGFzcyhpLmljb25zLmFjdGl2ZUhlYWRlcikuYWRkQ2xhc3MoaS5pY29ucy5oZWFkZXIpLGF8fChuLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItYWxsIikuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSB1aS1jb3JuZXItdG9wIiksaS5pY29ucyYmbi5jaGlsZHJlbigiLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiIpLnJlbW92ZUNsYXNzKGkuaWNvbnMuaGVhZGVyKS5hZGRDbGFzcyhpLmljb25zLmFjdGl2ZUhlYWRlciksbi5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpKSl9LF90b2dnbGU6ZnVuY3Rpb24odCl7dmFyIGk9dC5uZXdQYW5lbCxzPXRoaXMucHJldlNob3cubGVuZ3RoP3RoaXMucHJldlNob3c6dC5vbGRQYW5lbDt0aGlzLnByZXZTaG93LmFkZCh0aGlzLnByZXZIaWRlKS5zdG9wKCEwLCEwKSx0aGlzLnByZXZTaG93PWksdGhpcy5wcmV2SGlkZT1zLHRoaXMub3B0aW9ucy5hbmltYXRlP3RoaXMuX2FuaW1hdGUoaSxzLHQpOihzLmhpZGUoKSxpLnNob3coKSx0aGlzLl90b2dnbGVDb21wbGV0ZSh0KSkscy5hdHRyKHsiYXJpYS1oaWRkZW4iOiJ0cnVlIn0pLHMucHJldigpLmF0dHIoeyJhcmlhLXNlbGVjdGVkIjoiZmFsc2UiLCJhcmlhLWV4cGFuZGVkIjoiZmFsc2UifSksaS5sZW5ndGgmJnMubGVuZ3RoP3MucHJldigpLmF0dHIoe3RhYkluZGV4Oi0xLCJhcmlhLWV4cGFuZGVkIjoiZmFsc2UifSk6aS5sZW5ndGgmJnRoaXMuaGVhZGVycy5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gMD09PXBhcnNlSW50KGUodGhpcykuYXR0cigidGFiSW5kZXgiKSwxMCl9KS5hdHRyKCJ0YWJJbmRleCIsLTEpLGkuYXR0cigiYXJpYS1oaWRkZW4iLCJmYWxzZSIpLnByZXYoKS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLCJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pfSxfYW5pbWF0ZTpmdW5jdGlvbihlLHQsaSl7dmFyIHMsbixhLG89dGhpcyxyPTAsaD1lLmNzcygiYm94LXNpemluZyIpLGw9ZS5sZW5ndGgmJighdC5sZW5ndGh8fGUuaW5kZXgoKTx0LmluZGV4KCkpLHU9dGhpcy5vcHRpb25zLmFuaW1hdGV8fHt9LGQ9bCYmdS5kb3dufHx1LGM9ZnVuY3Rpb24oKXtvLl90b2dnbGVDb21wbGV0ZShpKX07cmV0dXJuIm51bWJlciI9PXR5cGVvZiBkJiYoYT1kKSwic3RyaW5nIj09dHlwZW9mIGQmJihuPWQpLG49bnx8ZC5lYXNpbmd8fHUuZWFzaW5nLGE9YXx8ZC5kdXJhdGlvbnx8dS5kdXJhdGlvbix0Lmxlbmd0aD9lLmxlbmd0aD8ocz1lLnNob3coKS5vdXRlckhlaWdodCgpLHQuYW5pbWF0ZSh0aGlzLmhpZGVQcm9wcyx7ZHVyYXRpb246YSxlYXNpbmc6bixzdGVwOmZ1bmN0aW9uKGUsdCl7dC5ub3c9TWF0aC5yb3VuZChlKX19KSxlLmhpZGUoKS5hbmltYXRlKHRoaXMuc2hvd1Byb3BzLHtkdXJhdGlvbjphLGVhc2luZzpuLGNvbXBsZXRlOmMsc3RlcDpmdW5jdGlvbihlLGkpe2kubm93PU1hdGgucm91bmQoZSksImhlaWdodCIhPT1pLnByb3A/ImNvbnRlbnQtYm94Ij09PWgmJihyKz1pLm5vdyk6ImNvbnRlbnQiIT09by5vcHRpb25zLmhlaWdodFN0eWxlJiYoaS5ub3c9TWF0aC5yb3VuZChzLXQub3V0ZXJIZWlnaHQoKS1yKSxyPTApfX0pLHZvaWQgMCk6dC5hbmltYXRlKHRoaXMuaGlkZVByb3BzLGEsbixjKTplLmFuaW1hdGUodGhpcy5zaG93UHJvcHMsYSxuLGMpfSxfdG9nZ2xlQ29tcGxldGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vbGRQYW5lbDt0LnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKS5wcmV2KCkucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci10b3AiKS5hZGRDbGFzcygidWktY29ybmVyLWFsbCIpLHQubGVuZ3RoJiYodC5wYXJlbnQoKVswXS5jbGFzc05hbWU9dC5wYXJlbnQoKVswXS5jbGFzc05hbWUpLHRoaXMuX3RyaWdnZXIoImFjdGl2YXRlIixudWxsLGUpfX0pLGUud2lkZ2V0KCJ1aS5tZW51Iix7dmVyc2lvbjoiMS4xMS40IixkZWZhdWx0RWxlbWVudDoiPHVsPiIsZGVsYXk6MzAwLG9wdGlvbnM6e2ljb25zOntzdWJtZW51OiJ1aS1pY29uLWNhcmF0LTEtZSJ9LGl0ZW1zOiI+ICoiLG1lbnVzOiJ1bCIscG9zaXRpb246e215OiJsZWZ0LTEgdG9wIixhdDoicmlnaHQgdG9wIn0scm9sZToibWVudSIsYmx1cjpudWxsLGZvY3VzOm51bGwsc2VsZWN0Om51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZU1lbnU9dGhpcy5lbGVtZW50LHRoaXMubW91c2VIYW5kbGVkPSExLHRoaXMuZWxlbWVudC51bmlxdWVJZCgpLmFkZENsYXNzKCJ1aS1tZW51IHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCIpLnRvZ2dsZUNsYXNzKCJ1aS1tZW51LWljb25zIiwhIXRoaXMuZWxlbWVudC5maW5kKCIudWktaWNvbiIpLmxlbmd0aCkuYXR0cih7cm9sZTp0aGlzLm9wdGlvbnMucm9sZSx0YWJJbmRleDowfSksdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSx0aGlzLl9vbih7Im1vdXNlZG93biAudWktbWVudS1pdGVtIjpmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCl9LCJjbGljayAudWktbWVudS1pdGVtIjpmdW5jdGlvbih0KXt2YXIgaT1lKHQudGFyZ2V0KTshdGhpcy5tb3VzZUhhbmRsZWQmJmkubm90KCIudWktc3RhdGUtZGlzYWJsZWQiKS5sZW5ndGgmJih0aGlzLnNlbGVjdCh0KSx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCl8fCh0aGlzLm1vdXNlSGFuZGxlZD0hMCksaS5oYXMoIi51aS1tZW51IikubGVuZ3RoP3RoaXMuZXhwYW5kKHQpOiF0aGlzLmVsZW1lbnQuaXMoIjpmb2N1cyIpJiZlKHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCkuY2xvc2VzdCgiLnVpLW1lbnUiKS5sZW5ndGgmJih0aGlzLmVsZW1lbnQudHJpZ2dlcigiZm9jdXMiLFshMF0pLHRoaXMuYWN0aXZlJiYxPT09dGhpcy5hY3RpdmUucGFyZW50cygiLnVpLW1lbnUiKS5sZW5ndGgmJmNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSkpfSwibW91c2VlbnRlciAudWktbWVudS1pdGVtIjpmdW5jdGlvbih0KXtpZighdGhpcy5wcmV2aW91c0ZpbHRlcil7dmFyIGk9ZSh0LmN1cnJlbnRUYXJnZXQpO2kuc2libGluZ3MoIi51aS1zdGF0ZS1hY3RpdmUiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdGhpcy5mb2N1cyh0LGkpfX0sbW91c2VsZWF2ZToiY29sbGFwc2VBbGwiLCJtb3VzZWxlYXZlIC51aS1tZW51IjoiY29sbGFwc2VBbGwiLGZvY3VzOmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5hY3RpdmV8fHRoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuZXEoMCk7dHx8dGhpcy5mb2N1cyhlLGkpfSxibHVyOmZ1bmN0aW9uKHQpe3RoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7ZS5jb250YWlucyh0aGlzLmVsZW1lbnRbMF0sdGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50KXx8dGhpcy5jb2xsYXBzZUFsbCh0KX0pfSxrZXlkb3duOiJfa2V5ZG93biJ9KSx0aGlzLnJlZnJlc2goKSx0aGlzLl9vbih0aGlzLmRvY3VtZW50LHtjbGljazpmdW5jdGlvbihlKXt0aGlzLl9jbG9zZU9uRG9jdW1lbnRDbGljayhlKSYmdGhpcy5jb2xsYXBzZUFsbChlKSx0aGlzLm1vdXNlSGFuZGxlZD0hMX19KX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cigiYXJpYS1hY3RpdmVkZXNjZW5kYW50IikuZmluZCgiLnVpLW1lbnUiKS5hZGRCYWNrKCkucmVtb3ZlQ2xhc3MoInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLW1lbnUtaWNvbnMgdWktZnJvbnQiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigidGFiSW5kZXgiKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsbGVkYnkiKS5yZW1vdmVBdHRyKCJhcmlhLWV4cGFuZGVkIikucmVtb3ZlQXR0cigiYXJpYS1oaWRkZW4iKS5yZW1vdmVBdHRyKCJhcmlhLWRpc2FibGVkIikucmVtb3ZlVW5pcXVlSWQoKS5zaG93KCksdGhpcy5lbGVtZW50LmZpbmQoIi51aS1tZW51LWl0ZW0iKS5yZW1vdmVDbGFzcygidWktbWVudS1pdGVtIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKS5yZW1vdmVVbmlxdWVJZCgpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLnJlbW92ZUF0dHIoInRhYkluZGV4IikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtaGFzcG9wdXAiKS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3QuZGF0YSgidWktbWVudS1zdWJtZW51LWNhcmF0IikmJnQucmVtb3ZlKCl9KSx0aGlzLmVsZW1lbnQuZmluZCgiLnVpLW1lbnUtZGl2aWRlciIpLnJlbW92ZUNsYXNzKCJ1aS1tZW51LWRpdmlkZXIgdWktd2lkZ2V0LWNvbnRlbnQiKX0sX2tleWRvd246ZnVuY3Rpb24odCl7dmFyIGkscyxuLGEsbz0hMDtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIGUudWkua2V5Q29kZS5QQUdFX1VQOnRoaXMucHJldmlvdXNQYWdlKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlBBR0VfRE9XTjp0aGlzLm5leHRQYWdlKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6dGhpcy5fbW92ZSgiZmlyc3QiLCJmaXJzdCIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5EOnRoaXMuX21vdmUoImxhc3QiLCJsYXN0Iix0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5VUDp0aGlzLnByZXZpb3VzKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkRPV046dGhpcy5uZXh0KHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkxFRlQ6dGhpcy5jb2xsYXBzZSh0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5SSUdIVDp0aGlzLmFjdGl2ZSYmIXRoaXMuYWN0aXZlLmlzKCIudWktc3RhdGUtZGlzYWJsZWQiKSYmdGhpcy5leHBhbmQodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5URVI6Y2FzZSBlLnVpLmtleUNvZGUuU1BBQ0U6dGhpcy5fYWN0aXZhdGUodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRVNDQVBFOnRoaXMuY29sbGFwc2UodCk7YnJlYWs7ZGVmYXVsdDpvPSExLHM9dGhpcy5wcmV2aW91c0ZpbHRlcnx8IiIsbj1TdHJpbmcuZnJvbUNoYXJDb2RlKHQua2V5Q29kZSksYT0hMSxjbGVhclRpbWVvdXQodGhpcy5maWx0ZXJUaW1lciksbj09PXM/YT0hMDpuPXMrbixpPXRoaXMuX2ZpbHRlck1lbnVJdGVtcyhuKSxpPWEmJi0xIT09aS5pbmRleCh0aGlzLmFjdGl2ZS5uZXh0KCkpP3RoaXMuYWN0aXZlLm5leHRBbGwoIi51aS1tZW51LWl0ZW0iKTppLGkubGVuZ3RofHwobj1TdHJpbmcuZnJvbUNoYXJDb2RlKHQua2V5Q29kZSksaT10aGlzLl9maWx0ZXJNZW51SXRlbXMobikpLGkubGVuZ3RoPyh0aGlzLmZvY3VzKHQsaSksdGhpcy5wcmV2aW91c0ZpbHRlcj1uLHRoaXMuZmlsdGVyVGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5wcmV2aW91c0ZpbHRlcn0sMWUzKSk6ZGVsZXRlIHRoaXMucHJldmlvdXNGaWx0ZXJ9byYmdC5wcmV2ZW50RGVmYXVsdCgpfSxfYWN0aXZhdGU6ZnVuY3Rpb24oZSl7dGhpcy5hY3RpdmUuaXMoIi51aS1zdGF0ZS1kaXNhYmxlZCIpfHwodGhpcy5hY3RpdmUuaXMoIlthcmlhLWhhc3BvcHVwPSd0cnVlJ10iKT90aGlzLmV4cGFuZChlKTp0aGlzLnNlbGVjdChlKSl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdCxpLHM9dGhpcyxuPXRoaXMub3B0aW9ucy5pY29ucy5zdWJtZW51LGE9dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLm1lbnVzKTt0aGlzLmVsZW1lbnQudG9nZ2xlQ2xhc3MoInVpLW1lbnUtaWNvbnMiLCEhdGhpcy5lbGVtZW50LmZpbmQoIi51aS1pY29uIikubGVuZ3RoKSxhLmZpbHRlcigiOm5vdCgudWktbWVudSkiKS5hZGRDbGFzcygidWktbWVudSB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktZnJvbnQiKS5oaWRlKCkuYXR0cih7cm9sZTp0aGlzLm9wdGlvbnMucm9sZSwiYXJpYS1oaWRkZW4iOiJ0cnVlIiwiYXJpYS1leHBhbmRlZCI6ImZhbHNlIn0pLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC5wYXJlbnQoKSxzPWUoIjxzcGFuPiIpLmFkZENsYXNzKCJ1aS1tZW51LWljb24gdWktaWNvbiAiK24pLmRhdGEoInVpLW1lbnUtc3VibWVudS1jYXJhdCIsITApO2kuYXR0cigiYXJpYS1oYXNwb3B1cCIsInRydWUiKS5wcmVwZW5kKHMpLHQuYXR0cigiYXJpYS1sYWJlbGxlZGJ5IixpLmF0dHIoImlkIikpfSksdD1hLmFkZCh0aGlzLmVsZW1lbnQpLGk9dC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcyksaS5ub3QoIi51aS1tZW51LWl0ZW0iKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtzLl9pc0RpdmlkZXIodCkmJnQuYWRkQ2xhc3MoInVpLXdpZGdldC1jb250ZW50IHVpLW1lbnUtZGl2aWRlciIpfSksaS5ub3QoIi51aS1tZW51LWl0ZW0sIC51aS1tZW51LWRpdmlkZXIiKS5hZGRDbGFzcygidWktbWVudS1pdGVtIikudW5pcXVlSWQoKS5hdHRyKHt0YWJJbmRleDotMSxyb2xlOnRoaXMuX2l0ZW1Sb2xlKCl9KSxpLmZpbHRlcigiLnVpLXN0YXRlLWRpc2FibGVkIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSx0aGlzLmFjdGl2ZSYmIWUuY29udGFpbnModGhpcy5lbGVtZW50WzBdLHRoaXMuYWN0aXZlWzBdKSYmdGhpcy5ibHVyKCl9LF9pdGVtUm9sZTpmdW5jdGlvbigpe3JldHVybnttZW51OiJtZW51aXRlbSIsbGlzdGJveDoib3B0aW9uIn1bdGhpcy5vcHRpb25zLnJvbGVdfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7Imljb25zIj09PWUmJnRoaXMuZWxlbWVudC5maW5kKCIudWktbWVudS1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmljb25zLnN1Ym1lbnUpLmFkZENsYXNzKHQuc3VibWVudSksImRpc2FibGVkIj09PWUmJnRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCkuYXR0cigiYXJpYS1kaXNhYmxlZCIsdCksdGhpcy5fc3VwZXIoZSx0KX0sZm9jdXM6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzO3RoaXMuYmx1cihlLGUmJiJmb2N1cyI9PT1lLnR5cGUpLHRoaXMuX3Njcm9sbEludG9WaWV3KHQpLHRoaXMuYWN0aXZlPXQuZmlyc3QoKSxzPXRoaXMuYWN0aXZlLmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLm9wdGlvbnMucm9sZSYmdGhpcy5lbGVtZW50LmF0dHIoImFyaWEtYWN0aXZlZGVzY2VuZGFudCIscy5hdHRyKCJpZCIpKSx0aGlzLmFjdGl2ZS5wYXJlbnQoKS5jbG9zZXN0KCIudWktbWVudS1pdGVtIikuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGUmJiJrZXlkb3duIj09PWUudHlwZT90aGlzLl9jbG9zZSgpOnRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLl9jbG9zZSgpfSx0aGlzLmRlbGF5KSxpPXQuY2hpbGRyZW4oIi51aS1tZW51IiksaS5sZW5ndGgmJmUmJi9ebW91c2UvLnRlc3QoZS50eXBlKSYmdGhpcy5fc3RhcnRPcGVuaW5nKGkpLHRoaXMuYWN0aXZlTWVudT10LnBhcmVudCgpLHRoaXMuX3RyaWdnZXIoImZvY3VzIixlLHtpdGVtOnR9KX0sX3Njcm9sbEludG9WaWV3OmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhLG8scjt0aGlzLl9oYXNTY3JvbGwoKSYmKGk9cGFyc2VGbG9hdChlLmNzcyh0aGlzLmFjdGl2ZU1lbnVbMF0sImJvcmRlclRvcFdpZHRoIikpfHwwLHM9cGFyc2VGbG9hdChlLmNzcyh0aGlzLmFjdGl2ZU1lbnVbMF0sInBhZGRpbmdUb3AiKSl8fDAsbj10Lm9mZnNldCgpLnRvcC10aGlzLmFjdGl2ZU1lbnUub2Zmc2V0KCkudG9wLWktcyxhPXRoaXMuYWN0aXZlTWVudS5zY3JvbGxUb3AoKSxvPXRoaXMuYWN0aXZlTWVudS5oZWlnaHQoKSxyPXQub3V0ZXJIZWlnaHQoKSwwPm4/dGhpcy5hY3RpdmVNZW51LnNjcm9sbFRvcChhK24pOm4rcj5vJiZ0aGlzLmFjdGl2ZU1lbnUuc2Nyb2xsVG9wKGErbi1vK3IpKX0sYmx1cjpmdW5jdGlvbihlLHQpe3R8fGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLmFjdGl2ZSYmKHRoaXMuYWN0aXZlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpLHRoaXMuYWN0aXZlPW51bGwsdGhpcy5fdHJpZ2dlcigiYmx1ciIsZSx7aXRlbTp0aGlzLmFjdGl2ZX0pKX0sX3N0YXJ0T3BlbmluZzpmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQodGhpcy50aW1lciksInRydWUiPT09ZS5hdHRyKCJhcmlhLWhpZGRlbiIpJiYodGhpcy50aW1lcj10aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMuX2Nsb3NlKCksdGhpcy5fb3BlbihlKX0sdGhpcy5kZWxheSkpfSxfb3BlbjpmdW5jdGlvbih0KXt2YXIgaT1lLmV4dGVuZCh7b2Y6dGhpcy5hY3RpdmV9LHRoaXMub3B0aW9ucy5wb3NpdGlvbik7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMuZWxlbWVudC5maW5kKCIudWktbWVudSIpLm5vdCh0LnBhcmVudHMoIi51aS1tZW51IikpLmhpZGUoKS5hdHRyKCJhcmlhLWhpZGRlbiIsInRydWUiKSx0LnNob3coKS5yZW1vdmVBdHRyKCJhcmlhLWhpZGRlbiIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJ0cnVlIikucG9zaXRpb24oaSl9LGNvbGxhcHNlQWxsOmZ1bmN0aW9uKHQsaSl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt2YXIgcz1pP3RoaXMuZWxlbWVudDplKHQmJnQudGFyZ2V0KS5jbG9zZXN0KHRoaXMuZWxlbWVudC5maW5kKCIudWktbWVudSIpKTtzLmxlbmd0aHx8KHM9dGhpcy5lbGVtZW50KSx0aGlzLl9jbG9zZShzKSx0aGlzLmJsdXIodCksdGhpcy5hY3RpdmVNZW51PXN9LHRoaXMuZGVsYXkpfSxfY2xvc2U6ZnVuY3Rpb24oZSl7ZXx8KGU9dGhpcy5hY3RpdmU/dGhpcy5hY3RpdmUucGFyZW50KCk6dGhpcy5lbGVtZW50KSxlLmZpbmQoIi51aS1tZW51IikuaGlkZSgpLmF0dHIoImFyaWEtaGlkZGVuIiwidHJ1ZSIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpLmVuZCgpLmZpbmQoIi51aS1zdGF0ZS1hY3RpdmUiKS5ub3QoIi51aS1zdGF0ZS1mb2N1cyIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKX0sX2Nsb3NlT25Eb2N1bWVudENsaWNrOmZ1bmN0aW9uKHQpe3JldHVybiFlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktbWVudSIpLmxlbmd0aH0sX2lzRGl2aWRlcjpmdW5jdGlvbihlKXtyZXR1cm4hL1teXC1cdTIwMTRcdTIwMTNcc10vLnRlc3QoZS50ZXh0KCkpfSxjb2xsYXBzZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmFjdGl2ZSYmdGhpcy5hY3RpdmUucGFyZW50KCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSIsdGhpcy5lbGVtZW50KTt0JiZ0Lmxlbmd0aCYmKHRoaXMuX2Nsb3NlKCksdGhpcy5mb2N1cyhlLHQpKX0sZXhwYW5kOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuYWN0aXZlJiZ0aGlzLmFjdGl2ZS5jaGlsZHJlbigiLnVpLW1lbnUgIikuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMpLmZpcnN0KCk7dCYmdC5sZW5ndGgmJih0aGlzLl9vcGVuKHQucGFyZW50KCkpLHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5mb2N1cyhlLHQpfSkpfSxuZXh0OmZ1bmN0aW9uKGUpe3RoaXMuX21vdmUoIm5leHQiLCJmaXJzdCIsZSl9LHByZXZpb3VzOmZ1bmN0aW9uKGUpe3RoaXMuX21vdmUoInByZXYiLCJsYXN0IixlKX0saXNGaXJzdEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmUmJiF0aGlzLmFjdGl2ZS5wcmV2QWxsKCIudWktbWVudS1pdGVtIikubGVuZ3RofSxpc0xhc3RJdGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUubmV4dEFsbCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aH0sX21vdmU6ZnVuY3Rpb24oZSx0LGkpe3ZhciBzO3RoaXMuYWN0aXZlJiYocz0iZmlyc3QiPT09ZXx8Imxhc3QiPT09ZT90aGlzLmFjdGl2ZVsiZmlyc3QiPT09ZT8icHJldkFsbCI6Im5leHRBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKC0xKTp0aGlzLmFjdGl2ZVtlKyJBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKDApKSxzJiZzLmxlbmd0aCYmdGhpcy5hY3RpdmV8fChzPXRoaXMuYWN0aXZlTWVudS5maW5kKHRoaXMub3B0aW9ucy5pdGVtcylbdF0oKSksdGhpcy5mb2N1cyhpLHMpfSxuZXh0UGFnZTpmdW5jdGlvbih0KXt2YXIgaSxzLG47cmV0dXJuIHRoaXMuYWN0aXZlPyh0aGlzLmlzTGFzdEl0ZW0oKXx8KHRoaXMuX2hhc1Njcm9sbCgpPyhzPXRoaXMuYWN0aXZlLm9mZnNldCgpLnRvcCxuPXRoaXMuZWxlbWVudC5oZWlnaHQoKSx0aGlzLmFjdGl2ZS5uZXh0QWxsKCIudWktbWVudS1pdGVtIikuZWFjaChmdW5jdGlvbigpe3JldHVybiBpPWUodGhpcyksMD5pLm9mZnNldCgpLnRvcC1zLW59KSx0aGlzLmZvY3VzKHQsaSkpOnRoaXMuZm9jdXModCx0aGlzLmFjdGl2ZU1lbnUuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMpW3RoaXMuYWN0aXZlPyJsYXN0IjoiZmlyc3QiXSgpKSksdm9pZCAwKToodGhpcy5uZXh0KHQpLHZvaWQgMCl9LHByZXZpb3VzUGFnZTpmdW5jdGlvbih0KXt2YXIgaSxzLG47cmV0dXJuIHRoaXMuYWN0aXZlPyh0aGlzLmlzRmlyc3RJdGVtKCl8fCh0aGlzLl9oYXNTY3JvbGwoKT8ocz10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3Asbj10aGlzLmVsZW1lbnQuaGVpZ2h0KCksdGhpcy5hY3RpdmUucHJldkFsbCgiLnVpLW1lbnUtaXRlbSIpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gaT1lKHRoaXMpLGkub2Zmc2V0KCkudG9wLXMrbj4wfSksdGhpcy5mb2N1cyh0LGkpKTp0aGlzLmZvY3VzKHQsdGhpcy5hY3RpdmVNZW51LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5maXJzdCgpKSksdm9pZCAwKToodGhpcy5uZXh0KHQpLHZvaWQgMCl9LF9oYXNTY3JvbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCk8dGhpcy5lbGVtZW50LnByb3AoInNjcm9sbEhlaWdodCIpfSxzZWxlY3Q6ZnVuY3Rpb24odCl7dGhpcy5hY3RpdmU9dGhpcy5hY3RpdmV8fGUodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1tZW51LWl0ZW0iKTt2YXIgaT17aXRlbTp0aGlzLmFjdGl2ZX07dGhpcy5hY3RpdmUuaGFzKCIudWktbWVudSIpLmxlbmd0aHx8dGhpcy5jb2xsYXBzZUFsbCh0LCEwKSx0aGlzLl90cmlnZ2VyKCJzZWxlY3QiLHQsaSl9LF9maWx0ZXJNZW51SXRlbXM6ZnVuY3Rpb24odCl7dmFyIGk9dC5yZXBsYWNlKC9bXC1cW1xde30oKSorPy4sXFxcXiR8I1xzXS9nLCJcXCQmIikscz1SZWdFeHAoIl4iK2ksImkiKTtyZXR1cm4gdGhpcy5hY3RpdmVNZW51LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5maWx0ZXIoIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gcy50ZXN0KGUudHJpbShlKHRoaXMpLnRleHQoKSkpfSl9fSksZS53aWRnZXQoInVpLmF1dG9jb21wbGV0ZSIse3ZlcnNpb246IjEuMTEuNCIsZGVmYXVsdEVsZW1lbnQ6IjxpbnB1dD4iLG9wdGlvbnM6e2FwcGVuZFRvOm51bGwsYXV0b0ZvY3VzOiExLGRlbGF5OjMwMCxtaW5MZW5ndGg6MSxwb3NpdGlvbjp7bXk6ImxlZnQgdG9wIixhdDoibGVmdCBib3R0b20iLGNvbGxpc2lvbjoibm9uZSJ9LHNvdXJjZTpudWxsLGNoYW5nZTpudWxsLGNsb3NlOm51bGwsZm9jdXM6bnVsbCxvcGVuOm51bGwscmVzcG9uc2U6bnVsbCxzZWFyY2g6bnVsbCxzZWxlY3Q6bnVsbH0scmVxdWVzdEluZGV4OjAscGVuZGluZzowLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdCxpLHMsbj10aGlzLmVsZW1lbnRbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxhPSJ0ZXh0YXJlYSI9PT1uLG89ImlucHV0Ij09PW47dGhpcy5pc011bHRpTGluZT1hPyEwOm8/ITE6dGhpcy5lbGVtZW50LnByb3AoImlzQ29udGVudEVkaXRhYmxlIiksdGhpcy52YWx1ZU1ldGhvZD10aGlzLmVsZW1lbnRbYXx8bz8idmFsIjoidGV4dCJdLHRoaXMuaXNOZXdNZW51PSEwLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYXV0b2NvbXBsZXRlLWlucHV0IikuYXR0cigiYXV0b2NvbXBsZXRlIiwib2ZmIiksdGhpcy5fb24odGhpcy5lbGVtZW50LHtrZXlkb3duOmZ1bmN0aW9uKG4pe2lmKHRoaXMuZWxlbWVudC5wcm9wKCJyZWFkT25seSIpKXJldHVybiB0PSEwLHM9ITAsaT0hMCx2b2lkIDA7dD0hMSxzPSExLGk9ITE7dmFyIGE9ZS51aS5rZXlDb2RlO3N3aXRjaChuLmtleUNvZGUpe2Nhc2UgYS5QQUdFX1VQOnQ9ITAsdGhpcy5fbW92ZSgicHJldmlvdXNQYWdlIixuKTticmVhaztjYXNlIGEuUEFHRV9ET1dOOnQ9ITAsdGhpcy5fbW92ZSgibmV4dFBhZ2UiLG4pO2JyZWFrO2Nhc2UgYS5VUDp0PSEwLHRoaXMuX2tleUV2ZW50KCJwcmV2aW91cyIsbik7YnJlYWs7Y2FzZSBhLkRPV046dD0hMCx0aGlzLl9rZXlFdmVudCgibmV4dCIsbik7YnJlYWs7Y2FzZSBhLkVOVEVSOnRoaXMubWVudS5hY3RpdmUmJih0PSEwLG4ucHJldmVudERlZmF1bHQoKSx0aGlzLm1lbnUuc2VsZWN0KG4pKTticmVhaztjYXNlIGEuVEFCOnRoaXMubWVudS5hY3RpdmUmJnRoaXMubWVudS5zZWxlY3Qobik7YnJlYWs7Y2FzZSBhLkVTQ0FQRTp0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSYmKHRoaXMuaXNNdWx0aUxpbmV8fHRoaXMuX3ZhbHVlKHRoaXMudGVybSksdGhpcy5jbG9zZShuKSxuLnByZXZlbnREZWZhdWx0KCkpO2JyZWFrO2RlZmF1bHQ6aT0hMCx0aGlzLl9zZWFyY2hUaW1lb3V0KG4pfX0sa2V5cHJlc3M6ZnVuY3Rpb24ocyl7aWYodClyZXR1cm4gdD0hMSwoIXRoaXMuaXNNdWx0aUxpbmV8fHRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpKSYmcy5wcmV2ZW50RGVmYXVsdCgpLHZvaWQgMDtpZighaSl7dmFyIG49ZS51aS5rZXlDb2RlO3N3aXRjaChzLmtleUNvZGUpe2Nhc2Ugbi5QQUdFX1VQOnRoaXMuX21vdmUoInByZXZpb3VzUGFnZSIscyk7YnJlYWs7Y2FzZSBuLlBBR0VfRE9XTjp0aGlzLl9tb3ZlKCJuZXh0UGFnZSIscyk7YnJlYWs7Y2FzZSBuLlVQOnRoaXMuX2tleUV2ZW50KCJwcmV2aW91cyIscyk7YnJlYWs7Y2FzZSBuLkRPV046dGhpcy5fa2V5RXZlbnQoIm5leHQiLHMpfX19LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBzPyhzPSExLGUucHJldmVudERlZmF1bHQoKSx2b2lkIDApOih0aGlzLl9zZWFyY2hUaW1lb3V0KGUpLHZvaWQgMCl9LGZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZEl0ZW09bnVsbCx0aGlzLnByZXZpb3VzPXRoaXMuX3ZhbHVlKCl9LGJsdXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2FuY2VsQmx1cj8oZGVsZXRlIHRoaXMuY2FuY2VsQmx1cix2b2lkIDApOihjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hpbmcpLHRoaXMuY2xvc2UoZSksdGhpcy5fY2hhbmdlKGUpLHZvaWQgMCl9fSksdGhpcy5faW5pdFNvdXJjZSgpLHRoaXMubWVudT1lKCI8dWw+IikuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZSB1aS1mcm9udCIpLmFwcGVuZFRvKHRoaXMuX2FwcGVuZFRvKCkpLm1lbnUoe3JvbGU6bnVsbH0pLmhpZGUoKS5tZW51KCJpbnN0YW5jZSIpLHRoaXMuX29uKHRoaXMubWVudS5lbGVtZW50LHttb3VzZWRvd246ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuY2FuY2VsQmx1cj0hMCx0aGlzLl9kZWxheShmdW5jdGlvbigpe2RlbGV0ZSB0aGlzLmNhbmNlbEJsdXJ9KTt2YXIgaT10aGlzLm1lbnUuZWxlbWVudFswXTtlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktbWVudS1pdGVtIikubGVuZ3RofHx0aGlzLl9kZWxheShmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5kb2N1bWVudC5vbmUoIm1vdXNlZG93biIsZnVuY3Rpb24ocyl7cy50YXJnZXQ9PT10LmVsZW1lbnRbMF18fHMudGFyZ2V0PT09aXx8ZS5jb250YWlucyhpLHMudGFyZ2V0KXx8dC5jbG9zZSgpfSl9KX0sbWVudWZvY3VzOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbjtyZXR1cm4gdGhpcy5pc05ld01lbnUmJih0aGlzLmlzTmV3TWVudT0hMSx0Lm9yaWdpbmFsRXZlbnQmJi9ebW91c2UvLnRlc3QodC5vcmlnaW5hbEV2ZW50LnR5cGUpKT8odGhpcy5tZW51LmJsdXIoKSx0aGlzLmRvY3VtZW50Lm9uZSgibW91c2Vtb3ZlIixmdW5jdGlvbigpe2UodC50YXJnZXQpLnRyaWdnZXIodC5vcmlnaW5hbEV2ZW50KX0pLHZvaWQgMCk6KG49aS5pdGVtLmRhdGEoInVpLWF1dG9jb21wbGV0ZS1pdGVtIiksITEhPT10aGlzLl90cmlnZ2VyKCJmb2N1cyIsdCx7aXRlbTpufSkmJnQub3JpZ2luYWxFdmVudCYmL15rZXkvLnRlc3QodC5vcmlnaW5hbEV2ZW50LnR5cGUpJiZ0aGlzLl92YWx1ZShuLnZhbHVlKSxzPWkuaXRlbS5hdHRyKCJhcmlhLWxhYmVsIil8fG4udmFsdWUscyYmZS50cmltKHMpLmxlbmd0aCYmKHRoaXMubGl2ZVJlZ2lvbi5jaGlsZHJlbigpLmhpZGUoKSxlKCI8ZGl2PiIpLnRleHQocykuYXBwZW5kVG8odGhpcy5saXZlUmVnaW9uKSksdm9pZCAwKX0sbWVudXNlbGVjdDpmdW5jdGlvbihlLHQpe3ZhciBpPXQuaXRlbS5kYXRhKCJ1aS1hdXRvY29tcGxldGUtaXRlbSIpLHM9dGhpcy5wcmV2aW91czt0aGlzLmVsZW1lbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQmJih0aGlzLmVsZW1lbnQuZm9jdXMoKSx0aGlzLnByZXZpb3VzPXMsdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLnByZXZpb3VzPXMsdGhpcy5zZWxlY3RlZEl0ZW09aX0pKSwhMSE9PXRoaXMuX3RyaWdnZXIoInNlbGVjdCIsZSx7aXRlbTppfSkmJnRoaXMuX3ZhbHVlKGkudmFsdWUpLHRoaXMudGVybT10aGlzLl92YWx1ZSgpLHRoaXMuY2xvc2UoZSksdGhpcy5zZWxlY3RlZEl0ZW09aX19KSx0aGlzLmxpdmVSZWdpb249ZSgiPHNwYW4+Iix7cm9sZToic3RhdHVzIiwiYXJpYS1saXZlIjoiYXNzZXJ0aXZlIiwiYXJpYS1yZWxldmFudCI6ImFkZGl0aW9ucyJ9KS5hZGRDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIikuYXBwZW5kVG8odGhpcy5kb2N1bWVudFswXS5ib2R5KSx0aGlzLl9vbih0aGlzLndpbmRvdyx7YmVmb3JldW5sb2FkOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoImF1dG9jb21wbGV0ZSIpfX0pfSxfZGVzdHJveTpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLnNlYXJjaGluZyksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hdXRvY29tcGxldGUtaW5wdXQiKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKSx0aGlzLm1lbnUuZWxlbWVudC5yZW1vdmUoKSx0aGlzLmxpdmVSZWdpb24ucmVtb3ZlKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLl9zdXBlcihlLHQpLCJzb3VyY2UiPT09ZSYmdGhpcy5faW5pdFNvdXJjZSgpLCJhcHBlbmRUbyI9PT1lJiZ0aGlzLm1lbnUuZWxlbWVudC5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbygpKSwiZGlzYWJsZWQiPT09ZSYmdCYmdGhpcy54aHImJnRoaXMueGhyLmFib3J0KCl9LF9hcHBlbmRUbzpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5hcHBlbmRUbztyZXR1cm4gdCYmKHQ9dC5qcXVlcnl8fHQubm9kZVR5cGU/ZSh0KTp0aGlzLmRvY3VtZW50LmZpbmQodCkuZXEoMCkpLHQmJnRbMF18fCh0PXRoaXMuZWxlbWVudC5jbG9zZXN0KCIudWktZnJvbnQiKSksdC5sZW5ndGh8fCh0PXRoaXMuZG9jdW1lbnRbMF0uYm9keSksdH0sX2luaXRTb3VyY2U6ZnVuY3Rpb24oKXt2YXIgdCxpLHM9dGhpcztlLmlzQXJyYXkodGhpcy5vcHRpb25zLnNvdXJjZSk/KHQ9dGhpcy5vcHRpb25zLnNvdXJjZSx0aGlzLnNvdXJjZT1mdW5jdGlvbihpLHMpe3MoZS51aS5hdXRvY29tcGxldGUuZmlsdGVyKHQsaS50ZXJtKSl9KToic3RyaW5nIj09dHlwZW9mIHRoaXMub3B0aW9ucy5zb3VyY2U/KGk9dGhpcy5vcHRpb25zLnNvdXJjZSx0aGlzLnNvdXJjZT1mdW5jdGlvbih0LG4pe3MueGhyJiZzLnhoci5hYm9ydCgpLHMueGhyPWUuYWpheCh7dXJsOmksZGF0YTp0LGRhdGFUeXBlOiJqc29uIixzdWNjZXNzOmZ1bmN0aW9uKGUpe24oZSl9LGVycm9yOmZ1bmN0aW9uKCl7bihbXSl9fSl9KTp0aGlzLnNvdXJjZT10aGlzLm9wdGlvbnMuc291cmNlfSxfc2VhcmNoVGltZW91dDpmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hpbmcpLHRoaXMuc2VhcmNoaW5nPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50ZXJtPT09dGhpcy5fdmFsdWUoKSxpPXRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpLHM9ZS5hbHRLZXl8fGUuY3RybEtleXx8ZS5tZXRhS2V5fHxlLnNoaWZ0S2V5OyghdHx8dCYmIWkmJiFzKSYmKHRoaXMuc2VsZWN0ZWRJdGVtPW51bGwsdGhpcy5zZWFyY2gobnVsbCxlKSl9LHRoaXMub3B0aW9ucy5kZWxheSl9LHNlYXJjaDpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWU/ZTp0aGlzLl92YWx1ZSgpLHRoaXMudGVybT10aGlzLl92YWx1ZSgpLGUubGVuZ3RoPHRoaXMub3B0aW9ucy5taW5MZW5ndGg/dGhpcy5jbG9zZSh0KTp0aGlzLl90cmlnZ2VyKCJzZWFyY2giLHQpIT09ITE/dGhpcy5fc2VhcmNoKGUpOnZvaWQgMH0sX3NlYXJjaDpmdW5jdGlvbihlKXt0aGlzLnBlbmRpbmcrKyx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1sb2FkaW5nIiksdGhpcy5jYW5jZWxTZWFyY2g9ITEsdGhpcy5zb3VyY2Uoe3Rlcm06ZX0sdGhpcy5fcmVzcG9uc2UoKSl9LF9yZXNwb25zZTpmdW5jdGlvbigpe3ZhciB0PSsrdGhpcy5yZXF1ZXN0SW5kZXg7cmV0dXJuIGUucHJveHkoZnVuY3Rpb24oZSl7dD09PXRoaXMucmVxdWVzdEluZGV4JiZ0aGlzLl9fcmVzcG9uc2UoZSksdGhpcy5wZW5kaW5nLS0sdGhpcy5wZW5kaW5nfHx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1sb2FkaW5nIil9LHRoaXMpfSxfX3Jlc3BvbnNlOmZ1bmN0aW9uKGUpe2UmJihlPXRoaXMuX25vcm1hbGl6ZShlKSksdGhpcy5fdHJpZ2dlcigicmVzcG9uc2UiLG51bGwse2NvbnRlbnQ6ZX0pLCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJmUmJmUubGVuZ3RoJiYhdGhpcy5jYW5jZWxTZWFyY2g/KHRoaXMuX3N1Z2dlc3QoZSksdGhpcy5fdHJpZ2dlcigib3BlbiIpKTp0aGlzLl9jbG9zZSgpfSxjbG9zZTpmdW5jdGlvbihlKXt0aGlzLmNhbmNlbFNlYXJjaD0hMCx0aGlzLl9jbG9zZShlKX0sX2Nsb3NlOmZ1bmN0aW9uKGUpe3RoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpJiYodGhpcy5tZW51LmVsZW1lbnQuaGlkZSgpLHRoaXMubWVudS5ibHVyKCksdGhpcy5pc05ld01lbnU9ITAsdGhpcy5fdHJpZ2dlcigiY2xvc2UiLGUpKX0sX2NoYW5nZTpmdW5jdGlvbihlKXt0aGlzLnByZXZpb3VzIT09dGhpcy5fdmFsdWUoKSYmdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixlLHtpdGVtOnRoaXMuc2VsZWN0ZWRJdGVtfSl9LF9ub3JtYWxpemU6ZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RoJiZ0WzBdLmxhYmVsJiZ0WzBdLnZhbHVlP3Q6ZS5tYXAodCxmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/e2xhYmVsOnQsdmFsdWU6dH06ZS5leHRlbmQoe30sdCx7bGFiZWw6dC5sYWJlbHx8dC52YWx1ZSx2YWx1ZTp0LnZhbHVlfHx0LmxhYmVsfSl9KX0sX3N1Z2dlc3Q6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5tZW51LmVsZW1lbnQuZW1wdHkoKTt0aGlzLl9yZW5kZXJNZW51KGksdCksdGhpcy5pc05ld01lbnU9ITAsdGhpcy5tZW51LnJlZnJlc2goKSxpLnNob3coKSx0aGlzLl9yZXNpemVNZW51KCksaS5wb3NpdGlvbihlLmV4dGVuZCh7b2Y6dGhpcy5lbGVtZW50fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSx0aGlzLm9wdGlvbnMuYXV0b0ZvY3VzJiZ0aGlzLm1lbnUubmV4dCgpfSxfcmVzaXplTWVudTpmdW5jdGlvbigpe3ZhciBlPXRoaXMubWVudS5lbGVtZW50O2Uub3V0ZXJXaWR0aChNYXRoLm1heChlLndpZHRoKCIiKS5vdXRlcldpZHRoKCkrMSx0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpKSl9LF9yZW5kZXJNZW51OmZ1bmN0aW9uKHQsaSl7dmFyIHM9dGhpcztlLmVhY2goaSxmdW5jdGlvbihlLGkpe3MuX3JlbmRlckl0ZW1EYXRhKHQsaSl9KX0sX3JlbmRlckl0ZW1EYXRhOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX3JlbmRlckl0ZW0oZSx0KS5kYXRhKCJ1aS1hdXRvY29tcGxldGUtaXRlbSIsdCl9LF9yZW5kZXJJdGVtOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIGUoIjxsaT4iKS50ZXh0KGkubGFiZWwpLmFwcGVuZFRvKHQpfSxfbW92ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKT90aGlzLm1lbnUuaXNGaXJzdEl0ZW0oKSYmL15wcmV2aW91cy8udGVzdChlKXx8dGhpcy5tZW51LmlzTGFzdEl0ZW0oKSYmL15uZXh0Ly50ZXN0KGUpPyh0aGlzLmlzTXVsdGlMaW5lfHx0aGlzLl92YWx1ZSh0aGlzLnRlcm0pLHRoaXMubWVudS5ibHVyKCksdm9pZCAwKToodGhpcy5tZW51W2VdKHQpLHZvaWQgMCk6KHRoaXMuc2VhcmNoKG51bGwsdCksdm9pZCAwKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVudS5lbGVtZW50fSxfdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZU1ldGhvZC5hcHBseSh0aGlzLmVsZW1lbnQsYXJndW1lbnRzKX0sX2tleUV2ZW50OmZ1bmN0aW9uKGUsdCl7KCF0aGlzLmlzTXVsdGlMaW5lfHx0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSkmJih0aGlzLl9tb3ZlKGUsdCksdC5wcmV2ZW50RGVmYXVsdCgpKX19KSxlLmV4dGVuZChlLnVpLmF1dG9jb21wbGV0ZSx7ZXNjYXBlUmVnZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywiXFwkJiIpfSxmaWx0ZXI6ZnVuY3Rpb24odCxpKXt2YXIgcz1SZWdFeHAoZS51aS5hdXRvY29tcGxldGUuZXNjYXBlUmVnZXgoaSksImkiKTtyZXR1cm4gZS5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIHMudGVzdChlLmxhYmVsfHxlLnZhbHVlfHxlKX0pfX0pLGUud2lkZ2V0KCJ1aS5hdXRvY29tcGxldGUiLGUudWkuYXV0b2NvbXBsZXRlLHtvcHRpb25zOnttZXNzYWdlczp7bm9SZXN1bHRzOiJObyBzZWFyY2ggcmVzdWx0cy4iLHJlc3VsdHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUrKGU+MT8iIHJlc3VsdHMgYXJlIjoiIHJlc3VsdCBpcyIpKyIgYXZhaWxhYmxlLCB1c2UgdXAgYW5kIGRvd24gYXJyb3cga2V5cyB0byBuYXZpZ2F0ZS4ifX19LF9fcmVzcG9uc2U6ZnVuY3Rpb24odCl7dmFyIGk7dGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpLHRoaXMub3B0aW9ucy5kaXNhYmxlZHx8dGhpcy5jYW5jZWxTZWFyY2h8fChpPXQmJnQubGVuZ3RoP3RoaXMub3B0aW9ucy5tZXNzYWdlcy5yZXN1bHRzKHQubGVuZ3RoKTp0aGlzLm9wdGlvbnMubWVzc2FnZXMubm9SZXN1bHRzLHRoaXMubGl2ZVJlZ2lvbi5jaGlsZHJlbigpLmhpZGUoKSxlKCI8ZGl2PiIpLnRleHQoaSkuYXBwZW5kVG8odGhpcy5saXZlUmVnaW9uKSl9fSksZS51aS5hdXRvY29tcGxldGU7dmFyIHIsaD0idWktYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiLGw9InVpLWJ1dHRvbi1pY29ucy1vbmx5IHVpLWJ1dHRvbi1pY29uLW9ubHkgdWktYnV0dG9uLXRleHQtaWNvbnMgdWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IHVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IHVpLWJ1dHRvbi10ZXh0LW9ubHkiLHU9ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmZpbmQoIjp1aS1idXR0b24iKS5idXR0b24oInJlZnJlc2giKX0sMSl9LGQ9ZnVuY3Rpb24odCl7dmFyIGk9dC5uYW1lLHM9dC5mb3JtLG49ZShbXSk7cmV0dXJuIGkmJihpPWkucmVwbGFjZSgvJy9nLCJcXCciKSxuPXM/ZShzKS5maW5kKCJbbmFtZT0nIitpKyInXVt0eXBlPXJhZGlvXSIpOmUoIltuYW1lPSciK2krIiddW3R5cGU9cmFkaW9dIix0Lm93bmVyRG9jdW1lbnQpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiF0aGlzLmZvcm19KSksbn07ZS53aWRnZXQoInVpLmJ1dHRvbiIse3ZlcnNpb246IjEuMTEuNCIsZGVmYXVsdEVsZW1lbnQ6IjxidXR0b24+IixvcHRpb25zOntkaXNhYmxlZDpudWxsLHRleHQ6ITAsbGFiZWw6bnVsbCxpY29uczp7cHJpbWFyeTpudWxsLHNlY29uZGFyeTpudWxsfX0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5jbG9zZXN0KCJmb3JtIikudW5iaW5kKCJyZXNldCIrdGhpcy5ldmVudE5hbWVzcGFjZSkuYmluZCgicmVzZXQiK3RoaXMuZXZlbnROYW1lc3BhY2UsdSksImJvb2xlYW4iIT10eXBlb2YgdGhpcy5vcHRpb25zLmRpc2FibGVkP3RoaXMub3B0aW9ucy5kaXNhYmxlZD0hIXRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIpOnRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsdGhpcy5vcHRpb25zLmRpc2FibGVkKSx0aGlzLl9kZXRlcm1pbmVCdXR0b25UeXBlKCksdGhpcy5oYXNUaXRsZT0hIXRoaXMuYnV0dG9uRWxlbWVudC5hdHRyKCJ0aXRsZSIpO3ZhciB0PXRoaXMsaT10aGlzLm9wdGlvbnMscz0iY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlLG49cz8iIjoidWktc3RhdGUtYWN0aXZlIjtudWxsPT09aS5sYWJlbCYmKGkubGFiZWw9ImlucHV0Ij09PXRoaXMudHlwZT90aGlzLmJ1dHRvbkVsZW1lbnQudmFsKCk6dGhpcy5idXR0b25FbGVtZW50Lmh0bWwoKSksdGhpcy5faG92ZXJhYmxlKHRoaXMuYnV0dG9uRWxlbWVudCksdGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKGgpLmF0dHIoInJvbGUiLCJidXR0b24iKS5iaW5kKCJtb3VzZWVudGVyIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7aS5kaXNhYmxlZHx8dGhpcz09PXImJmUodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSkuYmluZCgibW91c2VsZWF2ZSIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2kuZGlzYWJsZWR8fGUodGhpcykucmVtb3ZlQ2xhc3Mobil9KS5iaW5kKCJjbGljayIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbihlKXtpLmRpc2FibGVkJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfSksdGhpcy5fb24oe2ZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSxibHVyOmZ1bmN0aW9uKCl7dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfX0pLHMmJnRoaXMuZWxlbWVudC5iaW5kKCJjaGFuZ2UiK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXt0LnJlZnJlc2goKX0pLCJjaGVja2JveCI9PT10aGlzLnR5cGU/dGhpcy5idXR0b25FbGVtZW50LmJpbmQoImNsaWNrIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7cmV0dXJuIGkuZGlzYWJsZWQ/ITE6dm9pZCAwfSk6InJhZGlvIj09PXRoaXMudHlwZT90aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgiY2xpY2siK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXtpZihpLmRpc2FibGVkKXJldHVybiExO2UodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLHQuYnV0dG9uRWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLCJ0cnVlIik7dmFyIHM9dC5lbGVtZW50WzBdO2Qocykubm90KHMpLm1hcChmdW5jdGlvbigpe3JldHVybiBlKHRoaXMpLmJ1dHRvbigid2lkZ2V0IilbMF19KS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwiZmFsc2UiKX0pOih0aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgibW91c2Vkb3duIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7cmV0dXJuIGkuZGlzYWJsZWQ/ITE6KGUodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLHI9dGhpcyx0LmRvY3VtZW50Lm9uZSgibW91c2V1cCIsZnVuY3Rpb24oKXtyPW51bGx9KSx2b2lkIDApfSkuYmluZCgibW91c2V1cCIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe3JldHVybiBpLmRpc2FibGVkPyExOihlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx2b2lkIDApfSkuYmluZCgia2V5ZG93biIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbih0KXtyZXR1cm4gaS5kaXNhYmxlZD8hMTooKHQua2V5Q29kZT09PWUudWkua2V5Q29kZS5TUEFDRXx8dC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLkVOVEVSKSYmZSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdm9pZCAwKX0pLmJpbmQoImtleXVwIit0aGlzLmV2ZW50TmFtZXNwYWNlKyIgYmx1ciIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2UodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSksdGhpcy5idXR0b25FbGVtZW50LmlzKCJhIikmJnRoaXMuYnV0dG9uRWxlbWVudC5rZXl1cChmdW5jdGlvbih0KXt0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuU1BBQ0UmJmUodGhpcykuY2xpY2soKX0pKSx0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIixpLmRpc2FibGVkKSx0aGlzLl9yZXNldEJ1dHRvbigpfSxfZGV0ZXJtaW5lQnV0dG9uVHlwZTpmdW5jdGlvbigpe3ZhciBlLHQsaTt0aGlzLnR5cGU9dGhpcy5lbGVtZW50LmlzKCJbdHlwZT1jaGVja2JveF0iKT8iY2hlY2tib3giOnRoaXMuZWxlbWVudC5pcygiW3R5cGU9cmFkaW9dIik/InJhZGlvIjp0aGlzLmVsZW1lbnQuaXMoImlucHV0Iik/ImlucHV0IjoiYnV0dG9uIiwiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlPyhlPXRoaXMuZWxlbWVudC5wYXJlbnRzKCkubGFzdCgpLHQ9ImxhYmVsW2Zvcj0nIit0aGlzLmVsZW1lbnQuYXR0cigiaWQiKSsiJ10iLHRoaXMuYnV0dG9uRWxlbWVudD1lLmZpbmQodCksdGhpcy5idXR0b25FbGVtZW50Lmxlbmd0aHx8KGU9ZS5sZW5ndGg/ZS5zaWJsaW5ncygpOnRoaXMuZWxlbWVudC5zaWJsaW5ncygpLHRoaXMuYnV0dG9uRWxlbWVudD1lLmZpbHRlcih0KSx0aGlzLmJ1dHRvbkVsZW1lbnQubGVuZ3RofHwodGhpcy5idXR0b25FbGVtZW50PWUuZmluZCh0KSkpLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIiksaT10aGlzLmVsZW1lbnQuaXMoIjpjaGVja2VkIiksaSYmdGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLmJ1dHRvbkVsZW1lbnQucHJvcCgiYXJpYS1wcmVzc2VkIixpKSk6dGhpcy5idXR0b25FbGVtZW50PXRoaXMuZWxlbWVudH0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnV0dG9uRWxlbWVudH0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZSIpLHRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcyhoKyIgdWktc3RhdGUtYWN0aXZlICIrbCkucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtcHJlc3NlZCIpLmh0bWwodGhpcy5idXR0b25FbGVtZW50LmZpbmQoIi51aS1idXR0b24tdGV4dCIpLmh0bWwoKSksdGhpcy5oYXNUaXRsZXx8dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUF0dHIoInRpdGxlIil9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fc3VwZXIoZSx0KSwiZGlzYWJsZWQiPT09ZT8odGhpcy53aWRnZXQoKS50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCksdGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIiwhIXQpLHQmJigiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlP3RoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKTp0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIHVpLXN0YXRlLWFjdGl2ZSIpKSx2b2lkIDApOih0aGlzLl9yZXNldEJ1dHRvbigpLHZvaWQgMCl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQuaXMoImlucHV0LCBidXR0b24iKT90aGlzLmVsZW1lbnQuaXMoIjpkaXNhYmxlZCIpOnRoaXMuZWxlbWVudC5oYXNDbGFzcygidWktYnV0dG9uLWRpc2FibGVkIik7dCE9PXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsdCksInJhZGlvIj09PXRoaXMudHlwZT9kKHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe2UodGhpcykuaXMoIjpjaGVja2VkIik/ZSh0aGlzKS5idXR0b24oIndpZGdldCIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJ0cnVlIik6ZSh0aGlzKS5idXR0b24oIndpZGdldCIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJmYWxzZSIpfSk6ImNoZWNrYm94Ij09PXRoaXMudHlwZSYmKHRoaXMuZWxlbWVudC5pcygiOmNoZWNrZWQiKT90aGlzLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsInRydWUiKTp0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsImZhbHNlIikpfSxfcmVzZXRCdXR0b246ZnVuY3Rpb24oKXtpZigiaW5wdXQiPT09dGhpcy50eXBlKXJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwmJnRoaXMuZWxlbWVudC52YWwodGhpcy5vcHRpb25zLmxhYmVsKSx2b2lkIDA7dmFyIHQ9dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKGwpLGk9ZSgiPHNwYW4+PC9zcGFuPiIsdGhpcy5kb2N1bWVudFswXSkuYWRkQ2xhc3MoInVpLWJ1dHRvbi10ZXh0IikuaHRtbCh0aGlzLm9wdGlvbnMubGFiZWwpLmFwcGVuZFRvKHQuZW1wdHkoKSkudGV4dCgpLHM9dGhpcy5vcHRpb25zLmljb25zLG49cy5wcmltYXJ5JiZzLnNlY29uZGFyeSxhPVtdO3MucHJpbWFyeXx8cy5zZWNvbmRhcnk/KHRoaXMub3B0aW9ucy50ZXh0JiZhLnB1c2goInVpLWJ1dHRvbi10ZXh0LWljb24iKyhuPyJzIjpzLnByaW1hcnk/Ii1wcmltYXJ5IjoiLXNlY29uZGFyeSIpKSxzLnByaW1hcnkmJnQucHJlcGVuZCgiPHNwYW4gY2xhc3M9J3VpLWJ1dHRvbi1pY29uLXByaW1hcnkgdWktaWNvbiAiK3MucHJpbWFyeSsiJz48L3NwYW4+Iikscy5zZWNvbmRhcnkmJnQuYXBwZW5kKCI8c3BhbiBjbGFzcz0ndWktYnV0dG9uLWljb24tc2Vjb25kYXJ5IHVpLWljb24gIitzLnNlY29uZGFyeSsiJz48L3NwYW4+IiksdGhpcy5vcHRpb25zLnRleHR8fChhLnB1c2gobj8idWktYnV0dG9uLWljb25zLW9ubHkiOiJ1aS1idXR0b24taWNvbi1vbmx5IiksdGhpcy5oYXNUaXRsZXx8dC5hdHRyKCJ0aXRsZSIsZS50cmltKGkpKSkpOmEucHVzaCgidWktYnV0dG9uLXRleHQtb25seSIpLHQuYWRkQ2xhc3MoYS5qb2luKCIgIikpfX0pLGUud2lkZ2V0KCJ1aS5idXR0b25zZXQiLHt2ZXJzaW9uOiIxLjExLjQiLG9wdGlvbnM6e2l0ZW1zOiJidXR0b24sIGlucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1zdWJtaXRdLCBpbnB1dFt0eXBlPXJlc2V0XSwgaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dLCBhLCA6ZGF0YSh1aS1idXR0b24pIn0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYnV0dG9uc2V0Iil9LF9pbml0OmZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXsiZGlzYWJsZWQiPT09ZSYmdGhpcy5idXR0b25zLmJ1dHRvbigib3B0aW9uIixlLHQpLHRoaXMuX3N1cGVyKGUsdCl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD0icnRsIj09PXRoaXMuZWxlbWVudC5jc3MoImRpcmVjdGlvbiIpLGk9dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKSxzPWkuZmlsdGVyKCI6dWktYnV0dG9uIik7aS5ub3QoIjp1aS1idXR0b24iKS5idXR0b24oKSxzLmJ1dHRvbigicmVmcmVzaCIpLHRoaXMuYnV0dG9ucz1pLm1hcChmdW5jdGlvbigpe3JldHVybiBlKHRoaXMpLmJ1dHRvbigid2lkZ2V0IilbMF19KS5yZW1vdmVDbGFzcygidWktY29ybmVyLWFsbCB1aS1jb3JuZXItbGVmdCB1aS1jb3JuZXItcmlnaHQiKS5maWx0ZXIoIjpmaXJzdCIpLmFkZENsYXNzKHQ/InVpLWNvcm5lci1yaWdodCI6InVpLWNvcm5lci1sZWZ0IikuZW5kKCkuZmlsdGVyKCI6bGFzdCIpLmFkZENsYXNzKHQ/InVpLWNvcm5lci1sZWZ0IjoidWktY29ybmVyLXJpZ2h0IikuZW5kKCkuZW5kKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1idXR0b25zZXQiKSx0aGlzLmJ1dHRvbnMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcykuYnV0dG9uKCJ3aWRnZXQiKVswXX0pLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItbGVmdCB1aS1jb3JuZXItcmlnaHQiKS5lbmQoKS5idXR0b24oImRlc3Ryb3kiKX19KSxlLnVpLmJ1dHRvbixlLndpZGdldCgidWkuZGlhbG9nIix7dmVyc2lvbjoiMS4xMS40IixvcHRpb25zOnthcHBlbmRUbzoiYm9keSIsYXV0b09wZW46ITAsYnV0dG9uczpbXSxjbG9zZU9uRXNjYXBlOiEwLGNsb3NlVGV4dDoiQ2xvc2UiLGRpYWxvZ0NsYXNzOiIiLGRyYWdnYWJsZTohMCxoaWRlOm51bGwsaGVpZ2h0OiJhdXRvIixtYXhIZWlnaHQ6bnVsbCxtYXhXaWR0aDpudWxsLG1pbkhlaWdodDoxNTAsbWluV2lkdGg6MTUwLG1vZGFsOiExLHBvc2l0aW9uOntteToiY2VudGVyIixhdDoiY2VudGVyIixvZjp3aW5kb3csY29sbGlzaW9uOiJmaXQiLHVzaW5nOmZ1bmN0aW9uKHQpe3ZhciBpPWUodGhpcykuY3NzKHQpLm9mZnNldCgpLnRvcDswPmkmJmUodGhpcykuY3NzKCJ0b3AiLHQudG9wLWkpfX0scmVzaXphYmxlOiEwLHNob3c6bnVsbCx0aXRsZTpudWxsLHdpZHRoOjMwMCxiZWZvcmVDbG9zZTpudWxsLGNsb3NlOm51bGwsZHJhZzpudWxsLGRyYWdTdGFydDpudWxsLGRyYWdTdG9wOm51bGwsZm9jdXM6bnVsbCxvcGVuOm51bGwscmVzaXplOm51bGwscmVzaXplU3RhcnQ6bnVsbCxyZXNpemVTdG9wOm51bGx9LHNpemVSZWxhdGVkT3B0aW9uczp7YnV0dG9uczohMCxoZWlnaHQ6ITAsbWF4SGVpZ2h0OiEwLG1heFdpZHRoOiEwLG1pbkhlaWdodDohMCxtaW5XaWR0aDohMCx3aWR0aDohMH0scmVzaXphYmxlUmVsYXRlZE9wdGlvbnM6e21heEhlaWdodDohMCxtYXhXaWR0aDohMCxtaW5IZWlnaHQ6ITAsbWluV2lkdGg6ITB9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLm9yaWdpbmFsQ3NzPXtkaXNwbGF5OnRoaXMuZWxlbWVudFswXS5zdHlsZS5kaXNwbGF5LHdpZHRoOnRoaXMuZWxlbWVudFswXS5zdHlsZS53aWR0aCxtaW5IZWlnaHQ6dGhpcy5lbGVtZW50WzBdLnN0eWxlLm1pbkhlaWdodCxtYXhIZWlnaHQ6dGhpcy5lbGVtZW50WzBdLnN0eWxlLm1heEhlaWdodCxoZWlnaHQ6dGhpcy5lbGVtZW50WzBdLnN0eWxlLmhlaWdodH0sdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXtwYXJlbnQ6dGhpcy5lbGVtZW50LnBhcmVudCgpLGluZGV4OnRoaXMuZWxlbWVudC5wYXJlbnQoKS5jaGlsZHJlbigpLmluZGV4KHRoaXMuZWxlbWVudCl9LHRoaXMub3JpZ2luYWxUaXRsZT10aGlzLmVsZW1lbnQuYXR0cigidGl0bGUiKSx0aGlzLm9wdGlvbnMudGl0bGU9dGhpcy5vcHRpb25zLnRpdGxlfHx0aGlzLm9yaWdpbmFsVGl0bGUsdGhpcy5fY3JlYXRlV3JhcHBlcigpLHRoaXMuZWxlbWVudC5zaG93KCkucmVtb3ZlQXR0cigidGl0bGUiKS5hZGRDbGFzcygidWktZGlhbG9nLWNvbnRlbnQgdWktd2lkZ2V0LWNvbnRlbnQiKS5hcHBlbmRUbyh0aGlzLnVpRGlhbG9nKSx0aGlzLl9jcmVhdGVUaXRsZWJhcigpLHRoaXMuX2NyZWF0ZUJ1dHRvblBhbmUoKSx0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlJiZlLmZuLmRyYWdnYWJsZSYmdGhpcy5fbWFrZURyYWdnYWJsZSgpLHRoaXMub3B0aW9ucy5yZXNpemFibGUmJmUuZm4ucmVzaXphYmxlJiZ0aGlzLl9tYWtlUmVzaXphYmxlKCksdGhpcy5faXNPcGVuPSExLHRoaXMuX3RyYWNrRm9jdXMoKX0sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuYXV0b09wZW4mJnRoaXMub3BlbigpfSxfYXBwZW5kVG86ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuYXBwZW5kVG87cmV0dXJuIHQmJih0LmpxdWVyeXx8dC5ub2RlVHlwZSk/ZSh0KTp0aGlzLmRvY3VtZW50LmZpbmQodHx8ImJvZHkiKS5lcSgwKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMub3JpZ2luYWxQb3NpdGlvbjt0aGlzLl91bnRyYWNrSW5zdGFuY2UoKSx0aGlzLl9kZXN0cm95T3ZlcmxheSgpLHRoaXMuZWxlbWVudC5yZW1vdmVVbmlxdWVJZCgpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctY29udGVudCB1aS13aWRnZXQtY29udGVudCIpLmNzcyh0aGlzLm9yaWdpbmFsQ3NzKS5kZXRhY2goKSx0aGlzLnVpRGlhbG9nLnN0b3AoITAsITApLnJlbW92ZSgpLHRoaXMub3JpZ2luYWxUaXRsZSYmdGhpcy5lbGVtZW50LmF0dHIoInRpdGxlIix0aGlzLm9yaWdpbmFsVGl0bGUpLGU9dC5wYXJlbnQuY2hpbGRyZW4oKS5lcSh0LmluZGV4KSxlLmxlbmd0aCYmZVswXSE9PXRoaXMuZWxlbWVudFswXT9lLmJlZm9yZSh0aGlzLmVsZW1lbnQpOnQucGFyZW50LmFwcGVuZCh0aGlzLmVsZW1lbnQpfSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51aURpYWxvZ30sZGlzYWJsZTplLm5vb3AsZW5hYmxlOmUubm9vcCxjbG9zZTpmdW5jdGlvbih0KXt2YXIgaSxzPXRoaXM7aWYodGhpcy5faXNPcGVuJiZ0aGlzLl90cmlnZ2VyKCJiZWZvcmVDbG9zZSIsdCkhPT0hMSl7aWYodGhpcy5faXNPcGVuPSExLHRoaXMuX2ZvY3VzZWRFbGVtZW50PW51bGwsdGhpcy5fZGVzdHJveU92ZXJsYXkoKSx0aGlzLl91bnRyYWNrSW5zdGFuY2UoKSwhdGhpcy5vcGVuZXIuZmlsdGVyKCI6Zm9jdXNhYmxlIikuZm9jdXMoKS5sZW5ndGgpdHJ5e2k9dGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50LGkmJiJib2R5IiE9PWkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmZShpKS5ibHVyKCl9Y2F0Y2gobil7fXRoaXMuX2hpZGUodGhpcy51aURpYWxvZyx0aGlzLm9wdGlvbnMuaGlkZSxmdW5jdGlvbigpe3MuX3RyaWdnZXIoImNsb3NlIix0KX0pfX0saXNPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzT3Blbn0sbW92ZVRvVG9wOmZ1bmN0aW9uKCl7dGhpcy5fbW92ZVRvVG9wKCl9LF9tb3ZlVG9Ub3A6ZnVuY3Rpb24odCxpKXt2YXIgcz0hMSxuPXRoaXMudWlEaWFsb2cuc2libGluZ3MoIi51aS1mcm9udDp2aXNpYmxlIikubWFwKGZ1bmN0aW9uKCl7cmV0dXJuK2UodGhpcykuY3NzKCJ6LWluZGV4Iil9KS5nZXQoKSxhPU1hdGgubWF4LmFwcGx5KG51bGwsbik7cmV0dXJuIGE+PSt0aGlzLnVpRGlhbG9nLmNzcygiei1pbmRleCIpJiYodGhpcy51aURpYWxvZy5jc3MoInotaW5kZXgiLGErMSkscz0hMCkscyYmIWkmJnRoaXMuX3RyaWdnZXIoImZvY3VzIix0KSxzfSxvcGVuOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5faXNPcGVuPyh0aGlzLl9tb3ZlVG9Ub3AoKSYmdGhpcy5fZm9jdXNUYWJiYWJsZSgpLHZvaWQgMCk6KHRoaXMuX2lzT3Blbj0hMCx0aGlzLm9wZW5lcj1lKHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCksdGhpcy5fc2l6ZSgpLHRoaXMuX3Bvc2l0aW9uKCksdGhpcy5fY3JlYXRlT3ZlcmxheSgpLHRoaXMuX21vdmVUb1RvcChudWxsLCEwKSx0aGlzLm92ZXJsYXkmJnRoaXMub3ZlcmxheS5jc3MoInotaW5kZXgiLHRoaXMudWlEaWFsb2cuY3NzKCJ6LWluZGV4IiktMSksdGhpcy5fc2hvdyh0aGlzLnVpRGlhbG9nLHRoaXMub3B0aW9ucy5zaG93LGZ1bmN0aW9uKCl7dC5fZm9jdXNUYWJiYWJsZSgpLHQuX3RyaWdnZXIoImZvY3VzIil9KSx0aGlzLl9tYWtlRm9jdXNUYXJnZXQoKSx0aGlzLl90cmlnZ2VyKCJvcGVuIiksdm9pZCAwKX0sX2ZvY3VzVGFiYmFibGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9mb2N1c2VkRWxlbWVudDtlfHwoZT10aGlzLmVsZW1lbnQuZmluZCgiW2F1dG9mb2N1c10iKSksZS5sZW5ndGh8fChlPXRoaXMuZWxlbWVudC5maW5kKCI6dGFiYmFibGUiKSksZS5sZW5ndGh8fChlPXRoaXMudWlEaWFsb2dCdXR0b25QYW5lLmZpbmQoIjp0YWJiYWJsZSIpKSxlLmxlbmd0aHx8KGU9dGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2UuZmlsdGVyKCI6dGFiYmFibGUiKSksZS5sZW5ndGh8fChlPXRoaXMudWlEaWFsb2cpLGUuZXEoMCkuZm9jdXMoKX0sX2tlZXBGb2N1czpmdW5jdGlvbih0KXtmdW5jdGlvbiBpKCl7dmFyIHQ9dGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50LGk9dGhpcy51aURpYWxvZ1swXT09PXR8fGUuY29udGFpbnModGhpcy51aURpYWxvZ1swXSx0KTtpfHx0aGlzLl9mb2N1c1RhYmJhYmxlKCl9dC5wcmV2ZW50RGVmYXVsdCgpLGkuY2FsbCh0aGlzKSx0aGlzLl9kZWxheShpKX0sX2NyZWF0ZVdyYXBwZXI6ZnVuY3Rpb24oKXt0aGlzLnVpRGlhbG9nPWUoIjxkaXY+IikuYWRkQ2xhc3MoInVpLWRpYWxvZyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS1mcm9udCAiK3RoaXMub3B0aW9ucy5kaWFsb2dDbGFzcykuaGlkZSgpLmF0dHIoe3RhYkluZGV4Oi0xLHJvbGU6ImRpYWxvZyJ9KS5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbygpKSx0aGlzLl9vbih0aGlzLnVpRGlhbG9nLHtrZXlkb3duOmZ1bmN0aW9uKHQpe2lmKHRoaXMub3B0aW9ucy5jbG9zZU9uRXNjYXBlJiYhdC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmdC5rZXlDb2RlJiZ0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuRVNDQVBFKXJldHVybiB0LnByZXZlbnREZWZhdWx0KCksdGhpcy5jbG9zZSh0KSx2b2lkIDA7aWYodC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLlRBQiYmIXQuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciBpPXRoaXMudWlEaWFsb2cuZmluZCgiOnRhYmJhYmxlIikscz1pLmZpbHRlcigiOmZpcnN0Iiksbj1pLmZpbHRlcigiOmxhc3QiKTt0LnRhcmdldCE9PW5bMF0mJnQudGFyZ2V0IT09dGhpcy51aURpYWxvZ1swXXx8dC5zaGlmdEtleT90LnRhcmdldCE9PXNbMF0mJnQudGFyZ2V0IT09dGhpcy51aURpYWxvZ1swXXx8IXQuc2hpZnRLZXl8fCh0aGlzLl9kZWxheShmdW5jdGlvbigpe24uZm9jdXMoKX0pLHQucHJldmVudERlZmF1bHQoKSk6KHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7cy5mb2N1cygpfSksdC5wcmV2ZW50RGVmYXVsdCgpKX19LG1vdXNlZG93bjpmdW5jdGlvbihlKXt0aGlzLl9tb3ZlVG9Ub3AoZSkmJnRoaXMuX2ZvY3VzVGFiYmFibGUoKX19KSx0aGlzLmVsZW1lbnQuZmluZCgiW2FyaWEtZGVzY3JpYmVkYnldIikubGVuZ3RofHx0aGlzLnVpRGlhbG9nLmF0dHIoeyJhcmlhLWRlc2NyaWJlZGJ5Ijp0aGlzLmVsZW1lbnQudW5pcXVlSWQoKS5hdHRyKCJpZCIpfSl9LF9jcmVhdGVUaXRsZWJhcjpmdW5jdGlvbigpe3ZhciB0O3RoaXMudWlEaWFsb2dUaXRsZWJhcj1lKCI8ZGl2PiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGViYXIgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIHVpLWhlbHBlci1jbGVhcmZpeCIpLnByZXBlbmRUbyh0aGlzLnVpRGlhbG9nKSx0aGlzLl9vbih0aGlzLnVpRGlhbG9nVGl0bGViYXIse21vdXNlZG93bjpmdW5jdGlvbih0KXtlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIil8fHRoaXMudWlEaWFsb2cuZm9jdXMoKX19KSx0aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZT1lKCI8YnV0dG9uIHR5cGU9J2J1dHRvbic+PC9idXR0b24+IikuYnV0dG9uKHtsYWJlbDp0aGlzLm9wdGlvbnMuY2xvc2VUZXh0LGljb25zOntwcmltYXJ5OiJ1aS1pY29uLWNsb3NldGhpY2sifSx0ZXh0OiExfSkuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSIpLmFwcGVuZFRvKHRoaXMudWlEaWFsb2dUaXRsZWJhciksdGhpcy5fb24odGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2Use2NsaWNrOmZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKSx0aGlzLmNsb3NlKGUpfX0pLHQ9ZSgiPHNwYW4+IikudW5pcXVlSWQoKS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlIikucHJlcGVuZFRvKHRoaXMudWlEaWFsb2dUaXRsZWJhciksdGhpcy5fdGl0bGUodCksdGhpcy51aURpYWxvZy5hdHRyKHsiYXJpYS1sYWJlbGxlZGJ5Ijp0LmF0dHIoImlkIil9KX0sX3RpdGxlOmZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucy50aXRsZXx8ZS5odG1sKCImIzE2MDsiKSxlLnRleHQodGhpcy5vcHRpb25zLnRpdGxlKQp9LF9jcmVhdGVCdXR0b25QYW5lOmZ1bmN0aW9uKCl7dGhpcy51aURpYWxvZ0J1dHRvblBhbmU9ZSgiPGRpdj4iKS5hZGRDbGFzcygidWktZGlhbG9nLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IiksdGhpcy51aUJ1dHRvblNldD1lKCI8ZGl2PiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctYnV0dG9uc2V0IikuYXBwZW5kVG8odGhpcy51aURpYWxvZ0J1dHRvblBhbmUpLHRoaXMuX2NyZWF0ZUJ1dHRvbnMoKX0sX2NyZWF0ZUJ1dHRvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGk9dGhpcy5vcHRpb25zLmJ1dHRvbnM7cmV0dXJuIHRoaXMudWlEaWFsb2dCdXR0b25QYW5lLnJlbW92ZSgpLHRoaXMudWlCdXR0b25TZXQuZW1wdHkoKSxlLmlzRW1wdHlPYmplY3QoaSl8fGUuaXNBcnJheShpKSYmIWkubGVuZ3RoPyh0aGlzLnVpRGlhbG9nLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctYnV0dG9ucyIpLHZvaWQgMCk6KGUuZWFjaChpLGZ1bmN0aW9uKGkscyl7dmFyIG4sYTtzPWUuaXNGdW5jdGlvbihzKT97Y2xpY2s6cyx0ZXh0Oml9OnMscz1lLmV4dGVuZCh7dHlwZToiYnV0dG9uIn0scyksbj1zLmNsaWNrLHMuY2xpY2s9ZnVuY3Rpb24oKXtuLmFwcGx5KHQuZWxlbWVudFswXSxhcmd1bWVudHMpfSxhPXtpY29uczpzLmljb25zLHRleHQ6cy5zaG93VGV4dH0sZGVsZXRlIHMuaWNvbnMsZGVsZXRlIHMuc2hvd1RleHQsZSgiPGJ1dHRvbj48L2J1dHRvbj4iLHMpLmJ1dHRvbihhKS5hcHBlbmRUbyh0LnVpQnV0dG9uU2V0KX0pLHRoaXMudWlEaWFsb2cuYWRkQ2xhc3MoInVpLWRpYWxvZy1idXR0b25zIiksdGhpcy51aURpYWxvZ0J1dHRvblBhbmUuYXBwZW5kVG8odGhpcy51aURpYWxvZyksdm9pZCAwKX0sX21ha2VEcmFnZ2FibGU6ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3JldHVybntwb3NpdGlvbjplLnBvc2l0aW9uLG9mZnNldDplLm9mZnNldH19dmFyIGk9dGhpcyxzPXRoaXMub3B0aW9uczt0aGlzLnVpRGlhbG9nLmRyYWdnYWJsZSh7Y2FuY2VsOiIudWktZGlhbG9nLWNvbnRlbnQsIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2UiLGhhbmRsZToiLnVpLWRpYWxvZy10aXRsZWJhciIsY29udGFpbm1lbnQ6ImRvY3VtZW50IixzdGFydDpmdW5jdGlvbihzLG4pe2UodGhpcykuYWRkQ2xhc3MoInVpLWRpYWxvZy1kcmFnZ2luZyIpLGkuX2Jsb2NrRnJhbWVzKCksaS5fdHJpZ2dlcigiZHJhZ1N0YXJ0IixzLHQobikpfSxkcmFnOmZ1bmN0aW9uKGUscyl7aS5fdHJpZ2dlcigiZHJhZyIsZSx0KHMpKX0sc3RvcDpmdW5jdGlvbihuLGEpe3ZhciBvPWEub2Zmc2V0LmxlZnQtaS5kb2N1bWVudC5zY3JvbGxMZWZ0KCkscj1hLm9mZnNldC50b3AtaS5kb2N1bWVudC5zY3JvbGxUb3AoKTtzLnBvc2l0aW9uPXtteToibGVmdCB0b3AiLGF0OiJsZWZ0Iisobz49MD8iKyI6IiIpK28rIiAiKyJ0b3AiKyhyPj0wPyIrIjoiIikrcixvZjppLndpbmRvd30sZSh0aGlzKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLWRyYWdnaW5nIiksaS5fdW5ibG9ja0ZyYW1lcygpLGkuX3RyaWdnZXIoImRyYWdTdG9wIixuLHQoYSkpfX0pfSxfbWFrZVJlc2l6YWJsZTpmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7cmV0dXJue29yaWdpbmFsUG9zaXRpb246ZS5vcmlnaW5hbFBvc2l0aW9uLG9yaWdpbmFsU2l6ZTplLm9yaWdpbmFsU2l6ZSxwb3NpdGlvbjplLnBvc2l0aW9uLHNpemU6ZS5zaXplfX12YXIgaT10aGlzLHM9dGhpcy5vcHRpb25zLG49cy5yZXNpemFibGUsYT10aGlzLnVpRGlhbG9nLmNzcygicG9zaXRpb24iKSxvPSJzdHJpbmciPT10eXBlb2Ygbj9uOiJuLGUscyx3LHNlLHN3LG5lLG53Ijt0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSh7Y2FuY2VsOiIudWktZGlhbG9nLWNvbnRlbnQiLGNvbnRhaW5tZW50OiJkb2N1bWVudCIsYWxzb1Jlc2l6ZTp0aGlzLmVsZW1lbnQsbWF4V2lkdGg6cy5tYXhXaWR0aCxtYXhIZWlnaHQ6cy5tYXhIZWlnaHQsbWluV2lkdGg6cy5taW5XaWR0aCxtaW5IZWlnaHQ6dGhpcy5fbWluSGVpZ2h0KCksaGFuZGxlczpvLHN0YXJ0OmZ1bmN0aW9uKHMsbil7ZSh0aGlzKS5hZGRDbGFzcygidWktZGlhbG9nLXJlc2l6aW5nIiksaS5fYmxvY2tGcmFtZXMoKSxpLl90cmlnZ2VyKCJyZXNpemVTdGFydCIscyx0KG4pKX0scmVzaXplOmZ1bmN0aW9uKGUscyl7aS5fdHJpZ2dlcigicmVzaXplIixlLHQocykpfSxzdG9wOmZ1bmN0aW9uKG4sYSl7dmFyIG89aS51aURpYWxvZy5vZmZzZXQoKSxyPW8ubGVmdC1pLmRvY3VtZW50LnNjcm9sbExlZnQoKSxoPW8udG9wLWkuZG9jdW1lbnQuc2Nyb2xsVG9wKCk7cy5oZWlnaHQ9aS51aURpYWxvZy5oZWlnaHQoKSxzLndpZHRoPWkudWlEaWFsb2cud2lkdGgoKSxzLnBvc2l0aW9uPXtteToibGVmdCB0b3AiLGF0OiJsZWZ0Iisocj49MD8iKyI6IiIpK3IrIiAiKyJ0b3AiKyhoPj0wPyIrIjoiIikraCxvZjppLndpbmRvd30sZSh0aGlzKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLXJlc2l6aW5nIiksaS5fdW5ibG9ja0ZyYW1lcygpLGkuX3RyaWdnZXIoInJlc2l6ZVN0b3AiLG4sdChhKSl9fSkuY3NzKCJwb3NpdGlvbiIsYSl9LF90cmFja0ZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fb24odGhpcy53aWRnZXQoKSx7Zm9jdXNpbjpmdW5jdGlvbih0KXt0aGlzLl9tYWtlRm9jdXNUYXJnZXQoKSx0aGlzLl9mb2N1c2VkRWxlbWVudD1lKHQudGFyZ2V0KX19KX0sX21ha2VGb2N1c1RhcmdldDpmdW5jdGlvbigpe3RoaXMuX3VudHJhY2tJbnN0YW5jZSgpLHRoaXMuX3RyYWNraW5nSW5zdGFuY2VzKCkudW5zaGlmdCh0aGlzKX0sX3VudHJhY2tJbnN0YW5jZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3RyYWNraW5nSW5zdGFuY2VzKCksaT1lLmluQXJyYXkodGhpcyx0KTstMSE9PWkmJnQuc3BsaWNlKGksMSl9LF90cmFja2luZ0luc3RhbmNlczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZG9jdW1lbnQuZGF0YSgidWktZGlhbG9nLWluc3RhbmNlcyIpO3JldHVybiBlfHwoZT1bXSx0aGlzLmRvY3VtZW50LmRhdGEoInVpLWRpYWxvZy1pbnN0YW5jZXMiLGUpKSxlfSxfbWluSGVpZ2h0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zO3JldHVybiJhdXRvIj09PWUuaGVpZ2h0P2UubWluSGVpZ2h0Ok1hdGgubWluKGUubWluSGVpZ2h0LGUuaGVpZ2h0KX0sX3Bvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy51aURpYWxvZy5pcygiOnZpc2libGUiKTtlfHx0aGlzLnVpRGlhbG9nLnNob3coKSx0aGlzLnVpRGlhbG9nLnBvc2l0aW9uKHRoaXMub3B0aW9ucy5wb3NpdGlvbiksZXx8dGhpcy51aURpYWxvZy5oaWRlKCl9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMscz0hMSxuPXt9O2UuZWFjaCh0LGZ1bmN0aW9uKGUsdCl7aS5fc2V0T3B0aW9uKGUsdCksZSBpbiBpLnNpemVSZWxhdGVkT3B0aW9ucyYmKHM9ITApLGUgaW4gaS5yZXNpemFibGVSZWxhdGVkT3B0aW9ucyYmKG5bZV09dCl9KSxzJiYodGhpcy5fc2l6ZSgpLHRoaXMuX3Bvc2l0aW9uKCkpLHRoaXMudWlEaWFsb2cuaXMoIjpkYXRhKHVpLXJlc2l6YWJsZSkiKSYmdGhpcy51aURpYWxvZy5yZXNpemFibGUoIm9wdGlvbiIsbil9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXt2YXIgaSxzLG49dGhpcy51aURpYWxvZzsiZGlhbG9nQ2xhc3MiPT09ZSYmbi5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuZGlhbG9nQ2xhc3MpLmFkZENsYXNzKHQpLCJkaXNhYmxlZCIhPT1lJiYodGhpcy5fc3VwZXIoZSx0KSwiYXBwZW5kVG8iPT09ZSYmdGhpcy51aURpYWxvZy5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbygpKSwiYnV0dG9ucyI9PT1lJiZ0aGlzLl9jcmVhdGVCdXR0b25zKCksImNsb3NlVGV4dCI9PT1lJiZ0aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZS5idXR0b24oe2xhYmVsOiIiK3R9KSwiZHJhZ2dhYmxlIj09PWUmJihpPW4uaXMoIjpkYXRhKHVpLWRyYWdnYWJsZSkiKSxpJiYhdCYmbi5kcmFnZ2FibGUoImRlc3Ryb3kiKSwhaSYmdCYmdGhpcy5fbWFrZURyYWdnYWJsZSgpKSwicG9zaXRpb24iPT09ZSYmdGhpcy5fcG9zaXRpb24oKSwicmVzaXphYmxlIj09PWUmJihzPW4uaXMoIjpkYXRhKHVpLXJlc2l6YWJsZSkiKSxzJiYhdCYmbi5yZXNpemFibGUoImRlc3Ryb3kiKSxzJiYic3RyaW5nIj09dHlwZW9mIHQmJm4ucmVzaXphYmxlKCJvcHRpb24iLCJoYW5kbGVzIix0KSxzfHx0PT09ITF8fHRoaXMuX21ha2VSZXNpemFibGUoKSksInRpdGxlIj09PWUmJnRoaXMuX3RpdGxlKHRoaXMudWlEaWFsb2dUaXRsZWJhci5maW5kKCIudWktZGlhbG9nLXRpdGxlIikpKX0sX3NpemU6ZnVuY3Rpb24oKXt2YXIgZSx0LGkscz10aGlzLm9wdGlvbnM7dGhpcy5lbGVtZW50LnNob3coKS5jc3Moe3dpZHRoOiJhdXRvIixtaW5IZWlnaHQ6MCxtYXhIZWlnaHQ6Im5vbmUiLGhlaWdodDowfSkscy5taW5XaWR0aD5zLndpZHRoJiYocy53aWR0aD1zLm1pbldpZHRoKSxlPXRoaXMudWlEaWFsb2cuY3NzKHtoZWlnaHQ6ImF1dG8iLHdpZHRoOnMud2lkdGh9KS5vdXRlckhlaWdodCgpLHQ9TWF0aC5tYXgoMCxzLm1pbkhlaWdodC1lKSxpPSJudW1iZXIiPT10eXBlb2Ygcy5tYXhIZWlnaHQ/TWF0aC5tYXgoMCxzLm1heEhlaWdodC1lKToibm9uZSIsImF1dG8iPT09cy5oZWlnaHQ/dGhpcy5lbGVtZW50LmNzcyh7bWluSGVpZ2h0OnQsbWF4SGVpZ2h0OmksaGVpZ2h0OiJhdXRvIn0pOnRoaXMuZWxlbWVudC5oZWlnaHQoTWF0aC5tYXgoMCxzLmhlaWdodC1lKSksdGhpcy51aURpYWxvZy5pcygiOmRhdGEodWktcmVzaXphYmxlKSIpJiZ0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSgib3B0aW9uIiwibWluSGVpZ2h0Iix0aGlzLl9taW5IZWlnaHQoKSl9LF9ibG9ja0ZyYW1lczpmdW5jdGlvbigpe3RoaXMuaWZyYW1lQmxvY2tzPXRoaXMuZG9jdW1lbnQuZmluZCgiaWZyYW1lIikubWFwKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtyZXR1cm4gZSgiPGRpdj4iKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsd2lkdGg6dC5vdXRlcldpZHRoKCksaGVpZ2h0OnQub3V0ZXJIZWlnaHQoKX0pLmFwcGVuZFRvKHQucGFyZW50KCkpLm9mZnNldCh0Lm9mZnNldCgpKVswXX0pfSxfdW5ibG9ja0ZyYW1lczpmdW5jdGlvbigpe3RoaXMuaWZyYW1lQmxvY2tzJiYodGhpcy5pZnJhbWVCbG9ja3MucmVtb3ZlKCksZGVsZXRlIHRoaXMuaWZyYW1lQmxvY2tzKX0sX2FsbG93SW50ZXJhY3Rpb246ZnVuY3Rpb24odCl7cmV0dXJuIGUodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1kaWFsb2ciKS5sZW5ndGg/ITA6ISFlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktZGF0ZXBpY2tlciIpLmxlbmd0aH0sX2NyZWF0ZU92ZXJsYXk6ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMubW9kYWwpe3ZhciB0PSEwO3RoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dD0hMX0pLHRoaXMuZG9jdW1lbnQuZGF0YSgidWktZGlhbG9nLW92ZXJsYXlzIil8fHRoaXMuX29uKHRoaXMuZG9jdW1lbnQse2ZvY3VzaW46ZnVuY3Rpb24oZSl7dHx8dGhpcy5fYWxsb3dJbnRlcmFjdGlvbihlKXx8KGUucHJldmVudERlZmF1bHQoKSx0aGlzLl90cmFja2luZ0luc3RhbmNlcygpWzBdLl9mb2N1c1RhYmJhYmxlKCkpfX0pLHRoaXMub3ZlcmxheT1lKCI8ZGl2PiIpLmFkZENsYXNzKCJ1aS13aWRnZXQtb3ZlcmxheSB1aS1mcm9udCIpLmFwcGVuZFRvKHRoaXMuX2FwcGVuZFRvKCkpLHRoaXMuX29uKHRoaXMub3ZlcmxheSx7bW91c2Vkb3duOiJfa2VlcEZvY3VzIn0pLHRoaXMuZG9jdW1lbnQuZGF0YSgidWktZGlhbG9nLW92ZXJsYXlzIiwodGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctb3ZlcmxheXMiKXx8MCkrMSl9fSxfZGVzdHJveU92ZXJsYXk6ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMubW9kYWwmJnRoaXMub3ZlcmxheSl7dmFyIGU9dGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctb3ZlcmxheXMiKS0xO2U/dGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctb3ZlcmxheXMiLGUpOnRoaXMuZG9jdW1lbnQudW5iaW5kKCJmb2N1c2luIikucmVtb3ZlRGF0YSgidWktZGlhbG9nLW92ZXJsYXlzIiksdGhpcy5vdmVybGF5LnJlbW92ZSgpLHRoaXMub3ZlcmxheT1udWxsfX19KSxlLndpZGdldCgidWkucHJvZ3Jlc3NiYXIiLHt2ZXJzaW9uOiIxLjExLjQiLG9wdGlvbnM6e21heDoxMDAsdmFsdWU6MCxjaGFuZ2U6bnVsbCxjb21wbGV0ZTpudWxsfSxtaW46MCxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5vbGRWYWx1ZT10aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fY29uc3RyYWluZWRWYWx1ZSgpLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktcHJvZ3Jlc3NiYXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS5hdHRyKHtyb2xlOiJwcm9ncmVzc2JhciIsImFyaWEtdmFsdWVtaW4iOnRoaXMubWlufSksdGhpcy52YWx1ZURpdj1lKCI8ZGl2IGNsYXNzPSd1aS1wcm9ncmVzc2Jhci12YWx1ZSB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1sZWZ0Jz48L2Rpdj4iKS5hcHBlbmRUbyh0aGlzLmVsZW1lbnQpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktcHJvZ3Jlc3NiYXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW1pbiIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVtYXgiKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbm93IiksdGhpcy52YWx1ZURpdi5yZW1vdmUoKX0sdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5vcHRpb25zLnZhbHVlOih0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fY29uc3RyYWluZWRWYWx1ZShlKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx2b2lkIDApfSxfY29uc3RyYWluZWRWYWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dGhpcy5vcHRpb25zLnZhbHVlKSx0aGlzLmluZGV0ZXJtaW5hdGU9ZT09PSExLCJudW1iZXIiIT10eXBlb2YgZSYmKGU9MCksdGhpcy5pbmRldGVybWluYXRlPyExOk1hdGgubWluKHRoaXMub3B0aW9ucy5tYXgsTWF0aC5tYXgodGhpcy5taW4sZSkpfSxfc2V0T3B0aW9uczpmdW5jdGlvbihlKXt2YXIgdD1lLnZhbHVlO2RlbGV0ZSBlLnZhbHVlLHRoaXMuX3N1cGVyKGUpLHRoaXMub3B0aW9ucy52YWx1ZT10aGlzLl9jb25zdHJhaW5lZFZhbHVlKHQpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7Im1heCI9PT1lJiYodD1NYXRoLm1heCh0aGlzLm1pbix0KSksImRpc2FibGVkIj09PWUmJnRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCkuYXR0cigiYXJpYS1kaXNhYmxlZCIsdCksdGhpcy5fc3VwZXIoZSx0KX0sX3BlcmNlbnRhZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbmRldGVybWluYXRlPzEwMDoxMDAqKHRoaXMub3B0aW9ucy52YWx1ZS10aGlzLm1pbikvKHRoaXMub3B0aW9ucy5tYXgtdGhpcy5taW4pfSxfcmVmcmVzaFZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLnZhbHVlLGk9dGhpcy5fcGVyY2VudGFnZSgpO3RoaXMudmFsdWVEaXYudG9nZ2xlKHRoaXMuaW5kZXRlcm1pbmF0ZXx8dD50aGlzLm1pbikudG9nZ2xlQ2xhc3MoInVpLWNvcm5lci1yaWdodCIsdD09PXRoaXMub3B0aW9ucy5tYXgpLndpZHRoKGkudG9GaXhlZCgwKSsiJSIpLHRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygidWktcHJvZ3Jlc3NiYXItaW5kZXRlcm1pbmF0ZSIsdGhpcy5pbmRldGVybWluYXRlKSx0aGlzLmluZGV0ZXJtaW5hdGU/KHRoaXMuZWxlbWVudC5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbm93IiksdGhpcy5vdmVybGF5RGl2fHwodGhpcy5vdmVybGF5RGl2PWUoIjxkaXYgY2xhc3M9J3VpLXByb2dyZXNzYmFyLW92ZXJsYXknPjwvZGl2PiIpLmFwcGVuZFRvKHRoaXMudmFsdWVEaXYpKSk6KHRoaXMuZWxlbWVudC5hdHRyKHsiYXJpYS12YWx1ZW1heCI6dGhpcy5vcHRpb25zLm1heCwiYXJpYS12YWx1ZW5vdyI6dH0pLHRoaXMub3ZlcmxheURpdiYmKHRoaXMub3ZlcmxheURpdi5yZW1vdmUoKSx0aGlzLm92ZXJsYXlEaXY9bnVsbCkpLHRoaXMub2xkVmFsdWUhPT10JiYodGhpcy5vbGRWYWx1ZT10LHRoaXMuX3RyaWdnZXIoImNoYW5nZSIpKSx0PT09dGhpcy5vcHRpb25zLm1heCYmdGhpcy5fdHJpZ2dlcigiY29tcGxldGUiKX19KSxlLndpZGdldCgidWkuc2VsZWN0bWVudSIse3ZlcnNpb246IjEuMTEuNCIsZGVmYXVsdEVsZW1lbnQ6IjxzZWxlY3Q+IixvcHRpb25zOnthcHBlbmRUbzpudWxsLGRpc2FibGVkOm51bGwsaWNvbnM6e2J1dHRvbjoidWktaWNvbi10cmlhbmdsZS0xLXMifSxwb3NpdGlvbjp7bXk6ImxlZnQgdG9wIixhdDoibGVmdCBib3R0b20iLGNvbGxpc2lvbjoibm9uZSJ9LHdpZHRoOm51bGwsY2hhbmdlOm51bGwsY2xvc2U6bnVsbCxmb2N1czpudWxsLG9wZW46bnVsbCxzZWxlY3Q6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZWxlbWVudC51bmlxdWVJZCgpLmF0dHIoImlkIik7dGhpcy5pZHM9e2VsZW1lbnQ6ZSxidXR0b246ZSsiLWJ1dHRvbiIsbWVudTplKyItbWVudSJ9LHRoaXMuX2RyYXdCdXR0b24oKSx0aGlzLl9kcmF3TWVudSgpLHRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5kaXNhYmxlKCl9LF9kcmF3QnV0dG9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmxhYmVsPWUoImxhYmVsW2Zvcj0nIit0aGlzLmlkcy5lbGVtZW50KyInXSIpLmF0dHIoImZvciIsdGhpcy5pZHMuYnV0dG9uKSx0aGlzLl9vbih0aGlzLmxhYmVsLHtjbGljazpmdW5jdGlvbihlKXt0aGlzLmJ1dHRvbi5mb2N1cygpLGUucHJldmVudERlZmF1bHQoKX19KSx0aGlzLmVsZW1lbnQuaGlkZSgpLHRoaXMuYnV0dG9uPWUoIjxzcGFuPiIseyJjbGFzcyI6InVpLXNlbGVjdG1lbnUtYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiLHRhYmluZGV4OnRoaXMub3B0aW9ucy5kaXNhYmxlZD8tMTowLGlkOnRoaXMuaWRzLmJ1dHRvbixyb2xlOiJjb21ib2JveCIsImFyaWEtZXhwYW5kZWQiOiJmYWxzZSIsImFyaWEtYXV0b2NvbXBsZXRlIjoibGlzdCIsImFyaWEtb3ducyI6dGhpcy5pZHMubWVudSwiYXJpYS1oYXNwb3B1cCI6InRydWUifSkuaW5zZXJ0QWZ0ZXIodGhpcy5lbGVtZW50KSxlKCI8c3Bhbj4iLHsiY2xhc3MiOiJ1aS1pY29uICIrdGhpcy5vcHRpb25zLmljb25zLmJ1dHRvbn0pLnByZXBlbmRUbyh0aGlzLmJ1dHRvbiksdGhpcy5idXR0b25UZXh0PWUoIjxzcGFuPiIseyJjbGFzcyI6InVpLXNlbGVjdG1lbnUtdGV4dCJ9KS5hcHBlbmRUbyh0aGlzLmJ1dHRvbiksdGhpcy5fc2V0VGV4dCh0aGlzLmJ1dHRvblRleHQsdGhpcy5lbGVtZW50LmZpbmQoIm9wdGlvbjpzZWxlY3RlZCIpLnRleHQoKSksdGhpcy5fcmVzaXplQnV0dG9uKCksdGhpcy5fb24odGhpcy5idXR0b24sdGhpcy5fYnV0dG9uRXZlbnRzKSx0aGlzLmJ1dHRvbi5vbmUoImZvY3VzaW4iLGZ1bmN0aW9uKCl7dC5tZW51SXRlbXN8fHQuX3JlZnJlc2hNZW51KCl9KSx0aGlzLl9ob3ZlcmFibGUodGhpcy5idXR0b24pLHRoaXMuX2ZvY3VzYWJsZSh0aGlzLmJ1dHRvbil9LF9kcmF3TWVudTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5tZW51PWUoIjx1bD4iLHsiYXJpYS1oaWRkZW4iOiJ0cnVlIiwiYXJpYS1sYWJlbGxlZGJ5Ijp0aGlzLmlkcy5idXR0b24saWQ6dGhpcy5pZHMubWVudX0pLHRoaXMubWVudVdyYXA9ZSgiPGRpdj4iLHsiY2xhc3MiOiJ1aS1zZWxlY3RtZW51LW1lbnUgdWktZnJvbnQifSkuYXBwZW5kKHRoaXMubWVudSkuYXBwZW5kVG8odGhpcy5fYXBwZW5kVG8oKSksdGhpcy5tZW51SW5zdGFuY2U9dGhpcy5tZW51Lm1lbnUoe3JvbGU6Imxpc3Rib3giLHNlbGVjdDpmdW5jdGlvbihlLGkpe2UucHJldmVudERlZmF1bHQoKSx0Ll9zZXRTZWxlY3Rpb24oKSx0Ll9zZWxlY3QoaS5pdGVtLmRhdGEoInVpLXNlbGVjdG1lbnUtaXRlbSIpLGUpfSxmb2N1czpmdW5jdGlvbihlLGkpe3ZhciBzPWkuaXRlbS5kYXRhKCJ1aS1zZWxlY3RtZW51LWl0ZW0iKTtudWxsIT10LmZvY3VzSW5kZXgmJnMuaW5kZXghPT10LmZvY3VzSW5kZXgmJih0Ll90cmlnZ2VyKCJmb2N1cyIsZSx7aXRlbTpzfSksdC5pc09wZW58fHQuX3NlbGVjdChzLGUpKSx0LmZvY3VzSW5kZXg9cy5pbmRleCx0LmJ1dHRvbi5hdHRyKCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiLHQubWVudUl0ZW1zLmVxKHMuaW5kZXgpLmF0dHIoImlkIikpfX0pLm1lbnUoImluc3RhbmNlIiksdGhpcy5tZW51LmFkZENsYXNzKCJ1aS1jb3JuZXItYm90dG9tIikucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci1hbGwiKSx0aGlzLm1lbnVJbnN0YW5jZS5fb2ZmKHRoaXMubWVudSwibW91c2VsZWF2ZSIpLHRoaXMubWVudUluc3RhbmNlLl9jbG9zZU9uRG9jdW1lbnRDbGljaz1mdW5jdGlvbigpe3JldHVybiExfSx0aGlzLm1lbnVJbnN0YW5jZS5faXNEaXZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuITF9fSxyZWZyZXNoOmZ1bmN0aW9uKCl7dGhpcy5fcmVmcmVzaE1lbnUoKSx0aGlzLl9zZXRUZXh0KHRoaXMuYnV0dG9uVGV4dCx0aGlzLl9nZXRTZWxlY3RlZEl0ZW0oKS50ZXh0KCkpLHRoaXMub3B0aW9ucy53aWR0aHx8dGhpcy5fcmVzaXplQnV0dG9uKCl9LF9yZWZyZXNoTWVudTpmdW5jdGlvbigpe3RoaXMubWVudS5lbXB0eSgpO3ZhciBlLHQ9dGhpcy5lbGVtZW50LmZpbmQoIm9wdGlvbiIpO3QubGVuZ3RoJiYodGhpcy5fcGFyc2VPcHRpb25zKHQpLHRoaXMuX3JlbmRlck1lbnUodGhpcy5tZW51LHRoaXMuaXRlbXMpLHRoaXMubWVudUluc3RhbmNlLnJlZnJlc2goKSx0aGlzLm1lbnVJdGVtcz10aGlzLm1lbnUuZmluZCgibGkiKS5ub3QoIi51aS1zZWxlY3RtZW51LW9wdGdyb3VwIiksZT10aGlzLl9nZXRTZWxlY3RlZEl0ZW0oKSx0aGlzLm1lbnVJbnN0YW5jZS5mb2N1cyhudWxsLGUpLHRoaXMuX3NldEFyaWEoZS5kYXRhKCJ1aS1zZWxlY3RtZW51LWl0ZW0iKSksdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsdGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIikpKX0sb3BlbjpmdW5jdGlvbihlKXt0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fCh0aGlzLm1lbnVJdGVtcz8odGhpcy5tZW51LmZpbmQoIi51aS1zdGF0ZS1mb2N1cyIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpLHRoaXMubWVudUluc3RhbmNlLmZvY3VzKG51bGwsdGhpcy5fZ2V0U2VsZWN0ZWRJdGVtKCkpKTp0aGlzLl9yZWZyZXNoTWVudSgpLHRoaXMuaXNPcGVuPSEwLHRoaXMuX3RvZ2dsZUF0dHIoKSx0aGlzLl9yZXNpemVNZW51KCksdGhpcy5fcG9zaXRpb24oKSx0aGlzLl9vbih0aGlzLmRvY3VtZW50LHRoaXMuX2RvY3VtZW50Q2xpY2spLHRoaXMuX3RyaWdnZXIoIm9wZW4iLGUpKX0sX3Bvc2l0aW9uOmZ1bmN0aW9uKCl7dGhpcy5tZW51V3JhcC5wb3NpdGlvbihlLmV4dGVuZCh7b2Y6dGhpcy5idXR0b259LHRoaXMub3B0aW9ucy5wb3NpdGlvbikpfSxjbG9zZTpmdW5jdGlvbihlKXt0aGlzLmlzT3BlbiYmKHRoaXMuaXNPcGVuPSExLHRoaXMuX3RvZ2dsZUF0dHIoKSx0aGlzLnJhbmdlPW51bGwsdGhpcy5fb2ZmKHRoaXMuZG9jdW1lbnQpLHRoaXMuX3RyaWdnZXIoImNsb3NlIixlKSl9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1dHRvbn0sbWVudVdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lbnV9LF9yZW5kZXJNZW51OmZ1bmN0aW9uKHQsaSl7dmFyIHM9dGhpcyxuPSIiO2UuZWFjaChpLGZ1bmN0aW9uKGksYSl7YS5vcHRncm91cCE9PW4mJihlKCI8bGk+Iix7ImNsYXNzIjoidWktc2VsZWN0bWVudS1vcHRncm91cCB1aS1tZW51LWRpdmlkZXIiKyhhLmVsZW1lbnQucGFyZW50KCJvcHRncm91cCIpLnByb3AoImRpc2FibGVkIik/IiB1aS1zdGF0ZS1kaXNhYmxlZCI6IiIpLHRleHQ6YS5vcHRncm91cH0pLmFwcGVuZFRvKHQpLG49YS5vcHRncm91cCkscy5fcmVuZGVySXRlbURhdGEodCxhKX0pfSxfcmVuZGVySXRlbURhdGE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fcmVuZGVySXRlbShlLHQpLmRhdGEoInVpLXNlbGVjdG1lbnUtaXRlbSIsdCl9LF9yZW5kZXJJdGVtOmZ1bmN0aW9uKHQsaSl7dmFyIHM9ZSgiPGxpPiIpO3JldHVybiBpLmRpc2FibGVkJiZzLmFkZENsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpLHRoaXMuX3NldFRleHQocyxpLmxhYmVsKSxzLmFwcGVuZFRvKHQpfSxfc2V0VGV4dDpmdW5jdGlvbihlLHQpe3Q/ZS50ZXh0KHQpOmUuaHRtbCgiJiMxNjA7Iil9LF9tb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIGkscyxuPSIudWktbWVudS1pdGVtIjt0aGlzLmlzT3Blbj9pPXRoaXMubWVudUl0ZW1zLmVxKHRoaXMuZm9jdXNJbmRleCk6KGk9dGhpcy5tZW51SXRlbXMuZXEodGhpcy5lbGVtZW50WzBdLnNlbGVjdGVkSW5kZXgpLG4rPSI6bm90KC51aS1zdGF0ZS1kaXNhYmxlZCkiKSxzPSJmaXJzdCI9PT1lfHwibGFzdCI9PT1lP2lbImZpcnN0Ij09PWU/InByZXZBbGwiOiJuZXh0QWxsIl0obikuZXEoLTEpOmlbZSsiQWxsIl0obikuZXEoMCkscy5sZW5ndGgmJnRoaXMubWVudUluc3RhbmNlLmZvY3VzKHQscyl9LF9nZXRTZWxlY3RlZEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZW51SXRlbXMuZXEodGhpcy5lbGVtZW50WzBdLnNlbGVjdGVkSW5kZXgpfSxfdG9nZ2xlOmZ1bmN0aW9uKGUpe3RoaXNbdGhpcy5pc09wZW4/ImNsb3NlIjoib3BlbiJdKGUpfSxfc2V0U2VsZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGU7dGhpcy5yYW5nZSYmKHdpbmRvdy5nZXRTZWxlY3Rpb24/KGU9d2luZG93LmdldFNlbGVjdGlvbigpLGUucmVtb3ZlQWxsUmFuZ2VzKCksZS5hZGRSYW5nZSh0aGlzLnJhbmdlKSk6dGhpcy5yYW5nZS5zZWxlY3QoKSx0aGlzLmJ1dHRvbi5mb2N1cygpKX0sX2RvY3VtZW50Q2xpY2s6e21vdXNlZG93bjpmdW5jdGlvbih0KXt0aGlzLmlzT3BlbiYmKGUodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1zZWxlY3RtZW51LW1lbnUsICMiK3RoaXMuaWRzLmJ1dHRvbikubGVuZ3RofHx0aGlzLmNsb3NlKHQpKX19LF9idXR0b25FdmVudHM6e21vdXNlZG93bjpmdW5jdGlvbigpe3ZhciBlO3dpbmRvdy5nZXRTZWxlY3Rpb24/KGU9d2luZG93LmdldFNlbGVjdGlvbigpLGUucmFuZ2VDb3VudCYmKHRoaXMucmFuZ2U9ZS5nZXRSYW5nZUF0KDApKSk6dGhpcy5yYW5nZT1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKX0sY2xpY2s6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0U2VsZWN0aW9uKCksdGhpcy5fdG9nZ2xlKGUpfSxrZXlkb3duOmZ1bmN0aW9uKHQpe3ZhciBpPSEwO3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLlRBQjpjYXNlIGUudWkua2V5Q29kZS5FU0NBUEU6dGhpcy5jbG9zZSh0KSxpPSExO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkVOVEVSOnRoaXMuaXNPcGVuJiZ0aGlzLl9zZWxlY3RGb2N1c2VkSXRlbSh0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5VUDp0LmFsdEtleT90aGlzLl90b2dnbGUodCk6dGhpcy5fbW92ZSgicHJldiIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRE9XTjp0LmFsdEtleT90aGlzLl90b2dnbGUodCk6dGhpcy5fbW92ZSgibmV4dCIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuU1BBQ0U6dGhpcy5pc09wZW4/dGhpcy5fc2VsZWN0Rm9jdXNlZEl0ZW0odCk6dGhpcy5fdG9nZ2xlKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkxFRlQ6dGhpcy5fbW92ZSgicHJldiIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuUklHSFQ6dGhpcy5fbW92ZSgibmV4dCIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuSE9NRTpjYXNlIGUudWkua2V5Q29kZS5QQUdFX1VQOnRoaXMuX21vdmUoImZpcnN0Iix0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5FTkQ6Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9ET1dOOnRoaXMuX21vdmUoImxhc3QiLHQpO2JyZWFrO2RlZmF1bHQ6dGhpcy5tZW51LnRyaWdnZXIodCksaT0hMX1pJiZ0LnByZXZlbnREZWZhdWx0KCl9fSxfc2VsZWN0Rm9jdXNlZEl0ZW06ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5tZW51SXRlbXMuZXEodGhpcy5mb2N1c0luZGV4KTt0Lmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpfHx0aGlzLl9zZWxlY3QodC5kYXRhKCJ1aS1zZWxlY3RtZW51LWl0ZW0iKSxlKX0sX3NlbGVjdDpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuZWxlbWVudFswXS5zZWxlY3RlZEluZGV4O3RoaXMuZWxlbWVudFswXS5zZWxlY3RlZEluZGV4PWUuaW5kZXgsdGhpcy5fc2V0VGV4dCh0aGlzLmJ1dHRvblRleHQsZS5sYWJlbCksdGhpcy5fc2V0QXJpYShlKSx0aGlzLl90cmlnZ2VyKCJzZWxlY3QiLHQse2l0ZW06ZX0pLGUuaW5kZXghPT1pJiZ0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLHQse2l0ZW06ZX0pLHRoaXMuY2xvc2UodCl9LF9zZXRBcmlhOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubWVudUl0ZW1zLmVxKGUuaW5kZXgpLmF0dHIoImlkIik7dGhpcy5idXR0b24uYXR0cih7ImFyaWEtbGFiZWxsZWRieSI6dCwiYXJpYS1hY3RpdmVkZXNjZW5kYW50Ijp0fSksdGhpcy5tZW51LmF0dHIoImFyaWEtYWN0aXZlZGVzY2VuZGFudCIsdCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXsiaWNvbnMiPT09ZSYmdGhpcy5idXR0b24uZmluZCgic3Bhbi51aS1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmljb25zLmJ1dHRvbikuYWRkQ2xhc3ModC5idXR0b24pLHRoaXMuX3N1cGVyKGUsdCksImFwcGVuZFRvIj09PWUmJnRoaXMubWVudVdyYXAuYXBwZW5kVG8odGhpcy5fYXBwZW5kVG8oKSksImRpc2FibGVkIj09PWUmJih0aGlzLm1lbnVJbnN0YW5jZS5vcHRpb24oImRpc2FibGVkIix0KSx0aGlzLmJ1dHRvbi50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLHQpLmF0dHIoImFyaWEtZGlzYWJsZWQiLHQpLHRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsdCksdD8odGhpcy5idXR0b24uYXR0cigidGFiaW5kZXgiLC0xKSx0aGlzLmNsb3NlKCkpOnRoaXMuYnV0dG9uLmF0dHIoInRhYmluZGV4IiwwKSksIndpZHRoIj09PWUmJnRoaXMuX3Jlc2l6ZUJ1dHRvbigpfSxfYXBwZW5kVG86ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuYXBwZW5kVG87cmV0dXJuIHQmJih0PXQuanF1ZXJ5fHx0Lm5vZGVUeXBlP2UodCk6dGhpcy5kb2N1bWVudC5maW5kKHQpLmVxKDApKSx0JiZ0WzBdfHwodD10aGlzLmVsZW1lbnQuY2xvc2VzdCgiLnVpLWZyb250IikpLHQubGVuZ3RofHwodD10aGlzLmRvY3VtZW50WzBdLmJvZHkpLHR9LF90b2dnbGVBdHRyOmZ1bmN0aW9uKCl7dGhpcy5idXR0b24udG9nZ2xlQ2xhc3MoInVpLWNvcm5lci10b3AiLHRoaXMuaXNPcGVuKS50b2dnbGVDbGFzcygidWktY29ybmVyLWFsbCIsIXRoaXMuaXNPcGVuKS5hdHRyKCJhcmlhLWV4cGFuZGVkIix0aGlzLmlzT3BlbiksdGhpcy5tZW51V3JhcC50b2dnbGVDbGFzcygidWktc2VsZWN0bWVudS1vcGVuIix0aGlzLmlzT3BlbiksdGhpcy5tZW51LmF0dHIoImFyaWEtaGlkZGVuIiwhdGhpcy5pc09wZW4pfSxfcmVzaXplQnV0dG9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zLndpZHRoO2V8fChlPXRoaXMuZWxlbWVudC5zaG93KCkub3V0ZXJXaWR0aCgpLHRoaXMuZWxlbWVudC5oaWRlKCkpLHRoaXMuYnV0dG9uLm91dGVyV2lkdGgoZSl9LF9yZXNpemVNZW51OmZ1bmN0aW9uKCl7dGhpcy5tZW51Lm91dGVyV2lkdGgoTWF0aC5tYXgodGhpcy5idXR0b24ub3V0ZXJXaWR0aCgpLHRoaXMubWVudS53aWR0aCgiIikub3V0ZXJXaWR0aCgpKzEpKX0sX2dldENyZWF0ZU9wdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm57ZGlzYWJsZWQ6dGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIil9fSxfcGFyc2VPcHRpb25zOmZ1bmN0aW9uKHQpe3ZhciBpPVtdO3QuZWFjaChmdW5jdGlvbih0LHMpe3ZhciBuPWUocyksYT1uLnBhcmVudCgib3B0Z3JvdXAiKTtpLnB1c2goe2VsZW1lbnQ6bixpbmRleDp0LHZhbHVlOm4udmFsKCksbGFiZWw6bi50ZXh0KCksb3B0Z3JvdXA6YS5hdHRyKCJsYWJlbCIpfHwiIixkaXNhYmxlZDphLnByb3AoImRpc2FibGVkIil8fG4ucHJvcCgiZGlzYWJsZWQiKX0pfSksdGhpcy5pdGVtcz1pfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMubWVudVdyYXAucmVtb3ZlKCksdGhpcy5idXR0b24ucmVtb3ZlKCksdGhpcy5lbGVtZW50LnNob3coKSx0aGlzLmVsZW1lbnQucmVtb3ZlVW5pcXVlSWQoKSx0aGlzLmxhYmVsLmF0dHIoImZvciIsdGhpcy5pZHMuZWxlbWVudCl9fSksZS53aWRnZXQoInVpLnNsaWRlciIsZS51aS5tb3VzZSx7dmVyc2lvbjoiMS4xMS40Iix3aWRnZXRFdmVudFByZWZpeDoic2xpZGUiLG9wdGlvbnM6e2FuaW1hdGU6ITEsZGlzdGFuY2U6MCxtYXg6MTAwLG1pbjowLG9yaWVudGF0aW9uOiJob3Jpem9udGFsIixyYW5nZTohMSxzdGVwOjEsdmFsdWU6MCx2YWx1ZXM6bnVsbCxjaGFuZ2U6bnVsbCxzbGlkZTpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsfSxudW1QYWdlczo1LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLl9rZXlTbGlkaW5nPSExLHRoaXMuX21vdXNlU2xpZGluZz0hMSx0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX2hhbmRsZUluZGV4PW51bGwsdGhpcy5fZGV0ZWN0T3JpZW50YXRpb24oKSx0aGlzLl9tb3VzZUluaXQoKSx0aGlzLl9jYWxjdWxhdGVOZXdNYXgoKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNsaWRlciB1aS1zbGlkZXItIit0aGlzLm9yaWVudGF0aW9uKyIgdWktd2lkZ2V0IisiIHVpLXdpZGdldC1jb250ZW50IisiIHVpLWNvcm5lci1hbGwiKSx0aGlzLl9yZWZyZXNoKCksdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsdGhpcy5vcHRpb25zLmRpc2FibGVkKSx0aGlzLl9hbmltYXRlT2ZmPSExfSxfcmVmcmVzaDpmdW5jdGlvbigpe3RoaXMuX2NyZWF0ZVJhbmdlKCksdGhpcy5fY3JlYXRlSGFuZGxlcygpLHRoaXMuX3NldHVwRXZlbnRzKCksdGhpcy5fcmVmcmVzaFZhbHVlKCl9LF9jcmVhdGVIYW5kbGVzOmZ1bmN0aW9uKCl7dmFyIHQsaSxzPXRoaXMub3B0aW9ucyxuPXRoaXMuZWxlbWVudC5maW5kKCIudWktc2xpZGVyLWhhbmRsZSIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKSxhPSI8c3BhbiBjbGFzcz0ndWktc2xpZGVyLWhhbmRsZSB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwnIHRhYmluZGV4PScwJz48L3NwYW4+IixvPVtdO2ZvcihpPXMudmFsdWVzJiZzLnZhbHVlcy5sZW5ndGh8fDEsbi5sZW5ndGg+aSYmKG4uc2xpY2UoaSkucmVtb3ZlKCksbj1uLnNsaWNlKDAsaSkpLHQ9bi5sZW5ndGg7aT50O3QrKylvLnB1c2goYSk7dGhpcy5oYW5kbGVzPW4uYWRkKGUoby5qb2luKCIiKSkuYXBwZW5kVG8odGhpcy5lbGVtZW50KSksdGhpcy5oYW5kbGU9dGhpcy5oYW5kbGVzLmVxKDApLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKHQpe2UodGhpcykuZGF0YSgidWktc2xpZGVyLWhhbmRsZS1pbmRleCIsdCl9KX0sX2NyZWF0ZVJhbmdlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLGk9IiI7dC5yYW5nZT8odC5yYW5nZT09PSEwJiYodC52YWx1ZXM/dC52YWx1ZXMubGVuZ3RoJiYyIT09dC52YWx1ZXMubGVuZ3RoP3QudmFsdWVzPVt0LnZhbHVlc1swXSx0LnZhbHVlc1swXV06ZS5pc0FycmF5KHQudmFsdWVzKSYmKHQudmFsdWVzPXQudmFsdWVzLnNsaWNlKDApKTp0LnZhbHVlcz1bdGhpcy5fdmFsdWVNaW4oKSx0aGlzLl92YWx1ZU1pbigpXSksdGhpcy5yYW5nZSYmdGhpcy5yYW5nZS5sZW5ndGg/dGhpcy5yYW5nZS5yZW1vdmVDbGFzcygidWktc2xpZGVyLXJhbmdlLW1pbiB1aS1zbGlkZXItcmFuZ2UtbWF4IikuY3NzKHtsZWZ0OiIiLGJvdHRvbToiIn0pOih0aGlzLnJhbmdlPWUoIjxkaXY+PC9kaXY+IikuYXBwZW5kVG8odGhpcy5lbGVtZW50KSxpPSJ1aS1zbGlkZXItcmFuZ2UgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIiksdGhpcy5yYW5nZS5hZGRDbGFzcyhpKygibWluIj09PXQucmFuZ2V8fCJtYXgiPT09dC5yYW5nZT8iIHVpLXNsaWRlci1yYW5nZS0iK3QucmFuZ2U6IiIpKSk6KHRoaXMucmFuZ2UmJnRoaXMucmFuZ2UucmVtb3ZlKCksdGhpcy5yYW5nZT1udWxsKX0sX3NldHVwRXZlbnRzOmZ1bmN0aW9uKCl7dGhpcy5fb2ZmKHRoaXMuaGFuZGxlcyksdGhpcy5fb24odGhpcy5oYW5kbGVzLHRoaXMuX2hhbmRsZUV2ZW50cyksdGhpcy5faG92ZXJhYmxlKHRoaXMuaGFuZGxlcyksdGhpcy5fZm9jdXNhYmxlKHRoaXMuaGFuZGxlcyl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVzLnJlbW92ZSgpLHRoaXMucmFuZ2UmJnRoaXMucmFuZ2UucmVtb3ZlKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zbGlkZXIgdWktc2xpZGVyLWhvcml6b250YWwgdWktc2xpZGVyLXZlcnRpY2FsIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiksdGhpcy5fbW91c2VEZXN0cm95KCl9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24odCl7dmFyIGkscyxuLGEsbyxyLGgsbCx1PXRoaXMsZD10aGlzLm9wdGlvbnM7cmV0dXJuIGQuZGlzYWJsZWQ/ITE6KHRoaXMuZWxlbWVudFNpemU9e3dpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpfSx0aGlzLmVsZW1lbnRPZmZzZXQ9dGhpcy5lbGVtZW50Lm9mZnNldCgpLGk9e3g6dC5wYWdlWCx5OnQucGFnZVl9LHM9dGhpcy5fbm9ybVZhbHVlRnJvbU1vdXNlKGkpLG49dGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpKzEsdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24odCl7dmFyIGk9TWF0aC5hYnMocy11LnZhbHVlcyh0KSk7KG4+aXx8bj09PWkmJih0PT09dS5fbGFzdENoYW5nZWRWYWx1ZXx8dS52YWx1ZXModCk9PT1kLm1pbikpJiYobj1pLGE9ZSh0aGlzKSxvPXQpfSkscj10aGlzLl9zdGFydCh0LG8pLHI9PT0hMT8hMToodGhpcy5fbW91c2VTbGlkaW5nPSEwLHRoaXMuX2hhbmRsZUluZGV4PW8sYS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIikuZm9jdXMoKSxoPWEub2Zmc2V0KCksbD0hZSh0LnRhcmdldCkucGFyZW50cygpLmFkZEJhY2soKS5pcygiLnVpLXNsaWRlci1oYW5kbGUiKSx0aGlzLl9jbGlja09mZnNldD1sP3tsZWZ0OjAsdG9wOjB9OntsZWZ0OnQucGFnZVgtaC5sZWZ0LWEud2lkdGgoKS8yLHRvcDp0LnBhZ2VZLWgudG9wLWEuaGVpZ2h0KCkvMi0ocGFyc2VJbnQoYS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYS5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoYS5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MCl9LHRoaXMuaGFuZGxlcy5oYXNDbGFzcygidWktc3RhdGUtaG92ZXIiKXx8dGhpcy5fc2xpZGUodCxvLHMpLHRoaXMuX2FuaW1hdGVPZmY9ITAsITApKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sX21vdXNlRHJhZzpmdW5jdGlvbihlKXt2YXIgdD17eDplLnBhZ2VYLHk6ZS5wYWdlWX0saT10aGlzLl9ub3JtVmFsdWVGcm9tTW91c2UodCk7cmV0dXJuIHRoaXMuX3NsaWRlKGUsdGhpcy5faGFuZGxlSW5kZXgsaSksITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaGFuZGxlcy5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdGhpcy5fbW91c2VTbGlkaW5nPSExLHRoaXMuX3N0b3AoZSx0aGlzLl9oYW5kbGVJbmRleCksdGhpcy5fY2hhbmdlKGUsdGhpcy5faGFuZGxlSW5kZXgpLHRoaXMuX2hhbmRsZUluZGV4PW51bGwsdGhpcy5fY2xpY2tPZmZzZXQ9bnVsbCx0aGlzLl9hbmltYXRlT2ZmPSExLCExfSxfZGV0ZWN0T3JpZW50YXRpb246ZnVuY3Rpb24oKXt0aGlzLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI9PT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9LF9ub3JtVmFsdWVGcm9tTW91c2U6ZnVuY3Rpb24oZSl7dmFyIHQsaSxzLG4sYTtyZXR1cm4iaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uPyh0PXRoaXMuZWxlbWVudFNpemUud2lkdGgsaT1lLngtdGhpcy5lbGVtZW50T2Zmc2V0LmxlZnQtKHRoaXMuX2NsaWNrT2Zmc2V0P3RoaXMuX2NsaWNrT2Zmc2V0LmxlZnQ6MCkpOih0PXRoaXMuZWxlbWVudFNpemUuaGVpZ2h0LGk9ZS55LXRoaXMuZWxlbWVudE9mZnNldC50b3AtKHRoaXMuX2NsaWNrT2Zmc2V0P3RoaXMuX2NsaWNrT2Zmc2V0LnRvcDowKSkscz1pL3Qscz4xJiYocz0xKSwwPnMmJihzPTApLCJ2ZXJ0aWNhbCI9PT10aGlzLm9yaWVudGF0aW9uJiYocz0xLXMpLG49dGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpLGE9dGhpcy5fdmFsdWVNaW4oKStzKm4sdGhpcy5fdHJpbUFsaWduVmFsdWUoYSl9LF9zdGFydDpmdW5jdGlvbihlLHQpe3ZhciBpPXtoYW5kbGU6dGhpcy5oYW5kbGVzW3RdLHZhbHVlOnRoaXMudmFsdWUoKX07cmV0dXJuIHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYoaS52YWx1ZT10aGlzLnZhbHVlcyh0KSxpLnZhbHVlcz10aGlzLnZhbHVlcygpKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsZSxpKX0sX3NsaWRlOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcyxuLGE7dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/KHM9dGhpcy52YWx1ZXModD8wOjEpLDI9PT10aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCYmdGhpcy5vcHRpb25zLnJhbmdlPT09ITAmJigwPT09dCYmaT5zfHwxPT09dCYmcz5pKSYmKGk9cyksaSE9PXRoaXMudmFsdWVzKHQpJiYobj10aGlzLnZhbHVlcygpLG5bdF09aSxhPXRoaXMuX3RyaWdnZXIoInNsaWRlIixlLHtoYW5kbGU6dGhpcy5oYW5kbGVzW3RdLHZhbHVlOmksdmFsdWVzOm59KSxzPXRoaXMudmFsdWVzKHQ/MDoxKSxhIT09ITEmJnRoaXMudmFsdWVzKHQsaSkpKTppIT09dGhpcy52YWx1ZSgpJiYoYT10aGlzLl90cmlnZ2VyKCJzbGlkZSIsZSx7aGFuZGxlOnRoaXMuaGFuZGxlc1t0XSx2YWx1ZTppfSksYSE9PSExJiZ0aGlzLnZhbHVlKGkpKX0sX3N0b3A6ZnVuY3Rpb24oZSx0KXt2YXIgaT17aGFuZGxlOnRoaXMuaGFuZGxlc1t0XSx2YWx1ZTp0aGlzLnZhbHVlKCl9O3RoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYoaS52YWx1ZT10aGlzLnZhbHVlcyh0KSxpLnZhbHVlcz10aGlzLnZhbHVlcygpKSx0aGlzLl90cmlnZ2VyKCJzdG9wIixlLGkpfSxfY2hhbmdlOmZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuX2tleVNsaWRpbmcmJiF0aGlzLl9tb3VzZVNsaWRpbmcpe3ZhciBpPXtoYW5kbGU6dGhpcy5oYW5kbGVzW3RdLHZhbHVlOnRoaXMudmFsdWUoKX07dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJihpLnZhbHVlPXRoaXMudmFsdWVzKHQpLGkudmFsdWVzPXRoaXMudmFsdWVzKCkpLHRoaXMuX2xhc3RDaGFuZ2VkVmFsdWU9dCx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLGUsaSl9fSx2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX3RyaW1BbGlnblZhbHVlKGUpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX2NoYW5nZShudWxsLDApLHZvaWQgMCk6dGhpcy5fdmFsdWUoKX0sdmFsdWVzOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlc1t0XT10aGlzLl90cmltQWxpZ25WYWx1ZShpKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCx0KSx2b2lkIDA7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3ZhbHVlcygpO2lmKCFlLmlzQXJyYXkoYXJndW1lbnRzWzBdKSlyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/dGhpcy5fdmFsdWVzKHQpOnRoaXMudmFsdWUoKTtmb3Iocz10aGlzLm9wdGlvbnMudmFsdWVzLG49YXJndW1lbnRzWzBdLGE9MDtzLmxlbmd0aD5hO2ErPTEpc1thXT10aGlzLl90cmltQWxpZ25WYWx1ZShuW2FdKSx0aGlzLl9jaGFuZ2UobnVsbCxhKTt0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX3NldE9wdGlvbjpmdW5jdGlvbih0LGkpe3ZhciBzLG49MDtzd2l0Y2goInJhbmdlIj09PXQmJnRoaXMub3B0aW9ucy5yYW5nZT09PSEwJiYoIm1pbiI9PT1pPyh0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fdmFsdWVzKDApLHRoaXMub3B0aW9ucy52YWx1ZXM9bnVsbCk6Im1heCI9PT1pJiYodGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX3ZhbHVlcyh0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aC0xKSx0aGlzLm9wdGlvbnMudmFsdWVzPW51bGwpKSxlLmlzQXJyYXkodGhpcy5vcHRpb25zLnZhbHVlcykmJihuPXRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoKSwiZGlzYWJsZWQiPT09dCYmdGhpcy5lbGVtZW50LnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIsISFpKSx0aGlzLl9zdXBlcih0LGkpLHQpe2Nhc2Uib3JpZW50YXRpb24iOnRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zbGlkZXItaG9yaXpvbnRhbCB1aS1zbGlkZXItdmVydGljYWwiKS5hZGRDbGFzcygidWktc2xpZGVyLSIrdGhpcy5vcmllbnRhdGlvbiksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5oYW5kbGVzLmNzcygiaG9yaXpvbnRhbCI9PT1pPyJib3R0b20iOiJsZWZ0IiwiIik7YnJlYWs7Y2FzZSJ2YWx1ZSI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKSx0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2UidmFsdWVzIjpmb3IodGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSxzPTA7bj5zO3MrPTEpdGhpcy5fY2hhbmdlKG51bGwscyk7dGhpcy5fYW5pbWF0ZU9mZj0hMTticmVhaztjYXNlInN0ZXAiOmNhc2UibWluIjpjYXNlIm1heCI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9jYWxjdWxhdGVOZXdNYXgoKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2UicmFuZ2UiOnRoaXMuX2FuaW1hdGVPZmY9ITAsdGhpcy5fcmVmcmVzaCgpLHRoaXMuX2FuaW1hdGVPZmY9ITF9fSxfdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnMudmFsdWU7cmV0dXJuIGU9dGhpcy5fdHJpbUFsaWduVmFsdWUoZSl9LF92YWx1ZXM6ZnVuY3Rpb24oZSl7dmFyIHQsaSxzO2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQ9dGhpcy5vcHRpb25zLnZhbHVlc1tlXSx0PXRoaXMuX3RyaW1BbGlnblZhbHVlKHQpO2lmKHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoKXtmb3IoaT10aGlzLm9wdGlvbnMudmFsdWVzLnNsaWNlKCkscz0wO2kubGVuZ3RoPnM7cys9MSlpW3NdPXRoaXMuX3RyaW1BbGlnblZhbHVlKGlbc10pO3JldHVybiBpfXJldHVybltdfSxfdHJpbUFsaWduVmFsdWU6ZnVuY3Rpb24oZSl7aWYodGhpcy5fdmFsdWVNaW4oKT49ZSlyZXR1cm4gdGhpcy5fdmFsdWVNaW4oKTtpZihlPj10aGlzLl92YWx1ZU1heCgpKXJldHVybiB0aGlzLl92YWx1ZU1heCgpO3ZhciB0PXRoaXMub3B0aW9ucy5zdGVwPjA/dGhpcy5vcHRpb25zLnN0ZXA6MSxpPShlLXRoaXMuX3ZhbHVlTWluKCkpJXQscz1lLWk7cmV0dXJuIDIqTWF0aC5hYnMoaSk+PXQmJihzKz1pPjA/dDotdCkscGFyc2VGbG9hdChzLnRvRml4ZWQoNSkpfSxfY2FsY3VsYXRlTmV3TWF4OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zLm1heCx0PXRoaXMuX3ZhbHVlTWluKCksaT10aGlzLm9wdGlvbnMuc3RlcCxzPU1hdGguZmxvb3IoKyhlLXQpLnRvRml4ZWQodGhpcy5fcHJlY2lzaW9uKCkpL2kpKmk7ZT1zK3QsdGhpcy5tYXg9cGFyc2VGbG9hdChlLnRvRml4ZWQodGhpcy5fcHJlY2lzaW9uKCkpKX0sX3ByZWNpc2lvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3ByZWNpc2lvbk9mKHRoaXMub3B0aW9ucy5zdGVwKTtyZXR1cm4gbnVsbCE9PXRoaXMub3B0aW9ucy5taW4mJihlPU1hdGgubWF4KGUsdGhpcy5fcHJlY2lzaW9uT2YodGhpcy5vcHRpb25zLm1pbikpKSxlfSxfcHJlY2lzaW9uT2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9IiIrZSxpPXQuaW5kZXhPZigiLiIpO3JldHVybi0xPT09aT8wOnQubGVuZ3RoLWktMX0sX3ZhbHVlTWluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5taW59LF92YWx1ZU1heDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heH0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciB0LGkscyxuLGEsbz10aGlzLm9wdGlvbnMucmFuZ2Uscj10aGlzLm9wdGlvbnMsaD10aGlzLGw9dGhpcy5fYW5pbWF0ZU9mZj8hMTpyLmFuaW1hdGUsdT17fTt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD90aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbihzKXtpPTEwMCooKGgudmFsdWVzKHMpLWguX3ZhbHVlTWluKCkpLyhoLl92YWx1ZU1heCgpLWguX3ZhbHVlTWluKCkpKSx1WyJob3Jpem9udGFsIj09PWgub3JpZW50YXRpb24/ImxlZnQiOiJib3R0b20iXT1pKyIlIixlKHRoaXMpLnN0b3AoMSwxKVtsPyJhbmltYXRlIjoiY3NzIl0odSxyLmFuaW1hdGUpLGgub3B0aW9ucy5yYW5nZT09PSEwJiYoImhvcml6b250YWwiPT09aC5vcmllbnRhdGlvbj8oMD09PXMmJmgucmFuZ2Uuc3RvcCgxLDEpW2w/ImFuaW1hdGUiOiJjc3MiXSh7bGVmdDppKyIlIn0sci5hbmltYXRlKSwxPT09cyYmaC5yYW5nZVtsPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOmktdCsiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpyLmFuaW1hdGV9KSk6KDA9PT1zJiZoLnJhbmdlLnN0b3AoMSwxKVtsPyJhbmltYXRlIjoiY3NzIl0oe2JvdHRvbTppKyIlIn0sci5hbmltYXRlKSwxPT09cyYmaC5yYW5nZVtsPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDppLXQrIiUifSx7cXVldWU6ITEsZHVyYXRpb246ci5hbmltYXRlfSkpKSx0PWl9KToocz10aGlzLnZhbHVlKCksbj10aGlzLl92YWx1ZU1pbigpLGE9dGhpcy5fdmFsdWVNYXgoKSxpPWEhPT1uPzEwMCooKHMtbikvKGEtbikpOjAsdVsiaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uPyJsZWZ0IjoiYm90dG9tIl09aSsiJSIsdGhpcy5oYW5kbGUuc3RvcCgxLDEpW2w/ImFuaW1hdGUiOiJjc3MiXSh1LHIuYW5pbWF0ZSksIm1pbiI9PT1vJiYiaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uJiZ0aGlzLnJhbmdlLnN0b3AoMSwxKVtsPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOmkrIiUifSxyLmFuaW1hdGUpLCJtYXgiPT09byYmImhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbiYmdGhpcy5yYW5nZVtsPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOjEwMC1pKyIlIn0se3F1ZXVlOiExLGR1cmF0aW9uOnIuYW5pbWF0ZX0pLCJtaW4iPT09byYmInZlcnRpY2FsIj09PXRoaXMub3JpZW50YXRpb24mJnRoaXMucmFuZ2Uuc3RvcCgxLDEpW2w/ImFuaW1hdGUiOiJjc3MiXSh7aGVpZ2h0OmkrIiUifSxyLmFuaW1hdGUpLCJtYXgiPT09byYmInZlcnRpY2FsIj09PXRoaXMub3JpZW50YXRpb24mJnRoaXMucmFuZ2VbbD8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6MTAwLWkrIiUifSx7cXVldWU6ITEsZHVyYXRpb246ci5hbmltYXRlfSkpfSxfaGFuZGxlRXZlbnRzOntrZXlkb3duOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhLG89ZSh0LnRhcmdldCkuZGF0YSgidWktc2xpZGVyLWhhbmRsZS1pbmRleCIpO3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6Y2FzZSBlLnVpLmtleUNvZGUuRU5EOmNhc2UgZS51aS5rZXlDb2RlLlBBR0VfVVA6Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9ET1dOOmNhc2UgZS51aS5rZXlDb2RlLlVQOmNhc2UgZS51aS5rZXlDb2RlLlJJR0hUOmNhc2UgZS51aS5rZXlDb2RlLkRPV046Y2FzZSBlLnVpLmtleUNvZGUuTEVGVDppZih0LnByZXZlbnREZWZhdWx0KCksIXRoaXMuX2tleVNsaWRpbmcmJih0aGlzLl9rZXlTbGlkaW5nPSEwLGUodC50YXJnZXQpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSxpPXRoaXMuX3N0YXJ0KHQsbyksaT09PSExKSlyZXR1cm59c3dpdGNoKGE9dGhpcy5vcHRpb25zLnN0ZXAscz1uPXRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoP3RoaXMudmFsdWVzKG8pOnRoaXMudmFsdWUoKSx0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6bj10aGlzLl92YWx1ZU1pbigpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkVORDpuPXRoaXMuX3ZhbHVlTWF4KCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9VUDpuPXRoaXMuX3RyaW1BbGlnblZhbHVlKHMrKHRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSkvdGhpcy5udW1QYWdlcyk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9ET1dOOm49dGhpcy5fdHJpbUFsaWduVmFsdWUocy0odGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpKS90aGlzLm51bVBhZ2VzKTticmVhaztjYXNlIGUudWkua2V5Q29kZS5VUDpjYXNlIGUudWkua2V5Q29kZS5SSUdIVDppZihzPT09dGhpcy5fdmFsdWVNYXgoKSlyZXR1cm47bj10aGlzLl90cmltQWxpZ25WYWx1ZShzK2EpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkRPV046Y2FzZSBlLnVpLmtleUNvZGUuTEVGVDppZihzPT09dGhpcy5fdmFsdWVNaW4oKSlyZXR1cm47bj10aGlzLl90cmltQWxpZ25WYWx1ZShzLWEpfXRoaXMuX3NsaWRlKHQsbyxuKX0sa2V5dXA6ZnVuY3Rpb24odCl7dmFyIGk9ZSh0LnRhcmdldCkuZGF0YSgidWktc2xpZGVyLWhhbmRsZS1pbmRleCIpO3RoaXMuX2tleVNsaWRpbmcmJih0aGlzLl9rZXlTbGlkaW5nPSExLHRoaXMuX3N0b3AodCxpKSx0aGlzLl9jaGFuZ2UodCxpKSxlKHQudGFyZ2V0KS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikpfX19KSxlLndpZGdldCgidWkuc3Bpbm5lciIse3ZlcnNpb246IjEuMTEuNCIsZGVmYXVsdEVsZW1lbnQ6IjxpbnB1dD4iLHdpZGdldEV2ZW50UHJlZml4OiJzcGluIixvcHRpb25zOntjdWx0dXJlOm51bGwsaWNvbnM6e2Rvd246InVpLWljb24tdHJpYW5nbGUtMS1zIix1cDoidWktaWNvbi10cmlhbmdsZS0xLW4ifSxpbmNyZW1lbnRhbDohMCxtYXg6bnVsbCxtaW46bnVsbCxudW1iZXJGb3JtYXQ6bnVsbCxwYWdlOjEwLHN0ZXA6MSxjaGFuZ2U6bnVsbCxzcGluOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLl9zZXRPcHRpb24oIm1heCIsdGhpcy5vcHRpb25zLm1heCksdGhpcy5fc2V0T3B0aW9uKCJtaW4iLHRoaXMub3B0aW9ucy5taW4pLHRoaXMuX3NldE9wdGlvbigic3RlcCIsdGhpcy5vcHRpb25zLnN0ZXApLCIiIT09dGhpcy52YWx1ZSgpJiZ0aGlzLl92YWx1ZSh0aGlzLmVsZW1lbnQudmFsKCksITApLHRoaXMuX2RyYXcoKSx0aGlzLl9vbih0aGlzLl9ldmVudHMpLHRoaXMuX3JlZnJlc2goKSx0aGlzLl9vbih0aGlzLndpbmRvdyx7YmVmb3JldW5sb2FkOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoImF1dG9jb21wbGV0ZSIpfX0pfSxfZ2V0Q3JlYXRlT3B0aW9uczpmdW5jdGlvbigpe3ZhciB0PXt9LGk9dGhpcy5lbGVtZW50O3JldHVybiBlLmVhY2goWyJtaW4iLCJtYXgiLCJzdGVwIl0sZnVuY3Rpb24oZSxzKXt2YXIgbj1pLmF0dHIocyk7dm9pZCAwIT09biYmbi5sZW5ndGgmJih0W3NdPW4pfSksdH0sX2V2ZW50czp7a2V5ZG93bjpmdW5jdGlvbihlKXt0aGlzLl9zdGFydChlKSYmdGhpcy5fa2V5ZG93bihlKSYmZS5wcmV2ZW50RGVmYXVsdCgpfSxrZXl1cDoiX3N0b3AiLGZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5wcmV2aW91cz10aGlzLmVsZW1lbnQudmFsKCl9LGJsdXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2FuY2VsQmx1cj8oZGVsZXRlIHRoaXMuY2FuY2VsQmx1cix2b2lkIDApOih0aGlzLl9zdG9wKCksdGhpcy5fcmVmcmVzaCgpLHRoaXMucHJldmlvdXMhPT10aGlzLmVsZW1lbnQudmFsKCkmJnRoaXMuX3RyaWdnZXIoImNoYW5nZSIsZSksdm9pZCAwKX0sbW91c2V3aGVlbDpmdW5jdGlvbihlLHQpe2lmKHQpe2lmKCF0aGlzLnNwaW5uaW5nJiYhdGhpcy5fc3RhcnQoZSkpcmV0dXJuITE7dGhpcy5fc3BpbigodD4wPzE6LTEpKnRoaXMub3B0aW9ucy5zdGVwLGUpLGNsZWFyVGltZW91dCh0aGlzLm1vdXNld2hlZWxUaW1lciksdGhpcy5tb3VzZXdoZWVsVGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLnNwaW5uaW5nJiZ0aGlzLl9zdG9wKGUpfSwxMDApLGUucHJldmVudERlZmF1bHQoKX19LCJtb3VzZWRvd24gLnVpLXNwaW5uZXItYnV0dG9uIjpmdW5jdGlvbih0KXtmdW5jdGlvbiBpKCl7dmFyIGU9dGhpcy5lbGVtZW50WzBdPT09dGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50O2V8fCh0aGlzLmVsZW1lbnQuZm9jdXMoKSx0aGlzLnByZXZpb3VzPXMsdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLnByZXZpb3VzPXN9KSl9dmFyIHM7cz10aGlzLmVsZW1lbnRbMF09PT10aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQ/dGhpcy5wcmV2aW91czp0aGlzLmVsZW1lbnQudmFsKCksdC5wcmV2ZW50RGVmYXVsdCgpLGkuY2FsbCh0aGlzKSx0aGlzLmNhbmNlbEJsdXI9ITAsdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5jYW5jZWxCbHVyLGkuY2FsbCh0aGlzKX0pLHRoaXMuX3N0YXJ0KHQpIT09ITEmJnRoaXMuX3JlcGVhdChudWxsLGUodC5jdXJyZW50VGFyZ2V0KS5oYXNDbGFzcygidWktc3Bpbm5lci11cCIpPzE6LTEsdCl9LCJtb3VzZXVwIC51aS1zcGlubmVyLWJ1dHRvbiI6Il9zdG9wIiwibW91c2VlbnRlciAudWktc3Bpbm5lci1idXR0b24iOmZ1bmN0aW9uKHQpe3JldHVybiBlKHQuY3VycmVudFRhcmdldCkuaGFzQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpP3RoaXMuX3N0YXJ0KHQpPT09ITE/ITE6KHRoaXMuX3JlcGVhdChudWxsLGUodC5jdXJyZW50VGFyZ2V0KS5oYXNDbGFzcygidWktc3Bpbm5lci11cCIpPzE6LTEsdCksdm9pZCAwKTp2b2lkIDB9LCJtb3VzZWxlYXZlIC51aS1zcGlubmVyLWJ1dHRvbiI6Il9zdG9wIn0sX2RyYXc6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnVpU3Bpbm5lcj10aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNwaW5uZXItaW5wdXQiKS5hdHRyKCJhdXRvY29tcGxldGUiLCJvZmYiKS53cmFwKHRoaXMuX3VpU3Bpbm5lckh0bWwoKSkucGFyZW50KCkuYXBwZW5kKHRoaXMuX2J1dHRvbkh0bWwoKSk7dGhpcy5lbGVtZW50LmF0dHIoInJvbGUiLCJzcGluYnV0dG9uIiksdGhpcy5idXR0b25zPWUuZmluZCgiLnVpLXNwaW5uZXItYnV0dG9uIikuYXR0cigidGFiSW5kZXgiLC0xKS5idXR0b24oKS5yZW1vdmVDbGFzcygidWktY29ybmVyLWFsbCIpLHRoaXMuYnV0dG9ucy5oZWlnaHQoKT5NYXRoLmNlaWwoLjUqZS5oZWlnaHQoKSkmJmUuaGVpZ2h0KCk+MCYmZS5oZWlnaHQoZS5oZWlnaHQoKSksdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLmRpc2FibGUoKX0sX2tleWRvd246ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5vcHRpb25zLHM9ZS51aS5rZXlDb2RlO3N3aXRjaCh0LmtleUNvZGUpe2Nhc2Ugcy5VUDpyZXR1cm4gdGhpcy5fcmVwZWF0KG51bGwsMSx0KSwhMDtjYXNlIHMuRE9XTjpyZXR1cm4gdGhpcy5fcmVwZWF0KG51bGwsLTEsdCksITA7Y2FzZSBzLlBBR0VfVVA6cmV0dXJuIHRoaXMuX3JlcGVhdChudWxsLGkucGFnZSx0KSwhMDtjYXNlIHMuUEFHRV9ET1dOOnJldHVybiB0aGlzLl9yZXBlYXQobnVsbCwtaS5wYWdlLHQpLCEwfXJldHVybiExfSxfdWlTcGlubmVySHRtbDpmdW5jdGlvbigpe3JldHVybiI8c3BhbiBjbGFzcz0ndWktc3Bpbm5lciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCc+PC9zcGFuPiJ9LF9idXR0b25IdG1sOmZ1bmN0aW9uKCl7cmV0dXJuIjxhIGNsYXNzPSd1aS1zcGlubmVyLWJ1dHRvbiB1aS1zcGlubmVyLXVwIHVpLWNvcm5lci10cic+PHNwYW4gY2xhc3M9J3VpLWljb24gIit0aGlzLm9wdGlvbnMuaWNvbnMudXArIic+JiM5NjUwOzwvc3Bhbj4iKyI8L2E+IisiPGEgY2xhc3M9J3VpLXNwaW5uZXItYnV0dG9uIHVpLXNwaW5uZXItZG93biB1aS1jb3JuZXItYnInPiIrIjxzcGFuIGNsYXNzPSd1aS1pY29uICIrdGhpcy5vcHRpb25zLmljb25zLmRvd24rIic+JiM5NjYwOzwvc3Bhbj4iKyI8L2E+In0sX3N0YXJ0OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnNwaW5uaW5nfHx0aGlzLl90cmlnZ2VyKCJzdGFydCIsZSkhPT0hMT8odGhpcy5jb3VudGVyfHwodGhpcy5jb3VudGVyPTEpLHRoaXMuc3Bpbm5pbmc9ITAsITApOiExfSxfcmVwZWF0OmZ1bmN0aW9uKGUsdCxpKXtlPWV8fDUwMCxjbGVhclRpbWVvdXQodGhpcy50aW1lciksdGhpcy50aW1lcj10aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMuX3JlcGVhdCg0MCx0LGkpfSxlKSx0aGlzLl9zcGluKHQqdGhpcy5vcHRpb25zLnN0ZXAsaSl9LF9zcGluOmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy52YWx1ZSgpfHwwO3RoaXMuY291bnRlcnx8KHRoaXMuY291bnRlcj0xKSxpPXRoaXMuX2FkanVzdFZhbHVlKGkrZSp0aGlzLl9pbmNyZW1lbnQodGhpcy5jb3VudGVyKSksdGhpcy5zcGlubmluZyYmdGhpcy5fdHJpZ2dlcigic3BpbiIsdCx7dmFsdWU6aX0pPT09ITF8fCh0aGlzLl92YWx1ZShpKSx0aGlzLmNvdW50ZXIrKyl9LF9pbmNyZW1lbnQ6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5vcHRpb25zLmluY3JlbWVudGFsO3JldHVybiBpP2UuaXNGdW5jdGlvbihpKT9pKHQpOk1hdGguZmxvb3IodCp0KnQvNWU0LXQqdC81MDArMTcqdC8yMDArMSk6MX0sX3ByZWNpc2lvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3ByZWNpc2lvbk9mKHRoaXMub3B0aW9ucy5zdGVwKTtyZXR1cm4gbnVsbCE9PXRoaXMub3B0aW9ucy5taW4mJihlPU1hdGgubWF4KGUsdGhpcy5fcHJlY2lzaW9uT2YodGhpcy5vcHRpb25zLm1pbikpKSxlfSxfcHJlY2lzaW9uT2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9IiIrZSxpPXQuaW5kZXhPZigiLiIpO3JldHVybi0xPT09aT8wOnQubGVuZ3RoLWktMX0sX2FkanVzdFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LGkscz10aGlzLm9wdGlvbnM7cmV0dXJuIHQ9bnVsbCE9PXMubWluP3MubWluOjAsaT1lLXQsaT1NYXRoLnJvdW5kKGkvcy5zdGVwKSpzLnN0ZXAsZT10K2ksZT1wYXJzZUZsb2F0KGUudG9GaXhlZCh0aGlzLl9wcmVjaXNpb24oKSkpLG51bGwhPT1zLm1heCYmZT5zLm1heD9zLm1heDpudWxsIT09cy5taW4mJnMubWluPmU/cy5taW46ZX0sX3N0b3A6ZnVuY3Rpb24oZSl7dGhpcy5zcGlubmluZyYmKGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSxjbGVhclRpbWVvdXQodGhpcy5tb3VzZXdoZWVsVGltZXIpLHRoaXMuY291bnRlcj0wLHRoaXMuc3Bpbm5pbmc9ITEsdGhpcy5fdHJpZ2dlcigic3RvcCIsZSkpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7aWYoImN1bHR1cmUiPT09ZXx8Im51bWJlckZvcm1hdCI9PT1lKXt2YXIgaT10aGlzLl9wYXJzZSh0aGlzLmVsZW1lbnQudmFsKCkpO3JldHVybiB0aGlzLm9wdGlvbnNbZV09dCx0aGlzLmVsZW1lbnQudmFsKHRoaXMuX2Zvcm1hdChpKSksdm9pZCAwfSgibWF4Ij09PWV8fCJtaW4iPT09ZXx8InN0ZXAiPT09ZSkmJiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dGhpcy5fcGFyc2UodCkpLCJpY29ucyI9PT1lJiYodGhpcy5idXR0b25zLmZpcnN0KCkuZmluZCgiLnVpLWljb24iKS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaWNvbnMudXApLmFkZENsYXNzKHQudXApLHRoaXMuYnV0dG9ucy5sYXN0KCkuZmluZCgiLnVpLWljb24iKS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaWNvbnMuZG93bikuYWRkQ2xhc3ModC5kb3duKSksdGhpcy5fc3VwZXIoZSx0KSwiZGlzYWJsZWQiPT09ZSYmKHRoaXMud2lkZ2V0KCkudG9nZ2xlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiwhIXQpLHRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsISF0KSx0aGlzLmJ1dHRvbnMuYnV0dG9uKHQ/ImRpc2FibGUiOiJlbmFibGUiKSl9LF9zZXRPcHRpb25zOnMoZnVuY3Rpb24oZSl7dGhpcy5fc3VwZXIoZSl9KSxfcGFyc2U6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiYiIiE9PWUmJihlPXdpbmRvdy5HbG9iYWxpemUmJnRoaXMub3B0aW9ucy5udW1iZXJGb3JtYXQ/R2xvYmFsaXplLnBhcnNlRmxvYXQoZSwxMCx0aGlzLm9wdGlvbnMuY3VsdHVyZSk6K2UpLCIiPT09ZXx8aXNOYU4oZSk/bnVsbDplCn0sX2Zvcm1hdDpmdW5jdGlvbihlKXtyZXR1cm4iIj09PWU/IiI6d2luZG93Lkdsb2JhbGl6ZSYmdGhpcy5vcHRpb25zLm51bWJlckZvcm1hdD9HbG9iYWxpemUuZm9ybWF0KGUsdGhpcy5vcHRpb25zLm51bWJlckZvcm1hdCx0aGlzLm9wdGlvbnMuY3VsdHVyZSk6ZX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuYXR0cih7ImFyaWEtdmFsdWVtaW4iOnRoaXMub3B0aW9ucy5taW4sImFyaWEtdmFsdWVtYXgiOnRoaXMub3B0aW9ucy5tYXgsImFyaWEtdmFsdWVub3ciOnRoaXMuX3BhcnNlKHRoaXMuZWxlbWVudC52YWwoKSl9KX0saXNWYWxpZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMudmFsdWUoKTtyZXR1cm4gbnVsbD09PWU/ITE6ZT09PXRoaXMuX2FkanVzdFZhbHVlKGUpfSxfdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgaTsiIiE9PWUmJihpPXRoaXMuX3BhcnNlKGUpLG51bGwhPT1pJiYodHx8KGk9dGhpcy5fYWRqdXN0VmFsdWUoaSkpLGU9dGhpcy5fZm9ybWF0KGkpKSksdGhpcy5lbGVtZW50LnZhbChlKSx0aGlzLl9yZWZyZXNoKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zcGlubmVyLWlucHV0IikucHJvcCgiZGlzYWJsZWQiLCExKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW1pbiIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVtYXgiKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbm93IiksdGhpcy51aVNwaW5uZXIucmVwbGFjZVdpdGgodGhpcy5lbGVtZW50KX0sc3RlcFVwOnMoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcFVwKGUpfSksX3N0ZXBVcDpmdW5jdGlvbihlKXt0aGlzLl9zdGFydCgpJiYodGhpcy5fc3BpbigoZXx8MSkqdGhpcy5vcHRpb25zLnN0ZXApLHRoaXMuX3N0b3AoKSl9LHN0ZXBEb3duOnMoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcERvd24oZSl9KSxfc3RlcERvd246ZnVuY3Rpb24oZSl7dGhpcy5fc3RhcnQoKSYmKHRoaXMuX3NwaW4oKGV8fDEpKi10aGlzLm9wdGlvbnMuc3RlcCksdGhpcy5fc3RvcCgpKX0scGFnZVVwOnMoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcFVwKChlfHwxKSp0aGlzLm9wdGlvbnMucGFnZSl9KSxwYWdlRG93bjpzKGZ1bmN0aW9uKGUpe3RoaXMuX3N0ZXBEb3duKChlfHwxKSp0aGlzLm9wdGlvbnMucGFnZSl9KSx2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocyh0aGlzLl92YWx1ZSkuY2FsbCh0aGlzLGUpLHZvaWQgMCk6dGhpcy5fcGFyc2UodGhpcy5lbGVtZW50LnZhbCgpKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWlTcGlubmVyfX0pLGUud2lkZ2V0KCJ1aS50YWJzIix7dmVyc2lvbjoiMS4xMS40IixkZWxheTozMDAsb3B0aW9uczp7YWN0aXZlOm51bGwsY29sbGFwc2libGU6ITEsZXZlbnQ6ImNsaWNrIixoZWlnaHRTdHlsZToiY29udGVudCIsaGlkZTpudWxsLHNob3c6bnVsbCxhY3RpdmF0ZTpudWxsLGJlZm9yZUFjdGl2YXRlOm51bGwsYmVmb3JlTG9hZDpudWxsLGxvYWQ6bnVsbH0sX2lzTG9jYWw6ZnVuY3Rpb24oKXt2YXIgZT0vIy4qJC87cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBpLHM7dD10LmNsb25lTm9kZSghMSksaT10LmhyZWYucmVwbGFjZShlLCIiKSxzPWxvY2F0aW9uLmhyZWYucmVwbGFjZShlLCIiKTt0cnl7aT1kZWNvZGVVUklDb21wb25lbnQoaSl9Y2F0Y2gobil7fXRyeXtzPWRlY29kZVVSSUNvbXBvbmVudChzKX1jYXRjaChuKXt9cmV0dXJuIHQuaGFzaC5sZW5ndGg+MSYmaT09PXN9fSgpLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGk9dGhpcy5vcHRpb25zO3RoaXMucnVubmluZz0hMSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXRhYnMgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS50b2dnbGVDbGFzcygidWktdGFicy1jb2xsYXBzaWJsZSIsaS5jb2xsYXBzaWJsZSksdGhpcy5fcHJvY2Vzc1RhYnMoKSxpLmFjdGl2ZT10aGlzLl9pbml0aWFsQWN0aXZlKCksZS5pc0FycmF5KGkuZGlzYWJsZWQpJiYoaS5kaXNhYmxlZD1lLnVuaXF1ZShpLmRpc2FibGVkLmNvbmNhdChlLm1hcCh0aGlzLnRhYnMuZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihlKXtyZXR1cm4gdC50YWJzLmluZGV4KGUpfSkpKS5zb3J0KCkpLHRoaXMuYWN0aXZlPXRoaXMub3B0aW9ucy5hY3RpdmUhPT0hMSYmdGhpcy5hbmNob3JzLmxlbmd0aD90aGlzLl9maW5kQWN0aXZlKGkuYWN0aXZlKTplKCksdGhpcy5fcmVmcmVzaCgpLHRoaXMuYWN0aXZlLmxlbmd0aCYmdGhpcy5sb2FkKGkuYWN0aXZlKX0sX2luaXRpYWxBY3RpdmU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuYWN0aXZlLGk9dGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlLHM9bG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSk7cmV0dXJuIG51bGw9PT10JiYocyYmdGhpcy50YWJzLmVhY2goZnVuY3Rpb24oaSxuKXtyZXR1cm4gZShuKS5hdHRyKCJhcmlhLWNvbnRyb2xzIik9PT1zPyh0PWksITEpOnZvaWQgMH0pLG51bGw9PT10JiYodD10aGlzLnRhYnMuaW5kZXgodGhpcy50YWJzLmZpbHRlcigiLnVpLXRhYnMtYWN0aXZlIikpKSwobnVsbD09PXR8fC0xPT09dCkmJih0PXRoaXMudGFicy5sZW5ndGg/MDohMSkpLHQhPT0hMSYmKHQ9dGhpcy50YWJzLmluZGV4KHRoaXMudGFicy5lcSh0KSksLTE9PT10JiYodD1pPyExOjApKSwhaSYmdD09PSExJiZ0aGlzLmFuY2hvcnMubGVuZ3RoJiYodD0wKSx0fSxfZ2V0Q3JlYXRlRXZlbnREYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3RhYjp0aGlzLmFjdGl2ZSxwYW5lbDp0aGlzLmFjdGl2ZS5sZW5ndGg/dGhpcy5fZ2V0UGFuZWxGb3JUYWIodGhpcy5hY3RpdmUpOmUoKX19LF90YWJLZXlkb3duOmZ1bmN0aW9uKHQpe3ZhciBpPWUodGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50KS5jbG9zZXN0KCJsaSIpLHM9dGhpcy50YWJzLmluZGV4KGkpLG49ITA7aWYoIXRoaXMuX2hhbmRsZVBhZ2VOYXYodCkpe3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLlJJR0hUOmNhc2UgZS51aS5rZXlDb2RlLkRPV046cysrO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlVQOmNhc2UgZS51aS5rZXlDb2RlLkxFRlQ6bj0hMSxzLS07YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5EOnM9dGhpcy5hbmNob3JzLmxlbmd0aC0xO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6cz0wO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlNQQUNFOnJldHVybiB0LnByZXZlbnREZWZhdWx0KCksY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGluZyksdGhpcy5fYWN0aXZhdGUocyksdm9pZCAwO2Nhc2UgZS51aS5rZXlDb2RlLkVOVEVSOnJldHVybiB0LnByZXZlbnREZWZhdWx0KCksY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGluZyksdGhpcy5fYWN0aXZhdGUocz09PXRoaXMub3B0aW9ucy5hY3RpdmU/ITE6cyksdm9pZCAwO2RlZmF1bHQ6cmV0dXJufXQucHJldmVudERlZmF1bHQoKSxjbGVhclRpbWVvdXQodGhpcy5hY3RpdmF0aW5nKSxzPXRoaXMuX2ZvY3VzTmV4dFRhYihzLG4pLHQuY3RybEtleXx8dC5tZXRhS2V5fHwoaS5hdHRyKCJhcmlhLXNlbGVjdGVkIiwiZmFsc2UiKSx0aGlzLnRhYnMuZXEocykuYXR0cigiYXJpYS1zZWxlY3RlZCIsInRydWUiKSx0aGlzLmFjdGl2YXRpbmc9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLm9wdGlvbigiYWN0aXZlIixzKX0sdGhpcy5kZWxheSkpfX0sX3BhbmVsS2V5ZG93bjpmdW5jdGlvbih0KXt0aGlzLl9oYW5kbGVQYWdlTmF2KHQpfHx0LmN0cmxLZXkmJnQua2V5Q29kZT09PWUudWkua2V5Q29kZS5VUCYmKHQucHJldmVudERlZmF1bHQoKSx0aGlzLmFjdGl2ZS5mb2N1cygpKX0sX2hhbmRsZVBhZ2VOYXY6ZnVuY3Rpb24odCl7cmV0dXJuIHQuYWx0S2V5JiZ0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuUEFHRV9VUD8odGhpcy5fYWN0aXZhdGUodGhpcy5fZm9jdXNOZXh0VGFiKHRoaXMub3B0aW9ucy5hY3RpdmUtMSwhMSkpLCEwKTp0LmFsdEtleSYmdC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLlBBR0VfRE9XTj8odGhpcy5fYWN0aXZhdGUodGhpcy5fZm9jdXNOZXh0VGFiKHRoaXMub3B0aW9ucy5hY3RpdmUrMSwhMCkpLCEwKTp2b2lkIDB9LF9maW5kTmV4dFRhYjpmdW5jdGlvbih0LGkpe2Z1bmN0aW9uIHMoKXtyZXR1cm4gdD5uJiYodD0wKSwwPnQmJih0PW4pLHR9Zm9yKHZhciBuPXRoaXMudGFicy5sZW5ndGgtMTstMSE9PWUuaW5BcnJheShzKCksdGhpcy5vcHRpb25zLmRpc2FibGVkKTspdD1pP3QrMTp0LTE7cmV0dXJuIHR9LF9mb2N1c05leHRUYWI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT10aGlzLl9maW5kTmV4dFRhYihlLHQpLHRoaXMudGFicy5lcShlKS5mb2N1cygpLGV9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4iYWN0aXZlIj09PWU/KHRoaXMuX2FjdGl2YXRlKHQpLHZvaWQgMCk6ImRpc2FibGVkIj09PWU/KHRoaXMuX3NldHVwRGlzYWJsZWQodCksdm9pZCAwKToodGhpcy5fc3VwZXIoZSx0KSwiY29sbGFwc2libGUiPT09ZSYmKHRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygidWktdGFicy1jb2xsYXBzaWJsZSIsdCksdHx8dGhpcy5vcHRpb25zLmFjdGl2ZSE9PSExfHx0aGlzLl9hY3RpdmF0ZSgwKSksImV2ZW50Ij09PWUmJnRoaXMuX3NldHVwRXZlbnRzKHQpLCJoZWlnaHRTdHlsZSI9PT1lJiZ0aGlzLl9zZXR1cEhlaWdodFN0eWxlKHQpLHZvaWQgMCl9LF9zYW5pdGl6ZVNlbGVjdG9yOmZ1bmN0aW9uKGUpe3JldHVybiBlP2UucmVwbGFjZSgvWyEiJCUmJygpKissLlwvOjs8PT4/QFxbXF1cXmB7fH1+XS9nLCJcXCQmIik6IiJ9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMsaT10aGlzLnRhYmxpc3QuY2hpbGRyZW4oIjpoYXMoYVtocmVmXSkiKTt0LmRpc2FibGVkPWUubWFwKGkuZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihlKXtyZXR1cm4gaS5pbmRleChlKX0pLHRoaXMuX3Byb2Nlc3NUYWJzKCksdC5hY3RpdmUhPT0hMSYmdGhpcy5hbmNob3JzLmxlbmd0aD90aGlzLmFjdGl2ZS5sZW5ndGgmJiFlLmNvbnRhaW5zKHRoaXMudGFibGlzdFswXSx0aGlzLmFjdGl2ZVswXSk/dGhpcy50YWJzLmxlbmd0aD09PXQuZGlzYWJsZWQubGVuZ3RoPyh0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpOnRoaXMuX2FjdGl2YXRlKHRoaXMuX2ZpbmROZXh0VGFiKE1hdGgubWF4KDAsdC5hY3RpdmUtMSksITEpKTp0LmFjdGl2ZT10aGlzLnRhYnMuaW5kZXgodGhpcy5hY3RpdmUpOih0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpLHRoaXMuX3JlZnJlc2goKX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt0aGlzLl9zZXR1cERpc2FibGVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCksdGhpcy5fc2V0dXBFdmVudHModGhpcy5vcHRpb25zLmV2ZW50KSx0aGlzLl9zZXR1cEhlaWdodFN0eWxlKHRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSksdGhpcy50YWJzLm5vdCh0aGlzLmFjdGl2ZSkuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsImFyaWEtZXhwYW5kZWQiOiJmYWxzZSIsdGFiSW5kZXg6LTF9KSx0aGlzLnBhbmVscy5ub3QodGhpcy5fZ2V0UGFuZWxGb3JUYWIodGhpcy5hY3RpdmUpKS5oaWRlKCkuYXR0cih7ImFyaWEtaGlkZGVuIjoidHJ1ZSJ9KSx0aGlzLmFjdGl2ZS5sZW5ndGg/KHRoaXMuYWN0aXZlLmFkZENsYXNzKCJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLCJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pLHRoaXMuX2dldFBhbmVsRm9yVGFiKHRoaXMuYWN0aXZlKS5zaG93KCkuYXR0cih7ImFyaWEtaGlkZGVuIjoiZmFsc2UifSkpOnRoaXMudGFicy5lcSgwKS5hdHRyKCJ0YWJJbmRleCIsMCl9LF9wcm9jZXNzVGFiczpmdW5jdGlvbigpe3ZhciB0PXRoaXMsaT10aGlzLnRhYnMscz10aGlzLmFuY2hvcnMsbj10aGlzLnBhbmVsczt0aGlzLnRhYmxpc3Q9dGhpcy5fZ2V0TGlzdCgpLmFkZENsYXNzKCJ1aS10YWJzLW5hdiB1aS1oZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCIpLmF0dHIoInJvbGUiLCJ0YWJsaXN0IikuZGVsZWdhdGUoIj4gbGkiLCJtb3VzZWRvd24iK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24odCl7ZSh0aGlzKS5pcygiLnVpLXN0YXRlLWRpc2FibGVkIikmJnQucHJldmVudERlZmF1bHQoKX0pLmRlbGVnYXRlKCIudWktdGFicy1hbmNob3IiLCJmb2N1cyIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2UodGhpcykuY2xvc2VzdCgibGkiKS5pcygiLnVpLXN0YXRlLWRpc2FibGVkIikmJnRoaXMuYmx1cigpfSksdGhpcy50YWJzPXRoaXMudGFibGlzdC5maW5kKCI+IGxpOmhhcyhhW2hyZWZdKSIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci10b3AiKS5hdHRyKHtyb2xlOiJ0YWIiLHRhYkluZGV4Oi0xfSksdGhpcy5hbmNob3JzPXRoaXMudGFicy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZSgiYSIsdGhpcylbMF19KS5hZGRDbGFzcygidWktdGFicy1hbmNob3IiKS5hdHRyKHtyb2xlOiJwcmVzZW50YXRpb24iLHRhYkluZGV4Oi0xfSksdGhpcy5wYW5lbHM9ZSgpLHRoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKGkscyl7dmFyIG4sYSxvLHI9ZShzKS51bmlxdWVJZCgpLmF0dHIoImlkIiksaD1lKHMpLmNsb3Nlc3QoImxpIiksbD1oLmF0dHIoImFyaWEtY29udHJvbHMiKTt0Ll9pc0xvY2FsKHMpPyhuPXMuaGFzaCxvPW4uc3Vic3RyaW5nKDEpLGE9dC5lbGVtZW50LmZpbmQodC5fc2FuaXRpemVTZWxlY3RvcihuKSkpOihvPWguYXR0cigiYXJpYS1jb250cm9scyIpfHxlKHt9KS51bmlxdWVJZCgpWzBdLmlkLG49IiMiK28sYT10LmVsZW1lbnQuZmluZChuKSxhLmxlbmd0aHx8KGE9dC5fY3JlYXRlUGFuZWwobyksYS5pbnNlcnRBZnRlcih0LnBhbmVsc1tpLTFdfHx0LnRhYmxpc3QpKSxhLmF0dHIoImFyaWEtbGl2ZSIsInBvbGl0ZSIpKSxhLmxlbmd0aCYmKHQucGFuZWxzPXQucGFuZWxzLmFkZChhKSksbCYmaC5kYXRhKCJ1aS10YWJzLWFyaWEtY29udHJvbHMiLGwpLGguYXR0cih7ImFyaWEtY29udHJvbHMiOm8sImFyaWEtbGFiZWxsZWRieSI6cn0pLGEuYXR0cigiYXJpYS1sYWJlbGxlZGJ5IixyKX0pLHRoaXMucGFuZWxzLmFkZENsYXNzKCJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iKS5hdHRyKCJyb2xlIiwidGFicGFuZWwiKSxpJiYodGhpcy5fb2ZmKGkubm90KHRoaXMudGFicykpLHRoaXMuX29mZihzLm5vdCh0aGlzLmFuY2hvcnMpKSx0aGlzLl9vZmYobi5ub3QodGhpcy5wYW5lbHMpKSl9LF9nZXRMaXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFibGlzdHx8dGhpcy5lbGVtZW50LmZpbmQoIm9sLHVsIikuZXEoMCl9LF9jcmVhdGVQYW5lbDpmdW5jdGlvbih0KXtyZXR1cm4gZSgiPGRpdj4iKS5hdHRyKCJpZCIsdCkuYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpLmRhdGEoInVpLXRhYnMtZGVzdHJveSIsITApfSxfc2V0dXBEaXNhYmxlZDpmdW5jdGlvbih0KXtlLmlzQXJyYXkodCkmJih0Lmxlbmd0aD90Lmxlbmd0aD09PXRoaXMuYW5jaG9ycy5sZW5ndGgmJih0PSEwKTp0PSExKTtmb3IodmFyIGkscz0wO2k9dGhpcy50YWJzW3NdO3MrKyl0PT09ITB8fC0xIT09ZS5pbkFycmF5KHMsdCk/ZShpKS5hZGRDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKS5hdHRyKCJhcmlhLWRpc2FibGVkIiwidHJ1ZSIpOmUoaSkucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIikucmVtb3ZlQXR0cigiYXJpYS1kaXNhYmxlZCIpO3RoaXMub3B0aW9ucy5kaXNhYmxlZD10fSxfc2V0dXBFdmVudHM6ZnVuY3Rpb24odCl7dmFyIGk9e307dCYmZS5lYWNoKHQuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe2lbdF09Il9ldmVudEhhbmRsZXIifSksdGhpcy5fb2ZmKHRoaXMuYW5jaG9ycy5hZGQodGhpcy50YWJzKS5hZGQodGhpcy5wYW5lbHMpKSx0aGlzLl9vbighMCx0aGlzLmFuY2hvcnMse2NsaWNrOmZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKX19KSx0aGlzLl9vbih0aGlzLmFuY2hvcnMsaSksdGhpcy5fb24odGhpcy50YWJzLHtrZXlkb3duOiJfdGFiS2V5ZG93biJ9KSx0aGlzLl9vbih0aGlzLnBhbmVscyx7a2V5ZG93bjoiX3BhbmVsS2V5ZG93biJ9KSx0aGlzLl9mb2N1c2FibGUodGhpcy50YWJzKSx0aGlzLl9ob3ZlcmFibGUodGhpcy50YWJzKX0sX3NldHVwSGVpZ2h0U3R5bGU6ZnVuY3Rpb24odCl7dmFyIGkscz10aGlzLmVsZW1lbnQucGFyZW50KCk7ImZpbGwiPT09dD8oaT1zLmhlaWdodCgpLGktPXRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpLXRoaXMuZWxlbWVudC5oZWlnaHQoKSx0aGlzLmVsZW1lbnQuc2libGluZ3MoIjp2aXNpYmxlIikuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcykscz10LmNzcygicG9zaXRpb24iKTsiYWJzb2x1dGUiIT09cyYmImZpeGVkIiE9PXMmJihpLT10Lm91dGVySGVpZ2h0KCEwKSl9KSx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oKS5ub3QodGhpcy5wYW5lbHMpLmVhY2goZnVuY3Rpb24oKXtpLT1lKHRoaXMpLm91dGVySGVpZ2h0KCEwKX0pLHRoaXMucGFuZWxzLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmhlaWdodChNYXRoLm1heCgwLGktZSh0aGlzKS5pbm5lckhlaWdodCgpK2UodGhpcykuaGVpZ2h0KCkpKX0pLmNzcygib3ZlcmZsb3ciLCJhdXRvIikpOiJhdXRvIj09PXQmJihpPTAsdGhpcy5wYW5lbHMuZWFjaChmdW5jdGlvbigpe2k9TWF0aC5tYXgoaSxlKHRoaXMpLmhlaWdodCgiIikuaGVpZ2h0KCkpfSkuaGVpZ2h0KGkpKX0sX2V2ZW50SGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnMscz10aGlzLmFjdGl2ZSxuPWUodC5jdXJyZW50VGFyZ2V0KSxhPW4uY2xvc2VzdCgibGkiKSxvPWFbMF09PT1zWzBdLHI9byYmaS5jb2xsYXBzaWJsZSxoPXI/ZSgpOnRoaXMuX2dldFBhbmVsRm9yVGFiKGEpLGw9cy5sZW5ndGg/dGhpcy5fZ2V0UGFuZWxGb3JUYWIocyk6ZSgpLHU9e29sZFRhYjpzLG9sZFBhbmVsOmwsbmV3VGFiOnI/ZSgpOmEsbmV3UGFuZWw6aH07dC5wcmV2ZW50RGVmYXVsdCgpLGEuaGFzQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIil8fGEuaGFzQ2xhc3MoInVpLXRhYnMtbG9hZGluZyIpfHx0aGlzLnJ1bm5pbmd8fG8mJiFpLmNvbGxhcHNpYmxlfHx0aGlzLl90cmlnZ2VyKCJiZWZvcmVBY3RpdmF0ZSIsdCx1KT09PSExfHwoaS5hY3RpdmU9cj8hMTp0aGlzLnRhYnMuaW5kZXgoYSksdGhpcy5hY3RpdmU9bz9lKCk6YSx0aGlzLnhociYmdGhpcy54aHIuYWJvcnQoKSxsLmxlbmd0aHx8aC5sZW5ndGh8fGUuZXJyb3IoImpRdWVyeSBVSSBUYWJzOiBNaXNtYXRjaGluZyBmcmFnbWVudCBpZGVudGlmaWVyLiIpLGgubGVuZ3RoJiZ0aGlzLmxvYWQodGhpcy50YWJzLmluZGV4KGEpLHQpLHRoaXMuX3RvZ2dsZSh0LHUpKX0sX3RvZ2dsZTpmdW5jdGlvbih0LGkpe2Z1bmN0aW9uIHMoKXthLnJ1bm5pbmc9ITEsYS5fdHJpZ2dlcigiYWN0aXZhdGUiLHQsaSl9ZnVuY3Rpb24gbigpe2kubmV3VGFiLmNsb3Nlc3QoImxpIikuYWRkQ2xhc3MoInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIpLG8ubGVuZ3RoJiZhLm9wdGlvbnMuc2hvdz9hLl9zaG93KG8sYS5vcHRpb25zLnNob3cscyk6KG8uc2hvdygpLHMoKSl9dmFyIGE9dGhpcyxvPWkubmV3UGFuZWwscj1pLm9sZFBhbmVsO3RoaXMucnVubmluZz0hMCxyLmxlbmd0aCYmdGhpcy5vcHRpb25zLmhpZGU/dGhpcy5faGlkZShyLHRoaXMub3B0aW9ucy5oaWRlLGZ1bmN0aW9uKCl7aS5vbGRUYWIuY2xvc2VzdCgibGkiKS5yZW1vdmVDbGFzcygidWktdGFicy1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIiksbigpfSk6KGkub2xkVGFiLmNsb3Nlc3QoImxpIikucmVtb3ZlQ2xhc3MoInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIpLHIuaGlkZSgpLG4oKSksci5hdHRyKCJhcmlhLWhpZGRlbiIsInRydWUiKSxpLm9sZFRhYi5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6ImZhbHNlIiwiYXJpYS1leHBhbmRlZCI6ImZhbHNlIn0pLG8ubGVuZ3RoJiZyLmxlbmd0aD9pLm9sZFRhYi5hdHRyKCJ0YWJJbmRleCIsLTEpOm8ubGVuZ3RoJiZ0aGlzLnRhYnMuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1lKHRoaXMpLmF0dHIoInRhYkluZGV4Iil9KS5hdHRyKCJ0YWJJbmRleCIsLTEpLG8uYXR0cigiYXJpYS1oaWRkZW4iLCJmYWxzZSIpLGkubmV3VGFiLmF0dHIoeyJhcmlhLXNlbGVjdGVkIjoidHJ1ZSIsImFyaWEtZXhwYW5kZWQiOiJ0cnVlIix0YWJJbmRleDowfSl9LF9hY3RpdmF0ZTpmdW5jdGlvbih0KXt2YXIgaSxzPXRoaXMuX2ZpbmRBY3RpdmUodCk7c1swXSE9PXRoaXMuYWN0aXZlWzBdJiYocy5sZW5ndGh8fChzPXRoaXMuYWN0aXZlKSxpPXMuZmluZCgiLnVpLXRhYnMtYW5jaG9yIilbMF0sdGhpcy5fZXZlbnRIYW5kbGVyKHt0YXJnZXQ6aSxjdXJyZW50VGFyZ2V0OmkscHJldmVudERlZmF1bHQ6ZS5ub29wfSkpfSxfZmluZEFjdGl2ZTpmdW5jdGlvbih0KXtyZXR1cm4gdD09PSExP2UoKTp0aGlzLnRhYnMuZXEodCl9LF9nZXRJbmRleDpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJihlPXRoaXMuYW5jaG9ycy5pbmRleCh0aGlzLmFuY2hvcnMuZmlsdGVyKCJbaHJlZiQ9JyIrZSsiJ10iKSkpLGV9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy54aHImJnRoaXMueGhyLmFib3J0KCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIHVpLXRhYnMtY29sbGFwc2libGUiKSx0aGlzLnRhYmxpc3QucmVtb3ZlQ2xhc3MoInVpLXRhYnMtbmF2IHVpLWhlbHBlci1yZXNldCB1aS1oZWxwZXItY2xlYXJmaXggdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIikucmVtb3ZlQXR0cigicm9sZSIpLHRoaXMuYW5jaG9ycy5yZW1vdmVDbGFzcygidWktdGFicy1hbmNob3IiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigidGFiSW5kZXgiKS5yZW1vdmVVbmlxdWVJZCgpLHRoaXMudGFibGlzdC51bmJpbmQodGhpcy5ldmVudE5hbWVzcGFjZSksdGhpcy50YWJzLmFkZCh0aGlzLnBhbmVscykuZWFjaChmdW5jdGlvbigpe2UuZGF0YSh0aGlzLCJ1aS10YWJzLWRlc3Ryb3kiKT9lKHRoaXMpLnJlbW92ZSgpOmUodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktc3RhdGUtYWN0aXZlIHVpLXN0YXRlLWRpc2FibGVkIHVpLWNvcm5lci10b3AgdWktY29ybmVyLWJvdHRvbSB1aS13aWRnZXQtY29udGVudCB1aS10YWJzLWFjdGl2ZSB1aS10YWJzLXBhbmVsIikucmVtb3ZlQXR0cigidGFiSW5kZXgiKS5yZW1vdmVBdHRyKCJhcmlhLWxpdmUiKS5yZW1vdmVBdHRyKCJhcmlhLWJ1c3kiKS5yZW1vdmVBdHRyKCJhcmlhLXNlbGVjdGVkIikucmVtb3ZlQXR0cigiYXJpYS1sYWJlbGxlZGJ5IikucmVtb3ZlQXR0cigiYXJpYS1oaWRkZW4iKS5yZW1vdmVBdHRyKCJhcmlhLWV4cGFuZGVkIikucmVtb3ZlQXR0cigicm9sZSIpfSksdGhpcy50YWJzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC5kYXRhKCJ1aS10YWJzLWFyaWEtY29udHJvbHMiKTtpP3QuYXR0cigiYXJpYS1jb250cm9scyIsaSkucmVtb3ZlRGF0YSgidWktdGFicy1hcmlhLWNvbnRyb2xzIik6dC5yZW1vdmVBdHRyKCJhcmlhLWNvbnRyb2xzIil9KSx0aGlzLnBhbmVscy5zaG93KCksImNvbnRlbnQiIT09dGhpcy5vcHRpb25zLmhlaWdodFN0eWxlJiZ0aGlzLnBhbmVscy5jc3MoImhlaWdodCIsIiIpfSxlbmFibGU6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5vcHRpb25zLmRpc2FibGVkO2khPT0hMSYmKHZvaWQgMD09PXQ/aT0hMToodD10aGlzLl9nZXRJbmRleCh0KSxpPWUuaXNBcnJheShpKT9lLm1hcChpLGZ1bmN0aW9uKGUpe3JldHVybiBlIT09dD9lOm51bGx9KTplLm1hcCh0aGlzLnRhYnMsZnVuY3Rpb24oZSxpKXtyZXR1cm4gaSE9PXQ/aTpudWxsfSkpLHRoaXMuX3NldHVwRGlzYWJsZWQoaSkpfSxkaXNhYmxlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucy5kaXNhYmxlZDtpZihpIT09ITApe2lmKHZvaWQgMD09PXQpaT0hMDtlbHNle2lmKHQ9dGhpcy5fZ2V0SW5kZXgodCksLTEhPT1lLmluQXJyYXkodCxpKSlyZXR1cm47aT1lLmlzQXJyYXkoaSk/ZS5tZXJnZShbdF0saSkuc29ydCgpOlt0XX10aGlzLl9zZXR1cERpc2FibGVkKGkpfX0sbG9hZDpmdW5jdGlvbih0LGkpe3Q9dGhpcy5fZ2V0SW5kZXgodCk7dmFyIHM9dGhpcyxuPXRoaXMudGFicy5lcSh0KSxhPW4uZmluZCgiLnVpLXRhYnMtYW5jaG9yIiksbz10aGlzLl9nZXRQYW5lbEZvclRhYihuKSxyPXt0YWI6bixwYW5lbDpvfSxoPWZ1bmN0aW9uKGUsdCl7ImFib3J0Ij09PXQmJnMucGFuZWxzLnN0b3AoITEsITApLG4ucmVtb3ZlQ2xhc3MoInVpLXRhYnMtbG9hZGluZyIpLG8ucmVtb3ZlQXR0cigiYXJpYS1idXN5IiksZT09PXMueGhyJiZkZWxldGUgcy54aHJ9O3RoaXMuX2lzTG9jYWwoYVswXSl8fCh0aGlzLnhocj1lLmFqYXgodGhpcy5fYWpheFNldHRpbmdzKGEsaSxyKSksdGhpcy54aHImJiJjYW5jZWxlZCIhPT10aGlzLnhoci5zdGF0dXNUZXh0JiYobi5hZGRDbGFzcygidWktdGFicy1sb2FkaW5nIiksby5hdHRyKCJhcmlhLWJ1c3kiLCJ0cnVlIiksdGhpcy54aHIuZG9uZShmdW5jdGlvbihlLHQsbil7c2V0VGltZW91dChmdW5jdGlvbigpe28uaHRtbChlKSxzLl90cmlnZ2VyKCJsb2FkIixpLHIpLGgobix0KX0sMSl9KS5mYWlsKGZ1bmN0aW9uKGUsdCl7c2V0VGltZW91dChmdW5jdGlvbigpe2goZSx0KX0sMSl9KSkpfSxfYWpheFNldHRpbmdzOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj10aGlzO3JldHVybnt1cmw6dC5hdHRyKCJocmVmIiksYmVmb3JlU2VuZDpmdW5jdGlvbih0LGEpe3JldHVybiBuLl90cmlnZ2VyKCJiZWZvcmVMb2FkIixpLGUuZXh0ZW5kKHtqcVhIUjp0LGFqYXhTZXR0aW5nczphfSxzKSl9fX0sX2dldFBhbmVsRm9yVGFiOmZ1bmN0aW9uKHQpe3ZhciBpPWUodCkuYXR0cigiYXJpYS1jb250cm9scyIpO3JldHVybiB0aGlzLmVsZW1lbnQuZmluZCh0aGlzLl9zYW5pdGl6ZVNlbGVjdG9yKCIjIitpKSl9fSksZS53aWRnZXQoInVpLnRvb2x0aXAiLHt2ZXJzaW9uOiIxLjExLjQiLG9wdGlvbnM6e2NvbnRlbnQ6ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLmF0dHIoInRpdGxlIil8fCIiO3JldHVybiBlKCI8YT4iKS50ZXh0KHQpLmh0bWwoKX0saGlkZTohMCxpdGVtczoiW3RpdGxlXTpub3QoW2Rpc2FibGVkXSkiLHBvc2l0aW9uOntteToibGVmdCB0b3ArMTUiLGF0OiJsZWZ0IGJvdHRvbSIsY29sbGlzaW9uOiJmbGlwZml0IGZsaXAifSxzaG93OiEwLHRvb2x0aXBDbGFzczpudWxsLHRyYWNrOiExLGNsb3NlOm51bGwsb3BlbjpudWxsfSxfYWRkRGVzY3JpYmVkQnk6ZnVuY3Rpb24odCxpKXt2YXIgcz0odC5hdHRyKCJhcmlhLWRlc2NyaWJlZGJ5Iil8fCIiKS5zcGxpdCgvXHMrLyk7cy5wdXNoKGkpLHQuZGF0YSgidWktdG9vbHRpcC1pZCIsaSkuYXR0cigiYXJpYS1kZXNjcmliZWRieSIsZS50cmltKHMuam9pbigiICIpKSl9LF9yZW1vdmVEZXNjcmliZWRCeTpmdW5jdGlvbih0KXt2YXIgaT10LmRhdGEoInVpLXRvb2x0aXAtaWQiKSxzPSh0LmF0dHIoImFyaWEtZGVzY3JpYmVkYnkiKXx8IiIpLnNwbGl0KC9ccysvKSxuPWUuaW5BcnJheShpLHMpOy0xIT09biYmcy5zcGxpY2UobiwxKSx0LnJlbW92ZURhdGEoInVpLXRvb2x0aXAtaWQiKSxzPWUudHJpbShzLmpvaW4oIiAiKSkscz90LmF0dHIoImFyaWEtZGVzY3JpYmVkYnkiLHMpOnQucmVtb3ZlQXR0cigiYXJpYS1kZXNjcmliZWRieSIpfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5fb24oe21vdXNlb3Zlcjoib3BlbiIsZm9jdXNpbjoib3BlbiJ9KSx0aGlzLnRvb2x0aXBzPXt9LHRoaXMucGFyZW50cz17fSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuX2Rpc2FibGUoKSx0aGlzLmxpdmVSZWdpb249ZSgiPGRpdj4iKS5hdHRyKHtyb2xlOiJsb2ciLCJhcmlhLWxpdmUiOiJhc3NlcnRpdmUiLCJhcmlhLXJlbGV2YW50IjoiYWRkaXRpb25zIn0pLmFkZENsYXNzKCJ1aS1oZWxwZXItaGlkZGVuLWFjY2Vzc2libGUiKS5hcHBlbmRUbyh0aGlzLmRvY3VtZW50WzBdLmJvZHkpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKHQsaSl7dmFyIHM9dGhpcztyZXR1cm4iZGlzYWJsZWQiPT09dD8odGhpc1tpPyJfZGlzYWJsZSI6Il9lbmFibGUiXSgpLHRoaXMub3B0aW9uc1t0XT1pLHZvaWQgMCk6KHRoaXMuX3N1cGVyKHQsaSksImNvbnRlbnQiPT09dCYmZS5lYWNoKHRoaXMudG9vbHRpcHMsZnVuY3Rpb24oZSx0KXtzLl91cGRhdGVDb250ZW50KHQuZWxlbWVudCl9KSx2b2lkIDApfSxfZGlzYWJsZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7ZS5lYWNoKHRoaXMudG9vbHRpcHMsZnVuY3Rpb24oaSxzKXt2YXIgbj1lLkV2ZW50KCJibHVyIik7bi50YXJnZXQ9bi5jdXJyZW50VGFyZ2V0PXMuZWxlbWVudFswXSx0LmNsb3NlKG4sITApfSksdGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyk7dC5pcygiW3RpdGxlXSIpJiZ0LmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiLHQuYXR0cigidGl0bGUiKSkucmVtb3ZlQXR0cigidGl0bGUiKX0pfSxfZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyk7dC5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIikmJnQuYXR0cigidGl0bGUiLHQuZGF0YSgidWktdG9vbHRpcC10aXRsZSIpKX0pfSxvcGVuOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMscz1lKHQ/dC50YXJnZXQ6dGhpcy5lbGVtZW50KS5jbG9zZXN0KHRoaXMub3B0aW9ucy5pdGVtcyk7cy5sZW5ndGgmJiFzLmRhdGEoInVpLXRvb2x0aXAtaWQiKSYmKHMuYXR0cigidGl0bGUiKSYmcy5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIixzLmF0dHIoInRpdGxlIikpLHMuZGF0YSgidWktdG9vbHRpcC1vcGVuIiwhMCksdCYmIm1vdXNlb3ZlciI9PT10LnR5cGUmJnMucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXt2YXIgdCxzPWUodGhpcyk7cy5kYXRhKCJ1aS10b29sdGlwLW9wZW4iKSYmKHQ9ZS5FdmVudCgiYmx1ciIpLHQudGFyZ2V0PXQuY3VycmVudFRhcmdldD10aGlzLGkuY2xvc2UodCwhMCkpLHMuYXR0cigidGl0bGUiKSYmKHMudW5pcXVlSWQoKSxpLnBhcmVudHNbdGhpcy5pZF09e2VsZW1lbnQ6dGhpcyx0aXRsZTpzLmF0dHIoInRpdGxlIil9LHMuYXR0cigidGl0bGUiLCIiKSl9KSx0aGlzLl9yZWdpc3RlckNsb3NlSGFuZGxlcnModCxzKSx0aGlzLl91cGRhdGVDb250ZW50KHMsdCkpfSxfdXBkYXRlQ29udGVudDpmdW5jdGlvbihlLHQpe3ZhciBpLHM9dGhpcy5vcHRpb25zLmNvbnRlbnQsbj10aGlzLGE9dD90LnR5cGU6bnVsbDtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHM/dGhpcy5fb3Blbih0LGUscyk6KGk9cy5jYWxsKGVbMF0sZnVuY3Rpb24oaSl7bi5fZGVsYXkoZnVuY3Rpb24oKXtlLmRhdGEoInVpLXRvb2x0aXAtb3BlbiIpJiYodCYmKHQudHlwZT1hKSx0aGlzLl9vcGVuKHQsZSxpKSl9KX0pLGkmJnRoaXMuX29wZW4odCxlLGkpLHZvaWQgMCl9LF9vcGVuOmZ1bmN0aW9uKHQsaSxzKXtmdW5jdGlvbiBuKGUpe2wub2Y9ZSxvLmlzKCI6aGlkZGVuIil8fG8ucG9zaXRpb24obCl9dmFyIGEsbyxyLGgsbD1lLmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pO2lmKHMpe2lmKGE9dGhpcy5fZmluZChpKSlyZXR1cm4gYS50b29sdGlwLmZpbmQoIi51aS10b29sdGlwLWNvbnRlbnQiKS5odG1sKHMpLHZvaWQgMDtpLmlzKCJbdGl0bGVdIikmJih0JiYibW91c2VvdmVyIj09PXQudHlwZT9pLmF0dHIoInRpdGxlIiwiIik6aS5yZW1vdmVBdHRyKCJ0aXRsZSIpKSxhPXRoaXMuX3Rvb2x0aXAoaSksbz1hLnRvb2x0aXAsdGhpcy5fYWRkRGVzY3JpYmVkQnkoaSxvLmF0dHIoImlkIikpLG8uZmluZCgiLnVpLXRvb2x0aXAtY29udGVudCIpLmh0bWwocyksdGhpcy5saXZlUmVnaW9uLmNoaWxkcmVuKCkuaGlkZSgpLHMuY2xvbmU/KGg9cy5jbG9uZSgpLGgucmVtb3ZlQXR0cigiaWQiKS5maW5kKCJbaWRdIikucmVtb3ZlQXR0cigiaWQiKSk6aD1zLGUoIjxkaXY+IikuaHRtbChoKS5hcHBlbmRUbyh0aGlzLmxpdmVSZWdpb24pLHRoaXMub3B0aW9ucy50cmFjayYmdCYmL15tb3VzZS8udGVzdCh0LnR5cGUpPyh0aGlzLl9vbih0aGlzLmRvY3VtZW50LHttb3VzZW1vdmU6bn0pLG4odCkpOm8ucG9zaXRpb24oZS5leHRlbmQoe29mOml9LHRoaXMub3B0aW9ucy5wb3NpdGlvbikpLG8uaGlkZSgpLHRoaXMuX3Nob3cobyx0aGlzLm9wdGlvbnMuc2hvdyksdGhpcy5vcHRpb25zLnNob3cmJnRoaXMub3B0aW9ucy5zaG93LmRlbGF5JiYocj10aGlzLmRlbGF5ZWRTaG93PXNldEludGVydmFsKGZ1bmN0aW9uKCl7by5pcygiOnZpc2libGUiKSYmKG4obC5vZiksY2xlYXJJbnRlcnZhbChyKSl9LGUuZnguaW50ZXJ2YWwpKSx0aGlzLl90cmlnZ2VyKCJvcGVuIix0LHt0b29sdGlwOm99KX19LF9yZWdpc3RlckNsb3NlSGFuZGxlcnM6ZnVuY3Rpb24odCxpKXt2YXIgcz17a2V5dXA6ZnVuY3Rpb24odCl7aWYodC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLkVTQ0FQRSl7dmFyIHM9ZS5FdmVudCh0KTtzLmN1cnJlbnRUYXJnZXQ9aVswXSx0aGlzLmNsb3NlKHMsITApfX19O2lbMF0hPT10aGlzLmVsZW1lbnRbMF0mJihzLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuX3JlbW92ZVRvb2x0aXAodGhpcy5fZmluZChpKS50b29sdGlwKX0pLHQmJiJtb3VzZW92ZXIiIT09dC50eXBlfHwocy5tb3VzZWxlYXZlPSJjbG9zZSIpLHQmJiJmb2N1c2luIiE9PXQudHlwZXx8KHMuZm9jdXNvdXQ9ImNsb3NlIiksdGhpcy5fb24oITAsaSxzKX0sY2xvc2U6ZnVuY3Rpb24odCl7dmFyIGkscz10aGlzLG49ZSh0P3QuY3VycmVudFRhcmdldDp0aGlzLmVsZW1lbnQpLGE9dGhpcy5fZmluZChuKTtyZXR1cm4gYT8oaT1hLnRvb2x0aXAsYS5jbG9zaW5nfHwoY2xlYXJJbnRlcnZhbCh0aGlzLmRlbGF5ZWRTaG93KSxuLmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiKSYmIW4uYXR0cigidGl0bGUiKSYmbi5hdHRyKCJ0aXRsZSIsbi5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIikpLHRoaXMuX3JlbW92ZURlc2NyaWJlZEJ5KG4pLGEuaGlkaW5nPSEwLGkuc3RvcCghMCksdGhpcy5faGlkZShpLHRoaXMub3B0aW9ucy5oaWRlLGZ1bmN0aW9uKCl7cy5fcmVtb3ZlVG9vbHRpcChlKHRoaXMpKX0pLG4ucmVtb3ZlRGF0YSgidWktdG9vbHRpcC1vcGVuIiksdGhpcy5fb2ZmKG4sIm1vdXNlbGVhdmUgZm9jdXNvdXQga2V5dXAiKSxuWzBdIT09dGhpcy5lbGVtZW50WzBdJiZ0aGlzLl9vZmYobiwicmVtb3ZlIiksdGhpcy5fb2ZmKHRoaXMuZG9jdW1lbnQsIm1vdXNlbW92ZSIpLHQmJiJtb3VzZWxlYXZlIj09PXQudHlwZSYmZS5lYWNoKHRoaXMucGFyZW50cyxmdW5jdGlvbih0LGkpe2UoaS5lbGVtZW50KS5hdHRyKCJ0aXRsZSIsaS50aXRsZSksZGVsZXRlIHMucGFyZW50c1t0XX0pLGEuY2xvc2luZz0hMCx0aGlzLl90cmlnZ2VyKCJjbG9zZSIsdCx7dG9vbHRpcDppfSksYS5oaWRpbmd8fChhLmNsb3Npbmc9ITEpKSx2b2lkIDApOihuLnJlbW92ZURhdGEoInVpLXRvb2x0aXAtb3BlbiIpLHZvaWQgMCl9LF90b29sdGlwOmZ1bmN0aW9uKHQpe3ZhciBpPWUoIjxkaXY+IikuYXR0cigicm9sZSIsInRvb2x0aXAiKS5hZGRDbGFzcygidWktdG9vbHRpcCB1aS13aWRnZXQgdWktY29ybmVyLWFsbCB1aS13aWRnZXQtY29udGVudCAiKyh0aGlzLm9wdGlvbnMudG9vbHRpcENsYXNzfHwiIikpLHM9aS51bmlxdWVJZCgpLmF0dHIoImlkIik7cmV0dXJuIGUoIjxkaXY+IikuYWRkQ2xhc3MoInVpLXRvb2x0aXAtY29udGVudCIpLmFwcGVuZFRvKGkpLGkuYXBwZW5kVG8odGhpcy5kb2N1bWVudFswXS5ib2R5KSx0aGlzLnRvb2x0aXBzW3NdPXtlbGVtZW50OnQsdG9vbHRpcDppfX0sX2ZpbmQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhKCJ1aS10b29sdGlwLWlkIik7cmV0dXJuIHQ/dGhpcy50b29sdGlwc1t0XTpudWxsfSxfcmVtb3ZlVG9vbHRpcDpmdW5jdGlvbihlKXtlLnJlbW92ZSgpLGRlbGV0ZSB0aGlzLnRvb2x0aXBzW2UuYXR0cigiaWQiKV19LF9kZXN0cm95OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztlLmVhY2godGhpcy50b29sdGlwcyxmdW5jdGlvbihpLHMpe3ZhciBuPWUuRXZlbnQoImJsdXIiKSxhPXMuZWxlbWVudDtuLnRhcmdldD1uLmN1cnJlbnRUYXJnZXQ9YVswXSx0LmNsb3NlKG4sITApLGUoIiMiK2kpLnJlbW92ZSgpLGEuZGF0YSgidWktdG9vbHRpcC10aXRsZSIpJiYoYS5hdHRyKCJ0aXRsZSIpfHxhLmF0dHIoInRpdGxlIixhLmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiKSksYS5yZW1vdmVEYXRhKCJ1aS10b29sdGlwLXRpdGxlIikpfSksdGhpcy5saXZlUmVnaW9uLnJlbW92ZSgpfX0pO3ZhciBjPSJ1aS1lZmZlY3RzLSIscD1lO2UuZWZmZWN0cz17ZWZmZWN0Ont9fSxmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGkoZSx0LGkpe3ZhciBzPWRbdC50eXBlXXx8e307cmV0dXJuIG51bGw9PWU/aXx8IXQuZGVmP251bGw6dC5kZWY6KGU9cy5mbG9vcj9+fmU6cGFyc2VGbG9hdChlKSxpc05hTihlKT90LmRlZjpzLm1vZD8oZStzLm1vZCklcy5tb2Q6MD5lPzA6ZT5zLm1heD9zLm1heDplKX1mdW5jdGlvbiBzKGkpe3ZhciBzPWwoKSxuPXMuX3JnYmE9W107cmV0dXJuIGk9aS50b0xvd2VyQ2FzZSgpLGYoaCxmdW5jdGlvbihlLGEpe3ZhciBvLHI9YS5yZS5leGVjKGkpLGg9ciYmYS5wYXJzZShyKSxsPWEuc3BhY2V8fCJyZ2JhIjtyZXR1cm4gaD8obz1zW2xdKGgpLHNbdVtsXS5jYWNoZV09b1t1W2xdLmNhY2hlXSxuPXMuX3JnYmE9by5fcmdiYSwhMSk6dH0pLG4ubGVuZ3RoPygiMCwwLDAsMCI9PT1uLmpvaW4oKSYmZS5leHRlbmQobixhLnRyYW5zcGFyZW50KSxzKTphW2ldfWZ1bmN0aW9uIG4oZSx0LGkpe3JldHVybiBpPShpKzEpJTEsMT42Kmk/ZSs2Kih0LWUpKmk6MT4yKmk/dDoyPjMqaT9lKzYqKHQtZSkqKDIvMy1pKTplfXZhciBhLG89ImJhY2tncm91bmRDb2xvciBib3JkZXJCb3R0b21Db2xvciBib3JkZXJMZWZ0Q29sb3IgYm9yZGVyUmlnaHRDb2xvciBib3JkZXJUb3BDb2xvciBjb2xvciBjb2x1bW5SdWxlQ29sb3Igb3V0bGluZUNvbG9yIHRleHREZWNvcmF0aW9uQ29sb3IgdGV4dEVtcGhhc2lzQ29sb3IiLHI9L14oW1wtK10pPVxzKihcZCtcLj9cZCopLyxoPVt7cmU6L3JnYmE/XChccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pXHMqLFxzKihcZHsxLDN9KVxzKig/OixccyooXGQ/KD86XC5cZCspPylccyopP1wpLyxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bZVsxXSxlWzJdLGVbM10sZVs0XV19fSx7cmU6L3JnYmE/XChccyooXGQrKD86XC5cZCspPylcJVxzKixccyooXGQrKD86XC5cZCspPylcJVxzKixccyooXGQrKD86XC5cZCspPylcJVxzKig/OixccyooXGQ/KD86XC5cZCspPylccyopP1wpLyxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bMi41NSplWzFdLDIuNTUqZVsyXSwyLjU1KmVbM10sZVs0XV19fSx7cmU6LyMoW2EtZjAtOV17Mn0pKFthLWYwLTldezJ9KShbYS1mMC05XXsyfSkvLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltwYXJzZUludChlWzFdLDE2KSxwYXJzZUludChlWzJdLDE2KSxwYXJzZUludChlWzNdLDE2KV19fSx7cmU6LyMoW2EtZjAtOV0pKFthLWYwLTldKShbYS1mMC05XSkvLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltwYXJzZUludChlWzFdK2VbMV0sMTYpLHBhcnNlSW50KGVbMl0rZVsyXSwxNikscGFyc2VJbnQoZVszXStlWzNdLDE2KV19fSx7cmU6L2hzbGE/XChccyooXGQrKD86XC5cZCspPylccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyooPzosXHMqKFxkPyg/OlwuXGQrKT8pXHMqKT9cKS8sc3BhY2U6ImhzbGEiLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltlWzFdLGVbMl0vMTAwLGVbM10vMTAwLGVbNF1dfX1dLGw9ZS5Db2xvcj1mdW5jdGlvbih0LGkscyxuKXtyZXR1cm4gbmV3IGUuQ29sb3IuZm4ucGFyc2UodCxpLHMsbil9LHU9e3JnYmE6e3Byb3BzOntyZWQ6e2lkeDowLHR5cGU6ImJ5dGUifSxncmVlbjp7aWR4OjEsdHlwZToiYnl0ZSJ9LGJsdWU6e2lkeDoyLHR5cGU6ImJ5dGUifX19LGhzbGE6e3Byb3BzOntodWU6e2lkeDowLHR5cGU6ImRlZ3JlZXMifSxzYXR1cmF0aW9uOntpZHg6MSx0eXBlOiJwZXJjZW50In0sbGlnaHRuZXNzOntpZHg6Mix0eXBlOiJwZXJjZW50In19fX0sZD17ImJ5dGUiOntmbG9vcjohMCxtYXg6MjU1fSxwZXJjZW50OnttYXg6MX0sZGVncmVlczp7bW9kOjM2MCxmbG9vcjohMH19LGM9bC5zdXBwb3J0PXt9LHA9ZSgiPHA+IilbMF0sZj1lLmVhY2g7cC5zdHlsZS5jc3NUZXh0PSJiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMSwxLDEsLjUpIixjLnJnYmE9cC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IuaW5kZXhPZigicmdiYSIpPi0xLGYodSxmdW5jdGlvbihlLHQpe3QuY2FjaGU9Il8iK2UsdC5wcm9wcy5hbHBoYT17aWR4OjMsdHlwZToicGVyY2VudCIsZGVmOjF9fSksbC5mbj1lLmV4dGVuZChsLnByb3RvdHlwZSx7cGFyc2U6ZnVuY3Rpb24obixvLHIsaCl7aWYobj09PXQpcmV0dXJuIHRoaXMuX3JnYmE9W251bGwsbnVsbCxudWxsLG51bGxdLHRoaXM7KG4uanF1ZXJ5fHxuLm5vZGVUeXBlKSYmKG49ZShuKS5jc3Mobyksbz10KTt2YXIgZD10aGlzLGM9ZS50eXBlKG4pLHA9dGhpcy5fcmdiYT1bXTtyZXR1cm4gbyE9PXQmJihuPVtuLG8scixoXSxjPSJhcnJheSIpLCJzdHJpbmciPT09Yz90aGlzLnBhcnNlKHMobil8fGEuX2RlZmF1bHQpOiJhcnJheSI9PT1jPyhmKHUucmdiYS5wcm9wcyxmdW5jdGlvbihlLHQpe3BbdC5pZHhdPWkoblt0LmlkeF0sdCl9KSx0aGlzKToib2JqZWN0Ij09PWM/KG4gaW5zdGFuY2VvZiBsP2YodSxmdW5jdGlvbihlLHQpe25bdC5jYWNoZV0mJihkW3QuY2FjaGVdPW5bdC5jYWNoZV0uc2xpY2UoKSl9KTpmKHUsZnVuY3Rpb24odCxzKXt2YXIgYT1zLmNhY2hlO2Yocy5wcm9wcyxmdW5jdGlvbihlLHQpe2lmKCFkW2FdJiZzLnRvKXtpZigiYWxwaGEiPT09ZXx8bnVsbD09bltlXSlyZXR1cm47ZFthXT1zLnRvKGQuX3JnYmEpfWRbYV1bdC5pZHhdPWkobltlXSx0LCEwKX0pLGRbYV0mJjA+ZS5pbkFycmF5KG51bGwsZFthXS5zbGljZSgwLDMpKSYmKGRbYV1bM109MSxzLmZyb20mJihkLl9yZ2JhPXMuZnJvbShkW2FdKSkpfSksdGhpcyk6dH0saXM6ZnVuY3Rpb24oZSl7dmFyIGk9bChlKSxzPSEwLG49dGhpcztyZXR1cm4gZih1LGZ1bmN0aW9uKGUsYSl7dmFyIG8scj1pW2EuY2FjaGVdO3JldHVybiByJiYobz1uW2EuY2FjaGVdfHxhLnRvJiZhLnRvKG4uX3JnYmEpfHxbXSxmKGEucHJvcHMsZnVuY3Rpb24oZSxpKXtyZXR1cm4gbnVsbCE9cltpLmlkeF0/cz1yW2kuaWR4XT09PW9baS5pZHhdOnR9KSksc30pLHN9LF9zcGFjZTpmdW5jdGlvbigpe3ZhciBlPVtdLHQ9dGhpcztyZXR1cm4gZih1LGZ1bmN0aW9uKGkscyl7dFtzLmNhY2hlXSYmZS5wdXNoKGkpfSksZS5wb3AoKX0sdHJhbnNpdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBzPWwoZSksbj1zLl9zcGFjZSgpLGE9dVtuXSxvPTA9PT10aGlzLmFscGhhKCk/bCgidHJhbnNwYXJlbnQiKTp0aGlzLHI9b1thLmNhY2hlXXx8YS50byhvLl9yZ2JhKSxoPXIuc2xpY2UoKTtyZXR1cm4gcz1zW2EuY2FjaGVdLGYoYS5wcm9wcyxmdW5jdGlvbihlLG4pe3ZhciBhPW4uaWR4LG89clthXSxsPXNbYV0sdT1kW24udHlwZV18fHt9O251bGwhPT1sJiYobnVsbD09PW8/aFthXT1sOih1Lm1vZCYmKGwtbz51Lm1vZC8yP28rPXUubW9kOm8tbD51Lm1vZC8yJiYoby09dS5tb2QpKSxoW2FdPWkoKGwtbykqdCtvLG4pKSl9KSx0aGlzW25dKGgpfSxibGVuZDpmdW5jdGlvbih0KXtpZigxPT09dGhpcy5fcmdiYVszXSlyZXR1cm4gdGhpczt2YXIgaT10aGlzLl9yZ2JhLnNsaWNlKCkscz1pLnBvcCgpLG49bCh0KS5fcmdiYTtyZXR1cm4gbChlLm1hcChpLGZ1bmN0aW9uKGUsdCl7cmV0dXJuKDEtcykqblt0XStzKmV9KSl9LHRvUmdiYVN0cmluZzpmdW5jdGlvbigpe3ZhciB0PSJyZ2JhKCIsaT1lLm1hcCh0aGlzLl9yZ2JhLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWU/dD4yPzE6MDplfSk7cmV0dXJuIDE9PT1pWzNdJiYoaS5wb3AoKSx0PSJyZ2IoIiksdCtpLmpvaW4oKSsiKSJ9LHRvSHNsYVN0cmluZzpmdW5jdGlvbigpe3ZhciB0PSJoc2xhKCIsaT1lLm1hcCh0aGlzLmhzbGEoKSxmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1lJiYoZT10PjI/MTowKSx0JiYzPnQmJihlPU1hdGgucm91bmQoMTAwKmUpKyIlIiksZX0pO3JldHVybiAxPT09aVszXSYmKGkucG9wKCksdD0iaHNsKCIpLHQraS5qb2luKCkrIikifSx0b0hleFN0cmluZzpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9yZ2JhLnNsaWNlKCkscz1pLnBvcCgpO3JldHVybiB0JiZpLnB1c2gofn4oMjU1KnMpKSwiIyIrZS5tYXAoaSxmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8MCkudG9TdHJpbmcoMTYpLDE9PT1lLmxlbmd0aD8iMCIrZTplfSkuam9pbigiIil9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl9yZ2JhWzNdPyJ0cmFuc3BhcmVudCI6dGhpcy50b1JnYmFTdHJpbmcoKX19KSxsLmZuLnBhcnNlLnByb3RvdHlwZT1sLmZuLHUuaHNsYS50bz1mdW5jdGlvbihlKXtpZihudWxsPT1lWzBdfHxudWxsPT1lWzFdfHxudWxsPT1lWzJdKXJldHVybltudWxsLG51bGwsbnVsbCxlWzNdXTt2YXIgdCxpLHM9ZVswXS8yNTUsbj1lWzFdLzI1NSxhPWVbMl0vMjU1LG89ZVszXSxyPU1hdGgubWF4KHMsbixhKSxoPU1hdGgubWluKHMsbixhKSxsPXItaCx1PXIraCxkPS41KnU7cmV0dXJuIHQ9aD09PXI/MDpzPT09cj82MCoobi1hKS9sKzM2MDpuPT09cj82MCooYS1zKS9sKzEyMDo2MCoocy1uKS9sKzI0MCxpPTA9PT1sPzA6LjU+PWQ/bC91OmwvKDItdSksW01hdGgucm91bmQodCklMzYwLGksZCxudWxsPT1vPzE6b119LHUuaHNsYS5mcm9tPWZ1bmN0aW9uKGUpe2lmKG51bGw9PWVbMF18fG51bGw9PWVbMV18fG51bGw9PWVbMl0pcmV0dXJuW251bGwsbnVsbCxudWxsLGVbM11dO3ZhciB0PWVbMF0vMzYwLGk9ZVsxXSxzPWVbMl0sYT1lWzNdLG89LjU+PXM/cyooMStpKTpzK2ktcyppLHI9MipzLW87cmV0dXJuW01hdGgucm91bmQoMjU1Km4ocixvLHQrMS8zKSksTWF0aC5yb3VuZCgyNTUqbihyLG8sdCkpLE1hdGgucm91bmQoMjU1Km4ocixvLHQtMS8zKSksYV19LGYodSxmdW5jdGlvbihzLG4pe3ZhciBhPW4ucHJvcHMsbz1uLmNhY2hlLGg9bi50byx1PW4uZnJvbTtsLmZuW3NdPWZ1bmN0aW9uKHMpe2lmKGgmJiF0aGlzW29dJiYodGhpc1tvXT1oKHRoaXMuX3JnYmEpKSxzPT09dClyZXR1cm4gdGhpc1tvXS5zbGljZSgpO3ZhciBuLHI9ZS50eXBlKHMpLGQ9ImFycmF5Ij09PXJ8fCJvYmplY3QiPT09cj9zOmFyZ3VtZW50cyxjPXRoaXNbb10uc2xpY2UoKTtyZXR1cm4gZihhLGZ1bmN0aW9uKGUsdCl7dmFyIHM9ZFsib2JqZWN0Ij09PXI/ZTp0LmlkeF07bnVsbD09cyYmKHM9Y1t0LmlkeF0pLGNbdC5pZHhdPWkocyx0KX0pLHU/KG49bCh1KGMpKSxuW29dPWMsbik6bChjKX0sZihhLGZ1bmN0aW9uKHQsaSl7bC5mblt0XXx8KGwuZm5bdF09ZnVuY3Rpb24obil7dmFyIGEsbz1lLnR5cGUobiksaD0iYWxwaGEiPT09dD90aGlzLl9oc2xhPyJoc2xhIjoicmdiYSI6cyxsPXRoaXNbaF0oKSx1PWxbaS5pZHhdO3JldHVybiJ1bmRlZmluZWQiPT09bz91OigiZnVuY3Rpb24iPT09byYmKG49bi5jYWxsKHRoaXMsdSksbz1lLnR5cGUobikpLG51bGw9PW4mJmkuZW1wdHk/dGhpczooInN0cmluZyI9PT1vJiYoYT1yLmV4ZWMobiksYSYmKG49dStwYXJzZUZsb2F0KGFbMl0pKigiKyI9PT1hWzFdPzE6LTEpKSksbFtpLmlkeF09bix0aGlzW2hdKGwpKSl9KX0pfSksbC5ob29rPWZ1bmN0aW9uKHQpe3ZhciBpPXQuc3BsaXQoIiAiKTtmKGksZnVuY3Rpb24odCxpKXtlLmNzc0hvb2tzW2ldPXtzZXQ6ZnVuY3Rpb24odCxuKXt2YXIgYSxvLHI9IiI7aWYoInRyYW5zcGFyZW50IiE9PW4mJigic3RyaW5nIiE9PWUudHlwZShuKXx8KGE9cyhuKSkpKXtpZihuPWwoYXx8biksIWMucmdiYSYmMSE9PW4uX3JnYmFbM10pe2ZvcihvPSJiYWNrZ3JvdW5kQ29sb3IiPT09aT90LnBhcmVudE5vZGU6dDsoIiI9PT1yfHwidHJhbnNwYXJlbnQiPT09cikmJm8mJm8uc3R5bGU7KXRyeXtyPWUuY3NzKG8sImJhY2tncm91bmRDb2xvciIpLG89by5wYXJlbnROb2RlfWNhdGNoKGgpe31uPW4uYmxlbmQociYmInRyYW5zcGFyZW50IiE9PXI/cjoiX2RlZmF1bHQiKX1uPW4udG9SZ2JhU3RyaW5nKCl9dHJ5e3Quc3R5bGVbaV09bn1jYXRjaChoKXt9fX0sZS5meC5zdGVwW2ldPWZ1bmN0aW9uKHQpe3QuY29sb3JJbml0fHwodC5zdGFydD1sKHQuZWxlbSxpKSx0LmVuZD1sKHQuZW5kKSx0LmNvbG9ySW5pdD0hMCksZS5jc3NIb29rc1tpXS5zZXQodC5lbGVtLHQuc3RhcnQudHJhbnNpdGlvbih0LmVuZCx0LnBvcykpfX0pfSxsLmhvb2sobyksZS5jc3NIb29rcy5ib3JkZXJDb2xvcj17ZXhwYW5kOmZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBmKFsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sZnVuY3Rpb24oaSxzKXt0WyJib3JkZXIiK3MrIkNvbG9yIl09ZX0pLHR9fSxhPWUuQ29sb3IubmFtZXM9e2FxdWE6IiMwMGZmZmYiLGJsYWNrOiIjMDAwMDAwIixibHVlOiIjMDAwMGZmIixmdWNoc2lhOiIjZmYwMGZmIixncmF5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsbGltZToiIzAwZmYwMCIsbWFyb29uOiIjODAwMDAwIixuYXZ5OiIjMDAwMDgwIixvbGl2ZToiIzgwODAwMCIscHVycGxlOiIjODAwMDgwIixyZWQ6IiNmZjAwMDAiLHNpbHZlcjoiI2MwYzBjMCIsdGVhbDoiIzAwODA4MCIsd2hpdGU6IiNmZmZmZmYiLHllbGxvdzoiI2ZmZmYwMCIsdHJhbnNwYXJlbnQ6W251bGwsbnVsbCxudWxsLDBdLF9kZWZhdWx0OiIjZmZmZmZmIn19KHApLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgaSxzLG49dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3P3Qub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCk6dC5jdXJyZW50U3R5bGUsYT17fTtpZihuJiZuLmxlbmd0aCYmblswXSYmbltuWzBdXSlmb3Iocz1uLmxlbmd0aDtzLS07KWk9bltzXSwic3RyaW5nIj09dHlwZW9mIG5baV0mJihhW2UuY2FtZWxDYXNlKGkpXT1uW2ldKTtlbHNlIGZvcihpIGluIG4pInN0cmluZyI9PXR5cGVvZiBuW2ldJiYoYVtpXT1uW2ldKTtyZXR1cm4gYX1mdW5jdGlvbiBpKHQsaSl7dmFyIHMsYSxvPXt9O2ZvcihzIGluIGkpYT1pW3NdLHRbc10hPT1hJiYobltzXXx8KGUuZnguc3RlcFtzXXx8IWlzTmFOKHBhcnNlRmxvYXQoYSkpKSYmKG9bc109YSkpO3JldHVybiBvfXZhciBzPVsiYWRkIiwicmVtb3ZlIiwidG9nZ2xlIl0sbj17Ym9yZGVyOjEsYm9yZGVyQm90dG9tOjEsYm9yZGVyQ29sb3I6MSxib3JkZXJMZWZ0OjEsYm9yZGVyUmlnaHQ6MSxib3JkZXJUb3A6MSxib3JkZXJXaWR0aDoxLG1hcmdpbjoxLHBhZGRpbmc6MX07ZS5lYWNoKFsiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlckJvdHRvbVN0eWxlIiwiYm9yZGVyVG9wU3R5bGUiXSxmdW5jdGlvbih0LGkpe2UuZnguc3RlcFtpXT1mdW5jdGlvbihlKXsoIm5vbmUiIT09ZS5lbmQmJiFlLnNldEF0dHJ8fDE9PT1lLnBvcyYmIWUuc2V0QXR0cikmJihwLnN0eWxlKGUuZWxlbSxpLGUuZW5kKSxlLnNldEF0dHI9ITApfX0pLGUuZm4uYWRkQmFja3x8KGUuZm4uYWRkQmFjaz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9KSxlLmVmZmVjdHMuYW5pbWF0ZUNsYXNzPWZ1bmN0aW9uKG4sYSxvLHIpe3ZhciBoPWUuc3BlZWQoYSxvLHIpO3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGEsbz1lKHRoaXMpLHI9by5hdHRyKCJjbGFzcyIpfHwiIixsPWguY2hpbGRyZW4/by5maW5kKCIqIikuYWRkQmFjaygpOm87bD1sLm1hcChmdW5jdGlvbigpe3ZhciBpPWUodGhpcyk7cmV0dXJue2VsOmksc3RhcnQ6dCh0aGlzKX19KSxhPWZ1bmN0aW9uKCl7ZS5lYWNoKHMsZnVuY3Rpb24oZSx0KXtuW3RdJiZvW3QrIkNsYXNzIl0oblt0XSl9KX0sYSgpLGw9bC5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmQ9dCh0aGlzLmVsWzBdKSx0aGlzLmRpZmY9aSh0aGlzLnN0YXJ0LHRoaXMuZW5kKSx0aGlzfSksby5hdHRyKCJjbGFzcyIsciksbD1sLm1hcChmdW5jdGlvbigpe3ZhciB0PXRoaXMsaT1lLkRlZmVycmVkKCkscz1lLmV4dGVuZCh7fSxoLHtxdWV1ZTohMSxjb21wbGV0ZTpmdW5jdGlvbigpe2kucmVzb2x2ZSh0KX19KTtyZXR1cm4gdGhpcy5lbC5hbmltYXRlKHRoaXMuZGlmZixzKSxpLnByb21pc2UoKX0pLGUud2hlbi5hcHBseShlLGwuZ2V0KCkpLmRvbmUoZnVuY3Rpb24oKXthKCksZS5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWw7ZS5lYWNoKHRoaXMuZGlmZixmdW5jdGlvbihlKXt0LmNzcyhlLCIiKX0pfSksaC5jb21wbGV0ZS5jYWxsKG9bMF0pfSl9KX0sZS5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpLHMsbixhKXtyZXR1cm4gcz9lLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyx7YWRkOml9LHMsbixhKTp0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KGUuZm4uYWRkQ2xhc3MpLHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpLHMsbixhKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP2UuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHtyZW1vdmU6aX0scyxuLGEpOnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oZS5mbi5yZW1vdmVDbGFzcyksdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkscyxuLGEsbyl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2Ygc3x8dm9pZCAwPT09cz9uP2UuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHM/e2FkZDppfTp7cmVtb3ZlOml9LG4sYSxvKTp0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTplLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyx7dG9nZ2xlOml9LHMsbixhKX19KGUuZm4udG9nZ2xlQ2xhc3MpLHN3aXRjaENsYXNzOmZ1bmN0aW9uKHQsaSxzLG4sYSl7cmV0dXJuIGUuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHthZGQ6aSxyZW1vdmU6dH0scyxuLGEpfX0pfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGkscyxuKXtyZXR1cm4gZS5pc1BsYWluT2JqZWN0KHQpJiYoaT10LHQ9dC5lZmZlY3QpLHQ9e2VmZmVjdDp0fSxudWxsPT1pJiYoaT17fSksZS5pc0Z1bmN0aW9uKGkpJiYobj1pLHM9bnVsbCxpPXt9KSwoIm51bWJlciI9PXR5cGVvZiBpfHxlLmZ4LnNwZWVkc1tpXSkmJihuPXMscz1pLGk9e30pLGUuaXNGdW5jdGlvbihzKSYmKG49cyxzPW51bGwpLGkmJmUuZXh0ZW5kKHQsaSkscz1zfHxpLmR1cmF0aW9uLHQuZHVyYXRpb249ZS5meC5vZmY/MDoibnVtYmVyIj09dHlwZW9mIHM/czpzIGluIGUuZnguc3BlZWRzP2UuZnguc3BlZWRzW3NdOmUuZnguc3BlZWRzLl9kZWZhdWx0LHQuY29tcGxldGU9bnx8aS5jb21wbGV0ZSx0fWZ1bmN0aW9uIGkodCl7cmV0dXJuIXR8fCJudW1iZXIiPT10eXBlb2YgdHx8ZS5meC5zcGVlZHNbdF0/ITA6InN0cmluZyIhPXR5cGVvZiB0fHxlLmVmZmVjdHMuZWZmZWN0W3RdP2UuaXNGdW5jdGlvbih0KT8hMDoib2JqZWN0IiE9dHlwZW9mIHR8fHQuZWZmZWN0PyExOiEwOiEwfWUuZXh0ZW5kKGUuZWZmZWN0cyx7dmVyc2lvbjoiMS4xMS40IixzYXZlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBpPTA7dC5sZW5ndGg+aTtpKyspbnVsbCE9PXRbaV0mJmUuZGF0YShjK3RbaV0sZVswXS5zdHlsZVt0W2ldXSl9LHJlc3RvcmU6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzO2ZvcihzPTA7dC5sZW5ndGg+cztzKyspbnVsbCE9PXRbc10mJihpPWUuZGF0YShjK3Rbc10pLHZvaWQgMD09PWkmJihpPSIiKSxlLmNzcyh0W3NdLGkpKX0sc2V0TW9kZTpmdW5jdGlvbihlLHQpe3JldHVybiJ0b2dnbGUiPT09dCYmKHQ9ZS5pcygiOmhpZGRlbiIpPyJzaG93IjoiaGlkZSIpLHR9LGdldEJhc2VsaW5lOmZ1bmN0aW9uKGUsdCl7dmFyIGkscztzd2l0Y2goZVswXSl7Y2FzZSJ0b3AiOmk9MDticmVhaztjYXNlIm1pZGRsZSI6aT0uNTticmVhaztjYXNlImJvdHRvbSI6aT0xO2JyZWFrO2RlZmF1bHQ6aT1lWzBdL3QuaGVpZ2h0fXN3aXRjaChlWzFdKXtjYXNlImxlZnQiOnM9MDticmVhaztjYXNlImNlbnRlciI6cz0uNTticmVhaztjYXNlInJpZ2h0IjpzPTE7YnJlYWs7ZGVmYXVsdDpzPWVbMV0vdC53aWR0aH1yZXR1cm57eDpzLHk6aX19LGNyZWF0ZVdyYXBwZXI6ZnVuY3Rpb24odCl7aWYodC5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpKXJldHVybiB0LnBhcmVudCgpO3ZhciBpPXt3aWR0aDp0Lm91dGVyV2lkdGgoITApLGhlaWdodDp0Lm91dGVySGVpZ2h0KCEwKSwiZmxvYXQiOnQuY3NzKCJmbG9hdCIpfSxzPWUoIjxkaXY+PC9kaXY+IikuYWRkQ2xhc3MoInVpLWVmZmVjdHMtd3JhcHBlciIpLmNzcyh7Zm9udFNpemU6IjEwMCUiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLG1hcmdpbjowLHBhZGRpbmc6MH0pLG49e3dpZHRoOnQud2lkdGgoKSxoZWlnaHQ6dC5oZWlnaHQoKX0sYT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O3RyeXthLmlkfWNhdGNoKG8pe2E9ZG9jdW1lbnQuYm9keX1yZXR1cm4gdC53cmFwKHMpLCh0WzBdPT09YXx8ZS5jb250YWlucyh0WzBdLGEpKSYmZShhKS5mb2N1cygpLHM9dC5wYXJlbnQoKSwic3RhdGljIj09PXQuY3NzKCJwb3NpdGlvbiIpPyhzLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIn0pLHQuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUifSkpOihlLmV4dGVuZChpLHtwb3NpdGlvbjp0LmNzcygicG9zaXRpb24iKSx6SW5kZXg6dC5jc3MoInotaW5kZXgiKX0pLGUuZWFjaChbInRvcCIsImxlZnQiLCJib3R0b20iLCJyaWdodCJdLGZ1bmN0aW9uKGUscyl7aVtzXT10LmNzcyhzKSxpc05hTihwYXJzZUludChpW3NdLDEwKSkmJihpW3NdPSJhdXRvIil9KSx0LmNzcyh7cG9zaXRpb246InJlbGF0aXZlIix0b3A6MCxsZWZ0OjAscmlnaHQ6ImF1dG8iLGJvdHRvbToiYXV0byJ9KSksdC5jc3Mobikscy5jc3MoaSkuc2hvdygpfSxyZW1vdmVXcmFwcGVyOmZ1bmN0aW9uKHQpe3ZhciBpPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7cmV0dXJuIHQucGFyZW50KCkuaXMoIi51aS1lZmZlY3RzLXdyYXBwZXIiKSYmKHQucGFyZW50KCkucmVwbGFjZVdpdGgodCksKHRbMF09PT1pfHxlLmNvbnRhaW5zKHRbMF0saSkpJiZlKGkpLmZvY3VzKCkpLHR9LHNldFRyYW5zaXRpb246ZnVuY3Rpb24odCxpLHMsbil7cmV0dXJuIG49bnx8e30sZS5lYWNoKGksZnVuY3Rpb24oZSxpKXt2YXIgYT10LmNzc1VuaXQoaSk7YVswXT4wJiYobltpXT1hWzBdKnMrYVsxXSl9KSxufX0pLGUuZm4uZXh0ZW5kKHtlZmZlY3Q6ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKHQpe2Z1bmN0aW9uIGkoKXtlLmlzRnVuY3Rpb24oYSkmJmEuY2FsbChuWzBdKSxlLmlzRnVuY3Rpb24odCkmJnQoKX12YXIgbj1lKHRoaXMpLGE9cy5jb21wbGV0ZSxyPXMubW9kZTsobi5pcygiOmhpZGRlbiIpPyJoaWRlIj09PXI6InNob3ciPT09cik/KG5bcl0oKSxpKCkpOm8uY2FsbChuWzBdLHMsaSl9dmFyIHM9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbj1zLm1vZGUsYT1zLnF1ZXVlLG89ZS5lZmZlY3RzLmVmZmVjdFtzLmVmZmVjdF07cmV0dXJuIGUuZngub2ZmfHwhbz9uP3RoaXNbbl0ocy5kdXJhdGlvbixzLmNvbXBsZXRlKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtzLmNvbXBsZXRlJiZzLmNvbXBsZXRlLmNhbGwodGhpcyl9KTphPT09ITE/dGhpcy5lYWNoKGkpOnRoaXMucXVldWUoYXx8ImZ4IixpKX0sc2hvdzpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24ocyl7aWYoaShzKSlyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4ubW9kZT0ic2hvdyIsdGhpcy5lZmZlY3QuY2FsbCh0aGlzLG4pfX0oZS5mbi5zaG93KSxoaWRlOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihzKXtpZihpKHMpKXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbi5tb2RlPSJoaWRlIix0aGlzLmVmZmVjdC5jYWxsKHRoaXMsbil9fShlLmZuLmhpZGUpLHRvZ2dsZTpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24ocyl7aWYoaShzKXx8ImJvb2xlYW4iPT10eXBlb2YgcylyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4ubW9kZT0idG9nZ2xlIix0aGlzLmVmZmVjdC5jYWxsKHRoaXMsbil9fShlLmZuLnRvZ2dsZSksY3NzVW5pdDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLmNzcyh0KSxzPVtdO3JldHVybiBlLmVhY2goWyJlbSIsInB4IiwiJSIsInB0Il0sZnVuY3Rpb24oZSx0KXtpLmluZGV4T2YodCk+MCYmKHM9W3BhcnNlRmxvYXQoaSksdF0pfSksc319KX0oKSxmdW5jdGlvbigpe3ZhciB0PXt9O2UuZWFjaChbIlF1YWQiLCJDdWJpYyIsIlF1YXJ0IiwiUXVpbnQiLCJFeHBvIl0sZnVuY3Rpb24oZSxpKXt0W2ldPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdyh0LGUrMil9fSksZS5leHRlbmQodCx7U2luZTpmdW5jdGlvbihlKXtyZXR1cm4gMS1NYXRoLmNvcyhlKk1hdGguUEkvMil9LENpcmM6ZnVuY3Rpb24oZSl7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtZSplKX0sRWxhc3RpYzpmdW5jdGlvbihlKXtyZXR1cm4gMD09PWV8fDE9PT1lP2U6LU1hdGgucG93KDIsOCooZS0xKSkqTWF0aC5zaW4oKDgwKihlLTEpLTcuNSkqTWF0aC5QSS8xNSl9LEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIGUqZSooMyplLTIpfSxCb3VuY2U6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LGk9NDsoKHQ9TWF0aC5wb3coMiwtLWkpKS0xKS8xMT5lOyk7cmV0dXJuIDEvTWF0aC5wb3coNCwzLWkpLTcuNTYyNSpNYXRoLnBvdygoMyp0LTIpLzIyLWUsMil9fSksZS5lYWNoKHQsZnVuY3Rpb24odCxpKXtlLmVhc2luZ1siZWFzZUluIit0XT1pLGUuZWFzaW5nWyJlYXNlT3V0Iit0XT1mdW5jdGlvbihlKXtyZXR1cm4gMS1pKDEtZSl9LGUuZWFzaW5nWyJlYXNlSW5PdXQiK3RdPWZ1bmN0aW9uKGUpe3JldHVybi41PmU/aSgyKmUpLzI6MS1pKC0yKmUrMikvMn19KX0oKSxlLmVmZmVjdHMsZS5lZmZlY3RzLmVmZmVjdC5ibGluZD1mdW5jdGlvbih0LGkpe3ZhciBzLG4sYSxvPWUodGhpcykscj0vdXB8ZG93bnx2ZXJ0aWNhbC8saD0vdXB8bGVmdHx2ZXJ0aWNhbHxob3Jpem9udGFsLyxsPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJoZWlnaHQiLCJ3aWR0aCJdLHU9ZS5lZmZlY3RzLnNldE1vZGUobyx0Lm1vZGV8fCJoaWRlIiksZD10LmRpcmVjdGlvbnx8InVwIixjPXIudGVzdChkKSxwPWM/ImhlaWdodCI6IndpZHRoIixmPWM/InRvcCI6ImxlZnQiLG09aC50ZXN0KGQpLGc9e30sdj0ic2hvdyI9PT11O28ucGFyZW50KCkuaXMoIi51aS1lZmZlY3RzLXdyYXBwZXIiKT9lLmVmZmVjdHMuc2F2ZShvLnBhcmVudCgpLGwpOmUuZWZmZWN0cy5zYXZlKG8sbCksby5zaG93KCkscz1lLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihvKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSksbj1zW3BdKCksYT1wYXJzZUZsb2F0KHMuY3NzKGYpKXx8MCxnW3BdPXY/bjowLG18fChvLmNzcyhjPyJib3R0b20iOiJyaWdodCIsMCkuY3NzKGM/InRvcCI6ImxlZnQiLCJhdXRvIikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSksZ1tmXT12P2E6bithKSx2JiYocy5jc3MocCwwKSxtfHxzLmNzcyhmLGErbikpLHMuYW5pbWF0ZShnLHtkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxxdWV1ZTohMSxjb21wbGV0ZTpmdW5jdGlvbigpeyJoaWRlIj09PXUmJm8uaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKG8sbCksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIobyksaSgpCn19KX0sZS5lZmZlY3RzLmVmZmVjdC5ib3VuY2U9ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGEsbz1lKHRoaXMpLHI9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0saD1lLmVmZmVjdHMuc2V0TW9kZShvLHQubW9kZXx8ImVmZmVjdCIpLGw9ImhpZGUiPT09aCx1PSJzaG93Ij09PWgsZD10LmRpcmVjdGlvbnx8InVwIixjPXQuZGlzdGFuY2UscD10LnRpbWVzfHw1LGY9MipwKyh1fHxsPzE6MCksbT10LmR1cmF0aW9uL2YsZz10LmVhc2luZyx2PSJ1cCI9PT1kfHwiZG93biI9PT1kPyJ0b3AiOiJsZWZ0Iix5PSJ1cCI9PT1kfHwibGVmdCI9PT1kLGI9by5xdWV1ZSgpLF89Yi5sZW5ndGg7Zm9yKCh1fHxsKSYmci5wdXNoKCJvcGFjaXR5IiksZS5lZmZlY3RzLnNhdmUobyxyKSxvLnNob3coKSxlLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihvKSxjfHwoYz1vWyJ0b3AiPT09dj8ib3V0ZXJIZWlnaHQiOiJvdXRlcldpZHRoIl0oKS8zKSx1JiYoYT17b3BhY2l0eToxfSxhW3ZdPTAsby5jc3MoIm9wYWNpdHkiLDApLmNzcyh2LHk/MiotYzoyKmMpLmFuaW1hdGUoYSxtLGcpKSxsJiYoYy89TWF0aC5wb3coMixwLTEpKSxhPXt9LGFbdl09MCxzPTA7cD5zO3MrKyluPXt9LG5bdl09KHk/Ii09IjoiKz0iKStjLG8uYW5pbWF0ZShuLG0sZykuYW5pbWF0ZShhLG0sZyksYz1sPzIqYzpjLzI7bCYmKG49e29wYWNpdHk6MH0sblt2XT0oeT8iLT0iOiIrPSIpK2Msby5hbmltYXRlKG4sbSxnKSksby5xdWV1ZShmdW5jdGlvbigpe2wmJm8uaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKG8sciksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIobyksaSgpfSksXz4xJiZiLnNwbGljZS5hcHBseShiLFsxLDBdLmNvbmNhdChiLnNwbGljZShfLGYrMSkpKSxvLmRlcXVldWUoKX0sZS5lZmZlY3RzLmVmZmVjdC5jbGlwPWZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhLG89ZSh0aGlzKSxyPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJoZWlnaHQiLCJ3aWR0aCJdLGg9ZS5lZmZlY3RzLnNldE1vZGUobyx0Lm1vZGV8fCJoaWRlIiksbD0ic2hvdyI9PT1oLHU9dC5kaXJlY3Rpb258fCJ2ZXJ0aWNhbCIsZD0idmVydGljYWwiPT09dSxjPWQ/ImhlaWdodCI6IndpZHRoIixwPWQ/InRvcCI6ImxlZnQiLGY9e307ZS5lZmZlY3RzLnNhdmUobyxyKSxvLnNob3coKSxzPWUuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKG8pLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxuPSJJTUciPT09b1swXS50YWdOYW1lP3M6byxhPW5bY10oKSxsJiYobi5jc3MoYywwKSxuLmNzcyhwLGEvMikpLGZbY109bD9hOjAsZltwXT1sPzA6YS8yLG4uYW5pbWF0ZShmLHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpe2x8fG8uaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKG8sciksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIobyksaSgpfX0pfSxlLmVmZmVjdHMuZWZmZWN0LmRyb3A9ZnVuY3Rpb24odCxpKXt2YXIgcyxuPWUodGhpcyksYT1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwib3BhY2l0eSIsImhlaWdodCIsIndpZHRoIl0sbz1lLmVmZmVjdHMuc2V0TW9kZShuLHQubW9kZXx8ImhpZGUiKSxyPSJzaG93Ij09PW8saD10LmRpcmVjdGlvbnx8ImxlZnQiLGw9InVwIj09PWh8fCJkb3duIj09PWg/InRvcCI6ImxlZnQiLHU9InVwIj09PWh8fCJsZWZ0Ij09PWg/InBvcyI6Im5lZyIsZD17b3BhY2l0eTpyPzE6MH07ZS5lZmZlY3RzLnNhdmUobixhKSxuLnNob3coKSxlLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihuKSxzPXQuZGlzdGFuY2V8fG5bInRvcCI9PT1sPyJvdXRlckhlaWdodCI6Im91dGVyV2lkdGgiXSghMCkvMixyJiZuLmNzcygib3BhY2l0eSIsMCkuY3NzKGwsInBvcyI9PT11Py1zOnMpLGRbbF09KHI/InBvcyI9PT11PyIrPSI6Ii09IjoicG9zIj09PXU/Ii09IjoiKz0iKStzLG4uYW5pbWF0ZShkLHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpeyJoaWRlIj09PW8mJm4uaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKG4sYSksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIobiksaSgpfX0pfSxlLmVmZmVjdHMuZWZmZWN0LmV4cGxvZGU9ZnVuY3Rpb24odCxpKXtmdW5jdGlvbiBzKCl7Yi5wdXNoKHRoaXMpLGIubGVuZ3RoPT09ZCpjJiZuKCl9ZnVuY3Rpb24gbigpe3AuY3NzKHt2aXNpYmlsaXR5OiJ2aXNpYmxlIn0pLGUoYikucmVtb3ZlKCksbXx8cC5oaWRlKCksaSgpfXZhciBhLG8scixoLGwsdSxkPXQucGllY2VzP01hdGgucm91bmQoTWF0aC5zcXJ0KHQucGllY2VzKSk6MyxjPWQscD1lKHRoaXMpLGY9ZS5lZmZlY3RzLnNldE1vZGUocCx0Lm1vZGV8fCJoaWRlIiksbT0ic2hvdyI9PT1mLGc9cC5zaG93KCkuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikub2Zmc2V0KCksdj1NYXRoLmNlaWwocC5vdXRlcldpZHRoKCkvYykseT1NYXRoLmNlaWwocC5vdXRlckhlaWdodCgpL2QpLGI9W107Zm9yKGE9MDtkPmE7YSsrKWZvcihoPWcudG9wK2EqeSx1PWEtKGQtMSkvMixvPTA7Yz5vO28rKylyPWcubGVmdCtvKnYsbD1vLShjLTEpLzIscC5jbG9uZSgpLmFwcGVuZFRvKCJib2R5Iikud3JhcCgiPGRpdj48L2Rpdj4iKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToidmlzaWJsZSIsbGVmdDotbyp2LHRvcDotYSp5fSkucGFyZW50KCkuYWRkQ2xhc3MoInVpLWVmZmVjdHMtZXhwbG9kZSIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixvdmVyZmxvdzoiaGlkZGVuIix3aWR0aDp2LGhlaWdodDp5LGxlZnQ6cisobT9sKnY6MCksdG9wOmgrKG0/dSp5OjApLG9wYWNpdHk6bT8wOjF9KS5hbmltYXRlKHtsZWZ0OnIrKG0/MDpsKnYpLHRvcDpoKyhtPzA6dSp5KSxvcGFjaXR5Om0/MTowfSx0LmR1cmF0aW9ufHw1MDAsdC5lYXNpbmcscyl9LGUuZWZmZWN0cy5lZmZlY3QuZmFkZT1mdW5jdGlvbih0LGkpe3ZhciBzPWUodGhpcyksbj1lLmVmZmVjdHMuc2V0TW9kZShzLHQubW9kZXx8InRvZ2dsZSIpO3MuYW5pbWF0ZSh7b3BhY2l0eTpufSx7cXVldWU6ITEsZHVyYXRpb246dC5kdXJhdGlvbixlYXNpbmc6dC5lYXNpbmcsY29tcGxldGU6aX0pfSxlLmVmZmVjdHMuZWZmZWN0LmZvbGQ9ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGE9ZSh0aGlzKSxvPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJoZWlnaHQiLCJ3aWR0aCJdLHI9ZS5lZmZlY3RzLnNldE1vZGUoYSx0Lm1vZGV8fCJoaWRlIiksaD0ic2hvdyI9PT1yLGw9ImhpZGUiPT09cix1PXQuc2l6ZXx8MTUsZD0vKFswLTldKyklLy5leGVjKHUpLGM9ISF0Lmhvcml6Rmlyc3QscD1oIT09YyxmPXA/WyJ3aWR0aCIsImhlaWdodCJdOlsiaGVpZ2h0Iiwid2lkdGgiXSxtPXQuZHVyYXRpb24vMixnPXt9LHY9e307ZS5lZmZlY3RzLnNhdmUoYSxvKSxhLnNob3coKSxzPWUuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGEpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxuPXA/W3Mud2lkdGgoKSxzLmhlaWdodCgpXTpbcy5oZWlnaHQoKSxzLndpZHRoKCldLGQmJih1PXBhcnNlSW50KGRbMV0sMTApLzEwMCpuW2w/MDoxXSksaCYmcy5jc3MoYz97aGVpZ2h0OjAsd2lkdGg6dX06e2hlaWdodDp1LHdpZHRoOjB9KSxnW2ZbMF1dPWg/blswXTp1LHZbZlsxXV09aD9uWzFdOjAscy5hbmltYXRlKGcsbSx0LmVhc2luZykuYW5pbWF0ZSh2LG0sdC5lYXNpbmcsZnVuY3Rpb24oKXtsJiZhLmhpZGUoKSxlLmVmZmVjdHMucmVzdG9yZShhLG8pLGUuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGEpLGkoKX0pfSxlLmVmZmVjdHMuZWZmZWN0LmhpZ2hsaWdodD1mdW5jdGlvbih0LGkpe3ZhciBzPWUodGhpcyksbj1bImJhY2tncm91bmRJbWFnZSIsImJhY2tncm91bmRDb2xvciIsIm9wYWNpdHkiXSxhPWUuZWZmZWN0cy5zZXRNb2RlKHMsdC5tb2RlfHwic2hvdyIpLG89e2JhY2tncm91bmRDb2xvcjpzLmNzcygiYmFja2dyb3VuZENvbG9yIil9OyJoaWRlIj09PWEmJihvLm9wYWNpdHk9MCksZS5lZmZlY3RzLnNhdmUocyxuKSxzLnNob3coKS5jc3Moe2JhY2tncm91bmRJbWFnZToibm9uZSIsYmFja2dyb3VuZENvbG9yOnQuY29sb3J8fCIjZmZmZjk5In0pLmFuaW1hdGUobyx7cXVldWU6ITEsZHVyYXRpb246dC5kdXJhdGlvbixlYXNpbmc6dC5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXsiaGlkZSI9PT1hJiZzLmhpZGUoKSxlLmVmZmVjdHMucmVzdG9yZShzLG4pLGkoKX19KX0sZS5lZmZlY3RzLmVmZmVjdC5zaXplPWZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhLG89ZSh0aGlzKSxyPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJ3aWR0aCIsImhlaWdodCIsIm92ZXJmbG93Iiwib3BhY2l0eSJdLGg9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIm92ZXJmbG93Iiwib3BhY2l0eSJdLGw9WyJ3aWR0aCIsImhlaWdodCIsIm92ZXJmbG93Il0sdT1bImZvbnRTaXplIl0sZD1bImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyQm90dG9tV2lkdGgiLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLGM9WyJib3JkZXJMZWZ0V2lkdGgiLCJib3JkZXJSaWdodFdpZHRoIiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxwPWUuZWZmZWN0cy5zZXRNb2RlKG8sdC5tb2RlfHwiZWZmZWN0IiksZj10LnJlc3RvcmV8fCJlZmZlY3QiIT09cCxtPXQuc2NhbGV8fCJib3RoIixnPXQub3JpZ2lufHxbIm1pZGRsZSIsImNlbnRlciJdLHY9by5jc3MoInBvc2l0aW9uIikseT1mP3I6aCxiPXtoZWlnaHQ6MCx3aWR0aDowLG91dGVySGVpZ2h0OjAsb3V0ZXJXaWR0aDowfTsic2hvdyI9PT1wJiZvLnNob3coKSxzPXtoZWlnaHQ6by5oZWlnaHQoKSx3aWR0aDpvLndpZHRoKCksb3V0ZXJIZWlnaHQ6by5vdXRlckhlaWdodCgpLG91dGVyV2lkdGg6by5vdXRlcldpZHRoKCl9LCJ0b2dnbGUiPT09dC5tb2RlJiYic2hvdyI9PT1wPyhvLmZyb209dC50b3x8YixvLnRvPXQuZnJvbXx8cyk6KG8uZnJvbT10LmZyb218fCgic2hvdyI9PT1wP2I6cyksby50bz10LnRvfHwoImhpZGUiPT09cD9iOnMpKSxhPXtmcm9tOnt5Om8uZnJvbS5oZWlnaHQvcy5oZWlnaHQseDpvLmZyb20ud2lkdGgvcy53aWR0aH0sdG86e3k6by50by5oZWlnaHQvcy5oZWlnaHQseDpvLnRvLndpZHRoL3Mud2lkdGh9fSwoImJveCI9PT1tfHwiYm90aCI9PT1tKSYmKGEuZnJvbS55IT09YS50by55JiYoeT15LmNvbmNhdChkKSxvLmZyb209ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24obyxkLGEuZnJvbS55LG8uZnJvbSksby50bz1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLGQsYS50by55LG8udG8pKSxhLmZyb20ueCE9PWEudG8ueCYmKHk9eS5jb25jYXQoYyksby5mcm9tPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG8sYyxhLmZyb20ueCxvLmZyb20pLG8udG89ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24obyxjLGEudG8ueCxvLnRvKSkpLCgiY29udGVudCI9PT1tfHwiYm90aCI9PT1tKSYmYS5mcm9tLnkhPT1hLnRvLnkmJih5PXkuY29uY2F0KHUpLmNvbmNhdChsKSxvLmZyb209ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24obyx1LGEuZnJvbS55LG8uZnJvbSksby50bz1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLHUsYS50by55LG8udG8pKSxlLmVmZmVjdHMuc2F2ZShvLHkpLG8uc2hvdygpLGUuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKG8pLG8uY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpLmNzcyhvLmZyb20pLGcmJihuPWUuZWZmZWN0cy5nZXRCYXNlbGluZShnLHMpLG8uZnJvbS50b3A9KHMub3V0ZXJIZWlnaHQtby5vdXRlckhlaWdodCgpKSpuLnksby5mcm9tLmxlZnQ9KHMub3V0ZXJXaWR0aC1vLm91dGVyV2lkdGgoKSkqbi54LG8udG8udG9wPShzLm91dGVySGVpZ2h0LW8udG8ub3V0ZXJIZWlnaHQpKm4ueSxvLnRvLmxlZnQ9KHMub3V0ZXJXaWR0aC1vLnRvLm91dGVyV2lkdGgpKm4ueCksby5jc3Moby5mcm9tKSwoImNvbnRlbnQiPT09bXx8ImJvdGgiPT09bSkmJihkPWQuY29uY2F0KFsibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIl0pLmNvbmNhdCh1KSxjPWMuY29uY2F0KFsibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0Il0pLGw9ci5jb25jYXQoZCkuY29uY2F0KGMpLG8uZmluZCgiKlt3aWR0aF0iKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9ZSh0aGlzKSxzPXtoZWlnaHQ6aS5oZWlnaHQoKSx3aWR0aDppLndpZHRoKCksb3V0ZXJIZWlnaHQ6aS5vdXRlckhlaWdodCgpLG91dGVyV2lkdGg6aS5vdXRlcldpZHRoKCl9O2YmJmUuZWZmZWN0cy5zYXZlKGksbCksaS5mcm9tPXtoZWlnaHQ6cy5oZWlnaHQqYS5mcm9tLnksd2lkdGg6cy53aWR0aCphLmZyb20ueCxvdXRlckhlaWdodDpzLm91dGVySGVpZ2h0KmEuZnJvbS55LG91dGVyV2lkdGg6cy5vdXRlcldpZHRoKmEuZnJvbS54fSxpLnRvPXtoZWlnaHQ6cy5oZWlnaHQqYS50by55LHdpZHRoOnMud2lkdGgqYS50by54LG91dGVySGVpZ2h0OnMuaGVpZ2h0KmEudG8ueSxvdXRlcldpZHRoOnMud2lkdGgqYS50by54fSxhLmZyb20ueSE9PWEudG8ueSYmKGkuZnJvbT1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihpLGQsYS5mcm9tLnksaS5mcm9tKSxpLnRvPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGksZCxhLnRvLnksaS50bykpLGEuZnJvbS54IT09YS50by54JiYoaS5mcm9tPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGksYyxhLmZyb20ueCxpLmZyb20pLGkudG89ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24oaSxjLGEudG8ueCxpLnRvKSksaS5jc3MoaS5mcm9tKSxpLmFuaW1hdGUoaS50byx0LmR1cmF0aW9uLHQuZWFzaW5nLGZ1bmN0aW9uKCl7ZiYmZS5lZmZlY3RzLnJlc3RvcmUoaSxsKX0pfSkpLG8uYW5pbWF0ZShvLnRvLHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpezA9PT1vLnRvLm9wYWNpdHkmJm8uY3NzKCJvcGFjaXR5IixvLmZyb20ub3BhY2l0eSksImhpZGUiPT09cCYmby5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobyx5KSxmfHwoInN0YXRpYyI9PT12P28uY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLHRvcDpvLnRvLnRvcCxsZWZ0Om8udG8ubGVmdH0pOmUuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihlLHQpe28uY3NzKHQsZnVuY3Rpb24odCxpKXt2YXIgcz1wYXJzZUludChpLDEwKSxuPWU/by50by5sZWZ0Om8udG8udG9wO3JldHVybiJhdXRvIj09PWk/bisicHgiOnMrbisicHgifSl9KSksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIobyksaSgpfX0pfSxlLmVmZmVjdHMuZWZmZWN0LnNjYWxlPWZ1bmN0aW9uKHQsaSl7dmFyIHM9ZSh0aGlzKSxuPWUuZXh0ZW5kKCEwLHt9LHQpLGE9ZS5lZmZlY3RzLnNldE1vZGUocyx0Lm1vZGV8fCJlZmZlY3QiKSxvPXBhcnNlSW50KHQucGVyY2VudCwxMCl8fCgwPT09cGFyc2VJbnQodC5wZXJjZW50LDEwKT8wOiJoaWRlIj09PWE/MDoxMDApLHI9dC5kaXJlY3Rpb258fCJib3RoIixoPXQub3JpZ2luLGw9e2hlaWdodDpzLmhlaWdodCgpLHdpZHRoOnMud2lkdGgoKSxvdXRlckhlaWdodDpzLm91dGVySGVpZ2h0KCksb3V0ZXJXaWR0aDpzLm91dGVyV2lkdGgoKX0sdT17eToiaG9yaXpvbnRhbCIhPT1yP28vMTAwOjEseDoidmVydGljYWwiIT09cj9vLzEwMDoxfTtuLmVmZmVjdD0ic2l6ZSIsbi5xdWV1ZT0hMSxuLmNvbXBsZXRlPWksImVmZmVjdCIhPT1hJiYobi5vcmlnaW49aHx8WyJtaWRkbGUiLCJjZW50ZXIiXSxuLnJlc3RvcmU9ITApLG4uZnJvbT10LmZyb218fCgic2hvdyI9PT1hP3toZWlnaHQ6MCx3aWR0aDowLG91dGVySGVpZ2h0OjAsb3V0ZXJXaWR0aDowfTpsKSxuLnRvPXtoZWlnaHQ6bC5oZWlnaHQqdS55LHdpZHRoOmwud2lkdGgqdS54LG91dGVySGVpZ2h0Omwub3V0ZXJIZWlnaHQqdS55LG91dGVyV2lkdGg6bC5vdXRlcldpZHRoKnUueH0sbi5mYWRlJiYoInNob3ciPT09YSYmKG4uZnJvbS5vcGFjaXR5PTAsbi50by5vcGFjaXR5PTEpLCJoaWRlIj09PWEmJihuLmZyb20ub3BhY2l0eT0xLG4udG8ub3BhY2l0eT0wKSkscy5lZmZlY3Qobil9LGUuZWZmZWN0cy5lZmZlY3QucHVmZj1mdW5jdGlvbih0LGkpe3ZhciBzPWUodGhpcyksbj1lLmVmZmVjdHMuc2V0TW9kZShzLHQubW9kZXx8ImhpZGUiKSxhPSJoaWRlIj09PW4sbz1wYXJzZUludCh0LnBlcmNlbnQsMTApfHwxNTAscj1vLzEwMCxoPXtoZWlnaHQ6cy5oZWlnaHQoKSx3aWR0aDpzLndpZHRoKCksb3V0ZXJIZWlnaHQ6cy5vdXRlckhlaWdodCgpLG91dGVyV2lkdGg6cy5vdXRlcldpZHRoKCl9O2UuZXh0ZW5kKHQse2VmZmVjdDoic2NhbGUiLHF1ZXVlOiExLGZhZGU6ITAsbW9kZTpuLGNvbXBsZXRlOmkscGVyY2VudDphP286MTAwLGZyb206YT9oOntoZWlnaHQ6aC5oZWlnaHQqcix3aWR0aDpoLndpZHRoKnIsb3V0ZXJIZWlnaHQ6aC5vdXRlckhlaWdodCpyLG91dGVyV2lkdGg6aC5vdXRlcldpZHRoKnJ9fSkscy5lZmZlY3QodCl9LGUuZWZmZWN0cy5lZmZlY3QucHVsc2F0ZT1mdW5jdGlvbih0LGkpe3ZhciBzLG49ZSh0aGlzKSxhPWUuZWZmZWN0cy5zZXRNb2RlKG4sdC5tb2RlfHwic2hvdyIpLG89InNob3ciPT09YSxyPSJoaWRlIj09PWEsaD1vfHwiaGlkZSI9PT1hLGw9MioodC50aW1lc3x8NSkrKGg/MTowKSx1PXQuZHVyYXRpb24vbCxkPTAsYz1uLnF1ZXVlKCkscD1jLmxlbmd0aDtmb3IoKG98fCFuLmlzKCI6dmlzaWJsZSIpKSYmKG4uY3NzKCJvcGFjaXR5IiwwKS5zaG93KCksZD0xKSxzPTE7bD5zO3MrKyluLmFuaW1hdGUoe29wYWNpdHk6ZH0sdSx0LmVhc2luZyksZD0xLWQ7bi5hbmltYXRlKHtvcGFjaXR5OmR9LHUsdC5lYXNpbmcpLG4ucXVldWUoZnVuY3Rpb24oKXtyJiZuLmhpZGUoKSxpKCl9KSxwPjEmJmMuc3BsaWNlLmFwcGx5KGMsWzEsMF0uY29uY2F0KGMuc3BsaWNlKHAsbCsxKSkpLG4uZGVxdWV1ZSgpfSxlLmVmZmVjdHMuZWZmZWN0LnNoYWtlPWZ1bmN0aW9uKHQsaSl7dmFyIHMsbj1lKHRoaXMpLGE9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0sbz1lLmVmZmVjdHMuc2V0TW9kZShuLHQubW9kZXx8ImVmZmVjdCIpLHI9dC5kaXJlY3Rpb258fCJsZWZ0IixoPXQuZGlzdGFuY2V8fDIwLGw9dC50aW1lc3x8Myx1PTIqbCsxLGQ9TWF0aC5yb3VuZCh0LmR1cmF0aW9uL3UpLGM9InVwIj09PXJ8fCJkb3duIj09PXI/InRvcCI6ImxlZnQiLHA9InVwIj09PXJ8fCJsZWZ0Ij09PXIsZj17fSxtPXt9LGc9e30sdj1uLnF1ZXVlKCkseT12Lmxlbmd0aDtmb3IoZS5lZmZlY3RzLnNhdmUobixhKSxuLnNob3coKSxlLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihuKSxmW2NdPShwPyItPSI6Iis9IikraCxtW2NdPShwPyIrPSI6Ii09IikrMipoLGdbY109KHA/Ii09IjoiKz0iKSsyKmgsbi5hbmltYXRlKGYsZCx0LmVhc2luZykscz0xO2w+cztzKyspbi5hbmltYXRlKG0sZCx0LmVhc2luZykuYW5pbWF0ZShnLGQsdC5lYXNpbmcpO24uYW5pbWF0ZShtLGQsdC5lYXNpbmcpLmFuaW1hdGUoZixkLzIsdC5lYXNpbmcpLnF1ZXVlKGZ1bmN0aW9uKCl7ImhpZGUiPT09byYmbi5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobixhKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihuKSxpKCl9KSx5PjEmJnYuc3BsaWNlLmFwcGx5KHYsWzEsMF0uY29uY2F0KHYuc3BsaWNlKHksdSsxKSkpLG4uZGVxdWV1ZSgpfSxlLmVmZmVjdHMuZWZmZWN0LnNsaWRlPWZ1bmN0aW9uKHQsaSl7dmFyIHMsbj1lKHRoaXMpLGE9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIndpZHRoIiwiaGVpZ2h0Il0sbz1lLmVmZmVjdHMuc2V0TW9kZShuLHQubW9kZXx8InNob3ciKSxyPSJzaG93Ij09PW8saD10LmRpcmVjdGlvbnx8ImxlZnQiLGw9InVwIj09PWh8fCJkb3duIj09PWg/InRvcCI6ImxlZnQiLHU9InVwIj09PWh8fCJsZWZ0Ij09PWgsZD17fTtlLmVmZmVjdHMuc2F2ZShuLGEpLG4uc2hvdygpLHM9dC5kaXN0YW5jZXx8blsidG9wIj09PWw/Im91dGVySGVpZ2h0Ijoib3V0ZXJXaWR0aCJdKCEwKSxlLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihuKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSksciYmbi5jc3MobCx1P2lzTmFOKHMpPyItIitzOi1zOnMpLGRbbF09KHI/dT8iKz0iOiItPSI6dT8iLT0iOiIrPSIpK3Msbi5hbmltYXRlKGQse3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7ImhpZGUiPT09byYmbi5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobixhKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihuKSxpKCl9fSl9LGUuZWZmZWN0cy5lZmZlY3QudHJhbnNmZXI9ZnVuY3Rpb24odCxpKXt2YXIgcz1lKHRoaXMpLG49ZSh0LnRvKSxhPSJmaXhlZCI9PT1uLmNzcygicG9zaXRpb24iKSxvPWUoImJvZHkiKSxyPWE/by5zY3JvbGxUb3AoKTowLGg9YT9vLnNjcm9sbExlZnQoKTowLGw9bi5vZmZzZXQoKSx1PXt0b3A6bC50b3AtcixsZWZ0OmwubGVmdC1oLGhlaWdodDpuLmlubmVySGVpZ2h0KCksd2lkdGg6bi5pbm5lcldpZHRoKCl9LGQ9cy5vZmZzZXQoKSxjPWUoIjxkaXYgY2xhc3M9J3VpLWVmZmVjdHMtdHJhbnNmZXInPjwvZGl2PiIpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLmFkZENsYXNzKHQuY2xhc3NOYW1lKS5jc3Moe3RvcDpkLnRvcC1yLGxlZnQ6ZC5sZWZ0LWgsaGVpZ2h0OnMuaW5uZXJIZWlnaHQoKSx3aWR0aDpzLmlubmVyV2lkdGgoKSxwb3NpdGlvbjphPyJmaXhlZCI6ImFic29sdXRlIn0pLmFuaW1hdGUodSx0LmR1cmF0aW9uLHQuZWFzaW5nLGZ1bmN0aW9uKCl7Yy5yZW1vdmUoKSxpKCl9KX19KTs="></script> <link href="data:text/css;charset=utf-8,%0A%0A%2Etocify%20%7B%0Awidth%3A%2020%25%3B%0Amax%2Dheight%3A%2090%25%3B%0Aoverflow%3A%20auto%3B%0Amargin%2Dleft%3A%202%25%3B%0Aposition%3A%20fixed%3B%0Aborder%3A%201px%20solid%20%23ccc%3B%0Awebkit%2Dborder%2Dradius%3A%206px%3B%0Amoz%2Dborder%2Dradius%3A%206px%3B%0Aborder%2Dradius%3A%206px%3B%0A%7D%0A%0A%2Etocify%20ul%2C%20%2Etocify%20li%20%7B%0Alist%2Dstyle%3A%20none%3B%0Amargin%3A%200%3B%0Apadding%3A%200%3B%0Aborder%3A%20none%3B%0Aline%2Dheight%3A%2030px%3B%0A%7D%0A%0A%2Etocify%2Dheader%20%7B%0Atext%2Dindent%3A%2010px%3B%0A%7D%0A%0A%2Etocify%2Dsubheader%20%7B%0Atext%2Dindent%3A%2020px%3B%0Adisplay%3A%20none%3B%0A%7D%0A%0A%2Etocify%2Dsubheader%20li%20%7B%0Afont%2Dsize%3A%2012px%3B%0A%7D%0A%0A%2Etocify%2Dsubheader%20%2Etocify%2Dsubheader%20%7B%0Atext%2Dindent%3A%2030px%3B%0A%7D%0A%0A%2Etocify%2Dsubheader%20%2Etocify%2Dsubheader%20%2Etocify%2Dsubheader%20%7B%0Atext%2Dindent%3A%2040px%3B%0A%7D%0A%0A%2Etocify%20%2Etocify%2Ditem%20%3E%20a%2C%20%2Etocify%20%2Enav%2Dlist%20%2Enav%2Dheader%20%7B%0Amargin%3A%200px%3B%0A%7D%0A%0A%2Etocify%20%2Etocify%2Ditem%20a%2C%20%2Etocify%20%2Elist%2Dgroup%2Ditem%20%7B%0Apadding%3A%205px%3B%0A%7D%0A%2Etocify%20%2Enav%2Dpills%20%3E%20li%20%7B%0Afloat%3A%20none%3B%0A%7D%0A%0A%0A" rel="stylesheet" /> <script src="data:application/x-javascript;base64,LyoganF1ZXJ5IFRvY2lmeSAtIHYxLjkuMSAtIDIwMTMtMTAtMjIKICogaHR0cDovL3d3dy5ncmVnZnJhbmtvLmNvbS9qcXVlcnkudG9jaWZ5LmpzLwogKiBDb3B5cmlnaHQgKGMpIDIwMTMgR3JlZyBGcmFua287IExpY2Vuc2VkIE1JVCAqLwoKLy8gSW1tZWRpYXRlbHktSW52b2tlZCBGdW5jdGlvbiBFeHByZXNzaW9uIChJSUZFKSBbQmVuIEFsbWFuIEJsb2cgUG9zdF0oaHR0cDovL2JlbmFsbWFuLmNvbS9uZXdzLzIwMTAvMTEvaW1tZWRpYXRlbHktaW52b2tlZC1mdW5jdGlvbi1leHByZXNzaW9uLykgdGhhdCBjYWxscyBhbm90aGVyIElJRkUgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIHBsdWdpbiBsb2dpYy4gIEkgdXNlZCB0aGlzIHBhdHRlcm4gc28gdGhhdCBhbnlvbmUgdmlld2luZyB0aGlzIGNvZGUgd291bGQgbm90IGhhdmUgdG8gc2Nyb2xsIHRvIHRoZSBib3R0b20gb2YgdGhlIHBhZ2UgdG8gdmlldyB0aGUgbG9jYWwgcGFyYW1ldGVycyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoZSBtYWluIElJRkUuCihmdW5jdGlvbih0b2NpZnkpIHsKCiAgICAvLyBFQ01BU2NyaXB0IDUgU3RyaWN0IE1vZGU6IFtKb2huIFJlc2lnIEJsb2cgUG9zdF0oaHR0cDovL2Vqb2huLm9yZy9ibG9nL2VjbWFzY3JpcHQtNS1zdHJpY3QtbW9kZS1qc29uLWFuZC1tb3JlLykKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICAvLyBDYWxscyB0aGUgc2Vjb25kIElJRkUgYW5kIGxvY2FsbHkgcGFzc2VzIGluIHRoZSBnbG9iYWwgalF1ZXJ5LCB3aW5kb3csIGFuZCBkb2N1bWVudCBvYmplY3RzCiAgICB0b2NpZnkod2luZG93LmpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7CgogIH0KCiAgLy8gTG9jYWxseSBwYXNzZXMgaW4gYGpRdWVyeWAsIHRoZSBgd2luZG93YCBvYmplY3QsIHRoZSBgZG9jdW1lbnRgIG9iamVjdCwgYW5kIGFuIGB1bmRlZmluZWRgIHZhcmlhYmxlLiAgVGhlIGBqUXVlcnlgLCBgd2luZG93YCBhbmQgYGRvY3VtZW50YCBvYmplY3RzIGFyZSBwYXNzZWQgaW4gbG9jYWxseSwgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSwgc2luY2UgamF2YXNjcmlwdCBmaXJzdCBzZWFyY2hlcyBmb3IgYSB2YXJpYWJsZSBtYXRjaCB3aXRoaW4gdGhlIGxvY2FsIHZhcmlhYmxlcyBzZXQgYmVmb3JlIHNlYXJjaGluZyB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBzZXQuICBBbGwgb2YgdGhlIGdsb2JhbCB2YXJpYWJsZXMgYXJlIGFsc28gcGFzc2VkIGluIGxvY2FsbHkgdG8gYmUgbWluaWZpZXIgZnJpZW5kbHkuIGB1bmRlZmluZWRgIGNhbiBiZSBwYXNzZWQgaW4gbG9jYWxseSwgYmVjYXVzZSBpdCBpcyBub3QgYSByZXNlcnZlZCB3b3JkIGluIEphdmFTY3JpcHQuCiAgKGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkgewoKICAgIC8vIEVDTUFTY3JpcHQgNSBTdHJpY3QgTW9kZTogW0pvaG4gUmVzaWcgQmxvZyBQb3N0XShodHRwOi8vZWpvaG4ub3JnL2Jsb2cvZWNtYXNjcmlwdC01LXN0cmljdC1tb2RlLWpzb24tYW5kLW1vcmUvKQogICAgInVzZSBzdHJpY3QiOwoKICAgIHZhciB0b2NDbGFzc05hbWUgPSAidG9jaWZ5IiwKICAgICAgdG9jQ2xhc3MgPSAiLiIgKyB0b2NDbGFzc05hbWUsCiAgICAgIHRvY0ZvY3VzQ2xhc3NOYW1lID0gInRvY2lmeS1mb2N1cyIsCiAgICAgIHRvY0hvdmVyQ2xhc3NOYW1lID0gInRvY2lmeS1ob3ZlciIsCiAgICAgIGhpZGVUb2NDbGFzc05hbWUgPSAidG9jaWZ5LWhpZGUiLAogICAgICBoaWRlVG9jQ2xhc3MgPSAiLiIgKyBoaWRlVG9jQ2xhc3NOYW1lLAogICAgICBoZWFkZXJDbGFzc05hbWUgPSAidG9jaWZ5LWhlYWRlciIsCiAgICAgIGhlYWRlckNsYXNzID0gIi4iICsgaGVhZGVyQ2xhc3NOYW1lLAogICAgICBzdWJoZWFkZXJDbGFzc05hbWUgPSAidG9jaWZ5LXN1YmhlYWRlciIsCiAgICAgIHN1YmhlYWRlckNsYXNzID0gIi4iICsgc3ViaGVhZGVyQ2xhc3NOYW1lLAogICAgICBpdGVtQ2xhc3NOYW1lID0gInRvY2lmeS1pdGVtIiwKICAgICAgaXRlbUNsYXNzID0gIi4iICsgaXRlbUNsYXNzTmFtZSwKICAgICAgZXh0ZW5kUGFnZUNsYXNzTmFtZSA9ICJ0b2NpZnktZXh0ZW5kLXBhZ2UiLAogICAgICBleHRlbmRQYWdlQ2xhc3MgPSAiLiIgKyBleHRlbmRQYWdlQ2xhc3NOYW1lOwoKICAgIC8vIENhbGxpbmcgdGhlIGpRdWVyeVVJIFdpZGdldCBGYWN0b3J5IE1ldGhvZAogICAgJC53aWRnZXQoInRvYy50b2NpZnkiLCB7CgogICAgICAvL1BsdWdpbiB2ZXJzaW9uCiAgICAgIHZlcnNpb246ICIxLjkuMSIsCgogICAgICAvLyBUaGVzZSBvcHRpb25zIHdpbGwgYmUgdXNlZCBhcyBkZWZhdWx0cwogICAgICBvcHRpb25zOiB7CgogICAgICAgIC8vICoqY29udGV4dCoqOiBBY2NlcHRzIFN0cmluZzogQW55IGpRdWVyeSBzZWxlY3RvcgogICAgICAgIC8vIFRoZSBjb250YWluZXIgZWxlbWVudCB0aGF0IGhvbGRzIGFsbCBvZiB0aGUgZWxlbWVudHMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdGFibGUgb2YgY29udGVudHMKICAgICAgICBjb250ZXh0OiAiYm9keSIsCgogICAgICAgIC8vICoqaWdub3JlU2VsZWN0b3IqKjogQWNjZXB0cyBTdHJpbmc6IEFueSBqUXVlcnkgc2VsZWN0b3IKICAgICAgICAvLyBBIHNlbGVjdG9yIHRvIGFueSBlbGVtZW50IHRoYXQgd291bGQgYmUgbWF0Y2hlZCBieSBzZWxlY3RvcnMgdGhhdCB5b3Ugd2lzaCB0byBiZSBpZ25vcmVkCiAgICAgICAgaWdub3JlU2VsZWN0b3I6IG51bGwsCgogICAgICAgIC8vICoqc2VsZWN0b3JzKio6IEFjY2VwdHMgYW4gQXJyYXkgb2YgU3RyaW5nczogQW55IGpRdWVyeSBzZWxlY3RvcnMKICAgICAgICAvLyBUaGUgZWxlbWVudCdzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhlIG9yZGVyIGlzIHZlcnkgaW1wb3J0YW50IHNpbmNlIGl0IHdpbGwgZGV0ZXJtaW5lIHRoZSB0YWJsZSBvZiBjb250ZW50J3MgbmVzdGluZyBzdHJ1Y3R1cmUKICAgICAgICBzZWxlY3RvcnM6ICJoMSwgaDIsIGgzIiwKCiAgICAgICAgLy8gKipzaG93QW5kSGlkZSoqOiBBY2NlcHRzIGEgYm9vbGVhbjogdHJ1ZSBvciBmYWxzZQogICAgICAgIC8vIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIGVsZW1lbnRzIHNob3VsZCBiZSBzaG93biBhbmQgaGlkZGVuCiAgICAgICAgc2hvd0FuZEhpZGU6IHRydWUsCgogICAgICAgIC8vICoqc2hvd0VmZmVjdCoqOiBBY2NlcHRzIFN0cmluZzogIm5vbmUiLCAiZmFkZUluIiwgInNob3ciLCBvciAic2xpZGVEb3duIgogICAgICAgIC8vIFVzZWQgdG8gZGlzcGxheSBhbnkgb2YgdGhlIHRhYmxlIG9mIGNvbnRlbnRzIG5lc3RlZCBpdGVtcwogICAgICAgIHNob3dFZmZlY3Q6ICJzbGlkZURvd24iLAoKICAgICAgICAvLyAqKnNob3dFZmZlY3RTcGVlZCoqOiBBY2NlcHRzIE51bWJlciAobWlsbGlzZWNvbmRzKSBvciBTdHJpbmc6ICJzbG93IiwgIm1lZGl1bSIsIG9yICJmYXN0IgogICAgICAgIC8vIFRoZSB0aW1lIGR1cmF0aW9uIG9mIHRoZSBzaG93IGFuaW1hdGlvbgogICAgICAgIHNob3dFZmZlY3RTcGVlZDogIm1lZGl1bSIsCgogICAgICAgIC8vICoqaGlkZUVmZmVjdCoqOiBBY2NlcHRzIFN0cmluZzogIm5vbmUiLCAiZmFkZU91dCIsICJoaWRlIiwgb3IgInNsaWRlVXAiCiAgICAgICAgLy8gVXNlZCB0byBoaWRlIGFueSBvZiB0aGUgdGFibGUgb2YgY29udGVudHMgbmVzdGVkIGl0ZW1zCiAgICAgICAgaGlkZUVmZmVjdDogInNsaWRlVXAiLAoKICAgICAgICAvLyAqKmhpZGVFZmZlY3RTcGVlZCoqOiBBY2NlcHRzIE51bWJlciAobWlsbGlzZWNvbmRzKSBvciBTdHJpbmc6ICJzbG93IiwgIm1lZGl1bSIsIG9yICJmYXN0IgogICAgICAgIC8vIFRoZSB0aW1lIGR1cmF0aW9uIG9mIHRoZSBoaWRlIGFuaW1hdGlvbgogICAgICAgIGhpZGVFZmZlY3RTcGVlZDogIm1lZGl1bSIsCgogICAgICAgIC8vICoqc21vb3RoU2Nyb2xsKio6IEFjY2VwdHMgYSBib29sZWFuOiB0cnVlIG9yIGZhbHNlCiAgICAgICAgLy8gRGV0ZXJtaW5lcyBpZiBhIGpRdWVyeSBhbmltYXRpb24gc2hvdWxkIGJlIHVzZWQgdG8gc2Nyb2xsIHRvIHNwZWNpZmljIHRhYmxlIG9mIGNvbnRlbnRzIGl0ZW1zIG9uIHRoZSBwYWdlCiAgICAgICAgc21vb3RoU2Nyb2xsOiB0cnVlLAoKICAgICAgICAvLyAqKnNtb290aFNjcm9sbFNwZWVkKio6IEFjY2VwdHMgTnVtYmVyIChtaWxsaXNlY29uZHMpIG9yIFN0cmluZzogInNsb3ciLCAibWVkaXVtIiwgb3IgImZhc3QiCiAgICAgICAgLy8gVGhlIHRpbWUgZHVyYXRpb24gb2YgdGhlIHNtb290aFNjcm9sbCBhbmltYXRpb24KICAgICAgICBzbW9vdGhTY3JvbGxTcGVlZDogIm1lZGl1bSIsCgogICAgICAgIC8vICoqc2Nyb2xsVG8qKjogQWNjZXB0cyBOdW1iZXIgKHBpeGVscykKICAgICAgICAvLyBUaGUgYW1vdW50IG9mIHNwYWNlIGJldHdlZW4gdGhlIHRvcCBvZiBwYWdlIGFuZCB0aGUgc2VsZWN0ZWQgdGFibGUgb2YgY29udGVudHMgaXRlbSBhZnRlciB0aGUgcGFnZSBoYXMgYmVlbiBzY3JvbGxlZAogICAgICAgIHNjcm9sbFRvOiAwLAoKICAgICAgICAvLyAqKnNob3dBbmRIaWRlT25TY3JvbGwqKjogQWNjZXB0cyBhIGJvb2xlYW46IHRydWUgb3IgZmFsc2UKICAgICAgICAvLyBEZXRlcm1pbmVzIGlmIHRhYmxlIG9mIGNvbnRlbnRzIG5lc3RlZCBpdGVtcyBzaG91bGQgYmUgc2hvd24gYW5kIGhpZGRlbiB3aGlsZSBzY3JvbGxpbmcKICAgICAgICBzaG93QW5kSGlkZU9uU2Nyb2xsOiB0cnVlLAoKICAgICAgICAvLyAqKmhpZ2hsaWdodE9uU2Nyb2xsKio6IEFjY2VwdHMgYSBib29sZWFuOiB0cnVlIG9yIGZhbHNlCiAgICAgICAgLy8gRGV0ZXJtaW5lcyBpZiB0YWJsZSBvZiBjb250ZW50cyBuZXN0ZWQgaXRlbXMgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIChzZXQgdG8gYSBkaWZmZXJlbnQgY29sb3IpIHdoaWxlIHNjcm9sbGluZwogICAgICAgIGhpZ2hsaWdodE9uU2Nyb2xsOiB0cnVlLAoKICAgICAgICAvLyAqKmhpZ2hsaWdodE9mZnNldCoqOiBBY2NlcHRzIGEgbnVtYmVyCiAgICAgICAgLy8gVGhlIG9mZnNldCBkaXN0YW5jZSBpbiBwaXhlbHMgdG8gdHJpZ2dlciB0aGUgbmV4dCBhY3RpdmUgdGFibGUgb2YgY29udGVudHMgaXRlbQogICAgICAgIGhpZ2hsaWdodE9mZnNldDogNDAsCgogICAgICAgIC8vICoqdGhlbWUqKjogQWNjZXB0cyBhIHN0cmluZzogImJvb3RzdHJhcCIsICJqcXVlcnl1aSIsIG9yICJub25lIgogICAgICAgIC8vIERldGVybWluZXMgaWYgVHdpdHRlciBCb290c3RyYXAsIGpRdWVyeVVJLCBvciBUb2NpZnkgY2xhc3NlcyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHRhYmxlIG9mIGNvbnRlbnRzCiAgICAgICAgdGhlbWU6ICJib290c3RyYXAiLAoKICAgICAgICAvLyAqKmV4dGVuZFBhZ2UqKjogQWNjZXB0cyBhIGJvb2xlYW46IHRydWUgb3IgZmFsc2UKICAgICAgICAvLyBJZiBhIHVzZXIgc2Nyb2xscyB0byB0aGUgYm90dG9tIG9mIHRoZSBwYWdlIGFuZCB0aGUgcGFnZSBpcyBub3QgdGFsbCBlbm91Z2ggdG8gc2Nyb2xsIHRvIHRoZSBsYXN0IHRhYmxlIG9mIGNvbnRlbnRzIGl0ZW0sIHRoZW4gdGhlIHBhZ2UgaGVpZ2h0IGlzIGluY3JlYXNlZAogICAgICAgIGV4dGVuZFBhZ2U6IHRydWUsCgogICAgICAgIC8vICoqZXh0ZW5kUGFnZU9mZnNldCoqOiBBY2NlcHRzIGEgbnVtYmVyOiBwaXhlbHMKICAgICAgICAvLyBIb3cgY2xvc2UgdG8gdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSBhIHVzZXIgbXVzdCBzY3JvbGwgYmVmb3JlIHRoZSBwYWdlIGlzIGV4dGVuZGVkCiAgICAgICAgZXh0ZW5kUGFnZU9mZnNldDogMTAwLAoKICAgICAgICAvLyAqKmhpc3RvcnkqKjogQWNjZXB0cyBhIGJvb2xlYW46IHRydWUgb3IgZmFsc2UKICAgICAgICAvLyBBZGRzIGEgaGFzaCB0byB0aGUgcGFnZSB1cmwgdG8gbWFpbnRhaW4gaGlzdG9yeQogICAgICAgIGhpc3Rvcnk6IHRydWUsCgogICAgICAgIC8vICoqc2Nyb2xsSGlzdG9yeSoqOiBBY2NlcHRzIGEgYm9vbGVhbjogdHJ1ZSBvciBmYWxzZQogICAgICAgIC8vIEFkZHMgYSBoYXNoIHRvIHRoZSBwYWdlIHVybCwgdG8gbWFpbnRhaW4gaGlzdG9yeSwgd2hlbiBzY3JvbGxpbmcgdG8gYSBUT0MgaXRlbQogICAgICAgIHNjcm9sbEhpc3Rvcnk6IGZhbHNlLAoKICAgICAgICAvLyAqKmhhc2hHZW5lcmF0b3IqKjogSG93IHRoZSBoYXNoIHZhbHVlICh0aGUgYW5jaG9yIHNlZ21lbnQgb2YgdGhlIFVSTCwgZm9sbG93aW5nIHRoZQogICAgICAgIC8vICMgY2hhcmFjdGVyKSB3aWxsIGJlIGdlbmVyYXRlZC4KICAgICAgICAvLwogICAgICAgIC8vICJjb21wYWN0IiAoZGVmYXVsdCkgLSAjQ29tcHJlc3Nlc0V2ZXJ5dGhpbmdUb2dldGhlcgogICAgICAgIC8vICJwcmV0dHkiIC0gI2xvb2tzLWxpa2UtYS1uaWNlLXVybC1hbmQtaXMtZWFzaWx5LXJlYWRhYmxlCiAgICAgICAgLy8gZnVuY3Rpb24odGV4dCwgZWxlbWVudCl7fSAtIFlvdXIgb3duIGhhc2ggZ2VuZXJhdGlvbiBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHRleHQgYXMgYW4KICAgICAgICAvLyBhcmd1bWVudCwgYW5kIHJldHVybnMgdGhlIGhhc2ggdmFsdWUuCiAgICAgICAgaGFzaEdlbmVyYXRvcjogImNvbXBhY3QiLAoKICAgICAgICAvLyAqKmhpZ2hsaWdodERlZmF1bHQqKjogQWNjZXB0cyBhIGJvb2xlYW46IHRydWUgb3IgZmFsc2UKICAgICAgICAvLyBTZXQncyB0aGUgZmlyc3QgVE9DIGl0ZW0gYXMgYWN0aXZlIGlmIG5vIG90aGVyIFRPQyBpdGVtIGlzIGFjdGl2ZS4KICAgICAgICBoaWdobGlnaHREZWZhdWx0OiB0cnVlCgogICAgICB9LAoKICAgICAgLy8gX0NyZWF0ZQogICAgICAvLyAtLS0tLS0tCiAgICAgIC8vICAgICAgQ29uc3RydWN0cyB0aGUgcGx1Z2luLiAgT25seSBjYWxsZWQgb25jZS4KICAgICAgX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgogICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgc2VsZi5leHRlbmRQYWdlU2Nyb2xsID0gdHJ1ZTsKCiAgICAgICAgLy8gSW50ZXJuYWwgYXJyYXkgdGhhdCBrZWVwcyB0cmFjayBvZiBhbGwgVE9DIGl0ZW1zIChIZWxwcyB0byByZWNvZ25pemUgaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZSBUT0MgaXRlbSBzdHJpbmdzKQogICAgICAgIHNlbGYuaXRlbXMgPSBbXTsKCiAgICAgICAgLy8gR2VuZXJhdGVzIHRoZSBIVE1MIGZvciB0aGUgZHluYW1pYyB0YWJsZSBvZiBjb250ZW50cwogICAgICAgIHNlbGYuX2dlbmVyYXRlVG9jKCk7CgogICAgICAgIC8vIEFkZHMgQ1NTIGNsYXNzZXMgdG8gdGhlIG5ld2x5IGdlbmVyYXRlZCB0YWJsZSBvZiBjb250ZW50cyBIVE1MCiAgICAgICAgc2VsZi5fYWRkQ1NTQ2xhc3NlcygpOwoKICAgICAgICBzZWxmLndlYmtpdCA9IChmdW5jdGlvbigpIHsKCiAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIHdpbmRvdykgewoKICAgICAgICAgICAgaWYgKHByb3ApIHsKCiAgICAgICAgICAgICAgaWYgKHByb3AudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJ3ZWJraXQiKSAhPT0gLTEpIHsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIH0oKSk7CgogICAgICAgIC8vIEFkZHMgalF1ZXJ5IGV2ZW50IGhhbmRsZXJzIHRvIHRoZSBuZXdseSBnZW5lcmF0ZWQgdGFibGUgb2YgY29udGVudHMKICAgICAgICBzZWxmLl9zZXRFdmVudEhhbmRsZXJzKCk7CgogICAgICAgIC8vIEJpbmRpbmcgdG8gdGhlIFdpbmRvdyBsb2FkIGV2ZW50IHRvIG1ha2Ugc3VyZSB0aGUgY29ycmVjdCBzY3JvbGxUb3AgaXMgY2FsY3VsYXRlZAogICAgICAgICQod2luZG93KS5sb2FkKGZ1bmN0aW9uKCkgewoKICAgICAgICAgIC8vIFNldHMgdGhlIGFjdGl2ZSBUT0MgaXRlbQogICAgICAgICAgc2VsZi5fc2V0QWN0aXZlRWxlbWVudCh0cnVlKTsKCiAgICAgICAgICAvLyBPbmNlIGFsbCBhbmltYXRpb25zIG9uIHRoZSBwYWdlIGFyZSBjb21wbGV0ZSwgdGhpcyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAogICAgICAgICAgJCgiaHRtbCwgYm9keSIpLnByb21pc2UoKS5kb25lKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgc2VsZi5leHRlbmRQYWdlU2Nyb2xsID0gZmFsc2U7CgogICAgICAgICAgICB9LCAwKTsKCiAgICAgICAgICB9KTsKCiAgICAgICAgfSk7CgogICAgICB9LAoKICAgICAgLy8gX2dlbmVyYXRlVG9jCiAgICAgIC8vIC0tLS0tLS0tLS0tLQogICAgICAvLyAgICAgIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgdGhlIGR5bmFtaWMgdGFibGUgb2YgY29udGVudHMKICAgICAgX2dlbmVyYXRlVG9jOiBmdW5jdGlvbigpIHsKCiAgICAgICAgLy8gX0xvY2FsIHZhcmlhYmxlc18KCiAgICAgICAgLy8gU3RvcmVzIHRoZSBwbHVnaW4gY29udGV4dCBpbiB0aGUgc2VsZiB2YXJpYWJsZQogICAgICAgIHZhciBzZWxmID0gdGhpcywKCiAgICAgICAgICAvLyBBbGwgb2YgdGhlIEhUTUwgdGFncyBmb3VuZCB3aXRoaW4gdGhlIGNvbnRleHQgcHJvdmlkZWQgKGkuZS4gYm9keSkgdGhhdCBtYXRjaCB0aGUgdG9wIGxldmVsIGpRdWVyeSBzZWxlY3RvciBhYm92ZQogICAgICAgICAgZmlyc3RFbGVtLAoKICAgICAgICAgIC8vIEluc3RhbnRpYXRlZCB2YXJpYWJsZSB0aGF0IHdpbGwgc3RvcmUgdGhlIHRvcCBsZXZlbCBuZXdseSBjcmVhdGVkIHVub3JkZXJlZCBsaXN0IERPTSBlbGVtZW50CiAgICAgICAgICB1bCwKICAgICAgICAgIGlnbm9yZVNlbGVjdG9yID0gc2VsZi5vcHRpb25zLmlnbm9yZVNlbGVjdG9yOwoKCiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSB0b2Mgd2l0aAogICAgICAgIC8vIGdldCBhbGwgdGhlIHRvcCBsZXZlbCBzZWxlY3RvcnMKICAgICAgICBmaXJzdEVsZW0gPSBbXTsKICAgICAgICB2YXIgc2VsZWN0b3JzID0gdGhpcy5vcHRpb25zLnNlbGVjdG9ycy5yZXBsYWNlKC8gL2csICIiKS5zcGxpdCgiLCIpOwogICAgICAgIC8vIGZpbmQgdGhlIGZpcnN0IHNldCB0aGF0IGhhdmUgYXQgbGVhc3Qgb25lIG5vbi1pZ25vcmVkIGVsZW1lbnQKICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2VsZWN0b3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgZm91bmRTZWxlY3RvcnMgPSAkKHRoaXMub3B0aW9ucy5jb250ZXh0KS5maW5kKHNlbGVjdG9yc1tpXSk7CiAgICAgICAgICBmb3IgKHZhciBzID0gMDsgcyA8IGZvdW5kU2VsZWN0b3JzLmxlbmd0aDsgcysrKSB7CiAgICAgICAgICAgIGlmICghJChmb3VuZFNlbGVjdG9yc1tzXSkuaXMoaWdub3JlU2VsZWN0b3IpKSB7CiAgICAgICAgICAgICAgZmlyc3RFbGVtID0gZm91bmRTZWxlY3RvcnM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChmaXJzdEVsZW0ubGVuZ3RoPiAwKQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmICghZmlyc3RFbGVtLmxlbmd0aCkgewoKICAgICAgICAgIHNlbGYuZWxlbWVudC5hZGRDbGFzcyhoaWRlVG9jQ2xhc3NOYW1lKTsKCiAgICAgICAgICByZXR1cm47CgogICAgICAgIH0KCiAgICAgICAgc2VsZi5lbGVtZW50LmFkZENsYXNzKHRvY0NsYXNzTmFtZSk7CgogICAgICAgIC8vIExvb3BzIHRocm91Z2ggZWFjaCB0b3AgbGV2ZWwgc2VsZWN0b3IKICAgICAgICBmaXJzdEVsZW0uZWFjaChmdW5jdGlvbihpbmRleCkgewoKICAgICAgICAgIC8vSWYgdGhlIGVsZW1lbnQgbWF0Y2hlcyB0aGUgaWdub3JlU2VsZWN0b3IgdGhlbiB3ZSBza2lwIGl0CiAgICAgICAgICBpZiAoJCh0aGlzKS5pcyhpZ25vcmVTZWxlY3RvcikpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIENyZWF0ZXMgYW4gdW5vcmRlcmVkIGxpc3QgSFRNTCBlbGVtZW50IGFuZCBhZGRzIGEgZHluYW1pYyBJRCBhbmQgc3RhbmRhcmQgY2xhc3MgbmFtZQogICAgICAgICAgdWwgPSAkKCI8dWwvPiIsIHsKICAgICAgICAgICAgImlkIjogaGVhZGVyQ2xhc3NOYW1lICsgaW5kZXgsCiAgICAgICAgICAgICJjbGFzcyI6IGhlYWRlckNsYXNzTmFtZQogICAgICAgICAgfSkuCgogICAgICAgICAgLy8gQXBwZW5kcyBhIHRvcCBsZXZlbCBsaXN0IGl0ZW0gSFRNTCBlbGVtZW50IHRvIHRoZSBwcmV2aW91c2x5IGNyZWF0ZWQgSFRNTCBoZWFkZXIKICAgICAgICAgIGFwcGVuZChzZWxmLl9uZXN0RWxlbWVudHMoJCh0aGlzKSwgaW5kZXgpKTsKCiAgICAgICAgICAvLyBBZGQgdGhlIGNyZWF0ZWQgdW5vcmRlcmVkIGxpc3QgZWxlbWVudCB0byB0aGUgSFRNTCBlbGVtZW50IGNhbGxpbmcgdGhlIHBsdWdpbgogICAgICAgICAgc2VsZi5lbGVtZW50LmFwcGVuZCh1bCk7CgogICAgICAgICAgLy8gRmluZHMgYWxsIG9mIHRoZSBIVE1MIHRhZ3MgYmV0d2VlbiB0aGUgaGVhZGVyIGFuZCBzdWJoZWFkZXIgZWxlbWVudHMKICAgICAgICAgICQodGhpcykubmV4dFVudGlsKHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBuZXN0ZWQgc3ViaGVhZGVyIGVsZW1lbWVudHMKICAgICAgICAgICAgaWYgKCQodGhpcykuZmluZChzZWxmLm9wdGlvbnMuc2VsZWN0b3JzKS5sZW5ndGggPT09IDApIHsKCiAgICAgICAgICAgICAgLy8gTG9vcHMgdGhyb3VnaCBhbGwgb2YgdGhlIHN1YmhlYWRlciBlbGVtZW50cwogICAgICAgICAgICAgICQodGhpcykuZmlsdGVyKHNlbGYub3B0aW9ucy5zZWxlY3RvcnMpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy9JZiB0aGUgZWxlbWVudCBtYXRjaGVzIHRoZSBpZ25vcmVTZWxlY3RvciB0aGVuIHdlIHNraXAgaXQKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmlzKGlnbm9yZVNlbGVjdG9yKSkgewogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5fYXBwZW5kU3ViaGVhZGVycy5jYWxsKHRoaXMsIHNlbGYsIHVsKTsKCiAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbmVzdGVkIHN1YmhlYWRlciBlbGVtZW50cwogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgLy8gTG9vcHMgdGhyb3VnaCBhbGwgb2YgdGhlIHN1YmhlYWRlciBlbGVtZW50cwogICAgICAgICAgICAgICQodGhpcykuZmluZChzZWxmLm9wdGlvbnMuc2VsZWN0b3JzKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vSWYgdGhlIGVsZW1lbnQgbWF0Y2hlcyB0aGUgaWdub3JlU2VsZWN0b3IgdGhlbiB3ZSBza2lwIGl0CiAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5pcyhpZ25vcmVTZWxlY3RvcikpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuX2FwcGVuZFN1YmhlYWRlcnMuY2FsbCh0aGlzLCBzZWxmLCB1bCk7CgogICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfQoKICAgICAgICAgIH0pOwoKICAgICAgICB9KTsKCiAgICAgIH0sCgogICAgICBfc2V0QWN0aXZlRWxlbWVudDogZnVuY3Rpb24ocGFnZWxvYWQpIHsKCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLAoKICAgICAgICAgIGhhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSksCgogICAgICAgICAgZWxlbSA9IHNlbGYuZWxlbWVudC5maW5kKCdsaVtkYXRhLXVuaXF1ZT0iJyArIGhhc2ggKyAnIl0nKTsKCiAgICAgICAgaWYgKGhhc2gubGVuZ3RoKSB7CgogICAgICAgICAgLy8gUmVtb3ZlcyBoaWdobGlnaHRpbmcgZnJvbSBhbGwgb2YgdGhlIGxpc3QgaXRlbSdzCiAgICAgICAgICBzZWxmLmVsZW1lbnQuZmluZCgiLiIgKyBzZWxmLmZvY3VzQ2xhc3MpLnJlbW92ZUNsYXNzKHNlbGYuZm9jdXNDbGFzcyk7CgogICAgICAgICAgLy8gSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBsaXN0IGl0ZW0gdGhhdCB3YXMgY2xpY2tlZAogICAgICAgICAgZWxlbS5hZGRDbGFzcyhzZWxmLmZvY3VzQ2xhc3MpOwoKICAgICAgICAgIC8vIFRyaWdnZXJzIHRoZSBjbGljayBldmVudCBvbiB0aGUgY3VycmVudGx5IGZvY3VzZWQgVE9DIGl0ZW0KICAgICAgICAgIGVsZW0uY2xpY2soKTsKCiAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAvLyBSZW1vdmVzIGhpZ2hsaWdodGluZyBmcm9tIGFsbCBvZiB0aGUgbGlzdCBpdGVtJ3MKICAgICAgICAgIHNlbGYuZWxlbWVudC5maW5kKCIuIiArIHNlbGYuZm9jdXNDbGFzcykucmVtb3ZlQ2xhc3Moc2VsZi5mb2N1c0NsYXNzKTsKCiAgICAgICAgICBpZiAoIWhhc2gubGVuZ3RoICYmIHBhZ2Vsb2FkICYmIHNlbGYub3B0aW9ucy5oaWdobGlnaHREZWZhdWx0KSB7CgogICAgICAgICAgICAvLyBIaWdobGlnaHRzIHRoZSBmaXJzdCBUT0MgaXRlbSBpZiBubyBvdGhlciBpdGVtcyBhcmUgaGlnaGxpZ2h0ZWQKICAgICAgICAgICAgc2VsZi5lbGVtZW50LmZpbmQoaXRlbUNsYXNzKS5maXJzdCgpLmFkZENsYXNzKHNlbGYuZm9jdXNDbGFzcyk7CgogICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOwoKICAgICAgfSwKCiAgICAgIC8vIF9uZXN0RWxlbWVudHMKICAgICAgLy8gLS0tLS0tLS0tLS0tLQogICAgICAvLyAgICAgIEhlbHBzIGNyZWF0ZSB0aGUgdGFibGUgb2YgY29udGVudHMgbGlzdCBieSBhcHBlbmRpbmcgbmVzdGVkIGxpc3QgaXRlbXMKICAgICAgX25lc3RFbGVtZW50czogZnVuY3Rpb24oc2VsZiwgaW5kZXgpIHsKCiAgICAgICAgdmFyIGFyciwgaXRlbSwgaGFzaFZhbHVlOwoKICAgICAgICBhcnIgPSAkLmdyZXAodGhpcy5pdGVtcywgZnVuY3Rpb24oaXRlbSkgewoKICAgICAgICAgIHJldHVybiBpdGVtID09PSBzZWxmLnRleHQoKTsKCiAgICAgICAgfSk7CgogICAgICAgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSBkdXBsaWNhdGUgVE9DIGl0ZW0KICAgICAgICBpZiAoYXJyLmxlbmd0aCkgewoKICAgICAgICAgIC8vIEFkZHMgdGhlIGN1cnJlbnQgVE9DIGl0ZW0gdGV4dCBhbmQgaW5kZXggKGZvciBzbGlnaHQgcmFuZG9taXphdGlvbikgdG8gdGhlIGludGVybmFsIGFycmF5CiAgICAgICAgICB0aGlzLml0ZW1zLnB1c2goc2VsZi50ZXh0KCkgKyBpbmRleCk7CgogICAgICAgIH0KCiAgICAgICAgLy8gSWYgdGhlcmUgbm90IGEgZHVwbGljYXRlIFRPQyBpdGVtCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgLy8gQWRkcyB0aGUgY3VycmVudCBUT0MgaXRlbSB0ZXh0IHRvIHRoZSBpbnRlcm5hbCBhcnJheQogICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKHNlbGYudGV4dCgpKTsKCiAgICAgICAgfQoKICAgICAgICBoYXNoVmFsdWUgPSB0aGlzLl9nZW5lcmF0ZUhhc2hWYWx1ZShhcnIsIHNlbGYsIGluZGV4KTsKCiAgICAgICAgLy8gQXBwZW5kcyBhIGxpc3QgaXRlbSBIVE1MIGVsZW1lbnQgdG8gdGhlIGxhc3QgdW5vcmRlcmVkIGxpc3QgSFRNTCBlbGVtZW50IGZvdW5kIHdpdGhpbiB0aGUgSFRNTCBlbGVtZW50IGNhbGxpbmcgdGhlIHBsdWdpbgogICAgICAgIGl0ZW0gPSAkKCI8bGkvPiIsIHsKCiAgICAgICAgICAvLyBTZXRzIGEgY29tbW9uIGNsYXNzIG5hbWUgdG8gdGhlIGxpc3QgaXRlbQogICAgICAgICAgImNsYXNzIjogaXRlbUNsYXNzTmFtZSwKCiAgICAgICAgICAiZGF0YS11bmlxdWUiOiBoYXNoVmFsdWUKCiAgICAgICAgfSk7CgogICAgICAgIGlmICh0aGlzLm9wdGlvbnMudGhlbWUgIT09ICJib290c3RyYXAzIikgewoKICAgICAgICAgIGl0ZW0uYXBwZW5kKCQoIjxhLz4iLCB7CgogICAgICAgICAgICAidGV4dCI6IHNlbGYudGV4dCgpCgogICAgICAgICAgfSkpOwoKICAgICAgICB9IGVsc2UgewoKICAgICAgICAgIGl0ZW0udGV4dChzZWxmLnRleHQoKSk7CgogICAgICAgIH0KCiAgICAgICAgLy8gQWRkcyBhbiBIVE1MIGFuY2hvciB0YWcgYmVmb3JlIHRoZSBjdXJyZW50bHkgdHJhdmVyc2VkIEhUTUwgZWxlbWVudAogICAgICAgIHNlbGYuYmVmb3JlKCQoIjxkaXYvPiIsIHsKCiAgICAgICAgICAvLyBTZXRzIGEgbmFtZSBhdHRyaWJ1dGUgb24gdGhlIGFuY2hvciB0YWcgdG8gdGhlIHRleHQgb2YgdGhlIGN1cnJlbnRseSB0cmF2ZXJzZWQgSFRNTCBlbGVtZW50IChhbHNvIG1ha2luZyBzdXJlIHRoYXQgYWxsIHdoaXRlc3BhY2UgaXMgcmVwbGFjZWQgd2l0aCBhbiB1bmRlcnNjb3JlKQogICAgICAgICAgIm5hbWUiOiBoYXNoVmFsdWUsCgogICAgICAgICAgImRhdGEtdW5pcXVlIjogaGFzaFZhbHVlCgogICAgICAgIH0pKTsKCiAgICAgICAgcmV0dXJuIGl0ZW07CgogICAgICB9LAoKICAgICAgLy8gX2dlbmVyYXRlSGFzaFZhbHVlCiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAvLyAgICAgIEdlbmVyYXRlcyB0aGUgaGFzaCB2YWx1ZSB0aGF0IHdpbGwgYmUgdXNlZCB0byByZWZlciB0byBlYWNoIGl0ZW0uCiAgICAgIF9nZW5lcmF0ZUhhc2hWYWx1ZTogZnVuY3Rpb24oYXJyLCBzZWxmLCBpbmRleCkgewoKICAgICAgICB2YXIgaGFzaFZhbHVlID0gIiIsCiAgICAgICAgICBoYXNoR2VuZXJhdG9yT3B0aW9uID0gdGhpcy5vcHRpb25zLmhhc2hHZW5lcmF0b3I7CgogICAgICAgIGlmIChoYXNoR2VuZXJhdG9yT3B0aW9uID09PSAicHJldHR5IikgewoKICAgICAgICAgIC8vIHByZXR0aWZ5IHRoZSB0ZXh0CiAgICAgICAgICBoYXNoVmFsdWUgPSBzZWxmLnRleHQoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xzL2csICItIik7CgogICAgICAgICAgLy8gZml4IGRvdWJsZSBoeXBoZW5zCiAgICAgICAgICB3aGlsZSAoaGFzaFZhbHVlLmluZGV4T2YoIi0tIikgPiAtMSkgewogICAgICAgICAgICBoYXNoVmFsdWUgPSBoYXNoVmFsdWUucmVwbGFjZSgvLS0vZywgIi0iKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBmaXggY29sb24tc3BhY2UgaW5zdGFuY2VzCiAgICAgICAgICB3aGlsZSAoaGFzaFZhbHVlLmluZGV4T2YoIjotIikgPiAtMSkgewogICAgICAgICAgICBoYXNoVmFsdWUgPSBoYXNoVmFsdWUucmVwbGFjZSgvOi0vZywgIi0iKTsKICAgICAgICAgIH0KCiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaGFzaEdlbmVyYXRvck9wdGlvbiA9PT0gImZ1bmN0aW9uIikgewoKICAgICAgICAgIC8vIGNhbGwgdGhlIGZ1bmN0aW9uCiAgICAgICAgICBoYXNoVmFsdWUgPSBoYXNoR2VuZXJhdG9yT3B0aW9uKHNlbGYudGV4dCgpLCBzZWxmKTsKCiAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAvLyBjb21wYWN0IC0gdGhlIGRlZmF1bHQKICAgICAgICAgIGhhc2hWYWx1ZSA9IHNlbGYudGV4dCgpLnJlcGxhY2UoL1xzL2csICIiKTsKCiAgICAgICAgfQoKICAgICAgICAvLyBhZGQgdGhlIGluZGV4IGlmIHdlIG5lZWQgdG8KICAgICAgICBpZiAoYXJyLmxlbmd0aCkgewogICAgICAgICAgaGFzaFZhbHVlICs9ICIiICsgaW5kZXg7CiAgICAgICAgfQoKICAgICAgICAvLyByZXR1cm4gdGhlIHZhbHVlCiAgICAgICAgcmV0dXJuIGhhc2hWYWx1ZTsKCiAgICAgIH0sCgogICAgICAvLyBfYXBwZW5kRWxlbWVudHMKICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tCiAgICAgIC8vICAgICAgSGVscHMgY3JlYXRlIHRoZSB0YWJsZSBvZiBjb250ZW50cyBsaXN0IGJ5IGFwcGVuZGluZyBzdWJoZWFkZXIgZWxlbWVudHMKCiAgICAgIF9hcHBlbmRTdWJoZWFkZXJzOiBmdW5jdGlvbihzZWxmLCB1bCkgewoKICAgICAgICAvLyBUaGUgY3VycmVudCBlbGVtZW50IGluZGV4CiAgICAgICAgdmFyIGluZGV4ID0gJCh0aGlzKS5pbmRleChzZWxmLm9wdGlvbnMuc2VsZWN0b3JzKSwKCiAgICAgICAgICAvLyBGaW5kcyB0aGUgcHJldmlvdXMgaGVhZGVyIERPTSBlbGVtZW50CiAgICAgICAgICBwcmV2aW91c0hlYWRlciA9ICQoc2VsZi5vcHRpb25zLnNlbGVjdG9ycykuZXEoaW5kZXggLSAxKSwKCiAgICAgICAgICBjdXJyZW50VGFnTmFtZSA9ICskKHRoaXMpLnByb3AoInRhZ05hbWUiKS5jaGFyQXQoMSksCgogICAgICAgICAgcHJldmlvdXNUYWdOYW1lID0gK3ByZXZpb3VzSGVhZGVyLnByb3AoInRhZ05hbWUiKS5jaGFyQXQoMSksCgogICAgICAgICAgbGFzdFN1YmhlYWRlcjsKCiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgaGVhZGVyIERPTSBlbGVtZW50IGlzIHNtYWxsZXIgdGhhbiB0aGUgcHJldmlvdXMgaGVhZGVyIERPTSBlbGVtZW50IG9yIHRoZSBmaXJzdCBzdWJoZWFkZXIKICAgICAgICBpZiAoY3VycmVudFRhZ05hbWUgPCBwcmV2aW91c1RhZ05hbWUpIHsKCiAgICAgICAgICAvLyBTZWxlY3RzIHRoZSBsYXN0IHVub3JkZXJlZCBsaXN0IEhUTUwgZm91bmQgd2l0aGluIHRoZSBIVE1MIGVsZW1lbnQgY2FsbGluZyB0aGUgcGx1Z2luCiAgICAgICAgICBzZWxmLmVsZW1lbnQuZmluZChzdWJoZWFkZXJDbGFzcyArICJbZGF0YS10YWc9IiArIGN1cnJlbnRUYWdOYW1lICsgIl0iKS5sYXN0KCkuYXBwZW5kKHNlbGYuX25lc3RFbGVtZW50cygkKHRoaXMpLCBpbmRleCkpOwoKICAgICAgICB9CgogICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGhlYWRlciBET00gZWxlbWVudCBpcyB0aGUgc2FtZSB0eXBlIG9mIGhlYWRlcihlZy4gaDQpIGFzIHRoZSBwcmV2aW91cyBoZWFkZXIgRE9NIGVsZW1lbnQKICAgICAgICBlbHNlIGlmIChjdXJyZW50VGFnTmFtZSA9PT0gcHJldmlvdXNUYWdOYW1lKSB7CgogICAgICAgICAgdWwuZmluZChpdGVtQ2xhc3MpLmxhc3QoKS5hZnRlcihzZWxmLl9uZXN0RWxlbWVudHMoJCh0aGlzKSwgaW5kZXgpKTsKCiAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAvLyBTZWxlY3RzIHRoZSBsYXN0IHVub3JkZXJlZCBsaXN0IEhUTUwgZm91bmQgd2l0aGluIHRoZSBIVE1MIGVsZW1lbnQgY2FsbGluZyB0aGUgcGx1Z2luCiAgICAgICAgICB1bC5maW5kKGl0ZW1DbGFzcykubGFzdCgpLgoKICAgICAgICAgIC8vIEFwcGVuZHMgYW4gdW5vcmRlcmVkTGlzdCBIVE1MIGVsZW1lbnQgdG8gdGhlIGR5bmFtaWMgYHVub3JkZXJlZExpc3RgIHZhcmlhYmxlIGFuZCBzZXRzIGEgY29tbW9uIGNsYXNzIG5hbWUKICAgICAgICAgIGFmdGVyKCQoIjx1bC8+IiwgewoKICAgICAgICAgICAgImNsYXNzIjogc3ViaGVhZGVyQ2xhc3NOYW1lLAoKICAgICAgICAgICAgImRhdGEtdGFnIjogY3VycmVudFRhZ05hbWUKCiAgICAgICAgICB9KSkubmV4dChzdWJoZWFkZXJDbGFzcykuCgogICAgICAgICAgLy8gQXBwZW5kcyBhIGxpc3QgaXRlbSBIVE1MIGVsZW1lbnQgdG8gdGhlIGxhc3QgdW5vcmRlcmVkIGxpc3QgSFRNTCBlbGVtZW50IGZvdW5kIHdpdGhpbiB0aGUgSFRNTCBlbGVtZW50IGNhbGxpbmcgdGhlIHBsdWdpbgogICAgICAgICAgYXBwZW5kKHNlbGYuX25lc3RFbGVtZW50cygkKHRoaXMpLCBpbmRleCkpOwogICAgICAgIH0KCiAgICAgIH0sCgogICAgICAvLyBfc2V0RXZlbnRIYW5kbGVycwogICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tCiAgICAgIC8vICAgICAgQWRkcyBqUXVlcnkgZXZlbnQgaGFuZGxlcnMgdG8gdGhlIG5ld2x5IGdlbmVyYXRlZCB0YWJsZSBvZiBjb250ZW50cwogICAgICBfc2V0RXZlbnRIYW5kbGVyczogZnVuY3Rpb24oKSB7CgogICAgICAgIC8vIF9Mb2NhbCB2YXJpYWJsZXNfCgogICAgICAgIC8vIFN0b3JlcyB0aGUgcGx1Z2luIGNvbnRleHQgaW4gdGhlIHNlbGYgdmFyaWFibGUKICAgICAgICB2YXIgc2VsZiA9IHRoaXMsCgogICAgICAgICAgLy8gSW5zdGFudGlhdGVzIGEgbmV3IHZhcmlhYmxlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGhvbGQgYSBzcGVjaWZpYyBlbGVtZW50J3MgY29udGV4dAogICAgICAgICAgJHNlbGYsCgogICAgICAgICAgLy8gSW5zdGFudGlhdGVzIGEgbmV3IHZhcmlhYmxlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgc21vb3RoU2Nyb2xsIGFuaW1hdGlvbiB0aW1lIGR1cmF0aW9uCiAgICAgICAgICBkdXJhdGlvbjsKCiAgICAgICAgLy8gRXZlbnQgZGVsZWdhdGlvbiB0aGF0IGxvb2tzIGZvciBhbnkgY2xpY2tzIG9uIGxpc3QgaXRlbSBlbGVtZW50cyBpbnNpZGUgb2YgdGhlIEhUTUwgZWxlbWVudCBjYWxsaW5nIHRoZSBwbHVnaW4KICAgICAgICB0aGlzLmVsZW1lbnQub24oImNsaWNrLnRvY2lmeSIsICJsaSIsIGZ1bmN0aW9uKGV2ZW50KSB7CgogICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5oaXN0b3J5KSB7CgogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9ICQodGhpcykuYXR0cigiZGF0YS11bmlxdWUiKTsKCiAgICAgICAgICB9CgogICAgICAgICAgLy8gUmVtb3ZlcyBoaWdobGlnaHRpbmcgZnJvbSBhbGwgb2YgdGhlIGxpc3QgaXRlbSdzCiAgICAgICAgICBzZWxmLmVsZW1lbnQuZmluZCgiLiIgKyBzZWxmLmZvY3VzQ2xhc3MpLnJlbW92ZUNsYXNzKHNlbGYuZm9jdXNDbGFzcyk7CgogICAgICAgICAgLy8gSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBsaXN0IGl0ZW0gdGhhdCB3YXMgY2xpY2tlZAogICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcyhzZWxmLmZvY3VzQ2xhc3MpOwoKICAgICAgICAgIC8vIElmIHRoZSBzaG93QW5kSGlkZSBvcHRpb24gaXMgdHJ1ZQogICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zaG93QW5kSGlkZSkgewoKICAgICAgICAgICAgdmFyIGVsZW0gPSAkKCdsaVtkYXRhLXVuaXF1ZT0iJyArICQodGhpcykuYXR0cigiZGF0YS11bmlxdWUiKSArICciXScpOwoKICAgICAgICAgICAgc2VsZi5fdHJpZ2dlclNob3coZWxlbSk7CgogICAgICAgICAgfQoKICAgICAgICAgIHNlbGYuX3Njcm9sbFRvKCQodGhpcykpOwoKICAgICAgICB9KTsKCiAgICAgICAgLy8gTW91c2VlbnRlciBhbmQgTW91c2VsZWF2ZSBldmVudCBoYW5kbGVycyBmb3IgdGhlIGxpc3QgaXRlbSdzIHdpdGhpbiB0aGUgSFRNTCBlbGVtZW50IGNhbGxpbmcgdGhlIHBsdWdpbgogICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCJsaSIpLm9uKHsKCiAgICAgICAgICAvLyBNb3VzZWVudGVyIGV2ZW50IGhhbmRsZXIKICAgICAgICAgICJtb3VzZWVudGVyLnRvY2lmeSI6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgLy8gQWRkcyBhIGhvdmVyIENTUyBjbGFzcyB0byB0aGUgY3VycmVudCBsaXN0IGl0ZW0KICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcyhzZWxmLmhvdmVyQ2xhc3MpOwoKICAgICAgICAgICAgLy8gTWFrZXMgc3VyZSB0aGUgY3Vyc29yIGlzIHNldCB0byB0aGUgcG9pbnRlciBpY29uCiAgICAgICAgICAgICQodGhpcykuY3NzKCJjdXJzb3IiLCAicG9pbnRlciIpOwoKICAgICAgICAgIH0sCgogICAgICAgICAgLy8gTW91c2VsZWF2ZSBldmVudCBoYW5kbGVyCiAgICAgICAgICAibW91c2VsZWF2ZS50b2NpZnkiOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudGhlbWUgIT09ICJib290c3RyYXAiKSB7CgogICAgICAgICAgICAgIC8vIFJlbW92ZXMgdGhlIGhvdmVyIENTUyBjbGFzcyBmcm9tIHRoZSBjdXJyZW50IGxpc3QgaXRlbQogICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3Moc2VsZi5ob3ZlckNsYXNzKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIG9ubHkgYXR0YWNoIGhhbmRsZXIgaWYgbmVlZGVkIChleHBlbnNpdmUgaW4gSUUpCiAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5leHRlbmRQYWdlIHx8IHNlbGYub3B0aW9ucy5oaWdobGlnaHRPblNjcm9sbCB8fCBzZWxmLm9wdGlvbnMuc2Nyb2xsSGlzdG9yeSB8fCBzZWxmLm9wdGlvbnMuc2hvd0FuZEhpZGVPblNjcm9sbCkgewogICAgICAgICAgLy8gV2luZG93IHNjcm9sbCBldmVudCBoYW5kbGVyCiAgICAgICAgICAkKHdpbmRvdykub24oInNjcm9sbC50b2NpZnkiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIE9uY2UgYWxsIGFuaW1hdGlvbnMgb24gdGhlIHBhZ2UgYXJlIGNvbXBsZXRlLCB0aGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCiAgICAgICAgICAgICQoImh0bWwsIGJvZHkiKS5wcm9taXNlKCkuZG9uZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgLy8gTG9jYWwgdmFyaWFibGVzCgogICAgICAgICAgICAgIC8vIFN0b3JlcyBob3cgZmFyIHRoZSB1c2VyIGhhcyBzY3JvbGxlZAogICAgICAgICAgICAgIHZhciB3aW5TY3JvbGxUb3AgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCksCgogICAgICAgICAgICAgICAgLy8gU3RvcmVzIHRoZSBoZWlnaHQgb2YgdGhlIHdpbmRvdwogICAgICAgICAgICAgICAgd2luSGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpLAoKICAgICAgICAgICAgICAgIC8vIFN0b3JlcyB0aGUgaGVpZ2h0IG9mIHRoZSBkb2N1bWVudAogICAgICAgICAgICAgICAgZG9jSGVpZ2h0ID0gJChkb2N1bWVudCkuaGVpZ2h0KCksCgogICAgICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0ID0gJCgiYm9keSIpWzBdLnNjcm9sbEhlaWdodCwKCiAgICAgICAgICAgICAgICAvLyBJbnN0YW50aWF0ZXMgYSB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBob2xkIGEgc2VsZWN0ZWQgSFRNTCBlbGVtZW50CiAgICAgICAgICAgICAgICBlbGVtLAoKICAgICAgICAgICAgICAgIGxhc3RFbGVtLAoKICAgICAgICAgICAgICAgIGxhc3RFbGVtT2Zmc2V0LAoKICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtOwoKICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmV4dGVuZFBhZ2UpIHsKCiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBoYXMgc2Nyb2xsZWQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSBhbmQgdGhlIGxhc3QgdG9jIGl0ZW0gaXMgbm90IGZvY3VzZWQKICAgICAgICAgICAgICAgIGlmICgoc2VsZi53ZWJraXQgJiYgd2luU2Nyb2xsVG9wID49IHNjcm9sbEhlaWdodCAtIHdpbkhlaWdodCAtIHNlbGYub3B0aW9ucy5leHRlbmRQYWdlT2Zmc2V0KSB8fCAoIXNlbGYud2Via2l0ICYmIHdpbkhlaWdodCArIHdpblNjcm9sbFRvcCA+IGRvY0hlaWdodCAtIHNlbGYub3B0aW9ucy5leHRlbmRQYWdlT2Zmc2V0KSkgewoKICAgICAgICAgICAgICAgICAgaWYgKCEkKGV4dGVuZFBhZ2VDbGFzcykubGVuZ3RoKSB7CgogICAgICAgICAgICAgICAgICAgIGxhc3RFbGVtID0gJCgnZGl2W2RhdGEtdW5pcXVlPSInICsgJChpdGVtQ2xhc3MpLmxhc3QoKS5hdHRyKCJkYXRhLXVuaXF1ZSIpICsgJyJdJyk7CgogICAgICAgICAgICAgICAgICAgIGlmICghbGFzdEVsZW0ubGVuZ3RoKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgIC8vIEdldHMgdGhlIHRvcCBvZmZzZXQgb2YgdGhlIHBhZ2UgaGVhZGVyIHRoYXQgaXMgbGlua2VkIHRvIHRoZSBsYXN0IHRvYyBpdGVtCiAgICAgICAgICAgICAgICAgICAgbGFzdEVsZW1PZmZzZXQgPSBsYXN0RWxlbS5vZmZzZXQoKS50b3A7CgogICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZHMgYSBkaXYgdG8gdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSBhbmQgc2V0cyB0aGUgaGVpZ2h0IHRvIHRoZSBkaWZmZXJlbmNlIG9mIHRoZSB3aW5kb3cgc2Nyb2xsVG9wIGFuZCB0aGUgbGFzdCBlbGVtZW50J3MgcG9zaXRpb24gdG9wIG9mZnNldAogICAgICAgICAgICAgICAgICAgICQoc2VsZi5vcHRpb25zLmNvbnRleHQpLmFwcGVuZCgkKCI8ZGl2Lz4iLCB7CgogICAgICAgICAgICAgICAgICAgICAgImNsYXNzIjogZXh0ZW5kUGFnZUNsYXNzTmFtZSwKCiAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0IjogTWF0aC5hYnMobGFzdEVsZW1PZmZzZXQgLSB3aW5TY3JvbGxUb3ApICsgInB4IiwKCiAgICAgICAgICAgICAgICAgICAgICAiZGF0YS11bmlxdWUiOiBleHRlbmRQYWdlQ2xhc3NOYW1lCgogICAgICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXh0ZW5kUGFnZVNjcm9sbCkgewoKICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtID0gc2VsZi5lbGVtZW50LmZpbmQoJ2xpLicgKyBzZWxmLmZvY3VzQ2xhc3MpOwoKICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Njcm9sbFRvKCQoJ2RpdltkYXRhLXVuaXF1ZT0iJyArIGN1cnJlbnRFbGVtLmF0dHIoImRhdGEtdW5pcXVlIikgKyAnIl0nKSk7CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgLy8gVGhlIHplcm8gdGltZW91dCBlbnN1cmVzIHRoZSBmb2xsb3dpbmcgY29kZSBpcyBydW4gYWZ0ZXIgdGhlIHNjcm9sbCBldmVudHMKICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIF9Mb2NhbCB2YXJpYWJsZXNfCgogICAgICAgICAgICAgICAgLy8gU3RvcmVzIHRoZSBkaXN0YW5jZSB0byB0aGUgY2xvc2VzdCBhbmNob3IKICAgICAgICAgICAgICAgIHZhciBjbG9zZXN0QW5jaG9yRGlzdGFuY2UgPSBudWxsLAoKICAgICAgICAgICAgICAgICAgLy8gU3RvcmVzIHRoZSBpbmRleCBvZiB0aGUgY2xvc2VzdCBhbmNob3IKICAgICAgICAgICAgICAgICAgY2xvc2VzdEFuY2hvcklkeCA9IG51bGwsCgogICAgICAgICAgICAgICAgICAvLyBLZWVwcyBhIHJlZmVyZW5jZSB0byBhbGwgYW5jaG9ycwogICAgICAgICAgICAgICAgICBhbmNob3JzID0gJChzZWxmLm9wdGlvbnMuY29udGV4dCkuZmluZCgiZGl2W2RhdGEtdW5pcXVlXSIpLAoKICAgICAgICAgICAgICAgICAgYW5jaG9yVGV4dDsKCiAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmVzIHRoZSBpbmRleCBvZiB0aGUgY2xvc2VzdCBhbmNob3IKICAgICAgICAgICAgICAgIGFuY2hvcnMuZWFjaChmdW5jdGlvbihpZHgpIHsKICAgICAgICAgICAgICAgICAgdmFyIGRpc3RhbmNlID0gTWF0aC5hYnMoKCQodGhpcykubmV4dCgpLmxlbmd0aCA/ICQodGhpcykubmV4dCgpIDogJCh0aGlzKSkub2Zmc2V0KCkudG9wIC0gd2luU2Nyb2xsVG9wIC0gc2VsZi5vcHRpb25zLmhpZ2hsaWdodE9mZnNldCk7CiAgICAgICAgICAgICAgICAgIGlmIChjbG9zZXN0QW5jaG9yRGlzdGFuY2UgPT0gbnVsbCB8fCBkaXN0YW5jZSA8IGNsb3Nlc3RBbmNob3JEaXN0YW5jZSkgewogICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RBbmNob3JEaXN0YW5jZSA9IGRpc3RhbmNlOwogICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RBbmNob3JJZHggPSBpZHg7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBhbmNob3JUZXh0ID0gJChhbmNob3JzW2Nsb3Nlc3RBbmNob3JJZHhdKS5hdHRyKCJkYXRhLXVuaXF1ZSIpOwoKICAgICAgICAgICAgICAgIC8vIFN0b3JlcyB0aGUgbGlzdCBpdGVtIEhUTUwgZWxlbWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50bHkgdHJhdmVyc2VkIGFuY2hvciB0YWcKICAgICAgICAgICAgICAgIGVsZW0gPSAkKCdsaVtkYXRhLXVuaXF1ZT0iJyArIGFuY2hvclRleHQgKyAnIl0nKTsKCiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYGhpZ2hsaWdodE9uU2Nyb2xsYCBvcHRpb24gaXMgdHJ1ZSBhbmQgYSBuZXh0IGVsZW1lbnQgaXMgZm91bmQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaGlnaGxpZ2h0T25TY3JvbGwgJiYgZWxlbS5sZW5ndGgpIHsKCiAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZXMgaGlnaGxpZ2h0aW5nIGZyb20gYWxsIG9mIHRoZSBsaXN0IGl0ZW0ncwogICAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQuZmluZCgiLiIgKyBzZWxmLmZvY3VzQ2xhc3MpLnJlbW92ZUNsYXNzKHNlbGYuZm9jdXNDbGFzcyk7CgogICAgICAgICAgICAgICAgICAvLyBIaWdobGlnaHRzIHRoZSBjb3JyZXNwb25kaW5nIGxpc3QgaXRlbQogICAgICAgICAgICAgICAgICBlbGVtLmFkZENsYXNzKHNlbGYuZm9jdXNDbGFzcyk7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2Nyb2xsSGlzdG9yeSkgewoKICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoICE9PSAiIyIgKyBhbmNob3JUZXh0KSB7CgogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKCIjIiArIGFuY2hvclRleHQpOwoKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBgc2hvd0FuZEhpZGVPblNjcm9sbGAgb3B0aW9uIGlzIHRydWUKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2hvd0FuZEhpZGVPblNjcm9sbCAmJiBzZWxmLm9wdGlvbnMuc2hvd0FuZEhpZGUpIHsKCiAgICAgICAgICAgICAgICAgIHNlbGYuX3RyaWdnZXJTaG93KGVsZW0sIHRydWUpOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgfSwgMCk7CgogICAgICAgICAgICB9KTsKCiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICB9LAoKICAgICAgLy8gU2hvdwogICAgICAvLyAtLS0tCiAgICAgIC8vICAgICAgT3BlbnMgdGhlIGN1cnJlbnQgc3ViLWhlYWRlcgogICAgICBzaG93OiBmdW5jdGlvbihlbGVtLCBzY3JvbGwpIHsKCiAgICAgICAgLy8gU3RvcmVzIHRoZSBwbHVnaW4gY29udGV4dCBpbiB0aGUgYHNlbGZgIHZhcmlhYmxlCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLAogICAgICAgICAgZWxlbWVudCA9IGVsZW07CgogICAgICAgIC8vIElmIHRoZSBzdWItaGVhZGVyIGlzIG5vdCBhbHJlYWR5IHZpc2libGUKICAgICAgICBpZiAoIWVsZW0uaXMoIjp2aXNpYmxlIikpIHsKCiAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW55IG5lc3RlZCBzdWJoZWFkZXJzLCBpcyBub3QgYSBoZWFkZXIsIGFuZCBpdHMgcGFyZW50IGlzIG5vdCB2aXNpYmxlCiAgICAgICAgICBpZiAoIWVsZW0uZmluZChzdWJoZWFkZXJDbGFzcykubGVuZ3RoICYmICFlbGVtLnBhcmVudCgpLmlzKGhlYWRlckNsYXNzKSAmJiAhZWxlbS5wYXJlbnQoKS5pcygiOnZpc2libGUiKSkgewoKICAgICAgICAgICAgLy8gU2V0cyB0aGUgY3VycmVudCBlbGVtZW50IHRvIGFsbCBvZiB0aGUgc3ViaGVhZGVycyB3aXRoaW4gdGhlIGN1cnJlbnQgaGVhZGVyCiAgICAgICAgICAgIGVsZW0gPSBlbGVtLnBhcmVudHMoc3ViaGVhZGVyQ2xhc3MpLmFkZChlbGVtKTsKCiAgICAgICAgICB9CgogICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFueSBuZXN0ZWQgc3ViaGVhZGVycyBhbmQgaXMgbm90IGEgaGVhZGVyCiAgICAgICAgICBlbHNlIGlmICghZWxlbS5jaGlsZHJlbihzdWJoZWFkZXJDbGFzcykubGVuZ3RoICYmICFlbGVtLnBhcmVudCgpLmlzKGhlYWRlckNsYXNzKSkgewoKICAgICAgICAgICAgLy8gU2V0cyB0aGUgY3VycmVudCBlbGVtZW50IHRvIHRoZSBjbG9zZXN0IHN1YmhlYWRlcgogICAgICAgICAgICBlbGVtID0gZWxlbS5jbG9zZXN0KHN1YmhlYWRlckNsYXNzKTsKCiAgICAgICAgICB9CgogICAgICAgICAgLy9EZXRlcm1pbmVzIHdoYXQgalF1ZXJ5IGVmZmVjdCB0byB1c2UKICAgICAgICAgIHN3aXRjaCAoc2VsZi5vcHRpb25zLnNob3dFZmZlY3QpIHsKCiAgICAgICAgICAgIC8vVXNlcyBgbm8gZWZmZWN0YAogICAgICAgICAgICBjYXNlICJub25lIjoKCiAgICAgICAgICAgICAgZWxlbS5zaG93KCk7CgogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAvL1VzZXMgdGhlIGpRdWVyeSBgc2hvd2Agc3BlY2lhbCBlZmZlY3QKICAgICAgICAgICAgY2FzZSAic2hvdyI6CgogICAgICAgICAgICAgIGVsZW0uc2hvdyhzZWxmLm9wdGlvbnMuc2hvd0VmZmVjdFNwZWVkKTsKCiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIC8vVXNlcyB0aGUgalF1ZXJ5IGBzbGlkZURvd25gIHNwZWNpYWwgZWZmZWN0CiAgICAgICAgICAgIGNhc2UgInNsaWRlRG93biI6CgogICAgICAgICAgICAgIGVsZW0uc2xpZGVEb3duKHNlbGYub3B0aW9ucy5zaG93RWZmZWN0U3BlZWQpOwoKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgLy9Vc2VzIHRoZSBqUXVlcnkgYGZhZGVJbmAgc3BlY2lhbCBlZmZlY3QKICAgICAgICAgICAgY2FzZSAiZmFkZUluIjoKCiAgICAgICAgICAgICAgZWxlbS5mYWRlSW4oc2VsZi5vcHRpb25zLnNob3dFZmZlY3RTcGVlZCk7CgogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAvL0lmIG5vbmUgb2YgdGhlIGFib3ZlIG9wdGlvbnMgd2VyZSBwYXNzZWQsIHRoZW4gYSBgalF1ZXJ5VUkgc2hvdyBlZmZlY3RgIGlzIGV4cGVjdGVkCiAgICAgICAgICAgIGRlZmF1bHQ6CgogICAgICAgICAgICAgIGVsZW0uc2hvdygpOwoKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgc3ViaGVhZGVyIHBhcmVudCBlbGVtZW50IGlzIGEgaGVhZGVyCiAgICAgICAgaWYgKGVsZW0ucGFyZW50KCkuaXMoaGVhZGVyQ2xhc3MpKSB7CgogICAgICAgICAgLy8gSGlkZXMgYWxsIG5vbi1hY3RpdmUgc3ViLWhlYWRlcnMKICAgICAgICAgIHNlbGYuaGlkZSgkKHN1YmhlYWRlckNsYXNzKS5ub3QoZWxlbSkpOwoKICAgICAgICB9CgogICAgICAgIC8vIElmIHRoZSBjdXJyZW50IHN1YmhlYWRlciBwYXJlbnQgZWxlbWVudCBpcyBub3QgYSBoZWFkZXIKICAgICAgICBlbHNlIHsKCiAgICAgICAgICAvLyBIaWRlcyBhbGwgbm9uLWFjdGl2ZSBzdWItaGVhZGVycwogICAgICAgICAgc2VsZi5oaWRlKCQoc3ViaGVhZGVyQ2xhc3MpLm5vdChlbGVtLmNsb3Nlc3QoaGVhZGVyQ2xhc3MpLmZpbmQoc3ViaGVhZGVyQ2xhc3MpLm5vdChlbGVtLnNpYmxpbmdzKCkpKSk7CgogICAgICAgIH0KCiAgICAgICAgLy8gTWFpbnRhaW5zIGNoYWluYWJsaXR5CiAgICAgICAgcmV0dXJuIHNlbGY7CgogICAgICB9LAoKICAgICAgLy8gSGlkZQogICAgICAvLyAtLS0tCiAgICAgIC8vICAgICAgQ2xvc2VzIHRoZSBjdXJyZW50IHN1Yi1oZWFkZXIKICAgICAgaGlkZTogZnVuY3Rpb24oZWxlbSkgewoKICAgICAgICAvLyBTdG9yZXMgdGhlIHBsdWdpbiBjb250ZXh0IGluIHRoZSBgc2VsZmAgdmFyaWFibGUKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIC8vRGV0ZXJtaW5lcyB3aGF0IGpRdWVyeSBlZmZlY3QgdG8gdXNlCiAgICAgICAgc3dpdGNoIChzZWxmLm9wdGlvbnMuaGlkZUVmZmVjdCkgewoKICAgICAgICAgIC8vIFVzZXMgYG5vIGVmZmVjdGAKICAgICAgICAgIGNhc2UgIm5vbmUiOgoKICAgICAgICAgICAgZWxlbS5oaWRlKCk7CgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIC8vIFVzZXMgdGhlIGpRdWVyeSBgaGlkZWAgc3BlY2lhbCBlZmZlY3QKICAgICAgICAgIGNhc2UgImhpZGUiOgoKICAgICAgICAgICAgZWxlbS5oaWRlKHNlbGYub3B0aW9ucy5oaWRlRWZmZWN0U3BlZWQpOwoKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAvLyBVc2VzIHRoZSBqUXVlcnkgYHNsaWRlVXBgIHNwZWNpYWwgZWZmZWN0CiAgICAgICAgICBjYXNlICJzbGlkZVVwIjoKCiAgICAgICAgICAgIGVsZW0uc2xpZGVVcChzZWxmLm9wdGlvbnMuaGlkZUVmZmVjdFNwZWVkKTsKCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgLy8gVXNlcyB0aGUgalF1ZXJ5IGBmYWRlT3V0YCBzcGVjaWFsIGVmZmVjdAogICAgICAgICAgY2FzZSAiZmFkZU91dCI6CgogICAgICAgICAgICBlbGVtLmZhZGVPdXQoc2VsZi5vcHRpb25zLmhpZGVFZmZlY3RTcGVlZCk7CgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIC8vIElmIG5vbmUgb2YgdGhlIGFib3ZlIG9wdGlvbnMgd2VyZSBwYXNzZWQsIHRoZW4gYSBganF1ZXJ5VUkgaGlkZSBlZmZlY3RgIGlzIGV4cGVjdGVkCiAgICAgICAgICBkZWZhdWx0OgoKICAgICAgICAgICAgZWxlbS5oaWRlKCk7CgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgfQoKICAgICAgICAvLyBNYWludGFpbnMgY2hhaW5hYmxpdHkKICAgICAgICByZXR1cm4gc2VsZjsKICAgICAgfSwKCiAgICAgIC8vIF90cmlnZ2VyU2hvdwogICAgICAvLyAtLS0tLS0tLS0tLS0KICAgICAgLy8gICAgICBEZXRlcm1pbmVzIHdoYXQgZWxlbWVudHMgZ2V0IHNob3duIG9uIHNjcm9sbCBhbmQgY2xpY2sKICAgICAgX3RyaWdnZXJTaG93OiBmdW5jdGlvbihlbGVtLCBzY3JvbGwpIHsKCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBlbGVtZW50J3MgcGFyZW50IGlzIGEgaGVhZGVyIGVsZW1lbnQgb3IgdGhlIG5leHQgZWxlbWVudCBpcyBhIG5lc3RlZCBzdWJoZWFkZXIgZWxlbWVudAogICAgICAgIGlmIChlbGVtLnBhcmVudCgpLmlzKGhlYWRlckNsYXNzKSB8fCBlbGVtLm5leHQoKS5pcyhzdWJoZWFkZXJDbGFzcykpIHsKCiAgICAgICAgICAvLyBTaG93cyB0aGUgbmV4dCBzdWItaGVhZGVyIGVsZW1lbnQKICAgICAgICAgIHNlbGYuc2hvdyhlbGVtLm5leHQoc3ViaGVhZGVyQ2xhc3MpLCBzY3JvbGwpOwoKICAgICAgICB9CgogICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGVsZW1lbnQncyBwYXJlbnQgaXMgYSBzdWJoZWFkZXIgZWxlbWVudAogICAgICAgIGVsc2UgaWYgKGVsZW0ucGFyZW50KCkuaXMoc3ViaGVhZGVyQ2xhc3MpKSB7CgogICAgICAgICAgLy8gU2hvd3MgdGhlIHBhcmVudCBzdWItaGVhZGVyIGVsZW1lbnQKICAgICAgICAgIHNlbGYuc2hvdyhlbGVtLnBhcmVudCgpLCBzY3JvbGwpOwoKICAgICAgICB9CgogICAgICAgIC8vIE1haW50YWlucyBjaGFpbmFiaWxpdHkKICAgICAgICByZXR1cm4gc2VsZjsKCiAgICAgIH0sCgogICAgICAvLyBfYWRkQ1NTQ2xhc3NlcwogICAgICAvLyAtLS0tLS0tLS0tLS0tLQogICAgICAvLyAgICAgIEFkZHMgQ1NTIGNsYXNzZXMgdG8gdGhlIG5ld2x5IGdlbmVyYXRlZCB0YWJsZSBvZiBjb250ZW50cyBIVE1MCiAgICAgIF9hZGRDU1NDbGFzc2VzOiBmdW5jdGlvbigpIHsKCiAgICAgICAgLy8gSWYgdGhlIHVzZXIgd2FudHMgYSBqcXVlcnlVSSB0aGVtZQogICAgICAgIGlmICh0aGlzLm9wdGlvbnMudGhlbWUgPT09ICJqcXVlcnl1aSIpIHsKCiAgICAgICAgICB0aGlzLmZvY3VzQ2xhc3MgPSAidWktc3RhdGUtZGVmYXVsdCI7CgogICAgICAgICAgdGhpcy5ob3ZlckNsYXNzID0gInVpLXN0YXRlLWhvdmVyIjsKCiAgICAgICAgICAvL0FkZHMgdGhlIGRlZmF1bHQgc3R5bGluZyB0byB0aGUgZHJvcGRvd24gbGlzdAogICAgICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS13aWRnZXQiKS5maW5kKCIudG9jLXRpdGxlIikuYWRkQ2xhc3MoInVpLXdpZGdldC1oZWFkZXIiKS5lbmQoKS5maW5kKCJsaSIpLmFkZENsYXNzKCJ1aS13aWRnZXQtY29udGVudCIpOwoKICAgICAgICB9CgogICAgICAgIC8vIElmIHRoZSB1c2VyIHdhbnRzIGEgdHdpdHRlckJvb3RzdHJhcCB0aGVtZQogICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy50aGVtZSA9PT0gImJvb3RzdHJhcCIpIHsKCiAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZChoZWFkZXJDbGFzcyArICIsIiArIHN1YmhlYWRlckNsYXNzKS5hZGRDbGFzcygibmF2IG5hdi1saXN0Iik7CgogICAgICAgICAgdGhpcy5mb2N1c0NsYXNzID0gImFjdGl2ZSI7CgogICAgICAgIH0KCiAgICAgICAgLy8gSWYgdGhlIHVzZXIgd2FudHMgYSB0d2l0dGVyQm9vdHN0cmFwIHRoZW1lCiAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnRoZW1lID09PSAiYm9vdHN0cmFwMyIpIHsKCiAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZChoZWFkZXJDbGFzcyArICIsIiArIHN1YmhlYWRlckNsYXNzKS5hZGRDbGFzcygibGlzdC1ncm91cCIpOwoKICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKGl0ZW1DbGFzcykuYWRkQ2xhc3MoImxpc3QtZ3JvdXAtaXRlbSIpOwoKICAgICAgICAgIHRoaXMuZm9jdXNDbGFzcyA9ICJhY3RpdmUiOwoKICAgICAgICB9CgogICAgICAgIC8vIElmIGEgdXNlciBkb2VzIG5vdCB3YW50IGEgcHJlYnVpbHQgdGhlbWUKICAgICAgICBlbHNlIHsKCiAgICAgICAgICAvLyBBZGRzIG1vcmUgbmV1dHJhbCBjbGFzc2VzIChpbnN0ZWFkIG9mIGpxdWVyeXVpKQoKICAgICAgICAgIHRoaXMuZm9jdXNDbGFzcyA9IHRvY0ZvY3VzQ2xhc3NOYW1lOwoKICAgICAgICAgIHRoaXMuaG92ZXJDbGFzcyA9IHRvY0hvdmVyQ2xhc3NOYW1lOwoKICAgICAgICB9CgogICAgICAgIC8vTWFpbnRhaW5zIGNoYWluYWJpbGl0eQogICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgfSwKCiAgICAgIC8vIHNldE9wdGlvbgogICAgICAvLyAtLS0tLS0tLS0KICAgICAgLy8gICAgICBTZXRzIGEgc2luZ2xlIFRvY2lmeSBvcHRpb24gYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbnZva2VkCiAgICAgIHNldE9wdGlvbjogZnVuY3Rpb24oKSB7CgogICAgICAgIC8vIENhbGxzIHRoZSBqUXVlcnlVSSBXaWRnZXQgRmFjdG9yeSBzZXRPcHRpb24gbWV0aG9kCiAgICAgICAgJC5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCiAgICAgIH0sCgogICAgICAvLyBzZXRPcHRpb25zCiAgICAgIC8vIC0tLS0tLS0tLS0KICAgICAgLy8gICAgICBTZXRzIGEgc2luZ2xlIG9yIG11bHRpcGxlIFRvY2lmeSBvcHRpb25zIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW52b2tlZAogICAgICBzZXRPcHRpb25zOiBmdW5jdGlvbigpIHsKCiAgICAgICAgLy8gQ2FsbHMgdGhlIGpRdWVyeVVJIFdpZGdldCBGYWN0b3J5IHNldE9wdGlvbnMgbWV0aG9kCiAgICAgICAgJC5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb25zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgogICAgICB9LAoKICAgICAgLy8gX3Njcm9sbFRvCiAgICAgIC8vIC0tLS0tLS0tLQogICAgICAvLyAgICAgIFNjcm9sbHMgdG8gYSBzcGVjaWZpYyBlbGVtZW50CiAgICAgIF9zY3JvbGxUbzogZnVuY3Rpb24oZWxlbSkgewoKICAgICAgICB2YXIgc2VsZiA9IHRoaXMsCiAgICAgICAgICBkdXJhdGlvbiA9IHNlbGYub3B0aW9ucy5zbW9vdGhTY3JvbGwgfHwgMCwKICAgICAgICAgIHNjcm9sbFRvID0gc2VsZi5vcHRpb25zLnNjcm9sbFRvLAogICAgICAgICAgY3VycmVudERpdiA9ICQoJ2RpdltkYXRhLXVuaXF1ZT0iJyArIGVsZW0uYXR0cigiZGF0YS11bmlxdWUiKSArICciXScpOwoKICAgICAgICBpZiAoIWN1cnJlbnREaXYubGVuZ3RoKSB7CgogICAgICAgICAgcmV0dXJuIHNlbGY7CgogICAgICAgIH0KCiAgICAgICAgLy8gT25jZSBhbGwgYW5pbWF0aW9ucyBvbiB0aGUgcGFnZSBhcmUgY29tcGxldGUsIHRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKICAgICAgICAkKCJodG1sLCBib2R5IikucHJvbWlzZSgpLmRvbmUoZnVuY3Rpb24oKSB7CgogICAgICAgICAgLy8gQW5pbWF0ZXMgdGhlIGh0bWwgYW5kIGJvZHkgZWxlbWVudCBzY3JvbGx0b3BzCiAgICAgICAgICAkKCJodG1sLCBib2R5IikuYW5pbWF0ZSh7CgogICAgICAgICAgICAvLyBTZXRzIHRoZSBqUXVlcnkgYHNjcm9sbFRvcGAgdG8gdGhlIHRvcCBvZmZzZXQgb2YgdGhlIEhUTUwgZGl2IHRhZyB0aGF0IG1hdGNoZXMgdGhlIGN1cnJlbnQgbGlzdCBpdGVtJ3MgYGRhdGEtdW5pcXVlYCB0YWcKICAgICAgICAgICAgInNjcm9sbFRvcCI6IGN1cnJlbnREaXYub2Zmc2V0KCkudG9wIC0gKCQuaXNGdW5jdGlvbihzY3JvbGxUbykgPyBzY3JvbGxUby5jYWxsKCkgOiBzY3JvbGxUbykgKyAicHgiCgogICAgICAgICAgfSwgewoKICAgICAgICAgICAgLy8gU2V0cyB0aGUgc21vb3RoU2Nyb2xsIGFuaW1hdGlvbiB0aW1lIGR1cmF0aW9uIHRvIHRoZSBzbW9vdGhTY3JvbGxTcGVlZCBvcHRpb24KICAgICAgICAgICAgImR1cmF0aW9uIjogZHVyYXRpb24KCiAgICAgICAgICB9KTsKCiAgICAgICAgfSk7CgogICAgICAgIC8vIE1haW50YWlucyBjaGFpbmFiaWxpdHkKICAgICAgICByZXR1cm4gc2VsZjsKCiAgICAgIH0KCiAgICB9KTsKCiAgfSkpOyAvL2VuZCBvZiBwbHVnaW4K"></script> -<script src="data:application/x-javascript;base64,Cgp3aW5kb3cuYnVpbGRUYWJzZXRzID0gZnVuY3Rpb24odG9jSUQpIHsKCiAgLy8gYnVpbGQgYSB0YWJzZXQgZnJvbSBhIHNlY3Rpb24gZGl2IHdpdGggdGhlIC50YWJzZXQgY2xhc3MKICBmdW5jdGlvbiBidWlsZFRhYnNldCh0YWJzZXQpIHsKCiAgICAvLyBjaGVjayBmb3IgZmFkZSBhbmQgcGlsbHMgb3B0aW9ucwogICAgdmFyIGZhZGUgPSB0YWJzZXQuaGFzQ2xhc3MoInRhYnNldC1mYWRlIik7CiAgICB2YXIgcGlsbHMgPSB0YWJzZXQuaGFzQ2xhc3MoInRhYnNldC1waWxscyIpOwogICAgdmFyIG5hdkNsYXNzID0gcGlsbHMgPyAibmF2LXBpbGxzIiA6ICJuYXYtdGFicyI7CgogICAgLy8gZGV0ZXJtaW5lIHRoZSBoZWFkaW5nIGxldmVsIG9mIHRoZSB0YWJzZXQgYW5kIHRhYnMKICAgIHZhciBtYXRjaCA9IHRhYnNldC5hdHRyKCdjbGFzcycpLm1hdGNoKC9sZXZlbChcZCkgLyk7CiAgICBpZiAobWF0Y2ggPT09IG51bGwpCiAgICAgIHJldHVybjsKICAgIHZhciB0YWJzZXRMZXZlbCA9IE51bWJlcihtYXRjaFsxXSk7CiAgICB2YXIgdGFiTGV2ZWwgPSB0YWJzZXRMZXZlbCArIDE7CgogICAgLy8gZmluZCBhbGwgc3ViaGVhZGluZ3MgaW1tZWRpYXRlbHkgYmVsb3cKICAgIHZhciB0YWJzID0gdGFic2V0LmZpbmQoImRpdi5zZWN0aW9uLmxldmVsIiArIHRhYkxldmVsKTsKICAgIGlmICghdGFicy5sZW5ndGgpCiAgICAgIHJldHVybjsKCiAgICAvLyBjcmVhdGUgdGFibGlzdCBhbmQgdGFiLWNvbnRlbnQgZWxlbWVudHMKICAgIHZhciB0YWJMaXN0ID0gJCgnPHVsIGNsYXNzPSJuYXYgJyArIG5hdkNsYXNzICsgJyIgcm9sZT0idGFibGlzdCI+PC91bD4nKTsKICAgICQodGFic1swXSkuYmVmb3JlKHRhYkxpc3QpOwogICAgdmFyIHRhYkNvbnRlbnQgPSAkKCc8ZGl2IGNsYXNzPSJ0YWItY29udGVudCI+PC9kaXY+Jyk7CiAgICAkKHRhYnNbMF0pLmJlZm9yZSh0YWJDb250ZW50KTsKCiAgICAvLyBidWlsZCB0aGUgdGFic2V0CiAgICB2YXIgYWN0aXZlVGFiID0gMDsKICAgIHRhYnMuZWFjaChmdW5jdGlvbihpKSB7CgogICAgICAvLyBnZXQgdGhlIHRhYiBkaXYKICAgICAgdmFyIHRhYiA9ICQodGFic1tpXSk7CgogICAgICAvLyBnZXQgdGhlIGlkIHRoZW4gc2FuaXRpemUgaXQgZm9yIHVzZSB3aXRoIGJvb3RzdHJhcCB0YWJzCiAgICAgIHZhciBpZCA9IHRhYi5hdHRyKCdpZCcpOwoKICAgICAgLy8gc2VlIGlmIHRoaXMgaXMgbWFya2VkIGFzIHRoZSBhY3RpdmUgdGFiCiAgICAgIGlmICh0YWIuaGFzQ2xhc3MoJ2FjdGl2ZScpKQogICAgICAgIGFjdGl2ZVRhYiA9IGk7CgogICAgICAvLyByZW1vdmUgYW55IHRhYmxlIG9mIGNvbnRlbnRzIGVudHJpZXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgIC8vIHRoaXMgSUQgKHNpbmNlIHdlJ2xsIGJlIHJlbW92aW5nIHRoZSBoZWFkaW5nIGVsZW1lbnQpCiAgICAgICQoImRpdiMiICsgdG9jSUQgKyAiIGxpIGFbaHJlZj0nIyIgKyBpZCArICInXSIpLnBhcmVudCgpLnJlbW92ZSgpOwoKICAgICAgLy8gc2FuaXRpemUgdGhlIGlkIGZvciB1c2Ugd2l0aCBib290c3RyYXAgdGFicwogICAgICBpZCA9IGlkLnJlcGxhY2UoL1suXC8/JiEjPD5dL2csICcnKS5yZXBsYWNlKC9ccy9nLCAnXycpOwogICAgICB0YWIuYXR0cignaWQnLCBpZCk7CgogICAgICAvLyBnZXQgdGhlIGhlYWRpbmcgZWxlbWVudCB3aXRoaW4gaXQsIGdyYWIgaXQncyB0ZXh0LCB0aGVuIHJlbW92ZSBpdAogICAgICB2YXIgaGVhZGluZyA9IHRhYi5maW5kKCdoJyArIHRhYkxldmVsICsgJzpmaXJzdCcpOwogICAgICB2YXIgaGVhZGluZ1RleHQgPSBoZWFkaW5nLmh0bWwoKTsKICAgICAgaGVhZGluZy5yZW1vdmUoKTsKCiAgICAgIC8vIGJ1aWxkIGFuZCBhcHBlbmQgdGhlIHRhYiBsaXN0IGl0ZW0KICAgICAgdmFyIGEgPSAkKCc8YSByb2xlPSJ0YWIiIGRhdGEtdG9nZ2xlPSJ0YWIiPicgKyBoZWFkaW5nVGV4dCArICc8L2E+Jyk7CiAgICAgIGEuYXR0cignaHJlZicsICcjJyArIGlkKTsKICAgICAgYS5hdHRyKCdhcmlhLWNvbnRyb2xzJywgaWQpOwogICAgICB2YXIgbGkgPSAkKCc8bGkgcm9sZT0icHJlc2VudGF0aW9uIj48L2xpPicpOwogICAgICBsaS5hcHBlbmQoYSk7CiAgICAgIHRhYkxpc3QuYXBwZW5kKGxpKTsKCiAgICAgIC8vIHNldCBpdCdzIGF0dHJpYnV0ZXMKICAgICAgdGFiLmF0dHIoJ3JvbGUnLCAndGFicGFuZWwnKTsKICAgICAgdGFiLmFkZENsYXNzKCd0YWItcGFuZScpOwogICAgICB0YWIuYWRkQ2xhc3MoJ3RhYmJlZC1wYW5lJyk7CiAgICAgIGlmIChmYWRlKQogICAgICAgIHRhYi5hZGRDbGFzcygnZmFkZScpOwoKICAgICAgLy8gbW92ZSBpdCBpbnRvIHRoZSB0YWIgY29udGVudCBkaXYKICAgICAgdGFiLmRldGFjaCgpLmFwcGVuZFRvKHRhYkNvbnRlbnQpOwogICAgfSk7CgogICAgLy8gc2V0IGFjdGl2ZSB0YWIKICAgICQodGFiTGlzdC5jaGlsZHJlbignbGknKVthY3RpdmVUYWJdKS5hZGRDbGFzcygnYWN0aXZlJyk7CiAgICB2YXIgYWN0aXZlID0gJCh0YWJDb250ZW50LmNoaWxkcmVuKCdkaXYuc2VjdGlvbicpW2FjdGl2ZVRhYl0pOwogICAgYWN0aXZlLmFkZENsYXNzKCdhY3RpdmUnKTsKICAgIGlmIChmYWRlKQogICAgICBhY3RpdmUuYWRkQ2xhc3MoJ2luJyk7CiAgfQoKICAvLyBjb252ZXJ0IHNlY3Rpb24gZGl2cyB3aXRoIHRoZSAudGFic2V0IGNsYXNzIHRvIHRhYnNldHMKICB2YXIgdGFic2V0cyA9ICQoImRpdi5zZWN0aW9uLnRhYnNldCIpOwogIHRhYnNldHMuZWFjaChmdW5jdGlvbihpKSB7CiAgICBidWlsZFRhYnNldCgkKHRhYnNldHNbaV0pKTsKICB9KTsKfTsKCg=="></script> +<script src="data:application/x-javascript;base64,CgovKioKICogalF1ZXJ5IFBsdWdpbjogU3RpY2t5IFRhYnMKICoKICogQGF1dGhvciBBaWRhbiBMaXN0ZXIgPGFpZGFuQHBocC5uZXQ+CiAqIGFkYXB0ZWQgYnkgUnViZW4gQXJzbGFuIHRvIGFjdGl2YXRlIHBhcmVudCB0YWJzIHRvbwogKiBodHRwOi8vd3d3LmFpZGFubGlzdGVyLmNvbS8yMDE0LzAzL3BlcnNpc3RpbmctdGhlLXRhYi1zdGF0ZS1pbi1ib290c3RyYXAvCiAqLwooZnVuY3Rpb24oJCkgewogICJ1c2Ugc3RyaWN0IjsKICAkLmZuLnJtYXJrZG93blN0aWNreVRhYnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjb250ZXh0ID0gdGhpczsKICAgIC8vIFNob3cgdGhlIHRhYiBjb3JyZXNwb25kaW5nIHdpdGggdGhlIGhhc2ggaW4gdGhlIFVSTCwgb3IgdGhlIGZpcnN0IHRhYgogICAgdmFyIHNob3dTdHVmZkZyb21IYXNoID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2g7CiAgICAgIHZhciBzZWxlY3RvciA9IGhhc2ggPyAnYVtocmVmPSInICsgaGFzaCArICciXScgOiAnbGkuYWN0aXZlID4gYSc7CiAgICAgIHZhciAkc2VsZWN0b3IgPSAkKHNlbGVjdG9yLCBjb250ZXh0KTsKICAgICAgaWYoJHNlbGVjdG9yLmRhdGEoJ3RvZ2dsZScpID09PSAidGFiIikgewogICAgICAgICRzZWxlY3Rvci50YWIoJ3Nob3cnKTsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBhbmNlc3RvcnMgb2YgdGhpcyBlbGVtZW50LCBzaG93IGFueSBoaWRkZW4gdGFicwogICAgICAgICRzZWxlY3Rvci5wYXJlbnRzKCcuc2VjdGlvbi50YWJzZXQnKS5lYWNoKGZ1bmN0aW9uKGksIGVsbSkgewogICAgICAgICAgdmFyIGxpbmsgPSAkKCdhW2hyZWY9IiMnICsgJChlbG0pLmF0dHIoJ2lkJykgKyAnIl0nKTsKICAgICAgICAgIGlmKGxpbmsuZGF0YSgndG9nZ2xlJykgPT09ICJ0YWIiKSB7CiAgICAgICAgICAgIGxpbmsudGFiKCJzaG93Iik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CgoKICAgIC8vIFNldCB0aGUgY29ycmVjdCB0YWIgd2hlbiB0aGUgcGFnZSBsb2FkcwogICAgc2hvd1N0dWZmRnJvbUhhc2goY29udGV4dCk7CgogICAgLy8gU2V0IHRoZSBjb3JyZWN0IHRhYiB3aGVuIGEgdXNlciB1c2VzIHRoZWlyIGJhY2svZm9yd2FyZCBidXR0b24KICAgICQod2luZG93KS5vbignaGFzaGNoYW5nZScsIGZ1bmN0aW9uKCkgewogICAgICBzaG93U3R1ZmZGcm9tSGFzaChjb250ZXh0KTsKICAgIH0pOwoKICAgIC8vIENoYW5nZSB0aGUgVVJMIHdoZW4gdGFicyBhcmUgY2xpY2tlZAogICAgJCgnYScsIGNvbnRleHQpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgbnVsbCwgdGhpcy5ocmVmKTsKICAgICAgc2hvd1N0dWZmRnJvbUhhc2goY29udGV4dCk7CiAgICB9KTsKCiAgICByZXR1cm4gdGhpczsKICB9Owp9KGpRdWVyeSkpOwoKd2luZG93LmJ1aWxkVGFic2V0cyA9IGZ1bmN0aW9uKHRvY0lEKSB7CgogIC8vIGJ1aWxkIGEgdGFic2V0IGZyb20gYSBzZWN0aW9uIGRpdiB3aXRoIHRoZSAudGFic2V0IGNsYXNzCiAgZnVuY3Rpb24gYnVpbGRUYWJzZXQodGFic2V0KSB7CgogICAgLy8gY2hlY2sgZm9yIGZhZGUgYW5kIHBpbGxzIG9wdGlvbnMKICAgIHZhciBmYWRlID0gdGFic2V0Lmhhc0NsYXNzKCJ0YWJzZXQtZmFkZSIpOwogICAgdmFyIHBpbGxzID0gdGFic2V0Lmhhc0NsYXNzKCJ0YWJzZXQtcGlsbHMiKTsKICAgIHZhciBuYXZDbGFzcyA9IHBpbGxzID8gIm5hdi1waWxscyIgOiAibmF2LXRhYnMiOwoKICAgIC8vIGRldGVybWluZSB0aGUgaGVhZGluZyBsZXZlbCBvZiB0aGUgdGFic2V0IGFuZCB0YWJzCiAgICB2YXIgbWF0Y2ggPSB0YWJzZXQuYXR0cignY2xhc3MnKS5tYXRjaCgvbGV2ZWwoXGQpIC8pOwogICAgaWYgKG1hdGNoID09PSBudWxsKQogICAgICByZXR1cm47CiAgICB2YXIgdGFic2V0TGV2ZWwgPSBOdW1iZXIobWF0Y2hbMV0pOwogICAgdmFyIHRhYkxldmVsID0gdGFic2V0TGV2ZWwgKyAxOwoKICAgIC8vIGZpbmQgYWxsIHN1YmhlYWRpbmdzIGltbWVkaWF0ZWx5IGJlbG93CiAgICB2YXIgdGFicyA9IHRhYnNldC5maW5kKCJkaXYuc2VjdGlvbi5sZXZlbCIgKyB0YWJMZXZlbCk7CiAgICBpZiAoIXRhYnMubGVuZ3RoKQogICAgICByZXR1cm47CgogICAgLy8gY3JlYXRlIHRhYmxpc3QgYW5kIHRhYi1jb250ZW50IGVsZW1lbnRzCiAgICB2YXIgdGFiTGlzdCA9ICQoJzx1bCBjbGFzcz0ibmF2ICcgKyBuYXZDbGFzcyArICciIHJvbGU9InRhYmxpc3QiPjwvdWw+Jyk7CiAgICAkKHRhYnNbMF0pLmJlZm9yZSh0YWJMaXN0KTsKICAgIHZhciB0YWJDb250ZW50ID0gJCgnPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPjwvZGl2PicpOwogICAgJCh0YWJzWzBdKS5iZWZvcmUodGFiQ29udGVudCk7CgogICAgLy8gYnVpbGQgdGhlIHRhYnNldAogICAgdmFyIGFjdGl2ZVRhYiA9IDA7CiAgICB0YWJzLmVhY2goZnVuY3Rpb24oaSkgewoKICAgICAgLy8gZ2V0IHRoZSB0YWIgZGl2CiAgICAgIHZhciB0YWIgPSAkKHRhYnNbaV0pOwoKICAgICAgLy8gZ2V0IHRoZSBpZCB0aGVuIHNhbml0aXplIGl0IGZvciB1c2Ugd2l0aCBib290c3RyYXAgdGFicwogICAgICB2YXIgaWQgPSB0YWIuYXR0cignaWQnKTsKCiAgICAgIC8vIHNlZSBpZiB0aGlzIGlzIG1hcmtlZCBhcyB0aGUgYWN0aXZlIHRhYgogICAgICBpZiAodGFiLmhhc0NsYXNzKCdhY3RpdmUnKSkKICAgICAgICBhY3RpdmVUYWIgPSBpOwoKICAgICAgLy8gcmVtb3ZlIGFueSB0YWJsZSBvZiBjb250ZW50cyBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aAogICAgICAvLyB0aGlzIElEIChzaW5jZSB3ZSdsbCBiZSByZW1vdmluZyB0aGUgaGVhZGluZyBlbGVtZW50KQogICAgICAkKCJkaXYjIiArIHRvY0lEICsgIiBsaSBhW2hyZWY9JyMiICsgaWQgKyAiJ10iKS5wYXJlbnQoKS5yZW1vdmUoKTsKCiAgICAgIC8vIHNhbml0aXplIHRoZSBpZCBmb3IgdXNlIHdpdGggYm9vdHN0cmFwIHRhYnMKICAgICAgaWQgPSBpZC5yZXBsYWNlKC9bLlwvPyYhIzw+XS9nLCAnJykucmVwbGFjZSgvXHMvZywgJ18nKTsKICAgICAgdGFiLmF0dHIoJ2lkJywgaWQpOwoKICAgICAgLy8gZ2V0IHRoZSBoZWFkaW5nIGVsZW1lbnQgd2l0aGluIGl0LCBncmFiIGl0J3MgdGV4dCwgdGhlbiByZW1vdmUgaXQKICAgICAgdmFyIGhlYWRpbmcgPSB0YWIuZmluZCgnaCcgKyB0YWJMZXZlbCArICc6Zmlyc3QnKTsKICAgICAgdmFyIGhlYWRpbmdUZXh0ID0gaGVhZGluZy5odG1sKCk7CiAgICAgIGhlYWRpbmcucmVtb3ZlKCk7CgogICAgICAvLyBidWlsZCBhbmQgYXBwZW5kIHRoZSB0YWIgbGlzdCBpdGVtCiAgICAgIHZhciBhID0gJCgnPGEgcm9sZT0idGFiIiBkYXRhLXRvZ2dsZT0idGFiIj4nICsgaGVhZGluZ1RleHQgKyAnPC9hPicpOwogICAgICBhLmF0dHIoJ2hyZWYnLCAnIycgKyBpZCk7CiAgICAgIGEuYXR0cignYXJpYS1jb250cm9scycsIGlkKTsKICAgICAgdmFyIGxpID0gJCgnPGxpIHJvbGU9InByZXNlbnRhdGlvbiI+PC9saT4nKTsKICAgICAgbGkuYXBwZW5kKGEpOwogICAgICB0YWJMaXN0LmFwcGVuZChsaSk7CgogICAgICAvLyBzZXQgaXQncyBhdHRyaWJ1dGVzCiAgICAgIHRhYi5hdHRyKCdyb2xlJywgJ3RhYnBhbmVsJyk7CiAgICAgIHRhYi5hZGRDbGFzcygndGFiLXBhbmUnKTsKICAgICAgdGFiLmFkZENsYXNzKCd0YWJiZWQtcGFuZScpOwogICAgICBpZiAoZmFkZSkKICAgICAgICB0YWIuYWRkQ2xhc3MoJ2ZhZGUnKTsKCiAgICAgIC8vIG1vdmUgaXQgaW50byB0aGUgdGFiIGNvbnRlbnQgZGl2CiAgICAgIHRhYi5kZXRhY2goKS5hcHBlbmRUbyh0YWJDb250ZW50KTsKICAgIH0pOwoKICAgIC8vIHNldCBhY3RpdmUgdGFiCiAgICAkKHRhYkxpc3QuY2hpbGRyZW4oJ2xpJylbYWN0aXZlVGFiXSkuYWRkQ2xhc3MoJ2FjdGl2ZScpOwogICAgdmFyIGFjdGl2ZSA9ICQodGFiQ29udGVudC5jaGlsZHJlbignZGl2LnNlY3Rpb24nKVthY3RpdmVUYWJdKTsKICAgIGFjdGl2ZS5hZGRDbGFzcygnYWN0aXZlJyk7CiAgICBpZiAoZmFkZSkKICAgICAgYWN0aXZlLmFkZENsYXNzKCdpbicpOwoKICAgIGlmICh0YWJzZXQuaGFzQ2xhc3MoInRhYnNldC1zdGlja3kiKSkKICAgICAgdGFic2V0LnJtYXJrZG93blN0aWNreVRhYnMoKTsKICB9CgogIC8vIGNvbnZlcnQgc2VjdGlvbiBkaXZzIHdpdGggdGhlIC50YWJzZXQgY2xhc3MgdG8gdGFic2V0cwogIHZhciB0YWJzZXRzID0gJCgiZGl2LnNlY3Rpb24udGFic2V0Iik7CiAgdGFic2V0cy5lYWNoKGZ1bmN0aW9uKGkpIHsKICAgIGJ1aWxkVGFic2V0KCQodGFic2V0c1tpXSkpOwogIH0pOwp9OwoK"></script> <link href="data:text/css;charset=utf-8,pre%20%2Eoperator%2C%0Apre%20%2Eparen%20%7B%0Acolor%3A%20rgb%28104%2C%20118%2C%20135%29%0A%7D%0Apre%20%2Eliteral%20%7B%0Acolor%3A%20%23990073%0A%7D%0Apre%20%2Enumber%20%7B%0Acolor%3A%20%23099%3B%0A%7D%0Apre%20%2Ecomment%20%7B%0Acolor%3A%20%23998%3B%0Afont%2Dstyle%3A%20italic%0A%7D%0Apre%20%2Ekeyword%20%7B%0Acolor%3A%20%23900%3B%0Afont%2Dweight%3A%20bold%0A%7D%0Apre%20%2Eidentifier%20%7B%0Acolor%3A%20rgb%280%2C%200%2C%200%29%3B%0A%7D%0Apre%20%2Estring%20%7B%0Acolor%3A%20%23d14%3B%0A%7D%0A" rel="stylesheet" /> <script src="data:application/x-javascript;base64,dmFyIGhsanM9bmV3IGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbShwKXtyZXR1cm4gcC5yZXBsYWNlKC8mL2dtLCImYW1wOyIpLnJlcGxhY2UoLzwvZ20sIiZsdDsiKX1mdW5jdGlvbiBmKHIscSxwKXtyZXR1cm4gUmVnRXhwKHEsIm0iKyhyLmNJPyJpIjoiIikrKHA/ImciOiIiKSl9ZnVuY3Rpb24gYihyKXtmb3IodmFyIHA9MDtwPHIuY2hpbGROb2Rlcy5sZW5ndGg7cCsrKXt2YXIgcT1yLmNoaWxkTm9kZXNbcF07aWYocS5ub2RlTmFtZT09IkNPREUiKXtyZXR1cm4gcX1pZighKHEubm9kZVR5cGU9PTMmJnEubm9kZVZhbHVlLm1hdGNoKC9ccysvKSkpe2JyZWFrfX19ZnVuY3Rpb24gaCh0LHMpe3ZhciBwPSIiO2Zvcih2YXIgcj0wO3I8dC5jaGlsZE5vZGVzLmxlbmd0aDtyKyspe2lmKHQuY2hpbGROb2Rlc1tyXS5ub2RlVHlwZT09Myl7dmFyIHE9dC5jaGlsZE5vZGVzW3JdLm5vZGVWYWx1ZTtpZihzKXtxPXEucmVwbGFjZSgvXG4vZywiIil9cCs9cX1lbHNle2lmKHQuY2hpbGROb2Rlc1tyXS5ub2RlTmFtZT09IkJSIil7cCs9IlxuIn1lbHNle3ArPWgodC5jaGlsZE5vZGVzW3JdKX19fWlmKC9NU0lFIFs2NzhdLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKXtwPXAucmVwbGFjZSgvXHIvZywiXG4iKX1yZXR1cm4gcH1mdW5jdGlvbiBhKHMpe3ZhciByPXMuY2xhc3NOYW1lLnNwbGl0KC9ccysvKTtyPXIuY29uY2F0KHMucGFyZW50Tm9kZS5jbGFzc05hbWUuc3BsaXQoL1xzKy8pKTtmb3IodmFyIHE9MDtxPHIubGVuZ3RoO3ErKyl7dmFyIHA9cltxXS5yZXBsYWNlKC9ebGFuZ3VhZ2UtLywiIik7aWYoZVtwXSl7cmV0dXJuIHB9fX1mdW5jdGlvbiBjKHEpe3ZhciBwPVtdOyhmdW5jdGlvbihzLHQpe2Zvcih2YXIgcj0wO3I8cy5jaGlsZE5vZGVzLmxlbmd0aDtyKyspe2lmKHMuY2hpbGROb2Rlc1tyXS5ub2RlVHlwZT09Myl7dCs9cy5jaGlsZE5vZGVzW3JdLm5vZGVWYWx1ZS5sZW5ndGh9ZWxzZXtpZihzLmNoaWxkTm9kZXNbcl0ubm9kZU5hbWU9PSJCUiIpe3QrPTF9ZWxzZXtpZihzLmNoaWxkTm9kZXNbcl0ubm9kZVR5cGU9PTEpe3AucHVzaCh7ZXZlbnQ6InN0YXJ0IixvZmZzZXQ6dCxub2RlOnMuY2hpbGROb2Rlc1tyXX0pO3Q9YXJndW1lbnRzLmNhbGxlZShzLmNoaWxkTm9kZXNbcl0sdCk7cC5wdXNoKHtldmVudDoic3RvcCIsb2Zmc2V0OnQsbm9kZTpzLmNoaWxkTm9kZXNbcl19KX19fX1yZXR1cm4gdH0pKHEsMCk7cmV0dXJuIHB9ZnVuY3Rpb24gayh5LHcseCl7dmFyIHE9MDt2YXIgej0iIjt2YXIgcz1bXTtmdW5jdGlvbiB1KCl7aWYoeS5sZW5ndGgmJncubGVuZ3RoKXtpZih5WzBdLm9mZnNldCE9d1swXS5vZmZzZXQpe3JldHVybih5WzBdLm9mZnNldDx3WzBdLm9mZnNldCk/eTp3fWVsc2V7cmV0dXJuIHdbMF0uZXZlbnQ9PSJzdGFydCI/eTp3fX1lbHNle3JldHVybiB5Lmxlbmd0aD95Ond9fWZ1bmN0aW9uIHQoRCl7dmFyIEE9IjwiK0Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtmb3IodmFyIEI9MDtCPEQuYXR0cmlidXRlcy5sZW5ndGg7QisrKXt2YXIgQz1ELmF0dHJpYnV0ZXNbQl07QSs9IiAiK0Mubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihDLnZhbHVlIT09dW5kZWZpbmVkJiZDLnZhbHVlIT09ZmFsc2UmJkMudmFsdWUhPT1udWxsKXtBKz0nPSInK20oQy52YWx1ZSkrJyInfX1yZXR1cm4gQSsiPiJ9d2hpbGUoeS5sZW5ndGh8fHcubGVuZ3RoKXt2YXIgdj11KCkuc3BsaWNlKDAsMSlbMF07eis9bSh4LnN1YnN0cihxLHYub2Zmc2V0LXEpKTtxPXYub2Zmc2V0O2lmKHYuZXZlbnQ9PSJzdGFydCIpe3orPXQodi5ub2RlKTtzLnB1c2godi5ub2RlKX1lbHNle2lmKHYuZXZlbnQ9PSJzdG9wIil7dmFyIHAscj1zLmxlbmd0aDtkb3tyLS07cD1zW3JdO3orPSgiPC8iK3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKSsiPiIpfXdoaWxlKHAhPXYubm9kZSk7cy5zcGxpY2UociwxKTt3aGlsZShyPHMubGVuZ3RoKXt6Kz10KHNbcl0pO3IrK319fX1yZXR1cm4geittKHguc3Vic3RyKHEpKX1mdW5jdGlvbiBqKCl7ZnVuY3Rpb24gcSh4LHksdil7aWYoeC5jb21waWxlZCl7cmV0dXJufXZhciB1O3ZhciBzPVtdO2lmKHguayl7eC5sUj1mKHkseC5sfHxobGpzLklSLHRydWUpO2Zvcih2YXIgdyBpbiB4Lmspe2lmKCF4LmsuaGFzT3duUHJvcGVydHkodykpe2NvbnRpbnVlfWlmKHgua1t3XSBpbnN0YW5jZW9mIE9iamVjdCl7dT14Lmtbd119ZWxzZXt1PXguazt3PSJrZXl3b3JkIn1mb3IodmFyIHIgaW4gdSl7aWYoIXUuaGFzT3duUHJvcGVydHkocikpe2NvbnRpbnVlfXgua1tyXT1bdyx1W3JdXTtzLnB1c2gocil9fX1pZighdil7aWYoeC5iV0spe3guYj0iXFxiKCIrcy5qb2luKCJ8IikrIilcXHMifXguYlI9Zih5LHguYj94LmI6IlxcQnxcXGIiKTtpZigheC5lJiYheC5lVyl7eC5lPSJcXEJ8XFxiIn1pZih4LmUpe3guZVI9Zih5LHguZSl9fWlmKHguaSl7eC5pUj1mKHkseC5pKX1pZih4LnI9PT11bmRlZmluZWQpe3gucj0xfWlmKCF4LmMpe3guYz1bXX14LmNvbXBpbGVkPXRydWU7Zm9yKHZhciB0PTA7dDx4LmMubGVuZ3RoO3QrKyl7aWYoeC5jW3RdPT0ic2VsZiIpe3guY1t0XT14fXEoeC5jW3RdLHksZmFsc2UpfWlmKHguc3RhcnRzKXtxKHguc3RhcnRzLHksZmFsc2UpfX1mb3IodmFyIHAgaW4gZSl7aWYoIWUuaGFzT3duUHJvcGVydHkocCkpe2NvbnRpbnVlfXEoZVtwXS5kTSxlW3BdLHRydWUpfX1mdW5jdGlvbiBkKEIsQyl7aWYoIWouY2FsbGVkKXtqKCk7ai5jYWxsZWQ9dHJ1ZX1mdW5jdGlvbiBxKHIsTSl7Zm9yKHZhciBMPTA7TDxNLmMubGVuZ3RoO0wrKyl7aWYoKE0uY1tMXS5iUi5leGVjKHIpfHxbbnVsbF0pWzBdPT1yKXtyZXR1cm4gTS5jW0xdfX19ZnVuY3Rpb24gdihMLHIpe2lmKERbTF0uZSYmRFtMXS5lUi50ZXN0KHIpKXtyZXR1cm4gMX1pZihEW0xdLmVXKXt2YXIgTT12KEwtMSxyKTtyZXR1cm4gTT9NKzE6MH1yZXR1cm4gMH1mdW5jdGlvbiB3KHIsTCl7cmV0dXJuIEwuaSYmTC5pUi50ZXN0KHIpfWZ1bmN0aW9uIEsoTixPKXt2YXIgTT1bXTtmb3IodmFyIEw9MDtMPE4uYy5sZW5ndGg7TCsrKXtNLnB1c2goTi5jW0xdLmIpfXZhciByPUQubGVuZ3RoLTE7ZG97aWYoRFtyXS5lKXtNLnB1c2goRFtyXS5lKX1yLS19d2hpbGUoRFtyKzFdLmVXKTtpZihOLmkpe00ucHVzaChOLmkpfXJldHVybiBmKE8sTS5qb2luKCJ8IiksdHJ1ZSl9ZnVuY3Rpb24gcChNLEwpe3ZhciBOPURbRC5sZW5ndGgtMV07aWYoIU4udCl7Ti50PUsoTixFKX1OLnQubGFzdEluZGV4PUw7dmFyIHI9Ti50LmV4ZWMoTSk7cmV0dXJuIHI/W00uc3Vic3RyKEwsci5pbmRleC1MKSxyWzBdLGZhbHNlXTpbTS5zdWJzdHIoTCksIiIsdHJ1ZV19ZnVuY3Rpb24geihOLHIpe3ZhciBMPUUuY0k/clswXS50b0xvd2VyQ2FzZSgpOnJbMF07dmFyIE09Ti5rW0xdO2lmKE0mJk0gaW5zdGFuY2VvZiBBcnJheSl7cmV0dXJuIE19cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIEYoTCxQKXtMPW0oTCk7aWYoIVAuayl7cmV0dXJuIEx9dmFyIHI9IiI7dmFyIE89MDtQLmxSLmxhc3RJbmRleD0wO3ZhciBNPVAubFIuZXhlYyhMKTt3aGlsZShNKXtyKz1MLnN1YnN0cihPLE0uaW5kZXgtTyk7dmFyIE49eihQLE0pO2lmKE4pe3grPU5bMV07cis9JzxzcGFuIGNsYXNzPSInK05bMF0rJyI+JytNWzBdKyI8L3NwYW4+In1lbHNle3IrPU1bMF19Tz1QLmxSLmxhc3RJbmRleDtNPVAubFIuZXhlYyhMKX1yZXR1cm4gcitMLnN1YnN0cihPLEwubGVuZ3RoLU8pfWZ1bmN0aW9uIEooTCxNKXtpZihNLnNMJiZlW00uc0xdKXt2YXIgcj1kKE0uc0wsTCk7eCs9ci5rZXl3b3JkX2NvdW50O3JldHVybiByLnZhbHVlfWVsc2V7cmV0dXJuIEYoTCxNKX19ZnVuY3Rpb24gSShNLHIpe3ZhciBMPU0uY04/JzxzcGFuIGNsYXNzPSInK00uY04rJyI+JzoiIjtpZihNLnJCKXt5Kz1MO00uYnVmZmVyPSIifWVsc2V7aWYoTS5lQil7eSs9bShyKStMO00uYnVmZmVyPSIifWVsc2V7eSs9TDtNLmJ1ZmZlcj1yfX1ELnB1c2goTSk7QSs9TS5yfWZ1bmN0aW9uIEcoTixNLFEpe3ZhciBSPURbRC5sZW5ndGgtMV07aWYoUSl7eSs9SihSLmJ1ZmZlcitOLFIpO3JldHVybiBmYWxzZX12YXIgUD1xKE0sUik7aWYoUCl7eSs9SihSLmJ1ZmZlcitOLFIpO0koUCxNKTtyZXR1cm4gUC5yQn12YXIgTD12KEQubGVuZ3RoLTEsTSk7aWYoTCl7dmFyIE89Ui5jTj8iPC9zcGFuPiI6IiI7aWYoUi5yRSl7eSs9SihSLmJ1ZmZlcitOLFIpK099ZWxzZXtpZihSLmVFKXt5Kz1KKFIuYnVmZmVyK04sUikrTyttKE0pfWVsc2V7eSs9SihSLmJ1ZmZlcitOK00sUikrT319d2hpbGUoTD4xKXtPPURbRC5sZW5ndGgtMl0uY04/Ijwvc3Bhbj4iOiIiO3krPU87TC0tO0QubGVuZ3RoLS19dmFyIHI9RFtELmxlbmd0aC0xXTtELmxlbmd0aC0tO0RbRC5sZW5ndGgtMV0uYnVmZmVyPSIiO2lmKHIuc3RhcnRzKXtJKHIuc3RhcnRzLCIiKX1yZXR1cm4gUi5yRX1pZih3KE0sUikpe3Rocm93IklsbGVnYWwifX12YXIgRT1lW0JdO3ZhciBEPVtFLmRNXTt2YXIgQT0wO3ZhciB4PTA7dmFyIHk9IiI7dHJ5e3ZhciBzLHU9MDtFLmRNLmJ1ZmZlcj0iIjtkb3tzPXAoQyx1KTt2YXIgdD1HKHNbMF0sc1sxXSxzWzJdKTt1Kz1zWzBdLmxlbmd0aDtpZighdCl7dSs9c1sxXS5sZW5ndGh9fXdoaWxlKCFzWzJdKTtpZihELmxlbmd0aD4xKXt0aHJvdyJJbGxlZ2FsIn1yZXR1cm57cjpBLGtleXdvcmRfY291bnQ6eCx2YWx1ZTp5fX1jYXRjaChIKXtpZihIPT0iSWxsZWdhbCIpe3JldHVybntyOjAsa2V5d29yZF9jb3VudDowLHZhbHVlOm0oQyl9fWVsc2V7dGhyb3cgSH19fWZ1bmN0aW9uIGcodCl7dmFyIHA9e2tleXdvcmRfY291bnQ6MCxyOjAsdmFsdWU6bSh0KX07dmFyIHI9cDtmb3IodmFyIHEgaW4gZSl7aWYoIWUuaGFzT3duUHJvcGVydHkocSkpe2NvbnRpbnVlfXZhciBzPWQocSx0KTtzLmxhbmd1YWdlPXE7aWYocy5rZXl3b3JkX2NvdW50K3Mucj5yLmtleXdvcmRfY291bnQrci5yKXtyPXN9aWYocy5rZXl3b3JkX2NvdW50K3Mucj5wLmtleXdvcmRfY291bnQrcC5yKXtyPXA7cD1zfX1pZihyLmxhbmd1YWdlKXtwLnNlY29uZF9iZXN0PXJ9cmV0dXJuIHB9ZnVuY3Rpb24gaShyLHEscCl7aWYocSl7cj1yLnJlcGxhY2UoL14oKDxbXj5dKz58XHQpKykvZ20sZnVuY3Rpb24odCx3LHYsdSl7cmV0dXJuIHcucmVwbGFjZSgvXHQvZyxxKX0pfWlmKHApe3I9ci5yZXBsYWNlKC9cbi9nLCI8YnI+Iil9cmV0dXJuIHJ9ZnVuY3Rpb24gbih0LHcscil7dmFyIHg9aCh0LHIpO3ZhciB2PWEodCk7dmFyIHkscztpZih2KXt5PWQodix4KX1lbHNle3JldHVybn12YXIgcT1jKHQpO2lmKHEubGVuZ3RoKXtzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInByZSIpO3MuaW5uZXJIVE1MPXkudmFsdWU7eS52YWx1ZT1rKHEsYyhzKSx4KX15LnZhbHVlPWkoeS52YWx1ZSx3LHIpO3ZhciB1PXQuY2xhc3NOYW1lO2lmKCF1Lm1hdGNoKCIoXFxzfF4pKGxhbmd1YWdlLSk/Iit2KyIoXFxzfCQpIikpe3U9dT8odSsiICIrdik6dn1pZigvTVNJRSBbNjc4XS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmdC50YWdOYW1lPT0iQ09ERSImJnQucGFyZW50Tm9kZS50YWdOYW1lPT0iUFJFIil7cz10LnBhcmVudE5vZGU7dmFyIHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cC5pbm5lckhUTUw9IjxwcmU+PGNvZGU+Iit5LnZhbHVlKyI8L2NvZGU+PC9wcmU+Ijt0PXAuZmlyc3RDaGlsZC5maXJzdENoaWxkO3AuZmlyc3RDaGlsZC5jTj1zLmNOO3MucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQocC5maXJzdENoaWxkLHMpfWVsc2V7dC5pbm5lckhUTUw9eS52YWx1ZX10LmNsYXNzTmFtZT11O3QucmVzdWx0PXtsYW5ndWFnZTp2LGt3Onkua2V5d29yZF9jb3VudCxyZTp5LnJ9O2lmKHkuc2Vjb25kX2Jlc3Qpe3Quc2Vjb25kX2Jlc3Q9e2xhbmd1YWdlOnkuc2Vjb25kX2Jlc3QubGFuZ3VhZ2Usa3c6eS5zZWNvbmRfYmVzdC5rZXl3b3JkX2NvdW50LHJlOnkuc2Vjb25kX2Jlc3Qucn19fWZ1bmN0aW9uIG8oKXtpZihvLmNhbGxlZCl7cmV0dXJufW8uY2FsbGVkPXRydWU7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByZSIpO2Zvcih2YXIgcD0wO3A8ci5sZW5ndGg7cCsrKXt2YXIgcT1iKHJbcF0pO2lmKHEpe24ocSxobGpzLnRhYlJlcGxhY2UpfX19ZnVuY3Rpb24gbCgpe2lmKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsbyxmYWxzZSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLG8sZmFsc2UpfWVsc2V7aWYod2luZG93LmF0dGFjaEV2ZW50KXt3aW5kb3cuYXR0YWNoRXZlbnQoIm9ubG9hZCIsbyl9ZWxzZXt3aW5kb3cub25sb2FkPW99fX12YXIgZT17fTt0aGlzLkxBTkdVQUdFUz1lO3RoaXMuaGlnaGxpZ2h0PWQ7dGhpcy5oaWdobGlnaHRBdXRvPWc7dGhpcy5maXhNYXJrdXA9aTt0aGlzLmhpZ2hsaWdodEJsb2NrPW47dGhpcy5pbml0SGlnaGxpZ2h0aW5nPW87dGhpcy5pbml0SGlnaGxpZ2h0aW5nT25Mb2FkPWw7dGhpcy5JUj0iW2EtekEtWl1bYS16QS1aMC05X10qIjt0aGlzLlVJUj0iW2EtekEtWl9dW2EtekEtWjAtOV9dKiI7dGhpcy5OUj0iXFxiXFxkKyhcXC5cXGQrKT8iO3RoaXMuQ05SPSJcXGIoMFt4WF1bYS1mQS1GMC05XSt8KFxcZCsoXFwuXFxkKik/fFxcLlxcZCspKFtlRV1bLStdP1xcZCspPykiO3RoaXMuQk5SPSJcXGIoMGJbMDFdKykiO3RoaXMuUlNSPSIhfCE9fCE9PXwlfCU9fCZ8JiZ8Jj18XFwqfFxcKj18XFwrfFxcKz18LHxcXC58LXwtPXwvfC89fDp8O3w8fDw8fDw8PXw8PXw9fD09fD09PXw+fD49fD4+fD4+PXw+Pj58Pj4+PXxcXD98XFxbfFxce3xcXCh8XFxefFxcXj18XFx8fFxcfD18XFx8XFx8fH4iO3RoaXMuRVI9Iig/IVtcXHNcXFNdKSI7dGhpcy5CRT17YjoiXFxcXC4iLHI6MH07dGhpcy5BU009e2NOOiJzdHJpbmciLGI6IiciLGU6IiciLGk6IlxcbiIsYzpbdGhpcy5CRV0scjowfTt0aGlzLlFTTT17Y046InN0cmluZyIsYjonIicsZTonIicsaToiXFxuIixjOlt0aGlzLkJFXSxyOjB9O3RoaXMuQ0xDTT17Y046ImNvbW1lbnQiLGI6Ii8vIixlOiIkIn07dGhpcy5DQkxDTE09e2NOOiJjb21tZW50IixiOiIvXFwqIixlOiJcXCovIn07dGhpcy5IQ009e2NOOiJjb21tZW50IixiOiIjIixlOiIkIn07dGhpcy5OTT17Y046Im51bWJlciIsYjp0aGlzLk5SLHI6MH07dGhpcy5DTk09e2NOOiJudW1iZXIiLGI6dGhpcy5DTlIscjowfTt0aGlzLkJOTT17Y046Im51bWJlciIsYjp0aGlzLkJOUixyOjB9O3RoaXMuaW5oZXJpdD1mdW5jdGlvbihyLHMpe3ZhciBwPXt9O2Zvcih2YXIgcSBpbiByKXtwW3FdPXJbcV19aWYocyl7Zm9yKHZhciBxIGluIHMpe3BbcV09c1txXX19cmV0dXJuIHB9fSgpO2hsanMuTEFOR1VBR0VTLmJhc2g9ZnVuY3Rpb24oKXt2YXIgZT17InRydWUiOjEsImZhbHNlIjoxfTt2YXIgYj17Y046InZhcmlhYmxlIixiOiJcXCQoW2EtekEtWjAtOV9dKylcXGIifTt2YXIgYT17Y046InZhcmlhYmxlIixiOiJcXCRcXHsoKFtefV0pfChcXFxcfSkpK1xcfSIsYzpbaGxqcy5DTk1dfTt2YXIgZj17Y046InN0cmluZyIsYjonIicsZTonIicsaToiXFxuIixjOltobGpzLkJFLGIsYV0scjowfTt2YXIgYz17Y046InN0cmluZyIsYjoiJyIsZToiJyIsYzpbe2I6IicnIn1dLHI6MH07dmFyIGQ9e2NOOiJ0ZXN0X2NvbmRpdGlvbiIsYjoiIixlOiIiLGM6W2YsYyxiLGEsaGxqcy5DTk1dLGs6e2xpdGVyYWw6ZX0scjowfTtyZXR1cm57ZE06e2s6e2tleXdvcmQ6eyJpZiI6MSx0aGVuOjEsImVsc2UiOjEsZmk6MSwiZm9yIjoxLCJicmVhayI6MSwiY29udGludWUiOjEsIndoaWxlIjoxLCJpbiI6MSwiZG8iOjEsZG9uZToxLGVjaG86MSxleGl0OjEsInJldHVybiI6MSxzZXQ6MSxkZWNsYXJlOjF9LGxpdGVyYWw6ZX0sYzpbe2NOOiJzaGViYW5nIixiOiIoIyFcXC9iaW5cXC9iYXNoKXwoIyFcXC9iaW5cXC9zaCkiLHI6MTB9LGIsYSxobGpzLkhDTSxobGpzLkNOTSxmLGMsaGxqcy5pbmhlcml0KGQse2I6IlxcWyAiLGU6IiBcXF0iLHI6MH0pLGhsanMuaW5oZXJpdChkLHtiOiJcXFtcXFsgIixlOiIgXFxdXFxdIn0pXX19fSgpO2hsanMuTEFOR1VBR0VTLmNwcD1mdW5jdGlvbigpe3ZhciBhPXtrZXl3b3JkOnsiZmFsc2UiOjEsImludCI6MSwiZmxvYXQiOjEsIndoaWxlIjoxLCJwcml2YXRlIjoxLCJjaGFyIjoxLCJjYXRjaCI6MSwiZXhwb3J0IjoxLHZpcnR1YWw6MSxvcGVyYXRvcjoyLHNpemVvZjoyLGR5bmFtaWNfY2FzdDoyLHR5cGVkZWY6Mixjb25zdF9jYXN0OjIsImNvbnN0IjoxLHN0cnVjdDoxLCJmb3IiOjEsc3RhdGljX2Nhc3Q6Mix1bmlvbjoxLG5hbWVzcGFjZToxLHVuc2lnbmVkOjEsImxvbmciOjEsInRocm93IjoxLCJ2b2xhdGlsZSI6Miwic3RhdGljIjoxLCJwcm90ZWN0ZWQiOjEsYm9vbDoxLHRlbXBsYXRlOjEsbXV0YWJsZToxLCJpZiI6MSwicHVibGljIjoxLGZyaWVuZDoyLCJkbyI6MSwicmV0dXJuIjoxLCJnb3RvIjoxLGF1dG86MSwidm9pZCI6MiwiZW51bSI6MSwiZWxzZSI6MSwiYnJlYWsiOjEsIm5ldyI6MSxleHRlcm46MSx1c2luZzoxLCJ0cnVlIjoxLCJjbGFzcyI6MSxhc206MSwiY2FzZSI6MSx0eXBlaWQ6MSwic2hvcnQiOjEscmVpbnRlcnByZXRfY2FzdDoyLCJkZWZhdWx0IjoxLCJkb3VibGUiOjEscmVnaXN0ZXI6MSxleHBsaWNpdDoxLHNpZ25lZDoxLHR5cGVuYW1lOjEsInRyeSI6MSwidGhpcyI6MSwic3dpdGNoIjoxLCJjb250aW51ZSI6MSx3Y2hhcl90OjEsaW5saW5lOjEsImRlbGV0ZSI6MSxhbGlnbm9mOjEsY2hhcjE2X3Q6MSxjaGFyMzJfdDoxLGNvbnN0ZXhwcjoxLGRlY2x0eXBlOjEsbm9leGNlcHQ6MSxudWxscHRyOjEsc3RhdGljX2Fzc2VydDoxLHRocmVhZF9sb2NhbDoxLHJlc3RyaWN0OjEsX0Jvb2w6MSxjb21wbGV4OjF9LGJ1aWx0X2luOntzdGQ6MSxzdHJpbmc6MSxjaW46MSxjb3V0OjEsY2VycjoxLGNsb2c6MSxzdHJpbmdzdHJlYW06MSxpc3RyaW5nc3RyZWFtOjEsb3N0cmluZ3N0cmVhbToxLGF1dG9fcHRyOjEsZGVxdWU6MSxsaXN0OjEscXVldWU6MSxzdGFjazoxLHZlY3RvcjoxLG1hcDoxLHNldDoxLGJpdHNldDoxLG11bHRpc2V0OjEsbXVsdGltYXA6MSx1bm9yZGVyZWRfc2V0OjEsdW5vcmRlcmVkX21hcDoxLHVub3JkZXJlZF9tdWx0aXNldDoxLHVub3JkZXJlZF9tdWx0aW1hcDoxLGFycmF5OjEsc2hhcmVkX3B0cjoxfX07cmV0dXJue2RNOntrOmEsaToiPC8iLGM6W2hsanMuQ0xDTSxobGpzLkNCTENMTSxobGpzLlFTTSx7Y046InN0cmluZyIsYjoiJ1xcXFw/LiIsZToiJyIsaToiLiJ9LHtjTjoibnVtYmVyIixiOiJcXGIoXFxkKyhcXC5cXGQqKT98XFwuXFxkKykodXxVfGx8THx1bHxVTHxmfEYpIn0saGxqcy5DTk0se2NOOiJwcmVwcm9jZXNzb3IiLGI6IiMiLGU6IiQifSx7Y046InN0bF9jb250YWluZXIiLGI6IlxcYihkZXF1ZXxsaXN0fHF1ZXVlfHN0YWNrfHZlY3RvcnxtYXB8c2V0fGJpdHNldHxtdWx0aXNldHxtdWx0aW1hcHx1bm9yZGVyZWRfbWFwfHVub3JkZXJlZF9zZXR8dW5vcmRlcmVkX211bHRpc2V0fHVub3JkZXJlZF9tdWx0aW1hcHxhcnJheSlcXHMqPCIsZToiPiIsazphLHI6MTAsYzpbInNlbGYiXX1dfX19KCk7aGxqcy5MQU5HVUFHRVMuY3NzPWZ1bmN0aW9uKCl7dmFyIGE9e2NOOiJmdW5jdGlvbiIsYjpobGpzLklSKyJcXCgiLGU6IlxcKSIsYzpbe2VXOnRydWUsZUU6dHJ1ZSxjOltobGpzLk5NLGhsanMuQVNNLGhsanMuUVNNXX1dfTtyZXR1cm57Y0k6dHJ1ZSxkTTp7aToiWz0vfCddIixjOltobGpzLkNCTENMTSx7Y046ImlkIixiOiJcXCNbQS1aYS16MC05Xy1dKyJ9LHtjTjoiY2xhc3MiLGI6IlxcLltBLVphLXowLTlfLV0rIixyOjB9LHtjTjoiYXR0cl9zZWxlY3RvciIsYjoiXFxbIixlOiJcXF0iLGk6IiQifSx7Y046InBzZXVkbyIsYjoiOig6KT9bYS16QS1aMC05XFxfXFwtXFwrXFwoXFwpXFxcIlxcJ10rIn0se2NOOiJhdF9ydWxlIixiOiJAKGZvbnQtZmFjZXxwYWdlKSIsbDoiW2Etei1dKyIsazp7ImZvbnQtZmFjZSI6MSxwYWdlOjF9fSx7Y046ImF0X3J1bGUiLGI6IkAiLGU6Ilt7O10iLGVFOnRydWUsazp7ImltcG9ydCI6MSxwYWdlOjEsbWVkaWE6MSxjaGFyc2V0OjF9LGM6W2EsaGxqcy5BU00saGxqcy5RU00saGxqcy5OTV19LHtjTjoidGFnIixiOmhsanMuSVIscjowfSx7Y046InJ1bGVzIixiOiJ7IixlOiJ9IixpOiJbXlxcc10iLHI6MCxjOltobGpzLkNCTENMTSx7Y046InJ1bGUiLGI6IlteXFxzXSIsckI6dHJ1ZSxlOiI7IixlVzp0cnVlLGM6W3tjTjoiYXR0cmlidXRlIixiOiJbQS1aXFxfXFwuXFwtXSsiLGU6IjoiLGVFOnRydWUsaToiW15cXHNdIixzdGFydHM6e2NOOiJ2YWx1ZSIsZVc6dHJ1ZSxlRTp0cnVlLGM6W2EsaGxqcy5OTSxobGpzLlFTTSxobGpzLkFTTSxobGpzLkNCTENMTSx7Y046ImhleGNvbG9yIixiOiJcXCNbMC05QS1GXSsifSx7Y046ImltcG9ydGFudCIsYjoiIWltcG9ydGFudCJ9XX19XX1dfV19fX0oKTtobGpzLkxBTkdVQUdFUy5pbmk9e2NJOnRydWUsZE06e2k6IlteXFxzXSIsYzpbe2NOOiJjb21tZW50IixiOiI7IixlOiIkIn0se2NOOiJ0aXRsZSIsYjoiXlxcWyIsZToiXFxdIn0se2NOOiJzZXR0aW5nIixiOiJeW2EtejAtOV9cXFtcXF1dK1sgXFx0XSo9WyBcXHRdKiIsZToiJCIsYzpbe2NOOiJ2YWx1ZSIsZVc6dHJ1ZSxrOntvbjoxLG9mZjoxLCJ0cnVlIjoxLCJmYWxzZSI6MSx5ZXM6MSxubzoxfSxjOltobGpzLlFTTSxobGpzLk5NXX1dfV19fTtobGpzLkxBTkdVQUdFUy5wZXJsPWZ1bmN0aW9uKCl7dmFyIGQ9e2dldHB3ZW50OjEsZ2V0c2VydmVudDoxLHF1b3RlbWV0YToxLG1zZ3JjdjoxLHNjYWxhcjoxLGtpbGw6MSxkYm1jbG9zZToxLHVuZGVmOjEsbGM6MSxtYToxLHN5c3dyaXRlOjEsdHI6MSxzZW5kOjEsdW1hc2s6MSxzeXNvcGVuOjEsc2htd3JpdGU6MSx2ZWM6MSxxeDoxLHV0aW1lOjEsbG9jYWw6MSxvY3Q6MSxzZW1jdGw6MSxsb2NhbHRpbWU6MSxyZWFkcGlwZToxLCJkbyI6MSwicmV0dXJuIjoxLGZvcm1hdDoxLHJlYWQ6MSxzcHJpbnRmOjEsZGJtb3BlbjoxLHBvcDoxLGdldHBncnA6MSxub3Q6MSxnZXRwd25hbToxLHJld2luZGRpcjoxLHFxOjEsZmlsZW5vOjEscXc6MSxlbmRwcm90b2VudDoxLHdhaXQ6MSxzZXRob3N0ZW50OjEsYmxlc3M6MSxzOjAsb3BlbmRpcjoxLCJjb250aW51ZSI6MSxlYWNoOjEsc2xlZXA6MSxlbmRncmVudDoxLHNodXRkb3duOjEsZHVtcDoxLGNob21wOjEsY29ubmVjdDoxLGdldHNvY2tuYW1lOjEsZGllOjEsc29ja2V0cGFpcjoxLGNsb3NlOjEsZmxvY2s6MSxleGlzdHM6MSxpbmRleDoxLHNobWdldDoxLHN1YjoxLCJmb3IiOjEsZW5kcHdlbnQ6MSxyZWRvOjEsbHN0YXQ6MSxtc2djdGw6MSxzZXRwZ3JwOjEsYWJzOjEsZXhpdDoxLHNlbGVjdDoxLHByaW50OjEscmVmOjEsZ2V0aG9zdGJ5YWRkcjoxLHVuc2hpZnQ6MSxmY250bDoxLHN5c2NhbGw6MSwiZ290byI6MSxnZXRuZXRieWFkZHI6MSxqb2luOjEsZ210aW1lOjEsc3ltbGluazoxLHNlbWdldDoxLHNwbGljZToxLHg6MCxnZXRwZWVybmFtZToxLHJlY3Y6MSxsb2c6MSxzZXRzb2Nrb3B0OjEsY29zOjEsbGFzdDoxLHJldmVyc2U6MSxnZXRob3N0YnluYW1lOjEsZ2V0Z3JuYW06MSxzdHVkeToxLGZvcm1saW5lOjEsZW5kaG9zdGVudDoxLHRpbWVzOjEsY2hvcDoxLGxlbmd0aDoxLGdldGhvc3RlbnQ6MSxnZXRuZXRlbnQ6MSxwYWNrOjEsZ2V0cHJvdG9lbnQ6MSxnZXRzZXJ2YnluYW1lOjEscmFuZDoxLG1rZGlyOjEscG9zOjEsY2htb2Q6MSx5OjAsc3Vic3RyOjEsZW5kbmV0ZW50OjEscHJpbnRmOjEsbmV4dDoxLG9wZW46MSxtc2dzbmQ6MSxyZWFkZGlyOjEsdXNlOjEsdW5saW5rOjEsZ2V0c29ja29wdDoxLGdldHByaW9yaXR5OjEscmluZGV4OjEsd2FudGFycmF5OjEsaGV4OjEsc3lzdGVtOjEsZ2V0c2VydmJ5cG9ydDoxLGVuZHNlcnZlbnQ6MSwiaW50IjoxLGNocjoxLHVudGllOjEscm1kaXI6MSxwcm90b3R5cGU6MSx0ZWxsOjEsbGlzdGVuOjEsZm9yazoxLHNobXJlYWQ6MSx1Y2ZpcnN0OjEsc2V0cHJvdG9lbnQ6MSwiZWxzZSI6MSxzeXNzZWVrOjEsbGluazoxLGdldGdyZ2lkOjEsc2htY3RsOjEsd2FpdHBpZDoxLHVucGFjazoxLGdldG5ldGJ5bmFtZToxLHJlc2V0OjEsY2hkaXI6MSxncmVwOjEsc3BsaXQ6MSxyZXF1aXJlOjEsY2FsbGVyOjEsbGNmaXJzdDoxLHVudGlsOjEsd2FybjoxLCJ3aGlsZSI6MSx2YWx1ZXM6MSxzaGlmdDoxLHRlbGxkaXI6MSxnZXRwd3VpZDoxLG15OjEsZ2V0cHJvdG9ieW51bWJlcjoxLCJkZWxldGUiOjEsYW5kOjEsc29ydDoxLHVjOjEsZGVmaW5lZDoxLHNyYW5kOjEsYWNjZXB0OjEsInBhY2thZ2UiOjEsc2Vla2RpcjoxLGdldHByb3RvYnluYW1lOjEsc2Vtb3A6MSxvdXI6MSxyZW5hbWU6MSxzZWVrOjEsImlmIjoxLHE6MCxjaHJvb3Q6MSxzeXNyZWFkOjEsc2V0cHdlbnQ6MSxubzoxLGNyeXB0OjEsZ2V0YzoxLGNob3duOjEsc3FydDoxLHdyaXRlOjEsc2V0bmV0ZW50OjEsc2V0cHJpb3JpdHk6MSxmb3JlYWNoOjEsdGllOjEsc2luOjEsbXNnZ2V0OjEsbWFwOjEsc3RhdDoxLGdldGxvZ2luOjEsdW5sZXNzOjEsZWxzaWY6MSx0cnVuY2F0ZToxLGV4ZWM6MSxrZXlzOjEsZ2xvYjoxLHRpZWQ6MSxjbG9zZWRpcjoxLGlvY3RsOjEsc29ja2V0OjEscmVhZGxpbms6MSwiZXZhbCI6MSx4b3I6MSxyZWFkbGluZToxLGJpbm1vZGU6MSxzZXRzZXJ2ZW50OjEsZW9mOjEsb3JkOjEsYmluZDoxLGFsYXJtOjEscGlwZToxLGF0YW4yOjEsZ2V0Z3JlbnQ6MSxleHA6MSx0aW1lOjEscHVzaDoxLHNldGdyZW50OjEsZ3Q6MSxsdDoxLG9yOjEsbmU6MSxtOjB9O3ZhciBmPXtjTjoic3Vic3QiLGI6IlskQF1cXHsiLGU6IlxcfSIsazpkLHI6MTB9O3ZhciBjPXtjTjoidmFyaWFibGUiLGI6IlxcJFxcZCJ9O3ZhciBiPXtjTjoidmFyaWFibGUiLGI6IltcXCRcXCVcXEBcXCpdKFxcXlxcd1xcYnwjXFx3KyhcXDpcXDpcXHcrKSp8W15cXHNcXHd7XXx7XFx3K318XFx3KyhcXDpcXDpcXHcqKSopIn07dmFyIGg9W2hsanMuQkUsZixjLGJdO3ZhciBnPXtiOiItPiIsYzpbe2I6aGxqcy5JUn0se2I6InsiLGU6In0ifV19O3ZhciBlPXtjTjoiY29tbWVudCIsYjoiXihfX0VORF9ffF9fREFUQV9fKSIsZToiXFxuJCIscjo1fTt2YXIgYT1bYyxiLGhsanMuSENNLGUsZyx7Y046InN0cmluZyIsYjoicVtxd3hyXT9cXHMqXFwoIixlOiJcXCkiLGM6aCxyOjV9LHtjTjoic3RyaW5nIixiOiJxW3F3eHJdP1xccypcXFsiLGU6IlxcXSIsYzpoLHI6NX0se2NOOiJzdHJpbmciLGI6InFbcXd4cl0/XFxzKlxceyIsZToiXFx9IixjOmgscjo1fSx7Y046InN0cmluZyIsYjoicVtxd3hyXT9cXHMqXFx8IixlOiJcXHwiLGM6aCxyOjV9LHtjTjoic3RyaW5nIixiOiJxW3F3eHJdP1xccypcXDwiLGU6IlxcPiIsYzpoLHI6NX0se2NOOiJzdHJpbmciLGI6InF3XFxzK3EiLGU6InEiLGM6aCxyOjV9LHtjTjoic3RyaW5nIixiOiInIixlOiInIixjOltobGpzLkJFXSxyOjB9LHtjTjoic3RyaW5nIixiOiciJyxlOiciJyxjOmgscjowfSx7Y046InN0cmluZyIsYjoiYCIsZToiYCIsYzpbaGxqcy5CRV19LHtjTjoic3RyaW5nIixiOiJ7XFx3K30iLHI6MH0se2NOOiJzdHJpbmciLGI6Ii0/XFx3K1xccypcXD1cXD4iLHI6MH0se2NOOiJudW1iZXIiLGI6IihcXGIwWzAtN19dKyl8KFxcYjB4WzAtOWEtZkEtRl9dKyl8KFxcYlsxLTldWzAtOV9dKihcXC5bMC05X10rKT8pfFswX11cXGIiLHI6MH0se2I6IigiK2hsanMuUlNSKyJ8XFxiKHNwbGl0fHJldHVybnxwcmludHxyZXZlcnNlfGdyZXApXFxiKVxccyoiLGs6e3NwbGl0OjEsInJldHVybiI6MSxwcmludDoxLHJldmVyc2U6MSxncmVwOjF9LHI6MCxjOltobGpzLkhDTSxlLHtjTjoicmVnZXhwIixiOiIoc3x0cnx5KS8oXFxcXC58W14vXSkqLyhcXFxcLnxbXi9dKSovW2Etel0qIixyOjEwfSx7Y046InJlZ2V4cCIsYjoiKG18cXIpPy8iLGU6Ii9bYS16XSoiLGM6W2hsanMuQkVdLHI6MH1dfSx7Y046InN1YiIsYjoiXFxic3ViXFxiIixlOiIoXFxzKlxcKC4qP1xcKSk/Wzt7XSIsazp7c3ViOjF9LHI6NX0se2NOOiJvcGVyYXRvciIsYjoiLVxcd1xcYiIscjowfSx7Y046InBvZCIsYjoiXFw9XFx3IixlOiJcXD1jdXQifV07Zi5jPWE7Zy5jWzFdLmM9YTtyZXR1cm57ZE06e2s6ZCxjOmF9fX0oKTtobGpzLkxBTkdVQUdFUy5weXRob249ZnVuY3Rpb24oKXt2YXIgYj1be2NOOiJzdHJpbmciLGI6Iih1fGIpP3I/JycnIixlOiInJyciLHI6MTB9LHtjTjoic3RyaW5nIixiOicodXxiKT9yPyIiIicsZTonIiIiJyxyOjEwfSx7Y046InN0cmluZyIsYjoiKHV8cnx1ciknIixlOiInIixjOltobGpzLkJFXSxyOjEwfSx7Y046InN0cmluZyIsYjonKHV8cnx1cikiJyxlOiciJyxjOltobGpzLkJFXSxyOjEwfSx7Y046InN0cmluZyIsYjoiKGJ8YnIpJyIsZToiJyIsYzpbaGxqcy5CRV19LHtjTjoic3RyaW5nIixiOicoYnxicikiJyxlOiciJyxjOltobGpzLkJFXX1dLmNvbmNhdChbaGxqcy5BU00saGxqcy5RU01dKTt2YXIgZD17Y046InRpdGxlIixiOmhsanMuVUlSfTt2YXIgYz17Y046InBhcmFtcyIsYjoiXFwoIixlOiJcXCkiLGM6Yi5jb25jYXQoW2hsanMuQ05NXSl9O3ZhciBhPXtiV0s6dHJ1ZSxlOiI6IixpOiJbJHtdIixjOltkLGNdLHI6MTB9O3JldHVybntkTTp7azp7a2V5d29yZDp7YW5kOjEsZWxpZjoxLGlzOjEsZ2xvYmFsOjEsYXM6MSwiaW4iOjEsImlmIjoxLGZyb206MSxyYWlzZToxLCJmb3IiOjEsZXhjZXB0OjEsImZpbmFsbHkiOjEscHJpbnQ6MSwiaW1wb3J0IjoxLHBhc3M6MSwicmV0dXJuIjoxLGV4ZWM6MSwiZWxzZSI6MSwiYnJlYWsiOjEsbm90OjEsIndpdGgiOjEsImNsYXNzIjoxLGFzc2VydDoxLHlpZWxkOjEsInRyeSI6MSwid2hpbGUiOjEsImNvbnRpbnVlIjoxLGRlbDoxLG9yOjEsZGVmOjEsbGFtYmRhOjEsbm9ubG9jYWw6MTB9LGJ1aWx0X2luOntOb25lOjEsVHJ1ZToxLEZhbHNlOjEsRWxsaXBzaXM6MSxOb3RJbXBsZW1lbnRlZDoxfX0saToiKDwvfC0+fFxcPykiLGM6Yi5jb25jYXQoW2hsanMuSENNLGhsanMuaW5oZXJpdChhLHtjTjoiZnVuY3Rpb24iLGs6e2RlZjoxfX0pLGhsanMuaW5oZXJpdChhLHtjTjoiY2xhc3MiLGs6eyJjbGFzcyI6MX19KSxobGpzLkNOTSx7Y046ImRlY29yYXRvciIsYjoiQCIsZToiJCJ9XSl9fX0oKTtobGpzLkxBTkdVQUdFUy5yPXtkTTp7YzpbaGxqcy5IQ00se2NOOiJudW1iZXIiLGI6IlxcYjBbeFhdWzAtOWEtZkEtRl0rW0xpXT9cXGIiLGU6aGxqcy5JTU1FRElBVEVfUkUscjowfSx7Y046Im51bWJlciIsYjoiXFxiXFxkKyg/OltlRV1bK1xcLV0/XFxkKik/TFxcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjB9LHtjTjoibnVtYmVyIixiOiJcXGJcXGQrXFwuKD8hXFxkKSg/OmlcXGIpPyIsZTpobGpzLklNTUVESUFURV9SRSxyOjF9LHtjTjoibnVtYmVyIixiOiJcXGJcXGQrKD86XFwuXFxkKik/KD86W2VFXVsrXFwtXT9cXGQqKT9pP1xcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjB9LHtjTjoibnVtYmVyIixiOiJcXC5cXGQrKD86W2VFXVsrXFwtXT9cXGQqKT9pP1xcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjF9LHtjTjoia2V5d29yZCIsYjoiKD86dHJ5Q2F0Y2h8bGlicmFyeXxzZXRHZW5lcmljfHNldEdyb3VwR2VuZXJpYylcXGIiLGU6aGxqcy5JTU1FRElBVEVfUkUscjoxMH0se2NOOiJrZXl3b3JkIixiOiJcXC5cXC5cXC4iLGU6aGxqcy5JTU1FRElBVEVfUkUscjoxMH0se2NOOiJrZXl3b3JkIixiOiJcXC5cXC5cXGQrKD8hW1xcdy5dKSIsZTpobGpzLklNTUVESUFURV9SRSxyOjEwfSx7Y046ImtleXdvcmQiLGI6IlxcYig/OmZ1bmN0aW9uKSIsZTpobGpzLklNTUVESUFURV9SRSxyOjJ9LHtjTjoia2V5d29yZCIsYjoiKD86aWZ8aW58YnJlYWt8bmV4dHxyZXBlYXR8ZWxzZXxmb3J8cmV0dXJufHN3aXRjaHx3aGlsZXx0cnl8c3RvcHx3YXJuaW5nfHJlcXVpcmV8YXR0YWNofGRldGFjaHxzb3VyY2V8c2V0TWV0aG9kfHNldENsYXNzKVxcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjF9LHtjTjoibGl0ZXJhbCIsYjoiKD86TkF8TkFfaW50ZWdlcl98TkFfcmVhbF98TkFfY2hhcmFjdGVyX3xOQV9jb21wbGV4XylcXGIiLGU6aGxqcy5JTU1FRElBVEVfUkUscjoxMH0se2NOOiJsaXRlcmFsIixiOiIoPzpOVUxMfFRSVUV8RkFMU0V8VHxGfEluZnxOYU4pXFxiIixlOmhsanMuSU1NRURJQVRFX1JFLHI6MX0se2NOOiJpZGVudGlmaWVyIixiOiJbYS16QS1aLl1bYS16QS1aMC05Ll9dKlxcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjB9LHtjTjoib3BlcmF0b3IiLGI6IjxcXC0oPyFcXHMqXFxkKSIsZTpobGpzLklNTUVESUFURV9SRSxyOjJ9LHtjTjoib3BlcmF0b3IiLGI6IlxcLT58PFxcLSIsZTpobGpzLklNTUVESUFURV9SRSxyOjF9LHtjTjoib3BlcmF0b3IiLGI6IiUlfH4iLGU6aGxqcy5JTU1FRElBVEVfUkV9LHtjTjoib3BlcmF0b3IiLGI6Ij49fDw9fD09fCE9fFxcfFxcfHwmJnw9fFxcK3xcXC18XFwqfC98XFxefD58PHwhfCZ8XFx8fFxcJHw6IixlOmhsanMuSU1NRURJQVRFX1JFLHI6MH0se2NOOiJvcGVyYXRvciIsYjoiJSIsZToiJSIsaToiXFxuIixyOjF9LHtjTjoiaWRlbnRpZmllciIsYjoiYCIsZToiYCIscjowfSx7Y046InN0cmluZyIsYjonIicsZTonIicsYzpbaGxqcy5CRV0scjowfSx7Y046InN0cmluZyIsYjoiJyIsZToiJyIsYzpbaGxqcy5CRV0scjowfSx7Y046InBhcmVuIixiOiJbWyh7XFxdKX1dIixlOmhsanMuSU1NRURJQVRFX1JFLHI6MH1dfX07aGxqcy5MQU5HVUFHRVMucnVieT1mdW5jdGlvbigpe3ZhciBhPSJbYS16QS1aX11bYS16QS1aMC05X10qKFxcIXxcXD8pPyI7dmFyIGo9IlthLXpBLVpfXVxcdypbIT89XT98Wy0rfl1cXEB8PDx8Pj58PX58PT09P3w8PT58Wzw+XT0/fFxcKlxcKnxbLS8rJV4mKn5gfF18XFxbXFxdPT8iO3ZhciBmPXtrZXl3b3JkOnthbmQ6MSwiZmFsc2UiOjEsdGhlbjoxLGRlZmluZWQ6MSxtb2R1bGU6MSwiaW4iOjEsInJldHVybiI6MSxyZWRvOjEsImlmIjoxLEJFR0lOOjEscmV0cnk6MSxlbmQ6MSwiZm9yIjoxLCJ0cnVlIjoxLHNlbGY6MSx3aGVuOjEsbmV4dDoxLHVudGlsOjEsImRvIjoxLGJlZ2luOjEsdW5sZXNzOjEsRU5EOjEscmVzY3VlOjEsbmlsOjEsImVsc2UiOjEsImJyZWFrIjoxLHVuZGVmOjEsbm90OjEsInN1cGVyIjoxLCJjbGFzcyI6MSwiY2FzZSI6MSxyZXF1aXJlOjEseWllbGQ6MSxhbGlhczoxLCJ3aGlsZSI6MSxlbnN1cmU6MSxlbHNpZjoxLG9yOjEsZGVmOjF9LGtleW1ldGhvZHM6e19faWRfXzoxLF9fc2VuZF9fOjEsYWJvcnQ6MSxhYnM6MSwiYWxsPyI6MSxhbGxvY2F0ZToxLGFuY2VzdG9yczoxLCJhbnk/IjoxLGFyaXR5OjEsYXNzb2M6MSxhdDoxLGF0X2V4aXQ6MSxhdXRvbG9hZDoxLCJhdXRvbG9hZD8iOjEsImJldHdlZW4/IjoxLGJpbmRpbmc6MSxiaW5tb2RlOjEsImJsb2NrX2dpdmVuPyI6MSxjYWxsOjEsY2FsbGNjOjEsY2FsbGVyOjEsY2FwaXRhbGl6ZToxLCJjYXBpdGFsaXplISI6MSxjYXNlY21wOjEsImNhdGNoIjoxLGNlaWw6MSxjZW50ZXI6MSxjaG9tcDoxLCJjaG9tcCEiOjEsY2hvcDoxLCJjaG9wISI6MSxjaHI6MSwiY2xhc3MiOjEsY2xhc3NfZXZhbDoxLCJjbGFzc192YXJpYWJsZV9kZWZpbmVkPyI6MSxjbGFzc192YXJpYWJsZXM6MSxjbGVhcjoxLGNsb25lOjEsY2xvc2U6MSxjbG9zZV9yZWFkOjEsY2xvc2Vfd3JpdGU6MSwiY2xvc2VkPyI6MSxjb2VyY2U6MSxjb2xsZWN0OjEsImNvbGxlY3QhIjoxLGNvbXBhY3Q6MSwiY29tcGFjdCEiOjEsY29uY2F0OjEsImNvbnN0X2RlZmluZWQ/IjoxLGNvbnN0X2dldDoxLGNvbnN0X21pc3Npbmc6MSxjb25zdF9zZXQ6MSxjb25zdGFudHM6MSxjb3VudDoxLGNyeXB0OjEsImRlZmF1bHQiOjEsZGVmYXVsdF9wcm9jOjEsImRlbGV0ZSI6MSwiZGVsZXRlISI6MSxkZWxldGVfYXQ6MSxkZWxldGVfaWY6MSxkZXRlY3Q6MSxkaXNwbGF5OjEsZGl2OjEsZGl2bW9kOjEsZG93bmNhc2U6MSwiZG93bmNhc2UhIjoxLGRvd250bzoxLGR1bXA6MSxkdXA6MSxlYWNoOjEsZWFjaF9ieXRlOjEsZWFjaF9pbmRleDoxLGVhY2hfa2V5OjEsZWFjaF9saW5lOjEsZWFjaF9wYWlyOjEsZWFjaF92YWx1ZToxLGVhY2hfd2l0aF9pbmRleDoxLCJlbXB0eT8iOjEsZW50cmllczoxLGVvZjoxLCJlb2Y/IjoxLCJlcWw/IjoxLCJlcXVhbD8iOjEsImV2YWwiOjEsZXhlYzoxLGV4aXQ6MSwiZXhpdCEiOjEsZXh0ZW5kOjEsZmFpbDoxLGZjbnRsOjEsZmV0Y2g6MSxmaWxlbm86MSxmaWxsOjEsZmluZDoxLGZpbmRfYWxsOjEsZmlyc3Q6MSxmbGF0dGVuOjEsImZsYXR0ZW4hIjoxLGZsb29yOjEsZmx1c2g6MSxmb3JfZmQ6MSxmb3JlYWNoOjEsZm9yazoxLGZvcm1hdDoxLGZyZWV6ZToxLCJmcm96ZW4/IjoxLGZzeW5jOjEsZ2V0YzoxLGdldHM6MSxnbG9iYWxfdmFyaWFibGVzOjEsZ3JlcDoxLGdzdWI6MSwiZ3N1YiEiOjEsImhhc19rZXk/IjoxLCJoYXNfdmFsdWU/IjoxLGhhc2g6MSxoZXg6MSxpZDoxLGluY2x1ZGU6MSwiaW5jbHVkZT8iOjEsaW5jbHVkZWRfbW9kdWxlczoxLGluZGV4OjEsaW5kZXhlczoxLGluZGljZXM6MSxpbmR1Y2VkX2Zyb206MSxpbmplY3Q6MSxpbnNlcnQ6MSxpbnNwZWN0OjEsaW5zdGFuY2VfZXZhbDoxLGluc3RhbmNlX21ldGhvZDoxLGluc3RhbmNlX21ldGhvZHM6MSwiaW5zdGFuY2Vfb2Y/IjoxLCJpbnN0YW5jZV92YXJpYWJsZV9kZWZpbmVkPyI6MSxpbnN0YW5jZV92YXJpYWJsZV9nZXQ6MSxpbnN0YW5jZV92YXJpYWJsZV9zZXQ6MSxpbnN0YW5jZV92YXJpYWJsZXM6MSwiaW50ZWdlcj8iOjEsaW50ZXJuOjEsaW52ZXJ0OjEsaW9jdGw6MSwiaXNfYT8iOjEsaXNhdHR5OjEsIml0ZXJhdG9yPyI6MSxqb2luOjEsImtleT8iOjEsa2V5czoxLCJraW5kX29mPyI6MSxsYW1iZGE6MSxsYXN0OjEsbGVuZ3RoOjEsbGluZW5vOjEsbGp1c3Q6MSxsb2FkOjEsbG9jYWxfdmFyaWFibGVzOjEsbG9vcDoxLGxzdHJpcDoxLCJsc3RyaXAhIjoxLG1hcDoxLCJtYXAhIjoxLG1hdGNoOjEsbWF4OjEsIm1lbWJlcj8iOjEsbWVyZ2U6MSwibWVyZ2UhIjoxLG1ldGhvZDoxLCJtZXRob2RfZGVmaW5lZD8iOjEsbWV0aG9kX21pc3Npbmc6MSxtZXRob2RzOjEsbWluOjEsbW9kdWxlX2V2YWw6MSxtb2R1bG86MSxuYW1lOjEsbmVzdGluZzoxLCJuZXciOjEsbmV4dDoxLCJuZXh0ISI6MSwibmlsPyI6MSxuaXRlbXM6MSwibm9uemVybz8iOjEsb2JqZWN0X2lkOjEsb2N0OjEsb3BlbjoxLHBhY2s6MSxwYXJ0aXRpb246MSxwaWQ6MSxwaXBlOjEscG9wOjEscG9wZW46MSxwb3M6MSxwcmVjOjEscHJlY19mOjEscHJlY19pOjEscHJpbnQ6MSxwcmludGY6MSxwcml2YXRlX2NsYXNzX21ldGhvZDoxLHByaXZhdGVfaW5zdGFuY2VfbWV0aG9kczoxLCJwcml2YXRlX21ldGhvZF9kZWZpbmVkPyI6MSxwcml2YXRlX21ldGhvZHM6MSxwcm9jOjEscHJvdGVjdGVkX2luc3RhbmNlX21ldGhvZHM6MSwicHJvdGVjdGVkX21ldGhvZF9kZWZpbmVkPyI6MSxwcm90ZWN0ZWRfbWV0aG9kczoxLHB1YmxpY19jbGFzc19tZXRob2Q6MSxwdWJsaWNfaW5zdGFuY2VfbWV0aG9kczoxLCJwdWJsaWNfbWV0aG9kX2RlZmluZWQ/IjoxLHB1YmxpY19tZXRob2RzOjEscHVzaDoxLHB1dGM6MSxwdXRzOjEscXVvOjEscmFpc2U6MSxyYW5kOjEscmFzc29jOjEscmVhZDoxLHJlYWRfbm9uYmxvY2s6MSxyZWFkY2hhcjoxLHJlYWRsaW5lOjEscmVhZGxpbmVzOjEscmVhZHBhcnRpYWw6MSxyZWhhc2g6MSxyZWplY3Q6MSwicmVqZWN0ISI6MSxyZW1haW5kZXI6MSxyZW9wZW46MSxyZXBsYWNlOjEscmVxdWlyZToxLCJyZXNwb25kX3RvPyI6MSxyZXZlcnNlOjEsInJldmVyc2UhIjoxLHJldmVyc2VfZWFjaDoxLHJld2luZDoxLHJpbmRleDoxLHJqdXN0OjEscm91bmQ6MSxyc3RyaXA6MSwicnN0cmlwISI6MSxzY2FuOjEsc2VlazoxLHNlbGVjdDoxLHNlbmQ6MSxzZXRfdHJhY2VfZnVuYzoxLHNoaWZ0OjEsc2luZ2xldG9uX21ldGhvZF9hZGRlZDoxLHNpbmdsZXRvbl9tZXRob2RzOjEsc2l6ZToxLHNsZWVwOjEsc2xpY2U6MSwic2xpY2UhIjoxLHNvcnQ6MSwic29ydCEiOjEsc29ydF9ieToxLHNwbGl0OjEsc3ByaW50ZjoxLHNxdWVlemU6MSwic3F1ZWV6ZSEiOjEsc3JhbmQ6MSxzdGF0OjEsc3RlcDoxLHN0b3JlOjEsc3RyaXA6MSwic3RyaXAhIjoxLHN1YjoxLCJzdWIhIjoxLHN1Y2M6MSwic3VjYyEiOjEsc3VtOjEsc3VwZXJjbGFzczoxLHN3YXBjYXNlOjEsInN3YXBjYXNlISI6MSxzeW5jOjEsc3lzY2FsbDoxLHN5c29wZW46MSxzeXNyZWFkOjEsc3lzc2VlazoxLHN5c3RlbToxLHN5c3dyaXRlOjEsdGFpbnQ6MSwidGFpbnRlZD8iOjEsdGVsbDoxLHRlc3Q6MSwidGhyb3ciOjEsdGltZXM6MSx0b19hOjEsdG9fYXJ5OjEsdG9fZjoxLHRvX2hhc2g6MSx0b19pOjEsdG9faW50OjEsdG9faW86MSx0b19wcm9jOjEsdG9fczoxLHRvX3N0cjoxLHRvX3N5bToxLHRyOjEsInRyISI6MSx0cl9zOjEsInRyX3MhIjoxLHRyYWNlX3ZhcjoxLHRyYW5zcG9zZToxLHRyYXA6MSx0cnVuY2F0ZToxLCJ0dHk/IjoxLHR5cGU6MSx1bmdldGM6MSx1bmlxOjEsInVuaXEhIjoxLHVucGFjazoxLHVuc2hpZnQ6MSx1bnRhaW50OjEsdW50cmFjZV92YXI6MSx1cGNhc2U6MSwidXBjYXNlISI6MSx1cGRhdGU6MSx1cHRvOjEsInZhbHVlPyI6MSx2YWx1ZXM6MSx2YWx1ZXNfYXQ6MSx3YXJuOjEsd3JpdGU6MSx3cml0ZV9ub25ibG9jazoxLCJ6ZXJvPyI6MSx6aXA6MX19O3ZhciBjPXtjTjoieWFyZG9jdGFnIixiOiJAW0EtWmEtel0rIn07dmFyIGs9W3tjTjoiY29tbWVudCIsYjoiIyIsZToiJCIsYzpbY119LHtjTjoiY29tbWVudCIsYjoiXlxcPWJlZ2luIixlOiJeXFw9ZW5kIixjOltjXSxyOjEwfSx7Y046ImNvbW1lbnQiLGI6Il5fX0VORF9fIixlOiJcXG4kIn1dO3ZhciBkPXtjTjoic3Vic3QiLGI6IiNcXHsiLGU6In0iLGw6YSxrOmZ9O3ZhciBpPVtobGpzLkJFLGRdO3ZhciBiPVt7Y046InN0cmluZyIsYjoiJyIsZToiJyIsYzppLHI6MH0se2NOOiJzdHJpbmciLGI6JyInLGU6JyInLGM6aSxyOjB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT9cXCgiLGU6IlxcKSIsYzppLHI6MTB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT9cXFsiLGU6IlxcXSIsYzppLHI6MTB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT97IixlOiJ9IixjOmkscjoxMH0se2NOOiJzdHJpbmciLGI6IiVbcXddPzwiLGU6Ij4iLGM6aSxyOjEwfSx7Y046InN0cmluZyIsYjoiJVtxd10/LyIsZToiLyIsYzppLHI6MTB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT8lIixlOiIlIixjOmkscjoxMH0se2NOOiJzdHJpbmciLGI6IiVbcXddPy0iLGU6Ii0iLGM6aSxyOjEwfSx7Y046InN0cmluZyIsYjoiJVtxd10/XFx8IixlOiJcXHwiLGM6aSxyOjEwfV07dmFyIGg9e2NOOiJmdW5jdGlvbiIsYjoiXFxiZGVmXFxzKyIsZToiIHwkfDsiLGw6YSxrOmYsYzpbe2NOOiJ0aXRsZSIsYjpqLGw6YSxrOmZ9LHtjTjoicGFyYW1zIixiOiJcXCgiLGU6IlxcKSIsbDphLGs6Zn1dLmNvbmNhdChrKX07dmFyIGc9e2NOOiJpZGVudGlmaWVyIixiOmEsbDphLGs6ZixyOjB9O3ZhciBlPWsuY29uY2F0KGIuY29uY2F0KFt7Y046ImNsYXNzIixiOiJcXGIoY2xhc3N8bW9kdWxlKVxcYiIsZToiJHw7IixrOnsiY2xhc3MiOjEsbW9kdWxlOjF9LGM6W3tjTjoidGl0bGUiLGI6IltBLVphLXpfXVxcdyooOjpcXHcrKSooXFw/fFxcISk/IixyOjB9LHtjTjoiaW5oZXJpdGFuY2UiLGI6IjxcXHMqIixjOlt7Y046InBhcmVudCIsYjoiKCIraGxqcy5JUisiOjopPyIraGxqcy5JUn1dfV0uY29uY2F0KGspfSxoLHtjTjoiY29uc3RhbnQiLGI6Iig6Oik/KFtBLVpdXFx3Kig6Oik/KSsiLHI6MH0se2NOOiJzeW1ib2wiLGI6IjoiLGM6Yi5jb25jYXQoW2ddKSxyOjB9LHtjTjoibnVtYmVyIixiOiIoXFxiMFswLTdfXSspfChcXGIweFswLTlhLWZBLUZfXSspfChcXGJbMS05XVswLTlfXSooXFwuWzAtOV9dKyk/KXxbMF9dXFxiIixyOjB9LHtjTjoibnVtYmVyIixiOiJcXD9cXHcifSx7Y046InZhcmlhYmxlIixiOiIoXFwkXFxXKXwoKFxcJHxcXEBcXEA/KShcXHcrKSkifSxnLHtiOiIoIitobGpzLlJTUisiKVxccyoiLGM6ay5jb25jYXQoW3tjTjoicmVnZXhwIixiOiIvIixlOiIvW2Etel0qIixpOiJcXG4iLGM6W2hsanMuQkVdfV0pLHI6MH1dKSk7ZC5jPWU7aC5jWzFdLmM9ZTtyZXR1cm57ZE06e2w6YSxrOmYsYzplfX19KCk7aGxqcy5MQU5HVUFHRVMuc2NhbGE9ZnVuY3Rpb24oKXt2YXIgYj17Y046ImFubm90YXRpb24iLGI6IkBbQS1aYS16XSsifTt2YXIgYT17Y046InN0cmluZyIsYjondT9yPyIiIicsZTonIiIiJyxyOjEwfTtyZXR1cm57ZE06e2s6e3R5cGU6MSx5aWVsZDoxLGxhenk6MSxvdmVycmlkZToxLGRlZjoxLCJ3aXRoIjoxLHZhbDoxLCJ2YXIiOjEsImZhbHNlIjoxLCJ0cnVlIjoxLHNlYWxlZDoxLCJhYnN0cmFjdCI6MSwicHJpdmF0ZSI6MSx0cmFpdDoxLG9iamVjdDoxLCJudWxsIjoxLCJpZiI6MSwiZm9yIjoxLCJ3aGlsZSI6MSwidGhyb3ciOjEsImZpbmFsbHkiOjEsInByb3RlY3RlZCI6MSwiZXh0ZW5kcyI6MSwiaW1wb3J0IjoxLCJmaW5hbCI6MSwicmV0dXJuIjoxLCJlbHNlIjoxLCJicmVhayI6MSwibmV3IjoxLCJjYXRjaCI6MSwic3VwZXIiOjEsImNsYXNzIjoxLCJjYXNlIjoxLCJwYWNrYWdlIjoxLCJkZWZhdWx0IjoxLCJ0cnkiOjEsInRoaXMiOjEsbWF0Y2g6MSwiY29udGludWUiOjEsInRocm93cyI6MX0sYzpbe2NOOiJqYXZhZG9jIixiOiIvXFwqXFwqIixlOiJcXCovIixjOlt7Y046ImphdmFkb2N0YWciLGI6IkBbQS1aYS16XSsifV0scjoxMH0saGxqcy5DTENNLGhsanMuQ0JMQ0xNLGhsanMuQVNNLGhsanMuUVNNLGEse2NOOiJjbGFzcyIsYjoiKChjYXNlICk/Y2xhc3MgfG9iamVjdCB8dHJhaXQgKSIsZToiKHt8JCkiLGk6IjoiLGs6eyJjYXNlIjoxLCJjbGFzcyI6MSx0cmFpdDoxLG9iamVjdDoxfSxjOlt7YldLOnRydWUsazp7ImV4dGVuZHMiOjEsIndpdGgiOjF9LHI6MTB9LHtjTjoidGl0bGUiLGI6aGxqcy5VSVJ9LHtjTjoicGFyYW1zIixiOiJcXCgiLGU6IlxcKSIsYzpbaGxqcy5BU00saGxqcy5RU00sYSxiXX1dfSxobGpzLkNOTSxiXX19fSgpO2hsanMuTEFOR1VBR0VTLnNxbD17Y0k6dHJ1ZSxkTTp7aToiW15cXHNdIixjOlt7Y046Im9wZXJhdG9yIixiOiIoYmVnaW58c3RhcnR8Y29tbWl0fHJvbGxiYWNrfHNhdmVwb2ludHxsb2NrfGFsdGVyfGNyZWF0ZXxkcm9wfHJlbmFtZXxjYWxsfGRlbGV0ZXxkb3xoYW5kbGVyfGluc2VydHxsb2FkfHJlcGxhY2V8c2VsZWN0fHRydW5jYXRlfHVwZGF0ZXxzZXR8c2hvd3xwcmFnbWF8Z3JhbnQpXFxiIixlOiI7fCIraGxqcy5FUixrOntrZXl3b3JkOnthbGw6MSxwYXJ0aWFsOjEsZ2xvYmFsOjEsbW9udGg6MSxjdXJyZW50X3RpbWVzdGFtcDoxLHVzaW5nOjEsZ286MSxyZXZva2U6MSxzbWFsbGludDoxLGluZGljYXRvcjoxLCJlbmQtZXhlYyI6MSxkaXNjb25uZWN0OjEsem9uZToxLCJ3aXRoIjoxLGNoYXJhY3RlcjoxLGFzc2VydGlvbjoxLHRvOjEsYWRkOjEsY3VycmVudF91c2VyOjEsdXNhZ2U6MSxpbnB1dDoxLGxvY2FsOjEsYWx0ZXI6MSxtYXRjaDoxLGNvbGxhdGU6MSxyZWFsOjEsdGhlbjoxLHJvbGxiYWNrOjEsZ2V0OjEscmVhZDoxLHRpbWVzdGFtcDoxLHNlc3Npb25fdXNlcjoxLG5vdDoxLGludGVnZXI6MSxiaXQ6MSx1bmlxdWU6MSxkYXk6MSxtaW51dGU6MSxkZXNjOjEsaW5zZXJ0OjEsZXhlY3V0ZToxLGxpa2U6MSxpbGlrZToyLGxldmVsOjEsZGVjaW1hbDoxLGRyb3A6MSwiY29udGludWUiOjEsaXNvbGF0aW9uOjEsZm91bmQ6MSx3aGVyZToxLGNvbnN0cmFpbnRzOjEsZG9tYWluOjEscmlnaHQ6MSxuYXRpb25hbDoxLHNvbWU6MSxtb2R1bGU6MSx0cmFuc2FjdGlvbjoxLHJlbGF0aXZlOjEsc2Vjb25kOjEsY29ubmVjdDoxLGVzY2FwZToxLGNsb3NlOjEsc3lzdGVtX3VzZXI6MSwiZm9yIjoxLGRlZmVycmVkOjEsc2VjdGlvbjoxLGNhc3Q6MSxjdXJyZW50OjEsc3Fsc3RhdGU6MSxhbGxvY2F0ZToxLGludGVyc2VjdDoxLGRlYWxsb2NhdGU6MSxudW1lcmljOjEsInB1YmxpYyI6MSxwcmVzZXJ2ZToxLGZ1bGw6MSwiZ290byI6MSxpbml0aWFsbHk6MSxhc2M6MSxubzoxLGtleToxLG91dHB1dDoxLGNvbGxhdGlvbjoxLGdyb3VwOjEsYnk6MSx1bmlvbjoxLHNlc3Npb246MSxib3RoOjEsbGFzdDoxLGxhbmd1YWdlOjEsY29uc3RyYWludDoxLGNvbHVtbjoxLG9mOjEsc3BhY2U6MSxmb3JlaWduOjEsZGVmZXJyYWJsZToxLHByaW9yOjEsY29ubmVjdGlvbjoxLHVua25vd246MSxhY3Rpb246MSxjb21taXQ6MSx2aWV3OjEsb3I6MSxmaXJzdDoxLGludG86MSwiZmxvYXQiOjEseWVhcjoxLHByaW1hcnk6MSxjYXNjYWRlZDoxLGV4Y2VwdDoxLHJlc3RyaWN0OjEsc2V0OjEscmVmZXJlbmNlczoxLG5hbWVzOjEsdGFibGU6MSxvdXRlcjoxLG9wZW46MSxzZWxlY3Q6MSxzaXplOjEsYXJlOjEscm93czoxLGZyb206MSxwcmVwYXJlOjEsZGlzdGluY3Q6MSxsZWFkaW5nOjEsY3JlYXRlOjEsb25seToxLG5leHQ6MSxpbm5lcjoxLGF1dGhvcml6YXRpb246MSxzY2hlbWE6MSxjb3JyZXNwb25kaW5nOjEsb3B0aW9uOjEsZGVjbGFyZToxLHByZWNpc2lvbjoxLGltbWVkaWF0ZToxLCJlbHNlIjoxLHRpbWV6b25lX21pbnV0ZToxLGV4dGVybmFsOjEsdmFyeWluZzoxLHRyYW5zbGF0aW9uOjEsInRydWUiOjEsImNhc2UiOjEsZXhjZXB0aW9uOjEsam9pbjoxLGhvdXI6MSwiZGVmYXVsdCI6MSwiZG91YmxlIjoxLHNjcm9sbDoxLHZhbHVlOjEsY3Vyc29yOjEsZGVzY3JpcHRvcjoxLHZhbHVlczoxLGRlYzoxLGZldGNoOjEscHJvY2VkdXJlOjEsImRlbGV0ZSI6MSxhbmQ6MSwiZmFsc2UiOjEsImludCI6MSxpczoxLGRlc2NyaWJlOjEsImNoYXIiOjEsYXM6MSxhdDoxLCJpbiI6MSx2YXJjaGFyOjEsIm51bGwiOjEsdHJhaWxpbmc6MSxhbnk6MSxhYnNvbHV0ZToxLGN1cnJlbnRfdGltZToxLGVuZDoxLGdyYW50OjEscHJpdmlsZWdlczoxLHdoZW46MSxjcm9zczoxLGNoZWNrOjEsd3JpdGU6MSxjdXJyZW50X2RhdGU6MSxwYWQ6MSxiZWdpbjoxLHRlbXBvcmFyeToxLGV4ZWM6MSx0aW1lOjEsdXBkYXRlOjEsY2F0YWxvZzoxLHVzZXI6MSxzcWw6MSxkYXRlOjEsb246MSxpZGVudGl0eToxLHRpbWV6b25lX2hvdXI6MSxuYXR1cmFsOjEsd2hlbmV2ZXI6MSxpbnRlcnZhbDoxLHdvcms6MSxvcmRlcjoxLGNhc2NhZGU6MSxkaWFnbm9zdGljczoxLG5jaGFyOjEsaGF2aW5nOjEsbGVmdDoxLGNhbGw6MSwiZG8iOjEsaGFuZGxlcjoxLGxvYWQ6MSxyZXBsYWNlOjEsdHJ1bmNhdGU6MSxzdGFydDoxLGxvY2s6MSxzaG93OjEscHJhZ21hOjF9LGFnZ3JlZ2F0ZTp7Y291bnQ6MSxzdW06MSxtaW46MSxtYXg6MSxhdmc6MX19LGM6W3tjTjoic3RyaW5nIixiOiInIixlOiInIixjOltobGpzLkJFLHtiOiInJyJ9XSxyOjB9LHtjTjoic3RyaW5nIixiOiciJyxlOiciJyxjOltobGpzLkJFLHtiOiciIid9XSxyOjB9LHtjTjoic3RyaW5nIixiOiJgIixlOiJgIixjOltobGpzLkJFXX0saGxqcy5DTk1dfSxobGpzLkNCTENMTSx7Y046ImNvbW1lbnQiLGI6Ii0tIixlOiIkIn1dfX07aGxqcy5MQU5HVUFHRVMuc3Rhbj17ZE06e2M6W2hsanMuSENNLGhsanMuQ0xDTSxobGpzLlFTTSxobGpzLkNOTSx7Y046Im9wZXJhdG9yIixiOiIoPzo8LXx+fFxcfFxcfHwmJnw9PXwhPXw8PT98Pj0/fFxcK3wtfFxcLj8vfFxcXFx8XFxefFxcXnwhfCd8JXw6fCx8O3w9KVxcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjEwfSx7Y046InBhcmVuIixiOiJbWyh7XFxdKX1dIixlOmhsanMuSU1NRURJQVRFX1JFLHI6MH0se2NOOiJmdW5jdGlvbiIsYjoiKD86UGhpfFBoaV9hcHByb3h8YWJzfGFjb3N8YWNvc2h8YXBwZW5kX2NvbHxhcHBlbmRfcm93fGFzaW58YXNpbmh8YXRhbnxhdGFuMnxhdGFuaHxiZXJub3VsbGlfY2NkZl9sb2d8YmVybm91bGxpX2NkZnxiZXJub3VsbGlfY2RmX2xvZ3xiZXJub3VsbGlfbG9nfGJlcm5vdWxsaV9sb2dpdF9sb2d8YmVybm91bGxpX3JuZ3xiZXNzZWxfZmlyc3Rfa2luZHxiZXNzZWxfc2Vjb25kX2tpbmR8YmV0YV9iaW5vbWlhbF9jY2RmX2xvZ3xiZXRhX2Jpbm9taWFsX2NkZnxiZXRhX2Jpbm9taWFsX2NkZl9sb2d8YmV0YV9iaW5vbWlhbF9sb2d8YmV0YV9iaW5vbWlhbF9ybmd8YmV0YV9jY2RmX2xvZ3xiZXRhX2NkZnxiZXRhX2NkZl9sb2d8YmV0YV9sb2d8YmV0YV9ybmd8YmluYXJ5X2xvZ19sb3NzfGJpbm9taWFsX2NjZGZfbG9nfGJpbm9taWFsX2NkZnxiaW5vbWlhbF9jZGZfbG9nfGJpbm9taWFsX2NvZWZmaWNpZW50X2xvZ3xiaW5vbWlhbF9sb2d8Ymlub21pYWxfbG9naXRfbG9nfGJpbm9taWFsX3JuZ3xibG9ja3xjYXRlZ29yaWNhbF9sb2d8Y2F0ZWdvcmljYWxfbG9naXRfbG9nfGNhdGVnb3JpY2FsX3JuZ3xjYXVjaHlfY2NkZl9sb2d8Y2F1Y2h5X2NkZnxjYXVjaHlfY2RmX2xvZ3xjYXVjaHlfbG9nfGNhdWNoeV9ybmd8Y2JydHxjZWlsfGNoaV9zcXVhcmVfY2NkZl9sb2d8Y2hpX3NxdWFyZV9jZGZ8Y2hpX3NxdWFyZV9jZGZfbG9nfGNoaV9zcXVhcmVfbG9nfGNoaV9zcXVhcmVfcm5nfGNob2xlc2t5X2RlY29tcG9zZXxjb2x8Y29sc3xjb2x1bW5zX2RvdF9wcm9kdWN0fGNvbHVtbnNfZG90X3NlbGZ8Y29zfGNvc2h8Y3Jvc3Nwcm9kfGNzcl9leHRyYWN0X3V8Y3NyX2V4dHJhY3Rfdnxjc3JfZXh0cmFjdF93fGNzcl9tYXRyaXhfdGltZXNfdmVjdG9yfGNzcl90b19kZW5zZV9tYXRyaXh8Y3VtdWxhdGl2ZV9zdW18ZGV0ZXJtaW5hbnR8ZGlhZ19tYXRyaXh8ZGlhZ19wb3N0X211bHRpcGx5fGRpYWdfcHJlX211bHRpcGx5fGRpYWdvbmFsfGRpZ2FtbWF8ZGltc3xkaXJpY2hsZXRfbG9nfGRpcmljaGxldF9ybmd8ZGlzdGFuY2V8ZG90X3Byb2R1Y3R8ZG90X3NlbGZ8ZG91YmxlX2V4cG9uZW50aWFsX2NjZGZfbG9nfGRvdWJsZV9leHBvbmVudGlhbF9jZGZ8ZG91YmxlX2V4cG9uZW50aWFsX2NkZl9sb2d8ZG91YmxlX2V4cG9uZW50aWFsX2xvZ3xkb3VibGVfZXhwb25lbnRpYWxfcm5nfGV8ZWlnZW52YWx1ZXNfc3ltfGVpZ2VudmVjdG9yc19zeW18ZXJmfGVyZmN8ZXhwfGV4cDJ8ZXhwX21vZF9ub3JtYWxfY2NkZl9sb2d8ZXhwX21vZF9ub3JtYWxfY2RmfGV4cF9tb2Rfbm9ybWFsX2NkZl9sb2d8ZXhwX21vZF9ub3JtYWxfbG9nfGV4cF9tb2Rfbm9ybWFsX3JuZ3xleHBtMXxleHBvbmVudGlhbF9jY2RmX2xvZ3xleHBvbmVudGlhbF9jZGZ8ZXhwb25lbnRpYWxfY2RmX2xvZ3xleHBvbmVudGlhbF9sb2d8ZXhwb25lbnRpYWxfcm5nfGZhYnN8ZmFsbGluZ19mYWN0b3JpYWx8ZmRpbXxmbG9vcnxmbWF8Zm1heHxmbWlufGZtb2R8ZnJlY2hldF9jY2RmX2xvZ3xmcmVjaGV0X2NkZnxmcmVjaGV0X2NkZl9sb2d8ZnJlY2hldF9sb2d8ZnJlY2hldF9ybmd8Z2FtbWFfY2NkZl9sb2d8Z2FtbWFfY2RmfGdhbW1hX2NkZl9sb2d8Z2FtbWFfbG9nfGdhbW1hX3B8Z2FtbWFfcXxnYW1tYV9ybmd8Z2F1c3NpYW5fZGxtX29ic19sb2d8Z2V0X2xwfGd1bWJlbF9jY2RmX2xvZ3xndW1iZWxfY2RmfGd1bWJlbF9jZGZfbG9nfGd1bWJlbF9sb2d8Z3VtYmVsX3JuZ3xoZWFkfGh5cGVyZ2VvbWV0cmljX2xvZ3xoeXBlcmdlb21ldHJpY19ybmd8aHlwb3R8aWZfZWxzZXxpbnRfc3RlcHxpbnZ8aW52X2NoaV9zcXVhcmVfY2NkZl9sb2d8aW52X2NoaV9zcXVhcmVfY2RmfGludl9jaGlfc3F1YXJlX2NkZl9sb2d8aW52X2NoaV9zcXVhcmVfbG9nfGludl9jaGlfc3F1YXJlX3JuZ3xpbnZfY2xvZ2xvZ3xpbnZfZ2FtbWFfY2NkZl9sb2d8aW52X2dhbW1hX2NkZnxpbnZfZ2FtbWFfY2RmX2xvZ3xpbnZfZ2FtbWFfbG9nfGludl9nYW1tYV9ybmd8aW52X2xvZ2l0fGludl9waGl8aW52X3NxcnR8aW52X3NxdWFyZXxpbnZfd2lzaGFydF9sb2d8aW52X3dpc2hhcnRfcm5nfGludmVyc2V8aW52ZXJzZV9zcGR8aXNfaW5mfGlzX25hbnxsYmV0YXxsZ2FtbWF8bGtqX2NvcnJfY2hvbGVza3lfbG9nfGxral9jb3JyX2Nob2xlc2t5X3JuZ3xsa2pfY29ycl9sb2d8bGtqX2NvcnJfcm5nfGxtZ2FtbWF8bG9nfGxvZzEwfGxvZzFtfGxvZzFtX2V4cHxsb2cxbV9pbnZfbG9naXR8bG9nMXB8bG9nMXBfZXhwfGxvZzJ8bG9nX2RldGVybWluYW50fGxvZ19kaWZmX2V4cHxsb2dfZmFsbGluZ19mYWN0b3JpYWx8bG9nX2ludl9sb2dpdHxsb2dfbWl4fGxvZ19yaXNpbmdfZmFjdG9yaWFsfGxvZ19zb2Z0bWF4fGxvZ19zdW1fZXhwfGxvZ2lzdGljX2NjZGZfbG9nfGxvZ2lzdGljX2NkZnxsb2dpc3RpY19jZGZfbG9nfGxvZ2lzdGljX2xvZ3xsb2dpc3RpY19ybmd8bG9naXR8bG9nbm9ybWFsX2NjZGZfbG9nfGxvZ25vcm1hbF9jZGZ8bG9nbm9ybWFsX2NkZl9sb2d8bG9nbm9ybWFsX2xvZ3xsb2dub3JtYWxfcm5nfG1hY2hpbmVfcHJlY2lzaW9ufG1heHxtZGl2aWRlX2xlZnRfdHJpX2xvd3xtZGl2aWRlX3JpZ2h0X3RyaV9sb3d8bWVhbnxtaW58bW9kaWZpZWRfYmVzc2VsX2ZpcnN0X2tpbmR8bW9kaWZpZWRfYmVzc2VsX3NlY29uZF9raW5kfG11bHRpX2dwX2Nob2xlc2t5X2xvZ3xtdWx0aV9ncF9sb2d8bXVsdGlfbm9ybWFsX2Nob2xlc2t5X2xvZ3xtdWx0aV9ub3JtYWxfY2hvbGVza3lfcm5nfG11bHRpX25vcm1hbF9sb2d8bXVsdGlfbm9ybWFsX3ByZWNfbG9nfG11bHRpX25vcm1hbF9ybmd8bXVsdGlfc3R1ZGVudF90X2xvZ3xtdWx0aV9zdHVkZW50X3Rfcm5nfG11bHRpbm9taWFsX2xvZ3xtdWx0aW5vbWlhbF9ybmd8bXVsdGlwbHlfbG9nfG11bHRpcGx5X2xvd2VyX3RyaV9zZWxmX3RyYW5zcG9zZXxuZWdfYmlub21pYWxfMl9jY2RmX2xvZ3xuZWdfYmlub21pYWxfMl9jZGZ8bmVnX2Jpbm9taWFsXzJfY2RmX2xvZ3xuZWdfYmlub21pYWxfMl9sb2d8bmVnX2Jpbm9taWFsXzJfbG9nX2xvZ3xuZWdfYmlub21pYWxfMl9sb2dfcm5nfG5lZ19iaW5vbWlhbF8yX3JuZ3xuZWdfYmlub21pYWxfY2NkZl9sb2d8bmVnX2Jpbm9taWFsX2NkZnxuZWdfYmlub21pYWxfY2RmX2xvZ3xuZWdfYmlub21pYWxfbG9nfG5lZ19iaW5vbWlhbF9ybmd8bmVnYXRpdmVfaW5maW5pdHl8bm9ybWFsX2NjZGZfbG9nfG5vcm1hbF9jZGZ8bm9ybWFsX2NkZl9sb2d8bm9ybWFsX2xvZ3xub3JtYWxfcm5nfG5vdF9hX251bWJlcnxudW1fZWxlbWVudHN8b3JkZXJlZF9sb2dpc3RpY19sb2d8b3JkZXJlZF9sb2dpc3RpY19ybmd8b3dlbnNfdHxwYXJldG9fY2NkZl9sb2d8cGFyZXRvX2NkZnxwYXJldG9fY2RmX2xvZ3xwYXJldG9fbG9nfHBhcmV0b19ybmd8cGFyZXRvX3R5cGVfMl9jY2RmX2xvZ3xwYXJldG9fdHlwZV8yX2NkZnxwYXJldG9fdHlwZV8yX2NkZl9sb2d8cGFyZXRvX3R5cGVfMl9sb2d8cGFyZXRvX3R5cGVfMl9ybmd8cGl8cG9pc3Nvbl9jY2RmX2xvZ3xwb2lzc29uX2NkZnxwb2lzc29uX2NkZl9sb2d8cG9pc3Nvbl9sb2d8cG9pc3Nvbl9sb2dfbG9nfHBvaXNzb25fbG9nX3JuZ3xwb2lzc29uX3JuZ3xwb3NpdGl2ZV9pbmZpbml0eXxwb3d8cHJvZHxxcl9RfHFyX1J8cXVhZF9mb3JtfHF1YWRfZm9ybV9kaWFnfHF1YWRfZm9ybV9zeW18cmFua3xyYXlsZWlnaF9jY2RmX2xvZ3xyYXlsZWlnaF9jZGZ8cmF5bGVpZ2hfY2RmX2xvZ3xyYXlsZWlnaF9sb2d8cmF5bGVpZ2hfcm5nfHJlcF9hcnJheXxyZXBfbWF0cml4fHJlcF9yb3dfdmVjdG9yfHJlcF92ZWN0b3J8cmlzaW5nX2ZhY3RvcmlhbHxyb3VuZHxyb3d8cm93c3xyb3dzX2RvdF9wcm9kdWN0fHJvd3NfZG90X3NlbGZ8c2NhbGVkX2ludl9jaGlfc3F1YXJlX2NjZGZfbG9nfHNjYWxlZF9pbnZfY2hpX3NxdWFyZV9jZGZ8c2NhbGVkX2ludl9jaGlfc3F1YXJlX2NkZl9sb2d8c2NhbGVkX2ludl9jaGlfc3F1YXJlX2xvZ3xzY2FsZWRfaW52X2NoaV9zcXVhcmVfcm5nfHNkfHNlZ21lbnR8c2lufHNpbmd1bGFyX3ZhbHVlc3xzaW5ofHNpemV8c2tld19ub3JtYWxfY2NkZl9sb2d8c2tld19ub3JtYWxfY2RmfHNrZXdfbm9ybWFsX2NkZl9sb2d8c2tld19ub3JtYWxfbG9nfHNrZXdfbm9ybWFsX3JuZ3xzb2Z0bWF4fHNvcnRfYXNjfHNvcnRfZGVzY3xzb3J0X2luZGljZXNfYXNjfHNvcnRfaW5kaWNlc19kZXNjfHNxcnR8c3FydDJ8c3F1YXJlfHNxdWFyZWRfZGlzdGFuY2V8c3RlcHxzdHVkZW50X3RfY2NkZl9sb2d8c3R1ZGVudF90X2NkZnxzdHVkZW50X3RfY2RmX2xvZ3xzdHVkZW50X3RfbG9nfHN0dWRlbnRfdF9ybmd8c3ViX2NvbHxzdWJfcm93fHN1bXx0YWlsfHRhbnx0YW5ofHRjcm9zc3Byb2R8dGdhbW1hfHRvX2FycmF5XzFkfHRvX2FycmF5XzJkfHRvX21hdHJpeHx0b19yb3dfdmVjdG9yfHRvX3ZlY3Rvcnx0cmFjZXx0cmFjZV9nZW5fcXVhZF9mb3JtfHRyYWNlX3F1YWRfZm9ybXx0cmlnYW1tYXx0cnVuY3x1bmlmb3JtX2NjZGZfbG9nfHVuaWZvcm1fY2RmfHVuaWZvcm1fY2RmX2xvZ3x1bmlmb3JtX2xvZ3x1bmlmb3JtX3JuZ3x2YXJpYW5jZXx2b25fbWlzZXNfbG9nfHZvbl9taXNlc19ybmd8d2VpYnVsbF9jY2RmX2xvZ3x3ZWlidWxsX2NkZnx3ZWlidWxsX2NkZl9sb2d8d2VpYnVsbF9sb2d8d2VpYnVsbF9ybmd8d2llbmVyX2xvZ3x3aXNoYXJ0X2xvZ3x3aXNoYXJ0X3JuZylcXGIiLGU6aGxqcy5JTU1FRElBVEVfUkUscjoxMH0se2NOOiJmdW5jdGlvbiIsYjoiKD86YmVybm91bGxpfGJlcm5vdWxsaV9sb2dpdHxiZXRhfGJldGFfYmlub21pYWx8Ymlub21pYWx8Ymlub21pYWxfbG9naXR8Y2F0ZWdvcmljYWx8Y2F0ZWdvcmljYWxfbG9naXR8Y2F1Y2h5fGNoaV9zcXVhcmV8ZGlyaWNobGV0fGRvdWJsZV9leHBvbmVudGlhbHxleHBfbW9kX25vcm1hbHxleHBvbmVudGlhbHxmcmVjaGV0fGdhbW1hfGdhdXNzaWFuX2RsbV9vYnN8Z3VtYmVsfGh5cGVyZ2VvbWV0cmljfGludl9jaGlfc3F1YXJlfGludl9nYW1tYXxpbnZfd2lzaGFydHxsa2pfY29ycnxsa2pfY29ycl9jaG9sZXNreXxsb2dpc3RpY3xsb2dub3JtYWx8bXVsdGlfZ3B8bXVsdGlfZ3BfY2hvbGVza3l8bXVsdGlfbm9ybWFsfG11bHRpX25vcm1hbF9jaG9sZXNreXxtdWx0aV9ub3JtYWxfcHJlY3xtdWx0aV9zdHVkZW50X3R8bXVsdGlub21pYWx8bmVnX2Jpbm9taWFsfG5lZ19iaW5vbWlhbF8yfG5lZ19iaW5vbWlhbF8yX2xvZ3xub3JtYWx8b3JkZXJlZF9sb2dpc3RpY3xwYXJldG98cGFyZXRvX3R5cGVfMnxwb2lzc29ufHBvaXNzb25fbG9nfHJheWxlaWdofHNjYWxlZF9pbnZfY2hpX3NxdWFyZXxza2V3X25vcm1hbHxzdHVkZW50X3R8dW5pZm9ybXx2b25fbWlzZXN8d2VpYnVsbHx3aWVuZXJ8d2lzaGFydClcXGIiLGU6aGxqcy5JTU1FRElBVEVfUkUscjoxMH0se2NOOiJrZXl3b3JkIixiOiIoPzpmb3J8aW58d2hpbGV8aWZ8dGhlbnxlbHNlfHJldHVybnxsb3dlcnx1cHBlcnxwcmludHxpbmNyZW1lbnRfbG9nX3Byb2J8aW50ZWdyYXRlX29kZXxyZWplY3QpXFxiIixlOmhsanMuSU1NRURJQVRFX1JFLHI6MTB9LHtjTjoia2V5d29yZCIsYjoiKD86aW50fHJlYWx8dmVjdG9yfHNpbXBsZXh8dW5pdF92ZWN0b3J8b3JkZXJlZHxwb3NpdGl2ZV9vcmRlcmVkfHJvd192ZWN0b3J8bWF0cml4fGNob2xlc2t5X2ZhY3Rvcl9jb3Z8Y2hvbGVza3lfZmFjdG9yX2NvcnJ8Y29ycl9tYXRyaXh8Y292X21hdHJpeHx2b2lkKVxcYiIsZTpobGpzLklNTUVESUFURV9SRSxyOjV9LHtjTjoia2V5d29yZCIsYjoiKD86ZnVuY3Rpb25zfGRhdGF8dHJhbnNmb3JtZWRcXHMrZGF0YXxwYXJhbWV0ZXJzfHRyYW5zZm9ybWVkXFxzK3BhcmFtZXRlcnN8bW9kZWx8Z2VuZXJhdGVkXFxzK3F1YW50aXRpZXMpXFxiIixlOmhsanMuSU1NRURJQVRFX1JFLHI6NX1dfX07aGxqcy5MQU5HVUFHRVMueG1sPWZ1bmN0aW9uKCl7dmFyIGI9IltBLVphLXowLTlcXC5fOi1dKyI7dmFyIGE9e2VXOnRydWUsYzpbe2NOOiJhdHRyaWJ1dGUiLGI6YixyOjB9LHtiOic9IicsckI6dHJ1ZSxlOiciJyxjOlt7Y046InZhbHVlIixiOiciJyxlVzp0cnVlfV19LHtiOiI9JyIsckI6dHJ1ZSxlOiInIixjOlt7Y046InZhbHVlIixiOiInIixlVzp0cnVlfV19LHtiOiI9IixjOlt7Y046InZhbHVlIixiOiJbXlxccy8+XSsifV19XX07cmV0dXJue2NJOnRydWUsZE06e2M6W3tjTjoicGkiLGI6IjxcXD8iLGU6IlxcPz4iLHI6MTB9LHtjTjoiZG9jdHlwZSIsYjoiPCFET0NUWVBFIixlOiI+IixyOjEwLGM6W3tiOiJcXFsiLGU6IlxcXSJ9XX0se2NOOiJjb21tZW50IixiOiI8IS0tIixlOiItLT4iLHI6MTB9LHtjTjoiY2RhdGEiLGI6IjxcXCFcXFtDREFUQVxcWyIsZToiXFxdXFxdPiIscjoxMH0se2NOOiJ0YWciLGI6IjxzdHlsZSg/PVxcc3w+fCQpIixlOiI+IixrOnt0aXRsZTp7c3R5bGU6MX19LGM6W2FdLHN0YXJ0czp7Y046ImNzcyIsZToiPC9zdHlsZT4iLHJFOnRydWUsc0w6ImNzcyJ9fSx7Y046InRhZyIsYjoiPHNjcmlwdCg/PVxcc3w+fCQpIixlOiI+IixrOnt0aXRsZTp7c2NyaXB0OjF9fSxjOlthXSxzdGFydHM6e2NOOiJqYXZhc2NyaXB0IixlOiI8XC9zY3JpcHQ+IixyRTp0cnVlLHNMOiJqYXZhc2NyaXB0In19LHtjTjoidmJzY3JpcHQiLGI6IjwlIixlOiIlPiIsc0w6InZic2NyaXB0In0se2NOOiJ0YWciLGI6IjwvPyIsZToiLz8+IixjOlt7Y046InRpdGxlIixiOiJbXiAvPl0rIn0sYV19XX19fSgpOwpobGpzLmluaXRIaWdobGlnaHRpbmdPbkxvYWQoKTsKCg=="></script> @@ -223,7 +223,7 @@ div.tocify { <h1 class="title toc-ignore">Example evaluation of FOCUS Laboratory Data L1 to L3</h1> <h4 class="author"><em>Johannes Ranke</em></h4> -<h4 class="date"><em>2016-11-18</em></h4> +<h4 class="date"><em>2017-05-05</em></h4> </div> @@ -242,17 +242,17 @@ FOCUS_2006_L1_mkin <- mkin_wide_to_long(FOCUS_2006_L1)</code></pre> <p>Since mkin version 0.9-32 (July 2014), we can use shorthand notation like <code>"SFO"</code> for parent only degradation models. The following two lines fit the model and produce the summary report of the model fit. This covers the numerical analysis given in the FOCUS report.</p> <pre class="r"><code>m.L1.SFO <- mkinfit("SFO", FOCUS_2006_L1_mkin, quiet = TRUE) summary(m.L1.SFO)</code></pre> -<pre><code>## mkin version: 0.9.44.9000 -## R version: 3.3.2 -## Date of fit: Fri Nov 18 22:48:55 2016 -## Date of summary: Fri Nov 18 22:48:55 2016 +<pre><code>## mkin version: 0.9.45 +## R version: 3.4.0 +## Date of fit: Fri May 5 12:14:02 2017 +## Date of summary: Fri May 5 12:14:02 2017 ## ## Equations: ## d_parent/dt = - k_parent_sink * parent ## ## Model predictions using solution type analytical ## -## Fitted with method Port using 37 model solutions performed in 0.087 s +## Fitted with method Port using 37 model solutions performed in 0.263 s ## ## Weighting: none ## @@ -333,12 +333,12 @@ summary(m.L1.SFO)</code></pre> <pre><code>## Warning in mkinfit("FOMC", FOCUS_2006_L1_mkin, quiet = TRUE): Optimisation by method Port did not converge. ## Convergence code is 1</code></pre> <pre class="r"><code>plot(m.L1.FOMC, show_errmin = TRUE, main = "FOCUS L1 - FOMC")</code></pre> -<p><img src="data:image/png;base64,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" /><!-- --></p> +<p><img src="data:image/png;base64,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" /><!-- --></p> <pre class="r"><code>summary(m.L1.FOMC, data = FALSE)</code></pre> -<pre><code>## mkin version: 0.9.44.9000 -## R version: 3.3.2 -## Date of fit: Fri Nov 18 22:48:55 2016 -## Date of summary: Fri Nov 18 22:48:55 2016 +<pre><code>## mkin version: 0.9.45 +## R version: 3.4.0 +## Date of fit: Fri May 5 12:14:03 2017 +## Date of summary: Fri May 5 12:14:03 2017 ## ## ## Warning: Optimisation by method Port did not converge. @@ -350,7 +350,7 @@ summary(m.L1.SFO)</code></pre> ## ## Model predictions using solution type analytical ## -## Fitted with method Port using 188 model solutions performed in 0.413 s +## Fitted with method Port using 155 model solutions performed in 0.439 s ## ## Weighting: none ## @@ -370,16 +370,16 @@ summary(m.L1.SFO)</code></pre> ## None ## ## Optimised, transformed parameters with symmetric confidence intervals: -## Estimate Std. Error Lower Upper -## parent_0 92.47 1.422 89.44 95.50 -## log_alpha 15.43 15.080 -16.71 47.58 -## log_beta 17.78 15.090 -14.37 49.93 +## Estimate Std. Error Lower Upper +## parent_0 92.47 1.449 89.38 95.56 +## log_alpha 11.35 435.800 -917.60 940.30 +## log_beta 13.70 435.800 -915.20 942.60 ## ## Parameter correlation: ## parent_0 log_alpha log_beta -## parent_0 1.0000 0.1129 0.1112 -## log_alpha 0.1129 1.0000 1.0000 -## log_beta 0.1112 1.0000 1.0000 +## parent_0 1.0000 0.2209 0.2208 +## log_alpha 0.2209 1.0000 1.0000 +## log_beta 0.2208 1.0000 1.0000 ## ## Residual standard error: 3.045 on 15 degrees of freedom ## @@ -387,10 +387,10 @@ summary(m.L1.SFO)</code></pre> ## Confidence intervals for internally transformed parameters are asymmetric. ## t-test (unrealistically) based on the assumption of normal distribution ## for estimators of untransformed parameters. -## Estimate t value Pr(>t) Lower Upper -## parent_0 9.247e+01 65.150 4.044e-20 8.944e+01 9.550e+01 -## alpha 5.044e+06 1.271 1.115e-01 5.510e-08 4.618e+20 -## beta 5.276e+07 1.259 1.137e-01 5.732e-07 4.857e+21 +## Estimate t value Pr(>t) Lower Upper +## parent_0 92.47 63.33000 6.183e-20 89.38 95.56 +## alpha 85190.00 0.03367 4.868e-01 0.00 Inf +## beta 891000.00 0.03367 4.868e-01 0.00 Inf ## ## Chi2 error levels in percent: ## err.min n.optim df @@ -398,8 +398,8 @@ summary(m.L1.SFO)</code></pre> ## parent 3.619 3 6 ## ## Estimated disappearance times: -## DT50 DT90 DT50back -## parent 7.25 24.08 7.25</code></pre> +## DT50 DT90 DT50back +## parent 7.249 24.08 7.249</code></pre> <p>We get a warning that the default optimisation algorithm <code>Port</code> did not converge, which is an indication that the model is overparameterised, <em>i.e.</em> contains too many parameters that are ill-defined as a consequence.</p> <p>And in fact, due to the higher number of parameters, and the lower number of degrees of freedom of the fit, the <span class="math inline"><em>χ</em><sup>2</sup></span> error level is actually higher for the FOMC model (3.6%) than for the SFO model (3.4%). Additionally, the parameters <code>log_alpha</code> and <code>log_beta</code> internally fitted in the model have excessive confidence intervals, that span more than 25 orders of magnitude (!) when backtransformed to the scale of <code>alpha</code> and <code>beta</code>. Also, the t-test for significant difference from zero does not indicate such a significant difference, with p-values greater than 0.1, and finally, the parameter correlation of <code>log_alpha</code> and <code>log_beta</code> is 1.000, clearly indicating that the model is overparameterised.</p> <p>The <span class="math inline"><em>χ</em><sup>2</sup></span> error levels reported in Appendix 3 and Appendix 7 to the FOCUS kinetics report are rounded to integer percentages and partly deviate by one percentage point from the results calculated by mkin. The reason for this is not known. However, mkin gives the same <span class="math inline"><em>χ</em><sup>2</sup></span> error levels as the kinfit package and the calculation routines of the kinfit package have been extensively compared to the results obtained by the KinGUI software, as documented in the kinfit package vignette. KinGUI was the first widely used standard package in this field. Also, the calculation of <span class="math inline"><em>χ</em><sup>2</sup></span> error levels was compared with KinGUII, CAKE and DegKin manager in a project sponsored by the German Umweltbundesamt <span class="citation">(Ranke 2014)</span>.</p> @@ -432,17 +432,17 @@ plot(m.L2.FOMC, show_residuals = TRUE, main = "FOCUS L2 - FOMC")</code></pre> <p><img src="data:image/png;base64,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" /><!-- --></p> <pre class="r"><code>summary(m.L2.FOMC, data = FALSE)</code></pre> -<pre><code>## mkin version: 0.9.44.9000 -## R version: 3.3.2 -## Date of fit: Fri Nov 18 22:48:56 2016 -## Date of summary: Fri Nov 18 22:48:56 2016 +<pre><code>## mkin version: 0.9.45 +## R version: 3.4.0 +## Date of fit: Fri May 5 12:14:04 2017 +## Date of summary: Fri May 5 12:14:04 2017 ## ## Equations: ## d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent ## ## Model predictions using solution type analytical ## -## Fitted with method Port using 81 model solutions performed in 0.177 s +## Fitted with method Port using 81 model solutions performed in 0.171 s ## ## Weighting: none ## @@ -502,10 +502,10 @@ plot(m.L2.DFOP, show_residuals = TRUE, show_errmin = TRUE, main = "FOCUS L2 - DFOP")</code></pre> <p><img src="data:image/png;base64,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" /><!-- --></p> <pre class="r"><code>summary(m.L2.DFOP, data = FALSE)</code></pre> -<pre><code>## mkin version: 0.9.44.9000 -## R version: 3.3.2 -## Date of fit: Fri Nov 18 22:48:57 2016 -## Date of summary: Fri Nov 18 22:48:57 2016 +<pre><code>## mkin version: 0.9.45 +## R version: 3.4.0 +## Date of fit: Fri May 5 12:14:05 2017 +## Date of summary: Fri May 5 12:14:05 2017 ## ## Equations: ## d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * @@ -514,7 +514,7 @@ plot(m.L2.DFOP, show_residuals = TRUE, show_errmin = TRUE, ## ## Model predictions using solution type analytical ## -## Fitted with method Port using 336 model solutions performed in 0.747 s +## Fitted with method Port using 336 model solutions performed in 0.742 s ## ## Weighting: none ## @@ -591,10 +591,10 @@ plot(mm.L3)</code></pre> <p>The objects returned by mmkin are arranged like a matrix, with models as a row index and datasets as a column index.</p> <p>We can extract the summary and plot for <em>e.g.</em> the DFOP fit, using square brackets for indexing which will result in the use of the summary and plot functions working on mkinfit objects.</p> <pre class="r"><code>summary(mm.L3[["DFOP", 1]])</code></pre> -<pre><code>## mkin version: 0.9.44.9000 -## R version: 3.3.2 -## Date of fit: Fri Nov 18 22:48:57 2016 -## Date of summary: Fri Nov 18 22:48:57 2016 +<pre><code>## mkin version: 0.9.45 +## R version: 3.4.0 +## Date of fit: Fri May 5 12:14:06 2017 +## Date of summary: Fri May 5 12:14:06 2017 ## ## Equations: ## d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * @@ -603,7 +603,7 @@ plot(mm.L3)</code></pre> ## ## Model predictions using solution type analytical ## -## Fitted with method Port using 137 model solutions performed in 0.307 s +## Fitted with method Port using 137 model solutions performed in 0.348 s ## ## Weighting: none ## @@ -691,17 +691,17 @@ plot(mm.L4)</code></pre> <p><img src="data:image/png;base64,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" /><!-- --></p> <p>The <span class="math inline"><em>χ</em><sup>2</sup></span> error level of 3.3% as well as the plot suggest that the SFO model fits very well. The error level at which the <span class="math inline"><em>χ</em><sup>2</sup></span> test passes is slightly lower for the FOMC model. However, the difference appears negligible.</p> <pre class="r"><code>summary(mm.L4[["SFO", 1]], data = FALSE)</code></pre> -<pre><code>## mkin version: 0.9.44.9000 -## R version: 3.3.2 -## Date of fit: Fri Nov 18 22:48:58 2016 -## Date of summary: Fri Nov 18 22:48:58 2016 +<pre><code>## mkin version: 0.9.45 +## R version: 3.4.0 +## Date of fit: Fri May 5 12:14:06 2017 +## Date of summary: Fri May 5 12:14:06 2017 ## ## Equations: ## d_parent/dt = - k_parent_sink * parent ## ## Model predictions using solution type analytical ## -## Fitted with method Port using 46 model solutions performed in 0.098 s +## Fitted with method Port using 46 model solutions performed in 0.096 s ## ## Weighting: none ## @@ -751,17 +751,17 @@ plot(mm.L4)</code></pre> ## DT50 DT90 ## parent 106 352</code></pre> <pre class="r"><code>summary(mm.L4[["FOMC", 1]], data = FALSE)</code></pre> -<pre><code>## mkin version: 0.9.44.9000 -## R version: 3.3.2 -## Date of fit: Fri Nov 18 22:48:58 2016 -## Date of summary: Fri Nov 18 22:48:58 2016 +<pre><code>## mkin version: 0.9.45 +## R version: 3.4.0 +## Date of fit: Fri May 5 12:14:06 2017 +## Date of summary: Fri May 5 12:14:06 2017 ## ## Equations: ## d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent ## ## Model predictions using solution type analytical ## -## Fitted with method Port using 66 model solutions performed in 0.142 s +## Fitted with method Port using 66 model solutions performed in 0.138 s ## ## Weighting: none ## diff --git a/vignettes/FOCUS_Z.pdf b/vignettes/FOCUS_Z.pdf Binary files differindex fd313555..8a87e874 100644 --- a/vignettes/FOCUS_Z.pdf +++ b/vignettes/FOCUS_Z.pdf diff --git a/vignettes/compiled_models.html b/vignettes/compiled_models.html index 53c5647f..67d0f658 100644 --- a/vignettes/compiled_models.html +++ b/vignettes/compiled_models.html @@ -229,8 +229,13 @@ div.tocify { <pre><code>## gcc ## "/usr/bin/gcc"</code></pre> <p>First, we build a simple degradation model for a parent compound with one metabolite.</p> -<pre class="r"><code>library("mkin") -SFO_SFO <- mkinmod( +<pre class="r"><code>library("mkin")</code></pre> +<pre><code>## Loading required package: minpack.lm</code></pre> +<pre><code>## Loading required package: rootSolve</code></pre> +<pre><code>## Loading required package: inline</code></pre> +<pre><code>## Loading required package: methods</code></pre> +<pre><code>## Loading required package: parallel</code></pre> +<pre class="r"><code>SFO_SFO <- mkinmod( parent = mkinsub("SFO", "m1"), m1 = mkinsub("SFO"))</code></pre> <pre><code>## Successfully compiled differential equation model from auto-generated C code.</code></pre> @@ -251,15 +256,16 @@ SFO_SFO <- mkinmod( factor_SFO_SFO <- NA print("R package benchmark is not available") }</code></pre> +<pre><code>## Loading required package: rbenchmark</code></pre> <pre><code>## test replications elapsed relative user.self sys.self -## 3 deSolve, compiled 3 2.742 1.000 2.740 0.000 -## 1 deSolve, not compiled 3 24.467 8.923 24.344 0.124 -## 2 Eigenvalue based 3 3.050 1.112 3.044 0.004 +## 3 deSolve, compiled 3 2.040 1.000 2.040 0 +## 1 deSolve, not compiled 3 14.622 7.168 14.624 0 +## 2 Eigenvalue based 3 2.478 1.215 2.480 0 ## user.child sys.child ## 3 0 0 ## 1 0 0 ## 2 0 0</code></pre> -<p>We see that using the compiled model is by a factor of around 9 faster than using the R version with the default ode solver, and it is even faster than the Eigenvalue based solution implemented in R which does not need iterative solution of the ODEs.</p> +<p>We see that using the compiled model is by a factor of around 7 faster than using the R version with the default ode solver, and it is even faster than the Eigenvalue based solution implemented in R which does not need iterative solution of the ODEs.</p> </div> <div id="model-that-can-not-be-solved-with-eigenvalues" class="section level2"> <h2>Model that can not be solved with Eigenvalues</h2> @@ -282,12 +288,12 @@ SFO_SFO <- mkinmod( }</code></pre> <pre><code>## Successfully compiled differential equation model from auto-generated C code.</code></pre> <pre><code>## test replications elapsed relative user.self sys.self -## 2 deSolve, compiled 3 4.038 1.000 4.036 0.000 -## 1 deSolve, not compiled 3 55.209 13.672 54.888 0.324 +## 2 deSolve, compiled 3 3.500 1.000 3.500 0 +## 1 deSolve, not compiled 3 29.932 8.552 29.932 0 ## user.child sys.child ## 2 0 0 ## 1 0 0</code></pre> -<p>Here we get a performance benefit of a factor of 14 using the version of the differential equation model compiled from C code!</p> +<p>Here we get a performance benefit of a factor of 9 using the version of the differential equation model compiled from C code!</p> <p>This vignette was built with mkin 0.9.45 on</p> <pre><code>## R version 3.4.0 (2017-04-21) ## Platform: x86_64-pc-linux-gnu (64-bit) |