Friday, February 4, 2011

Manga ChapterReader


// ==UserScript==
// @name Manga ChapterReader
// @description Displays full chapters from MangaReader.net in a simpler interface.
// @author passcod
// @license MIT/X11 + Attribution
// @version 11.34
// @namespace http://www.mangareader.net
// @include http://www.mangareader.net/*
// @include http://mangareader.net/*
// ==/UserScript==
// version format: y.z


/**
* Decode a Base64 encoded string
*
* @see http://phpjs.org
* @version 3.21
* @copyright 2011 Kevin van Zonneveld.
*
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*/
function base64_decode(data){var b64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var o1,o2,o3,h1,h2,h3,h4,bits,i=0,ac=0,dec="",tmp_arr=[];if(!data){return data;}
data+='';do{h1=b64.indexOf(data.charAt(i++));h2=b64.indexOf(data.charAt(i++));h3=b64.indexOf(data.charAt(i++));h4=b64.indexOf(data.charAt(i++));bits=h1<<18|h2<<12|h3<<6|h4;o1=bits>>16&0xff;o2=bits>>8&0xff;o3=bits&0xff;if(h3==64){tmp_arr[ac++]=String.fromCharCode(o1);}else if(h4==64){tmp_arr[ac++]=String.fromCharCode(o1,o2);}else{tmp_arr[ac++]=String.fromCharCode(o1,o2,o3);}}while(i<data.length);dec=tmp_arr.join('');dec=this.utf8_decode(dec);return dec;}
function utf8_decode(str_data){var tmp_arr=[],i=0,ac=0,c1=0,c2=0,c3=0;str_data+='';while(i<str_data.length){c1=str_data.charCodeAt(i);if(c1<128){tmp_arr[ac++]=String.fromCharCode(c1);i++;}
else if(c1>191&&c1<224){c2=str_data.charCodeAt(i+1);tmp_arr[ac++]=String.fromCharCode(((c1&31)<<6)|(c2&63));i+=2;}
else{c2=str_data.charCodeAt(i+1);c3=str_data.charCodeAt(i+2);tmp_arr[ac++]=String.fromCharCode(((c1&15)<<12)|((c2&63)<<6)|(c3&63));i+=3;}}
return tmp_arr.join('');}


var regular = /mangareader\.net\/[a-z0-9\-]+\/[0-9]+(\/.+)?/i,
old = /mangareader\.net\/[0-9\-]+\/([a-z0-9\-]+)\/chapter-([0-9]+)\.htm/i;

if ( regular.test(window.location) || old.test(window.location) ) {
document.getElementsByTagName('head')[0].innerHTML = '<title>Loading... -- '+
document.getElementsByTagName('title')[0].innerHTML+'</title>';

document.getElementsByTagName('body')[0].innerHTML = '<p id="pre">Loading...</p>';
var script = document.createElement('script');
var src = document.createTextNode(base64_decode(GetIt()));
script.appendChild(src);
script.type = "text/javascript";
document.getElementsByTagName('body')[0].appendChild(script);
}


function GetIt() { return 'CnZhciBNQ1JfVkVSU0lPTj0nMTEuMzQnOyhmdW5jdGlvbihFLEIpe2Z1bmN0aW9uIGthKGEsYixkKXtpZihkPT09QiYmYS5ub2RlVHlwZT09PTEpe2Q9YS5nZXRBdHRyaWJ1dGUoImRhdGEtIitiKTtpZih0eXBlb2YgZD09PSJzdHJpbmciKXt0cnl7ZD1kPT09InRydWUiP3RydWU6ZD09PSJmYWxzZSI/ZmFsc2U6ZD09PSJudWxsIj9udWxsOiFjLmlzTmFOKGQpP3BhcnNlRmxvYXQoZCk6SmEudGVzdChkKT9jLnBhcnNlSlNPTihkKTpkfWNhdGNoKGUpe31jLmRhdGEoYSxiLGQpfWVsc2UgZD1CfXJldHVybiBkfWZ1bmN0aW9uIFUoKXtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gY2EoKXtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiBsYShhLGIsZCl7ZFswXS50eXBlPWE7cmV0dXJuIGMuZXZlbnQuaGFuZGxlLmFwcGx5KGIsZCl9ZnVuY3Rpb24gS2EoYSl7dmFyIGIsZCxlLGYsaCxsLGssbyx4LHIsQSxDPVtdO2Y9W107aD1jLmRhdGEodGhpcyx0aGlzLm5vZGVUeXBlPyJldmVudHMiOiJfX2V2ZW50c19fIik7aWYodHlwZW9mIGg9PT0iZnVuY3Rpb24iKWg9aC5ldmVudHM7aWYoIShhLmxpdmVGaXJlZD09PXRoaXN8fCFofHwhaC5saXZlfHxhLmJ1dHRvbiYmYS50eXBlPT09ImNsaWNrIikpe2lmKGEubmFtZXNwYWNlKUE9UmVnRXhwKCIoXnxcXC4pIithLm5hbWVzcGFjZS5zcGxpdCgiLiIpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpO2EubGl2ZUZpcmVkPXRoaXM7dmFyIEo9aC5saXZlLnNsaWNlKDApO2ZvcihrPTA7azxKLmxlbmd0aDtrKyspe2g9SltrXTtoLm9yaWdUeXBlLnJlcGxhY2UoWCwiIik9PT1hLnR5cGU/Zi5wdXNoKGguc2VsZWN0b3IpOkouc3BsaWNlKGstLSwxKX1mPWMoYS50YXJnZXQpLmNsb3Nlc3QoZixhLmN1cnJlbnRUYXJnZXQpO289MDtmb3IoeD1mLmxlbmd0aDtvPHg7bysrKXtyPWZbb107Zm9yKGs9MDtrPEoubGVuZ3RoO2srKyl7aD1KW2tdO2lmKHIuc2VsZWN0b3I9PT1oLnNlbGVjdG9yJiYoIUF8fEEudGVzdChoLm5hbWVzcGFjZSkpKXtsPXIuZWxlbTtlPW51bGw7aWYoaC5wcmVUeXBlPT09Im1vdXNlZW50ZXIifHxoLnByZVR5cGU9PT0ibW91c2VsZWF2ZSIpe2EudHlwZT1oLnByZVR5cGU7ZT1jKGEucmVsYXRlZFRhcmdldCkuY2xvc2VzdChoLnNlbGVjdG9yKVswXX1pZighZXx8ZSE9PWwpQy5wdXNoKHtlbGVtOmwsaGFuZGxlT2JqOmgsbGV2ZWw6ci5sZXZlbH0pfX19bz0wO2Zvcih4PUMubGVuZ3RoO288eDtvKyspe2Y9Q1tvXTtpZihkJiZmLmxldmVsPmQpYnJlYWs7YS5jdXJyZW50VGFyZ2V0PWYuZWxlbTthLmRhdGE9Zi5oYW5kbGVPYmouZGF0YTthLmhhbmRsZU9iaj1mLmhhbmRsZU9iajtBPWYuaGFuZGxlT2JqLm9yaWdIYW5kbGVyLmFwcGx5KGYuZWxlbSxhcmd1bWVudHMpO2lmKEE9PT1mYWxzZXx8YS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXtkPWYubGV2ZWw7aWYoQT09PWZhbHNlKWI9ZmFsc2U7aWYoYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrfX1yZXR1cm4gYn19ZnVuY3Rpb24gWShhLGIpe3JldHVybihhJiZhIT09IioiP2ErIi4iOiIiKStiLnJlcGxhY2UoTGEsImAiKS5yZXBsYWNlKE1hLCImIil9ZnVuY3Rpb24gbWEoYSxiLGQpe2lmKGMuaXNGdW5jdGlvbihiKSlyZXR1cm4gYy5ncmVwKGEsZnVuY3Rpb24oZixoKXtyZXR1cm4hIWIuY2FsbChmLGgsZik9PT1kfSk7ZWxzZSBpZihiLm5vZGVUeXBlKXJldHVybiBjLmdyZXAoYSxmdW5jdGlvbihmKXtyZXR1cm4gZj09PWI9PT1kfSk7ZWxzZSBpZih0eXBlb2YgYj09PSJzdHJpbmciKXt2YXIgZT1jLmdyZXAoYSxmdW5jdGlvbihmKXtyZXR1cm4gZi5ub2RlVHlwZT09PTF9KTtpZihOYS50ZXN0KGIpKXJldHVybiBjLmZpbHRlcihiLGUsIWQpO2Vsc2UgYj1jLmZpbHRlcihiLGUpfXJldHVybiBjLmdyZXAoYSxmdW5jdGlvbihmKXtyZXR1cm4gYy5pbkFycmF5KGYsYik+PTA9PT1kfSl9ZnVuY3Rpb24gbmEoYSxiKXt2YXIgZD0wO2IuZWFjaChmdW5jdGlvbigpe2lmKHRoaXMubm9kZU5hbWU9PT0oYVtkXSYmYVtkXS5ub2RlTmFtZSkpe3ZhciBlPWMuZGF0YShhW2QrK10pLGY9Yy5kYXRhKHRoaXMsZSk7aWYoZT1lJiZlLmV2ZW50cyl7ZGVsZXRlIGYuaGFuZGxlO2YuZXZlbnRzPXt9O2Zvcih2YXIgaCBpbiBlKWZvcih2YXIgbCBpbiBlW2hdKWMuZXZlbnQuYWRkKHRoaXMsaCxlW2hdW2xdLGVbaF1bbF0uZGF0YSl9fX0pfWZ1bmN0aW9uIE9hKGEsYil7Yi5zcmM/Yy5hamF4KHt1cmw6Yi5zcmMsYXN5bmM6ZmFsc2UsZGF0YVR5cGU6InNjcmlwdCJ9KTpjLmdsb2JhbEV2YWwoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpO2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpfWZ1bmN0aW9uIG9hKGEsYixkKXt2YXIgZT1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0O2lmKGQ9PT0iYm9yZGVyIilyZXR1cm4gZTtjLmVhY2goYj09PSJ3aWR0aCI/UGE6UWEsZnVuY3Rpb24oKXtkfHwoZS09cGFyc2VGbG9hdChjLmNzcyhhLCJwYWRkaW5nIit0aGlzKSl8fDApO2lmKGQ9PT0ibWFyZ2luIillKz1wYXJzZUZsb2F0KGMuY3NzKGEsIm1hcmdpbiIrdGhpcykpfHwwO2Vsc2UgZS09cGFyc2VGbG9hdChjLmNzcyhhLCJib3JkZXIiK3RoaXMrIldpZHRoIikpfHwwfSk7cmV0dXJuIGV9ZnVuY3Rpb24gZGEoYSxiLGQsZSl7aWYoYy5pc0FycmF5KGIpJiZiLmxlbmd0aCljLmVhY2goYixmdW5jdGlvbihmLGgpe2R8fFJhLnRlc3QoYSk/ZShhLGgpOmRhKGErIlsiKyh0eXBlb2YgaD09PSJvYmplY3QifHxjLmlzQXJyYXkoaCk/ZjoiIikrIl0iLGgsZCxlKX0pO2Vsc2UgaWYoIWQmJmIhPW51bGwmJnR5cGVvZiBiPT09Im9iamVjdCIpYy5pc0VtcHR5T2JqZWN0KGIpP2UoYSwiIik6Yy5lYWNoKGIsZnVuY3Rpb24oZixoKXtkYShhKyJbIitmKyJdIixoLGQsZSl9KTtlbHNlIGUoYSxiKX1mdW5jdGlvbiBTKGEsYil7dmFyIGQ9e307Yy5lYWNoKHBhLmNvbmNhdC5hcHBseShbXSxwYS5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2RbdGhpc109YX0pO3JldHVybiBkfWZ1bmN0aW9uIHFhKGEpe2lmKCFlYVthXSl7dmFyIGI9YygiPCIrCmErIj4iKS5hcHBlbmRUbygiYm9keSIpLGQ9Yi5jc3MoImRpc3BsYXkiKTtiLnJlbW92ZSgpO2lmKGQ9PT0ibm9uZSJ8fGQ9PT0iIilkPSJibG9jayI7ZWFbYV09ZH1yZXR1cm4gZWFbYV19ZnVuY3Rpb24gZmEoYSl7cmV0dXJuIGMuaXNXaW5kb3coYSk/YTphLm5vZGVUeXBlPT09OT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzpmYWxzZX12YXIgdD1FLmRvY3VtZW50LGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7aWYoIWIuaXNSZWFkeSl7dHJ5e3QuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goail7c2V0VGltZW91dChhLDEpO3JldHVybn1iLnJlYWR5KCl9fXZhciBiPWZ1bmN0aW9uKGoscyl7cmV0dXJuIG5ldyBiLmZuLmluaXQoaixzKX0sZD1FLmpRdWVyeSxlPUUuJCxmLGg9L14oPzpbXjxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKykkKS8sbD0vXFMvLGs9L15ccysvLG89L1xzKyQvLHg9L1xXLyxyPS9cZC8sQT0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLEM9L15bXF0sOnt9XHNdKiQvLEo9L1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZyx3PS8iW14iXFxcblxyXSoifHRydWV8ZmFsc2V8bnVsbHwtP1xkKyg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8vZyxJPS8oPzpefDp8LCkoPzpccypcWykrL2csTD0vKHdlYmtpdClbIFwvXShbXHcuXSspLyxnPS8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLyxpPS8obXNpZSkgKFtcdy5dKykvLG49Lyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKSk/LyxtPW5hdmlnYXRvci51c2VyQWdlbnQscD1mYWxzZSxxPVtdLHUseT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLEY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxNPUFycmF5LnByb3RvdHlwZS5wdXNoLE49QXJyYXkucHJvdG90eXBlLnNsaWNlLE89U3RyaW5nLnByb3RvdHlwZS50cmltLEQ9QXJyYXkucHJvdG90eXBlLmluZGV4T2YsUj17fTtiLmZuPWIucHJvdG90eXBlPXtpbml0OmZ1bmN0aW9uKGoscyl7dmFyIHYseixIO2lmKCFqKXJldHVybiB0aGlzO2lmKGoubm9kZVR5cGUpe3RoaXMuY29udGV4dD10aGlzWzBdPWo7dGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZihqPT09ImJvZHkiJiYhcyYmdC5ib2R5KXt0aGlzLmNvbnRleHQ9dDt0aGlzWzBdPXQuYm9keTt0aGlzLnNlbGVjdG9yPSJib2R5Ijt0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBqPT09InN0cmluZyIpaWYoKHY9aC5leGVjKGopKSYmKHZbMV18fCFzKSlpZih2WzFdKXtIPXM/cy5vd25lckRvY3VtZW50fHxzOnQ7aWYoej1BLmV4ZWMoaikpaWYoYi5pc1BsYWluT2JqZWN0KHMpKXtqPVt0LmNyZWF0ZUVsZW1lbnQoelsxXSldO2IuZm4uYXR0ci5jYWxsKGoscyx0cnVlKX1lbHNlIGo9W0guY3JlYXRlRWxlbWVudCh6WzFdKV07ZWxzZXt6PWIuYnVpbGRGcmFnbWVudChbdlsxXV0sW0hdKTtqPSh6LmNhY2hlYWJsZT96LmZyYWdtZW50LmNsb25lTm9kZSh0cnVlKTp6LmZyYWdtZW50KS5jaGlsZE5vZGVzfXJldHVybiBiLm1lcmdlKHRoaXMsail9ZWxzZXtpZigoej10LmdldEVsZW1lbnRCeUlkKHZbMl0pKSYmei5wYXJlbnROb2RlKXtpZih6LmlkIT09dlsyXSlyZXR1cm4gZi5maW5kKGopO3RoaXMubGVuZ3RoPTE7dGhpc1swXT16fXRoaXMuY29udGV4dD10O3RoaXMuc2VsZWN0b3I9ajtyZXR1cm4gdGhpc31lbHNlIGlmKCFzJiYheC50ZXN0KGopKXt0aGlzLnNlbGVjdG9yPWo7dGhpcy5jb250ZXh0PXQ7aj10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGopO3JldHVybiBiLm1lcmdlKHRoaXMsail9ZWxzZSByZXR1cm4hc3x8cy5qcXVlcnk/KHN8fGYpLmZpbmQoaik6YihzKS5maW5kKGopO2Vsc2UgaWYoYi5pc0Z1bmN0aW9uKGopKXJldHVybiBmLnJlYWR5KGopO2lmKGouc2VsZWN0b3IhPT1CKXt0aGlzLnNlbGVjdG9yPWouc2VsZWN0b3I7dGhpcy5jb250ZXh0PWouY29udGV4dH1yZXR1cm4gYi5tYWtlQXJyYXkoaix0aGlzKX0sc2VsZWN0b3I6IiIsanF1ZXJ5OiIxLjQuNCIsbGVuZ3RoOjAsc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBOLmNhbGwodGhpcywwKX0sZ2V0OmZ1bmN0aW9uKGope3JldHVybiBqPT1udWxsP3RoaXMudG9BcnJheSgpOmo8MD90aGlzLnNsaWNlKGopWzBdOnRoaXNbal19LHB1c2hTdGFjazpmdW5jdGlvbihqLHMsdil7dmFyIHo9YigpO2IuaXNBcnJheShqKT9NLmFwcGx5KHosaik6Yi5tZXJnZSh6LGopO3oucHJldk9iamVjdD10aGlzO3ouY29udGV4dD10aGlzLmNvbnRleHQ7aWYocz09PSJmaW5kIil6LnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0b3I/IiAiOiIiKSt2O2Vsc2UgaWYocyl6LnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrIi4iK3MrIigiK3YrIikiO3JldHVybiB6fSxlYWNoOmZ1bmN0aW9uKGoscyl7cmV0dXJuIGIuZWFjaCh0aGlzLGoscyl9LHJlYWR5OmZ1bmN0aW9uKGope2IuYmluZFJlYWR5KCk7aWYoYi5pc1JlYWR5KWouY2FsbCh0LGIpO2Vsc2UgcSYmcS5wdXNoKGopO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihqKXtyZXR1cm4gaj09PS0xP3RoaXMuc2xpY2Uoaik6dGhpcy5zbGljZShqLCtqKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhOLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLE4uY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihqKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYi5tYXAodGhpcyxmdW5jdGlvbihzLHYpe3JldHVybiBqLmNhbGwocyx2LHMpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHxiKG51bGwpfSxwdXNoOk0sc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9O2IuZm4uaW5pdC5wcm90b3R5cGU9Yi5mbjtiLmV4dGVuZD1iLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBqLHMsdix6LEgsRz1hcmd1bWVudHNbMF18fHt9LEs9MSxRPWFyZ3VtZW50cy5sZW5ndGgsZ2E9ZmFsc2U7aWYodHlwZW9mIEc9PT0iYm9vbGVhbiIpe2dhPUc7Rz1hcmd1bWVudHNbMV18fHt9O0s9Mn1pZih0eXBlb2YgRyE9PSJvYmplY3QiJiYhYi5pc0Z1bmN0aW9uKEcpKUc9e307aWYoUT09PUspe0c9dGhpczstLUt9Zm9yKDtLPFE7SysrKWlmKChqPWFyZ3VtZW50c1tLXSkhPW51bGwpZm9yKHMgaW4gail7dj1HW3NdO3o9altzXTtpZihHIT09eilpZihnYSYmeiYmKGIuaXNQbGFpbk9iamVjdCh6KXx8KEg9Yi5pc0FycmF5KHopKSkpe2lmKEgpe0g9ZmFsc2U7dj12JiZiLmlzQXJyYXkodik/djpbXX1lbHNlIHY9diYmYi5pc1BsYWluT2JqZWN0KHYpP3Y6e307R1tzXT1iLmV4dGVuZChnYSx2LHopfWVsc2UgaWYoeiE9PUIpR1tzXT16fXJldHVybiBHfTtiLmV4dGVuZCh7bm9Db25mbGljdDpmdW5jdGlvbihqKXtFLiQ9ZTtpZihqKUUualF1ZXJ5PWQ7cmV0dXJuIGJ9LGlzUmVhZHk6ZmFsc2UscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24oail7aj09PXRydWUmJmIucmVhZHlXYWl0LS07aWYoIWIucmVhZHlXYWl0fHxqIT09dHJ1ZSYmIWIuaXNSZWFkeSl7aWYoIXQuYm9keSlyZXR1cm4gc2V0VGltZW91dChiLnJlYWR5LDEpO2IuaXNSZWFkeT10cnVlO2lmKCEoaiE9PXRydWUmJi0tYi5yZWFkeVdhaXQ+MCkpaWYocSl7dmFyIHM9MCx2PXE7Zm9yKHE9bnVsbDtqPXZbcysrXTspai5jYWxsKHQsYik7Yi5mbi50cmlnZ2VyJiZiKHQpLnRyaWdnZXIoInJlYWR5IikudW5iaW5kKCJyZWFkeSIpfX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFwKXtwPXRydWU7aWYodC5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIilyZXR1cm4gc2V0VGltZW91dChiLnJlYWR5LDEpO2lmKHQuYWRkRXZlbnRMaXN0ZW5lcil7dC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix1LGZhbHNlKTtFLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGIucmVhZHksZmFsc2UpfWVsc2UgaWYodC5hdHRhY2hFdmVudCl7dC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIix1KTtFLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGIucmVhZHkpO3ZhciBqPWZhbHNlO3RyeXtqPUUuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKHMpe310LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmaiYmYSgpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oail7cmV0dXJuIGIudHlwZShqKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oail7cmV0dXJuIGIudHlwZShqKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGope3JldHVybiBqJiZ0eXBlb2Ygaj09PSJvYmplY3QiJiYic2V0SW50ZXJ2YWwiaW4gan0saXNOYU46ZnVuY3Rpb24oail7cmV0dXJuIGo9PW51bGx8fCFyLnRlc3Qoail8fGlzTmFOKGopfSx0eXBlOmZ1bmN0aW9uKGope3JldHVybiBqPT1udWxsP1N0cmluZyhqKTpSW3kuY2FsbChqKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGope2lmKCFqfHxiLnR5cGUoaikhPT0ib2JqZWN0Inx8ai5ub2RlVHlwZXx8Yi5pc1dpbmRvdyhqKSlyZXR1cm4gZmFsc2U7aWYoai5jb25zdHJ1Y3RvciYmIUYuY2FsbChqLCJjb25zdHJ1Y3RvciIpJiYhRi5jYWxsKGouY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuIGZhbHNlO2Zvcih2YXIgcyBpbiBqKTtyZXR1cm4gcz09PUJ8fEYuY2FsbChqLHMpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGope2Zvcih2YXIgcyBpbiBqKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZX0sZXJyb3I6ZnVuY3Rpb24oail7dGhyb3cgajt9LHBhcnNlSlNPTjpmdW5jdGlvbihqKXtpZih0eXBlb2YgaiE9PSJzdHJpbmcifHwhailyZXR1cm4gbnVsbDtqPWIudHJpbShqKTtpZihDLnRlc3Qoai5yZXBsYWNlKEosIkAiKS5yZXBsYWNlKHcsIl0iKS5yZXBsYWNlKEksIiIpKSlyZXR1cm4gRS5KU09OJiZFLkpTT04ucGFyc2U/RS5KU09OLnBhcnNlKGopOihuZXcgRnVuY3Rpb24oInJldHVybiAiK2opKSgpO2Vsc2UgYi5lcnJvcigiSW52YWxpZCBKU09OOiAiK2opfSxub29wOmZ1bmN0aW9uKCl7fSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGope2lmKGomJmwudGVzdChqKSl7dmFyIHM9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHx0LmRvY3VtZW50RWxlbWVudCx2PXQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7di50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2lmKGIuc3VwcG9ydC5zY3JpcHRFdmFsKXYuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZShqKSk7ZWxzZSB2LnRleHQ9ajtzLmluc2VydEJlZm9yZSh2LHMuZmlyc3RDaGlsZCk7cy5yZW1vdmVDaGlsZCh2KX19LG5vZGVOYW1lOmZ1bmN0aW9uKGoscyl7cmV0dXJuIGoubm9kZU5hbWUmJmoubm9kZU5hbWUudG9VcHBlckNhc2UoKT09PXMudG9VcHBlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihqLHMsdil7dmFyIHosSD0wLEc9ai5sZW5ndGgsSz1HPT09Qnx8Yi5pc0Z1bmN0aW9uKGopO2lmKHYpaWYoSylmb3IoeiBpbiBqKXtpZihzLmFwcGx5KGpbel0sdik9PT1mYWxzZSlicmVha31lbHNlIGZvcig7SDxHOyl7aWYocy5hcHBseShqW0grK10sdik9PT1mYWxzZSlicmVha31lbHNlIGlmKEspZm9yKHogaW4gail7aWYocy5jYWxsKGpbel0seixqW3pdKT09PWZhbHNlKWJyZWFrfWVsc2UgZm9yKHY9alswXTtIPEcmJnMuY2FsbCh2LEgsdikhPT1mYWxzZTt2PWpbKytIXSk7cmV0dXJuIGp9LHRyaW06Tz9mdW5jdGlvbihqKXtyZXR1cm4gaj09bnVsbD8iIjpPLmNhbGwoail9OmZ1bmN0aW9uKGope3JldHVybiBqPT1udWxsPyIiOmoudG9TdHJpbmcoKS5yZXBsYWNlKGssIiIpLnJlcGxhY2UobywiIil9LG1ha2VBcnJheTpmdW5jdGlvbihqLHMpe3ZhciB2PXN8fFtdO2lmKGohPW51bGwpe3ZhciB6PWIudHlwZShqKTtqLmxlbmd0aD09bnVsbHx8ej09PSJzdHJpbmcifHx6PT09ImZ1bmN0aW9uInx8ej09PSJyZWdleHAifHxiLmlzV2luZG93KGopP00uY2FsbCh2LGopOmIubWVyZ2UodixqKX1yZXR1cm4gdn0saW5BcnJheTpmdW5jdGlvbihqLHMpe2lmKHMuaW5kZXhPZilyZXR1cm4gcy5pbmRleE9mKGopO2Zvcih2YXIgdj0wLHo9cy5sZW5ndGg7djx6O3YrKylpZihzW3ZdPT09ailyZXR1cm4gdjtyZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oaixzKXt2YXIgdj1qLmxlbmd0aCx6PTA7aWYodHlwZW9mIHMubGVuZ3RoPT09Im51bWJlciIpZm9yKHZhciBIPXMubGVuZ3RoO3o8SDt6Kyspalt2KytdPXNbel07ZWxzZSBmb3IoO3Nbel0hPT1COylqW3YrK109c1t6KytdO2oubGVuZ3RoPXY7cmV0dXJuIGp9LGdyZXA6ZnVuY3Rpb24oaixzLHYpe3ZhciB6PVtdLEg7dj0hIXY7Zm9yKHZhciBHPTAsSz1qLmxlbmd0aDtHPEs7RysrKXtIPSEhcyhqW0ddLEcpO3YhPT1IJiZ6LnB1c2goaltHXSl9cmV0dXJuIHp9LG1hcDpmdW5jdGlvbihqLHMsdil7Zm9yKHZhciB6PVtdLEgsRz0wLEs9ai5sZW5ndGg7RzxLO0crKyl7SD1zKGpbR10sRyx2KTtpZihIIT1udWxsKXpbei5sZW5ndGhdPUh9cmV0dXJuIHouY29uY2F0LmFwcGx5KFtdLHopfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oaixzLHYpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yKWlmKHR5cGVvZiBzPT09InN0cmluZyIpe3Y9ajtqPXZbc107cz1CfWVsc2UgaWYocyYmIWIuaXNGdW5jdGlvbihzKSl7dj1zO3M9Qn1pZighcyYmailzPWZ1bmN0aW9uKCl7cmV0dXJuIGouYXBwbHkodnx8dGhpcyxhcmd1bWVudHMpfTtpZihqKXMuZ3VpZD1qLmd1aWQ9ai5ndWlkfHxzLmd1aWR8fGIuZ3VpZCsrO3JldHVybiBzfSxhY2Nlc3M6ZnVuY3Rpb24oaixzLHYseixILEcpe3ZhciBLPWoubGVuZ3RoO2lmKHR5cGVvZiBzPT09Im9iamVjdCIpe2Zvcih2YXIgUSBpbiBzKWIuYWNjZXNzKGosUSxzW1FdLHosSCx2KTtyZXR1cm4gan1pZih2IT09Qil7ej0hRyYmeiYmYi5pc0Z1bmN0aW9uKHYpO2ZvcihRPTA7UTxLO1ErKylIKGpbUV0scyx6P3YuY2FsbChqW1FdLFEsSChqW1FdLHMpKTp2LEcpO3JldHVybiBqfXJldHVybiBLP0goalswXSxzKTpCfSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihqKXtqPWoudG9Mb3dlckNhc2UoKTtqPUwuZXhlYyhqKXx8Zy5leGVjKGopfHxpLmV4ZWMoail8fGouaW5kZXhPZigiY29tcGF0aWJsZSIpPDAmJm4uZXhlYyhqKXx8W107cmV0dXJue2Jyb3dzZXI6alsxXXx8IiIsdmVyc2lvbjpqWzJdfHwiMCJ9fSxicm93c2VyOnt9fSk7Yi5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGoscyl7UlsiW29iamVjdCAiK3MrIl0iXT1zLnRvTG93ZXJDYXNlKCl9KTttPWIudWFNYXRjaChtKTtpZihtLmJyb3dzZXIpe2IuYnJvd3NlclttLmJyb3dzZXJdPXRydWU7Yi5icm93c2VyLnZlcnNpb249bS52ZXJzaW9ufWlmKGIuYnJvd3Nlci53ZWJraXQpYi5icm93c2VyLnNhZmFyaT10cnVlO2lmKEQpYi5pbkFycmF5PWZ1bmN0aW9uKGoscyl7cmV0dXJuIEQuY2FsbChzLGopfTtpZighL1xzLy50ZXN0KCJcdTAwYTAiKSl7az0vXltcc1x4QTBdKy87bz0vW1xzXHhBMF0rJC99Zj1iKHQpO2lmKHQuYWRkRXZlbnRMaXN0ZW5lcil1PWZ1bmN0aW9uKCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix1LGZhbHNlKTtiLnJlYWR5KCl9O2Vsc2UgaWYodC5hdHRhY2hFdmVudCl1PWZ1bmN0aW9uKCl7aWYodC5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIil7dC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIix1KTtiLnJlYWR5KCl9fTtyZXR1cm4gRS5qUXVlcnk9RS4kPWJ9KCk7KGZ1bmN0aW9uKCl7Yy5zdXBwb3J0PXt9O3ZhciBhPXQuZG9jdW1lbnRFbGVtZW50LGI9dC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkPXQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT0ic2NyaXB0IitjLm5vdygpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZC5pbm5lckhUTUw9IiAgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYScgc3R5bGU9J2NvbG9yOnJlZDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU1Oyc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iO3ZhciBmPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxoPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxsPXQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iiksaz1sLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO2lmKCEoIWZ8fCFmLmxlbmd0aHx8IWgpKXtjLnN1cHBvcnQ9e2xlYWRpbmdXaGl0ZXNwYWNlOmQuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTMsdGJvZHk6IWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLGh0bWxTZXJpYWxpemU6ISFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLHN0eWxlOi9yZWQvLnRlc3QoaC5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGhyZWZOb3JtYWxpemVkOmguZ2V0QXR0cmlidXRlKCJocmVmIik9PT0iL2EiLG9wYWNpdHk6L14wLjU1JC8udGVzdChoLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhaC5zdHlsZS5jc3NGbG9hdCxjaGVja09uOmQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0udmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOmsuc2VsZWN0ZWQsZGVsZXRlRXhwYW5kbzp0cnVlLG9wdERpc2FibGVkOmZhbHNlLGNoZWNrQ2xvbmU6ZmFsc2Usc2NyaXB0RXZhbDpmYWxzZSxub0Nsb25lRXZlbnQ6dHJ1ZSxib3hNb2RlbDpudWxsLGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6ZmFsc2Usc2hyaW5rV3JhcEJsb2NrczpmYWxzZSxyZWxpYWJsZUhpZGRlbk9mZnNldHM6dHJ1ZX07bC5kaXNhYmxlZD10cnVlO2Muc3VwcG9ydC5vcHREaXNhYmxlZD0hay5kaXNhYmxlZDtiLnR5cGU9InRleHQvamF2YXNjcmlwdCI7dHJ5e2IuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZSgid2luZG93LiIrZSsiPTE7IikpfWNhdGNoKG8pe31hLmluc2VydEJlZm9yZShiLGEuZmlyc3RDaGlsZCk7aWYoRVtlXSl7Yy5zdXBwb3J0LnNjcmlwdEV2YWw9dHJ1ZTtkZWxldGUgRVtlXX10cnl7ZGVsZXRlIGIudGVzdH1jYXRjaCh4KXtjLnN1cHBvcnQuZGVsZXRlRXhwYW5kbz1mYWxzZX1hLnJlbW92ZUNoaWxkKGIpO2lmKGQuYXR0YWNoRXZlbnQmJmQuZmlyZUV2ZW50KXtkLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixmdW5jdGlvbiByKCl7Yy5zdXBwb3J0Lm5vQ2xvbmVFdmVudD1mYWxzZTtkLmRldGFjaEV2ZW50KCJvbmNsaWNrIixyKX0pO2QuY2xvbmVOb2RlKHRydWUpLmZpcmVFdmVudCgib25jbGljayIpfWQ9dC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBuYW1lPSdyYWRpb3Rlc3QnIGNoZWNrZWQ9J2NoZWNrZWQnLz4iO2E9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7YS5hcHBlbmRDaGlsZChkLmZpcnN0Q2hpbGQpO2Muc3VwcG9ydC5jaGVja0Nsb25lPWEuY2xvbmVOb2RlKHRydWUpLmNsb25lTm9kZSh0cnVlKS5sYXN0Q2hpbGQuY2hlY2tlZDtjKGZ1bmN0aW9uKCl7dmFyIHI9dC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyLnN0eWxlLndpZHRoPXIuc3R5bGUucGFkZGluZ0xlZnQ9IjFweCI7dC5ib2R5LmFwcGVuZENoaWxkKHIpO2MuYm94TW9kZWw9Yy5zdXBwb3J0LmJveE1vZGVsPXIub2Zmc2V0V2lkdGg9PT0yO2lmKCJ6b29tImluIHIuc3R5bGUpe3Iuc3R5bGUuZGlzcGxheT0iaW5saW5lIjtyLnN0eWxlLnpvb209MTtjLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dD1yLm9mZnNldFdpZHRoPT09MjtyLnN0eWxlLmRpc3BsYXk9IiI7ci5pbm5lckhUTUw9IjxkaXYgc3R5bGU9J3dpZHRoOjRweDsnPjwvZGl2PiI7Yy5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3M9ci5vZmZzZXRXaWR0aCE9PTJ9ci5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkIHN0eWxlPSdwYWRkaW5nOjA7ZGlzcGxheTpub25lJz48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+Ijt2YXIgQT1yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpO2Muc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9QVswXS5vZmZzZXRIZWlnaHQ9PT0wO0FbMF0uc3R5bGUuZGlzcGxheT0iIjtBWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Muc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9Yy5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmQVswXS5vZmZzZXRIZWlnaHQ9PT0wO3IuaW5uZXJIVE1MPSIiO3QuYm9keS5yZW1vdmVDaGlsZChyKS5zdHlsZS5kaXNwbGF5PSJub25lIn0pO2E9ZnVuY3Rpb24ocil7dmFyIEE9dC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyPSJvbiIrcjt2YXIgQz1yIGluIEE7aWYoIUMpe0Euc2V0QXR0cmlidXRlKHIsInJldHVybjsiKTtDPXR5cGVvZiBBW3JdPT09ImZ1bmN0aW9uIn1yZXR1cm4gQ307Yy5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXM9YSgic3VibWl0Iik7Yy5zdXBwb3J0LmNoYW5nZUJ1YmJsZXM9YSgiY2hhbmdlIik7YT1iPWQ9Zj1oPW51bGx9fSkoKTt2YXIgcmE9e30sSmE9L14oPzpcey4qXH18XFsuKlxdKSQvO2MuZXh0ZW5kKHtjYWNoZTp7fSx1dWlkOjAsZXhwYW5kbzoialF1ZXJ5IitjLm5vdygpLG5vRGF0YTp7ZW1iZWQ6dHJ1ZSxvYmplY3Q6ImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsYXBwbGV0OnRydWV9LGRhdGE6ZnVuY3Rpb24oYSxiLGQpe2lmKGMuYWNjZXB0RGF0YShhKSl7YT1hPT1FP3JhOmE7dmFyIGU9YS5ub2RlVHlwZSxmPWU/YVtjLmV4cGFuZG9dOm51bGwsaD1jLmNhY2hlO2lmKCEoZSYmIWYmJnR5cGVvZiBiPT09InN0cmluZyImJmQ9PT1CKSl7aWYoZSlmfHwoYVtjLmV4cGFuZG9dPWY9KytjLnV1aWQpO2Vsc2UgaD1hO2lmKHR5cGVvZiBiPT09Im9iamVjdCIpaWYoZSloW2ZdPWMuZXh0ZW5kKGhbZl0sYik7ZWxzZSBjLmV4dGVuZChoLGIpO2Vsc2UgaWYoZSYmIWhbZl0paFtmXT17fTthPWU/aFtmXTpoO2lmKGQhPT1CKWFbYl09ZDtyZXR1cm4gdHlwZW9mIGI9PT0ic3RyaW5nIj9hW2JdOmF9fX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe2lmKGMuYWNjZXB0RGF0YShhKSl7YT1hPT1FP3JhOmE7dmFyIGQ9YS5ub2RlVHlwZSxlPWQ/YVtjLmV4cGFuZG9dOmEsZj1jLmNhY2hlLGg9ZD9mW2VdOmU7aWYoYil7aWYoaCl7ZGVsZXRlIGhbYl07ZCYmYy5pc0VtcHR5T2JqZWN0KGgpJiZjLnJlbW92ZURhdGEoYSl9fWVsc2UgaWYoZCYmYy5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8pZGVsZXRlIGFbYy5leHBhbmRvXTtlbHNlIGlmKGEucmVtb3ZlQXR0cmlidXRlKWEucmVtb3ZlQXR0cmlidXRlKGMuZXhwYW5kbyk7ZWxzZSBpZihkKWRlbGV0ZSBmW2VdO2Vsc2UgZm9yKHZhciBsIGluIGEpZGVsZXRlIGFbbF19fSxhY2NlcHREYXRhOmZ1bmN0aW9uKGEpe2lmKGEubm9kZU5hbWUpe3ZhciBiPWMubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoYilyZXR1cm4hKGI9PT10cnVlfHxhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpIT09Yil9cmV0dXJuIHRydWV9fSk7Yy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1udWxsO2lmKHR5cGVvZiBhPT09InVuZGVmaW5lZCIpe2lmKHRoaXMubGVuZ3RoKXt2YXIgZT10aGlzWzBdLmF0dHJpYnV0ZXMsZjtkPWMuZGF0YSh0aGlzWzBdKTtmb3IodmFyIGg9MCxsPWUubGVuZ3RoO2g8bDtoKyspe2Y9ZVtoXS5uYW1lO2lmKGYuaW5kZXhPZigiZGF0YS0iKT09PTApe2Y9Zi5zdWJzdHIoNSk7a2EodGhpc1swXSxmLGRbZl0pfX19cmV0dXJuIGR9ZWxzZSBpZih0eXBlb2YgYT09PSJvYmplY3QiKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLmRhdGEodGhpcyxhKX0pO3ZhciBrPWEuc3BsaXQoIi4iKTtrWzFdPWtbMV0/Ii4iK2tbMV06IiI7aWYoYj09PUIpe2Q9dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIra1sxXSsiISIsW2tbMF1dKTtpZihkPT09QiYmdGhpcy5sZW5ndGgpe2Q9Yy5kYXRhKHRoaXNbMF0sYSk7ZD1rYSh0aGlzWzBdLGEsZCl9cmV0dXJuIGQ9PT1CJiZrWzFdP3RoaXMuZGF0YShrWzBdKTpkfWVsc2UgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBvPWModGhpcykseD1ba1swXSxiXTtvLnRyaWdnZXJIYW5kbGVyKCJzZXREYXRhIitrWzFdKyIhIix4KTtjLmRhdGEodGhpcyxhLGIpO28udHJpZ2dlckhhbmRsZXIoImNoYW5nZURhdGEiK2tbMV0rIiEiLHgpfSl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2MucmVtb3ZlRGF0YSh0aGlzLGEpfSl9fSk7Yy5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYixkKXtpZihhKXtiPShifHwiZngiKSsicXVldWUiO3ZhciBlPWMuZGF0YShhLGIpO2lmKCFkKXJldHVybiBlfHxbXTtpZighZXx8Yy5pc0FycmF5KGQpKWU9Yy5kYXRhKGEsYixjLm1ha2VBcnJheShkKSk7ZWxzZSBlLnB1c2goZCk7cmV0dXJuIGV9fSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBkPWMucXVldWUoYSxiKSxlPWQuc2hpZnQoKTtpZihlPT09ImlucHJvZ3Jlc3MiKWU9ZC5zaGlmdCgpO2lmKGUpe2I9PT0iZngiJiZkLnVuc2hpZnQoImlucHJvZ3Jlc3MiKTtlLmNhbGwoYSxmdW5jdGlvbigpe2MuZGVxdWV1ZShhLGIpfSl9fX0pO2MuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhIT09InN0cmluZyIpe2I9YTthPSJmeCJ9aWYoYj09PUIpcmV0dXJuIGMucXVldWUodGhpc1swXSxhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9Yy5xdWV1ZSh0aGlzLGEsYik7YT09PSJmeCImJmRbMF0hPT0iaW5wcm9ncmVzcyImJmMuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2MuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlbGF5OmZ1bmN0aW9uKGEsYil7YT1jLmZ4P2MuZnguc3BlZWRzW2FdfHxhOmE7Yj1ifHwiZngiO3JldHVybiB0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oKXt2YXIgZD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjLmRlcXVldWUoZCxiKX0sYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX19KTt2YXIgc2E9L1tcblx0XS9nLGhhPS9ccysvLFNhPS9cci9nLFRhPS9eKD86aHJlZnxzcmN8c3R5bGUpJC8sVWE9L14oPzpidXR0b258aW5wdXQpJC9pLFZhPS9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLFdhPS9eYSg/OnJlYSk/JC9pLHRhPS9eKD86cmFkaW98Y2hlY2tib3gpJC9pO2MucHJvcHM9eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLHJlYWRvbmx5OiJyZWFkT25seSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIscm93c3Bhbjoicm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdGFiaW5kZXg6InRhYkluZGV4Iix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIn07Yy5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYy5hY2Nlc3ModGhpcyxhLGIsdHJ1ZSxjLmF0dHIpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLmF0dHIodGhpcyxhLCIiKTt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5yZW1vdmVBdHRyaWJ1dGUoYSl9KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oYSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oeCl7dmFyIHI9Yyh0aGlzKTtyLmFkZENsYXNzKGEuY2FsbCh0aGlzLHgsci5hdHRyKCJjbGFzcyIpKSl9KTtpZihhJiZ0eXBlb2YgYT09PSJzdHJpbmciKWZvcih2YXIgYj0oYXx8IiIpLnNwbGl0KGhhKSxkPTAsZT10aGlzLmxlbmd0aDtkPGU7ZCsrKXt2YXIgZj10aGlzW2RdO2lmKGYubm9kZVR5cGU9PT0xKWlmKGYuY2xhc3NOYW1lKXtmb3IodmFyIGg9IiAiK2YuY2xhc3NOYW1lKyIgIixsPWYuY2xhc3NOYW1lLGs9MCxvPWIubGVuZ3RoO2s8bztrKyspaWYoaC5pbmRleE9mKCIgIitiW2tdKyIgIik8MClsKz0iICIrYltrXTtmLmNsYXNzTmFtZT1jLnRyaW0obCl9ZWxzZSBmLmNsYXNzTmFtZT1hfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihvKXt2YXIgeD1jKHRoaXMpO3gucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsbyx4LmF0dHIoImNsYXNzIikpKX0pO2lmKGEmJnR5cGVvZiBhPT09InN0cmluZyJ8fGE9PT1CKWZvcih2YXIgYj0oYXx8IiIpLnNwbGl0KGhhKSxkPTAsZT10aGlzLmxlbmd0aDtkPGU7ZCsrKXt2YXIgZj10aGlzW2RdO2lmKGYubm9kZVR5cGU9PT0xJiZmLmNsYXNzTmFtZSlpZihhKXtmb3IodmFyIGg9KCIgIitmLmNsYXNzTmFtZSsiICIpLnJlcGxhY2Uoc2EsIiAiKSxsPTAsaz1iLmxlbmd0aDtsPGs7bCsrKWg9aC5yZXBsYWNlKCIgIitiW2xdKyIgIiwiICIpO2YuY2xhc3NOYW1lPWMudHJpbShoKX1lbHNlIGYuY2xhc3NOYW1lPSIifXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBkPXR5cGVvZiBhLGU9dHlwZW9mIGI9PT0iYm9vbGVhbiI7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZil7dmFyIGg9Yyh0aGlzKTtoLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGYsaC5hdHRyKCJjbGFzcyIpLGIpLGIpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGQ9PT0ic3RyaW5nIilmb3IodmFyIGYsaD0wLGw9Yyh0aGlzKSxrPWIsbz1hLnNwbGl0KGhhKTtmPW9baCsrXTspe2s9ZT9rOiFsLmhhc0NsYXNzKGYpO2xbaz8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGYpfWVsc2UgaWYoZD09PSJ1bmRlZmluZWQifHxkPT09ImJvb2xlYW4iKXt0aGlzLmNsYXNzTmFtZSYmYy5kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKTt0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8YT09PWZhbHNlPyIiOmMuZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIifX0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXthPSIgIithKyIgIjtmb3IodmFyIGI9MCxkPXRoaXMubGVuZ3RoO2I8ZDtiKyspaWYoKCIgIit0aGlzW2JdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2Uoc2EsIiAiKS5pbmRleE9mKGEpPi0xKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX0sdmFsOmZ1bmN0aW9uKGEpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXt2YXIgYj10aGlzWzBdO2lmKGIpe2lmKGMubm9kZU5hbWUoYiwib3B0aW9uIikpe3ZhciBkPWIuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hZHx8ZC5zcGVjaWZpZWQ/Yi52YWx1ZTpiLnRleHR9aWYoYy5ub2RlTmFtZShiLCJzZWxlY3QiKSl7dmFyIGU9Yi5zZWxlY3RlZEluZGV4O2Q9W107dmFyIGY9Yi5vcHRpb25zO2I9Yi50eXBlPT09InNlbGVjdC1vbmUiO2lmKGU8MClyZXR1cm4gbnVsbDt2YXIgaD1iP2U6MDtmb3IoZT1iP2UrMTpmLmxlbmd0aDtoPGU7aCsrKXt2YXIgbD1mW2hdO2lmKGwuc2VsZWN0ZWQmJihjLnN1cHBvcnQub3B0RGlzYWJsZWQ/IWwuZGlzYWJsZWQ6bC5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFsLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFjLm5vZGVOYW1lKGwucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2E9YyhsKS52YWwoKTtpZihiKXJldHVybiBhO2QucHVzaChhKX19cmV0dXJuIGR9aWYodGEudGVzdChiLnR5cGUpJiYhYy5zdXBwb3J0LmNoZWNrT24pcmV0dXJuIGIuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPT09bnVsbD8ib24iOmIudmFsdWU7cmV0dXJuKGIudmFsdWV8fCIiKS5yZXBsYWNlKFNhLCIiKX1yZXR1cm4gQn12YXIgaz1jLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihvKXt2YXIgeD1jKHRoaXMpLHI9YTtpZih0aGlzLm5vZGVUeXBlPT09MSl7aWYoaylyPWEuY2FsbCh0aGlzLG8seC52YWwoKSk7aWYocj09bnVsbClyPSIiO2Vsc2UgaWYodHlwZW9mIHI9PT0ibnVtYmVyIilyKz0iIjtlbHNlIGlmKGMuaXNBcnJheShyKSlyPWMubWFwKHIsZnVuY3Rpb24oQyl7cmV0dXJuIEM9PW51bGw/IiI6QysiIn0pO2lmKGMuaXNBcnJheShyKSYmdGEudGVzdCh0aGlzLnR5cGUpKXRoaXMuY2hlY2tlZD1jLmluQXJyYXkoeC52YWwoKSxyKT49MDtlbHNlIGlmKGMubm9kZU5hbWUodGhpcywic2VsZWN0Iikpe3ZhciBBPWMubWFrZUFycmF5KHIpO2MoIm9wdGlvbiIsdGhpcykuZWFjaChmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9Yy5pbkFycmF5KGModGhpcykudmFsKCksQSk+PTB9KTtpZighQS5sZW5ndGgpdGhpcy5zZWxlY3RlZEluZGV4PS0xfWVsc2UgdGhpcy52YWx1ZT1yfX0pfX0pO2MuZXh0ZW5kKHthdHRyRm46e3ZhbDp0cnVlLGNzczp0cnVlLGh0bWw6dHJ1ZSx0ZXh0OnRydWUsZGF0YTp0cnVlLHdpZHRoOnRydWUsaGVpZ2h0OnRydWUsb2Zmc2V0OnRydWV9LGF0dHI6ZnVuY3Rpb24oYSxiLGQsZSl7aWYoIWF8fGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OClyZXR1cm4gQjtpZihlJiZiIGluIGMuYXR0ckZuKXJldHVybiBjKGEpW2JdKGQpO2U9YS5ub2RlVHlwZSE9PTF8fCFjLmlzWE1MRG9jKGEpO3ZhciBmPWQhPT1CO2I9ZSYmYy5wcm9wc1tiXXx8Yjt2YXIgaD1UYS50ZXN0KGIpO2lmKChiIGluIGF8fGFbYl0hPT1CKSYmZSYmIWgpe2lmKGYpe2I9PT0idHlwZSImJlVhLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSYmYy5lcnJvcigidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIik7aWYoZD09PW51bGwpYS5ub2RlVHlwZT09PTEmJmEucmVtb3ZlQXR0cmlidXRlKGIpO2Vsc2UgYVtiXT1kfWlmKGMubm9kZU5hbWUoYSwiZm9ybSIpJiZhLmdldEF0dHJpYnV0ZU5vZGUoYikpcmV0dXJuIGEuZ2V0QXR0cmlidXRlTm9kZShiKS5ub2RlVmFsdWU7aWYoYj09PSJ0YWJJbmRleCIpcmV0dXJuKGI9YS5nZXRBdHRyaWJ1dGVOb2RlKCJ0YWJJbmRleCIpKSYmYi5zcGVjaWZpZWQ/Yi52YWx1ZTpWYS50ZXN0KGEubm9kZU5hbWUpfHxXYS50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDpCO3JldHVybiBhW2JdfWlmKCFjLnN1cHBvcnQuc3R5bGUmJmUmJmI9PT0ic3R5bGUiKXtpZihmKWEuc3R5bGUuY3NzVGV4dD0iIitkO3JldHVybiBhLnN0eWxlLmNzc1RleHR9ZiYmYS5zZXRBdHRyaWJ1dGUoYiwiIitkKTtpZighYS5hdHRyaWJ1dGVzW2JdJiZhLmhhc0F0dHJpYnV0ZSYmIWEuaGFzQXR0cmlidXRlKGIpKXJldHVybiBCO2E9IWMuc3VwcG9ydC5ocmVmTm9ybWFsaXplZCYmZSYmaD9hLmdldEF0dHJpYnV0ZShiLDIpOmEuZ2V0QXR0cmlidXRlKGIpO3JldHVybiBhPT09bnVsbD9COmF9fSk7dmFyIFg9L1wuKC4qKSQvLGlhPS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSxMYT0vXC4vZyxNYT0vIC9nLFhhPS9bXlx3XHMufGBdL2csWWE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZShYYSwiXFwkJiIpfSx1YT17Zm9jdXNpbjowLGZvY3Vzb3V0OjB9O2MuZXZlbnQ9e2FkZDpmdW5jdGlvbihhLGIsZCxlKXtpZighKGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OCkpe2lmKGMuaXNXaW5kb3coYSkmJmEhPT1FJiYhYS5mcmFtZUVsZW1lbnQpYT1FO2lmKGQ9PT1mYWxzZSlkPVU7ZWxzZSBpZighZClyZXR1cm47dmFyIGYsaDtpZihkLmhhbmRsZXIpe2Y9ZDtkPWYuaGFuZGxlcn1pZighZC5ndWlkKWQuZ3VpZD1jLmd1aWQrKztpZihoPWMuZGF0YShhKSl7dmFyIGw9YS5ub2RlVHlwZT8iZXZlbnRzIjoiX19ldmVudHNfXyIsaz1oW2xdLG89aC5oYW5kbGU7aWYodHlwZW9mIGs9PT0iZnVuY3Rpb24iKXtvPWsuaGFuZGxlO2s9ay5ldmVudHN9ZWxzZSBpZighayl7YS5ub2RlVHlwZXx8KGhbbF09aD1mdW5jdGlvbigpe30pO2guZXZlbnRzPWs9e319aWYoIW8paC5oYW5kbGU9bz1mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgYyE9PSJ1bmRlZmluZWQiJiYhYy5ldmVudC50cmlnZ2VyZWQ/Yy5ldmVudC5oYW5kbGUuYXBwbHkoby5lbGVtLGFyZ3VtZW50cyk6Qn07by5lbGVtPWE7Yj1iLnNwbGl0KCIgIik7Zm9yKHZhciB4PTAscjtsPWJbeCsrXTspe2g9Zj9jLmV4dGVuZCh7fSxmKTp7aGFuZGxlcjpkLGRhdGE6ZX07aWYobC5pbmRleE9mKCIuIik+LTEpe3I9bC5zcGxpdCgiLiIpO2w9ci5zaGlmdCgpO2gubmFtZXNwYWNlPXIuc2xpY2UoMCkuc29ydCgpLmpvaW4oIi4iKX1lbHNle3I9W107aC5uYW1lc3BhY2U9IiJ9aC50eXBlPWw7aWYoIWguZ3VpZCloLmd1aWQ9ZC5ndWlkO3ZhciBBPWtbbF0sQz1jLmV2ZW50LnNwZWNpYWxbbF18fHt9O2lmKCFBKXtBPWtbbF09W107aWYoIUMuc2V0dXB8fEMuc2V0dXAuY2FsbChhLGUscixvKT09PWZhbHNlKWlmKGEuYWRkRXZlbnRMaXN0ZW5lcilhLmFkZEV2ZW50TGlzdGVuZXIobCxvLGZhbHNlKTtlbHNlIGEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitsLG8pfWlmKEMuYWRkKXtDLmFkZC5jYWxsKGEsaCk7aWYoIWguaGFuZGxlci5ndWlkKWguaGFuZGxlci5ndWlkPWQuZ3VpZH1BLnB1c2goaCk7Yy5ldmVudC5nbG9iYWxbbF09dHJ1ZX1hPW51bGx9fX0sZ2xvYmFsOnt9LHJlbW92ZTpmdW5jdGlvbihhLGIsZCxlKXtpZighKGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OCkpe2lmKGQ9PT1mYWxzZSlkPVU7dmFyIGYsaCxsPTAsayxvLHgscixBLEMsSj1hLm5vZGVUeXBlPyJldmVudHMiOiJfX2V2ZW50c19fIix3PWMuZGF0YShhKSxJPXcmJndbSl07aWYodyYmSSl7aWYodHlwZW9mIEk9PT0iZnVuY3Rpb24iKXt3PUk7ST1JLmV2ZW50c31pZihiJiZiLnR5cGUpe2Q9Yi5oYW5kbGVyO2I9Yi50eXBlfWlmKCFifHx0eXBlb2YgYj09PSJzdHJpbmciJiZiLmNoYXJBdCgwKT09PSIuIil7Yj1ifHwiIjtmb3IoZiBpbiBJKWMuZXZlbnQucmVtb3ZlKGEsZitiKX1lbHNle2ZvcihiPWIuc3BsaXQoIiAiKTtmPWJbbCsrXTspe3I9ZjtrPWYuaW5kZXhPZigiLiIpPDA7bz1bXTtpZighayl7bz1mLnNwbGl0KCIuIik7Zj1vLnNoaWZ0KCk7eD1SZWdFeHAoIihefFxcLikiKwpjLm1hcChvLnNsaWNlKDApLnNvcnQoKSxZYSkuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIil9aWYoQT1JW2ZdKWlmKGQpe3I9Yy5ldmVudC5zcGVjaWFsW2ZdfHx7fTtmb3IoaD1lfHwwO2g8QS5sZW5ndGg7aCsrKXtDPUFbaF07aWYoZC5ndWlkPT09Qy5ndWlkKXtpZihrfHx4LnRlc3QoQy5uYW1lc3BhY2UpKXtlPT1udWxsJiZBLnNwbGljZShoLS0sMSk7ci5yZW1vdmUmJnIucmVtb3ZlLmNhbGwoYSxDKX1pZihlIT1udWxsKWJyZWFrfX1pZihBLmxlbmd0aD09PTB8fGUhPW51bGwmJkEubGVuZ3RoPT09MSl7aWYoIXIudGVhcmRvd258fHIudGVhcmRvd24uY2FsbChhLG8pPT09ZmFsc2UpYy5yZW1vdmVFdmVudChhLGYsdy5oYW5kbGUpO2RlbGV0ZSBJW2ZdfX1lbHNlIGZvcihoPTA7aDxBLmxlbmd0aDtoKyspe0M9QVtoXTtpZihrfHx4LnRlc3QoQy5uYW1lc3BhY2UpKXtjLmV2ZW50LnJlbW92ZShhLHIsQy5oYW5kbGVyLGgpO0Euc3BsaWNlKGgtLSwxKX19fWlmKGMuaXNFbXB0eU9iamVjdChJKSl7aWYoYj13LmhhbmRsZSliLmVsZW09bnVsbDtkZWxldGUgdy5ldmVudHM7ZGVsZXRlIHcuaGFuZGxlO2lmKHR5cGVvZiB3PT09ImZ1bmN0aW9uIiljLnJlbW92ZURhdGEoYSxKKTtlbHNlIGMuaXNFbXB0eU9iamVjdCh3KSYmYy5yZW1vdmVEYXRhKGEpfX19fX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZj1hLnR5cGV8fGE7aWYoIWUpe2E9dHlwZW9mIGE9PT0ib2JqZWN0Ij9hW2MuZXhwYW5kb10/YTpjLmV4dGVuZChjLkV2ZW50KGYpLGEpOmMuRXZlbnQoZik7aWYoZi5pbmRleE9mKCIhIik+PTApe2EudHlwZT1mPWYuc2xpY2UoMCwtMSk7YS5leGNsdXNpdmU9dHJ1ZX1pZighZCl7YS5zdG9wUHJvcGFnYXRpb24oKTtjLmV2ZW50Lmdsb2JhbFtmXSYmYy5lYWNoKGMuY2FjaGUsZnVuY3Rpb24oKXt0aGlzLmV2ZW50cyYmdGhpcy5ldmVudHNbZl0mJmMuZXZlbnQudHJpZ2dlcihhLGIsdGhpcy5oYW5kbGUuZWxlbSl9KX1pZighZHx8ZC5ub2RlVHlwZT09PTN8fGQubm9kZVR5cGU9PT04KXJldHVybiBCO2EucmVzdWx0PUI7YS50YXJnZXQ9ZDtiPWMubWFrZUFycmF5KGIpO2IudW5zaGlmdChhKX1hLmN1cnJlbnRUYXJnZXQ9ZDsoZT1kLm5vZGVUeXBlP2MuZGF0YShkLCJoYW5kbGUiKTooYy5kYXRhKGQsIl9fZXZlbnRzX18iKXx8e30pLmhhbmRsZSkmJmUuYXBwbHkoZCxiKTtlPWQucGFyZW50Tm9kZXx8ZC5vd25lckRvY3VtZW50O3RyeXtpZighKGQmJmQubm9kZU5hbWUmJmMubm9EYXRhW2Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKWlmKGRbIm9uIitmXSYmZFsib24iK2ZdLmFwcGx5KGQsYik9PT1mYWxzZSl7YS5yZXN1bHQ9ZmFsc2U7YS5wcmV2ZW50RGVmYXVsdCgpfX1jYXRjaChoKXt9aWYoIWEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZSljLmV2ZW50LnRyaWdnZXIoYSxiLGUsdHJ1ZSk7ZWxzZSBpZighYS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7dmFyIGw7ZT1hLnRhcmdldDt2YXIgaz1mLnJlcGxhY2UoWCwiIiksbz1jLm5vZGVOYW1lKGUsImEiKSYmaz09PSJjbGljayIseD1jLmV2ZW50LnNwZWNpYWxba118fHt9O2lmKCgheC5fZGVmYXVsdHx8eC5fZGVmYXVsdC5jYWxsKGQsYSk9PT1mYWxzZSkmJiFvJiYhKGUmJmUubm9kZU5hbWUmJmMubm9EYXRhW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKXt0cnl7aWYoZVtrXSl7aWYobD1lWyJvbiIra10pZVsib24iK2tdPW51bGw7Yy5ldmVudC50cmlnZ2VyZWQ9dHJ1ZTtlW2tdKCl9fWNhdGNoKHIpe31pZihsKWVbIm9uIitrXT1sO2MuZXZlbnQudHJpZ2dlcmVkPWZhbHNlfX19LGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYixkLGUsZjtkPVtdO3ZhciBoPWMubWFrZUFycmF5KGFyZ3VtZW50cyk7YT1oWzBdPWMuZXZlbnQuZml4KGF8fEUuZXZlbnQpO2EuY3VycmVudFRhcmdldD10aGlzO2I9YS50eXBlLmluZGV4T2YoIi4iKTwwJiYhYS5leGNsdXNpdmU7aWYoIWIpe2U9YS50eXBlLnNwbGl0KCIuIik7YS50eXBlPWUuc2hpZnQoKTtkPWUuc2xpY2UoMCkuc29ydCgpO2U9UmVnRXhwKCIoXnxcXC4pIisKZC5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKX1hLm5hbWVzcGFjZT1hLm5hbWVzcGFjZXx8ZC5qb2luKCIuIik7Zj1jLmRhdGEodGhpcyx0aGlzLm5vZGVUeXBlPyJldmVudHMiOiJfX2V2ZW50c19fIik7aWYodHlwZW9mIGY9PT0iZnVuY3Rpb24iKWY9Zi5ldmVudHM7ZD0oZnx8e30pW2EudHlwZV07aWYoZiYmZCl7ZD1kLnNsaWNlKDApO2Y9MDtmb3IodmFyIGw9ZC5sZW5ndGg7ZjxsO2YrKyl7dmFyIGs9ZFtmXTtpZihifHxlLnRlc3Qoay5uYW1lc3BhY2UpKXthLmhhbmRsZXI9ay5oYW5kbGVyO2EuZGF0YT1rLmRhdGE7YS5oYW5kbGVPYmo9aztrPWsuaGFuZGxlci5hcHBseSh0aGlzLGgpO2lmKGshPT1CKXthLnJlc3VsdD1rO2lmKGs9PT1mYWxzZSl7YS5wcmV2ZW50RGVmYXVsdCgpO2Euc3RvcFByb3BhZ2F0aW9uKCl9fWlmKGEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVha319fXJldHVybiBhLnJlc3VsdH0scHJvcHM6ImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgYnV0dG9uIGNhbmNlbGFibGUgY2hhckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkgY3VycmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVudFBoYXNlIGZyb21FbGVtZW50IGhhbmRsZXIga2V5Q29kZSBsYXllclggbGF5ZXJZIG1ldGFLZXkgbmV3VmFsdWUgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHByZXZWYWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNjcmVlblggc2NyZWVuWSBzaGlmdEtleSBzcmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQgdmlldyB3aGVlbERlbHRhIHdoaWNoIi5zcGxpdCgiICIpLGZpeDpmdW5jdGlvbihhKXtpZihhW2MuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGI9YTthPWMuRXZlbnQoYik7Zm9yKHZhciBkPXRoaXMucHJvcHMubGVuZ3RoLGU7ZDspe2U9dGhpcy5wcm9wc1stLWRdO2FbZV09YltlXX1pZighYS50YXJnZXQpYS50YXJnZXQ9YS5zcmNFbGVtZW50fHx0O2lmKGEudGFyZ2V0Lm5vZGVUeXBlPT09MylhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlO2lmKCFhLnJlbGF0ZWRUYXJnZXQmJmEuZnJvbUVsZW1lbnQpYS5yZWxhdGVkVGFyZ2V0PWEuZnJvbUVsZW1lbnQ9PT1hLnRhcmdldD9hLnRvRWxlbWVudDphLmZyb21FbGVtZW50O2lmKGEucGFnZVg9PW51bGwmJmEuY2xpZW50WCE9bnVsbCl7Yj10LmRvY3VtZW50RWxlbWVudDtkPXQuYm9keTthLnBhZ2VYPWEuY2xpZW50WCsoYiYmYi5zY3JvbGxMZWZ0fHxkJiZkLnNjcm9sbExlZnR8fDApLShiJiZiLmNsaWVudExlZnR8fGQmJmQuY2xpZW50TGVmdHx8MCk7YS5wYWdlWT1hLmNsaWVudFkrKGImJmIuc2Nyb2xsVG9wfHxkJiZkLnNjcm9sbFRvcHx8MCktKGImJmIuY2xpZW50VG9wfHxkJiZkLmNsaWVudFRvcHx8MCl9aWYoYS53aGljaD09bnVsbCYmKGEuY2hhckNvZGUhPW51bGx8fGEua2V5Q29kZSE9bnVsbCkpYS53aGljaD1hLmNoYXJDb2RlIT1udWxsP2EuY2hhckNvZGU6YS5rZXlDb2RlO2lmKCFhLm1ldGFLZXkmJmEuY3RybEtleSlhLm1ldGFLZXk9YS5jdHJsS2V5O2lmKCFhLndoaWNoJiZhLmJ1dHRvbiE9PUIpYS53aGljaD1hLmJ1dHRvbiYxPzE6YS5idXR0b24mMj8zOmEuYnV0dG9uJjQ/MjowO3JldHVybiBhfSxndWlkOjFFOCxwcm94eTpjLnByb3h5LHNwZWNpYWw6e3JlYWR5OntzZXR1cDpjLmJpbmRSZWFkeSx0ZWFyZG93bjpjLm5vb3B9LGxpdmU6e2FkZDpmdW5jdGlvbihhKXtjLmV2ZW50LmFkZCh0aGlzLFkoYS5vcmlnVHlwZSxhLnNlbGVjdG9yKSxjLmV4dGVuZCh7fSxhLHtoYW5kbGVyOkthLGd1aWQ6YS5oYW5kbGVyLmd1aWR9KSl9LHJlbW92ZTpmdW5jdGlvbihhKXtjLmV2ZW50LnJlbW92ZSh0aGlzLFkoYS5vcmlnVHlwZSxhLnNlbGVjdG9yKSxhKX19LGJlZm9yZXVubG9hZDp7c2V0dXA6ZnVuY3Rpb24oYSxiLGQpe2lmKGMuaXNXaW5kb3codGhpcykpdGhpcy5vbmJlZm9yZXVubG9hZD1kfSx0ZWFyZG93bjpmdW5jdGlvbihhLGIpe2lmKHRoaXMub25iZWZvcmV1bmxvYWQ9PT1iKXRoaXMub25iZWZvcmV1bmxvYWQ9bnVsbH19fX07Yy5yZW1vdmVFdmVudD10LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGQpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsZCxmYWxzZSl9OmZ1bmN0aW9uKGEsYixkKXthLmRldGFjaEV2ZW50JiZhLmRldGFjaEV2ZW50KCJvbiIrYixkKX07Yy5FdmVudD1mdW5jdGlvbihhKXtpZighdGhpcy5wcmV2ZW50RGVmYXVsdClyZXR1cm4gbmV3IGMuRXZlbnQoYSk7aWYoYSYmYS50eXBlKXt0aGlzLm9yaWdpbmFsRXZlbnQ9YTt0aGlzLnR5cGU9YS50eXBlfWVsc2UgdGhpcy50eXBlPWE7dGhpcy50aW1lU3RhbXA9Yy5ub3coKTt0aGlzW2MuZXhwYW5kb109dHJ1ZX07Yy5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Y2E7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKGEpaWYoYS5wcmV2ZW50RGVmYXVsdClhLnByZXZlbnREZWZhdWx0KCk7ZWxzZSBhLnJldHVyblZhbHVlPWZhbHNlfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWNhO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDtpZihhKXthLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKTthLmNhbmNlbEJ1YmJsZT10cnVlfX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1jYTt0aGlzLnN0b3BQcm9wYWdhdGlvbigpfSxpc0RlZmF1bHRQcmV2ZW50ZWQ6VSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpVLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOlV9O3ZhciB2YT1mdW5jdGlvbihhKXt2YXIgYj1hLnJlbGF0ZWRUYXJnZXQ7dHJ5e2Zvcig7YiYmYiE9PXRoaXM7KWI9Yi5wYXJlbnROb2RlO2lmKGIhPT10aGlzKXthLnR5cGU9YS5kYXRhO2MuZXZlbnQuaGFuZGxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19Y2F0Y2goZCl7fX0sd2E9ZnVuY3Rpb24oYSl7YS50eXBlPWEuZGF0YTtjLmV2ZW50LmhhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2MuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7Yy5ldmVudC5zcGVjaWFsW2FdPXtzZXR1cDpmdW5jdGlvbihkKXtjLmV2ZW50LmFkZCh0aGlzLGIsZCYmZC5zZWxlY3Rvcj93YTp2YSxhKX0sdGVhcmRvd246ZnVuY3Rpb24oZCl7Yy5ldmVudC5yZW1vdmUodGhpcyxiLGQmJmQuc2VsZWN0b3I/d2E6dmEpfX19KTtpZighYy5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXMpYy5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtpZih0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0iZm9ybSIpe2MuZXZlbnQuYWRkKHRoaXMsImNsaWNrLnNwZWNpYWxTdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGQ9Yi50eXBlO2lmKChkPT09InN1Ym1pdCJ8fGQ9PT0iaW1hZ2UiKSYmYyhiKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoKXthLmxpdmVGaXJlZD1CO3JldHVybiBsYSgic3VibWl0Iix0aGlzLGFyZ3VtZW50cyl9fSk7Yy5ldmVudC5hZGQodGhpcywia2V5cHJlc3Muc3BlY2lhbFN1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsZD1iLnR5cGU7aWYoKGQ9PT0idGV4dCJ8fGQ9PT0icGFzc3dvcmQiKSYmYyhiKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoJiZhLmtleUNvZGU9PT0xMyl7YS5saXZlRmlyZWQ9QjtyZXR1cm4gbGEoInN1Ym1pdCIsdGhpcyxhcmd1bWVudHMpfX0pfWVsc2UgcmV0dXJuIGZhbHNlfSx0ZWFyZG93bjpmdW5jdGlvbigpe2MuZXZlbnQucmVtb3ZlKHRoaXMsIi5zcGVjaWFsU3VibWl0Iil9fTtpZighYy5zdXBwb3J0LmNoYW5nZUJ1YmJsZXMpe3ZhciBWLHhhPWZ1bmN0aW9uKGEpe3ZhciBiPWEudHlwZSxkPWEudmFsdWU7aWYoYj09PSJyYWRpbyJ8fGI9PT0iY2hlY2tib3giKWQ9YS5jaGVja2VkO2Vsc2UgaWYoYj09PSJzZWxlY3QtbXVsdGlwbGUiKWQ9YS5zZWxlY3RlZEluZGV4Pi0xP2MubWFwKGEub3B0aW9ucyxmdW5jdGlvbihlKXtyZXR1cm4gZS5zZWxlY3RlZH0pLmpvaW4oIi0iKToiIjtlbHNlIGlmKGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzZWxlY3QiKWQ9YS5zZWxlY3RlZEluZGV4O3JldHVybiBkfSxaPWZ1bmN0aW9uKGEsYil7dmFyIGQ9YS50YXJnZXQsZSxmO2lmKCEoIWlhLnRlc3QoZC5ub2RlTmFtZSl8fGQucmVhZE9ubHkpKXtlPWMuZGF0YShkLCJfY2hhbmdlX2RhdGEiKTtmPXhhKGQpO2lmKGEudHlwZSE9PSJmb2N1c291dCJ8fGQudHlwZSE9PSJyYWRpbyIpYy5kYXRhKGQsIl9jaGFuZ2VfZGF0YSIsZik7aWYoIShlPT09Qnx8Zj09PWUpKWlmKGUhPW51bGx8fGYpe2EudHlwZT0iY2hhbmdlIjthLmxpdmVGaXJlZD1CO3JldHVybiBjLmV2ZW50LnRyaWdnZXIoYSxiLGQpfX19O2MuZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e2ZpbHRlcnM6e2ZvY3Vzb3V0OlosYmVmb3JlZGVhY3RpdmF0ZTpaLGNsaWNrOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGQ9Yi50eXBlO2lmKGQ9PT0icmFkaW8ifHxkPT09ImNoZWNrYm94Inx8Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InNlbGVjdCIpcmV0dXJuIFouY2FsbCh0aGlzLGEpfSxrZXlkb3duOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGQ9Yi50eXBlO2lmKGEua2V5Q29kZT09PTEzJiZiLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0idGV4dGFyZWEifHxhLmtleUNvZGU9PT0zMiYmKGQ9PT0iY2hlY2tib3gifHxkPT09InJhZGlvIil8fGQ9PT0ic2VsZWN0LW11bHRpcGxlIilyZXR1cm4gWi5jYWxsKHRoaXMsYSl9LGJlZm9yZWFjdGl2YXRlOmZ1bmN0aW9uKGEpe2E9YS50YXJnZXQ7Yy5kYXRhKGEsIl9jaGFuZ2VfZGF0YSIseGEoYSkpfX0sc2V0dXA6ZnVuY3Rpb24oKXtpZih0aGlzLnR5cGU9PT0iZmlsZSIpcmV0dXJuIGZhbHNlO2Zvcih2YXIgYSBpbiBWKWMuZXZlbnQuYWRkKHRoaXMsYSsiLnNwZWNpYWxDaGFuZ2UiLFZbYV0pO3JldHVybiBpYS50ZXN0KHRoaXMubm9kZU5hbWUpfSx0ZWFyZG93bjpmdW5jdGlvbigpe2MuZXZlbnQucmVtb3ZlKHRoaXMsIi5zcGVjaWFsQ2hhbmdlIik7cmV0dXJuIGlhLnRlc3QodGhpcy5ub2RlTmFtZSl9fTtWPWMuZXZlbnQuc3BlY2lhbC5jaGFuZ2UuZmlsdGVycztWLmZvY3VzPVYuYmVmb3JlYWN0aXZhdGV9dC5hZGRFdmVudExpc3RlbmVyJiZjLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZChlKXtlPWMuZXZlbnQuZml4KGUpO2UudHlwZT1iO3JldHVybiBjLmV2ZW50LnRyaWdnZXIoZSxudWxsLGUudGFyZ2V0KX1jLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7dWFbYl0rKz09PTAmJnQuYWRkRXZlbnRMaXN0ZW5lcihhLGQsdHJ1ZSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7LS11YVtiXT09PTAmJnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGQsdHJ1ZSl9fX0pO2MuZWFjaChbImJpbmQiLCJvbmUiXSxmdW5jdGlvbihhLGIpe2MuZm5bYl09ZnVuY3Rpb24oZCxlLGYpe2lmKHR5cGVvZiBkPT09Im9iamVjdCIpe2Zvcih2YXIgaCBpbiBkKXRoaXNbYl0oaCxlLGRbaF0sZik7cmV0dXJuIHRoaXN9aWYoYy5pc0Z1bmN0aW9uKGUpfHxlPT09ZmFsc2Upe2Y9ZTtlPUJ9dmFyIGw9Yj09PSJvbmUiP2MucHJveHkoZixmdW5jdGlvbihvKXtjKHRoaXMpLnVuYmluZChvLGwpO3JldHVybiBmLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pOmY7aWYoZD09PSJ1bmxvYWQiJiZiIT09Im9uZSIpdGhpcy5vbmUoZCxlLGYpO2Vsc2V7aD0wO2Zvcih2YXIgaz10aGlzLmxlbmd0aDtoPGs7aCsrKWMuZXZlbnQuYWRkKHRoaXNbaF0sZCxsLGUpfXJldHVybiB0aGlzfX0pO2MuZm4uZXh0ZW5kKHt1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYT09PSJvYmplY3QiJiYhYS5wcmV2ZW50RGVmYXVsdClmb3IodmFyIGQgaW4gYSl0aGlzLnVuYmluZChkLGFbZF0pO2Vsc2V7ZD0wO2Zvcih2YXIgZT10aGlzLmxlbmd0aDtkPGU7ZCsrKWMuZXZlbnQucmVtb3ZlKHRoaXNbZF0sYSxiKX1yZXR1cm4gdGhpc30sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGQsZSl7cmV0dXJuIHRoaXMubGl2ZShiLGQsZSxhKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMudW5iaW5kKCJsaXZlIik6dGhpcy5kaWUoYixudWxsLGQsYSl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pe3ZhciBkPWMuRXZlbnQoYSk7ZC5wcmV2ZW50RGVmYXVsdCgpO2Quc3RvcFByb3BhZ2F0aW9uKCk7Yy5ldmVudC50cmlnZ2VyKGQsYix0aGlzWzBdKTtyZXR1cm4gZC5yZXN1bHR9fSx0b2dnbGU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPWFyZ3VtZW50cyxkPTE7ZDxiLmxlbmd0aDspYy5wcm94eShhLGJbZCsrXSk7cmV0dXJuIHRoaXMuY2xpY2soYy5wcm94eShhLGZ1bmN0aW9uKGUpe3ZhciBmPShjLmRhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZDtjLmRhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkLGYrMSk7ZS5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBiW2ZdLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8ZmFsc2V9KSl9LGhvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pO3ZhciB5YT17Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0Iixtb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In07Yy5lYWNoKFsibGl2ZSIsImRpZSJdLGZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihkLGUsZixoKXt2YXIgbCxrPTAsbyx4LHI9aHx8dGhpcy5zZWxlY3RvcjtoPWg/dGhpczpjKHRoaXMuY29udGV4dCk7aWYodHlwZW9mIGQ9PT0ib2JqZWN0IiYmIWQucHJldmVudERlZmF1bHQpe2ZvcihsIGluIGQpaFtiXShsLGUsZFtsXSxyKTtyZXR1cm4gdGhpc31pZihjLmlzRnVuY3Rpb24oZSkpe2Y9ZTtlPUJ9Zm9yKGQ9KGR8fCIiKS5zcGxpdCgiICIpOyhsPWRbaysrXSkhPW51bGw7KXtvPVguZXhlYyhsKTt4PSIiO2lmKG8pe3g9b1swXTtsPWwucmVwbGFjZShYLCIiKX1pZihsPT09ImhvdmVyIilkLnB1c2goIm1vdXNlZW50ZXIiK3gsIm1vdXNlbGVhdmUiK3gpO2Vsc2V7bz1sO2lmKGw9PT0iZm9jdXMifHxsPT09ImJsdXIiKXtkLnB1c2goeWFbbF0reCk7bCs9eH1lbHNlIGw9KHlhW2xdfHxsKSt4O2lmKGI9PT0ibGl2ZSIpe3g9MDtmb3IodmFyIEE9aC5sZW5ndGg7eDxBO3grKyljLmV2ZW50LmFkZChoW3hdLCJsaXZlLiIrWShsLHIpLHtkYXRhOmUsc2VsZWN0b3I6cixoYW5kbGVyOmYsb3JpZ1R5cGU6bCxvcmlnSGFuZGxlcjpmLHByZVR5cGU6b30pfWVsc2UgaC51bmJpbmQoImxpdmUuIitZKGwsciksZil9fXJldHVybiB0aGlzfX0pO2MuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2MuZm5bYl09ZnVuY3Rpb24oZCxlKXtpZihlPT1udWxsKXtlPWQ7ZD1udWxsfXJldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5iaW5kKGIsZCxlKTp0aGlzLnRyaWdnZXIoYil9O2lmKGMuYXR0ckZuKWMuYXR0ckZuW2JdPXRydWV9KTtFLmF0dGFjaEV2ZW50JiYhRS5hZGRFdmVudExpc3RlbmVyJiZjKEUpLmJpbmQoInVubG9hZCIsZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gYy5jYWNoZSlpZihjLmNhY2hlW2FdLmhhbmRsZSl0cnl7Yy5ldmVudC5yZW1vdmUoYy5jYWNoZVthXS5oYW5kbGUuZWxlbSl9Y2F0Y2goYil7fX0pOyhmdW5jdGlvbigpe2Z1bmN0aW9uIGEoZyxpLG4sbSxwLHEpe3A9MDtmb3IodmFyIHU9bS5sZW5ndGg7cDx1O3ArKyl7dmFyIHk9bVtwXTtpZih5KXt2YXIgRj1mYWxzZTtmb3IoeT15W2ddO3k7KXtpZih5LnNpemNhY2hlPT09bil7Rj1tW3kuc2l6c2V0XTticmVha31pZih5Lm5vZGVUeXBlPT09MSYmIXEpe3kuc2l6Y2FjaGU9bjt5LnNpenNldD1wfWlmKHkubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWkpe0Y9eTticmVha315PXlbZ119bVtwXT1GfX19ZnVuY3Rpb24gYihnLGksbixtLHAscSl7cD0wO2Zvcih2YXIgdT1tLmxlbmd0aDtwPHU7cCsrKXt2YXIgeT1tW3BdO2lmKHkpe3ZhciBGPWZhbHNlO2Zvcih5PXlbZ107eTspe2lmKHkuc2l6Y2FjaGU9PT1uKXtGPW1beS5zaXpzZXRdO2JyZWFrfWlmKHkubm9kZVR5cGU9PT0xKXtpZighcSl7eS5zaXpjYWNoZT1uO3kuc2l6c2V0PXB9aWYodHlwZW9mIGkhPT0ic3RyaW5nIil7aWYoeT09PWkpe0Y9dHJ1ZTticmVha319ZWxzZSBpZihrLmZpbHRlcihpLFt5XSkubGVuZ3RoPjApe0Y9eTticmVha319eT15W2ddfW1bcF09Rn19fXZhciBkPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csZT0wLGY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoPWZhbHNlLGw9dHJ1ZTtbMCwwXS5zb3J0KGZ1bmN0aW9uKCl7bD1mYWxzZTtyZXR1cm4gMH0pO3ZhciBrPWZ1bmN0aW9uKGcsaSxuLG0pe249bnx8W107dmFyIHA9aT1pfHx0O2lmKGkubm9kZVR5cGUhPT0xJiZpLm5vZGVUeXBlIT09OSlyZXR1cm5bXTtpZighZ3x8dHlwZW9mIGchPT0ic3RyaW5nIilyZXR1cm4gbjt2YXIgcSx1LHksRixNLE49dHJ1ZSxPPWsuaXNYTUwoaSksRD1bXSxSPWc7ZG97ZC5leGVjKCIiKTtpZihxPWQuZXhlYyhSKSl7Uj1xWzNdO0QucHVzaChxWzFdKTtpZihxWzJdKXtGPXFbM107YnJlYWt9fX13aGlsZShxKTtpZihELmxlbmd0aD4xJiZ4LmV4ZWMoZykpaWYoRC5sZW5ndGg9PT0yJiZvLnJlbGF0aXZlW0RbMF1dKXU9TChEWzBdK0RbMV0saSk7ZWxzZSBmb3IodT1vLnJlbGF0aXZlW0RbMF1dP1tpXTprKEQuc2hpZnQoKSxpKTtELmxlbmd0aDspe2c9RC5zaGlmdCgpO2lmKG8ucmVsYXRpdmVbZ10pZys9RC5zaGlmdCgpO3U9TChnLHUpfWVsc2V7aWYoIW0mJkQubGVuZ3RoPjEmJmkubm9kZVR5cGU9PT05JiYhTyYmby5tYXRjaC5JRC50ZXN0KERbMF0pJiYhby5tYXRjaC5JRC50ZXN0KERbRC5sZW5ndGgtMV0pKXtxPWsuZmluZChELnNoaWZ0KCksaSxPKTtpPXEuZXhwcj9rLmZpbHRlcihxLmV4cHIscS5zZXQpWzBdOnEuc2V0WzBdfWlmKGkpe3E9bT97ZXhwcjpELnBvcCgpLHNldDpDKG0pfTprLmZpbmQoRC5wb3AoKSxELmxlbmd0aD09PTEmJihEWzBdPT09In4ifHxEWzBdPT09IisiKSYmaS5wYXJlbnROb2RlP2kucGFyZW50Tm9kZTppLE8pO3U9cS5leHByP2suZmlsdGVyKHEuZXhwcixxLnNldCk6cS5zZXQ7aWYoRC5sZW5ndGg+MCl5PUModSk7ZWxzZSBOPWZhbHNlO2Zvcig7RC5sZW5ndGg7KXtxPU09RC5wb3AoKTtpZihvLnJlbGF0aXZlW01dKXE9RC5wb3AoKTtlbHNlIE09IiI7aWYocT09bnVsbClxPWk7by5yZWxhdGl2ZVtNXSh5LHEsTyl9fWVsc2UgeT1bXX15fHwoeT11KTt5fHxrLmVycm9yKE18fGcpO2lmKGYuY2FsbCh5KT09PSJbb2JqZWN0IEFycmF5XSIpaWYoTilpZihpJiZpLm5vZGVUeXBlPT09MSlmb3IoZz0wO3lbZ10hPW51bGw7ZysrKXtpZih5W2ddJiYoeVtnXT09PXRydWV8fHlbZ10ubm9kZVR5cGU9PT0xJiZrLmNvbnRhaW5zKGkseVtnXSkpKW4ucHVzaCh1W2ddKX1lbHNlIGZvcihnPTA7eVtnXSE9bnVsbDtnKyspeVtnXSYmeVtnXS5ub2RlVHlwZT09PTEmJm4ucHVzaCh1W2ddKTtlbHNlIG4ucHVzaC5hcHBseShuLHkpO2Vsc2UgQyh5LG4pO2lmKEYpe2soRixwLG4sbSk7ay51bmlxdWVTb3J0KG4pfXJldHVybiBufTtrLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZyl7aWYodyl7aD1sO2cuc29ydCh3KTtpZihoKWZvcih2YXIgaT0xO2k8Zy5sZW5ndGg7aSsrKWdbaV09PT1nW2ktMV0mJmcuc3BsaWNlKGktLSwxKX1yZXR1cm4gZ307ay5tYXRjaGVzPWZ1bmN0aW9uKGcsaSl7cmV0dXJuIGsoZyxudWxsLG51bGwsaSl9O2subWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGcsaSl7cmV0dXJuIGsoaSxudWxsLG51bGwsW2ddKS5sZW5ndGg+MH07ay5maW5kPWZ1bmN0aW9uKGcsaSxuKXt2YXIgbTtpZighZylyZXR1cm5bXTtmb3IodmFyIHA9MCxxPW8ub3JkZXIubGVuZ3RoO3A8cTtwKyspe3ZhciB1LHk9by5vcmRlcltwXTtpZih1PW8ubGVmdE1hdGNoW3ldLmV4ZWMoZykpe3ZhciBGPXVbMV07dS5zcGxpY2UoMSwxKTtpZihGLnN1YnN0cihGLmxlbmd0aC0xKSE9PSJcXCIpe3VbMV09KHVbMV18fCIiKS5yZXBsYWNlKC9cXC9nLCIiKTttPW8uZmluZFt5XSh1LGksbik7aWYobSE9bnVsbCl7Zz1nLnJlcGxhY2Uoby5tYXRjaFt5XSwiIik7YnJlYWt9fX19bXx8KG09aS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTtyZXR1cm57c2V0Om0sZXhwcjpnfX07ay5maWx0ZXI9ZnVuY3Rpb24oZyxpLG4sbSl7Zm9yKHZhciBwLHEsdT1nLHk9W10sRj1pLE09aSYmaVswXSYmay5pc1hNTChpWzBdKTtnJiZpLmxlbmd0aDspe2Zvcih2YXIgTiBpbiBvLmZpbHRlcilpZigocD1vLmxlZnRNYXRjaFtOXS5leGVjKGcpKSE9bnVsbCYmcFsyXSl7dmFyIE8sRCxSPW8uZmlsdGVyW05dO0Q9cFsxXTtxPWZhbHNlO3Auc3BsaWNlKDEsMSk7aWYoRC5zdWJzdHIoRC5sZW5ndGgtMSkhPT0iXFwiKXtpZihGPT09eSl5PVtdO2lmKG8ucHJlRmlsdGVyW05dKWlmKHA9by5wcmVGaWx0ZXJbTl0ocCxGLG4seSxtLE0pKXtpZihwPT09dHJ1ZSljb250aW51ZX1lbHNlIHE9Tz10cnVlO2lmKHApZm9yKHZhciBqPTA7KEQ9RltqXSkhPW51bGw7aisrKWlmKEQpe089UihELHAsaixGKTt2YXIgcz1tXiEhTztpZihuJiZPIT1udWxsKWlmKHMpcT10cnVlO2Vsc2UgRltqXT1mYWxzZTtlbHNlIGlmKHMpe3kucHVzaChEKTtxPXRydWV9fWlmKE8hPT1CKXtufHwoRj15KTtnPWcucmVwbGFjZShvLm1hdGNoW05dLCIiKTtpZighcSlyZXR1cm5bXTticmVha319fWlmKGc9PT11KWlmKHE9PW51bGwpay5lcnJvcihnKTtlbHNlIGJyZWFrO3U9Z31yZXR1cm4gRn07ay5lcnJvcj1mdW5jdGlvbihnKXt0aHJvdyJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2c7fTt2YXIgbz1rLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5BTUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLENMQVNTOi9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sTkFNRTovXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspWyciXSpcXS8sQVRUUjovXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooWyciXSopKC4qPylcM3wpXHMqXF0vLFRBRzovXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpcLV18XFwuKSspLyxDSElMRDovOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoKGV2ZW58b2RkfFtcZG4rXC1dKilcKSk/LyxQT1M6LzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXlwtXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vfSxsZWZ0TWF0Y2g6e30sYXR0ck1hcDp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGF0dHJIYW5kbGU6e2hyZWY6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuZ2V0QXR0cmlidXRlKCJocmVmIil9fSxyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKGcsaSl7dmFyIG49dHlwZW9mIGk9PT0ic3RyaW5nIixtPW4mJiEvXFcvLnRlc3QoaSk7bj1uJiYhbTtpZihtKWk9aS50b0xvd2VyQ2FzZSgpO209MDtmb3IodmFyIHA9Zy5sZW5ndGgscTttPHA7bSsrKWlmKHE9Z1ttXSl7Zm9yKDsocT1xLnByZXZpb3VzU2libGluZykmJnEubm9kZVR5cGUhPT0xOyk7Z1ttXT1ufHxxJiZxLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1pP3F8fGZhbHNlOnE9PT1pfW4mJmsuZmlsdGVyKGksZyx0cnVlKX0sIj4iOmZ1bmN0aW9uKGcsaSl7dmFyIG4sbT10eXBlb2YgaT09PSJzdHJpbmciLHA9MCxxPWcubGVuZ3RoO2lmKG0mJiEvXFcvLnRlc3QoaSkpZm9yKGk9aS50b0xvd2VyQ2FzZSgpO3A8cTtwKyspe2lmKG49Z1twXSl7bj1uLnBhcmVudE5vZGU7Z1twXT1uLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1pP246ZmFsc2V9fWVsc2V7Zm9yKDtwPHE7cCsrKWlmKG49Z1twXSlnW3BdPW0/bi5wYXJlbnROb2RlOm4ucGFyZW50Tm9kZT09PWk7bSYmay5maWx0ZXIoaSxnLHRydWUpfX0sIiI6ZnVuY3Rpb24oZyxpLG4pe3ZhciBtLHA9ZSsrLHE9YjtpZih0eXBlb2YgaT09PSJzdHJpbmciJiYhL1xXLy50ZXN0KGkpKXttPWk9aS50b0xvd2VyQ2FzZSgpO3E9YX1xKCJwYXJlbnROb2RlIixpLHAsZyxtLG4pfSwifiI6ZnVuY3Rpb24oZyxpLG4pe3ZhciBtLHA9ZSsrLHE9YjtpZih0eXBlb2YgaT09PSJzdHJpbmciJiYhL1xXLy50ZXN0KGkpKXttPWk9aS50b0xvd2VyQ2FzZSgpO3E9YX1xKCJwcmV2aW91c1NpYmxpbmciLGkscCxnLG0sbil9fSxmaW5kOntJRDpmdW5jdGlvbihnLGksbil7aWYodHlwZW9mIGkuZ2V0RWxlbWVudEJ5SWQhPT0idW5kZWZpbmVkIiYmIW4pcmV0dXJuKGc9aS5nZXRFbGVtZW50QnlJZChnWzFdKSkmJmcucGFyZW50Tm9kZT9bZ106W119LE5BTUU6ZnVuY3Rpb24oZyxpKXtpZih0eXBlb2YgaS5nZXRFbGVtZW50c0J5TmFtZSE9PSJ1bmRlZmluZWQiKXtmb3IodmFyIG49W10sbT1pLmdldEVsZW1lbnRzQnlOYW1lKGdbMV0pLHA9MCxxPW0ubGVuZ3RoO3A8cTtwKyspbVtwXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKT09PWdbMV0mJm4ucHVzaChtW3BdKTtyZXR1cm4gbi5sZW5ndGg9PT0wP251bGw6bn19LFRBRzpmdW5jdGlvbihnLGkpe3JldHVybiBpLmdldEVsZW1lbnRzQnlUYWdOYW1lKGdbMV0pfX0scHJlRmlsdGVyOntDTEFTUzpmdW5jdGlvbihnLGksbixtLHAscSl7Zz0iICIrZ1sxXS5yZXBsYWNlKC9cXC9nLCIiKSsiICI7aWYocSlyZXR1cm4gZztxPTA7Zm9yKHZhciB1Oyh1PWlbcV0pIT1udWxsO3ErKylpZih1KWlmKHBeKHUuY2xhc3NOYW1lJiYoIiAiK3UuY2xhc3NOYW1lKyIgIikucmVwbGFjZSgvW1x0XG5dL2csIiAiKS5pbmRleE9mKGcpPj0wKSlufHxtLnB1c2godSk7ZWxzZSBpZihuKWlbcV09ZmFsc2U7cmV0dXJuIGZhbHNlfSxJRDpmdW5jdGlvbihnKXtyZXR1cm4gZ1sxXS5yZXBsYWNlKC9cXC9nLCIiKX0sVEFHOmZ1bmN0aW9uKGcpe3JldHVybiBnWzFdLnRvTG93ZXJDYXNlKCl9LENISUxEOmZ1bmN0aW9uKGcpe2lmKGdbMV09PT0ibnRoIil7dmFyIGk9LygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYyhnWzJdPT09ImV2ZW4iJiYiMm4ifHxnWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChnWzJdKSYmIjBuKyIrZ1syXXx8Z1syXSk7Z1syXT1pWzFdKyhpWzJdfHwxKS0wO2dbM109aVszXS0wfWdbMF09ZSsrO3JldHVybiBnfSxBVFRSOmZ1bmN0aW9uKGcsaSxuLG0scCxxKXtpPWdbMV0ucmVwbGFjZSgvXFwvZywiIik7aWYoIXEmJm8uYXR0ck1hcFtpXSlnWzFdPW8uYXR0ck1hcFtpXTtpZihnWzJdPT09In49IilnWzRdPSIgIitnWzRdKyIgIjtyZXR1cm4gZ30sUFNFVURPOmZ1bmN0aW9uKGcsaSxuLG0scCl7aWYoZ1sxXT09PSJub3QiKWlmKChkLmV4ZWMoZ1szXSl8fCIiKS5sZW5ndGg+MXx8L15cdy8udGVzdChnWzNdKSlnWzNdPWsoZ1szXSxudWxsLG51bGwsaSk7ZWxzZXtnPWsuZmlsdGVyKGdbM10saSxuLHRydWVecCk7bnx8bS5wdXNoLmFwcGx5KG0sZyk7cmV0dXJuIGZhbHNlfWVsc2UgaWYoby5tYXRjaC5QT1MudGVzdChnWzBdKXx8by5tYXRjaC5DSElMRC50ZXN0KGdbMF0pKXJldHVybiB0cnVlO3JldHVybiBnfSxQT1M6ZnVuY3Rpb24oZyl7Zy51bnNoaWZ0KHRydWUpO3JldHVybiBnfX0sZmlsdGVyczp7ZW5hYmxlZDpmdW5jdGlvbihnKXtyZXR1cm4gZy5kaXNhYmxlZD09PWZhbHNlJiZnLnR5cGUhPT0iaGlkZGVuIn0sZGlzYWJsZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuZGlzYWJsZWQ9PT10cnVlfSxjaGVja2VkOmZ1bmN0aW9uKGcpe3JldHVybiBnLmNoZWNrZWQ9PT10cnVlfSxzZWxlY3RlZDpmdW5jdGlvbihnKXtyZXR1cm4gZy5zZWxlY3RlZD09PXRydWV9LHBhcmVudDpmdW5jdGlvbihnKXtyZXR1cm4hIWcuZmlyc3RDaGlsZH0sZW1wdHk6ZnVuY3Rpb24oZyl7cmV0dXJuIWcuZmlyc3RDaGlsZH0saGFzOmZ1bmN0aW9uKGcsaSxuKXtyZXR1cm4hIWsoblszXSxnKS5sZW5ndGh9LGhlYWRlcjpmdW5jdGlvbihnKXtyZXR1cm4vaFxkL2kudGVzdChnLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihnKXtyZXR1cm4idGV4dCI9PT1nLnR5cGV9LHJhZGlvOmZ1bmN0aW9uKGcpe3JldHVybiJyYWRpbyI9PT1nLnR5cGV9LGNoZWNrYm94OmZ1bmN0aW9uKGcpe3JldHVybiJjaGVja2JveCI9PT1nLnR5cGV9LGZpbGU6ZnVuY3Rpb24oZyl7cmV0dXJuImZpbGUiPT09Zy50eXBlfSxwYXNzd29yZDpmdW5jdGlvbihnKXtyZXR1cm4icGFzc3dvcmQiPT09Zy50eXBlfSxzdWJtaXQ6ZnVuY3Rpb24oZyl7cmV0dXJuInN1Ym1pdCI9PT1nLnR5cGV9LGltYWdlOmZ1bmN0aW9uKGcpe3JldHVybiJpbWFnZSI9PT1nLnR5cGV9LHJlc2V0OmZ1bmN0aW9uKGcpe3JldHVybiJyZXNldCI9PT1nLnR5cGV9LGJ1dHRvbjpmdW5jdGlvbihnKXtyZXR1cm4iYnV0dG9uIj09PWcudHlwZXx8Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGcpe3JldHVybi9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChnLm5vZGVOYW1lKX19LHNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGcsaSl7cmV0dXJuIGk9PT0wfSxsYXN0OmZ1bmN0aW9uKGcsaSxuLG0pe3JldHVybiBpPT09bS5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihnLGkpe3JldHVybiBpJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oZyxpKXtyZXR1cm4gaSUyPT09MX0sbHQ6ZnVuY3Rpb24oZyxpLG4pe3JldHVybiBpPG5bM10tMH0sZ3Q6ZnVuY3Rpb24oZyxpLG4pe3JldHVybiBpPm5bM10tMH0sbnRoOmZ1bmN0aW9uKGcsaSxuKXtyZXR1cm4gblszXS0KMD09PWl9LGVxOmZ1bmN0aW9uKGcsaSxuKXtyZXR1cm4gblszXS0wPT09aX19LGZpbHRlcjp7UFNFVURPOmZ1bmN0aW9uKGcsaSxuLG0pe3ZhciBwPWlbMV0scT1vLmZpbHRlcnNbcF07aWYocSlyZXR1cm4gcShnLG4saSxtKTtlbHNlIGlmKHA9PT0iY29udGFpbnMiKXJldHVybihnLnRleHRDb250ZW50fHxnLmlubmVyVGV4dHx8ay5nZXRUZXh0KFtnXSl8fCIiKS5pbmRleE9mKGlbM10pPj0wO2Vsc2UgaWYocD09PSJub3QiKXtpPWlbM107bj0wO2ZvcihtPWkubGVuZ3RoO248bTtuKyspaWYoaVtuXT09PWcpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfWVsc2Ugay5lcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitwKX0sQ0hJTEQ6ZnVuY3Rpb24oZyxpKXt2YXIgbj1pWzFdLG09Zztzd2l0Y2gobil7Y2FzZSJvbmx5IjpjYXNlImZpcnN0Ijpmb3IoO209bS5wcmV2aW91c1NpYmxpbmc7KWlmKG0ubm9kZVR5cGU9PT0xKXJldHVybiBmYWxzZTtpZihuPT09ImZpcnN0IilyZXR1cm4gdHJ1ZTttPWc7Y2FzZSJsYXN0Ijpmb3IoO209bS5uZXh0U2libGluZzspaWYobS5ub2RlVHlwZT09PTEpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlO2Nhc2UibnRoIjpuPWlbMl07dmFyIHA9aVszXTtpZihuPT09MSYmcD09PTApcmV0dXJuIHRydWU7dmFyIHE9aVswXSx1PWcucGFyZW50Tm9kZTtpZih1JiYodS5zaXpjYWNoZSE9PXF8fCFnLm5vZGVJbmRleCkpe3ZhciB5PTA7Zm9yKG09dS5maXJzdENoaWxkO207bT1tLm5leHRTaWJsaW5nKWlmKG0ubm9kZVR5cGU9PT0xKW0ubm9kZUluZGV4PSsreTt1LnNpemNhY2hlPXF9bT1nLm5vZGVJbmRleC1wO3JldHVybiBuPT09MD9tPT09MDptJW49PT0wJiZtL24+PTB9fSxJRDpmdW5jdGlvbihnLGkpe3JldHVybiBnLm5vZGVUeXBlPT09MSYmZy5nZXRBdHRyaWJ1dGUoImlkIik9PT1pfSxUQUc6ZnVuY3Rpb24oZyxpKXtyZXR1cm4gaT09PSIqIiYmZy5ub2RlVHlwZT09PTF8fGcubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWl9LENMQVNTOmZ1bmN0aW9uKGcsaSl7cmV0dXJuKCIgIisoZy5jbGFzc05hbWV8fGcuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoaSk+LTF9LEFUVFI6ZnVuY3Rpb24oZyxpKXt2YXIgbj1pWzFdO249by5hdHRySGFuZGxlW25dP28uYXR0ckhhbmRsZVtuXShnKTpnW25dIT1udWxsP2dbbl06Zy5nZXRBdHRyaWJ1dGUobik7dmFyIG09bisiIixwPWlbMl0scT1pWzRdO3JldHVybiBuPT1udWxsP3A9PT0iIT0iOnA9PT0iPSI/bT09PXE6cD09PSIqPSI/bS5pbmRleE9mKHEpPj0wOnA9PT0ifj0iPygiICIrbSsiICIpLmluZGV4T2YocSk+PTA6IXE/bSYmbiE9PWZhbHNlOnA9PT0iIT0iP20hPT1xOnA9PT0iXj0iP20uaW5kZXhPZihxKT09PTA6cD09PSIkPSI/bS5zdWJzdHIobS5sZW5ndGgtcS5sZW5ndGgpPT09cTpwPT09Inw9Ij9tPT09cXx8bS5zdWJzdHIoMCxxLmxlbmd0aCsxKT09PXErIi0iOmZhbHNlfSxQT1M6ZnVuY3Rpb24oZyxpLG4sbSl7dmFyIHA9by5zZXRGaWx0ZXJzW2lbMl1dO2lmKHApcmV0dXJuIHAoZyxuLGksbSl9fX0seD1vLm1hdGNoLlBPUyxyPWZ1bmN0aW9uKGcsaSl7cmV0dXJuIlxcIisoaS0wKzEpfSxBO2ZvcihBIGluIG8ubWF0Y2gpe28ubWF0Y2hbQV09UmVnRXhwKG8ubWF0Y2hbQV0uc291cmNlKy8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSk7by5sZWZ0TWF0Y2hbQV09UmVnRXhwKC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2Urby5tYXRjaFtBXS5zb3VyY2UucmVwbGFjZSgvXFwoXGQrKS9nLHIpKX12YXIgQz1mdW5jdGlvbihnLGkpe2c9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZywwKTtpZihpKXtpLnB1c2guYXBwbHkoaSxnKTtyZXR1cm4gaX1yZXR1cm4gZ307dHJ5e0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsMCl9Y2F0Y2goSil7Qz1mdW5jdGlvbihnLGkpe3ZhciBuPTAsbT1pfHxbXTtpZihmLmNhbGwoZyk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KG0sZyk7ZWxzZSBpZih0eXBlb2YgZy5sZW5ndGg9PT0ibnVtYmVyIilmb3IodmFyIHA9Zy5sZW5ndGg7bjxwO24rKyltLnB1c2goZ1tuXSk7ZWxzZSBmb3IoO2dbbl07bisrKW0ucHVzaChnW25dKTtyZXR1cm4gbX19dmFyIHcsSTtpZih0LmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbil3PWZ1bmN0aW9uKGcsaSl7aWYoZz09PWkpe2g9dHJ1ZTtyZXR1cm4gMH1pZighZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IWkuY29tcGFyZURvY3VtZW50UG9zaXRpb24pcmV0dXJuIGcuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MTtyZXR1cm4gZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpKSY0Py0xOjF9O2Vsc2V7dz1mdW5jdGlvbihnLGkpe3ZhciBuLG0scD1bXSxxPVtdO249Zy5wYXJlbnROb2RlO209aS5wYXJlbnROb2RlO3ZhciB1PW47aWYoZz09PWkpe2g9dHJ1ZTtyZXR1cm4gMH1lbHNlIGlmKG49PT1tKXJldHVybiBJKGcsaSk7ZWxzZSBpZihuKXtpZighbSlyZXR1cm4gMX1lbHNlIHJldHVybi0xO2Zvcig7dTspe3AudW5zaGlmdCh1KTt1PXUucGFyZW50Tm9kZX1mb3IodT1tO3U7KXtxLnVuc2hpZnQodSk7dT11LnBhcmVudE5vZGV9bj1wLmxlbmd0aDttPXEubGVuZ3RoO2Zvcih1PTA7dTxuJiZ1PG07dSsrKWlmKHBbdV0hPT1xW3VdKXJldHVybiBJKHBbdV0scVt1XSk7cmV0dXJuIHU9PT1uP0koZyxxW3VdLC0xKTpJKHBbdV0saSwxKX07ST1mdW5jdGlvbihnLGksbil7aWYoZz09PWkpcmV0dXJuIG47Zm9yKGc9Zy5uZXh0U2libGluZztnOyl7aWYoZz09PWkpcmV0dXJuLTE7Zz1nLm5leHRTaWJsaW5nfXJldHVybiAxfX1rLmdldFRleHQ9ZnVuY3Rpb24oZyl7Zm9yKHZhciBpPSIiLG4sbT0wO2dbbV07bSsrKXtuPWdbbV07aWYobi5ub2RlVHlwZT09PTN8fG4ubm9kZVR5cGU9PT00KWkrPW4ubm9kZVZhbHVlO2Vsc2UgaWYobi5ub2RlVHlwZSE9PTgpaSs9ay5nZXRUZXh0KG4uY2hpbGROb2Rlcyl9cmV0dXJuIGl9OyhmdW5jdGlvbigpe3ZhciBnPXQuY3JlYXRlRWxlbWVudCgiZGl2IiksaT0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKSxuPXQuZG9jdW1lbnRFbGVtZW50O2cuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2krIicvPiI7bi5pbnNlcnRCZWZvcmUoZyxuLmZpcnN0Q2hpbGQpO2lmKHQuZ2V0RWxlbWVudEJ5SWQoaSkpe28uZmluZC5JRD1mdW5jdGlvbihtLHAscSl7aWYodHlwZW9mIHAuZ2V0RWxlbWVudEJ5SWQhPT0idW5kZWZpbmVkIiYmIXEpcmV0dXJuKHA9cC5nZXRFbGVtZW50QnlJZChtWzFdKSk/cC5pZD09PW1bMV18fHR5cGVvZiBwLmdldEF0dHJpYnV0ZU5vZGUhPT0idW5kZWZpbmVkIiYmcC5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZT09PW1bMV0/W3BdOkI6W119O28uZmlsdGVyLklEPWZ1bmN0aW9uKG0scCl7dmFyIHE9dHlwZW9mIG0uZ2V0QXR0cmlidXRlTm9kZSE9PSJ1bmRlZmluZWQiJiZtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIG0ubm9kZVR5cGU9PT0xJiZxJiZxLm5vZGVWYWx1ZT09PXB9fW4ucmVtb3ZlQ2hpbGQoZyk7bj1nPW51bGx9KSgpOyhmdW5jdGlvbigpe3ZhciBnPXQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5hcHBlbmRDaGlsZCh0LmNyZWF0ZUNvbW1lbnQoIiIpKTtpZihnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoPjApby5maW5kLlRBRz1mdW5jdGlvbihpLG4pe3ZhciBtPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoaVsxXSk7aWYoaVsxXT09PSIqIil7Zm9yKHZhciBwPVtdLHE9MDttW3FdO3ErKyltW3FdLm5vZGVUeXBlPT09MSYmcC5wdXNoKG1bcV0pO209cH1yZXR1cm4gbX07Zy5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iO2lmKGcuZmlyc3RDaGlsZCYmdHlwZW9mIGcuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPT0idW5kZWZpbmVkIiYmZy5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpIT09IiMiKW8uYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGkpe3JldHVybiBpLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9O2c9bnVsbH0pKCk7dC5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBnPWssaT10LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2kuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIShpLnF1ZXJ5U2VsZWN0b3JBbGwmJmkucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGg9PT0wKSl7az1mdW5jdGlvbihtLHAscSx1KXtwPXB8fHQ7bT1tLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csIj0nJDEnXSIpO2lmKCF1JiYhay5pc1hNTChwKSlpZihwLm5vZGVUeXBlPT09OSl0cnl7cmV0dXJuIEMocC5xdWVyeVNlbGVjdG9yQWxsKG0pLHEpfWNhdGNoKHkpe31lbHNlIGlmKHAubm9kZVR5cGU9PT0xJiZwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0ib2JqZWN0Iil7dmFyIEY9cC5nZXRBdHRyaWJ1dGUoImlkIiksTT1GfHwiX19zaXp6bGVfXyI7Rnx8cC5zZXRBdHRyaWJ1dGUoImlkIixNKTt0cnl7cmV0dXJuIEMocC5xdWVyeVNlbGVjdG9yQWxsKCIjIitNKyIgIittKSxxKX1jYXRjaChOKXt9ZmluYWxseXtGfHxwLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19cmV0dXJuIGcobSxwLHEsdSl9O2Zvcih2YXIgbiBpbiBnKWtbbl09Z1tuXTtpPW51bGx9fSgpOyhmdW5jdGlvbigpe3ZhciBnPXQuZG9jdW1lbnRFbGVtZW50LGk9Zy5tYXRjaGVzU2VsZWN0b3J8fGcubW96TWF0Y2hlc1NlbGVjdG9yfHxnLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8Zy5tc01hdGNoZXNTZWxlY3RvcixuPWZhbHNlO3RyeXtpLmNhbGwodC5kb2N1bWVudEVsZW1lbnQsIlt0ZXN0IT0nJ106c2l6emxlIil9Y2F0Y2gobSl7bj10cnVlfWlmKGkpay5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24ocCxxKXtxPXEucmVwbGFjZSgvXD1ccyooW14nIlxdXSopXHMqXF0vZywiPSckMSddIik7aWYoIWsuaXNYTUwocCkpdHJ5e2lmKG58fCFvLm1hdGNoLlBTRVVETy50ZXN0KHEpJiYhLyE9Ly50ZXN0KHEpKXJldHVybiBpLmNhbGwocCxxKX1jYXRjaCh1KXt9cmV0dXJuIGsocSxudWxsLG51bGwsW3BdKS5sZW5ndGg+MH19KSgpOyhmdW5jdGlvbigpe3ZhciBnPXQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjtpZighKCFnLmdldEVsZW1lbnRzQnlDbGFzc05hbWV8fGcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTApKXtnLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiO2lmKGcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCE9PTEpe28ub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1MiKTtvLmZpbmQuQ0xBU1M9ZnVuY3Rpb24oaSxuLG0pe2lmKHR5cGVvZiBuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPT0idW5kZWZpbmVkIiYmIW0pcmV0dXJuIG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShpWzFdKX07Zz1udWxsfX19KSgpO2suY29udGFpbnM9dC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnM/ZnVuY3Rpb24oZyxpKXtyZXR1cm4gZyE9PWkmJihnLmNvbnRhaW5zP2cuY29udGFpbnMoaSk6dHJ1ZSl9OnQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGcsaSl7cmV0dXJuISEoZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpKSYxNil9OmZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlfTtrLmlzWE1MPWZ1bmN0aW9uKGcpe3JldHVybihnPShnP2cub3duZXJEb2N1bWVudHx8ZzowKS5kb2N1bWVudEVsZW1lbnQpP2cubm9kZU5hbWUhPT0iSFRNTCI6ZmFsc2V9O3ZhciBMPWZ1bmN0aW9uKGcsaSl7Zm9yKHZhciBuLG09W10scD0iIixxPWkubm9kZVR5cGU/W2ldOmk7bj1vLm1hdGNoLlBTRVVETy5leGVjKGcpOyl7cCs9blswXTtnPWcucmVwbGFjZShvLm1hdGNoLlBTRVVETywiIil9Zz1vLnJlbGF0aXZlW2ddP2crIioiOmc7bj0wO2Zvcih2YXIgdT1xLmxlbmd0aDtuPHU7bisrKWsoZyxxW25dLG0pO3JldHVybiBrLmZpbHRlcihwLG0pfTtjLmZpbmQ9aztjLmV4cHI9ay5zZWxlY3RvcnM7Yy5leHByWyI6Il09Yy5leHByLmZpbHRlcnM7Yy51bmlxdWU9ay51bmlxdWVTb3J0O2MudGV4dD1rLmdldFRleHQ7Yy5pc1hNTERvYz1rLmlzWE1MO2MuY29udGFpbnM9ay5jb250YWluc30pKCk7dmFyIFphPS9VbnRpbCQvLCRhPS9eKD86cGFyZW50c3xwcmV2VW50aWx8cHJldkFsbCkvLGFiPS8sLyxOYT0vXi5bXjojXFtcLixdKiQvLGJiPUFycmF5LnByb3RvdHlwZS5zbGljZSxjYj1jLmV4cHIubWF0Y2guUE9TO2MuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZD0wLGU9MCxmPXRoaXMubGVuZ3RoO2U8ZjtlKyspe2Q9Yi5sZW5ndGg7Yy5maW5kKGEsdGhpc1tlXSxiKTtpZihlPjApZm9yKHZhciBoPWQ7aDxiLmxlbmd0aDtoKyspZm9yKHZhciBsPTA7bDxkO2wrKylpZihiW2xdPT09YltoXSl7Yi5zcGxpY2UoaC0tLDEpO2JyZWFrfX1yZXR1cm4gYn0saGFzOmZ1bmN0aW9uKGEpe3ZhciBiPWMoYSk7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtkPGU7ZCsrKWlmKGMuY29udGFpbnModGhpcyxiW2RdKSlyZXR1cm4gdHJ1ZX0pfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG1hKHRoaXMsYSxmYWxzZSksIm5vdCIsYSl9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobWEodGhpcyxhLHRydWUpLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJmMuZmlsdGVyKGEsdGhpcykubGVuZ3RoPjB9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXt2YXIgZD1bXSxlLGYsaD10aGlzWzBdO2lmKGMuaXNBcnJheShhKSl7dmFyIGwsaz17fSxvPTE7aWYoaCYmYS5sZW5ndGgpe2U9MDtmb3IoZj1hLmxlbmd0aDtlPGY7ZSsrKXtsPWFbZV07a1tsXXx8KGtbbF09Yy5leHByLm1hdGNoLlBPUy50ZXN0KGwpP2MobCxifHx0aGlzLmNvbnRleHQpOmwpfWZvcig7aCYmaC5vd25lckRvY3VtZW50JiZoIT09Yjspe2ZvcihsIGluIGspe2U9a1tsXTtpZihlLmpxdWVyeT9lLmluZGV4KGgpPi0xOmMoaCkuaXMoZSkpZC5wdXNoKHtzZWxlY3RvcjpsLGVsZW06aCxsZXZlbDpvfSl9aD1oLnBhcmVudE5vZGU7bysrfX1yZXR1cm4gZH1sPWNiLnRlc3QoYSk/YyhhLGJ8fHRoaXMuY29udGV4dCk6bnVsbDtlPTA7Zm9yKGY9dGhpcy5sZW5ndGg7ZTxmO2UrKylmb3IoaD10aGlzW2VdO2g7KWlmKGw/bC5pbmRleChoKT4tMTpjLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGgsYSkpe2QucHVzaChoKTticmVha31lbHNle2g9aC5wYXJlbnROb2RlO2lmKCFofHwhaC5vd25lckRvY3VtZW50fHxoPT09YilicmVha31kPWQubGVuZ3RoPjE/Yy51bmlxdWUoZCk6ZDtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZCwiY2xvc2VzdCIsYSl9LGluZGV4OmZ1bmN0aW9uKGEpe2lmKCFhfHx0eXBlb2YgYT09PSJzdHJpbmciKXJldHVybiBjLmluQXJyYXkodGhpc1swXSxhP2MoYSk6dGhpcy5wYXJlbnQoKS5jaGlsZHJlbigpKTtyZXR1cm4gYy5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKX0sYWRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ9dHlwZW9mIGE9PT0ic3RyaW5nIj9jKGEsYnx8dGhpcy5jb250ZXh0KTpjLm1ha2VBcnJheShhKSxlPWMubWVyZ2UodGhpcy5nZXQoKSxkKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soIWRbMF18fCFkWzBdLnBhcmVudE5vZGV8fGRbMF0ucGFyZW50Tm9kZS5ub2RlVHlwZT09PTExfHwhZVswXXx8IWVbMF0ucGFyZW50Tm9kZXx8ZVswXS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTE/ZTpjLnVuaXF1ZShlKSl9LGFuZFNlbGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGQodGhpcy5wcmV2T2JqZWN0KX19KTtjLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4oYT1hLnBhcmVudE5vZGUpJiZhLm5vZGVUeXBlIT09MTE/YTpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBjLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGMuZGlyKGEsInBhcmVudE5vZGUiLGQpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBjLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGMubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmRpcihhLCJuZXh0U2libGluZyIsZCl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGMuZGlyKGEsInByZXZpb3VzU2libGluZyIsZCl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBjLnNpYmxpbmcoYS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBjLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGMubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpjLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtjLmZuW2FdPWZ1bmN0aW9uKGQsZSl7dmFyIGY9Yy5tYXAodGhpcyxiLGQpO1phLnRlc3QoYSl8fChlPWQpO2lmKGUmJnR5cGVvZiBlPT09InN0cmluZyIpZj1jLmZpbHRlcihlLGYpO2Y9dGhpcy5sZW5ndGg+MT9jLnVuaXF1ZShmKTpmO2lmKCh0aGlzLmxlbmd0aD4xfHxhYi50ZXN0KGUpKSYmJGEudGVzdChhKSlmPWYucmV2ZXJzZSgpO3JldHVybiB0aGlzLnB1c2hTdGFjayhmLGEsYmIuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9fSk7Yy5leHRlbmQoe2ZpbHRlcjpmdW5jdGlvbihhLGIsZCl7aWYoZClhPSI6bm90KCIrYSsiKSI7cmV0dXJuIGIubGVuZ3RoPT09MT9jLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGJbMF0sYSk/W2JbMF1dOltdOmMuZmluZC5tYXRjaGVzKGEsYil9LGRpcjpmdW5jdGlvbihhLGIsZCl7dmFyIGU9W107Zm9yKGE9YVtiXTthJiZhLm5vZGVUeXBlIT09OSYmKGQ9PT1CfHxhLm5vZGVUeXBlIT09MXx8IWMoYSkuaXMoZCkpOyl7YS5ub2RlVHlwZT09PTEmJmUucHVzaChhKTthPWFbYl19cmV0dXJuIGV9LG50aDpmdW5jdGlvbihhLGIsZCl7Yj1ifHwxO2Zvcih2YXIgZT0wO2E7YT1hW2RdKWlmKGEubm9kZVR5cGU9PT0xJiYrK2U9PT1iKWJyZWFrO3JldHVybiBhfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmZC5wdXNoKGEpO3JldHVybiBkfX0pO3ZhciB6YT0vIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLCQ9L15ccysvLEFhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vaWcsQmE9LzwoW1x3Ol0rKS8sZGI9Lzx0Ym9keS9pLGViPS88fCYjP1x3KzsvLENhPS88KD86c2NyaXB0fG9iamVjdHxlbWJlZHxvcHRpb258c3R5bGUpL2ksRGE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksZmI9L1w9KFtePSInPlxzXStcLyk+L2csUD17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtQLm9wdGdyb3VwPVAub3B0aW9uO1AudGJvZHk9UC50Zm9vdD1QLmNvbGdyb3VwPVAuY2FwdGlvbj1QLnRoZWFkO1AudGg9UC50ZDtpZighYy5zdXBwb3J0Lmh0bWxTZXJpYWxpemUpUC5fZGVmYXVsdD1bMSwiZGl2PGRpdj4iLCI8L2Rpdj4iXTtjLmZuLmV4dGVuZCh7dGV4dDpmdW5jdGlvbihhKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgZD1jKHRoaXMpO2QudGV4dChhLmNhbGwodGhpcyxiLGQudGV4dCgpKSl9KTtpZih0eXBlb2YgYSE9PSJvYmplY3QiJiZhIT09QilyZXR1cm4gdGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx0KS5jcmVhdGVUZXh0Tm9kZShhKSk7cmV0dXJuIGMudGV4dCh0aGlzKX0sd3JhcEFsbDpmdW5jdGlvbihhKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkKXtjKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsZCkpfSk7aWYodGhpc1swXSl7dmFyIGI9YyhhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUodHJ1ZSk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKTtiLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgZD10aGlzO2QuZmlyc3RDaGlsZCYmZC5maXJzdENoaWxkLm5vZGVUeXBlPT09MTspZD1kLmZpcnN0Q2hpbGQ7cmV0dXJuIGR9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtjKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Yyh0aGlzKSxkPWIuY29udGVudHMoKTtkLmxlbmd0aD9kLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS53cmFwQWxsKGEpfSl9LHVud3JhcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXtjLm5vZGVOYW1lKHRoaXMsImJvZHkiKXx8Yyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSkuZW5kKCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyx0cnVlLGZ1bmN0aW9uKGEpe3RoaXMubm9kZVR5cGU9PT0xJiZ0aGlzLmFwcGVuZENoaWxkKGEpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsdHJ1ZSxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZmFsc2UsZnVuY3Rpb24oYil7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShiLHRoaXMpfSk7ZWxzZSBpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgYT1jKGFyZ3VtZW50c1swXSk7YS5wdXNoLmFwcGx5KGEsdGhpcy50b0FycmF5KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhhLCJiZWZvcmUiLGFyZ3VtZW50cyl9fSxhZnRlcjpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZmFsc2UsZnVuY3Rpb24oYil7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShiLHRoaXMubmV4dFNpYmxpbmcpfSk7ZWxzZSBpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgYT10aGlzLnB1c2hTdGFjayh0aGlzLCJhZnRlciIsYXJndW1lbnRzKTthLnB1c2guYXBwbHkoYSxjKGFyZ3VtZW50c1swXSkudG9BcnJheSgpKTtyZXR1cm4gYX19LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD0wLGU7KGU9dGhpc1tkXSkhPW51bGw7ZCsrKWlmKCFhfHxjLmZpbHRlcihhLFtlXSkubGVuZ3RoKXtpZighYiYmZS5ub2RlVHlwZT09PTEpe2MuY2xlYW5EYXRhKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7Yy5jbGVhbkRhdGEoW2VdKX1lLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX1yZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxiOyhiPXRoaXNbYV0pIT1udWxsO2ErKylmb3IoYi5ub2RlVHlwZT09PTEmJmMuY2xlYW5EYXRhKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubWFwKGZ1bmN0aW9uKCl7aWYoIWMuc3VwcG9ydC5ub0Nsb25lRXZlbnQmJiFjLmlzWE1MRG9jKHRoaXMpKXt2YXIgZD10aGlzLm91dGVySFRNTCxlPXRoaXMub3duZXJEb2N1bWVudDtpZighZCl7ZD1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuYXBwZW5kQ2hpbGQodGhpcy5jbG9uZU5vZGUodHJ1ZSkpO2Q9ZC5pbm5lckhUTUx9cmV0dXJuIGMuY2xlYW4oW2QucmVwbGFjZSh6YSwiIikucmVwbGFjZShmYiwnPSIkMSI+JykucmVwbGFjZSgkLCIiKV0sZSlbMF19ZWxzZSByZXR1cm4gdGhpcy5jbG9uZU5vZGUodHJ1ZSl9KTtpZihhPT09dHJ1ZSl7bmEodGhpcyxiKTtuYSh0aGlzLmZpbmQoIioiKSxiLmZpbmQoIioiKSl9cmV0dXJuIGJ9LGh0bWw6ZnVuY3Rpb24oYSl7aWYoYT09PUIpcmV0dXJuIHRoaXNbMF0mJnRoaXNbMF0ubm9kZVR5cGU9PT0xP3RoaXNbMF0uaW5uZXJIVE1MLnJlcGxhY2UoemEsIiIpOm51bGw7ZWxzZSBpZih0eXBlb2YgYT09PSJzdHJpbmciJiYhQ2EudGVzdChhKSYmKGMuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZXx8ISQudGVzdChhKSkmJiFQWyhCYS5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoQWEsIjwkMT48LyQyPiIpO3RyeXtmb3IodmFyIGI9MCxkPXRoaXMubGVuZ3RoO2I8ZDtiKyspaWYodGhpc1tiXS5ub2RlVHlwZT09PTEpe2MuY2xlYW5EYXRhKHRoaXNbYl0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7dGhpc1tiXS5pbm5lckhUTUw9YX19Y2F0Y2goZSl7dGhpcy5lbXB0eSgpLmFwcGVuZChhKX19ZWxzZSBjLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGYpe3ZhciBoPWModGhpcyk7aC5odG1sKGEuY2FsbCh0aGlzLGYsaC5odG1sKCkpKX0pOnRoaXMuZW1wdHkoKS5hcHBlbmQoYSk7cmV0dXJuIHRoaXN9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGQ9Yyh0aGlzKSxlPWQuaHRtbCgpO2QucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixlKSl9KTtpZih0eXBlb2YgYSE9PSJzdHJpbmciKWE9YyhhKS5kZXRhY2goKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZXh0U2libGluZyxkPXRoaXMucGFyZW50Tm9kZTtjKHRoaXMpLnJlbW92ZSgpO2I/YyhiKS5iZWZvcmUoYSk6YyhkKS5hcHBlbmQoYSl9KX1lbHNlIHJldHVybiB0aGlzLnB1c2hTdGFjayhjKGMuaXNGdW5jdGlvbihhKT9hKCk6YSksInJlcGxhY2VXaXRoIixhKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLHRydWUpfSxkb21NYW5pcDpmdW5jdGlvbihhLGIsZCl7dmFyIGUsZixoLGw9YVswXSxrPVtdO2lmKCFjLnN1cHBvcnQuY2hlY2tDbG9uZSYmYXJndW1lbnRzLmxlbmd0aD09PTMmJnR5cGVvZiBsPT09InN0cmluZyImJkRhLnRlc3QobCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2ModGhpcykuZG9tTWFuaXAoYSxiLGQsdHJ1ZSl9KTtpZihjLmlzRnVuY3Rpb24obCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih4KXt2YXIgcj1jKHRoaXMpO2FbMF09bC5jYWxsKHRoaXMseCxiP3IuaHRtbCgpOkIpO3IuZG9tTWFuaXAoYSxiLGQpfSk7aWYodGhpc1swXSl7ZT1sJiZsLnBhcmVudE5vZGU7ZT1jLnN1cHBvcnQucGFyZW50Tm9kZSYmZSYmZS5ub2RlVHlwZT09PTExJiZlLmNoaWxkTm9kZXMubGVuZ3RoPT09dGhpcy5sZW5ndGg/e2ZyYWdtZW50OmV9OmMuYnVpbGRGcmFnbWVudChhLHRoaXMsayk7aD1lLmZyYWdtZW50O2lmKGY9aC5jaGlsZE5vZGVzLmxlbmd0aD09PTE/aD1oLmZpcnN0Q2hpbGQ6aC5maXJzdENoaWxkKXtiPWImJmMubm9kZU5hbWUoZiwidHIiKTtmPTA7Zm9yKHZhciBvPXRoaXMubGVuZ3RoO2Y8bztmKyspZC5jYWxsKGI/Yy5ub2RlTmFtZSh0aGlzW2ZdLCJ0YWJsZSIpP3RoaXNbZl0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fHRoaXNbZl0uYXBwZW5kQ2hpbGQodGhpc1tmXS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOnRoaXNbZl06dGhpc1tmXSxmPjB8fGUuY2FjaGVhYmxlfHx0aGlzLmxlbmd0aD4xP2guY2xvbmVOb2RlKHRydWUpOmgpfWsubGVuZ3RoJiZjLmVhY2goayxPYSl9cmV0dXJuIHRoaXN9fSk7Yy5idWlsZEZyYWdtZW50PWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmLGg7Yj1iJiZiWzBdP2JbMF0ub3duZXJEb2N1bWVudHx8YlswXTp0O2lmKGEubGVuZ3RoPT09MSYmdHlwZW9mIGFbMF09PT0ic3RyaW5nIiYmYVswXS5sZW5ndGg8NTEyJiZiPT09dCYmIUNhLnRlc3QoYVswXSkmJihjLnN1cHBvcnQuY2hlY2tDbG9uZXx8IURhLnRlc3QoYVswXSkpKXtmPXRydWU7aWYoaD1jLmZyYWdtZW50c1thWzBdXSlpZihoIT09MSllPWh9aWYoIWUpe2U9Yi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Yy5jbGVhbihhLGIsZSxkKX1pZihmKWMuZnJhZ21lbnRzW2FbMF1dPWg/ZToxO3JldHVybntmcmFnbWVudDplLGNhY2hlYWJsZTpmfX07Yy5mcmFnbWVudHM9e307Yy5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXtjLmZuW2FdPWZ1bmN0aW9uKGQpe3ZhciBlPVtdO2Q9YyhkKTt2YXIgZj10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZihmJiZmLm5vZGVUeXBlPT09MTEmJmYuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZkLmxlbmd0aD09PTEpe2RbYl0odGhpc1swXSk7cmV0dXJuIHRoaXN9ZWxzZXtmPTA7Zm9yKHZhciBoPWQubGVuZ3RoO2Y8aDtmKyspe3ZhciBsPShmPjA/dGhpcy5jbG9uZSh0cnVlKTp0aGlzKS5nZXQoKTtjKGRbZl0pW2JdKGwpO2U9ZS5jb25jYXQobCl9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUsYSxkLnNlbGVjdG9yKX19fSk7Yy5leHRlbmQoe2NsZWFuOmZ1bmN0aW9uKGEsYixkLGUpe2I9Ynx8dDtpZih0eXBlb2YgYi5jcmVhdGVFbGVtZW50PT09InVuZGVmaW5lZCIpYj1iLm93bmVyRG9jdW1lbnR8fGJbMF0mJmJbMF0ub3duZXJEb2N1bWVudHx8dDtmb3IodmFyIGY9W10saD0wLGw7KGw9YVtoXSkhPW51bGw7aCsrKXtpZih0eXBlb2YgbD09PSJudW1iZXIiKWwrPSIiO2lmKGwpe2lmKHR5cGVvZiBsPT09InN0cmluZyImJiFlYi50ZXN0KGwpKWw9Yi5jcmVhdGVUZXh0Tm9kZShsKTtlbHNlIGlmKHR5cGVvZiBsPT09InN0cmluZyIpe2w9bC5yZXBsYWNlKEFhLCI8JDE+PC8kMj4iKTt2YXIgaz0oQmEuZXhlYyhsKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxvPVBba118fFAuX2RlZmF1bHQseD1vWzBdLHI9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3Ioci5pbm5lckhUTUw9b1sxXStsK29bMl07eC0tOylyPXIubGFzdENoaWxkO2lmKCFjLnN1cHBvcnQudGJvZHkpe3g9ZGIudGVzdChsKTtrPWs9PT0idGFibGUiJiYheD9yLmZpcnN0Q2hpbGQmJnIuZmlyc3RDaGlsZC5jaGlsZE5vZGVzOm9bMV09PT0iPHRhYmxlPiImJiF4P3IuY2hpbGROb2RlczpbXTtmb3Iobz1rLmxlbmd0aC0KMTtvPj0wOy0tbyljLm5vZGVOYW1lKGtbb10sInRib2R5IikmJiFrW29dLmNoaWxkTm9kZXMubGVuZ3RoJiZrW29dLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoa1tvXSl9IWMuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmJC50ZXN0KGwpJiZyLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKCQuZXhlYyhsKVswXSksci5maXJzdENoaWxkKTtsPXIuY2hpbGROb2Rlc31pZihsLm5vZGVUeXBlKWYucHVzaChsKTtlbHNlIGY9Yy5tZXJnZShmLGwpfX1pZihkKWZvcihoPTA7ZltoXTtoKyspaWYoZSYmYy5ub2RlTmFtZShmW2hdLCJzY3JpcHQiKSYmKCFmW2hdLnR5cGV8fGZbaF0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNjcmlwdCIpKWUucHVzaChmW2hdLnBhcmVudE5vZGU/ZltoXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZbaF0pOmZbaF0pO2Vsc2V7ZltoXS5ub2RlVHlwZT09PTEmJmYuc3BsaWNlLmFwcGx5KGYsW2grMSwwXS5jb25jYXQoYy5tYWtlQXJyYXkoZltoXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IikpKSk7ZC5hcHBlbmRDaGlsZChmW2hdKX1yZXR1cm4gZn0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixkLGU9Yy5jYWNoZSxmPWMuZXZlbnQuc3BlY2lhbCxoPWMuc3VwcG9ydC5kZWxldGVFeHBhbmRvLGw9MCxrOyhrPWFbbF0pIT1udWxsO2wrKylpZighKGsubm9kZU5hbWUmJmMubm9EYXRhW2subm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKWlmKGQ9a1tjLmV4cGFuZG9dKXtpZigoYj1lW2RdKSYmYi5ldmVudHMpZm9yKHZhciBvIGluIGIuZXZlbnRzKWZbb10/Yy5ldmVudC5yZW1vdmUoayxvKTpjLnJlbW92ZUV2ZW50KGssbyxiLmhhbmRsZSk7aWYoaClkZWxldGUga1tjLmV4cGFuZG9dO2Vsc2Ugay5yZW1vdmVBdHRyaWJ1dGUmJmsucmVtb3ZlQXR0cmlidXRlKGMuZXhwYW5kbyk7ZGVsZXRlIGVbZF19fX0pO3ZhciBFYT0vYWxwaGFcKFteKV0qXCkvaSxnYj0vb3BhY2l0eT0oW14pXSopLyxoYj0vLShbYS16XSkvaWcsaWI9LyhbQS1aXSkvZyxGYT0vXi0/XGQrKD86cHgpPyQvaSxqYj0vXi0/XGQvLGtiPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxQYT1bIkxlZnQiLCJSaWdodCJdLFFhPVsiVG9wIiwiQm90dG9tIl0sVyxHYSxhYSxsYj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O2MuZm4uY3NzPWZ1bmN0aW9uKGEsYil7aWYoYXJndW1lbnRzLmxlbmd0aD09PTImJmI9PT1CKXJldHVybiB0aGlzO3JldHVybiBjLmFjY2Vzcyh0aGlzLGEsYix0cnVlLGZ1bmN0aW9uKGQsZSxmKXtyZXR1cm4gZiE9PUI/Yy5zdHlsZShkLGUsZik6Yy5jc3MoZCxlKX0pfTtjLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBkPVcoYSwib3BhY2l0eSIsIm9wYWNpdHkiKTtyZXR1cm4gZD09PSIiPyIxIjpkfWVsc2UgcmV0dXJuIGEuc3R5bGUub3BhY2l0eX19fSxjc3NOdW1iZXI6e3pJbmRleDp0cnVlLGZvbnRXZWlnaHQ6dHJ1ZSxvcGFjaXR5OnRydWUsem9vbTp0cnVlLGxpbmVIZWlnaHQ6dHJ1ZX0sY3NzUHJvcHM6eyJmbG9hdCI6Yy5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGIsZCxlKXtpZighKCFhfHxhLm5vZGVUeXBlPT09M3x8YS5ub2RlVHlwZT09PTh8fCFhLnN0eWxlKSl7dmFyIGYsaD1jLmNhbWVsQ2FzZShiKSxsPWEuc3R5bGUsaz1jLmNzc0hvb2tzW2hdO2I9Yy5jc3NQcm9wc1toXXx8aDtpZihkIT09Qil7aWYoISh0eXBlb2YgZD09PSJudW1iZXIiJiZpc05hTihkKXx8ZD09bnVsbCkpe2lmKHR5cGVvZiBkPT09Im51bWJlciImJiFjLmNzc051bWJlcltoXSlkKz0icHgiO2lmKCFrfHwhKCJzZXQiaW4gayl8fChkPWsuc2V0KGEsZCkpIT09Qil0cnl7bFtiXT1kfWNhdGNoKG8pe319fWVsc2V7aWYoayYmImdldCJpbiBrJiYoZj1rLmdldChhLGZhbHNlLGUpKSE9PUIpcmV0dXJuIGY7cmV0dXJuIGxbYl19fX0sY3NzOmZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmPWMuY2FtZWxDYXNlKGIpLGg9Yy5jc3NIb29rc1tmXTtiPWMuY3NzUHJvcHNbZl18fGY7aWYoaCYmImdldCJpbiBoJiYoZT1oLmdldChhLHRydWUsZCkpIT09QilyZXR1cm4gZTtlbHNlIGlmKFcpcmV0dXJuIFcoYSxiLGYpfSxzd2FwOmZ1bmN0aW9uKGEsYixkKXt2YXIgZT17fSxmO2ZvcihmIGluIGIpe2VbZl09YS5zdHlsZVtmXTthLnN0eWxlW2ZdPWJbZl19ZC5jYWxsKGEpO2ZvcihmIGluIGIpYS5zdHlsZVtmXT1lW2ZdfSxjYW1lbENhc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZShoYixsYil9fSk7Yy5jdXJDU1M9Yy5jc3M7Yy5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe2MuY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihkLGUsZil7dmFyIGg7aWYoZSl7aWYoZC5vZmZzZXRXaWR0aCE9PTApaD1vYShkLGIsZik7ZWxzZSBjLnN3YXAoZCxrYixmdW5jdGlvbigpe2g9b2EoZCxiLGYpfSk7aWYoaDw9MCl7aD1XKGQsYixiKTtpZihoPT09IjBweCImJmFhKWg9YWEoZCxiLGIpO2lmKGghPW51bGwpcmV0dXJuIGg9PT0iInx8aD09PSJhdXRvIj8iMHB4IjpofWlmKGg8MHx8aD09bnVsbCl7aD1kLnN0eWxlW2JdO3JldHVybiBoPT09IiJ8fGg9PT0iYXV0byI/IjBweCI6aH1yZXR1cm4gdHlwZW9mIGg9PT0ic3RyaW5nIj9oOmgrInB4In19LHNldDpmdW5jdGlvbihkLGUpe2lmKEZhLnRlc3QoZSkpe2U9cGFyc2VGbG9hdChlKTtpZihlPj0wKXJldHVybiBlKyJweCJ9ZWxzZSByZXR1cm4gZX19fSk7aWYoIWMuc3VwcG9ydC5vcGFjaXR5KWMuY3NzSG9va3Mub3BhY2l0eT17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGdiLnRlc3QoKGImJmEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlLmZpbHRlcjphLnN0eWxlLmZpbHRlcil8fCIiKT9wYXJzZUZsb2F0KFJlZ0V4cC4kMSkvMTAwKyIiOmI/IjEiOiIifSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLnN0eWxlO2Quem9vbT0xO3ZhciBlPWMuaXNOYU4oYik/IiI6ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSIsZj1kLmZpbHRlcnx8IiI7ZC5maWx0ZXI9RWEudGVzdChmKT9mLnJlcGxhY2UoRWEsZSk6ZC5maWx0ZXIrIiAiK2V9fTtpZih0LmRlZmF1bHRWaWV3JiZ0LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUpR2E9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Q9ZC5yZXBsYWNlKGliLCItJDEiKS50b0xvd2VyQ2FzZSgpO2lmKCEoYj1hLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpKXJldHVybiBCO2lmKGI9Yi5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCkpe2U9Yi5nZXRQcm9wZXJ0eVZhbHVlKGQpO2lmKGU9PT0iIiYmIWMuY29udGFpbnMoYS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxhKSllPWMuc3R5bGUoYSxkKX1yZXR1cm4gZX07aWYodC5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlKWFhPWZ1bmN0aW9uKGEsYil7dmFyIGQsZSxmPWEuY3VycmVudFN0eWxlJiZhLmN1cnJlbnRTdHlsZVtiXSxoPWEuc3R5bGU7aWYoIUZhLnRlc3QoZikmJmpiLnRlc3QoZikpe2Q9aC5sZWZ0O2U9YS5ydW50aW1lU3R5bGUubGVmdDthLnJ1bnRpbWVTdHlsZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQ7aC5sZWZ0PWI9PT0iZm9udFNpemUiPyIxZW0iOmZ8fDA7Zj1oLnBpeGVsTGVmdCsicHgiO2gubGVmdD1kO2EucnVudGltZVN0eWxlLmxlZnQ9ZX1yZXR1cm4gZj09PSIiPyJhdXRvIjpmfTtXPUdhfHxhYTtpZihjLmV4cHImJmMuZXhwci5maWx0ZXJzKXtjLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGEub2Zmc2V0V2lkdGg9PT0wJiZiPT09MHx8IWMuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMmJihhLnN0eWxlLmRpc3BsYXl8fGMuY3NzKGEsImRpc3BsYXkiKSk9PT0ibm9uZSJ9O2MuZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIWMuZXhwci5maWx0ZXJzLmhpZGRlbihhKX19dmFyIG1iPWMubm93KCksbmI9LzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksb2I9L14oPzpzZWxlY3R8dGV4dGFyZWEpL2kscGI9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLHFiPS9eKD86R0VUfEhFQUQpJC8sUmE9L1xbXF0kLyxUPS9cPVw/KCZ8JCkvLGphPS9cPy8scmI9LyhbPyZdKV89W14mXSovLHNiPS9eKFx3KzopP1wvXC8oW15cLz8jXSspLyx0Yj0vJTIwL2csdWI9LyMuKiQvLEhhPWMuZm4ubG9hZDtjLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGIsZCl7aWYodHlwZW9mIGEhPT0ic3RyaW5nIiYmSGEpcmV0dXJuIEhhLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlbHNlIGlmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZT1hLmluZGV4T2YoIiAiKTtpZihlPj0wKXt2YXIgZj1hLnNsaWNlKGUsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGUpfWU9IkdFVCI7aWYoYilpZihjLmlzRnVuY3Rpb24oYikpe2Q9YjtiPW51bGx9ZWxzZSBpZih0eXBlb2YgYj09PSJvYmplY3QiKXtiPWMucGFyYW0oYixjLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7ZT0iUE9TVCJ9dmFyIGg9dGhpcztjLmFqYXgoe3VybDphLHR5cGU6ZSxkYXRhVHlwZToiaHRtbCIsZGF0YTpiLGNvbXBsZXRlOmZ1bmN0aW9uKGwsayl7aWYoaz09PSJzdWNjZXNzInx8az09PSJub3Rtb2RpZmllZCIpaC5odG1sKGY/YygiPGRpdj4iKS5hcHBlbmQobC5yZXNwb25zZVRleHQucmVwbGFjZShuYiwiIikpLmZpbmQoZik6bC5yZXNwb25zZVRleHQpO2QmJmguZWFjaChkLFtsLnJlc3BvbnNlVGV4dCxrLGxdKX19KTtyZXR1cm4gdGhpc30sc2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGMucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cz9jLm1ha2VBcnJheSh0aGlzLmVsZW1lbnRzKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSYmIXRoaXMuZGlzYWJsZWQmJih0aGlzLmNoZWNrZWR8fG9iLnRlc3QodGhpcy5ub2RlTmFtZSl8fHBiLnRlc3QodGhpcy50eXBlKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgZD1jKHRoaXMpLnZhbCgpO3JldHVybiBkPT1udWxsP251bGw6Yy5pc0FycmF5KGQpP2MubWFwKGQsZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmV9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmR9fSkuZ2V0KCl9fSk7Yy5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2MuZm5bYl09ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuYmluZChiLGQpfX0pO2MuZXh0ZW5kKHtnZXQ6ZnVuY3Rpb24oYSxiLGQsZSl7aWYoYy5pc0Z1bmN0aW9uKGIpKXtlPWV8fGQ7ZD1iO2I9bnVsbH1yZXR1cm4gYy5hamF4KHt0eXBlOiJHRVQiLHVybDphLGRhdGE6YixzdWNjZXNzOmQsZGF0YVR5cGU6ZX0pfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYy5nZXQoYSxudWxsLGIsInNjcmlwdCIpfSxnZXRKU09OOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5nZXQoYSxiLGQsImpzb24iKX0scG9zdDpmdW5jdGlvbihhLGIsZCxlKXtpZihjLmlzRnVuY3Rpb24oYikpe2U9ZXx8ZDtkPWI7Yj17fX1yZXR1cm4gYy5hamF4KHt0eXBlOiJQT1NUIix1cmw6YSxkYXRhOmIsc3VjY2VzczpkLGRhdGFUeXBlOmV9KX0sYWpheFNldHVwOmZ1bmN0aW9uKGEpe2MuZXh0ZW5kKGMuYWpheFNldHRpbmdzLGEpfSxhamF4U2V0dGluZ3M6e3VybDpsb2NhdGlvbi5ocmVmLGdsb2JhbDp0cnVlLHR5cGU6IkdFVCIsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIscHJvY2Vzc0RhdGE6dHJ1ZSxhc3luYzp0cnVlLHhocjpmdW5jdGlvbigpe3JldHVybiBuZXcgRS5YTUxIdHRwUmVxdWVzdH0sYWNjZXB0czp7eG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixodG1sOiJ0ZXh0L2h0bWwiLHNjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLHRleHQ6InRleHQvcGxhaW4iLF9kZWZhdWx0OiIqLyoifX0sYWpheDpmdW5jdGlvbihhKXt2YXIgYj1jLmV4dGVuZCh0cnVlLHt9LGMuYWpheFNldHRpbmdzLGEpLGQsZSxmLGg9Yi50eXBlLnRvVXBwZXJDYXNlKCksbD1xYi50ZXN0KGgpO2IudXJsPWIudXJsLnJlcGxhY2UodWIsIiIpO2IuY29udGV4dD1hJiZhLmNvbnRleHQhPW51bGw/YS5jb250ZXh0OmI7aWYoYi5kYXRhJiZiLnByb2Nlc3NEYXRhJiZ0eXBlb2YgYi5kYXRhIT09InN0cmluZyIpYi5kYXRhPWMucGFyYW0oYi5kYXRhLGIudHJhZGl0aW9uYWwpO2lmKGIuZGF0YVR5cGU9PT0ianNvbnAiKXtpZihoPT09IkdFVCIpVC50ZXN0KGIudXJsKXx8KGIudXJsKz0oamEudGVzdChiLnVybCk/IiYiOiI/IikrKGIuanNvbnB8fCJjYWxsYmFjayIpKyI9PyIpO2Vsc2UgaWYoIWIuZGF0YXx8IVQudGVzdChiLmRhdGEpKWIuZGF0YT0oYi5kYXRhP2IuZGF0YSsiJiI6IiIpKyhiLmpzb25wfHwiY2FsbGJhY2siKSsiPT8iO2IuZGF0YVR5cGU9Impzb24ifWlmKGIuZGF0YVR5cGU9PT0ianNvbiImJihiLmRhdGEmJlQudGVzdChiLmRhdGEpfHxULnRlc3QoYi51cmwpKSl7ZD1iLmpzb25wQ2FsbGJhY2t8fCJqc29ucCIrbWIrKztpZihiLmRhdGEpYi5kYXRhPShiLmRhdGErIiIpLnJlcGxhY2UoVCwiPSIrZCsiJDEiKTtiLnVybD1iLnVybC5yZXBsYWNlKFQsIj0iK2QrIiQxIik7Yi5kYXRhVHlwZT0ic2NyaXB0Ijt2YXIgaz1FW2RdO0VbZF09ZnVuY3Rpb24obSl7aWYoYy5pc0Z1bmN0aW9uKGspKWsobSk7ZWxzZXtFW2RdPUI7dHJ5e2RlbGV0ZSBFW2RdfWNhdGNoKHApe319Zj1tO2MuaGFuZGxlU3VjY2VzcyhiLHcsZSxmKTtjLmhhbmRsZUNvbXBsZXRlKGIsdyxlLGYpO3ImJnIucmVtb3ZlQ2hpbGQoQSl9fWlmKGIuZGF0YVR5cGU9PT0ic2NyaXB0IiYmYi5jYWNoZT09PW51bGwpYi5jYWNoZT1mYWxzZTtpZihiLmNhY2hlPT09ZmFsc2UmJmwpe3ZhciBvPWMubm93KCkseD1iLnVybC5yZXBsYWNlKHJiLCIkMV89IitvKTtiLnVybD14Kyh4PT09Yi51cmw/KGphLnRlc3QoYi51cmwpPyImIjoiPyIpKyJfPSIrbzoiIil9aWYoYi5kYXRhJiZsKWIudXJsKz0oamEudGVzdChiLnVybCk/IiYiOiI/IikrYi5kYXRhO2IuZ2xvYmFsJiZjLmFjdGl2ZSsrPT09MCYmYy5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtvPShvPXNiLmV4ZWMoYi51cmwpKSYmKG9bMV0mJm9bMV0udG9Mb3dlckNhc2UoKSE9PWxvY2F0aW9uLnByb3RvY29sfHxvWzJdLnRvTG93ZXJDYXNlKCkhPT1sb2NhdGlvbi5ob3N0KTtpZihiLmRhdGFUeXBlPT09InNjcmlwdCImJmg9PT0iR0VUIiYmbyl7dmFyIHI9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHx0LmRvY3VtZW50RWxlbWVudCxBPXQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoYi5zY3JpcHRDaGFyc2V0KUEuY2hhcnNldD1iLnNjcmlwdENoYXJzZXQ7QS5zcmM9Yi51cmw7aWYoIWQpe3ZhciBDPWZhbHNlO0Eub25sb2FkPUEub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoIUMmJighdGhpcy5yZWFkeVN0YXRlfHx0aGlzLnJlYWR5U3RhdGU9PT0ibG9hZGVkInx8dGhpcy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIikpe0M9dHJ1ZTtjLmhhbmRsZVN1Y2Nlc3MoYix3LGUsZik7Yy5oYW5kbGVDb21wbGV0ZShiLHcsZSxmKTtBLm9ubG9hZD1BLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsO3ImJkEucGFyZW50Tm9kZSYmci5yZW1vdmVDaGlsZChBKX19fXIuaW5zZXJ0QmVmb3JlKEEsci5maXJzdENoaWxkKTtyZXR1cm4gQn12YXIgSj1mYWxzZSx3PWIueGhyKCk7aWYodyl7Yi51c2VybmFtZT93Lm9wZW4oaCxiLnVybCxiLmFzeW5jLGIudXNlcm5hbWUsYi5wYXNzd29yZCk6dy5vcGVuKGgsYi51cmwsYi5hc3luYyk7dHJ5e2lmKGIuZGF0YSE9bnVsbCYmIWx8fGEmJmEuY29udGVudFR5cGUpdy5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGIuY29udGVudFR5cGUpO2lmKGIuaWZNb2RpZmllZCl7Yy5sYXN0TW9kaWZpZWRbYi51cmxdJiZ3LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixjLmxhc3RNb2RpZmllZFtiLnVybF0pO2MuZXRhZ1tiLnVybF0mJncuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsYy5ldGFnW2IudXJsXSl9b3x8dy5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwiWE1MSHR0cFJlcXVlc3QiKTt3LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsYi5kYXRhVHlwZSYmYi5hY2NlcHRzW2IuZGF0YVR5cGVdP2IuYWNjZXB0c1tiLmRhdGFUeXBlXSsiLCAqLyo7IHE9MC4wMSI6Yi5hY2NlcHRzLl9kZWZhdWx0KX1jYXRjaChJKXt9aWYoYi5iZWZvcmVTZW5kJiZiLmJlZm9yZVNlbmQuY2FsbChiLmNvbnRleHQsdyxiKT09PWZhbHNlKXtiLmdsb2JhbCYmYy5hY3RpdmUtLT09PTEmJmMuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKTt3LmFib3J0KCk7cmV0dXJuIGZhbHNlfWIuZ2xvYmFsJiZjLnRyaWdnZXJHbG9iYWwoYiwiYWpheFNlbmQiLFt3LGJdKTt2YXIgTD13Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihtKXtpZighd3x8dy5yZWFkeVN0YXRlPT09MHx8bT09PSJhYm9ydCIpe0p8fGMuaGFuZGxlQ29tcGxldGUoYix3LGUsZik7Sj10cnVlO2lmKHcpdy5vbnJlYWR5c3RhdGVjaGFuZ2U9Yy5ub29wfWVsc2UgaWYoIUomJncmJih3LnJlYWR5U3RhdGU9PT00fHxtPT09InRpbWVvdXQiKSl7Sj10cnVlO3cub25yZWFkeXN0YXRlY2hhbmdlPWMubm9vcDtlPW09PT0idGltZW91dCI/InRpbWVvdXQiOiFjLmh0dHBTdWNjZXNzKHcpPyJlcnJvciI6Yi5pZk1vZGlmaWVkJiZjLmh0dHBOb3RNb2RpZmllZCh3LGIudXJsKT8ibm90bW9kaWZpZWQiOiJzdWNjZXNzIjt2YXIgcDtpZihlPT09InN1Y2Nlc3MiKXRyeXtmPWMuaHR0cERhdGEodyxiLmRhdGFUeXBlLGIpfWNhdGNoKHEpe2U9InBhcnNlcmVycm9yIjtwPXF9aWYoZT09PSJzdWNjZXNzInx8ZT09PSJub3Rtb2RpZmllZCIpZHx8Yy5oYW5kbGVTdWNjZXNzKGIsdyxlLGYpO2Vsc2UgYy5oYW5kbGVFcnJvcihiLHcsZSxwKTtkfHxjLmhhbmRsZUNvbXBsZXRlKGIsdyxlLGYpO209PT0idGltZW91dCImJncuYWJvcnQoKTtpZihiLmFzeW5jKXc9bnVsbH19O3RyeXt2YXIgZz13LmFib3J0O3cuYWJvcnQ9ZnVuY3Rpb24oKXt3JiZGdW5jdGlvbi5wcm90b3R5cGUuY2FsbC5jYWxsKGcsdyk7TCgiYWJvcnQiKX19Y2F0Y2goaSl7fWIuYXN5bmMmJmIudGltZW91dD4wJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dyYmIUomJkwoInRpbWVvdXQiKX0sYi50aW1lb3V0KTt0cnl7dy5zZW5kKGx8fGIuZGF0YT09bnVsbD9udWxsOmIuZGF0YSl9Y2F0Y2gobil7Yy5oYW5kbGVFcnJvcihiLHcsbnVsbCxuKTtjLmhhbmRsZUNvbXBsZXRlKGIsdyxlLGYpfWIuYXN5bmN8fEwoKTtyZXR1cm4gd319LHBhcmFtOmZ1bmN0aW9uKGEsYil7dmFyIGQ9W10sZT1mdW5jdGlvbihoLGwpe2w9Yy5pc0Z1bmN0aW9uKGwpP2woKTpsO2RbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChoKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwpfTtpZihiPT09QiliPWMuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsO2lmKGMuaXNBcnJheShhKXx8YS5qcXVlcnkpYy5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHZhciBmIGluIGEpZGEoZixhW2ZdLGIsZSk7cmV0dXJuIGQuam9pbigiJiIpLnJlcGxhY2UodGIsIisiKX19KTtjLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSxiLGQsZSl7YS5lcnJvciYmYS5lcnJvci5jYWxsKGEuY29udGV4dCxiLGQsZSk7YS5nbG9iYWwmJmMudHJpZ2dlckdsb2JhbChhLCJhamF4RXJyb3IiLFtiLGEsZV0pfSxoYW5kbGVTdWNjZXNzOmZ1bmN0aW9uKGEsYixkLGUpe2Euc3VjY2VzcyYmYS5zdWNjZXNzLmNhbGwoYS5jb250ZXh0LGUsZCxiKTthLmdsb2JhbCYmYy50cmlnZ2VyR2xvYmFsKGEsImFqYXhTdWNjZXNzIixbYixhXSl9LGhhbmRsZUNvbXBsZXRlOmZ1bmN0aW9uKGEsYixkKXthLmNvbXBsZXRlJiZhLmNvbXBsZXRlLmNhbGwoYS5jb250ZXh0LGIsZCk7YS5nbG9iYWwmJmMudHJpZ2dlckdsb2JhbChhLCJhamF4Q29tcGxldGUiLFtiLGFdKTthLmdsb2JhbCYmYy5hY3RpdmUtLT09PTEmJmMuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKX0sdHJpZ2dlckdsb2JhbDpmdW5jdGlvbihhLGIsZCl7KGEuY29udGV4dCYmYS5jb250ZXh0LnVybD09bnVsbD9jKGEuY29udGV4dCk6Yy5ldmVudCkudHJpZ2dlcihiLGQpfSxodHRwU3VjY2VzczpmdW5jdGlvbihhKXt0cnl7cmV0dXJuIWEuc3RhdHVzJiZsb2NhdGlvbi5wcm90b2NvbD09PSJmaWxlOiJ8fGEuc3RhdHVzPj0yMDAmJmEuc3RhdHVzPDMwMHx8YS5zdGF0dXM9PT0zMDR8fGEuc3RhdHVzPT09MTIyM31jYXRjaChiKXt9cmV0dXJuIGZhbHNlfSxodHRwTm90TW9kaWZpZWQ6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIiksZT1hLmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIik7aWYoZCljLmxhc3RNb2RpZmllZFtiXT1kO2lmKGUpYy5ldGFnW2JdPWU7cmV0dXJuIGEuc3RhdHVzPT09MzA0fSxodHRwRGF0YTpmdW5jdGlvbihhLGIsZCl7dmFyIGU9YS5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIil8fCIiLGY9Yj09PSJ4bWwifHwhYiYmZS5pbmRleE9mKCJ4bWwiKT49MDthPWY/YS5yZXNwb25zZVhNTDphLnJlc3BvbnNlVGV4dDtmJiZhLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZT09PSJwYXJzZXJlcnJvciImJmMuZXJyb3IoInBhcnNlcmVycm9yIik7aWYoZCYmZC5kYXRhRmlsdGVyKWE9ZC5kYXRhRmlsdGVyKGEsYik7aWYodHlwZW9mIGE9PT0ic3RyaW5nIilpZihiPT09Impzb24ifHwhYiYmZS5pbmRleE9mKCJqc29uIik+PTApYT1jLnBhcnNlSlNPTihhKTtlbHNlIGlmKGI9PT0ic2NyaXB0Inx8IWImJmUuaW5kZXhPZigiamF2YXNjcmlwdCIpPj0wKWMuZ2xvYmFsRXZhbChhKTtyZXR1cm4gYX19KTtpZihFLkFjdGl2ZVhPYmplY3QpYy5hamF4U2V0dGluZ3MueGhyPWZ1bmN0aW9uKCl7aWYoRS5sb2NhdGlvbi5wcm90b2NvbCE9PSJmaWxlOiIpdHJ5e3JldHVybiBuZXcgRS5YTUxIdHRwUmVxdWVzdH1jYXRjaChhKXt9dHJ5e3JldHVybiBuZXcgRS5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpfWNhdGNoKGIpe319O2Muc3VwcG9ydC5hamF4PSEhYy5hamF4U2V0dGluZ3MueGhyKCk7dmFyIGVhPXt9LHZiPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyx3Yj0vXihbK1wtXT0pPyhbXGQrLlwtXSspKC4qKSQvLGJhLHBhPVtbImhlaWdodCIsIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSIsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIl0sWyJ3aWR0aCIsIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0Il0sWyJvcGFjaXR5Il1dO2MuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKGEsYixkKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKFMoInNob3ciLDMpLGEsYixkKTtlbHNle2Q9MDtmb3IodmFyIGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7YT10aGlzW2RdO2I9YS5zdHlsZS5kaXNwbGF5O2lmKCFjLmRhdGEoYSwib2xkZGlzcGxheSIpJiZiPT09Im5vbmUiKWI9YS5zdHlsZS5kaXNwbGF5PSIiO2I9PT0iIiYmYy5jc3MoYSwiZGlzcGxheSIpPT09Im5vbmUiJiZjLmRhdGEoYSwib2xkZGlzcGxheSIscWEoYS5ub2RlTmFtZSkpfWZvcihkPTA7ZDxlO2QrKyl7YT10aGlzW2RdO2I9YS5zdHlsZS5kaXNwbGF5O2lmKGI9PT0iInx8Yj09PSJub25lIilhLnN0eWxlLmRpc3BsYXk9Yy5kYXRhKGEsIm9sZGRpc3BsYXkiKXx8IiJ9cmV0dXJuIHRoaXN9fSxoaWRlOmZ1bmN0aW9uKGEsYixkKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKFMoImhpZGUiLDMpLGEsYixkKTtlbHNle2E9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXtkPWMuY3NzKHRoaXNbYV0sImRpc3BsYXkiKTtkIT09Im5vbmUiJiZjLmRhdGEodGhpc1thXSwib2xkZGlzcGxheSIsZCl9Zm9yKGE9MDthPGI7YSsrKXRoaXNbYV0uc3R5bGUuZGlzcGxheT0ibm9uZSI7cmV0dXJuIHRoaXN9fSxfdG9nZ2xlOmMuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihhLGIsZCl7dmFyIGU9dHlwZW9mIGE9PT0iYm9vbGVhbiI7aWYoYy5pc0Z1bmN0aW9uKGEpJiZjLmlzRnVuY3Rpb24oYikpdGhpcy5fdG9nZ2xlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlbHNlIGE9PW51bGx8fGU/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGY9ZT9hOmModGhpcykuaXMoIjpoaWRkZW4iKTtjKHRoaXMpW2Y/InNob3ciOiJoaWRlIl0oKX0pOnRoaXMuYW5pbWF0ZShTKCJ0b2dnbGUiLDMpLGEsYixkKTtyZXR1cm4gdGhpc30sZmFkZVRvOmZ1bmN0aW9uKGEsYixkLGUpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxkLGUpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBmPWMuc3BlZWQoYixkLGUpO2lmKGMuaXNFbXB0eU9iamVjdChhKSlyZXR1cm4gdGhpcy5lYWNoKGYuY29tcGxldGUpO3JldHVybiB0aGlzW2YucXVldWU9PT1mYWxzZT8iZWFjaCI6InF1ZXVlIl0oZnVuY3Rpb24oKXt2YXIgaD1jLmV4dGVuZCh7fSxmKSxsLGs9dGhpcy5ub2RlVHlwZT09PTEsbz1rJiZjKHRoaXMpLmlzKCI6aGlkZGVuIikseD10aGlzO2ZvcihsIGluIGEpe3ZhciByPWMuY2FtZWxDYXNlKGwpO2lmKGwhPT1yKXthW3JdPWFbbF07ZGVsZXRlIGFbbF07bD1yfWlmKGFbbF09PT0iaGlkZSImJm98fGFbbF09PT0ic2hvdyImJiFvKXJldHVybiBoLmNvbXBsZXRlLmNhbGwodGhpcyk7aWYoayYmKGw9PT0iaGVpZ2h0Inx8bD09PSJ3aWR0aCIpKXtoLm92ZXJmbG93PVt0aGlzLnN0eWxlLm92ZXJmbG93LHRoaXMuc3R5bGUub3ZlcmZsb3dYLHRoaXMuc3R5bGUub3ZlcmZsb3dZXTtpZihjLmNzcyh0aGlzLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmYy5jc3ModGhpcywiZmxvYXQiKT09PSJub25lIilpZihjLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dClpZihxYSh0aGlzLm5vZGVOYW1lKT09PSJpbmxpbmUiKXRoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjtlbHNle3RoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lIjt0aGlzLnN0eWxlLnpvb209MX1lbHNlIHRoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn1pZihjLmlzQXJyYXkoYVtsXSkpeyhoLnNwZWNpYWxFYXNpbmc9aC5zcGVjaWFsRWFzaW5nfHx7fSlbbF09YVtsXVsxXTthW2xdPWFbbF1bMF19fWlmKGgub3ZlcmZsb3chPW51bGwpdGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjtoLmN1ckFuaW09Yy5leHRlbmQoe30sYSk7Yy5lYWNoKGEsZnVuY3Rpb24oQSxDKXt2YXIgSj1uZXcgYy5meCh4LGgsQSk7aWYodmIudGVzdChDKSlKW0M9PT0idG9nZ2xlIj9vPyJzaG93IjoiaGlkZSI6Q10oYSk7ZWxzZXt2YXIgdz13Yi5leGVjKEMpLEk9Si5jdXIoKXx8MDtpZih3KXt2YXIgTD1wYXJzZUZsb2F0KHdbMl0pLGc9d1szXXx8InB4IjtpZihnIT09InB4Iil7Yy5zdHlsZSh4LEEsKEx8fDEpK2cpO0k9KEx8fDEpL0ouY3VyKCkqSTtjLnN0eWxlKHgsQSxJK2cpfWlmKHdbMV0pTD0od1sxXT09PSItPSI/LTE6MSkqTCtJO0ouY3VzdG9tKEksTCxnKX1lbHNlIEouY3VzdG9tKEksQywiIil9fSk7cmV0dXJuIHRydWV9KX0sc3RvcDpmdW5jdGlvbihhLGIpe3ZhciBkPWMudGltZXJzO2EmJnRoaXMucXVldWUoW10pO3RoaXMuZWFjaChmdW5jdGlvbigpe2Zvcih2YXIgZT1kLmxlbmd0aC0xO2U+PTA7ZS0tKWlmKGRbZV0uZWxlbT09PXRoaXMpe2ImJmRbZV0odHJ1ZSk7ZC5zcGxpY2UoZSwxKX19KTtifHx0aGlzLmRlcXVldWUoKTtyZXR1cm4gdGhpc319KTtjLmVhY2goe3NsaWRlRG93bjpTKCJzaG93IiwxKSxzbGlkZVVwOlMoImhpZGUiLDEpLHNsaWRlVG9nZ2xlOlMoInRvZ2dsZSIsMSksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe2MuZm5bYV09ZnVuY3Rpb24oZCxlLGYpe3JldHVybiB0aGlzLmFuaW1hdGUoYixkLGUsZil9fSk7Yy5leHRlbmQoe3NwZWVkOmZ1bmN0aW9uKGEsYixkKXt2YXIgZT1hJiZ0eXBlb2YgYT09PSJvYmplY3QiP2MuZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpkfHwhZCYmYnx8Yy5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmQmJmJ8fGImJiFjLmlzRnVuY3Rpb24oYikmJmJ9O2UuZHVyYXRpb249Yy5meC5vZmY/MDp0eXBlb2YgZS5kdXJhdGlvbj09PSJudW1iZXIiP2UuZHVyYXRpb246ZS5kdXJhdGlvbiBpbiBjLmZ4LnNwZWVkcz9jLmZ4LnNwZWVkc1tlLmR1cmF0aW9uXTpjLmZ4LnNwZWVkcy5fZGVmYXVsdDtlLm9sZD1lLmNvbXBsZXRlO2UuY29tcGxldGU9ZnVuY3Rpb24oKXtlLnF1ZXVlIT09ZmFsc2UmJmModGhpcykuZGVxdWV1ZSgpO2MuaXNGdW5jdGlvbihlLm9sZCkmJmUub2xkLmNhbGwodGhpcyl9O3JldHVybiBlfSxlYXNpbmc6e2xpbmVhcjpmdW5jdGlvbihhLGIsZCxlKXtyZXR1cm4gZCtlKmF9LHN3aW5nOmZ1bmN0aW9uKGEsYixkLGUpe3JldHVybigtTWF0aC5jb3MoYSpNYXRoLlBJKS8yKzAuNSkqZStkfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixkKXt0aGlzLm9wdGlvbnM9Yjt0aGlzLmVsZW09YTt0aGlzLnByb3A9ZDtpZighYi5vcmlnKWIub3JpZz17fX19KTtjLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpOyhjLmZ4LnN0ZXBbdGhpcy5wcm9wXXx8Yy5meC5zdGVwLl9kZWZhdWx0KSh0aGlzKX0sY3VyOmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3ZhciBhPXBhcnNlRmxvYXQoYy5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCkpO3JldHVybiBhJiZhPi0xRTQ/YTowfSxjdXN0b206ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGUobCl7cmV0dXJuIGYuc3RlcChsKX0KdmFyIGY9dGhpcyxoPWMuZng7dGhpcy5zdGFydFRpbWU9Yy5ub3coKTt0aGlzLnN0YXJ0PWE7dGhpcy5lbmQ9Yjt0aGlzLnVuaXQ9ZHx8dGhpcy51bml0fHwicHgiO3RoaXMubm93PXRoaXMuc3RhcnQ7dGhpcy5wb3M9dGhpcy5zdGF0ZT0wO2UuZWxlbT10aGlzLmVsZW07aWYoZSgpJiZjLnRpbWVycy5wdXNoKGUpJiYhYmEpYmE9c2V0SW50ZXJ2YWwoaC50aWNrLGguaW50ZXJ2YWwpfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1jLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5zaG93PXRydWU7dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpO2ModGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWMuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCk7dGhpcy5vcHRpb25zLmhpZGU9dHJ1ZTt0aGlzLmN1c3RvbSh0aGlzLmN1cigpLDApfSxzdGVwOmZ1bmN0aW9uKGEpe3ZhciBiPWMubm93KCksZD10cnVlO2lmKGF8fGI+PXRoaXMub3B0aW9ucy5kdXJhdGlvbit0aGlzLnN0YXJ0VGltZSl7dGhpcy5ub3c9dGhpcy5lbmQ7dGhpcy5wb3M9dGhpcy5zdGF0ZT0xO3RoaXMudXBkYXRlKCk7dGhpcy5vcHRpb25zLmN1ckFuaW1bdGhpcy5wcm9wXT10cnVlO2Zvcih2YXIgZSBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSlpZih0aGlzLm9wdGlvbnMuY3VyQW5pbVtlXSE9PXRydWUpZD1mYWxzZTtpZihkKXtpZih0aGlzLm9wdGlvbnMub3ZlcmZsb3chPW51bGwmJiFjLnN1cHBvcnQuc2hyaW5rV3JhcEJsb2Nrcyl7dmFyIGY9dGhpcy5lbGVtLGg9dGhpcy5vcHRpb25zO2MuZWFjaChbIiIsIlgiLCJZIl0sZnVuY3Rpb24oayxvKXtmLnN0eWxlWyJvdmVyZmxvdyIrb109aC5vdmVyZmxvd1trXX0pfXRoaXMub3B0aW9ucy5oaWRlJiZjKHRoaXMuZWxlbSkuaGlkZSgpO2lmKHRoaXMub3B0aW9ucy5oaWRlfHx0aGlzLm9wdGlvbnMuc2hvdylmb3IodmFyIGwgaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0pYy5zdHlsZSh0aGlzLmVsZW0sbCx0aGlzLm9wdGlvbnMub3JpZ1tsXSk7dGhpcy5vcHRpb25zLmNvbXBsZXRlLmNhbGwodGhpcy5lbGVtKX1yZXR1cm4gZmFsc2V9ZWxzZXthPWItdGhpcy5zdGFydFRpbWU7dGhpcy5zdGF0ZT1hL3RoaXMub3B0aW9ucy5kdXJhdGlvbjtiPXRoaXMub3B0aW9ucy5lYXNpbmd8fChjLmVhc2luZy5zd2luZz8ic3dpbmciOiJsaW5lYXIiKTt0aGlzLnBvcz1jLmVhc2luZ1t0aGlzLm9wdGlvbnMuc3BlY2lhbEVhc2luZyYmdGhpcy5vcHRpb25zLnNwZWNpYWxFYXNpbmdbdGhpcy5wcm9wXXx8Yl0odGhpcy5zdGF0ZSxhLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pO3RoaXMubm93PXRoaXMuc3RhcnQrKHRoaXMuZW5kLXRoaXMuc3RhcnQpKnRoaXMucG9zO3RoaXMudXBkYXRlKCl9cmV0dXJuIHRydWV9fTtjLmV4dGVuZChjLmZ4LHt0aWNrOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPWMudGltZXJzLGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdKCl8fGEuc3BsaWNlKGItLSwxKTthLmxlbmd0aHx8Yy5meC5zdG9wKCl9LGludGVydmFsOjEzLHN0b3A6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKGJhKTtiYT1udWxsfSxzcGVlZHM6e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sc3RlcDp7b3BhY2l0eTpmdW5jdGlvbihhKXtjLnN0eWxlKGEuZWxlbSwib3BhY2l0eSIsYS5ub3cpfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtpZihhLmVsZW0uc3R5bGUmJmEuZWxlbS5zdHlsZVthLnByb3BdIT1udWxsKWEuZWxlbS5zdHlsZVthLnByb3BdPShhLnByb3A9PT0id2lkdGgifHxhLnByb3A9PT0iaGVpZ2h0Ij9NYXRoLm1heCgwLGEubm93KTphLm5vdykrYS51bml0O2Vsc2UgYS5lbGVtW2EucHJvcF09YS5ub3d9fX0pO2lmKGMuZXhwciYmYy5leHByLmZpbHRlcnMpYy5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZ3JlcChjLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07dmFyIHhiPS9edCg/OmFibGV8ZHxoKSQvaSxJYT0vXig/OmJvZHl8aHRtbCkkL2k7Yy5mbi5vZmZzZXQ9ImdldEJvdW5kaW5nQ2xpZW50UmVjdCJpbiB0LmRvY3VtZW50RWxlbWVudD9mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdLGQ7aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGwpe2Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsbCl9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGMub2Zmc2V0LmJvZHlPZmZzZXQoYik7dHJ5e2Q9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChlKXt9dmFyIGY9Yi5vd25lckRvY3VtZW50LGg9Zi5kb2N1bWVudEVsZW1lbnQ7aWYoIWR8fCFjLmNvbnRhaW5zKGgsYikpcmV0dXJuIGR8fHt0b3A6MCxsZWZ0OjB9O2I9Zi5ib2R5O2Y9ZmEoZik7cmV0dXJue3RvcDpkLnRvcCsoZi5wYWdlWU9mZnNldHx8Yy5zdXBwb3J0LmJveE1vZGVsJiZoLnNjcm9sbFRvcHx8Yi5zY3JvbGxUb3ApLShoLmNsaWVudFRvcHx8Yi5jbGllbnRUb3B8fDApLGxlZnQ6ZC5sZWZ0KyhmLnBhZ2VYT2Zmc2V0fHxjLnN1cHBvcnQuYm94TW9kZWwmJmguc2Nyb2xsTGVmdHx8Yi5zY3JvbGxMZWZ0KS0oaC5jbGllbnRMZWZ0fHxiLmNsaWVudExlZnR8fDApfX06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXTtpZihhKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oeCl7Yy5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsYSx4KX0pO2lmKCFifHwhYi5vd25lckRvY3VtZW50KXJldHVybiBudWxsO2lmKGI9PT1iLm93bmVyRG9jdW1lbnQuYm9keSlyZXR1cm4gYy5vZmZzZXQuYm9keU9mZnNldChiKTtjLm9mZnNldC5pbml0aWFsaXplKCk7dmFyIGQsZT1iLm9mZnNldFBhcmVudCxmPWIub3duZXJEb2N1bWVudCxoPWYuZG9jdW1lbnRFbGVtZW50LGw9Zi5ib2R5O2Q9KGY9Zi5kZWZhdWx0Vmlldyk/Zi5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCk6Yi5jdXJyZW50U3R5bGU7Zm9yKHZhciBrPWIub2Zmc2V0VG9wLG89Yi5vZmZzZXRMZWZ0OyhiPWIucGFyZW50Tm9kZSkmJmIhPT1sJiZiIT09aDspe2lmKGMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmZC5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7ZD1mP2YuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlO2stPWIuc2Nyb2xsVG9wO28tPWIuc2Nyb2xsTGVmdDtpZihiPT09ZSl7ays9Yi5vZmZzZXRUb3A7bys9Yi5vZmZzZXRMZWZ0O2lmKGMub2Zmc2V0LmRvZXNOb3RBZGRCb3JkZXImJiEoYy5vZmZzZXQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMmJnhiLnRlc3QoYi5ub2RlTmFtZSkpKXtrKz1wYXJzZUZsb2F0KGQuYm9yZGVyVG9wV2lkdGgpfHwwO28rPXBhcnNlRmxvYXQoZC5ib3JkZXJMZWZ0V2lkdGgpfHwwfWU9Yi5vZmZzZXRQYXJlbnR9aWYoYy5vZmZzZXQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZkLm92ZXJmbG93IT09InZpc2libGUiKXtrKz1wYXJzZUZsb2F0KGQuYm9yZGVyVG9wV2lkdGgpfHwwO28rPXBhcnNlRmxvYXQoZC5ib3JkZXJMZWZ0V2lkdGgpfHwwfWQ9ZH1pZihkLnBvc2l0aW9uPT09InJlbGF0aXZlInx8ZC5wb3NpdGlvbj09PSJzdGF0aWMiKXtrKz1sLm9mZnNldFRvcDtvKz1sLm9mZnNldExlZnR9aWYoYy5vZmZzZXQuc3VwcG9ydHNGaXhlZFBvc2l0aW9uJiZkLnBvc2l0aW9uPT09ImZpeGVkIil7ays9TWF0aC5tYXgoaC5zY3JvbGxUb3AsbC5zY3JvbGxUb3ApO28rPU1hdGgubWF4KGguc2Nyb2xsTGVmdCxsLnNjcm9sbExlZnQpfXJldHVybnt0b3A6ayxsZWZ0Om99fTtjLm9mZnNldD17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3ZhciBhPXQuYm9keSxiPXQuY3JlYXRlRWxlbWVudCgiZGl2IiksZCxlLGYsaD1wYXJzZUZsb2F0KGMuY3NzKGEsIm1hcmdpblRvcCIpKXx8MDtjLmV4dGVuZChiLnN0eWxlLHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxtYXJnaW46MCxib3JkZXI6MCx3aWR0aDoiMXB4IixoZWlnaHQ6IjFweCIsdmlzaWJpbGl0eToiaGlkZGVuIn0pO2IuaW5uZXJIVE1MPSI8ZGl2IHN0eWxlPSdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7bWFyZ2luOjA7Ym9yZGVyOjVweCBzb2xpZCAjMDAwO3BhZGRpbmc6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsnPjxkaXY+PC9kaXY+PC9kaXY+PHRhYmxlIHN0eWxlPSdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7bWFyZ2luOjA7Ym9yZGVyOjVweCBzb2xpZCAjMDAwO3BhZGRpbmc6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCc+PHRyPjx0ZD48L3RkPjwvdHI+PC90YWJsZT4iO2EuaW5zZXJ0QmVmb3JlKGIsYS5maXJzdENoaWxkKTtkPWIuZmlyc3RDaGlsZDtlPWQuZmlyc3RDaGlsZDtmPWQubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkO3RoaXMuZG9lc05vdEFkZEJvcmRlcj1lLm9mZnNldFRvcCE9PTU7dGhpcy5kb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxscz1mLm9mZnNldFRvcD09PTU7ZS5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO2Uuc3R5bGUudG9wPSIyMHB4Ijt0aGlzLnN1cHBvcnRzRml4ZWRQb3NpdGlvbj1lLm9mZnNldFRvcD09PTIwfHxlLm9mZnNldFRvcD09PTE1O2Uuc3R5bGUucG9zaXRpb249ZS5zdHlsZS50b3A9IiI7ZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjtkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSI7dGhpcy5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9ZS5vZmZzZXRUb3A9PT0tNTt0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PWEub2Zmc2V0VG9wIT09aDthLnJlbW92ZUNoaWxkKGIpO2Mub2Zmc2V0LmluaXRpYWxpemU9Yy5ub29wfSxib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGQ9YS5vZmZzZXRMZWZ0O2Mub2Zmc2V0LmluaXRpYWxpemUoKTtpZihjLm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCl7Yis9cGFyc2VGbG9hdChjLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDA7ZCs9cGFyc2VGbG9hdChjLmNzcyhhLCJtYXJnaW5MZWZ0IikpfHwwfXJldHVybnt0b3A6YixsZWZ0OmR9fSxzZXRPZmZzZXQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWMuY3NzKGEsInBvc2l0aW9uIik7aWYoZT09PSJzdGF0aWMiKWEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIjt2YXIgZj1jKGEpLGg9Zi5vZmZzZXQoKSxsPWMuY3NzKGEsInRvcCIpLGs9Yy5jc3MoYSwibGVmdCIpLG89ZT09PSJhYnNvbHV0ZSImJmMuaW5BcnJheSgiYXV0byIsW2wsa10pPi0xO2U9e307dmFyIHg9e307aWYobyl4PWYucG9zaXRpb24oKTtsPW8/eC50b3A6cGFyc2VJbnQobCwxMCl8fDA7az1vP3gubGVmdDpwYXJzZUludChrLDEwKXx8MDtpZihjLmlzRnVuY3Rpb24oYikpYj1iLmNhbGwoYSxkLGgpO2lmKGIudG9wIT1udWxsKWUudG9wPWIudG9wLWgudG9wK2w7aWYoYi5sZWZ0IT1udWxsKWUubGVmdD1iLmxlZnQtaC5sZWZ0K2s7InVzaW5nImluIGI/Yi51c2luZy5jYWxsKGEsZSk6Zi5jc3MoZSl9fTtjLmZuLmV4dGVuZCh7cG9zaXRpb246ZnVuY3Rpb24oKXtpZighdGhpc1swXSlyZXR1cm4gbnVsbDt2YXIgYT10aGlzWzBdLGI9dGhpcy5vZmZzZXRQYXJlbnQoKSxkPXRoaXMub2Zmc2V0KCksZT1JYS50ZXN0KGJbMF0ubm9kZU5hbWUpP3t0b3A6MCxsZWZ0OjB9OmIub2Zmc2V0KCk7ZC50b3AtPXBhcnNlRmxvYXQoYy5jc3MoYSwibWFyZ2luVG9wIikpfHwwO2QubGVmdC09cGFyc2VGbG9hdChjLmNzcyhhLCJtYXJnaW5MZWZ0IikpfHwwO2UudG9wKz1wYXJzZUZsb2F0KGMuY3NzKGJbMF0sImJvcmRlclRvcFdpZHRoIikpfHwwO2UubGVmdCs9cGFyc2VGbG9hdChjLmNzcyhiWzBdLCJib3JkZXJMZWZ0V2lkdGgiKSl8fDA7cmV0dXJue3RvcDpkLnRvcC1lLnRvcCxsZWZ0OmQubGVmdC1lLmxlZnR9fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fHQuYm9keTthJiYhSWEudGVzdChhLm5vZGVOYW1lKSYmYy5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiOylhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfSl9fSk7Yy5lYWNoKFsiTGVmdCIsIlRvcCJdLGZ1bmN0aW9uKGEsYil7dmFyIGQ9InNjcm9sbCIrYjtjLmZuW2RdPWZ1bmN0aW9uKGUpe3ZhciBmPXRoaXNbMF0saDtpZighZilyZXR1cm4gbnVsbDtpZihlIT09QilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoaD1mYSh0aGlzKSloLnNjcm9sbFRvKCFhP2U6YyhoKS5zY3JvbGxMZWZ0KCksYT9lOmMoaCkuc2Nyb2xsVG9wKCkpO2Vsc2UgdGhpc1tkXT1lfSk7ZWxzZSByZXR1cm4oaD1mYShmKSk/InBhZ2VYT2Zmc2V0ImluIGg/aFthPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06Yy5zdXBwb3J0LmJveE1vZGVsJiZoLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8aC5kb2N1bWVudC5ib2R5W2RdOmZbZF19fSk7Yy5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGIpe3ZhciBkPWIudG9Mb3dlckNhc2UoKTtjLmZuWyJpbm5lciIrYl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1swXT9wYXJzZUZsb2F0KGMuY3NzKHRoaXNbMF0sZCwicGFkZGluZyIpKTpudWxsfTtjLmZuWyJvdXRlciIrYl09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXNbMF0/cGFyc2VGbG9hdChjLmNzcyh0aGlzWzBdLGQsZT8ibWFyZ2luIjoiYm9yZGVyIikpOm51bGx9O2MuZm5bZF09ZnVuY3Rpb24oZSl7dmFyIGY9dGhpc1swXTtpZighZilyZXR1cm4gZT09bnVsbD9udWxsOnRoaXM7aWYoYy5pc0Z1bmN0aW9uKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obCl7dmFyIGs9Yyh0aGlzKTtrW2RdKGUuY2FsbCh0aGlzLGwsa1tkXSgpKSl9KTtpZihjLmlzV2luZG93KGYpKXJldHVybiBmLmRvY3VtZW50LmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCImJmYuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2JdfHxmLmRvY3VtZW50LmJvZHlbImNsaWVudCIrYl07ZWxzZSBpZihmLm5vZGVUeXBlPT09OSlyZXR1cm4gTWF0aC5tYXgoZi5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrCmJdLGYuYm9keVsic2Nyb2xsIitiXSxmLmRvY3VtZW50RWxlbWVudFsic2Nyb2xsIitiXSxmLmJvZHlbIm9mZnNldCIrYl0sZi5kb2N1bWVudEVsZW1lbnRbIm9mZnNldCIrYl0pO2Vsc2UgaWYoZT09PUIpe2Y9Yy5jc3MoZixkKTt2YXIgaD1wYXJzZUZsb2F0KGYpO3JldHVybiBjLmlzTmFOKGgpP2Y6aH1lbHNlIHJldHVybiB0aGlzLmNzcyhkLHR5cGVvZiBlPT09InN0cmluZyI/ZTplKyJweCIpfX0pfSkod2luZG93KTtpZih0eXBlb2YgRE9NUGFyc2VyPT09J3VuZGVmaW5lZCcpe0RPTVBhcnNlcj1mdW5jdGlvbigpe307RE9NUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmc9ZnVuY3Rpb24oc3RyLGNvbnRlbnRUeXBlKXt2YXIgeG1sZGF0YTtpZih0eXBlb2YgQWN0aXZlWE9iamVjdCE9PSd1bmRlZmluZWQnKXt4bWxkYXRhPW5ldyBBY3RpdmVYT2JqZWN0KCdNU1hNTC5Eb21Eb2N1bWVudCcpO3htbGRhdGEuYXN5bmM9ZmFsc2U7eG1sZGF0YS5sb2FkWE1MKHN0cik7cmV0dXJuIHhtbGRhdGE7fWVsc2UgaWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0IT09J3VuZGVmaW5lZCcpe3htbGRhdGE9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7aWYoIWNvbnRlbnRUeXBlKXtjb250ZW50VHlwZT0nYXBwbGljYXRpb24veG1sJzt9CnhtbGRhdGEub3BlbignR0VUJywnZGF0YTonK2NvbnRlbnRUeXBlKyc7Y2hhcnNldD11dGYtOCwnK2VuY29kZVVSSUNvbXBvbmVudChzdHIpLGZhbHNlKTtpZih4bWxkYXRhLm92ZXJyaWRlTWltZVR5cGUpe3htbGRhdGEub3ZlcnJpZGVNaW1lVHlwZShjb250ZW50VHlwZSk7fQp4bWxkYXRhLnNlbmQobnVsbCk7cmV0dXJuIHhtbGRhdGEucmVzcG9uc2VYTUw7fX07fQpPYmplY3Quc2l6ZT1mdW5jdGlvbihvYmope3ZhciBzaXplPTAsa2V5O2ZvcihrZXkgaW4gb2JqKXtpZihvYmouaGFzT3duUHJvcGVydHkoa2V5KSl7c2l6ZSsrO319CnJldHVybiBzaXplO307KGZ1bmN0aW9uKHdpbmRvdyl7InVzZSBzdHJpY3QiO3ZhciBNQ1I9e307TUNSPXtUTVA6e30sR2xvYmFsOntyZXF1ZXN0Ont9LG1hbmdhOnsiY2hhcHRlcnMiOnt9LCJ0aXRsZSI6IiIsImRlc2NyaXB0aW9uIjoiIiwicHViZGF0ZSI6IiIsInN0YXR1cyI6IiIsImF1dGhvciI6IiIsImFydGlzdCI6IiIsImNoYXB0ZXIiOnsibnVtYmVyIjoxLCJuYW1lIjoiIiwiaW5kZXgiOjB9fX0sSW5mbzp7dmVyc2lvbjpTdHJpbmcoTUNSX1ZFUlNJT04pLGtleVByZWZpeDoibWNyLSIsZG9tYWluOndpbmRvdy5sb2NhdGlvbi5ob3N0LHNob3c6ZnVuY3Rpb24oKXt2YXIgbj0kKCduYXYjaW5mbycpOyQoJ2gxJyxuKS5odG1sKE1DUi5HbG9iYWwubWFuZ2EudGl0bGUpOyQoJ2gyJyxuKS5odG1sKE1DUi5HbG9iYWwubWFuZ2EuY2hhcHRlclsnbmFtZSddKTskKCcjZGVzY3JpcHRpb24nLG4pLmh0bWwoTUNSLkdsb2JhbC5tYW5nYS5kZXNjcmlwdGlvbik7JCgnZGF0ZVtwdWJkYXRlXScsbikudGV4dChNQ1IuR2xvYmFsLm1hbmdhLnB1YmRhdGUpOyQoJyNzdGF0JyxuKS5odG1sKE1DUi5HbG9iYWwubWFuZ2Euc3RhdHVzKTskKCcjYXV0aG9yJyxuKS50ZXh0KE1DUi5HbG9iYWwubWFuZ2EuYXV0aG9yKTskKCcjYXJ0aXN0JyxuKS50ZXh0KE1DUi5HbG9iYWwubWFuZ2EuYXJ0aXN0KTskKCcjY292ZXInLG4pLmF0dHIoJ3NyYycsTUNSLkdsb2JhbC5tYW5nYS5jb3Zlcik7JCgnI3Blcm1hbGluaycpLmF0dHIoJ2hyZWYnLE1DUi5Ub29sLmJ1aWxkVXJsKE1DUi5HbG9iYWwucmVxdWVzdC5tYW5nYSxNQ1IuR2xvYmFsLnJlcXVlc3QuY2hhcHRlcikpOyQoJyN2ZXJzaW9uJykudGV4dChNQ1JfVkVSU0lPTik7fX0sUmVnZXg6eyJ1cmwiOnsib2xkIjovbWFuZ2FyZWFkZXJcLm5ldFwvWzAtOV0rXC1bMC05XStcLShbMC05XSspXC8oW2EtejAtOVwtXSspXC9jaGFwdGVyLShbMC05XSspXC5odG1sPy9pLCJjdXIiOi9tYW5nYXJlYWRlclwubmV0XC8oW2EtejAtOVwtXSspKFwvWzAtOV0rKT8oXC9bMC05XSspPy9pfSwic2VsZWN0Ijp7Im9sZCI6L1wvWzAtOVwtXStcL1thLXpcLV0rXC9jaGFwdGVyLShbMC05XSspXC5odG1sPy9pLCJjdXIiOi9cL1thLXpcLV0rXC8oWzAtOV0rKS9pLCJjaGFwdGVyIjovWzAtOV0rOj8oLispL2l9fSxVSTp7aHRtbDoiIisiPGRpdiBpZD0nY29udGFpbmVyJz4iKyIgPG5hdiBpZD0nbWFpbic+IisiICA8c3BhbiBpZD0nY2hhcHRlcnMnIGNsYXNzPSd3aGl0ZSc+PHNlbGVjdD48b3B0aW9uPi0tLTwvb3B0aW9uPjwvc2VsZWN0Pjwvc3Bhbj4iKyIgIDxzcGFuIGlkPSdsaW5rcyc+IisiICAgPGEgaHJlZj0nLyc+PGltZyBhbHQ9J0hvbWUnIHRpdGxlPSdIb21lJyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQmdBQUFBWUFRTUFBQURhdWErN0FBQUFBWE5TUjBJQXJzNGM2UUFBQUFaUVRGUkZBUEJqZ0lDQTg4NnhsQUFBQUFGMFVrNVRBRURtMkdZQUFBQUJZa3RIUkFDSUJSMUlBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQUIzUkpUVVVIMndFZERqUU9mVElUUkFBQUFEZEpSRUZVQ05kallJQUJDU0NXQVdJN0lINFB4UGNiR0JqM0htQmdyMy9Bd1BiL0F3UHYveDBNMXYvL01MRC9mNERBSHpBeEdnQUFsVm9hZVNKWGpoZ0FBQUFBU1VWT1JLNUNZSUk9JyAvPjwvYT4iKyIgICA8YSBpZD0naW5mby1idXR0b24nPjxpbWcgYWx0PSdNYW5nYScgdGl0bGU9J01hbmdhIEluZm8nIHNyYz0nZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCZ0FBQUFZQ0FZQUFBRGdkejM0QUFBQUFYTlNSMElBcnM0YzZRQUFBQVppUzBkRUFQOEEvd0Qvb0wybmt3QUFBQWx3U0ZsekFBQUxFd0FBQ3hNQkFKcWNHQUFBQUFkMFNVMUZCOXNCSFE0eU5PMWtiWEFBQUFLT1NVUkJWRWpIdlpZeGF4VkJGSVcvRTdRS3BGQWtpaFpSTUdCQWlHQ2hoZGk4enZnSERGaUp4S1FWMjduM1J6eU5uU0N4dEZFN0t4RjhwVUUwU01DVVVVUUx3U3JLc1hCV1hqYjdZa1IwWUl1ZHZUTnp6NWx6ejEzNHgwTjdEU3lsSVAwTXQwMW1BaEFSUk1TZkgxQktJVE9KaUJuYmk4QlpBRW5ZM2dKV2dYNW1yald4WFdPc1BkRmtJMm02bERLdy9WclNrcVFwNEpEdFE1Sk9Ba3VTM3BSU1hrZzZ2aWNFRGR4U3lnSndSNUtCSjhCOFJIeHBJWnlRdEdKN3JpWjBJeUtXMjJqVVFjMENjRnZTWjl1OXpIelpoYkpCV2txWkJaNUtPbUI3TVRPWE94SFVCZE8yMzByNlpQdTBwTTFtbzRpNGJ2dXVwQzNiUnpQejQ5RGFJN1pmQVFjbG5iQzkwYUFZYXgzUWwyVGJ2ZGJtNDdidjF0RDl3R0lMMUtha1hsWFlnMDZLSXVLVTdUZVNIa2ZFNVE3cTNnSE5aVjdNekdjZDFEMEM1bXpQWk9iYU5nUzJsNnJPNTd0VWxaa25KTjJVZENrem40M1Evbnk5OEtWZmFtdzBEd3drVFVYRTRZN3NyMGs2VmhNUnNKR1o5MFlVNDN2YjY1bDVBV0RmVVBGZysydW5scVZwb0FlY3FlL1BnWHNkY2MwZSszY1VXbU1ESXlSNUMzZzRST2UzdlZyTVdPTXR0cmNralE5UnR1ME9nSDIyZC9VcTIwZ2FsN1MxN1lBcXExWGJrNldVaVZHK3N0dW9heVpzVDlwZWJSSWI5cUsrSkNTdC9JVTdyMVM2KzlzT2lBZ3ljODMyd1BaY1JNeU9OSy9XWFExYmhxUTVZQkFSYXpzS3JmSStEYndGUGtrNkRXeFc4L3ZlZGw1SlJJUWFxd0JlMmQ1aEZlcFF6UUp3Mi9ablNiMkllUG1iUmpRTFBLMCtkQ01pbG4vYmNCcTdycGsrQnVadGZ4bnVhTUFFc0ZKcEFiZ0szRzlYdUhicFpNZHRQNUIwcm43NjBCU2lwSEhiazNWK0lPbEtSR3pzcWFNMTNGVWV6OXVlQWZxMjE0R1A5Vm12cXB1cE1SdC85V2ZRWld5N05mci9PbjRBR2F4enoweWpCYm9BQUFBQVNVVk9SSzVDWUlJPScgLz48L2E+IisiICAgPGEgaWQ9J29wdGlvbnMtYnV0dG9uJz48aW1nIGFsdD0nT3B0aW9ucycgdGl0bGU9J09wdGlvbnMnIHNyYz0nZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCZ0FBQUFZQkFNQUFBQVNXU0RMQUFBQUFYTlNSMElBcnM0YzZRQUFBQzFRVEZSRk16WTJnWU9ENysvdkl5WW1GQmNYME5EUXdNSEJrWktTNE9EZ29hS2ljblIwWW1Sa3NMR3hVMVZWLy8vL25IMExNd0FBQUFGMFVrNVRBRURtMkdZQUFBQUJZa3RIUkFDSUJSMUlBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQUIzUkpUVVVIMndFZERqUW1TSWU3dmdBQUFFRkpSRUZVR05OallDQVRDQUlCTWx0UUFNSm1CQW96d3FUQURKZ1VtSVpKUWNRWUJTRWtDZ2RxSnBJTVRJOGdVUnl3Q1l3dzk0RGRKb2pGb2FoZUlCVUFBTGF4QkhjMDR6L0RBQUFBQUVsRlRrU3VRbUNDJyAvPjwvYT4iKyIgICA8YSBpZD0ncGVybWFsaW5rJyBocmVmPScjJz48aW1nIGFsdD0nUGVybWFsaW5rJyB0aXRsZT0nUGVybWFsaW5rIHRvIGN1cnJlbnQgY2hhcHRlcicgc3JjPSdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFBQVhOU1IwSUFyczRjNlFBQUFBWmlTMGRFQVA4QS93RC9vTDJua3dBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBQWQwU1UxRkI5c0JIUTR6S1pkNU1PZ0FBQU9FU1VSQlZFakhsWmJQYXh4bEdNYy8zM21UcGpIWW9oSkNhaVVVRzBXaHBRZVJYQ1I3RWJUU205aURvQmR2SWdoUm1rMW1kKzNzWkRmcWJ2NEJUNHA0VUtPSGxualB3ZlJnSUlkQ0lOV1VFdXNQS3JaU04wMTI5NTNIdzg0bUcwbDA4OEF3dk04N1BOOTV2OC8zKzh6QUFSSG1wbDJ1a08vdHpIMDBXK0d3SVlBd2VnZlhIT1J5bEtkUXlJMUNjQUY0RnVnSE5zeHNhWE96dGxDcFZCdlo3Q1RsOHV6aEFBcjVLQzFlZUV1aUNoeEx0d0F3c3kxZ3JkR292MXdxbFgrWm1wcWlWQ3AxRHdDa3hmV0ptWm1rUFh0cFRnRE5adlBwT0k3WHpJdzAxY1VKQ3JsUkZQeUE4VENBSkptWkFUOERUMGdpWFF0WTk5NlB4WEY4cDVzVEJPbnRndUNZcEhieGE5NzdFZUNjOS82MG1hMm9GUWFjY3M2OTBXMFBndW5wYWRkcWFJc1dNMHU4OTYvRmNieWhnQnJDZSs4dm10bmQ5SEFDTXJsY3JyOHJBT2Rja0txbEhSdk91ZG9IbHd0SExLSGE0M3B1T3VjV2dOODZuamtwNlVoWEFGRVVOWUNOanR5SVQvenh4TnR6a3Q1T20vbWtwR2ZTUGh3cWVsS1ZMQUZiUUo4a3VjQjk0MzN6ZFVsL1NucDBSeEc3c3JrbmNUU2Z6enVFWWJZZFJjWE5BNXRjMjZ3dEFHdHQ5VWc2NTF6UDk4QmZCN3pZU2RDWGtwYUVscVJndmxBb1RPUnk0U0JBR0lhN01xMThYT1c5OXlmSVpyTW4rdnI2YnFlVXRDVzV4d1A3clR2endDM3YvZms0amxlejJTemxjcmxWWkhKeWt0blpXY0l3Zk1vNTl4MXc2cUFpL3dIV1hscTlYbis4VkNyOVdxM083YnExYmY4d0RBZFRuV2RhVkxRNFQ1VnplaC9RNjhDd3BNZDJFTXhXYXJXL242OVVxZzM5NitFZCsrZHl1ZjRkS1lxalFsOUplbUVmZ0J2ZSsxZWNjMTlMT3B0U3RXVm1GNk1vdXRLeloyNTBzRklzRmg4QUR3QlN0UXp0UjVPa1VUT3JKMG55YWhBRWErbGVQekFHWEFtNmxMT2xWM3VVL0dSbWY1Z1pTWktFU1pMY2xyZ0wvTjdwcDN3KzM5c1ZnSmx0QXpjN1VvOTQ3OGU5OTJmcTljYUg1WEs1aVRndU1kUmh4ZnZiMjl2ZWRRT3d1TGpZeUdReXc4Q0w2VUI4S08zSEZ6MjlBZU9aOFdFUmZDdHBhSGZ3OHZuTXpNeTFiaW5DSi81VDRKYVp0YzE0Tm5EQkRTbTRIaWo0VWRJWmF3WEF2U1JKcm5hTTYvK1B1QmpmOGQ2Zjd4anBKb1JNUTVaNnNxTkg3eGFMeGZWREFZUmhTQnpIcS9YNjlna3pXMGxuRjZobCtZNDNmek9Lb3MvYW4xUWRaaksyUC9nVEV4TzlBd01ETDBrYUEwYUErOEJxa2lSWGk4WGllcWxVWW5sNW1mbjUrVVAvaFRBM043ZG5uYy9uZXk5ZHVuUWdFLzhBUWFETEJOc1p1a2tBQUFBQVNVVk9SSzVDWUlJPScgLz48L2E+IisiICA8L3NwYW4+IisiICA8c3BhbiBzdHlsZT0nZmxvYXQ6IHJpZ2h0Oyc+IisiICAgPHNwYW4gaWQ9J3N0YXR1cyc+UmVhZHk8L3NwYW4+IisiICAgPGEgaWQ9J3ByZXYnIHRpdGxlPSdQcmV2aW91cyc+Jmx0OyZsdDs8L2E+IisiICAgPGEgaWQ9J25leHQnIHRpdGxlPSdOZXh0Jz4mZ3Q7Jmd0OzwvYT4iKyIgIDwvc3Bhbj4iKyIgPC9uYXY+IisiIDxuYXYgaWQ9J29wdGlvbnMnPiIrIiAgIDxwPjxsYWJlbD4iKyIgICAgIDxpbnB1dCB0eXBlPSdjaGVja2JveCcgaWQ9J29wdGlvbi1zcGFjaW5nJyB2YWx1ZT0nb24nIC8+IisiICAgICBBZGQgc3BhY2luZyBiZXR3ZWVuIHBhZ2VzIHRvIGZhY2lsaXRhdGUgcmVhZGluZy4iKyIgICA8L2xhYmVsPjwvcD4iKyIgICA8cD48bGFiZWw+IisiICAgICA8aW5wdXQgdHlwZT0nY2hlY2tib3gnIGlkPSdvcHRpb24tYmxhY2snIHZhbHVlPSdvZmYnIC8+IisiICAgICBTd2l0Y2ggdG8gZGFyayBza2luLiIrIiAgIDwvbGFiZWw+PC9wPiIrIiAgIDxwPjxsYWJlbD4iKyIgICAgIDxpbnB1dCB0eXBlPSdjaGVja2JveCcgaWQ9J29wdGlvbi1mb3JjZWQ4MDAnIHZhbHVlPSdvbicgLz4iKyIgICAgIEZvcmNlIGltYWdlIHdpZHRoIHRvIDgwMC4gUHJvdmlkZXMgYSBtb3JlIHVuaWZvcm0gcmVhZGluZyBleHBlcmllbmNlLCIrIiAgICAgYnV0IHlvdSBtaWdodCB3YW50IHRvIGRpc2FibGUgaWYgeW91IGNhbid0IHJlYWQgbGFyZ2UgcGFnZXMuIisiICAgPC9sYWJlbD48L3A+IisiICAgPHA+PGxhYmVsPiIrIiAgICAgPGlucHV0IHR5cGU9J2NoZWNrYm94JyBpZD0nb3B0aW9uLWhvdGtleXMnIHZhbHVlPSdvbicgLz4iKyIgICAgIEVuYWJsZSBob3RrZXlzLiIrIiAgICAgPGI+Jmx0OzwvYj4gZm9yIFByZXZpb3VzIGFuZCA8Yj4mZ3Q7PC9iPiBmb3IgTmV4dC4iKyIgICA8L2xhYmVsPjwvcD4iKyIgICA8cD48bGFiZWw+IisiICAgICA8aW5wdXQgdHlwZT0nY2hlY2tib3gnIGlkPSdvcHRpb24tYWRzJyB2YWx1ZT0nb24nIC8+IisiICAgICBTdXBwb3J0IE1SLm5ldCEgRGlzcGxheSB0aGVpciBhZHMgYXQgdGhlIGJvdHRvbSBhbmQgY2xpY2sgb24gdGhlbS4iKyIgICAgIFlvdSBjYW4gYWx3YXlzIGRpc2FibGUgdGhpcy4gSWYgeW91IGhhdmUgYW4gQWQgQmxvY2tlciwgdGhleSB3b24ndCBhcHBlYXIgYW55d2F5LiIrIiAgIDwvbGFiZWw+PC9wPiIrIiAgIDxwPjxsYWJlbD4iKyIgICAgIDxpbnB1dCB0eXBlPSdjaGVja2JveCcgaWQ9J29wdGlvbi1jYWNoZScgdmFsdWU9J29uJyAvPiIrIiAgICAgVXNlIGNhY2hlLiBUaGlzIG1ha2VzIGxvYWRpbmcgYSBjaGFwdGVyIHByZXZpb3VzbHkgdmlzaXRlZCBmYXN0ZXIuIisiICAgICBOb3cgeW91IGNhbiBoaXQgUHJldmlvdXMgYW5kIHJlLXJlYWQgdGhhdCBsYXN0IGNoYXB0ZXIgcXVpY2tseS4iKyIgICAgIE5vdCByZWNvbW1lbmRlZCBvbiBzbG93IGNvbm5lY3Rpb25zLiIrIiAgIDwvbGFiZWw+PC9wPiIrIiAgIDxwPjxhIGlkPSdjYWNoZS1idXR0b24nPk1hbmFnZSBDYWNoZTwvYT48L3A+IisiIDwvbmF2PiIrIiA8bmF2IGlkPSdpbmZvJz4iKyIgICA8aW1nIGlkPSdjb3ZlcicgLz4iKyIgICA8aGVhZGVyPiIrIiAgICAgPGgxPk1hbmdhPC9oMT4iKyIgICAgIDxoMj5DaGFwdGVyPC9oMj4iKyIgICA8L2hlYWRlcj4iKyIgICA8cD5SZWxlYXNlZCBzaW5jZSA8ZGF0ZSBwdWJkYXRlPSdwdWJkYXRlJz48L2RhdGU+IGFuZCBjdXJyZW50bHkgPGkgaWQ9J3N0YXQnPjwvaT48L3A+IisiICAgPHA+U3RvcnkgYnkgPGIgaWQ9J2F1dGhvcic+YXV0aG9yPC9iPiwgQXJ0IGJ5IDxiIGlkPSdhcnRpc3QnPmFydGlzdDwvYj4uPC9wPiIrIiAgIDxwIGlkPSdkZXNjcmlwdGlvbic+RGVzY3JpcHRpb248L3A+IisiIDwvbmF2PiIrIiA8bmF2IGlkPSdjYWNoZSc+IisiICAgPHA+PGEgb25jbGljaz0nTUNSLkRvLnBhbmVsLnRvZ2dsZShcImNhY2hlXCIpJz5IaWRlPC9hPjwvcD4iKyIgICA8cD5TdG9yYWdlIHVzZWQ6IDxiIGlkPSdzdG9yYWdlc2l6ZSc+MDwvYj4lPC9wPiIrIiAgIDxwPjxsYWJlbD4iKyIgICAgIDxpbnB1dCB0eXBlPSdidXR0b24nIGlkPSdjYWNoZS1jbGVhcicgdmFsdWU9J0NsZWFyJyAvPiIrIiAgICAgQ2xlYXIgdGhlIGNhY2hlLiBSZW1vdmVzIGFsbCBjYWNoZWQgY2hhcHRlcnMuIisiICAgPC9sYWJlbD48L3A+IisiIDwvbmF2PiIrIiA8YXJ0aWNsZT4iKyIgICA8cD5Mb2FkaW5nLi4uPC9wPiIrIiAgIDxkaXYgc3R5bGU9J2hlaWdodDogMzAwcHgnPkRFQlVHPC9kaXY+IisiIDwvYXJ0aWNsZT4iKyIgPGZvb3Rlcj4iKyIgICA8bmF2PiIrIiAgIFVzZXJzY3JpcHQgYnkgPGEgaHJlZj0naHR0cDovL3Bhc3Njb2QuY3ouY2MnPnBhc3Njb2Q8L2E+IisiICAgLSBVc2VzIDxhIGhyZWY9J2h0dHA6Ly9qcXVlcnkuY29tJz5qUXVlcnk8L2E+IisiICAgLSBXb3JrcyBiZXN0IGluIDxhIGhyZWY9J2h0dHA6Ly93d3cubW96aWxsYS5jb20vZmlyZWZveC8nPkZpcmVmb3ggNDwvYT4iKyIgICAgIC0gRm9yayBtZSBvbiA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcGFzc2NvZC9NYW5nYS1DaGFwdGVyUmVhZGVyLyc+R2l0aHViPC9hPiIrIiAgIC0gTGljZW5zZTogPGEgaHJlZj0naHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAnPk1JVDwvYT4gKyBBdHRyaWJ1dGlvbiIrIiAgICAtIFRoYW5rcyBmb3IgdXNpbmchIisiICAgICAodi4gPHNwYW4gaWQ9J3ZlcnNpb24nPjwvc3Bhbj4pIisiICAgPC9uYXY+IisiICAgPGRpdiBpZD0nYWRzJz48L2Rpdj4iKyIgPC9mb290ZXI+IisiPC9kaXY+Iixjc3M6eyIqIjp7ImNvbG9yIjoiaW5oZXJpdCJ9LCJib2R5Ijp7ImZvbnQtZmFtaWx5Ijoic2Fucy1zZXJpZiJ9LCIjY29udGFpbmVyIjp7IndpZHRoIjoiODAwcHgiLCJtYXJnaW4iOiI1ZW0gYXV0byJ9LCIjY29udGFpbmVyID4gbmF2Ijp7InRvcCI6IjUwcHgiLCJsZWZ0IjoiYXV0byIsIndpZHRoIjoiNzgwcHgiLCJib3JkZXIiOiI1cHggc29saWQiLCJwYWRkaW5nIjoiNXB4IiwiZGlzcGxheSI6Im5vbmUiLCJvcGFjaXR5IjoiMC45NSIsInBvc2l0aW9uIjoiZml4ZWQiLCJmb250LXNpemUiOiIwLjhlbSIsInRleHQtYWxpZ24iOiJqdXN0aWZ5In0sIm5hdiNtYWluIjp7InRvcCI6IjBweCIsImhlaWdodCI6IjI0cHgiLCJkaXNwbGF5IjoiYmxvY2siLCJsaW5lLWhlaWdodCI6IjI0cHgifSwibmF2I29wdGlvbnMsIG5hdiNjYWNoZSI6eyItbW96LWNvbHVtbi1jb3VudCI6IjIiLCItbW96LWNvbHVtbi1nYXAiOiIyZW0iLCItbW96LWNvbHVtbi1ydWxlLXN0eWxlIjoic29saWQiLCItbW96LWNvbHVtbi1ydWxlLXdpZHRoIjoiMXB4IiwiLXdlYmtpdC1jb2x1bW4tY291bnQiOiIyIiwiLXdlYmtpdC1jb2x1bW4tZ2FwIjoiMmVtIiwiLXdlYmtpdC1jb2x1bW4tcnVsZS1zdHlsZSI6InNvbGlkIiwiLXdlYmtpdC1jb2x1bW4tcnVsZS13aWR0aCI6IjFweCIsImNvbHVtbi1jb3VudCI6IjIiLCJjb2x1bW4tZ2FwIjoiMmVtIiwiY29sdW1uLXJ1bGUtc3R5bGUiOiJzb2xpZCIsImNvbHVtbi1ydWxlLXdpZHRoIjoiMXB4In0sIiNjaGFwdGVycyBzZWxlY3QiOnsicG9zaXRpb24iOiJyZWxhdGl2ZSIsInRvcCI6Ii02cHgifSwiaW1nI2NvdmVyIjp7ImZsb2F0IjoicmlnaHQiLCJoZWlnaHQiOiIyMGVtIiwibWFyZ2luIjoiMWVtIn0sIiNzdGF0dXMiOnsiZm9udC1zaXplIjoiMC44ZW0ifSwiYXJ0aWNsZSI6eyJ0ZXh0LWFsaWduIjoiY2VudGVyIn0sImFydGljbGUgaW1nIjp7Im1hcmdpbi1ib3R0b20iOiIxZW0ifSwiLmZvcmNlZDgwMCBpbWciOnsid2lkdGgiOiI4MDBweCJ9LCJmb290ZXIgbmF2Ijp7ImZvbnQtc2l6ZSI6IjAuN2VtIiwibWFyZ2luIjoiMWVtIGF1dG8iLCJ0ZXh0LWFsaWduIjoiY2VudGVyIn0sImlucHV0W3R5cGU9YnV0dG9uXSI6eyJib3JkZXIiOiIxcHggc29saWQiLCJiYWNrZ3JvdW5kLWNvbG9yIjoidHJhbnNwYXJlbnQifSwiYSI6eyJjb2xvciI6ImluaGVyaXQiLCJ0ZXh0LWRlY29yYXRpb24iOiJ1bmRlcmxpbmUiLCJjdXJzb3IiOiJwb2ludGVyIn0sImE6aG92ZXIsIGE6Zm9jdXMiOnsidGV4dC1kZWNvcmF0aW9uIjoibm9uZSJ9LCJoMSI6eyJmb250LXNpemUiOiIxLjdlbSJ9LCJoMiI6eyJmb250LXNpemUiOiIxLjJlbSJ9LCIuYmxhY2siOnsiYmFja2dyb3VuZC1jb2xvciI6ImJsYWNrIiwiY29sb3IiOiJ3aGl0ZSIsImJvcmRlci1jb2xvciI6IndoaXRlIiwiLW1vei1jb2x1bW4tcnVsZS1jb2xvciI6IndoaXRlIiwiLXdlYmtpdC1jb2x1bW4tcnVsZS1jb2xvciI6IndoaXRlIiwiY29sdW1uLXJ1bGUtY29sb3IiOiJ3aGl0ZSJ9LCIud2hpdGUiOnsiYmFja2dyb3VuZC1jb2xvciI6IndoaXRlIiwiY29sb3IiOiJibGFjayIsImJvcmRlci1jb2xvciI6ImJsYWNrIiwiLW1vei1jb2x1bW4tcnVsZS1jb2xvciI6ImJsYWNrIiwiLXdlYmtpdC1jb2x1bW4tcnVsZS1jb2xvciI6ImJsYWNrIiwiY29sdW1uLXJ1bGUtY29sb3IiOiJibGFjayJ9LCIud2hpdGUgc2VsZWN0LCBzZWxlY3Qud2hpdGUsIC5ibGFjayBzZWxlY3QsIHNlbGVjdC5ibGFjayI6eyJjb2xvciI6ImJsYWNrIn0sImZvb3RlciAjYWRzIC5sZWZ0Ijp7ImZsb2F0IjoibGVmdCJ9LCJmb290ZXIgI2FkcyAucmlnaHQiOnsiZmxvYXQiOiJyaWdodCJ9fSxpbml0OmZ1bmN0aW9uKCl7TUNSLlVJLmNzc1siYXJ0aWNsZSBpbWciXVsibWFyZ2luLWJvdHRvbSJdPU1DUi5PcHRpb24uZ2V0KCdzcGFjaW5nJyk7JCgnYm9keScpLmFwcGVuZChNQ1IuVUkuaHRtbCkuYWRkKCduYXYnKS5hZGRDbGFzcygnd2hpdGUnKTskKCcjcHJlJykucmVtb3ZlKCk7TUNSLlRvb2wuYWRkQ3NzKE1DUi5VSS5jc3MpO319LFRvb2w6e2dldEZha2U6ZnVuY3Rpb24odXJsLGNhbGxiYWNrLHNldHRpbmdzKXt2YXIgZGVmYXVsdHM9e3RpbWVvdXQ6NTAwMH07aWYodHlwZW9mIHNldHRpbmdzPT09J3VuZGVmaW5lZCcpe3NldHRpbmdzPXt9O30KJC5hamF4KHt0eXBlOiJHRVQiLHVybDp1cmwsc3VjY2VzczpmdW5jdGlvbihkYXRhKXtpZihjYWxsYmFjayl7dmFyIHA9bmV3IERPTVBhcnNlcigpLGRvYz1wLnBhcnNlRnJvbVN0cmluZyhkYXRhLCJ0ZXh0L3htbCIpO2NhbGxiYWNrKGRvYyk7fX0sZXJyb3I6ZnVuY3Rpb24oeGhyLHN0YXQsZXJyKXt2YXIgZGF0YT0iPGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5PjxkaXYgaWQ9J3N0YXR1cyc+IisKc3RhdCsiPC9kaXY+PGRpdiBpZD0nZXJyb3InPiIrZXJyKyI8L2Rpdj48ZGl2IGlkPSd1cmwnPiIrCnVybCsiPC9kaXY+IjtpZihzdGF0PT0ndGltZW91dCcpe2RhdGErPSc8aW1nIHNyYz0iL25vdGZvdW5kLjQwNCIgYWx0PSItIiB3aWR0aD0iODAwIiAvPic7fQpkYXRhKz0iPC9ib2R5PjwvaHRtbD4iO2lmKGNhbGxiYWNrKXt2YXIgcD1uZXcgRE9NUGFyc2VyKCksZG9jPXAucGFyc2VGcm9tU3RyaW5nKGRhdGEsInRleHQveG1sIik7Y2FsbGJhY2soZG9jKTt9fSx0aW1lb3V0OnNldHRpbmdzWyd0aW1lb3V0J10/c2V0dGluZ3NbJ3RpbWVvdXQnXTpkZWZhdWx0c1sndGltZW91dCddfSk7fSxtYWtlQ3NzOmZ1bmN0aW9uKGNzc19vYmosbWluaWZpZWQsdGFiKXt2YXIgc2VsZWN0b3Isc3R5bGVzLHByb3BlcnR5LHZhbHVlLG5sPSJcbiIsaHRtbD0nJzttaW5pZmllZD1taW5pZmllZD90cnVlOmZhbHNlO3RhYj10YWI/dGFiOiJcdCI7aWYobWluaWZpZWQpe3RhYj0nJztubD0nICc7fQpmb3Ioc2VsZWN0b3IgaW4gY3NzX29iail7aWYodHlwZW9mIHNlbGVjdG9yPT09J3N0cmluZycpe3N0eWxlcz1jc3Nfb2JqW3NlbGVjdG9yXTtodG1sKz1ubCtzZWxlY3RvcisiIHsiO2Zvcihwcm9wZXJ0eSBpbiBzdHlsZXMpe2lmKHR5cGVvZiBwcm9wZXJ0eT09PSdzdHJpbmcnKXt2YWx1ZT1zdHlsZXNbcHJvcGVydHldO2h0bWwrPW5sK3RhYitwcm9wZXJ0eSsiOiAiK3ZhbHVlKyI7Ijt9fQpodG1sKz1ubCsifSI7fX0KcmV0dXJuIGh0bWw7fSxhZGRDc3M6ZnVuY3Rpb24oY3NzKXt2YXIgZWw7aWYodHlwZW9mIGNzcz09Im9iamVjdCIpe2Nzcz1NQ1IuVG9vbC5tYWtlQ3NzKGNzcyk7fQplbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2VsLnR5cGU9InRleHQvY3NzIjtpZihlbC5zdHlsZVNoZWV0KXtlbC5zdHlsZVNoZWV0LmNzc1RleHQ9Y3NzO31lbHNle2VsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO30KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChlbCk7fSxwYXJzZVVybDpmdW5jdGlvbih1cmxfc3RyKXt2YXIgVT17fSxSbz1NQ1IuUmVnZXgudXJsLm9sZC5leGVjKHVybF9zdHIpLFJuPU1DUi5SZWdleC51cmwuY3VyLmV4ZWModXJsX3N0ciksc3M9L1tcL10vO2lmKFJvIT09bnVsbCl7VS5wYWdlPVJvWzFdP1JvWzFdLnJlcGxhY2Uoc3MsJycpOm51bGw7VS5tYW5nYT1Sb1syXT9Sb1syXS5yZXBsYWNlKHNzLCcnKTpudWxsO1UuY2hhcHRlcj1Sb1szXT9Sb1szXS5yZXBsYWNlKHNzLCcnKTpudWxsO31lbHNlIGlmKFJuIT09bnVsbCl7VS5tYW5nYT1SblsxXT9SblsxXS5yZXBsYWNlKHNzLCcnKTpudWxsO1UuY2hhcHRlcj1SblsyXT9SblsyXS5yZXBsYWNlKHNzLCcnKTpudWxsO1UucGFnZT1SblszXT9SblszXS5yZXBsYWNlKHNzLCcnKTpudWxsO31lbHNle3JldHVybiBudWxsO30KcmV0dXJuIFU7fSxidWlsZFVybDpmdW5jdGlvbihtYW5nYSxjaGFwdGVyLHBhZ2Upe21hbmdhPW1hbmdhPycvJyttYW5nYTonJztjaGFwdGVyPWNoYXB0ZXI/Jy8nK2NoYXB0ZXI6Jyc7cGFnZT1wYWdlPycvJytwYWdlOicnO3JldHVybidodHRwOi8vJytNQ1IuSW5mby5kb21haW4rbWFuZ2ErY2hhcHRlcitwYWdlO30sY2FuSGF6U3RvcmFnZTpmdW5jdGlvbigpe3RyeXtyZXR1cm4nbG9jYWxTdG9yYWdlJ2luIHdpbmRvdyYmd2luZG93LmxvY2FsU3RvcmFnZSE9PW51bGw7fWNhdGNoKGUpe3JldHVybiBmYWxzZTt9fSxjYXBpdGFsaXplOmZ1bmN0aW9uKHN0cil7cmV0dXJuIHN0ci5yZXBsYWNlKC8oXnxccykoW2Etel0pL2csZnVuY3Rpb24obyxwLHEpe3JldHVybiBwK3EudG9VcHBlckNhc2UoKTt9KTt9LHN0b3JhZ2VBdmFpbGFibGU6ZnVuY3Rpb24oKXtpZigvY2hyb21lL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl7cmV0dXJuIDIuNSoxMDAwKjEwMDA7fQpyZXR1cm4gNSoxMDAwKjEwMDA7fSxzdG9yYWdlVXNlZDpmdW5jdGlvbihwZXJjZW50KXtpZihNQ1IuVG9vbC5jYW5IYXpTdG9yYWdlKCkpe3ZhciBsZW49MCxpLGs7Zm9yKGk9MDtpPHdpbmRvdy5sb2NhbFN0b3JhZ2UubGVuZ3RoO2krKyl7az13aW5kb3cubG9jYWxTdG9yYWdlLmtleShpKTtsZW49bGVuK2subGVuZ3RoK3dpbmRvdy5sb2NhbFN0b3JhZ2Vba10ubGVuZ3RoO30KaWYocGVyY2VudCl7cmV0dXJuIGxlbioxMDAvTUNSLlRvb2wuc3RvcmFnZUF2YWlsYWJsZSgpO30KcmV0dXJuIGxlbjt9ZWxzZXtyZXR1cm4gMDt9fX0sT3B0aW9uOntkZWZhdWx0czp7InNwYWNpbmciOiJvbiIsImJsYWNrIjoib2ZmIiwiaG90a2V5cyI6Im9uIiwiZm9yY2VkODAwIjoib24iLCJhZHMiOiJvbiIsImNhY2hlIjoib2ZmIiwiY2FjaGUtY2hhcHRlcnMiOiJ7fSJ9LHJlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBpIGluIHdpbmRvdy5sb2NhbFN0b3JhZ2Upe3ZhciByPW5ldyBSZWdFeHAoTUNSLkluZm8ua2V5UHJlZml4LnJlcGxhY2UoJy0nLCcnKSk7aWYoIWkubWF0Y2gocikpe3dpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShpKTt9fX0saW5pdDpmdW5jdGlvbigpe01DUi5PcHRpb24ucmVzZXQoKTtmb3IodmFyIGtleSBpbiBNQ1IuT3B0aW9uLmRlZmF1bHRzKXtpZihNQ1IuVG9vbC5jYW5IYXpTdG9yYWdlKCkpe01DUi5PcHRpb24udmFsdWVzW2tleV09d2luZG93LmxvY2FsU3RvcmFnZVtNQ1IuSW5mby5rZXlQcmVmaXgra2V5XT93aW5kb3cubG9jYWxTdG9yYWdlW01DUi5JbmZvLmtleVByZWZpeCtrZXldOk1DUi5PcHRpb24uZGVmYXVsdHNba2V5XTt3aW5kb3cubG9jYWxTdG9yYWdlW01DUi5JbmZvLmtleVByZWZpeCtrZXldPU1DUi5PcHRpb24udmFsdWVzW2tleV07fWVsc2V7TUNSLk9wdGlvbi52YWx1ZXNba2V5XT1NQ1IuT3B0aW9uLmRlZmF1bHRzW2tleV07fX19LHNldDpmdW5jdGlvbihrZXksdmFsdWUpe01DUi5PcHRpb25ba2V5XT12YWx1ZTtpZihNQ1IuVG9vbC5jYW5IYXpTdG9yYWdlKCkpe3dpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShNQ1IuSW5mby5rZXlQcmVmaXgra2V5LE1DUi5PcHRpb25ba2V5XSk7JCgnI3N0b3JhZ2VzaXplJykudGV4dChNQ1IuVG9vbC5zdG9yYWdlVXNlZCh0cnVlKSk7fX0sZ2V0OmZ1bmN0aW9uKGtleSl7dmFyIHZhbHVlPU1DUi5PcHRpb25ba2V5XTtpZihNQ1IuVG9vbC5jYW5IYXpTdG9yYWdlKCkpe3ZhbHVlPXdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShNQ1IuSW5mby5rZXlQcmVmaXgra2V5KTt9CnJldHVybiB2YWx1ZTt9LHN3aXRjaFRvOmZ1bmN0aW9uKGtleSx0byl7dmFyIGJlZm9yZT1NQ1IuT3B0aW9uLmdldChrZXkpLG9uZmY9dG8/J29uJzonb2ZmJztpZigvbyhufGZmKS9pLnRlc3QoYmVmb3JlKSl7TUNSLk9wdGlvbi5zZXQoa2V5LG9uZmYpO31lbHNle3Rocm93IFR5cGVFcnJvcjt9fSxzd2l0Y2hPbjpmdW5jdGlvbihrZXkpe01DUi5PcHRpb24uc3dpdGNoVG8oa2V5LHRydWUpO30sc3dpdGNoT2ZmOmZ1bmN0aW9uKGtleSl7TUNSLk9wdGlvbi5zd2l0Y2hUbyhrZXksZmFsc2UpO30sc3dpdGNoZWQ6ZnVuY3Rpb24oa2V5KXt2YXIgb3B0PU1DUi5PcHRpb24uZ2V0KGtleSk7aWYoL28obnxmZikvaS50ZXN0KG9wdCkpe2lmKG9wdD09J29uJyl7cmV0dXJuIHRydWU7fX1lbHNle3Rocm93IFR5cGVFcnJvcjt9CnJldHVybiBmYWxzZTt9LHRvZ2dsZTpmdW5jdGlvbihrZXksZm9yY2VfdG8sY2FsbE9uLGNhbGxPZmYpe2lmKHR5cGVvZiBmb3JjZV90bz09PSdib29sZWFuJyl7TUNSLk9wdGlvbi5zd2l0Y2hUbyhrZXksIWZvcmNlX3RvKTt9CmlmKCFNQ1IuT3B0aW9uLnN3aXRjaGVkKGtleSkpe2lmKGNhbGxPbil7Y2FsbE9uKCk7fQpNQ1IuT3B0aW9uLnN3aXRjaE9uKGtleSk7JCgnI29wdGlvbi0nK2tleSkuYXR0cignY2hlY2tlZCcsdHJ1ZSk7fWVsc2V7aWYoY2FsbE9mZil7Y2FsbE9mZigpO30KTUNSLk9wdGlvbi5zd2l0Y2hPZmYoa2V5KTskKCcjb3B0aW9uLScra2V5KS5hdHRyKCdjaGVja2VkJyxmYWxzZSk7fX0sdmFsdWVzOnt9fSxDYWNoZTp7aW5pdDpmdW5jdGlvbigpe2lmKE1DUi5PcHRpb24uc3dpdGNoZWQoJ2NhY2hlJykpe01DUi5DYWNoZS5zdG9yZS5jaGFwdGVycz1NQ1IuQ2FjaGUuZ2V0KCdjaGFwdGVycycpO319LHNldDpmdW5jdGlvbihrZXksdmFsdWUpe3ZhciBqc29uPUpTT04uc3RyaW5naWZ5KHZhbHVlKTtNQ1IuT3B0aW9uLnNldCgnY2FjaGUtJytrZXksanNvbik7fSxnZXQ6ZnVuY3Rpb24oa2V5KXt2YXIganNvbj1NQ1IuT3B0aW9uLmdldCgnY2FjaGUtJytrZXkpO3JldHVybiBKU09OLnBhcnNlKGpzb24pO30sZDpmdW5jdGlvbihrZXkscXVlcnkpe3JldHVybiBmYWxzZTt9LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciBpIGluIE1DUi5DYWNoZS5zdG9yZSl7TUNSLkNhY2hlLnNldChpLHt9KTt9fSxzdG9yZTp7Y2hhcHRlcnM6e319fSxEbzp7ZGlzcGxheVN0YXR1czpmdW5jdGlvbihzdGF0dXMsYW5pbWF0ZSl7aWYodHlwZW9mIGFuaW1hdGUhPT0nYm9vbGVhbicpe2FuaW1hdGU9dHJ1ZTt9CmlmKGFuaW1hdGUpeyQoJyNzdGF0dXMnKS5zdG9wKCkuZmFkZU91dCgnZmFzdCcsZnVuY3Rpb24oKXskKCcjc3RhdHVzJykudGV4dChzdGF0dXMpLmZhZGVJbigpO30pO31lbHNleyQoJyNzdGF0dXMnKS5zdG9wKCkudGV4dChzdGF0dXMpLnNob3coKTt9CmlmKHN0YXR1cy5sZW5ndGg+MCl7c3RhdHVzKz0nIC8gJzt9CmRvY3VtZW50LnRpdGxlPXN0YXR1cytNQ1IuR2xvYmFsLm1hbmdhLnRpdGxlKycgLyBDaC4gJytNQ1IuR2xvYmFsLnJlcXVlc3QuY2hhcHRlcjt9LGNoYW5nZTp7fSxoYW5kbGVIb3RrZXlzOmZ1bmN0aW9uKGUpe3N3aXRjaChlLndoaWNoKXtjYXNlIDE4ODpNQ1IuR2V0LnByZXZpb3VzQ2hhcHRlcigpO3JldHVybjtjYXNlIDE5MDpNQ1IuR2V0Lm5leHRDaGFwdGVyKCk7cmV0dXJuO2RlZmF1bHQ6cmV0dXJuO319LHRvZ2dsZTp7aG90a2V5czpmdW5jdGlvbihmb3JjZV90byl7TUNSLk9wdGlvbi50b2dnbGUoJ2hvdGtleXMnLGZvcmNlX3RvLGZ1bmN0aW9uKCl7JChkb2N1bWVudCkuYmluZCgna2V5ZG93bicsTUNSLkRvLmhhbmRsZUhvdGtleXMpO30sZnVuY3Rpb24oKXskKGRvY3VtZW50KS51bmJpbmQoJ2tleWRvd24nLE1DUi5Eby5oYW5kbGVIb3RrZXlzKTt9KTt9LHNwYWNpbmc6ZnVuY3Rpb24oZm9yY2VfdG8pe01DUi5PcHRpb24udG9nZ2xlKCdzcGFjaW5nJyxmb3JjZV90byxmdW5jdGlvbigpeyQoJ2FydGljbGUgaW1nJykuY3NzKCdtYXJnaW4tYm90dG9tJywnMWVtJyk7fSxmdW5jdGlvbigpeyQoJ2FydGljbGUgaW1nJykuY3NzKCdtYXJnaW4tYm90dG9tJywnMHB4Jyk7fSk7fSxibGFjazpmdW5jdGlvbihmb3JjZV90byl7dmFyIGE9JCgnW2NsYXNzKj13aGl0ZV0sIFtjbGFzcyo9YmxhY2tdJyk7TUNSLk9wdGlvbi50b2dnbGUoJ2JsYWNrJyxmb3JjZV90byxmdW5jdGlvbigpe2EuYWRkQ2xhc3MoJ2JsYWNrJykucmVtb3ZlQ2xhc3MoJ3doaXRlJyk7fSxmdW5jdGlvbigpe2EuYWRkQ2xhc3MoJ3doaXRlJykucmVtb3ZlQ2xhc3MoJ2JsYWNrJyk7fSk7fSxjYWNoZTpmdW5jdGlvbihmb3JjZV90byl7TUNSLk9wdGlvbi50b2dnbGUoJ2NhY2hlJyxmb3JjZV90byk7fSxmb3JjZWQ4MDA6ZnVuY3Rpb24oZm9yY2VfdG8pe01DUi5PcHRpb24udG9nZ2xlKCdmb3JjZWQ4MDAnLGZvcmNlX3RvLGZ1bmN0aW9uKCl7JCgnYXJ0aWNsZScpLmFkZENsYXNzKCdmb3JjZWQ4MDAnKTt9LGZ1bmN0aW9uKCl7JCgnYXJ0aWNsZScpLnJlbW92ZUNsYXNzKCdmb3JjZWQ4MDAnKTt9KTt9LGFkczpmdW5jdGlvbihmb3JjZV90byl7TUNSLk9wdGlvbi50b2dnbGUoJ2FkcycsZm9yY2VfdG8sZnVuY3Rpb24oKXskKCcjYWRzJykuaHRtbCgiICAgIDxpZnJhbWUgd2lkdGg9JzM1MCcgaGVpZ2h0PScyNTAnIGZyYW1lYm9yZGVyPSdubycgc2Nyb2xsaW5nPSdubycgc3JjPSdodHRwOi8vYWQubWFuZ2FyZWFkZXIubmV0L2J0bGVmdCcgY2xhc3M9J2xlZnQnIC8+IisiICAgIDxpZnJhbWUgd2lkdGg9JzM1MCcgaGVpZ2h0PScyNTAnIGZyYW1lYm9yZGVyPSdubycgc2Nyb2xsaW5nPSdubycgc3JjPSdodHRwOi8vYWQubWFuZ2FyZWFkZXIubmV0L2J0cmlnaHQnIGNsYXNzPSdyaWdodCcgLz4iKS5zaG93KCk7fSxmdW5jdGlvbigpeyQoJyNhZHMnKS5odG1sKCIiKS5oaWRlKCk7fSk7fX0scGFuZWw6e2luaXQ6ZnVuY3Rpb24oKXskKCcjb3B0aW9ucy1idXR0b24nKS5jbGljayhNQ1IuRG8ucGFuZWwudG9nZ2xlKTskKCcjY2FjaGUtYnV0dG9uJykuY2xpY2soZnVuY3Rpb24oKXtNQ1IuRG8ucGFuZWwudG9nZ2xlKCdjYWNoZScpO30pOyQoJyNpbmZvLWJ1dHRvbicpLmNsaWNrKGZ1bmN0aW9uKCl7TUNSLkRvLnBhbmVsLnRvZ2dsZSgnaW5mbycpO30pOyQoJyNjaGFwdGVycyBzZWxlY3QnKS5saXZlKCdjaGFuZ2UnLE1DUi5HZXQuc2VsZWN0ZWRDaGFwdGVyKTskKCcjcHJldicpLmNsaWNrKE1DUi5HZXQucHJldmlvdXNDaGFwdGVyKTskKCcjbmV4dCcpLmNsaWNrKE1DUi5HZXQubmV4dENoYXB0ZXIpOyQoJyNvcHRpb24tc3BhY2luZycpLmNoYW5nZShNQ1IuRG8udG9nZ2xlLnNwYWNpbmcpOyQoJyNvcHRpb24tYmxhY2snKS5jaGFuZ2UoTUNSLkRvLnRvZ2dsZS5ibGFjayk7JCgnI29wdGlvbi1ob3RrZXlzJykuY2hhbmdlKE1DUi5Eby50b2dnbGUuaG90a2V5cyk7JCgnI29wdGlvbi1jYWNoZScpLmNoYW5nZShNQ1IuRG8udG9nZ2xlLmNhY2hlKTskKCcjb3B0aW9uLWZvcmNlZDgwMCcpLmNoYW5nZShNQ1IuRG8udG9nZ2xlLmZvcmNlZDgwMCk7JCgnI29wdGlvbi1hZHMnKS5jaGFuZ2UoTUNSLkRvLnRvZ2dsZS5hZHMpO01DUi5Eby50b2dnbGUuc3BhY2luZyhNQ1IuT3B0aW9uLnN3aXRjaGVkKCdzcGFjaW5nJykpO01DUi5Eby50b2dnbGUuYmxhY2soTUNSLk9wdGlvbi5zd2l0Y2hlZCgnYmxhY2snKSk7TUNSLkRvLnRvZ2dsZS5ob3RrZXlzKE1DUi5PcHRpb24uc3dpdGNoZWQoJ2hvdGtleXMnKSk7TUNSLkRvLnRvZ2dsZS5jYWNoZShNQ1IuT3B0aW9uLnN3aXRjaGVkKCdjYWNoZScpKTtNQ1IuRG8udG9nZ2xlLmZvcmNlZDgwMChNQ1IuT3B0aW9uLnN3aXRjaGVkKCdmb3JjZWQ4MDAnKSk7TUNSLkRvLnRvZ2dsZS5hZHMoTUNSLk9wdGlvbi5zd2l0Y2hlZCgnYWRzJykpOyQoJyNjYWNoZS1jbGVhcicpLmNsaWNrKE1DUi5DYWNoZS5jbGVhcik7fSxzaG93OmZ1bmN0aW9uKHBhbmVsKXtpZih0eXBlb2YgcGFuZWwhPT0nc3RyaW5nJyl7cGFuZWw9J29wdGlvbnMnO30KJCgnbmF2IycrcGFuZWwpLmZhZGVJbignZmFzdCcpO30saGlkZTpmdW5jdGlvbihwYW5lbCl7aWYodHlwZW9mIHBhbmVsIT09J3N0cmluZycpe3BhbmVsPSdvcHRpb25zJzt9CiQoJ25hdiMnK3BhbmVsKS5mYWRlT3V0KCdmYXN0Jyk7fSx0b2dnbGU6ZnVuY3Rpb24ocGFuZWwpe2lmKHR5cGVvZiBwYW5lbCE9PSdzdHJpbmcnKXtwYW5lbD0nb3B0aW9ucyc7fQokKCduYXYjJytwYW5lbCkudG9nZ2xlKCdmYXN0JywnbGluZWFyJyk7fX19LEdldDp7Y2hhcHRlcjpmdW5jdGlvbigpe3ZhciB1cmwsaSxtYWtlVXJsPWZ1bmN0aW9uKCl7cmV0dXJuIE1DUi5Ub29sLmJ1aWxkVXJsKE1DUi5HbG9iYWwucmVxdWVzdC5tYW5nYSxNQ1IuR2xvYmFsLnJlcXVlc3QuY2hhcHRlcixNQ1IuVE1QLnBhZ2UpO30sdXBkYXRlU2VsZWN0PWZ1bmN0aW9uKCl7fSxpbWdUYWc9ZnVuY3Rpb24ocGFnZSl7dmFyIHQ9TUNSLkdsb2JhbC5tYW5nYS50aXRsZSsnIC8gJysKTUNSLkdsb2JhbC5yZXF1ZXN0LmNoYXB0ZXIrJzogJytNQ1IuR2xvYmFsLm1hbmdhLmNoYXB0ZXJbJ25hbWUnXSsnIC8gJysnUGFnZSAnK3BhZ2U7cmV0dXJuIjxpbWcgc3JjPSciK01DUi5UTVAubGlzdFtwYWdlXSsiJyBhbHQ9JyIrdCsiJyB0aXRsZT0nIit0KyInIC8+XG4iO30sdXBkYXRlRGlzcGxheT1mdW5jdGlvbih1c2VfY2FjaGUpe3ZhciBpLGg9IiIsdDtmb3IoaSBpbiBNQ1IuVE1QLmxpc3Qpe2grPWltZ1RhZyhpKTt9CiQoJ2FydGljbGUnKS5odG1sKGgpO01DUi5Eby5kaXNwbGF5U3RhdHVzKCdMb2FkZWQnKTtpZihNQ1IuT3B0aW9uLnN3aXRjaGVkKCJjYWNoZSIpKXt2YXIgYz1NQ1IuQ2FjaGUuZ2V0KCdjaGFwdGVycycpO2lmKCFjW1N0cmluZyhNQ1IuR2xvYmFsLnJlcXVlc3QubWFuZ2EpXSl7Y1tTdHJpbmcoTUNSLkdsb2JhbC5yZXF1ZXN0Lm1hbmdhKV09e307fQpjW1N0cmluZyhNQ1IuR2xvYmFsLnJlcXVlc3QubWFuZ2EpXVtTdHJpbmcoTUNSLkdsb2JhbC5yZXF1ZXN0LmNoYXB0ZXIpXT1NQ1IuVE1QLmxpc3Q7TUNSLkNhY2hlLnNldCgnY2hhcHRlcnMnLGMpO319LGRvUGFnZTE9ZnVuY3Rpb24oZG9jLGNhY2hlZCl7aWYoY2FjaGVkKXt9ZWxzZXskKCdhcnRpY2xlJykuaHRtbChpbWdUYWcoMCkpO30KTUNSLkdsb2JhbC5tYW5nYS5jaGFwdGVyWydudW1iZXInXT1NQ1IuR2xvYmFsLnJlcXVlc3QuY2hhcHRlcjt2YXIgc3NzLHNzLHM9JCgnc2NyaXB0Omxhc3QnLGRvYykuY29udGVudHMoKS50ZXh0KCk7cz1zLnNwbGl0KCJcbiIpO3NzPXMuaW5kZXhPZigiZnVuY3Rpb24gb212S2V5UHJlc3NlZChlKSB7Iik7c3NzPXMuc3BsaWNlKDAsc3MpLmpvaW4oIlxuIik7ZXZhbChzc3MpO01DUi5HbG9iYWwubWFuZ2EuaWQ9ZG9jdW1lbnRbJ21hbmdhaWQnXTskLmdldEpTT04oJy9hY3Rpb25zL3NlbGVjdG9yLz9pZD0nK01DUi5HbG9iYWwubWFuZ2EuaWQrJyZ3aGljaD0wJyxmdW5jdGlvbihqKXtNQ1IuR2xvYmFsLm1hbmdhLmNoYXB0ZXJzPWo7dXBkYXRlU2VsZWN0KCk7dmFyIGksaztmb3IoaSBpbiBqKXtrPWpbaV07aWYoU3RyaW5nKGsuY2hhcHRlcik9PU1DUi5HbG9iYWwucmVxdWVzdC5jaGFwdGVyKXtNQ1IuR2xvYmFsLm1hbmdhLmNoYXB0ZXJbJ25hbWUnXT1qW2ldWydjaGFwdGVyX25hbWUnXTtNQ1IuR2xvYmFsLm1hbmdhLmNoYXB0ZXIuaW5kZXg9aTt9fQpNQ1IuSW5mby5zaG93KCk7fSk7TUNSLlRvb2wuZ2V0RmFrZShNQ1IuVG9vbC5idWlsZFVybChNQ1IuR2xvYmFsLnJlcXVlc3QubWFuZ2EpLGZ1bmN0aW9uKGRvYyl7TUNSLkdsb2JhbC5tYW5nYS5kZXNjcmlwdGlvbj0kKCcjcmVhZG1hbmdhc3VtIHAnLGRvYykudGV4dCgpO01DUi5HbG9iYWwubWFuZ2EuY292ZXI9JCgnI21hbmdhaW1nIGltZycsZG9jKS5hdHRyKCdzcmMnKTtNQ1IuR2xvYmFsLm1hbmdhLnB1YmRhdGU9JCgnI21hbmdhcHJvcGVydGllcyB0cjplcSgyKSB0ZDpsYXN0Jyxkb2MpLnRleHQoKTtNQ1IuR2xvYmFsLm1hbmdhLnN0YXR1cz0kKCcjbWFuZ2Fwcm9wZXJ0aWVzIHRyOmVxKDMpIHRkOmxhc3QnLGRvYykudGV4dCgpO01DUi5HbG9iYWwubWFuZ2EuYXV0aG9yPSQoJyNtYW5nYXByb3BlcnRpZXMgdHI6ZXEoNCkgdGQ6bGFzdCcsZG9jKS50ZXh0KCk7TUNSLkdsb2JhbC5tYW5nYS5hcnRpc3Q9JCgnI21hbmdhcHJvcGVydGllcyB0cjplcSg1KSB0ZDpsYXN0Jyxkb2MpLnRleHQoKTtNQ1IuSW5mby5zaG93KCk7fSk7fSxtYWluTG9vcD1mdW5jdGlvbigpe01DUi5Eby5kaXNwbGF5U3RhdHVzKCdMb2FkaW5nIENoLiAnK01DUi5HbG9iYWwucmVxdWVzdC5jaGFwdGVyKycuLi4nKycoJytNQ1IuVE1QLnBhZ2UrJyknLGZhbHNlKTtNQ1IuVG9vbC5nZXRGYWtlKG1ha2VVcmwoKSxmdW5jdGlvbihkb2Mpe3ZhciBkaXNwPWZhbHNlLGltZz0kKCcjaW1nJyxkb2MpO2lmKHR5cGVvZiBpbWcuYXR0cignc3JjJykhPT0ndW5kZWZpbmVkJyl7TUNSLlRNUC5saXN0LnB1c2goaW1nLmF0dHIoJ3NyYycpKTtpZihNQ1IuVE1QLnBhZ2U9PTEpe2RvUGFnZTEoZG9jKTt9Ck1DUi5UTVAucGFnZSsrO21haW5Mb29wKCk7fWVsc2V7dXBkYXRlRGlzcGxheSgpO319KTt9O01DUi5Eby5kaXNwbGF5U3RhdHVzKCdMb2FkaW5nIENoLiAnK01DUi5HbG9iYWwucmVxdWVzdC5jaGFwdGVyKycuLi4nKTtpZihNQ1IuT3B0aW9uLnN3aXRjaGVkKCJjYWNoZSIpKXtpZihNQ1IuQ2FjaGUuZ2V0KCdjaGFwdGVycycpW1N0cmluZyhNQ1IuR2xvYmFsLnJlcXVlc3QubWFuZ2EpXSl7aWYoTUNSLkNhY2hlLmdldCgnY2hhcHRlcnMnKVtTdHJpbmcoTUNSLkdsb2JhbC5yZXF1ZXN0Lm1hbmdhKV1bU3RyaW5nKE1DUi5HbG9iYWwucmVxdWVzdC5jaGFwdGVyKV0pe01DUi5UTVAubGlzdD1NQ1IuQ2FjaGUuZ2V0KCdjaGFwdGVycycpW1N0cmluZyhNQ1IuR2xvYmFsLnJlcXVlc3QubWFuZ2EpXVtTdHJpbmcoTUNSLkdsb2JhbC5yZXF1ZXN0LmNoYXB0ZXIpXTtNQ1IuVE1QLnBhZ2U9MTtNQ1IuVG9vbC5nZXRGYWtlKG1ha2VVcmwoKSxmdW5jdGlvbihkb2Mpe2RvUGFnZTEoZG9jLHRydWUpO30pO3VwZGF0ZURpc3BsYXkoKTtyZXR1cm47fX19Ck1DUi5UTVAubGlzdD1bXTtNQ1IuVE1QLnBhZ2U9MTttYWluTG9vcCgpO30sc2VsZWN0ZWRDaGFwdGVyOmZ1bmN0aW9uKCl7TUNSLkdsb2JhbC5yZXF1ZXN0LmNoYXB0ZXI9JCgnI2NoYXB0ZXJzJykudmFsKCk7TUNSLkdldC5jaGFwdGVyKCk7fSxwcmV2aW91c0NoYXB0ZXI6ZnVuY3Rpb24oKXt2YXIgY2hpPU51bWJlcihNQ1IuR2xvYmFsLm1hbmdhLmNoYXB0ZXIuaW5kZXgpO2lmKE1DUi5HbG9iYWwubWFuZ2EuY2hhcHRlcnNbY2hpLTFdKXtNQ1IuR2xvYmFsLnJlcXVlc3QuY2hhcHRlcj1NQ1IuR2xvYmFsLm1hbmdhLmNoYXB0ZXJzW2NoaS0xXVsnY2hhcHRlciddO01DUi5HZXQuY2hhcHRlcigpO31lbHNle01DUi5Eby5kaXNwbGF5U3RhdHVzKCdUaGlzIGlzIHRoZSBmaXJzdCBDaGFwdGVyJyk7fX0sbmV4dENoYXB0ZXI6ZnVuY3Rpb24oKXt2YXIgY2hpPU51bWJlcihNQ1IuR2xvYmFsLm1hbmdhLmNoYXB0ZXIuaW5kZXgpO2lmKE1DUi5HbG9iYWwubWFuZ2EuY2hhcHRlcnNbY2hpKzFdKXtNQ1IuR2xvYmFsLnJlcXVlc3QuY2hhcHRlcj1NQ1IuR2xvYmFsLm1hbmdhLmNoYXB0ZXJzW2NoaSsxXVsnY2hhcHRlciddO01DUi5HZXQuY2hhcHRlcigpO31lbHNle01DUi5Eby5kaXNwbGF5U3RhdHVzKCdUaGlzIGlzIHRoZSBsYXN0IENoYXB0ZXInKTt9fX19O3dpbmRvdy5NQ1I9TUNSO30pKHdpbmRvdyk7JChmdW5jdGlvbigpe2Z1bmN0aW9uIG9tdktleVByZXNzZWQoKXt9CmRvY3VtZW50Lm9ua2V5ZG93bj1mdW5jdGlvbigpe307TUNSLkdsb2JhbC5yZXF1ZXN0PU1DUi5Ub29sLnBhcnNlVXJsKHdpbmRvdy5sb2NhdGlvbik7TUNSLkdsb2JhbC5tYW5nYS50aXRsZT1NQ1IuVG9vbC5jYXBpdGFsaXplKE1DUi5HbG9iYWwucmVxdWVzdC5tYW5nYS5yZXBsYWNlKC8tL2lnLCcgJykpO01DUi5HbG9iYWwubWFuZ2EuY2hhcHRlcj17Im51bWJlciI6TUNSLkdsb2JhbC5yZXF1ZXN0LmNoYXB0ZXIsIm5hbWUiOiIifTtNQ1IuVUkuaW5pdCgpO01DUi5PcHRpb24uaW5pdCgpO01DUi5DYWNoZS5pbml0KCk7TUNSLkRvLnBhbmVsLmluaXQoKTtNQ1IuSW5mby5zaG93KCk7TUNSLkdldC5jaGFwdGVyKCk7YWxlcnQoIiIrIlRoaXMgaXMgYSBwcmUtcmVsZWFzZSAoYmV0YSkgdmVyc2lvbi4gQ2hlY2sgb2Z0ZW4gZm9yIHVwZGF0ZXMuXG5cbkFzIHN1Y2gsIGZlYXR1cmVzIG1heSBiZSBicm9rZW4gb3IgbWlzc2luZy4gIisiUGxlYXNlIGRvIG5vdCByZXBvcnQgdGhlc2UgYXMgYnVncy4gUmVmZXIgdG8gdGhlIHJlbGVhc2Ugbm90ZXMgYmVsb3c6IisiXG5cbiIrIiogTm8gY2FjaGUuXG4iKyIqIE5vdCBwb3NzaWJsZSB0byBjaGFuZ2Ugb3B0aW9ucy5cbiIrIiogSWNvbnMgZm9yIG5hdiBwYW5lbC5cbiIrIiogRmFzdGVyIGxvYWQsIGxpZ2h0ZXIgZm9vdHByaW50LlxuIisiKiBGZXRjaGVzIGFuZCBkaXNwbGF5cyBtYW5nYSBkZXNjcmlwdGlvbiBhbmQgZGV0YWlscy5cbiIrIiogTm8gbmF2aWdhdGlvbiB5ZXQuIEhhdmUgdG8gYnJvd3NlIHRoZSBzaXRlIHRvIHNlbGVjdCBtYW5nYSAqYW5kKiBjaGFwdGVycy5cbiIpO30pOw=='; }

0 comments:

Post a Comment