uni-jsframework.js
713 KB
//{"version":"4.63","encode":"base64"}
dmFyIF9fVW5pU2VydmljZVN0YXJ0VGltZV9fPURhdGUubm93KCksZ2xvYmFsPXRoaXMscHJvY2Vzcz17ZW52Ont9fSxzZXRUaW1lb3V0PWdsb2JhbC5zZXRUaW1lb3V0OyFmdW5jdGlvbihlLHQpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/dCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHQpOnQoKX0oMCxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgc3VidmVyc2lvbj17ZnJhbWV3b3JrOiIwLjI5LjYiLHRyYW5zZm9ybWVyOiI+PTAuMS41IDwwLjUifTtmdW5jdGlvbiBnZXRIb29rS2V5KGUsdCxuKXtyZXR1cm4gdCsiQCIrbisiIyIrZX12YXIgQ2FsbGJhY2tNYW5hZ2VyPWZ1bmN0aW9uKGUpe3RoaXMuaW5zdGFuY2VJZD1TdHJpbmcoZSksdGhpcy5sYXN0Q2FsbGJhY2tJZD0wLHRoaXMuY2FsbGJhY2tzPXt9LHRoaXMuaG9va3M9e319O0NhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxhc3RDYWxsYmFja0lkKyssdGhpcy5jYWxsYmFja3NbdGhpcy5sYXN0Q2FsbGJhY2tJZF09ZSx0aGlzLmxhc3RDYWxsYmFja0lkfSxDYWxsYmFja01hbmFnZXIucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNhbGxiYWNrc1tlXTtyZXR1cm4gZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2VdLHR9LENhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUucmVnaXN0ZXJIb29rPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWdldEhvb2tLZXkoZSx0LG4pO3RoaXMuaG9va3NbaV0mJmNvbnNvbGUud2FybignW0pTIEZyYW1ld29ya10gT3ZlcnJpZGUgYW4gZXhpc3RpbmcgY29tcG9uZW50IGhvb2sgIicraSsnIi4nKSx0aGlzLmhvb2tzW2ldPXJ9LENhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUudHJpZ2dlckhvb2s9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9Z2V0SG9va0tleShlLHQsbiksbz10aGlzLmhvb2tzW2ldO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBvKXJldHVybiBjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSBJbnZhbGlkIGhvb2sgZnVuY3Rpb24gdHlwZSAoIit0eXBlb2YgbysnKSBvbiAiJytpKyciLicpLG51bGw7dmFyIGE9bnVsbDt0cnl7YT1vLmFwcGx5KG51bGwscnx8W10pfWNhdGNoKGUpe3Rocm93IGNvbnNvbGUuZXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBleGVjdXRlIHRoZSBob29rIGZ1bmN0aW9uIG9uICInK2krJyIuJyksZX1yZXR1cm4gYX0sQ2FsbGJhY2tNYW5hZ2VyLnByb3RvdHlwZS5jb25zdW1lPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmNhbGxiYWNrc1tlXTtpZih2b2lkIDAhPT1uJiYhMSE9PW58fGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tlXSwiZnVuY3Rpb24iPT10eXBlb2Ygcil0cnl7cmV0dXJuIHIuY2FsbChudWxsLHQsbil9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uOlxuICIrZS50b1N0cmluZygpKSxlfXJldHVybiBuZXcgRXJyb3IoJ2ludmFsaWQgY2FsbGJhY2sgaWQgIicrZSsnIicpfSxDYWxsYmFja01hbmFnZXIucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5jYWxsYmFja3M9e30sdGhpcy5ob29rcz17fX07dmFyIG5leHROb2RlUmVmPTE7ZnVuY3Rpb24gdW5pcXVlSWQoKXtyZXR1cm4obmV4dE5vZGVSZWYrKykudG9TdHJpbmcoKX1mdW5jdGlvbiB0eXBvZihlKXt2YXIgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIHQuc3Vic3RyaW5nKDgsdC5sZW5ndGgtMSl9ZnVuY3Rpb24gaXNQbGFpbk9iamVjdChlKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBoYXNPd24oZSx0KXtyZXR1cm4gaXNQbGFpbk9iamVjdChlKSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9ZnVuY3Rpb24gYnVmZmVyVG9CYXNlNjQoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGJ0b2EpcmV0dXJuIiI7dmFyIHQ9QXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKG5ldyBVaW50OEFycmF5KGUpLGZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGUpfSkuam9pbigiIik7cmV0dXJuIGJ0b2EodCl9ZnVuY3Rpb24gaXNFbXB0eShlKXtpZighZXx8Im9iamVjdCIhPXR5cGVvZiBlKXJldHVybiEwO2Zvcih2YXIgdCBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKXJldHVybiExO3JldHVybiEwfXZhciBMRVZFTFM9WyJvZmYiLCJlcnJvciIsIndhcm4iLCJpbmZvIiwibG9nIiwiZGVidWciXSxsZXZlbE1hcD17fTtmdW5jdGlvbiBnZW5lcmF0ZUxldmVsTWFwKCl7TEVWRUxTLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49TEVWRUxTLmluZGV4T2YodCk7bGV2ZWxNYXBbdF09e30sTEVWRUxTLmZvckVhY2goZnVuY3Rpb24oZSl7TEVWRUxTLmluZGV4T2YoZSk8PW4mJihsZXZlbE1hcFt0XVtlXT0hMCl9KX0pfWZ1bmN0aW9uIGNoZWNrTGV2ZWwoZSl7dmFyIHQ9Z2xvYmFsLldYRW52aXJvbm1lbnQmJmdsb2JhbC5XWEVudmlyb25tZW50LmxvZ0xldmVsfHwibG9nIjtyZXR1cm4gbGV2ZWxNYXBbdF0mJmxldmVsTWFwW3RdW2VdfWZ1bmN0aW9uIGRlYnVnTG9nKGUpe2dsb2JhbC5uYXRpdmVMb2coInd4SW50ZXJhY3Rpb25BbmFseXplcjogW2pzZm1dIitlLCJfX0RFQlVHIil9dmFyIGRvY01hcD17fTtmdW5jdGlvbiBhZGREb2MoZSx0KXtlJiYoZG9jTWFwW2VdPXQpfWZ1bmN0aW9uIGdldERvYyhlKXtyZXR1cm4gZG9jTWFwW2VdfWZ1bmN0aW9uIHJlbW92ZURvYyhlKXtkZWxldGUgZG9jTWFwW2VdfWZ1bmN0aW9uIGdldFRhc2tDZW50ZXIoZSl7dmFyIHQ9ZG9jTWFwW2VdO3JldHVybiB0JiZ0LnRhc2tDZW50ZXI/dC50YXNrQ2VudGVyOm51bGx9ZnVuY3Rpb24gYXBwZW5kQm9keShlLHQsbil7dmFyIHI9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoISgwPHIucHVyZUNoaWxkcmVuLmxlbmd0aHx8dC5wYXJlbnROb2RlKSl7dmFyIGk9ci5jaGlsZHJlbixvPWkuaW5kZXhPZihuKTtvPDA/aS5wdXNoKHQpOmkuc3BsaWNlKG8sMCx0KSwxPT09dC5ub2RlVHlwZT8oImJvZHkiPT09dC5yb2xlPyh0LmRvY0lkPWUuaWQsdC5vd25lckRvY3VtZW50PWUsdC5wYXJlbnROb2RlPXIsbGlua1BhcmVudCh0LHIpKToodC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZT10fSksc2V0Qm9keShlLHQpLHQuZG9jSWQ9ZS5pZCx0Lm93bmVyRG9jdW1lbnQ9ZSxsaW5rUGFyZW50KHQsciksZGVsZXRlIGUubm9kZU1hcFt0Lm5vZGVJZF0pLHIucHVyZUNoaWxkcmVuLnB1c2godCksc2VuZEJvZHkoZSx0KSk6KHQucGFyZW50Tm9kZT1yLGUubm9kZU1hcFt0LnJlZl09dCksdC5yZWFkeT0hMCx0LmNvbXB1dGVDbGFzc0xpc3QmJnQuY29tcHV0ZUNsYXNzTGlzdCgpfX1mdW5jdGlvbiBzZW5kQm9keShlLHQpe3ZhciBuPXQudG9KU09OKCk7ZSYmZS50YXNrQ2VudGVyJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50YXNrQ2VudGVyLnNlbmQmJmUudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246ImNyZWF0ZUJvZHkifSxbbl0pfWZ1bmN0aW9uIHNldEJvZHkoZSx0KXt0LnJvbGU9ImJvZHkiLHQuZGVwdGg9MSxkZWxldGUgZS5ub2RlTWFwW3Qubm9kZUlkXSx0LnJlZj0iX3Jvb3QiLGUubm9kZU1hcC5fcm9vdD10LGUuYm9keT10fWZ1bmN0aW9uIGxpbmtQYXJlbnQodCxlKXsodC5wYXJlbnROb2RlPWUpLmRvY0lkJiYodC5kb2NJZD1lLmRvY0lkLHQub3duZXJEb2N1bWVudD1lLm93bmVyRG9jdW1lbnQsKHQub3duZXJEb2N1bWVudC5ub2RlTWFwW3Qubm9kZUlkXT10KS5kZXB0aD1lLmRlcHRoKzEpLHQuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtsaW5rUGFyZW50KGUsdCl9KX1mdW5jdGlvbiBuZXh0RWxlbWVudChlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIHByZXZpb3VzRWxlbWVudChlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUucHJldmlvdXNTaWJsaW5nfX1mdW5jdGlvbiBpbnNlcnRJbmRleChlLHQsbixyKXtuPDAmJihuPTApO3ZhciBpPXRbbi0xXSxvPXRbbl07cmV0dXJuIHQuc3BsaWNlKG4sMCxlKSxyJiYoaSYmKGkubmV4dFNpYmxpbmc9ZSksZS5wcmV2aW91c1NpYmxpbmc9aSwoZS5uZXh0U2libGluZz1vKSYmKG8ucHJldmlvdXNTaWJsaW5nPWUpKSxufWZ1bmN0aW9uIG1vdmVJbmRleChlLHQsbixyKXt2YXIgaT10LmluZGV4T2YoZSk7aWYoaTwwKXJldHVybi0xO2lmKHIpe3ZhciBvPXRbaS0xXSxhPXRbaSsxXTtvJiYoby5uZXh0U2libGluZz1hKSxhJiYoYS5wcmV2aW91c1NpYmxpbmc9byl9dC5zcGxpY2UoaSwxKTt2YXIgcz1uO2k8PW4mJihzPW4tMSk7dmFyIGM9dFtzLTFdLHU9dFtzXTtyZXR1cm4gdC5zcGxpY2UocywwLGUpLHImJihjJiYoYy5uZXh0U2libGluZz1lKSxlLnByZXZpb3VzU2libGluZz1jLChlLm5leHRTaWJsaW5nPXUpJiYodS5wcmV2aW91c1NpYmxpbmc9ZSkpLGk9PT1zPy0xOm59ZnVuY3Rpb24gcmVtb3ZlSW5kZXgoZSx0LG4pe3ZhciByPXQuaW5kZXhPZihlKTtpZighKHI8MCkpe2lmKG4pe3ZhciBpPXRbci0xXSxvPXRbcisxXTtpJiYoaS5uZXh0U2libGluZz1vKSxvJiYoby5wcmV2aW91c1NpYmxpbmc9aSl9dC5zcGxpY2UociwxKX19dmFyIE5vZGU9ZnVuY3Rpb24oKXt0aGlzLm5vZGVJZD11bmlxdWVJZCgpLHRoaXMucmVmPXRoaXMubm9kZUlkLHRoaXMuY2hpbGRyZW49W10sdGhpcy5wdXJlQ2hpbGRyZW49W10sdGhpcy5wYXJlbnROb2RlPW51bGwsdGhpcy5uZXh0U2libGluZz1udWxsLHRoaXMucHJldmlvdXNTaWJsaW5nPW51bGx9LEVsZW1lbnQkMjtmdW5jdGlvbiBzZXRFbGVtZW50KGUpe0VsZW1lbnQkMj1lfU5vZGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZT1nZXREb2ModGhpcy5kb2NJZCk7ZSYmKGRlbGV0ZSB0aGlzLmRvY0lkLGRlbGV0ZSBlLm5vZGVNYXBbdGhpcy5ub2RlSWRdKSx0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5kZXN0cm95KCl9KX07dmFyIHJlZ2lzdGVyZWRFbGVtZW50cz17fTtmdW5jdGlvbiByZWdpc3RlckVsZW1lbnQoaSxlKXtpZihBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aCl7dmFyIHQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBlJiYodC5fX3Byb3RvX189ZSksKHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj10fShFbGVtZW50JDIpO2UuZm9yRWFjaChmdW5jdGlvbihyKXt0LnByb3RvdHlwZVtyXT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO2lmKG4pcmV0dXJuIG4uc2VuZCgiY29tcG9uZW50Iix7cmVmOnRoaXMucmVmLGNvbXBvbmVudDppLG1ldGhvZDpyfSxlKX19KSxyZWdpc3RlcmVkRWxlbWVudHNbaV09dH19ZnVuY3Rpb24gZ2V0V2VleEVsZW1lbnQoZSl7cmV0dXJuIHJlZ2lzdGVyZWRFbGVtZW50c1tlXX1mdW5jdGlvbiBjYWNoZWQodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV18fChuW2VdPXQoZSkpfX12YXIgcGFyc2VTdHlsZVRleHQ9Y2FjaGVkKGZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXCkpL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9ZS5zcGxpdChyKTsxPHQubGVuZ3RoJiYoblt0WzBdLnRyaW0oKV09dFsxXS50cmltKCkpfX0pLG59KSxmaXJzdExldHRlclRvTG93ZXJDYXNlPWNhY2hlZChmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKStlLnNsaWNlKDEpfSk7ZnVuY3Rpb24gaXNEZWYoZSl7cmV0dXJuIHZvaWQgMCE9PWV9ZnVuY3Rpb24gaXNGbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX12YXIgX3RvU3RyaW5nPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gdG9SYXdUeXBlKGUpe3JldHVybiBfdG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKX1mdW5jdGlvbiBoYXNMaWZlY3ljbGVIb29rKGUsdCl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxBcnJheS5pc0FycmF5KGVbdF0pJiZlW3RdLmxlbmd0aH12YXIgcHJvY2Vzc29ycz17c2xpZGVyOntjaGFuZ2U6ZnVuY3Rpb24oZSl7cmV0dXJue2luZGV4OmUuaW5kZXgsc291cmNlOmUuc291cmNlfX0sc2Nyb2xsOmZ1bmN0aW9uKGUpe3JldHVybntvZmZzZXRYUmF0aW86ZS5vZmZzZXRYUmF0aW8sb2Zmc2V0WVJhdGlvOmUub2Zmc2V0WVJhdGlvLGRyYWc6ZS5kcmFnfX19LCJzY3JvbGwtdmlldyI6e3Njcm9sbGVuZDpmdW5jdGlvbihlKXtyZXR1cm57Y29udGVudE9mZnNldDplLmNvbnRlbnRPZmZzZXR9fX19O2Z1bmN0aW9uIHByb2Nlc3NUYXJnZXQoZSl7dmFyIHQ9ZS5hdHRyLG49ZS5vZmZzZXRMZWZ0LHI9ZS5vZmZzZXRUb3AsaT17fTtyZXR1cm4gT2JqZWN0LmtleXModHx8e30pLmZvckVhY2goZnVuY3Rpb24oZSl7MD09PWUuaW5kZXhPZigiZGF0YSIpJiYoaVtmaXJzdExldHRlclRvTG93ZXJDYXNlKGUucmVwbGFjZSgiZGF0YSIsIiIpKV09dFtlXSl9KSx7aWQ6dCYmdC5pZHx8IiIsZGF0YXNldDppLG9mZnNldExlZnQ6bnx8MCxvZmZzZXRUb3A6cnx8MH19ZnVuY3Rpb24gcHJvY2Vzc0N1c3RvbUV2ZW50KGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9e30pLHZvaWQgMD09PW4mJihuPXt9KSxuPXByb2Nlc3NUYXJnZXQobikse3R5cGU6ZSx0aW1lU3RhbXA6RGF0ZS5ub3coKSx0YXJnZXQ6bixjdXJyZW50VGFyZ2V0Om4sZGV0YWlsOnR9fXZhciBXRUVYX1RBR1M9WyJhIiwiZGl2IiwibGlzdCIsImNlbGwiLCJsb2FkaW5nIiwicmVmcmVzaCIsInJlY3ljbGUtbGlzdCIsInNjcm9sbGVyIiwiaW5kaWNhdG9yIiwid2F0ZXJmYWxsIiwid2ViIiwicmljaHRleHQiXSxJR05PUkVfRVZFTlRTPVsidmlld2FwcGVhciIsInZpZXdkaXNhcHBlYXIiLCJpdGVtY2xpY2siXSxFVkVOVF9FWFRSQVM9e21hcmtlcnRhcDpbIm1hcmtlcklkIl0sY29udHJvbHRhcDpbImNvbnRyb2xJZCJdLHJlZ2lvbmNoYW5nZTpbImNhdXNlZEJ5Il0sZW5kOlsiY2F1c2VkQnkiXSxhcHBlYXI6WyJkaXJlY3Rpb24iXSxkaXNhcHBlYXI6WyJkaXJlY3Rpb24iXX07ZnVuY3Rpb24gcHJvY2Vzc0V2ZW50KHQsZSl7dmFyIG49dC50eXBlO2lmKC0xIT09SUdOT1JFX0VWRU5UUy5pbmRleE9mKG4pKXJldHVybiB0O3ZhciByPXQuY3VycmVudFRhcmdldCxpPXIudHlwZS5yZXBsYWNlKCJ1LSIsIiIpO2lmKC0xIT09V0VFWF9UQUdTLmluZGV4T2YoaSkpcmV0dXJuIHQ7dmFyIG89dC50aW1lc3RhbXAsYT10LnRhcmdldDtpZighaXNEZWYoZSkpe3ZhciBzPXByb2Nlc3NvcnNbaV07ZT1zJiZpc0ZuKHNbbl0pP3Nbbl0odCk6dC5kZXRhaWx8fHt9fXZhciBjPXt0eXBlOm4sdGltZVN0YW1wOm8sdGFyZ2V0OnByb2Nlc3NUYXJnZXQoYSksY3VycmVudFRhcmdldDpwcm9jZXNzVGFyZ2V0KHIpLGRldGFpbDplLHRvdWNoZXM6InRvdWNoZW5kIj09PW58fCJwYW5lbmQiPT09bj9bXTp0LmNoYW5nZWRUb3VjaGVzLGNoYW5nZWRUb3VjaGVzOnQuY2hhbmdlZFRvdWNoZXN9O3QuY29tcG9uZW50SWQmJihjLmNvbXBvbmVudElkPXQuY29tcG9uZW50SWQpO3ZhciB1PUVWRU5UX0VYVFJBU1tuXTtyZXR1cm4gdSYmdS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuaGFzT3duUHJvcGVydHkoZSkmJihjW2VdPXRbZV0pfSksY312YXIgQkFTRV9ERVZJQ0VfV0lEVEg9NzUwLGRldmljZURQUj0xLGRldmljZVdpZHRoPTA7ZnVuY3Rpb24gdXB4MnB4KGUsdCl7aWYoMD09PWRldmljZVdpZHRoJiYoZGV2aWNlRFBSPWdsb2JhbC5XWEVudmlyb25tZW50LnNjYWxlLGRldmljZVdpZHRoPU1hdGguY2VpbChnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VXaWR0aC9kZXZpY2VEUFIpKSwwPT09KGU9TnVtYmVyKGUpKSlyZXR1cm4gMDt2YXIgbj1lL0JBU0VfREVWSUNFX1dJRFRIKih0fHxkZXZpY2VXaWR0aCkscj1uLnRvU3RyaW5nKCkuc3BsaXQoIi4iKTtyZXR1cm4gMj09PXIubGVuZ3RoPyhyWzFdPXJbMV0uc3Vic3RyaW5nKDAsMiksTnVtYmVyKHIuam9pbigiLiIpKSk6bn12YXIgVU5JVF9SRT0vKFsrLV0/XGQrKFwuXGQrKT8pW3J8dV1weC9nO2Z1bmN0aW9uIG5vcm1hbGl6ZVVuaXQobil7cmV0dXJuIGdsb2JhbC5XWEVudmlyb25tZW50LmR5bmFtaWNScHh8fCJPYmplY3QiIT09dHlwb2Yobil8fE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bltlXTsic3RyaW5nIj09dHlwZW9mIHQmJihuW2VdPXQucmVwbGFjZShVTklUX1JFLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHVweDJweCh0KX0pKX0pLG59ZnVuY3Rpb24gZGVlcENsb25lKGUsaSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uIGUodCl7dmFyIG49dC5jaGlsZHJlbiYmdC5jaGlsZHJlbi5tYXAoZSkscj1pKHQudGFnLHQuZGF0YSxuKTtyZXR1cm4gci50ZXh0PXQudGV4dCxyLmlzQ29tbWVudD10LmlzQ29tbWVudCxyLmNvbXBvbmVudE9wdGlvbnM9dC5jb21wb25lbnRPcHRpb25zLHIuZWxtPXQuZWxtLHIuY29udGV4dD10LmNvbnRleHQsci5ucz10Lm5zLHIuaXNTdGF0aWM9dC5pc1N0YXRpYyxyLmtleT10LmtleSxyfSl9ZnVuY3Rpb24gZ2VuZXJhdGVEZWNsYXJhdGlvbihlLHQsbil7cmV0dXJue3R5cGU6ImRlY2xhcmF0aW9uIixwcm9wZXJ0eTplLHZhbHVlOnR9fWZ1bmN0aW9uIGNsZWFySW1wb3J0YW50KGUpe3ZhciB0PVN0cmluZyhlKS5yZXBsYWNlKC9ccyohaW1wb3J0YW50L2csIiIpO3JldHVybnt2YWx1ZTp0LGltcG9ydGFudDplIT09dH19ZnVuY3Rpb24gY3JlYXRlUGFyc2VyKHMpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPWUucG9zaXRpb24sbz1uLnNwbGl0KC9ccysvKSxhPVtdO3N3aXRjaChvLmxlbmd0aCl7Y2FzZSAxOm8ucHVzaChvWzBdLG9bMF0sb1swXSk7YnJlYWs7Y2FzZSAyOm8ucHVzaChvWzBdLG9bMV0pO2JyZWFrO2Nhc2UgMzpvLnB1c2gob1sxXSl9cmV0dXJuIGEucHVzaChnZW5lcmF0ZURlY2xhcmF0aW9uKHMrIlRvcCIsb1swXSxyLGkpLGdlbmVyYXRlRGVjbGFyYXRpb24ocysiUmlnaHQiLG9bMV0scixpKSxnZW5lcmF0ZURlY2xhcmF0aW9uKHMrIkJvdHRvbSIsb1syXSxyLGkpLGdlbmVyYXRlRGVjbGFyYXRpb24ocysiTGVmdCIsb1szXSxyLGkpKSxhfX12YXIgbWFyZ2luPWNyZWF0ZVBhcnNlcigibWFyZ2luIikscGFkZGluZz1jcmVhdGVQYXJzZXIoInBhZGRpbmciKTtmdW5jdGlvbiBib3JkZXIoZSl7dmFyIHQ9Y2xlYXJJbXBvcnRhbnQoZS52YWx1ZSksbj10LnZhbHVlLHI9dC5pbXBvcnRhbnQsaT1lLnByb3BlcnR5LG89bi5yZXBsYWNlKC9ccyosXHMqL2csIiwiKS5zcGxpdCgvXHMrLyksYT1bL15bXGQuXStcUyokLywvXihzb2xpZHxkYXNoZWR8ZG90dGVkKSQvLC9cUysvXS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9by5maW5kSW5kZXgoZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChlKX0pO3JldHVybiBlPDA/bnVsbDpvLnNwbGljZShlLDEpWzBdfSk7cmV0dXJuIG8ubGVuZ3RoP2U6W2dlbmVyYXRlRGVjbGFyYXRpb24oaSsiV2lkdGgiLChhWzBdfHwiMCIpLnRyaW0oKSxyKSxnZW5lcmF0ZURlY2xhcmF0aW9uKGkrIlN0eWxlIiwoYVsxXXx8InNvbGlkIikudHJpbSgpLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oaSsiQ29sb3IiLChhWzJdfHwiIzAwMDAwMCIpLnRyaW0oKSxyKV19ZnVuY3Rpb24gYm9yZGVyUHJvcGVydHkoZSl7dmFyIHQ9Y2xlYXJJbXBvcnRhbnQoZS52YWx1ZSksbj10LnZhbHVlLHI9dC5pbXBvcnRhbnQsaT1lLnByb3BlcnR5LnN1YnN0cmluZyg2KSxvPW4ucmVwbGFjZSgvXHMqLFxzKi9nLCIsIikuc3BsaXQoL1xzKy8pLGE9W107c3dpdGNoKG8ubGVuZ3RoKXtjYXNlIDE6cmV0dXJuIGU7Y2FzZSAyOm8ucHVzaChvWzBdLG9bMV0pO2JyZWFrO2Nhc2UgMzpvLnB1c2gob1sxXSl9cmV0dXJuIGEucHVzaChnZW5lcmF0ZURlY2xhcmF0aW9uKCJib3JkZXJUb3AiK2ksb1swXSxyKSxnZW5lcmF0ZURlY2xhcmF0aW9uKCJib3JkZXJSaWdodCIraSxvWzFdLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlckJvdHRvbSIraSxvWzJdLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlckxlZnQiK2ksb1szXSxyKSksYX1mdW5jdGlvbiBib3JkZXJSYWRpdXMoZSl7dmFyIHQ9Y2xlYXJJbXBvcnRhbnQoZS52YWx1ZSksbj10LnZhbHVlLHI9dC5pbXBvcnRhbnQsaT1uLnNwbGl0KC9ccysvKSxvPVtdO2lmKG4uaW5jbHVkZXMoIi8iKSlyZXR1cm4gZTtzd2l0Y2goaS5sZW5ndGgpe2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6aS5wdXNoKGlbMF0saVsxXSk7YnJlYWs7Y2FzZSAzOmkucHVzaChpWzFdKX1yZXR1cm4gby5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlclRvcExlZnRSYWRpdXMiLGlbMF0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyVG9wUmlnaHRSYWRpdXMiLGlbMV0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLGlbMl0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyQm90dG9tTGVmdFJhZGl1cyIsaVszXSxyKSksb31mdW5jdGlvbiBmbGV4RmxvdyhlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPW4uc3BsaXQoL1xzKy8pLG89Wy9eKGNvbHVtbnxjb2x1bW4tcmV2ZXJzZXxyb3d8cm93LXJldmVyc2UpJC8sL14obm93cmFwfHdyYXB8d3JhcC1yZXZlcnNlKSQvXS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9aS5maW5kSW5kZXgoZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChlKX0pO3JldHVybiBlPDA/bnVsbDppLnNwbGljZShlLDEpWzBdfSk7cmV0dXJuIGkubGVuZ3RoP2U6W2dlbmVyYXRlRGVjbGFyYXRpb24oImZsZXhEaXJlY3Rpb24iLG9bMF18fCJjb2x1bW4iLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImZsZXhXcmFwIixvWzFdfHwibm93cmFwIixyKV19ZnVuY3Rpb24gZm9udChlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPW4ucmVwbGFjZSgvLFxzKi9nLCIsIikucmVwbGFjZSgvXHMqXC9ccyovLCIvIikucmVwbGFjZSgvWyciXS4rP1snIl0vZyxmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9ccysvZywiIyIpfSkuc3BsaXQoL1xzKy8pLG89W10sYT1bIm5vcm1hbCIsIml0YWxpYyIsIm9ibGlxdWUiXTtvLnB1c2goZ2VuZXJhdGVEZWNsYXJhdGlvbigiZm9udFN0eWxlIixhW01hdGgubWF4KDAsYS5pbmRleE9mKGlbMF0pKV0scikpO3ZhciBzPWkuc2xpY2UoMCwtMikuZmluZChmdW5jdGlvbihlKXtyZXR1cm4vbm9ybWFsfGJvbGR8bGlnaHRlcnxib2xkZXJ8XGQrLy50ZXN0KGUpfSk7aWYocyYmby5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImZvbnRXZWlnaHQiLHMscikpLGk9aS5zbGljZSgtMiksL1tcZC5dK1xTKihcL1tcZC5dK1xTKik/Ly50ZXN0KGlbMF0pKXt2YXIgYz1pWzBdLnNwbGl0KCIvIiksdT1jWzBdLGw9Y1sxXTtyZXR1cm4gby5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImZvbnRTaXplIix1LHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImxpbmVIZWlnaHQiLGx8fCJub3JtYWwiLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImZvbnRGYW1pbHkiLGlbMV0ucmVwbGFjZSgvIy9nLCIgIikscikpLG99cmV0dXJuW119ZnVuY3Rpb24gYmFja2dyb3VuZChlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudDtyZXR1cm4vXiM/XFMrJC8udGVzdChuKXx8L15yZ2JhPyguKykkLy50ZXN0KG4pP2dlbmVyYXRlRGVjbGFyYXRpb24oImJhY2tncm91bmRDb2xvciIsbixyKTovXmxpbmVhci1ncmFkaWVudCguKykkLy50ZXN0KG4pP2dlbmVyYXRlRGVjbGFyYXRpb24oImJhY2tncm91bmRJbWFnZSIsbixyKTplfXZhciBwYXJzZXJDb2xsZWN0aW9uPXttYXJnaW46bWFyZ2luLHBhZGRpbmc6cGFkZGluZyxib3JkZXI6Ym9yZGVyLGJvcmRlclRvcDpib3JkZXIsYm9yZGVyUmlnaHQ6Ym9yZGVyLGJvcmRlckJvdHRvbTpib3JkZXIsYm9yZGVyTGVmdDpib3JkZXIsYm9yZGVyU3R5bGU6Ym9yZGVyUHJvcGVydHksYm9yZGVyV2lkdGg6Ym9yZGVyUHJvcGVydHksYm9yZGVyQ29sb3I6Ym9yZGVyUHJvcGVydHksYm9yZGVyUmFkaXVzOmJvcmRlclJhZGl1cyxmbGV4RmxvdzpmbGV4Rmxvdyxmb250OmZvbnQsYmFja2dyb3VuZDpiYWNrZ3JvdW5kfTtmdW5jdGlvbiBleHBhbmRTaG9ydGhhbmRQcm9wZXJ0eShlKXt2YXIgdD1wYXJzZXJDb2xsZWN0aW9uW2UucHJvcGVydHldO3JldHVybiB0JiYoZT10KGUpKSxbXS5jb25jYXQoZSl9dmFyIERFRkFVTFRfVEFHX05BTUU9ImRpdiIsQlVCQkxFX0VWRU5UUz1bImNsaWNrIiwibG9uZ3ByZXNzIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIiwicGFuc3RhcnQiLCJwYW5tb3ZlIiwicGFuZW5kIiwiaG9yaXpvbnRhbHBhbiIsInZlcnRpY2FscGFuIiwic3dpcGUiXTtmdW5jdGlvbiByZWdpc3Rlck5vZGUoZSx0KXtnZXREb2MoZSkubm9kZU1hcFt0Lm5vZGVJZF09dH12YXIgRWxlbWVudD1mdW5jdGlvbihpKXtmdW5jdGlvbiBlKGUsdCxuKXt2b2lkIDA9PT1lJiYoZT1ERUZBVUxUX1RBR19OQU1FKSxpLmNhbGwodGhpcyk7dmFyIHI9Z2V0V2VleEVsZW1lbnQoZSk7aWYociYmIW4pcmV0dXJuIG5ldyByKGUsdCwhMCk7dD10fHx7fSx0aGlzLm5vZGVUeXBlPTEsdGhpcy5ub2RlSWQ9dW5pcXVlSWQoKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLnR5cGU9ZSx0aGlzLmF0dHI9dC5hdHRyfHx7fSx0aGlzLnN0eWxlPXQuc3R5bGV8fHt9LHRoaXMuY2xhc3NTdHlsZT10LmNsYXNzU3R5bGV8fHt9LHRoaXMuZXZlbnQ9e30sdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnB1cmVDaGlsZHJlbj1bXSx0aGlzLmNsYXNzTGlzdD10LmNsYXNzTGlzdHx8W10sdGhpcy5zdHlsZXNoZWV0PXQuc3R5bGVzaGVldHx8W10sdGhpcy5yZWFkeT0hMX1yZXR1cm4gaSYmKGUuX19wcm90b19fPWkpLCgoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShpJiZpLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWUpLnByb3RvdHlwZS5hcHBlbmRDaGlsZD1mdW5jdGlvbihlKXtpZighZS5wYXJlbnROb2RlfHxlLnBhcmVudE5vZGU9PT10aGlzKWlmKGUucGFyZW50Tm9kZSl7aWYoY2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlthcHBlbmRDaGlsZF0oIit0aGlzLmRvY0lkKyIsIitlLnR5cGUrIiwiK2UucmVmKyIpIE1vdmUgPCIrZS50eXBlKyI+IHRvICIrdGhpcy5jaGlsZHJlbi5sZW5ndGgrIiBvZiA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksbW92ZUluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksMT09PWUubm9kZVR5cGUpe3ZhciB0PW1vdmVJbmRleChlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCksbj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO24mJjA8PXQmJih0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdChlKSxuLnNlbmQoImRvbSIse2FjdGlvbjoibW92ZUVsZW1lbnQifSxbZS5yZWYsdGhpcy5yZWYsdF0pKX19ZWxzZSBpZihjaGVja0xldmVsKCJkZWJ1ZyIpJiZkZWJ1Z0xvZygiW2FwcGVuZENoaWxkXSgiK3RoaXMuZG9jSWQrIiwiK2UudHlwZSsiLCIrZS5yZWYrIikgQXBwZW5kIDwiK2UudHlwZSsiPiB0byA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksbGlua1BhcmVudChlLHRoaXMpLGluc2VydEluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksdGhpcy5kb2NJZCYmcmVnaXN0ZXJOb2RlKHRoaXMuZG9jSWQsZSksMT09PWUubm9kZVR5cGUpe2luc2VydEluZGV4KGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKTt2YXIgcj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO3ImJih0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdChlKSxyLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRWxlbWVudCJ9LFt0aGlzLnJlZixlLnRvSlNPTigpLC0xXSkpLGUucmVhZHk9ITB9fSxlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oZSx0KXtpZighKGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8ZT09PXR8fGUubmV4dFNpYmxpbmcmJmUubmV4dFNpYmxpbmc9PT10KSlpZihlLnBhcmVudE5vZGUpe2lmKG1vdmVJbmRleChlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpLCEwKSwxPT09ZS5ub2RlVHlwZSl7dmFyIG49bmV4dEVsZW1lbnQodCkscj1tb3ZlSW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbixuP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yobik6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSxpPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7aSYmMDw9ciYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLGkuc2VuZCgiZG9tIix7YWN0aW9uOiJtb3ZlRWxlbWVudCJ9LFtlLnJlZix0aGlzLnJlZixyXSkpfX1lbHNlIGlmKGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbaW5zZXJ0QmVmb3JlXSgiK3RoaXMuZG9jSWQrIiwiK2UudHlwZSsiLCIrZS5yZWYrIikgSW5zZXJ0IDwiK2UudHlwZSsiPiB0byA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIiksIGJlZm9yZSAoIit0LnJlZisiKS4iKSxsaW5rUGFyZW50KGUsdGhpcyksaW5zZXJ0SW5kZXgoZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KSwhMCksdGhpcy5kb2NJZCYmcmVnaXN0ZXJOb2RlKHRoaXMuZG9jSWQsZSksMT09PWUubm9kZVR5cGUpe3ZhciBvPW5leHRFbGVtZW50KHQpLGE9aW5zZXJ0SW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbixvP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yobyk6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSxzPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7cyYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLHMuc2VuZCgiZG9tIix7YWN0aW9uOiJhZGRFbGVtZW50In0sW3RoaXMucmVmLGUudG9KU09OKCksYV0pKSxlLnJlYWR5PSEwfX0sZS5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24oZSx0KXtpZighKGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8ZT09PXR8fGUucHJldmlvdXNTaWJsaW5nJiZlLnByZXZpb3VzU2libGluZz09PXQpKWlmKGUucGFyZW50Tm9kZSl7aWYobW92ZUluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCkrMSwhMCksMT09PWUubm9kZVR5cGUpe3ZhciBuPW1vdmVJbmRleChlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YocHJldmlvdXNFbGVtZW50KHQpKSsxKSxyPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7ciYmMDw9biYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLHIuc2VuZCgiZG9tIix7YWN0aW9uOiJtb3ZlRWxlbWVudCJ9LFtlLnJlZix0aGlzLnJlZixuXSkpfX1lbHNlIGlmKGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbaW5zZXJ0QWZ0ZXJdKCIrdGhpcy5kb2NJZCsiLCIrZS50eXBlKyIsIitlLnJlZisiKSBJbnNlcnQgPCIrZS50eXBlKyI+IHRvIDwiK3RoaXMudHlwZSsiPiAoIit0aGlzLnJlZisiKSwgYWZ0ZXIgKCIrdC5yZWYrIikuIiksbGlua1BhcmVudChlLHRoaXMpLGluc2VydEluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCkrMSwhMCksdGhpcy5kb2NJZCYmcmVnaXN0ZXJOb2RlKHRoaXMuZG9jSWQsZSksMT09PWUubm9kZVR5cGUpe3ZhciBpPWluc2VydEluZGV4KGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihwcmV2aW91c0VsZW1lbnQodCkpKzEpLG89Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtvJiYodGhpcy5jb21wdXRlQ2hpbGRyZW5DbGFzc0xpc3QoZSksby5zZW5kKCJkb20iLHthY3Rpb246ImFkZEVsZW1lbnQifSxbdGhpcy5yZWYsZS50b0pTT04oKSxpXSkpLGUucmVhZHk9ITB9fSxlLnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbihlLHQpe2lmKGUucGFyZW50Tm9kZSl7aWYocmVtb3ZlSW5kZXgoZSx0aGlzLmNoaWxkcmVuLCEwKSwxPT09ZS5ub2RlVHlwZSl7Y2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIltyZW1vdmVDaGlsZF0oIit0aGlzLmRvY0lkKyIsIitlLnR5cGUrIiwiK2UucmVmKyIpIFJlbW92ZSA8IitlLnR5cGUrIj4gZnJvbSA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIikscmVtb3ZlSW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbik7dmFyIG49Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtuJiZuLnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRWxlbWVudCJ9LFtlLnJlZl0pLGUucmVhZHk9ITF9dGhpcy5jb21wdXRlQ2hpbGRyZW5DbGFzc0xpc3QoZSxlLm5leHRTaWJsaW5nfHx7fSl9dHx8ZS5kZXN0cm95KCl9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dmFyIHQ9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTt0aGlzLnB1cmVDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QmJnQuc2VuZCgiZG9tIix7YWN0aW9uOiJyZW1vdmVFbGVtZW50In0sW2UucmVmXSksZS5yZWFkeT0hMX0pLHRoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtlLmRlc3Ryb3koKX0pLHRoaXMuY2hpbGRyZW4ubGVuZ3RoPTAsdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoPTB9LGUucHJvdG90eXBlLnNldEF0dHI9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuYXR0cltlXSE9PXR8fCExPT09bil7dGhpcy5hdHRyW2VdPXQ7dmFyIHI9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtpZighbiYmcil7dmFyIGk9e307aVtlXT10LHIuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVBdHRycyJ9LFt0aGlzLnJlZixpXSl9fX0sZS5wcm90b3R5cGUuc2V0QXR0cnM9ZnVuY3Rpb24oZSx0KXtpZighaXNFbXB0eShlKSl7dmFyIG49e307Zm9yKHZhciByIGluIGUpdGhpcy5hdHRyW3JdIT09ZVtyXSYmKHRoaXMuYXR0cltyXT1lW3JdLG5bcl09ZVtyXSk7aWYoIWlzRW1wdHkobikpe3ZhciBpPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7IXQmJmkmJmkuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVBdHRycyJ9LFt0aGlzLnJlZixuXSl9fX0sZS5wcm90b3R5cGUuc2V0U3R5bGU9ZnVuY3Rpb24oZSx0LG8pe3ZhciBhPXRoaXM7ZXhwYW5kU2hvcnRoYW5kUHJvcGVydHkoe3Byb3BlcnR5OmUsdmFsdWU6dH0pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wcm9wZXJ0eSxuPWUudmFsdWU7aWYoYS5zdHlsZVt0XSE9PW58fCExPT09byl7YS5zdHlsZVt0XT1uO3ZhciByPWdldFRhc2tDZW50ZXIoYS5kb2NJZCk7aWYoIW8mJnIpe3ZhciBpPXt9O2lbdF09IiI9PT1uJiZ0IGluIGEuY2xhc3NTdHlsZT9hLmNsYXNzU3R5bGVbdF06bixyLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlU3R5bGUifSxbYS5yZWYsaV0pfX19KX0sZS5wcm90b3R5cGUuc2V0U3R5bGVzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcztpZighaXNFbXB0eShlKSl7dmFyIGk9e307Zm9yKHZhciBuIGluIGUpe2V4cGFuZFNob3J0aGFuZFByb3BlcnR5KHtwcm9wZXJ0eTpuLHZhbHVlOmVbbl19KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucHJvcGVydHksbj1lLnZhbHVlO3Iuc3R5bGVbdF0hPT1uJiYoci5zdHlsZVt0XT1uLGlbdF09IiI9PT1uJiZ0IGluIHIuY2xhc3NTdHlsZT9yLmNsYXNzU3R5bGVbdF06bil9KX1pZighaXNFbXB0eShpKSl7dmFyIG89Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTshdCYmbyYmby5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZVN0eWxlIn0sW3RoaXMucmVmLGldKX19fSxlLnByb3RvdHlwZS5zZXRDbGFzc1N0eWxlPWZ1bmN0aW9uKGUpe3ZhciB0PSExO2Zvcih2YXIgbiBpbiB0aGlzLmNsYXNzU3R5bGUpbiBpbiBlfHwodD0hMCx0aGlzLmNsYXNzU3R5bGVbbl09IiIpO2Zvcih2YXIgciBpbiBlKWVbcl0hPT10aGlzLmNsYXNzU3R5bGVbcl0mJih0PSEwLHRoaXMuY2xhc3NTdHlsZVtyXT1lW3JdKTtpZih0KXt2YXIgaT1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO2kmJnRoaXMucmVhZHkmJmkuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVTdHlsZSJ9LFt0aGlzLnJlZix0aGlzLnRvU3R5bGUoKV0pfX0sZS5wcm90b3R5cGUuYWRkRXZlbnQ9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuZXZlbnR8fCh0aGlzLmV2ZW50PXt9KSwhdGhpcy5ldmVudFtlXSl7Y2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlthZGRFdmVudF0oIit0aGlzLmRvY0lkKyIsIit0aGlzLnR5cGUrIiwiK3RoaXMucmVmKycpIEFkZCAiJytlKyciIGV2ZW50IG9uIDwnK3RoaXMudHlwZSsiPiAoIit0aGlzLnJlZisiKS4iKSx0aGlzLmV2ZW50W2VdPXtoYW5kbGVyOnQscGFyYW1zOm59O3ZhciByPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7ciYmci5zZW5kKCJkb20iLHthY3Rpb246ImFkZEV2ZW50In0sW3RoaXMucmVmLGVdKX19LGUucHJvdG90eXBlLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUpe2lmKHRoaXMuZXZlbnQmJnRoaXMuZXZlbnRbZV0pe2NoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbcmVtb3ZlRXZlbnRdKCIrdGhpcy5kb2NJZCsiLCIrdGhpcy50eXBlKyIsIit0aGlzLnJlZisnKSBSZW1vdmUgIicrZSsnIiBldmVudCBvbiA8Jyt0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksZGVsZXRlIHRoaXMuZXZlbnRbZV07dmFyIHQ9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTt0JiZ0LnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRXZlbnQifSxbdGhpcy5yZWYsZV0pfX0sZS5wcm90b3R5cGUuZmlyZUV2ZW50PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW51bGwsbz0hMSxhPXRoaXMuZXZlbnRbdF07aWYoYSYmZSl7Y2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIltmaXJlRXZlbnRdKCIrdGhpcy5kb2NJZCsiLCIrdGhpcy50eXBlKyIsIit0aGlzLnJlZisnKSBGaXJlICInK3QrJyIgZXZlbnQgb24gPCcrdGhpcy50eXBlKyI+ICgiK3RoaXMucmVmKyIpLiIpO3ZhciBzPWEuaGFuZGxlcjtlLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe289ITB9O3RyeXtpPXImJnIucGFyYW1zP3MuY2FsbC5hcHBseShzLFt0aGlzXS5jb25jYXQoci5wYXJhbXMsW2VdKSk6cy5jYWxsKHRoaXMsZSl9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcignW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGludm9rZSB0aGUgZXZlbnQgaGFuZGxlciBvZiAiJyt0KyciIG9uICcrdGhpcy50eXBlKyIgKCIrdGhpcy5yZWYrIik6XG4gIitlLnRvU3RyaW5nKCkpLGV9fXJldHVybiFvJiZuJiYtMSE9PUJVQkJMRV9FVkVOVFMuaW5kZXhPZih0KSYmdGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuZmlyZUV2ZW50JiYoZS5jdXJyZW50VGFyZ2V0PXRoaXMucGFyZW50Tm9kZSx0aGlzLnBhcmVudE5vZGUuZmlyZUV2ZW50KHQsZSxuKSksaX0sZS5wcm90b3R5cGUudG9TdHlsZT1mdW5jdGlvbigpe3ZhciBlPU9iamVjdC5hc3NpZ24oe30sdGhpcy5jbGFzc1N0eWxlKSx0PXRoaXMuc3R5bGU7Zm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07ZVtuXT0iIj09PXImJm4gaW4gdGhpcy5jbGFzc1N0eWxlP3RoaXMuY2xhc3NTdHlsZVtuXTpyfXJldHVybiBlfSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9ITEpO3ZhciB0PXtyZWY6dGhpcy5yZWYudG9TdHJpbmcoKSx0eXBlOnRoaXMudHlwZSxhdHRyOnRoaXMuYXR0cixzdHlsZTpub3JtYWxpemVVbml0KHRoaXMudG9TdHlsZSgpKX07dGhpcy5jbGFzc0xpc3QmJnRoaXMuY2xhc3NMaXN0Lmxlbmd0aCYmKHQuY2xhc3M9dGhpcy5jbGFzc0xpc3Quam9pbigiICIpKTt2YXIgbj1bXTtmb3IodmFyIHIgaW4gdGhpcy5ldmVudCl7dmFyIGk9dGhpcy5ldmVudFtyXS5wYXJhbXM7aT9uLnB1c2goe3R5cGU6cixwYXJhbXM6aX0pOm4ucHVzaChyKX1yZXR1cm4gbi5sZW5ndGgmJih0LmV2ZW50PW4pLCFlJiZ0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgmJih0LmNoaWxkcmVuPXRoaXMucHVyZUNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50b0pTT04oKX0pKSx0fSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiI8Iit0aGlzLnR5cGUrIiBhdHRyPSIrSlNPTi5zdHJpbmdpZnkodGhpcy5hdHRyKSsiIHN0eWxlPSIrSlNPTi5zdHJpbmdpZnkodGhpcy50b1N0eWxlKCkpKyI+Iit0aGlzLnB1cmVDaGlsZHJlbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9TdHJpbmcoKX0pLmpvaW4oIiIpKyI8LyIrdGhpcy50eXBlKyI+In0sZS5wcm90b3R5cGUuc2V0Q2xhc3NMaXN0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZS5sZW5ndGg9PT10aGlzLmNsYXNzTGlzdC5sZW5ndGgmJjA9PT1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hdC5jbGFzc0xpc3QuaW5jbHVkZXMoZSl9KS5sZW5ndGh8fCh0aGlzLmNsYXNzTGlzdD1lLHRoaXMucGFyZW50Tm9kZSYmdGhpcy5jb21wdXRlQ2xhc3NMaXN0KCkpfSxlLnByb3RvdHlwZS5zZXRTdHlsZXNoZWV0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZS5sZW5ndGg9PT10aGlzLnN0eWxlc2hlZXQubGVuZ3RoJiYwPT09ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIXQuc3R5bGVzaGVldC5pbmNsdWRlcyhlKX0pLmxlbmd0aHx8KHRoaXMuc3R5bGVzaGVldD1lLHRoaXMuY2xhc3NMaXN0Lmxlbmd0aCYmdGhpcy5wYXJlbnROb2RlJiZ0aGlzLmNvbXB1dGVDbGFzc0xpc3QoKSl9LGUucHJvdG90eXBlLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY2hpbGRyZW4scj10fHxlLGk9cj9uLmluZGV4T2Yocik6MCxvPW4ubGVuZ3RoLTE7Zm9yKCFlfHxlLmNsYXNzTGlzdCYmZS5jbGFzc0xpc3QubGVuZ3RofHwobz10P2ktMTppKTswPD1pJiZpPD1vO2krKyl7dmFyIGE9bltpXTthLmNvbXB1dGVDbGFzc0xpc3QmJmEuY29tcHV0ZUNsYXNzTGlzdCgpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUNsYXNzTGlzdD1mdW5jdGlvbigpe3ZhciB1PXRoaXMsZT10aGlzLmNsYXNzTGlzdCx0PXRoaXMuc3R5bGVzaGVldCxwPXt9LGg9e307ZnVuY3Rpb24gbChlLHQpe3ZhciBuPXQmJnQuY2xhc3NMaXN0O3JldHVybiBuJiZuLmluY2x1ZGVzKGUpfXQuZm9yRWFjaChmdW5jdGlvbihuLGYpe2UuZm9yRWFjaChmdW5jdGlvbihlKXtpZigoblsiQFZFUlNJT04iXXx8MSk8Mil7dmFyIHQ9bltlXTt0JiZPYmplY3QuYXNzaWduKHAsdCl9ZWxzZXt2YXIgYz1uWyIuIitlXTtjJiZPYmplY3Qua2V5cyhjKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXU7aWYoZSlmb3IodmFyIG49ZS5zcGxpdCgiLiIpLHI9bi5sZW5ndGgtMTswPHI7ci0tKXt2YXIgaT1uW3JdLG89aVtpLmxlbmd0aC0xXSxhPWkucmVwbGFjZSgvWyt+PiBdJC8sIiIpO2lmKCJ+Ij09PW98fCIgIj09PW8pe2Zvcih2YXIgcz0ifiI9PT1vPyJwcmV2aW91c1NpYmxpbmciOiJwYXJlbnROb2RlIjt0JiYhbChhLHQ9dFtzXSk7KTtpZighdClyZXR1cm59ZWxzZSBpZigiPiI9PT1vP3Q9dCYmdC5wYXJlbnROb2RlOiIrIj09PW8mJih0PXQmJnQucHJldmlvdXNTaWJsaW5nKSwhbChhLHQpKXJldHVybn12YXIgZD1jW2VdO09iamVjdC5rZXlzKGQpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZFtlXSxuPXRbMF0scj10WzFdLGk9dFsyXSxvPXRbM10sYT1bcixpLGYsb10scz1oW2VdLGM9ITA7aWYocylmb3IodmFyIHU9MDt1PHMubGVuZ3RoO3UrKyl7dmFyIGw9YVt1XS1zW3VdO2lmKDAhPT1sKXtjPTA8bDticmVha319YyYmKHBbZV09bixoW2VdPWEpfSl9KX19KX0pLHRoaXMuc2V0Q2xhc3NTdHlsZShwKSx0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdCgpfSxlfShOb2RlKTtmdW5jdGlvbiBub3JtYWxpemVQcmltaXRpdmUoZSl7dmFyIHQ9dHlwb2YoZSk7c3dpdGNoKHQpe2Nhc2UiVW5kZWZpbmVkIjpjYXNlIk51bGwiOnJldHVybiIiO2Nhc2UiUmVnRXhwIjpyZXR1cm4gZS50b1N0cmluZygpO2Nhc2UiRGF0ZSI6cmV0dXJuIGUudG9JU09TdHJpbmcoKTtjYXNlIk51bWJlciI6Y2FzZSJTdHJpbmciOmNhc2UiQm9vbGVhbiI6Y2FzZSJBcnJheSI6Y2FzZSJPYmplY3QiOnJldHVybiBlO2Nhc2UiQXJyYXlCdWZmZXIiOnJldHVybnsiQHR5cGUiOiJiaW5hcnkiLGRhdGFUeXBlOnQsYmFzZTY0OmJ1ZmZlclRvQmFzZTY0KGUpfTtjYXNlIkludDhBcnJheSI6Y2FzZSJVaW50OEFycmF5IjpjYXNlIlVpbnQ4Q2xhbXBlZEFycmF5IjpjYXNlIkludDE2QXJyYXkiOmNhc2UiVWludDE2QXJyYXkiOmNhc2UiSW50MzJBcnJheSI6Y2FzZSJVaW50MzJBcnJheSI6Y2FzZSJGbG9hdDMyQXJyYXkiOmNhc2UiRmxvYXQ2NEFycmF5IjpyZXR1cm57IkB0eXBlIjoiYmluYXJ5IixkYXRhVHlwZTp0LGJhc2U2NDpidWZmZXJUb0Jhc2U2NChlLmJ1ZmZlcil9O2RlZmF1bHQ6cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpfX1zZXRFbGVtZW50KEVsZW1lbnQpO3ZhciBmYWxsYmFjaz1mdW5jdGlvbigpe30sVGFza0NlbnRlcj1mdW5jdGlvbihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpbnN0YW5jZUlkIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpTdHJpbmcoZSl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY2FsbGJhY2tNYW5hZ2VyIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpuZXcgQ2FsbGJhY2tNYW5hZ2VyKGUpfSksZmFsbGJhY2s9dHx8ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBpbml0JDEoKXt2YXIgZT17Y3JlYXRlRmluaXNoOmdsb2JhbC5jYWxsQ3JlYXRlRmluaXNoLHVwZGF0ZUZpbmlzaDpnbG9iYWwuY2FsbFVwZGF0ZUZpbmlzaCxyZWZyZXNoRmluaXNoOmdsb2JhbC5jYWxsUmVmcmVzaEZpbmlzaCxjcmVhdGVCb2R5Omdsb2JhbC5jYWxsQ3JlYXRlQm9keSxhZGRFbGVtZW50Omdsb2JhbC5jYWxsQWRkRWxlbWVudCxyZW1vdmVFbGVtZW50Omdsb2JhbC5jYWxsUmVtb3ZlRWxlbWVudCxtb3ZlRWxlbWVudDpnbG9iYWwuY2FsbE1vdmVFbGVtZW50LHVwZGF0ZUF0dHJzOmdsb2JhbC5jYWxsVXBkYXRlQXR0cnMsdXBkYXRlU3R5bGU6Z2xvYmFsLmNhbGxVcGRhdGVTdHlsZSxhZGRFdmVudDpnbG9iYWwuY2FsbEFkZEV2ZW50LHJlbW92ZUV2ZW50Omdsb2JhbC5jYWxsUmVtb3ZlRXZlbnQsX191cGRhdGVDb21wb25lbnREYXRhOmdsb2JhbC5fX3VwZGF0ZUNvbXBvbmVudERhdGF9LHQ9VGFza0NlbnRlci5wcm90b3R5cGUsbj1mdW5jdGlvbihuKXt2YXIgcj1lW25dO3Rbbl09cj9mdW5jdGlvbihlLHQpe3JldHVybiByLmFwcGx5KHZvaWQgMCxbZV0uY29uY2F0KHQpKX06ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZmFsbGJhY2soZSxbe21vZHVsZToiZG9tIixtZXRob2Q6bixhcmdzOnR9XSwiLTEiKX19O2Zvcih2YXIgciBpbiBlKW4ocik7dC5jb21wb25lbnRIYW5kbGVyPWdsb2JhbC5jYWxsTmF0aXZlQ29tcG9uZW50fHxmdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiBmYWxsYmFjayhlLFt7Y29tcG9uZW50OmkuY29tcG9uZW50LHJlZjp0LG1ldGhvZDpuLGFyZ3M6cn1dKX0sdC5tb2R1bGVIYW5kbGVyPWdsb2JhbC5jYWxsTmF0aXZlTW9kdWxlfHxmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gZmFsbGJhY2soZSxbe21vZHVsZTp0LG1ldGhvZDpuLGFyZ3M6cn1dKX19ZnVuY3Rpb24gZmlyZUV2ZW50KGUsdCxuLHIsaSxvKXt2YXIgYT1lLmdldFJlZih0KTtyZXR1cm4gYT9lLmZpcmVFdmVudChhLG4scixpLG8pOnI/KHIuX25vZGVJZD10LGUuZmlyZUV2ZW50KGUuZ2V0UmVmKCJfZG9jdW1lbnRFbGVtZW50IiksbixyLGksbykpOnZvaWQgMH1mdW5jdGlvbiBjYWxsYmFjayhlLHQsbixyKXtyZXR1cm4gZS50YXNrQ2VudGVyLmNhbGxiYWNrKHQsbixyKX1mdW5jdGlvbiBjb21wb25lbnRIb29rKGUsdCxuLHIsaSl7aWYoIWV8fCFlLnRhc2tDZW50ZXIpcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1tKUyBGcmFtZXdvcmtdIENhblwndCBmaW5kICJkb2N1bWVudCIgb3IgInRhc2tDZW50ZXIiLicpLG51bGw7dmFyIG89bnVsbDt0cnl7bz1lLnRhc2tDZW50ZXIudHJpZ2dlckhvb2sodCxuLHIsaSl9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcignW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIHRyaWdnZXIgdGhlICInK24rIkAiK3IrJyIgaG9vayBvbiAnK3QrIi4iKSxlfXJldHVybiBvfWZ1bmN0aW9uIHJlY2VpdmVUYXNrcyhlLHQpe3ZhciBuPWdldERvYyhlKTtyZXR1cm4gbj9BcnJheS5pc0FycmF5KHQpP3QubWFwKGZ1bmN0aW9uKGUpe3N3aXRjaChlLm1ldGhvZCl7Y2FzZSJjYWxsYmFjayI6cmV0dXJuIGNhbGxiYWNrLmFwcGx5KHZvaWQgMCxbbl0uY29uY2F0KGUuYXJncykpO2Nhc2UiZmlyZUV2ZW50U3luYyI6Y2FzZSJmaXJlRXZlbnQiOnJldHVybiBmaXJlRXZlbnQuYXBwbHkodm9pZCAwLFtuXS5jb25jYXQoZS5hcmdzKSk7Y2FzZSJjb21wb25lbnRIb29rIjpyZXR1cm4gY29tcG9uZW50SG9vay5hcHBseSh2b2lkIDAsW25dLmNvbmNhdChlLmFyZ3MpKX19KTp2b2lkIDA6bmV3IEVycm9yKCJbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gcmVjZWl2ZVRhc2tzLCBpbnN0YW5jZSAoIitlKyIpIGlzIG5vdCBhdmFpbGFibGUuIil9VGFza0NlbnRlci5wcm90b3R5cGUuY2FsbGJhY2s9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5jb25zdW1lKGUsdCxuKX0sVGFza0NlbnRlci5wcm90b3R5cGUucmVnaXN0ZXJIb29rPWZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuKGU9dGhpcy5jYWxsYmFja01hbmFnZXIpLnJlZ2lzdGVySG9vay5hcHBseShlLHQpfSxUYXNrQ2VudGVyLnByb3RvdHlwZS50cmlnZ2VySG9vaz1mdW5jdGlvbigpe2Zvcih2YXIgZSx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09YXJndW1lbnRzW25dO3JldHVybihlPXRoaXMuY2FsbGJhY2tNYW5hZ2VyKS50cmlnZ2VySG9vay5hcHBseShlLHQpfSxUYXNrQ2VudGVyLnByb3RvdHlwZS51cGRhdGVEYXRhPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnNlbmQoIm1vZHVsZSIse21vZHVsZToiZG9tIixtZXRob2Q6InVwZGF0ZUNvbXBvbmVudERhdGEifSxbZSx0LG5dKX0sVGFza0NlbnRlci5wcm90b3R5cGUuZGVzdHJveUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmNsb3NlKCl9LFRhc2tDZW50ZXIucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dm9pZCAwPT09dCYmKHQ9ITEpO3ZhciByPXR5cG9mKGUpO2lmKGUmJmUgaW5zdGFuY2VvZiBFbGVtZW50KXJldHVybiBlLnJlZjtpZihlJiZlLl9pc1Z1ZSYmZS4kZWwgaW5zdGFuY2VvZiBFbGVtZW50KXJldHVybiBlLiRlbC5yZWY7aWYoIkZ1bmN0aW9uIj09PXIpcmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmFkZChlKS50b1N0cmluZygpO2lmKHQpe2lmKCJPYmplY3QiPT09cil7dmFyIGk9e307Zm9yKHZhciBvIGluIGUpaVtvXT1uLm5vcm1hbGl6ZShlW29dLCEwKTtyZXR1cm4gaX1pZigiQXJyYXkiPT09cilyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG4ubm9ybWFsaXplKGUsITApfSl9cmV0dXJuIGUmJmUucmVmJiZlWyJbW1ZpcnR1YWxFbGVtZW50XV0iXT9lLnJlZjpub3JtYWxpemVQcmltaXRpdmUoZSl9LFRhc2tDZW50ZXIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcyxvPXQuYWN0aW9uLGE9dC5jb21wb25lbnQscz10LnJlZixjPXQubW9kdWxlLHU9dC5tZXRob2Q7c3dpdGNoKG49bi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGkubm9ybWFsaXplKGUpfSksIk9iamVjdCI9PT10eXBvZihyKSYmKHI9dGhpcy5ub3JtYWxpemUociwhMCkpLGUpe2Nhc2UiZG9tIjpyZXR1cm4gY2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlt0YXNrXSgiK3RoaXMuaW5zdGFuY2VJZCsiLCIrdGhpcy50eXBlKyIsIitvKyIpICIrSlNPTi5zdHJpbmdpZnkobikpLHRoaXNbb10odGhpcy5pbnN0YW5jZUlkLG4pO2Nhc2UiY29tcG9uZW50IjpyZXR1cm4gdGhpcy5jb21wb25lbnRIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxzLHUsbixPYmplY3QuYXNzaWduKHtjb21wb25lbnQ6YX0scikpO2RlZmF1bHQ6cmV0dXJuIGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbdGFza10oIit0aGlzLmluc3RhbmNlSWQrIiwiK2MrIiwiK3UrIikgIitKU09OLnN0cmluZ2lmeShuKSksdGhpcy5tb2R1bGVIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxjLHUsbixyKX19LFRhc2tDZW50ZXIucHJvdG90eXBlLmNhbGxET009ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpc1tlXSh0aGlzLmluc3RhbmNlSWQsdCl9LFRhc2tDZW50ZXIucHJvdG90eXBlLmNhbGxDb21wb25lbnQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuY29tcG9uZW50SGFuZGxlcih0aGlzLmluc3RhbmNlSWQsZSx0LG4scil9LFRhc2tDZW50ZXIucHJvdG90eXBlLmNhbGxNb2R1bGU9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMubW9kdWxlSGFuZGxlcih0aGlzLmluc3RhbmNlSWQsZSx0LG4scil9O3ZhciB3ZWV4TW9kdWxlcz17fTtmdW5jdGlvbiByZWdpc3Rlck1vZHVsZXMoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWZ1bmN0aW9uKHQpe2hhc093bih3ZWV4TW9kdWxlcyx0KXx8KHdlZXhNb2R1bGVzW3RdPXt9KSxBcnJheS5pc0FycmF5KGVbdF0pJiZlW3RdLmZvckVhY2goZnVuY3Rpb24oZSl7InN0cmluZyI9PXR5cGVvZiBlP3dlZXhNb2R1bGVzW3RdW2VdPSEwOmlzUGxhaW5PYmplY3QoZSkmJiJzdHJpbmciPT10eXBlb2YgZS5uYW1lJiYod2VleE1vZHVsZXNbdF1bZS5uYW1lXT1lLmFyZ3N8fFtdKX0pfTtmb3IodmFyIG4gaW4gZSl0KG4pfWZ1bmN0aW9uIGlzUmVnaXN0ZXJlZE1vZHVsZShlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD8hKCF3ZWV4TW9kdWxlc1tlXXx8IXdlZXhNb2R1bGVzW2VdW3RdKTohIXdlZXhNb2R1bGVzW2VdfWZ1bmN0aW9uIGdldE1vZHVsZURlc2NyaXB0aW9uKGUpe3JldHVybiB3ZWV4TW9kdWxlc1tlXX12YXIgd2VleENvbXBvbmVudHM9e307ZnVuY3Rpb24gcmVnaXN0ZXJDb21wb25lbnRzKGUpe0FycmF5LmlzQXJyYXkoZSkmJmUuZm9yRWFjaChmdW5jdGlvbihlKXtlJiYoInN0cmluZyI9PXR5cGVvZiBlP3dlZXhDb21wb25lbnRzW2VdPSEwOmlzUGxhaW5PYmplY3QoZSkmJiJzdHJpbmciPT10eXBlb2YgZS50eXBlJiZyZWdpc3RlckVsZW1lbnQoKHdlZXhDb21wb25lbnRzW2UudHlwZV09ZSkudHlwZSxlLm1ldGhvZHMpKX0pfWZ1bmN0aW9uIGlzUmVnaXN0ZXJlZENvbXBvbmVudChlKXtyZXR1cm4hIXdlZXhDb21wb25lbnRzW2VdfXZhciBzZXJ2aWNlcz1bXTtmdW5jdGlvbiByZWdpc3RlcihlLHQpe2hhcyhlKT9jb25zb2xlLndhcm4oJ1NlcnZpY2UgIicrZSsnIiBoYXMgYmVlbiByZWdpc3RlcmVkIGFscmVhZHkhJyk6KHQ9T2JqZWN0LmFzc2lnbih7fSx0KSxzZXJ2aWNlcy5wdXNoKHtuYW1lOmUsb3B0aW9uczp0fSkpfWZ1bmN0aW9uIHVucmVnaXN0ZXIobil7c2VydmljZXMuc29tZShmdW5jdGlvbihlLHQpe2lmKGUubmFtZT09PW4pcmV0dXJuIHNlcnZpY2VzLnNwbGljZSh0LDEpLCEwfSl9ZnVuY3Rpb24gaGFzKGUpe3JldHVybiAwPD1pbmRleE9mKGUpfWZ1bmN0aW9uIGluZGV4T2YoZSl7cmV0dXJuIHNlcnZpY2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lfSkuaW5kZXhPZihlKX12YXIgQ29tbWVudD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLm5vZGVUeXBlPTgsdGhpcy5ub2RlSWQ9dW5pcXVlSWQoKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLnR5cGU9ImNvbW1lbnQiLHRoaXMudmFsdWU9ZSx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksKChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZSkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlx4M2MhLS0gIit0aGlzLnZhbHVlKyIgLS1ceDNlIn0sZX0oTm9kZSk7ZnVuY3Rpb24gY3JlYXRlQWN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PVtdKSx7bW9kdWxlOiJkb20iLG1ldGhvZDplLGFyZ3M6dH19dmFyIExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMuYmF0Y2hlZD0hMSx0aGlzLnVwZGF0ZXM9W10sImZ1bmN0aW9uIj09dHlwZW9mIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImhhbmRsZXIiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSk6Y29uc29sZS5lcnJvcigiW0pTIFJ1bnRpbWVdIGludmFsaWQgcGFyYW1ldGVyLCBoYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvbiIpfTtMaXN0ZW5lci5wcm90b3R5cGUuY3JlYXRlRmluaXNoPWZ1bmN0aW9uKGUpe3JldHVybigwLHRoaXMuaGFuZGxlcikoW2NyZWF0ZUFjdGlvbigiY3JlYXRlRmluaXNoIildLGUpfSxMaXN0ZW5lci5wcm90b3R5cGUudXBkYXRlRmluaXNoPWZ1bmN0aW9uKGUpe3JldHVybigwLHRoaXMuaGFuZGxlcikoW2NyZWF0ZUFjdGlvbigidXBkYXRlRmluaXNoIildLGUpfSxMaXN0ZW5lci5wcm90b3R5cGUucmVmcmVzaEZpbmlzaD1mdW5jdGlvbihlKXtyZXR1cm4oMCx0aGlzLmhhbmRsZXIpKFtjcmVhdGVBY3Rpb24oInJlZnJlc2hGaW5pc2giKV0sZSl9LExpc3RlbmVyLnByb3RvdHlwZS5jcmVhdGVCb2R5PWZ1bmN0aW9uKGUpe3ZhciB0PWUudG9KU09OKCksbj10LmNoaWxkcmVuO2RlbGV0ZSB0LmNoaWxkcmVuO3ZhciByPVtjcmVhdGVBY3Rpb24oImNyZWF0ZUJvZHkiLFt0XSldO3JldHVybiBuJiZyLnB1c2guYXBwbHkocixuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gY3JlYXRlQWN0aW9uKCJhZGRFbGVtZW50IixbdC5yZWYsZSwtMV0pfSkpLHRoaXMuYWRkQWN0aW9ucyhyKX0sTGlzdGVuZXIucHJvdG90eXBlLmFkZEVsZW1lbnQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAwPD1ufHwobj0tMSksdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigiYWRkRWxlbWVudCIsW3QsZS50b0pTT04oKSxuXSkpfSxMaXN0ZW5lci5wcm90b3R5cGUucmVtb3ZlRWxlbWVudD1mdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgdD1lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gY3JlYXRlQWN0aW9uKCJyZW1vdmVFbGVtZW50IixbZV0pfSk7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyh0KX1yZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigicmVtb3ZlRWxlbWVudCIsW2VdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5tb3ZlRWxlbWVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oIm1vdmVFbGVtZW50IixbZSx0LG5dKSl9LExpc3RlbmVyLnByb3RvdHlwZS5zZXRBdHRyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17fTtyZXR1cm4gclt0XT1uLHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oInVwZGF0ZUF0dHJzIixbZSxyXSkpfSxMaXN0ZW5lci5wcm90b3R5cGUuc2V0U3R5bGU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O3JldHVybiByW3RdPW4sdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigidXBkYXRlU3R5bGUiLFtlLHJdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5zZXRTdHlsZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigidXBkYXRlU3R5bGUiLFtlLHRdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5hZGRFdmVudD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCJhZGRFdmVudCIsW2UsdF0pKX0sTGlzdGVuZXIucHJvdG90eXBlLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oInJlbW92ZUV2ZW50IixbZSx0XSkpfSxMaXN0ZW5lci5wcm90b3R5cGUuaGFuZGxlcj1mdW5jdGlvbihlLHQpe3JldHVybiB0JiZ0KCl9LExpc3RlbmVyLnByb3RvdHlwZS5hZGRBY3Rpb25zPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMudXBkYXRlcyxuPXRoaXMuaGFuZGxlcjtpZihBcnJheS5pc0FycmF5KGUpfHwoZT1bZV0pLCF0aGlzLmJhdGNoZWQpcmV0dXJuIG4oZSk7dC5wdXNoLmFwcGx5KHQsZSl9O3ZhciBoYW5kbGVyTWFwPXtjcmVhdGVCb2R5OiJjYWxsQ3JlYXRlQm9keSIsYWRkRWxlbWVudDoiY2FsbEFkZEVsZW1lbnQiLHJlbW92ZUVsZW1lbnQ6ImNhbGxSZW1vdmVFbGVtZW50Iixtb3ZlRWxlbWVudDoiY2FsbE1vdmVFbGVtZW50Iix1cGRhdGVBdHRyczoiY2FsbFVwZGF0ZUF0dHJzIix1cGRhdGVTdHlsZToiY2FsbFVwZGF0ZVN0eWxlIixhZGRFdmVudDoiY2FsbEFkZEV2ZW50IixyZW1vdmVFdmVudDoiY2FsbFJlbW92ZUV2ZW50In07ZnVuY3Rpb24gY3JlYXRlSGFuZGxlcihyLGUpe3ZhciBpPWV8fGdsb2JhbC5jYWxsTmF0aXZlO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiBpJiZjb25zb2xlLmVycm9yKCJbSlMgUnVudGltZV0gbm8gZGVmYXVsdCBoYW5kbGVyIiksZnVuY3Rpb24oZSl7QXJyYXkuaXNBcnJheShlKXx8KGU9W2VdKTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZGlzcGF0Y2hUYXNrKHIsZVt0XSxpKTtpZigtMT09PW4pcmV0dXJuIG59fX1mdW5jdGlvbiBoYXNBdmFpbGFibGVIYW5kbGVyKGUsdCl7cmV0dXJuImRvbSI9PT1lJiZoYW5kbGVyTWFwW3RdJiYiZnVuY3Rpb24iPT10eXBlb2YgZ2xvYmFsW2hhbmRsZXJNYXBbdF1dfWZ1bmN0aW9uIGRpc3BhdGNoVGFzayhlLHQsbil7dmFyIHI9dC5tb2R1bGUsaT10Lm1ldGhvZCxvPXQuYXJncztyZXR1cm4gaGFzQXZhaWxhYmxlSGFuZGxlcihyLGkpP2dsb2JhbFtoYW5kbGVyTWFwW2ldXS5hcHBseShnbG9iYWwsW2VdLmNvbmNhdChvLFsiLTEiXSkpOm4oZSxbdF0sIi0xIil9ZnVuY3Rpb24gdXBkYXRlRWxlbWVudChlLHQpe3ZhciBuPXQuYXR0cnN8fHt9O2Zvcih2YXIgciBpbiBuKWUuc2V0QXR0cihyLG5bcl0sITApO3ZhciBpPXQuc3R5bGV8fHt9O2Zvcih2YXIgbyBpbiBpKWUuc2V0U3R5bGUobyxpW29dLCEwKX12YXIgRG9jdW1lbnQ9ZnVuY3Rpb24gZSh0LG4scil7dD10P3QudG9TdHJpbmcoKToiIix0aGlzLmlkPXQsdGhpcy5VUkw9bixhZGREb2ModCx0aGlzKSx0aGlzLm5vZGVNYXA9e307dmFyIGk9ZS5MaXN0ZW5lcnx8TGlzdGVuZXI7dGhpcy5saXN0ZW5lcj1uZXcgaSh0LHJ8fGNyZWF0ZUhhbmRsZXIodCxlLmhhbmRsZXIpKSx0aGlzLnRhc2tDZW50ZXI9bmV3IFRhc2tDZW50ZXIodCxyP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTtyZXR1cm4gci5hcHBseSh2b2lkIDAsdCl9OmUuaGFuZGxlciksdGhpcy5jcmVhdGVEb2N1bWVudEVsZW1lbnQoKX07RG9jdW1lbnQucHJvdG90eXBlLmdldFJlZj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ub2RlTWFwW2VdfSxEb2N1bWVudC5wcm90b3R5cGUub3Blbj1mdW5jdGlvbigpe3RoaXMubGlzdGVuZXIuYmF0Y2hlZD0hMX0sRG9jdW1lbnQucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5saXN0ZW5lci5iYXRjaGVkPSEwfSxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRFbGVtZW50PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztpZighdGhpcy5kb2N1bWVudEVsZW1lbnQpe3ZhciBlPW5ldyBFbGVtZW50KCJkb2N1bWVudCIpO2UuZG9jSWQ9dGhpcy5pZCxlLm93bmVyRG9jdW1lbnQ9dGhpcyxlLnJvbGU9ImRvY3VtZW50RWxlbWVudCIsZS5kZXB0aD0wLGUucmVmPSJfZG9jdW1lbnRFbGVtZW50Iix0aGlzLm5vZGVNYXAuX2RvY3VtZW50RWxlbWVudD1lLHRoaXMuZG9jdW1lbnRFbGVtZW50PWUsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImFwcGVuZENoaWxkIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oZSl7YXBwZW5kQm9keShuLGUpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJpbnNlcnRCZWZvcmUiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbihlLHQpe2FwcGVuZEJvZHkobixlLHQpfX0pLGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCdDcmVhdGUgZG9jdW1lbnQgZWxlbWVudCAoaWQ6ICInK2UuZG9jSWQrJyIsIHJlZjogIicrZS5yZWYrJyIpJyl9cmV0dXJuIHRoaXMuZG9jdW1lbnRFbGVtZW50fSxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlQm9keT1mdW5jdGlvbihlLHQpe2lmKCF0aGlzLmJvZHkpe3ZhciBuPW5ldyBFbGVtZW50KGUsdCk7c2V0Qm9keSh0aGlzLG4pLGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbY3JlYXRlQm9keV0oIit0aGlzLmlkKyIsIituLnR5cGUrIiwiK24ucmVmKyIpICgiK0pTT04uc3RyaW5naWZ5KG4udG9KU09OKCEwKSkrIikuIil9cmV0dXJuIHRoaXMuYm9keX0sRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgRWxlbWVudChlLHQpO3JldHVybiBjaGVja0xldmVsKCJkZWJ1ZyIpJiZkZWJ1Z0xvZygiW2NyZWF0ZUVsZW1lbnRdKCIrdGhpcy5pZCsiLCIrbi50eXBlKyIsIituLnJlZisiKSAoIitKU09OLnN0cmluZ2lmeShuLnRvSlNPTighMCkpKyIpLiIpLG59LERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVDb21tZW50PWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgQ29tbWVudChlKX0sRG9jdW1lbnQucHJvdG90eXBlLmZpcmVFdmVudD1mdW5jdGlvbihlLHQsbixyLGkpe2lmKGUpeyhuPW58fHt9KS50eXBlPW4udHlwZXx8dCxuLnRhcmdldD1lLG4uY3VycmVudFRhcmdldD1lLG4udGltZXN0YW1wPURhdGUubm93KCksciYmdXBkYXRlRWxlbWVudChlLHIpO3ZhciBvPSJ3ZWV4IiE9PXRoaXMuX18kY29tcGlsZXJfXyxhPXRoaXMuZ2V0UmVmKCJfcm9vdCIpO2lmKGEmJmEuYXR0cil7dmFyIHM9YS5hdHRyLmJ1YmJsZTtvPSJ0cnVlIj09PXN8fCEwPT09c3x8byYmdm9pZCAwPT09c31yZXR1cm4id2VleCIhPT10aGlzLl9fJGNvbXBpbGVyX18mJihuPXByb2Nlc3NFdmVudChuKSksZS5maXJlRXZlbnQodCxuLG8saSl9fSxEb2N1bWVudC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2NoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbZGVzdHJveV0oIit0aGlzLmlkKyIsZG9jdW1lbnQsIit0aGlzLnJlZisnKSBEZXN0cm95IGRvY3VtZW50IChpZDogIicrdGhpcy5pZCsnIiwgVVJMOiAiJyt0aGlzLlVSTCsnIiknKSx0aGlzLnRhc2tDZW50ZXIuZGVzdHJveUNhbGxiYWNrKCksZGVsZXRlIHRoaXMubGlzdGVuZXIsZGVsZXRlIHRoaXMubm9kZU1hcCxkZWxldGUgdGhpcy50YXNrQ2VudGVyLHJlbW92ZURvYyh0aGlzLmlkKX0sRG9jdW1lbnQuaGFuZGxlcj1udWxsO3ZhciBsZXg9e0lucHV0RWxlbWVudERpdjoiPFdoaXRlU3BhY2U+fDxMaW5lVGVybWluYXRvcj58PFJlc2VydmVkV29yZD58PElkZW50aWZpZXI+fDxOdW1lcmljTGl0ZXJhbD58PFB1bmN0dWF0b3I+fDxTdHJpbmdMaXRlcmFsPiIsSW5wdXRFbGVtZW50UmVnRXhwOiI8V2hpdGVTcGFjZT58PExpbmVUZXJtaW5hdG9yPnw8UmVzZXJ2ZWRXb3JkPnw8SWRlbnRpZmllcj58PE51bWVyaWNMaXRlcmFsPnw8UHVuY3R1YXRvcj58PFN0cmluZ0xpdGVyYWw+IixSZXNlcnZlZFdvcmQ6IjxLZXl3b3JkPnw8TnVsbExpdGVyYWw+fDxCb29sZWFuTGl0ZXJhbD4iLFdoaXRlU3BhY2U6L1tcdFx2XGZcdTAwMjBcdTAwQTBcdTE2ODBcdTE4MEVcdTIwMDAtXHUyMDBBXHUyMDJGXHUyMDVmXHUzMDAwXHVGRUZGXS8sTGluZVRlcm1pbmF0b3I6L1tcblxyXHUyMDI4XHUyMDI5XS8sS2V5d29yZDovbmV3KD8hW18kYS16QS1aMC05XSl8dm9pZCg/IVtfJGEtekEtWjAtOV0pfGRlbGV0ZSg/IVtfJGEtekEtWjAtOV0pfGluKD8hW18kYS16QS1aMC05XSl8aW5zdGFuY2VvZig/IVtfJGEtekEtWjAtOV0pfHR5cGVvZig/IVtfJGEtekEtWjAtOV0pLyxOdWxsTGl0ZXJhbDovbnVsbCg/IVtfJGEtekEtWjAtOV0pLyxCb29sZWFuTGl0ZXJhbDovKD86dHJ1ZXxmYWxzZSkoPyFbXyRhLXpBLVowLTldKS8sSWRlbnRpZmllcjovW18kYS16QS1aXVtfJGEtekEtWjAtOV0qLyxQdW5jdHVhdG9yOi9cL3w9PnxcKlwqfD4+Pj18Pj49fDw8PXw9PT18IT09fD4+Pnw8PHwlPXxcKj18LT18XCs9fDw9fD49fD09fCE9fFxePXxcfD18XHxcfHwmJnwmPXw+PnxcK1wrfC0tfFw6fH18XCp8JnxcfHxcXnwhfH58LXxcK3xcP3wlfD18Pnw8fCx8O3xcLig/IVswLTldKXxcXXxcW3xcKXxcKHx7LyxEaXZQdW5jdHVhdG9yOi9cLz18XC8vLE51bWVyaWNMaXRlcmFsOi8oPzowW3hYXVswLTlhLWZBLUZdKnxcLlswLTldK3woPzpbMS05XStbMC05XSp8MCkoPzpcLlswLTldKnxcLik/KSg/OltlRV1bKy1dezAsMX1bMC05XSspPyg/IVtfJGEtekEtWjAtOV0pLyxTdHJpbmdMaXRlcmFsOi8iKD86W14iXG5cXFxyXHUyMDI4XHUyMDI5XXxcXCg/OlsnIlxcYmZucnR2XG5cclx1MjAyOFx1MjAyOV18XHJcbil8XFx4WzAtOWEtZkEtRl17Mn18XFx1WzAtOWEtZkEtRl17NH18XFxbXjAtOXV4JyJcXGJmbnJ0dlxuXFxcclx1MjAyOFx1MjAyOV0pKiJ8Jyg/OlteJ1xuXFxcclx1MjAyOFx1MjAyOV18XFwoPzpbJyJcXGJmbnJ0dlxuXHJcdTIwMjhcdTIwMjldfFxyXG4pfFxceFswLTlhLWZBLUZdezJ9fFxcdVswLTlhLWZBLUZdezR9fFxcW14wLTl1eCciXFxiZm5ydHZcblxcXHJcdTIwMjhcdTIwMjldKSonLyxSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWw6L1wvKD86XFsoPzpcXFtcc1xTXXxbXlxdXSkqXF18W14qXC9cXFxuXHJcdTIwMjhcdTIwMjldfFxcW15cblxyXHUyMDI4XHUyMDI5XSkoPzpcWyg/OlxcW1xzXFNdfFteXF1dKSpcXXxbXlwvXFxcblxyXHUyMDI4XHUyMDI5XXxcXFteXG5cclx1MjAyOFx1MjAyOV0pKlwvWzAtOWEtekEtWl0qL307ZnVuY3Rpb24gWFJlZ0V4cChyLGUsaSl7dmFyIG89W2VdO3ZhciBhPWZ1bmN0aW9uIG4oZSl7dmFyIHQ9bmV3IFJlZ0V4cDtyZXR1cm4gdC5jb21waWxlKGUucmVwbGFjZSgvPChbXj5dKyk+L2csZnVuY3Rpb24oZSx0KXtyZXR1cm4gclt0XT8oby5wdXNoKHQpLHJbdF1pbnN0YW5jZW9mIFJlZ0V4cD8iKCIrclt0XS5zb3VyY2UrIikiOiIoIituKHJbdF0pLnNvdXJjZSsiKSIpOiIifSksaSksdH0ocltlXSk7dGhpcy5leGVjPWZ1bmN0aW9uKGUpe3ZhciB0PWEuZXhlYyhlKTtpZihudWxsPT10KXJldHVybiBudWxsO2Zvcih2YXIgbj1uZXcgU3RyaW5nKHRbMF0pLHI9MDtyPG8ubGVuZ3RoO3IrKyl0W3JdJiYobltvW3JdXT10W3JdKTtyZXR1cm4gbn0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImxhc3RJbmRleCIse2dldDpmdW5jdGlvbigpe3JldHVybiBhLmxhc3RJbmRleH0sc2V0OmZ1bmN0aW9uKGUpe2EubGFzdEluZGV4PWV9fSl9ZnVuY3Rpb24gTGV4aWNhbFBhcnNlcigpe3ZhciBpLG89bmV3IFhSZWdFeHAobGV4LCJJbnB1dEVsZW1lbnREaXYiLCJnIiksYT1uZXcgWFJlZ0V4cChsZXgsIklucHV0RWxlbWVudFJlZ0V4cCIsImciKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic291cmNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9LHNldDpmdW5jdGlvbihlKXtpPWUsby5sYXN0SW5kZXg9MCxhLmxhc3RJbmRleD0wfX0pLHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXtvLmxhc3RJbmRleD0wLGEubGFzdEluZGV4PTB9LHRoaXMuZ2V0TmV4dFRva2VuPWZ1bmN0aW9uKGUpe3ZhciB0LG49by5sYXN0SW5kZXgscj0odD1lP286YSkuZXhlYyhpKTtpZihyJiZ0Lmxhc3RJbmRleC1uPnIubGVuZ3RoKXRocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiBJTExFR0FMIik7cmV0dXJuIG8ubGFzdEluZGV4PXQubGFzdEluZGV4LGEubGFzdEluZGV4PXQubGFzdEluZGV4LHJ9fXZhciBydWxlcz17SWRlbnRpZmllck5hbWU6W1siSWRlbnRpZmllciJdXSxMaXRlcmFsOltbIk51bGxMaXRlcmFsIl0sWyJCb29sZWFuTGl0ZXJhbCJdLFsiTnVtZXJpY0xpdGVyYWwiXSxbIlN0cmluZ0xpdGVyYWwiXSxbIlJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbCJdXSxQcmltYXJ5RXhwcmVzc2lvbjpbWyJJZGVudGlmaWVyIl0sWyJMaXRlcmFsIl0sWyIoIiwiRXhwcmVzc2lvbiIsIikiXV0sQ2FsbEV4cHJlc3Npb246W1siUHJpbWFyeUV4cHJlc3Npb24iLCJBcmd1bWVudHMiXSxbIkNhbGxFeHByZXNzaW9uIiwiQXJndW1lbnRzIl1dLEFyZ3VtZW50czpbWyIoIiwiKSJdLFsiKCIsIkFyZ3VtZW50TGlzdCIsIikiXV0sQXJndW1lbnRMaXN0OltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiQXJndW1lbnRMaXN0IiwiLCIsIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdXSxMZWZ0SGFuZFNpZGVFeHByZXNzaW9uOltbIlByaW1hcnlFeHByZXNzaW9uIl0sWyJDYWxsRXhwcmVzc2lvbiJdXSxVbmFyeUV4cHJlc3Npb246W1siTGVmdEhhbmRTaWRlRXhwcmVzc2lvbiJdLFsidm9pZCIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiKyIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiLSIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsifiIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiISIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxFeHBvbmVudGlhdGlvbkV4cHJlc3Npb246W1siVW5hcnlFeHByZXNzaW9uIl0sWyJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iLCIqKiIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb246W1siTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIiwiLyIsIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiJdLFsiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIqIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIlIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl1dLEFkZGl0aXZlRXhwcmVzc2lvbjpbWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIisiLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIi0iLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXV0sU2hpZnRFeHByZXNzaW9uOltbIkFkZGl0aXZlRXhwcmVzc2lvbiJdLFsiU2hpZnRFeHByZXNzaW9uIiwiPDwiLCJBZGRpdGl2ZUV4cHJlc3Npb24iXSxbIlNoaWZ0RXhwcmVzc2lvbiIsIj4+IiwiQWRkaXRpdmVFeHByZXNzaW9uIl0sWyJTaGlmdEV4cHJlc3Npb24iLCI+Pj4iLCJBZGRpdGl2ZUV4cHJlc3Npb24iXV0sUmVsYXRpb25hbEV4cHJlc3Npb246W1siU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsIjwiLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiPiIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI8PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI+PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCJpbnN0YW5jZW9mIiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsImluIiwiU2hpZnRFeHByZXNzaW9uIl1dLEVxdWFsaXR5RXhwcmVzc2lvbjpbWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiIT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT09IiwiUmVsYXRpb25hbEV4cHJlc3Npb24iXSxbIkVxdWFsaXR5RXhwcmVzc2lvbiIsIiE9PSIsIlJlbGF0aW9uYWxFeHByZXNzaW9uIl1dLEJpdHdpc2VBTkRFeHByZXNzaW9uOltbIkVxdWFsaXR5RXhwcmVzc2lvbiJdLFsiQml0d2lzZUFOREV4cHJlc3Npb24iLCImIiwiRXF1YWxpdHlFeHByZXNzaW9uIl1dLEJpdHdpc2VYT1JFeHByZXNzaW9uOltbIkJpdHdpc2VBTkRFeHByZXNzaW9uIl0sWyJCaXR3aXNlWE9SRXhwcmVzc2lvbiIsIl4iLCJCaXR3aXNlQU5ERXhwcmVzc2lvbiJdXSxCaXR3aXNlT1JFeHByZXNzaW9uOltbIkJpdHdpc2VYT1JFeHByZXNzaW9uIl0sWyJCaXR3aXNlT1JFeHByZXNzaW9uIiwifCIsIkJpdHdpc2VYT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxBTkRFeHByZXNzaW9uOltbIkJpdHdpc2VPUkV4cHJlc3Npb24iXSxbIkxvZ2ljYWxBTkRFeHByZXNzaW9uIiwiJiYiLCJCaXR3aXNlT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxPUkV4cHJlc3Npb246W1siTG9naWNhbEFOREV4cHJlc3Npb24iXSxbIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCJ8fCIsIkxvZ2ljYWxBTkRFeHByZXNzaW9uIl1dLENvbmRpdGlvbmFsRXhwcmVzc2lvbjpbWyJMb2dpY2FsT1JFeHByZXNzaW9uIl0sWyJMb2dpY2FsT1JFeHByZXNzaW9uIiwiPyIsIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCI6IiwiTG9naWNhbE9SRXhwcmVzc2lvbiJdXSxFeHByZXNzaW9uOltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXhwcmVzc2lvbiIsIiwiLCJDb25kaXRpb25hbEV4cHJlc3Npb24iXV0sUHJvZ3JhbTpbWyJFeHByZXNzaW9uIl1dfTtmdW5jdGlvbiBTeW1ib2wkMShlLHQpe3RoaXMubmFtZT1lLHRoaXMudG9rZW49dCx0aGlzLmNoaWxkTm9kZXM9W10sdGhpcy50b1N0cmluZz1mdW5jdGlvbihlKXtpZihlfHwoZT0iIiksMT09dGhpcy5jaGlsZE5vZGVzLmxlbmd0aClyZXR1cm4gdGhpcy5jaGlsZE5vZGVzWzBdLnRvU3RyaW5nKGUpO2Zvcih2YXIgdD1lK3RoaXMubmFtZSsobnVsbCE9dGhpcy50b2tlbiYmdGhpcy5uYW1lIT10aGlzLnRva2VuPyI6Iit0aGlzLnRva2VuOiIiKSsiXG4iLG49MDtuPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7bisrKXQrPXRoaXMuY2hpbGROb2Rlc1tuXS50b1N0cmluZyhlKyIgICAgIik7cmV0dXJuIHR9fWZ1bmN0aW9uIFN5bnRhY3RpY2FsUGFyc2VyKCl7dmFyIGU9e1Byb2dyYW06IiQifSxvPXt9OyFmdW5jdGlvbiBlKG4pe29bSlNPTi5zdHJpbmdpZnkobildPW47Zm9yKHZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG4pO3IubGVuZ3RoOyl7dmFyIGk9ci5zaGlmdCgpO3J1bGVzW2ldJiZydWxlc1tpXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZVswXV18fHIucHVzaChlWzBdKTt2YXIgdD1uO2UuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdfHwodFtlXT17fSksdD10W2VdfSksbltpXS4kZGl2JiYodC4kZGl2PSEwKSx0LiRyZWR1Y2U9aSx0LiRjb3VudD1lLmxlbmd0aH0pfWZvcih2YXIgdCBpbiBuKSJvYmplY3QiIT10eXBlb2Ygblt0XXx8IiQiPT10LmNoYXJBdCgwKXx8blt0XS4kY2xvc3VyZXx8KG9bSlNPTi5zdHJpbmdpZnkoblt0XSldP25bdF09b1tKU09OLnN0cmluZ2lmeShuW3RdKV06ZShuW3RdKSk7bi4kY2xvc3VyZT0hMH0oZSk7dmFyIGk9W10sYT1bZV0scz1lO3RoaXMuaW5zZXJ0U3ltYm9sPWZ1bmN0aW9uKGUsdCl7Zm9yKDshc1tlLm5hbWVdJiZzLiRyZWR1Y2U7KXtmb3IodmFyIG49cy4kY291bnQscj1uZXcgU3ltYm9sJDEocy4kcmVkdWNlKTtuLS07KXIuY2hpbGROb2Rlcy5wdXNoKGkucG9wKCkpLGEucG9wKCk7cz1hW2EubGVuZ3RoLTFdLHRoaXMuaW5zZXJ0U3ltYm9sKHIpfWlmKHM9c1tlLm5hbWVdLGkucHVzaChlKSxhLnB1c2gocyksIXMpdGhyb3cgbmV3IEVycm9yO3JldHVybiBzLiRkaXZ9LHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXtpPVtdLGE9W3M9ZV19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJncmFtbWFyVHJlZSIse2dldDpmdW5jdGlvbigpe3RyeXtmb3IoO3MuJHJlZHVjZTspe2Zvcih2YXIgZT1zLiRjb3VudCx0PW5ldyBTeW1ib2wkMShzLiRyZWR1Y2UpO2UtLTspdC5jaGlsZE5vZGVzLnB1c2goaS5wb3AoKSksYS5wb3AoKTtzPWFbYS5sZW5ndGgtMV0sdGhpcy5pbnNlcnRTeW1ib2wodCl9aWYoMDxpLmxlbmd0aCYmc1siOyJdKXJldHVybiB0aGlzLmluc2VydFN5bWJvbChuZXcgU3ltYm9sJDEoIjsiLCI7IikpLHRoaXMuZ3JhbW1hclRyZWU7aWYoMSE9aS5sZW5ndGh8fCJQcm9ncmFtIiE9aVswXS5uYW1lKXRocm93IG5ldyBFcnJvcn1jYXRjaChlKXt0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iil9cmV0dXJuIGlbMF19fSl9ZnVuY3Rpb24gUGFyc2VyKCl7dGhpcy5sZXhpY2FsUGFyc2VyPW5ldyBMZXhpY2FsUGFyc2VyLHRoaXMuc3ludGFjdGljYWxQYXJzZXI9bmV3IFN5bnRhY3RpY2FsUGFyc2VyO3ZhciBhPXt9O1siTnVsbExpdGVyYWwiLCJCb29sZWFuTGl0ZXJhbCIsIk51bWVyaWNMaXRlcmFsIiwiU3RyaW5nTGl0ZXJhbCIsIlJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbCIsIklkZW50aWZpZXIiLCIqKiIsIj0+IiwieyIsIn0iLCIoIiwiKSIsIlsiLCJdIiwiLiIsIjsiLCIsIiwiPCIsIj4iLCI8PSIsIj49IiwiPT0iLCIhPSIsIj09PSIsIiE9PSIsIisiLCItIiwiKiIsIiUiLCIrKyIsIi0tIiwiPDwiLCI+PiIsIj4+PiIsIiYiLCJ8IiwiXiIsIiEiLCJ+IiwiJiYiLCJ8fCIsIj8iLCI6IiwiPSIsIis9IiwiLT0iLCIqPSIsIiU9IiwiPDw9IiwiPj49IiwiPj4+PSIsIiY9IiwifD0iLCJePSIsIi8iLCIvPSIsImluc3RhbmNlb2YiLCJ0eXBlb2YiLCJuZXciLCJ2b2lkIiwiZGVidWdnZXIiLCJ0aGlzIiwiZGVsZXRlIiwiaW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGUse30pfSksdGhpcy5yZXNldD1mdW5jdGlvbigpe3RoaXMubGV4aWNhbFBhcnNlci5yZXNldCgpLHRoaXMuc3ludGFjdGljYWxQYXJzZXIucmVzZXQoKX0sdGhpcy5wYXJzZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9dGhpcyxpPSExO3RoaXMubGV4aWNhbFBhcnNlci5zb3VyY2U9ZTtmb3IodmFyIG89ITE7bj10aGlzLmxleGljYWxQYXJzZXIuZ2V0TmV4dFRva2VuKG8pOyl7dCYmdChuKTt0cnl7aWYoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobikuc29tZShmdW5jdGlvbihlKXtyZXR1cm4hIWEuaGFzT3duUHJvcGVydHkoZSkmJihvPXIuc3ludGFjdGljYWxQYXJzZXIuaW5zZXJ0U3ltYm9sKG5ldyBTeW1ib2wkMShlLG4pLGkpLCEoaT0hMSkpfSkpY29udGludWU7KG4uS2V5d29yZHx8bi5QdW5jdHVhdG9yfHxuLkRpdlB1bmN0dWF0b3IpJiZhLmhhc093blByb3BlcnR5KG4udG9TdHJpbmcoKSkmJihvPXIuc3ludGFjdGljYWxQYXJzZXIuaW5zZXJ0U3ltYm9sKG5ldyBTeW1ib2wkMShuLnRvU3RyaW5nKCksbiksaSkpfWNhdGNoKGUpe3Rocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiAiK24pfX1yZXR1cm4gdGhpcy5zeW50YWN0aWNhbFBhcnNlci5ncmFtbWFyVHJlZX19dmFyIHBhcnNlcj1uZXcgUGFyc2VyO2Z1bmN0aW9uIEphdmFTY3JpcHRFeHByZXNzaW9uKHRleHQpe3BhcnNlci5yZXNldCgpLHRoaXMudHJlZT1wYXJzZXIucGFyc2UodGV4dCksdGhpcy5wYXRocz1bXTt2YXIgY29udGV4dD1PYmplY3QuY3JlYXRlKG51bGwpLG1lPXRoaXMscGF0aEluZGV4PU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gY2hlY2tTaW1wbGUoZSl7Zm9yKHZhciB0PWU7dC5jaGlsZE5vZGVzLmxlbmd0aDw9MSYmIk1lbWJlckV4cHJlc3Npb24iIT09dC5uYW1lOyl0PXQuY2hpbGROb2Rlc1swXTsiTWVtYmVyRXhwcmVzc2lvbiI9PT10Lm5hbWU/bWUuaXNTaW1wbGU9ITA6bWUuaXNTaW1wbGU9ITF9ZnVuY3Rpb24gd2FsayhlKXtpZigiQ2FsbEV4cHJlc3Npb24iPT09ZS5uYW1lJiYiQ2FsbEV4cHJlc3Npb24iIT09ZS5jaGlsZE5vZGVzW2UuY2hpbGROb2Rlcy5sZW5ndGgtMV0ubmFtZSl7Z2V0UGF0aChlLmNoaWxkTm9kZXNbMV0pO3dhbGsoZS5jaGlsZE5vZGVzWzBdKX1lbHNlIGlmKCJOZXdFeHByZXNzaW9uIj09PWUubmFtZSYmMT09PWUuY2hpbGROb2Rlcy5sZW5ndGgpZ2V0UGF0aChlLmNoaWxkTm9kZXNbMF0pO2Vsc2UgaWYoIk1lbWJlckV4cHJlc3Npb24iPT09ZS5uYW1lJiYxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aClnZXRQYXRoKGUpO2Vsc2UgZm9yKHZhciB0PTA7dDxlLmNoaWxkTm9kZXMubGVuZ3RoO3QrKyl3YWxrKGUuY2hpbGROb2Rlc1t0XSl9ZnVuY3Rpb24gZ2V0UGF0aChlKXt2YXIgdDtpZigiSWRlbnRpZmllck5hbWUiPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuKHQ9Z2V0UGF0aChlLmNoaWxkTm9kZXNbMl0pKSYmKHQ9dC5jb25jYXQoZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udG9rZW4udG9TdHJpbmcoKSkpLGNyZWF0ZVBhdGgodCksdDtpZigiUHJpbWFyeUV4cHJlc3Npb24iPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuIklkZW50aWZpZXIiPT09ZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0ubmFtZT8oY3JlYXRlUGF0aCh0PVtlLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS50b2tlbi50b1N0cmluZygpXSksdCk6bnVsbDtpZigiXSI9PT1lLmNoaWxkTm9kZXNbMF0ubmFtZSlyZXR1cm4gZ2V0UGF0aChlLmNoaWxkTm9kZXNbM10pLHdhbGsoZS5jaGlsZE5vZGVzWzFdKSxudWxsO2lmKCJBcmd1bWVudHMiPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuIHdhbGsoZS5jaGlsZE5vZGVzWzBdKSx3YWxrKGUuY2hpbGROb2Rlc1sxXSksbnVsbDtmb3IodmFyIG49MDtuPGUuY2hpbGROb2Rlcy5sZW5ndGg7bisrKXdhbGsoZS5jaGlsZE5vZGVzW25dKX1mdW5jdGlvbiBjcmVhdGVQYXRoKGUpe2Zvcih2YXIgdD1jb250ZXh0LG49MDtuPGUubGVuZ3RoLTE7bisrKXRbZVtuXV18fCh0W2Vbbl1dPU9iamVjdC5jcmVhdGUobnVsbCkpLHQ9dFtlW25dXTttZS5wYXRocy5wdXNoKGUpLHBhdGhJbmRleFtlLmpvaW4oIi4iKV09ITF9dGhpcy5pc1NpbXBsZSx0aGlzLmlzQ29uc3Qsd2Fsayh0aGlzLnRyZWUpLGNoZWNrU2ltcGxlKHRoaXMudHJlZSksMD09PXRoaXMucGF0aHMubGVuZ3RoJiYodGhpcy5pc0NvbnN0PSEwKSx0aGlzLnNldHRlcj1mdW5jdGlvbih0KXtmb3IodmFyIG49Y29udGV4dCxyPTA7cjx0Lmxlbmd0aC0xO3IrKyluW3Rbcl1dfHwoblt0W3JdXT1PYmplY3QuY3JlYXRlKG51bGwpKSxuPW5bdFtyXV07cmV0dXJue2lzQ29tcGxldGVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHBhdGhJbmRleClpZighcGF0aEluZGV4W2VdKXJldHVybiExO3JldHVybiEwfSxzZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHBhdGhJbmRleFt0LmpvaW4oIi4iKV18fChwYXRoSW5kZXhbdC5qb2luKCIuIildPSEwKSxuW3Rbcl1dPWUsdGhpcy5pc0NvbXBsZXRlZCgpP21lLmV4ZWMoKTp2b2lkIDB9fX0sdGhpcy52YWx1ZU9mPXRoaXMuZXhlYz1mdW5jdGlvbigpe3RyeXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZXZhbCh0ZXh0KX0uY2FsbChjb250ZXh0KX1jYXRjaChlKXt9fX1mdW5jdGlvbiB2aXNpdCh0KXt2YXIgZSxuPXQuY2hpbGROb2Rlcy5zbGljZSgpLnJldmVyc2UoKSxyPW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnRva2VufHwhZS50b2tlbi5QdW5jdHVhdG9yfSk7aWYoIlVuYXJ5RXhwcmVzc2lvbiI9PT10Lm5hbWUmJigyPT09bi5sZW5ndGgmJiItIj09PW5bMF0ubmFtZSYmMT09PXIubGVuZ3RoKSlyZXR1cm4oZT12aXNpdChyWzBdKSkudmFsdWU9LWUudmFsdWUsZTtpZigiQXJndW1lbnRzIj09PXQubmFtZSl7Zm9yKHZhciBpPVtdLG89clswXTtvOykzPT09by5jaGlsZE5vZGVzLmxlbmd0aCYmKGkudW5zaGlmdChvLmNoaWxkTm9kZXNbMF0pLG89by5jaGlsZE5vZGVzWzJdKSwxPT09by5jaGlsZE5vZGVzLmxlbmd0aCYmKGkudW5zaGlmdChvLmNoaWxkTm9kZXNbMF0pLG89bnVsbCk7cmV0dXJue3R5cGU6IkFyZ3VtZW50cyIsY2hpbGRyZW46aS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHZpc2l0KGUpfSl9fWlmKHImJjE9PT1yLmxlbmd0aClyZXR1cm4gZT12aXNpdChyWzBdKTtpZih0LnRva2VuJiZbIk51bGxMaXRlcmFsIiwiQm9vbGVhbkxpdGVyYWwiLCJOdW1lcmljTGl0ZXJhbCIsIlN0cmluZ0xpdGVyYWwiLCJJZGVudGlmaWVyIl0uc29tZShmdW5jdGlvbihlKXtyZXR1cm4gdC50b2tlbltlXX0pKXt2YXIgYT1PYmplY3Qua2V5cyh0LnRva2VuKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF0Y2goL0xpdGVyYWwvKXx8ZS5tYXRjaCgvSWRlbnRpZmllci8pfSlbMF07cmV0dXJue3R5cGU6YSx2YWx1ZTp7TnVsbExpdGVyYWw6bnVsbCxCb29sZWFuTGl0ZXJhbDpCb29sZWFuKHQudG9rZW4pLE51bWVyaWNMaXRlcmFsOk51bWJlcih0LnRva2VuKSxTdHJpbmdMaXRlcmFsOnQudG9rZW4sSWRlbnRpZmllcjp0LnRva2VufVthXX19cmV0dXJuIkNhbGxFeHByZXNzaW9uIj09PXQubmFtZT97dHlwZToiQ2FsbEV4cHJlc3Npb24iLGNoaWxkcmVuOlt2aXNpdChuWzBdKSx2aXNpdChuWzFdKV19Ont0eXBlOm4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRva2VuJiZlLnRva2VuLlB1bmN0dWF0b3J9KVswXS5uYW1lLGNoaWxkcmVuOm4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnRva2VufHwhZS50b2tlbi5QdW5jdHVhdG9yfSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB2aXNpdChlKX0pfX1mdW5jdGlvbiBwYXJzZShlKXt2YXIgdD1uZXcgSmF2YVNjcmlwdEV4cHJlc3Npb24oZSk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHZpc2l0KHQudHJlZSksbnVsbCl9dmFyIG9sZENhbGxVcGRhdGVTdHlsZT1nbG9iYWwuY2FsbFVwZGF0ZVN0eWxlO2Z1bmN0aW9uIGlzQmluZE1ldGhvZChlLHQpe3JldHVybigiYmluZGluZ3giPT09ZXx8ImJpbmRpbmciPT09ZSkmJiJiaW5kIj09PXR9ZnVuY3Rpb24gZm9ybWF0RXhwcmVzc2lvbihlKXtpZih2b2lkIDAhPT1lKXt0cnl7ZT1KU09OLnBhcnNlKGUpfWNhdGNoKGUpe312YXIgdD17fTtpZigic3RyaW5nIj09dHlwZW9mIGU/dC5vcmlnaW49ZTplJiYodC5vcmlnaW49ZS5vcmlnaW4sdC50cmFuc2Zvcm1lZD1lLnRyYW5zZm9ybWVkKSx0LnRyYW5zZm9ybWVkfHx0Lm9yaWdpbilyZXR1cm4gdC50cmFuc2Zvcm1lZD10LnRyYW5zZm9ybWVkfHxwYXJzZSh0Lm9yaWdpbiksdH19ZnVuY3Rpb24gZm9ybWF0RXhwcmVzc2lvbnMoZSl7cmV0dXJuIGUmJihlLmV4aXRFeHByZXNzaW9uPWZvcm1hdEV4cHJlc3Npb24oZS5leGl0RXhwcmVzc2lvbiksZS5wcm9wcyYmZS5wcm9wcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZXhwcmVzc2lvbj1mb3JtYXRFeHByZXNzaW9uKGUuZXhwcmVzc2lvbil9KSksZX1mdW5jdGlvbiBmaXhDYWxsYmFjayh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSYmKGU9e30pLCJmdW5jdGlvbiI9PXR5cGVvZiB0KXJldHVybiB0KHtzdGF0ZToiZW5kIj09PWUuc3RhdGU/ImV4aXQiOmUuc3RhdGUsdDp2b2lkIDAhPT1lLnQ/ZS50OmUuZGVsdGFUfSl9fWZ1bmN0aW9uIGhhbmRsZU1vZHVsZUdldHRlcihlLHQsbil7cmV0dXJuIGlzQmluZE1ldGhvZChlLHQpP2Z1bmN0aW9uKGUsdCl7aWYodm9pZCAwPT09dCYmKHQ9ZnVuY3Rpb24oKXt9KSwhZSl0aHJvdyBuZXcgRXJyb3IoInNob3VsZCBwYXNzIG9wdGlvbnMgZm9yIGJpbmRpbmciKTtyZXR1cm4gZm9ybWF0RXhwcmVzc2lvbnMoZSksbihlLGUmJiJ0aW1pbmciPT09ZS5ldmVudFR5cGU/Zml4Q2FsbGJhY2sodCk6dCl9Om59ZnVuY3Rpb24gc2V0SWQoZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiW1tDdXJyZW50SW5zdGFuY2VJZF1dIix7dmFsdWU6dH0pfWZ1bmN0aW9uIGdldElkKGUpe3JldHVybiBlWyJbW0N1cnJlbnRJbnN0YW5jZUlkXV0iXX1mdW5jdGlvbiBtb2R1bGVHZXR0ZXIoZSxuLHIpe3ZhciBpPWdldFRhc2tDZW50ZXIoZSk7cmV0dXJuIGkmJiJmdW5jdGlvbiI9PXR5cGVvZiBpLnNlbmQ/ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIGkuc2VuZCgibW9kdWxlIix7bW9kdWxlOm4sbWV0aG9kOnJ9LGUpfTooY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGZpbmQgdGFza0NlbnRlciAoIitlKyIpLiIpLG51bGwpfWZ1bmN0aW9uIG1vZHVsZVNldHRlcihlLHQsbixyKXt2YXIgaT1nZXRUYXNrQ2VudGVyKGUpO3JldHVybiBpJiYiZnVuY3Rpb24iPT10eXBlb2YgaS5zZW5kPyJmdW5jdGlvbiIhPXR5cGVvZiByPyhjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSAiK3QrIi4iK24rIiBtdXN0IGJlIGFzc2lnbmVkIGFzIGEgZnVuY3Rpb24uIiksbnVsbCk6ZnVuY3Rpb24oZSl7cmV0dXJuIGkuc2VuZCgibW9kdWxlIix7bW9kdWxlOnQsbWV0aG9kOm59LFtlXSl9Oihjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gZmluZCB0YXNrQ2VudGVyICgiK2UrIikuIiksbnVsbCl9Z2xvYmFsLmNhbGxVcGRhdGVTdHlsZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoLTE7MDxuLS07KXRbbl09YXJndW1lbnRzW24rMV07cmV0dXJuIHRbMV0mJih0WzFdPW5vcm1hbGl6ZVVuaXQodFsxXSkpLG9sZENhbGxVcGRhdGVTdHlsZS5hcHBseSh2b2lkIDAsW2VdLmNvbmNhdCh0KSl9O3ZhciBXZWV4SW5zdGFuY2U9ZnVuY3Rpb24oZSx0LG4pe3NldElkKHRoaXMsU3RyaW5nKGUpKSx0aGlzLmNvbmZpZz10fHx7fSx0aGlzLl9uYXRpdmVEYXRhPW58fHt9LHRoaXMuZG9jdW1lbnQ9bmV3IERvY3VtZW50KGUsdGhpcy5jb25maWcuYnVuZGxlVXJsKSx0aGlzLnJlcXVpcmVNb2R1bGU9dGhpcy5yZXF1aXJlTW9kdWxlLmJpbmQodGhpcyksdGhpcy5pbXBvcnRTY3JpcHQ9dGhpcy5pbXBvcnRTY3JpcHQuYmluZCh0aGlzKSx0aGlzLmlzUmVnaXN0ZXJlZE1vZHVsZT1pc1JlZ2lzdGVyZWRNb2R1bGUsdGhpcy5pc1JlZ2lzdGVyZWRDb21wb25lbnQ9aXNSZWdpc3RlcmVkQ29tcG9uZW50fSxvbGRHZXRMb2NhdGlvbixfX3Z1ZVBsdWdpbixfX2RlZmluZVBhZ2UsX19yZWdpc3RlckFwcCxfX3JlZ2lzdGVyUGFnZSx1bmksZ2V0QXBwLGdldEN1cnJlbnRQYWdlcyxVbmlTZXJ2aWNlSlNCcmlkZ2U7ZnVuY3Rpb24gY3JlYXRlU2VydmljZUNvbnRleHQodWcsbGcsZGcsZmcsZSl7dmFyIHBnPWUuc2V0VGltZW91dCxoZz1lLmNsZWFyVGltZW91dCx2Zz1lLnNldEludGVydmFsLGdnPWUuY2xlYXJJbnRlcnZhbCxtZz1lLl9fdW5pQ29uZmlnLHlnPWUuX191bmlSb3V0ZXMsdD1mdW5jdGlvbigpe3ZhciBlLGksdD1bImJhc2U2NFRvQXJyYXlCdWZmZXIiLCJhcnJheUJ1ZmZlclRvQmFzZTY0IiwiYWRkSW50ZXJjZXB0b3IiLCJyZW1vdmVJbnRlcmNlcHRvciIsImludGVyY2VwdG9ycyJdLmNvbmNhdChbInJlcXVlc3QiLCJ1cGxvYWRGaWxlIiwiZG93bmxvYWRGaWxlIiwiY29ubmVjdFNvY2tldCIsIm9uU29ja2V0T3BlbiIsIm9uU29ja2V0RXJyb3IiLCJzZW5kU29ja2V0TWVzc2FnZSIsIm9uU29ja2V0TWVzc2FnZSIsImNsb3NlU29ja2V0Iiwib25Tb2NrZXRDbG9zZSIsImdldFVwZGF0ZU1hbmFnZXIiLCJjb25maWdNVExTIl0sWyJuYXZpZ2F0ZVRvIiwicmVkaXJlY3RUbyIsInJlTGF1bmNoIiwic3dpdGNoVGFiIiwibmF2aWdhdGVCYWNrIl0sWyJzZXRTdG9yYWdlIiwic2V0U3RvcmFnZVN5bmMiLCJnZXRTdG9yYWdlIiwiZ2V0U3RvcmFnZVN5bmMiLCJnZXRTdG9yYWdlSW5mbyIsImdldFN0b3JhZ2VJbmZvU3luYyIsInJlbW92ZVN0b3JhZ2UiLCJyZW1vdmVTdG9yYWdlU3luYyIsImNsZWFyU3RvcmFnZSIsImNsZWFyU3RvcmFnZVN5bmMiXSxbImdldExvY2F0aW9uIiwiY2hvb3NlTG9jYXRpb24iLCJvcGVuTG9jYXRpb24iLCJjcmVhdGVNYXBDb250ZXh0Iiwib25Mb2NhdGlvbkNoYW5nZSIsIm9uTG9jYXRpb25DaGFuZ2VFcnJvciIsInN0YXJ0TG9jYXRpb25VcGRhdGUiLCJzdG9wTG9jYXRpb25VcGRhdGUiLCJvZmZMb2NhdGlvbkNoYW5nZSIsIm9mZkxvY2F0aW9uQ2hhbmdlRXJyb3IiXSxbImNob29zZUltYWdlIiwiY2hvb3NlRmlsZSIsInByZXZpZXdJbWFnZSIsImNsb3NlUHJldmlld0ltYWdlIiwiZ2V0SW1hZ2VJbmZvIiwiZ2V0VmlkZW9JbmZvIiwic2F2ZUltYWdlVG9QaG90b3NBbGJ1bSIsImNvbXByZXNzSW1hZ2UiLCJjb21wcmVzc1ZpZGVvIiwiZ2V0UmVjb3JkZXJNYW5hZ2VyIiwiZ2V0QmFja2dyb3VuZEF1ZGlvTWFuYWdlciIsImNyZWF0ZUF1ZGlvQ29udGV4dCIsImNyZWF0ZUlubmVyQXVkaW9Db250ZXh0IiwiY2hvb3NlVmlkZW8iLCJzYXZlVmlkZW9Ub1Bob3Rvc0FsYnVtIiwiY3JlYXRlVmlkZW9Db250ZXh0IiwiY3JlYXRlQ2FtZXJhQ29udGV4dCIsImNyZWF0ZUxpdmVQbGF5ZXJDb250ZXh0IiwiY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQiXSxbImdldFN5c3RlbUluZm8iLCJnZXRTeXN0ZW1JbmZvU3luYyIsImdldFdpbmRvd0luZm8iLCJnZXREZXZpY2VJbmZvIiwiZ2V0QXBwQmFzZUluZm8iLCJjYW5JVXNlIiwib25NZW1vcnlXYXJuaW5nIiwiZ2V0TmV0d29ya1R5cGUiLCJvbk5ldHdvcmtTdGF0dXNDaGFuZ2UiLCJvZmZOZXR3b3JrU3RhdHVzQ2hhbmdlIiwib25BY2NlbGVyb21ldGVyQ2hhbmdlIiwib2ZmQWNjZWxlcm9tZXRlckNoYW5nZSIsInN0YXJ0QWNjZWxlcm9tZXRlciIsInN0b3BBY2NlbGVyb21ldGVyIiwib25Db21wYXNzQ2hhbmdlIiwib2ZmQ29tcGFzc0NoYW5nZSIsInN0YXJ0Q29tcGFzcyIsInN0b3BDb21wYXNzIiwib25HeXJvc2NvcGVDaGFuZ2UiLCJzdGFydEd5cm9zY29wZSIsInN0b3BHeXJvc2NvcGUiLCJtYWtlUGhvbmVDYWxsIiwic2NhbkNvZGUiLCJzZXRDbGlwYm9hcmREYXRhIiwiZ2V0Q2xpcGJvYXJkRGF0YSIsInNldFNjcmVlbkJyaWdodG5lc3MiLCJnZXRTY3JlZW5CcmlnaHRuZXNzIiwic2V0S2VlcFNjcmVlbk9uIiwib25Vc2VyQ2FwdHVyZVNjcmVlbiIsInZpYnJhdGVMb25nIiwidmlicmF0ZVNob3J0IiwiYWRkUGhvbmVDb250YWN0Iiwib3BlbkJsdWV0b290aEFkYXB0ZXIiLCJzdGFydEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkiLCJvbkJsdWV0b290aERldmljZUZvdW5kIiwic3RvcEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkiLCJvbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZSIsImdldENvbm5lY3RlZEJsdWV0b290aERldmljZXMiLCJnZXRCbHVldG9vdGhEZXZpY2VzIiwiZ2V0Qmx1ZXRvb3RoQWRhcHRlclN0YXRlIiwiY2xvc2VCbHVldG9vdGhBZGFwdGVyIiwid3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlIiwicmVhZEJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLCJvbkJMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSIsIm9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsIm5vdGlmeUJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UiLCJnZXRCTEVEZXZpY2VTZXJ2aWNlcyIsImdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcyIsImNyZWF0ZUJMRUNvbm5lY3Rpb24iLCJjbG9zZUJMRUNvbm5lY3Rpb24iLCJzZXRCTEVNVFUiLCJnZXRCTEVEZXZpY2VSU1NJIiwib25CZWFjb25TZXJ2aWNlQ2hhbmdlIiwib25CZWFjb25VcGRhdGUiLCJnZXRCZWFjb25zIiwic3RhcnRCZWFjb25EaXNjb3ZlcnkiLCJzdG9wQmVhY29uRGlzY292ZXJ5IiwiY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uIiwiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZSIsInN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbiIsIm9uVGhlbWVDaGFuZ2UiLCJvZmZUaGVtZUNoYW5nZSIsIm9uVUlTdHlsZUNoYW5nZSIsImdldFN5c3RlbVNldHRpbmciLCJnZXRBcHBBdXRob3JpemVTZXR0aW5nIiwib3BlbkFwcEF1dGhvcml6ZVNldHRpbmciXSxbImhpZGVLZXlib2FyZCIsIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLCJvZmZLZXlib2FyZEhlaWdodENoYW5nZSIsImdldFNlbGVjdGVkVGV4dFJhbmdlIl0sWyJzaG93VG9hc3QiLCJoaWRlVG9hc3QiLCJzaG93TG9hZGluZyIsImhpZGVMb2FkaW5nIiwic2hvd01vZGFsIiwic2hvd0FjdGlvblNoZWV0Iiwic2V0TmF2aWdhdGlvbkJhclRpdGxlIiwic2V0TmF2aWdhdGlvbkJhckNvbG9yIiwic2hvd05hdmlnYXRpb25CYXJMb2FkaW5nIiwiaGlkZU5hdmlnYXRpb25CYXJMb2FkaW5nIiwic2V0VGFiQmFySXRlbSIsInNldFRhYkJhclN0eWxlIiwiaGlkZVRhYkJhciIsInNob3dUYWJCYXIiLCJzZXRUYWJCYXJCYWRnZSIsInJlbW92ZVRhYkJhckJhZGdlIiwic2hvd1RhYkJhclJlZERvdCIsImhpZGVUYWJCYXJSZWREb3QiLCJvblRhYkJhck1pZEJ1dHRvblRhcCIsInNldEJhY2tncm91bmRDb2xvciIsInNldEJhY2tncm91bmRUZXh0U3R5bGUiLCJjcmVhdGVBbmltYXRpb24iLCJwYWdlU2Nyb2xsVG8iLCJvbldpbmRvd1Jlc2l6ZSIsIm9mZldpbmRvd1Jlc2l6ZSIsImxvYWRGb250RmFjZSIsInN0YXJ0UHVsbERvd25SZWZyZXNoIiwic3RvcFB1bGxEb3duUmVmcmVzaCIsImNyZWF0ZVNlbGVjdG9yUXVlcnkiLCJjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlciIsImNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlciIsImdldE1lbnVCdXR0b25Cb3VuZGluZ0NsaWVudFJlY3QiLCJzaG93VG9wV2luZG93Iiwic2hvd0xlZnRXaW5kb3ciLCJzaG93UmlnaHRXaW5kb3ciLCJoaWRlVG9wV2luZG93IiwiaGlkZUxlZnRXaW5kb3ciLCJoaWRlUmlnaHRXaW5kb3ciLCJnZXRUb3BXaW5kb3dTdHlsZSIsImdldExlZnRXaW5kb3dTdHlsZSIsImdldFJpZ2h0V2luZG93U3R5bGUiLCJzZXRUb3BXaW5kb3dTdHlsZSIsInNldExlZnRXaW5kb3dTdHlsZSIsInNldFJpZ2h0V2luZG93U3R5bGUiLCJnZXRMb2NhbGUiLCJzZXRMb2NhbGUiLCJvbkxvY2FsZUNoYW5nZSJdLFsiJGVtaXQiLCIkb24iLCIkb25jZSIsIiRvZmYiXSxbInNhdmVGaWxlIiwiZ2V0U2F2ZWRGaWxlTGlzdCIsImdldFNhdmVkRmlsZUluZm8iLCJyZW1vdmVTYXZlZEZpbGUiLCJnZXRGaWxlSW5mbyIsIm9wZW5Eb2N1bWVudCIsImdldEZpbGVTeXN0ZW1NYW5hZ2VyIl0sWyJjcmVhdGVPZmZzY3JlZW5DYW52YXMiLCJjcmVhdGVDYW52YXNDb250ZXh0IiwiY2FudmFzVG9UZW1wRmlsZVBhdGgiLCJjYW52YXNQdXRJbWFnZURhdGEiLCJjYW52YXNHZXRJbWFnZURhdGEiXSxbImdldFByb3ZpZGVyIiwibG9naW4iLCJjaGVja1Nlc3Npb24iLCJnZXRVc2VySW5mbyIsImdldFVzZXJQcm9maWxlIiwicHJlTG9naW4iLCJjbG9zZUF1dGhWaWV3IiwiZ2V0Q2hlY2tCb3hTdGF0ZSIsImdldFVuaXZlcmlmeU1hbmFnZXIiLCJzaGFyZSIsInNoYXJlV2l0aFN5c3RlbSIsInNob3dTaGFyZU1lbnUiLCJoaWRlU2hhcmVNZW51IiwicmVxdWVzdFBheW1lbnQiLCJzdWJzY3JpYmVQdXNoIiwidW5zdWJzY3JpYmVQdXNoIiwib25QdXNoIiwib2ZmUHVzaCIsInJlcXVpcmVOYXRpdmVQbHVnaW4iLCJ1cHgycHgiLCJyZXN0b3JlR2xvYmFsIiwicmVxdWlyZUdsb2JhbCIsImdldFN1Yk5WdWVCeUlkIiwiZ2V0Q3VycmVudFN1Yk5WdWUiLCJzZXRQYWdlTWV0YSIsIm9uSG9zdEV2ZW50UmVjZWl2ZSIsIm9uTmF0aXZlRXZlbnRSZWNlaXZlIiwic2VuZE5hdGl2ZUV2ZW50IiwicHJlbG9hZFBhZ2UiLCJ1blByZWxvYWRQYWdlIiwibG9hZFN1YlBhY2thZ2UiLCJzZW5kSG9zdEV2ZW50IiwibmF2aWdhdGVUb01pbmlQcm9ncmFtIiwiZ2V0TGF1bmNoT3B0aW9uc1N5bmMiLCJnZXRFbnRlck9wdGlvbnNTeW5jIiwiaW5pdFVUU1Byb3h5Q2xhc3MiLCJpbml0VVRTUHJveHlGdW5jdGlvbiIsImluaXRVVFNJbmRleENsYXNzTmFtZSIsImluaXRVVFNDbGFzc05hbWUiLCJpbml0VVRTUGFja2FnZU5hbWUiLCJyZXF1aXJlVVRTUGx1Z2luIiwicmVnaXN0ZXJVVFNQbHVnaW4iLCJyZWdpc3RlclVUU0ludGVyZmFjZSJdLFsiY3JlYXRlUmV3YXJkZWRWaWRlb0FkIiwiY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQiLCJjcmVhdGVJbnRlcnN0aXRpYWxBZCIsImNyZWF0ZUludGVyYWN0aXZlQWQiXSxbImludm9rZVB1c2hDYWxsYmFjayIsImdldFB1c2hDbGllbnRJZCIsIm9uUHVzaE1lc3NhZ2UiLCJvZmZQdXNoTWVzc2FnZSIsImNyZWF0ZVB1c2hNZXNzYWdlIiwiZ2V0Q2hhbm5lbE1hbmFnZXIiXSk7dHJ5e3ZhciBuPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7fX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0LXBhc3NpdmUiLG51bGwsbil9Y2F0Y2goZSl7fXZhciBhPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIscz0vXig/OltBLVphLXpcZCsvXXs0fSkqPyg/OltBLVphLXpcZCsvXXsyfSg/Oj09KT98W0EtWmEtelxkKy9dezN9PT8pPyQvO2Z1bmN0aW9uIGMoKXt2YXIgZSx0LG49X2cuZ2V0U3RvcmFnZVN5bmMoInVuaV9pZF90b2tlbiIpfHwiIixyPW4uc3BsaXQoIi4iKTtpZighbnx8MyE9PXIubGVuZ3RoKXJldHVybnt1aWQ6bnVsbCxyb2xlOltdLHBlcm1pc3Npb246W10sdG9rZW5FeHBpcmVkOjB9O3RyeXtlPUpTT04ucGFyc2UoKHQ9clsxXSxkZWNvZGVVUklDb21wb25lbnQoaSh0KS5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiIlIisoIjAwIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9KS5qb2luKCIiKSkpKX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoIuiOt+WPluW9k+WJjeeUqOaIt+S/oeaBr+WHuumUme+8jOivpue7humUmeivr+S/oeaBr+S4uu+8miIrZS5tZXNzYWdlKX1yZXR1cm4gZS50b2tlbkV4cGlyZWQ9MWUzKmUuZXhwLGRlbGV0ZSBlLmV4cCxkZWxldGUgZS5pYXQsZX1pPSJmdW5jdGlvbiIhPXR5cGVvZiBhdG9iP2Z1bmN0aW9uKGUpe2lmKGU9U3RyaW5nKGUpLnJlcGxhY2UoL1tcdFxuXGZcciBdKy9nLCIiKSwhcy50ZXN0KGUpKXRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2F0b2InIG9uICdXaW5kb3cnOiBUaGUgc3RyaW5nIHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLiIpO3ZhciB0O2UrPSI9PSIuc2xpY2UoMi0oMyZlLmxlbmd0aCkpO2Zvcih2YXIgbixyLGk9IiIsbz0wO288ZS5sZW5ndGg7KXQ9YS5pbmRleE9mKGUuY2hhckF0KG8rKykpPDwxOHxhLmluZGV4T2YoZS5jaGFyQXQobysrKSk8PDEyfChuPWEuaW5kZXhPZihlLmNoYXJBdChvKyspKSk8PDZ8KHI9YS5pbmRleE9mKGUuY2hhckF0KG8rKykpKSxpKz02ND09PW4/U3RyaW5nLmZyb21DaGFyQ29kZSh0Pj4xNiYyNTUpOjY0PT09cj9TdHJpbmcuZnJvbUNoYXJDb2RlKHQ+PjE2JjI1NSx0Pj44JjI1NSk6U3RyaW5nLmZyb21DaGFyQ29kZSh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQpO3JldHVybiBpfTphdG9iO3ZhciByPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHY9QXJyYXkuaXNBcnJheSxfPU9iamVjdC5hc3NpZ247ZnVuY3Rpb24gQyhlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiB1KGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX12YXIgbD11O2Z1bmN0aW9uIGQoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9ZnVuY3Rpb24gVChlKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PXIuY2FsbChlKX1mdW5jdGlvbiBrKGUsdCl7cmV0dXJuIG8uY2FsbChlLHQpfWZ1bmN0aW9uIGYoKXt9ZnVuY3Rpb24gcChlKXtyZXR1cm4gci5jYWxsKGUpLnNsaWNlKDgsLTEpfWZ1bmN0aW9uIGgodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV18fChuW2VdPXQoZSkpfX12YXIgZz0vLShcdykvZyxtPWgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShnLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOiIifSl9KSx5PWgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pO2Z1bmN0aW9uIGIodCxuKXtpZih0PT09bilyZXR1cm4hMDt2YXIgZT1kKHQpLHI9ZChuKTtpZighZXx8IXIpcmV0dXJuIWUmJiFyJiZTdHJpbmcodCk9PT1TdHJpbmcobik7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkodCksbz1BcnJheS5pc0FycmF5KG4pO2lmKGkmJm8pcmV0dXJuIHQubGVuZ3RoPT09bi5sZW5ndGgmJnQuZXZlcnkoZnVuY3Rpb24oZSx0KXtyZXR1cm4gYihlLG5bdF0pfSk7aWYodCBpbnN0YW5jZW9mIERhdGUmJm4gaW5zdGFuY2VvZiBEYXRlKXJldHVybiB0LmdldFRpbWUoKT09PW4uZ2V0VGltZSgpO2lmKGl8fG8pcmV0dXJuITE7dmFyIGE9T2JqZWN0LmtleXModCkscz1PYmplY3Qua2V5cyhuKTtyZXR1cm4gYS5sZW5ndGg9PT1zLmxlbmd0aCYmYS5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4gYih0W2VdLG5bZV0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fXZhciB3PS9bIScoKSpdL2csUz1mdW5jdGlvbihlKXtyZXR1cm4iJSIrZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KX0seD0vJTJDL2csTz1mdW5jdGlvbihlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpLnJlcGxhY2UodyxTKS5yZXBsYWNlKHgsIiwiKX0sQT1kZWNvZGVVUklDb21wb25lbnQ7ZnVuY3Rpb24gRShlKXt2YXIgaT17fTtyZXR1cm4oZT1lLnRyaW0oKS5yZXBsYWNlKC9eKFw/fCN8JikvLCIiKSkmJmUuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvXCsvZywiICIpLnNwbGl0KCI9Iiksbj1BKHQuc2hpZnQoKSkscj0wPHQubGVuZ3RoP0EodC5qb2luKCI9IikpOm51bGw7dm9pZCAwPT09aVtuXT9pW25dPXI6QXJyYXkuaXNBcnJheShpW25dKT9pW25dLnB1c2gocik6aVtuXT1baVtuXSxyXX0pLGl9ZnVuY3Rpb24gSShyLGkpe3ZvaWQgMD09PWkmJihpPU8pO3ZhciBlPXI/T2JqZWN0LmtleXMocikubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPXJbdF07aWYodm9pZCAwPT09ZSlyZXR1cm4iIjtpZihudWxsPT09ZSlyZXR1cm4gaSh0KTtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgbj1bXTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUmJihudWxsPT09ZT9uLnB1c2goaSh0KSk6bi5wdXNoKGkodCkrIj0iK2koZSkpKX0pLG4uam9pbigiJiIpfXJldHVybiBpKHQpKyI9IitpKGUpfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiAwPGUubGVuZ3RofSkuam9pbigiJiIpOm51bGw7cmV0dXJuIGU/Ij8iK2U6IiJ9dmFyICQ9MCxQPXt9O2Z1bmN0aW9uIE0oZSx0KXt2YXIgbj1QW2VdfHx7fTtkZWxldGUgUFtlXTt2YXIgcj10LmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KHIpP24uZmFpbCYmbi5mYWlsKHQpOm4uc3VjY2VzcyYmbi5zdWNjZXNzKHQpLG4uY29tcGxldGUmJm4uY29tcGxldGUodCl9dmFyIGo9e3dhcnA6ZnVuY3Rpb24oaSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1TdHJpbmcoJCsrKTtQW3RdPXtzdWNjZXNzOmUuc3VjY2VzcyxmYWlsOmUuZmFpbCxjb21wbGV0ZTplLmNvbXBsZXRlfTt2YXIgbj1PYmplY3QuYXNzaWduKHt9LGUpLHI9aS5iaW5kKHRoaXMpKG4sdCk7ciYmTSh0LHIpfX0saW52b2tlOk19LEw9e2JsYWNrOiJyZ2JhKDAsMCwwLDAuNCkiLHdoaXRlOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkifTtmdW5jdGlvbiBOKGUpe3JldHVybiJibGFjayI9PT1lPyIjMDAwMDAwIjoiI2ZmZmZmZiJ9ZnVuY3Rpb24gQihlLHQsbil7aWYobCh0KSYmdC5zdGFydHNXaXRoKCJAIikpe3ZhciByPWVbdC5yZXBsYWNlKCJAIiwiIildfHx0O3N3aXRjaChuKXtjYXNlInRpdGxlQ29sb3IiOnI9TihyKTticmVhaztjYXNlImJvcmRlclN0eWxlIjpyPShpPXIpJiZpIGluIEw/TFtpXTppfXJldHVybiByfXZhciBpO3JldHVybiB0fWZ1bmN0aW9uIEQoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBlLmFwcGx5KGUsYXJndW1lbnRzKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX19ZnVuY3Rpb24gUihlKXtyZXR1cm4gZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGUuYXBwbHkoZSxhcmd1bWVudHMpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoZSl9fX12YXIgRj1bImludm9rZSIsInN1Y2Nlc3MiLCJmYWlsIiwiY29tcGxldGUiLCJyZXR1cm5WYWx1ZSJdLFU9e30sej17fTtmdW5jdGlvbiBWKGksbyl7T2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdCxuLHI7LTEhPT1GLmluZGV4T2YoZSkmJkMob1tlXSkmJihpW2VdPSh0PWlbZV0sbj1vW2VdLChyPW4/dD90LmNvbmNhdChuKTpBcnJheS5pc0FycmF5KG4pP246W25dOnQpP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspLTE9PT10LmluZGV4T2YoZVtuXSkmJnQucHVzaChlW25dKTtyZXR1cm4gdH0ocik6cikpfSl9ZnVuY3Rpb24gcShpLG8pe2kmJm8mJk9iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQsbixyOy0xIT09Ri5pbmRleE9mKGUpJiZDKG9bZV0pJiYodD1pW2VdLG49b1tlXSwtMSE9PShyPXQuaW5kZXhPZihuKSkmJnQuc3BsaWNlKHIsMSkpfSl9ZnVuY3Rpb24gVyh0LG4pe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlLG4pfHxlfX1mdW5jdGlvbiBIKGUpe3JldHVybiEhZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50aGVufWZ1bmN0aW9uIEcoZSx0LG4pe2Zvcih2YXIgcj0hMSxpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07aWYocilyPVByb21pc2UucmVzb2x2ZShXKG8sbikpO2Vsc2V7dmFyIGE9byh0LG4pO2lmKEgoYSkmJihyPVByb21pc2UucmVzb2x2ZShhKSksITE9PT1hKXJldHVybnt0aGVuOmZ1bmN0aW9uKCl7fX19fXJldHVybiByfHx7dGhlbjpmdW5jdGlvbihlKXtyZXR1cm4gZSh0KX19fWZ1bmN0aW9uIEoocixpKXtyZXR1cm4gdm9pZCAwPT09aSYmKGk9e30pLFsic3VjY2VzcyIsImZhaWwiLCJjb21wbGV0ZSJdLmZvckVhY2goZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheShyW3RdKSl7dmFyIG49aVt0XTtpW3RdPWZ1bmN0aW9uKGUpe0coclt0XSxlLGkpLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIEMobikmJm4oZSl8fGV9KX19fSksaX1mdW5jdGlvbiBYKGUsdCl7dmFyIG49W107QXJyYXkuaXNBcnJheShVLnJldHVyblZhbHVlKSYmbi5wdXNoLmFwcGx5KG4sVS5yZXR1cm5WYWx1ZSk7dmFyIHI9eltlXTtyZXR1cm4gciYmQXJyYXkuaXNBcnJheShyLnJldHVyblZhbHVlKSYmbi5wdXNoLmFwcGx5KG4sci5yZXR1cm5WYWx1ZSksbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Q9ZSh0KXx8dH0pLHR9ZnVuY3Rpb24gWShlKXt2YXIgdD1PYmplY3QuY3JlYXRlKG51bGwpO09iamVjdC5rZXlzKFUpLmZvckVhY2goZnVuY3Rpb24oZSl7InJldHVyblZhbHVlIiE9PWUmJih0W2VdPVVbZV0uc2xpY2UoKSl9KTt2YXIgbj16W2VdO3JldHVybiBuJiZPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJyZXR1cm5WYWx1ZSIhPT1lJiYodFtlXT0odFtlXXx8W10pLmNvbmNhdChuW2VdKSl9KSx0fWZ1bmN0aW9uIEsodCxuLGUpe2Zvcih2YXIgcj1bXSxpPWFyZ3VtZW50cy5sZW5ndGgtMzswPGktLTspcltpXT1hcmd1bWVudHNbaSszXTt2YXIgbz1ZKHQpO3JldHVybiBvJiZPYmplY3Qua2V5cyhvKS5sZW5ndGg/QXJyYXkuaXNBcnJheShvLmludm9rZSk/RyhvLmludm9rZSxlKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBuLmFwcGx5KHZvaWQgMCxbSihZKHQpLGUpXS5jb25jYXQocikpfSk6bi5hcHBseSh2b2lkIDAsW0oobyxlKV0uY29uY2F0KHIpKTpuLmFwcGx5KHZvaWQgMCxbZV0uY29uY2F0KHIpKX12YXIgWj17cmV0dXJuVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEgoZSk/bmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtlLnRoZW4oZnVuY3Rpb24oZSl7ZT9lWzBdP24oZVswXSk6dChlWzFdKTp0KGUpfSl9KTplfX0sUT0vXlwkfF9fZl9ffFdpbmRvdyR8V2luZG93U3R5bGUkfHNlbmRIb3N0RXZlbnR8c2VuZE5hdGl2ZUV2ZW50fHJlc3RvcmVHbG9iYWx8cmVxdWlyZUdsb2JhbHxnZXRDdXJyZW50U3ViTlZ1ZXxnZXRNZW51QnV0dG9uQm91bmRpbmdDbGllbnRSZWN0fF5yZXBvcnR8aW50ZXJjZXB0b3JzfEludGVyY2VwdG9yJHxnZXRTdWJOVnVlQnlJZHxyZXF1aXJlTmF0aXZlUGx1Z2lufHJweDJweHx1cHgycHh8aGlkZUtleWJvYXJkfGNhbklVc2V8XmNyZWF0ZXxTeW5jJHxNYW5hZ2VyJHxiYXNlNjRUb0FycmF5QnVmZmVyfGFycmF5QnVmZmVyVG9CYXNlNjR8Z2V0TG9jYWxlfHNldExvY2FsZXxpbnZva2VQdXNoQ2FsbGJhY2t8Z2V0V2luZG93SW5mb3xnZXREZXZpY2VJbmZvfGdldEFwcEJhc2VJbmZvfGdldFN5c3RlbVNldHRpbmd8Z2V0QXBwQXV0aG9yaXplU2V0dGluZ3xpbml0VVRTfHJlcXVpcmVVVFN8cmVnaXN0ZXJVVFMvLGVlPS9eY3JlYXRlfE1hbmFnZXIkLyx0ZT1bImNyZWF0ZUJMRUNvbm5lY3Rpb24iXSxuZT1bInJlcXVlc3QiLCJkb3dubG9hZEZpbGUiLCJ1cGxvYWRGaWxlIiwiY29ubmVjdFNvY2tldCJdLHJlPVsiY3JlYXRlQkxFQ29ubmVjdGlvbiIsImNyZWF0ZVB1c2hNZXNzYWdlIl0saWU9L15vbnxeb2ZmLztmdW5jdGlvbiBvZShlKXtyZXR1cm4gUS50ZXN0KGUpJiYtMT09PXJlLmluZGV4T2YoZSl9ZnVuY3Rpb24gYWUoZSl7cmV0dXJuIGllLnRlc3QoZSkmJiJvblB1c2giIT09ZX1mdW5jdGlvbiBzZShlKXtyZXR1cm4gdD1lLCEoZWUudGVzdCh0KSYmLTE9PT10ZS5pbmRleE9mKHQpfHxvZShlKXx8YWUoZSkpO3ZhciB0fWZ1bmN0aW9uIGNlKGUpe3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKXt2YXIgcj1lW25dO0MocikmJih0W25dPVIociksZGVsZXRlIGVbbl0pfXJldHVybiB0fVByb21pc2UucHJvdG90eXBlLmZpbmFsbHl8fChQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5PWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gbi5yZXNvbHZlKHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBlfSl9LGZ1bmN0aW9uKGUpe3JldHVybiBuLnJlc29sdmUodCgpKS50aGVuKGZ1bmN0aW9uKCl7dGhyb3cgZX0pfSl9KTt2YXIgdWU9W3tuYW1lOiJiYXNlNjQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sbGU9W3tuYW1lOiJhcnJheUJ1ZmZlciIsdHlwZTpbQXJyYXlCdWZmZXIsVWludDhBcnJheV0scmVxdWlyZWQ6ITB9XSxkZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxiYXNlNjRUb0FycmF5QnVmZmVyOnVlLGFycmF5QnVmZmVyVG9CYXNlNjQ6bGV9KSxmZT1be25hbWU6InNjaGVtYSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxwZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjYW5JVXNlOmZlfSksaGU9W3tuYW1lOiJldmVudCIsdHlwZTpbU3RyaW5nLEFycmF5XSxyZXF1aXJlZDohMH0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiEwfV0sdmU9aGUsZ2U9W3tuYW1lOiJldmVudCIsdHlwZTpbU3RyaW5nLEFycmF5XX0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9ufV0sbWU9W3tuYW1lOiJldmVudCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSx5ZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCwkb246aGUsJG9uY2U6dmUsJG9mZjpnZSwkZW1pdDptZX0pLF9lPVt7bmFtZToibWV0aG9kIix0eXBlOltTdHJpbmcsT2JqZWN0XSxyZXF1aXJlZDohMH1dLGJlPV9lLHdlPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGFkZEludGVyY2VwdG9yOl9lLHJlbW92ZUludGVyY2VwdG9yOmJlfSksa2U9W3tuYW1lOiJ1cHgiLHR5cGU6W051bWJlcixTdHJpbmddLHJlcXVpcmVkOiEwfV0sU2U9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdXB4MnB4OmtlfSk7ZnVuY3Rpb24geGUobil7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7ZSYmKHRbbl09TWF0aC5yb3VuZChlKSl9fXZhciBDZT17Y2FudmFzSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx4Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6eGUoIngiKX0seTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOnhlKCJ5Iil9LHdpZHRoOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6eGUoIndpZHRoIil9LGhlaWdodDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOnhlKCJoZWlnaHQiKX19LFRlPXtjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGRhdGE6e3R5cGU6VWludDhDbGFtcGVkQXJyYXkscmVxdWlyZWQ6ITB9LHg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjp4ZSgieCIpfSx5Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6eGUoInkiKX0sd2lkdGg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjp4ZSgid2lkdGgiKX0saGVpZ2h0Ont0eXBlOk51bWJlcix2YWxpZGF0b3I6eGUoImhlaWdodCIpfX0sT2U9e1BORzoicG5nIixKUEc6ImpwZyIsSlBFRzoianBnIn0sQWU9e3g6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MCx2YWxpZGF0b3I6eGUoIngiKX0seTp7dHlwZTpOdW1iZXIsZGVmYXVsdDowLHZhbGlkYXRvcjp4ZSgieSIpfSx3aWR0aDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOnhlKCJ3aWR0aCIpfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjp4ZSgiaGVpZ2h0Iil9LGRlc3RXaWR0aDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOnhlKCJkZXN0V2lkdGgiKX0sZGVzdEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOnhlKCJkZXN0SGVpZ2h0Iil9LGNhbnZhc0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZVR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9KGV8fCIiKS50b1VwcGVyQ2FzZSgpLHQuZmlsZVR5cGU9ZSBpbiBPZT9PZVtlXTpPZS5QTkd9fSxxdWFsaXR5Ont0eXBlOk51bWJlcix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LnF1YWxpdHk9MDxlJiZlPDE/ZToxfX19LEVlPXtjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGFjdGlvbnM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9LHJlc2VydmU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfX0sSWU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2FudmFzR2V0SW1hZ2VEYXRhOkNlLGNhbnZhc1B1dEltYWdlRGF0YTpUZSxjYW52YXNUb1RlbXBGaWxlUGF0aDpBZSxkcmF3Q2FudmFzOkVlfSksJGU9W3tuYW1lOiJpZCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxQZT0kZSxNZT0kZSxqZT0kZSxMZT1be25hbWU6ImNhbnZhc0lkIix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImNvbXBvbmVudEluc3RhbmNlIix0eXBlOk9iamVjdH1dLE5lPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUF1ZGlvQ29udGV4dDpQZSxjcmVhdGVWaWRlb0NvbnRleHQ6TWUsY3JlYXRlTWFwQ29udGV4dDpqZSxjcmVhdGVDYW52YXNDb250ZXh0OkxlfSksQmU9e2ZpcnN0TmFtZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiJhZGRQaG9uZUNvbnRhY3Q6ZmFpbCBwYXJhbWV0ZXIgZXJyb3I6IHBhcmFtZXRlci5maXJzdE5hbWUgc2hvdWxkIG5vdCBiZSBlbXB0eSBTdHJpbmc7In19fSxEZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxhZGRQaG9uZUNvbnRhY3Q6QmV9KSxSZT17cGhvbmVOdW1iZXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtpZighZSlyZXR1cm4ibWFrZVBob25lQ2FsbDpmYWlsIHBhcmFtZXRlciBlcnJvcjogcGFyYW1ldGVyLnBob25lTnVtYmVyIHNob3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nOyJ9fX0sRmU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsbWFrZVBob25lQ2FsbDpSZX0pLFVlPXtvbmx5RnJvbUNhbWVyYTp7dHlwZTpCb29sZWFufSxzY2FuVHlwZTp7dHlwZTpBcnJheX0sYXV0b0RlY29kZUNoYXJTZXQ6e3R5cGU6Qm9vbGVhbn0sc291bmQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5vbmUifSxhdXRvWm9vbTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9fSx6ZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzY2FuQ29kZTpVZX0pLFZlPVsieyIsIn0iXSxxZT1mdW5jdGlvbigpe3RoaXMuX2NhY2hlcz1PYmplY3QuY3JlYXRlKG51bGwpfTtxZS5wcm90b3R5cGUuaW50ZXJwb2xhdGU9ZnVuY3Rpb24oZSx0LG4pe2lmKHZvaWQgMD09PW4mJihuPVZlKSwhdClyZXR1cm5bZV07dmFyIHI9dGhpcy5fY2FjaGVzW2VdO3JldHVybiByfHwocj1mdW5jdGlvbihlLHQpe3ZhciBuPXRbMF0scj10WzFdLGk9W10sbz0wLGE9IiI7Zm9yKDtvPGUubGVuZ3RoOyl7dmFyIHM9ZVtvKytdO2lmKHM9PT1uKXthJiZpLnB1c2goe3R5cGU6InRleHQiLHZhbHVlOmF9KTt2YXIgYz1hPSIiO2ZvcihzPWVbbysrXTt2b2lkIDAhPT1zJiZzIT09cjspYys9cyxzPWVbbysrXTt2YXIgdT1zPT09cixsPVdlLnRlc3QoYyk/Imxpc3QiOnUmJkhlLnRlc3QoYyk/Im5hbWVkIjoidW5rbm93biI7aS5wdXNoKHt2YWx1ZTpjLHR5cGU6bH0pfWVsc2UgYSs9c31yZXR1cm4gYSYmaS5wdXNoKHt0eXBlOiJ0ZXh0Iix2YWx1ZTphfSksaX0oZSxuKSx0aGlzLl9jYWNoZXNbZV09ciksZnVuY3Rpb24oZSx0KXt2YXIgbj1bXSxyPTAsaT1BcnJheS5pc0FycmF5KHQpPyJsaXN0Ijoobz10LG51bGwhPT1vJiYib2JqZWN0Ij09dHlwZW9mIG8/Im5hbWVkIjoidW5rbm93biIpO3ZhciBvO2lmKCJ1bmtub3duIj09PWkpcmV0dXJuIG47Zm9yKDtyPGUubGVuZ3RoOyl7dmFyIGE9ZVtyXTtzd2l0Y2goYS50eXBlKXtjYXNlInRleHQiOm4ucHVzaChhLnZhbHVlKTticmVhaztjYXNlImxpc3QiOm4ucHVzaCh0W3BhcnNlSW50KGEudmFsdWUsMTApXSk7YnJlYWs7Y2FzZSJuYW1lZCI6Im5hbWVkIj09PWkmJm4ucHVzaCh0W2EudmFsdWVdKX1yKyt9cmV0dXJuIG59KHIsdCl9O3ZhciBXZT0vXig/OlxkKSsvLEhlPS9eKD86XHcpKy87dmFyIEdlPSJ6aC1IYW5zIixKZT0iemgtSGFudCIsWGU9ImVuIixZZT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEtlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFllLmNhbGwoZSx0KX0sWmU9bmV3IHFlO2Z1bmN0aW9uIFFlKGUsdCl7aWYoZSl7aWYoZT1lLnRyaW0oKS5yZXBsYWNlKC9fL2csIi0iKSx0JiZ0W2VdKXJldHVybiBlO2lmKCJjaGluZXNlIj09PShlPWUudG9Mb3dlckNhc2UoKSkpcmV0dXJuIEdlO2lmKDA9PT1lLmluZGV4T2YoInpoIikpcmV0dXJuLTE8ZS5pbmRleE9mKCItaGFucyIpP0dlOi0xPGUuaW5kZXhPZigiLWhhbnQiKT9KZToobj1lLFsiLXR3IiwiLWhrIiwiLW1vIiwiLWNodCJdLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuLTEhPT1uLmluZGV4T2YoZSl9KT9KZTpHZSk7dmFyIG4scj1bWGUsImZyIiwiZXMiXTt0JiYwPE9iamVjdC5rZXlzKHQpLmxlbmd0aCYmKHI9T2JqZWN0LmtleXModCkpO3ZhciBpLG89KGk9ZSxyLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1pLmluZGV4T2YoZSl9KSk7cmV0dXJuIG98fHZvaWQgMH19dmFyIGV0PWZ1bmN0aW9uKGUpe3ZhciB0PWUubG9jYWxlLG49ZS5mYWxsYmFja0xvY2FsZSxyPWUubWVzc2FnZXMsaT1lLndhdGNoZXIsbz1lLmZvcm1hdGVyO3RoaXMubG9jYWxlPVhlLHRoaXMuZmFsbGJhY2tMb2NhbGU9WGUsdGhpcy5tZXNzYWdlPXt9LHRoaXMubWVzc2FnZXM9e30sdGhpcy53YXRjaGVycz1bXSxuJiYodGhpcy5mYWxsYmFja0xvY2FsZT1uKSx0aGlzLmZvcm1hdGVyPW98fFplLHRoaXMubWVzc2FnZXM9cnx8e30sdGhpcy5zZXRMb2NhbGUodHx8WGUpLGkmJnRoaXMud2F0Y2hMb2NhbGUoaSl9O2Z1bmN0aW9uIHR0KGUsdCl7cmV0dXJuLTE8ZS5pbmRleE9mKHRbMF0pfWV0LnByb3RvdHlwZS5zZXRMb2NhbGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMubG9jYWxlO3RoaXMubG9jYWxlPVFlKGUsdGhpcy5tZXNzYWdlcyl8fHRoaXMuZmFsbGJhY2tMb2NhbGUsdGhpcy5tZXNzYWdlc1t0aGlzLmxvY2FsZV18fCh0aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXT17fSksdGhpcy5tZXNzYWdlPXRoaXMubWVzc2FnZXNbdGhpcy5sb2NhbGVdLG4hPT10aGlzLmxvY2FsZSYmdGhpcy53YXRjaGVycy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UodC5sb2NhbGUsbil9KX0sZXQucHJvdG90eXBlLmdldExvY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2FsZX0sZXQucHJvdG90eXBlLndhdGNoTG9jYWxlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10aGlzLndhdGNoZXJzLnB1c2goZSktMTtyZXR1cm4gZnVuY3Rpb24oKXt0LndhdGNoZXJzLnNwbGljZShuLDEpfX0sZXQucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlLHQsbil7dm9pZCAwPT09biYmKG49ITApO3ZhciByPXRoaXMubWVzc2FnZXNbZV07cj9uP09iamVjdC5hc3NpZ24ocix0KTpPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0tlKHIsZSl8fChyW2VdPXRbZV0pfSk6dGhpcy5tZXNzYWdlc1tlXT10fSxldC5wcm90b3R5cGUuZj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuZm9ybWF0ZXIuaW50ZXJwb2xhdGUoZSx0LG4pLmpvaW4oIiIpfSxldC5wcm90b3R5cGUudD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5tZXNzYWdlO3JldHVybiJzdHJpbmciPT10eXBlb2YgdD8odD1RZSh0LHRoaXMubWVzc2FnZXMpKSYmKHI9dGhpcy5tZXNzYWdlc1t0XSk6bj10LEtlKHIsZSk/dGhpcy5mb3JtYXRlci5pbnRlcnBvbGF0ZShyW2VdLG4pLmpvaW4oIiIpOihjb25zb2xlLndhcm4oIkNhbm5vdCB0cmFuc2xhdGUgdGhlIHZhbHVlIG9mIGtleXBhdGggIitlKyIuIFVzZSB0aGUgdmFsdWUgb2Yga2V5cGF0aCBhcyBkZWZhdWx0LiIpLGUpfTt2YXIgbnQscnQ9NDQsaXQ9Im9uVGhlbWVDaGFuZ2UiLG90PSJlbiIsYXQ9e307T2JqZWN0LmFzc2lnbihhdCwoKGU9e30pW290XT17InVuaS5hcHAucXVpdCI6IlByZXNzIGJhY2sgYnV0dG9uIGFnYWluIHRvIGV4aXQiLCJ1bmkuYXN5bmMuZXJyb3IiOiJUaGUgY29ubmVjdGlvbiB0aW1lZCBvdXQsIGNsaWNrIHRoZSBzY3JlZW4gdG8gdHJ5IGFnYWluLiIsInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIjoiQ2FuY2VsIiwidW5pLnNob3dUb2FzdC51bnBhaXJlZCI6IlBsZWFzZSBub3RlIHNob3dUb2FzdCBtdXN0IGJlIHBhaXJlZCB3aXRoIGhpZGVUb2FzdCIsInVuaS5zaG93TG9hZGluZy51bnBhaXJlZCI6IlBsZWFzZSBub3RlIHNob3dMb2FkaW5nIG11c3QgYmUgcGFpcmVkIHdpdGggaGlkZUxvYWRpbmciLCJ1bmkuc2hvd01vZGFsLmNhbmNlbCI6IkNhbmNlbCIsInVuaS5zaG93TW9kYWwuY29uZmlybSI6Ik9LIiwidW5pLmNob29zZUltYWdlLmNhbmNlbCI6IkNhbmNlbCIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmFsYnVtIjoiQWxidW0iLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5jYW1lcmEiOiJDYW1lcmEiLCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIjoiQ2FuY2VsIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuYWxidW0iOiJBbGJ1bSIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmNhbWVyYSI6IkNhbWVyYSIsInVuaS5jaG9vc2VGaWxlLm5vdFVzZXJBY3RpdmF0aW9uIjoiRmlsZSBjaG9vc2VyIGRpYWxvZyBjYW4gb25seSBiZSBzaG93biB3aXRoIGEgdXNlciBhY3RpdmF0aW9uIiwidW5pLnByZXZpZXdJbWFnZS5jYW5jZWwiOiJDYW5jZWwiLCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIjoiU2F2ZSBJbWFnZSIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5zdWNjZXNzIjoiU2F2ZWQgc3VjY2Vzc2Z1bGx5IiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLmZhaWwiOiJTYXZlIGZhaWxlZCIsInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiOiJDb250ZW50IGNvcGllZCIsInVuaS5zY2FuQ29kZS50aXRsZSI6IlNjYW4gY29kZSIsInVuaS5zY2FuQ29kZS5hbGJ1bSI6IkFsYnVtIiwidW5pLnNjYW5Db2RlLmZhaWwiOiJSZWNvZ25pdGlvbiBmYWlsdXJlIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9uIjoiVGFwIHRvIHR1cm4gbGlnaHQgb24iLCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIjoiVGFwIHRvIHR1cm4gbGlnaHQgb2ZmIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCI6IkZpbmdlcnByaW50IHJlY29nbml0aW9uIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi53YWl0aW5nQ29udGVudCI6IlVucmVjb2duaXphYmxlIiwidW5pLnBpY2tlci5kb25lIjoiRG9uZSIsInVuaS5waWNrZXIuY2FuY2VsIjoiQ2FuY2VsIiwidW5pLnZpZGVvLmRhbm11IjoiRGFubXUiLCJ1bmkudmlkZW8udm9sdW1lIjoiVm9sdW1lIiwidW5pLmJ1dHRvbi5mZWVkYmFjay50aXRsZSI6ImZlZWRiYWNrIiwidW5pLmJ1dHRvbi5mZWVkYmFjay5zZW5kIjoic2VuZCIsInVuaS5jaG9vc2VMb2NhdGlvbi5zZWFyY2giOiJGaW5kIFBsYWNlIiwidW5pLmNob29zZUxvY2F0aW9uLmNhbmNlbCI6IkNhbmNlbCJ9LGUuZXM9eyJ1bmkuYXBwLnF1aXQiOiJQdWxzZSBvdHJhIHZleiBwYXJhIHNhbGlyIiwidW5pLmFzeW5jLmVycm9yIjoiU2UgYWdvdMOzIGVsIHRpZW1wbyBkZSBjb25leGnDs24sIGhhZ2EgY2xpYyBlbiBsYSBwYW50YWxsYSBwYXJhIHZvbHZlciBhIGludGVudGFybG8uIiwidW5pLnNob3dBY3Rpb25TaGVldC5jYW5jZWwiOiJDYW5jZWxhciIsInVuaS5zaG93VG9hc3QudW5wYWlyZWQiOiJUZW5nYSBlbiBjdWVudGEgcXVlIHNob3dUb2FzdCBkZWJlIGVzdGFyIGVtcGFyZWphZG8gY29uIGhpZGVUb2FzdCIsInVuaS5zaG93TG9hZGluZy51bnBhaXJlZCI6IlRlbmdhIGVuIGN1ZW50YSBxdWUgc2hvd0xvYWRpbmcgZGViZSBlc3RhciBlbXBhcmVqYWRvIGNvbiBoaWRlTG9hZGluZyIsInVuaS5zaG93TW9kYWwuY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iOiJPSyIsInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiOiJDYW5jZWxhciIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmFsYnVtIjoiw4FsYnVtIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIjoiQ8OhbWFyYSIsInVuaS5jaG9vc2VWaWRlby5jYW5jZWwiOiJDYW5jZWxhciIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmFsYnVtIjoiw4FsYnVtIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuY2FtZXJhIjoiQ8OhbWFyYSIsInVuaS5jaG9vc2VGaWxlLm5vdFVzZXJBY3RpdmF0aW9uIjoiRWwgY3VhZHJvIGRlIGRpw6Fsb2dvIGRlbCBzZWxlY3RvciBkZSBhcmNoaXZvcyBzb2xvIHNlIHB1ZWRlIG1vc3RyYXIgY29uIGxhIGFjdGl2YWNpw7NuIGRlbCB1c3VhcmlvIiwidW5pLnByZXZpZXdJbWFnZS5jYW5jZWwiOiJDYW5jZWxhciIsInVuaS5wcmV2aWV3SW1hZ2UuYnV0dG9uLnNhdmUiOiJHdWFyZGFyIGltYWdlbiIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5zdWNjZXNzIjoiR3VhcmRhZG8gZXhpdG9zYW1lbnRlIiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLmZhaWwiOiJFcnJvciBhbCBndWFyZGFyIiwidW5pLnNldENsaXBib2FyZERhdGEuc3VjY2VzcyI6IkNvbnRlbmlkbyBjb3BpYWRvIiwidW5pLnNjYW5Db2RlLnRpdGxlIjoiQ8OzZGlnbyBkZSBlc2NhbmVvIiwidW5pLnNjYW5Db2RlLmFsYnVtIjoiw4FsYnVtIiwidW5pLnNjYW5Db2RlLmZhaWwiOiLDiWNoZWMgZGUgbGEgcmVjb25uYWlzc2FuY2UiLCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iOiJUb3F1ZSBwYXJhIGVuY2VuZGVyIGxhIGx1eiIsInVuaS5zY2FuQ29kZS5mbGFzaC5vZmYiOiJUb3F1ZSBwYXJhIGFwYWdhciBsYSBsdXoiLCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLmF1dGhDb250ZW50IjoiUmVjb25vY2ltaWVudG8gZGUgaHVlbGxhcyBkYWN0aWxhcmVzIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi53YWl0aW5nQ29udGVudCI6IklycmVjb25vY2libGUiLCJ1bmkucGlja2VyLmRvbmUiOiJPSyIsInVuaS5waWNrZXIuY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkudmlkZW8uZGFubXUiOiJEYW5tdSIsInVuaS52aWRlby52b2x1bWUiOiJWb2x1bWVuIiwidW5pLmJ1dHRvbi5mZWVkYmFjay50aXRsZSI6InJlYWxpbWVudGFjacOzbiIsInVuaS5idXR0b24uZmVlZGJhY2suc2VuZCI6ImVudmlhciIsInVuaS5jaG9vc2VMb2NhdGlvbi5zZWFyY2giOiJFbmNvbnRyYXIiLCJ1bmkuY2hvb3NlTG9jYXRpb24uY2FuY2VsIjoiQ2FuY2VsYXIifSxlLmZyPXsidW5pLmFwcC5xdWl0IjoiQXBwdXlleiDDoCBub3V2ZWF1IHBvdXIgcXVpdHRlciBsJ2FwcGxpY2F0aW9uIiwidW5pLmFzeW5jLmVycm9yIjoiTGEgY29ubmV4aW9uIGEgZXhwaXLDqSwgY2xpcXVleiBzdXIgbCfDqWNyYW4gcG91ciByw6llc3NheWVyLiIsInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIjoiQW5udWxlciIsInVuaS5zaG93VG9hc3QudW5wYWlyZWQiOiJWZXVpbGxleiBub3RlciBxdWUgc2hvd1RvYXN0IGRvaXQgw6p0cmUgYXNzb2Npw6kgw6AgaGlkZVRvYXN0IiwidW5pLnNob3dMb2FkaW5nLnVucGFpcmVkIjoiVmV1aWxsZXogbm90ZXIgcXVlIHNob3dMb2FkaW5nIGRvaXQgw6p0cmUgYXNzb2Npw6kgw6AgaGlkZUxvYWRpbmciLCJ1bmkuc2hvd01vZGFsLmNhbmNlbCI6IkFubnVsZXIiLCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iOiJPSyIsInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiOiJBbm51bGVyIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuYWxidW0iOiJBbGJ1bSIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmNhbWVyYSI6IkNhbcOpcmEiLCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIjoiQW5udWxlciIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmFsYnVtIjoiQWxidW0iLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5jYW1lcmEiOiJDYW3DqXJhIiwidW5pLmNob29zZUZpbGUubm90VXNlckFjdGl2YXRpb24iOiJMYSBib8OudGUgZGUgZGlhbG9ndWUgZHUgc8OpbGVjdGV1ciBkZSBmaWNoaWVyIG5lIHBldXQgw6p0cmUgYWZmaWNow6llIHF1J2F2ZWMgdW5lIGFjdGl2YXRpb24gcGFyIGwndXRpbGlzYXRldXIiLCJ1bmkucHJldmlld0ltYWdlLmNhbmNlbCI6IkFubnVsZXIiLCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIjoiR3VhcmRhciBpbWFnZW4iLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyI6IkVucmVnaXN0csOpIGF2ZWMgc3VjY8OocyIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIjoiw4ljaGVjIGRlIGxhIHNhdXZlZ2FyZGUiLCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIjoiQ29udGVudSBjb3Bpw6kiLCJ1bmkuc2NhbkNvZGUudGl0bGUiOiJDb2RlIGTigJlhbmFseXNlIiwidW5pLnNjYW5Db2RlLmFsYnVtIjoiQWxidW0iLCJ1bmkuc2NhbkNvZGUuZmFpbCI6IkZhbGxvIGRlIHJlY29ub2NpbWllbnRvIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9uIjoiQXBwdXlleiBwb3VyIGFjdGl2ZXIgbCfDqWNsYWlyYWdlIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiI6IkFwcHV5ZXogcG91ciBkw6lzYWN0aXZlciBsJ8OpY2xhaXJhZ2UiLCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLmF1dGhDb250ZW50IjoiUmVjb25uYWlzc2FuY2UgZGUgbCdlbXByZWludGUgZGlnaXRhbGUiLCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLndhaXRpbmdDb250ZW50IjoiTcOpY29ubmFpc3NhYmxlIiwidW5pLnBpY2tlci5kb25lIjoiT0siLCJ1bmkucGlja2VyLmNhbmNlbCI6IkFubnVsZXIiLCJ1bmkudmlkZW8uZGFubXUiOiJEYW5tdSIsInVuaS52aWRlby52b2x1bWUiOiJMZSBWb2x1bWUiLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnRpdGxlIjoicmV0b3VyIGQnaW5mb3JtYXRpb24iLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnNlbmQiOiJlbnZveWVyIiwidW5pLmNob29zZUxvY2F0aW9uLnNlYXJjaCI6IlRyb3V2ZSIsInVuaS5jaG9vc2VMb2NhdGlvbi5jYW5jZWwiOiJBbm51bGVyIn0sZVsiemgtSGFucyJdPXsidW5pLmFwcC5xdWl0Ijoi5YaN5oyJ5LiA5qyh6YCA5Ye65bqU55SoIiwidW5pLmFzeW5jLmVycm9yIjoi6L+e5o6l5pyN5Yqh5Zmo6LaF5pe277yM54K55Ye75bGP5bmV6YeN6K+VIiwidW5pLnNob3dBY3Rpb25TaGVldC5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuc2hvd1RvYXN0LnVucGFpcmVkIjoi6K+35rOo5oSPIHNob3dUb2FzdCDkuI4gaGlkZVRvYXN0IOW/hemhu+mFjeWvueS9v+eUqCIsInVuaS5zaG93TG9hZGluZy51bnBhaXJlZCI6Iuivt+azqOaEjyBzaG93TG9hZGluZyDkuI4gaGlkZUxvYWRpbmcg5b+F6aG76YWN5a+55L2/55SoIiwidW5pLnNob3dNb2RhbC5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iOiLnoa7lrpoiLCJ1bmkuY2hvb3NlSW1hZ2UuY2FuY2VsIjoi5Y+W5raIIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuYWxidW0iOiLku47nm7jlhozpgInmi6kiLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5jYW1lcmEiOiLmi43mkYQiLCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIjoi5Y+W5raIIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuYWxidW0iOiLku47nm7jlhozpgInmi6kiLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5jYW1lcmEiOiLmi43mkYQiLCJ1bmkuY2hvb3NlRmlsZS5ub3RVc2VyQWN0aXZhdGlvbiI6IuaWh+S7tumAieaLqeWZqOWvueivneahhuWPquiDveWcqOeUseeUqOaIt+a/gOa0u+aXtuaYvuekuiIsInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIjoi5Y+W5raIIiwidW5pLnByZXZpZXdJbWFnZS5idXR0b24uc2F2ZSI6IuS/neWtmOWbvuWDjyIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5zdWNjZXNzIjoi5L+d5a2Y5Zu+5YOP5Yiw55u45YaM5oiQ5YqfIiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLmZhaWwiOiLkv53lrZjlm77lg4/liLDnm7jlhozlpLHotKUiLCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIjoi5YaF5a655bey5aSN5Yi2IiwidW5pLnNjYW5Db2RlLnRpdGxlIjoi5omr56CBIiwidW5pLnNjYW5Db2RlLmFsYnVtIjoi55u45YaMIiwidW5pLnNjYW5Db2RlLmZhaWwiOiLor4bliKvlpLHotKUiLCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iOiLovbvop6bnhafkuq4iLCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIjoi6L276Kem5YWz6ZetIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCI6IuaMh+e6ueivhuWIq+S4rS4uLiIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24ud2FpdGluZ0NvbnRlbnQiOiLml6Dms5Xor4bliKsiLCJ1bmkucGlja2VyLmRvbmUiOiLlrozmiJAiLCJ1bmkucGlja2VyLmNhbmNlbCI6IuWPlua2iCIsInVuaS52aWRlby5kYW5tdSI6IuW8ueW5lSIsInVuaS52aWRlby52b2x1bWUiOiLpn7Pph48iLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnRpdGxlIjoi6Zeu6aKY5Y+N6aaIIiwidW5pLmJ1dHRvbi5mZWVkYmFjay5zZW5kIjoi5Y+R6YCBIiwidW5pLmNob29zZUxvY2F0aW9uLnNlYXJjaCI6IuaQnOe0ouWcsOeCuSIsInVuaS5jaG9vc2VMb2NhdGlvbi5jYW5jZWwiOiLlj5bmtogifSxlWyJ6aC1IYW50Il09eyJ1bmkuYXBwLnF1aXQiOiLlho3mjInkuIDmrKHpgIDlh7rmh4nnlKgiLCJ1bmkuYXN5bmMuZXJyb3IiOiLpgKPmjqXmnI3li5nlmajotoXmmYLvvIzpu57mk4rlsY/luZXph43oqaYiLCJ1bmkuc2hvd0FjdGlvblNoZWV0LmNhbmNlbCI6IuWPlua2iCIsInVuaS5zaG93VG9hc3QudW5wYWlyZWQiOiLoq4vms6jmhI8gc2hvd1RvYXN0IOiIhyBoaWRlVG9hc3Qg5b+F6aCI6YWN5bCN5L2/55SoIiwidW5pLnNob3dMb2FkaW5nLnVucGFpcmVkIjoi6KuL5rOo5oSPIHNob3dMb2FkaW5nIOiIhyBoaWRlTG9hZGluZyDlv4XpoIjphY3lsI3kvb/nlKgiLCJ1bmkuc2hvd01vZGFsLmNhbmNlbCI6IuWPlua2iCIsInVuaS5zaG93TW9kYWwuY29uZmlybSI6IueiuuWumiIsInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSI6IuW+nuebuOWGiumBuOaThyIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmNhbWVyYSI6IuaLjeaUnSIsInVuaS5jaG9vc2VWaWRlby5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5hbGJ1bSI6IuW+nuebuOWGiumBuOaThyIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmNhbWVyYSI6IuaLjeaUnSIsInVuaS5jaG9vc2VGaWxlLm5vdFVzZXJBY3RpdmF0aW9uIjoi5paH5Lu26YG45pOH5Zmo5bCN6Kmx5qGG5Y+q6IO95Zyo55Sx55So5oi25r+A5rS75pmC6aGv56S6IiwidW5pLnByZXZpZXdJbWFnZS5jYW5jZWwiOiLlj5bmtogiLCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIjoi5L+d5a2Y5ZyW5YOPIiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLnN1Y2Nlc3MiOiLkv53lrZjlnJblg4/liLDnm7jlhormiJDlip8iLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuZmFpbCI6IuS/neWtmOWcluWDj+WIsOebuOWGiuWkseaVlyIsInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiOiLlhaflrrnlt7LlvqnliLYiLCJ1bmkuc2NhbkNvZGUudGl0bGUiOiLmjoPnorwiLCJ1bmkuc2NhbkNvZGUuYWxidW0iOiLnm7jlhooiLCJ1bmkuc2NhbkNvZGUuZmFpbCI6IuitmOWIpeWkseaVlyIsInVuaS5zY2FuQ29kZS5mbGFzaC5vbiI6Iui8leinuOeFp+S6riIsInVuaS5zY2FuQ29kZS5mbGFzaC5vZmYiOiLovJXop7jpl5zplokiLCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLmF1dGhDb250ZW50Ijoi5oyH57SL6K2Y5Yil5LitLi4uIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi53YWl0aW5nQ29udGVudCI6IueEoeazleitmOWIpSIsInVuaS5waWNrZXIuZG9uZSI6IuWujOaIkCIsInVuaS5waWNrZXIuY2FuY2VsIjoi5Y+W5raIIiwidW5pLnZpZGVvLmRhbm11Ijoi5b2I5bmVIiwidW5pLnZpZGVvLnZvbHVtZSI6Iumfs+mHjyIsInVuaS5idXR0b24uZmVlZGJhY2sudGl0bGUiOiLllY/poYzlj43ppYsiLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnNlbmQiOiLnmbzpgIEiLCJ1bmkuY2hvb3NlTG9jYXRpb24uc2VhcmNoIjoi5pCc57Si5Zyw6bueIiwidW5pLmNob29zZUxvY2F0aW9uLmNhbmNlbCI6IuWPlua2iCJ9LGUpKSxudD0ib2JqZWN0Ij09dHlwZW9mIGxnP2xnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRMYW5ndWFnZSgpOiIiLGZ1bmN0aW9uKCl7aWYocHQoKSl7dmFyIGU9T2JqZWN0LmtleXMobWcubG9jYWxlcyk7ZS5sZW5ndGgmJmUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1hdFtlXSxuPW1nLmxvY2FsZXNbZV07dD9PYmplY3QuYXNzaWduKHQsbik6YXRbZV09bn0pfX0oKTt2YXIgc3Q9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk7dm9pZCAwPT09dCYmKHQ9e30pLCJzdHJpbmciIT10eXBlb2YgZSYmKGU9KGk9W3QsZV0pWzBdLHQ9aVsxXSksInN0cmluZyIhPXR5cGVvZiBlJiYoZT12b2lkIDAhPT1fZyYmX2cuZ2V0TG9jYWxlP19nLmdldExvY2FsZSgpOnZvaWQgMCE9PWdsb2JhbCYmZ2xvYmFsLmdldExvY2FsZT9nbG9iYWwuZ2V0TG9jYWxlKCk6WGUpLCJzdHJpbmciIT10eXBlb2YgbiYmKG49dm9pZCAwIT09bWcmJm1nLmZhbGxiYWNrTG9jYWxlfHxYZSk7dmFyIGE9bmV3IGV0KHtsb2NhbGU6ZSxmYWxsYmFja0xvY2FsZTpuLG1lc3NhZ2VzOnQsd2F0Y2hlcjpyfSkscz1mdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBiZylzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEudChlLHQpfTtlbHNle3ZhciBvPSExO3M9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9YmcoKS4kdm07cmV0dXJuIGkmJihpLiRsb2NhbGUsb3x8KG89ITAscj1hLChuPWkpLiR3YXRjaExvY2FsZT9uLiR3YXRjaExvY2FsZShmdW5jdGlvbihlKXtyLnNldExvY2FsZShlKX0pOm4uJHdhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIG4uJGxvY2FsZX0sZnVuY3Rpb24oZSl7ci5zZXRMb2NhbGUoZSl9KSkpLGEudChlLHQpfX1yZXR1cm4gcyhlLHQpfTtyZXR1cm57aTE4bjphLGY6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBhLmYoZSx0LG4pfSx0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHMoZSx0KX0sYWRkOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49ITApLGEuYWRkKGUsdCxuKX0sd2F0Y2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGEud2F0Y2hMb2NhbGUoZSl9LGdldExvY2FsZTpmdW5jdGlvbigpe3JldHVybiBhLmdldExvY2FsZSgpfSxzZXRMb2NhbGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGEuc2V0TG9jYWxlKGUpfX19KG50LGF0KSxjdD1zdC50LHV0PShzdC5taXhpbj17YmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXN0LmkxOG4ud2F0Y2hMb2NhbGUoZnVuY3Rpb24oKXtlLiRmb3JjZVVwZGF0ZSgpfSk7dGhpcy4kb25jZSgiaG9vazpiZWZvcmVEZXN0cm95IixmdW5jdGlvbigpe3QoKX0pfSxtZXRob2RzOnskJHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gY3QoZSx0KX19fSxzdC5nZXRMb2NhbGUpO3ZhciBsdD1bIiUiLCIlIl07ZnVuY3Rpb24gZHQoZSl7cmV0dXJuIHR0KGUsbHQpP3N0LmYoZSwodD1fZy5nZXRMb2NhbGUoKSwobj1tZy5sb2NhbGVzKVt0XXx8blttZy5mYWxsYmFja0xvY2FsZV18fG5bb3RdfHx7fSksbHQpOmU7dmFyIHQsbn1mdW5jdGlvbiBmdCh0LGUpe3JldHVybiBlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gdChlLG4pe3ZhciByPWZ1bmN0aW9uIGUodCxuKXtpZigxIT09bi5sZW5ndGgpe3ZhciByPW4uc2hpZnQoKTtyZXR1cm4gZSh0JiZ0W3JdLG4pfWlmKHQpe3ZhciBpPWZ1bmN0aW9uKGUpe3JldHVybiB1KGUpJiZ0dChlLGx0KX0sbz1uWzBdLGE9W107aWYoQXJyYXkuaXNBcnJheSh0KSYmKGE9dC5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGkoZVtvXSl9KSkubGVuZ3RoKXJldHVybiBhO3ZhciBzPXRbb107aWYoaShzKSlyZXR1cm4gdH19KGUsbik7aWYoIXIpcmV0dXJuITE7dmFyIGk9bltuLmxlbmd0aC0xXTtpZihBcnJheS5pc0FycmF5KHIpKXIuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gdChlLFtpXSl9KTtlbHNle3ZhciBvPXJbaV07T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsaSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGR0KG8pfSxzZXQ6ZnVuY3Rpb24oZSl7bz1lfX0pfXJldHVybiEwfSh0LGUpfSl9ZnVuY3Rpb24gcHQoKXtyZXR1cm4gdm9pZCAwIT09bWcmJm1nLmxvY2FsZXMmJiEhT2JqZWN0LmtleXMobWcubG9jYWxlcykubGVuZ3RofXZhciBodD17ZGF0YTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHNob3dUb2FzdDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LGJlZm9yZVN1Y2Nlc3M6ZnVuY3Rpb24oZSx0KXtpZih0LnNob3dUb2FzdCl7dmFyIG49Y3QoInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiKTtuJiZfZy5zaG93VG9hc3Qoe3RpdGxlOm4saWNvbjoic3VjY2VzcyIsbWFzazohMSxzdHlsZTp7d2lkdGg6dm9pZCAwfX0pfX19LHZ0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNldENsaXBib2FyZERhdGE6aHR9KTtmdW5jdGlvbiBndChlLHQpe2lmKHQpe2lmKDA9PT10LmluZGV4T2YoIi8iKSlyZXR1cm4gdH1lbHNle2lmKDA9PT0odD1lKS5pbmRleE9mKCIvIikpcmV0dXJuIHQ7dmFyIG49d2coKTtlPW4ubGVuZ3RoP25bbi5sZW5ndGgtMV0uJHBhZ2Uucm91dGU6IiJ9aWYoMD09PXQuaW5kZXhPZigiLi8iKSlyZXR1cm4gZ3QoZSx0LnN1YnN0cigyKSk7Zm9yKHZhciByPXQuc3BsaXQoIi8iKSxpPXIubGVuZ3RoLG89MDtvPGkmJiIuLiI9PT1yW29dO28rKyk7ci5zcGxpY2UoMCxvKSx0PXIuam9pbigiLyIpO3ZhciBhPTA8ZS5sZW5ndGg/ZS5zcGxpdCgiLyIpOltdO3JldHVybiBhLnNwbGljZShhLmxlbmd0aC1vLTEsbysxKSwiLyIrYS5jb25jYXQocikuam9pbigiLyIpfXZhciBtdCx5dD0vXihbYS16LV0rOik/XC9cLy9pLF90PS9eZGF0YTouKiwuKi87ZnVuY3Rpb24gYnQoZSl7cmV0dXJuIGRnLmlvLmNvbnZlcnRMb2NhbEZpbGVTeXN0ZW1VUkwoZSkucmVwbGFjZSgvXlwvP2FwcHNcLy8sIi9hbmRyb2lkX2Fzc2V0L2FwcHMvIikucmVwbGFjZSgvXC8kLywiIil9ZnVuY3Rpb24gd3QoZSl7cmV0dXJuIG10fHwobXQ9ImZpbGU6Ly8iK2J0KCJfd3d3IikrIi8iKSxtdCtlfWZ1bmN0aW9uIGt0KGUpe2lmKDA9PT1lLmluZGV4T2YoIi8iKSlyZXR1cm4gMD09PWUuaW5kZXhPZigiLy8iKT8iaHR0cHM6IitlOmUuc3RhcnRzV2l0aCgiL3N0b3JhZ2UvIil8fGUuc3RhcnRzV2l0aCgiL3NkY2FyZC8iKXx8ZS5pbmNsdWRlcygiL0NvbnRhaW5lcnMvRGF0YS9BcHBsaWNhdGlvbi8iKT8iZmlsZTovLyIrZTp3dChlLnN1YnN0cigxKSk7aWYoeXQudGVzdChlKXx8X3QudGVzdChlKXx8MD09PWUuaW5kZXhPZigiYmxvYjoiKSlyZXR1cm4gZTtpZigwPT09ZS5pbmRleE9mKCJfd3d3Iil8fDA9PT1lLmluZGV4T2YoIl9kbyIpKXJldHVybiJmaWxlOi8vIitidChlKTt2YXIgdD13ZygpO3JldHVybiB0Lmxlbmd0aD93dChndCh0W3QubGVuZ3RoLTFdLiRwYWdlLnJvdXRlLGUpLnN1YnN0cigxKSk6ZX12YXIgU3Q9e3RlbXBGaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC50ZW1wRmlsZVBhdGg9a3QoZSl9fX0seHQ9WyJtZDUiLCJzaGExIl0sQ3Q9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmZpbGVQYXRoPWt0KGUpfX0sZGlnZXN0QWxnb3JpdGhtOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmRpZ2VzdEFsZ29yaXRobT14dC5pbmNsdWRlcyhlKT9lOnh0WzBdfSxkZWZhdWx0Onh0WzBdfX0sVHQ9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmZpbGVQYXRoPWt0KGUpfX19LE90PXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5maWxlUGF0aD1rdChlKX19fSxBdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzYXZlRmlsZTpTdCxnZXRGaWxlSW5mbzpDdCxnZXRTYXZlZEZpbGVJbmZvOlR0LHJlbW92ZVNhdmVkRmlsZTpPdH0pLEV0PXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGZpbGVUeXBlOnt0eXBlOlN0cmluZ319LEl0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLG9wZW5Eb2N1bWVudDpFdH0pLCR0PXtrZXl3b3JkOnt0eXBlOlN0cmluZ319LFB0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNob29zZUxvY2F0aW9uOiR0fSksTXQ9WyJ3Z3M4NCIsImdjajAyIl0sanQ9e3R5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLHQudHlwZT1NdC5pbmRleE9mKGUpPDA/TXRbMF06ZX19LGFsdGl0dWRlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LEx0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldExvY2F0aW9uOmp0fSksTnQ9e2xhdGl0dWRlOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMH0sbG9uZ2l0dWRlOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMH0sc2NhbGU6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9TWF0aC5mbG9vcihlKSx0LnNjYWxlPTU8PWUmJmU8PTE4P2U6MTh9LGRlZmF1bHQ6MTh9LG5hbWU6e3R5cGU6U3RyaW5nfSxhZGRyZXNzOnt0eXBlOlN0cmluZ319LEJ0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLG9wZW5Mb2NhdGlvbjpOdH0pLER0PVsiYWxsIiwiaW1hZ2UiLCJ2aWRlbyJdLFJ0PVsiYWxidW0iLCJjYW1lcmEiXSxGdD17Y291bnQ6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiExLGRlZmF1bHQ6MTAwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U8PTAmJih0LmNvdW50PTEwMCl9fSxzb3VyY2VUeXBlOnt0eXBlOkFycmF5LHJlcXVpcmVkOiExLGRlZmF1bHQ6UnQsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gUnQuaW5jbHVkZXMoZSl9KSx0LnNvdXJjZVR5cGU9ZS5sZW5ndGg/ZTpSdH19LHR5cGU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExLGRlZmF1bHQ6ImFsbCIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7RHQuaW5jbHVkZXMoZSl8fCh0LnR5cGU9RHRbMF0pLHQudHlwZT0iYWxsIj09PXQudHlwZT90LnR5cGU9IioiOnQudHlwZX19LGV4dGVuc2lvbjp7dHlwZTpBcnJheSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZihlKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuInBhcmFtIGV4dGVuc2lvbiBzaG91bGQgbm90IGJlIGVtcHR5LiJ9ZWxzZSJhbGwiIT09dC50eXBlJiYiKiIhPT10LnR5cGUmJnQudHlwZT90LmV4dGVuc2lvbj1bIioiXTp0LmV4dGVuc2lvbj1bIiJdfX19LFV0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNob29zZUZpbGU6RnR9KSx6dD1bIm9yaWdpbmFsIiwiY29tcHJlc3NlZCJdLFZ0PVsiYWxidW0iLCJjYW1lcmEiXSxxdD17Y291bnQ6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiExLGRlZmF1bHQ6OSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPD0wJiYodC5jb3VudD05KX19LHNpemVUeXBlOnt0eXBlOltBcnJheSxTdHJpbmddLHJlcXVpcmVkOiExLGRlZmF1bHQ6enQsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT0oZT0ic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4genQuaW5jbHVkZXMoZSl9KSx0LnNpemVUeXBlPWUubGVuZ3RoP2U6enR9fSxzb3VyY2VUeXBlOnt0eXBlOkFycmF5LHJlcXVpcmVkOiExLGRlZmF1bHQ6VnQsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gVnQuaW5jbHVkZXMoZSl9KSx0LnNvdXJjZVR5cGU9ZS5sZW5ndGg/ZTpWdH19LGV4dGVuc2lvbjp7dHlwZTpBcnJheSxkZWZhdWx0OlsiKiJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4icGFyYW0gZXh0ZW5zaW9uIHNob3VsZCBub3QgYmUgZW1wdHkuIn19fSxXdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VJbWFnZTpxdH0pLEh0PVsiYWxidW0iLCJjYW1lcmEiXSxHdD17c291cmNlVHlwZTp7dHlwZTpBcnJheSxyZXF1aXJlZDohMSxkZWZhdWx0Okh0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIEh0LmluY2x1ZGVzKGUpfSksdC5zb3VyY2VUeXBlPWUubGVuZ3RoP2U6SHR9fSxjb21wcmVzc2VkOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMH0sbWF4RHVyYXRpb246e3R5cGU6TnVtYmVyLGRlZmF1bHQ6NjB9LGNhbWVyYTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiYmFjayJ9LGV4dGVuc2lvbjp7dHlwZTpBcnJheSxkZWZhdWx0OlsiKiJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4icGFyYW0gZXh0ZW5zaW9uIHNob3VsZCBub3QgYmUgZW1wdHkuIn19fSxKdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VWaWRlbzpHdH0pLFh0PXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3Quc3JjPWt0KGUpfX19LFl0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNvbXByZXNzSW1hZ2U6WHR9KSxLdD17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LnNyYz1rdChlKX19LHF1YWxpdHk6e3R5cGU6U3RyaW5nfSxiaXRyYXRlOnt0eXBlOk51bWJlcn0sZnBzOnt0eXBlOk51bWJlcn0scmVzb2x1dGlvbjp7dHlwZTpOdW1iZXJ9fSxadD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjb21wcmVzc1ZpZGVvOkt0fSksUXQ9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5zcmM9a3QoZSl9fX0sZW49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0SW1hZ2VJbmZvOlF0fSksdG49e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5zcmM9a3QoZSl9fX0sbm49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0VmlkZW9JbmZvOnRufSkscm49e3VybHM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dmFyIG47aWYodC51cmxzPWUubWFwKGZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4ga3QoZSk7bj0hMH0pLG4pcmV0dXJuInVybCBpcyBub3Qgc3RyaW5nIn19LGN1cnJlbnQ6e3R5cGU6W1N0cmluZyxOdW1iZXJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpeyJudW1iZXIiPT10eXBlb2YgZT90LmN1cnJlbnQ9MDxlJiZlPHQudXJscy5sZW5ndGg/ZTowOiJzdHJpbmciPT10eXBlb2YgZSYmZSYmKHQuY3VycmVudD1rdChlKSl9LGRlZmF1bHQ6MH19LG9uPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHByZXZpZXdJbWFnZTpybn0pLGFuPXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5maWxlUGF0aD1rdChlKX19fSxzbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzYXZlSW1hZ2VUb1Bob3Rvc0FsYnVtOmFufSksY249e3VybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGhlYWRlcjp7dHlwZTpPYmplY3QsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5oZWFkZXI9ZXx8e319fX0sdW49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZG93bmxvYWRGaWxlOmNufSksbG49e09QVElPTlM6Ik9QVElPTlMiLEdFVDoiR0VUIixIRUFEOiJIRUFEIixQT1NUOiJQT1NUIixQVVQ6IlBVVCIsREVMRVRFOiJERUxFVEUiLFRSQUNFOiJUUkFDRSIsQ09OTkVDVDoiQ09OTkVDVCIsUEFUQ0g6IlBBVENIIn0sZG49Impzb24iLGZuPXtURVhUOiJ0ZXh0IixBUlJBWUJVRkZFUjoiYXJyYXlidWZmZXIifSxwbj1lbmNvZGVVUklDb21wb25lbnQ7dmFyIGhuLHZuPXttZXRob2Q6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9KGV8fCIiKS50b1VwcGVyQ2FzZSgpLHQubWV0aG9kPU9iamVjdC52YWx1ZXMobG4pLmluZGV4T2YoZSk8MD9sbi5HRVQ6ZX19LGRhdGE6e3R5cGU6W09iamVjdCxTdHJpbmcsQXJyYXksQXJyYXlCdWZmZXJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZGF0YT1lfHwiIn19LHVybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5tZXRob2Q9PT1sbi5HRVQmJlQodC5kYXRhKSYmT2JqZWN0LmtleXModC5kYXRhKS5sZW5ndGgmJih0LnVybD1mdW5jdGlvbihlLHQpe3ZhciBuPWUuc3BsaXQoIiMiKSxyPW5bMV18fCIiLGk9KG49blswXS5zcGxpdCgiPyIpKVsxXXx8IiI7ZT1uWzBdO3ZhciBvPWkuc3BsaXQoIiYiKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KTtmb3IodmFyIGEgaW4gaT17fSxvLmZvckVhY2goZnVuY3Rpb24oZSl7ZT1lLnNwbGl0KCI9IiksaVtlWzBdXT1lWzFdfSksdClpZihrKHQsYSkpe3ZhciBzPXRbYV07bnVsbD09cz9zPSIiOlQocykmJihzPUpTT04uc3RyaW5naWZ5KHMpKSxpW3BuKGEpXT1wbihzKX1yZXR1cm4gZSsoKGk9T2JqZWN0LmtleXMoaSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlKyI9IitpW2VdfSkuam9pbigiJiIpKT8iPyIraToiIikrKHI/IiMiK3I6IiIpfShlLHQuZGF0YSkpfX0saGVhZGVyOnt0eXBlOk9iamVjdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmhlYWRlcj1lfHx7fTt0Lm1ldGhvZCE9PWxuLkdFVCYmKE9iamVjdC5rZXlzKG4pLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuImNvbnRlbnQtdHlwZSI9PT1lLnRvTG93ZXJDYXNlKCl9KXx8KG5bIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9qc29uIikpfX0sZGF0YVR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZGF0YVR5cGU9KGV8fGRuKS50b0xvd2VyQ2FzZSgpfX0scmVzcG9uc2VUeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9Mb3dlckNhc2UoKSx0LnJlc3BvbnNlVHlwZT1PYmplY3QudmFsdWVzKGZuKS5pbmRleE9mKGUpPDA/Zm4uVEVYVDplfX0sd2l0aENyZWRlbnRpYWxzOnt0eXBlOkJvb2xlYW59LHRpbWVvdXQ6e3R5cGU6TnVtYmVyfX0sZ249e2NlcnRpZmljYXRlczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSl7aWYoZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiJTdHJpbmciIT09cChlLmhvc3QpfSkpcmV0dXJuIuWPguaVsOmFjee9rumUmeivr++8jOivt+ehruiupOWQjumHjeivlSJ9fX0sbW49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscmVxdWVzdDp2bixjb25maWdNVExTOmdufSkseW49e09QVElPTlM6Ik9QVElPTlMiLEdFVDoiR0VUIixIRUFEOiJIRUFEIixQT1NUOiJQT1NUIixQVVQ6IlBVVCIsREVMRVRFOiJERUxFVEUiLFRSQUNFOiJUUkFDRSIsQ09OTkVDVDoiQ09OTkVDVCJ9LF9uPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxoZWFkZXI6e3R5cGU6T2JqZWN0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuaGVhZGVyPWV8fHt9fX0sbWV0aG9kOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9VcHBlckNhc2UoKSx0Lm1ldGhvZD1PYmplY3QudmFsdWVzKHluKS5pbmRleE9mKGUpPDA/eW4uR0VUOmV9fSxwcm90b2NvbHM6e3R5cGU6W0FycmF5LFN0cmluZ10sdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7InN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pLHQucHJvdG9jb2xzPShlfHxbXSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX0pfX19LGJuPXtkYXRhOnt0eXBlOltTdHJpbmcsQXJyYXlCdWZmZXJdfX0sd249e2NvZGU6e3R5cGU6TnVtYmVyfSxyZWFzb246e3R5cGU6U3RyaW5nfX0sa249T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY29ubmVjdFNvY2tldDpfbixzZW5kU29ja2V0TWVzc2FnZTpibixjbG9zZVNvY2tldDp3bn0pLFNuPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxmaWxlczp7dHlwZTpBcnJheX0sZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2UmJih0LmZpbGVQYXRoPWt0KGUpKX19LG5hbWU6e3R5cGU6U3RyaW5nfSxoZWFkZXI6e3R5cGU6T2JqZWN0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuaGVhZGVyPWV8fHt9fX0sZm9ybURhdGE6e3R5cGU6T2JqZWN0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZm9ybURhdGE9ZXx8e319fX0seG49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdXBsb2FkRmlsZTpTbn0pLENuPXtPQVVUSDoiT0FVVEgiLFNIQVJFOiJTSEFSRSIsUEFZTUVOVDoiUEFZTUVOVCIsUFVTSDoiUFVTSCJ9LFRuPXtzZXJ2aWNlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZigoZT0oZXx8IiIpLnRvVXBwZXJDYXNlKCkpJiZPYmplY3QudmFsdWVzKENuKS5pbmRleE9mKGUpPDApcmV0dXJuInNlcnZpY2UgZXJyb3IifX19LE9uPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFByb3ZpZGVyOlRufSksQW49e3Jvb3Q6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbih0LGUpe3ZhciBuPW1nLnN1YlBhY2thZ2VzO3JldHVybiBBcnJheS5pc0FycmF5KG4pJiYwIT09bi5sZW5ndGg/bi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJvb3Q9PT10fSk/dm9pZCAwOiJyb290IGAiK3QrImAgaXMgbm90IGZvdW5kIjoibm8gc3ViUGFja2FnZXMifX19LEVuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGxvYWRTdWJQYWNrYWdlOkFufSksSW49e1VOSVZFUklGWToidW5pdmVyaWZ5In0sJG49e3Byb3ZpZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCxkZWZhdWx0OkluLlVOSVZFUklGWSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZihPYmplY3QudmFsdWVzKEluKS5pbmRleE9mKGUpPDApcmV0dXJuInByb3ZpZGVyIGVycm9yIn19fSxQbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxwcmVMb2dpbjokbn0pO2Z1bmN0aW9uIE1uKGEpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciByPShlPWd0KGUpKS5zcGxpdCgiPyIpWzBdLG49eWcuZmluZChmdW5jdGlvbihlKXt2YXIgdD1lLnBhdGgsbj1lLmFsaWFzO3JldHVybiB0PT09cnx8bj09PXJ9KTtpZighbilyZXR1cm4icGFnZSBgIitlKyJgIGlzIG5vdCBmb3VuZCI7aWYoIm5hdmlnYXRlVG8iPT09YXx8InJlZGlyZWN0VG8iPT09YSl7aWYobi5tZXRhLmlzVGFiQmFyKXJldHVybiJjYW4gbm90ICIrYSsiIGEgdGFiYmFyIHBhZ2UifWVsc2UgaWYoInN3aXRjaFRhYiI9PT1hJiYhbi5tZXRhLmlzVGFiQmFyKXJldHVybiJjYW4gbm90IHN3aXRjaCB0byBuby10YWJCYXIgcGFnZSI7aWYoInN3aXRjaFRhYiIhPT1hJiYicHJlbG9hZFBhZ2UiIT09YXx8IW4ubWV0YS5pc1RhYkJhcnx8ImFwcExhdW5jaCI9PT10Lm9wZW5UeXBlfHwoZT1yKSxuLm1ldGEuaXNFbnRyeSYmKGU9ZS5yZXBsYWNlKG4uYWxpYXMsIi8iKSksdC51cmw9ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlO3ZhciB0PWUuaW5kZXhPZigiPyIpO2lmKC0xPT09dClyZXR1cm4gZTt2YXIgbj1lLnN1YnN0cih0KzEpLnRyaW0oKS5yZXBsYWNlKC9eKFw/fCN8JikvLCIiKTtpZighbilyZXR1cm4gZTtlPWUuc3Vic3RyKDAsdCk7dmFyIGk9W107cmV0dXJuIG4uc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvXCsvZywiICIpLnNwbGl0KCI9Iiksbj10LnNoaWZ0KCkscj0wPHQubGVuZ3RoP3Quam9pbigiPSIpOiIiO2kucHVzaChuKyI9IitlbmNvZGVVUklDb21wb25lbnQocikpfSksaS5sZW5ndGg/ZSsiPyIraS5qb2luKCImIik6ZX0oZSksInVuUHJlbG9hZFBhZ2UiIT09YSlpZigicHJlbG9hZFBhZ2UiIT09YSl7aWYoaG49PT1lJiYiYXBwTGF1bmNoIiE9PXQub3BlblR5cGUpcmV0dXJuIGhuKyIgbG9ja2VkIjttZy5yZWFkeSYmITEhPT1tZy5lbmFibGVOYXZpZ2F0b3JMb2NrJiYoaG49ZSl9ZWxzZXtpZighbi5tZXRhLmlzTlZ1ZSlyZXR1cm4iY2FuIG5vdCBwcmVsb2FkIHZ1ZSBwYWdlIjtpZihuLm1ldGEuaXNUYWJCYXIpe3ZhciBpPXdnKCEwKSxvPShuLmFsaWFzfHxuLnBhdGgpLnN1YnN0cigxKTtpZihpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucm91dGU9PT1vfSkpcmV0dXJuInRhYkJhciBwYWdlIGAiK28rImAgYWxyZWFkeSBleGlzdHMifX19fWZ1bmN0aW9uIGpuKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXt9KSxPYmplY3QuYXNzaWduKHt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpNbihlKX0sYmVmb3JlQWxsOmZ1bmN0aW9uKCl7aG49IiJ9fSx0KX1mdW5jdGlvbiBMbih0KXtyZXR1cm57YW5pbWF0aW9uVHlwZTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe2lmKGUmJi0xPT09dC5pbmRleE9mKGUpKXJldHVybiJgIitlKyJgIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGBhbmltYXRpb25UeXBlYCAoc3VwcG9ydGVkIHZhbHVlcyBhcmU6IGAiK3Quam9pbigiYHxgIikrImApIn19LGFuaW1hdGlvbkR1cmF0aW9uOnt0eXBlOk51bWJlcn19fXZhciBObixCbixEbj1qbigicmVkaXJlY3RUbyIpLFJuPWpuKCJyZUxhdW5jaCIpLEZuPWpuKCJuYXZpZ2F0ZVRvIixMbihbInNsaWRlLWluLXJpZ2h0Iiwic2xpZGUtaW4tbGVmdCIsInNsaWRlLWluLXRvcCIsInNsaWRlLWluLWJvdHRvbSIsImZhZGUtaW4iLCJ6b29tLW91dCIsInpvb20tZmFkZS1vdXQiLCJwb3AtaW4iLCJub25lIl0pKSxVbj1qbigic3dpdGNoVGFiIiksem49T2JqZWN0LmFzc2lnbih7ZGVsdGE6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9cGFyc2VJbnQoZSl8fDEsdC5kZWx0YT1NYXRoLm1pbih3ZygpLmxlbmd0aC0xLGUpfX19LExuKFsic2xpZGUtb3V0LXJpZ2h0Iiwic2xpZGUtb3V0LWxlZnQiLCJzbGlkZS1vdXQtdG9wIiwic2xpZGUtb3V0LWJvdHRvbSIsImZhZGUtb3V0Iiwiem9vbS1pbiIsInpvb20tZmFkZS1pbiIsInBvcC1vdXQiLCJub25lIl0pKSxWbj17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6TW4oInByZWxvYWRQYWdlIil9fSxxbj17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6TW4oInVuUHJlbG9hZFBhZ2UiKX19LFduPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHJlZGlyZWN0VG86RG4scmVMYXVuY2g6Um4sbmF2aWdhdGVUbzpGbixzd2l0Y2hUYWI6VW4sbmF2aWdhdGVCYWNrOnpuLHByZWxvYWRQYWdlOlZuLHVuUHJlbG9hZFBhZ2U6cW59KSxIbj17a2V5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LEduPVt7bmFtZToia2V5Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH1dLEpuPXtrZXk6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxkYXRhOntyZXF1aXJlZDohMH19LFhuPVt7bmFtZToia2V5Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImRhdGEiLHJlcXVpcmVkOiEwfV0sWW49SG4sS249R24sWm49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0U3RvcmFnZTpIbixnZXRTdG9yYWdlU3luYzpHbixzZXRTdG9yYWdlOkpuLHNldFN0b3JhZ2VTeW5jOlhuLHJlbW92ZVN0b3JhZ2U6WW4scmVtb3ZlU3RvcmFnZVN5bmM6S259KSxRbj17ZmFtaWx5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc291cmNlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGVzYzp7dHlwZTpPYmplY3QscmVxdWlyZWQ6ITF9LHN1Y2Nlc3M6e3R5cGU6RnVuY3Rpb24scmVxdWlyZWQ6ITF9LGZhaWw6e3R5cGU6RnVuY3Rpb24scmVxdWlyZWQ6ITF9LGNvbXBsZXRlOnt0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiExfX0sZXI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsbG9hZEZvbnRGYWNlOlFufSksdHI9WyIjZmZmZmZmIiwiIzAwMDAwMCJdLG5yPXtmcm9udENvbG9yOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZigtMT09PXRyLmluZGV4T2YoZSkpcmV0dXJuJ2ludmFsaWQgZnJvbnRDb2xvciAiJytlKyciJ319LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGFuaW1hdGlvbjp7dHlwZTpPYmplY3QsZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybntkdXJhdGlvbjowLHRpbWluZ0Z1bmM6ImxpbmVhciJ9fSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSksdC5hbmltYXRpb249e2R1cmF0aW9uOmUuZHVyYXRpb258fDAsdGltaW5nRnVuYzplLnRpbWluZ0Z1bmN8fCJsaW5lYXIifX19fSxycj17dGl0bGU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0saXI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2V0TmF2aWdhdGlvbkJhckNvbG9yOm5yLHNldE5hdmlnYXRpb25CYXJUaXRsZTpycn0pLG9yPXtzY3JvbGxUb3A6e3R5cGU6TnVtYmVyfSxkdXJhdGlvbjp7dHlwZTpOdW1iZXIsZGVmYXVsdDozMDAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5kdXJhdGlvbj1NYXRoLm1heCgwLGUpfX19LGFyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHBhZ2VTY3JvbGxUbzpvcn0pLHNyPXt0aXRsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sY29udGVudDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sc2hvd0NhbmNlbDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LGNhbmNlbFRleHQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm4gY3QoInVuaS5zaG93TW9kYWwuY2FuY2VsIil9fSxjYW5jZWxDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwMCJ9LGNvbmZpcm1UZXh0Ont0eXBlOlN0cmluZyxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuIGN0KCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iKX19LGNvbmZpcm1Db2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LHZpc2libGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfX0sY3I9e3RpdGxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxpY29uOntkZWZhdWx0OiJzdWNjZXNzIix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXstMT09PVsic3VjY2VzcyIsImxvYWRpbmciLCJlcnJvciIsIm5vbmUiXS5pbmRleE9mKGUpJiYodC5pY29uPSJzdWNjZXNzIil9fSxpbWFnZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlJiYodC5pbWFnZT1rdChlKSl9fSxkdXJhdGlvbjp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxNTAwfSxtYXNrOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sdmlzaWJsZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9fSx1cj17dGl0bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGljb246e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImxvYWRpbmcifSxkdXJhdGlvbjp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxZTh9LG1hc2s6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSx2aXNpYmxlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMH19LGxyPXtpdGVtTGlzdDp7dHlwZTpBcnJheSxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZighZS5sZW5ndGgpcmV0dXJuInBhcmFtZXRlci5pdGVtTGlzdCBzaG91bGQgaGF2ZSBhdCBsZWFzdCAxIGl0ZW0ifX0saXRlbUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDAwIn0sdmlzaWJsZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LHBvcG92ZXI6e3R5cGU6T2JqZWN0fX0sZHI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2hvd01vZGFsOnNyLHNob3dUb2FzdDpjcixzaG93TG9hZGluZzp1cixzaG93QWN0aW9uU2hlZXQ6bHJ9KSxmcj17dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LHByPXtpbmRleDpmcix0ZXh0Ont0eXBlOlN0cmluZ30saWNvblBhdGg6e3R5cGU6U3RyaW5nfSxzZWxlY3RlZEljb25QYXRoOnt0eXBlOlN0cmluZ30scGFnZVBhdGg6e3R5cGU6U3RyaW5nfX0saHI9e2NvbG9yOnt0eXBlOlN0cmluZ30sc2VsZWN0ZWRDb2xvcjp7dHlwZTpTdHJpbmd9LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmd9LGJhY2tncm91bmRJbWFnZTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZSYmIS9eKGxpbmVhcnxyYWRpYWwpLWdyYWRpZW50XCguKz9cKTs/JC8udGVzdChlKSYmKHQuYmFja2dyb3VuZEltYWdlPWt0KGUpKX19LGJhY2tncm91bmRSZXBlYXQ6e3R5cGU6U3RyaW5nfSxib3JkZXJTdHlsZTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZSYmKHQuYm9yZGVyU3R5bGU9ImJsYWNrIj09PWU/ImJsYWNrIjoid2hpdGUiKX19fSx2cj17YW5pbWF0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LGdyPXthbmltYXRpb246e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfX0sbXI9e2luZGV4OmZyfSx5cj17aW5kZXg6ZnJ9LF9yPXtpbmRleDpmcn0sYnI9e2luZGV4OmZyLHRleHQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3ZhciBuO3ZvaWQgMD09PShuPWUpJiYobj0iIiksNDw9KCIiK24pLnJlcGxhY2UoL1teXHgwMC1ceGZmXS9nLCIqKiIpLmxlbmd0aCYmKHQudGV4dD0iLi4uIil9fX0sd3I9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2V0VGFiQmFySXRlbTpwcixzZXRUYWJCYXJTdHlsZTpocixoaWRlVGFiQmFyOnZyLHNob3dUYWJCYXI6Z3IsaGlkZVRhYkJhclJlZERvdDptcixzaG93VGFiQmFyUmVkRG90OnlyLHJlbW92ZVRhYkJhckJhZGdlOl9yLHNldFRhYkJhckJhZGdlOmJyfSksa3I9T2JqZWN0LmNyZWF0ZShudWxsKSxTcj0oTm49eyIuL2Jhc2UvYmFzZTY0LmpzIjpkZSwiLi9iYXNlL2Nhbi1pLXVzZS5qcyI6cGUsIi4vYmFzZS9ldmVudC1idXMuanMiOnllLCIuL2Jhc2UvaW50ZXJjZXB0b3IuanMiOndlLCIuL2Jhc2UvdXB4MnB4LmpzIjpTZSwiLi9jb250ZXh0L2NhbnZhcy5qcyI6SWUsIi4vY29udGV4dC9jb250ZXh0LmpzIjpOZSwiLi9kZXZpY2UvYWRkLXBob25lLWNvbnRhY3QuanMiOkRlLCIuL2RldmljZS9tYWtlLXBob25lLWNhbGwuanMiOkZlLCIuL2RldmljZS9zY2FuLWNvZGUuanMiOnplLCIuL2RldmljZS9zZXQtY2xpcGJvYXJkLWRhdGEuanMiOnZ0LCIuL2ZpbGUvZmlsZS5qcyI6QXQsIi4vZmlsZS9vcGVuLWRvY3VtZW50LmpzIjpJdCwiLi9sb2NhdGlvbi9jaG9vc2UtbG9jYXRpb24uanMiOlB0LCIuL2xvY2F0aW9uL2dldC1sb2NhdGlvbi5qcyI6THQsIi4vbG9jYXRpb24vb3Blbi1sb2NhdGlvbi5qcyI6QnQsIi4vbWVkaWEvY2hvb3NlLWZpbGUuanMiOlV0LCIuL21lZGlhL2Nob29zZS1pbWFnZS5qcyI6V3QsIi4vbWVkaWEvY2hvb3NlLXZpZGVvLmpzIjpKdCwiLi9tZWRpYS9jb21wcmVzcy1pbWFnZS5qcyI6WXQsIi4vbWVkaWEvY29tcHJlc3MtdmlkZW8uanMiOlp0LCIuL21lZGlhL2dldC1pbWFnZS1pbmZvLmpzIjplbiwiLi9tZWRpYS9nZXQtdmlkZW8taW5mby5qcyI6bm4sIi4vbWVkaWEvcHJldmlldy1pbWFnZS5qcyI6b24sIi4vbWVkaWEvc2F2ZS1pbWFnZS10by1waG90b3MtYWxidW0uanMiOnNuLCIuL25ldHdvcmsvZG93bmxvYWQtZmlsZS5qcyI6dW4sIi4vbmV0d29yay9yZXF1ZXN0LmpzIjptbiwiLi9uZXR3b3JrL3NvY2tldC5qcyI6a24sIi4vbmV0d29yay91cGxvYWQtZmlsZS5qcyI6eG4sIi4vcGx1Z2luL2dldC1wcm92aWRlci5qcyI6T24sIi4vcGx1Z2luL2xvYWQtc3ViLXBhY2thZ2UuanMiOkVuLCIuL3BsdWdpbi9wcmUtbG9naW4uanMiOlBuLCIuL3JvdXRlL3JvdXRlLmpzIjpXbiwiLi9zdG9yYWdlL3N0b3JhZ2UuanMiOlpuLCIuL3VpL2xvYWQtZm9udC1mYWNlLmpzIjplciwiLi91aS9uYXZpZ2F0aW9uLWJhci5qcyI6aXIsIi4vdWkvcGFnZS1zY3JvbGwtdG8uanMiOmFyLCIuL3VpL3BvcHVwLmpzIjpkciwiLi91aS90YWItYmFyLmpzIjp3cn0sKEJuPWZ1bmN0aW9uKGUpe3JldHVybiBObltlXXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitlKyInLiIpfSgpfSkua2V5cz1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyhObil9LEJuKTtmdW5jdGlvbiB4cihlLHQsbil7dmFyIHI9dFtlXSxpPSFrKG4sZSksbz1uW2VdO2lmKC0xPGZ1bmN0aW9uKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIEFyKHQsZSk/MDotMTtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYoQXIodFtuXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX0oQm9vbGVhbixyLnR5cGUpJiZpJiYhayhyLCJkZWZhdWx0IikmJihvPSExKSx2b2lkIDA9PT1vJiZrKHIsImRlZmF1bHQiKSl7dmFyIGE9ci5kZWZhdWx0O289QyhhKT9hKCk6YSxuW2VdPW99cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYoZS5yZXF1aXJlZCYmcilyZXR1cm4iTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgYCIrdCsiYCI7aWYobnVsbD09biYmIWUucmVxdWlyZWQpe3ZhciBvPWUudmFsaWRhdG9yO3JldHVybiBvP28obixpKTp2b2lkIDB9dmFyIGE9ZS50eXBlLHM9IWF8fCEwPT09YSxjPVtdO2lmKGEpe0FycmF5LmlzQXJyYXkoYSl8fChhPVthXSk7Zm9yKHZhciB1PTA7dTxhLmxlbmd0aCYmIXM7dSsrKXt2YXIgbD1UcihuLGFbdV0pO2MucHVzaChsLmV4cGVjdGVkVHlwZXx8IiIpLHM9bC52YWxpZH19aWYoIXMpcmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0icGFyYW1ldGVyIGAiK2UrImAuIEV4cGVjdGVkICIrbi5qb2luKCIsICIpLGk9blswXSxvPXAodCksYT1Fcih0LGkpLHM9RXIodCxvKTsxPT09bi5sZW5ndGgmJiRyKGkpJiYhZnVuY3Rpb24oKXt2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7Zm9yKDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiBlLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT09ZS50b0xvd2VyQ2FzZSgpfSl9KGksbykmJihyKz0iIHdpdGggdmFsdWUgIithKTtyKz0iLCBnb3QgIitvKyIgIiwkcihvKSYmKHIrPSJ3aXRoIHZhbHVlICIrcysiLiIpO3JldHVybiByfSh0LG4sYyk7dmFyIGQ9ZS52YWxpZGF0b3I7aWYoZClyZXR1cm4gZChuLGkpfShyLGUsbyxpLG4pfVNyLmtleXMoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09iamVjdC5hc3NpZ24oa3IsU3IoZSkpfSk7dmFyIENyPS9eKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxGdW5jdGlvbnxTeW1ib2wpJC87ZnVuY3Rpb24gVHIoZSx0KXt2YXIgbixyPU9yKHQpO2lmKENyLnRlc3Qocikpe3ZhciBpPXR5cGVvZiBlOyhuPWk9PT1yLnRvTG93ZXJDYXNlKCkpfHwib2JqZWN0IiE9PWl8fChuPWUgaW5zdGFuY2VvZiB0KX1lbHNlIG49MDw9ZS5ieXRlTGVuZ3RofHwoIk9iamVjdCI9PT1yP1QoZSk6IkFycmF5Ij09PXI/QXJyYXkuaXNBcnJheShlKTplIGluc3RhbmNlb2YgdHx8cChlKT09PU9yKHQpKTtyZXR1cm57dmFsaWQ6bixleHBlY3RlZFR5cGU6cn19ZnVuY3Rpb24gT3IoZSl7dmFyIHQ9ZSYmZS50b1N0cmluZygpLm1hdGNoKC9eXHMqZnVuY3Rpb24gKFx3KykvKTtyZXR1cm4gdD90WzFdOiIifWZ1bmN0aW9uIEFyKGUsdCl7cmV0dXJuIE9yKGUpPT09T3IodCl9ZnVuY3Rpb24gRXIoZSx0KXtyZXR1cm4iU3RyaW5nIj09PXQ/JyInK2UrJyInOiJOdW1iZXIiPT09dD8iIitOdW1iZXIoZSk6IiIrZX12YXIgSXI9WyJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIl07ZnVuY3Rpb24gJHIodCl7cmV0dXJuIElyLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKT09PWV9KX1mdW5jdGlvbiBQcihlLHQsbil7dmFyIHI9dCsiOmZhaWwgIitlO2lmKC0xPT09bil0aHJvdyBuZXcgRXJyb3Iocik7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBuJiZScihuLHtlcnJNc2c6cn0pLCExfXZhciBNcj1be25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiEwfV0sanI9WyJiZWZvcmVWYWxpZGF0ZSIsImJlZm9yZUFsbCIsImJlZm9yZVN1Y2Nlc3MiXTtmdW5jdGlvbiBMcihlLG4sdCl7dmFyIHI9a3JbZV07aWYoIXImJmFlKGUpJiYocj1Ncikscil7aWYoQXJyYXkuaXNBcnJheShyKSYmQXJyYXkuaXNBcnJheShuKSl7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKSxvPU9iamVjdC5jcmVhdGUobnVsbCksYT1uLmxlbmd0aDtyLmZvckVhY2goZnVuY3Rpb24oZSx0KXtpW2UubmFtZV09ZSx0PGEmJihvW2UubmFtZV09blt0XSl9KSxyPWksbj1vfWlmKEMoci5iZWZvcmVWYWxpZGF0ZSkpe3ZhciBzPXIuYmVmb3JlVmFsaWRhdGUobik7aWYocylyZXR1cm4gUHIocyxlLHQpfWZvcih2YXIgYz1PYmplY3Qua2V5cyhyKSx1PTA7dTxjLmxlbmd0aDt1KyspaWYoLTE9PT1qci5pbmRleE9mKGNbdV0pKXt2YXIgbD14cihjW3VdLHIsbik7aWYobClyZXR1cm4gUHIobCxlLHQpfX1yZXR1cm4hMH12YXIgTnI9MSxCcj17fTtmdW5jdGlvbiBEcihlLHQsbil7dm9pZCAwPT09dCYmKHQ9e30pLHZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj1mdW5jdGlvbihpLG8sZSl7aWYodm9pZCAwPT09byYmKG89e30pLHZvaWQgMD09PWUmJihlPXt9KSwhVChvKSlyZXR1cm57cGFyYW1zOm99O3ZhciB0PWNlKG89T2JqZWN0LmFzc2lnbih7fSxvKSksYT10LnN1Y2Nlc3Mscz10LmZhaWwsYz10LmNhbmNlbCx1PXQuY29tcGxldGUsbD1DKGEpLGQ9QyhzKSxmPUMoYykscD1DKHUpO2lmKCEobHx8ZHx8Znx8cCkpcmV0dXJue3BhcmFtczpvfTt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSl7dmFyIGg9ZVtyXTtDKGgpJiYobltyXT1EKGgpKX12YXIgdj1uLmJlZm9yZVN1Y2Nlc3MsZz1uLmFmdGVyU3VjY2VzcyxtPW4uYmVmb3JlRmFpbCx5PW4uYWZ0ZXJGYWlsLF89bi5iZWZvcmVDYW5jZWwsYj1uLmFmdGVyQ2FuY2VsLHc9bi5iZWZvcmVBbGwsaz1uLmFmdGVyQWxsLFM9TnIrKyx4PSJhcGkuIitpKyIuIitTO3JldHVybiBCcltTXT17bmFtZTp4LGNhbGxiYWNrOmZ1bmN0aW9uKGUpe2lmKGUuZXJyTXNnPWUuZXJyTXNnfHxpKyI6b2siLC0xIT09ZS5lcnJNc2cuaW5kZXhPZigiOm9rIikpZS5lcnJNc2c9aSsiOm9rIjtlbHNlIGlmKC0xIT09ZS5lcnJNc2cuaW5kZXhPZigiOmNhbmNlbCIpKWUuZXJyTXNnPWkrIjpjYW5jZWwiO2Vsc2UgaWYoLTEhPT1lLmVyck1zZy5pbmRleE9mKCI6ZmFpbCIpKXt2YXIgdD0iIixuPWUuZXJyTXNnLmluZGV4T2YoIiAiKTstMTxuJiYodD1lLmVyck1zZy5zdWJzdHIobikpLGUuZXJyTXNnPWkrIjpmYWlsIit0fUModykmJncoZSk7dmFyIHI9ZS5lcnJNc2c7MD09PXIuaW5kZXhPZihpKyI6b2siKT8oQyh2KSYmdihlLG8pLGwmJmEoZSksQyhnKSYmZyhlKSk6MD09PXIuaW5kZXhPZihpKyI6Y2FuY2VsIik/KGUuZXJyTXNnPWUuZXJyTXNnLnJlcGxhY2UoaSsiOmNhbmNlbCIsaSsiOmZhaWwgY2FuY2VsIiksZCYmcyhlKSxDKF8pJiZfKGUpLGYmJmMoZSksQyhiKSYmYihlKSk6MD09PXIuaW5kZXhPZihpKyI6ZmFpbCIpJiYoQyhtKSYmbShlKSxkJiZzKGUpLEMoeSkmJnkoZSkpLHAmJnUoZSksQyhrKSYmayhlKX19LHtwYXJhbXM6byxjYWxsYmFja0lkOlN9fShlLHQsbiksaT1yLnBhcmFtcyxvPXIuY2FsbGJhY2tJZDtyZXR1cm4gVChpKSYmIUxyKGUsaSxvKT97cGFyYW1zOmksY2FsbGJhY2tJZDohMX06e3BhcmFtczppLGNhbGxiYWNrSWQ6b319ZnVuY3Rpb24gUnIoZSx0LG4pe2lmKCJudW1iZXIiPT10eXBlb2YgZSl7dmFyIHI9QnJbZV07aWYocilyZXR1cm4gci5rZWVwQWxpdmV8fGRlbGV0ZSBCcltlXSxyLmNhbGxiYWNrKHQsbil9cmV0dXJuIHR9ZnVuY3Rpb24gRnIodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoIkFQSSBgIit0KyJgIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKX19dmFyIFVyPVsiZ2V0UHVzaENsaWVudElkIiwib25QdXNoTWVzc2FnZSIsIm9mZlB1c2hNZXNzYWdlIl07ZnVuY3Rpb24genIoYyx1LGwpe3JldHVybiB2b2lkIDA9PT1sJiYobD17fSksLTE8VXIuaW5kZXhPZihjKXx8IUModSk/dTooZT1sLCh0PWtyW2NdKSYmKEModC5iZWZvcmVBbGwpJiYoZS5iZWZvcmVBbGw9dC5iZWZvcmVBbGwpLEModC5iZWZvcmVTdWNjZXNzKSYmKGUuYmVmb3JlU3VjY2Vzcz10LmJlZm9yZVN1Y2Nlc3MpKSxmdW5jdGlvbigpe2Zvcih2YXIgZSx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09YXJndW1lbnRzW25dO2lmKG9lKGMpKXtpZihMcihjLHQsLTEpKXJldHVybiB1LmFwcGx5KG51bGwsdCl9ZWxzZSBpZihhZShjKSl7aWYoTHIoYyx0LC0xKSlyZXR1cm4gdSgoYy5zdGFydHNXaXRoKCJvZmYiKT9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBCcil7dmFyIHI9QnJbbl07aWYoci5uYW1lLnN0YXJ0c1dpdGgoImFwaS4iK2UucmVwbGFjZSgvXm9mZi8sIm9uIikpJiZyLmNhbGxiYWNrPT09dClyZXR1cm4gZGVsZXRlIEJyW25dLE51bWJlcihuKX1yZXR1cm4iZmFpbCJ9OmZ1bmN0aW9uKGUsdCl7dmFyIG49TnIrKyxyPSJhcGkuIitlKyIuIituO3JldHVybiBCcltuXT17bmFtZTpyLGtlZXBBbGl2ZTohMCxjYWxsYmFjazp0fSxufSkoYyx0WzBdKSl9ZWxzZXt2YXIgcj17fTt0Lmxlbmd0aCYmKHI9dFswXSk7dmFyIGksbz1EcihjLHIsbCksYT1vLnBhcmFtcyxzPW8uY2FsbGJhY2tJZDtpZighMSE9PXMpcmV0dXJuKGk9QyhhKT91KHMpOnUoYSxzKSkmJihlPWMsLTE9PT1uZS5pbmRleE9mKGUpKSYmVChpPVJyKHMsaSkpJiYoaS5lcnJNc2c9aS5lcnJNc2d8fGMrIjpvayIpLGl9fSk7dmFyIGUsdH1mdW5jdGlvbiBWcihlLHQpe3JldHVybiBlKHQ9e2V4cG9ydHM6e319LHQuZXhwb3J0cyksdC5leHBvcnRzfXZhciBxcj1WcihmdW5jdGlvbihlLHQpeyFmdW5jdGlvbigpe2Zvcih2YXIgbz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsZD1uZXcgVWludDhBcnJheSgyNTYpLGU9MDtlPG8ubGVuZ3RoO2UrKylkW28uY2hhckNvZGVBdChlKV09ZTt0LmVuY29kZT1mdW5jdGlvbihlKXt2YXIgdCxuPW5ldyBVaW50OEFycmF5KGUpLHI9bi5sZW5ndGgsaT0iIjtmb3IodD0wO3Q8cjt0Kz0zKWkrPW9bblt0XT4+Ml0saSs9b1soMyZuW3RdKTw8NHxuW3QrMV0+PjRdLGkrPW9bKDE1Jm5bdCsxXSk8PDJ8blt0KzJdPj42XSxpKz1vWzYzJm5bdCsyXV07cmV0dXJuIHIlMz09Mj9pPWkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSkrIj0iOnIlMz09MSYmKGk9aS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0yKSsiPT0iKSxpfSx0LmRlY29kZT1mdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGE9Ljc1KmUubGVuZ3RoLHM9ZS5sZW5ndGgsYz0wOyI9Ij09PWVbZS5sZW5ndGgtMV0mJihhLS0sIj0iPT09ZVtlLmxlbmd0aC0yXSYmYS0tKTt2YXIgdT1uZXcgQXJyYXlCdWZmZXIoYSksbD1uZXcgVWludDhBcnJheSh1KTtmb3IodD0wO3Q8czt0Kz00KW49ZFtlLmNoYXJDb2RlQXQodCldLHI9ZFtlLmNoYXJDb2RlQXQodCsxKV0saT1kW2UuY2hhckNvZGVBdCh0KzIpXSxvPWRbZS5jaGFyQ29kZUF0KHQrMyldLGxbYysrXT1uPDwyfHI+PjQsbFtjKytdPSgxNSZyKTw8NHxpPj4yLGxbYysrXT0oMyZpKTw8Nnw2MyZvO3JldHVybiB1fX0oKX0pLFdyPXFyLmVuY29kZSxIcj1xci5kZWNvZGU7dmFyIEdyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGJhc2U2NFRvQXJyYXlCdWZmZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIEhyKGUpfSxhcnJheUJ1ZmZlclRvQmFzZTY0OmZ1bmN0aW9uKGUpe3JldHVybiBXcihlKX19KSxKcj17fTt2YXIgWHI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2FuSVVzZTpmdW5jdGlvbihlKXtyZXR1cm4gayhKcixlKT9KcltlXTohIWsoaHYsZSl9fSksWXI9e3Byb21pc2VJbnRlcmNlcHRvcjpafSxLcj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxpbnRlcmNlcHRvcnM6WXIsYWRkSW50ZXJjZXB0b3I6ZnVuY3Rpb24oZSx0KXsic3RyaW5nIj09dHlwZW9mIGUmJlQodCk/Vih6W2VdfHwoeltlXT17fSksdCk6VChlKSYmVihVLGUpfSxyZW1vdmVJbnRlcmNlcHRvcjpmdW5jdGlvbihlLHQpeyJzdHJpbmciPT10eXBlb2YgZT9UKHQpP3EoeltlXSx0KTpkZWxldGUgeltlXTpUKGUpJiZxKFUsZSl9fSksWnI9ITEsUXI9MCxlaT0wO2Z1bmN0aW9uIHRpKGUsdCl7cmV0dXJuIGU9TnVtYmVyKGUpLGlzTmFOKGUpP3Q6ZX12YXIgbmk9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdXB4MnB4OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG87aWYoMD09PVFyJiYobj1fZy5nZXRTeXN0ZW1JbmZvU3luYygpLHI9bi5wbGF0Zm9ybSxpPW4ucGl4ZWxSYXRpbyxvPW4ud2luZG93V2lkdGgsUXI9byxlaT1pLFpyPSJpb3MiPT09ciksMD09PShlPU51bWJlcihlKSkpcmV0dXJuIDA7dmFyIGE9bWcuZ2xvYmFsU3R5bGV8fG1nLndpbmRvd3x8e30scz10aShhLnJweENhbGNNYXhEZXZpY2VXaWR0aCw5NjApLGM9dGkoYS5ycHhDYWxjQmFzZURldmljZVdpZHRoLDM3NSksdT10aShhLnJweENhbGNJbmNsdWRlV2lkdGgsNzUwKSxsPXR8fFFyLGQ9ZS83NTAqKGw9ZT09PXV8fGw8PXM/bDpjKTtyZXR1cm4gZDwwJiYoZD0tZCksMD09PShkPU1hdGguZmxvb3IoZCsxZS00KSkmJihkPTEhPT1laSYmWnI/LjU6MSksZTwwPy1kOmR9fSk7ZnVuY3Rpb24gcmkoZSx0LG4scil7ZmcucHVibGlzaEhhbmRsZXIodCsiLWF1ZGlvLSIrZSx7YXVkaW9JZDplLHR5cGU6bixkYXRhOnJ9LHQpfXZhciBpaT1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VJZD10fTtpaS5wcm90b3R5cGUuc2V0U3JjPWZ1bmN0aW9uKGUpe3JpKHRoaXMuaWQsdGhpcy5wYWdlSWQsInNldFNyYyIse3NyYzplfSl9LGlpLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7cmkodGhpcy5pZCx0aGlzLnBhZ2VJZCwicGxheSIpfSxpaS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJwYXVzZSIpfSxpaS5wcm90b3R5cGUuc2Vlaz1mdW5jdGlvbihlKXtyaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJzZWVrIix7cG9zaXRpb246ZX0pfTt2YXIgb2k9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlQXVkaW9Db250ZXh0OmZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gbmV3IGlpKGUsdC4kcGFnZS5pZCk7dmFyIG49YmcoKTtpZihuLiRyb3V0ZSYmbi4kcm91dGUucGFyYW1zLl9faWRfXylyZXR1cm4gbmV3IGlpKGUsbi4kcm91dGUucGFyYW1zLl9faWRfXyk7ZmcuZW1pdCgib25FcnJvciIsImNyZWF0ZUF1ZGlvQ29udGV4dDpmYWlsIil9fSksYWk9bmV3IHVnO2Z1bmN0aW9uIHNpKGUsdCxuKXtyZXR1cm4gZVt0XS5hcHBseShlLG4pfWZ1bmN0aW9uIGNpKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKTtlLS07KXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBzaShhaSwiJG9uIixbXS5jb25jYXQodCkpfWZ1bmN0aW9uIHVpKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKTtlLS07KXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBzaShhaSwiJG9mZiIsW10uY29uY2F0KHQpKX1mdW5jdGlvbiBsaSgpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXkoZSk7ZS0tOyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gc2koYWksIiRvbmNlIixbXS5jb25jYXQodCkpfWZ1bmN0aW9uIGRpKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKTtlLS07KXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBzaShhaSwiJGVtaXQiLFtdLmNvbmNhdCh0KSl9dmFyIGZpLHBpPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLCRvbjpjaSwkb2ZmOnVpLCRvbmNlOmxpLCRlbWl0OmRpfSk7ZnVuY3Rpb24gaGkoKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIGZnLmludm9rZUNhbGxiYWNrSGFuZGxlci5hcHBseShmZyxlKX1mdW5jdGlvbiB2aShlKXtyZXR1cm4gX2cucmVxdWlyZU5hdGl2ZVBsdWdpbihlKX1mdW5jdGlvbiBnaShlKXtmb3IodmFyIHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoLTE7MDxuLS07KXRbbl09YXJndW1lbnRzW24rMV07cmV0dXJuIGZnLmVtaXQuYXBwbHkoZmcsWyJhcGkuIitlXS5jb25jYXQodCkpfXZhciBtaT1kZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGU7ZnVuY3Rpb24geWkoZSl7bWkoZmk9ZSl9ZnVuY3Rpb24gX2koZSl7aWYoIWUpe3ZhciB0PXdnKCk7aWYoIXQubGVuZ3RoKXJldHVybjtpZighKGU9dFt0Lmxlbmd0aC0xXS4kcGFnZS5tZXRhLnN0YXR1c0JhclN0eWxlKXx8ZT09PWZpKXJldHVybn1lIT09ZmkmJihmaT1lLGRnLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZShlKSl9ZnVuY3Rpb24gYmkodCl7aWYodm9pZCAwPT09dCYmKHQ9IiIpLCFtZy50YWJCYXJ8fCFBcnJheS5pc0FycmF5KG1nLnRhYkJhci5saXN0KSlyZXR1cm4hMTt0cnl7aWYoIXQpe3ZhciBlPXdnKCk7aWYoIWUubGVuZ3RoKXJldHVybiExO3ZhciBuPWVbZS5sZW5ndGgtMV07cmV0dXJuISFuJiZuLiRwYWdlLm1ldGEuaXNUYWJCYXJ9L15cLy8udGVzdCh0KXx8KHQ9Ii8iK3QpO3ZhciByPXlnLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PXR9KTtyZXR1cm4gciYmci5tZXRhLmlzVGFiQmFyfWNhdGNoKGUpe31yZXR1cm4hMX1mdW5jdGlvbiB3aShlKXtyZXR1cm4gSHIoZSl9ZnVuY3Rpb24ga2koZSl7cmV0dXJuIFdyKGUpfWZ1bmN0aW9uIFNpKGUsdCxuLHIpe3ZhciBpPWUodCk7cmV0dXJuIGkmJmkuZXJyTXNnJiYoaS5lcnJNc2c9aS5lcnJNc2cucmVwbGFjZShuLHIpKSxpfWZ1bmN0aW9uIHhpKGUpe3JldHVybiBlP2UuJGdldEFwcFdlYnZpZXcoKTpDaSgpfWZ1bmN0aW9uIENpKCl7dHJ5e3ZhciBlPXdnKCk7aWYoZS5sZW5ndGgpcmV0dXJuIGVbZS5sZW5ndGgtMV0uJGdldEFwcFdlYnZpZXcoKX1jYXRjaChlKXt9fWRnLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZT15aTt2YXIgVGk9ZnVuY3Rpb24oZSx0KXtpZigwPT09dC5pbmRleE9mKCIuLyIpKXJldHVybiBUaShlLHQuc3Vic3RyKDIpKTt2YXIgbixyLGk9dC5zcGxpdCgiLyIpO2ZvcihuPTAscj1pLmxlbmd0aDtuPHImJiIuLiI9PT1pW25dO24rKyk7aS5zcGxpY2UoMCxuKSx0PWkuam9pbigiLyIpO3ZhciBvPTA8ZS5sZW5ndGg/ZS5zcGxpdCgiLyIpOltdO3JldHVybiBvLnNwbGljZShvLmxlbmd0aC1uLTEsbisxKSxvLmNvbmNhdChpKS5qb2luKCIvIil9LE9pPWZ1bmN0aW9uKGUpe3JldHVybiBkZy5pby5jb252ZXJ0TG9jYWxGaWxlU3lzdGVtVVJMKGUpLnJlcGxhY2UoL15cLz9hcHBzXC8vLCIvYW5kcm9pZF9hc3NldC9hcHBzLyIpLnJlcGxhY2UoL1wvJC8sIiIpfTtmdW5jdGlvbiBBaShlKXtpZigwPT09ZS5pbmRleE9mKCIvLyIpKXJldHVybiJodHRwczoiK2U7aWYoL14oW2Etei1dKzopP1wvXC8vaS50ZXN0KGUpfHwvXmRhdGE6LiosLiovLnRlc3QoZSkpcmV0dXJuIGU7aWYoMD09PWUuaW5kZXhPZigiX3d3dyIpfHwwPT09ZS5pbmRleE9mKCJfZG9jIil8fDA9PT1lLmluZGV4T2YoIl9kb2N1bWVudHMiKXx8MD09PWUuaW5kZXhPZigiX2Rvd25sb2FkcyIpKXJldHVybiJmaWxlOi8vIitPaShlKTt2YXIgdD0iZmlsZTovLyIrT2koIl93d3ciKTtpZigwPT09ZS5pbmRleE9mKCIvIikpcmV0dXJuIGUuc3RhcnRzV2l0aCgiL3N0b3JhZ2UvIil8fGUuc3RhcnRzV2l0aCgiL3NkY2FyZC8iKXx8ZS5pbmNsdWRlcygiL0NvbnRhaW5lcnMvRGF0YS9BcHBsaWNhdGlvbi8iKT8iZmlsZTovLyIrZTp0K2U7aWYoMD09PWUuaW5kZXhPZigiLi4vIil8fDA9PT1lLmluZGV4T2YoIi4vIikpe2lmKCJzdHJpbmciPT10eXBlb2YgX19pZF9fKXJldHVybiB0K1RpKCIvIitfX2lkX18sZSk7dmFyIG49d2coKTtpZihuLmxlbmd0aClyZXR1cm4gdCtUaSgiLyIrbltuLmxlbmd0aC0xXS5yb3V0ZSxlKX1yZXR1cm4gZX12YXIgRWk9My4xNDE1OTI2NTM1ODk3OTMsSWk9NjM3ODI0NSwkaT0uMDA2NjkzNDIxNjIyOTY1OTQzO3ZhciBQaT1mdW5jdGlvbihlLHQpe3ZhciBuPTIqZS0xMDArMyp0Ky4yKnQqdCsuMSplKnQrLjIqTWF0aC5zcXJ0KE1hdGguYWJzKGUpKTtyZXR1cm4gbis9MiooMjAqTWF0aC5zaW4oNiplKkVpKSsyMCpNYXRoLnNpbigyKmUqRWkpKS8zLG4rPTIqKDIwKk1hdGguc2luKHQqRWkpKzQwKk1hdGguc2luKHQvMypFaSkpLzMsbis9MiooMTYwKk1hdGguc2luKHQvMTIqRWkpKzMyMCpNYXRoLnNpbih0KkVpLzMwKSkvM30sTWk9ZnVuY3Rpb24oZSx0KXt2YXIgbj0zMDArZSsyKnQrLjEqZSplKy4xKmUqdCsuMSpNYXRoLnNxcnQoTWF0aC5hYnMoZSkpO3JldHVybiBuKz0yKigyMCpNYXRoLnNpbig2KmUqRWkpKzIwKk1hdGguc2luKDIqZSpFaSkpLzMsbis9MiooMjAqTWF0aC5zaW4oZSpFaSkrNDAqTWF0aC5zaW4oZS8zKkVpKSkvMyxuKz0yKigxNTAqTWF0aC5zaW4oZS8xMipFaSkrMzAwKk1hdGguc2luKGUvMzAqRWkpKS8zfSxqaT1mdW5jdGlvbihlLHQpe3JldHVybiBlPDcyLjAwNHx8MTM3LjgzNDc8ZXx8dDwuODI5M3x8NTUuODI3MTx0fHwhMX07ZnVuY3Rpb24gTGkoZSxuKXtyZXR1cm4gZnVuY3Rpb24odCl7ZGdbZV1bbl0oZnVuY3Rpb24oZSl7ZSYmKGRlbGV0ZSBlLmNvZGUsZGVsZXRlIGUubWVzc2FnZSksaGkodCxlKX0pfX1mdW5jdGlvbiBOaSh0LG4pe3JldHVybiBmdW5jdGlvbihlKXtlPWV8fHt9LGhpKHQsT2JqZWN0LmFzc2lnbih7fSxlLHtlcnJNc2c6bisiOm9rIn0pKX19ZnVuY3Rpb24gQmkoYSxzLGMpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD0oZT1lfHx7fSkuY29kZTt2b2lkIDA9PT10JiYodD0wKTt2YXIgbj1lLm1lc3NhZ2Uscj17fTtmb3IodmFyIGkgaW4gZSktMT09PVsiY29kZSIsIm1lc3NhZ2UiXS5pbmRleE9mKGkpJiYocltpXT1lW2ldKTt2YXIgbz1yO2hpKGEsT2JqZWN0LmFzc2lnbih7fSx7ZXJyTXNnOnMrIjpmYWlsICIrKG58fGN8fCIiKSxlcnJDb2RlOnQsY29kZTp0fSxvKSl9fWZ1bmN0aW9uIERpKG4scixpLG8pe3JldHVybiBmdW5jdGlvbihlLHQpeyJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoZT1pKGUpKSxkZ1tuXVtyXShPYmplY3QuYXNzaWduKGUse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pLGRlbGV0ZSBlLmNvZGUsZGVsZXRlIGUubWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmKGU9byhlKSksaGkodCxPYmplY3QuYXNzaWduKHt9LGUse2Vyck1zZzpyKyI6b2sifSkpfSxmYWlsOkJpKHQscil9KSl9fWZ1bmN0aW9uIFJpKGUpe3ZhciB0PWUuc3BsaXQoIi8iKTtyZXR1cm4gdFt0Lmxlbmd0aC0xXX12YXIgRmksVWk9InBsYXliYWNrIix6aT17fSxWaT1bInBsYXkiLCJjYW5wbGF5IiwiZW5kZWQiLCJzdG9wIiwid2FpdGluZyIsInNlZWtpbmciLCJzZWVrZWQiLCJwYXVzZSJdLHFpPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXt9KSxnaSgib25BdWRpb1N0YXRlQ2hhbmdlIixPYmplY3QuYXNzaWduKHtzdGF0ZTplfSx0KSl9O3ZhciBXaT1udWxsLEhpPTI1MCxHaT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD17fSksZ2koIm9uQmFja2dyb3VuZEF1ZGlvU3RhdGVDaGFuZ2UiLE9iamVjdC5hc3NpZ24oe3N0YXRlOmV9LHQpKX0sSmk9WyJwbGF5IiwicGF1c2UiLCJlbmRlZCIsInN0b3AiLCJjYW5wbGF5Il07ZnVuY3Rpb24gWGkoKXtGaXx8KChGaT1kZy5hdWRpby5jcmVhdGVQbGF5ZXIoe2F1dG9wbGF5OiEwLGJhY2tncm91bmRDb250cm9sOiEwfSkpLnNyYz1GaS50aXRsZT1GaS5lcG5hbWU9Rmkuc2luZ2VyPUZpLmNvdmVySW1nVXJsPUZpLndlYlVybD0iIixGaS5zdGFydFRpbWU9MCxKaS5mb3JFYWNoKGZ1bmN0aW9uKHQpe0ZpLmFkZEV2ZW50TGlzdGVuZXIodCxmdW5jdGlvbigpeyJwbGF5Ij09PXQ/KEZpLmlzU3RvcHBlZD0hMSxZaSgpLEdpKCJ0aW1lVXBkYXRlIix7fSksV2k9dmcoZnVuY3Rpb24oKXtHaSgidGltZVVwZGF0ZSIse30pfSxIaSkpOiJzdG9wIj09PXQmJihGaS5pc1N0b3BwZWQ9ITApLCJwYXVzZSIhPT10JiYiZW5kZWQiIT09dCYmInN0b3AiIT09dHx8WWkoKTt2YXIgZT0ib25NdXNpYyIrKHRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKSk7Z2koZSx7ZGF0YVVybDpGaS5zcmMsZXJyTXNnOmUrIjpvayJ9KSxHaSh0LHtkYXRhVXJsOkZpLnNyY30pfSl9KSxGaS5hZGRFdmVudExpc3RlbmVyKCJ3YWl0aW5nIixmdW5jdGlvbigpe1lpKCksR2koIndhaXRpbmciLHtkYXRhVXJsOkZpLnNyY30pfSksRmkuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGUpe1lpKCksZ2koIm9uTXVzaWNFcnJvciIse2RhdGFVcmw6Rmkuc3JjLGVyck1zZzoiRXJyb3I6IitlLm1lc3NhZ2V9KSxHaSgiZXJyb3IiLHtkYXRhVXJsOkZpLnNyYyxlcnJNc2c6ZS5tZXNzYWdlLGVyckNvZGU6ZS5jb2RlfSl9KSxGaS5hZGRFdmVudExpc3RlbmVyKCJwcmV2IixmdW5jdGlvbigpe3JldHVybiBnaSgib25CYWNrZ3JvdW5kQXVkaW9QcmV2Iil9KSxGaS5hZGRFdmVudExpc3RlbmVyKCJuZXh0IixmdW5jdGlvbigpe3JldHVybiBnaSgib25CYWNrZ3JvdW5kQXVkaW9OZXh0Iil9KSl9ZnVuY3Rpb24gWWkoKXtudWxsIT09V2kmJmdnKFdpKX1mdW5jdGlvbiBLaShuLGUpe1hpKCk7dmFyIHI9WyJzcmMiLCJzdGFydFRpbWUiLCJjb3ZlckltZ1VybCIsIndlYlVybCIsInNpbmdlciIsImVwbmFtZSIsInRpdGxlIl07aWYoZSYmInBsYXliYWNrUmF0ZSI9PT1lKXt2YXIgdD1uW2VdO0ZpLnBsYXliYWNrUmF0ZSYmRmkucGxheWJhY2tSYXRlKHBhcnNlRmxvYXQodCkpfWVsc2V7dmFyIGk9e307T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXtpZigwPD1yLmluZGV4T2YoZSkpe3ZhciB0PW5bZV07ZT09PXJbMF0mJnQmJih0PUFpKHQpKSxGaVtlXT1pW2VdPXR9fSksRmkuc2V0U3R5bGVzKGkpfX1mdW5jdGlvbiBaaSgpe3JldHVybiBGaX1mdW5jdGlvbiBRaShlKXt2YXIgdD1lLm9wZXJhdGlvblR5cGUsbj1lLmRhdGFVcmwscj1lLnBvc2l0aW9uLGk9ZS5hcGk7dm9pZCAwPT09aSYmKGk9Im9wZXJhdGVNdXNpY1BsYXllciIpO3ZhciBvPWUudGl0bGUsYT1lLmNvdmVySW1nVXJsLHM9WmkoKTtyZXR1cm4gMDxbInJlc3VtZSIsInBhdXNlIiwic3RvcCJdLmluZGV4T2YodCk/cyYmc1t0XSgpOiJwbGF5Ij09PXQ/KEtpKHtzcmM6bixzdGFydFRpbWU6cix0aXRsZTpvLGNvdmVySW1nVXJsOmF9KSxzLnBsYXkoKSk6InNlZWsiPT09dCYmcyYmcy5zZWVrVG8ocikse2Vyck1zZzppKyI6b2sifX12YXIgZW89InN1Y2Nlc3MiLHRvPSJmYWlsIixubz1bZW8sdG8sImNvbXBsZXRlIl07ZnVuY3Rpb24gcm8oZSx0LG4scil7aWYoZSl7aWYodm9pZCAwPT09bilyZXR1cm4gZVt0XSgpO3ZhciBpPWFvKG4scilbMV07cmV0dXJuIE9iamVjdC5rZXlzKGkpLmxlbmd0aD9lW3RdKHNvKHQsaSkpOmVbdF0oKX19ZnVuY3Rpb24gaW8oZSx0LG4scil7aWYoZSl7dmFyIGk9YW8obixyKSxvPWlbMF0sYT1pWzFdO3JldHVybiBPYmplY3Qua2V5cyhhKS5sZW5ndGg/ZVt0XShvLHNvKHQsYSkpOmVbdF0obyl9fWZ1bmN0aW9uIG9vKGUsdCl7dmFyIG49ZnVuY3Rpb24gZSh0LG4pe2lmKCF0fHwhbilyZXR1cm47aWYobi5hdHRyJiZuLmF0dHIuaWQ9PT10KXJldHVybiBuO3ZhciByPW4uY2hpbGRyZW47aWYoIXIpcmV0dXJuO2Zvcih2YXIgaT0wLG89ci5sZW5ndGg7aTxvO2krKyl7dmFyIGE9ZSh0LHJbaV0pO2lmKGEpcmV0dXJuIGF9fShlLHQuJGVsKTtyZXR1cm4gbnx8Y29uc29sZS5lcnJvcigiQ2FuIG5vdCBmaW5kIGAiK2UrImAiKX1mdW5jdGlvbiBhbyhuLGUpe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpLHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9bltlXTtDKHQpJiYocltlXT10LGRlbGV0ZSBuW2VdKX07cmV0dXJuIG5vLmZvckVhY2godCksZSYmZS5mb3JFYWNoKHQpLFtuLHJdfWZ1bmN0aW9uIHNvKGksbyl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZTtkZWxldGUgZS50eXBlO3ZhciBuPW9bdF07aWYodD09PWVvP2UuZXJyTXNnPWkrIjpvayI6dD09PXRvJiYoZS5lcnJNc2c9aSsiOmZhaWwiKyhlLm1zZz8iICIrZS5tc2c6IiIpKSxkZWxldGUgZS5jb2RlLGRlbGV0ZSBlLm1zZyxDKG4pJiZuKGUpLHQ9PT1lb3x8dD09PXRvKXt2YXIgcj1vLmNvbXBsZXRlO0MocikmJnIoZSl9fX12YXIgY289e2dldENlbnRlckxvY2F0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHJvKGUsImdldENlbnRlckxvY2F0aW9uIix0KX0sbW92ZVRvTG9jYXRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaW8oZSwibW92ZVRvTG9jYXRpb24iLHQpfSx0cmFuc2xhdGVNYXJrZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaW8oZSwidHJhbnNsYXRlTWFya2VyIix0LFsiYW5pbWF0aW9uRW5kIl0pfSxpbmNsdWRlUG9pbnRzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGlvKGUsImluY2x1ZGVQb2ludHMiLHQpfSxnZXRSZWdpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcm8oZSwiZ2V0UmVnaW9uIix0KX0sZ2V0U2NhbGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcm8oZSwiZ2V0U2NhbGUiLHQpfSxhZGRDdXN0b21MYXllcjpmdW5jdGlvbihlLHQpe3JldHVybiBpbyhlLCJhZGRDdXN0b21MYXllciIsdCl9LHJlbW92ZUN1c3RvbUxheWVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGlvKGUsInJlbW92ZUN1c3RvbUxheWVyIix0KX0sYWRkR3JvdW5kT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBpbyhlLCJhZGRHcm91bmRPdmVybGF5Iix0KX0scmVtb3ZlR3JvdW5kT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBpbyhlLCJyZW1vdmVHcm91bmRPdmVybGF5Iix0KX0sdXBkYXRlR3JvdW5kT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBpbyhlLCJ1cGRhdGVHcm91bmRPdmVybGF5Iix0KX0saW5pdE1hcmtlckNsdXN0ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaW8oZSwiaW5pdE1hcmtlckNsdXN0ZXIiLHQpfSxhZGRNYXJrZXJzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGlvKGUsImFkZE1hcmtlcnMiLHQpfSxyZW1vdmVNYXJrZXJzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGlvKGUsInJlbW92ZU1hcmtlcnMiLHQpfSxtb3ZlQWxvbmc6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaW8oZSwibW92ZUFsb25nIix0KX0sc2V0TG9jTWFya2VySWNvbjpmdW5jdGlvbihlLHQpe3JldHVybiBpbyhlLCJzZXRMb2NNYXJrZXJJY29uIix0KX0sb3Blbk1hcEFwcDpmdW5jdGlvbihlLHQpe3JldHVybiBpbyhlLCJvcGVuTWFwQXBwIix0KX0sb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5vbih0Lm5hbWUsdC5jYWxsYmFjayl9fTt2YXIgdW89e3BsYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIHJvKGUsInBsYXkiKX0scGF1c2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHJvKGUsInBhdXNlIil9LHNlZWs6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaW8oZSwic2VlayIsdC5wb3NpdGlvbil9LHN0b3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHJvKGUsInN0b3AiKX0sc2VuZERhbm11OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGlvKGUsInNlbmREYW5tdSIsdCl9LHBsYXliYWNrUmF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiBpbyhlLCJwbGF5YmFja1JhdGUiLHQucmF0ZSl9LHJlcXVlc3RGdWxsU2NyZWVuOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGlvKGUsInJlcXVlc3RGdWxsU2NyZWVuIix0KX0sZXhpdEZ1bGxTY3JlZW46ZnVuY3Rpb24oZSl7cmV0dXJuIHJvKGUsImV4aXRGdWxsU2NyZWVuIil9LHNob3dTdGF0dXNCYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHJvKGUsInNob3dTdGF0dXNCYXIiKX0saGlkZVN0YXR1c0JhcjpmdW5jdGlvbihlKXtyZXR1cm4gcm8oZSwiaGlkZVN0YXR1c0JhciIpfX07dmFyIGxvPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMuY3R4PXR9O2Z1bmN0aW9uIGZvKGUsdCxuLHIpe3ZhciBpPXQuJHBhZ2UuaWQ7ZmcucHVibGlzaEhhbmRsZXIoaSsiLWxpdmVwdXNoZXItIitlLHtsaXZlUHVzaGVySWQ6ZSx0eXBlOm4sZGF0YTpyfSxpKX1sby5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHJvKHRoaXMuY3R4LCJzdGFydCIsZSl9LGxvLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKGUpe3JldHVybiBybyh0aGlzLmN0eCwic3RvcCIsZSl9LGxvLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbihlKXtyZXR1cm4gcm8odGhpcy5jdHgsInBhdXNlIixlKX0sbG8ucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbihlKXtyZXR1cm4gcm8odGhpcy5jdHgsInJlc3VtZSIsZSl9LGxvLnByb3RvdHlwZS5zd2l0Y2hDYW1lcmE9ZnVuY3Rpb24oZSl7cmV0dXJuIHJvKHRoaXMuY3R4LCJzd2l0Y2hDYW1lcmEiLGUpfSxsby5wcm90b3R5cGUuc25hcHNob3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHJvKHRoaXMuY3R4LCJzbmFwc2hvdCIsZSl9LGxvLnByb3RvdHlwZS50b2dnbGVUb3JjaD1mdW5jdGlvbihlKXtyZXR1cm4gcm8odGhpcy5jdHgsInRvZ2dsZVRvcmNoIixlKX0sbG8ucHJvdG90eXBlLnBsYXlCR009ZnVuY3Rpb24oZSl7cmV0dXJuIGlvKHRoaXMuY3R4LCJwbGF5QkdNIixlKX0sbG8ucHJvdG90eXBlLnN0b3BCR009ZnVuY3Rpb24oZSl7cmV0dXJuIHJvKHRoaXMuY3R4LCJzdG9wQkdNIixlKX0sbG8ucHJvdG90eXBlLnBhdXNlQkdNPWZ1bmN0aW9uKGUpe3JldHVybiBybyh0aGlzLmN0eCwicGF1c2VCR00iLGUpfSxsby5wcm90b3R5cGUucmVzdW1lQkdNPWZ1bmN0aW9uKGUpe3JldHVybiBybyh0aGlzLmN0eCwicmVzdW1lQkdNIixlKX0sbG8ucHJvdG90eXBlLnNldEJHTVZvbHVtZT1mdW5jdGlvbihlKXtyZXR1cm4gaW8odGhpcy5jdHgsInNldEJHTVZvbHVtZSIsZSl9LGxvLnByb3RvdHlwZS5zdGFydFByZXZpZXc9ZnVuY3Rpb24oZSl7cmV0dXJuIHJvKHRoaXMuY3R4LCJzdGFydFByZXZpZXciLGUpfSxsby5wcm90b3R5cGUuc3RvcFByZXZpZXc9ZnVuY3Rpb24oZSl7cmV0dXJuIHJvKHRoaXMuY3R4LCJzdG9wUHJldmlldyIsZSl9LGZnLnN1YnNjcmliZSgib25MaXZlUHVzaGVyTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FsbGJhY2tJZCxuPWUuZGF0YTtqLmludm9rZSh0LG4pfSk7dmFyIHBvPXtzdGFydFByZXZpZXc6InByZXZpZXciLHN0b3BQcmV2aWV3OiJzdG9wIn0saG89ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5wYWdlVm09dH07aG8ucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGUsdCl7Zm8odGhpcy5pZCx0aGlzLnBhZ2VWbSwib24iLHtuYW1lOmUsY2FsbGJhY2s6dH0pfSxbInN0YXJ0Iiwic3RvcCIsInBhdXNlIiwicmVzdW1lIiwic3dpdGNoQ2FtZXJhIiwic3RhcnRQcmV2aWV3Iiwic3RvcFByZXZpZXciLCJzbmFwc2hvdCJdLmZvckVhY2goZnVuY3Rpb24ocil7aG8ucHJvdG90eXBlW3JdPWoud2FycChmdW5jdGlvbihlLHQpe2UuY2FsbGJhY2tJZD10O3ZhciBuPXBvW3JdP3BvW3JdOnI7Zm8odGhpcy5pZCx0aGlzLnBhZ2VWbSxuLGUpfSl9KTt2YXIgdm8sZ289MjAwLG1vPVsidW5rbm93biIsIm5vbmUiLCJldGhlcm5ldCIsIndpZmkiLCIyZyIsIjNnIiwiNGciLCI1ZyJdLHlvPSJfX1VOSUFQUF9NQVAiLF9vPSJfZG9jL3VuaWFwcF90ZW1wIixibz1fbysiXyIrRGF0ZS5ub3coKSx3bz1bXTtmdW5jdGlvbiBrbyhlLHQpe3ZvPXZvfHxkZy5hY2NlbGVyb21ldGVyLndhdGNoQWNjZWxlcmF0aW9uKGZ1bmN0aW9uKHQpe3dvLmZvckVhY2goZnVuY3Rpb24oZSl7aGkoZSx7eDp0LnhBeGlzLHk6dC55QXhpcyx6OnQuekF4aXN9KX0pfSxmdW5jdGlvbihlKXt2bz1udWxsLGhpKHQse2Vyck1zZzoic3RhcnRBY2NlbGVyb21ldGVyOmZhaWwgIitlLm1lc3NhZ2V9KX0se2ZyZXF1ZW5jeTpnb30pLHBnKGZ1bmN0aW9uKCl7aGkodCx7ZXJyTXNnOiJzdGFydEFjY2VsZXJvbWV0ZXI6b2sifSl9LGdvKX1mdW5jdGlvbiBTbygpe3JldHVybiB2byYmKGRnLmFjY2VsZXJvbWV0ZXIuY2xlYXJXYXRjaCh2byksdm89bnVsbCkse319dmFyIHhvPXtuYW1lOntnaXZlbk5hbWU6ImZpcnN0TmFtZSIsbWlkZGxlTmFtZToibWlkZGxlTmFtZSIsZmFtaWx5TmFtZToibGFzdE5hbWUifSxuaWNrbmFtZToibmlja05hbWUiLHBob3Rvczp7dHlwZToidXJsIix2YWx1ZToicGhvdG9GaWxlUGF0aCJ9LG5vdGU6InJlbWFyayIscGhvbmVOdW1iZXJzOlt7dHlwZToibW9iaWxlIix2YWx1ZToibW9iaWxlUGhvbmVOdW1iZXIifSx7dHlwZToid29yayIsdmFsdWU6IndvcmtQaG9uZU51bWJlciJ9LHt0eXBlOiJjb21wYW55Iix2YWx1ZToiaG9zdE51bWJlciJ9LHt0eXBlOiJob21lIGZheCIsdmFsdWU6ImhvbWVGYXhOdW1iZXIifSx7dHlwZToid29yayBmYXgiLHZhbHVlOiJ3b3JrRmF4TnVtYmVyIn1dLGVtYWlsczpbe3R5cGU6ImhvbWUiLHZhbHVlOiJlbWFpbCJ9XSx1cmxzOlt7dHlwZToib3RoZXIiLHZhbHVlOiJ1cmwifV0sb3JnYW5pemF0aW9uczpbe3R5cGU6ImNvbXBhbnkiLG5hbWU6Im9yZ2FuaXphdGlvbiIsdGl0bGU6InRpdGxlIn1dLGltczpbe3R5cGU6Im90aGVyIix2YWx1ZToid2VDaGF0TnVtYmVyIn1dLGFkZHJlc3Nlczpbe3R5cGU6Im90aGVyIixwcmVmZXJyZWQ6ITAsY291bnRyeToiYWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoiYWRkcmVzc1N0YXRlIixsb2NhbGl0eToiYWRkcmVzc0NpdHkiLHN0cmVldEFkZHJlc3M6ImFkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6ImFkZHJlc3NQb3N0YWxDb2RlIn0se3R5cGU6ImhvbWUiLGNvdW50cnk6ImhvbWVBZGRyZXNzQ291bnRyeSIscmVnaW9uOiJob21lQWRkcmVzc1N0YXRlIixsb2NhbGl0eToiaG9tZUFkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJob21lQWRkcmVzc1N0cmVldCIscG9zdGFsQ29kZToiaG9tZUFkZHJlc3NQb3N0YWxDb2RlIn0se3R5cGU6ImNvbXBhbnkiLGNvdW50cnk6IndvcmtBZGRyZXNzQ291bnRyeSIscmVnaW9uOiJ3b3JrQWRkcmVzc1N0YXRlIixsb2NhbGl0eToid29ya0FkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJ3b3JrQWRkcmVzc1N0cmVldCIscG9zdGFsQ29kZToid29ya0FkZHJlc3NQb3N0YWxDb2RlIn1dfSxDbz1bInR5cGUiLCJwcmVmZXJyZWQiXTt2YXIgVG89TGkoImJsdWV0b290aCIsIm9uQmx1ZXRvb3RoRGV2aWNlRm91bmQiKSxPbz1MaSgiYmx1ZXRvb3RoIiwib25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2UiKSxBbz1MaSgiYmx1ZXRvb3RoIiwib25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UiKSxFbz1MaSgiYmx1ZXRvb3RoIiwib25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIik7ZnVuY3Rpb24gSW8oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuZGV2aWNlSWQ7dCYmKGUuZGV2aWNlSWQ9dC50b1VwcGVyQ2FzZSgpKTt2YXIgbj1lLnNlcnZpY2VJZDtyZXR1cm4gbiYmKGUuc2VydmljZUlkPW4udG9VcHBlckNhc2UoKSksZX12YXIgJG8sUG89RGkoImJsdWV0b290aCIsIm9wZW5CbHVldG9vdGhBZGFwdGVyIiksTW89RGkoImJsdWV0b290aCIsImNsb3NlQmx1ZXRvb3RoQWRhcHRlciIpLGpvPURpKCJibHVldG9vdGgiLCJnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGUiKSxMbz1EaSgiYmx1ZXRvb3RoIiwic3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IixJbyksTm89RGkoImJsdWV0b290aCIsInN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IiksQm89RGkoImJsdWV0b290aCIsImdldEJsdWV0b290aERldmljZXMiKSxEbz1EaSgiYmx1ZXRvb3RoIiwiZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlcyIsSW8pLFJvPURpKCJibHVldG9vdGgiLCJjcmVhdGVCTEVDb25uZWN0aW9uIixJbyksRm89RGkoImJsdWV0b290aCIsImNsb3NlQkxFQ29ubmVjdGlvbiIsSW8pLFVvPURpKCJibHVldG9vdGgiLCJnZXRCTEVEZXZpY2VTZXJ2aWNlcyIsSW8pLHpvPURpKCJibHVldG9vdGgiLCJnZXRCTEVEZXZpY2VDaGFyYWN0ZXJpc3RpY3MiLElvKSxWbz1EaSgiYmx1ZXRvb3RoIiwibm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsSW8pLHFvPURpKCJibHVldG9vdGgiLCJyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZSIsSW8pLFdvPURpKCJibHVldG9vdGgiLCJ3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLElvKSxIbz1EaSgiYmx1ZXRvb3RoIiwic2V0QkxFTVRVIixJbyksR289RGkoImJsdWV0b290aCIsImdldEJMRURldmljZVJTU0kiLElvKTt2YXIgSm89W107ZnVuY3Rpb24gWG8oZSx0KXskbz0kb3x8ZGcub3JpZW50YXRpb24ud2F0Y2hPcmllbnRhdGlvbihmdW5jdGlvbih0KXtKby5mb3JFYWNoKGZ1bmN0aW9uKGUpe2hpKGUse2RpcmVjdGlvbjp0Lm1hZ25ldGljSGVhZGluZ30pfSl9LGZ1bmN0aW9uKGUpeyRvPW51bGwsaGkodCx7ZXJyTXNnOiJzdGFydENvbXBhc3M6ZmFpbCAiK2UubWVzc2FnZX0pfSx7ZnJlcXVlbmN5OmdvfSkscGcoZnVuY3Rpb24oKXtoaSh0LHtlcnJNc2c6InN0YXJ0Q29tcGFzczpvayJ9KX0sZ28pfWZ1bmN0aW9uIFlvKCl7cmV0dXJuICRvJiYoZGcub3JpZW50YXRpb24uY2xlYXJXYXRjaCgkbyksJG89bnVsbCkse319dmFyIEtvPUxpKCJpYmVhY29uIiwib25CZWFjb25VcGRhdGUiKSxabz1MaSgiaWJlYWNvbiIsIm9uQmVhY29uU2VydmljZUNoYW5nZSIpLFFvPURpKCJpYmVhY29uIiwiZ2V0QmVhY29ucyIpLGVhPURpKCJpYmVhY29uIiwic3RhcnRCZWFjb25EaXNjb3ZlcnkiKSx0YT1EaSgiaWJlYWNvbiIsInN0b3BCZWFjb25EaXNjb3ZlcnkiKTt2YXIgbmE9IkFuZHJvaWQiPT09ZGcub3MubmFtZSYmcGFyc2VJbnQoZGcub3MudmVyc2lvbik8NixyYT1uYT8ic2xpZGUtaW4tcmlnaHQiOiJwb3AtaW4iLGlhPTMwMCxvYT1uYT8ic2xpZGUtb3V0LXJpZ2h0IjoicG9wLW91dCIsYWE9NTAsc2E9Il93d3cvX191bmlhcHB2aWV3Lmh0bWwiLGNhPSJmIix1YT0iaSIsbGE9ImUiLGRhPSJ2LXNob3ciLGZhPSJjIixwYT0icyIsaGE9InNjIix2YT17fSxnYT0iV0VCX0lOVk9LRV9BUFBTRVJWSUNFIjtmdW5jdGlvbiBtYShlLHQpe2lmKGU9PT1nYSlyZXR1cm4gZ2koZ2EsdC5kYXRhLHQud2Vidmlld0lkcyksITA7dmFyIG49dmFbZV07cmV0dXJuISFuJiYobih0KSxuLmtlZXBBbGl2ZXx8ZGVsZXRlIHZhW2VdLCEwKX1mdW5jdGlvbiB5YShlLHQsbil7aWYodm9pZCAwPT09biYmKG49ITApLHZhW2VdKXJldHVybiBjb25zb2xlLndhcm4oIiciK2UrIicgcmVnaXN0ZXJlZDogIit2YVtlXS50b1N0cmluZygpKTt0LmtlZXBBbGl2ZT0hIW4sdmFbZV09dH12YXIgX2E9Il9fVU5JQVBQX1NDQU4iLGJhPSJfd3d3L19fdW5pYXBwc2Nhbi5odG1sIix3YT0ic2NhbkNvZGUiO3ZhciBrYSxTYSx4YSxDYSxUYSxPYT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxTQ0FOX0lEOl9hLFNDQU5fUEFUSDpiYSxzY2FuQ29kZTpmdW5jdGlvbihlLHQpe3ZhciBuPWUub25seUZyb21DYW1lcmE7dm9pZCAwPT09biYmKG49ITEpO3ZhciByPWUuc2NhblR5cGUsaT1lLmF1dG9EZWNvZGVDaGFyU2V0LG89ZGcuYmFyY29kZSxhPXtxckNvZGU6W28uUVIsby5BWlRFQyxvLk1BWElDT0RFXSxiYXJDb2RlOltvLkVBTjEzLG8uRUFOOCxvLlVQQ0Esby5VUENFLG8uQ09EQUJBUixvLkNPREUxMjgsby5DT0RFMzksby5DT0RFOTMsby5JVEYsby5SU1MxNCxvLlJTU0VYUEFOREVEXSxkYXRhbWF0cml4OltvLkRBVEFNQVRSSVhdLHBkZjQxNzpbby5QREY0MTddfSxzPXt9O3Nbby5RUl09IlFSX0NPREUiLHNbby5FQU4xM109IkVBTl8xMyIsc1tvLkVBTjhdPSJFQU5fOCIsc1tvLkRBVEFNQVRSSVhdPSJEQVRBX01BVFJJWCIsc1tvLlVQQ0FdPSJVUENfQSIsc1tvLlVQQ0VdPSJVUENfRSIsc1tvLkNPREFCQVJdPSJDT0RBQkFSIixzW28uQ09ERTM5XT0iQ09ERV8zOSIsc1tvLkNPREU5M109IkNPREVfOTMiLHNbby5DT0RFMTI4XT0iQ09ERV8xMjgiLHNbby5JVEZdPSJDT0RFXzI1IixzW28uUERGNDE3XT0iUERGXzQxNyIsc1tvLkFaVEVDXT0iQVpURUMiLHNbby5SU1MxNF09IlJTU18xNCIsc1tvLlJTU0VYUEFOREVEXT0iUlNTRVhQQU5ERUQiO3ZhciBjLHUsbD0ibGlnaHQiIT09KCJVSVN0YXR1c0JhclN0eWxlQmxhY2tUcmFuc2x1Y2VudCI9PT0oYz1kZy5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSl8fCJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUiPT09Y3x8Im51bGwiPT09Yz9jPSJsaWdodCI6IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0Ij09PWMmJihjPSJkYXJrIiksYyksZD1bXTtBcnJheS5pc0FycmF5KHIpJiZyLmxlbmd0aCYmci5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWFbZV07dCYmKGQ9ZC5jb25jYXQodCkpfSksZC5sZW5ndGh8fChkPWQuY29uY2F0KGEucXJDb2RlKS5jb25jYXQoYS5iYXJDb2RlKS5jb25jYXQoYS5kYXRhbWF0cml4KS5jb25jYXQoYS5wZGY0MTcpKTt2YXIgZj1bXTtufHxmLnB1c2goe2Zsb2F0OiJyaWdodCIsdGV4dDpjdCgidW5pLnNjYW5Db2RlLmFsYnVtIiksZm9udFNpemU6IjE3cHgiLHdpZHRoOiI2MHB4IixvbmNsaWNrOmZ1bmN0aW9uKCl7ZGcuZ2FsbGVyeS5waWNrKGZ1bmN0aW9uKGUpe28uc2NhbihlLGZ1bmN0aW9uKGUsdCxuLHIpe2wmJmRnLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpLHU9e3R5cGU6ZSxjb2RlOnQsY2hhclNldDpyfSxwLmNsb3NlKCJhdXRvIil9LGZ1bmN0aW9uKCl7ZGcubmF0aXZlVUkudG9hc3QoY3QoInVuaS5zY2FuQ29kZS5mYWlsIikpfSxkLGkpfSxmdW5jdGlvbihlKXtlLmNvZGUhPT0oIkFuZHJvaWQiPT09ZGcub3MubmFtZT8xMjotMikmJmRnLm5hdGl2ZVVJLnRvYXN0KGN0KCJ1bmkuc2NhbkNvZGUuZmFpbCIpKX0se211bHRpcGxlOiExLHN5c3RlbTohMSxmaWxlbmFtZTpibysiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITB9KX19KTt2YXIgcD1kZy53ZWJ2aWV3LmNyZWF0ZShiYSxfYSx7dGl0bGVOVmlldzp7YXV0b0JhY2tCdXR0b246ITAsdHlwZToiZmxvYXQiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSIsdGl0bGVDb2xvcjoiI2ZmZmZmZiIsdGl0bGVUZXh0OmN0KCJ1bmkuc2NhbkNvZGUudGl0bGUiKSx0aXRsZVNpemU6IjE3cHgiLGJ1dHRvbnM6Zn0scG9wR2VzdHVyZToiY2xvc2UiLGJhY2tCdXR0b25BdXRvQ29udHJvbDoiY2xvc2UifSx7X191bmlhcHBfdHlwZToic2NhbiIsX191bmlhcHBfZGFyazpsLF9fdW5pYXBwX3NjYW5fdHlwZTpkLF9fdW5pYXBwX2F1dG9fZGVjb2RlX2NoYXJfc2V0OmksX191bmlhcHBfbG9jYWxlOnV0KCksInVuaS1hcHAiOiJub25lIn0pLGg9ZGcubmF0aXZlVUkuc2hvd1dhaXRpbmcoKTtwLmFkZEV2ZW50TGlzdGVuZXIoInRpdGxlVXBkYXRlIixmdW5jdGlvbigpe3Auc2hvdyhyYSxpYSxmdW5jdGlvbigpe2guY2xvc2UoKX0pfSkscC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oKXtoaSh0LHU/e3Jlc3VsdDp1LmNvZGUsc2NhblR5cGU6c1t1LnR5cGVdfHwiIixjaGFyU2V0OnUuY2hhclNldHx8InV0ZjgiLHBhdGg6IiIsZXJyTXNnOiJzY2FuQ29kZTpvayJ9OntlcnJNc2c6InNjYW5Db2RlOmZhaWwgY2FuY2VsIn0pLG1hKHdhKX0pLGwmJihkZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0IikscC5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGUsbj1lLnJlc3VsdDsic3RhcnQiPT09dD9kZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKToiZW5kIiE9PXR8fG58fGRnLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKX0pKSx5YSh3YSxmdW5jdGlvbihlKXtlJiYiY29kZSJpbiBlJiYodT1lKX0sITEpfX0pO2Z1bmN0aW9uIEFhKCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJiJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yJiYib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50PyJ3ZWJ2aWV3IjoidjgifWZ1bmN0aW9uIEVhKCl7cmV0dXJuIGthLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKS5pZH12YXIgSWE9e307ZnVuY3Rpb24gJGEoZSl7dmFyIHQ9ZS5kYXRhJiZlLmRhdGEuX19tZXNzYWdlO2lmKHQmJnQuX19wYWdlKXt2YXIgbj10Ll9fcGFnZSxyPUlhW25dO3ImJnIodCksdC5rZWVwfHxkZWxldGUgSWFbbl19fXZhciBQYT1mdW5jdGlvbihlKXt0aGlzLndlYnZpZXc9ZX07ZnVuY3Rpb24gTWEoZSl7dmFyIHQ9ZS5jb250ZXh0O3ZvaWQgMD09PXQmJih0PXt9KTt2YXIgbj1lLnVybCxyPWUuZGF0YTt2b2lkIDA9PT1yJiYocj17fSk7dmFyIGk9ZS5zdHlsZTt2b2lkIDA9PT1pJiYoaT17fSk7dmFyIG89ZS5vbk1lc3NhZ2UsYT1lLm9uQ2xvc2U7a2E9dC5wbHVzfHxkZyxTYT10LndlZXh8fCgib2JqZWN0Ij09dHlwZW9mIGxnP2xnOm51bGwpLHhhPXQuQnJvYWRjYXN0Q2hhbm5lbHx8KCJvYmplY3QiPT10eXBlb2YgQnJvYWRjYXN0Q2hhbm5lbD9Ccm9hZGNhc3RDaGFubmVsOm51bGwpO3ZhciBzPSJwYWdlIitEYXRlLm5vdygpOyExIT09KGk9T2JqZWN0LmFzc2lnbih7fSxpKSkudGl0bGVOVmlldyYmIm5vbmUiIT09aS50aXRsZU5WaWV3JiYoaS50aXRsZU5WaWV3PU9iamVjdC5hc3NpZ24oe2F1dG9CYWNrQnV0dG9uOiEwLHRpdGxlU2l6ZToiMTdweCJ9LGkudGl0bGVOVmlldykpO3ZhciBjPXt0b3A6MCxib3R0b206MCx1c2luZ0NvbXBvbmVudHM6e30scG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSIsYW5pbWF0aW9uVHlwZToicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjoyMDAsdW5pTlZpZXc6e3BhdGg6KCJzdHJpbmciPT10eXBlb2YgVlVFX0FQUF9URU1QTEFURV9QQVRIP1ZVRV9BUFBfVEVNUExBVEVfUEFUSDoiIikrIi8iK24rIi5qcyIsZGVmYXVsdEZvbnRTaXplOjE2LHZpZXdwb3J0OmthLnNjcmVlbi5yZXNvbHV0aW9uV2lkdGh9fTtpPU9iamVjdC5hc3NpZ24oYyxpKTt2YXIgdSxsLGQ9a2Eud2Vidmlldy5jcmVhdGUoIiIscyxpLHtleHRyYXM6e2Zyb206RWEoKSxydW50aW1lOkFhKCksZGF0YTpPYmplY3QuYXNzaWduKHt9LHIse2Rhcmttb2RlOm1nLmRhcmttb2RlfSksdXNlR2xvYmFsRXZlbnQ6IXhhfX0pO3JldHVybiBkLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixhKSx1PXMsbD1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgbyYmbyhlLmRhdGEpLGUua2VlcHx8ZC5jbG9zZSgiYXV0byIpfSwidjgiPT09QWEoKT94YT8oQ2EmJkNhLmNsb3NlKCksKENhPW5ldyB4YShFYSgpKSkub25tZXNzYWdlPSRhKTpUYXx8KFRhPVNhLnJlcXVpcmVNb2R1bGUoImdsb2JhbEV2ZW50IikpLmFkZEV2ZW50TGlzdGVuZXIoInBsdXNNZXNzYWdlIiwkYSk6d2luZG93Ll9fcGx1c01lc3NhZ2U9JGEsSWFbdV09bCxkLnNob3coaS5hbmltYXRpb25UeXBlLGkuYW5pbWF0aW9uRHVyYXRpb24pLG5ldyBQYShkKX1QYS5wcm90b3R5cGUuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7X19tZXNzYWdlOntkYXRhOmV9fSkpLG49dGhpcy53ZWJ2aWV3LmlkO3hhP25ldyB4YShuKS5wb3N0TWVzc2FnZSh0KTprYS53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyh0LG4pfSxQYS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLndlYnZpZXcuY2xvc2UoKX07dmFyIGphPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNjYW5Db2RlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPSJsaWdodCIhPT0oIlVJU3RhdHVzQmFyU3R5bGVCbGFja1RyYW5zbHVjZW50Ij09PShuPWRnLm5hdmlnYXRvci5nZXRTdGF0dXNCYXJTdHlsZSgpKXx8IlVJU3RhdHVzQmFyU3R5bGVCbGFja09wYXF1ZSI9PT1ufHwibnVsbCI9PT1uP249ImxpZ2h0IjoiVUlTdGF0dXNCYXJTdHlsZURlZmF1bHQiPT09biYmKG49ImRhcmsiKSxuKSxvPU1hKHt1cmw6Il9fdW5pYXBwc2NhbiIsZGF0YTpPYmplY3QuYXNzaWduKHt9LGUse21lc3NhZ2VzOntmYWlsOmN0KCJ1bmkuc2NhbkNvZGUuZmFpbCIpLCJmbGFzaC5vbiI6Y3QoInVuaS5zY2FuQ29kZS5mbGFzaC5vbiIpLCJmbGFzaC5vZmYiOmN0KCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIil9fSksc3R5bGU6e2FuaW1hdGlvblR5cGU6ZS5hbmltYXRpb25UeXBlfHwicG9wLWluIix0aXRsZU5WaWV3OnthdXRvQmFja0J1dHRvbjohMCx0eXBlOiJmbG9hdCIsdGl0bGVUZXh0OmUudGl0bGVUZXh0fHxjdCgidW5pLnNjYW5Db2RlLnRpdGxlIiksdGl0bGVDb2xvcjoiI2ZmZmZmZiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixidXR0b25zOmUub25seUZyb21DYW1lcmE/W106W3t0ZXh0OmUuYWxidW1UZXh0fHxjdCgidW5pLnNjYW5Db2RlLmFsYnVtIiksZm9udFNpemU6IjE3cHgiLHdpZHRoOiI2MHB4IixvbmNsaWNrOmZ1bmN0aW9uKCl7by5zZW5kTWVzc2FnZSh7dHlwZToiZ2FsbGVyeSJ9KX19XX0scG9wR2VzdHVyZToiY2xvc2UiLGJhY2tncm91bmQ6IiMwMDAwMDAiLGJhY2tCdXR0b25BdXRvQ29udHJvbDoiY2xvc2UifSxvbk1lc3NhZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ldmVudCxuPWUuZGV0YWlsOyhyPW4pLmVyck1zZz0ibWFya2VkIj09PXQ/InNjYW5Db2RlOm9rIjoic2NhbkNvZGU6ZmFpbCAiK24ubWVzc2FnZX0sb25DbG9zZTpmdW5jdGlvbigpe2kmJmRnLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpLGhpKHQscnx8e2Vyck1zZzoic2NhbkNvZGU6ZmFpbCBjYW5jZWwifSl9fSk7aSYmKGRnLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKSxvLndlYnZpZXcuYWRkRXZlbnRMaXN0ZW5lcigicG9wR2VzdHVyZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS50eXBlLG49ZS5yZXN1bHQ7InN0YXJ0Ij09PXQ/ZGcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIik6ImVuZCIhPT10fHxufHxkZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iil9KSl9fSk7ZnVuY3Rpb24gTGEoKXtpZigiaW9zIiE9PWRnLm9zLm5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4hMTt2YXIgZT12aSgiZmFjZUlEIik7cmV0dXJuISghZXx8IWUuaXNTdXBwb3J0KCkpfWZ1bmN0aW9uIE5hKCl7cmV0dXJuISghZGcuZmluZ2VycHJpbnR8fCFkZy5maW5nZXJwcmludC5pc1N1cHBvcnQoKSl9ZnVuY3Rpb24gQmEoKXt2YXIgZT1bXTtyZXR1cm4gTmEoKSYmZS5wdXNoKCJmaW5nZXJQcmludCIpLExhKCkmJmUucHVzaCgiZmFjaWFsIikse3N1cHBvcnRNb2RlOmUsZXJyTXNnOiJjaGVja0lzU3VwcG9ydFNvdGVyQXV0aGVudGljYXRpb246b2sifX1mdW5jdGlvbiBEYShlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5jaGVja0F1dGhNb2RlO2lmKCJmaW5nZXJQcmludCI9PT10KXJldHVybiBOYSgpP3tpc0Vucm9sbGVkOmRnLmZpbmdlcnByaW50LmlzS2V5Z3VhcmRTZWN1cmUoKSYmZGcuZmluZ2VycHJpbnQuaXNFbnJvbGxlZEZpbmdlcnByaW50cygpLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpvayJ9Ontpc0Vucm9sbGVkOiExLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpmYWlsIG5vdCBzdXBwb3J0In07aWYoImZhY2lhbCI9PT10KXtpZihMYSgpKXt2YXIgbj12aSgiZmFjZUlEIik7cmV0dXJue2lzRW5yb2xsZWQ6biYmbi5pc0tleWd1YXJkU2VjdXJlKCkmJm4uaXNFbnJvbGxlZEZhY2VJRCgpLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpvayJ9fXJldHVybntpc0Vucm9sbGVkOiExLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpmYWlsIG5vdCBzdXBwb3J0In19cmV0dXJue2lzRW5yb2xsZWQ6ITEsZXJyTXNnOiJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOmZhaWwgbm90IHN1cHBvcnQifX1mdW5jdGlvbiBSYShlKXt2YXIgdD1lLmJ1dHRvbnM7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJnQuZm9yRWFjaChmdW5jdGlvbihlLHQpe3ZhciByO2Uub25jbGljaz0ocj10LGZ1bmN0aW9uKGUpe3ZhciB0PXdnKCk7aWYodC5sZW5ndGgpe2UuaW5kZXg9cjt2YXIgbj10W3QubGVuZ3RoLTFdO24uJHZtJiZuLiR2bS5fX2NhbGxfaG9vayYmbi4kdm0uX19jYWxsX2hvb2soIm9uTmF2aWdhdGlvbkJhckJ1dHRvblRhcCIsZSl9fSl9KSxlfWZ1bmN0aW9uIEZhKG4scil7dmFyIGU9ZnVuY3Rpb24oZSl7aWYocHQoKSlyZXR1cm4gZnQoZSxbWyJ0aXRsZVRleHQiXSxbInNlYXJjaElucHV0IiwicGxhY2Vob2xkZXIiXSxbImJ1dHRvbnMiLCJ0ZXh0Il1dKX0ocik7aWYoIWUpcmV0dXJuIHI7dmFyIGk9ZVswXSxvPWVbMV07cmV0dXJuKGl8fG8pJiZfZy5vbkxvY2FsZUNoYW5nZShmdW5jdGlvbigpe3ZhciBlPWRnLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQobisiIik7aWYoZSl7dmFyIHQ9e307aSYmKHQudGl0bGVUZXh0PXIudGl0bGVUZXh0KSxvJiYodC5zZWFyY2hJbnB1dD17cGxhY2Vob2xkZXI6ci5zZWFyY2hJbnB1dC5wbGFjZWhvbGRlcn0pLGUuc2V0U3R5bGUoe3RpdGxlTlZpZXc6dH0pfX0pLHJ9dmFyIFVhPS8oXGQrKFwuXGQrKT8pW3J8dV1weC9nO2Z1bmN0aW9uIHphKHQpe3ZhciBuPXt9LGU9SlNPTi5zdHJpbmdpZnkodCk7aWYofmUuaW5kZXhPZigidXB4Iil8fH5lLmluZGV4T2YoInJweCIpKXRyeXtuPUpTT04ucGFyc2UoZS5yZXBsYWNlKFVhLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIF9nLnVweDJweChwYXJzZUludCh0KXx8MCkrInB4In0pKX1jYXRjaChlKXtuPXQsY29uc29sZS5lcnJvcihlKX1lbHNlIG49SlNPTi5wYXJzZShlKTtyZXR1cm4gbn12YXIgVmE9WyJuYXZpZ2F0aW9uQmFyQmFja2dyb3VuZENvbG9yIiwibmF2aWdhdGlvbkJhclRleHRTdHlsZSIsIm5hdmlnYXRpb25CYXJUaXRsZVRleHQiLCJuYXZpZ2F0aW9uQmFyU2hhZG93IiwibmF2aWdhdGlvblN0eWxlIiwiZGlzYWJsZVNjcm9sbCIsImJhY2tncm91bmRDb2xvciIsImJhY2tncm91bmRUZXh0U3R5bGUiLCJlbmFibGVQdWxsRG93blJlZnJlc2giLCJvblJlYWNoQm90dG9tRGlzdGFuY2UiLCJ1c2luZ0NvbXBvbmVudHMiLCJ0aXRsZU5WaWV3IiwicHVsbFRvUmVmcmVzaCJdO2Z1bmN0aW9uIHFhKGUsdCxuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9e2JvdW5jZToidmVydGljYWwifTtuLndpbmRvdz16YShPYmplY3QuYXNzaWduKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobWcud2luZG93fHx7fSkpLG4ud2luZG93fHx7fSkpO3ZhciBpPUZzKG4pO09iamVjdC5rZXlzKGkud2luZG93KS5mb3JFYWNoKGZ1bmN0aW9uKGUpey0xPT09VmEuaW5kZXhPZihlKSYmKHJbZV09aS53aW5kb3dbZV0pfSk7dmFyIG89aS53aW5kb3cuYmFja2dyb3VuZENvbG9yOygvXiNbYS16MC05XXs2fSQvaS50ZXN0KG8pfHwidHJhbnNwYXJlbnQiPT09bykmJihyLmJhY2tncm91bmQ/bz1yLmJhY2tncm91bmQ6ci5iYWNrZ3JvdW5kPW8sci5iYWNrZ3JvdW5kQ29sb3JUb3B8fChyLmJhY2tncm91bmRDb2xvclRvcD1vKSxyLmJhY2tncm91bmRDb2xvckJvdHRvbXx8KHIuYmFja2dyb3VuZENvbG9yQm90dG9tPW8pLHIuYW5pbWF0aW9uQWxwaGFCR0NvbG9yfHwoci5hbmltYXRpb25BbHBoYUJHQ29sb3I9byksdm9pZCAwPT09ci53ZWJ2aWV3QkdUcmFuc3BhcmVudCYmKHIud2Vidmlld0JHVHJhbnNwYXJlbnQ9ITApKTt2YXIgYT1mdW5jdGlvbihlLHQpe3ZhciBuPXQud2luZG93LHI9bi50aXRsZU5WaWV3O2lmKHQubWV0YS5zdGF0dXNCYXJTdHlsZT0id2hpdGUiPT09bi5uYXZpZ2F0aW9uQmFyVGV4dFN0eWxlPyJsaWdodCI6ImRhcmsiLCExPT09cnx8ImZhbHNlIj09PXJ8fCJjdXN0b20iPT09bi5uYXZpZ2F0aW9uU3R5bGUmJiFUKHIpfHwiYWx3YXlzIj09PW4udHJhbnNwYXJlbnRUaXRsZSYmIVQocikpcmV0dXJuITE7dmFyIGk9bi50aXRsZUltYWdlfHwiIixvPW4udHJhbnNwYXJlbnRUaXRsZXx8Im5vbmUiLGE9bi5uYXZpZ2F0aW9uQmFyQmFja2dyb3VuZENvbG9yLHM9e2F1dG9CYWNrQnV0dG9uOiF0Lm1ldGEuaXNRdWl0LHRpdGxlVGV4dDoiIj09PWkmJm4ubmF2aWdhdGlvbkJhclRpdGxlVGV4dHx8IiIsdGl0bGVDb2xvcjpOKG4ubmF2aWdhdGlvbkJhclRleHRTdHlsZSksdHlwZTp7bm9uZToiZGVmYXVsdCIsYXV0bzoidHJhbnNwYXJlbnQiLGFsd2F5czoiZmxvYXQifVtvXSxiYWNrZ3JvdW5kQ29sb3I6L14jW2EtejAtOV17Nn0kL2kudGVzdChhKXx8InRyYW5zcGFyZW50Ij09PWE/YToiI2Y4ZjhmOCIsdGFnczoiIj09PWk/W106W3t0YWc6ImltZyIsc3JjOmkscG9zaXRpb246e2xlZnQ6ImF1dG8iLHRvcDoiYXV0byIsd2lkdGg6ImF1dG8iLGhlaWdodDoiMjZweCJ9fV19O3JldHVybiBUKHIpP0ZhKGUsT2JqZWN0LmFzc2lnbihzLFJhKHIpKSk6RmEoZSxzKX0oZSxpKTthJiYoMT09PWUmJm1nLnJlYWxFbnRyeVBhZ2VQYXRoJiYhaS5tZXRhLmlzUXVpdCYmKGEuYXV0b0JhY2tCdXR0b249ITApLHIudGl0bGVOVmlldz1hKTt2YXIgcz1mdW5jdGlvbihlKXt2YXIgdD1lLndpbmRvdztpZih0LmVuYWJsZVB1bGxEb3duUmVmcmVzaHx8dC5wdWxsVG9SZWZyZXNoJiZ0LnB1bGxUb1JlZnJlc2guc3VwcG9ydCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4iQW5kcm9pZCI9PT1kZy5vcy5uYW1lP09iamVjdC5hc3NpZ24obix7c3VwcG9ydDohMCxzdHlsZToiY2lyY2xlIn0pOk9iamVjdC5hc3NpZ24obix7c3VwcG9ydDohMCxzdHlsZToiZGVmYXVsdCIsaGVpZ2h0OiI1MHB4IixyYW5nZToiMjAwcHgiLGNvbnRlbnRkb3duOntjYXB0aW9uOiIifSxjb250ZW50b3Zlcjp7Y2FwdGlvbjoiIn0sY29udGVudHJlZnJlc2g6e2NhcHRpb246IiJ9fSksdC5iYWNrZ3JvdW5kVGV4dFN0eWxlJiYobi5jb2xvcj10LmJhY2tncm91bmRUZXh0U3R5bGUsbi5zbm93Q29sb3I9dC5iYWNrZ3JvdW5kVGV4dFN0eWxlKSxPYmplY3QuYXNzaWduKG4sdC5wdWxsVG9SZWZyZXNofHx7fSksbn19KGkpO3JldHVybiBzJiYoImNpcmNsZSI9PT1zLnN0eWxlJiYoci5ib3VuY2U9Im5vbmUiKSxyLnB1bGxUb1JlZnJlc2g9cyksImhpZGUiPT09ci5wb3BHZXN0dXJlJiZkZWxldGUgci5wb3BHZXN0dXJlLGkubWV0YS5pc1F1aXQmJihyLnBvcEdlc3R1cmU9ImlPUyI9PT1kZy5vcy5uYW1lPyJhcHBiYWNrIjoibm9uZSIpLHQmJmkubWV0YS5pc05WdWUmJihyLnVuaU5WaWV3PXtwYXRoOnQsZGVmYXVsdEZvbnRTaXplOm1nLmRlZmF1bHRGb250U2l6ZSx2aWV3cG9ydDptZy52aWV3cG9ydH0pLG4ubWV0YT1pLm1ldGEscn1mdW5jdGlvbiBXYSgpe19nLm5hdmlnYXRlQmFjayh7ZnJvbToiYmFja2J1dHRvbiJ9KX1mdW5jdGlvbiBIYSgpe3JldHVybiBkZy5uYXZpZ2F0b3IuaXNJbW1lcnNlZFN0YXR1c2JhcigpP01hdGgucm91bmQoImlPUyI9PT1kZy5vcy5uYW1lP2RnLm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpLnRvcDpkZy5uYXZpZ2F0b3IuZ2V0U3RhdHVzYmFySGVpZ2h0KCkpOjB9ZnVuY3Rpb24gR2EoZSx0LG4pe2lmKGUucGF0aCl7dmFyIHI9ZS5zdHlsZXx8e30saT0ibmF2aWdhdGlvbkJhciI9PT1lLnR5cGUsbz0icG9wdXAiPT09ZS50eXBlO2RlbGV0ZSByLnR5cGUsbyYmIWUuaWQmJmNvbnNvbGUud2Fybigic3ViTlZ1ZVsiK2UucGF0aCsiXSBpcyBtaXNzaW5nIGlkIiksci51bmlOVmlldz17cGF0aDplLnBhdGgucmVwbGFjZSgiLm52dWUiLCIuanMiKSxkZWZhdWx0Rm9udFNpemU6bWcuZGVmYXVsdEZvbnRTaXplLHZpZXdwb3J0Om1nLnZpZXdwb3J0fTt2YXIgYSxzPXtfX3VuaWFwcF9ob3N0OnQucGF0aCxfX3VuaWFwcF9vcmlnaW46ci51bmlOVmlldy5wYXRoLnNwbGl0KCI/IilbMF0ucmVwbGFjZSgiLmpzIiwiIiksX191bmlhcHBfb3JpZ2luX2lkOm4uaWQsX191bmlhcHBfb3JpZ2luX3R5cGU6bi5fX3VuaWFwcF90eXBlfTtpPyhyLnBvc2l0aW9uPSJkb2NrIixyLmRvY2s9InRvcCIsci50b3A9MCxyLndpZHRoPSIxMDAlIixyLmhlaWdodD1ydCtIYSgpLGRlbGV0ZSByLmxlZnQsZGVsZXRlIHIucmlnaHQsZGVsZXRlIHIuYm90dG9tLGRlbGV0ZSByLm1hcmdpbik6byYmKHIucG9zaXRpb249ImFic29sdXRlIixhPWJpKHQucGF0aCk/SHM6bixzLl9fdW5pYXBwX21hc2s9ci5tYXNrfHwicmdiYSgwLDAsMCwwLjUpIixzLl9fdW5pYXBwX21hc2tfaWQ9YS5pZCksZGVsZXRlIHIubWFzazt2YXIgYyx1PWRnLndlYnZpZXcuY3JlYXRlKCIiLGUuaWQscixzKTtvP2Z1bmN0aW9uKGUsdCxuKXtuLnBvcHVwU3ViTlZ1ZVdlYnZpZXdzfHwobi5wb3B1cFN1Yk5WdWVXZWJ2aWV3cz17fSksbi5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tlLmlkXT1lO3ZhciByPWZ1bmN0aW9uKCl7bi5zZXRTdHlsZSh7bWFzazoibm9uZSJ9KSxlLmhpZGUoImF1dG8iKX07bi5hZGRFdmVudExpc3RlbmVyKCJtYXNrQ2xpY2siLHIpO3ZhciBpPSExO2UuYWRkRXZlbnRMaXN0ZW5lcigic2hvdyIsZnVuY3Rpb24oKXtpfHwoZGcua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLFdhKSxkZy5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsciksaT0hMCl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoImhpZGUiLGZ1bmN0aW9uKCl7aSYmKGRnLmtleS5yZW1vdmVFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixyKSxkZy5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsV2EpLGk9ITEpfSksZS5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oKXtkZWxldGUgbi5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tlLmlkXSxpJiYoZGcua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLHIpLGRnLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixXYSksaT0hMSl9KX0odSwwLGEpOihjPXUsbi5hcHBlbmQoYykpfX1mdW5jdGlvbiBKYShpKXt2YXIgbixyLG8sZTtpLmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsKG49ZnVuY3Rpb24oZSl7dmFyIHQ9ZS53aWR0aCxuPWUuaGVpZ2h0LHI9e2RldmljZU9yaWVudGF0aW9uOjkwPT09TWF0aC5hYnMoZGcubmF2aWdhdG9yLmdldE9yaWVudGF0aW9uKCkpPyJsYW5kc2NhcGUiOiJwb3J0cmFpdCIsc2l6ZTp7d2luZG93V2lkdGg6TWF0aC5jZWlsKHQpLHdpbmRvd0hlaWdodDpNYXRoLmNlaWwobil9fTtnaSgib25WaWV3RGlkUmVzaXplIixyKSxmZy5lbWl0KCJvblJlc2l6ZSIscixwYXJzZUludChpLmlkKSl9LHI9NTAsKGU9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMsdD10aGlzO2hnKG8pLG89cGcoZnVuY3Rpb24oKXtyZXR1cm4gbi5hcHBseSh0LGUpfSxyKX0pLmNhbmNlbD1mdW5jdGlvbigpe2hnKG8pfSxlKSl9dmFyIFhhLFlhPTIsS2E9InZkU3luYyIsWmE9IndlYnZpZXdSZWFkeSIsUWE9InZkU3luY0NhbGxiYWNrIixlcz0iaW52b2tlQXBpIix0cz0iV0VCX0lOVk9LRV9BUFBTRVJWSUNFIixucz0id2Vidmlld0luc2VydGVkIixycz0id2Vidmlld1JlbW92ZWQiLGlzPSJ3ZWJ2aWV3SWQiO2Z1bmN0aW9uIG9zKGUpe3ZhciBsO2UuYWRkRXZlbnRMaXN0ZW5lcigicG9wR2VzdHVyZSIsZnVuY3Rpb24oZSl7aWYoInN0YXJ0Ij09PWUudHlwZSl7dmFyIHQ9d2coKSxuPXRbdC5sZW5ndGgtMl07bD1maTt2YXIgcj1uJiZuLiRwYWdlLm1ldGEuc3RhdHVzQmFyU3R5bGU7ciYmX2kocil9ZWxzZSBpZigiZW5kIiE9PWUudHlwZXx8ZS5yZXN1bHQpe2lmKCJlbmQiPT09ZS50eXBlJiZlLnJlc3VsdCl7dmFyIGk9d2coKSxvPWkubGVuZ3RoLGE9aVtpLmxlbmd0aC0xXTthJiZhLiRyZW1vdmUoKSxfaSgpLGEmJjE9PT1vJiYodT1hLG1nLnJlYWxFbnRyeVBhZ2VQYXRoJiZ1LiRwYWdlLnJvdXRlPT09bWcuZW50cnlQYWdlUGF0aCk/KG1nLmVudHJ5UGFnZVBhdGg9bWcucmVhbEVudHJ5UGFnZVBhdGgsZGVsZXRlIG1nLnJlYWxFbnRyeVBhZ2VQYXRoLF9nLnJlTGF1bmNoKHt1cmw6KHM9bWcuZW50cnlQYWdlUGF0aCxjPXMsMD09PWMuaW5kZXhPZigiLyIpP3M6Ii8iK3MpfSkpOmZnLmVtaXQoIm9uQXBwUm91dGUiLHt0eXBlOiJuYXZpZ2F0ZUJhY2sifSl9fWVsc2UgX2kobCk7dmFyIHMsYyx1fSl9dmFyIGFzPTIsc3M9e3B1bGxUb1JlZnJlc2g6Im9uUHVsbERvd25SZWZyZXNoIix0aXRsZU5WaWV3U2VhcmNoSW5wdXRDaGFuZ2VkOiJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiLHRpdGxlTlZpZXdTZWFyY2hJbnB1dENvbmZpcm1lZDoib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDb25maXJtZWQiLHRpdGxlTlZpZXdTZWFyY2hJbnB1dENsaWNrZWQ6Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsdGl0bGVOVmlld1NlYXJjaElucHV0Rm9jdXNDaGFuZ2VkOiJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZCJ9O2Z1bmN0aW9uIGNzKGUpe1hhPWV9ZnVuY3Rpb24gdXMoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gbHMoZSx0KXt2YXIgbj10P0kodCx1cyk6IiI7cmV0dXJue3BhdGg6ZS5zdWJzdHIoMSkscXVlcnk6bj9uLnN1YnN0cigxKTpufX1mdW5jdGlvbiBkcyhlLHQsbixyKXtpZih2b2lkIDA9PT1yJiYocj17fSksdC5tZXRhLmlzTlZ1ZSl7dmFyIGk9ZnVuY3Rpb24oKXtyZXR1cm4gcWEobyxlLHQpfSxvPWFzKyssYT1pKCk7YS51bmlQYWdlVXJsPWxzKGUsbiksYS5pc1RhYj0hIXQubWV0YS5pc1RhYkJhcjt2YXIgcz1kZy53ZWJ2aWV3LmNyZWF0ZSgiIixTdHJpbmcobyksYSxPYmplY3QuYXNzaWduKHtudnVlOiEwfSxyKSk7cmV0dXJuIFVzKHMsaSksc31yZXR1cm4gMj09PWFzP2RnLndlYnZpZXcuZ2V0TGF1bmNoV2VidmlldygpOlhhfWZ1bmN0aW9uIGZzKG4sZSx0LHIpe2lmKCIxIj09PW4uaWR8fCFlLm1ldGEuaXNOVnVlKXt2YXIgaT1mdW5jdGlvbigpe3JldHVybiBxYShwYXJzZUludChuLmlkKSwiIixlKX0sbz1pKCk7by51bmlQYWdlVXJsPWxzKHQsciksZS5tZXRhLmlzTlZ1ZT9vLmlzVGFiPSEhZS5tZXRhLmlzVGFiQmFyOm8uZGVidWdSZWZyZXNoPShhPXQsYz1lLHU9KHM9cik/SShzLHVzKToiIix7aXNUYWI6Yy5tZXRhLmlzVGFiQmFyLGFyZ3VtZW50czpKU09OLnN0cmluZ2lmeSh7cGF0aDphLnN1YnN0cigxKSxxdWVyeTp1P3Uuc3Vic3RyKDEpOnV9KX0pLFVzKG4saSksbi5zZXRTdHlsZShvKX12YXIgYSxzLGMsdSxsLGQsZixwLGgsdixnLG0seSxfPWZnLm9uLGI9ZmcuZW1pdDtyZXR1cm4gZD1uLChmPShsPWUpLndpbmRvdy5zdWJOVnVlcykmJmYubGVuZ3RoJiZmLmZvckVhY2goZnVuY3Rpb24oZSl7R2EoZSxsLGQpfSksT2JqZWN0LmtleXMoc3MpLmZvckVhY2goZnVuY3Rpb24odCl7bi5hZGRFdmVudExpc3RlbmVyKHQsZnVuY3Rpb24oZSl7Yihzc1t0XSxlLHBhcnNlSW50KG4uaWQpKX0pfSksKHA9bikucG9wdXBTdWJOVnVlV2Vidmlld3MmJnAuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGZ1bmN0aW9uKCl7T2JqZWN0LmtleXMocC5wb3B1cFN1Yk5WdWVXZWJ2aWV3cykuZm9yRWFjaChmdW5jdGlvbihlKXtwLnBvcHVwU3ViTlZ1ZVdlYnZpZXdzW2VdLmNsb3NlKCJub25lIil9KX0pLEphKG4pLCJpT1MiPT09ZGcub3MubmFtZSYmKCFuLm52dWUmJihoPW4sdj1mZy5zdWJzY3JpYmUsZz1mZy51bnN1YnNjcmliZSxtPWguaWQseT1mdW5jdGlvbihlLHQpe2lmKG09PT10KXtnKFphLHkpLHQ9cGFyc2VJbnQodCk7dmFyIG49d2coITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7aWYoIW4pcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlBhZ2VbIit0KyJdIG5vdCBmb3VuZCIpO24uJHZtLl8kdmQucmVzdG9yZSgpfX0saC5hZGRFdmVudExpc3RlbmVyKCJyZWNvdmVyeSIsZnVuY3Rpb24oZSl7dihaYSx5KX0pKSxvcyhuKSksXyhuLmlkKyIuc3RhcnRQdWxsRG93blJlZnJlc2giLGZ1bmN0aW9uKCl7bi5iZWdpblB1bGxUb1JlZnJlc2goKX0pLF8obi5pZCsiLnN0b3BQdWxsRG93blJlZnJlc2giLGZ1bmN0aW9uKCl7bi5lbmRQdWxsVG9SZWZyZXNoKCl9KSxufXZhciBwcz17fTtmdW5jdGlvbiBocyhlLHQpeyhwc1tlXXx8KHBzW2VdPVtdKSkucHVzaCh0KX12YXIgdnM9ITE7ZnVuY3Rpb24gZ3ModCxlLG4pe3ZzPXtwYXRoOnQsbnZ1ZTp5Zy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT10fSkubWV0YS5pc05WdWUsbmF2aWdhdGU6ZX19ZnVuY3Rpb24gbXMoZSx0LG4pe2lmKG4mJm1nLnNwbGFzaHNjcmVlbiYmbWcuc3BsYXNoc2NyZWVuLmF1dG9jbG9zZSYmIW1nLnNwbGFzaHNjcmVlbi5hbHdheXNTaG93QmVmb3JlUmVuZGVyJiZkZy5uYXZpZ2F0b3IuY2xvc2VTcGxhc2hzY3JlZW4oKSwhbiYmdnMpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIldhaXRpbmcgdG8gbmF2aWdhdGUgdG86ICIrdnMucGF0aCsiLCBkbyBub3Qgb3BlcmF0ZSBjb250aW51b3VzbHk6ICIrZSsiLiIpO2lmKCJuYXRpdmUiPT09bWcucmVuZGVyZXIpcmV0dXJuIDA9PT13ZygpLmxlbmd0aD9ncyhlLHQpOnQoKTt2YXIgcj0hWGF8fFhhJiZYYS5fX3VuaWFwcF9yb3V0ZSxpPVhhJiYhWGEubG9hZGVkO3J8fGk/Z3MoZSx0KTp0KCksaSYmaHMoWGEuaWQseXMpfWZ1bmN0aW9uIHlzKCl7aWYodnMpe3ZhciBlPXZzLm5hdmlnYXRlO3JldHVybiB2cz0hMSxlKCl9fWZ1bmN0aW9uIF9zKCl7aWYoIm5hdGl2ZSI9PT1tZy5yZW5kZXJlcil7aWYoIXZzKXJldHVybjtyZXR1cm4gdnMubnZ1ZT95cygpOnZvaWQgMH12YXIgZT0oWGEmJiFYYS5fX3VuaWFwcF9yb3V0ZXx8KFhhPWRnLndlYnZpZXcuY3JlYXRlKHNhLFN0cmluZyhhcysrKSx7Y29udGVudEFkanVzdDohMX0pKSxYYSk7aWYodnMpcmV0dXJuIHZzLm52dWU/eXMoKTp2b2lkKGUubG9hZGVkP3ZzLm5hdmlnYXRlKCk6aHMoZS5pZCx5cykpfXZhciBicz1PYmplY3QuY3JlYXRlKG51bGwpO3ZhciB3cz1oKGZ1bmN0aW9uKGUpe3JldHVybiBic1tlXSgpfSk7dmFyIGtzPVtdO2Z1bmN0aW9uIFNzKHQsZSl7dmFyIG49ITEscj1tZy5zdWJQYWNrYWdlcztpZihBcnJheS5pc0FycmF5KHIpKXt2YXIgaT1yLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT10LmluZGV4T2YoZS5yb290KX0pO2kmJihuPSEwLGZ1bmN0aW9uKGUsdCl7aWYoLTEhPT1rcy5pbmRleE9mKGUpKXJldHVybiB0KCk7Q3MoW2VdLGZ1bmN0aW9uKCl7dCgpfSl9KGkucm9vdCxlKSl9bnx8ZSgpfXZhciB4cz0iYXBwLXN1Yi1zZXJ2aWNlLmpzIjtmdW5jdGlvbiBDcyhlLHQpe3ZhciBuLHI7bj1lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4ga3MucHVzaChlKSxlKyIvIit4c30pLHI9ZnVuY3Rpb24oZSl7dCYmdCghMCl9LG1nLm9uU2VydmljZVJlYWR5KGZ1bmN0aW9uKCl7bGcucmVxdWlyZU1vZHVsZSgicGx1cyIpLmV2YWxKU0ZpbGVzKG4scil9KX12YXIgVHM9T2JqZWN0LmFzc2lnbjt2YXIgT3M9e3BhdGg6IiIscXVlcnk6e30sc2NlbmU6MTAwMSxyZWZlcnJlckluZm86e2FwcElkOiIiLGV4dHJhRGF0YTp7fX19LEFzPXtwYXRoOiIiLHF1ZXJ5Ont9LHNjZW5lOjEwMDEscmVmZXJyZXJJbmZvOnthcHBJZDoiIixleHRyYURhdGE6e319fTtmdW5jdGlvbiBFcygpe3JldHVybiBPc31mdW5jdGlvbiBJcygpe3ZhciBlPWxnLnJlcXVpcmVNb2R1bGUoInBsdXMiKTtpZihlLmdldFJlZGlyZWN0SW5mbyl7dmFyIHQ9ZS5nZXRSZWRpcmVjdEluZm8oKXx8e30sbj10LnBhdGgscj10LnF1ZXJ5LGk9dC5leHRyYURhdGEsbz10LnVzZXJBY3Rpb24sYT17YXBwSWQ6dC5mcm9tQXBwaWQsZXh0cmFEYXRhOnt9fTtyZXR1cm4gaSYmKGEuZXh0cmFEYXRhPWkpLHtwYXRoOm58fCIiLHF1ZXJ5OnI/Ij8iK3I6IiIscmVmZXJyZXJJbmZvOmEsdXNlckFjdGlvbjpvfX19dmFyICRzPSExO2Z1bmN0aW9uIFBzKCl7aWYoISRzKXt2YXIgZSx0O2lmKCRzPSEwLGxnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRSZWRpcmVjdEluZm8pe3ZhciBuPUlzKCkscj1uLnBhdGgsaT1uLnF1ZXJ5LG89bi5yZWZlcnJlckluZm87ciYmKGU9cix0PWkpLG1nLnJlZmVycmVySW5mbz1vfWVsc2V7dmFyIGE9ZGcucnVudGltZS5hcmd1bWVudHM7aWYoIWEpcmV0dXJuO3RyeXt2YXIgcz1KU09OLnBhcnNlKGEpO2U9cy5wYXRofHxzLnBhdGhOYW1lLHQ9cy5xdWVyeT8iPyIrcy5xdWVyeToiIn1jYXRjaChlKXt9fWlmKGUmJmUhPT1tZy5lbnRyeVBhZ2VQYXRoKXt2YXIgYz0iLyIrZSx1PXlnLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PWN9KTt1Pyh1Lm1ldGEuaXNUYWJCYXJ8fChtZy5yZWFsRW50cnlQYWdlUGF0aD1tZy5yZWFsRW50cnlQYWdlUGF0aHx8bWcuZW50cnlQYWdlUGF0aCksbWcuZW50cnlQYWdlUGF0aD1lLG1nLmVudHJ5UGFnZVF1ZXJ5PXQpOmNvbnNvbGUuZXJyb3IoIlt1bmktYXBwXSAiK2UrIiBub3QgZm91bmQuLi4iKX1lbHNlIHQmJihtZy5lbnRyeVBhZ2VRdWVyeT10KX19dmFyIE1zPVtdO2Z1bmN0aW9uIGpzKGUpe3JldHVybiBlP01zLnNsaWNlKDApOk1zLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS4kcGFnZS5tZXRhLmlzVGFiQmFyfHxlLiRwYWdlLm1ldGEudmlzaWJsZX0pfXZhciBMcz17fTtmdW5jdGlvbiBOcyhlKXt2YXIgdD1lLnVybCxuPWUucGF0aCxpPWUucXVlcnkscj1lLm9wZW5UeXBlLG89ZS53ZWJ2aWV3LGE9ZS5ldmVudENoYW5uZWw7aWYobyYmUHMoKSxMc1t0XSYmKG89THNbdF0pLl9fcGFnZV9fKXtpZighanMoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1vLl9fcGFnZV9ffSkpcmV0dXJuIGEmJihvLl9fcGFnZV9fLmV2ZW50Q2hhbm5lbD1hKSxNcy5wdXNoKG8uX19wYWdlX18pLG87bz1udWxsfXZhciBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoeWcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09bn0pKSk7InJlTGF1bmNoIj09PXJ8fCFtZy5yZWFsRW50cnlQYWdlUGF0aCYmMD09PWpzKCkubGVuZ3RoP3MubWV0YS5pc1F1aXQ9ITA6cy5tZXRhLmlzVGFiQmFyfHwocy5tZXRhLmlzUXVpdD0hMSksbz8obz1kZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKG8uaWQpKS5udnVlPXMubWV0YS5pc05WdWU6bz1kcyhuLHMsaSkscy5tZXRhLmlzVGFiQmFyJiYocy5tZXRhLnZpc2libGU9ITApLHMubWV0YS5pc1RhYkJhciYmSHMuYXBwZW5kKG8pO3ZhciBjPSIxIj09PW8uaWQmJm8ubnZ1ZTtmcyhvLHMsbixpKTt2YXIgdT1uLnNsaWNlKDEpLGw9e3JvdXRlOm8uX191bmlhcHBfcm91dGU9dSxvcHRpb25zOk9iamVjdC5hc3NpZ24oe30saXx8e30pLCRnZXRBcHBXZWJ2aWV3OmZ1bmN0aW9uKCl7cmV0dXJuIGRnLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoby5pZCl9LGV2ZW50Q2hhbm5lbDphLCRwYWdlOntpZDpwYXJzZUludChvLmlkKSxtZXRhOnMubWV0YSxwYXRoOm4scm91dGU6dSxmdWxsUGF0aDp0LG9wZW5UeXBlOnJ9LCRyZW1vdmU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9TXMuZmluZEluZGV4KGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dH0pOy0xIT09ZSYmKG8ubnZ1ZXx8dGhpcy4kdm0uJGRlc3Ryb3koKSxNcy5zcGxpY2UoZSwxKSl9LHNlbGVjdENvbXBvbmVudDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kdm0uc2VsZWN0Q29tcG9uZW50KGUpfSxzZWxlY3RBbGxDb21wb25lbnRzOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiR2bS5zZWxlY3RBbGxDb21wb25lbnRzKGUpfX07aWYoTXMucHVzaChsKSxvLl9fcHJlbG9hZF9fJiYoby5fX3BhZ2VfXz1sKSxjJiYobWcuc3BsYXNoc2NyZWVuJiZtZy5zcGxhc2hzY3JlZW4uYXV0b2Nsb3NlJiYhbWcuc3BsYXNoc2NyZWVuLmFsd2F5c1Nob3dCZWZvcmVSZW5kZXImJmRnLm5hdmlnYXRvci5jbG9zZVNwbGFzaHNjcmVlbigpLG1nLm9uUmVhZHkoZnVuY3Rpb24oKXtfcygpfSkpLCFvLm52dWUpe3ZhciBkPW8uaWQ7dHJ5e1NzKHUsZnVuY3Rpb24oKXt2YXIgZSx0LG4scjsoZT11LHQ9ZCxuPWkscj1sLGJzW2VdfHxjb25zb2xlLmVycm9yKGUrIiBub3QgZm91bmQiKSxuZXcod3MoZSkpKHttcFR5cGU6InBhZ2UiLHBhZ2VJZDp0LHBhZ2VQYXRoOmUscGFnZVF1ZXJ5Om4scGFnZUluc3RhbmNlOnJ9KSkuJG1vdW50KCl9KX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX1yZXR1cm4gb312YXIgQnM9ImFwaS5vblRoZW1lQ2hhbmdlIjtmdW5jdGlvbiBEcyhlKXt2b2lkIDA9PT1lJiYoZT1mdW5jdGlvbigpe30pLGZnLm9uKEJzLGUpfWZ1bmN0aW9uIFJzKCl7aWYobWcuZGFya21vZGUpe3ZhciB0PSJkYXJrIj09PWRnLm5hdmlnYXRvci5nZXRVSVN0eWxlKCk/ImxpZ2h0IjoiZGFyayI7X2kodCksanMoITApLmZvckVhY2goZnVuY3Rpb24oZSl7ZS4kcGFnZS5tZXRhLnN0YXR1c0JhclN0eWxlPXR9KX19ZnVuY3Rpb24gRnMoZSl7aWYobWcuZGFya21vZGUpe3ZhciB0PWRnLm5hdmlnYXRvci5nZXRVSVN0eWxlKCksbj1ZcygpO3JldHVybiBuJiZuLmhvc3RUaGVtZSYmKHQ9bi5ob3N0VGhlbWUpLGZ1bmN0aW9uIG4ocixpLG8pe3ZvaWQgMD09PWkmJihpPXt9KSx2b2lkIDA9PT1vJiYobz0ibGlnaHQiKTt2YXIgYT1pW29dLHM9e307cmV0dXJuIHZvaWQgMCE9PWEmJnI/KE9iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9cltlXTtzW2VdPVQodCk/bih0LGksbyk6dih0KT90Lm1hcChmdW5jdGlvbihlKXtyZXR1cm4gVChlKT9uKGUsaSxvKTpCKGEsZSl9KTpCKGEsdCxlKX0pLHMpOnJ9KGUsbWcudGhlbWVDb25maWcsdCl9cmV0dXJuIGV9ZnVuY3Rpb24gVXMocixpKXtpZihtZy5kYXJrbW9kZSl7dmFyIHQ9ZnVuY3Rpb24oKXt2YXIgZT1pKCksdD17YW5pbWF0aW9uQWxwaGFCR0NvbG9yOmUuYW5pbWF0aW9uQWxwaGFCR0NvbG9yLGJhY2tncm91bmQ6ZS5iYWNrZ3JvdW5kLGJhY2tncm91bmRDb2xvckJvdHRvbTplLmJhY2tncm91bmRDb2xvckJvdHRvbSxiYWNrZ3JvdW5kQ29sb3JUb3A6ZS5iYWNrZ3JvdW5kQ29sb3JUb3B9LG49ZS50aXRsZU5WaWV3O3ZvaWQgMCE9PW4mJih0LnRpdGxlTlZpZXc9Im9iamVjdCI9PXR5cGVvZiBuP3tiYWNrZ3JvdW5kQ29sb3I6bi5iYWNrZ3JvdW5kQ29sb3IsdGl0bGVDb2xvcjpuLnRpdGxlQ29sb3J9Om4pLHImJnIuc2V0U3R5bGUoZSl9O0RzKHQpLHIuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PShlPXQpJiYoZT1mdW5jdGlvbigpe30pLHZvaWQgZmcub2ZmKEJzLGUpO3ZhciBlfSl9fXZhciB6cyxWcyxxcz0hMDt2YXIgV3M9W10sSHM9e2lkOiIwIixpbml0OmZ1bmN0aW9uKGUsbil7ZSYmZS5saXN0Lmxlbmd0aCYmKHpzPWUpO3RyeXtWcz12aSgidW5pLXRhYnZpZXciKX1jYXRjaChlKXtjb25zb2xlLmxvZygndW5pLnJlcXVpcmVOYXRpdmVQbHVnaW4oInVuaS10YWJ2aWV3IikgZXJyb3IgJytlKX1Wcy5vbk1hc2tDbGljayhmdW5jdGlvbigpe1dzLmZvckVhY2goZnVuY3Rpb24oZSl7ZSgpfSl9KSxWcyYmVnMub25DbGljayhmdW5jdGlvbihlKXt2YXIgdD1lLmluZGV4O24oenMubGlzdFt0XSx0KX0pLFZzJiZWcy5vbk1pZEJ1dHRvbkNsaWNrKGZ1bmN0aW9uKCl7Z2koIm9uVGFiQmFyTWlkQnV0dG9uVGFwIix7fSl9KSxmdW5jdGlvbihzLGMpe2lmKG1nLmRhcmttb2RlKXt2YXIgZT1mdW5jdGlvbigpe3ZhciBlPUZzKGMpLHQ9ZS5saXN0O3ZvaWQgMD09PXQmJih0PVtdKTt2YXIgbj1lLmNvbG9yLHI9ZS5zZWxlY3RlZENvbG9yLGk9ZS5iYWNrZ3JvdW5kQ29sb3Isbz1lLmJvcmRlclN0eWxlLGE9ZS5taWRCdXR0b247cyYmKHMuc2V0VGFiQmFyU3R5bGUoe2NvbG9yOm4sc2VsZWN0ZWRDb2xvcjpyLGJhY2tncm91bmRDb2xvcjppLGJvcmRlclN0eWxlOm8sbWlkQnV0dG9uOmF9KSxzLnNldFRhYkJhckl0ZW1zKHtsaXN0OnQubWFwKGZ1bmN0aW9uKGUpe3JldHVybntpY29uUGF0aDplLmljb25QYXRoLHNlbGVjdGVkSWNvblBhdGg6ZS5zZWxlY3RlZEljb25QYXRoLHZpc2libGU6ZS52aXNpYmxlfX0pfSkpfTtlKCksRHMoZSl9fShWcyxlKX0saW5kZXhPZjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmNvbmZpZyxuPXQmJnQubGlzdCYmdC5saXN0Lmxlbmd0aDtpZihuKWZvcih2YXIgcj0wO3I8bjtyKyspaWYodC5saXN0W3JdLnBhZ2VQYXRoPT09ZXx8dC5saXN0W3JdLnBhZ2VQYXRoPT09ZSsiLmh0bWwiKXJldHVybiByO3JldHVybi0xfSxzd2l0Y2hUYWI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5pbmRleE9mKGUpO3JldHVybiAwPD10JiYoVnMmJlZzLnN3aXRjaFNlbGVjdCh7aW5kZXg6dH0pLCEwKX0sc2V0VGFiQmFyQmFkZ2U6ZnVuY3Rpb24oZSx0LG4pe1ZzJiYoIm5vbmUiPT09ZT8oVnMuaGlkZVRhYkJhclJlZERvdCh7aW5kZXg6dH0pLFZzLnJlbW92ZVRhYkJhckJhZGdlKHtpbmRleDp0fSkpOiJ0ZXh0Ij09PWU/VnMuc2V0VGFiQmFyQmFkZ2Uoe2luZGV4OnQsdGV4dDpufSk6InJlZERvdCI9PT1lJiZWcy5zaG93VGFiQmFyUmVkRG90KHtpbmRleDp0fSkpfSxzZXRUYWJCYXJJdGVtOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt2YXIgYSxzPXtpbmRleDplfTtpZih2b2lkIDAhPT10JiYocy50ZXh0PXQpLG4mJihzLmljb25QYXRoPUFpKG4pKSxyJiYocy5zZWxlY3RlZEljb25QYXRoPUFpKHIpKSx2b2lkIDAhPT1vJiYocy5pY29uZm9udD1vKSx2b2lkIDAhPT1pKXtzLnZpc2libGU9enMubGlzdFtlXS52aXNpYmxlPWksZGVsZXRlIHMuaW5kZXg7dmFyIGM9enMubGlzdC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue3Zpc2libGU6ZS52aXNpYmxlfX0pO2NbZV09cyxhPXtsaXN0OmN9LFZzJiZWcy5zZXRUYWJCYXJJdGVtcyhhKX1lbHNlIFZzJiZWcy5zZXRUYWJCYXJJdGVtKHMpfSxzZXRUYWJCYXJTdHlsZTpmdW5jdGlvbihlKXtWcyYmVnMuc2V0VGFiQmFyU3R5bGUoZSl9LGhpZGVUYWJCYXI6ZnVuY3Rpb24oZSl7cXM9ITEsVnMmJlZzLmhpZGVUYWJCYXIoe2FuaW1hdGlvbjplfSl9LHNob3dUYWJCYXI6ZnVuY3Rpb24oZSl7cXM9ITAsVnMmJlZzLnNob3dUYWJCYXIoe2FuaW1hdGlvbjplfSl9LGFwcGVuZDpmdW5jdGlvbih0KXt2YXIgbj10aGlzO1ZzJiZWcy5hcHBlbmQoe2lkOnQuaWR9LGZ1bmN0aW9uKGUpezAhPT1lLmNvZGUmJnBnKGZ1bmN0aW9uKCl7bi5hcHBlbmQodCl9LDIwKX0pfSxnZXQgY29uZmlnKCl7cmV0dXJuIHpzfHxtZy50YWJCYXJ9LGdldCB2aXNpYmxlKCl7cmV0dXJuIHFzfSxnZXQgaGVpZ2h0KCl7dmFyIGU9dGhpcy5jb25maWc7cmV0dXJuKGUmJmUuaGVpZ2h0P3BhcnNlRmxvYXQoZS5oZWlnaHQpOjUwKStkZy5uYXZpZ2F0b3IuZ2V0U2FmZUFyZWFJbnNldHMoKS5kZXZpY2VCb3R0b219LGdldCBjb3Zlcigpe3ZhciBlPXRoaXMuY29uZmlnO3JldHVybiBlJiYwPD1bImV4dHJhbGlnaHQiLCJsaWdodCIsImRhcmsiXS5pbmRleE9mKGUuYmx1ckVmZmVjdCl9LHNldFN0eWxlOmZ1bmN0aW9uKGUpe3ZhciB0PWUubWFzaztWcy5zZXRNYXNrKHtjb2xvcjp0fSl9LGFkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXtXcy5wdXNoKHQpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49V3MuaW5kZXhPZih0KTtXcy5zcGxpY2UobiwxKX19O2Z1bmN0aW9uIEdzKCl7dmFyIGUsdCxuLHIsaT0iaW9zIj09PWRnLm9zLm5hbWUudG9Mb3dlckNhc2UoKSxvPShlPWRnLnNjcmVlbi5nZXRDdXJyZW50U2l6ZSgpLHQ9ZS5yZXNvbHV0aW9uV2lkdGgsbj1lLnJlc29sdXRpb25IZWlnaHQse3NjcmVlbldpZHRoOk1hdGgucm91bmQodCksc2NyZWVuSGVpZ2h0Ok1hdGgucm91bmQobil9KSxhPW8uc2NyZWVuV2lkdGgscz1vLnNjcmVlbkhlaWdodCxjPUhhKCksdT17aGVpZ2h0OjAsY292ZXI6ITF9LGw9Q2koKTtpZihsKXt2YXIgZD1sLmdldFN0eWxlKCk7KGQ9ZCYmZC50aXRsZU5WaWV3KSYmZC50eXBlJiYibm9uZSIhPT1kLnR5cGUmJih1LmhlaWdodD0idHJhbnNwYXJlbnQiPT09ZC50eXBlPzA6YytydCx1LmNvdmVyPSJ0cmFuc3BhcmVudCI9PT1kLnR5cGV8fCJmbG9hdCI9PT1kLnR5cGUpLHI9bC5nZXRTYWZlQXJlYUluc2V0cygpfWVsc2Ugcj1kZy5uYXZpZ2F0b3IuZ2V0U2FmZUFyZWFJbnNldHMoKTt2YXIgZj17aGVpZ2h0OjAsY292ZXI6ITF9O2JpKCkmJihmLmhlaWdodD1Icy52aXNpYmxlP0hzLmhlaWdodDowLGYuY292ZXI9SHMuY292ZXIpO3ZhciBwPXUuY292ZXI/dS5oZWlnaHQ6MCxoPWYuY292ZXI/Zi5oZWlnaHQ6MCx2PXMtdS5oZWlnaHQtZi5oZWlnaHQsZz1zLSh1LmNvdmVyPzA6dS5oZWlnaHQpLShmLmNvdmVyPzA6Zi5oZWlnaHQpLG09YTtmLmhlaWdodCYmIWYuY292ZXJ8fHIuYm90dG9tfHwhci5kZXZpY2VCb3R0b218fCh2LT1yLmRldmljZUJvdHRvbSxnLT1yLmRldmljZUJvdHRvbSk7dmFyIHk9e2xlZnQ6KHI9aT9yOntsZWZ0OjAscmlnaHQ6MCx0b3A6dS5oZWlnaHQmJiF1LmNvdmVyPzA6Yyxib3R0b206MH0pLmxlZnQscmlnaHQ6bS1yLnJpZ2h0LHRvcDpyLnRvcCxib3R0b206Zy1yLmJvdHRvbSx3aWR0aDptLXIubGVmdC1yLnJpZ2h0LGhlaWdodDpnLXIudG9wLXIuYm90dG9tfTtyZXR1cm57cGl4ZWxSYXRpbzpkZy5zY3JlZW4uc2NhbGUsc2NyZWVuV2lkdGg6YSxzY3JlZW5IZWlnaHQ6cyx3aW5kb3dXaWR0aDptLHdpbmRvd0hlaWdodDp2LHN0YXR1c0JhckhlaWdodDpjLHNhZmVBcmVhOnksc2FmZUFyZWFJbnNldHM6e3RvcDpyLnRvcCxyaWdodDpyLnJpZ2h0LGJvdHRvbTpyLmJvdHRvbSxsZWZ0OnIubGVmdH0sd2luZG93VG9wOnAsd2luZG93Qm90dG9tOmgsc2NyZWVuVG9wOnMtdn19dmFyIEpzPXt9LFhzPSEwO2Z1bmN0aW9uIFlzKCl7aWYoWHMpe3ZhciBlPWxnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRTeXN0ZW1JbmZvU3luYztpZigic3RyaW5nIj09dHlwZW9mKEpzPWUoKSkpdHJ5e0pzPUpTT04ucGFyc2UoSnMpfWNhdGNoKGUpe31yZXR1cm4gSnN9fWZ1bmN0aW9uIEtzKCl7WXMoKTt2YXIgZT1Kcy5kZXZpY2VCcmFuZDt2b2lkIDA9PT1lJiYoZT0iIik7dmFyIHQ9SnMuZGV2aWNlTW9kZWwsbj1Kcy5vc05hbWUscj1Kcy5vc1ZlcnNpb24saT1Kcy5kZXZpY2VPcmllbnRhdGlvbixvPUpzLmRldmljZVR5cGUsYT1Kcy5kZXZpY2VJZCxzPUpzLm9zTGFuZ3VhZ2UsYz1Kcy5vc1RoZW1lLHU9SnMucm9tTmFtZSxsPUpzLnJvbVZlcnNpb24sZD1lLnRvTG93ZXJDYXNlKCksZj1uLnRvTG93ZXJDYXNlKCk7cmV0dXJue2JyYW5kOmQsZGV2aWNlQnJhbmQ6ZCxkZXZpY2VNb2RlbDp0LGRldmljZVBpeGVsUmF0aW86ZGcuc2NyZWVuLnNjYWxlLGRldmljZUlkOmEsZGV2aWNlT3JpZW50YXRpb246aSxkZXZpY2VUeXBlOm8sbW9kZWw6dCxwbGF0Zm9ybTpmLHN5c3RlbTooImlvcyI9PT1mPyJpT1MiOiJBbmRyb2lkIikrIiAiK3Isb3NOYW1lOm4sb3NWZXJzaW9uOnIsb3NMYW5ndWFnZTpzLG9zVGhlbWU6Yyxyb21OYW1lOnUscm9tVmVyc2lvbjpsfX1mdW5jdGlvbiBacygpe1lzKCk7dmFyIGU9SnMuaG9zdFBhY2thZ2VOYW1lLHQ9SnMuaG9zdE5hbWUsbj1Kcy5vc0xhbmd1YWdlLHI9SnMuaG9zdFZlcnNpb24saT1Kcy5ob3N0TGFuZ3VhZ2Usbz1Kcy5ob3N0VGhlbWUsYT1Kcy51bmlSdW50aW1lVmVyc2lvbixzPUpzLmFwcElkLGM9SnMuYXBwTmFtZSx1PUpzLmFwcFZlcnNpb24sbD1Kcy5hcHBWZXJzaW9uQ29kZSxkPUpzLmFwcFdndFZlcnNpb24sZj1Kcy51bmlDb21waWxlVmVyc2lvbixwPUpzLnVuaVBsYXRmb3JtO3JldHVybnthcHBJZDpzLGFwcE5hbWU6YyxhcHBWZXJzaW9uOnUsYXBwVmVyc2lvbkNvZGU6bCxhcHBXZ3RWZXJzaW9uOmQsYXBwTGFuZ3VhZ2U6X2cmJl9nLmdldExvY2FsZT9fZy5nZXRMb2NhbGUoKTppLGVuYWJsZURlYnVnOiExLGhvc3RTREtWZXJzaW9uOnZvaWQgMCxob3N0UGFja2FnZU5hbWU6ZSxob3N0TmFtZTp0LGhvc3RWZXJzaW9uOnIsaG9zdExhbmd1YWdlOmksaG9zdFRoZW1lOm8saG9zdEZvbnRTaXplU2V0dGluZzp2b2lkIDAsbGFuZ3VhZ2U6bixTREtWZXJzaW9uOiIiLHRoZW1lOmRnLm5hdmlnYXRvci5nZXRVSVN0eWxlKCksdmVyc2lvbjpkZy5ydW50aW1lLmlubmVyVmVyc2lvbixpc1VuaUFwcFg6ITEsdW5pUGxhdGZvcm06cCx1bmlSdW50aW1lVmVyc2lvbjphLHVuaUNvbXBpbGVWZXJzaW9uOmYsdW5pQ29tcGlsZXJWZXJzaW9uOmZ9fWZ1bmN0aW9uIFFzKCl7WHM9ITAsWXMoKSxYcz0hMTt2YXIgZT1HcygpLHQ9S3MoKSxuPVpzKCk7WHM9ITA7dmFyIHI9e2Vyck1zZzoiZ2V0U3lzdGVtSW5mbzpvayIsZm9udFNpemVTZXR0aW5nOm4uaG9zdEZvbnRTaXplU2V0dGluZyxvc05hbWU6SnMub3NOYW1lLnRvTG93ZXJDYXNlKCl9O0pzLmhvc3ROYW1lJiYoci5ob3N0U0RLVmVyc2lvbj1Kcy51bmlSdW50aW1lVmVyc2lvbik7dmFyIGksbyxhPU9iamVjdC5hc3NpZ24oe30sSnMsZSx0LG4scik7cmV0dXJuIGRlbGV0ZSBhLnNjcmVlblRvcCxkZWxldGUgYS5lbmFibGVEZWJ1ZyxtZy5kYXJrbW9kZXx8ZGVsZXRlIGEudGhlbWUsbz17fSxUKGk9YSkmJk9iamVjdC5rZXlzKGkpLnNvcnQoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe29bZV09aVtlXX0pLE9iamVjdC5rZXlzKG8pP286aX1mdW5jdGlvbiBlYygpe3ZhciBlPSgwLGxnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRBcHBBdXRob3JpemVTZXR0aW5nKSgpO3RyeXsic3RyaW5nIj09dHlwZW9mIGUmJihlPUpTT04ucGFyc2UoZSkpfWNhdGNoKGUpe31mb3IodmFyIHQgaW4gZSl7aWYoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSx0KSkidW5kZWZpbmVkIj09PWVbdF0mJihlW3RdPXZvaWQgMCl9cmV0dXJuIGV9dmFyIHRjPSJ1bmlhcHBfc2F2ZSIsbmM9Il9kb2MvIit0YztmdW5jdGlvbiByYyh0LG4pe249bnx8ZnVuY3Rpb24oKXt9LGRnLmlvLnJlcXVlc3RGaWxlU3lzdGVtKGRnLmlvLlBSSVZBVEVfRE9DLGZ1bmN0aW9uKGUpe2Uucm9vdC5nZXREaXJlY3RvcnkodGMse2NyZWF0ZTohMH0sdCxuKX0sbil9dmFyIGljPTA7dmFyIG9jPURpKCJpbyIsImdldEZpbGVJbmZvIik7dmFyIGFjPSJjaG9vc2VMb2NhdGlvbiI7dmFyIHNjPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNob29zZUxvY2F0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZGcubmF2aWdhdG9yLmdldFN0YXR1c0JhclN0eWxlKCkscj1kZy53ZWJ2aWV3LmNyZWF0ZSgiX3d3dy9fX3VuaWFwcGNob29zZWxvY2F0aW9uLmh0bWwiLHlvLHt0aXRsZU5WaWV3OnthdXRvQmFja0J1dHRvbjohMCxiYWNrZ3JvdW5kQ29sb3I6IiMwMDAwMDAiLHRpdGxlQ29sb3I6IiNmZmZmZmYiLHRpdGxlVGV4dDoi6YCJ5oup5L2N572uIix0aXRsZVNpemU6IjE3cHgiLGJ1dHRvbnM6W3tmbG9hdDoicmlnaHQiLHRleHQ6IuWujOaIkCIsZm9udFNpemU6IjE3cHgiLHdpZHRoOiI2MHB4IixvbmNsaWNrOmZ1bmN0aW9uKCl7ci5ldmFsSlMoIl9fY2hvb3NlTG9jYXRpb25Db25maXJtX18oKSIpfX1dfSxwb3BHZXN0dXJlOiJjbG9zZSIsc2Nyb2xsSW5kaWNhdG9yOiJub25lIn0se19fdW5pYXBwX3R5cGU6Im1hcCIsX191bmlhcHBfc3RhdHVzYmFyX3N0eWxlOm4sInVuaS1hcHAiOiJub25lIn0pOyJkYXJrIj09PW4mJihkZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iiksci5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGUsbj1lLnJlc3VsdDsic3RhcnQiPT09dD9kZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKToiZW5kIiE9PXR8fG58fGRnLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKX0pKTt2YXIgaSxvPTAsYT1mdW5jdGlvbigpezI9PSsrbyYmci5ldmFsSlMoIl9fY2hvb3NlTG9jYXRpb25fXygiK0pTT04uc3RyaW5naWZ5KGUpKyIpIil9O3IuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkIixhKSxyLnNob3coInNsaWRlLWluLWJvdHRvbSIsaWEsYSksci5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oKXtpP2hpKHQse25hbWU6aS5wb2luYW1lLGFkZHJlc3M6aS5wb2lhZGRyZXNzLGxhdGl0dWRlOmkubGF0bG5nLmxhdCxsb25naXR1ZGU6aS5sYXRsbmcubG5nLGVyck1zZzoiY2hvb3NlTG9jYXRpb246b2sifSk6KG1hKGFjKSxoaSh0LHtlcnJNc2c6ImNob29zZUxvY2F0aW9uOmZhaWwgY2FuY2VsIn0pKX0pLHlhKGFjLGZ1bmN0aW9uKGUpe2UmJiJsYXRsbmciaW4gZSYmKGk9ZSl9LCExKX19KTt2YXIgY2M9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2hvb3NlTG9jYXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ImxpZ2h0IiE9PSgiVUlTdGF0dXNCYXJTdHlsZUJsYWNrVHJhbnNsdWNlbnQiPT09KG49ZGcubmF2aWdhdG9yLmdldFN0YXR1c0JhclN0eWxlKCkpfHwiVUlTdGF0dXNCYXJTdHlsZUJsYWNrT3BhcXVlIj09PW58fCJudWxsIj09PW4/bj0ibGlnaHQiOiJVSVN0YXR1c0JhclN0eWxlRGVmYXVsdCI9PT1uJiYobj0iZGFyayIpLG4pLG89TWEoe3VybDoiX191bmlhcHBjaG9vc2Vsb2NhdGlvbiIsZGF0YTpPYmplY3QuYXNzaWduKHt9LGUse2xvY2FsZTp1dCgpfSksc3R5bGU6e2FuaW1hdGlvblR5cGU6ZS5hbmltYXRpb25UeXBlfHwic2xpZGUtaW4tYm90dG9tIix0aXRsZU5WaWV3OiExLHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUifSxvbk1lc3NhZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ldmVudCxuPWUuZGV0YWlsOyJzZWxlY3RlZCI9PT10JiYoKHI9bikuZXJyTXNnPSJjaG9vc2VMb2NhdGlvbjpvayIpfSxvbkNsb3NlOmZ1bmN0aW9uKCl7aSYmZGcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIiksaGkodCxyfHx7ZXJyTXNnOiJjaG9vc2VMb2NhdGlvbjpmYWlsIGNhbmNlbCJ9KX19KTtpJiYoZGcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpLG8ud2Vidmlldy5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGUsbj1lLnJlc3VsdDsic3RhcnQiPT09dD9kZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKToiZW5kIiE9PXR8fG58fGRnLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKX0pKX19KTtmdW5jdGlvbiB1YyhlLHQsbil7dmFyIHIsaT10LmNvb3JkcztlIT09dC5jb29yZHNUeXBlJiYoIndnczg0Ij09PWU/cj1mdW5jdGlvbihlLHQpe2lmKGppKGU9K2UsdD0rdCkpcmV0dXJuW2UsdF07dmFyIG49UGkoZS0xMDUsdC0zNSkscj1NaShlLTEwNSx0LTM1KSxpPXQvMTgwKkVpLG89TWF0aC5zaW4oaSk7bz0xLSRpKm8qbzt2YXIgYT1NYXRoLnNxcnQobyk7cmV0dXJuIG49MTgwKm4vKElpKigxLSRpKS8obyphKSpFaSksWzIqZS0oZSsocj0xODAqci8oSWkvYSpNYXRoLmNvcyhpKSpFaSkpKSwyKnQtKHQrbildfShpLmxvbmdpdHVkZSxpLmxhdGl0dWRlKToiZ2NqMDIiPT09ZSYmKHI9ZnVuY3Rpb24oZSx0KXtpZihqaShlPStlLHQ9K3QpKXJldHVybltlLHRdO3ZhciBuPVBpKGUtMTA1LHQtMzUpLHI9TWkoZS0xMDUsdC0zNSksaT10LzE4MCpFaSxvPU1hdGguc2luKGkpO289MS0kaSpvKm87dmFyIGE9TWF0aC5zcXJ0KG8pO3JldHVybiBuPTE4MCpuLyhJaSooMS0kaSkvKG8qYSkqRWkpLFtlKyhyPTE4MCpyLyhJaS9hKk1hdGguY29zKGkpKkVpKSksdCtuXX0oaS5sb25naXR1ZGUsaS5sYXRpdHVkZSkpLHImJihpLmxvbmdpdHVkZT1yWzBdLGkubGF0aXR1ZGU9clsxXSkpO2hpKG4se3R5cGU6ZSxhbHRpdHVkZTppLmFsdGl0dWRlfHwwLGxhdGl0dWRlOmkubGF0aXR1ZGUsbG9uZ2l0dWRlOmkubG9uZ2l0dWRlLHNwZWVkOmkuc3BlZWQsYWNjdXJhY3k6aS5hY2N1cmFjeSxhZGRyZXNzOnQuYWRkcmVzcyxlcnJNc2c6ImdldExvY2F0aW9uOm9rIn0pfXZhciBsYz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvcGVuTG9jYXRpb246ZnVuY3Rpb24oZSl7dmFyIHQ9ZGcubmF2aWdhdG9yLmdldFN0YXR1c0JhclN0eWxlKCksbj1kZy53ZWJ2aWV3LmNyZWF0ZSgiX3d3dy9fX3VuaWFwcG9wZW5sb2NhdGlvbi5odG1sIix5byx7dGl0bGVOVmlldzp7YXV0b0JhY2tCdXR0b246ITAsdGl0bGVDb2xvcjoiI2ZmZmZmZiIsdGl0bGVUZXh0OiIiLHRpdGxlU2l6ZToiMTdweCIsdHlwZToidHJhbnNwYXJlbnQifSxwb3BHZXN0dXJlOiJjbG9zZSIsc2Nyb2xsSW5kaWNhdG9yOiJub25lIn0se19fdW5pYXBwX3R5cGU6Im1hcCIsX191bmlhcHBfc3RhdHVzYmFyX3N0eWxlOnQsInVuaS1hcHAiOiJub25lIn0pO3JldHVybiJsaWdodCI9PT10JiYoZGcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIiksbi5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGUsbj1lLnJlc3VsdDsic3RhcnQiPT09dD9kZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iik6ImVuZCIhPT10fHxufHxkZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKX0pKSxuLnNob3cocmEsaWEsZnVuY3Rpb24oKXtuLmV2YWxKUygiX19vcGVuTG9jYXRpb25fXygiK0pTT04uc3RyaW5naWZ5KGUpKyIpIil9KSx7ZXJyTXNnOiJvcGVuTG9jYXRpb246b2sifX19KTt2YXIgZGM9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsb3BlbkxvY2F0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIE1hKHt1cmw6Il9fdW5pYXBwb3BlbmxvY2F0aW9uIixkYXRhOk9iamVjdC5hc3NpZ24oe30sZSx7bG9jYWxlOnV0KCl9KSxzdHlsZTp7dGl0bGVOVmlldzp7dHlwZToidHJhbnNwYXJlbnQifSxwb3BHZXN0dXJlOiJjbG9zZSIsYmFja0J1dHRvbkF1dG9Db250cm9sOiJjbG9zZSJ9LG9uQ2xvc2U6ZnVuY3Rpb24oKXtoaSh0LHtlcnJNc2c6Im9wZW5Mb2NhdGlvbjpmYWlsIGNhbmNlbCJ9KX19KSx7ZXJyTXNnOiJvcGVuTG9jYXRpb246b2sifX19KTt2YXIgZmM9W10scGM9W10saGM9ITEsdmM9MDt2YXIgZ2MsbWMseWMsX2MsYmM7dmFyIHdjLGtjLFNjPURpKCJpbyIsImdldEltYWdlSW5mbyIsZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2F2ZVBhdGg9ZS5maWxlbmFtZT1ibysiL2Rvd25sb2FkLyIsZX0pLHhjPURpKCJpbyIsImdldFZpZGVvSW5mbyIsZnVuY3Rpb24oZSl7cmV0dXJuIGUuZmlsZVBhdGg9ZS5zcmMsZX0sZnVuY3Rpb24oZSl7cmV0dXJue29yaWVudGF0aW9uOmUub3JpZW50YXRpb24sdHlwZTplLnR5cGUsZHVyYXRpb246ZS5kdXJhdGlvbixzaXplOmUuc2l6ZS8xMDI0LGhlaWdodDplLmhlaWdodCx3aWR0aDplLndpZHRoLGZwczplLmZwc3x8MzAsYml0cmF0ZTplLmJpdHJhdGV9fSk7dmFyIENjPWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09dCYmKHQ9e30pLGdpKCJvblJlY29yZGVyU3RhdGVDaGFuZ2UiLE9iamVjdC5hc3NpZ24oe3N0YXRlOmV9LHQpKX0sVGM9e3N0YXJ0OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5kdXJhdGlvbjt2b2lkIDA9PT1uJiYobj02ZTQpO3ZhciByPWUuc2FtcGxlUmF0ZSxpPShlLm51bWJlck9mQ2hhbm5lbHMsZS5lbmNvZGVCaXRSYXRlLGUuZm9ybWF0KTt2b2lkIDA9PT1pJiYoaT0ibXAzIik7ZS5mcmFtZVNpemU7dmFyIG89ZS5hdWRpb1NvdXJjZTtpZih2b2lkIDA9PT1vJiYobz0iYXV0byIpLHdjKXJldHVybiBDYygic3RhcnQiKTsod2M9ZGcuYXVkaW8uZ2V0UmVjb3JkZXIoKSkucmVjb3JkKHtmb3JtYXQ6aSxzYW1wbGVyYXRlOnIsZmlsZW5hbWU6Ym8rIi9yZWNvcmRlci8ifSxmdW5jdGlvbihlKXtyZXR1cm4gQ2MoInN0b3AiLHt0ZW1wRmlsZVBhdGg6ZX0pfSxmdW5jdGlvbihlKXtyZXR1cm4gQ2MoImVycm9yIix7ZXJyTXNnOmUubWVzc2FnZX0pfSksa2M9cGcoZnVuY3Rpb24oKXtUYy5zdG9wKCl9LG4pLENjKCJzdGFydCIpfSxzdG9wOmZ1bmN0aW9uKCl7d2MmJih3Yy5zdG9wKCksd2M9ITEsa2MmJmhnKGtjKSl9LHBhdXNlOmZ1bmN0aW9uKCl7d2MmJkNjKCJlcnJvciIse2Vyck1zZzoiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiBwYXVzZSJ9KX0scmVzdW1lOmZ1bmN0aW9uKCl7d2MmJkNjKCJlcnJvciIse2Vyck1zZzoiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiByZXN1bWUifSl9fTt2YXIgT2M9MCxBYz17fSxFYz1mdW5jdGlvbihlKXtnaSgib25Eb3dubG9hZFRhc2tTdGF0ZUNoYW5nZSIsZSl9O3ZhciBJYz0wLCRjPXt9LFBjPWZ1bmN0aW9uKGUpe2dpKCJvblJlcXVlc3RUYXNrU3RhdGVDaGFuZ2UiLGUpLGRlbGV0ZSAkY1tJY119LE1jPWZ1bmN0aW9uKGUpe3ZhciB0PWVbIlNldC1Db29raWUiXXx8ZVsic2V0LWNvb2tpZSJdLG49W107aWYoIXQpcmV0dXJuW107IlsiPT09dFswXSYmIl0iPT09dFt0Lmxlbmd0aC0xXSYmKHQ9dC5zbGljZSgxLC0xKSk7Zm9yKHZhciByPXQuc3BsaXQoIjsiKSxpPTA7aTxyLmxlbmd0aDtpKyspLTEhPT1yW2ldLmluZGV4T2YoIkV4cGlyZXM9Iil8fC0xIT09cltpXS5pbmRleE9mKCJleHBpcmVzPSIpP24ucHVzaChyW2ldLnJlcGxhY2UoIiwiLCIiKSk6bi5wdXNoKHJbaV0pO3JldHVybiBuPW4uam9pbigiOyIpLnNwbGl0KCIsIil9O2Z1bmN0aW9uIGpjKGMsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudXJsLG49ZS5kYXRhLHI9ZS5oZWFkZXIsaT1lLm1ldGhvZDt2b2lkIDA9PT1pJiYoaT0iR0VUIik7dmFyIHU9ZS5yZXNwb25zZVR5cGUsbz1lLnNzbFZlcmlmeTt2b2lkIDA9PT1vJiYobz0hMCk7dmFyIGE9ZS5maXJzdElwdjQ7dm9pZCAwPT09YSYmKGE9ITEpO3ZhciBzPWUudGxzLGw9ZS50aW1lb3V0O3ZvaWQgMD09PWwmJihsPW1nLm5ldHdvcmtUaW1lb3V0JiZtZy5uZXR3b3JrVGltZW91dC5yZXF1ZXN0fHw2ZTQpO3ZhciBkLGYscD12aSgic3RyZWFtIiksaD17fSx2PSExO2Zvcih2YXIgZyBpbiByKWlmKHZ8fCJjb250ZW50LXR5cGUiIT09Zy50b0xvd2VyQ2FzZSgpKWhbZ109cltnXTtlbHNlIGlmKHY9ITAsaFsiQ29udGVudC1UeXBlIl09cltnXSwiR0VUIiE9PWkmJjA9PT1yW2ddLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYic3RyaW5nIiE9dHlwZW9mIG4mJiEobiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSl7dmFyIG09W107Zm9yKHZhciB5IGluIG4payhuLHkpJiZtLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHkpKyI9IitlbmNvZGVVUklDb21wb25lbnQoblt5XSkpO249bS5qb2luKCImIil9dnx8IlBPU1QiIT09aXx8KGhbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiKSxsJiYoZD1wZyhmdW5jdGlvbigpe2Y9ITAsUGMoe3JlcXVlc3RUYXNrSWQ6YyxzdGF0ZToiZmFpbCIsc3RhdHVzQ29kZTowLGVyck1zZzoidGltZW91dCJ9KX0sbCsyMDApKTt2YXIgXyxiPXttZXRob2Q6aSx1cmw6dC50cmltKCksaGVhZGVyczpoLHR5cGU6ImFycmF5YnVmZmVyIj09PXU/ImJhc2U2NCI6InRleHQiLHRpbWVvdXQ6bHx8NmU1LHNzbFZlcmlmeTohbyxmaXJzdElwdjQ6YSx0bHM6c307IkdFVCIhPT1pJiYoIltvYmplY3QgQXJyYXlCdWZmZXJdIj09PXRvU3RyaW5nLmNhbGwobik/Xz0hMDpiLmJvZHk9InN0cmluZyI9PXR5cGVvZiBuP246SlNPTi5zdHJpbmdpZnkobikpO3ZhciB3PWZ1bmN0aW9uKGUpe3ZhciB0PWUub2ssbj1lLnN0YXR1cyxyPWUuZGF0YSxpPWUuaGVhZGVycyxvPWUuZXJyb3JNc2c7aWYoIWYpe2QmJmhnKGQpO3ZhciBhPW47aWYoMDxhKVBjKHtyZXF1ZXN0VGFza0lkOmMsc3RhdGU6InN1Y2Nlc3MiLGRhdGE6dCYmImFycmF5YnVmZmVyIj09PXU/d2kocik6cixzdGF0dXNDb2RlOmEsaGVhZGVyOmksY29va2llczpNYyhpKX0pO2Vsc2V7dmFyIHM9ImFib3J0IHN0YXR1c0NvZGU6IithO28mJihzPXMrIiAiK28pLFBjKHtyZXF1ZXN0VGFza0lkOmMsc3RhdGU6ImZhaWwiLHN0YXR1c0NvZGU6YSxlcnJNc2c6c30pfX19O3RyeXtfP3AuZmV0Y2hXaXRoQXJyYXlCdWZmZXIoeyJAdHlwZSI6ImJpbmFyeSIsYmFzZTY0OmtpKG4pfSxiLHcpOnAuZmV0Y2goYix3KSwkY1tjXT17YWJvcnQ6ZnVuY3Rpb24oKXtmPSEwLGQmJmhnKGQpLFBjKHtyZXF1ZXN0VGFza0lkOmMsc3RhdGU6ImZhaWwiLHN0YXR1c0NvZGU6MCxlcnJNc2c6ImFib3J0In0pfX19Y2F0Y2goZSl7cmV0dXJue3JlcXVlc3RUYXNrSWQ6YyxlcnJNc2c6ImNyZWF0ZVJlcXVlc3RUYXNrOmZhaWwifX1yZXR1cm57cmVxdWVzdFRhc2tJZDpjLGVyck1zZzoiY3JlYXRlUmVxdWVzdFRhc2s6b2sifX12YXIgTGMsTmM9e30sQmM9ZnVuY3Rpb24oZSl7Z2koIm9uU29ja2V0VGFza1N0YXRlQ2hhbmdlIixlKX07dmFyIERjPWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09dCYmKHQ9e30pO3ZhciBuPXQudXJsLHI9KHQuZGF0YSx0LmhlYWRlciksaT0odC5tZXRob2QsdC5wcm90b2NvbHMpLG89TGN8fCgoTGM9dmkoInVuaS13ZWJTb2NrZXQiKSkub25vcGVuKGZ1bmN0aW9uKGUpe0JjKHtzb2NrZXRUYXNrSWQ6ZS5pZCxzdGF0ZToib3BlbiJ9KX0pLExjLm9ubWVzc2FnZShmdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7QmMoe3NvY2tldFRhc2tJZDplLmlkLHN0YXRlOiJtZXNzYWdlIixkYXRhOiJvYmplY3QiPT10eXBlb2YgdD93aSh0LmJhc2U2NCk6dH0pfSksTGMub25lcnJvcihmdW5jdGlvbihlKXtCYyh7c29ja2V0VGFza0lkOmUuaWQsc3RhdGU6ImVycm9yIixlcnJNc2c6ZS5kYXRhfSl9KSxMYy5vbmNsb3NlKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQsbj1lLmNvZGUscj1lLnJlYXNvbjtkZWxldGUgTmNbdF0sQmMoe3NvY2tldFRhc2tJZDp0LHN0YXRlOiJjbG9zZSIsY29kZTpuLHJlYXNvbjpyfSl9KSxMYyk7cmV0dXJuIG8uV2ViU29ja2V0KHtpZDplLHVybDpuLHByb3RvY29sOkFycmF5LmlzQXJyYXkoaSk/aS5qb2luKCIsIik6aSxoZWFkZXI6cn0pLE5jW2VdPW8se3NvY2tldFRhc2tJZDplLGVyck1zZzoiY3JlYXRlU29ja2V0VGFzazpvayJ9fTt2YXIgUmM9MCxGYz17fSxVYz1mdW5jdGlvbihlKXtnaSgib25VcGxvYWRUYXNrU3RhdGVDaGFuZ2UiLGUpfTt2YXIgemMsVmM9e29hdXRoOmZ1bmN0aW9uKHQpe2RnLm9hdXRoLmdldFNlcnZpY2VzKGZ1bmN0aW9uKGUpe3ZhciBuPVtdO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmlkO24ucHVzaCh0KX0pLHQobnVsbCxuLGUpfSxmdW5jdGlvbihlKXt0KGUpfSl9LHNoYXJlOmZ1bmN0aW9uKHQpe2RnLnNoYXJlLmdldFNlcnZpY2VzKGZ1bmN0aW9uKGUpe3ZhciBuPVtdO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmlkO24ucHVzaCh0KX0pLHQobnVsbCxuLGUpfSxmdW5jdGlvbihlKXt0KGUpfSl9LHBheW1lbnQ6ZnVuY3Rpb24odCl7ZGcucGF5bWVudC5nZXRDaGFubmVscyhmdW5jdGlvbihlKXt2YXIgbj1bXTtlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZDtuLnB1c2godCl9KSx0KG51bGwsbixlKX0sZnVuY3Rpb24oZSl7dChlKX0pfSxwdXNoOmZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PWxnfHx2b2lkIDAhPT1kZyl7dmFyIHQ9ZGcucHVzaC5nZXRDbGllbnRJbmZvKCk7ZShudWxsLFt0LmlkXSxbdF0pfWVsc2UgZShudWxsLFtdKX19O2Z1bmN0aW9uIHFjKGkpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuLHIpe2RnLm9hdXRoLmdldFNlcnZpY2VzKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZD09PWl9KTt0P24odCk6cihuZXcgRXJyb3IoInByb3ZpZGVyIG5vdCBmaW5kIikpfSxyKX0pfWZ1bmN0aW9uIFdjKG4scixlKXt2b2lkIDA9PT1lJiYoZT0hMCk7dmFyIGk9bi5wcm92aWRlcnx8IndlaXhpbiIsbz1RYyhyLCJsb2dpbiIsZSksYT0iYXBwbGUiPT09aSxzPWE/e3Njb3BlOiJlbWFpbCJ9Om4udW5pdmVyaWZ5U3R5bGU/e3VuaXZlcmlmeVN0eWxlOmZ1bmN0aW9uKGUscil7VChlKSYmVChlLmJ1dHRvbnMpJiYiQXJyYXkiPT09cChlLmJ1dHRvbnMubGlzdCkmJmUuYnV0dG9ucy5saXN0LmZvckVhY2goZnVuY3Rpb24odCxuKXtlLmJ1dHRvbnMubGlzdFtuXS5vbmNsaWNrPWZ1bmN0aW9uKCl7dmFyIGU9e2NvZGU6IjMwMDA4IixtZXNzYWdlOiLnlKjmiLfngrnlh7vkuoboh6rlrprkuYnmjInpkq4iLGluZGV4Om4scHJvdmlkZXI6dC5wcm92aWRlcn07VCh6Yyk/emMuX3RyaWdnZXJVbml2ZXJpZnlCdXR0b25zQ2xpY2soZSk6SmMoKS50aGVuKGZ1bmN0aW9uKCl7cihlKX0pfX0pO3JldHVybiBlfShuLnVuaXZlcmlmeVN0eWxlLG8pfTp7fSxjPWU/aGk6ai5pbnZva2U7cWMoaSkudGhlbihmdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7bi5vbmx5QXV0aG9yaXplJiYid2VpeGluIj09PWk/ZS5hdXRob3JpemUoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb2RlO2Mocix7Y29kZTp0LGF1dGhSZXN1bHQ6IiIsZXJyTXNnOiJsb2dpbjpvayJ9KX0sbyk6ZS5sb2dpbihmdW5jdGlvbihlKXt2YXIgdD1lLnRhcmdldC5hdXRoUmVzdWx0LG49ZS50YXJnZXQuYXBwbGVJbmZvO2Mocix7Y29kZTp0LmNvZGUsYXV0aFJlc3VsdDp0LGFwcGxlSW5mbzpuLGVyck1zZzoibG9naW46b2sifSl9LG8scyl9YXx8InVuaXZlcmlmeSI9PT1pP3QoKTplLmxvZ291dCh0LHQpfSkuY2F0Y2gobyl9ZnVuY3Rpb24gSGMoYSxzKXt2YXIgYz1hLnByb3ZpZGVyfHwid2VpeGluIixlPUJpKHMsIm9wZXJhdGVXWERhdGEiKTtxYyhjKS50aGVuKGZ1bmN0aW9uKG8pe28uZ2V0VXNlckluZm8oZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIndlaXhpbiI9PT1jKXt2YXIgbj1vLnVzZXJJbmZvO3Q9e29wZW5JZDpuLm9wZW5pZCxuaWNrTmFtZTpuLm5pY2tuYW1lLGdlbmRlcjpuLnNleCxjaXR5Om4uY2l0eSxwcm92aW5jZTpuLnByb3ZpbmNlLGNvdW50cnk6bi5jb3VudHJ5LGF2YXRhclVybDpuLmhlYWRpbWd1cmwsdW5pb25JZDpuLnVuaW9uaWR9fWVsc2UgaWYoImFwcGxlIj09PWMpe3ZhciByPW8uYXBwbGVJbmZvO3Q9e29wZW5JZDpyLnVzZXIsZnVsbE5hbWU6ci5mdWxsTmFtZSxlbWFpbDpyLmVtYWlsLGF1dGhvcml6YXRpb25Db2RlOnIuYXV0aG9yaXphdGlvbkNvZGUsaWRlbnRpdHlUb2tlbjpyLmlkZW50aXR5VG9rZW4scmVhbFVzZXJTdGF0dXM6ci5yZWFsVXNlclN0YXR1c319ZWxzZSh0PW8udXNlckluZm8pLm9wZW5JZD10Lm9wZW5JZHx8dC5vcGVuaWR8fG8uYXV0aFJlc3VsdC5vcGVuaWQsdC5uaWNrTmFtZT10Lm5pY2tOYW1lfHx0Lm5pY2tuYW1lLHQuYXZhdGFyVXJsPXQuYXZhdGFyVXJsfHx0LmhlYWRpbWd1cmw7dmFyIGk9e2Vyck1zZzoib3BlcmF0ZVdYRGF0YTpvayJ9O2EuZGF0YSYmIndlYmFwaV9nZXR1c2VyaW5mbyI9PT1hLmRhdGEuYXBpX25hbWU/aS5kYXRhPXtkYXRhOkpTT04uc3RyaW5naWZ5KHQpLHJhd0RhdGE6IiIsc2lnbmF0dXJlOiIiLGVuY3J5cHRlZERhdGE6IiIsaXY6IiJ9OmkudXNlckluZm89dCxoaShzLGkpfSxlKX0pLmNhdGNoKGZ1bmN0aW9uKCl7aGkocyx7ZXJyTXNnOiJvcGVyYXRlV1hEYXRhOmZhaWwg6K+35YWI6LCD55SoIHVuaS5sb2dpbiJ9KX0pfWZ1bmN0aW9uIEdjKGUsdCxuKXt2YXIgcj1aYyh0LCJwcmVMb2dpbiIsbiksaT1RYyh0LCJwcmVMb2dpbiIsbik7cWMoZS5wcm92aWRlcikudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5wcmVMb2dpbihyLGkpfSkuY2F0Y2goaSl9ZnVuY3Rpb24gSmMoKXtyZXR1cm4gcWMoInVuaXZlcmlmeSIpLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xvc2VBdXRoVmlldygpfSl9ZnVuY3Rpb24gWGMoZSx0LG4pe3ZhciByPVpjKHQsImdldENoZWNrQm94U3RhdGUiLG4pLGk9UWModCwiZ2V0Q2hlY2tCb3hTdGF0ZSIsbik7dHJ5e3FjKCJ1bml2ZXJpZnkiKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0Q2hlY2tCb3hTdGF0ZSgpO3Ioe3N0YXRlOnR9KX0pfWNhdGNoKGUpe2koZSl9fXZhciBZYyxLYz1mdW5jdGlvbigpe3RoaXMucHJvdmlkZXI9InVuaXZlcmlmeSIsdGhpcy5ldmVudE5hbWU9ImFwaS51bml2ZXJpZnlCdXR0b25zQ2xpY2sifTtmdW5jdGlvbiBaYyh0LG4sZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSEwKSxlP05pKHQsbik6ZnVuY3Rpb24oZSl7ai5pbnZva2UodCxPYmplY3QuYXNzaWduKHt9LGUse2Vyck1zZzpuKyI6b2sifSkpfX1mdW5jdGlvbiBRYyhyLGksZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSEwKSxlP0JpKHIsaSk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb2RlO3ZvaWQgMD09PXQmJih0PTApO3ZhciBuPWUubWVzc2FnZTtqLmludm9rZShyLHtlcnJNc2c6aSsiOmZhaWwgIisobnx8IiIpLGVyckNvZGU6dCxjb2RlOnR9KX19S2MucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7SmMoKX0sS2MucHJvdG90eXBlLmxvZ2luPWZ1bmN0aW9uKGUpe3RoaXMuX3dhcnAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gV2MoZSx0LCExKX0sZSl9LEtjLnByb3RvdHlwZS5nZXRDaGVja0JveFN0YXRlPWZ1bmN0aW9uKGUpe3RoaXMuX3dhcnAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gWGMoMCx0LCExKX0sZSl9LEtjLnByb3RvdHlwZS5wcmVMb2dpbj1mdW5jdGlvbihlKXt0aGlzLl93YXJwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIEdjKGUsdCwhMSl9LGUpfSxLYy5wcm90b3R5cGUub25CdXR0b25zQ2xpY2s9ZnVuY3Rpb24oZSl7Zmcub24odGhpcy5ldmVudE5hbWUsZSl9LEtjLnByb3RvdHlwZS5vZmZCdXR0b25zQ2xpY2s9ZnVuY3Rpb24oZSl7Zmcub2ZmKHRoaXMuZXZlbnROYW1lLGUpfSxLYy5wcm90b3R5cGUuX3RyaWdnZXJVbml2ZXJpZnlCdXR0b25zQ2xpY2s9ZnVuY3Rpb24oZSl7ZmcuZW1pdCh0aGlzLmV2ZW50TmFtZSxlKX0sS2MucHJvdG90eXBlLl93YXJwPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGoud2FycChlKSh0aGlzLl9nZXRPcHRpb25zKHQpKX07dmFyIGV1LHR1PSEoS2MucHJvdG90eXBlLl9nZXRPcHRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksT2JqZWN0LmFzc2lnbih7fSxlLHtwcm92aWRlcjp0aGlzLnByb3ZpZGVyfSl9KSxudT0hMTtmdW5jdGlvbiBydShlKXtyZXR1cm4gbGcucmVxdWlyZU1vZHVsZShlKX12YXIgaXU9ezA6e25hbWU6IndlYiIsdGl0bGU6IuWbvuaWhyJ9LDE6e25hbWU6InRleHQiLHRpdGxlOiLnuq/mloflrZcifSwyOntuYW1lOiJpbWFnZSIsdGl0bGU6Iue6r+WbvueJhyJ9LDM6e25hbWU6Im11c2ljIix0aXRsZToi6Z+z5LmQIn0sNDp7bmFtZToidmlkZW8iLHRpdGxlOiLop4bpopEifSw1OntuYW1lOiJtaW5pUHJvZ3JhbSIsdGl0bGU6IuWwj+eoi+W6jyJ9fSxvdT1mdW5jdGlvbihlLHQsbil7ZS50eXBlPWUudHlwZXx8MDt2YXIgcj1lLnByb3ZpZGVyLGk9ZS50eXBlLG89ZS50aXRsZSxhPWUuc3VtbWFyeSxzPWUuaHJlZixjPWUuaW1hZ2VVcmwsdT1lLm1lZGlhVXJsLGw9ZS5zY2VuZSxkPWUubWluaVByb2dyYW0sZj1lLm9wZW5DdXN0b21lclNlcnZpY2VDaGF0LHA9ZS5jb3JwaWQsaD1lLmN1c3RvbWVyVXJsOyJzdHJpbmciPT10eXBlb2YgYyYmYyYmKGM9QWkoYykpO3ZhciB2PWl1W2krIiJdO2lmKHYpe3ZhciBnPXtwcm92aWRlcjpyLHR5cGU6di5uYW1lLHRpdGxlOm8sY29udGVudDphLGhyZWY6cyxwaWN0dXJlczpbY10sdGh1bWJzOltjXSxtZWRpYTp1LG1pbmlQcm9ncmFtOmQsZXh0cmE6e3NjZW5lOmx9LG9wZW5DdXN0b21lclNlcnZpY2VDaGF0OmYsY29ycGlkOnAsdXJsOmh9O3JldHVybiJ3ZWl4aW4iIT09cnx8MSE9PWkmJjIhPT1pfHxkZWxldGUgZy50aHVtYnMsZ31yZXR1cm4i5YiG5Lqr5Y+C5pWwIHR5cGUg5LiN5q2j56GuIn0sYXU9ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9InNoYXJlIik7dmFyIGk9QmkobixyKSxvPXQub3BlbkN1c3RvbWVyU2VydmljZUNoYXQ/Im9wZW5DdXN0b21lclNlcnZpY2VDaGF0Ijoic2VuZCI7dHJ5e2Vbb10odCxmdW5jdGlvbigpe2hpKG4se2Vyck1zZzpyKyI6b2sifSl9LGkpfWNhdGNoKGUpe2koe21lc3NhZ2U6dC5wcm92aWRlcisiICIrbysiIOaWueazleiwg+eUqOWksei0pSJ9KX19O2Z1bmN0aW9uIHN1KG4scixpKXt2b2lkIDA9PT1pJiYoaT0ic2hhcmUiKSxuPW91KG4pO3ZhciBvPUJpKHIsaSk7aWYoInN0cmluZyI9PXR5cGVvZiBuKXJldHVybiBoaShyLHtlcnJNc2c6aSsiOmZhaWwgIitufSk7dmFyIGE9bi5wcm92aWRlcjtkZy5zaGFyZS5nZXRTZXJ2aWNlcyhmdW5jdGlvbihlKXt2YXIgdD1lLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaWQ9PT1hfSk7dD90LmF1dGhlbnRpY2F0ZWQ/YXUodCxuLHIpOnQuYXV0aG9yaXplKGZ1bmN0aW9uKCl7cmV0dXJuIGF1KHQsbixyKX0sbyk6aGkocix7ZXJyTXNnOmkrIjpmYWlsIHNlcnZpY2Ugbm90IGZvdW5kIn0pfSxvKX1mdW5jdGlvbiBjdShuKXtuLiRwcm9jZXNzZWQ9ITAsbi5wb3N0TWVzc2FnZT1mdW5jdGlvbihlKXtkZy53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyh7dHlwZToiVW5pQXBwU3ViTlZ1ZSIsZGF0YTplfSxuLmlkKX07dmFyIHI9W107aWYobi5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7ci5wdXNoKGUpfSxuLiRjb25zdW1lTWVzc2FnZT1mdW5jdGlvbih0KXtyLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KX0sbi5fX3VuaWFwcF9tYXNrX2lkKXt2YXIgaT1uLl9fdW5pYXBwX21hc2ssbz0iMCI9PT1uLl9fdW5pYXBwX21hc2tfaWQ/e3NldFN0eWxlOmZ1bmN0aW9uKGUpe3ZhciB0PWUubWFzaztydSgidW5pLXRhYnZpZXciKS5zZXRNYXNrKHtjb2xvcjp0fSl9fTpkZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKG4uX191bmlhcHBfbWFza19pZCksYT1uLnNob3cscz1uLmhpZGUsYz1uLmNsb3NlLHU9ZnVuY3Rpb24oKXtvLnNldFN0eWxlKHttYXNrOiJub25lIn0pfTtuLnNob3c9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIG8uc2V0U3R5bGUoe21hc2s6aX0pLGEuYXBwbHkobixlKX0sbi5oaWRlPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiB1KCkscy5hcHBseShuLGUpfSxuLmNsb3NlPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiB1KCkscj1bXSxjLmFwcGx5KG4sZSl9fX1mdW5jdGlvbiB1dShlKXt2YXIgdD1kZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKGUpO2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gZmluZCBTdWJOVnVlLCBpZD0iK2UpO3QmJiF0LiRwcm9jZXNzZWQmJmN1KHQpO3ZhciBuPXQuc2V0U3R5bGUscj1kZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHQuX191bmlhcHBfbWFza19pZCk7cmV0dXJuIHQuc2V0U3R5bGU9ZnVuY3Rpb24oZSl7ZSYmZS5tYXNrJiYociYmci5zZXRTdHlsZSh7bWFzazplLm1hc2t9KSxkZWxldGUgZS5tYXNrKSxuLmNhbGwodGhpcyxlKX0sdH12YXIgbHU9W107ZnVuY3Rpb24gZHUoZSx0LG4pe3JldHVybiBsZy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuc2VuZE5hdGl2ZUV2ZW50KGUsdCxuKX1mZy5vbigiYXBpLnVuaU1QTmF0aXZlRXZlbnQiLGZ1bmN0aW9uKHQpe2x1LmZvckVhY2goZnVuY3Rpb24oZSl7aGkoZSx0LmV2ZW50LHQuZGF0YSl9KX0pO3ZhciBmdT1kdTt2YXIgcHUsaHU9MSx2dT17fTtmdW5jdGlvbiBndShlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0Tm9kZUlkJiZlLnBhZ2VJZH1mdW5jdGlvbiBtdSh0LG4scixpKXtpZigiZnVuY3Rpb24iPT10eXBlb2YodD1mdW5jdGlvbiBlKHQpe3ZhciBuPXQmJnQuX192X3JhdztyZXR1cm4gbj9lKG4pOnR9KHQpKSl7dmFyIGU7aWYocil7dmFyIG89T2JqZWN0LmtleXMobikuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gbltlXT09PXR9KTtlPW8/cGFyc2VJbnQobyk6aHUrKyxuW2VdPXR9ZWxzZSBlPWh1KyssbltlXT10O3JldHVybiBlfWlmKHYodCkpcmV0dXJuIGkuZGVwdGgrKyx0Lm1hcChmdW5jdGlvbihlKXtyZXR1cm4gbXUoZSxuLHIsaSl9KTtpZih0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpcmV0dXJuIDA8aS5kZXB0aCYmKGkubmVzdGVkPSEwKSxoPXQsInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlcldyYXBwZXI/e19fdHlwZV9fOiJBcnJheUJ1ZmZlciIsdmFsdWU6bmV3IEFycmF5QnVmZmVyV3JhcHBlcihoKX06e19fdHlwZV9fOiJBcnJheUJ1ZmZlciIsdmFsdWU6aH07aWYoVCh0KXx8Z3UodCkpe3ZhciBhPWZ1bmN0aW9uKGUpe2lmKGd1KGUpKXJldHVybiBlfSh0KSxzPWE/dm9pZCAwOmZ1bmN0aW9uKGUpe2lmKCh0PWUpJiZ0LiQmJnQuJC5wcm94eT09PXQpcmV0dXJuIGUuJGVsO3ZhciB0fSh0KSxjPWF8fHM7aWYoYylyZXR1cm4gMDxpLmRlcHRoJiYoaS5uZXN0ZWQ9ITApLGQ9YT8iVW5pRWxlbWVudCI6IkNvbXBvbmVudFB1YmxpY0luc3RhbmNlIixwPWY9IiIsKGw9YykmJmwuZ2V0Tm9kZUlkJiYocD1sLnBhZ2VJZCxmPWwuZ2V0Tm9kZUlkKCkpLHtfX3R5cGVfXzpkLHBhZ2VJZDpwLG5vZGVJZDpmfTt2YXIgdT17fTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihlKXtpLmRlcHRoKyssdVtlXT1tdSh0W2VdLG4scixpKX0pLHV9dmFyIGwsZCxmLHAsaDtyZXR1cm4gdH1mdW5jdGlvbiB5dSgpe3JldHVybiBwdXx8KHB1PV9nLnJlcXVpcmVOYXRpdmVQbHVnaW4oIlVUUy1Qcm94eSIpKSxwdX1mdW5jdGlvbiBfdShlLHQsbixyLGkpe2lmKCF0KXRocm93IG5ldyBFcnJvcigi6L+U5Zue5YC85Li677yaIitKU09OLnN0cmluZ2lmeSh0KSsi77yb6K+35rGC5Y+C5pWw5Li677yaIitKU09OLnN0cmluZ2lmeShlKSk7aWYobCh0KSl0cnl7dD1KU09OLnBhcnNlKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcigiSlNPTi5wYXJzZSgiK3QrIik6ICIrZSl9aWYodC5lcnJNc2cpdGhyb3cgbmV3IEVycm9yKHQuZXJyTXNnKTtpZihuJiYiaW50ZXJmYWNlIj09PW4udHlwZSYmIm51bWJlciI9PXR5cGVvZiB0LnBhcmFtcyl7aWYoIXQucGFyYW1zKXJldHVybiBudWxsO2lmKHQucGFyYW1zPT09ciYmaSlyZXR1cm4gaTtpZihJdVtuLm9wdGlvbnNdKXJldHVybiBuZXcoVHUoXyh7aW5zdGFuY2VJZDp0LnBhcmFtc30sSXVbbi5vcHRpb25zXSkpKX1yZXR1cm4gdC5wYXJhbXN9ZnVuY3Rpb24gYnUoZSl7aWYoZS5lcnJNc2cpdGhyb3cgbmV3IEVycm9yKGUuZXJyTXNnKTtyZXR1cm4gZGVsZXRlIGUuZXJyTXNnLF91KGUseXUoKS5pbnZva2VTeW5jKGUsZnVuY3Rpb24oKXt9KSl9ZnVuY3Rpb24gd3UoZSxhLHQscyxjKXt2YXIgdT10Lm1vZHVsZU5hbWUsbj10Lm1vZHVsZVR5cGUsbD10LnBhY2thZ2UsZD10LmNsYXNzLGY9dC5uYW1lLHI9dC5tZXRob2QsaT10LmNvbXBhbmlvbixwPXQua2VlcEFsaXZlLG89dC5wYXJhbXMsaD10LnJldHVybix2PXQuZXJyTXNnO3B8fChwPSgwPT09Zi5pbmRleE9mKCJvbiIpfHwwPT09Zi5pbmRleE9mKCJvZmYiKSkmJjE9PT1vLmxlbmd0aCYmIlVUU0NhbGxiYWNrIj09PW9bMF0udHlwZSk7dmFyIGc9cz97bW9kdWxlTmFtZTp1LG1vZHVsZVR5cGU6bixpZDpzLHR5cGU6ZSxuYW1lOmYsbWV0aG9kOm8sbmVzdGVkOiExLGtlZXBBbGl2ZTpwfTp7bW9kdWxlTmFtZTp1LG1vZHVsZVR5cGU6bixwYWNrYWdlOmwsY2xhc3M6ZCxuYW1lOnJ8fGYsdHlwZTplLGNvbXBhbmlvbjppLG1ldGhvZDpvLG5lc3RlZDohMSxrZWVwQWxpdmU6cH07cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2lmKHYpdGhyb3cgbmV3IEVycm9yKHYpO3ZhciBvPXA/dnU6e30scj1mdW5jdGlvbihlKXt2YXIgdD1lLmlkLG49ZS5uYW1lLHI9ZS5wYXJhbXMsaT1vW3RdO2k/KGkuYXBwbHkodm9pZCAwLHIpLHB8fGRlbGV0ZSBvW3RdKTpjb25zb2xlLmVycm9yKCJ1dHPmj5Lku7ZbIit1KyJdICIrbCtkKyIuIitmLnJlcGxhY2UoIkJ5SnMiLCIiKSsiICIrbisi5Zue6LCD5Ye95pWw5bey6YeK5pS+77yM5LiN6IO95YaN5qyh5omn6KGM77yM5Y+C6ICD5paH5qGj77yaaHR0cHM6Ly9kb2MuZGNsb3VkLm5ldC5jbi91bmktYXBwLXgvcGx1Z2luL3V0cy1wbHVnaW4uaHRtbCNrZWVwYWxpdmUiKX0sbj17ZGVwdGg6MCxuZXN0ZWQ6ITF9LGk9Xyh7fSxnLHtwYXJhbXM6ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG11KGUsbyxwLG4pfSl9KTtyZXR1cm4gaS5uZXN0ZWQ9bi5uZXN0ZWQsYT9uZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe3l1KCkuaW52b2tlQXN5bmMoaSxmdW5jdGlvbihlKXsicmV0dXJuIiE9PWUudHlwZT9yKGUpOmUuZXJyTXNnP24oZS5lcnJNc2cpOnQoZS5wYXJhbXMpfSl9KTpfdShpLHl1KCkuaW52b2tlU3luYyhpLHIpLGgscyxjKX19ZnVuY3Rpb24ga3UoZSx0KXtyZXR1cm4gdC5tYWluJiYhdC5tZXRob2QmJkF1KCkmJih0Lm1ldGhvZD0ic18iK3QubmFtZSksd3UoIm1ldGhvZCIsZSx0LDApfXZhciBTdT1rdTtmdW5jdGlvbiB4dShlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmayh0LGUrIkJ5SnMiKT9lKyJCeUpzIjplfWZ1bmN0aW9uIEN1KGUpe3JldHVybiJfXyRzZXQiK3koZSl9ZnVuY3Rpb24gVHUoZSl7dmFyIG4scD1lLm1vZHVsZU5hbWUsaD1lLm1vZHVsZVR5cGUsdD1lLnBhY2thZ2Uscj1lLmNsYXNzLHY9ZS5tZXRob2RzLGc9ZS5wcm9wcyxvPWUuc2V0dGVycyxtPWUuZXJyTXNnLHk9e21vZHVsZU5hbWU6cCxtb2R1bGVUeXBlOmgscGFja2FnZTp0LGNsYXNzOnIsZXJyTXNnOm19LGk9W10sYz17fSx1PVtdLGE9e30scz0hMTt2b2lkIDAhPT1lLmluc3RhbmNlSWQ/KHM9ITAsbj1lLmluc3RhbmNlSWQpOihpPWUuY29uc3RydWN0b3IucGFyYW1zLGM9ZS5zdGF0aWNNZXRob2RzLHU9ZS5zdGF0aWNQcm9wcyxhPWUuc3RhdGljU2V0dGVycyksQXUoKSYmaS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiJVVFNDYWxsYmFjayI9PT1lLnR5cGV8fDA8ZS50eXBlLmluZGV4T2YoIkpTT05PYmplY3QiKX0pJiZpLnB1c2goe25hbWU6Il9ieUpzIix0eXBlOiJib29sZWFuIn0pO3ZhciBsPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2lmKHRoaXMuX19pbnN0YW5jZUlkPTAsbSl0aHJvdyBuZXcgRXJyb3IobSk7dmFyIGw9e307aWYocz8ibnVtYmVyIj09dHlwZW9mIG4mJih0aGlzLl9faW5zdGFuY2VJZD1uKTp0aGlzLl9faW5zdGFuY2VJZD13dSgiY29uc3RydWN0b3IiLCExLF8oe25hbWU6ImNvbnN0cnVjdG9yIixrZWVwQWxpdmU6ITEscGFyYW1zOml9LHkpLDApLmFwcGx5KG51bGwsZSksIXRoaXMuX19pbnN0YW5jZUlkKXRocm93IG5ldyBFcnJvcigibmV3ICIrcisiIGlzIGZhaWxlZCIpO3ZhciBkPXRoaXMsZj1uZXcgUHJveHkoZCx7Z2V0OmZ1bmN0aW9uKGUsdCl7aWYoIl9fdl9za2lwIj09PXQpcmV0dXJuITA7aWYoIWxbdF0paWYodD14dSh0LHYpLGsodix0KSl7dmFyIG49dlt0XSxyPW4uYXN5bmMsaT1uLmtlZXBBbGl2ZSxvPW4ucGFyYW1zLGE9bi5yZXR1cm47bFt0XT0ocz0hIXIsYz1fKHtuYW1lOnQsa2VlcEFsaXZlOmkscGFyYW1zOm8scmV0dXJuOmF9LHkpLHU9ZC5fX2luc3RhbmNlSWQsd3UoIm1ldGhvZCIscyxjLHUsZikpfWVsc2UgaWYoZy5pbmNsdWRlcyh0KSlyZXR1cm4gYnUoe21vZHVsZU5hbWU6cCxtb2R1bGVUeXBlOmgsaWQ6ZC5fX2luc3RhbmNlSWQsdHlwZToiZ2V0dGVyIixrZWVwQWxpdmU6ITEsbmVzdGVkOiExLG5hbWU6dCxlcnJNc2c6bX0pO3ZhciBzLGMsdTtyZXR1cm4gbFt0XX0sc2V0OmZ1bmN0aW9uKGUsdCxuKXtpZihnLmluY2x1ZGVzKHQpKXt2YXIgcj1DdSh0KTtpZighbFtyXSl7dmFyIGk9b1t0XTtpJiYobFtyXT13dSgic2V0dGVyIiwhMSxfKHtuYW1lOnQsa2VlcEFsaXZlOiExLHBhcmFtczpbaV19LHkpLGQuX19pbnN0YW5jZUlkLGYpKX1yZXR1cm4gbFtDdSh0KV0obiksITB9cmV0dXJuITF9fSk7cmV0dXJuIE9iamVjdC5mcmVlemUoZil9LGQ9e30sZj17fTtyZXR1cm4gT2JqZWN0LmZyZWV6ZShuZXcgUHJveHkobCx7Z2V0OmZ1bmN0aW9uKGUsdCxuKXtpZih0PXh1KHQsYyksayhjLHQpKXtpZighZlt0XSl7dmFyIHI9Y1t0XSxpPXIuYXN5bmMsbz1yLmtlZXBBbGl2ZSxhPXIucGFyYW1zLHM9ci5yZXR1cm47Zlt0XT1rdSghIWksXyh7bmFtZTp0LGNvbXBhbmlvbjohMCxrZWVwQWxpdmU6byxwYXJhbXM6YSxyZXR1cm46c30seSkpfXJldHVybiBmW3RdfXJldHVybiB1LmluY2x1ZGVzKHQpP2J1KF8oe25hbWU6dCxjb21wYW5pb246ITAsdHlwZToiZ2V0dGVyIn0seSkpOlJlZmxlY3QuZ2V0KGUsdCxuKX0sc2V0OmZ1bmN0aW9uKGUsdCxuKXtpZih1LmluY2x1ZGVzKHQpKXt2YXIgcj1DdSh0KTtpZighZFtyXSl7dmFyIGk9YVt0XTtpJiYoZFtyXT13dSgic2V0dGVyIiwhMSxfKHtuYW1lOnQsa2VlcEFsaXZlOiExLHBhcmFtczpbaV19LHkpLDApKX1yZXR1cm4gZFtDdSh0KV0obiksITB9cmV0dXJuITF9fSkpfWZ1bmN0aW9uIE91KCl7cmV0dXJuIHZvaWQgMCE9PWRnJiYiQW5kcm9pZCI9PT1kZy5vcy5uYW1lfWZ1bmN0aW9uIEF1KCl7cmV0dXJuIU91KCl9ZnVuY3Rpb24gRXUoZSx0LG4pe3JldHVybiBPdSgpP3Q6IlVUU1NESyIrKG4/Ik1vZHVsZXMiOiIiKSt5KGUpK3kodCl9dmFyIEl1PXt9O3ZhciAkdT17fTtmdW5jdGlvbiBQdShlLHQsbil7ZVtlLl9fcHJlbG9hZF9fPyJoaWRlIjoiY2xvc2UiXSh0LG4pfWZ1bmN0aW9uIE11KG4scixlLGksdCl7dm9pZCAwPT09dCYmKHQ9bi5udnVlPzA6MTAwKTt2YXIgbz0oZT12b2lkIDA9PT1lP2lhOnBhcnNlSW50KGUpKXx8aWE7cGcoZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigpe2UuX2NhbGxlZHx8KGUuX2NhbGxlZD0hMCxpJiZpKCksX3MoKSl9LHQ9cGcoZnVuY3Rpb24oKXtlKCl9LG8rMTUwKTtuLnNob3cocnx8cmEsbyxmdW5jdGlvbigpe2UuX2NhbGxlZHx8aGcodCksZSgpfSl9LHQpfXZhciBqdT0wO2Z1bmN0aW9uIEx1KHQsbixyKXt2YXIgaT13ZygpLG89aS5sZW5ndGgsYT1pW28tMV07MTx0JiZpLnNsaWNlKG8tdCxvLTEpLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1B1KGUuJGdldEFwcFdlYnZpZXcoKSwibm9uZSIpfSk7dmFyIGU9ZnVuY3Rpb24oZSl7bj9QdShlLG4scnx8aWEpOiJyZWRpcmVjdCI9PT1hLiRwYWdlLm9wZW5UeXBlP1B1KGUsb2EsaWEpOlB1KGUsImF1dG8iKSxpLnNsaWNlKG8tdCxvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRyZW1vdmUoKX0pLF9pKCksZmcuZW1pdCgib25BcHBSb3V0ZSIse3R5cGU6Im5hdmlnYXRlQmFjayJ9KX0scz1hLiRnZXRBcHBXZWJ2aWV3KCk7aWYoIWEuX191bmlhcHBfd2VidmlldylyZXR1cm4gZShzKTshZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNoaWxkcmVuKCk7aWYoIW58fCFuLmxlbmd0aClyZXR1cm4gdCgpO3ZhciByPW4uZmluZChmdW5jdGlvbihlKXtyZXR1cm4gMD09PWUuaWQuaW5kZXhPZihpcyl9KXx8blswXTtyLmNhbkJhY2soZnVuY3Rpb24oZSl7ZS5jYW5CYWNrP3IuYmFjaygpOnQoKX0pfShzLGZ1bmN0aW9uKCl7ZShzKX0pfWZ1bmN0aW9uIE51KGUpe3ZhciB0PWUuZnJvbTt2b2lkIDA9PT10JiYodD0ibmF2aWdhdGVCYWNrIik7dmFyIG49ZS5kZWx0YSxyPWUuYW5pbWF0aW9uVHlwZSxpPWUuYW5pbWF0aW9uRHVyYXRpb24sbz13ZygpLGE9b1tvLmxlbmd0aC0xXTtpZighKGEuJHZtJiZhLiR2bS4kb3B0aW9ucy5vbkJhY2tQcmVzcyYmYS4kdm0uX19jYWxsX2hvb2smJmEuJHZtLl9fY2FsbF9ob29rKCJvbkJhY2tQcmVzcyIse2Zyb206dH0pKSlyZXR1cm4gX2cuaGlkZVRvYXN0KCksX2cuaGlkZUxvYWRpbmcoKSxhLiRwYWdlLm1ldGEuaXNRdWl0P2p1P0RhdGUubm93KCktanU8MmUzJiZkZy5ydW50aW1lLnF1aXQoKTooanU9RGF0ZS5ub3coKSxkZy5uYXRpdmVVSS50b2FzdChjdCgidW5pLmFwcC5xdWl0IikpLHBnKGZ1bmN0aW9uKCl7anU9bnVsbH0sMmUzKSk6MT09PWEuJHBhZ2UuaWQmJm1nLnJlYWxFbnRyeVBhZ2VQYXRoPyhtZy5lbnRyeVBhZ2VQYXRoPW1nLnJlYWxFbnRyeVBhZ2VQYXRoLGRlbGV0ZSBtZy5yZWFsRW50cnlQYWdlUGF0aCxfZy5yZUxhdW5jaCh7dXJsOiIvIittZy5lbnRyeVBhZ2VQYXRofSkpOkx1KG4scixpKSx7ZXJyTXNnOiJuYXZpZ2F0ZUJhY2s6b2sifX12YXIgQnU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3RoaXMuaWQ9ZSx0aGlzLmxpc3RlbmVyPXt9LHRoaXMuZW1pdENhY2hlPXt9LHQmJk9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24oZSl7bi5vbihlLHRbZV0pfSl9O0J1LnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTt2YXIgcj10aGlzLmxpc3RlbmVyW2VdO2lmKCFyKXJldHVybih0aGlzLmVtaXRDYWNoZVtlXXx8KHRoaXMuZW1pdENhY2hlW2VdPVtdKSkucHVzaCh0KTtyLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5mbi5hcHBseShlLmZuLHQpfSksdGhpcy5saXN0ZW5lcltlXT1yLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4ib25jZSIhPT1lLnR5cGV9KX0sQnUucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGUsdCl7dGhpcy5fYWRkTGlzdGVuZXIoZSwib24iLHQpLHRoaXMuX2NsZWFyQ2FjaGUoZSl9LEJ1LnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGUsdCl7dGhpcy5fYWRkTGlzdGVuZXIoZSwib25jZSIsdCksdGhpcy5fY2xlYXJDYWNoZShlKX0sQnUucHJvdG90eXBlLm9mZj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMubGlzdGVuZXJbZV07aWYobilpZih0KWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7KW5bcl0uZm49PT10JiYobi5zcGxpY2UociwxKSxyLS0pLHIrKztlbHNlIGRlbGV0ZSB0aGlzLmxpc3RlbmVyW2VdfSxCdS5wcm90b3R5cGUuX2NsZWFyQ2FjaGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5lbWl0Q2FjaGVbZV07aWYodClmb3IoOzA8dC5sZW5ndGg7KXRoaXMuZW1pdC5hcHBseSh0aGlzLFtlXS5jb25jYXQodC5zaGlmdCgpKSl9LEJ1LnByb3RvdHlwZS5fYWRkTGlzdGVuZXI9ZnVuY3Rpb24oZSx0LG4peyh0aGlzLmxpc3RlbmVyW2VdfHwodGhpcy5saXN0ZW5lcltlXT1bXSkpLnB1c2goe2ZuOm4sdHlwZTp0fSl9O3ZhciBEdT0wO2Z1bmN0aW9uIFJ1KGUsdCl7dmFyIG49ZS51cmwscj1lLnBhdGgsaT1lLnF1ZXJ5LG89ZS5ldmVudHMsYT1lLmFuaW1hdGlvblR5cGUscz1lLmFuaW1hdGlvbkR1cmF0aW9uO2ZnLmVtaXQoIm9uQXBwUm91dGUiLHt0eXBlOiJuYXZpZ2F0ZVRvIixwYXRoOnJ9KTt2YXIgYz0odm9pZCAwPT09ITEmJiEwLG5ldyBCdSgrK0R1LG8pKTtNdShOcyh7dXJsOm4scGF0aDpyLHF1ZXJ5Omksb3BlblR5cGU6Im5hdmlnYXRlIixldmVudENoYW5uZWw6Y30pLGEscyxmdW5jdGlvbigpe2hpKHQse2Vyck1zZzoibmF2aWdhdGVUbzpvayIsZXZlbnRDaGFubmVsOmN9KX0pLF9pKCl9ZnVuY3Rpb24gRnUoZSx0KXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9e30pLEFycmF5LmlzQXJyYXkoZVt0XSkmJmVbdF0ubGVuZ3RofWZ1bmN0aW9uIFV1KGUscil7dmFyIHQ9ZS51cmwsbj1lLnBhdGgsaT1lLnF1ZXJ5LG89ZS5leGlzdHMsYT13ZygpLHM9YS5sZW5ndGgtMTtpZigiYmFjayI9PT1vKXt2YXIgYz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9d2coKSxuPXQubGVuZ3RoO24tLTspe3ZhciByPXRbbl07aWYoci4kcGFnZSYmci4kcGFnZS5mdWxsUGF0aD09PWUpcmV0dXJuIG59cmV0dXJuLTF9KHQpO2lmKC0xIT09Yyl7dmFyIHU9cy1jO2lmKDA8dSlyZXR1cm4gTnUoe2RlbHRhOnV9KSx2b2lkIGhpKHIse2Vyck1zZzoicmVkaXJlY3RUbzpvayJ9KX19dmFyIGw9YVtzXTtsJiZsLiRyZW1vdmUoKSxNdShOcyh7dXJsOnQscGF0aDpuLHF1ZXJ5Omksb3BlblR5cGU6InJlZGlyZWN0In0pLCJub25lIiwwLGZ1bmN0aW9uKCl7aWYobCl7dmFyIGU9bC4kZ2V0QXBwV2VidmlldygpO2UuX19wcmVsb2FkX18mJih0PWUsKG49T2JqZWN0LmtleXMoTHMpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIExzW2VdLmlkPT09dC5pZH0pKSYmZGVsZXRlIExzW25dKSxlLmNsb3NlKCJub25lIil9dmFyIHQsbjtoaShyLHtlcnJNc2c6InJlZGlyZWN0VG86b2sifSl9KSxfaSgpfXZhciB6dSxWdSxxdSxXdT0iX19UWVBFIixIdT0idW5pLXN0b3JhZ2Uta2V5cyI7ZnVuY3Rpb24gR3UoZSl7dHJ5e3ZhciB0PSJzdHJpbmciPT10eXBlb2YgZT9KU09OLnBhcnNlKGUpOmUsbj10LnR5cGU7aWYoMDw9WyJvYmplY3QiLCJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIiwidW5kZWZpbmVkIl0uaW5kZXhPZihuKSl7dmFyIHI9T2JqZWN0LmtleXModCk7aWYoMj09PXIubGVuZ3RoJiYiZGF0YSJpbiB0KXtpZih0eXBlb2YgdC5kYXRhPT09bilyZXR1cm4gdC5kYXRhO2lmKCJvYmplY3QiPT09biYmL15cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfVw6XGR7Mn1cOlxkezJ9XC5cZHszfVokLy50ZXN0KHQuZGF0YSkpcmV0dXJuIG5ldyBEYXRlKHQuZGF0YSl9ZWxzZSBpZigxPT09ci5sZW5ndGgpcmV0dXJuIiJ9fWNhdGNoKGUpe319ZnVuY3Rpb24gSnUoZSx0KXt2YXIgbj10O2lmKCJzdHJpbmciIT09ZXx8InN0cmluZyI9PT1lJiYneyJ0eXBlIjoidW5kZWZpbmVkIn0nPT09dCl0cnl7dmFyIHI9SlNPTi5wYXJzZSh0KSxpPUd1KHIpO2lmKHZvaWQgMCE9PWkpbj1pO2Vsc2UgaWYoZSYmInN0cmluZyI9PXR5cGVvZihuPXIpKXt2YXIgbz10eXBlb2Yocj1KU09OLnBhcnNlKHIpKTsibnVtYmVyIj09PW8mJiJkYXRlIj09PWU/bj1uZXcgRGF0ZShyKTpvPT09KFsibnVsbCIsImFycmF5Il0uaW5kZXhPZihlKTwwP2U6Im9iamVjdCIpJiYobj1yKX19Y2F0Y2goZSl7fXJldHVybiBufWZ1bmN0aW9uIFh1KCl7Zm9yKHZhciBlPWRnLnN0b3JhZ2UubGVuZ3RofHxkZy5zdG9yYWdlLmdldExlbmd0aCgpfHwwLHQ9W10sbj0wLHI9MDtyPGU7cisrKXt2YXIgaT1kZy5zdG9yYWdlLmtleShyKTtpZihpIT09SHUmJihpLmluZGV4T2YoV3UpPDB8fGkuaW5kZXhPZihXdSkrV3UubGVuZ3RoIT09aS5sZW5ndGgpKXt2YXIgbz1kZy5zdG9yYWdlLmdldEl0ZW0oaSk7bis9aS5sZW5ndGgrby5sZW5ndGgsdC5wdXNoKGkpfX1yZXR1cm57a2V5czp0LGN1cnJlbnRTaXplOk1hdGguY2VpbCgyKm4vMTAyNCksbGltaXRTaXplOk51bWJlci5NQVhfVkFMVUUsZXJyTXNnOiJnZXRTdG9yYWdlSW5mbzpvayJ9fWZ1bmN0aW9uIFl1KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnRpdGxlO3ZvaWQgMD09PXQmJih0PSIiKTt2YXIgbj1lLmljb247dm9pZCAwPT09biYmKG49InN1Y2Nlc3MiKTt2YXIgcj1lLmltYWdlO3ZvaWQgMD09PXImJihyPSIiKTt2YXIgaT1lLmR1cmF0aW9uO3ZvaWQgMD09PWkmJihpPTE1MDApO3ZhciBvPWUubWFzazt2b2lkIDA9PT1vJiYobz0hMSk7dmFyIGE9ZS5wb3NpdGlvbjt2b2lkIDA9PT1hJiYoYT0iIik7dmFyIHM9ZS50eXBlO3ZvaWQgMD09PXMmJihzPSJ0b2FzdCIpO3ZhciBjPWUuc3R5bGU7aWYoS3UobnVsbCksVnU9cyxbInRvcCIsImNlbnRlciIsImJvdHRvbSJdLmluY2x1ZGVzKGEpKWRnLm5hdGl2ZVVJLnRvYXN0KHQse3ZlcnRpY2FsQWxpZ246YX0pLHp1PSEwO2Vsc2V7biYmIX5bInN1Y2Nlc3MiLCJsb2FkaW5nIiwiZXJyb3IiLCJub25lIl0uaW5kZXhPZihuKSYmKG49InN1Y2Nlc3MiKTt2YXIgdT17bW9kYWw6byxiYWNrOiJ0cmFuc21pdCIscGFkZGluZzoiMTBweCIsc2l6ZToiMTZweCJ9O3J8fG4mJiJub25lIiE9PW4/KHUud2lkdGg9IjE0MHB4Iix1LmhlaWdodD0iMTEycHgiKTp1LmxvYWRpbmc9e2Rpc3BsYXk6Im5vbmUifSxyP3UubG9hZGluZz17ZGlzcGxheToiYmxvY2siLGhlaWdodDoiNTVweCIsaWNvbjpyLGludGVydmFsOml9Oi0xIT09WyJzdWNjZXNzIiwiZXJyb3IiXS5pbmRleE9mKG4pJiYodS5sb2FkaW5nPXtkaXNwbGF5OiJibG9jayIsaGVpZ2h0OiI1NXB4IixpY29uOiJzdWNjZXNzIj09PW4/Il9fdW5pYXBwc3VjY2Vzcy5wbmciOiJfX3VuaWFwcGVycm9yLnBuZyIsaW50ZXJ2YWw6aX0pLHp1PWRnLm5hdGl2ZVVJLnNob3dXYWl0aW5nKHQsT2JqZWN0LmFzc2lnbih1LGMpKX1yZXR1cm4gcXU9cGcoZnVuY3Rpb24oKXtLdShudWxsKX0saSkse2Vyck1zZzoic2hvd1RvYXN0Om9rIn19ZnVuY3Rpb24gS3UoZSl7aWYodm9pZCAwPT09ZSYmKGU9InRvYXN0IiksIWV8fGU9PT1WdSlyZXR1cm4gcXUmJihoZyhxdSkscXU9bnVsbCksITA9PT16dT9kZy5uYXRpdmVVSS5jbG9zZVRvYXN0KCk6enUmJnp1LmNsb3NlJiZ6dS5jbG9zZSgpLFZ1PXp1PW51bGwse2Vyck1zZzoiaGlkZTpvayJ9fXZhciBadSxRdT17bGlnaHQ6e2l0ZW1Db2xvcjoiIzAwMDAwMCJ9LGRhcms6e2l0ZW1Db2xvcjoicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpIn19O3ZhciBlbD17fTtmdW5jdGlvbiB0bChlKXt2YXIgbj1lbFtlXTtyZXR1cm4gbnx8KG49e2lkOjEsY2FsbGJhY2tzOk9iamVjdC5jcmVhdGUobnVsbCl9LGVsW2VdPW4pLHtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG4uY2FsbGJhY2tzW2VdfSxwb3A6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5jYWxsYmFja3NbZV07cmV0dXJuIHQmJmRlbGV0ZSBuLmNhbGxiYWNrc1tlXSx0fSxwdXNoOmZ1bmN0aW9uKGUpe3ZhciB0PW4uaWQrKztyZXR1cm4gbi5jYWxsYmFja3NbdF09ZSx0fX19dmFyIG5sPXRsKCJyZXF1ZXN0Q29tcG9uZW50SW5mbyIpO2Z1bmN0aW9uIHJsKG4pe3ZhciByPXt9O3JldHVybiBPYmplY3Qua2V5cyhufHx7fSkuZm9yRWFjaChmdW5jdGlvbihlKXtpZigwPT09ZS5pbmRleE9mKCJkYXRhIikpe3ZhciB0PWUucmVwbGFjZSgiZGF0YSIsIiIpO3Q9dC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSt0LnNsaWNlKDEpLHJbdF09bltlXX19KSxyfWZ1bmN0aW9uIGlsKGUsdCxuKXt2YXIgcj1lLl8kd2VleC5yZXF1aXJlTW9kdWxlKCJkb20iKSxpPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl0uc2VsZWN0b3I7MD09PXIuaW5kZXhPZigiIyIpJiZ0LnB1c2goci5zdWJzdHJpbmcoMSkpfXJldHVybiB0fSh0KSxvPW5ldyBBcnJheShpLmxlbmd0aCk7IWZ1bmN0aW9uIGUodCxuLHIpe3ZhciBpPW4uY2hpbGRyZW47aWYoIUFycmF5LmlzQXJyYXkoaSkpcmV0dXJuITE7Zm9yKHZhciBvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBhPWlbb107aWYoYS5hdHRyKXt2YXIgcz10LmluZGV4T2YoYS5hdHRyLmlkKTtpZigwPD1zJiYocltzXT17aWQ6dFtzXSxyZWY6YS5yZWYsZGF0YXNldDpybChhLmF0dHIpfSwxPT09dC5sZW5ndGgpKWJyZWFrfWEuY2hpbGRyZW4mJmUodCxhLHIpfX0oaSxlLiRlbCxvKSxmdW5jdGlvbiB0KG4scixpLG8sYSl7dmFyIHM9cltpXTtuLmdldENvbXBvbmVudFJlY3Qocy5yZWYsZnVuY3Rpb24oZSl7ZS5zaXplLmlkPXMuaWQsZS5zaXplLmRhdGFzZXQ9cy5kYXRhc2V0LG8ucHVzaChlLnNpemUpLChpKz0xKTxyLmxlbmd0aD90KG4scixpLG8sYSk6YShvKX0pfShyLG8sMCxbXSxmdW5jdGlvbihlKXtuKGUpfSl9ZnVuY3Rpb24gb2woZSx0LG4scil7ZmcucHVibGlzaEhhbmRsZXIodCx7dHlwZTpuLGRhdGE6cn0sZSl9Zmcuc3Vic2NyaWJlKCJvbkFkTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jYWxsYmFja0lkOyFmdW5jdGlvbihlLG4sdCl7dmFyIHI9ZS5hZHBpZCxpPWUud2lkdGgsbz1yKyItIitpLGE9YWxbb107aWYoYSYmMDxhLmxlbmd0aClyZXR1cm4gbihhLnNwbGljZSgwLDEpWzBdKTtkZy5hZC5nZXRBZHMoZSxmdW5jdGlvbihlKXt2YXIgdD1lLmFkcztuKHQuc3BsaWNlKDAsMSlbMF0pLGFsW29dPWE/YS5jb25jYXQodCk6dH0sZnVuY3Rpb24oZSl7dCh7ZXJyQ29kZTplLmNvZGUsZXJyTXNnOmUubWVzc2FnZX0pfSl9KGUuZGF0YSxmdW5jdGlvbihlKXtvbCh0LG4sInN1Y2Nlc3MiLGUpfSxmdW5jdGlvbihlKXtvbCh0LG4sImZhaWwiLGUpfSl9KTt2YXIgYWw9e307dmFyIHNsPVsibG9hZCIsImNsb3NlIiwidmVyaWZ5IiwiZXJyb3IiLCJhZENsaWNrZWQiXSxjbD1bLTUwMDEsLTUwMDIsLTUwMDMsLTUwMDQsLTUwMDUsLTUwMDZdLHVsPXtjb2RlOi01MDA4LGVyck1zZzoi5bm/5ZGK5pWw5o2u5bey6L+H5pyf77yM6K+36YeN5paw5Yqg6L29In0sbGw9ImNzaiIsZGw9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpczt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49dGhpcy5fY2FsbGJhY2tzPXt9O3NsLmZvckVhY2goZnVuY3Rpb24odCl7blt0XT1bXTt2YXIgZT10WzBdLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSk7aVsib24iK2VdPWZ1bmN0aW9uKGUpe25bdF0ucHVzaChlKX19KSx0aGlzLl9wcmVsb2FkPXZvaWQgMD09PWUucHJlbG9hZHx8ZS5wcmVsb2FkLHRoaXMuX2lzTG9hZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fYWRFcnJvcj0iIix0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsLHRoaXMuX2xhc3RMb2FkVGltZT0wO3ZhciB0PXRoaXMuX3Jld2FyZEFkPWRnLmFkLmNyZWF0ZVJld2FyZGVkVmlkZW9BZChlKTt0Lm9uTG9hZChmdW5jdGlvbihlKXtpLl9pc0xvYWQ9ITAsaS5faXNMb2FkaW5nPSExLGkuX2xhc3RMb2FkVGltZT1EYXRlLm5vdygpLGkuX2Rpc3BhdGNoRXZlbnQoImxvYWQiLHt9KSxudWxsIT1pLl9sb2FkUHJvbWlzZVJlc29sdmUmJihpLl9sb2FkUHJvbWlzZVJlc29sdmUoKSxpLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCl9KSx0Lm9uQ2xvc2UoZnVuY3Rpb24oZSl7aS5faXNMb2FkPSExLGkuX2lzTG9hZGluZz0hMSxpLl9wcmVsb2FkJiZpLl9sb2FkQWQoKSxpLl9kaXNwYXRjaEV2ZW50KCJjbG9zZSIse2lzRW5kZWQ6ZS5pc0VuZGVkfSl9KSx0Lm9uVmVyaWZ5JiZ0Lm9uVmVyaWZ5KGZ1bmN0aW9uKGUpe2kuX2Rpc3BhdGNoRXZlbnQoInZlcmlmeSIse2lzVmFsaWQ6ZS5pc1ZhbGlkfSl9KSx0Lm9uRXJyb3IoZnVuY3Rpb24oZSl7aS5faXNMb2FkaW5nPSExO3ZhciB0PWUuY29kZSxuPWUubWVzc2FnZSxyPXtjb2RlOnQsZXJyTXNnOm59O2kuX2FkRXJyb3I9biwtNTAwOD09PXQmJihpLl9pc0xvYWQ9ITEpLGkuX2Rpc3BhdGNoRXZlbnQoImVycm9yIixyKSwtNTAwNSE9PXQmJi0xIT09Y2wuaW5kZXgodCl8fG51bGw9PWkuX2xvYWRQcm9taXNlUmVqZWN0fHwoaS5fbG9hZFByb21pc2VSZWplY3QociksaS5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCl9KSx0Lm9uQWRDbGlja2VkKGZ1bmN0aW9uKGUpe2kuX2Rpc3BhdGNoRXZlbnQoImFkQ2xpY2tlZCIse30pfSksdGhpcy5fbG9hZEFkKCl9LGZsPXtpc0V4cGlyZWQ6e2NvbmZpZ3VyYWJsZTohMH19O2ZsLmlzRXhwaXJlZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMCE9PXRoaXMuX2xhc3RMb2FkVGltZSYmMThlNTxNYXRoLmFicyhEYXRlLm5vdygpLXRoaXMuX2xhc3RMb2FkVGltZSl9LGRsLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtuLl9sb2FkUHJvbWlzZVJlc29sdmU9ZSxuLl9sb2FkUHJvbWlzZVJlamVjdD10LG4uX2lzTG9hZGluZ3x8KG4uX2lzTG9hZD9lKCk6bi5fbG9hZEFkKCkpfSl9LGRsLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtpZighbi5faXNMb2FkaW5nKXtpZihuLmdldFByb3ZpZGVyKCk9PT1sbCYmbi5pc0V4cGlyZWQpcmV0dXJuIG4uX2lzTG9hZD0hMSxuLl9kaXNwYXRjaEV2ZW50KCJlcnJvciIsdWwpLHZvaWQgdChuZXcgRXJyb3IodWwuZXJyTXNnKSk7bi5faXNMb2FkPyhuLl9yZXdhcmRBZC5zaG93KCksZSgpKTp0KG5ldyBFcnJvcihuLl9hZEVycm9yKSl9fSl9LGRsLnByb3RvdHlwZS5nZXRQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXdhcmRBZC5nZXRQcm92aWRlcigpfSxkbC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX3Jld2FyZEFkLmRlc3Ryb3koKX0sZGwucHJvdG90eXBlLl9sb2FkQWQ9ZnVuY3Rpb24oKXt0aGlzLl9pc0xvYWQ9ITEsdGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX3Jld2FyZEFkLmxvYWQoKX0sZGwucHJvdG90eXBlLl9kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dGhpcy5fY2FsbGJhY2tzW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUodHx8e30pfSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGRsLnByb3RvdHlwZSxmbCk7dmFyIHBsPSJsb2FkIixobD0iY2xvc2UiLHZsPSJlcnJvciIsZ2w9ImFkQ2xpY2tlZCIsbWw9W3BsLGhsLHZsLGdsXSx5bD1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXMsbj10aGlzLl9jYWxsYmFja3M9e307bWwuZm9yRWFjaChmdW5jdGlvbih0KXtuW3RdPVtdO3ZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTtyWyJvbiIrZV09ZnVuY3Rpb24oZSl7blt0XS5wdXNoKGUpfX0pLHRoaXMuX3ByZWxvYWQ9dm9pZCAwIT09dC5wcmVsb2FkJiZ0LnByZWxvYWQsdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2FkRXJyb3I9IiIsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsO3ZhciBpPXRoaXMuX2FkPWU7aS5vbkxvYWQoZnVuY3Rpb24oZSl7ci5faXNMb2FkZWQ9ITAsci5faXNMb2FkaW5nPSExLG51bGwhPXIuX2xvYWRQcm9taXNlUmVzb2x2ZSYmKHIuX2xvYWRQcm9taXNlUmVzb2x2ZSgpLHIuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsKSxudWxsIT1yLl9zaG93UHJvbWlzZVJlc29sdmUmJihyLl9zaG93UHJvbWlzZVJlc29sdmUoKSxyLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCxyLl9zaG93QWQoKSksci5fZGlzcGF0Y2hFdmVudChwbCx7fSl9KSxpLm9uQ2xvc2UoZnVuY3Rpb24oZSl7ci5faXNMb2FkZWQ9ITEsci5faXNMb2FkaW5nPSExLHIuX2Rpc3BhdGNoRXZlbnQoaGwse2lzRW5kZWQ6ZS5pc0VuZGVkfSksITA9PT1yLl9wcmVsb2FkJiZyLl9sb2FkQWQoKX0pLGkub25FcnJvcihmdW5jdGlvbihlKXtyLl9pc0xvYWRpbmc9ITE7dmFyIHQ9e2NvZGU6ZS5jb2RlLGVyckNvZGU6ZS5jb2RlLGVyck1zZzplLm1lc3NhZ2UsZGV0YWlsOmUuZGV0YWlsfTtyLl9hZEVycm9yPXQsci5fZGlzcGF0Y2hFdmVudCh2bCx0KTt2YXIgbj1uZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoci5fYWRFcnJvcikpO24uY29kZT1lLmNvZGUsbi5lcnJNc2c9ZS5tZXNzYWdlLG4uZGV0YWlsPWUuZGV0YWlsLG51bGwhPXIuX2xvYWRQcm9taXNlUmVqZWN0JiYoci5fbG9hZFByb21pc2VSZWplY3Qobiksci5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCksbnVsbCE9ci5fc2hvd1Byb21pc2VSZWplY3QmJihyLl9zaG93UHJvbWlzZVJlamVjdChuKSxyLl9zaG93UHJvbWlzZVJlamVjdD1udWxsKX0pLGkub25BZENsaWNrZWQmJmkub25BZENsaWNrZWQoZnVuY3Rpb24oZSl7ci5fZGlzcGF0Y2hFdmVudChnbCx7fSl9KX07eWwucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe24uX2xvYWRQcm9taXNlUmVzb2x2ZT1lLG4uX2xvYWRQcm9taXNlUmVqZWN0PXQsbi5faXNMb2FkaW5nfHwobi5faXNMb2FkZWQ/ZSgpOm4uX2xvYWRBZCgpKX0pfSx5bC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsdCl7bi5fc2hvd1Byb21pc2VSZXNvbHZlPWUsbi5fc2hvd1Byb21pc2VSZWplY3Q9dCxuLl9pc0xvYWRpbmd8fChuLl9pc0xvYWRlZD8obi5fc2hvd0FkKCksZSgpKTpuLl9sb2FkQWQoKSl9KX0seWwucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9hZC5kZXN0cm95KCl9LHlsLnByb3RvdHlwZS5nZXRQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hZC5nZXRQcm92aWRlcigpfSx5bC5wcm90b3R5cGUuX2xvYWRBZD1mdW5jdGlvbigpe3RoaXMuX2FkRXJyb3I9IiIsdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX2FkLmxvYWQoKX0seWwucHJvdG90eXBlLl9zaG93QWQ9ZnVuY3Rpb24oKXt0aGlzLl9hZC5zaG93KCl9LHlsLnByb3RvdHlwZS5fZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihlLHQpe3RoaXMuX2NhbGxiYWNrc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKHR8fHt9KX0pfTt2YXIgX2w9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT17fSksdC5jYWxsKHRoaXMsZGcuYWQuY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQoZSksZSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSwoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWV9KHlsKTt2YXIgYmw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT17fSksdC5jYWxsKHRoaXMsZGcuYWQuY3JlYXRlSW50ZXJzdGl0aWFsQWQoZSksZSksdGhpcy5fbG9hZEFkKCl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSwoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWV9KHlsKTt2YXIgd2w9e30sa2w9e307dmFyIFNsPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMscj10aGlzLl9jYWxsYmFja3M9e307bWwuZm9yRWFjaChmdW5jdGlvbih0KXtyW3RdPVtdO3ZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTtuWyJvbiIrZV09ZnVuY3Rpb24oZSl7clt0XS5wdXNoKGUpfX0pLHRoaXMuX2FkPW51bGwsdGhpcy5fYWRFcnJvcj0iIix0aGlzLl9hZHBpZD1lLmFkcGlkLHRoaXMuX3Byb3ZpZGVyPWUucHJvdmlkZXIsdGhpcy5fdXNlckRhdGE9ZS51c2VyRGF0YXx8e30sdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCxwZyhmdW5jdGlvbigpe24uX2luaXQoKX0pfTtTbC5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2FkRXJyb3I9IiIsZnVuY3Rpb24oZSl7dmFyIHI9ZS5wcm92aWRlcjtpZih3bFtyXXx8KHdsW3JdPXt9KSwib2JqZWN0IiE9dHlwZW9mIHdsW3JdLmluc3RhbmNlKWlmKGtsW3JdfHwoa2xbcl09W10pLGtsW3JdLnB1c2goZSksITAhPT13bFtyXS5sb2FkaW5nKXt3bFtyXS5sb2FkaW5nPSEwO3ZhciBpPXZpKHIpfHx7fSx0PWkuaW5pdHx8aS5pbml0U0RLO2lmKCF0KXJldHVybiBrbFtyXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZmFpbCh7Y29kZTotMSxtZXNzYWdlOiJwcm92aWRlciBbIityKyJdIGludmFsaWQifSl9KSxrbFtyXS5sZW5ndGg9MCx3bFtyXS5sb2FkaW5nPSExO3dsW3JdLnBsdWdpbj1pLGUuX19wbHVnaW49aSx0KGZ1bmN0aW9uKHQpe3ZhciBlPXQuY29kZSxuPSJCWE0tQUQiPT09cj8wPT09ZXx8MT09PWU6MD09PWU7bj93bFtyXS5pbnN0YW5jZT1pOndsW3JdLmxvYWRpbmc9ITEsa2xbcl0uZm9yRWFjaChmdW5jdGlvbihlKXtuP2Uuc3VjY2VzcyhlLl9fcGx1Z2luKTplLmZhaWwodCl9KSxrbFtyXS5sZW5ndGg9MH0pfWVsc2UgZS5fX3BsdWdpbj13bFtyXS5wbHVnaW47ZWxzZSBlLnN1Y2Nlc3Mod2xbcl0uaW5zdGFuY2UpfSh7cHJvdmlkZXI6dGhpcy5fcHJvdmlkZXIsc3VjY2VzczpmdW5jdGlvbihlKXt0Ll9hZD1lLHQuX3VzZXJEYXRhJiZ0LmJpbmRVc2VyRGF0YSh0Ll91c2VyRGF0YSksdC5fbG9hZEFkKCl9LGZhaWw6ZnVuY3Rpb24oZSl7dC5fYWRFcnJvcj1lLHQuX2Rpc3BhdGNoRXZlbnQodmwsZSl9fSl9LFNsLnByb3RvdHlwZS5nZXRQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm92aWRlcn0sU2wucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe24uX2xvYWRQcm9taXNlUmVzb2x2ZT1lLG4uX2xvYWRQcm9taXNlUmVqZWN0PXQsbi5faXNMb2FkaW5nfHwobi5fYWRFcnJvcj9uLl9pbml0KCk6bi5faXNMb2FkZWQ/ZSgpOm4uX2xvYWRBZCgpKX0pfSxTbC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsdCl7bi5fc2hvd1Byb21pc2VSZXNvbHZlPWUsbi5fc2hvd1Byb21pc2VSZWplY3Q9dCxuLl9pc0xvYWRpbmd8fChuLl9hZEVycm9yP24uX2luaXQoKTpuLl9pc0xvYWRlZD8obi5fc2hvd0FkKCksZSgpKTpuLl9sb2FkQWQoKSl9KX0sU2wucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5fYWQmJnRoaXMuX2FkLmRlc3Ryb3kmJnRoaXMuX2FkLmRlc3Ryb3koe2FkcGlkOnRoaXMuX2FkcGlkfSl9LFNsLnByb3RvdHlwZS5iaW5kVXNlckRhdGE9ZnVuY3Rpb24oZSl7bnVsbCE9PXRoaXMuX2FkJiZ0aGlzLl9hZC5iaW5kVXNlckRhdGEmJnRoaXMuX2FkLmJpbmRVc2VyRGF0YShlKX0sU2wucHJvdG90eXBlLl9sb2FkQWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKG51bGwhPT10aGlzLl9hZCl7aWYoITA9PT10aGlzLl9pc0xvYWRpbmcpcmV0dXJuO3RoaXMuX2lzTG9hZGluZz0hMCx0aGlzLl9hZC5sb2FkRGF0YShPYmplY3QuYXNzaWduKHt9LHthZHBpZDp0aGlzLl9hZHBpZH0sdGhpcy5fdXNlckRhdGEpLGZ1bmN0aW9uKGUpe3QuX2lzTG9hZGVkPSEwLHQuX2lzTG9hZGluZz0hMSxudWxsIT10Ll9sb2FkUHJvbWlzZVJlc29sdmUmJih0Ll9sb2FkUHJvbWlzZVJlc29sdmUoKSx0Ll9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCksbnVsbCE9dC5fc2hvd1Byb21pc2VSZXNvbHZlJiYodC5fc2hvd1Byb21pc2VSZXNvbHZlKCksdC5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdC5fc2hvd0FkKCkpLHQuX2Rpc3BhdGNoRXZlbnQocGwsZSl9LGZ1bmN0aW9uKGUpe3QuX2lzTG9hZGluZz0hMSxudWxsIT10Ll9zaG93UHJvbWlzZVJlamVjdCYmKHQuX3Nob3dQcm9taXNlUmVqZWN0KHQuX2NyZWF0ZUVycm9yKGUpKSx0Ll9zaG93UHJvbWlzZVJlamVjdD1udWxsKSx0Ll9kaXNwYXRjaEV2ZW50KHZsLGUpfSl9fSxTbC5wcm90b3R5cGUuX3Nob3dBZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7bnVsbCE9PXRoaXMuX2FkJiYhMD09PXRoaXMuX2lzTG9hZGVkJiZ0aGlzLl9hZC5zaG93KHthZHBpZDp0aGlzLl9hZHBpZH0sZnVuY3Rpb24oZSl7dC5faXNMb2FkZWQ9ITF9LGZ1bmN0aW9uKGUpe3QuX2lzTG9hZGVkPSExLG51bGwhPXQuX3Nob3dQcm9taXNlUmVqZWN0JiYodC5fc2hvd1Byb21pc2VSZWplY3QodC5fY3JlYXRlRXJyb3IoZSkpLHQuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpLHQuX2Rpc3BhdGNoRXZlbnQodmwsZSl9KX0sU2wucHJvdG90eXBlLl9jcmVhdGVFcnJvcj1mdW5jdGlvbihlKXt2YXIgdD1uZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoZSkpO3JldHVybiB0LmNvZGU9ZS5jb2RlLHQuZXJyTXNnPWUubWVzc2FnZSx0fSxTbC5wcm90b3R5cGUuX2Rpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oZSx0KXt0aGlzLl9jYWxsYmFja3NbZV0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSh0fHx7fSl9KX07dmFyIHhsPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGluaXRVVFNQcm94eUNsYXNzOlR1LGluaXRVVFNQcm94eUZ1bmN0aW9uOlN1LGluaXRVVFNJbmRleENsYXNzTmFtZTpmdW5jdGlvbihlLHQpe3JldHVybiBFdShlLE91KCk/IkluZGV4S3QiOiJJbmRleFN3aWZ0Iix0KX0saW5pdFVUU0NsYXNzTmFtZTpFdSxpbml0VVRTUGFja2FnZU5hbWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT3UoKT8idXRzLnNkay4iKyh0PyJtb2R1bGVzLiI6IiIpK2U6IiJ9LHJlcXVpcmVVVFNQbHVnaW46ZnVuY3Rpb24oZSl7dmFyIHQ9JHVbZV07cmV0dXJuIHR8fGNvbnNvbGUuZXJyb3IoZSsiIGlzIG5vdCBmb3VuZCIpLHR9LHJlZ2lzdGVyVVRTUGx1Z2luOmZ1bmN0aW9uKGUsdCl7JHVbZV09dH0scmVnaXN0ZXJVVFNJbnRlcmZhY2U6ZnVuY3Rpb24oZSx0KXtJdVtlXT10fSxzdGFydFB1bGxEb3duUmVmcmVzaDpmdW5jdGlvbigpe3JldHVybiBadSYmWnUuZW5kUHVsbFRvUmVmcmVzaCgpLChadT1DaSgpKT8oWnUuYmVnaW5QdWxsVG9SZWZyZXNoKCkse2Vyck1zZzoic3RhcnRQdWxsRG93blJlZnJlc2g6b2sifSk6e2Vyck1zZzoic3RhcnRQdWxsRG93blJlZnJlc2g6ZmFpbCJ9fSxzdG9wUHVsbERvd25SZWZyZXNoOmZ1bmN0aW9uKCl7cmV0dXJuIFp1fHwoWnU9Q2koKSksWnU/KFp1LmVuZFB1bGxUb1JlZnJlc2goKSxadT1udWxsLHtlcnJNc2c6InN0b3BQdWxsRG93blJlZnJlc2g6b2sifSk6e2Vyck1zZzoic3RvcFB1bGxEb3duUmVmcmVzaDpmYWlsIn19LCRvbjpjaSwkb2ZmOnVpLCRvbmNlOmxpLCRlbWl0OmRpLGNyZWF0ZUF1ZGlvSW5zdGFuY2U6ZnVuY3Rpb24oKXt2YXIgZT0iIitEYXRlLm5vdygpK01hdGgucmFuZG9tKCksdD16aVtlXT1kZy5hdWRpby5jcmVhdGVQbGF5ZXIoIiIpO3JldHVybiB0LnNyYz0iIix0LnZvbHVtZT0xLHQuc3RhcnRUaW1lPTAsdC5zZXRTZXNzaW9uQ2F0ZWdvcnkoVWkpLHtlcnJNc2c6ImNyZWF0ZUF1ZGlvSW5zdGFuY2U6b2siLGF1ZGlvSWQ6ZX19LGRlc3Ryb3lBdWRpb0luc3RhbmNlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYXVkaW9JZDtyZXR1cm4gemlbdF0mJih6aVt0XS5jbG9zZSgpLGRlbGV0ZSB6aVt0XSkse2Vyck1zZzoiZGVzdHJveUF1ZGlvSW5zdGFuY2U6b2siLGF1ZGlvSWQ6dH19LHNldEF1ZGlvU3RhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdWRpb0lkLG49ZS5zcmMscj1lLnN0YXJ0VGltZSxpPWUuYXV0b3BsYXk7dm9pZCAwPT09aSYmKGk9ITEpO3ZhciBvPWUubG9vcDt2b2lkIDA9PT1vJiYobz0hMSksZS5vYmV5TXV0ZVN3aXRjaDt2YXIgYT1lLnZvbHVtZSxzPWUuc2Vzc2lvbkNhdGVnb3J5O3ZvaWQgMD09PXMmJihzPVVpKTt2YXIgYyx1LGw9ZS5wbGF5YmFja1JhdGUsZD16aVt0XTtpZihkKXt2YXIgZj17bG9vcDpvLGF1dG9wbGF5Oml9O2lmKG4pe3ZhciBwPUFpKG4pO2Quc3JjIT09cCYmKGQuc3JjPWYuc3JjPXApfXImJihkLnN0YXJ0VGltZT1mLnN0YXJ0VGltZT1yKSwibnVtYmVyIj09dHlwZW9mIGEmJihkLnZvbHVtZT1mLnZvbHVtZT1hKSxkLnNldFN0eWxlcyhmKSxzJiZkLnNldFNlc3Npb25DYXRlZ29yeShzKSxsJiZkLnBsYXliYWNrUmF0ZSYmZC5wbGF5YmFja1JhdGUobCksKHU9emlbYz10XSkmJih1LmluaXRTdGF0ZUNoYWdlfHwodS5pbml0U3RhdGVDaGFnZT0hMCx1LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihlKXtxaSgiZXJyb3IiLHthdWRpb0lkOmMsZXJyTXNnOiJNZWRpYUVycm9yIixlcnJDb2RlOmUuY29kZX0pfSksVmkuZm9yRWFjaChmdW5jdGlvbihlKXt1LmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpeyJwbGF5Ij09PWU/dS5pc1N0b3BwZWQ9ITE6InN0b3AiPT09ZSYmKHUuaXNTdG9wcGVkPSEwKSxxaShlLHthdWRpb0lkOmN9KX0pfSkpKX1yZXR1cm57ZXJyTXNnOiJzZXRBdWRpb1N0YXRlOm9rIn19LGdldEF1ZGlvU3RhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdWRpb0lkLG49emlbdF07aWYoIW4pcmV0dXJue2Vyck1zZzoiZ2V0QXVkaW9TdGF0ZTpmYWlsIn07dmFyIHI9bi5zcmMsaT1uLnN0YXJ0VGltZSxvPW4udm9sdW1lO3JldHVybntlcnJNc2c6ImdldEF1ZGlvU3RhdGU6b2siLGR1cmF0aW9uOjFlMyoobi5nZXREdXJhdGlvbigpfHwwKSxjdXJyZW50VGltZTpuLmlzU3RvcHBlZD8wOjFlMypuLmdldFBvc2l0aW9uKCkscGF1c2VkOm4uaXNQYXVzZWQoKSxzcmM6cix2b2x1bWU6byxzdGFydFRpbWU6MWUzKmksYnVmZmVyZWQ6MWUzKm4uZ2V0QnVmZmVyZWQoKX19LG9wZXJhdGVBdWRpbzpmdW5jdGlvbihlKXt2YXIgdD1lLm9wZXJhdGlvblR5cGUsbj1lLmF1ZGlvSWQscj1lLmN1cnJlbnRUaW1lLGk9emlbbl0sbz1bInBsYXkiLCJwYXVzZSIsInN0b3AiXTtyZXR1cm4gMDw9by5pbmRleE9mKHQpP2lbdD09PW9bMF0mJmkuaXNQYXVzZWQoKT8icmVzdW1lIjp0XSgpOiJzZWVrIj09PXQmJmkuc2Vla1RvKHIvMWUzKSx7ZXJyTXNnOiJvcGVyYXRlQXVkaW86b2sifX0sZ2V0TXVzaWNQbGF5ZXJTdGF0ZTpmdW5jdGlvbigpe3ZhciBlPVppKCk7cmV0dXJuIGU/e2RhdGFVcmw6ZS5zcmMsZHVyYXRpb246ZS5nZXREdXJhdGlvbigpfHwwLGN1cnJlbnRQb3NpdGlvbjplLmdldFBvc2l0aW9uKCksc3RhdHVzOmUuaXNQYXVzZWQoKT8wOjEsZG93bmxvYWRQZXJjZW50Ok1hdGgucm91bmQoMTAwKmUuZ2V0QnVmZmVyZWQoKS9lLmdldER1cmF0aW9uKCkpLGVyck1zZzoiZ2V0TXVzaWNQbGF5ZXJTdGF0ZTpvayJ9OntzdGF0dXM6MixlcnJNc2c6ImdldE11c2ljUGxheWVyU3RhdGU6b2sifX0sb3BlcmF0ZU11c2ljUGxheWVyOlFpLHNldEJhY2tncm91bmRBdWRpb1N0YXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEtpKGUsdCkse2Vyck1zZzoic2V0QmFja2dyb3VuZEF1ZGlvU3RhdGU6b2sifX0sb3BlcmF0ZUJhY2tncm91bmRBdWRpbzpmdW5jdGlvbihlKXt2YXIgdD1lLm9wZXJhdGlvblR5cGUsbj1lLnNyYyxyPWUuc3RhcnRUaW1lLGk9ZS5jdXJyZW50VGltZTtyZXR1cm4gUWkoe29wZXJhdGlvblR5cGU6dCxkYXRhVXJsOm4scG9zaXRpb246cnx8aXx8MCxhcGk6Im9wZXJhdGVCYWNrZ3JvdW5kQXVkaW8ifSl9LGdldEJhY2tncm91bmRBdWRpb1N0YXRlOmZ1bmN0aW9uKCl7dmFyIGU9e2R1cmF0aW9uOjAsY3VycmVudFRpbWU6MCxwYXVzZWQ6ITEsc3JjOiIiLGJ1ZmZlcmVkOjAsdGl0bGU6IiIsZXBuYW1lOiIiLHNpbmdlcjoiIixjb3ZlckltZ1VybDoiIix3ZWJVcmw6IiIsc3RhcnRUaW1lOjAsZXJyTXNnOiJnZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZTpvayJ9LHQ9WmkoKTtpZih0KXt2YXIgbj17ZHVyYXRpb246dC5nZXREdXJhdGlvbigpfHwwLGN1cnJlbnRUaW1lOnQuaXNTdG9wcGVkPzA6dC5nZXRQb3NpdGlvbigpLHBhdXNlZDp0LmlzUGF1c2VkKCksc3JjOnQuc3JjLGJ1ZmZlcmVkOnQuZ2V0QnVmZmVyZWQoKSx0aXRsZTp0LnRpdGxlLGVwbmFtZTp0LmVwbmFtZSxzaW5nZXI6dC5zaW5nZXIsY292ZXJJbWdVcmw6dC5jb3ZlckltZ1VybCx3ZWJVcmw6dC53ZWJVcmwsc3RhcnRUaW1lOnQuc3RhcnRUaW1lfTtlPU9iamVjdC5hc3NpZ24oZSxuKX1yZXR1cm4gZX0sb3BlcmF0ZU1hcFBsYXllcjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyxjLHUsbDt0LiRwYWdlLm1ldGEuaXNOVnVlPyhjPWUsdT10LGw9cixjb1tuXShvbyhjLHUpLGwpKTooaT1lLG89bixhPXIscz10LiRwYWdlLmlkLGZnLnB1Ymxpc2hIYW5kbGVyKHMrIi1tYXAtIitpLHttYXBJZDppLHR5cGU6byxkYXRhOmF9LHMpKX0sb3BlcmF0ZVZpZGVvUGxheWVyOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLGMsdSxsO3QuJHBhZ2UubWV0YS5pc05WdWU/KGM9ZSx1PXQsbD1yLHVvW25dKG9vKGMsdSksbCkpOihpPWUsbz1uLGE9cixzPXQuJHBhZ2UuaWQsZmcucHVibGlzaEhhbmRsZXIocysiLXZpZGVvLSIraSx7dmlkZW9JZDppLHR5cGU6byxkYXRhOmF9LHMpKX0sTGl2ZVB1c2hlckNvbnRleHQ6aG8sY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC4kcGFnZS5tZXRhLmlzTlZ1ZT9mdW5jdGlvbihlLHQpe2lmKCF0KXJldHVybiBjb25zb2xlLndhcm4oInVuaS5jcmVhdGVMaXZlUHVzaGVyQ29udGV4dDogMiBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5IDEgcHJlc2VudCIpO3ZhciBuPW9vKGUsdCk7cmV0dXJuIG4/bmV3IGxvKGUsbik6Y29uc29sZS53YXJuKCJDYW4gbm90IGZpbmQgYCIrZSsiYCIpfShlLHQpOm5ldyBobyhlLHQpfSxzdGFydEFjY2VsZXJvbWV0ZXI6a28sc3RvcEFjY2VsZXJvbWV0ZXI6U28sb25BY2NlbGVyb21ldGVyQ2hhbmdlOmZ1bmN0aW9uKGUpe3dvLmxlbmd0aHx8a28oKSx3by5wdXNoKGUpfSxvZmZBY2NlbGVyb21ldGVyQ2hhbmdlOmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PXdvLmluZGV4T2YoZSk7MDw9dCYmd28uc3BsaWNlKHQsMSl9d28ubGVuZ3RofHxTbygpfSxhZGRQaG9uZUNvbnRhY3Q6ZnVuY3Rpb24obixyKXtkZy5jb250YWN0cy5nZXRBZGRyZXNzQm9vayhkZy5jb250YWN0cy5BRERSRVNTQk9PS19QSE9ORSxmdW5jdGlvbihlKXshbi5waG90b0ZpbGVQYXRoJiYobi5waG90b0ZpbGVQYXRoPSIiKTt2YXIgdD1lLmNyZWF0ZSgpOyFmdW5jdGlvbiByKGksbyx0KXt2YXIgYT0wO3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciBlPXRbbl07Im9iamVjdCIhPXR5cGVvZiBlPy0xIT09Q28uaW5kZXhPZihuKT9pW25dPXRbbl06dm9pZCAwIT09b1tlXT8oYSsrLGlbbl09b1tlXSk6ZGVsZXRlIGlbbl06ZSBpbnN0YW5jZW9mIEFycmF5PyhpW25dPVtdLGUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD17fTtyKHQsbyxlKSYmaVtuXS5wdXNoKHQpfSksaVtuXS5sZW5ndGg/YSsrOmRlbGV0ZSBpW25dKTooaVtuXT17fSxyKGlbbl0sbyxlKT9hKys6ZGVsZXRlIGlbbl0pfSksYX0odCxuLHhvKSx0LnNhdmUoZnVuY3Rpb24oKXtoaShyLHtlcnJNc2c6ImFkZFBob25lQ29udGFjdDpvayJ9KX0sZnVuY3Rpb24oZSl7aGkocix7ZXJyTXNnOiJhZGRQaG9uZUNvbnRhY3Q6ZmFpbCJ9KX0pfSxmdW5jdGlvbihlKXtoaShyLHtlcnJNc2c6ImFkZFBob25lQ29udGFjdDpmYWlsIn0pfSl9LG9uQmx1ZXRvb3RoRGV2aWNlRm91bmQ6VG8sb25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2U6T28sb25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2U6QW8sb25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlOkVvLG9wZW5CbHVldG9vdGhBZGFwdGVyOlBvLGNsb3NlQmx1ZXRvb3RoQWRhcHRlcjpNbyxnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGU6am8sc3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5OkxvLHN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5Ok5vLGdldEJsdWV0b290aERldmljZXM6Qm8sZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlczpEbyxjcmVhdGVCTEVDb25uZWN0aW9uOlJvLGNsb3NlQkxFQ29ubmVjdGlvbjpGbyxnZXRCTEVEZXZpY2VTZXJ2aWNlczpVbyxnZXRCTEVEZXZpY2VDaGFyYWN0ZXJpc3RpY3M6em8sbm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZTpWbyxyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZTpxbyx3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWU6V28sc2V0QkxFTVRVOkhvLGdldEJMRURldmljZVJTU0k6R28sZ2V0U2NyZWVuQnJpZ2h0bmVzczpmdW5jdGlvbigpe3JldHVybntlcnJNc2c6ImdldFNjcmVlbkJyaWdodG5lc3M6b2siLHZhbHVlOmRnLnNjcmVlbi5nZXRCcmlnaHRuZXNzKCExKX19LHNldFNjcmVlbkJyaWdodG5lc3M6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudmFsdWU7cmV0dXJuIGRnLnNjcmVlbi5zZXRCcmlnaHRuZXNzKHQsITEpLHtlcnJNc2c6InNldFNjcmVlbkJyaWdodG5lc3M6b2sifX0sc2V0S2VlcFNjcmVlbk9uOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmtlZXBTY3JlZW5PbjtyZXR1cm4gZGcuZGV2aWNlLnNldFdha2Vsb2NrKCEhdCkse2Vyck1zZzoic2V0S2VlcFNjcmVlbk9uOm9rIn19LGdldENsaXBib2FyZERhdGE6ZnVuY3Rpb24oZSx0KXt2aSgiY2xpcGJvYXJkIikuZ2V0U3RyaW5nKGZ1bmN0aW9uKGUpeyJzdWNjZXNzIj09PWUucmVzdWx0P2hpKHQse2RhdGE6ZS5kYXRhLGVyck1zZzoiZ2V0Q2xpcGJvYXJkRGF0YTpvayJ9KTpoaSh0LHtkYXRhOmUucmVzdWx0LGVyck1zZzoiZ2V0Q2xpcGJvYXJkRGF0YTpmYWlsIn0pfSl9LHNldENsaXBib2FyZERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhO3JldHVybiB2aSgiY2xpcGJvYXJkIikuc2V0U3RyaW5nKHQpLHtlcnJNc2c6InNldENsaXBib2FyZERhdGE6b2sifX0sc3RhcnRDb21wYXNzOlhvLHN0b3BDb21wYXNzOllvLG9uQ29tcGFzc0NoYW5nZTpmdW5jdGlvbihlKXtKby5sZW5ndGh8fFhvKCksSm8ucHVzaChlKX0sb2ZmQ29tcGFzc0NoYW5nZTpmdW5jdGlvbihlKXtpZihlKXt2YXIgdD1Kby5pbmRleE9mKGUpOzA8PXQmJkpvLnNwbGljZSh0LDEpfUpvLmxlbmd0aHx8WW8oKX0sZ2V0TmV0d29ya1R5cGU6ZnVuY3Rpb24oKXtyZXR1cm57ZXJyTXNnOiJnZXROZXR3b3JrVHlwZTpvayIsbmV0d29ya1R5cGU6bW9bZGcubmV0d29ya2luZm8uZ2V0Q3VycmVudFR5cGUoKV18fCJ1bmtub3duIn19LG9uQmVhY29uVXBkYXRlOktvLG9uQmVhY29uU2VydmljZUNoYW5nZTpabyxnZXRCZWFjb25zOlFvLHN0YXJ0QmVhY29uRGlzY292ZXJ5OmVhLHN0b3BCZWFjb25EaXNjb3Zlcnk6dGEsbWFrZVBob25lQ2FsbDpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5waG9uZU51bWJlcjtyZXR1cm4gZGcuZGV2aWNlLmRpYWwodCkse2Vyck1zZzoibWFrZVBob25lQ2FsbDpvayJ9fSxzY2FuQ29kZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj0id2VleCIhPT1tZy5udnVlQ29tcGlsZXI/amE6T2E7cmV0dXJuIG4uc2NhbkNvZGUuYXBwbHkobixlKX0sY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uOkJhLGNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6RGEsc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUucmVxdWVzdEF1dGhNb2RlcyxyPWUuY2hhbGxlbmdlO3ZvaWQgMD09PXImJihyPSExKTt2YXIgaT1lLmF1dGhDb250ZW50LG89QmEoKS5zdXBwb3J0TW9kZTtpZigwPT09by5sZW5ndGgpcmV0dXJue2F1dGhNb2RlOm9bMF18fCJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwMSxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIG5vdCBzdXBwb3J0In07dmFyIGE9W107aWYobi5tYXAoZnVuY3Rpb24oZSx0KXstMTxvLmluZGV4T2YoZSkmJmEucHVzaChlKX0pLDA9PT1hLmxlbmd0aClyZXR1cm57YXV0aE1vZGU6YVswXXx8ImZpbmdlclByaW50IixlcnJDb2RlOjkwMDAzLGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgbm8gY29ycmVzcG9uZGluZyBtb2RlIn07dmFyIHM9W107aWYoYS5tYXAoZnVuY3Rpb24oZSx0KXtEYSh7Y2hlY2tBdXRoTW9kZTplfSkuaXNFbnJvbGxlZCYmcy5wdXNoKGUpfSksMD09PXMubGVuZ3RoKXJldHVybnthdXRoTW9kZTphWzBdLGVyckNvZGU6OTAwMTEsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCBubyAiK2FbMF0rIiBlbnJvbGxlZCJ9O3ZhciBjPXNbMF07aWYoImZpbmdlclByaW50Ij09PWMpe3ZhciB1LGw9bnVsbCxkPWl8fGN0KCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLmF1dGhDb250ZW50Iik7ImFuZHJvaWQiPT09ZGcub3MubmFtZS50b0xvd2VyQ2FzZSgpJiYoKGw9ZGcubmF0aXZlVUkuc2hvd1dhaXRpbmcoZCkpLm9uY2xvc2U9ZnVuY3Rpb24oKXtkZy5maW5nZXJwcmludC5jYW5jZWwoKX0pLGRnLmZpbmdlcnByaW50LmF1dGhlbnRpY2F0ZShmdW5jdGlvbigpe2RnLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLGhpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTowLGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOm9rIn0pfSxmdW5jdGlvbihlKXtzd2l0Y2goZS5jb2RlKXtjYXNlIGUuQVVUSEVOVElDQVRFX01JU01BVENIOmwmJihoZyh1KSxsLnNldFRpdGxlKGN0KCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLndhaXRpbmdDb250ZW50IikpLHU9cGcoZnVuY3Rpb24oKXtsJiZsLnNldFRpdGxlKGQpfSwxZTMpKTticmVhaztjYXNlIGUuQVVUSEVOVElDQVRFX09WRVJMSU1JVDpkZy5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxoaSh0LHthdXRoTW9kZTpjLGVyckNvZGU6OTAwMTAsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCBhdXRoZW50aWNhdGUgZnJlZXplLiBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIn0pO2JyZWFrO2Nhc2UgZS5DQU5DRUw6ZGcubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksaGkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA4LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgY2FuY2VsIn0pO2JyZWFrO2RlZmF1bHQ6ZGcubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksaGkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA3LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwifSl9fSx7bWVzc2FnZTppfSl9ZWxzZSJmYWNpYWwiPT09YyYmdmkoImZhY2VJRCIpLmF1dGhlbnRpY2F0ZSh7bWVzc2FnZTppfSxmdW5jdGlvbihlKXtpZigic3VjY2VzcyI9PT1lLnR5cGUmJjA9PT1lLmNvZGUpaGkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjAsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246b2sifSk7ZWxzZSBzd2l0Y2goZS5jb2RlKXtjYXNlIDQ6aGkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA5LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwifSk7YnJlYWs7Y2FzZSA1OmhpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAxMCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIGF1dGhlbnRpY2F0ZSBmcmVlemUuIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIifSk7YnJlYWs7Y2FzZSA2OmhpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAwOCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIGNhbmNlbCJ9KTticmVhaztkZWZhdWx0OmhpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAwNyxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIn0pfX0pfSx3ZWV4R2V0U3lzdGVtSW5mb1N5bmM6WXMsZ2V0RGV2aWNlSW5mbzpLcyxnZXRBcHBCYXNlSW5mbzpacyxnZXRTeXN0ZW1JbmZvU3luYzpmdW5jdGlvbigpe3JldHVybiBTaShRcyxPYmplY3QuY3JlYXRlKG51bGwpLCJnZXRTeXN0ZW1JbmZvIiwiZ2V0U3lzdGVtSW5mb1N5bmMiKX0sZ2V0U3lzdGVtSW5mbzpRcyx2aWJyYXRlTG9uZzpmdW5jdGlvbigpe3JldHVybiBkZy5kZXZpY2UudmlicmF0ZSg0MDApLHtlcnJNc2c6InZpYnJhdGVMb25nOm9rIn19LHZpYnJhdGVTaG9ydDpmdW5jdGlvbigpe3JldHVybiBkZy5kZXZpY2UudmlicmF0ZSgxNSkse2Vyck1zZzoidmlicmF0ZVNob3J0Om9rIn19LGdldFdpbmRvd0luZm86R3MsZ2V0U3lzdGVtU2V0dGluZzpmdW5jdGlvbigpe3ZhciBlPSgwLGxnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRTeXN0ZW1TZXR0aW5nKSgpO3RyeXsic3RyaW5nIj09dHlwZW9mIGUmJihlPUpTT04ucGFyc2UoZSkpfWNhdGNoKGUpe31yZXR1cm4gZX0sZ2V0QXBwQXV0aG9yaXplU2V0dGluZzplYyxvcGVuQXBwQXV0aG9yaXplU2V0dGluZzpmdW5jdGlvbihlLHQpeygwLGxnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5vcGVuQXBwQXV0aG9yaXplU2V0dGluZykoZnVuY3Rpb24oZSl7InN1Y2Nlc3MiPT09ZS50eXBlP2hpKHQse2Vyck1zZzoib3BlbkFwcEF1dGhvcml6ZVNldHRpbmc6b2sifSk6aGkodCx7ZXJyTXNnOiJvcGVuQXBwQXV0aG9yaXplU2V0dGluZzpmYWlsIn0pfSl9LHNhdmVGaWxlOmZ1bmN0aW9uKGUsbil7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0LHI9ZS50ZW1wRmlsZVBhdGgsaT1CaShuLCJzYXZlRmlsZSIpLG89IiIrRGF0ZS5ub3coKStpYysrKygxPCh0PXIuc3BsaXQoIi4iKSkubGVuZ3RoPyIuIit0W3QubGVuZ3RoLTFdOiIiKTtkZy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKHIsZnVuY3Rpb24odCl7cmMoZnVuY3Rpb24oZSl7dC5jb3B5VG8oZSxvLGZ1bmN0aW9uKCl7aGkobix7ZXJyTXNnOiJzYXZlRmlsZTpvayIsc2F2ZWRGaWxlUGF0aDpuYysiLyIrb30pfSxpKX0saSl9LGkpfSxnZXRTYXZlZEZpbGVMaXN0OmZ1bmN0aW9uKGUsaSl7dmFyIG89QmkoaSwiZ2V0U2F2ZWRGaWxlTGlzdCIpO3JjKGZ1bmN0aW9uKGUpe3ZhciB0PWUuY3JlYXRlUmVhZGVyKCkscj1bXTt0LnJlYWRFbnRyaWVzKGZ1bmN0aW9uKG4pe24mJm4ubGVuZ3RoP24uZm9yRWFjaChmdW5jdGlvbih0KXt0LmdldE1ldGFkYXRhKGZ1bmN0aW9uKGUpe3IucHVzaCh7ZmlsZVBhdGg6ZGcuaW8uY29udmVydEFic29sdXRlRmlsZVN5c3RlbSh0LmZ1bGxQYXRoKSxjcmVhdGVUaW1lOmUubW9kaWZpY2F0aW9uVGltZS5nZXRUaW1lKCksc2l6ZTplLnNpemV9KSxyLmxlbmd0aD09PW4ubGVuZ3RoJiZoaShpLHtlcnJNc2c6ImdldFNhdmVkRmlsZUxpc3Q6b2siLGZpbGVMaXN0OnJ9KX0sbywhMSl9KTpoaShpLHtlcnJNc2c6ImdldFNhdmVkRmlsZUxpc3Q6b2siLGZpbGVMaXN0OnJ9KX0sbyl9LG8pfSxnZXRGaWxlSW5mbzpvYyxnZXRTYXZlZEZpbGVJbmZvOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuZmlsZVBhdGgscj1CaSh0LCJnZXRTYXZlZEZpbGVJbmZvIik7ZGcuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChuLGZ1bmN0aW9uKGUpe2UuZ2V0TWV0YWRhdGEoZnVuY3Rpb24oZSl7aGkodCx7Y3JlYXRlVGltZTplLm1vZGlmaWNhdGlvblRpbWUuZ2V0VGltZSgpLHNpemU6ZS5zaXplLGVyck1zZzoiZ2V0U2F2ZWRGaWxlSW5mbzpvayJ9KX0sciwhMSl9LHIpfSxyZW1vdmVTYXZlZEZpbGU6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5maWxlUGF0aCxyPUJpKHQsInJlbW92ZVNhdmVkRmlsZSIpO2RnLmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwobixmdW5jdGlvbihlKXtlLnJlbW92ZShmdW5jdGlvbigpe2hpKHQse2Vyck1zZzoicmVtb3ZlU2F2ZWRGaWxlOm9rIn0pfSxyKX0scil9LG9wZW5Eb2N1bWVudDpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoLHI9KGUuZmlsZVR5cGUsTmkodCwic2F2ZUZpbGUiKSksaT1CaSh0LCJzYXZlRmlsZSIpO2RnLnJ1bnRpbWUub3BlbkRvY3VtZW50KEFpKG4pLHZvaWQgMCxyLGkpfSxjaG9vc2VMb2NhdGlvbjpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj0id2VleCIhPT1tZy5udnVlQ29tcGlsZXI/Y2M6c2M7cmV0dXJuIG4uY2hvb3NlTG9jYXRpb24uYXBwbHkobixlKX0sZ2V0TG9jYXRpb246ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS50eXBlO3ZvaWQgMD09PW4mJihuPSJ3Z3M4NCIpO3ZhciByPWUuZ2VvY29kZTt2b2lkIDA9PT1yJiYocj0hMSk7dmFyIGk9ZS5hbHRpdHVkZTt2b2lkIDA9PT1pJiYoaT0hMSk7dmFyIG89ZS5pc0hpZ2hBY2N1cmFjeTt2b2lkIDA9PT1vJiYobz0hMSk7dmFyIGE9ZS5oaWdoQWNjdXJhY3lFeHBpcmVUaW1lLHM9QmkodCwiZ2V0TG9jYXRpb24iKTtkZy5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oZnVuY3Rpb24oZSl7dWMobixlLHQpfSxmdW5jdGlvbihlKXsxNTAxIT09ZS5jb2RlP3MoZSk6dWMobixlLHQpfSx7Z2VvY29kZTpyLGVuYWJsZUhpZ2hBY2N1cmFjeTpvfHxpLHRpbWVvdXQ6YSxjb29yZHNUeXBlOm59KX0sb3BlbkxvY2F0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3ZhciBuPSJ3ZWV4IiE9PW1nLm52dWVDb21waWxlcj9kYzpsYztyZXR1cm4gbi5vcGVuTG9jYXRpb24uYXBwbHkobixlKX0sc3RhcnRMb2NhdGlvblVwZGF0ZTpmdW5jdGlvbihlLG4pe3ZhciB0PWUudHlwZTt2b2lkIDA9PT10JiYodD0iZ2NqMDIiKSx2Yz12Y3x8ZGcuZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbihmdW5jdGlvbih0KXtoYz0hMCxmYy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2hpKGUsdC5jb29yZHMpfSl9LGZ1bmN0aW9uKHQpe2hjfHwoaGkobix7ZXJyTXNnOiJzdGFydExvY2F0aW9uVXBkYXRlOmZhaWwgIit0Lm1lc3NhZ2V9KSxoYz0hMCkscGMuZm9yRWFjaChmdW5jdGlvbihlKXtoaShlLHtlcnJNc2c6Im9uTG9jYXRpb25DaGFuZ2U6ZmFpbCAiK3QubWVzc2FnZX0pfSl9LHtjb29yZHNUeXBlOnR9KSxwZyhmdW5jdGlvbigpe2hpKG4se2Vyck1zZzoic3RhcnRMb2NhdGlvblVwZGF0ZTpvayJ9KX0sMTAwKX0sc3RvcExvY2F0aW9uVXBkYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIDAhPT12YyYmKGRnLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godmMpLGhjPSExLHZjPTApLHt9fSxvbkxvY2F0aW9uQ2hhbmdlOmZ1bmN0aW9uKGUpe2ZjLnB1c2goZSl9LG9mZkxvY2F0aW9uQ2hhbmdlOmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PWZjLmluZGV4T2YoZSk7MDw9dCYmZmMuc3BsaWNlKHQsMSl9ZWxzZSBmYz1bXX0sb25Mb2NhdGlvbkNoYW5nZUVycm9yOmZ1bmN0aW9uKGUpe3BjLnB1c2goZSl9LG9mZkxvY2F0aW9uQ2hhbmdlRXJyb3I6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9cGMuaW5kZXhPZihlKTswPD10JiZwYy5zcGxpY2UodCwxKX1lbHNlIHBjPVtdfSxzdGFydFJlY29yZDpmdW5jdGlvbihlLHQpe2djJiZnYy5zdG9wKCksKGdjPWRnLmF1ZGlvLmdldFJlY29yZGVyKCkpLnJlY29yZCh7ZmlsZW5hbWU6Il9kb2MvYXVkaW8vIixmb3JtYXQ6ImFhYyJ9LGZ1bmN0aW9uKGUpe2hpKHQse2Vyck1zZzoic3RhcnRSZWNvcmQ6b2siLHRlbXBGaWxlUGF0aDplfSl9LGZ1bmN0aW9uKGUpe2hpKHQse2Vyck1zZzoic3RhcnRSZWNvcmQ6ZmFpbCJ9KX0pLG1jPXBnKGZ1bmN0aW9uKCl7Z2Muc3RvcCgpLGdjPSExfSwzNmU1KX0sc3RvcFJlY29yZDpmdW5jdGlvbigpe3JldHVybiBnYz8obWMmJmhnKG1jKSxnYy5zdG9wKCkse2Vyck1zZzoic3RvcFJlY29yZDpvayJ9KTp7ZXJyTXNnOiJzdG9wUmVjb3JkOmZhaWwifX0scGxheVZvaWNlOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuZmlsZVBhdGg7aWYoeWMmJl9jPT09biYmInBhdXNlIj09PWJjKXJldHVybiBiYz0icGxheSIseWMucGxheShmdW5jdGlvbihlKXtiYz1fYz15Yz0hMSxoaSh0LHtlcnJNc2c6InBsYXlWb2ljZTpvayJ9KX0pLHtlcnJNc2c6InBsYXlWb2ljZTpvayJ9O3ljJiZ5Yy5zdG9wKCksX2M9bixiYz0icGxheSIsKHljPWRnLmF1ZGlvLmNyZWF0ZVBsYXllcihBaShuKSkpLnBsYXkoZnVuY3Rpb24oZSl7YmM9X2M9eWM9ITEsaGkodCx7ZXJyTXNnOiJwbGF5Vm9pY2U6b2sifSl9KX0scGF1c2VWb2ljZTpmdW5jdGlvbigpe3JldHVybiB5YyYmInBsYXkiPT09YmMmJih5Yy5wYXVzZSgpLGJjPSJwYXVzZSIpLHtlcnJNc2c6InBhdXNlVm9pY2U6b2sifX0sc3RvcFZvaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHljJiYoeWMuc3RvcCgpLGJjPV9jPXljPSExKSx7ZXJyTXNnOiJzdG9wVm9pY2U6b2sifX0sY2hvb3NlSW1hZ2U6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5jb3VudCxyPWUuc2l6ZVR5cGUsaT1lLnNvdXJjZVR5cGUsbz1lLmNyb3AsYT1CaSh0LCJjaG9vc2VJbWFnZSIsImNhbmNlbCIpO2Z1bmN0aW9uIHMocil7dmFyIGk9W10sbz1bXTtQcm9taXNlLmFsbChyLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gcj1lLG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7ZGcuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChyLGZ1bmN0aW9uKGUpe2UuZ2V0TWV0YWRhdGEodCxuLCExKX0sbil9KTt2YXIgcn0pKS50aGVuKGZ1bmN0aW9uKGUpe2UuZm9yRWFjaChmdW5jdGlvbihlLHQpe3ZhciBuPXJbdF07by5wdXNoKG4pLGkucHVzaCh7cGF0aDpuLHNpemU6ZS5zaXplfSl9KSxoaSh0LHtlcnJNc2c6ImNob29zZUltYWdlOm9rIix0ZW1wRmlsZVBhdGhzOm8sdGVtcEZpbGVzOml9KX0pLmNhdGNoKGEpfWZ1bmN0aW9uIGMoKXtkZy5jYW1lcmEuZ2V0Q2FtZXJhKCkuY2FwdHVyZUltYWdlKGZ1bmN0aW9uKGUpe3JldHVybiBzKFtlXSl9LGEse2ZpbGVuYW1lOmJvKyIvY2FtZXJhLyIscmVzb2x1dGlvbjoiaGlnaCIsY3JvcDpvLHNpemVUeXBlOnJ9KX1mdW5jdGlvbiB1KCl7ZGcuZ2FsbGVyeS5waWNrKGZ1bmN0aW9uKGUpe3JldHVybiBzKGUuZmlsZXMpfSxhLHttYXhpbXVtOm4sbXVsdGlwbGU6ITAsc3lzdGVtOiExLGZpbGVuYW1lOmJvKyIvZ2FsbGVyeS8iLHBlcm1pc3Npb25BbGVydDohMCxjcm9wOm8sc2l6ZVR5cGU6cn0pfWlmKDE9PT1pLmxlbmd0aCl7aWYoaS5pbmNsdWRlcygiYWxidW0iKSlyZXR1cm4gdm9pZCB1KCk7aWYoaS5pbmNsdWRlcygiY2FtZXJhIikpcmV0dXJuIHZvaWQgYygpfWRnLm5hdGl2ZVVJLmFjdGlvblNoZWV0KHtjYW5jZWw6Y3QoInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiKSxidXR0b25zOlt7dGl0bGU6Y3QoInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmNhbWVyYSIpfSx7dGl0bGU6Y3QoInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmFsYnVtIil9XX0sZnVuY3Rpb24oZSl7c3dpdGNoKGUuaW5kZXgpe2Nhc2UgMTpjKCk7YnJlYWs7Y2FzZSAyOnUoKTticmVhaztkZWZhdWx0OmEoKX19KX0sY2hvb3NlVmlkZW86ZnVuY3Rpb24oZSxyKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5zb3VyY2VUeXBlLG49ZS5jb21wcmVzc2VkLGk9ZS5tYXhEdXJhdGlvbixvPWUuY2FtZXJhLGE9QmkociwiY2hvb3NlVmlkZW8iLCJjYW5jZWwiKTtmdW5jdGlvbiBzKG4pe3ZvaWQgMD09PW4mJihuPSIiKSxkZy5pby5nZXRWaWRlb0luZm8oe2ZpbGVQYXRoOm4sc3VjY2VzczpmdW5jdGlvbihlKXt2YXIgdD17ZXJyTXNnOiJjaG9vc2VWaWRlbzpvayIsdGVtcEZpbGVQYXRoOm59O3Quc2l6ZT1lLnNpemUsdC5kdXJhdGlvbj1lLmR1cmF0aW9uLHQud2lkdGg9ZS53aWR0aCx0LmhlaWdodD1lLmhlaWdodCxoaShyLHQpfSxmYWlsOmF9KX1mdW5jdGlvbiBjKCl7ZGcuZ2FsbGVyeS5waWNrKGZ1bmN0aW9uKGUpe3JldHVybiBzKGUuZmlsZXNbMF0pfSxhLHtmaWx0ZXI6InZpZGVvIixzeXN0ZW06ITEsbXVsdGlwbGU6ITAsbWF4aW11bToxLGZpbGVuYW1lOmJvKyIvZ2FsbGVyeS8iLHBlcm1pc3Npb25BbGVydDohMCx2aWRlb0NvbXByZXNzOm59KX1mdW5jdGlvbiB1KCl7ZGcuY2FtZXJhLmdldENhbWVyYSgpLnN0YXJ0VmlkZW9DYXB0dXJlKHMsYSx7aW5kZXg6ImZyb250Ij09PW8/MjoxLHZpZGVvTWF4aW11bUR1cmF0aW9uOmksZmlsZW5hbWU6Ym8rIi9jYW1lcmEvIix2aWRlb0NvbXByZXNzOm59KX1pZigxPT09dC5sZW5ndGgpe2lmKHQuaW5jbHVkZXMoImFsYnVtIikpcmV0dXJuIHZvaWQgYygpO2lmKHQuaW5jbHVkZXMoImNhbWVyYSIpKXJldHVybiB2b2lkIHUoKX1kZy5uYXRpdmVVSS5hY3Rpb25TaGVldCh7Y2FuY2VsOmN0KCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIiksYnV0dG9uczpbe3RpdGxlOmN0KCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5jYW1lcmEiKX0se3RpdGxlOmN0KCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5hbGJ1bSIpfV19LGZ1bmN0aW9uKGUpe3N3aXRjaChlLmluZGV4KXtjYXNlIDE6dSgpO2JyZWFrO2Nhc2UgMjpjKCk7YnJlYWs7ZGVmYXVsdDphKCl9fSl9LGNvbXByZXNzSW1hZ2U6ZnVuY3Rpb24oZSx0KXt2YXIgbj1ibysiL2NvbXByZXNzZWQvIitEYXRlLm5vdygpKyJfIitSaShlLnNyYykscj1CaSh0LCJjb21wcmVzc0ltYWdlIiksaT1lLmNvbXByZXNzZWRXaWR0aCxvPWUuY29tcHJlc3NlZEhlaWdodDsibnVtYmVyIj09dHlwZW9mIGkmJihlLndpZHRoPWkrInB4IiksIm51bWJlciI9PXR5cGVvZiBvJiYoZS5oZWlnaHQ9bysicHgiKSxkZy56aXAuY29tcHJlc3NJbWFnZShPYmplY3QuYXNzaWduKHt9LGUse2RzdDpufSksZnVuY3Rpb24oKXtoaSh0LHtlcnJNc2c6ImNvbXByZXNzSW1hZ2U6b2siLHRlbXBGaWxlUGF0aDpufSl9LHIpfSxjb21wcmVzc1ZpZGVvOmZ1bmN0aW9uKGUsdCl7dmFyIG49Ym8rIi9jb21wcmVzc2VkLyIrRGF0ZS5ub3coKSsiXyIrUmkoZS5zcmMpLHI9TmkodCwiY29tcHJlc3NWaWRlbyIpLGk9QmkodCwiY29tcHJlc3NWaWRlbyIpO2RnLnppcC5jb21wcmVzc1ZpZGVvKE9iamVjdC5hc3NpZ24oe30sZSx7ZmlsZW5hbWU6bn0pLHIsaSl9LGdldEltYWdlSW5mbzpTYyxnZXRWaWRlb0luZm86eGMscHJldmlld0ltYWdlUGx1czpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5jdXJyZW50O3ZvaWQgMD09PXQmJih0PTApO3ZhciBuPWUuYmFja2dyb3VuZDt2b2lkIDA9PT1uJiYobj0iIzAwMDAwMCIpO3ZhciByPWUuaW5kaWNhdG9yO3ZvaWQgMD09PXImJihyPSJudW1iZXIiKTt2YXIgaT1lLmxvb3A7dm9pZCAwPT09aSYmKGk9ITEpO3ZhciBvPWUudXJscyxhPWUubG9uZ1ByZXNzQWN0aW9ucztvPW8ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBBaShlKX0pO3ZhciBzPU51bWJlcih0KTtyZXR1cm4gdD1pc05hTihzKT8odD1vLmluZGV4T2YoQWkodCkpKTwwPzA6dDpzLGRnLm5hdGl2ZVVJLnByZXZpZXdJbWFnZShvLHtjdXJyZW50OnQsYmFja2dyb3VuZDpuLGluZGljYXRvcjpyLGxvb3A6aSxvbkxvbmdQcmVzczpmdW5jdGlvbih0KXt2YXIgZT1bXSxuPSIiLHI9IiIsaT1hJiZhLmNhbGxiYWNrSWQ7aT8oZT1hLml0ZW1MaXN0P2EuaXRlbUxpc3Q6W10sbj1hLml0ZW1Db2xvcj9hLml0ZW1Db2xvcjoiIzAwMDAwMCIscj1hLnRpdGxlP2EudGl0bGU6IiIpOihlPVtjdCgidW5pLnByZXZpZXdJbWFnZS5idXR0b24uc2F2ZSIpXSxuPSIjMDAwMDAwIixyPSIiKTt2YXIgbz17YnV0dG9uczplLm1hcChmdW5jdGlvbihlKXtyZXR1cm57dGl0bGU6ZSxjb2xvcjpufX0pLGNhbmNlbDpjdCgidW5pLnByZXZpZXdJbWFnZS5jYW5jZWwiKX07ciYmKG8udGl0bGU9ciksZGcubmF0aXZlVUkuYWN0aW9uU2hlZXQobyxmdW5jdGlvbihlKXtpZigwPGUuaW5kZXgpe2lmKGkpcmV0dXJuIHZvaWQgZ2koYS5jYWxsYmFja0lkLHtlcnJNc2c6InNob3dBY3Rpb25TaGVldDpvayIsdGFwSW5kZXg6ZS5pbmRleC0xLGluZGV4OnQuaW5kZXh9KTtkZy5nYWxsZXJ5LnNhdmUodC51cmwsZnVuY3Rpb24oZSl7ZGcubmF0aXZlVUkudG9hc3QoY3QoInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5zdWNjZXNzIikpfSxmdW5jdGlvbigpe2RnLm5hdGl2ZVVJLnRvYXN0KGN0KCJ1bmkucHJldmlld0ltYWdlLnNhdmUuZmFpbCIpKX0pfWVsc2UgaSYmZ2koYS5jYWxsYmFja0lkLHtlcnJNc2c6InNob3dBY3Rpb25TaGVldDpmYWlsIGNhbmNlbCJ9KX0pfX0pLHtlcnJNc2c6InByZXZpZXdJbWFnZTpvayJ9fSxjbG9zZVByZXZpZXdJbWFnZVBsdXM6ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGRnLm5hdGl2ZVVJLmNsb3NlUHJldmlld0ltYWdlKCkse2Vyck1zZzoiY2xvc2VQcmV2aWV3SW1hZ2VQbHVzOm9rIn19Y2F0Y2goZSl7cmV0dXJue2Vyck1zZzoiY2xvc2VQcmV2aWV3SW1hZ2VQbHVzOmZhaWwifX19LG9wZXJhdGVSZWNvcmRlcjpmdW5jdGlvbihlLHQpe3ZhciBuPWUub3BlcmF0aW9uVHlwZSxyPXt9O2Zvcih2YXIgaSBpbiBlKS0xPT09WyJvcGVyYXRpb25UeXBlIl0uaW5kZXhPZihpKSYmKHJbaV09ZVtpXSk7dmFyIG89cjtyZXR1cm4gVGNbbl0obykse2Vyck1zZzoib3BlcmF0ZVJlY29yZGVyOm9rIn19LHNhdmVJbWFnZVRvUGhvdG9zQWxidW06ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5maWxlUGF0aCxyPU5pKHQsInNhdmVJbWFnZVRvUGhvdG9zQWxidW0iKSxpPUJpKHQsInNhdmVJbWFnZVRvUGhvdG9zQWxidW0iKTtkZy5nYWxsZXJ5LnNhdmUoQWkobikscixpKX0sc2F2ZVZpZGVvVG9QaG90b3NBbGJ1bTpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoO2RnLmdhbGxlcnkuc2F2ZShBaShuKSxmdW5jdGlvbihlKXtoaSh0LHtlcnJNc2c6InNhdmVWaWRlb1RvUGhvdG9zQWxidW06b2sifSl9LGZ1bmN0aW9uKGUpe2hpKHQse2Vyck1zZzoic2F2ZVZpZGVvVG9QaG90b3NBbGJ1bTpmYWlsIn0pfSl9LG9wZXJhdGVEb3dubG9hZFRhc2s6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuZG93bmxvYWRUYXNrSWQsbj1lLm9wZXJhdGlvblR5cGUscj1BY1t0XTtyZXR1cm4gciYmImFib3J0Ij09PW4/KGRlbGV0ZSBBY1t0XSxyLmFib3J0KCksRWMoe2Rvd25sb2FkVGFza0lkOnQsc3RhdGU6ImZhaWwiLGVyck1zZzoiYWJvcnQifSkse2Vyck1zZzoib3BlcmF0ZURvd25sb2FkVGFzazpvayJ9KTp7ZXJyTXNnOiJvcGVyYXRlRG93bmxvYWRUYXNrOmZhaWwifX0sY3JlYXRlRG93bmxvYWRUYXNrOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnVybCxyPWUuaGVhZGVyLGk9ZS50aW1lb3V0O2k9KGl8fG1nLm5ldHdvcmtUaW1lb3V0JiZtZy5uZXR3b3JrVGltZW91dC5yZXF1ZXN0fHw2ZTQpLzFlMzt2YXIgbz1kZy5kb3dubG9hZGVyLmNyZWF0ZURvd25sb2FkKHQse3RpbWVvdXQ6aSxmaWxlbmFtZTpibysiL2Rvd25sb2FkLyIscmV0cnk6MCxyZXRyeUludGVydmFsOjB9LGZ1bmN0aW9uKGUsdCl7RWModD97ZG93bmxvYWRUYXNrSWQ6bixzdGF0ZToic3VjY2VzcyIsdGVtcEZpbGVQYXRoOmUuZmlsZW5hbWUsc3RhdHVzQ29kZTp0fTp7ZG93bmxvYWRUYXNrSWQ6bixzdGF0ZToiZmFpbCIsc3RhdHVzQ29kZTp0fSl9KTtmb3IodmFyIGEgaW4gcilrKHIsYSkmJm8uc2V0UmVxdWVzdEhlYWRlcihhLHJbYV0pO3JldHVybiBvLmFkZEV2ZW50TGlzdGVuZXIoInN0YXRlY2hhbmdlZCIsZnVuY3Rpb24oZSx0KXtlLmRvd25sb2FkZWRTaXplJiZlLnRvdGFsU2l6ZSYmRWMoe2Rvd25sb2FkVGFza0lkOm4sc3RhdGU6InByb2dyZXNzVXBkYXRlIixwcm9ncmVzczpwYXJzZUludChlLmRvd25sb2FkZWRTaXplL2UudG90YWxTaXplKjEwMCksdG90YWxCeXRlc1dyaXR0ZW46ZS5kb3dubG9hZGVkU2l6ZSx0b3RhbEJ5dGVzRXhwZWN0ZWRUb1dyaXRlOmUudG90YWxTaXplfSl9KSwoQWNbbl09bykuc3RhcnQoKSx7ZG93bmxvYWRUYXNrSWQ6bixlcnJNc2c6ImNyZWF0ZURvd25sb2FkVGFzazpvayJ9fSgrK09jLGUpfSxjcmVhdGVSZXF1ZXN0VGFza0J5SWQ6amMsY3JlYXRlUmVxdWVzdFRhc2s6ZnVuY3Rpb24oZSl7cmV0dXJuIGpjKCsrSWMsZSl9LG9wZXJhdGVSZXF1ZXN0VGFzazpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5yZXF1ZXN0VGFza0lkLG49ZS5vcGVyYXRpb25UeXBlLHI9JGNbdF07cmV0dXJuIHImJiJhYm9ydCI9PT1uPyhyLmFib3J0KCkse2Vyck1zZzoib3BlcmF0ZVJlcXVlc3RUYXNrOm9rIn0pOntlcnJNc2c6Im9wZXJhdGVSZXF1ZXN0VGFzazpmYWlsIn19LGNvbmZpZ01UTFM6ZnVuY3Rpb24oZSxpKXt2YXIgdD1lLmNlcnRpZmljYXRlczt2aSgic3RyZWFtIikuY29uZmlnTVRMUyh0LGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUuY29kZSxyPWUubWVzc2FnZTtzd2l0Y2godCl7Y2FzZSJzdWNjZXNzIjpoaShpLHtlcnJNc2c6ImNvbmZpZ01UTFM6b2siLGNvZGU6bn0pO2JyZWFrO2Nhc2UiZmFpbCI6aGkoaSx7ZXJyTXNnOiJjb25maWdNVExTOmZhaWwgIityLGNvZGU6bn0pfX0pfSxjcmVhdGVTb2NrZXRUYXNrOmZ1bmN0aW9uKGUpe3JldHVybiBEYyhTdHJpbmcoRGF0ZS5ub3coKSksZSl9LG9wZXJhdGVTb2NrZXRUYXNrOmZ1bmN0aW9uKGUpe3ZhciB0PWUsbj10Lm9wZXJhdGlvblR5cGUscj10LmNvZGUsaT10LnJlYXNvbixvPXQuZGF0YSxhPXQuc29ja2V0VGFza0lkLHM9TmNbYV07aWYoIXMpcmV0dXJue2Vyck1zZzoib3BlcmF0ZVNvY2tldFRhc2s6ZmFpbCJ9O3N3aXRjaChuKXtjYXNlInNlbmQiOnJldHVybiBvJiZzLnNlbmQoe2lkOmEsZGF0YToib2JqZWN0Ij09dHlwZW9mIG8/eyJAdHlwZSI6ImJpbmFyeSIsYmFzZTY0OmtpKG8pfTpvfSkse2Vyck1zZzoib3BlcmF0ZVNvY2tldFRhc2s6b2sifTtjYXNlImNsb3NlIjpyZXR1cm4gcy5jbG9zZSh7aWQ6YSxjb2RlOnIscmVhc29uOml9KSxkZWxldGUgTmNbYV0se2Vyck1zZzoib3BlcmF0ZVNvY2tldFRhc2s6b2sifX1yZXR1cm57ZXJyTXNnOiJvcGVyYXRlU29ja2V0VGFzazpmYWlsIn19LG9wZXJhdGVVcGxvYWRUYXNrOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnVwbG9hZFRhc2tJZCxuPWUub3BlcmF0aW9uVHlwZSxyPUZjW3RdO3JldHVybiByJiYiYWJvcnQiPT09bj8oZGVsZXRlIEZjW3RdLHIuYWJvcnQoKSxVYyh7dXBsb2FkVGFza0lkOnQsc3RhdGU6ImZhaWwiLGVyck1zZzoiYWJvcnQifSkse2Vyck1zZzoib3BlcmF0ZVVwbG9hZFRhc2s6b2sifSk6e2Vyck1zZzoib3BlcmF0ZVVwbG9hZFRhc2s6ZmFpbCJ9fSxjcmVhdGVVcGxvYWRUYXNrOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnVybCxyPWUuZmlsZVBhdGgsaT1lLm5hbWUsbz1lLmZpbGVzLGE9ZS5oZWFkZXIscz1lLmZvcm1EYXRhLGM9ZS50aW1lb3V0O2M9KGN8fG1nLm5ldHdvcmtUaW1lb3V0JiZtZy5uZXR3b3JrVGltZW91dC51cGxvYWRGaWxlfHw2ZTQpLzFlMzt2YXIgdT1kZy51cGxvYWRlci5jcmVhdGVVcGxvYWQodCx7dGltZW91dDpjLHJldHJ5OjAscmV0cnlJbnRlcnZhbDowfSxmdW5jdGlvbihlLHQpe1VjKHQ/e3VwbG9hZFRhc2tJZDpuLHN0YXRlOiJzdWNjZXNzIixkYXRhOmUucmVzcG9uc2VUZXh0LHN0YXR1c0NvZGU6dH06e3VwbG9hZFRhc2tJZDpuLHN0YXRlOiJmYWlsIixkYXRhOiIiLHN0YXR1c0NvZGU6dH0pLGRlbGV0ZSBGY1tuXX0pO2Zvcih2YXIgbCBpbiBhKWsoYSxsKSYmdS5zZXRSZXF1ZXN0SGVhZGVyKGwsU3RyaW5nKGFbbF0pKTtmb3IodmFyIGQgaW4gcylrKHMsZCkmJnUuYWRkRGF0YShkLFN0cmluZyhzW2RdKSk7cmV0dXJuIG8mJm8ubGVuZ3RoP28uZm9yRWFjaChmdW5jdGlvbihlKXt1LmFkZEZpbGUoQWkoZS51cml8fGUuZmlsZVBhdGgpLHtrZXk6ZS5uYW1lfHwiZmlsZSJ9KX0pOnUuYWRkRmlsZShBaShyKSx7a2V5Oml9KSx1LmFkZEV2ZW50TGlzdGVuZXIoInN0YXRlY2hhbmdlZCIsZnVuY3Rpb24oZSx0KXtlLnVwbG9hZGVkU2l6ZSYmZS50b3RhbFNpemUmJlVjKHt1cGxvYWRUYXNrSWQ6bixzdGF0ZToicHJvZ3Jlc3NVcGRhdGUiLHByb2dyZXNzOnBhcnNlSW50KGUudXBsb2FkZWRTaXplL2UudG90YWxTaXplKjEwMCksdG90YWxCeXRlc1NlbnQ6ZS51cGxvYWRlZFNpemUsdG90YWxCeXRlc0V4cGVjdGVkVG9TZW5kOmUudG90YWxTaXplfSl9KSwoRmNbbl09dSkuc3RhcnQoKSx7dXBsb2FkVGFza0lkOm4sZXJyTXNnOiJjcmVhdGVVcGxvYWRUYXNrOm9rIn19KCsrUmMsZSl9LGdldFByb3ZpZGVyOmZ1bmN0aW9uKGUscil7dmFyIGk9ZS5zZXJ2aWNlO1ZjW2ldP1ZjW2ldKGZ1bmN0aW9uKGUsdCxuKXtoaShyLGU/e2Vyck1zZzoiZ2V0UHJvdmlkZXI6ZmFpbCAiK2UubWVzc2FnZX06e2Vyck1zZzoiZ2V0UHJvdmlkZXI6b2siLHNlcnZpY2U6aSxwcm92aWRlcjp0LHByb3ZpZGVyczpuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlLnNlcnZpY2VSZWFkeSYmKGUuaXNBcHBFeGlzdD1lLnNlcnZpY2VSZWFkeSksImJvb2xlYW4iPT10eXBlb2YgZS5uYXRpdmVDbGllbnQmJihlLmlzQXBwRXhpc3Q9ZS5uYXRpdmVDbGllbnQpLGV9KX0pfSk6aGkocix7ZXJyTXNnOiJnZXRQcm92aWRlcjpmYWlsIHNlcnZpY2Ugbm90IGZvdW5kIn0pfSxsb2dpbjpXYyxnZXRVc2VySW5mbzpIYyxnZXRVc2VyUHJvZmlsZTpmdW5jdGlvbihlLHQpe3JldHVybiBIYyhlLHQpfSxvcGVyYXRlV1hEYXRhOmZ1bmN0aW9uKGUsdCl7c3dpdGNoKGUuZGF0YS5hcGlfbmFtZSl7Y2FzZSJ3ZWJhcGlfZ2V0dXNlcmluZm8iOkhjKGUsdCk7YnJlYWs7ZGVmYXVsdDpyZXR1cm57ZXJyTXNnOiJvcGVyYXRlV1hEYXRhOmZhaWwifX19LHByZUxvZ2luOkdjLGNsb3NlQXV0aFZpZXc6SmMsZ2V0Q2hlY2tCb3hTdGF0ZTpYYyxnZXRVbml2ZXJpZnlNYW5hZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHpjfHwoemM9bmV3IEtjKX0scmVxdWVzdFBheW1lbnQ6ZnVuY3Rpb24obixyKXt2YXIgaT1uLnByb3ZpZGVyLG89QmkociwicmVxdWVzdFBheW1lbnQiKTtkZy5wYXltZW50LmdldENoYW5uZWxzKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZD09PWl9KTt0P2RnLnBheW1lbnQucmVxdWVzdCh0LG4ub3JkZXJJbmZvLGZ1bmN0aW9uKGUpe2UuZXJyTXNnPSJyZXF1ZXN0UGF5bWVudDpvayIsaGkocixlKX0sbyk6aGkocix7ZXJyTXNnOiJyZXF1ZXN0UGF5bWVudDpmYWlsIHNlcnZpY2Ugbm90IGZvdW5kIn0pfSxvKX0sc3Vic2NyaWJlUHVzaDpmdW5jdGlvbihlLHQpe3ZhciBuPWRnLnB1c2guZ2V0Q2xpZW50SW5mbygpO3JldHVybiBuPyh0dXx8KHR1PSEwLGRnLnB1c2guYWRkRXZlbnRMaXN0ZW5lcigicmVjZWl2ZSIsZnVuY3Rpb24oZSl7WWMmJiFudSYmZ2koIm9uUHVzaE1lc3NhZ2UiLHttZXNzYWdlSWQ6ZS5fX1VVSURfXyxkYXRhOmUucGF5bG9hZCxlcnJNc2c6Im9uUHVzaDpvayJ9KX0pKSxudT0hMSxuLmVyck1zZz0ic3Vic2NyaWJlUHVzaDpvayIsbik6e2Vyck1zZzoic3Vic2NyaWJlUHVzaDpmYWlsIOivt+ehruS/neW9k+WJjei/kOihjOeOr+Wig+W3suWMheWQqyBwdXNoIOaooeWdlyJ9fSx1bnN1YnNjcmliZVB1c2g6ZnVuY3Rpb24oZSl7cmV0dXJuIG51PSEwLHtlcnJNc2c6InVuc3Vic2NyaWJlUHVzaDpvayJ9fSxvblB1c2g6ZnVuY3Rpb24oKXtyZXR1cm4gdHU/ZGcucHVzaC5nZXRDbGllbnRJbmZvKCk/KFljPSEwLHtlcnJNc2c6Im9uUHVzaDpvayJ9KTp7ZXJyTXNnOiJvblB1c2g6ZmFpbCDor7fnoa7kv53lvZPliY3ov5DooYznjq/looPlt7LljIXlkKsgcHVzaCDmqKHlnZcifTp7ZXJyTXNnOiJvblB1c2g6ZmFpbCDor7flhYjosIPnlKggdW5pLnN1YnNjcmliZVB1c2gifX0sb2ZmUHVzaDpmdW5jdGlvbihlKXtyZXR1cm4gWWM9ITEse2Vyck1zZzoib2ZmUHVzaDpvayJ9fSxjcmVhdGVQdXNoTWVzc2FnZTpmdW5jdGlvbihlLHQpe3ZhciBuPWVjKCk7aWYoImF1dGhvcml6ZWQiIT09bi5ub3RpZmljYXRpb25BdXRob3JpemVkKXJldHVybiBoaSh0LHtlcnJNc2c6ImNyZWF0ZVB1c2hNZXNzYWdlOmZhaWwgbm90aWZpY2F0aW9uQXV0aG9yaXplZDogIituLm5vdGlmaWNhdGlvbkF1dGhvcml6ZWR9KTt2YXIgcj1PYmplY3QuYXNzaWduKHt9LGUpO2RlbGV0ZSByLmNvbnRlbnQsZGVsZXRlIHIucGF5bG9hZCxkZy5wdXNoLmNyZWF0ZU1lc3NhZ2UoZS5jb250ZW50LGUucGF5bG9hZCxyKSxoaSh0LHtlcnJNc2c6ImNyZWF0ZVB1c2hNZXNzYWdlOm9rIn0pfSxnZXRDaGFubmVsTWFuYWdlcjpmdW5jdGlvbigpe3JldHVybiBldXx8KGV1PWRnLnB1c2guZ2V0Q2hhbm5lbE1hbmFnZXIoKSl9LHJlcXVpcmVOYXRpdmVQbHVnaW46cnUsc2hhcmVBcHBNZXNzYWdlRGlyZWN0bHk6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnRpdGxlLHI9ZS5wYXRoLGk9ZS5pbWFnZVVybCxvPWUudXNlRGVmYXVsdFNuYXBzaG90O249bnx8bWcuYXBwbmFtZTt2YXIgYT1mdW5jdGlvbigpe3N1KHtwcm92aWRlcjoid2VpeGluIix0eXBlOjAsdGl0bGU6bixpbWFnZVVybDppLGhyZWY6cixzY2VuZToiV1hTY2VuZVNlc3Npb24ifSx0LCJzaGFyZUFwcE1lc3NhZ2VEaXJlY3RseSIpfSxzPUJpKHQsInNoYXJlQXBwTWVzc2FnZURpcmVjdGx5Iik7aWYobyl7dmFyIGM9d2coKSx1PWRnLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoY1tjLmxlbmd0aC0xXS5fX3d4V2Vidmlld0lkX18rIiIpO2lmKHUpe3ZhciBsPW5ldyBkZy5uYXRpdmVPYmouQml0bWFwO3UuZHJhdyhsLGZ1bmN0aW9uKCl7dmFyIGU9Ym8rIi9zaGFyZS9zbmFwc2hvdC5qcGciO2wuc2F2ZShlLHtvdmVyd3JpdGU6ITAsZm9ybWF0OiJqcGcifSxmdW5jdGlvbigpe2k9ZSxhKCl9LHMpfSxzKX1lbHNlIGEoKX1lbHNlIGEoKX0sc2hhcmU6c3Usc2hhcmVXaXRoU3lzdGVtOmZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT1uJiYobj0ic2hhcmVXaXRoU3lzdGVtIik7dmFyIHI9ZS50eXBlLGk9ZS5pbWFnZVVybCxvPWUuc3VtbWFyeSxhPWUuaHJlZjtyPXJ8fCJ0ZXh0Ijt2YXIgcz1CaSh0LG4pO1sidGV4dCIsImltYWdlIl0uaW5kZXhPZihyKTwwJiZoaSh0LHtlcnJNc2c6bisiOmZhaWwg5YiG5Lqr5Y+C5pWwIHR5cGUg5LiN5q2j56GuIn0pLCJzdHJpbmciPT10eXBlb2YgaSYmaSYmKGk9QWkoaSkpLGRnLnNoYXJlLnNlbmRXaXRoU3lzdGVtKHt0eXBlOnIscGljdHVyZXM6aSYmW2ldLGNvbnRlbnQ6byxocmVmOmF9LGZ1bmN0aW9uKGUpe2hpKHQse2Vyck1zZzpuKyI6b2sifSl9LHMpfSxyZXN0b3JlR2xvYmFsOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt2YXIgYTtkZyE9PXQmJihsZz1lLGE9KGRnPXQpLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSxtaT1hLGRnLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZT15aSxwZz1uLGhnPXIsdmc9aSxnZz1vKSxtZy5zZXJ2aWNlUmVhZHk9ITB9LHJlcXVpcmVHbG9iYWw6ZnVuY3Rpb24oKXtmb3IodmFyIGU9WyJBcnJheUJ1ZmZlciIsIkludDhBcnJheSIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIkludDE2QXJyYXkiLCJVaW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJVaW50MzJBcnJheSIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkJpZ0ludDY0QXJyYXkiLCJCaWdVaW50NjRBcnJheSJdLHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3Rbcl09Z2xvYmFsW3JdfXJldHVybiB0fSxnZXRTdWJOVnVlQnlJZDp1dSxnZXRDdXJyZW50U3ViTlZ1ZTpmdW5jdGlvbigpe3JldHVybiB1dShkZy53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuaWQpfSxvbkhvc3RFdmVudFJlY2VpdmU6ZnVuY3Rpb24oZSl7bHUucHVzaChlKX0sb25OYXRpdmVFdmVudFJlY2VpdmU6ZnVuY3Rpb24oZSl7bHUucHVzaChlKX0sc2VuZE5hdGl2ZUV2ZW50OmR1LGxvYWRTdWJQYWNrYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPWUucm9vdDtpZigtMSE9PWtzLmluZGV4T2YoaSkpcmV0dXJue2Vyck1zZzoibG9hZFN1YlBhY2thZ2U6b2sifTtrcy5wdXNoKGkpLG49aSsiL2FwcC1zdWItc2VydmljZS5qcyIscj1mdW5jdGlvbihlKXtoaSh0LHtlcnJNc2c6ImxvYWRTdWJQYWNrYWdlOm9rIn0pfSxtZy5vblNlcnZpY2VSZWFkeShmdW5jdGlvbigpe2xnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5ldmFsSlNGaWxlcyhbbl0scil9KX0sc2VuZEhvc3RFdmVudDpmdSxuYXZpZ2F0ZVRvTWluaVByb2dyYW06ZnVuY3Rpb24oZSx0KXtmdSgibmF2aWdhdGVUb1VuaU1QIixlLGZ1bmN0aW9uKGUpe2lmKGUuZXJyTXNnJiYtMT09PWUuZXJyTXNnLmluZGV4T2YoIjpvayIpKXJldHVybiBoaSh0LHtlcnJNc2c6ZS5lcnJNc2d9KTtoaSh0LHtlcnJNc2c6Im5hdmlnYXRlVG9NaW5pUHJvZ3JhbTpvayJ9KX0pfSxnZXRMYXVuY2hPcHRpb25zU3luYzpmdW5jdGlvbigpe3JldHVybiBBc30sZ2V0RW50ZXJPcHRpb25zU3luYzpmdW5jdGlvbigpe3JldHVybiBFcygpfSxuYXZpZ2F0ZUJhY2s6TnUsbmF2aWdhdGVUbzpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9ZS5ldmVudHMsaT1lLm9wZW5UeXBlLG89ZS5hbmltYXRpb25UeXBlLGE9ZS5hbmltYXRpb25EdXJhdGlvbixzPW4uc3BsaXQoIj8iKSxjPXNbMF0sdT15Zy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1jfSkud2luZG93LGw9bWcud2luZG93fHx7fTtvfHwobz11LmFuaW1hdGlvblR5cGV8fGwuYW5pbWF0aW9uVHlwZXx8cmEpLGF8fChhPXUuYW5pbWF0aW9uRHVyYXRpb258fGwuYW5pbWF0aW9uRHVyYXRpb258fGlhKTt2YXIgZD1FKHNbMV18fCIiKTttcyhjLGZ1bmN0aW9uKCl7UnUoe3VybDpuLHBhdGg6YyxxdWVyeTpkLGV2ZW50czpyLGFuaW1hdGlvblR5cGU6byxhbmltYXRpb25EdXJhdGlvbjphfSx0KX0sImFwcExhdW5jaCI9PT1pKX0scmVMYXVuY2g6ZnVuY3Rpb24oZSxhKXt2YXIgcz1lLnVybCx0PXMuc3BsaXQoIj8iKSxjPXRbMF0sdT1FKHRbMV18fCIiKTttcyhjLGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvO3Q9YSxuPShlPXt1cmw6cyxwYXRoOmMscXVlcnk6dX0pLnVybCxyPWUucGF0aCxpPWUucXVlcnksbz13ZyghMCkuc2xpY2UoMCkseWcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09cn0pLm1ldGEuaXNUYWJCYXImJkhzLnN3aXRjaFRhYihyLnNsaWNlKDEpKSxNdShOcyh7dXJsOm4scGF0aDpyLHF1ZXJ5Omksb3BlblR5cGU6InJlTGF1bmNoIn0pLCJub25lIiwwLGZ1bmN0aW9uKCl7by5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuJHJlbW92ZSgpLFB1KGUuJGdldEFwcFdlYnZpZXcoKSwibm9uZSIpfSksaGkodCx7ZXJyTXNnOiJyZUxhdW5jaDpvayJ9KX0pLF9pKCl9KX0scmVkaXJlY3RUbzpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9ZS5leGlzdHMsaT1uLnNwbGl0KCI/Iiksbz1pWzBdLGE9RShpWzFdfHwiIik7bXMobyxmdW5jdGlvbigpe1V1KHt1cmw6bixwYXRoOm8scXVlcnk6YSxleGlzdHM6cn0sdCl9KX0sc3dpdGNoVGFiOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS51cmwscj1lLmZyb20saT1lLm9wZW5UeXBlLG89bi5zcGxpdCgiPyIpLGE9b1swXSxzPUUob1sxXXx8IiIpO21zKGEsZnVuY3Rpb24oKXshZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnVybCxyPWUucGF0aCxpPWUucXVlcnk7ZS5mcm9tLEhzLnN3aXRjaFRhYihyLnNsaWNlKDEpKTt2YXIgbyxhLHM9d2coKSxjPXMubGVuZ3RoLHU9ITEsbD0hMTtpZigxPD1jJiYoKG89c1tjLTFdKS4kcGFnZS5tZXRhLmlzVGFiQmFyP3U9ITA6KGw9ITAscy5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbihlKXtlLiRwYWdlLm1ldGEuaXNUYWJCYXJ8fGU9PT1vfHwoZS4kcmVtb3ZlKCksUHUoZS4kZ2V0QXBwV2VidmlldygpLCJub25lIikpfSksby4kcmVtb3ZlKCkscGcoZnVuY3Rpb24oKXsicmVkaXJlY3QiPT09by4kcGFnZS5vcGVuVHlwZT9QdShvLiRnZXRBcHBXZWJ2aWV3KCksb2EsaWEpOlB1KG8uJGdldEFwcFdlYnZpZXcoKSwiYXV0byIpfSwxMDApKSksd2coITApLmZvckVhY2goZnVuY3Rpb24oZSl7Ii8iK2Uucm91dGU9PT1yPyhlLiRwYWdlLm1ldGEudmlzaWJsZXx8KGw9ITApLGUuJHBhZ2UubWV0YS52aXNpYmxlPSEwLGE9ZSk6ZS4kcGFnZS5tZXRhLmlzVGFiQmFyJiYoZS4kcGFnZS5tZXRhLnZpc2libGU9ITEpfSksbz09PWEmJih1PSExKSxvJiZ1JiZvLiR2bS5fX2NhbGxfaG9vaygib25IaWRlIiksIWEpcmV0dXJuIE11KE5zKHt1cmw6bixwYXRoOnIscXVlcnk6aSxvcGVuVHlwZToic3dpdGNoVGFiIn0pLCJub25lIiwwLGZ1bmN0aW9uKCl7X2koKSxoaSh0LHtlcnJNc2c6InN3aXRjaFRhYjpvayJ9KX0sNzApO3ZhciBkPWEuJGdldEFwcFdlYnZpZXcoKTtkLnNob3coIm5vbmUiKSxsJiYhZC5fX3ByZWxvYWRfXyYmYS4kdm0uX19jYWxsX2hvb2soIm9uU2hvdyIpLF9pKCksaGkodCx7ZXJyTXNnOiJzd2l0Y2hUYWI6b2sifSl9KHt1cmw6bixwYXRoOmEscXVlcnk6cyxmcm9tOnJ9LHQpfSwiYXBwTGF1bmNoIj09PWkpfSx1blByZWxvYWRQYWdlOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lLnVybCxpPSgobj1Mc1t0PXJdKSYmKG4uX19wYWdlX18mJmpzKCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09bi5fX3BhZ2VfX30pP24uX19wcmVsb2FkX189ITE6bi5jbG9zZSgibm9uZSIpLGRlbGV0ZSBMc1t0XSksbik7cmV0dXJuIGk/e2lkOmkuaWQsdXJsOnIsZXJyTXNnOiJ1blByZWxvYWRQYWdlOm9rIn06e3VybDpyLGVyck1zZzoidW5QcmVsb2FkUGFnZTpmYWlsIG5vdCBmb3VuZCJ9fSxwcmVsb2FkUGFnZTpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9bi5zcGxpdCgiPyIpO2hpKHQse2lkOmZ1bmN0aW9uKGUpe3ZhciB0PWUudXJsLG49ZS5wYXRoLHI9ZS5xdWVyeTtpZighTHNbdF0pe3ZhciBpPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoeWcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09bn0pKSk7THNbdF09ZHMobixpLHIse19fcHJlbG9hZF9fOiEwLF9fcXVlcnlfXzpKU09OLnN0cmluZ2lmeShyKX0pfXJldHVybiBMc1t0XX0oe3VybDpuLHBhdGg6clswXSxxdWVyeTpFKHJbMV18fCIiKX0pLmlkLHVybDpuLGVyck1zZzoicHJlbG9hZFBhZ2U6b2sifSl9LHNldFN0b3JhZ2U6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5rZXkscj1lLmRhdGEsaT0oZS5pc1N5bmMsdHlwZW9mIHIpLG89InN0cmluZyI9PT1pP3I6SlNPTi5zdHJpbmdpZnkoe3R5cGU6aSxkYXRhOnJ9KTt0cnl7InN0cmluZyI9PT1pJiZ2b2lkIDAhPT1HdShvKT9kZy5zdG9yYWdlLnNldEl0ZW1Bc3luYyhuK1d1LGksZnVuY3Rpb24oKXt9KTpkZy5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhuK1d1LGZ1bmN0aW9uKCl7fSksZGcuc3RvcmFnZS5zZXRJdGVtQXN5bmMobixvLGZ1bmN0aW9uKCl7aGkodCx7ZXJyTXNnOiJzZXRTdG9yYWdlOm9rIn0pfSxmdW5jdGlvbihlKXtoaSh0LHtlcnJNc2c6InNldFN0b3JhZ2U6ZmFpbCAiK2UubWVzc2FnZX0pfSl9Y2F0Y2goZSl7aGkodCx7ZXJyTXNnOiJzZXRTdG9yYWdlOmZhaWwgIitlfSl9fSxzZXRTdG9yYWdlU3luYzpmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiB0LHI9InN0cmluZyI9PT1uP3Q6SlNPTi5zdHJpbmdpZnkoe3R5cGU6bixkYXRhOnR9KTt0cnl7InN0cmluZyI9PT1uJiZ2b2lkIDAhPT1HdShyKT9kZy5zdG9yYWdlLnNldEl0ZW0oZStXdSxuKTpkZy5zdG9yYWdlLnJlbW92ZUl0ZW0oZStXdSksZGcuc3RvcmFnZS5zZXRJdGVtKGUscil9Y2F0Y2goZSl7fX0sZ2V0U3RvcmFnZTpmdW5jdGlvbihlLHIpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmtleTtkZy5zdG9yYWdlLmdldEl0ZW1Bc3luYyh0LGZ1bmN0aW9uKG4pe2RnLnN0b3JhZ2UuZ2V0SXRlbUFzeW5jKHQrV3UsZnVuY3Rpb24oZSl7dmFyIHQ9KGUuZGF0YXx8IiIpLnRvTG93ZXJDYXNlKCk7aGkocix7ZGF0YTpKdSh0LG4uZGF0YSksZXJyTXNnOiJnZXRTdG9yYWdlOm9rIn0pfSxmdW5jdGlvbigpe2hpKHIse2RhdGE6SnUoIiIsbi5kYXRhKSxlcnJNc2c6ImdldFN0b3JhZ2U6b2sifSl9KX0sZnVuY3Rpb24oZSl7aGkocix7ZGF0YToiIixlcnJNc2c6ImdldFN0b3JhZ2U6ZmFpbCAiK2UubWVzc2FnZX0pfSl9LGdldFN0b3JhZ2VTeW5jOmZ1bmN0aW9uKGUpe3ZhciB0PWRnLnN0b3JhZ2UuZ2V0SXRlbShlKSxuPShkZy5zdG9yYWdlLmdldEl0ZW0oZStXdSl8fCIiKS50b0xvd2VyQ2FzZSgpO3JldHVybiJzdHJpbmciIT10eXBlb2YgdD8iIjpKdShuLHQpfSxyZW1vdmVTdG9yYWdlOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUua2V5O2RnLnN0b3JhZ2UucmVtb3ZlSXRlbUFzeW5jKG4rV3UsZnVuY3Rpb24oKXt9KSxkZy5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhuLGZ1bmN0aW9uKGUpe2hpKHQse2Vyck1zZzoicmVtb3ZlU3RvcmFnZTpvayJ9KX0sZnVuY3Rpb24oZSl7aGkodCx7ZXJyTXNnOiJyZW1vdmVTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfSxyZW1vdmVTdG9yYWdlU3luYzpmdW5jdGlvbihlKXtkZy5zdG9yYWdlLnJlbW92ZUl0ZW0oZStXdSksZGcuc3RvcmFnZS5yZW1vdmVJdGVtKGUpfSxjbGVhclN0b3JhZ2U6ZnVuY3Rpb24oZSx0KXtkZy5zdG9yYWdlLmNsZWFyQXN5bmMoZnVuY3Rpb24oZSl7aGkodCx7ZXJyTXNnOiJjbGVhclN0b3JhZ2U6b2sifSl9LGZ1bmN0aW9uKGUpe2hpKHQse2Vyck1zZzoiY2xlYXJTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfSxjbGVhclN0b3JhZ2VTeW5jOmZ1bmN0aW9uKCl7ZGcuc3RvcmFnZS5jbGVhcigpfSxnZXRTdG9yYWdlSW5mbzpYdSxnZXRTdG9yYWdlSW5mb1N5bmM6ZnVuY3Rpb24oKXt2YXIgZT1YdSgpO3JldHVybiBkZWxldGUgZS5lcnJNc2csZX0sc2hvd0tleWJvYXJkOmZ1bmN0aW9uKCl7cmV0dXJuIGRnLmtleS5zaG93U29mdEtleWJvcmQoKSx7ZXJyTXNnOiJzaG93S2V5Ym9hcmQ6b2sifX0saGlkZUtleWJvYXJkOmZ1bmN0aW9uKCl7cmV0dXJuIGRnLmtleS5oaWRlU29mdEtleWJvcmQoKSx7ZXJyTXNnOiJoaWRlS2V5Ym9hcmQ6b2sifX0sc2V0TmF2aWdhdGlvbkJhclRpdGxlOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLl9fcGFnZV9fLG49ZS50aXRsZTt2b2lkIDA9PT1uJiYobj0iIik7dmFyIHI9eGkodCk7aWYocil7dmFyIGk9ci5nZXRTdHlsZSgpO3JldHVybiBpJiZpLnRpdGxlTlZpZXcmJnIuc2V0U3R5bGUoe3RpdGxlTlZpZXc6e3RpdGxlVGV4dDpufX0pLHtlcnJNc2c6InNldE5hdmlnYXRpb25CYXJUaXRsZTpvayJ9fXJldHVybntlcnJNc2c6InNldE5hdmlnYXRpb25CYXJUaXRsZTpmYWlsIn19LHNob3dOYXZpZ2F0aW9uQmFyTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiBkZy5uYXRpdmVVSS5zaG93V2FpdGluZygiIix7bW9kYWw6ITF9KSx7ZXJyTXNnOiJzaG93TmF2aWdhdGlvbkJhckxvYWRpbmc6b2sifX0saGlkZU5hdmlnYXRpb25CYXJMb2FkaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIGRnLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLHtlcnJNc2c6ImhpZGVOYXZpZ2F0aW9uQmFyTG9hZGluZzpvayJ9fSxzZXROYXZpZ2F0aW9uQmFyQ29sb3I6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0LG4scj1lLl9fcGFnZV9fLGk9ZS5mcm9udENvbG9yLG89ZS5iYWNrZ3JvdW5kQ29sb3IsYT14aShyKTtpZihhKXt2YXIgcz17fTtpJiYocy50aXRsZUNvbG9yPWkpLG8mJihzLmJhY2tncm91bmRDb2xvcj1vKTt2YXIgYz0iIzAwMDAwMCI9PT1pPyJkYXJrIjoibGlnaHQiO2RnLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZShjKSx0PWMsKG49d2coKSkubGVuZ3RoJiYobltuLmxlbmd0aC0xXS4kcGFnZS5tZXRhLnN0YXR1c0JhclN0eWxlPXQpO3ZhciB1PWEuZ2V0U3R5bGUoKTtyZXR1cm4gdSYmdS50aXRsZU5WaWV3JiYodS50aXRsZU5WaWV3LmF1dG9CYWNrQnV0dG9uJiYocy5iYWNrQnV0dG9uPXMuYmFja0J1dHRvbnx8e30scy5iYWNrQnV0dG9uLmNvbG9yPWkpLGEuc2V0U3R5bGUoe3RpdGxlTlZpZXc6c30pKSx7ZXJyTXNnOiJzZXROYXZpZ2F0aW9uQmFyQ29sb3I6b2sifX1yZXR1cm57ZXJyTXNnOiJzZXROYXZpZ2F0aW9uQmFyQ29sb3I6ZmFpbCJ9fSxzaG93TG9hZGluZzpmdW5jdGlvbihlKXtyZXR1cm4gU2koWXUsT2JqZWN0LmFzc2lnbih7fSxlLHt0eXBlOiJsb2FkaW5nIn0pLCJzaG93VG9hc3QiLCJzaG93TG9hZGluZyIpfSxoaWRlTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiBTaShLdSwibG9hZGluZyIsImhpZGUiLCJoaWRlTG9hZGluZyIpfSxzaG93VG9hc3Q6WXUsaGlkZVRvYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIFNpKEt1LCJ0b2FzdCIsImhpZGUiLCJoaWRlVG9hc3QiKX0saGlkZTpLdSxzaG93TW9kYWw6ZnVuY3Rpb24oZSxpKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS50aXRsZTt2b2lkIDA9PT10JiYodD0iIik7dmFyIG49ZS5jb250ZW50O3ZvaWQgMD09PW4mJihuPSIiKTt2YXIgbz1lLnNob3dDYW5jZWw7dm9pZCAwPT09byYmKG89ITApO3ZhciByPWUuY2FuY2VsVGV4dCxhPShlLmNhbmNlbENvbG9yLGUuY29uZmlybVRleHQpLHM9KGUuY29uZmlybUNvbG9yLGUuZWRpdGFibGUpO3ZvaWQgMD09PXMmJihzPSExKTt2YXIgYz1lLnBsYWNlaG9sZGVyVGV4dDt2b2lkIDA9PT1jJiYoYz0iIik7dmFyIHU9bz9bcixhXTpbYV0sbD1zP2M6dTtuPW58fCIgIixkZy5uYXRpdmVVSVtzPyJwcm9tcHQiOiJjb25maXJtIl0obixmdW5jdGlvbihlKXtpZihvKXt2YXIgdD0xPT09ZS5pbmRleCxuPXtlcnJNc2c6InNob3dNb2RhbDpvayIsY29uZmlybTp0LGNhbmNlbDowPT09ZS5pbmRleHx8LTE9PT1lLmluZGV4fTt0JiZzJiYobi5jb250ZW50PWUudmFsdWUpLGhpKGksbil9ZWxzZXt2YXIgcj17ZXJyTXNnOiJzaG93TW9kYWw6b2siLGNvbmZpcm06MD09PWUuaW5kZXgsY2FuY2VsOiExfTtzJiYoci5jb250ZW50PWUudmFsdWUpLGhpKGkscil9fSx0LGwsdSl9LHNob3dBY3Rpb25TaGVldDpmdW5jdGlvbihlLHQpe3ZhciBuPWUuaXRlbUxpc3Q7dm9pZCAwPT09biYmKG49W10pO3ZhciByPWUuaXRlbUNvbG9yLGk9ZS50aXRsZTt2b2lkIDA9PT1pJiYoaT0iIik7dmFyIG89ZS5wb3BvdmVyOyIjMDAwIj09PXImJm1nLmRhcmttb2RlJiYocj1RdVtkZy5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpXS5pdGVtQ29sb3IpO3ZhciBhPXtidXR0b25zOm4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybnt0aXRsZTplLGNvbG9yOnJ9fSl9O2kmJihhLnRpdGxlPWkpLGEuY2FuY2VsPWN0KCJ1bmkuc2hvd0FjdGlvblNoZWV0LmNhbmNlbCIpLGRnLm5hdGl2ZVVJLmFjdGlvblNoZWV0KE9iamVjdC5hc3NpZ24oYSx7cG9wb3ZlcjpvfSksZnVuY3Rpb24oZSl7MDxlLmluZGV4P2hpKHQse2Vyck1zZzoic2hvd0FjdGlvblNoZWV0Om9rIix0YXBJbmRleDplLmluZGV4LTF9KTpoaSh0LHtlcnJNc2c6InNob3dBY3Rpb25TaGVldDpmYWlsIGNhbmNlbCJ9KX0pfSxzZXRUYWJCYXJCYWRnZTpmdW5jdGlvbihlKXt2YXIgdD1lLmluZGV4LG49ZS50ZXh0LHI9ZS50eXBlO3JldHVybiB2b2lkIDA9PT1yJiYocj0idGV4dCIpLEhzLnNldFRhYkJhckJhZGdlKHIsdCxuKSx7ZXJyTXNnOiJzZXRUYWJCYXJCYWRnZTpvayJ9fSxzZXRUYWJCYXJJdGVtOmZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXgsbj1lLnRleHQscj1lLmljb25QYXRoLGk9ZS5zZWxlY3RlZEljb25QYXRoLG89ZS5wYWdlUGF0aCxhPWUudmlzaWJsZSxzPWUuaWNvbmZvbnQ7SHMuc2V0VGFiQmFySXRlbSh0LG4scixpLGEscyk7dmFyIGM9byYmeWcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09b30pO2lmKGMpe3ZhciB1PWMubWV0YTt1LmlzVGFiQmFyPSEwLHUudGFiQmFySW5kZXg9dCx1LmlzUXVpdD0hMDt2YXIgbD1tZy50YWJCYXI7bCYmbC5saXN0JiZsLmxpc3RbdF0mJihsLmxpc3RbdF0ucGFnZVBhdGg9by5zdGFydHNXaXRoKCIvIik/by5zdWJzdHJpbmcoMSk6byl9cmV0dXJue2Vyck1zZzoic2V0VGFiQmFySXRlbTpvayJ9fSxzZXRUYWJCYXJTdHlsZTpmdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lJiYoZT17fSksIWJpKCkpcmV0dXJue2Vyck1zZzoic2V0VGFiQmFyU3R5bGU6ZmFpbCBub3QgVGFiQmFyIHBhZ2UifTt2YXIgdD17YmxhY2s6InJnYmEoMCwwLDAsMC40KSIsd2hpdGU6InJnYmEoMjU1LDI1NSwyNTUsMC40KSJ9LG49ZS5ib3JkZXJTdHlsZTtyZXR1cm4gbiBpbiB0JiYoZS5ib3JkZXJTdHlsZT10W25dKSxIcy5zZXRUYWJCYXJTdHlsZShlKSx7ZXJyTXNnOiJzZXRUYWJCYXJTdHlsZTpvayJ9fSxoaWRlVGFiQmFyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYW5pbWF0aW9uO3JldHVybiBiaSgpPyhIcy5oaWRlVGFiQmFyKHQpLHtlcnJNc2c6ImhpZGVUYWJCYXI6b2sifSk6e2Vyck1zZzoiaGlkZVRhYkJhcjpmYWlsIG5vdCBUYWJCYXIgcGFnZSJ9fSxzaG93VGFiQmFyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYW5pbWF0aW9uO3JldHVybiBiaSgpPyhIcy5zaG93VGFiQmFyKHQpLHtlcnJNc2c6InNob3dUYWJCYXI6b2sifSk6e2Vyck1zZzoic2hvd1RhYkJhcjpmYWlsIG5vdCBUYWJCYXIgcGFnZSJ9fSxyZXF1ZXN0Q29tcG9uZW50SW5mbzpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvO2UuJHBhZ2UubWV0YS5pc05WdWU/aWwoZSx0LG4pOihyPWUsaT10LG89bixmZy5wdWJsaXNoSGFuZGxlcigicmVxdWVzdENvbXBvbmVudEluZm8iLHtyZXFJZDpubC5wdXNoKG8pLHJlcXM6aX0sci4kcGFnZS5pZCkpfSxjcmVhdGVSZXdhcmRlZFZpZGVvQWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBkbChlKX0sY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBfbChlKX0sY3JlYXRlSW50ZXJzdGl0aWFsQWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBibChlKX0sY3JlYXRlSW50ZXJhY3RpdmVBZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wcm92aWRlcj9lLmFkcGlkP25ldyBTbChlKTpuZXcgRXJyb3IoImFkcGlkIGludmFsaWQiKTpuZXcgRXJyb3IoInByb3ZpZGVyIGludmFsaWQiKX19KSxDbD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCkseGwscGkpO2Z1bmN0aW9uIFRsKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTtyZXR1cm4gQ2xbZV0uYXBwbHkobnVsbCx0KX1mdW5jdGlvbiBPbChlLHQpe3JldHVybiBmZy5vbigiYXBpLiIrZSx0KX1mdW5jdGlvbiBBbChlKXt2YXIgdD13ZygpLG49dC5sZW5ndGg7cmV0dXJuIG58fGZnLmVtaXQoIm9uRXJyb3IiLGUrIjpmYWlsIiksdFtuLTFdLiR2bX1mdW5jdGlvbiBFbCgpe3ZhciBlPXdnKCksdD1lW2UubGVuZ3RoLTFdO3JldHVybiB0JiZ0LiRwYWdlLmlkfXZhciBJbD1bImNhbnBsYXkiLCJwbGF5IiwicGF1c2UiLCJzdG9wIiwiZW5kZWQiLCJ0aW1lVXBkYXRlIiwicHJldiIsIm5leHQiLCJlcnJvciIsIndhaXRpbmciXSwkbD17fTtJbC5mb3JFYWNoKGZ1bmN0aW9uKGUpeyRsW2VdPVtdfSk7dmFyIFBsLE1sPVt7bmFtZToiZHVyYXRpb24iLHJlYWRvbmx5OiEwfSx7bmFtZToiY3VycmVudFRpbWUiLHJlYWRvbmx5OiEwfSx7bmFtZToicGF1c2VkIixyZWFkb25seTohMH0se25hbWU6InNyYyIsY2FjaGU6ITB9LHtuYW1lOiJzdGFydFRpbWUiLGRlZmF1bHQ6MCxjYWNoZTohMH0se25hbWU6ImJ1ZmZlcmVkIixyZWFkb25seTohMH0se25hbWU6InRpdGxlIixjYWNoZTohMH0se25hbWU6ImVwbmFtZSIsY2FjaGU6ITB9LHtuYW1lOiJzaW5nZXIiLGNhY2hlOiEwfSx7bmFtZToiY292ZXJJbWdVcmwiLGNhY2hlOiEwfSx7bmFtZToid2ViVXJsIixjYWNoZTohMH0se25hbWU6InByb3RvY29sIixyZWFkb25seTohMCxkZWZhdWx0OiJodHRwIn0se25hbWU6InBsYXliYWNrUmF0ZSIsZGVmYXVsdDoxLGNhY2hlOiEwfV0samw9WyJwcmV2IiwibmV4dCJdLExsPWZ1bmN0aW9uKCl7dmFyIHI9dGhpczt0aGlzLl9vcHRpb25zPXt9LE9sKCJvbkJhY2tncm91bmRBdWRpb1N0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnN0YXRlLG49ZS5lcnJNc2cscj1lLmVyckNvZGU7JGxbdF0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSgiZXJyb3IiPT09dD97ZXJyTXNnOm4sZXJyQ29kZTpyfTp7fSl9KX0pLGpsLmZvckVhY2goZnVuY3Rpb24oZSl7T2woIm9uQmFja2dyb3VuZEF1ZGlvIisoZVswXS50b1VwcGVyQ2FzZSgpK2Uuc3Vic3RyKDEpKSxmdW5jdGlvbigpeyRsW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUoe30pfSl9KX0pLE1sLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49dC5uYW1lLGU9e2dldDpmdW5jdGlvbigpe3ZhciBlPXQuY2FjaGU/dGhpcy5fb3B0aW9uczpUbCgiZ2V0QmFja2dyb3VuZEF1ZGlvU3RhdGUiKTtyZXR1cm4gbiBpbiBlP2Vbbl06dC5kZWZhdWx0fX07dC5yZWFkb25seXx8KGUuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuX29wdGlvbnNbbl09ZSxUbCgic2V0QmFja2dyb3VuZEF1ZGlvU3RhdGUiLE9iamVjdC5hc3NpZ24oe30sdGhpcy5fb3B0aW9ucyx7YXVkaW9JZDp0aGlzLmlkfSksbil9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixuLGUpfSl9O0xsLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5fb3BlcmF0ZSgicGxheSIpfSxMbC5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLl9vcGVyYXRlKCJwYXVzZSIpfSxMbC5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbigpe3RoaXMuX29wZXJhdGUoInN0b3AiKX0sTGwucHJvdG90eXBlLnNlZWs9ZnVuY3Rpb24oZSl7dGhpcy5fb3BlcmF0ZSgic2VlayIse2N1cnJlbnRUaW1lOmV9KX0sTGwucHJvdG90eXBlLl9vcGVyYXRlPWZ1bmN0aW9uKGUsdCl7VGwoIm9wZXJhdGVCYWNrZ3JvdW5kQXVkaW8iLE9iamVjdC5hc3NpZ24oe30sdCx7b3BlcmF0aW9uVHlwZTplfSkpfSxJbC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTtMbC5wcm90b3R5cGVbIm9uIitlXT1mdW5jdGlvbihlKXskbFt0XS5wdXNoKGUpfX0pO3ZhciBObD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRCYWNrZ3JvdW5kQXVkaW9NYW5hZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIFBsfHwoUGw9bmV3IExsKX19KSxCbD1WcihmdW5jdGlvbihlLHQpe3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSYmInVuZGVmaW5lZCIhPXR5cGVvZiBVaW50MTZBcnJheSYmInVuZGVmaW5lZCIhPXR5cGVvZiBJbnQzMkFycmF5O3QuYXNzaWduPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3IubGVuZ3RoOyl7dmFyIGk9ci5zaGlmdCgpO2lmKGkpe2lmKCJvYmplY3QiIT10eXBlb2YgaSl0aHJvdyBuZXcgVHlwZUVycm9yKGkrIm11c3QgYmUgbm9uLW9iamVjdCIpO2Zvcih2YXIgbyBpbiBpKXQ9aSxuPW8sT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihlW29dPWlbb10pfX1yZXR1cm4gZX0sdC5zaHJpbmtCdWY9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5sZW5ndGg9PT10P2U6ZS5zdWJhcnJheT9lLnN1YmFycmF5KDAsdCk6KGUubGVuZ3RoPXQsZSl9O3ZhciByPXthcnJheVNldDpmdW5jdGlvbihlLHQsbixyLGkpe2lmKHQuc3ViYXJyYXkmJmUuc3ViYXJyYXkpZS5zZXQodC5zdWJhcnJheShuLG4rciksaSk7ZWxzZSBmb3IodmFyIG89MDtvPHI7bysrKWVbaStvXT10W24rb119LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhO2Zvcih0PXI9MCxuPWUubGVuZ3RoO3Q8bjt0Kyspcis9ZVt0XS5sZW5ndGg7Zm9yKGE9bmV3IFVpbnQ4QXJyYXkociksdD1pPTAsbj1lLmxlbmd0aDt0PG47dCsrKW89ZVt0XSxhLnNldChvLGkpLGkrPW8ubGVuZ3RoO3JldHVybiBhfX0saT17YXJyYXlTZXQ6ZnVuY3Rpb24oZSx0LG4scixpKXtmb3IodmFyIG89MDtvPHI7bysrKWVbaStvXT10W24rb119LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oZSl7cmV0dXJuW10uY29uY2F0LmFwcGx5KFtdLGUpfX07dC5zZXRUeXBlZD1mdW5jdGlvbihlKXtlPyh0LkJ1Zjg9VWludDhBcnJheSx0LkJ1ZjE2PVVpbnQxNkFycmF5LHQuQnVmMzI9SW50MzJBcnJheSx0LmFzc2lnbih0LHIpKToodC5CdWY4PUFycmF5LHQuQnVmMTY9QXJyYXksdC5CdWYzMj1BcnJheSx0LmFzc2lnbih0LGkpKX0sdC5zZXRUeXBlZChuKX0pLERsPShCbC5hc3NpZ24sQmwuc2hyaW5rQnVmLEJsLnNldFR5cGVkLEJsLkJ1ZjgsQmwuQnVmMTYsQmwuQnVmMzIsMCksUmw9MTtmdW5jdGlvbiBGbChlKXtmb3IodmFyIHQ9ZS5sZW5ndGg7MDw9LS10OyllW3RdPTB9dmFyIFVsPTAsemw9MjksVmw9MjU2LHFsPVZsKzEremwsV2w9MzAsSGw9MTksR2w9MipxbCsxLEpsPTE1LFhsPTE2LFlsPTcsS2w9MjU2LFpsPTE2LFFsPTE3LGVkPTE4LHRkPVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdLG5kPVswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXSxyZD1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN10saWQ9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLG9kPW5ldyBBcnJheSgyKihxbCsyKSk7Rmwob2QpO3ZhciBhZD1uZXcgQXJyYXkoMipXbCk7RmwoYWQpO3ZhciBzZD1uZXcgQXJyYXkoNTEyKTtGbChzZCk7dmFyIGNkPW5ldyBBcnJheSgyNTYpO0ZsKGNkKTt2YXIgdWQ9bmV3IEFycmF5KHpsKTtGbCh1ZCk7dmFyIGxkLGRkLGZkLHBkPW5ldyBBcnJheShXbCk7ZnVuY3Rpb24gaGQoZSx0LG4scixpKXt0aGlzLnN0YXRpY190cmVlPWUsdGhpcy5leHRyYV9iaXRzPXQsdGhpcy5leHRyYV9iYXNlPW4sdGhpcy5lbGVtcz1yLHRoaXMubWF4X2xlbmd0aD1pLHRoaXMuaGFzX3N0cmVlPWUmJmUubGVuZ3RofWZ1bmN0aW9uIHZkKGUsdCl7dGhpcy5keW5fdHJlZT1lLHRoaXMubWF4X2NvZGU9MCx0aGlzLnN0YXRfZGVzYz10fWZ1bmN0aW9uIGdkKGUpe3JldHVybiBlPDI1Nj9zZFtlXTpzZFsyNTYrKGU+Pj43KV19ZnVuY3Rpb24gbWQoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT0yNTUmdCxlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTV9ZnVuY3Rpb24geWQoZSx0LG4pe2UuYmlfdmFsaWQ+WGwtbj8oZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsbWQoZSxlLmJpX2J1ZiksZS5iaV9idWY9dD4+WGwtZS5iaV92YWxpZCxlLmJpX3ZhbGlkKz1uLVhsKTooZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsZS5iaV92YWxpZCs9bil9ZnVuY3Rpb24gX2QoZSx0LG4pe3lkKGUsblsyKnRdLG5bMip0KzFdKX1mdW5jdGlvbiBiZChlLHQpe2Zvcih2YXIgbj0wO258PTEmZSxlPj4+PTEsbjw8PTEsMDwtLXQ7KTtyZXR1cm4gbj4+PjF9ZnVuY3Rpb24gd2QoZSx0LG4pe3ZhciByLGksbz1uZXcgQXJyYXkoSmwrMSksYT0wO2ZvcihyPTE7cjw9Smw7cisrKW9bcl09YT1hK25bci0xXTw8MTtmb3IoaT0wO2k8PXQ7aSsrKXt2YXIgcz1lWzIqaSsxXTswIT09cyYmKGVbMippXT1iZChvW3NdKysscykpfX1mdW5jdGlvbiBrZChlKXt2YXIgdDtmb3IodD0wO3Q8cWw7dCsrKWUuZHluX2x0cmVlWzIqdF09MDtmb3IodD0wO3Q8V2w7dCsrKWUuZHluX2R0cmVlWzIqdF09MDtmb3IodD0wO3Q8SGw7dCsrKWUuYmxfdHJlZVsyKnRdPTA7ZS5keW5fbHRyZWVbMipLbF09MSxlLm9wdF9sZW49ZS5zdGF0aWNfbGVuPTAsZS5sYXN0X2xpdD1lLm1hdGNoZXM9MH1mdW5jdGlvbiBTZChlKXs4PGUuYmlfdmFsaWQ/bWQoZSxlLmJpX2J1Zik6MDxlLmJpX3ZhbGlkJiYoZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109ZS5iaV9idWYpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wfWZ1bmN0aW9uIHhkKGUsdCxuLHIpe3ZhciBpPTIqdCxvPTIqbjtyZXR1cm4gZVtpXTxlW29dfHxlW2ldPT09ZVtvXSYmclt0XTw9cltuXX1mdW5jdGlvbiBDZChlLHQsbil7Zm9yKHZhciByPWUuaGVhcFtuXSxpPW48PDE7aTw9ZS5oZWFwX2xlbiYmKGk8ZS5oZWFwX2xlbiYmeGQodCxlLmhlYXBbaSsxXSxlLmhlYXBbaV0sZS5kZXB0aCkmJmkrKywheGQodCxyLGUuaGVhcFtpXSxlLmRlcHRoKSk7KWUuaGVhcFtuXT1lLmhlYXBbaV0sbj1pLGk8PD0xO2UuaGVhcFtuXT1yfWZ1bmN0aW9uIFRkKGUsdCxuKXt2YXIgcixpLG8sYSxzPTA7aWYoMCE9PWUubGFzdF9saXQpZm9yKDtyPWUucGVuZGluZ19idWZbZS5kX2J1ZisyKnNdPDw4fGUucGVuZGluZ19idWZbZS5kX2J1ZisyKnMrMV0saT1lLnBlbmRpbmdfYnVmW2UubF9idWYrc10scysrLDA9PT1yP19kKGUsaSx0KTooX2QoZSwobz1jZFtpXSkrVmwrMSx0KSwwIT09KGE9dGRbb10pJiZ5ZChlLGktPXVkW29dLGEpLF9kKGUsbz1nZCgtLXIpLG4pLDAhPT0oYT1uZFtvXSkmJnlkKGUsci09cGRbb10sYSkpLHM8ZS5sYXN0X2xpdDspO19kKGUsS2wsdCl9ZnVuY3Rpb24gT2QoZSx0KXt2YXIgbixyLGksbz10LmR5bl90cmVlLGE9dC5zdGF0X2Rlc2Muc3RhdGljX3RyZWUscz10LnN0YXRfZGVzYy5oYXNfc3RyZWUsYz10LnN0YXRfZGVzYy5lbGVtcyx1PS0xO2ZvcihlLmhlYXBfbGVuPTAsZS5oZWFwX21heD1HbCxuPTA7bjxjO24rKykwIT09b1syKm5dPyhlLmhlYXBbKytlLmhlYXBfbGVuXT11PW4sZS5kZXB0aFtuXT0wKTpvWzIqbisxXT0wO2Zvcig7ZS5oZWFwX2xlbjwyOylvWzIqKGk9ZS5oZWFwWysrZS5oZWFwX2xlbl09dTwyPysrdTowKV09MSxlLmRlcHRoW2ldPTAsZS5vcHRfbGVuLS0scyYmKGUuc3RhdGljX2xlbi09YVsyKmkrMV0pO2Zvcih0Lm1heF9jb2RlPXUsbj1lLmhlYXBfbGVuPj4xOzE8PW47bi0tKUNkKGUsbyxuKTtmb3IoaT1jO249ZS5oZWFwWzFdLGUuaGVhcFsxXT1lLmhlYXBbZS5oZWFwX2xlbi0tXSxDZChlLG8sMSkscj1lLmhlYXBbMV0sZS5oZWFwWy0tZS5oZWFwX21heF09bixlLmhlYXBbLS1lLmhlYXBfbWF4XT1yLG9bMippXT1vWzIqbl0rb1syKnJdLGUuZGVwdGhbaV09KGUuZGVwdGhbbl0+PWUuZGVwdGhbcl0/ZS5kZXB0aFtuXTplLmRlcHRoW3JdKSsxLG9bMipuKzFdPW9bMipyKzFdPWksZS5oZWFwWzFdPWkrKyxDZChlLG8sMSksMjw9ZS5oZWFwX2xlbjspO2UuaGVhcFstLWUuaGVhcF9tYXhdPWUuaGVhcFsxXSxmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscyxjPXQuZHluX3RyZWUsdT10Lm1heF9jb2RlLGw9dC5zdGF0X2Rlc2Muc3RhdGljX3RyZWUsZD10LnN0YXRfZGVzYy5oYXNfc3RyZWUsZj10LnN0YXRfZGVzYy5leHRyYV9iaXRzLHA9dC5zdGF0X2Rlc2MuZXh0cmFfYmFzZSxoPXQuc3RhdF9kZXNjLm1heF9sZW5ndGgsdj0wO2ZvcihvPTA7bzw9Smw7bysrKWUuYmxfY291bnRbb109MDtmb3IoY1syKmUuaGVhcFtlLmhlYXBfbWF4XSsxXT0wLG49ZS5oZWFwX21heCsxO248R2w7bisrKWg8KG89Y1syKmNbMioocj1lLmhlYXBbbl0pKzFdKzFdKzEpJiYobz1oLHYrKyksY1syKnIrMV09byx1PHJ8fChlLmJsX2NvdW50W29dKyssYT0wLHA8PXImJihhPWZbci1wXSkscz1jWzIqcl0sZS5vcHRfbGVuKz1zKihvK2EpLGQmJihlLnN0YXRpY19sZW4rPXMqKGxbMipyKzFdK2EpKSk7aWYoMCE9PXYpe2Rve2ZvcihvPWgtMTswPT09ZS5ibF9jb3VudFtvXTspby0tO2UuYmxfY291bnRbb10tLSxlLmJsX2NvdW50W28rMV0rPTIsZS5ibF9jb3VudFtoXS0tLHYtPTJ9d2hpbGUoMDx2KTtmb3Iobz1oOzAhPT1vO28tLSlmb3Iocj1lLmJsX2NvdW50W29dOzAhPT1yOyl1PChpPWUuaGVhcFstLW5dKXx8KGNbMippKzFdIT09byYmKGUub3B0X2xlbis9KG8tY1syKmkrMV0pKmNbMippXSxjWzIqaSsxXT1vKSxyLS0pfX0oZSx0KSx3ZChvLHUsZS5ibF9jb3VudCl9ZnVuY3Rpb24gQWQoZSx0LG4pe3ZhciByLGksbz0tMSxhPXRbMV0scz0wLGM9Nyx1PTQ7Zm9yKDA9PT1hJiYoYz0xMzgsdT0zKSx0WzIqKG4rMSkrMV09NjU1MzUscj0wO3I8PW47cisrKWk9YSxhPXRbMioocisxKSsxXSwrK3M8YyYmaT09PWF8fChzPHU/ZS5ibF90cmVlWzIqaV0rPXM6MCE9PWk/KGkhPT1vJiZlLmJsX3RyZWVbMippXSsrLGUuYmxfdHJlZVsyKlpsXSsrKTpzPD0xMD9lLmJsX3RyZWVbMipRbF0rKzplLmJsX3RyZWVbMiplZF0rKyxvPWksKHM9MCk9PT1hPyhjPTEzOCx1PTMpOmk9PT1hPyhjPTYsdT0zKTooYz03LHU9NCkpfWZ1bmN0aW9uIEVkKGUsdCxuKXt2YXIgcixpLG89LTEsYT10WzFdLHM9MCxjPTcsdT00O2ZvcigwPT09YSYmKGM9MTM4LHU9Mykscj0wO3I8PW47cisrKWlmKGk9YSxhPXRbMioocisxKSsxXSwhKCsrczxjJiZpPT09YSkpe2lmKHM8dSlmb3IoO19kKGUsaSxlLmJsX3RyZWUpLDAhPS0tczspO2Vsc2UgMCE9PWk/KGkhPT1vJiYoX2QoZSxpLGUuYmxfdHJlZSkscy0tKSxfZChlLFpsLGUuYmxfdHJlZSkseWQoZSxzLTMsMikpOnM8PTEwPyhfZChlLFFsLGUuYmxfdHJlZSkseWQoZSxzLTMsMykpOihfZChlLGVkLGUuYmxfdHJlZSkseWQoZSxzLTExLDcpKTtvPWksKHM9MCk9PT1hPyhjPTEzOCx1PTMpOmk9PT1hPyhjPTYsdT0zKTooYz03LHU9NCl9fUZsKHBkKTt2YXIgSWQ9ITE7ZnVuY3Rpb24gJGQoZSx0LG4scil7dmFyIGksbyxhLHM7eWQoZSwoVWw8PDEpKyhyPzE6MCksMyksbz10LGE9bixzPSEwLFNkKGk9ZSkscyYmKG1kKGksYSksbWQoaSx+YSkpLEJsLmFycmF5U2V0KGkucGVuZGluZ19idWYsaS53aW5kb3csbyxhLGkucGVuZGluZyksaS5wZW5kaW5nKz1hfXZhciBQZD17X3RyX2luaXQ6ZnVuY3Rpb24oZSl7SWR8fChmdW5jdGlvbigpe3ZhciBlLHQsbixyLGksbz1uZXcgQXJyYXkoSmwrMSk7Zm9yKHI9bj0wO3I8emwtMTtyKyspZm9yKHVkW3JdPW4sZT0wO2U8MTw8dGRbcl07ZSsrKWNkW24rK109cjtmb3IoY2Rbbi0xXT1yLHI9aT0wO3I8MTY7cisrKWZvcihwZFtyXT1pLGU9MDtlPDE8PG5kW3JdO2UrKylzZFtpKytdPXI7Zm9yKGk+Pj03O3I8V2w7cisrKWZvcihwZFtyXT1pPDw3LGU9MDtlPDE8PG5kW3JdLTc7ZSsrKXNkWzI1NitpKytdPXI7Zm9yKHQ9MDt0PD1KbDt0Kyspb1t0XT0wO2ZvcihlPTA7ZTw9MTQzOylvZFsyKmUrMV09OCxlKyssb1s4XSsrO2Zvcig7ZTw9MjU1OylvZFsyKmUrMV09OSxlKyssb1s5XSsrO2Zvcig7ZTw9Mjc5OylvZFsyKmUrMV09NyxlKyssb1s3XSsrO2Zvcig7ZTw9Mjg3OylvZFsyKmUrMV09OCxlKyssb1s4XSsrO2Zvcih3ZChvZCxxbCsxLG8pLGU9MDtlPFdsO2UrKylhZFsyKmUrMV09NSxhZFsyKmVdPWJkKGUsNSk7bGQ9bmV3IGhkKG9kLHRkLFZsKzEscWwsSmwpLGRkPW5ldyBoZChhZCxuZCwwLFdsLEpsKSxmZD1uZXcgaGQobmV3IEFycmF5KDApLHJkLDAsSGwsWWwpfSgpLElkPSEwKSxlLmxfZGVzYz1uZXcgdmQoZS5keW5fbHRyZWUsbGQpLGUuZF9kZXNjPW5ldyB2ZChlLmR5bl9kdHJlZSxkZCksZS5ibF9kZXNjPW5ldyB2ZChlLmJsX3RyZWUsZmQpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wLGtkKGUpfSxfdHJfc3RvcmVkX2Jsb2NrOiRkLF90cl9mbHVzaF9ibG9jazpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGE9MDswPGUubGV2ZWw/KDI9PT1lLnN0cm0uZGF0YV90eXBlJiYoZS5zdHJtLmRhdGFfdHlwZT1mdW5jdGlvbihlKXt2YXIgdCxuPTQwOTM2MjQ0NDc7Zm9yKHQ9MDt0PD0zMTt0Kyssbj4+Pj0xKWlmKDEmbiYmMCE9PWUuZHluX2x0cmVlWzIqdF0pcmV0dXJuIERsO2lmKDAhPT1lLmR5bl9sdHJlZVsxOF18fDAhPT1lLmR5bl9sdHJlZVsyMF18fDAhPT1lLmR5bl9sdHJlZVsyNl0pcmV0dXJuIFJsO2Zvcih0PTMyO3Q8Vmw7dCsrKWlmKDAhPT1lLmR5bl9sdHJlZVsyKnRdKXJldHVybiBSbDtyZXR1cm4gRGx9KGUpKSxPZChlLGUubF9kZXNjKSxPZChlLGUuZF9kZXNjKSxhPWZ1bmN0aW9uKGUpe3ZhciB0O2ZvcihBZChlLGUuZHluX2x0cmVlLGUubF9kZXNjLm1heF9jb2RlKSxBZChlLGUuZHluX2R0cmVlLGUuZF9kZXNjLm1heF9jb2RlKSxPZChlLGUuYmxfZGVzYyksdD1IbC0xOzM8PXQmJjA9PT1lLmJsX3RyZWVbMippZFt0XSsxXTt0LS0pO3JldHVybiBlLm9wdF9sZW4rPTMqKHQrMSkrNSs1KzQsdH0oZSksaT1lLm9wdF9sZW4rMys3Pj4+Mywobz1lLnN0YXRpY19sZW4rMys3Pj4+Myk8PWkmJihpPW8pKTppPW89bis1LG4rNDw9aSYmLTEhPT10PyRkKGUsdCxuLHIpOjQ9PT1lLnN0cmF0ZWd5fHxvPT09aT8oeWQoZSwyKyhyPzE6MCksMyksVGQoZSxvZCxhZCkpOih5ZChlLDQrKHI/MTowKSwzKSxmdW5jdGlvbihlLHQsbixyKXt2YXIgaTtmb3IoeWQoZSx0LTI1Nyw1KSx5ZChlLG4tMSw1KSx5ZChlLHItNCw0KSxpPTA7aTxyO2krKyl5ZChlLGUuYmxfdHJlZVsyKmlkW2ldKzFdLDMpO0VkKGUsZS5keW5fbHRyZWUsdC0xKSxFZChlLGUuZHluX2R0cmVlLG4tMSl9KGUsZS5sX2Rlc2MubWF4X2NvZGUrMSxlLmRfZGVzYy5tYXhfY29kZSsxLGErMSksVGQoZSxlLmR5bl9sdHJlZSxlLmR5bl9kdHJlZSkpLGtkKGUpLHImJlNkKGUpfSxfdHJfdGFsbHk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnBlbmRpbmdfYnVmW2UuZF9idWYrMiplLmxhc3RfbGl0XT10Pj4+OCYyNTUsZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqZS5sYXN0X2xpdCsxXT0yNTUmdCxlLnBlbmRpbmdfYnVmW2UubF9idWYrZS5sYXN0X2xpdF09MjU1Jm4sZS5sYXN0X2xpdCsrLDA9PT10P2UuZHluX2x0cmVlWzIqbl0rKzooZS5tYXRjaGVzKyssdC0tLGUuZHluX2x0cmVlWzIqKGNkW25dK1ZsKzEpXSsrLGUuZHluX2R0cmVlWzIqZ2QodCldKyspLGUubGFzdF9saXQ9PT1lLmxpdF9idWZzaXplLTF9LF90cl9hbGlnbjpmdW5jdGlvbihlKXt2YXIgdDt5ZChlLDIsMyksX2QoZSxLbCxvZCksMTY9PT0odD1lKS5iaV92YWxpZD8obWQodCx0LmJpX2J1ZiksdC5iaV9idWY9MCx0LmJpX3ZhbGlkPTApOjg8PXQuYmlfdmFsaWQmJih0LnBlbmRpbmdfYnVmW3QucGVuZGluZysrXT0yNTUmdC5iaV9idWYsdC5iaV9idWY+Pj04LHQuYmlfdmFsaWQtPTgpfX07dmFyIE1kPWZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIgaT02NTUzNSZlfDAsbz1lPj4+MTYmNjU1MzV8MCxhPTA7MCE9PW47KXtmb3Iobi09YT0yZTM8bj8yZTM6bjtvPW8rKGk9aSt0W3IrK118MCl8MCwtLWE7KTtpJT02NTUyMSxvJT02NTUyMX1yZXR1cm4gaXxvPDwxNnwwfTt2YXIgamQ9ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1bXSxuPTA7bjwyNTY7bisrKXtlPW47Zm9yKHZhciByPTA7cjw4O3IrKyllPTEmZT8zOTg4MjkyMzg0XmU+Pj4xOmU+Pj4xO3Rbbl09ZX1yZXR1cm4gdH0oKTt2YXIgTGQsTmQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9amQsbz1yK247ZV49LTE7Zm9yKHZhciBhPXI7YTxvO2ErKyllPWU+Pj44XmlbMjU1JihlXnRbYV0pXTtyZXR1cm4tMV5lfSxCZD17MjoibmVlZCBkaWN0aW9uYXJ5IiwxOiJzdHJlYW0gZW5kIiwwOiIiLCItMSI6ImZpbGUgZXJyb3IiLCItMiI6InN0cmVhbSBlcnJvciIsIi0zIjoiZGF0YSBlcnJvciIsIi00IjoiaW5zdWZmaWNpZW50IG1lbW9yeSIsIi01IjoiYnVmZmVyIGVycm9yIiwiLTYiOiJpbmNvbXBhdGlibGUgdmVyc2lvbiJ9LERkPTAsUmQ9NCxGZD0wLFVkPS0yLHpkPS0xLFZkPTQscWQ9MixXZD04LEhkPTksR2Q9Mjg2LEpkPTMwLFhkPTE5LFlkPTIqR2QrMSxLZD0xNSxaZD0zLFFkPTI1OCxlZj1RZCtaZCsxLHRmPTQyLG5mPTExMyxyZj0xLG9mPTIsYWY9MyxzZj00O2Z1bmN0aW9uIGNmKGUsdCl7cmV0dXJuIGUubXNnPUJkW3RdLHR9ZnVuY3Rpb24gdWYoZSl7cmV0dXJuKGU8PDEpLSg0PGU/OTowKX1mdW5jdGlvbiBsZihlKXtmb3IodmFyIHQ9ZS5sZW5ndGg7MDw9LS10OyllW3RdPTB9ZnVuY3Rpb24gZGYoZSl7dmFyIHQ9ZS5zdGF0ZSxuPXQucGVuZGluZztuPmUuYXZhaWxfb3V0JiYobj1lLmF2YWlsX291dCksMCE9PW4mJihCbC5hcnJheVNldChlLm91dHB1dCx0LnBlbmRpbmdfYnVmLHQucGVuZGluZ19vdXQsbixlLm5leHRfb3V0KSxlLm5leHRfb3V0Kz1uLHQucGVuZGluZ19vdXQrPW4sZS50b3RhbF9vdXQrPW4sZS5hdmFpbF9vdXQtPW4sdC5wZW5kaW5nLT1uLDA9PT10LnBlbmRpbmcmJih0LnBlbmRpbmdfb3V0PTApKX1mdW5jdGlvbiBmZihlLHQpe1BkLl90cl9mbHVzaF9ibG9jayhlLDA8PWUuYmxvY2tfc3RhcnQ/ZS5ibG9ja19zdGFydDotMSxlLnN0cnN0YXJ0LWUuYmxvY2tfc3RhcnQsdCksZS5ibG9ja19zdGFydD1lLnN0cnN0YXJ0LGRmKGUuc3RybSl9ZnVuY3Rpb24gcGYoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10fWZ1bmN0aW9uIGhmKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dD4+PjgmMjU1LGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPTI1NSZ0fWZ1bmN0aW9uIHZmKGUsdCl7dmFyIG4scixpPWUubWF4X2NoYWluX2xlbmd0aCxvPWUuc3Ryc3RhcnQsYT1lLnByZXZfbGVuZ3RoLHM9ZS5uaWNlX21hdGNoLGM9ZS5zdHJzdGFydD5lLndfc2l6ZS1lZj9lLnN0cnN0YXJ0LShlLndfc2l6ZS1lZik6MCx1PWUud2luZG93LGw9ZS53X21hc2ssZD1lLnByZXYsZj1lLnN0cnN0YXJ0K1FkLHA9dVtvK2EtMV0saD11W28rYV07ZS5wcmV2X2xlbmd0aD49ZS5nb29kX21hdGNoJiYoaT4+PTIpLHM+ZS5sb29rYWhlYWQmJihzPWUubG9va2FoZWFkKTtkb3tpZih1WyhuPXQpK2FdPT09aCYmdVtuK2EtMV09PT1wJiZ1W25dPT09dVtvXSYmdVsrK25dPT09dVtvKzFdKXtvKz0yLG4rKztkb3t9d2hpbGUodVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmdVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmdVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJm88Zik7aWYocj1RZC0oZi1vKSxvPWYtUWQsYTxyKXtpZihlLm1hdGNoX3N0YXJ0PXQsczw9KGE9cikpYnJlYWs7cD11W28rYS0xXSxoPXVbbythXX19fXdoaWxlKCh0PWRbdCZsXSk+YyYmMCE9LS1pKTtyZXR1cm4gYTw9ZS5sb29rYWhlYWQ/YTplLmxvb2thaGVhZH1mdW5jdGlvbiBnZihlKXt2YXIgdCxuLHIsaSxvLGEscyxjLHUsbCxkPWUud19zaXplO2Rve2lmKGk9ZS53aW5kb3dfc2l6ZS1lLmxvb2thaGVhZC1lLnN0cnN0YXJ0LGUuc3Ryc3RhcnQ+PWQrKGQtZWYpKXtmb3IoQmwuYXJyYXlTZXQoZS53aW5kb3csZS53aW5kb3csZCxkLDApLGUubWF0Y2hfc3RhcnQtPWQsZS5zdHJzdGFydC09ZCxlLmJsb2NrX3N0YXJ0LT1kLHQ9bj1lLmhhc2hfc2l6ZTtyPWUuaGVhZFstLXRdLGUuaGVhZFt0XT1kPD1yP3ItZDowLC0tbjspO2Zvcih0PW49ZDtyPWUucHJldlstLXRdLGUucHJldlt0XT1kPD1yP3ItZDowLC0tbjspO2krPWR9aWYoMD09PWUuc3RybS5hdmFpbF9pbilicmVhaztpZihhPWUuc3RybSxzPWUud2luZG93LGM9ZS5zdHJzdGFydCtlLmxvb2thaGVhZCx1PWksbD12b2lkIDAsbD1hLmF2YWlsX2luLHU8bCYmKGw9dSksbj0wPT09bD8wOihhLmF2YWlsX2luLT1sLEJsLmFycmF5U2V0KHMsYS5pbnB1dCxhLm5leHRfaW4sbCxjKSwxPT09YS5zdGF0ZS53cmFwP2EuYWRsZXI9TWQoYS5hZGxlcixzLGwsYyk6Mj09PWEuc3RhdGUud3JhcCYmKGEuYWRsZXI9TmQoYS5hZGxlcixzLGwsYykpLGEubmV4dF9pbis9bCxhLnRvdGFsX2luKz1sLGwpLGUubG9va2FoZWFkKz1uLGUubG9va2FoZWFkK2UuaW5zZXJ0Pj1aZClmb3Iobz1lLnN0cnN0YXJ0LWUuaW5zZXJ0LGUuaW5zX2g9ZS53aW5kb3dbb10sZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W28rMV0pJmUuaGFzaF9tYXNrO2UuaW5zZXJ0JiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W28rWmQtMV0pJmUuaGFzaF9tYXNrLGUucHJldltvJmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPW8sbysrLGUuaW5zZXJ0LS0sIShlLmxvb2thaGVhZCtlLmluc2VydDxaZCkpOyk7fXdoaWxlKGUubG9va2FoZWFkPGVmJiYwIT09ZS5zdHJtLmF2YWlsX2luKX1mdW5jdGlvbiBtZihlLHQpe2Zvcih2YXIgbixyOzspe2lmKGUubG9va2FoZWFkPGVmKXtpZihnZihlKSxlLmxvb2thaGVhZDxlZiYmdD09PURkKXJldHVybiByZjtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj1aZCYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K1pkLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLDAhPT1uJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLWVmJiYoZS5tYXRjaF9sZW5ndGg9dmYoZSxuKSksZS5tYXRjaF9sZW5ndGg+PVpkKWlmKHI9UGQuX3RyX3RhbGx5KGUsZS5zdHJzdGFydC1lLm1hdGNoX3N0YXJ0LGUubWF0Y2hfbGVuZ3RoLVpkKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg8PWUubWF4X2xhenlfbWF0Y2gmJmUubG9va2FoZWFkPj1aZCl7Zm9yKGUubWF0Y2hfbGVuZ3RoLS07ZS5zdHJzdGFydCsrLGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K1pkLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQsMCE9LS1lLm1hdGNoX2xlbmd0aDspO2Uuc3Ryc3RhcnQrK31lbHNlIGUuc3Ryc3RhcnQrPWUubWF0Y2hfbGVuZ3RoLGUubWF0Y2hfbGVuZ3RoPTAsZS5pbnNfaD1lLndpbmRvd1tlLnN0cnN0YXJ0XSxlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCsxXSkmZS5oYXNoX21hc2s7ZWxzZSByPVBkLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrO2lmKHImJihmZihlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIHJmfXJldHVybiBlLmluc2VydD1lLnN0cnN0YXJ0PFpkLTE/ZS5zdHJzdGFydDpaZC0xLHQ9PT1SZD8oZmYoZSwhMCksMD09PWUuc3RybS5hdmFpbF9vdXQ/YWY6c2YpOmUubGFzdF9saXQmJihmZihlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCk/cmY6b2Z9ZnVuY3Rpb24geWYoZSx0KXtmb3IodmFyIG4scixpOzspe2lmKGUubG9va2FoZWFkPGVmKXtpZihnZihlKSxlLmxvb2thaGVhZDxlZiYmdD09PURkKXJldHVybiByZjtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj1aZCYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K1pkLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLGUucHJldl9sZW5ndGg9ZS5tYXRjaF9sZW5ndGgsZS5wcmV2X21hdGNoPWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGg9WmQtMSwwIT09biYmZS5wcmV2X2xlbmd0aDxlLm1heF9sYXp5X21hdGNoJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLWVmJiYoZS5tYXRjaF9sZW5ndGg9dmYoZSxuKSxlLm1hdGNoX2xlbmd0aDw9NSYmKDE9PT1lLnN0cmF0ZWd5fHxlLm1hdGNoX2xlbmd0aD09PVpkJiY0MDk2PGUuc3Ryc3RhcnQtZS5tYXRjaF9zdGFydCkmJihlLm1hdGNoX2xlbmd0aD1aZC0xKSksZS5wcmV2X2xlbmd0aD49WmQmJmUubWF0Y2hfbGVuZ3RoPD1lLnByZXZfbGVuZ3RoKXtmb3IoaT1lLnN0cnN0YXJ0K2UubG9va2FoZWFkLVpkLHI9UGQuX3RyX3RhbGx5KGUsZS5zdHJzdGFydC0xLWUucHJldl9tYXRjaCxlLnByZXZfbGVuZ3RoLVpkKSxlLmxvb2thaGVhZC09ZS5wcmV2X2xlbmd0aC0xLGUucHJldl9sZW5ndGgtPTI7KytlLnN0cnN0YXJ0PD1pJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrWmQtMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCksMCE9LS1lLnByZXZfbGVuZ3RoOyk7aWYoZS5tYXRjaF9hdmFpbGFibGU9MCxlLm1hdGNoX2xlbmd0aD1aZC0xLGUuc3Ryc3RhcnQrKyxyJiYoZmYoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiByZn1lbHNlIGlmKGUubWF0Y2hfYXZhaWxhYmxlKXtpZigocj1QZC5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnQtMV0pKSYmZmYoZSwhMSksZS5zdHJzdGFydCsrLGUubG9va2FoZWFkLS0sMD09PWUuc3RybS5hdmFpbF9vdXQpcmV0dXJuIHJmfWVsc2UgZS5tYXRjaF9hdmFpbGFibGU9MSxlLnN0cnN0YXJ0KyssZS5sb29rYWhlYWQtLX1yZXR1cm4gZS5tYXRjaF9hdmFpbGFibGUmJihyPVBkLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSksZS5tYXRjaF9hdmFpbGFibGU9MCksZS5pbnNlcnQ9ZS5zdHJzdGFydDxaZC0xP2Uuc3Ryc3RhcnQ6WmQtMSx0PT09UmQ/KGZmKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P2FmOnNmKTplLmxhc3RfbGl0JiYoZmYoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpP3JmOm9mfWZ1bmN0aW9uIF9mKGUsdCxuLHIsaSl7dGhpcy5nb29kX2xlbmd0aD1lLHRoaXMubWF4X2xhenk9dCx0aGlzLm5pY2VfbGVuZ3RoPW4sdGhpcy5tYXhfY2hhaW49cix0aGlzLmZ1bmM9aX1mdW5jdGlvbiBiZigpe3RoaXMuc3RybT1udWxsLHRoaXMuc3RhdHVzPTAsdGhpcy5wZW5kaW5nX2J1Zj1udWxsLHRoaXMucGVuZGluZ19idWZfc2l6ZT0wLHRoaXMucGVuZGluZ19vdXQ9MCx0aGlzLnBlbmRpbmc9MCx0aGlzLndyYXA9MCx0aGlzLmd6aGVhZD1udWxsLHRoaXMuZ3ppbmRleD0wLHRoaXMubWV0aG9kPVdkLHRoaXMubGFzdF9mbHVzaD0tMSx0aGlzLndfc2l6ZT0wLHRoaXMud19iaXRzPTAsdGhpcy53X21hc2s9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMud2luZG93X3NpemU9MCx0aGlzLnByZXY9bnVsbCx0aGlzLmhlYWQ9bnVsbCx0aGlzLmluc19oPTAsdGhpcy5oYXNoX3NpemU9MCx0aGlzLmhhc2hfYml0cz0wLHRoaXMuaGFzaF9tYXNrPTAsdGhpcy5oYXNoX3NoaWZ0PTAsdGhpcy5ibG9ja19zdGFydD0wLHRoaXMubWF0Y2hfbGVuZ3RoPTAsdGhpcy5wcmV2X21hdGNoPTAsdGhpcy5tYXRjaF9hdmFpbGFibGU9MCx0aGlzLnN0cnN0YXJ0PTAsdGhpcy5tYXRjaF9zdGFydD0wLHRoaXMubG9va2FoZWFkPTAsdGhpcy5wcmV2X2xlbmd0aD0wLHRoaXMubWF4X2NoYWluX2xlbmd0aD0wLHRoaXMubWF4X2xhenlfbWF0Y2g9MCx0aGlzLmxldmVsPTAsdGhpcy5zdHJhdGVneT0wLHRoaXMuZ29vZF9tYXRjaD0wLHRoaXMubmljZV9tYXRjaD0wLHRoaXMuZHluX2x0cmVlPW5ldyBCbC5CdWYxNigyKllkKSx0aGlzLmR5bl9kdHJlZT1uZXcgQmwuQnVmMTYoMiooMipKZCsxKSksdGhpcy5ibF90cmVlPW5ldyBCbC5CdWYxNigyKigyKlhkKzEpKSxsZih0aGlzLmR5bl9sdHJlZSksbGYodGhpcy5keW5fZHRyZWUpLGxmKHRoaXMuYmxfdHJlZSksdGhpcy5sX2Rlc2M9bnVsbCx0aGlzLmRfZGVzYz1udWxsLHRoaXMuYmxfZGVzYz1udWxsLHRoaXMuYmxfY291bnQ9bmV3IEJsLkJ1ZjE2KEtkKzEpLHRoaXMuaGVhcD1uZXcgQmwuQnVmMTYoMipHZCsxKSxsZih0aGlzLmhlYXApLHRoaXMuaGVhcF9sZW49MCx0aGlzLmhlYXBfbWF4PTAsdGhpcy5kZXB0aD1uZXcgQmwuQnVmMTYoMipHZCsxKSxsZih0aGlzLmRlcHRoKSx0aGlzLmxfYnVmPTAsdGhpcy5saXRfYnVmc2l6ZT0wLHRoaXMubGFzdF9saXQ9MCx0aGlzLmRfYnVmPTAsdGhpcy5vcHRfbGVuPTAsdGhpcy5zdGF0aWNfbGVuPTAsdGhpcy5tYXRjaGVzPTAsdGhpcy5pbnNlcnQ9MCx0aGlzLmJpX2J1Zj0wLHRoaXMuYmlfdmFsaWQ9MH1mdW5jdGlvbiB3ZihlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8oZS50b3RhbF9pbj1lLnRvdGFsX291dD0wLGUuZGF0YV90eXBlPXFkLCh0PWUuc3RhdGUpLnBlbmRpbmc9MCx0LnBlbmRpbmdfb3V0PTAsdC53cmFwPDAmJih0LndyYXA9LXQud3JhcCksdC5zdGF0dXM9dC53cmFwP3RmOm5mLGUuYWRsZXI9Mj09PXQud3JhcD8wOjEsdC5sYXN0X2ZsdXNoPURkLFBkLl90cl9pbml0KHQpLEZkKTpjZihlLFVkKX1mdW5jdGlvbiBrZihlKXt2YXIgdCxuPXdmKGUpO3JldHVybiBuPT09RmQmJigodD1lLnN0YXRlKS53aW5kb3dfc2l6ZT0yKnQud19zaXplLGxmKHQuaGVhZCksdC5tYXhfbGF6eV9tYXRjaD1MZFt0LmxldmVsXS5tYXhfbGF6eSx0Lmdvb2RfbWF0Y2g9TGRbdC5sZXZlbF0uZ29vZF9sZW5ndGgsdC5uaWNlX21hdGNoPUxkW3QubGV2ZWxdLm5pY2VfbGVuZ3RoLHQubWF4X2NoYWluX2xlbmd0aD1MZFt0LmxldmVsXS5tYXhfY2hhaW4sdC5zdHJzdGFydD0wLHQuYmxvY2tfc3RhcnQ9MCx0Lmxvb2thaGVhZD0wLHQuaW5zZXJ0PTAsdC5tYXRjaF9sZW5ndGg9dC5wcmV2X2xlbmd0aD1aZC0xLHQubWF0Y2hfYXZhaWxhYmxlPTAsdC5pbnNfaD0wKSxufWZ1bmN0aW9uIFNmKGUsdCxuLHIsaSxvKXtpZighZSlyZXR1cm4gVWQ7dmFyIGE9MTtpZih0PT09emQmJih0PTYpLHI8MD8oYT0wLHI9LXIpOjE1PHImJihhPTIsci09MTYpLGk8MXx8SGQ8aXx8biE9PVdkfHxyPDh8fDE1PHJ8fHQ8MHx8OTx0fHxvPDB8fFZkPG8pcmV0dXJuIGNmKGUsVWQpOzg9PT1yJiYocj05KTt2YXIgcz1uZXcgYmY7cmV0dXJuKGUuc3RhdGU9cykuc3RybT1lLHMud3JhcD1hLHMuZ3poZWFkPW51bGwscy53X2JpdHM9cixzLndfc2l6ZT0xPDxzLndfYml0cyxzLndfbWFzaz1zLndfc2l6ZS0xLHMuaGFzaF9iaXRzPWkrNyxzLmhhc2hfc2l6ZT0xPDxzLmhhc2hfYml0cyxzLmhhc2hfbWFzaz1zLmhhc2hfc2l6ZS0xLHMuaGFzaF9zaGlmdD1+figocy5oYXNoX2JpdHMrWmQtMSkvWmQpLHMud2luZG93PW5ldyBCbC5CdWY4KDIqcy53X3NpemUpLHMuaGVhZD1uZXcgQmwuQnVmMTYocy5oYXNoX3NpemUpLHMucHJldj1uZXcgQmwuQnVmMTYocy53X3NpemUpLHMubGl0X2J1ZnNpemU9MTw8aSs2LHMucGVuZGluZ19idWZfc2l6ZT00KnMubGl0X2J1ZnNpemUscy5wZW5kaW5nX2J1Zj1uZXcgQmwuQnVmOChzLnBlbmRpbmdfYnVmX3NpemUpLHMuZF9idWY9MSpzLmxpdF9idWZzaXplLHMubF9idWY9MypzLmxpdF9idWZzaXplLHMubGV2ZWw9dCxzLnN0cmF0ZWd5PW8scy5tZXRob2Q9bixrZihlKX1MZD1bbmV3IF9mKDAsMCwwLDAsZnVuY3Rpb24oZSx0KXt2YXIgbj02NTUzNTtmb3Iobj5lLnBlbmRpbmdfYnVmX3NpemUtNSYmKG49ZS5wZW5kaW5nX2J1Zl9zaXplLTUpOzspe2lmKGUubG9va2FoZWFkPD0xKXtpZihnZihlKSwwPT09ZS5sb29rYWhlYWQmJnQ9PT1EZClyZXR1cm4gcmY7aWYoMD09PWUubG9va2FoZWFkKWJyZWFrfWUuc3Ryc3RhcnQrPWUubG9va2FoZWFkLGUubG9va2FoZWFkPTA7dmFyIHI9ZS5ibG9ja19zdGFydCtuO2lmKCgwPT09ZS5zdHJzdGFydHx8ZS5zdHJzdGFydD49cikmJihlLmxvb2thaGVhZD1lLnN0cnN0YXJ0LXIsZS5zdHJzdGFydD1yLGZmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gcmY7aWYoZS5zdHJzdGFydC1lLmJsb2NrX3N0YXJ0Pj1lLndfc2l6ZS1lZiYmKGZmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gcmZ9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PVJkPyhmZihlLCEwKSwwPT09ZS5zdHJtLmF2YWlsX291dD9hZjpzZik6KGUuc3Ryc3RhcnQ+ZS5ibG9ja19zdGFydCYmKGZmKGUsITEpLGUuc3RybS5hdmFpbF9vdXQpLHJmKX0pLG5ldyBfZig0LDQsOCw0LG1mKSxuZXcgX2YoNCw1LDE2LDgsbWYpLG5ldyBfZig0LDYsMzIsMzIsbWYpLG5ldyBfZig0LDQsMTYsMTYseWYpLG5ldyBfZig4LDE2LDMyLDMyLHlmKSxuZXcgX2YoOCwxNiwxMjgsMTI4LHlmKSxuZXcgX2YoOCwzMiwxMjgsMjU2LHlmKSxuZXcgX2YoMzIsMTI4LDI1OCwxMDI0LHlmKSxuZXcgX2YoMzIsMjU4LDI1OCw0MDk2LHlmKV07dmFyIHhmPXtkZWZsYXRlSW5pdDpmdW5jdGlvbihlLHQpe3JldHVybiBTZihlLHQsV2QsMTUsOCwwKX0sZGVmbGF0ZUluaXQyOlNmLGRlZmxhdGVSZXNldDprZixkZWZsYXRlUmVzZXRLZWVwOndmLGRlZmxhdGVTZXRIZWFkZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmZS5zdGF0ZT8yIT09ZS5zdGF0ZS53cmFwP1VkOihlLnN0YXRlLmd6aGVhZD10LEZkKTpVZH0sZGVmbGF0ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvO2lmKCFlfHwhZS5zdGF0ZXx8NTx0fHx0PDApcmV0dXJuIGU/Y2YoZSxVZCk6VWQ7aWYocj1lLnN0YXRlLCFlLm91dHB1dHx8IWUuaW5wdXQmJjAhPT1lLmF2YWlsX2lufHw2NjY9PT1yLnN0YXR1cyYmdCE9PVJkKXJldHVybiBjZihlLDA9PT1lLmF2YWlsX291dD8tNTpVZCk7aWYoci5zdHJtPWUsbj1yLmxhc3RfZmx1c2gsci5sYXN0X2ZsdXNoPXQsci5zdGF0dXM9PT10ZilpZigyPT09ci53cmFwKWUuYWRsZXI9MCxwZihyLDMxKSxwZihyLDEzOSkscGYociw4KSxyLmd6aGVhZD8ocGYociwoci5nemhlYWQudGV4dD8xOjApKyhyLmd6aGVhZC5oY3JjPzI6MCkrKHIuZ3poZWFkLmV4dHJhPzQ6MCkrKHIuZ3poZWFkLm5hbWU/ODowKSsoci5nemhlYWQuY29tbWVudD8xNjowKSkscGYociwyNTUmci5nemhlYWQudGltZSkscGYocixyLmd6aGVhZC50aW1lPj44JjI1NSkscGYocixyLmd6aGVhZC50aW1lPj4xNiYyNTUpLHBmKHIsci5nemhlYWQudGltZT4+MjQmMjU1KSxwZihyLDk9PT1yLmxldmVsPzI6Mjw9ci5zdHJhdGVneXx8ci5sZXZlbDwyPzQ6MCkscGYociwyNTUmci5nemhlYWQub3MpLHIuZ3poZWFkLmV4dHJhJiZyLmd6aGVhZC5leHRyYS5sZW5ndGgmJihwZihyLDI1NSZyLmd6aGVhZC5leHRyYS5sZW5ndGgpLHBmKHIsci5nemhlYWQuZXh0cmEubGVuZ3RoPj44JjI1NSkpLHIuZ3poZWFkLmhjcmMmJihlLmFkbGVyPU5kKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmcsMCkpLHIuZ3ppbmRleD0wLHIuc3RhdHVzPTY5KToocGYociwwKSxwZihyLDApLHBmKHIsMCkscGYociwwKSxwZihyLDApLHBmKHIsOT09PXIubGV2ZWw/MjoyPD1yLnN0cmF0ZWd5fHxyLmxldmVsPDI/NDowKSxwZihyLDMpLHIuc3RhdHVzPW5mKTtlbHNle3ZhciBhPVdkKyhyLndfYml0cy04PDw0KTw8ODthfD0oMjw9ci5zdHJhdGVneXx8ci5sZXZlbDwyPzA6ci5sZXZlbDw2PzE6Nj09PXIubGV2ZWw/MjozKTw8NiwwIT09ci5zdHJzdGFydCYmKGF8PTMyKSxhKz0zMS1hJTMxLHIuc3RhdHVzPW5mLGhmKHIsYSksMCE9PXIuc3Ryc3RhcnQmJihoZihyLGUuYWRsZXI+Pj4xNiksaGYociw2NTUzNSZlLmFkbGVyKSksZS5hZGxlcj0xfWlmKDY5PT09ci5zdGF0dXMpaWYoci5nemhlYWQuZXh0cmEpe2ZvcihpPXIucGVuZGluZztyLmd6aW5kZXg8KDY1NTM1JnIuZ3poZWFkLmV4dHJhLmxlbmd0aCkmJihyLnBlbmRpbmchPT1yLnBlbmRpbmdfYnVmX3NpemV8fChyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9TmQoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSxkZihlKSxpPXIucGVuZGluZyxyLnBlbmRpbmchPT1yLnBlbmRpbmdfYnVmX3NpemUpKTspcGYociwyNTUmci5nemhlYWQuZXh0cmFbci5nemluZGV4XSksci5nemluZGV4Kys7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPmkmJihlLmFkbGVyPU5kKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctaSxpKSksci5nemluZGV4PT09ci5nemhlYWQuZXh0cmEubGVuZ3RoJiYoci5nemluZGV4PTAsci5zdGF0dXM9NzMpfWVsc2Ugci5zdGF0dXM9NzM7aWYoNzM9PT1yLnN0YXR1cylpZihyLmd6aGVhZC5uYW1lKXtpPXIucGVuZGluZztkb3tpZihyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUmJihyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9TmQoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSxkZihlKSxpPXIucGVuZGluZyxyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUpKXtvPTE7YnJlYWt9cGYocixvPXIuZ3ppbmRleDxyLmd6aGVhZC5uYW1lLmxlbmd0aD8yNTUmci5nemhlYWQubmFtZS5jaGFyQ29kZUF0KHIuZ3ppbmRleCsrKTowKX13aGlsZSgwIT09byk7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPmkmJihlLmFkbGVyPU5kKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctaSxpKSksMD09PW8mJihyLmd6aW5kZXg9MCxyLnN0YXR1cz05MSl9ZWxzZSByLnN0YXR1cz05MTtpZig5MT09PXIuc3RhdHVzKWlmKHIuZ3poZWFkLmNvbW1lbnQpe2k9ci5wZW5kaW5nO2Rve2lmKHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSYmKHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5pJiYoZS5hZGxlcj1OZChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLWksaSkpLGRmKGUpLGk9ci5wZW5kaW5nLHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSkpe289MTticmVha31wZihyLG89ci5nemluZGV4PHIuZ3poZWFkLmNvbW1lbnQubGVuZ3RoPzI1NSZyLmd6aGVhZC5jb21tZW50LmNoYXJDb2RlQXQoci5nemluZGV4KyspOjApfXdoaWxlKDAhPT1vKTtyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9TmQoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSwwPT09byYmKHIuc3RhdHVzPTEwMyl9ZWxzZSByLnN0YXR1cz0xMDM7aWYoMTAzPT09ci5zdGF0dXMmJihyLmd6aGVhZC5oY3JjPyhyLnBlbmRpbmcrMj5yLnBlbmRpbmdfYnVmX3NpemUmJmRmKGUpLHIucGVuZGluZysyPD1yLnBlbmRpbmdfYnVmX3NpemUmJihwZihyLDI1NSZlLmFkbGVyKSxwZihyLGUuYWRsZXI+PjgmMjU1KSxlLmFkbGVyPTAsci5zdGF0dXM9bmYpKTpyLnN0YXR1cz1uZiksMCE9PXIucGVuZGluZyl7aWYoZGYoZSksMD09PWUuYXZhaWxfb3V0KXJldHVybiByLmxhc3RfZmx1c2g9LTEsRmR9ZWxzZSBpZigwPT09ZS5hdmFpbF9pbiYmdWYodCk8PXVmKG4pJiZ0IT09UmQpcmV0dXJuIGNmKGUsLTUpO2lmKDY2Nj09PXIuc3RhdHVzJiYwIT09ZS5hdmFpbF9pbilyZXR1cm4gY2YoZSwtNSk7aWYoMCE9PWUuYXZhaWxfaW58fDAhPT1yLmxvb2thaGVhZHx8dCE9PURkJiY2NjYhPT1yLnN0YXR1cyl7dmFyIHM9Mj09PXIuc3RyYXRlZ3k/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG47Oyl7aWYoMD09PWUubG9va2FoZWFkJiYoZ2YoZSksMD09PWUubG9va2FoZWFkKSl7aWYodD09PURkKXJldHVybiByZjticmVha31pZihlLm1hdGNoX2xlbmd0aD0wLG49UGQuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0KyssbiYmKGZmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gcmZ9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PVJkPyhmZihlLCEwKSwwPT09ZS5zdHJtLmF2YWlsX291dD9hZjpzZik6ZS5sYXN0X2xpdCYmKGZmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KT9yZjpvZn0ocix0KTozPT09ci5zdHJhdGVneT9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLGksbyxhPWUud2luZG93Ozspe2lmKGUubG9va2FoZWFkPD1RZCl7aWYoZ2YoZSksZS5sb29rYWhlYWQ8PVFkJiZ0PT09RGQpcmV0dXJuIHJmO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31pZihlLm1hdGNoX2xlbmd0aD0wLGUubG9va2FoZWFkPj1aZCYmMDxlLnN0cnN0YXJ0JiYocj1hW2k9ZS5zdHJzdGFydC0xXSk9PT1hWysraV0mJnI9PT1hWysraV0mJnI9PT1hWysraV0pe289ZS5zdHJzdGFydCtRZDtkb3t9d2hpbGUocj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmaTxvKTtlLm1hdGNoX2xlbmd0aD1RZC0oby1pKSxlLm1hdGNoX2xlbmd0aD5lLmxvb2thaGVhZCYmKGUubWF0Y2hfbGVuZ3RoPWUubG9va2FoZWFkKX1pZihlLm1hdGNoX2xlbmd0aD49WmQ/KG49UGQuX3RyX3RhbGx5KGUsMSxlLm1hdGNoX2xlbmd0aC1aZCksZS5sb29rYWhlYWQtPWUubWF0Y2hfbGVuZ3RoLGUuc3Ryc3RhcnQrPWUubWF0Y2hfbGVuZ3RoLGUubWF0Y2hfbGVuZ3RoPTApOihuPVBkLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrKSxuJiYoZmYoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiByZn1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09UmQ/KGZmKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P2FmOnNmKTplLmxhc3RfbGl0JiYoZmYoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpP3JmOm9mfShyLHQpOkxkW3IubGV2ZWxdLmZ1bmMocix0KTtpZihzIT09YWYmJnMhPT1zZnx8KHIuc3RhdHVzPTY2Nikscz09PXJmfHxzPT09YWYpcmV0dXJuIDA9PT1lLmF2YWlsX291dCYmKHIubGFzdF9mbHVzaD0tMSksRmQ7aWYocz09PW9mJiYoMT09PXQ/UGQuX3RyX2FsaWduKHIpOjUhPT10JiYoUGQuX3RyX3N0b3JlZF9ibG9jayhyLDAsMCwhMSksMz09PXQmJihsZihyLmhlYWQpLDA9PT1yLmxvb2thaGVhZCYmKHIuc3Ryc3RhcnQ9MCxyLmJsb2NrX3N0YXJ0PTAsci5pbnNlcnQ9MCkpKSxkZihlKSwwPT09ZS5hdmFpbF9vdXQpKXJldHVybiByLmxhc3RfZmx1c2g9LTEsRmR9cmV0dXJuIHQhPT1SZD9GZDpyLndyYXA8PTA/MTooMj09PXIud3JhcD8ocGYociwyNTUmZS5hZGxlcikscGYocixlLmFkbGVyPj44JjI1NSkscGYocixlLmFkbGVyPj4xNiYyNTUpLHBmKHIsZS5hZGxlcj4+MjQmMjU1KSxwZihyLDI1NSZlLnRvdGFsX2luKSxwZihyLGUudG90YWxfaW4+PjgmMjU1KSxwZihyLGUudG90YWxfaW4+PjE2JjI1NSkscGYocixlLnRvdGFsX2luPj4yNCYyNTUpKTooaGYocixlLmFkbGVyPj4+MTYpLGhmKHIsNjU1MzUmZS5hZGxlcikpLGRmKGUpLDA8ci53cmFwJiYoci53cmFwPS1yLndyYXApLDAhPT1yLnBlbmRpbmc/RmQ6MSl9LGRlZmxhdGVFbmQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGUmJmUuc3RhdGU/KHQ9ZS5zdGF0ZS5zdGF0dXMpIT09dGYmJjY5IT09dCYmNzMhPT10JiY5MSE9PXQmJjEwMyE9PXQmJnQhPT1uZiYmNjY2IT09dD9jZihlLFVkKTooZS5zdGF0ZT1udWxsLHQ9PT1uZj9jZihlLC0zKTpGZCk6VWR9LGRlZmxhdGVTZXREaWN0aW9uYXJ5OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLGMsdSxsPXQubGVuZ3RoO2lmKCFlfHwhZS5zdGF0ZSlyZXR1cm4gVWQ7aWYoMj09PShvPShuPWUuc3RhdGUpLndyYXApfHwxPT09byYmbi5zdGF0dXMhPT10Znx8bi5sb29rYWhlYWQpcmV0dXJuIFVkO2ZvcigxPT09byYmKGUuYWRsZXI9TWQoZS5hZGxlcix0LGwsMCkpLG4ud3JhcD0wLGw+PW4ud19zaXplJiYoMD09PW8mJihsZihuLmhlYWQpLG4uc3Ryc3RhcnQ9MCxuLmJsb2NrX3N0YXJ0PTAsbi5pbnNlcnQ9MCksdT1uZXcgQmwuQnVmOChuLndfc2l6ZSksQmwuYXJyYXlTZXQodSx0LGwtbi53X3NpemUsbi53X3NpemUsMCksdD11LGw9bi53X3NpemUpLGE9ZS5hdmFpbF9pbixzPWUubmV4dF9pbixjPWUuaW5wdXQsZS5hdmFpbF9pbj1sLGUubmV4dF9pbj0wLGUuaW5wdXQ9dCxnZihuKTtuLmxvb2thaGVhZD49WmQ7KXtmb3Iocj1uLnN0cnN0YXJ0LGk9bi5sb29rYWhlYWQtKFpkLTEpO24uaW5zX2g9KG4uaW5zX2g8PG4uaGFzaF9zaGlmdF5uLndpbmRvd1tyK1pkLTFdKSZuLmhhc2hfbWFzayxuLnByZXZbciZuLndfbWFza109bi5oZWFkW24uaW5zX2hdLG4uaGVhZFtuLmluc19oXT1yLHIrKywtLWk7KTtuLnN0cnN0YXJ0PXIsbi5sb29rYWhlYWQ9WmQtMSxnZihuKX1yZXR1cm4gbi5zdHJzdGFydCs9bi5sb29rYWhlYWQsbi5ibG9ja19zdGFydD1uLnN0cnN0YXJ0LG4uaW5zZXJ0PW4ubG9va2FoZWFkLG4ubG9va2FoZWFkPTAsbi5tYXRjaF9sZW5ndGg9bi5wcmV2X2xlbmd0aD1aZC0xLG4ubWF0Y2hfYXZhaWxhYmxlPTAsZS5uZXh0X2luPXMsZS5pbnB1dD1jLGUuYXZhaWxfaW49YSxuLndyYXA9byxGZH0sZGVmbGF0ZUluZm86InBha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkifSxDZj0hMCxUZj0hMDt0cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLFswXSl9Y2F0Y2goZSl7Q2Y9ITF9dHJ5e1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheSgxKSl9Y2F0Y2goZSl7VGY9ITF9Zm9yKHZhciBPZj1uZXcgQmwuQnVmOCgyNTYpLEFmPTA7QWY8MjU2O0FmKyspT2ZbQWZdPTI1Mjw9QWY/NjoyNDg8PUFmPzU6MjQwPD1BZj80OjIyNDw9QWY/MzoxOTI8PUFmPzI6MTtPZlsyNTRdPU9mWzI1NF09MTtmdW5jdGlvbiBFZihlLHQpe2lmKHQ8NjU1MzQmJihlLnN1YmFycmF5JiZUZnx8IWUuc3ViYXJyYXkmJkNmKSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLEJsLnNocmlua0J1ZihlLHQpKTtmb3IodmFyIG49IiIscj0wO3I8dDtyKyspbis9U3RyaW5nLmZyb21DaGFyQ29kZShlW3JdKTtyZXR1cm4gbn12YXIgSWY9e3N0cmluZzJidWY6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhPWUubGVuZ3RoLHM9MDtmb3IoaT0wO2k8YTtpKyspNTUyOTY9PSg2NDUxMiYobj1lLmNoYXJDb2RlQXQoaSkpKSYmaSsxPGEmJjU2MzIwPT0oNjQ1MTImKHI9ZS5jaGFyQ29kZUF0KGkrMSkpKSYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoci01NjMyMCksaSsrKSxzKz1uPDEyOD8xOm48MjA0OD8yOm48NjU1MzY/Mzo0O2Zvcih0PW5ldyBCbC5CdWY4KHMpLGk9bz0wO288cztpKyspNTUyOTY9PSg2NDUxMiYobj1lLmNoYXJDb2RlQXQoaSkpKSYmaSsxPGEmJjU2MzIwPT0oNjQ1MTImKHI9ZS5jaGFyQ29kZUF0KGkrMSkpKSYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoci01NjMyMCksaSsrKSxuPDEyOD90W28rK109bjoobjwyMDQ4P3RbbysrXT0xOTJ8bj4+PjY6KG48NjU1MzY/dFtvKytdPTIyNHxuPj4+MTI6KHRbbysrXT0yNDB8bj4+PjE4LHRbbysrXT0xMjh8bj4+PjEyJjYzKSx0W28rK109MTI4fG4+Pj42JjYzKSx0W28rK109MTI4fDYzJm4pO3JldHVybiB0fSxidWYyYmluc3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiBFZihlLGUubGVuZ3RoKX0sYmluc3RyaW5nMmJ1ZjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9bmV3IEJsLkJ1ZjgoZS5sZW5ndGgpLG49MCxyPXQubGVuZ3RoO248cjtuKyspdFtuXT1lLmNoYXJDb2RlQXQobik7cmV0dXJuIHR9LGJ1ZjJzdHJpbmc6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhPXR8fGUubGVuZ3RoLHM9bmV3IEFycmF5KDIqYSk7Zm9yKG49cj0wO248YTspaWYoKGk9ZVtuKytdKTwxMjgpc1tyKytdPWk7ZWxzZSBpZig0PChvPU9mW2ldKSlzW3IrK109NjU1MzMsbis9by0xO2Vsc2V7Zm9yKGkmPTI9PT1vPzMxOjM9PT1vPzE1Ojc7MTxvJiZuPGE7KWk9aTw8Nnw2MyZlW24rK10sby0tOzE8bz9zW3IrK109NjU1MzM6aTw2NTUzNj9zW3IrK109aTooaS09NjU1MzYsc1tyKytdPTU1Mjk2fGk+PjEwJjEwMjMsc1tyKytdPTU2MzIwfDEwMjMmaSl9cmV0dXJuIEVmKHMscil9LHV0Zjhib3JkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbjtmb3IoKHQ9dHx8ZS5sZW5ndGgpPmUubGVuZ3RoJiYodD1lLmxlbmd0aCksbj10LTE7MDw9biYmMTI4PT0oMTkyJmVbbl0pOyluLS07cmV0dXJuIG48MD90OjA9PT1uP3Q6bitPZltlW25dXT50P246dH19O3ZhciAkZj1mdW5jdGlvbigpe3RoaXMuaW5wdXQ9bnVsbCx0aGlzLm5leHRfaW49MCx0aGlzLmF2YWlsX2luPTAsdGhpcy50b3RhbF9pbj0wLHRoaXMub3V0cHV0PW51bGwsdGhpcy5uZXh0X291dD0wLHRoaXMuYXZhaWxfb3V0PTAsdGhpcy50b3RhbF9vdXQ9MCx0aGlzLm1zZz0iIix0aGlzLnN0YXRlPW51bGwsdGhpcy5kYXRhX3R5cGU9Mix0aGlzLmFkbGVyPTB9LFBmPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsTWY9MCxqZj0tMSxMZj0wLE5mPTg7ZnVuY3Rpb24gQmYoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgQmYpKXJldHVybiBuZXcgQmYoZSk7dGhpcy5vcHRpb25zPUJsLmFzc2lnbih7bGV2ZWw6amYsbWV0aG9kOk5mLGNodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjE1LG1lbUxldmVsOjgsc3RyYXRlZ3k6TGYsdG86IiJ9LGV8fHt9KTt2YXIgdD10aGlzLm9wdGlvbnM7dC5yYXcmJjA8dC53aW5kb3dCaXRzP3Qud2luZG93Qml0cz0tdC53aW5kb3dCaXRzOnQuZ3ppcCYmMDx0LndpbmRvd0JpdHMmJnQud2luZG93Qml0czwxNiYmKHQud2luZG93Qml0cys9MTYpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3ICRmLHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgbj14Zi5kZWZsYXRlSW5pdDIodGhpcy5zdHJtLHQubGV2ZWwsdC5tZXRob2QsdC53aW5kb3dCaXRzLHQubWVtTGV2ZWwsdC5zdHJhdGVneSk7aWYobiE9PU1mKXRocm93IG5ldyBFcnJvcihCZFtuXSk7aWYodC5oZWFkZXImJnhmLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLHQuaGVhZGVyKSx0LmRpY3Rpb25hcnkpe3ZhciByO2lmKHI9InN0cmluZyI9PXR5cGVvZiB0LmRpY3Rpb25hcnk/SWYuc3RyaW5nMmJ1Zih0LmRpY3Rpb25hcnkpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1QZi5jYWxsKHQuZGljdGlvbmFyeSk/bmV3IFVpbnQ4QXJyYXkodC5kaWN0aW9uYXJ5KTp0LmRpY3Rpb25hcnksKG49eGYuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLHIpKSE9PU1mKXRocm93IG5ldyBFcnJvcihCZFtuXSk7dGhpcy5fZGljdF9zZXQ9ITB9fWZ1bmN0aW9uIERmKGUsdCl7dmFyIG49bmV3IEJmKHQpO2lmKG4ucHVzaChlLCEwKSxuLmVycil0aHJvdyBuLm1zZ3x8QmRbbi5lcnJdO3JldHVybiBuLnJlc3VsdH1CZi5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaT10aGlzLnN0cm0sbz10aGlzLm9wdGlvbnMuY2h1bmtTaXplO2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7cj10PT09fn50P3Q6ITA9PT10PzQ6MCwic3RyaW5nIj09dHlwZW9mIGU/aS5pbnB1dD1JZi5zdHJpbmcyYnVmKGUpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1QZi5jYWxsKGUpP2kuaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoZSk6aS5pbnB1dD1lLGkubmV4dF9pbj0wLGkuYXZhaWxfaW49aS5pbnB1dC5sZW5ndGg7ZG97aWYoMD09PWkuYXZhaWxfb3V0JiYoaS5vdXRwdXQ9bmV3IEJsLkJ1ZjgobyksaS5uZXh0X291dD0wLGkuYXZhaWxfb3V0PW8pLDEhPT0obj14Zi5kZWZsYXRlKGkscikpJiZuIT09TWYpcmV0dXJuIHRoaXMub25FbmQobiksISh0aGlzLmVuZGVkPSEwKTswIT09aS5hdmFpbF9vdXQmJigwIT09aS5hdmFpbF9pbnx8NCE9PXImJjIhPT1yKXx8KCJzdHJpbmciPT09dGhpcy5vcHRpb25zLnRvP3RoaXMub25EYXRhKElmLmJ1ZjJiaW5zdHJpbmcoQmwuc2hyaW5rQnVmKGkub3V0cHV0LGkubmV4dF9vdXQpKSk6dGhpcy5vbkRhdGEoQmwuc2hyaW5rQnVmKGkub3V0cHV0LGkubmV4dF9vdXQpKSl9d2hpbGUoKDA8aS5hdmFpbF9pbnx8MD09PWkuYXZhaWxfb3V0KSYmMSE9PW4pO3JldHVybiA0PT09cj8obj14Zi5kZWZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChuKSx0aGlzLmVuZGVkPSEwLG49PT1NZik6MiE9PXJ8fCh0aGlzLm9uRW5kKE1mKSwhKGkuYXZhaWxfb3V0PTApKX0sQmYucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihlKXt0aGlzLmNodW5rcy5wdXNoKGUpfSxCZi5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oZSl7ZT09PU1mJiYoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9QmwuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWUsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ307dmFyIFJmPXtEZWZsYXRlOkJmLGRlZmxhdGU6RGYsZGVmbGF0ZVJhdzpmdW5jdGlvbihlLHQpe3JldHVybih0PXR8fHt9KS5yYXc9ITAsRGYoZSx0KX0sZ3ppcDpmdW5jdGlvbihlLHQpe3JldHVybih0PXR8fHt9KS5nemlwPSEwLERmKGUsdCl9fSxGZj1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscyxjLHUsbCxkLGYscCxoLHYsZyxtLHksXyxiLHcsayxTLHgsQyxUO249ZS5zdGF0ZSxyPWUubmV4dF9pbixDPWUuaW5wdXQsaT1yKyhlLmF2YWlsX2luLTUpLG89ZS5uZXh0X291dCxUPWUub3V0cHV0LGE9by0odC1lLmF2YWlsX291dCkscz1vKyhlLmF2YWlsX291dC0yNTcpLGM9bi5kbWF4LHU9bi53c2l6ZSxsPW4ud2hhdmUsZD1uLnduZXh0LGY9bi53aW5kb3cscD1uLmhvbGQsaD1uLmJpdHMsdj1uLmxlbmNvZGUsZz1uLmRpc3Rjb2RlLG09KDE8PG4ubGVuYml0cyktMSx5PSgxPDxuLmRpc3RiaXRzKS0xO2U6ZG97aDwxNSYmKHArPUNbcisrXTw8aCxoKz04LHArPUNbcisrXTw8aCxoKz04KSxfPXZbcCZtXTt0OmZvcig7Oyl7aWYocD4+Pj1iPV8+Pj4yNCxoLT1iLDA9PT0oYj1fPj4+MTYmMjU1KSlUW28rK109NjU1MzUmXztlbHNle2lmKCEoMTYmYikpe2lmKDA9PSg2NCZiKSl7Xz12Wyg2NTUzNSZfKSsocCYoMTw8YiktMSldO2NvbnRpbnVlIHR9aWYoMzImYil7bi5tb2RlPTEyO2JyZWFrIGV9ZS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsbi5tb2RlPTMwO2JyZWFrIGV9dz02NTUzNSZfLChiJj0xNSkmJihoPGImJihwKz1DW3IrK108PGgsaCs9OCksdys9cCYoMTw8YiktMSxwPj4+PWIsaC09YiksaDwxNSYmKHArPUNbcisrXTw8aCxoKz04LHArPUNbcisrXTw8aCxoKz04KSxfPWdbcCZ5XTtuOmZvcig7Oyl7aWYocD4+Pj1iPV8+Pj4yNCxoLT1iLCEoMTYmKGI9Xz4+PjE2JjI1NSkpKXtpZigwPT0oNjQmYikpe189Z1soNjU1MzUmXykrKHAmKDE8PGIpLTEpXTtjb250aW51ZSBufWUubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLG4ubW9kZT0zMDticmVhayBlfWlmKGs9NjU1MzUmXyxoPChiJj0xNSkmJihwKz1DW3IrK108PGgsKGgrPTgpPGImJihwKz1DW3IrK108PGgsaCs9OCkpLGM8KGsrPXAmKDE8PGIpLTEpKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT0zMDticmVhayBlfWlmKHA+Pj49YixoLT1iLChiPW8tYSk8ayl7aWYobDwoYj1rLWIpJiZuLnNhbmUpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsbi5tb2RlPTMwO2JyZWFrIGV9aWYoeD1mLChTPTApPT09ZCl7aWYoUys9dS1iLGI8dyl7Zm9yKHctPWI7VFtvKytdPWZbUysrXSwtLWI7KTtTPW8tayx4PVR9fWVsc2UgaWYoZDxiKXtpZihTKz11K2QtYiwoYi09ZCk8dyl7Zm9yKHctPWI7VFtvKytdPWZbUysrXSwtLWI7KTtpZihTPTAsZDx3KXtmb3Iody09Yj1kO1RbbysrXT1mW1MrK10sLS1iOyk7Uz1vLWsseD1UfX19ZWxzZSBpZihTKz1kLWIsYjx3KXtmb3Iody09YjtUW28rK109ZltTKytdLC0tYjspO1M9by1rLHg9VH1mb3IoOzI8dzspVFtvKytdPXhbUysrXSxUW28rK109eFtTKytdLFRbbysrXT14W1MrK10sdy09Mzt3JiYoVFtvKytdPXhbUysrXSwxPHcmJihUW28rK109eFtTKytdKSl9ZWxzZXtmb3IoUz1vLWs7VFtvKytdPVRbUysrXSxUW28rK109VFtTKytdLFRbbysrXT1UW1MrK10sMjwody09Myk7KTt3JiYoVFtvKytdPVRbUysrXSwxPHcmJihUW28rK109VFtTKytdKSl9YnJlYWt9fWJyZWFrfX13aGlsZShyPGkmJm88cyk7ci09dz1oPj4zLHAmPSgxPDwoaC09dzw8MykpLTEsZS5uZXh0X2luPXIsZS5uZXh0X291dD1vLGUuYXZhaWxfaW49cjxpP2ktcis1OjUtKHItaSksZS5hdmFpbF9vdXQ9bzxzP3MtbysyNTc6MjU3LShvLXMpLG4uaG9sZD1wLG4uYml0cz1ofSxVZj1bMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCwwLDBdLHpmPVsxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNywxNywxNywxNywxOCwxOCwxOCwxOCwxOSwxOSwxOSwxOSwyMCwyMCwyMCwyMCwyMSwyMSwyMSwyMSwxNiw3Miw3OF0sVmY9WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3NywwLDBdLHFmPVsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF0sV2Y9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSxzKXt2YXIgYyx1LGwsZCxmLHAsaCx2LGcsbT1zLmJpdHMseT0wLF89MCxiPTAsdz0wLGs9MCxTPTAseD0wLEM9MCxUPTAsTz0wLEE9bnVsbCxFPTAsST1uZXcgQmwuQnVmMTYoMTYpLCQ9bmV3IEJsLkJ1ZjE2KDE2KSxQPW51bGwsTT0wO2Zvcih5PTA7eTw9MTU7eSsrKUlbeV09MDtmb3IoXz0wO188cjtfKyspSVt0W24rX11dKys7Zm9yKGs9bSx3PTE1OzE8PXcmJjA9PT1JW3ddO3ctLSk7aWYodzxrJiYoaz13KSwwPT09dylyZXR1cm4gaVtvKytdPTIwOTcxNTIwLGlbbysrXT0yMDk3MTUyMCxzLmJpdHM9MSwwO2ZvcihiPTE7Yjx3JiYwPT09SVtiXTtiKyspO2ZvcihrPGImJihrPWIpLHk9Qz0xO3k8PTE1O3krKylpZihDPDw9MSwoQy09SVt5XSk8MClyZXR1cm4tMTtpZigwPEMmJigwPT09ZXx8MSE9PXcpKXJldHVybi0xO2ZvcigkWzFdPTAseT0xO3k8MTU7eSsrKSRbeSsxXT0kW3ldK0lbeV07Zm9yKF89MDtfPHI7XysrKTAhPT10W24rX10mJihhWyRbdFtuK19dXSsrXT1fKTtpZigwPT09ZT8oQT1QPWEscD0xOSk6MT09PWU/KEE9VWYsRS09MjU3LFA9emYsTS09MjU3LHA9MjU2KTooQT1WZixQPXFmLHA9LTEpLHk9YixmPW8seD1fPU89MCxsPS0xLGQ9KFQ9MTw8KFM9aykpLTEsMT09PWUmJjg1MjxUfHwyPT09ZSYmNTkyPFQpcmV0dXJuIDE7Zm9yKDs7KXtmb3IoaD15LXgsYVtfXTxwPyh2PTAsZz1hW19dKTphW19dPnA/KHY9UFtNK2FbX11dLGc9QVtFK2FbX11dKToodj05NixnPTApLGM9MTw8eS14LGI9dT0xPDxTO2lbZisoTz4+eCkrKHUtPWMpXT1oPDwyNHx2PDwxNnxnfDAsMCE9PXU7KTtmb3IoYz0xPDx5LTE7TyZjOyljPj49MTtpZigwIT09Yz8oTyY9Yy0xLE8rPWMpOk89MCxfKyssMD09LS1JW3ldKXtpZih5PT09dylicmVhazt5PXRbbithW19dXX1pZihrPHkmJihPJmQpIT09bCl7Zm9yKDA9PT14JiYoeD1rKSxmKz1iLEM9MTw8KFM9eS14KTtTK3g8dyYmISgoQy09SVtTK3hdKTw9MCk7KVMrKyxDPDw9MTtpZihUKz0xPDxTLDE9PT1lJiY4NTI8VHx8Mj09PWUmJjU5MjxUKXJldHVybiAxO2lbbD1PJmRdPWs8PDI0fFM8PDE2fGYtb3wwfX1yZXR1cm4gMCE9PU8mJihpW2YrT109eS14PDwyNHw2NDw8MTZ8MCkscy5iaXRzPWssMH0sSGY9MSxHZj0yLEpmPTAsWGY9LTIsWWY9MSxLZj04NTIsWmY9NTkyO2Z1bmN0aW9uIFFmKGUpe3JldHVybihlPj4+MjQmMjU1KSsoZT4+PjgmNjUyODApKygoNjUyODAmZSk8PDgpKygoMjU1JmUpPDwyNCl9ZnVuY3Rpb24gZXAoKXt0aGlzLm1vZGU9MCx0aGlzLmxhc3Q9ITEsdGhpcy53cmFwPTAsdGhpcy5oYXZlZGljdD0hMSx0aGlzLmZsYWdzPTAsdGhpcy5kbWF4PTAsdGhpcy5jaGVjaz0wLHRoaXMudG90YWw9MCx0aGlzLmhlYWQ9bnVsbCx0aGlzLndiaXRzPTAsdGhpcy53c2l6ZT0wLHRoaXMud2hhdmU9MCx0aGlzLnduZXh0PTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLmhvbGQ9MCx0aGlzLmJpdHM9MCx0aGlzLmxlbmd0aD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5leHRyYT0wLHRoaXMubGVuY29kZT1udWxsLHRoaXMuZGlzdGNvZGU9bnVsbCx0aGlzLmxlbmJpdHM9MCx0aGlzLmRpc3RiaXRzPTAsdGhpcy5uY29kZT0wLHRoaXMubmxlbj0wLHRoaXMubmRpc3Q9MCx0aGlzLmhhdmU9MCx0aGlzLm5leHQ9bnVsbCx0aGlzLmxlbnM9bmV3IEJsLkJ1ZjE2KDMyMCksdGhpcy53b3JrPW5ldyBCbC5CdWYxNigyODgpLHRoaXMubGVuZHluPW51bGwsdGhpcy5kaXN0ZHluPW51bGwsdGhpcy5zYW5lPTAsdGhpcy5iYWNrPTAsdGhpcy53YXM9MH1mdW5jdGlvbiB0cChlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8odD1lLnN0YXRlLGUudG90YWxfaW49ZS50b3RhbF9vdXQ9dC50b3RhbD0wLGUubXNnPSIiLHQud3JhcCYmKGUuYWRsZXI9MSZ0LndyYXApLHQubW9kZT1ZZix0Lmxhc3Q9MCx0LmhhdmVkaWN0PTAsdC5kbWF4PTMyNzY4LHQuaGVhZD1udWxsLHQuaG9sZD0wLHQuYml0cz0wLHQubGVuY29kZT10LmxlbmR5bj1uZXcgQmwuQnVmMzIoS2YpLHQuZGlzdGNvZGU9dC5kaXN0ZHluPW5ldyBCbC5CdWYzMihaZiksdC5zYW5lPTEsdC5iYWNrPS0xLEpmKTpYZn1mdW5jdGlvbiBucChlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8oKHQ9ZS5zdGF0ZSkud3NpemU9MCx0LndoYXZlPTAsdC53bmV4dD0wLHRwKGUpKTpYZn1mdW5jdGlvbiBycChlLHQpe3ZhciBuLHI7cmV0dXJuIGUmJmUuc3RhdGU/KHI9ZS5zdGF0ZSx0PDA/KG49MCx0PS10KToobj0xKyh0Pj40KSx0PDQ4JiYodCY9MTUpKSx0JiYodDw4fHwxNTx0KT9YZjoobnVsbCE9PXIud2luZG93JiZyLndiaXRzIT09dCYmKHIud2luZG93PW51bGwpLHIud3JhcD1uLHIud2JpdHM9dCxucChlKSkpOlhmfWZ1bmN0aW9uIGlwKGUsdCl7dmFyIG4scjtyZXR1cm4gZT8ocj1uZXcgZXAsKGUuc3RhdGU9cikud2luZG93PW51bGwsKG49cnAoZSx0KSkhPT1KZiYmKGUuc3RhdGU9bnVsbCksbik6WGZ9dmFyIG9wLGFwLHNwPSEwO2Z1bmN0aW9uIGNwKGUpe2lmKHNwKXt2YXIgdDtmb3Iob3A9bmV3IEJsLkJ1ZjMyKDUxMiksYXA9bmV3IEJsLkJ1ZjMyKDMyKSx0PTA7dDwxNDQ7KWUubGVuc1t0KytdPTg7Zm9yKDt0PDI1NjspZS5sZW5zW3QrK109OTtmb3IoO3Q8MjgwOyllLmxlbnNbdCsrXT03O2Zvcig7dDwyODg7KWUubGVuc1t0KytdPTg7Zm9yKFdmKEhmLGUubGVucywwLDI4OCxvcCwwLGUud29yayx7Yml0czo5fSksdD0wO3Q8MzI7KWUubGVuc1t0KytdPTU7V2YoR2YsZS5sZW5zLDAsMzIsYXAsMCxlLndvcmsse2JpdHM6NX0pLHNwPSExfWUubGVuY29kZT1vcCxlLmxlbmJpdHM9OSxlLmRpc3Rjb2RlPWFwLGUuZGlzdGJpdHM9NX1mdW5jdGlvbiB1cChlLHQsbixyKXt2YXIgaSxvPWUuc3RhdGU7cmV0dXJuIG51bGw9PT1vLndpbmRvdyYmKG8ud3NpemU9MTw8by53Yml0cyxvLnduZXh0PTAsby53aGF2ZT0wLG8ud2luZG93PW5ldyBCbC5CdWY4KG8ud3NpemUpKSxyPj1vLndzaXplPyhCbC5hcnJheVNldChvLndpbmRvdyx0LG4tby53c2l6ZSxvLndzaXplLDApLG8ud25leHQ9MCxvLndoYXZlPW8ud3NpemUpOihyPChpPW8ud3NpemUtby53bmV4dCkmJihpPXIpLEJsLmFycmF5U2V0KG8ud2luZG93LHQsbi1yLGksby53bmV4dCksKHItPWkpPyhCbC5hcnJheVNldChvLndpbmRvdyx0LG4tcixyLDApLG8ud25leHQ9cixvLndoYXZlPW8ud3NpemUpOihvLnduZXh0Kz1pLG8ud25leHQ9PT1vLndzaXplJiYoby53bmV4dD0wKSxvLndoYXZlPG8ud3NpemUmJihvLndoYXZlKz1pKSkpLDB9dmFyIGxwPXtpbmZsYXRlUmVzZXQ6bnAsaW5mbGF0ZVJlc2V0MjpycCxpbmZsYXRlUmVzZXRLZWVwOnRwLGluZmxhdGVJbml0OmZ1bmN0aW9uKGUpe3JldHVybiBpcChlLDE1KX0saW5mbGF0ZUluaXQyOmlwLGluZmxhdGU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHMsYyx1LGwsZCxmLHAsaCx2LGcsbSx5LF8sYix3LGssUyx4LEMsVD0wLE89bmV3IEJsLkJ1ZjgoNCksQT1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07aWYoIWV8fCFlLnN0YXRlfHwhZS5vdXRwdXR8fCFlLmlucHV0JiYwIT09ZS5hdmFpbF9pbilyZXR1cm4gWGY7MTI9PT0obj1lLnN0YXRlKS5tb2RlJiYobi5tb2RlPTEzKSxhPWUubmV4dF9vdXQsaT1lLm91dHB1dCxjPWUuYXZhaWxfb3V0LG89ZS5uZXh0X2luLHI9ZS5pbnB1dCxzPWUuYXZhaWxfaW4sdT1uLmhvbGQsbD1uLmJpdHMsZD1zLGY9YyxTPUpmO2U6Zm9yKDs7KXN3aXRjaChuLm1vZGUpe2Nhc2UgWWY6aWYoMD09PW4ud3JhcCl7bi5tb2RlPTEzO2JyZWFrfWZvcig7bDwxNjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWlmKDImbi53cmFwJiYzNTYxNT09PXUpe09bbi5jaGVjaz0wXT0yNTUmdSxPWzFdPXU+Pj44JjI1NSxuLmNoZWNrPU5kKG4uY2hlY2ssTywyLDApLGw9dT0wLG4ubW9kZT0yO2JyZWFrfWlmKG4uZmxhZ3M9MCxuLmhlYWQmJihuLmhlYWQuZG9uZT0hMSksISgxJm4ud3JhcCl8fCgoKDI1NSZ1KTw8OCkrKHU+PjgpKSUzMSl7ZS5tc2c9ImluY29ycmVjdCBoZWFkZXIgY2hlY2siLG4ubW9kZT0zMDticmVha31pZig4IT0oMTUmdSkpe2UubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsbi5tb2RlPTMwO2JyZWFrfWlmKGwtPTQsaz04KygxNSYodT4+Pj00KSksMD09PW4ud2JpdHMpbi53Yml0cz1rO2Vsc2UgaWYoaz5uLndiaXRzKXtlLm1zZz0iaW52YWxpZCB3aW5kb3cgc2l6ZSIsbi5tb2RlPTMwO2JyZWFrfW4uZG1heD0xPDxrLGUuYWRsZXI9bi5jaGVjaz0xLG4ubW9kZT01MTImdT8xMDoxMixsPXU9MDticmVhaztjYXNlIDI6Zm9yKDtsPDE2Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYobi5mbGFncz11LDghPSgyNTUmbi5mbGFncykpe2UubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsbi5tb2RlPTMwO2JyZWFrfWlmKDU3MzQ0Jm4uZmxhZ3Mpe2UubXNnPSJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiLG4ubW9kZT0zMDticmVha31uLmhlYWQmJihuLmhlYWQudGV4dD11Pj44JjEpLDUxMiZuLmZsYWdzJiYoT1swXT0yNTUmdSxPWzFdPXU+Pj44JjI1NSxuLmNoZWNrPU5kKG4uY2hlY2ssTywyLDApKSxsPXU9MCxuLm1vZGU9MztjYXNlIDM6Zm9yKDtsPDMyOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9bi5oZWFkJiYobi5oZWFkLnRpbWU9dSksNTEyJm4uZmxhZ3MmJihPWzBdPTI1NSZ1LE9bMV09dT4+PjgmMjU1LE9bMl09dT4+PjE2JjI1NSxPWzNdPXU+Pj4yNCYyNTUsbi5jaGVjaz1OZChuLmNoZWNrLE8sNCwwKSksbD11PTAsbi5tb2RlPTQ7Y2FzZSA0OmZvcig7bDwxNjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fW4uaGVhZCYmKG4uaGVhZC54ZmxhZ3M9MjU1JnUsbi5oZWFkLm9zPXU+PjgpLDUxMiZuLmZsYWdzJiYoT1swXT0yNTUmdSxPWzFdPXU+Pj44JjI1NSxuLmNoZWNrPU5kKG4uY2hlY2ssTywyLDApKSxsPXU9MCxuLm1vZGU9NTtjYXNlIDU6aWYoMTAyNCZuLmZsYWdzKXtmb3IoO2w8MTY7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1uLmxlbmd0aD11LG4uaGVhZCYmKG4uaGVhZC5leHRyYV9sZW49dSksNTEyJm4uZmxhZ3MmJihPWzBdPTI1NSZ1LE9bMV09dT4+PjgmMjU1LG4uY2hlY2s9TmQobi5jaGVjayxPLDIsMCkpLGw9dT0wfWVsc2Ugbi5oZWFkJiYobi5oZWFkLmV4dHJhPW51bGwpO24ubW9kZT02O2Nhc2UgNjppZigxMDI0Jm4uZmxhZ3MmJihzPChwPW4ubGVuZ3RoKSYmKHA9cykscCYmKG4uaGVhZCYmKGs9bi5oZWFkLmV4dHJhX2xlbi1uLmxlbmd0aCxuLmhlYWQuZXh0cmF8fChuLmhlYWQuZXh0cmE9bmV3IEFycmF5KG4uaGVhZC5leHRyYV9sZW4pKSxCbC5hcnJheVNldChuLmhlYWQuZXh0cmEscixvLHAsaykpLDUxMiZuLmZsYWdzJiYobi5jaGVjaz1OZChuLmNoZWNrLHIscCxvKSkscy09cCxvKz1wLG4ubGVuZ3RoLT1wKSxuLmxlbmd0aCkpYnJlYWsgZTtuLmxlbmd0aD0wLG4ubW9kZT03O2Nhc2UgNzppZigyMDQ4Jm4uZmxhZ3Mpe2lmKDA9PT1zKWJyZWFrIGU7Zm9yKHA9MDtrPXJbbytwKytdLG4uaGVhZCYmayYmbi5sZW5ndGg8NjU1MzYmJihuLmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShrKSksayYmcDxzOyk7aWYoNTEyJm4uZmxhZ3MmJihuLmNoZWNrPU5kKG4uY2hlY2sscixwLG8pKSxzLT1wLG8rPXAsaylicmVhayBlfWVsc2Ugbi5oZWFkJiYobi5oZWFkLm5hbWU9bnVsbCk7bi5sZW5ndGg9MCxuLm1vZGU9ODtjYXNlIDg6aWYoNDA5NiZuLmZsYWdzKXtpZigwPT09cylicmVhayBlO2ZvcihwPTA7az1yW28rcCsrXSxuLmhlYWQmJmsmJm4ubGVuZ3RoPDY1NTM2JiYobi5oZWFkLmNvbW1lbnQrPVN0cmluZy5mcm9tQ2hhckNvZGUoaykpLGsmJnA8czspO2lmKDUxMiZuLmZsYWdzJiYobi5jaGVjaz1OZChuLmNoZWNrLHIscCxvKSkscy09cCxvKz1wLGspYnJlYWsgZX1lbHNlIG4uaGVhZCYmKG4uaGVhZC5jb21tZW50PW51bGwpO24ubW9kZT05O2Nhc2UgOTppZig1MTImbi5mbGFncyl7Zm9yKDtsPDE2Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYodSE9PSg2NTUzNSZuLmNoZWNrKSl7ZS5tc2c9ImhlYWRlciBjcmMgbWlzbWF0Y2giLG4ubW9kZT0zMDticmVha31sPXU9MH1uLmhlYWQmJihuLmhlYWQuaGNyYz1uLmZsYWdzPj45JjEsbi5oZWFkLmRvbmU9ITApLGUuYWRsZXI9bi5jaGVjaz0wLG4ubW9kZT0xMjticmVhaztjYXNlIDEwOmZvcig7bDwzMjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWUuYWRsZXI9bi5jaGVjaz1RZih1KSxsPXU9MCxuLm1vZGU9MTE7Y2FzZSAxMTppZigwPT09bi5oYXZlZGljdClyZXR1cm4gZS5uZXh0X291dD1hLGUuYXZhaWxfb3V0PWMsZS5uZXh0X2luPW8sZS5hdmFpbF9pbj1zLG4uaG9sZD11LG4uYml0cz1sLDI7ZS5hZGxlcj1uLmNoZWNrPTEsbi5tb2RlPTEyO2Nhc2UgMTI6aWYoNT09PXR8fDY9PT10KWJyZWFrIGU7Y2FzZSAxMzppZihuLmxhc3Qpe3U+Pj49NyZsLGwtPTcmbCxuLm1vZGU9Mjc7YnJlYWt9Zm9yKDtsPDM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1zd2l0Y2gobi5sYXN0PTEmdSxsLT0xLDMmKHU+Pj49MSkpe2Nhc2UgMDpuLm1vZGU9MTQ7YnJlYWs7Y2FzZSAxOmlmKGNwKG4pLG4ubW9kZT0yMCw2PT09dCl7dT4+Pj0yLGwtPTI7YnJlYWsgZX1icmVhaztjYXNlIDI6bi5tb2RlPTE3O2JyZWFrO2Nhc2UgMzplLm1zZz0iaW52YWxpZCBibG9jayB0eXBlIixuLm1vZGU9MzB9dT4+Pj0yLGwtPTI7YnJlYWs7Y2FzZSAxNDpmb3IodT4+Pj03JmwsbC09NyZsO2w8MzI7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZigoNjU1MzUmdSkhPSh1Pj4+MTZeNjU1MzUpKXtlLm1zZz0iaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyIsbi5tb2RlPTMwO2JyZWFrfWlmKG4ubGVuZ3RoPTY1NTM1JnUsbD11PTAsbi5tb2RlPTE1LDY9PT10KWJyZWFrIGU7Y2FzZSAxNTpuLm1vZGU9MTY7Y2FzZSAxNjppZihwPW4ubGVuZ3RoKXtpZihzPHAmJihwPXMpLGM8cCYmKHA9YyksMD09PXApYnJlYWsgZTtCbC5hcnJheVNldChpLHIsbyxwLGEpLHMtPXAsbys9cCxjLT1wLGErPXAsbi5sZW5ndGgtPXA7YnJlYWt9bi5tb2RlPTEyO2JyZWFrO2Nhc2UgMTc6Zm9yKDtsPDE0Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYobi5ubGVuPTI1NysoMzEmdSksdT4+Pj01LGwtPTUsbi5uZGlzdD0xKygzMSZ1KSx1Pj4+PTUsbC09NSxuLm5jb2RlPTQrKDE1JnUpLHU+Pj49NCxsLT00LDI4NjxuLm5sZW58fDMwPG4ubmRpc3Qpe2UubXNnPSJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyIsbi5tb2RlPTMwO2JyZWFrfW4uaGF2ZT0wLG4ubW9kZT0xODtjYXNlIDE4OmZvcig7bi5oYXZlPG4ubmNvZGU7KXtmb3IoO2w8Mzspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fW4ubGVuc1tBW24uaGF2ZSsrXV09NyZ1LHU+Pj49MyxsLT0zfWZvcig7bi5oYXZlPDE5OyluLmxlbnNbQVtuLmhhdmUrK11dPTA7aWYobi5sZW5jb2RlPW4ubGVuZHluLG4ubGVuYml0cz03LHg9e2JpdHM6bi5sZW5iaXRzfSxTPVdmKDAsbi5sZW5zLDAsMTksbi5sZW5jb2RlLDAsbi53b3JrLHgpLG4ubGVuYml0cz14LmJpdHMsUyl7ZS5tc2c9ImludmFsaWQgY29kZSBsZW5ndGhzIHNldCIsbi5tb2RlPTMwO2JyZWFrfW4uaGF2ZT0wLG4ubW9kZT0xOTtjYXNlIDE5OmZvcig7bi5oYXZlPG4ubmxlbituLm5kaXN0Oyl7Zm9yKDttPShUPW4ubGVuY29kZVt1JigxPDxuLmxlbmJpdHMpLTFdKT4+PjE2JjI1NSx5PTY1NTM1JlQsISgoZz1UPj4+MjQpPD1sKTspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWlmKHk8MTYpdT4+Pj1nLGwtPWcsbi5sZW5zW24uaGF2ZSsrXT15O2Vsc2V7aWYoMTY9PT15KXtmb3IoQz1nKzI7bDxDOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYodT4+Pj1nLGwtPWcsMD09PW4uaGF2ZSl7ZS5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLG4ubW9kZT0zMDticmVha31rPW4ubGVuc1tuLmhhdmUtMV0scD0zKygzJnUpLHU+Pj49MixsLT0yfWVsc2UgaWYoMTc9PT15KXtmb3IoQz1nKzM7bDxDOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9bC09ZyxrPTAscD0zKyg3Jih1Pj4+PWcpKSx1Pj4+PTMsbC09M31lbHNle2ZvcihDPWcrNztsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1sLT1nLGs9MCxwPTExKygxMjcmKHU+Pj49ZykpLHU+Pj49NyxsLT03fWlmKG4uaGF2ZStwPm4ubmxlbituLm5kaXN0KXtlLm1zZz0iaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsbi5tb2RlPTMwO2JyZWFrfWZvcig7cC0tOyluLmxlbnNbbi5oYXZlKytdPWt9fWlmKDMwPT09bi5tb2RlKWJyZWFrO2lmKDA9PT1uLmxlbnNbMjU2XSl7ZS5tc2c9ImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayIsbi5tb2RlPTMwO2JyZWFrfWlmKG4ubGVuYml0cz05LHg9e2JpdHM6bi5sZW5iaXRzfSxTPVdmKEhmLG4ubGVucywwLG4ubmxlbixuLmxlbmNvZGUsMCxuLndvcmsseCksbi5sZW5iaXRzPXguYml0cyxTKXtlLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0IixuLm1vZGU9MzA7YnJlYWt9aWYobi5kaXN0Yml0cz02LG4uZGlzdGNvZGU9bi5kaXN0ZHluLHg9e2JpdHM6bi5kaXN0Yml0c30sUz1XZihHZixuLmxlbnMsbi5ubGVuLG4ubmRpc3Qsbi5kaXN0Y29kZSwwLG4ud29yayx4KSxuLmRpc3RiaXRzPXguYml0cyxTKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0IixuLm1vZGU9MzA7YnJlYWt9aWYobi5tb2RlPTIwLDY9PT10KWJyZWFrIGU7Y2FzZSAyMDpuLm1vZGU9MjE7Y2FzZSAyMTppZig2PD1zJiYyNTg8PWMpe2UubmV4dF9vdXQ9YSxlLmF2YWlsX291dD1jLGUubmV4dF9pbj1vLGUuYXZhaWxfaW49cyxuLmhvbGQ9dSxuLmJpdHM9bCxGZihlLGYpLGE9ZS5uZXh0X291dCxpPWUub3V0cHV0LGM9ZS5hdmFpbF9vdXQsbz1lLm5leHRfaW4scj1lLmlucHV0LHM9ZS5hdmFpbF9pbix1PW4uaG9sZCxsPW4uYml0cywxMj09PW4ubW9kZSYmKG4uYmFjaz0tMSk7YnJlYWt9Zm9yKG4uYmFjaz0wO209KFQ9bi5sZW5jb2RlW3UmKDE8PG4ubGVuYml0cyktMV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKChnPVQ+Pj4yNCk8PWwpOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYobSYmMD09KDI0MCZtKSl7Zm9yKF89ZyxiPW0sdz15O209KFQ9bi5sZW5jb2RlW3crKCh1JigxPDxfK2IpLTEpPj5fKV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKF8rKGc9VD4+PjI0KTw9bCk7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH11Pj4+PV8sbC09XyxuLmJhY2srPV99aWYodT4+Pj1nLGwtPWcsbi5iYWNrKz1nLG4ubGVuZ3RoPXksMD09PW0pe24ubW9kZT0yNjticmVha31pZigzMiZtKXtuLmJhY2s9LTEsbi5tb2RlPTEyO2JyZWFrfWlmKDY0Jm0pe2UubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiLG4ubW9kZT0zMDticmVha31uLmV4dHJhPTE1Jm0sbi5tb2RlPTIyO2Nhc2UgMjI6aWYobi5leHRyYSl7Zm9yKEM9bi5leHRyYTtsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1uLmxlbmd0aCs9dSYoMTw8bi5leHRyYSktMSx1Pj4+PW4uZXh0cmEsbC09bi5leHRyYSxuLmJhY2srPW4uZXh0cmF9bi53YXM9bi5sZW5ndGgsbi5tb2RlPTIzO2Nhc2UgMjM6Zm9yKDttPShUPW4uZGlzdGNvZGVbdSYoMTw8bi5kaXN0Yml0cyktMV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKChnPVQ+Pj4yNCk8PWwpOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYoMD09KDI0MCZtKSl7Zm9yKF89ZyxiPW0sdz15O209KFQ9bi5kaXN0Y29kZVt3KygodSYoMTw8XytiKS0xKT4+XyldKT4+PjE2JjI1NSx5PTY1NTM1JlQsIShfKyhnPVQ+Pj4yNCk8PWwpOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9dT4+Pj1fLGwtPV8sbi5iYWNrKz1ffWlmKHU+Pj49ZyxsLT1nLG4uYmFjays9Zyw2NCZtKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIixuLm1vZGU9MzA7YnJlYWt9bi5vZmZzZXQ9eSxuLmV4dHJhPTE1Jm0sbi5tb2RlPTI0O2Nhc2UgMjQ6aWYobi5leHRyYSl7Zm9yKEM9bi5leHRyYTtsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1uLm9mZnNldCs9dSYoMTw8bi5leHRyYSktMSx1Pj4+PW4uZXh0cmEsbC09bi5leHRyYSxuLmJhY2srPW4uZXh0cmF9aWYobi5vZmZzZXQ+bi5kbWF4KXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT0zMDticmVha31uLm1vZGU9MjU7Y2FzZSAyNTppZigwPT09YylicmVhayBlO2lmKHA9Zi1jLG4ub2Zmc2V0PnApe2lmKChwPW4ub2Zmc2V0LXApPm4ud2hhdmUmJm4uc2FuZSl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixuLm1vZGU9MzA7YnJlYWt9cD5uLnduZXh0PyhwLT1uLnduZXh0LGg9bi53c2l6ZS1wKTpoPW4ud25leHQtcCxwPm4ubGVuZ3RoJiYocD1uLmxlbmd0aCksdj1uLndpbmRvd31lbHNlIHY9aSxoPWEtbi5vZmZzZXQscD1uLmxlbmd0aDtmb3IoYzxwJiYocD1jKSxjLT1wLG4ubGVuZ3RoLT1wO2lbYSsrXT12W2grK10sLS1wOyk7MD09PW4ubGVuZ3RoJiYobi5tb2RlPTIxKTticmVhaztjYXNlIDI2OmlmKDA9PT1jKWJyZWFrIGU7aVthKytdPW4ubGVuZ3RoLGMtLSxuLm1vZGU9MjE7YnJlYWs7Y2FzZSAyNzppZihuLndyYXApe2Zvcig7bDwzMjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHV8PXJbbysrXTw8bCxsKz04fWlmKGYtPWMsZS50b3RhbF9vdXQrPWYsbi50b3RhbCs9ZixmJiYoZS5hZGxlcj1uLmNoZWNrPW4uZmxhZ3M/TmQobi5jaGVjayxpLGYsYS1mKTpNZChuLmNoZWNrLGksZixhLWYpKSxmPWMsKG4uZmxhZ3M/dTpRZih1KSkhPT1uLmNoZWNrKXtlLm1zZz0iaW5jb3JyZWN0IGRhdGEgY2hlY2siLG4ubW9kZT0zMDticmVha31sPXU9MH1uLm1vZGU9Mjg7Y2FzZSAyODppZihuLndyYXAmJm4uZmxhZ3Mpe2Zvcig7bDwzMjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWlmKHUhPT0oNDI5NDk2NzI5NSZuLnRvdGFsKSl7ZS5tc2c9ImluY29ycmVjdCBsZW5ndGggY2hlY2siLG4ubW9kZT0zMDticmVha31sPXU9MH1uLm1vZGU9Mjk7Y2FzZSAyOTpTPTE7YnJlYWsgZTtjYXNlIDMwOlM9LTM7YnJlYWsgZTtjYXNlIDMxOnJldHVybi00O2Nhc2UgMzI6ZGVmYXVsdDpyZXR1cm4gWGZ9cmV0dXJuIGUubmV4dF9vdXQ9YSxlLmF2YWlsX291dD1jLGUubmV4dF9pbj1vLGUuYXZhaWxfaW49cyxuLmhvbGQ9dSxuLmJpdHM9bCwobi53c2l6ZXx8ZiE9PWUuYXZhaWxfb3V0JiZuLm1vZGU8MzAmJihuLm1vZGU8Mjd8fDQhPT10KSkmJnVwKGUsZS5vdXRwdXQsZS5uZXh0X291dCxmLWUuYXZhaWxfb3V0KSxkLT1lLmF2YWlsX2luLGYtPWUuYXZhaWxfb3V0LGUudG90YWxfaW4rPWQsZS50b3RhbF9vdXQrPWYsbi50b3RhbCs9ZixuLndyYXAmJmYmJihlLmFkbGVyPW4uY2hlY2s9bi5mbGFncz9OZChuLmNoZWNrLGksZixlLm5leHRfb3V0LWYpOk1kKG4uY2hlY2ssaSxmLGUubmV4dF9vdXQtZikpLGUuZGF0YV90eXBlPW4uYml0cysobi5sYXN0PzY0OjApKygxMj09PW4ubW9kZT8xMjg6MCkrKDIwPT09bi5tb2RlfHwxNT09PW4ubW9kZT8yNTY6MCksKDA9PT1kJiYwPT09Znx8ND09PXQpJiZTPT09SmYmJihTPS01KSxTfSxpbmZsYXRlRW5kOmZ1bmN0aW9uKGUpe2lmKCFlfHwhZS5zdGF0ZSlyZXR1cm4gWGY7dmFyIHQ9ZS5zdGF0ZTtyZXR1cm4gdC53aW5kb3cmJih0LndpbmRvdz1udWxsKSxlLnN0YXRlPW51bGwsSmZ9LGluZmxhdGVHZXRIZWFkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gZSYmZS5zdGF0ZT8wPT0oMiYobj1lLnN0YXRlKS53cmFwKT9YZjooKG4uaGVhZD10KS5kb25lPSExLEpmKTpYZn0saW5mbGF0ZVNldERpY3Rpb25hcnk6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXQubGVuZ3RoO3JldHVybiBlJiZlLnN0YXRlPzAhPT0obj1lLnN0YXRlKS53cmFwJiYxMSE9PW4ubW9kZT9YZjoxMT09PW4ubW9kZSYmTWQoMSx0LHIsMCkhPT1uLmNoZWNrPy0zOnVwKGUsdCxyLHIpPyhuLm1vZGU9MzEsLTQpOihuLmhhdmVkaWN0PTEsSmYpOlhmfSxpbmZsYXRlSW5mbzoicGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSJ9LGRwPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsWl9EQVRBX0VSUk9SOi0zLFpfQlVGX0VSUk9SOi01LFpfTk9fQ09NUFJFU1NJT046MCxaX0JFU1RfU1BFRUQ6MSxaX0JFU1RfQ09NUFJFU1NJT046OSxaX0RFRkFVTFRfQ09NUFJFU1NJT046LTEsWl9GSUxURVJFRDoxLFpfSFVGRk1BTl9PTkxZOjIsWl9STEU6MyxaX0ZJWEVEOjQsWl9ERUZBVUxUX1NUUkFURUdZOjAsWl9CSU5BUlk6MCxaX1RFWFQ6MSxaX1VOS05PV046MixaX0RFRkxBVEVEOjh9O3ZhciBmcD1mdW5jdGlvbigpe3RoaXMudGV4dD0wLHRoaXMudGltZT0wLHRoaXMueGZsYWdzPTAsdGhpcy5vcz0wLHRoaXMuZXh0cmE9bnVsbCx0aGlzLmV4dHJhX2xlbj0wLHRoaXMubmFtZT0iIix0aGlzLmNvbW1lbnQ9IiIsdGhpcy5oY3JjPTAsdGhpcy5kb25lPSExfSxwcD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIGhwKGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGhwKSlyZXR1cm4gbmV3IGhwKGUpO3RoaXMub3B0aW9ucz1CbC5hc3NpZ24oe2NodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjAsdG86IiJ9LGV8fHt9KTt2YXIgdD10aGlzLm9wdGlvbnM7dC5yYXcmJjA8PXQud2luZG93Qml0cyYmdC53aW5kb3dCaXRzPDE2JiYodC53aW5kb3dCaXRzPS10LndpbmRvd0JpdHMsMD09PXQud2luZG93Qml0cyYmKHQud2luZG93Qml0cz0tMTUpKSwhKDA8PXQud2luZG93Qml0cyYmdC53aW5kb3dCaXRzPDE2KXx8ZSYmZS53aW5kb3dCaXRzfHwodC53aW5kb3dCaXRzKz0zMiksMTU8dC53aW5kb3dCaXRzJiZ0LndpbmRvd0JpdHM8NDgmJjA9PSgxNSZ0LndpbmRvd0JpdHMpJiYodC53aW5kb3dCaXRzfD0xNSksdGhpcy5lcnI9MCx0aGlzLm1zZz0iIix0aGlzLmVuZGVkPSExLHRoaXMuY2h1bmtzPVtdLHRoaXMuc3RybT1uZXcgJGYsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBuPWxwLmluZmxhdGVJbml0Mih0aGlzLnN0cm0sdC53aW5kb3dCaXRzKTtpZihuIT09ZHAuWl9PSyl0aHJvdyBuZXcgRXJyb3IoQmRbbl0pO2lmKHRoaXMuaGVhZGVyPW5ldyBmcCxscC5pbmZsYXRlR2V0SGVhZGVyKHRoaXMuc3RybSx0aGlzLmhlYWRlciksdC5kaWN0aW9uYXJ5JiYoInN0cmluZyI9PXR5cGVvZiB0LmRpY3Rpb25hcnk/dC5kaWN0aW9uYXJ5PUlmLnN0cmluZzJidWYodC5kaWN0aW9uYXJ5KToiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09cHAuY2FsbCh0LmRpY3Rpb25hcnkpJiYodC5kaWN0aW9uYXJ5PW5ldyBVaW50OEFycmF5KHQuZGljdGlvbmFyeSkpLHQucmF3JiYobj1scC5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sdC5kaWN0aW9uYXJ5KSkhPT1kcC5aX09LKSl0aHJvdyBuZXcgRXJyb3IoQmRbbl0pfWZ1bmN0aW9uIHZwKGUsdCl7dmFyIG49bmV3IGhwKHQpO2lmKG4ucHVzaChlLCEwKSxuLmVycil0aHJvdyBuLm1zZ3x8QmRbbi5lcnJdO3JldHVybiBuLnJlc3VsdH1ocC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz10aGlzLnN0cm0sYz10aGlzLm9wdGlvbnMuY2h1bmtTaXplLHU9dGhpcy5vcHRpb25zLmRpY3Rpb25hcnksbD0hMTtpZih0aGlzLmVuZGVkKXJldHVybiExO3I9dD09PX5+dD90OiEwPT09dD9kcC5aX0ZJTklTSDpkcC5aX05PX0ZMVVNILCJzdHJpbmciPT10eXBlb2YgZT9zLmlucHV0PUlmLmJpbnN0cmluZzJidWYoZSk6IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PXBwLmNhbGwoZSk/cy5pbnB1dD1uZXcgVWludDhBcnJheShlKTpzLmlucHV0PWUscy5uZXh0X2luPTAscy5hdmFpbF9pbj1zLmlucHV0Lmxlbmd0aDtkb3tpZigwPT09cy5hdmFpbF9vdXQmJihzLm91dHB1dD1uZXcgQmwuQnVmOChjKSxzLm5leHRfb3V0PTAscy5hdmFpbF9vdXQ9YyksKG49bHAuaW5mbGF0ZShzLGRwLlpfTk9fRkxVU0gpKT09PWRwLlpfTkVFRF9ESUNUJiZ1JiYobj1scC5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sdSkpLG49PT1kcC5aX0JVRl9FUlJPUiYmITA9PT1sJiYobj1kcC5aX09LLGw9ITEpLG4hPT1kcC5aX1NUUkVBTV9FTkQmJm4hPT1kcC5aX09LKXJldHVybiB0aGlzLm9uRW5kKG4pLCEodGhpcy5lbmRlZD0hMCk7cy5uZXh0X291dCYmKDAhPT1zLmF2YWlsX291dCYmbiE9PWRwLlpfU1RSRUFNX0VORCYmKDAhPT1zLmF2YWlsX2lufHxyIT09ZHAuWl9GSU5JU0gmJnIhPT1kcC5aX1NZTkNfRkxVU0gpfHwoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/KGk9SWYudXRmOGJvcmRlcihzLm91dHB1dCxzLm5leHRfb3V0KSxvPXMubmV4dF9vdXQtaSxhPUlmLmJ1ZjJzdHJpbmcocy5vdXRwdXQsaSkscy5uZXh0X291dD1vLHMuYXZhaWxfb3V0PWMtbyxvJiZCbC5hcnJheVNldChzLm91dHB1dCxzLm91dHB1dCxpLG8sMCksdGhpcy5vbkRhdGEoYSkpOnRoaXMub25EYXRhKEJsLnNocmlua0J1ZihzLm91dHB1dCxzLm5leHRfb3V0KSkpKSwwPT09cy5hdmFpbF9pbiYmMD09PXMuYXZhaWxfb3V0JiYobD0hMCl9d2hpbGUoKDA8cy5hdmFpbF9pbnx8MD09PXMuYXZhaWxfb3V0KSYmbiE9PWRwLlpfU1RSRUFNX0VORCk7cmV0dXJuIG49PT1kcC5aX1NUUkVBTV9FTkQmJihyPWRwLlpfRklOSVNIKSxyPT09ZHAuWl9GSU5JU0g/KG49bHAuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pLHRoaXMub25FbmQobiksdGhpcy5lbmRlZD0hMCxuPT09ZHAuWl9PSyk6ciE9PWRwLlpfU1lOQ19GTFVTSHx8KHRoaXMub25FbmQoZHAuWl9PSyksIShzLmF2YWlsX291dD0wKSl9LGhwLnByb3RvdHlwZS5vbkRhdGE9ZnVuY3Rpb24oZSl7dGhpcy5jaHVua3MucHVzaChlKX0saHAucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKGUpe2U9PT1kcC5aX09LJiYoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9QmwuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWUsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ307dmFyIGdwPXtJbmZsYXRlOmhwLGluZmxhdGU6dnAsaW5mbGF0ZVJhdzpmdW5jdGlvbihlLHQpe3JldHVybih0PXR8fHt9KS5yYXc9ITAsdnAoZSx0KX0sdW5nemlwOnZwfSxtcD17fTsoMCxCbC5hc3NpZ24pKG1wLFJmLGdwLGRwKTt2YXIgeXA9bXAsX3A9dGwoImNhbnZhc0V2ZW50Iik7ZnVuY3Rpb24gYnAoZSx0LG4scil7ZmcucHVibGlzaEhhbmRsZXIodCsiLWNhbnZhcy0iK2Use2NhbnZhc0lkOmUsdHlwZTpuLGRhdGE6cn0sdCl9Zmcuc3Vic2NyaWJlKCJvbkNhbnZhc01ldGhvZENhbGxiYWNrIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGEscj1fcC5wb3AodCk7ciYmcihuKX0pO3ZhciB3cD17YWxpY2VibHVlOiIjZjBmOGZmIixhbnRpcXVld2hpdGU6IiNmYWViZDciLGFxdWE6IiMwMGZmZmYiLGFxdWFtYXJpbmU6IiM3ZmZmZDQiLGF6dXJlOiIjZjBmZmZmIixiZWlnZToiI2Y1ZjVkYyIsYmlzcXVlOiIjZmZlNGM0IixibGFjazoiIzAwMDAwMCIsYmxhbmNoZWRhbG1vbmQ6IiNmZmViY2QiLGJsdWU6IiMwMDAwZmYiLGJsdWV2aW9sZXQ6IiM4YTJiZTIiLGJyb3duOiIjYTUyYTJhIixidXJseXdvb2Q6IiNkZWI4ODciLGNhZGV0Ymx1ZToiIzVmOWVhMCIsY2hhcnRyZXVzZToiIzdmZmYwMCIsY2hvY29sYXRlOiIjZDI2OTFlIixjb3JhbDoiI2ZmN2Y1MCIsY29ybmZsb3dlcmJsdWU6IiM2NDk1ZWQiLGNvcm5zaWxrOiIjZmZmOGRjIixjcmltc29uOiIjZGMxNDNjIixjeWFuOiIjMDBmZmZmIixkYXJrYmx1ZToiIzAwMDA4YiIsZGFya2N5YW46IiMwMDhiOGIiLGRhcmtnb2xkZW5yb2Q6IiNiODg2MGIiLGRhcmtncmF5OiIjYTlhOWE5IixkYXJrZ3JleToiI2E5YTlhOSIsZGFya2dyZWVuOiIjMDA2NDAwIixkYXJra2hha2k6IiNiZGI3NmIiLGRhcmttYWdlbnRhOiIjOGIwMDhiIixkYXJrb2xpdmVncmVlbjoiIzU1NmIyZiIsZGFya29yYW5nZToiI2ZmOGMwMCIsZGFya29yY2hpZDoiIzk5MzJjYyIsZGFya3JlZDoiIzhiMDAwMCIsZGFya3NhbG1vbjoiI2U5OTY3YSIsZGFya3NlYWdyZWVuOiIjOGZiYzhmIixkYXJrc2xhdGVibHVlOiIjNDgzZDhiIixkYXJrc2xhdGVncmF5OiIjMmY0ZjRmIixkYXJrc2xhdGVncmV5OiIjMmY0ZjRmIixkYXJrdHVycXVvaXNlOiIjMDBjZWQxIixkYXJrdmlvbGV0OiIjOTQwMGQzIixkZWVwcGluazoiI2ZmMTQ5MyIsZGVlcHNreWJsdWU6IiMwMGJmZmYiLGRpbWdyYXk6IiM2OTY5NjkiLGRpbWdyZXk6IiM2OTY5NjkiLGRvZGdlcmJsdWU6IiMxZTkwZmYiLGZpcmVicmljazoiI2IyMjIyMiIsZmxvcmFsd2hpdGU6IiNmZmZhZjAiLGZvcmVzdGdyZWVuOiIjMjI4YjIyIixmdWNoc2lhOiIjZmYwMGZmIixnYWluc2Jvcm86IiNkY2RjZGMiLGdob3N0d2hpdGU6IiNmOGY4ZmYiLGdvbGQ6IiNmZmQ3MDAiLGdvbGRlbnJvZDoiI2RhYTUyMCIsZ3JheToiIzgwODA4MCIsZ3JleToiIzgwODA4MCIsZ3JlZW46IiMwMDgwMDAiLGdyZWVueWVsbG93OiIjYWRmZjJmIixob25leWRldzoiI2YwZmZmMCIsaG90cGluazoiI2ZmNjliNCIsaW5kaWFucmVkOiIjY2Q1YzVjIixpbmRpZ286IiM0YjAwODIiLGl2b3J5OiIjZmZmZmYwIixraGFraToiI2YwZTY4YyIsbGF2ZW5kZXI6IiNlNmU2ZmEiLGxhdmVuZGVyYmx1c2g6IiNmZmYwZjUiLGxhd25ncmVlbjoiIzdjZmMwMCIsbGVtb25jaGlmZm9uOiIjZmZmYWNkIixsaWdodGJsdWU6IiNhZGQ4ZTYiLGxpZ2h0Y29yYWw6IiNmMDgwODAiLGxpZ2h0Y3lhbjoiI2UwZmZmZiIsbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IiNmYWZhZDIiLGxpZ2h0Z3JheToiI2QzZDNkMyIsbGlnaHRncmV5OiIjZDNkM2QzIixsaWdodGdyZWVuOiIjOTBlZTkwIixsaWdodHBpbms6IiNmZmI2YzEiLGxpZ2h0c2FsbW9uOiIjZmZhMDdhIixsaWdodHNlYWdyZWVuOiIjMjBiMmFhIixsaWdodHNreWJsdWU6IiM4N2NlZmEiLGxpZ2h0c2xhdGVncmF5OiIjNzc4ODk5IixsaWdodHNsYXRlZ3JleToiIzc3ODg5OSIsbGlnaHRzdGVlbGJsdWU6IiNiMGM0ZGUiLGxpZ2h0eWVsbG93OiIjZmZmZmUwIixsaW1lOiIjMDBmZjAwIixsaW1lZ3JlZW46IiMzMmNkMzIiLGxpbmVuOiIjZmFmMGU2IixtYWdlbnRhOiIjZmYwMGZmIixtYXJvb246IiM4MDAwMDAiLG1lZGl1bWFxdWFtYXJpbmU6IiM2NmNkYWEiLG1lZGl1bWJsdWU6IiMwMDAwY2QiLG1lZGl1bW9yY2hpZDoiI2JhNTVkMyIsbWVkaXVtcHVycGxlOiIjOTM3MGRiIixtZWRpdW1zZWFncmVlbjoiIzNjYjM3MSIsbWVkaXVtc2xhdGVibHVlOiIjN2I2OGVlIixtZWRpdW1zcHJpbmdncmVlbjoiIzAwZmE5YSIsbWVkaXVtdHVycXVvaXNlOiIjNDhkMWNjIixtZWRpdW12aW9sZXRyZWQ6IiNjNzE1ODUiLG1pZG5pZ2h0Ymx1ZToiIzE5MTk3MCIsbWludGNyZWFtOiIjZjVmZmZhIixtaXN0eXJvc2U6IiNmZmU0ZTEiLG1vY2Nhc2luOiIjZmZlNGI1IixuYXZham93aGl0ZToiI2ZmZGVhZCIsbmF2eToiIzAwMDA4MCIsb2xkbGFjZToiI2ZkZjVlNiIsb2xpdmU6IiM4MDgwMDAiLG9saXZlZHJhYjoiIzZiOGUyMyIsb3JhbmdlOiIjZmZhNTAwIixvcmFuZ2VyZWQ6IiNmZjQ1MDAiLG9yY2hpZDoiI2RhNzBkNiIscGFsZWdvbGRlbnJvZDoiI2VlZThhYSIscGFsZWdyZWVuOiIjOThmYjk4IixwYWxldHVycXVvaXNlOiIjYWZlZWVlIixwYWxldmlvbGV0cmVkOiIjZGI3MDkzIixwYXBheWF3aGlwOiIjZmZlZmQ1IixwZWFjaHB1ZmY6IiNmZmRhYjkiLHBlcnU6IiNjZDg1M2YiLHBpbms6IiNmZmMwY2IiLHBsdW06IiNkZGEwZGQiLHBvd2RlcmJsdWU6IiNiMGUwZTYiLHB1cnBsZToiIzgwMDA4MCIscmViZWNjYXB1cnBsZToiIzY2MzM5OSIscmVkOiIjZmYwMDAwIixyb3N5YnJvd246IiNiYzhmOGYiLHJveWFsYmx1ZToiIzQxNjllMSIsc2FkZGxlYnJvd246IiM4YjQ1MTMiLHNhbG1vbjoiI2ZhODA3MiIsc2FuZHlicm93bjoiI2Y0YTQ2MCIsc2VhZ3JlZW46IiMyZThiNTciLHNlYXNoZWxsOiIjZmZmNWVlIixzaWVubmE6IiNhMDUyMmQiLHNpbHZlcjoiI2MwYzBjMCIsc2t5Ymx1ZToiIzg3Y2VlYiIsc2xhdGVibHVlOiIjNmE1YWNkIixzbGF0ZWdyYXk6IiM3MDgwOTAiLHNsYXRlZ3JleToiIzcwODA5MCIsc25vdzoiI2ZmZmFmYSIsc3ByaW5nZ3JlZW46IiMwMGZmN2YiLHN0ZWVsYmx1ZToiIzQ2ODJiNCIsdGFuOiIjZDJiNDhjIix0ZWFsOiIjMDA4MDgwIix0aGlzdGxlOiIjZDhiZmQ4Iix0b21hdG86IiNmZjYzNDciLHR1cnF1b2lzZToiIzQwZTBkMCIsdmlvbGV0OiIjZWU4MmVlIix3aGVhdDoiI2Y1ZGViMyIsd2hpdGU6IiNmZmZmZmYiLHdoaXRlc21va2U6IiNmNWY1ZjUiLHllbGxvdzoiI2ZmZmYwMCIseWVsbG93Z3JlZW46IiM5YWNkMzIiLHRyYW5zcGFyZW50OiIjMDAwMDAwMDAifTtmdW5jdGlvbiBrcChlKXt2YXIgdD1udWxsO2lmKG51bGwhPSh0PS9eIyhbMC05fEEtRnxhLWZdezZ9KSQvLmV4ZWMoZT1lfHwiIzAwMDAwMCIpKSlyZXR1cm5bcGFyc2VJbnQodFsxXS5zbGljZSgwLDIpLDE2KSxwYXJzZUludCh0WzFdLnNsaWNlKDIsNCksMTYpLHBhcnNlSW50KHRbMV0uc2xpY2UoNCksMTYpLDI1NV07aWYobnVsbCE9KHQ9L14jKFswLTl8QS1GfGEtZl17M30pJC8uZXhlYyhlKSkpe3ZhciBuPXRbMV0uc2xpY2UoMCwxKSxyPXRbMV0uc2xpY2UoMSwyKSxpPXRbMV0uc2xpY2UoMiwzKTtyZXR1cm5bbj1wYXJzZUludChuK24sMTYpLHI9cGFyc2VJbnQocityLDE2KSxpPXBhcnNlSW50KGkraSwxNiksMjU1XX1pZihudWxsIT0odD0vXnJnYlwoKC4rKVwpJC8uZXhlYyhlKSkpcmV0dXJuIHRbMV0uc3BsaXQoIiwiKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWluKDI1NSxwYXJzZUludChlLnRyaW0oKSkpfSkuY29uY2F0KDI1NSk7aWYobnVsbCE9KHQ9L15yZ2JhXCgoLispXCkkLy5leGVjKGUpKSlyZXR1cm4gdFsxXS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiAzPT09dD9NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KGUudHJpbSgpKSk6TWF0aC5taW4oMjU1LHBhcnNlSW50KGUudHJpbSgpKSl9KTt2YXIgbz1lLnRvTG93ZXJDYXNlKCk7aWYoayh3cCxvKSl7dD0vXiMoWzAtOXxBLUZ8YS1mXXs2LDh9KSQvLmV4ZWMod3Bbb10pO3ZhciBhPXBhcnNlSW50KHRbMV0uc2xpY2UoMCwyKSwxNikscz1wYXJzZUludCh0WzFdLnNsaWNlKDIsNCksMTYpLGM9cGFyc2VJbnQodFsxXS5zbGljZSg0LDYpLDE2KSx1PXBhcnNlSW50KHRbMV0uc2xpY2UoNiw4KSwxNik7cmV0dXJuW2EscyxjLHU9MDw9dT91OjI1NV19cmV0dXJuIGNvbnNvbGUuZXJyb3IoInVuc3VwcG9ydGVkIGNvbG9yOiIrZSksWzAsMCwwLDI1NV19ZnVuY3Rpb24gU3AoZSx0KXt0aGlzLnR5cGU9InBhdHRlcm4iLHRoaXMuZGF0YT1lLHRoaXMuY29sb3JTdG9wPXR9dmFyIHhwPWZ1bmN0aW9uKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXQsdGhpcy5jb2xvclN0b3A9W119O3hwLnByb3RvdHlwZS5hZGRDb2xvclN0b3A9ZnVuY3Rpb24oZSx0KXt0aGlzLmNvbG9yU3RvcC5wdXNoKFtlLGtwKHQpXSl9O2Z1bmN0aW9uIENwKGUpe3RoaXMud2lkdGg9ZX12YXIgVHA9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5wYWdlSWQ9dCx0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXSx0aGlzLmN1cnJlbnRUcmFuc2Zvcm09W10sdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXMuZHJhd2luZ1N0YXRlPVtdLHRoaXMuc3RhdGU9e2xpbmVEYXNoOlswLDBdLHNoYWRvd09mZnNldFg6MCxzaGFkb3dPZmZzZXRZOjAsc2hhZG93Qmx1cjowLHNoYWRvd0NvbG9yOlswLDAsMCwwXSxmb250OiIxMHB4IHNhbnMtc2VyaWYiLGZvbnRTaXplOjEwLGZvbnRXZWlnaHQ6Im5vcm1hbCIsZm9udFN0eWxlOiJub3JtYWwiLGZvbnRGYW1pbHk6InNhbnMtc2VyaWYifX0sT3A9e2xpbmVEYXNoT2Zmc2V0Ontjb25maWd1cmFibGU6ITB9LGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbjp7Y29uZmlndXJhYmxlOiEwfSxzaGFkb3dCbHVyOntjb25maWd1cmFibGU6ITB9LHNoYWRvd0NvbG9yOntjb25maWd1cmFibGU6ITB9LHNoYWRvd09mZnNldFg6e2NvbmZpZ3VyYWJsZTohMH0sc2hhZG93T2Zmc2V0WTp7Y29uZmlndXJhYmxlOiEwfSxmb250Ontjb25maWd1cmFibGU6ITB9LGZpbGxTdHlsZTp7Y29uZmlndXJhYmxlOiEwfSxzdHJva2VTdHlsZTp7Y29uZmlndXJhYmxlOiEwfSxnbG9iYWxBbHBoYTp7Y29uZmlndXJhYmxlOiEwfSx0ZXh0QWxpZ246e2NvbmZpZ3VyYWJsZTohMH0sbGluZUNhcDp7Y29uZmlndXJhYmxlOiEwfSxsaW5lSm9pbjp7Y29uZmlndXJhYmxlOiEwfSxsaW5lV2lkdGg6e2NvbmZpZ3VyYWJsZTohMH0sbWl0ZXJMaW1pdDp7Y29uZmlndXJhYmxlOiEwfSx0ZXh0QmFzZWxpbmU6e2NvbmZpZ3VyYWJsZTohMH19O1RwLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9ITEpO3ZhciBuLHI9W10uY29uY2F0KHRoaXMuYWN0aW9ucyk7dGhpcy5hY3Rpb25zPVtdLHRoaXMucGF0aD1bXSwiZnVuY3Rpb24iPT10eXBlb2YgdCYmKG49X3AucHVzaCh0KSksYnAodGhpcy5pZCx0aGlzLnBhZ2VJZCwiYWN0aW9uc0NoYW5nZWQiLHthY3Rpb25zOnIscmVzZXJ2ZTplLGNhbGxiYWNrSWQ6bn0pfSxUcC5wcm90b3R5cGUuY3JlYXRlTGluZWFyR3JhZGllbnQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG5ldyB4cCgibGluZWFyIixbZSx0LG4scl0pfSxUcC5wcm90b3R5cGUuY3JlYXRlQ2lyY3VsYXJHcmFkaWVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG5ldyB4cCgicmFkaWFsIixbZSx0LG5dKX0sVHAucHJvdG90eXBlLmNyZWF0ZVBhdHRlcm49ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10KWNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdjcmVhdGVQYXR0ZXJuJyBvbiAnQ2FudmFzQ29udGV4dCc6IDIgYXJndW1lbnRzIHJlcXVpcmVkLCBidXQgb25seSAxIHByZXNlbnQuIik7ZWxzZXtpZighKFsicmVwZWF0IiwicmVwZWF0LXgiLCJyZXBlYXQteSIsIm5vLXJlcGVhdCJdLmluZGV4T2YodCk8MCkpcmV0dXJuIG5ldyBTcChlLHQpO2NvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdjcmVhdGVQYXR0ZXJuJyBvbiAnQ2FudmFzQ29udGV4dCc6IFRoZSBwcm92aWRlZCB0eXBlICgnIit0KyInKSBpcyBub3Qgb25lIG9mICdyZXBlYXQnLCAnbm8tcmVwZWF0JywgJ3JlcGVhdC14Jywgb3IgJ3JlcGVhdC15Jy4iKX19LFRwLnByb3RvdHlwZS5tZWFzdXJlVGV4dD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnN0YXRlLmZvbnQsbj0wLHI9ZGcud2Vidmlldy5hbGwoKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFVSTCgpLmVuZHNXaXRoKCJ3d3cvX191bmlhcHB2aWV3Lmh0bWwiKX0pO3JldHVybiByJiYobj1OdW1iZXIoci5ldmFsSlNTeW5jKCIoIitmdW5jdGlvbihlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIik7cmV0dXJuIG4uZm9udD10LG4ubWVhc3VyZVRleHQoZSkud2lkdGh8fDB9LnRvU3RyaW5nKCkrIikoIitKU09OLnN0cmluZ2lmeShlKSsiLCIrSlNPTi5zdHJpbmdpZnkodCkrIikiKSkpLG5ldyBDcChuKX0sVHAucHJvdG90eXBlLnNhdmU9ZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzYXZlIixkYXRhOltdfSksdGhpcy5kcmF3aW5nU3RhdGUucHVzaCh0aGlzLnN0YXRlKX0sVHAucHJvdG90eXBlLnJlc3RvcmU9ZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJyZXN0b3JlIixkYXRhOltdfSksdGhpcy5zdGF0ZT10aGlzLmRyYXdpbmdTdGF0ZS5wb3AoKXx8e2xpbmVEYXNoOlswLDBdLHNoYWRvd09mZnNldFg6MCxzaGFkb3dPZmZzZXRZOjAsc2hhZG93Qmx1cjowLHNoYWRvd0NvbG9yOlswLDAsMCwwXSxmb250OiIxMHB4IHNhbnMtc2VyaWYiLGZvbnRTaXplOjEwLGZvbnRXZWlnaHQ6Im5vcm1hbCIsZm9udFN0eWxlOiJub3JtYWwiLGZvbnRGYW1pbHk6InNhbnMtc2VyaWYifX0sVHAucHJvdG90eXBlLmJlZ2luUGF0aD1mdW5jdGlvbigpe3RoaXMucGF0aD1bXSx0aGlzLnN1YnBhdGg9W10sdGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYmVnaW5QYXRoIixkYXRhOltdfSl9LFRwLnByb3RvdHlwZS5tb3ZlVG89ZnVuY3Rpb24oZSx0KXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJtb3ZlVG8iLGRhdGE6W2UsdF19KSx0aGlzLnN1YnBhdGg9W1tlLHRdXX0sVHAucHJvdG90eXBlLmxpbmVUbz1mdW5jdGlvbihlLHQpezA9PT10aGlzLnBhdGgubGVuZ3RoJiYwPT09dGhpcy5zdWJwYXRoLmxlbmd0aD90aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJtb3ZlVG8iLGRhdGE6W2UsdF19KTp0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJsaW5lVG8iLGRhdGE6W2UsdF19KSx0aGlzLnN1YnBhdGgucHVzaChbZSx0XSl9LFRwLnByb3RvdHlwZS5xdWFkcmF0aWNDdXJ2ZVRvPWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6InF1YWRyYXRpY0N1cnZlVG8iLGRhdGE6W2UsdCxuLHJdfSksdGhpcy5zdWJwYXRoLnB1c2goW24scl0pfSxUcC5wcm90b3R5cGUuYmV6aWVyQ3VydmVUbz1mdW5jdGlvbihlLHQsbixyLGksbyl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYmV6aWVyQ3VydmVUbyIsZGF0YTpbZSx0LG4scixpLG9dfSksdGhpcy5zdWJwYXRoLnB1c2goW2ksb10pfSxUcC5wcm90b3R5cGUuYXJjPWZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt2b2lkIDA9PT1vJiYobz0hMSksdGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYXJjIixkYXRhOltlLHQsbixyLGksb119KSx0aGlzLnN1YnBhdGgucHVzaChbZSx0XSl9LFRwLnByb3RvdHlwZS5yZWN0PWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6InJlY3QiLGRhdGE6W2UsdCxuLHJdfSksdGhpcy5zdWJwYXRoPVtbZSx0XV19LFRwLnByb3RvdHlwZS5hcmNUbz1mdW5jdGlvbihlLHQsbixyLGkpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImFyY1RvIixkYXRhOltlLHQsbixyLGldfSksdGhpcy5zdWJwYXRoLnB1c2goW24scl0pfSxUcC5wcm90b3R5cGUuY2xpcD1mdW5jdGlvbigpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ImNsaXAiLGRhdGE6W10uY29uY2F0KHRoaXMucGF0aCl9KX0sVHAucHJvdG90eXBlLmNsb3NlUGF0aD1mdW5jdGlvbigpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImNsb3NlUGF0aCIsZGF0YTpbXX0pLHRoaXMuc3VicGF0aC5sZW5ndGgmJih0aGlzLnN1YnBhdGg9W3RoaXMuc3VicGF0aC5zaGlmdCgpXSl9LFRwLnByb3RvdHlwZS5jbGVhckFjdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXX0sVHAucHJvdG90eXBlLmdldEFjdGlvbnM9ZnVuY3Rpb24oKXt2YXIgZT1bXS5jb25jYXQodGhpcy5hY3Rpb25zKTtyZXR1cm4gdGhpcy5jbGVhckFjdGlvbnMoKSxlfSxPcC5saW5lRGFzaE9mZnNldC5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TGluZURhc2hPZmZzZXQiLGRhdGE6W2VdfSl9LE9wLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbi5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIixkYXRhOltlXX0pfSxPcC5zaGFkb3dCbHVyLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRTaGFkb3dCbHVyIixkYXRhOltlXX0pfSxPcC5zaGFkb3dDb2xvci5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93Q29sb3IiLGRhdGE6W2VdfSl9LE9wLnNoYWRvd09mZnNldFguc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd09mZnNldFgiLGRhdGE6W2VdfSl9LE9wLnNoYWRvd09mZnNldFkuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd09mZnNldFkiLGRhdGE6W2VdfSl9LE9wLmZvbnQuc2V0PWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMsdD0odGhpcy5zdGF0ZS5mb250PWUpLm1hdGNoKC9eKChbXHdcLV0rXHMpKikoXGQrcj9weCkoXC8oXGQrXC4/XGQqKHI/cHgpPykpP1xzKyguKikvKTtpZih0KXt2YXIgcj10WzFdLnRyaW0oKS5zcGxpdCgvXHMvKSxpPXBhcnNlRmxvYXQodFszXSksbz10WzddLGE9W107ci5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7LTE8WyJpdGFsaWMiLCJvYmxpcXVlIiwibm9ybWFsIl0uaW5kZXhPZihlKT8oYS5wdXNoKHttZXRob2Q6InNldEZvbnRTdHlsZSIsZGF0YTpbZV19KSxuLnN0YXRlLmZvbnRTdHlsZT1lKTotMTxbImJvbGQiLCJub3JtYWwiXS5pbmRleE9mKGUpPyhhLnB1c2goe21ldGhvZDoic2V0Rm9udFdlaWdodCIsZGF0YTpbZV19KSxuLnN0YXRlLmZvbnRXZWlnaHQ9ZSk6MD09PXQ/KGEucHVzaCh7bWV0aG9kOiJzZXRGb250U3R5bGUiLGRhdGE6WyJub3JtYWwiXX0pLG4uc3RhdGUuZm9udFN0eWxlPSJub3JtYWwiKToxPT09dCYmcygpfSksMT09PXIubGVuZ3RoJiZzKCkscj1hLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5kYXRhWzBdfSkuam9pbigiICIpLHRoaXMuc3RhdGUuZm9udFNpemU9aSx0aGlzLnN0YXRlLmZvbnRGYW1pbHk9byx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRGb250IixkYXRhOltyKyIgIitpKyJweCAiK29dfSl9ZWxzZSBjb25zb2xlLndhcm4oIkZhaWxlZCB0byBzZXQgJ2ZvbnQnIG9uICdDYW52YXNDb250ZXh0JzogaW52YWxpZCBmb3JtYXQuIik7ZnVuY3Rpb24gcygpe2EucHVzaCh7bWV0aG9kOiJzZXRGb250V2VpZ2h0IixkYXRhOlsibm9ybWFsIl19KSxuLnN0YXRlLmZvbnRXZWlnaHQ9Im5vcm1hbCJ9fSxPcC5mb250LmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlLmZvbnR9LE9wLmZpbGxTdHlsZS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRGaWxsU3R5bGUoZSl9LE9wLnN0cm9rZVN0eWxlLnNldD1mdW5jdGlvbihlKXt0aGlzLnNldFN0cm9rZVN0eWxlKGUpfSxPcC5nbG9iYWxBbHBoYS5zZXQ9ZnVuY3Rpb24oZSl7ZT1NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KGUpKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRHbG9iYWxBbHBoYSIsZGF0YTpbZV19KX0sT3AudGV4dEFsaWduLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRUZXh0QWxpZ24iLGRhdGE6W2VdfSl9LE9wLmxpbmVDYXAuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVDYXAiLGRhdGE6W2VdfSl9LE9wLmxpbmVKb2luLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lSm9pbiIsZGF0YTpbZV19KX0sT3AubGluZVdpZHRoLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lV2lkdGgiLGRhdGE6W2VdfSl9LE9wLm1pdGVyTGltaXQuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldE1pdGVyTGltaXQiLGRhdGE6W2VdfSl9LE9wLnRleHRCYXNlbGluZS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0VGV4dEJhc2VsaW5lIixkYXRhOltlXX0pfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhUcC5wcm90b3R5cGUsT3ApLFsic2NhbGUiLCJyb3RhdGUiLCJ0cmFuc2xhdGUiLCJzZXRUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iXS5jb25jYXQoWyJkcmF3SW1hZ2UiLCJmaWxsVGV4dCIsImZpbGwiLCJzdHJva2UiLCJmaWxsUmVjdCIsInN0cm9rZVJlY3QiLCJjbGVhclJlY3QiLCJzdHJva2VUZXh0Il0pLmZvckVhY2goZnVuY3Rpb24oZSl7VHAucHJvdG90eXBlW2VdPWZ1bmN0aW9uKGQpe3N3aXRjaChkKXtjYXNlImZpbGwiOmNhc2Uic3Ryb2tlIjpyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmQrIlBhdGgiLGRhdGE6W10uY29uY2F0KHRoaXMucGF0aCl9KX07Y2FzZSJmaWxsUmVjdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ImZpbGxQYXRoIixkYXRhOlt7bWV0aG9kOiJyZWN0IixkYXRhOltlLHQsbixyXX1dfSl9O2Nhc2Uic3Ryb2tlUmVjdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InN0cm9rZVBhdGgiLGRhdGE6W3ttZXRob2Q6InJlY3QiLGRhdGE6W2UsdCxuLHJdfV19KX07Y2FzZSJmaWxsVGV4dCI6Y2FzZSJzdHJva2VUZXh0IjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9W2UudG9TdHJpbmcoKSx0LG5dOyJudW1iZXIiPT10eXBlb2YgciYmaS5wdXNoKHIpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ZCxkYXRhOml9KX07Y2FzZSJkcmF3SW1hZ2UiOnJldHVybiBmdW5jdGlvbihlLHQsbixyLGksbyxhLHMsYyl7dmFyIHU7ZnVuY3Rpb24gbChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV9dm9pZCAwPT09YyYmKG89dCxhPW4scz1yLGM9aSxpPXI9bj10PXZvaWQgMCksdT1sKHQpJiZsKG4pJiZsKHIpJiZsKGkpP1tlLG8sYSxzLGMsdCxuLHIsaV06bChzKSYmbChjKT9bZSxvLGEscyxjXTpbZSxvLGFdLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ZCxkYXRhOnV9KX07ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpkLGRhdGE6ZX0pfX19KGUpfSksWyJzZXRGaWxsU3R5bGUiLCJzZXRUZXh0QWxpZ24iLCJzZXRTdHJva2VTdHlsZSIsInNldEdsb2JhbEFscGhhIiwic2V0U2hhZG93Iiwic2V0Rm9udFNpemUiLCJzZXRMaW5lQ2FwIiwic2V0TGluZUpvaW4iLCJzZXRMaW5lV2lkdGgiLCJzZXRNaXRlckxpbWl0Iiwic2V0VGV4dEJhc2VsaW5lIiwic2V0TGluZURhc2giXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1RwLnByb3RvdHlwZVtlXT1mdW5jdGlvbihpKXtzd2l0Y2goaSl7Y2FzZSJzZXRGaWxsU3R5bGUiOmNhc2Uic2V0U3Ryb2tlU3R5bGUiOnJldHVybiBmdW5jdGlvbihlKXsib2JqZWN0IiE9dHlwZW9mIGU/dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6WyJub3JtYWwiLGtwKGUpXX0pOnRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6aSxkYXRhOltlLnR5cGUsZS5kYXRhLGUuY29sb3JTdG9wXX0pfTtjYXNlInNldEdsb2JhbEFscGhhIjpyZXR1cm4gZnVuY3Rpb24oZSl7ZT1NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KGUpKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTpbZV19KX07Y2FzZSJzZXRTaGFkb3ciOnJldHVybiBmdW5jdGlvbihlLHQsbixyKXtyPWtwKHIpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6aSxkYXRhOltlLHQsbixyXX0pLHRoaXMuc3RhdGUuc2hhZG93Qmx1cj1uLHRoaXMuc3RhdGUuc2hhZG93Q29sb3I9cix0aGlzLnN0YXRlLnNoYWRvd09mZnNldFg9ZSx0aGlzLnN0YXRlLnNoYWRvd09mZnNldFk9dH07Y2FzZSJzZXRMaW5lRGFzaCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7ZT1lfHxbMCwwXSx0PXR8fDAsdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6W2UsdF19KSx0aGlzLnN0YXRlLmxpbmVEYXNoPWV9O2Nhc2Uic2V0Rm9udFNpemUiOnJldHVybiBmdW5jdGlvbihlKXt0aGlzLnN0YXRlLmZvbnQ9dGhpcy5zdGF0ZS5mb250LnJlcGxhY2UoL1xkK1wuP1xkKnB4LyxlKyJweCIpLHRoaXMuc3RhdGUuZm9udFNpemU9ZSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTpbZV19KX07ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6ZX0pfX19KGUpfSk7dmFyIEFwPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLENhbnZhc0NvbnRleHQ6VHAsY3JlYXRlQ2FudmFzQ29udGV4dDpmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuIG5ldyBUcChlLHQuJHBhZ2UuaWQpO3ZhciBuPUVsKCk7aWYobilyZXR1cm4gbmV3IFRwKGUsbik7ZmcuZW1pdCgib25FcnJvciIsImNyZWF0ZUNhbnZhc0NvbnRleHQ6ZmFpbCIpfSxjYW52YXNHZXRJbWFnZURhdGE6ZnVuY3Rpb24oZSxuKXt2YXIgdD1lLmNhbnZhc0lkLHI9ZS54LGk9ZS55LG89ZS53aWR0aCxhPWUuaGVpZ2h0LHM9RWwoKTtzP2JwKHQscywiZ2V0SW1hZ2VEYXRhIix7eDpyLHk6aSx3aWR0aDpvLGhlaWdodDphLGNhbGxiYWNrSWQ6X3AucHVzaChmdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7dCYmdC5sZW5ndGgmJihlLmNvbXByZXNzZWQmJih0PXlwLmluZmxhdGVSYXcodCksZGVsZXRlIGUuY29tcHJlc3NlZCksZS5kYXRhPW5ldyBVaW50OENsYW1wZWRBcnJheSh0KSksaGkobixlKX0pfSk6aGkobix7ZXJyTXNnOiJjYW52YXNHZXRJbWFnZURhdGE6ZmFpbCJ9KX0sY2FudmFzUHV0SW1hZ2VEYXRhOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jYW52YXNJZCxyPWUuZGF0YSxpPWUueCxvPWUueSxhPWUud2lkdGgscz1lLmhlaWdodCxjPUVsKCk7aWYoYyl7dmFyIHUsbD1fcC5wdXNoKGZ1bmN0aW9uKGUpe2hpKHQsZSl9KTsiaU9TIiE9PWRnLm9zLm5hbWV8fCJib29sZWFuIj09dHlwZW9mIF9fV0VFWF9ERVZUT09MX18/KHI9eXAuZGVmbGF0ZVJhdyhyLHt0bzoic3RyaW5nIn0pLHU9ITApOnI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwociksYnAobixjLCJwdXRJbWFnZURhdGEiLHtkYXRhOnIseDppLHk6byx3aWR0aDphLGhlaWdodDpzLGNvbXByZXNzZWQ6dSxjYWxsYmFja0lkOmx9KX1lbHNlIGhpKHQse2Vyck1zZzoiY2FudmFzUHV0SW1hZ2VEYXRhOmZhaWwifSl9LGNhbnZhc1RvVGVtcEZpbGVQYXRoOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS54O3ZvaWQgMD09PW4mJihuPTApO3ZhciByPWUueTt2b2lkIDA9PT1yJiYocj0wKTt2YXIgaT1lLndpZHRoLG89ZS5oZWlnaHQsYT1lLmRlc3RXaWR0aCxzPWUuZGVzdEhlaWdodCxjPWUuY2FudmFzSWQsdT1lLmZpbGVUeXBlLGw9ZS5xdWFsaXR5LGQ9RWwoKTtpZihkKXt2YXIgZj1fcC5wdXNoKGZ1bmN0aW9uKGUpe2hpKHQsZSl9KTticChjLGQsInRvVGVtcEZpbGVQYXRoIix7eDpuLHk6cix3aWR0aDppLGhlaWdodDpvLGRlc3RXaWR0aDphLGRlc3RIZWlnaHQ6cyxmaWxlVHlwZTp1LHF1YWxpdHk6bCxkaXJuYW1lOmJvKyIvY2FudmFzIixjYWxsYmFja0lkOmZ9KX1lbHNlIGhpKHQse2Vyck1zZzoiY2FudmFzVG9UZW1wRmlsZVBhdGg6ZmFpbCJ9KX19KTtmdW5jdGlvbiBFcChlLHQsbixyKXtUbCgib3BlcmF0ZU1hcFBsYXllciIsZSx0LG4scil9Zmcuc3Vic2NyaWJlKCJvbk1hcE1ldGhvZENhbGxiYWNrIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7ai5pbnZva2UodCxuKX0pO3ZhciBJcD1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VWbT10fTtJcC5wcm90b3R5cGUub249ZnVuY3Rpb24oZSx0KXtFcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJvbiIse25hbWU6ZSxjYWxsYmFjazp0fSl9LElwLnByb3RvdHlwZS4kZ2V0QXBwTWFwPWZ1bmN0aW9uKCl7cmV0dXJuIGRnLm1hcHMuZ2V0TWFwQnlJZCh0aGlzLnBhZ2VWbS4kcGFnZS5pZCsiLW1hcC0iK3RoaXMuaWQpfSxbImdldENlbnRlckxvY2F0aW9uIiwibW92ZVRvTG9jYXRpb24iLCJnZXRTY2FsZSIsImdldFJlZ2lvbiIsImluY2x1ZGVQb2ludHMiLCJ0cmFuc2xhdGVNYXJrZXIiLCJhZGRDdXN0b21MYXllciIsInJlbW92ZUN1c3RvbUxheWVyIiwiYWRkR3JvdW5kT3ZlcmxheSIsInJlbW92ZUdyb3VuZE92ZXJsYXkiLCJ1cGRhdGVHcm91bmRPdmVybGF5IiwiaW5pdE1hcmtlckNsdXN0ZXIiLCJhZGRNYXJrZXJzIiwicmVtb3ZlTWFya2VycyIsIm1vdmVBbG9uZyIsInNldExvY01hcmtlckljb24iLCJvcGVuTWFwQXBwIl0uZm9yRWFjaChmdW5jdGlvbihuKXtJcC5wcm90b3R5cGVbbl09ai53YXJwKGZ1bmN0aW9uKGUsdCl7ZS5jYWxsYmFja0lkPXQsRXAodGhpcy5pZCx0aGlzLnBhZ2VWbSxuLGUpfSl9KTt2YXIgJHA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsTWFwQ29udGV4dDpJcCxjcmVhdGVNYXBDb250ZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBJcChlLHR8fEFsKCJjcmVhdGVNYXBDb250ZXh0IikpfX0pLFBwPVsuNSwuOCwxLDEuMjUsMS41LDJdO2Z1bmN0aW9uIE1wKGUsdCxuLHIpe1RsKCJvcGVyYXRlVmlkZW9QbGF5ZXIiLGUsdCxuLHIpfXZhciBqcD1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VWbT10fTtqcC5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe01wKHRoaXMuaWQsdGhpcy5wYWdlVm0sInBsYXkiKX0sanAucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7TXAodGhpcy5pZCx0aGlzLnBhZ2VWbSwicGF1c2UiKX0sanAucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXtNcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJzdG9wIil9LGpwLnByb3RvdHlwZS5zZWVrPWZ1bmN0aW9uKGUpe01wKHRoaXMuaWQsdGhpcy5wYWdlVm0sInNlZWsiLHtwb3NpdGlvbjplfSl9LGpwLnByb3RvdHlwZS5zZW5kRGFubXU9ZnVuY3Rpb24oZSl7TXAodGhpcy5pZCx0aGlzLnBhZ2VWbSwic2VuZERhbm11IixlKX0sanAucHJvdG90eXBlLnBsYXliYWNrUmF0ZT1mdW5jdGlvbihlKXt+UHAuaW5kZXhPZihlKXx8KGU9MSksTXAodGhpcy5pZCx0aGlzLnBhZ2VWbSwicGxheWJhY2tSYXRlIix7cmF0ZTplfSl9LGpwLnByb3RvdHlwZS5yZXF1ZXN0RnVsbFNjcmVlbj1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSksTXAodGhpcy5pZCx0aGlzLnBhZ2VWbSwicmVxdWVzdEZ1bGxTY3JlZW4iLGUpfSxqcC5wcm90b3R5cGUuZXhpdEZ1bGxTY3JlZW49ZnVuY3Rpb24oKXtNcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJleGl0RnVsbFNjcmVlbiIpfSxqcC5wcm90b3R5cGUuc2hvd1N0YXR1c0Jhcj1mdW5jdGlvbigpe01wKHRoaXMuaWQsdGhpcy5wYWdlVm0sInNob3dTdGF0dXNCYXIiKX0sanAucHJvdG90eXBlLmhpZGVTdGF0dXNCYXI9ZnVuY3Rpb24oKXtNcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJoaWRlU3RhdHVzQmFyIil9O3ZhciBMcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxWaWRlb0NvbnRleHQ6anAsY3JlYXRlVmlkZW9Db250ZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBqcChlLHR8fEFsKCJjcmVhdGVWaWRlb0NvbnRleHQiKSl9fSk7ZnVuY3Rpb24gTnAoZSx0LG4scil7ZmcucHVibGlzaEhhbmRsZXIodCsiLWVkaXRvci0iK2Use2NvbXBvbmVudElkOmUsdHlwZTpuLGRhdGE6cn0sdCl9Zmcuc3Vic2NyaWJlKCJvbkVkaXRvck1ldGhvZENhbGxiYWNrIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7ai5pbnZva2UodCxuKX0pO3ZhciBCcD1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VJZD10fTtCcC5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKGUsdCl7TnAodGhpcy5pZCx0aGlzLnBhZ2VJZCwiZm9ybWF0Iix7b3B0aW9uczp7bmFtZTplLHZhbHVlOnR9fSl9LFsiaW5zZXJ0RGl2aWRlciIsImluc2VydEltYWdlIiwiaW5zZXJ0VGV4dCIsInNldENvbnRlbnRzIiwiZ2V0Q29udGVudHMiLCJjbGVhciIsInJlbW92ZUZvcm1hdCIsInVuZG8iLCJyZWRvIiwiYmx1ciIsImdldFNlbGVjdGlvblRleHQiLCJzY3JvbGxJbnRvVmlldyJdLmZvckVhY2goZnVuY3Rpb24obil7QnAucHJvdG90eXBlW25dPWoud2FycChmdW5jdGlvbihlLHQpe05wKHRoaXMuaWQsdGhpcy5wYWdlSWQsbix7b3B0aW9uczplLGNhbGxiYWNrSWQ6dH0pfSl9KTt2YXIgRHA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsRWRpdG9yQ29udGV4dDpCcH0pLFJwPVsiY2FucGxheSIsInBsYXkiLCJwYXVzZSIsInN0b3AiLCJlbmRlZCIsInRpbWVVcGRhdGUiLCJlcnJvciIsIndhaXRpbmciLCJzZWVraW5nIiwic2Vla2VkIl0sRnA9W3tuYW1lOiJzcmMiLGNhY2hlOiEwfSx7bmFtZToic3RhcnRUaW1lIixkZWZhdWx0OjAsY2FjaGU6ITB9LHtuYW1lOiJhdXRvcGxheSIsZGVmYXVsdDohMSxjYWNoZTohMH0se25hbWU6Imxvb3AiLGRlZmF1bHQ6ITEsY2FjaGU6ITB9LHtuYW1lOiJvYmV5TXV0ZVN3aXRjaCIsZGVmYXVsdDohMCxyZWFkb25seTohMCxjYWNoZTohMH0se25hbWU6ImR1cmF0aW9uIixyZWFkb25seTohMH0se25hbWU6ImN1cnJlbnRUaW1lIixyZWFkb25seTohMH0se25hbWU6InBhdXNlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJidWZmZXJlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJ2b2x1bWUifSx7bmFtZToic2Vzc2lvbkNhdGVnb3J5In0se25hbWU6InBsYXliYWNrUmF0ZSIsY2FjaGU6ITB9XSxVcD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMuaWQ9ZSx0aGlzLl9jYWxsYmFja3M9e30sdGhpcy5fb3B0aW9ucz17fSxScC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuX2NhbGxiYWNrc1tlLnRvTG93ZXJDYXNlKCldPVtdfSksRnAuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgcj1uLm5hbWUsZT17Z2V0OmZ1bmN0aW9uKCl7dmFyIGU9bi5jYWNoZT90aGlzLl9vcHRpb25zOlRsKCJnZXRBdWRpb1N0YXRlIix7YXVkaW9JZDp0aGlzLmlkfSksdD1yIGluIGU/ZVtyXTpuLmRlZmF1bHQ7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiYidm9sdW1lIiE9PXI/dC8xZTM6dH19O24ucmVhZG9ubHl8fChlLnNldD1mdW5jdGlvbihlKXt0aGlzLl9vcHRpb25zW3JdPWUsVGwoInNldEF1ZGlvU3RhdGUiLE9iamVjdC5hc3NpZ24oe30sdGhpcy5fb3B0aW9ucyx7YXVkaW9JZDp0aGlzLmlkfSkpfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQscixlKX0pfTtmdW5jdGlvbiB6cChlLHQsbixyKXtlLl9jYWxsYmFja3NbdF0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSgiZXJyb3IiPT09dD97ZXJyTXNnOm4sZXJyQ29kZTpyfTp7fSl9KX1VcC5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuX29wZXJhdGUoInBsYXkiKX0sVXAucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5fb3BlcmF0ZSgicGF1c2UiKX0sVXAucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXt0aGlzLl9vcGVyYXRlKCJzdG9wIil9LFVwLnByb3RvdHlwZS5zZWVrPWZ1bmN0aW9uKGUpe3RoaXMuX29wZXJhdGUoInNlZWsiLHtjdXJyZW50VGltZToxZTMqZX0pfSxVcC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2dnKHRoaXMuX190aW1pbmcpLFRsKCJkZXN0cm95QXVkaW9JbnN0YW5jZSIse2F1ZGlvSWQ6dGhpcy5pZH0pLGRlbGV0ZSBWcFt0aGlzLmlkXX0sVXAucHJvdG90eXBlLl9vcGVyYXRlPWZ1bmN0aW9uKGUsdCl7VGwoIm9wZXJhdGVBdWRpbyIsT2JqZWN0LmFzc2lnbih7fSx0LHthdWRpb0lkOnRoaXMuaWQsb3BlcmF0aW9uVHlwZTplfSkpfSxScC5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBlPXJbMF0udG9VcHBlckNhc2UoKStyLnN1YnN0cigxKTtyPXIudG9Mb3dlckNhc2UoKSxVcC5wcm90b3R5cGVbIm9uIitlXT1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3Nbcl0ucHVzaChlKX0sVXAucHJvdG90eXBlWyJvZmYiK2VdPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2NhbGxiYWNrc1tyXSxuPXQuaW5kZXhPZihlKTswPD1uJiZ0LnNwbGljZShuLDEpfX0pLE9sKCJvbkF1ZGlvU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhdGUsbj1lLmF1ZGlvSWQscj1lLmVyck1zZyxpPWUuZXJyQ29kZSxvPVZwW25dO2lmKG8paWYoenAobyx0LHIsaSksInBsYXkiPT09dCl7dmFyIGE9by5jdXJyZW50VGltZTt6cChvLCJ0aW1ldXBkYXRlIiksby5fX3RpbWluZz12ZyhmdW5jdGlvbigpe28uY3VycmVudFRpbWUhPT1hJiZ6cChvLCJ0aW1ldXBkYXRlIil9LDIwMCl9ZWxzZSJwYXVzZSIhPT10JiYic3RvcCIhPT10JiYiZXJyb3IiIT09dHx8Z2coby5fX3RpbWluZyl9KTt2YXIgVnA9T2JqZWN0LmNyZWF0ZShudWxsKTt2YXIgcXA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQ6ZnVuY3Rpb24oKXt2YXIgZT1UbCgiY3JlYXRlQXVkaW9JbnN0YW5jZSIpLmF1ZGlvSWQsdD1uZXcgVXAoZSk7cmV0dXJuIFZwW2VdPXR9fSksV3A9W107T2woIm9uTmV0d29ya1N0YXR1c0NoYW5nZSIsZnVuY3Rpb24odCl7V3AuZm9yRWFjaChmdW5jdGlvbihlKXtoaShlLHQpfSl9KTt2YXIgSHA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsb25OZXR3b3JrU3RhdHVzQ2hhbmdlOmZ1bmN0aW9uKGUpe1dwLnB1c2goZSl9LG9mZk5ldHdvcmtTdGF0dXNDaGFuZ2U6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9V3AuaW5kZXhPZihlKTswPD10JiZXcC5zcGxpY2UodCwxKX19fSksR3A9W10sSnA9W107T2woaXQsZnVuY3Rpb24odCl7R3AuZm9yRWFjaChmdW5jdGlvbihlKXtoaShlLHQpfSl9KSxPbCgib25VSVN0eWxlQ2hhbmdlIixmdW5jdGlvbih0KXtKcC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2hpKGUsdCl9KX0pO3ZhciBYcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvblRoZW1lQ2hhbmdlOmZ1bmN0aW9uKGUpe0dwLnB1c2goZSl9LG9mZlRoZW1lQ2hhbmdlOmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PUdwLmluZGV4T2YoZSk7MDw9dCYmR3Auc3BsaWNlKHQsMSl9fSxvblVJU3R5bGVDaGFuZ2U6ZnVuY3Rpb24oZSl7SnAucHVzaChlKSxjb25zb2xlLndhcm4oJ1RoZSAidW5pLm9uVUlTdHlsZUNoYW5nZSIgQVBJIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgInVuaS5vblRoZW1lQ2hhbmdlIi4gTGVhcm4gbW9yZTogaHR0cHM6Ly91bmlhcHAuZGNsb3VkLm5ldC5jbi9hcGkvc3lzdGVtL3RoZW1lLicpfX0pLFlwPXRsKCJnZXRTZWxlY3RlZFRleHRSYW5nZUV2ZW50Iik7Zmcuc3Vic2NyaWJlKCJvbkdldFNlbGVjdGVkVGV4dFJhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7Y29uc29sZS5sb2coIm9uR2V0U2VsZWN0ZWRUZXh0UmFuZ2UiKTt2YXIgcj1ZcC5wb3AodCk7ciYmcihuKX0pO3ZhciBLcCxacD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRTZWxlY3RlZFRleHRSYW5nZTpmdW5jdGlvbihlLHQpe3ZhciBuPUVsKCk7ZmcucHVibGlzaEhhbmRsZXIoImdldFNlbGVjdGVkVGV4dFJhbmdlIix7cGFnZUlkOm4sY2FsbGJhY2tJZDpZcC5wdXNoKGZ1bmN0aW9uKGUpe2hpKHQsZSl9KX0sbil9fSk7T2woIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLGZ1bmN0aW9uKGUpe0twJiZoaShLcCxlKX0pO3ZhciBRcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvbktleWJvYXJkSGVpZ2h0Q2hhbmdlOmZ1bmN0aW9uKGUpe3ZhciB0O3Q9S3AsZmcucmVtb3ZlQ2FsbGJhY2tIYW5kbGVyKHQpLEtwPWV9LG9mZktleWJvYXJkSGVpZ2h0Q2hhbmdlOmZ1bmN0aW9uKCl7S3A9bnVsbH19KSxlaD0ibG9uZ1ByZXNzQWN0aW9uc0NhbGxiYWNrIix0aD17fTtPbChlaCxmdW5jdGlvbihlKXt2YXIgdD1lLmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KHQpP3RoLmZhaWwmJnRoLmZhaWwoZSk6dGguc3VjY2VzcyYmdGguc3VjY2VzcyhlKSx0aC5jb21wbGV0ZSYmdGguY29tcGxldGUoZSl9KTt2YXIgbmgscmg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscHJldmlld0ltYWdlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksKCh0aD1lLmxvbmdQcmVzc0FjdGlvbnN8fHt9KS5zdWNjZXNzfHx0aC5mYWlsfHx0aC5jb21wbGV0ZSkmJih0aC5jYWxsYmFja0lkPWVoKSxUbCgicHJldmlld0ltYWdlUGx1cyIsZSl9LGNsb3NlUHJldmlld0ltYWdlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksVGwoImNsb3NlUHJldmlld0ltYWdlUGx1cyIsZSl9fSksaWg9e3BhdXNlOm51bGwscmVzdW1lOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGwsZXJyb3I6bnVsbH0sb2g9ZnVuY3Rpb24oKXtPbCgib25SZWNvcmRlclN0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnN0YXRlO2RlbGV0ZSBlLnN0YXRlLGRlbGV0ZSBlLmVyck1zZywiZnVuY3Rpb24iPT10eXBlb2YgaWhbdF0mJmloW3RdKGUpfSl9O29oLnByb3RvdHlwZS5vbkVycm9yPWZ1bmN0aW9uKGUpe2loLmVycm9yPWV9LG9oLnByb3RvdHlwZS5vbkZyYW1lUmVjb3JkZWQ9ZnVuY3Rpb24oZSl7fSxvaC5wcm90b3R5cGUub25JbnRlcnJ1cHRpb25CZWdpbj1mdW5jdGlvbihlKXt9LG9oLnByb3RvdHlwZS5vbkludGVycnVwdGlvbkVuZD1mdW5jdGlvbihlKXt9LG9oLnByb3RvdHlwZS5vblBhdXNlPWZ1bmN0aW9uKGUpe2loLnBhdXNlPWV9LG9oLnByb3RvdHlwZS5vblJlc3VtZT1mdW5jdGlvbihlKXtpaC5yZXN1bWU9ZX0sb2gucHJvdG90eXBlLm9uU3RhcnQ9ZnVuY3Rpb24oZSl7aWguc3RhcnQ9ZX0sb2gucHJvdG90eXBlLm9uU3RvcD1mdW5jdGlvbihlKXtpaC5zdG9wPWV9LG9oLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe1RsKCJvcGVyYXRlUmVjb3JkZXIiLHtvcGVyYXRpb25UeXBlOiJwYXVzZSJ9KX0sb2gucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe1RsKCJvcGVyYXRlUmVjb3JkZXIiLHtvcGVyYXRpb25UeXBlOiJyZXN1bWUifSl9LG9oLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihlKXtUbCgib3BlcmF0ZVJlY29yZGVyIixPYmplY3QuYXNzaWduKHt9LGUse29wZXJhdGlvblR5cGU6InN0YXJ0In0pKX0sb2gucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXtUbCgib3BlcmF0ZVJlY29yZGVyIix7b3BlcmF0aW9uVHlwZToic3RvcCJ9KX07dmFyIGFoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFJlY29yZGVyTWFuYWdlcjpmdW5jdGlvbigpe3JldHVybiBuaHx8KG5oPW5ldyBvaCl9fSksc2g9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tJZD10LHRoaXMuX2NhbGxiYWNrcz1bXX07c2gucHJvdG90eXBlLmFib3J0PWZ1bmN0aW9uKCl7VGwoIm9wZXJhdGVEb3dubG9hZFRhc2siLHtkb3dubG9hZFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSxzaC5wcm90b3R5cGUub25Qcm9ncmVzc1VwZGF0ZT1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmdGhpcy5fY2FsbGJhY2tzLnB1c2goZSl9LHNoLnByb3RvdHlwZS5vbkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe30sc2gucHJvdG90eXBlLm9mZlByb2dyZXNzVXBkYXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2NhbGxiYWNrcy5pbmRleE9mKGUpOzA8PXQmJnRoaXMuX2NhbGxiYWNrcy5zcGxpY2UodCwxKX0sc2gucHJvdG90eXBlLm9mZkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe307dmFyIGNoPU9iamVjdC5jcmVhdGUobnVsbCk7T2woIm9uRG93bmxvYWRUYXNrU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuZG93bmxvYWRUYXNrSWQsbj1lLnN0YXRlLHI9ZS50ZW1wRmlsZVBhdGgsaT1lLnN0YXR1c0NvZGUsbz1lLnByb2dyZXNzLGE9ZS50b3RhbEJ5dGVzV3JpdHRlbixzPWUudG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZSxjPWUuZXJyTXNnLHU9Y2hbdF0sbD11Ll9jYWxsYmFja0lkO3N3aXRjaChuKXtjYXNlInByb2dyZXNzVXBkYXRlIjp1Ll9jYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihlKXtlKHtwcm9ncmVzczpvLHRvdGFsQnl0ZXNXcml0dGVuOmEsdG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZTpzfSl9KTticmVhaztjYXNlInN1Y2Nlc3MiOmhpKGwse3RlbXBGaWxlUGF0aDpyLHN0YXR1c0NvZGU6aSxlcnJNc2c6InJlcXVlc3Q6b2sifSk7Y2FzZSJmYWlsIjpoaShsLHtlcnJNc2c6InJlcXVlc3Q6ZmFpbCAiK2N9KTtkZWZhdWx0OnBnKGZ1bmN0aW9uKCl7ZGVsZXRlIGNoW3RdfSwxMDApfX0pO3ZhciB1aD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkb3dubG9hZEZpbGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1UbCgiY3JlYXRlRG93bmxvYWRUYXNrIixlKS5kb3dubG9hZFRhc2tJZCxyPW5ldyBzaChuLHQpO3JldHVybiBjaFtuXT1yfX0pLGxoPU9iamVjdC5jcmVhdGUobnVsbCk7T2woIm9uUmVxdWVzdFRhc2tTdGF0ZUNoYW5nZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0VGFza0lkLG49ZS5zdGF0ZSxyPWUuZGF0YSxpPWUuc3RhdHVzQ29kZSxvPWUuaGVhZGVyLGE9ZS5lcnJNc2cscz1lLmNvb2tpZXMsYz1saFt0XXx8e30sdT1jLmFyZ3MsbD1jLmNhbGxiYWNrSWQ7aWYobClzd2l0Y2goZGVsZXRlIGxoW3RdLG4pe2Nhc2Uic3VjY2VzcyI6aGkobCxmdW5jdGlvbihyLGUpe2lmKCJzdHJpbmciPT10eXBlb2Ygci5kYXRhJiY2NTI3OT09PXIuZGF0YS5jaGFyQ29kZUF0KDApJiYoci5kYXRhPXIuZGF0YS5zdWJzdHIoMSkpLHIuc3RhdHVzQ29kZT1wYXJzZUludChyLnN0YXR1c0NvZGUsMTApLFQoci5oZWFkZXIpJiYoci5oZWFkZXI9T2JqZWN0LmtleXMoci5oZWFkZXIpLnJlZHVjZShmdW5jdGlvbihlLHQpe3ZhciBuPXIuaGVhZGVyW3RdO3JldHVybiBBcnJheS5pc0FycmF5KG4pP2VbdF09bi5qb2luKCIsIik6InN0cmluZyI9PXR5cGVvZiBuJiYoZVt0XT1uKSxlfSx7fSkpLGUuZGF0YVR5cGUmJiJqc29uIj09PWUuZGF0YVR5cGUudG9Mb3dlckNhc2UoKSl0cnl7ci5kYXRhPUpTT04ucGFyc2Uoci5kYXRhKX1jYXRjaChlKXt9cmV0dXJuIHJ9KHtkYXRhOnIsc3RhdHVzQ29kZTppLGhlYWRlcjpvLGVyck1zZzoicmVxdWVzdDpvayIsY29va2llczpzfSx1KSk7YnJlYWs7Y2FzZSJmYWlsIjpoaShsLHtlcnJNc2c6InJlcXVlc3Q6ZmFpbCAiK2F9KX19KTt2YXIgZGg9ZnVuY3Rpb24oZSl7dGhpcy5pZD1lfTtkaC5wcm90b3R5cGUuYWJvcnQ9ZnVuY3Rpb24oKXtUbCgib3BlcmF0ZVJlcXVlc3RUYXNrIix7cmVxdWVzdFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSxkaC5wcm90b3R5cGUub2ZmSGVhZGVyc1JlY2VpdmVkPWZ1bmN0aW9uKCl7fSxkaC5wcm90b3R5cGUub25IZWFkZXJzUmVjZWl2ZWQ9ZnVuY3Rpb24oKXt9O3ZhciBmaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxyZXF1ZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG47Zm9yKHZhciByIGluIGUuaGVhZGVyKWlmKCJjb250ZW50LXR5cGUiPT09ci50b0xvd2VyQ2FzZSgpKXtuPWUuaGVhZGVyW3JdO2JyZWFrfSJHRVQiIT09ZS5tZXRob2QmJjA9PT1uLmluZGV4T2YoImFwcGxpY2F0aW9uL2pzb24iKSYmVChlLmRhdGEpJiYoZS5kYXRhPUpTT04uc3RyaW5naWZ5KGUuZGF0YSkpO3ZhciBpPVRsKCJjcmVhdGVSZXF1ZXN0VGFzayIsZSkucmVxdWVzdFRhc2tJZDtyZXR1cm4gbGhbaV09e2FyZ3M6ZSxjYWxsYmFja0lkOnR9LG5ldyBkaChpKX19KSxwaD1mdW5jdGlvbihlKXt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tzPXtvcGVuOltdLGNsb3NlOltdLGVycm9yOltdLG1lc3NhZ2U6W119LHRoaXMuQ0xPU0VEPTMsdGhpcy5DTE9TSU5HPTIsdGhpcy5DT05ORUNUSU5HPTAsdGhpcy5PUEVOPTEsdGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0VEfTtwaC5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLnJlYWR5U3RhdGUhPT10aGlzLk9QRU4mJnRoaXMuX2NhbGxiYWNrKGUsInNlbmRTb2NrZXRNZXNzYWdlOmZhaWwgV2ViU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiKTt2YXIgdD1UbCgib3BlcmF0ZVNvY2tldFRhc2siLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToic2VuZCIsc29ja2V0VGFza0lkOnRoaXMuaWR9KSkuZXJyTXNnO3RoaXMuX2NhbGxiYWNrKGUsdC5yZXBsYWNlKCJvcGVyYXRlU29ja2V0VGFzayIsInNlbmRTb2NrZXRNZXNzYWdlIikpfSxwaC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oZSl7dGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0lORzt2YXIgdD1UbCgib3BlcmF0ZVNvY2tldFRhc2siLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToiY2xvc2UiLHNvY2tldFRhc2tJZDp0aGlzLmlkfSkpLmVyck1zZzt0aGlzLl9jYWxsYmFjayhlLHQucmVwbGFjZSgib3BlcmF0ZVNvY2tldFRhc2siLCJjbG9zZVNvY2tldCIpKX0scGgucHJvdG90eXBlLm9uT3Blbj1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3Mub3Blbi5wdXNoKGUpfSxwaC5wcm90b3R5cGUub25DbG9zZT1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3MuY2xvc2UucHVzaChlKX0scGgucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzLmVycm9yLnB1c2goZSl9LHBoLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzLm1lc3NhZ2UucHVzaChlKX0scGgucHJvdG90eXBlLl9jYWxsYmFjaz1mdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLnN1Y2Nlc3Mscj1lLmZhaWwsaT1lLmNvbXBsZXRlLG89e2Vyck1zZzp0fTsvOm9rJC8udGVzdCh0KT8iZnVuY3Rpb24iPT10eXBlb2YgbiYmbihvKToiZnVuY3Rpb24iPT10eXBlb2YgciYmcihvKSwiZnVuY3Rpb24iPT10eXBlb2YgaSYmaShvKX07dmFyIGhoPU9iamVjdC5jcmVhdGUobnVsbCksdmg9W10sZ2g9T2JqZWN0LmNyZWF0ZShudWxsKTtPbCgib25Tb2NrZXRUYXNrU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc29ja2V0VGFza0lkLG49ZS5zdGF0ZSxyPWUuZGF0YSxpPWUuY29kZSxvPWUucmVhc29uLGE9KGUuZXJyTXNnLGhoW3RdKTtpZihhKXt2YXIgcz0ibWVzc2FnZSI9PT1uP3tkYXRhOnJ9OiJjbG9zZSI9PT1uP3tjb2RlOmkscmVhc29uOm99Ont9O2lmKCJvcGVuIj09PW4mJihhLnJlYWR5U3RhdGU9YS5PUEVOKSxhPT09dmhbMF0mJmdoW25dJiZoaShnaFtuXSxzKSwiZXJyb3IiPT09bnx8ImNsb3NlIj09PW4pe2EucmVhZHlTdGF0ZT1hLkNMT1NFRCxkZWxldGUgaGhbdF07dmFyIGM9dmguaW5kZXhPZihhKTswPD1jJiZ2aC5zcGxpY2UoYywxKX1hLl9jYWxsYmFja3Nbbl0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZShzKX0pfX0pO3ZhciBtaCx5aD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjb25uZWN0U29ja2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49VGwoImNyZWF0ZVNvY2tldFRhc2siLGUpLnNvY2tldFRhc2tJZCxyPW5ldyBwaChuKTtyZXR1cm4gaGhbbl09cix2aC5wdXNoKHIpLHBnKGZ1bmN0aW9uKCl7aGkodCx7ZXJyTXNnOiJjb25uZWN0U29ja2V0Om9rIn0pfSwwKSxyfSxzZW5kU29ja2V0TWVzc2FnZTpmdW5jdGlvbihlLHQpe3ZhciBuPXZoWzBdO2lmKG4mJm4ucmVhZHlTdGF0ZT09PW4uT1BFTilyZXR1cm4gVGwoIm9wZXJhdGVTb2NrZXRUYXNrIixPYmplY3QuYXNzaWduKHt9LGUse29wZXJhdGlvblR5cGU6InNlbmQiLHNvY2tldFRhc2tJZDpuLmlkfSkpO2hpKHQse2Vyck1zZzoic2VuZFNvY2tldE1lc3NhZ2U6ZmFpbCBXZWJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCJ9KX0sY2xvc2VTb2NrZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj12aFswXTtpZihuKXJldHVybiBuLnJlYWR5U3RhdGU9bi5DTE9TSU5HLFRsKCJvcGVyYXRlU29ja2V0VGFzayIsT2JqZWN0LmFzc2lnbih7fSxlLHtvcGVyYXRpb25UeXBlOiJjbG9zZSIsc29ja2V0VGFza0lkOm4uaWR9KSk7aGkodCx7ZXJyTXNnOiJjbG9zZVNvY2tldDpmYWlsIFdlYlNvY2tldCBpcyBub3QgY29ubmVjdGVkIn0pfSxvblNvY2tldE9wZW46ZnVuY3Rpb24oZSl7Z2gub3Blbj1lfSxvblNvY2tldEVycm9yOmZ1bmN0aW9uKGUpe2doLmVycm9yPWV9LG9uU29ja2V0TWVzc2FnZTpmdW5jdGlvbihlKXtnaC5tZXNzYWdlPWV9LG9uU29ja2V0Q2xvc2U6ZnVuY3Rpb24oZSl7Z2guY2xvc2U9ZX19KSxfaD1mdW5jdGlvbigpe307X2gucHJvdG90eXBlLm9uQ2hlY2tGb3JVcGRhdGU9ZnVuY3Rpb24oKXt9LF9oLnByb3RvdHlwZS5vblVwZGF0ZVJlYWR5PWZ1bmN0aW9uKCl7fSxfaC5wcm90b3R5cGUub25VcGRhdGVGYWlsZWQ9ZnVuY3Rpb24oKXt9LF9oLnByb3RvdHlwZS5hcHBseVVwZGF0ZT1mdW5jdGlvbigpe307dmFyIGJoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFVwZGF0ZU1hbmFnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbWh8fChtaD1uZXcgX2gpfX0pLHdoPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMuX2NhbGxiYWNrSWQ9dCx0aGlzLl9jYWxsYmFja3M9W119O3doLnByb3RvdHlwZS5hYm9ydD1mdW5jdGlvbigpe1RsKCJvcGVyYXRlVXBsb2FkVGFzayIse3VwbG9hZFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSx3aC5wcm90b3R5cGUub25Qcm9ncmVzc1VwZGF0ZT1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmdGhpcy5fY2FsbGJhY2tzLnB1c2goZSl9LHdoLnByb3RvdHlwZS5vbkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe30sd2gucHJvdG90eXBlLm9mZlByb2dyZXNzVXBkYXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2NhbGxiYWNrcy5pbmRleE9mKGUpOzA8PXQmJnRoaXMuX2NhbGxiYWNrcy5zcGxpY2UodCwxKX0sd2gucHJvdG90eXBlLm9mZkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe307dmFyIGtoPU9iamVjdC5jcmVhdGUobnVsbCk7T2woIm9uVXBsb2FkVGFza1N0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnVwbG9hZFRhc2tJZCxuPWUuc3RhdGUscj1lLmRhdGEsaT1lLnN0YXR1c0NvZGUsbz1lLnByb2dyZXNzLGE9ZS50b3RhbEJ5dGVzU2VudCxzPWUudG90YWxCeXRlc0V4cGVjdGVkVG9TZW5kLGM9ZS5lcnJNc2csdT1raFt0XSxsPXUuX2NhbGxiYWNrSWQ7c3dpdGNoKG4pe2Nhc2UicHJvZ3Jlc3NVcGRhdGUiOnUuX2NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uoe3Byb2dyZXNzOm8sdG90YWxCeXRlc1NlbnQ6YSx0b3RhbEJ5dGVzRXhwZWN0ZWRUb1NlbmQ6c30pfSk7YnJlYWs7Y2FzZSJzdWNjZXNzIjpoaShsLHtkYXRhOnIsc3RhdHVzQ29kZTppLGVyck1zZzoicmVxdWVzdDpvayJ9KTtjYXNlImZhaWwiOmhpKGwse2Vyck1zZzoicmVxdWVzdDpmYWlsICIrY30pO2RlZmF1bHQ6cGcoZnVuY3Rpb24oKXtkZWxldGUga2hbdF19LDEwMCl9fSk7dmFyIFNoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHVwbG9hZEZpbGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1UbCgiY3JlYXRlVXBsb2FkVGFzayIsZSkudXBsb2FkVGFza0lkLHI9bmV3IHdoKG4sdCk7cmV0dXJuIGtoW25dPXJ9fSk7dmFyIHhoLENoLFRoLE9oLEFoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLF9fZl9fOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTtjb25zb2xlW2VdLmFwcGx5KGNvbnNvbGUsdCl9fSk7ZnVuY3Rpb24gRWgoZSl7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKGUpe31yZXR1cm4gZX1mdW5jdGlvbiBJaCh0KXtpZigiZW5hYmxlZCI9PT10LnR5cGUpVGg9ITAsT2g9dC5vZmZsaW5lO2Vsc2UgaWYoImNsaWVudElkIj09PXQudHlwZSl4aD10LmNpZCxDaD10LmVyck1zZyxQaCh4aCx0LmVyck1zZyk7ZWxzZSBpZigicHVzaE1zZyI9PT10LnR5cGUpZm9yKHZhciBlPXt0eXBlOiJyZWNlaXZlIixkYXRhOkVoKHQubWVzc2FnZSl9LG49MDtuPE1oLmxlbmd0aDtuKyspe2lmKCgwLE1oW25dKShlKSxlLnN0b3BwZWQpYnJlYWt9ZWxzZSJjbGljayI9PT10LnR5cGUmJk1oLmZvckVhY2goZnVuY3Rpb24oZSl7ZSh7dHlwZToiY2xpY2siLGRhdGE6RWgodC5tZXNzYWdlKX0pfSl9dmFyICRoPVtdO2Z1bmN0aW9uIFBoKHQsbil7JGguZm9yRWFjaChmdW5jdGlvbihlKXtlKHQsbil9KSwkaC5sZW5ndGg9MH12YXIgTWg9W10samg9ITEsTGg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsaW52b2tlUHVzaENhbGxiYWNrOkloLGdldFB1c2hDbGllbnRJZDpmdW5jdGlvbihlKXtUKGUpfHwoZT17fSk7dmFyIHQ9Y2UoZSkscj10LnN1Y2Nlc3MsaT10LmZhaWwsbz10LmNvbXBsZXRlLGE9QyhyKSxzPUMoaSksYz1DKG8pO09oP2RnLnB1c2guZ2V0Q2xpZW50SW5mb0FzeW5jKGZ1bmN0aW9uKGUpe3ZhciB0PXtlcnJNc2c6ImdldFB1c2hDbGllbnRJZDpvayIsY2lkOmUuY2xpZW50aWR9O2EmJnIodCksYyYmbyh0KX0sZnVuY3Rpb24oZSl7ZT17ZXJyTXNnOiJnZXRQdXNoQ2xpZW50SWQ6ZmFpbCAiK2UuY29kZSsiOiAiK2UubWVzc2FnZX0scyYmaShlKSxjJiZvKGUpfSk6UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3ZvaWQgMD09PVRoJiYoVGg9ITEseGg9IiIsQ2g9InVuaVB1c2ggaXMgbm90IGVuYWJsZWQiKSwkaC5wdXNoKGZ1bmN0aW9uKGUsdCl7dmFyIG47ZT8obj17ZXJyTXNnOiJnZXRQdXNoQ2xpZW50SWQ6b2siLGNpZDplfSxhJiZyKG4pKToobj17ZXJyTXNnOiJnZXRQdXNoQ2xpZW50SWQ6ZmFpbCIrKHQ/IiAiK3Q6IiIpfSxzJiZpKG4pKSxjJiZvKG4pfSksdm9pZCAwIT09eGgmJlBoKHhoLENoKX0pfSxvblB1c2hNZXNzYWdlOmZ1bmN0aW9uKGUpey0xPT09TWguaW5kZXhPZihlKSYmTWgucHVzaChlKSxqaHx8KGpoPSEwLGRnLnB1c2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGUpe0loKHt0eXBlOiJjbGljayIsbWVzc2FnZTplfSl9KSxkZy5wdXNoLmFkZEV2ZW50TGlzdGVuZXIoInJlY2VpdmUiLGZ1bmN0aW9uKGUpe0loKHt0eXBlOiJwdXNoTXNnIixtZXNzYWdlOmV9KX0pKX0sb2ZmUHVzaE1lc3NhZ2U6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9TWguaW5kZXhPZihlKTstMTx0JiZNaC5zcGxpY2UodCwxKX1lbHNlIE1oLmxlbmd0aD0wfX0pLE5oPXtkdXJhdGlvbjo0MDAsdGltaW5nRnVuY3Rpb246ImxpbmVhciIsZGVsYXk6MCx0cmFuc2Zvcm1PcmlnaW46IjUwJSA1MCUgMCJ9LEJoPWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucz1bXSx0aGlzLmN1cnJlbnRUcmFuc2Zvcm09e30sdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXMub3B0aW9uPU9iamVjdC5hc3NpZ24oe30sTmgsZSl9O0JoLnByb3RvdHlwZS5fZ2V0T3B0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PXt0cmFuc2l0aW9uOk9iamVjdC5hc3NpZ24oe30sdGhpcy5vcHRpb24sZSl9O3JldHVybiB0LnRyYW5zZm9ybU9yaWdpbj10LnRyYW5zaXRpb24udHJhbnNmb3JtT3JpZ2luLGRlbGV0ZSB0LnRyYW5zaXRpb24udHJhbnNmb3JtT3JpZ2luLHR9LEJoLnByb3RvdHlwZS5fcHVzaEFuaW1hdGVzPWZ1bmN0aW9uKGUsdCl7dGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzLnB1c2goe3R5cGU6ZSxhcmdzOnR9KX0sQmgucHJvdG90eXBlLl9jb252ZXJUeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1tBLVpdL2csZnVuY3Rpb24oZSl7cmV0dXJuIi0iK2UudG9Mb3dlckNhc2UoKX0pfSxCaC5wcm90b3R5cGUuX2dldFZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT9lKyJweCI6ZX0sQmgucHJvdG90eXBlLmV4cG9ydD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYWN0aW9ucztyZXR1cm4gdGhpcy5hY3Rpb25zPVtdLHthY3Rpb25zOmV9fSxCaC5wcm90b3R5cGUuc3RlcD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXMuZm9yRWFjaChmdW5jdGlvbihlKXsic3R5bGUiIT09ZS50eXBlP3QuY3VycmVudFRyYW5zZm9ybVtlLnR5cGVdPWU6dC5jdXJyZW50VHJhbnNmb3JtW2UudHlwZSsiLiIrZS5hcmdzWzBdXT1lfSksdGhpcy5hY3Rpb25zLnB1c2goe2FuaW1hdGVzOk9iamVjdC52YWx1ZXModGhpcy5jdXJyZW50VHJhbnNmb3JtKSxvcHRpb246dGhpcy5fZ2V0T3B0aW9uKGUpfSksdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXN9O3ZhciBEaD1bIm9wYWNpdHkiLCJiYWNrZ3JvdW5kQ29sb3IiXSxSaD1bIndpZHRoIiwiaGVpZ2h0IiwibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIl07WyJtYXRyaXgiLCJtYXRyaXgzZCIsInJvdGF0ZSIsInJvdGF0ZTNkIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwic2NhbGUiLCJzY2FsZTNkIiwic2NhbGVYIiwic2NhbGVZIiwic2NhbGVaIiwic2tldyIsInNrZXdYIiwic2tld1kiLCJ0cmFuc2xhdGUiLCJ0cmFuc2xhdGUzZCIsInRyYW5zbGF0ZVgiLCJ0cmFuc2xhdGVZIiwidHJhbnNsYXRlWiJdLmNvbmNhdChEaCxSaCkuZm9yRWFjaChmdW5jdGlvbihuKXtCaC5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIERoLmNvbmNhdChSaCkuaW5jbHVkZXMobik/dGhpcy5fcHVzaEFuaW1hdGVzKCJzdHlsZSIsW3RoaXMuX2NvbnZlclR5cGUobiksUmguaW5jbHVkZXMobik/dGhpcy5fZ2V0VmFsdWUoZVswXSk6ZVswXV0pOnRoaXMuX3B1c2hBbmltYXRlcyhuLGUpLHRoaXN9fSk7dmFyIEZoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUFuaW1hdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEJoKGUpfX0pLFVoPXRsKCJyZXF1ZXN0Q29tcG9uZW50T2JzZXJ2ZXIiKSx6aD17dGhyZXNob2xkczpbMF0saW5pdGlhbFJhdGlvOjAsb2JzZXJ2ZUFsbDohMX0sVmg9ZnVuY3Rpb24oZSx0KXt0aGlzLnBhZ2VJZD1lLiRwYWdlJiZlLiRwYWdlLmlkLHRoaXMuY29tcG9uZW50PWUuXyRpZHx8ZSx0aGlzLm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSx6aCx0KX07VmgucHJvdG90eXBlLl9tYWtlUm9vdE1hcmdpbj1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD17fSksdGhpcy5vcHRpb25zLnJvb3RNYXJnaW49WyJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuKE51bWJlcih0W2VdKXx8MCkrInB4In0pLmpvaW4oIiAiKX0sVmgucHJvdG90eXBlLnJlbGF0aXZlVG89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vcHRpb25zLnJlbGF0aXZlVG9TZWxlY3Rvcj1lLHRoaXMuX21ha2VSb290TWFyZ2luKHQpLHRoaXN9LFZoLnByb3RvdHlwZS5yZWxhdGl2ZVRvVmlld3BvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3B0aW9ucy5yZWxhdGl2ZVRvU2VsZWN0b3I9bnVsbCx0aGlzLl9tYWtlUm9vdE1hcmdpbihlKSx0aGlzfSxWaC5wcm90b3R5cGUub2JzZXJ2ZT1mdW5jdGlvbihlLHQpeyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodGhpcy5vcHRpb25zLnNlbGVjdG9yPWUsdGhpcy5yZXFJZD1VaC5wdXNoKHQpLGZnLnB1Ymxpc2hIYW5kbGVyKCJyZXF1ZXN0Q29tcG9uZW50T2JzZXJ2ZXIiLHtyZXFJZDp0aGlzLnJlcUlkLGNvbXBvbmVudDp0aGlzLmNvbXBvbmVudCxvcHRpb25zOnRoaXMub3B0aW9uc30sKHRoaXMuY29tcG9uZW50LHRoaXMucGFnZUlkKSkpfSxWaC5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbigpe2ZnLnB1Ymxpc2hIYW5kbGVyKCJkZXN0cm95Q29tcG9uZW50T2JzZXJ2ZXIiLHtyZXFJZDp0aGlzLnJlcUlkfSwodGhpcy5jb21wb25lbnQsdGhpcy5wYWdlSWQpKX07dmFyIHFoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX2lzVnVlfHwodD1lLGU9bnVsbCksbmV3IFZoKGV8fEFsKCJjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlciIpLHQpfX0pLFdoPXRsKCJyZXF1ZXN0TWVkaWFRdWVyeU9ic2VydmVyIiksSGg9ZnVuY3Rpb24oZSx0KXt0aGlzLnBhZ2VJZD1lLiRwYWdlJiZlLiRwYWdlLmlkLHRoaXMuY29tcG9uZW50PWUuXyRpZHx8ZSx0aGlzLm9wdGlvbnM9dH07SGgucHJvdG90eXBlLm9ic2VydmU9ZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHRoaXMub3B0aW9ucz1lLHRoaXMucmVxSWQ9V2gucHVzaCh0KSxmZy5wdWJsaXNoSGFuZGxlcigicmVxdWVzdE1lZGlhUXVlcnlPYnNlcnZlciIse3JlcUlkOnRoaXMucmVxSWQsY29tcG9uZW50OnRoaXMuY29tcG9uZW50LG9wdGlvbnM6dGhpcy5vcHRpb25zfSwodGhpcy5jb21wb25lbnQsdGhpcy5wYWdlSWQpKSl9LEhoLnByb3RvdHlwZS5kaXNjb25uZWN0PWZ1bmN0aW9uKCl7ZmcucHVibGlzaEhhbmRsZXIoImRlc3Ryb3lNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLHtyZXFJZDp0aGlzLnJlcUlkfSwodGhpcy5jb21wb25lbnQsdGhpcy5wYWdlSWQpKX07dmFyIEdoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlcjpmdW5jdGlvbihlLHQpe3JldHVybiBlLl9pc1Z1ZXx8KHQ9ZSxlPW51bGwpLG5ldyBIaChlfHxBbCgiY3JlYXRlTWVkaWFRdWVyeU9ic2VydmVyIiksdCl9fSksSmg9e2NhbnZhczpUcCxtYXA6SXAsdmlkZW86anAsZWRpdG9yOkJwfTtmdW5jdGlvbiBYaChlKXtpZihlJiZlLmNvbnRleHQpe3ZhciB0PWUuY29udGV4dCxuPXQuaWQscj10Lm5hbWUsaT10LnBhZ2Usbz1KaFtyXTtlLmNvbnRleHQ9byYmbmV3IG8obixpKX19dmFyIFloPWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuX3NlbGVjdG9yUXVlcnk9ZSx0aGlzLl9jb21wb25lbnQ9dCx0aGlzLl9zZWxlY3Rvcj1uLHRoaXMuX3NpbmdsZT1yfTtZaC5wcm90b3R5cGUuYm91bmRpbmdDbGllbnRSZWN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2lkOiEwLGRhdGFzZXQ6ITAscmVjdDohMCxzaXplOiEwfSxlKSx0aGlzLl9zZWxlY3RvclF1ZXJ5fSxZaC5wcm90b3R5cGUuZmllbGRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSxlLHQpLHRoaXMuX3NlbGVjdG9yUXVlcnl9LFloLnByb3RvdHlwZS5zY3JvbGxPZmZzZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSx7aWQ6ITAsZGF0YXNldDohMCxzY3JvbGxPZmZzZXQ6ITB9LGUpLHRoaXMuX3NlbGVjdG9yUXVlcnl9LFloLnByb3RvdHlwZS5jb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2NvbnRleHQ6ITB9LGUpLHRoaXMuX3NlbGVjdG9yUXVlcnl9O3ZhciBLaD1mdW5jdGlvbihlKXt0aGlzLl9wYWdlPWUsdGhpcy5fcXVldWU9W10sdGhpcy5fcXVldWVDYj1bXSx0aGlzLl9ub2Rlc1JlZj1udWxsfTtLaC5wcm90b3R5cGUuZXhlYz1mdW5jdGlvbih0KXt2YXIgaT10aGlzO3JldHVybiBUbCgicmVxdWVzdENvbXBvbmVudEluZm8iLHRoaXMuX3BhZ2UsdGhpcy5fcXVldWUsZnVuY3Rpb24oZSl7dmFyIHI9aS5fcXVldWVDYjtlLmZvckVhY2goZnVuY3Rpb24oZSx0KXtBcnJheS5pc0FycmF5KGUpP2UuZm9yRWFjaChYaCk6WGgoZSk7dmFyIG49clt0XTtDKG4pJiZuLmNhbGwoaSxlKX0pLEModCkmJnQuY2FsbChpLGUpfSksdGhpcy5fbm9kZXNSZWZ9LEtoLnByb3RvdHlwZS5pbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fY29tcG9uZW50PWUuXyRpZHx8ZSx0aGlzfSxLaC5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9ub2Rlc1JlZj1uZXcgWWgodGhpcyx0aGlzLl9jb21wb25lbnQsZSwhMCl9LEtoLnByb3RvdHlwZS5zZWxlY3RBbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyBZaCh0aGlzLHRoaXMuX2NvbXBvbmVudCxlLCExKX0sS2gucHJvdG90eXBlLnNlbGVjdFZpZXdwb3J0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyBZaCh0aGlzLDAsIiIsITApfSxLaC5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24oZSx0LG4scixpKXt0aGlzLl9xdWV1ZS5wdXNoKHtjb21wb25lbnQ6dCxzZWxlY3RvcjplLHNpbmdsZTpuLGZpZWxkczpyfSksdGhpcy5fcXVldWVDYi5wdXNoKGkpfTt2YXIgWmg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlU2VsZWN0b3JRdWVyeTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEtoKGV8fEFsKCJjcmVhdGVTZWxlY3RvclF1ZXJ5IikpfX0pO2ZnLnN1YnNjcmliZSgib25Mb2FkRm9udEZhY2VDYWxsYmFjayIsZnVuY3Rpb24oZSl7aGkoZS5jYWxsYmFja0lkLGUuZGF0YSl9KTt2YXIgUWg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsbG9hZEZvbnRGYWNlOmZ1bmN0aW9uKGUsdCl7dmFyIG49RWwoKTtpZighbilyZXR1cm57ZXJyTXNnOiJsb2FkRm9udEZhY2U6ZmFpbCBub3QgZm9udCBwYWdlIn07ZmcucHVibGlzaEhhbmRsZXIoImxvYWRGb250RmFjZSIse29wdGlvbnM6ZSxjYWxsYmFja0lkOnR9LG4pfX0pO3ZhciBldj1bXTt2YXIgdHY9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0TG9jYWxlOmZ1bmN0aW9uKCl7dmFyIGU9Ymcoe2FsbG93RGVmYXVsdDohMH0pO3JldHVybiBlJiZlLiR2bT9lLiR2bS4kbG9jYWxlOnN0LmdldExvY2FsZSgpfSxzZXRMb2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIGJnKCkuJHZtLiRsb2NhbGUhPT10JiYoYmcoKS4kdm0uJGxvY2FsZT10LHdnKCkuZm9yRWFjaChmdW5jdGlvbihlKXtmZy5wdWJsaXNoSGFuZGxlcigic2V0TG9jYWxlIix0LGUuJHBhZ2UuaWQpfSksbGcucmVxdWlyZU1vZHVsZSgicGx1cyIpLnNldExhbmd1YWdlKHQpLGV2LmZvckVhY2goZnVuY3Rpb24oZSl7aGkoZSx7bG9jYWxlOnR9KX0pLCEwKX0sb25Mb2NhbGVDaGFuZ2U6ZnVuY3Rpb24oZSl7ZXYucHVzaChlKX19KTt2YXIgbnY9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscGFnZVNjcm9sbFRvOmZ1bmN0aW9uKGUpe3ZhciB0PXdnKCk7cmV0dXJuIHQubGVuZ3RoJiZmZy5wdWJsaXNoSGFuZGxlcigicGFnZVNjcm9sbFRvIixlLHRbdC5sZW5ndGgtMV0uJHBhZ2UuaWQpLHt9fX0pO3ZhciBydj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzZXRQYWdlTWV0YTpmdW5jdGlvbihlKXt2YXIgdD13ZygpO3JldHVybiB0Lmxlbmd0aCYmZmcucHVibGlzaEhhbmRsZXIoInNldFBhZ2VNZXRhIixlLHRbdC5sZW5ndGgtMV0uJHBhZ2UuaWQpLHt9fX0pO2Z1bmN0aW9uIGl2KGUpe3JldHVybiBUbCgic2V0VGFiQmFyQmFkZ2UiLHtpbmRleDplLmluZGV4LHR5cGU6Im5vbmUifSl9dmFyIG92PWl2LGF2PVtdO09sKCJvblRhYkJhck1pZEJ1dHRvblRhcCIsZnVuY3Rpb24odCl7YXYuZm9yRWFjaChmdW5jdGlvbihlKXtoaShlLHQpfSl9KTt2YXIgc3Y9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscmVtb3ZlVGFiQmFyQmFkZ2U6aXYsc2hvd1RhYkJhclJlZERvdDpmdW5jdGlvbihlKXtyZXR1cm4gVGwoInNldFRhYkJhckJhZGdlIix7aW5kZXg6ZS5pbmRleCx0eXBlOiJyZWREb3QifSl9LGhpZGVUYWJCYXJSZWREb3Q6b3Ysb25UYWJCYXJNaWRCdXR0b25UYXA6ZnVuY3Rpb24oZSl7YXYucHVzaChlKX19KSxjdj1bXTtPbCgib25WaWV3RGlkUmVzaXplIixmdW5jdGlvbih0KXtjdi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2hpKGUsdCl9KX0pO3ZhciB1dixsdixkdj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvbldpbmRvd1Jlc2l6ZTpmdW5jdGlvbihlKXtjdi5wdXNoKGUpfSxvZmZXaW5kb3dSZXNpemU6ZnVuY3Rpb24oZSl7Y3Yuc3BsaWNlKGN2LmluZGV4T2YoZSksMSl9fSksZnY9T2JqZWN0LmNyZWF0ZShudWxsKSxwdj0odXY9eyIuL2Jhc2UvYmFzZTY0LmpzIjpHciwiLi9iYXNlL2Nhbi1pLXVzZS5qcyI6WHIsIi4vYmFzZS9pbnRlcmNlcHRvci5qcyI6S3IsIi4vYmFzZS91cHgycHguanMiOm5pLCIuL2NvbnRleHQvYXVkaW8uanMiOm9pLCIuL2NvbnRleHQvYmFja2dyb3VuZC1hdWRpby5qcyI6TmwsIi4vY29udGV4dC9jYW52YXMuanMiOkFwLCIuL2NvbnRleHQvY3JlYXRlLW1hcC1jb250ZXh0LmpzIjokcCwiLi9jb250ZXh0L2NyZWF0ZS12aWRlby1jb250ZXh0LmpzIjpMcCwiLi9jb250ZXh0L2VkaXRvci5qcyI6RHAsIi4vY29udGV4dC9pbm5lci1hdWRpby5qcyI6cXAsIi4vZGV2aWNlL25ldHdvcmsuanMiOkhwLCIuL2RldmljZS90aGVtZS5qcyI6WHAsIi4va2V5Ym9hcmQvZ2V0LXNlbGVjdGVkLXRleHQtcmFuZ2UuanMiOlpwLCIuL2tleWJvYXJkL2tleWJvYXJkLmpzIjpRcCwiLi9tZWRpYS9wcmV2aWV3LWltYWdlLmpzIjpyaCwiLi9tZWRpYS9yZWNvcmRlci5qcyI6YWgsIi4vbmV0d29yay9kb3dubG9hZC1maWxlLmpzIjp1aCwiLi9uZXR3b3JrL3JlcXVlc3QuanMiOmZoLCIuL25ldHdvcmsvc29ja2V0LmpzIjp5aCwiLi9uZXR3b3JrL3VwZGF0ZS5qcyI6YmgsIi4vbmV0d29yay91cGxvYWQtZmlsZS5qcyI6U2gsIi4vcGx1Z2luL19fZl9fLmpzIjpBaCwiLi9wbHVnaW4vcHVzaC5qcyI6TGgsIi4vdWkvY3JlYXRlLWFuaW1hdGlvbi5qcyI6RmgsIi4vdWkvY3JlYXRlLWludGVyc2VjdGlvbi1vYnNlcnZlci5qcyI6cWgsIi4vdWkvY3JlYXRlLW1lZGlhLXF1ZXJ5LW9ic2VydmVyLmpzIjpHaCwiLi91aS9jcmVhdGUtc2VsZWN0b3ItcXVlcnkuanMiOlpoLCIuL3VpL2xvYWQtZm9udC1mYWNlLmpzIjpRaCwiLi91aS9sb2NhbGUuanMiOnR2LCIuL3VpL3BhZ2Utc2Nyb2xsLXRvLmpzIjpudiwiLi91aS9zZXQtcGFnZS1tZXRhLmpzIjpydiwiLi91aS90YWItYmFyLmpzIjpzdiwiLi91aS93aW5kb3cuanMiOmR2fSwobHY9ZnVuY3Rpb24oZSl7cmV0dXJuIHV2W2VdfHxmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK2UrIicuIil9KCl9KS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHV2KX0sbHYpO3B2LmtleXMoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09iamVjdC5hc3NpZ24oZnYscHYoZSkpfSk7dmFyIGh2PU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSxmdixDbCksdnY9T2JqZWN0LmNyZWF0ZShudWxsKTt0LmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIGksbztodltlXT92dltlXT0obz16cihpPWUsaHZbZV0pLHNlKGkpJiZDKG8pP2Z1bmN0aW9uKG4pe3ZvaWQgMD09PW4mJihuPXt9KTtmb3IodmFyIHI9W10sZT1hcmd1bWVudHMubGVuZ3RoLTE7MDxlLS07KXJbZV09YXJndW1lbnRzW2UrMV07cmV0dXJuIEMobi5zdWNjZXNzKXx8QyhuLmZhaWwpfHxDKG4uY29tcGxldGUpP1goaSxLLmFwcGx5KHZvaWQgMCxbaSxvLG5dLmNvbmNhdChyKSkpOlgoaSxuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe0suYXBwbHkodm9pZCAwLFtpLG8sT2JqZWN0LmFzc2lnbih7fSxuLHtzdWNjZXNzOmUsZmFpbDp0fSldLmNvbmNhdChyKSl9KS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybltudWxsLGVdfSkuY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuW2VdfSkpfTpvKTp2dltlXT1GcihlKX0pO3ZhciBndj1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIG12KGUsdCxuKXtyZXR1cm4ib25FcnJvciIhPT10JiZjb25zb2xlLmRlYnVnKCJBcHDvvJoiK3QrIiBoYXZlIGJlZW4gaW52b2tlZCIrKG4/IiAiK0pTT04uc3RyaW5naWZ5KG4pOiIiKSksKGU9ZS4kdm18fGUpLl9fY2FsbF9ob29rJiZlLl9fY2FsbF9ob29rKHQsbil9ZnVuY3Rpb24geXYoZSx0LG4pe3JldHVybiJvblBhZ2VTY3JvbGwiIT09dCYmY29uc29sZS5kZWJ1ZyhlLiRwYWdlLnJvdXRlKyJbIitlLiRwYWdlLmlkKyJd77yaIit0KyIgaGF2ZSBiZWVuIGludm9rZWQiKSxpPXQsbz1uLChyPShyPWUpLiR2bXx8cikuX19jYWxsX2hvb2smJnIuX19jYWxsX2hvb2soaSxvKTt2YXIgcixpLG99ZnVuY3Rpb24gX3YoZSx0KXt2YXIgbj1lLm5hbWUscj1lLmFyZzsicG9zdE1lc3NhZ2UiPT09bj9mdW5jdGlvbih0LGUpe3Q9cGFyc2VJbnQodCk7dmFyIG49d2coITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7aWYobiYmIW4uJHBhZ2UubWV0YS5pc05WdWUpe3ZhciByPW4uJHZtLl8kdmQuZWxlbWVudHMuZmluZChmdW5jdGlvbihlKXtyZXR1cm4id2ViLXZpZXciPT09ZS50eXBlJiZlLmV2ZW50cy5tZXNzYWdlfSk7aWYoIXIpcmV0dXJuO3IuZGlzcGF0Y2hFdmVudCgibWVzc2FnZSIse3R5cGU6Im1lc3NhZ2UiLHRhcmdldDpPYmplY3QuY3JlYXRlKG51bGwpLGN1cnJlbnRUYXJnZXQ6T2JqZWN0LmNyZWF0ZShudWxsKSx0aW1lU3RhbXA6RGF0ZS5ub3coKSxkZXRhaWw6e2RhdGE6W2VdfX0pfX0odFswXSxyKTpfZ1tuXShyKX1mdW5jdGlvbiBidihlLHQpe3ZhciBuPXQuZ2V0QXBwLGk9dC5nZXRDdXJyZW50UGFnZXM7ZnVuY3Rpb24gcihlLHQpe3ZhciBuPWkoKTtuLmxlbmd0aCYmeXYobltuLmxlbmd0aC0xXSxlLHQpfWZ1bmN0aW9uIG8odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3IodCxlKX19dmFyIGE9e25hdmlnYXRlVG86ZnVuY3Rpb24oKXtyKCJvbkhpZGUiKX0sbmF2aWdhdGVCYWNrOmZ1bmN0aW9uKCl7cigib25TaG93Iil9fTtlKCJvbkVycm9yIixmdW5jdGlvbihlKXttdihuKCksIm9uRXJyb3IiLGUpfSksZSgib25QYWdlTm90Rm91bmQiLGZ1bmN0aW9uKGUpe212KG4oKSwib25QYWdlTm90Rm91bmQiLGUpfSksZSgib25BcHBSb3V0ZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS50eXBlLG49YVt0XTtuJiZuKCl9KSxlKCJvbkFwcEVudGVyQmFja2dyb3VuZCIsZnVuY3Rpb24oKXttdihuKCksIm9uSGlkZSIpLHIoIm9uSGlkZSIpfSksZSgib25BcHBFbnRlckZvcmVncm91bmQiLGZ1bmN0aW9uKGUpe212KG4oKSwib25TaG93IixlKSwwIT09aSgpLmxlbmd0aCYmcigib25TaG93Iil9KSxlKCJvblJlc2l6ZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1pKCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS4kcGFnZS5pZD09PXR9KTtuJiZ5dihuLCJvblJlc2l6ZSIsZSl9KSxlKCJvblB1bGxEb3duUmVmcmVzaCIsZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkoKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRwYWdlLmlkPT09dH0pO3ImJihadT0ibnVtYmVyIj09dHlwZW9mKG49dCk/ZGcud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChTdHJpbmcobikpOm4seXYociwib25QdWxsRG93blJlZnJlc2giKSl9KSxlKCJvblRhYkl0ZW1UYXAiLG8oIm9uVGFiSXRlbVRhcCIpKSxlKCJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiLG8oIm9uTmF2aWdhdGlvbkJhckJ1dHRvblRhcCIpKSxlKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiLG8oIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2hhbmdlZCIpKSxlKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCIsbygib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDb25maXJtZWQiKSksZSgib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDbGlja2VkIixvKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENsaWNrZWQiKSksZSgib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRGb2N1c0NoYW5nZWQiLG8oIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Rm9jdXNDaGFuZ2VkIikpLGUoIm9uV2ViSW52b2tlQXBwU2VydmljZSIsX3YpfXQuZm9yRWFjaChmdW5jdGlvbihlKXtodltlXT9ndltlXT16cihlLGh2W2VdKTpndltlXT1GcihlKX0pO3ZhciB3dj0hMTtmdW5jdGlvbiBrdihlLHQpe3ZhciBuPSIxIj09PXQ7aWYoIW58fCF3dil7aWYobj8od3Y9ITAsY3MoZGcud2Vidmlldy5nZXRMYXVuY2hXZWJ2aWV3KCkpKTpYYXx8Y3MoZGcud2Vidmlldy5nZXRXZWJ2aWV3QnlJZCh0KSksWGEuaWQhPT10KXJldHVybiBjb25zb2xlLmVycm9yKCJ3ZWJ2aWV3UmVhZHlbIitYYS5pZCsiXVsiK3QrIl0gbm90IG1hdGNoIik7dmFyIHIsaTtpZihYYS5sb2FkZWQ9ITAsaT1wc1tyPXRdLEFycmF5LmlzQXJyYXkoaSkmJmkuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZSgpfSksZGVsZXRlIHBzW3JdLG4pe3ZhciBvPSIvIittZy5lbnRyeVBhZ2VQYXRoLGE9eWcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09b30pO2lmKCFhLm1ldGEuaXNOVnVlKXt2YXIgcz1hLm1ldGEuaXNUYWJCYXI/InN3aXRjaFRhYiI6Im5hdmlnYXRlVG8iO3JldHVybiBfZ1tzXSh7dXJsOm8rKG1nLmVudHJ5UGFnZVF1ZXJ5fHwiIiksb3BlblR5cGU6ImFwcExhdW5jaCJ9KX19fX12YXIgU3Y9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiB4dihlLHQpe3ZhciBuPWUuZGF0YSxyPShlLm9wdGlvbnMsU3ZbdF0pO0FycmF5LmlzQXJyYXkocikmJnIuZm9yRWFjaChmdW5jdGlvbihlKXtlKG4pfSl9dmFyIEN2LFR2PVtdO2Z1bmN0aW9uIE92KCl7Zm9yKHZhciBlPVR2LnNsaWNlKDApLHQ9VHYubGVuZ3RoPTA7dDxlLmxlbmd0aDt0KyspZVt0XSgpfWZ1bmN0aW9uIEF2KGUpe3ZhciB0PWUuZGF0YSxuPXQubWV0aG9kLHI9dC5hcmdzO19nW25dJiZfZ1tuXShyKX1mdW5jdGlvbiBFdihlLHQpe3ZhciBuPWUuY2lkLHI9ZS5tZXRob2QsaT1lLmFyZ3M7dD1wYXJzZUludCh0KTt2YXIgbz13ZyghMCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS4kcGFnZS5pZD09PXR9KTtpZighbylyZXR1cm4gY29uc29sZS5lcnJvcigiUGFnZVsiK3QrIl0gbm90IGZvdW5kIik7dmFyIGE9by4kdm0uXyR2ZC5nZXRWbShuKTtpZighYSlyZXR1cm4gY29uc29sZS5lcnJvcigidm1bIituKyJdIG5vdCBmb3VuZCIpO2Fbcl0mJmFbcl0oaSl9ZnVuY3Rpb24gSXYodCl7dD1wYXJzZUludCh0KTt2YXIgZT13ZyghMCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS4kcGFnZS5pZD09PXR9KTtyZXR1cm4gZXx8Y29uc29sZS5lcnJvcigiUGFnZVsiK3QrIl0gbm90IGZvdW5kIil9ZnVuY3Rpb24gJHYoZSx0KXt2YXIgbj1Jdih0KTtuJiYobi5fX3VuaWFwcF93ZWJ2aWV3PSEwKX1mdW5jdGlvbiBQdihlLHQpe3ZhciBuPUl2KHQpO24mJmRlbGV0ZSBuLl9fdW5pYXBwX3dlYnZpZXd9ZnVuY3Rpb24gTXYoKXt2YXIgZT1mZy5vbixuPWZnLmVtaXQsdD1mZy5zdWJzY3JpYmUscj1mZy5wdWJsaXNoSGFuZGxlcixpPWZnLnN1YnNjcmliZUhhbmRsZXI7aWYoZnVuY3Rpb24oZSx0KXt0LmdldEFwcDt2YXIgaT10LmdldEN1cnJlbnRQYWdlcztmdW5jdGlvbiBuKHIpe3JldHVybiBmdW5jdGlvbihlLHQpe3Q9cGFyc2VJbnQodCk7dmFyIG49aSgpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7biYmeXYobixyLGUpfX12YXIgbz10bCgicmVxdWVzdENvbXBvbmVudEluZm8iKSxhPXRsKCJyZXF1ZXN0Q29tcG9uZW50T2JzZXJ2ZXIiKSxzPXRsKCJyZXF1ZXN0TWVkaWFRdWVyeU9ic2VydmVyIik7ZSgib25QYWdlU2Nyb2xsIixuKCJvblBhZ2VTY3JvbGwiKSksZSgib25SZWFjaEJvdHRvbSIsbigib25SZWFjaEJvdHRvbSIpKSxlKCJvblJlcXVlc3RDb21wb25lbnRJbmZvIixmdW5jdGlvbihlKXt2YXIgdD1lLnJlcUlkLG49ZS5yZXMscj1vLnBvcCh0KTtyJiZyKG4pfSksZSgib25SZXF1ZXN0Q29tcG9uZW50T2JzZXJ2ZXIiLGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxSWQsbj1lLnJlcUVuZCxyPWUucmVzLGk9YS5nZXQodCk7aWYoaSl7aWYobilyZXR1cm4gdm9pZCBhLnBvcCh0KTtpKHIpfX0pLGUoIm9uUmVxdWVzdE1lZGlhUXVlcnlPYnNlcnZlciIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXFJZCxuPWUucmVxRW5kLHI9ZS5yZXMsaT1zLmdldCh0KTtpZihpKXtpZihuKXJldHVybiB2b2lkIHMucG9wKHQpO2kocil9fSl9KHQse2dldEFwcDpiZyxnZXRDdXJyZW50UGFnZXM6d2d9KSx5YSgic3Vic2NyaWJlSGFuZGxlciIsZnVuY3Rpb24oZSl7aShlLnR5cGUsZS5kYXRhLGUucGFnZUlkKX0pLCJuYXRpdmUiIT09bWcucmVuZGVyZXIpe3QoWmEsa3YpLHQoS2EseHYpLHQoUWEsT3YpO3ZhciBvPSIvIittZy5lbnRyeVBhZ2VQYXRoO3lnLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PW99KS5tZXRhLmlzTlZ1ZXx8cihaYSxPYmplY3QuY3JlYXRlKG51bGwpLFsxXSl9ZSgiYXBpLiIrdHMsZnVuY3Rpb24oZSx0KXtuKCJvbldlYkludm9rZUFwcFNlcnZpY2UiLGUsdCl9KSx0KCJvbld4c0ludm9rZUNhbGxNZXRob2QiLEV2KSx0KGVzLEF2KSx0KG5zLCR2KSx0KHJzLFB2KX12YXIganY9e2dsb2JhbERhdGE6e319O2Z1bmN0aW9uIEx2KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmFsbG93RGVmYXVsdDtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9ITEpLEN2fHwodD9qdjp2b2lkIGNvbnNvbGUuZXJyb3IoIlt3YXJuXTogZ2V0QXBwKCkgZmFpbGVkLiBMZWFybiBtb3JlOiBodHRwczovL3VuaWFwcC5kY2xvdWQuaW8vY29sbG9jYXRpb24vZnJhbWUvd2luZG93P2lkPWdldGFwcC4iKSl9ZnVuY3Rpb24gTnYoKXt2YXIgZT12aSgiZ2xvYmFsRXZlbnQiKSxvPWZnLmVtaXQ7bGcuY29uZmlnLnByZWxvYWQ/ZGcua2V5LmFkZEV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLFdhKTpkZy5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJzcGxhc2hjbG9zZWQiLGZ1bmN0aW9uKCl7ZGcua2V5LmFkZEV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLFdhKX0pLGRnLmdsb2JhbEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInBhdXNlIixmdW5jdGlvbigpe28oIm9uQXBwRW50ZXJCYWNrZ3JvdW5kIil9KSxkZy5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJyZXN1bWUiLGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaT1JcygpO2kmJmkudXNlckFjdGlvbiYmKHQ9KGU9aSkucGF0aCxuPWUucXVlcnkscj1lLnJlZmVycmVySW5mbyxUcyhPcyx7cGF0aDp0LHF1ZXJ5Om4/RShuKTp7fSxyZWZlcnJlckluZm86cnx8e319KSksbygib25BcHBFbnRlckZvcmVncm91bmQiLEVzKCkpfSksZGcuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigibmV0Y2hhbmdlIixmdW5jdGlvbigpe3ZhciBlPW1vW2RnLm5ldHdvcmtpbmZvLmdldEN1cnJlbnRUeXBlKCldfHwidW5rbm93biI7Z2koIm9uTmV0d29ya1N0YXR1c0NoYW5nZSIse2lzQ29ubmVjdGVkOiJub25lIiE9PWUsbmV0d29ya1R5cGU6ZX0pfSk7dmFyIHQ9MDtkZy5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJLZXlib2FyZEhlaWdodENoYW5nZSIsZnVuY3Rpb24oZSl7dCE9PWUuaGVpZ2h0JiZnaSgib25LZXlib2FyZEhlaWdodENoYW5nZSIse2hlaWdodDp0PWUuaGVpZ2h0fSl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoInVpc3R5bGVjaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0LG49e3RoZW1lOmUudWlzdHlsZX07bXYoQ3YsaXQsbiksZ2koaXQsbiksZmcucHVibGlzaEhhbmRsZXIoaXQsbiwodD1qcygpKVt0Lmxlbmd0aC0xXS4kcGFnZS5pZCksZ2koIm9uVUlTdHlsZUNoYW5nZSIse3N0eWxlOmUudWlzdHlsZX0pLFJzKCl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoInVuaU1QTmF0aXZlRXZlbnQiLGZ1bmN0aW9uKGUpe2dpKCJ1bmlNUE5hdGl2ZUV2ZW50IixlKX0pLGRnLmdsb2JhbEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInBsdXNNZXNzYWdlIixCdiksZGcuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigiV2Vidmlld1Bvc3RNZXNzYWdlIixCdil9ZnVuY3Rpb24gQnYoZSl7ZS5kYXRhJiZlLmRhdGEudHlwZSYmbWEoZS5kYXRhLnR5cGUsZS5kYXRhLmFyZ3N8fHt9KX1mdW5jdGlvbiBEdihlKXt2YXIgdCxuLHIsaSxvPSh0PXtwYXRoOm1nLmVudHJ5UGFnZVBhdGgscXVlcnk6bWcuZW50cnlQYWdlUXVlcnkscmVmZXJyZXJJbmZvOm1nLnJlZmVycmVySW5mb30sbj10LnBhdGgscj10LnF1ZXJ5LGk9dC5yZWZlcnJlckluZm8sVHMoQXMse3BhdGg6bixxdWVyeTpyP0Uocik6e30scmVmZXJyZXJJbmZvOml8fHt9LGNoYW5uZWw6ZGcucnVudGltZS5jaGFubmVsLGxhdW5jaGVyOmRnLnJ1bnRpbWUubGF1bmNoZXJ9KSxUcyhPcyxBcyksQXMpO212KGUsIm9uTGF1bmNoIixvKSxtdihlLCJvblNob3ciLG8pO3ZhciBhPWxnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRBcHBTdGF0ZTsyPT09KGEmJk51bWJlcihhKCkpKSYmbXYoZSwib25IaWRlIixvKX1mdW5jdGlvbiBSdigpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIDA9PT0oZT1lLnJlcGxhY2UoL1wvJC8sIiIpKS5pbmRleE9mKCJfIik/ZGcuaW8uY29udmVydExvY2FsRmlsZVN5c3RlbVVSTChlKTplfXZhciB0PWUoX28pLG49ZShibykscj1uLnNwbGl0KCIvIik7ci5wb3AoKSxyPXIuam9pbigiLyIpLGRnLmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwoZGcuaW8uY29udmVydEFic29sdXRlRmlsZVN5c3RlbShyKSxmdW5jdGlvbihlKXtlLmNyZWF0ZVJlYWRlcigpLnJlYWRFbnRyaWVzKGZ1bmN0aW9uKGUpe2UmJmUubGVuZ3RoJiZlLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pc0RpcmVjdG9yeSYmMD09PWUuZnVsbFBhdGguaW5kZXhPZih0KSYmMCE9PWUuZnVsbFBhdGguaW5kZXhPZihuKSYmZS5yZW1vdmVSZWN1cnNpdmVseSgpfSl9KX0pfWZ1bmN0aW9uIEZ2KGUsdCl7dmFyIG4scixpLG87KEN2PWUpLiR2bT1lLG49ZSxpPXQub2JzZXJ2YWJsZSh7bG9jYWxlOnJ8fHN0LmdldExvY2FsZSgpfSksbz1bXSxuLiR3YXRjaExvY2FsZT1mdW5jdGlvbihlKXtvLnB1c2goZSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCIkbG9jYWxlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGkubG9jYWxlfSxzZXQ6ZnVuY3Rpb24odCl7aS5sb2NhbGU9dCxvLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KX19KSxPYmplY3QuYXNzaWduKEN2LGp2KTt2YXIgYT1lLiRvcHRpb25zLmdsb2JhbERhdGF8fHt9O0N2Lmdsb2JhbERhdGE9T2JqZWN0LmFzc2lnbihhLEN2Lmdsb2JhbERhdGEpLGJ2KGZnLm9uLHtnZXRBcHA6THYsZ2V0Q3VycmVudFBhZ2VzOmpzfSksUHMoKSxmdW5jdGlvbigpe2lmKG1nLnRhYkJhciYmbWcudGFiQmFyLmxpc3QmJm1nLnRhYkJhci5saXN0Lmxlbmd0aCl7bWcudGFiQmFyLnNlbGVjdGVkPTA7dmFyIGU9bWcudGFiQmFyLmxpc3QuZmluZEluZGV4KGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhZ2VQYXRoPT09bWcuZW50cnlQYWdlUGF0aH0pO0hzLmluaXQobWcudGFiQmFyLGZ1bmN0aW9uKGUsdCl7X2cuc3dpdGNoVGFiKHt1cmw6Ii8iK2UucGFnZVBhdGgsb3BlblR5cGU6InN3aXRjaFRhYiIsZnJvbToidGFiQmFyIixzdWNjZXNzOmZ1bmN0aW9uKCl7ZmcuZW1pdCgib25UYWJJdGVtVGFwIix7aW5kZXg6dCx0ZXh0OmUudGV4dCxwYWdlUGF0aDplLnBhZ2VQYXRofSl9fSl9KSwtMSE9PWUmJjAhPT0obWcudGFiQmFyLnNlbGVjdGVkPWUpJiZIcy5zd2l0Y2hUYWIobWcuZW50cnlQYWdlUGF0aCl9fSgpLE52KCksTXYoKSxEdihlKSxwZyhSdiwxZTQpLG1nLnJlYWR5PSEwfXZhciBVdj1bInVuaS1hcHAiLCJ1bmktbGF5b3V0IiwidW5pLWNvbnRlbnQiLCJ1bmktbWFpbiIsInVuaS10b3Atd2luZG93IiwidW5pLWxlZnQtd2luZG93IiwidW5pLXJpZ2h0LXdpbmRvdyIsInVuaS10YWJiYXIiLCJ1bmktcGFnZSIsInVuaS1wYWdlLWhlYWQiLCJ1bmktcGFnZS13cmFwcGVyIiwidW5pLXBhZ2UtYm9keSIsInVuaS1wYWdlLXJlZnJlc2giLCJ1bmktYWN0aW9uc2hlZXQiLCJ1bmktbW9kYWwiLCJ1bmktdG9hc3QiLCJ1bmktcmVzaXplLXNlbnNvciIsInVuaS1zaGFkb3ctcm9vdCIsInVuaS1hZCIsInVuaS1hdWRpbyIsInVuaS1idXR0b24iLCJ1bmktY2FtZXJhIiwidW5pLWNhbnZhcyIsInVuaS1jaGVja2JveCIsInVuaS1jaGVja2JveC1ncm91cCIsInVuaS1jb3Zlci1pbWFnZSIsInVuaS1jb3Zlci12aWV3IiwidW5pLWVkaXRvciIsInVuaS1mb3JtIiwidW5pLWZ1bmN0aW9uYWwtcGFnZS1uYXZpZ2F0b3IiLCJ1bmktaWNvbiIsInVuaS1pbWFnZSIsInVuaS1pbnB1dCIsInVuaS1sYWJlbCIsInVuaS1saXZlLXBsYXllciIsInVuaS1saXZlLXB1c2hlciIsInVuaS1tYXAiLCJ1bmktbW92YWJsZS1hcmVhIiwidW5pLW1vdmFibGUtdmlldyIsInVuaS1uYXZpZ2F0b3IiLCJ1bmktb2ZmaWNpYWwtYWNjb3VudCIsInVuaS1vcGVuLWRhdGEiLCJ1bmktcGlja2VyIiwidW5pLXBpY2tlci12aWV3IiwidW5pLXBpY2tlci12aWV3LWNvbHVtbiIsInVuaS1wcm9ncmVzcyIsInVuaS1yYWRpbyIsInVuaS1yYWRpby1ncm91cCIsInVuaS1yaWNoLXRleHQiLCJ1bmktc2Nyb2xsLXZpZXciLCJ1bmktc2xpZGVyIiwidW5pLXN3aXBlciIsInVuaS1zd2lwZXItaXRlbSIsInVuaS1zd2l0Y2giLCJ1bmktdGV4dCIsInVuaS10ZXh0YXJlYSIsInVuaS12aWRlbyIsInVuaS12aWV3IiwidW5pLXdlYi12aWV3Il07ZnVuY3Rpb24genYoZSl7aWYoMD09PWUuaW5kZXhPZigiIyIpKXt2YXIgdD1lLnN1YnN0cigxKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuISghZS5jb21wb25lbnRJbnN0YW5jZXx8ZS5jb21wb25lbnRJbnN0YW5jZS5pZCE9PXQpfHwhKCFlLmRhdGF8fCFlLmRhdGEuYXR0cnN8fGUuZGF0YS5hdHRycy5pZCE9PXQpfX1pZigwPT09ZS5pbmRleE9mKCIuIikpe3ZhciBuPWUuc3Vic3RyKDEpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5kYXRhJiZmdW5jdGlvbihlLHQsbil7dm9pZCAwPT09dCYmKHQ9IiIpO3ZvaWQgMD09PW4mJihuPSIiKTtpZih0KXJldHVybi0xIT09dC5zcGxpdChWdikuaW5kZXhPZihlKTtpZihuJiYic3RyaW5nIj09dHlwZW9mIG4pcmV0dXJuLTEhPT1uLnNwbGl0KFZ2KS5pbmRleE9mKGUpfShuLGUuZGF0YS5zdGF0aWNDbGFzcyxlLmRhdGEuY2xhc3MpfX19dmFyIFZ2PS9ccysvO2Z1bmN0aW9uIHF2KGUpe2UucHJvdG90eXBlLmNyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyPWZ1bmN0aW9uKGUpe3JldHVybiBfZy5jcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlcih0aGlzLGUpfSxlLnByb3RvdHlwZS5jcmVhdGVNZWRpYVF1ZXJ5T2JzZXJ2ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIF9nLmNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlcih0aGlzLGUpfSxlLnByb3RvdHlwZS5zZWxlY3RDb21wb25lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uIGUodCxuKXtpZihuKHQuJHZub2RlfHx0Ll92bm9kZSkpcmV0dXJuIHQ7Zm9yKHZhciByPXQuJGNoaWxkcmVuLGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89ZShyW2ldLG4pO2lmKG8pcmV0dXJuIG99fSh0aGlzLHp2KGUpKX0sZS5wcm90b3R5cGUuc2VsZWN0QWxsQ29tcG9uZW50cz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gZSh0LG4scil7bih0LiR2bm9kZXx8dC5fdm5vZGUpJiZyLnB1c2godCk7Zm9yKHZhciBpPXQuJGNoaWxkcmVuLG89MDtvPGkubGVuZ3RoO28rKyllKGlbb10sbixyKTtyZXR1cm4gcn0odGhpcyx6dihlKSxbXSl9fWZ1bmN0aW9uIFd2KGUsdCxuKXtpZighZS4kcGFyZW50KXJldHVybiItMSI7dmFyIHI9ZS4kdm5vZGUsaT1yLmNvbnRleHQsbz1yLmRhdGEuYXR0cnMuX2k7cmV0dXJuIG4mJmsoci5kYXRhLCJrZXkiKSYmKG89bysiOyIrci5kYXRhLmtleSksaSYmaSE9PXQmJmkuXyRpZD9pLl8kaWQrIjsiK3QuXyRpZCsiLCIrbzp0Ll8kaWQrIiwiK299dmFyIEh2LEd2LEp2PSJhbmRyb2lkIj09PWRnLm9zLm5hbWUudG9Mb3dlckNhc2UoKT8zMDA6NzAwLFh2PTA7ZnVuY3Rpb24gWXYoZSl7cmV0dXJuIGUucHJldmVudERlZmF1bHQ9ZixlLnN0b3BQcm9wYWdhdGlvbj1mLCh0PWUpLm1wPU9iamVjdC5hc3NpZ24oeyJAd2FybmluZyI6Im1wIGlzIGRlcHJlY2F0ZWQifSx0KSx0Ll9wcm9jZXNzZWQ9ITAsdDt2YXIgdH1PbCgib25LZXlib2FyZEhlaWdodENoYW5nZSIsZnVuY3Rpb24oZSl7aWYoMDwoWHY9ZS5oZWlnaHQpKXt2YXIgdD1IdjtIdj1udWxsLHQmJnQoKX19KTt2YXIgS3Y9e307S3ZbMjBdPWZ1bmN0aW9uKGUscyl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0sbj1lWzFdLHI9ZVsyXTtuPVN0cmluZyhuKTt2YXIgaT1zLmVsZW1lbnRzLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2lkPT09dCYmZS5uaWQ9PT1ufSk7aWYoaSl7dmFyIG89ci50eXBlLGE9WXYocik7ImZvY3VzIj09PW98fCJibHVyIj09PW8/ZnVuY3Rpb24oZSx0KXtpZihIdj1udWxsLEd2JiZoZyhHdiksImZvY3VzIj09PWUudHlwZSl7aWYoISgwPFh2KSlyZXR1cm4gR3Y9cGcoZnVuY3Rpb24oKXtlLmRldGFpbC5oZWlnaHQ9WHYsdChlKX0sSnYpLEh2PWZ1bmN0aW9uKCl7aGcoR3YpLGUuZGV0YWlsLmhlaWdodD1Ydix0KGUpfTtlLmRldGFpbC5oZWlnaHQ9WHZ9dChlKX0oYSxmdW5jdGlvbihlKXtpLmRpc3BhdGNoRXZlbnQobyxlKX0pOmkuZGlzcGF0Y2hFdmVudChvLGEpfX0pfTt2YXIgWnY9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5wYWdlSWQ9ZSx0aGlzLnBhZ2VQYXRoPXQsdGhpcy5wYWdlUXVlcnk9bix0aGlzLnBhZ2VWbT1yLHRoaXMuYmF0Y2hEYXRhPVtdLHRoaXMudm1zPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLnBhZ2VDcmVhdGVEYXRhPSExLHRoaXMuZWxlbWVudHM9W10sdGhpcy5faW5pdCgpfTtmdW5jdGlvbiBRdihlLHQsbil7ZVt0XT1ufWZ1bmN0aW9uIGVnKGUsdCl7dmFyIG4scixpO2ZvcihyIGluIGUpaT1lW3JdLGIodFtyXSxpKXx8UXYobnx8KG49T2JqZWN0LmNyZWF0ZShudWxsKSkscixpKTtyZXR1cm4gbn1mdW5jdGlvbiB0ZyhlLHQsbil7dmFyIHIsaSxvO2ZvcihyIGluIGUpaWYoaT1lW3JdLG89dFtyXSl7dmFyIGE9ZWcoaSxvKTthJiZRdihuLHIsYSl9ZWxzZSBRdihuLHIsaSk7cmV0dXJuIG59ZnVuY3Rpb24gbmcobixyKXt2YXIgZT1yLiRvcHRpb25zLm1wT3B0aW9ucztyZXR1cm4gZSYmQXJyYXkuaXNBcnJheShlLmV4dGVybmFsQ2xhc3NlcykmJmUuZXh0ZXJuYWxDbGFzc2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9clttKGUpXTt0JiYobj1uLnJlcGxhY2UoZSx0KSl9KSxufWZ1bmN0aW9uIHJnKGUsdCxuKXtzd2l0Y2godCl7Y2FzZSBmYTpuPW5nKHRoaXMuXyRzdHJpbmdpZnlDbGFzcyhuKSx0aGlzKTticmVhaztjYXNlIGhhOm49bmcobix0aGlzKTticmVhaztjYXNlIHBhOm49dGhpcy5fJG5vcm1hbGl6ZVN0eWxlQmluZGluZyhuKTticmVhaztjYXNlIHVhOmNhc2UgZGE6Y2FzZSBsYTpuPW4/MTowO2JyZWFrO2Nhc2UgY2E6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fJG5ld0RhdGFbZV18fCh0aGlzLl8kbmV3RGF0YVtlXT17fSkscj1uW2NhXXx8KG5bY2FdPVtdKTtpZih0LmZvckl0ZW1zKXJldHVybiB0LmZpbGwmJmZ1bmN0aW9uKGUsdCl7dmFyIG4scjtpZihBcnJheS5pc0FycmF5KGUpfHwic3RyaW5nIj09dHlwZW9mIGUpZm9yKG49MCxyPWUubGVuZ3RoO248cjtuKyspdFtuXT1uO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlKWZvcihuPTA7bjxlO24rKyl0W25dPW47ZWxzZSBpZihkKGUpKWZvcihuPTAscj1PYmplY3Qua2V5cyhlKS5sZW5ndGg7bjxyO24rKyl0W25dPW59KHQuZm9ySXRlbXMsciksdC5mb3JJdGVtczt2YXIgaT10LmZvckluZGV4LG89dC5rZXk7ayh0LCJrZXlJbmRleCIpPygib2JqZWN0IiE9dHlwZW9mIHJbaV0mJihyW2ldPXt9KSxyW2ldWyJrIit0LmtleUluZGV4XT1vKTpyW2ldPW87cmV0dXJuIG99LmNhbGwodGhpcyxlLG4pO2Nhc2UiaXMiOiJmdW5jdGlvbiI9PXR5cGVvZiBuJiYobj1uLm9wdGlvbnMpfXJldHVybih0aGlzLl8kbmV3RGF0YVtlXXx8KHRoaXMuXyRuZXdEYXRhW2VdPXt9KSlbdF09bn1adi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG49dGhpcztlPXRoaXMucGFnZUlkLHQ9ZnVuY3Rpb24oZSl7dmFyIHI7cj1uLGUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lWzBdLG49ZVsxXTtLdlt0XShuLHIpfSl9LChTdltlXXx8KFN2W2VdPVtdKSkucHVzaCh0KX0sWnYucHJvdG90eXBlLmFkZE1vdW50ZWRWbT1mdW5jdGlvbihlKXtlLl8kbW91bnRlZCgpLHRoaXMuYWRkVmRTeW5jQ2FsbGJhY2soZnVuY3Rpb24oKXtlLl9fY2FsbF9ob29rKCJtb3VudGVkIil9KX0sWnYucHJvdG90eXBlLmFkZFVwZGF0ZWRWbT1mdW5jdGlvbihlKXtlLl8kdXBkYXRlZCgpLHRoaXMuYWRkVmRTeW5jQ2FsbGJhY2soZnVuY3Rpb24oKXtlLl9fY2FsbF9ob29rKCJ1cGRhdGVkIil9KX0sWnYucHJvdG90eXBlLmFkZFZkU3luY0NhbGxiYWNrPWZ1bmN0aW9uKGUpe0MoZSkmJlR2LnB1c2goZSl9LFp2LnByb3RvdHlwZS5nZXRWbT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy52bXNbZV19LFp2LnByb3RvdHlwZS5hZGRWbT1mdW5jdGlvbihlKXt2YXIgbj1lLl8kaWQsdD10aGlzLnZtc1tuXTtpZih0KXt2YXIgcj1Xdih0LHQuJHBhcmVudCxZYSk7dC5fJGlkPXIsdGhpcy52bXNbcl09dCx0aGlzLmVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jaWQ7ZS5jaWQ9dD09PW4/cjp0fSl9dGhpcy52bXNbbl09ZX0sWnYucHJvdG90eXBlLnJlbW92ZVZtPWZ1bmN0aW9uKGUpe3ZhciB0PWUuXyRpZDtlPT09dGhpcy52bXNbdF0mJih0aGlzLmJhdGNoRGF0YT10aGlzLmJhdGNoRGF0YS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV1bMF0hPT10fSksZGVsZXRlIHRoaXMudm1zW3RdKX0sWnYucHJvdG90eXBlLmFkZEVsZW1lbnQ9ZnVuY3Rpb24oZSl7LTE9PT10aGlzLmVsZW1lbnRzLmluZGV4T2YoZSkmJnRoaXMuZWxlbWVudHMucHVzaChlKX0sWnYucHJvdG90eXBlLnJlbW92ZUVsZW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5lbGVtZW50cy5pbmRleE9mKGUpOy0xIT09dCYmdGhpcy5lbGVtZW50cy5zcGxpY2UodCwxKX0sWnYucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9W3Qsbl07ciYmaS5wdXNoKHIpLHRoaXMuYmF0Y2hEYXRhLnB1c2goW2UsaV0pfSxadi5wcm90b3R5cGUuZmluZD1mdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmJhdGNoRGF0YS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlWzBdPT09dCYmZVsxXVswXT09PW59KX0sWnYucHJvdG90eXBlLnNlbmRQYWdlQ3JlYXRlPWZ1bmN0aW9uKGUpe3RoaXMucGFnZUNyZWF0ZURhdGE9ZSxmZy5wdWJsaXNoSGFuZGxlcihLYSx7ZGF0YTpbWzIsZV1dLG9wdGlvbnM6e3RpbWVzdGFtcDpEYXRlLm5vdygpfX0sW3RoaXMucGFnZUlkXSl9LFp2LnByb3RvdHlwZS5mbHVzaD1mdW5jdGlvbigpe3RoaXMuaW5pdGlhbGl6ZWR8fCh0aGlzLmluaXRpYWxpemVkPSEwLHRoaXMuYmF0Y2hEYXRhLnB1c2goWzEwLFt0aGlzLnBhZ2VJZCx0aGlzLnBhZ2VQYXRoLHRoaXMucGFnZVF1ZXJ5XV0pKTt2YXIgZT10aGlzLmJhdGNoRGF0YS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuISg2PT09ZVswXSYmIU9iamVjdC5rZXlzKGVbMV1bMV0pLmxlbmd0aCl9KTt0aGlzLmJhdGNoRGF0YS5sZW5ndGg9MCxlLmxlbmd0aD9mZy5wdWJsaXNoSGFuZGxlcihLYSx7ZGF0YTplLG9wdGlvbnM6e3RpbWVzdGFtcDpEYXRlLm5vdygpfX0sW3RoaXMucGFnZUlkXSk6T3YoKX0sWnYucHJvdG90eXBlLnJlc3RvcmVQYWdlQ3JlYXRlPWZ1bmN0aW9uKCl7dGhpcy5iYXRjaERhdGEucHVzaChbMix0aGlzLnBhZ2VDcmVhdGVEYXRhXSl9LFp2LnByb3RvdHlwZS5yZXN0b3JlTW91bnRlZERhdGE9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZnVuY3Rpb24oZSl7ZS5fJGlkJiZ0LnB1c2goNCxlLl8kaWQsZS5fJGRhdGEsdm9pZCAwKSxlLiRjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBuKGUpfSl9O24odGhpcy5wYWdlVm0pfSxadi5wcm90b3R5cGUucmVzdG9yZVBhZ2VDcmVhdGVkPWZ1bmN0aW9uKCl7dGhpcy5iYXRjaERhdGEucHVzaChbMTAsW3RoaXMucGFnZUlkLHRoaXMucGFnZVBhdGgsdGhpcy5wYWdlUXVlcnldXSl9LFp2LnByb3RvdHlwZS5yZXN0b3JlPWZ1bmN0aW9uKCl7dGhpcy5pbml0aWFsaXplZD0hMCx0aGlzLmJhdGNoRGF0YS5sZW5ndGg9MCx0aGlzLnJlc3RvcmVQYWdlQ3JlYXRlKCksdGhpcy5yZXN0b3JlTW91bnRlZERhdGEoKSx0aGlzLnJlc3RvcmVQYWdlQ3JlYXRlZCgpLHRoaXMuZmx1c2goKX0sWnYucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZTt0aGlzLmJhdGNoRGF0YS5sZW5ndGg9MCx0aGlzLnZtcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5lbGVtZW50cy5sZW5ndGg9MCxlPXRoaXMucGFnZUlkLGRlbGV0ZSBTdltlXX07dmFyIGlnPVsib25MYXVuY2giLCJvblNob3ciLCJvbkhpZGUiLCJvblVuaU5WaWV3TWVzc2FnZSIsIm9uUGFnZU5vdEZvdW5kIiwib25UaGVtZUNoYW5nZSIsIm9uRXJyb3IiLCJvblVuaGFuZGxlZFJlamVjdGlvbiIsIm9uSW5pdCIsIm9uTG9hZCIsIm9uUmVhZHkiLCJvblVubG9hZCIsIm9uUHVsbERvd25SZWZyZXNoIiwib25SZWFjaEJvdHRvbSIsIm9uVGFiSXRlbVRhcCIsIm9uQWRkVG9GYXZvcml0ZXMiLCJvblNoYXJlVGltZWxpbmUiLCJvblNoYXJlQXBwTWVzc2FnZSIsIm9uUmVzaXplIiwib25QYWdlU2Nyb2xsIiwib25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwIiwib25CYWNrUHJlc3MiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Rm9jdXNDaGFuZ2VkIiwib25QYWdlU2hvdyIsIm9uUGFnZUhpZGUiLCJvblBhZ2VSZXNpemUiLCJvblNlcnZpY2VDcmVhdGVkIiwib25TZXJ2aWNlQXR0YWNoZWQiXSxvZz1bImRhdGEiLCJwcm9wZXJ0aWVzIiwib3B0aW9ucyIsInJlbGF0aW9ucyJdO2Z1bmN0aW9uIGFnKGksbyl7dmFyIGUsdDtvZy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0LG4scjt0PWksKG49bylbcj1lXSYmT2JqZWN0LmFzc2lnbih0W3JdfHwodFtyXT17fSksbltyXSl9KSxvLmV4dGVybmFsQ2xhc3NlcyYmKGU9aS5leHRlcm5hbENsYXNzZXN8fChpLmV4dGVybmFsQ2xhc3Nlcz1bXSksdD1vLmV4dGVybmFsQ2xhc3NlcyxlLnB1c2guYXBwbHkoZSx0KSksby5wYXRoJiYoaS5wYXRoPW8ucGF0aCl9ZnVuY3Rpb24gc2coZyl7IWZ1bmN0aW9uKGUpe3ZhciBpPWUuZXh0ZW5kO2UuZXh0ZW5kPWZ1bmN0aW9uKHQpe3ZhciBuPSh0PXR8fHt9KS5tZXRob2RzO24mJk9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7LTEhPT1pZy5pbmRleE9mKGUpJiYodFtlXT1uW2VdLGRlbGV0ZSBuW2VdKX0pO3ZhciBlPXQuc2V0dXA7aWYoZSl7dmFyIHI9IiI7dHJ5e3I9ZS50b1N0cmluZygpfWNhdGNoKGUpe31bIm9uUGFnZVNjcm9sbCIsIm9uUmVhY2hCb3R0b20iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IuaW5kZXhPZigidW5pQXBwLiIrZSkmJiF0W2VdJiYodFtlXT1bZnVuY3Rpb24oKXt9XSl9KX1yZXR1cm4gaS5jYWxsKHRoaXMsdCl9O3ZhciB0PWUuY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llcyxuPXQuY3JlYXRlZDtpZy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09bn0pLHQubXBPcHRpb25zPWZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuIHQ7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gYWcobixlKSx0JiZhZyhuLHQpLG59fShnKSxnLm1peGluKHtiZWZvcmVDcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy4kb3B0aW9ucztlLnN0b3JlJiYhZy5wcm90b3R5cGUuJHN0b3JlJiYoZy5wcm90b3R5cGUuJHN0b3JlPWUuc3RvcmUpO3ZhciBuLHIsaSxvLGEscyxjLHUsbCxkLGY9ZS53eHM7aWYoZiYmT2JqZWN0LmtleXMoZikuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWZbZV19KSwicGFnZSI9PT10aGlzLm1wVHlwZSl7dmFyIHA9YmcoKTtwLiR2bSYmcC4kdm0uJGkxOG4mJih0aGlzLl9pMThuPXAuJHZtLiRpMThuKSx0aGlzLiRzY29wZT10aGlzLiRvcHRpb25zLnBhZ2VJbnN0YW5jZSxkZWxldGUodGhpcy4kc2NvcGUuJHZtPXRoaXMpLiRvcHRpb25zLnBhZ2VJbnN0YW5jZTt2YXIgaD10aGlzLiRzY29wZS5yb3V0ZSx2PXRoaXMuJHNjb3BlLiRwYWdlLmlkO3RoaXMuXyR2ZC5zZW5kUGFnZUNyZWF0ZShbdixoLChuPXRoaXMscj1oLGk9Ii8iK3Isbz15Zy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1pfSksYT1PYmplY3QuYXNzaWduKHt9LG1nLndpbmRvdyxvLndpbmRvdykscz0hMD09PWEuZGlzYWJsZVNjcm9sbD8xOjAsYz1rKGEsIm9uUmVhY2hCb3R0b21EaXN0YW5jZSIpP3BhcnNlSW50KGEub25SZWFjaEJvdHRvbURpc3RhbmNlKTphYSx1PUZ1KG4uJG9wdGlvbnMsIm9uUGFnZVNjcm9sbCIpPzE6MCxsPUZ1KG4uJG9wdGlvbnMsIm9uUmVhY2hCb3R0b20iKT8xOjAsZD1IYSgpLHt2ZXJzaW9uOllhLGxvY2FsZTpsZy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0TGFuZ3VhZ2UoKSxkaXNhYmxlU2Nyb2xsOnMsb25QYWdlU2Nyb2xsOnUsb25QYWdlUmVhY2hCb3R0b206bCxvblJlYWNoQm90dG9tRGlzdGFuY2U6YyxzdGF0dXNiYXJIZWlnaHQ6ZCx3aW5kb3dUb3A6YS50aXRsZU5WaWV3JiYiZmxvYXQiPT09YS50aXRsZU5WaWV3LnR5cGU/ZCtydDowLHdpbmRvd0JvdHRvbTowPD1Icy5pbmRleE9mKHIpJiZIcy5jb3Zlcj9Icy5oZWlnaHQ6MH0pXSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJih5dih0aGlzLiRzY29wZSwib25Mb2FkIixmdW5jdGlvbihuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9e307cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24odCl7dHJ5e3JbdF09QShuW3RdKX1jYXRjaChlKXtyW3RdPW5bdF19fSkscn0odGhpcy4kb3B0aW9ucy5wYWdlUXVlcnkpKSx5dih0aGlzLiRzY29wZSwib25TaG93IikpfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJnl2KHRoaXMuJHNjb3BlLCJvblVubG9hZCIpfSxtb3VudGVkOmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJih5dih0aGlzLiRzY29wZSwib25SZWFkeSIpLGZ1bmN0aW9uKGUpe2lmKG1nLnByZWxvYWRSdWxlKXt2YXIgdD1tZy5wcmVsb2FkUnVsZVtlXTt0JiZBcnJheS5pc0FycmF5KHQucGFja2FnZXMpJiZ0LnBhY2thZ2VzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4tMT09PWtzLmluZGV4T2YoZSl9KS5sZW5ndGgmJkNzKHQucGFja2FnZXMpfX0odGhpcy4kc2NvcGUucm91dGUpKX19KX12YXIgY2c9e2luc3RhbGw6ZnVuY3Rpb24obyxlKXt2YXIgdCxuOyFmdW5jdGlvbihvKXtvLmNvbmZpZy5lcnJvckhhbmRsZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXAoZSk7by51dGlsLndhcm4oIkVycm9yIGluICIrbisnOiAiJysoIkVycm9yIj09PXI/ZS50b1N0cmluZygpOmUpKyciJyx0KTt2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgYmcmJmJnKCk7aSYmRnUoaS4kb3B0aW9ucywib25FcnJvciIpP2kuX19jYWxsX2hvb2soIm9uRXJyb3IiLGUpOmNvbnNvbGUuZXJyb3IoZSl9O3ZhciB0PW8uY29uZmlnLmlzUmVzZXJ2ZWRUYWc7by5jb25maWcuaXNSZXNlcnZlZFRhZz1mdW5jdGlvbihlKXtyZXR1cm4tMSE9PVV2LmluZGV4T2YoZSl8fHQoZSl9LG8uY29uZmlnLmlnbm9yZWRFbGVtZW50cz1Vdjt2YXIgbj1vLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2Uscj1bInN3aXRjaCIsImltYWdlIiwidGV4dCIsInZpZXciXTtvLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIX5yLmluZGV4T2YoZSkmJm4oZSl9fShvKSwodD1vKS5wcm90b3R5cGUuXyRzPXJnLHQucHJvdG90eXBlLl8kc2V0RGF0YT1mdW5jdGlvbihlLHQpe3RoaXMuXyR2ZC5wdXNoKGUsdGhpcy5fJGlkLHQsND09PWUmJnZvaWQgMCl9LHQucHJvdG90eXBlLl8kbW91bnRlZD1mdW5jdGlvbigpe3RoaXMuXyR2ZCYmKHRnKHRoaXMuXyRuZXdEYXRhLHRoaXMuXyRkYXRhLHRoaXMuXyR2ZE1vdW50ZWREYXRhKSx0aGlzLl8kZGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuXyRuZXdEYXRhKSksInBhZ2UiPT09dGhpcy5tcFR5cGUmJnRoaXMuXyR2ZC5mbHVzaCgpKX0sdC5wcm90b3R5cGUuXyR1cGRhdGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl8kdmQmJih0Zyh0aGlzLl8kbmV3RGF0YSx0aGlzLl8kZGF0YSx0aGlzLl8kdmRVcGRhdGVkRGF0YSksdGhpcy5fJGRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLl8kbmV3RGF0YSkpLHRoaXMuXyR2ZC5pbml0aWFsaXplZCYmcGcoZnVuY3Rpb24oKXtlLiRuZXh0VGljayhlLl8kdmQuZmx1c2guYmluZChlLl8kdmQpKX0sMCkpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIl8kdmQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm9vdC5fJHZkb21TeW5jfX0pLHQubWl4aW4oe2JlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe3RoaXMuJG9wdGlvbnMubXBUeXBlJiYodGhpcy5tcFR5cGU9dGhpcy4kb3B0aW9ucy5tcFR5cGUpLCJhcHAiIT09dGhpcy5tcFR5cGUmJigicGFnZSI9PT10aGlzLm1wVHlwZSYmKHRoaXMuXyR2ZG9tU3luYz1uZXcgWnYodGhpcy4kb3B0aW9ucy5wYWdlSWQsdGhpcy4kb3B0aW9ucy5wYWdlUGF0aCx0aGlzLiRvcHRpb25zLnBhZ2VRdWVyeSx0aGlzKSksdGhpcy5fJHZkJiYodGhpcy5fJGlkPVd2KHRoaXMsdGhpcy4kcGFyZW50LFlhKSx0aGlzLl8kdmQuYWRkVm0odGhpcyksdGhpcy5fJHZkTW91bnRlZERhdGE9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl8kc2V0RGF0YSg0LHRoaXMuXyR2ZE1vdW50ZWREYXRhKSx0aGlzLl8kZGF0YT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuXyRuZXdEYXRhPU9iamVjdC5jcmVhdGUobnVsbCkpKX0sYmVmb3JlVXBkYXRlOmZ1bmN0aW9uKCl7aWYodGhpcy5fJHZkKXt2YXIgZT10aGlzLl8kdmQuZmluZCg0LHRoaXMuXyRpZCk7ZT8odGhpcy5fJGRhdGE9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl8kdmRVcGRhdGVkRGF0YT1lWzFdWzFdPU9iamVjdC5jcmVhdGUobnVsbCkpOih0aGlzLl8kdmRVcGRhdGVkRGF0YT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuXyRzZXREYXRhKDYsdGhpcy5fJHZkVXBkYXRlZERhdGEpKSx0aGlzLl8kbmV3RGF0YT1PYmplY3QuY3JlYXRlKG51bGwpfX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuXyR2ZCYmKHRoaXMuXyR2ZC5yZW1vdmVWbSh0aGlzKSx0aGlzLl8kdmRvbVN5bmMmJnRoaXMuXyR2ZG9tU3luYy5kZXN0cm95KCkpfX0pLHNnKG8pLHF2KG8pLChuPW8pLnByb3RvdHlwZS51bmlJREhhc1JvbGU9ZnVuY3Rpb24oZSl7cmV0dXJuLTE8YygpLnJvbGUuaW5kZXhPZihlKX0sbi5wcm90b3R5cGUudW5pSURIYXNQZXJtaXNzaW9uPWZ1bmN0aW9uKGUpe3ZhciB0PWMoKS5wZXJtaXNzaW9uO3JldHVybiB0aGlzLnVuaUlESGFzUm9sZSgiYWRtaW4iKXx8LTE8dC5pbmRleE9mKGUpfSxuLnByb3RvdHlwZS51bmlJRFRva2VuVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLnRva2VuRXhwaXJlZD5EYXRlLm5vdygpfSxvLnByb3RvdHlwZS5nZXRPcGVuZXJFdmVudENoYW5uZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsfHwodGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsPW5ldyBCdSksdGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoby5wcm90b3R5cGUsIiRwYWdlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJvb3QuJHNjb3BlLiRwYWdlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwiJG1wIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue3BhZ2U6dGhpcy4kcm9vdC4kc2NvcGV9fX0pO3ZhciByPW8ucHJvdG90eXBlLiRtb3VudDtvLnByb3RvdHlwZS4kbW91bnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKCJhcHAiPT09dGhpcy5tcFR5cGUpe2lmKHRoaXMuJG9wdGlvbnMucmVuZGVyPWZ1bmN0aW9uKCl7fSxsZy5jb25maWcucHJlbG9hZClyZXR1cm4gdm9pZCBsZy5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLmFkZEV2ZW50TGlzdGVuZXIoImxhdW5jaEFwcCIsZnVuY3Rpb24oKXtkZy51cGRhdGVDb25maWdJbmZvJiZkZy51cGRhdGVDb25maWdJbmZvKCksRnYobixvKSxyLmNhbGwobixlLHQpfSk7RnYodGhpcyxvKX1yZXR1cm4gci5jYWxsKHRoaXMsZSx0KX0sby5wcm90b3R5cGUuJG5leHRUaWNrPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMscj10aGlzLl93YXRjaGVyLGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQsZT1uZXcgUHJvbWlzZShmdW5jdGlvbihlKXtyJiZuLl8kcXVldWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gcj09PWV9KT9Udi5wdXNoKGk/dC5iaW5kKG4pOmUpOm8ubmV4dFRpY2soaT9mdW5jdGlvbigpe3JldHVybiB0LmNhbGwobil9OmUpLGkmJmUoKX0pO3JldHVybiBpP3ZvaWQgMDplfX19O3JldHVybiB2di5fXyR3eF9fPWd2LGZnLnB1Ymxpc2hIYW5kbGVyPWZ1bmN0aW9uKGUsdCxuKXt0PUpTT04uc3RyaW5naWZ5KHQpLEFycmF5LmlzQXJyYXkobil8fChuPVtuXSk7dmFyIHI9InR5cGVvZiBVbmlWaWV3SlNCcmlkZ2UgIT09ICd1bmRlZmluZWQnICYmIFVuaVZpZXdKU0JyaWRnZS5zdWJzY3JpYmVIYW5kbGVyKFwiIitlKyciLCcrdCsiLF9fUEFHRV9JRF9fKSI7bi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWRnLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoU3RyaW5nKGUpKTt0JiZ0LmV2YWxKUyhyLnJlcGxhY2UoIl9fUEFHRV9JRF9fIixlKSl9KX0sZmcuaW52b2tlQ2FsbGJhY2tIYW5kbGVyPVJyLGZnLnJlbW92ZUNhbGxiYWNrSGFuZGxlcj1mdW5jdGlvbihlKXtkZWxldGUgQnJbZV19LHtfX3Z1ZVBsdWdpbjpjZyxfX2RlZmluZVBhZ2U6ZnVuY3Rpb24oZSx0KXtic1tlXT10fSxfX3JlZ2lzdGVyQXBwOkZ2LF9fcmVnaXN0ZXJQYWdlOk5zLHVuaTp2dixnZXRBcHA6THYsZ2V0Q3VycmVudFBhZ2VzOmpzLEV2ZW50Q2hhbm5lbDpCdX19KCksX2c9dC51bmksYmc9dC5nZXRBcHAsd2c9dC5nZXRDdXJyZW50UGFnZXM7cmV0dXJuIHR9ZnVuY3Rpb24gaW5pdEdldExvY2F0aW9uQmVmb3JlKGUpe29sZEdldExvY2F0aW9uPWUuZ2V0TG9jYXRpb259ZnVuY3Rpb24gaW5pdEdldExvY2F0aW9uQWZ0ZXIoZSl7cmV3cml0ZUdldExvY2F0aW9uKGUpfWZ1bmN0aW9uIHJld3JpdGVHZXRMb2NhdGlvbihuKXt2YXIgZT1uLmdldExvY2F0aW9uO2UhPT1vbGRHZXRMb2NhdGlvbiYmKG4uZ2V0TG9jYXRpb249ZnVuY3Rpb24odCl7aWYoIXQudHlwZXx8ImdjajAyIiE9PXQudHlwZSlyZXR1cm4gb2xkR2V0TG9jYXRpb24odCk7dHJ5e3JldHVybiBlKHQpfWNhdGNoKGUpe3JldHVybiBuLmdldExvY2F0aW9uPW9sZEdldExvY2F0aW9uLG4uZ2V0TG9jYXRpb24odCl9fSl9ZnVuY3Rpb24gaW5pdFVuaUV4dEFwaXNCZWZvcmUoZSl7aW5pdEdldExvY2F0aW9uQmVmb3JlKGUpfWZ1bmN0aW9uIGluaXRVbmlFeHRBcGlzQWZ0ZXIoZSl7aW5pdEdldExvY2F0aW9uQWZ0ZXIoZSl9ZnVuY3Rpb24gY2hvb3NlTWVkaWEoZSl7ZS5yZWdpc3RlclVUU0ludGVyZmFjZSxlLmluaXRVVFNQcm94eUNsYXNzO3ZhciB0PWUuaW5pdFVUU1Byb3h5RnVuY3Rpb24sbj1lLmluaXRVVFNQYWNrYWdlTmFtZSxyPWUuaW5pdFVUU0luZGV4Q2xhc3NOYW1lLGk9KGUuaW5pdFVUU0NsYXNzTmFtZSwiRENsb3VkVW5pQ2hvb3NlTWVkaWEiKSxvPW4oaSwhMCksYT1yKGksITApO2UuY2hvb3NlTWVkaWE9dCghMSx7bW9kdWxlTmFtZToidW5pLWNob29zZU1lZGlhIixtb2R1bGVUeXBlOiJidWlsdC1pbiIsZXJyTXNnOiIiLG1haW46ITAscGFja2FnZTpvLGNsYXNzOmEsbmFtZToiY2hvb3NlTWVkaWFCeUpzIixrZWVwQWxpdmU6ITEscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUNob29zZU1lZGlhQ2hvb3NlTWVkaWFPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46IiJ9KX1mdW5jdGlvbiBjcmVhdGVSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyKGUpe3ZhciB0PWUucmVnaXN0ZXJVVFNJbnRlcmZhY2Usbj0oZS5pbml0VVRTUHJveHlDbGFzcyxlLmluaXRVVFNQcm94eUZ1bmN0aW9uKSxyPWUuaW5pdFVUU1BhY2thZ2VOYW1lLGk9ZS5pbml0VVRTSW5kZXhDbGFzc05hbWUsbz1lLmluaXRVVFNDbGFzc05hbWUsYT0iRENsb3VkVW5pQ3JlYXRlUmVxdWVzdFBlcm1pc3Npb25MaXN0ZW5lciIscz0idW5pLWNyZWF0ZVJlcXVlc3RQZXJtaXNzaW9uTGlzdGVuZXIiLGM9cihhLCEwKSx1PWkoYSwhMCk7dCgiUmVxdWVzdFBlcm1pc3Npb25MaXN0ZW5lck9wdGlvbnMiLE9iamVjdC5hc3NpZ24oe21vZHVsZU5hbWU6cyxtb2R1bGVUeXBlOiJidWlsdC1pbiIsZXJyTXNnOiIiLHBhY2thZ2U6YyxjbGFzczpvKGEsIlJlcXVlc3RQZXJtaXNzaW9uTGlzdGVuZXJCeUpzUHJveHkiLCEwKX0se21ldGhvZHM6e29uUmVxdWVzdEJ5SnM6e2FzeW5jOiExLGtlZXBBbGl2ZTohMSxwYXJhbXM6W3tuYW1lOiJjYWxsYmFjayIsdHlwZToiVVRTQ2FsbGJhY2sifV19LG9uQ29uZmlybUJ5SnM6e2FzeW5jOiExLGtlZXBBbGl2ZTohMSxwYXJhbXM6W3tuYW1lOiJjYWxsYmFjayIsdHlwZToiVVRTQ2FsbGJhY2sifV19LG9uQ29tcGxldGVCeUpzOnthc3luYzohMSxrZWVwQWxpdmU6ITEscGFyYW1zOlt7bmFtZToiY2FsbGJhY2siLHR5cGU6IlVUU0NhbGxiYWNrIn1dfSxzdG9wQnlKczp7YXN5bmM6ITEsa2VlcEFsaXZlOiExLHBhcmFtczpbXX19LHByb3BzOltdLHNldHRlcnM6e319KSksZS5jcmVhdGVSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyPW4oITEse21vZHVsZU5hbWU6cyxtb2R1bGVUeXBlOiJidWlsdC1pbiIsZXJyTXNnOiIiLG1haW46ITAscGFja2FnZTpjLGNsYXNzOnUsbmFtZToiY3JlYXRlUmVxdWVzdFBlcm1pc3Npb25MaXN0ZW5lckJ5SnMiLGtlZXBBbGl2ZTohMSxwYXJhbXM6W10scmV0dXJuOnt0eXBlOiJpbnRlcmZhY2UiLG9wdGlvbnM6IlJlcXVlc3RQZXJtaXNzaW9uTGlzdGVuZXJPcHRpb25zIn19KX1mdW5jdGlvbiBleGl0KGUpe2UucmVnaXN0ZXJVVFNJbnRlcmZhY2UsZS5pbml0VVRTUHJveHlDbGFzczt2YXIgdD1lLmluaXRVVFNQcm94eUZ1bmN0aW9uLG49ZS5pbml0VVRTUGFja2FnZU5hbWUscj1lLmluaXRVVFNJbmRleENsYXNzTmFtZSxpPShlLmluaXRVVFNDbGFzc05hbWUsIkRDbG91ZFVuaUV4aXQiKSxvPW4oaSwhMCksYT1yKGksITApO2UuZXhpdD10KCExLHttb2R1bGVOYW1lOiJ1bmktZXhpdCIsbW9kdWxlVHlwZToiYnVpbHQtaW4iLGVyck1zZzoiIixtYWluOiEwLHBhY2thZ2U6byxjbGFzczphLG5hbWU6ImV4aXRCeUpzIixrZWVwQWxpdmU6ITEscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUV4aXRFeGl0T3B0aW9uc0pTT05PYmplY3QiLGRlZmF1bHQ6IlVUU051bGwifV0scmV0dXJuOiIifSl9ZnVuY3Rpb24gZmFjaWFsVmVyaWZ5KGUpe2UucmVnaXN0ZXJVVFNJbnRlcmZhY2UsZS5pbml0VVRTUHJveHlDbGFzczt2YXIgdD1lLmluaXRVVFNQcm94eUZ1bmN0aW9uLG49ZS5pbml0VVRTUGFja2FnZU5hbWUscj1lLmluaXRVVFNJbmRleENsYXNzTmFtZSxpPShlLmluaXRVVFNDbGFzc05hbWUsIkRDbG91ZFVuaUZhY2lhbFZlcmlmeSIpLG89IkZhY2lhbFJlY29nbml0aW9uVmVyaWZ5KOWunuS6uuiupOivgSkiLGE9bihpLCEwKSxzPXIoaSwhMCk7ZS5zdGFydEZhY2lhbFJlY29nbml0aW9uVmVyaWZ5PXQoITEse21vZHVsZU5hbWU6byxtb2R1bGVUeXBlOiJidWlsdC1pbiIsZXJyTXNnOiIiLG1haW46ITAscGFja2FnZTphLGNsYXNzOnMsbmFtZToic3RhcnRGYWNpYWxSZWNvZ25pdGlvblZlcmlmeUJ5SnMiLGtlZXBBbGl2ZTohMSxwYXJhbXM6W3tuYW1lOiJmYWNlU3R5bGUiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlGYWNpYWxWZXJpZnlTdGFydEZhY2lhbFJlY29nbml0aW9uVmVyaWZ5T3B0aW9uc0pTT05PYmplY3QifV0scmV0dXJuOiIifSksZS5nZXRGYWNpYWxSZWNvZ25pdGlvbk1ldGFJbmZvPXQoITEse21vZHVsZU5hbWU6byxtb2R1bGVUeXBlOiJidWlsdC1pbiIsZXJyTXNnOiIiLG1haW46ITAscGFja2FnZTphLGNsYXNzOnMsbmFtZToiZ2V0RmFjaWFsUmVjb2duaXRpb25NZXRhSW5mb0J5SnMiLGtlZXBBbGl2ZTohMSxwYXJhbXM6W10scmV0dXJuOiIifSl9ZnVuY3Rpb24gZ2V0TG9jYXRpb25UZW5jZW50VW5pMShlKXtlLnJlZ2lzdGVyVVRTSW50ZXJmYWNlLGUuaW5pdFVUU1Byb3h5Q2xhc3M7dmFyIHQ9ZS5pbml0VVRTUHJveHlGdW5jdGlvbixuPWUuaW5pdFVUU1BhY2thZ2VOYW1lLHI9ZS5pbml0VVRTSW5kZXhDbGFzc05hbWUsaT0oZS5pbml0VVRTQ2xhc3NOYW1lLCJEQ2xvdWRVbmlHZXRMb2NhdGlvblRlbmNlbnRVbmkxIiksbz1uKGksITApLGE9cihpLCEwKTtlLmdldExvY2F0aW9uPXQoITEse21vZHVsZU5hbWU6InVuaS1nZXRMb2NhdGlvbi10ZW5jZW50LXVuaTEiLG1vZHVsZVR5cGU6ImJ1aWx0LWluIixlcnJNc2c6IiIsbWFpbjohMCxwYWNrYWdlOm8sY2xhc3M6YSxuYW1lOiJnZXRMb2NhdGlvbkJ5SnMiLGtlZXBBbGl2ZTohMSxwYXJhbXM6W3tuYW1lOiJvcHRpb25zIix0eXBlOiJVVFNTREtNb2R1bGVzRENsb3VkVW5pR2V0TG9jYXRpb25UZW5jZW50VW5pMUdldExvY2F0aW9uT3B0aW9uc0pTT05PYmplY3QifV0scmV0dXJuOiIifSl9ZnVuY3Rpb24gaW5zdGFsbEFwayhlKXtlLnJlZ2lzdGVyVVRTSW50ZXJmYWNlLGUuaW5pdFVUU1Byb3h5Q2xhc3M7dmFyIHQ9ZS5pbml0VVRTUHJveHlGdW5jdGlvbixuPWUuaW5pdFVUU1BhY2thZ2VOYW1lLHI9ZS5pbml0VVRTSW5kZXhDbGFzc05hbWUsaT0oZS5pbml0VVRTQ2xhc3NOYW1lLCJEQ2xvdWRVbmlJbnN0YWxsQXBrIiksbz1uKGksITApLGE9cihpLCEwKTtlLmluc3RhbGxBcGs9dCghMSx7bW9kdWxlTmFtZToidW5pLWluc3RhbGxBcGsiLG1vZHVsZVR5cGU6ImJ1aWx0LWluIixlcnJNc2c6IiIsbWFpbjohMCxwYWNrYWdlOm8sY2xhc3M6YSxuYW1lOiJpbnN0YWxsQXBrQnlKcyIsa2VlcEFsaXZlOiExLHBhcmFtczpbe25hbWU6Im9wdGlvbnMiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlJbnN0YWxsQXBrSW5zdGFsbEFwa09wdGlvbnNKU09OT2JqZWN0In1dLHJldHVybjoiIn0pfWZ1bmN0aW9uIHByaXZhY3koZSl7ZS5yZWdpc3RlclVUU0ludGVyZmFjZSxlLmluaXRVVFNQcm94eUNsYXNzO3ZhciB0PWUuaW5pdFVUU1Byb3h5RnVuY3Rpb24sbj1lLmluaXRVVFNQYWNrYWdlTmFtZSxyPWUuaW5pdFVUU0luZGV4Q2xhc3NOYW1lLGk9KGUuaW5pdFVUU0NsYXNzTmFtZSwiRENsb3VkVW5pUHJpdmFjeSIpLG89InVuaS1wcml2YWN5IixhPSJidWlsdC1pbiIscz1uKGksITApLGM9cihpLCEwKTtlLmdldFByaXZhY3lTZXR0aW5nPXQoITEse21vZHVsZU5hbWU6byxtb2R1bGVUeXBlOmEsZXJyTXNnOiIiLG1haW46ITAscGFja2FnZTpzLGNsYXNzOmMsbmFtZToiZ2V0UHJpdmFjeVNldHRpbmdCeUpzIixrZWVwQWxpdmU6ITEscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaVByaXZhY3lHZXRQcml2YWN5U2V0dGluZ09wdGlvbnNKU09OT2JqZWN0In1dLHJldHVybjoiIn0pLGUucmVzZXRQcml2YWN5QXV0aG9yaXphdGlvbj10KCExLHttb2R1bGVOYW1lOm8sbW9kdWxlVHlwZTphLGVyck1zZzoiIixtYWluOiEwLHBhY2thZ2U6cyxjbGFzczpjLG5hbWU6InJlc2V0UHJpdmFjeUF1dGhvcml6YXRpb25CeUpzIixrZWVwQWxpdmU6ITEscGFyYW1zOltdLHJldHVybjoiIn0pLGUub25Qcml2YWN5QXV0aG9yaXphdGlvbkNoYW5nZT10KCExLHttb2R1bGVOYW1lOm8sbW9kdWxlVHlwZTphLGVyck1zZzoiIixtYWluOiEwLHBhY2thZ2U6cyxjbGFzczpjLG5hbWU6Im9uUHJpdmFjeUF1dGhvcml6YXRpb25DaGFuZ2VCeUpzIixrZWVwQWxpdmU6ITEscGFyYW1zOlt7bmFtZToiY2FsbGJhY2siLHR5cGU6IlVUU0NhbGxiYWNrIn1dLHJldHVybjoiIn0pLGUub2ZmUHJpdmFjeUF1dGhvcml6YXRpb25DaGFuZ2U9dCghMSx7bW9kdWxlTmFtZTpvLG1vZHVsZVR5cGU6YSxlcnJNc2c6IiIsbWFpbjohMCxwYWNrYWdlOnMsY2xhc3M6YyxuYW1lOiJvZmZQcml2YWN5QXV0aG9yaXphdGlvbkNoYW5nZUJ5SnMiLGtlZXBBbGl2ZTohMSxwYXJhbXM6W3tuYW1lOiJpZCIsdHlwZToibnVtYmVyIn1dLHJldHVybjoiIn0pfWZ1bmN0aW9uIHRoZW1lKGUpe2UucmVnaXN0ZXJVVFNJbnRlcmZhY2UsZS5pbml0VVRTUHJveHlDbGFzcyxlLmluaXRVVFNQcm94eUZ1bmN0aW9uLGUuaW5pdFVUU1BhY2thZ2VOYW1lLGUuaW5pdFVUU0luZGV4Q2xhc3NOYW1lLGUuaW5pdFVUU0NsYXNzTmFtZX1mdW5jdGlvbiBpbml0VW5pRXh0QXBpcyhlKXtpbml0VW5pRXh0QXBpc0JlZm9yZShlKSxjaG9vc2VNZWRpYShlKSxjcmVhdGVSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyKGUpLGV4aXQoZSksZmFjaWFsVmVyaWZ5KGUpLGdldExvY2F0aW9uVGVuY2VudFVuaTEoZSksaW5zdGFsbEFwayhlKSxwcml2YWN5KGUpLHRoZW1lKGUpLGluaXRVbmlFeHRBcGlzQWZ0ZXIoZSl9ZnVuY3Rpb24gaW5pdFNlcnZpY2VKU0JyaWRnZShlKXt2YXIgcj1uZXcgZTtVbmlTZXJ2aWNlSlNCcmlkZ2U9e29uOnIuJG9uLmJpbmQociksb2ZmOnIuJG9mZi5iaW5kKHIpLG9uY2U6ci4kb25jZS5iaW5kKHIpLGVtaXQ6ci4kZW1pdC5iaW5kKHIpLHN1YnNjcmliZTpmdW5jdGlvbihlLHQpe3JldHVybiByLiRvbigidmlldy4iK2UsdCl9LHVuc3Vic2NyaWJlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuJG9mZigidmlldy4iK2UsdCl9LHN1YnNjcmliZUhhbmRsZXI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByLiRlbWl0KCJ2aWV3LiIrZSx0LG4pfX19ZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VDb250ZXh0JDEoZSl7dmFyIHQsbj1lLndlZXgscj1lLlZ1ZSxpPW5ldyBlLldlZXhQbHVzKG4pOyhVbmlTZXJ2aWNlSlNCcmlkZ2V8fGluaXRTZXJ2aWNlSlNCcmlkZ2UociksdW5pKXx8KHQ9Y3JlYXRlU2VydmljZUNvbnRleHQocixuLGksVW5pU2VydmljZUpTQnJpZGdlLGUpLF9fdnVlUGx1Z2luPXQuX192dWVQbHVnaW4sX19kZWZpbmVQYWdlPXQuX19kZWZpbmVQYWdlLF9fcmVnaXN0ZXJBcHA9dC5fX3JlZ2lzdGVyQXBwLF9fcmVnaXN0ZXJQYWdlPXQuX19yZWdpc3RlclBhZ2UsdW5pPXQudW5pLGdldEFwcD10LmdldEFwcCxnZXRDdXJyZW50UGFnZXM9dC5nZXRDdXJyZW50UGFnZXMsaW5pdFVuaUV4dEFwaXModW5pKSk7cmV0dXJue19fdnVlUGx1Z2luOl9fdnVlUGx1Z2luLF9fZGVmaW5lUGFnZTpfX2RlZmluZVBhZ2UsX19yZWdpc3RlckFwcDpfX3JlZ2lzdGVyQXBwLF9fcmVnaXN0ZXJQYWdlOl9fcmVnaXN0ZXJQYWdlLHBsdXM6aSx1bmk6dW5pLHd4OnVuaS5fXyR3eF9ffHx1bmksZ2V0QXBwOmdldEFwcCxnZXRDdXJyZW50UGFnZXM6Z2V0Q3VycmVudFBhZ2VzLFVuaVNlcnZpY2VKU0JyaWRnZTpVbmlTZXJ2aWNlSlNCcmlkZ2V9fWZ1bmN0aW9uIHN0eWxlTWl4aW4oZSl7ZS5wcm90b3R5cGUuX19tZXJnZV9zdHlsZT1mdW5jdGlvbihyLGUpe2lmKHZvaWQgMD09PXImJihyPXt9KSxyKXt2YXIgaT1lfHx0aGlzLiRvcHRpb25zLnN0eWxlO09iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9aVtlXTtpZih0KXt2YXIgbj1yW2VdO09iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIGE9bltlXSxzPXRbZV07Im9iamVjdCI9PXR5cGVvZiBhPygib2JqZWN0IiE9dHlwZW9mIHMmJihzPXRbZV09e30pLE9iamVjdC5rZXlzKGEpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ITA7aWYoc1tlXSlmb3IodmFyIG49YVtlXS5zbGljZSgxLDMpLHI9c1tlXS5zbGljZSgxLDMpLGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89bltpXS1yW2ldO2lmKDAhPT1vKXt0PTA8bzticmVha319dCYmKHNbZV09YVtlXSl9KSk6dFtlXT1hfSl9ZWxzZSBpW2VdPU9iamVjdC5hc3NpZ24oe30scltlXSl9KSxlfHwodGhpcy4kb3B0aW9ucy5zdHlsZT1pKX19fWZ1bmN0aW9uIGI2NERlY29kZVVuaWNvZGUoZSl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChhdG9iKGUpLnNwbGl0KCIiKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIiUiKygiMDAiK2UuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC0yKX0pLmpvaW4oIiIpKX1mdW5jdGlvbiBnZXRDdXJyZW50VXNlckluZm8oKXt2YXIgZSx0PXRoaXMudW5pLmdldFN0b3JhZ2VTeW5jKCJ1bmlfaWRfdG9rZW4iKXx8IiIsbj10LnNwbGl0KCIuIik7aWYoIXR8fDMhPT1uLmxlbmd0aClyZXR1cm57dWlkOm51bGwscm9sZTpbXSxwZXJtaXNzaW9uOltdLHRva2VuRXhwaXJlZDowfTt0cnl7ZT1KU09OLnBhcnNlKGI2NERlY29kZVVuaWNvZGUoblsxXSkpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcigi6I635Y+W5b2T5YmN55So5oi35L+h5oGv5Ye66ZSZ77yM6K+m57uG6ZSZ6K+v5L+h5oGv5Li677yaIitlLm1lc3NhZ2UpfXJldHVybiBlLnRva2VuRXhwaXJlZD0xZTMqZS5leHAsZGVsZXRlIGUuZXhwLGRlbGV0ZSBlLmlhdCxlfWZ1bmN0aW9uIHVuaUlkTWl4aW4oZSxuKXtlLnByb3RvdHlwZS51bmlJREhhc1JvbGU9ZnVuY3Rpb24oZSl7cmV0dXJuLTE8Z2V0Q3VycmVudFVzZXJJbmZvLmJpbmQobikoKS5yb2xlLmluZGV4T2YoZSl9LGUucHJvdG90eXBlLnVuaUlESGFzUGVybWlzc2lvbj1mdW5jdGlvbihlKXt2YXIgdD1nZXRDdXJyZW50VXNlckluZm8uYmluZChuKSgpLnBlcm1pc3Npb247cmV0dXJuIHRoaXMudW5pSURIYXNSb2xlKCJhZG1pbiIpfHwtMTx0LmluZGV4T2YoZSl9LGUucHJvdG90eXBlLnVuaUlEVG9rZW5WYWxpZD1mdW5jdGlvbigpe3JldHVybiBnZXRDdXJyZW50VXNlckluZm8uYmluZChuKSgpLnRva2VuRXhwaXJlZD5EYXRlLm5vdygpfX1XZWV4SW5zdGFuY2UucHJvdG90eXBlLnJlcXVpcmVNb2R1bGU9ZnVuY3Rpb24obil7dmFyIHI9Z2V0SWQodGhpcyk7aWYociYmdGhpcy5kb2N1bWVudCYmdGhpcy5kb2N1bWVudC50YXNrQ2VudGVyKXtpZihpc1JlZ2lzdGVyZWRNb2R1bGUobikpe3ZhciBlPXt9LHQ9Z2V0TW9kdWxlRGVzY3JpcHRpb24obiksaT1mdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlTW9kdWxlR2V0dGVyKG4sdCxtb2R1bGVHZXR0ZXIocixuLHQpKX0sc2V0OmZ1bmN0aW9uKGUpe3JldHVybiBtb2R1bGVTZXR0ZXIocixuLHQsZSl9fSl9O2Zvcih2YXIgbyBpbiB0KWkobyk7cmV0dXJuIGV9Y29uc29sZS53YXJuKCJbSlMgRnJhbWV3b3JrXSDlvZPliY3ov5DooYznmoTln7rluqfkuI3ljIXlkKvljp/nlJ/mj5Lku7ZbIituKyJd77yM6K+35ZyobWFuaWZlc3TkuK3phY3nva7or6Xmj5Lku7bvvIzph43mlrDliLbkvZzljIXmi6zor6Xljp/nlJ/mj5Lku7bnmoToh6rlrprkuYnov5DooYzln7rluqciKX1lbHNlIGNvbnNvbGUuZXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byByZXF1aXJlTW9kdWxlKCInK24rJyIpLCBpbnN0YW5jZSAoJytyKyIpIGRvZXNuJ3QgZXhpc3QgYW55bW9yZS4iKX0sV2VleEluc3RhbmNlLnByb3RvdHlwZS5zdXBwb3J0cz1mdW5jdGlvbihlKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7dmFyIHQ9ZS5tYXRjaCgvXkAoXHcrKVwvKFtcdy1dKykoXC4oXHcrKSk/JC9pKTtpZih0KXt2YXIgbj10WzFdLHI9dFsyXSxpPXRbNF07c3dpdGNoKG4pe2Nhc2UibW9kdWxlIjpyZXR1cm4gaXNSZWdpc3RlcmVkTW9kdWxlKHIsaSk7Y2FzZSJjb21wb25lbnQiOnJldHVybiBpc1JlZ2lzdGVyZWRDb21wb25lbnQocil9fXJldHVybiBudWxsfSxXZWV4SW5zdGFuY2UucHJvdG90eXBlLmltcG9ydFNjcmlwdD1mdW5jdGlvbihlLHIpe3ZvaWQgMD09PXImJihyPXt9KTt2YXIgaT1nZXRJZCh0aGlzKSxvPWdldFRhc2tDZW50ZXIoaSk7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7byYmImZ1bmN0aW9uIj09dHlwZW9mIG8uc2VuZHx8bihuZXcgRXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBpbXBvcnQgc2NyaXB0ICInK2UrJyIsIG5vIHRhc2tDZW50ZXIgKCcraSsiKSBtYXRjaGVkLiIpKTt0cnl7by5zZW5kKCJtb2R1bGUiLHttb2R1bGU6InNjcmlwdCIsbWV0aG9kOiJpbXBvcnRTY3JpcHQifSxbZSxyXSx7Y2FsbGJhY2s6W2Z1bmN0aW9uKGUpe3JldHVybiB0KGUpfSxmdW5jdGlvbihlKXtyZXR1cm4gbihlKX1dfSl9Y2F0Y2goZSl7bihlKX19KX07dmFyIGRlY29kZT1kZWNvZGVVUklDb21wb25lbnQ7ZnVuY3Rpb24gcGFyc2VRdWVyeShlKXt2YXIgaT17fTtyZXR1cm4oZT1lLnRyaW0oKS5yZXBsYWNlKC9eKFw/fCN8JikvLCIiKSkmJmUuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvXCsvZywiICIpLnNwbGl0KCI9Iiksbj1kZWNvZGUodC5zaGlmdCgpKSxyPTA8dC5sZW5ndGg/ZGVjb2RlKHQuam9pbigiPSIpKTpudWxsO3ZvaWQgMD09PWlbbl0/aVtuXT1yOkFycmF5LmlzQXJyYXkoaVtuXSk/aVtuXS5wdXNoKHIpOmlbbl09W2lbbl0scl19KSxpfXZhciBMSUZFQ1lDTEVfSE9PS1M9WyJvbkxhdW5jaCIsIm9uU2hvdyIsIm9uSGlkZSIsIm9uVW5pTlZpZXdNZXNzYWdlIiwib25QYWdlTm90Rm91bmQiLCJvblRoZW1lQ2hhbmdlIiwib25FcnJvciIsIm9uVW5oYW5kbGVkUmVqZWN0aW9uIiwib25Mb2FkIiwib25SZWFkeSIsIm9uVW5sb2FkIiwib25QdWxsRG93blJlZnJlc2giLCJvblJlYWNoQm90dG9tIiwib25UYWJJdGVtVGFwIiwib25BZGRUb0Zhdm9yaXRlcyIsIm9uU2hhcmVUaW1lbGluZSIsIm9uU2hhcmVBcHBNZXNzYWdlIiwib25SZXNpemUiLCJvblBhZ2VTY3JvbGwiLCJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiLCJvbkJhY2tQcmVzcyIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2hhbmdlZCIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q29uZmlybWVkIiwib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDbGlja2VkIiwib25QYWdlU2hvdyIsIm9uUGFnZUhpZGUiLCJvblBhZ2VSZXNpemUiXTtmdW5jdGlvbiBwYXJzZVF1ZXJ5QnlCdW5kbGVVcmwoZSl7dmFyIHQ9e307aWYoZSYmInN0cmluZyI9PXR5cGVvZiBlKXt2YXIgbj1lLmluZGV4T2YoIj8iKTtpZigtMSE9PW4pe3ZhciByPWUuc3Vic3RyKG4rMSk7Ii5qcyI9PT1yLnN1YnN0cigtMykmJihyPXIuc3Vic3RyKDAsci5sZW5ndGgtMykpLHQ9cGFyc2VRdWVyeShyKX19cmV0dXJuIHR9dmFyIElOU1RBTkNFX0lEPSJbW0N1cnJlbnRJbnN0YW5jZUlkXV0iO2Z1bmN0aW9uIGdldElkJDEoZSl7cmV0dXJuIGVbSU5TVEFOQ0VfSURdfWZ1bmN0aW9uIGluaXRTY29wZSh0LGUpe3ZhciBuPWUuZ2V0Q3VycmVudFBhZ2VzKCkscj1uW24ubGVuZ3RoLTFdO2lmKHRoaXMuJG9wdGlvbnMucm91dGU9PT1yLnJvdXRlKXIuJHZtPXRoaXMscltJTlNUQU5DRV9JRF09Z2V0SWQkMSh0KTtlbHNlIGlmKHQuY29uZmlnLm9sZEluc3RhbmNlSWQpe3ZhciBpPWUuZ2V0Q3VycmVudFBhZ2VzKCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBnZXRJZCQxKGUpPT09dC5jb25maWcub2xkSW5zdGFuY2VJZH0pO2kmJihpLiR2bT10aGlzKX10aGlzLiRzY29wZT1yfWZ1bmN0aW9uIGxpZmVjeWNsZU1peGluKHIsaSxvKXt2YXIgdD1yLmNvbmZpZy5vcHRpb25NZXJnZVN0cmF0ZWdpZXMsbj10LmNyZWF0ZWQ7TElGRUNZQ0xFX0hPT0tTLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1ufSk7dmFyIGE9cGFyc2VRdWVyeUJ5QnVuZGxlVXJsKGkuY29uZmlnLmJ1bmRsZVVybCk7ci5taXhpbih7YmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl8kd2VleD1pO3RyeXt2YXIgdD1vLmdldEFwcCh7YWxsb3dEZWZhdWx0OiEwfSk7dCYmIXRoaXMuJHN0b3JlJiYodC4kc3RvcmV8fHQuJHZtJiZ0LiR2bS4kc3RvcmUpJiYodGhpcy4kc3RvcmU9dC4kc3RvcmV8fHQuJHZtLiRzdG9yZSl9Y2F0Y2goZSl7fXN3aXRjaCh0aGlzLiRvcHRpb25zLm1wVHlwZSl7Y2FzZSJhcHAiOmlmKHRoaXMubXBUeXBlPSJhcHAiLHRoaXMuJG9wdGlvbnMucmVuZGVyPWZ1bmN0aW9uKCl7fSxvLndlZXguY29uZmlnLnByZWxvYWQpby53ZWV4LnJlcXVpcmVNb2R1bGUoImdsb2JhbEV2ZW50IikuYWRkRXZlbnRMaXN0ZW5lcigibGF1bmNoQXBwIixmdW5jdGlvbigpe28ucGx1cy51cGRhdGVDb25maWdJbmZvJiZvLnBsdXMudXBkYXRlQ29uZmlnSW5mbygpLG8uX19yZWdpc3RlckFwcChlLHIpfSk7ZWxzZSBvLl9fcmVnaXN0ZXJBcHAodGhpcyxyKTticmVhaztjYXNlInBhZ2UiOnRoaXMubXBUeXBlPSJwYWdlIjt2YXIgbj1vLnBsdXMud2Vidmlldy5jdXJyZW50V2VidmlldygpO24uX19wcmVsb2FkX18/KG4uYWRkRXZlbnRMaXN0ZW5lcigic2hvdyIsZnVuY3Rpb24oKXshZS4kc2NvcGUmJmluaXRTY29wZS5jYWxsKGUsaSxvKSxlLl9fY2FsbF9ob29rKCJvblNob3ciKX0pLG4uYWRkRXZlbnRMaXN0ZW5lcigiaGlkZSIsZnVuY3Rpb24oKXtlLl9fY2FsbF9ob29rKCJvbkhpZGUiKX0pKTooMD09PW8uZ2V0Q3VycmVudFBhZ2VzKCkubGVuZ3RoJiZvLl9fcmVnaXN0ZXJQYWdlKHt1cmw6Ii8iK3RoaXMuJG9wdGlvbnMucm91dGUscGF0aDoiLyIrdGhpcy4kb3B0aW9ucy5yb3V0ZSx3ZWJ2aWV3Om59KSxpbml0U2NvcGUuY2FsbCh0aGlzLGksbykpfX0sY3JlYXRlZDpmdW5jdGlvbigpe2lmKCJwYWdlIj09PXRoaXMuJG9wdGlvbnMubXBUeXBlKXt2YXIgZT1vLnBsdXMud2Vidmlldy5jdXJyZW50V2VidmlldygpO2lmKGUuX19wcmVsb2FkX18pe3ZhciB0PU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSxhKTtpZihlLl9fcXVlcnlfXyl0cnl7T2JqZWN0LmFzc2lnbih0LEpTT04ucGFyc2UoZS5fX3F1ZXJ5X18pKX1jYXRjaChlKXt9dGhpcy5fX2NhbGxfaG9vaygib25Mb2FkIix0KX1lbHNle3ZhciBuPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSxhKSxyPW8uZ2V0Q3VycmVudFBhZ2VzKCk7T2JqZWN0LmFzc2lnbihuLHJbci5sZW5ndGgtMV0ub3B0aW9ucyksdGhpcy5fX2NhbGxfaG9vaygib25Mb2FkIixuKSx0aGlzLl9fY2FsbF9ob29rKCJvblNob3ciKX19fSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczsicGFnZSI9PT10aGlzLiRvcHRpb25zLm1wVHlwZSYmKHRoaXMuX19jYWxsX2hvb2soIm9uUmVhZHkiKSx0aGlzLiRvcHRpb25zLm9uUGFnZVNjcm9sbCYmdGhpcy4kZWwuYWRkRXZlbnQoInNjcm9sbCIsZnVuY3Rpb24oZSl7ZS5zY3JvbGxUb3A9ZS5kZXRhaWwuc2Nyb2xsVG9wLHQuX19jYWxsX2hvb2soIm9uUGFnZVNjcm9sbCIsZSl9KSx0aGlzLiRvcHRpb25zLm9uUmVhY2hCb3R0b20mJnRoaXMuJGVsLmFkZEV2ZW50KCJzY3JvbGx0b2xvd2VyIixmdW5jdGlvbihlKXt0Ll9fY2FsbF9ob29rKCJvblJlYWNoQm90dG9tIixlKX0pKX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpeyJwYWdlIj09PXRoaXMuJG9wdGlvbnMubXBUeXBlJiZ0aGlzLl9fY2FsbF9ob29rKCJvblVubG9hZCIpfX0pfWZ1bmN0aW9uIGJyb2FkY2FzdChlLHQpe2Zvcih2YXIgbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGgtMjswPHItLTspbltyXT1hcmd1bWVudHNbcisyXTtmb3IodmFyIGk9dGhpcy4kY2hpbGRyZW4sbz1pLmxlbmd0aCxhPTA7YTxvO2ErKyl7dmFyIHM9aVthXSxjPXMuJG9wdGlvbnMubmFtZTtpZih+ZS5pbmRleE9mKGMpKXJldHVybiBzLiRlbWl0LmFwcGx5KHMsW3RdLmNvbmNhdChuKSksITE7aWYoITE9PT1icm9hZGNhc3QuYXBwbHkocyxbZSx0XS5jb25jYXQoW25dKSkpcmV0dXJuITF9fXZhciBlbWl0dGVyPXttZXRob2RzOnskdHJpZ2dlcjpmdW5jdGlvbihlLHQpe3RoaXMuJGVtaXQoZSxwcm9jZXNzQ3VzdG9tRXZlbnQuY2FsbCh0aGlzLGUsdCx0aGlzLiRlbCkpfSwkZGlzcGF0Y2g6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W10scj1hcmd1bWVudHMubGVuZ3RoLTI7MDxyLS07KW5bcl09YXJndW1lbnRzW3IrMl07InN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pO2Zvcih2YXIgaT10aGlzLiRwYXJlbnR8fHRoaXMuJHJvb3Qsbz1pLiRvcHRpb25zLm5hbWU7aSYmKCFvfHwhfmUuaW5kZXhPZihvKSk7KShpPWkuJHBhcmVudCkmJihvPWkuJG9wdGlvbnMubmFtZSk7aSYmaS4kZW1pdC5hcHBseShpLFt0XS5jb25jYXQobikpfSwkYnJvYWRjYXN0OmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdLHI9YXJndW1lbnRzLmxlbmd0aC0yOzA8ci0tOyluW3JdPWFyZ3VtZW50c1tyKzJdOyJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKSxicm9hZGNhc3QuYXBwbHkodGhpcyxbZSx0XS5jb25jYXQobikpfX19LGxpc3RlbmVycz17cHJvcHM6e2lkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sY3JlYXRlZDpmdW5jdGlvbigpe3ZhciBuPXRoaXM7dGhpcy5fYWRkTGlzdGVuZXJzKHRoaXMuaWQpLHRoaXMuJHdhdGNoKCJpZCIsZnVuY3Rpb24oZSx0KXtuLl9yZW1vdmVMaXN0ZW5lcnModCwhMCksbi5fYWRkTGlzdGVuZXJzKGUsITApfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9yZW1vdmVMaXN0ZW5lcnModGhpcy5pZCl9LG1ldGhvZHM6e19hZGRMaXN0ZW5lcnM6ZnVuY3Rpb24odCxuKXt2YXIgcj10aGlzO2lmKCFufHx0KXt2YXIgaT10aGlzLiRvcHRpb25zLmxpc3RlbmVyczsiT2JqZWN0Ij09PXR5cG9mKGkpJiZPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe24/MCE9PWUuaW5kZXhPZigiQCIpJiYwIT09ZS5pbmRleE9mKCJ1bmktIikmJnIuXyRidXMuJG9uKCJ1bmktIitlKyItIit0LHJbaVtlXV0pOjA9PT1lLmluZGV4T2YoIkAiKT9yLiRvbigidW5pLSIrZS5zdWJzdHIoMSkscltpW2VdXSk6MD09PWUuaW5kZXhPZigidW5pLSIpP3IuXyRidXMuJG9uKGUscltpW2VdXSk6dCYmci5fJGJ1cy4kb24oInVuaS0iK2UrIi0iK3IuJHBhZ2UuaWQrIi0iK3QscltpW2VdXSl9KX19LF9yZW1vdmVMaXN0ZW5lcnM6ZnVuY3Rpb24odCxuKXt2YXIgcj10aGlzO2lmKCFufHx0KXt2YXIgaT10aGlzLiRvcHRpb25zLmxpc3RlbmVyczsiT2JqZWN0Ij09PXR5cG9mKGkpJiZPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe24/MCE9PWUuaW5kZXhPZigiQCIpJiYwIT09ZS5pbmRleE9mKCJ1bmktIikmJnIuXyRidXMuJG9mZigidW5pLSIrZSsiLSIrdCxyW2lbZV1dKTowPT09ZS5pbmRleE9mKCJAIik/ci4kb2ZmKCJ1bmktIitlLnN1YnN0cigxKSxyW2lbZV1dKTowPT09ZS5pbmRleE9mKCJ1bmktIik/ci5fJGJ1cy4kb2ZmKGUscltpW2VdXSk6dCYmci5fJGJ1cy4kb2ZmKCJ1bmktIitlKyItIityLiRwYWdlLmlkKyItIit0LHJbaVtlXV0pfSl9fX19LF9hZERhdGFDYWNoZT17fTtmdW5jdGlvbiBnZXRBZERhdGEoZSx0LG4scixpLG8pe3ZhciBhPXQrIi0iK24scz1fYWREYXRhQ2FjaGVbYV07cyYmMDxzLmxlbmd0aD9pKHMuc3BsaWNlKDAsMSlbMF0pOmUuYWQuZ2V0QWRzKHthZHBpZDp0LGNvdW50OjUsd2lkdGg6bixleHQ6e2NoYW5uZWw6cn19LGZ1bmN0aW9uKGUpe3ZhciB0PWUuYWRzO2kodC5zcGxpY2UoMCwxKVswXSksX2FkRGF0YUNhY2hlW2FdPXM/cy5jb25jYXQodCk6dH0sZnVuY3Rpb24oZSl7byh7ZXJyQ29kZTplLmNvZGUsZXJyTXNnOmUubWVzc2FnZX0pfSl9ZnVuY3Rpb24gZ2V0QWQobixyKXtyZXR1cm57bmFtZToiQWQiLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10scHJvcHM6e2FkcGlkOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OiIifSxkYXRhOnt0eXBlOk9iamVjdH0sd2lkdGg6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGNoYW5uZWw6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2FkV2lkdGg6MCxhZERhdGE6e319fSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZih0aGlzLmRhdGEpdGhpcy5fZmlsbERhdGEodGhpcy5kYXRhKTtlbHNlIGlmKHRoaXMuYWRwaWQpe2lmKHRoaXMud2lkdGgmJjA8dGhpcy53aWR0aC5sZW5ndGgpe3ZhciBlPXBhcnNlRmxvYXQodGhpcy53aWR0aCk7cmV0dXJuL1xkK1t1cl1weCQvaS50ZXN0KHRoaXMud2lkdGgpP3RoaXMuYWRXaWR0aD11cHgycHgoZSk6dGhpcy5hZFdpZHRoPWUsdm9pZCB0aGlzLl9sb2FkRGF0YSgpfXNldFRpbWVvdXQoZnVuY3Rpb24oKXtuLnJlcXVpcmVNb2R1bGUoImRvbSIpLmdldENvbXBvbmVudFJlY3QodC4kcmVmcy5hZCxmdW5jdGlvbihlKXt0LmFkV2lkdGg9MD09PWUuc2l6ZS53aWR0aD8tMTplLnNpemUud2lkdGgsdC5fbG9hZERhdGEoKX0pfSw1MCl9fSx3YXRjaDp7YWRwaWQ6ZnVuY3Rpb24oZSl7ZSYmdGhpcy5fbG9hZERhdGEoZSl9LGRhdGE6ZnVuY3Rpb24oZSl7ZSYmdGhpcy5fZmlsbERhdGEoZSl9fSxtZXRob2RzOntfb25kb3dubG9hZGNoYW5nZTpmdW5jdGlvbihlKXt0aGlzLiR0cmlnZ2VyKCJkb3dubG9hZGNoYW5nZSIsZS5kZXRhaWwpfSxfb25kaXNsaWtlOmZ1bmN0aW9uKGUpe3RoaXMuJHRyaWdnZXIoImNsb3NlIixlLmRldGFpbCl9LF9sb2FkRGF0YTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2dldEFkRGF0YShyLnBsdXN8fG5ldyByLldlZXhQbHVzKHIud2VleCksZXx8dGhpcy5hZHBpZCx0aGlzLmFkV2lkdGgsdGhpcy5jaGFubmVsLGZ1bmN0aW9uKGUpe3QuX2ZpbGxEYXRhKGUpfSxmdW5jdGlvbihlKXt0LiR0cmlnZ2VyKCJlcnJvciIsZSl9KX0sX2ZpbGxEYXRhOmZ1bmN0aW9uKGUpe3RoaXMuYWREYXRhPWUsdGhpcy4kdHJpZ2dlcigibG9hZCIse30pfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXt9LG49dGhpcy4kbGlzdGVuZXJzO3JldHVybiBuLmRvd25sb2FkY2hhbmdlJiYodC5kb3dubG9hZGNoYW5nZT10aGlzLl9vbmRvd25sb2FkY2hhbmdlKSxuLmNsb3NlJiYodC5kaXNsaWtlPXRoaXMuX29uZGlzbGlrZSksZSgidS1hZCIsdGhpcy5fZyh7cmVmOiJhZCIsYXR0cnM6e2RhdGE6dGhpcy5hZERhdGEscmVuZGVyaW5nOiEwfSxvbjp0fSxuKSxbXSwxKX19fWZ1bmN0aW9uIGluaXQkMyhlLHQsbil7ZS5jb21wb25lbnQoImFkIixnZXRBZCh0LG4pKX12YXIgX2FkRGF0YUNhY2hlJDE9e307ZnVuY3Rpb24gZ2V0QWREYXRhJDEoZSx0LG4scixpLG8pe3ZhciBhPXQrIi0iK24scz1fYWREYXRhQ2FjaGUkMVthXTtzJiYwPHMubGVuZ3RoP2kocy5zcGxpY2UoMCwxKVswXSk6ZS5hZC5nZXREcmF3QWRzKHthZHBpZDp0LGNvdW50OjMsd2lkdGg6bixoZWlnaHQ6cn0sZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hZHM7aSh0LnNwbGljZSgwLDEpWzBdKSxfYWREYXRhQ2FjaGUkMVthXT1zP3MuY29uY2F0KHQpOnR9LGZ1bmN0aW9uKGUpe28oe2VyckNvZGU6ZS5jb2RlLGVyck1zZzplLm1lc3NhZ2V9KX0pfWZ1bmN0aW9uIGdldEFkJDEoZSxuKXtyZXR1cm57bmFtZToiQWREcmF3Iixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOnthZHBpZDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoiIn0sZGF0YTp7dHlwZTpPYmplY3R9LHdpZHRoOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnthZFdpZHRoOjAsYWRIZWlnaHQ6MCxhZERhdGE6e319fSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmRhdGE/dGhpcy5fZmlsbERhdGEodGhpcy5kYXRhKTp0aGlzLmFkcGlkJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5yZXF1aXJlTW9kdWxlKCJkb20iKS5nZXRDb21wb25lbnRSZWN0KHQuJHJlZnMuYWQsZnVuY3Rpb24oZSl7dC5hZFdpZHRoPTA9PT1lLnNpemUud2lkdGg/LTE6ZS5zaXplLndpZHRoLHQuYWRIZWlnaHQ9MD09PWUuc2l6ZS5oZWlnaHQ/LTE6ZS5zaXplLmhlaWdodCx0Ll9sb2FkRGF0YSgpfSl9LDEwMCl9LHdhdGNoOnthZHBpZDpmdW5jdGlvbihlKXtlJiZ0aGlzLl9sb2FkRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlKXtlJiZ0aGlzLl9maWxsRGF0YShlKX19LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXsobi5wbHVzfHxuZXcgbi5XZWV4UGx1cyhuLndlZXgpKS5hZC5yZWxlYXNlQWREYXRhKHRoaXMuYWREYXRhKX0sbWV0aG9kczp7X29uZGlzbGlrZTpmdW5jdGlvbihlKXt0aGlzLiR0cmlnZ2VyKCJjbG9zZSIsZS5kZXRhaWwpfSxfbG9hZERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztnZXRBZERhdGEkMShuLnBsdXN8fG5ldyBuLldlZXhQbHVzKG4ud2VleCksZXx8dGhpcy5hZHBpZCx0aGlzLmFkV2lkdGgsdGhpcy5hZEhlaWdodCxmdW5jdGlvbihlKXt0Ll9maWxsRGF0YShlKX0sZnVuY3Rpb24oZSl7dC4kdHJpZ2dlcigiZXJyb3IiLGUpfSl9LF9maWxsRGF0YTpmdW5jdGlvbihlKXt0aGlzLmFkRGF0YT1lLHRoaXMuJHRyaWdnZXIoImxvYWQiLHt9KX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD17fSxuPXRoaXMuJGxpc3RlbmVycztyZXR1cm4gbi5jbG9zZSYmKHQuZGlzbGlrZT10aGlzLl9vbmRpc2xpa2UpLGUoInUtYWQtZHJhdyIsdGhpcy5fZyh7cmVmOiJhZCIsYXR0cnM6e2RhdGE6dGhpcy5hZERhdGEscmVuZGVyaW5nOiEwfSxvbjp0fSxuKSxbXSwxKX19fWZ1bmN0aW9uIGluaXQkNChlLHQsbil7ZS5jb21wb25lbnQoImFkLWRyYXciLGdldEFkJDEodCxuKSl9dmFyIE9QRU5fVFlQRVM9WyJhZ3JlZVByaXZhY3kiLCJkaXNhZ3JlZVByaXZhY3kiXTtmdW5jdGlvbiBnZXRCdXR0b24oZSxyKXtyZXR1cm57bmFtZToiQnV0dG9uIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntob3ZlckNsYXNzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJidXR0b24taG92ZXIifSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSx0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJkZWZhdWx0In0sc2l6ZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiZGVmYXVsdCJ9LHBsYWluOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sbG9hZGluZzp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGhvdmVyU3RvcFByb3BhZ2F0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0saG92ZXJTdGFydFRpbWU6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MjB9LGhvdmVyU3RheVRpbWU6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6NzB9LG9wZW5UeXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxmb3JtVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIix2YWxpZGF0b3I6ZnVuY3Rpb24oZSl7cmV0dXJuflsiIiwic3VibWl0IiwicmVzZXQiXS5pbmRleE9mKGUpfX19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57VFlQRVM6e2RlZmF1bHQ6ImQiLHByaW1hcnk6InAiLHdhcm46IncifSxjbGlja0Z1bmN0aW9uOm51bGx9fSxtZXRob2RzOntfb25DbGljazpmdW5jdGlvbihlLHQpe2lmKCF0aGlzLmRpc2FibGVkJiYoImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuY2xpY2tGdW5jdGlvbiYmdGhpcy5jbGlja0Z1bmN0aW9uKGUpLHRoaXMuZm9ybVR5cGUmJnRoaXMuJGRpc3BhdGNoKCJGb3JtIiwic3VibWl0Ij09PXRoaXMuZm9ybVR5cGU/InVuaS1mb3JtLXN1Ym1pdCI6InVuaS1mb3JtLXJlc2V0Iix7dHlwZTp0aGlzLmZvcm1UeXBlfSx0aGlzKSwwPHRoaXMub3BlblR5cGUubGVuZ3RoJiYwPD1PUEVOX1RZUEVTLmluZGV4T2YodGhpcy5vcGVuVHlwZSkpKXt2YXIgbj1yLnBsdXN8fG5ldyByLldlZXhQbHVzKHIud2VleCk7dGhpc1siXyIrdGhpcy5vcGVuVHlwZV0obiksdGhpcy4kdHJpZ2dlcih0aGlzLm9wZW5UeXBlLnRvTG93ZXJDYXNlKCkse30pfX0sX2FncmVlUHJpdmFjeTpmdW5jdGlvbihlKXtlLnJ1bnRpbWUuYWdyZWVQcml2YWN5KCl9LF9kaXNhZ3JlZVByaXZhY3k6ZnVuY3Rpb24oZSl7ZS5ydW50aW1lLmRpc2FncmVlUHJpdmFjeSgpfSxfZ2V0Q2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9InViLSIrdGhpcy5UWVBFU1t0aGlzLnR5cGVdK2U7cmV0dXJuIHRoaXMuZGlzYWJsZWQmJih0Kz0iLWQiKSx0aGlzLnBsYWluJiYodCs9Ii1wbGFpbiIpLCItdCI9PT1lJiYibWluaSI9PT10aGlzLnNpemUmJih0Kz0iIHViLW1pbmkiKSx0fSxfZ2V0SG92ZXJDbGFzczpmdW5jdGlvbihlKXtpZih0aGlzLmRpc2FibGVkKXJldHVybiIiO3ZhciB0PSJ1Yi0iK3RoaXMuVFlQRVNbdGhpcy50eXBlXStlKyItaG92ZXIiO3JldHVybiB0aGlzLnBsYWluJiYodCs9Ii1wbGFpbiIpLHR9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPUFycmF5LmlzQXJyYXkodGhpcy4kc2xvdHMuZGVmYXVsdCk/dGhpcy4kc2xvdHMuZGVmYXVsdDpbXTtyZXR1cm4gMT09PW4ubGVuZ3RoJiZuWzBdLnRleHQmJihuPWUoInUtdGV4dCIse3N0YXRpY0NsYXNzOlsidWItdCJdLGNsYXNzOnQuX2dldENsYXNzKCItdCIpfSxbdC5fdCgiZGVmYXVsdCIpXSwyKSksdGhpcy5jbGlja0Z1bmN0aW9uPXQuJGxpc3RlbmVycy5jbGljayxkZWxldGUgdC4kbGlzdGVuZXJzLmNsaWNrLGUoInZpZXciLHQuX2coe3N0YXRpY0NsYXNzOlsidWIiXSxjbGFzczp0Ll9nZXRDbGFzcygiIiksYXR0cnM6e2RhdGFVbmNUeXBlOiJ1bmktYnV0dG9uIixob3ZlckNsYXNzOnQuX2dldEhvdmVyQ2xhc3MoIiIpLGhvdmVyU3RhcnRUaW1lOnQuaG92ZXJTdGFydFRpbWUsaG92ZXJTdGF5VGltZTp0LmhvdmVyU3RheVRpbWV9LG9uOntjbGljazp0Ll9vbkNsaWNrfX0sdC4kbGlzdGVuZXJzKSxbdC5sb2FkaW5nP2UoImxvYWRpbmctaW5kaWNhdG9yIix7c3RhdGljQ2xhc3M6WyJ1Yi1sb2FkaW5nIl0sY2xhc3M6WyJ1Yi0iK3QuVFlQRVNbdC50eXBlXSsiLWxvYWRpbmciXSxhdHRyczp7YXJyb3c6ImZhbHNlIixhbmltYXRpbmc6InRydWUifX0pOnQuX2UoKV0uY29uY2F0KG4pLDEpfSxzdHlsZTp7dWI6e2ZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixwb3NpdGlvbjoicmVsYXRpdmUiLHBhZGRpbmdMZWZ0OiI1IixwYWRkaW5nUmlnaHQ6IjUiLG92ZXJmbG93OiJoaWRkZW4iLGNvbG9yOiIjMDAwMDAwIixiYWNrZ3JvdW5kQ29sb3I6IiNmOGY4ZjgiLGJvcmRlclJhZGl1czoiNSIsYm9yZGVyU3R5bGU6InNvbGlkIixib3JkZXJXaWR0aDoiMSIsYm9yZGVyQ29sb3I6IiNkYmRiZGIifSwidWItdCI6e2NvbG9yOiIjMDAwMDAwIixmb250U2l6ZToiMTgiLHRleHREZWNvcmF0aW9uOiJub25lIixsaW5lSGVpZ2h0OiI0NiJ9LCJ1Yi1kIjp7YmFja2dyb3VuZENvbG9yOiIjZjhmOGY4In0sInViLXAiOntiYWNrZ3JvdW5kQ29sb3I6IiMwMDdhZmYiLGJvcmRlckNvbG9yOiIjMDA2MmNjIn0sInViLXciOntiYWNrZ3JvdW5kQ29sb3I6IiNlNjQzNDAiLGJvcmRlckNvbG9yOiIjYjgzNjMzIn0sInViLWQtdCI6e2NvbG9yOiIjMDAwMDAwIn0sInViLXAtdCI6e2NvbG9yOiIjZmZmZmZmIn0sInViLXctdCI6e2NvbG9yOiIjZmZmZmZmIn0sInViLWQtZCI6e2JhY2tncm91bmRDb2xvcjoiI2Y3ZjdmNyJ9LCJ1Yi1wLWQiOntiYWNrZ3JvdW5kQ29sb3I6IiM2M2FjZmMiLGJvcmRlckNvbG9yOiIjNGY4YWNhIn0sInViLXctZCI6e2JhY2tncm91bmRDb2xvcjoiI2VjOGI4OSIsYm9yZGVyQ29sb3I6IiNiZDZmNmUifSwidWItZC10LWQiOntjb2xvcjoiI2NjY2NjYyJ9LCJ1Yi1wLXQtZCI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifSwidWItdy10LWQiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn0sInViLWQtcGxhaW4iOntib3JkZXJDb2xvcjoiIzM1MzUzNSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLXAtcGxhaW4iOntib3JkZXJDb2xvcjoiIzAwN2FmZiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLXctcGxhaW4iOntib3JkZXJDb2xvcjoiI2U2NDM0MCIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLWQtdC1wbGFpbiI6e2NvbG9yOiIjMzUzNTM1In0sInViLXAtdC1wbGFpbiI6e2NvbG9yOiIjMDA3YWZmIn0sInViLXctdC1wbGFpbiI6e2NvbG9yOiIjZTY0MzQwIn0sInViLWQtZC1wbGFpbiI6e2JvcmRlckNvbG9yOiIjYzZjNmM2IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItcC1kLXBsYWluIjp7Ym9yZGVyQ29sb3I6IiNjNmM2YzYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi13LWQtcGxhaW4iOntib3JkZXJDb2xvcjoiI2M2YzZjNiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLWQtdC1kLXBsYWluIjp7Y29sb3I6InJnYmEoMCwwLDAsMC4yKSJ9LCJ1Yi1wLXQtZC1wbGFpbiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifSwidWItdy10LWQtcGxhaW4iOntjb2xvcjoicmdiYSgwLDAsMCwwLjIpIn0sInViLW1pbmkiOntsaW5lSGVpZ2h0OiIzMCIsZm9udFNpemU6IjEzIixwYWRkaW5nVG9wOjAscGFkZGluZ1JpZ2h0OiIxNy41IixwYWRkaW5nQm90dG9tOjAscGFkZGluZ0xlZnQ6IjE3LjUifSwidWItbG9hZGluZyI6e3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsbWFyZ2luUmlnaHQ6IjEwIn0sInViLWQtbG9hZGluZyI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1wLWxvYWRpbmciOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItdy1sb2FkaW5nIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLWQtbG9hZGluZy1wbGFpbiI6e2NvbG9yOiIjMzUzNTM1In0sInViLXAtbG9hZGluZy1wbGFpbiI6e2NvbG9yOiIjMDA3YWZmIixiYWNrZ3JvdW5kQ29sb3I6IiMwMDYyY2MifSwidWItdy1sb2FkaW5nLXBsYWluIjp7Y29sb3I6IiNlNjQzNDAiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1kLWhvdmVyIjp7b3BhY2l0eTouOCxiYWNrZ3JvdW5kQ29sb3I6IiNkZWRlZGUifSwidWItcC1ob3ZlciI6e29wYWNpdHk6LjgsYmFja2dyb3VuZENvbG9yOiIjMDA2MmNjIn0sInViLXctaG92ZXIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiI2NlM2MzOSJ9LCJ1Yi1kLXQtaG92ZXIiOntjb2xvcjoicmdiYSgwLDAsMCwwLjYpIn0sInViLXAtdC1ob3ZlciI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifSwidWItdy10LWhvdmVyIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSJ9LCJ1Yi1kLWhvdmVyLXBsYWluIjp7Y29sb3I6InJnYmEoNTMsNTMsNTMsMC42KSIsYm9yZGVyQ29sb3I6InJnYmEoNTMsNTMsNTMsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLXAtaG92ZXItcGxhaW4iOntjb2xvcjoicmdiYSgyNiwxNzMsMjUsMC42KSIsYm9yZGVyQ29sb3I6InJnYmEoMCwxMjIsMjU1LDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi13LWhvdmVyLXBsYWluIjp7Y29sb3I6InJnYmEoMjMwLDY3LDY0LDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDIzMCw2Nyw2NCwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sbGlzdGVuZXJzOnsibGFiZWwtY2xpY2siOiJfb25DbGljayIsIkBsYWJlbC1jbGljayI6Il9vbkNsaWNrIn19fWZ1bmN0aW9uIGluaXQkNShlLHQsbil7ZS5jb21wb25lbnQoImJ1dHRvbiIsZ2V0QnV0dG9uKHQsbikpfWZ1bmN0aW9uIGdldENoZWNrYm94R3JvdXAoZSl7cmV0dXJue25hbWU6IkNoZWNrYm94R3JvdXAiLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10scHJvcHM6e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2NoZWNrYm94TGlzdDpbXX19LGxpc3RlbmVyczp7IkBjaGVja2JveC1jaGFuZ2UiOiJfY2hhbmdlSGFuZGxlciIsIkBjaGVja2JveC1ncm91cC11cGRhdGUiOiJfY2hlY2tib3hHcm91cFVwZGF0ZUhhbmRsZXIifSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJ1bmktZm9ybS1ncm91cC11cGRhdGUiLHt0eXBlOiJhZGQiLHZtOnRoaXN9KX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToicmVtb3ZlIix2bTp0aGlzfSl9LG1ldGhvZHM6e19jaGFuZ2VIYW5kbGVyOmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3RoaXMuY2hlY2tib3hMaXN0LmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jaGVja2JveENoZWNrZWQmJnQucHVzaChlLnZhbHVlKX0pLHRoaXMuJHRyaWdnZXIoImNoYW5nZSIse3ZhbHVlOnR9KX0sX2NoZWNrYm94R3JvdXBVcGRhdGVIYW5kbGVyOmZ1bmN0aW9uKGUpe2lmKCJhZGQiPT09ZS50eXBlKXRoaXMuY2hlY2tib3hMaXN0LnB1c2goZS52bSk7ZWxzZXt2YXIgdD10aGlzLmNoZWNrYm94TGlzdC5pbmRleE9mKGUudm0pO3RoaXMuY2hlY2tib3hMaXN0LnNwbGljZSh0LDEpfX0sX2dldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dmFyIGU9e307aWYoIiIhPT10aGlzLm5hbWUpe3ZhciB0PVtdO3RoaXMuY2hlY2tib3hMaXN0LmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jaGVja2JveENoZWNrZWQmJnQucHVzaChlLnZhbHVlKX0pLGUudmFsdWU9dCxlLmtleT10aGlzLm5hbWV9cmV0dXJuIGV9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUoImRpdiIsdGhpcy5fZyh7c3RhdGljQ2xhc3M6WyJ1bmktY2hlY2tib3gtZ3JvdXAiXX0sdGhpcy4kbGlzdGVuZXJzKSxbdGhpcy5fdCgiZGVmYXVsdCIpXSwyKX0sc3R5bGU6e319fWZ1bmN0aW9uIGluaXQkNihlLHQpe2UuY29tcG9uZW50KCJjaGVja2JveC1ncm91cCIsZ2V0Q2hlY2tib3hHcm91cCh0KSl9ZnVuY3Rpb24gZ2V0Q2hlY2tib3goZSl7cmV0dXJue25hbWU6IkNoZWNrYm94Iixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntjaGVja2VkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0saWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifSx2YWx1ZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57Y2hlY2tib3hDaGVja2VkOnRoaXMuY2hlY2tlZCxjaGVja2JveFZhbHVlOnRoaXMudmFsdWV9fSx3YXRjaDp7Y2hlY2tlZDpmdW5jdGlvbihlKXt0aGlzLmNoZWNrYm94Q2hlY2tlZD1lfSx2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLmNoZWNrYm94VmFsdWU9ZX19LGxpc3RlbmVyczp7ImxhYmVsLWNsaWNrIjoiX29uQ2xpY2siLCJAbGFiZWwtY2xpY2siOiJfb25DbGljayJ9LGNvbXB1dGVkOntjaGVja2JveENvbG9yOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWQ/IiNhZGFkYWQiOnRoaXMuY29sb3J9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy4kZGlzcGF0Y2goIkNoZWNrYm94R3JvdXAiLCJ1bmktY2hlY2tib3gtZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSksdGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJ1bmktZm9ybS1ncm91cC11cGRhdGUiLHt0eXBlOiJhZGQiLHZtOnRoaXN9KX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJDaGVja2JveEdyb3VwIiwidW5pLWNoZWNrYm94LWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pLHRoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToicmVtb3ZlIix2bTp0aGlzfSl9LG1ldGhvZHM6e19vbkNsaWNrOmZ1bmN0aW9uKGUpe3RoaXMuZGlzYWJsZWR8fCh0aGlzLmNoZWNrYm94Q2hlY2tlZD0hdGhpcy5jaGVja2JveENoZWNrZWQsdGhpcy4kZGlzcGF0Y2goIkNoZWNrYm94R3JvdXAiLCJ1bmktY2hlY2tib3gtY2hhbmdlIixlKSl9LF9yZXNldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dGhpcy5jaGVja2JveENoZWNrZWQ9ITF9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZSgiZGl2Iix0Ll9nKHthdHRyczp7ZGF0YVVuY1R5cGU6InVuaS1jaGVja2JveCJ9LG9uOntjbGljazp0Ll9vbkNsaWNrfX0sdC4kbGlzdGVuZXJzKSxbZSgiZGl2Iix7c3RhdGljQ2xhc3M6WyJ1bmktY2hlY2tib3giXX0sW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLWNoZWNrYm94LWlucHV0Il0sY2xhc3M6W3QuZGlzYWJsZWQ/InVuaS1jaGVja2JveC1pbnB1dC1kaXNhYmxlZCI6IiJdfSxbdC5jaGVja2JveENoZWNrZWQ/ZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1bmktaWNvbiJdLHN0eWxlOntjb2xvcjp0LmNoZWNrYm94Q29sb3J9fSxbdC5fdih0Ll9zKCLuqIgiKSldKTp0Ll9lKCldKSxlKCJ1LXRleHQiLHtzdGF0aWNDbGFzczpbInVuaS1zbG90Il19LFt0Ll90KCJkZWZhdWx0IildLDIpXSldKX0sc3R5bGU6eyJ1bmktY2hlY2tib3giOntmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciJ9LCJ1bmktY2hlY2tib3gtaW5wdXQiOntqdXN0aWZ5Q29udGVudDoiY2VudGVyIixhbGlnbkl0ZW1zOiJjZW50ZXIiLHBvc2l0aW9uOiJyZWxhdGl2ZSIsYm9yZGVyV2lkdGg6IjEiLGJvcmRlckNvbG9yOiIjZDFkMWQxIixib3JkZXJTdHlsZToic29saWQiLGJhY2tncm91bmRDb2xvcjoiI2ZmZmZmZiIsYm9yZGVyUmFkaXVzOiIzIix3aWR0aDoiMjIiLGhlaWdodDoiMjIifSwidW5pLWljb24iOntmb250RmFtaWx5OiJ1bmluY29tcG9uZW50cyIsZm9udFNpemU6IjE2IixtYXJnaW5MZWZ0OiIyIixtYXJnaW5Ub3A6IjIiLGNvbG9yOiIjMDA3YWZmIn0sInVuaS1jaGVja2JveC1pbnB1dC1kaXNhYmxlZCI6e2JhY2tncm91bmRDb2xvcjoiI2UxZTFlMSJ9LCJ1bmktY2hlY2tib3gtaW5wdXQtZGlzYWJsZWQtYmVmb3JlIjp7Y29sb3I6IiNhZGFkYWQifSwidW5pLXNsb3QiOntmb250U2l6ZToiMTYiLG1hcmdpbkxlZnQ6IjUifSwidW5pLWNoZWNrYm94LWdyb3VwIjp7ZGlzcGxheToiYmxvY2sifX19fWZ1bmN0aW9uIGluaXQkNyhlLHQpe2UuY29tcG9uZW50KCJjaGVja2JveCIsZ2V0Q2hlY2tib3godCkpfXZhciBOQVRJVkVfQ09NUE9ORU5UX1RZUEVTPVsidS1pbnB1dCIsInUtdGV4dGFyZWEiXTtmdW5jdGlvbiBnZXRGb3JtKGUpe3ZhciBpPWUucmVxdWlyZU1vZHVsZSgicGx1cyIpO3JldHVybntuYW1lOiJGb3JtIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57Y2hpbGRyZW5MaXN0OltdfX0sbGlzdGVuZXJzOnsiQGZvcm0tc3VibWl0IjoiX29uU3VibWl0IiwiQGZvcm0tcmVzZXQiOiJfb25SZXNldCIsIkBmb3JtLWdyb3VwLXVwZGF0ZSI6Il9mb3JtR3JvdXBVcGRhdGVIYW5kbGVyIn0sbWV0aG9kczp7X29uU3VibWl0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldE5hdGl2ZUZvcm1EYXRhKCl8fHt9O3RoaXMuY2hpbGRyZW5MaXN0LmZvckVhY2goZnVuY3Rpb24oZSl7ZS5fZ2V0Rm9ybURhdGEmJmUuX2dldEZvcm1EYXRhKCkua2V5JiYodFtlLl9nZXRGb3JtRGF0YSgpLmtleV09ZS5fZ2V0Rm9ybURhdGEoKS52YWx1ZSl9KSx0aGlzLiR0cmlnZ2VyKCJzdWJtaXQiLHt2YWx1ZTp0fSl9LF9vblJlc2V0OmZ1bmN0aW9uKGUpe3RoaXMuJHRyaWdnZXIoInJlc2V0Iix7fSksdGhpcy5fZ2V0TmF0aXZlRm9ybURhdGEoITApLHRoaXMuY2hpbGRyZW5MaXN0LmZvckVhY2goZnVuY3Rpb24oZSl7ZS5fcmVzZXRGb3JtRGF0YSYmZS5fcmVzZXRGb3JtRGF0YSgpfSl9LF9mb3JtR3JvdXBVcGRhdGVIYW5kbGVyOmZ1bmN0aW9uKGUpe2lmKCJhZGQiPT09ZS50eXBlKXRoaXMuY2hpbGRyZW5MaXN0LnB1c2goZS52bSk7ZWxzZXt2YXIgdD10aGlzLmNoaWxkcmVuTGlzdC5pbmRleE9mKGUudm0pO3RoaXMuY2hpbGRyZW5MaXN0LnNwbGljZSh0LDEpfX0sX2dldE5hdGl2ZUZvcm1EYXRhOmZ1bmN0aW9uKG4pe3ZhciByPXt9O3JldHVybiBmdW5jdGlvbiB0KGUpe2UuZm9yRWFjaChmdW5jdGlvbihlKXswPD1OQVRJVkVfQ09NUE9ORU5UX1RZUEVTLmluZGV4T2YoZS50YWcpJiZlLmRhdGEuYXR0cnMmJmUuZGF0YS5hdHRycy5uYW1lJiYobj9lLmVsbS5zZXRWYWx1ZSgiIik6cltlLmRhdGEuYXR0cnMubmFtZV09aS5nZXRWYWx1ZShlLmVsbS5ub2RlSWQpKSxlLmNoaWxkcmVuJiZ0KGUuY2hpbGRyZW4pfSl9KHRoaXMuJHZub2RlLmNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW4pLHJ9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUoInZpZXciLHRoaXMuX2coe30sdGhpcy4kbGlzdGVuZXJzKSxbdGhpcy5fdCgiZGVmYXVsdCIpXSwyKX19fWZ1bmN0aW9uIGluaXQkOChlLHQpe2UuY29tcG9uZW50KCJmb3JtIixnZXRGb3JtKHQpKX12YXIgaWNvbkNoYXJzPXtzdWNjZXNzOiLuqIYiLGluZm86Iu6ogyIsd2Fybjoi7qiLIix3YWl0aW5nOiLuqIkiLHNhZmVfc3VjY2Vzczoi7qiEIixzYWZlX3dhcm46Iu6ohSIsc3VjY2Vzc19jaXJjbGU6Iu6ohyIsc3VjY2Vzc19ub19jaXJjbGU6Iu6oiCIsd2FpdGluZ19jaXJjbGU6Iu6oiiIsY2lyY2xlOiLuqIEiLGRvd25sb2FkOiLuqIIiLGluZm9fY2lyY2xlOiLuqIwiLGNhbmNlbDoi7qiNIixzZWFyY2g6Iu6ojiIsY2xlYXI6Iu6ojyJ9LGljb25Db2xvcnM9e3N1Y2Nlc3M6IiMwOWJiMDciLGluZm86IiMxMGFlZmYiLHdhcm46IiNmNzYyNjAiLHdhaXRpbmc6IiMxMGFlZmYiLHNhZmVfc3VjY2VzczoiIzA5YmIwNyIsc2FmZV93YXJuOiIjZmZiZTAwIixzdWNjZXNzX2NpcmNsZToiIzA5YmIwNyIsc3VjY2Vzc19ub19jaXJjbGU6IiMwOWJiMDciLHdhaXRpbmdfY2lyY2xlOiIjMTBhZWZmIixjaXJjbGU6IiNjOWM5YzkiLGRvd25sb2FkOiIjMDliYjA3IixpbmZvX2NpcmNsZToiIzA5YmIwNyIsY2FuY2VsOiIjZjQzNTMwIixzZWFyY2g6IiNiMmIyYjIiLGNsZWFyOiIjYjJiMmIyIn07ZnVuY3Rpb24gZ2V0SWNvbihlKXtyZXR1cm57bmFtZToiSWNvbiIsaXNSZXNlcnZlZDohMCxwcm9wczp7dHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sc2l6ZTp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDoyM30sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2ljb25DaGFyczppY29uQ2hhcnN9fSxiZWZvcmVDcmVhdGU6ZnVuY3Rpb24oKXt9LGNvbXB1dGVkOntzdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm57Y29sb3I6dGhpcy5jb2xvcnx8aWNvbkNvbG9yc1t0aGlzLnR5cGVdLGZvbnRTaXplOnRoaXMuc2l6ZX19fSxyZW5kZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUoInUtdGV4dCIsdGhpcy5fZyh7c3RhdGljQ2xhc3M6WyJ1bmktaWNvbiJdLHN0eWxlOnRoaXMuc3R5bGVzfSx0aGlzLiRsaXN0ZW5lcnMpLFt0aGlzLmljb25DaGFyc1t0aGlzLnR5cGVdXSl9LHN0eWxlOnsidW5pLWljb24iOntmb250RmFtaWx5OiJ1bmluY29tcG9uZW50cyJ9fX19ZnVuY3Rpb24gaW5pdCQ5KGUsdCl7ZS5jb21wb25lbnQoImljb24iLGdldEljb24odCkpfWZ1bmN0aW9uIGdldExhYmVsKGUpe3JldHVybntuYW1lOiJMYWJlbCIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7Zm9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sbWV0aG9kczp7X29uQ2xpY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQuYXR0ci5kYXRhVW5jVHlwZXx8IiIsbj0vXnVuaS0oY2hlY2tib3h8cmFkaW98c3dpdGNoKS0vLnRlc3QodCk7bnx8KG49L151bmktKGNoZWNrYm94fHJhZGlvfHN3aXRjaHxidXR0b24pJC9pLnRlc3QodCkpLG58fCh0aGlzLmZvcj90aGlzLl8kYnVzLiRlbWl0KCJ1bmktbGFiZWwtY2xpY2stIit0aGlzLiRwYWdlLmlkKyItIit0aGlzLmZvcixlLCEwKTp0aGlzLiRicm9hZGNhc3QoWyJDaGVja2JveCIsIlJhZGlvIiwiU3dpdGNoIiwiQnV0dG9uIl0sInVuaS1sYWJlbC1jbGljayIsZSwhMCkpfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJkaXYiLHRoaXMuX2coe29uOntjbGljazp0aGlzLl9vbkNsaWNrfX0sdGhpcy4kbGlzdGVuZXJzKSxbdGhpcy5fdCgiZGVmYXVsdCIpXSwyKX19fWZ1bmN0aW9uIGluaXQkMTAoZSx0KXtlLmNvbXBvbmVudCgibGFiZWwiLGdldExhYmVsKHQpKX1mdW5jdGlvbiBnZXRNb3ZhYmxlQXJlYShlKXt2YXIgdD1lLnJlcXVpcmVNb2R1bGUoImRvbSIpO3JldHVybntuYW1lOiJNb3ZhYmxlQXJlYSIsaXNSZXNlcnZlZDohMCxwcm9wczp7c2NhbGVBcmVhOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57d2lkdGg6MCxoZWlnaHQ6MCxpdGVtczpbXX19LG1ldGhvZHM6e19yZXNpemU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuX2dldFdIKCkudGhlbihmdW5jdGlvbigpe2UuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNvbXBvbmVudEluc3RhbmNlLnNldFBhcmVudCgpfSl9KX0sX3BhbnN0YXJ0OmZ1bmN0aW9uKGUpe3RoaXMudG91Y2hJdGVtJiZ0aGlzLnRvdWNoSXRlbS50b3VjaHN0YXJ0KGUpfSxfcGFubW92ZTpmdW5jdGlvbihlKXtlLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMudG91Y2hJdGVtJiZ0aGlzLnRvdWNoSXRlbS50b3VjaG1vdmUoZSl9LF9wYW5lbmQ6ZnVuY3Rpb24oZSl7dGhpcy50b3VjaEl0ZW0mJih0aGlzLnRvdWNoSXRlbS50b3VjaGVuZChlKSx0aGlzLnRvdWNoSXRlbT1udWxsKX0sX2dldFdIOmZ1bmN0aW9uKCl7dmFyIG89dGhpcztyZXR1cm4gdGhpcy5fZ2V0Q29tcG9uZW50U2l6ZSh0aGlzLiRyZWZzLmVsKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWUud2lkdGgsbj1lLmhlaWdodCxyPWUudG9wLGk9ZS5sZWZ0O28ud2lkdGg9dCxvLmhlaWdodD1uLG8udG9wPXIsby5sZWZ0PWl9KX0sX2dldENvbXBvbmVudFNpemU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe3QuZ2V0Q29tcG9uZW50UmVjdChlLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2l6ZTtuKHQpfSl9KX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLml0ZW1zPVtdLHRoaXMuZ2FwVj17eDpudWxsLHk6bnVsbH0sdGhpcy5waW5jaFN0YXJ0TGVuPW51bGx9LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9faXNNb3VudGVkPSEwLGUuX3Jlc2l6ZSgpfSwyMDApfSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPVtdOyhBcnJheS5pc0FycmF5KHRoaXMuJHNsb3RzLmRlZmF1bHQpP2RlZXBDbG9uZSh0aGlzLiRzbG90cy5kZWZhdWx0LGUpOltdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY29tcG9uZW50T3B0aW9ucyYmIm1vdmFibGUtdmlldyI9PT1lLmNvbXBvbmVudE9wdGlvbnMudGFnJiZuLnB1c2goZSl9KSx0aGlzLml0ZW1zPW47dmFyIHI9e307cmV0dXJuWyJwYW5zdGFydCIsInBhbm1vdmUiLCJwYW5lbmQiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JbZV09dFsiXyIrZV19KSxlKCJkaXYiLHRoaXMuX2coe3JlZjoiZWwiLG9uOnIsc3RhdGljQ2xhc3M6WyJ1bmktbW92YWJsZS1hcmVhIl19LHRoaXMuJGxpc3RlbmVycyksbiwyKX0sc3R5bGU6eyJ1bmktbW92YWJsZS1hcmVhIjp7b3ZlcmZsb3c6ImhpZGRlbiIsd2lkdGg6IjEwcHgiLGhlaWdodDoiMTBweCJ9fX19ZnVuY3Rpb24gaW5pdCQxMShlLHQpe2UuY29tcG9uZW50KCJtb3ZhYmxlLWFyZWEiLGdldE1vdmFibGVBcmVhKHQpKX12YXIgdG91Y2h0cmFjaz17bWV0aG9kczp7dG91Y2h0cmFjazpmdW5jdGlvbihpKXt2YXIgbz10aGlzLGE9MCxzPTAsYz0wLHU9MCxuPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCExPT09b1tpXSh7dGFyZ2V0OmUudGFyZ2V0LGN1cnJlbnRUYXJnZXQ6ZS5jdXJyZW50VGFyZ2V0LHN0b3BQcm9wYWdhdGlvbjplLnN0b3BQcm9wYWdhdGlvbi5iaW5kKGUpLHRvdWNoZXM6ZS50b3VjaGVzLGNoYW5nZWRUb3VjaGVzOmUuY2hhbmdlZFRvdWNoZXMsZGV0YWlsOntzdGF0ZTp0LHgwOm4seTA6cixkeDpuLWEsZHk6ci1zLGRkeDpuLWMsZGR5OnItdSx0aW1lU3RhbXA6ZS50aW1lU3RhbXB8fERhdGUubm93KCl9fSkpcmV0dXJuITF9LHI9bnVsbDt0aGlzLmFkZExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbihlKXtpZighcilyZXR1cm4gYT1jPShyPWUpLnRvdWNoZXNbMF0ucGFnZVgscz11PWUudG91Y2hlc1swXS5wYWdlWSxuKGUsInN0YXJ0IixhLHMpfSksdGhpcy5hZGRMaXN0ZW5lcigidG91Y2htb3ZlIixmdW5jdGlvbihlKXtpZihyKXt2YXIgdD1uKGUsIm1vdmUiLGUudG91Y2hlc1swXS5wYWdlWCxlLnRvdWNoZXNbMF0ucGFnZVkpO3JldHVybiBjPWUudG91Y2hlc1swXS5wYWdlWCx1PWUudG91Y2hlc1swXS5wYWdlWSx0fX0pLHRoaXMuYWRkTGlzdGVuZXIoInRvdWNoZW5kIixmdW5jdGlvbihlKXtpZihyKXJldHVybiByPW51bGwsbihlLCJlbmQiLGUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVgsZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWSl9KX0sdG91Y2hzdGFydDpmdW5jdGlvbihlKXt0aGlzLmNhbGxiYWNrKCJ0b3VjaHN0YXJ0IixlKX0sdG91Y2htb3ZlOmZ1bmN0aW9uKGUpe3RoaXMuY2FsbGJhY2soInRvdWNobW92ZSIsZSl9LHRvdWNoZW5kOmZ1bmN0aW9uKGUpe3RoaXMuY2FsbGJhY2soInRvdWNoZW5kIixlKX0sYWRkTGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXt0aGlzLl9fZXZlbnRbZV09ZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJihlLnRvdWNoZXM9ZS5jaGFuZ2VkVG91Y2hlcywhMT09PXQoZSkmJmUuc3RvcFByb3BhZ2F0aW9uKCkpfX0sY2FsbGJhY2s6ZnVuY3Rpb24oZSx0KXt0aGlzLl9fZXZlbnRbZV0mJnRoaXMuX19ldmVudFtlXSh0KX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9fZXZlbnQ9e319fTtmdW5jdGlvbiBlKGUsdCxuKXtyZXR1cm4gdC1uPGUmJmU8dCtufWZ1bmN0aW9uIHQodCxuKXtyZXR1cm4gZSh0LDAsbil9ZnVuY3Rpb24gRGVjbGluZSgpe31mdW5jdGlvbiBGcmljdGlvbihlLHQpe3RoaXMuX209ZSx0aGlzLl9mPTFlMyp0LHRoaXMuX3N0YXJ0VGltZT0wLHRoaXMuX3Y9MH1mdW5jdGlvbiBTcHJpbmcoZSx0LG4pe3RoaXMuX209ZSx0aGlzLl9rPXQsdGhpcy5fYz1uLHRoaXMuX3NvbHV0aW9uPW51bGwsdGhpcy5fZW5kUG9zaXRpb249MCx0aGlzLl9zdGFydFRpbWU9MH1mdW5jdGlvbiBTVEQoZSx0LG4pe3RoaXMuX3NwcmluZ1g9bmV3IFNwcmluZyhlLHQsbiksdGhpcy5fc3ByaW5nWT1uZXcgU3ByaW5nKGUsdCxuKSx0aGlzLl9zcHJpbmdTY2FsZT1uZXcgU3ByaW5nKGUsdCxuKSx0aGlzLl9zdGFydFRpbWU9MH1EZWNsaW5lLnByb3RvdHlwZS54PWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnNxcnQoZSl9LEZyaWN0aW9uLnByb3RvdHlwZS5zZXRWPWZ1bmN0aW9uKGUsdCl7dmFyIG49TWF0aC5wb3coTWF0aC5wb3coZSwyKStNYXRoLnBvdyh0LDIpLC41KTt0aGlzLl94X3Y9ZSx0aGlzLl95X3Y9dCx0aGlzLl94X2E9LXRoaXMuX2YqdGhpcy5feF92L24sdGhpcy5feV9hPS10aGlzLl9mKnRoaXMuX3lfdi9uLHRoaXMuX3Q9TWF0aC5hYnMoZS90aGlzLl94X2EpfHxNYXRoLmFicyh0L3RoaXMuX3lfYSksdGhpcy5fbGFzdER0PW51bGwsdGhpcy5fc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpfSxGcmljdGlvbi5wcm90b3R5cGUuc2V0Uz1mdW5jdGlvbihlLHQpe3RoaXMuX3hfcz1lLHRoaXMuX3lfcz10fSxGcmljdGlvbi5wcm90b3R5cGUucz1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT0oKG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTMpLGU+dGhpcy5fdCYmKGU9dGhpcy5fdCx0aGlzLl9sYXN0RHQ9ZSk7dmFyIHQ9dGhpcy5feF92KmUrLjUqdGhpcy5feF9hKk1hdGgucG93KGUsMikrdGhpcy5feF9zLG49dGhpcy5feV92KmUrLjUqdGhpcy5feV9hKk1hdGgucG93KGUsMikrdGhpcy5feV9zO3JldHVybigwPHRoaXMuX3hfYSYmdDx0aGlzLl9lbmRQb3NpdGlvblh8fHRoaXMuX3hfYTwwJiZ0PnRoaXMuX2VuZFBvc2l0aW9uWCkmJih0PXRoaXMuX2VuZFBvc2l0aW9uWCksKDA8dGhpcy5feV9hJiZuPHRoaXMuX2VuZFBvc2l0aW9uWXx8dGhpcy5feV9hPDAmJm4+dGhpcy5fZW5kUG9zaXRpb25ZKSYmKG49dGhpcy5fZW5kUG9zaXRpb25ZKSx7eDp0LHk6bn19LEZyaWN0aW9uLnByb3RvdHlwZS5kcz1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9KChuZXcgRGF0ZSkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSxlPnRoaXMuX3QmJihlPXRoaXMuX3QpLHtkeDp0aGlzLl94X3YrdGhpcy5feF9hKmUsZHk6dGhpcy5feV92K3RoaXMuX3lfYSplfX0sRnJpY3Rpb24ucHJvdG90eXBlLmRlbHRhPWZ1bmN0aW9uKCl7cmV0dXJue3g6LTEuNSpNYXRoLnBvdyh0aGlzLl94X3YsMikvdGhpcy5feF9hfHwwLHk6LTEuNSpNYXRoLnBvdyh0aGlzLl95X3YsMikvdGhpcy5feV9hfHwwfX0sRnJpY3Rpb24ucHJvdG90eXBlLmR0PWZ1bmN0aW9uKCl7cmV0dXJuLXRoaXMuX3hfdi90aGlzLl94X2F9LEZyaWN0aW9uLnByb3RvdHlwZS5kb25lPWZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzLnMoKS54LHRoaXMuX2VuZFBvc2l0aW9uWCl8fGUodGhpcy5zKCkueSx0aGlzLl9lbmRQb3NpdGlvblkpfHx0aGlzLl9sYXN0RHQ9PT10aGlzLl90O3JldHVybiB0aGlzLl9sYXN0RHQ9bnVsbCx0fSxGcmljdGlvbi5wcm90b3R5cGUuc2V0RW5kPWZ1bmN0aW9uKGUsdCl7dGhpcy5fZW5kUG9zaXRpb25YPWUsdGhpcy5fZW5kUG9zaXRpb25ZPXR9LEZyaWN0aW9uLnByb3RvdHlwZS5yZWNvbmZpZ3VyZT1mdW5jdGlvbihlLHQpe3RoaXMuX209ZSx0aGlzLl9mPTFlMyp0fSxTcHJpbmcucHJvdG90eXBlLl9zb2x2ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2Mscj10aGlzLl9tLGk9dGhpcy5fayxvPW4qbi00KnIqaTtpZigwPT09byl7dmFyIGE9LW4vKDIqcikscz1lLGM9dC8oYSplKTtyZXR1cm57eDpmdW5jdGlvbihlKXtyZXR1cm4ocytjKmUpKk1hdGgucG93KE1hdGguRSxhKmUpfSxkeDpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLnBvdyhNYXRoLkUsYSplKTtyZXR1cm4gYSoocytjKmUpKnQrYyp0fX19aWYoMDxvKXt2YXIgdT0oLW4tTWF0aC5zcXJ0KG8pKS8oMipyKSxsPSgtbitNYXRoLnNxcnQobykpLygyKnIpLGQ9KHQtdSplKS8obC11KSxmPWUtZDtyZXR1cm57eDpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiBlPT09dGhpcy5fdCYmKHQ9dGhpcy5fcG93RVIxVCxuPXRoaXMuX3Bvd0VSMlQpLHRoaXMuX3Q9ZSx0fHwodD10aGlzLl9wb3dFUjFUPU1hdGgucG93KE1hdGguRSx1KmUpKSxufHwobj10aGlzLl9wb3dFUjJUPU1hdGgucG93KE1hdGguRSxsKmUpKSxmKnQrZCpufSxkeDpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiBlPT09dGhpcy5fdCYmKHQ9dGhpcy5fcG93RVIxVCxuPXRoaXMuX3Bvd0VSMlQpLHRoaXMuX3Q9ZSx0fHwodD10aGlzLl9wb3dFUjFUPU1hdGgucG93KE1hdGguRSx1KmUpKSxufHwobj10aGlzLl9wb3dFUjJUPU1hdGgucG93KE1hdGguRSxsKmUpKSxmKnUqdCtkKmwqbn19fXZhciBwPU1hdGguc3FydCg0KnIqaS1uKm4pLygyKnIpLGg9LW4vMipyLHY9ZSxnPSh0LWgqZSkvcDtyZXR1cm57eDpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3coTWF0aC5FLGgqZSkqKHYqTWF0aC5jb3MocCplKStnKk1hdGguc2luKHAqZSkpfSxkeDpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLnBvdyhNYXRoLkUsaCplKSxuPU1hdGguY29zKHAqZSkscj1NYXRoLnNpbihwKmUpO3JldHVybiB0KihnKnAqbi12KnAqcikraCp0KihnKnIrdipuKX19fSxTcHJpbmcucHJvdG90eXBlLng9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSgobmV3IERhdGUpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksdGhpcy5fc29sdXRpb24/dGhpcy5fZW5kUG9zaXRpb24rdGhpcy5fc29sdXRpb24ueChlKTowfSxTcHJpbmcucHJvdG90eXBlLmR4PWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0oKG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTMpLHRoaXMuX3NvbHV0aW9uP3RoaXMuX3NvbHV0aW9uLmR4KGUpOjB9LFNwcmluZy5wcm90b3R5cGUuc2V0RW5kPWZ1bmN0aW9uKGUsbixyKXtpZihyfHwocj0obmV3IERhdGUpLmdldFRpbWUoKSksZSE9PXRoaXMuX2VuZFBvc2l0aW9ufHwhdChuLC4xKSl7bj1ufHwwO3ZhciBpPXRoaXMuX2VuZFBvc2l0aW9uO3RoaXMuX3NvbHV0aW9uJiYodChuLC4xKSYmKG49dGhpcy5fc29sdXRpb24uZHgoKHItdGhpcy5fc3RhcnRUaW1lKS8xZTMpKSxpPXRoaXMuX3NvbHV0aW9uLngoKHItdGhpcy5fc3RhcnRUaW1lKS8xZTMpLHQobiwuMSkmJihuPTApLHQoaSwuMSkmJihpPTApLGkrPXRoaXMuX2VuZFBvc2l0aW9uKSx0aGlzLl9zb2x1dGlvbiYmdChpLWUsLjEpJiZ0KG4sLjEpfHwodGhpcy5fZW5kUG9zaXRpb249ZSx0aGlzLl9zb2x1dGlvbj10aGlzLl9zb2x2ZShpLXRoaXMuX2VuZFBvc2l0aW9uLG4pLHRoaXMuX3N0YXJ0VGltZT1yKX19LFNwcmluZy5wcm90b3R5cGUuc25hcD1mdW5jdGlvbihlKXt0aGlzLl9zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCksdGhpcy5fZW5kUG9zaXRpb249ZSx0aGlzLl9zb2x1dGlvbj17eDpmdW5jdGlvbigpe3JldHVybiAwfSxkeDpmdW5jdGlvbigpe3JldHVybiAwfX19LFNwcmluZy5wcm90b3R5cGUuZG9uZT1mdW5jdGlvbihuKXtyZXR1cm4gbnx8KG49KG5ldyBEYXRlKS5nZXRUaW1lKCkpLGUodGhpcy54KCksdGhpcy5fZW5kUG9zaXRpb24sLjEpJiZ0KHRoaXMuZHgoKSwuMSl9LFNwcmluZy5wcm90b3R5cGUucmVjb25maWd1cmU9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuX209ZSx0aGlzLl9rPXQsdGhpcy5fYz1uLHRoaXMuZG9uZSgpfHwodGhpcy5fc29sdXRpb249dGhpcy5fc29sdmUodGhpcy54KCktdGhpcy5fZW5kUG9zaXRpb24sdGhpcy5keCgpKSx0aGlzLl9zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpfSxTcHJpbmcucHJvdG90eXBlLnNwcmluZ0NvbnN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2t9LFNwcmluZy5wcm90b3R5cGUuZGFtcGluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jfSxTcHJpbmcucHJvdG90eXBlLmNvbmZpZ3VyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm5be2xhYmVsOiJTcHJpbmcgQ29uc3RhbnQiLHJlYWQ6dGhpcy5zcHJpbmdDb25zdGFudC5iaW5kKHRoaXMpLHdyaXRlOmZ1bmN0aW9uKGUsdCl7ZS5yZWNvbmZpZ3VyZSgxLHQsZS5kYW1waW5nKCkpfS5iaW5kKHRoaXMsdGhpcyksbWluOjEwMCxtYXg6MWUzfSx7bGFiZWw6IkRhbXBpbmciLHJlYWQ6dGhpcy5kYW1waW5nLmJpbmQodGhpcyksd3JpdGU6ZnVuY3Rpb24oZSx0KXtlLnJlY29uZmlndXJlKDEsZS5zcHJpbmdDb25zdGFudCgpLHQpfS5iaW5kKHRoaXMsdGhpcyksbWluOjEsbWF4OjUwMH1dfSxTVEQucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLl9zcHJpbmdYLnNldEVuZChlLHIsaSksdGhpcy5fc3ByaW5nWS5zZXRFbmQodCxyLGkpLHRoaXMuX3NwcmluZ1NjYWxlLnNldEVuZChuLHIsaSksdGhpcy5fc3RhcnRUaW1lPWl9LFNURC5wcm90b3R5cGUueD1mdW5jdGlvbigpe3ZhciBlPSgobmV3IERhdGUpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMztyZXR1cm57eDp0aGlzLl9zcHJpbmdYLngoZSkseTp0aGlzLl9zcHJpbmdZLngoZSksc2NhbGU6dGhpcy5fc3ByaW5nU2NhbGUueChlKX19LFNURC5wcm90b3R5cGUuZG9uZT1mdW5jdGlvbigpe3ZhciBlPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3JldHVybiB0aGlzLl9zcHJpbmdYLmRvbmUoZSkmJnRoaXMuX3NwcmluZ1kuZG9uZShlKSYmdGhpcy5fc3ByaW5nU2NhbGUuZG9uZShlKX0sU1RELnByb3RvdHlwZS5yZWNvbmZpZ3VyZT1mdW5jdGlvbihlLHQsbil7dGhpcy5fc3ByaW5nWC5yZWNvbmZpZ3VyZShlLHQsbiksdGhpcy5fc3ByaW5nWS5yZWNvbmZpZ3VyZShlLHQsbiksdGhpcy5fc3ByaW5nU2NhbGUucmVjb25maWd1cmUoZSx0LG4pfTt2YXIgcmVxdWVzdGluZz0hMTtmdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSl7cmV0dXJuIHNldFRpbWVvdXQoZSwxNil9ZnVuY3Rpb24gY2FuY2VsQW5pbWF0aW9uRnJhbWUoZSl7Y2xlYXJUaW1lb3V0KGUpfWZ1bmN0aW9uIF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSl7cmVxdWVzdGluZ3x8KHJlcXVlc3Rpbmc9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7ZSgpLHJlcXVlc3Rpbmc9ITF9KSl9ZnVuY3Rpb24gdihlLHQpe3JldHVybisoKDFlMyplLTFlMyp0KS8xZTMpLnRvRml4ZWQoMSl9ZnVuY3Rpb24gZyhhLGUsdCl7dmFyIG49e2lkOjAsY2FuY2VsbGVkOiExfTtyZXR1cm4gZnVuY3Rpb24gZSh0LG4scixpKXtpZighdHx8IXQuY2FuY2VsbGVkKXtyKG4pO3ZhciBvPWEuZG9uZSgpO298fHQuY2FuY2VsbGVkfHwodC5pZD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZS5iaW5kKG51bGwsdCxuLHIsaSkpKSxvJiZpJiZpKG4pfX0obixhLGUsdCkse2NhbmNlbDpmdW5jdGlvbihlKXtlJiZlLmlkJiZjYW5jZWxBbmltYXRpb25GcmFtZShlLmlkKSxlJiYoZS5jYW5jZWxsZWQ9ITApfS5iaW5kKG51bGwsbiksbW9kZWw6YX19ZnVuY3Rpb24gZ2V0TW92YWJsZVZpZXcoZSl7dmFyIHQ9ZS5yZXF1aXJlTW9kdWxlKCJkb20iKSxzPWUucmVxdWlyZU1vZHVsZSgiYW5pbWF0aW9uIik7cmV0dXJue25hbWU6Ik1vdmFibGVWaWV3Iixpc1Jlc2VydmVkOiEwLG1peGluczpbdG91Y2h0cmFjayxlbWl0dGVyXSxwcm9wczp7ZGlyZWN0aW9uOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJub25lIn0saW5lcnRpYTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LG91dE9mQm91bmRzOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0seDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSx5Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LGRhbXBpbmc6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MjB9LGZyaWN0aW9uOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjJ9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sc2NhbGU6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxzY2FsZU1pbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDouMX0sc2NhbGVNYXg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MTB9LHNjYWxlVmFsdWU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sYW5pbWF0aW9uOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMH19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57eFN5bmM6dGhpcy5fZ2V0UHgodGhpcy54KSx5U3luYzp0aGlzLl9nZXRQeCh0aGlzLnkpLHNjYWxlVmFsdWVTeW5jOnRoaXMuX2dldFNjYWxlTnVtYmVyKHRoaXMuc2NhbGVWYWx1ZSksd2lkdGg6MCxoZWlnaHQ6MCxtaW5YOjAsbWluWTowLG1heFg6MCxtYXhZOjB9fSxjb21wdXRlZDp7ZGFtcGluZ051bWJlcjpmdW5jdGlvbigpe3ZhciBlPU51bWJlcih0aGlzLmRhbXBpbmcpO3JldHVybiBpc05hTihlKT8yMDplfSxmcmljdGlvbk51bWJlcjpmdW5jdGlvbigpe3ZhciBlPU51bWJlcih0aGlzLmZyaWN0aW9uKTtyZXR1cm4gaXNOYU4oZSl8fGU8PTA/MjplfSxzY2FsZU1pbk51bWJlcjpmdW5jdGlvbigpe3ZhciBlPU51bWJlcih0aGlzLnNjYWxlTWluKTtyZXR1cm4gaXNOYU4oZSk/LjE6ZX0sc2NhbGVNYXhOdW1iZXI6ZnVuY3Rpb24oKXt2YXIgZT1OdW1iZXIodGhpcy5zY2FsZU1heCk7cmV0dXJuIGlzTmFOKGUpPzEwOmV9LHhNb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmRpcmVjdGlvbnx8Imhvcml6b250YWwiPT09dGhpcy5kaXJlY3Rpb259LHlNb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmRpcmVjdGlvbnx8InZlcnRpY2FsIj09PXRoaXMuZGlyZWN0aW9ufX0sd2F0Y2g6e3g6ZnVuY3Rpb24oZSl7dGhpcy54U3luYz10aGlzLl9nZXRQeChlKX0seFN5bmM6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0WChlKX0seTpmdW5jdGlvbihlKXt0aGlzLnlTeW5jPXRoaXMuX2dldFB4KGUpfSx5U3luYzpmdW5jdGlvbihlKXt0aGlzLl9zZXRZKGUpfSxzY2FsZVZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuX3NldFNjYWxlVmFsdWUodGhpcy5fZ2V0U2NhbGVOdW1iZXIoZSkpfSxzY2FsZVZhbHVlU3luYzpmdW5jdGlvbihlKXt0aGlzLl9zZXRTY2FsZVZhbHVlKGUpfSxzY2FsZU1pbk51bWJlcjpmdW5jdGlvbigpe3RoaXMuX3NldFNjYWxlTWluT3JNYXgoKX0sc2NhbGVNYXhOdW1iZXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTY2FsZU1pbk9yTWF4KCl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2Zmc2V0PXt4OjAseTowfSx0aGlzLl9zY2FsZU9mZnNldD17eDowLHk6MH0sdGhpcy5fdHJhbnNsYXRlWD0wLHRoaXMuX3RyYW5zbGF0ZVk9MCx0aGlzLl9zY2FsZT0xLHRoaXMuX29sZFNjYWxlPTEsdGhpcy5fU1REPW5ldyBTVEQoMSw5Kk1hdGgucG93KHRoaXMuZGFtcGluZ051bWJlciwyKS80MCx0aGlzLmRhbXBpbmdOdW1iZXIpLHRoaXMuX2ZyaWN0aW9uPW5ldyBGcmljdGlvbigxLHRoaXMuZnJpY3Rpb25OdW1iZXIpLHRoaXMuX2RlY2xpbmVYPW5ldyBEZWNsaW5lLHRoaXMuX2RlY2xpbmVZPW5ldyBEZWNsaW5lLHRoaXMuX190b3VjaEluZm89e2hpc3RvcnlYOlswLDBdLGhpc3RvcnlZOlswLDBdLGhpc3RvcnlUOlswLDBdfSx0aGlzLl9yZWN0PXt0b3A6MCxsZWZ0OjAsd2lkdGg6MCxoZWlnaHQ6MH19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMudG91Y2h0cmFjaygiX29uVHJhY2siKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5fdXBkYXRlUmVjdCgpLnRoZW4oZnVuY3Rpb24oKXtlLnNldFBhcmVudCgpfSl9LDEwMCksdGhpcy5fZnJpY3Rpb24ucmVjb25maWd1cmUoMSx0aGlzLmZyaWN0aW9uTnVtYmVyKSx0aGlzLl9TVEQucmVjb25maWd1cmUoMSw5Kk1hdGgucG93KHRoaXMuZGFtcGluZ051bWJlciwyKS80MCx0aGlzLmRhbXBpbmdOdW1iZXIpfSxtZXRob2RzOntfZ2V0UHg6ZnVuY3Rpb24oZSl7cmV0dXJuIE51bWJlcihlKXx8MH0sX2dldFNjYWxlTnVtYmVyOmZ1bmN0aW9uKGUpe3JldHVybiBlPU51bWJlcihlKSxpc05hTihlKT8xOmV9LF9zZXRYOmZ1bmN0aW9uKGUpe2lmKHRoaXMueE1vdmUpe2lmKGUrdGhpcy5fc2NhbGVPZmZzZXQueD09PXRoaXMuX3RyYW5zbGF0ZVgpcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVg7dGhpcy5fU0ZBJiZ0aGlzLl9TRkEuY2FuY2VsKCksdGhpcy5fYW5pbWF0aW9uVG8oZSt0aGlzLl9zY2FsZU9mZnNldC54LHRoaXMueVN5bmMrdGhpcy5fc2NhbGVPZmZzZXQueSx0aGlzLl9zY2FsZSl9cmV0dXJuIGV9LF9zZXRZOmZ1bmN0aW9uKGUpe2lmKHRoaXMueU1vdmUpe2lmKGUrdGhpcy5fc2NhbGVPZmZzZXQueT09PXRoaXMuX3RyYW5zbGF0ZVkpcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVk7dGhpcy5fU0ZBJiZ0aGlzLl9TRkEuY2FuY2VsKCksdGhpcy5fYW5pbWF0aW9uVG8odGhpcy54U3luYyt0aGlzLl9zY2FsZU9mZnNldC54LGUrdGhpcy5fc2NhbGVPZmZzZXQueSx0aGlzLl9zY2FsZSl9cmV0dXJuIGV9LF9zZXRTY2FsZU1pbk9yTWF4OmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2NhbGUpcmV0dXJuITE7dGhpcy5fdXBkYXRlU2NhbGUodGhpcy5fc2NhbGUsITApLHRoaXMuX3VwZGF0ZU9sZFNjYWxlKHRoaXMuX3NjYWxlKX0sX3NldFNjYWxlVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuISF0aGlzLnNjYWxlJiYoZT10aGlzLl9hZGp1c3RTY2FsZShlKSx0aGlzLl91cGRhdGVTY2FsZShlLCEwKSx0aGlzLl91cGRhdGVPbGRTY2FsZShlKSxlKX0sX19oYW5kbGVUb3VjaFN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5faXNTY2FsaW5nfHx0aGlzLmRpc2FibGVkfHwodGhpcy5fRkEmJnRoaXMuX0ZBLmNhbmNlbCgpLHRoaXMuX1NGQSYmdGhpcy5fU0ZBLmNhbmNlbCgpLHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVg9WzAsMF0sdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WT1bMCwwXSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlUPVswLDBdLHRoaXMueE1vdmUmJih0aGlzLl9fYmFzZVg9dGhpcy5fdHJhbnNsYXRlWCksdGhpcy55TW92ZSYmKHRoaXMuX19iYXNlWT10aGlzLl90cmFuc2xhdGVZKSx0aGlzLl9jaGVja0Nhbk1vdmU9bnVsbCx0aGlzLl9maXJzdE1vdmVEaXJlY3Rpb249bnVsbCx0aGlzLl9pc1RvdWNoaW5nPSEwKX0sX19oYW5kbGVUb3VjaE1vdmU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZighdGhpcy5faXNTY2FsaW5nJiYhdGhpcy5kaXNhYmxlZCYmdGhpcy5faXNUb3VjaGluZyl7dmFyIG49dGhpcy5fdHJhbnNsYXRlWCxyPXRoaXMuX3RyYW5zbGF0ZVk7aWYobnVsbD09PXRoaXMuX2ZpcnN0TW92ZURpcmVjdGlvbiYmKHRoaXMuX2ZpcnN0TW92ZURpcmVjdGlvbj0xPE1hdGguYWJzKGUuZGV0YWlsLmR4L2UuZGV0YWlsLmR5KT8iaHRvdWNobW92ZSI6InZ0b3VjaG1vdmUiKSx0aGlzLnhNb3ZlJiYobj1lLmRldGFpbC5keCt0aGlzLl9fYmFzZVgsdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WC5zaGlmdCgpLHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVgucHVzaChuKSx0aGlzLnlNb3ZlfHxudWxsIT09dGhpcy5fY2hlY2tDYW5Nb3ZlfHwodGhpcy5fY2hlY2tDYW5Nb3ZlPU1hdGguYWJzKGUuZGV0YWlsLmR4L2UuZGV0YWlsLmR5KTwxKSksdGhpcy55TW92ZSYmKHI9ZS5kZXRhaWwuZHkrdGhpcy5fX2Jhc2VZLHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVkuc2hpZnQoKSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlZLnB1c2gociksdGhpcy54TW92ZXx8bnVsbCE9PXRoaXMuX2NoZWNrQ2FuTW92ZXx8KHRoaXMuX2NoZWNrQ2FuTW92ZT1NYXRoLmFicyhlLmRldGFpbC5keS9lLmRldGFpbC5keCk8MSkpLHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVQuc2hpZnQoKSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlULnB1c2goZS5kZXRhaWwudGltZVN0YW1wKSwhdGhpcy5fY2hlY2tDYW5Nb3ZlKXt2YXIgaT0idG91Y2giO248dGhpcy5taW5YP3RoaXMub3V0T2ZCb3VuZHM/KGk9InRvdWNoLW91dC1vZi1ib3VuZHMiLG49dGhpcy5taW5YLXRoaXMuX2RlY2xpbmVYLngodGhpcy5taW5YLW4pKTpuPXRoaXMubWluWDpuPnRoaXMubWF4WCYmKHRoaXMub3V0T2ZCb3VuZHM/KGk9InRvdWNoLW91dC1vZi1ib3VuZHMiLG49dGhpcy5tYXhYK3RoaXMuX2RlY2xpbmVYLngobi10aGlzLm1heFgpKTpuPXRoaXMubWF4WCkscjx0aGlzLm1pblk/dGhpcy5vdXRPZkJvdW5kcz8oaT0idG91Y2gtb3V0LW9mLWJvdW5kcyIscj10aGlzLm1pblktdGhpcy5fZGVjbGluZVkueCh0aGlzLm1pblktcikpOnI9dGhpcy5taW5ZOnI+dGhpcy5tYXhZJiYodGhpcy5vdXRPZkJvdW5kcz8oaT0idG91Y2gtb3V0LW9mLWJvdW5kcyIscj10aGlzLm1heFkrdGhpcy5fZGVjbGluZVkueChyLXRoaXMubWF4WSkpOnI9dGhpcy5tYXhZKSxfcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5fc2V0VHJhbnNmb3JtKG4scix0Ll9zY2FsZSxpKX0pfX19LF9faGFuZGxlVG91Y2hFbmQ6ZnVuY3Rpb24oKXt2YXIgcj10aGlzO2lmKCF0aGlzLl9pc1NjYWxpbmcmJiF0aGlzLmRpc2FibGVkJiZ0aGlzLl9pc1RvdWNoaW5nJiYodGhpcy5faXNUb3VjaGluZz0hMSwhdGhpcy5fY2hlY2tDYW5Nb3ZlJiYhdGhpcy5fcmV2aXNlKCJvdXQtb2YtYm91bmRzIikmJnRoaXMuaW5lcnRpYSkpe3ZhciBlPTFlMyoodGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WFsxXS10aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlYWzBdKS8odGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VFsxXS10aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlUWzBdKSx0PTFlMyoodGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WVsxXS10aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlZWzBdKS8odGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VFsxXS10aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlUWzBdKTt0aGlzLl9mcmljdGlvbi5zZXRWKGUsdCksdGhpcy5fZnJpY3Rpb24uc2V0Uyh0aGlzLl90cmFuc2xhdGVYLHRoaXMuX3RyYW5zbGF0ZVkpO3ZhciBuPXRoaXMuX2ZyaWN0aW9uLmRlbHRhKCkueCxpPXRoaXMuX2ZyaWN0aW9uLmRlbHRhKCkueSxvPW4rdGhpcy5fdHJhbnNsYXRlWCxhPWkrdGhpcy5fdHJhbnNsYXRlWTtvPHRoaXMubWluWD8obz10aGlzLm1pblgsYT10aGlzLl90cmFuc2xhdGVZKyh0aGlzLm1pblgtdGhpcy5fdHJhbnNsYXRlWCkqaS9uKTpvPnRoaXMubWF4WCYmKG89dGhpcy5tYXhYLGE9dGhpcy5fdHJhbnNsYXRlWSsodGhpcy5tYXhYLXRoaXMuX3RyYW5zbGF0ZVgpKmkvbiksYTx0aGlzLm1pblk/KGE9dGhpcy5taW5ZLG89dGhpcy5fdHJhbnNsYXRlWCsodGhpcy5taW5ZLXRoaXMuX3RyYW5zbGF0ZVkpKm4vaSk6YT50aGlzLm1heFkmJihhPXRoaXMubWF4WSxvPXRoaXMuX3RyYW5zbGF0ZVgrKHRoaXMubWF4WS10aGlzLl90cmFuc2xhdGVZKSpuL2kpLHRoaXMuX2ZyaWN0aW9uLnNldEVuZChvLGEpLHRoaXMuX0ZBPWcodGhpcy5fZnJpY3Rpb24sZnVuY3Rpb24oKXt2YXIgZT1yLl9mcmljdGlvbi5zKCksdD1lLngsbj1lLnk7ci5fc2V0VHJhbnNmb3JtKHQsbixyLl9zY2FsZSwiZnJpY3Rpb24iKX0sZnVuY3Rpb24oKXtyLl9GQS5jYW5jZWwoKX0pfX0sX29uVHJhY2s6ZnVuY3Rpb24oZSl7c3dpdGNoKGUuZGV0YWlsLnN0YXRlKXtjYXNlInN0YXJ0Ijp0aGlzLl9faGFuZGxlVG91Y2hTdGFydCgpO2JyZWFrO2Nhc2UibW92ZSI6dGhpcy5fX2hhbmRsZVRvdWNoTW92ZShlKTticmVhaztjYXNlImVuZCI6dGhpcy5fX2hhbmRsZVRvdWNoRW5kKCl9fSxfZ2V0TGltaXRYWTpmdW5jdGlvbihlLHQpe3ZhciBuPSExO3JldHVybiBlPnRoaXMubWF4WD8oZT10aGlzLm1heFgsbj0hMCk6ZTx0aGlzLm1pblgmJihlPXRoaXMubWluWCxuPSEwKSx0PnRoaXMubWF4WT8odD10aGlzLm1heFksbj0hMCk6dDx0aGlzLm1pblkmJih0PXRoaXMubWluWSxuPSEwKSx7eDplLHk6dCxvdXRPZkJvdW5kczpufX0sc2V0UGFyZW50OmZ1bmN0aW9uKCl7aWYodGhpcy4kcGFyZW50Ll9faXNNb3VudGVkKXt0aGlzLl9GQSYmdGhpcy5fRkEuY2FuY2VsKCksdGhpcy5fU0ZBJiZ0aGlzLl9TRkEuY2FuY2VsKCk7dmFyIGU9dGhpcy5zY2FsZT90aGlzLnNjYWxlVmFsdWVTeW5jOjE7dGhpcy5fdXBkYXRlT2Zmc2V0KCksdGhpcy5fdXBkYXRlV0goZSksdGhpcy5fdXBkYXRlQm91bmRhcnkoKSx0aGlzLl90cmFuc2xhdGVYPXRoaXMueFN5bmMrdGhpcy5fc2NhbGVPZmZzZXQueCx0aGlzLl90cmFuc2xhdGVZPXRoaXMueVN5bmMrdGhpcy5fc2NhbGVPZmZzZXQueTt2YXIgdD10aGlzLl9nZXRMaW1pdFhZKHRoaXMuX3RyYW5zbGF0ZVgsdGhpcy5fdHJhbnNsYXRlWSksbj10Lngscj10Lnk7dGhpcy5fc2V0VHJhbnNmb3JtKG4scixlLCIiLCEwKSx0aGlzLl91cGRhdGVPbGRTY2FsZShlKX19LF91cGRhdGVPZmZzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9vZmZzZXQueD10aGlzLl9yZWN0LmxlZnQtdGhpcy4kcGFyZW50LmxlZnQsdGhpcy5fb2Zmc2V0Lnk9dGhpcy5fcmVjdC50b3AtdGhpcy4kcGFyZW50LnRvcH0sX3VwZGF0ZVdIOmZ1bmN0aW9uKGUpe2U9ZXx8dGhpcy5fc2NhbGUsZT10aGlzLl9hZGp1c3RTY2FsZShlKTt2YXIgdD10aGlzLl9yZWN0O3RoaXMuaGVpZ2h0PXQuaGVpZ2h0L3RoaXMuX3NjYWxlLHRoaXMud2lkdGg9dC53aWR0aC90aGlzLl9zY2FsZTt2YXIgbj10aGlzLmhlaWdodCplLHI9dGhpcy53aWR0aCplO3RoaXMuX3NjYWxlT2Zmc2V0Lng9KHItdGhpcy53aWR0aCkvMix0aGlzLl9zY2FsZU9mZnNldC55PShuLXRoaXMuaGVpZ2h0KS8yfSxfdXBkYXRlQm91bmRhcnk6ZnVuY3Rpb24oKXt2YXIgZT0wLXRoaXMuX29mZnNldC54K3RoaXMuX3NjYWxlT2Zmc2V0LngsdD10aGlzLiRwYXJlbnQud2lkdGgtdGhpcy53aWR0aC10aGlzLl9vZmZzZXQueC10aGlzLl9zY2FsZU9mZnNldC54O3RoaXMubWluWD1NYXRoLm1pbihlLHQpLHRoaXMubWF4WD1NYXRoLm1heChlLHQpO3ZhciBuPTAtdGhpcy5fb2Zmc2V0LnkrdGhpcy5fc2NhbGVPZmZzZXQueSxyPXRoaXMuJHBhcmVudC5oZWlnaHQtdGhpcy5oZWlnaHQtdGhpcy5fb2Zmc2V0LnktdGhpcy5fc2NhbGVPZmZzZXQueTt0aGlzLm1pblk9TWF0aC5taW4obixyKSx0aGlzLm1heFk9TWF0aC5tYXgobixyKX0sX2JlZ2luU2NhbGU6ZnVuY3Rpb24oKXt0aGlzLl9pc1NjYWxpbmc9ITB9LF9lbmRTY2FsZTpmdW5jdGlvbigpe3RoaXMuX2lzU2NhbGluZz0hMSx0aGlzLl91cGRhdGVPbGRTY2FsZSh0aGlzLl9zY2FsZSl9LF9zZXRTY2FsZTpmdW5jdGlvbihlKXt0aGlzLnNjYWxlJiYoZT10aGlzLl9hZGp1c3RTY2FsZShlKSxlPXRoaXMuX29sZFNjYWxlKmUsdGhpcy5fYmVnaW5TY2FsZSgpLHRoaXMuX3VwZGF0ZVNjYWxlKGUpKX0sX3VwZGF0ZVNjYWxlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztpZih0aGlzLnNjYWxlKXtlPXRoaXMuX2FkanVzdFNjYWxlKGUpLHRoaXMuX3VwZGF0ZVdIKGUpLHRoaXMuX3VwZGF0ZUJvdW5kYXJ5KCk7dmFyIHI9dGhpcy5fZ2V0TGltaXRYWSh0aGlzLl90cmFuc2xhdGVYLHRoaXMuX3RyYW5zbGF0ZVkpLGk9ci54LG89ci55O3Q/dGhpcy5fYW5pbWF0aW9uVG8oaSxvLGUsIiIsITAsITApOl9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtuLl9zZXRUcmFuc2Zvcm0oaSxvLGUsIiIsITAsITApfSl9fSxfdXBkYXRlT2xkU2NhbGU6ZnVuY3Rpb24oZSl7dGhpcy5fb2xkU2NhbGU9ZX0sX2FkanVzdFNjYWxlOmZ1bmN0aW9uKGUpe3JldHVybiBlPU1hdGgubWF4KC4xLHRoaXMuc2NhbGVNaW5OdW1iZXIsZSksZT1NYXRoLm1pbigxMCx0aGlzLnNjYWxlTWF4TnVtYmVyLGUpfSxfYW5pbWF0aW9uVG86ZnVuY3Rpb24oZSx0LG4saSxvLGEpe3ZhciBzPXRoaXM7dGhpcy5fRkEmJnRoaXMuX0ZBLmNhbmNlbCgpLHRoaXMuX1NGQSYmdGhpcy5fU0ZBLmNhbmNlbCgpLHRoaXMueE1vdmV8fChlPXRoaXMuX3RyYW5zbGF0ZVgpLHRoaXMueU1vdmV8fCh0PXRoaXMuX3RyYW5zbGF0ZVkpLHRoaXMuc2NhbGV8fChuPXRoaXMuX3NjYWxlKTt2YXIgcj10aGlzLl9nZXRMaW1pdFhZKGUsdCk7ZT1yLngsdD1yLnksdGhpcy5hbmltYXRpb24/KHRoaXMuX1NURC5fc3ByaW5nWC5fc29sdXRpb249bnVsbCx0aGlzLl9TVEQuX3NwcmluZ1kuX3NvbHV0aW9uPW51bGwsdGhpcy5fU1RELl9zcHJpbmdTY2FsZS5fc29sdXRpb249bnVsbCx0aGlzLl9TVEQuX3NwcmluZ1guX2VuZFBvc2l0aW9uPXRoaXMuX3RyYW5zbGF0ZVgsdGhpcy5fU1RELl9zcHJpbmdZLl9lbmRQb3NpdGlvbj10aGlzLl90cmFuc2xhdGVZLHRoaXMuX1NURC5fc3ByaW5nU2NhbGUuX2VuZFBvc2l0aW9uPXRoaXMuX3NjYWxlLHRoaXMuX1NURC5zZXRFbmQoZSx0LG4sMSksdGhpcy5fU0ZBPWcodGhpcy5fU1RELGZ1bmN0aW9uKCl7dmFyIGU9cy5fU1RELngoKSx0PWUueCxuPWUueSxyPWUuc2NhbGU7cy5fc2V0VHJhbnNmb3JtKHQsbixyLGksbyxhKX0sZnVuY3Rpb24oKXtzLl9TRkEuY2FuY2VsKCl9KSk6dGhpcy5fc2V0VHJhbnNmb3JtKGUsdCxuLGksbyxhKX0sX3JldmlzZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRMaW1pdFhZKHRoaXMuX3RyYW5zbGF0ZVgsdGhpcy5fdHJhbnNsYXRlWSksbj10Lngscj10LnksaT10Lm91dE9mQm91bmRzO3JldHVybiBpJiZ0aGlzLl9hbmltYXRpb25UbyhuLHIsdGhpcy5fc2NhbGUsZSksaX0sX3NldFRyYW5zZm9ybTpmdW5jdGlvbihlLHQsbixyLGksbyl7dm9pZCAwPT09ciYmKHI9IiIpLG51bGwhPT1lJiYiTmFOIiE9PWUudG9TdHJpbmcoKSYmIm51bWJlciI9PXR5cGVvZiBlfHwoZT10aGlzLl90cmFuc2xhdGVYfHwwKSxudWxsIT09dCYmIk5hTiIhPT10LnRvU3RyaW5nKCkmJiJudW1iZXIiPT10eXBlb2YgdHx8KHQ9dGhpcy5fdHJhbnNsYXRlWXx8MCksZT1OdW1iZXIoZS50b0ZpeGVkKDEpKSx0PU51bWJlcih0LnRvRml4ZWQoMSkpLG49TnVtYmVyKG4udG9GaXhlZCgxKSksdGhpcy5fdHJhbnNsYXRlWD09PWUmJnRoaXMuX3RyYW5zbGF0ZVk9PT10fHxpfHx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt4OnYoZSx0aGlzLl9zY2FsZU9mZnNldC54KSx5OnYodCx0aGlzLl9zY2FsZU9mZnNldC55KSxzb3VyY2U6cn0pLHRoaXMuc2NhbGV8fChuPXRoaXMuX3NjYWxlKSxuPSsobj10aGlzLl9hZGp1c3RTY2FsZShuKSkudG9GaXhlZCgzKSxvJiZuIT09dGhpcy5fc2NhbGUmJnRoaXMuJHRyaWdnZXIoInNjYWxlIix7eDplLHk6dCxzY2FsZTpufSk7dmFyIGE9InRyYW5zbGF0ZSgiK2UrInB4LCAiK3QrInB4KSBzY2FsZSgiK24rIikiO3MudHJhbnNpdGlvbih0aGlzLiRyZWZzLmVsLHtzdHlsZXM6e3RyYW5zZm9ybTphfSxkdXJhdGlvbjowLGRlbGF5OjB9KSx0aGlzLl90cmFuc2xhdGVYPWUsdGhpcy5fdHJhbnNsYXRlWT10LHRoaXMuX3NjYWxlPW59LF90b3VjaHN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy4kcGFyZW50LnRvdWNoSXRlbT10aGlzfSxfZ2V0Q29tcG9uZW50U2l6ZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obil7dC5nZXRDb21wb25lbnRSZWN0KGUsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zaXplO24odCl9KX0pfSxfdXBkYXRlUmVjdDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuX2dldENvbXBvbmVudFNpemUodGhpcy4kcmVmcy5lbCkudGhlbihmdW5jdGlvbihlKXt0Ll9yZWN0PWV9KX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD17dG91Y2hzdGFydDp0aGlzLl90b3VjaHN0YXJ0fTtyZXR1cm4gZSgiZGl2Iix0aGlzLl9nKHtyZWY6ImVsIixvbjp0LHN0YXRpY0NsYXNzOlsidW5pLW1vdmFibGUtdmlldyJdLHN0YXRpY1N0eWxlOnt0cmFuc2Zvcm1PcmlnaW46ImNlbnRlciJ9LGF0dHJzOntwcmV2ZW50R2VzdHVyZTohMH19LHRoaXMuJGxpc3RlbmVycyksdGhpcy4kc2xvdHMuZGVmYXVsdCwyKX0sc3R5bGU6eyJ1bmktbW92YWJsZS12aWV3Ijp7cG9zaXRpb246ImFic29sdXRlIix0b3A6IjBweCIsbGVmdDoiMHB4Iix3aWR0aDoiMTBweCIsaGVpZ2h0OiIxMHB4In19fX1mdW5jdGlvbiBpbml0JDEyKGUsdCl7ZS5jb21wb25lbnQoIm1vdmFibGUtdmlldyIsZ2V0TW92YWJsZVZpZXcodCkpfXZhciBPUEVOX1RZUEVTJDE9e25hdmlnYXRlOiJuYXZpZ2F0ZVRvIixyZWRpcmVjdDoicmVkaXJlY3RUbyIsc3dpdGNoVGFiOiJzd2l0Y2hUYWIiLHJlTGF1bmNoOiJyZUxhdW5jaCIsbmF2aWdhdGVCYWNrOiJuYXZpZ2F0ZUJhY2sifSxBTklNQVRJT05fVFlQRV9JTj1bInNsaWRlLWluLXJpZ2h0Iiwic2xpZGUtaW4tbGVmdCIsInNsaWRlLWluLXRvcCIsInNsaWRlLWluLWJvdHRvbSIsImZhZGUtaW4iLCJ6b29tLW91dCIsInpvb20tZmFkZS1vdXQiLCJwb3AtaW4iLCJub25lIl0sQU5JTUFUSU9OX1RZUEVfT1VUPVsic2xpZGUtb3V0LXJpZ2h0Iiwic2xpZGUtb3V0LWxlZnQiLCJzbGlkZS1vdXQtdG9wIiwic2xpZGUtb3V0LWJvdHRvbSIsImZhZGUtb3V0Iiwiem9vbS1pbiIsInpvb20tZmFkZS1pbiIsInBvcC1vdXQiLCJub25lIl0scGx1c18sQnJvYWRjYXN0Q2hhbm5lbF8sY2hhbm5lbDtmdW5jdGlvbiBnZXROYXZpZ2F0b3IoZSx0KXtyZXR1cm57bmFtZToiTmF2aWdhdG9yIixpc1Jlc2VydmVkOiEwLHByb3BzOnt1cmw6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG9wZW5UeXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJuYXZpZ2F0ZSIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe3JldHVybiEhT1BFTl9UWVBFUyQxW2VdfX0sZGVsdGE6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MX0sYW5pbWF0aW9uVHlwZTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe3JldHVybiFlfHx+QU5JTUFUSU9OX1RZUEVfSU4uY29uY2F0KEFOSU1BVElPTl9UWVBFX09VVCkuaW5kZXhPZihlKX19LGFuaW1hdGlvbkR1cmF0aW9uOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjMwMH0saG92ZXJDbGFzczp7dHlwZTpTdHJpbmcsZGVmYXVsdDoibmF2aWdhdG9yLWhvdmVyIn0saG92ZXJTdG9wUHJvcGFnYXRpb246e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxob3ZlclN0YXJ0VGltZTp7dHlwZTpOdW1iZXIsZGVmYXVsdDo1MH0saG92ZXJTdGF5VGltZTp7dHlwZTpOdW1iZXIsZGVmYXVsdDo2MDB9fSxtZXRob2RzOntfY2xpY2s6ZnVuY3Rpb24oKXtpZigibmF2aWdhdGVCYWNrIj09PXRoaXMub3BlblR5cGV8fHRoaXMudXJsKXt2YXIgZT1wYXJzZUludCh0aGlzLmFuaW1hdGlvbkR1cmF0aW9uKTtzd2l0Y2godGhpcy5vcGVuVHlwZSl7Y2FzZSJuYXZpZ2F0ZSI6dC5uYXZpZ2F0ZVRvKHt1cmw6dGhpcy51cmwsYW5pbWF0aW9uVHlwZTp0aGlzLmFuaW1hdGlvblR5cGV8fCJwb3AtaW4iLGFuaW1hdGlvbkR1cmF0aW9uOmV9KTticmVhaztjYXNlInJlZGlyZWN0Ijp0LnJlZGlyZWN0VG8oe3VybDp0aGlzLnVybH0pO2JyZWFrO2Nhc2Uic3dpdGNoVGFiIjp0LnN3aXRjaFRhYih7dXJsOnRoaXMudXJsfSk7YnJlYWs7Y2FzZSJyZUxhdW5jaCI6dC5yZUxhdW5jaCh7dXJsOnRoaXMudXJsfSk7YnJlYWs7Y2FzZSJuYXZpZ2F0ZUJhY2siOnQubmF2aWdhdGVCYWNrKHtkZWx0YTp0aGlzLmRlbHRhLGFuaW1hdGlvblR5cGU6dGhpcy5hbmltYXRpb25UeXBlfHwicG9wLW91dCIsYW5pbWF0aW9uRHVyYXRpb246ZX0pfX1lbHNlIGNvbnNvbGUuZXJyb3IoIjxuYXZpZ2F0b3IvPiBzaG91bGQgaGF2ZSB1cmwgYXR0cmlidXRlIHdoZW4gdXNpbmcgbmF2aWdhdGVUbywgcmVkaXJlY3RUbywgcmVMYXVuY2ggb3Igc3dpdGNoVGFiIil9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUoInZpZXciLHRoaXMuX2coe2F0dHJzOntob3ZlckNsYXNzOnRoaXMuaG92ZXJDbGFzcyxob3ZlclN0b3BQcm9wYWdhdGlvbjp0aGlzLmhvdmVyU3RvcFByb3BhZ2F0aW9uLGhvdmVyU3RhcnRUaW1lOnRoaXMuaG92ZXJTdGFydFRpbWUsaG92ZXJTdGF5VGltZTp0aGlzLmhvdmVyU3RheVRpbWV9LG9uOntjbGljazp0aGlzLl9jbGlja319LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9LHN0eWxlOnsibmF2aWdhdG9yLWhvdmVyIjp7YmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDAuMSkiLG9wYWNpdHk6Ljd9fX19ZnVuY3Rpb24gaW5pdCQxMyhlLHQsbil7ZS5jb21wb25lbnQoIm5hdmlnYXRvciIsZ2V0TmF2aWdhdG9yKHQsbi51bmkpKX1mdW5jdGlvbiBnZXRSdW50aW1lKCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJiJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yJiYib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50PyJ3ZWJ2aWV3IjoidjgifWZ1bmN0aW9uIGdldFBhZ2VJZCgpe3JldHVybiBwbHVzXy53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuaWR9dmFyIGNhbGxiYWNrcz17fTtmdW5jdGlvbiBvblBsdXNNZXNzYWdlKGUpe3ZhciB0PWUuZGF0YSYmZS5kYXRhLl9fbWVzc2FnZTtpZih0JiZ0Ll9fcGFnZSl7dmFyIG49dC5fX3BhZ2Uscj1jYWxsYmFja3Nbbl07ciYmcih0KSx0LmtlZXB8fGRlbGV0ZSBjYWxsYmFja3Nbbl19fWZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZSx0KXsidjgiPT09Z2V0UnVudGltZSgpPyhjaGFubmVsJiZjaGFubmVsLmNsb3NlKCksKGNoYW5uZWw9bmV3IEJyb2FkY2FzdENoYW5uZWxfKGdldFBhZ2VJZCgpKSkub25tZXNzYWdlPW9uUGx1c01lc3NhZ2UpOndpbmRvdy5fX3BsdXNNZXNzYWdlPW9uUGx1c01lc3NhZ2UsY2FsbGJhY2tzW2VdPXR9dmFyIFBhZ2U9ZnVuY3Rpb24oZSl7dGhpcy53ZWJ2aWV3PWV9O2Z1bmN0aW9uIHNob3dQYWdlKGUpe3ZhciB0PWUuY29udGV4dDt2b2lkIDA9PT10JiYodD17fSk7dmFyIG49ZS51cmwscj1lLmRhdGE7dm9pZCAwPT09ciYmKHI9e30pO3ZhciBpPWUuc3R5bGU7dm9pZCAwPT09aSYmKGk9e30pO3ZhciBvPWUub25NZXNzYWdlLGE9ZS5vbkNsb3NlO3BsdXNfPXQucGx1c3x8cGx1cyxCcm9hZGNhc3RDaGFubmVsXz10LkJyb2FkY2FzdENoYW5uZWx8fEJyb2FkY2FzdENoYW5uZWw7dmFyIHM9InBhZ2UiK0RhdGUubm93KCk7ITEhPT0oaT1PYmplY3QuYXNzaWduKHt9LGkpKS50aXRsZU5WaWV3JiYibm9uZSIhPT1pLnRpdGxlTlZpZXcmJihpLnRpdGxlTlZpZXc9T2JqZWN0LmFzc2lnbih7YXV0b0JhY2tCdXR0b246ITAsdGl0bGVTaXplOiIxN3B4In0saS50aXRsZU5WaWV3KSk7dmFyIGM9e3RvcDowLGJvdHRvbTowLHVzaW5nQ29tcG9uZW50czp7fSxwb3BHZXN0dXJlOiJjbG9zZSIsc2Nyb2xsSW5kaWNhdG9yOiJub25lIixhbmltYXRpb25UeXBlOiJwb3AtaW4iLGFuaW1hdGlvbkR1cmF0aW9uOjIwMCx1bmlOVmlldzp7cGF0aDooIm9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiZwcm9jZXNzLmVudiYmcHJvY2Vzcy5lbnYuVlVFX0FQUF9URU1QTEFURV9QQVRIfHwiIikrIi8iK24rIi5qcyIsZGVmYXVsdEZvbnRTaXplOjE2LHZpZXdwb3J0OnBsdXNfLnNjcmVlbi5yZXNvbHV0aW9uV2lkdGh9fTtpPU9iamVjdC5hc3NpZ24oYyxpKTt2YXIgdT1wbHVzXy53ZWJ2aWV3LmNyZWF0ZSgiIixzLGkse2V4dHJhczp7ZnJvbTpnZXRQYWdlSWQoKSxydW50aW1lOmdldFJ1bnRpbWUoKSxkYXRhOnJ9fSk7cmV0dXJuIHUuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGEpLGFkZEV2ZW50TGlzdGVuZXIocyxmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgbyYmbyhlLmRhdGEpLGUua2VlcHx8dS5jbG9zZSgiYXV0byIpfSksdS5zaG93KGkuYW5pbWF0aW9uVHlwZSxpLmFuaW1hdGlvbkR1cmF0aW9uKSxuZXcgUGFnZSh1KX1mdW5jdGlvbiBnZXRQaWNrZXIoZSx0KXt2YXIgbz17U0VMRUNUT1I6InNlbGVjdG9yIixNVUxUSVNFTEVDVE9SOiJtdWx0aVNlbGVjdG9yIixUSU1FOiJ0aW1lIixEQVRFOiJkYXRlIn0sYT17WUVBUjoieWVhciIsTU9OVEg6Im1vbnRoIixEQVk6ImRheSJ9LHI9WyJyYW5nZSIsInJhbmdlS2V5IiwidmFsdWUiLCJtb2RlIiwiZmllbGRzIiwic3RhcnQiLCJlbmQiLCJkaXNhYmxlZCJdO2Z1bmN0aW9uIHMoZSl7cmV0dXJuIDk8ZT9lOiIwIitlfWZ1bmN0aW9uIGMoZSx0KXt2YXIgbj1uZXcgRGF0ZTtyZXR1cm4gZT1TdHJpbmcoZXx8IiIpLHQ9PT1vLlRJTUU/Mj09PShlPWUuc3BsaXQoIjoiKSkubGVuZ3RoJiZuLnNldEhvdXJzKHBhcnNlSW50KGVbMF0pLHBhcnNlSW50KGVbMV0pKTozPT09KGU9ZS5zcGxpdCgiLSIpKS5sZW5ndGgmJm4uc2V0RnVsbFllYXIocGFyc2VJbnQoZVswXSkscGFyc2VJbnQoZVsxXS0xKSxwYXJzZUludChlWzJdKSksbn1yZXR1cm57bmFtZToiUGlja2VyIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcl0scHJvcHM6e3JhbmdlOnt0eXBlOkFycmF5LGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHJhbmdlS2V5Ont0eXBlOlN0cmluZyxkZWZhdWx0OiIifSx2YWx1ZTp7dHlwZTpbTnVtYmVyLFN0cmluZyxBcnJheV0sZGVmYXVsdDowfSxtb2RlOnt0eXBlOlN0cmluZyxkZWZhdWx0Om8uU0VMRUNUT1IsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe3JldHVybiAwPD1PYmplY3QudmFsdWVzKG8pLmluZGV4T2YoZSl9fSxmaWVsZHM6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHN0YXJ0Ont0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5tb2RlPT09by5USU1FKXJldHVybiIwMDowMCI7aWYodGhpcy5tb2RlPT09by5EQVRFKXt2YXIgZT0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCktMTAwO3N3aXRjaCh0aGlzLmZpZWxkcyl7Y2FzZSBhLllFQVI6cmV0dXJuIGU7Y2FzZSBhLk1PTlRIOnJldHVybiBlKyItMDEiO2RlZmF1bHQ6cmV0dXJuIGUrIi0wMS0wMSJ9fXJldHVybiIifX0sZW5kOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5tb2RlPT09by5USU1FKXJldHVybiIyMzo1OSI7aWYodGhpcy5tb2RlPT09by5EQVRFKXt2YXIgZT0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCkrMTAwO3N3aXRjaCh0aGlzLmZpZWxkcyl7Y2FzZSBhLllFQVI6cmV0dXJuIGU7Y2FzZSBhLk1PTlRIOnJldHVybiBlKyItMTIiO2RlZmF1bHQ6cmV0dXJuIGUrIi0xMi0zMSJ9fXJldHVybiIifX0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfX0sY29tcHV0ZWQ6e2F0dHJzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPXt9O3JldHVybiByLmZvckVhY2goZnVuY3Rpb24oZSl7bltlXT10LiRwcm9wc1tlXX0pLG59fSxtZXRob2RzOntfc2hvdzpmdW5jdGlvbigpe3RoaXMuX3Nob3dQaWNrZXIoT2JqZWN0LmFzc2lnbih7fSx0aGlzLmF0dHJzKSl9LF9zaG93UGlja2VyOmZ1bmN0aW9uKG4pe3ZhciByPXRoaXMsZT10LnBsdXN8fG5ldyB0LldlZXhQbHVzKHQud2VleCk7aWYoZS5rZXkuaGlkZVNvZnRLZXlib3JkKCksdGhpcy5tb2RlIT09by5USU1FJiZ0aGlzLm1vZGUhPT1vLkRBVEV8fG4uZmllbGRzKXtuLmZpZWxkcz1PYmplY3QudmFsdWVzKGEpLmluY2x1ZGVzKG4uZmllbGRzKT9uLmZpZWxkczphLkRBWTt2YXIgaT17ZXZlbnQ6ImNhbmNlbCJ9O3RoaXMucGFnZT1zaG93UGFnZSh7Y29udGV4dDpPYmplY3QuYXNzaWduKHt9LHQse3BsdXM6ZX0pLHVybDoiX191bmlhcHBwaWNrZXIiLGRhdGE6bixzdHlsZTp7dGl0bGVOVmlldzohMSxhbmltYXRpb25UeXBlOiJub25lIixhbmltYXRpb25EdXJhdGlvbjowLGJhY2tncm91bmQ6InJnYmEoMCwwLDAsMCkiLHBvcEdlc3R1cmU6Im5vbmUifSxvbk1lc3NhZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ldmVudDtpZigiY3JlYXRlZCIhPT10KXJldHVybiJjb2x1bW5jaGFuZ2UiPT09dD8oZGVsZXRlIGUuZXZlbnQsdm9pZCByLiR0cmlnZ2VyKHQsZSkpOnZvaWQoaT1lKTtyLl91cGRhdGVQaWNrZXIobil9LG9uQ2xvc2U6ZnVuY3Rpb24oKXtyLnBhZ2U9bnVsbDt2YXIgZT1pLmV2ZW50O2RlbGV0ZSBpLmV2ZW50LHIuJHRyaWdnZXIoZSxpKX19KX1lbHNlIGUubmF0aXZlVUlbdGhpcy5tb2RlPT09by5USU1FPyJwaWNrVGltZSI6InBpY2tEYXRlIl0oZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRlO3IuJHRyaWdnZXIoImNoYW5nZSIse3ZhbHVlOnIubW9kZT09PW8uVElNRT9zKHQuZ2V0SG91cnMoKSkrIjoiK3ModC5nZXRNaW51dGVzKCkpOnQuZ2V0RnVsbFllYXIoKSsiLSIrcyh0LmdldE1vbnRoKCkrMSkrIi0iK3ModC5nZXREYXRlKCkpfSl9LGZ1bmN0aW9uKCl7ci4kdHJpZ2dlcigiY2FuY2VsIix7fSl9LHRoaXMubW9kZT09PW8uVElNRT97dGltZTpjKHRoaXMudmFsdWUsby5USU1FKX06e2RhdGU6Yyh0aGlzLnZhbHVlLG8uREFURSksbWluRGF0ZTpjKHRoaXMuc3RhcnQsby5EQVRFKSxtYXhEYXRlOmModGhpcy5lbmQsby5EQVRFKX0pfSxfdXBkYXRlUGlja2VyOmZ1bmN0aW9uKGUpe3RoaXMucGFnZSYmdGhpcy5wYWdlLnNlbmRNZXNzYWdlKGUpfX0sY3JlYXRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy4kd2F0Y2goImF0dHJzIixmdW5jdGlvbihlKXt0Ll91cGRhdGVQaWNrZXIoZSl9LHtkZWVwOiEwfSl9LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD17fTtyZXR1cm4gdGhpcy5kaXNhYmxlZHx8KHQuY2xpY2s9dGhpcy5fc2hvdyksZSgiZGl2Iix0aGlzLl9nKHtvbjp0fSx0aGlzLiRsaXN0ZW5lciksdGhpcy4kc2xvdHMuZGVmYXVsdCwyKX19fWZ1bmN0aW9uIGluaXQkMTQoZSx0LG4pe2UuY29tcG9uZW50KCJwaWNrZXIiLGdldFBpY2tlcih0LG4pKX1QYWdlLnByb3RvdHlwZS5zZW5kTWVzc2FnZT1mdW5jdGlvbihlKXt2YXIgdD1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtfX21lc3NhZ2U6e2RhdGE6ZX19KSk7bmV3IEJyb2FkY2FzdENoYW5uZWxfKHRoaXMud2Vidmlldy5pZCkucG9zdE1lc3NhZ2UodCl9LFBhZ2UucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy53ZWJ2aWV3LmNsb3NlKCl9O3ZhciBQUklNQVJZX0NPTE9SPSIjMDA3QUZGIixCQUNLR1JPVU5EX0NPTE9SPSIjRUJFQkVCIixBTklNQVRFX0lOVEVSVkFMX0RFRkFVTFQ9MzAsRk9OVF9TSVpFPTE2LFNUUk9LRV9XSURUSD02O2Z1bmN0aW9uIGdldFByb2dyZXNzKGUsbil7cmV0dXJue25hbWU6IlByb2dyZXNzIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcl0scHJvcHM6e3BlcmNlbnQ6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6MH0sc2hvd0luZm86e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxib3JkZXJSYWRpdXM6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6MH0sZm9udFNpemU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6Rk9OVF9TSVpFfSxzdHJva2VXaWR0aDp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpTVFJPS0VfV0lEVEh9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGFjdGl2ZUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OlBSSU1BUllfQ09MT1J9LGFjdGl2ZU1vZGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImJhY2t3YXJkcyJ9LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDpCQUNLR1JPVU5EX0NPTE9SfSxkdXJhdGlvbjp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpBTklNQVRFX0lOVEVSVkFMX0RFRkFVTFR9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOjAsY3VyUGVyY2VudDowfX0sY29tcHV0ZWQ6e2JhclN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJue2hlaWdodDp0aGlzLnN0cm9rZVdpZHRoLGJvcmRlclJhZGl1czp0aGlzLmJvcmRlclJhZGl1cyxiYWNrZ3JvdW5kQ29sb3I6dGhpcy5iYWNrZ3JvdW5kQ29sb3J9fSxpbm5lckJhclN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOnRoaXMuYWN0aXZlV2lkdGgsaGVpZ2h0OnRoaXMuc3Ryb2tlV2lkdGgsYmFja2dyb3VuZENvbG9yOnRoaXMuYWN0aXZlQ29sb3J9fSxhY3RpdmVXaWR0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN1clBlcmNlbnQqdGhpcy53aWR0aC8xMDB9LGZpbmFsUGVyY2VudDpmdW5jdGlvbigpe3ZhciBlPXBhcnNlRmxvYXQodGhpcy5wZXJjZW50LDEwKTtyZXR1cm4gMTAwPGUmJihlPTEwMCksZTwwJiYoZT0wKSxlfX0sd2F0Y2g6e2ZpbmFsUGVyY2VudDpmdW5jdGlvbihlLHQpe3RoaXMuX3RpbWVySWQmJm4uY2xlYXJJbnRlcnZhbCh0aGlzLl90aW1lcklkKSx0aGlzLl9sYXN0UGVyY2VudD10fHwwLHRoaXMuX2FuaW1hdGUoKX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnJlcXVpcmVNb2R1bGUoImRvbSIpLmdldENvbXBvbmVudFJlY3QodC4kcmVmcy5wcm9ncmVzcyxmdW5jdGlvbihlKXt0LndpZHRoPWUuc2l6ZS53aWR0aCx0Ll9hbmltYXRlKCl9KX0sNTApfSxtZXRob2RzOntfYW5pbWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLmZpbmFsUGVyY2VudDtpZighdGhpcy5hY3RpdmUpcmV0dXJuIHRoaXMuY3VyUGVyY2VudD10O3RoaXMuY3VyUGVyY2VudD0iZm9yd2FyZHMiPT09dGhpcy5hY3RpdmVNb2RlP3RoaXMuX2xhc3RQZXJjZW50OjAsdGhpcy5fdGltZXJJZD1uLnNldEludGVydmFsKGZ1bmN0aW9uKCl7dDw9ZS5jdXJQZXJjZW50KzE/KGUuY3VyUGVyY2VudD10LG4uY2xlYXJJbnRlcnZhbChlLl90aW1lcklkKSxlLiR0cmlnZ2VyKCJhY3RpdmVlbmQiLHtjdXJQZXJjZW50OmUuY3VyUGVyY2VudH0pKTorK2UuY3VyUGVyY2VudH0sdGhpcy5kdXJhdGlvbil9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUoImRpdiIsdGhpcy5fZyh7cmVmOiJwcm9ncmVzcyIsc3RhdGljQ2xhc3M6WyJ1bmktcHJvZ3Jlc3MiXX0sdGhpcy4kbGlzdGVuZXJzKSxbZSgiZGl2Iix7c3RhdGljQ2xhc3M6WyJ1bmktcHJvZ3Jlc3MtYmFyIl0sc3R5bGU6dGhpcy5iYXJTdHlsZX0sW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXByb2dyZXNzLWlubmVyLWJhciJdLHN0eWxlOnRoaXMuaW5uZXJCYXJTdHlsZX0pXSksdGhpcy5zaG93SW5mbz9bZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1bmktcHJvZ3Jlc3MtaW5mbyJdLHN0eWxlOntmb250U2l6ZTp0aGlzLmZvbnRTaXplfX0sW3RoaXMuY3VyUGVyY2VudCsiJSJdKV06dGhpcy5fZSgpXSwyKX0sc3R5bGU6eyJ1bmktcHJvZ3Jlc3MiOntmbGV4OjEsZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIifSwidW5pLXByb2dyZXNzLWJhciI6e2ZsZXg6MX0sInVuaS1wcm9ncmVzcy1pbm5lci1iYXIiOntwb3NpdGlvbjoiYWJzb2x1dGUifSwidW5pLXByb2dyZXNzLWluZm8iOnttYXJnaW5MZWZ0OiIxNXB4In19fX1mdW5jdGlvbiBpbml0JDE1KGUsdCxuKXtlLmNvbXBvbmVudCgicHJvZ3Jlc3MiLGdldFByb2dyZXNzKHQsbikpfWZ1bmN0aW9uIGdldFJhZGlvR3JvdXAoZSl7cmV0dXJue25hbWU6IlJhZGlvR3JvdXAiLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10scHJvcHM6e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3JhZGlvTGlzdDpbXX19LGxpc3RlbmVyczp7IkByYWRpby1jaGFuZ2UiOiJfY2hhbmdlSGFuZGxlciIsIkByYWRpby1ncm91cC11cGRhdGUiOiJfcmFkaW9Hcm91cFVwZGF0ZUhhbmRsZXIifSxtb3VudGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVzZXRSYWRpb0dyb3VwVmFsdWUodGhpcy5yYWRpb0xpc3QubGVuZ3RoLTEpfSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJ1bmktZm9ybS1ncm91cC11cGRhdGUiLHt0eXBlOiJhZGQiLHZtOnRoaXN9KX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToicmVtb3ZlIix2bTp0aGlzfSl9LG1ldGhvZHM6e19jaGFuZ2VIYW5kbGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5yYWRpb0xpc3QuaW5kZXhPZih0KTt0aGlzLl9yZXNldFJhZGlvR3JvdXBWYWx1ZShuLCEwKSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTp0LnJhZGlvVmFsdWV9KX0sX3JhZGlvR3JvdXBVcGRhdGVIYW5kbGVyOmZ1bmN0aW9uKGUpe2lmKCJhZGQiPT09ZS50eXBlKXRoaXMucmFkaW9MaXN0LnB1c2goZS52bSk7ZWxzZXt2YXIgdD10aGlzLnJhZGlvTGlzdC5pbmRleE9mKGUudm0pO3RoaXMucmFkaW9MaXN0LnNwbGljZSh0LDEpfX0sX3Jlc2V0UmFkaW9Hcm91cFZhbHVlOmZ1bmN0aW9uKHQscil7dmFyIGk9dGhpczt0aGlzLnJhZGlvTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUsbil7biE9PXQmJihyP2kucmFkaW9MaXN0W25dLnJhZGlvQ2hlY2tlZD0hMTppLnJhZGlvTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7dDw9bnx8aS5yYWRpb0xpc3RbdF0ucmFkaW9DaGVja2VkJiYoaS5yYWRpb0xpc3Rbbl0ucmFkaW9DaGVja2VkPSExKX0pKX0pfSxfZ2V0Rm9ybURhdGE6ZnVuY3Rpb24oKXt2YXIgZT17fTtpZigiIiE9PXRoaXMubmFtZSl7dmFyIHQ9IiI7dGhpcy5yYWRpb0xpc3QuZm9yRWFjaChmdW5jdGlvbihlKXtlLnJhZGlvQ2hlY2tlZCYmKHQ9ZS52YWx1ZSl9KSxlLnZhbHVlPXQsZS5rZXk9dGhpcy5uYW1lfXJldHVybiBlfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJkaXYiLHRoaXMuX2coe30sdGhpcy4kbGlzdGVuZXJzKSxbdGhpcy5fdCgiZGVmYXVsdCIpXSwyKX19fWZ1bmN0aW9uIGluaXQkMTYoZSx0KXtlLmNvbXBvbmVudCgicmFkaW8tZ3JvdXAiLGdldFJhZGlvR3JvdXAodCkpfWZ1bmN0aW9uIGdldFJhZGlvKGUpe3JldHVybntuYW1lOiJSYWRpbyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7Y2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3QUZGIn0sdmFsdWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3JhZGlvQ2hlY2tlZDp0aGlzLmNoZWNrZWQscmFkaW9WYWx1ZTp0aGlzLnZhbHVlfX0sbGlzdGVuZXJzOnsibGFiZWwtY2xpY2siOiJfb25DbGljayIsIkBsYWJlbC1jbGljayI6Il9vbkNsaWNrIn0sY29tcHV0ZWQ6e2NoZWNrZWRTdHlsZTpmdW5jdGlvbigpe3JldHVybntiYWNrZ3JvdW5kQ29sb3I6dGhpcy5jb2xvcixib3JkZXJDb2xvcjp0aGlzLmNvbG9yfX0sdW5jaGVja2VkU3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm57Ym9yZGVyQ29sb3I6IiNkMWQxZDEifX19LHdhdGNoOntjaGVja2VkOmZ1bmN0aW9uKGUpe3RoaXMucmFkaW9DaGVja2VkPWV9LHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMucmFkaW9WYWx1ZT1lfX0sYmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy4kZGlzcGF0Y2goIlJhZGlvR3JvdXAiLCJ1bmktcmFkaW8tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSksdGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJ1bmktZm9ybS1ncm91cC11cGRhdGUiLHt0eXBlOiJhZGQiLHZtOnRoaXN9KX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJSYWRpb0dyb3VwIiwidW5pLXJhZGlvLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pLHRoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToicmVtb3ZlIix2bTp0aGlzfSl9LG1ldGhvZHM6e19vbkNsaWNrOmZ1bmN0aW9uKGUpe3RoaXMuZGlzYWJsZWR8fHRoaXMucmFkaW9DaGVja2VkfHwodGhpcy5yYWRpb0NoZWNrZWQ9ITAsdGhpcy4kZGlzcGF0Y2goIlJhZGlvR3JvdXAiLCJ1bmktcmFkaW8tY2hhbmdlIixlLHRoaXMpKX0sX3Jlc2V0Rm9ybURhdGE6ZnVuY3Rpb24oKXt0aGlzLnJhZGlvQ2hlY2tlZD0hMX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiBlKCJkaXYiLHQuX2coe3N0YXRpY0NsYXNzOlsidW5pLXJhZGlvIl0sYXR0cnM6e2RhdGFVbmNUeXBlOiJ1bmktcmFkaW8ifSxvbjp7Y2xpY2s6dC5fb25DbGlja319LHQuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXJhZGlvLWlucHV0Il0sc3R5bGU6dC5yYWRpb0NoZWNrZWQ/dC5jaGVja2VkU3R5bGU6dC51bmNoZWNrZWRTdHlsZX0sW3QucmFkaW9DaGVja2VkP2UoInUtdGV4dCIse3N0YXRpY0NsYXNzOlsidW5pLXJhZGlvLWlucHV0LWljb24iXX0sW3QuX3YodC5fcygi7qiIIikpXSk6dC5fZSgpXSwxKSxlKCJ1LXRleHQiLHtzdGF0aWNDbGFzczpbInVuaS10ZXh0Il19LFt0Ll90KCJkZWZhdWx0IildLDIpXSwxKX0sc3R5bGU6eyJ1bmktcmFkaW8iOnthbGlnbkl0ZW1zOiJjZW50ZXIiLGZsZXhEaXJlY3Rpb246InJvdyJ9LCJ1bmktcmFkaW8taW5wdXQiOntwb3NpdGlvbjoicmVsYXRpdmUiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsbWFyZ2luUmlnaHQ6IjUiLGJhY2tncm91bmRDb2xvcjoiI2ZmZmZmZiIsYm9yZGVyU3R5bGU6InNvbGlkIixib3JkZXJXaWR0aDoiMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGJvcmRlclJhZGl1czo1MCx3aWR0aDoiMjIiLGhlaWdodDoiMjIiLG91dGxpbmU6MH0sInVuaS1yYWRpby1pbnB1dC1pY29uIjp7Zm9udEZhbWlseToidW5pbmNvbXBvbmVudHMiLGZvbnRTaXplOiIxNCIsY29sb3I6IiNmZmZmZmYifSwidW5pLXJhZGlvLWlucHV0LWRpc2FibGVkIjp7YmFja2dyb3VuZENvbG9yOiIjZTFlMWUxIixib3JkZXJDb2xvcjoiI2QxZDFkMSIsY29sb3I6IiNhZGFkYWQifX19fWZ1bmN0aW9uIGluaXQkMTcoZSx0KXtlLmNvbXBvbmVudCgicmFkaW8iLGdldFJhZGlvKHQpKX1mdW5jdGlvbiBub3JtYWxpemVOb2RlcyhlLHQsbil7dmFyIGM9WyJzcGFuIiwiYSIsImltYWdlIiwiaW1nIl07ZnVuY3Rpb24gYShlKXtyZXR1cm4gZS5fX2Jsb2NrPSEwLGV9ZnVuY3Rpb24gcihvKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gcj1vLGk9dCwhKG49ZSkuc3R5bGUuZm9udFNpemUmJihuLnN0eWxlLmZvbnRTaXplPWkuZGVmYXVsdEZvbnRTaXplKnIpLGEocyhuKSk7dmFyIG4scixpfX1mdW5jdGlvbiBzKGUpe3JldHVybiFlLnN0eWxlLmZvbnRXZWlnaHQmJihlLnN0eWxlLmZvbnRXZWlnaHQ9ImJvbGQiKSxlfXZhciB1PXtibG9ja3F1b3RlOmEsYnI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX192YWx1ZT0iICIsYShlKX0sZGl2OmEsZGw6YSxoMTpyKDIpLGgyOnIoMS41KSxoMzpyKDEuMTcpLGg0OnIoMSksaDU6ciguODMpLGg2OnIoLjY3KSxocjphLG9sOmEscDphLHN0cm9uZzpzLHRhYmxlOmEsdGJvZHk6YSx0Zm9vdDphLHRoZWFkOmEsdWw6YX0sbD0vJihhbXB8Z3R8bHR8bmJzcHxxdW90fGFwb3MpOy9nLGQ9e2FtcDoiJiIsZ3Q6Ij4iLGx0OiI8IixuYnNwOiIgIixxdW90OiciJyxhcG9zOiInIn07dmFyIGYscD17X19ibG9jazohMCxfX2JyZWFrOiEwLGNoaWxkcmVuOltdfTtmdW5jdGlvbiBpKHQsZSxuKXt2YXIgcj0odC5uYW1lfHwiIikudG9Mb3dlckNhc2UoKSxpPXIsbz11W3JdOy0xPT09Yy5pbmRleE9mKHIpJiYocj0ic3BhbiIpLCJpbWciPT09ciYmKHI9ImltYWdlIik7dmFyIGE9e3R5cGU6cixfX3R5cGU6aSxhdHRyOk9iamVjdC5jcmVhdGUobnVsbCl9O2lmKCgidGV4dCI9PT10LnR5cGV8fHQudGV4dCkmJihhLl9fdmFsdWU9YS5hdHRyLnZhbHVlPSh0LnRleHR8fCIiKS50cmltKCkucmVwbGFjZShsLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGRbdF19KSksdC5hdHRycyYmT2JqZWN0LmtleXModC5hdHRycykuZm9yRWFjaChmdW5jdGlvbihlKXsiY2xhc3MiIT09ZSYmInN0eWxlIiE9PWUmJihhLmF0dHJbZV09dC5hdHRyc1tlXSl9KSxhLnN0eWxlPW5vcm1hbGl6ZVVuaXQoZnVuY3Rpb24oZSx0KXt2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKGUuYXR0cnMpe3ZhciByPShlLmF0dHJzLmNsYXNzfHwiIikuc3BsaXQoIiAiKSxpPXQuJG9wdGlvbnMuc3R5bGV8fHt9O3IuZm9yRWFjaChmdW5jdGlvbihlKXtlJiZpW2VdJiZPYmplY3QuYXNzaWduKG4saVtlXSl9KSxPYmplY3QuYXNzaWduKG4scGFyc2VTdHlsZVRleHQoZS5hdHRycy5zdHlsZXx8IiIpKX1pZigiaW1nIj09PWUubmFtZXx8ImltYWdlIj09PWUubmFtZSl7dmFyIG89ZS5hdHRycztuLndpZHRoPW4ud2lkdGh8fG8ud2lkdGgsbi5oZWlnaHQ9bi5oZWlnaHR8fG8uaGVpZ2h0fXJldHVybiBufSh0LGUpKSxvJiZvKGEsbiksKHAuX19ibG9ja3x8YS5fX2Jsb2NrKSYmIWYpe3ZhciBzPXt0eXBlOiJzcGFuIixfX3R5cGU6ImJyZWFrIixhdHRyOnt2YWx1ZToiXG4ifX07cC5jaGlsZHJlbi5wdXNoKHMpLGY9W3Asc119cmV0dXJuKChwPWEpLl9fdmFsdWV8fCJpbWFnZSI9PT1wLnR5cGUmJnAuYXR0ci5zcmMpJiYoZj1udWxsKSxhLmNoaWxkcmVuPWgodC5jaGlsZHJlbixlLG4pLChwPWEpLl9fYmxvY2smJnAuc3R5bGUuaGVpZ2h0JiYhL14wKHB4KT8kLy50ZXN0KHAuc3R5bGUuaGVpZ2h0KSYmKGY9bnVsbCksYX1mdW5jdGlvbiBoKGUsdCxuKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gaShlLHQsbil9KTpbXX12YXIgbz1oKGUsdCxuKTtpZihmKXt2YXIgdj1mWzBdLGc9ZlsxXSxtPXYuY2hpbGRyZW4seT1tLmluZGV4T2YoZyk7bS5zcGxpY2UoeSwxKX1yZXR1cm4gb31mdW5jdGlvbiBnZXRSaWNoVGV4dChlKXtyZXR1cm57bmFtZToiUmljaFRleHQiLGlzUmVzZXJ2ZWQ6ITAscHJvcHM6e25vZGVzOnt0eXBlOltBcnJheSxTdHJpbmddLGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9bm9ybWFsaXplTm9kZXModGhpcy5ub2Rlc3x8W10sdGhpcy4kdm5vZGUuY29udGV4dCx7ZGVmYXVsdEZvbnRTaXplOjE2fSk7cmV0dXJuIGUoInUtcmljaC10ZXh0Iix0aGlzLl9nKHthdHRyczp7dmFsdWU6dH19LHRoaXMuJGxpc3RlbmVycykpfX19ZnVuY3Rpb24gaW5pdCQxOChlLHQpe2UuY29tcG9uZW50KCJyaWNoLXRleHQiLGdldFJpY2hUZXh0KHQpKX1mdW5jdGlvbiBnZXRTd2lwZXJJdGVtKGUpe3JldHVybntuYW1lOiJTd2lwZXJJdGVtIixpc1Jlc2VydmVkOiEwLHByb3BzOntpdGVtSWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUoImRpdiIsdGhpcy5fZyh7c3RhdGljQ2xhc3M6WyJ1bmktc3dpcGVyLWl0ZW0iXSxzdGF0aWNTdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAsdG9wOjAscmlnaHQ6MCxib3R0b206MCxvdmVyZmxvdzoiaGlkZGVuIn19LHRoaXMuJGxpc3RlbmVycyksdGhpcy5fdCgiZGVmYXVsdCIpLDIpfX19ZnVuY3Rpb24gaW5pdCQxOShlLHQpe2UuY29tcG9uZW50KCJzd2lwZXItaXRlbSIsZ2V0U3dpcGVySXRlbSh0KSl9ZnVuY3Rpb24gZ2V0U3dpcGVyKHIpe3ZhciB0PXIucmVxdWlyZU1vZHVsZSgiZG9tIik7cmV0dXJue25hbWU6IlN3aXBlciIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXJdLHByb3BzOntpbmRpY2F0b3JEb3RzOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sdmVydGljYWw6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxhdXRvcGxheTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNpcmN1bGFyOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0saW50ZXJ2YWw6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NWUzfSxkdXJhdGlvbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDo1MDB9LGN1cnJlbnQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0saW5kaWNhdG9yQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6InJnYmEoMCwwLDAsLjMpIn0saW5kaWNhdG9yQWN0aXZlQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDAwMDAifSxwcmV2aW91c01hcmdpbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbmV4dE1hcmdpbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sY3VycmVudEl0ZW1JZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sc2tpcEhpZGRlbkl0ZW1MYXlvdXQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxkaXNwbGF5TXVsdGlwbGVJdGVtczp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxfSxkaXNhYmxlVG91Y2g6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntjdXJyZW50U3luYzp0aGlzLmN1cnJlbnQsY3VycmVudENoYW5nZVNvdXJjZToiYXV0b3BsYXkifX0sd2F0Y2g6e2N1cnJlbnQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJyZW50Q2hlY2soKX0sY3VycmVudEl0ZW1JZDpmdW5jdGlvbigpe3RoaXMuX2N1cnJlbnRDaGVjaygpfSxjdXJyZW50U3luYzpmdW5jdGlvbigpe3RoaXMuJHRyaWdnZXIoImNoYW5nZSIsdGhpcy5fZ2V0RGV0YWlsKCkpfX0sbWV0aG9kczp7b25DaGFuZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kZXRhaWw7InN0cmluZyI9PXR5cGVvZiB0LnNvdXJjZSYmKHRoaXMuY3VycmVudENoYW5nZVNvdXJjZT10LnNvdXJjZSksdGhpcy5jdXJyZW50U3luYz10LmluZGV4LHRoaXMuX2xhc3RPZmZzZXRSYXRpbz0wfSxvblNjcm9sbDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnZlcnRpY2FsP2UuZGV0YWlsLm9mZnNldFlSYXRpbzplLmRldGFpbC5vZmZzZXRYUmF0aW87aWYoKGUuZHJhZ3x8ZS5kZXRhaWwuZHJhZykmJih0aGlzLmN1cnJlbnRDaGFuZ2VTb3VyY2U9InRvdWNoIiksMD09PXQpe3ZhciBuPU1hdGguYWJzKHRoaXMuX2xhc3RPZmZzZXRSYXRpbyk7aWYoMT09PW4pcmV0dXJuOy41PG4mJih0PTEpfXRoaXMuX2xhc3RPZmZzZXRSYXRpbz10LHRoaXMuJHRyaWdnZXIoInRyYW5zaXRpb24iLHtkeDp0aGlzLnZlcnRpY2FsPzA6LXRoaXMuX3dpZHRoKnQsZHk6dGhpcy52ZXJ0aWNhbD8tdGhpcy5faGVpZ2h0KnQ6MH0pfSxvblNjcm9sbEVuZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49ZnVuY3Rpb24oKXt0LiR0cmlnZ2VyKCJhbmltYXRpb25maW5pc2giLHQuX2dldERldGFpbCgpKSx0LmN1cnJlbnRDaGFuZ2VTb3VyY2U9ImF1dG9wbGF5In07ImlPUyI9PT1yLmNvbmZpZy5lbnYucGxhdGZvcm0/c2V0VGltZW91dChuLDUwKTpuKCl9LF9nZXREZXRhaWw6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmN1cnJlbnRTeW5jLHQ9dGhpcy5pdGVtc1tlXXx8e307cmV0dXJue2N1cnJlbnQ6ZSxjdXJyZW50SXRlbUlkOnQuY29tcG9uZW50SW5zdGFuY2UmJnQuY29tcG9uZW50SW5zdGFuY2UuaXRlbUlkfHwiIixzb3VyY2U6dGhpcy5jdXJyZW50Q2hhbmdlU291cmNlfX0sX2N1cnJlbnRDaGVjazpmdW5jdGlvbigpe3ZhciBlPS0xO2lmKHRoaXMuY3VycmVudEl0ZW1JZClmb3IodmFyIHQ9MCxuPXRoaXMuaXRlbXM7dDxuLmxlbmd0aDt0Kyspe3ZhciByPW5bdF0uY29tcG9uZW50SW5zdGFuY2U7aWYociYmci5pdGVtSWQ9PT10aGlzLmN1cnJlbnRJdGVtSWQpe2U9dDticmVha319ZTwwJiYoZT1NYXRoLnJvdW5kKHRoaXMuY3VycmVudCl8fDApLGU9ZTwwPzA6ZSx0aGlzLmN1cnJlbnRTeW5jIT09ZSYmKHRoaXMuY3VycmVudENoYW5nZVNvdXJjZT0iIix0aGlzLmN1cnJlbnRTeW5jPWUpfSxfZ2V0V0g6ZnVuY3Rpb24oKXt2YXIgcj10aGlzO3RoaXMuX2dldENvbXBvbmVudFNpemUodGhpcy4kcmVmcy5lbCkudGhlbihmdW5jdGlvbihlKXt2YXIgdD1lLndpZHRoLG49ZS5oZWlnaHQ7ZS50b3AsZS5sZWZ0O3IuX3dpZHRoPXQsci5faGVpZ2h0PW59KX0sX2dldENvbXBvbmVudFNpemU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe3QuZ2V0Q29tcG9uZW50UmVjdChlLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2l6ZTtuKHQpfSl9KX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLml0ZW1zPVtdLHRoaXMuX3dpZHRoPXRoaXMuaGVpZ2h0PTB9LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuX2N1cnJlbnRDaGVjaygpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9nZXRXSCgpfSwxMDApfSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9W107KEFycmF5LmlzQXJyYXkodGhpcy4kc2xvdHMuZGVmYXVsdCk/ZGVlcENsb25lKHRoaXMuJHNsb3RzLmRlZmF1bHQsZSk6W10pLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jb21wb25lbnRPcHRpb25zJiYic3dpcGVyLWl0ZW0iPT09ZS5jb21wb25lbnRPcHRpb25zLnRhZyYmdC5wdXNoKGUpfSksdGhpcy5pdGVtcz10O3ZhciBuPXt9LHI9dGhpcy4kbGlzdGVuZXJzO3JldHVybihyLmNoYW5nZXx8ci5hbmltYXRpb25maW5pc2h8fHIudHJhbnNpdGlvbikmJihuLnNjcm9sbD10aGlzLm9uU2Nyb2xsLG4uc2Nyb2xsZW5kPXRoaXMub25TY3JvbGxFbmQpLHIuY2hhbmdlJiYobi5jaGFuZ2U9dGhpcy5vbkNoYW5nZSksZSgiZGl2Iix0aGlzLl9nKHtyZWY6ImVsIixzdGF0aWNDbGFzczpbInVuaS1zd2lwZXIiXX0sciksW2UoInNsaWRlciIse3N0YXRpY0NsYXNzOlsidW5pLXN3aXBlci1zbGlkZXIiXSxhdHRyczp7YXV0b1BsYXk6dGhpcy5hdXRvcGxheSxpbnRlcnZhbDp0aGlzLmludGVydmFsLGluZGV4OnRoaXMuY3VycmVudFN5bmMsa2VlcEluZGV4OiEwLHNob3dJbmRpY2F0b3JzOnRoaXMuaW5kaWNhdG9yRG90cyxpbmZpbml0ZTp0aGlzLmNpcmN1bGFyLHZlcnRpY2FsOnRoaXMudmVydGljYWwsc2Nyb2xsYWJsZTohdGhpcy5kaXNhYmxlVG91Y2h9LG9uOm59LHQuY29uY2F0KFtlKCJpbmRpY2F0b3IiLHtzdGF0aWNDbGFzczpbInVuaS1zd2lwZXItZG90cyJdLHN0eWxlOntpdGVtQ29sb3I6dGhpcy5pbmRpY2F0b3JDb2xvcixpdGVtU2VsZWN0ZWRDb2xvcjp0aGlzLmluZGljYXRvckFjdGl2ZUNvbG9yLGl0ZW1TaXplOjgsb3BhY2l0eTp0aGlzLmluZGljYXRvckRvdHM/MTowfX0pXSksMildKX0sc3R5bGU6eyJ1bmktc3dpcGVyIjp7cG9zaXRpb246InJlbGF0aXZlIixoZWlnaHQ6IjE1MHB4In0sInVuaS1zd2lwZXItc2xpZGVyIjp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAsdG9wOjAscmlnaHQ6MCxib3R0b206MH0sInVuaS1zd2lwZXItZG90cyI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHJpZ2h0OjAsYm90dG9tOiIxMCIsaGVpZ2h0OiIxMCJ9fX19ZnVuY3Rpb24gaW5pdCQyMChlLHQpe2UuY29tcG9uZW50KCJzd2lwZXIiLGdldFN3aXBlcih0KSl9ZnVuY3Rpb24gZ2V0U3dpdGNoKGUpe3JldHVybntuYW1lOiJTd2l0Y2giLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10scHJvcHM6e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSx0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJzd2l0Y2gifSxjaGVja2VkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3N3aXRjaENoZWNrZWQ6dGhpcy5jaGVja2VkfX0sd2F0Y2g6e2NoZWNrZWQ6ZnVuY3Rpb24oZSl7dGhpcy5zd2l0Y2hDaGVja2VkPWV9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJ1bmktZm9ybS1ncm91cC11cGRhdGUiLHt0eXBlOiJhZGQiLHZtOnRoaXN9KX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToicmVtb3ZlIix2bTp0aGlzfSl9LG1ldGhvZHM6e19vbkNsaWNrOmZ1bmN0aW9uKGUsdCl7dGhpcy5kaXNhYmxlZHx8KHRoaXMuc3dpdGNoQ2hlY2tlZD1lLmRldGFpbD9lLmRldGFpbC52YWx1ZTohdGhpcy5zd2l0Y2hDaGVja2VkLHRoaXMuJHRyaWdnZXIoImNoYW5nZSIse3ZhbHVlOnRoaXMuc3dpdGNoQ2hlY2tlZH0pKX0sX3Jlc2V0Rm9ybURhdGE6ZnVuY3Rpb24oKXt0aGlzLnN3aXRjaENoZWNrZWQ9ITF9LF9nZXRGb3JtRGF0YTpmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiIiIT09dGhpcy5uYW1lJiYoZS52YWx1ZT10aGlzLnN3aXRjaENoZWNrZWQsZS5rZXk9dGhpcy5uYW1lKSxlfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10aGlzLiRsaXN0ZW5lcnM7cmV0dXJuIGUoImRpdiIsdC5fZyh7c3R5bGU6e3BhZGRpbmdSaWdodDo1fX0sbiksWyJzd2l0Y2giPT09dC50eXBlP2UoImRjLXN3aXRjaCIse2F0dHJzOntkYXRhVW5jVHlwZToidW5pLXN3aXRjaCIsY29sb3I6dC5jb2xvcixjaGVja2VkOnQuc3dpdGNoQ2hlY2tlZCxkaXNhYmxlZDp0LmRpc2FibGVkfSxzdHlsZTp7d2lkdGg6NTIsaGVpZ2h0OjMyfSxvbjp7Y2hhbmdlOnQuX29uQ2xpY2t9fSk6dC5fZSgpLCJjaGVja2JveCI9PT10LnR5cGU/ZSgiY2hlY2tib3giLHthdHRyczp7ZGF0YVVuY1R5cGU6InVuaS1zd2l0Y2giLGNoZWNrZWQ6dC5zd2l0Y2hDaGVja2VkLGRpc2FibGVkOnQuZGlzYWJsZWR9LHN0eWxlOntjb2xvcjp0LmNvbG9yfSxvbjp7Y2xpY2s6dC5fb25DbGlja319KTp0Ll9lKCldLDEpfSxsaXN0ZW5lcnM6eyJsYWJlbC1jbGljayI6Il9vbkNsaWNrIiwiQGxhYmVsLWNsaWNrIjoiX29uQ2xpY2sifX19ZnVuY3Rpb24gaW5pdCQyMShlLHQpe2UuY29tcG9uZW50KCJzd2l0Y2giLGdldFN3aXRjaCh0KSl9ZnVuY3Rpb24gZ2V0U2xpZGVyKGUpe3JldHVybntuYW1lOiJVU2xpZGVyIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxtaW46e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0sbWF4Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjEwMH0sdmFsdWU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0sc3RlcDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxfSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjZTllOWU5In0sYmFja2dyb3VuZENvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjZTllOWU5In0sYWN0aXZlQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifSxzZWxlY3RlZENvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sYmxvY2tDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2ZmZmZmZiJ9LGJsb2NrU2l6ZTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoyOH0sc2hvd1ZhbHVlOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57c2xpZGVyV2lkdGg6MCxzbGlkZXJWYWx1ZTpOdW1iZXIodGhpcy52YWx1ZSl9fSxjb21wdXRlZDp7c2xpZGVyVGh1bWJPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTnVtYmVyKHRoaXMuYmxvY2tTaXplKS8yfSx0cmFja1RhcFN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJue3BhZGRpbmdUb3A6dGhpcy5zbGlkZXJUaHVtYk9mZnNldCxwYWRkaW5nQm90dG9tOnRoaXMuc2xpZGVyVGh1bWJPZmZzZXR9fSx0cmFja1N0eWxlOmZ1bmN0aW9uKCl7cmV0dXJue2JhY2tncm91bmRDb2xvcjp0aGlzLl9nZXRCZ0NvbG9yKCksbWFyZ2luTGVmdDp0aGlzLnNsaWRlclRodW1iT2Zmc2V0LG1hcmdpblJpZ2h0OnRoaXMuc2xpZGVyVGh1bWJPZmZzZXR9fSx0cmFja0FjdGl2ZVN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJue2JhY2tncm91bmRDb2xvcjp0aGlzLl9nZXRBY3RpdmVDb2xvcigpLHdpZHRoOnRoaXMudGh1bWJWYWx1ZSsicHgifX0sdGh1bWJTdHlsZTpmdW5jdGlvbigpe3JldHVybnt3aWR0aDp0aGlzLmJsb2NrU2l6ZSsicHgiLGhlaWdodDp0aGlzLmJsb2NrU2l6ZSsicHgiLGxlZnQ6dGhpcy50aHVtYlZhbHVlKyJweCIsYmFja2dyb3VuZENvbG9yOnRoaXMuYmxvY2tDb2xvcn19LHRodW1iVmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5zbGlkZXJWYWx1ZS1OdW1iZXIodGhpcy5taW4pKS8oTnVtYmVyKHRoaXMubWF4KS1OdW1iZXIodGhpcy5taW4pKSp0aGlzLnNsaWRlcldpZHRofX0sd2F0Y2g6e3ZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuc2xpZGVyVmFsdWU9TnVtYmVyKGUpfX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5feDA9MCx0aGlzLl94MT0wLHRoaXMuJGV2ZW50T2xkPW51bGwsc2V0VGltZW91dChmdW5jdGlvbigpe2UucmVxdWlyZU1vZHVsZSgiZG9tIikuZ2V0Q29tcG9uZW50UmVjdCh0LiRyZWZzWyJzbGlkZXItdHJhY2siXSxmdW5jdGlvbihlKXt0LnNsaWRlcldpZHRoPWUuc2l6ZS53aWR0aH0pfSw1MCl9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6ImFkZCIsdm06dGhpc30pfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJ1bmktZm9ybS1ncm91cC11cGRhdGUiLHt0eXBlOiJyZW1vdmUiLHZtOnRoaXN9KX0sbWV0aG9kczp7X2hhbmRsZVN0YXJ0OmZ1bmN0aW9uKGUpe2lmKDE9PT1lLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCYmIXRoaXMuXyRldmVudE9sZCl7dmFyIHQ9KHRoaXMuXyRldmVudE9sZD1lKS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWDt0aGlzLl94MD10aGlzLl94MT10LHRoaXMuX29uVHJhY2soInN0YXJ0Iix0KX19LF9oYW5kbGVNb3ZlOmZ1bmN0aW9uKGUpe2lmKDE9PT1lLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCYmdGhpcy5fJGV2ZW50T2xkKXt2YXIgdD1lLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYO3RoaXMuX29uVHJhY2soIm1vdmUiLHQpLHRoaXMuX3gxPXR9fSxfaGFuZGxlRW5kOmZ1bmN0aW9uKGUpe2lmKDE9PT1lLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCYmdGhpcy5fJGV2ZW50T2xkKXt2YXIgdD1lLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYO3RoaXMuXyRldmVudE9sZD1udWxsLHRoaXMuX29uVHJhY2soImVuZCIsdCl9fSxfb25UcmFjazpmdW5jdGlvbihlLHQpe3RoaXMuZGlzYWJsZWR8fCgibW92ZSI9PT1lPyh0aGlzLl9vblVzZXJDaGFuZ2VkVmFsdWUoe3g6dH0pLHRoaXMuJHRyaWdnZXIoImNoYW5naW5nIix7dmFsdWU6dGhpcy5zbGlkZXJWYWx1ZX0pKToiZW5kIj09PWUmJih0aGlzLl9vblVzZXJDaGFuZ2VkVmFsdWUoe3g6dH0pLHRoaXMuJHRyaWdnZXIoImNoYW5nZSIse3ZhbHVlOnRoaXMuc2xpZGVyVmFsdWV9KSkpfSxfb25Vc2VyQ2hhbmdlZFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUueC10aGlzLmJsb2NrU2l6ZS8yO3Q8MCYmKHQ9MCksdD50aGlzLnNsaWRlcldpZHRoJiYodD10aGlzLnNsaWRlcldpZHRoKTt2YXIgbj1OdW1iZXIodGhpcy5taW4pLHI9TnVtYmVyKHRoaXMubWF4KSxpPU51bWJlcih0aGlzLnN0ZXApLG89dC90aGlzLnNsaWRlcldpZHRoKihyLW4pOzA8aSYmaTxvJiZvJWkvaSE9MCYmKG8tPW8laSksdGhpcy5zbGlkZXJWYWx1ZT1wYXJzZUludChvK24pfSxfZ2V0QmdDb2xvcjpmdW5jdGlvbigpe3JldHVybiIjZTllOWU5IiE9PXRoaXMuYmFja2dyb3VuZENvbG9yP3RoaXMuYmFja2dyb3VuZENvbG9yOiIjMDA3YWZmIiE9PXRoaXMuY29sb3I/dGhpcy5jb2xvcjoiIzAwN2FmZiJ9LF9nZXRBY3RpdmVDb2xvcjpmdW5jdGlvbigpe3JldHVybiIjMDA3YWZmIiE9PXRoaXMuYWN0aXZlQ29sb3I/dGhpcy5hY3RpdmVDb2xvcjoiI2U5ZTllOSIhPT10aGlzLnNlbGVjdGVkQ29sb3I/dGhpcy5zZWxlY3RlZENvbG9yOiIjZTllOWU5In0sX3Jlc2V0Rm9ybURhdGE6ZnVuY3Rpb24oKXt0aGlzLnNsaWRlclZhbHVlPXRoaXMubWlufSxfZ2V0Rm9ybURhdGE6ZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4iIiE9PXRoaXMubmFtZSYmKGUudmFsdWU9dGhpcy5zbGlkZXJWYWx1ZSxlLmtleT10aGlzLm5hbWUpLGV9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZSgiZGl2Iix0Ll9nKHtzdGF0aWNDbGFzczpbInVuaS1zbGlkZXIiXX0sdC4kbGlzdGVuZXJzKSxbZSgiZGl2Iix7c3RhdGljQ2xhc3M6WyJ1bmktc2xpZGVyLXdyYXBwZXIiXX0sW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXNsaWRlci10YXAtYXJlYSJdLG9uOnt0b3VjaHN0YXJ0OnQuX2hhbmRsZVN0YXJ0LHRvdWNobW92ZTp0Ll9oYW5kbGVNb3ZlLHRvdWNoZW5kOnQuX2hhbmRsZUVuZH0sc3R5bGU6dC50cmFja1RhcFN0eWxlfSxbZSgiZGl2Iix7cmVmOiJzbGlkZXItdHJhY2siLHN0YXRpY0NsYXNzOlsidW5pLXNsaWRlci1oYW5kbGUtd3JhcHBlciJdLHN0eWxlOnQudHJhY2tTdHlsZX0sW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXNsaWRlci10cmFjayJdLHN0eWxlOnQudHJhY2tBY3RpdmVTdHlsZX0pXSksZSgiZGl2Iix7cmVmOiJ1bmktc2xpZGVyLWhhbmRsZSIsc3RhdGljQ2xhc3M6WyJ1bmktc2xpZGVyLXRodW1iIl0sc3R5bGU6dC50aHVtYlN0eWxlfSldKSx0LnNob3dWYWx1ZT9lKCJ1LXRleHQiLHtzdGF0aWNDbGFzczpbInVuaS1zbGlkZXItdmFsdWUiXX0sW3QuX3YodC5fcyh0LnNsaWRlclZhbHVlKSldKTp0Ll9lKCldKV0pfSxzdHlsZTp7InVuaS1zbGlkZXIiOntmbGV4OjEsZmxleERpcmVjdGlvbjoiY29sdW1uIn0sInVuaS1zbGlkZXItd3JhcHBlciI6e2ZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIn0sInVuaS1zbGlkZXItdGFwLWFyZWEiOntwb3NpdGlvbjoicmVsYXRpdmUiLGZsZXg6MSxmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciIscGFkZGluZ1RvcDoiMTQiLHBhZGRpbmdCb3R0b206IjE0In0sInVuaS1zbGlkZXItaGFuZGxlLXdyYXBwZXIiOntwb3NpdGlvbjoicmVsYXRpdmUiLGZsZXg6MSxoZWlnaHQ6IjIiLG1hcmdpblJpZ2h0OiIxNCIsbWFyZ2luTGVmdDoiMTQiLGJvcmRlclJhZGl1czoiNSIsYmFja2dyb3VuZENvbG9yOiIjZTllOWU5In0sInVuaS1zbGlkZXItdHJhY2siOntoZWlnaHQ6IjIiLGJvcmRlclJhZGl1czoiNiIsYmFja2dyb3VuZENvbG9yOiIjMDA3YWZmIn0sInVuaS1zbGlkZXItdGh1bWIiOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDoiMSIsd2lkdGg6IjI4IixoZWlnaHQ6IjI4Iixib3JkZXJSYWRpdXM6NTAsYm94U2hhZG93OiIwIDAgNHB4ICNlYmViZWIifSwidW5pLXNsaWRlci12YWx1ZSI6e2NvbG9yOiIjODg4ODg4Iixmb250U2l6ZToiMTYiLHdpZHRoOiIzMCJ9fX19ZnVuY3Rpb24gaW5pdCQyMihlLHQpe2UuY29tcG9uZW50KCJ1LXNsaWRlciIsZ2V0U2xpZGVyKHQpKX1mdW5jdGlvbiBnZXRQaWNrZXJWaWV3KGUpe3JldHVybntuYW1lOiJQaWNrZXJWaWV3Iixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcl0scHJvcHM6e3ZhbHVlOnt0eXBlOkFycmF5LGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpJiZlLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV9KS5sZW5ndGg9PT1lLmxlbmd0aH19LGhlaWdodDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxpbmRpY2F0b3JTdHlsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWFza1RvcFN0eWxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxtYXNrQm90dG9tU3R5bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue21hc2tUb3BTdHlsZVN5bmM6dGhpcy5nZXRTdHlsZSh0aGlzLm1hc2tUb3BTdHlsZSksbWFza0JvdHRvbVN0eWxlU3luYzp0aGlzLmdldFN0eWxlKHRoaXMubWFza0JvdHRvbVN0eWxlKSxpbmRpY2F0b3JTdHlsZVN5bmM6dGhpcy5nZXRTdHlsZSh0aGlzLmluZGljYXRvclN0eWxlKSx2YWx1ZVN5bmM6W10uY29uY2F0KHRoaXMudmFsdWUpfX0sd2F0Y2g6e3ZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7dGhpcy52YWx1ZVN5bmMubGVuZ3RoPWUubGVuZ3RoLGUuZm9yRWFjaChmdW5jdGlvbihlLHQpe2UhPT1uLnZhbHVlU3luY1t0XSYmKG4udmFsdWVTeW5jW3RdPWUsbi5pdGVtc1t0XS5jb21wb25lbnRJbnN0YW5jZS5zZXRDdXJyZW50KGUpKX0pfSxtYXNrVG9wU3R5bGU6ZnVuY3Rpb24oZSl7dGhpcy5tYXNrVG9wU3R5bGVTeW5jPXRoaXMuZ2V0U3R5bGUoZSl9LG1hc2tCb3R0b21TdHlsZTpmdW5jdGlvbihlKXt0aGlzLm1hc2tCb3R0b21TdHlsZVN5bmM9dGhpcy5nZXRTdHlsZShlKX0saW5kaWNhdG9yU3R5bGU6ZnVuY3Rpb24oZSl7dGhpcy5pbmRpY2F0b3JTdHlsZVN5bmM9dGhpcy5nZXRTdHlsZShlKX19LG1ldGhvZHM6e2dldFN0eWxlOmZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuYXNzaWduKHt9LCJzdHJpbmciPT10eXBlb2YgZT9wYXJzZVN0eWxlVGV4dChlKTplKX0sZ2V0SXRlbUluZGV4OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLml0ZW1zLmluZGV4T2YoZSl9LGdldEl0ZW1WYWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy52YWx1ZVN5bmNbdGhpcy5nZXRJdGVtSW5kZXgoZS4kdm5vZGUpXXx8MH0sc2V0SXRlbVZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRJdGVtSW5kZXgoZS4kdm5vZGUpO3RoaXMudmFsdWVTeW5jW25dPXQ7dmFyIHI9W10uY29uY2F0KHRoaXMudmFsdWVTeW5jKTt0aGlzLiRlbWl0KCJ1cGRhdGU6dmFsdWUiLHIpLHRoaXMuJHRyaWdnZXIoImNoYW5nZSIse3ZhbHVlOnJ9KX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLml0ZW1zPVtdfSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9W107cmV0dXJuKEFycmF5LmlzQXJyYXkodGhpcy4kc2xvdHMuZGVmYXVsdCk/ZGVlcENsb25lKHRoaXMuJHNsb3RzLmRlZmF1bHQsZSk6W10pLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jb21wb25lbnRPcHRpb25zJiYicGlja2VyLXZpZXctY29sdW1uIj09PWUuY29tcG9uZW50T3B0aW9ucy50YWcmJnQucHVzaChlKX0pLHRoaXMuaXRlbXM9dCxlKCJkaXYiLHRoaXMuX2coe3N0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3Il0sYXR0cnM6e3ByZXZlbnRHZXN0dXJlOiEwfX0sdGhpcy4kbGlzdGVuZXJzKSxbZSgiZGl2Iix7c3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctd3JhcHBlciJdfSx0KV0sMil9LHN0eWxlOnsidW5pLXBpY2tlci12aWV3Ijp7cG9zaXRpb246InJlbGF0aXZlIn0sInVuaS1waWNrZXItdmlldy13cmFwcGVyIjp7ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoicm93Iixwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowLG92ZXJmbG93OiJoaWRkZW4ifX19fWZ1bmN0aW9uIGluaXQkMjMoZSx0KXtlLmNvbXBvbmVudCgicGlja2VyLXZpZXciLGdldFBpY2tlclZpZXcodCkpfWZ1bmN0aW9uIGdldEhlaWdodChlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9KGUuaGVpZ2h0fHxlLmxpbmVIZWlnaHR8fCIiKS5tYXRjaCgvKC0/W1xkXC5dKylweC8pLG49MDtyZXR1cm4gdCYmKG49cGFyc2VGbG9hdCh0WzFdKSksbn1mdW5jdGlvbiBnZXRQaWNrZXJWaWV3Q29sdW1uKGUpe3ZhciByPWUucmVxdWlyZU1vZHVsZSgiZG9tIiksbz0iYW5kcm9pZCI9PT1lLmNvbmZpZy5lbnYucGxhdGZvcm0udG9Mb3dlckNhc2UoKTtyZXR1cm57bmFtZToiUGlja2VyVmlld0NvbHVtbiIsaXNSZXNlcnZlZDohMCxwcm9wczp7bGVuZ3RoOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2luZGljYXRvckhlaWdodDpnZXRIZWlnaHQodGhpcy4kcGFyZW50LmluZGljYXRvclN0eWxlU3luYyksaGVpZ2h0OnBhcnNlRmxvYXQodGhpcy4kcGFyZW50LmhlaWdodCksY3VycmVudDp0aGlzLiRwYXJlbnQuZ2V0SXRlbVZhbHVlKHRoaXMpfX0sd2F0Y2g6e2N1cnJlbnQ6ZnVuY3Rpb24oZSl7dGhpcy5faXNNb3VudGVkJiZ0aGlzLiRwYXJlbnQuc2V0SXRlbVZhbHVlKHRoaXMsZSl9LGxlbmd0aDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Uuc2V0Q3VycmVudChlLmN1cnJlbnQsITAsITApfSwxNTApfX0sbW91bnRlZDpmdW5jdGlvbigpe3RoaXMuY2hlY2tNb3VudGVkKCl9LG1ldGhvZHM6e2NoZWNrTW91bnRlZDpmdW5jdGlvbigpe3ZhciBuLHIsaT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtQcm9taXNlLmFsbChbaS5fZ2V0Q29tcG9uZW50U2l6ZShpLiRyZWZzLmVsKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaGVpZ2h0O249aS5oZWlnaHQ9dH0pLG8mJmkubGVuZ3RoP2kuX2dldENvbXBvbmVudFNpemUoaS4kcmVmcy5pdGVtKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaGVpZ2h0O3I9aS5pbmRpY2F0b3JIZWlnaHQ9dC9pLmxlbmd0aH0pOmkuX2dldENvbXBvbmVudFNpemUoaS4kcmVmcy5pbmRpY2F0b3IpLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZS5oZWlnaHQ7cj1pLmluZGljYXRvckhlaWdodD10fSldKS50aGVuKGZ1bmN0aW9uKCl7biYmcj9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5zZXRDdXJyZW50KGkuY3VycmVudCwhMSwhMCksaS5faXNNb3VudGVkPSEwfSw1MCk6aS5jaGVja01vdW50ZWQoKX0pfSw1MCl9LG9uU2Nyb2xsZW5kOmZ1bmN0aW9uKGUpe2lmKCEoRGF0ZS5ub3coKS10aGlzLnNjcm9sbFRvRWxlbWVudFRpbWU8MzQwKSl7dmFyIHQ9ZS5kZXRhaWwuY29udGVudE9mZnNldC55LG49TWF0aC5yb3VuZCh0L3RoaXMuaW5kaWNhdG9ySGVpZ2h0KTt0JXRoaXMuaW5kaWNhdG9ySGVpZ2h0P3RoaXMuc2V0Q3VycmVudChuLCEwLCEwKTp0aGlzLmN1cnJlbnQ9bn19LHNldEN1cnJlbnQ6ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PXQmJih0PSEwKSwodGhpcy5jdXJyZW50IT09ZXx8bikmJihyLnNjcm9sbFRvRWxlbWVudCh0aGlzLiRyZWZzLmNvbnRlbnQse29mZnNldDplKnRoaXMuaW5kaWNhdG9ySGVpZ2h0LGFuaW1hdGVkOnR9KSx0aGlzLmN1cnJlbnQ9ZSx0JiYodGhpcy5zY3JvbGxUb0VsZW1lbnRUaW1lPURhdGUubm93KCkpKX0sX2dldENvbXBvbmVudFNpemU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe3IuZ2V0Q29tcG9uZW50UmVjdChlLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2l6ZTtuKHQpfSl9KX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLiRzbG90cy5kZWZhdWx0LG49KHRoaXMuaGVpZ2h0LXRoaXMuaW5kaWNhdG9ySGVpZ2h0KS8yLHI9dGhpcy5oZWlnaHQtbisicHgiO24rPSJweCI7dmFyIGk9e3Nob3dTY3JvbGxiYXI6ITEsc2Nyb2xsVG9CZWdpbjohMSxkZWNlbGVyYXRpb25SYXRlOi4zLHNjcm9sbFk6ITB9O3JldHVybiBvfHwoaS5zY3JvbGxUb3A9dGhpcy5jdXJyZW50KnRoaXMuaW5kaWNhdG9ySGVpZ2h0KSxlKCJkaXYiLHRoaXMuX2coe3JlZjoiZWwiLHN0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LWNvbHVtbiJdfSx0aGlzLiRsaXN0ZW5lcnMpLFtlKCJzY3JvbGwtdmlldyIse3N0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LWdyb3VwIl0sYXR0cnM6aSxvbjp7c2Nyb2xsZW5kOnRoaXMub25TY3JvbGxlbmR9LHN0eWxlOntmbGV4RGlyZWN0aW9uOiJjb2x1bW4ifX0sW2UoImRpdiIse3JlZjoiY29udGVudCIsc3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctY29udGVudCJdLHN0eWxlOntmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLHBhZGRpbmdUb3A6bixwYWRkaW5nQm90dG9tOm59fSxvP1tlKCJkaXYiLHtyZWY6Iml0ZW0iLHN0eWxlOntmbGV4RGlyZWN0aW9uOiJjb2x1bW4ifX0sdCldOnQpXSksZSgidS1zY2FsYWJsZSIse3N0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LW1hc2siXX0sW2UoInUtc2NhbGFibGUiLHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1tYXNrIiwidW5pLXBpY2tlci12aWV3LW1hc2stdG9wIl0sc3R5bGU6T2JqZWN0LmFzc2lnbih7fSx0aGlzLiRwYXJlbnQubWFza1RvcFN0eWxlU3luYyx7Ym90dG9tOnJ9KX0pLGUoInUtc2NhbGFibGUiLHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1tYXNrIiwidW5pLXBpY2tlci12aWV3LW1hc2stYm90dG9tIl0sc3R5bGU6T2JqZWN0LmFzc2lnbih7fSx0aGlzLiRwYXJlbnQubWFza0JvdHRvbVN0eWxlU3luYyx7dG9wOnJ9KX0pXSksZSgidS1zY2FsYWJsZSIse3JlZjoiaW5kaWNhdG9yIixzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1pbmRpY2F0b3IiXSxzdHlsZTpPYmplY3QuYXNzaWduKHt9LHRoaXMuJHBhcmVudC5pbmRpY2F0b3JTdHlsZVN5bmMse3RvcDpufSl9KV0sMil9LHN0eWxlOnsidW5pLXBpY2tlci12aWV3LWNvbHVtbiI6e2ZsZXg6MSxwb3NpdGlvbjoicmVsYXRpdmUiLGFsaWduSXRlbXM6InN0cmV0Y2giLG92ZXJmbG93OiJoaWRkZW4ifSwidW5pLXBpY2tlci12aWV3LW1hc2siOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowLHBvaW50ZXJFdmVudHM6Im5vbmUifSwidW5pLXBpY2tlci12aWV3LW1hc2stdG9wIjp7Ym90dG9tOjAsYmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSJ9LCJ1bmktcGlja2VyLXZpZXctbWFzay1ib3R0b20iOnt0b3A6MCxiYWNrZ3JvdW5kSW1hZ2U6ImxpbmVhci1ncmFkaWVudCh0byB0b3AscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KSxyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNikpIn0sInVuaS1waWNrZXItdmlldy1ncm91cCI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLHJpZ2h0OjAsYm90dG9tOjB9LCJ1bmktcGlja2VyLXZpZXctY29udGVudCI6e3BhZGRpbmdUb3A6MCxwYWRkaW5nUmlnaHQ6MCxwYWRkaW5nQm90dG9tOjAscGFkZGluZ0xlZnQ6MH0sInVuaS1waWNrZXItdmlldy1pbmRpY2F0b3IiOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MCxyaWdodDowLHRvcDowLGhlaWdodDoiMzRweCIscG9pbnRlckV2ZW50czoibm9uZSIsYm9yZGVyQ29sb3I6IiNlNWU1ZTUiLGJvcmRlclRvcFdpZHRoOiIxcHgiLGJvcmRlckJvdHRvbVdpZHRoOiIxcHgifX19fWZ1bmN0aW9uIGluaXQkMjQoZSx0KXtlLmNvbXBvbmVudCgicGlja2VyLXZpZXctY29sdW1uIixnZXRQaWNrZXJWaWV3Q29sdW1uKHQpKX12YXIgaW5pdENvbXBvbmVudHM9W2luaXQkMyxpbml0JDQsaW5pdCQ1LGluaXQkNixpbml0JDcsaW5pdCQ4LGluaXQkOSxpbml0JDEwLGluaXQkMTEsaW5pdCQxMixpbml0JDEzLGluaXQkMTQsaW5pdCQxNSxpbml0JDE2LGluaXQkMTcsaW5pdCQxOCxpbml0JDE5LGluaXQkMjAsaW5pdCQyMSxpbml0JDIyLGluaXQkMjMsaW5pdCQyNF0sdW5pQXBwPXtpbnN0YWxsOmZ1bmN0aW9uKG8sYSl7by5jb25maWcuZXJyb3JIYW5kbGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10b1Jhd1R5cGUoZSk7by51dGlsLndhcm4oIkVycm9yIGluICIrbisnOiAiJysoIkVycm9yIj09PXI/ZS50b1N0cmluZygpOmUpKyciJyx0KTt2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBcHAmJmEuZ2V0QXBwKCk7aSYmaGFzTGlmZWN5Y2xlSG9vayhpLiRvcHRpb25zLCJvbkVycm9yIik/aS5fX2NhbGxfaG9vaygib25FcnJvciIsZSk6Y29uc29sZS5lcnJvcihlKX0sby5wcm90b3R5cGUuXyRidXM9bmV3IG8sby5wcm90b3R5cGUuZ2V0T3BlbmVyRXZlbnRDaGFubmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJvb3QuJHNjb3BlLmV2ZW50Q2hhbm5lbHx8KHRoaXMuJHJvb3QuJHNjb3BlLmV2ZW50Q2hhbm5lbD1uZXcgYS5FdmVudENoYW5uZWwpLHRoaXMuJHJvb3QuJHNjb3BlLmV2ZW50Q2hhbm5lbH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KG8ucHJvdG90eXBlLCIkcGFnZSIse2dldDpmdW5jdGlvbigpe3JldHVybiF0aGlzLiRzY29wZSYmdGhpcy4kcm9vdCYmdGhpcy4kcm9vdC4kc2NvcGUmJih0aGlzLiRzY29wZT10aGlzLiRyb290LiRzY29wZSksdGhpcy4kc2NvcGUuJHBhZ2V9fSksc3R5bGVNaXhpbihvKSx1bmlJZE1peGluKG8sYSksbGlmZWN5Y2xlTWl4aW4obyxhLndlZXgsYSksIndlZXgiIT09YS5fX3VuaUNvbmZpZy5udnVlQ29tcGlsZXImJmluaXRDb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24oZSl7ZShvLGEud2VleCxhKX0pfX07ZnVuY3Rpb24gdnVlRmFjdG9yeShlLHQpe3ZhciBtPU9iamVjdC5mcmVlemUoe30pO2Z1bmN0aW9uIEEoZSl7cmV0dXJuIG51bGw9PWV9ZnVuY3Rpb24gRShlKXtyZXR1cm4gbnVsbCE9ZX1mdW5jdGlvbiBJKGUpe3JldHVybiEwPT09ZX1mdW5jdGlvbiBjKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlfHwic3ltYm9sIj09dHlwZW9mIGV8fCJib29sZWFuIj09dHlwZW9mIGV9ZnVuY3Rpb24geShlKXtyZXR1cm4gbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZX12YXIgcj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIHUoZSl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1yLmNhbGwoZSl9ZnVuY3Rpb24gaShlKXt2YXIgdD1wYXJzZUZsb2F0KFN0cmluZyhlKSk7cmV0dXJuIDA8PXQmJk1hdGguZmxvb3IodCk9PT10JiZpc0Zpbml0ZShlKX1mdW5jdGlvbiBfKGUpe3JldHVybiBFKGUpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50aGVuJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5jYXRjaH1mdW5jdGlvbiBuKGUpe3JldHVybiBudWxsPT1lPyIiOkFycmF5LmlzQXJyYXkoZSl8fHUoZSkmJmUudG9TdHJpbmc9PT1yP0pTT04uc3RyaW5naWZ5KGUsbnVsbCwyKTpTdHJpbmcoZSl9ZnVuY3Rpb24gbyhlKXt2YXIgdD1wYXJzZUZsb2F0KGUpO3JldHVybiBpc05hTih0KT9lOnR9ZnVuY3Rpb24gcyhlLHQpe2Zvcih2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9ZS5zcGxpdCgiLCIpLGk9MDtpPHIubGVuZ3RoO2krKyluW3JbaV1dPSEwO3JldHVybiB0P2Z1bmN0aW9uKGUpe3JldHVybiBuW2UudG9Mb3dlckNhc2UoKV19OmZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfX1zKCJzbG90LGNvbXBvbmVudCIsITApO3ZhciBsPXMoImtleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzIik7ZnVuY3Rpb24gYihlLHQpe2lmKGUubGVuZ3RoKXt2YXIgbj1lLmluZGV4T2YodCk7aWYoLTE8bilyZXR1cm4gZS5zcGxpY2UobiwxKX19dmFyIGE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBkKGUsdCl7cmV0dXJuIGEuY2FsbChlLHQpfWZ1bmN0aW9uIGYodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV18fChuW2VdPXQoZSkpfX12YXIgcD0vLShcdykvZyxoPWYoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShwLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOiIifSl9KSx2PWYoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pLGc9L1xCKFtBLVpdKS9nLHc9ZihmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGcsIi0kMSIpLnRvTG93ZXJDYXNlKCl9KTt2YXIgaz1GdW5jdGlvbi5wcm90b3R5cGUuYmluZD9mdW5jdGlvbihlLHQpe3JldHVybiBlLmJpbmQodCl9OmZ1bmN0aW9uKG4scil7ZnVuY3Rpb24gZShlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoO3JldHVybiB0PzE8dD9uLmFwcGx5KHIsYXJndW1lbnRzKTpuLmNhbGwocixlKTpuLmNhbGwocil9cmV0dXJuIGUuX2xlbmd0aD1uLmxlbmd0aCxlfTtmdW5jdGlvbiBTKGUsdCl7dD10fHwwO2Zvcih2YXIgbj1lLmxlbmd0aC10LHI9bmV3IEFycmF5KG4pO24tLTspcltuXT1lW24rdF07cmV0dXJuIHJ9ZnVuY3Rpb24geChlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBDKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXSYmeCh0LGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIFQoZSx0LG4pe312YXIgTz1mdW5jdGlvbihlLHQsbil7cmV0dXJuITF9LCQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9O2Z1bmN0aW9uIFAodCxuKXtpZih0PT09bilyZXR1cm4hMDt2YXIgZT15KHQpLHI9eShuKTtpZighZXx8IXIpcmV0dXJuIWUmJiFyJiZTdHJpbmcodCk9PT1TdHJpbmcobik7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkodCksbz1BcnJheS5pc0FycmF5KG4pO2lmKGkmJm8pcmV0dXJuIHQubGVuZ3RoPT09bi5sZW5ndGgmJnQuZXZlcnkoZnVuY3Rpb24oZSx0KXtyZXR1cm4gUChlLG5bdF0pfSk7aWYodCBpbnN0YW5jZW9mIERhdGUmJm4gaW5zdGFuY2VvZiBEYXRlKXJldHVybiB0LmdldFRpbWUoKT09PW4uZ2V0VGltZSgpO2lmKGl8fG8pcmV0dXJuITE7dmFyIGE9T2JqZWN0LmtleXModCkscz1PYmplY3Qua2V5cyhuKTtyZXR1cm4gYS5sZW5ndGg9PT1zLmxlbmd0aCYmYS5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4gUCh0W2VdLG5bZV0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIE0oZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihQKGVbbl0sdCkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gaihlKXt2YXIgdD0hMTtyZXR1cm4gZnVuY3Rpb24oKXt0fHwodD0hMCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciBMPSJkYXRhLXNlcnZlci1yZW5kZXJlZCIsTj1bImNvbXBvbmVudCIsImRpcmVjdGl2ZSIsImZpbHRlciJdLEI9WyJiZWZvcmVDcmVhdGUiLCJjcmVhdGVkIiwiYmVmb3JlTW91bnQiLCJtb3VudGVkIiwiYmVmb3JlVXBkYXRlIiwidXBkYXRlZCIsImJlZm9yZURlc3Ryb3kiLCJkZXN0cm95ZWQiLCJhY3RpdmF0ZWQiLCJkZWFjdGl2YXRlZCIsImVycm9yQ2FwdHVyZWQiLCJzZXJ2ZXJQcmVmZXRjaCJdLEQ9e29wdGlvbk1lcmdlU3RyYXRlZ2llczpPYmplY3QuY3JlYXRlKG51bGwpLHNpbGVudDohMSxwcm9kdWN0aW9uVGlwOiExLGRldnRvb2xzOiExLHBlcmZvcm1hbmNlOiExLGVycm9ySGFuZGxlcjpudWxsLHdhcm5IYW5kbGVyOm51bGwsaWdub3JlZEVsZW1lbnRzOltdLGtleUNvZGVzOk9iamVjdC5jcmVhdGUobnVsbCksaXNSZXNlcnZlZFRhZzpPLGlzUmVzZXJ2ZWRBdHRyOk8saXNVbmtub3duRWxlbWVudDpPLGdldFRhZ05hbWVzcGFjZTpULHBhcnNlUGxhdGZvcm1UYWdOYW1lOiQsbXVzdFVzZVByb3A6Tyxhc3luYzohMCxfbGlmZWN5Y2xlSG9va3M6Qn07ZnVuY3Rpb24gUihlLHQsbixyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ISFyLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pfXZhciBGPW5ldyBSZWdFeHAoIlteIisvYS16QS1aXHUwMEI3XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwM0YtXHUyMDQwXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkQvLnNvdXJjZSsiLiRfXFxkXSIpO3ZhciBVLHo9Il9fcHJvdG9fXyJpbnt9LFY9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cscT0idW5kZWZpbmVkIiE9dHlwZW9mIFdYRW52aXJvbm1lbnQmJiEhV1hFbnZpcm9ubWVudC5wbGF0Zm9ybSxXPXEmJldYRW52aXJvbm1lbnQucGxhdGZvcm0udG9Mb3dlckNhc2UoKSxIPVYmJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksRz1IJiYvbXNpZXx0cmlkZW50Ly50ZXN0KEgpLEo9KEgmJkguaW5kZXhPZigibXNpZSA5LjAiKSxIJiYwPEguaW5kZXhPZigiZWRnZS8iKSksWD0oSCYmSC5pbmRleE9mKCJhbmRyb2lkIiksSCYmL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KEgpLEgmJi9jaHJvbWVcL1xkKy8udGVzdChIKSxIJiYvcGhhbnRvbWpzLy50ZXN0KEgpLEgmJkgubWF0Y2goL2ZpcmVmb3hcLyhcZCspLykse30ud2F0Y2gpO2lmKFYpdHJ5e3ZhciBZPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShZLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7fX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0LXBhc3NpdmUiLG51bGwsWSl9Y2F0Y2goZSl7fXZhciBLPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PVUmJihVPSFWJiYhcSYmdm9pZCAwIT09Z2xvYmFsJiYoZ2xvYmFsLnByb2Nlc3MmJiJzZXJ2ZXIiPT09Z2xvYmFsLnByb2Nlc3MuZW52LlZVRV9FTlYpKSxVfSxaPVYmJndpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO2Z1bmN0aW9uIFEoZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJi9uYXRpdmUgY29kZS8udGVzdChlLnRvU3RyaW5nKCkpfXZhciBlZSx0ZT0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmUShTeW1ib2wpJiYidW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJlEoUmVmbGVjdC5vd25LZXlzKTtlZT0idW5kZWZpbmVkIiE9dHlwZW9mIFNldCYmUShTZXQpP1NldDpmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfXJldHVybiBlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oZSl7cmV0dXJuITA9PT10aGlzLnNldFtlXX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3RoaXMuc2V0W2VdPSEwfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuc2V0PU9iamVjdC5jcmVhdGUobnVsbCl9LGV9KCk7dmFyIG5lPVQscmU9MCxpZT1mdW5jdGlvbigpe3RoaXMuaWQ9dm9pZCAwIT09dD90LnVpZCsrOnJlKyssdGhpcy5zdWJzPVtdfTtmdW5jdGlvbiBvZShlKXtpZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sucHVzaChlKSxpZS5TaGFyZWRPYmplY3QudGFyZ2V0PWV9ZnVuY3Rpb24gYWUoKXtpZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sucG9wKCksaWUuU2hhcmVkT2JqZWN0LnRhcmdldD1pZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2tbaWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrLmxlbmd0aC0xXX1pZS5wcm90b3R5cGUuYWRkU3ViPWZ1bmN0aW9uKGUpe3RoaXMuc3Vicy5wdXNoKGUpfSxpZS5wcm90b3R5cGUucmVtb3ZlU3ViPWZ1bmN0aW9uKGUpe2IodGhpcy5zdWJzLGUpfSxpZS5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7aWUuU2hhcmVkT2JqZWN0LnRhcmdldCYmaWUuU2hhcmVkT2JqZWN0LnRhcmdldC5hZGREZXAodGhpcyl9LGllLnByb3RvdHlwZS5ub3RpZnk9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5zdWJzLnNsaWNlKCksdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyllW3RdLnVwZGF0ZSgpfSxpZS5TaGFyZWRPYmplY3Q9dm9pZCAwIT09dD90Ont9LGllLlNoYXJlZE9iamVjdC50YXJnZXQ9bnVsbCxpZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2s9W107dmFyIHNlPWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEscyl7dGhpcy50YWc9ZSx0aGlzLmRhdGE9dCx0aGlzLmNoaWxkcmVuPW4sdGhpcy50ZXh0PXIsdGhpcy5lbG09aSx0aGlzLm5zPXZvaWQgMCx0aGlzLmNvbnRleHQ9byx0aGlzLmZuQ29udGV4dD12b2lkIDAsdGhpcy5mbk9wdGlvbnM9dm9pZCAwLHRoaXMuZm5TY29wZUlkPXZvaWQgMCx0aGlzLmtleT10JiZ0LmtleSx0aGlzLmNvbXBvbmVudE9wdGlvbnM9YSx0aGlzLmNvbXBvbmVudEluc3RhbmNlPXZvaWQgMCx0aGlzLnBhcmVudD12b2lkIDAsdGhpcy5yYXc9ITEsdGhpcy5pc1N0YXRpYz0hMSx0aGlzLmlzUm9vdEluc2VydD0hMCx0aGlzLmlzQ29tbWVudD0hMSx0aGlzLmlzQ2xvbmVkPSExLHRoaXMuaXNPbmNlPSExLHRoaXMuYXN5bmNGYWN0b3J5PXMsdGhpcy5hc3luY01ldGE9dm9pZCAwLHRoaXMuaXNBc3luY1BsYWNlaG9sZGVyPSExfSxjZT17Y2hpbGQ6e2NvbmZpZ3VyYWJsZTohMH19O2NlLmNoaWxkLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXBvbmVudEluc3RhbmNlfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzZS5wcm90b3R5cGUsY2UpO3ZhciB1ZT1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT0iIik7dmFyIHQ9bmV3IHNlO3JldHVybiB0LnRleHQ9ZSx0LmlzQ29tbWVudD0hMCx0fTtmdW5jdGlvbiBsZShlKXtyZXR1cm4gbmV3IHNlKHZvaWQgMCx2b2lkIDAsdm9pZCAwLFN0cmluZyhlKSl9ZnVuY3Rpb24gZGUoZSl7dmFyIHQ9bmV3IHNlKGUudGFnLGUuZGF0YSxlLmNoaWxkcmVuJiZlLmNoaWxkcmVuLnNsaWNlKCksZS50ZXh0LGUuZWxtLGUuY29udGV4dCxlLmNvbXBvbmVudE9wdGlvbnMsZS5hc3luY0ZhY3RvcnkpO3JldHVybiB0Lm5zPWUubnMsdC5pc1N0YXRpYz1lLmlzU3RhdGljLHQua2V5PWUua2V5LHQuaXNDb21tZW50PWUuaXNDb21tZW50LHQuZm5Db250ZXh0PWUuZm5Db250ZXh0LHQuZm5PcHRpb25zPWUuZm5PcHRpb25zLHQuZm5TY29wZUlkPWUuZm5TY29wZUlkLHQuYXN5bmNNZXRhPWUuYXN5bmNNZXRhLHQuaXNDbG9uZWQ9ITAsdH12YXIgZmU9QXJyYXkucHJvdG90eXBlLHBlPU9iamVjdC5jcmVhdGUoZmUpO1sicHVzaCIsInBvcCIsInNoaWZ0IiwidW5zaGlmdCIsInNwbGljZSIsInNvcnQiLCJyZXZlcnNlIl0uZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgcz1mZVthXTtSKHBlLGEsZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1lW25dO3ZhciByLGk9cy5hcHBseSh0aGlzLHQpLG89dGhpcy5fX29iX187c3dpdGNoKGEpe2Nhc2UicHVzaCI6Y2FzZSJ1bnNoaWZ0IjpyPXQ7YnJlYWs7Y2FzZSJzcGxpY2UiOnI9dC5zbGljZSgyKX1yZXR1cm4gciYmby5vYnNlcnZlQXJyYXkociksby5kZXAubm90aWZ5KCksaX0pfSk7dmFyIGhlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHBlKSx2ZT0hMDtmdW5jdGlvbiBnZShlKXt2ZT1lfXZhciBtZT1mdW5jdGlvbihlKXt2YXIgdDt0aGlzLnZhbHVlPWUsdGhpcy5kZXA9bmV3IGllLHRoaXMudm1Db3VudD0wLFIoZSwiX19vYl9fIix0aGlzKSxBcnJheS5pc0FycmF5KGUpPyh6Pyh0PXBlLGUuX19wcm90b19fPXQpOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5bcl07UihlLG8sdFtvXSl9fShlLHBlLGhlKSx0aGlzLm9ic2VydmVBcnJheShlKSk6dGhpcy53YWxrKGUpfTtmdW5jdGlvbiB5ZShlLHQpe3ZhciBuO2lmKHkoZSkmJiEoZSBpbnN0YW5jZW9mIHNlKSlyZXR1cm4gZChlLCJfX29iX18iKSYmZS5fX29iX18gaW5zdGFuY2VvZiBtZT9uPWUuX19vYl9fOnZlJiYhSygpJiYoQXJyYXkuaXNBcnJheShlKXx8dShlKSkmJk9iamVjdC5pc0V4dGVuc2libGUoZSkmJiFlLl9pc1Z1ZSYmKG49bmV3IG1lKGUpKSx0JiZuJiZuLnZtQ291bnQrKyxufWZ1bmN0aW9uIF9lKG4sZSxyLHQsaSl7dmFyIG89bmV3IGllLGE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpO2lmKCFhfHwhMSE9PWEuY29uZmlndXJhYmxlKXt2YXIgcz1hJiZhLmdldCxjPWEmJmEuc2V0O3MmJiFjfHwyIT09YXJndW1lbnRzLmxlbmd0aHx8KHI9bltlXSk7dmFyIHU9IWkmJnllKHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3ZhciBlPXM/cy5jYWxsKG4pOnI7cmV0dXJuIGllLlNoYXJlZE9iamVjdC50YXJnZXQmJihvLmRlcGVuZCgpLHUmJih1LmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KGUpJiZmdW5jdGlvbiBlKHQpe2Zvcih2YXIgbj12b2lkIDAscj0wLGk9dC5sZW5ndGg7cjxpO3IrKykobj10W3JdKSYmbi5fX29iX18mJm4uX19vYl9fLmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KG4pJiZlKG4pfShlKSkpLGV9LHNldDpmdW5jdGlvbihlKXt2YXIgdD1zP3MuY2FsbChuKTpyO2U9PT10fHxlIT1lJiZ0IT10fHxzJiYhY3x8KGM/Yy5jYWxsKG4sZSk6cj1lLHU9IWkmJnllKGUpLG8ubm90aWZ5KCkpfX0pfX1mdW5jdGlvbiBiZShlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSYmaSh0KSlyZXR1cm4gZS5sZW5ndGg9TWF0aC5tYXgoZS5sZW5ndGgsdCksZS5zcGxpY2UodCwxLG4pLG47aWYodCBpbiBlJiYhKHQgaW4gT2JqZWN0LnByb3RvdHlwZSkpcmV0dXJuIGVbdF09bjt2YXIgcj1lLl9fb2JfXztyZXR1cm4gZS5faXNWdWV8fHImJnIudm1Db3VudD9uOnI/KF9lKHIudmFsdWUsdCxuKSxyLmRlcC5ub3RpZnkoKSxuKTplW3RdPW59ZnVuY3Rpb24gd2UoZSx0KXtpZihBcnJheS5pc0FycmF5KGUpJiZpKHQpKWUuc3BsaWNlKHQsMSk7ZWxzZXt2YXIgbj1lLl9fb2JfXztlLl9pc1Z1ZXx8biYmbi52bUNvdW50fHxkKGUsdCkmJihkZWxldGUgZVt0XSxuJiZuLmRlcC5ub3RpZnkoKSl9fW1lLnByb3RvdHlwZS53YWxrPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDtuKyspX2UoZSx0W25dKX0sbWUucHJvdG90eXBlLm9ic2VydmVBcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspeWUoZVt0XSl9O3ZhciBrZT1ELm9wdGlvbk1lcmdlU3RyYXRlZ2llcztmdW5jdGlvbiBTZShlLHQpe2lmKCF0KXJldHVybiBlO2Zvcih2YXIgbixyLGksbz10ZT9SZWZsZWN0Lm93bktleXModCk6T2JqZWN0LmtleXModCksYT0wO2E8by5sZW5ndGg7YSsrKSJfX29iX18iIT09KG49b1thXSkmJihyPWVbbl0saT10W25dLGQoZSxuKT9yIT09aSYmdShyKSYmdShpKSYmU2UocixpKTpiZShlLG4saSkpO3JldHVybiBlfWZ1bmN0aW9uIHhlKG4scixpKXtyZXR1cm4gaT9mdW5jdGlvbigpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiByP3IuY2FsbChpLGkpOnIsdD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwoaSxpKTpuO3JldHVybiBlP1NlKGUsdCk6dH06cj9uP2Z1bmN0aW9uKCl7cmV0dXJuIFNlKCJmdW5jdGlvbiI9PXR5cGVvZiByP3IuY2FsbCh0aGlzLHRoaXMpOnIsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5jYWxsKHRoaXMsdGhpcyk6bil9OnI6bn1mdW5jdGlvbiBDZShlLHQpe3ZhciBuPXQ/ZT9lLmNvbmNhdCh0KTpBcnJheS5pc0FycmF5KHQpP3Q6W3RdOmU7cmV0dXJuIG4/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyktMT09PXQuaW5kZXhPZihlW25dKSYmdC5wdXNoKGVbbl0pO3JldHVybiB0fShuKTpufWZ1bmN0aW9uIFRlKGUsdCxuLHIpe3ZhciBpPU9iamVjdC5jcmVhdGUoZXx8bnVsbCk7cmV0dXJuIHQ/eChpLHQpOml9a2UuZGF0YT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/eGUoZSx0LG4pOnQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6eGUoZSx0KX0sQi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2tlW2VdPUNlfSksTi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2tlW2UrInMiXT1UZX0pLGtlLndhdGNoPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9PT1YJiYoZT12b2lkIDApLHQ9PT1YJiYodD12b2lkIDApLCF0KXJldHVybiBPYmplY3QuY3JlYXRlKGV8fG51bGwpO2lmKCFlKXJldHVybiB0O3ZhciBpPXt9O2Zvcih2YXIgbyBpbiB4KGksZSksdCl7dmFyIGE9aVtvXSxzPXRbb107YSYmIUFycmF5LmlzQXJyYXkoYSkmJihhPVthXSksaVtvXT1hP2EuY29uY2F0KHMpOkFycmF5LmlzQXJyYXkocyk/czpbc119cmV0dXJuIGl9LGtlLnByb3BzPWtlLm1ldGhvZHM9a2UuaW5qZWN0PWtlLmNvbXB1dGVkPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIHgoaSxlKSx0JiZ4KGksdCksaX0sa2UucHJvdmlkZT14ZTt2YXIgT2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD9lOnR9O2Z1bmN0aW9uIEFlKG4scixpKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgciYmKHI9ci5vcHRpb25zKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUucHJvcHM7aWYobil7dmFyIHIsaSxvPXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHI9bi5sZW5ndGg7ci0tOykic3RyaW5nIj09dHlwZW9mKGk9bltyXSkmJihvW2goaSldPXt0eXBlOm51bGx9KTtlbHNlIGlmKHUobikpZm9yKHZhciBhIGluIG4paT1uW2FdLG9baChhKV09dShpKT9pOnt0eXBlOml9O2UucHJvcHM9b319KHIpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pbmplY3Q7aWYobil7dmFyIHI9ZS5pbmplY3Q9e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKylyW25baV1dPXtmcm9tOm5baV19O2Vsc2UgaWYodShuKSlmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtyW29dPXUoYSk/eCh7ZnJvbTpvfSxhKTp7ZnJvbTphfX19fShyKSxmdW5jdGlvbihlKXt2YXIgdD1lLmRpcmVjdGl2ZXM7aWYodClmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTsiZnVuY3Rpb24iPT10eXBlb2YgciYmKHRbbl09e2JpbmQ6cix1cGRhdGU6cn0pfX0ociksIXIuX2Jhc2UmJihyLmV4dGVuZHMmJihuPUFlKG4sci5leHRlbmRzLGkpKSxyLm1peGlucykpZm9yKHZhciBlPTAsdD1yLm1peGlucy5sZW5ndGg7ZTx0O2UrKyluPUFlKG4sci5taXhpbnNbZV0saSk7dmFyIG8sYT17fTtmb3IobyBpbiBuKXMobyk7Zm9yKG8gaW4gcilkKG4sbyl8fHMobyk7ZnVuY3Rpb24gcyhlKXt2YXIgdD1rZVtlXXx8T2U7YVtlXT10KG5bZV0scltlXSxpLGUpfXJldHVybiBhfWZ1bmN0aW9uIEVlKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGk9ZVt0XTtpZihkKGksbikpcmV0dXJuIGlbbl07dmFyIG89aChuKTtpZihkKGksbykpcmV0dXJuIGlbb107dmFyIGE9dihvKTtyZXR1cm4gZChpLGEpP2lbYV06aVtuXXx8aVtvXXx8aVthXX19ZnVuY3Rpb24gSWUoZSx0LG4scil7dmFyIGk9dFtlXSxvPSFkKG4sZSksYT1uW2VdLHM9TWUoQm9vbGVhbixpLnR5cGUpO2lmKC0xPHMpaWYobyYmIWQoaSwiZGVmYXVsdCIpKWE9ITE7ZWxzZSBpZigiIj09PWF8fGE9PT13KGUpKXt2YXIgYz1NZShTdHJpbmcsaS50eXBlKTsoYzwwfHxzPGMpJiYoYT0hMCl9aWYodm9pZCAwPT09YSl7YT1mdW5jdGlvbihlLHQsbil7aWYoIWQodCwiZGVmYXVsdCIpKXJldHVybjt2YXIgcj10LmRlZmF1bHQ7aWYoZSYmZS4kb3B0aW9ucy5wcm9wc0RhdGEmJnZvaWQgMD09PWUuJG9wdGlvbnMucHJvcHNEYXRhW25dJiZ2b2lkIDAhPT1lLl9wcm9wc1tuXSlyZXR1cm4gZS5fcHJvcHNbbl07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHImJiJGdW5jdGlvbiIhPT0kZSh0LnR5cGUpP3IuY2FsbChlKTpyfShyLGksZSk7dmFyIHU9dmU7Z2UoITApLHllKGEpLGdlKHUpfXJldHVybiBhfWZ1bmN0aW9uICRlKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiBQZShlLHQpe3JldHVybiAkZShlKT09PSRlKHQpfWZ1bmN0aW9uIE1lKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIFBlKHQsZSk/MDotMTtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYoUGUodFtuXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBqZShlLHQsbil7b2UoKTt0cnl7aWYodClmb3IodmFyIHI9dDtyPXIuJHBhcmVudDspe3ZhciBpPXIuJG9wdGlvbnMuZXJyb3JDYXB0dXJlZDtpZihpKWZvcih2YXIgbz0wO288aS5sZW5ndGg7bysrKXRyeXtpZighMT09PWlbb10uY2FsbChyLGUsdCxuKSlyZXR1cm59Y2F0Y2goZSl7TmUoZSxyLCJlcnJvckNhcHR1cmVkIGhvb2siKX19TmUoZSx0LG4pfWZpbmFsbHl7YWUoKX19ZnVuY3Rpb24gTGUoZSx0LG4scixpKXt2YXIgbzt0cnl7KG89bj9lLmFwcGx5KHQsbik6ZS5jYWxsKHQpKSYmIW8uX2lzVnVlJiZfKG8pJiYhby5faGFuZGxlZCYmKG8uY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuIGplKGUscixpKyIgKFByb21pc2UvYXN5bmMpIil9KSxvLl9oYW5kbGVkPSEwKX1jYXRjaChlKXtqZShlLHIsaSl9cmV0dXJuIG99ZnVuY3Rpb24gTmUodCxlLG4pe2lmKEQuZXJyb3JIYW5kbGVyKXRyeXtyZXR1cm4gRC5lcnJvckhhbmRsZXIuY2FsbChudWxsLHQsZSxuKX1jYXRjaChlKXtlIT09dCYmQmUoZSxudWxsLCJjb25maWcuZXJyb3JIYW5kbGVyIil9QmUodCxlLG4pfWZ1bmN0aW9uIEJlKGUsdCxuKXtpZighViYmIXF8fCJ1bmRlZmluZWQiPT10eXBlb2YgY29uc29sZSl0aHJvdyBlO2NvbnNvbGUuZXJyb3IoZSl9dmFyIERlPVtdLFJlPSExO2Z1bmN0aW9uIEZlKCl7UmU9ITE7Zm9yKHZhciBlPURlLnNsaWNlKDApLHQ9RGUubGVuZ3RoPTA7dDxlLmxlbmd0aDt0KyspZVt0XSgpfXZhciBVZT1mdW5jdGlvbigpe3NldFRpbWVvdXQoRmUsMCl9O2Z1bmN0aW9uIHplKGUsdCl7dmFyIG47aWYoRGUucHVzaChmdW5jdGlvbigpe2lmKGUpdHJ5e2UuY2FsbCh0KX1jYXRjaChlKXtqZShlLHQsIm5leHRUaWNrIil9ZWxzZSBuJiZuKHQpfSksUmV8fChSZT0hMCxVZSgpKSwhZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBQcm9taXNlKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtuPWV9KX12YXIgVmU9bmV3IGVlO2Z1bmN0aW9uIHFlKGUpeyFmdW5jdGlvbiBlKHQsbil7dmFyIHIsaTt2YXIgbz1BcnJheS5pc0FycmF5KHQpO2lmKCFvJiYheSh0KXx8T2JqZWN0LmlzRnJvemVuKHQpfHx0IGluc3RhbmNlb2Ygc2UpcmV0dXJuO2lmKHQuX19vYl9fKXt2YXIgYT10Ll9fb2JfXy5kZXAuaWQ7aWYobi5oYXMoYSkpcmV0dXJuO24uYWRkKGEpfWlmKG8pZm9yKHI9dC5sZW5ndGg7ci0tOyllKHRbcl0sbik7ZWxzZSBmb3IoaT1PYmplY3Qua2V5cyh0KSxyPWkubGVuZ3RoO3ItLTspZSh0W2lbcl1dLG4pfShlLFZlKSxWZS5jbGVhcigpfXZhciBXZT1mKGZ1bmN0aW9uKGUpe3ZhciB0PSImIj09PWUuY2hhckF0KDApLG49In4iPT09KGU9dD9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKSxyPSIhIj09PShlPW4/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCk7cmV0dXJue25hbWU6ZT1yP2Uuc2xpY2UoMSk6ZSxvbmNlOm4sY2FwdHVyZTpyLHBhc3NpdmU6dH19KTtmdW5jdGlvbiBIZShlLGkpe2Z1bmN0aW9uIG8oKXt2YXIgZT1hcmd1bWVudHMsdD1vLmZucztpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gTGUodCxudWxsLGFyZ3VtZW50cyxpLCJ2LW9uIGhhbmRsZXIiKTtmb3IodmFyIG49dC5zbGljZSgpLHI9MDtyPG4ubGVuZ3RoO3IrKylMZShuW3JdLG51bGwsZSxpLCJ2LW9uIGhhbmRsZXIiKX1yZXR1cm4gby5mbnM9ZSxvfWZ1bmN0aW9uIEdlKGUsdCxuLHIsaSxvKXt2YXIgYSxzLGMsdTtmb3IoYSBpbiBlKXM9ZVthXSxjPXRbYV0sdT1XZShhKSxBKHMpfHwoQShjKT8oQShzLmZucykmJihzPWVbYV09SGUocyxvKSksSSh1Lm9uY2UpJiYocz1lW2FdPWkodS5uYW1lLHMsdS5jYXB0dXJlKSksbih1Lm5hbWUscyx1LmNhcHR1cmUsdS5wYXNzaXZlLHUucGFyYW1zKSk6cyE9PWMmJihjLmZucz1zLGVbYV09YykpO2ZvcihhIGluIHQpQShlW2FdKSYmcigodT1XZShhKSkubmFtZSx0W2FdLHUuY2FwdHVyZSl9ZnVuY3Rpb24gSmUoZSx0LG4pe3ZhciByO2UgaW5zdGFuY2VvZiBzZSYmKGU9ZS5kYXRhLmhvb2t8fChlLmRhdGEuaG9vaz17fSkpO3ZhciBpPWVbdF07ZnVuY3Rpb24gbygpe24uYXBwbHkodGhpcyxhcmd1bWVudHMpLGIoci5mbnMsbyl9QShpKT9yPUhlKFtvXSk6RShpLmZucykmJkkoaS5tZXJnZWQpPyhyPWkpLmZucy5wdXNoKG8pOnI9SGUoW2ksb10pLHIubWVyZ2VkPSEwLGVbdF09cn1mdW5jdGlvbiBYZShlLHQsbixyKXt2YXIgaT10Lm9wdGlvbnMubXBPcHRpb25zJiZ0Lm9wdGlvbnMubXBPcHRpb25zLnByb3BlcnRpZXM7aWYoQShpKSlyZXR1cm4gbjt2YXIgbz10Lm9wdGlvbnMubXBPcHRpb25zLmV4dGVybmFsQ2xhc3Nlc3x8W10sYT1lLmF0dHJzLHM9ZS5wcm9wcztpZihFKGEpfHxFKHMpKWZvcih2YXIgYyBpbiBpKXt2YXIgdT13KGMpOyhZZShuLHMsYyx1LCEwKXx8WWUobixhLGMsdSwhMSkpJiZuW2NdJiYtMSE9PW8uaW5kZXhPZih1KSYmcltoKG5bY10pXSYmKG5bY109cltoKG5bY10pXSl9cmV0dXJuIG59ZnVuY3Rpb24gWWUoZSx0LG4scixpKXtpZihFKHQpKXtpZihkKHQsbikpcmV0dXJuIGVbbl09dFtuXSxpfHxkZWxldGUgdFtuXSwhMDtpZihkKHQscikpcmV0dXJuIGVbbl09dFtyXSxpfHxkZWxldGUgdFtyXSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBLZShlKXtyZXR1cm4gYyhlKT9bbGUoZSldOkFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24gZSh0LG4pe3ZhciByPVtdO3ZhciBpLG8sYSxzO2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspQShvPXRbaV0pfHwiYm9vbGVhbiI9PXR5cGVvZiBvfHwoYT1yLmxlbmd0aC0xLHM9clthXSxBcnJheS5pc0FycmF5KG8pPzA8by5sZW5ndGgmJihaZSgobz1lKG8sKG58fCIiKSsiXyIraSkpWzBdKSYmWmUocykmJihyW2FdPWxlKHMudGV4dCtvWzBdLnRleHQpLG8uc2hpZnQoKSksci5wdXNoLmFwcGx5KHIsbykpOmMobyk/WmUocyk/clthXT1sZShzLnRleHQrbyk6IiIhPT1vJiZyLnB1c2gobGUobykpOlplKG8pJiZaZShzKT9yW2FdPWxlKHMudGV4dCtvLnRleHQpOihJKHQuX2lzVkxpc3QpJiZFKG8udGFnKSYmQShvLmtleSkmJkUobikmJihvLmtleT0iX192bGlzdCIrbisiXyIraSsiX18iKSxyLnB1c2gobykpKTtyZXR1cm4gcn0oZSk6dm9pZCAwfWZ1bmN0aW9uIFplKGUpe3JldHVybiBFKGUpJiZFKGUudGV4dCkmJiExPT09ZS5pc0NvbW1lbnR9ZnVuY3Rpb24gUWUoZSx0KXtpZihlKXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPXRlP1JlZmxlY3Qub3duS2V5cyhlKTpPYmplY3Qua2V5cyhlKSxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPXJbaV07aWYoIl9fb2JfXyIhPT1vKXtmb3IodmFyIGE9ZVtvXS5mcm9tLHM9dDtzOyl7aWYocy5fcHJvdmlkZWQmJmQocy5fcHJvdmlkZWQsYSkpe25bb109cy5fcHJvdmlkZWRbYV07YnJlYWt9cz1zLiRwYXJlbnR9aWYoIXMmJiJkZWZhdWx0ImluIGVbb10pe3ZhciBjPWVbb10uZGVmYXVsdDtuW29dPSJmdW5jdGlvbiI9PXR5cGVvZiBjP2MuY2FsbCh0KTpjfX19cmV0dXJuIG59fWZ1bmN0aW9uIGV0KGUsdCl7aWYoIWV8fCFlLmxlbmd0aClyZXR1cm57fTtmb3IodmFyIG49e30scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyl7dmFyIG89ZVtyXSxhPW8uZGF0YTtpZihhJiZhLmF0dHJzJiZhLmF0dHJzLnNsb3QmJmRlbGV0ZSBhLmF0dHJzLnNsb3Qsby5jb250ZXh0IT09dCYmby5mbkNvbnRleHQhPT10fHwhYXx8bnVsbD09YS5zbG90KShuLmRlZmF1bHR8fChuLmRlZmF1bHQ9W10pKS5wdXNoKG8pO2Vsc2V7dmFyIHM9YS5zbG90LGM9bltzXXx8KG5bc109W10pOyJ0ZW1wbGF0ZSI9PT1vLnRhZz9jLnB1c2guYXBwbHkoYyxvLmNoaWxkcmVufHxbXSk6Yy5wdXNoKG8pfX1mb3IodmFyIHUgaW4gbiluW3VdLmV2ZXJ5KHR0KSYmZGVsZXRlIG5bdV07cmV0dXJuIG59ZnVuY3Rpb24gdHQoZSl7cmV0dXJuIGUuaXNDb21tZW50JiYhZS5hc3luY0ZhY3Rvcnl8fCIgIj09PWUudGV4dH1mdW5jdGlvbiBudChlLHQsbil7dmFyIHIsaT0wPE9iamVjdC5rZXlzKHQpLmxlbmd0aCxvPWU/ISFlLiRzdGFibGU6IWksYT1lJiZlLiRrZXk7aWYoZSl7aWYoZS5fbm9ybWFsaXplZClyZXR1cm4gZS5fbm9ybWFsaXplZDtpZihvJiZuJiZuIT09bSYmYT09PW4uJGtleSYmIWkmJiFuLiRoYXNOb3JtYWwpcmV0dXJuIG47Zm9yKHZhciBzIGluIHI9e30sZSllW3NdJiYiJCIhPT1zWzBdJiYocltzXT1ydCh0LHMsZVtzXSkpfWVsc2Ugcj17fTtmb3IodmFyIGMgaW4gdCljIGluIHJ8fChyW2NdPWl0KHQsYykpO3JldHVybiBlJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYoZS5fbm9ybWFsaXplZD1yKSxSKHIsIiRzdGFibGUiLG8pLFIociwiJGtleSIsYSksUihyLCIkaGFzTm9ybWFsIixpKSxyfWZ1bmN0aW9uIHJ0KGUsdCxuKXt2YXIgcj1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg/bi5hcHBseShudWxsLGFyZ3VtZW50cyk6bih7fSk7cmV0dXJuKGU9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYhQXJyYXkuaXNBcnJheShlKT9bZV06S2UoZSkpJiYoMD09PWUubGVuZ3RofHwxPT09ZS5sZW5ndGgmJmVbMF0uaXNDb21tZW50KT92b2lkIDA6ZX07cmV0dXJuIG4ucHJveHkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2dldDpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSkscn1mdW5jdGlvbiBpdChlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlW3RdfX1mdW5jdGlvbiBvdChlLHQpe3ZhciBuLHIsaSxvLGE7aWYoQXJyYXkuaXNBcnJheShlKXx8InN0cmluZyI9PXR5cGVvZiBlKWZvcihuPW5ldyBBcnJheShlLmxlbmd0aCkscj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluW3JdPXQoZVtyXSxyLHIscik7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIGUpZm9yKG49bmV3IEFycmF5KGUpLHI9MDtyPGU7cisrKW5bcl09dChyKzEscixyLHIpO2Vsc2UgaWYoeShlKSlpZih0ZSYmZVtTeW1ib2wuaXRlcmF0b3JdKXtuPVtdO3ZhciBzPWVbU3ltYm9sLml0ZXJhdG9yXSgpLGM9cy5uZXh0KCk7Zm9yKHI9MDshYy5kb25lOyluLnB1c2godChjLnZhbHVlLG4ubGVuZ3RoLHIscisrKSksYz1zLm5leHQoKX1lbHNlIGZvcihvPU9iamVjdC5rZXlzKGUpLG49bmV3IEFycmF5KG8ubGVuZ3RoKSxyPTAsaT1vLmxlbmd0aDtyPGk7cisrKWE9b1tyXSxuW3JdPXQoZVthXSxhLHIscik7cmV0dXJuIEUobil8fChuPVtdKSxuLl9pc1ZMaXN0PSEwLG59ZnVuY3Rpb24gYXQoZSx0LG4scil7dmFyIGksbz10aGlzLiRzY29wZWRTbG90c1tlXTtvPyhuPW58fHt9LHImJihuPXgoeCh7fSxyKSxuKSksaT1vKG4sdGhpcyxuLl9pKXx8dCk6aT10aGlzLiRzbG90c1tlXXx8dDt2YXIgYT1uJiZuLnNsb3Q7cmV0dXJuIGE/dGhpcy4kY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiLHtzbG90OmF9LGkpOml9ZnVuY3Rpb24gc3QoZSl7cmV0dXJuIEVlKHRoaXMuJG9wdGlvbnMsImZpbHRlcnMiLGUpfHwkfWZ1bmN0aW9uIGN0KGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/LTE9PT1lLmluZGV4T2YodCk6ZSE9PXR9ZnVuY3Rpb24gdXQoZSx0LG4scixpKXt2YXIgbz1ELmtleUNvZGVzW3RdfHxuO3JldHVybiBpJiZyJiYhRC5rZXlDb2Rlc1t0XT9jdChpLHIpOm8/Y3QobyxlKTpyP3cocikhPT10OnZvaWQgMH1mdW5jdGlvbiBsdChpLG8sYSxzLGMpe2lmKGEpaWYoeShhKSl7dmFyIHU7QXJyYXkuaXNBcnJheShhKSYmKGE9QyhhKSk7dmFyIGU9ZnVuY3Rpb24odCl7aWYoImNsYXNzIj09PXR8fCJzdHlsZSI9PT10fHxsKHQpKXU9aTtlbHNle3ZhciBlPWkuYXR0cnMmJmkuYXR0cnMudHlwZTt1PXN8fEQubXVzdFVzZVByb3AobyxlLHQpP2kuZG9tUHJvcHN8fChpLmRvbVByb3BzPXt9KTppLmF0dHJzfHwoaS5hdHRycz17fSl9dmFyIG49aCh0KSxyPXcodCk7biBpbiB1fHxyIGluIHV8fCh1W3RdPWFbdF0sYyYmKChpLm9ufHwoaS5vbj17fSkpWyJ1cGRhdGU6Iit0XT1mdW5jdGlvbihlKXthW3RdPWV9KSl9O2Zvcih2YXIgdCBpbiBhKWUodCl9ZWxzZTtyZXR1cm4gaX1mdW5jdGlvbiBkdChlLHQpe3ZhciBuPXRoaXMuX3N0YXRpY1RyZWVzfHwodGhpcy5fc3RhdGljVHJlZXM9W10pLHI9bltlXTtyZXR1cm4gciYmIXR8fHB0KHI9bltlXT10aGlzLiRvcHRpb25zLnN0YXRpY1JlbmRlckZuc1tlXS5jYWxsKHRoaXMuX3JlbmRlclByb3h5LG51bGwsdGhpcyksIl9fc3RhdGljX18iK2UsITEpLHJ9ZnVuY3Rpb24gZnQoZSx0LG4pe3JldHVybiBwdChlLCJfX29uY2VfXyIrdCsobj8iXyIrbjoiIiksITApLGV9ZnVuY3Rpb24gcHQoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspZVtyXSYmInN0cmluZyIhPXR5cGVvZiBlW3JdJiZodChlW3JdLHQrIl8iK3Isbik7ZWxzZSBodChlLHQsbil9ZnVuY3Rpb24gaHQoZSx0LG4pe2UuaXNTdGF0aWM9ITAsZS5rZXk9dCxlLmlzT25jZT1ufWZ1bmN0aW9uIHZ0KGUsdCl7aWYodClpZih1KHQpKXt2YXIgbj1lLm9uPWUub24/eCh7fSxlLm9uKTp7fTtmb3IodmFyIHIgaW4gdCl7dmFyIGk9bltyXSxvPXRbcl07bltyXT1pP1tdLmNvbmNhdChpLG8pOm99fWVsc2U7cmV0dXJuIGV9ZnVuY3Rpb24gZ3QoZSx0LG4scil7dD10fHx7JHN0YWJsZTohbn07Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07QXJyYXkuaXNBcnJheShvKT9ndChvLHQsbik6byYmKG8ucHJveHkmJihvLmZuLnByb3h5PSEwKSx0W28ua2V5XT1vLmZuKX1yZXR1cm4gciYmKHQuJGtleT1yKSx0fWZ1bmN0aW9uIG10KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKz0yKXt2YXIgcj10W25dOyJzdHJpbmciPT10eXBlb2YgciYmciYmKGVbdFtuXV09dFtuKzFdKX1yZXR1cm4gZX1mdW5jdGlvbiB5dChlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZT90K2U6ZX1mdW5jdGlvbiBfdChlKXtlLl9vPWZ0LGUuX249byxlLl9zPW4sZS5fbD1vdCxlLl90PWF0LGUuX3E9UCxlLl9pPU0sZS5fbT1kdCxlLl9mPXN0LGUuX2s9dXQsZS5fYj1sdCxlLl92PWxlLGUuX2U9dWUsZS5fdT1ndCxlLl9nPXZ0LGUuX2Q9bXQsZS5fcD15dH1mdW5jdGlvbiBidChlLHQsbixvLHIpe3ZhciBhLGk9dGhpcyxzPXIub3B0aW9ucztkKG8sIl91aWQiKT8oYT1PYmplY3QuY3JlYXRlKG8pKS5fb3JpZ2luYWw9bzpvPShhPW8pLl9vcmlnaW5hbDt2YXIgYz1JKHMuX2NvbXBpbGVkKSx1PSFjO3RoaXMuZGF0YT1lLHRoaXMucHJvcHM9dCx0aGlzLmNoaWxkcmVuPW4sdGhpcy5wYXJlbnQ9byx0aGlzLmxpc3RlbmVycz1lLm9ufHxtLHRoaXMuaW5qZWN0aW9ucz1RZShzLmluamVjdCxvKSx0aGlzLnNsb3RzPWZ1bmN0aW9uKCl7cmV0dXJuIGkuJHNsb3RzfHxudChlLnNjb3BlZFNsb3RzLGkuJHNsb3RzPWV0KG4sbykpLGkuJHNsb3RzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic2NvcGVkU2xvdHMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBudChlLnNjb3BlZFNsb3RzLHRoaXMuc2xvdHMoKSl9fSksYyYmKHRoaXMuJG9wdGlvbnM9cyx0aGlzLiRzbG90cz10aGlzLnNsb3RzKCksdGhpcy4kc2NvcGVkU2xvdHM9bnQoZS5zY29wZWRTbG90cyx0aGlzLiRzbG90cykpLHMuX3Njb3BlSWQ/dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1FdChhLGUsdCxuLHIsdSk7cmV0dXJuIGkmJiFBcnJheS5pc0FycmF5KGkpJiYoaS5mblNjb3BlSWQ9cy5fc2NvcGVJZCxpLmZuQ29udGV4dD1vKSxpfTp0aGlzLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBFdChhLGUsdCxuLHIsdSl9fWZ1bmN0aW9uIHd0KGUsdCxuLHIsaSl7dmFyIG89ZGUoZSk7cmV0dXJuIG8uZm5Db250ZXh0PW4sby5mbk9wdGlvbnM9cix0LnNsb3QmJigoby5kYXRhfHwoby5kYXRhPXt9KSkuc2xvdD10LnNsb3QpLG99ZnVuY3Rpb24ga3QoZSx0KXtmb3IodmFyIG4gaW4gdCllW2gobildPXRbbl19X3QoYnQucHJvdG90eXBlKTt2YXIgU3Q9e2luaXQ6ZnVuY3Rpb24oZSx0KXtpZihlLmNvbXBvbmVudEluc3RhbmNlJiYhZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQmJmUuZGF0YS5rZWVwQWxpdmUpe3ZhciBuPWU7U3QucHJlcGF0Y2gobixuKX1lbHNleyhlLmNvbXBvbmVudEluc3RhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49e19pc0NvbXBvbmVudDohMCxfcGFyZW50Vm5vZGU6ZSxwYXJlbnQ6dH0scj1lLmRhdGEuaW5saW5lVGVtcGxhdGU7RShyKSYmKG4ucmVuZGVyPXIucmVuZGVyLG4uc3RhdGljUmVuZGVyRm5zPXIuc3RhdGljUmVuZGVyRm5zKTtyZXR1cm4gbmV3IGUuY29tcG9uZW50T3B0aW9ucy5DdG9yKG4pfShlLEJ0KSkuJG1vdW50KHQ/ZS5lbG06dm9pZCAwLHQpfX0scHJlcGF0Y2g6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmNvbXBvbmVudE9wdGlvbnM7IWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89ci5kYXRhLnNjb3BlZFNsb3RzLGE9ZS4kc2NvcGVkU2xvdHMscz0hIShvJiYhby4kc3RhYmxlfHxhIT09bSYmIWEuJHN0YWJsZXx8byYmZS4kc2NvcGVkU2xvdHMuJGtleSE9PW8uJGtleSksYz0hIShpfHxlLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbnx8cyk7ZS4kb3B0aW9ucy5fcGFyZW50Vm5vZGU9cixlLiR2bm9kZT1yLGUuX3Zub2RlJiYoZS5fdm5vZGUucGFyZW50PXIpO2lmKGUuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuPWksZS4kYXR0cnM9ci5kYXRhLmF0dHJzfHxtLGUuJGxpc3RlbmVycz1ufHxtLHQmJmUuJG9wdGlvbnMucHJvcHMpe2dlKCExKTtmb3IodmFyIHU9ZS5fcHJvcHMsbD1lLiRvcHRpb25zLl9wcm9wS2V5c3x8W10sZD0wO2Q8bC5sZW5ndGg7ZCsrKXt2YXIgZj1sW2RdLHA9ZS4kb3B0aW9ucy5wcm9wczt1W2ZdPUllKGYscCx0LGUpfWdlKCEwKSxlLiRvcHRpb25zLnByb3BzRGF0YT10fWUuXyR1cGRhdGVQcm9wZXJ0aWVzJiZlLl8kdXBkYXRlUHJvcGVydGllcyhlKSxuPW58fG07dmFyIGg9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO2UuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycz1uLE50KGUsbixoKSxjJiYoZS4kc2xvdHM9ZXQoaSxyLmNvbnRleHQpLGUuJGZvcmNlVXBkYXRlKCkpfSh0LmNvbXBvbmVudEluc3RhbmNlPWUuY29tcG9uZW50SW5zdGFuY2Usbi5wcm9wc0RhdGEsbi5saXN0ZW5lcnMsdCxuLmNoaWxkcmVuKX0saW5zZXJ0OmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5jb250ZXh0LHI9ZS5jb21wb25lbnRJbnN0YW5jZTtyLl9pc01vdW50ZWR8fChyLl9pc01vdW50ZWQ9ITAsci5fJHZkPyhGdChyLCJvblNlcnZpY2VDcmVhdGVkIiksRnQociwib25TZXJ2aWNlQXR0YWNoZWQiKSxyLl8kdmQuYWRkTW91bnRlZFZtKHIpKTpGdChyLCJtb3VudGVkIikpLGUuZGF0YS5rZWVwQWxpdmUmJihuLl9pc01vdW50ZWQ/KCh0PXIpLl9pbmFjdGl2ZT0hMSx6dC5wdXNoKHQpKTpSdChyLCEwKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb21wb25lbnRJbnN0YW5jZTt0Ll9pc0Rlc3Ryb3llZHx8KGUuZGF0YS5rZWVwQWxpdmU/ZnVuY3Rpb24gZSh0LG4pe2lmKG4mJih0Ll9kaXJlY3RJbmFjdGl2ZT0hMCxEdCh0KSkpcmV0dXJuO2lmKCF0Ll9pbmFjdGl2ZSl7dC5faW5hY3RpdmU9ITA7Zm9yKHZhciByPTA7cjx0LiRjaGlsZHJlbi5sZW5ndGg7cisrKWUodC4kY2hpbGRyZW5bcl0pO0Z0KHQsImRlYWN0aXZhdGVkIil9fSh0LCEwKTp0LiRkZXN0cm95KCkpfX0seHQ9T2JqZWN0LmtleXMoU3QpO2Z1bmN0aW9uIEN0KGUsdCxuLHIsaSl7aWYoIUEoZSkpe3ZhciBvPW4uJG9wdGlvbnMuX2Jhc2U7aWYoeShlKSYmKGU9by5leHRlbmQoZSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBlKXt2YXIgYSxzLGMsdSxsLGQsZjtpZihBKGUuY2lkKSYmdm9pZCAwPT09KGU9ZnVuY3Rpb24odCxuKXtpZihJKHQuZXJyb3IpJiZFKHQuZXJyb3JDb21wKSlyZXR1cm4gdC5lcnJvckNvbXA7aWYoRSh0LnJlc29sdmVkKSlyZXR1cm4gdC5yZXNvbHZlZDt2YXIgZT0kdDtlJiZFKHQub3duZXJzKSYmLTE9PT10Lm93bmVycy5pbmRleE9mKGUpJiZ0Lm93bmVycy5wdXNoKGUpO2lmKEkodC5sb2FkaW5nKSYmRSh0LmxvYWRpbmdDb21wKSlyZXR1cm4gdC5sb2FkaW5nQ29tcDtpZihlJiYhRSh0Lm93bmVycykpe3ZhciByPXQub3duZXJzPVtlXSxpPSEwLG89bnVsbCxhPW51bGw7ZS4kb24oImhvb2s6ZGVzdHJveWVkIixmdW5jdGlvbigpe3JldHVybiBiKHIsZSl9KTt2YXIgcz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXIubGVuZ3RoO3Q8bjt0Kyspclt0XS4kZm9yY2VVcGRhdGUoKTtlJiYoci5sZW5ndGg9MCxudWxsIT09byYmKGNsZWFyVGltZW91dChvKSxvPW51bGwpLG51bGwhPT1hJiYoY2xlYXJUaW1lb3V0KGEpLGE9bnVsbCkpfSxjPWooZnVuY3Rpb24oZSl7dC5yZXNvbHZlZD1QdChlLG4pLGk/ci5sZW5ndGg9MDpzKCEwKX0pLHU9aihmdW5jdGlvbihlKXtFKHQuZXJyb3JDb21wKSYmKHQuZXJyb3I9ITAscyghMCkpfSksbD10KGMsdSk7cmV0dXJuIHkobCkmJihfKGwpP0EodC5yZXNvbHZlZCkmJmwudGhlbihjLHUpOl8obC5jb21wb25lbnQpJiYobC5jb21wb25lbnQudGhlbihjLHUpLEUobC5lcnJvcikmJih0LmVycm9yQ29tcD1QdChsLmVycm9yLG4pKSxFKGwubG9hZGluZykmJih0LmxvYWRpbmdDb21wPVB0KGwubG9hZGluZyxuKSwwPT09bC5kZWxheT90LmxvYWRpbmc9ITA6bz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bz1udWxsLEEodC5yZXNvbHZlZCkmJkEodC5lcnJvcikmJih0LmxvYWRpbmc9ITAscyghMSkpfSxsLmRlbGF5fHwyMDApKSxFKGwudGltZW91dCkmJihhPXNldFRpbWVvdXQoZnVuY3Rpb24oKXthPW51bGwsQSh0LnJlc29sdmVkKSYmdShudWxsKX0sbC50aW1lb3V0KSkpKSxpPSExLHQubG9hZGluZz90LmxvYWRpbmdDb21wOnQucmVzb2x2ZWR9fShhPWUsbykpKXJldHVybiBzPWEsYz10LHU9bixsPXIsZD1pLChmPXVlKCkpLmFzeW5jRmFjdG9yeT1zLGYuYXN5bmNNZXRhPXtkYXRhOmMsY29udGV4dDp1LGNoaWxkcmVuOmwsdGFnOmR9LGY7dD10fHx7fSx2bihlKSxFKHQubW9kZWwpJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUubW9kZWwmJmUubW9kZWwucHJvcHx8InZhbHVlIixyPWUubW9kZWwmJmUubW9kZWwuZXZlbnR8fCJpbnB1dCI7KHQuYXR0cnN8fCh0LmF0dHJzPXt9KSlbbl09dC5tb2RlbC52YWx1ZTt2YXIgaT10Lm9ufHwodC5vbj17fSksbz1pW3JdLGE9dC5tb2RlbC5jYWxsYmFjaztFKG8pPyhBcnJheS5pc0FycmF5KG8pPy0xPT09by5pbmRleE9mKGEpOm8hPT1hKSYmKGlbcl09W2FdLmNvbmNhdChvKSk6aVtyXT1hfShlLm9wdGlvbnMsdCk7dmFyIHA9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dC5vcHRpb25zLnByb3BzO2lmKEEoaSkpcmV0dXJuIFhlKGUsdCx7fSxyKTt2YXIgbz17fSxhPWUuYXR0cnMscz1lLnByb3BzO2lmKEUoYSl8fEUocykpZm9yKHZhciBjIGluIGkpe3ZhciB1PXcoYyk7WWUobyxzLGMsdSwhMCl8fFllKG8sYSxjLHUsITEpfXJldHVybiBYZShlLHQsbyxyKX0odCxlLDAsbik7aWYoSShlLm9wdGlvbnMuZnVuY3Rpb25hbCkpcmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89ZS5vcHRpb25zLGE9e30scz1vLnByb3BzO2lmKEUocykpZm9yKHZhciBjIGluIHMpYVtjXT1JZShjLHMsdHx8bSk7ZWxzZSBFKG4uYXR0cnMpJiZrdChhLG4uYXR0cnMpLEUobi5wcm9wcykmJmt0KGEsbi5wcm9wcyk7dmFyIHU9bmV3IGJ0KG4sYSxpLHIsZSksbD1vLnJlbmRlci5jYWxsKG51bGwsdS5fYyx1KTtpZihsIGluc3RhbmNlb2Ygc2UpcmV0dXJuIHd0KGwsbix1LnBhcmVudCxvKTtpZihBcnJheS5pc0FycmF5KGwpKXtmb3IodmFyIGQ9S2UobCl8fFtdLGY9bmV3IEFycmF5KGQubGVuZ3RoKSxwPTA7cDxkLmxlbmd0aDtwKyspZltwXT13dChkW3BdLG4sdS5wYXJlbnQsbyk7cmV0dXJuIGZ9fShlLHAsdCxuLHIpO3ZhciBoPXQub247aWYodC5vbj10Lm5hdGl2ZU9uLEkoZS5vcHRpb25zLmFic3RyYWN0KSl7dmFyIHY9dC5zbG90O3Q9e30sdiYmKHQuc2xvdD12KX0hZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuaG9va3x8KGUuaG9vaz17fSksbj0wO248eHQubGVuZ3RoO24rKyl7dmFyIHI9eHRbbl0saT10W3JdLG89U3Rbcl07aT09PW98fGkmJmkuX21lcmdlZHx8KHRbcl09aT9UdChvLGkpOm8pfX0odCk7dmFyIGc9ZS5vcHRpb25zLm5hbWV8fGk7cmV0dXJuIG5ldyBzZSgidnVlLWNvbXBvbmVudC0iK2UuY2lkKyhnPyItIitnOiIiKSx0LHZvaWQgMCx2b2lkIDAsdm9pZCAwLG4se0N0b3I6ZSxwcm9wc0RhdGE6cCxsaXN0ZW5lcnM6aCx0YWc6aSxjaGlsZHJlbjpyfSxhKX19fWZ1bmN0aW9uIFR0KG4scil7dmFyIGU9ZnVuY3Rpb24oZSx0KXtuKGUsdCkscihlLHQpfTtyZXR1cm4gZS5fbWVyZ2VkPSEwLGV9dmFyIE90PTEsQXQ9MjtmdW5jdGlvbiBFdChlLHQsbixyLGksbyl7cmV0dXJuKEFycmF5LmlzQXJyYXkobil8fGMobikpJiYoaT1yLHI9bixuPXZvaWQgMCksSShvKSYmKGk9QXQpLGZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYoRShuKSYmRShuLl9fb2JfXykpcmV0dXJuIHVlKCk7RShuKSYmRShuLmlzKSYmKHQ9bi5pcyk7aWYoIXQpcmV0dXJuIHVlKCk7QXJyYXkuaXNBcnJheShyKSYmImZ1bmN0aW9uIj09dHlwZW9mIHJbMF0mJigobj1ufHx7fSkuc2NvcGVkU2xvdHM9e2RlZmF1bHQ6clswXX0sci5sZW5ndGg9MCk7aT09PUF0P3I9S2Uocik6aT09PU90JiYocj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZihBcnJheS5pc0FycmF5KGVbdF0pKXJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGUpO3JldHVybiBlfShyKSk7dmFyIG8sYTtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBzO2E9ZS4kdm5vZGUmJmUuJHZub2RlLm5zfHxELmdldFRhZ05hbWVzcGFjZSh0KSxvPUQuaXNSZXNlcnZlZFRhZyh0KT9uZXcgc2UoRC5wYXJzZVBsYXRmb3JtVGFnTmFtZSh0KSxuLHIsdm9pZCAwLHZvaWQgMCxlKTpuJiZuLnByZXx8IUUocz1FZShlLiRvcHRpb25zLCJjb21wb25lbnRzIix0KSk/bmV3IHNlKHQsbixyLHZvaWQgMCx2b2lkIDAsZSk6Q3QocyxuLGUscix0KX1lbHNlIG89Q3QodCxuLGUscik7cmV0dXJuIEFycmF5LmlzQXJyYXkobyk/bzpFKG8pPyhFKGEpJiZmdW5jdGlvbiBlKHQsbixyKXt0Lm5zPW47ImZvcmVpZ25PYmplY3QiPT09dC50YWcmJihyPSEobj12b2lkIDApKTtpZihFKHQuY2hpbGRyZW4pKWZvcih2YXIgaT0wLG89dC5jaGlsZHJlbi5sZW5ndGg7aTxvO2krKyl7dmFyIGE9dC5jaGlsZHJlbltpXTtFKGEudGFnKSYmKEEoYS5ucyl8fEkocikmJiJzdmciIT09YS50YWcpJiZlKGEsbixyKX19KG8sYSksRShuKSYmZnVuY3Rpb24oZSl7eShlLnN0eWxlKSYmcWUoZS5zdHlsZSk7eShlLmNsYXNzKSYmcWUoZS5jbGFzcyl9KG4pLG8pOnVlKCl9KGUsdCxuLHIsaSl9dmFyIEl0LCR0PW51bGw7ZnVuY3Rpb24gUHQoZSx0KXtyZXR1cm4oZS5fX2VzTW9kdWxlfHx0ZSYmIk1vZHVsZSI9PT1lW1N5bWJvbC50b1N0cmluZ1RhZ10pJiYoZT1lLmRlZmF1bHQpLHkoZSk/dC5leHRlbmQoZSk6ZX1mdW5jdGlvbiBNdChlLHQpe0l0LiRvbihlLHQpfWZ1bmN0aW9uIGp0KGUsdCl7SXQuJG9mZihlLHQpfWZ1bmN0aW9uIEx0KHQsbil7dmFyIHI9SXQ7cmV0dXJuIGZ1bmN0aW9uIGUoKXtudWxsIT09bi5hcHBseShudWxsLGFyZ3VtZW50cykmJnIuJG9mZih0LGUpfX1mdW5jdGlvbiBOdChlLHQsbil7R2UodCxufHx7fSxNdCxqdCxMdCxJdD1lKSxJdD12b2lkIDB9dmFyIEJ0PW51bGw7ZnVuY3Rpb24gRHQoZSl7Zm9yKDtlJiYoZT1lLiRwYXJlbnQpOylpZihlLl9pbmFjdGl2ZSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBSdChlLHQpe2lmKHQpe2lmKGUuX2RpcmVjdEluYWN0aXZlPSExLER0KGUpKXJldHVybn1lbHNlIGlmKGUuX2RpcmVjdEluYWN0aXZlKXJldHVybjtpZihlLl9pbmFjdGl2ZXx8bnVsbD09PWUuX2luYWN0aXZlKXtlLl9pbmFjdGl2ZT0hMTtmb3IodmFyIG49MDtuPGUuJGNoaWxkcmVuLmxlbmd0aDtuKyspUnQoZS4kY2hpbGRyZW5bbl0pO0Z0KGUsImFjdGl2YXRlZCIpfX1mdW5jdGlvbiBGdChlLHQpe29lKCk7dmFyIG49ZS4kb3B0aW9uc1t0XSxyPXQrIiBob29rIjtpZihuKWZvcih2YXIgaT0wLG89bi5sZW5ndGg7aTxvO2krKylMZShuW2ldLGUsbnVsbCxlLHIpO2UuX2hhc0hvb2tFdmVudCYmZS4kZW1pdCgiaG9vazoiK3QpLGFlKCl9dmFyIFV0PVtdLHp0PVtdLFZ0PXt9LHF0PSExLFd0PSExLEh0PTA7dmFyIEd0PURhdGUubm93O2lmKFYmJiFHKXt2YXIgSnQ9d2luZG93LnBlcmZvcm1hbmNlO0p0JiYiZnVuY3Rpb24iPT10eXBlb2YgSnQubm93JiZHdCgpPmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLnRpbWVTdGFtcCYmKEd0PWZ1bmN0aW9uKCl7cmV0dXJuIEp0Lm5vdygpfSl9ZnVuY3Rpb24gWHQoKXt2YXIgZSx0O2ZvcihHdCgpLFd0PSEwLFV0LnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pZC10LmlkfSksSHQ9MDtIdDxVdC5sZW5ndGg7SHQrKykoZT1VdFtIdF0pLmJlZm9yZSYmZS5iZWZvcmUoKSx0PWUuaWQsVnRbdF09bnVsbCxlLnJ1bigpO3ZhciBuPXp0LnNsaWNlKCkscj1VdC5zbGljZSgpO0h0PVV0Lmxlbmd0aD16dC5sZW5ndGg9MCxxdD1XdD0hKFZ0PXt9KSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLl9pbmFjdGl2ZT0hMCxSdChlW3RdLCEwKX0obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7Zm9yKDt0LS07KXt2YXIgbj1lW3RdLHI9bi52bTtyLl93YXRjaGVyPT09biYmci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJihyLl8kdmQ/ci5fJHZkLmFkZFVwZGF0ZWRWbShyKTpGdChyLCJ1cGRhdGVkIikpfX0ociksWiYmRC5kZXZ0b29scyYmWi5lbWl0KCJmbHVzaCIpfXZhciBZdD0wLEt0PWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy52bT1lLGkmJihlLl93YXRjaGVyPXRoaXMpLGUuX3dhdGNoZXJzLnB1c2godGhpcykscj8odGhpcy5kZWVwPSEhci5kZWVwLHRoaXMudXNlcj0hIXIudXNlcix0aGlzLmxhenk9ISFyLmxhenksdGhpcy5zeW5jPSEhci5zeW5jLHRoaXMuYmVmb3JlPXIuYmVmb3JlKTp0aGlzLmRlZXA9dGhpcy51c2VyPXRoaXMubGF6eT10aGlzLnN5bmM9ITEsdGhpcy5jYj1uLHRoaXMuaWQ9KytZdCx0aGlzLmFjdGl2ZT0hMCx0aGlzLmRpcnR5PXRoaXMubGF6eSx0aGlzLmRlcHM9W10sdGhpcy5uZXdEZXBzPVtdLHRoaXMuZGVwSWRzPW5ldyBlZSx0aGlzLm5ld0RlcElkcz1uZXcgZWUsdGhpcy5leHByZXNzaW9uPSIiLCJmdW5jdGlvbiI9PXR5cGVvZiB0P3RoaXMuZ2V0dGVyPXQ6KHRoaXMuZ2V0dGVyPWZ1bmN0aW9uKGUpe2lmKCFGLnRlc3QoZSkpe3ZhciBuPWUuc3BsaXQoIi4iKTtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxuLmxlbmd0aDt0Kyspe2lmKCFlKXJldHVybjtlPWVbblt0XV19cmV0dXJuIGV9fX0odCksdGhpcy5nZXR0ZXJ8fCh0aGlzLmdldHRlcj1UKSksdGhpcy52YWx1ZT10aGlzLmxhenk/dm9pZCAwOnRoaXMuZ2V0KCl9O0t0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt2YXIgZTtvZSh0aGlzKTt2YXIgdD10aGlzLnZtO3RyeXtlPXRoaXMuZ2V0dGVyLmNhbGwodCx0KX1jYXRjaChlKXtpZighdGhpcy51c2VyKXRocm93IGU7amUoZSx0LCdnZXR0ZXIgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZmluYWxseXt0aGlzLmRlZXAmJnFlKGUpLGFlKCksdGhpcy5jbGVhbnVwRGVwcygpfXJldHVybiBlfSxLdC5wcm90b3R5cGUuYWRkRGVwPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7dGhpcy5uZXdEZXBJZHMuaGFzKHQpfHwodGhpcy5uZXdEZXBJZHMuYWRkKHQpLHRoaXMubmV3RGVwcy5wdXNoKGUpLHRoaXMuZGVwSWRzLmhhcyh0KXx8ZS5hZGRTdWIodGhpcykpfSxLdC5wcm90b3R5cGUuY2xlYW51cERlcHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXt2YXIgdD10aGlzLmRlcHNbZV07dGhpcy5uZXdEZXBJZHMuaGFzKHQuaWQpfHx0LnJlbW92ZVN1Yih0aGlzKX12YXIgbj10aGlzLmRlcElkczt0aGlzLmRlcElkcz10aGlzLm5ld0RlcElkcyx0aGlzLm5ld0RlcElkcz1uLHRoaXMubmV3RGVwSWRzLmNsZWFyKCksbj10aGlzLmRlcHMsdGhpcy5kZXBzPXRoaXMubmV3RGVwcyx0aGlzLm5ld0RlcHM9bix0aGlzLm5ld0RlcHMubGVuZ3RoPTB9LEt0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxhenk/dGhpcy5kaXJ0eT0hMDp0aGlzLnN5bmM/dGhpcy5ydW4oKTpmdW5jdGlvbihlKXt2YXIgdD1lLmlkO2lmKG51bGw9PVZ0W3RdKXtpZihWdFt0XT0hMCxXdCl7Zm9yKHZhciBuPVV0Lmxlbmd0aC0xO0h0PG4mJlV0W25dLmlkPmUuaWQ7KW4tLTtVdC5zcGxpY2UobisxLDAsZSl9ZWxzZSBVdC5wdXNoKGUpO3F0fHwocXQ9ITAsemUoWHQpKX19KHRoaXMpfSxLdC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3ZhciBlPXRoaXMuZ2V0KCk7aWYoZSE9PXRoaXMudmFsdWV8fHkoZSl8fHRoaXMuZGVlcCl7dmFyIHQ9dGhpcy52YWx1ZTtpZih0aGlzLnZhbHVlPWUsdGhpcy51c2VyKXRyeXt0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfWNhdGNoKGUpe2plKGUsdGhpcy52bSwnY2FsbGJhY2sgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZWxzZSB0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfX19LEt0LnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5nZXQoKSx0aGlzLmRpcnR5PSExfSxLdC5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0uZGVwZW5kKCl9LEt0LnByb3RvdHlwZS50ZWFyZG93bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt0aGlzLnZtLl9pc0JlaW5nRGVzdHJveWVkfHxiKHRoaXMudm0uX3dhdGNoZXJzLHRoaXMpO2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLnJlbW92ZVN1Yih0aGlzKTt0aGlzLmFjdGl2ZT0hMX19O3ZhciBadD17ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OlQsc2V0OlR9O2Z1bmN0aW9uIFF0KGUsdCxuKXtadC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0XVtuXX0sWnQuc2V0PWZ1bmN0aW9uKGUpe3RoaXNbdF1bbl09ZX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbixadCl9ZnVuY3Rpb24gZW4oZSl7ZS5fd2F0Y2hlcnM9W107dmFyIHQ9ZS4kb3B0aW9uczt0LnByb3BzJiZmdW5jdGlvbihuLHIpe3ZhciBpPW4uJG9wdGlvbnMucHJvcHNEYXRhfHx7fSxvPW4uX3Byb3BzPXt9LGE9bi4kb3B0aW9ucy5fcHJvcEtleXM9W107bi4kcGFyZW50JiZnZSghMSk7dmFyIGU9ZnVuY3Rpb24oZSl7YS5wdXNoKGUpO3ZhciB0PUllKGUscixpLG4pO19lKG8sZSx0KSxlIGluIG58fFF0KG4sIl9wcm9wcyIsZSl9O2Zvcih2YXIgdCBpbiByKWUodCk7Z2UoITApfShlLHQucHJvcHMpLHQubWV0aG9kcyYmZnVuY3Rpb24oZSx0KXtlLiRvcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KWVbbl09ImZ1bmN0aW9uIiE9dHlwZW9mIHRbbl0/VDprKHRbbl0sZSl9KGUsdC5tZXRob2RzKSx0LmRhdGE/ZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhO3UodD1lLl9kYXRhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKGUsdCl7b2UoKTt0cnl7cmV0dXJuIGUuY2FsbCh0LHQpfWNhdGNoKGUpe3JldHVybiBqZShlLHQsImRhdGEoKSIpLHt9fWZpbmFsbHl7YWUoKX19KHQsZSk6dHx8e30pfHwodD17fSk7dmFyIG49T2JqZWN0LmtleXModCkscj1lLiRvcHRpb25zLnByb3BzLGk9KGUuJG9wdGlvbnMubWV0aG9kcyxuLmxlbmd0aCk7Zm9yKDtpLS07KXt2YXIgbz1uW2ldO3ImJmQocixvKXx8KHZvaWQgMCwzNiE9PShhPShvKyIiKS5jaGFyQ29kZUF0KDApKSYmOTUhPT1hJiZRdChlLCJfZGF0YSIsbykpfXZhciBhO3llKHQsITApfShlKTp5ZShlLl9kYXRhPXt9LCEwKSx0LmNvbXB1dGVkJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUuX2NvbXB1dGVkV2F0Y2hlcnM9T2JqZWN0LmNyZWF0ZShudWxsKSxyPUsoKTtmb3IodmFyIGkgaW4gdCl7dmFyIG89dFtpXSxhPSJmdW5jdGlvbiI9PXR5cGVvZiBvP286by5nZXQ7cnx8KG5baV09bmV3IEt0KGUsYXx8VCxULHRuKSksaSBpbiBlfHxubihlLGksbyl9fShlLHQuY29tcHV0ZWQpLHQud2F0Y2gmJnQud2F0Y2ghPT1YJiZmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dO2lmKEFycmF5LmlzQXJyYXkocikpZm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspYW4oZSxuLHJbaV0pO2Vsc2UgYW4oZSxuLHIpfX0oZSx0LndhdGNoKX12YXIgdG49e2xhenk6ITB9O2Z1bmN0aW9uIG5uKGUsdCxuKXt2YXIgcj0hSygpOyJmdW5jdGlvbiI9PXR5cGVvZiBuPyhadC5nZXQ9cj9ybih0KTpvbihuKSxadC5zZXQ9VCk6KFp0LmdldD1uLmdldD9yJiYhMSE9PW4uY2FjaGU/cm4odCk6b24obi5nZXQpOlQsWnQuc2V0PW4uc2V0fHxUKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LFp0KX1mdW5jdGlvbiBybih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9jb21wdXRlZFdhdGNoZXJzJiZ0aGlzLl9jb21wdXRlZFdhdGNoZXJzW3RdO2lmKGUpcmV0dXJuIGUuZGlydHkmJmUuZXZhbHVhdGUoKSxpZS5TaGFyZWRPYmplY3QudGFyZ2V0JiZlLmRlcGVuZCgpLGUudmFsdWV9fWZ1bmN0aW9uIG9uKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyx0aGlzKX19ZnVuY3Rpb24gYW4oZSx0LG4scil7cmV0dXJuIHUobikmJihuPShyPW4pLmhhbmRsZXIpLCJzdHJpbmciPT10eXBlb2YgbiYmKG49ZVtuXSksZS4kd2F0Y2godCxuLHIpfXZhciBzbixjbix1bixsbixkbixmbixwbixobj0wO2Z1bmN0aW9uIHZuKGUpe3ZhciB0PWUub3B0aW9ucztpZihlLnN1cGVyKXt2YXIgbj12bihlLnN1cGVyKTtpZihuIT09ZS5zdXBlck9wdGlvbnMpe2Uuc3VwZXJPcHRpb25zPW47dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLm9wdGlvbnMscj1lLnNlYWxlZE9wdGlvbnM7Zm9yKHZhciBpIGluIG4pbltpXSE9PXJbaV0mJih0fHwodD17fSksdFtpXT1uW2ldKTtyZXR1cm4gdH0oZSk7ciYmeChlLmV4dGVuZE9wdGlvbnMsciksKHQ9ZS5vcHRpb25zPUFlKG4sZS5leHRlbmRPcHRpb25zKSkubmFtZSYmKHQuY29tcG9uZW50c1t0Lm5hbWVdPWUpfX1yZXR1cm4gdH1mdW5jdGlvbiBnbihlKXt0aGlzLl9pbml0KGUpfWZ1bmN0aW9uIG1uKGUpe2UuY2lkPTA7dmFyIGE9MTtlLmV4dGVuZD1mdW5jdGlvbihlKXtlPWV8fHt9O3ZhciB0PXRoaXMsbj10LmNpZCxyPWUuX0N0b3J8fChlLl9DdG9yPXt9KTtpZihyW25dKXJldHVybiByW25dO3ZhciBpPWUubmFtZXx8dC5vcHRpb25zLm5hbWUsbz1mdW5jdGlvbihlKXt0aGlzLl9pbml0KGUpfTtyZXR1cm4oKG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1vKS5jaWQ9YSsrLG8ub3B0aW9ucz1BZSh0Lm9wdGlvbnMsZSksby5zdXBlcj10LG8ub3B0aW9ucy5wcm9wcyYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KVF0KGUucHJvdG90eXBlLCJfcHJvcHMiLG4pfShvKSxvLm9wdGlvbnMuY29tcHV0ZWQmJmZ1bmN0aW9uKGUpe3ZhciB0PWUub3B0aW9ucy5jb21wdXRlZDtmb3IodmFyIG4gaW4gdClubihlLnByb3RvdHlwZSxuLHRbbl0pfShvKSxvLmV4dGVuZD10LmV4dGVuZCxvLm1peGluPXQubWl4aW4sby51c2U9dC51c2UsTi5mb3JFYWNoKGZ1bmN0aW9uKGUpe29bZV09dFtlXX0pLGkmJihvLm9wdGlvbnMuY29tcG9uZW50c1tpXT1vKSxvLnN1cGVyT3B0aW9ucz10Lm9wdGlvbnMsby5leHRlbmRPcHRpb25zPWUsby5zZWFsZWRPcHRpb25zPXgoe30sby5vcHRpb25zKSxyW25dPW99fWZ1bmN0aW9uIHluKGUpe3JldHVybiBlJiYoZS5DdG9yLm9wdGlvbnMubmFtZXx8ZS50YWcpfWZ1bmN0aW9uIF9uKGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/LTE8ZS5pbmRleE9mKHQpOiJzdHJpbmciPT10eXBlb2YgZT8tMTxlLnNwbGl0KCIsIikuaW5kZXhPZih0KToobj1lLCJbb2JqZWN0IFJlZ0V4cF0iPT09ci5jYWxsKG4pJiZlLnRlc3QodCkpO3ZhciBufWZ1bmN0aW9uIGJuKGUsdCl7dmFyIG49ZS5jYWNoZSxyPWUua2V5cyxpPWUuX3Zub2RlO2Zvcih2YXIgbyBpbiBuKXt2YXIgYT1uW29dO2lmKGEpe3ZhciBzPXluKGEuY29tcG9uZW50T3B0aW9ucyk7cyYmIXQocykmJnduKG4sbyxyLGkpfX19ZnVuY3Rpb24gd24oZSx0LG4scil7dmFyIGk9ZVt0XTshaXx8ciYmaS50YWc9PT1yLnRhZ3x8aS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpLGVbdF09bnVsbCxiKG4sdCl9Z24ucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG89dGhpcztvLl91aWQ9aG4rKyxvLl9pc1Z1ZT0hMCxlJiZlLl9pc0NvbXBvbmVudD9mdW5jdGlvbihlLHQpe3ZhciBuPWUuJG9wdGlvbnM9T2JqZWN0LmNyZWF0ZShlLmNvbnN0cnVjdG9yLm9wdGlvbnMpLHI9dC5fcGFyZW50Vm5vZGU7bi5wYXJlbnQ9dC5wYXJlbnQ7dmFyIGk9KG4uX3BhcmVudFZub2RlPXIpLmNvbXBvbmVudE9wdGlvbnM7bi5wcm9wc0RhdGE9aS5wcm9wc0RhdGEsbi5fcGFyZW50TGlzdGVuZXJzPWkubGlzdGVuZXJzLG4uX3JlbmRlckNoaWxkcmVuPWkuY2hpbGRyZW4sbi5fY29tcG9uZW50VGFnPWkudGFnLHQucmVuZGVyJiYobi5yZW5kZXI9dC5yZW5kZXIsbi5zdGF0aWNSZW5kZXJGbnM9dC5zdGF0aWNSZW5kZXJGbnMpfShvLGUpOm8uJG9wdGlvbnM9QWUodm4oby5jb25zdHJ1Y3RvciksZXx8e30sbyksZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucyxuPXQucGFyZW50O2lmKG4mJiF0LmFic3RyYWN0KXtmb3IoO24uJG9wdGlvbnMuYWJzdHJhY3QmJm4uJHBhcmVudDspbj1uLiRwYXJlbnQ7bi4kY2hpbGRyZW4ucHVzaChlKX1lLiRwYXJlbnQ9bixlLiRyb290PW4/bi4kcm9vdDplLGUuJGNoaWxkcmVuPVtdLGUuJHJlZnM9e30sZS5fd2F0Y2hlcj1udWxsLGUuX2luYWN0aXZlPW51bGwsZS5fZGlyZWN0SW5hY3RpdmU9ITEsZS5faXNNb3VudGVkPSExLGUuX2lzRGVzdHJveWVkPSExLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITF9KChvLl9yZW5kZXJQcm94eT1vKS5fc2VsZj1vKSxmdW5jdGlvbihlKXtlLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxlLl9oYXNIb29rRXZlbnQ9ITE7dmFyIHQ9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QmJk50KGUsdCl9KG8pLGZ1bmN0aW9uKGkpe2kuX3Zub2RlPW51bGwsaS5fc3RhdGljVHJlZXM9bnVsbDt2YXIgZT1pLiRvcHRpb25zLHQ9aS4kdm5vZGU9ZS5fcGFyZW50Vm5vZGUsbj10JiZ0LmNvbnRleHQ7aS4kc2xvdHM9ZXQoZS5fcmVuZGVyQ2hpbGRyZW4sbiksaS4kc2NvcGVkU2xvdHM9bSxpLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBFdChpLGUsdCxuLHIsITEpfSxpLiRjcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBFdChpLGUsdCxuLHIsITApfTt2YXIgcj10JiZ0LmRhdGE7X2UoaSwiJGF0dHJzIixyJiZyLmF0dHJzfHxtLG51bGwsITApLF9lKGksIiRsaXN0ZW5lcnMiLGUuX3BhcmVudExpc3RlbmVyc3x8bSxudWxsLCEwKX0obyksRnQobywiYmVmb3JlQ3JlYXRlIiksKG49UWUoKHQ9bykuJG9wdGlvbnMuaW5qZWN0LHQpKSYmKGdlKCExKSxPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe19lKHQsZSxuW2VdKX0pLGdlKCEwKSksZW4obyksKGk9KHI9bykuJG9wdGlvbnMucHJvdmlkZSkmJihyLl9wcm92aWRlZD0iZnVuY3Rpb24iPT10eXBlb2YgaT9pLmNhbGwocik6aSksRnQobywiY3JlYXRlZCIpLG8uJG9wdGlvbnMuZWwmJm8uJG1vdW50KG8uJG9wdGlvbnMuZWwpfSxzbj1nbixjbj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9fSx1bj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BzfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHNuLnByb3RvdHlwZSwiJGRhdGEiLGNuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoc24ucHJvdG90eXBlLCIkcHJvcHMiLHVuKSxzbi5wcm90b3R5cGUuJHNldD1iZSxzbi5wcm90b3R5cGUuJGRlbGV0ZT13ZSxzbi5wcm90b3R5cGUuJHdhdGNoPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzO2lmKHUodCkpcmV0dXJuIGFuKHIsZSx0LG4pOyhuPW58fHt9KS51c2VyPSEwO3ZhciBpPW5ldyBLdChyLGUsdCxuKTtpZihuLmltbWVkaWF0ZSl0cnl7dC5jYWxsKHIsaS52YWx1ZSl9Y2F0Y2goZSl7amUoZSxyLCdjYWxsYmFjayBmb3IgaW1tZWRpYXRlIHdhdGNoZXIgIicraS5leHByZXNzaW9uKyciJyl9cmV0dXJuIGZ1bmN0aW9uKCl7aS50ZWFyZG93bigpfX0sZG49L15ob29rOi8sKGxuPWduKS5wcm90b3R5cGUuJG9uPWZ1bmN0aW9uKGUsdCl7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspdGhpcy4kb24oZVtuXSx0KTtlbHNlKHRoaXMuX2V2ZW50c1tlXXx8KHRoaXMuX2V2ZW50c1tlXT1bXSkpLnB1c2godCksZG4udGVzdChlKSYmKHRoaXMuX2hhc0hvb2tFdmVudD0hMCk7cmV0dXJuIHRoaXN9LGxuLnByb3RvdHlwZS4kb25jZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7ZnVuY3Rpb24gcigpe24uJG9mZihlLHIpLHQuYXBwbHkobixhcmd1bWVudHMpfXJldHVybiByLmZuPXQsbi4kb24oZSxyKSxufSxsbi5wcm90b3R5cGUuJG9mZj1mdW5jdGlvbihlLHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzO2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0aGlzLiRvZmYoZVtuXSx0KTtyZXR1cm4gdGhpc312YXIgaSxvPXRoaXMuX2V2ZW50c1tlXTtpZighbylyZXR1cm4gdGhpcztpZighdClyZXR1cm4gdGhpcy5fZXZlbnRzW2VdPW51bGwsdGhpcztmb3IodmFyIGE9by5sZW5ndGg7YS0tOylpZigoaT1vW2FdKT09PXR8fGkuZm49PT10KXtvLnNwbGljZShhLDEpO2JyZWFrfXJldHVybiB0aGlzfSxsbi5wcm90b3R5cGUuJGVtaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZXZlbnRzW2VdO2lmKHQpe3Q9MTx0Lmxlbmd0aD9TKHQpOnQ7Zm9yKHZhciBuPVMoYXJndW1lbnRzLDEpLHI9J2V2ZW50IGhhbmRsZXIgZm9yICInK2UrJyInLGk9MCxvPXQubGVuZ3RoO2k8bztpKyspTGUodFtpXSx0aGlzLG4sdGhpcyxyKX1yZXR1cm4gdGhpc30sKGZuPWduKS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9dGhpcyxpPXIuJGVsLG89ci5fdm5vZGUsYT0obj1CdCxCdD1yLGZ1bmN0aW9uKCl7QnQ9bn0pO3IuX3Zub2RlPWUsci4kZWw9bz9yLl9fcGF0Y2hfXyhvLGUpOnIuX19wYXRjaF9fKHIuJGVsLGUsdCwhMSksYSgpLGkmJihpLl9fdnVlX189bnVsbCksci4kZWwmJihyLiRlbC5fX3Z1ZV9fPXIpLHIuJHZub2RlJiZyLiRwYXJlbnQmJnIuJHZub2RlPT09ci4kcGFyZW50Ll92bm9kZSYmKHIuJHBhcmVudC4kZWw9ci4kZWwpfSxmbi5wcm90b3R5cGUuJGZvcmNlVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fd2F0Y2hlciYmdGhpcy5fd2F0Y2hlci51cGRhdGUoKX0sZm4ucHJvdG90eXBlLiRkZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZighZS5faXNCZWluZ0Rlc3Ryb3llZCl7RnQoZSwiYmVmb3JlRGVzdHJveSIpLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITA7dmFyIHQ9ZS4kcGFyZW50OyF0fHx0Ll9pc0JlaW5nRGVzdHJveWVkfHxlLiRvcHRpb25zLmFic3RyYWN0fHxiKHQuJGNoaWxkcmVuLGUpLGUuX3dhdGNoZXImJmUuX3dhdGNoZXIudGVhcmRvd24oKTtmb3IodmFyIG49ZS5fd2F0Y2hlcnMubGVuZ3RoO24tLTspZS5fd2F0Y2hlcnNbbl0udGVhcmRvd24oKTtlLl9kYXRhLl9fb2JfXyYmZS5fZGF0YS5fX29iX18udm1Db3VudC0tLGUuX2lzRGVzdHJveWVkPSEwLGUuX19wYXRjaF9fKGUuX3Zub2RlLG51bGwpLEZ0KGUsImRlc3Ryb3llZCIpLGUuJG9mZigpLGUuJGVsJiYoZS4kZWwuX192dWVfXz1udWxsKSxlLiR2bm9kZSYmKGUuJHZub2RlLnBhcmVudD1udWxsKX19LF90KChwbj1nbikucHJvdG90eXBlKSxwbi5wcm90b3R5cGUuJG5leHRUaWNrPWZ1bmN0aW9uKGUpe3JldHVybiB6ZShlLHRoaXMpfSxwbi5wcm90b3R5cGUuX3JlbmRlcj1mdW5jdGlvbigpe3ZhciB0LG49dGhpcyxlPW4uJG9wdGlvbnMscj1lLnJlbmRlcixpPWUuX3BhcmVudFZub2RlO2kmJihuLiRzY29wZWRTbG90cz1udChpLmRhdGEuc2NvcGVkU2xvdHMsbi4kc2xvdHMsbi4kc2NvcGVkU2xvdHMpKSxuLiR2bm9kZT1pO3RyeXskdD1uLHQ9ci5jYWxsKG4uX3JlbmRlclByb3h5LG4uJGNyZWF0ZUVsZW1lbnQpfWNhdGNoKGUpe2plKGUsbiwicmVuZGVyIiksdD1uLl92bm9kZX1maW5hbGx5eyR0PW51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJjE9PT10Lmxlbmd0aCYmKHQ9dFswXSksdCBpbnN0YW5jZW9mIHNlfHwodD11ZSgpKSx0LnBhcmVudD1pLHR9O3ZhciBrbixTbix4bixDbj1bU3RyaW5nLFJlZ0V4cCxBcnJheV0sVG49e0tlZXBBbGl2ZTp7bmFtZToia2VlcC1hbGl2ZSIsYWJzdHJhY3Q6ITAscHJvcHM6e2luY2x1ZGU6Q24sZXhjbHVkZTpDbixtYXg6W1N0cmluZyxOdW1iZXJdfSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5jYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMua2V5cz1bXX0sZGVzdHJveWVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuY2FjaGUpd24odGhpcy5jYWNoZSxlLHRoaXMua2V5cyl9LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuJHdhdGNoKCJpbmNsdWRlIixmdW5jdGlvbih0KXtibihlLGZ1bmN0aW9uKGUpe3JldHVybiBfbih0LGUpfSl9KSx0aGlzLiR3YXRjaCgiZXhjbHVkZSIsZnVuY3Rpb24odCl7Ym4oZSxmdW5jdGlvbihlKXtyZXR1cm4hX24odCxlKX0pfSl9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJHNsb3RzLmRlZmF1bHQsdD1mdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdO2lmKEUobikmJihFKG4uY29tcG9uZW50T3B0aW9ucyl8fChyPW4pLmlzQ29tbWVudCYmci5hc3luY0ZhY3RvcnkpKXJldHVybiBufXZhciByfShlKSxuPXQmJnQuY29tcG9uZW50T3B0aW9ucztpZihuKXt2YXIgcj15bihuKSxpPXRoaXMuaW5jbHVkZSxvPXRoaXMuZXhjbHVkZTtpZihpJiYoIXJ8fCFfbihpLHIpKXx8byYmciYmX24obyxyKSlyZXR1cm4gdDt2YXIgYT10aGlzLmNhY2hlLHM9dGhpcy5rZXlzLGM9bnVsbD09dC5rZXk/bi5DdG9yLmNpZCsobi50YWc/Ijo6IituLnRhZzoiIik6dC5rZXk7YVtjXT8odC5jb21wb25lbnRJbnN0YW5jZT1hW2NdLmNvbXBvbmVudEluc3RhbmNlLGIocyxjKSxzLnB1c2goYykpOihhW2NdPXQscy5wdXNoKGMpLHRoaXMubWF4JiZzLmxlbmd0aD5wYXJzZUludCh0aGlzLm1heCkmJnduKGEsc1swXSxzLHRoaXMuX3Zub2RlKSksdC5kYXRhLmtlZXBBbGl2ZT0hMH1yZXR1cm4gdHx8ZSYmZVswXX19fTtrbj1nbix4bj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIER9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoa24sImNvbmZpZyIseG4pLGtuLnV0aWw9e3dhcm46bmUsZXh0ZW5kOngsbWVyZ2VPcHRpb25zOkFlLGRlZmluZVJlYWN0aXZlOl9lfSxrbi5zZXQ9YmUsa24uZGVsZXRlPXdlLGtuLm5leHRUaWNrPXplLGtuLm9ic2VydmFibGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHllKGUpLGV9LGtuLm9wdGlvbnM9T2JqZWN0LmNyZWF0ZShudWxsKSxOLmZvckVhY2goZnVuY3Rpb24oZSl7a24ub3B0aW9uc1tlKyJzIl09T2JqZWN0LmNyZWF0ZShudWxsKX0pLHgoKGtuLm9wdGlvbnMuX2Jhc2U9a24pLm9wdGlvbnMuY29tcG9uZW50cyxUbiksa24udXNlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2luc3RhbGxlZFBsdWdpbnN8fCh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zPVtdKTtpZigtMTx0LmluZGV4T2YoZSkpcmV0dXJuIHRoaXM7dmFyIG49Uyhhcmd1bWVudHMsMSk7cmV0dXJuIG4udW5zaGlmdCh0aGlzKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5pbnN0YWxsP2UuaW5zdGFsbC5hcHBseShlLG4pOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLmFwcGx5KG51bGwsbiksdC5wdXNoKGUpLHRoaXN9LGtuLm1peGluPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnM9QWUodGhpcy5vcHRpb25zLGUpLHRoaXN9LG1uKGtuKSxTbj1rbixOLmZvckVhY2goZnVuY3Rpb24obil7U25bbl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8oImNvbXBvbmVudCI9PT1uJiZ1KHQpJiYodC5uYW1lPXQubmFtZXx8ZSx0PXRoaXMub3B0aW9ucy5fYmFzZS5leHRlbmQodCkpLCJkaXJlY3RpdmUiPT09biYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXtiaW5kOnQsdXBkYXRlOnR9KSx0aGlzLm9wdGlvbnNbbisicyJdW2VdPXQpOnRoaXMub3B0aW9uc1tuKyJzIl1bZV19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGduLnByb3RvdHlwZSwiJGlzU2VydmVyIix7Z2V0Okt9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZ24ucHJvdG90eXBlLCIkc3NyQ29udGV4dCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR2bm9kZSYmdGhpcy4kdm5vZGUuc3NyQ29udGV4dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZ24sIkZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0Iix7dmFsdWU6YnR9KSxnbi52ZXJzaW9uPSIyLjYuMTEiO3ZhciBPbj0xO2Z1bmN0aW9uIEFuKCl7cmV0dXJuKE9uKyspLnRvU3RyaW5nKCl9dmFyIEVuPWZ1bmN0aW9uKCl7dGhpcy5ub2RlSWQ9QW4oKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMubmV4dFNpYmxpbmc9bnVsbCx0aGlzLnByZXZpb3VzU2libGluZz1udWxsfTtFbi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuXyR2ZCYmdGhpcy5fJHZkLnJlbW92ZUVsZW1lbnQodGhpcyksdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZGVzdHJveSgpfSl9O3ZhciBJbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLm5vZGVUeXBlPTgsdGhpcy5ub2RlSWQ9QW4oKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLnR5cGU9ImNvbW1lbnQiLHRoaXMudmFsdWU9ZSx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksKChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZSkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlx4M2MhLS0gIit0aGlzLnZhbHVlKyIgLS1ceDNlIn0sZX0oRW4pO2Z1bmN0aW9uICRuKGUsdCxuKXt2YXIgcj1lLmRvY3VtZW50RWxlbWVudDtpZighKDA8ci5wdXJlQ2hpbGRyZW4ubGVuZ3RoJiYxPT09dC5ub2RlVHlwZXx8dC5wYXJlbnROb2RlKSl7dmFyIGk9ci5jaGlsZHJlbixvPWkuaW5kZXhPZihuKTtvPDA/aS5wdXNoKHQpOmkuc3BsaWNlKG8sMCx0KSwxPT09dC5ub2RlVHlwZT8oImJvZHkiPT09dC5yb2xlPyh0LmRvY0lkPWUuaWQsdC5vd25lckRvY3VtZW50PWUsdC5wYXJlbnROb2RlPXIpOih0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5wYXJlbnROb2RlPXR9KSxQbihlLHQpLHQuZG9jSWQ9ZS5pZCx0Lm93bmVyRG9jdW1lbnQ9ZSksTW4odCxyKSxyLnB1cmVDaGlsZHJlbi5wdXNoKHQpKTp0LnBhcmVudE5vZGU9cn19ZnVuY3Rpb24gUG4oZSx0KXt0LnJvbGU9ImJvZHkiLHQuZGVwdGg9MSx0LnJlZj0iX3Jvb3QiLGUuYm9keT10fWZ1bmN0aW9uIE1uKHQsZSl7KHQucGFyZW50Tm9kZT1lKS5kb2NJZCYmKHQuZG9jSWQ9ZS5kb2NJZCx0Lm93bmVyRG9jdW1lbnQ9ZS5vd25lckRvY3VtZW50LHQuZGVwdGg9ZS5kZXB0aCsxKSx0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7TW4oZSx0KX0pfWZ1bmN0aW9uIGpuKGUpe2Zvcig7ZTspe2lmKDE9PT1lLm5vZGVUeXBlKXJldHVybiBlO2U9ZS5uZXh0U2libGluZ319ZnVuY3Rpb24gTG4oZSl7Zm9yKDtlOyl7aWYoMT09PWUubm9kZVR5cGUpcmV0dXJuIGU7ZT1lLnByZXZpb3VzU2libGluZ319ZnVuY3Rpb24gTm4oZSx0LG4scil7bjwwJiYobj0wKTt2YXIgaT10W24tMV0sbz10W25dO3JldHVybiB0LnNwbGljZShuLDAsZSksciYmKGkmJihpLm5leHRTaWJsaW5nPWUpLGUucHJldmlvdXNTaWJsaW5nPWksKGUubmV4dFNpYmxpbmc9bykmJihvLnByZXZpb3VzU2libGluZz1lKSksbn1mdW5jdGlvbiBCbihlLHQsbixyKXt2YXIgaT10LmluZGV4T2YoZSk7aWYoaTwwKXJldHVybi0xO2lmKHIpe3ZhciBvPXRbaS0xXSxhPXRbaSsxXTtvJiYoby5uZXh0U2libGluZz1hKSxhJiYoYS5wcmV2aW91c1NpYmxpbmc9byl9dC5zcGxpY2UoaSwxKTt2YXIgcz1uO2k8PW4mJihzPW4tMSk7dmFyIGM9dFtzLTFdLHU9dFtzXTtyZXR1cm4gdC5zcGxpY2UocywwLGUpLHImJihjJiYoYy5uZXh0U2libGluZz1lKSxlLnByZXZpb3VzU2libGluZz1jLChlLm5leHRTaWJsaW5nPXUpJiYodS5wcmV2aW91c1NpYmxpbmc9ZSkpLGk9PT1zPy0xOm59ZnVuY3Rpb24gRG4oZSx0LG4pe3ZhciByPXQuaW5kZXhPZihlKTtpZighKHI8MCkpe2lmKG4pe3ZhciBpPXRbci0xXSxvPXRbcisxXTtpJiYoaS5uZXh0U2libGluZz1vKSxvJiYoby5wcmV2aW91c1NpYmxpbmc9aSl9dC5zcGxpY2UociwxKX19dmFyIFJuPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9InZpZXciKSx0LmNhbGwodGhpcyksdGhpcy5ub2RlVHlwZT0xLHRoaXMubm9kZUlkPUFuKCksdGhpcy5yZWY9dGhpcy5ub2RlSWQsdGhpcy50eXBlPWUsdGhpcy5hdHRyPXt9LHRoaXMuZXZlbnRzPXt9LHRoaXMuY2hpbGRyZW49W10sdGhpcy5wdXJlQ2hpbGRyZW49W119cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSwoKGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1lKS5wcm90b3R5cGUuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKGUsdCl7ImNpZCI9PT1lP3RoaXMuY2lkPXQ6Im5pZCI9PT1lJiYodGhpcy5uaWQ9dCl9LGUucHJvdG90eXBlLmRpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmV2ZW50c1tlXTtuJiZuLmZvckVhY2goZnVuY3Rpb24oZSl7ZSh0KX0pfSxlLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7aWYoIiI9PT10aGlzLmNpZHx8IiI9PT10aGlzLm5pZClyZXR1cm4gY29uc29sZS5lcnJvcigiY2lkPSIrdGhpcy5jaWQrIixuaWQ9Iit0aGlzLm5pZCsiIGFkZEV2ZW50TGlzdGVuZXIoIitlKyIpIG5vdCBmb3VuZCIpOyh0aGlzLmV2ZW50c1tlXXx8KHRoaXMuZXZlbnRzW2VdPVtdKSkucHVzaCh0KSx0aGlzLl8kdmQuYWRkRWxlbWVudCh0aGlzKX0sZS5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7aWYoIiI9PT10aGlzLmNpZHx8IiI9PT10aGlzLm5pZClyZXR1cm4gY29uc29sZS5lcnJvcigiY2lkPSIrdGhpcy5jaWQrIixuaWQ9Iit0aGlzLm5pZCsiIHJlbW92ZUV2ZW50TGlzdGVuZXIoIitlKyIpIG5vdCBmb3VuZCIpO3ZhciByPSExO2lmKHRoaXMuZXZlbnRzW2VdKXt2YXIgaT10aGlzLmV2ZW50c1tlXS5pbmRleE9mKHQpOy0xIT09aSYmKHRoaXMuZXZlbnRzW2VdLnNwbGljZShpLDEpLHI9ITApfXJ8fGNvbnNvbGUuZXJyb3IoImNpZD0iK3RoaXMuY2lkKyIsbmlkPSIrdGhpcy5uaWQrIiByZW1vdmVFdmVudExpc3RlbmVyKCIrZSsiKSBoYW5kbGVyIG5vdCBmb3VuZCIpLE9iamVjdC5rZXlzKHRoaXMuZXZlbnRzKS5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4gMD09PW4uZXZlbnRzW2VdLmxlbmd0aH0pJiZ0aGlzLl8kdmQucmVtb3ZlRWxlbWVudCh0aGlzKX0sZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ9ZnVuY3Rpb24oZSl7ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUhPT10aGlzfHwoZS5wYXJlbnROb2RlPyhCbihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5sZW5ndGgsITApLDE9PT1lLm5vZGVUeXBlJiZCbihlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCkpOihNbihlLHRoaXMpLE5uKGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksMT09PWUubm9kZVR5cGUmJk5uKGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSkpfSxlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oZSx0KXtpZighKGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8ZT09PXR8fGUubmV4dFNpYmxpbmcmJmUubmV4dFNpYmxpbmc9PT10KSlpZihlLnBhcmVudE5vZGUpe2lmKEJuKGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCksITApLDE9PT1lLm5vZGVUeXBlKXt2YXIgbj1qbih0KTtCbihlLHRoaXMucHVyZUNoaWxkcmVuLG4/dGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihuKTp0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpfX1lbHNlIGlmKE1uKGUsdGhpcyksTm4oZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KSwhMCksMT09PWUubm9kZVR5cGUpe3ZhciByPWpuKHQpO05uKGUsdGhpcy5wdXJlQ2hpbGRyZW4scj90aGlzLnB1cmVDaGlsZHJlbi5pbmRleE9mKHIpOnRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCl9fSxlLnByb3RvdHlwZS5pbnNlcnRBZnRlcj1mdW5jdGlvbihlLHQpe2UucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8ZT09PXR8fGUucHJldmlvdXNTaWJsaW5nJiZlLnByZXZpb3VzU2libGluZz09PXR8fChlLnBhcmVudE5vZGU/KEJuKGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCkrMSwhMCksMT09PWUubm9kZVR5cGUmJkJuKGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihMbih0KSkrMSkpOihNbihlLHRoaXMpLE5uKGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCkrMSwhMCksMT09PWUubm9kZVR5cGUmJk5uKGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihMbih0KSkrMSkpKX0sZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQ9ZnVuY3Rpb24oZSx0KXtlLnBhcmVudE5vZGUmJihEbihlLHRoaXMuY2hpbGRyZW4sITApLDE9PT1lLm5vZGVUeXBlJiZEbihlLHRoaXMucHVyZUNoaWxkcmVuKSksdHx8ZS5kZXN0cm95KCl9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZGVzdHJveSgpfSksdGhpcy5jaGlsZHJlbi5sZW5ndGg9MCx0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGg9MH0sZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iPCIrdGhpcy50eXBlKyIgYXR0cj0iK0pTT04uc3RyaW5naWZ5KHRoaXMuYXR0cikrIiBzdHlsZT0iK0pTT04uc3RyaW5naWZ5KHRoaXMudG9TdHlsZSgpKSsiPiIrdGhpcy5wdXJlQ2hpbGRyZW4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvU3RyaW5nKCl9KS5qb2luKCIiKSsiPC8iK3RoaXMudHlwZSsiPiJ9LGV9KEVuKSxGbj1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZT9lLnRvU3RyaW5nKCk6IiIsdGhpcy5VUkw9dCx0aGlzLmNyZWF0ZURvY3VtZW50RWxlbWVudCgpfTtGbi5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRFbGVtZW50PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztpZighdGhpcy5kb2N1bWVudEVsZW1lbnQpe3ZhciBlPW5ldyBSbigiZG9jdW1lbnQiKTtlLmRvY0lkPXRoaXMuaWQsZS5vd25lckRvY3VtZW50PXRoaXMsZS5yb2xlPSJkb2N1bWVudEVsZW1lbnQiLGUuZGVwdGg9MCxlLnJlZj0iX2RvY3VtZW50RWxlbWVudCIsdGhpcy5kb2N1bWVudEVsZW1lbnQ9ZSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiYXBwZW5kQ2hpbGQiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbihlKXskbihuLGUpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJpbnNlcnRCZWZvcmUiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbihlLHQpeyRuKG4sZSx0KX19KX1yZXR1cm4gdGhpcy5kb2N1bWVudEVsZW1lbnR9LEZuLnByb3RvdHlwZS5jcmVhdGVCb2R5PWZ1bmN0aW9uKGUpe3RoaXMuYm9keXx8UG4odGhpcyxuZXcgUm4oZSkpO3JldHVybiB0aGlzLmJvZHl9LEZuLnByb3RvdHlwZS5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUm4oZSl9LEZuLnByb3RvdHlwZS5jcmVhdGVDb21tZW50PWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgSW4oZSl9LEZuLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7fTt2YXIgVW49cygic3R5bGUsY2xhc3MiKSx6bj0ocygiaW5wdXQsdGV4dGFyZWEsb3B0aW9uLHNlbGVjdCxwcm9ncmVzcyIpLHMoImNvbnRlbnRlZGl0YWJsZSxkcmFnZ2FibGUsc3BlbGxjaGVjayIpLHMoImV2ZW50cyxjYXJldCx0eXBpbmcscGxhaW50ZXh0LW9ubHkiKSxzKCJhbGxvd2Z1bGxzY3JlZW4sYXN5bmMsYXV0b2ZvY3VzLGF1dG9wbGF5LGNoZWNrZWQsY29tcGFjdCxjb250cm9scyxkZWNsYXJlLGRlZmF1bHQsZGVmYXVsdGNoZWNrZWQsZGVmYXVsdG11dGVkLGRlZmF1bHRzZWxlY3RlZCxkZWZlcixkaXNhYmxlZCxlbmFibGVkLGZvcm1ub3ZhbGlkYXRlLGhpZGRlbixpbmRldGVybWluYXRlLGluZXJ0LGlzbWFwLGl0ZW1zY29wZSxsb29wLG11bHRpcGxlLG11dGVkLG5vaHJlZixub3Jlc2l6ZSxub3NoYWRlLG5vdmFsaWRhdGUsbm93cmFwLG9wZW4scGF1c2VvbmV4aXQscmVhZG9ubHkscmVxdWlyZWQscmV2ZXJzZWQsc2NvcGVkLHNlYW1sZXNzLHNlbGVjdGVkLHNvcnRhYmxlLHRyYW5zbGF0ZSx0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlIikscygiaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLGRpdixkZCxkbCxkdCxmaWdjYXB0aW9uLGZpZ3VyZSxwaWN0dXJlLGhyLGltZyxsaSxtYWluLG9sLHAscHJlLHVsLGEsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydGMscnVieSxzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbyxlbWJlZCxvYmplY3QscGFyYW0sc291cmNlLGNhbnZhcyxzY3JpcHQsbm9zY3JpcHQsZGVsLGlucyxjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0cixidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLG91dHB1dCxwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWEsZGV0YWlscyxkaWFsb2csbWVudSxtZW51aXRlbSxzdW1tYXJ5LGNvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QiKSk7dmFyIFZuPU9iamVjdC5mcmVlemUoe2NyZWF0ZUVsZW1lbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBSbihlKX0sY3JlYXRlRWxlbWVudE5TOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBSbihlKyI6Iit0KX0sY3JlYXRlVGV4dE5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJuKCJ0ZXh0Iil9LGNyZWF0ZUNvbW1lbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBJbihlKX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGUsdCxuKXtlLmluc2VydEJlZm9yZSh0LG4pfSxyZW1vdmVDaGlsZDpmdW5jdGlvbihlLHQpe2UucmVtb3ZlQ2hpbGQodCl9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGUsdCl7ZS5hcHBlbmRDaGlsZCh0KX0scGFyZW50Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlfSxuZXh0U2libGluZzpmdW5jdGlvbihlKXtyZXR1cm4gZS5uZXh0U2libGluZ30sdGFnTmFtZTpmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlfSxzZXRUZXh0Q29udGVudDpmdW5jdGlvbigpe30sc2V0U3R5bGVTY29wZTpmdW5jdGlvbigpe319KSxxbj17Y3JlYXRlOmZ1bmN0aW9uKGUsdCl7V24odCl9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe2UuZGF0YS5yZWYhPT10LmRhdGEucmVmJiYoV24oZSwhMCksV24odCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe1duKGUsITApfX07ZnVuY3Rpb24gV24oZSx0KXt2YXIgbj1lLmRhdGEucmVmO2lmKEUobikpe3ZhciByPWUuY29udGV4dCxpPWUuY29tcG9uZW50SW5zdGFuY2V8fGUuZWxtLG89ci4kcmVmczt0P0FycmF5LmlzQXJyYXkob1tuXSk/YihvW25dLGkpOm9bbl09PT1pJiYob1tuXT12b2lkIDApOmUuZGF0YS5yZWZJbkZvcj9BcnJheS5pc0FycmF5KG9bbl0pP29bbl0uaW5kZXhPZihpKTwwJiZvW25dLnB1c2goaSk6b1tuXT1baV06b1tuXT1pfX1zKCJodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSxhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoMSxoMixoMyxoNCxoNSxoNixoZ3JvdXAsbmF2LHNlY3Rpb24sZGl2LGRkLGRsLGR0LGZpZ2NhcHRpb24sZmlndXJlLHBpY3R1cmUsaHIsaW1nLGxpLG1haW4sb2wscCxwcmUsdWwsYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LHMsc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLGVtYmVkLG9iamVjdCxwYXJhbSxzb3VyY2UsY2FudmFzLHNjcmlwdCxub3NjcmlwdCxkZWwsaW5zLGNhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLGJ1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sb3V0cHV0LHByb2dyZXNzLHNlbGVjdCx0ZXh0YXJlYSxkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksY29udGVudCxlbGVtZW50LHNoYWRvdyx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCIpLHMoInN2ZyxhbmltYXRlLGNpcmNsZSxjbGlwcGF0aCxjdXJzb3IsZGVmcyxkZXNjLGVsbGlwc2UsZmlsdGVyLGZvbnQtZmFjZSxmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybixwb2x5Z29uLHBvbHlsaW5lLHJlY3Qsc3dpdGNoLHN5bWJvbCx0ZXh0LHRleHRwYXRoLHRzcGFuLHVzZSx2aWV3IiwhMCk7dmFyIEhuPXMoInRleHQsbnVtYmVyLHBhc3N3b3JkLHNlYXJjaCxlbWFpbCx0ZWwsdXJsIiksR249bmV3IHNlKCIiLHt9LFtdKSxKbj1bImNyZWF0ZSIsImFjdGl2YXRlIiwidXBkYXRlIiwicmVtb3ZlIiwiZGVzdHJveSJdO2Z1bmN0aW9uIFhuKGUsdCl7cmV0dXJuIGUua2V5PT09dC5rZXkmJihlLnRhZz09PXQudGFnJiZlLmlzQ29tbWVudD09PXQuaXNDb21tZW50JiZFKGUuZGF0YSk9PT1FKHQuZGF0YSkmJmZ1bmN0aW9uKGUsdCl7aWYoImlucHV0IiE9PWUudGFnKXJldHVybiEwO3ZhciBuLHI9RShuPWUuZGF0YSkmJkUobj1uLmF0dHJzKSYmbi50eXBlLGk9RShuPXQuZGF0YSkmJkUobj1uLmF0dHJzKSYmbi50eXBlO3JldHVybiByPT09aXx8SG4ocikmJkhuKGkpfShlLHQpfHxJKGUuaXNBc3luY1BsYWNlaG9sZGVyKSYmZS5hc3luY0ZhY3Rvcnk9PT10LmFzeW5jRmFjdG9yeSYmQSh0LmFzeW5jRmFjdG9yeS5lcnJvcikpfWZ1bmN0aW9uIFluKGUsdCxuKXt2YXIgcixpLG89e307Zm9yKHI9dDtyPD1uOysrcilFKGk9ZVtyXS5rZXkpJiYob1tpXT1yKTtyZXR1cm4gb312YXIgS249e2NyZWF0ZTpabix1cGRhdGU6Wm4sZGVzdHJveTpmdW5jdGlvbihlKXtabihlLEduKX19O2Z1bmN0aW9uIFpuKGUsdCl7KGUuZGF0YS5kaXJlY3RpdmVzfHx0LmRhdGEuZGlyZWN0aXZlcykmJmZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG89dD09PUduLGE9bj09PUduLHM9ZXIodC5kYXRhLmRpcmVjdGl2ZXMsdC5jb250ZXh0KSxjPWVyKG4uZGF0YS5kaXJlY3RpdmVzLG4uY29udGV4dCksdT1bXSxsPVtdO2ZvcihlIGluIGMpcj1zW2VdLGk9Y1tlXSxyPyhpLm9sZFZhbHVlPXIudmFsdWUsaS5vbGRBcmc9ci5hcmcsdHIoaSwidXBkYXRlIixuLHQpLGkuZGVmJiZpLmRlZi5jb21wb25lbnRVcGRhdGVkJiZsLnB1c2goaSkpOih0cihpLCJiaW5kIixuLHQpLGkuZGVmJiZpLmRlZi5pbnNlcnRlZCYmdS5wdXNoKGkpKTtpZih1Lmxlbmd0aCl7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHUubGVuZ3RoO2UrKyl0cih1W2VdLCJpbnNlcnRlZCIsbix0KX07bz9KZShuLCJpbnNlcnQiLGQpOmQoKX1sLmxlbmd0aCYmSmUobiwicG9zdHBhdGNoIixmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bC5sZW5ndGg7ZSsrKXRyKGxbZV0sImNvbXBvbmVudFVwZGF0ZWQiLG4sdCl9KTtpZighbylmb3IoZSBpbiBzKWNbZV18fHRyKHNbZV0sInVuYmluZCIsdCx0LGEpfShlLHQpfXZhciBRbj1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIGVyKGUsdCl7dmFyIG4scixpLG89T2JqZWN0LmNyZWF0ZShudWxsKTtpZighZSlyZXR1cm4gbztmb3Iobj0wO248ZS5sZW5ndGg7bisrKShyPWVbbl0pLm1vZGlmaWVyc3x8KHIubW9kaWZpZXJzPVFuKSwob1soaT1yLGkucmF3TmFtZXx8aS5uYW1lKyIuIitPYmplY3Qua2V5cyhpLm1vZGlmaWVyc3x8e30pLmpvaW4oIi4iKSldPXIpLmRlZj1FZSh0LiRvcHRpb25zLCJkaXJlY3RpdmVzIixyLm5hbWUpO3JldHVybiBvfWZ1bmN0aW9uIHRyKHQsbixyLGUsaSl7dmFyIG89dC5kZWYmJnQuZGVmW25dO2lmKG8pdHJ5e28oci5lbG0sdCxyLGUsaSl9Y2F0Y2goZSl7amUoZSxyLmNvbnRleHQsImRpcmVjdGl2ZSAiK3QubmFtZSsiICIrbisiIGhvb2siKX19ZnVuY3Rpb24gbnIoZSxuKXtpZighQShlLmRhdGEud3hzUHJvcHMpfHwhQShuLmRhdGEud3hzUHJvcHMpKXt2YXIgcj1lLiR3eHNXYXRjaGVzLHQ9T2JqZWN0LmtleXMobi5kYXRhLnd4c1Byb3BzKTtpZihyfHx0Lmxlbmd0aCl7cnx8KHI9e30pO3ZhciBpPW4uZGF0YS53eHNQcm9wcztuLiR3eHNXYXRjaGVzPXt9LE9iamVjdC5rZXlzKGkpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9aVtlXTtuLiR3eHNXYXRjaGVzW2VdPXJbZV18fG4uY29udGV4dC4kd2F0Y2godCxmdW5jdGlvbigpe3RoaXMuJGZvcmNlVXBkYXRlKCl9LHtpbW1lZGlhdGU6ITAsZGVlcDohMH0pfSksT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbihlKXtuLiR3eHNXYXRjaGVzW2VdfHwocltlXSgpLGRlbGV0ZSByW2VdKX0pfX19ZnVuY3Rpb24gcnIoZSx0KXt2YXIgbj10LmRhdGEuYXR0cnM7aWYoIUEobikmJiFBKG4uX2kpKXt2YXIgcixpLG89dC5lbG07by5kYXRhc2V0PU9iamVjdC5hc3NpZ24oby5kYXRhc2V0fHx7fSwocj1uLGk9T2JqZWN0LmNyZWF0ZShudWxsKSxPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKDA9PT10LmluZGV4T2YoImRhdGEtIikpe3ZhciBuPWgodC5yZXBsYWNlKCJkYXRhLSIsIiIpKTt0cnl7aVtuXT1KU09OLnBhcnNlKHJbdF0pfWNhdGNoKGUpe2lbbl09clt0XX19fSksaSkpfX12YXIgaXIsb3I9Il9fciIsYXI9Il9fYyI7ZnVuY3Rpb24gc3IodCxuLHIpe3ZhciBpPWlyO3JldHVybiBmdW5jdGlvbiBlKCl7bnVsbCE9PW4uYXBwbHkobnVsbCxhcmd1bWVudHMpJiZ1cih0LGUscixpKX19ZnVuY3Rpb24gY3IoZSx0KXtpci5hZGRFdmVudExpc3RlbmVyKGUsdCl9ZnVuY3Rpb24gdXIoZSx0LG4scil7dCYmKHJ8fGlyKS5yZW1vdmVFdmVudExpc3RlbmVyKGUsdC5fd3JhcHBlcnx8dCl9ZnVuY3Rpb24gbHIoZSx0KXtpZighQShlLmRhdGEub24pfHwhQSh0LmRhdGEub24pKXt2YXIgbj10LmRhdGEub258fHt9LHI9ZS5kYXRhLm9ufHx7fTsoaXI9dC5lbG0pLl8kdmQ9dC5jb250ZXh0Ll8kdmQ7Zm9yKHZhciBpPXQuY29udGV4dCxvPSh0LmRhdGEuYXR0cnN8fHt9KS5faSxhPXQucGFyZW50O2EmJmEuY29tcG9uZW50SW5zdGFuY2U7KXt2YXIgcz1hLmNvbXBvbmVudEluc3RhbmNlLiRhdHRycyYmYS5jb21wb25lbnRJbnN0YW5jZS4kYXR0cnMuX2k7RShzKSYmKG89InItIitzKSxhPWEucGFyZW50fWlyLnNldEF0dHJpYnV0ZSgibmlkIixTdHJpbmcobykpLGlyLnNldEF0dHJpYnV0ZSgiY2lkIixpLl8kaWQpLGZ1bmN0aW9uKGUpe0UoZVtvcl0pJiYoZS5pbnB1dD1bXS5jb25jYXQoZVtvcl0sZS5pbnB1dHx8W10pLGRlbGV0ZSBlW29yXSk7RShlW2FyXSkmJihlLmNoYW5nZT1bXS5jb25jYXQoZVthcl0sZS5jaGFuZ2V8fFtdKSxkZWxldGUgZVthcl0pfShuKSxHZShuLHIsY3IsdXIsc3IsdC5jb250ZXh0KSxpcj12b2lkIDB9fXZhciBkcj1mdW5jdGlvbihlKXt2YXIgcix0LGc9e30sbj1lLm1vZHVsZXMsbT1lLm5vZGVPcHM7Zm9yKHI9MDtyPEpuLmxlbmd0aDsrK3IpZm9yKGdbSm5bcl1dPVtdLHQ9MDt0PG4ubGVuZ3RoOysrdClFKG5bdF1bSm5bcl1dKSYmZ1tKbltyXV0ucHVzaChuW3RdW0puW3JdXSk7ZnVuY3Rpb24gbyhlKXt2YXIgdD1tLnBhcmVudE5vZGUoZSk7RSh0KSYmbS5yZW1vdmVDaGlsZCh0LGUpfWZ1bmN0aW9uIHkoZSx0LG4scixpLG8sYSl7aWYoRShlLmVsbSkmJkUobykmJihlPW9bYV09ZGUoZSkpLGUuaXNSb290SW5zZXJ0PSFpLCFmdW5jdGlvbihlLHQsbixyKXt2YXIgaT1lLmRhdGE7aWYoRShpKSl7dmFyIG89RShlLmNvbXBvbmVudEluc3RhbmNlKSYmaS5rZWVwQWxpdmU7aWYoRShpPWkuaG9vaykmJkUoaT1pLmluaXQpJiZpKGUsITEpLEUoZS5jb21wb25lbnRJbnN0YW5jZSkpcmV0dXJuIHAoZSx0KSxsKG4sZS5lbG0sciksSShvKSYmZnVuY3Rpb24oZSx0LG4scil7Zm9yKHZhciBpLG89ZTtvLmNvbXBvbmVudEluc3RhbmNlOylpZihvPW8uY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLEUoaT1vLmRhdGEpJiZFKGk9aS50cmFuc2l0aW9uKSl7Zm9yKGk9MDtpPGcuYWN0aXZhdGUubGVuZ3RoOysraSlnLmFjdGl2YXRlW2ldKEduLG8pO3QucHVzaChvKTticmVha31sKG4sZS5lbG0scil9KGUsdCxuLHIpLCEwfX0oZSx0LG4scikpe3ZhciBzPWUuZGF0YSxjPWUuY2hpbGRyZW4sdT1lLnRhZztFKHUpPyhlLmVsbT1lLm5zP20uY3JlYXRlRWxlbWVudE5TKGUubnMsdSk6bS5jcmVhdGVFbGVtZW50KHUsZSksZChlKSxoKGUsYyx0KSxFKHMpJiZ2KGUsdCkpOkkoZS5pc0NvbW1lbnQpP2UuZWxtPW0uY3JlYXRlQ29tbWVudChlLnRleHQpOmUuZWxtPW0uY3JlYXRlVGV4dE5vZGUoZS50ZXh0KSxsKG4sZS5lbG0scil9fWZ1bmN0aW9uIHAoZSx0KXtFKGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSYmKHQucHVzaC5hcHBseSh0LGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSxlLmRhdGEucGVuZGluZ0luc2VydD1udWxsKSxlLmVsbT1lLmNvbXBvbmVudEluc3RhbmNlLiRlbCxfKGUpPyh2KGUsdCksZChlKSk6KFduKGUpLHQucHVzaChlKSl9ZnVuY3Rpb24gbChlLHQsbil7RShlKSYmKEUobik/bS5wYXJlbnROb2RlKG4pPT09ZSYmbS5pbnNlcnRCZWZvcmUoZSx0LG4pOm0uYXBwZW5kQ2hpbGQoZSx0KSl9ZnVuY3Rpb24gaChlLHQsbil7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIHI9MDtyPHQubGVuZ3RoOysrcil5KHRbcl0sbixlLmVsbSxudWxsLCEwLHQscik7ZWxzZSBjKGUudGV4dCkmJm0uYXBwZW5kQ2hpbGQoZS5lbG0sbS5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoZS50ZXh0KSkpfWZ1bmN0aW9uIF8oZSl7Zm9yKDtlLmNvbXBvbmVudEluc3RhbmNlOyllPWUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlO3JldHVybiBFKGUudGFnKX1mdW5jdGlvbiB2KGUsdCl7Zm9yKHZhciBuPTA7bjxnLmNyZWF0ZS5sZW5ndGg7KytuKWcuY3JlYXRlW25dKEduLGUpO0Uocj1lLmRhdGEuaG9vaykmJihFKHIuY3JlYXRlKSYmci5jcmVhdGUoR24sZSksRShyLmluc2VydCkmJnQucHVzaChlKSl9ZnVuY3Rpb24gZChlKXt2YXIgdDtpZihFKHQ9ZS5mblNjb3BlSWQpKW0uc2V0U3R5bGVTY29wZShlLmVsbSx0KTtlbHNlIGZvcih2YXIgbj1lO247KUUodD1uLmNvbnRleHQpJiZFKHQ9dC4kb3B0aW9ucy5fc2NvcGVJZCkmJm0uc2V0U3R5bGVTY29wZShlLmVsbSx0KSxuPW4ucGFyZW50O0UodD1CdCkmJnQhPT1lLmNvbnRleHQmJnQhPT1lLmZuQ29udGV4dCYmRSh0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZtLnNldFN0eWxlU2NvcGUoZS5lbG0sdCl9ZnVuY3Rpb24gYihlLHQsbixyLGksbyl7Zm9yKDtyPD1pOysrcil5KG5bcl0sbyxlLHQsITEsbixyKX1mdW5jdGlvbiB3KGUpe3ZhciB0LG4scj1lLmRhdGE7aWYoRShyKSlmb3IoRSh0PXIuaG9vaykmJkUodD10LmRlc3Ryb3kpJiZ0KGUpLHQ9MDt0PGcuZGVzdHJveS5sZW5ndGg7Kyt0KWcuZGVzdHJveVt0XShlKTtpZihFKHQ9ZS5jaGlsZHJlbikpZm9yKG49MDtuPGUuY2hpbGRyZW4ubGVuZ3RoOysrbil3KGUuY2hpbGRyZW5bbl0pfWZ1bmN0aW9uIGsoZSx0LG4pe2Zvcig7dDw9bjsrK3Qpe3ZhciByPWVbdF07RShyKSYmKEUoci50YWcpPyhhKHIpLHcocikpOm8oci5lbG0pKX19ZnVuY3Rpb24gYShlLHQpe2lmKEUodCl8fEUoZS5kYXRhKSl7dmFyIG4scixpPWcucmVtb3ZlLmxlbmd0aCsxO2lmKEUodCk/dC5saXN0ZW5lcnMrPWk6dD1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXswPT0tLW4ubGlzdGVuZXJzJiZvKGUpfXJldHVybiBuLmxpc3RlbmVycz10LG59KGUuZWxtLGkpLEUobj1lLmNvbXBvbmVudEluc3RhbmNlKSYmRShuPW4uX3Zub2RlKSYmRShuLmRhdGEpKWEobix0KTtlbHNlIGlmKEUocj1lLmNoaWxkcmVuKSlmb3Iobj0wO248ci5sZW5ndGg7bisrKXJbbl0udGFnJiZhKHJbbl0pO2ZvcihuPTA7bjxnLnJlbW92ZS5sZW5ndGg7KytuKWcucmVtb3ZlW25dKGUsdCk7RShuPWUuZGF0YS5ob29rKSYmRShuPW4ucmVtb3ZlKT9uKGUsdCk6dCgpfWVsc2UgbyhlLmVsbSl9ZnVuY3Rpb24gUyhlLHQsbixyKXtmb3IodmFyIGk9bjtpPHI7aSsrKXt2YXIgbz10W2ldO2lmKEUobykmJlhuKGUsbykpcmV0dXJuIGl9fWZ1bmN0aW9uIHgoZSx0LG4scixpLG8pe2lmKGUhPT10KXtFKHQuZWxtKSYmRShyKSYmKHQ9cltpXT1kZSh0KSk7dmFyIGE9dC5lbG09ZS5lbG07aWYoSShlLmlzQXN5bmNQbGFjZWhvbGRlcikpRSh0LmFzeW5jRmFjdG9yeS5yZXNvbHZlZCk/TyhlLmVsbSx0LG4pOnQuaXNBc3luY1BsYWNlaG9sZGVyPSEwO2Vsc2UgaWYoSSh0LmlzU3RhdGljKSYmSShlLmlzU3RhdGljKSYmdC5rZXk9PT1lLmtleSYmKEkodC5pc0Nsb25lZCl8fEkodC5pc09uY2UpKSl0LmNvbXBvbmVudEluc3RhbmNlPWUuY29tcG9uZW50SW5zdGFuY2U7ZWxzZXt2YXIgcyxjPXQuZGF0YTtFKGMpJiZFKHM9Yy5ob29rKSYmRShzPXMucHJlcGF0Y2gpJiZzKGUsdCk7dmFyIHU9ZS5jaGlsZHJlbixsPXQuY2hpbGRyZW47aWYoRShjKSYmXyh0KSl7Zm9yKHM9MDtzPGcudXBkYXRlLmxlbmd0aDsrK3MpZy51cGRhdGVbc10oZSx0KTtFKHM9Yy5ob29rKSYmRShzPXMudXBkYXRlKSYmcyhlLHQpfUEodC50ZXh0KT9FKHUpJiZFKGwpP3UhPT1sJiZmdW5jdGlvbihlLHQsbixyLGkpe2Zvcih2YXIgbyxhLHMsYz0wLHU9MCxsPXQubGVuZ3RoLTEsZD10WzBdLGY9dFtsXSxwPW4ubGVuZ3RoLTEsaD1uWzBdLHY9bltwXSxnPSFpO2M8PWwmJnU8PXA7KUEoZCk/ZD10WysrY106QShmKT9mPXRbLS1sXTpYbihkLGgpPyh4KGQsaCxyLG4sdSksZD10WysrY10saD1uWysrdV0pOlhuKGYsdik/KHgoZix2LHIsbixwKSxmPXRbLS1sXSx2PW5bLS1wXSk6WG4oZCx2KT8oeChkLHYscixuLHApLGcmJm0uaW5zZXJ0QmVmb3JlKGUsZC5lbG0sbS5uZXh0U2libGluZyhmLmVsbSkpLGQ9dFsrK2NdLHY9blstLXBdKTooWG4oZixoKT8oeChmLGgscixuLHUpLGcmJm0uaW5zZXJ0QmVmb3JlKGUsZi5lbG0sZC5lbG0pLGY9dFstLWxdKTooQShvKSYmKG89WW4odCxjLGwpKSxBKGE9RShoLmtleSk/b1toLmtleV06UyhoLHQsYyxsKSk/eShoLHIsZSxkLmVsbSwhMSxuLHUpOlhuKHM9dFthXSxoKT8oeChzLGgscixuLHUpLHRbYV09dm9pZCAwLGcmJm0uaW5zZXJ0QmVmb3JlKGUscy5lbG0sZC5lbG0pKTp5KGgscixlLGQuZWxtLCExLG4sdSkpLGg9blsrK3VdKTtsPGM/YihlLEEobltwKzFdKT9udWxsOm5bcCsxXS5lbG0sbix1LHAscik6cDx1JiZrKHQsYyxsKX0oYSx1LGwsbixvKTpFKGwpPyhFKGUudGV4dCkmJm0uc2V0VGV4dENvbnRlbnQoYSwiIiksYihhLG51bGwsbCwwLGwubGVuZ3RoLTEsbikpOkUodSk/ayh1LDAsdS5sZW5ndGgtMSk6RShlLnRleHQpJiZtLnNldFRleHRDb250ZW50KGEsIiIpOmUudGV4dCE9PXQudGV4dCYmbS5zZXRUZXh0Q29udGVudChhLHQudGV4dCksRShjKSYmRShzPWMuaG9vaykmJkUocz1zLnBvc3RwYXRjaCkmJnMoZSx0KX19fWZ1bmN0aW9uIEMoZSx0LG4pe2lmKEkobikmJkUoZS5wYXJlbnQpKWUucGFyZW50LmRhdGEucGVuZGluZ0luc2VydD10O2Vsc2UgZm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpdFtyXS5kYXRhLmhvb2suaW5zZXJ0KHRbcl0pfXZhciBUPXMoImF0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleSIpO2Z1bmN0aW9uIE8oZSx0LG4scil7dmFyIGksbz10LnRhZyxhPXQuZGF0YSxzPXQuY2hpbGRyZW47aWYocj1yfHxhJiZhLnByZSx0LmVsbT1lLEkodC5pc0NvbW1lbnQpJiZFKHQuYXN5bmNGYWN0b3J5KSlyZXR1cm4gdC5pc0FzeW5jUGxhY2Vob2xkZXI9ITA7aWYoRShhKSYmKEUoaT1hLmhvb2spJiZFKGk9aS5pbml0KSYmaSh0LCEwKSxFKGk9dC5jb21wb25lbnRJbnN0YW5jZSkpKXJldHVybiBwKHQsbiksITA7aWYoRShvKSl7aWYoRShzKSlpZihlLmhhc0NoaWxkTm9kZXMoKSlpZihFKGk9YSkmJkUoaT1pLmRvbVByb3BzKSYmRShpPWkuaW5uZXJIVE1MKSl7aWYoaSE9PWUuaW5uZXJIVE1MKXJldHVybiExfWVsc2V7Zm9yKHZhciBjPSEwLHU9ZS5maXJzdENoaWxkLGw9MDtsPHMubGVuZ3RoO2wrKyl7aWYoIXV8fCFPKHUsc1tsXSxuLHIpKXtjPSExO2JyZWFrfXU9dS5uZXh0U2libGluZ31pZighY3x8dSlyZXR1cm4hMX1lbHNlIGgodCxzLG4pO2lmKEUoYSkpe3ZhciBkPSExO2Zvcih2YXIgZiBpbiBhKWlmKCFUKGYpKXtkPSEwLHYodCxuKTticmVha30hZCYmYS5jbGFzcyYmcWUoYS5jbGFzcyl9fWVsc2UgZS5kYXRhIT09dC50ZXh0JiYoZS5kYXRhPXQudGV4dCk7cmV0dXJuITB9cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFBKHQpKXt2YXIgaSxvPSExLGE9W107aWYoQShlKSlvPSEwLHkodCxhKTtlbHNle3ZhciBzPUUoZS5ub2RlVHlwZSk7aWYoIXMmJlhuKGUsdCkpeChlLHQsYSxudWxsLG51bGwscik7ZWxzZXtpZihzKXtpZigxPT09ZS5ub2RlVHlwZSYmZS5oYXNBdHRyaWJ1dGUoTCkmJihlLnJlbW92ZUF0dHJpYnV0ZShMKSxuPSEwKSxJKG4pJiZPKGUsdCxhKSlyZXR1cm4gQyh0LGEsITApLGU7aT1lLGU9bmV3IHNlKG0udGFnTmFtZShpKS50b0xvd2VyQ2FzZSgpLHt9LFtdLHZvaWQgMCxpKX12YXIgYz1lLmVsbSx1PW0ucGFyZW50Tm9kZShjKTtpZih5KHQsYSxjLl9sZWF2ZUNiP251bGw6dSxtLm5leHRTaWJsaW5nKGMpKSxFKHQucGFyZW50KSlmb3IodmFyIGw9dC5wYXJlbnQsZD1fKHQpO2w7KXtmb3IodmFyIGY9MDtmPGcuZGVzdHJveS5sZW5ndGg7KytmKWcuZGVzdHJveVtmXShsKTtpZihsLmVsbT10LmVsbSxkKXtmb3IodmFyIHA9MDtwPGcuY3JlYXRlLmxlbmd0aDsrK3ApZy5jcmVhdGVbcF0oR24sbCk7dmFyIGg9bC5kYXRhLmhvb2suaW5zZXJ0O2lmKGgubWVyZ2VkKWZvcih2YXIgdj0xO3Y8aC5mbnMubGVuZ3RoO3YrKyloLmZuc1t2XSgpfWVsc2UgV24obCk7bD1sLnBhcmVudH1FKHUpP2soW2VdLDAsMCk6RShlLnRhZykmJncoZSl9fXJldHVybiBDKHQsYSxvKSx0LmVsbX1FKGUpJiZ3KGUpfX0oe25vZGVPcHM6Vm4sbW9kdWxlczpbe2NyZWF0ZTpucix1cGRhdGU6bnJ9LHtjcmVhdGU6cnIsdXBkYXRlOnJyfSx7Y3JlYXRlOmxyLHVwZGF0ZTpscn1dLmNvbmNhdChbcW4sS25dKX0pLGZyPXttb2RlbDp7fSxzaG93Ont9fTtmdW5jdGlvbiBwcihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbihlKXtmb3IodmFyIHQsbj0iIixyPTAsaT1lLmxlbmd0aDtyPGk7cisrKUUodD1wcihlW3JdKSkmJiIiIT09dCYmKG4mJihuKz0iICIpLG4rPXQpO3JldHVybiBufShlKTp5KGUpP2Z1bmN0aW9uKGUpe3ZhciB0PSIiO2Zvcih2YXIgbiBpbiBlKWVbbl0mJih0JiYodCs9IiAiKSx0Kz1uKTtyZXR1cm4gdH0oZSk6InN0cmluZyI9PXR5cGVvZiBlP2U6IiJ9dmFyIGhyPWYoZnVuY3Rpb24oZSl7dmFyIG49e30scj0vOiguKykvO3JldHVybiBlLnNwbGl0KC87KD8hW14oXSpcKSkvZykuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlKXt2YXIgdD1lLnNwbGl0KHIpOzE8dC5sZW5ndGgmJihuW3RbMF0udHJpbSgpXT10WzFdLnRyaW0oKSl9fSksbn0pO2Z1bmN0aW9uIHZyKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP0MoZSk6InN0cmluZyI9PXR5cGVvZiBlP2hyKGUpOmV9ZnVuY3Rpb24gZ3IoZSx0KXtvZSgpO3ZhciBuLHI9dGhpcy4kb3B0aW9uc1tlXSxpPWUrIiBob29rIjtpZihyKWZvcih2YXIgbz0wLGE9ci5sZW5ndGg7bzxhO28rKyluPUxlKHJbb10sdGhpcyx0P1t0XTpudWxsLHRoaXMsaSk7cmV0dXJuIHRoaXMuX2hhc0hvb2tFdmVudCYmdGhpcy4kZW1pdCgiaG9vazoiK2UsdCksYWUoKSxufXZhciBtcj17aW5zdGFsbDpmdW5jdGlvbihlKXtlLnByb3RvdHlwZS5fJHF1ZXVlPVV0LGUucHJvdG90eXBlLl9fY2FsbF9ob29rPWdyLGUucHJvdG90eXBlLl8kc3RyaW5naWZ5Q2xhc3M9cHIsZS5wcm90b3R5cGUuXyRub3JtYWxpemVTdHlsZUJpbmRpbmc9dnJ9fTtnbi5jb25maWcubXVzdFVzZVByb3A9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ24uY29uZmlnLmlzUmVzZXJ2ZWRUYWc9em4sZ24uY29uZmlnLmlzUmVzZXJ2ZWRBdHRyPVVuLGduLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2U9ZnVuY3Rpb24oKXt9LGduLmNvbmZpZy5pc1Vua25vd25FbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuITF9LHgoZ24ub3B0aW9ucy5kaXJlY3RpdmVzLGZyKSx4KGduLm9wdGlvbnMuY29tcG9uZW50cyx7fSksZ24ucHJvdG90eXBlLl9fcGF0Y2hfXz1kcixnbi5wcm90b3R5cGUuJG1vdW50PWZ1bmN0aW9uKGUsdCl7aWYoInBhZ2UiPT09dGhpcy4kb3B0aW9ucy5tcFR5cGUpe3ZhciBuPW5ldyBGbih0aGlzLiRvcHRpb25zLnBhZ2VJZCx0aGlzLiRvcHRpb25zLnBhZ2VQYXRoKTsoZT1uLmNyZWF0ZUNvbW1lbnQoInJvb3QiKSkuaGFzQXR0cmlidXRlPWUucmVtb3ZlQXR0cmlidXRlPWZ1bmN0aW9uKCl7fSxuLmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChlKX1yZXR1cm4gaT1lLG89dCwocj10aGlzKS4kZWw9aSxyLiRvcHRpb25zLnJlbmRlcnx8KHIuJG9wdGlvbnMucmVuZGVyPXVlKSxGdChyLCJiZWZvcmVNb3VudCIpLG5ldyBLdChyLGZ1bmN0aW9uKCl7ci5fdXBkYXRlKHIuX3JlbmRlcigpLG8pfSxULHtiZWZvcmU6ZnVuY3Rpb24oKXtyLl9pc01vdW50ZWQmJiFyLl9pc0Rlc3Ryb3llZCYmRnQociwiYmVmb3JlVXBkYXRlIil9fSwhMCksbz0hMSxudWxsPT1yLiR2bm9kZSYmKHIuX2lzTW91bnRlZD0hMCxyLl8kdmQ/KEZ0KHIsIm9uU2VydmljZUNyZWF0ZWQiKSxGdChyLCJvblNlcnZpY2VBdHRhY2hlZCIpLHIuXyR2ZC5hZGRNb3VudGVkVm0ocikpOkZ0KHIsIm1vdW50ZWQiKSkscjt2YXIgcixpLG99LGduLnVzZShtciksZS5WdWU9Z259dmFyIGlzRmlyc3Q9ITAsZnJhbWV3b3JrcyxydW50aW1lQ29uZmlnO2Z1bmN0aW9uIGluaXQkMihlKXtpZihlLl9fdW5pQ29uZmlnKXt2YXIgdD1lLndlZXg7aXNGaXJzdCYmKGdsb2JhbC5XWEVudmlyb25tZW50LmRldmljZVdpZHRoPXQuY29uZmlnLmVudi5kZXZpY2VXaWR0aCk7dmFyIG49ZS5fX3VuaUNvbmZpZyxyPSJ3ZWV4Ij09PW4ubnZ1ZUNvbXBpbGVyO3QuZG9jdW1lbnQuX18kYXV0b21hdG9yX189ISFuLmF1dG9tYXRvcix0LmRvY3VtZW50Ll9fJGNvbXBpbGVyX189cj8id2VleCI6InVuaS1hcHAiLHQuZG9jdW1lbnQuX18kc3R5bGVDb21waWxlcl9fPSJ3ZWV4Ij09PW4ubnZ1ZVN0eWxlQ29tcGlsZXI/IndlZXgiOiJ1bmktYXBwIixnbG9iYWwuV1hFbnZpcm9ubWVudC5keW5hbWljUnB4PSEoIW4ud2luZG93fHwhbi53aW5kb3cuZHluYW1pY1JweCk7dmFyIGk9Im5hdGl2ZSIhPT1uLnJlbmRlcmVyJiYtMSE9PXQuY29uZmlnLmJ1bmRsZVVybC5pbmRleE9mKCJhcHAtc2VydmljZS5qcyIpO2lmKGkpe3ZhciBvPXt9O3Z1ZUZhY3RvcnkobyxlLlNoYXJlZE9iamVjdCksZS5WdWU9by5WdWV9aWYoT2JqZWN0LmFzc2lnbihlLGNyZWF0ZUluc3RhbmNlQ29udGV4dCQxKGUpKSxpJiZlLlZ1ZS51c2UoZS5fX3Z1ZVBsdWdpbiksZGVsZXRlIGUuX192dWVQbHVnaW4sIXIpe3ZhciBhPWUucGx1cztpZigiaW9zIj09PWdsb2JhbC5XWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCkpe3ZhciBzPWEuc2NyZWVuO2dsb2JhbC5XWEVudmlyb25tZW50LmRldmljZVdpZHRoPXMud2lkdGgsZ2xvYmFsLldYRW52aXJvbm1lbnQuZGV2aWNlSGVpZ2h0PXMuaGVpZ2h0fXZhciBjPWdsb2JhbC5XWEVudmlyb25tZW50LHU9Yy5zY2FsZSxsPWMuZGV2aWNlV2lkdGgsZD1jLnBsYXRmb3JtLGY9TWF0aC5jZWlsKGwvdSkscD10LnJlcXVpcmVNb2R1bGUoIm1ldGEiKTtpZigiMSI9PT10LmNvbmZpZy5wbHVzX3dlYl9pZCl7dmFyIGg9dC5yZXF1aXJlTW9kdWxlKCJwbHVzIik7aC5zZXREZWZhdWx0Rm9udFNpemUmJmguc2V0RGVmYXVsdEZvbnRTaXplKDE2KX0iaW9zIj09PWQudG9Mb3dlckNhc2UoKSYmcC5zZXRWaWV3cG9ydCh7d2lkdGg6Zixyb3VuZE9mZkRldmlhdGlvbjohMX0pfWl8fGUuVnVlLnVzZSh1bmlBcHAsZSl9fWZ1bmN0aW9uIGdldEpTRk1WZXJzaW9uKCl7cmV0dXJuIjAuMjkuNiJ9ZnVuY3Rpb24gY3JlYXRlU2VydmljZXMoaSxvLGEpe3ZhciBzPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIHMuc2VydmljZT1PYmplY3QuY3JlYXRlKG51bGwpLHNlcnZpY2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5uYW1lLG49ZS5vcHRpb25zLmNyZWF0ZTtpZihuKXRyeXt2YXIgcj1uKGksbyxhKTtPYmplY3QuYXNzaWduKHMuc2VydmljZSxyKSxPYmplY3QuYXNzaWduKHMsci5pbnN0YW5jZSl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcigiW0pTIFJ1bnRpbWVdIEZhaWxlZCB0byBjcmVhdGUgc2VydmljZSAiK3QrIi4iKX19KSxkZWxldGUgcy5zZXJ2aWNlLmluc3RhbmNlLE9iamVjdC5mcmVlemUocy5zZXJ2aWNlKSxzfXZhciBpbnN0YW5jZVR5cGVNYXA9e307ZnVuY3Rpb24gZ2V0RnJhbWV3b3JrVHlwZShlKXtyZXR1cm4gaW5zdGFuY2VUeXBlTWFwW2VdfXZhciBTaGFyZWRPYmplY3Q9e3VpZDowfTtmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZUNvbnRleHQoZSx0LG4pe3ZvaWQgMD09PXQmJih0PXt9KTt2YXIgcj1uZXcgV2VleEluc3RhbmNlKGUsdCxuKTtpbnN0YW5jZVR5cGVNYXBbZV09IlZ1ZSI7dmFyIGk9cnVudGltZUNvbmZpZy5mcmFtZXdvcmtzLlZ1ZTtpZighaSlyZXR1cm4gbmV3IEVycm9yKCdbSlMgRnJhbWV3b3JrXSBJbnZhbGlkIGJ1bmRsZSB0eXBlICJWdWUiLicpO3ZhciBvPWNyZWF0ZVNlcnZpY2VzKGUse3dlZXg6cixjb25maWc6dCxjcmVhdGVkOkRhdGUubm93KCksZnJhbWV3b3JrOiJWdWUiLGJ1bmRsZVR5cGU6IlZ1ZSJ9LHJ1bnRpbWVDb25maWcpO09iamVjdC5mcmVlemUobyk7dmFyIGE9T2JqZWN0LmNyZWF0ZShudWxsKTtPYmplY3QuYXNzaWduKGEsbyx7U2hhcmVkT2JqZWN0OlNoYXJlZE9iamVjdCx3ZWV4OnIsZ2V0SlNGTVZlcnNpb246Z2V0SlNGTVZlcnNpb24scmVxdWlyZU1vZHVsZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtyZXR1cm4gci5yZXF1aXJlTW9kdWxlLmFwcGx5KHIsZSl9LF9fV0VFWF9DQUxMX0pBVkFTQ1JJUFRfXzpyZWNlaXZlVGFza3Msc2VydmljZXM6b30pLE9iamVjdC5mcmVlemUoYSk7dmFyIHM9T2JqZWN0LmFzc2lnbih7fSxhKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgaS5jcmVhdGVJbnN0YW5jZUNvbnRleHQmJk9iamVjdC5hc3NpZ24ocyxpLmNyZWF0ZUluc3RhbmNlQ29udGV4dChlLGEsbikpLGluaXQkMihzKSxPYmplY3QuZnJlZXplKHMpLHN9ZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UoZSx0LG4scil7aWYoaW5zdGFuY2VUeXBlTWFwW2VdKXJldHVybiBuZXcgRXJyb3IoJ1RoZSBpbnN0YW5jZSBpZCAiJytlKyciIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCEnKTt2YXIgaT0iVnVlIjtpbnN0YW5jZVR5cGVNYXBbZV09aSwobj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG58fHt9KSkpLmVudj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdsb2JhbC5XWEVudmlyb25tZW50fHx7fSkpLG4uYnVuZGxlVHlwZT1pO3ZhciBvPXJ1bnRpbWVDb25maWcuZnJhbWV3b3Jrcy5WdWU7aWYoIW8pcmV0dXJuIG5ldyBFcnJvcignW0pTIEZyYW1ld29ya10gSW52YWxpZCBidW5kbGUgdHlwZSAiVnVlIi4nKTt2YXIgYT1jcmVhdGVJbnN0YW5jZUNvbnRleHQoZSxuLHIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBvLmNyZWF0ZUluc3RhbmNlKXJldHVybiBvLmNyZWF0ZUluc3RhbmNlKGUsdCxuLHIsYSk7cnVuSW5Db250ZXh0KHQsYSl9ZnVuY3Rpb24gcnVuSW5Db250ZXh0KGUsdCl7dmFyIG49W10scj1bXTtmb3IodmFyIGkgaW4gdCluLnB1c2goaSksci5wdXNoKHRbaV0pO3ZhciBvPSJcbiAgICAoZnVuY3Rpb24gKGdsb2JhbCkge1xuICAgICAgIitlKyJcbiAgICB9KShPYmplY3QuY3JlYXRlKHRoaXMpKVxuICAiO3JldHVybihuZXcoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoRnVuY3Rpb24sW251bGxdLmNvbmNhdChuLFtvXSkpKSkuYXBwbHkodm9pZCAwLHIpfWZ1bmN0aW9uIGdldFJvb3QoZSl7dmFyIHQ9Z2V0RG9jKGUpO3RyeXtpZih0JiZ0LmJvZHkpcmV0dXJuIHQuYm9keS50b0pTT04oKX1jYXRjaChlKXtyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gZ2V0IHRoZSB2aXJ0dWFsIGRvbSB0cmVlLiIpfX12YXIgbWV0aG9kcz17Y3JlYXRlSW5zdGFuY2U6Y3JlYXRlSW5zdGFuY2UsY3JlYXRlSW5zdGFuY2VDb250ZXh0OmNyZWF0ZUluc3RhbmNlQ29udGV4dCxnZXRSb290OmdldFJvb3QsZ2V0SlNGTVZlcnNpb246Z2V0SlNGTVZlcnNpb24sZ2V0RG9jdW1lbnQ6Z2V0RG9jLHJlZ2lzdGVyU2VydmljZTpyZWdpc3Rlcix1bnJlZ2lzdGVyU2VydmljZTp1bnJlZ2lzdGVyLGNhbGxKUzpmdW5jdGlvbihlLHQpe3ZhciBuPWZyYW1ld29ya3NbZ2V0RnJhbWV3b3JrVHlwZShlKV07cmV0dXJuIG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBuLnJlY2VpdmVUYXNrcz9uLnJlY2VpdmVUYXNrcyhlLHQpOnJlY2VpdmVUYXNrcyhlLHQpfX07ZnVuY3Rpb24gZ2VuSW5zdGFuY2Uocyl7bWV0aG9kc1tzXT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbixyPWVbMF0saT1nZXRGcmFtZXdvcmtUeXBlKHIpO2lmKGkmJmZyYW1ld29ya3NbaV0pe3ZhciBvPShuPWZyYW1ld29ya3NbaV0pW3NdLmFwcGx5KG4sZSksYT17ZnJhbWV3b3JrOml9O3JldHVybiJyZWZyZXNoSW5zdGFuY2UiPT09cz9zZXJ2aWNlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUub3B0aW9ucy5yZWZyZXNoO3QmJnQocix7aW5mbzphLHJ1bnRpbWU6cnVudGltZUNvbmZpZ30pfSk6ImRlc3Ryb3lJbnN0YW5jZSI9PT1zJiYoc2VydmljZXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMuZGVzdHJveTt0JiZ0KHIse2luZm86YSxydW50aW1lOnJ1bnRpbWVDb25maWd9KX0pLGRlbGV0ZSBpbnN0YW5jZVR5cGVNYXBbcl0pLG99fX1mdW5jdGlvbiBhZGFwdE1ldGhvZChpLG8pe21ldGhvZHNbaV09ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Zm9yKHZhciBuIGluImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8uYXBwbHkodm9pZCAwLGUpLHJ1bnRpbWVDb25maWcuZnJhbWV3b3Jrcyl7dmFyIHI9cnVudGltZUNvbmZpZy5mcmFtZXdvcmtzW25dO3ImJnJbaV0mJnJbaV0uYXBwbHkocixlKX19fWZ1bmN0aW9uIGluaXQkJDEoZSl7Zm9yKHZhciB0IGluIGZyYW1ld29ya3M9KHJ1bnRpbWVDb25maWc9ZXx8e30pLmZyYW1ld29ya3N8fHt9LGluaXQkMSgpLGZyYW1ld29ya3Mpe3ZhciBuPWZyYW1ld29ya3NbdF07aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4uaW5pdCl0cnl7bi5pbml0KGUpfWNhdGNoKGUpe319cmV0dXJuIGFkYXB0TWV0aG9kKCJyZWdpc3RlckNvbXBvbmVudHMiLHJlZ2lzdGVyQ29tcG9uZW50cyksYWRhcHRNZXRob2QoInJlZ2lzdGVyTW9kdWxlcyIscmVnaXN0ZXJNb2R1bGVzKSxhZGFwdE1ldGhvZCgicmVnaXN0ZXJNZXRob2RzIiksWyJkZXN0cm95SW5zdGFuY2UiLCJyZWZyZXNoSW5zdGFuY2UiXS5mb3JFYWNoKGdlbkluc3RhbmNlKSxtZXRob2RzfXZhciBjb25maWc9e0RvY3VtZW50OkRvY3VtZW50LEVsZW1lbnQ6RWxlbWVudCxDb21tZW50OkNvbW1lbnQsTGlzdGVuZXI6TGlzdGVuZXIsVGFza0NlbnRlcjpUYXNrQ2VudGVyLHNlbmRUYXNrczpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgY2FsbE5hdGl2ZT9jYWxsTmF0aXZlLmFwcGx5KHZvaWQgMCxlKTooZ2xvYmFsLmNhbGxOYXRpdmV8fGZ1bmN0aW9uKCl7fSkuYXBwbHkodm9pZCAwLGUpfX07ZnVuY3Rpb24gZnJlZXplUHJvdG90eXBlKCl7T2JqZWN0LmZyZWV6ZShjb25maWcuQ29tbWVudCksT2JqZWN0LmZyZWV6ZShjb25maWcuTGlzdGVuZXIpLE9iamVjdC5mcmVlemUoY29uZmlnLkRvY3VtZW50LnByb3RvdHlwZSksT2JqZWN0LmZyZWV6ZShjb25maWcuQ29tbWVudC5wcm90b3R5cGUpLE9iamVjdC5mcmVlemUoY29uZmlnLkxpc3RlbmVyLnByb3RvdHlwZSl9RG9jdW1lbnQuaGFuZGxlcj1jb25maWcuc2VuZFRhc2tzO3ZhciBydW50aW1lPXtzZXJ2aWNlOntyZWdpc3RlcjpyZWdpc3Rlcix1bnJlZ2lzdGVyOnVucmVnaXN0ZXIsaGFzOmhhc30sZnJlZXplUHJvdG90eXBlOmZyZWV6ZVByb3RvdHlwZSxpbml0OmluaXQkJDEsY29uZmlnOmNvbmZpZ307ZnVuY3Rpb24gTWVzc2FnZUV2ZW50KGUsdCl7dm9pZCAwPT09dCYmKHQ9e30pLHRoaXMudHlwZT1lfHwibWVzc2FnZSIsdGhpcy5kYXRhPXQuZGF0YXx8bnVsbCx0aGlzLm9yaWdpbj10Lm9yaWdpbnx8IiIsdGhpcy5zb3VyY2U9dC5zb3VyY2V8fG51bGwsdGhpcy5wb3J0cz10LnBvcnRzfHxbXSx0aGlzLnRhcmdldD1udWxsLHRoaXMudGltZVN0YW1wPURhdGUubm93KCl9dmFyIGNoYW5uZWxzPXt9LGluc3RhbmNlcz17fTtmdW5jdGlvbiBCcm9hZGNhc3RDaGFubmVsJDEoKXt9QnJvYWRjYXN0Q2hhbm5lbCQxLnByb3RvdHlwZS5wb3N0TWVzc2FnZT1mdW5jdGlvbihlKXtpZih0aGlzLl9jbG9zZWQpdGhyb3cgbmV3IEVycm9yKCdCcm9hZGNhc3RDaGFubmVsICInK3RoaXMubmFtZSsnIiBpcyBjbG9zZWQuJyk7dmFyIHQ9Y2hhbm5lbHNbdGhpcy5uYW1lXTtpZih0JiZ0Lmxlbmd0aClmb3IodmFyIG49MDtuPHQubGVuZ3RoOysrbil7dmFyIHI9dFtuXTtyLl9jbG9zZWR8fHI9PT10aGlzfHwiZnVuY3Rpb24iPT10eXBlb2Ygci5vbm1lc3NhZ2UmJnIub25tZXNzYWdlKG5ldyBNZXNzYWdlRXZlbnQoIm1lc3NhZ2UiLHtkYXRhOmV9KSl9fSxCcm9hZGNhc3RDaGFubmVsJDEucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZighdGhpcy5fY2xvc2VkJiYodGhpcy5fY2xvc2VkPSEwLGNoYW5uZWxzW3RoaXMubmFtZV0pKXt2YXIgZT1jaGFubmVsc1t0aGlzLm5hbWVdLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZSE9PXR9KTtlLmxlbmd0aD9jaGFubmVsc1t0aGlzLm5hbWVdPWU6ZGVsZXRlIGNoYW5uZWxzW3RoaXMubmFtZV19fTt2YXIgQnJvYWRjYXN0Q2hhbm5lbCQyPXtjcmVhdGU6ZnVuY3Rpb24odCxlLG4pe2lmKGluc3RhbmNlc1t0XT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZ2xvYmFsLkJyb2FkY2FzdENoYW5uZWwpcmV0dXJue307dmFyIHI9e0Jyb2FkY2FzdENoYW5uZWw6ZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm5hbWUiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMSx2YWx1ZTpTdHJpbmcoZSl9KSx0aGlzLl9jbG9zZWQ9ITEsdGhpcy5vbm1lc3NhZ2U9bnVsbCxjaGFubmVsc1t0aGlzLm5hbWVdfHwoY2hhbm5lbHNbdGhpcy5uYW1lXT1bXSksY2hhbm5lbHNbdGhpcy5uYW1lXS5wdXNoKHRoaXMpLGluc3RhbmNlc1t0XS5wdXNoKHRoaXMpfX07cmV0dXJuIHIuQnJvYWRjYXN0Q2hhbm5lbC5wcm90b3R5cGU9QnJvYWRjYXN0Q2hhbm5lbCQxLnByb3RvdHlwZSx7aW5zdGFuY2U6cn19LGRlc3Ryb3k6ZnVuY3Rpb24oZSx0KXtpbnN0YW5jZXNbZV0uZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZS5jbG9zZSgpfSksZGVsZXRlIGluc3RhbmNlc1tlXX19LHNlcnZpY2VzJDE9e0Jyb2FkY2FzdENoYW5uZWw6QnJvYWRjYXN0Q2hhbm5lbCQyfSxXWmIsWFpiLFpaYiwkWmI7ZnVuY3Rpb24gc2V0dXAoZSl7dmFyIHQ9cnVudGltZS5pbml0LG49cnVudGltZS5jb25maWc7bi5mcmFtZXdvcmtzPWU7dmFyIHI9c3VidmVyc2lvbi5uYXRpdmUsaT1zdWJ2ZXJzaW9uLnRyYW5zZm9ybWVyO2Zvcih2YXIgbyBpbiBzZXJ2aWNlcyQxKXJ1bnRpbWUuc2VydmljZS5yZWdpc3RlcihvLHNlcnZpY2VzJDFbb10pO3J1bnRpbWUuZnJlZXplUHJvdG90eXBlKCksZ2xvYmFsLmZyYW1ld29ya1ZlcnNpb249cixnbG9iYWwudHJhbnNmb3JtZXJWZXJzaW9uPWk7dmFyIGE9dChuKSxzPWZ1bmN0aW9uKHIpe2dsb2JhbFtyXT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj1hW3JdLmFwcGx5KGEsZSk7cmV0dXJuIG4gaW5zdGFuY2VvZiBFcnJvciYmY29uc29sZS5lcnJvcihuLnRvU3RyaW5nKCkpLG59fTtmb3IodmFyIGMgaW4gYSlzKGMpfWZ1bmN0aW9uIHVud3JhcEV4cG9ydHMoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRlZmF1bHQiKT9lLmRlZmF1bHQ6ZX1mdW5jdGlvbiBjcmVhdGVDb21tb25qc01vZHVsZShlLHQpe3JldHVybiBlKHQ9e2V4cG9ydHM6e319LHQuZXhwb3J0cyksdC5leHBvcnRzfUFycmF5LmZyb218fChBcnJheS5mcm9tPShXWmI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxYWmI9ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV8fCJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1XWmIuY2FsbChlKX0sWlpiPU1hdGgucG93KDIsNTMpLTEsJFpiPWZ1bmN0aW9uKGUpe3ZhciB0LG49KHQ9TnVtYmVyKGUpLGlzTmFOKHQpPzA6MCE9PXQmJmlzRmluaXRlKHQpPygwPHQ/MTotMSkqTWF0aC5mbG9vcihNYXRoLmFicyh0KSk6dCk7cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG4sMCksWlpiKX0sZnVuY3Rpb24oZSl7dmFyIHQ9T2JqZWN0KGUpO2lmKG51bGw9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkuZnJvbSByZXF1aXJlcyBhbiBhcnJheS1saWtlIG9iamVjdCAtIG5vdCBudWxsIG9yIHVuZGVmaW5lZCIpO3ZhciBuLHI9MTxhcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50c1sxXTp2b2lkIDA7aWYodm9pZCAwIT09cil7aWYoIVhaYihyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheS5mcm9tOiB3aGVuIHByb3ZpZGVkLCB0aGUgc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbiIpOzI8YXJndW1lbnRzLmxlbmd0aCYmKG49YXJndW1lbnRzWzJdKX1mb3IodmFyIGksbz0kWmIodC5sZW5ndGgpLGE9WFpiKHRoaXMpP09iamVjdChuZXcgdGhpcyhvKSk6bmV3IEFycmF5KG8pLHM9MDtzPG87KWk9dFtzXSxhW3NdPXI/dm9pZCAwPT09bj9yKGkscyk6ci5jYWxsKG4saSxzKTppLHMrPTE7cmV0dXJuIGEubGVuZ3RoPW8sYX0pKTt2YXIgX2dsb2JhbD1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXt2YXIgdD1lLmV4cG9ydHM9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5NYXRoPT1NYXRoP3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJnNlbGYuTWF0aD09TWF0aD9zZWxmOkZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCk7Im51bWJlciI9PXR5cGVvZiBfX2cmJihfX2c9dCl9KSxfY29yZT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXt2YXIgdD1lLmV4cG9ydHM9e3ZlcnNpb246IjIuNS43In07Im51bWJlciI9PXR5cGVvZiBfX2UmJihfX2U9dCl9KSxfY29yZV8xPV9jb3JlLnZlcnNpb24sX2lzT2JqZWN0PWZ1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZT9udWxsIT09ZToiZnVuY3Rpb24iPT10eXBlb2YgZX0sX2FuT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKCFfaXNPYmplY3QoZSkpdGhyb3cgVHlwZUVycm9yKGUrIiBpcyBub3QgYW4gb2JqZWN0ISIpO3JldHVybiBlfSxfZmFpbHM9ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiEhZSgpfWNhdGNoKGUpe3JldHVybiEwfX0sX2Rlc2NyaXB0b3JzPSFfZmFpbHMoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pLGRvY3VtZW50JDE9X2dsb2JhbC5kb2N1bWVudCxpcz1faXNPYmplY3QoZG9jdW1lbnQkMSkmJl9pc09iamVjdChkb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQpLF9kb21DcmVhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGlzP2RvY3VtZW50JDEuY3JlYXRlRWxlbWVudChlKTp7fX0sX2llOERvbURlZmluZT0hX2Rlc2NyaXB0b3JzJiYhX2ZhaWxzKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZG9tQ3JlYXRlKCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KSxfdG9QcmltaXRpdmU9ZnVuY3Rpb24oZSx0KXtpZighX2lzT2JqZWN0KGUpKXJldHVybiBlO3ZhciBuLHI7aWYodCYmImZ1bmN0aW9uIj09dHlwZW9mKG49ZS50b1N0cmluZykmJiFfaXNPYmplY3Qocj1uLmNhbGwoZSkpKXJldHVybiByO2lmKCJmdW5jdGlvbiI9PXR5cGVvZihuPWUudmFsdWVPZikmJiFfaXNPYmplY3Qocj1uLmNhbGwoZSkpKXJldHVybiByO2lmKCF0JiYiZnVuY3Rpb24iPT10eXBlb2Yobj1lLnRvU3RyaW5nKSYmIV9pc09iamVjdChyPW4uY2FsbChlKSkpcmV0dXJuIHI7dGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKX0sZFA9T2JqZWN0LmRlZmluZVByb3BlcnR5LGY9X2Rlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihlLHQsbil7aWYoX2FuT2JqZWN0KGUpLHQ9X3RvUHJpbWl0aXZlKHQsITApLF9hbk9iamVjdChuKSxfaWU4RG9tRGVmaW5lKXRyeXtyZXR1cm4gZFAoZSx0LG4pfWNhdGNoKGUpe31pZigiZ2V0ImluIG58fCJzZXQiaW4gbil0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkISIpO3JldHVybiJ2YWx1ZSJpbiBuJiYoZVt0XT1uLnZhbHVlKSxlfSxfb2JqZWN0RHA9e2Y6Zn0sX3Byb3BlcnR5RGVzYz1mdW5jdGlvbihlLHQpe3JldHVybntlbnVtZXJhYmxlOiEoMSZlKSxjb25maWd1cmFibGU6ISgyJmUpLHdyaXRhYmxlOiEoNCZlKSx2YWx1ZTp0fX0sX2hpZGU9X2Rlc2NyaXB0b3JzP2Z1bmN0aW9uKGUsdCxuKXtyZXR1cm4gX29iamVjdERwLmYoZSx0LF9wcm9wZXJ0eURlc2MoMSxuKSl9OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZVt0XT1uLGV9LGhhc093blByb3BlcnR5PXt9Lmhhc093blByb3BlcnR5LF9oYXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfSxpZD0wLHB4PU1hdGgucmFuZG9tKCksX3VpZD1mdW5jdGlvbihlKXtyZXR1cm4iU3ltYm9sKCIuY29uY2F0KHZvaWQgMD09PWU/IiI6ZSwiKV8iLCgrK2lkK3B4KS50b1N0cmluZygzNikpfSxfcmVkZWZpbmU9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIG89X3VpZCgic3JjIiksdD0idG9TdHJpbmciLG49RnVuY3Rpb25bdF0sYT0oIiIrbikuc3BsaXQodCk7X2NvcmUuaW5zcGVjdFNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gbi5jYWxsKGUpfSwoZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPSJmdW5jdGlvbiI9PXR5cGVvZiBuO2kmJihfaGFzKG4sIm5hbWUiKXx8X2hpZGUobiwibmFtZSIsdCkpLGVbdF0hPT1uJiYoaSYmKF9oYXMobixvKXx8X2hpZGUobixvLGVbdF0/IiIrZVt0XTphLmpvaW4oU3RyaW5nKHQpKSkpLGU9PT1fZ2xvYmFsP2VbdF09bjpyP2VbdF0/ZVt0XT1uOl9oaWRlKGUsdCxuKTooZGVsZXRlIGVbdF0sX2hpZGUoZSx0LG4pKSl9KShGdW5jdGlvbi5wcm90b3R5cGUsdCxmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzJiZ0aGlzW29dfHxuLmNhbGwodGhpcyl9KX0pLF9hRnVuY3Rpb249ZnVuY3Rpb24oZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgVHlwZUVycm9yKGUrIiBpcyBub3QgYSBmdW5jdGlvbiEiKTtyZXR1cm4gZX0sX2N0eD1mdW5jdGlvbihyLGksZSl7aWYoX2FGdW5jdGlvbihyKSx2b2lkIDA9PT1pKXJldHVybiByO3N3aXRjaChlKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiByLmNhbGwoaSxlKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiByLmNhbGwoaSxlLHQpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gci5jYWxsKGksZSx0LG4pfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gci5hcHBseShpLGFyZ3VtZW50cyl9fSxQUk9UT1RZUEU9InByb3RvdHlwZSIsJGV4cG9ydD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscz1lJiRleHBvcnQuRixjPWUmJGV4cG9ydC5HLHU9ZSYkZXhwb3J0LlMsbD1lJiRleHBvcnQuUCxkPWUmJGV4cG9ydC5CLGY9Yz9fZ2xvYmFsOnU/X2dsb2JhbFt0XXx8KF9nbG9iYWxbdF09e30pOihfZ2xvYmFsW3RdfHx7fSlbUFJPVE9UWVBFXSxwPWM/X2NvcmU6X2NvcmVbdF18fChfY29yZVt0XT17fSksaD1wW1BST1RPVFlQRV18fChwW1BST1RPVFlQRV09e30pO2ZvcihyIGluIGMmJihuPXQpLG4pbz0oKGk9IXMmJmYmJnZvaWQgMCE9PWZbcl0pP2Y6bilbcl0sYT1kJiZpP19jdHgobyxfZ2xvYmFsKTpsJiYiZnVuY3Rpb24iPT10eXBlb2Ygbz9fY3R4KEZ1bmN0aW9uLmNhbGwsbyk6byxmJiZfcmVkZWZpbmUoZixyLG8sZSYkZXhwb3J0LlUpLHBbcl0hPW8mJl9oaWRlKHAscixhKSxsJiZoW3JdIT1vJiYoaFtyXT1vKX07X2dsb2JhbC5jb3JlPV9jb3JlLCRleHBvcnQuRj0xLCRleHBvcnQuRz0yLCRleHBvcnQuUz00LCRleHBvcnQuUD04LCRleHBvcnQuQj0xNiwkZXhwb3J0Llc9MzIsJGV4cG9ydC5VPTY0LCRleHBvcnQuUj0xMjg7dmFyIF9leHBvcnQ9JGV4cG9ydCx0b1N0cmluZyQxPXt9LnRvU3RyaW5nLF9jb2Y9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvU3RyaW5nJDEuY2FsbChlKS5zbGljZSg4LC0xKX0sX2lvYmplY3Q9T2JqZWN0KCJ6IikucHJvcGVydHlJc0VudW1lcmFibGUoMCk/T2JqZWN0OmZ1bmN0aW9uKGUpe3JldHVybiJTdHJpbmciPT1fY29mKGUpP2Uuc3BsaXQoIiIpOk9iamVjdChlKX0sX2RlZmluZWQ9ZnVuY3Rpb24oZSl7aWYobnVsbD09ZSl0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNhbGwgbWV0aG9kIG9uICAiK2UpO3JldHVybiBlfSxfdG9Jb2JqZWN0PWZ1bmN0aW9uKGUpe3JldHVybiBfaW9iamVjdChfZGVmaW5lZChlKSl9LGNlaWw9TWF0aC5jZWlsLGZsb29yPU1hdGguZmxvb3IsX3RvSW50ZWdlcj1mdW5jdGlvbihlKXtyZXR1cm4gaXNOYU4oZT0rZSk/MDooMDxlP2Zsb29yOmNlaWwpKGUpfSxtaW49TWF0aC5taW4sX3RvTGVuZ3RoPWZ1bmN0aW9uKGUpe3JldHVybiAwPGU/bWluKF90b0ludGVnZXIoZSksOTAwNzE5OTI1NDc0MDk5MSk6MH0sbWF4PU1hdGgubWF4LG1pbiQxPU1hdGgubWluLF90b0Fic29sdXRlSW5kZXg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZT1fdG9JbnRlZ2VyKGUpKTwwP21heChlK3QsMCk6bWluJDEoZSx0KX0sX2FycmF5SW5jbHVkZXM9ZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPV90b0lvYmplY3QoZSksbz1fdG9MZW5ndGgoaS5sZW5ndGgpLGE9X3RvQWJzb2x1dGVJbmRleChuLG8pO2lmKHMmJnQhPXQpe2Zvcig7YTxvOylpZigocj1pW2ErK10pIT1yKXJldHVybiEwfWVsc2UgZm9yKDthPG87YSsrKWlmKChzfHxhIGluIGkpJiZpW2FdPT09dClyZXR1cm4gc3x8YXx8MDtyZXR1cm4hcyYmLTF9fSxfbGlicmFyeT0hMSxfc2hhcmVkPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciB0PSJfX2NvcmUtanNfc2hhcmVkX18iLG49X2dsb2JhbFt0XXx8KF9nbG9iYWxbdF09e30pOyhlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbltlXXx8KG5bZV09dm9pZCAwIT09dD90Ont9KX0pKCJ2ZXJzaW9ucyIsW10pLnB1c2goe3ZlcnNpb246X2NvcmUudmVyc2lvbixtb2RlOl9saWJyYXJ5PyJwdXJlIjoiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMTggRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkifSl9KSxzaGFyZWQkMj1fc2hhcmVkKCJrZXlzIiksX3NoYXJlZEtleT1mdW5jdGlvbihlKXtyZXR1cm4gc2hhcmVkJDJbZV18fChzaGFyZWQkMltlXT1fdWlkKGUpKX0sYXJyYXlJbmRleE9mPV9hcnJheUluY2x1ZGVzKCExKSxJRV9QUk9UTz1fc2hhcmVkS2V5KCJJRV9QUk9UTyIpLF9vYmplY3RLZXlzSW50ZXJuYWw9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPV90b0lvYmplY3QoZSksaT0wLG89W107Zm9yKG4gaW4gciluIT1JRV9QUk9UTyYmX2hhcyhyLG4pJiZvLnB1c2gobik7Zm9yKDt0Lmxlbmd0aD5pOylfaGFzKHIsbj10W2krK10pJiYofmFycmF5SW5kZXhPZihvLG4pfHxvLnB1c2gobikpO3JldHVybiBvfSxfZW51bUJ1Z0tleXM9ImNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZiIuc3BsaXQoIiwiKSxfb2JqZWN0S2V5cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24oZSl7cmV0dXJuIF9vYmplY3RLZXlzSW50ZXJuYWwoZSxfZW51bUJ1Z0tleXMpfSxmJDE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxfb2JqZWN0R29wcz17ZjpmJDF9LGYkMj17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxfb2JqZWN0UGllPXtmOmYkMn0sX3RvT2JqZWN0PWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QoX2RlZmluZWQoZSkpfSwkYXNzaWduPU9iamVjdC5hc3NpZ24sX29iamVjdEFzc2lnbj0hJGFzc2lnbnx8X2ZhaWxzKGZ1bmN0aW9uKCl7dmFyIGU9e30sdD17fSxuPVN5bWJvbCgpLHI9ImFiY2RlZmdoaWprbG1ub3BxcnN0IjtyZXR1cm4gZVtuXT03LHIuc3BsaXQoIiIpLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1lfSksNyE9JGFzc2lnbih7fSxlKVtuXXx8T2JqZWN0LmtleXMoJGFzc2lnbih7fSx0KSkuam9pbigiIikhPXJ9KT9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1hcmd1bWVudHMscj1fdG9PYmplY3QoZSksaT1hcmd1bWVudHMubGVuZ3RoLG89MSxhPV9vYmplY3RHb3BzLmYscz1fb2JqZWN0UGllLmY7bzxpOylmb3IodmFyIGMsdT1faW9iamVjdChuW28rK10pLGw9YT9fb2JqZWN0S2V5cyh1KS5jb25jYXQoYSh1KSk6X29iamVjdEtleXModSksZD1sLmxlbmd0aCxmPTA7ZjxkOylzLmNhbGwodSxjPWxbZisrXSkmJihyW2NdPXVbY10pO3JldHVybiByfTokYXNzaWduO19leHBvcnQoX2V4cG9ydC5TK19leHBvcnQuRiwiT2JqZWN0Iix7YXNzaWduOl9vYmplY3RBc3NpZ259KTt2YXIgYXNzaWduPV9jb3JlLk9iamVjdC5hc3NpZ247T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoT2JqZWN0LnNldFByb3RvdHlwZU9mPWZ1bmN0aW9uKHQsbil7dmFyIHI7ZnVuY3Rpb24gaShlLHQpe3JldHVybiByLmNhbGwoZSx0KSxlfXRyeXsocj10LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LnByb3RvdHlwZSxuKS5zZXQpLmNhbGwoe30sbnVsbCl9Y2F0Y2goZSl7aWYodC5wcm90b3R5cGUhPT17fVtuXSlyZXR1cm47cj1mdW5jdGlvbihlKXt0aGlzW25dPWV9LGkucG9seWZpbGw9aShpKHt9LG51bGwpLHQucHJvdG90eXBlKWluc3RhbmNlb2YgdH1yZXR1cm4gaX0oT2JqZWN0LCJfX3Byb3RvX18iKSk7dmFyIFdYRW52aXJvbm1lbnQkMT1nbG9iYWwuV1hFbnZpcm9ubWVudDt2b2lkIDA9PT1XWEVudmlyb25tZW50JDF8fCJpT1MiIT09V1hFbnZpcm9ubWVudCQxLnBsYXRmb3JtfHxXWEVudmlyb25tZW50JDEuX19lbmFibGVfbmF0aXZlX3Byb21pc2VfX3x8KGdsb2JhbC5Qcm9taXNlPXZvaWQgMCk7dmFyIF93a3M9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIHQ9X3NoYXJlZCgid2tzIiksbj1fZ2xvYmFsLlN5bWJvbCxyPSJmdW5jdGlvbiI9PXR5cGVvZiBuOyhlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV18fCh0W2VdPXImJm5bZV18fChyP246X3VpZCkoIlN5bWJvbC4iK2UpKX0pLnN0b3JlPXR9KSxUQUc9X3drcygidG9TdHJpbmdUYWciKSxBUkc9IkFyZ3VtZW50cyI9PV9jb2YoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKSx0cnlHZXQ9ZnVuY3Rpb24oZSx0KXt0cnl7cmV0dXJuIGVbdF19Y2F0Y2goZSl7fX0sX2NsYXNzb2Y9ZnVuY3Rpb24oZSl7dmFyIHQsbixyO3JldHVybiB2b2lkIDA9PT1lPyJVbmRlZmluZWQiOm51bGw9PT1lPyJOdWxsIjoic3RyaW5nIj09dHlwZW9mKG49dHJ5R2V0KHQ9T2JqZWN0KGUpLFRBRykpP246QVJHP19jb2YodCk6Ik9iamVjdCI9PShyPV9jb2YodCkpJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5jYWxsZWU/IkFyZ3VtZW50cyI6cn0sdGVzdD17fTt0ZXN0W193a3MoInRvU3RyaW5nVGFnIildPSJ6Iix0ZXN0KyIiIT0iW29iamVjdCB6XSImJl9yZWRlZmluZShPYmplY3QucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCAiK19jbGFzc29mKHRoaXMpKyJdIn0sITApO3ZhciBfc3RyaW5nQXQ9ZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPVN0cmluZyhfZGVmaW5lZChlKSksbz1fdG9JbnRlZ2VyKHQpLGE9aS5sZW5ndGg7cmV0dXJuIG88MHx8YTw9bz9zPyIiOnZvaWQgMDoobj1pLmNoYXJDb2RlQXQobykpPDU1Mjk2fHw1NjMxOTxufHxvKzE9PT1hfHwocj1pLmNoYXJDb2RlQXQobysxKSk8NTYzMjB8fDU3MzQzPHI/cz9pLmNoYXJBdChvKTpuOnM/aS5zbGljZShvLG8rMik6ci01NjMyMCsobi01NTI5Njw8MTApKzY1NTM2fX0sX2l0ZXJhdG9ycz17fSxfb2JqZWN0RHBzPV9kZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbihlLHQpe19hbk9iamVjdChlKTtmb3IodmFyIG4scj1fb2JqZWN0S2V5cyh0KSxpPXIubGVuZ3RoLG89MDtvPGk7KV9vYmplY3REcC5mKGUsbj1yW28rK10sdFtuXSk7cmV0dXJuIGV9LGRvY3VtZW50JDI9X2dsb2JhbC5kb2N1bWVudCxfaHRtbD1kb2N1bWVudCQyJiZkb2N1bWVudCQyLmRvY3VtZW50RWxlbWVudCxJRV9QUk9UTyQxPV9zaGFyZWRLZXkoIklFX1BST1RPIiksRW1wdHk9ZnVuY3Rpb24oKXt9LFBST1RPVFlQRSQxPSJwcm90b3R5cGUiLGNyZWF0ZURpY3Q9ZnVuY3Rpb24oKXt2YXIgZSx0PV9kb21DcmVhdGUoImlmcmFtZSIpLG49X2VudW1CdWdLZXlzLmxlbmd0aDtmb3IodC5zdHlsZS5kaXNwbGF5PSJub25lIixfaHRtbC5hcHBlbmRDaGlsZCh0KSx0LnNyYz0iamF2YXNjcmlwdDoiLChlPXQuY29udGVudFdpbmRvdy5kb2N1bWVudCkub3BlbigpLGUud3JpdGUoIjxzY3JpcHQ+ZG9jdW1lbnQuRj1PYmplY3Q8XC9zY3JpcHQ+IiksZS5jbG9zZSgpLGNyZWF0ZURpY3Q9ZS5GO24tLTspZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFJDFdW19lbnVtQnVnS2V5c1tuXV07cmV0dXJuIGNyZWF0ZURpY3QoKX0sX29iamVjdENyZWF0ZT1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybiBudWxsIT09ZT8oRW1wdHlbUFJPVE9UWVBFJDFdPV9hbk9iamVjdChlKSxuPW5ldyBFbXB0eSxFbXB0eVtQUk9UT1RZUEUkMV09bnVsbCxuW0lFX1BST1RPJDFdPWUpOm49Y3JlYXRlRGljdCgpLHZvaWQgMD09PXQ/bjpfb2JqZWN0RHBzKG4sdCl9LGRlZj1fb2JqZWN0RHAuZixUQUckMT1fd2tzKCJ0b1N0cmluZ1RhZyIpLF9zZXRUb1N0cmluZ1RhZz1mdW5jdGlvbihlLHQsbil7ZSYmIV9oYXMoZT1uP2U6ZS5wcm90b3R5cGUsVEFHJDEpJiZkZWYoZSxUQUckMSx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOnR9KX0sSXRlcmF0b3JQcm90b3R5cGU9e307X2hpZGUoSXRlcmF0b3JQcm90b3R5cGUsX3drcygiaXRlcmF0b3IiKSxmdW5jdGlvbigpe3JldHVybiB0aGlzfSk7dmFyIF9pdGVyQ3JlYXRlPWZ1bmN0aW9uKGUsdCxuKXtlLnByb3RvdHlwZT1fb2JqZWN0Q3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLHtuZXh0Ol9wcm9wZXJ0eURlc2MoMSxuKX0pLF9zZXRUb1N0cmluZ1RhZyhlLHQrIiBJdGVyYXRvciIpfSxJRV9QUk9UTyQyPV9zaGFyZWRLZXkoIklFX1BST1RPIiksT2JqZWN0UHJvdG89T2JqZWN0LnByb3RvdHlwZSxfb2JqZWN0R3BvPU9iamVjdC5nZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24oZSl7cmV0dXJuIGU9X3RvT2JqZWN0KGUpLF9oYXMoZSxJRV9QUk9UTyQyKT9lW0lFX1BST1RPJDJdOiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yJiZlIGluc3RhbmNlb2YgZS5jb25zdHJ1Y3Rvcj9lLmNvbnN0cnVjdG9yLnByb3RvdHlwZTplIGluc3RhbmNlb2YgT2JqZWN0P09iamVjdFByb3RvOm51bGx9LElURVJBVE9SPV93a3MoIml0ZXJhdG9yIiksQlVHR1k9IShbXS5rZXlzJiYibmV4dCJpbltdLmtleXMoKSksRkZfSVRFUkFUT1I9IkBAaXRlcmF0b3IiLEtFWVM9ImtleXMiLFZBTFVFUz0idmFsdWVzIixyZXR1cm5UaGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LF9pdGVyRGVmaW5lPWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEpe19pdGVyQ3JlYXRlKG4sdCxyKTt2YXIgcyxjLHUsbD1mdW5jdGlvbihlKXtpZighQlVHR1kmJmUgaW4gaClyZXR1cm4gaFtlXTtzd2l0Y2goZSl7Y2FzZSBLRVlTOmNhc2UgVkFMVUVTOnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLGUpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyxlKX19LGQ9dCsiIEl0ZXJhdG9yIixmPWk9PVZBTFVFUyxwPSExLGg9ZS5wcm90b3R5cGUsdj1oW0lURVJBVE9SXXx8aFtGRl9JVEVSQVRPUl18fGkmJmhbaV0sZz12fHxsKGkpLG09aT9mP2woImVudHJpZXMiKTpnOnZvaWQgMCx5PSJBcnJheSI9PXQmJmguZW50cmllc3x8djtpZih5JiYodT1fb2JqZWN0R3BvKHkuY2FsbChuZXcgZSkpKSE9PU9iamVjdC5wcm90b3R5cGUmJnUubmV4dCYmKF9zZXRUb1N0cmluZ1RhZyh1LGQsITApLF9saWJyYXJ5fHwiZnVuY3Rpb24iPT10eXBlb2YgdVtJVEVSQVRPUl18fF9oaWRlKHUsSVRFUkFUT1IscmV0dXJuVGhpcykpLGYmJnYmJnYubmFtZSE9PVZBTFVFUyYmKHA9ITAsZz1mdW5jdGlvbigpe3JldHVybiB2LmNhbGwodGhpcyl9KSxfbGlicmFyeSYmIWF8fCFCVUdHWSYmIXAmJmhbSVRFUkFUT1JdfHxfaGlkZShoLElURVJBVE9SLGcpLF9pdGVyYXRvcnNbdF09ZyxfaXRlcmF0b3JzW2RdPXJldHVyblRoaXMsaSlpZihzPXt2YWx1ZXM6Zj9nOmwoVkFMVUVTKSxrZXlzOm8/ZzpsKEtFWVMpLGVudHJpZXM6bX0sYSlmb3IoYyBpbiBzKWMgaW4gaHx8X3JlZGVmaW5lKGgsYyxzW2NdKTtlbHNlIF9leHBvcnQoX2V4cG9ydC5QK19leHBvcnQuRiooQlVHR1l8fHApLHQscyk7cmV0dXJuIHN9LCRhdD1fc3RyaW5nQXQoITApO19pdGVyRGVmaW5lKFN0cmluZywiU3RyaW5nIixmdW5jdGlvbihlKXt0aGlzLl90PVN0cmluZyhlKSx0aGlzLl9pPTB9LGZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLl90LG49dGhpcy5faTtyZXR1cm4gbj49dC5sZW5ndGg/e3ZhbHVlOnZvaWQgMCxkb25lOiEwfTooZT0kYXQodCxuKSx0aGlzLl9pKz1lLmxlbmd0aCx7dmFsdWU6ZSxkb25lOiExfSl9KTt2YXIgVU5TQ09QQUJMRVM9X3drcygidW5zY29wYWJsZXMiKSxBcnJheVByb3RvPUFycmF5LnByb3RvdHlwZTtudWxsPT1BcnJheVByb3RvW1VOU0NPUEFCTEVTXSYmX2hpZGUoQXJyYXlQcm90byxVTlNDT1BBQkxFUyx7fSk7dmFyIF9hZGRUb1Vuc2NvcGFibGVzPWZ1bmN0aW9uKGUpe0FycmF5UHJvdG9bVU5TQ09QQUJMRVNdW2VdPSEwfSxfaXRlclN0ZXA9ZnVuY3Rpb24oZSx0KXtyZXR1cm57dmFsdWU6dCxkb25lOiEhZX19LGVzNl9hcnJheV9pdGVyYXRvcj1faXRlckRlZmluZShBcnJheSwiQXJyYXkiLGZ1bmN0aW9uKGUsdCl7dGhpcy5fdD1fdG9Jb2JqZWN0KGUpLHRoaXMuX2k9MCx0aGlzLl9rPXR9LGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fdCx0PXRoaXMuX2ssbj10aGlzLl9pKys7cmV0dXJuIWV8fG4+PWUubGVuZ3RoPyh0aGlzLl90PXZvaWQgMCxfaXRlclN0ZXAoMSkpOl9pdGVyU3RlcCgwLCJrZXlzIj09dD9uOiJ2YWx1ZXMiPT10P2Vbbl06W24sZVtuXV0pfSwidmFsdWVzIik7X2l0ZXJhdG9ycy5Bcmd1bWVudHM9X2l0ZXJhdG9ycy5BcnJheSxfYWRkVG9VbnNjb3BhYmxlcygia2V5cyIpLF9hZGRUb1Vuc2NvcGFibGVzKCJ2YWx1ZXMiKSxfYWRkVG9VbnNjb3BhYmxlcygiZW50cmllcyIpO2Zvcih2YXIgSVRFUkFUT1IkMT1fd2tzKCJpdGVyYXRvciIpLFRPX1NUUklOR19UQUc9X3drcygidG9TdHJpbmdUYWciKSxBcnJheVZhbHVlcz1faXRlcmF0b3JzLkFycmF5LERPTUl0ZXJhYmxlcz17Q1NTUnVsZUxpc3Q6ITAsQ1NTU3R5bGVEZWNsYXJhdGlvbjohMSxDU1NWYWx1ZUxpc3Q6ITEsQ2xpZW50UmVjdExpc3Q6ITEsRE9NUmVjdExpc3Q6ITEsRE9NU3RyaW5nTGlzdDohMSxET01Ub2tlbkxpc3Q6ITAsRGF0YVRyYW5zZmVySXRlbUxpc3Q6ITEsRmlsZUxpc3Q6ITEsSFRNTEFsbENvbGxlY3Rpb246ITEsSFRNTENvbGxlY3Rpb246ITEsSFRNTEZvcm1FbGVtZW50OiExLEhUTUxTZWxlY3RFbGVtZW50OiExLE1lZGlhTGlzdDohMCxNaW1lVHlwZUFycmF5OiExLE5hbWVkTm9kZU1hcDohMSxOb2RlTGlzdDohMCxQYWludFJlcXVlc3RMaXN0OiExLFBsdWdpbjohMSxQbHVnaW5BcnJheTohMSxTVkdMZW5ndGhMaXN0OiExLFNWR051bWJlckxpc3Q6ITEsU1ZHUGF0aFNlZ0xpc3Q6ITEsU1ZHUG9pbnRMaXN0OiExLFNWR1N0cmluZ0xpc3Q6ITEsU1ZHVHJhbnNmb3JtTGlzdDohMSxTb3VyY2VCdWZmZXJMaXN0OiExLFN0eWxlU2hlZXRMaXN0OiEwLFRleHRUcmFja0N1ZUxpc3Q6ITEsVGV4dFRyYWNrTGlzdDohMSxUb3VjaExpc3Q6ITF9LGNvbGxlY3Rpb25zPV9vYmplY3RLZXlzKERPTUl0ZXJhYmxlcyksaT0wO2k8Y29sbGVjdGlvbnMubGVuZ3RoO2krKyl7dmFyIE5BTUU9Y29sbGVjdGlvbnNbaV0sZXhwbGljaXQ9RE9NSXRlcmFibGVzW05BTUVdLENvbGxlY3Rpb249X2dsb2JhbFtOQU1FXSxwcm90bz1Db2xsZWN0aW9uJiZDb2xsZWN0aW9uLnByb3RvdHlwZSxrZXk7aWYocHJvdG8mJihwcm90b1tJVEVSQVRPUiQxXXx8X2hpZGUocHJvdG8sSVRFUkFUT1IkMSxBcnJheVZhbHVlcykscHJvdG9bVE9fU1RSSU5HX1RBR118fF9oaWRlKHByb3RvLFRPX1NUUklOR19UQUcsTkFNRSksX2l0ZXJhdG9yc1tOQU1FXT1BcnJheVZhbHVlcyxleHBsaWNpdCkpZm9yKGtleSBpbiBlczZfYXJyYXlfaXRlcmF0b3IpcHJvdG9ba2V5XXx8X3JlZGVmaW5lKHByb3RvLGtleSxlczZfYXJyYXlfaXRlcmF0b3Jba2V5XSwhMCl9dmFyIF9hbkluc3RhbmNlPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCEoZSBpbnN0YW5jZW9mIHQpfHx2b2lkIDAhPT1yJiZyIGluIGUpdGhyb3cgVHlwZUVycm9yKG4rIjogaW5jb3JyZWN0IGludm9jYXRpb24hIik7cmV0dXJuIGV9LF9pdGVyQ2FsbD1mdW5jdGlvbih0LGUsbixyKXt0cnl7cmV0dXJuIHI/ZShfYW5PYmplY3QobilbMF0sblsxXSk6ZShuKX1jYXRjaChlKXt2YXIgaT10LnJldHVybjt0aHJvdyB2b2lkIDAhPT1pJiZfYW5PYmplY3QoaS5jYWxsKHQpKSxlfX0sSVRFUkFUT1IkMj1fd2tzKCJpdGVyYXRvciIpLEFycmF5UHJvdG8kMT1BcnJheS5wcm90b3R5cGUsX2lzQXJyYXlJdGVyPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1lJiYoX2l0ZXJhdG9ycy5BcnJheT09PWV8fEFycmF5UHJvdG8kMVtJVEVSQVRPUiQyXT09PWUpfSxJVEVSQVRPUiQzPV93a3MoIml0ZXJhdG9yIiksY29yZV9nZXRJdGVyYXRvck1ldGhvZD1fY29yZS5nZXRJdGVyYXRvck1ldGhvZD1mdW5jdGlvbihlKXtpZihudWxsIT1lKXJldHVybiBlW0lURVJBVE9SJDNdfHxlWyJAQGl0ZXJhdG9yIl18fF9pdGVyYXRvcnNbX2NsYXNzb2YoZSldfSxfZm9yT2Y9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIGY9e30scD17fSx0PWUuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyxjLHU9aT9mdW5jdGlvbigpe3JldHVybiBlfTpjb3JlX2dldEl0ZXJhdG9yTWV0aG9kKGUpLGw9X2N0eChuLHIsdD8yOjEpLGQ9MDtpZigiZnVuY3Rpb24iIT10eXBlb2YgdSl0aHJvdyBUeXBlRXJyb3IoZSsiIGlzIG5vdCBpdGVyYWJsZSEiKTtpZihfaXNBcnJheUl0ZXIodSkpe2ZvcihvPV90b0xlbmd0aChlLmxlbmd0aCk7ZDxvO2QrKylpZigoYz10P2woX2FuT2JqZWN0KGE9ZVtkXSlbMF0sYVsxXSk6bChlW2RdKSk9PT1mfHxjPT09cClyZXR1cm4gY31lbHNlIGZvcihzPXUuY2FsbChlKTshKGE9cy5uZXh0KCkpLmRvbmU7KWlmKChjPV9pdGVyQ2FsbChzLGwsYS52YWx1ZSx0KSk9PT1mfHxjPT09cClyZXR1cm4gY307dC5CUkVBSz1mLHQuUkVUVVJOPXB9KSxTUEVDSUVTPV93a3MoInNwZWNpZXMiKSxfc3BlY2llc0NvbnN0cnVjdG9yPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1fYW5PYmplY3QoZSkuY29uc3RydWN0b3I7cmV0dXJuIHZvaWQgMD09PXJ8fG51bGw9PShuPV9hbk9iamVjdChyKVtTUEVDSUVTXSk/dDpfYUZ1bmN0aW9uKG4pfSxfaW52b2tlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj12b2lkIDA9PT1uO3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAwOnJldHVybiByP2UoKTplLmNhbGwobik7Y2FzZSAxOnJldHVybiByP2UodFswXSk6ZS5jYWxsKG4sdFswXSk7Y2FzZSAyOnJldHVybiByP2UodFswXSx0WzFdKTplLmNhbGwobix0WzBdLHRbMV0pO2Nhc2UgMzpyZXR1cm4gcj9lKHRbMF0sdFsxXSx0WzJdKTplLmNhbGwobix0WzBdLHRbMV0sdFsyXSk7Y2FzZSA0OnJldHVybiByP2UodFswXSx0WzFdLHRbMl0sdFszXSk6ZS5jYWxsKG4sdFswXSx0WzFdLHRbMl0sdFszXSl9cmV0dXJuIGUuYXBwbHkobix0KX0scHJvY2VzcyQyPV9nbG9iYWwucHJvY2VzcyxzZXRUYXNrPV9nbG9iYWwuc2V0SW1tZWRpYXRlLGNsZWFyVGFzaz1fZ2xvYmFsLmNsZWFySW1tZWRpYXRlLE1lc3NhZ2VDaGFubmVsPV9nbG9iYWwuTWVzc2FnZUNoYW5uZWwsRGlzcGF0Y2g9X2dsb2JhbC5EaXNwYXRjaCxjb3VudGVyPTAscXVldWU9e30sT05SRUFEWVNUQVRFQ0hBTkdFPSJvbnJlYWR5c3RhdGVjaGFuZ2UiLGRlZmVyLGNoYW5uZWwkMSxwb3J0LHJ1bj1mdW5jdGlvbigpe3ZhciBlPSt0aGlzO2lmKHF1ZXVlLmhhc093blByb3BlcnR5KGUpKXt2YXIgdD1xdWV1ZVtlXTtkZWxldGUgcXVldWVbZV0sdCgpfX0sbGlzdGVuZXI9ZnVuY3Rpb24oZSl7cnVuLmNhbGwoZS5kYXRhKX07c2V0VGFzayYmY2xlYXJUYXNrfHwoc2V0VGFzaz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9YXJndW1lbnRzLG49W10scj0xO2FyZ3VtZW50cy5sZW5ndGg+cjspbi5wdXNoKHRbcisrXSk7cmV0dXJuIHF1ZXVlWysrY291bnRlcl09ZnVuY3Rpb24oKXtfaW52b2tlKCJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6RnVuY3Rpb24oZSksbil9LGRlZmVyKGNvdW50ZXIpLGNvdW50ZXJ9LGNsZWFyVGFzaz1mdW5jdGlvbihlKXtkZWxldGUgcXVldWVbZV19LCJwcm9jZXNzIj09X2NvZihwcm9jZXNzJDIpP2RlZmVyPWZ1bmN0aW9uKGUpe3Byb2Nlc3MkMi5uZXh0VGljayhfY3R4KHJ1bixlLDEpKX06RGlzcGF0Y2gmJkRpc3BhdGNoLm5vdz9kZWZlcj1mdW5jdGlvbihlKXtEaXNwYXRjaC5ub3coX2N0eChydW4sZSwxKSl9Ok1lc3NhZ2VDaGFubmVsPyhjaGFubmVsJDE9bmV3IE1lc3NhZ2VDaGFubmVsLHBvcnQ9Y2hhbm5lbCQxLnBvcnQyLGNoYW5uZWwkMS5wb3J0MS5vbm1lc3NhZ2U9bGlzdGVuZXIsZGVmZXI9X2N0eChwb3J0LnBvc3RNZXNzYWdlLHBvcnQsMSkpOl9nbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciYmImZ1bmN0aW9uIj09dHlwZW9mIHBvc3RNZXNzYWdlJiYhX2dsb2JhbC5pbXBvcnRTY3JpcHRzPyhkZWZlcj1mdW5jdGlvbihlKXtfZ2xvYmFsLnBvc3RNZXNzYWdlKGUrIiIsIioiKX0sX2dsb2JhbC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixsaXN0ZW5lciwhMSkpOmRlZmVyPU9OUkVBRFlTVEFURUNIQU5HRSBpbiBfZG9tQ3JlYXRlKCJzY3JpcHQiKT9mdW5jdGlvbihlKXtfaHRtbC5hcHBlbmRDaGlsZChfZG9tQ3JlYXRlKCJzY3JpcHQiKSlbT05SRUFEWVNUQVRFQ0hBTkdFXT1mdW5jdGlvbigpe19odG1sLnJlbW92ZUNoaWxkKHRoaXMpLHJ1bi5jYWxsKGUpfX06ZnVuY3Rpb24oZSl7c2V0VGltZW91dChfY3R4KHJ1bixlLDEpLDApfSk7dmFyIF90YXNrPXtzZXQ6c2V0VGFzayxjbGVhcjpjbGVhclRhc2t9LG1hY3JvdGFzaz1fdGFzay5zZXQsT2JzZXJ2ZXI9X2dsb2JhbC5NdXRhdGlvbk9ic2VydmVyfHxfZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIscHJvY2VzcyQzPV9nbG9iYWwucHJvY2VzcyxQcm9taXNlJDE9X2dsb2JhbC5Qcm9taXNlLGlzTm9kZSQxPSJwcm9jZXNzIj09X2NvZihwcm9jZXNzJDMpLF9taWNyb3Rhc2s9ZnVuY3Rpb24oKXt2YXIgbixyLGksZT1mdW5jdGlvbigpe3ZhciBlLHQ7Zm9yKGlzTm9kZSQxJiYoZT1wcm9jZXNzJDMuZG9tYWluKSYmZS5leGl0KCk7bjspe3Q9bi5mbixuPW4ubmV4dDt0cnl7dCgpfWNhdGNoKGUpe3Rocm93IG4/aSgpOnI9dm9pZCAwLGV9fXI9dm9pZCAwLGUmJmUuZW50ZXIoKX07aWYoaXNOb2RlJDEpaT1mdW5jdGlvbigpe3Byb2Nlc3MkMy5uZXh0VGljayhlKX07ZWxzZSBpZighT2JzZXJ2ZXJ8fF9nbG9iYWwubmF2aWdhdG9yJiZfZ2xvYmFsLm5hdmlnYXRvci5zdGFuZGFsb25lKWlmKFByb21pc2UkMSYmUHJvbWlzZSQxLnJlc29sdmUpe3ZhciB0PVByb21pc2UkMS5yZXNvbHZlKHZvaWQgMCk7aT1mdW5jdGlvbigpe3QudGhlbihlKX19ZWxzZSBpPWZ1bmN0aW9uKCl7bWFjcm90YXNrLmNhbGwoX2dsb2JhbCxlKX07ZWxzZXt2YXIgbz0hMCxhPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKTtuZXcgT2JzZXJ2ZXIoZSkub2JzZXJ2ZShhLHtjaGFyYWN0ZXJEYXRhOiEwfSksaT1mdW5jdGlvbigpe2EuZGF0YT1vPSFvfX1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9e2ZuOmUsbmV4dDp2b2lkIDB9O3ImJihyLm5leHQ9dCksbnx8KG49dCxpKCkpLHI9dH19O2Z1bmN0aW9uIFByb21pc2VDYXBhYmlsaXR5KGUpe3ZhciBuLHI7dGhpcy5wcm9taXNlPW5ldyBlKGZ1bmN0aW9uKGUsdCl7aWYodm9pZCAwIT09bnx8dm9pZCAwIT09cil0aHJvdyBUeXBlRXJyb3IoIkJhZCBQcm9taXNlIGNvbnN0cnVjdG9yIik7bj1lLHI9dH0pLHRoaXMucmVzb2x2ZT1fYUZ1bmN0aW9uKG4pLHRoaXMucmVqZWN0PV9hRnVuY3Rpb24ocil9dmFyIGYkMz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KGUpfSxfbmV3UHJvbWlzZUNhcGFiaWxpdHk9e2Y6ZiQzfSxfcGVyZm9ybT1mdW5jdGlvbihlKXt0cnl7cmV0dXJue2U6ITEsdjplKCl9fWNhdGNoKGUpe3JldHVybntlOiEwLHY6ZX19fSxuYXZpZ2F0b3IkMT1fZ2xvYmFsLm5hdmlnYXRvcixfdXNlckFnZW50PW5hdmlnYXRvciQxJiZuYXZpZ2F0b3IkMS51c2VyQWdlbnR8fCIiLF9wcm9taXNlUmVzb2x2ZT1mdW5jdGlvbihlLHQpe2lmKF9hbk9iamVjdChlKSxfaXNPYmplY3QodCkmJnQuY29uc3RydWN0b3I9PT1lKXJldHVybiB0O3ZhciBuPV9uZXdQcm9taXNlQ2FwYWJpbGl0eS5mKGUpO3JldHVybigwLG4ucmVzb2x2ZSkodCksbi5wcm9taXNlfSxfcmVkZWZpbmVBbGw9ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgciBpbiB0KV9yZWRlZmluZShlLHIsdFtyXSxuKTtyZXR1cm4gZX0sU1BFQ0lFUyQxPV93a3MoInNwZWNpZXMiKSxfc2V0U3BlY2llcz1mdW5jdGlvbihlKXt2YXIgdD1fZ2xvYmFsW2VdO19kZXNjcmlwdG9ycyYmdCYmIXRbU1BFQ0lFUyQxXSYmX29iamVjdERwLmYodCxTUEVDSUVTJDEse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX0sSVRFUkFUT1IkND1fd2tzKCJpdGVyYXRvciIpLFNBRkVfQ0xPU0lORz0hMTt0cnl7dmFyIHJpdGVyPVs3XVtJVEVSQVRPUiQ0XSgpO3JpdGVyLnJldHVybj1mdW5jdGlvbigpe1NBRkVfQ0xPU0lORz0hMH19Y2F0Y2goZSl7fXZhciBfaXRlckRldGVjdD1mdW5jdGlvbihlLHQpe2lmKCF0JiYhU0FGRV9DTE9TSU5HKXJldHVybiExO3ZhciBuPSExO3RyeXt2YXIgcj1bN10saT1yW0lURVJBVE9SJDRdKCk7aS5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6bj0hMH19LHJbSVRFUkFUT1IkNF09ZnVuY3Rpb24oKXtyZXR1cm4gaX0sZShyKX1jYXRjaChlKXt9cmV0dXJuIG59LHRhc2s9X3Rhc2suc2V0LG1pY3JvdGFzaz1fbWljcm90YXNrKCksUFJPTUlTRT0iUHJvbWlzZSIsVHlwZUVycm9yJDE9X2dsb2JhbC5UeXBlRXJyb3IscHJvY2VzcyQxPV9nbG9iYWwucHJvY2Vzcyx2ZXJzaW9ucz1wcm9jZXNzJDEmJnByb2Nlc3MkMS52ZXJzaW9ucyx2OD12ZXJzaW9ucyYmdmVyc2lvbnMudjh8fCIiLCRQcm9taXNlPV9nbG9iYWxbUFJPTUlTRV0saXNOb2RlPSJwcm9jZXNzIj09X2NsYXNzb2YocHJvY2VzcyQxKSxlbXB0eT1mdW5jdGlvbigpe30sSW50ZXJuYWwsbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5LE93blByb21pc2VDYXBhYmlsaXR5LFdyYXBwZXIsbmV3UHJvbWlzZUNhcGFiaWxpdHk9bmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5PV9uZXdQcm9taXNlQ2FwYWJpbGl0eS5mLFVTRV9OQVRJVkU9ISFmdW5jdGlvbigpe3RyeXt2YXIgZT0kUHJvbWlzZS5yZXNvbHZlKDEpLHQ9KGUuY29uc3RydWN0b3I9e30pW193a3MoInNwZWNpZXMiKV09ZnVuY3Rpb24oZSl7ZShlbXB0eSxlbXB0eSl9O3JldHVybihpc05vZGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQpJiZlLnRoZW4oZW1wdHkpaW5zdGFuY2VvZiB0JiYwIT09djguaW5kZXhPZigiNi42IikmJi0xPT09X3VzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUvNjYiKX1jYXRjaChlKXt9fSgpLGlzVGhlbmFibGU9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuISghX2lzT2JqZWN0KGUpfHwiZnVuY3Rpb24iIT10eXBlb2YodD1lLnRoZW4pKSYmdH0sbm90aWZ5PWZ1bmN0aW9uKGwsbil7aWYoIWwuX24pe2wuX249ITA7dmFyIHI9bC5fYzttaWNyb3Rhc2soZnVuY3Rpb24oKXtmb3IodmFyIGM9bC5fdix1PTE9PWwuX3MsZT0wLHQ9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9dT9lLm9rOmUuZmFpbCxvPWUucmVzb2x2ZSxhPWUucmVqZWN0LHM9ZS5kb21haW47dHJ5e2k/KHV8fCgyPT1sLl9oJiZvbkhhbmRsZVVuaGFuZGxlZChsKSxsLl9oPTEpLCEwPT09aT90PWM6KHMmJnMuZW50ZXIoKSx0PWkoYykscyYmKHMuZXhpdCgpLHI9ITApKSx0PT09ZS5wcm9taXNlP2EoVHlwZUVycm9yJDEoIlByb21pc2UtY2hhaW4gY3ljbGUiKSk6KG49aXNUaGVuYWJsZSh0KSk/bi5jYWxsKHQsbyxhKTpvKHQpKTphKGMpfWNhdGNoKGUpe3MmJiFyJiZzLmV4aXQoKSxhKGUpfX07ci5sZW5ndGg+ZTspdChyW2UrK10pO2wuX2M9W10sbC5fbj0hMSxuJiYhbC5faCYmb25VbmhhbmRsZWQobCl9KX19LG9uVW5oYW5kbGVkPWZ1bmN0aW9uKG8pe3Rhc2suY2FsbChfZ2xvYmFsLGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI9by5fdixpPWlzVW5oYW5kbGVkKG8pO2lmKGkmJihlPV9wZXJmb3JtKGZ1bmN0aW9uKCl7aXNOb2RlP3Byb2Nlc3MkMS5lbWl0KCJ1bmhhbmRsZWRSZWplY3Rpb24iLHIsbyk6KHQ9X2dsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbik/dCh7cHJvbWlzZTpvLHJlYXNvbjpyfSk6KG49X2dsb2JhbC5jb25zb2xlKSYmbi5lcnJvciYmbi5lcnJvcigiVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIixyKX0pLG8uX2g9aXNOb2RlfHxpc1VuaGFuZGxlZChvKT8yOjEpLG8uX2E9dm9pZCAwLGkmJmUuZSl0aHJvdyBlLnZ9KX0saXNVbmhhbmRsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIDEhPT1lLl9oJiYwPT09KGUuX2F8fGUuX2MpLmxlbmd0aH0sb25IYW5kbGVVbmhhbmRsZWQ9ZnVuY3Rpb24odCl7dGFzay5jYWxsKF9nbG9iYWwsZnVuY3Rpb24oKXt2YXIgZTtpc05vZGU/cHJvY2VzcyQxLmVtaXQoInJlamVjdGlvbkhhbmRsZWQiLHQpOihlPV9nbG9iYWwub25yZWplY3Rpb25oYW5kbGVkKSYmZSh7cHJvbWlzZTp0LHJlYXNvbjp0Ll92fSl9KX0sJHJlamVjdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuX2R8fCh0Ll9kPSEwLCh0PXQuX3d8fHQpLl92PWUsdC5fcz0yLHQuX2F8fCh0Ll9hPXQuX2Muc2xpY2UoKSksbm90aWZ5KHQsITApKX0sJHJlc29sdmU9ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzO2lmKCFyLl9kKXtyLl9kPSEwLHI9ci5fd3x8cjt0cnl7aWYocj09PWUpdGhyb3cgVHlwZUVycm9yJDEoIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmIik7KG49aXNUaGVuYWJsZShlKSk/bWljcm90YXNrKGZ1bmN0aW9uKCl7dmFyIHQ9e193OnIsX2Q6ITF9O3RyeXtuLmNhbGwoZSxfY3R4KCRyZXNvbHZlLHQsMSksX2N0eCgkcmVqZWN0LHQsMSkpfWNhdGNoKGUpeyRyZWplY3QuY2FsbCh0LGUpfX0pOihyLl92PWUsci5fcz0xLG5vdGlmeShyLCExKSl9Y2F0Y2goZSl7JHJlamVjdC5jYWxsKHtfdzpyLF9kOiExfSxlKX19fTtVU0VfTkFUSVZFfHwoJFByb21pc2U9ZnVuY3Rpb24oZSl7X2FuSW5zdGFuY2UodGhpcywkUHJvbWlzZSxQUk9NSVNFLCJfaCIpLF9hRnVuY3Rpb24oZSksSW50ZXJuYWwuY2FsbCh0aGlzKTt0cnl7ZShfY3R4KCRyZXNvbHZlLHRoaXMsMSksX2N0eCgkcmVqZWN0LHRoaXMsMSkpfWNhdGNoKGUpeyRyZWplY3QuY2FsbCh0aGlzLGUpfX0sSW50ZXJuYWw9ZnVuY3Rpb24oZSl7dGhpcy5fYz1bXSx0aGlzLl9hPXZvaWQgMCx0aGlzLl9zPTAsdGhpcy5fZD0hMSx0aGlzLl92PXZvaWQgMCx0aGlzLl9oPTAsdGhpcy5fbj0hMX0sSW50ZXJuYWwucHJvdG90eXBlPV9yZWRlZmluZUFsbCgkUHJvbWlzZS5wcm90b3R5cGUse3RoZW46ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXdQcm9taXNlQ2FwYWJpbGl0eShfc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsJFByb21pc2UpKTtyZXR1cm4gbi5vaz0iZnVuY3Rpb24iIT10eXBlb2YgZXx8ZSxuLmZhaWw9ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQsbi5kb21haW49aXNOb2RlP3Byb2Nlc3MkMS5kb21haW46dm9pZCAwLHRoaXMuX2MucHVzaChuKSx0aGlzLl9hJiZ0aGlzLl9hLnB1c2gobiksdGhpcy5fcyYmbm90aWZ5KHRoaXMsITEpLG4ucHJvbWlzZX0sY2F0Y2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhlbih2b2lkIDAsZSl9fSksT3duUHJvbWlzZUNhcGFiaWxpdHk9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgSW50ZXJuYWw7dGhpcy5wcm9taXNlPWUsdGhpcy5yZXNvbHZlPV9jdHgoJHJlc29sdmUsZSwxKSx0aGlzLnJlamVjdD1fY3R4KCRyZWplY3QsZSwxKX0sX25ld1Byb21pc2VDYXBhYmlsaXR5LmY9bmV3UHJvbWlzZUNhcGFiaWxpdHk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT0kUHJvbWlzZXx8ZT09PVdyYXBwZXI/bmV3IE93blByb21pc2VDYXBhYmlsaXR5KGUpOm5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShlKX0pLF9leHBvcnQoX2V4cG9ydC5HK19leHBvcnQuVytfZXhwb3J0LkYqIVVTRV9OQVRJVkUse1Byb21pc2U6JFByb21pc2V9KSxfc2V0VG9TdHJpbmdUYWcoJFByb21pc2UsUFJPTUlTRSksX3NldFNwZWNpZXMoUFJPTUlTRSksV3JhcHBlcj1fY29yZVtQUk9NSVNFXSxfZXhwb3J0KF9leHBvcnQuUytfZXhwb3J0LkYqIVVTRV9OQVRJVkUsUFJPTUlTRSx7cmVqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0PW5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO3JldHVybigwLHQucmVqZWN0KShlKSx0LnByb21pc2V9fSksX2V4cG9ydChfZXhwb3J0LlMrX2V4cG9ydC5GKihfbGlicmFyeXx8IVVTRV9OQVRJVkUpLFBST01JU0Use3Jlc29sdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIF9wcm9taXNlUmVzb2x2ZShfbGlicmFyeSYmdGhpcz09PVdyYXBwZXI/JFByb21pc2U6dGhpcyxlKX19KSxfZXhwb3J0KF9leHBvcnQuUytfZXhwb3J0LkYqIShVU0VfTkFUSVZFJiZfaXRlckRldGVjdChmdW5jdGlvbihlKXskUHJvbWlzZS5hbGwoZSkuY2F0Y2goZW1wdHkpfSkpLFBST01JU0Use2FsbDpmdW5jdGlvbihlKXt2YXIgYT10aGlzLHQ9bmV3UHJvbWlzZUNhcGFiaWxpdHkoYSkscz10LnJlc29sdmUsYz10LnJlamVjdCxuPV9wZXJmb3JtKGZ1bmN0aW9uKCl7dmFyIHI9W10saT0wLG89MTtfZm9yT2YoZSwhMSxmdW5jdGlvbihlKXt2YXIgdD1pKyssbj0hMTtyLnB1c2godm9pZCAwKSxvKyssYS5yZXNvbHZlKGUpLnRoZW4oZnVuY3Rpb24oZSl7bnx8KG49ITAsclt0XT1lLC0tb3x8cyhyKSl9LGMpfSksLS1vfHxzKHIpfSk7cmV0dXJuIG4uZSYmYyhuLnYpLHQucHJvbWlzZX0scmFjZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49bmV3UHJvbWlzZUNhcGFiaWxpdHkodCkscj1uLnJlamVjdCxpPV9wZXJmb3JtKGZ1bmN0aW9uKCl7X2Zvck9mKGUsITEsZnVuY3Rpb24oZSl7dC5yZXNvbHZlKGUpLnRoZW4obi5yZXNvbHZlLHIpfSl9KTtyZXR1cm4gaS5lJiZyKGkudiksbi5wcm9taXNlfX0pO3ZhciAkaW5jbHVkZXM9X2FycmF5SW5jbHVkZXMoITApO19leHBvcnQoX2V4cG9ydC5QLCJBcnJheSIse2luY2x1ZGVzOmZ1bmN0aW9uKGUpe3JldHVybiAkaW5jbHVkZXModGhpcyxlLDE8YXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMV06dm9pZCAwKX19KSxfYWRkVG9VbnNjb3BhYmxlcygiaW5jbHVkZXMiKTt2YXIgaXNFbnVtPV9vYmplY3RQaWUuZixfb2JqZWN0VG9BcnJheT1mdW5jdGlvbihzKXtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49X3RvSW9iamVjdChlKSxyPV9vYmplY3RLZXlzKG4pLGk9ci5sZW5ndGgsbz0wLGE9W107bzxpOylpc0VudW0uY2FsbChuLHQ9cltvKytdKSYmYS5wdXNoKHM/W3Qsblt0XV06blt0XSk7cmV0dXJuIGF9fSwkdmFsdWVzPV9vYmplY3RUb0FycmF5KCExKTtfZXhwb3J0KF9leHBvcnQuUywiT2JqZWN0Iix7dmFsdWVzOmZ1bmN0aW9uKGUpe3JldHVybiAkdmFsdWVzKGUpfX0pO3ZhciBvcmlnaW5hbENvbnNvbGU9Z2xvYmFsLmNvbnNvbGU7ZnVuY3Rpb24gc2V0TmF0aXZlQ29uc29sZSgpe2lmKGdlbmVyYXRlTGV2ZWxNYXAoKSxnbG9iYWwuV1hFbnZpcm9ubWVudCYmIldlYiIhPT1nbG9iYWwuV1hFbnZpcm9ubWVudC5wbGF0Zm9ybSlnbG9iYWwuY29uc29sZT17ZGVidWc6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiZGVidWciKSYmZ2xvYmFsLm5hdGl2ZUxvZy5hcHBseShnbG9iYWwsZm9ybWF0KGUpLmNvbmNhdChbIl9fREVCVUciXSkpfSxsb2c6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgibG9nIikmJmdsb2JhbC5uYXRpdmVMb2cuYXBwbHkoZ2xvYmFsLGZvcm1hdChlKS5jb25jYXQoWyJfX0xPRyJdKSl9LGluZm86ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiaW5mbyIpJiZnbG9iYWwubmF0aXZlTG9nLmFwcGx5KGdsb2JhbCxmb3JtYXQoZSkuY29uY2F0KFsiX19JTkZPIl0pKX0sd2FybjpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJ3YXJuIikmJmdsb2JhbC5uYXRpdmVMb2cuYXBwbHkoZ2xvYmFsLGZvcm1hdChlKS5jb25jYXQoWyJfX1dBUk4iXSkpfSxlcnJvcjpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJlcnJvciIpJiZnbG9iYWwubmF0aXZlTG9nLmFwcGx5KGdsb2JhbCxmb3JtYXQoZSkuY29uY2F0KFsiX19FUlJPUiJdKSl9fTtlbHNle3ZhciBlPWNvbnNvbGUuZGVidWcsdD1jb25zb2xlLmxvZyxuPWNvbnNvbGUuaW5mbyxyPWNvbnNvbGUud2FybixpPWNvbnNvbGUuZXJyb3I7Y29uc29sZS5fX29yaV9fPXtkZWJ1ZzplLGxvZzp0LGluZm86bix3YXJuOnIsZXJyb3I6aX0sY29uc29sZS5kZWJ1Zz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJkZWJ1ZyIpJiZjb25zb2xlLl9fb3JpX18uZGVidWcuYXBwbHkoY29uc29sZSxlKX0sY29uc29sZS5sb2c9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgibG9nIikmJmNvbnNvbGUuX19vcmlfXy5sb2cuYXBwbHkoY29uc29sZSxlKX0sY29uc29sZS5pbmZvPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImluZm8iKSYmY29uc29sZS5fX29yaV9fLmluZm8uYXBwbHkoY29uc29sZSxlKX0sY29uc29sZS53YXJuPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoIndhcm4iKSYmY29uc29sZS5fX29yaV9fLndhcm4uYXBwbHkoY29uc29sZSxlKX0sY29uc29sZS5lcnJvcj1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJlcnJvciIpJiZjb25zb2xlLl9fb3JpX18uZXJyb3IuYXBwbHkoY29uc29sZSxlKX19fWZ1bmN0aW9uIGZvcm1hdChlKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGU9IltvYmplY3Qgb2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkudG9Mb3dlckNhc2UoKT9KU09OLnN0cmluZ2lmeShlKTpTdHJpbmcoZSl9KX12YXIgb3JpZ2luYWxTZXRUaW1lb3V0PWdsb2JhbC5zZXRUaW1lb3V0LHNldFRpbWVvdXROYXRpdmU9Z2xvYmFsLnNldFRpbWVvdXROYXRpdmU7ZnVuY3Rpb24gc2V0TmF0aXZlVGltZXIoKXtpZih2b2lkIDA9PT1zZXRUaW1lb3V0JiYiZnVuY3Rpb24iPT10eXBlb2Ygc2V0VGltZW91dE5hdGl2ZSl7dmFyIG49e30scj0wO2dsb2JhbC5zZXRUaW1lb3V0PWZ1bmN0aW9uKGUsdCl7blsrK3JdPWUsc2V0VGltZW91dE5hdGl2ZShyLnRvU3RyaW5nKCksdCl9LGdsb2JhbC5zZXRUaW1lb3V0Q2FsbGJhY2s9ZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIG5bZV0mJihuW2VdKCksZGVsZXRlIG5bZV0pfX19c2V0TmF0aXZlVGltZXIoKSwidW5kZWZpbmVkIj09dHlwZW9mIFdYRW52aXJvbm1lbnR8fFdYRW52aXJvbm1lbnQuX19lbmFibGVfbmF0aXZlX3Byb21pc2VfXzt2YXIgZmFjdG9yeT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSxhLHQpe3ZhciBfPU9iamVjdC5mcmVlemUoe30pO2Z1bmN0aW9uIEEoZSl7cmV0dXJuIG51bGw9PWV9ZnVuY3Rpb24gRShlKXtyZXR1cm4gbnVsbCE9ZX1mdW5jdGlvbiBJKGUpe3JldHVybiEwPT09ZX1mdW5jdGlvbiAkKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlfHwic3ltYm9sIj09dHlwZW9mIGV8fCJib29sZWFuIj09dHlwZW9mIGV9ZnVuY3Rpb24gYihlKXtyZXR1cm4gbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZX12YXIgcj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIGQoZSl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1yLmNhbGwoZSl9ZnVuY3Rpb24gaShlKXt2YXIgdD1wYXJzZUZsb2F0KFN0cmluZyhlKSk7cmV0dXJuIDA8PXQmJk1hdGguZmxvb3IodCk9PT10JiZpc0Zpbml0ZShlKX1mdW5jdGlvbiB3KGUpe3JldHVybiBFKGUpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50aGVuJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5jYXRjaH1mdW5jdGlvbiBuKGUpe3JldHVybiBudWxsPT1lPyIiOkFycmF5LmlzQXJyYXkoZSl8fGQoZSkmJmUudG9TdHJpbmc9PT1yP0pTT04uc3RyaW5naWZ5KGUsbnVsbCwyKTpTdHJpbmcoZSl9ZnVuY3Rpb24gbyhlKXt2YXIgdD1wYXJzZUZsb2F0KGUpO3JldHVybiBpc05hTih0KT9lOnR9ZnVuY3Rpb24gcyhlLHQpe2Zvcih2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9ZS5zcGxpdCgiLCIpLGk9MDtpPHIubGVuZ3RoO2krKyluW3JbaV1dPSEwO3JldHVybiB0P2Z1bmN0aW9uKGUpe3JldHVybiBuW2UudG9Mb3dlckNhc2UoKV19OmZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfX1zKCJzbG90LGNvbXBvbmVudCIsITApO3ZhciBsPXMoImtleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzIik7ZnVuY3Rpb24gayhlLHQpe2lmKGUubGVuZ3RoKXt2YXIgbj1lLmluZGV4T2YodCk7aWYoLTE8bilyZXR1cm4gZS5zcGxpY2UobiwxKX19dmFyIGM9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBmKGUsdCl7cmV0dXJuIGMuY2FsbChlLHQpfWZ1bmN0aW9uIHUodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV18fChuW2VdPXQoZSkpfX12YXIgcD0vLShcdykvZyxoPXUoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShwLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOiIifSl9KSx2PXUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pLGc9L1xCKFtBLVpdKS9nLFM9dShmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGcsIi0kMSIpLnRvTG93ZXJDYXNlKCl9KTt2YXIgbT1GdW5jdGlvbi5wcm90b3R5cGUuYmluZD9mdW5jdGlvbihlLHQpe3JldHVybiBlLmJpbmQodCl9OmZ1bmN0aW9uKG4scil7ZnVuY3Rpb24gZShlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoO3JldHVybiB0PzE8dD9uLmFwcGx5KHIsYXJndW1lbnRzKTpuLmNhbGwocixlKTpuLmNhbGwocil9cmV0dXJuIGUuX2xlbmd0aD1uLmxlbmd0aCxlfTtmdW5jdGlvbiB5KGUsdCl7dD10fHwwO2Zvcih2YXIgbj1lLmxlbmd0aC10LHI9bmV3IEFycmF5KG4pO24tLTspcltuXT1lW24rdF07cmV0dXJuIHJ9ZnVuY3Rpb24gTihlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiB4KGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXSYmTih0LGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIEIoZSx0LG4pe312YXIgQz1mdW5jdGlvbihlLHQsbil7cmV0dXJuITF9LFQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9O2Z1bmN0aW9uIE8odCxuKXtpZih0PT09bilyZXR1cm4hMDt2YXIgZT1iKHQpLHI9YihuKTtpZighZXx8IXIpcmV0dXJuIWUmJiFyJiZTdHJpbmcodCk9PT1TdHJpbmcobik7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkodCksbz1BcnJheS5pc0FycmF5KG4pO2lmKGkmJm8pcmV0dXJuIHQubGVuZ3RoPT09bi5sZW5ndGgmJnQuZXZlcnkoZnVuY3Rpb24oZSx0KXtyZXR1cm4gTyhlLG5bdF0pfSk7aWYodCBpbnN0YW5jZW9mIERhdGUmJm4gaW5zdGFuY2VvZiBEYXRlKXJldHVybiB0LmdldFRpbWUoKT09PW4uZ2V0VGltZSgpO2lmKGl8fG8pcmV0dXJuITE7dmFyIGE9T2JqZWN0LmtleXModCkscz1PYmplY3Qua2V5cyhuKTtyZXR1cm4gYS5sZW5ndGg9PT1zLmxlbmd0aCYmYS5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4gTyh0W2VdLG5bZV0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIFAoZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihPKGVbbl0sdCkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gRChlKXt2YXIgdD0hMTtyZXR1cm4gZnVuY3Rpb24oKXt0fHwodD0hMCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciBNPSJkYXRhLXNlcnZlci1yZW5kZXJlZCIsaj1bImNvbXBvbmVudCIsImRpcmVjdGl2ZSIsImZpbHRlciJdLEw9WyJiZWZvcmVDcmVhdGUiLCJjcmVhdGVkIiwiYmVmb3JlTW91bnQiLCJtb3VudGVkIiwiYmVmb3JlVXBkYXRlIiwidXBkYXRlZCIsImJlZm9yZURlc3Ryb3kiLCJkZXN0cm95ZWQiLCJhY3RpdmF0ZWQiLCJkZWFjdGl2YXRlZCIsImVycm9yQ2FwdHVyZWQiLCJzZXJ2ZXJQcmVmZXRjaCJdLFI9e29wdGlvbk1lcmdlU3RyYXRlZ2llczpPYmplY3QuY3JlYXRlKG51bGwpLHNpbGVudDohMSxwcm9kdWN0aW9uVGlwOiExLGRldnRvb2xzOiExLHBlcmZvcm1hbmNlOiExLGVycm9ySGFuZGxlcjpudWxsLHdhcm5IYW5kbGVyOm51bGwsaWdub3JlZEVsZW1lbnRzOltdLGtleUNvZGVzOk9iamVjdC5jcmVhdGUobnVsbCksaXNSZXNlcnZlZFRhZzpDLGlzUmVzZXJ2ZWRBdHRyOkMsaXNVbmtub3duRWxlbWVudDpDLGdldFRhZ05hbWVzcGFjZTpCLHBhcnNlUGxhdGZvcm1UYWdOYW1lOlQsbXVzdFVzZVByb3A6Qyxhc3luYzohMCxfbGlmZWN5Y2xlSG9va3M6TH07ZnVuY3Rpb24gRihlLHQsbixyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ISFyLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pfXZhciBVPW5ldyBSZWdFeHAoIlteIisvYS16QS1aXHUwMEI3XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwM0YtXHUyMDQwXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkQvLnNvdXJjZSsiLiRfXFxkXSIpO3ZhciB6LFY9Il9fcHJvdG9fXyJpbnt9LHE9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3csVz0idW5kZWZpbmVkIiE9dHlwZW9mIFdYRW52aXJvbm1lbnQmJiEhV1hFbnZpcm9ubWVudC5wbGF0Zm9ybSxIPVcmJldYRW52aXJvbm1lbnQucGxhdGZvcm0udG9Mb3dlckNhc2UoKSxHPXEmJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksSj1HJiYvbXNpZXx0cmlkZW50Ly50ZXN0KEcpLFg9RyYmMDxHLmluZGV4T2YoIm1zaWUgOS4wIiksWT1HJiYwPEcuaW5kZXhPZigiZWRnZS8iKSxLPShHJiZHLmluZGV4T2YoImFuZHJvaWQiKSxHJiYvaXBob25lfGlwYWR8aXBvZHxpb3MvLnRlc3QoRyksRyYmL2Nocm9tZVwvXGQrLy50ZXN0KEcpLEcmJi9waGFudG9tanMvLnRlc3QoRyksRyYmRy5tYXRjaCgvZmlyZWZveFwvKFxkKykvKSx7fS53YXRjaCk7aWYocSl0cnl7dmFyIFo9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFosInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXt9fSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRlc3QtcGFzc2l2ZSIsbnVsbCxaKX1jYXRjaChlKXt9dmFyIFE9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09eiYmKHo9IXEmJiFXJiZ2b2lkIDAhPT1nbG9iYWwmJihnbG9iYWwucHJvY2VzcyYmInNlcnZlciI9PT1nbG9iYWwucHJvY2Vzcy5lbnYuVlVFX0VOVikpLHp9LGVlPXEmJndpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO2Z1bmN0aW9uIHRlKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYvbmF0aXZlIGNvZGUvLnRlc3QoZS50b1N0cmluZygpKX12YXIgbmUscmU9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJnRlKFN5bWJvbCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmdGUoUmVmbGVjdC5vd25LZXlzKTtuZT0idW5kZWZpbmVkIiE9dHlwZW9mIFNldCYmdGUoU2V0KT9TZXQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX1yZXR1cm4gZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiEwPT09dGhpcy5zZXRbZV19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLnNldFtlXT0hMH0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfSxlfSgpO3ZhciBpZT1CLG9lPTAsYWU9ZnVuY3Rpb24oKXt0aGlzLmlkPXZvaWQgMCE9PXQ/dC51aWQrKzpvZSsrLHRoaXMuc3Vicz1bXX07ZnVuY3Rpb24gc2UoZSl7YWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrLnB1c2goZSksYWUuU2hhcmVkT2JqZWN0LnRhcmdldD1lfWZ1bmN0aW9uIGNlKCl7YWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrLnBvcCgpLGFlLlNoYXJlZE9iamVjdC50YXJnZXQ9YWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrW2FlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5sZW5ndGgtMV19YWUucHJvdG90eXBlLmFkZFN1Yj1mdW5jdGlvbihlKXt0aGlzLnN1YnMucHVzaChlKX0sYWUucHJvdG90eXBlLnJlbW92ZVN1Yj1mdW5jdGlvbihlKXtrKHRoaXMuc3VicyxlKX0sYWUucHJvdG90eXBlLmRlcGVuZD1mdW5jdGlvbigpe2FlLlNoYXJlZE9iamVjdC50YXJnZXQmJmFlLlNoYXJlZE9iamVjdC50YXJnZXQuYWRkRGVwKHRoaXMpfSxhZS5wcm90b3R5cGUubm90aWZ5PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuc3Vicy5zbGljZSgpLHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspZVt0XS51cGRhdGUoKX0sYWUuU2hhcmVkT2JqZWN0PXZvaWQgMCE9PXQ/dDp7fSxhZS5TaGFyZWRPYmplY3QudGFyZ2V0PW51bGwsYWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrPVtdO3ZhciB1ZT1mdW5jdGlvbihlLHQsbixyLGksbyxhLHMpe3QmJkFycmF5LmlzQXJyYXkodC5jbGFzcykmJih0LmNsYXNzPXQuY2xhc3Muc2xpY2UoMCkpLHRoaXMudGFnPWUsdGhpcy5kYXRhPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMudGV4dD1yLHRoaXMuZWxtPWksdGhpcy5ucz12b2lkIDAsdGhpcy5jb250ZXh0PW8sdGhpcy5mbkNvbnRleHQ9dm9pZCAwLHRoaXMuZm5PcHRpb25zPXZvaWQgMCx0aGlzLmZuU2NvcGVJZD12b2lkIDAsdGhpcy5rZXk9dCYmdC5rZXksdGhpcy5jb21wb25lbnRPcHRpb25zPWEsdGhpcy5jb21wb25lbnRJbnN0YW5jZT12b2lkIDAsdGhpcy5wYXJlbnQ9dm9pZCAwLHRoaXMucmF3PSExLHRoaXMuaXNTdGF0aWM9ITEsdGhpcy5pc1Jvb3RJbnNlcnQ9ITAsdGhpcy5pc0NvbW1lbnQ9ITEsdGhpcy5pc0Nsb25lZD0hMSx0aGlzLmlzT25jZT0hMSx0aGlzLmFzeW5jRmFjdG9yeT1zLHRoaXMuYXN5bmNNZXRhPXZvaWQgMCx0aGlzLmlzQXN5bmNQbGFjZWhvbGRlcj0hMX0sbGU9e2NoaWxkOntjb25maWd1cmFibGU6ITB9fTtsZS5jaGlsZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXModWUucHJvdG90eXBlLGxlKTt2YXIgZGU9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9IiIpO3ZhciB0PW5ldyB1ZTtyZXR1cm4gdC50ZXh0PWUsdC5pc0NvbW1lbnQ9ITAsdH07ZnVuY3Rpb24gZmUoZSl7cmV0dXJuIG5ldyB1ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCxTdHJpbmcoZSkpfWZ1bmN0aW9uIHBlKGUpe3ZhciB0PW5ldyB1ZShlLnRhZyxlLmRhdGEsZS5jaGlsZHJlbiYmZS5jaGlsZHJlbi5zbGljZSgpLGUudGV4dCxlLmVsbSxlLmNvbnRleHQsZS5jb21wb25lbnRPcHRpb25zLGUuYXN5bmNGYWN0b3J5KTtyZXR1cm4gdC5ucz1lLm5zLHQuaXNTdGF0aWM9ZS5pc1N0YXRpYyx0LmtleT1lLmtleSx0LmlzQ29tbWVudD1lLmlzQ29tbWVudCx0LmZuQ29udGV4dD1lLmZuQ29udGV4dCx0LmZuT3B0aW9ucz1lLmZuT3B0aW9ucyx0LmZuU2NvcGVJZD1lLmZuU2NvcGVJZCx0LmFzeW5jTWV0YT1lLmFzeW5jTWV0YSx0LmlzQ2xvbmVkPSEwLHR9dmFyIGhlPUFycmF5LnByb3RvdHlwZSx2ZT1PYmplY3QuY3JlYXRlKGhlKTtbInB1c2giLCJwb3AiLCJzaGlmdCIsInVuc2hpZnQiLCJzcGxpY2UiLCJzb3J0IiwicmV2ZXJzZSJdLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIHM9aGVbYV07Rih2ZSxhLGZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTt2YXIgcixpPXMuYXBwbHkodGhpcyx0KSxvPXRoaXMuX19vYl9fO3N3aXRjaChhKXtjYXNlInB1c2giOmNhc2UidW5zaGlmdCI6cj10O2JyZWFrO2Nhc2Uic3BsaWNlIjpyPXQuc2xpY2UoMil9cmV0dXJuIHImJm8ub2JzZXJ2ZUFycmF5KHIpLG8uZGVwLm5vdGlmeSgpLGl9KX0pO3ZhciBnZT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2ZSksbWU9ITA7ZnVuY3Rpb24geWUoZSl7bWU9ZX12YXIgX2U9ZnVuY3Rpb24oZSl7dmFyIHQ7dGhpcy52YWx1ZT1lLHRoaXMuZGVwPW5ldyBhZSx0aGlzLnZtQ291bnQ9MCxGKGUsIl9fb2JfXyIsdGhpcyksQXJyYXkuaXNBcnJheShlKT8oVj8odD12ZSxlLl9fcHJvdG9fXz10KTpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTAsaT1uLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1uW3JdO0YoZSxvLHRbb10pfX0oZSx2ZSxnZSksdGhpcy5vYnNlcnZlQXJyYXkoZSkpOnRoaXMud2FsayhlKX07ZnVuY3Rpb24gYmUoZSx0KXt2YXIgbjtpZihiKGUpJiYhKGUgaW5zdGFuY2VvZiB1ZSkpcmV0dXJuIGYoZSwiX19vYl9fIikmJmUuX19vYl9fIGluc3RhbmNlb2YgX2U/bj1lLl9fb2JfXzptZSYmIVEoKSYmKEFycmF5LmlzQXJyYXkoZSl8fGQoZSkpJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYhZS5faXNWdWUmJihuPW5ldyBfZShlKSksdCYmbiYmbi52bUNvdW50Kyssbn1mdW5jdGlvbiB3ZShuLGUscix0LGkpe3ZhciBvPW5ldyBhZSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKTtpZighYXx8ITEhPT1hLmNvbmZpZ3VyYWJsZSl7dmFyIHM9YSYmYS5nZXQsYz1hJiZhLnNldDtzJiYhY3x8MiE9PWFyZ3VtZW50cy5sZW5ndGh8fChyPW5bZV0pO3ZhciB1PSFpJiZiZShyKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobixlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgZT1zP3MuY2FsbChuKTpyO3JldHVybiBhZS5TaGFyZWRPYmplY3QudGFyZ2V0JiYoby5kZXBlbmQoKSx1JiYodS5kZXAuZGVwZW5kKCksQXJyYXkuaXNBcnJheShlKSYmZnVuY3Rpb24gZSh0KXtmb3IodmFyIG49dm9pZCAwLHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspKG49dFtyXSkmJm4uX19vYl9fJiZuLl9fb2JfXy5kZXAuZGVwZW5kKCksQXJyYXkuaXNBcnJheShuKSYmZShuKX0oZSkpKSxlfSxzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9cz9zLmNhbGwobik6cjtlPT09dHx8ZSE9ZSYmdCE9dHx8cyYmIWN8fChjP2MuY2FsbChuLGUpOnI9ZSx1PSFpJiZiZShlKSxvLm5vdGlmeSgpKX19KX19ZnVuY3Rpb24ga2UoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkmJmkodCkpcmV0dXJuIGUubGVuZ3RoPU1hdGgubWF4KGUubGVuZ3RoLHQpLGUuc3BsaWNlKHQsMSxuKSxuO2lmKHQgaW4gZSYmISh0IGluIE9iamVjdC5wcm90b3R5cGUpKXJldHVybiBlW3RdPW47dmFyIHI9ZS5fX29iX187cmV0dXJuIGUuX2lzVnVlfHxyJiZyLnZtQ291bnQ/bjpyPyh3ZShyLnZhbHVlLHQsbiksci5kZXAubm90aWZ5KCksbik6ZVt0XT1ufWZ1bmN0aW9uIFNlKGUsdCl7aWYoQXJyYXkuaXNBcnJheShlKSYmaSh0KSllLnNwbGljZSh0LDEpO2Vsc2V7dmFyIG49ZS5fX29iX187ZS5faXNWdWV8fG4mJm4udm1Db3VudHx8ZihlLHQpJiYoZGVsZXRlIGVbdF0sbiYmbi5kZXAubm90aWZ5KCkpfX1fZS5wcm90b3R5cGUud2Fsaz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7bisrKXdlKGUsdFtuXSl9LF9lLnByb3RvdHlwZS5vYnNlcnZlQXJyYXk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKWJlKGVbdF0pfTt2YXIgeGU9Ui5vcHRpb25NZXJnZVN0cmF0ZWdpZXM7ZnVuY3Rpb24gQ2UoZSx0KXtpZighdClyZXR1cm4gZTtmb3IodmFyIG4scixpLG89cmU/UmVmbGVjdC5vd25LZXlzKHQpOk9iamVjdC5rZXlzKHQpLGE9MDthPG8ubGVuZ3RoO2ErKykiX19vYl9fIiE9PShuPW9bYV0pJiYocj1lW25dLGk9dFtuXSxmKGUsbik/ciE9PWkmJmQocikmJmQoaSkmJkNlKHIsaSk6a2UoZSxuLGkpKTtyZXR1cm4gZX1mdW5jdGlvbiBUZShuLHIsaSl7cmV0dXJuIGk/ZnVuY3Rpb24oKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmNhbGwoaSxpKTpyLHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5jYWxsKGksaSk6bjtyZXR1cm4gZT9DZShlLHQpOnR9OnI/bj9mdW5jdGlvbigpe3JldHVybiBDZSgiZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmNhbGwodGhpcyx0aGlzKTpyLCJmdW5jdGlvbiI9PXR5cGVvZiBuP24uY2FsbCh0aGlzLHRoaXMpOm4pfTpyOm59ZnVuY3Rpb24gT2UoZSx0KXt2YXIgbj10P2U/ZS5jb25jYXQodCk6QXJyYXkuaXNBcnJheSh0KT90Olt0XTplO3JldHVybiBuP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspLTE9PT10LmluZGV4T2YoZVtuXSkmJnQucHVzaChlW25dKTtyZXR1cm4gdH0obik6bn1mdW5jdGlvbiBBZShlLHQsbixyKXt2YXIgaT1PYmplY3QuY3JlYXRlKGV8fG51bGwpO3JldHVybiB0P04oaSx0KTppfXhlLmRhdGE9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuP1RlKGUsdCxuKTp0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOlRlKGUsdCl9LEwuZm9yRWFjaChmdW5jdGlvbihlKXt4ZVtlXT1PZX0pLGouZm9yRWFjaChmdW5jdGlvbihlKXt4ZVtlKyJzIl09QWV9KSx4ZS53YXRjaD1mdW5jdGlvbihlLHQsbixyKXtpZihlPT09SyYmKGU9dm9pZCAwKSx0PT09SyYmKHQ9dm9pZCAwKSwhdClyZXR1cm4gT2JqZWN0LmNyZWF0ZShlfHxudWxsKTtpZighZSlyZXR1cm4gdDt2YXIgaT17fTtmb3IodmFyIG8gaW4gTihpLGUpLHQpe3ZhciBhPWlbb10scz10W29dO2EmJiFBcnJheS5pc0FycmF5KGEpJiYoYT1bYV0pLGlbb109YT9hLmNvbmNhdChzKTpBcnJheS5pc0FycmF5KHMpP3M6W3NdfXJldHVybiBpfSx4ZS5wcm9wcz14ZS5tZXRob2RzPXhlLmluamVjdD14ZS5jb21wdXRlZD1mdW5jdGlvbihlLHQsbixyKXtpZighZSlyZXR1cm4gdDt2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBOKGksZSksdCYmTihpLHQpLGl9LHhlLnByb3ZpZGU9VGU7dmFyIEVlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/ZTp0fTtmdW5jdGlvbiBJZShuLHIsaSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHImJihyPXIub3B0aW9ucyksZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnByb3BzO2lmKG4pe3ZhciByLGksbz17fTtpZihBcnJheS5pc0FycmF5KG4pKWZvcihyPW4ubGVuZ3RoO3ItLTspInN0cmluZyI9PXR5cGVvZihpPW5bcl0pJiYob1toKGkpXT17dHlwZTpudWxsfSk7ZWxzZSBpZihkKG4pKWZvcih2YXIgYSBpbiBuKWk9blthXSxvW2goYSldPWQoaSk/aTp7dHlwZTppfTtlLnByb3BzPW99fShyKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUuaW5qZWN0O2lmKG4pe3ZhciByPWUuaW5qZWN0PXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspcltuW2ldXT17ZnJvbTpuW2ldfTtlbHNlIGlmKGQobikpZm9yKHZhciBvIGluIG4pe3ZhciBhPW5bb107cltvXT1kKGEpP04oe2Zyb206b30sYSk6e2Zyb206YX19fX0ociksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kaXJlY3RpdmVzO2lmKHQpZm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07ImZ1bmN0aW9uIj09dHlwZW9mIHImJih0W25dPXtiaW5kOnIsdXBkYXRlOnJ9KX19KHIpLCFyLl9iYXNlJiYoci5leHRlbmRzJiYobj1JZShuLHIuZXh0ZW5kcyxpKSksci5taXhpbnMpKWZvcih2YXIgZT0wLHQ9ci5taXhpbnMubGVuZ3RoO2U8dDtlKyspbj1JZShuLHIubWl4aW5zW2VdLGkpO3ZhciBvLGE9e307Zm9yKG8gaW4gbilzKG8pO2ZvcihvIGluIHIpZihuLG8pfHxzKG8pO2Z1bmN0aW9uIHMoZSl7dmFyIHQ9eGVbZV18fEVlO2FbZV09dChuW2VdLHJbZV0saSxlKX1yZXR1cm4gYX1mdW5jdGlvbiAkZShlLHQsbixyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBpPWVbdF07aWYoZihpLG4pKXJldHVybiBpW25dO3ZhciBvPWgobik7aWYoZihpLG8pKXJldHVybiBpW29dO3ZhciBhPXYobyk7cmV0dXJuIGYoaSxhKT9pW2FdOmlbbl18fGlbb118fGlbYV19fWZ1bmN0aW9uIFBlKGUsdCxuLHIpe3ZhciBpPXRbZV0sbz0hZihuLGUpLGE9bltlXSxzPUxlKEJvb2xlYW4saS50eXBlKTtpZigtMTxzKWlmKG8mJiFmKGksImRlZmF1bHQiKSlhPSExO2Vsc2UgaWYoIiI9PT1hfHxhPT09UyhlKSl7dmFyIGM9TGUoU3RyaW5nLGkudHlwZSk7KGM8MHx8czxjKSYmKGE9ITApfWlmKHZvaWQgMD09PWEpe2E9ZnVuY3Rpb24oZSx0LG4pe2lmKCFmKHQsImRlZmF1bHQiKSlyZXR1cm47dmFyIHI9dC5kZWZhdWx0O2lmKGUmJmUuJG9wdGlvbnMucHJvcHNEYXRhJiZ2b2lkIDA9PT1lLiRvcHRpb25zLnByb3BzRGF0YVtuXSYmdm9pZCAwIT09ZS5fcHJvcHNbbl0pcmV0dXJuIGUuX3Byb3BzW25dO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiByJiYiRnVuY3Rpb24iIT09TWUodC50eXBlKT9yLmNhbGwoZSk6cn0ocixpLGUpO3ZhciB1PW1lO3llKCEwKSxiZShhKSx5ZSh1KX1yZXR1cm4gYX1mdW5jdGlvbiBNZShlKXt2YXIgdD1lJiZlLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvbiAoXHcrKS8pO3JldHVybiB0P3RbMV06IiJ9ZnVuY3Rpb24gamUoZSx0KXtyZXR1cm4gTWUoZSk9PT1NZSh0KX1mdW5jdGlvbiBMZShlLHQpe2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBqZSh0LGUpPzA6LTE7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKGplKHRbbl0sZSkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gTmUoZSx0LG4pe3NlKCk7dHJ5e2lmKHQpZm9yKHZhciByPXQ7cj1yLiRwYXJlbnQ7KXt2YXIgaT1yLiRvcHRpb25zLmVycm9yQ2FwdHVyZWQ7aWYoaSlmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl0cnl7aWYoITE9PT1pW29dLmNhbGwocixlLHQsbikpcmV0dXJufWNhdGNoKGUpe0RlKGUsciwiZXJyb3JDYXB0dXJlZCBob29rIil9fURlKGUsdCxuKX1maW5hbGx5e2NlKCl9fWZ1bmN0aW9uIEJlKGUsdCxuLHIsaSl7dmFyIG87dHJ5eyhvPW4/ZS5hcHBseSh0LG4pOmUuY2FsbCh0KSkmJiFvLl9pc1Z1ZSYmdyhvKSYmIW8uX2hhbmRsZWQmJihvLmNhdGNoKGZ1bmN0aW9uKGUpe3JldHVybiBOZShlLHIsaSsiIChQcm9taXNlL2FzeW5jKSIpfSksby5faGFuZGxlZD0hMCl9Y2F0Y2goZSl7TmUoZSxyLGkpfXJldHVybiBvfWZ1bmN0aW9uIERlKHQsZSxuKXtpZihSLmVycm9ySGFuZGxlcil0cnl7cmV0dXJuIFIuZXJyb3JIYW5kbGVyLmNhbGwobnVsbCx0LGUsbil9Y2F0Y2goZSl7ZSE9PXQmJlJlKGUsbnVsbCwiY29uZmlnLmVycm9ySGFuZGxlciIpfVJlKHQsZSxuKX1mdW5jdGlvbiBSZShlLHQsbil7aWYoIXEmJiFXfHwidW5kZWZpbmVkIj09dHlwZW9mIGNvbnNvbGUpdGhyb3cgZTtjb25zb2xlLmVycm9yKGUpfXZhciBGZT1bXSxVZT0hMTtmdW5jdGlvbiB6ZSgpe1VlPSExO2Zvcih2YXIgZT1GZS5zbGljZSgwKSx0PUZlLmxlbmd0aD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0oKX12YXIgVmU9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KHplLDApfTtmdW5jdGlvbiBxZShlLHQpe3ZhciBuO2lmKEZlLnB1c2goZnVuY3Rpb24oKXtpZihlKXRyeXtlLmNhbGwodCl9Y2F0Y2goZSl7TmUoZSx0LCJuZXh0VGljayIpfWVsc2UgbiYmbih0KX0pLFVlfHwoVWU9ITAsVmUoKSksIWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSlyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7bj1lfSl9dmFyIFdlPW5ldyBuZTtmdW5jdGlvbiBIZShlKXshZnVuY3Rpb24gZSh0LG4pe3ZhciByLGk7dmFyIG89QXJyYXkuaXNBcnJheSh0KTtpZighbyYmIWIodCl8fE9iamVjdC5pc0Zyb3plbih0KXx8dCBpbnN0YW5jZW9mIHVlKXJldHVybjtpZih0Ll9fb2JfXyl7dmFyIGE9dC5fX29iX18uZGVwLmlkO2lmKG4uaGFzKGEpKXJldHVybjtuLmFkZChhKX1pZihvKWZvcihyPXQubGVuZ3RoO3ItLTspZSh0W3JdLG4pO2Vsc2UgZm9yKGk9T2JqZWN0LmtleXModCkscj1pLmxlbmd0aDtyLS07KWUodFtpW3JdXSxuKX0oZSxXZSksV2UuY2xlYXIoKX12YXIgR2U9dShmdW5jdGlvbihlKXt2YXIgdD0iJiI9PT1lLmNoYXJBdCgwKSxuPSJ+Ij09PShlPXQ/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCkscj0iISI9PT0oZT1uP2Uuc2xpY2UoMSk6ZSkuY2hhckF0KDApO3JldHVybntuYW1lOmU9cj9lLnNsaWNlKDEpOmUsb25jZTpuLGNhcHR1cmU6cixwYXNzaXZlOnR9fSk7ZnVuY3Rpb24gSmUoZSxpKXtmdW5jdGlvbiBvKCl7dmFyIGU9YXJndW1lbnRzLHQ9by5mbnM7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIEJlKHQsbnVsbCxhcmd1bWVudHMsaSwidi1vbiBoYW5kbGVyIik7Zm9yKHZhciBuPXQuc2xpY2UoKSxyPTA7cjxuLmxlbmd0aDtyKyspQmUobltyXSxudWxsLGUsaSwidi1vbiBoYW5kbGVyIil9cmV0dXJuIG8uZm5zPWUsb31mdW5jdGlvbiBYZShlLHQsbixyLGksbyl7dmFyIGEscyxjLHUsbDtmb3IoYSBpbiBlKXM9Yz1lW2FdLHU9dFthXSxsPUdlKGEpLGQocykmJihjPXMuaGFuZGxlcixsLnBhcmFtcz1zLnBhcmFtcyksQShjKXx8KEEodSk/KEEoYy5mbnMpJiYoYz1lW2FdPUplKGMsbykpLEkobC5vbmNlKSYmKGM9ZVthXT1pKGwubmFtZSxjLGwuY2FwdHVyZSkpLG4obC5uYW1lLGMsbC5jYXB0dXJlLGwucGFzc2l2ZSxsLnBhcmFtcykpOmMhPT11JiYodS5mbnM9YyxlW2FdPXUpKTtmb3IoYSBpbiB0KUEoZVthXSkmJnIoKGw9R2UoYSkpLm5hbWUsdFthXSxsLmNhcHR1cmUpfWZ1bmN0aW9uIFllKGUsdCxuKXt2YXIgcjtlIGluc3RhbmNlb2YgdWUmJihlPWUuZGF0YS5ob29rfHwoZS5kYXRhLmhvb2s9e30pKTt2YXIgaT1lW3RdO2Z1bmN0aW9uIG8oKXtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxrKHIuZm5zLG8pfUEoaSk/cj1KZShbb10pOkUoaS5mbnMpJiZJKGkubWVyZ2VkKT8ocj1pKS5mbnMucHVzaChvKTpyPUplKFtpLG9dKSxyLm1lcmdlZD0hMCxlW3RdPXJ9ZnVuY3Rpb24gS2UoZSx0LG4scixpKXtpZihFKHQpKXtpZihmKHQsbikpcmV0dXJuIGVbbl09dFtuXSxpfHxkZWxldGUgdFtuXSwhMDtpZihmKHQscikpcmV0dXJuIGVbbl09dFtyXSxpfHxkZWxldGUgdFtyXSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBaZShlKXtyZXR1cm4gJChlKT9bZmUoZSldOkFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24gZSh0LG4pe3ZhciByPVtdO3ZhciBpLG8sYSxzO2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspQShvPXRbaV0pfHwiYm9vbGVhbiI9PXR5cGVvZiBvfHwoYT1yLmxlbmd0aC0xLHM9clthXSxBcnJheS5pc0FycmF5KG8pPzA8by5sZW5ndGgmJihRZSgobz1lKG8sKG58fCIiKSsiXyIraSkpWzBdKSYmUWUocykmJihyW2FdPWZlKHMudGV4dCtvWzBdLnRleHQpLG8uc2hpZnQoKSksci5wdXNoLmFwcGx5KHIsbykpOiQobyk/UWUocyk/clthXT1mZShzLnRleHQrbyk6IiIhPT1vJiZyLnB1c2goZmUobykpOlFlKG8pJiZRZShzKT9yW2FdPWZlKHMudGV4dCtvLnRleHQpOihJKHQuX2lzVkxpc3QpJiZFKG8udGFnKSYmQShvLmtleSkmJkUobikmJihvLmtleT0iX192bGlzdCIrbisiXyIraSsiX18iKSxyLnB1c2gobykpKTtyZXR1cm4gcn0oZSk6dm9pZCAwfWZ1bmN0aW9uIFFlKGUpe3JldHVybiBFKGUpJiZFKGUudGV4dCkmJiExPT09ZS5pc0NvbW1lbnR9ZnVuY3Rpb24gZXQoZSl7dmFyIHQ9ZS4kb3B0aW9ucy5wcm92aWRlO3QmJihlLl9wcm92aWRlZD0iZnVuY3Rpb24iPT10eXBlb2YgdD90LmNhbGwoZSk6dCl9ZnVuY3Rpb24gdHQodCl7dmFyIG49bnQodC4kb3B0aW9ucy5pbmplY3QsdCk7biYmKHllKCExKSxPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3dlKHQsZSxuW2VdKX0pLHllKCEwKSl9ZnVuY3Rpb24gbnQoZSx0KXtpZihlKXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPXJlP1JlZmxlY3Qub3duS2V5cyhlKTpPYmplY3Qua2V5cyhlKSxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPXJbaV07aWYoIl9fb2JfXyIhPT1vKXtmb3IodmFyIGE9ZVtvXS5mcm9tLHM9dDtzOyl7aWYocy5fcHJvdmlkZWQmJmYocy5fcHJvdmlkZWQsYSkpe25bb109cy5fcHJvdmlkZWRbYV07YnJlYWt9cz1zLiRwYXJlbnR9aWYoIXMmJiJkZWZhdWx0ImluIGVbb10pe3ZhciBjPWVbb10uZGVmYXVsdDtuW29dPSJmdW5jdGlvbiI9PXR5cGVvZiBjP2MuY2FsbCh0KTpjfX19cmV0dXJuIG59fWZ1bmN0aW9uIHJ0KGUsdCl7aWYoIWV8fCFlLmxlbmd0aClyZXR1cm57fTtmb3IodmFyIG49e30scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyl7dmFyIG89ZVtyXSxhPW8uZGF0YTtpZihhJiZhLmF0dHJzJiZhLmF0dHJzLnNsb3QmJmRlbGV0ZSBhLmF0dHJzLnNsb3Qsby5jb250ZXh0IT09dCYmby5mbkNvbnRleHQhPT10fHwhYXx8bnVsbD09YS5zbG90KW8uYXN5bmNNZXRhJiZvLmFzeW5jTWV0YS5kYXRhJiYicGFnZSI9PT1vLmFzeW5jTWV0YS5kYXRhLnNsb3Q/KG4ucGFnZXx8KG4ucGFnZT1bXSkpLnB1c2gobyk6KG4uZGVmYXVsdHx8KG4uZGVmYXVsdD1bXSkpLnB1c2gobyk7ZWxzZXt2YXIgcz1hLnNsb3QsYz1uW3NdfHwobltzXT1bXSk7InRlbXBsYXRlIj09PW8udGFnP2MucHVzaC5hcHBseShjLG8uY2hpbGRyZW58fFtdKTpjLnB1c2gobyl9fWZvcih2YXIgdSBpbiBuKW5bdV0uZXZlcnkoaXQpJiZkZWxldGUgblt1XTtyZXR1cm4gbn1mdW5jdGlvbiBpdChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJiFlLmFzeW5jRmFjdG9yeXx8IiAiPT09ZS50ZXh0fWZ1bmN0aW9uIG90KGUsdCxuKXt2YXIgcixpPTA8T2JqZWN0LmtleXModCkubGVuZ3RoLG89ZT8hIWUuJHN0YWJsZTohaSxhPWUmJmUuJGtleTtpZihlKXtpZihlLl9ub3JtYWxpemVkKXJldHVybiBlLl9ub3JtYWxpemVkO2lmKG8mJm4mJm4hPT1fJiZhPT09bi4ka2V5JiYhaSYmIW4uJGhhc05vcm1hbClyZXR1cm4gbjtmb3IodmFyIHMgaW4gcj17fSxlKWVbc10mJiIkIiE9PXNbMF0mJihyW3NdPWF0KHQscyxlW3NdKSl9ZWxzZSByPXt9O2Zvcih2YXIgYyBpbiB0KWMgaW4gcnx8KHJbY109c3QodCxjKSk7cmV0dXJuIGUmJk9iamVjdC5pc0V4dGVuc2libGUoZSkmJihlLl9ub3JtYWxpemVkPXIpLEYociwiJHN0YWJsZSIsbyksRihyLCIka2V5IixhKSxGKHIsIiRoYXNOb3JtYWwiLGkpLHJ9ZnVuY3Rpb24gYXQoZSx0LG4pe3ZhciByPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD9uLmFwcGx5KG51bGwsYXJndW1lbnRzKTpuKHt9KTtyZXR1cm4oZT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiFBcnJheS5pc0FycmF5KGUpP1tlXTpaZShlKSkmJigwPT09ZS5sZW5ndGh8fDE9PT1lLmxlbmd0aCYmZVswXS5pc0NvbW1lbnQpP3ZvaWQgMDplfTtyZXR1cm4gbi5wcm94eSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7Z2V0OnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxyfWZ1bmN0aW9uIHN0KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fWZ1bmN0aW9uIGN0KGUsdCl7dmFyIG4scixpLG8sYTtpZihBcnJheS5pc0FycmF5KGUpfHwic3RyaW5nIj09dHlwZW9mIGUpZm9yKG49bmV3IEFycmF5KGUubGVuZ3RoKSxyPTAsaT1lLmxlbmd0aDtyPGk7cisrKW5bcl09dChlW3JdLHIpO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlKWZvcihuPW5ldyBBcnJheShlKSxyPTA7cjxlO3IrKyluW3JdPXQocisxLHIpO2Vsc2UgaWYoYihlKSlpZihyZSYmZVtTeW1ib2wuaXRlcmF0b3JdKXtuPVtdO2Zvcih2YXIgcz1lW1N5bWJvbC5pdGVyYXRvcl0oKSxjPXMubmV4dCgpOyFjLmRvbmU7KW4ucHVzaCh0KGMudmFsdWUsbi5sZW5ndGgpKSxjPXMubmV4dCgpfWVsc2UgZm9yKG89T2JqZWN0LmtleXMoZSksbj1uZXcgQXJyYXkoby5sZW5ndGgpLHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspYT1vW3JdLG5bcl09dChlW2FdLGEscik7cmV0dXJuIEUobil8fChuPVtdKSxuLl9pc1ZMaXN0PSEwLG59ZnVuY3Rpb24gdXQoZSx0LG4scil7dmFyIGksbz10aGlzLiRzY29wZWRTbG90c1tlXTtvPyhuPW58fHt9LHImJihuPU4oTih7fSxyKSxuKSksaT1vKG4pfHx0KTppPXRoaXMuJHNsb3RzW2VdfHx0O3ZhciBhPW4mJm4uc2xvdDtyZXR1cm4gYT90aGlzLiRjcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIse3Nsb3Q6YX0saSk6aX1mdW5jdGlvbiBsdChlKXtyZXR1cm4gJGUodGhpcy4kb3B0aW9ucywiZmlsdGVycyIsZSl8fFR9ZnVuY3Rpb24gZHQoZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8tMT09PWUuaW5kZXhPZih0KTplIT09dH1mdW5jdGlvbiBmdChlLHQsbixyLGkpe3ZhciBvPVIua2V5Q29kZXNbdF18fG47cmV0dXJuIGkmJnImJiFSLmtleUNvZGVzW3RdP2R0KGkscik6bz9kdChvLGUpOnI/UyhyKSE9PXQ6dm9pZCAwfWZ1bmN0aW9uIHB0KGksbyxhLHMsYyl7aWYoYSlpZihiKGEpKXt2YXIgdTtBcnJheS5pc0FycmF5KGEpJiYoYT14KGEpKTt2YXIgZT1mdW5jdGlvbih0KXtpZigiY2xhc3MiPT09dHx8InN0eWxlIj09PXR8fGwodCkpdT1pO2Vsc2V7dmFyIGU9aS5hdHRycyYmaS5hdHRycy50eXBlO3U9c3x8Ui5tdXN0VXNlUHJvcChvLGUsdCk/aS5kb21Qcm9wc3x8KGkuZG9tUHJvcHM9e30pOmkuYXR0cnN8fChpLmF0dHJzPXt9KX12YXIgbj1oKHQpLHI9Uyh0KTtuIGluIHV8fHIgaW4gdXx8KHVbdF09YVt0XSxjJiYoKGkub258fChpLm9uPXt9KSlbInVwZGF0ZToiK3RdPWZ1bmN0aW9uKGUpe2FbdF09ZX0pKX07Zm9yKHZhciB0IGluIGEpZSh0KX1lbHNlO3JldHVybiBpfWZ1bmN0aW9uIGh0KGUsdCl7dmFyIG49dGhpcy5fc3RhdGljVHJlZXN8fCh0aGlzLl9zdGF0aWNUcmVlcz1bXSkscj1uW2VdO3JldHVybiByJiYhdHx8Z3Qocj1uW2VdPXRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2VdLmNhbGwodGhpcy5fcmVuZGVyUHJveHksbnVsbCx0aGlzKSwiX19zdGF0aWNfXyIrZSwhMSkscn1mdW5jdGlvbiB2dChlLHQsbil7cmV0dXJuIGd0KGUsIl9fb25jZV9fIit0KyhuPyJfIituOiIiKSwhMCksZX1mdW5jdGlvbiBndChlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdJiYic3RyaW5nIiE9dHlwZW9mIGVbcl0mJm10KGVbcl0sdCsiXyIrcixuKTtlbHNlIG10KGUsdCxuKX1mdW5jdGlvbiBtdChlLHQsbil7ZS5pc1N0YXRpYz0hMCxlLmtleT10LGUuaXNPbmNlPW59ZnVuY3Rpb24geXQoZSx0KXtpZih0KWlmKGQodCkpe3ZhciBuPWUub249ZS5vbj9OKHt9LGUub24pOnt9O2Zvcih2YXIgciBpbiB0KXt2YXIgaT1uW3JdLG89dFtyXTtuW3JdPWk/W10uY29uY2F0KGksbyk6b319ZWxzZTtyZXR1cm4gZX1mdW5jdGlvbiBfdChlLHQsbixyKXt0PXR8fHskc3RhYmxlOiFufTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtBcnJheS5pc0FycmF5KG8pP190KG8sdCxuKTpvJiYoby5wcm94eSYmKG8uZm4ucHJveHk9ITApLHRbby5rZXldPW8uZm4pfXJldHVybiByJiYodC4ka2V5PXIpLHR9ZnVuY3Rpb24gYnQoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rPTIpe3ZhciByPXRbbl07InN0cmluZyI9PXR5cGVvZiByJiZyJiYoZVt0W25dXT10W24rMV0pfXJldHVybiBlfWZ1bmN0aW9uIHd0KGUsdCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP3QrZTplfWZ1bmN0aW9uIGt0KGUpe2UuX289dnQsZS5fbj1vLGUuX3M9bixlLl9sPWN0LGUuX3Q9dXQsZS5fcT1PLGUuX2k9UCxlLl9tPWh0LGUuX2Y9bHQsZS5faz1mdCxlLl9iPXB0LGUuX3Y9ZmUsZS5fZT1kZSxlLl91PV90LGUuX2c9eXQsZS5fZD1idCxlLl9wPXd0fWZ1bmN0aW9uIFN0KGUsdCxuLG8scil7dmFyIGEsaT10aGlzLHM9ci5vcHRpb25zO2YobywiX3VpZCIpPyhhPU9iamVjdC5jcmVhdGUobykpLl9vcmlnaW5hbD1vOm89KGE9bykuX29yaWdpbmFsO3ZhciBjPUkocy5fY29tcGlsZWQpLHU9IWM7dGhpcy5kYXRhPWUsdGhpcy5wcm9wcz10LHRoaXMuY2hpbGRyZW49bix0aGlzLnBhcmVudD1vLHRoaXMubGlzdGVuZXJzPWUub258fF8sdGhpcy5pbmplY3Rpb25zPW50KHMuaW5qZWN0LG8pLHRoaXMuc2xvdHM9ZnVuY3Rpb24oKXtyZXR1cm4gaS4kc2xvdHN8fG90KGUuc2NvcGVkU2xvdHMsaS4kc2xvdHM9cnQobixvKSksaS4kc2xvdHN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzY29wZWRTbG90cyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG90KGUuc2NvcGVkU2xvdHMsdGhpcy5zbG90cygpKX19KSxjJiYodGhpcy4kb3B0aW9ucz1zLHRoaXMuJHNsb3RzPXRoaXMuc2xvdHMoKSx0aGlzLiRzY29wZWRTbG90cz1vdChlLnNjb3BlZFNsb3RzLHRoaXMuJHNsb3RzKSkscy5fc2NvcGVJZD90aGlzLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPVZ0KGEsZSx0LG4scix1KTtyZXR1cm4gaSYmIUFycmF5LmlzQXJyYXkoaSkmJihpLmZuU2NvcGVJZD1zLl9zY29wZUlkLGkuZm5Db250ZXh0PW8pLGl9OnRoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIFZ0KGEsZSx0LG4scix1KX19ZnVuY3Rpb24geHQoZSx0LG4scixpKXt2YXIgbz1wZShlKTtyZXR1cm4gby5mbkNvbnRleHQ9bixvLmZuT3B0aW9ucz1yLHQuc2xvdCYmKChvLmRhdGF8fChvLmRhdGE9e30pKS5zbG90PXQuc2xvdCksb31mdW5jdGlvbiBDdChlLHQpe2Zvcih2YXIgbiBpbiB0KWVbaChuKV09dFtuXX1rdChTdC5wcm90b3R5cGUpO3ZhciBUdD0iQGluUmVjeWNsZUxpc3QiO2Z1bmN0aW9uIE90KGUsdCxuLHIpe2lmKGEmJmEudGFza0NlbnRlcilyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgYS50YXNrQ2VudGVyLnJlZ2lzdGVySG9vaz9hLnRhc2tDZW50ZXIucmVnaXN0ZXJIb29rKGUsdCxuLHIpOnZvaWQgMH1mdW5jdGlvbiBBdChlLG4sdCl7aWYoYihuKSlpZih0KWUuJHJlZnM9e307ZWxzZXt2YXIgcj1lLiRyZWZzfHx7fTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PW5bZV07cltlXT0xPT09dC5sZW5ndGg/dFswXTp0fSksZS4kcmVmcz1yfX1mdW5jdGlvbiBFdChlLG4scix0KXtpZihiKHIpKXt2YXIgaT1lLiRyZWZzfHx7fTt0P09iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9cltlXTtpW2VdJiYoMT09PXQubGVuZ3RoJiZBcnJheS5pc0FycmF5KGlbZV0pP2RlbGV0ZSBpW2VdW25dOmRlbGV0ZSBpW2VdKX0pOihPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXJbZV07MT09PXQubGVuZ3RoPyhBcnJheS5pc0FycmF5KGlbZV0pfHwoaVtlXT1bXSksaVtlXVtuXT10WzBdKTppW2VdPXR9KSxlLiRyZWZzPWkpfX12YXIgSXQ9MDtmdW5jdGlvbiAkdChlKXt2YXIgdD1lLiRvcHRpb25zLmRhdGEsbj1lLiRvcHRpb25zLmNvbXB1dGVkfHx7fSxyPWUuX2RhdGE/T2JqZWN0LmFzc2lnbih7fSxlLl9kYXRhKToiZnVuY3Rpb24iPT10eXBlb2YgdD93bih0LGUpOnR8fHt9LGk9e307Zm9yKHZhciBvIGluIG4paVtvXT1lW29dO3JldHVybiBPYmplY3QuYXNzaWduKHt9LHIsaSl9ZnVuY3Rpb24gUHQoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciByPXRoaXMsdD1lLmNvbXBvbmVudElkO0YociwiX3ZtVGVtcGxhdGUiLGUudm1UZW1wbGF0ZSksci5fdWlkPXR8fCJ2aXJ0dWFsLWNvbXBvbmVudC0iK0l0Kyssci5faXNWdWU9ITAsZSYmZS5faXNDb21wb25lbnQ/TG4ocixlKTpyLiRvcHRpb25zPUllKE5uKHIuY29uc3RydWN0b3IpLGV8fHt9LHIpLG5uKChyLl9yZW5kZXJQcm94eT1yKS5fc2VsZj1yKSxZdChyKSxxdChyKSxhbihyLCJiZWZvcmVDcmVhdGUiKSx0dChyKSxibihyKSxldChyKSxhbihyLCJjcmVhdGVkIiksT3QodCwibGlmZWN5Y2xlIiwiYXR0YWNoIixmdW5jdGlvbihlKXtBdChyLGUmJmUucmVmcyksYW4ociwiYmVmb3JlTW91bnQiKSxuZXcgbW4ocixmdW5jdGlvbigpe3JldHVybiAkdChyKX0sZnVuY3Rpb24oKXtyZXR1cm4gci5fdXBkYXRlKHIuX3Zub2RlLCExKX0pLHIuX2lzTW91bnRlZD0hMCxhbihyLCJtb3VudGVkIil9KSxPdCh0LCJsaWZlY3ljbGUiLCJ1cGRhdGUiLGZ1bmN0aW9uKGUpe0F0KHIsZSYmZS5yZWZzKSxyLl91cGRhdGUoci5fdm5vZGUsITEpfSksT3QodCwibGlmZWN5Y2xlIiwic3luY1N0YXRlIixmdW5jdGlvbihlLHQpe2lmKGQodCkpZm9yKHZhciBuIGluIHQpcltuXT10W25dO3JldHVybiAkdChyKX0pLE90KHQsImxpZmVjeWNsZSIsImRldGFjaCIsZnVuY3Rpb24oZSl7QXQocixlJiZlLnJlZnMsITApLHIuJGRlc3Ryb3koKSxyLl92bVRlbXBsYXRlJiYoci5fdm1UZW1wbGF0ZS5yZW1vdmVWaXJ0dWFsQ29tcG9uZW50KHIuX3VpZCksZGVsZXRlIHIuX3ZtVGVtcGxhdGUpfSl9ZnVuY3Rpb24gTXQoZSl7dmFyIHQ9dGhpcyxuPXQuJG9wdGlvbnMuY29tcG9uZW50SWQ7KHQuX2lzTW91bnRlZCYmYW4odCwiYmVmb3JlVXBkYXRlIiksdC5fdm5vZGU9ZSx0Ll9pc01vdW50ZWQmJm4pJiZmdW5jdGlvbihlLHQsbil7aWYoYSYmYS50YXNrQ2VudGVyKSJmdW5jdGlvbiI9PXR5cGVvZiBhLnRhc2tDZW50ZXIudXBkYXRlRGF0YSYmYS50YXNrQ2VudGVyLnVwZGF0ZURhdGEoZSx0LG4pfShuLCR0KHQpLGZ1bmN0aW9uKCl7YW4odCwidXBkYXRlZCIpfSl9ZnVuY3Rpb24ganQoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PXRoaXM7dC5fdWlkPSJ2aXJ0dWFsLWNvbXBvbmVudC10ZW1wbGF0ZS0iK0l0KyssdC5faXNWdWU9ITAsZSYmZS5faXNDb21wb25lbnQ/TG4odCxlKTp0LiRvcHRpb25zPUllKE5uKHQuY29uc3RydWN0b3IpLGV8fHt9LHQpLFl0KHQuX3NlbGY9dCkscXQodCksYm4odCksdGhpcy5yZWdpc3RlclZpcnR1YWxDb21wb25lbnQoKX1mdW5jdGlvbiBMdChlKXt2YXIgdCxuLGksbztkZWxldGUgZS5kYXRhLmF0dHJzW1R0XSxuPSh0PWUpLmNvbXBvbmVudE9wdGlvbnMuQ3RvcixpPW4uZXh0ZW5kKHt9KSxvPWkucHJvdG90eXBlLiRlbWl0LGkucHJvdG90eXBlLl9pbml0PVB0LGkucHJvdG90eXBlLl91cGRhdGU9TXQsaS5wcm90b3R5cGUuJGVtaXQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1lW25dO3ZhciByPXRoaXMuX3VpZCxpPXRoaXMuX3ZtVGVtcGxhdGU7cmV0dXJuIHImJmkmJih0LnB1c2gociksby5hcHBseShpLHQpKSxvLmFwcGx5KHRoaXMsdCl9LHQuY29tcG9uZW50T3B0aW9ucy5DdG9yPW4uZXh0ZW5kKHttZXRob2RzOntyZWdpc3RlclZpcnR1YWxDb21wb25lbnQ6ZnVuY3Rpb24oKXt2YXIgcj10aGlzO0YociwiX3ZpcnR1YWxDb21wb25lbnRzIix7fSksT3QoU3RyaW5nKHIuX3VpZCksImxpZmVjeWNsZSIsImNyZWF0ZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgaSh7dm1UZW1wbGF0ZTpyLGNvbXBvbmVudElkOmUscHJvcHNEYXRhOnR9KTtyZXR1cm4gbi5fdWlkPWUsci5fdmlydHVhbENvbXBvbmVudHMmJihyLl92aXJ0dWFsQ29tcG9uZW50c1tlXT1uKSwkdChuKX0pfSxyZW1vdmVWaXJ0dWFsQ29tcG9uZW50OmZ1bmN0aW9uKGUpe2RlbGV0ZSB0aGlzLl92aXJ0dWFsQ29tcG9uZW50c1tlXX19LGRlc3Ryb3llZDpmdW5jdGlvbigpe2RlbGV0ZSB0aGlzLl92aXJ0dWFsQ29tcG9uZW50c319KSx0LmNvbXBvbmVudE9wdGlvbnMuQ3Rvci5wcm90b3R5cGUuX2luaXQ9anQsdC5jb21wb25lbnRPcHRpb25zLkN0b3IucHJvdG90eXBlLl91cGRhdGU9Qjt2YXIgcj1SdChlKSxhPXIuJG9wdGlvbnNbIkByZW5kZXIiXTtpZihhKXRyeXtyZXR1cm4gYS5jYWxsKHIpfWNhdGNoKGUpe05lKGUsciwiQHJlbmRlciIpfX12YXIgTnQ9e2luaXQ6ZnVuY3Rpb24oZSx0LG4scil7aWYoZS5jb21wb25lbnRJbnN0YW5jZSYmIWUuY29tcG9uZW50SW5zdGFuY2UuX2lzRGVzdHJveWVkJiZlLmRhdGEua2VlcEFsaXZlKXt2YXIgaT1lO050LnByZXBhdGNoKGksaSl9ZWxzZXsoZS5jb21wb25lbnRJbnN0YW5jZT1SdChlLHRuLG4scikpLiRtb3VudCh0P2UuZWxtOnZvaWQgMCx0KX19LHByZXBhdGNoOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5jb21wb25lbnRPcHRpb25zOyFmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPXIuZGF0YS5zY29wZWRTbG90cyxhPWUuJHNjb3BlZFNsb3RzLHM9ISEobyYmIW8uJHN0YWJsZXx8YSE9PV8mJiFhLiRzdGFibGV8fG8mJmUuJHNjb3BlZFNsb3RzLiRrZXkhPT1vLiRrZXkpLGM9ISEoaXx8ZS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW58fHMpO2UuJG9wdGlvbnMuX3BhcmVudFZub2RlPXIsZS4kdm5vZGU9cixlLl92bm9kZSYmKGUuX3Zub2RlLnBhcmVudD1yKTtpZihlLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbj1pLGUuJGF0dHJzPXIuZGF0YS5hdHRyc3x8XyxlLiRsaXN0ZW5lcnM9bnx8Xyx0JiZlLiRvcHRpb25zLnByb3BzKXt5ZSghMSk7Zm9yKHZhciB1PWUuX3Byb3BzLGw9ZS4kb3B0aW9ucy5fcHJvcEtleXN8fFtdLGQ9MDtkPGwubGVuZ3RoO2QrKyl7dmFyIGY9bFtkXSxwPWUuJG9wdGlvbnMucHJvcHM7dVtmXT1QZShmLHAsdCxlKX15ZSghMCksZS4kb3B0aW9ucy5wcm9wc0RhdGE9dH1uPW58fF87dmFyIGg9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO2UuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycz1uLGVuKGUsbixoKSxjJiYoZS4kc2xvdHM9cnQoaSxyLmNvbnRleHQpLGUuJGZvcmNlVXBkYXRlKCkpfSh0LmNvbXBvbmVudEluc3RhbmNlPWUuY29tcG9uZW50SW5zdGFuY2Usbi5wcm9wc0RhdGEsbi5saXN0ZW5lcnMsdCxuLmNoaWxkcmVuKX0saW5zZXJ0OmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5jb250ZXh0LHI9ZS5jb21wb25lbnRJbnN0YW5jZTtyLl9pc01vdW50ZWR8fChyLl9pc01vdW50ZWQ9ITAsYW4ociwibW91bnRlZCIpKSxlLmRhdGEua2VlcEFsaXZlJiYobi5faXNNb3VudGVkPygodD1yKS5faW5hY3RpdmU9ITEsY24ucHVzaCh0KSk6b24ociwhMCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29tcG9uZW50SW5zdGFuY2U7dC5faXNEZXN0cm95ZWR8fChlLmRhdGEua2VlcEFsaXZlP2Z1bmN0aW9uIGUodCxuKXtpZihuJiYodC5fZGlyZWN0SW5hY3RpdmU9ITAscm4odCkpKXJldHVybjtpZighdC5faW5hY3RpdmUpe3QuX2luYWN0aXZlPSEwO2Zvcih2YXIgcj0wO3I8dC4kY2hpbGRyZW4ubGVuZ3RoO3IrKyllKHQuJGNoaWxkcmVuW3JdKTthbih0LCJkZWFjdGl2YXRlZCIpfX0odCwhMCk6dC4kZGVzdHJveSgpKX19LEJ0PU9iamVjdC5rZXlzKE50KTtmdW5jdGlvbiBEdChlLHQsbixyLGkpe2lmKCFBKGUpKXt2YXIgbz1uLiRvcHRpb25zLl9iYXNlO2lmKGIoZSkmJihlPW8uZXh0ZW5kKGUpKSwiZnVuY3Rpb24iPT10eXBlb2YgZSl7dmFyIGEscyxjLHUsbCxkLGY7aWYoQShlLmNpZCkmJnZvaWQgMD09PShlPWZ1bmN0aW9uKHQsbil7aWYoSSh0LmVycm9yKSYmRSh0LmVycm9yQ29tcCkpcmV0dXJuIHQuZXJyb3JDb21wO2lmKEUodC5yZXNvbHZlZCkpcmV0dXJuIHQucmVzb2x2ZWQ7dmFyIGU9SHQ7ZSYmRSh0Lm93bmVycykmJi0xPT09dC5vd25lcnMuaW5kZXhPZihlKSYmdC5vd25lcnMucHVzaChlKTtpZihJKHQubG9hZGluZykmJkUodC5sb2FkaW5nQ29tcCkpcmV0dXJuIHQubG9hZGluZ0NvbXA7aWYoZSYmIUUodC5vd25lcnMpKXt2YXIgcj10Lm93bmVycz1bZV0saT0hMCxvPW51bGwsYT1udWxsO2UuJG9uKCJob29rOmRlc3Ryb3llZCIsZnVuY3Rpb24oKXtyZXR1cm4gayhyLGUpfSk7dmFyIHM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1yLmxlbmd0aDt0PG47dCsrKXJbdF0uJGZvcmNlVXBkYXRlKCk7ZSYmKHIubGVuZ3RoPTAsbnVsbCE9PW8mJihjbGVhclRpbWVvdXQobyksbz1udWxsKSxudWxsIT09YSYmKGNsZWFyVGltZW91dChhKSxhPW51bGwpKX0sYz1EKGZ1bmN0aW9uKGUpe3QucmVzb2x2ZWQ9R3QoZSxuKSxpP3IubGVuZ3RoPTA6cyghMCl9KSx1PUQoZnVuY3Rpb24oZSl7RSh0LmVycm9yQ29tcCkmJih0LmVycm9yPSEwLHMoITApKX0pLGw9dChjLHUpO3JldHVybiBiKGwpJiYodyhsKT9BKHQucmVzb2x2ZWQpJiZsLnRoZW4oYyx1KTp3KGwuY29tcG9uZW50KSYmKGwuY29tcG9uZW50LnRoZW4oYyx1KSxFKGwuZXJyb3IpJiYodC5lcnJvckNvbXA9R3QobC5lcnJvcixuKSksRShsLmxvYWRpbmcpJiYodC5sb2FkaW5nQ29tcD1HdChsLmxvYWRpbmcsbiksMD09PWwuZGVsYXk/dC5sb2FkaW5nPSEwOm89c2V0VGltZW91dChmdW5jdGlvbigpe289bnVsbCxBKHQucmVzb2x2ZWQpJiZBKHQuZXJyb3IpJiYodC5sb2FkaW5nPSEwLHMoITEpKX0sbC5kZWxheXx8MjAwKSksRShsLnRpbWVvdXQpJiYoYT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YT1udWxsLEEodC5yZXNvbHZlZCkmJnUobnVsbCl9LGwudGltZW91dCkpKSksaT0hMSx0LmxvYWRpbmc/dC5sb2FkaW5nQ29tcDp0LnJlc29sdmVkfX0oYT1lLG8pKSlyZXR1cm4gcz1hLGM9dCx1PW4sbD1yLGQ9aSwoZj1kZSgpKS5hc3luY0ZhY3Rvcnk9cyxmLmFzeW5jTWV0YT17ZGF0YTpjLGNvbnRleHQ6dSxjaGlsZHJlbjpsLHRhZzpkfSxmO3Q9dHx8e30sTm4oZSksRSh0Lm1vZGVsKSYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm1vZGVsJiZlLm1vZGVsLnByb3B8fCJ2YWx1ZSIscj1lLm1vZGVsJiZlLm1vZGVsLmV2ZW50fHwiaW5wdXQiOyh0LmF0dHJzfHwodC5hdHRycz17fSkpW25dPXQubW9kZWwudmFsdWU7dmFyIGk9dC5vbnx8KHQub249e30pLG89aVtyXSxhPXQubW9kZWwuY2FsbGJhY2s7RShvKT8oQXJyYXkuaXNBcnJheShvKT8tMT09PW8uaW5kZXhPZihhKTpvIT09YSkmJihpW3JdPVthXS5jb25jYXQobykpOmlbcl09YX0oZS5vcHRpb25zLHQpO3ZhciBwPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10Lm9wdGlvbnMucHJvcHM7aWYoIUEocikpe3ZhciBpPXt9LG89ZS5hdHRycyxhPWUucHJvcHM7aWYoRShvKXx8RShhKSlmb3IodmFyIHMgaW4gcil7dmFyIGM9UyhzKTtLZShpLGEscyxjLCEwKXx8S2UoaSxvLHMsYywhMSl9cmV0dXJuIGl9fSh0LGUpO2lmKEkoZS5vcHRpb25zLmZ1bmN0aW9uYWwpKXJldHVybiBmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPWUub3B0aW9ucyxhPXt9LHM9by5wcm9wcztpZihFKHMpKWZvcih2YXIgYyBpbiBzKWFbY109UGUoYyxzLHR8fF8pO2Vsc2UgRShuLmF0dHJzKSYmQ3QoYSxuLmF0dHJzKSxFKG4ucHJvcHMpJiZDdChhLG4ucHJvcHMpO3ZhciB1PW5ldyBTdChuLGEsaSxyLGUpLGw9by5yZW5kZXIuY2FsbChudWxsLHUuX2MsdSk7aWYobCBpbnN0YW5jZW9mIHVlKXJldHVybiB4dChsLG4sdS5wYXJlbnQsbyk7aWYoQXJyYXkuaXNBcnJheShsKSl7Zm9yKHZhciBkPVplKGwpfHxbXSxmPW5ldyBBcnJheShkLmxlbmd0aCkscD0wO3A8ZC5sZW5ndGg7cCsrKWZbcF09eHQoZFtwXSxuLHUucGFyZW50LG8pO3JldHVybiBmfX0oZSxwLHQsbixyKTt2YXIgaD10Lm9uO2lmKHQub249dC5uYXRpdmVPbixJKGUub3B0aW9ucy5hYnN0cmFjdCkpe3ZhciB2PXQuc2xvdDt0PXt9LHYmJih0LnNsb3Q9dil9IWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmhvb2t8fChlLmhvb2s9e30pLG49MDtuPEJ0Lmxlbmd0aDtuKyspe3ZhciByPUJ0W25dLGk9dFtyXSxvPU50W3JdO2k9PT1vfHxpJiZpLl9tZXJnZWR8fCh0W3JdPWk/RnQobyxpKTpvKX19KHQpO3ZhciBnLG09ZS5vcHRpb25zLm5hbWV8fGkseT1uZXcgdWUoInZ1ZS1jb21wb25lbnQtIitlLmNpZCsobT8iLSIrbToiIiksdCx2b2lkIDAsdm9pZCAwLHZvaWQgMCxuLHtDdG9yOmUscHJvcHNEYXRhOnAsbGlzdGVuZXJzOmgsdGFnOmksY2hpbGRyZW46cn0sYSk7cmV0dXJuKGc9eSkuZGF0YS5hdHRycyYmVHQgaW4gZy5kYXRhLmF0dHJzP0x0KHkpOnl9fX1mdW5jdGlvbiBSdChlLHQsbixyKXt2YXIgaT17X2lzQ29tcG9uZW50OiEwLF9wYXJlbnRWbm9kZTplLHBhcmVudDp0LF9wYXJlbnRFbG06bnx8bnVsbCxfcmVmRWxtOnJ8fG51bGx9LG89ZS5kYXRhLmlubGluZVRlbXBsYXRlO3JldHVybiBFKG8pJiYoaS5yZW5kZXI9by5yZW5kZXIsaS5zdGF0aWNSZW5kZXJGbnM9by5zdGF0aWNSZW5kZXJGbnMpLG5ldyBlLmNvbXBvbmVudE9wdGlvbnMuQ3RvcihpKX1mdW5jdGlvbiBGdChuLHIpe3ZhciBlPWZ1bmN0aW9uKGUsdCl7bihlLHQpLHIoZSx0KX07cmV0dXJuIGUuX21lcmdlZD0hMCxlfXZhciBVdD0xLHp0PTI7ZnVuY3Rpb24gVnQoZSx0LG4scixpLG8pe3JldHVybihBcnJheS5pc0FycmF5KG4pfHwkKG4pKSYmKGk9cixyPW4sbj12b2lkIDApLEkobykmJihpPXp0KSxmdW5jdGlvbihlLHQsbixyLGkpe2lmKEUobikmJkUobi5fX29iX18pKXJldHVybiBkZSgpO0UobikmJkUobi5pcykmJih0PW4uaXMpO2lmKCF0KXJldHVybiBkZSgpO0FycmF5LmlzQXJyYXkocikmJiJmdW5jdGlvbiI9PXR5cGVvZiByWzBdJiYoKG49bnx8e30pLnNjb3BlZFNsb3RzPXtkZWZhdWx0OnJbMF19LHIubGVuZ3RoPTApO2k9PT16dD9yPVplKHIpOmk9PT1VdCYmKHI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspaWYoQXJyYXkuaXNBcnJheShlW3RdKSlyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxlKTtyZXR1cm4gZX0ocikpO3ZhciBvLGE7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgczthPWUuJHZub2RlJiZlLiR2bm9kZS5uc3x8Ui5nZXRUYWdOYW1lc3BhY2UodCksbz1SLmlzUmVzZXJ2ZWRUYWcodCk/bmV3IHVlKFIucGFyc2VQbGF0Zm9ybVRhZ05hbWUodCksbixyLHZvaWQgMCx2b2lkIDAsZSk6biYmbi5wcmV8fCFFKHM9JGUoZS4kb3B0aW9ucywiY29tcG9uZW50cyIsdCkpP25ldyB1ZSh0LG4scix2b2lkIDAsdm9pZCAwLGUpOkR0KHMsbixlLHIsdCl9ZWxzZSBvPUR0KHQsbixlLHIpO3JldHVybiBBcnJheS5pc0FycmF5KG8pP286RShvKT8oRShhKSYmZnVuY3Rpb24gZSh0LG4scil7dC5ucz1uOyJmb3JlaWduT2JqZWN0Ij09PXQudGFnJiYocj0hKG49dm9pZCAwKSk7aWYoRSh0LmNoaWxkcmVuKSlmb3IodmFyIGk9MCxvPXQuY2hpbGRyZW4ubGVuZ3RoO2k8bztpKyspe3ZhciBhPXQuY2hpbGRyZW5baV07RShhLnRhZykmJihBKGEubnMpfHxJKHIpJiYic3ZnIiE9PWEudGFnKSYmZShhLG4scil9fShvLGEpLEUobikmJmZ1bmN0aW9uKGUpe2IoZS5zdHlsZSkmJkhlKGUuc3R5bGUpO2IoZS5jbGFzcykmJkhlKGUuY2xhc3MpfShuKSxvKTpkZSgpfShlLHQsbixyLGkpfWZ1bmN0aW9uIHF0KGkpe2kuX3Zub2RlPW51bGwsaS5fc3RhdGljVHJlZXM9bnVsbDt2YXIgZT1pLiRvcHRpb25zLHQ9aS4kdm5vZGU9ZS5fcGFyZW50Vm5vZGUsbj10JiZ0LmNvbnRleHQ7aS4kc2xvdHM9cnQoZS5fcmVuZGVyQ2hpbGRyZW4sbiksaS4kc2NvcGVkU2xvdHM9XyxpLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBWdChpLGUsdCxuLHIsITEpfSxpLiRjcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBWdChpLGUsdCxuLHIsITApfTt2YXIgcj10JiZ0LmRhdGE7d2UoaSwiJGF0dHJzIixyJiZyLmF0dHJzfHxfLG51bGwsITApLHdlKGksIiRsaXN0ZW5lcnMiLGUuX3BhcmVudExpc3RlbmVyc3x8XyxudWxsLCEwKX12YXIgV3QsSHQ9bnVsbDtmdW5jdGlvbiBHdChlLHQpe3JldHVybihlLl9fZXNNb2R1bGV8fHJlJiYiTW9kdWxlIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXSkmJihlPWUuZGVmYXVsdCksYihlKT90LmV4dGVuZChlKTplfWZ1bmN0aW9uIEp0KGUpe3JldHVybiBlLmlzQ29tbWVudCYmZS5hc3luY0ZhY3Rvcnl9ZnVuY3Rpb24gWHQoZSl7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZVt0XTtpZihFKG4pJiYoRShuLmNvbXBvbmVudE9wdGlvbnMpfHxKdChuKSkpcmV0dXJuIG59fWZ1bmN0aW9uIFl0KGUpe2UuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLGUuX2hhc0hvb2tFdmVudD0hMTt2YXIgdD1lLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7dCYmZW4oZSx0KX1mdW5jdGlvbiBLdChlLHQpe1d0LiRvbihlLHQpfWZ1bmN0aW9uIFp0KGUsdCl7V3QuJG9mZihlLHQpfWZ1bmN0aW9uIFF0KHQsbil7dmFyIHI9V3Q7cmV0dXJuIGZ1bmN0aW9uIGUoKXtudWxsIT09bi5hcHBseShudWxsLGFyZ3VtZW50cykmJnIuJG9mZih0LGUpfX1mdW5jdGlvbiBlbihlLHQsbil7WGUodCxufHx7fSxLdCxadCxRdCxXdD1lKSxXdD12b2lkIDB9dmFyIHRuPW51bGw7ZnVuY3Rpb24gbm4oZSl7dmFyIHQ9ZS4kb3B0aW9ucyxuPXQucGFyZW50O2lmKG4mJiF0LmFic3RyYWN0KXtmb3IoO24uJG9wdGlvbnMuYWJzdHJhY3QmJm4uJHBhcmVudDspbj1uLiRwYXJlbnQ7bi4kY2hpbGRyZW4ucHVzaChlKX1lLiRwYXJlbnQ9bixlLiRyb290PW4/bi4kcm9vdDplLGUuJGNoaWxkcmVuPVtdLGUuJHJlZnM9e30sZS5fd2F0Y2hlcj1udWxsLGUuX2luYWN0aXZlPW51bGwsZS5fZGlyZWN0SW5hY3RpdmU9ITEsZS5faXNNb3VudGVkPSExLGUuX2lzRGVzdHJveWVkPSExLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITF9ZnVuY3Rpb24gcm4oZSl7Zm9yKDtlJiYoZT1lLiRwYXJlbnQpOylpZihlLl9pbmFjdGl2ZSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBvbihlLHQpe2lmKHQpe2lmKGUuX2RpcmVjdEluYWN0aXZlPSExLHJuKGUpKXJldHVybn1lbHNlIGlmKGUuX2RpcmVjdEluYWN0aXZlKXJldHVybjtpZihlLl9pbmFjdGl2ZXx8bnVsbD09PWUuX2luYWN0aXZlKXtlLl9pbmFjdGl2ZT0hMTtmb3IodmFyIG49MDtuPGUuJGNoaWxkcmVuLmxlbmd0aDtuKyspb24oZS4kY2hpbGRyZW5bbl0pO2FuKGUsImFjdGl2YXRlZCIpfX1mdW5jdGlvbiBhbihlLHQpe3NlKCk7dmFyIG49ZS4kb3B0aW9uc1t0XSxyPXQrIiBob29rIjtpZihuKWZvcih2YXIgaT0wLG89bi5sZW5ndGg7aTxvO2krKylCZShuW2ldLGUsbnVsbCxlLHIpO2UuX2hhc0hvb2tFdmVudCYmZS4kZW1pdCgiaG9vazoiK3QpLGNlKCl9dmFyIHNuPVtdLGNuPVtdLHVuPXt9LGxuPSExLGRuPSExLGZuPTA7dmFyIHBuPURhdGUubm93O2lmKHEmJiFKKXt2YXIgaG49d2luZG93LnBlcmZvcm1hbmNlO2huJiYiZnVuY3Rpb24iPT10eXBlb2YgaG4ubm93JiZwbigpPmEuY3JlYXRlRXZlbnQoIkV2ZW50IikudGltZVN0YW1wJiYocG49ZnVuY3Rpb24oKXtyZXR1cm4gaG4ubm93KCl9KX1mdW5jdGlvbiB2bigpe3ZhciBlLHQ7Zm9yKHBuKCksZG49ITAsc24uc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLmlkLXQuaWR9KSxmbj0wO2ZuPHNuLmxlbmd0aDtmbisrKShlPXNuW2ZuXSkuYmVmb3JlJiZlLmJlZm9yZSgpLHQ9ZS5pZCx1blt0XT1udWxsLGUucnVuKCk7dmFyIG49Y24uc2xpY2UoKSxyPXNuLnNsaWNlKCk7Zm49c24ubGVuZ3RoPWNuLmxlbmd0aD0wLGxuPWRuPSEodW49e30pLGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0uX2luYWN0aXZlPSEwLG9uKGVbdF0sITApfShuKSxmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtmb3IoO3QtLTspe3ZhciBuPWVbdF0scj1uLnZtO3IuX3dhdGNoZXI9PT1uJiZyLl9pc01vdW50ZWQmJiFyLl9pc0Rlc3Ryb3llZCYmYW4ociwidXBkYXRlZCIpfX0ociksZWUmJlIuZGV2dG9vbHMmJmVlLmVtaXQoImZsdXNoIil9dmFyIGduPTAsbW49ZnVuY3Rpb24oZSx0LG4scixpKXt0aGlzLnZtPWUsaSYmKGUuX3dhdGNoZXI9dGhpcyksZS5fd2F0Y2hlcnMucHVzaCh0aGlzKSxyPyh0aGlzLmRlZXA9ISFyLmRlZXAsdGhpcy51c2VyPSEhci51c2VyLHRoaXMubGF6eT0hIXIubGF6eSx0aGlzLnN5bmM9ISFyLnN5bmMsdGhpcy5iZWZvcmU9ci5iZWZvcmUpOnRoaXMuZGVlcD10aGlzLnVzZXI9dGhpcy5sYXp5PXRoaXMuc3luYz0hMSx0aGlzLmNiPW4sdGhpcy5pZD0rK2duLHRoaXMuYWN0aXZlPSEwLHRoaXMuZGlydHk9dGhpcy5sYXp5LHRoaXMuZGVwcz1bXSx0aGlzLm5ld0RlcHM9W10sdGhpcy5kZXBJZHM9bmV3IG5lLHRoaXMubmV3RGVwSWRzPW5ldyBuZSx0aGlzLmV4cHJlc3Npb249IiIsImZ1bmN0aW9uIj09dHlwZW9mIHQ/dGhpcy5nZXR0ZXI9dDoodGhpcy5nZXR0ZXI9ZnVuY3Rpb24oZSl7aWYoIVUudGVzdChlKSl7dmFyIG49ZS5zcGxpdCgiLiIpO3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PG4ubGVuZ3RoO3QrKyl7aWYoIWUpcmV0dXJuO2U9ZVtuW3RdXX1yZXR1cm4gZX19fSh0KSx0aGlzLmdldHRlcnx8KHRoaXMuZ2V0dGVyPUIpKSx0aGlzLnZhbHVlPXRoaXMubGF6eT92b2lkIDA6dGhpcy5nZXQoKX07bW4ucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe3ZhciBlO3NlKHRoaXMpO3ZhciB0PXRoaXMudm07dHJ5e2U9dGhpcy5nZXR0ZXIuY2FsbCh0LHQpfWNhdGNoKGUpe2lmKCF0aGlzLnVzZXIpdGhyb3cgZTtOZShlLHQsJ2dldHRlciBmb3Igd2F0Y2hlciAiJyt0aGlzLmV4cHJlc3Npb24rJyInKX1maW5hbGx5e3RoaXMuZGVlcCYmSGUoZSksY2UoKSx0aGlzLmNsZWFudXBEZXBzKCl9cmV0dXJuIGV9LG1uLnByb3RvdHlwZS5hZGREZXA9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZDt0aGlzLm5ld0RlcElkcy5oYXModCl8fCh0aGlzLm5ld0RlcElkcy5hZGQodCksdGhpcy5uZXdEZXBzLnB1c2goZSksdGhpcy5kZXBJZHMuaGFzKHQpfHxlLmFkZFN1Yih0aGlzKSl9LG1uLnByb3RvdHlwZS5jbGVhbnVwRGVwcz1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspe3ZhciB0PXRoaXMuZGVwc1tlXTt0aGlzLm5ld0RlcElkcy5oYXModC5pZCl8fHQucmVtb3ZlU3ViKHRoaXMpfXZhciBuPXRoaXMuZGVwSWRzO3RoaXMuZGVwSWRzPXRoaXMubmV3RGVwSWRzLHRoaXMubmV3RGVwSWRzPW4sdGhpcy5uZXdEZXBJZHMuY2xlYXIoKSxuPXRoaXMuZGVwcyx0aGlzLmRlcHM9dGhpcy5uZXdEZXBzLHRoaXMubmV3RGVwcz1uLHRoaXMubmV3RGVwcy5sZW5ndGg9MH0sbW4ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMubGF6eT90aGlzLmRpcnR5PSEwOnRoaXMuc3luYz90aGlzLnJ1bigpOmZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7aWYobnVsbD09dW5bdF0pe2lmKHVuW3RdPSEwLGRuKXtmb3IodmFyIG49c24ubGVuZ3RoLTE7Zm48biYmc25bbl0uaWQ+ZS5pZDspbi0tO3NuLnNwbGljZShuKzEsMCxlKX1lbHNlIHNuLnB1c2goZSk7bG58fChsbj0hMCxxZSh2bikpfX0odGhpcyl9LG1uLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXtpZih0aGlzLmFjdGl2ZSl7dmFyIGU9dGhpcy5nZXQoKTtpZihlIT09dGhpcy52YWx1ZXx8YihlKXx8dGhpcy5kZWVwKXt2YXIgdD10aGlzLnZhbHVlO2lmKHRoaXMudmFsdWU9ZSx0aGlzLnVzZXIpdHJ5e3RoaXMuY2IuY2FsbCh0aGlzLnZtLGUsdCl9Y2F0Y2goZSl7TmUoZSx0aGlzLnZtLCdjYWxsYmFjayBmb3Igd2F0Y2hlciAiJyt0aGlzLmV4cHJlc3Npb24rJyInKX1lbHNlIHRoaXMuY2IuY2FsbCh0aGlzLnZtLGUsdCl9fX0sbW4ucHJvdG90eXBlLmV2YWx1YXRlPWZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLmdldCgpLHRoaXMuZGlydHk9ITF9LG1uLnByb3RvdHlwZS5kZXBlbmQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXRoaXMuZGVwc1tlXS5kZXBlbmQoKX0sbW4ucHJvdG90eXBlLnRlYXJkb3duPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3RoaXMudm0uX2lzQmVpbmdEZXN0cm95ZWR8fGsodGhpcy52bS5fd2F0Y2hlcnMsdGhpcyk7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0ucmVtb3ZlU3ViKHRoaXMpO3RoaXMuYWN0aXZlPSExfX07dmFyIHluPXtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6QixzZXQ6Qn07ZnVuY3Rpb24gX24oZSx0LG4pe3luLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzW3RdW25dfSx5bi5zZXQ9ZnVuY3Rpb24oZSl7dGhpc1t0XVtuXT1lfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHluKX1mdW5jdGlvbiBibihlKXtlLl93YXRjaGVycz1bXTt2YXIgdD1lLiRvcHRpb25zO3QucHJvcHMmJmZ1bmN0aW9uKG4scil7dmFyIGk9bi4kb3B0aW9ucy5wcm9wc0RhdGF8fHt9LG89bi5fcHJvcHM9e30sYT1uLiRvcHRpb25zLl9wcm9wS2V5cz1bXTtuLiRwYXJlbnQmJnllKCExKTt2YXIgZT1mdW5jdGlvbihlKXthLnB1c2goZSk7dmFyIHQ9UGUoZSxyLGksbik7d2UobyxlLHQpLGUgaW4gbnx8X24obiwiX3Byb3BzIixlKX07Zm9yKHZhciB0IGluIHIpZSh0KTt5ZSghMCl9KGUsdC5wcm9wcyksdC5tZXRob2RzJiZmdW5jdGlvbihlLHQpe2UuJG9wdGlvbnMucHJvcHM7Zm9yKHZhciBuIGluIHQpZVtuXT0iZnVuY3Rpb24iIT10eXBlb2YgdFtuXT9COm0odFtuXSxlKX0oZSx0Lm1ldGhvZHMpLHQuZGF0YT9mdW5jdGlvbihlKXt2YXIgdD1lLiRvcHRpb25zLmRhdGE7ZCh0PWUuX2RhdGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/d24odCxlKTp0fHx7fSl8fCh0PXt9KTt2YXIgbj1PYmplY3Qua2V5cyh0KSxyPWUuJG9wdGlvbnMucHJvcHMsaT0oZS4kb3B0aW9ucy5tZXRob2RzLG4ubGVuZ3RoKTtmb3IoO2ktLTspe3ZhciBvPW5baV07ciYmZihyLG8pfHwodm9pZCAwLDM2IT09KGE9KG8rIiIpLmNoYXJDb2RlQXQoMCkpJiY5NSE9PWEmJl9uKGUsIl9kYXRhIixvKSl9dmFyIGE7YmUodCwhMCl9KGUpOmJlKGUuX2RhdGE9e30sITApLHQuY29tcHV0ZWQmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5fY29tcHV0ZWRXYXRjaGVycz1PYmplY3QuY3JlYXRlKG51bGwpLHI9USgpO2Zvcih2YXIgaSBpbiB0KXt2YXIgbz10W2ldLGE9ImZ1bmN0aW9uIj09dHlwZW9mIG8/bzpvLmdldDtyfHwobltpXT1uZXcgbW4oZSxhfHxCLEIsa24pKSxpIGluIGV8fFNuKGUsaSxvKX19KGUsdC5jb21wdXRlZCksdC53YXRjaCYmdC53YXRjaCE9PUsmJmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07aWYoQXJyYXkuaXNBcnJheShyKSlmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKylUbihlLG4scltpXSk7ZWxzZSBUbihlLG4scil9fShlLHQud2F0Y2gpfWZ1bmN0aW9uIHduKGUsdCl7c2UoKTt0cnl7cmV0dXJuIGUuY2FsbCh0LHQpfWNhdGNoKGUpe3JldHVybiBOZShlLHQsImRhdGEoKSIpLHt9fWZpbmFsbHl7Y2UoKX19dmFyIGtuPXtsYXp5OiEwfTtmdW5jdGlvbiBTbihlLHQsbil7dmFyIHI9IVEoKTsiZnVuY3Rpb24iPT10eXBlb2Ygbj8oeW4uZ2V0PXI/eG4odCk6Q24obikseW4uc2V0PUIpOih5bi5nZXQ9bi5nZXQ/ciYmITEhPT1uLmNhY2hlP3huKHQpOkNuKG4uZ2V0KTpCLHluLnNldD1uLnNldHx8QiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx5bil9ZnVuY3Rpb24geG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY29tcHV0ZWRXYXRjaGVycyYmdGhpcy5fY29tcHV0ZWRXYXRjaGVyc1t0XTtpZihlKXJldHVybiBlLmRpcnR5JiZlLmV2YWx1YXRlKCksYWUuU2hhcmVkT2JqZWN0LnRhcmdldCYmZS5kZXBlbmQoKSxlLnZhbHVlfX1mdW5jdGlvbiBDbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5jYWxsKHRoaXMsdGhpcyl9fWZ1bmN0aW9uIFRuKGUsdCxuLHIpe3JldHVybiBkKG4pJiYobj0ocj1uKS5oYW5kbGVyKSwic3RyaW5nIj09dHlwZW9mIG4mJihuPWVbbl0pLGUuJHdhdGNoKHQsbixyKX12YXIgT24sQW4sRW4sSW4sJG4sUG4sTW4sam49MDtmdW5jdGlvbiBMbihlLHQpe3ZhciBuPWUuJG9wdGlvbnM9T2JqZWN0LmNyZWF0ZShlLmNvbnN0cnVjdG9yLm9wdGlvbnMpLHI9dC5fcGFyZW50Vm5vZGU7bi5wYXJlbnQ9dC5wYXJlbnQsbi5fcGFyZW50Vm5vZGU9cixuLl9wYXJlbnRFbG09dC5fcGFyZW50RWxtLG4uX3JlZkVsbT10Ll9yZWZFbG07dmFyIGk9ci5jb21wb25lbnRPcHRpb25zO24ucHJvcHNEYXRhPWkucHJvcHNEYXRhLG4uX3BhcmVudExpc3RlbmVycz1pLmxpc3RlbmVycyxuLl9yZW5kZXJDaGlsZHJlbj1pLmNoaWxkcmVuLG4uX2NvbXBvbmVudFRhZz1pLnRhZyx0LnJlbmRlciYmKG4ucmVuZGVyPXQucmVuZGVyLG4uc3RhdGljUmVuZGVyRm5zPXQuc3RhdGljUmVuZGVyRm5zKX1mdW5jdGlvbiBObihlKXt2YXIgdD1lLm9wdGlvbnM7aWYoZS5zdXBlcil7dmFyIG49Tm4oZS5zdXBlcik7aWYobiE9PWUuc3VwZXJPcHRpb25zKXtlLnN1cGVyT3B0aW9ucz1uO3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5vcHRpb25zLHI9ZS5zZWFsZWRPcHRpb25zO2Zvcih2YXIgaSBpbiBuKW5baV0hPT1yW2ldJiYodHx8KHQ9e30pLHRbaV09bltpXSk7cmV0dXJuIHR9KGUpO3ImJk4oZS5leHRlbmRPcHRpb25zLHIpLCh0PWUub3B0aW9ucz1JZShuLGUuZXh0ZW5kT3B0aW9ucykpLm5hbWUmJih0LmNvbXBvbmVudHNbdC5uYW1lXT1lKX19cmV0dXJuIHR9ZnVuY3Rpb24gQm4oZSl7dGhpcy5faW5pdChlKX1mdW5jdGlvbiBEbihlKXtlLmNpZD0wO3ZhciBhPTE7ZS5leHRlbmQ9ZnVuY3Rpb24oZSl7ZT1lfHx7fTt2YXIgdD10aGlzLG49dC5jaWQscj1lLl9DdG9yfHwoZS5fQ3Rvcj17fSk7aWYocltuXSlyZXR1cm4gcltuXTt2YXIgaT1lLm5hbWV8fHQub3B0aW9ucy5uYW1lLG89ZnVuY3Rpb24oZSl7dGhpcy5faW5pdChlKX07cmV0dXJuKChvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9bykuY2lkPWErKyxvLm9wdGlvbnM9SWUodC5vcHRpb25zLGUpLG8uc3VwZXI9dCxvLm9wdGlvbnMucHJvcHMmJmZ1bmN0aW9uKGUpe3ZhciB0PWUub3B0aW9ucy5wcm9wcztmb3IodmFyIG4gaW4gdClfbihlLnByb3RvdHlwZSwiX3Byb3BzIixuKX0obyksby5vcHRpb25zLmNvbXB1dGVkJiZmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMuY29tcHV0ZWQ7Zm9yKHZhciBuIGluIHQpU24oZS5wcm90b3R5cGUsbix0W25dKX0obyksby5leHRlbmQ9dC5leHRlbmQsby5taXhpbj10Lm1peGluLG8udXNlPXQudXNlLGouZm9yRWFjaChmdW5jdGlvbihlKXtvW2VdPXRbZV19KSxpJiYoby5vcHRpb25zLmNvbXBvbmVudHNbaV09byksby5zdXBlck9wdGlvbnM9dC5vcHRpb25zLG8uZXh0ZW5kT3B0aW9ucz1lLG8uc2VhbGVkT3B0aW9ucz1OKHt9LG8ub3B0aW9ucykscltuXT1vfX1mdW5jdGlvbiBSbihlKXtyZXR1cm4gZSYmKGUuQ3Rvci5vcHRpb25zLm5hbWV8fGUudGFnKX1mdW5jdGlvbiBGbihlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpPy0xPGUuaW5kZXhPZih0KToic3RyaW5nIj09dHlwZW9mIGU/LTE8ZS5zcGxpdCgiLCIpLmluZGV4T2YodCk6KG49ZSwiW29iamVjdCBSZWdFeHBdIj09PXIuY2FsbChuKSYmZS50ZXN0KHQpKTt2YXIgbn1mdW5jdGlvbiBVbihlLHQpe3ZhciBuPWUuY2FjaGUscj1lLmtleXMsaT1lLl92bm9kZTtmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtpZihhKXt2YXIgcz1SbihhLmNvbXBvbmVudE9wdGlvbnMpO3MmJiF0KHMpJiZ6bihuLG8scixpKX19fWZ1bmN0aW9uIHpuKGUsdCxuLHIpe3ZhciBpPWVbdF07IWl8fHImJmkudGFnPT09ci50YWd8fGkuY29tcG9uZW50SW5zdGFuY2UuJGRlc3Ryb3koKSxlW3RdPW51bGwsayhuLHQpfUJuLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuX3VpZD1qbisrLHQuX2lzVnVlPSEwLGUmJmUuX2lzQ29tcG9uZW50P0xuKHQsZSk6dC4kb3B0aW9ucz1JZShObih0LmNvbnN0cnVjdG9yKSxlfHx7fSx0KSxubigodC5fcmVuZGVyUHJveHk9dCkuX3NlbGY9dCksWXQodCkscXQodCksYW4odCwiYmVmb3JlQ3JlYXRlIiksIm1wLXRvdXRpYW8iIT09dC5tcEhvc3QmJnR0KHQpLGJuKHQpLCJtcC10b3V0aWFvIiE9PXQubXBIb3N0JiZldCh0KSwibXAtdG91dGlhbyIhPT10Lm1wSG9zdCYmYW4odCwiY3JlYXRlZCIpLHQuJG9wdGlvbnMuZWwmJnQuJG1vdW50KHQuJG9wdGlvbnMuZWwpfSxPbj1CbixBbj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9fSxFbj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BzfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KE9uLnByb3RvdHlwZSwiJGRhdGEiLEFuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoT24ucHJvdG90eXBlLCIkcHJvcHMiLEVuKSxPbi5wcm90b3R5cGUuJHNldD1rZSxPbi5wcm90b3R5cGUuJGRlbGV0ZT1TZSxPbi5wcm90b3R5cGUuJHdhdGNoPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzO2lmKGQodCkpcmV0dXJuIFRuKHIsZSx0LG4pOyhuPW58fHt9KS51c2VyPSEwO3ZhciBpPW5ldyBtbihyLGUsdCxuKTtpZihuLmltbWVkaWF0ZSl0cnl7dC5jYWxsKHIsaS52YWx1ZSl9Y2F0Y2goZSl7TmUoZSxyLCdjYWxsYmFjayBmb3IgaW1tZWRpYXRlIHdhdGNoZXIgIicraS5leHByZXNzaW9uKyciJyl9cmV0dXJuIGZ1bmN0aW9uKCl7aS50ZWFyZG93bigpfX0sJG49L15ob29rOi8sKEluPUJuKS5wcm90b3R5cGUuJG9uPWZ1bmN0aW9uKGUsdCl7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspdGhpcy4kb24oZVtuXSx0KTtlbHNlKHRoaXMuX2V2ZW50c1tlXXx8KHRoaXMuX2V2ZW50c1tlXT1bXSkpLnB1c2godCksJG4udGVzdChlKSYmKHRoaXMuX2hhc0hvb2tFdmVudD0hMCk7cmV0dXJuIHRoaXN9LEluLnByb3RvdHlwZS4kb25jZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7ZnVuY3Rpb24gcigpe24uJG9mZihlLHIpLHQuYXBwbHkobixhcmd1bWVudHMpfXJldHVybiByLmZuPXQsbi4kb24oZSxyKSxufSxJbi5wcm90b3R5cGUuJG9mZj1mdW5jdGlvbihlLHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzO2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0aGlzLiRvZmYoZVtuXSx0KTtyZXR1cm4gdGhpc312YXIgaSxvPXRoaXMuX2V2ZW50c1tlXTtpZighbylyZXR1cm4gdGhpcztpZighdClyZXR1cm4gdGhpcy5fZXZlbnRzW2VdPW51bGwsdGhpcztmb3IodmFyIGE9by5sZW5ndGg7YS0tOylpZigoaT1vW2FdKT09PXR8fGkuZm49PT10KXtvLnNwbGljZShhLDEpO2JyZWFrfXJldHVybiB0aGlzfSxJbi5wcm90b3R5cGUuJGVtaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZXZlbnRzW2VdO2lmKHQpe3Q9MTx0Lmxlbmd0aD95KHQpOnQ7Zm9yKHZhciBuPXkoYXJndW1lbnRzLDEpLHI9J2V2ZW50IGhhbmRsZXIgZm9yICInK2UrJyInLGk9MCxvPXQubGVuZ3RoO2k8bztpKyspQmUodFtpXSx0aGlzLG4sdGhpcyxyKX1yZXR1cm4gdGhpc30sKFBuPUJuKS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9dGhpcyxpPXIuJGVsLG89ci5fdm5vZGUsYT0obj10bix0bj1yLGZ1bmN0aW9uKCl7dG49bn0pO3IuX3Zub2RlPWUsbz9yLiRlbD1yLl9fcGF0Y2hfXyhvLGUpOihyLiRlbD1yLl9fcGF0Y2hfXyhyLiRlbCxlLHQsITEsci4kb3B0aW9ucy5fcGFyZW50RWxtLHIuJG9wdGlvbnMuX3JlZkVsbSksci4kb3B0aW9ucy5fcGFyZW50RWxtPXIuJG9wdGlvbnMuX3JlZkVsbT1udWxsKSxhKCksaSYmKGkuX192dWVfXz1udWxsKSxyLiRlbCYmKHIuJGVsLl9fdnVlX189ciksci4kdm5vZGUmJnIuJHBhcmVudCYmci4kdm5vZGU9PT1yLiRwYXJlbnQuX3Zub2RlJiYoci4kcGFyZW50LiRlbD1yLiRlbCl9LFBuLnByb3RvdHlwZS4kZm9yY2VVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl93YXRjaGVyJiZ0aGlzLl93YXRjaGVyLnVwZGF0ZSgpfSxQbi5wcm90b3R5cGUuJGRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKCFlLl9pc0JlaW5nRGVzdHJveWVkKXthbihlLCJiZWZvcmVEZXN0cm95IiksZS5faXNCZWluZ0Rlc3Ryb3llZD0hMDt2YXIgdD1lLiRwYXJlbnQ7IXR8fHQuX2lzQmVpbmdEZXN0cm95ZWR8fGUuJG9wdGlvbnMuYWJzdHJhY3R8fGsodC4kY2hpbGRyZW4sZSksZS5fd2F0Y2hlciYmZS5fd2F0Y2hlci50ZWFyZG93bigpO2Zvcih2YXIgbj1lLl93YXRjaGVycy5sZW5ndGg7bi0tOyllLl93YXRjaGVyc1tuXS50ZWFyZG93bigpO2UuX2RhdGEuX19vYl9fJiZlLl9kYXRhLl9fb2JfXy52bUNvdW50LS0sZS5faXNEZXN0cm95ZWQ9ITAsZS5fX3BhdGNoX18oZS5fdm5vZGUsbnVsbCksYW4oZSwiZGVzdHJveWVkIiksZS4kb2ZmKCksZS4kZWwmJihlLiRlbC5fX3Z1ZV9fPW51bGwpLGUuJHZub2RlJiYoZS4kdm5vZGUucGFyZW50PW51bGwpfX0sa3QoKE1uPUJuKS5wcm90b3R5cGUpLE1uLnByb3RvdHlwZS4kbmV4dFRpY2s9ZnVuY3Rpb24oZSl7cmV0dXJuIHFlKGUsdGhpcyl9LE1uLnByb3RvdHlwZS5fcmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQsbj10aGlzLGU9bi4kb3B0aW9ucyxyPWUucmVuZGVyLGk9ZS5fcGFyZW50Vm5vZGU7aSYmKG4uJHNjb3BlZFNsb3RzPW90KGkuZGF0YS5zY29wZWRTbG90cyxuLiRzbG90cyxuLiRzY29wZWRTbG90cykpLG4uJHZub2RlPWk7dHJ5e0h0PW4sdD1yLmNhbGwobi5fcmVuZGVyUHJveHksbi4kY3JlYXRlRWxlbWVudCl9Y2F0Y2goZSl7TmUoZSxuLCJyZW5kZXIiKSx0PW4uX3Zub2RlfWZpbmFsbHl7SHQ9bnVsbH1yZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmMT09PXQubGVuZ3RoJiYodD10WzBdKSx0IGluc3RhbmNlb2YgdWV8fCh0PWRlKCkpLHQucGFyZW50PWksdH07dmFyIFZuLHFuLFduLEhuPVtTdHJpbmcsUmVnRXhwLEFycmF5XSxHbj17S2VlcEFsaXZlOntuYW1lOiJrZWVwLWFsaXZlIixhYnN0cmFjdDohMCxwcm9wczp7aW5jbHVkZTpIbixleGNsdWRlOkhuLG1heDpbU3RyaW5nLE51bWJlcl19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhY2hlPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5rZXlzPVtdfSxkZXN0cm95ZWQ6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5jYWNoZSl6bih0aGlzLmNhY2hlLGUsdGhpcy5rZXlzKX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kd2F0Y2goImluY2x1ZGUiLGZ1bmN0aW9uKHQpe1VuKGUsZnVuY3Rpb24oZSl7cmV0dXJuIEZuKHQsZSl9KX0pLHRoaXMuJHdhdGNoKCJleGNsdWRlIixmdW5jdGlvbih0KXtVbihlLGZ1bmN0aW9uKGUpe3JldHVybiFGbih0LGUpfSl9KX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kc2xvdHMuZGVmYXVsdCx0PVh0KGUpLG49dCYmdC5jb21wb25lbnRPcHRpb25zO2lmKG4pe3ZhciByPVJuKG4pLGk9dGhpcy5pbmNsdWRlLG89dGhpcy5leGNsdWRlO2lmKGkmJighcnx8IUZuKGkscikpfHxvJiZyJiZGbihvLHIpKXJldHVybiB0O3ZhciBhPXRoaXMuY2FjaGUscz10aGlzLmtleXMsYz1udWxsPT10LmtleT9uLkN0b3IuY2lkKyhuLnRhZz8iOjoiK24udGFnOiIiKTp0LmtleTthW2NdPyh0LmNvbXBvbmVudEluc3RhbmNlPWFbY10uY29tcG9uZW50SW5zdGFuY2UsayhzLGMpLHMucHVzaChjKSk6KGFbY109dCxzLnB1c2goYyksdGhpcy5tYXgmJnMubGVuZ3RoPnBhcnNlSW50KHRoaXMubWF4KSYmem4oYSxzWzBdLHMsdGhpcy5fdm5vZGUpKSx0LmRhdGEua2VlcEFsaXZlPSEwfXJldHVybiB0fHxlJiZlWzBdfX19O1ZuPUJuLFduPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUn19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWbiwiY29uZmlnIixXbiksVm4udXRpbD17d2FybjppZSxleHRlbmQ6TixtZXJnZU9wdGlvbnM6SWUsZGVmaW5lUmVhY3RpdmU6d2V9LFZuLnNldD1rZSxWbi5kZWxldGU9U2UsVm4ubmV4dFRpY2s9cWUsVm4ub2JzZXJ2YWJsZT1mdW5jdGlvbihlKXtyZXR1cm4gYmUoZSksZX0sVm4ub3B0aW9ucz1PYmplY3QuY3JlYXRlKG51bGwpLGouZm9yRWFjaChmdW5jdGlvbihlKXtWbi5vcHRpb25zW2UrInMiXT1PYmplY3QuY3JlYXRlKG51bGwpfSksTigoVm4ub3B0aW9ucy5fYmFzZT1Wbikub3B0aW9ucy5jb21wb25lbnRzLEduKSxWbi51c2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5faW5zdGFsbGVkUGx1Z2luc3x8KHRoaXMuX2luc3RhbGxlZFBsdWdpbnM9W10pO2lmKC0xPHQuaW5kZXhPZihlKSlyZXR1cm4gdGhpczt2YXIgbj15KGFyZ3VtZW50cywxKTtyZXR1cm4gbi51bnNoaWZ0KHRoaXMpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLmluc3RhbGw/ZS5pbnN0YWxsLmFwcGx5KGUsbik6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUuYXBwbHkobnVsbCxuKSx0LnB1c2goZSksdGhpc30sVm4ubWl4aW49ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3B0aW9ucz1JZSh0aGlzLm9wdGlvbnMsZSksdGhpc30sRG4oVm4pLHFuPVZuLGouZm9yRWFjaChmdW5jdGlvbihuKXtxbltuXT1mdW5jdGlvbihlLHQpe3JldHVybiB0PygiY29tcG9uZW50Ij09PW4mJmQodCkmJih0Lm5hbWU9dC5uYW1lfHxlLHQ9dGhpcy5vcHRpb25zLl9iYXNlLmV4dGVuZCh0KSksImRpcmVjdGl2ZSI9PT1uJiYiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9e2JpbmQ6dCx1cGRhdGU6dH0pLHRoaXMub3B0aW9uc1tuKyJzIl1bZV09dCk6dGhpcy5vcHRpb25zW24rInMiXVtlXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQm4ucHJvdG90eXBlLCIkaXNTZXJ2ZXIiLHtnZXQ6UX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCbi5wcm90b3R5cGUsIiRzc3JDb250ZXh0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHZub2RlJiZ0aGlzLiR2bm9kZS5zc3JDb250ZXh0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCbiwiRnVuY3Rpb25hbFJlbmRlckNvbnRleHQiLHt2YWx1ZTpTdH0pLEJuLnZlcnNpb249IjIuNi4xMCI7dmFyIEpuPTE7ZnVuY3Rpb24gWG4oZSl7dGhpcy5pbnN0YW5jZUlkPSIiLHRoaXMubm9kZUlkPUpuKyssdGhpcy5wYXJlbnROb2RlPW51bGwsdGhpcy5ub2RlVHlwZT0zLHRoaXMudGV4dD1lfWZ1bmN0aW9uIFluKGUpe3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoZSl9dmFyIEtuPU9iamVjdC5mcmVlemUoe25hbWVzcGFjZU1hcDp7fSxjcmVhdGVFbGVtZW50OlluLGNyZWF0ZUVsZW1lbnROUzpmdW5jdGlvbihlLHQpe3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoZSsiOiIrdCl9LGNyZWF0ZVRleHROb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgWG4oZSl9LGNyZWF0ZUNvbW1lbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGEuY3JlYXRlQ29tbWVudChlKX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGUsdCxuKXtpZigzIT09dC5ub2RlVHlwZSllLmluc2VydEJlZm9yZSh0LG4pO2Vsc2V7dmFyIHI9IndlZXgiPT09YS5fXyRjb21waWxlcl9fPyJ0ZXh0IjoidS10ZXh0IjtpZihlLnR5cGU9PT1yKWUuc2V0QXR0cigidmFsdWUiLHQudGV4dCksdC5wYXJlbnROb2RlPWU7ZWxzZXt2YXIgaT1ZbihyKTtpLnNldEF0dHIoInZhbHVlIix0LnRleHQpLGUuaW5zZXJ0QmVmb3JlKGksbil9fX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSx0KXszIT09dC5ub2RlVHlwZT9lLnJlbW92ZUNoaWxkKHQpOmUuc2V0QXR0cigidmFsdWUiLCIiKX0sYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtpZigzIT09dC5ub2RlVHlwZSllLmFwcGVuZENoaWxkKHQpO2Vsc2V7dmFyIG49IndlZXgiPT09YS5fXyRjb21waWxlcl9fPyJ0ZXh0IjoidS10ZXh0IjtpZihlLnR5cGU9PT1uKWUuc2V0QXR0cigidmFsdWUiLHQudGV4dCksdC5wYXJlbnROb2RlPWU7ZWxzZXt2YXIgcj1ZbihuKTtyLnNldEF0dHIoInZhbHVlIix0LnRleHQpLGUuYXBwZW5kQ2hpbGQocil9fX0scGFyZW50Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlfSxuZXh0U2libGluZzpmdW5jdGlvbihlKXtyZXR1cm4gZS5uZXh0U2libGluZ30sdGFnTmFtZTpmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlfSxzZXRUZXh0Q29udGVudDpmdW5jdGlvbihlLHQpe2UucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNldEF0dHIoInZhbHVlIix0KX0sc2V0QXR0cmlidXRlOmZ1bmN0aW9uKGUsdCxuKXtlLnNldEF0dHIodCxuKX0sc2V0U3R5bGVTY29wZTpmdW5jdGlvbihlLHQpe2Uuc2V0QXR0cigiQHN0eWxlU2NvcGUiLHQpfX0pLFpuPXtjcmVhdGU6ZnVuY3Rpb24oZSx0KXtRbih0KX0sdXBkYXRlOmZ1bmN0aW9uKGUsdCl7ZS5kYXRhLnJlZiE9PXQuZGF0YS5yZWYmJihRbihlLCEwKSxRbih0KSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7UW4oZSwhMCl9fTtmdW5jdGlvbiBRbihlLHQpe3ZhciBuPWUuZGF0YS5yZWY7aWYoRShuKSl7dmFyIHI9ZS5jb250ZXh0LGk9ZS5jb21wb25lbnRJbnN0YW5jZXx8ZS5lbG0sbz1yLiRyZWZzO3Q/QXJyYXkuaXNBcnJheShvW25dKT9rKG9bbl0saSk6b1tuXT09PWkmJihvW25dPXZvaWQgMCk6ZS5kYXRhLnJlZkluRm9yP0FycmF5LmlzQXJyYXkob1tuXSk/b1tuXS5pbmRleE9mKGkpPDAmJm9bbl0ucHVzaChpKTpvW25dPVtpXTpvW25dPWl9fXMoImh0bWwsYm9keSxiYXNlLGhlYWQsbGluayxtZXRhLHN0eWxlLHRpdGxlLGFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhncm91cCxuYXYsc2VjdGlvbixkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCxhLGIsYWJicixiZGksYmRvLGJyLGNpdGUsY29kZSxkYXRhLGRmbixlbSxpLGtiZCxtYXJrLHEscnAscnQscnRjLHJ1YnkscyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbixvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLGRldGFpbHMsZGlhbG9nLG1lbnUsbWVudWl0ZW0sc3VtbWFyeSxjb250ZW50LGVsZW1lbnQsc2hhZG93LHRlbXBsYXRlLGJsb2NrcXVvdGUsaWZyYW1lLHRmb290Iikscygic3ZnLGFuaW1hdGUsY2lyY2xlLGNsaXBwYXRoLGN1cnNvcixkZWZzLGRlc2MsZWxsaXBzZSxmaWx0ZXIsZm9udC1mYWNlLGZvcmVpZ25PYmplY3QsZyxnbHlwaCxpbWFnZSxsaW5lLG1hcmtlcixtYXNrLG1pc3NpbmctZ2x5cGgscGF0aCxwYXR0ZXJuLHBvbHlnb24scG9seWxpbmUscmVjdCxzd2l0Y2gsc3ltYm9sLHRleHQsdGV4dHBhdGgsdHNwYW4sdXNlLHZpZXciLCEwKTt2YXIgZXI9cygidGV4dCxudW1iZXIscGFzc3dvcmQsc2VhcmNoLGVtYWlsLHRlbCx1cmwiKSx0cj1uZXcgdWUoIiIse30sW10pLG5yPVsiY3JlYXRlIiwiYWN0aXZhdGUiLCJ1cGRhdGUiLCJyZW1vdmUiLCJkZXN0cm95Il07ZnVuY3Rpb24gcnIoZSx0KXtyZXR1cm4gZS5rZXk9PT10LmtleSYmKGUudGFnPT09dC50YWcmJmUuaXNDb21tZW50PT09dC5pc0NvbW1lbnQmJkUoZS5kYXRhKT09PUUodC5kYXRhKSYmZnVuY3Rpb24oZSx0KXtpZigiaW5wdXQiIT09ZS50YWcpcmV0dXJuITA7dmFyIG4scj1FKG49ZS5kYXRhKSYmRShuPW4uYXR0cnMpJiZuLnR5cGUsaT1FKG49dC5kYXRhKSYmRShuPW4uYXR0cnMpJiZuLnR5cGU7cmV0dXJuIHI9PT1pfHxlcihyKSYmZXIoaSl9KGUsdCl8fEkoZS5pc0FzeW5jUGxhY2Vob2xkZXIpJiZlLmFzeW5jRmFjdG9yeT09PXQuYXN5bmNGYWN0b3J5JiZBKHQuYXN5bmNGYWN0b3J5LmVycm9yKSl9ZnVuY3Rpb24gaXIoZSx0LG4pe3ZhciByLGksbz17fTtmb3Iocj10O3I8PW47KytyKUUoaT1lW3JdLmtleSkmJihvW2ldPXIpO3JldHVybiBvfXZhciBvcj17Y3JlYXRlOmFyLHVwZGF0ZTphcixkZXN0cm95OmZ1bmN0aW9uKGUpe2FyKGUsdHIpfX07ZnVuY3Rpb24gYXIoZSx0KXsoZS5kYXRhLmRpcmVjdGl2ZXN8fHQuZGF0YS5kaXJlY3RpdmVzKSYmZnVuY3Rpb24odCxuKXt2YXIgZSxyLGksbz10PT09dHIsYT1uPT09dHIscz1jcih0LmRhdGEuZGlyZWN0aXZlcyx0LmNvbnRleHQpLGM9Y3Iobi5kYXRhLmRpcmVjdGl2ZXMsbi5jb250ZXh0KSx1PVtdLGw9W107Zm9yKGUgaW4gYylyPXNbZV0saT1jW2VdLHI/KGkub2xkVmFsdWU9ci52YWx1ZSxpLm9sZEFyZz1yLmFyZyx1cihpLCJ1cGRhdGUiLG4sdCksaS5kZWYmJmkuZGVmLmNvbXBvbmVudFVwZGF0ZWQmJmwucHVzaChpKSk6KHVyKGksImJpbmQiLG4sdCksaS5kZWYmJmkuZGVmLmluc2VydGVkJiZ1LnB1c2goaSkpO2lmKHUubGVuZ3RoKXt2YXIgZD1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8dS5sZW5ndGg7ZSsrKXVyKHVbZV0sImluc2VydGVkIixuLHQpfTtvP1llKG4sImluc2VydCIsZCk6ZCgpfWwubGVuZ3RoJiZZZShuLCJwb3N0cGF0Y2giLGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxsLmxlbmd0aDtlKyspdXIobFtlXSwiY29tcG9uZW50VXBkYXRlZCIsbix0KX0pO2lmKCFvKWZvcihlIGluIHMpY1tlXXx8dXIoc1tlXSwidW5iaW5kIix0LHQsYSl9KGUsdCl9dmFyIHNyPU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gY3IoZSx0KXt2YXIgbixyLGksbz1PYmplY3QuY3JlYXRlKG51bGwpO2lmKCFlKXJldHVybiBvO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspKHI9ZVtuXSkubW9kaWZpZXJzfHwoci5tb2RpZmllcnM9c3IpLChvWyhpPXIsaS5yYXdOYW1lfHxpLm5hbWUrIi4iK09iamVjdC5rZXlzKGkubW9kaWZpZXJzfHx7fSkuam9pbigiLiIpKV09cikuZGVmPSRlKHQuJG9wdGlvbnMsImRpcmVjdGl2ZXMiLHIubmFtZSk7cmV0dXJuIG99ZnVuY3Rpb24gdXIodCxuLHIsZSxpKXt2YXIgbz10LmRlZiYmdC5kZWZbbl07aWYobyl0cnl7byhyLmVsbSx0LHIsZSxpKX1jYXRjaChlKXtOZShlLHIuY29udGV4dCwiZGlyZWN0aXZlICIrdC5uYW1lKyIgIituKyIgaG9vayIpfX12YXIgbHI9W1puLG9yXSxkcj11KGZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXCkpL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9ZS5zcGxpdChyKTsxPHQubGVuZ3RoJiYoblt0WzBdLnRyaW0oKV09dFsxXS50cmltKCkpfX0pLG59KTtmdW5jdGlvbiBmcihlKXt2YXIgdD1wcihlLnN0eWxlKTtyZXR1cm4gZS5zdGF0aWNTdHlsZT9OKGUuc3RhdGljU3R5bGUsdCk6dH1mdW5jdGlvbiBwcihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT94KGUpOiJzdHJpbmciPT10eXBlb2YgZT9kcihlKTplfXZhciBocj17dmlldzp7Y2xhc3M6WyJob3ZlckNsYXNzIl0sc3R5bGU6W119LGJ1dHRvbjp7Y2xhc3M6WyJob3ZlckNsYXNzIl0sc3R5bGU6W119LG5hdmlnYXRvcjp7Y2xhc3M6WyJob3ZlckNsYXNzIl0sc3R5bGU6W119LCJ1LWlucHV0Ijp7Y2xhc3M6WyJwbGFjZWhvbGRlckNsYXNzIl0sc3R5bGU6WyJwbGFjZWhvbGRlclN0eWxlIl19LCJ1LXRleHRhcmVhIjp7Y2xhc3M6WyJwbGFjZWhvbGRlckNsYXNzIl0sc3R5bGU6WyJwbGFjZWhvbGRlclN0eWxlIl19LCJwaWNrZXItdmlldyI6e2NsYXNzOlsiaW5kaWNhdG9yQ2xhc3MiLCJtYXNrQ2xhc3MiXSxzdHlsZTpbImluZGljYXRvclN0eWxlIiwibWFza1N0eWxlIl19fTtmdW5jdGlvbiB2cihlLHQsbixyKXtpZighdClyZXR1cm4gdDt2YXIgaT1ocltuLnR5cGVdO2lmKGkpe2lmKC0xIT09aS5jbGFzcy5pbmRleE9mKGUpKXJldHVybiByLiRvcHRpb25zLnN0eWxlJiZyLiRvcHRpb25zLnN0eWxlW3RdfHx7fTtpZigtMSE9PWkuc3R5bGUuaW5kZXhPZihlKSlyZXR1cm4gcHIodCl9cmV0dXJuIHR9ZnVuY3Rpb24gZ3IoZSx0KXtpZihlLmRhdGEuYXR0cnN8fHQuZGF0YS5hdHRycyl7dmFyIG4scixpPXQuZWxtLG89ZS5kYXRhLmF0dHJzfHx7fSxhPXQuZGF0YS5hdHRyc3x8e307YS5fX29iX18mJihhPXQuZGF0YS5hdHRycz1OKHt9LGEpKTt2YXIgcz0iZnVuY3Rpb24iPT10eXBlb2YgaS5zZXRBdHRycyxjPXt9O2ZvcihuIGluIGEpcj1hW25dLG9bbl0hPT1yJiYocz9jW25dPXI6aS5zZXRBdHRyKG4sdnIobixyLGksdC5jb250ZXh0KSkpO2ZvcihuIGluIG8pbnVsbD09YVtuXSYmKHM/Y1tuXT12b2lkIDA6aS5zZXRBdHRyKG4pKTtzJiZpLnNldEF0dHJzKGZ1bmN0aW9uKG8sZSx0KXt2YXIgYT1ocltlLnR5cGVdO2lmKCFhKXJldHVybiBvO3ZhciBzPXQuJG9wdGlvbnMuc3R5bGV8fHt9LGM9c1siQFZFUlNJT04iXXx8MTtyZXR1cm4gT2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1vW2VdO2lmKC0xIT09YS5jbGFzcy5pbmRleE9mKGUpKWlmKGM8Mnx8ISgiLiIrdCBpbiBzKSlvW2VdPXNbdF18fHt9O2Vsc2V7dmFyIG49KHNbIi4iK3RdfHx7fSlbIiJdfHx7fSxyPXt9O2Zvcih2YXIgaSBpbiBuKXJbaV09bltpXVswXTtvW2VdPXJ9ZWxzZS0xIT09YS5zdHlsZS5pbmRleE9mKGUpJiYob1tlXT1wcih0KSl9KSxvfShjLGksdC5jb250ZXh0KSl9fXZhciBtcj17Y3JlYXRlOmdyLHVwZGF0ZTpncn07ZnVuY3Rpb24geXIoZSl7Zm9yKHZhciB0PV9yKGUpLG49ZSxyPWU7RShyLmNvbXBvbmVudEluc3RhbmNlKTspKHI9ci5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUpJiZyLmRhdGEmJih0PU4oX3IociksdCkpO2Zvcig7RShuPW4ucGFyZW50KTspbiYmbi5kYXRhJiYodD1OKHQsX3IobikpKTtyZXR1cm4gdH1mdW5jdGlvbiBfcihlKXt2YXIgdCxuLHIsaSxvPWUuZGF0YTtyZXR1cm4gQShvLnN0YXRpY0NsYXNzKSYmQShvLmNsYXNzKT97fToodD1mdW5jdGlvbihlKXt2YXIgdD1bXSxuPWUuc3RhdGljQ2xhc3Mscj1lLmNsYXNzO24mJnQucHVzaC5hcHBseSh0LG4pO0FycmF5LmlzQXJyYXkocik/dC5wdXNoLmFwcGx5KHQscik6YihyKT90LnB1c2guYXBwbHkodCxPYmplY3Qua2V5cyhyKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIHJbZV19KSk6InN0cmluZyI9PXR5cGVvZiByJiZ0LnB1c2guYXBwbHkodCxyLnRyaW0oKS5zcGxpdCgvXHMrLykpO3JldHVybiB0fShvKSxuPWUuY29udGV4dCxyPW4uJG9wdGlvbnMuc3R5bGV8fHt9LGk9e30sdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXJbZV07TihpLHQpfSksaSl9ZnVuY3Rpb24gYnIoZSx0LG4scil7dmFyIGksbyxhPXt9O2ZvcihvIGluIG4pQSh0W29dKSYmKGFbcihvKV09IiIpO2ZvcihvIGluIHQpKGk9dFtvXSkhPT1uW29dJiYoYVtyKG8pXT1pKTtlLnNldFN0eWxlcyhhKX1mdW5jdGlvbiB3cihlLHQsbil7dmFyIHI9dCYmdC5jb250ZXh0LiRvcHRpb25zLnN0eWxlO3ImJiFlLmluY2x1ZGVzKHIpJiYobj9lLnVuc2hpZnQocik6ZS5wdXNoKHIpKX1mdW5jdGlvbiBrcihlKXtmb3IodmFyIHQ9ZS5kYXRhLG49ZSxyPWU7RShyLmNvbXBvbmVudEluc3RhbmNlKTspKHI9ci5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUpJiZyLmRhdGEmJih0PVNyKHIuZGF0YSx0KSk7Zm9yKDtFKG49bi5wYXJlbnQpOyluJiZuLmRhdGEmJih0PVNyKHQsbi5kYXRhKSk7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYoRShlKXx8RSh0KSlyZXR1cm4geHIoQ3IoZSksQ3IodCkpO3JldHVybiIifSh0LnN0YXRpY0NsYXNzLHQuY2xhc3MpfWZ1bmN0aW9uIFNyKGUsdCl7cmV0dXJue3N0YXRpY0NsYXNzOnhyKENyKGUuc3RhdGljQ2xhc3MpLENyKHQuc3RhdGljQ2xhc3MpKSxjbGFzczpFKGUuY2xhc3MpP1tlLmNsYXNzLHQuY2xhc3NdOnQuY2xhc3N9fWZ1bmN0aW9uIHhyKGUsdCl7cmV0dXJuIGU/dD9lKyIgIit0OmU6dHx8IiJ9ZnVuY3Rpb24gQ3IoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49IiIscj0wLGk9ZS5sZW5ndGg7cjxpO3IrKylFKHQ9Q3IoZVtyXSkpJiYiIiE9PXQmJihuJiYobis9IiAiKSxuKz10KTtyZXR1cm4gbn0oZSk6YihlKT9mdW5jdGlvbihlKXt2YXIgdD0iIjtmb3IodmFyIG4gaW4gZSllW25dJiYodCYmKHQrPSIgIiksdCs9bik7cmV0dXJuIHR9KGUpOiJzdHJpbmciPT10eXBlb2YgZT9lOiIifWZ1bmN0aW9uIFRyKGUsdCl7dmFyIG49dC5kYXRhLHI9ZS5kYXRhO2lmKCEoQShuLnN0YXRpY0NsYXNzKSYmQShuLmNsYXNzKSYmKEEocil8fEEoci5zdGF0aWNDbGFzcykmJkEoci5jbGFzcykpKSl7dmFyIGk9IndlZXgiPT09YS5fXyRzdHlsZUNvbXBpbGVyX187aWYoYS5fXyRhdXRvbWF0b3JfX3x8IWkpe2l8fHQuZWxtLnNldFN0eWxlc2hlZXQmJnQuZWxtLnNldFN0eWxlc2hlZXQoZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1lLHI9ZTtmb3Iod3IodCxlKTtFKHIuY29tcG9uZW50SW5zdGFuY2UpOyl3cih0LHI9ci5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUsITApO2Zvcig7RShuPW4ucGFyZW50KTspd3IodCxuKTtyZXR1cm4gdH0odCkpO3ZhciBvPWtyKHQpO3QuZWxtLnNldENsYXNzTGlzdCYmdC5lbG0uc2V0Q2xhc3NMaXN0KG8uc3BsaXQoIiAiKSl9aSYmYnIodC5lbG0seXIodCkseXIoZSksT3IpfX1mdW5jdGlvbiBPcihlKXtyZXR1cm4gZX12YXIgQXIsRXIsSXI9e2NyZWF0ZTpUcix1cGRhdGU6VHJ9O2Z1bmN0aW9uICRyKGUsdCxuLHIsaSl7aWYobiljb25zb2xlLmxvZygiV2VleCBkbyBub3Qgc3VwcG9ydCBldmVudCBpbiBidWJibGUgcGhhc2UuIik7ZWxzZXtpZihFciYmRXIuX3ZpcnR1YWxDb21wb25lbnRzKXtBci5fY29udGV4dD1Fcjt2YXIgbz10O3Q9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1lW25dO3ZhciByPSh0WzBdfHx7fSkuY29tcG9uZW50SWQsaT10aGlzLl9jb250ZXh0O3ImJnRoaXMuX2NvbnRleHQmJihpPSh0aGlzLl9jb250ZXh0Ll92aXJ0dWFsQ29tcG9uZW50c3x8e30pW3JdfHxpKTt0cnl7IWZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT1uJiYobj1udWxsKTt2YXIgcj1lLmZucztpZighQXJyYXkuaXNBcnJheShyKSlyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KG4sdCk6ZS5hcHBseShuLHQpO2Zvcih2YXIgaT1yLnNsaWNlKCksbz0wO288aS5sZW5ndGg7bysrKWlbb10uYXBwbHkobix0KX0obyx0LGkpfWNhdGNoKGUpe05lKGUsaSwiRmFpbGVkIHRvIGludm9rZSB2aXJ0dWFsIGNvbXBvbmVudCBoYW5kbGVyICgiK3IrIikiKX19fUFyLmFkZEV2ZW50KGUsdCxpKX19ZnVuY3Rpb24gUHIoZSx0LG4scil7KHJ8fEFyKS5yZW1vdmVFdmVudChlKX1mdW5jdGlvbiBNcihlLHQpe2lmKGUuZGF0YS5vbnx8dC5kYXRhLm9uKXt2YXIgbj10LmRhdGEub258fHt9LHI9ZS5kYXRhLm9ufHx7fTtBcj10LmVsbSxFcj10LmNvbnRleHQsWGUobixyLCRyLFByLHQuY29udGV4dCksRXI9QXI9dm9pZCAwfX12YXIganI9e2NyZWF0ZTpNcix1cGRhdGU6TXJ9LExyPXUoaCk7ZnVuY3Rpb24gTnIoZSx0KXt2YXIgbj10LmRhdGEscj1lLmRhdGE7aWYoIShBKG4uc3RhdGljU3R5bGUpJiZBKG4uc3R5bGUpJiZBKHIuc3RhdGljU3R5bGUpJiZBKHIuc3R5bGUpKSl7dmFyIGk9dC5lbG0sbz1yLnN0YXRpY1N0eWxlLGE9ci5ub3JtYWxpemVkU3R5bGV8fHIuc3R5bGV8fHt9LHM9b3x8YSxjPXByKHQuZGF0YS5zdHlsZSl8fHt9O3QuZGF0YS5ub3JtYWxpemVkU3R5bGU9RShjLl9fb2JfXyk/Tih7fSxjKTpjLGJyKGksZnVuY3Rpb24oZSx0KXt2YXIgbixyPXt9O2lmKHQpZm9yKHZhciBpPWU7aS5jb21wb25lbnRJbnN0YW5jZTspKGk9aS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUpJiZpLmRhdGEmJihuPWZyKGkuZGF0YSkpJiZOKHIsbik7KG49ZnIoZS5kYXRhKSkmJk4ocixuKTtmb3IodmFyIG89ZTtvPW8ucGFyZW50OylvLmRhdGEmJihuPWZyKG8uZGF0YSkpJiZOKHIsbik7cmV0dXJuIHJ9KHQsITApLHMsTHIpfX12YXIgQnI9e2NyZWF0ZTpOcix1cGRhdGU6TnJ9O2Z1bmN0aW9uIERyKGUpe2lmKGUpe2lmKCJvYmplY3QiPT10eXBlb2YgZSl7dmFyIHQ9e307cmV0dXJuITEhPT1lLmNzcyYmTih0LFJyKGUubmFtZXx8InYiKSksTih0LGUpLHR9cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP1JyKGUpOnZvaWQgMH19dmFyIFJyPXUoZnVuY3Rpb24oZSl7cmV0dXJue2VudGVyQ2xhc3M6ZSsiLWVudGVyIixlbnRlclRvQ2xhc3M6ZSsiLWVudGVyLXRvIixlbnRlckFjdGl2ZUNsYXNzOmUrIi1lbnRlci1hY3RpdmUiLGxlYXZlQ2xhc3M6ZSsiLWxlYXZlIixsZWF2ZVRvQ2xhc3M6ZSsiLWxlYXZlLXRvIixsZWF2ZUFjdGl2ZUNsYXNzOmUrIi1sZWF2ZS1hY3RpdmUifX0pO3EmJiFYJiYodm9pZCAwPT09d2luZG93Lm9udHJhbnNpdGlvbmVuZCYmd2luZG93Lm9ud2Via2l0dHJhbnNpdGlvbmVuZCx2b2lkIDA9PT13aW5kb3cub25hbmltYXRpb25lbmQmJndpbmRvdy5vbndlYmtpdGFuaW1hdGlvbmVuZCk7cSYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk7ZnVuY3Rpb24gRnIoZSxuKXt2YXIgcj1uLmVsbTtyLl9sZWF2ZUNiJiYoci5fbGVhdmVDYi5jYW5jZWxsZWQ9ITAsci5fbGVhdmVDYigpKTt2YXIgdD1EcihuLmRhdGEudHJhbnNpdGlvbik7aWYodCYmIXIuX2VudGVyQ2Ipe2Zvcih2YXIgaT10LmVudGVyQ2xhc3Msbz10LmVudGVyVG9DbGFzcyxhPXQuZW50ZXJBY3RpdmVDbGFzcyxzPXQuYXBwZWFyQ2xhc3MsYz10LmFwcGVhclRvQ2xhc3MsdT10LmFwcGVhckFjdGl2ZUNsYXNzLGw9dC5iZWZvcmVFbnRlcixkPXQuZW50ZXIsZj10LmFmdGVyRW50ZXIscD10LmVudGVyQ2FuY2VsbGVkLGg9dC5iZWZvcmVBcHBlYXIsdj10LmFwcGVhcixnPXQuYWZ0ZXJBcHBlYXIsbT10LmFwcGVhckNhbmNlbGxlZCx5PXRuLF89dG4uJHZub2RlO18mJl8ucGFyZW50Oyl5PShfPV8ucGFyZW50KS5jb250ZXh0O3ZhciBiPSF5Ll9pc01vdW50ZWR8fCFuLmlzUm9vdEluc2VydDtpZighYnx8dnx8IiI9PT12KXt2YXIgdz1iP3M6aSxrPWI/YzpvLFM9Yj91OmEseD1iJiZofHxsLEM9YiYmImZ1bmN0aW9uIj09dHlwZW9mIHY/djpkLFQ9YiYmZ3x8ZixPPWImJm18fHAsQT1DJiYxPChDLl9sZW5ndGh8fEMubGVuZ3RoKSxFPW4uY29udGV4dC4kb3B0aW9ucy5zdHlsZXx8e30sST1FW3ddLCQ9RVsiQFRSQU5TSVRJT04iXSYmRVsiQFRSQU5TSVRJT04iXVtTXXx8e30sUD1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPXt9LGE9dFtuXSxzPXRbcl0sYz10W2ldO2lmKGEpZm9yKHZhciB1IGluIGEpb1t1XT1lLnN0eWxlW3VdO2lmKGMpZm9yKHZhciBsIGluIGMpMCE9PWwuaW5kZXhPZigidHJhbnNpdGlvbiIpJiYob1tsXT1jW2xdKTtzJiZOKG8scyk7cmV0dXJuIG99KHIsRSx3LGssUyksTT0wPE9iamVjdC5rZXlzKFApLmxlbmd0aCxqPXIuX2VudGVyQ2I9RChmdW5jdGlvbigpe2ouY2FuY2VsbGVkP08mJk8ocik6VCYmVChyKSxyLl9lbnRlckNiPW51bGx9KTtpZihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGU9ci5wYXJlbnROb2RlLHQ9ZSYmZS5fcGVuZGluZyYmZS5fcGVuZGluZ1tuLmtleV07KHQmJnQuY29udGV4dD09PW4uY29udGV4dCYmdC50YWc9PT1uLnRhZyYmdC5lbG0uX2xlYXZlQ2ImJnQuZWxtLl9sZWF2ZUNiKCksQyYmQyhyLGopLE0pP24uY29udGV4dC4kcmVxdWlyZVdlZXhNb2R1bGUoImFuaW1hdGlvbiIpLnRyYW5zaXRpb24oci5yZWYse3N0eWxlczpQLGR1cmF0aW9uOiQuZHVyYXRpb258fDAsZGVsYXk6JC5kZWxheXx8MCx0aW1pbmdGdW5jdGlvbjokLnRpbWluZ0Z1bmN0aW9ufHwibGluZWFyIn0sQT9COmopOkF8fGooKX0sMTYpLHgmJngociksSSlpZigiZnVuY3Rpb24iPT10eXBlb2Ygci5zZXRTdHlsZXMpci5zZXRTdHlsZXMoSSk7ZWxzZSBmb3IodmFyIEwgaW4gSSlyLnNldFN0eWxlKEwsSVtMXSk7TXx8QXx8aigpfX19dmFyIFVyPWZ1bmN0aW9uKGUpe3ZhciByLHQseT17fSxuPWUubW9kdWxlcyxfPWUubm9kZU9wcztmb3Iocj0wO3I8bnIubGVuZ3RoOysrcilmb3IoeVtucltyXV09W10sdD0wO3Q8bi5sZW5ndGg7Kyt0KUUoblt0XVtucltyXV0pJiZ5W25yW3JdXS5wdXNoKG5bdF1bbnJbcl1dKTtmdW5jdGlvbiBvKGUpe3ZhciB0PV8ucGFyZW50Tm9kZShlKTtFKHQpJiZfLnJlbW92ZUNoaWxkKHQsZSl9ZnVuY3Rpb24gYihlLHQsbixyLGksbyxhKXtpZihFKGUuZWxtKSYmRShvKSYmKGU9b1thXT1wZShlKSksZS5pc1Jvb3RJbnNlcnQ9IWksIWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUuZGF0YTtpZihFKGkpKXt2YXIgbz1FKGUuY29tcG9uZW50SW5zdGFuY2UpJiZpLmtlZXBBbGl2ZTtpZihFKGk9aS5ob29rKSYmRShpPWkuaW5pdCkmJmkoZSwhMSxuLHIpLEUoZS5jb21wb25lbnRJbnN0YW5jZSkpcmV0dXJuIHAoZSx0KSxkKG4sZS5lbG0sciksSShvKSYmZnVuY3Rpb24oZSx0LG4scil7Zm9yKHZhciBpLG89ZTtvLmNvbXBvbmVudEluc3RhbmNlOylpZihvPW8uY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLEUoaT1vLmRhdGEpJiZFKGk9aS50cmFuc2l0aW9uKSl7Zm9yKGk9MDtpPHkuYWN0aXZhdGUubGVuZ3RoOysraSl5LmFjdGl2YXRlW2ldKHRyLG8pO3QucHVzaChvKTticmVha31kKG4sZS5lbG0scil9KGUsdCxuLHIpLCEwfX0oZSx0LG4scikpe3ZhciBzPWUuZGF0YSxjPWUuY2hpbGRyZW4sdT1lLnRhZztpZihFKHUpKXtlLmVsbT1lLm5zP18uY3JlYXRlRWxlbWVudE5TKGUubnMsdSk6Xy5jcmVhdGVFbGVtZW50KHUsZSksZihlKTt2YXIgbD1FKHMpJiZJKHMuYXBwZW5kQXNUcmVlKTtsfHwoRShzKSYmdihlLHQpLGQobixlLmVsbSxyKSksaChlLGMsdCksbCYmKEUocykmJnYoZSx0KSxkKG4sZS5lbG0scikpfWVsc2UgSShlLmlzQ29tbWVudCk/ZS5lbG09Xy5jcmVhdGVDb21tZW50KGUudGV4dCk6ZS5lbG09Xy5jcmVhdGVUZXh0Tm9kZShlLnRleHQpLGQobixlLmVsbSxyKX19ZnVuY3Rpb24gcChlLHQpe0UoZS5kYXRhLnBlbmRpbmdJbnNlcnQpJiYodC5wdXNoLmFwcGx5KHQsZS5kYXRhLnBlbmRpbmdJbnNlcnQpLGUuZGF0YS5wZW5kaW5nSW5zZXJ0PW51bGwpLGUuZWxtPWUuY29tcG9uZW50SW5zdGFuY2UuJGVsLHcoZSk/KHYoZSx0KSxmKGUpKTooUW4oZSksdC5wdXNoKGUpKX1mdW5jdGlvbiBkKGUsdCxuKXtFKGUpJiYoRShuKT9fLnBhcmVudE5vZGUobik9PT1lJiZfLmluc2VydEJlZm9yZShlLHQsbik6Xy5hcHBlbmRDaGlsZChlLHQpKX1mdW5jdGlvbiBoKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KHQpKWZvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKWIodFtyXSxuLGUuZWxtLG51bGwsITAsdCxyKTtlbHNlICQoZS50ZXh0KSYmXy5hcHBlbmRDaGlsZChlLmVsbSxfLmNyZWF0ZVRleHROb2RlKFN0cmluZyhlLnRleHQpKSl9ZnVuY3Rpb24gdyhlKXtmb3IoO2UuY29tcG9uZW50SW5zdGFuY2U7KWU9ZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7cmV0dXJuIEUoZS50YWcpfWZ1bmN0aW9uIHYoZSx0KXtmb3IodmFyIG49MDtuPHkuY3JlYXRlLmxlbmd0aDsrK24peS5jcmVhdGVbbl0odHIsZSk7RShyPWUuZGF0YS5ob29rKSYmKEUoci5jcmVhdGUpJiZyLmNyZWF0ZSh0cixlKSxFKHIuaW5zZXJ0KSYmdC5wdXNoKGUpKX1mdW5jdGlvbiBmKGUpe3ZhciB0O2lmKEUodD1lLmZuU2NvcGVJZCkpXy5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpO2Vsc2UgZm9yKHZhciBuPWU7bjspRSh0PW4uY29udGV4dCkmJkUodD10LiRvcHRpb25zLl9zY29wZUlkKSYmXy5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpLG49bi5wYXJlbnQ7RSh0PXRuKSYmdCE9PWUuY29udGV4dCYmdCE9PWUuZm5Db250ZXh0JiZFKHQ9dC4kb3B0aW9ucy5fc2NvcGVJZCkmJl8uc2V0U3R5bGVTY29wZShlLmVsbSx0KX1mdW5jdGlvbiBtKGUsdCxuLHIsaSxvKXtmb3IoO3I8PWk7KytyKWIobltyXSxvLGUsdCwhMSxuLHIpfWZ1bmN0aW9uIGsoZSl7dmFyIHQsbixyPWUuZGF0YTtpZihFKHIpKWZvcihFKHQ9ci5ob29rKSYmRSh0PXQuZGVzdHJveSkmJnQoZSksdD0wO3Q8eS5kZXN0cm95Lmxlbmd0aDsrK3QpeS5kZXN0cm95W3RdKGUpO2lmKEUodD1lLmNoaWxkcmVuKSlmb3Iobj0wO248ZS5jaGlsZHJlbi5sZW5ndGg7KytuKWsoZS5jaGlsZHJlbltuXSl9ZnVuY3Rpb24gUyhlLHQsbixyKXtmb3IoO248PXI7KytuKXt2YXIgaT10W25dO0UoaSkmJihFKGkudGFnKT8oYShpKSxrKGkpKTpvKGkuZWxtKSl9fWZ1bmN0aW9uIGEoZSx0KXtpZihFKHQpfHxFKGUuZGF0YSkpe3ZhciBuLHI9eS5yZW1vdmUubGVuZ3RoKzE7Zm9yKEUodCk/dC5saXN0ZW5lcnMrPXI6dD1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXswPT0tLW4ubGlzdGVuZXJzJiZvKGUpfXJldHVybiBuLmxpc3RlbmVycz10LG59KGUuZWxtLHIpLEUobj1lLmNvbXBvbmVudEluc3RhbmNlKSYmRShuPW4uX3Zub2RlKSYmRShuLmRhdGEpJiZhKG4sdCksbj0wO248eS5yZW1vdmUubGVuZ3RoOysrbil5LnJlbW92ZVtuXShlLHQpO0Uobj1lLmRhdGEuaG9vaykmJkUobj1uLnJlbW92ZSk/bihlLHQpOnQoKX1lbHNlIG8oZS5lbG0pfWZ1bmN0aW9uIHgoZSx0LG4scil7Zm9yKHZhciBpPW47aTxyO2krKyl7dmFyIG89dFtpXTtpZihFKG8pJiZycihlLG8pKXJldHVybiBpfX1mdW5jdGlvbiBDKGUsdCxuLHIsaSxvKXtpZihlIT09dCl7RSh0LmVsbSkmJkUocikmJih0PXJbaV09cGUodCkpO3ZhciBhPXQuZWxtPWUuZWxtO2lmKEkoZS5pc0FzeW5jUGxhY2Vob2xkZXIpKUUodC5hc3luY0ZhY3RvcnkucmVzb2x2ZWQpP08oZS5lbG0sdCxuKTp0LmlzQXN5bmNQbGFjZWhvbGRlcj0hMDtlbHNlIGlmKEkodC5pc1N0YXRpYykmJkkoZS5pc1N0YXRpYykmJnQua2V5PT09ZS5rZXkmJihJKHQuaXNDbG9uZWQpfHxJKHQuaXNPbmNlKSkpdC5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlO2Vsc2V7dmFyIHMsYz10LmRhdGE7RShjKSYmRShzPWMuaG9vaykmJkUocz1zLnByZXBhdGNoKSYmcyhlLHQpO3ZhciB1PWUuY2hpbGRyZW4sbD10LmNoaWxkcmVuO2lmKEUoYykmJncodCkpe2ZvcihzPTA7czx5LnVwZGF0ZS5sZW5ndGg7KytzKXkudXBkYXRlW3NdKGUsdCk7RShzPWMuaG9vaykmJkUocz1zLnVwZGF0ZSkmJnMoZSx0KX1BKHQudGV4dCk/RSh1KSYmRShsKT91IT09bCYmZnVuY3Rpb24oZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLGM9MCx1PTAsbD10Lmxlbmd0aC0xLGQ9dFswXSxmPXRbbF0scD1uLmxlbmd0aC0xLGg9blswXSx2PW5bcF0sZz0haTtjPD1sJiZ1PD1wOylBKGQpP2Q9dFsrK2NdOkEoZik/Zj10Wy0tbF06cnIoZCxoKT8oQyhkLGgscixuLHUpLGQ9dFsrK2NdLGg9blsrK3VdKTpycihmLHYpPyhDKGYsdixyLG4scCksZj10Wy0tbF0sdj1uWy0tcF0pOnJyKGQsdik/KEMoZCx2LHIsbixwKSxnJiZfLmluc2VydEJlZm9yZShlLGQuZWxtLF8ubmV4dFNpYmxpbmcoZi5lbG0pKSxkPXRbKytjXSx2PW5bLS1wXSk6KHJyKGYsaCk/KEMoZixoLHIsbix1KSxnJiZfLmluc2VydEJlZm9yZShlLGYuZWxtLGQuZWxtKSxmPXRbLS1sXSk6KEEobykmJihvPWlyKHQsYyxsKSksQShhPUUoaC5rZXkpP29baC5rZXldOngoaCx0LGMsbCkpP2IoaCxyLGUsZC5lbG0sITEsbix1KTpycihzPXRbYV0saCk/KEMocyxoLHIsbix1KSx0W2FdPXZvaWQgMCxnJiZfLmluc2VydEJlZm9yZShlLHMuZWxtLGQuZWxtKSk6YihoLHIsZSxkLmVsbSwhMSxuLHUpKSxoPW5bKyt1XSk7bDxjP20oZSxBKG5bcCsxXSk/bnVsbDpuW3ArMV0uZWxtLG4sdSxwLHIpOnA8dSYmUygwLHQsYyxsKX0oYSx1LGwsbixvKTpFKGwpPyhFKGUudGV4dCkmJl8uc2V0VGV4dENvbnRlbnQoYSwiIiksbShhLG51bGwsbCwwLGwubGVuZ3RoLTEsbikpOkUodSk/UygwLHUsMCx1Lmxlbmd0aC0xKTpFKGUudGV4dCkmJl8uc2V0VGV4dENvbnRlbnQoYSwiIik6ZS50ZXh0IT09dC50ZXh0JiZfLnNldFRleHRDb250ZW50KGEsdC50ZXh0KSxFKGMpJiZFKHM9Yy5ob29rKSYmRShzPXMucG9zdHBhdGNoKSYmcyhlLHQpfX19ZnVuY3Rpb24gVChlLHQsbil7aWYoSShuKSYmRShlLnBhcmVudCkpZS5wYXJlbnQuZGF0YS5wZW5kaW5nSW5zZXJ0PXQ7ZWxzZSBmb3IodmFyIHI9MDtyPHQubGVuZ3RoOysrcil0W3JdLmRhdGEuaG9vay5pbnNlcnQodFtyXSl9dmFyIGc9cygiYXR0cnMsY2xhc3Msc3RhdGljQ2xhc3Msc3RhdGljU3R5bGUsa2V5Iik7ZnVuY3Rpb24gTyhlLHQsbixyKXt2YXIgaSxvPXQudGFnLGE9dC5kYXRhLHM9dC5jaGlsZHJlbjtpZihyPXJ8fGEmJmEucHJlLHQuZWxtPWUsSSh0LmlzQ29tbWVudCkmJkUodC5hc3luY0ZhY3RvcnkpKXJldHVybiB0LmlzQXN5bmNQbGFjZWhvbGRlcj0hMDtpZihFKGEpJiYoRShpPWEuaG9vaykmJkUoaT1pLmluaXQpJiZpKHQsITApLEUoaT10LmNvbXBvbmVudEluc3RhbmNlKSkpcmV0dXJuIHAodCxuKSwhMDtpZihFKG8pKXtpZihFKHMpKWlmKGUuaGFzQ2hpbGROb2RlcygpKWlmKEUoaT1hKSYmRShpPWkuZG9tUHJvcHMpJiZFKGk9aS5pbm5lckhUTUwpKXtpZihpIT09ZS5pbm5lckhUTUwpcmV0dXJuITF9ZWxzZXtmb3IodmFyIGM9ITAsdT1lLmZpcnN0Q2hpbGQsbD0wO2w8cy5sZW5ndGg7bCsrKXtpZighdXx8IU8odSxzW2xdLG4scikpe2M9ITE7YnJlYWt9dT11Lm5leHRTaWJsaW5nfWlmKCFjfHx1KXJldHVybiExfWVsc2UgaCh0LHMsbik7aWYoRShhKSl7dmFyIGQ9ITE7Zm9yKHZhciBmIGluIGEpaWYoIWcoZikpe2Q9ITAsdih0LG4pO2JyZWFrfSFkJiZhLmNsYXNzJiZIZShhLmNsYXNzKX19ZWxzZSBlLmRhdGEhPT10LnRleHQmJihlLmRhdGE9dC50ZXh0KTtyZXR1cm4hMH1yZXR1cm4gZnVuY3Rpb24oZSx0LG4scixpLG8pe2lmKCFBKHQpKXt2YXIgYSxzPSExLGM9W107aWYoQShlKSlzPSEwLGIodCxjLGksbyk7ZWxzZXt2YXIgdT1FKGUubm9kZVR5cGUpO2lmKCF1JiZycihlLHQpKUMoZSx0LGMsbnVsbCxudWxsLHIpO2Vsc2V7aWYodSl7aWYoMT09PWUubm9kZVR5cGUmJmUuaGFzQXR0cmlidXRlKE0pJiYoZS5yZW1vdmVBdHRyaWJ1dGUoTSksbj0hMCksSShuKSYmTyhlLHQsYykpcmV0dXJuIFQodCxjLCEwKSxlO2E9ZSxlPW5ldyB1ZShfLnRhZ05hbWUoYSkudG9Mb3dlckNhc2UoKSx7fSxbXSx2b2lkIDAsYSl9dmFyIGw9ZS5lbG0sZD1fLnBhcmVudE5vZGUobCk7aWYoYih0LGMsbC5fbGVhdmVDYj9udWxsOmQsXy5uZXh0U2libGluZyhsKSksRSh0LnBhcmVudCkpZm9yKHZhciBmPXQucGFyZW50LHA9dyh0KTtmOyl7Zm9yKHZhciBoPTA7aDx5LmRlc3Ryb3kubGVuZ3RoOysraCl5LmRlc3Ryb3lbaF0oZik7aWYoZi5lbG09dC5lbG0scCl7Zm9yKHZhciB2PTA7djx5LmNyZWF0ZS5sZW5ndGg7Kyt2KXkuY3JlYXRlW3ZdKHRyLGYpO3ZhciBnPWYuZGF0YS5ob29rLmluc2VydDtpZihnLm1lcmdlZClmb3IodmFyIG09MTttPGcuZm5zLmxlbmd0aDttKyspZy5mbnNbbV0oKX1lbHNlIFFuKGYpO2Y9Zi5wYXJlbnR9RShkKT9TKDAsW2VdLDAsMCk6RShlLnRhZykmJmsoZSl9fXJldHVybiBUKHQsYyxzKSx0LmVsbX1FKGUpJiZrKGUpfX0oe25vZGVPcHM6S24sbW9kdWxlczpbbXIsSXIsanIsQnIse2NyZWF0ZTpGcixhY3RpdmF0ZTpGcixyZW1vdmU6ZnVuY3Rpb24obixlKXt2YXIgcj1uLmVsbTtyLl9lbnRlckNiJiYoci5fZW50ZXJDYi5jYW5jZWxsZWQ9ITAsci5fZW50ZXJDYigpKTt2YXIgdD1EcihuLmRhdGEudHJhbnNpdGlvbik7aWYoIXQpcmV0dXJuIGUoKTtpZihyLl9sZWF2ZUNiKXJldHVybjt2YXIgaT10LmxlYXZlQ2xhc3Msbz10LmxlYXZlVG9DbGFzcyxhPXQubGVhdmVBY3RpdmVDbGFzcyxzPXQuYmVmb3JlTGVhdmUsYz10LmxlYXZlLHU9dC5hZnRlckxlYXZlLGw9dC5sZWF2ZUNhbmNlbGxlZCxkPXQuZGVsYXlMZWF2ZSxmPWMmJjE8KGMuX2xlbmd0aHx8Yy5sZW5ndGgpLHA9bi5jb250ZXh0LiRvcHRpb25zLnN0eWxlfHx7fSxoPXBbaV0sdj1wW29dfHxwW2FdLGc9cFsiQFRSQU5TSVRJT04iXSYmcFsiQFRSQU5TSVRJT04iXVthXXx8e30sbT1yLl9sZWF2ZUNiPUQoZnVuY3Rpb24oKXtyLnBhcmVudE5vZGUmJnIucGFyZW50Tm9kZS5fcGVuZGluZyYmKHIucGFyZW50Tm9kZS5fcGVuZGluZ1tuLmtleV09bnVsbCksbS5jYW5jZWxsZWQ/bCYmbChyKTooZSgpLHUmJnUocikpLHIuX2xlYXZlQ2I9bnVsbH0pO2Q/ZCh5KTp5KCk7ZnVuY3Rpb24geSgpe3ZhciBlPW4uY29udGV4dC4kcmVxdWlyZVdlZXhNb2R1bGUoImFuaW1hdGlvbiIpO2Z1bmN0aW9uIHQoKXtlLnRyYW5zaXRpb24oci5yZWYse3N0eWxlczp2LGR1cmF0aW9uOmcuZHVyYXRpb258fDAsZGVsYXk6Zy5kZWxheXx8MCx0aW1pbmdGdW5jdGlvbjpnLnRpbWluZ0Z1bmN0aW9ufHwibGluZWFyIn0sZj9COm0pfW0uY2FuY2VsbGVkfHwobi5kYXRhLnNob3d8fCgoci5wYXJlbnROb2RlLl9wZW5kaW5nfHwoci5wYXJlbnROb2RlLl9wZW5kaW5nPXt9KSlbbi5rZXldPW4pLHMmJnMociksaD9lLnRyYW5zaXRpb24oci5yZWYse3N0eWxlczpofSx0KTp0KCksYyYmYyhyLG0pLHZ8fGZ8fG0oKSl9fX1dLmNvbmNhdChsciksTE9OR19MSVNUX1RIUkVTSE9MRDoxMH0pLHpyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZlKTtmdW5jdGlvbiBWcihlLHIpe3ZhciBpPWUuJGVsO3JldHVybiBpJiYiZnVuY3Rpb24iPT10eXBlb2YgaVtyXT9mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07cmV0dXJuIGlbcl0uYXBwbHkoaSx0KX06KGllKCJDYW4ndCBmaW5kIGNvbXBvbmVudCBtZXRob2QgXCIiK3IrJyIgb24gJytpLnR5cGUpLEIpfWZ1bmN0aW9uIHFyKGUsbil7QXJyYXkuaXNBcnJheShuKSYmKCFmdW5jdGlvbihmLG4pe2Zvcih2YXIgZT1mdW5jdGlvbihlLHQpe3ZhciBkPXpyW2VdO0YobixkLGZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTt2YXIgcj10aGlzLmxlbmd0aCxpPXZlW2RdOyJmdW5jdGlvbiI9PXR5cGVvZiBpJiZpLmFwcGx5KHRoaXMsdCk7dmFyIG89VnIoZiwicmVtb3ZlRGF0YSIpLGE9VnIoZiwiaW5zZXJ0UmFuZ2UiKSxzPVZyKGYsInNldExpc3REYXRhIik7c3dpdGNoKGQpe2Nhc2UicHVzaCI6YShyLHQpO2JyZWFrO2Nhc2UicG9wIjpvKHItMSwxKTticmVhaztjYXNlInNoaWZ0IjpvKDAsMSk7YnJlYWs7Y2FzZSJ1bnNoaWZ0IjphKDAsdCk7YnJlYWs7Y2FzZSJzcGxpY2UiOnZhciBjPXRbMF0sdT10WzFdLGw9dC5zbGljZSgyKTswPHUmJm8oYyx1KSwwPGwubGVuZ3RoJiZhKGMsbCk7YnJlYWs7Y2FzZSJzb3J0IjpjYXNlInJldmVyc2UiOnModGhpcy5zbGljZSgpKX19KX0sdD0wLHI9enIubGVuZ3RoO3Q8cjt0KyspZSh0KX0oZSxuKSxuLmZvckVhY2goZnVuY3Rpb24odCl7ZCh0KSYmIWYodCwiW1tXYXRjaGVkXV0iKSYmKEYodCwiW1tXYXRjaGVkXV0iLCEwKSxlLiR3YXRjaChmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0KXRbZV19LGZ1bmN0aW9uKCl7VnIoZSwidXBkYXRlRGF0YSIpKG4uaW5kZXhPZih0KSx0KX0se2RlZXA6ITB9KSl9KSl9dmFyIFdyPXtuYW1lOiJyZWN5Y2xlLWxpc3QiLG1ldGhvZHM6e2Nsb3Nlc3Q6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1hcmd1bWVudHMsbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGg7ci0tOyluW3JdPXRbcl07cmV0dXJuKGU9dGhpcy4kZWwpLmNsb3Nlc3QuYXBwbHkoZSxuKX0scXVlcnlFbGVtZW50OmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9YXJndW1lbnRzLG49W10scj1hcmd1bWVudHMubGVuZ3RoO3ItLTspbltyXT10W3JdO3JldHVybihlPXRoaXMuJGVsKS5xdWVyeUVsZW1lbnQuYXBwbHkoZSxuKX0scXVlcnlFbGVtZW50QWxsOmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9YXJndW1lbnRzLG49W10scj1hcmd1bWVudHMubGVuZ3RoO3ItLTspbltyXT10W3JdO3JldHVybihlPXRoaXMuJGVsKS5xdWVyeUVsZW1lbnRBbGwuYXBwbHkoZSxuKX0sc2Nyb2xsVG9FbGVtZW50OmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9YXJndW1lbnRzLG49W10scj1hcmd1bWVudHMubGVuZ3RoO3ItLTspbltyXT10W3JdO3JldHVybihlPXRoaXMuJGVsKS5zY3JvbGxUb0VsZW1lbnQuYXBwbHkoZSxuKX0scmVzZXRMb2FkbW9yZTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cyxuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09dFtyXTtyZXR1cm4oZT10aGlzLiRlbCkucmVzZXRMb2FkbW9yZS5hcHBseShlLG4pfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYodGhpcy5fdm5vZGUmJnRoaXMuJG9wdGlvbnNbIltbVXNlQ2FjaGVdXSJdKXJldHVybiBGKHRoaXMuJG9wdGlvbnMsIltbVXNlQ2FjaGVdXSIsITEpLHRoaXMuX3Zub2RlO3ZhciBuPXRoaXMuJG9wdGlvbnMucGFyZW50LHI9dGhpcy4kYXR0cnMuYmluZGluZ0V4cHJlc3Npb247cmV0dXJuIG4mJnImJihuLiR3YXRjaChyLGZ1bmN0aW9uKCl7cmV0dXJuIEYodC4kb3B0aW9ucywiW1tVc2VDYWNoZV1dIiwhMCl9LHtkZWVwOiEwLGltbWVkaWF0ZTohMH0pLHFyKHRoaXMsdGhpcy4kYXR0cnMubGlzdERhdGEpLG4uJHdhdGNoKHIsZnVuY3Rpb24oZSl7cXIodCxlKX0pKSx0aGlzLl9ldmVudHMuX2F0dGFjaF9zbG90PWZ1bmN0aW9uKGUpe0V0KHQuJHBhcmVudHx8dCxlLnBvc2l0aW9uLGUucmVmcyl9LHRoaXMuX2V2ZW50cy5fZGV0YWNoX3Nsb3Q9ZnVuY3Rpb24oZSl7RXQodC4kcGFyZW50fHx0LGUucG9zaXRpb24sZS5yZWZzLCEwKX0sZSgid2VleDpyZWN5Y2xlLWxpc3QiLHtvbjp0aGlzLl9ldmVudHN9LHRoaXMuJHNsb3RzLmRlZmF1bHQpfSxyZW5kZXJFcnJvcjpmdW5jdGlvbihlLHQpe3JldHVybiBlKCJ0ZXh0Iix7c3R5bGU6e2ZvbnRTaXplOiIzNnB4Iixjb2xvcjoiI0ZGMDAwMCJ9LHZhbHVlOnQudG9TdHJpbmcoKX0pfX0sSHI9e25hbWU6U3RyaW5nLGFwcGVhcjpCb29sZWFuLGNzczpCb29sZWFuLG1vZGU6U3RyaW5nLHR5cGU6U3RyaW5nLGVudGVyQ2xhc3M6U3RyaW5nLGxlYXZlQ2xhc3M6U3RyaW5nLGVudGVyVG9DbGFzczpTdHJpbmcsbGVhdmVUb0NsYXNzOlN0cmluZyxlbnRlckFjdGl2ZUNsYXNzOlN0cmluZyxsZWF2ZUFjdGl2ZUNsYXNzOlN0cmluZyxhcHBlYXJDbGFzczpTdHJpbmcsYXBwZWFyQWN0aXZlQ2xhc3M6U3RyaW5nLGFwcGVhclRvQ2xhc3M6U3RyaW5nLGR1cmF0aW9uOltOdW1iZXIsU3RyaW5nLE9iamVjdF19O2Z1bmN0aW9uIEdyKGUpe3ZhciB0PWUmJmUuY29tcG9uZW50T3B0aW9ucztyZXR1cm4gdCYmdC5DdG9yLm9wdGlvbnMuYWJzdHJhY3Q/R3IoWHQodC5jaGlsZHJlbikpOmV9ZnVuY3Rpb24gSnIoZSl7dmFyIHQ9e30sbj1lLiRvcHRpb25zO2Zvcih2YXIgciBpbiBuLnByb3BzRGF0YSl0W3JdPWVbcl07dmFyIGk9bi5fcGFyZW50TGlzdGVuZXJzO2Zvcih2YXIgbyBpbiBpKXRbaChvKV09aVtvXTtyZXR1cm4gdH1mdW5jdGlvbiBYcihlLHQpe2lmKC9cZC1rZWVwLWFsaXZlJC8udGVzdCh0LnRhZykpcmV0dXJuIGUoImtlZXAtYWxpdmUiLHtwcm9wczp0LmNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhfSl9dmFyIFlyPWZ1bmN0aW9uKGUpe3JldHVybiBlLnRhZ3x8SnQoZSl9LEtyPWZ1bmN0aW9uKGUpe3JldHVybiJzaG93Ij09PWUubmFtZX0sWnI9e25hbWU6InRyYW5zaXRpb24iLHByb3BzOkhyLGFic3RyYWN0OiEwLHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy4kc2xvdHMuZGVmYXVsdDtpZihuJiYobj1uLmZpbHRlcihZcikpLmxlbmd0aCl7dmFyIHI9dGhpcy5tb2RlLGk9blswXTtpZihmdW5jdGlvbihlKXtmb3IoO2U9ZS5wYXJlbnQ7KWlmKGUuZGF0YS50cmFuc2l0aW9uKXJldHVybiEwfSh0aGlzLiR2bm9kZSkpcmV0dXJuIGk7dmFyIG89R3IoaSk7aWYoIW8pcmV0dXJuIGk7aWYodGhpcy5fbGVhdmluZylyZXR1cm4gWHIoZSxpKTt2YXIgYT0iX190cmFuc2l0aW9uLSIrdGhpcy5fdWlkKyItIjtvLmtleT1udWxsPT1vLmtleT9vLmlzQ29tbWVudD9hKyJjb21tZW50IjphK28udGFnOiQoby5rZXkpPzA9PT1TdHJpbmcoby5rZXkpLmluZGV4T2YoYSk/by5rZXk6YStvLmtleTpvLmtleTt2YXIgcyxjLHU9KG8uZGF0YXx8KG8uZGF0YT17fSkpLnRyYW5zaXRpb249SnIodGhpcyksbD10aGlzLl92bm9kZSxkPUdyKGwpO2lmKG8uZGF0YS5kaXJlY3RpdmVzJiZvLmRhdGEuZGlyZWN0aXZlcy5zb21lKEtyKSYmKG8uZGF0YS5zaG93PSEwKSxkJiZkLmRhdGEmJihzPW8sKGM9ZCkua2V5IT09cy5rZXl8fGMudGFnIT09cy50YWcpJiYhSnQoZCkmJighZC5jb21wb25lbnRJbnN0YW5jZXx8IWQuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLmlzQ29tbWVudCkpe3ZhciBmPWQuZGF0YS50cmFuc2l0aW9uPU4oe30sdSk7aWYoIm91dC1pbiI9PT1yKXJldHVybiB0aGlzLl9sZWF2aW5nPSEwLFllKGYsImFmdGVyTGVhdmUiLGZ1bmN0aW9uKCl7dC5fbGVhdmluZz0hMSx0LiRmb3JjZVVwZGF0ZSgpfSksWHIoZSxpKTtpZigiaW4tb3V0Ij09PXIpe2lmKEp0KG8pKXJldHVybiBsO3ZhciBwLGg9ZnVuY3Rpb24oKXtwKCl9O1llKHUsImFmdGVyRW50ZXIiLGgpLFllKHUsImVudGVyQ2FuY2VsbGVkIixoKSxZZShmLCJkZWxheUxlYXZlIixmdW5jdGlvbihlKXtwPWV9KX19cmV0dXJuIGl9fX0sUXI9Tih7dGFnOlN0cmluZyxtb3ZlQ2xhc3M6U3RyaW5nfSxIcik7ZGVsZXRlIFFyLm1vZGU7dmFyIGVpPXtSZWN5Y2xlTGlzdDpXcixUcmFuc2l0aW9uOlpyLFRyYW5zaXRpb25Hcm91cDp7cHJvcHM6UXIsY3JlYXRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJHJlcXVpcmVXZWV4TW9kdWxlKCJkb20iKTt0aGlzLmdldFBvc2l0aW9uPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe2UuZ2V0Q29tcG9uZW50UmVjdChyLnJlZixmdW5jdGlvbihlKXtlLnJlc3VsdD90KGUuc2l6ZSk6bihuZXcgRXJyb3IoImZhaWxlZCB0byBnZXQgcmVjdCBmb3IgZWxlbWVudDogIityLnRhZykpfSl9KX07dmFyIHI9dGhpcy4kcmVxdWlyZVdlZXhNb2R1bGUoImFuaW1hdGlvbiIpO3RoaXMuYW5pbWF0ZT1mdW5jdGlvbih0LG4pe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtyLnRyYW5zaXRpb24odC5yZWYsbixlKX0pfX0scmVuZGVyOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLnRhZ3x8dGhpcy4kdm5vZGUuZGF0YS50YWd8fCJzcGFuIixuPU9iamVjdC5jcmVhdGUobnVsbCkscj10aGlzLnByZXZDaGlsZHJlbj10aGlzLmNoaWxkcmVuLGk9dGhpcy4kc2xvdHMuZGVmYXVsdHx8W10sbz10aGlzLmNoaWxkcmVuPVtdLGE9SnIodGhpcykscz0wO3M8aS5sZW5ndGg7cysrKXt2YXIgYz1pW3NdO2MudGFnJiZudWxsIT1jLmtleSYmMCE9PVN0cmluZyhjLmtleSkuaW5kZXhPZigiX192bGlzdCIpJiYoby5wdXNoKGMpLCgobltjLmtleV09YykuZGF0YXx8KGMuZGF0YT17fSkpLnRyYW5zaXRpb249YSl9aWYocil7dmFyIHU9W10sbD1bXTtyLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5kYXRhLnRyYW5zaXRpb249YSxuW2Uua2V5XT91LnB1c2goZSk6bC5wdXNoKGUpfSksdGhpcy5rZXB0PWUodCxudWxsLHUpLHRoaXMucmVtb3ZlZD1sfXJldHVybiBlKHQsbnVsbCxvKX0sYmVmb3JlVXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fX3BhdGNoX18odGhpcy5fdm5vZGUsdGhpcy5rZXB0LCExLCEwKSx0aGlzLl92bm9kZT10aGlzLmtlcHR9LHVwZGF0ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByZXZDaGlsZHJlbix0PXRoaXMubW92ZUNsYXNzfHwodGhpcy5uYW1lfHwidiIpKyItbW92ZSI7ZS5sZW5ndGgmJnRoaXMuZ2V0TW92ZURhdGEoZVswXS5jb250ZXh0LHQpfSxtZXRob2RzOntnZXRNb3ZlRGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuPWUuJG9wdGlvbnMuc3R5bGV8fHt9O3JldHVybiBuWyJAVFJBTlNJVElPTiJdJiZuWyJAVFJBTlNJVElPTiJdW3RdfX19fSx0aT1zKCJ0ZW1wbGF0ZSxzY3JpcHQsc3R5bGUsZWxlbWVudCxjb250ZW50LHNsb3QsbGluayxtZXRhLHN2Zyx2aWV3LGEsZGl2LGltZyxpbWFnZSx0ZXh0LHUtdGV4dCxzcGFuLGlucHV0LHRleHRhcmVhLHNwaW5uZXIsc2VsZWN0LHNsaWRlcixzbGlkZXItbmVpZ2hib3IsaW5kaWNhdG9yLGNhbnZhcyxsaXN0LGNlbGwsaGVhZGVyLGxvYWRpbmcsbG9hZGluZy1pbmRpY2F0b3IscmVmcmVzaCxzY3JvbGxhYmxlLHNjcm9sbGVyLHZpZGVvLHdlYixlbWJlZCx0YWJiYXIsdGFiaGVhZGVyLGRhdGVwaWNrZXIsdGltZXBpY2tlcixtYXJxdWVlLGNvdW50ZG93biIsITApLG5pPShzKCJ3ZWIsc3Bpbm5lcixzd2l0Y2gsdmlkZW8sdGV4dGFyZWEsY2FudmFzLGluZGljYXRvcixtYXJxdWVlLGNvdW50ZG93biIsITApLHMoInJpY2h0ZXh0LHRyYW5zaXRpb24sdHJhbnNpdGlvbi1ncm91cCxyZWN5Y2xlLWxpc3QiLCEwKSk7cygiZW1iZWQsaW1nLGltYWdlLGlucHV0LGxpbmssbWV0YSIsITApO0JuLmNvbmZpZy5tdXN0VXNlUHJvcD1mdW5jdGlvbigpe3JldHVybiExfSxCbi5jb25maWcuaXNSZXNlcnZlZFRhZz10aSxCbi5jb25maWcuaXNSdW50aW1lQ29tcG9uZW50PW5pLEJuLmNvbmZpZy5pc1Vua25vd25FbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuITF9LEJuLm9wdGlvbnMuZGlyZWN0aXZlcz17fSxCbi5vcHRpb25zLmNvbXBvbmVudHM9ZWksQm4ucHJvdG90eXBlLl9fcGF0Y2hfXz1VcixCbi5wcm90b3R5cGUuJG1vdW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG49dGhpcyxyPWUmJihvPXRoaXMuJGRvY3VtZW50LChhPW8uY3JlYXRlQ29tbWVudCgicm9vdCIpKS5oYXNBdHRyaWJ1dGU9YS5yZW1vdmVBdHRyaWJ1dGU9QixvLmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChhKSxhKSxpPXQsbi4kZWw9cixuLiRvcHRpb25zLnJlbmRlcnx8KG4uJG9wdGlvbnMucmVuZGVyPWRlKSxhbihuLCJiZWZvcmVNb3VudCIpLG5ldyBtbihuLGZ1bmN0aW9uKCl7bi5fdXBkYXRlKG4uX3JlbmRlcigpLGkpfSxCLHtiZWZvcmU6ZnVuY3Rpb24oKXtuLl9pc01vdW50ZWQmJiFuLl9pc0Rlc3Ryb3llZCYmYW4obiwiYmVmb3JlVXBkYXRlIil9fSwhMCksaT0hMSxudWxsPT1uLiR2bm9kZSYmKG4uX2lzTW91bnRlZD0hMCxhbihuLCJtb3VudGVkIikpLG47dmFyIG4scixpLG8sYX0sQm4ucHJvdG90eXBlLl9fY2FsbF9ob29rPWZ1bmN0aW9uKGUsdCl7c2UoKTt2YXIgbixyPXRoaXMuJG9wdGlvbnNbZV0saT1lKyIgaG9vayI7aWYocilmb3IodmFyIG89MCxhPXIubGVuZ3RoO288YTtvKyspbj1CZShyW29dLHRoaXMsdD9bdF06bnVsbCx0aGlzLGkpO3JldHVybiB0aGlzLl9oYXNIb29rRXZlbnQmJnRoaXMuJGVtaXQoImhvb2s6IitlLHQpLGNlKCksbn0sZS5WdWU9Qm59fSk7dW53cmFwRXhwb3J0cyhmYWN0b3J5KTt2YXIgd2VleFZ1ZUZyYW1ld29yaz1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZD17fTt0LmNyZWF0ZUluc3RhbmNlQ29udGV4dD1mdW5jdGlvbihlLHQsbil7dm9pZCAwPT09biYmKG49e30pO3ZhciByLGksbyxhLHM9dC53ZWV4LGM9KGRbZV09e2luc3RhbmNlSWQ6ZSxjb25maWc6cy5jb25maWcsZG9jdW1lbnQ6cy5kb2N1bWVudCxkYXRhOm59KS5WdWU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O2ZhY3Rvcnkocix0LmRvY3VtZW50LG4pO3ZhciBpPXIuVnVlLG89ZFtlXSxhPS9ed2VleDovaSxzPWkuY29uZmlnLmlzUmVzZXJ2ZWRUYWd8fGZ1bmN0aW9uKCl7cmV0dXJuITF9LGM9aS5jb25maWcuaXNSdW50aW1lQ29tcG9uZW50fHxmdW5jdGlvbigpe3JldHVybiExfTtyZXR1cm4gaS5jb25maWcuaXNSZXNlcnZlZFRhZz1mdW5jdGlvbihlKXtyZXR1cm4hYyhlKSYmdC5zdXBwb3J0cygiQGNvbXBvbmVudC8iK2UpfHxzKGUpfHxhLnRlc3QoZSl9LGkuY29uZmlnLnBhcnNlUGxhdGZvcm1UYWdOYW1lPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoYSwiIil9LGkucHJvdG90eXBlLiRpbnN0YW5jZUlkPWUsaS5wcm90b3R5cGUuJGRvY3VtZW50PW8uZG9jdW1lbnQsaS5wcm90b3R5cGUuJHJlcXVpcmVXZWV4TW9kdWxlPXQucmVxdWlyZU1vZHVsZSxpLm1peGluKHtiZWZvcmVDcmVhdGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRvcHRpb25zO2lmKGUuZWwpe3ZhciB0PWUuZGF0YSxuPSgiZnVuY3Rpb24iPT10eXBlb2YgdD90KCk6dCl8fHt9O2UuZGF0YT1PYmplY3QuYXNzaWduKG4sby5kYXRhKSxvLmFwcD10aGlzfX0sbW91bnRlZDpmdW5jdGlvbigpe2lmKHRoaXMuJG9wdGlvbnMuZWwmJnQuZG9jdW1lbnQmJm8uYXBwPT09dGhpcyl0cnl7dC5kb2N1bWVudC50YXNrQ2VudGVyLnNlbmQoImRvbSIse2FjdGlvbjoiY3JlYXRlRmluaXNoIn0sW10pfWNhdGNoKGUpe319fSksaS5wcm90b3R5cGUuJGdldENvbmZpZz1mdW5jdGlvbigpe2lmKG8uYXBwIGluc3RhbmNlb2YgaSlyZXR1cm4gby5jb25maWd9LGl9KGUscyx0LlNoYXJlZE9iamVjdCksdT0ocj1lLGk9cy5yZXF1aXJlTW9kdWxlLG89ZFtyXSxhPWkoInRpbWVyIikse3NldFRpbWVvdXQ6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1lW25dO2lmKGEuc2V0VGltZW91dCl7dmFyIHI9by5kb2N1bWVudC50YXNrQ2VudGVyLmNhbGxiYWNrTWFuYWdlci5sYXN0Q2FsbGJhY2tJZDtyZXR1cm4gYS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dFswXS5hcHBseSh0LHQuc2xpY2UoMikpfSx0WzFdKSwocisxKS50b1N0cmluZygpfX0sc2V0SW50ZXJ2YWw6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1lW25dO2lmKGEuc2V0SW50ZXJ2YWwpe3ZhciByPW8uZG9jdW1lbnQudGFza0NlbnRlci5jYWxsYmFja01hbmFnZXIubGFzdENhbGxiYWNrSWQ7cmV0dXJuIGEuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0WzBdLmFwcGx5KHQsdC5zbGljZSgyKSl9LHRbMV0pLChyKzEpLnRvU3RyaW5nKCl9fSxjbGVhclRpbWVvdXQ6ZnVuY3Rpb24oZSl7YS5jbGVhclRpbWVvdXQmJmEuY2xlYXJUaW1lb3V0KGUpfSxjbGVhckludGVydmFsOmZ1bmN0aW9uKGUpe2EuY2xlYXJJbnRlcnZhbCYmYS5jbGVhckludGVydmFsKGUpfX0pLGw9T2JqZWN0LmFzc2lnbih7VnVlOmN9LHUpO3JldHVybiBPYmplY3QuZnJlZXplKGwpLGx9LHQuZGVzdHJveUluc3RhbmNlPWZ1bmN0aW9uKGUpe3ZhciB0PWRbZV07aWYodCYmdC5hcHAgaW5zdGFuY2VvZiB0LlZ1ZSl7dHJ5e3QuYXBwLiRkZXN0cm95KCksdC5kb2N1bWVudC5kZXN0cm95KCl9Y2F0Y2goZSl7fWRlbGV0ZSB0LmRvY3VtZW50LGRlbGV0ZSB0LmFwcH1kZWxldGUgZFtlXX0sdC5yZWZyZXNoSW5zdGFuY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj1kW2VdO2lmKCEobiYmbi5hcHAgaW5zdGFuY2VvZiBuLlZ1ZSkpcmV0dXJuIG5ldyBFcnJvcigicmVmcmVzaEluc3RhbmNlOiBpbnN0YW5jZSAiK2UrIiBub3QgZm91bmQhIik7aWYobi5WdWUmJm4uVnVlLnNldClmb3IodmFyIHIgaW4gdCluLlZ1ZS5zZXQobi5hcHAscix0W3JdKTtuLmRvY3VtZW50LnRhc2tDZW50ZXIuc2VuZCgiZG9tIix7YWN0aW9uOiJyZWZyZXNoRmluaXNoIn0sW10pfX0pLGluZGV4PXVud3JhcEV4cG9ydHMod2VleFZ1ZUZyYW1ld29yayksd2VleFZ1ZUZyYW1ld29ya18xPXdlZXhWdWVGcmFtZXdvcmsuY3JlYXRlSW5zdGFuY2VDb250ZXh0LHdlZXhWdWVGcmFtZXdvcmtfMj13ZWV4VnVlRnJhbWV3b3JrLmRlc3Ryb3lJbnN0YW5jZSx3ZWV4VnVlRnJhbWV3b3JrXzM9d2VleFZ1ZUZyYW1ld29yay5yZWZyZXNoSW5zdGFuY2UsVnVlPU9iamVjdC5mcmVlemUoe2RlZmF1bHQ6aW5kZXgsX19tb2R1bGVFeHBvcnRzOndlZXhWdWVGcmFtZXdvcmssY3JlYXRlSW5zdGFuY2VDb250ZXh0OndlZXhWdWVGcmFtZXdvcmtfMSxkZXN0cm95SW5zdGFuY2U6d2VleFZ1ZUZyYW1ld29ya18yLHJlZnJlc2hJbnN0YW5jZTp3ZWV4VnVlRnJhbWV3b3JrXzN9KTtzZXROYXRpdmVDb25zb2xlKCksc2V0dXAoe1Z1ZTpWdWV9KX0pOwo=