serve-sim 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/serve-sim-bin CHANGED
Binary file
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{readdirSync as g,readFileSync as y,existsSync as N,unlinkSync as F}from"fs";import{execSync as R,spawn as U,exec as q,execFile as k}from"child_process";import{tmpdir as _}from"os";import{join as w}from"path";var B=w(_(),"serve-sim"),I=new Set(["host.exp.Exponent","dev.expo.Exponent"]),v=["Frameworks/React.framework","Frameworks/hermes.framework","Frameworks/Hermes.framework","Frameworks/ExpoModulesCore.framework","main.jsbundle"],f=/(WidgetRenderer|ExtensionHost|\.extension(\.|$)|Service|PlaceholderApp|InCallService|CallUI|InCallUI|com\.apple\.Preferences\.Cellular|com\.apple\.purplebuddy|com\.apple\.chrono|com\.apple\.shuttle|com\.apple\.usernotificationsui)/i;function m(Y){return!f.test(Y)}function p(Y,J){if(I.has(J))return Promise.resolve(!0);return new Promise((Q)=>{k("xcrun",["simctl","get_app_container",Y,J,"app"],{timeout:2000},(z,Z)=>{if(z)return Q(!1);let C=Z.trim();if(!C)return Q(!1);for(let X of v)if(N(w(C,X)))return Q(!0);Q(!1)})})}var O={at:0,booted:null};function S(){let Y=Date.now();if(O.booted&&Y-O.at<1500)return O.booted;try{let J=R("xcrun simctl list devices booted -j",{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:3000}),Q=JSON.parse(J),z=new Set;for(let Z of Object.values(Q.devices))for(let C of Z)if(C.state==="Booted")z.add(C.udid);return O={at:Y,booted:z},z}catch{return null}}function L(){let Y;try{Y=g(B).filter((z)=>z.startsWith("server-")&&z.endsWith(".json"))}catch{return[]}let J=S(),Q=[];for(let z of Y){let Z=w(B,z);try{let C=JSON.parse(y(Z,"utf-8"));try{process.kill(C.pid,0)}catch{try{F(Z)}catch{}continue}if(J&&!J.has(C.device)){try{process.kill(C.pid,"SIGTERM")}catch{}try{F(Z)}catch{}continue}Q.push(C)}catch{}}return Q}var A=null;function h(){if(!A)A=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYzAsQixqNCxtNSxQMCxiNCx2NCx5NCwkNCxtMCxUMCxwNCxHNCx6NCxXNCxnNCxkMD17fSxhMD1bXSxmNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLGIwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gejAoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVjQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gVzAoWCxaLEope3ZhciBZLHEsUSxLPXt9O2ZvcihRIGluIFopUT09ImtleSI/WT1aW1FdOlE9PSJyZWYiP3E9WltRXTpLW1FdPVpbUV07aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoSy5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YzAuY2FsbChhcmd1bWVudHMsMik6SiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihRIGluIFguZGVmYXVsdFByb3BzKUtbUV09PT12b2lkIDAmJihLW1FdPVguZGVmYXVsdFByb3BzW1FdKTtyZXR1cm4gZjAoWCxLLFkscSxudWxsKX1mdW5jdGlvbiBmMChYLFosSixZLHEpe3ZhciBRPXt0eXBlOlgscHJvcHM6WixrZXk6SixyZWY6WSxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK2o0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmQi52bm9kZSE9bnVsbCYmQi52bm9kZShRKSxRfWZ1bmN0aW9uIGYoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gaShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn1mdW5jdGlvbiBCMChYLFope2lmKFo9PW51bGwpcmV0dXJuIFguX18/QjAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgSjtaPFguX19rLmxlbmd0aDtaKyspaWYoKEo9WC5fX2tbWl0pIT1udWxsJiZKLl9fZSE9bnVsbClyZXR1cm4gSi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/QjAoWCk6bnVsbH1mdW5jdGlvbiBkNShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBaPVguX192LEo9Wi5fX2UsWT1bXSxxPVtdLFE9ejAoe30sWik7US5fX3Y9Wi5fX3YrMSxCLnZub2RlJiZCLnZub2RlKFEpLEg0KFguX19QLFEsWixYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWi5fX3U/W0pdOm51bGwsWSxKPT1udWxsP0IwKFopOkosISEoMzImWi5fX3UpLHEpLFEuX192PVouX192LFEuX18uX19rW1EuX19pXT1RLGY0KFksUSxxKSxaLl9fZT1aLl9fPW51bGwsUS5fX2UhPUomJng0KFEpfX1mdW5jdGlvbiB4NChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFope2lmKFohPW51bGwmJlouX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVouX19lfSkseDQoWCl9ZnVuY3Rpb24gTDQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmUDAucHVzaChYKSYmIWwwLl9fcisrfHxiNCE9Qi5kZWJvdW5jZVJlbmRlcmluZykmJigoYjQ9Qi5kZWJvdW5jZVJlbmRlcmluZyl8fHY0KShsMCl9ZnVuY3Rpb24gbDAoKXt0cnl7Zm9yKHZhciBYLFo9MTtQMC5sZW5ndGg7KVAwLmxlbmd0aD5aJiZQMC5zb3J0KHk0KSxYPVAwLnNoaWZ0KCksWj1QMC5sZW5ndGgsZDUoWCl9ZmluYWxseXtQMC5sZW5ndGg9bDAuX19yPTB9fWZ1bmN0aW9uIGg0KFgsWixKLFkscSxRLEssVyxHLHosTyl7dmFyICQsXyxBLEMsVSxrLEksTT1ZJiZZLl9fa3x8YTAsaD1aLmxlbmd0aDtmb3IoRz1hNShKLFosTSxHLGgpLCQ9MDskPGg7JCsrKShBPUouX19rWyRdKSE9bnVsbCYmKF89QS5fX2khPS0xJiZNW0EuX19pXXx8ZDAsQS5fX2k9JCxrPUg0KFgsQSxfLHEsUSxLLFcsRyx6LE8pLEM9QS5fX2UsQS5yZWYmJl8ucmVmIT1BLnJlZiYmKF8ucmVmJiZQNChfLnJlZixudWxsLEEpLE8ucHVzaChBLnJlZixBLl9fY3x8QyxBKSksVT09bnVsbCYmQyE9bnVsbCYmKFU9QyksKEk9ISEoNCZBLl9fdSkpfHxfLl9faz09PUEuX19rPyhHPW00KEEsRyxYLEkpLEkmJl8uX19lJiYoXy5fX2U9bnVsbCkpOnR5cGVvZiBBLnR5cGU9PSJmdW5jdGlvbiImJmshPT12b2lkIDA/Rz1rOkMmJihHPUMubmV4dFNpYmxpbmcpLEEuX191Jj0tNyk7cmV0dXJuIEouX19lPVUsR31mdW5jdGlvbiBhNShYLFosSixZLHEpe3ZhciBRLEssVyxHLHosTz1KLmxlbmd0aCwkPU8sXz0wO2ZvcihYLl9faz1BcnJheShxKSxRPTA7UTxxO1ErKykoSz1aW1FdKSE9bnVsbCYmdHlwZW9mIEshPSJib29sZWFuIiYmdHlwZW9mIEshPSJmdW5jdGlvbiI/KHR5cGVvZiBLPT0ic3RyaW5nInx8dHlwZW9mIEs9PSJudW1iZXIifHx0eXBlb2YgSz09ImJpZ2ludCJ8fEsuY29uc3RydWN0b3I9PVN0cmluZz9LPVguX19rW1FdPWYwKG51bGwsSyxudWxsLG51bGwsbnVsbCk6YjAoSyk/Sz1YLl9fa1tRXT1mMChmLHtjaGlsZHJlbjpLfSxudWxsLG51bGwsbnVsbCk6Sy5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmSy5fX2I+MD9LPVguX19rW1FdPWYwKEsudHlwZSxLLnByb3BzLEsua2V5LEsucmVmP0sucmVmOm51bGwsSy5fX3YpOlguX19rW1FdPUssRz1RK18sSy5fXz1YLEsuX19iPVguX19iKzEsVz1udWxsLCh6PUsuX19pPWw1KEssSixHLCQpKSE9LTEmJigkLS0sKFc9Slt6XSkmJihXLl9fdXw9MikpLFc9PW51bGx8fFcuX192PT1udWxsPyh6PT0tMSYmKHE+Tz9fLS06cTxPJiZfKyspLHR5cGVvZiBLLnR5cGUhPSJmdW5jdGlvbiImJihLLl9fdXw9NCkpOnohPUcmJih6PT1HLTE/Xy0tOno9PUcrMT9fKys6KHo+Rz9fLS06XysrLEsuX191fD00KSkpOlguX19rW1FdPW51bGw7aWYoJClmb3IoUT0wO1E8TztRKyspKFc9SltRXSkhPW51bGwmJigyJlcuX191KT09MCYmKFcuX19lPT1ZJiYoWT1CMChXKSksYTQoVyxXKSk7cmV0dXJuIFl9ZnVuY3Rpb24gbTQoWCxaLEosWSl7dmFyIHEsUTtpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxRPTA7cSYmUTxxLmxlbmd0aDtRKyspcVtRXSYmKHFbUV0uX189WCxaPW00KHFbUV0sWixKLFkpKTtyZXR1cm4gWn1YLl9fZSE9WiYmKFkmJihaJiZYLnR5cGUmJiFaLnBhcmVudE5vZGUmJihaPUIwKFgpKSxKLmluc2VydEJlZm9yZShYLl9fZSxafHxudWxsKSksWj1YLl9fZSk7ZG8gWj1aJiZaLm5leHRTaWJsaW5nO3doaWxlKFohPW51bGwmJloubm9kZVR5cGU9PTgpO3JldHVybiBafWZ1bmN0aW9uIEwwKFgsWil7cmV0dXJuIFo9Wnx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KGIwKFgpP1guc29tZShmdW5jdGlvbihKKXtMMChKLFopfSk6Wi5wdXNoKFgpKSxafWZ1bmN0aW9uIGw1KFgsWixKLFkpe3ZhciBxLFEsSyxXPVgua2V5LEc9WC50eXBlLHo9WltKXSxPPXohPW51bGwmJigyJnouX191KT09MDtpZih6PT09bnVsbCYmVz09bnVsbHx8TyYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gSjtpZihZPihPPzE6MCkpe2ZvcihxPUotMSxRPUorMTtxPj0wfHxRPFoubGVuZ3RoOylpZigoej1aW0s9cT49MD9xLS06USsrXSkhPW51bGwmJigyJnouX191KT09MCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gS31yZXR1cm4tMX1mdW5jdGlvbiBTNChYLFosSil7WlswXT09Ii0iP1guc2V0UHJvcGVydHkoWixKPT1udWxsPyIiOkopOlhbWl09Sj09bnVsbD8iIjp0eXBlb2YgSiE9Im51bWJlciJ8fGY1LnRlc3QoWik/SjpKKyJweCJ9ZnVuY3Rpb24gaDAoWCxaLEosWSxxKXt2YXIgUSxLO1g6aWYoWj09InN0eWxlIilpZih0eXBlb2YgSj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PUo7ZWxzZXtpZih0eXBlb2YgWT09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9WT0iIiksWSlmb3IoWiBpbiBZKUomJlogaW4gSnx8UzQoWC5zdHlsZSxaLCIiKTtpZihKKWZvcihaIGluIEopWSYmSltaXT09WVtaXXx8UzQoWC5zdHlsZSxaLEpbWl0pfWVsc2UgaWYoWlswXT09Im8iJiZaWzFdPT0ibiIpUT1aIT0oWj1aLnJlcGxhY2UocDQsIiQxIikpLEs9Wi50b0xvd2VyQ2FzZSgpLFo9SyBpbiBYfHxaPT0ib25Gb2N1c091dCJ8fFo9PSJvbkZvY3VzSW4iP0suc2xpY2UoMik6Wi5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtaK1FdPUosSj9ZP0pbVDBdPVlbVDBdOihKW1QwXT1HNCxYLmFkZEV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilaPVoucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWiE9IndpZHRoIiYmWiE9ImhlaWdodCImJlohPSJocmVmIiYmWiE9Imxpc3QiJiZaIT0iZm9ybSImJlohPSJ0YWJJbmRleCImJlohPSJkb3dubG9hZCImJlohPSJyb3dTcGFuIiYmWiE9ImNvbFNwYW4iJiZaIT0icm9sZSImJlohPSJwb3BvdmVyIiYmWiBpbiBYKXRyeXtYW1pdPUo9PW51bGw/IiI6SjticmVhayBYfWNhdGNoKFcpe310eXBlb2YgSj09ImZ1bmN0aW9uInx8KEo9PW51bGx8fEo9PT0hMSYmWls0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFopOlguc2V0QXR0cmlidXRlKFosWj09InBvcG92ZXIiJiZKPT0xPyIiOkopKX19ZnVuY3Rpb24gUjQoWCl7cmV0dXJuIGZ1bmN0aW9uKFope2lmKHRoaXMubCl7dmFyIEo9dGhpcy5sW1oudHlwZStYXTtpZihaW20wXT09bnVsbClaW20wXT1HNCsrO2Vsc2UgaWYoWlttMF08SltUMF0pcmV0dXJuO3JldHVybiBKKEIuZXZlbnQ/Qi5ldmVudChaKTpaKX19fWZ1bmN0aW9uIEg0KFgsWixKLFkscSxRLEssVyxHLHope3ZhciBPLCQsXyxBLEMsVSxrLEksTSxoLEUsZSxaMCxnLEswLHM9Wi50eXBlO2lmKFouY29uc3RydWN0b3IhPT12b2lkIDApcmV0dXJuIG51bGw7MTI4JkouX191JiYoRz0hISgzMiZKLl9fdSksUT1bVz1aLl9fZT1KLl9fZV0pLChPPUIuX19iKSYmTyhaKTtYOmlmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXRyeXtpZihJPVoucHJvcHMsTT1zLnByb3RvdHlwZSYmcy5wcm90b3R5cGUucmVuZGVyLGg9KE89cy5jb250ZXh0VHlwZSkmJllbTy5fX2NdLEU9Tz9oP2gucHJvcHMudmFsdWU6Ty5fXzpZLEouX19jP2s9KCQ9Wi5fX2M9Si5fX2MpLl9fPSQuX19FOihNP1ouX19jPSQ9bmV3IHMoSSxFKTooWi5fX2M9JD1uZXcgaShJLEUpLCQuY29uc3RydWN0b3I9cywkLnJlbmRlcj1pNSksaCYmaC5zdWIoJCksJC5zdGF0ZXx8KCQuc3RhdGU9e30pLCQuX19uPVksXz0kLl9fZD0hMCwkLl9faD1bXSwkLl9zYj1bXSksTSYmJC5fX3M9PW51bGwmJigkLl9fcz0kLnN0YXRlKSxNJiZzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyE9bnVsbCYmKCQuX19zPT0kLnN0YXRlJiYoJC5fX3M9ejAoe30sJC5fX3MpKSx6MCgkLl9fcyxzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhJLCQuX19zKSkpLEE9JC5wcm9wcyxDPSQuc3RhdGUsJC5fX3Y9WixfKU0mJnMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiYkLmNvbXBvbmVudFdpbGxNb3VudCE9bnVsbCYmJC5jb21wb25lbnRXaWxsTW91bnQoKSxNJiYkLmNvbXBvbmVudERpZE1vdW50IT1udWxsJiYkLl9faC5wdXNoKCQuY29tcG9uZW50RGlkTW91bnQpO2Vsc2V7aWYoTSYmcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PW51bGwmJkkhPT1BJiYkLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPW51bGwmJiQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhJLEUpLFouX192PT1KLl9fdnx8ISQuX19lJiYkLnNob3VsZENvbXBvbmVudFVwZGF0ZSE9bnVsbCYmJC5zaG91bGRDb21wb25lbnRVcGRhdGUoSSwkLl9fcyxFKT09PSExKXtaLl9fdiE9Si5fX3YmJigkLnByb3BzPUksJC5zdGF0ZT0kLl9fcywkLl9fZD0hMSksWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssWi5fX2suc29tZShmdW5jdGlvbihyKXtyJiYoci5fXz1aKX0pLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdLCQuX19oLmxlbmd0aCYmSy5wdXNoKCQpO2JyZWFrIFh9JC5jb21wb25lbnRXaWxsVXBkYXRlIT1udWxsJiYkLmNvbXBvbmVudFdpbGxVcGRhdGUoSSwkLl9fcyxFKSxNJiYkLmNvbXBvbmVudERpZFVwZGF0ZSE9bnVsbCYmJC5fX2gucHVzaChmdW5jdGlvbigpeyQuY29tcG9uZW50RGlkVXBkYXRlKEEsQyxVKX0pfWlmKCQuY29udGV4dD1FLCQucHJvcHM9SSwkLl9fUD1YLCQuX19lPSExLGU9Qi5fX3IsWjA9MCxNKSQuc3RhdGU9JC5fX3MsJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdO2Vsc2UgZG8gJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLCQuc3RhdGU9JC5fX3M7d2hpbGUoJC5fX2QmJisrWjA8MjUpOyQuc3RhdGU9JC5fX3MsJC5nZXRDaGlsZENvbnRleHQhPW51bGwmJihZPXowKHowKHt9LFkpLCQuZ2V0Q2hpbGRDb250ZXh0KCkpKSxNJiYhXyYmJC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9bnVsbCYmKFU9JC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShBLEMpKSxnPU8hPW51bGwmJk8udHlwZT09PWYmJk8ua2V5PT1udWxsP2Q0KE8ucHJvcHMuY2hpbGRyZW4pOk8sVz1oNChYLGIwKGcpP2c6W2ddLFosSixZLHEsUSxLLFcsRyx6KSwkLmJhc2U9Wi5fX2UsWi5fX3UmPS0xNjEsJC5fX2gubGVuZ3RoJiZLLnB1c2goJCksayYmKCQuX19FPSQuX189bnVsbCl9Y2F0Y2gocil7aWYoWi5fX3Y9bnVsbCxHfHxRIT1udWxsKWlmKHIudGhlbil7Zm9yKFouX191fD1HPzE2MDoxMjg7VyYmVy5ub2RlVHlwZT09OCYmVy5uZXh0U2libGluZzspVz1XLm5leHRTaWJsaW5nO1FbUS5pbmRleE9mKFcpXT1udWxsLFouX19lPVd9ZWxzZXtmb3IoSzA9US5sZW5ndGg7SzAtLTspVjQoUVtLMF0pO040KFopfWVsc2UgWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssci50aGVufHxONChaKTtCLl9fZShyLFosSil9ZWxzZSBRPT1udWxsJiZaLl9fdj09Si5fX3Y/KFouX19rPUouX19rLFouX19lPUouX19lKTpXPVouX19lPWM1KEouX19lLFosSixZLHEsUSxLLEcseik7cmV0dXJuKE89Qi5kaWZmZWQpJiZPKFopLDEyOCZaLl9fdT92b2lkIDA6V31mdW5jdGlvbiBONChYKXtYJiYoWC5fX2MmJihYLl9fYy5fX2U9ITApLFguX19rJiZYLl9fay5zb21lKE40KSl9ZnVuY3Rpb24gZjQoWCxaLEope2Zvcih2YXIgWT0wO1k8Si5sZW5ndGg7WSsrKVA0KEpbWV0sSlsrK1ldLEpbKytZXSk7Qi5fX2MmJkIuX19jKFosWCksWC5zb21lKGZ1bmN0aW9uKHEpe3RyeXtYPXEuX19oLHEuX19oPVtdLFguc29tZShmdW5jdGlvbihRKXtRLmNhbGwocSl9KX1jYXRjaChRKXtCLl9fZShRLHEuX192KX19KX1mdW5jdGlvbiBkNChYKXtyZXR1cm4gdHlwZW9mIFghPSJvYmplY3QifHxYPT1udWxsfHxYLl9fYj4wP1g6YjAoWCk/WC5tYXAoZDQpOnowKHt9LFgpfWZ1bmN0aW9uIGM1KFgsWixKLFkscSxRLEssVyxHKXt2YXIgeixPLCQsXyxBLEMsVSxrPUoucHJvcHN8fGQwLEk9Wi5wcm9wcyxNPVoudHlwZTtpZihNPT0ic3ZnIj9xPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI6TT09Im1hdGgiP3E9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiOnF8fChxPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiksUSE9bnVsbCl7Zm9yKHo9MDt6PFEubGVuZ3RoO3orKylpZigoQT1RW3pdKSYmInNldEF0dHJpYnV0ZSJpbiBBPT0hIU0mJihNP0EubG9jYWxOYW1lPT1NOkEubm9kZVR5cGU9PTMpKXtYPUEsUVt6XT1udWxsO2JyZWFrfX1pZihYPT1udWxsKXtpZihNPT1udWxsKXJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShJKTtYPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhxLE0sSS5pcyYmSSksVyYmKEIuX19tJiZCLl9fbShaLFEpLFc9ITEpLFE9bnVsbH1pZihNPT1udWxsKWs9PT1JfHxXJiZYLmRhdGE9PUl8fChYLmRhdGE9SSk7ZWxzZXtpZihRPVEmJmMwLmNhbGwoWC5jaGlsZE5vZGVzKSwhVyYmUSE9bnVsbClmb3Ioaz17fSx6PTA7ejxYLmF0dHJpYnV0ZXMubGVuZ3RoO3orKylrWyhBPVguYXR0cmlidXRlc1t6XSkubmFtZV09QS52YWx1ZTtmb3IoeiBpbiBrKUE9a1t6XSx6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyQ9QTp6PT0iY2hpbGRyZW4ifHwoeiBpbiBJKXx8ej09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSSl8fHo9PSJjaGVja2VkIiYmKCJkZWZhdWx0Q2hlY2tlZCJpbiBJKXx8aDAoWCx6LG51bGwsQSxxKTtmb3IoeiBpbiBJKUE9SVt6XSx6PT0iY2hpbGRyZW4iP189QTp6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP089QTp6PT0idmFsdWUiP0M9QTp6PT0iY2hlY2tlZCI/VT1BOlcmJnR5cGVvZiBBIT0iZnVuY3Rpb24ifHxrW3pdPT09QXx8aDAoWCx6LEEsa1t6XSxxKTtpZihPKVd8fCQmJihPLl9faHRtbD09JC5fX2h0bWx8fE8uX19odG1sPT1YLmlubmVySFRNTCl8fChYLmlubmVySFRNTD1PLl9faHRtbCksWi5fX2s9W107ZWxzZSBpZigkJiYoWC5pbm5lckhUTUw9IiIpLGg0KFoudHlwZT09InRlbXBsYXRlIj9YLmNvbnRlbnQ6WCxiMChfKT9fOltfXSxaLEosWSxNPT0iZm9yZWlnbk9iamVjdCI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOnEsUSxLLFE/UVswXTpKLl9fayYmQjAoSiwwKSxXLEcpLFEhPW51bGwpZm9yKHo9US5sZW5ndGg7ei0tOylWNChRW3pdKTtXfHwoej0idmFsdWUiLE09PSJwcm9ncmVzcyImJkM9PW51bGw/WC5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik6QyE9bnVsbCYmKEMhPT1YW3pdfHxNPT0icHJvZ3Jlc3MiJiYhQ3x8TT09Im9wdGlvbiImJkMhPWtbel0pJiZoMChYLHosQyxrW3pdLHEpLHo9ImNoZWNrZWQiLFUhPW51bGwmJlUhPVhbel0mJmgwKFgseixVLGtbel0scSkpfXJldHVybiBYfWZ1bmN0aW9uIFA0KFgsWixKKXt0cnl7aWYodHlwZW9mIFg9PSJmdW5jdGlvbiIpe3ZhciBZPXR5cGVvZiBYLl9fdT09ImZ1bmN0aW9uIjtZJiZYLl9fdSgpLFkmJlo9PW51bGx8fChYLl9fdT1YKFopKX1lbHNlIFguY3VycmVudD1afWNhdGNoKHEpe0IuX19lKHEsSil9fWZ1bmN0aW9uIGE0KFgsWixKKXt2YXIgWSxxO2lmKEIudW5tb3VudCYmQi51bm1vdW50KFgpLChZPVgucmVmKSYmKFkuY3VycmVudCYmWS5jdXJyZW50IT1YLl9fZXx8UDQoWSxudWxsLFopKSwoWT1YLl9fYykhPW51bGwpe2lmKFkuY29tcG9uZW50V2lsbFVubW91bnQpdHJ5e1kuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChRKXtCLl9fZShRLFopfVkuYmFzZT1ZLl9fUD1udWxsfWlmKFk9WC5fX2spZm9yKHE9MDtxPFkubGVuZ3RoO3ErKylZW3FdJiZhNChZW3FdLFosSnx8dHlwZW9mIFgudHlwZSE9ImZ1bmN0aW9uIik7Snx8VjQoWC5fX2UpLFguX19jPVguX189WC5fX2U9dm9pZCAwfWZ1bmN0aW9uIGk1KFgsWixKKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcihYLEopfWZ1bmN0aW9uIGkwKFgsWixKKXt2YXIgWSxxLFEsSztaPT1kb2N1bWVudCYmKFo9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSxCLl9fJiZCLl9fKFgsWikscT0oWT10eXBlb2YgSj09ImZ1bmN0aW9uIik/bnVsbDpKJiZKLl9fa3x8Wi5fX2ssUT1bXSxLPVtdLEg0KFosWD0oIVkmJkp8fFopLl9faz1XMChmLG51bGwsW1hdKSxxfHxkMCxkMCxaLm5hbWVzcGFjZVVSSSwhWSYmSj9bSl06cT9udWxsOlouZmlyc3RDaGlsZD9jMC5jYWxsKFouY2hpbGROb2Rlcyk6bnVsbCxRLCFZJiZKP0o6cT9xLl9fZTpaLmZpcnN0Q2hpbGQsWSxLKSxmNChRLFgsSyl9ZnVuY3Rpb24gXzAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWSxxO3JldHVybiB0aGlzLmdldENoaWxkQ29udGV4dHx8KFk9bmV3IFNldCwocT17fSlbWi5fX2NdPXRoaXMsdGhpcy5nZXRDaGlsZENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcX0sdGhpcy5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1k9bnVsbH0sdGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oUSl7dGhpcy5wcm9wcy52YWx1ZSE9US52YWx1ZSYmWS5mb3JFYWNoKGZ1bmN0aW9uKEspe0suX19lPSEwLEw0KEspfSl9LHRoaXMuc3ViPWZ1bmN0aW9uKFEpe1kuYWRkKFEpO3ZhciBLPVEuY29tcG9uZW50V2lsbFVubW91bnQ7US5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1kmJlkuZGVsZXRlKFEpLEsmJksuY2FsbChRKX19KSxKLmNoaWxkcmVufXJldHVybiBaLl9fYz0iX19jQyIrZzQrKyxaLl9fPVgsWi5Qcm92aWRlcj1aLl9fbD0oWi5Db25zdW1lcj1mdW5jdGlvbihKLFkpe3JldHVybiBKLmNoaWxkcmVuKFkpfSkuY29udGV4dFR5cGU9WixafWMwPWEwLnNsaWNlLEI9e19fZTpmdW5jdGlvbihYLFosSixZKXtmb3IodmFyIHEsUSxLO1o9Wi5fXzspaWYoKHE9Wi5fX2MpJiYhcS5fXyl0cnl7aWYoKFE9cS5jb25zdHJ1Y3RvcikmJlEuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT1udWxsJiYocS5zZXRTdGF0ZShRLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihYKSksSz1xLl9fZCkscS5jb21wb25lbnREaWRDYXRjaCE9bnVsbCYmKHEuY29tcG9uZW50RGlkQ2F0Y2goWCxZfHx7fSksSz1xLl9fZCksSylyZXR1cm4gcS5fX0U9cX1jYXRjaChXKXtYPVd9dGhyb3cgWH19LGo0PTAsbTU9ZnVuY3Rpb24oWCl7cmV0dXJuIFghPW51bGwmJlguY29uc3RydWN0b3I9PT12b2lkIDB9LGkucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKFgsWil7dmFyIEo7Sj10aGlzLl9fcyE9bnVsbCYmdGhpcy5fX3MhPXRoaXMuc3RhdGU/dGhpcy5fX3M6dGhpcy5fX3M9ejAoe30sdGhpcy5zdGF0ZSksdHlwZW9mIFg9PSJmdW5jdGlvbiImJihYPVgoejAoe30sSiksdGhpcy5wcm9wcykpLFgmJnowKEosWCksWCE9bnVsbCYmdGhpcy5fX3YmJihaJiZ0aGlzLl9zYi5wdXNoKFopLEw0KHRoaXMpKX0saS5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oWCl7dGhpcy5fX3YmJih0aGlzLl9fZT0hMCxYJiZ0aGlzLl9faC5wdXNoKFgpLEw0KHRoaXMpKX0saS5wcm90b3R5cGUucmVuZGVyPWYsUDA9W10sdjQ9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTpzZXRUaW1lb3V0LHk0PWZ1bmN0aW9uKFgsWil7cmV0dXJuIFguX192Ll9fYi1aLl9fdi5fX2J9LGwwLl9fcj0wLCQ0PU1hdGgucmFuZG9tKCkudG9TdHJpbmcoOCksbTA9Il9fZCIrJDQsVDA9Il9fYSIrJDQscDQ9LyhQb2ludGVyQ2FwdHVyZSkkfENhcHR1cmUkL2ksRzQ9MCx6ND1SNCghMSksVzQ9UjQoITApLGc0PTA7dmFyIEYwLHAsTzQsbDQsUzA9MCxuND1bXSxkPUIsYzQ9ZC5fX2IsaTQ9ZC5fX3IsdTQ9ZC5kaWZmZWQsbzQ9ZC5fX2MsczQ9ZC51bm1vdW50LHI0PWQuX187ZnVuY3Rpb24gbzAoWCxaKXtkLl9faCYmZC5fX2gocCxYLFMwfHxaKSxTMD0wO3ZhciBKPXAuX19IfHwocC5fX0g9e19fOltdLF9faDpbXX0pO3JldHVybiBYPj1KLl9fLmxlbmd0aCYmSi5fXy5wdXNoKHt9KSxKLl9fW1hdfWZ1bmN0aW9uIFMoWCl7cmV0dXJuIFMwPTEsQTQoWDUsWCl9ZnVuY3Rpb24gQTQoWCxaLEope3ZhciBZPW8wKEYwKyssMik7aWYoWS50PVgsIVkuX19jJiYoWS5fXz1bSj9KKFopOlg1KHZvaWQgMCxaKSxmdW5jdGlvbihXKXt2YXIgRz1ZLl9fTj9ZLl9fTlswXTpZLl9fWzBdLHo9WS50KEcsVyk7RyE9PXomJihZLl9fTj1beixZLl9fWzFdXSxZLl9fYy5zZXRTdGF0ZSh7fSkpfV0sWS5fX2M9cCwhcC5fX2YpKXt2YXIgcT1mdW5jdGlvbihXLEcseil7aWYoIVkuX19jLl9fSClyZXR1cm4hMDt2YXIgTz1ZLl9fYy5fX0guX18uZmlsdGVyKGZ1bmN0aW9uKF8pe3JldHVybiBfLl9fY30pO2lmKE8uZXZlcnkoZnVuY3Rpb24oXyl7cmV0dXJuIV8uX19OfSkpcmV0dXJuIVF8fFEuY2FsbCh0aGlzLFcsRyx6KTt2YXIgJD1ZLl9fYy5wcm9wcyE9PVc7cmV0dXJuIE8uc29tZShmdW5jdGlvbihfKXtpZihfLl9fTil7dmFyIEE9Xy5fX1swXTtfLl9fPV8uX19OLF8uX19OPXZvaWQgMCxBIT09Xy5fX1swXSYmKCQ9ITApfX0pLFEmJlEuY2FsbCh0aGlzLFcsRyx6KXx8JH07cC5fX2Y9ITA7dmFye3Nob3VsZENvbXBvbmVudFVwZGF0ZTpRLGNvbXBvbmVudFdpbGxVcGRhdGU6S309cDtwLmNvbXBvbmVudFdpbGxVcGRhdGU9ZnVuY3Rpb24oVyxHLHope2lmKHRoaXMuX19lKXt2YXIgTz1RO1E9dm9pZCAwLHEoVyxHLHopLFE9T31LJiZLLmNhbGwodGhpcyxXLEcseil9LHAuc2hvdWxkQ29tcG9uZW50VXBkYXRlPXF9cmV0dXJuIFkuX19OfHxZLl9ffWZ1bmN0aW9uIHgoWCxaKXt2YXIgSj1vMChGMCsrLDMpOyFkLl9fcyYmZTQoSi5fX0gsWikmJihKLl9fPVgsSi51PVoscC5fX0guX19oLnB1c2goSikpfWZ1bmN0aW9uIHcoWCl7cmV0dXJuIFMwPTUsczAoZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpYfX0sW10pfWZ1bmN0aW9uIHMwKFgsWil7dmFyIEo9bzAoRjArKyw3KTtyZXR1cm4gZTQoSi5fX0gsWikmJihKLl9fPVgoKSxKLl9fSD1aLEouX19oPVgpLEouX199ZnVuY3Rpb24gaihYLFope3JldHVybiBTMD04LHMwKGZ1bmN0aW9uKCl7cmV0dXJuIFh9LFopfWZ1bmN0aW9uIFIwKFgpe3ZhciBaPXAuY29udGV4dFtYLl9fY10sSj1vMChGMCsrLDkpO3JldHVybiBKLmM9WCxaPyhKLl9fPT1udWxsJiYoSi5fXz0hMCxaLnN1YihwKSksWi5wcm9wcy52YWx1ZSk6WC5fX31mdW5jdGlvbiB1NSgpe2Zvcih2YXIgWDtYPW40LnNoaWZ0KCk7KXt2YXIgWj1YLl9fSDtpZihYLl9fUCYmWil0cnl7Wi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W119Y2F0Y2goSil7Wi5fX2g9W10sZC5fX2UoSixYLl9fdil9fX1kLl9fYj1mdW5jdGlvbihYKXtwPW51bGwsYzQmJmM0KFgpfSxkLl9fPWZ1bmN0aW9uKFgsWil7WCYmWi5fX2smJlouX19rLl9fbSYmKFguX19tPVouX19rLl9fbSkscjQmJnI0KFgsWil9LGQuX19yPWZ1bmN0aW9uKFgpe2k0JiZpNChYKSxGMD0wO3ZhciBaPShwPVguX19jKS5fX0g7WiYmKE80PT09cD8oWi5fX2g9W10scC5fX2g9W10sWi5fXy5zb21lKGZ1bmN0aW9uKEope0ouX19OJiYoSi5fXz1KLl9fTiksSi51PUouX19OPXZvaWQgMH0pKTooWi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W10sRjA9MCkpLE80PXB9LGQuZGlmZmVkPWZ1bmN0aW9uKFgpe3U0JiZ1NChYKTt2YXIgWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9faC5sZW5ndGgmJihuNC5wdXNoKFopIT09MSYmbDQ9PT1kLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KChsND1kLnJlcXVlc3RBbmltYXRpb25GcmFtZSl8fG81KSh1NSkpLFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7Si51JiYoSi5fX0g9Si51KSxKLnU9dm9pZCAwfSkpLE80PXA9bnVsbH0sZC5fX2M9ZnVuY3Rpb24oWCxaKXtaLnNvbWUoZnVuY3Rpb24oSil7dHJ5e0ouX19oLnNvbWUodTApLEouX19oPUouX19oLmZpbHRlcihmdW5jdGlvbihZKXtyZXR1cm4hWS5fX3x8VTQoWSl9KX1jYXRjaChZKXtaLnNvbWUoZnVuY3Rpb24ocSl7cS5fX2gmJihxLl9faD1bXSl9KSxaPVtdLGQuX19lKFksSi5fX3YpfX0pLG80JiZvNChYLFopfSxkLnVubW91bnQ9ZnVuY3Rpb24oWCl7czQmJnM0KFgpO3ZhciBaLEo9WC5fX2M7SiYmSi5fX0gmJihKLl9fSC5fXy5zb21lKGZ1bmN0aW9uKFkpe3RyeXt1MChZKX1jYXRjaChxKXtaPXF9fSksSi5fX0g9dm9pZCAwLFomJmQuX19lKFosSi5fX3YpKX07dmFyIHQ0PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiI7ZnVuY3Rpb24gbzUoWCl7dmFyIFosSj1mdW5jdGlvbigpe2NsZWFyVGltZW91dChZKSx0NCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoWiksc2V0VGltZW91dChYKX0sWT1zZXRUaW1lb3V0KEosMzUpO3Q0JiYoWj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoSikpfWZ1bmN0aW9uIHUwKFgpe3ZhciBaPXAsSj1YLl9fYzt0eXBlb2YgSj09ImZ1bmN0aW9uIiYmKFguX19jPXZvaWQgMCxKKCkpLHA9Wn1mdW5jdGlvbiBVNChYKXt2YXIgWj1wO1guX19jPVguX18oKSxwPVp9ZnVuY3Rpb24gZTQoWCxaKXtyZXR1cm4hWHx8WC5sZW5ndGghPT1aLmxlbmd0aHx8Wi5zb21lKGZ1bmN0aW9uKEosWSl7cmV0dXJuIEohPT1YW1ldfSl9ZnVuY3Rpb24gWDUoWCxaKXtyZXR1cm4gdHlwZW9mIFo9PSJmdW5jdGlvbiI/WihYKTpafWZ1bmN0aW9uIFo2KFgsWil7Zm9yKHZhciBKIGluIFopWFtKXT1aW0pdO3JldHVybiBYfWZ1bmN0aW9uIFo1KFgsWil7Zm9yKHZhciBKIGluIFgpaWYoSiE9PSJfX3NvdXJjZSImJiEoSiBpbiBaKSlyZXR1cm4hMDtmb3IodmFyIFkgaW4gWilpZihZIT09Il9fc291cmNlIiYmWFtZXSE9PVpbWV0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gSjUoWCxaKXt0aGlzLnByb3BzPVgsdGhpcy5jb250ZXh0PVp9KEo1LnByb3RvdHlwZT1uZXcgaSkuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITAsSjUucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihYLFope3JldHVybiBaNSh0aGlzLnByb3BzLFgpfHxaNSh0aGlzLnN0YXRlLFopfTt2YXIgWTU9Qi5fX2I7Qi5fX2I9ZnVuY3Rpb24oWCl7WC50eXBlJiZYLnR5cGUuX19mJiZYLnJlZiYmKFgucHJvcHMucmVmPVgucmVmLFgucmVmPW51bGwpLFk1JiZZNShYKX07dmFyIEo2PUIuX19lO0IuX19lPWZ1bmN0aW9uKFgsWixKLFkpe2lmKFgudGhlbil7Zm9yKHZhciBxLFE9WjtRPVEuX187KWlmKChxPVEuX19jKSYmcS5fX2MpcmV0dXJuIFouX19lPT1udWxsJiYoWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2spLHEuX19jKFgsWil9SjYoWCxaLEosWSl9O3ZhciBxNT1CLnVubW91bnQ7ZnVuY3Rpb24gTDUoWCxaLEope3JldHVybiBYJiYoWC5fX2MmJlguX19jLl9fSCYmKFguX19jLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKFkpe3R5cGVvZiBZLl9fYz09ImZ1bmN0aW9uIiYmWS5fX2MoKX0pLFguX19jLl9fSD1udWxsKSwoWD1aNih7fSxYKSkuX19jIT1udWxsJiYoWC5fX2MuX19QPT09SiYmKFguX19jLl9fUD1aKSxYLl9fYy5fX2U9ITAsWC5fX2M9bnVsbCksWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihZKXtyZXR1cm4gTDUoWSxaLEopfSkpLFh9ZnVuY3Rpb24gTjUoWCxaLEope3JldHVybiBYJiZKJiYoWC5fX3Y9bnVsbCxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBONShZLFosSil9KSxYLl9fYyYmWC5fX2MuX19QPT09WiYmKFguX19lJiZKLmFwcGVuZENoaWxkKFguX19lKSxYLl9fYy5fX2U9ITAsWC5fX2MuX19QPUopKSxYfWZ1bmN0aW9uIEI0KCl7dGhpcy5fX3U9MCx0aGlzLm89bnVsbCx0aGlzLl9fYj1udWxsfWZ1bmN0aW9uIEc1KFgpe3ZhciBaPVguX18mJlguX18uX19jO3JldHVybiBaJiZaLl9fYSYmWi5fX2EoWCl9ZnVuY3Rpb24gcjAoKXt0aGlzLmk9bnVsbCx0aGlzLmw9bnVsbH1CLnVubW91bnQ9ZnVuY3Rpb24oWCl7dmFyIFo9WC5fX2M7WiYmKFouX196PSEwKSxaJiZaLl9fUiYmWi5fX1IoKSxaJiYzMiZYLl9fdSYmKFgudHlwZT1udWxsKSxxNSYmcTUoWCl9LChCNC5wcm90b3R5cGU9bmV3IGkpLl9fYz1mdW5jdGlvbihYLFope3ZhciBKPVouX19jLFk9dGhpcztZLm89PW51bGwmJihZLm89W10pLFkuby5wdXNoKEopO3ZhciBxPUc1KFkuX192KSxRPSExLEs9ZnVuY3Rpb24oKXtRfHxZLl9fenx8KFE9ITAsSi5fX1I9bnVsbCxxP3EoRyk6RygpKX07Si5fX1I9Szt2YXIgVz1KLl9fUDtKLl9fUD1udWxsO3ZhciBHPWZ1bmN0aW9uKCl7aWYoIS0tWS5fX3Upe2lmKFkuc3RhdGUuX19hKXt2YXIgej1ZLnN0YXRlLl9fYTtZLl9fdi5fX2tbMF09TjUoeix6Ll9fYy5fX1Asei5fX2MuX19PKX12YXIgTztmb3IoWS5zZXRTdGF0ZSh7X19hOlkuX19iPW51bGx9KTtPPVkuby5wb3AoKTspTy5fX1A9VyxPLmZvcmNlVXBkYXRlKCl9fTtZLl9fdSsrfHwzMiZaLl9fdXx8WS5zZXRTdGF0ZSh7X19hOlkuX19iPVkuX192Ll9fa1swXX0pLFgudGhlbihLLEspfSxCNC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLm89W119LEI0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCxaKXtpZih0aGlzLl9fYil7aWYodGhpcy5fX3YuX19rKXt2YXIgSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxZPXRoaXMuX192Ll9fa1swXS5fX2M7dGhpcy5fX3YuX19rWzBdPUw1KHRoaXMuX19iLEosWS5fX089WS5fX1ApfXRoaXMuX19iPW51bGx9dmFyIHE9Wi5fX2EmJlcwKGYsbnVsbCxYLmZhbGxiYWNrKTtyZXR1cm4gcSYmKHEuX191Jj0tMzMpLFtXMChmLG51bGwsWi5fX2E/bnVsbDpYLmNoaWxkcmVuKSxxXX07dmFyIFE1PWZ1bmN0aW9uKFgsWixKKXtpZigrK0pbMV09PT1KWzBdJiZYLmwuZGVsZXRlKFopLFgucHJvcHMucmV2ZWFsT3JkZXImJihYLnByb3BzLnJldmVhbE9yZGVyWzBdIT09InQifHwhWC5sLnNpemUpKWZvcihKPVguaTtKOyl7Zm9yKDtKLmxlbmd0aD4zOylKLnBvcCgpKCk7aWYoSlsxXTxKWzBdKWJyZWFrO1guaT1KPUpbMl19fTsocjAucHJvdG90eXBlPW5ldyBpKS5fX2E9ZnVuY3Rpb24oWCl7dmFyIFo9dGhpcyxKPUc1KFouX192KSxZPVoubC5nZXQoWCk7cmV0dXJuIFlbMF0rKyxmdW5jdGlvbihxKXt2YXIgUT1mdW5jdGlvbigpe1oucHJvcHMucmV2ZWFsT3JkZXI/KFkucHVzaChxKSxRNShaLFgsWSkpOnEoKX07Sj9KKFEpOlEoKX19LHIwLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCl7dGhpcy5pPW51bGwsdGhpcy5sPW5ldyBNYXA7dmFyIFo9TDAoWC5jaGlsZHJlbik7WC5yZXZlYWxPcmRlciYmWC5yZXZlYWxPcmRlclswXT09PSJiIiYmWi5yZXZlcnNlKCk7Zm9yKHZhciBKPVoubGVuZ3RoO0otLTspdGhpcy5sLnNldChaW0pdLHRoaXMuaT1bMSwwLHRoaXMuaV0pO3JldHVybiBYLmNoaWxkcmVufSxyMC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPXIwLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBYPXRoaXM7dGhpcy5sLmZvckVhY2goZnVuY3Rpb24oWixKKXtRNShYLEosWil9KX07dmFyIFk2PXR5cGVvZiBTeW1ib2w8InUiJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzLHE2PS9eKD86YWNjZW50fGFsaWdubWVudHxhcmFiaWN8YmFzZWxpbmV8Y2FwfGNsaXAoPyFQYXRoVSl8Y29sb3J8ZG9taW5hbnR8ZmlsbHxmbG9vZHxmb250fGdseXBoKD8hUil8aG9yaXp8aW1hZ2UoIVMpfGxldHRlcnxsaWdodGluZ3xtYXJrZXIoPyFIfFd8VSl8b3ZlcmxpbmV8cGFpbnR8cG9pbnRlcnxzaGFwZXxzdG9wfHN0cmlrZXRocm91Z2h8c3Ryb2tlfHRleHQoPyFMKXx0cmFuc2Zvcm18dW5kZXJsaW5lfHVuaWNvZGV8dW5pdHN8dnx2ZWN0b3J8dmVydHx3b3JkfHdyaXRpbmd8eCg/IUMpKVtBLVpdLyxRNj0vXm9uKEFuaXxUcmF8VG91fEJlZm9yZUlucHxDb21wbykvLEs2PS9bQS1aMC05XS9nLCQ2PXR5cGVvZiBkb2N1bWVudDwidSIsejY9ZnVuY3Rpb24oWCl7cmV0dXJuKHR5cGVvZiBTeW1ib2w8InUiJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiPy9maWx8Y2hlfHJhZC86L2ZpbHxjaGV8cmEvKS50ZXN0KFgpfTtmdW5jdGlvbiBWNShYLFosSil7cmV0dXJuIFouX19rPT1udWxsJiYoWi50ZXh0Q29udGVudD0iIiksaTAoWCxaKSx0eXBlb2YgSj09ImZ1bmN0aW9uIiYmSigpLFg/WC5fX2M6bnVsbH1pLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PSEwLFsiY29tcG9uZW50V2lsbE1vdW50IiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsImNvbXBvbmVudFdpbGxVcGRhdGUiXS5mb3JFYWNoKGZ1bmN0aW9uKFgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnByb3RvdHlwZSxYLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbIlVOU0FGRV8iK1hdfSxzZXQ6ZnVuY3Rpb24oWil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsWCx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlp9KX19KX0pO3ZhciBLNT1CLmV2ZW50O0IuZXZlbnQ9ZnVuY3Rpb24oWCl7cmV0dXJuIEs1JiYoWD1LNShYKSksWC5wZXJzaXN0PWZ1bmN0aW9uKCl7fSxYLmlzUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuY2VsQnViYmxlfSxYLmlzRGVmYXVsdFByZXZlbnRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlZmF1bHRQcmV2ZW50ZWR9LFgubmF0aXZlRXZlbnQ9WH07dmFyIEg1LFc2PXtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xhc3N9fSwkNT1CLnZub2RlO0Iudm5vZGU9ZnVuY3Rpb24oWCl7dHlwZW9mIFgudHlwZT09InN0cmluZyImJmZ1bmN0aW9uKFope3Zhcntwcm9wczpKLHR5cGU6WX09WixxPXt9LFE9WS5pbmRleE9mKCItIik9PS0xO2Zvcih2YXIgSyBpbiBKKXt2YXIgVz1KW0tdO2lmKCEoSz09PSJ2YWx1ZSImJigiZGVmYXVsdFZhbHVlImluIEopJiZXPT1udWxsfHwkNiYmSz09PSJjaGlsZHJlbiImJlk9PT0ibm9zY3JpcHQifHxLPT09ImNsYXNzInx8Sz09PSJjbGFzc05hbWUiKSl7dmFyIEc9Sy50b0xvd2VyQ2FzZSgpO0s9PT0iZGVmYXVsdFZhbHVlIiYmInZhbHVlImluIEomJkoudmFsdWU9PW51bGw/Sz0idmFsdWUiOks9PT0iZG93bmxvYWQiJiZXPT09ITA/Vz0iIjpHPT09InRyYW5zbGF0ZSImJlc9PT0ibm8iP1c9ITE6R1swXT09PSJvIiYmR1sxXT09PSJuIj9HPT09Im9uZG91YmxlY2xpY2siP0s9Im9uZGJsY2xpY2siOkchPT0ib25jaGFuZ2UifHxZIT09ImlucHV0IiYmWSE9PSJ0ZXh0YXJlYSJ8fHo2KEoudHlwZSk/Rz09PSJvbmZvY3VzIj9LPSJvbmZvY3VzaW4iOkc9PT0ib25ibHVyIj9LPSJvbmZvY3Vzb3V0IjpRNi50ZXN0KEspJiYoSz1HKTpHPUs9Im9uaW5wdXQiOlEmJnE2LnRlc3QoSyk/Sz1LLnJlcGxhY2UoSzYsIi0kJiIpLnRvTG93ZXJDYXNlKCk6Vz09PW51bGwmJihXPXZvaWQgMCksRz09PSJvbmlucHV0IiYmcVtLPUddJiYoSz0ib25pbnB1dENhcHR1cmUiKSxxW0tdPVd9fVk9PSJzZWxlY3QiJiYocS5tdWx0aXBsZSYmQXJyYXkuaXNBcnJheShxLnZhbHVlKSYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEudmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTF9KSkscS5kZWZhdWx0VmFsdWUhPW51bGwmJihxLnZhbHVlPUwwKEouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oeil7ei5wcm9wcy5zZWxlY3RlZD1xLm11bHRpcGxlP3EuZGVmYXVsdFZhbHVlLmluZGV4T2Yoei5wcm9wcy52YWx1ZSkhPS0xOnEuZGVmYXVsdFZhbHVlPT16LnByb3BzLnZhbHVlfSkpKSxKLmNsYXNzJiYhSi5jbGFzc05hbWU/KHEuY2xhc3M9Si5jbGFzcyxPYmplY3QuZGVmaW5lUHJvcGVydHkocSwiY2xhc3NOYW1lIixXNikpOkouY2xhc3NOYW1lJiYocS5jbGFzcz1xLmNsYXNzTmFtZT1KLmNsYXNzTmFtZSksWi5wcm9wcz1xfShYKSxYLiQkdHlwZW9mPVk2LCQ1JiYkNShYKX07dmFyIHo1PUIuX19yO0IuX19yPWZ1bmN0aW9uKFgpe3o1JiZ6NShYKSxINT1YLl9fY307dmFyIFc1PUIuZGlmZmVkO0IuZGlmZmVkPWZ1bmN0aW9uKFgpe1c1JiZXNShYKTt2YXJ7cHJvcHM6WixfX2U6Sn09WDtKIT1udWxsJiZYLnR5cGU9PT0idGV4dGFyZWEiJiYidmFsdWUiaW4gWiYmWi52YWx1ZSE9PUoudmFsdWUmJihKLnZhbHVlPVoudmFsdWU9PW51bGw/IiI6Wi52YWx1ZSksSDU9bnVsbH07ZnVuY3Rpb24gUDUoWCl7cmV0dXJuISFYLl9fayYmKGkwKG51bGwsWCksITApfWZ1bmN0aW9uIE81KFgpe3JldHVybntyZW5kZXI6ZnVuY3Rpb24oWil7VjUoWixYKX0sdW5tb3VudDpmdW5jdGlvbigpe1A1KFgpfX19ZnVuY3Rpb24gQzUoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVTUoWCxaKXtmb3IodmFyIEogaW4gWClpZihKIT09Il9fc291cmNlIiYmIShKIGluIFopKXJldHVybiEwO2Zvcih2YXIgWSBpbiBaKWlmKFkhPT0iX19zb3VyY2UiJiZYW1ldIT09WltZXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBBNShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn0oQTUucHJvdG90eXBlPW5ldyBpKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxBNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWil7cmV0dXJuIFU1KHRoaXMucHJvcHMsWCl8fFU1KHRoaXMuc3RhdGUsWil9O3ZhciBCNT1CLl9fYjtCLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksQjUmJkI1KFgpfTt2YXIgTDY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIil8fDM5MTE7ZnVuY3Rpb24gRDAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWT1DNSh7fSxKKTtyZXR1cm4gZGVsZXRlIFkucmVmLFgoWSxKLnJlZnx8bnVsbCl9cmV0dXJuIFouJCR0eXBlb2Y9TDYsWi5yZW5kZXI9WCxaLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PVouX19mPSEwLFouZGlzcGxheU5hbWU9IkZvcndhcmRSZWYoIisoWC5kaXNwbGF5TmFtZXx8WC5uYW1lKSsiKSIsWn12YXIgTjY9Qi5fX2U7Qi5fX2U9ZnVuY3Rpb24oWCxaLEosWSl7aWYoWC50aGVuKXtmb3IodmFyIHEsUT1aO1E9US5fXzspaWYoKHE9US5fX2MpJiZxLl9fYylyZXR1cm4gWi5fX2U9PW51bGwmJihaLl9fZT1KLl9fZSxaLl9faz1KLl9faykscS5fX2MoWCxaKX1ONihYLFosSixZKX07dmFyIF81PUIudW5tb3VudDtmdW5jdGlvbiBFNShYLFosSil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oWSl7dHlwZW9mIFkuX19jPT0iZnVuY3Rpb24iJiZZLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPUM1KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1KJiYoWC5fX2MuX19QPVopLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBFNShZLFosSil9KSksWH1mdW5jdGlvbiB3NShYLFosSil7cmV0dXJuIFgmJkomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oWSl7cmV0dXJuIHc1KFksWixKKX0pLFguX19jJiZYLl9fYy5fX1A9PT1aJiYoWC5fX2UmJkouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9SikpLFh9ZnVuY3Rpb24gRjQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gVDUoWCl7dmFyIFo9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFomJlouX19hJiZaLl9fYShYKX1mdW5jdGlvbiB0MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfUIudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWj1YLl9fYztaJiYoWi5fX3o9ITApLFomJlouX19SJiZaLl9fUigpLFomJjMyJlguX191JiYoWC50eXBlPW51bGwpLF81JiZfNShYKX0sKEY0LnByb3RvdHlwZT1uZXcgaSkuX19jPWZ1bmN0aW9uKFgsWil7dmFyIEo9Wi5fX2MsWT10aGlzO1kubz09bnVsbCYmKFkubz1bXSksWS5vLnB1c2goSik7dmFyIHE9VDUoWS5fX3YpLFE9ITEsSz1mdW5jdGlvbigpe1F8fFkuX196fHwoUT0hMCxKLl9fUj1udWxsLHE/cShHKTpHKCkpfTtKLl9fUj1LO3ZhciBXPUouX19QO0ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1ZLl9fdSl7aWYoWS5zdGF0ZS5fX2Epe3ZhciB6PVkuc3RhdGUuX19hO1kuX192Ll9fa1swXT13NSh6LHouX19jLl9fUCx6Ll9fYy5fX08pfXZhciBPO2ZvcihZLnNldFN0YXRlKHtfX2E6WS5fX2I9bnVsbH0pO089WS5vLnBvcCgpOylPLl9fUD1XLE8uZm9yY2VVcGRhdGUoKX19O1kuX191Kyt8fDMyJlouX191fHxZLnNldFN0YXRlKHtfX2E6WS5fX2I9WS5fX3YuX19rWzBdfSksWC50aGVuKEssSyl9LEY0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sRjQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFope2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBKPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFk9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09RTUodGhpcy5fX2IsSixZLl9fTz1ZLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1aLl9fYSYmVzAoZixudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1cwKGYsbnVsbCxaLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgRjU9ZnVuY3Rpb24oWCxaLEope2lmKCsrSlsxXT09PUpbMF0mJlgubC5kZWxldGUoWiksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKEo9WC5pO0o7KXtmb3IoO0oubGVuZ3RoPjM7KUoucG9wKCkoKTtpZihKWzFdPEpbMF0pYnJlYWs7WC5pPUo9SlsyXX19Oyh0MC5wcm90b3R5cGU9bmV3IGkpLl9fYT1mdW5jdGlvbihYKXt2YXIgWj10aGlzLEo9VDUoWi5fX3YpLFk9Wi5sLmdldChYKTtyZXR1cm4gWVswXSsrLGZ1bmN0aW9uKHEpe3ZhciBRPWZ1bmN0aW9uKCl7Wi5wcm9wcy5yZXZlYWxPcmRlcj8oWS5wdXNoKHEpLEY1KFosWCxZKSk6cSgpfTtKP0ooUSk6USgpfX0sdDAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWj1MMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZaLnJldmVyc2UoKTtmb3IodmFyIEo9Wi5sZW5ndGg7Si0tOyl0aGlzLmwuc2V0KFpbSl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHQwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9dDAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihaLEope0Y1KFgsSixaKX0pfTt2YXIgRzY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsVjY9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLEg2PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sUDY9L1tBLVowLTldL2csTzY9dHlwZW9mIGRvY3VtZW50PCJ1IixVNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2kucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihaKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Wn0pfX0pfSk7dmFyIEQ1PUIuZXZlbnQ7Qi5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gRDUmJihYPUQ1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgYjUsQTY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LGs1PUIudm5vZGU7Qi52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWil7dmFye3Byb3BzOkosdHlwZTpZfT1aLHE9e30sUT1ZLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBLIGluIEope3ZhciBXPUpbS107aWYoIShLPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSikmJlc9PW51bGx8fE82JiZLPT09ImNoaWxkcmVuIiYmWT09PSJub3NjcmlwdCJ8fEs9PT0iY2xhc3MifHxLPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1LLnRvTG93ZXJDYXNlKCk7Sz09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gSiYmSi52YWx1ZT09bnVsbD9LPSJ2YWx1ZSI6Sz09PSJkb3dubG9hZCImJlc9PT0hMD9XPSIiOkc9PT0idHJhbnNsYXRlIiYmVz09PSJubyI/Vz0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/Sz0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fFkhPT0iaW5wdXQiJiZZIT09InRleHRhcmVhInx8VTYoSi50eXBlKT9HPT09Im9uZm9jdXMiP0s9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP0s9Im9uZm9jdXNvdXQiOkg2LnRlc3QoSykmJihLPUcpOkc9Sz0ib25pbnB1dCI6USYmVjYudGVzdChLKT9LPUsucmVwbGFjZShQNiwiLSQmIikudG9Mb3dlckNhc2UoKTpXPT09bnVsbCYmKFc9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW0s9R10mJihLPSJvbmlucHV0Q2FwdHVyZSIpLHFbS109V319WT09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1MMChKLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKHope3oucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKHoucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PXoucHJvcHMudmFsdWV9KSkpLEouY2xhc3MmJiFKLmNsYXNzTmFtZT8ocS5jbGFzcz1KLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEE2KSk6Si5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPUouY2xhc3NOYW1lKSxaLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9RzYsazUmJms1KFgpfTt2YXIgSTU9Qi5fX3I7Qi5fX3I9ZnVuY3Rpb24oWCl7STUmJkk1KFgpLGI1PVguX19jfTt2YXIgTTU9Qi5kaWZmZWQ7Qi5kaWZmZWQ9ZnVuY3Rpb24oWCl7TTUmJk01KFgpO3Zhcntwcm9wczpaLF9fZTpKfT1YO0ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlIT09Si52YWx1ZSYmKEoudmFsdWU9Wi52YWx1ZT09bnVsbD8iIjpaLnZhbHVlKSxiNT1udWxsfTt2YXIgQjY9MDtmdW5jdGlvbiBOKFgsWixKLFkscSxRKXtafHwoWj17fSk7dmFyIEssVyxHPVo7aWYoInJlZiJpbiBHKWZvcihXIGluIEc9e30sWilXPT0icmVmIj9LPVpbV106R1tXXT1aW1ddO3ZhciB6PXt0eXBlOlgscHJvcHM6RyxrZXk6SixyZWY6SyxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6LS1CNixfX2k6LTEsX191OjAsX19zb3VyY2U6cSxfX3NlbGY6UX07aWYodHlwZW9mIFg9PSJmdW5jdGlvbiImJihLPVguZGVmYXVsdFByb3BzKSlmb3IoVyBpbiBLKUdbV109PT12b2lkIDAmJihHW1ddPUtbV10pO3JldHVybiBCLnZub2RlJiZCLnZub2RlKHopLHp9dmFyIEQ0PWB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjAnIGhlaWdodD0nMjAnJTNFJTNDY2lyY2xlIGN4PScxMCcgY3k9JzEwJyByPSc5JyBmaWxsPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNCknIHN0cm9rZT0ncmdiYSgyNTUsMjU1LDI1NSwwLjcpJyBzdHJva2Utd2lkdGg9JzEnLyUzRSUzQy9zdmclM0UiKSAxMCAxMCwgcG9pbnRlcmAsXzY9MyxGNj00LEQ2PTU7ZnVuY3Rpb24gbjAoe3VybDpYLHdzVXJsOlosc3R5bGU6SixpbWFnZVN0eWxlOlksY2xhc3NOYW1lOnEsb25Ib21lUHJlc3M6USxvblN0cmVhbVRvdWNoOkssb25TdHJlYW1NdWx0aVRvdWNoOlcsb25TdHJlYW1CdXR0b246RyxzdWJzY3JpYmVGcmFtZTp6LHN0cmVhbUZyYW1lOk8sc3RyZWFtQ29uZmlnOiQsaGlkZUNvbnRyb2xzOl8sb25TdHJlYW1pbmdDaGFuZ2U6QSxjb25uZWN0aW9uUXVhbGl0eTpDfSl7bGV0IFU9ISFLLGs9dyhudWxsKSxJPXcobnVsbCksTT13KG51bGwpLFtoLEVdPVMoITEpLFtlLFowXT1TKG51bGwpLFtnLEswXT1TKG51bGwpLHM9dyhudWxsKSxbcixVMF09UyhudWxsKTt4KCgpPT57bGV0IFY9cy5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKEwpPT57bGV0IFA9TFswXT8uY29udGVudFJlY3Q7aWYoUClVMCh7d2lkdGg6UC53aWR0aCxoZWlnaHQ6UC5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W2owLHYwXT1TKDApLEcwPXcoMCksW0o0LEkwXT1TKCExKSxGPXcobnVsbCk7eCgoKT0+e2lmKEM9PT0icG9vciIpe2lmKEkwKCEwKSxGLmN1cnJlbnQpY2xlYXJUaW1lb3V0KEYuY3VycmVudCk7Ri5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntJMCghMSksRi5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYoSTAoITEpLEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KSxGLmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KX19LFtDXSk7bGV0IFI9YCR7WH0vc3RyZWFtLm1qcGVnYCx2PXcoQSk7di5jdXJyZW50PUEseCgoKT0+e3YuY3VycmVudD8uKGgpfSxbaF0pLHgoKCk9PntpZihVJiYkKUswKCQpfSxbVSwkXSk7bGV0IFQ9dyghMSk7VC5jdXJyZW50PWg7bGV0IHU9dyhudWxsKTt4KCgpPT57aWYoIVV8fCF6KXJldHVybjtsZXQgSD1zZXRUaW1lb3V0KCgpPT57aWYoIVQuY3VycmVudClaMCgiU3RyZWFtIGlzIG5vdCBwcm9kdWNpbmcgZnJhbWVzLiBUaGUgc2ltdWxhdG9yIG1heSBoYXZlIHN0b3BwZWQg4oCUIHRyeSByZWNvbm5lY3RpbmcuIil9LDYwMDApLEw9eigoUCk9PntHMC5jdXJyZW50KyssWDAuY3VycmVudD1EYXRlLm5vdygpO2xldCBEPUkuY3VycmVudDtpZihEKXtpZih1LmN1cnJlbnQpVVJMLnJldm9rZU9iamVjdFVSTCh1LmN1cnJlbnQpO3UuY3VycmVudD1QLEQuc3JjPVB9aWYoIVQuY3VycmVudCljbGVhclRpbWVvdXQoSCksRSghMCksWjAobnVsbCl9KTtyZXR1cm4oKT0+e2NsZWFyVGltZW91dChIKSxMPy4oKX19LFtVLHpdKTtsZXQgbT1qKChWKT0+e2lmKFUpe0s/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KFYpKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09XzYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEtdKSxKMD1qKChWKT0+e2lmKFUpe0c/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHtidXR0b246Vn0pKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09RjYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEddKSx5PWooKFYpPT57aWYoVSl7Vz8uKFYpO3JldHVybn1sZXQgSD1NLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLFA9bmV3IFVpbnQ4QXJyYXkoMStMLmxlbmd0aCk7UFswXT1ENixQLnNldChMLDEpLEguc2VuZChQKX0sW1UsV10pO3goKCk9PntpZihVKXJldHVybjtmZXRjaChgJHtYfS9jb25maWdgKS50aGVuKChsKT0+bC5qc29uKCkpLnRoZW4oKGwpPT57aWYobC53aWR0aD4wJiZsLmhlaWdodD4wKUswKGwpfSkuY2F0Y2goKCk9Pnt9KTtsZXQgVj1aPz9YLnJlcGxhY2UoL15odHRwLywid3MiKSsiL3dzIixIPW5ldyBXZWJTb2NrZXQoVik7SC5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsTS5jdXJyZW50PUgsSC5vbm9wZW49KCk9PntFKCEwKSxaMChudWxsKX0sSC5vbmNsb3NlPSgpPT57RSghMSl9LEgub25lcnJvcj0oKT0+e1owKCJXZWJTb2NrZXQgY29ubmVjdGlvbiBmYWlsZWQiKSxFKCExKX07bGV0IEw9bmV3IEFib3J0Q29udHJvbGxlcixQPXNldEludGVydmFsKCgpPT57djAoRzAuY3VycmVudCksRzAuY3VycmVudD0wfSwxMDAwKSxEPSExLGI9c2V0VGltZW91dCgoKT0+e2lmKCFEKVowKCJTdHJlYW0gaXMgbm90IHByb2R1Y2luZyBmcmFtZXMuIFRoZSBzaW11bGF0b3IgbWF5IGhhdmUgc3RvcHBlZCDigJQgdHJ5IHJlY29ubmVjdGluZy4iKX0sNjAwMCk7cmV0dXJuKGFzeW5jKCk9Pnt0cnl7bGV0IG49KGF3YWl0IGZldGNoKFIse3NpZ25hbDpMLnNpZ25hbH0pKS5ib2R5Py5nZXRSZWFkZXIoKTtpZighbilyZXR1cm47bGV0IFEwPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiLS1mcmFtZSIpO3doaWxlKCEwKXtsZXR7ZG9uZTpoNSx2YWx1ZTpRNH09YXdhaXQgbi5yZWFkKCk7aWYoaDUpYnJlYWs7aWYoUTQpZm9yKGxldCBLND0wO0s0PD1RNC5sZW5ndGgtUTAubGVuZ3RoO0s0Kyspe2xldCBUND0hMDtmb3IobGV0IHgwPTA7eDA8UTAubGVuZ3RoO3gwKyspaWYoUTRbSzQreDBdIT09UTBbeDBdKXtUND0hMTticmVha31pZihUNCl7aWYoRzAuY3VycmVudCsrLCFEKUQ9ITAsY2xlYXJUaW1lb3V0KGIpfX19fWNhdGNoe319KSgpLCgpPT57TC5hYm9ydCgpLGNsZWFySW50ZXJ2YWwoUCksY2xlYXJUaW1lb3V0KGIpLEguY2xvc2UoKSxNLmN1cnJlbnQ9bnVsbH19LFtYLFIsVV0pO2xldCBYMD13KDApO3goKCk9PntpZighVSlyZXR1cm47bGV0IFY9MjAwMCxIPSgpPT57bGV0IEQ9WDAuY3VycmVudDtpZighRHx8IVQuY3VycmVudClyZXR1cm47aWYoRGF0ZS5ub3coKS1EPlYpRSghMSl9LEw9c2V0SW50ZXJ2YWwoKCk9Pnt2MChHMC5jdXJyZW50KSxHMC5jdXJyZW50PTAsSCgpfSwxMDAwKSxQPSgpPT57aWYoIWRvY3VtZW50LmhpZGRlbilIKCl9O3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixQKSwoKT0+e2NsZWFySW50ZXJ2YWwoTCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsUCl9fSxbVV0pO2xldCBhPWooKCk9PntyZXR1cm4gVT9JLmN1cnJlbnQ6ay5jdXJyZW50fSxbVV0pLFYwPWooKFYsSCk9PntsZXQgTD1hKCk7aWYoIUwpcmV0dXJuO2xldCBQPUwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksRD0oSC5jbGllbnRYLVAubGVmdCkvUC53aWR0aCxiPShILmNsaWVudFktUC50b3ApL1AuaGVpZ2h0O20oe3R5cGU6Vix4OkQseTpifSl9LFttXSksWTA9MyxjPXcoITEpLG89dyghMSksQTA9dyghMSksTTA9dyh7ZHg6MCxkeTowfSksQzA9dyghMSksW1k0LEk0XT1TKCExKSxNND13KHt4OjAuNSx5OjAuNX0pLFtIMCxxMF09UyhudWxsKTt4KCgpPT57bGV0IFY9KEwpPT57aWYoTC5rZXk9PT0iQWx0IilJNCghMCl9LEg9KEwpPT57aWYoTC5rZXk9PT0iQWx0Iil7aWYoSTQoITEpLCFvLmN1cnJlbnQpcTAobnVsbCl9fTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLFYpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsSCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixIKX19LFtdKSx4KCgpPT57aWYoWTQmJiFvLmN1cnJlbnQpe2xldCBWPU00LmN1cnJlbnQ7cTAoe3gxOlYueCx5MTpWLnkseDI6MS1WLngseTI6MS1WLnl9KX1lbHNlIGlmKCFZNCYmIW8uY3VycmVudClxMChudWxsKX0sW1k0XSk7bGV0IHkwPXcobnVsbCkscTQ9dyghMSksRTA9dygwKSxDND1qKChWLEgpPT57cTQuY3VycmVudD0hMDtsZXQgTD15MC5jdXJyZW50O2lmKEwpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksRTAuY3VycmVudD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntMLnN0eWxlLmxlZnQ9YCR7VioxMDB9JWAsTC5zdHlsZS50b3A9YCR7SCoxMDB9JWAsTC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KX0sW10pLEU0PWooKFYsSCk9PntpZighcTQuY3VycmVudClyZXR1cm47bGV0IEw9eTAuY3VycmVudDtpZihMKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEUwLmN1cnJlbnQpLEUwLmN1cnJlbnQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57TC5zdHlsZS5sZWZ0PWAke1YqMTAwfSVgLEwuc3R5bGUudG9wPWAke0gqMTAwfSVgfSl9LFtdKSxwMD1qKCgpPT57cTQuY3VycmVudD0hMTtsZXQgVj15MC5jdXJyZW50O2lmKFYpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksVi5zdHlsZS5kaXNwbGF5PSJub25lIn0sW10pLHc0PXcoMCksdzA9dyhudWxsKSx4NT1qKCgpPT57bGV0IFY9RGF0ZS5ub3coKSxIPVYtdzQuY3VycmVudDtpZih3NC5jdXJyZW50PVYsSDwzMDApe2lmKHcwLmN1cnJlbnQpY2xlYXJUaW1lb3V0KHcwLmN1cnJlbnQpLHcwLmN1cnJlbnQ9bnVsbDtpZihRKVEoKTtlbHNlIEowKCJhcHBfc3dpdGNoZXIiKX1lbHNlIHcwLmN1cnJlbnQ9c2V0VGltZW91dCgoKT0+e2lmKFEpUSgpO2Vsc2UgSjAoImhvbWUiKTt3MC5jdXJyZW50PW51bGx9LDMwMCl9LFtKMCxRXSksZzA9KCgpPT57aWYoIWd8fCFyKXJldHVybiBudWxsO2lmKHIud2lkdGg9PT0wfHxyLmhlaWdodD09PTApcmV0dXJuIG51bGw7bGV0IFY9TWF0aC5taW4oci53aWR0aC9nLndpZHRoLHIuaGVpZ2h0L2cuaGVpZ2h0KTtyZXR1cm57d2lkdGg6Zy53aWR0aCpWLGhlaWdodDpnLmhlaWdodCpWfX0pKCk7cmV0dXJuIE4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGZsZXg6MSwuLi5fP3t9Ontib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sb3ZlcmZsb3c6ImhpZGRlbiIsbWluV2lkdGg6MCxtaW5IZWlnaHQ6MCwuLi5KfSxjbGFzc05hbWU6cSxjaGlsZHJlbjpbTigiZGl2Iix7cmVmOnMsc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsZmxleDoxLG1pbkhlaWdodDowLG1pbldpZHRoOjAsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIn0sY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsd2lkdGg6ZzA/YCR7ZzAud2lkdGh9cHhgOiIxMDAlIixoZWlnaHQ6ZzA/YCR7ZzAuaGVpZ2h0fXB4YDoiMTAwJSJ9LGNoaWxkcmVuOltOKCJpbWciLHtyZWY6ayxzcmM6VT92b2lkIDA6UixkcmFnZ2FibGU6ITEsb25Mb2FkOihWKT0+e2xldCBIPVYuY3VycmVudFRhcmdldDtpZihILm5hdHVyYWxXaWR0aD4wJiZILm5hdHVyYWxIZWlnaHQ+MClLMCgoTCk9PkwmJkwud2lkdGg9PT1ILm5hdHVyYWxXaWR0aCYmTC5oZWlnaHQ9PT1ILm5hdHVyYWxIZWlnaHQ/TDp7d2lkdGg6SC5uYXR1cmFsV2lkdGgsaGVpZ2h0OkgubmF0dXJhbEhlaWdodH0pfSxzdHlsZTpVP3tkaXNwbGF5OiJub25lIn06e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCx3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixjdXJzb3I6RDQsZGlzcGxheToiYmxvY2siLHVzZXJTZWxlY3Q6Im5vbmUiLFdlYmtpdFVzZXJTZWxlY3Q6Im5vbmUiLHRvdWNoQWN0aW9uOiJub25lIiwuLi5ZfX0pLFUmJk4oImltZyIse3JlZjpJLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKUswKChMKT0+TCYmTC53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZMLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9MOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOkQ0LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uWX19KSxOKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGN1cnNvcjpENCx0b3VjaEFjdGlvbjoibm9uZSJ9LG9uTW91c2VEb3duOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksUD0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKFYuYWx0S2V5KXtvLmN1cnJlbnQ9ITAsQTAuY3VycmVudD1WLnNoaWZ0S2V5O2xldCBiPXt4MTpQLHkxOkQseDI6MS1QLHkyOjEtRH07TTAuY3VycmVudD17ZHg6MS1QLVAsZHk6MS1ELUR9LHEwKGIpLHkoe3R5cGU6ImJlZ2luIiwuLi5ifSk7cmV0dXJufWlmKEM0KFAsRCksRD4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpQLHk6RCxlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsVjAoImJlZ2luIixWKX0sb25Nb3VzZU1vdmU6KFYpPT57bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihNNC5jdXJyZW50PXt4OlAseTpEfSxWLmJ1dHRvbnM9PT0wKXtpZihWLmFsdEtleSlxMCh7eDE6UCx5MTpELHgyOjEtUCx5MjoxLUR9KTtyZXR1cm59aWYoby5jdXJyZW50KXtsZXQgYjtpZihBMC5jdXJyZW50KXtsZXQgbD1NMC5jdXJyZW50O2I9e3gxOlAseTE6RCx4MjpQK2wuZHgseTI6RCtsLmR5fX1lbHNlIGI9e3gxOlAseTE6RCx4MjoxLVAseTI6MS1EfTtxMChiKSx5KHt0eXBlOiJtb3ZlIiwuLi5ifSk7cmV0dXJufWlmKEU0KFAsRCksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6UCx5OkQsZWRnZTpZMH0pO2Vsc2UgVjAoIm1vdmUiLFYpfSxvbk1vdXNlVXA6KFYpPT57aWYoby5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoQTAuY3VycmVudCl7bGV0IGI9TTAuY3VycmVudDt5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjpQK2IuZHgseTI6RCtiLmR5fSl9ZWxzZSB5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjoxLVAseTI6MS1EfSl9aWYoby5jdXJyZW50PSExLCFWLmFsdEtleSlxMChudWxsKTtyZXR1cm59aWYocDAoKSxjLmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDttKHt0eXBlOiJlbmQiLHg6UCx5OkQsZWRnZTpZMH0pfWMuY3VycmVudD0hMTtyZXR1cm59VjAoImVuZCIsVil9LG9uTW91c2VMZWF2ZTooVik9PntpZihvLmN1cnJlbnQpe2lmKEgwKXkoe3R5cGU6ImVuZCIsLi4uSDB9KTtvLmN1cnJlbnQ9ITEscTAobnVsbCk7cmV0dXJufWlmKHAwKCksYy5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7bSh7dHlwZToiZW5kIix4OlAseTpELGVkZ2U6WTB9KX1jLmN1cnJlbnQ9ITE7cmV0dXJufWlmKFYuYnV0dG9ucz4wKVYwKCJlbmQiLFYpO3EwKG51bGwpfSxvblRvdWNoU3RhcnQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWLnRvdWNoZXMubGVuZ3RoPj0yKXtwMCgpO2xldCBsPVYudG91Y2hlc1swXSxuPVYudG91Y2hlc1sxXSxRMD17eDE6KGwuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTE6KGwuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQseDI6KG4uY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTI6KG4uY2xpZW50WS1MLnRvcCkvTC5oZWlnaHR9O2lmKCFDMC5jdXJyZW50JiYhYy5jdXJyZW50KW0oe3R5cGU6ImVuZCIseDpRMC54MSx5OlEwLnkxfSk7QzAuY3VycmVudD0hMCxvLmN1cnJlbnQ9ITAsYy5jdXJyZW50PSExLHEwKFEwKSx5KHt0eXBlOiJiZWdpbiIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEM0KEQsYiksYj4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpELHk6YixlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsbSh7dHlwZToiYmVnaW4iLHg6RCx5OmJ9KX0sb25Ub3VjaE1vdmU6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihDMC5jdXJyZW50JiZWLnRvdWNoZXMubGVuZ3RoPj0yKXtsZXQgbD1WLnRvdWNoZXNbMF0sbj1WLnRvdWNoZXNbMV0sUTA9e3gxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOihuLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkyOihuLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0fTtxMChRMCkseSh7dHlwZToibW92ZSIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEU0KEQsYiksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6RCx5OmIsZWRnZTpZMH0pO2Vsc2UgbSh7dHlwZToibW92ZSIseDpELHk6Yn0pfSxvblRvdWNoRW5kOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoQzAuY3VycmVudCl7aWYoVi50b3VjaGVzLmxlbmd0aDwyKXtsZXQgbD1WLmNoYW5nZWRUb3VjaGVzWzBdLG49SDA7aWYobCYmbil5KHt0eXBlOiJlbmQiLHgxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOm4ueDIseTI6bi55Mn0pO2Vsc2UgaWYobil5KHt0eXBlOiJlbmQiLC4uLm59KTtDMC5jdXJyZW50PSExLG8uY3VycmVudD0hMSxxMChudWxsKX1yZXR1cm59bGV0IFA9Vi5jaGFuZ2VkVG91Y2hlc1swXTtpZighUClyZXR1cm47bGV0IEQ9KFAuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsYj0oUC5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihwMCgpLGMuY3VycmVudCltKHt0eXBlOiJlbmQiLHg6RCx5OmIsZWRnZTpZMH0pLGMuY3VycmVudD0hMTtlbHNlIG0oe3R5cGU6ImVuZCIseDpELHk6Yn0pfX0pLE4oImRpdiIse3JlZjp5MCwiZGF0YS10ZXN0aWQiOiJ0b3VjaC1pbmRpY2F0b3IiLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUiLHdpZHRoOjI0LGhlaWdodDoyNCxib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDoicmdiYSg1OSwxMzAsMjQ2LDAuNSkiLGJveFNoYWRvdzoiMCAwIDhweCByZ2JhKDU5LDEzMCwyNDYsMC4zKSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoLTUwJSwgLTUwJSkiLHBvaW50ZXJFdmVudHM6Im5vbmUifX0pLEgwJiZOKGYse2NoaWxkcmVuOltOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MSxIMC55MSl9KSxOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MixIMC55Mil9KV19KSwhaCYmIWUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiM4ODgiLGZvbnRTaXplOjE0fSxjaGlsZHJlbjoiQ29ubmVjdGluZy4uLiJ9KX0pLGUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiNmNDQiLGZvbnRTaXplOjE0LHBhZGRpbmc6MjAsdGV4dEFsaWduOiJjZW50ZXIifSxjaGlsZHJlbjplfSl9KSxKNCYmTigiZGl2Iix7c3R5bGU6azYsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiI2ZiYmYyNCIsZm9udFNpemU6MTMsZm9udEZhbWlseToibW9ub3NwYWNlIn0sY2hpbGRyZW46IlNsb3cgY29ubmVjdGlvbiJ9KX0pXX0pfSksIV8mJk4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixwYWRkaW5nOiI0cHggOHB4Iixib3JkZXJUb3A6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sY2hpbGRyZW46W04oImJ1dHRvbiIse29uQ2xpY2s6eDUsc3R5bGU6e2JhY2tncm91bmQ6Im5vbmUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4yKSIsY29sb3I6IiNhYWEiLGZvbnRTaXplOjExLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIscGFkZGluZzoiMnB4IDEwcHgiLGN1cnNvcjoicG9pbnRlciIsYm9yZGVyUmFkaXVzOjR9LGNoaWxkcmVuOiJIb21lIn0pLE4oInNwYW4iLHtzdHlsZTp7Y29sb3I6ajA+MD8iIzRmNCI6IiM4ODgiLGZvbnRTaXplOjEyLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixnYXA6Nn0sY2hpbGRyZW46W0MmJk4oInNwYW4iLHsiZGF0YS10ZXN0aWQiOiJxdWFsaXR5LWRvdCIsc3R5bGU6e3dpZHRoOjgsaGVpZ2h0OjgsYm9yZGVyUmFkaXVzOiI1MCUiLGRpc3BsYXk6ImlubGluZS1ibG9jayIsYmFja2dyb3VuZDpDPT09Imdvb2QiPyIjNGFkZTgwIjpDPT09ImRlZ3JhZGVkIj8iI2ZhY2MxNSI6IiNlZjQ0NDQifX0pLGowLCIgZnBzIl19KV19KV19KX12YXIgazY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjgsbGVmdDoiNTAlIix0cmFuc2Zvcm06InRyYW5zbGF0ZVgoLTUwJSkiLGJhY2tncm91bmQ6InJnYmEoMCwwLDAsMC43KSIsYm9yZGVyUmFkaXVzOjYscGFkZGluZzoiNHB4IDEycHgiLHBvaW50ZXJFdmVudHM6Im5vbmUifSxTNT17cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYmFja2dyb3VuZDoicmdiYSgwLDAsMCwwLjgpIn0sUjU9MjA7ZnVuY3Rpb24gajUoWCxaKXtyZXR1cm57cG9zaXRpb246ImFic29sdXRlIixsZWZ0OmAke1gqMTAwfSVgLHRvcDpgJHtaKjEwMH0lYCx3aWR0aDpSNSxoZWlnaHQ6UjUsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjcpIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgtNTAlLCAtNTAlKSIscG9pbnRlckV2ZW50czoibm9uZSJ9fWZ1bmN0aW9uIGswKFgpe2lmKCFYKXJldHVybiJpcGhvbmUiO2xldCBaPVgudG9Mb3dlckNhc2UoKTtpZihaLmluY2x1ZGVzKCJpcGFkIikpcmV0dXJuImlwYWQiO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIndhdGNoIjtpZihaLmluY2x1ZGVzKCJ2aXNpb24iKSlyZXR1cm4idmlzaW9uIjtyZXR1cm4iaXBob25lIn12YXIgJDA9e2lwaG9uZTp7d2lkdGg6NDI3LGhlaWdodDo4ODEsYmV6ZWxYOjE4LGJlemVsWToxOCxpbm5lclJhZGl1czo1NX0saXBhZDp7d2lkdGg6NDMwLGhlaWdodDo2MDUsYmV6ZWxYOjE2LGJlemVsWToxNixpbm5lclJhZGl1czoxMn0sd2F0Y2g6e3dpZHRoOjI3NCxoZWlnaHQ6MzIyLGJlemVsWDoxMixiZXplbFk6MTIsaW5uZXJSYWRpdXM6Nzl9LHZpc2lvbjp7d2lkdGg6NjQwLGhlaWdodDo0MDAsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czozMn19LGI3PSQwLmlwaG9uZS53aWR0aCxTNz0kMC5pcGhvbmUuaGVpZ2h0LFI3PSQwLmlwaG9uZS5iZXplbFgsajc9JDAuaXBob25lLmJlemVsWSx2Nz0kMC5pcGhvbmUuaW5uZXJSYWRpdXM7ZnVuY3Rpb24gZTAoWD0iaXBob25lIil7bGV0IFo9JDBbWF0sSj1aLndpZHRoLTIqWi5iZXplbFgsWT1aLmhlaWdodC0yKlouYmV6ZWxZO3JldHVybmAke1ouaW5uZXJSYWRpdXMvSioxMDB9JSAvICR7Wi5pbm5lclJhZGl1cy9ZKjEwMH0lYH12YXIgazQ9XzAobnVsbCk7ZnVuY3Rpb24gWDQoWCl7bGV0IFo9UjAoazQpO2lmKCFaKXRocm93IEVycm9yKGA8U2ltdWxhdG9yVG9vbGJhci4ke1h9PiBtdXN0IGJlIHJlbmRlcmVkIGluc2lkZSA8U2ltdWxhdG9yVG9vbGJhcj5gKTtyZXR1cm4gWn12YXIgdzY9e2Rpc3BsYXk6ImZsZXgiLGZsZXhXcmFwOiJ3cmFwIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixnYXA6IjRweCAxMnB4IixwYWRkaW5nOiI4cHggMTJweCIsYm9yZGVyUmFkaXVzOjI0LGJhY2tncm91bmQ6IiMxYzFjMWUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSIsYm94U2hhZG93OiIwIDFweCAycHggcmdiYSgwLDAsMCwwLjIpIixtaW5XaWR0aDoyNDAsd2lkdGg6IjEwMCUifTtmdW5jdGlvbiBUNih7ZXhlYzpYLGRldmljZVVkaWQ6WixkZXZpY2VOYW1lOkosZGV2aWNlUnVudGltZTpZLHN0cmVhbWluZzpxPSExLGRpc2FibGVkOlE9ITEsY2hpbGRyZW46SyxzdHlsZTpXLC4uLkd9KXtsZXQgej1rMChKKSwkPXtleGVjOlgsZGV2aWNlVWRpZDpaLGRldmljZU5hbWU6SixkZXZpY2VSdW50aW1lOlksZGV2aWNlVHlwZTp6LHN0cmVhbWluZzpxLGRpc2FibGVkOlF8fCFafHwhcX07cmV0dXJuIE4oazQuUHJvdmlkZXIse3ZhbHVlOiQsY2hpbGRyZW46TigiZGl2Iix7ImRhdGEtc2ltdWxhdG9yLXRvb2xiYXIiOiEwLHN0eWxlOnsuLi53NiwuLi5XfSwuLi5HLGNoaWxkcmVuOkt9KX0pfXZhciBiNj17ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixhbGlnbkl0ZW1zOiJmbGV4LXN0YXJ0Iix0ZXh0QWxpZ246ImxlZnQiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjZmZmIixwYWRkaW5nOiIycHggNHB4IixtYXJnaW46Ii0ycHggLTRweCIsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixtaW5XaWR0aDowLG1heFdpZHRoOiIxMDAlIixsaW5lSGVpZ2h0OjEuMixmb250RmFtaWx5OiJpbmhlcml0In0sUzY9RDAoZnVuY3Rpb24oe25hbWU6WixzdWJ0aXRsZTpKLGhpZGVDaGV2cm9uOlksc3R5bGU6cSxvbk1vdXNlRW50ZXI6USxvbk1vdXNlTGVhdmU6SywuLi5XfSxHKXtsZXQgej1YNCgiVGl0bGUiKSxbTywkXT1TKCExKSxfPVo/P3ouZGV2aWNlTmFtZT8/Ik5vIHNpbXVsYXRvciIsQT1KPz8oei5kZXZpY2VSdW50aW1lP3ouZGV2aWNlUnVudGltZS5yZXBsYWNlKC9cLi8sIiAiKToi4oCUIik7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsImRhdGEtc2ltdWxhdG9yLXRvb2xiYXItdGl0bGUiOiEwLG9uTW91c2VFbnRlcjooQyk9PnskKCEwKSxRPy4oQyl9LG9uTW91c2VMZWF2ZTooQyk9PnskKCExKSxLPy4oQyl9LHN0eWxlOnsuLi5iNixiYWNrZ3JvdW5kOk8/InJnYmEoMjU1LDI1NSwyNTUsMC4xKSI6InRyYW5zcGFyZW50IiwuLi5xfSwuLi5XLGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2Rpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo0LGZvbnRTaXplOjEyLGZvbnRXZWlnaHQ6NjAwLGNvbG9yOiIjZmZmIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46W18sIVkmJk4oInN2ZyIse3dpZHRoOiIxMCIsaGVpZ2h0OiIxMCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIuNSIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsc3R5bGU6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGZsZXhTaHJpbms6MH0sY2hpbGRyZW46TigicG9seWxpbmUiLHtwb2ludHM6IjYgOSAxMiAxNSAxOCA5In0pfSldfSksTigic3BhbiIse3N0eWxlOntmb250U2l6ZToxMCxjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjUpIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46QX0pXX0pfSksUjY9e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZmxleFNocmluazowfTtmdW5jdGlvbiBqNih7c3R5bGU6WCwuLi5afSl7cmV0dXJuIE4oImRpdiIse3N0eWxlOnsuLi5SNiwuLi5YfSwuLi5afSl9dmFyIHY2PXtiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsYm9yZGVyOiJub25lIixwYWRkaW5nOjYsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixkaXNwbGF5OiJpbmxpbmUtZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIix0cmFuc2l0aW9uOiJiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzLCBjb2xvciAwLjE1cyJ9LFo0PUQwKGZ1bmN0aW9uKHtmb3JjZURpc2FibGVkOlosc3R5bGU6SixkaXNhYmxlZDpZLG9uTW91c2VFbnRlcjpxLG9uTW91c2VMZWF2ZTpRLGNoaWxkcmVuOkssLi4uV30sRyl7bGV0IHo9UjAoazQpLE89WXx8Wnx8ej8uZGlzYWJsZWQsWyQsX109UyghMSk7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6Tyxvbk1vdXNlRW50ZXI6KEEpPT57XyghMCkscT8uKEEpfSxvbk1vdXNlTGVhdmU6KEEpPT57XyghMSksUT8uKEEpfSxzdHlsZTp7Li4udjYsY29sb3I6Tz8icmdiYSgyNTUsMjU1LDI1NSwwLjI1KSI6InJnYmEoMjU1LDI1NSwyNTUsMC44KSIsYmFja2dyb3VuZDokJiYhTz8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLGN1cnNvcjpPPyJub3QtYWxsb3dlZCI6InBvaW50ZXIiLC4uLkp9LC4uLlcsY2hpbGRyZW46S30pfSk7ZnVuY3Rpb24geTYoKXtyZXR1cm5bJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBzZXQgZnJvbnRtb3N0IHRvIHRydWUnLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gcGVyZm9ybSBhY3Rpb24gIkFYUmFpc2UiIG9mIChmaXJzdCB3aW5kb3cgd2hvc2UgbmFtZSBjb250YWlucyAid2F0Y2hPUyIpJywndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIGNsaWNrIG1lbnUgaXRlbSAiSG9tZSIgb2YgbWVudSAiRGV2aWNlIiBvZiBtZW51IGJhciBpdGVtICJEZXZpY2UiIG9mIG1lbnUgYmFyIDEnXS5tYXAoKFopPT5gLWUgJyR7Wn0nYCkucmVkdWNlKChaLEopPT5gJHtafSAke0p9YCwib3Nhc2NyaXB0Iil9dmFyIHA2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOk4oInBhdGgiLHtkOiJNMyAxMC41IDEyIDNsOSA3LjVWMjBhMSAxIDAgMCAxLTEgMWgtNXYtN2gtNnY3SDRhMSAxIDAgMCAxLTEtMXoifSl9KSxnNj1OKCJzdmciLHt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixjaGlsZHJlbjpbTigicGF0aCIse2Q6Ik0xNC41IDRoLTVMNyA3SDRhMiAyIDAgMCAwLTIgMnY5YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMlY5YTIgMiAwIDAgMC0yLTJoLTN6In0pLE4oImNpcmNsZSIse2N4OiIxMiIsY3k6IjEzIixyOiI0In0pXX0pLHg2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDEyIDEzIixmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46TigicGF0aCIse2Q6Ik0xMC4yMzA1IDEyLjgwNzdINC40MjM4M0MzLjkyMzgzIDEyLjgwNzcgMy41NDY4OCAxMi42ODQ2IDMuMjkyOTcgMTIuNDM4NUMzLjA0Mjk3IDEyLjE5NjMgMi45MTc5NyAxMS44MTk0IDIuOTE3OTcgMTEuMzA3N1Y1LjUxMjc0QzIuOTE3OTcgNC45OTcxMSAzLjA0Mjk3IDQuNjE4MjEgMy4yOTI5NyA0LjM3NjAyQzMuNTQ2ODggNC4xMjk5MyAzLjkyMzgzIDQuMDA2ODggNC40MjM4MyA0LjAwNjg4SDEwLjIzMDVDMTAuNzM0NCA0LjAwNjg4IDExLjExMTMgNC4xMjk5MyAxMS4zNjEzIDQuMzc2MDJDMTEuNjExMyA0LjYxODIxIDExLjczNjMgNC45OTcxMSAxMS43MzYzIDUuNTEyNzRWMTEuMzA3N0MxMS43MzYzIDExLjgxOTQgMTEuNjExMyAxMi4xOTYzIDExLjM2MTMgMTIuNDM4NUMxMS4xMTEzIDEyLjY4NDYgMTAuNzM0NCAxMi44MDc3IDEwLjIzMDUgMTIuODA3N1pNMTAuMjEyOSAxMS44NjQzQzEwLjQxNiAxMS44NjQzIDEwLjU2MjUgMTEuODE5NCAxMC42NTIzIDExLjcyOTVDMTAuNzQ2MSAxMS42NDM2IDEwLjc5MyAxMS40OTcxIDEwLjc5MyAxMS4yOTAxVjUuNTI0NDZDMTAuNzkzIDUuMzE3NDMgMTAuNzQ2MSA1LjE3MDk0IDEwLjY1MjMgNS4wODUwMUMxMC41NjI1IDQuOTk1MTYgMTAuNDE2IDQuOTUwMjQgMTAuMjEyOSA0Ljk1MDI0SDQuNDQxNDFDNC4yNDIxOSA0Ljk1MDI0IDQuMDk1NyA0Ljk5NTE2IDQuMDAxOTUgNS4wODUwMUMzLjkwODIgNS4xNzA5NCAzLjg2MTMzIDUuMzE3NDMgMy44NjEzMyA1LjUyNDQ2VjExLjI5MDFDMy44NjEzMyAxMS40OTcxIDMuOTA4MiAxMS42NDM2IDQuMDAxOTUgMTEuNzI5NUM0LjA5NTcgMTEuODE5NCA0LjI0MjE5IDExLjg2NDMgNC40NDE0MSAxMS44NjQzSDEwLjIxMjlaTTIuOTE3OTcgMi41ODMwNVYwLjQxNTA4M0MyLjkxNzk3IDAuMjAwMjQgMi45ODYzMyAwLjA2OTM4MDMgMy4xMjMwNSAwLjAyMjUwNTNDMy4yNTk3NyAtMC4wMjgyNzU5IDMuNDEwMTYgMC4wMDY4ODAzMyAzLjU3NDIyIDAuMTI3OTc0TDUuMDUwNzggMS4yMTE5NkM1LjE3NTc4IDEuMzA1NzEgNS4yMzgyOCAxLjQwMTQxIDUuMjM4MjggMS40OTkwN0M1LjIzODI4IDEuNTk2NzIgNS4xNzU3OCAxLjY5MjQzIDUuMDUwNzggMS43ODYxOEwzLjU3NDIyIDIuODY0M0MzLjQxMDE2IDIuOTg1NCAzLjI1OTc3IDMuMDIyNTEgMy4xMjMwNSAyLjk3NTYzQzIuOTg2MzMgMi45MjQ4NSAyLjkxNzk3IDIuNzkzOTkgMi45MTc5NyAyLjU4MzA1Wk0zLjUzMzIgMS4xNTMzNkMzLjYyNjk1IDEuMTUzMzYgMy43MDcwMyAxLjE4NjU3IDMuNzczNDQgMS4yNTI5N0MzLjg0Mzc1IDEuMzE5MzggMy44Nzg5MSAxLjM5NzUxIDMuODc4OTEgMS40ODczNUMzLjg3ODkxIDEuNTgxMSAzLjg0Mzc1IDEuNjYzMTMgMy43NzM0NCAxLjczMzQ0QzMuNzA3MDMgMS43OTk4NSAzLjYyNjk1IDEuODMzMDUgMy41MzMyIDEuODMzMDVIMi44MDY2NEMyLjM4MDg2IDEuODMzMDUgMi4wMTE3MiAxLjkyNDg1IDEuNjk5MjIgMi4xMDg0NEMxLjM5MDYyIDIuMjg4MTMgMS4xNTIzNCAyLjUzODEzIDAuOTg0Mzc1IDIuODU4NDRDMC44MTY0MDYgMy4xNzg3NiAwLjczMjQyMiAzLjU0NTk0IDAuNzMyNDIyIDMuOTYwMDFWNC44Mzg5MUMwLjczMjQyMiA0LjkzNjU3IDAuNjk3MjY2IDUuMDIyNTEgMC42MjY5NTMgNS4wOTY3MkMwLjU1MjczNCA1LjE2NzA0IDAuNDY0ODQ0IDUuMjAyMTkgMC4zNjMyODEgNS4yMDIxOUMwLjI2NTYyNSA1LjIwMjE5IDAuMTgxNjQxIDUuMTY3MDQgMC4xMTEzMjggNS4wOTY3MkMwLjAzNzEwOTQgNS4wMjI1MSAwIDQuOTM2NTcgMCA0LjgzODkxVjMuOTYwMDFDMCAzLjQwMTQxIDAuMTE3MTg4IDIuOTExMTggMC4zNTE1NjIgMi40ODkzQzAuNTgyMDMxIDIuMDY3NDMgMC45MDgyMDMgMS43MzkzIDEuMzMwMDggMS41MDQ5M0MxLjc0ODA1IDEuMjcwNTUgMi4yMzgyOCAxLjE1MzM2IDIuODAwNzggMS4xNTMzNkgzLjUzMzJaIn0pfSksaDY9RDAoZnVuY3Rpb24oe29uQ2xpY2s6WiwuLi5KfSxZKXtsZXQgcT1YNCgiSG9tZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IkhvbWUiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VUeXBlPT09IndhdGNoIilxLmV4ZWMoeTYoKSk7ZWxzZSBxLmV4ZWMoInNlcnZlLXNpbSBidXR0b24gaG9tZSIpfSwuLi5KLGNoaWxkcmVuOnA2fSl9KSxtNj1EMChmdW5jdGlvbih7b25DbGljazpaLC4uLkp9LFkpe2xldCBxPVg0KCJTY3JlZW5zaG90QnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiU2NyZWVuc2hvdCIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGB4Y3J1biBzaW1jdGwgaW8gJHtxLmRldmljZVVkaWR9IHNjcmVlbnNob3Qgfi9EZXNrdG9wL2hhdGNoLXNjcmVlbnNob3QtJChkYXRlICslcykucG5nYCl9LC4uLkosY2hpbGRyZW46ZzZ9KX0pLGY2PUQwKGZ1bmN0aW9uKHtvbkNsaWNrOlosLi4uSn0sWSl7bGV0IHE9WDQoIlJvdGF0ZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IlJvdGF0ZSBkZXZpY2UiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VVZGlkKXEuZXhlYyhgb3Nhc2NyaXB0IC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTaW11bGF0b3IiIHRvIGFjdGl2YXRlJyAtZSAndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8ga2V5IGNvZGUgMTI0IHVzaW5nIHtjb21tYW5kIGRvd259J2ApfSwuLi5KLGNoaWxkcmVuOng2fSl9KSx0PVQ2O3QuVGl0bGU9UzY7dC5BY3Rpb25zPWo2O3QuQnV0dG9uPVo0O3QuSG9tZUJ1dHRvbj1oNjt0LlNjcmVlbnNob3RCdXR0b249bTY7dC5Sb3RhdGVCdXR0b249ZjY7ZnVuY3Rpb24gZDYoWCl7bGV0W1osSl09UyhudWxsKSxZPXcobmV3IFNldCksW3EsUV09UyhudWxsKSxLPWooKFcpPT57cmV0dXJuIFkuY3VycmVudC5hZGQoVyksKCk9PntZLmN1cnJlbnQuZGVsZXRlKFcpfX0sW10pO3JldHVybiB4KCgpPT57aWYoIVgpcmV0dXJuO2xldCBXPW5ldyBBYm9ydENvbnRyb2xsZXIsRz1YLnJlcGxhY2UoL1wvc3RyZWFtXC5tanBlZyQvLCIiKTtyZXR1cm4gZmV0Y2goYCR7R30vY29uZmlnYCx7c2lnbmFsOlcuc2lnbmFsfSkudGhlbigoeik9PnouanNvbigpKS50aGVuKCh6KT0+e2lmKHoud2lkdGg+MCYmei5oZWlnaHQ+MClKKHopfSkuY2F0Y2goKCk9Pnt9KSwoYXN5bmMoKT0+e3RyeXtsZXQgTz0oYXdhaXQgZmV0Y2goWCx7c2lnbmFsOlcuc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFPKXJldHVybjtsZXQgJD1uZXcgVWludDhBcnJheSgwKTt3aGlsZSghMCl7bGV0e2RvbmU6Xyx2YWx1ZTpBfT1hd2FpdCBPLnJlYWQoKTtpZihfKWJyZWFrO2xldCBDPW5ldyBVaW50OEFycmF5KCQubGVuZ3RoK0EubGVuZ3RoKTtDLnNldCgkKSxDLnNldChBLCQubGVuZ3RoKSwkPUM7d2hpbGUoITApe2xldCBVPS0xO2ZvcihsZXQgRT0wO0U8JC5sZW5ndGgtMTtFKyspaWYoJFtFXT09PTI1NSYmJFtFKzFdPT09MjE2KXtVPUU7YnJlYWt9aWYoVT09PS0xKWJyZWFrO2xldCBrPS0xO2ZvcihsZXQgRT1VKzI7RTwkLmxlbmd0aC0xO0UrKylpZigkW0VdPT09MjU1JiYkW0UrMV09PT0yMTcpe2s9RSsyO2JyZWFrfWlmKGs9PT0tMSlicmVhaztsZXQgST0kLnNsaWNlKFUsayk7JD0kLnNsaWNlKGspO2xldCBNPW5ldyBCbG9iKFtJXSx7dHlwZToiaW1hZ2UvanBlZyJ9KSxoPVVSTC5jcmVhdGVPYmplY3RVUkwoTSk7UShoKTtmb3IobGV0IEUgb2YgWS5jdXJyZW50KUUoaCl9fX1jYXRjaHt9fSkoKSwoKT0+Vy5hYm9ydCgpfSxbWF0pLHtzdWJzY3JpYmVGcmFtZTpLLGZyYW1lOnEsY29uZmlnOlp9fXZhciBhNj17S2V5QTo0LEtleUI6NSxLZXlDOjYsS2V5RDo3LEtleUU6OCxLZXlGOjksS2V5RzoxMCxLZXlIOjExLEtleUk6MTIsS2V5SjoxMyxLZXlLOjE0LEtleUw6MTUsS2V5TToxNixLZXlOOjE3LEtleU86MTgsS2V5UDoxOSxLZXlROjIwLEtleVI6MjEsS2V5UzoyMixLZXlUOjIzLEtleVU6MjQsS2V5VjoyNSxLZXlXOjI2LEtleVg6MjcsS2V5WToyOCxLZXlaOjI5LERpZ2l0MTozMCxEaWdpdDI6MzEsRGlnaXQzOjMyLERpZ2l0NDozMyxEaWdpdDU6MzQsRGlnaXQ2OjM1LERpZ2l0NzozNixEaWdpdDg6MzcsRGlnaXQ5OjM4LERpZ2l0MDozOSxFbnRlcjo0MCxFc2NhcGU6NDEsQmFja3NwYWNlOjQyLFRhYjo0MyxTcGFjZTo0NCxNaW51czo0NSxFcXVhbDo0NixCcmFja2V0TGVmdDo0NyxCcmFja2V0UmlnaHQ6NDgsQmFja3NsYXNoOjQ5LFNlbWljb2xvbjo1MSxRdW90ZTo1MixCYWNrcXVvdGU6NTMsQ29tbWE6NTQsUGVyaW9kOjU1LFNsYXNoOjU2LENhcHNMb2NrOjU3LEYxOjU4LEYyOjU5LEYzOjYwLEY0OjYxLEY1OjYyLEY2OjYzLEY3OjY0LEY4OjY1LEY5OjY2LEYxMDo2NyxGMTE6NjgsRjEyOjY5LFByaW50U2NyZWVuOjcwLFNjcm9sbExvY2s6NzEsUGF1c2U6NzIsSW5zZXJ0OjczLEhvbWU6NzQsUGFnZVVwOjc1LERlbGV0ZTo3NixFbmQ6NzcsUGFnZURvd246NzgsQXJyb3dSaWdodDo3OSxBcnJvd0xlZnQ6ODAsQXJyb3dEb3duOjgxLEFycm93VXA6ODIsTnVtTG9jazo4MyxOdW1wYWREaXZpZGU6ODQsTnVtcGFkTXVsdGlwbHk6ODUsTnVtcGFkU3VidHJhY3Q6ODYsTnVtcGFkQWRkOjg3LE51bXBhZEVudGVyOjg4LE51bXBhZDE6ODksTnVtcGFkMjo5MCxOdW1wYWQzOjkxLE51bXBhZDQ6OTIsTnVtcGFkNTo5MyxOdW1wYWQ2Ojk0LE51bXBhZDc6OTUsTnVtcGFkODo5NixOdW1wYWQ5Ojk3LE51bXBhZDA6OTgsTnVtcGFkRGVjaW1hbDo5OSxDb250cm9sTGVmdDoyMjQsU2hpZnRMZWZ0OjIyNSxBbHRMZWZ0OjIyNixNZXRhTGVmdDoyMjcsQ29udHJvbFJpZ2h0OjIyOCxTaGlmdFJpZ2h0OjIyOSxBbHRSaWdodDoyMzAsTWV0YVJpZ2h0OjIzMX07ZnVuY3Rpb24gbDYoWCl7cmV0dXJuIGE2W1hdPz9udWxsfWFzeW5jIGZ1bmN0aW9uIE8wKFgpe3JldHVybihhd2FpdCBmZXRjaCgiL2V4ZWMiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7Y29tbWFuZDpYfSl9KSkuanNvbigpfWZ1bmN0aW9uIGM2KFgpe3RyeXtsZXQgWj1KU09OLnBhcnNlKFgpLEo9W107Zm9yKGxldFtZLHFdb2YgT2JqZWN0LmVudHJpZXMoWi5kZXZpY2VzPz97fSkpe2xldCBRPVkucmVwbGFjZSgvXmNvbVwuYXBwbGVcLkNvcmVTaW11bGF0b3JcLlNpbVJ1bnRpbWVcLi8sIiIpLnJlcGxhY2UoLy0vZywiLiIpO2ZvcihsZXQgSyBvZiBxKWlmKEsuaXNBdmFpbGFibGUpSi5wdXNoKHt1ZGlkOksudWRpZCxuYW1lOksubmFtZSxzdGF0ZTpLLnN0YXRlLHJ1bnRpbWU6UX0pfXJldHVybiBKfWNhdGNoe3JldHVybltdfX1mdW5jdGlvbiB2NShYKXtsZXQgWj1YLnRvTG93ZXJDYXNlKCk7aWYoWi5pbmNsdWRlcygiaXBob25lIikpcmV0dXJuIDA7aWYoWi5pbmNsdWRlcygiaXBhZCIpKXJldHVybiAxO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIDI7aWYoWi5pbmNsdWRlcygidmlzaW9uIikpcmV0dXJuIDM7cmV0dXJuIDR9ZnVuY3Rpb24geTUoWCl7bGV0IFo9WC50b0xvd2VyQ2FzZSgpO2lmKFouc3RhcnRzV2l0aCgiaW9zIikpcmV0dXJuIDA7aWYoWi5zdGFydHNXaXRoKCJpcGFkb3MiKSlyZXR1cm4gMTtpZihaLnN0YXJ0c1dpdGgoIndhdGNob3MiKSlyZXR1cm4gMjtpZihaLnN0YXJ0c1dpdGgoInZpc2lvbm9zIil8fFouc3RhcnRzV2l0aCgieHJvcyIpKXJldHVybiAzO3JldHVybiA0fWZ1bmN0aW9uIGk2KHtkZXZpY2VzOlgsc2VsZWN0ZWRVZGlkOlosbG9hZGluZzpKLGVycm9yOlksc3RvcHBpbmdVZGlkczpxLG9uUmVmcmVzaDpRLG9uU2VsZWN0Okssb25TdG9wOlcsdHJpZ2dlcjpHfSl7bGV0W3osT109UyghMSksJD13KG51bGwpO3goKCk9PntpZigheilyZXR1cm47bGV0IFU9KGspPT57aWYoISQuY3VycmVudD8uY29udGFpbnMoay50YXJnZXQpKU8oITEpfTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsVSksKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLFUpfSxbel0pO2xldCBfPW5ldyBNYXA7Zm9yKGxldCBVIG9mIFgpe2lmKFUudWRpZD09PVopY29udGludWU7bGV0IGs9Xy5nZXQoVS5ydW50aW1lKTtpZighaylrPVtdLF8uc2V0KFUucnVudGltZSxrKTtrLnB1c2goVSl9Zm9yKGxldCBVIG9mIF8udmFsdWVzKCkpVS5zb3J0KChrLEkpPT52NShrLm5hbWUpLXY1KEkubmFtZSl8fGsubmFtZS5sb2NhbGVDb21wYXJlKEkubmFtZSkpO2xldCBBPVsuLi5fLmVudHJpZXMoKV0uc29ydCgoW1VdLFtrXSk9Pnk1KFUpLXk1KGspfHxVLmxvY2FsZUNvbXBhcmUoaykpLEM9WC5maW5kKChVKT0+VS51ZGlkPT09Wik/P251bGw7cmV0dXJuIE4oImRpdiIse3JlZjokLHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUifSxjaGlsZHJlbjpbTigiZGl2Iix7b25DbGljazooKT0+e2lmKCF6KVEoKTtPKChVKT0+IVUpfSxjaGlsZHJlbjpHfSkseiYmTigiZGl2Iix7c3R5bGU6bzYsY2hpbGRyZW46W04oImRpdiIse3N0eWxlOnM2LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2ZvbnRXZWlnaHQ6NjAwfSxjaGlsZHJlbjoiU2ltdWxhdG9ycyJ9KSxOKCJidXR0b24iLHtvbkNsaWNrOihVKT0+e1Uuc3RvcFByb3BhZ2F0aW9uKCksUSgpfSxkaXNhYmxlZDpKLHN0eWxlOnI2LGNoaWxkcmVuOko/Ii4uLiI6IlJlZnJlc2gifSldfSksWSYmTigiZGl2Iix7c3R5bGU6dDYsY2hpbGRyZW46WX0pLEMmJk4oZix7Y2hpbGRyZW46W04oImRpdiIse3N0eWxlOnsuLi5nNSxjb2xvcjoiI2E1YjRmYyJ9LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6cDUoQy5zdGF0ZT09PSJCb290ZWQiPyIjNGFkZTgwIjoiIzQ0NCIpfSksTigic3BhbiIse3N0eWxlOntmbGV4OjF9LGNoaWxkcmVuOkMubmFtZX0pXX0pLE4oImRpdiIse3N0eWxlOm42fSldfSksWC5sZW5ndGg9PT0wJiYhSiYmIVkmJk4oImRpdiIse3N0eWxlOmU2LGNoaWxkcmVuOiJObyBhdmFpbGFibGUgc2ltdWxhdG9ycyBmb3VuZCJ9KSxBLm1hcCgoW1Usa10pPT5OKCJkaXYiLHtjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6WDcsY2hpbGRyZW46VX0pLGsubWFwKChJKT0+e2xldCBNPXEuaGFzKEkudWRpZCksaD1JLnN0YXRlPT09IkJvb3RlZCI7cmV0dXJuIE4oImRpdiIse3N0eWxlOmc1LG9uTW91c2VFbnRlcjooRSk9PkUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDI1NSwyNTUsMjU1LDAuMDgpIixvbk1vdXNlTGVhdmU6KEUpPT5FLmN1cnJlbnRUYXJnZXQuc3R5bGUuYmFja2dyb3VuZD0idHJhbnNwYXJlbnQiLG9uQ2xpY2s6KCk9PntLKEkpLE8oITEpfSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnA1KGg/IiM0YWRlODAiOiIjNDQ0Iil9KSxOKCJzcGFuIix7c3R5bGU6e2ZsZXg6MX0sY2hpbGRyZW46SS5uYW1lfSksaCYmTigic3BhbiIse3JvbGU6ImJ1dHRvbiIsb25DbGljazooRSk9PntpZihFLnN0b3BQcm9wYWdhdGlvbigpLCFNKVcoSS51ZGlkKX0sc3R5bGU6e2ZvbnRTaXplOjEwLHBhZGRpbmc6IjFweCA2cHgiLGJvcmRlclJhZGl1czo0LGNvbG9yOk0/IiM4ODgiOiIjZjg3MTcxIixiYWNrZ3JvdW5kOk0/InRyYW5zcGFyZW50IjoicmdiYSgyNDgsMTEzLDExMywwLjEpIixjdXJzb3I6TT8iZGVmYXVsdCI6InBvaW50ZXIifSxjaGlsZHJlbjpNPyJTdG9wcGluZy4uLiI6IlN0b3AifSldfSxJLnVkaWQpfSldfSxVKSldfSldfSl9ZnVuY3Rpb24gcDUoWCl7cmV0dXJue3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6WCxmbGV4U2hyaW5rOjB9fWZ1bmN0aW9uIHU2KCl7bGV0IFg9d2luZG93Ll9fU0lNX1BSRVZJRVdfXyxbWixKXT1TKCExKSxbWSxxXT1TKFtdKSxbUSxLXT1TKCExKSxbVyxHXT1TKG51bGwpLFt6LE9dPVMobmV3IFNldCksWyQsX109UyghMSksQT1qKGFzeW5jKCk9PntLKCEwKSxHKG51bGwpO3RyeXtsZXQgRj1hd2FpdCBPMCgieGNydW4gc2ltY3RsIGxpc3QgZGV2aWNlcyBhdmFpbGFibGUgLWoiKTtpZihGLmV4aXRDb2RlIT09MCl0aHJvdyBFcnJvcihGLnN0ZGVycnx8InNpbWN0bCBsaXN0IGZhaWxlZCIpO3EoYzYoRi5zdGRvdXQpKX1jYXRjaChGKXtHKEYgaW5zdGFuY2VvZiBFcnJvcj9GLm1lc3NhZ2U6IkZhaWxlZCB0byBsaXN0IGRldmljZXMiKX1maW5hbGx5e0soITEpfX0sW10pO2lmKHgoKCk9PntBKCl9LFtBXSkseCgoKT0+e2lmKCFYPy5sb2dzRW5kcG9pbnQpcmV0dXJuO2xldCBGPW5ldyBFdmVudFNvdXJjZShYLmxvZ3NFbmRwb2ludCksUj1uZXcgTWFwLHY9WyIjOGJlOWZkIiwiIzUwZmE3YiIsIiNmZmI4NmMiLCIjZmY3OWM2IiwiI2JkOTNmOSIsIiNmMWZhOGMiLCIjNjI3MmE0IiwiI2ZmNTU1NSIsIiM2OWZmOTQiLCIjZDZhY2ZmIiwiI2ZmZmZhNSIsIiNhNGZmZmYiLCIjZmY2ZTZlIiwiI2NhYTlmYSIsIiM1YWY3OGUiXTtmdW5jdGlvbiBUKEowKXtsZXQgeT1SLmdldChKMCk7aWYoIXkpe2xldCBYMD0wO2ZvcihsZXQgYT0wO2E8SjAubGVuZ3RoO2ErKylYMD0oWDA8PDUpLVgwK0owLmNoYXJDb2RlQXQoYSl8MDt5PXZbTWF0aC5hYnMoWDApJXYubGVuZ3RoXSxSLnNldChKMCx5KX1yZXR1cm4geX1sZXQgdT0iIixtPSExO3JldHVybiBGLm9ubWVzc2FnZT0oSjApPT57dHJ5e2xldCB5PUpTT04ucGFyc2UoSjAuZGF0YSksWDA9eS5wcm9jZXNzSW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz95LnNlbmRlckltYWdlUGF0aD8uc3BsaXQoIi8iKS5wb3AoKT8/IiIsYT15LnN1YnN5c3RlbT8/IiIsVjA9eS5jYXRlZ29yeT8/IiIsWTA9eS5ldmVudE1lc3NhZ2U/PyIiO2lmKCFZMClyZXR1cm47aWYoWDAhPT11KXtpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtsZXQgTTA9VChYMCk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke1gwfSR7YT9gICVjJHthfSR7VjA/IjoiK1YwOiIifWA6IiJ9YCxgY29sb3I6JHtNMH07Zm9udC13ZWlnaHQ6Ym9sZGAsLi4uYT9bImNvbG9yOiM4ODg7Zm9udC13ZWlnaHQ6bm9ybWFsIl06W10pLG09ITAsdT1YMH1sZXQgYz0oeS5tZXNzYWdlVHlwZT8/IiIpLnRvTG93ZXJDYXNlKCksbz1hJiZYMD09PXU/YCVjJHtWMHx8YX0lYyBgOiIiLEEwPW8/WyJjb2xvcjojODg4O2ZvbnQtc3R5bGU6aXRhbGljIiwiY29sb3I6aW5oZXJpdCJdOltdO2lmKGM9PT0iZmF1bHQifHxjPT09ImVycm9yIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihjPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojNjI3MmE0Iik7ZWxzZSBjb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjppbmhlcml0Iil9Y2F0Y2h7fX0sKCk9PntpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtGLmNsb3NlKCl9fSxbWD8ubG9nc0VuZHBvaW50XSksIVgpcmV0dXJuIE4oImRpdiIse3N0eWxlOk4wLnBhZ2UsY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6TjAuZW1wdHksY2hpbGRyZW46W04oImgxIix7c3R5bGU6TjAuZW1wdHlUaXRsZSxjaGlsZHJlbjoiTm8gc2VydmUtc2ltIHN0cmVhbSBydW5uaW5nIn0pLE4oInAiLHtzdHlsZTpOMC5lbXB0eUhpbnQsY2hpbGRyZW46WyJCb290IGFuIGlPUyBzaW11bGF0b3IgYW5kIHN0YXJ0IGEgSGF0Y2ggc3RyZWFtIHdpdGgiLCIgIixOKCJjb2RlIix7c3R5bGU6TjAuY29kZSxjaGlsZHJlbjoiYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2gifSksIiwgdGhlbiByZWxvYWQuIl19KV19KX0pO2xldCBDPVkuZmluZCgoRik9PkYudWRpZD09PVguZGV2aWNlKT8/bnVsbCxVPWswKEM/Lm5hbWUpLGs9JDBbVV0sST1rLndpZHRoLTIqay5iZXplbFgsTT1rLmhlaWdodC0yKmsuYmV6ZWxZLGg9ZTAoVSksRT1VPT09InZpc2lvbiI/NTgwOlU9PT0iaXBhZCI/NDAwOlU9PT0id2F0Y2giPzIwMDozMjAsZT1kNihYLnN0cmVhbVVybCksWjA9dyhudWxsKTt4KCgpPT57bGV0IEY9bmV3IFdlYlNvY2tldChYLndzVXJsKTtyZXR1cm4gRi5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsWjAuY3VycmVudD1GLCgpPT57Ri5jbG9zZSgpLFowLmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IGc9aigoRixSKT0+e2xldCB2PVowLmN1cnJlbnQ7aWYoIXZ8fHYucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgVD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoUikpLHU9bmV3IFVpbnQ4QXJyYXkoMStULmxlbmd0aCk7dVswXT1GLHUuc2V0KFQsMSksdi5zZW5kKHUpfSxbXSksSzA9aigoRik9PmcoMyxGKSxbZ10pLHM9aigoRik9PmcoNSxGKSxbZ10pLHI9aigoRik9PmcoNCx7YnV0dG9uOkZ9KSxbZ10pLFUwPWooKEYsUik9PntnKDYse3R5cGU6Rix1c2FnZTpSfSl9LFtnXSksW2owLHYwXT1TKG51bGwpO3goKCk9PntsZXQgRj1uZXcgRXZlbnRTb3VyY2UoIi9hcHBzdGF0ZSIpLFI9bnVsbDtyZXR1cm4gRi5vbm1lc3NhZ2U9KHYpPT57dHJ5e2xldCBUPUpTT04ucGFyc2Uodi5kYXRhKTtpZihSKWNsZWFyVGltZW91dChSKTtsZXQgdT1UPy5pc1JlYWN0TmF0aXZlPzA6NjAwO1I9c2V0VGltZW91dCgoKT0+djAoVCksdSl9Y2F0Y2h7fX0sKCk9PntpZihSKWNsZWFyVGltZW91dChSKTtGLmNsb3NlKCl9fSxbXSk7bGV0IEcwPWooYXN5bmMoKT0+e1UwKCJkb3duIiwyMjcpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoImRvd24iLDIxKSxhd2FpdCBuZXcgUHJvbWlzZSgodik9PnNldFRpbWVvdXQodiwzMCkpLFUwKCJ1cCIsMjEpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoInVwIiwyMjcpfSxbVTBdKTt4KCgpPT57bGV0IEY9KFQsdSk9PntpZihULmNvZGU9PT0iS2V5SCImJlQubWV0YUtleSYmVC5zaGlmdEtleSl7aWYoVC5wcmV2ZW50RGVmYXVsdCgpLHU9PT0iZG93biImJiFULnJlcGVhdClnKDQse2J1dHRvbjoiaG9tZSJ9KTtyZXR1cm59aWYoVC5jb2RlPT09IktleUEiJiZULm1ldGFLZXkmJlQuc2hpZnRLZXkpe2lmKFQucHJldmVudERlZmF1bHQoKSx1PT09ImRvd24iJiYhVC5yZXBlYXQpTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlYCkudGhlbigoSjApPT57bGV0IHk9SjAuc3Rkb3V0LnRyaW0oKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIjtyZXR1cm4gTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlICR7eX1gKX0pLmNhdGNoKCgpPT57fSk7cmV0dXJufWxldCBtPWw2KFQuY29kZSk7aWYobT09bnVsbClyZXR1cm47VC5wcmV2ZW50RGVmYXVsdCgpLGcoNix7dHlwZTp1LHVzYWdlOm19KX0sUj0oVCk9PkYoVCwiZG93biIpLHY9KFQpPT5GKFQsInVwIik7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixSKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLHYpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLFIpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdil9fSxbZyxYLmRldmljZV0pO2xldCBKND1qKGFzeW5jKEYpPT57aWYoJHx8Ri51ZGlkPT09WC5kZXZpY2UpcmV0dXJuO18oITApO3RyeXtpZihGLnN0YXRlIT09IkJvb3RlZCIpYXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBib290ICR7Ri51ZGlkfWApO2F3YWl0IE8wKGBidW54IHNlcnZlLXNpbSAtLWtpbGwgJHtYLmRldmljZX1gKSxhd2FpdCBPMChgYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2ggJHtGLnVkaWR9YCksd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfWNhdGNoe18oITEpfX0sWyQsWC5kZXZpY2VdKSxJMD1qKGFzeW5jKEYpPT57TygoUik9Pm5ldyBTZXQoUikuYWRkKEYpKTt0cnl7YXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBzaHV0ZG93biAke0Z9YCksYXdhaXQgQSgpfWZpbmFsbHl7TygoUik9PntsZXQgdj1uZXcgU2V0KFIpO3JldHVybiB2LmRlbGV0ZShGKSx2fSl9fSxbQV0pO3JldHVybiBOKCJkaXYiLHtzdHlsZTpOMC5wYWdlLGNoaWxkcmVuOltOKHQse2V4ZWM6TzAsZGV2aWNlVWRpZDpYLmRldmljZSxkZXZpY2VOYW1lOkM/Lm5hbWU/P251bGwsZGV2aWNlUnVudGltZTpDPy5ydW50aW1lPz9udWxsLHN0cmVhbWluZzpaLHN0eWxlOnttYXhXaWR0aDpFfSxjaGlsZHJlbjpbTihpNix7ZGV2aWNlczpZLHNlbGVjdGVkVWRpZDpYLmRldmljZSxsb2FkaW5nOlEsZXJyb3I6VyxzdG9wcGluZ1VkaWRzOnosb25SZWZyZXNoOkEsb25TZWxlY3Q6SjQsb25TdG9wOkkwLHRyaWdnZXI6Tih0LlRpdGxlLHt9KX0pLE4odC5BY3Rpb25zLHtjaGlsZHJlbjpbajA/LmlzUmVhY3ROYXRpdmUmJk4odC5CdXR0b24seyJhcmlhLWxhYmVsIjoiUmVsb2FkIFJlYWN0IE5hdGl2ZSBidW5kbGUiLHRpdGxlOiJSZWxvYWQgKENtZCtSKSIsb25DbGljazooKT0+dm9pZCBHMCgpLGNoaWxkcmVuOk4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTMgMTJhOSA5IDAgMSAwIDMuNS03LjEifSksTigicG9seWxpbmUiLHtwb2ludHM6IjMgMyAzIDkgOSA5In0pXX0pfSksTih0LkhvbWVCdXR0b24se29uQ2xpY2s6KEYpPT57Ri5wcmV2ZW50RGVmYXVsdCgpLHIoImhvbWUiKX19KSxOKHQuU2NyZWVuc2hvdEJ1dHRvbix7fSksTih0LlJvdGF0ZUJ1dHRvbix7fSldfSldfSksTigiZGl2Iix7c3R5bGU6e21heFdpZHRoOkUsd2lkdGg6IjEwMCUiLGFzcGVjdFJhdGlvOmAke0l9IC8gJHtNfWB9LGNoaWxkcmVuOk4objAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOmgsY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOkosb25TdHJlYW1Ub3VjaDpLMCxvblN0cmVhbU11bHRpVG91Y2g6cyxvblN0cmVhbUJ1dHRvbjpyLHN1YnNjcmliZUZyYW1lOmUuc3Vic2NyaWJlRnJhbWUsc3RyZWFtRnJhbWU6ZS5mcmFtZSxzdHJlYW1Db25maWc6ZS5jb25maWd9KX0pLE4oImRpdiIse3N0eWxlOk4wLmJhcixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6ey4uLk4wLmxpdmUsY29sb3I6Wj8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnsuLi5OMC5kb3QsYmFja2dyb3VuZDpaPyIjNGFkZTgwIjoiIzY2NiJ9fSksWj8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIE4wPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX0sbzY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiJjYWxjKDEwMCUgKyA2cHgpIixsZWZ0OjAsbWluV2lkdGg6MjYwLG1heEhlaWdodDozNjAsb3ZlcmZsb3dZOiJhdXRvIixiYWNrZ3JvdW5kOiIjMWMxYzFlIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIixib3JkZXJSYWRpdXM6MTAscGFkZGluZzo0LGJveFNoYWRvdzoiMCA4cHggMjRweCByZ2JhKDAsMCwwLDAuNSkiLGZvbnRGYW1pbHk6InVpLW1vbm9zcGFjZSwgbW9ub3NwYWNlIixmb250U2l6ZToxMyxjb2xvcjoiI2VlZSIsekluZGV4OjIwfSxzNj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNnB4IDEwcHgiLGZvbnRTaXplOjExLGNvbG9yOiIjYWFhIn0scjY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjYTViNGZjIixmb250U2l6ZToxMSxjdXJzb3I6InBvaW50ZXIiLHBhZGRpbmc6MH0sdDY9e3BhZGRpbmc6IjZweCAxMHB4Iixjb2xvcjoiI2Y4NzE3MSIsZm9udFNpemU6MTF9LGc1PXtkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo4LHBhZGRpbmc6IjZweCAxMHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4xNXMifSxuNj17aGVpZ2h0OjEsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjA4KSIsbWFyZ2luOiI0cHggMCJ9LGU2PXtwYWRkaW5nOjEyLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGZvbnRTaXplOjExLHRleHRBbGlnbjoiY2VudGVyIn0sWDc9e3BhZGRpbmc6IjZweCAxMHB4IDJweCIsZm9udFNpemU6MTAsZm9udFdlaWdodDo2MDAsY29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsdGV4dFRyYW5zZm9ybToidXBwZXJjYXNlIixsZXR0ZXJTcGFjaW5nOiIwLjA4ZW0ifTtPNShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIoTih1Nix7fSkpOwo8L3NjcmlwdD4KPC9ib2R5PjwvaHRtbD4=","base64").toString("utf-8");return A}function o(Y){let J=(Y?.basePath??"/.sim").replace(/\/+$/,"");return(Q,z,Z)=>{let C=Q.url??"";if(C===J||C===J+"/"){let V=L()[0]??null,W=h();if(V){let H=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...V,logsEndpoint:J+"/logs"})}</script>`;W=W.replace("<!--__SIM_PREVIEW_CONFIG__-->",H)}z.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),z.end(W);return}if(C===J+"/api"){let X=L();z.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),z.end(JSON.stringify(X[0]||null));return}if((C===J+"/exec"||C===J+"/exec/")&&Q.method==="POST"){let X="";Q.on("data",(V)=>{X+=typeof V==="string"?V:V.toString()}),Q.on("end",()=>{let V="";try{V=JSON.parse(X).command??""}catch{}if(!V){z.writeHead(400,{"Content-Type":"application/json"}),z.end(JSON.stringify({stdout:"",stderr:"Missing command",exitCode:1}));return}q(V,{maxBuffer:16777216},(W,$,H)=>{z.writeHead(200,{"Content-Type":"application/json"}),z.end(JSON.stringify({stdout:$.toString(),stderr:H.toString(),exitCode:W?W.code??1:0}))})});return}if(C===J+"/logs"||C.startsWith(J+"/logs?")){let X=L();if(X.length===0){z.writeHead(404),z.end("No serve-sim device");return}let V=X[0].device;z.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),z.write(`:
2
+ import{readdirSync as g,readFileSync as y,existsSync as N,unlinkSync as F}from"fs";import{execSync as R,spawn as U,exec as q,execFile as k}from"child_process";import{tmpdir as _}from"os";import{join as w}from"path";var B=w(_(),"serve-sim"),I=new Set(["host.exp.Exponent","dev.expo.Exponent"]),v=["Frameworks/React.framework","Frameworks/hermes.framework","Frameworks/Hermes.framework","Frameworks/ExpoModulesCore.framework","main.jsbundle"],f=/(WidgetRenderer|ExtensionHost|\.extension(\.|$)|Service|PlaceholderApp|InCallService|CallUI|InCallUI|com\.apple\.Preferences\.Cellular|com\.apple\.purplebuddy|com\.apple\.chrono|com\.apple\.shuttle|com\.apple\.usernotificationsui)/i;function m(Y){return!f.test(Y)}function p(Y,J){if(I.has(J))return Promise.resolve(!0);return new Promise((Q)=>{k("xcrun",["simctl","get_app_container",Y,J,"app"],{timeout:2000},(z,Z)=>{if(z)return Q(!1);let C=Z.trim();if(!C)return Q(!1);for(let X of v)if(N(w(C,X)))return Q(!0);Q(!1)})})}var O={at:0,booted:null};function S(){let Y=Date.now();if(O.booted&&Y-O.at<1500)return O.booted;try{let J=R("xcrun simctl list devices booted -j",{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:3000}),Q=JSON.parse(J),z=new Set;for(let Z of Object.values(Q.devices))for(let C of Z)if(C.state==="Booted")z.add(C.udid);return O={at:Y,booted:z},z}catch{return null}}function L(){let Y;try{Y=g(B).filter((z)=>z.startsWith("server-")&&z.endsWith(".json"))}catch{return[]}let J=S(),Q=[];for(let z of Y){let Z=w(B,z);try{let C=JSON.parse(y(Z,"utf-8"));try{process.kill(C.pid,0)}catch{try{F(Z)}catch{}continue}if(J&&!J.has(C.device)){try{process.kill(C.pid,"SIGTERM")}catch{}try{F(Z)}catch{}continue}Q.push(C)}catch{}}return Q}var A=null;function h(){if(!A)A=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYzAsQixqNCxtNSxQMCxiNCx2NCx5NCwkNCxtMCxUMCxwNCxHNCx6NCxXNCxnNCxkMD17fSxhMD1bXSxmNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLGIwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gejAoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVjQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gVzAoWCxaLEope3ZhciBZLHEsUSxLPXt9O2ZvcihRIGluIFopUT09ImtleSI/WT1aW1FdOlE9PSJyZWYiP3E9WltRXTpLW1FdPVpbUV07aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoSy5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YzAuY2FsbChhcmd1bWVudHMsMik6SiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihRIGluIFguZGVmYXVsdFByb3BzKUtbUV09PT12b2lkIDAmJihLW1FdPVguZGVmYXVsdFByb3BzW1FdKTtyZXR1cm4gZjAoWCxLLFkscSxudWxsKX1mdW5jdGlvbiBmMChYLFosSixZLHEpe3ZhciBRPXt0eXBlOlgscHJvcHM6WixrZXk6SixyZWY6WSxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK2o0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmQi52bm9kZSE9bnVsbCYmQi52bm9kZShRKSxRfWZ1bmN0aW9uIGYoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gaShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn1mdW5jdGlvbiBCMChYLFope2lmKFo9PW51bGwpcmV0dXJuIFguX18/QjAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgSjtaPFguX19rLmxlbmd0aDtaKyspaWYoKEo9WC5fX2tbWl0pIT1udWxsJiZKLl9fZSE9bnVsbClyZXR1cm4gSi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/QjAoWCk6bnVsbH1mdW5jdGlvbiBkNShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBaPVguX192LEo9Wi5fX2UsWT1bXSxxPVtdLFE9ejAoe30sWik7US5fX3Y9Wi5fX3YrMSxCLnZub2RlJiZCLnZub2RlKFEpLEg0KFguX19QLFEsWixYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWi5fX3U/W0pdOm51bGwsWSxKPT1udWxsP0IwKFopOkosISEoMzImWi5fX3UpLHEpLFEuX192PVouX192LFEuX18uX19rW1EuX19pXT1RLGY0KFksUSxxKSxaLl9fZT1aLl9fPW51bGwsUS5fX2UhPUomJng0KFEpfX1mdW5jdGlvbiB4NChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFope2lmKFohPW51bGwmJlouX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVouX19lfSkseDQoWCl9ZnVuY3Rpb24gTDQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmUDAucHVzaChYKSYmIWwwLl9fcisrfHxiNCE9Qi5kZWJvdW5jZVJlbmRlcmluZykmJigoYjQ9Qi5kZWJvdW5jZVJlbmRlcmluZyl8fHY0KShsMCl9ZnVuY3Rpb24gbDAoKXt0cnl7Zm9yKHZhciBYLFo9MTtQMC5sZW5ndGg7KVAwLmxlbmd0aD5aJiZQMC5zb3J0KHk0KSxYPVAwLnNoaWZ0KCksWj1QMC5sZW5ndGgsZDUoWCl9ZmluYWxseXtQMC5sZW5ndGg9bDAuX19yPTB9fWZ1bmN0aW9uIGg0KFgsWixKLFkscSxRLEssVyxHLHosTyl7dmFyICQsXyxBLE0sVSxrLEksQz1ZJiZZLl9fa3x8YTAsaD1aLmxlbmd0aDtmb3IoRz1hNShKLFosQyxHLGgpLCQ9MDskPGg7JCsrKShBPUouX19rWyRdKSE9bnVsbCYmKF89QS5fX2khPS0xJiZDW0EuX19pXXx8ZDAsQS5fX2k9JCxrPUg0KFgsQSxfLHEsUSxLLFcsRyx6LE8pLE09QS5fX2UsQS5yZWYmJl8ucmVmIT1BLnJlZiYmKF8ucmVmJiZQNChfLnJlZixudWxsLEEpLE8ucHVzaChBLnJlZixBLl9fY3x8TSxBKSksVT09bnVsbCYmTSE9bnVsbCYmKFU9TSksKEk9ISEoNCZBLl9fdSkpfHxfLl9faz09PUEuX19rPyhHPW00KEEsRyxYLEkpLEkmJl8uX19lJiYoXy5fX2U9bnVsbCkpOnR5cGVvZiBBLnR5cGU9PSJmdW5jdGlvbiImJmshPT12b2lkIDA/Rz1rOk0mJihHPU0ubmV4dFNpYmxpbmcpLEEuX191Jj0tNyk7cmV0dXJuIEouX19lPVUsR31mdW5jdGlvbiBhNShYLFosSixZLHEpe3ZhciBRLEssVyxHLHosTz1KLmxlbmd0aCwkPU8sXz0wO2ZvcihYLl9faz1BcnJheShxKSxRPTA7UTxxO1ErKykoSz1aW1FdKSE9bnVsbCYmdHlwZW9mIEshPSJib29sZWFuIiYmdHlwZW9mIEshPSJmdW5jdGlvbiI/KHR5cGVvZiBLPT0ic3RyaW5nInx8dHlwZW9mIEs9PSJudW1iZXIifHx0eXBlb2YgSz09ImJpZ2ludCJ8fEsuY29uc3RydWN0b3I9PVN0cmluZz9LPVguX19rW1FdPWYwKG51bGwsSyxudWxsLG51bGwsbnVsbCk6YjAoSyk/Sz1YLl9fa1tRXT1mMChmLHtjaGlsZHJlbjpLfSxudWxsLG51bGwsbnVsbCk6Sy5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmSy5fX2I+MD9LPVguX19rW1FdPWYwKEsudHlwZSxLLnByb3BzLEsua2V5LEsucmVmP0sucmVmOm51bGwsSy5fX3YpOlguX19rW1FdPUssRz1RK18sSy5fXz1YLEsuX19iPVguX19iKzEsVz1udWxsLCh6PUsuX19pPWw1KEssSixHLCQpKSE9LTEmJigkLS0sKFc9Slt6XSkmJihXLl9fdXw9MikpLFc9PW51bGx8fFcuX192PT1udWxsPyh6PT0tMSYmKHE+Tz9fLS06cTxPJiZfKyspLHR5cGVvZiBLLnR5cGUhPSJmdW5jdGlvbiImJihLLl9fdXw9NCkpOnohPUcmJih6PT1HLTE/Xy0tOno9PUcrMT9fKys6KHo+Rz9fLS06XysrLEsuX191fD00KSkpOlguX19rW1FdPW51bGw7aWYoJClmb3IoUT0wO1E8TztRKyspKFc9SltRXSkhPW51bGwmJigyJlcuX191KT09MCYmKFcuX19lPT1ZJiYoWT1CMChXKSksYTQoVyxXKSk7cmV0dXJuIFl9ZnVuY3Rpb24gbTQoWCxaLEosWSl7dmFyIHEsUTtpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxRPTA7cSYmUTxxLmxlbmd0aDtRKyspcVtRXSYmKHFbUV0uX189WCxaPW00KHFbUV0sWixKLFkpKTtyZXR1cm4gWn1YLl9fZSE9WiYmKFkmJihaJiZYLnR5cGUmJiFaLnBhcmVudE5vZGUmJihaPUIwKFgpKSxKLmluc2VydEJlZm9yZShYLl9fZSxafHxudWxsKSksWj1YLl9fZSk7ZG8gWj1aJiZaLm5leHRTaWJsaW5nO3doaWxlKFohPW51bGwmJloubm9kZVR5cGU9PTgpO3JldHVybiBafWZ1bmN0aW9uIEwwKFgsWil7cmV0dXJuIFo9Wnx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KGIwKFgpP1guc29tZShmdW5jdGlvbihKKXtMMChKLFopfSk6Wi5wdXNoKFgpKSxafWZ1bmN0aW9uIGw1KFgsWixKLFkpe3ZhciBxLFEsSyxXPVgua2V5LEc9WC50eXBlLHo9WltKXSxPPXohPW51bGwmJigyJnouX191KT09MDtpZih6PT09bnVsbCYmVz09bnVsbHx8TyYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gSjtpZihZPihPPzE6MCkpe2ZvcihxPUotMSxRPUorMTtxPj0wfHxRPFoubGVuZ3RoOylpZigoej1aW0s9cT49MD9xLS06USsrXSkhPW51bGwmJigyJnouX191KT09MCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gS31yZXR1cm4tMX1mdW5jdGlvbiBTNChYLFosSil7WlswXT09Ii0iP1guc2V0UHJvcGVydHkoWixKPT1udWxsPyIiOkopOlhbWl09Sj09bnVsbD8iIjp0eXBlb2YgSiE9Im51bWJlciJ8fGY1LnRlc3QoWik/SjpKKyJweCJ9ZnVuY3Rpb24gaDAoWCxaLEosWSxxKXt2YXIgUSxLO1g6aWYoWj09InN0eWxlIilpZih0eXBlb2YgSj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PUo7ZWxzZXtpZih0eXBlb2YgWT09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9WT0iIiksWSlmb3IoWiBpbiBZKUomJlogaW4gSnx8UzQoWC5zdHlsZSxaLCIiKTtpZihKKWZvcihaIGluIEopWSYmSltaXT09WVtaXXx8UzQoWC5zdHlsZSxaLEpbWl0pfWVsc2UgaWYoWlswXT09Im8iJiZaWzFdPT0ibiIpUT1aIT0oWj1aLnJlcGxhY2UocDQsIiQxIikpLEs9Wi50b0xvd2VyQ2FzZSgpLFo9SyBpbiBYfHxaPT0ib25Gb2N1c091dCJ8fFo9PSJvbkZvY3VzSW4iP0suc2xpY2UoMik6Wi5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtaK1FdPUosSj9ZP0pbVDBdPVlbVDBdOihKW1QwXT1HNCxYLmFkZEV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilaPVoucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWiE9IndpZHRoIiYmWiE9ImhlaWdodCImJlohPSJocmVmIiYmWiE9Imxpc3QiJiZaIT0iZm9ybSImJlohPSJ0YWJJbmRleCImJlohPSJkb3dubG9hZCImJlohPSJyb3dTcGFuIiYmWiE9ImNvbFNwYW4iJiZaIT0icm9sZSImJlohPSJwb3BvdmVyIiYmWiBpbiBYKXRyeXtYW1pdPUo9PW51bGw/IiI6SjticmVhayBYfWNhdGNoKFcpe310eXBlb2YgSj09ImZ1bmN0aW9uInx8KEo9PW51bGx8fEo9PT0hMSYmWls0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFopOlguc2V0QXR0cmlidXRlKFosWj09InBvcG92ZXIiJiZKPT0xPyIiOkopKX19ZnVuY3Rpb24gUjQoWCl7cmV0dXJuIGZ1bmN0aW9uKFope2lmKHRoaXMubCl7dmFyIEo9dGhpcy5sW1oudHlwZStYXTtpZihaW20wXT09bnVsbClaW20wXT1HNCsrO2Vsc2UgaWYoWlttMF08SltUMF0pcmV0dXJuO3JldHVybiBKKEIuZXZlbnQ/Qi5ldmVudChaKTpaKX19fWZ1bmN0aW9uIEg0KFgsWixKLFkscSxRLEssVyxHLHope3ZhciBPLCQsXyxBLE0sVSxrLEksQyxoLEUsZSxaMCx4LEswLHM9Wi50eXBlO2lmKFouY29uc3RydWN0b3IhPT12b2lkIDApcmV0dXJuIG51bGw7MTI4JkouX191JiYoRz0hISgzMiZKLl9fdSksUT1bVz1aLl9fZT1KLl9fZV0pLChPPUIuX19iKSYmTyhaKTtYOmlmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXRyeXtpZihJPVoucHJvcHMsQz1zLnByb3RvdHlwZSYmcy5wcm90b3R5cGUucmVuZGVyLGg9KE89cy5jb250ZXh0VHlwZSkmJllbTy5fX2NdLEU9Tz9oP2gucHJvcHMudmFsdWU6Ty5fXzpZLEouX19jP2s9KCQ9Wi5fX2M9Si5fX2MpLl9fPSQuX19FOihDP1ouX19jPSQ9bmV3IHMoSSxFKTooWi5fX2M9JD1uZXcgaShJLEUpLCQuY29uc3RydWN0b3I9cywkLnJlbmRlcj1pNSksaCYmaC5zdWIoJCksJC5zdGF0ZXx8KCQuc3RhdGU9e30pLCQuX19uPVksXz0kLl9fZD0hMCwkLl9faD1bXSwkLl9zYj1bXSksQyYmJC5fX3M9PW51bGwmJigkLl9fcz0kLnN0YXRlKSxDJiZzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyE9bnVsbCYmKCQuX19zPT0kLnN0YXRlJiYoJC5fX3M9ejAoe30sJC5fX3MpKSx6MCgkLl9fcyxzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhJLCQuX19zKSkpLEE9JC5wcm9wcyxNPSQuc3RhdGUsJC5fX3Y9WixfKUMmJnMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiYkLmNvbXBvbmVudFdpbGxNb3VudCE9bnVsbCYmJC5jb21wb25lbnRXaWxsTW91bnQoKSxDJiYkLmNvbXBvbmVudERpZE1vdW50IT1udWxsJiYkLl9faC5wdXNoKCQuY29tcG9uZW50RGlkTW91bnQpO2Vsc2V7aWYoQyYmcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PW51bGwmJkkhPT1BJiYkLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPW51bGwmJiQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhJLEUpLFouX192PT1KLl9fdnx8ISQuX19lJiYkLnNob3VsZENvbXBvbmVudFVwZGF0ZSE9bnVsbCYmJC5zaG91bGRDb21wb25lbnRVcGRhdGUoSSwkLl9fcyxFKT09PSExKXtaLl9fdiE9Si5fX3YmJigkLnByb3BzPUksJC5zdGF0ZT0kLl9fcywkLl9fZD0hMSksWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssWi5fX2suc29tZShmdW5jdGlvbihyKXtyJiYoci5fXz1aKX0pLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdLCQuX19oLmxlbmd0aCYmSy5wdXNoKCQpO2JyZWFrIFh9JC5jb21wb25lbnRXaWxsVXBkYXRlIT1udWxsJiYkLmNvbXBvbmVudFdpbGxVcGRhdGUoSSwkLl9fcyxFKSxDJiYkLmNvbXBvbmVudERpZFVwZGF0ZSE9bnVsbCYmJC5fX2gucHVzaChmdW5jdGlvbigpeyQuY29tcG9uZW50RGlkVXBkYXRlKEEsTSxVKX0pfWlmKCQuY29udGV4dD1FLCQucHJvcHM9SSwkLl9fUD1YLCQuX19lPSExLGU9Qi5fX3IsWjA9MCxDKSQuc3RhdGU9JC5fX3MsJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdO2Vsc2UgZG8gJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLCQuc3RhdGU9JC5fX3M7d2hpbGUoJC5fX2QmJisrWjA8MjUpOyQuc3RhdGU9JC5fX3MsJC5nZXRDaGlsZENvbnRleHQhPW51bGwmJihZPXowKHowKHt9LFkpLCQuZ2V0Q2hpbGRDb250ZXh0KCkpKSxDJiYhXyYmJC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9bnVsbCYmKFU9JC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShBLE0pKSx4PU8hPW51bGwmJk8udHlwZT09PWYmJk8ua2V5PT1udWxsP2Q0KE8ucHJvcHMuY2hpbGRyZW4pOk8sVz1oNChYLGIwKHgpP3g6W3hdLFosSixZLHEsUSxLLFcsRyx6KSwkLmJhc2U9Wi5fX2UsWi5fX3UmPS0xNjEsJC5fX2gubGVuZ3RoJiZLLnB1c2goJCksayYmKCQuX19FPSQuX189bnVsbCl9Y2F0Y2gocil7aWYoWi5fX3Y9bnVsbCxHfHxRIT1udWxsKWlmKHIudGhlbil7Zm9yKFouX191fD1HPzE2MDoxMjg7VyYmVy5ub2RlVHlwZT09OCYmVy5uZXh0U2libGluZzspVz1XLm5leHRTaWJsaW5nO1FbUS5pbmRleE9mKFcpXT1udWxsLFouX19lPVd9ZWxzZXtmb3IoSzA9US5sZW5ndGg7SzAtLTspVjQoUVtLMF0pO040KFopfWVsc2UgWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssci50aGVufHxONChaKTtCLl9fZShyLFosSil9ZWxzZSBRPT1udWxsJiZaLl9fdj09Si5fX3Y/KFouX19rPUouX19rLFouX19lPUouX19lKTpXPVouX19lPWM1KEouX19lLFosSixZLHEsUSxLLEcseik7cmV0dXJuKE89Qi5kaWZmZWQpJiZPKFopLDEyOCZaLl9fdT92b2lkIDA6V31mdW5jdGlvbiBONChYKXtYJiYoWC5fX2MmJihYLl9fYy5fX2U9ITApLFguX19rJiZYLl9fay5zb21lKE40KSl9ZnVuY3Rpb24gZjQoWCxaLEope2Zvcih2YXIgWT0wO1k8Si5sZW5ndGg7WSsrKVA0KEpbWV0sSlsrK1ldLEpbKytZXSk7Qi5fX2MmJkIuX19jKFosWCksWC5zb21lKGZ1bmN0aW9uKHEpe3RyeXtYPXEuX19oLHEuX19oPVtdLFguc29tZShmdW5jdGlvbihRKXtRLmNhbGwocSl9KX1jYXRjaChRKXtCLl9fZShRLHEuX192KX19KX1mdW5jdGlvbiBkNChYKXtyZXR1cm4gdHlwZW9mIFghPSJvYmplY3QifHxYPT1udWxsfHxYLl9fYj4wP1g6YjAoWCk/WC5tYXAoZDQpOnowKHt9LFgpfWZ1bmN0aW9uIGM1KFgsWixKLFkscSxRLEssVyxHKXt2YXIgeixPLCQsXyxBLE0sVSxrPUoucHJvcHN8fGQwLEk9Wi5wcm9wcyxDPVoudHlwZTtpZihDPT0ic3ZnIj9xPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI6Qz09Im1hdGgiP3E9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiOnF8fChxPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiksUSE9bnVsbCl7Zm9yKHo9MDt6PFEubGVuZ3RoO3orKylpZigoQT1RW3pdKSYmInNldEF0dHJpYnV0ZSJpbiBBPT0hIUMmJihDP0EubG9jYWxOYW1lPT1DOkEubm9kZVR5cGU9PTMpKXtYPUEsUVt6XT1udWxsO2JyZWFrfX1pZihYPT1udWxsKXtpZihDPT1udWxsKXJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShJKTtYPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhxLEMsSS5pcyYmSSksVyYmKEIuX19tJiZCLl9fbShaLFEpLFc9ITEpLFE9bnVsbH1pZihDPT1udWxsKWs9PT1JfHxXJiZYLmRhdGE9PUl8fChYLmRhdGE9SSk7ZWxzZXtpZihRPVEmJmMwLmNhbGwoWC5jaGlsZE5vZGVzKSwhVyYmUSE9bnVsbClmb3Ioaz17fSx6PTA7ejxYLmF0dHJpYnV0ZXMubGVuZ3RoO3orKylrWyhBPVguYXR0cmlidXRlc1t6XSkubmFtZV09QS52YWx1ZTtmb3IoeiBpbiBrKUE9a1t6XSx6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyQ9QTp6PT0iY2hpbGRyZW4ifHwoeiBpbiBJKXx8ej09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSSl8fHo9PSJjaGVja2VkIiYmKCJkZWZhdWx0Q2hlY2tlZCJpbiBJKXx8aDAoWCx6LG51bGwsQSxxKTtmb3IoeiBpbiBJKUE9SVt6XSx6PT0iY2hpbGRyZW4iP189QTp6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP089QTp6PT0idmFsdWUiP009QTp6PT0iY2hlY2tlZCI/VT1BOlcmJnR5cGVvZiBBIT0iZnVuY3Rpb24ifHxrW3pdPT09QXx8aDAoWCx6LEEsa1t6XSxxKTtpZihPKVd8fCQmJihPLl9faHRtbD09JC5fX2h0bWx8fE8uX19odG1sPT1YLmlubmVySFRNTCl8fChYLmlubmVySFRNTD1PLl9faHRtbCksWi5fX2s9W107ZWxzZSBpZigkJiYoWC5pbm5lckhUTUw9IiIpLGg0KFoudHlwZT09InRlbXBsYXRlIj9YLmNvbnRlbnQ6WCxiMChfKT9fOltfXSxaLEosWSxDPT0iZm9yZWlnbk9iamVjdCI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOnEsUSxLLFE/UVswXTpKLl9fayYmQjAoSiwwKSxXLEcpLFEhPW51bGwpZm9yKHo9US5sZW5ndGg7ei0tOylWNChRW3pdKTtXfHwoej0idmFsdWUiLEM9PSJwcm9ncmVzcyImJk09PW51bGw/WC5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik6TSE9bnVsbCYmKE0hPT1YW3pdfHxDPT0icHJvZ3Jlc3MiJiYhTXx8Qz09Im9wdGlvbiImJk0hPWtbel0pJiZoMChYLHosTSxrW3pdLHEpLHo9ImNoZWNrZWQiLFUhPW51bGwmJlUhPVhbel0mJmgwKFgseixVLGtbel0scSkpfXJldHVybiBYfWZ1bmN0aW9uIFA0KFgsWixKKXt0cnl7aWYodHlwZW9mIFg9PSJmdW5jdGlvbiIpe3ZhciBZPXR5cGVvZiBYLl9fdT09ImZ1bmN0aW9uIjtZJiZYLl9fdSgpLFkmJlo9PW51bGx8fChYLl9fdT1YKFopKX1lbHNlIFguY3VycmVudD1afWNhdGNoKHEpe0IuX19lKHEsSil9fWZ1bmN0aW9uIGE0KFgsWixKKXt2YXIgWSxxO2lmKEIudW5tb3VudCYmQi51bm1vdW50KFgpLChZPVgucmVmKSYmKFkuY3VycmVudCYmWS5jdXJyZW50IT1YLl9fZXx8UDQoWSxudWxsLFopKSwoWT1YLl9fYykhPW51bGwpe2lmKFkuY29tcG9uZW50V2lsbFVubW91bnQpdHJ5e1kuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChRKXtCLl9fZShRLFopfVkuYmFzZT1ZLl9fUD1udWxsfWlmKFk9WC5fX2spZm9yKHE9MDtxPFkubGVuZ3RoO3ErKylZW3FdJiZhNChZW3FdLFosSnx8dHlwZW9mIFgudHlwZSE9ImZ1bmN0aW9uIik7Snx8VjQoWC5fX2UpLFguX19jPVguX189WC5fX2U9dm9pZCAwfWZ1bmN0aW9uIGk1KFgsWixKKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcihYLEopfWZ1bmN0aW9uIGkwKFgsWixKKXt2YXIgWSxxLFEsSztaPT1kb2N1bWVudCYmKFo9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSxCLl9fJiZCLl9fKFgsWikscT0oWT10eXBlb2YgSj09ImZ1bmN0aW9uIik/bnVsbDpKJiZKLl9fa3x8Wi5fX2ssUT1bXSxLPVtdLEg0KFosWD0oIVkmJkp8fFopLl9faz1XMChmLG51bGwsW1hdKSxxfHxkMCxkMCxaLm5hbWVzcGFjZVVSSSwhWSYmSj9bSl06cT9udWxsOlouZmlyc3RDaGlsZD9jMC5jYWxsKFouY2hpbGROb2Rlcyk6bnVsbCxRLCFZJiZKP0o6cT9xLl9fZTpaLmZpcnN0Q2hpbGQsWSxLKSxmNChRLFgsSyl9ZnVuY3Rpb24gXzAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWSxxO3JldHVybiB0aGlzLmdldENoaWxkQ29udGV4dHx8KFk9bmV3IFNldCwocT17fSlbWi5fX2NdPXRoaXMsdGhpcy5nZXRDaGlsZENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcX0sdGhpcy5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1k9bnVsbH0sdGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oUSl7dGhpcy5wcm9wcy52YWx1ZSE9US52YWx1ZSYmWS5mb3JFYWNoKGZ1bmN0aW9uKEspe0suX19lPSEwLEw0KEspfSl9LHRoaXMuc3ViPWZ1bmN0aW9uKFEpe1kuYWRkKFEpO3ZhciBLPVEuY29tcG9uZW50V2lsbFVubW91bnQ7US5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1kmJlkuZGVsZXRlKFEpLEsmJksuY2FsbChRKX19KSxKLmNoaWxkcmVufXJldHVybiBaLl9fYz0iX19jQyIrZzQrKyxaLl9fPVgsWi5Qcm92aWRlcj1aLl9fbD0oWi5Db25zdW1lcj1mdW5jdGlvbihKLFkpe3JldHVybiBKLmNoaWxkcmVuKFkpfSkuY29udGV4dFR5cGU9WixafWMwPWEwLnNsaWNlLEI9e19fZTpmdW5jdGlvbihYLFosSixZKXtmb3IodmFyIHEsUSxLO1o9Wi5fXzspaWYoKHE9Wi5fX2MpJiYhcS5fXyl0cnl7aWYoKFE9cS5jb25zdHJ1Y3RvcikmJlEuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT1udWxsJiYocS5zZXRTdGF0ZShRLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihYKSksSz1xLl9fZCkscS5jb21wb25lbnREaWRDYXRjaCE9bnVsbCYmKHEuY29tcG9uZW50RGlkQ2F0Y2goWCxZfHx7fSksSz1xLl9fZCksSylyZXR1cm4gcS5fX0U9cX1jYXRjaChXKXtYPVd9dGhyb3cgWH19LGo0PTAsbTU9ZnVuY3Rpb24oWCl7cmV0dXJuIFghPW51bGwmJlguY29uc3RydWN0b3I9PT12b2lkIDB9LGkucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKFgsWil7dmFyIEo7Sj10aGlzLl9fcyE9bnVsbCYmdGhpcy5fX3MhPXRoaXMuc3RhdGU/dGhpcy5fX3M6dGhpcy5fX3M9ejAoe30sdGhpcy5zdGF0ZSksdHlwZW9mIFg9PSJmdW5jdGlvbiImJihYPVgoejAoe30sSiksdGhpcy5wcm9wcykpLFgmJnowKEosWCksWCE9bnVsbCYmdGhpcy5fX3YmJihaJiZ0aGlzLl9zYi5wdXNoKFopLEw0KHRoaXMpKX0saS5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oWCl7dGhpcy5fX3YmJih0aGlzLl9fZT0hMCxYJiZ0aGlzLl9faC5wdXNoKFgpLEw0KHRoaXMpKX0saS5wcm90b3R5cGUucmVuZGVyPWYsUDA9W10sdjQ9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTpzZXRUaW1lb3V0LHk0PWZ1bmN0aW9uKFgsWil7cmV0dXJuIFguX192Ll9fYi1aLl9fdi5fX2J9LGwwLl9fcj0wLCQ0PU1hdGgucmFuZG9tKCkudG9TdHJpbmcoOCksbTA9Il9fZCIrJDQsVDA9Il9fYSIrJDQscDQ9LyhQb2ludGVyQ2FwdHVyZSkkfENhcHR1cmUkL2ksRzQ9MCx6ND1SNCghMSksVzQ9UjQoITApLGc0PTA7dmFyIEYwLHAsTzQsbDQsUzA9MCxuND1bXSxkPUIsYzQ9ZC5fX2IsaTQ9ZC5fX3IsdTQ9ZC5kaWZmZWQsbzQ9ZC5fX2MsczQ9ZC51bm1vdW50LHI0PWQuX187ZnVuY3Rpb24gbzAoWCxaKXtkLl9faCYmZC5fX2gocCxYLFMwfHxaKSxTMD0wO3ZhciBKPXAuX19IfHwocC5fX0g9e19fOltdLF9faDpbXX0pO3JldHVybiBYPj1KLl9fLmxlbmd0aCYmSi5fXy5wdXNoKHt9KSxKLl9fW1hdfWZ1bmN0aW9uIFMoWCl7cmV0dXJuIFMwPTEsQTQoWDUsWCl9ZnVuY3Rpb24gQTQoWCxaLEope3ZhciBZPW8wKEYwKyssMik7aWYoWS50PVgsIVkuX19jJiYoWS5fXz1bSj9KKFopOlg1KHZvaWQgMCxaKSxmdW5jdGlvbihXKXt2YXIgRz1ZLl9fTj9ZLl9fTlswXTpZLl9fWzBdLHo9WS50KEcsVyk7RyE9PXomJihZLl9fTj1beixZLl9fWzFdXSxZLl9fYy5zZXRTdGF0ZSh7fSkpfV0sWS5fX2M9cCwhcC5fX2YpKXt2YXIgcT1mdW5jdGlvbihXLEcseil7aWYoIVkuX19jLl9fSClyZXR1cm4hMDt2YXIgTz1ZLl9fYy5fX0guX18uZmlsdGVyKGZ1bmN0aW9uKF8pe3JldHVybiBfLl9fY30pO2lmKE8uZXZlcnkoZnVuY3Rpb24oXyl7cmV0dXJuIV8uX19OfSkpcmV0dXJuIVF8fFEuY2FsbCh0aGlzLFcsRyx6KTt2YXIgJD1ZLl9fYy5wcm9wcyE9PVc7cmV0dXJuIE8uc29tZShmdW5jdGlvbihfKXtpZihfLl9fTil7dmFyIEE9Xy5fX1swXTtfLl9fPV8uX19OLF8uX19OPXZvaWQgMCxBIT09Xy5fX1swXSYmKCQ9ITApfX0pLFEmJlEuY2FsbCh0aGlzLFcsRyx6KXx8JH07cC5fX2Y9ITA7dmFye3Nob3VsZENvbXBvbmVudFVwZGF0ZTpRLGNvbXBvbmVudFdpbGxVcGRhdGU6S309cDtwLmNvbXBvbmVudFdpbGxVcGRhdGU9ZnVuY3Rpb24oVyxHLHope2lmKHRoaXMuX19lKXt2YXIgTz1RO1E9dm9pZCAwLHEoVyxHLHopLFE9T31LJiZLLmNhbGwodGhpcyxXLEcseil9LHAuc2hvdWxkQ29tcG9uZW50VXBkYXRlPXF9cmV0dXJuIFkuX19OfHxZLl9ffWZ1bmN0aW9uIGcoWCxaKXt2YXIgSj1vMChGMCsrLDMpOyFkLl9fcyYmZTQoSi5fX0gsWikmJihKLl9fPVgsSi51PVoscC5fX0guX19oLnB1c2goSikpfWZ1bmN0aW9uIHcoWCl7cmV0dXJuIFMwPTUsczAoZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpYfX0sW10pfWZ1bmN0aW9uIHMwKFgsWil7dmFyIEo9bzAoRjArKyw3KTtyZXR1cm4gZTQoSi5fX0gsWikmJihKLl9fPVgoKSxKLl9fSD1aLEouX19oPVgpLEouX199ZnVuY3Rpb24gaihYLFope3JldHVybiBTMD04LHMwKGZ1bmN0aW9uKCl7cmV0dXJuIFh9LFopfWZ1bmN0aW9uIFIwKFgpe3ZhciBaPXAuY29udGV4dFtYLl9fY10sSj1vMChGMCsrLDkpO3JldHVybiBKLmM9WCxaPyhKLl9fPT1udWxsJiYoSi5fXz0hMCxaLnN1YihwKSksWi5wcm9wcy52YWx1ZSk6WC5fX31mdW5jdGlvbiB1NSgpe2Zvcih2YXIgWDtYPW40LnNoaWZ0KCk7KXt2YXIgWj1YLl9fSDtpZihYLl9fUCYmWil0cnl7Wi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W119Y2F0Y2goSil7Wi5fX2g9W10sZC5fX2UoSixYLl9fdil9fX1kLl9fYj1mdW5jdGlvbihYKXtwPW51bGwsYzQmJmM0KFgpfSxkLl9fPWZ1bmN0aW9uKFgsWil7WCYmWi5fX2smJlouX19rLl9fbSYmKFguX19tPVouX19rLl9fbSkscjQmJnI0KFgsWil9LGQuX19yPWZ1bmN0aW9uKFgpe2k0JiZpNChYKSxGMD0wO3ZhciBaPShwPVguX19jKS5fX0g7WiYmKE80PT09cD8oWi5fX2g9W10scC5fX2g9W10sWi5fXy5zb21lKGZ1bmN0aW9uKEope0ouX19OJiYoSi5fXz1KLl9fTiksSi51PUouX19OPXZvaWQgMH0pKTooWi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W10sRjA9MCkpLE80PXB9LGQuZGlmZmVkPWZ1bmN0aW9uKFgpe3U0JiZ1NChYKTt2YXIgWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9faC5sZW5ndGgmJihuNC5wdXNoKFopIT09MSYmbDQ9PT1kLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KChsND1kLnJlcXVlc3RBbmltYXRpb25GcmFtZSl8fG81KSh1NSkpLFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7Si51JiYoSi5fX0g9Si51KSxKLnU9dm9pZCAwfSkpLE80PXA9bnVsbH0sZC5fX2M9ZnVuY3Rpb24oWCxaKXtaLnNvbWUoZnVuY3Rpb24oSil7dHJ5e0ouX19oLnNvbWUodTApLEouX19oPUouX19oLmZpbHRlcihmdW5jdGlvbihZKXtyZXR1cm4hWS5fX3x8VTQoWSl9KX1jYXRjaChZKXtaLnNvbWUoZnVuY3Rpb24ocSl7cS5fX2gmJihxLl9faD1bXSl9KSxaPVtdLGQuX19lKFksSi5fX3YpfX0pLG80JiZvNChYLFopfSxkLnVubW91bnQ9ZnVuY3Rpb24oWCl7czQmJnM0KFgpO3ZhciBaLEo9WC5fX2M7SiYmSi5fX0gmJihKLl9fSC5fXy5zb21lKGZ1bmN0aW9uKFkpe3RyeXt1MChZKX1jYXRjaChxKXtaPXF9fSksSi5fX0g9dm9pZCAwLFomJmQuX19lKFosSi5fX3YpKX07dmFyIHQ0PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiI7ZnVuY3Rpb24gbzUoWCl7dmFyIFosSj1mdW5jdGlvbigpe2NsZWFyVGltZW91dChZKSx0NCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoWiksc2V0VGltZW91dChYKX0sWT1zZXRUaW1lb3V0KEosMzUpO3Q0JiYoWj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoSikpfWZ1bmN0aW9uIHUwKFgpe3ZhciBaPXAsSj1YLl9fYzt0eXBlb2YgSj09ImZ1bmN0aW9uIiYmKFguX19jPXZvaWQgMCxKKCkpLHA9Wn1mdW5jdGlvbiBVNChYKXt2YXIgWj1wO1guX19jPVguX18oKSxwPVp9ZnVuY3Rpb24gZTQoWCxaKXtyZXR1cm4hWHx8WC5sZW5ndGghPT1aLmxlbmd0aHx8Wi5zb21lKGZ1bmN0aW9uKEosWSl7cmV0dXJuIEohPT1YW1ldfSl9ZnVuY3Rpb24gWDUoWCxaKXtyZXR1cm4gdHlwZW9mIFo9PSJmdW5jdGlvbiI/WihYKTpafWZ1bmN0aW9uIFo2KFgsWil7Zm9yKHZhciBKIGluIFopWFtKXT1aW0pdO3JldHVybiBYfWZ1bmN0aW9uIFo1KFgsWil7Zm9yKHZhciBKIGluIFgpaWYoSiE9PSJfX3NvdXJjZSImJiEoSiBpbiBaKSlyZXR1cm4hMDtmb3IodmFyIFkgaW4gWilpZihZIT09Il9fc291cmNlIiYmWFtZXSE9PVpbWV0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gSjUoWCxaKXt0aGlzLnByb3BzPVgsdGhpcy5jb250ZXh0PVp9KEo1LnByb3RvdHlwZT1uZXcgaSkuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITAsSjUucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihYLFope3JldHVybiBaNSh0aGlzLnByb3BzLFgpfHxaNSh0aGlzLnN0YXRlLFopfTt2YXIgWTU9Qi5fX2I7Qi5fX2I9ZnVuY3Rpb24oWCl7WC50eXBlJiZYLnR5cGUuX19mJiZYLnJlZiYmKFgucHJvcHMucmVmPVgucmVmLFgucmVmPW51bGwpLFk1JiZZNShYKX07dmFyIEo2PUIuX19lO0IuX19lPWZ1bmN0aW9uKFgsWixKLFkpe2lmKFgudGhlbil7Zm9yKHZhciBxLFE9WjtRPVEuX187KWlmKChxPVEuX19jKSYmcS5fX2MpcmV0dXJuIFouX19lPT1udWxsJiYoWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2spLHEuX19jKFgsWil9SjYoWCxaLEosWSl9O3ZhciBxNT1CLnVubW91bnQ7ZnVuY3Rpb24gTDUoWCxaLEope3JldHVybiBYJiYoWC5fX2MmJlguX19jLl9fSCYmKFguX19jLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKFkpe3R5cGVvZiBZLl9fYz09ImZ1bmN0aW9uIiYmWS5fX2MoKX0pLFguX19jLl9fSD1udWxsKSwoWD1aNih7fSxYKSkuX19jIT1udWxsJiYoWC5fX2MuX19QPT09SiYmKFguX19jLl9fUD1aKSxYLl9fYy5fX2U9ITAsWC5fX2M9bnVsbCksWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihZKXtyZXR1cm4gTDUoWSxaLEopfSkpLFh9ZnVuY3Rpb24gTjUoWCxaLEope3JldHVybiBYJiZKJiYoWC5fX3Y9bnVsbCxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBONShZLFosSil9KSxYLl9fYyYmWC5fX2MuX19QPT09WiYmKFguX19lJiZKLmFwcGVuZENoaWxkKFguX19lKSxYLl9fYy5fX2U9ITAsWC5fX2MuX19QPUopKSxYfWZ1bmN0aW9uIEI0KCl7dGhpcy5fX3U9MCx0aGlzLm89bnVsbCx0aGlzLl9fYj1udWxsfWZ1bmN0aW9uIEc1KFgpe3ZhciBaPVguX18mJlguX18uX19jO3JldHVybiBaJiZaLl9fYSYmWi5fX2EoWCl9ZnVuY3Rpb24gcjAoKXt0aGlzLmk9bnVsbCx0aGlzLmw9bnVsbH1CLnVubW91bnQ9ZnVuY3Rpb24oWCl7dmFyIFo9WC5fX2M7WiYmKFouX196PSEwKSxaJiZaLl9fUiYmWi5fX1IoKSxaJiYzMiZYLl9fdSYmKFgudHlwZT1udWxsKSxxNSYmcTUoWCl9LChCNC5wcm90b3R5cGU9bmV3IGkpLl9fYz1mdW5jdGlvbihYLFope3ZhciBKPVouX19jLFk9dGhpcztZLm89PW51bGwmJihZLm89W10pLFkuby5wdXNoKEopO3ZhciBxPUc1KFkuX192KSxRPSExLEs9ZnVuY3Rpb24oKXtRfHxZLl9fenx8KFE9ITAsSi5fX1I9bnVsbCxxP3EoRyk6RygpKX07Si5fX1I9Szt2YXIgVz1KLl9fUDtKLl9fUD1udWxsO3ZhciBHPWZ1bmN0aW9uKCl7aWYoIS0tWS5fX3Upe2lmKFkuc3RhdGUuX19hKXt2YXIgej1ZLnN0YXRlLl9fYTtZLl9fdi5fX2tbMF09TjUoeix6Ll9fYy5fX1Asei5fX2MuX19PKX12YXIgTztmb3IoWS5zZXRTdGF0ZSh7X19hOlkuX19iPW51bGx9KTtPPVkuby5wb3AoKTspTy5fX1A9VyxPLmZvcmNlVXBkYXRlKCl9fTtZLl9fdSsrfHwzMiZaLl9fdXx8WS5zZXRTdGF0ZSh7X19hOlkuX19iPVkuX192Ll9fa1swXX0pLFgudGhlbihLLEspfSxCNC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLm89W119LEI0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCxaKXtpZih0aGlzLl9fYil7aWYodGhpcy5fX3YuX19rKXt2YXIgSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxZPXRoaXMuX192Ll9fa1swXS5fX2M7dGhpcy5fX3YuX19rWzBdPUw1KHRoaXMuX19iLEosWS5fX089WS5fX1ApfXRoaXMuX19iPW51bGx9dmFyIHE9Wi5fX2EmJlcwKGYsbnVsbCxYLmZhbGxiYWNrKTtyZXR1cm4gcSYmKHEuX191Jj0tMzMpLFtXMChmLG51bGwsWi5fX2E/bnVsbDpYLmNoaWxkcmVuKSxxXX07dmFyIFE1PWZ1bmN0aW9uKFgsWixKKXtpZigrK0pbMV09PT1KWzBdJiZYLmwuZGVsZXRlKFopLFgucHJvcHMucmV2ZWFsT3JkZXImJihYLnByb3BzLnJldmVhbE9yZGVyWzBdIT09InQifHwhWC5sLnNpemUpKWZvcihKPVguaTtKOyl7Zm9yKDtKLmxlbmd0aD4zOylKLnBvcCgpKCk7aWYoSlsxXTxKWzBdKWJyZWFrO1guaT1KPUpbMl19fTsocjAucHJvdG90eXBlPW5ldyBpKS5fX2E9ZnVuY3Rpb24oWCl7dmFyIFo9dGhpcyxKPUc1KFouX192KSxZPVoubC5nZXQoWCk7cmV0dXJuIFlbMF0rKyxmdW5jdGlvbihxKXt2YXIgUT1mdW5jdGlvbigpe1oucHJvcHMucmV2ZWFsT3JkZXI/KFkucHVzaChxKSxRNShaLFgsWSkpOnEoKX07Sj9KKFEpOlEoKX19LHIwLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCl7dGhpcy5pPW51bGwsdGhpcy5sPW5ldyBNYXA7dmFyIFo9TDAoWC5jaGlsZHJlbik7WC5yZXZlYWxPcmRlciYmWC5yZXZlYWxPcmRlclswXT09PSJiIiYmWi5yZXZlcnNlKCk7Zm9yKHZhciBKPVoubGVuZ3RoO0otLTspdGhpcy5sLnNldChaW0pdLHRoaXMuaT1bMSwwLHRoaXMuaV0pO3JldHVybiBYLmNoaWxkcmVufSxyMC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPXIwLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBYPXRoaXM7dGhpcy5sLmZvckVhY2goZnVuY3Rpb24oWixKKXtRNShYLEosWil9KX07dmFyIFk2PXR5cGVvZiBTeW1ib2w8InUiJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzLHE2PS9eKD86YWNjZW50fGFsaWdubWVudHxhcmFiaWN8YmFzZWxpbmV8Y2FwfGNsaXAoPyFQYXRoVSl8Y29sb3J8ZG9taW5hbnR8ZmlsbHxmbG9vZHxmb250fGdseXBoKD8hUil8aG9yaXp8aW1hZ2UoIVMpfGxldHRlcnxsaWdodGluZ3xtYXJrZXIoPyFIfFd8VSl8b3ZlcmxpbmV8cGFpbnR8cG9pbnRlcnxzaGFwZXxzdG9wfHN0cmlrZXRocm91Z2h8c3Ryb2tlfHRleHQoPyFMKXx0cmFuc2Zvcm18dW5kZXJsaW5lfHVuaWNvZGV8dW5pdHN8dnx2ZWN0b3J8dmVydHx3b3JkfHdyaXRpbmd8eCg/IUMpKVtBLVpdLyxRNj0vXm9uKEFuaXxUcmF8VG91fEJlZm9yZUlucHxDb21wbykvLEs2PS9bQS1aMC05XS9nLCQ2PXR5cGVvZiBkb2N1bWVudDwidSIsejY9ZnVuY3Rpb24oWCl7cmV0dXJuKHR5cGVvZiBTeW1ib2w8InUiJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiPy9maWx8Y2hlfHJhZC86L2ZpbHxjaGV8cmEvKS50ZXN0KFgpfTtmdW5jdGlvbiBWNShYLFosSil7cmV0dXJuIFouX19rPT1udWxsJiYoWi50ZXh0Q29udGVudD0iIiksaTAoWCxaKSx0eXBlb2YgSj09ImZ1bmN0aW9uIiYmSigpLFg/WC5fX2M6bnVsbH1pLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PSEwLFsiY29tcG9uZW50V2lsbE1vdW50IiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsImNvbXBvbmVudFdpbGxVcGRhdGUiXS5mb3JFYWNoKGZ1bmN0aW9uKFgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnByb3RvdHlwZSxYLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbIlVOU0FGRV8iK1hdfSxzZXQ6ZnVuY3Rpb24oWil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsWCx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlp9KX19KX0pO3ZhciBLNT1CLmV2ZW50O0IuZXZlbnQ9ZnVuY3Rpb24oWCl7cmV0dXJuIEs1JiYoWD1LNShYKSksWC5wZXJzaXN0PWZ1bmN0aW9uKCl7fSxYLmlzUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuY2VsQnViYmxlfSxYLmlzRGVmYXVsdFByZXZlbnRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlZmF1bHRQcmV2ZW50ZWR9LFgubmF0aXZlRXZlbnQ9WH07dmFyIEg1LFc2PXtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xhc3N9fSwkNT1CLnZub2RlO0Iudm5vZGU9ZnVuY3Rpb24oWCl7dHlwZW9mIFgudHlwZT09InN0cmluZyImJmZ1bmN0aW9uKFope3Zhcntwcm9wczpKLHR5cGU6WX09WixxPXt9LFE9WS5pbmRleE9mKCItIik9PS0xO2Zvcih2YXIgSyBpbiBKKXt2YXIgVz1KW0tdO2lmKCEoSz09PSJ2YWx1ZSImJigiZGVmYXVsdFZhbHVlImluIEopJiZXPT1udWxsfHwkNiYmSz09PSJjaGlsZHJlbiImJlk9PT0ibm9zY3JpcHQifHxLPT09ImNsYXNzInx8Sz09PSJjbGFzc05hbWUiKSl7dmFyIEc9Sy50b0xvd2VyQ2FzZSgpO0s9PT0iZGVmYXVsdFZhbHVlIiYmInZhbHVlImluIEomJkoudmFsdWU9PW51bGw/Sz0idmFsdWUiOks9PT0iZG93bmxvYWQiJiZXPT09ITA/Vz0iIjpHPT09InRyYW5zbGF0ZSImJlc9PT0ibm8iP1c9ITE6R1swXT09PSJvIiYmR1sxXT09PSJuIj9HPT09Im9uZG91YmxlY2xpY2siP0s9Im9uZGJsY2xpY2siOkchPT0ib25jaGFuZ2UifHxZIT09ImlucHV0IiYmWSE9PSJ0ZXh0YXJlYSJ8fHo2KEoudHlwZSk/Rz09PSJvbmZvY3VzIj9LPSJvbmZvY3VzaW4iOkc9PT0ib25ibHVyIj9LPSJvbmZvY3Vzb3V0IjpRNi50ZXN0KEspJiYoSz1HKTpHPUs9Im9uaW5wdXQiOlEmJnE2LnRlc3QoSyk/Sz1LLnJlcGxhY2UoSzYsIi0kJiIpLnRvTG93ZXJDYXNlKCk6Vz09PW51bGwmJihXPXZvaWQgMCksRz09PSJvbmlucHV0IiYmcVtLPUddJiYoSz0ib25pbnB1dENhcHR1cmUiKSxxW0tdPVd9fVk9PSJzZWxlY3QiJiYocS5tdWx0aXBsZSYmQXJyYXkuaXNBcnJheShxLnZhbHVlKSYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEudmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTF9KSkscS5kZWZhdWx0VmFsdWUhPW51bGwmJihxLnZhbHVlPUwwKEouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oeil7ei5wcm9wcy5zZWxlY3RlZD1xLm11bHRpcGxlP3EuZGVmYXVsdFZhbHVlLmluZGV4T2Yoei5wcm9wcy52YWx1ZSkhPS0xOnEuZGVmYXVsdFZhbHVlPT16LnByb3BzLnZhbHVlfSkpKSxKLmNsYXNzJiYhSi5jbGFzc05hbWU/KHEuY2xhc3M9Si5jbGFzcyxPYmplY3QuZGVmaW5lUHJvcGVydHkocSwiY2xhc3NOYW1lIixXNikpOkouY2xhc3NOYW1lJiYocS5jbGFzcz1xLmNsYXNzTmFtZT1KLmNsYXNzTmFtZSksWi5wcm9wcz1xfShYKSxYLiQkdHlwZW9mPVk2LCQ1JiYkNShYKX07dmFyIHo1PUIuX19yO0IuX19yPWZ1bmN0aW9uKFgpe3o1JiZ6NShYKSxINT1YLl9fY307dmFyIFc1PUIuZGlmZmVkO0IuZGlmZmVkPWZ1bmN0aW9uKFgpe1c1JiZXNShYKTt2YXJ7cHJvcHM6WixfX2U6Sn09WDtKIT1udWxsJiZYLnR5cGU9PT0idGV4dGFyZWEiJiYidmFsdWUiaW4gWiYmWi52YWx1ZSE9PUoudmFsdWUmJihKLnZhbHVlPVoudmFsdWU9PW51bGw/IiI6Wi52YWx1ZSksSDU9bnVsbH07ZnVuY3Rpb24gUDUoWCl7cmV0dXJuISFYLl9fayYmKGkwKG51bGwsWCksITApfWZ1bmN0aW9uIE81KFgpe3JldHVybntyZW5kZXI6ZnVuY3Rpb24oWil7VjUoWixYKX0sdW5tb3VudDpmdW5jdGlvbigpe1A1KFgpfX19ZnVuY3Rpb24gQzUoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVTUoWCxaKXtmb3IodmFyIEogaW4gWClpZihKIT09Il9fc291cmNlIiYmIShKIGluIFopKXJldHVybiEwO2Zvcih2YXIgWSBpbiBaKWlmKFkhPT0iX19zb3VyY2UiJiZYW1ldIT09WltZXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBBNShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn0oQTUucHJvdG90eXBlPW5ldyBpKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxBNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWil7cmV0dXJuIFU1KHRoaXMucHJvcHMsWCl8fFU1KHRoaXMuc3RhdGUsWil9O3ZhciBCNT1CLl9fYjtCLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksQjUmJkI1KFgpfTt2YXIgTDY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIil8fDM5MTE7ZnVuY3Rpb24gRDAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWT1DNSh7fSxKKTtyZXR1cm4gZGVsZXRlIFkucmVmLFgoWSxKLnJlZnx8bnVsbCl9cmV0dXJuIFouJCR0eXBlb2Y9TDYsWi5yZW5kZXI9WCxaLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PVouX19mPSEwLFouZGlzcGxheU5hbWU9IkZvcndhcmRSZWYoIisoWC5kaXNwbGF5TmFtZXx8WC5uYW1lKSsiKSIsWn12YXIgTjY9Qi5fX2U7Qi5fX2U9ZnVuY3Rpb24oWCxaLEosWSl7aWYoWC50aGVuKXtmb3IodmFyIHEsUT1aO1E9US5fXzspaWYoKHE9US5fX2MpJiZxLl9fYylyZXR1cm4gWi5fX2U9PW51bGwmJihaLl9fZT1KLl9fZSxaLl9faz1KLl9faykscS5fX2MoWCxaKX1ONihYLFosSixZKX07dmFyIF81PUIudW5tb3VudDtmdW5jdGlvbiBFNShYLFosSil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oWSl7dHlwZW9mIFkuX19jPT0iZnVuY3Rpb24iJiZZLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPUM1KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1KJiYoWC5fX2MuX19QPVopLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBFNShZLFosSil9KSksWH1mdW5jdGlvbiB3NShYLFosSil7cmV0dXJuIFgmJkomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oWSl7cmV0dXJuIHc1KFksWixKKX0pLFguX19jJiZYLl9fYy5fX1A9PT1aJiYoWC5fX2UmJkouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9SikpLFh9ZnVuY3Rpb24gRjQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gVDUoWCl7dmFyIFo9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFomJlouX19hJiZaLl9fYShYKX1mdW5jdGlvbiB0MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfUIudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWj1YLl9fYztaJiYoWi5fX3o9ITApLFomJlouX19SJiZaLl9fUigpLFomJjMyJlguX191JiYoWC50eXBlPW51bGwpLF81JiZfNShYKX0sKEY0LnByb3RvdHlwZT1uZXcgaSkuX19jPWZ1bmN0aW9uKFgsWil7dmFyIEo9Wi5fX2MsWT10aGlzO1kubz09bnVsbCYmKFkubz1bXSksWS5vLnB1c2goSik7dmFyIHE9VDUoWS5fX3YpLFE9ITEsSz1mdW5jdGlvbigpe1F8fFkuX196fHwoUT0hMCxKLl9fUj1udWxsLHE/cShHKTpHKCkpfTtKLl9fUj1LO3ZhciBXPUouX19QO0ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1ZLl9fdSl7aWYoWS5zdGF0ZS5fX2Epe3ZhciB6PVkuc3RhdGUuX19hO1kuX192Ll9fa1swXT13NSh6LHouX19jLl9fUCx6Ll9fYy5fX08pfXZhciBPO2ZvcihZLnNldFN0YXRlKHtfX2E6WS5fX2I9bnVsbH0pO089WS5vLnBvcCgpOylPLl9fUD1XLE8uZm9yY2VVcGRhdGUoKX19O1kuX191Kyt8fDMyJlouX191fHxZLnNldFN0YXRlKHtfX2E6WS5fX2I9WS5fX3YuX19rWzBdfSksWC50aGVuKEssSyl9LEY0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sRjQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFope2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBKPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFk9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09RTUodGhpcy5fX2IsSixZLl9fTz1ZLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1aLl9fYSYmVzAoZixudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1cwKGYsbnVsbCxaLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgRjU9ZnVuY3Rpb24oWCxaLEope2lmKCsrSlsxXT09PUpbMF0mJlgubC5kZWxldGUoWiksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKEo9WC5pO0o7KXtmb3IoO0oubGVuZ3RoPjM7KUoucG9wKCkoKTtpZihKWzFdPEpbMF0pYnJlYWs7WC5pPUo9SlsyXX19Oyh0MC5wcm90b3R5cGU9bmV3IGkpLl9fYT1mdW5jdGlvbihYKXt2YXIgWj10aGlzLEo9VDUoWi5fX3YpLFk9Wi5sLmdldChYKTtyZXR1cm4gWVswXSsrLGZ1bmN0aW9uKHEpe3ZhciBRPWZ1bmN0aW9uKCl7Wi5wcm9wcy5yZXZlYWxPcmRlcj8oWS5wdXNoKHEpLEY1KFosWCxZKSk6cSgpfTtKP0ooUSk6USgpfX0sdDAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWj1MMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZaLnJldmVyc2UoKTtmb3IodmFyIEo9Wi5sZW5ndGg7Si0tOyl0aGlzLmwuc2V0KFpbSl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHQwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9dDAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihaLEope0Y1KFgsSixaKX0pfTt2YXIgRzY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsVjY9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLEg2PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sUDY9L1tBLVowLTldL2csTzY9dHlwZW9mIGRvY3VtZW50PCJ1IixVNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2kucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihaKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Wn0pfX0pfSk7dmFyIEQ1PUIuZXZlbnQ7Qi5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gRDUmJihYPUQ1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgYjUsQTY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LGs1PUIudm5vZGU7Qi52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWil7dmFye3Byb3BzOkosdHlwZTpZfT1aLHE9e30sUT1ZLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBLIGluIEope3ZhciBXPUpbS107aWYoIShLPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSikmJlc9PW51bGx8fE82JiZLPT09ImNoaWxkcmVuIiYmWT09PSJub3NjcmlwdCJ8fEs9PT0iY2xhc3MifHxLPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1LLnRvTG93ZXJDYXNlKCk7Sz09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gSiYmSi52YWx1ZT09bnVsbD9LPSJ2YWx1ZSI6Sz09PSJkb3dubG9hZCImJlc9PT0hMD9XPSIiOkc9PT0idHJhbnNsYXRlIiYmVz09PSJubyI/Vz0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/Sz0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fFkhPT0iaW5wdXQiJiZZIT09InRleHRhcmVhInx8VTYoSi50eXBlKT9HPT09Im9uZm9jdXMiP0s9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP0s9Im9uZm9jdXNvdXQiOkg2LnRlc3QoSykmJihLPUcpOkc9Sz0ib25pbnB1dCI6USYmVjYudGVzdChLKT9LPUsucmVwbGFjZShQNiwiLSQmIikudG9Mb3dlckNhc2UoKTpXPT09bnVsbCYmKFc9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW0s9R10mJihLPSJvbmlucHV0Q2FwdHVyZSIpLHFbS109V319WT09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1MMChKLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKHope3oucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKHoucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PXoucHJvcHMudmFsdWV9KSkpLEouY2xhc3MmJiFKLmNsYXNzTmFtZT8ocS5jbGFzcz1KLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEE2KSk6Si5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPUouY2xhc3NOYW1lKSxaLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9RzYsazUmJms1KFgpfTt2YXIgSTU9Qi5fX3I7Qi5fX3I9ZnVuY3Rpb24oWCl7STUmJkk1KFgpLGI1PVguX19jfTt2YXIgTTU9Qi5kaWZmZWQ7Qi5kaWZmZWQ9ZnVuY3Rpb24oWCl7TTUmJk01KFgpO3Zhcntwcm9wczpaLF9fZTpKfT1YO0ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlIT09Si52YWx1ZSYmKEoudmFsdWU9Wi52YWx1ZT09bnVsbD8iIjpaLnZhbHVlKSxiNT1udWxsfTt2YXIgQjY9MDtmdW5jdGlvbiBOKFgsWixKLFkscSxRKXtafHwoWj17fSk7dmFyIEssVyxHPVo7aWYoInJlZiJpbiBHKWZvcihXIGluIEc9e30sWilXPT0icmVmIj9LPVpbV106R1tXXT1aW1ddO3ZhciB6PXt0eXBlOlgscHJvcHM6RyxrZXk6SixyZWY6SyxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6LS1CNixfX2k6LTEsX191OjAsX19zb3VyY2U6cSxfX3NlbGY6UX07aWYodHlwZW9mIFg9PSJmdW5jdGlvbiImJihLPVguZGVmYXVsdFByb3BzKSlmb3IoVyBpbiBLKUdbV109PT12b2lkIDAmJihHW1ddPUtbV10pO3JldHVybiBCLnZub2RlJiZCLnZub2RlKHopLHp9dmFyIEQ0PWB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjAnIGhlaWdodD0nMjAnJTNFJTNDY2lyY2xlIGN4PScxMCcgY3k9JzEwJyByPSc5JyBmaWxsPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNCknIHN0cm9rZT0ncmdiYSgyNTUsMjU1LDI1NSwwLjcpJyBzdHJva2Utd2lkdGg9JzEnLyUzRSUzQy9zdmclM0UiKSAxMCAxMCwgcG9pbnRlcmAsXzY9MyxGNj00LEQ2PTU7ZnVuY3Rpb24gbjAoe3VybDpYLHdzVXJsOlosc3R5bGU6SixpbWFnZVN0eWxlOlksY2xhc3NOYW1lOnEsb25Ib21lUHJlc3M6USxvblN0cmVhbVRvdWNoOkssb25TdHJlYW1NdWx0aVRvdWNoOlcsb25TdHJlYW1CdXR0b246RyxzdWJzY3JpYmVGcmFtZTp6LHN0cmVhbUZyYW1lOk8sc3RyZWFtQ29uZmlnOiQsaGlkZUNvbnRyb2xzOl8sb25TdHJlYW1pbmdDaGFuZ2U6QSxjb25uZWN0aW9uUXVhbGl0eTpNfSl7bGV0IFU9ISFLLGs9dyhudWxsKSxJPXcobnVsbCksQz13KG51bGwpLFtoLEVdPVMoITEpLFtlLFowXT1TKG51bGwpLFt4LEswXT1TKG51bGwpLHM9dyhudWxsKSxbcixVMF09UyhudWxsKTtnKCgpPT57bGV0IFY9cy5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKEwpPT57bGV0IFA9TFswXT8uY29udGVudFJlY3Q7aWYoUClVMCh7d2lkdGg6UC53aWR0aCxoZWlnaHQ6UC5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W2owLHYwXT1TKDApLEcwPXcoMCksW0o0LEkwXT1TKCExKSxGPXcobnVsbCk7ZygoKT0+e2lmKE09PT0icG9vciIpe2lmKEkwKCEwKSxGLmN1cnJlbnQpY2xlYXJUaW1lb3V0KEYuY3VycmVudCk7Ri5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntJMCghMSksRi5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYoSTAoITEpLEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KSxGLmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KX19LFtNXSk7bGV0IFI9YCR7WH0vc3RyZWFtLm1qcGVnYCx2PXcoQSk7di5jdXJyZW50PUEsZygoKT0+e3YuY3VycmVudD8uKGgpfSxbaF0pLGcoKCk9PntpZihVJiYkKUswKCQpfSxbVSwkXSk7bGV0IFQ9dyghMSk7VC5jdXJyZW50PWg7bGV0IHU9dyhudWxsKTtnKCgpPT57aWYoIVV8fCF6KXJldHVybjtsZXQgSD1zZXRUaW1lb3V0KCgpPT57aWYoIVQuY3VycmVudClaMCgiU3RyZWFtIGlzIG5vdCBwcm9kdWNpbmcgZnJhbWVzLiBUaGUgc2ltdWxhdG9yIG1heSBoYXZlIHN0b3BwZWQg4oCUIHRyeSByZWNvbm5lY3RpbmcuIil9LDYwMDApLEw9eigoUCk9PntHMC5jdXJyZW50KyssWDAuY3VycmVudD1EYXRlLm5vdygpO2xldCBEPUkuY3VycmVudDtpZihEKXtpZih1LmN1cnJlbnQpVVJMLnJldm9rZU9iamVjdFVSTCh1LmN1cnJlbnQpO3UuY3VycmVudD1QLEQuc3JjPVB9aWYoIVQuY3VycmVudCljbGVhclRpbWVvdXQoSCksRSghMCksWjAobnVsbCl9KTtyZXR1cm4oKT0+e2NsZWFyVGltZW91dChIKSxMPy4oKX19LFtVLHpdKTtsZXQgbT1qKChWKT0+e2lmKFUpe0s/LihWKTtyZXR1cm59bGV0IEg9Qy5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KFYpKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09XzYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEtdKSxKMD1qKChWKT0+e2lmKFUpe0c/LihWKTtyZXR1cm59bGV0IEg9Qy5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHtidXR0b246Vn0pKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09RjYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEddKSx5PWooKFYpPT57aWYoVSl7Vz8uKFYpO3JldHVybn1sZXQgSD1DLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLFA9bmV3IFVpbnQ4QXJyYXkoMStMLmxlbmd0aCk7UFswXT1ENixQLnNldChMLDEpLEguc2VuZChQKX0sW1UsV10pO2coKCk9PntpZihVKXJldHVybjtmZXRjaChgJHtYfS9jb25maWdgKS50aGVuKChsKT0+bC5qc29uKCkpLnRoZW4oKGwpPT57aWYobC53aWR0aD4wJiZsLmhlaWdodD4wKUswKGwpfSkuY2F0Y2goKCk9Pnt9KTtsZXQgVj1aPz9YLnJlcGxhY2UoL15odHRwLywid3MiKSsiL3dzIixIPW5ldyBXZWJTb2NrZXQoVik7SC5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsQy5jdXJyZW50PUgsSC5vbm9wZW49KCk9PntFKCEwKSxaMChudWxsKX0sSC5vbmNsb3NlPSgpPT57RSghMSl9LEgub25lcnJvcj0oKT0+e1owKCJXZWJTb2NrZXQgY29ubmVjdGlvbiBmYWlsZWQiKSxFKCExKX07bGV0IEw9bmV3IEFib3J0Q29udHJvbGxlcixQPXNldEludGVydmFsKCgpPT57djAoRzAuY3VycmVudCksRzAuY3VycmVudD0wfSwxMDAwKSxEPSExLGI9c2V0VGltZW91dCgoKT0+e2lmKCFEKVowKCJTdHJlYW0gaXMgbm90IHByb2R1Y2luZyBmcmFtZXMuIFRoZSBzaW11bGF0b3IgbWF5IGhhdmUgc3RvcHBlZCDigJQgdHJ5IHJlY29ubmVjdGluZy4iKX0sNjAwMCk7cmV0dXJuKGFzeW5jKCk9Pnt0cnl7bGV0IG49KGF3YWl0IGZldGNoKFIse3NpZ25hbDpMLnNpZ25hbH0pKS5ib2R5Py5nZXRSZWFkZXIoKTtpZighbilyZXR1cm47bGV0IFEwPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiLS1mcmFtZSIpO3doaWxlKCEwKXtsZXR7ZG9uZTpoNSx2YWx1ZTpRNH09YXdhaXQgbi5yZWFkKCk7aWYoaDUpYnJlYWs7aWYoUTQpZm9yKGxldCBLND0wO0s0PD1RNC5sZW5ndGgtUTAubGVuZ3RoO0s0Kyspe2xldCBUND0hMDtmb3IobGV0IHgwPTA7eDA8UTAubGVuZ3RoO3gwKyspaWYoUTRbSzQreDBdIT09UTBbeDBdKXtUND0hMTticmVha31pZihUNCl7aWYoRzAuY3VycmVudCsrLCFEKUQ9ITAsY2xlYXJUaW1lb3V0KGIpfX19fWNhdGNoe319KSgpLCgpPT57TC5hYm9ydCgpLGNsZWFySW50ZXJ2YWwoUCksY2xlYXJUaW1lb3V0KGIpLEguY2xvc2UoKSxDLmN1cnJlbnQ9bnVsbH19LFtYLFIsVV0pO2xldCBYMD13KDApO2coKCk9PntpZighVSlyZXR1cm47bGV0IFY9MjAwMCxIPSgpPT57bGV0IEQ9WDAuY3VycmVudDtpZighRHx8IVQuY3VycmVudClyZXR1cm47aWYoRGF0ZS5ub3coKS1EPlYpRSghMSl9LEw9c2V0SW50ZXJ2YWwoKCk9Pnt2MChHMC5jdXJyZW50KSxHMC5jdXJyZW50PTAsSCgpfSwxMDAwKSxQPSgpPT57aWYoIWRvY3VtZW50LmhpZGRlbilIKCl9O3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixQKSwoKT0+e2NsZWFySW50ZXJ2YWwoTCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsUCl9fSxbVV0pO2xldCBhPWooKCk9PntyZXR1cm4gVT9JLmN1cnJlbnQ6ay5jdXJyZW50fSxbVV0pLFYwPWooKFYsSCk9PntsZXQgTD1hKCk7aWYoIUwpcmV0dXJuO2xldCBQPUwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksRD0oSC5jbGllbnRYLVAubGVmdCkvUC53aWR0aCxiPShILmNsaWVudFktUC50b3ApL1AuaGVpZ2h0O20oe3R5cGU6Vix4OkQseTpifSl9LFttXSksWTA9MyxjPXcoITEpLG89dyghMSksQTA9dyghMSksTTA9dyh7ZHg6MCxkeTowfSksQzA9dyghMSksW1k0LEk0XT1TKCExKSxNND13KHt4OjAuNSx5OjAuNX0pLFtIMCxxMF09UyhudWxsKTtnKCgpPT57bGV0IFY9KEwpPT57aWYoTC5rZXk9PT0iQWx0IilJNCghMCl9LEg9KEwpPT57aWYoTC5rZXk9PT0iQWx0Iil7aWYoSTQoITEpLCFvLmN1cnJlbnQpcTAobnVsbCl9fTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLFYpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsSCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixIKX19LFtdKSxnKCgpPT57aWYoWTQmJiFvLmN1cnJlbnQpe2xldCBWPU00LmN1cnJlbnQ7cTAoe3gxOlYueCx5MTpWLnkseDI6MS1WLngseTI6MS1WLnl9KX1lbHNlIGlmKCFZNCYmIW8uY3VycmVudClxMChudWxsKX0sW1k0XSk7bGV0IHkwPXcobnVsbCkscTQ9dyghMSksRTA9dygwKSxDND1qKChWLEgpPT57cTQuY3VycmVudD0hMDtsZXQgTD15MC5jdXJyZW50O2lmKEwpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksRTAuY3VycmVudD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntMLnN0eWxlLmxlZnQ9YCR7VioxMDB9JWAsTC5zdHlsZS50b3A9YCR7SCoxMDB9JWAsTC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KX0sW10pLEU0PWooKFYsSCk9PntpZighcTQuY3VycmVudClyZXR1cm47bGV0IEw9eTAuY3VycmVudDtpZihMKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEUwLmN1cnJlbnQpLEUwLmN1cnJlbnQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57TC5zdHlsZS5sZWZ0PWAke1YqMTAwfSVgLEwuc3R5bGUudG9wPWAke0gqMTAwfSVgfSl9LFtdKSxwMD1qKCgpPT57cTQuY3VycmVudD0hMTtsZXQgVj15MC5jdXJyZW50O2lmKFYpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksVi5zdHlsZS5kaXNwbGF5PSJub25lIn0sW10pLHc0PXcoMCksdzA9dyhudWxsKSx4NT1qKCgpPT57bGV0IFY9RGF0ZS5ub3coKSxIPVYtdzQuY3VycmVudDtpZih3NC5jdXJyZW50PVYsSDwzMDApe2lmKHcwLmN1cnJlbnQpY2xlYXJUaW1lb3V0KHcwLmN1cnJlbnQpLHcwLmN1cnJlbnQ9bnVsbDtpZihRKVEoKTtlbHNlIEowKCJhcHBfc3dpdGNoZXIiKX1lbHNlIHcwLmN1cnJlbnQ9c2V0VGltZW91dCgoKT0+e2lmKFEpUSgpO2Vsc2UgSjAoImhvbWUiKTt3MC5jdXJyZW50PW51bGx9LDMwMCl9LFtKMCxRXSksZzA9KCgpPT57aWYoIXh8fCFyKXJldHVybiBudWxsO2lmKHIud2lkdGg9PT0wfHxyLmhlaWdodD09PTApcmV0dXJuIG51bGw7bGV0IFY9TWF0aC5taW4oci53aWR0aC94LndpZHRoLHIuaGVpZ2h0L3guaGVpZ2h0KTtyZXR1cm57d2lkdGg6eC53aWR0aCpWLGhlaWdodDp4LmhlaWdodCpWfX0pKCk7cmV0dXJuIE4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGZsZXg6MSwuLi5fP3t9Ontib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sb3ZlcmZsb3c6ImhpZGRlbiIsbWluV2lkdGg6MCxtaW5IZWlnaHQ6MCwuLi5KfSxjbGFzc05hbWU6cSxjaGlsZHJlbjpbTigiZGl2Iix7cmVmOnMsc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsZmxleDoxLG1pbkhlaWdodDowLG1pbldpZHRoOjAsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIn0sY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsd2lkdGg6ZzA/YCR7ZzAud2lkdGh9cHhgOiIxMDAlIixoZWlnaHQ6ZzA/YCR7ZzAuaGVpZ2h0fXB4YDoiMTAwJSJ9LGNoaWxkcmVuOltOKCJpbWciLHtyZWY6ayxzcmM6VT92b2lkIDA6UixkcmFnZ2FibGU6ITEsb25Mb2FkOihWKT0+e2xldCBIPVYuY3VycmVudFRhcmdldDtpZihILm5hdHVyYWxXaWR0aD4wJiZILm5hdHVyYWxIZWlnaHQ+MClLMCgoTCk9PkwmJkwud2lkdGg9PT1ILm5hdHVyYWxXaWR0aCYmTC5oZWlnaHQ9PT1ILm5hdHVyYWxIZWlnaHQ/TDp7d2lkdGg6SC5uYXR1cmFsV2lkdGgsaGVpZ2h0OkgubmF0dXJhbEhlaWdodH0pfSxzdHlsZTpVP3tkaXNwbGF5OiJub25lIn06e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCx3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixjdXJzb3I6RDQsZGlzcGxheToiYmxvY2siLHVzZXJTZWxlY3Q6Im5vbmUiLFdlYmtpdFVzZXJTZWxlY3Q6Im5vbmUiLHRvdWNoQWN0aW9uOiJub25lIiwuLi5ZfX0pLFUmJk4oImltZyIse3JlZjpJLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKUswKChMKT0+TCYmTC53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZMLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9MOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOkQ0LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uWX19KSxOKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGN1cnNvcjpENCx0b3VjaEFjdGlvbjoibm9uZSJ9LG9uTW91c2VEb3duOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksUD0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKFYuYWx0S2V5KXtvLmN1cnJlbnQ9ITAsQTAuY3VycmVudD1WLnNoaWZ0S2V5O2xldCBiPXt4MTpQLHkxOkQseDI6MS1QLHkyOjEtRH07TTAuY3VycmVudD17ZHg6MS1QLVAsZHk6MS1ELUR9LHEwKGIpLHkoe3R5cGU6ImJlZ2luIiwuLi5ifSk7cmV0dXJufWlmKEM0KFAsRCksRD4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpQLHk6RCxlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsVjAoImJlZ2luIixWKX0sb25Nb3VzZU1vdmU6KFYpPT57bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihNNC5jdXJyZW50PXt4OlAseTpEfSxWLmJ1dHRvbnM9PT0wKXtpZihWLmFsdEtleSlxMCh7eDE6UCx5MTpELHgyOjEtUCx5MjoxLUR9KTtyZXR1cm59aWYoby5jdXJyZW50KXtsZXQgYjtpZihBMC5jdXJyZW50KXtsZXQgbD1NMC5jdXJyZW50O2I9e3gxOlAseTE6RCx4MjpQK2wuZHgseTI6RCtsLmR5fX1lbHNlIGI9e3gxOlAseTE6RCx4MjoxLVAseTI6MS1EfTtxMChiKSx5KHt0eXBlOiJtb3ZlIiwuLi5ifSk7cmV0dXJufWlmKEU0KFAsRCksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6UCx5OkQsZWRnZTpZMH0pO2Vsc2UgVjAoIm1vdmUiLFYpfSxvbk1vdXNlVXA6KFYpPT57aWYoby5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoQTAuY3VycmVudCl7bGV0IGI9TTAuY3VycmVudDt5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjpQK2IuZHgseTI6RCtiLmR5fSl9ZWxzZSB5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjoxLVAseTI6MS1EfSl9aWYoby5jdXJyZW50PSExLCFWLmFsdEtleSlxMChudWxsKTtyZXR1cm59aWYocDAoKSxjLmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDttKHt0eXBlOiJlbmQiLHg6UCx5OkQsZWRnZTpZMH0pfWMuY3VycmVudD0hMTtyZXR1cm59VjAoImVuZCIsVil9LG9uTW91c2VMZWF2ZTooVik9PntpZihvLmN1cnJlbnQpe2lmKEgwKXkoe3R5cGU6ImVuZCIsLi4uSDB9KTtvLmN1cnJlbnQ9ITEscTAobnVsbCk7cmV0dXJufWlmKHAwKCksYy5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7bSh7dHlwZToiZW5kIix4OlAseTpELGVkZ2U6WTB9KX1jLmN1cnJlbnQ9ITE7cmV0dXJufWlmKFYuYnV0dG9ucz4wKVYwKCJlbmQiLFYpO3EwKG51bGwpfSxvblRvdWNoU3RhcnQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWLnRvdWNoZXMubGVuZ3RoPj0yKXtwMCgpO2xldCBsPVYudG91Y2hlc1swXSxuPVYudG91Y2hlc1sxXSxRMD17eDE6KGwuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTE6KGwuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQseDI6KG4uY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTI6KG4uY2xpZW50WS1MLnRvcCkvTC5oZWlnaHR9O2lmKCFDMC5jdXJyZW50JiYhYy5jdXJyZW50KW0oe3R5cGU6ImVuZCIseDpRMC54MSx5OlEwLnkxfSk7QzAuY3VycmVudD0hMCxvLmN1cnJlbnQ9ITAsYy5jdXJyZW50PSExLHEwKFEwKSx5KHt0eXBlOiJiZWdpbiIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEM0KEQsYiksYj4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpELHk6YixlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsbSh7dHlwZToiYmVnaW4iLHg6RCx5OmJ9KX0sb25Ub3VjaE1vdmU6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihDMC5jdXJyZW50JiZWLnRvdWNoZXMubGVuZ3RoPj0yKXtsZXQgbD1WLnRvdWNoZXNbMF0sbj1WLnRvdWNoZXNbMV0sUTA9e3gxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOihuLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkyOihuLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0fTtxMChRMCkseSh7dHlwZToibW92ZSIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEU0KEQsYiksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6RCx5OmIsZWRnZTpZMH0pO2Vsc2UgbSh7dHlwZToibW92ZSIseDpELHk6Yn0pfSxvblRvdWNoRW5kOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoQzAuY3VycmVudCl7aWYoVi50b3VjaGVzLmxlbmd0aDwyKXtsZXQgbD1WLmNoYW5nZWRUb3VjaGVzWzBdLG49SDA7aWYobCYmbil5KHt0eXBlOiJlbmQiLHgxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOm4ueDIseTI6bi55Mn0pO2Vsc2UgaWYobil5KHt0eXBlOiJlbmQiLC4uLm59KTtDMC5jdXJyZW50PSExLG8uY3VycmVudD0hMSxxMChudWxsKX1yZXR1cm59bGV0IFA9Vi5jaGFuZ2VkVG91Y2hlc1swXTtpZighUClyZXR1cm47bGV0IEQ9KFAuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsYj0oUC5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihwMCgpLGMuY3VycmVudCltKHt0eXBlOiJlbmQiLHg6RCx5OmIsZWRnZTpZMH0pLGMuY3VycmVudD0hMTtlbHNlIG0oe3R5cGU6ImVuZCIseDpELHk6Yn0pfX0pLE4oImRpdiIse3JlZjp5MCwiZGF0YS10ZXN0aWQiOiJ0b3VjaC1pbmRpY2F0b3IiLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUiLHdpZHRoOjI0LGhlaWdodDoyNCxib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDoicmdiYSg1OSwxMzAsMjQ2LDAuNSkiLGJveFNoYWRvdzoiMCAwIDhweCByZ2JhKDU5LDEzMCwyNDYsMC4zKSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoLTUwJSwgLTUwJSkiLHBvaW50ZXJFdmVudHM6Im5vbmUifX0pLEgwJiZOKGYse2NoaWxkcmVuOltOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MSxIMC55MSl9KSxOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MixIMC55Mil9KV19KSwhaCYmIWUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiM4ODgiLGZvbnRTaXplOjE0fSxjaGlsZHJlbjoiQ29ubmVjdGluZy4uLiJ9KX0pLGUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiNmNDQiLGZvbnRTaXplOjE0LHBhZGRpbmc6MjAsdGV4dEFsaWduOiJjZW50ZXIifSxjaGlsZHJlbjplfSl9KSxKNCYmTigiZGl2Iix7c3R5bGU6azYsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiI2ZiYmYyNCIsZm9udFNpemU6MTMsZm9udEZhbWlseToibW9ub3NwYWNlIn0sY2hpbGRyZW46IlNsb3cgY29ubmVjdGlvbiJ9KX0pXX0pfSksIV8mJk4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixwYWRkaW5nOiI0cHggOHB4Iixib3JkZXJUb3A6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sY2hpbGRyZW46W04oImJ1dHRvbiIse29uQ2xpY2s6eDUsc3R5bGU6e2JhY2tncm91bmQ6Im5vbmUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4yKSIsY29sb3I6IiNhYWEiLGZvbnRTaXplOjExLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIscGFkZGluZzoiMnB4IDEwcHgiLGN1cnNvcjoicG9pbnRlciIsYm9yZGVyUmFkaXVzOjR9LGNoaWxkcmVuOiJIb21lIn0pLE4oInNwYW4iLHtzdHlsZTp7Y29sb3I6ajA+MD8iIzRmNCI6IiM4ODgiLGZvbnRTaXplOjEyLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixnYXA6Nn0sY2hpbGRyZW46W00mJk4oInNwYW4iLHsiZGF0YS10ZXN0aWQiOiJxdWFsaXR5LWRvdCIsc3R5bGU6e3dpZHRoOjgsaGVpZ2h0OjgsYm9yZGVyUmFkaXVzOiI1MCUiLGRpc3BsYXk6ImlubGluZS1ibG9jayIsYmFja2dyb3VuZDpNPT09Imdvb2QiPyIjNGFkZTgwIjpNPT09ImRlZ3JhZGVkIj8iI2ZhY2MxNSI6IiNlZjQ0NDQifX0pLGowLCIgZnBzIl19KV19KV19KX12YXIgazY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjgsbGVmdDoiNTAlIix0cmFuc2Zvcm06InRyYW5zbGF0ZVgoLTUwJSkiLGJhY2tncm91bmQ6InJnYmEoMCwwLDAsMC43KSIsYm9yZGVyUmFkaXVzOjYscGFkZGluZzoiNHB4IDEycHgiLHBvaW50ZXJFdmVudHM6Im5vbmUifSxTNT17cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYmFja2dyb3VuZDoicmdiYSgwLDAsMCwwLjgpIn0sUjU9MjA7ZnVuY3Rpb24gajUoWCxaKXtyZXR1cm57cG9zaXRpb246ImFic29sdXRlIixsZWZ0OmAke1gqMTAwfSVgLHRvcDpgJHtaKjEwMH0lYCx3aWR0aDpSNSxoZWlnaHQ6UjUsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjcpIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgtNTAlLCAtNTAlKSIscG9pbnRlckV2ZW50czoibm9uZSJ9fWZ1bmN0aW9uIGswKFgpe2lmKCFYKXJldHVybiJpcGhvbmUiO2xldCBaPVgudG9Mb3dlckNhc2UoKTtpZihaLmluY2x1ZGVzKCJpcGFkIikpcmV0dXJuImlwYWQiO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIndhdGNoIjtpZihaLmluY2x1ZGVzKCJ2aXNpb24iKSlyZXR1cm4idmlzaW9uIjtyZXR1cm4iaXBob25lIn12YXIgJDA9e2lwaG9uZTp7d2lkdGg6NDI3LGhlaWdodDo4ODEsYmV6ZWxYOjE4LGJlemVsWToxOCxpbm5lclJhZGl1czo1NX0saXBhZDp7d2lkdGg6NDMwLGhlaWdodDo2MDUsYmV6ZWxYOjE2LGJlemVsWToxNixpbm5lclJhZGl1czoxMn0sd2F0Y2g6e3dpZHRoOjI3NCxoZWlnaHQ6MzIyLGJlemVsWDoxMixiZXplbFk6MTIsaW5uZXJSYWRpdXM6Nzl9LHZpc2lvbjp7d2lkdGg6NjQwLGhlaWdodDo0MDAsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czozMn19LGI3PSQwLmlwaG9uZS53aWR0aCxTNz0kMC5pcGhvbmUuaGVpZ2h0LFI3PSQwLmlwaG9uZS5iZXplbFgsajc9JDAuaXBob25lLmJlemVsWSx2Nz0kMC5pcGhvbmUuaW5uZXJSYWRpdXM7ZnVuY3Rpb24gZTAoWD0iaXBob25lIil7bGV0IFo9JDBbWF0sSj1aLndpZHRoLTIqWi5iZXplbFgsWT1aLmhlaWdodC0yKlouYmV6ZWxZO3JldHVybmAke1ouaW5uZXJSYWRpdXMvSioxMDB9JSAvICR7Wi5pbm5lclJhZGl1cy9ZKjEwMH0lYH12YXIgazQ9XzAobnVsbCk7ZnVuY3Rpb24gWDQoWCl7bGV0IFo9UjAoazQpO2lmKCFaKXRocm93IEVycm9yKGA8U2ltdWxhdG9yVG9vbGJhci4ke1h9PiBtdXN0IGJlIHJlbmRlcmVkIGluc2lkZSA8U2ltdWxhdG9yVG9vbGJhcj5gKTtyZXR1cm4gWn12YXIgdzY9e2Rpc3BsYXk6ImZsZXgiLGZsZXhXcmFwOiJ3cmFwIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixnYXA6IjRweCAxMnB4IixwYWRkaW5nOiI4cHggMTJweCIsYm9yZGVyUmFkaXVzOjI0LGJhY2tncm91bmQ6IiMxYzFjMWUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSIsYm94U2hhZG93OiIwIDFweCAycHggcmdiYSgwLDAsMCwwLjIpIixtaW5XaWR0aDoyNDAsd2lkdGg6IjEwMCUifTtmdW5jdGlvbiBUNih7ZXhlYzpYLGRldmljZVVkaWQ6WixkZXZpY2VOYW1lOkosZGV2aWNlUnVudGltZTpZLHN0cmVhbWluZzpxPSExLGRpc2FibGVkOlE9ITEsY2hpbGRyZW46SyxzdHlsZTpXLC4uLkd9KXtsZXQgej1rMChKKSwkPXtleGVjOlgsZGV2aWNlVWRpZDpaLGRldmljZU5hbWU6SixkZXZpY2VSdW50aW1lOlksZGV2aWNlVHlwZTp6LHN0cmVhbWluZzpxLGRpc2FibGVkOlF8fCFafHwhcX07cmV0dXJuIE4oazQuUHJvdmlkZXIse3ZhbHVlOiQsY2hpbGRyZW46TigiZGl2Iix7ImRhdGEtc2ltdWxhdG9yLXRvb2xiYXIiOiEwLHN0eWxlOnsuLi53NiwuLi5XfSwuLi5HLGNoaWxkcmVuOkt9KX0pfXZhciBiNj17ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixhbGlnbkl0ZW1zOiJmbGV4LXN0YXJ0Iix0ZXh0QWxpZ246ImxlZnQiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjZmZmIixwYWRkaW5nOiIycHggNHB4IixtYXJnaW46Ii0ycHggLTRweCIsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixtaW5XaWR0aDowLG1heFdpZHRoOiIxMDAlIixsaW5lSGVpZ2h0OjEuMixmb250RmFtaWx5OiJpbmhlcml0In0sUzY9RDAoZnVuY3Rpb24oe25hbWU6WixzdWJ0aXRsZTpKLGhpZGVDaGV2cm9uOlksc3R5bGU6cSxvbk1vdXNlRW50ZXI6USxvbk1vdXNlTGVhdmU6SywuLi5XfSxHKXtsZXQgej1YNCgiVGl0bGUiKSxbTywkXT1TKCExKSxfPVo/P3ouZGV2aWNlTmFtZT8/Ik5vIHNpbXVsYXRvciIsQT1KPz8oei5kZXZpY2VSdW50aW1lP3ouZGV2aWNlUnVudGltZS5yZXBsYWNlKC9cLi8sIiAiKToi4oCUIik7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsImRhdGEtc2ltdWxhdG9yLXRvb2xiYXItdGl0bGUiOiEwLG9uTW91c2VFbnRlcjooTSk9PnskKCEwKSxRPy4oTSl9LG9uTW91c2VMZWF2ZTooTSk9PnskKCExKSxLPy4oTSl9LHN0eWxlOnsuLi5iNixiYWNrZ3JvdW5kOk8/InJnYmEoMjU1LDI1NSwyNTUsMC4xKSI6InRyYW5zcGFyZW50IiwuLi5xfSwuLi5XLGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2Rpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo0LGZvbnRTaXplOjEyLGZvbnRXZWlnaHQ6NjAwLGNvbG9yOiIjZmZmIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46W18sIVkmJk4oInN2ZyIse3dpZHRoOiIxMCIsaGVpZ2h0OiIxMCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIuNSIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsc3R5bGU6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGZsZXhTaHJpbms6MH0sY2hpbGRyZW46TigicG9seWxpbmUiLHtwb2ludHM6IjYgOSAxMiAxNSAxOCA5In0pfSldfSksTigic3BhbiIse3N0eWxlOntmb250U2l6ZToxMCxjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjUpIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46QX0pXX0pfSksUjY9e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZmxleFNocmluazowfTtmdW5jdGlvbiBqNih7c3R5bGU6WCwuLi5afSl7cmV0dXJuIE4oImRpdiIse3N0eWxlOnsuLi5SNiwuLi5YfSwuLi5afSl9dmFyIHY2PXtiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsYm9yZGVyOiJub25lIixwYWRkaW5nOjYsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixkaXNwbGF5OiJpbmxpbmUtZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIix0cmFuc2l0aW9uOiJiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzLCBjb2xvciAwLjE1cyJ9LFo0PUQwKGZ1bmN0aW9uKHtmb3JjZURpc2FibGVkOlosc3R5bGU6SixkaXNhYmxlZDpZLG9uTW91c2VFbnRlcjpxLG9uTW91c2VMZWF2ZTpRLGNoaWxkcmVuOkssLi4uV30sRyl7bGV0IHo9UjAoazQpLE89WXx8Wnx8ej8uZGlzYWJsZWQsWyQsX109UyghMSk7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6Tyxvbk1vdXNlRW50ZXI6KEEpPT57XyghMCkscT8uKEEpfSxvbk1vdXNlTGVhdmU6KEEpPT57XyghMSksUT8uKEEpfSxzdHlsZTp7Li4udjYsY29sb3I6Tz8icmdiYSgyNTUsMjU1LDI1NSwwLjI1KSI6InJnYmEoMjU1LDI1NSwyNTUsMC44KSIsYmFja2dyb3VuZDokJiYhTz8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLGN1cnNvcjpPPyJub3QtYWxsb3dlZCI6InBvaW50ZXIiLC4uLkp9LC4uLlcsY2hpbGRyZW46S30pfSk7ZnVuY3Rpb24geTYoKXtyZXR1cm5bJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBzZXQgZnJvbnRtb3N0IHRvIHRydWUnLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gcGVyZm9ybSBhY3Rpb24gIkFYUmFpc2UiIG9mIChmaXJzdCB3aW5kb3cgd2hvc2UgbmFtZSBjb250YWlucyAid2F0Y2hPUyIpJywndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIGNsaWNrIG1lbnUgaXRlbSAiSG9tZSIgb2YgbWVudSAiRGV2aWNlIiBvZiBtZW51IGJhciBpdGVtICJEZXZpY2UiIG9mIG1lbnUgYmFyIDEnXS5tYXAoKFopPT5gLWUgJyR7Wn0nYCkucmVkdWNlKChaLEopPT5gJHtafSAke0p9YCwib3Nhc2NyaXB0Iil9dmFyIHA2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOk4oInBhdGgiLHtkOiJNMyAxMC41IDEyIDNsOSA3LjVWMjBhMSAxIDAgMCAxLTEgMWgtNXYtN2gtNnY3SDRhMSAxIDAgMCAxLTEtMXoifSl9KSxnNj1OKCJzdmciLHt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixjaGlsZHJlbjpbTigicGF0aCIse2Q6Ik0xNC41IDRoLTVMNyA3SDRhMiAyIDAgMCAwLTIgMnY5YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMlY5YTIgMiAwIDAgMC0yLTJoLTN6In0pLE4oImNpcmNsZSIse2N4OiIxMiIsY3k6IjEzIixyOiI0In0pXX0pLHg2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDEyIDEzIixmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46TigicGF0aCIse2Q6Ik0xMC4yMzA1IDEyLjgwNzdINC40MjM4M0MzLjkyMzgzIDEyLjgwNzcgMy41NDY4OCAxMi42ODQ2IDMuMjkyOTcgMTIuNDM4NUMzLjA0Mjk3IDEyLjE5NjMgMi45MTc5NyAxMS44MTk0IDIuOTE3OTcgMTEuMzA3N1Y1LjUxMjc0QzIuOTE3OTcgNC45OTcxMSAzLjA0Mjk3IDQuNjE4MjEgMy4yOTI5NyA0LjM3NjAyQzMuNTQ2ODggNC4xMjk5MyAzLjkyMzgzIDQuMDA2ODggNC40MjM4MyA0LjAwNjg4SDEwLjIzMDVDMTAuNzM0NCA0LjAwNjg4IDExLjExMTMgNC4xMjk5MyAxMS4zNjEzIDQuMzc2MDJDMTEuNjExMyA0LjYxODIxIDExLjczNjMgNC45OTcxMSAxMS43MzYzIDUuNTEyNzRWMTEuMzA3N0MxMS43MzYzIDExLjgxOTQgMTEuNjExMyAxMi4xOTYzIDExLjM2MTMgMTIuNDM4NUMxMS4xMTEzIDEyLjY4NDYgMTAuNzM0NCAxMi44MDc3IDEwLjIzMDUgMTIuODA3N1pNMTAuMjEyOSAxMS44NjQzQzEwLjQxNiAxMS44NjQzIDEwLjU2MjUgMTEuODE5NCAxMC42NTIzIDExLjcyOTVDMTAuNzQ2MSAxMS42NDM2IDEwLjc5MyAxMS40OTcxIDEwLjc5MyAxMS4yOTAxVjUuNTI0NDZDMTAuNzkzIDUuMzE3NDMgMTAuNzQ2MSA1LjE3MDk0IDEwLjY1MjMgNS4wODUwMUMxMC41NjI1IDQuOTk1MTYgMTAuNDE2IDQuOTUwMjQgMTAuMjEyOSA0Ljk1MDI0SDQuNDQxNDFDNC4yNDIxOSA0Ljk1MDI0IDQuMDk1NyA0Ljk5NTE2IDQuMDAxOTUgNS4wODUwMUMzLjkwODIgNS4xNzA5NCAzLjg2MTMzIDUuMzE3NDMgMy44NjEzMyA1LjUyNDQ2VjExLjI5MDFDMy44NjEzMyAxMS40OTcxIDMuOTA4MiAxMS42NDM2IDQuMDAxOTUgMTEuNzI5NUM0LjA5NTcgMTEuODE5NCA0LjI0MjE5IDExLjg2NDMgNC40NDE0MSAxMS44NjQzSDEwLjIxMjlaTTIuOTE3OTcgMi41ODMwNVYwLjQxNTA4M0MyLjkxNzk3IDAuMjAwMjQgMi45ODYzMyAwLjA2OTM4MDMgMy4xMjMwNSAwLjAyMjUwNTNDMy4yNTk3NyAtMC4wMjgyNzU5IDMuNDEwMTYgMC4wMDY4ODAzMyAzLjU3NDIyIDAuMTI3OTc0TDUuMDUwNzggMS4yMTE5NkM1LjE3NTc4IDEuMzA1NzEgNS4yMzgyOCAxLjQwMTQxIDUuMjM4MjggMS40OTkwN0M1LjIzODI4IDEuNTk2NzIgNS4xNzU3OCAxLjY5MjQzIDUuMDUwNzggMS43ODYxOEwzLjU3NDIyIDIuODY0M0MzLjQxMDE2IDIuOTg1NCAzLjI1OTc3IDMuMDIyNTEgMy4xMjMwNSAyLjk3NTYzQzIuOTg2MzMgMi45MjQ4NSAyLjkxNzk3IDIuNzkzOTkgMi45MTc5NyAyLjU4MzA1Wk0zLjUzMzIgMS4xNTMzNkMzLjYyNjk1IDEuMTUzMzYgMy43MDcwMyAxLjE4NjU3IDMuNzczNDQgMS4yNTI5N0MzLjg0Mzc1IDEuMzE5MzggMy44Nzg5MSAxLjM5NzUxIDMuODc4OTEgMS40ODczNUMzLjg3ODkxIDEuNTgxMSAzLjg0Mzc1IDEuNjYzMTMgMy43NzM0NCAxLjczMzQ0QzMuNzA3MDMgMS43OTk4NSAzLjYyNjk1IDEuODMzMDUgMy41MzMyIDEuODMzMDVIMi44MDY2NEMyLjM4MDg2IDEuODMzMDUgMi4wMTE3MiAxLjkyNDg1IDEuNjk5MjIgMi4xMDg0NEMxLjM5MDYyIDIuMjg4MTMgMS4xNTIzNCAyLjUzODEzIDAuOTg0Mzc1IDIuODU4NDRDMC44MTY0MDYgMy4xNzg3NiAwLjczMjQyMiAzLjU0NTk0IDAuNzMyNDIyIDMuOTYwMDFWNC44Mzg5MUMwLjczMjQyMiA0LjkzNjU3IDAuNjk3MjY2IDUuMDIyNTEgMC42MjY5NTMgNS4wOTY3MkMwLjU1MjczNCA1LjE2NzA0IDAuNDY0ODQ0IDUuMjAyMTkgMC4zNjMyODEgNS4yMDIxOUMwLjI2NTYyNSA1LjIwMjE5IDAuMTgxNjQxIDUuMTY3MDQgMC4xMTEzMjggNS4wOTY3MkMwLjAzNzEwOTQgNS4wMjI1MSAwIDQuOTM2NTcgMCA0LjgzODkxVjMuOTYwMDFDMCAzLjQwMTQxIDAuMTE3MTg4IDIuOTExMTggMC4zNTE1NjIgMi40ODkzQzAuNTgyMDMxIDIuMDY3NDMgMC45MDgyMDMgMS43MzkzIDEuMzMwMDggMS41MDQ5M0MxLjc0ODA1IDEuMjcwNTUgMi4yMzgyOCAxLjE1MzM2IDIuODAwNzggMS4xNTMzNkgzLjUzMzJaIn0pfSksaDY9RDAoZnVuY3Rpb24oe29uQ2xpY2s6WiwuLi5KfSxZKXtsZXQgcT1YNCgiSG9tZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IkhvbWUiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VUeXBlPT09IndhdGNoIilxLmV4ZWMoeTYoKSk7ZWxzZSBxLmV4ZWMoInNlcnZlLXNpbSBidXR0b24gaG9tZSIpfSwuLi5KLGNoaWxkcmVuOnA2fSl9KSxtNj1EMChmdW5jdGlvbih7b25DbGljazpaLC4uLkp9LFkpe2xldCBxPVg0KCJTY3JlZW5zaG90QnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiU2NyZWVuc2hvdCIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGB4Y3J1biBzaW1jdGwgaW8gJHtxLmRldmljZVVkaWR9IHNjcmVlbnNob3Qgfi9EZXNrdG9wL2hhdGNoLXNjcmVlbnNob3QtJChkYXRlICslcykucG5nYCl9LC4uLkosY2hpbGRyZW46ZzZ9KX0pLGY2PUQwKGZ1bmN0aW9uKHtvbkNsaWNrOlosLi4uSn0sWSl7bGV0IHE9WDQoIlJvdGF0ZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IlJvdGF0ZSBkZXZpY2UiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VVZGlkKXEuZXhlYyhgb3Nhc2NyaXB0IC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTaW11bGF0b3IiIHRvIGFjdGl2YXRlJyAtZSAndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8ga2V5IGNvZGUgMTI0IHVzaW5nIHtjb21tYW5kIGRvd259J2ApfSwuLi5KLGNoaWxkcmVuOng2fSl9KSx0PVQ2O3QuVGl0bGU9UzY7dC5BY3Rpb25zPWo2O3QuQnV0dG9uPVo0O3QuSG9tZUJ1dHRvbj1oNjt0LlNjcmVlbnNob3RCdXR0b249bTY7dC5Sb3RhdGVCdXR0b249ZjY7ZnVuY3Rpb24gZDYoWCl7bGV0W1osSl09UyhudWxsKSxZPXcobmV3IFNldCksW3EsUV09UyhudWxsKSxLPWooKFcpPT57cmV0dXJuIFkuY3VycmVudC5hZGQoVyksKCk9PntZLmN1cnJlbnQuZGVsZXRlKFcpfX0sW10pO3JldHVybiBnKCgpPT57aWYoIVgpcmV0dXJuO2xldCBXPW5ldyBBYm9ydENvbnRyb2xsZXIsRz1YLnJlcGxhY2UoL1wvc3RyZWFtXC5tanBlZyQvLCIiKTtyZXR1cm4gZmV0Y2goYCR7R30vY29uZmlnYCx7c2lnbmFsOlcuc2lnbmFsfSkudGhlbigoeik9PnouanNvbigpKS50aGVuKCh6KT0+e2lmKHoud2lkdGg+MCYmei5oZWlnaHQ+MClKKHopfSkuY2F0Y2goKCk9Pnt9KSwoYXN5bmMoKT0+e3RyeXtsZXQgTz0oYXdhaXQgZmV0Y2goWCx7c2lnbmFsOlcuc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFPKXJldHVybjtsZXQgJD1uZXcgVWludDhBcnJheSgwKTt3aGlsZSghMCl7bGV0e2RvbmU6Xyx2YWx1ZTpBfT1hd2FpdCBPLnJlYWQoKTtpZihfKWJyZWFrO2xldCBNPW5ldyBVaW50OEFycmF5KCQubGVuZ3RoK0EubGVuZ3RoKTtNLnNldCgkKSxNLnNldChBLCQubGVuZ3RoKSwkPU07d2hpbGUoITApe2xldCBVPS0xO2ZvcihsZXQgRT0wO0U8JC5sZW5ndGgtMTtFKyspaWYoJFtFXT09PTI1NSYmJFtFKzFdPT09MjE2KXtVPUU7YnJlYWt9aWYoVT09PS0xKWJyZWFrO2xldCBrPS0xO2ZvcihsZXQgRT1VKzI7RTwkLmxlbmd0aC0xO0UrKylpZigkW0VdPT09MjU1JiYkW0UrMV09PT0yMTcpe2s9RSsyO2JyZWFrfWlmKGs9PT0tMSlicmVhaztsZXQgST0kLnNsaWNlKFUsayk7JD0kLnNsaWNlKGspO2xldCBDPW5ldyBCbG9iKFtJXSx7dHlwZToiaW1hZ2UvanBlZyJ9KSxoPVVSTC5jcmVhdGVPYmplY3RVUkwoQyk7UShoKTtmb3IobGV0IEUgb2YgWS5jdXJyZW50KUUoaCl9fX1jYXRjaHt9fSkoKSwoKT0+Vy5hYm9ydCgpfSxbWF0pLHtzdWJzY3JpYmVGcmFtZTpLLGZyYW1lOnEsY29uZmlnOlp9fXZhciBhNj17S2V5QTo0LEtleUI6NSxLZXlDOjYsS2V5RDo3LEtleUU6OCxLZXlGOjksS2V5RzoxMCxLZXlIOjExLEtleUk6MTIsS2V5SjoxMyxLZXlLOjE0LEtleUw6MTUsS2V5TToxNixLZXlOOjE3LEtleU86MTgsS2V5UDoxOSxLZXlROjIwLEtleVI6MjEsS2V5UzoyMixLZXlUOjIzLEtleVU6MjQsS2V5VjoyNSxLZXlXOjI2LEtleVg6MjcsS2V5WToyOCxLZXlaOjI5LERpZ2l0MTozMCxEaWdpdDI6MzEsRGlnaXQzOjMyLERpZ2l0NDozMyxEaWdpdDU6MzQsRGlnaXQ2OjM1LERpZ2l0NzozNixEaWdpdDg6MzcsRGlnaXQ5OjM4LERpZ2l0MDozOSxFbnRlcjo0MCxFc2NhcGU6NDEsQmFja3NwYWNlOjQyLFRhYjo0MyxTcGFjZTo0NCxNaW51czo0NSxFcXVhbDo0NixCcmFja2V0TGVmdDo0NyxCcmFja2V0UmlnaHQ6NDgsQmFja3NsYXNoOjQ5LFNlbWljb2xvbjo1MSxRdW90ZTo1MixCYWNrcXVvdGU6NTMsQ29tbWE6NTQsUGVyaW9kOjU1LFNsYXNoOjU2LENhcHNMb2NrOjU3LEYxOjU4LEYyOjU5LEYzOjYwLEY0OjYxLEY1OjYyLEY2OjYzLEY3OjY0LEY4OjY1LEY5OjY2LEYxMDo2NyxGMTE6NjgsRjEyOjY5LFByaW50U2NyZWVuOjcwLFNjcm9sbExvY2s6NzEsUGF1c2U6NzIsSW5zZXJ0OjczLEhvbWU6NzQsUGFnZVVwOjc1LERlbGV0ZTo3NixFbmQ6NzcsUGFnZURvd246NzgsQXJyb3dSaWdodDo3OSxBcnJvd0xlZnQ6ODAsQXJyb3dEb3duOjgxLEFycm93VXA6ODIsTnVtTG9jazo4MyxOdW1wYWREaXZpZGU6ODQsTnVtcGFkTXVsdGlwbHk6ODUsTnVtcGFkU3VidHJhY3Q6ODYsTnVtcGFkQWRkOjg3LE51bXBhZEVudGVyOjg4LE51bXBhZDE6ODksTnVtcGFkMjo5MCxOdW1wYWQzOjkxLE51bXBhZDQ6OTIsTnVtcGFkNTo5MyxOdW1wYWQ2Ojk0LE51bXBhZDc6OTUsTnVtcGFkODo5NixOdW1wYWQ5Ojk3LE51bXBhZDA6OTgsTnVtcGFkRGVjaW1hbDo5OSxDb250cm9sTGVmdDoyMjQsU2hpZnRMZWZ0OjIyNSxBbHRMZWZ0OjIyNixNZXRhTGVmdDoyMjcsQ29udHJvbFJpZ2h0OjIyOCxTaGlmdFJpZ2h0OjIyOSxBbHRSaWdodDoyMzAsTWV0YVJpZ2h0OjIzMX07ZnVuY3Rpb24gbDYoWCl7cmV0dXJuIGE2W1hdPz9udWxsfWFzeW5jIGZ1bmN0aW9uIE8wKFgpe3JldHVybihhd2FpdCBmZXRjaCgiL2V4ZWMiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7Y29tbWFuZDpYfSl9KSkuanNvbigpfWZ1bmN0aW9uIGM2KFgpe3RyeXtsZXQgWj1KU09OLnBhcnNlKFgpLEo9W107Zm9yKGxldFtZLHFdb2YgT2JqZWN0LmVudHJpZXMoWi5kZXZpY2VzPz97fSkpe2xldCBRPVkucmVwbGFjZSgvXmNvbVwuYXBwbGVcLkNvcmVTaW11bGF0b3JcLlNpbVJ1bnRpbWVcLi8sIiIpLnJlcGxhY2UoLy0vZywiLiIpO2ZvcihsZXQgSyBvZiBxKWlmKEsuaXNBdmFpbGFibGUpSi5wdXNoKHt1ZGlkOksudWRpZCxuYW1lOksubmFtZSxzdGF0ZTpLLnN0YXRlLHJ1bnRpbWU6UX0pfXJldHVybiBKfWNhdGNoe3JldHVybltdfX1mdW5jdGlvbiB2NShYKXtsZXQgWj1YLnRvTG93ZXJDYXNlKCk7aWYoWi5pbmNsdWRlcygiaXBob25lIikpcmV0dXJuIDA7aWYoWi5pbmNsdWRlcygiaXBhZCIpKXJldHVybiAxO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIDI7aWYoWi5pbmNsdWRlcygidmlzaW9uIikpcmV0dXJuIDM7cmV0dXJuIDR9ZnVuY3Rpb24geTUoWCl7bGV0IFo9WC50b0xvd2VyQ2FzZSgpO2lmKFouc3RhcnRzV2l0aCgiaW9zIikpcmV0dXJuIDA7aWYoWi5zdGFydHNXaXRoKCJpcGFkb3MiKSlyZXR1cm4gMTtpZihaLnN0YXJ0c1dpdGgoIndhdGNob3MiKSlyZXR1cm4gMjtpZihaLnN0YXJ0c1dpdGgoInZpc2lvbm9zIil8fFouc3RhcnRzV2l0aCgieHJvcyIpKXJldHVybiAzO3JldHVybiA0fWZ1bmN0aW9uIGk2KHtkZXZpY2VzOlgsc2VsZWN0ZWRVZGlkOlosbG9hZGluZzpKLGVycm9yOlksc3RvcHBpbmdVZGlkczpxLG9uUmVmcmVzaDpRLG9uU2VsZWN0Okssb25TdG9wOlcsdHJpZ2dlcjpHfSl7bGV0W3osT109UyghMSksJD13KG51bGwpO2coKCk9PntpZigheilyZXR1cm47bGV0IFU9KGspPT57aWYoISQuY3VycmVudD8uY29udGFpbnMoay50YXJnZXQpKU8oITEpfTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsVSksKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLFUpfSxbel0pO2xldCBfPW5ldyBNYXA7Zm9yKGxldCBVIG9mIFgpe2lmKFUudWRpZD09PVopY29udGludWU7bGV0IGs9Xy5nZXQoVS5ydW50aW1lKTtpZighaylrPVtdLF8uc2V0KFUucnVudGltZSxrKTtrLnB1c2goVSl9Zm9yKGxldCBVIG9mIF8udmFsdWVzKCkpVS5zb3J0KChrLEkpPT52NShrLm5hbWUpLXY1KEkubmFtZSl8fGsubmFtZS5sb2NhbGVDb21wYXJlKEkubmFtZSkpO2xldCBBPVsuLi5fLmVudHJpZXMoKV0uc29ydCgoW1VdLFtrXSk9Pnk1KFUpLXk1KGspfHxVLmxvY2FsZUNvbXBhcmUoaykpLE09WC5maW5kKChVKT0+VS51ZGlkPT09Wik/P251bGw7cmV0dXJuIE4oImRpdiIse3JlZjokLHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUifSxjaGlsZHJlbjpbTigiZGl2Iix7b25DbGljazooKT0+e2lmKCF6KVEoKTtPKChVKT0+IVUpfSxjaGlsZHJlbjpHfSkseiYmTigiZGl2Iix7c3R5bGU6bzYsY2hpbGRyZW46W04oImRpdiIse3N0eWxlOnM2LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2ZvbnRXZWlnaHQ6NjAwfSxjaGlsZHJlbjoiU2ltdWxhdG9ycyJ9KSxOKCJidXR0b24iLHtvbkNsaWNrOihVKT0+e1Uuc3RvcFByb3BhZ2F0aW9uKCksUSgpfSxkaXNhYmxlZDpKLHN0eWxlOnI2LGNoaWxkcmVuOko/Ii4uLiI6IlJlZnJlc2gifSldfSksWSYmTigiZGl2Iix7c3R5bGU6dDYsY2hpbGRyZW46WX0pLE0mJk4oZix7Y2hpbGRyZW46W04oImRpdiIse3N0eWxlOnsuLi5nNSxjb2xvcjoiI2E1YjRmYyJ9LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6cDUoTS5zdGF0ZT09PSJCb290ZWQiPyIjNGFkZTgwIjoiIzQ0NCIpfSksTigic3BhbiIse3N0eWxlOntmbGV4OjF9LGNoaWxkcmVuOk0ubmFtZX0pXX0pLE4oImRpdiIse3N0eWxlOm42fSldfSksWC5sZW5ndGg9PT0wJiYhSiYmIVkmJk4oImRpdiIse3N0eWxlOmU2LGNoaWxkcmVuOiJObyBhdmFpbGFibGUgc2ltdWxhdG9ycyBmb3VuZCJ9KSxBLm1hcCgoW1Usa10pPT5OKCJkaXYiLHtjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6WDcsY2hpbGRyZW46VX0pLGsubWFwKChJKT0+e2xldCBDPXEuaGFzKEkudWRpZCksaD1JLnN0YXRlPT09IkJvb3RlZCI7cmV0dXJuIE4oImRpdiIse3N0eWxlOmc1LG9uTW91c2VFbnRlcjooRSk9PkUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDI1NSwyNTUsMjU1LDAuMDgpIixvbk1vdXNlTGVhdmU6KEUpPT5FLmN1cnJlbnRUYXJnZXQuc3R5bGUuYmFja2dyb3VuZD0idHJhbnNwYXJlbnQiLG9uQ2xpY2s6KCk9PntLKEkpLE8oITEpfSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnA1KGg/IiM0YWRlODAiOiIjNDQ0Iil9KSxOKCJzcGFuIix7c3R5bGU6e2ZsZXg6MX0sY2hpbGRyZW46SS5uYW1lfSksaCYmTigic3BhbiIse3JvbGU6ImJ1dHRvbiIsb25DbGljazooRSk9PntpZihFLnN0b3BQcm9wYWdhdGlvbigpLCFDKVcoSS51ZGlkKX0sc3R5bGU6e2ZvbnRTaXplOjEwLHBhZGRpbmc6IjFweCA2cHgiLGJvcmRlclJhZGl1czo0LGNvbG9yOkM/IiM4ODgiOiIjZjg3MTcxIixiYWNrZ3JvdW5kOkM/InRyYW5zcGFyZW50IjoicmdiYSgyNDgsMTEzLDExMywwLjEpIixjdXJzb3I6Qz8iZGVmYXVsdCI6InBvaW50ZXIifSxjaGlsZHJlbjpDPyJTdG9wcGluZy4uLiI6IlN0b3AifSldfSxJLnVkaWQpfSldfSxVKSldfSldfSl9ZnVuY3Rpb24gcDUoWCl7cmV0dXJue3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6WCxmbGV4U2hyaW5rOjB9fWZ1bmN0aW9uIHU2KCl7bGV0IFg9d2luZG93Ll9fU0lNX1BSRVZJRVdfXyxbWixKXT1TKCExKSxbWSxxXT1TKFtdKSxbUSxLXT1TKCExKSxbVyxHXT1TKG51bGwpLFt6LE9dPVMobmV3IFNldCksWyQsX109UyghMSksQT1qKGFzeW5jKCk9PntLKCEwKSxHKG51bGwpO3RyeXtsZXQgRj1hd2FpdCBPMCgieGNydW4gc2ltY3RsIGxpc3QgZGV2aWNlcyBhdmFpbGFibGUgLWoiKTtpZihGLmV4aXRDb2RlIT09MCl0aHJvdyBFcnJvcihGLnN0ZGVycnx8InNpbWN0bCBsaXN0IGZhaWxlZCIpO3EoYzYoRi5zdGRvdXQpKX1jYXRjaChGKXtHKEYgaW5zdGFuY2VvZiBFcnJvcj9GLm1lc3NhZ2U6IkZhaWxlZCB0byBsaXN0IGRldmljZXMiKX1maW5hbGx5e0soITEpfX0sW10pO2lmKGcoKCk9PntBKCl9LFtBXSksZygoKT0+e2lmKCFYPy5sb2dzRW5kcG9pbnQpcmV0dXJuO2xldCBGPW5ldyBFdmVudFNvdXJjZShYLmxvZ3NFbmRwb2ludCksUj1uZXcgTWFwLHY9WyIjOGJlOWZkIiwiIzUwZmE3YiIsIiNmZmI4NmMiLCIjZmY3OWM2IiwiI2JkOTNmOSIsIiNmMWZhOGMiLCIjNjI3MmE0IiwiI2ZmNTU1NSIsIiM2OWZmOTQiLCIjZDZhY2ZmIiwiI2ZmZmZhNSIsIiNhNGZmZmYiLCIjZmY2ZTZlIiwiI2NhYTlmYSIsIiM1YWY3OGUiXTtmdW5jdGlvbiBUKEowKXtsZXQgeT1SLmdldChKMCk7aWYoIXkpe2xldCBYMD0wO2ZvcihsZXQgYT0wO2E8SjAubGVuZ3RoO2ErKylYMD0oWDA8PDUpLVgwK0owLmNoYXJDb2RlQXQoYSl8MDt5PXZbTWF0aC5hYnMoWDApJXYubGVuZ3RoXSxSLnNldChKMCx5KX1yZXR1cm4geX1sZXQgdT0iIixtPSExO3JldHVybiBGLm9ubWVzc2FnZT0oSjApPT57dHJ5e2xldCB5PUpTT04ucGFyc2UoSjAuZGF0YSksWDA9eS5wcm9jZXNzSW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz95LnNlbmRlckltYWdlUGF0aD8uc3BsaXQoIi8iKS5wb3AoKT8/IiIsYT15LnN1YnN5c3RlbT8/IiIsVjA9eS5jYXRlZ29yeT8/IiIsWTA9eS5ldmVudE1lc3NhZ2U/PyIiO2lmKCFZMClyZXR1cm47aWYoWDAhPT11KXtpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtsZXQgTTA9VChYMCk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke1gwfSR7YT9gICVjJHthfSR7VjA/IjoiK1YwOiIifWA6IiJ9YCxgY29sb3I6JHtNMH07Zm9udC13ZWlnaHQ6Ym9sZGAsLi4uYT9bImNvbG9yOiM4ODg7Zm9udC13ZWlnaHQ6bm9ybWFsIl06W10pLG09ITAsdT1YMH1sZXQgYz0oeS5tZXNzYWdlVHlwZT8/IiIpLnRvTG93ZXJDYXNlKCksbz1hJiZYMD09PXU/YCVjJHtWMHx8YX0lYyBgOiIiLEEwPW8/WyJjb2xvcjojODg4O2ZvbnQtc3R5bGU6aXRhbGljIiwiY29sb3I6aW5oZXJpdCJdOltdO2lmKGM9PT0iZmF1bHQifHxjPT09ImVycm9yIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihjPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojNjI3MmE0Iik7ZWxzZSBjb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjppbmhlcml0Iil9Y2F0Y2h7fX0sKCk9PntpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtGLmNsb3NlKCl9fSxbWD8ubG9nc0VuZHBvaW50XSksIVgpcmV0dXJuIE4oImRpdiIse3N0eWxlOk4wLnBhZ2UsY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6TjAuZW1wdHksY2hpbGRyZW46W04oImgxIix7c3R5bGU6TjAuZW1wdHlUaXRsZSxjaGlsZHJlbjoiTm8gc2VydmUtc2ltIHN0cmVhbSBydW5uaW5nIn0pLE4oInAiLHtzdHlsZTpOMC5lbXB0eUhpbnQsY2hpbGRyZW46WyJCb290IGFuIGlPUyBzaW11bGF0b3IgYW5kIHN0YXJ0IGEgSGF0Y2ggc3RyZWFtIHdpdGgiLCIgIixOKCJjb2RlIix7c3R5bGU6TjAuY29kZSxjaGlsZHJlbjoiYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2gifSksIiwgdGhlbiByZWxvYWQuIl19KV19KX0pO2xldCBNPVkuZmluZCgoRik9PkYudWRpZD09PVguZGV2aWNlKT8/bnVsbDtnKCgpPT57ZG9jdW1lbnQudGl0bGU9TT8ubmFtZT9gU2ltdWxhdG9yIC0gJHtNLm5hbWV9YDoiU2ltdWxhdG9yIFByZXZpZXcifSxbTT8ubmFtZV0pO2xldCBVPWswKE0/Lm5hbWUpLGs9JDBbVV0sST1rLndpZHRoLTIqay5iZXplbFgsQz1rLmhlaWdodC0yKmsuYmV6ZWxZLGg9ZTAoVSksRT1VPT09InZpc2lvbiI/NTgwOlU9PT0iaXBhZCI/NDAwOlU9PT0id2F0Y2giPzIwMDozMjAsZT1kNihYLnN0cmVhbVVybCksWjA9dyhudWxsKTtnKCgpPT57bGV0IEY9bmV3IFdlYlNvY2tldChYLndzVXJsKTtyZXR1cm4gRi5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsWjAuY3VycmVudD1GLCgpPT57Ri5jbG9zZSgpLFowLmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IHg9aigoRixSKT0+e2xldCB2PVowLmN1cnJlbnQ7aWYoIXZ8fHYucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgVD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoUikpLHU9bmV3IFVpbnQ4QXJyYXkoMStULmxlbmd0aCk7dVswXT1GLHUuc2V0KFQsMSksdi5zZW5kKHUpfSxbXSksSzA9aigoRik9PngoMyxGKSxbeF0pLHM9aigoRik9PngoNSxGKSxbeF0pLHI9aigoRik9PngoNCx7YnV0dG9uOkZ9KSxbeF0pLFUwPWooKEYsUik9Pnt4KDYse3R5cGU6Rix1c2FnZTpSfSl9LFt4XSksW2owLHYwXT1TKG51bGwpO2coKCk9PntsZXQgRj1uZXcgRXZlbnRTb3VyY2UoIi9hcHBzdGF0ZSIpLFI9bnVsbDtyZXR1cm4gRi5vbm1lc3NhZ2U9KHYpPT57dHJ5e2xldCBUPUpTT04ucGFyc2Uodi5kYXRhKTtpZihSKWNsZWFyVGltZW91dChSKTtsZXQgdT1UPy5pc1JlYWN0TmF0aXZlPzA6NjAwO1I9c2V0VGltZW91dCgoKT0+djAoVCksdSl9Y2F0Y2h7fX0sKCk9PntpZihSKWNsZWFyVGltZW91dChSKTtGLmNsb3NlKCl9fSxbXSk7bGV0IEcwPWooYXN5bmMoKT0+e1UwKCJkb3duIiwyMjcpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoImRvd24iLDIxKSxhd2FpdCBuZXcgUHJvbWlzZSgodik9PnNldFRpbWVvdXQodiwzMCkpLFUwKCJ1cCIsMjEpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoInVwIiwyMjcpfSxbVTBdKTtnKCgpPT57bGV0IEY9KFQsdSk9PntpZihULmNvZGU9PT0iS2V5SCImJlQubWV0YUtleSYmVC5zaGlmdEtleSl7aWYoVC5wcmV2ZW50RGVmYXVsdCgpLHU9PT0iZG93biImJiFULnJlcGVhdCl4KDQse2J1dHRvbjoiaG9tZSJ9KTtyZXR1cm59aWYoVC5jb2RlPT09IktleUEiJiZULm1ldGFLZXkmJlQuc2hpZnRLZXkpe2lmKFQucHJldmVudERlZmF1bHQoKSx1PT09ImRvd24iJiYhVC5yZXBlYXQpTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlYCkudGhlbigoSjApPT57bGV0IHk9SjAuc3Rkb3V0LnRyaW0oKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIjtyZXR1cm4gTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlICR7eX1gKX0pLmNhdGNoKCgpPT57fSk7cmV0dXJufWxldCBtPWw2KFQuY29kZSk7aWYobT09bnVsbClyZXR1cm47VC5wcmV2ZW50RGVmYXVsdCgpLHgoNix7dHlwZTp1LHVzYWdlOm19KX0sUj0oVCk9PkYoVCwiZG93biIpLHY9KFQpPT5GKFQsInVwIik7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixSKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLHYpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLFIpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdil9fSxbeCxYLmRldmljZV0pO2xldCBKND1qKGFzeW5jKEYpPT57aWYoJHx8Ri51ZGlkPT09WC5kZXZpY2UpcmV0dXJuO18oITApO3RyeXtpZihGLnN0YXRlIT09IkJvb3RlZCIpYXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBib290ICR7Ri51ZGlkfWApO2F3YWl0IE8wKGBidW54IHNlcnZlLXNpbSAtLWtpbGwgJHtYLmRldmljZX1gKSxhd2FpdCBPMChgYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2ggJHtGLnVkaWR9YCksd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfWNhdGNoe18oITEpfX0sWyQsWC5kZXZpY2VdKSxJMD1qKGFzeW5jKEYpPT57TygoUik9Pm5ldyBTZXQoUikuYWRkKEYpKTt0cnl7YXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBzaHV0ZG93biAke0Z9YCksYXdhaXQgQSgpfWZpbmFsbHl7TygoUik9PntsZXQgdj1uZXcgU2V0KFIpO3JldHVybiB2LmRlbGV0ZShGKSx2fSl9fSxbQV0pO3JldHVybiBOKCJkaXYiLHtzdHlsZTpOMC5wYWdlLGNoaWxkcmVuOltOKHQse2V4ZWM6TzAsZGV2aWNlVWRpZDpYLmRldmljZSxkZXZpY2VOYW1lOk0/Lm5hbWU/P251bGwsZGV2aWNlUnVudGltZTpNPy5ydW50aW1lPz9udWxsLHN0cmVhbWluZzpaLHN0eWxlOnttYXhXaWR0aDpFfSxjaGlsZHJlbjpbTihpNix7ZGV2aWNlczpZLHNlbGVjdGVkVWRpZDpYLmRldmljZSxsb2FkaW5nOlEsZXJyb3I6VyxzdG9wcGluZ1VkaWRzOnosb25SZWZyZXNoOkEsb25TZWxlY3Q6SjQsb25TdG9wOkkwLHRyaWdnZXI6Tih0LlRpdGxlLHt9KX0pLE4odC5BY3Rpb25zLHtjaGlsZHJlbjpbajA/LmlzUmVhY3ROYXRpdmUmJk4odC5CdXR0b24seyJhcmlhLWxhYmVsIjoiUmVsb2FkIFJlYWN0IE5hdGl2ZSBidW5kbGUiLHRpdGxlOiJSZWxvYWQgKENtZCtSKSIsb25DbGljazooKT0+dm9pZCBHMCgpLGNoaWxkcmVuOk4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTMgMTJhOSA5IDAgMSAwIDMuNS03LjEifSksTigicG9seWxpbmUiLHtwb2ludHM6IjMgMyAzIDkgOSA5In0pXX0pfSksTih0LkhvbWVCdXR0b24se29uQ2xpY2s6KEYpPT57Ri5wcmV2ZW50RGVmYXVsdCgpLHIoImhvbWUiKX19KSxOKHQuU2NyZWVuc2hvdEJ1dHRvbix7fSksTih0LlJvdGF0ZUJ1dHRvbix7fSldfSldfSksTigiZGl2Iix7c3R5bGU6e21heFdpZHRoOkUsd2lkdGg6IjEwMCUiLGFzcGVjdFJhdGlvOmAke0l9IC8gJHtDfWB9LGNoaWxkcmVuOk4objAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOmgsY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOkosb25TdHJlYW1Ub3VjaDpLMCxvblN0cmVhbU11bHRpVG91Y2g6cyxvblN0cmVhbUJ1dHRvbjpyLHN1YnNjcmliZUZyYW1lOmUuc3Vic2NyaWJlRnJhbWUsc3RyZWFtRnJhbWU6ZS5mcmFtZSxzdHJlYW1Db25maWc6ZS5jb25maWd9KX0pLE4oImRpdiIse3N0eWxlOk4wLmJhcixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6ey4uLk4wLmxpdmUsY29sb3I6Wj8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnsuLi5OMC5kb3QsYmFja2dyb3VuZDpaPyIjNGFkZTgwIjoiIzY2NiJ9fSksWj8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIE4wPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX0sbzY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiJjYWxjKDEwMCUgKyA2cHgpIixsZWZ0OjAsbWluV2lkdGg6MjYwLG1heEhlaWdodDozNjAsb3ZlcmZsb3dZOiJhdXRvIixiYWNrZ3JvdW5kOiIjMWMxYzFlIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIixib3JkZXJSYWRpdXM6MTAscGFkZGluZzo0LGJveFNoYWRvdzoiMCA4cHggMjRweCByZ2JhKDAsMCwwLDAuNSkiLGZvbnRGYW1pbHk6InVpLW1vbm9zcGFjZSwgbW9ub3NwYWNlIixmb250U2l6ZToxMyxjb2xvcjoiI2VlZSIsekluZGV4OjIwfSxzNj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNnB4IDEwcHgiLGZvbnRTaXplOjExLGNvbG9yOiIjYWFhIn0scjY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjYTViNGZjIixmb250U2l6ZToxMSxjdXJzb3I6InBvaW50ZXIiLHBhZGRpbmc6MH0sdDY9e3BhZGRpbmc6IjZweCAxMHB4Iixjb2xvcjoiI2Y4NzE3MSIsZm9udFNpemU6MTF9LGc1PXtkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo4LHBhZGRpbmc6IjZweCAxMHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4xNXMifSxuNj17aGVpZ2h0OjEsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjA4KSIsbWFyZ2luOiI0cHggMCJ9LGU2PXtwYWRkaW5nOjEyLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGZvbnRTaXplOjExLHRleHRBbGlnbjoiY2VudGVyIn0sWDc9e3BhZGRpbmc6IjZweCAxMHB4IDJweCIsZm9udFNpemU6MTAsZm9udFdlaWdodDo2MDAsY29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsdGV4dFRyYW5zZm9ybToidXBwZXJjYXNlIixsZXR0ZXJTcGFjaW5nOiIwLjA4ZW0ifTtPNShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIoTih1Nix7fSkpOwo8L3NjcmlwdD4KPC9ib2R5PjwvaHRtbD4=","base64").toString("utf-8");return A}function o(Y){let J=(Y?.basePath??"/.sim").replace(/\/+$/,"");return(Q,z,Z)=>{let C=Q.url??"";if(C===J||C===J+"/"){let V=L()[0]??null,W=h();if(V){let H=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...V,logsEndpoint:J+"/logs"})}</script>`;W=W.replace("<!--__SIM_PREVIEW_CONFIG__-->",H)}z.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),z.end(W);return}if(C===J+"/api"){let X=L();z.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),z.end(JSON.stringify(X[0]||null));return}if((C===J+"/exec"||C===J+"/exec/")&&Q.method==="POST"){let X="";Q.on("data",(V)=>{X+=typeof V==="string"?V:V.toString()}),Q.on("end",()=>{let V="";try{V=JSON.parse(X).command??""}catch{}if(!V){z.writeHead(400,{"Content-Type":"application/json"}),z.end(JSON.stringify({stdout:"",stderr:"Missing command",exitCode:1}));return}q(V,{maxBuffer:16777216},(W,$,H)=>{z.writeHead(200,{"Content-Type":"application/json"}),z.end(JSON.stringify({stdout:$.toString(),stderr:H.toString(),exitCode:W?W.code??1:0}))})});return}if(C===J+"/logs"||C.startsWith(J+"/logs?")){let X=L();if(X.length===0){z.writeHead(404),z.end("No serve-sim device");return}let V=X[0].device;z.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),z.write(`:
3
3
 
4
4
  `);let W=U("xcrun",["simctl","spawn",V,"log","stream","--style","ndjson","--level","info"],{stdio:["ignore","pipe","ignore"]}),$="";W.stdout.on("data",(H)=>{$+=H.toString();let G;while((G=$.indexOf(`
5
5
  `))!==-1){let M=$.slice(0,G).trim();if($=$.slice(G+1),M)z.write("data: "+M+`
package/dist/serve-sim.js CHANGED
@@ -1,22 +1,22 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var pe=Object.defineProperty;var De=(e)=>e;function Ee(e,_){this[e]=De.bind(null,_)}var de=(e,_)=>{for(var t in _)pe(e,t,{get:_[t],enumerable:!0,configurable:!0,set:Ee.bind(_,t)})};var le=(e,_)=>()=>(e&&(_=e(e=0)),_);var K={};de(K,{simMiddleware:()=>Ie});import{readdirSync as we,readFileSync as ve,existsSync as be,unlinkSync as X}from"fs";import{execSync as he,spawn as G,exec as Oe,execFile as me}from"child_process";import{tmpdir as He}from"os";import{join as P}from"path";function We(e){return!Le.test(e)}function Pe(e,_){if(Ne.has(_))return Promise.resolve(!0);return new Promise((t)=>{me("xcrun",["simctl","get_app_container",e,_,"app"],{timeout:2000},(s,i)=>{if(s)return t(!1);let S=i.trim();if(!S)return t(!1);for(let o of Ve)if(be(P(S,o)))return t(!0);t(!1)})})}function qe(){let e=Date.now();if(b.booted&&e-b.at<1500)return b.booted;try{let _=he("xcrun simctl list devices booted -j",{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:3000}),t=JSON.parse(_),s=new Set;for(let i of Object.values(t.devices))for(let S of i)if(S.state==="Booted")s.add(S.udid);return b={at:e,booted:s},s}catch{return null}}function h(){let e;try{e=we(x).filter((s)=>s.startsWith("server-")&&s.endsWith(".json"))}catch{return[]}let _=qe(),t=[];for(let s of e){let i=P(x,s);try{let S=JSON.parse(ve(i,"utf-8"));try{process.kill(S.pid,0)}catch{try{X(i)}catch{}continue}if(_&&!_.has(S.device)){try{process.kill(S.pid,"SIGTERM")}catch{}try{X(i)}catch{}continue}t.push(S)}catch{}}return t}function Me(){if(!W)W=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYzAsQixqNCxtNSxQMCxiNCx2NCx5NCwkNCxtMCxUMCxwNCxHNCx6NCxXNCxnNCxkMD17fSxhMD1bXSxmNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLGIwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gejAoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVjQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gVzAoWCxaLEope3ZhciBZLHEsUSxLPXt9O2ZvcihRIGluIFopUT09ImtleSI/WT1aW1FdOlE9PSJyZWYiP3E9WltRXTpLW1FdPVpbUV07aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoSy5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YzAuY2FsbChhcmd1bWVudHMsMik6SiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihRIGluIFguZGVmYXVsdFByb3BzKUtbUV09PT12b2lkIDAmJihLW1FdPVguZGVmYXVsdFByb3BzW1FdKTtyZXR1cm4gZjAoWCxLLFkscSxudWxsKX1mdW5jdGlvbiBmMChYLFosSixZLHEpe3ZhciBRPXt0eXBlOlgscHJvcHM6WixrZXk6SixyZWY6WSxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK2o0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmQi52bm9kZSE9bnVsbCYmQi52bm9kZShRKSxRfWZ1bmN0aW9uIGYoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gaShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn1mdW5jdGlvbiBCMChYLFope2lmKFo9PW51bGwpcmV0dXJuIFguX18/QjAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgSjtaPFguX19rLmxlbmd0aDtaKyspaWYoKEo9WC5fX2tbWl0pIT1udWxsJiZKLl9fZSE9bnVsbClyZXR1cm4gSi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/QjAoWCk6bnVsbH1mdW5jdGlvbiBkNShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBaPVguX192LEo9Wi5fX2UsWT1bXSxxPVtdLFE9ejAoe30sWik7US5fX3Y9Wi5fX3YrMSxCLnZub2RlJiZCLnZub2RlKFEpLEg0KFguX19QLFEsWixYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWi5fX3U/W0pdOm51bGwsWSxKPT1udWxsP0IwKFopOkosISEoMzImWi5fX3UpLHEpLFEuX192PVouX192LFEuX18uX19rW1EuX19pXT1RLGY0KFksUSxxKSxaLl9fZT1aLl9fPW51bGwsUS5fX2UhPUomJng0KFEpfX1mdW5jdGlvbiB4NChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFope2lmKFohPW51bGwmJlouX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVouX19lfSkseDQoWCl9ZnVuY3Rpb24gTDQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmUDAucHVzaChYKSYmIWwwLl9fcisrfHxiNCE9Qi5kZWJvdW5jZVJlbmRlcmluZykmJigoYjQ9Qi5kZWJvdW5jZVJlbmRlcmluZyl8fHY0KShsMCl9ZnVuY3Rpb24gbDAoKXt0cnl7Zm9yKHZhciBYLFo9MTtQMC5sZW5ndGg7KVAwLmxlbmd0aD5aJiZQMC5zb3J0KHk0KSxYPVAwLnNoaWZ0KCksWj1QMC5sZW5ndGgsZDUoWCl9ZmluYWxseXtQMC5sZW5ndGg9bDAuX19yPTB9fWZ1bmN0aW9uIGg0KFgsWixKLFkscSxRLEssVyxHLHosTyl7dmFyICQsXyxBLEMsVSxrLEksTT1ZJiZZLl9fa3x8YTAsaD1aLmxlbmd0aDtmb3IoRz1hNShKLFosTSxHLGgpLCQ9MDskPGg7JCsrKShBPUouX19rWyRdKSE9bnVsbCYmKF89QS5fX2khPS0xJiZNW0EuX19pXXx8ZDAsQS5fX2k9JCxrPUg0KFgsQSxfLHEsUSxLLFcsRyx6LE8pLEM9QS5fX2UsQS5yZWYmJl8ucmVmIT1BLnJlZiYmKF8ucmVmJiZQNChfLnJlZixudWxsLEEpLE8ucHVzaChBLnJlZixBLl9fY3x8QyxBKSksVT09bnVsbCYmQyE9bnVsbCYmKFU9QyksKEk9ISEoNCZBLl9fdSkpfHxfLl9faz09PUEuX19rPyhHPW00KEEsRyxYLEkpLEkmJl8uX19lJiYoXy5fX2U9bnVsbCkpOnR5cGVvZiBBLnR5cGU9PSJmdW5jdGlvbiImJmshPT12b2lkIDA/Rz1rOkMmJihHPUMubmV4dFNpYmxpbmcpLEEuX191Jj0tNyk7cmV0dXJuIEouX19lPVUsR31mdW5jdGlvbiBhNShYLFosSixZLHEpe3ZhciBRLEssVyxHLHosTz1KLmxlbmd0aCwkPU8sXz0wO2ZvcihYLl9faz1BcnJheShxKSxRPTA7UTxxO1ErKykoSz1aW1FdKSE9bnVsbCYmdHlwZW9mIEshPSJib29sZWFuIiYmdHlwZW9mIEshPSJmdW5jdGlvbiI/KHR5cGVvZiBLPT0ic3RyaW5nInx8dHlwZW9mIEs9PSJudW1iZXIifHx0eXBlb2YgSz09ImJpZ2ludCJ8fEsuY29uc3RydWN0b3I9PVN0cmluZz9LPVguX19rW1FdPWYwKG51bGwsSyxudWxsLG51bGwsbnVsbCk6YjAoSyk/Sz1YLl9fa1tRXT1mMChmLHtjaGlsZHJlbjpLfSxudWxsLG51bGwsbnVsbCk6Sy5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmSy5fX2I+MD9LPVguX19rW1FdPWYwKEsudHlwZSxLLnByb3BzLEsua2V5LEsucmVmP0sucmVmOm51bGwsSy5fX3YpOlguX19rW1FdPUssRz1RK18sSy5fXz1YLEsuX19iPVguX19iKzEsVz1udWxsLCh6PUsuX19pPWw1KEssSixHLCQpKSE9LTEmJigkLS0sKFc9Slt6XSkmJihXLl9fdXw9MikpLFc9PW51bGx8fFcuX192PT1udWxsPyh6PT0tMSYmKHE+Tz9fLS06cTxPJiZfKyspLHR5cGVvZiBLLnR5cGUhPSJmdW5jdGlvbiImJihLLl9fdXw9NCkpOnohPUcmJih6PT1HLTE/Xy0tOno9PUcrMT9fKys6KHo+Rz9fLS06XysrLEsuX191fD00KSkpOlguX19rW1FdPW51bGw7aWYoJClmb3IoUT0wO1E8TztRKyspKFc9SltRXSkhPW51bGwmJigyJlcuX191KT09MCYmKFcuX19lPT1ZJiYoWT1CMChXKSksYTQoVyxXKSk7cmV0dXJuIFl9ZnVuY3Rpb24gbTQoWCxaLEosWSl7dmFyIHEsUTtpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxRPTA7cSYmUTxxLmxlbmd0aDtRKyspcVtRXSYmKHFbUV0uX189WCxaPW00KHFbUV0sWixKLFkpKTtyZXR1cm4gWn1YLl9fZSE9WiYmKFkmJihaJiZYLnR5cGUmJiFaLnBhcmVudE5vZGUmJihaPUIwKFgpKSxKLmluc2VydEJlZm9yZShYLl9fZSxafHxudWxsKSksWj1YLl9fZSk7ZG8gWj1aJiZaLm5leHRTaWJsaW5nO3doaWxlKFohPW51bGwmJloubm9kZVR5cGU9PTgpO3JldHVybiBafWZ1bmN0aW9uIEwwKFgsWil7cmV0dXJuIFo9Wnx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KGIwKFgpP1guc29tZShmdW5jdGlvbihKKXtMMChKLFopfSk6Wi5wdXNoKFgpKSxafWZ1bmN0aW9uIGw1KFgsWixKLFkpe3ZhciBxLFEsSyxXPVgua2V5LEc9WC50eXBlLHo9WltKXSxPPXohPW51bGwmJigyJnouX191KT09MDtpZih6PT09bnVsbCYmVz09bnVsbHx8TyYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gSjtpZihZPihPPzE6MCkpe2ZvcihxPUotMSxRPUorMTtxPj0wfHxRPFoubGVuZ3RoOylpZigoej1aW0s9cT49MD9xLS06USsrXSkhPW51bGwmJigyJnouX191KT09MCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gS31yZXR1cm4tMX1mdW5jdGlvbiBTNChYLFosSil7WlswXT09Ii0iP1guc2V0UHJvcGVydHkoWixKPT1udWxsPyIiOkopOlhbWl09Sj09bnVsbD8iIjp0eXBlb2YgSiE9Im51bWJlciJ8fGY1LnRlc3QoWik/SjpKKyJweCJ9ZnVuY3Rpb24gaDAoWCxaLEosWSxxKXt2YXIgUSxLO1g6aWYoWj09InN0eWxlIilpZih0eXBlb2YgSj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PUo7ZWxzZXtpZih0eXBlb2YgWT09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9WT0iIiksWSlmb3IoWiBpbiBZKUomJlogaW4gSnx8UzQoWC5zdHlsZSxaLCIiKTtpZihKKWZvcihaIGluIEopWSYmSltaXT09WVtaXXx8UzQoWC5zdHlsZSxaLEpbWl0pfWVsc2UgaWYoWlswXT09Im8iJiZaWzFdPT0ibiIpUT1aIT0oWj1aLnJlcGxhY2UocDQsIiQxIikpLEs9Wi50b0xvd2VyQ2FzZSgpLFo9SyBpbiBYfHxaPT0ib25Gb2N1c091dCJ8fFo9PSJvbkZvY3VzSW4iP0suc2xpY2UoMik6Wi5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtaK1FdPUosSj9ZP0pbVDBdPVlbVDBdOihKW1QwXT1HNCxYLmFkZEV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilaPVoucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWiE9IndpZHRoIiYmWiE9ImhlaWdodCImJlohPSJocmVmIiYmWiE9Imxpc3QiJiZaIT0iZm9ybSImJlohPSJ0YWJJbmRleCImJlohPSJkb3dubG9hZCImJlohPSJyb3dTcGFuIiYmWiE9ImNvbFNwYW4iJiZaIT0icm9sZSImJlohPSJwb3BvdmVyIiYmWiBpbiBYKXRyeXtYW1pdPUo9PW51bGw/IiI6SjticmVhayBYfWNhdGNoKFcpe310eXBlb2YgSj09ImZ1bmN0aW9uInx8KEo9PW51bGx8fEo9PT0hMSYmWls0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFopOlguc2V0QXR0cmlidXRlKFosWj09InBvcG92ZXIiJiZKPT0xPyIiOkopKX19ZnVuY3Rpb24gUjQoWCl7cmV0dXJuIGZ1bmN0aW9uKFope2lmKHRoaXMubCl7dmFyIEo9dGhpcy5sW1oudHlwZStYXTtpZihaW20wXT09bnVsbClaW20wXT1HNCsrO2Vsc2UgaWYoWlttMF08SltUMF0pcmV0dXJuO3JldHVybiBKKEIuZXZlbnQ/Qi5ldmVudChaKTpaKX19fWZ1bmN0aW9uIEg0KFgsWixKLFkscSxRLEssVyxHLHope3ZhciBPLCQsXyxBLEMsVSxrLEksTSxoLEUsZSxaMCxnLEswLHM9Wi50eXBlO2lmKFouY29uc3RydWN0b3IhPT12b2lkIDApcmV0dXJuIG51bGw7MTI4JkouX191JiYoRz0hISgzMiZKLl9fdSksUT1bVz1aLl9fZT1KLl9fZV0pLChPPUIuX19iKSYmTyhaKTtYOmlmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXRyeXtpZihJPVoucHJvcHMsTT1zLnByb3RvdHlwZSYmcy5wcm90b3R5cGUucmVuZGVyLGg9KE89cy5jb250ZXh0VHlwZSkmJllbTy5fX2NdLEU9Tz9oP2gucHJvcHMudmFsdWU6Ty5fXzpZLEouX19jP2s9KCQ9Wi5fX2M9Si5fX2MpLl9fPSQuX19FOihNP1ouX19jPSQ9bmV3IHMoSSxFKTooWi5fX2M9JD1uZXcgaShJLEUpLCQuY29uc3RydWN0b3I9cywkLnJlbmRlcj1pNSksaCYmaC5zdWIoJCksJC5zdGF0ZXx8KCQuc3RhdGU9e30pLCQuX19uPVksXz0kLl9fZD0hMCwkLl9faD1bXSwkLl9zYj1bXSksTSYmJC5fX3M9PW51bGwmJigkLl9fcz0kLnN0YXRlKSxNJiZzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyE9bnVsbCYmKCQuX19zPT0kLnN0YXRlJiYoJC5fX3M9ejAoe30sJC5fX3MpKSx6MCgkLl9fcyxzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhJLCQuX19zKSkpLEE9JC5wcm9wcyxDPSQuc3RhdGUsJC5fX3Y9WixfKU0mJnMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiYkLmNvbXBvbmVudFdpbGxNb3VudCE9bnVsbCYmJC5jb21wb25lbnRXaWxsTW91bnQoKSxNJiYkLmNvbXBvbmVudERpZE1vdW50IT1udWxsJiYkLl9faC5wdXNoKCQuY29tcG9uZW50RGlkTW91bnQpO2Vsc2V7aWYoTSYmcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PW51bGwmJkkhPT1BJiYkLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPW51bGwmJiQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhJLEUpLFouX192PT1KLl9fdnx8ISQuX19lJiYkLnNob3VsZENvbXBvbmVudFVwZGF0ZSE9bnVsbCYmJC5zaG91bGRDb21wb25lbnRVcGRhdGUoSSwkLl9fcyxFKT09PSExKXtaLl9fdiE9Si5fX3YmJigkLnByb3BzPUksJC5zdGF0ZT0kLl9fcywkLl9fZD0hMSksWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssWi5fX2suc29tZShmdW5jdGlvbihyKXtyJiYoci5fXz1aKX0pLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdLCQuX19oLmxlbmd0aCYmSy5wdXNoKCQpO2JyZWFrIFh9JC5jb21wb25lbnRXaWxsVXBkYXRlIT1udWxsJiYkLmNvbXBvbmVudFdpbGxVcGRhdGUoSSwkLl9fcyxFKSxNJiYkLmNvbXBvbmVudERpZFVwZGF0ZSE9bnVsbCYmJC5fX2gucHVzaChmdW5jdGlvbigpeyQuY29tcG9uZW50RGlkVXBkYXRlKEEsQyxVKX0pfWlmKCQuY29udGV4dD1FLCQucHJvcHM9SSwkLl9fUD1YLCQuX19lPSExLGU9Qi5fX3IsWjA9MCxNKSQuc3RhdGU9JC5fX3MsJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdO2Vsc2UgZG8gJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLCQuc3RhdGU9JC5fX3M7d2hpbGUoJC5fX2QmJisrWjA8MjUpOyQuc3RhdGU9JC5fX3MsJC5nZXRDaGlsZENvbnRleHQhPW51bGwmJihZPXowKHowKHt9LFkpLCQuZ2V0Q2hpbGRDb250ZXh0KCkpKSxNJiYhXyYmJC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9bnVsbCYmKFU9JC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShBLEMpKSxnPU8hPW51bGwmJk8udHlwZT09PWYmJk8ua2V5PT1udWxsP2Q0KE8ucHJvcHMuY2hpbGRyZW4pOk8sVz1oNChYLGIwKGcpP2c6W2ddLFosSixZLHEsUSxLLFcsRyx6KSwkLmJhc2U9Wi5fX2UsWi5fX3UmPS0xNjEsJC5fX2gubGVuZ3RoJiZLLnB1c2goJCksayYmKCQuX19FPSQuX189bnVsbCl9Y2F0Y2gocil7aWYoWi5fX3Y9bnVsbCxHfHxRIT1udWxsKWlmKHIudGhlbil7Zm9yKFouX191fD1HPzE2MDoxMjg7VyYmVy5ub2RlVHlwZT09OCYmVy5uZXh0U2libGluZzspVz1XLm5leHRTaWJsaW5nO1FbUS5pbmRleE9mKFcpXT1udWxsLFouX19lPVd9ZWxzZXtmb3IoSzA9US5sZW5ndGg7SzAtLTspVjQoUVtLMF0pO040KFopfWVsc2UgWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssci50aGVufHxONChaKTtCLl9fZShyLFosSil9ZWxzZSBRPT1udWxsJiZaLl9fdj09Si5fX3Y/KFouX19rPUouX19rLFouX19lPUouX19lKTpXPVouX19lPWM1KEouX19lLFosSixZLHEsUSxLLEcseik7cmV0dXJuKE89Qi5kaWZmZWQpJiZPKFopLDEyOCZaLl9fdT92b2lkIDA6V31mdW5jdGlvbiBONChYKXtYJiYoWC5fX2MmJihYLl9fYy5fX2U9ITApLFguX19rJiZYLl9fay5zb21lKE40KSl9ZnVuY3Rpb24gZjQoWCxaLEope2Zvcih2YXIgWT0wO1k8Si5sZW5ndGg7WSsrKVA0KEpbWV0sSlsrK1ldLEpbKytZXSk7Qi5fX2MmJkIuX19jKFosWCksWC5zb21lKGZ1bmN0aW9uKHEpe3RyeXtYPXEuX19oLHEuX19oPVtdLFguc29tZShmdW5jdGlvbihRKXtRLmNhbGwocSl9KX1jYXRjaChRKXtCLl9fZShRLHEuX192KX19KX1mdW5jdGlvbiBkNChYKXtyZXR1cm4gdHlwZW9mIFghPSJvYmplY3QifHxYPT1udWxsfHxYLl9fYj4wP1g6YjAoWCk/WC5tYXAoZDQpOnowKHt9LFgpfWZ1bmN0aW9uIGM1KFgsWixKLFkscSxRLEssVyxHKXt2YXIgeixPLCQsXyxBLEMsVSxrPUoucHJvcHN8fGQwLEk9Wi5wcm9wcyxNPVoudHlwZTtpZihNPT0ic3ZnIj9xPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI6TT09Im1hdGgiP3E9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiOnF8fChxPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiksUSE9bnVsbCl7Zm9yKHo9MDt6PFEubGVuZ3RoO3orKylpZigoQT1RW3pdKSYmInNldEF0dHJpYnV0ZSJpbiBBPT0hIU0mJihNP0EubG9jYWxOYW1lPT1NOkEubm9kZVR5cGU9PTMpKXtYPUEsUVt6XT1udWxsO2JyZWFrfX1pZihYPT1udWxsKXtpZihNPT1udWxsKXJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShJKTtYPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhxLE0sSS5pcyYmSSksVyYmKEIuX19tJiZCLl9fbShaLFEpLFc9ITEpLFE9bnVsbH1pZihNPT1udWxsKWs9PT1JfHxXJiZYLmRhdGE9PUl8fChYLmRhdGE9SSk7ZWxzZXtpZihRPVEmJmMwLmNhbGwoWC5jaGlsZE5vZGVzKSwhVyYmUSE9bnVsbClmb3Ioaz17fSx6PTA7ejxYLmF0dHJpYnV0ZXMubGVuZ3RoO3orKylrWyhBPVguYXR0cmlidXRlc1t6XSkubmFtZV09QS52YWx1ZTtmb3IoeiBpbiBrKUE9a1t6XSx6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyQ9QTp6PT0iY2hpbGRyZW4ifHwoeiBpbiBJKXx8ej09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSSl8fHo9PSJjaGVja2VkIiYmKCJkZWZhdWx0Q2hlY2tlZCJpbiBJKXx8aDAoWCx6LG51bGwsQSxxKTtmb3IoeiBpbiBJKUE9SVt6XSx6PT0iY2hpbGRyZW4iP189QTp6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP089QTp6PT0idmFsdWUiP0M9QTp6PT0iY2hlY2tlZCI/VT1BOlcmJnR5cGVvZiBBIT0iZnVuY3Rpb24ifHxrW3pdPT09QXx8aDAoWCx6LEEsa1t6XSxxKTtpZihPKVd8fCQmJihPLl9faHRtbD09JC5fX2h0bWx8fE8uX19odG1sPT1YLmlubmVySFRNTCl8fChYLmlubmVySFRNTD1PLl9faHRtbCksWi5fX2s9W107ZWxzZSBpZigkJiYoWC5pbm5lckhUTUw9IiIpLGg0KFoudHlwZT09InRlbXBsYXRlIj9YLmNvbnRlbnQ6WCxiMChfKT9fOltfXSxaLEosWSxNPT0iZm9yZWlnbk9iamVjdCI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOnEsUSxLLFE/UVswXTpKLl9fayYmQjAoSiwwKSxXLEcpLFEhPW51bGwpZm9yKHo9US5sZW5ndGg7ei0tOylWNChRW3pdKTtXfHwoej0idmFsdWUiLE09PSJwcm9ncmVzcyImJkM9PW51bGw/WC5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik6QyE9bnVsbCYmKEMhPT1YW3pdfHxNPT0icHJvZ3Jlc3MiJiYhQ3x8TT09Im9wdGlvbiImJkMhPWtbel0pJiZoMChYLHosQyxrW3pdLHEpLHo9ImNoZWNrZWQiLFUhPW51bGwmJlUhPVhbel0mJmgwKFgseixVLGtbel0scSkpfXJldHVybiBYfWZ1bmN0aW9uIFA0KFgsWixKKXt0cnl7aWYodHlwZW9mIFg9PSJmdW5jdGlvbiIpe3ZhciBZPXR5cGVvZiBYLl9fdT09ImZ1bmN0aW9uIjtZJiZYLl9fdSgpLFkmJlo9PW51bGx8fChYLl9fdT1YKFopKX1lbHNlIFguY3VycmVudD1afWNhdGNoKHEpe0IuX19lKHEsSil9fWZ1bmN0aW9uIGE0KFgsWixKKXt2YXIgWSxxO2lmKEIudW5tb3VudCYmQi51bm1vdW50KFgpLChZPVgucmVmKSYmKFkuY3VycmVudCYmWS5jdXJyZW50IT1YLl9fZXx8UDQoWSxudWxsLFopKSwoWT1YLl9fYykhPW51bGwpe2lmKFkuY29tcG9uZW50V2lsbFVubW91bnQpdHJ5e1kuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChRKXtCLl9fZShRLFopfVkuYmFzZT1ZLl9fUD1udWxsfWlmKFk9WC5fX2spZm9yKHE9MDtxPFkubGVuZ3RoO3ErKylZW3FdJiZhNChZW3FdLFosSnx8dHlwZW9mIFgudHlwZSE9ImZ1bmN0aW9uIik7Snx8VjQoWC5fX2UpLFguX19jPVguX189WC5fX2U9dm9pZCAwfWZ1bmN0aW9uIGk1KFgsWixKKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcihYLEopfWZ1bmN0aW9uIGkwKFgsWixKKXt2YXIgWSxxLFEsSztaPT1kb2N1bWVudCYmKFo9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSxCLl9fJiZCLl9fKFgsWikscT0oWT10eXBlb2YgSj09ImZ1bmN0aW9uIik/bnVsbDpKJiZKLl9fa3x8Wi5fX2ssUT1bXSxLPVtdLEg0KFosWD0oIVkmJkp8fFopLl9faz1XMChmLG51bGwsW1hdKSxxfHxkMCxkMCxaLm5hbWVzcGFjZVVSSSwhWSYmSj9bSl06cT9udWxsOlouZmlyc3RDaGlsZD9jMC5jYWxsKFouY2hpbGROb2Rlcyk6bnVsbCxRLCFZJiZKP0o6cT9xLl9fZTpaLmZpcnN0Q2hpbGQsWSxLKSxmNChRLFgsSyl9ZnVuY3Rpb24gXzAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWSxxO3JldHVybiB0aGlzLmdldENoaWxkQ29udGV4dHx8KFk9bmV3IFNldCwocT17fSlbWi5fX2NdPXRoaXMsdGhpcy5nZXRDaGlsZENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcX0sdGhpcy5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1k9bnVsbH0sdGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oUSl7dGhpcy5wcm9wcy52YWx1ZSE9US52YWx1ZSYmWS5mb3JFYWNoKGZ1bmN0aW9uKEspe0suX19lPSEwLEw0KEspfSl9LHRoaXMuc3ViPWZ1bmN0aW9uKFEpe1kuYWRkKFEpO3ZhciBLPVEuY29tcG9uZW50V2lsbFVubW91bnQ7US5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1kmJlkuZGVsZXRlKFEpLEsmJksuY2FsbChRKX19KSxKLmNoaWxkcmVufXJldHVybiBaLl9fYz0iX19jQyIrZzQrKyxaLl9fPVgsWi5Qcm92aWRlcj1aLl9fbD0oWi5Db25zdW1lcj1mdW5jdGlvbihKLFkpe3JldHVybiBKLmNoaWxkcmVuKFkpfSkuY29udGV4dFR5cGU9WixafWMwPWEwLnNsaWNlLEI9e19fZTpmdW5jdGlvbihYLFosSixZKXtmb3IodmFyIHEsUSxLO1o9Wi5fXzspaWYoKHE9Wi5fX2MpJiYhcS5fXyl0cnl7aWYoKFE9cS5jb25zdHJ1Y3RvcikmJlEuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT1udWxsJiYocS5zZXRTdGF0ZShRLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihYKSksSz1xLl9fZCkscS5jb21wb25lbnREaWRDYXRjaCE9bnVsbCYmKHEuY29tcG9uZW50RGlkQ2F0Y2goWCxZfHx7fSksSz1xLl9fZCksSylyZXR1cm4gcS5fX0U9cX1jYXRjaChXKXtYPVd9dGhyb3cgWH19LGo0PTAsbTU9ZnVuY3Rpb24oWCl7cmV0dXJuIFghPW51bGwmJlguY29uc3RydWN0b3I9PT12b2lkIDB9LGkucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKFgsWil7dmFyIEo7Sj10aGlzLl9fcyE9bnVsbCYmdGhpcy5fX3MhPXRoaXMuc3RhdGU/dGhpcy5fX3M6dGhpcy5fX3M9ejAoe30sdGhpcy5zdGF0ZSksdHlwZW9mIFg9PSJmdW5jdGlvbiImJihYPVgoejAoe30sSiksdGhpcy5wcm9wcykpLFgmJnowKEosWCksWCE9bnVsbCYmdGhpcy5fX3YmJihaJiZ0aGlzLl9zYi5wdXNoKFopLEw0KHRoaXMpKX0saS5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oWCl7dGhpcy5fX3YmJih0aGlzLl9fZT0hMCxYJiZ0aGlzLl9faC5wdXNoKFgpLEw0KHRoaXMpKX0saS5wcm90b3R5cGUucmVuZGVyPWYsUDA9W10sdjQ9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTpzZXRUaW1lb3V0LHk0PWZ1bmN0aW9uKFgsWil7cmV0dXJuIFguX192Ll9fYi1aLl9fdi5fX2J9LGwwLl9fcj0wLCQ0PU1hdGgucmFuZG9tKCkudG9TdHJpbmcoOCksbTA9Il9fZCIrJDQsVDA9Il9fYSIrJDQscDQ9LyhQb2ludGVyQ2FwdHVyZSkkfENhcHR1cmUkL2ksRzQ9MCx6ND1SNCghMSksVzQ9UjQoITApLGc0PTA7dmFyIEYwLHAsTzQsbDQsUzA9MCxuND1bXSxkPUIsYzQ9ZC5fX2IsaTQ9ZC5fX3IsdTQ9ZC5kaWZmZWQsbzQ9ZC5fX2MsczQ9ZC51bm1vdW50LHI0PWQuX187ZnVuY3Rpb24gbzAoWCxaKXtkLl9faCYmZC5fX2gocCxYLFMwfHxaKSxTMD0wO3ZhciBKPXAuX19IfHwocC5fX0g9e19fOltdLF9faDpbXX0pO3JldHVybiBYPj1KLl9fLmxlbmd0aCYmSi5fXy5wdXNoKHt9KSxKLl9fW1hdfWZ1bmN0aW9uIFMoWCl7cmV0dXJuIFMwPTEsQTQoWDUsWCl9ZnVuY3Rpb24gQTQoWCxaLEope3ZhciBZPW8wKEYwKyssMik7aWYoWS50PVgsIVkuX19jJiYoWS5fXz1bSj9KKFopOlg1KHZvaWQgMCxaKSxmdW5jdGlvbihXKXt2YXIgRz1ZLl9fTj9ZLl9fTlswXTpZLl9fWzBdLHo9WS50KEcsVyk7RyE9PXomJihZLl9fTj1beixZLl9fWzFdXSxZLl9fYy5zZXRTdGF0ZSh7fSkpfV0sWS5fX2M9cCwhcC5fX2YpKXt2YXIgcT1mdW5jdGlvbihXLEcseil7aWYoIVkuX19jLl9fSClyZXR1cm4hMDt2YXIgTz1ZLl9fYy5fX0guX18uZmlsdGVyKGZ1bmN0aW9uKF8pe3JldHVybiBfLl9fY30pO2lmKE8uZXZlcnkoZnVuY3Rpb24oXyl7cmV0dXJuIV8uX19OfSkpcmV0dXJuIVF8fFEuY2FsbCh0aGlzLFcsRyx6KTt2YXIgJD1ZLl9fYy5wcm9wcyE9PVc7cmV0dXJuIE8uc29tZShmdW5jdGlvbihfKXtpZihfLl9fTil7dmFyIEE9Xy5fX1swXTtfLl9fPV8uX19OLF8uX19OPXZvaWQgMCxBIT09Xy5fX1swXSYmKCQ9ITApfX0pLFEmJlEuY2FsbCh0aGlzLFcsRyx6KXx8JH07cC5fX2Y9ITA7dmFye3Nob3VsZENvbXBvbmVudFVwZGF0ZTpRLGNvbXBvbmVudFdpbGxVcGRhdGU6S309cDtwLmNvbXBvbmVudFdpbGxVcGRhdGU9ZnVuY3Rpb24oVyxHLHope2lmKHRoaXMuX19lKXt2YXIgTz1RO1E9dm9pZCAwLHEoVyxHLHopLFE9T31LJiZLLmNhbGwodGhpcyxXLEcseil9LHAuc2hvdWxkQ29tcG9uZW50VXBkYXRlPXF9cmV0dXJuIFkuX19OfHxZLl9ffWZ1bmN0aW9uIHgoWCxaKXt2YXIgSj1vMChGMCsrLDMpOyFkLl9fcyYmZTQoSi5fX0gsWikmJihKLl9fPVgsSi51PVoscC5fX0guX19oLnB1c2goSikpfWZ1bmN0aW9uIHcoWCl7cmV0dXJuIFMwPTUsczAoZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpYfX0sW10pfWZ1bmN0aW9uIHMwKFgsWil7dmFyIEo9bzAoRjArKyw3KTtyZXR1cm4gZTQoSi5fX0gsWikmJihKLl9fPVgoKSxKLl9fSD1aLEouX19oPVgpLEouX199ZnVuY3Rpb24gaihYLFope3JldHVybiBTMD04LHMwKGZ1bmN0aW9uKCl7cmV0dXJuIFh9LFopfWZ1bmN0aW9uIFIwKFgpe3ZhciBaPXAuY29udGV4dFtYLl9fY10sSj1vMChGMCsrLDkpO3JldHVybiBKLmM9WCxaPyhKLl9fPT1udWxsJiYoSi5fXz0hMCxaLnN1YihwKSksWi5wcm9wcy52YWx1ZSk6WC5fX31mdW5jdGlvbiB1NSgpe2Zvcih2YXIgWDtYPW40LnNoaWZ0KCk7KXt2YXIgWj1YLl9fSDtpZihYLl9fUCYmWil0cnl7Wi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W119Y2F0Y2goSil7Wi5fX2g9W10sZC5fX2UoSixYLl9fdil9fX1kLl9fYj1mdW5jdGlvbihYKXtwPW51bGwsYzQmJmM0KFgpfSxkLl9fPWZ1bmN0aW9uKFgsWil7WCYmWi5fX2smJlouX19rLl9fbSYmKFguX19tPVouX19rLl9fbSkscjQmJnI0KFgsWil9LGQuX19yPWZ1bmN0aW9uKFgpe2k0JiZpNChYKSxGMD0wO3ZhciBaPShwPVguX19jKS5fX0g7WiYmKE80PT09cD8oWi5fX2g9W10scC5fX2g9W10sWi5fXy5zb21lKGZ1bmN0aW9uKEope0ouX19OJiYoSi5fXz1KLl9fTiksSi51PUouX19OPXZvaWQgMH0pKTooWi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W10sRjA9MCkpLE80PXB9LGQuZGlmZmVkPWZ1bmN0aW9uKFgpe3U0JiZ1NChYKTt2YXIgWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9faC5sZW5ndGgmJihuNC5wdXNoKFopIT09MSYmbDQ9PT1kLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KChsND1kLnJlcXVlc3RBbmltYXRpb25GcmFtZSl8fG81KSh1NSkpLFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7Si51JiYoSi5fX0g9Si51KSxKLnU9dm9pZCAwfSkpLE80PXA9bnVsbH0sZC5fX2M9ZnVuY3Rpb24oWCxaKXtaLnNvbWUoZnVuY3Rpb24oSil7dHJ5e0ouX19oLnNvbWUodTApLEouX19oPUouX19oLmZpbHRlcihmdW5jdGlvbihZKXtyZXR1cm4hWS5fX3x8VTQoWSl9KX1jYXRjaChZKXtaLnNvbWUoZnVuY3Rpb24ocSl7cS5fX2gmJihxLl9faD1bXSl9KSxaPVtdLGQuX19lKFksSi5fX3YpfX0pLG80JiZvNChYLFopfSxkLnVubW91bnQ9ZnVuY3Rpb24oWCl7czQmJnM0KFgpO3ZhciBaLEo9WC5fX2M7SiYmSi5fX0gmJihKLl9fSC5fXy5zb21lKGZ1bmN0aW9uKFkpe3RyeXt1MChZKX1jYXRjaChxKXtaPXF9fSksSi5fX0g9dm9pZCAwLFomJmQuX19lKFosSi5fX3YpKX07dmFyIHQ0PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiI7ZnVuY3Rpb24gbzUoWCl7dmFyIFosSj1mdW5jdGlvbigpe2NsZWFyVGltZW91dChZKSx0NCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoWiksc2V0VGltZW91dChYKX0sWT1zZXRUaW1lb3V0KEosMzUpO3Q0JiYoWj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoSikpfWZ1bmN0aW9uIHUwKFgpe3ZhciBaPXAsSj1YLl9fYzt0eXBlb2YgSj09ImZ1bmN0aW9uIiYmKFguX19jPXZvaWQgMCxKKCkpLHA9Wn1mdW5jdGlvbiBVNChYKXt2YXIgWj1wO1guX19jPVguX18oKSxwPVp9ZnVuY3Rpb24gZTQoWCxaKXtyZXR1cm4hWHx8WC5sZW5ndGghPT1aLmxlbmd0aHx8Wi5zb21lKGZ1bmN0aW9uKEosWSl7cmV0dXJuIEohPT1YW1ldfSl9ZnVuY3Rpb24gWDUoWCxaKXtyZXR1cm4gdHlwZW9mIFo9PSJmdW5jdGlvbiI/WihYKTpafWZ1bmN0aW9uIFo2KFgsWil7Zm9yKHZhciBKIGluIFopWFtKXT1aW0pdO3JldHVybiBYfWZ1bmN0aW9uIFo1KFgsWil7Zm9yKHZhciBKIGluIFgpaWYoSiE9PSJfX3NvdXJjZSImJiEoSiBpbiBaKSlyZXR1cm4hMDtmb3IodmFyIFkgaW4gWilpZihZIT09Il9fc291cmNlIiYmWFtZXSE9PVpbWV0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gSjUoWCxaKXt0aGlzLnByb3BzPVgsdGhpcy5jb250ZXh0PVp9KEo1LnByb3RvdHlwZT1uZXcgaSkuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITAsSjUucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihYLFope3JldHVybiBaNSh0aGlzLnByb3BzLFgpfHxaNSh0aGlzLnN0YXRlLFopfTt2YXIgWTU9Qi5fX2I7Qi5fX2I9ZnVuY3Rpb24oWCl7WC50eXBlJiZYLnR5cGUuX19mJiZYLnJlZiYmKFgucHJvcHMucmVmPVgucmVmLFgucmVmPW51bGwpLFk1JiZZNShYKX07dmFyIEo2PUIuX19lO0IuX19lPWZ1bmN0aW9uKFgsWixKLFkpe2lmKFgudGhlbil7Zm9yKHZhciBxLFE9WjtRPVEuX187KWlmKChxPVEuX19jKSYmcS5fX2MpcmV0dXJuIFouX19lPT1udWxsJiYoWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2spLHEuX19jKFgsWil9SjYoWCxaLEosWSl9O3ZhciBxNT1CLnVubW91bnQ7ZnVuY3Rpb24gTDUoWCxaLEope3JldHVybiBYJiYoWC5fX2MmJlguX19jLl9fSCYmKFguX19jLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKFkpe3R5cGVvZiBZLl9fYz09ImZ1bmN0aW9uIiYmWS5fX2MoKX0pLFguX19jLl9fSD1udWxsKSwoWD1aNih7fSxYKSkuX19jIT1udWxsJiYoWC5fX2MuX19QPT09SiYmKFguX19jLl9fUD1aKSxYLl9fYy5fX2U9ITAsWC5fX2M9bnVsbCksWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihZKXtyZXR1cm4gTDUoWSxaLEopfSkpLFh9ZnVuY3Rpb24gTjUoWCxaLEope3JldHVybiBYJiZKJiYoWC5fX3Y9bnVsbCxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBONShZLFosSil9KSxYLl9fYyYmWC5fX2MuX19QPT09WiYmKFguX19lJiZKLmFwcGVuZENoaWxkKFguX19lKSxYLl9fYy5fX2U9ITAsWC5fX2MuX19QPUopKSxYfWZ1bmN0aW9uIEI0KCl7dGhpcy5fX3U9MCx0aGlzLm89bnVsbCx0aGlzLl9fYj1udWxsfWZ1bmN0aW9uIEc1KFgpe3ZhciBaPVguX18mJlguX18uX19jO3JldHVybiBaJiZaLl9fYSYmWi5fX2EoWCl9ZnVuY3Rpb24gcjAoKXt0aGlzLmk9bnVsbCx0aGlzLmw9bnVsbH1CLnVubW91bnQ9ZnVuY3Rpb24oWCl7dmFyIFo9WC5fX2M7WiYmKFouX196PSEwKSxaJiZaLl9fUiYmWi5fX1IoKSxaJiYzMiZYLl9fdSYmKFgudHlwZT1udWxsKSxxNSYmcTUoWCl9LChCNC5wcm90b3R5cGU9bmV3IGkpLl9fYz1mdW5jdGlvbihYLFope3ZhciBKPVouX19jLFk9dGhpcztZLm89PW51bGwmJihZLm89W10pLFkuby5wdXNoKEopO3ZhciBxPUc1KFkuX192KSxRPSExLEs9ZnVuY3Rpb24oKXtRfHxZLl9fenx8KFE9ITAsSi5fX1I9bnVsbCxxP3EoRyk6RygpKX07Si5fX1I9Szt2YXIgVz1KLl9fUDtKLl9fUD1udWxsO3ZhciBHPWZ1bmN0aW9uKCl7aWYoIS0tWS5fX3Upe2lmKFkuc3RhdGUuX19hKXt2YXIgej1ZLnN0YXRlLl9fYTtZLl9fdi5fX2tbMF09TjUoeix6Ll9fYy5fX1Asei5fX2MuX19PKX12YXIgTztmb3IoWS5zZXRTdGF0ZSh7X19hOlkuX19iPW51bGx9KTtPPVkuby5wb3AoKTspTy5fX1A9VyxPLmZvcmNlVXBkYXRlKCl9fTtZLl9fdSsrfHwzMiZaLl9fdXx8WS5zZXRTdGF0ZSh7X19hOlkuX19iPVkuX192Ll9fa1swXX0pLFgudGhlbihLLEspfSxCNC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLm89W119LEI0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCxaKXtpZih0aGlzLl9fYil7aWYodGhpcy5fX3YuX19rKXt2YXIgSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxZPXRoaXMuX192Ll9fa1swXS5fX2M7dGhpcy5fX3YuX19rWzBdPUw1KHRoaXMuX19iLEosWS5fX089WS5fX1ApfXRoaXMuX19iPW51bGx9dmFyIHE9Wi5fX2EmJlcwKGYsbnVsbCxYLmZhbGxiYWNrKTtyZXR1cm4gcSYmKHEuX191Jj0tMzMpLFtXMChmLG51bGwsWi5fX2E/bnVsbDpYLmNoaWxkcmVuKSxxXX07dmFyIFE1PWZ1bmN0aW9uKFgsWixKKXtpZigrK0pbMV09PT1KWzBdJiZYLmwuZGVsZXRlKFopLFgucHJvcHMucmV2ZWFsT3JkZXImJihYLnByb3BzLnJldmVhbE9yZGVyWzBdIT09InQifHwhWC5sLnNpemUpKWZvcihKPVguaTtKOyl7Zm9yKDtKLmxlbmd0aD4zOylKLnBvcCgpKCk7aWYoSlsxXTxKWzBdKWJyZWFrO1guaT1KPUpbMl19fTsocjAucHJvdG90eXBlPW5ldyBpKS5fX2E9ZnVuY3Rpb24oWCl7dmFyIFo9dGhpcyxKPUc1KFouX192KSxZPVoubC5nZXQoWCk7cmV0dXJuIFlbMF0rKyxmdW5jdGlvbihxKXt2YXIgUT1mdW5jdGlvbigpe1oucHJvcHMucmV2ZWFsT3JkZXI/KFkucHVzaChxKSxRNShaLFgsWSkpOnEoKX07Sj9KKFEpOlEoKX19LHIwLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCl7dGhpcy5pPW51bGwsdGhpcy5sPW5ldyBNYXA7dmFyIFo9TDAoWC5jaGlsZHJlbik7WC5yZXZlYWxPcmRlciYmWC5yZXZlYWxPcmRlclswXT09PSJiIiYmWi5yZXZlcnNlKCk7Zm9yKHZhciBKPVoubGVuZ3RoO0otLTspdGhpcy5sLnNldChaW0pdLHRoaXMuaT1bMSwwLHRoaXMuaV0pO3JldHVybiBYLmNoaWxkcmVufSxyMC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPXIwLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBYPXRoaXM7dGhpcy5sLmZvckVhY2goZnVuY3Rpb24oWixKKXtRNShYLEosWil9KX07dmFyIFk2PXR5cGVvZiBTeW1ib2w8InUiJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzLHE2PS9eKD86YWNjZW50fGFsaWdubWVudHxhcmFiaWN8YmFzZWxpbmV8Y2FwfGNsaXAoPyFQYXRoVSl8Y29sb3J8ZG9taW5hbnR8ZmlsbHxmbG9vZHxmb250fGdseXBoKD8hUil8aG9yaXp8aW1hZ2UoIVMpfGxldHRlcnxsaWdodGluZ3xtYXJrZXIoPyFIfFd8VSl8b3ZlcmxpbmV8cGFpbnR8cG9pbnRlcnxzaGFwZXxzdG9wfHN0cmlrZXRocm91Z2h8c3Ryb2tlfHRleHQoPyFMKXx0cmFuc2Zvcm18dW5kZXJsaW5lfHVuaWNvZGV8dW5pdHN8dnx2ZWN0b3J8dmVydHx3b3JkfHdyaXRpbmd8eCg/IUMpKVtBLVpdLyxRNj0vXm9uKEFuaXxUcmF8VG91fEJlZm9yZUlucHxDb21wbykvLEs2PS9bQS1aMC05XS9nLCQ2PXR5cGVvZiBkb2N1bWVudDwidSIsejY9ZnVuY3Rpb24oWCl7cmV0dXJuKHR5cGVvZiBTeW1ib2w8InUiJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiPy9maWx8Y2hlfHJhZC86L2ZpbHxjaGV8cmEvKS50ZXN0KFgpfTtmdW5jdGlvbiBWNShYLFosSil7cmV0dXJuIFouX19rPT1udWxsJiYoWi50ZXh0Q29udGVudD0iIiksaTAoWCxaKSx0eXBlb2YgSj09ImZ1bmN0aW9uIiYmSigpLFg/WC5fX2M6bnVsbH1pLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PSEwLFsiY29tcG9uZW50V2lsbE1vdW50IiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsImNvbXBvbmVudFdpbGxVcGRhdGUiXS5mb3JFYWNoKGZ1bmN0aW9uKFgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnByb3RvdHlwZSxYLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbIlVOU0FGRV8iK1hdfSxzZXQ6ZnVuY3Rpb24oWil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsWCx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlp9KX19KX0pO3ZhciBLNT1CLmV2ZW50O0IuZXZlbnQ9ZnVuY3Rpb24oWCl7cmV0dXJuIEs1JiYoWD1LNShYKSksWC5wZXJzaXN0PWZ1bmN0aW9uKCl7fSxYLmlzUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuY2VsQnViYmxlfSxYLmlzRGVmYXVsdFByZXZlbnRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlZmF1bHRQcmV2ZW50ZWR9LFgubmF0aXZlRXZlbnQ9WH07dmFyIEg1LFc2PXtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xhc3N9fSwkNT1CLnZub2RlO0Iudm5vZGU9ZnVuY3Rpb24oWCl7dHlwZW9mIFgudHlwZT09InN0cmluZyImJmZ1bmN0aW9uKFope3Zhcntwcm9wczpKLHR5cGU6WX09WixxPXt9LFE9WS5pbmRleE9mKCItIik9PS0xO2Zvcih2YXIgSyBpbiBKKXt2YXIgVz1KW0tdO2lmKCEoSz09PSJ2YWx1ZSImJigiZGVmYXVsdFZhbHVlImluIEopJiZXPT1udWxsfHwkNiYmSz09PSJjaGlsZHJlbiImJlk9PT0ibm9zY3JpcHQifHxLPT09ImNsYXNzInx8Sz09PSJjbGFzc05hbWUiKSl7dmFyIEc9Sy50b0xvd2VyQ2FzZSgpO0s9PT0iZGVmYXVsdFZhbHVlIiYmInZhbHVlImluIEomJkoudmFsdWU9PW51bGw/Sz0idmFsdWUiOks9PT0iZG93bmxvYWQiJiZXPT09ITA/Vz0iIjpHPT09InRyYW5zbGF0ZSImJlc9PT0ibm8iP1c9ITE6R1swXT09PSJvIiYmR1sxXT09PSJuIj9HPT09Im9uZG91YmxlY2xpY2siP0s9Im9uZGJsY2xpY2siOkchPT0ib25jaGFuZ2UifHxZIT09ImlucHV0IiYmWSE9PSJ0ZXh0YXJlYSJ8fHo2KEoudHlwZSk/Rz09PSJvbmZvY3VzIj9LPSJvbmZvY3VzaW4iOkc9PT0ib25ibHVyIj9LPSJvbmZvY3Vzb3V0IjpRNi50ZXN0KEspJiYoSz1HKTpHPUs9Im9uaW5wdXQiOlEmJnE2LnRlc3QoSyk/Sz1LLnJlcGxhY2UoSzYsIi0kJiIpLnRvTG93ZXJDYXNlKCk6Vz09PW51bGwmJihXPXZvaWQgMCksRz09PSJvbmlucHV0IiYmcVtLPUddJiYoSz0ib25pbnB1dENhcHR1cmUiKSxxW0tdPVd9fVk9PSJzZWxlY3QiJiYocS5tdWx0aXBsZSYmQXJyYXkuaXNBcnJheShxLnZhbHVlKSYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEudmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTF9KSkscS5kZWZhdWx0VmFsdWUhPW51bGwmJihxLnZhbHVlPUwwKEouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oeil7ei5wcm9wcy5zZWxlY3RlZD1xLm11bHRpcGxlP3EuZGVmYXVsdFZhbHVlLmluZGV4T2Yoei5wcm9wcy52YWx1ZSkhPS0xOnEuZGVmYXVsdFZhbHVlPT16LnByb3BzLnZhbHVlfSkpKSxKLmNsYXNzJiYhSi5jbGFzc05hbWU/KHEuY2xhc3M9Si5jbGFzcyxPYmplY3QuZGVmaW5lUHJvcGVydHkocSwiY2xhc3NOYW1lIixXNikpOkouY2xhc3NOYW1lJiYocS5jbGFzcz1xLmNsYXNzTmFtZT1KLmNsYXNzTmFtZSksWi5wcm9wcz1xfShYKSxYLiQkdHlwZW9mPVk2LCQ1JiYkNShYKX07dmFyIHo1PUIuX19yO0IuX19yPWZ1bmN0aW9uKFgpe3o1JiZ6NShYKSxINT1YLl9fY307dmFyIFc1PUIuZGlmZmVkO0IuZGlmZmVkPWZ1bmN0aW9uKFgpe1c1JiZXNShYKTt2YXJ7cHJvcHM6WixfX2U6Sn09WDtKIT1udWxsJiZYLnR5cGU9PT0idGV4dGFyZWEiJiYidmFsdWUiaW4gWiYmWi52YWx1ZSE9PUoudmFsdWUmJihKLnZhbHVlPVoudmFsdWU9PW51bGw/IiI6Wi52YWx1ZSksSDU9bnVsbH07ZnVuY3Rpb24gUDUoWCl7cmV0dXJuISFYLl9fayYmKGkwKG51bGwsWCksITApfWZ1bmN0aW9uIE81KFgpe3JldHVybntyZW5kZXI6ZnVuY3Rpb24oWil7VjUoWixYKX0sdW5tb3VudDpmdW5jdGlvbigpe1A1KFgpfX19ZnVuY3Rpb24gQzUoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVTUoWCxaKXtmb3IodmFyIEogaW4gWClpZihKIT09Il9fc291cmNlIiYmIShKIGluIFopKXJldHVybiEwO2Zvcih2YXIgWSBpbiBaKWlmKFkhPT0iX19zb3VyY2UiJiZYW1ldIT09WltZXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBBNShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn0oQTUucHJvdG90eXBlPW5ldyBpKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxBNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWil7cmV0dXJuIFU1KHRoaXMucHJvcHMsWCl8fFU1KHRoaXMuc3RhdGUsWil9O3ZhciBCNT1CLl9fYjtCLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksQjUmJkI1KFgpfTt2YXIgTDY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIil8fDM5MTE7ZnVuY3Rpb24gRDAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWT1DNSh7fSxKKTtyZXR1cm4gZGVsZXRlIFkucmVmLFgoWSxKLnJlZnx8bnVsbCl9cmV0dXJuIFouJCR0eXBlb2Y9TDYsWi5yZW5kZXI9WCxaLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PVouX19mPSEwLFouZGlzcGxheU5hbWU9IkZvcndhcmRSZWYoIisoWC5kaXNwbGF5TmFtZXx8WC5uYW1lKSsiKSIsWn12YXIgTjY9Qi5fX2U7Qi5fX2U9ZnVuY3Rpb24oWCxaLEosWSl7aWYoWC50aGVuKXtmb3IodmFyIHEsUT1aO1E9US5fXzspaWYoKHE9US5fX2MpJiZxLl9fYylyZXR1cm4gWi5fX2U9PW51bGwmJihaLl9fZT1KLl9fZSxaLl9faz1KLl9faykscS5fX2MoWCxaKX1ONihYLFosSixZKX07dmFyIF81PUIudW5tb3VudDtmdW5jdGlvbiBFNShYLFosSil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oWSl7dHlwZW9mIFkuX19jPT0iZnVuY3Rpb24iJiZZLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPUM1KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1KJiYoWC5fX2MuX19QPVopLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBFNShZLFosSil9KSksWH1mdW5jdGlvbiB3NShYLFosSil7cmV0dXJuIFgmJkomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oWSl7cmV0dXJuIHc1KFksWixKKX0pLFguX19jJiZYLl9fYy5fX1A9PT1aJiYoWC5fX2UmJkouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9SikpLFh9ZnVuY3Rpb24gRjQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gVDUoWCl7dmFyIFo9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFomJlouX19hJiZaLl9fYShYKX1mdW5jdGlvbiB0MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfUIudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWj1YLl9fYztaJiYoWi5fX3o9ITApLFomJlouX19SJiZaLl9fUigpLFomJjMyJlguX191JiYoWC50eXBlPW51bGwpLF81JiZfNShYKX0sKEY0LnByb3RvdHlwZT1uZXcgaSkuX19jPWZ1bmN0aW9uKFgsWil7dmFyIEo9Wi5fX2MsWT10aGlzO1kubz09bnVsbCYmKFkubz1bXSksWS5vLnB1c2goSik7dmFyIHE9VDUoWS5fX3YpLFE9ITEsSz1mdW5jdGlvbigpe1F8fFkuX196fHwoUT0hMCxKLl9fUj1udWxsLHE/cShHKTpHKCkpfTtKLl9fUj1LO3ZhciBXPUouX19QO0ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1ZLl9fdSl7aWYoWS5zdGF0ZS5fX2Epe3ZhciB6PVkuc3RhdGUuX19hO1kuX192Ll9fa1swXT13NSh6LHouX19jLl9fUCx6Ll9fYy5fX08pfXZhciBPO2ZvcihZLnNldFN0YXRlKHtfX2E6WS5fX2I9bnVsbH0pO089WS5vLnBvcCgpOylPLl9fUD1XLE8uZm9yY2VVcGRhdGUoKX19O1kuX191Kyt8fDMyJlouX191fHxZLnNldFN0YXRlKHtfX2E6WS5fX2I9WS5fX3YuX19rWzBdfSksWC50aGVuKEssSyl9LEY0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sRjQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFope2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBKPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFk9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09RTUodGhpcy5fX2IsSixZLl9fTz1ZLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1aLl9fYSYmVzAoZixudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1cwKGYsbnVsbCxaLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgRjU9ZnVuY3Rpb24oWCxaLEope2lmKCsrSlsxXT09PUpbMF0mJlgubC5kZWxldGUoWiksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKEo9WC5pO0o7KXtmb3IoO0oubGVuZ3RoPjM7KUoucG9wKCkoKTtpZihKWzFdPEpbMF0pYnJlYWs7WC5pPUo9SlsyXX19Oyh0MC5wcm90b3R5cGU9bmV3IGkpLl9fYT1mdW5jdGlvbihYKXt2YXIgWj10aGlzLEo9VDUoWi5fX3YpLFk9Wi5sLmdldChYKTtyZXR1cm4gWVswXSsrLGZ1bmN0aW9uKHEpe3ZhciBRPWZ1bmN0aW9uKCl7Wi5wcm9wcy5yZXZlYWxPcmRlcj8oWS5wdXNoKHEpLEY1KFosWCxZKSk6cSgpfTtKP0ooUSk6USgpfX0sdDAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWj1MMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZaLnJldmVyc2UoKTtmb3IodmFyIEo9Wi5sZW5ndGg7Si0tOyl0aGlzLmwuc2V0KFpbSl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHQwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9dDAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihaLEope0Y1KFgsSixaKX0pfTt2YXIgRzY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsVjY9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLEg2PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sUDY9L1tBLVowLTldL2csTzY9dHlwZW9mIGRvY3VtZW50PCJ1IixVNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2kucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihaKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Wn0pfX0pfSk7dmFyIEQ1PUIuZXZlbnQ7Qi5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gRDUmJihYPUQ1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgYjUsQTY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LGs1PUIudm5vZGU7Qi52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWil7dmFye3Byb3BzOkosdHlwZTpZfT1aLHE9e30sUT1ZLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBLIGluIEope3ZhciBXPUpbS107aWYoIShLPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSikmJlc9PW51bGx8fE82JiZLPT09ImNoaWxkcmVuIiYmWT09PSJub3NjcmlwdCJ8fEs9PT0iY2xhc3MifHxLPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1LLnRvTG93ZXJDYXNlKCk7Sz09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gSiYmSi52YWx1ZT09bnVsbD9LPSJ2YWx1ZSI6Sz09PSJkb3dubG9hZCImJlc9PT0hMD9XPSIiOkc9PT0idHJhbnNsYXRlIiYmVz09PSJubyI/Vz0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/Sz0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fFkhPT0iaW5wdXQiJiZZIT09InRleHRhcmVhInx8VTYoSi50eXBlKT9HPT09Im9uZm9jdXMiP0s9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP0s9Im9uZm9jdXNvdXQiOkg2LnRlc3QoSykmJihLPUcpOkc9Sz0ib25pbnB1dCI6USYmVjYudGVzdChLKT9LPUsucmVwbGFjZShQNiwiLSQmIikudG9Mb3dlckNhc2UoKTpXPT09bnVsbCYmKFc9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW0s9R10mJihLPSJvbmlucHV0Q2FwdHVyZSIpLHFbS109V319WT09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1MMChKLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKHope3oucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKHoucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PXoucHJvcHMudmFsdWV9KSkpLEouY2xhc3MmJiFKLmNsYXNzTmFtZT8ocS5jbGFzcz1KLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEE2KSk6Si5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPUouY2xhc3NOYW1lKSxaLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9RzYsazUmJms1KFgpfTt2YXIgSTU9Qi5fX3I7Qi5fX3I9ZnVuY3Rpb24oWCl7STUmJkk1KFgpLGI1PVguX19jfTt2YXIgTTU9Qi5kaWZmZWQ7Qi5kaWZmZWQ9ZnVuY3Rpb24oWCl7TTUmJk01KFgpO3Zhcntwcm9wczpaLF9fZTpKfT1YO0ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlIT09Si52YWx1ZSYmKEoudmFsdWU9Wi52YWx1ZT09bnVsbD8iIjpaLnZhbHVlKSxiNT1udWxsfTt2YXIgQjY9MDtmdW5jdGlvbiBOKFgsWixKLFkscSxRKXtafHwoWj17fSk7dmFyIEssVyxHPVo7aWYoInJlZiJpbiBHKWZvcihXIGluIEc9e30sWilXPT0icmVmIj9LPVpbV106R1tXXT1aW1ddO3ZhciB6PXt0eXBlOlgscHJvcHM6RyxrZXk6SixyZWY6SyxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6LS1CNixfX2k6LTEsX191OjAsX19zb3VyY2U6cSxfX3NlbGY6UX07aWYodHlwZW9mIFg9PSJmdW5jdGlvbiImJihLPVguZGVmYXVsdFByb3BzKSlmb3IoVyBpbiBLKUdbV109PT12b2lkIDAmJihHW1ddPUtbV10pO3JldHVybiBCLnZub2RlJiZCLnZub2RlKHopLHp9dmFyIEQ0PWB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjAnIGhlaWdodD0nMjAnJTNFJTNDY2lyY2xlIGN4PScxMCcgY3k9JzEwJyByPSc5JyBmaWxsPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNCknIHN0cm9rZT0ncmdiYSgyNTUsMjU1LDI1NSwwLjcpJyBzdHJva2Utd2lkdGg9JzEnLyUzRSUzQy9zdmclM0UiKSAxMCAxMCwgcG9pbnRlcmAsXzY9MyxGNj00LEQ2PTU7ZnVuY3Rpb24gbjAoe3VybDpYLHdzVXJsOlosc3R5bGU6SixpbWFnZVN0eWxlOlksY2xhc3NOYW1lOnEsb25Ib21lUHJlc3M6USxvblN0cmVhbVRvdWNoOkssb25TdHJlYW1NdWx0aVRvdWNoOlcsb25TdHJlYW1CdXR0b246RyxzdWJzY3JpYmVGcmFtZTp6LHN0cmVhbUZyYW1lOk8sc3RyZWFtQ29uZmlnOiQsaGlkZUNvbnRyb2xzOl8sb25TdHJlYW1pbmdDaGFuZ2U6QSxjb25uZWN0aW9uUXVhbGl0eTpDfSl7bGV0IFU9ISFLLGs9dyhudWxsKSxJPXcobnVsbCksTT13KG51bGwpLFtoLEVdPVMoITEpLFtlLFowXT1TKG51bGwpLFtnLEswXT1TKG51bGwpLHM9dyhudWxsKSxbcixVMF09UyhudWxsKTt4KCgpPT57bGV0IFY9cy5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKEwpPT57bGV0IFA9TFswXT8uY29udGVudFJlY3Q7aWYoUClVMCh7d2lkdGg6UC53aWR0aCxoZWlnaHQ6UC5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W2owLHYwXT1TKDApLEcwPXcoMCksW0o0LEkwXT1TKCExKSxGPXcobnVsbCk7eCgoKT0+e2lmKEM9PT0icG9vciIpe2lmKEkwKCEwKSxGLmN1cnJlbnQpY2xlYXJUaW1lb3V0KEYuY3VycmVudCk7Ri5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntJMCghMSksRi5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYoSTAoITEpLEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KSxGLmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KX19LFtDXSk7bGV0IFI9YCR7WH0vc3RyZWFtLm1qcGVnYCx2PXcoQSk7di5jdXJyZW50PUEseCgoKT0+e3YuY3VycmVudD8uKGgpfSxbaF0pLHgoKCk9PntpZihVJiYkKUswKCQpfSxbVSwkXSk7bGV0IFQ9dyghMSk7VC5jdXJyZW50PWg7bGV0IHU9dyhudWxsKTt4KCgpPT57aWYoIVV8fCF6KXJldHVybjtsZXQgSD1zZXRUaW1lb3V0KCgpPT57aWYoIVQuY3VycmVudClaMCgiU3RyZWFtIGlzIG5vdCBwcm9kdWNpbmcgZnJhbWVzLiBUaGUgc2ltdWxhdG9yIG1heSBoYXZlIHN0b3BwZWQg4oCUIHRyeSByZWNvbm5lY3RpbmcuIil9LDYwMDApLEw9eigoUCk9PntHMC5jdXJyZW50KyssWDAuY3VycmVudD1EYXRlLm5vdygpO2xldCBEPUkuY3VycmVudDtpZihEKXtpZih1LmN1cnJlbnQpVVJMLnJldm9rZU9iamVjdFVSTCh1LmN1cnJlbnQpO3UuY3VycmVudD1QLEQuc3JjPVB9aWYoIVQuY3VycmVudCljbGVhclRpbWVvdXQoSCksRSghMCksWjAobnVsbCl9KTtyZXR1cm4oKT0+e2NsZWFyVGltZW91dChIKSxMPy4oKX19LFtVLHpdKTtsZXQgbT1qKChWKT0+e2lmKFUpe0s/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KFYpKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09XzYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEtdKSxKMD1qKChWKT0+e2lmKFUpe0c/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHtidXR0b246Vn0pKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09RjYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEddKSx5PWooKFYpPT57aWYoVSl7Vz8uKFYpO3JldHVybn1sZXQgSD1NLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLFA9bmV3IFVpbnQ4QXJyYXkoMStMLmxlbmd0aCk7UFswXT1ENixQLnNldChMLDEpLEguc2VuZChQKX0sW1UsV10pO3goKCk9PntpZihVKXJldHVybjtmZXRjaChgJHtYfS9jb25maWdgKS50aGVuKChsKT0+bC5qc29uKCkpLnRoZW4oKGwpPT57aWYobC53aWR0aD4wJiZsLmhlaWdodD4wKUswKGwpfSkuY2F0Y2goKCk9Pnt9KTtsZXQgVj1aPz9YLnJlcGxhY2UoL15odHRwLywid3MiKSsiL3dzIixIPW5ldyBXZWJTb2NrZXQoVik7SC5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsTS5jdXJyZW50PUgsSC5vbm9wZW49KCk9PntFKCEwKSxaMChudWxsKX0sSC5vbmNsb3NlPSgpPT57RSghMSl9LEgub25lcnJvcj0oKT0+e1owKCJXZWJTb2NrZXQgY29ubmVjdGlvbiBmYWlsZWQiKSxFKCExKX07bGV0IEw9bmV3IEFib3J0Q29udHJvbGxlcixQPXNldEludGVydmFsKCgpPT57djAoRzAuY3VycmVudCksRzAuY3VycmVudD0wfSwxMDAwKSxEPSExLGI9c2V0VGltZW91dCgoKT0+e2lmKCFEKVowKCJTdHJlYW0gaXMgbm90IHByb2R1Y2luZyBmcmFtZXMuIFRoZSBzaW11bGF0b3IgbWF5IGhhdmUgc3RvcHBlZCDigJQgdHJ5IHJlY29ubmVjdGluZy4iKX0sNjAwMCk7cmV0dXJuKGFzeW5jKCk9Pnt0cnl7bGV0IG49KGF3YWl0IGZldGNoKFIse3NpZ25hbDpMLnNpZ25hbH0pKS5ib2R5Py5nZXRSZWFkZXIoKTtpZighbilyZXR1cm47bGV0IFEwPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiLS1mcmFtZSIpO3doaWxlKCEwKXtsZXR7ZG9uZTpoNSx2YWx1ZTpRNH09YXdhaXQgbi5yZWFkKCk7aWYoaDUpYnJlYWs7aWYoUTQpZm9yKGxldCBLND0wO0s0PD1RNC5sZW5ndGgtUTAubGVuZ3RoO0s0Kyspe2xldCBUND0hMDtmb3IobGV0IHgwPTA7eDA8UTAubGVuZ3RoO3gwKyspaWYoUTRbSzQreDBdIT09UTBbeDBdKXtUND0hMTticmVha31pZihUNCl7aWYoRzAuY3VycmVudCsrLCFEKUQ9ITAsY2xlYXJUaW1lb3V0KGIpfX19fWNhdGNoe319KSgpLCgpPT57TC5hYm9ydCgpLGNsZWFySW50ZXJ2YWwoUCksY2xlYXJUaW1lb3V0KGIpLEguY2xvc2UoKSxNLmN1cnJlbnQ9bnVsbH19LFtYLFIsVV0pO2xldCBYMD13KDApO3goKCk9PntpZighVSlyZXR1cm47bGV0IFY9MjAwMCxIPSgpPT57bGV0IEQ9WDAuY3VycmVudDtpZighRHx8IVQuY3VycmVudClyZXR1cm47aWYoRGF0ZS5ub3coKS1EPlYpRSghMSl9LEw9c2V0SW50ZXJ2YWwoKCk9Pnt2MChHMC5jdXJyZW50KSxHMC5jdXJyZW50PTAsSCgpfSwxMDAwKSxQPSgpPT57aWYoIWRvY3VtZW50LmhpZGRlbilIKCl9O3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixQKSwoKT0+e2NsZWFySW50ZXJ2YWwoTCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsUCl9fSxbVV0pO2xldCBhPWooKCk9PntyZXR1cm4gVT9JLmN1cnJlbnQ6ay5jdXJyZW50fSxbVV0pLFYwPWooKFYsSCk9PntsZXQgTD1hKCk7aWYoIUwpcmV0dXJuO2xldCBQPUwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksRD0oSC5jbGllbnRYLVAubGVmdCkvUC53aWR0aCxiPShILmNsaWVudFktUC50b3ApL1AuaGVpZ2h0O20oe3R5cGU6Vix4OkQseTpifSl9LFttXSksWTA9MyxjPXcoITEpLG89dyghMSksQTA9dyghMSksTTA9dyh7ZHg6MCxkeTowfSksQzA9dyghMSksW1k0LEk0XT1TKCExKSxNND13KHt4OjAuNSx5OjAuNX0pLFtIMCxxMF09UyhudWxsKTt4KCgpPT57bGV0IFY9KEwpPT57aWYoTC5rZXk9PT0iQWx0IilJNCghMCl9LEg9KEwpPT57aWYoTC5rZXk9PT0iQWx0Iil7aWYoSTQoITEpLCFvLmN1cnJlbnQpcTAobnVsbCl9fTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLFYpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsSCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixIKX19LFtdKSx4KCgpPT57aWYoWTQmJiFvLmN1cnJlbnQpe2xldCBWPU00LmN1cnJlbnQ7cTAoe3gxOlYueCx5MTpWLnkseDI6MS1WLngseTI6MS1WLnl9KX1lbHNlIGlmKCFZNCYmIW8uY3VycmVudClxMChudWxsKX0sW1k0XSk7bGV0IHkwPXcobnVsbCkscTQ9dyghMSksRTA9dygwKSxDND1qKChWLEgpPT57cTQuY3VycmVudD0hMDtsZXQgTD15MC5jdXJyZW50O2lmKEwpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksRTAuY3VycmVudD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntMLnN0eWxlLmxlZnQ9YCR7VioxMDB9JWAsTC5zdHlsZS50b3A9YCR7SCoxMDB9JWAsTC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KX0sW10pLEU0PWooKFYsSCk9PntpZighcTQuY3VycmVudClyZXR1cm47bGV0IEw9eTAuY3VycmVudDtpZihMKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEUwLmN1cnJlbnQpLEUwLmN1cnJlbnQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57TC5zdHlsZS5sZWZ0PWAke1YqMTAwfSVgLEwuc3R5bGUudG9wPWAke0gqMTAwfSVgfSl9LFtdKSxwMD1qKCgpPT57cTQuY3VycmVudD0hMTtsZXQgVj15MC5jdXJyZW50O2lmKFYpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksVi5zdHlsZS5kaXNwbGF5PSJub25lIn0sW10pLHc0PXcoMCksdzA9dyhudWxsKSx4NT1qKCgpPT57bGV0IFY9RGF0ZS5ub3coKSxIPVYtdzQuY3VycmVudDtpZih3NC5jdXJyZW50PVYsSDwzMDApe2lmKHcwLmN1cnJlbnQpY2xlYXJUaW1lb3V0KHcwLmN1cnJlbnQpLHcwLmN1cnJlbnQ9bnVsbDtpZihRKVEoKTtlbHNlIEowKCJhcHBfc3dpdGNoZXIiKX1lbHNlIHcwLmN1cnJlbnQ9c2V0VGltZW91dCgoKT0+e2lmKFEpUSgpO2Vsc2UgSjAoImhvbWUiKTt3MC5jdXJyZW50PW51bGx9LDMwMCl9LFtKMCxRXSksZzA9KCgpPT57aWYoIWd8fCFyKXJldHVybiBudWxsO2lmKHIud2lkdGg9PT0wfHxyLmhlaWdodD09PTApcmV0dXJuIG51bGw7bGV0IFY9TWF0aC5taW4oci53aWR0aC9nLndpZHRoLHIuaGVpZ2h0L2cuaGVpZ2h0KTtyZXR1cm57d2lkdGg6Zy53aWR0aCpWLGhlaWdodDpnLmhlaWdodCpWfX0pKCk7cmV0dXJuIE4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGZsZXg6MSwuLi5fP3t9Ontib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sb3ZlcmZsb3c6ImhpZGRlbiIsbWluV2lkdGg6MCxtaW5IZWlnaHQ6MCwuLi5KfSxjbGFzc05hbWU6cSxjaGlsZHJlbjpbTigiZGl2Iix7cmVmOnMsc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsZmxleDoxLG1pbkhlaWdodDowLG1pbldpZHRoOjAsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIn0sY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsd2lkdGg6ZzA/YCR7ZzAud2lkdGh9cHhgOiIxMDAlIixoZWlnaHQ6ZzA/YCR7ZzAuaGVpZ2h0fXB4YDoiMTAwJSJ9LGNoaWxkcmVuOltOKCJpbWciLHtyZWY6ayxzcmM6VT92b2lkIDA6UixkcmFnZ2FibGU6ITEsb25Mb2FkOihWKT0+e2xldCBIPVYuY3VycmVudFRhcmdldDtpZihILm5hdHVyYWxXaWR0aD4wJiZILm5hdHVyYWxIZWlnaHQ+MClLMCgoTCk9PkwmJkwud2lkdGg9PT1ILm5hdHVyYWxXaWR0aCYmTC5oZWlnaHQ9PT1ILm5hdHVyYWxIZWlnaHQ/TDp7d2lkdGg6SC5uYXR1cmFsV2lkdGgsaGVpZ2h0OkgubmF0dXJhbEhlaWdodH0pfSxzdHlsZTpVP3tkaXNwbGF5OiJub25lIn06e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCx3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixjdXJzb3I6RDQsZGlzcGxheToiYmxvY2siLHVzZXJTZWxlY3Q6Im5vbmUiLFdlYmtpdFVzZXJTZWxlY3Q6Im5vbmUiLHRvdWNoQWN0aW9uOiJub25lIiwuLi5ZfX0pLFUmJk4oImltZyIse3JlZjpJLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKUswKChMKT0+TCYmTC53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZMLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9MOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOkQ0LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uWX19KSxOKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGN1cnNvcjpENCx0b3VjaEFjdGlvbjoibm9uZSJ9LG9uTW91c2VEb3duOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksUD0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKFYuYWx0S2V5KXtvLmN1cnJlbnQ9ITAsQTAuY3VycmVudD1WLnNoaWZ0S2V5O2xldCBiPXt4MTpQLHkxOkQseDI6MS1QLHkyOjEtRH07TTAuY3VycmVudD17ZHg6MS1QLVAsZHk6MS1ELUR9LHEwKGIpLHkoe3R5cGU6ImJlZ2luIiwuLi5ifSk7cmV0dXJufWlmKEM0KFAsRCksRD4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpQLHk6RCxlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsVjAoImJlZ2luIixWKX0sb25Nb3VzZU1vdmU6KFYpPT57bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihNNC5jdXJyZW50PXt4OlAseTpEfSxWLmJ1dHRvbnM9PT0wKXtpZihWLmFsdEtleSlxMCh7eDE6UCx5MTpELHgyOjEtUCx5MjoxLUR9KTtyZXR1cm59aWYoby5jdXJyZW50KXtsZXQgYjtpZihBMC5jdXJyZW50KXtsZXQgbD1NMC5jdXJyZW50O2I9e3gxOlAseTE6RCx4MjpQK2wuZHgseTI6RCtsLmR5fX1lbHNlIGI9e3gxOlAseTE6RCx4MjoxLVAseTI6MS1EfTtxMChiKSx5KHt0eXBlOiJtb3ZlIiwuLi5ifSk7cmV0dXJufWlmKEU0KFAsRCksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6UCx5OkQsZWRnZTpZMH0pO2Vsc2UgVjAoIm1vdmUiLFYpfSxvbk1vdXNlVXA6KFYpPT57aWYoby5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoQTAuY3VycmVudCl7bGV0IGI9TTAuY3VycmVudDt5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjpQK2IuZHgseTI6RCtiLmR5fSl9ZWxzZSB5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjoxLVAseTI6MS1EfSl9aWYoby5jdXJyZW50PSExLCFWLmFsdEtleSlxMChudWxsKTtyZXR1cm59aWYocDAoKSxjLmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDttKHt0eXBlOiJlbmQiLHg6UCx5OkQsZWRnZTpZMH0pfWMuY3VycmVudD0hMTtyZXR1cm59VjAoImVuZCIsVil9LG9uTW91c2VMZWF2ZTooVik9PntpZihvLmN1cnJlbnQpe2lmKEgwKXkoe3R5cGU6ImVuZCIsLi4uSDB9KTtvLmN1cnJlbnQ9ITEscTAobnVsbCk7cmV0dXJufWlmKHAwKCksYy5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7bSh7dHlwZToiZW5kIix4OlAseTpELGVkZ2U6WTB9KX1jLmN1cnJlbnQ9ITE7cmV0dXJufWlmKFYuYnV0dG9ucz4wKVYwKCJlbmQiLFYpO3EwKG51bGwpfSxvblRvdWNoU3RhcnQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWLnRvdWNoZXMubGVuZ3RoPj0yKXtwMCgpO2xldCBsPVYudG91Y2hlc1swXSxuPVYudG91Y2hlc1sxXSxRMD17eDE6KGwuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTE6KGwuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQseDI6KG4uY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTI6KG4uY2xpZW50WS1MLnRvcCkvTC5oZWlnaHR9O2lmKCFDMC5jdXJyZW50JiYhYy5jdXJyZW50KW0oe3R5cGU6ImVuZCIseDpRMC54MSx5OlEwLnkxfSk7QzAuY3VycmVudD0hMCxvLmN1cnJlbnQ9ITAsYy5jdXJyZW50PSExLHEwKFEwKSx5KHt0eXBlOiJiZWdpbiIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEM0KEQsYiksYj4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpELHk6YixlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsbSh7dHlwZToiYmVnaW4iLHg6RCx5OmJ9KX0sb25Ub3VjaE1vdmU6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihDMC5jdXJyZW50JiZWLnRvdWNoZXMubGVuZ3RoPj0yKXtsZXQgbD1WLnRvdWNoZXNbMF0sbj1WLnRvdWNoZXNbMV0sUTA9e3gxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOihuLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkyOihuLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0fTtxMChRMCkseSh7dHlwZToibW92ZSIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEU0KEQsYiksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6RCx5OmIsZWRnZTpZMH0pO2Vsc2UgbSh7dHlwZToibW92ZSIseDpELHk6Yn0pfSxvblRvdWNoRW5kOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoQzAuY3VycmVudCl7aWYoVi50b3VjaGVzLmxlbmd0aDwyKXtsZXQgbD1WLmNoYW5nZWRUb3VjaGVzWzBdLG49SDA7aWYobCYmbil5KHt0eXBlOiJlbmQiLHgxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOm4ueDIseTI6bi55Mn0pO2Vsc2UgaWYobil5KHt0eXBlOiJlbmQiLC4uLm59KTtDMC5jdXJyZW50PSExLG8uY3VycmVudD0hMSxxMChudWxsKX1yZXR1cm59bGV0IFA9Vi5jaGFuZ2VkVG91Y2hlc1swXTtpZighUClyZXR1cm47bGV0IEQ9KFAuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsYj0oUC5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihwMCgpLGMuY3VycmVudCltKHt0eXBlOiJlbmQiLHg6RCx5OmIsZWRnZTpZMH0pLGMuY3VycmVudD0hMTtlbHNlIG0oe3R5cGU6ImVuZCIseDpELHk6Yn0pfX0pLE4oImRpdiIse3JlZjp5MCwiZGF0YS10ZXN0aWQiOiJ0b3VjaC1pbmRpY2F0b3IiLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUiLHdpZHRoOjI0LGhlaWdodDoyNCxib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDoicmdiYSg1OSwxMzAsMjQ2LDAuNSkiLGJveFNoYWRvdzoiMCAwIDhweCByZ2JhKDU5LDEzMCwyNDYsMC4zKSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoLTUwJSwgLTUwJSkiLHBvaW50ZXJFdmVudHM6Im5vbmUifX0pLEgwJiZOKGYse2NoaWxkcmVuOltOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MSxIMC55MSl9KSxOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MixIMC55Mil9KV19KSwhaCYmIWUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiM4ODgiLGZvbnRTaXplOjE0fSxjaGlsZHJlbjoiQ29ubmVjdGluZy4uLiJ9KX0pLGUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiNmNDQiLGZvbnRTaXplOjE0LHBhZGRpbmc6MjAsdGV4dEFsaWduOiJjZW50ZXIifSxjaGlsZHJlbjplfSl9KSxKNCYmTigiZGl2Iix7c3R5bGU6azYsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiI2ZiYmYyNCIsZm9udFNpemU6MTMsZm9udEZhbWlseToibW9ub3NwYWNlIn0sY2hpbGRyZW46IlNsb3cgY29ubmVjdGlvbiJ9KX0pXX0pfSksIV8mJk4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixwYWRkaW5nOiI0cHggOHB4Iixib3JkZXJUb3A6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sY2hpbGRyZW46W04oImJ1dHRvbiIse29uQ2xpY2s6eDUsc3R5bGU6e2JhY2tncm91bmQ6Im5vbmUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4yKSIsY29sb3I6IiNhYWEiLGZvbnRTaXplOjExLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIscGFkZGluZzoiMnB4IDEwcHgiLGN1cnNvcjoicG9pbnRlciIsYm9yZGVyUmFkaXVzOjR9LGNoaWxkcmVuOiJIb21lIn0pLE4oInNwYW4iLHtzdHlsZTp7Y29sb3I6ajA+MD8iIzRmNCI6IiM4ODgiLGZvbnRTaXplOjEyLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixnYXA6Nn0sY2hpbGRyZW46W0MmJk4oInNwYW4iLHsiZGF0YS10ZXN0aWQiOiJxdWFsaXR5LWRvdCIsc3R5bGU6e3dpZHRoOjgsaGVpZ2h0OjgsYm9yZGVyUmFkaXVzOiI1MCUiLGRpc3BsYXk6ImlubGluZS1ibG9jayIsYmFja2dyb3VuZDpDPT09Imdvb2QiPyIjNGFkZTgwIjpDPT09ImRlZ3JhZGVkIj8iI2ZhY2MxNSI6IiNlZjQ0NDQifX0pLGowLCIgZnBzIl19KV19KV19KX12YXIgazY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjgsbGVmdDoiNTAlIix0cmFuc2Zvcm06InRyYW5zbGF0ZVgoLTUwJSkiLGJhY2tncm91bmQ6InJnYmEoMCwwLDAsMC43KSIsYm9yZGVyUmFkaXVzOjYscGFkZGluZzoiNHB4IDEycHgiLHBvaW50ZXJFdmVudHM6Im5vbmUifSxTNT17cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYmFja2dyb3VuZDoicmdiYSgwLDAsMCwwLjgpIn0sUjU9MjA7ZnVuY3Rpb24gajUoWCxaKXtyZXR1cm57cG9zaXRpb246ImFic29sdXRlIixsZWZ0OmAke1gqMTAwfSVgLHRvcDpgJHtaKjEwMH0lYCx3aWR0aDpSNSxoZWlnaHQ6UjUsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjcpIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgtNTAlLCAtNTAlKSIscG9pbnRlckV2ZW50czoibm9uZSJ9fWZ1bmN0aW9uIGswKFgpe2lmKCFYKXJldHVybiJpcGhvbmUiO2xldCBaPVgudG9Mb3dlckNhc2UoKTtpZihaLmluY2x1ZGVzKCJpcGFkIikpcmV0dXJuImlwYWQiO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIndhdGNoIjtpZihaLmluY2x1ZGVzKCJ2aXNpb24iKSlyZXR1cm4idmlzaW9uIjtyZXR1cm4iaXBob25lIn12YXIgJDA9e2lwaG9uZTp7d2lkdGg6NDI3LGhlaWdodDo4ODEsYmV6ZWxYOjE4LGJlemVsWToxOCxpbm5lclJhZGl1czo1NX0saXBhZDp7d2lkdGg6NDMwLGhlaWdodDo2MDUsYmV6ZWxYOjE2LGJlemVsWToxNixpbm5lclJhZGl1czoxMn0sd2F0Y2g6e3dpZHRoOjI3NCxoZWlnaHQ6MzIyLGJlemVsWDoxMixiZXplbFk6MTIsaW5uZXJSYWRpdXM6Nzl9LHZpc2lvbjp7d2lkdGg6NjQwLGhlaWdodDo0MDAsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czozMn19LGI3PSQwLmlwaG9uZS53aWR0aCxTNz0kMC5pcGhvbmUuaGVpZ2h0LFI3PSQwLmlwaG9uZS5iZXplbFgsajc9JDAuaXBob25lLmJlemVsWSx2Nz0kMC5pcGhvbmUuaW5uZXJSYWRpdXM7ZnVuY3Rpb24gZTAoWD0iaXBob25lIil7bGV0IFo9JDBbWF0sSj1aLndpZHRoLTIqWi5iZXplbFgsWT1aLmhlaWdodC0yKlouYmV6ZWxZO3JldHVybmAke1ouaW5uZXJSYWRpdXMvSioxMDB9JSAvICR7Wi5pbm5lclJhZGl1cy9ZKjEwMH0lYH12YXIgazQ9XzAobnVsbCk7ZnVuY3Rpb24gWDQoWCl7bGV0IFo9UjAoazQpO2lmKCFaKXRocm93IEVycm9yKGA8U2ltdWxhdG9yVG9vbGJhci4ke1h9PiBtdXN0IGJlIHJlbmRlcmVkIGluc2lkZSA8U2ltdWxhdG9yVG9vbGJhcj5gKTtyZXR1cm4gWn12YXIgdzY9e2Rpc3BsYXk6ImZsZXgiLGZsZXhXcmFwOiJ3cmFwIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixnYXA6IjRweCAxMnB4IixwYWRkaW5nOiI4cHggMTJweCIsYm9yZGVyUmFkaXVzOjI0LGJhY2tncm91bmQ6IiMxYzFjMWUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSIsYm94U2hhZG93OiIwIDFweCAycHggcmdiYSgwLDAsMCwwLjIpIixtaW5XaWR0aDoyNDAsd2lkdGg6IjEwMCUifTtmdW5jdGlvbiBUNih7ZXhlYzpYLGRldmljZVVkaWQ6WixkZXZpY2VOYW1lOkosZGV2aWNlUnVudGltZTpZLHN0cmVhbWluZzpxPSExLGRpc2FibGVkOlE9ITEsY2hpbGRyZW46SyxzdHlsZTpXLC4uLkd9KXtsZXQgej1rMChKKSwkPXtleGVjOlgsZGV2aWNlVWRpZDpaLGRldmljZU5hbWU6SixkZXZpY2VSdW50aW1lOlksZGV2aWNlVHlwZTp6LHN0cmVhbWluZzpxLGRpc2FibGVkOlF8fCFafHwhcX07cmV0dXJuIE4oazQuUHJvdmlkZXIse3ZhbHVlOiQsY2hpbGRyZW46TigiZGl2Iix7ImRhdGEtc2ltdWxhdG9yLXRvb2xiYXIiOiEwLHN0eWxlOnsuLi53NiwuLi5XfSwuLi5HLGNoaWxkcmVuOkt9KX0pfXZhciBiNj17ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixhbGlnbkl0ZW1zOiJmbGV4LXN0YXJ0Iix0ZXh0QWxpZ246ImxlZnQiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjZmZmIixwYWRkaW5nOiIycHggNHB4IixtYXJnaW46Ii0ycHggLTRweCIsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixtaW5XaWR0aDowLG1heFdpZHRoOiIxMDAlIixsaW5lSGVpZ2h0OjEuMixmb250RmFtaWx5OiJpbmhlcml0In0sUzY9RDAoZnVuY3Rpb24oe25hbWU6WixzdWJ0aXRsZTpKLGhpZGVDaGV2cm9uOlksc3R5bGU6cSxvbk1vdXNlRW50ZXI6USxvbk1vdXNlTGVhdmU6SywuLi5XfSxHKXtsZXQgej1YNCgiVGl0bGUiKSxbTywkXT1TKCExKSxfPVo/P3ouZGV2aWNlTmFtZT8/Ik5vIHNpbXVsYXRvciIsQT1KPz8oei5kZXZpY2VSdW50aW1lP3ouZGV2aWNlUnVudGltZS5yZXBsYWNlKC9cLi8sIiAiKToi4oCUIik7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsImRhdGEtc2ltdWxhdG9yLXRvb2xiYXItdGl0bGUiOiEwLG9uTW91c2VFbnRlcjooQyk9PnskKCEwKSxRPy4oQyl9LG9uTW91c2VMZWF2ZTooQyk9PnskKCExKSxLPy4oQyl9LHN0eWxlOnsuLi5iNixiYWNrZ3JvdW5kOk8/InJnYmEoMjU1LDI1NSwyNTUsMC4xKSI6InRyYW5zcGFyZW50IiwuLi5xfSwuLi5XLGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2Rpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo0LGZvbnRTaXplOjEyLGZvbnRXZWlnaHQ6NjAwLGNvbG9yOiIjZmZmIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46W18sIVkmJk4oInN2ZyIse3dpZHRoOiIxMCIsaGVpZ2h0OiIxMCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIuNSIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsc3R5bGU6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGZsZXhTaHJpbms6MH0sY2hpbGRyZW46TigicG9seWxpbmUiLHtwb2ludHM6IjYgOSAxMiAxNSAxOCA5In0pfSldfSksTigic3BhbiIse3N0eWxlOntmb250U2l6ZToxMCxjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjUpIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46QX0pXX0pfSksUjY9e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZmxleFNocmluazowfTtmdW5jdGlvbiBqNih7c3R5bGU6WCwuLi5afSl7cmV0dXJuIE4oImRpdiIse3N0eWxlOnsuLi5SNiwuLi5YfSwuLi5afSl9dmFyIHY2PXtiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsYm9yZGVyOiJub25lIixwYWRkaW5nOjYsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixkaXNwbGF5OiJpbmxpbmUtZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIix0cmFuc2l0aW9uOiJiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzLCBjb2xvciAwLjE1cyJ9LFo0PUQwKGZ1bmN0aW9uKHtmb3JjZURpc2FibGVkOlosc3R5bGU6SixkaXNhYmxlZDpZLG9uTW91c2VFbnRlcjpxLG9uTW91c2VMZWF2ZTpRLGNoaWxkcmVuOkssLi4uV30sRyl7bGV0IHo9UjAoazQpLE89WXx8Wnx8ej8uZGlzYWJsZWQsWyQsX109UyghMSk7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6Tyxvbk1vdXNlRW50ZXI6KEEpPT57XyghMCkscT8uKEEpfSxvbk1vdXNlTGVhdmU6KEEpPT57XyghMSksUT8uKEEpfSxzdHlsZTp7Li4udjYsY29sb3I6Tz8icmdiYSgyNTUsMjU1LDI1NSwwLjI1KSI6InJnYmEoMjU1LDI1NSwyNTUsMC44KSIsYmFja2dyb3VuZDokJiYhTz8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLGN1cnNvcjpPPyJub3QtYWxsb3dlZCI6InBvaW50ZXIiLC4uLkp9LC4uLlcsY2hpbGRyZW46S30pfSk7ZnVuY3Rpb24geTYoKXtyZXR1cm5bJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBzZXQgZnJvbnRtb3N0IHRvIHRydWUnLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gcGVyZm9ybSBhY3Rpb24gIkFYUmFpc2UiIG9mIChmaXJzdCB3aW5kb3cgd2hvc2UgbmFtZSBjb250YWlucyAid2F0Y2hPUyIpJywndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIGNsaWNrIG1lbnUgaXRlbSAiSG9tZSIgb2YgbWVudSAiRGV2aWNlIiBvZiBtZW51IGJhciBpdGVtICJEZXZpY2UiIG9mIG1lbnUgYmFyIDEnXS5tYXAoKFopPT5gLWUgJyR7Wn0nYCkucmVkdWNlKChaLEopPT5gJHtafSAke0p9YCwib3Nhc2NyaXB0Iil9dmFyIHA2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOk4oInBhdGgiLHtkOiJNMyAxMC41IDEyIDNsOSA3LjVWMjBhMSAxIDAgMCAxLTEgMWgtNXYtN2gtNnY3SDRhMSAxIDAgMCAxLTEtMXoifSl9KSxnNj1OKCJzdmciLHt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixjaGlsZHJlbjpbTigicGF0aCIse2Q6Ik0xNC41IDRoLTVMNyA3SDRhMiAyIDAgMCAwLTIgMnY5YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMlY5YTIgMiAwIDAgMC0yLTJoLTN6In0pLE4oImNpcmNsZSIse2N4OiIxMiIsY3k6IjEzIixyOiI0In0pXX0pLHg2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDEyIDEzIixmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46TigicGF0aCIse2Q6Ik0xMC4yMzA1IDEyLjgwNzdINC40MjM4M0MzLjkyMzgzIDEyLjgwNzcgMy41NDY4OCAxMi42ODQ2IDMuMjkyOTcgMTIuNDM4NUMzLjA0Mjk3IDEyLjE5NjMgMi45MTc5NyAxMS44MTk0IDIuOTE3OTcgMTEuMzA3N1Y1LjUxMjc0QzIuOTE3OTcgNC45OTcxMSAzLjA0Mjk3IDQuNjE4MjEgMy4yOTI5NyA0LjM3NjAyQzMuNTQ2ODggNC4xMjk5MyAzLjkyMzgzIDQuMDA2ODggNC40MjM4MyA0LjAwNjg4SDEwLjIzMDVDMTAuNzM0NCA0LjAwNjg4IDExLjExMTMgNC4xMjk5MyAxMS4zNjEzIDQuMzc2MDJDMTEuNjExMyA0LjYxODIxIDExLjczNjMgNC45OTcxMSAxMS43MzYzIDUuNTEyNzRWMTEuMzA3N0MxMS43MzYzIDExLjgxOTQgMTEuNjExMyAxMi4xOTYzIDExLjM2MTMgMTIuNDM4NUMxMS4xMTEzIDEyLjY4NDYgMTAuNzM0NCAxMi44MDc3IDEwLjIzMDUgMTIuODA3N1pNMTAuMjEyOSAxMS44NjQzQzEwLjQxNiAxMS44NjQzIDEwLjU2MjUgMTEuODE5NCAxMC42NTIzIDExLjcyOTVDMTAuNzQ2MSAxMS42NDM2IDEwLjc5MyAxMS40OTcxIDEwLjc5MyAxMS4yOTAxVjUuNTI0NDZDMTAuNzkzIDUuMzE3NDMgMTAuNzQ2MSA1LjE3MDk0IDEwLjY1MjMgNS4wODUwMUMxMC41NjI1IDQuOTk1MTYgMTAuNDE2IDQuOTUwMjQgMTAuMjEyOSA0Ljk1MDI0SDQuNDQxNDFDNC4yNDIxOSA0Ljk1MDI0IDQuMDk1NyA0Ljk5NTE2IDQuMDAxOTUgNS4wODUwMUMzLjkwODIgNS4xNzA5NCAzLjg2MTMzIDUuMzE3NDMgMy44NjEzMyA1LjUyNDQ2VjExLjI5MDFDMy44NjEzMyAxMS40OTcxIDMuOTA4MiAxMS42NDM2IDQuMDAxOTUgMTEuNzI5NUM0LjA5NTcgMTEuODE5NCA0LjI0MjE5IDExLjg2NDMgNC40NDE0MSAxMS44NjQzSDEwLjIxMjlaTTIuOTE3OTcgMi41ODMwNVYwLjQxNTA4M0MyLjkxNzk3IDAuMjAwMjQgMi45ODYzMyAwLjA2OTM4MDMgMy4xMjMwNSAwLjAyMjUwNTNDMy4yNTk3NyAtMC4wMjgyNzU5IDMuNDEwMTYgMC4wMDY4ODAzMyAzLjU3NDIyIDAuMTI3OTc0TDUuMDUwNzggMS4yMTE5NkM1LjE3NTc4IDEuMzA1NzEgNS4yMzgyOCAxLjQwMTQxIDUuMjM4MjggMS40OTkwN0M1LjIzODI4IDEuNTk2NzIgNS4xNzU3OCAxLjY5MjQzIDUuMDUwNzggMS43ODYxOEwzLjU3NDIyIDIuODY0M0MzLjQxMDE2IDIuOTg1NCAzLjI1OTc3IDMuMDIyNTEgMy4xMjMwNSAyLjk3NTYzQzIuOTg2MzMgMi45MjQ4NSAyLjkxNzk3IDIuNzkzOTkgMi45MTc5NyAyLjU4MzA1Wk0zLjUzMzIgMS4xNTMzNkMzLjYyNjk1IDEuMTUzMzYgMy43MDcwMyAxLjE4NjU3IDMuNzczNDQgMS4yNTI5N0MzLjg0Mzc1IDEuMzE5MzggMy44Nzg5MSAxLjM5NzUxIDMuODc4OTEgMS40ODczNUMzLjg3ODkxIDEuNTgxMSAzLjg0Mzc1IDEuNjYzMTMgMy43NzM0NCAxLjczMzQ0QzMuNzA3MDMgMS43OTk4NSAzLjYyNjk1IDEuODMzMDUgMy41MzMyIDEuODMzMDVIMi44MDY2NEMyLjM4MDg2IDEuODMzMDUgMi4wMTE3MiAxLjkyNDg1IDEuNjk5MjIgMi4xMDg0NEMxLjM5MDYyIDIuMjg4MTMgMS4xNTIzNCAyLjUzODEzIDAuOTg0Mzc1IDIuODU4NDRDMC44MTY0MDYgMy4xNzg3NiAwLjczMjQyMiAzLjU0NTk0IDAuNzMyNDIyIDMuOTYwMDFWNC44Mzg5MUMwLjczMjQyMiA0LjkzNjU3IDAuNjk3MjY2IDUuMDIyNTEgMC42MjY5NTMgNS4wOTY3MkMwLjU1MjczNCA1LjE2NzA0IDAuNDY0ODQ0IDUuMjAyMTkgMC4zNjMyODEgNS4yMDIxOUMwLjI2NTYyNSA1LjIwMjE5IDAuMTgxNjQxIDUuMTY3MDQgMC4xMTEzMjggNS4wOTY3MkMwLjAzNzEwOTQgNS4wMjI1MSAwIDQuOTM2NTcgMCA0LjgzODkxVjMuOTYwMDFDMCAzLjQwMTQxIDAuMTE3MTg4IDIuOTExMTggMC4zNTE1NjIgMi40ODkzQzAuNTgyMDMxIDIuMDY3NDMgMC45MDgyMDMgMS43MzkzIDEuMzMwMDggMS41MDQ5M0MxLjc0ODA1IDEuMjcwNTUgMi4yMzgyOCAxLjE1MzM2IDIuODAwNzggMS4xNTMzNkgzLjUzMzJaIn0pfSksaDY9RDAoZnVuY3Rpb24oe29uQ2xpY2s6WiwuLi5KfSxZKXtsZXQgcT1YNCgiSG9tZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IkhvbWUiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VUeXBlPT09IndhdGNoIilxLmV4ZWMoeTYoKSk7ZWxzZSBxLmV4ZWMoInNlcnZlLXNpbSBidXR0b24gaG9tZSIpfSwuLi5KLGNoaWxkcmVuOnA2fSl9KSxtNj1EMChmdW5jdGlvbih7b25DbGljazpaLC4uLkp9LFkpe2xldCBxPVg0KCJTY3JlZW5zaG90QnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiU2NyZWVuc2hvdCIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGB4Y3J1biBzaW1jdGwgaW8gJHtxLmRldmljZVVkaWR9IHNjcmVlbnNob3Qgfi9EZXNrdG9wL2hhdGNoLXNjcmVlbnNob3QtJChkYXRlICslcykucG5nYCl9LC4uLkosY2hpbGRyZW46ZzZ9KX0pLGY2PUQwKGZ1bmN0aW9uKHtvbkNsaWNrOlosLi4uSn0sWSl7bGV0IHE9WDQoIlJvdGF0ZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IlJvdGF0ZSBkZXZpY2UiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VVZGlkKXEuZXhlYyhgb3Nhc2NyaXB0IC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTaW11bGF0b3IiIHRvIGFjdGl2YXRlJyAtZSAndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8ga2V5IGNvZGUgMTI0IHVzaW5nIHtjb21tYW5kIGRvd259J2ApfSwuLi5KLGNoaWxkcmVuOng2fSl9KSx0PVQ2O3QuVGl0bGU9UzY7dC5BY3Rpb25zPWo2O3QuQnV0dG9uPVo0O3QuSG9tZUJ1dHRvbj1oNjt0LlNjcmVlbnNob3RCdXR0b249bTY7dC5Sb3RhdGVCdXR0b249ZjY7ZnVuY3Rpb24gZDYoWCl7bGV0W1osSl09UyhudWxsKSxZPXcobmV3IFNldCksW3EsUV09UyhudWxsKSxLPWooKFcpPT57cmV0dXJuIFkuY3VycmVudC5hZGQoVyksKCk9PntZLmN1cnJlbnQuZGVsZXRlKFcpfX0sW10pO3JldHVybiB4KCgpPT57aWYoIVgpcmV0dXJuO2xldCBXPW5ldyBBYm9ydENvbnRyb2xsZXIsRz1YLnJlcGxhY2UoL1wvc3RyZWFtXC5tanBlZyQvLCIiKTtyZXR1cm4gZmV0Y2goYCR7R30vY29uZmlnYCx7c2lnbmFsOlcuc2lnbmFsfSkudGhlbigoeik9PnouanNvbigpKS50aGVuKCh6KT0+e2lmKHoud2lkdGg+MCYmei5oZWlnaHQ+MClKKHopfSkuY2F0Y2goKCk9Pnt9KSwoYXN5bmMoKT0+e3RyeXtsZXQgTz0oYXdhaXQgZmV0Y2goWCx7c2lnbmFsOlcuc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFPKXJldHVybjtsZXQgJD1uZXcgVWludDhBcnJheSgwKTt3aGlsZSghMCl7bGV0e2RvbmU6Xyx2YWx1ZTpBfT1hd2FpdCBPLnJlYWQoKTtpZihfKWJyZWFrO2xldCBDPW5ldyBVaW50OEFycmF5KCQubGVuZ3RoK0EubGVuZ3RoKTtDLnNldCgkKSxDLnNldChBLCQubGVuZ3RoKSwkPUM7d2hpbGUoITApe2xldCBVPS0xO2ZvcihsZXQgRT0wO0U8JC5sZW5ndGgtMTtFKyspaWYoJFtFXT09PTI1NSYmJFtFKzFdPT09MjE2KXtVPUU7YnJlYWt9aWYoVT09PS0xKWJyZWFrO2xldCBrPS0xO2ZvcihsZXQgRT1VKzI7RTwkLmxlbmd0aC0xO0UrKylpZigkW0VdPT09MjU1JiYkW0UrMV09PT0yMTcpe2s9RSsyO2JyZWFrfWlmKGs9PT0tMSlicmVhaztsZXQgST0kLnNsaWNlKFUsayk7JD0kLnNsaWNlKGspO2xldCBNPW5ldyBCbG9iKFtJXSx7dHlwZToiaW1hZ2UvanBlZyJ9KSxoPVVSTC5jcmVhdGVPYmplY3RVUkwoTSk7UShoKTtmb3IobGV0IEUgb2YgWS5jdXJyZW50KUUoaCl9fX1jYXRjaHt9fSkoKSwoKT0+Vy5hYm9ydCgpfSxbWF0pLHtzdWJzY3JpYmVGcmFtZTpLLGZyYW1lOnEsY29uZmlnOlp9fXZhciBhNj17S2V5QTo0LEtleUI6NSxLZXlDOjYsS2V5RDo3LEtleUU6OCxLZXlGOjksS2V5RzoxMCxLZXlIOjExLEtleUk6MTIsS2V5SjoxMyxLZXlLOjE0LEtleUw6MTUsS2V5TToxNixLZXlOOjE3LEtleU86MTgsS2V5UDoxOSxLZXlROjIwLEtleVI6MjEsS2V5UzoyMixLZXlUOjIzLEtleVU6MjQsS2V5VjoyNSxLZXlXOjI2LEtleVg6MjcsS2V5WToyOCxLZXlaOjI5LERpZ2l0MTozMCxEaWdpdDI6MzEsRGlnaXQzOjMyLERpZ2l0NDozMyxEaWdpdDU6MzQsRGlnaXQ2OjM1LERpZ2l0NzozNixEaWdpdDg6MzcsRGlnaXQ5OjM4LERpZ2l0MDozOSxFbnRlcjo0MCxFc2NhcGU6NDEsQmFja3NwYWNlOjQyLFRhYjo0MyxTcGFjZTo0NCxNaW51czo0NSxFcXVhbDo0NixCcmFja2V0TGVmdDo0NyxCcmFja2V0UmlnaHQ6NDgsQmFja3NsYXNoOjQ5LFNlbWljb2xvbjo1MSxRdW90ZTo1MixCYWNrcXVvdGU6NTMsQ29tbWE6NTQsUGVyaW9kOjU1LFNsYXNoOjU2LENhcHNMb2NrOjU3LEYxOjU4LEYyOjU5LEYzOjYwLEY0OjYxLEY1OjYyLEY2OjYzLEY3OjY0LEY4OjY1LEY5OjY2LEYxMDo2NyxGMTE6NjgsRjEyOjY5LFByaW50U2NyZWVuOjcwLFNjcm9sbExvY2s6NzEsUGF1c2U6NzIsSW5zZXJ0OjczLEhvbWU6NzQsUGFnZVVwOjc1LERlbGV0ZTo3NixFbmQ6NzcsUGFnZURvd246NzgsQXJyb3dSaWdodDo3OSxBcnJvd0xlZnQ6ODAsQXJyb3dEb3duOjgxLEFycm93VXA6ODIsTnVtTG9jazo4MyxOdW1wYWREaXZpZGU6ODQsTnVtcGFkTXVsdGlwbHk6ODUsTnVtcGFkU3VidHJhY3Q6ODYsTnVtcGFkQWRkOjg3LE51bXBhZEVudGVyOjg4LE51bXBhZDE6ODksTnVtcGFkMjo5MCxOdW1wYWQzOjkxLE51bXBhZDQ6OTIsTnVtcGFkNTo5MyxOdW1wYWQ2Ojk0LE51bXBhZDc6OTUsTnVtcGFkODo5NixOdW1wYWQ5Ojk3LE51bXBhZDA6OTgsTnVtcGFkRGVjaW1hbDo5OSxDb250cm9sTGVmdDoyMjQsU2hpZnRMZWZ0OjIyNSxBbHRMZWZ0OjIyNixNZXRhTGVmdDoyMjcsQ29udHJvbFJpZ2h0OjIyOCxTaGlmdFJpZ2h0OjIyOSxBbHRSaWdodDoyMzAsTWV0YVJpZ2h0OjIzMX07ZnVuY3Rpb24gbDYoWCl7cmV0dXJuIGE2W1hdPz9udWxsfWFzeW5jIGZ1bmN0aW9uIE8wKFgpe3JldHVybihhd2FpdCBmZXRjaCgiL2V4ZWMiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7Y29tbWFuZDpYfSl9KSkuanNvbigpfWZ1bmN0aW9uIGM2KFgpe3RyeXtsZXQgWj1KU09OLnBhcnNlKFgpLEo9W107Zm9yKGxldFtZLHFdb2YgT2JqZWN0LmVudHJpZXMoWi5kZXZpY2VzPz97fSkpe2xldCBRPVkucmVwbGFjZSgvXmNvbVwuYXBwbGVcLkNvcmVTaW11bGF0b3JcLlNpbVJ1bnRpbWVcLi8sIiIpLnJlcGxhY2UoLy0vZywiLiIpO2ZvcihsZXQgSyBvZiBxKWlmKEsuaXNBdmFpbGFibGUpSi5wdXNoKHt1ZGlkOksudWRpZCxuYW1lOksubmFtZSxzdGF0ZTpLLnN0YXRlLHJ1bnRpbWU6UX0pfXJldHVybiBKfWNhdGNoe3JldHVybltdfX1mdW5jdGlvbiB2NShYKXtsZXQgWj1YLnRvTG93ZXJDYXNlKCk7aWYoWi5pbmNsdWRlcygiaXBob25lIikpcmV0dXJuIDA7aWYoWi5pbmNsdWRlcygiaXBhZCIpKXJldHVybiAxO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIDI7aWYoWi5pbmNsdWRlcygidmlzaW9uIikpcmV0dXJuIDM7cmV0dXJuIDR9ZnVuY3Rpb24geTUoWCl7bGV0IFo9WC50b0xvd2VyQ2FzZSgpO2lmKFouc3RhcnRzV2l0aCgiaW9zIikpcmV0dXJuIDA7aWYoWi5zdGFydHNXaXRoKCJpcGFkb3MiKSlyZXR1cm4gMTtpZihaLnN0YXJ0c1dpdGgoIndhdGNob3MiKSlyZXR1cm4gMjtpZihaLnN0YXJ0c1dpdGgoInZpc2lvbm9zIil8fFouc3RhcnRzV2l0aCgieHJvcyIpKXJldHVybiAzO3JldHVybiA0fWZ1bmN0aW9uIGk2KHtkZXZpY2VzOlgsc2VsZWN0ZWRVZGlkOlosbG9hZGluZzpKLGVycm9yOlksc3RvcHBpbmdVZGlkczpxLG9uUmVmcmVzaDpRLG9uU2VsZWN0Okssb25TdG9wOlcsdHJpZ2dlcjpHfSl7bGV0W3osT109UyghMSksJD13KG51bGwpO3goKCk9PntpZigheilyZXR1cm47bGV0IFU9KGspPT57aWYoISQuY3VycmVudD8uY29udGFpbnMoay50YXJnZXQpKU8oITEpfTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsVSksKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLFUpfSxbel0pO2xldCBfPW5ldyBNYXA7Zm9yKGxldCBVIG9mIFgpe2lmKFUudWRpZD09PVopY29udGludWU7bGV0IGs9Xy5nZXQoVS5ydW50aW1lKTtpZighaylrPVtdLF8uc2V0KFUucnVudGltZSxrKTtrLnB1c2goVSl9Zm9yKGxldCBVIG9mIF8udmFsdWVzKCkpVS5zb3J0KChrLEkpPT52NShrLm5hbWUpLXY1KEkubmFtZSl8fGsubmFtZS5sb2NhbGVDb21wYXJlKEkubmFtZSkpO2xldCBBPVsuLi5fLmVudHJpZXMoKV0uc29ydCgoW1VdLFtrXSk9Pnk1KFUpLXk1KGspfHxVLmxvY2FsZUNvbXBhcmUoaykpLEM9WC5maW5kKChVKT0+VS51ZGlkPT09Wik/P251bGw7cmV0dXJuIE4oImRpdiIse3JlZjokLHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUifSxjaGlsZHJlbjpbTigiZGl2Iix7b25DbGljazooKT0+e2lmKCF6KVEoKTtPKChVKT0+IVUpfSxjaGlsZHJlbjpHfSkseiYmTigiZGl2Iix7c3R5bGU6bzYsY2hpbGRyZW46W04oImRpdiIse3N0eWxlOnM2LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2ZvbnRXZWlnaHQ6NjAwfSxjaGlsZHJlbjoiU2ltdWxhdG9ycyJ9KSxOKCJidXR0b24iLHtvbkNsaWNrOihVKT0+e1Uuc3RvcFByb3BhZ2F0aW9uKCksUSgpfSxkaXNhYmxlZDpKLHN0eWxlOnI2LGNoaWxkcmVuOko/Ii4uLiI6IlJlZnJlc2gifSldfSksWSYmTigiZGl2Iix7c3R5bGU6dDYsY2hpbGRyZW46WX0pLEMmJk4oZix7Y2hpbGRyZW46W04oImRpdiIse3N0eWxlOnsuLi5nNSxjb2xvcjoiI2E1YjRmYyJ9LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6cDUoQy5zdGF0ZT09PSJCb290ZWQiPyIjNGFkZTgwIjoiIzQ0NCIpfSksTigic3BhbiIse3N0eWxlOntmbGV4OjF9LGNoaWxkcmVuOkMubmFtZX0pXX0pLE4oImRpdiIse3N0eWxlOm42fSldfSksWC5sZW5ndGg9PT0wJiYhSiYmIVkmJk4oImRpdiIse3N0eWxlOmU2LGNoaWxkcmVuOiJObyBhdmFpbGFibGUgc2ltdWxhdG9ycyBmb3VuZCJ9KSxBLm1hcCgoW1Usa10pPT5OKCJkaXYiLHtjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6WDcsY2hpbGRyZW46VX0pLGsubWFwKChJKT0+e2xldCBNPXEuaGFzKEkudWRpZCksaD1JLnN0YXRlPT09IkJvb3RlZCI7cmV0dXJuIE4oImRpdiIse3N0eWxlOmc1LG9uTW91c2VFbnRlcjooRSk9PkUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDI1NSwyNTUsMjU1LDAuMDgpIixvbk1vdXNlTGVhdmU6KEUpPT5FLmN1cnJlbnRUYXJnZXQuc3R5bGUuYmFja2dyb3VuZD0idHJhbnNwYXJlbnQiLG9uQ2xpY2s6KCk9PntLKEkpLE8oITEpfSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnA1KGg/IiM0YWRlODAiOiIjNDQ0Iil9KSxOKCJzcGFuIix7c3R5bGU6e2ZsZXg6MX0sY2hpbGRyZW46SS5uYW1lfSksaCYmTigic3BhbiIse3JvbGU6ImJ1dHRvbiIsb25DbGljazooRSk9PntpZihFLnN0b3BQcm9wYWdhdGlvbigpLCFNKVcoSS51ZGlkKX0sc3R5bGU6e2ZvbnRTaXplOjEwLHBhZGRpbmc6IjFweCA2cHgiLGJvcmRlclJhZGl1czo0LGNvbG9yOk0/IiM4ODgiOiIjZjg3MTcxIixiYWNrZ3JvdW5kOk0/InRyYW5zcGFyZW50IjoicmdiYSgyNDgsMTEzLDExMywwLjEpIixjdXJzb3I6TT8iZGVmYXVsdCI6InBvaW50ZXIifSxjaGlsZHJlbjpNPyJTdG9wcGluZy4uLiI6IlN0b3AifSldfSxJLnVkaWQpfSldfSxVKSldfSldfSl9ZnVuY3Rpb24gcDUoWCl7cmV0dXJue3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6WCxmbGV4U2hyaW5rOjB9fWZ1bmN0aW9uIHU2KCl7bGV0IFg9d2luZG93Ll9fU0lNX1BSRVZJRVdfXyxbWixKXT1TKCExKSxbWSxxXT1TKFtdKSxbUSxLXT1TKCExKSxbVyxHXT1TKG51bGwpLFt6LE9dPVMobmV3IFNldCksWyQsX109UyghMSksQT1qKGFzeW5jKCk9PntLKCEwKSxHKG51bGwpO3RyeXtsZXQgRj1hd2FpdCBPMCgieGNydW4gc2ltY3RsIGxpc3QgZGV2aWNlcyBhdmFpbGFibGUgLWoiKTtpZihGLmV4aXRDb2RlIT09MCl0aHJvdyBFcnJvcihGLnN0ZGVycnx8InNpbWN0bCBsaXN0IGZhaWxlZCIpO3EoYzYoRi5zdGRvdXQpKX1jYXRjaChGKXtHKEYgaW5zdGFuY2VvZiBFcnJvcj9GLm1lc3NhZ2U6IkZhaWxlZCB0byBsaXN0IGRldmljZXMiKX1maW5hbGx5e0soITEpfX0sW10pO2lmKHgoKCk9PntBKCl9LFtBXSkseCgoKT0+e2lmKCFYPy5sb2dzRW5kcG9pbnQpcmV0dXJuO2xldCBGPW5ldyBFdmVudFNvdXJjZShYLmxvZ3NFbmRwb2ludCksUj1uZXcgTWFwLHY9WyIjOGJlOWZkIiwiIzUwZmE3YiIsIiNmZmI4NmMiLCIjZmY3OWM2IiwiI2JkOTNmOSIsIiNmMWZhOGMiLCIjNjI3MmE0IiwiI2ZmNTU1NSIsIiM2OWZmOTQiLCIjZDZhY2ZmIiwiI2ZmZmZhNSIsIiNhNGZmZmYiLCIjZmY2ZTZlIiwiI2NhYTlmYSIsIiM1YWY3OGUiXTtmdW5jdGlvbiBUKEowKXtsZXQgeT1SLmdldChKMCk7aWYoIXkpe2xldCBYMD0wO2ZvcihsZXQgYT0wO2E8SjAubGVuZ3RoO2ErKylYMD0oWDA8PDUpLVgwK0owLmNoYXJDb2RlQXQoYSl8MDt5PXZbTWF0aC5hYnMoWDApJXYubGVuZ3RoXSxSLnNldChKMCx5KX1yZXR1cm4geX1sZXQgdT0iIixtPSExO3JldHVybiBGLm9ubWVzc2FnZT0oSjApPT57dHJ5e2xldCB5PUpTT04ucGFyc2UoSjAuZGF0YSksWDA9eS5wcm9jZXNzSW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz95LnNlbmRlckltYWdlUGF0aD8uc3BsaXQoIi8iKS5wb3AoKT8/IiIsYT15LnN1YnN5c3RlbT8/IiIsVjA9eS5jYXRlZ29yeT8/IiIsWTA9eS5ldmVudE1lc3NhZ2U/PyIiO2lmKCFZMClyZXR1cm47aWYoWDAhPT11KXtpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtsZXQgTTA9VChYMCk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke1gwfSR7YT9gICVjJHthfSR7VjA/IjoiK1YwOiIifWA6IiJ9YCxgY29sb3I6JHtNMH07Zm9udC13ZWlnaHQ6Ym9sZGAsLi4uYT9bImNvbG9yOiM4ODg7Zm9udC13ZWlnaHQ6bm9ybWFsIl06W10pLG09ITAsdT1YMH1sZXQgYz0oeS5tZXNzYWdlVHlwZT8/IiIpLnRvTG93ZXJDYXNlKCksbz1hJiZYMD09PXU/YCVjJHtWMHx8YX0lYyBgOiIiLEEwPW8/WyJjb2xvcjojODg4O2ZvbnQtc3R5bGU6aXRhbGljIiwiY29sb3I6aW5oZXJpdCJdOltdO2lmKGM9PT0iZmF1bHQifHxjPT09ImVycm9yIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihjPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojNjI3MmE0Iik7ZWxzZSBjb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjppbmhlcml0Iil9Y2F0Y2h7fX0sKCk9PntpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtGLmNsb3NlKCl9fSxbWD8ubG9nc0VuZHBvaW50XSksIVgpcmV0dXJuIE4oImRpdiIse3N0eWxlOk4wLnBhZ2UsY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6TjAuZW1wdHksY2hpbGRyZW46W04oImgxIix7c3R5bGU6TjAuZW1wdHlUaXRsZSxjaGlsZHJlbjoiTm8gc2VydmUtc2ltIHN0cmVhbSBydW5uaW5nIn0pLE4oInAiLHtzdHlsZTpOMC5lbXB0eUhpbnQsY2hpbGRyZW46WyJCb290IGFuIGlPUyBzaW11bGF0b3IgYW5kIHN0YXJ0IGEgSGF0Y2ggc3RyZWFtIHdpdGgiLCIgIixOKCJjb2RlIix7c3R5bGU6TjAuY29kZSxjaGlsZHJlbjoiYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2gifSksIiwgdGhlbiByZWxvYWQuIl19KV19KX0pO2xldCBDPVkuZmluZCgoRik9PkYudWRpZD09PVguZGV2aWNlKT8/bnVsbCxVPWswKEM/Lm5hbWUpLGs9JDBbVV0sST1rLndpZHRoLTIqay5iZXplbFgsTT1rLmhlaWdodC0yKmsuYmV6ZWxZLGg9ZTAoVSksRT1VPT09InZpc2lvbiI/NTgwOlU9PT0iaXBhZCI/NDAwOlU9PT0id2F0Y2giPzIwMDozMjAsZT1kNihYLnN0cmVhbVVybCksWjA9dyhudWxsKTt4KCgpPT57bGV0IEY9bmV3IFdlYlNvY2tldChYLndzVXJsKTtyZXR1cm4gRi5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsWjAuY3VycmVudD1GLCgpPT57Ri5jbG9zZSgpLFowLmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IGc9aigoRixSKT0+e2xldCB2PVowLmN1cnJlbnQ7aWYoIXZ8fHYucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgVD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoUikpLHU9bmV3IFVpbnQ4QXJyYXkoMStULmxlbmd0aCk7dVswXT1GLHUuc2V0KFQsMSksdi5zZW5kKHUpfSxbXSksSzA9aigoRik9PmcoMyxGKSxbZ10pLHM9aigoRik9PmcoNSxGKSxbZ10pLHI9aigoRik9PmcoNCx7YnV0dG9uOkZ9KSxbZ10pLFUwPWooKEYsUik9PntnKDYse3R5cGU6Rix1c2FnZTpSfSl9LFtnXSksW2owLHYwXT1TKG51bGwpO3goKCk9PntsZXQgRj1uZXcgRXZlbnRTb3VyY2UoIi9hcHBzdGF0ZSIpLFI9bnVsbDtyZXR1cm4gRi5vbm1lc3NhZ2U9KHYpPT57dHJ5e2xldCBUPUpTT04ucGFyc2Uodi5kYXRhKTtpZihSKWNsZWFyVGltZW91dChSKTtsZXQgdT1UPy5pc1JlYWN0TmF0aXZlPzA6NjAwO1I9c2V0VGltZW91dCgoKT0+djAoVCksdSl9Y2F0Y2h7fX0sKCk9PntpZihSKWNsZWFyVGltZW91dChSKTtGLmNsb3NlKCl9fSxbXSk7bGV0IEcwPWooYXN5bmMoKT0+e1UwKCJkb3duIiwyMjcpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoImRvd24iLDIxKSxhd2FpdCBuZXcgUHJvbWlzZSgodik9PnNldFRpbWVvdXQodiwzMCkpLFUwKCJ1cCIsMjEpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoInVwIiwyMjcpfSxbVTBdKTt4KCgpPT57bGV0IEY9KFQsdSk9PntpZihULmNvZGU9PT0iS2V5SCImJlQubWV0YUtleSYmVC5zaGlmdEtleSl7aWYoVC5wcmV2ZW50RGVmYXVsdCgpLHU9PT0iZG93biImJiFULnJlcGVhdClnKDQse2J1dHRvbjoiaG9tZSJ9KTtyZXR1cm59aWYoVC5jb2RlPT09IktleUEiJiZULm1ldGFLZXkmJlQuc2hpZnRLZXkpe2lmKFQucHJldmVudERlZmF1bHQoKSx1PT09ImRvd24iJiYhVC5yZXBlYXQpTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlYCkudGhlbigoSjApPT57bGV0IHk9SjAuc3Rkb3V0LnRyaW0oKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIjtyZXR1cm4gTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlICR7eX1gKX0pLmNhdGNoKCgpPT57fSk7cmV0dXJufWxldCBtPWw2KFQuY29kZSk7aWYobT09bnVsbClyZXR1cm47VC5wcmV2ZW50RGVmYXVsdCgpLGcoNix7dHlwZTp1LHVzYWdlOm19KX0sUj0oVCk9PkYoVCwiZG93biIpLHY9KFQpPT5GKFQsInVwIik7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixSKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLHYpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLFIpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdil9fSxbZyxYLmRldmljZV0pO2xldCBKND1qKGFzeW5jKEYpPT57aWYoJHx8Ri51ZGlkPT09WC5kZXZpY2UpcmV0dXJuO18oITApO3RyeXtpZihGLnN0YXRlIT09IkJvb3RlZCIpYXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBib290ICR7Ri51ZGlkfWApO2F3YWl0IE8wKGBidW54IHNlcnZlLXNpbSAtLWtpbGwgJHtYLmRldmljZX1gKSxhd2FpdCBPMChgYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2ggJHtGLnVkaWR9YCksd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfWNhdGNoe18oITEpfX0sWyQsWC5kZXZpY2VdKSxJMD1qKGFzeW5jKEYpPT57TygoUik9Pm5ldyBTZXQoUikuYWRkKEYpKTt0cnl7YXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBzaHV0ZG93biAke0Z9YCksYXdhaXQgQSgpfWZpbmFsbHl7TygoUik9PntsZXQgdj1uZXcgU2V0KFIpO3JldHVybiB2LmRlbGV0ZShGKSx2fSl9fSxbQV0pO3JldHVybiBOKCJkaXYiLHtzdHlsZTpOMC5wYWdlLGNoaWxkcmVuOltOKHQse2V4ZWM6TzAsZGV2aWNlVWRpZDpYLmRldmljZSxkZXZpY2VOYW1lOkM/Lm5hbWU/P251bGwsZGV2aWNlUnVudGltZTpDPy5ydW50aW1lPz9udWxsLHN0cmVhbWluZzpaLHN0eWxlOnttYXhXaWR0aDpFfSxjaGlsZHJlbjpbTihpNix7ZGV2aWNlczpZLHNlbGVjdGVkVWRpZDpYLmRldmljZSxsb2FkaW5nOlEsZXJyb3I6VyxzdG9wcGluZ1VkaWRzOnosb25SZWZyZXNoOkEsb25TZWxlY3Q6SjQsb25TdG9wOkkwLHRyaWdnZXI6Tih0LlRpdGxlLHt9KX0pLE4odC5BY3Rpb25zLHtjaGlsZHJlbjpbajA/LmlzUmVhY3ROYXRpdmUmJk4odC5CdXR0b24seyJhcmlhLWxhYmVsIjoiUmVsb2FkIFJlYWN0IE5hdGl2ZSBidW5kbGUiLHRpdGxlOiJSZWxvYWQgKENtZCtSKSIsb25DbGljazooKT0+dm9pZCBHMCgpLGNoaWxkcmVuOk4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTMgMTJhOSA5IDAgMSAwIDMuNS03LjEifSksTigicG9seWxpbmUiLHtwb2ludHM6IjMgMyAzIDkgOSA5In0pXX0pfSksTih0LkhvbWVCdXR0b24se29uQ2xpY2s6KEYpPT57Ri5wcmV2ZW50RGVmYXVsdCgpLHIoImhvbWUiKX19KSxOKHQuU2NyZWVuc2hvdEJ1dHRvbix7fSksTih0LlJvdGF0ZUJ1dHRvbix7fSldfSldfSksTigiZGl2Iix7c3R5bGU6e21heFdpZHRoOkUsd2lkdGg6IjEwMCUiLGFzcGVjdFJhdGlvOmAke0l9IC8gJHtNfWB9LGNoaWxkcmVuOk4objAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOmgsY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOkosb25TdHJlYW1Ub3VjaDpLMCxvblN0cmVhbU11bHRpVG91Y2g6cyxvblN0cmVhbUJ1dHRvbjpyLHN1YnNjcmliZUZyYW1lOmUuc3Vic2NyaWJlRnJhbWUsc3RyZWFtRnJhbWU6ZS5mcmFtZSxzdHJlYW1Db25maWc6ZS5jb25maWd9KX0pLE4oImRpdiIse3N0eWxlOk4wLmJhcixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6ey4uLk4wLmxpdmUsY29sb3I6Wj8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnsuLi5OMC5kb3QsYmFja2dyb3VuZDpaPyIjNGFkZTgwIjoiIzY2NiJ9fSksWj8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIE4wPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX0sbzY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiJjYWxjKDEwMCUgKyA2cHgpIixsZWZ0OjAsbWluV2lkdGg6MjYwLG1heEhlaWdodDozNjAsb3ZlcmZsb3dZOiJhdXRvIixiYWNrZ3JvdW5kOiIjMWMxYzFlIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIixib3JkZXJSYWRpdXM6MTAscGFkZGluZzo0LGJveFNoYWRvdzoiMCA4cHggMjRweCByZ2JhKDAsMCwwLDAuNSkiLGZvbnRGYW1pbHk6InVpLW1vbm9zcGFjZSwgbW9ub3NwYWNlIixmb250U2l6ZToxMyxjb2xvcjoiI2VlZSIsekluZGV4OjIwfSxzNj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNnB4IDEwcHgiLGZvbnRTaXplOjExLGNvbG9yOiIjYWFhIn0scjY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjYTViNGZjIixmb250U2l6ZToxMSxjdXJzb3I6InBvaW50ZXIiLHBhZGRpbmc6MH0sdDY9e3BhZGRpbmc6IjZweCAxMHB4Iixjb2xvcjoiI2Y4NzE3MSIsZm9udFNpemU6MTF9LGc1PXtkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo4LHBhZGRpbmc6IjZweCAxMHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4xNXMifSxuNj17aGVpZ2h0OjEsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjA4KSIsbWFyZ2luOiI0cHggMCJ9LGU2PXtwYWRkaW5nOjEyLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGZvbnRTaXplOjExLHRleHRBbGlnbjoiY2VudGVyIn0sWDc9e3BhZGRpbmc6IjZweCAxMHB4IDJweCIsZm9udFNpemU6MTAsZm9udFdlaWdodDo2MDAsY29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsdGV4dFRyYW5zZm9ybToidXBwZXJjYXNlIixsZXR0ZXJTcGFjaW5nOiIwLjA4ZW0ifTtPNShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIoTih1Nix7fSkpOwo8L3NjcmlwdD4KPC9ib2R5PjwvaHRtbD4=","base64").toString("utf-8");return W}function Ie(e){let _=(e?.basePath??"/.sim").replace(/\/+$/,"");return(t,s,i)=>{let S=t.url??"";if(S===_||S===_+"/"){let C=h()[0]??null,$=Me();if(C){let a=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...C,logsEndpoint:_+"/logs"})}</script>`;$=$.replace("<!--__SIM_PREVIEW_CONFIG__-->",a)}s.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),s.end($);return}if(S===_+"/api"){let o=h();s.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),s.end(JSON.stringify(o[0]||null));return}if((S===_+"/exec"||S===_+"/exec/")&&t.method==="POST"){let o="";t.on("data",(C)=>{o+=typeof C==="string"?C:C.toString()}),t.on("end",()=>{let C="";try{C=JSON.parse(o).command??""}catch{}if(!C){s.writeHead(400,{"Content-Type":"application/json"}),s.end(JSON.stringify({stdout:"",stderr:"Missing command",exitCode:1}));return}Oe(C,{maxBuffer:16777216},($,r,a)=>{s.writeHead(200,{"Content-Type":"application/json"}),s.end(JSON.stringify({stdout:r.toString(),stderr:a.toString(),exitCode:$?$.code??1:0}))})});return}if(S===_+"/logs"||S.startsWith(_+"/logs?")){let o=h();if(o.length===0){s.writeHead(404),s.end("No serve-sim device");return}let C=o[0].device;s.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),s.write(`:
3
+ var pe=Object.defineProperty;var De=(e)=>e;function Ee(e,_){this[e]=De.bind(null,_)}var de=(e,_)=>{for(var t in _)pe(e,t,{get:_[t],enumerable:!0,configurable:!0,set:Ee.bind(_,t)})};var Fe=(e,_)=>()=>(e&&(_=e(e=0)),_);var j={};de(j,{simMiddleware:()=>Ie});import{readdirSync as we,readFileSync as ve,existsSync as be,unlinkSync as G}from"fs";import{execSync as he,spawn as x,exec as Oe,execFile as me}from"child_process";import{tmpdir as He}from"os";import{join as q}from"path";function We(e){return!Le.test(e)}function Pe(e,_){if(Ne.has(_))return Promise.resolve(!0);return new Promise((t)=>{me("xcrun",["simctl","get_app_container",e,_,"app"],{timeout:2000},(s,r)=>{if(s)return t(!1);let S=r.trim();if(!S)return t(!1);for(let o of Ve)if(be(q(S,o)))return t(!0);t(!1)})})}function qe(){let e=Date.now();if(b.booted&&e-b.at<1500)return b.booted;try{let _=he("xcrun simctl list devices booted -j",{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:3000}),t=JSON.parse(_),s=new Set;for(let r of Object.values(t.devices))for(let S of r)if(S.state==="Booted")s.add(S.udid);return b={at:e,booted:s},s}catch{return null}}function h(){let e;try{e=we(K).filter((s)=>s.startsWith("server-")&&s.endsWith(".json"))}catch{return[]}let _=qe(),t=[];for(let s of e){let r=q(K,s);try{let S=JSON.parse(ve(r,"utf-8"));try{process.kill(S.pid,0)}catch{try{G(r)}catch{}continue}if(_&&!_.has(S.device)){try{process.kill(S.pid,"SIGTERM")}catch{}try{G(r)}catch{}continue}t.push(S)}catch{}}return t}function Me(){if(!P)P=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYzAsQixqNCxtNSxQMCxiNCx2NCx5NCwkNCxtMCxUMCxwNCxHNCx6NCxXNCxnNCxkMD17fSxhMD1bXSxmNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLGIwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gejAoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVjQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gVzAoWCxaLEope3ZhciBZLHEsUSxLPXt9O2ZvcihRIGluIFopUT09ImtleSI/WT1aW1FdOlE9PSJyZWYiP3E9WltRXTpLW1FdPVpbUV07aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoSy5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YzAuY2FsbChhcmd1bWVudHMsMik6SiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihRIGluIFguZGVmYXVsdFByb3BzKUtbUV09PT12b2lkIDAmJihLW1FdPVguZGVmYXVsdFByb3BzW1FdKTtyZXR1cm4gZjAoWCxLLFkscSxudWxsKX1mdW5jdGlvbiBmMChYLFosSixZLHEpe3ZhciBRPXt0eXBlOlgscHJvcHM6WixrZXk6SixyZWY6WSxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK2o0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmQi52bm9kZSE9bnVsbCYmQi52bm9kZShRKSxRfWZ1bmN0aW9uIGYoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gaShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn1mdW5jdGlvbiBCMChYLFope2lmKFo9PW51bGwpcmV0dXJuIFguX18/QjAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgSjtaPFguX19rLmxlbmd0aDtaKyspaWYoKEo9WC5fX2tbWl0pIT1udWxsJiZKLl9fZSE9bnVsbClyZXR1cm4gSi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/QjAoWCk6bnVsbH1mdW5jdGlvbiBkNShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBaPVguX192LEo9Wi5fX2UsWT1bXSxxPVtdLFE9ejAoe30sWik7US5fX3Y9Wi5fX3YrMSxCLnZub2RlJiZCLnZub2RlKFEpLEg0KFguX19QLFEsWixYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWi5fX3U/W0pdOm51bGwsWSxKPT1udWxsP0IwKFopOkosISEoMzImWi5fX3UpLHEpLFEuX192PVouX192LFEuX18uX19rW1EuX19pXT1RLGY0KFksUSxxKSxaLl9fZT1aLl9fPW51bGwsUS5fX2UhPUomJng0KFEpfX1mdW5jdGlvbiB4NChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFope2lmKFohPW51bGwmJlouX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVouX19lfSkseDQoWCl9ZnVuY3Rpb24gTDQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmUDAucHVzaChYKSYmIWwwLl9fcisrfHxiNCE9Qi5kZWJvdW5jZVJlbmRlcmluZykmJigoYjQ9Qi5kZWJvdW5jZVJlbmRlcmluZyl8fHY0KShsMCl9ZnVuY3Rpb24gbDAoKXt0cnl7Zm9yKHZhciBYLFo9MTtQMC5sZW5ndGg7KVAwLmxlbmd0aD5aJiZQMC5zb3J0KHk0KSxYPVAwLnNoaWZ0KCksWj1QMC5sZW5ndGgsZDUoWCl9ZmluYWxseXtQMC5sZW5ndGg9bDAuX19yPTB9fWZ1bmN0aW9uIGg0KFgsWixKLFkscSxRLEssVyxHLHosTyl7dmFyICQsXyxBLE0sVSxrLEksQz1ZJiZZLl9fa3x8YTAsaD1aLmxlbmd0aDtmb3IoRz1hNShKLFosQyxHLGgpLCQ9MDskPGg7JCsrKShBPUouX19rWyRdKSE9bnVsbCYmKF89QS5fX2khPS0xJiZDW0EuX19pXXx8ZDAsQS5fX2k9JCxrPUg0KFgsQSxfLHEsUSxLLFcsRyx6LE8pLE09QS5fX2UsQS5yZWYmJl8ucmVmIT1BLnJlZiYmKF8ucmVmJiZQNChfLnJlZixudWxsLEEpLE8ucHVzaChBLnJlZixBLl9fY3x8TSxBKSksVT09bnVsbCYmTSE9bnVsbCYmKFU9TSksKEk9ISEoNCZBLl9fdSkpfHxfLl9faz09PUEuX19rPyhHPW00KEEsRyxYLEkpLEkmJl8uX19lJiYoXy5fX2U9bnVsbCkpOnR5cGVvZiBBLnR5cGU9PSJmdW5jdGlvbiImJmshPT12b2lkIDA/Rz1rOk0mJihHPU0ubmV4dFNpYmxpbmcpLEEuX191Jj0tNyk7cmV0dXJuIEouX19lPVUsR31mdW5jdGlvbiBhNShYLFosSixZLHEpe3ZhciBRLEssVyxHLHosTz1KLmxlbmd0aCwkPU8sXz0wO2ZvcihYLl9faz1BcnJheShxKSxRPTA7UTxxO1ErKykoSz1aW1FdKSE9bnVsbCYmdHlwZW9mIEshPSJib29sZWFuIiYmdHlwZW9mIEshPSJmdW5jdGlvbiI/KHR5cGVvZiBLPT0ic3RyaW5nInx8dHlwZW9mIEs9PSJudW1iZXIifHx0eXBlb2YgSz09ImJpZ2ludCJ8fEsuY29uc3RydWN0b3I9PVN0cmluZz9LPVguX19rW1FdPWYwKG51bGwsSyxudWxsLG51bGwsbnVsbCk6YjAoSyk/Sz1YLl9fa1tRXT1mMChmLHtjaGlsZHJlbjpLfSxudWxsLG51bGwsbnVsbCk6Sy5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmSy5fX2I+MD9LPVguX19rW1FdPWYwKEsudHlwZSxLLnByb3BzLEsua2V5LEsucmVmP0sucmVmOm51bGwsSy5fX3YpOlguX19rW1FdPUssRz1RK18sSy5fXz1YLEsuX19iPVguX19iKzEsVz1udWxsLCh6PUsuX19pPWw1KEssSixHLCQpKSE9LTEmJigkLS0sKFc9Slt6XSkmJihXLl9fdXw9MikpLFc9PW51bGx8fFcuX192PT1udWxsPyh6PT0tMSYmKHE+Tz9fLS06cTxPJiZfKyspLHR5cGVvZiBLLnR5cGUhPSJmdW5jdGlvbiImJihLLl9fdXw9NCkpOnohPUcmJih6PT1HLTE/Xy0tOno9PUcrMT9fKys6KHo+Rz9fLS06XysrLEsuX191fD00KSkpOlguX19rW1FdPW51bGw7aWYoJClmb3IoUT0wO1E8TztRKyspKFc9SltRXSkhPW51bGwmJigyJlcuX191KT09MCYmKFcuX19lPT1ZJiYoWT1CMChXKSksYTQoVyxXKSk7cmV0dXJuIFl9ZnVuY3Rpb24gbTQoWCxaLEosWSl7dmFyIHEsUTtpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxRPTA7cSYmUTxxLmxlbmd0aDtRKyspcVtRXSYmKHFbUV0uX189WCxaPW00KHFbUV0sWixKLFkpKTtyZXR1cm4gWn1YLl9fZSE9WiYmKFkmJihaJiZYLnR5cGUmJiFaLnBhcmVudE5vZGUmJihaPUIwKFgpKSxKLmluc2VydEJlZm9yZShYLl9fZSxafHxudWxsKSksWj1YLl9fZSk7ZG8gWj1aJiZaLm5leHRTaWJsaW5nO3doaWxlKFohPW51bGwmJloubm9kZVR5cGU9PTgpO3JldHVybiBafWZ1bmN0aW9uIEwwKFgsWil7cmV0dXJuIFo9Wnx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KGIwKFgpP1guc29tZShmdW5jdGlvbihKKXtMMChKLFopfSk6Wi5wdXNoKFgpKSxafWZ1bmN0aW9uIGw1KFgsWixKLFkpe3ZhciBxLFEsSyxXPVgua2V5LEc9WC50eXBlLHo9WltKXSxPPXohPW51bGwmJigyJnouX191KT09MDtpZih6PT09bnVsbCYmVz09bnVsbHx8TyYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gSjtpZihZPihPPzE6MCkpe2ZvcihxPUotMSxRPUorMTtxPj0wfHxRPFoubGVuZ3RoOylpZigoej1aW0s9cT49MD9xLS06USsrXSkhPW51bGwmJigyJnouX191KT09MCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gS31yZXR1cm4tMX1mdW5jdGlvbiBTNChYLFosSil7WlswXT09Ii0iP1guc2V0UHJvcGVydHkoWixKPT1udWxsPyIiOkopOlhbWl09Sj09bnVsbD8iIjp0eXBlb2YgSiE9Im51bWJlciJ8fGY1LnRlc3QoWik/SjpKKyJweCJ9ZnVuY3Rpb24gaDAoWCxaLEosWSxxKXt2YXIgUSxLO1g6aWYoWj09InN0eWxlIilpZih0eXBlb2YgSj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PUo7ZWxzZXtpZih0eXBlb2YgWT09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9WT0iIiksWSlmb3IoWiBpbiBZKUomJlogaW4gSnx8UzQoWC5zdHlsZSxaLCIiKTtpZihKKWZvcihaIGluIEopWSYmSltaXT09WVtaXXx8UzQoWC5zdHlsZSxaLEpbWl0pfWVsc2UgaWYoWlswXT09Im8iJiZaWzFdPT0ibiIpUT1aIT0oWj1aLnJlcGxhY2UocDQsIiQxIikpLEs9Wi50b0xvd2VyQ2FzZSgpLFo9SyBpbiBYfHxaPT0ib25Gb2N1c091dCJ8fFo9PSJvbkZvY3VzSW4iP0suc2xpY2UoMik6Wi5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtaK1FdPUosSj9ZP0pbVDBdPVlbVDBdOihKW1QwXT1HNCxYLmFkZEV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilaPVoucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWiE9IndpZHRoIiYmWiE9ImhlaWdodCImJlohPSJocmVmIiYmWiE9Imxpc3QiJiZaIT0iZm9ybSImJlohPSJ0YWJJbmRleCImJlohPSJkb3dubG9hZCImJlohPSJyb3dTcGFuIiYmWiE9ImNvbFNwYW4iJiZaIT0icm9sZSImJlohPSJwb3BvdmVyIiYmWiBpbiBYKXRyeXtYW1pdPUo9PW51bGw/IiI6SjticmVhayBYfWNhdGNoKFcpe310eXBlb2YgSj09ImZ1bmN0aW9uInx8KEo9PW51bGx8fEo9PT0hMSYmWls0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFopOlguc2V0QXR0cmlidXRlKFosWj09InBvcG92ZXIiJiZKPT0xPyIiOkopKX19ZnVuY3Rpb24gUjQoWCl7cmV0dXJuIGZ1bmN0aW9uKFope2lmKHRoaXMubCl7dmFyIEo9dGhpcy5sW1oudHlwZStYXTtpZihaW20wXT09bnVsbClaW20wXT1HNCsrO2Vsc2UgaWYoWlttMF08SltUMF0pcmV0dXJuO3JldHVybiBKKEIuZXZlbnQ/Qi5ldmVudChaKTpaKX19fWZ1bmN0aW9uIEg0KFgsWixKLFkscSxRLEssVyxHLHope3ZhciBPLCQsXyxBLE0sVSxrLEksQyxoLEUsZSxaMCx4LEswLHM9Wi50eXBlO2lmKFouY29uc3RydWN0b3IhPT12b2lkIDApcmV0dXJuIG51bGw7MTI4JkouX191JiYoRz0hISgzMiZKLl9fdSksUT1bVz1aLl9fZT1KLl9fZV0pLChPPUIuX19iKSYmTyhaKTtYOmlmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXRyeXtpZihJPVoucHJvcHMsQz1zLnByb3RvdHlwZSYmcy5wcm90b3R5cGUucmVuZGVyLGg9KE89cy5jb250ZXh0VHlwZSkmJllbTy5fX2NdLEU9Tz9oP2gucHJvcHMudmFsdWU6Ty5fXzpZLEouX19jP2s9KCQ9Wi5fX2M9Si5fX2MpLl9fPSQuX19FOihDP1ouX19jPSQ9bmV3IHMoSSxFKTooWi5fX2M9JD1uZXcgaShJLEUpLCQuY29uc3RydWN0b3I9cywkLnJlbmRlcj1pNSksaCYmaC5zdWIoJCksJC5zdGF0ZXx8KCQuc3RhdGU9e30pLCQuX19uPVksXz0kLl9fZD0hMCwkLl9faD1bXSwkLl9zYj1bXSksQyYmJC5fX3M9PW51bGwmJigkLl9fcz0kLnN0YXRlKSxDJiZzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyE9bnVsbCYmKCQuX19zPT0kLnN0YXRlJiYoJC5fX3M9ejAoe30sJC5fX3MpKSx6MCgkLl9fcyxzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhJLCQuX19zKSkpLEE9JC5wcm9wcyxNPSQuc3RhdGUsJC5fX3Y9WixfKUMmJnMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiYkLmNvbXBvbmVudFdpbGxNb3VudCE9bnVsbCYmJC5jb21wb25lbnRXaWxsTW91bnQoKSxDJiYkLmNvbXBvbmVudERpZE1vdW50IT1udWxsJiYkLl9faC5wdXNoKCQuY29tcG9uZW50RGlkTW91bnQpO2Vsc2V7aWYoQyYmcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PW51bGwmJkkhPT1BJiYkLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPW51bGwmJiQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhJLEUpLFouX192PT1KLl9fdnx8ISQuX19lJiYkLnNob3VsZENvbXBvbmVudFVwZGF0ZSE9bnVsbCYmJC5zaG91bGRDb21wb25lbnRVcGRhdGUoSSwkLl9fcyxFKT09PSExKXtaLl9fdiE9Si5fX3YmJigkLnByb3BzPUksJC5zdGF0ZT0kLl9fcywkLl9fZD0hMSksWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssWi5fX2suc29tZShmdW5jdGlvbihyKXtyJiYoci5fXz1aKX0pLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdLCQuX19oLmxlbmd0aCYmSy5wdXNoKCQpO2JyZWFrIFh9JC5jb21wb25lbnRXaWxsVXBkYXRlIT1udWxsJiYkLmNvbXBvbmVudFdpbGxVcGRhdGUoSSwkLl9fcyxFKSxDJiYkLmNvbXBvbmVudERpZFVwZGF0ZSE9bnVsbCYmJC5fX2gucHVzaChmdW5jdGlvbigpeyQuY29tcG9uZW50RGlkVXBkYXRlKEEsTSxVKX0pfWlmKCQuY29udGV4dD1FLCQucHJvcHM9SSwkLl9fUD1YLCQuX19lPSExLGU9Qi5fX3IsWjA9MCxDKSQuc3RhdGU9JC5fX3MsJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdO2Vsc2UgZG8gJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLCQuc3RhdGU9JC5fX3M7d2hpbGUoJC5fX2QmJisrWjA8MjUpOyQuc3RhdGU9JC5fX3MsJC5nZXRDaGlsZENvbnRleHQhPW51bGwmJihZPXowKHowKHt9LFkpLCQuZ2V0Q2hpbGRDb250ZXh0KCkpKSxDJiYhXyYmJC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9bnVsbCYmKFU9JC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShBLE0pKSx4PU8hPW51bGwmJk8udHlwZT09PWYmJk8ua2V5PT1udWxsP2Q0KE8ucHJvcHMuY2hpbGRyZW4pOk8sVz1oNChYLGIwKHgpP3g6W3hdLFosSixZLHEsUSxLLFcsRyx6KSwkLmJhc2U9Wi5fX2UsWi5fX3UmPS0xNjEsJC5fX2gubGVuZ3RoJiZLLnB1c2goJCksayYmKCQuX19FPSQuX189bnVsbCl9Y2F0Y2gocil7aWYoWi5fX3Y9bnVsbCxHfHxRIT1udWxsKWlmKHIudGhlbil7Zm9yKFouX191fD1HPzE2MDoxMjg7VyYmVy5ub2RlVHlwZT09OCYmVy5uZXh0U2libGluZzspVz1XLm5leHRTaWJsaW5nO1FbUS5pbmRleE9mKFcpXT1udWxsLFouX19lPVd9ZWxzZXtmb3IoSzA9US5sZW5ndGg7SzAtLTspVjQoUVtLMF0pO040KFopfWVsc2UgWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssci50aGVufHxONChaKTtCLl9fZShyLFosSil9ZWxzZSBRPT1udWxsJiZaLl9fdj09Si5fX3Y/KFouX19rPUouX19rLFouX19lPUouX19lKTpXPVouX19lPWM1KEouX19lLFosSixZLHEsUSxLLEcseik7cmV0dXJuKE89Qi5kaWZmZWQpJiZPKFopLDEyOCZaLl9fdT92b2lkIDA6V31mdW5jdGlvbiBONChYKXtYJiYoWC5fX2MmJihYLl9fYy5fX2U9ITApLFguX19rJiZYLl9fay5zb21lKE40KSl9ZnVuY3Rpb24gZjQoWCxaLEope2Zvcih2YXIgWT0wO1k8Si5sZW5ndGg7WSsrKVA0KEpbWV0sSlsrK1ldLEpbKytZXSk7Qi5fX2MmJkIuX19jKFosWCksWC5zb21lKGZ1bmN0aW9uKHEpe3RyeXtYPXEuX19oLHEuX19oPVtdLFguc29tZShmdW5jdGlvbihRKXtRLmNhbGwocSl9KX1jYXRjaChRKXtCLl9fZShRLHEuX192KX19KX1mdW5jdGlvbiBkNChYKXtyZXR1cm4gdHlwZW9mIFghPSJvYmplY3QifHxYPT1udWxsfHxYLl9fYj4wP1g6YjAoWCk/WC5tYXAoZDQpOnowKHt9LFgpfWZ1bmN0aW9uIGM1KFgsWixKLFkscSxRLEssVyxHKXt2YXIgeixPLCQsXyxBLE0sVSxrPUoucHJvcHN8fGQwLEk9Wi5wcm9wcyxDPVoudHlwZTtpZihDPT0ic3ZnIj9xPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI6Qz09Im1hdGgiP3E9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiOnF8fChxPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiksUSE9bnVsbCl7Zm9yKHo9MDt6PFEubGVuZ3RoO3orKylpZigoQT1RW3pdKSYmInNldEF0dHJpYnV0ZSJpbiBBPT0hIUMmJihDP0EubG9jYWxOYW1lPT1DOkEubm9kZVR5cGU9PTMpKXtYPUEsUVt6XT1udWxsO2JyZWFrfX1pZihYPT1udWxsKXtpZihDPT1udWxsKXJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShJKTtYPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhxLEMsSS5pcyYmSSksVyYmKEIuX19tJiZCLl9fbShaLFEpLFc9ITEpLFE9bnVsbH1pZihDPT1udWxsKWs9PT1JfHxXJiZYLmRhdGE9PUl8fChYLmRhdGE9SSk7ZWxzZXtpZihRPVEmJmMwLmNhbGwoWC5jaGlsZE5vZGVzKSwhVyYmUSE9bnVsbClmb3Ioaz17fSx6PTA7ejxYLmF0dHJpYnV0ZXMubGVuZ3RoO3orKylrWyhBPVguYXR0cmlidXRlc1t6XSkubmFtZV09QS52YWx1ZTtmb3IoeiBpbiBrKUE9a1t6XSx6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyQ9QTp6PT0iY2hpbGRyZW4ifHwoeiBpbiBJKXx8ej09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSSl8fHo9PSJjaGVja2VkIiYmKCJkZWZhdWx0Q2hlY2tlZCJpbiBJKXx8aDAoWCx6LG51bGwsQSxxKTtmb3IoeiBpbiBJKUE9SVt6XSx6PT0iY2hpbGRyZW4iP189QTp6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP089QTp6PT0idmFsdWUiP009QTp6PT0iY2hlY2tlZCI/VT1BOlcmJnR5cGVvZiBBIT0iZnVuY3Rpb24ifHxrW3pdPT09QXx8aDAoWCx6LEEsa1t6XSxxKTtpZihPKVd8fCQmJihPLl9faHRtbD09JC5fX2h0bWx8fE8uX19odG1sPT1YLmlubmVySFRNTCl8fChYLmlubmVySFRNTD1PLl9faHRtbCksWi5fX2s9W107ZWxzZSBpZigkJiYoWC5pbm5lckhUTUw9IiIpLGg0KFoudHlwZT09InRlbXBsYXRlIj9YLmNvbnRlbnQ6WCxiMChfKT9fOltfXSxaLEosWSxDPT0iZm9yZWlnbk9iamVjdCI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOnEsUSxLLFE/UVswXTpKLl9fayYmQjAoSiwwKSxXLEcpLFEhPW51bGwpZm9yKHo9US5sZW5ndGg7ei0tOylWNChRW3pdKTtXfHwoej0idmFsdWUiLEM9PSJwcm9ncmVzcyImJk09PW51bGw/WC5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik6TSE9bnVsbCYmKE0hPT1YW3pdfHxDPT0icHJvZ3Jlc3MiJiYhTXx8Qz09Im9wdGlvbiImJk0hPWtbel0pJiZoMChYLHosTSxrW3pdLHEpLHo9ImNoZWNrZWQiLFUhPW51bGwmJlUhPVhbel0mJmgwKFgseixVLGtbel0scSkpfXJldHVybiBYfWZ1bmN0aW9uIFA0KFgsWixKKXt0cnl7aWYodHlwZW9mIFg9PSJmdW5jdGlvbiIpe3ZhciBZPXR5cGVvZiBYLl9fdT09ImZ1bmN0aW9uIjtZJiZYLl9fdSgpLFkmJlo9PW51bGx8fChYLl9fdT1YKFopKX1lbHNlIFguY3VycmVudD1afWNhdGNoKHEpe0IuX19lKHEsSil9fWZ1bmN0aW9uIGE0KFgsWixKKXt2YXIgWSxxO2lmKEIudW5tb3VudCYmQi51bm1vdW50KFgpLChZPVgucmVmKSYmKFkuY3VycmVudCYmWS5jdXJyZW50IT1YLl9fZXx8UDQoWSxudWxsLFopKSwoWT1YLl9fYykhPW51bGwpe2lmKFkuY29tcG9uZW50V2lsbFVubW91bnQpdHJ5e1kuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChRKXtCLl9fZShRLFopfVkuYmFzZT1ZLl9fUD1udWxsfWlmKFk9WC5fX2spZm9yKHE9MDtxPFkubGVuZ3RoO3ErKylZW3FdJiZhNChZW3FdLFosSnx8dHlwZW9mIFgudHlwZSE9ImZ1bmN0aW9uIik7Snx8VjQoWC5fX2UpLFguX19jPVguX189WC5fX2U9dm9pZCAwfWZ1bmN0aW9uIGk1KFgsWixKKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcihYLEopfWZ1bmN0aW9uIGkwKFgsWixKKXt2YXIgWSxxLFEsSztaPT1kb2N1bWVudCYmKFo9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSxCLl9fJiZCLl9fKFgsWikscT0oWT10eXBlb2YgSj09ImZ1bmN0aW9uIik/bnVsbDpKJiZKLl9fa3x8Wi5fX2ssUT1bXSxLPVtdLEg0KFosWD0oIVkmJkp8fFopLl9faz1XMChmLG51bGwsW1hdKSxxfHxkMCxkMCxaLm5hbWVzcGFjZVVSSSwhWSYmSj9bSl06cT9udWxsOlouZmlyc3RDaGlsZD9jMC5jYWxsKFouY2hpbGROb2Rlcyk6bnVsbCxRLCFZJiZKP0o6cT9xLl9fZTpaLmZpcnN0Q2hpbGQsWSxLKSxmNChRLFgsSyl9ZnVuY3Rpb24gXzAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWSxxO3JldHVybiB0aGlzLmdldENoaWxkQ29udGV4dHx8KFk9bmV3IFNldCwocT17fSlbWi5fX2NdPXRoaXMsdGhpcy5nZXRDaGlsZENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcX0sdGhpcy5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1k9bnVsbH0sdGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oUSl7dGhpcy5wcm9wcy52YWx1ZSE9US52YWx1ZSYmWS5mb3JFYWNoKGZ1bmN0aW9uKEspe0suX19lPSEwLEw0KEspfSl9LHRoaXMuc3ViPWZ1bmN0aW9uKFEpe1kuYWRkKFEpO3ZhciBLPVEuY29tcG9uZW50V2lsbFVubW91bnQ7US5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1kmJlkuZGVsZXRlKFEpLEsmJksuY2FsbChRKX19KSxKLmNoaWxkcmVufXJldHVybiBaLl9fYz0iX19jQyIrZzQrKyxaLl9fPVgsWi5Qcm92aWRlcj1aLl9fbD0oWi5Db25zdW1lcj1mdW5jdGlvbihKLFkpe3JldHVybiBKLmNoaWxkcmVuKFkpfSkuY29udGV4dFR5cGU9WixafWMwPWEwLnNsaWNlLEI9e19fZTpmdW5jdGlvbihYLFosSixZKXtmb3IodmFyIHEsUSxLO1o9Wi5fXzspaWYoKHE9Wi5fX2MpJiYhcS5fXyl0cnl7aWYoKFE9cS5jb25zdHJ1Y3RvcikmJlEuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT1udWxsJiYocS5zZXRTdGF0ZShRLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihYKSksSz1xLl9fZCkscS5jb21wb25lbnREaWRDYXRjaCE9bnVsbCYmKHEuY29tcG9uZW50RGlkQ2F0Y2goWCxZfHx7fSksSz1xLl9fZCksSylyZXR1cm4gcS5fX0U9cX1jYXRjaChXKXtYPVd9dGhyb3cgWH19LGo0PTAsbTU9ZnVuY3Rpb24oWCl7cmV0dXJuIFghPW51bGwmJlguY29uc3RydWN0b3I9PT12b2lkIDB9LGkucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKFgsWil7dmFyIEo7Sj10aGlzLl9fcyE9bnVsbCYmdGhpcy5fX3MhPXRoaXMuc3RhdGU/dGhpcy5fX3M6dGhpcy5fX3M9ejAoe30sdGhpcy5zdGF0ZSksdHlwZW9mIFg9PSJmdW5jdGlvbiImJihYPVgoejAoe30sSiksdGhpcy5wcm9wcykpLFgmJnowKEosWCksWCE9bnVsbCYmdGhpcy5fX3YmJihaJiZ0aGlzLl9zYi5wdXNoKFopLEw0KHRoaXMpKX0saS5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oWCl7dGhpcy5fX3YmJih0aGlzLl9fZT0hMCxYJiZ0aGlzLl9faC5wdXNoKFgpLEw0KHRoaXMpKX0saS5wcm90b3R5cGUucmVuZGVyPWYsUDA9W10sdjQ9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTpzZXRUaW1lb3V0LHk0PWZ1bmN0aW9uKFgsWil7cmV0dXJuIFguX192Ll9fYi1aLl9fdi5fX2J9LGwwLl9fcj0wLCQ0PU1hdGgucmFuZG9tKCkudG9TdHJpbmcoOCksbTA9Il9fZCIrJDQsVDA9Il9fYSIrJDQscDQ9LyhQb2ludGVyQ2FwdHVyZSkkfENhcHR1cmUkL2ksRzQ9MCx6ND1SNCghMSksVzQ9UjQoITApLGc0PTA7dmFyIEYwLHAsTzQsbDQsUzA9MCxuND1bXSxkPUIsYzQ9ZC5fX2IsaTQ9ZC5fX3IsdTQ9ZC5kaWZmZWQsbzQ9ZC5fX2MsczQ9ZC51bm1vdW50LHI0PWQuX187ZnVuY3Rpb24gbzAoWCxaKXtkLl9faCYmZC5fX2gocCxYLFMwfHxaKSxTMD0wO3ZhciBKPXAuX19IfHwocC5fX0g9e19fOltdLF9faDpbXX0pO3JldHVybiBYPj1KLl9fLmxlbmd0aCYmSi5fXy5wdXNoKHt9KSxKLl9fW1hdfWZ1bmN0aW9uIFMoWCl7cmV0dXJuIFMwPTEsQTQoWDUsWCl9ZnVuY3Rpb24gQTQoWCxaLEope3ZhciBZPW8wKEYwKyssMik7aWYoWS50PVgsIVkuX19jJiYoWS5fXz1bSj9KKFopOlg1KHZvaWQgMCxaKSxmdW5jdGlvbihXKXt2YXIgRz1ZLl9fTj9ZLl9fTlswXTpZLl9fWzBdLHo9WS50KEcsVyk7RyE9PXomJihZLl9fTj1beixZLl9fWzFdXSxZLl9fYy5zZXRTdGF0ZSh7fSkpfV0sWS5fX2M9cCwhcC5fX2YpKXt2YXIgcT1mdW5jdGlvbihXLEcseil7aWYoIVkuX19jLl9fSClyZXR1cm4hMDt2YXIgTz1ZLl9fYy5fX0guX18uZmlsdGVyKGZ1bmN0aW9uKF8pe3JldHVybiBfLl9fY30pO2lmKE8uZXZlcnkoZnVuY3Rpb24oXyl7cmV0dXJuIV8uX19OfSkpcmV0dXJuIVF8fFEuY2FsbCh0aGlzLFcsRyx6KTt2YXIgJD1ZLl9fYy5wcm9wcyE9PVc7cmV0dXJuIE8uc29tZShmdW5jdGlvbihfKXtpZihfLl9fTil7dmFyIEE9Xy5fX1swXTtfLl9fPV8uX19OLF8uX19OPXZvaWQgMCxBIT09Xy5fX1swXSYmKCQ9ITApfX0pLFEmJlEuY2FsbCh0aGlzLFcsRyx6KXx8JH07cC5fX2Y9ITA7dmFye3Nob3VsZENvbXBvbmVudFVwZGF0ZTpRLGNvbXBvbmVudFdpbGxVcGRhdGU6S309cDtwLmNvbXBvbmVudFdpbGxVcGRhdGU9ZnVuY3Rpb24oVyxHLHope2lmKHRoaXMuX19lKXt2YXIgTz1RO1E9dm9pZCAwLHEoVyxHLHopLFE9T31LJiZLLmNhbGwodGhpcyxXLEcseil9LHAuc2hvdWxkQ29tcG9uZW50VXBkYXRlPXF9cmV0dXJuIFkuX19OfHxZLl9ffWZ1bmN0aW9uIGcoWCxaKXt2YXIgSj1vMChGMCsrLDMpOyFkLl9fcyYmZTQoSi5fX0gsWikmJihKLl9fPVgsSi51PVoscC5fX0guX19oLnB1c2goSikpfWZ1bmN0aW9uIHcoWCl7cmV0dXJuIFMwPTUsczAoZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpYfX0sW10pfWZ1bmN0aW9uIHMwKFgsWil7dmFyIEo9bzAoRjArKyw3KTtyZXR1cm4gZTQoSi5fX0gsWikmJihKLl9fPVgoKSxKLl9fSD1aLEouX19oPVgpLEouX199ZnVuY3Rpb24gaihYLFope3JldHVybiBTMD04LHMwKGZ1bmN0aW9uKCl7cmV0dXJuIFh9LFopfWZ1bmN0aW9uIFIwKFgpe3ZhciBaPXAuY29udGV4dFtYLl9fY10sSj1vMChGMCsrLDkpO3JldHVybiBKLmM9WCxaPyhKLl9fPT1udWxsJiYoSi5fXz0hMCxaLnN1YihwKSksWi5wcm9wcy52YWx1ZSk6WC5fX31mdW5jdGlvbiB1NSgpe2Zvcih2YXIgWDtYPW40LnNoaWZ0KCk7KXt2YXIgWj1YLl9fSDtpZihYLl9fUCYmWil0cnl7Wi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W119Y2F0Y2goSil7Wi5fX2g9W10sZC5fX2UoSixYLl9fdil9fX1kLl9fYj1mdW5jdGlvbihYKXtwPW51bGwsYzQmJmM0KFgpfSxkLl9fPWZ1bmN0aW9uKFgsWil7WCYmWi5fX2smJlouX19rLl9fbSYmKFguX19tPVouX19rLl9fbSkscjQmJnI0KFgsWil9LGQuX19yPWZ1bmN0aW9uKFgpe2k0JiZpNChYKSxGMD0wO3ZhciBaPShwPVguX19jKS5fX0g7WiYmKE80PT09cD8oWi5fX2g9W10scC5fX2g9W10sWi5fXy5zb21lKGZ1bmN0aW9uKEope0ouX19OJiYoSi5fXz1KLl9fTiksSi51PUouX19OPXZvaWQgMH0pKTooWi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W10sRjA9MCkpLE80PXB9LGQuZGlmZmVkPWZ1bmN0aW9uKFgpe3U0JiZ1NChYKTt2YXIgWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9faC5sZW5ndGgmJihuNC5wdXNoKFopIT09MSYmbDQ9PT1kLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KChsND1kLnJlcXVlc3RBbmltYXRpb25GcmFtZSl8fG81KSh1NSkpLFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7Si51JiYoSi5fX0g9Si51KSxKLnU9dm9pZCAwfSkpLE80PXA9bnVsbH0sZC5fX2M9ZnVuY3Rpb24oWCxaKXtaLnNvbWUoZnVuY3Rpb24oSil7dHJ5e0ouX19oLnNvbWUodTApLEouX19oPUouX19oLmZpbHRlcihmdW5jdGlvbihZKXtyZXR1cm4hWS5fX3x8VTQoWSl9KX1jYXRjaChZKXtaLnNvbWUoZnVuY3Rpb24ocSl7cS5fX2gmJihxLl9faD1bXSl9KSxaPVtdLGQuX19lKFksSi5fX3YpfX0pLG80JiZvNChYLFopfSxkLnVubW91bnQ9ZnVuY3Rpb24oWCl7czQmJnM0KFgpO3ZhciBaLEo9WC5fX2M7SiYmSi5fX0gmJihKLl9fSC5fXy5zb21lKGZ1bmN0aW9uKFkpe3RyeXt1MChZKX1jYXRjaChxKXtaPXF9fSksSi5fX0g9dm9pZCAwLFomJmQuX19lKFosSi5fX3YpKX07dmFyIHQ0PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiI7ZnVuY3Rpb24gbzUoWCl7dmFyIFosSj1mdW5jdGlvbigpe2NsZWFyVGltZW91dChZKSx0NCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoWiksc2V0VGltZW91dChYKX0sWT1zZXRUaW1lb3V0KEosMzUpO3Q0JiYoWj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoSikpfWZ1bmN0aW9uIHUwKFgpe3ZhciBaPXAsSj1YLl9fYzt0eXBlb2YgSj09ImZ1bmN0aW9uIiYmKFguX19jPXZvaWQgMCxKKCkpLHA9Wn1mdW5jdGlvbiBVNChYKXt2YXIgWj1wO1guX19jPVguX18oKSxwPVp9ZnVuY3Rpb24gZTQoWCxaKXtyZXR1cm4hWHx8WC5sZW5ndGghPT1aLmxlbmd0aHx8Wi5zb21lKGZ1bmN0aW9uKEosWSl7cmV0dXJuIEohPT1YW1ldfSl9ZnVuY3Rpb24gWDUoWCxaKXtyZXR1cm4gdHlwZW9mIFo9PSJmdW5jdGlvbiI/WihYKTpafWZ1bmN0aW9uIFo2KFgsWil7Zm9yKHZhciBKIGluIFopWFtKXT1aW0pdO3JldHVybiBYfWZ1bmN0aW9uIFo1KFgsWil7Zm9yKHZhciBKIGluIFgpaWYoSiE9PSJfX3NvdXJjZSImJiEoSiBpbiBaKSlyZXR1cm4hMDtmb3IodmFyIFkgaW4gWilpZihZIT09Il9fc291cmNlIiYmWFtZXSE9PVpbWV0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gSjUoWCxaKXt0aGlzLnByb3BzPVgsdGhpcy5jb250ZXh0PVp9KEo1LnByb3RvdHlwZT1uZXcgaSkuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITAsSjUucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihYLFope3JldHVybiBaNSh0aGlzLnByb3BzLFgpfHxaNSh0aGlzLnN0YXRlLFopfTt2YXIgWTU9Qi5fX2I7Qi5fX2I9ZnVuY3Rpb24oWCl7WC50eXBlJiZYLnR5cGUuX19mJiZYLnJlZiYmKFgucHJvcHMucmVmPVgucmVmLFgucmVmPW51bGwpLFk1JiZZNShYKX07dmFyIEo2PUIuX19lO0IuX19lPWZ1bmN0aW9uKFgsWixKLFkpe2lmKFgudGhlbil7Zm9yKHZhciBxLFE9WjtRPVEuX187KWlmKChxPVEuX19jKSYmcS5fX2MpcmV0dXJuIFouX19lPT1udWxsJiYoWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2spLHEuX19jKFgsWil9SjYoWCxaLEosWSl9O3ZhciBxNT1CLnVubW91bnQ7ZnVuY3Rpb24gTDUoWCxaLEope3JldHVybiBYJiYoWC5fX2MmJlguX19jLl9fSCYmKFguX19jLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKFkpe3R5cGVvZiBZLl9fYz09ImZ1bmN0aW9uIiYmWS5fX2MoKX0pLFguX19jLl9fSD1udWxsKSwoWD1aNih7fSxYKSkuX19jIT1udWxsJiYoWC5fX2MuX19QPT09SiYmKFguX19jLl9fUD1aKSxYLl9fYy5fX2U9ITAsWC5fX2M9bnVsbCksWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihZKXtyZXR1cm4gTDUoWSxaLEopfSkpLFh9ZnVuY3Rpb24gTjUoWCxaLEope3JldHVybiBYJiZKJiYoWC5fX3Y9bnVsbCxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBONShZLFosSil9KSxYLl9fYyYmWC5fX2MuX19QPT09WiYmKFguX19lJiZKLmFwcGVuZENoaWxkKFguX19lKSxYLl9fYy5fX2U9ITAsWC5fX2MuX19QPUopKSxYfWZ1bmN0aW9uIEI0KCl7dGhpcy5fX3U9MCx0aGlzLm89bnVsbCx0aGlzLl9fYj1udWxsfWZ1bmN0aW9uIEc1KFgpe3ZhciBaPVguX18mJlguX18uX19jO3JldHVybiBaJiZaLl9fYSYmWi5fX2EoWCl9ZnVuY3Rpb24gcjAoKXt0aGlzLmk9bnVsbCx0aGlzLmw9bnVsbH1CLnVubW91bnQ9ZnVuY3Rpb24oWCl7dmFyIFo9WC5fX2M7WiYmKFouX196PSEwKSxaJiZaLl9fUiYmWi5fX1IoKSxaJiYzMiZYLl9fdSYmKFgudHlwZT1udWxsKSxxNSYmcTUoWCl9LChCNC5wcm90b3R5cGU9bmV3IGkpLl9fYz1mdW5jdGlvbihYLFope3ZhciBKPVouX19jLFk9dGhpcztZLm89PW51bGwmJihZLm89W10pLFkuby5wdXNoKEopO3ZhciBxPUc1KFkuX192KSxRPSExLEs9ZnVuY3Rpb24oKXtRfHxZLl9fenx8KFE9ITAsSi5fX1I9bnVsbCxxP3EoRyk6RygpKX07Si5fX1I9Szt2YXIgVz1KLl9fUDtKLl9fUD1udWxsO3ZhciBHPWZ1bmN0aW9uKCl7aWYoIS0tWS5fX3Upe2lmKFkuc3RhdGUuX19hKXt2YXIgej1ZLnN0YXRlLl9fYTtZLl9fdi5fX2tbMF09TjUoeix6Ll9fYy5fX1Asei5fX2MuX19PKX12YXIgTztmb3IoWS5zZXRTdGF0ZSh7X19hOlkuX19iPW51bGx9KTtPPVkuby5wb3AoKTspTy5fX1A9VyxPLmZvcmNlVXBkYXRlKCl9fTtZLl9fdSsrfHwzMiZaLl9fdXx8WS5zZXRTdGF0ZSh7X19hOlkuX19iPVkuX192Ll9fa1swXX0pLFgudGhlbihLLEspfSxCNC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLm89W119LEI0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCxaKXtpZih0aGlzLl9fYil7aWYodGhpcy5fX3YuX19rKXt2YXIgSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxZPXRoaXMuX192Ll9fa1swXS5fX2M7dGhpcy5fX3YuX19rWzBdPUw1KHRoaXMuX19iLEosWS5fX089WS5fX1ApfXRoaXMuX19iPW51bGx9dmFyIHE9Wi5fX2EmJlcwKGYsbnVsbCxYLmZhbGxiYWNrKTtyZXR1cm4gcSYmKHEuX191Jj0tMzMpLFtXMChmLG51bGwsWi5fX2E/bnVsbDpYLmNoaWxkcmVuKSxxXX07dmFyIFE1PWZ1bmN0aW9uKFgsWixKKXtpZigrK0pbMV09PT1KWzBdJiZYLmwuZGVsZXRlKFopLFgucHJvcHMucmV2ZWFsT3JkZXImJihYLnByb3BzLnJldmVhbE9yZGVyWzBdIT09InQifHwhWC5sLnNpemUpKWZvcihKPVguaTtKOyl7Zm9yKDtKLmxlbmd0aD4zOylKLnBvcCgpKCk7aWYoSlsxXTxKWzBdKWJyZWFrO1guaT1KPUpbMl19fTsocjAucHJvdG90eXBlPW5ldyBpKS5fX2E9ZnVuY3Rpb24oWCl7dmFyIFo9dGhpcyxKPUc1KFouX192KSxZPVoubC5nZXQoWCk7cmV0dXJuIFlbMF0rKyxmdW5jdGlvbihxKXt2YXIgUT1mdW5jdGlvbigpe1oucHJvcHMucmV2ZWFsT3JkZXI/KFkucHVzaChxKSxRNShaLFgsWSkpOnEoKX07Sj9KKFEpOlEoKX19LHIwLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCl7dGhpcy5pPW51bGwsdGhpcy5sPW5ldyBNYXA7dmFyIFo9TDAoWC5jaGlsZHJlbik7WC5yZXZlYWxPcmRlciYmWC5yZXZlYWxPcmRlclswXT09PSJiIiYmWi5yZXZlcnNlKCk7Zm9yKHZhciBKPVoubGVuZ3RoO0otLTspdGhpcy5sLnNldChaW0pdLHRoaXMuaT1bMSwwLHRoaXMuaV0pO3JldHVybiBYLmNoaWxkcmVufSxyMC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPXIwLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBYPXRoaXM7dGhpcy5sLmZvckVhY2goZnVuY3Rpb24oWixKKXtRNShYLEosWil9KX07dmFyIFk2PXR5cGVvZiBTeW1ib2w8InUiJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzLHE2PS9eKD86YWNjZW50fGFsaWdubWVudHxhcmFiaWN8YmFzZWxpbmV8Y2FwfGNsaXAoPyFQYXRoVSl8Y29sb3J8ZG9taW5hbnR8ZmlsbHxmbG9vZHxmb250fGdseXBoKD8hUil8aG9yaXp8aW1hZ2UoIVMpfGxldHRlcnxsaWdodGluZ3xtYXJrZXIoPyFIfFd8VSl8b3ZlcmxpbmV8cGFpbnR8cG9pbnRlcnxzaGFwZXxzdG9wfHN0cmlrZXRocm91Z2h8c3Ryb2tlfHRleHQoPyFMKXx0cmFuc2Zvcm18dW5kZXJsaW5lfHVuaWNvZGV8dW5pdHN8dnx2ZWN0b3J8dmVydHx3b3JkfHdyaXRpbmd8eCg/IUMpKVtBLVpdLyxRNj0vXm9uKEFuaXxUcmF8VG91fEJlZm9yZUlucHxDb21wbykvLEs2PS9bQS1aMC05XS9nLCQ2PXR5cGVvZiBkb2N1bWVudDwidSIsejY9ZnVuY3Rpb24oWCl7cmV0dXJuKHR5cGVvZiBTeW1ib2w8InUiJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiPy9maWx8Y2hlfHJhZC86L2ZpbHxjaGV8cmEvKS50ZXN0KFgpfTtmdW5jdGlvbiBWNShYLFosSil7cmV0dXJuIFouX19rPT1udWxsJiYoWi50ZXh0Q29udGVudD0iIiksaTAoWCxaKSx0eXBlb2YgSj09ImZ1bmN0aW9uIiYmSigpLFg/WC5fX2M6bnVsbH1pLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PSEwLFsiY29tcG9uZW50V2lsbE1vdW50IiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsImNvbXBvbmVudFdpbGxVcGRhdGUiXS5mb3JFYWNoKGZ1bmN0aW9uKFgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnByb3RvdHlwZSxYLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbIlVOU0FGRV8iK1hdfSxzZXQ6ZnVuY3Rpb24oWil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsWCx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlp9KX19KX0pO3ZhciBLNT1CLmV2ZW50O0IuZXZlbnQ9ZnVuY3Rpb24oWCl7cmV0dXJuIEs1JiYoWD1LNShYKSksWC5wZXJzaXN0PWZ1bmN0aW9uKCl7fSxYLmlzUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuY2VsQnViYmxlfSxYLmlzRGVmYXVsdFByZXZlbnRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlZmF1bHRQcmV2ZW50ZWR9LFgubmF0aXZlRXZlbnQ9WH07dmFyIEg1LFc2PXtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xhc3N9fSwkNT1CLnZub2RlO0Iudm5vZGU9ZnVuY3Rpb24oWCl7dHlwZW9mIFgudHlwZT09InN0cmluZyImJmZ1bmN0aW9uKFope3Zhcntwcm9wczpKLHR5cGU6WX09WixxPXt9LFE9WS5pbmRleE9mKCItIik9PS0xO2Zvcih2YXIgSyBpbiBKKXt2YXIgVz1KW0tdO2lmKCEoSz09PSJ2YWx1ZSImJigiZGVmYXVsdFZhbHVlImluIEopJiZXPT1udWxsfHwkNiYmSz09PSJjaGlsZHJlbiImJlk9PT0ibm9zY3JpcHQifHxLPT09ImNsYXNzInx8Sz09PSJjbGFzc05hbWUiKSl7dmFyIEc9Sy50b0xvd2VyQ2FzZSgpO0s9PT0iZGVmYXVsdFZhbHVlIiYmInZhbHVlImluIEomJkoudmFsdWU9PW51bGw/Sz0idmFsdWUiOks9PT0iZG93bmxvYWQiJiZXPT09ITA/Vz0iIjpHPT09InRyYW5zbGF0ZSImJlc9PT0ibm8iP1c9ITE6R1swXT09PSJvIiYmR1sxXT09PSJuIj9HPT09Im9uZG91YmxlY2xpY2siP0s9Im9uZGJsY2xpY2siOkchPT0ib25jaGFuZ2UifHxZIT09ImlucHV0IiYmWSE9PSJ0ZXh0YXJlYSJ8fHo2KEoudHlwZSk/Rz09PSJvbmZvY3VzIj9LPSJvbmZvY3VzaW4iOkc9PT0ib25ibHVyIj9LPSJvbmZvY3Vzb3V0IjpRNi50ZXN0KEspJiYoSz1HKTpHPUs9Im9uaW5wdXQiOlEmJnE2LnRlc3QoSyk/Sz1LLnJlcGxhY2UoSzYsIi0kJiIpLnRvTG93ZXJDYXNlKCk6Vz09PW51bGwmJihXPXZvaWQgMCksRz09PSJvbmlucHV0IiYmcVtLPUddJiYoSz0ib25pbnB1dENhcHR1cmUiKSxxW0tdPVd9fVk9PSJzZWxlY3QiJiYocS5tdWx0aXBsZSYmQXJyYXkuaXNBcnJheShxLnZhbHVlKSYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEudmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTF9KSkscS5kZWZhdWx0VmFsdWUhPW51bGwmJihxLnZhbHVlPUwwKEouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oeil7ei5wcm9wcy5zZWxlY3RlZD1xLm11bHRpcGxlP3EuZGVmYXVsdFZhbHVlLmluZGV4T2Yoei5wcm9wcy52YWx1ZSkhPS0xOnEuZGVmYXVsdFZhbHVlPT16LnByb3BzLnZhbHVlfSkpKSxKLmNsYXNzJiYhSi5jbGFzc05hbWU/KHEuY2xhc3M9Si5jbGFzcyxPYmplY3QuZGVmaW5lUHJvcGVydHkocSwiY2xhc3NOYW1lIixXNikpOkouY2xhc3NOYW1lJiYocS5jbGFzcz1xLmNsYXNzTmFtZT1KLmNsYXNzTmFtZSksWi5wcm9wcz1xfShYKSxYLiQkdHlwZW9mPVk2LCQ1JiYkNShYKX07dmFyIHo1PUIuX19yO0IuX19yPWZ1bmN0aW9uKFgpe3o1JiZ6NShYKSxINT1YLl9fY307dmFyIFc1PUIuZGlmZmVkO0IuZGlmZmVkPWZ1bmN0aW9uKFgpe1c1JiZXNShYKTt2YXJ7cHJvcHM6WixfX2U6Sn09WDtKIT1udWxsJiZYLnR5cGU9PT0idGV4dGFyZWEiJiYidmFsdWUiaW4gWiYmWi52YWx1ZSE9PUoudmFsdWUmJihKLnZhbHVlPVoudmFsdWU9PW51bGw/IiI6Wi52YWx1ZSksSDU9bnVsbH07ZnVuY3Rpb24gUDUoWCl7cmV0dXJuISFYLl9fayYmKGkwKG51bGwsWCksITApfWZ1bmN0aW9uIE81KFgpe3JldHVybntyZW5kZXI6ZnVuY3Rpb24oWil7VjUoWixYKX0sdW5tb3VudDpmdW5jdGlvbigpe1A1KFgpfX19ZnVuY3Rpb24gQzUoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVTUoWCxaKXtmb3IodmFyIEogaW4gWClpZihKIT09Il9fc291cmNlIiYmIShKIGluIFopKXJldHVybiEwO2Zvcih2YXIgWSBpbiBaKWlmKFkhPT0iX19zb3VyY2UiJiZYW1ldIT09WltZXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBBNShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn0oQTUucHJvdG90eXBlPW5ldyBpKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxBNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWil7cmV0dXJuIFU1KHRoaXMucHJvcHMsWCl8fFU1KHRoaXMuc3RhdGUsWil9O3ZhciBCNT1CLl9fYjtCLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksQjUmJkI1KFgpfTt2YXIgTDY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIil8fDM5MTE7ZnVuY3Rpb24gRDAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWT1DNSh7fSxKKTtyZXR1cm4gZGVsZXRlIFkucmVmLFgoWSxKLnJlZnx8bnVsbCl9cmV0dXJuIFouJCR0eXBlb2Y9TDYsWi5yZW5kZXI9WCxaLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PVouX19mPSEwLFouZGlzcGxheU5hbWU9IkZvcndhcmRSZWYoIisoWC5kaXNwbGF5TmFtZXx8WC5uYW1lKSsiKSIsWn12YXIgTjY9Qi5fX2U7Qi5fX2U9ZnVuY3Rpb24oWCxaLEosWSl7aWYoWC50aGVuKXtmb3IodmFyIHEsUT1aO1E9US5fXzspaWYoKHE9US5fX2MpJiZxLl9fYylyZXR1cm4gWi5fX2U9PW51bGwmJihaLl9fZT1KLl9fZSxaLl9faz1KLl9faykscS5fX2MoWCxaKX1ONihYLFosSixZKX07dmFyIF81PUIudW5tb3VudDtmdW5jdGlvbiBFNShYLFosSil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oWSl7dHlwZW9mIFkuX19jPT0iZnVuY3Rpb24iJiZZLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPUM1KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1KJiYoWC5fX2MuX19QPVopLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBFNShZLFosSil9KSksWH1mdW5jdGlvbiB3NShYLFosSil7cmV0dXJuIFgmJkomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oWSl7cmV0dXJuIHc1KFksWixKKX0pLFguX19jJiZYLl9fYy5fX1A9PT1aJiYoWC5fX2UmJkouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9SikpLFh9ZnVuY3Rpb24gRjQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gVDUoWCl7dmFyIFo9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFomJlouX19hJiZaLl9fYShYKX1mdW5jdGlvbiB0MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfUIudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWj1YLl9fYztaJiYoWi5fX3o9ITApLFomJlouX19SJiZaLl9fUigpLFomJjMyJlguX191JiYoWC50eXBlPW51bGwpLF81JiZfNShYKX0sKEY0LnByb3RvdHlwZT1uZXcgaSkuX19jPWZ1bmN0aW9uKFgsWil7dmFyIEo9Wi5fX2MsWT10aGlzO1kubz09bnVsbCYmKFkubz1bXSksWS5vLnB1c2goSik7dmFyIHE9VDUoWS5fX3YpLFE9ITEsSz1mdW5jdGlvbigpe1F8fFkuX196fHwoUT0hMCxKLl9fUj1udWxsLHE/cShHKTpHKCkpfTtKLl9fUj1LO3ZhciBXPUouX19QO0ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1ZLl9fdSl7aWYoWS5zdGF0ZS5fX2Epe3ZhciB6PVkuc3RhdGUuX19hO1kuX192Ll9fa1swXT13NSh6LHouX19jLl9fUCx6Ll9fYy5fX08pfXZhciBPO2ZvcihZLnNldFN0YXRlKHtfX2E6WS5fX2I9bnVsbH0pO089WS5vLnBvcCgpOylPLl9fUD1XLE8uZm9yY2VVcGRhdGUoKX19O1kuX191Kyt8fDMyJlouX191fHxZLnNldFN0YXRlKHtfX2E6WS5fX2I9WS5fX3YuX19rWzBdfSksWC50aGVuKEssSyl9LEY0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sRjQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFope2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBKPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFk9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09RTUodGhpcy5fX2IsSixZLl9fTz1ZLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1aLl9fYSYmVzAoZixudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1cwKGYsbnVsbCxaLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgRjU9ZnVuY3Rpb24oWCxaLEope2lmKCsrSlsxXT09PUpbMF0mJlgubC5kZWxldGUoWiksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKEo9WC5pO0o7KXtmb3IoO0oubGVuZ3RoPjM7KUoucG9wKCkoKTtpZihKWzFdPEpbMF0pYnJlYWs7WC5pPUo9SlsyXX19Oyh0MC5wcm90b3R5cGU9bmV3IGkpLl9fYT1mdW5jdGlvbihYKXt2YXIgWj10aGlzLEo9VDUoWi5fX3YpLFk9Wi5sLmdldChYKTtyZXR1cm4gWVswXSsrLGZ1bmN0aW9uKHEpe3ZhciBRPWZ1bmN0aW9uKCl7Wi5wcm9wcy5yZXZlYWxPcmRlcj8oWS5wdXNoKHEpLEY1KFosWCxZKSk6cSgpfTtKP0ooUSk6USgpfX0sdDAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWj1MMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZaLnJldmVyc2UoKTtmb3IodmFyIEo9Wi5sZW5ndGg7Si0tOyl0aGlzLmwuc2V0KFpbSl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHQwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9dDAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihaLEope0Y1KFgsSixaKX0pfTt2YXIgRzY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsVjY9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLEg2PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sUDY9L1tBLVowLTldL2csTzY9dHlwZW9mIGRvY3VtZW50PCJ1IixVNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2kucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihaKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Wn0pfX0pfSk7dmFyIEQ1PUIuZXZlbnQ7Qi5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gRDUmJihYPUQ1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgYjUsQTY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LGs1PUIudm5vZGU7Qi52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWil7dmFye3Byb3BzOkosdHlwZTpZfT1aLHE9e30sUT1ZLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBLIGluIEope3ZhciBXPUpbS107aWYoIShLPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSikmJlc9PW51bGx8fE82JiZLPT09ImNoaWxkcmVuIiYmWT09PSJub3NjcmlwdCJ8fEs9PT0iY2xhc3MifHxLPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1LLnRvTG93ZXJDYXNlKCk7Sz09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gSiYmSi52YWx1ZT09bnVsbD9LPSJ2YWx1ZSI6Sz09PSJkb3dubG9hZCImJlc9PT0hMD9XPSIiOkc9PT0idHJhbnNsYXRlIiYmVz09PSJubyI/Vz0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/Sz0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fFkhPT0iaW5wdXQiJiZZIT09InRleHRhcmVhInx8VTYoSi50eXBlKT9HPT09Im9uZm9jdXMiP0s9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP0s9Im9uZm9jdXNvdXQiOkg2LnRlc3QoSykmJihLPUcpOkc9Sz0ib25pbnB1dCI6USYmVjYudGVzdChLKT9LPUsucmVwbGFjZShQNiwiLSQmIikudG9Mb3dlckNhc2UoKTpXPT09bnVsbCYmKFc9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW0s9R10mJihLPSJvbmlucHV0Q2FwdHVyZSIpLHFbS109V319WT09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1MMChKLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKHope3oucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKHoucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PXoucHJvcHMudmFsdWV9KSkpLEouY2xhc3MmJiFKLmNsYXNzTmFtZT8ocS5jbGFzcz1KLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEE2KSk6Si5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPUouY2xhc3NOYW1lKSxaLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9RzYsazUmJms1KFgpfTt2YXIgSTU9Qi5fX3I7Qi5fX3I9ZnVuY3Rpb24oWCl7STUmJkk1KFgpLGI1PVguX19jfTt2YXIgTTU9Qi5kaWZmZWQ7Qi5kaWZmZWQ9ZnVuY3Rpb24oWCl7TTUmJk01KFgpO3Zhcntwcm9wczpaLF9fZTpKfT1YO0ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlIT09Si52YWx1ZSYmKEoudmFsdWU9Wi52YWx1ZT09bnVsbD8iIjpaLnZhbHVlKSxiNT1udWxsfTt2YXIgQjY9MDtmdW5jdGlvbiBOKFgsWixKLFkscSxRKXtafHwoWj17fSk7dmFyIEssVyxHPVo7aWYoInJlZiJpbiBHKWZvcihXIGluIEc9e30sWilXPT0icmVmIj9LPVpbV106R1tXXT1aW1ddO3ZhciB6PXt0eXBlOlgscHJvcHM6RyxrZXk6SixyZWY6SyxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6LS1CNixfX2k6LTEsX191OjAsX19zb3VyY2U6cSxfX3NlbGY6UX07aWYodHlwZW9mIFg9PSJmdW5jdGlvbiImJihLPVguZGVmYXVsdFByb3BzKSlmb3IoVyBpbiBLKUdbV109PT12b2lkIDAmJihHW1ddPUtbV10pO3JldHVybiBCLnZub2RlJiZCLnZub2RlKHopLHp9dmFyIEQ0PWB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjAnIGhlaWdodD0nMjAnJTNFJTNDY2lyY2xlIGN4PScxMCcgY3k9JzEwJyByPSc5JyBmaWxsPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNCknIHN0cm9rZT0ncmdiYSgyNTUsMjU1LDI1NSwwLjcpJyBzdHJva2Utd2lkdGg9JzEnLyUzRSUzQy9zdmclM0UiKSAxMCAxMCwgcG9pbnRlcmAsXzY9MyxGNj00LEQ2PTU7ZnVuY3Rpb24gbjAoe3VybDpYLHdzVXJsOlosc3R5bGU6SixpbWFnZVN0eWxlOlksY2xhc3NOYW1lOnEsb25Ib21lUHJlc3M6USxvblN0cmVhbVRvdWNoOkssb25TdHJlYW1NdWx0aVRvdWNoOlcsb25TdHJlYW1CdXR0b246RyxzdWJzY3JpYmVGcmFtZTp6LHN0cmVhbUZyYW1lOk8sc3RyZWFtQ29uZmlnOiQsaGlkZUNvbnRyb2xzOl8sb25TdHJlYW1pbmdDaGFuZ2U6QSxjb25uZWN0aW9uUXVhbGl0eTpNfSl7bGV0IFU9ISFLLGs9dyhudWxsKSxJPXcobnVsbCksQz13KG51bGwpLFtoLEVdPVMoITEpLFtlLFowXT1TKG51bGwpLFt4LEswXT1TKG51bGwpLHM9dyhudWxsKSxbcixVMF09UyhudWxsKTtnKCgpPT57bGV0IFY9cy5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKEwpPT57bGV0IFA9TFswXT8uY29udGVudFJlY3Q7aWYoUClVMCh7d2lkdGg6UC53aWR0aCxoZWlnaHQ6UC5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W2owLHYwXT1TKDApLEcwPXcoMCksW0o0LEkwXT1TKCExKSxGPXcobnVsbCk7ZygoKT0+e2lmKE09PT0icG9vciIpe2lmKEkwKCEwKSxGLmN1cnJlbnQpY2xlYXJUaW1lb3V0KEYuY3VycmVudCk7Ri5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntJMCghMSksRi5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYoSTAoITEpLEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KSxGLmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KX19LFtNXSk7bGV0IFI9YCR7WH0vc3RyZWFtLm1qcGVnYCx2PXcoQSk7di5jdXJyZW50PUEsZygoKT0+e3YuY3VycmVudD8uKGgpfSxbaF0pLGcoKCk9PntpZihVJiYkKUswKCQpfSxbVSwkXSk7bGV0IFQ9dyghMSk7VC5jdXJyZW50PWg7bGV0IHU9dyhudWxsKTtnKCgpPT57aWYoIVV8fCF6KXJldHVybjtsZXQgSD1zZXRUaW1lb3V0KCgpPT57aWYoIVQuY3VycmVudClaMCgiU3RyZWFtIGlzIG5vdCBwcm9kdWNpbmcgZnJhbWVzLiBUaGUgc2ltdWxhdG9yIG1heSBoYXZlIHN0b3BwZWQg4oCUIHRyeSByZWNvbm5lY3RpbmcuIil9LDYwMDApLEw9eigoUCk9PntHMC5jdXJyZW50KyssWDAuY3VycmVudD1EYXRlLm5vdygpO2xldCBEPUkuY3VycmVudDtpZihEKXtpZih1LmN1cnJlbnQpVVJMLnJldm9rZU9iamVjdFVSTCh1LmN1cnJlbnQpO3UuY3VycmVudD1QLEQuc3JjPVB9aWYoIVQuY3VycmVudCljbGVhclRpbWVvdXQoSCksRSghMCksWjAobnVsbCl9KTtyZXR1cm4oKT0+e2NsZWFyVGltZW91dChIKSxMPy4oKX19LFtVLHpdKTtsZXQgbT1qKChWKT0+e2lmKFUpe0s/LihWKTtyZXR1cm59bGV0IEg9Qy5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KFYpKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09XzYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEtdKSxKMD1qKChWKT0+e2lmKFUpe0c/LihWKTtyZXR1cm59bGV0IEg9Qy5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHtidXR0b246Vn0pKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09RjYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEddKSx5PWooKFYpPT57aWYoVSl7Vz8uKFYpO3JldHVybn1sZXQgSD1DLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLFA9bmV3IFVpbnQ4QXJyYXkoMStMLmxlbmd0aCk7UFswXT1ENixQLnNldChMLDEpLEguc2VuZChQKX0sW1UsV10pO2coKCk9PntpZihVKXJldHVybjtmZXRjaChgJHtYfS9jb25maWdgKS50aGVuKChsKT0+bC5qc29uKCkpLnRoZW4oKGwpPT57aWYobC53aWR0aD4wJiZsLmhlaWdodD4wKUswKGwpfSkuY2F0Y2goKCk9Pnt9KTtsZXQgVj1aPz9YLnJlcGxhY2UoL15odHRwLywid3MiKSsiL3dzIixIPW5ldyBXZWJTb2NrZXQoVik7SC5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsQy5jdXJyZW50PUgsSC5vbm9wZW49KCk9PntFKCEwKSxaMChudWxsKX0sSC5vbmNsb3NlPSgpPT57RSghMSl9LEgub25lcnJvcj0oKT0+e1owKCJXZWJTb2NrZXQgY29ubmVjdGlvbiBmYWlsZWQiKSxFKCExKX07bGV0IEw9bmV3IEFib3J0Q29udHJvbGxlcixQPXNldEludGVydmFsKCgpPT57djAoRzAuY3VycmVudCksRzAuY3VycmVudD0wfSwxMDAwKSxEPSExLGI9c2V0VGltZW91dCgoKT0+e2lmKCFEKVowKCJTdHJlYW0gaXMgbm90IHByb2R1Y2luZyBmcmFtZXMuIFRoZSBzaW11bGF0b3IgbWF5IGhhdmUgc3RvcHBlZCDigJQgdHJ5IHJlY29ubmVjdGluZy4iKX0sNjAwMCk7cmV0dXJuKGFzeW5jKCk9Pnt0cnl7bGV0IG49KGF3YWl0IGZldGNoKFIse3NpZ25hbDpMLnNpZ25hbH0pKS5ib2R5Py5nZXRSZWFkZXIoKTtpZighbilyZXR1cm47bGV0IFEwPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiLS1mcmFtZSIpO3doaWxlKCEwKXtsZXR7ZG9uZTpoNSx2YWx1ZTpRNH09YXdhaXQgbi5yZWFkKCk7aWYoaDUpYnJlYWs7aWYoUTQpZm9yKGxldCBLND0wO0s0PD1RNC5sZW5ndGgtUTAubGVuZ3RoO0s0Kyspe2xldCBUND0hMDtmb3IobGV0IHgwPTA7eDA8UTAubGVuZ3RoO3gwKyspaWYoUTRbSzQreDBdIT09UTBbeDBdKXtUND0hMTticmVha31pZihUNCl7aWYoRzAuY3VycmVudCsrLCFEKUQ9ITAsY2xlYXJUaW1lb3V0KGIpfX19fWNhdGNoe319KSgpLCgpPT57TC5hYm9ydCgpLGNsZWFySW50ZXJ2YWwoUCksY2xlYXJUaW1lb3V0KGIpLEguY2xvc2UoKSxDLmN1cnJlbnQ9bnVsbH19LFtYLFIsVV0pO2xldCBYMD13KDApO2coKCk9PntpZighVSlyZXR1cm47bGV0IFY9MjAwMCxIPSgpPT57bGV0IEQ9WDAuY3VycmVudDtpZighRHx8IVQuY3VycmVudClyZXR1cm47aWYoRGF0ZS5ub3coKS1EPlYpRSghMSl9LEw9c2V0SW50ZXJ2YWwoKCk9Pnt2MChHMC5jdXJyZW50KSxHMC5jdXJyZW50PTAsSCgpfSwxMDAwKSxQPSgpPT57aWYoIWRvY3VtZW50LmhpZGRlbilIKCl9O3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixQKSwoKT0+e2NsZWFySW50ZXJ2YWwoTCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsUCl9fSxbVV0pO2xldCBhPWooKCk9PntyZXR1cm4gVT9JLmN1cnJlbnQ6ay5jdXJyZW50fSxbVV0pLFYwPWooKFYsSCk9PntsZXQgTD1hKCk7aWYoIUwpcmV0dXJuO2xldCBQPUwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksRD0oSC5jbGllbnRYLVAubGVmdCkvUC53aWR0aCxiPShILmNsaWVudFktUC50b3ApL1AuaGVpZ2h0O20oe3R5cGU6Vix4OkQseTpifSl9LFttXSksWTA9MyxjPXcoITEpLG89dyghMSksQTA9dyghMSksTTA9dyh7ZHg6MCxkeTowfSksQzA9dyghMSksW1k0LEk0XT1TKCExKSxNND13KHt4OjAuNSx5OjAuNX0pLFtIMCxxMF09UyhudWxsKTtnKCgpPT57bGV0IFY9KEwpPT57aWYoTC5rZXk9PT0iQWx0IilJNCghMCl9LEg9KEwpPT57aWYoTC5rZXk9PT0iQWx0Iil7aWYoSTQoITEpLCFvLmN1cnJlbnQpcTAobnVsbCl9fTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLFYpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsSCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixIKX19LFtdKSxnKCgpPT57aWYoWTQmJiFvLmN1cnJlbnQpe2xldCBWPU00LmN1cnJlbnQ7cTAoe3gxOlYueCx5MTpWLnkseDI6MS1WLngseTI6MS1WLnl9KX1lbHNlIGlmKCFZNCYmIW8uY3VycmVudClxMChudWxsKX0sW1k0XSk7bGV0IHkwPXcobnVsbCkscTQ9dyghMSksRTA9dygwKSxDND1qKChWLEgpPT57cTQuY3VycmVudD0hMDtsZXQgTD15MC5jdXJyZW50O2lmKEwpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksRTAuY3VycmVudD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntMLnN0eWxlLmxlZnQ9YCR7VioxMDB9JWAsTC5zdHlsZS50b3A9YCR7SCoxMDB9JWAsTC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KX0sW10pLEU0PWooKFYsSCk9PntpZighcTQuY3VycmVudClyZXR1cm47bGV0IEw9eTAuY3VycmVudDtpZihMKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEUwLmN1cnJlbnQpLEUwLmN1cnJlbnQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57TC5zdHlsZS5sZWZ0PWAke1YqMTAwfSVgLEwuc3R5bGUudG9wPWAke0gqMTAwfSVgfSl9LFtdKSxwMD1qKCgpPT57cTQuY3VycmVudD0hMTtsZXQgVj15MC5jdXJyZW50O2lmKFYpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksVi5zdHlsZS5kaXNwbGF5PSJub25lIn0sW10pLHc0PXcoMCksdzA9dyhudWxsKSx4NT1qKCgpPT57bGV0IFY9RGF0ZS5ub3coKSxIPVYtdzQuY3VycmVudDtpZih3NC5jdXJyZW50PVYsSDwzMDApe2lmKHcwLmN1cnJlbnQpY2xlYXJUaW1lb3V0KHcwLmN1cnJlbnQpLHcwLmN1cnJlbnQ9bnVsbDtpZihRKVEoKTtlbHNlIEowKCJhcHBfc3dpdGNoZXIiKX1lbHNlIHcwLmN1cnJlbnQ9c2V0VGltZW91dCgoKT0+e2lmKFEpUSgpO2Vsc2UgSjAoImhvbWUiKTt3MC5jdXJyZW50PW51bGx9LDMwMCl9LFtKMCxRXSksZzA9KCgpPT57aWYoIXh8fCFyKXJldHVybiBudWxsO2lmKHIud2lkdGg9PT0wfHxyLmhlaWdodD09PTApcmV0dXJuIG51bGw7bGV0IFY9TWF0aC5taW4oci53aWR0aC94LndpZHRoLHIuaGVpZ2h0L3guaGVpZ2h0KTtyZXR1cm57d2lkdGg6eC53aWR0aCpWLGhlaWdodDp4LmhlaWdodCpWfX0pKCk7cmV0dXJuIE4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGZsZXg6MSwuLi5fP3t9Ontib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sb3ZlcmZsb3c6ImhpZGRlbiIsbWluV2lkdGg6MCxtaW5IZWlnaHQ6MCwuLi5KfSxjbGFzc05hbWU6cSxjaGlsZHJlbjpbTigiZGl2Iix7cmVmOnMsc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsZmxleDoxLG1pbkhlaWdodDowLG1pbldpZHRoOjAsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIn0sY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsd2lkdGg6ZzA/YCR7ZzAud2lkdGh9cHhgOiIxMDAlIixoZWlnaHQ6ZzA/YCR7ZzAuaGVpZ2h0fXB4YDoiMTAwJSJ9LGNoaWxkcmVuOltOKCJpbWciLHtyZWY6ayxzcmM6VT92b2lkIDA6UixkcmFnZ2FibGU6ITEsb25Mb2FkOihWKT0+e2xldCBIPVYuY3VycmVudFRhcmdldDtpZihILm5hdHVyYWxXaWR0aD4wJiZILm5hdHVyYWxIZWlnaHQ+MClLMCgoTCk9PkwmJkwud2lkdGg9PT1ILm5hdHVyYWxXaWR0aCYmTC5oZWlnaHQ9PT1ILm5hdHVyYWxIZWlnaHQ/TDp7d2lkdGg6SC5uYXR1cmFsV2lkdGgsaGVpZ2h0OkgubmF0dXJhbEhlaWdodH0pfSxzdHlsZTpVP3tkaXNwbGF5OiJub25lIn06e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCx3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixjdXJzb3I6RDQsZGlzcGxheToiYmxvY2siLHVzZXJTZWxlY3Q6Im5vbmUiLFdlYmtpdFVzZXJTZWxlY3Q6Im5vbmUiLHRvdWNoQWN0aW9uOiJub25lIiwuLi5ZfX0pLFUmJk4oImltZyIse3JlZjpJLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKUswKChMKT0+TCYmTC53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZMLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9MOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOkQ0LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uWX19KSxOKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGN1cnNvcjpENCx0b3VjaEFjdGlvbjoibm9uZSJ9LG9uTW91c2VEb3duOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksUD0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKFYuYWx0S2V5KXtvLmN1cnJlbnQ9ITAsQTAuY3VycmVudD1WLnNoaWZ0S2V5O2xldCBiPXt4MTpQLHkxOkQseDI6MS1QLHkyOjEtRH07TTAuY3VycmVudD17ZHg6MS1QLVAsZHk6MS1ELUR9LHEwKGIpLHkoe3R5cGU6ImJlZ2luIiwuLi5ifSk7cmV0dXJufWlmKEM0KFAsRCksRD4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpQLHk6RCxlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsVjAoImJlZ2luIixWKX0sb25Nb3VzZU1vdmU6KFYpPT57bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihNNC5jdXJyZW50PXt4OlAseTpEfSxWLmJ1dHRvbnM9PT0wKXtpZihWLmFsdEtleSlxMCh7eDE6UCx5MTpELHgyOjEtUCx5MjoxLUR9KTtyZXR1cm59aWYoby5jdXJyZW50KXtsZXQgYjtpZihBMC5jdXJyZW50KXtsZXQgbD1NMC5jdXJyZW50O2I9e3gxOlAseTE6RCx4MjpQK2wuZHgseTI6RCtsLmR5fX1lbHNlIGI9e3gxOlAseTE6RCx4MjoxLVAseTI6MS1EfTtxMChiKSx5KHt0eXBlOiJtb3ZlIiwuLi5ifSk7cmV0dXJufWlmKEU0KFAsRCksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6UCx5OkQsZWRnZTpZMH0pO2Vsc2UgVjAoIm1vdmUiLFYpfSxvbk1vdXNlVXA6KFYpPT57aWYoby5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoQTAuY3VycmVudCl7bGV0IGI9TTAuY3VycmVudDt5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjpQK2IuZHgseTI6RCtiLmR5fSl9ZWxzZSB5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjoxLVAseTI6MS1EfSl9aWYoby5jdXJyZW50PSExLCFWLmFsdEtleSlxMChudWxsKTtyZXR1cm59aWYocDAoKSxjLmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDttKHt0eXBlOiJlbmQiLHg6UCx5OkQsZWRnZTpZMH0pfWMuY3VycmVudD0hMTtyZXR1cm59VjAoImVuZCIsVil9LG9uTW91c2VMZWF2ZTooVik9PntpZihvLmN1cnJlbnQpe2lmKEgwKXkoe3R5cGU6ImVuZCIsLi4uSDB9KTtvLmN1cnJlbnQ9ITEscTAobnVsbCk7cmV0dXJufWlmKHAwKCksYy5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7bSh7dHlwZToiZW5kIix4OlAseTpELGVkZ2U6WTB9KX1jLmN1cnJlbnQ9ITE7cmV0dXJufWlmKFYuYnV0dG9ucz4wKVYwKCJlbmQiLFYpO3EwKG51bGwpfSxvblRvdWNoU3RhcnQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWLnRvdWNoZXMubGVuZ3RoPj0yKXtwMCgpO2xldCBsPVYudG91Y2hlc1swXSxuPVYudG91Y2hlc1sxXSxRMD17eDE6KGwuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTE6KGwuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQseDI6KG4uY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTI6KG4uY2xpZW50WS1MLnRvcCkvTC5oZWlnaHR9O2lmKCFDMC5jdXJyZW50JiYhYy5jdXJyZW50KW0oe3R5cGU6ImVuZCIseDpRMC54MSx5OlEwLnkxfSk7QzAuY3VycmVudD0hMCxvLmN1cnJlbnQ9ITAsYy5jdXJyZW50PSExLHEwKFEwKSx5KHt0eXBlOiJiZWdpbiIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEM0KEQsYiksYj4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpELHk6YixlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsbSh7dHlwZToiYmVnaW4iLHg6RCx5OmJ9KX0sb25Ub3VjaE1vdmU6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihDMC5jdXJyZW50JiZWLnRvdWNoZXMubGVuZ3RoPj0yKXtsZXQgbD1WLnRvdWNoZXNbMF0sbj1WLnRvdWNoZXNbMV0sUTA9e3gxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOihuLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkyOihuLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0fTtxMChRMCkseSh7dHlwZToibW92ZSIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEU0KEQsYiksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6RCx5OmIsZWRnZTpZMH0pO2Vsc2UgbSh7dHlwZToibW92ZSIseDpELHk6Yn0pfSxvblRvdWNoRW5kOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoQzAuY3VycmVudCl7aWYoVi50b3VjaGVzLmxlbmd0aDwyKXtsZXQgbD1WLmNoYW5nZWRUb3VjaGVzWzBdLG49SDA7aWYobCYmbil5KHt0eXBlOiJlbmQiLHgxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOm4ueDIseTI6bi55Mn0pO2Vsc2UgaWYobil5KHt0eXBlOiJlbmQiLC4uLm59KTtDMC5jdXJyZW50PSExLG8uY3VycmVudD0hMSxxMChudWxsKX1yZXR1cm59bGV0IFA9Vi5jaGFuZ2VkVG91Y2hlc1swXTtpZighUClyZXR1cm47bGV0IEQ9KFAuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsYj0oUC5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihwMCgpLGMuY3VycmVudCltKHt0eXBlOiJlbmQiLHg6RCx5OmIsZWRnZTpZMH0pLGMuY3VycmVudD0hMTtlbHNlIG0oe3R5cGU6ImVuZCIseDpELHk6Yn0pfX0pLE4oImRpdiIse3JlZjp5MCwiZGF0YS10ZXN0aWQiOiJ0b3VjaC1pbmRpY2F0b3IiLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUiLHdpZHRoOjI0LGhlaWdodDoyNCxib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDoicmdiYSg1OSwxMzAsMjQ2LDAuNSkiLGJveFNoYWRvdzoiMCAwIDhweCByZ2JhKDU5LDEzMCwyNDYsMC4zKSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoLTUwJSwgLTUwJSkiLHBvaW50ZXJFdmVudHM6Im5vbmUifX0pLEgwJiZOKGYse2NoaWxkcmVuOltOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MSxIMC55MSl9KSxOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MixIMC55Mil9KV19KSwhaCYmIWUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiM4ODgiLGZvbnRTaXplOjE0fSxjaGlsZHJlbjoiQ29ubmVjdGluZy4uLiJ9KX0pLGUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiNmNDQiLGZvbnRTaXplOjE0LHBhZGRpbmc6MjAsdGV4dEFsaWduOiJjZW50ZXIifSxjaGlsZHJlbjplfSl9KSxKNCYmTigiZGl2Iix7c3R5bGU6azYsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiI2ZiYmYyNCIsZm9udFNpemU6MTMsZm9udEZhbWlseToibW9ub3NwYWNlIn0sY2hpbGRyZW46IlNsb3cgY29ubmVjdGlvbiJ9KX0pXX0pfSksIV8mJk4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixwYWRkaW5nOiI0cHggOHB4Iixib3JkZXJUb3A6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sY2hpbGRyZW46W04oImJ1dHRvbiIse29uQ2xpY2s6eDUsc3R5bGU6e2JhY2tncm91bmQ6Im5vbmUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4yKSIsY29sb3I6IiNhYWEiLGZvbnRTaXplOjExLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIscGFkZGluZzoiMnB4IDEwcHgiLGN1cnNvcjoicG9pbnRlciIsYm9yZGVyUmFkaXVzOjR9LGNoaWxkcmVuOiJIb21lIn0pLE4oInNwYW4iLHtzdHlsZTp7Y29sb3I6ajA+MD8iIzRmNCI6IiM4ODgiLGZvbnRTaXplOjEyLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixnYXA6Nn0sY2hpbGRyZW46W00mJk4oInNwYW4iLHsiZGF0YS10ZXN0aWQiOiJxdWFsaXR5LWRvdCIsc3R5bGU6e3dpZHRoOjgsaGVpZ2h0OjgsYm9yZGVyUmFkaXVzOiI1MCUiLGRpc3BsYXk6ImlubGluZS1ibG9jayIsYmFja2dyb3VuZDpNPT09Imdvb2QiPyIjNGFkZTgwIjpNPT09ImRlZ3JhZGVkIj8iI2ZhY2MxNSI6IiNlZjQ0NDQifX0pLGowLCIgZnBzIl19KV19KV19KX12YXIgazY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjgsbGVmdDoiNTAlIix0cmFuc2Zvcm06InRyYW5zbGF0ZVgoLTUwJSkiLGJhY2tncm91bmQ6InJnYmEoMCwwLDAsMC43KSIsYm9yZGVyUmFkaXVzOjYscGFkZGluZzoiNHB4IDEycHgiLHBvaW50ZXJFdmVudHM6Im5vbmUifSxTNT17cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYmFja2dyb3VuZDoicmdiYSgwLDAsMCwwLjgpIn0sUjU9MjA7ZnVuY3Rpb24gajUoWCxaKXtyZXR1cm57cG9zaXRpb246ImFic29sdXRlIixsZWZ0OmAke1gqMTAwfSVgLHRvcDpgJHtaKjEwMH0lYCx3aWR0aDpSNSxoZWlnaHQ6UjUsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjcpIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgtNTAlLCAtNTAlKSIscG9pbnRlckV2ZW50czoibm9uZSJ9fWZ1bmN0aW9uIGswKFgpe2lmKCFYKXJldHVybiJpcGhvbmUiO2xldCBaPVgudG9Mb3dlckNhc2UoKTtpZihaLmluY2x1ZGVzKCJpcGFkIikpcmV0dXJuImlwYWQiO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIndhdGNoIjtpZihaLmluY2x1ZGVzKCJ2aXNpb24iKSlyZXR1cm4idmlzaW9uIjtyZXR1cm4iaXBob25lIn12YXIgJDA9e2lwaG9uZTp7d2lkdGg6NDI3LGhlaWdodDo4ODEsYmV6ZWxYOjE4LGJlemVsWToxOCxpbm5lclJhZGl1czo1NX0saXBhZDp7d2lkdGg6NDMwLGhlaWdodDo2MDUsYmV6ZWxYOjE2LGJlemVsWToxNixpbm5lclJhZGl1czoxMn0sd2F0Y2g6e3dpZHRoOjI3NCxoZWlnaHQ6MzIyLGJlemVsWDoxMixiZXplbFk6MTIsaW5uZXJSYWRpdXM6Nzl9LHZpc2lvbjp7d2lkdGg6NjQwLGhlaWdodDo0MDAsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czozMn19LGI3PSQwLmlwaG9uZS53aWR0aCxTNz0kMC5pcGhvbmUuaGVpZ2h0LFI3PSQwLmlwaG9uZS5iZXplbFgsajc9JDAuaXBob25lLmJlemVsWSx2Nz0kMC5pcGhvbmUuaW5uZXJSYWRpdXM7ZnVuY3Rpb24gZTAoWD0iaXBob25lIil7bGV0IFo9JDBbWF0sSj1aLndpZHRoLTIqWi5iZXplbFgsWT1aLmhlaWdodC0yKlouYmV6ZWxZO3JldHVybmAke1ouaW5uZXJSYWRpdXMvSioxMDB9JSAvICR7Wi5pbm5lclJhZGl1cy9ZKjEwMH0lYH12YXIgazQ9XzAobnVsbCk7ZnVuY3Rpb24gWDQoWCl7bGV0IFo9UjAoazQpO2lmKCFaKXRocm93IEVycm9yKGA8U2ltdWxhdG9yVG9vbGJhci4ke1h9PiBtdXN0IGJlIHJlbmRlcmVkIGluc2lkZSA8U2ltdWxhdG9yVG9vbGJhcj5gKTtyZXR1cm4gWn12YXIgdzY9e2Rpc3BsYXk6ImZsZXgiLGZsZXhXcmFwOiJ3cmFwIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixnYXA6IjRweCAxMnB4IixwYWRkaW5nOiI4cHggMTJweCIsYm9yZGVyUmFkaXVzOjI0LGJhY2tncm91bmQ6IiMxYzFjMWUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSIsYm94U2hhZG93OiIwIDFweCAycHggcmdiYSgwLDAsMCwwLjIpIixtaW5XaWR0aDoyNDAsd2lkdGg6IjEwMCUifTtmdW5jdGlvbiBUNih7ZXhlYzpYLGRldmljZVVkaWQ6WixkZXZpY2VOYW1lOkosZGV2aWNlUnVudGltZTpZLHN0cmVhbWluZzpxPSExLGRpc2FibGVkOlE9ITEsY2hpbGRyZW46SyxzdHlsZTpXLC4uLkd9KXtsZXQgej1rMChKKSwkPXtleGVjOlgsZGV2aWNlVWRpZDpaLGRldmljZU5hbWU6SixkZXZpY2VSdW50aW1lOlksZGV2aWNlVHlwZTp6LHN0cmVhbWluZzpxLGRpc2FibGVkOlF8fCFafHwhcX07cmV0dXJuIE4oazQuUHJvdmlkZXIse3ZhbHVlOiQsY2hpbGRyZW46TigiZGl2Iix7ImRhdGEtc2ltdWxhdG9yLXRvb2xiYXIiOiEwLHN0eWxlOnsuLi53NiwuLi5XfSwuLi5HLGNoaWxkcmVuOkt9KX0pfXZhciBiNj17ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixhbGlnbkl0ZW1zOiJmbGV4LXN0YXJ0Iix0ZXh0QWxpZ246ImxlZnQiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjZmZmIixwYWRkaW5nOiIycHggNHB4IixtYXJnaW46Ii0ycHggLTRweCIsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixtaW5XaWR0aDowLG1heFdpZHRoOiIxMDAlIixsaW5lSGVpZ2h0OjEuMixmb250RmFtaWx5OiJpbmhlcml0In0sUzY9RDAoZnVuY3Rpb24oe25hbWU6WixzdWJ0aXRsZTpKLGhpZGVDaGV2cm9uOlksc3R5bGU6cSxvbk1vdXNlRW50ZXI6USxvbk1vdXNlTGVhdmU6SywuLi5XfSxHKXtsZXQgej1YNCgiVGl0bGUiKSxbTywkXT1TKCExKSxfPVo/P3ouZGV2aWNlTmFtZT8/Ik5vIHNpbXVsYXRvciIsQT1KPz8oei5kZXZpY2VSdW50aW1lP3ouZGV2aWNlUnVudGltZS5yZXBsYWNlKC9cLi8sIiAiKToi4oCUIik7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsImRhdGEtc2ltdWxhdG9yLXRvb2xiYXItdGl0bGUiOiEwLG9uTW91c2VFbnRlcjooTSk9PnskKCEwKSxRPy4oTSl9LG9uTW91c2VMZWF2ZTooTSk9PnskKCExKSxLPy4oTSl9LHN0eWxlOnsuLi5iNixiYWNrZ3JvdW5kOk8/InJnYmEoMjU1LDI1NSwyNTUsMC4xKSI6InRyYW5zcGFyZW50IiwuLi5xfSwuLi5XLGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2Rpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo0LGZvbnRTaXplOjEyLGZvbnRXZWlnaHQ6NjAwLGNvbG9yOiIjZmZmIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46W18sIVkmJk4oInN2ZyIse3dpZHRoOiIxMCIsaGVpZ2h0OiIxMCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIuNSIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsc3R5bGU6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGZsZXhTaHJpbms6MH0sY2hpbGRyZW46TigicG9seWxpbmUiLHtwb2ludHM6IjYgOSAxMiAxNSAxOCA5In0pfSldfSksTigic3BhbiIse3N0eWxlOntmb250U2l6ZToxMCxjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjUpIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46QX0pXX0pfSksUjY9e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZmxleFNocmluazowfTtmdW5jdGlvbiBqNih7c3R5bGU6WCwuLi5afSl7cmV0dXJuIE4oImRpdiIse3N0eWxlOnsuLi5SNiwuLi5YfSwuLi5afSl9dmFyIHY2PXtiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsYm9yZGVyOiJub25lIixwYWRkaW5nOjYsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixkaXNwbGF5OiJpbmxpbmUtZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIix0cmFuc2l0aW9uOiJiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzLCBjb2xvciAwLjE1cyJ9LFo0PUQwKGZ1bmN0aW9uKHtmb3JjZURpc2FibGVkOlosc3R5bGU6SixkaXNhYmxlZDpZLG9uTW91c2VFbnRlcjpxLG9uTW91c2VMZWF2ZTpRLGNoaWxkcmVuOkssLi4uV30sRyl7bGV0IHo9UjAoazQpLE89WXx8Wnx8ej8uZGlzYWJsZWQsWyQsX109UyghMSk7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6Tyxvbk1vdXNlRW50ZXI6KEEpPT57XyghMCkscT8uKEEpfSxvbk1vdXNlTGVhdmU6KEEpPT57XyghMSksUT8uKEEpfSxzdHlsZTp7Li4udjYsY29sb3I6Tz8icmdiYSgyNTUsMjU1LDI1NSwwLjI1KSI6InJnYmEoMjU1LDI1NSwyNTUsMC44KSIsYmFja2dyb3VuZDokJiYhTz8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLGN1cnNvcjpPPyJub3QtYWxsb3dlZCI6InBvaW50ZXIiLC4uLkp9LC4uLlcsY2hpbGRyZW46S30pfSk7ZnVuY3Rpb24geTYoKXtyZXR1cm5bJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBzZXQgZnJvbnRtb3N0IHRvIHRydWUnLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gcGVyZm9ybSBhY3Rpb24gIkFYUmFpc2UiIG9mIChmaXJzdCB3aW5kb3cgd2hvc2UgbmFtZSBjb250YWlucyAid2F0Y2hPUyIpJywndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIGNsaWNrIG1lbnUgaXRlbSAiSG9tZSIgb2YgbWVudSAiRGV2aWNlIiBvZiBtZW51IGJhciBpdGVtICJEZXZpY2UiIG9mIG1lbnUgYmFyIDEnXS5tYXAoKFopPT5gLWUgJyR7Wn0nYCkucmVkdWNlKChaLEopPT5gJHtafSAke0p9YCwib3Nhc2NyaXB0Iil9dmFyIHA2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOk4oInBhdGgiLHtkOiJNMyAxMC41IDEyIDNsOSA3LjVWMjBhMSAxIDAgMCAxLTEgMWgtNXYtN2gtNnY3SDRhMSAxIDAgMCAxLTEtMXoifSl9KSxnNj1OKCJzdmciLHt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixjaGlsZHJlbjpbTigicGF0aCIse2Q6Ik0xNC41IDRoLTVMNyA3SDRhMiAyIDAgMCAwLTIgMnY5YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMlY5YTIgMiAwIDAgMC0yLTJoLTN6In0pLE4oImNpcmNsZSIse2N4OiIxMiIsY3k6IjEzIixyOiI0In0pXX0pLHg2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDEyIDEzIixmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46TigicGF0aCIse2Q6Ik0xMC4yMzA1IDEyLjgwNzdINC40MjM4M0MzLjkyMzgzIDEyLjgwNzcgMy41NDY4OCAxMi42ODQ2IDMuMjkyOTcgMTIuNDM4NUMzLjA0Mjk3IDEyLjE5NjMgMi45MTc5NyAxMS44MTk0IDIuOTE3OTcgMTEuMzA3N1Y1LjUxMjc0QzIuOTE3OTcgNC45OTcxMSAzLjA0Mjk3IDQuNjE4MjEgMy4yOTI5NyA0LjM3NjAyQzMuNTQ2ODggNC4xMjk5MyAzLjkyMzgzIDQuMDA2ODggNC40MjM4MyA0LjAwNjg4SDEwLjIzMDVDMTAuNzM0NCA0LjAwNjg4IDExLjExMTMgNC4xMjk5MyAxMS4zNjEzIDQuMzc2MDJDMTEuNjExMyA0LjYxODIxIDExLjczNjMgNC45OTcxMSAxMS43MzYzIDUuNTEyNzRWMTEuMzA3N0MxMS43MzYzIDExLjgxOTQgMTEuNjExMyAxMi4xOTYzIDExLjM2MTMgMTIuNDM4NUMxMS4xMTEzIDEyLjY4NDYgMTAuNzM0NCAxMi44MDc3IDEwLjIzMDUgMTIuODA3N1pNMTAuMjEyOSAxMS44NjQzQzEwLjQxNiAxMS44NjQzIDEwLjU2MjUgMTEuODE5NCAxMC42NTIzIDExLjcyOTVDMTAuNzQ2MSAxMS42NDM2IDEwLjc5MyAxMS40OTcxIDEwLjc5MyAxMS4yOTAxVjUuNTI0NDZDMTAuNzkzIDUuMzE3NDMgMTAuNzQ2MSA1LjE3MDk0IDEwLjY1MjMgNS4wODUwMUMxMC41NjI1IDQuOTk1MTYgMTAuNDE2IDQuOTUwMjQgMTAuMjEyOSA0Ljk1MDI0SDQuNDQxNDFDNC4yNDIxOSA0Ljk1MDI0IDQuMDk1NyA0Ljk5NTE2IDQuMDAxOTUgNS4wODUwMUMzLjkwODIgNS4xNzA5NCAzLjg2MTMzIDUuMzE3NDMgMy44NjEzMyA1LjUyNDQ2VjExLjI5MDFDMy44NjEzMyAxMS40OTcxIDMuOTA4MiAxMS42NDM2IDQuMDAxOTUgMTEuNzI5NUM0LjA5NTcgMTEuODE5NCA0LjI0MjE5IDExLjg2NDMgNC40NDE0MSAxMS44NjQzSDEwLjIxMjlaTTIuOTE3OTcgMi41ODMwNVYwLjQxNTA4M0MyLjkxNzk3IDAuMjAwMjQgMi45ODYzMyAwLjA2OTM4MDMgMy4xMjMwNSAwLjAyMjUwNTNDMy4yNTk3NyAtMC4wMjgyNzU5IDMuNDEwMTYgMC4wMDY4ODAzMyAzLjU3NDIyIDAuMTI3OTc0TDUuMDUwNzggMS4yMTE5NkM1LjE3NTc4IDEuMzA1NzEgNS4yMzgyOCAxLjQwMTQxIDUuMjM4MjggMS40OTkwN0M1LjIzODI4IDEuNTk2NzIgNS4xNzU3OCAxLjY5MjQzIDUuMDUwNzggMS43ODYxOEwzLjU3NDIyIDIuODY0M0MzLjQxMDE2IDIuOTg1NCAzLjI1OTc3IDMuMDIyNTEgMy4xMjMwNSAyLjk3NTYzQzIuOTg2MzMgMi45MjQ4NSAyLjkxNzk3IDIuNzkzOTkgMi45MTc5NyAyLjU4MzA1Wk0zLjUzMzIgMS4xNTMzNkMzLjYyNjk1IDEuMTUzMzYgMy43MDcwMyAxLjE4NjU3IDMuNzczNDQgMS4yNTI5N0MzLjg0Mzc1IDEuMzE5MzggMy44Nzg5MSAxLjM5NzUxIDMuODc4OTEgMS40ODczNUMzLjg3ODkxIDEuNTgxMSAzLjg0Mzc1IDEuNjYzMTMgMy43NzM0NCAxLjczMzQ0QzMuNzA3MDMgMS43OTk4NSAzLjYyNjk1IDEuODMzMDUgMy41MzMyIDEuODMzMDVIMi44MDY2NEMyLjM4MDg2IDEuODMzMDUgMi4wMTE3MiAxLjkyNDg1IDEuNjk5MjIgMi4xMDg0NEMxLjM5MDYyIDIuMjg4MTMgMS4xNTIzNCAyLjUzODEzIDAuOTg0Mzc1IDIuODU4NDRDMC44MTY0MDYgMy4xNzg3NiAwLjczMjQyMiAzLjU0NTk0IDAuNzMyNDIyIDMuOTYwMDFWNC44Mzg5MUMwLjczMjQyMiA0LjkzNjU3IDAuNjk3MjY2IDUuMDIyNTEgMC42MjY5NTMgNS4wOTY3MkMwLjU1MjczNCA1LjE2NzA0IDAuNDY0ODQ0IDUuMjAyMTkgMC4zNjMyODEgNS4yMDIxOUMwLjI2NTYyNSA1LjIwMjE5IDAuMTgxNjQxIDUuMTY3MDQgMC4xMTEzMjggNS4wOTY3MkMwLjAzNzEwOTQgNS4wMjI1MSAwIDQuOTM2NTcgMCA0LjgzODkxVjMuOTYwMDFDMCAzLjQwMTQxIDAuMTE3MTg4IDIuOTExMTggMC4zNTE1NjIgMi40ODkzQzAuNTgyMDMxIDIuMDY3NDMgMC45MDgyMDMgMS43MzkzIDEuMzMwMDggMS41MDQ5M0MxLjc0ODA1IDEuMjcwNTUgMi4yMzgyOCAxLjE1MzM2IDIuODAwNzggMS4xNTMzNkgzLjUzMzJaIn0pfSksaDY9RDAoZnVuY3Rpb24oe29uQ2xpY2s6WiwuLi5KfSxZKXtsZXQgcT1YNCgiSG9tZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IkhvbWUiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VUeXBlPT09IndhdGNoIilxLmV4ZWMoeTYoKSk7ZWxzZSBxLmV4ZWMoInNlcnZlLXNpbSBidXR0b24gaG9tZSIpfSwuLi5KLGNoaWxkcmVuOnA2fSl9KSxtNj1EMChmdW5jdGlvbih7b25DbGljazpaLC4uLkp9LFkpe2xldCBxPVg0KCJTY3JlZW5zaG90QnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiU2NyZWVuc2hvdCIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGB4Y3J1biBzaW1jdGwgaW8gJHtxLmRldmljZVVkaWR9IHNjcmVlbnNob3Qgfi9EZXNrdG9wL2hhdGNoLXNjcmVlbnNob3QtJChkYXRlICslcykucG5nYCl9LC4uLkosY2hpbGRyZW46ZzZ9KX0pLGY2PUQwKGZ1bmN0aW9uKHtvbkNsaWNrOlosLi4uSn0sWSl7bGV0IHE9WDQoIlJvdGF0ZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IlJvdGF0ZSBkZXZpY2UiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VVZGlkKXEuZXhlYyhgb3Nhc2NyaXB0IC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTaW11bGF0b3IiIHRvIGFjdGl2YXRlJyAtZSAndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8ga2V5IGNvZGUgMTI0IHVzaW5nIHtjb21tYW5kIGRvd259J2ApfSwuLi5KLGNoaWxkcmVuOng2fSl9KSx0PVQ2O3QuVGl0bGU9UzY7dC5BY3Rpb25zPWo2O3QuQnV0dG9uPVo0O3QuSG9tZUJ1dHRvbj1oNjt0LlNjcmVlbnNob3RCdXR0b249bTY7dC5Sb3RhdGVCdXR0b249ZjY7ZnVuY3Rpb24gZDYoWCl7bGV0W1osSl09UyhudWxsKSxZPXcobmV3IFNldCksW3EsUV09UyhudWxsKSxLPWooKFcpPT57cmV0dXJuIFkuY3VycmVudC5hZGQoVyksKCk9PntZLmN1cnJlbnQuZGVsZXRlKFcpfX0sW10pO3JldHVybiBnKCgpPT57aWYoIVgpcmV0dXJuO2xldCBXPW5ldyBBYm9ydENvbnRyb2xsZXIsRz1YLnJlcGxhY2UoL1wvc3RyZWFtXC5tanBlZyQvLCIiKTtyZXR1cm4gZmV0Y2goYCR7R30vY29uZmlnYCx7c2lnbmFsOlcuc2lnbmFsfSkudGhlbigoeik9PnouanNvbigpKS50aGVuKCh6KT0+e2lmKHoud2lkdGg+MCYmei5oZWlnaHQ+MClKKHopfSkuY2F0Y2goKCk9Pnt9KSwoYXN5bmMoKT0+e3RyeXtsZXQgTz0oYXdhaXQgZmV0Y2goWCx7c2lnbmFsOlcuc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFPKXJldHVybjtsZXQgJD1uZXcgVWludDhBcnJheSgwKTt3aGlsZSghMCl7bGV0e2RvbmU6Xyx2YWx1ZTpBfT1hd2FpdCBPLnJlYWQoKTtpZihfKWJyZWFrO2xldCBNPW5ldyBVaW50OEFycmF5KCQubGVuZ3RoK0EubGVuZ3RoKTtNLnNldCgkKSxNLnNldChBLCQubGVuZ3RoKSwkPU07d2hpbGUoITApe2xldCBVPS0xO2ZvcihsZXQgRT0wO0U8JC5sZW5ndGgtMTtFKyspaWYoJFtFXT09PTI1NSYmJFtFKzFdPT09MjE2KXtVPUU7YnJlYWt9aWYoVT09PS0xKWJyZWFrO2xldCBrPS0xO2ZvcihsZXQgRT1VKzI7RTwkLmxlbmd0aC0xO0UrKylpZigkW0VdPT09MjU1JiYkW0UrMV09PT0yMTcpe2s9RSsyO2JyZWFrfWlmKGs9PT0tMSlicmVhaztsZXQgST0kLnNsaWNlKFUsayk7JD0kLnNsaWNlKGspO2xldCBDPW5ldyBCbG9iKFtJXSx7dHlwZToiaW1hZ2UvanBlZyJ9KSxoPVVSTC5jcmVhdGVPYmplY3RVUkwoQyk7UShoKTtmb3IobGV0IEUgb2YgWS5jdXJyZW50KUUoaCl9fX1jYXRjaHt9fSkoKSwoKT0+Vy5hYm9ydCgpfSxbWF0pLHtzdWJzY3JpYmVGcmFtZTpLLGZyYW1lOnEsY29uZmlnOlp9fXZhciBhNj17S2V5QTo0LEtleUI6NSxLZXlDOjYsS2V5RDo3LEtleUU6OCxLZXlGOjksS2V5RzoxMCxLZXlIOjExLEtleUk6MTIsS2V5SjoxMyxLZXlLOjE0LEtleUw6MTUsS2V5TToxNixLZXlOOjE3LEtleU86MTgsS2V5UDoxOSxLZXlROjIwLEtleVI6MjEsS2V5UzoyMixLZXlUOjIzLEtleVU6MjQsS2V5VjoyNSxLZXlXOjI2LEtleVg6MjcsS2V5WToyOCxLZXlaOjI5LERpZ2l0MTozMCxEaWdpdDI6MzEsRGlnaXQzOjMyLERpZ2l0NDozMyxEaWdpdDU6MzQsRGlnaXQ2OjM1LERpZ2l0NzozNixEaWdpdDg6MzcsRGlnaXQ5OjM4LERpZ2l0MDozOSxFbnRlcjo0MCxFc2NhcGU6NDEsQmFja3NwYWNlOjQyLFRhYjo0MyxTcGFjZTo0NCxNaW51czo0NSxFcXVhbDo0NixCcmFja2V0TGVmdDo0NyxCcmFja2V0UmlnaHQ6NDgsQmFja3NsYXNoOjQ5LFNlbWljb2xvbjo1MSxRdW90ZTo1MixCYWNrcXVvdGU6NTMsQ29tbWE6NTQsUGVyaW9kOjU1LFNsYXNoOjU2LENhcHNMb2NrOjU3LEYxOjU4LEYyOjU5LEYzOjYwLEY0OjYxLEY1OjYyLEY2OjYzLEY3OjY0LEY4OjY1LEY5OjY2LEYxMDo2NyxGMTE6NjgsRjEyOjY5LFByaW50U2NyZWVuOjcwLFNjcm9sbExvY2s6NzEsUGF1c2U6NzIsSW5zZXJ0OjczLEhvbWU6NzQsUGFnZVVwOjc1LERlbGV0ZTo3NixFbmQ6NzcsUGFnZURvd246NzgsQXJyb3dSaWdodDo3OSxBcnJvd0xlZnQ6ODAsQXJyb3dEb3duOjgxLEFycm93VXA6ODIsTnVtTG9jazo4MyxOdW1wYWREaXZpZGU6ODQsTnVtcGFkTXVsdGlwbHk6ODUsTnVtcGFkU3VidHJhY3Q6ODYsTnVtcGFkQWRkOjg3LE51bXBhZEVudGVyOjg4LE51bXBhZDE6ODksTnVtcGFkMjo5MCxOdW1wYWQzOjkxLE51bXBhZDQ6OTIsTnVtcGFkNTo5MyxOdW1wYWQ2Ojk0LE51bXBhZDc6OTUsTnVtcGFkODo5NixOdW1wYWQ5Ojk3LE51bXBhZDA6OTgsTnVtcGFkRGVjaW1hbDo5OSxDb250cm9sTGVmdDoyMjQsU2hpZnRMZWZ0OjIyNSxBbHRMZWZ0OjIyNixNZXRhTGVmdDoyMjcsQ29udHJvbFJpZ2h0OjIyOCxTaGlmdFJpZ2h0OjIyOSxBbHRSaWdodDoyMzAsTWV0YVJpZ2h0OjIzMX07ZnVuY3Rpb24gbDYoWCl7cmV0dXJuIGE2W1hdPz9udWxsfWFzeW5jIGZ1bmN0aW9uIE8wKFgpe3JldHVybihhd2FpdCBmZXRjaCgiL2V4ZWMiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7Y29tbWFuZDpYfSl9KSkuanNvbigpfWZ1bmN0aW9uIGM2KFgpe3RyeXtsZXQgWj1KU09OLnBhcnNlKFgpLEo9W107Zm9yKGxldFtZLHFdb2YgT2JqZWN0LmVudHJpZXMoWi5kZXZpY2VzPz97fSkpe2xldCBRPVkucmVwbGFjZSgvXmNvbVwuYXBwbGVcLkNvcmVTaW11bGF0b3JcLlNpbVJ1bnRpbWVcLi8sIiIpLnJlcGxhY2UoLy0vZywiLiIpO2ZvcihsZXQgSyBvZiBxKWlmKEsuaXNBdmFpbGFibGUpSi5wdXNoKHt1ZGlkOksudWRpZCxuYW1lOksubmFtZSxzdGF0ZTpLLnN0YXRlLHJ1bnRpbWU6UX0pfXJldHVybiBKfWNhdGNoe3JldHVybltdfX1mdW5jdGlvbiB2NShYKXtsZXQgWj1YLnRvTG93ZXJDYXNlKCk7aWYoWi5pbmNsdWRlcygiaXBob25lIikpcmV0dXJuIDA7aWYoWi5pbmNsdWRlcygiaXBhZCIpKXJldHVybiAxO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIDI7aWYoWi5pbmNsdWRlcygidmlzaW9uIikpcmV0dXJuIDM7cmV0dXJuIDR9ZnVuY3Rpb24geTUoWCl7bGV0IFo9WC50b0xvd2VyQ2FzZSgpO2lmKFouc3RhcnRzV2l0aCgiaW9zIikpcmV0dXJuIDA7aWYoWi5zdGFydHNXaXRoKCJpcGFkb3MiKSlyZXR1cm4gMTtpZihaLnN0YXJ0c1dpdGgoIndhdGNob3MiKSlyZXR1cm4gMjtpZihaLnN0YXJ0c1dpdGgoInZpc2lvbm9zIil8fFouc3RhcnRzV2l0aCgieHJvcyIpKXJldHVybiAzO3JldHVybiA0fWZ1bmN0aW9uIGk2KHtkZXZpY2VzOlgsc2VsZWN0ZWRVZGlkOlosbG9hZGluZzpKLGVycm9yOlksc3RvcHBpbmdVZGlkczpxLG9uUmVmcmVzaDpRLG9uU2VsZWN0Okssb25TdG9wOlcsdHJpZ2dlcjpHfSl7bGV0W3osT109UyghMSksJD13KG51bGwpO2coKCk9PntpZigheilyZXR1cm47bGV0IFU9KGspPT57aWYoISQuY3VycmVudD8uY29udGFpbnMoay50YXJnZXQpKU8oITEpfTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsVSksKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLFUpfSxbel0pO2xldCBfPW5ldyBNYXA7Zm9yKGxldCBVIG9mIFgpe2lmKFUudWRpZD09PVopY29udGludWU7bGV0IGs9Xy5nZXQoVS5ydW50aW1lKTtpZighaylrPVtdLF8uc2V0KFUucnVudGltZSxrKTtrLnB1c2goVSl9Zm9yKGxldCBVIG9mIF8udmFsdWVzKCkpVS5zb3J0KChrLEkpPT52NShrLm5hbWUpLXY1KEkubmFtZSl8fGsubmFtZS5sb2NhbGVDb21wYXJlKEkubmFtZSkpO2xldCBBPVsuLi5fLmVudHJpZXMoKV0uc29ydCgoW1VdLFtrXSk9Pnk1KFUpLXk1KGspfHxVLmxvY2FsZUNvbXBhcmUoaykpLE09WC5maW5kKChVKT0+VS51ZGlkPT09Wik/P251bGw7cmV0dXJuIE4oImRpdiIse3JlZjokLHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUifSxjaGlsZHJlbjpbTigiZGl2Iix7b25DbGljazooKT0+e2lmKCF6KVEoKTtPKChVKT0+IVUpfSxjaGlsZHJlbjpHfSkseiYmTigiZGl2Iix7c3R5bGU6bzYsY2hpbGRyZW46W04oImRpdiIse3N0eWxlOnM2LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2ZvbnRXZWlnaHQ6NjAwfSxjaGlsZHJlbjoiU2ltdWxhdG9ycyJ9KSxOKCJidXR0b24iLHtvbkNsaWNrOihVKT0+e1Uuc3RvcFByb3BhZ2F0aW9uKCksUSgpfSxkaXNhYmxlZDpKLHN0eWxlOnI2LGNoaWxkcmVuOko/Ii4uLiI6IlJlZnJlc2gifSldfSksWSYmTigiZGl2Iix7c3R5bGU6dDYsY2hpbGRyZW46WX0pLE0mJk4oZix7Y2hpbGRyZW46W04oImRpdiIse3N0eWxlOnsuLi5nNSxjb2xvcjoiI2E1YjRmYyJ9LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6cDUoTS5zdGF0ZT09PSJCb290ZWQiPyIjNGFkZTgwIjoiIzQ0NCIpfSksTigic3BhbiIse3N0eWxlOntmbGV4OjF9LGNoaWxkcmVuOk0ubmFtZX0pXX0pLE4oImRpdiIse3N0eWxlOm42fSldfSksWC5sZW5ndGg9PT0wJiYhSiYmIVkmJk4oImRpdiIse3N0eWxlOmU2LGNoaWxkcmVuOiJObyBhdmFpbGFibGUgc2ltdWxhdG9ycyBmb3VuZCJ9KSxBLm1hcCgoW1Usa10pPT5OKCJkaXYiLHtjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6WDcsY2hpbGRyZW46VX0pLGsubWFwKChJKT0+e2xldCBDPXEuaGFzKEkudWRpZCksaD1JLnN0YXRlPT09IkJvb3RlZCI7cmV0dXJuIE4oImRpdiIse3N0eWxlOmc1LG9uTW91c2VFbnRlcjooRSk9PkUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDI1NSwyNTUsMjU1LDAuMDgpIixvbk1vdXNlTGVhdmU6KEUpPT5FLmN1cnJlbnRUYXJnZXQuc3R5bGUuYmFja2dyb3VuZD0idHJhbnNwYXJlbnQiLG9uQ2xpY2s6KCk9PntLKEkpLE8oITEpfSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnA1KGg/IiM0YWRlODAiOiIjNDQ0Iil9KSxOKCJzcGFuIix7c3R5bGU6e2ZsZXg6MX0sY2hpbGRyZW46SS5uYW1lfSksaCYmTigic3BhbiIse3JvbGU6ImJ1dHRvbiIsb25DbGljazooRSk9PntpZihFLnN0b3BQcm9wYWdhdGlvbigpLCFDKVcoSS51ZGlkKX0sc3R5bGU6e2ZvbnRTaXplOjEwLHBhZGRpbmc6IjFweCA2cHgiLGJvcmRlclJhZGl1czo0LGNvbG9yOkM/IiM4ODgiOiIjZjg3MTcxIixiYWNrZ3JvdW5kOkM/InRyYW5zcGFyZW50IjoicmdiYSgyNDgsMTEzLDExMywwLjEpIixjdXJzb3I6Qz8iZGVmYXVsdCI6InBvaW50ZXIifSxjaGlsZHJlbjpDPyJTdG9wcGluZy4uLiI6IlN0b3AifSldfSxJLnVkaWQpfSldfSxVKSldfSldfSl9ZnVuY3Rpb24gcDUoWCl7cmV0dXJue3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6WCxmbGV4U2hyaW5rOjB9fWZ1bmN0aW9uIHU2KCl7bGV0IFg9d2luZG93Ll9fU0lNX1BSRVZJRVdfXyxbWixKXT1TKCExKSxbWSxxXT1TKFtdKSxbUSxLXT1TKCExKSxbVyxHXT1TKG51bGwpLFt6LE9dPVMobmV3IFNldCksWyQsX109UyghMSksQT1qKGFzeW5jKCk9PntLKCEwKSxHKG51bGwpO3RyeXtsZXQgRj1hd2FpdCBPMCgieGNydW4gc2ltY3RsIGxpc3QgZGV2aWNlcyBhdmFpbGFibGUgLWoiKTtpZihGLmV4aXRDb2RlIT09MCl0aHJvdyBFcnJvcihGLnN0ZGVycnx8InNpbWN0bCBsaXN0IGZhaWxlZCIpO3EoYzYoRi5zdGRvdXQpKX1jYXRjaChGKXtHKEYgaW5zdGFuY2VvZiBFcnJvcj9GLm1lc3NhZ2U6IkZhaWxlZCB0byBsaXN0IGRldmljZXMiKX1maW5hbGx5e0soITEpfX0sW10pO2lmKGcoKCk9PntBKCl9LFtBXSksZygoKT0+e2lmKCFYPy5sb2dzRW5kcG9pbnQpcmV0dXJuO2xldCBGPW5ldyBFdmVudFNvdXJjZShYLmxvZ3NFbmRwb2ludCksUj1uZXcgTWFwLHY9WyIjOGJlOWZkIiwiIzUwZmE3YiIsIiNmZmI4NmMiLCIjZmY3OWM2IiwiI2JkOTNmOSIsIiNmMWZhOGMiLCIjNjI3MmE0IiwiI2ZmNTU1NSIsIiM2OWZmOTQiLCIjZDZhY2ZmIiwiI2ZmZmZhNSIsIiNhNGZmZmYiLCIjZmY2ZTZlIiwiI2NhYTlmYSIsIiM1YWY3OGUiXTtmdW5jdGlvbiBUKEowKXtsZXQgeT1SLmdldChKMCk7aWYoIXkpe2xldCBYMD0wO2ZvcihsZXQgYT0wO2E8SjAubGVuZ3RoO2ErKylYMD0oWDA8PDUpLVgwK0owLmNoYXJDb2RlQXQoYSl8MDt5PXZbTWF0aC5hYnMoWDApJXYubGVuZ3RoXSxSLnNldChKMCx5KX1yZXR1cm4geX1sZXQgdT0iIixtPSExO3JldHVybiBGLm9ubWVzc2FnZT0oSjApPT57dHJ5e2xldCB5PUpTT04ucGFyc2UoSjAuZGF0YSksWDA9eS5wcm9jZXNzSW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz95LnNlbmRlckltYWdlUGF0aD8uc3BsaXQoIi8iKS5wb3AoKT8/IiIsYT15LnN1YnN5c3RlbT8/IiIsVjA9eS5jYXRlZ29yeT8/IiIsWTA9eS5ldmVudE1lc3NhZ2U/PyIiO2lmKCFZMClyZXR1cm47aWYoWDAhPT11KXtpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtsZXQgTTA9VChYMCk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke1gwfSR7YT9gICVjJHthfSR7VjA/IjoiK1YwOiIifWA6IiJ9YCxgY29sb3I6JHtNMH07Zm9udC13ZWlnaHQ6Ym9sZGAsLi4uYT9bImNvbG9yOiM4ODg7Zm9udC13ZWlnaHQ6bm9ybWFsIl06W10pLG09ITAsdT1YMH1sZXQgYz0oeS5tZXNzYWdlVHlwZT8/IiIpLnRvTG93ZXJDYXNlKCksbz1hJiZYMD09PXU/YCVjJHtWMHx8YX0lYyBgOiIiLEEwPW8/WyJjb2xvcjojODg4O2ZvbnQtc3R5bGU6aXRhbGljIiwiY29sb3I6aW5oZXJpdCJdOltdO2lmKGM9PT0iZmF1bHQifHxjPT09ImVycm9yIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihjPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojNjI3MmE0Iik7ZWxzZSBjb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjppbmhlcml0Iil9Y2F0Y2h7fX0sKCk9PntpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtGLmNsb3NlKCl9fSxbWD8ubG9nc0VuZHBvaW50XSksIVgpcmV0dXJuIE4oImRpdiIse3N0eWxlOk4wLnBhZ2UsY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6TjAuZW1wdHksY2hpbGRyZW46W04oImgxIix7c3R5bGU6TjAuZW1wdHlUaXRsZSxjaGlsZHJlbjoiTm8gc2VydmUtc2ltIHN0cmVhbSBydW5uaW5nIn0pLE4oInAiLHtzdHlsZTpOMC5lbXB0eUhpbnQsY2hpbGRyZW46WyJCb290IGFuIGlPUyBzaW11bGF0b3IgYW5kIHN0YXJ0IGEgSGF0Y2ggc3RyZWFtIHdpdGgiLCIgIixOKCJjb2RlIix7c3R5bGU6TjAuY29kZSxjaGlsZHJlbjoiYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2gifSksIiwgdGhlbiByZWxvYWQuIl19KV19KX0pO2xldCBNPVkuZmluZCgoRik9PkYudWRpZD09PVguZGV2aWNlKT8/bnVsbDtnKCgpPT57ZG9jdW1lbnQudGl0bGU9TT8ubmFtZT9gU2ltdWxhdG9yIC0gJHtNLm5hbWV9YDoiU2ltdWxhdG9yIFByZXZpZXcifSxbTT8ubmFtZV0pO2xldCBVPWswKE0/Lm5hbWUpLGs9JDBbVV0sST1rLndpZHRoLTIqay5iZXplbFgsQz1rLmhlaWdodC0yKmsuYmV6ZWxZLGg9ZTAoVSksRT1VPT09InZpc2lvbiI/NTgwOlU9PT0iaXBhZCI/NDAwOlU9PT0id2F0Y2giPzIwMDozMjAsZT1kNihYLnN0cmVhbVVybCksWjA9dyhudWxsKTtnKCgpPT57bGV0IEY9bmV3IFdlYlNvY2tldChYLndzVXJsKTtyZXR1cm4gRi5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsWjAuY3VycmVudD1GLCgpPT57Ri5jbG9zZSgpLFowLmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IHg9aigoRixSKT0+e2xldCB2PVowLmN1cnJlbnQ7aWYoIXZ8fHYucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgVD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoUikpLHU9bmV3IFVpbnQ4QXJyYXkoMStULmxlbmd0aCk7dVswXT1GLHUuc2V0KFQsMSksdi5zZW5kKHUpfSxbXSksSzA9aigoRik9PngoMyxGKSxbeF0pLHM9aigoRik9PngoNSxGKSxbeF0pLHI9aigoRik9PngoNCx7YnV0dG9uOkZ9KSxbeF0pLFUwPWooKEYsUik9Pnt4KDYse3R5cGU6Rix1c2FnZTpSfSl9LFt4XSksW2owLHYwXT1TKG51bGwpO2coKCk9PntsZXQgRj1uZXcgRXZlbnRTb3VyY2UoIi9hcHBzdGF0ZSIpLFI9bnVsbDtyZXR1cm4gRi5vbm1lc3NhZ2U9KHYpPT57dHJ5e2xldCBUPUpTT04ucGFyc2Uodi5kYXRhKTtpZihSKWNsZWFyVGltZW91dChSKTtsZXQgdT1UPy5pc1JlYWN0TmF0aXZlPzA6NjAwO1I9c2V0VGltZW91dCgoKT0+djAoVCksdSl9Y2F0Y2h7fX0sKCk9PntpZihSKWNsZWFyVGltZW91dChSKTtGLmNsb3NlKCl9fSxbXSk7bGV0IEcwPWooYXN5bmMoKT0+e1UwKCJkb3duIiwyMjcpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoImRvd24iLDIxKSxhd2FpdCBuZXcgUHJvbWlzZSgodik9PnNldFRpbWVvdXQodiwzMCkpLFUwKCJ1cCIsMjEpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoInVwIiwyMjcpfSxbVTBdKTtnKCgpPT57bGV0IEY9KFQsdSk9PntpZihULmNvZGU9PT0iS2V5SCImJlQubWV0YUtleSYmVC5zaGlmdEtleSl7aWYoVC5wcmV2ZW50RGVmYXVsdCgpLHU9PT0iZG93biImJiFULnJlcGVhdCl4KDQse2J1dHRvbjoiaG9tZSJ9KTtyZXR1cm59aWYoVC5jb2RlPT09IktleUEiJiZULm1ldGFLZXkmJlQuc2hpZnRLZXkpe2lmKFQucHJldmVudERlZmF1bHQoKSx1PT09ImRvd24iJiYhVC5yZXBlYXQpTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlYCkudGhlbigoSjApPT57bGV0IHk9SjAuc3Rkb3V0LnRyaW0oKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIjtyZXR1cm4gTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlICR7eX1gKX0pLmNhdGNoKCgpPT57fSk7cmV0dXJufWxldCBtPWw2KFQuY29kZSk7aWYobT09bnVsbClyZXR1cm47VC5wcmV2ZW50RGVmYXVsdCgpLHgoNix7dHlwZTp1LHVzYWdlOm19KX0sUj0oVCk9PkYoVCwiZG93biIpLHY9KFQpPT5GKFQsInVwIik7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixSKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLHYpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLFIpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdil9fSxbeCxYLmRldmljZV0pO2xldCBKND1qKGFzeW5jKEYpPT57aWYoJHx8Ri51ZGlkPT09WC5kZXZpY2UpcmV0dXJuO18oITApO3RyeXtpZihGLnN0YXRlIT09IkJvb3RlZCIpYXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBib290ICR7Ri51ZGlkfWApO2F3YWl0IE8wKGBidW54IHNlcnZlLXNpbSAtLWtpbGwgJHtYLmRldmljZX1gKSxhd2FpdCBPMChgYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2ggJHtGLnVkaWR9YCksd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfWNhdGNoe18oITEpfX0sWyQsWC5kZXZpY2VdKSxJMD1qKGFzeW5jKEYpPT57TygoUik9Pm5ldyBTZXQoUikuYWRkKEYpKTt0cnl7YXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBzaHV0ZG93biAke0Z9YCksYXdhaXQgQSgpfWZpbmFsbHl7TygoUik9PntsZXQgdj1uZXcgU2V0KFIpO3JldHVybiB2LmRlbGV0ZShGKSx2fSl9fSxbQV0pO3JldHVybiBOKCJkaXYiLHtzdHlsZTpOMC5wYWdlLGNoaWxkcmVuOltOKHQse2V4ZWM6TzAsZGV2aWNlVWRpZDpYLmRldmljZSxkZXZpY2VOYW1lOk0/Lm5hbWU/P251bGwsZGV2aWNlUnVudGltZTpNPy5ydW50aW1lPz9udWxsLHN0cmVhbWluZzpaLHN0eWxlOnttYXhXaWR0aDpFfSxjaGlsZHJlbjpbTihpNix7ZGV2aWNlczpZLHNlbGVjdGVkVWRpZDpYLmRldmljZSxsb2FkaW5nOlEsZXJyb3I6VyxzdG9wcGluZ1VkaWRzOnosb25SZWZyZXNoOkEsb25TZWxlY3Q6SjQsb25TdG9wOkkwLHRyaWdnZXI6Tih0LlRpdGxlLHt9KX0pLE4odC5BY3Rpb25zLHtjaGlsZHJlbjpbajA/LmlzUmVhY3ROYXRpdmUmJk4odC5CdXR0b24seyJhcmlhLWxhYmVsIjoiUmVsb2FkIFJlYWN0IE5hdGl2ZSBidW5kbGUiLHRpdGxlOiJSZWxvYWQgKENtZCtSKSIsb25DbGljazooKT0+dm9pZCBHMCgpLGNoaWxkcmVuOk4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTMgMTJhOSA5IDAgMSAwIDMuNS03LjEifSksTigicG9seWxpbmUiLHtwb2ludHM6IjMgMyAzIDkgOSA5In0pXX0pfSksTih0LkhvbWVCdXR0b24se29uQ2xpY2s6KEYpPT57Ri5wcmV2ZW50RGVmYXVsdCgpLHIoImhvbWUiKX19KSxOKHQuU2NyZWVuc2hvdEJ1dHRvbix7fSksTih0LlJvdGF0ZUJ1dHRvbix7fSldfSldfSksTigiZGl2Iix7c3R5bGU6e21heFdpZHRoOkUsd2lkdGg6IjEwMCUiLGFzcGVjdFJhdGlvOmAke0l9IC8gJHtDfWB9LGNoaWxkcmVuOk4objAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOmgsY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOkosb25TdHJlYW1Ub3VjaDpLMCxvblN0cmVhbU11bHRpVG91Y2g6cyxvblN0cmVhbUJ1dHRvbjpyLHN1YnNjcmliZUZyYW1lOmUuc3Vic2NyaWJlRnJhbWUsc3RyZWFtRnJhbWU6ZS5mcmFtZSxzdHJlYW1Db25maWc6ZS5jb25maWd9KX0pLE4oImRpdiIse3N0eWxlOk4wLmJhcixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6ey4uLk4wLmxpdmUsY29sb3I6Wj8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnsuLi5OMC5kb3QsYmFja2dyb3VuZDpaPyIjNGFkZTgwIjoiIzY2NiJ9fSksWj8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIE4wPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX0sbzY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiJjYWxjKDEwMCUgKyA2cHgpIixsZWZ0OjAsbWluV2lkdGg6MjYwLG1heEhlaWdodDozNjAsb3ZlcmZsb3dZOiJhdXRvIixiYWNrZ3JvdW5kOiIjMWMxYzFlIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIixib3JkZXJSYWRpdXM6MTAscGFkZGluZzo0LGJveFNoYWRvdzoiMCA4cHggMjRweCByZ2JhKDAsMCwwLDAuNSkiLGZvbnRGYW1pbHk6InVpLW1vbm9zcGFjZSwgbW9ub3NwYWNlIixmb250U2l6ZToxMyxjb2xvcjoiI2VlZSIsekluZGV4OjIwfSxzNj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNnB4IDEwcHgiLGZvbnRTaXplOjExLGNvbG9yOiIjYWFhIn0scjY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjYTViNGZjIixmb250U2l6ZToxMSxjdXJzb3I6InBvaW50ZXIiLHBhZGRpbmc6MH0sdDY9e3BhZGRpbmc6IjZweCAxMHB4Iixjb2xvcjoiI2Y4NzE3MSIsZm9udFNpemU6MTF9LGc1PXtkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo4LHBhZGRpbmc6IjZweCAxMHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4xNXMifSxuNj17aGVpZ2h0OjEsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjA4KSIsbWFyZ2luOiI0cHggMCJ9LGU2PXtwYWRkaW5nOjEyLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGZvbnRTaXplOjExLHRleHRBbGlnbjoiY2VudGVyIn0sWDc9e3BhZGRpbmc6IjZweCAxMHB4IDJweCIsZm9udFNpemU6MTAsZm9udFdlaWdodDo2MDAsY29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsdGV4dFRyYW5zZm9ybToidXBwZXJjYXNlIixsZXR0ZXJTcGFjaW5nOiIwLjA4ZW0ifTtPNShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIoTih1Nix7fSkpOwo8L3NjcmlwdD4KPC9ib2R5PjwvaHRtbD4=","base64").toString("utf-8");return P}function Ie(e){let _=(e?.basePath??"/.sim").replace(/\/+$/,"");return(t,s,r)=>{let S=t.url??"";if(S===_||S===_+"/"){let C=h()[0]??null,$=Me();if(C){let n=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...C,logsEndpoint:_+"/logs"})}</script>`;$=$.replace("<!--__SIM_PREVIEW_CONFIG__-->",n)}s.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),s.end($);return}if(S===_+"/api"){let o=h();s.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),s.end(JSON.stringify(o[0]||null));return}if((S===_+"/exec"||S===_+"/exec/")&&t.method==="POST"){let o="";t.on("data",(C)=>{o+=typeof C==="string"?C:C.toString()}),t.on("end",()=>{let C="";try{C=JSON.parse(o).command??""}catch{}if(!C){s.writeHead(400,{"Content-Type":"application/json"}),s.end(JSON.stringify({stdout:"",stderr:"Missing command",exitCode:1}));return}Oe(C,{maxBuffer:16777216},($,i,n)=>{s.writeHead(200,{"Content-Type":"application/json"}),s.end(JSON.stringify({stdout:i.toString(),stderr:n.toString(),exitCode:$?$.code??1:0}))})});return}if(S===_+"/logs"||S.startsWith(_+"/logs?")){let o=h();if(o.length===0){s.writeHead(404),s.end("No serve-sim device");return}let C=o[0].device;s.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),s.write(`:
4
4
 
5
- `);let $=G("xcrun",["simctl","spawn",C,"log","stream","--style","ndjson","--level","info"],{stdio:["ignore","pipe","ignore"]}),r="";$.stdout.on("data",(a)=>{r+=a.toString();let n;while((n=r.indexOf(`
6
- `))!==-1){let y=r.slice(0,n).trim();if(r=r.slice(n+1),y)s.write("data: "+y+`
5
+ `);let $=x("xcrun",["simctl","spawn",C,"log","stream","--style","ndjson","--level","info"],{stdio:["ignore","pipe","ignore"]}),i="";$.stdout.on("data",(n)=>{i+=n.toString();let a;while((a=i.indexOf(`
6
+ `))!==-1){let y=i.slice(0,a).trim();if(i=i.slice(a+1),y)s.write("data: "+y+`
7
7
 
8
8
  `)}}),$.on("close",()=>s.end()),t.on("close",()=>$.kill());return}if(S===_+"/appstate"||S.startsWith(_+"/appstate?")){let o=h();if(o.length===0){s.writeHead(404),s.end("No serve-sim device");return}let C=o[0].device;s.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),s.write(`:
9
9
 
10
- `);let $=G("xcrun",["simctl","spawn",C,"log","stream","--style","ndjson","--level","info","--predicate",'process == "SpringBoard" AND eventMessage CONTAINS "Setting process visibility to: Foreground"'],{stdio:["ignore","pipe","ignore"]}),r=/\[app<([^>]+)>:(\d+)\] Setting process visibility to: Foreground/,a="",n="";$.stdout.on("data",(y)=>{n+=y.toString();let A;while((A=n.indexOf(`
11
- `))!==-1){let c=n.slice(0,A).trim();if(n=n.slice(A+1),!c)continue;let R;try{R=JSON.parse(c).eventMessage??""}catch{continue}let E=r.exec(R);if(!E)continue;let d=E[1],fe=parseInt(E[2],10);if(!We(d))continue;if(d===a)continue;a=d,Pe(C,d).then((Te)=>{s.write("data: "+JSON.stringify({bundleId:d,pid:fe,isReactNative:Te})+`
10
+ `);let $=x("xcrun",["simctl","spawn",C,"log","stream","--style","ndjson","--level","info","--predicate",'process == "SpringBoard" AND eventMessage CONTAINS "Setting process visibility to: Foreground"'],{stdio:["ignore","pipe","ignore"]}),i=/\[app<([^>]+)>:(\d+)\] Setting process visibility to: Foreground/,n="",a="";$.stdout.on("data",(y)=>{a+=y.toString();let R;while((R=a.indexOf(`
11
+ `))!==-1){let D=a.slice(0,R).trim();if(a=a.slice(R+1),!D)continue;let A;try{A=JSON.parse(D).eventMessage??""}catch{continue}let c=i.exec(A);if(!c)continue;let B=c[1],W=parseInt(c[2],10);if(!We(B))continue;if(B===n)continue;n=B,Pe(C,B).then((Te)=>{s.write("data: "+JSON.stringify({bundleId:B,pid:W,isReactNative:Te})+`
12
12
 
13
- `)})}}),$.on("close",()=>s.end()),t.on("close",()=>$.kill());return}if(i)i()}}var x,Ne,Ve,Le,b,W=null;var j=le(()=>{x=P(He(),"serve-sim"),Ne=new Set(["host.exp.Exponent","dev.expo.Exponent"]),Ve=["Frameworks/React.framework","Frameworks/hermes.framework","Frameworks/Hermes.framework","Frameworks/ExpoModulesCore.framework","main.jsbundle"],Le=/(WidgetRenderer|ExtensionHost|\.extension(\.|$)|Service|PlaceholderApp|InCallService|CallUI|InCallUI|com\.apple\.Preferences\.Cellular|com\.apple\.purplebuddy|com\.apple\.chrono|com\.apple\.shuttle|com\.apple\.usernotificationsui)/i;b={at:0,booted:null}});import{execSync as f,spawn as J}from"child_process";import{chmodSync as Ue,existsSync as F,mkdirSync as Z,openSync as Y,closeSync as ee,readFileSync as H,unlinkSync as N,writeFileSync as _e}from"fs";import{createHash as ke}from"crypto";import{homedir as Xe,networkInterfaces as Ge}from"os";import{join as xe,resolve as q}from"path";import{tmpdir as Fe}from"os";import{join as g}from"path";import{readdirSync as ue}from"fs";var T=g(Fe(),"serve-sim"),c_=g(T,"server.json");function w(e){return g(T,`server-${e}.json`)}function v(){try{return ue(T).filter((e)=>e.startsWith("server-")&&e.endsWith(".json")).map((e)=>g(T,e))}catch{return[]}}var D="./serve-sim-bin-6s7pkkx4.";function k(){if(!F(T))Z(T,{recursive:!0})}function p(e){if(e)return M(w(e));for(let _ of v()){let t=M(_);if(t)return t}return null}var O={at:0,booted:null};function Ke(){let e=Date.now();if(O.booted&&e-O.at<1000)return O.booted;try{let _=f("xcrun simctl list devices booted -j",{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:3000}),t=JSON.parse(_),s=new Set;for(let i of Object.values(t.devices))for(let S of i)if(S.state==="Booted")s.add(S.udid);return O={at:e,booted:s},s}catch{return null}}function M(e){try{if(!F(e))return null;let _=JSON.parse(H(e,"utf-8"));try{process.kill(_.pid,0)}catch{return N(e),null}let t=Ke();if(t&&!t.has(_.device)){console.error(`[serve-sim] Helper pid ${_.pid} is bound to device ${_.device} which is no longer booted \u2014 killing stale helper.`);try{process.kill(_.pid,"SIGTERM")}catch{}try{N(e)}catch{}return null}return _}catch{return null}}function V(){let e=[];for(let _ of v()){let t=M(_);if(t)e.push(t)}return e}function z(e){k(),_e(w(e.device),JSON.stringify(e,null,2))}function u(e){if(e)try{N(w(e))}catch{}else for(let _ of v())try{N(_)}catch{}}function je(){let e=D.startsWith("/$bunfs/");if(!e&&F(D))return D;if(!e){let S=q(import.meta.dir,"../bin/serve-sim-bin");if(F(S))return S;throw Error(`serve-sim-bin not found. Run 'bun run build:swift' first.
14
- Checked: ${D}, ${S}`)}let _=H(D),t=ke("sha256").update(_).digest("hex").slice(0,16),s=q(Xe(),"Library/Caches/serve-sim");Z(s,{recursive:!0});let i=q(s,`serve-sim-bin-${t}`);if(!F(i)){_e(i,_),Ue(i,493);try{f(`codesign -s - -f ${JSON.stringify(i)}`,{stdio:"ignore"})}catch{}}return i}function te(){try{let e=f("xcrun simctl list devices booted -j",{encoding:"utf-8"}),_=JSON.parse(e);for(let t of Object.values(_.devices))for(let s of t)if(s.state==="Booted")return s.udid}catch{}return null}function Q(e){try{let _=f("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let i of s)if(i.udid===e)return i.name}catch{}return null}function L(e){if(/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i.test(e))return e;try{let _=f("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let i of s)if(i.name.toLowerCase()===e.toLowerCase())return i.udid}catch{}console.error(`Could not resolve device: ${e}`),process.exit(1)}function se(e){try{let _=f("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let i of s)if(i.udid===e)return i.state==="Booted"}catch{}return!1}function I(e){try{return process.kill(e,0),!0}catch{return!1}}function U(e){try{process.kill(e,"SIGTERM")}catch{return}let _=Date.now()+500;while(Date.now()<_)try{process.kill(e,0),Bun.sleepSync(25)}catch{return}try{process.kill(e,"SIGKILL")}catch{}let t=Date.now()+500;while(Date.now()<t)try{process.kill(e,0),Bun.sleepSync(25)}catch{return}}function ze(e){try{let _=f(`lsof -ti tcp:${e}`,{encoding:"utf-8",stdio:"pipe"}).trim();if(!_)return[];let t=process.pid;return _.split(`
15
- `).map((s)=>parseInt(s,10)).filter((s)=>Number.isFinite(s)&&s!==t)}catch{return[]}}function Qe(e){let _=ze(e);if(_.length===0)return;console.log(`\x1B[90mPort ${e} busy, killing holder pid(s): ${_.join(", ")}\x1B[0m`);for(let t of _)try{process.kill(t,"SIGKILL")}catch{}Bun.sleepSync(100)}function Je(e){if(!se(e))try{f(`xcrun simctl boot ${e}`,{encoding:"utf-8",stdio:"pipe"})}catch(_){let t=(_.stderr??_.message??"").toLowerCase();if(!t.includes("booted")&&!t.includes("current state"))throw Error(`Failed to boot device ${e}: ${_.stderr||_.message}`)}try{f("open -ga Simulator",{encoding:"utf-8",stdio:"pipe",timeout:3000})}catch{}}function Ze(){let e=Ge();for(let _ of Object.values(e))for(let t of _??[])if(t.family==="IPv4"&&!t.internal)return t.address;return null}async function Se(e){let _=new Set(V().map((t)=>t.port));for(let t=e;t<e+100;t++){if(_.has(t))continue;try{return Bun.serve({port:t,fetch:()=>new Response("ok")}).stop(!0),t}catch{continue}}throw Error(`No available port found in range ${e}-${e+99}`)}async function Ye(e){Je(e);try{f(`xcrun simctl bootstatus ${e} -b`,{encoding:"utf-8",stdio:"pipe",timeout:60000})}catch(_){if(!se(e))console.error(`Device ${e} failed to reach booted state: ${_.stderr||_.message}`),process.exit(1)}}async function ie(e,_,t,s){let i=!1;for(let o=0;o<30;o++){if(!s())break;try{if((await fetch(`${_}/health`)).ok){i=!0;break}}catch{}await new Promise((C)=>setTimeout(C,100))}if(i){let o=Date.now()+8000;while(Date.now()<o){if(await new Promise((C)=>setTimeout(C,200)),!s()){i=!1;break}try{if(H(t,"utf-8").includes("Capture started"))break}catch{}}}let S="";try{S=H(t,"utf-8").trim()}catch{}return{ready:i,log:S}}async function e_(e){let{helperPath:_,udid:t,port:s,host:i,logFile:S}=e,o=`http://${i}:${s}`;k();let C=Y(S,"w"),$=J(_,[t,"--port",String(s)],{detached:!0,stdio:["ignore",C,C]});$.unref(),ee(C);let r=$.pid,a=!1;$.once("exit",()=>{a=!0});let{ready:n,log:y}=await ie(r,o,S,()=>!a&&I(r));return{ready:n,pid:r,exited:a||!I(r),log:y}}async function __(e){let{helperPath:_,udid:t,port:s,host:i,logFile:S}=e,o=`http://${i}:${s}`;k();let C=Y(S,"w"),$=J(_,[t,"--port",String(s)],{detached:!1,stdio:["ignore",C,C]});ee(C);let r=$.pid,a=!1;$.once("exit",()=>{a=!0});let{ready:n,log:y}=await ie(r,o,S,()=>!a&&I(r));return{ready:n,child:$,log:y}}async function re(e,_,t){await Ye(e);let s="127.0.0.1",i=je(),S=xe(T,`server-${e}.log`),o={helperPath:i,udid:e,port:_,host:s,logFile:S},C="",$=2;for(let a=1;a<=$;a++){if(Qe(_),t.detach){let n=await e_(o);if(n.ready){let y={pid:n.pid,port:_,device:e,url:`http://${s}:${_}`,streamUrl:`http://${s}:${_}/stream.mjpeg`,wsUrl:`ws://${s}:${_}/ws`};return z(y),{pid:n.pid}}U(n.pid),C=n.log}else{let n=await __(o);if(n.ready){let y={pid:n.child.pid,port:_,device:e,url:`http://${s}:${_}`,streamUrl:`http://${s}:${_}/stream.mjpeg`,wsUrl:`ws://${s}:${_}/ws`};return z(y),{pid:n.child.pid,child:n.child}}U(n.child.pid),C=n.log}if(a<$)await new Promise((n)=>setTimeout(n,500))}let r=C?`Helper failed:
16
- ${C}`:"Helper process failed to start";console.error(r),process.exit(1)}async function t_(e,_,t){let s=e.length>0?e.map(L):(()=>{let r=te();if(!r)console.error("No device specified and no booted simulator found."),process.exit(1);return[r]})(),i=new Map,S=[],o=_;for(let r of s){let a=p(r);if(a){if(!t){let R=Q(r)??r;if(s.length>1)console.log(`
17
- ==> ${R} (${r}) <==`);console.log(` Already running on port ${a.port}`),console.log(` Stream: ${a.streamUrl}`),console.log(` WebSocket: ${a.wsUrl}`)}S.push(a);continue}o=await Se(o);let{pid:n,child:y}=await re(r,o,{detach:!1});if(y)i.set(r,y);let A="127.0.0.1",c={pid:n,port:o,device:r,url:`http://${A}:${o}`,streamUrl:`http://${A}:${o}/stream.mjpeg`,wsUrl:`ws://${A}:${o}/ws`};if(S.push(c),!t){let R=Q(r)??r;if(s.length>1)console.log(`
18
- ==> ${R} (${r}) <==`);console.log(` Stream: ${c.streamUrl}`),console.log(` WebSocket: ${c.wsUrl}`),console.log(` Port: ${o}`)}o++}if(S.length===1){let r=S[0];console.log(JSON.stringify({url:r.url,streamUrl:r.streamUrl,wsUrl:r.wsUrl,port:r.port,device:r.device}))}else console.log(JSON.stringify({devices:S.map((r)=>({url:r.url,streamUrl:r.streamUrl,wsUrl:r.wsUrl,port:r.port,device:r.device}))}));if(i.size===0)return;let C=!1,$=(r)=>{if(C)return;if(C=!0,!t)console.log(`
19
- Shutting down...`);for(let[a,n]of i){let y=n.pid;if(y)U(y);u(a)}i.clear(),process.exit(r)};for(let[r,a]of i)a.on("exit",(n)=>{if(C)return;if(!t)console.error(`[${r}] Helper exited (code ${n})`);if(u(r),i.delete(r),i.size===0)$(n??1)});process.on("SIGINT",()=>$(0)),process.on("SIGTERM",()=>$(0)),process.on("SIGHUP",()=>$(0)),process.on("exit",()=>{for(let[r,a]of i){try{if(a.pid)process.kill(a.pid,"SIGTERM")}catch{}try{u(r)}catch{}}}),await new Promise(()=>{})}async function Ce(e,_){let t=e.length>0?e.map(L):(()=>{let S=te();if(!S)console.error("No device specified and no booted simulator found."),process.exit(1);return[S]})(),s=[],i=_;for(let S of t){let o=p(S);if(o){s.push(o);continue}i=await Se(i),await re(S,i,{detach:!0});let C="127.0.0.1";s.push({pid:p(S).pid,port:i,device:S,url:`http://${C}:${i}`,streamUrl:`http://${C}:${i}/stream.mjpeg`,wsUrl:`ws://${C}:${i}/ws`}),i++}return s}function s_(e){if(e.length===1){let _=e[0];console.log(JSON.stringify({url:_.url,streamUrl:_.streamUrl,wsUrl:_.wsUrl,port:_.port,device:_.device}))}else console.log(JSON.stringify({devices:e.map((_)=>({url:_.url,streamUrl:_.streamUrl,wsUrl:_.wsUrl,port:_.port,device:_.device}))}))}function S_(e){if(e){let t=L(e),s=p(t);if(!s)console.log(JSON.stringify({running:!1,device:t}));else console.log(JSON.stringify({running:!0,url:s.url,streamUrl:s.streamUrl,wsUrl:s.wsUrl,port:s.port,device:s.device,pid:s.pid}));return}let _=V();if(_.length===0)console.log(JSON.stringify({running:!1}));else if(_.length===1){let t=_[0];console.log(JSON.stringify({running:!0,url:t.url,streamUrl:t.streamUrl,wsUrl:t.wsUrl,port:t.port,device:t.device,pid:t.pid}))}else console.log(JSON.stringify({running:!0,streams:_.map((t)=>({url:t.url,streamUrl:t.streamUrl,wsUrl:t.wsUrl,port:t.port,device:t.device,pid:t.pid}))}))}function i_(e){if(e){let _=L(e),t=p(_);if(!t){console.log(JSON.stringify({disconnected:!0,device:_}));return}try{process.kill(t.pid,"SIGTERM")}catch{}u(_),console.log(JSON.stringify({disconnected:!0,device:t.device}))}else{let _=V();if(_.length===0){console.log(JSON.stringify({disconnected:!0,devices:[]}));return}let t=[];for(let s of _){try{process.kill(s.pid,"SIGTERM")}catch{}t.push(s.device)}u(),console.log(JSON.stringify({disconnected:!0,devices:t}))}}async function r_(e){let _,t=[];for(let o=0;o<e.length;o++)if(e[o]==="--device"||e[o]==="-d")_=e[++o];else t.push(e[o]);let s=p(_);if(!s)console.error("No serve-sim server running. Run `serve-sim` first."),process.exit(1);let i=t[0];if(!i)console.error("Usage: serve-sim gesture '<json>'"),console.error(`Example: serve-sim gesture '{"type":"begin","x":0.5,"y":0.5}'`),process.exit(1);let S;try{S=JSON.parse(i)}catch{console.error("Invalid JSON:",i),process.exit(1)}return new Promise((o,C)=>{let $=new WebSocket(s.wsUrl);$.binaryType="arraybuffer",$.onopen=()=>{let r=new TextEncoder().encode(JSON.stringify(S)),a=new Uint8Array(1+r.length);a[0]=3,a.set(r,1),$.send(a),setTimeout(()=>{$.close(),o()},50)},$.onerror=()=>{console.error("Failed to connect to serve-sim server at",s.wsUrl),C(Error("WebSocket connection failed"))}})}async function C_(e){let _,t=[];for(let S=0;S<e.length;S++)if(e[S]==="--device"||e[S]==="-d")_=e[++S];else t.push(e[S]);let s=p(_);if(!s)console.error("No serve-sim server running. Run `serve-sim` first."),process.exit(1);let i=t[0]??"home";return new Promise((S,o)=>{let C=new WebSocket(s.wsUrl);C.binaryType="arraybuffer",C.onopen=()=>{let $=new TextEncoder().encode(JSON.stringify({button:i})),r=new Uint8Array(1+$.length);r[0]=4,r.set($,1),C.send(r),setTimeout(()=>{C.close(),S()},50)},C.onerror=()=>{console.error("Failed to connect to serve-sim server at",s.wsUrl),o(Error("WebSocket connection failed"))}})}async function o_(e,_,t){if(V().length===0)console.log("Starting simulator stream..."),await Ce(_,3100);let{simMiddleware:i}=await Promise.resolve().then(() => (j(),K)),S=i({basePath:"/"}),o=t?1:50,C=e,$,r=!1;for(let n=0;n<o;n++){let y=e+n;try{$_(y,S),C=y,r=!0;break}catch(A){if($=A,A?.code!=="EADDRINUSE")break}}if(!r){if($?.code==="EADDRINUSE")if(t)console.error(`Port ${e} is already in use. Pass a different --port or stop the other process.`);else console.error(`No available port found in range ${e}-${e+o-1}.`);else console.error(`Failed to start preview server: ${$?.message??$}`);process.exit(1)}let a=Ze();if(console.log(""),console.log(` - Local: http://localhost:${C}`),a)console.log(` - Network: http://${a}:${C}`);console.log(""),process.on("SIGINT",()=>process.exit(0)),process.on("SIGTERM",()=>process.exit(0)),await new Promise(()=>{})}function $_(e,_){return Bun.serve({port:e,idleTimeout:255,async fetch(t){return new Promise((s)=>{let i=new URL(t.url),S={url:i.pathname+i.search,method:t.method,headers:Object.fromEntries(t.headers.entries()),on(A,c){}},o=[];S.on=(A,c)=>{if(A==="close")o.push(c)},t.signal.addEventListener("abort",()=>{for(let A of o)A()});let C=200,$=new Headers,r=[],a=!1,n=null;_(S,{writeHead(A,c){if(C=A,c)for(let[R,E]of Object.entries(c))$.set(R,E)},setHeader(A,c){$.set(A,c)},get statusCode(){return C},set statusCode(A){C=A},write(A){if(!a){a=!0;let c=new ReadableStream({start(R){n=R}});s(new Response(c,{status:C,headers:$}))}try{n?.enqueue(typeof A==="string"?new TextEncoder().encode(A):A)}catch{}},end(A){if(a){if(A)try{n?.enqueue(typeof A==="string"?new TextEncoder().encode(A):A)}catch{}try{n?.close()}catch{}}else{if(A)r.push(A);let c=r.map((R)=>typeof R==="string"?R:new TextDecoder().decode(R)).join("");s(new Response(c,{status:C,headers:$}))}}},()=>{s(new Response("Not found",{status:404}))})})}})}function oe(){console.log(`
13
+ `)})}}),$.on("close",()=>s.end()),t.on("close",()=>$.kill());return}if(r)r()}}var K,Ne,Ve,Le,b,P=null;var z=Fe(()=>{K=q(He(),"serve-sim"),Ne=new Set(["host.exp.Exponent","dev.expo.Exponent"]),Ve=["Frameworks/React.framework","Frameworks/hermes.framework","Frameworks/Hermes.framework","Frameworks/ExpoModulesCore.framework","main.jsbundle"],Le=/(WidgetRenderer|ExtensionHost|\.extension(\.|$)|Service|PlaceholderApp|InCallService|CallUI|InCallUI|com\.apple\.Preferences\.Cellular|com\.apple\.purplebuddy|com\.apple\.chrono|com\.apple\.shuttle|com\.apple\.usernotificationsui)/i;b={at:0,booted:null}});import{execSync as T,spawn as Z}from"child_process";import{chmodSync as Ue,existsSync as l,mkdirSync as Y,openSync as ee,closeSync as _e,readFileSync as H,unlinkSync as N,writeFileSync as te}from"fs";import{createHash as ke}from"crypto";import{homedir as Xe,networkInterfaces as Ge}from"os";import{join as xe,resolve as M}from"path";import{tmpdir as le}from"os";import{join as g}from"path";import{readdirSync as ue}from"fs";var p=g(le(),"serve-sim"),c_=g(p,"server.json");function w(e){return g(p,`server-${e}.json`)}function v(){try{return ue(p).filter((e)=>e.startsWith("server-")&&e.endsWith(".json")).map((e)=>g(p,e))}catch{return[]}}var d="./serve-sim-bin-jx3xe3v9.";function X(){if(!l(p))Y(p,{recursive:!0})}function E(e){if(e)return I(w(e));for(let _ of v()){let t=I(_);if(t)return t}return null}var O={at:0,booted:null};function Ke(){let e=Date.now();if(O.booted&&e-O.at<1000)return O.booted;try{let _=T("xcrun simctl list devices booted -j",{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:3000}),t=JSON.parse(_),s=new Set;for(let r of Object.values(t.devices))for(let S of r)if(S.state==="Booted")s.add(S.udid);return O={at:e,booted:s},s}catch{return null}}function I(e){try{if(!l(e))return null;let _=JSON.parse(H(e,"utf-8"));try{process.kill(_.pid,0)}catch{return N(e),null}let t=Ke();if(t&&!t.has(_.device)){console.error(`[serve-sim] Helper pid ${_.pid} is bound to device ${_.device} which is no longer booted \u2014 killing stale helper.`);try{process.kill(_.pid,"SIGTERM")}catch{}try{N(e)}catch{}return null}return _}catch{return null}}function V(){let e=[];for(let _ of v()){let t=I(_);if(t)e.push(t)}return e}function Q(e){X(),te(w(e.device),JSON.stringify(e,null,2))}function u(e){if(e)try{N(w(e))}catch{}else for(let _ of v())try{N(_)}catch{}}function je(){let e=d.startsWith("/$bunfs/");if(!e&&l(d))return d;if(!e){let S=M(import.meta.dir,"../bin/serve-sim-bin");if(l(S))return S;throw Error(`serve-sim-bin not found. Run 'bun run build:swift' first.
14
+ Checked: ${d}, ${S}`)}let _=H(d),t=ke("sha256").update(_).digest("hex").slice(0,16),s=M(Xe(),"Library/Caches/serve-sim");Y(s,{recursive:!0});let r=M(s,`serve-sim-bin-${t}`);if(!l(r)){te(r,_),Ue(r,493);try{T(`codesign -s - -f ${JSON.stringify(r)}`,{stdio:"ignore"})}catch{}}return r}function se(){try{let e=T("xcrun simctl list devices booted -j",{encoding:"utf-8"}),_=JSON.parse(e);for(let t of Object.values(_.devices))for(let s of t)if(s.state==="Booted")return s.udid}catch{}return null}function J(e){try{let _=T("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let r of s)if(r.udid===e)return r.name}catch{}return null}function L(e){if(/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i.test(e))return e;try{let _=T("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let r of s)if(r.name.toLowerCase()===e.toLowerCase())return r.udid}catch{}console.error(`Could not resolve device: ${e}`),process.exit(1)}function Se(e){try{let _=T("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let r of s)if(r.udid===e)return r.state==="Booted"}catch{}return!1}function U(e){try{return process.kill(e,0),!0}catch{return!1}}function k(e){try{process.kill(e,"SIGTERM")}catch{return}let _=Date.now()+500;while(Date.now()<_)try{process.kill(e,0),Bun.sleepSync(25)}catch{return}try{process.kill(e,"SIGKILL")}catch{}let t=Date.now()+500;while(Date.now()<t)try{process.kill(e,0),Bun.sleepSync(25)}catch{return}}function ze(e){try{let _=T(`lsof -ti tcp:${e}`,{encoding:"utf-8",stdio:"pipe"}).trim();if(!_)return[];let t=process.pid;return _.split(`
15
+ `).map((s)=>parseInt(s,10)).filter((s)=>Number.isFinite(s)&&s!==t)}catch{return[]}}function Qe(e){let _=ze(e);if(_.length===0)return;console.log(`\x1B[90mPort ${e} busy, killing holder pid(s): ${_.join(", ")}\x1B[0m`);for(let t of _)try{process.kill(t,"SIGKILL")}catch{}Bun.sleepSync(100)}function Je(e){if(!Se(e))try{T(`xcrun simctl boot ${e}`,{encoding:"utf-8",stdio:"pipe"})}catch(_){let t=(_.stderr??_.message??"").toLowerCase();if(!t.includes("booted")&&!t.includes("current state"))throw Error(`Failed to boot device ${e}: ${_.stderr||_.message}`)}try{T("open -ga Simulator",{encoding:"utf-8",stdio:"pipe",timeout:3000})}catch{}}function Ze(){let e=Ge();for(let _ of Object.values(e))for(let t of _??[])if(t.family==="IPv4"&&!t.internal)return t.address;return null}async function ie(e){let _=new Set(V().map((t)=>t.port));for(let t=e;t<e+100;t++){if(_.has(t))continue;try{return Bun.serve({port:t,fetch:()=>new Response("ok")}).stop(!0),t}catch{continue}}throw Error(`No available port found in range ${e}-${e+99}`)}async function Ye(e){Je(e);try{T(`xcrun simctl bootstatus ${e} -b`,{encoding:"utf-8",stdio:"pipe",timeout:60000})}catch(_){if(!Se(e))console.error(`Device ${e} failed to reach booted state: ${_.stderr||_.message}`),process.exit(1)}}async function re(e,_,t,s){let r=!1;for(let o=0;o<30;o++){if(!s())break;try{if((await fetch(`${_}/health`)).ok){r=!0;break}}catch{}await new Promise((C)=>setTimeout(C,100))}if(r){let o=Date.now()+8000;while(Date.now()<o){if(await new Promise((C)=>setTimeout(C,200)),!s()){r=!1;break}try{if(H(t,"utf-8").includes("Capture started"))break}catch{}}}let S="";try{S=H(t,"utf-8").trim()}catch{}return{ready:r,log:S}}async function e_(e){let{helperPath:_,udid:t,port:s,host:r,logFile:S}=e,o=`http://${r}:${s}`;X();let C=ee(S,"w"),$=Z(_,[t,"--port",String(s)],{detached:!0,stdio:["ignore",C,C]});$.unref(),_e(C);let i=$.pid,n=!1;$.once("exit",()=>{n=!0});let{ready:a,log:y}=await re(i,o,S,()=>!n&&U(i));return{ready:a,pid:i,exited:n||!U(i),log:y}}async function __(e){let{helperPath:_,udid:t,port:s,host:r,logFile:S}=e,o=`http://${r}:${s}`;X();let C=ee(S,"w"),$=Z(_,[t,"--port",String(s)],{detached:!1,stdio:["ignore",C,C]});_e(C);let i=$.pid,n=!1;$.once("exit",()=>{n=!0});let{ready:a,log:y}=await re(i,o,S,()=>!n&&U(i));return{ready:a,child:$,log:y}}async function Ce(e,_,t){await Ye(e);let s="127.0.0.1",r=je(),S=xe(p,`server-${e}.log`),o={helperPath:r,udid:e,port:_,host:s,logFile:S},C="",$=2;for(let n=1;n<=$;n++){if(Qe(_),t.detach){let a=await e_(o);if(a.ready){let y={pid:a.pid,port:_,device:e,url:`http://${s}:${_}`,streamUrl:`http://${s}:${_}/stream.mjpeg`,wsUrl:`ws://${s}:${_}/ws`};return Q(y),{pid:a.pid}}k(a.pid),C=a.log}else{let a=await __(o);if(a.ready){let y={pid:a.child.pid,port:_,device:e,url:`http://${s}:${_}`,streamUrl:`http://${s}:${_}/stream.mjpeg`,wsUrl:`ws://${s}:${_}/ws`};return Q(y),{pid:a.child.pid,child:a.child}}k(a.child.pid),C=a.log}if(n<$)await new Promise((a)=>setTimeout(a,500))}let i=C?`Helper failed:
16
+ ${C}`:"Helper process failed to start";console.error(i),process.exit(1)}async function t_(e,_,t){let s=e.length>0?e.map(L):(()=>{let i=se();if(!i)console.error("No device specified and no booted simulator found."),process.exit(1);return[i]})(),r=new Map,S=[],o=_;for(let i of s){let n=E(i);if(n){if(!t){let A=J(i)??i;if(s.length>1)console.log(`
17
+ ==> ${A} (${i}) <==`);console.log(` Already running on port ${n.port}`),console.log(` Stream: ${n.streamUrl}`),console.log(` WebSocket: ${n.wsUrl}`)}S.push(n);continue}o=await ie(o);let{pid:a,child:y}=await Ce(i,o,{detach:!1});if(y)r.set(i,y);let R="127.0.0.1",D={pid:a,port:o,device:i,url:`http://${R}:${o}`,streamUrl:`http://${R}:${o}/stream.mjpeg`,wsUrl:`ws://${R}:${o}/ws`};if(S.push(D),!t){let A=J(i)??i;if(s.length>1)console.log(`
18
+ ==> ${A} (${i}) <==`);console.log(` Stream: ${D.streamUrl}`),console.log(` WebSocket: ${D.wsUrl}`),console.log(` Port: ${o}`)}o++}if(S.length===1){let i=S[0];console.log(JSON.stringify({url:i.url,streamUrl:i.streamUrl,wsUrl:i.wsUrl,port:i.port,device:i.device}))}else console.log(JSON.stringify({devices:S.map((i)=>({url:i.url,streamUrl:i.streamUrl,wsUrl:i.wsUrl,port:i.port,device:i.device}))}));if(r.size===0)return;let C=!1,$=(i)=>{if(C)return;if(C=!0,!t)console.log(`
19
+ Shutting down...`);for(let[n,a]of r){let y=a.pid;if(y)k(y);u(n)}r.clear(),process.exit(i)};for(let[i,n]of r)n.on("exit",(a)=>{if(C)return;if(!t)console.error(`[${i}] Helper exited (code ${a})`);if(u(i),r.delete(i),r.size===0)$(a??1)});process.on("SIGINT",()=>$(0)),process.on("SIGTERM",()=>$(0)),process.on("SIGHUP",()=>$(0)),process.on("exit",()=>{for(let[i,n]of r){try{if(n.pid)process.kill(n.pid,"SIGTERM")}catch{}try{u(i)}catch{}}}),await new Promise(()=>{})}async function oe(e,_){let t=e.length>0?e.map(L):(()=>{let S=se();if(!S)console.error("No device specified and no booted simulator found."),process.exit(1);return[S]})(),s=[],r=_;for(let S of t){let o=E(S);if(o){s.push(o);continue}r=await ie(r),await Ce(S,r,{detach:!0});let C="127.0.0.1";s.push({pid:E(S).pid,port:r,device:S,url:`http://${C}:${r}`,streamUrl:`http://${C}:${r}/stream.mjpeg`,wsUrl:`ws://${C}:${r}/ws`}),r++}return s}function s_(e){if(e.length===1){let _=e[0];console.log(JSON.stringify({url:_.url,streamUrl:_.streamUrl,wsUrl:_.wsUrl,port:_.port,device:_.device}))}else console.log(JSON.stringify({devices:e.map((_)=>({url:_.url,streamUrl:_.streamUrl,wsUrl:_.wsUrl,port:_.port,device:_.device}))}))}function S_(e){if(e){let t=L(e),s=E(t);if(!s)console.log(JSON.stringify({running:!1,device:t}));else console.log(JSON.stringify({running:!0,url:s.url,streamUrl:s.streamUrl,wsUrl:s.wsUrl,port:s.port,device:s.device,pid:s.pid}));return}let _=V();if(_.length===0)console.log(JSON.stringify({running:!1}));else if(_.length===1){let t=_[0];console.log(JSON.stringify({running:!0,url:t.url,streamUrl:t.streamUrl,wsUrl:t.wsUrl,port:t.port,device:t.device,pid:t.pid}))}else console.log(JSON.stringify({running:!0,streams:_.map((t)=>({url:t.url,streamUrl:t.streamUrl,wsUrl:t.wsUrl,port:t.port,device:t.device,pid:t.pid}))}))}function i_(e){if(e){let _=L(e),t=E(_);if(!t){console.log(JSON.stringify({disconnected:!0,device:_}));return}try{process.kill(t.pid,"SIGTERM")}catch{}u(_),console.log(JSON.stringify({disconnected:!0,device:t.device}))}else{let _=V();if(_.length===0){console.log(JSON.stringify({disconnected:!0,devices:[]}));return}let t=[];for(let s of _){try{process.kill(s.pid,"SIGTERM")}catch{}t.push(s.device)}u(),console.log(JSON.stringify({disconnected:!0,devices:t}))}}async function r_(e){let _,t=[];for(let o=0;o<e.length;o++)if(e[o]==="--device"||e[o]==="-d")_=e[++o];else t.push(e[o]);let s=E(_);if(!s)console.error("No serve-sim server running. Run `serve-sim` first."),process.exit(1);let r=t[0];if(!r)console.error("Usage: serve-sim gesture '<json>'"),console.error(`Example: serve-sim gesture '{"type":"begin","x":0.5,"y":0.5}'`),process.exit(1);let S;try{S=JSON.parse(r)}catch{console.error("Invalid JSON:",r),process.exit(1)}return new Promise((o,C)=>{let $=new WebSocket(s.wsUrl);$.binaryType="arraybuffer",$.onopen=()=>{let i=new TextEncoder().encode(JSON.stringify(S)),n=new Uint8Array(1+i.length);n[0]=3,n.set(i,1),$.send(n),setTimeout(()=>{$.close(),o()},50)},$.onerror=()=>{console.error("Failed to connect to serve-sim server at",s.wsUrl),C(Error("WebSocket connection failed"))}})}async function C_(e){let _,t=[];for(let S=0;S<e.length;S++)if(e[S]==="--device"||e[S]==="-d")_=e[++S];else t.push(e[S]);let s=E(_);if(!s)console.error("No serve-sim server running. Run `serve-sim` first."),process.exit(1);let r=t[0]??"home";return new Promise((S,o)=>{let C=new WebSocket(s.wsUrl);C.binaryType="arraybuffer",C.onopen=()=>{let $=new TextEncoder().encode(JSON.stringify({button:r})),i=new Uint8Array(1+$.length);i[0]=4,i.set($,1),C.send(i),setTimeout(()=>{C.close(),S()},50)},C.onerror=()=>{console.error("Failed to connect to serve-sim server at",s.wsUrl),o(Error("WebSocket connection failed"))}})}async function o_(e,_,t){if(V().length===0)console.log("Starting simulator stream..."),await oe(_,3100);let{simMiddleware:r}=await Promise.resolve().then(() => (z(),j)),S=r({basePath:"/"}),o=t?1:50,C=e,$,i=!1;for(let a=0;a<o;a++){let y=e+a;try{$_(y,S),C=y,i=!0;break}catch(R){if($=R,R?.code!=="EADDRINUSE")break}}if(!i){if($?.code==="EADDRINUSE")if(t)console.error(`Port ${e} is already in use. Pass a different --port or stop the other process.`);else console.error(`No available port found in range ${e}-${e+o-1}.`);else console.error(`Failed to start preview server: ${$?.message??$}`);process.exit(1)}let n=Ze();if(console.log(""),console.log(` - Local: http://localhost:${C}`),n)console.log(` - Network: http://${n}:${C}`);console.log(""),process.on("SIGINT",()=>process.exit(0)),process.on("SIGTERM",()=>process.exit(0)),await new Promise(()=>{})}function $_(e,_){return Bun.serve({port:e,idleTimeout:255,async fetch(t){let r=t.method!=="GET"&&t.method!=="HEAD"?new Uint8Array(await t.arrayBuffer()):null;return new Promise((S)=>{let o=new URL(t.url),C={},$={url:o.pathname+o.search,method:t.method,headers:Object.fromEntries(t.headers.entries()),on(A,c){(C[A]??=[]).push(c)}};t.signal.addEventListener("abort",()=>{for(let A of C.close??[])A()});let i=200,n=new Headers,a=[],y=!1,R=null;_($,{writeHead(A,c){if(i=A,c)for(let[B,W]of Object.entries(c))n.set(B,W)},setHeader(A,c){n.set(A,c)},get statusCode(){return i},set statusCode(A){i=A},write(A){if(!y){y=!0;let c=new ReadableStream({start(B){R=B}});S(new Response(c,{status:i,headers:n}))}try{R?.enqueue(typeof A==="string"?new TextEncoder().encode(A):A)}catch{}},end(A){if(y){if(A)try{R?.enqueue(typeof A==="string"?new TextEncoder().encode(A):A)}catch{}try{R?.close()}catch{}}else{if(A)a.push(A);let c=a.map((B)=>typeof B==="string"?B:new TextDecoder().decode(B)).join("");S(new Response(c,{status:i,headers:n}))}}},()=>{S(new Response("Not found",{status:404}))}),queueMicrotask(()=>{if(r&&r.length>0){let A=Buffer.from(r);for(let c of C.data??[])c(A)}for(let A of C.end??[])A()})})}})}function $e(){console.log(`
20
20
  serve-sim - Stream iOS Simulator to the browser
21
21
 
22
22
  Usage:
@@ -42,4 +42,4 @@ Examples:
42
42
  serve-sim --detach Start streaming in background (daemon)
43
43
  serve-sim --list Show all running streams
44
44
  serve-sim --kill Stop all streams
45
- `)}var B=process.argv.slice(2);if(B[0]==="gesture")await r_(B.slice(1)),process.exit(0);if(B[0]==="button")await C_(B.slice(1)),process.exit(0);var l,$e=!1,ne=!1,ae=!1,Ae=!1,ye=!1,ce=!1,m=[],Re,Be;for(let e=0;e<B.length;e++){let _=B[e];switch(_){case"--port":case"-p":l=parseInt(B[++e]??"3100",10);break;case"--detach":case"-d":$e=!0;break;case"--quiet":case"-q":ne=!0;break;case"--no-preview":ce=!0;break;case"--list":case"-l":if(ae=!0,B[e+1]&&!B[e+1].startsWith("-"))Re=B[++e];break;case"--kill":case"-k":if(Ae=!0,B[e+1]&&!B[e+1].startsWith("-"))Be=B[++e];break;case"--help":case"-h":case"help":ye=!0;break;default:if(!_.startsWith("-"))m.push(_);else console.error(`Unknown flag: ${_}`),oe(),process.exit(1)}}if(ye)oe(),process.exit(0);if(ae)S_(Re),process.exit(0);if(Ae)i_(Be),process.exit(0);if($e){let e=await Ce(m,l??3100);s_(e)}else if(ce)await t_(m,l??3100,ne);else await o_(l??3200,m,l!==void 0);
45
+ `)}var f=process.argv.slice(2);if(f[0]==="gesture")await r_(f.slice(1)),process.exit(0);if(f[0]==="button")await C_(f.slice(1)),process.exit(0);var F,ne=!1,ae=!1,Ae=!1,ye=!1,ce=!1,Re=!1,m=[],Be,fe;for(let e=0;e<f.length;e++){let _=f[e];switch(_){case"--port":case"-p":F=parseInt(f[++e]??"3100",10);break;case"--detach":case"-d":ne=!0;break;case"--quiet":case"-q":ae=!0;break;case"--no-preview":Re=!0;break;case"--list":case"-l":if(Ae=!0,f[e+1]&&!f[e+1].startsWith("-"))Be=f[++e];break;case"--kill":case"-k":if(ye=!0,f[e+1]&&!f[e+1].startsWith("-"))fe=f[++e];break;case"--help":case"-h":case"help":ce=!0;break;default:if(!_.startsWith("-"))m.push(_);else console.error(`Unknown flag: ${_}`),$e(),process.exit(1)}}if(ce)$e(),process.exit(0);if(Ae)S_(Be),process.exit(0);if(ye)i_(fe),process.exit(0);if(ne){let e=await oe(m,F??3100);s_(e)}else if(Re)await t_(m,F??3100,ae);else await o_(F??3200,m,F!==void 0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "serve-sim",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "type": "module",
5
5
  "author": {
6
6
  "name": "Evan Bacon",