@asgardeo/auth-spa 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -450,7 +450,7 @@ function(t){return iF(this,void 0,void 0,c().mark((function e(){return c().wrap(
450
450
  * @memberof AsgardeoAuthClient
451
451
  *
452
452
  * @preserve
453
- */},{key:"didSignOutFail",value:function(t){var e=new URL(t),n=e.searchParams.get("state"),r=Boolean(e.searchParams.get("error"));return!!n&&"sign_out_success"===n&&r}},{key:"clearUserSessionData",value:function(t){return iF(this,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this._authenticationCore.clearUserSessionData(t);case 2:case"end":return e.stop()}}),e,this)})))}}]),t}();function LF(t,e,n){var r=void 0===e?null:e,i=function(t,e){var n=atob(t);if(e){for(var r=new Uint8Array(n.length),i=0,c=n.length;i<c;++i)r[i]=n.charCodeAt(i);return String.fromCharCode.apply(null,new Uint16Array(r.buffer))}return n}(t,void 0!==n&&n),c=i.indexOf("\n",10)+1,a=i.substring(c)+(r?"//# sourceMappingURL="+r:""),o=new Blob([a],{type:"application/javascript"});return URL.createObjectURL(o)}var JF,xF,HF,kF,UF,TF,wF=(JF="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlLHQpe3ZhciByPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKG49bi5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCkuZW51bWVyYWJsZX0pKSksci5wdXNoLmFwcGx5KHIsbil9cmV0dXJuIHJ9ZnVuY3Rpb24gdCh0KXtmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbcl0/YXJndW1lbnRzW3JdOnt9O3IlMj9lKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7Yyh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6ZShPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiByKCl7Ci8qISByZWdlbmVyYXRvci1ydW50aW1lIC0tIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLiAtLSBsaWNlbnNlIChNSVQpOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL0xJQ0VOU0UgKi8Kcj1mdW5jdGlvbigpe3JldHVybiBlfTt2YXIgZT17fSx0PU9iamVjdC5wcm90b3R5cGUsbj10Lmhhc093blByb3BlcnR5LGE9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbD9TeW1ib2w6e30saT1hLml0ZXJhdG9yfHwiQEBpdGVyYXRvciIsbz1hLmFzeW5jSXRlcmF0b3J8fCJAQGFzeW5jSXRlcmF0b3IiLHM9YS50b1N0cmluZ1RhZ3x8IkBAdG9TdHJpbmdUYWciO2Z1bmN0aW9uIHUoZSx0LHIpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksZVt0XX10cnl7dSh7fSwiIil9Y2F0Y2goZSl7dT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGVbdF09cn19ZnVuY3Rpb24gYyhlLHQscixuKXt2YXIgYT10JiZ0LnByb3RvdHlwZSBpbnN0YW5jZW9mIGg/dDpoLGk9T2JqZWN0LmNyZWF0ZShhLnByb3RvdHlwZSksbz1uZXcgUyhufHxbXSk7cmV0dXJuIGkuX2ludm9rZT1mdW5jdGlvbihlLHQscil7dmFyIG49InN1c3BlbmRlZFN0YXJ0IjtyZXR1cm4gZnVuY3Rpb24oYSxpKXtpZigiZXhlY3V0aW5nIj09PW4pdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7aWYoImNvbXBsZXRlZCI9PT1uKXtpZigidGhyb3ciPT09YSl0aHJvdyBpO3JldHVybiBUKCl9Zm9yKHIubWV0aG9kPWEsci5hcmc9aTs7KXt2YXIgbz1yLmRlbGVnYXRlO2lmKG8pe3ZhciBzPWsobyxyKTtpZihzKXtpZihzPT09bCljb250aW51ZTtyZXR1cm4gc319aWYoIm5leHQiPT09ci5tZXRob2Qpci5zZW50PXIuX3NlbnQ9ci5hcmc7ZWxzZSBpZigidGhyb3ciPT09ci5tZXRob2Qpe2lmKCJzdXNwZW5kZWRTdGFydCI9PT1uKXRocm93IG49ImNvbXBsZXRlZCIsci5hcmc7ci5kaXNwYXRjaEV4Y2VwdGlvbihyLmFyZyl9ZWxzZSJyZXR1cm4iPT09ci5tZXRob2QmJnIuYWJydXB0KCJyZXR1cm4iLHIuYXJnKTtuPSJleGVjdXRpbmciO3ZhciB1PWYoZSx0LHIpO2lmKCJub3JtYWwiPT09dS50eXBlKXtpZihuPXIuZG9uZT8iY29tcGxldGVkIjoic3VzcGVuZGVkWWllbGQiLHUuYXJnPT09bCljb250aW51ZTtyZXR1cm57dmFsdWU6dS5hcmcsZG9uZTpyLmRvbmV9fSJ0aHJvdyI9PT11LnR5cGUmJihuPSJjb21wbGV0ZWQiLHIubWV0aG9kPSJ0aHJvdyIsci5hcmc9dS5hcmcpfX19KGUscixvKSxpfWZ1bmN0aW9uIGYoZSx0LHIpe3RyeXtyZXR1cm57dHlwZToibm9ybWFsIixhcmc6ZS5jYWxsKHQscil9fWNhdGNoKGUpe3JldHVybnt0eXBlOiJ0aHJvdyIsYXJnOmV9fX1lLndyYXA9Yzt2YXIgbD17fTtmdW5jdGlvbiBoKCl7fWZ1bmN0aW9uIHAoKXt9ZnVuY3Rpb24gZCgpe312YXIgdj17fTt1KHYsaSwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKTt2YXIgZz1PYmplY3QuZ2V0UHJvdG90eXBlT2YseT1nJiZnKGcoRShbXSkpKTt5JiZ5IT09dCYmbi5jYWxsKHksaSkmJih2PXkpO3ZhciBtPWQucHJvdG90eXBlPWgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodik7ZnVuY3Rpb24gdyhlKXtbIm5leHQiLCJ0aHJvdyIsInJldHVybiJdLmZvckVhY2goKGZ1bmN0aW9uKHQpe3UoZSx0LChmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5faW52b2tlKHQsZSl9KSl9KSl9ZnVuY3Rpb24gYihlLHQpe2Z1bmN0aW9uIHIoYSxpLG8scyl7dmFyIHU9ZihlW2FdLGUsaSk7aWYoInRocm93IiE9PXUudHlwZSl7dmFyIGM9dS5hcmcsbD1jLnZhbHVlO3JldHVybiBsJiYib2JqZWN0Ij09dHlwZW9mIGwmJm4uY2FsbChsLCJfX2F3YWl0Iik/dC5yZXNvbHZlKGwuX19hd2FpdCkudGhlbigoZnVuY3Rpb24oZSl7cigibmV4dCIsZSxvLHMpfSksKGZ1bmN0aW9uKGUpe3IoInRocm93IixlLG8scyl9KSk6dC5yZXNvbHZlKGwpLnRoZW4oKGZ1bmN0aW9uKGUpe2MudmFsdWU9ZSxvKGMpfSksKGZ1bmN0aW9uKGUpe3JldHVybiByKCJ0aHJvdyIsZSxvLHMpfSkpfXModS5hcmcpfXZhciBhO3RoaXMuX2ludm9rZT1mdW5jdGlvbihlLG4pe2Z1bmN0aW9uIGkoKXtyZXR1cm4gbmV3IHQoKGZ1bmN0aW9uKHQsYSl7cihlLG4sdCxhKX0pKX1yZXR1cm4gYT1hP2EudGhlbihpLGkpOmkoKX19ZnVuY3Rpb24gayhlLHQpe3ZhciByPWUuaXRlcmF0b3JbdC5tZXRob2RdO2lmKHZvaWQgMD09PXIpe2lmKHQuZGVsZWdhdGU9bnVsbCwidGhyb3ciPT09dC5tZXRob2Qpe2lmKGUuaXRlcmF0b3IucmV0dXJuJiYodC5tZXRob2Q9InJldHVybiIsdC5hcmc9dm9pZCAwLGsoZSx0KSwidGhyb3ciPT09dC5tZXRob2QpKXJldHVybiBsO3QubWV0aG9kPSJ0aHJvdyIsdC5hcmc9bmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZCIpfXJldHVybiBsfXZhciBuPWYocixlLml0ZXJhdG9yLHQuYXJnKTtpZigidGhyb3ciPT09bi50eXBlKXJldHVybiB0Lm1ldGhvZD0idGhyb3ciLHQuYXJnPW4uYXJnLHQuZGVsZWdhdGU9bnVsbCxsO3ZhciBhPW4uYXJnO3JldHVybiBhP2EuZG9uZT8odFtlLnJlc3VsdE5hbWVdPWEudmFsdWUsdC5uZXh0PWUubmV4dExvYywicmV0dXJuIiE9PXQubWV0aG9kJiYodC5tZXRob2Q9Im5leHQiLHQuYXJnPXZvaWQgMCksdC5kZWxlZ2F0ZT1udWxsLGwpOmE6KHQubWV0aG9kPSJ0aHJvdyIsdC5hcmc9bmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKSx0LmRlbGVnYXRlPW51bGwsbCl9ZnVuY3Rpb24geChlKXt2YXIgdD17dHJ5TG9jOmVbMF19OzEgaW4gZSYmKHQuY2F0Y2hMb2M9ZVsxXSksMiBpbiBlJiYodC5maW5hbGx5TG9jPWVbMl0sdC5hZnRlckxvYz1lWzNdKSx0aGlzLnRyeUVudHJpZXMucHVzaCh0KX1mdW5jdGlvbiBfKGUpe3ZhciB0PWUuY29tcGxldGlvbnx8e307dC50eXBlPSJub3JtYWwiLGRlbGV0ZSB0LmFyZyxlLmNvbXBsZXRpb249dH1mdW5jdGlvbiBTKGUpe3RoaXMudHJ5RW50cmllcz1be3RyeUxvYzoicm9vdCJ9XSxlLmZvckVhY2goeCx0aGlzKSx0aGlzLnJlc2V0KCEwKX1mdW5jdGlvbiBFKGUpe2lmKGUpe3ZhciB0PWVbaV07aWYodClyZXR1cm4gdC5jYWxsKGUpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlLm5leHQpcmV0dXJuIGU7aWYoIWlzTmFOKGUubGVuZ3RoKSl7dmFyIHI9LTEsYT1mdW5jdGlvbiB0KCl7Zm9yKDsrK3I8ZS5sZW5ndGg7KWlmKG4uY2FsbChlLHIpKXJldHVybiB0LnZhbHVlPWVbcl0sdC5kb25lPSExLHQ7cmV0dXJuIHQudmFsdWU9dm9pZCAwLHQuZG9uZT0hMCx0fTtyZXR1cm4gYS5uZXh0PWF9fXJldHVybntuZXh0OlR9fWZ1bmN0aW9uIFQoKXtyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fXJldHVybiBwLnByb3RvdHlwZT1kLHUobSwiY29uc3RydWN0b3IiLGQpLHUoZCwiY29uc3RydWN0b3IiLHApLHAuZGlzcGxheU5hbWU9dShkLHMsIkdlbmVyYXRvckZ1bmN0aW9uIiksZS5pc0dlbmVyYXRvckZ1bmN0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLmNvbnN0cnVjdG9yO3JldHVybiEhdCYmKHQ9PT1wfHwiR2VuZXJhdG9yRnVuY3Rpb24iPT09KHQuZGlzcGxheU5hbWV8fHQubmFtZSkpfSxlLm1hcms9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSxkKTooZS5fX3Byb3RvX189ZCx1KGUscywiR2VuZXJhdG9yRnVuY3Rpb24iKSksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShtKSxlfSxlLmF3cmFwPWZ1bmN0aW9uKGUpe3JldHVybntfX2F3YWl0OmV9fSx3KGIucHJvdG90eXBlKSx1KGIucHJvdG90eXBlLG8sKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSksZS5Bc3luY0l0ZXJhdG9yPWIsZS5hc3luYz1mdW5jdGlvbih0LHIsbixhLGkpe3ZvaWQgMD09PWkmJihpPVByb21pc2UpO3ZhciBvPW5ldyBiKGModCxyLG4sYSksaSk7cmV0dXJuIGUuaXNHZW5lcmF0b3JGdW5jdGlvbihyKT9vOm8ubmV4dCgpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBlLmRvbmU/ZS52YWx1ZTpvLm5leHQoKX0pKX0sdyhtKSx1KG0scywiR2VuZXJhdG9yIiksdShtLGksKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSksdShtLCJ0b1N0cmluZyIsKGZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgR2VuZXJhdG9yXSJ9KSksZS5rZXlzPWZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgciBpbiBlKXQucHVzaChyKTtyZXR1cm4gdC5yZXZlcnNlKCksZnVuY3Rpb24gcigpe2Zvcig7dC5sZW5ndGg7KXt2YXIgbj10LnBvcCgpO2lmKG4gaW4gZSlyZXR1cm4gci52YWx1ZT1uLHIuZG9uZT0hMSxyfXJldHVybiByLmRvbmU9ITAscn19LGUudmFsdWVzPUUsUy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlMscmVzZXQ6ZnVuY3Rpb24oZSl7aWYodGhpcy5wcmV2PTAsdGhpcy5uZXh0PTAsdGhpcy5zZW50PXRoaXMuX3NlbnQ9dm9pZCAwLHRoaXMuZG9uZT0hMSx0aGlzLmRlbGVnYXRlPW51bGwsdGhpcy5tZXRob2Q9Im5leHQiLHRoaXMuYXJnPXZvaWQgMCx0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChfKSwhZSlmb3IodmFyIHQgaW4gdGhpcykidCI9PT10LmNoYXJBdCgwKSYmbi5jYWxsKHRoaXMsdCkmJiFpc05hTigrdC5zbGljZSgxKSkmJih0aGlzW3RdPXZvaWQgMCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmRvbmU9ITA7dmFyIGU9dGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247aWYoInRocm93Ij09PWUudHlwZSl0aHJvdyBlLmFyZztyZXR1cm4gdGhpcy5ydmFsfSxkaXNwYXRjaEV4Y2VwdGlvbjpmdW5jdGlvbihlKXtpZih0aGlzLmRvbmUpdGhyb3cgZTt2YXIgdD10aGlzO2Z1bmN0aW9uIHIocixuKXtyZXR1cm4gby50eXBlPSJ0aHJvdyIsby5hcmc9ZSx0Lm5leHQ9cixuJiYodC5tZXRob2Q9Im5leHQiLHQuYXJnPXZvaWQgMCksISFufWZvcih2YXIgYT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7YT49MDstLWEpe3ZhciBpPXRoaXMudHJ5RW50cmllc1thXSxvPWkuY29tcGxldGlvbjtpZigicm9vdCI9PT1pLnRyeUxvYylyZXR1cm4gcigiZW5kIik7aWYoaS50cnlMb2M8PXRoaXMucHJldil7dmFyIHM9bi5jYWxsKGksImNhdGNoTG9jIiksdT1uLmNhbGwoaSwiZmluYWxseUxvYyIpO2lmKHMmJnUpe2lmKHRoaXMucHJldjxpLmNhdGNoTG9jKXJldHVybiByKGkuY2F0Y2hMb2MsITApO2lmKHRoaXMucHJldjxpLmZpbmFsbHlMb2MpcmV0dXJuIHIoaS5maW5hbGx5TG9jKX1lbHNlIGlmKHMpe2lmKHRoaXMucHJldjxpLmNhdGNoTG9jKXJldHVybiByKGkuY2F0Y2hMb2MsITApfWVsc2V7aWYoIXUpdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpO2lmKHRoaXMucHJldjxpLmZpbmFsbHlMb2MpcmV0dXJuIHIoaS5maW5hbGx5TG9jKX19fX0sYWJydXB0OmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtyPj0wOy0tcil7dmFyIGE9dGhpcy50cnlFbnRyaWVzW3JdO2lmKGEudHJ5TG9jPD10aGlzLnByZXYmJm4uY2FsbChhLCJmaW5hbGx5TG9jIikmJnRoaXMucHJldjxhLmZpbmFsbHlMb2Mpe3ZhciBpPWE7YnJlYWt9fWkmJigiYnJlYWsiPT09ZXx8ImNvbnRpbnVlIj09PWUpJiZpLnRyeUxvYzw9dCYmdDw9aS5maW5hbGx5TG9jJiYoaT1udWxsKTt2YXIgbz1pP2kuY29tcGxldGlvbjp7fTtyZXR1cm4gby50eXBlPWUsby5hcmc9dCxpPyh0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5uZXh0PWkuZmluYWxseUxvYyxsKTp0aGlzLmNvbXBsZXRlKG8pfSxjb21wbGV0ZTpmdW5jdGlvbihlLHQpe2lmKCJ0aHJvdyI9PT1lLnR5cGUpdGhyb3cgZS5hcmc7cmV0dXJuImJyZWFrIj09PWUudHlwZXx8ImNvbnRpbnVlIj09PWUudHlwZT90aGlzLm5leHQ9ZS5hcmc6InJldHVybiI9PT1lLnR5cGU/KHRoaXMucnZhbD10aGlzLmFyZz1lLmFyZyx0aGlzLm1ldGhvZD0icmV0dXJuIix0aGlzLm5leHQ9ImVuZCIpOiJub3JtYWwiPT09ZS50eXBlJiZ0JiYodGhpcy5uZXh0PXQpLGx9LGZpbmlzaDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO3Q+PTA7LS10KXt2YXIgcj10aGlzLnRyeUVudHJpZXNbdF07aWYoci5maW5hbGx5TG9jPT09ZSlyZXR1cm4gdGhpcy5jb21wbGV0ZShyLmNvbXBsZXRpb24sci5hZnRlckxvYyksXyhyKSxsfX0sY2F0Y2g6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTt0Pj0wOy0tdCl7dmFyIHI9dGhpcy50cnlFbnRyaWVzW3RdO2lmKHIudHJ5TG9jPT09ZSl7dmFyIG49ci5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT1uLnR5cGUpe3ZhciBhPW4uYXJnO18ocil9cmV0dXJuIGF9fXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iil9LGRlbGVnYXRlWWllbGQ6ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB0aGlzLmRlbGVnYXRlPXtpdGVyYXRvcjpFKGUpLHJlc3VsdE5hbWU6dCxuZXh0TG9jOnJ9LCJuZXh0Ij09PXRoaXMubWV0aG9kJiYodGhpcy5hcmc9dm9pZCAwKSxsfX0sZX1mdW5jdGlvbiBuKGUpe3JldHVybiBuPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxuKGUpfWZ1bmN0aW9uIGEoZSx0LHIsbixhLGksbyl7dHJ5e3ZhciBzPWVbaV0obyksdT1zLnZhbHVlfWNhdGNoKGUpe3JldHVybiB2b2lkIHIoZSl9cy5kb25lP3QodSk6UHJvbWlzZS5yZXNvbHZlKHUpLnRoZW4obixhKX1mdW5jdGlvbiBpKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMscj1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLGkpe3ZhciBvPWUuYXBwbHkodCxyKTtmdW5jdGlvbiBzKGUpe2EobyxuLGkscyx1LCJuZXh0IixlKX1mdW5jdGlvbiB1KGUpe2EobyxuLGkscyx1LCJ0aHJvdyIsZSl9cyh2b2lkIDApfSkpfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gcyhlLHQpe2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgbj10W3JdO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbi5rZXksbil9fWZ1bmN0aW9uIHUoZSx0LHIpe3JldHVybiB0JiZzKGUucHJvdG90eXBlLHQpLHImJnMoZSxyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlfWZ1bmN0aW9uIGMoZSx0LHIpe3JldHVybiB0IGluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09cixlfWZ1bmN0aW9uIGYoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksdCYmaChlLHQpfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGw9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSl9LGwoZSl9ZnVuY3Rpb24gaChlLHQpe3JldHVybiBoPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX19wcm90b19fPXQsZX0saChlLHQpfWZ1bmN0aW9uIHAoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIGQoZSx0LHIpe3JldHVybiBkPXAoKT9SZWZsZWN0LmNvbnN0cnVjdC5iaW5kKCk6ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPVtudWxsXTtuLnB1c2guYXBwbHkobix0KTt2YXIgYT1uZXcoRnVuY3Rpb24uYmluZC5hcHBseShlLG4pKTtyZXR1cm4gciYmaChhLHIucHJvdG90eXBlKSxhfSxkLmFwcGx5KG51bGwsYXJndW1lbnRzKX1mdW5jdGlvbiB2KGUpe3ZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiBNYXA/bmV3IE1hcDp2b2lkIDA7cmV0dXJuIHY9ZnVuY3Rpb24oZSl7aWYobnVsbD09PWV8fChyPWUsLTE9PT1GdW5jdGlvbi50b1N0cmluZy5jYWxsKHIpLmluZGV4T2YoIltuYXRpdmUgY29kZV0iKSkpcmV0dXJuIGU7dmFyIHI7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTtpZih2b2lkIDAhPT10KXtpZih0LmhhcyhlKSlyZXR1cm4gdC5nZXQoZSk7dC5zZXQoZSxuKX1mdW5jdGlvbiBuKCl7cmV0dXJuIGQoZSxhcmd1bWVudHMsbCh0aGlzKS5jb25zdHJ1Y3Rvcil9cmV0dXJuIG4ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpuLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGgobixlKX0sdihlKX1mdW5jdGlvbiBnKGUpe2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiB5KGUsdCl7aWYodCYmKCJvYmplY3QiPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQpKXJldHVybiB0O2lmKHZvaWQgMCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWQiKTtyZXR1cm4gZyhlKX1mdW5jdGlvbiBtKGUpe3ZhciB0PXAoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcixuPWwoZSk7aWYodCl7dmFyIGE9bCh0aGlzKS5jb25zdHJ1Y3RvcjtyPVJlZmxlY3QuY29uc3RydWN0KG4sYXJndW1lbnRzLGEpfWVsc2Ugcj1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4geSh0aGlzLHIpfX1mdW5jdGlvbiB3KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGV9KGUpfHxmdW5jdGlvbihlLHQpe3ZhciByPW51bGw9PWU/bnVsbDoidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmZVtTeW1ib2wuaXRlcmF0b3JdfHxlWyJAQGl0ZXJhdG9yIl07aWYobnVsbD09cilyZXR1cm47dmFyIG4sYSxpPVtdLG89ITAscz0hMTt0cnl7Zm9yKHI9ci5jYWxsKGUpOyEobz0obj1yLm5leHQoKSkuZG9uZSkmJihpLnB1c2gobi52YWx1ZSksIXR8fGkubGVuZ3RoIT09dCk7bz0hMCk7fWNhdGNoKGUpe3M9ITAsYT1lfWZpbmFsbHl7dHJ5e298fG51bGw9PXIucmV0dXJufHxyLnJldHVybigpfWZpbmFsbHl7aWYocyl0aHJvdyBhfX1yZXR1cm4gaX0oZSx0KXx8ayhlLHQpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gYihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4geChlKX0oZSl8fGZ1bmN0aW9uKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZudWxsIT1lW1N5bWJvbC5pdGVyYXRvcl18fG51bGwhPWVbIkBAaXRlcmF0b3IiXSlyZXR1cm4gQXJyYXkuZnJvbShlKX0oZSl8fGsoZSl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gayhlLHQpe2lmKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4geChlLHQpO3ZhciByPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtyZXR1cm4iT2JqZWN0Ij09PXImJmUuY29uc3RydWN0b3ImJihyPWUuY29uc3RydWN0b3IubmFtZSksIk1hcCI9PT1yfHwiU2V0Ij09PXI/QXJyYXkuZnJvbShlKToiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpP3goZSx0KTp2b2lkIDB9fWZ1bmN0aW9uIHgoZSx0KXsobnVsbD09dHx8dD5lLmxlbmd0aCkmJih0PWUubGVuZ3RoKTtmb3IodmFyIHI9MCxuPW5ldyBBcnJheSh0KTtyPHQ7cisrKW5bcl09ZVtyXTtyZXR1cm4gbn1mdW5jdGlvbiBfKGUsdCl7dmFyIHI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJmVbU3ltYm9sLml0ZXJhdG9yXXx8ZVsiQEBpdGVyYXRvciJdO2lmKCFyKXtpZihBcnJheS5pc0FycmF5KGUpfHwocj1rKGUpKXx8dCYmZSYmIm51bWJlciI9PXR5cGVvZiBlLmxlbmd0aCl7ciYmKGU9cik7dmFyIG49MCxhPWZ1bmN0aW9uKCl7fTtyZXR1cm57czphLG46ZnVuY3Rpb24oKXtyZXR1cm4gbj49ZS5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOmVbbisrXX19LGU6ZnVuY3Rpb24oZSl7dGhyb3cgZX0sZjphfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGksbz0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7cj1yLmNhbGwoZSl9LG46ZnVuY3Rpb24oKXt2YXIgZT1yLm5leHQoKTtyZXR1cm4gbz1lLmRvbmUsZX0sZTpmdW5jdGlvbihlKXtzPSEwLGk9ZX0sZjpmdW5jdGlvbigpe3RyeXtvfHxudWxsPT1yLnJldHVybnx8ci5yZXR1cm4oKX1maW5hbGx5e2lmKHMpdGhyb3cgaX19fX1mdW5jdGlvbiBTKGUsdCxyLG4pe3JldHVybiBuZXcocnx8KHI9UHJvbWlzZSkpKChmdW5jdGlvbihhLGkpe2Z1bmN0aW9uIG8oZSl7dHJ5e3Uobi5uZXh0KGUpKX1jYXRjaChlKXtpKGUpfX1mdW5jdGlvbiBzKGUpe3RyeXt1KG4udGhyb3coZSkpfWNhdGNoKGUpe2koZSl9fWZ1bmN0aW9uIHUoZSl7dmFyIHQ7ZS5kb25lP2EoZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygcj90Om5ldyByKChmdW5jdGlvbihlKXtlKHQpfSkpKS50aGVuKG8scyl9dSgobj1uLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSkpfWZ1bmN0aW9uIEUoZSx0LHIsbil7cmV0dXJuIG5ldyhyfHwocj1Qcm9taXNlKSkoKGZ1bmN0aW9uKGEsaSl7ZnVuY3Rpb24gbyhlKXt0cnl7dShuLm5leHQoZSkpfWNhdGNoKGUpe2koZSl9fWZ1bmN0aW9uIHMoZSl7dHJ5e3Uobi50aHJvdyhlKSl9Y2F0Y2goZSl7aShlKX19ZnVuY3Rpb24gdShlKXt2YXIgdDtlLmRvbmU/YShlLnZhbHVlKToodD1lLnZhbHVlLHQgaW5zdGFuY2VvZiByP3Q6bmV3IHIoKGZ1bmN0aW9uKGUpe2UodCl9KSkpLnRoZW4obyxzKX11KChuPW4uYXBwbHkoZSx0fHxbXSkpLm5leHQoKSl9KSl9dmFyIFQ7IWZ1bmN0aW9uKGUpe2UuZm9ybVBvc3Q9ImZvcm1fcG9zdCIsZS5xdWVyeT0icXVlcnkifShUfHwoVD17fSkpO3ZhciBBOyFmdW5jdGlvbihlKXtlLkNvbmZpZ0RhdGE9ImNvbmZpZ19kYXRhIixlLk9JRENQcm92aWRlck1ldGFEYXRhPSJvaWRjX3Byb3ZpZGVyX21ldGFfZGF0YSIsZS5TZXNzaW9uRGF0YT0ic2Vzc2lvbl9kYXRhIixlLlRlbXBvcmFyeURhdGE9InRlbXBvcmFyeV9kYXRhIn0oQXx8KEE9e30pKTt2YXIgUixDPSJyZWZyZXNoX3Rva2VuX3RpbWVyIixQPVsiUlMyNTYiLCJSUzUxMiIsIlJTMzg0IiwiUFMyNTYiXSxEPSJzaWduX291dF91cmwiLE89InNpZ25fb3V0X3N1Y2Nlc3MiOyFmdW5jdGlvbihlKXtlLkluY2x1ZGU9ImluY2x1ZGUiLGUuU2FtZU9yaWdpbj0ic2FtZS1vcmlnaW4iLGUuT21pdD0ib21pdCJ9KFJ8fChSPXt9KSk7dmFyIEk9dSgoZnVuY3Rpb24gZSh0LHIsbil7byh0aGlzLGUpLHRoaXMubWVzc2FnZT1uLHRoaXMubmFtZT1yLHRoaXMuY29kZT10LE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCh0aGlzIGluc3RhbmNlb2YgZT90aGlzLmNvbnN0cnVjdG9yOnZvaWQgMCkucHJvdG90eXBlKX0pKSxMPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe28odGhpcyxlKX1yZXR1cm4gdShlLG51bGwsW3trZXk6ImZpbHRlckNsYWltc0Zyb21JRFRva2VuUGF5bG9hZCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtudWxsPT10fHxkZWxldGUgdC5pc3MsbnVsbD09dHx8ZGVsZXRlIHQuYXVkLG51bGw9PXR8fGRlbGV0ZSB0LmV4cCxudWxsPT10fHxkZWxldGUgdC5pYXQsbnVsbD09dHx8ZGVsZXRlIHQuYWNyLG51bGw9PXR8fGRlbGV0ZSB0LmFtcixudWxsPT10fHxkZWxldGUgdC5henAsbnVsbD09dHx8ZGVsZXRlIHQuYXV0aF90aW1lLG51bGw9PXR8fGRlbGV0ZSB0Lm5vbmNlLG51bGw9PXR8fGRlbGV0ZSB0LmNfaGFzaCxudWxsPT10fHxkZWxldGUgdC5hdF9oYXNoLG51bGw9PXR8fGRlbGV0ZSB0Lm5iZixudWxsPT10fHxkZWxldGUgdC5pc2ssbnVsbD09dHx8ZGVsZXRlIHQuc2lkO3ZhciByPXt9O3JldHVybiBPYmplY3QuZW50cmllcyh0KS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD13KGUsMiksbj10WzBdLGE9dFsxXSxpPW4uc3BsaXQoIl8iKS5tYXAoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIDA9PT10P2U6W2VbMF0udG9VcHBlckNhc2UoKV0uY29uY2F0KGIoZS5zbGljZSgxKSkpLmpvaW4oIiIpfSkpLmpvaW4oIiIpO3JbaV09YX0pKSxyfX0se2tleToiZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uIiwiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn19fSx7a2V5OiJnZW5lcmF0ZVN0YXRlUGFyYW1Gb3JSZXF1ZXN0Q29ycmVsYXRpb24iLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIHI9cGFyc2VJbnQoZS5zcGxpdCgiIyIpWzFdKTtyZXR1cm4gdD8iIi5jb25jYXQodCwiX3JlcXVlc3RfIikuY29uY2F0KHIpOiJyZXF1ZXN0XyIuY29uY2F0KHIpfX0se2tleToiZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuInBrY2VfY29kZV92ZXJpZmllciMiLmNvbmNhdChwYXJzZUludChlLnNwbGl0KCJyZXF1ZXN0XyIpWzFdKSl9fV0pLGV9KCk7TC5nZXRUZW5hbnREb21haW5Gcm9tSWRUb2tlblBheWxvYWQ9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiJAIixyPWUuc3ViLnNwbGl0KHQpO3JldHVybiByLmxlbmd0aD4yP3Jbci5sZW5ndGgtMV06IiJ9O3ZhciBVLEgsTT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXt2YXIgYT10aGlzO28odGhpcyxlKSx0aGlzLl9kYXRhTGF5ZXI9dCx0aGlzLl9jb25maWc9ZnVuY3Rpb24oKXtyZXR1cm4gRShhLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpO2Nhc2UgMjpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsZS5zZW50KTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX0sdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gRShhLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKTtjYXNlIDI6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGUuc2VudCk7Y2FzZSAzOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9LHRoaXMuX2NyeXB0b0hlbHBlcj1ufXJldHVybiB1KGUsW3trZXk6InJlc29sdmVFbmRwb2ludHMiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3ZhciBuLGE7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gbj17fSx0Lm5leHQ9Myx0aGlzLl9jb25maWcoKTtjYXNlIDM6cmV0dXJuIGE9dC5zZW50LHQuYWJydXB0KCJyZXR1cm4iLChhLmVuZHBvaW50cyYmT2JqZWN0LmtleXMoYS5lbmRwb2ludHMpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvW0EtWl0vZywoZnVuY3Rpb24oZSl7cmV0dXJuIl8iLmNvbmNhdChlLnRvTG93ZXJDYXNlKCkpfSkpO25bdF09KG51bGw9PWE/dm9pZCAwOmEuZW5kcG9pbnRzKT9hLmVuZHBvaW50c1tlXToiIn0pKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSksbikpKTtjYXNlIDU6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6InJlc29sdmVFbmRwb2ludHNFeHBsaWNpdGx5Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3ZhciB0LG4sYTtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiB0PXt9LGUubmV4dD0zLHRoaXMuX2NvbmZpZygpO2Nhc2UgMzppZihuPWUuc2VudCxhPVsiYXV0aG9yaXphdGlvbl9lbmRwb2ludCIsImVuZF9zZXNzaW9uX2VuZHBvaW50Iiwiandrc191cmkiLCJjaGVja19zZXNzaW9uX2lmcmFtZSIsInJldm9jYXRpb25fZW5kcG9pbnQiLCJ0b2tlbl9lbmRwb2ludCIsImlzc3VlciIsInVzZXJpbmZvX2VuZHBvaW50Il0sbi5lbmRwb2ludHMmJk9iamVjdC5rZXlzKG51bGw9PW4/dm9pZCAwOm4uZW5kcG9pbnRzKS5ldmVyeSgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKC9bQS1aXS9nLChmdW5jdGlvbihlKXtyZXR1cm4iXyIuY29uY2F0KGUudG9Mb3dlckNhc2UoKSl9KSk7cmV0dXJuIGEuaW5jbHVkZXModCl9KSkpe2UubmV4dD03O2JyZWFrfXRocm93IG5ldyBJKCJKUy1BVVRIX0hFTFBFUi1SRUUtTkYwMSIsIk5vIHJlcXVpcmVkIGVuZHBvaW50cy4iLCJSZXF1aXJlZCBvaWRjIGVuZHBvaW50cyBhcmUgbm90IGRlZmluZWQiKTtjYXNlIDc6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLChuLmVuZHBvaW50cyYmT2JqZWN0LmtleXMobi5lbmRwb2ludHMpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciByPWUucmVwbGFjZSgvW0EtWl0vZywoZnVuY3Rpb24oZSl7cmV0dXJuIl8iLmNvbmNhdChlLnRvTG93ZXJDYXNlKCkpfSkpO3Rbcl09KG51bGw9PW4/dm9pZCAwOm4uZW5kcG9pbnRzKT9uLmVuZHBvaW50c1tlXToiIn0pKSxPYmplY3QuYXNzaWduKHt9LHQpKSk7Y2FzZSA4OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9fSx7a2V5OiJyZXNvbHZlRW5kcG9pbnRzQnlCYXNlVVJMIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3ZhciB0LG4sYSxpO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIHQ9e30sZS5uZXh0PTMsdGhpcy5fY29uZmlnKCk7Y2FzZSAzOmlmKG49ZS5zZW50LGE9bi5iYXNlVXJsKXtlLm5leHQ9NzticmVha310aHJvdyBuZXcgSSgiSlMtQVVUSF9IRUxQRVJfUkVCTy1ORjAxIiwiQmFzZSBVUkwgbm90IGRlZmluZWQuIiwiQmFzZSBVUkwgaXMgbm90IGRlZmluZWQgaW4gQXV0aENsaWVudCBjb25maWcuIik7Y2FzZSA3OnJldHVybiBuLmVuZHBvaW50cyYmT2JqZWN0LmtleXMobi5lbmRwb2ludHMpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciByPWUucmVwbGFjZSgvW0EtWl0vZywoZnVuY3Rpb24oZSl7cmV0dXJuIl8iLmNvbmNhdChlLnRvTG93ZXJDYXNlKCkpfSkpO3Rbcl09KG51bGw9PW4/dm9pZCAwOm4uZW5kcG9pbnRzKT9uLmVuZHBvaW50c1tlXToiIn0pKSxpPXthdXRob3JpemF0aW9uX2VuZHBvaW50OiIiLmNvbmNhdChhKS5jb25jYXQoIi9vYXV0aDIvYXV0aG9yaXplIiksZW5kX3Nlc3Npb25fZW5kcG9pbnQ6IiIuY29uY2F0KGEpLmNvbmNhdCgiL29pZGMvbG9nb3V0IiksaXNzdWVyOiIiLmNvbmNhdChhKS5jb25jYXQoIi9vYXV0aDIvdG9rZW4iKSxqd2tzX3VyaToiIi5jb25jYXQoYSkuY29uY2F0KCIvb2F1dGgyL2p3a3MiKSxjaGVja19zZXNzaW9uX2lmcmFtZToiIi5jb25jYXQoYSkuY29uY2F0KCIvb2lkYy9jaGVja3Nlc3Npb24iKSxyZXZvY2F0aW9uX2VuZHBvaW50OiIiLmNvbmNhdChhKS5jb25jYXQoIi9vYXV0aDIvcmV2b2tlIiksdG9rZW5fZW5kcG9pbnQ6IiIuY29uY2F0KGEpLmNvbmNhdCgiL29hdXRoMi90b2tlbiIpLHVzZXJpbmZvX2VuZHBvaW50OiIiLmNvbmNhdChhKS5jb25jYXQoIi9vYXV0aDIvdXNlcmluZm8iKX0sZS5hYnJ1cHQoInJldHVybiIsT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkpLHQpKTtjYXNlIDEwOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9fSx7a2V5OiJ2YWxpZGF0ZUlkVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3ZhciBuLGEsaSxvLHMsdSxjO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQubmV4dD0yLHRoaXMuX2RhdGFMYXllci5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpO2Nhc2UgMjpyZXR1cm4gbj10LnNlbnQuandrc191cmksdC5uZXh0PTUsdGhpcy5fY29uZmlnKCk7Y2FzZSA1OmlmKGE9dC5zZW50LG4mJjAhPT1uLnRyaW0oKS5sZW5ndGgpe3QubmV4dD04O2JyZWFrfXRocm93IG5ldyBJKCJKU19BVVRIX0hFTFBFUi1WSVQtTkYwMSIsIkpXS1MgZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIEpXS1MgZW5kcG9pbnQgd2FzIGZvdW5kIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgSldLUyBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjYXNlIDg6cmV0dXJuIHQucHJldj04LHQubmV4dD0xMSxmZXRjaChuLHtjcmVkZW50aWFsczphLnNlbmRDb29raWVzSW5SZXF1ZXN0cz9SLkluY2x1ZGU6Ui5TYW1lT3JpZ2lufSk7Y2FzZSAxMTppPXQuc2VudCx0Lm5leHQ9MTc7YnJlYWs7Y2FzZSAxNDp0aHJvdyB0LnByZXY9MTQsdC50MD10LmNhdGNoKDgpLG5ldyBJKCJKUy1BVVRIX0hFTFBFUi1WSVQtTkUwMiIsIlJlcXVlc3QgdG8gandrcyBlbmRwb2ludCBmYWlsZWQuIixudWxsIT10LnQwP3QudDA6IlRoZSByZXF1ZXN0IHNlbnQgdG8gZ2V0IHRoZSBqd2tzIGZyb20gdGhlIHNlcnZlciBmYWlsZWQuIik7Y2FzZSAxNzppZigyMDA9PT1pLnN0YXR1cyYmaS5vayl7dC5uZXh0PTI0O2JyZWFrfXJldHVybiB0LnQxPUksdC50Mj0iSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIGp3a3MgcmVxdWVzdCAoIi5jb25jYXQoaS5zdGF0dXNUZXh0LCIpLiIpLHQubmV4dD0yMixpLmpzb24oKTtjYXNlIDIyOnRocm93IHQudDM9dC5zZW50LG5ldyB0LnQxKCJKUy1BVVRIX0hFTFBFUi1WSVQtSEUwMyIsdC50Mix0LnQzKTtjYXNlIDI0OnJldHVybiB0Lm5leHQ9MjYsdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKTtjYXNlIDI2OnJldHVybiBvPXQuc2VudC5pc3N1ZXIsdC5uZXh0PTI5LGkuanNvbigpO2Nhc2UgMjk6cmV0dXJuIHM9dC5zZW50LHU9cy5rZXlzLHQubmV4dD0zMyx0aGlzLl9jcnlwdG9IZWxwZXIuZ2V0SldLRm9yVGhlSWRUb2tlbihlLnNwbGl0KCIuIilbMF0sdSk7Y2FzZSAzMzpyZXR1cm4gYz10LnNlbnQsdC50ND10aGlzLl9jcnlwdG9IZWxwZXIsdC50NT1lLHQudDY9Yyx0Lm5leHQ9MzksdGhpcy5fY29uZmlnKCk7Y2FzZSAzOTpyZXR1cm4gdC50Nz10LnNlbnQuY2xpZW50SUQsdC50OD1udWxsIT1vP286IiIsdC50OT10aGlzLl9jcnlwdG9IZWxwZXIuZGVjb2RlSURUb2tlbihlKS5zdWIsdC5uZXh0PTQ0LHRoaXMuX2NvbmZpZygpO2Nhc2UgNDQ6cmV0dXJuIHQudDEwPXQuc2VudC5jbG9ja1RvbGVyYW5jZSx0LmFicnVwdCgicmV0dXJuIix0LnQ0LmlzVmFsaWRJZFRva2VuLmNhbGwodC50NCx0LnQ1LHQudDYsdC50Nyx0LnQ4LHQudDksdC50MTApKTtjYXNlIDQ2OmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzLFtbOCwxNF1dKX0pKSl9fSx7a2V5OiJnZXRBdXRoZW50aWNhdGVkVXNlckluZm8iLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LHIsbixhLGk9dGhpcy5fY3J5cHRvSGVscGVyLmRlY29kZUlEVG9rZW4oZSksbz1MLmdldFRlbmFudERvbWFpbkZyb21JZFRva2VuUGF5bG9hZChpKSxzPW51bGwhPT0odD1udWxsPT1pP3ZvaWQgMDppLnVzZXJuYW1lKSYmdm9pZCAwIT09dD90OiIiLHU9bnVsbCE9PShyPWkuZ2l2ZW5fbmFtZSkmJnZvaWQgMCE9PXI/cjoiIixjPW51bGwhPT0obj1pLmZhbWlseV9uYW1lKSYmdm9pZCAwIT09bj9uOiIiLGY9dSYmYz8iIi5jb25jYXQodSwiICIpLmNvbmNhdChjKTp1fHxjfHwiIixsPW51bGwhPT0oYT1pLnByZWZlcnJlZF91c2VybmFtZSkmJnZvaWQgMCE9PWE/YTpmO3JldHVybiBPYmplY3QuYXNzaWduKHtkaXNwbGF5TmFtZTpsLHRlbmFudERvbWFpbjpvLHVzZXJuYW1lOnN9LEwuZmlsdGVyQ2xhaW1zRnJvbUlEVG9rZW5QYXlsb2FkKGkpKX19LHtrZXk6InJlcGxhY2VDdXN0b21HcmFudFRlbXBsYXRlVGFncyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGEoKXt2YXIgaSxvLHM7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gaT0ib3BlbmlkIixyLm5leHQ9Myx0aGlzLl9jb25maWcoKTtjYXNlIDM6cmV0dXJuIG89ci5zZW50LHIubmV4dD02LHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSh0KTtjYXNlIDY6cmV0dXJuIHM9ci5zZW50LHIuYWJydXB0KCJyZXR1cm4iLChvLnNjb3BlJiZvLnNjb3BlLmxlbmd0aD4wJiYoby5zY29wZS5pbmNsdWRlcygib3BlbmlkIil8fG8uc2NvcGUucHVzaCgib3BlbmlkIiksaT1vLnNjb3BlLmpvaW4oIiAiKSksZS5yZXBsYWNlKCJ7e3Rva2VufX0iLHMuYWNjZXNzX3Rva2VuKS5yZXBsYWNlKCJ7e3VzZXJuYW1lfX0iLHRoaXMuZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKHMuaWRfdG9rZW4pLnVzZXJuYW1lKS5yZXBsYWNlKCJ7e3Njb3BlfX0iLGkpLnJlcGxhY2UoInt7Y2xpZW50SUR9fSIsby5jbGllbnRJRCkucmVwbGFjZSgie3tjbGllbnRTZWNyZXR9fSIsbnVsbCE9PShuPW8uY2xpZW50U2VjcmV0KSYmdm9pZCAwIT09bj9uOiIiKSkpO2Nhc2UgODpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGEsdGhpcyl9KSkpfX0se2tleToiY2xlYXJVc2VyU2Vzc2lvbkRhdGEiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQubmV4dD0yLHRoaXMuX2RhdGFMYXllci5yZW1vdmVUZW1wb3JhcnlEYXRhKGUpO2Nhc2UgMjpyZXR1cm4gdC5uZXh0PTQsdGhpcy5fZGF0YUxheWVyLnJlbW92ZVNlc3Npb25EYXRhKGUpO2Nhc2UgNDpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX0se2tleToiaGFuZGxlVG9rZW5SZXNwb25zZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG4oKXt2YXIgYSxpLG89dGhpcztyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKG4pe2Zvcig7Oylzd2l0Y2gobi5wcmV2PW4ubmV4dCl7Y2FzZSAwOmlmKDIwMD09PWUuc3RhdHVzJiZlLm9rKXtuLm5leHQ9NzticmVha31yZXR1cm4gbi50MD1JLG4udDE9IkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0b2tlbiByZXF1ZXN0ICgiLmNvbmNhdChlLnN0YXR1c1RleHQsIikuIiksbi5uZXh0PTUsZS5qc29uKCk7Y2FzZSA1OnRocm93IG4udDI9bi5zZW50LG5ldyBuLnQwKCJKUy1BVVRIX0hFTFBFUi1IVFItTkUwMSIsbi50MSxuLnQyKTtjYXNlIDc6cmV0dXJuIG4ubmV4dD05LGUuanNvbigpO2Nhc2UgOTpyZXR1cm4oYT1uLnNlbnQpLmNyZWF0ZWRfYXQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksbi5uZXh0PTEzLHRoaXMuX2NvbmZpZygpO2Nhc2UgMTM6aWYoIW4uc2VudC52YWxpZGF0ZUlEVG9rZW4pe24ubmV4dD0xNTticmVha31yZXR1cm4gbi5hYnJ1cHQoInJldHVybiIsdGhpcy52YWxpZGF0ZUlkVG9rZW4oYS5pZF90b2tlbikudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gRShvLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXt2YXIgbjtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGEoYSx0KTtjYXNlIDI6cmV0dXJuIG49e2FjY2Vzc1Rva2VuOmEuYWNjZXNzX3Rva2VuLGNyZWF0ZWRBdDphLmNyZWF0ZWRfYXQsZXhwaXJlc0luOmEuZXhwaXJlc19pbixpZFRva2VuOmEuaWRfdG9rZW4scmVmcmVzaFRva2VuOmEucmVmcmVzaF90b2tlbixzY29wZTphLnNjb3BlLHRva2VuVHlwZTphLnRva2VuX3R5cGV9LGUuYWJydXB0KCJyZXR1cm4iLFByb21pc2UucmVzb2x2ZShuKSk7Y2FzZSA0OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9KSkpO2Nhc2UgMTU6cmV0dXJuIGk9e2FjY2Vzc1Rva2VuOmEuYWNjZXNzX3Rva2VuLGNyZWF0ZWRBdDphLmNyZWF0ZWRfYXQsZXhwaXJlc0luOmEuZXhwaXJlc19pbixpZFRva2VuOmEuaWRfdG9rZW4scmVmcmVzaFRva2VuOmEucmVmcmVzaF90b2tlbixzY29wZTphLnNjb3BlLHRva2VuVHlwZTphLnRva2VuX3R5cGV9LG4ubmV4dD0xOCx0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGEoYSx0KTtjYXNlIDE4OnJldHVybiBuLmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlc29sdmUoaSkpO2Nhc2UgMTk6Y2FzZSJlbmQiOnJldHVybiBuLnN0b3AoKX19KSxuLHRoaXMpfSkpKX19LHtrZXk6ImdlbmVyYXRlUEtDRUtleSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBuKCl7dmFyIGEsaSxvO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIubmV4dD0yLHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhKGUpO2Nhc2UgMjpyZXR1cm4gYT1yLnNlbnQsaT1bXSxPYmplY3Qua2V5cyhhKS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLnN0YXJ0c1dpdGgoInBrY2VfY29kZV92ZXJpZmllciIpJiZpLnB1c2goZSl9KSksbz1pLnNvcnQoKS5wb3AoKSxyLmFicnVwdCgicmV0dXJuIiwicGtjZV9jb2RlX3ZlcmlmaWVyIyIuY29uY2F0KHBhcnNlSW50KG51bGwhPT0odD1udWxsPT1vP3ZvaWQgMDpvLnNwbGl0KCIjIilbMV0pJiZ2b2lkIDAhPT10P3Q6Ii0xIikrMSkpO2Nhc2UgNzpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX1dKSxlfSgpLGo9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe28odGhpcyxlKSx0aGlzLl9jcnlwdG9VdGlscz10fXJldHVybiB1KGUsW3trZXk6ImdldENvZGVWZXJpZmllciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3J5cHRvVXRpbHMuYmFzZTY0VVJMRW5jb2RlKHRoaXMuX2NyeXB0b1V0aWxzLmdlbmVyYXRlUmFuZG9tQnl0ZXMoMzIpKX19LHtrZXk6ImdldENvZGVDaGFsbGVuZ2UiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxFbmNvZGUodGhpcy5fY3J5cHRvVXRpbHMuaGFzaFNoYTI1NihlKSl9fSx7a2V5OiJnZXRKV0tGb3JUaGVJZFRva2VuIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciByLG49SlNPTi5wYXJzZSh0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxEZWNvZGUoZSkpLGE9Xyh0KTt0cnl7Zm9yKGEucygpOyEocj1hLm4oKSkuZG9uZTspe3ZhciBpPXIudmFsdWU7aWYobi5raWQ9PT1pLmtpZClyZXR1cm4gaX19Y2F0Y2goZSl7YS5lKGUpfWZpbmFsbHl7YS5mKCl9dGhyb3cgbmV3IEkoIkpTLUNSWVBUT19VVElMLUdKRlRJVC1JVjAxIiwia2lkIG5vdCBmb3VuZC4iLCJGYWlsZWQgdG8gZmluZCB0aGUgJ2tpZCcgc3BlY2lmaWVkIGluIHRoZSBpZF90b2tlbi4gJ2tpZCcgZm91bmQgaW4gdGhlIGhlYWRlciA6ICIrbi5raWQrIiwgRXhwZWN0ZWQgdmFsdWVzOiAiK3QubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5raWR9KSkuam9pbigiLCAiKSl9fSx7a2V5OiJpc1ZhbGlkSWRUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSx0LHIsbixhLGkpe3JldHVybiB0aGlzLl9jcnlwdG9VdGlscy52ZXJpZnlKd3QoZSx0LFAscixuLGEsaSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGU/UHJvbWlzZS5yZXNvbHZlKCEwKTpQcm9taXNlLnJlamVjdChuZXcgSSgiSlMtQ1JZUFRPX0hFTFBFUi1JVklULUlWMDEiLCJJbnZhbGlkIElEIHRva2VuLiIsIklEIHRva2VuIHZhbGlkYXRpb24gcmV0dXJuZWQgZmFsc2UiKSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybiJFUlJfSldUX0NMQUlNX1ZBTElEQVRJT05fRkFJTEVEIj09PShudWxsPT1lP3ZvaWQgMDplLmNvZGUpJiYibmJmIj09PShudWxsPT1lP3ZvaWQgMDplLmNsYWltKT9Qcm9taXNlLnJlamVjdChuZXcgSSgiSlMtQ1JZUFRPX1VUSUxTLUlWSVQtSVYwMiIsIkpXVCBOQkYgQ0xBSU0gVkFMSURBVElPTiBGQUlMRUQiLCJKV1QgTkJGIGNsYWltIHZhbGlkYXRpb24gaGFzIGJlZW4gZmFpbGVkIikpOlByb21pc2UucmVqZWN0KG5ldyBJKCJKUy1DUllQVE9fVVRJTFMtSVZJVC1JVjAzIiwiSldUIFZBTElEQVRJT04gRkFJTEVEIiwiSldUIHZhbGlkYXRpb24gaGFzIGJlZW4gZmFpbGVkIikpfSkpfX0se2tleToiZGVjb2RlSURUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7dHJ5e3ZhciB0PXRoaXMuX2NyeXB0b1V0aWxzLmJhc2U2NFVSTERlY29kZShlLnNwbGl0KCIuIilbMV0pO3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBJKCJKUy1DUllQVE9fVVRJTC1ESVQtSVYwMSIsIkRlY29kaW5nIElEIHRva2VuIGZhaWxlZC4iLGUpfX19XSksZX0oKSxOPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4pe3ZhciBhPXRoaXM7byh0aGlzLGUpLHRoaXMuX2NyeXB0b1V0aWxzPW4sdGhpcy5fY3J5cHRvSGVscGVyPW5ldyBqKG4pLHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyPW5ldyBNKHQsdGhpcy5fY3J5cHRvSGVscGVyKSx0aGlzLl9kYXRhTGF5ZXI9dCx0aGlzLl9jb25maWc9ZnVuY3Rpb24oKXtyZXR1cm4gRShhLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpO2Nhc2UgMjpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsZS5zZW50KTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX0sdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gRShhLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKTtjYXNlIDI6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGUuc2VudCk7Y2FzZSAzOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9fXJldHVybiB1KGUsW3trZXk6ImdldEF1dGhvcml6YXRpb25VUkwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG4sYSxpO3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbygpe3ZhciBzLHUsYyxmLGwsaCxwLGQsdixnLHksbSxiLGsseCxTLEUsVCxBLFI7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKCJhdXRob3JpemF0aW9uX2VuZHBvaW50Iik7Y2FzZSAyOnJldHVybiBzPXIuc2VudCxyLm5leHQ9NSx0aGlzLl9jb25maWcoKTtjYXNlIDU6aWYodT1yLnNlbnQscyYmMCE9PXMudHJpbSgpLmxlbmd0aCl7ci5uZXh0PTg7YnJlYWt9dGhyb3cgbmV3IEkoIkpTLUFVVEhfQ09SRS1HQVUtTkYwMSIsIk5vIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgZm91bmQuIiwiTm8gYXV0aG9yaXphdGlvbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIGZyb20gdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y2FzZSA4OnJldHVybiBjPW5ldyBVUkwocyksKGY9bmV3IE1hcCkuc2V0KCJyZXNwb25zZV90eXBlIiwiY29kZSIpLGYuc2V0KCJjbGllbnRfaWQiLHUuY2xpZW50SUQpLGw9Im9wZW5pZCIsdS5zY29wZSYmdS5zY29wZS5sZW5ndGg+MCYmKHUuc2NvcGUuaW5jbHVkZXMoIm9wZW5pZCIpfHx1LnNjb3BlLnB1c2goIm9wZW5pZCIpLGw9dS5zY29wZS5qb2luKCIgIikpLGYuc2V0KCJzY29wZSIsbCksZi5zZXQoInJlZGlyZWN0X3VyaSIsdS5zaWduSW5SZWRpcmVjdFVSTCksdS5yZXNwb25zZU1vZGUmJmYuc2V0KCJyZXNwb25zZV9tb2RlIix1LnJlc3BvbnNlTW9kZSksci5uZXh0PTE0LHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmdlbmVyYXRlUEtDRUtleSh0KTtjYXNlIDE0OmlmKGg9ci5zZW50LCF1LmVuYWJsZVBLQ0Upe3IubmV4dD0yMTticmVha31yZXR1cm4gcD1udWxsPT09KG49dGhpcy5fY3J5cHRvSGVscGVyKXx8dm9pZCAwPT09bj92b2lkIDA6bi5nZXRDb2RlVmVyaWZpZXIoKSxkPW51bGw9PT0oYT10aGlzLl9jcnlwdG9IZWxwZXIpfHx2b2lkIDA9PT1hP3ZvaWQgMDphLmdldENvZGVDaGFsbGVuZ2UocCksci5uZXh0PTE5LHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGgscCx0KTtjYXNlIDE5OmYuc2V0KCJjb2RlX2NoYWxsZW5nZV9tZXRob2QiLCJTMjU2IiksZi5zZXQoImNvZGVfY2hhbGxlbmdlIixkKTtjYXNlIDIxOmlmKHUucHJvbXB0JiZmLnNldCgicHJvbXB0Iix1LnByb21wdCksdj1lKWZvcihnPTAseT1PYmplY3QuZW50cmllcyh2KTtnPHkubGVuZ3RoO2crKyltPXcoeVtnXSwyKSxiPW1bMF0saz1tWzFdLCIiIT1iJiYiIiE9ayYmInN0YXRlIiE9PWImJih4PWIucmVwbGFjZSgvW0EtWl0vZywoZnVuY3Rpb24oZSl7cmV0dXJuIl8iLmNvbmNhdChlLnRvTG93ZXJDYXNlKCkpfSkpLGYuc2V0KHgsay50b1N0cmluZygpKSk7Zi5zZXQoInN0YXRlIixMLmdlbmVyYXRlU3RhdGVQYXJhbUZvclJlcXVlc3RDb3JyZWxhdGlvbihoLHY/bnVsbD09PShpPXYuc3RhdGUpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLnRvU3RyaW5nKCk6IiIpKSxTPV8oZi5lbnRyaWVzKCkpO3RyeXtmb3IoUy5zKCk7IShFPVMubigpKS5kb25lOylUPXcoRS52YWx1ZSwyKSxBPVRbMF0sUj1UWzFdLGMuc2VhcmNoUGFyYW1zLmFwcGVuZChBLFIpfWNhdGNoKGUpe1MuZShlKX1maW5hbGx5e1MuZigpfXJldHVybiByLmFicnVwdCgicmV0dXJuIixjLnRvU3RyaW5nKCkpO2Nhc2UgMjg6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxvLHRoaXMpfSkpKX19LHtrZXk6InJlcXVlc3RBY2Nlc3NUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4sYSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBpKCl7dmFyIG8scyx1LGMsZjtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLm5leHQ9Mix0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpO2Nhc2UgMjpyZXR1cm4gbz1yLnNlbnQudG9rZW5fZW5kcG9pbnQsci5uZXh0PTUsdGhpcy5fY29uZmlnKCk7Y2FzZSA1OmlmKHM9ci5zZW50LG8mJjAhPT1vLnRyaW0oKS5sZW5ndGgpe3IubmV4dD04O2JyZWFrfXRocm93IG5ldyBJKCJKUy1BVVRIX0NPUkUtUkFUMS1ORjAxIiwiVG9rZW4gZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIHRva2VuIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2Nhc2UgODppZihyLnQwPXQsIXIudDApe3IubmV4dD0xMjticmVha31yZXR1cm4gci5uZXh0PTEyLHRoaXMuX2RhdGFMYXllci5zZXRTZXNzaW9uRGF0YVBhcmFtZXRlcigic2Vzc2lvbl9zdGF0ZSIsdCxhKTtjYXNlIDEyOmlmKCh1PVtdKS5wdXNoKCJjbGllbnRfaWQ9Ii5jb25jYXQocy5jbGllbnRJRCkpLHMuY2xpZW50U2VjcmV0JiZzLmNsaWVudFNlY3JldC50cmltKCkubGVuZ3RoPjAmJnUucHVzaCgiY2xpZW50X3NlY3JldD0iLmNvbmNhdChzLmNsaWVudFNlY3JldCkpLGM9ZSx1LnB1c2goImNvZGU9Ii5jb25jYXQoYykpLHUucHVzaCgiZ3JhbnRfdHlwZT1hdXRob3JpemF0aW9uX2NvZGUiKSx1LnB1c2goInJlZGlyZWN0X3VyaT0iLmNvbmNhdChzLnNpZ25JblJlZGlyZWN0VVJMKSksci50MT1zLmVuYWJsZVBLQ0UsIXIudDEpe3IubmV4dD0yOTticmVha31yZXR1cm4gci50Mj11LHIudDM9ImNvZGVfdmVyaWZpZXI9IixyLm5leHQ9MjQsdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoTC5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKG4pLGEpO2Nhc2UgMjQ6cmV0dXJuIHIudDQ9ci5zZW50LHIudDU9ci50My5jb25jYXQuY2FsbChyLnQzLHIudDQpLHIudDIucHVzaC5jYWxsKHIudDIsci50NSksci5uZXh0PTI5LHRoaXMuX2RhdGFMYXllci5yZW1vdmVUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKEwuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShuKSxhKTtjYXNlIDI5OnJldHVybiByLnByZXY9Mjksci5uZXh0PTMyLGZldGNoKG8se2JvZHk6dS5qb2luKCImIiksY3JlZGVudGlhbHM6cy5zZW5kQ29va2llc0luUmVxdWVzdHM/Ui5JbmNsdWRlOlIuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKEwuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QifSk7Y2FzZSAzMjpmPXIuc2VudCxyLm5leHQ9Mzg7YnJlYWs7Y2FzZSAzNTp0aHJvdyByLnByZXY9MzUsci50Nj1yLmNhdGNoKDI5KSxuZXcgSSgiSlMtQVVUSF9DT1JFLVJBVDEtTkUwMiIsIlJlcXVlc3RpbmcgYWNjZXNzIHRva2VuIGZhaWxlZCIsbnVsbCE9ci50Nj9yLnQ2OiJUaGUgcmVxdWVzdCB0byBnZXQgdGhlIGFjY2VzcyB0b2tlbiBmcm9tIHRoZSBzZXJ2ZXIgZmFpbGVkLiIpO2Nhc2UgMzg6aWYoZi5vayl7ci5uZXh0PTQ1O2JyZWFrfXJldHVybiByLnQ3PUksci50OD0iUmVxdWVzdGluZyBhY2Nlc3MgdG9rZW4gZmFpbGVkIHdpdGggIi5jb25jYXQoZi5zdGF0dXNUZXh0KSxyLm5leHQ9NDMsZi5qc29uKCk7Y2FzZSA0Mzp0aHJvdyByLnQ5PXIuc2VudCxuZXcgci50NygiSlMtQVVUSF9DT1JFLVJBVDEtSEUwMyIsci50OCxyLnQ5KTtjYXNlIDQ1OnJldHVybiByLm5leHQ9NDcsdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShmLGEpO2Nhc2UgNDc6cmV0dXJuIHIuYWJydXB0KCJyZXR1cm4iLHIuc2VudCk7Y2FzZSA0ODpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGksdGhpcyxbWzI5LDM1XV0pfSkpKX19LHtrZXk6InJlZnJlc2hBY2Nlc3NUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIG4sYSxpLG8scztyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpO2Nhc2UgMjpyZXR1cm4gbj10LnNlbnQudG9rZW5fZW5kcG9pbnQsdC5uZXh0PTUsdGhpcy5fY29uZmlnKCk7Y2FzZSA1OnJldHVybiBhPXQuc2VudCx0Lm5leHQ9OCx0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSk7Y2FzZSA4OmlmKChpPXQuc2VudCkucmVmcmVzaF90b2tlbil7dC5uZXh0PTExO2JyZWFrfXRocm93IG5ldyBJKCJKUy1BVVRIX0NPUkUtUkFUMi1ORjAxIiwiTm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4iLCJUaGVyZSB3YXMgbm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4gQXNnYXJkZW8gZG9lc24ndCByZXR1cm4gYSByZWZyZXNoIHRva2VuIGlmIHRoZSByZWZyZXNoIHRva2VuIGdyYW50IGlzIG5vdCBlbmFibGVkLiIpO2Nhc2UgMTE6aWYobiYmMCE9PW4udHJpbSgpLmxlbmd0aCl7dC5uZXh0PTEzO2JyZWFrfXRocm93IG5ldyBJKCJKUy1BVVRIX0NPUkUtUkFUMi1ORjAyIiwiTm8gcmVmcmVzaCB0b2tlbiBlbmRwb2ludCBmb3VuZC4iLCJObyByZWZyZXNoIHRva2VuIGVuZHBvaW50IHdhcyBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y2FzZSAxMzpyZXR1cm4obz1bXSkucHVzaCgiY2xpZW50X2lkPSIuY29uY2F0KGEuY2xpZW50SUQpKSxvLnB1c2goInJlZnJlc2hfdG9rZW49Ii5jb25jYXQoaS5yZWZyZXNoX3Rva2VuKSksby5wdXNoKCJncmFudF90eXBlPXJlZnJlc2hfdG9rZW4iKSxhLmNsaWVudFNlY3JldCYmYS5jbGllbnRTZWNyZXQudHJpbSgpLmxlbmd0aD4wJiZvLnB1c2goImNsaWVudF9zZWNyZXQ9Ii5jb25jYXQoYS5jbGllbnRTZWNyZXQpKSx0LnByZXY9MTUsdC5uZXh0PTE4LGZldGNoKG4se2JvZHk6by5qb2luKCImIiksY3JlZGVudGlhbHM6YS5zZW5kQ29va2llc0luUmVxdWVzdHM/Ui5JbmNsdWRlOlIuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKEwuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QifSk7Y2FzZSAxODpzPXQuc2VudCx0Lm5leHQ9MjQ7YnJlYWs7Y2FzZSAyMTp0aHJvdyB0LnByZXY9MjEsdC50MD10LmNhdGNoKDE1KSxuZXcgSSgiSlMtQVVUSF9DT1JFLVJBVDItTlIwMyIsIlJlZnJlc2ggYWNjZXNzIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9dC50MD90LnQwOiJUaGUgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIpO2Nhc2UgMjQ6aWYocy5vayl7dC5uZXh0PTMxO2JyZWFrfXJldHVybiB0LnQxPUksdC50Mj0iUmVmcmVzaGluZyBhY2Nlc3MgdG9rZW4gZmFpbGVkIHdpdGggIi5jb25jYXQocy5zdGF0dXNUZXh0KSx0Lm5leHQ9Mjkscy5qc29uKCk7Y2FzZSAyOTp0aHJvdyB0LnQzPXQuc2VudCxuZXcgdC50MSgiSlMtQVVUSF9DT1JFLVJBVDItSEUwNCIsdC50Mix0LnQzKTtjYXNlIDMxOnJldHVybiB0LmFicnVwdCgicmV0dXJuIix0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5oYW5kbGVUb2tlblJlc3BvbnNlKHMsZSkpO2Nhc2UgMzI6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMsW1sxNSwyMV1dKX0pKSl9fSx7a2V5OiJyZXZva2VBY2Nlc3NUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIG4sYSxpLG87cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKTtjYXNlIDI6cmV0dXJuIG49dC5zZW50LnJldm9jYXRpb25fZW5kcG9pbnQsdC5uZXh0PTUsdGhpcy5fY29uZmlnKCk7Y2FzZSA1OmlmKGE9dC5zZW50LG4mJjAhPT1uLnRyaW0oKS5sZW5ndGgpe3QubmV4dD04O2JyZWFrfXRocm93IG5ldyBJKCJKUy1BVVRIX0NPUkUtUkFUMy1ORjAxIiwiTm8gcmV2b2tlIGFjY2VzcyB0b2tlbiBlbmRwb2ludCBmb3VuZC4iLCJObyByZXZva2UgYWNjZXNzIHRva2VuIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHJldm9rZSBhY2Nlc3MgdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y2FzZSA4OnJldHVybihpPVtdKS5wdXNoKCJjbGllbnRfaWQ9Ii5jb25jYXQoYS5jbGllbnRJRCkpLHQudDA9aSx0LnQxPSJ0b2tlbj0iLHQubmV4dD0xNCx0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSk7Y2FzZSAxNDpyZXR1cm4gdC50Mj10LnNlbnQuYWNjZXNzX3Rva2VuLHQudDM9dC50MS5jb25jYXQuY2FsbCh0LnQxLHQudDIpLHQudDAucHVzaC5jYWxsKHQudDAsdC50MyksaS5wdXNoKCJ0b2tlbl90eXBlX2hpbnQ9YWNjZXNzX3Rva2VuIiksdC5wcmV2PTE4LHQubmV4dD0yMSxmZXRjaChuLHtib2R5Omkuam9pbigiJiIpLGNyZWRlbnRpYWxzOmEuc2VuZENvb2tpZXNJblJlcXVlc3RzP1IuSW5jbHVkZTpSLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyhMLmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSksbWV0aG9kOiJQT1NUIn0pO2Nhc2UgMjE6bz10LnNlbnQsdC5uZXh0PTI3O2JyZWFrO2Nhc2UgMjQ6dGhyb3cgdC5wcmV2PTI0LHQudDQ9dC5jYXRjaCgxOCksbmV3IEkoIkpTLUFVVEhfQ09SRS1SQVQzLU5FMDIiLCJUaGUgcmVxdWVzdCB0byByZXZva2UgYWNjZXNzIHRva2VuIGZhaWxlZC4iLG51bGwhPXQudDQ/dC50NDoiVGhlIHJlcXVlc3Qgc2VudCB0byByZXZva2UgdGhlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIik7Y2FzZSAyNzppZigyMDA9PT1vLnN0YXR1cyYmby5vayl7dC5uZXh0PTM0O2JyZWFrfXJldHVybiB0LnQ1PUksdC50Nj0iSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHJldm9rZSBhY2Nlc3MgdG9rZW4gcmVxdWVzdCAoIi5jb25jYXQoby5zdGF0dXNUZXh0LCIpLiIpLHQubmV4dD0zMixvLmpzb24oKTtjYXNlIDMyOnRocm93IHQudDc9dC5zZW50LG5ldyB0LnQ1KCJKUy1BVVRIX0NPUkUtUkFUMy1IRTAzIix0LnQ2LHQudDcpO2Nhc2UgMzQ6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLCh0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5jbGVhclVzZXJTZXNzaW9uRGF0YShlKSxQcm9taXNlLnJlc29sdmUobykpKTtjYXNlIDM1OmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzLFtbMTgsMjRdXSl9KSkpfX0se2tleToicmVxdWVzdEN1c3RvbUdyYW50Iix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbigpe3ZhciBhLGksbyxzLHUsYyxmLGw9dGhpcztyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKG4pe2Zvcig7Oylzd2l0Y2gobi5wcmV2PW4ubmV4dCl7Y2FzZSAwOnJldHVybiBuLm5leHQ9Mix0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpO2Nhc2UgMjpyZXR1cm4gYT1uLnNlbnQsbi5uZXh0PTUsdGhpcy5fY29uZmlnKCk7Y2FzZSA1OmlmKGk9bi5zZW50LChvPWUudG9rZW5FbmRwb2ludCYmMCE9PWUudG9rZW5FbmRwb2ludC50cmltKCkubGVuZ3RoP2UudG9rZW5FbmRwb2ludDphLnRva2VuX2VuZHBvaW50KSYmMCE9PW8udHJpbSgpLmxlbmd0aCl7bi5uZXh0PTg7YnJlYWt9dGhyb3cgbmV3IEkoIkpTLUFVVEhfQ09SRS1SQ0ctTkYwMSIsIlRva2VuIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjYXNlIDg6cmV0dXJuIG4ubmV4dD0xMCxQcm9taXNlLmFsbChPYmplY3QuZW50cmllcyhlLmRhdGEpLm1hcCgoZnVuY3Rpb24oZSl7dmFyIG49dyhlLDIpLGE9blswXSxpPW5bMV07cmV0dXJuIEUobCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7dmFyIG47cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5uZXh0PTIsdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVwbGFjZUN1c3RvbUdyYW50VGVtcGxhdGVUYWdzKGksdCk7Y2FzZSAyOnJldHVybiBuPWUuc2VudCxlLmFicnVwdCgicmV0dXJuIiwiIi5jb25jYXQoYSwiPSIpLmNvbmNhdChuKSk7Y2FzZSA0OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9KSkpO2Nhc2UgMTA6aWYocz1uLnNlbnQsdT1PYmplY3QuYXNzaWduKHt9LEwuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxuLnQwPWUuYXR0YWNoVG9rZW4sIW4udDApe24ubmV4dD0yMzticmVha31yZXR1cm4gbi50MT1PYmplY3Qsbi50Mj1PYmplY3QuYXNzaWduKHt9LHUpLG4udDM9IkJlYXJlciAiLG4ubmV4dD0xOSx0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEodCk7Y2FzZSAxOTpuLnQ0PW4uc2VudC5hY2Nlc3NfdG9rZW4sbi50NT1uLnQzLmNvbmNhdC5jYWxsKG4udDMsbi50NCksbi50Nj17QXV0aG9yaXphdGlvbjpuLnQ1fSx1PW4udDEuYXNzaWduLmNhbGwobi50MSxuLnQyLG4udDYpO2Nhc2UgMjM6cmV0dXJuIGM9e2JvZHk6cy5qb2luKCImIiksY3JlZGVudGlhbHM6aS5zZW5kQ29va2llc0luUmVxdWVzdHM/Ui5JbmNsdWRlOlIuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKHUpLG1ldGhvZDoiUE9TVCJ9LG4ucHJldj0yNCxuLm5leHQ9MjcsZmV0Y2gobyxjKTtjYXNlIDI3OmY9bi5zZW50LG4ubmV4dD0zMzticmVhaztjYXNlIDMwOnRocm93IG4ucHJldj0zMCxuLnQ3PW4uY2F0Y2goMjQpLG5ldyBJKCJKUy1BVVRIX0NPUkUtUkNHLU5FMDIiLCJUaGUgY3VzdG9tIGdyYW50IHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9bi50Nz9uLnQ3OiJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgY3VzdG9tIGdyYW50IGZhaWxlZC4iKTtjYXNlIDMzOmlmKDIwMD09PWYuc3RhdHVzJiZmLm9rKXtuLm5leHQ9NDA7YnJlYWt9cmV0dXJuIG4udDg9SSxuLnQ5PSJJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgdGhlIGN1c3RvbSBncmFudCByZXF1ZXN0LiAoIi5jb25jYXQoZi5zdGF0dXNUZXh0LCIpIiksbi5uZXh0PTM4LGYuanNvbigpO2Nhc2UgMzg6dGhyb3cgbi50MTA9bi5zZW50LG5ldyBuLnQ4KCJKUy1BVVRIX0NPUkUtUkNHLUhFMDMiLG4udDksbi50MTApO2Nhc2UgNDA6aWYoIWUucmV0dXJuc1Nlc3Npb24pe24ubmV4dD00NDticmVha31uLnQxMT10aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5oYW5kbGVUb2tlblJlc3BvbnNlKGYsdCksbi5uZXh0PTQ5O2JyZWFrO2Nhc2UgNDQ6cmV0dXJuIG4udDEyPVByb21pc2Usbi5uZXh0PTQ3LGYuanNvbigpO2Nhc2UgNDc6bi50MTM9bi5zZW50LG4udDExPW4udDEyLnJlc29sdmUuY2FsbChuLnQxMixuLnQxMyk7Y2FzZSA0OTpyZXR1cm4gbi5hYnJ1cHQoInJldHVybiIsbi50MTEpO2Nhc2UgNTA6Y2FzZSJlbmQiOnJldHVybiBuLnN0b3AoKX19KSxuLHRoaXMsW1syNCwzMF1dKX0pKSl9fSx7a2V5OiJnZXRCYXNpY1VzZXJJbmZvIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXt2YXIgbixhLGk7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpO2Nhc2UgMjpyZXR1cm4gbj10LnNlbnQsYT10aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5nZXRBdXRoZW50aWNhdGVkVXNlckluZm8obnVsbD09bj92b2lkIDA6bi5pZF90b2tlbiksaT17YWxsb3dlZFNjb3BlczpuLnNjb3BlLHNlc3Npb25TdGF0ZTpuLnNlc3Npb25fc3RhdGV9LHQuYWJydXB0KCJyZXR1cm4iLChPYmplY3Qua2V5cyhhKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2b2lkIDAhPT1hW2VdJiYiIiE9PWFbZV0mJm51bGwhPT1hW2VdfHxkZWxldGUgYVtlXX0pKSxpPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSxhKSkpO2Nhc2UgNjpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX0se2tleToiZ2V0RGVjb2RlZElEVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3ZhciBuO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQubmV4dD0yLHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKTtjYXNlIDI6cmV0dXJuIG49dC5zZW50LmlkX3Rva2VuLHQuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2NyeXB0b0hlbHBlci5kZWNvZGVJRFRva2VuKG4pKTtjYXNlIDQ6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImdldENyeXB0b0hlbHBlciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLmFicnVwdCgicmV0dXJuIix0aGlzLl9jcnlwdG9IZWxwZXIpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsdGhpcyl9KSkpfX0se2tleToiZ2V0SURUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpO2Nhc2UgMjpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsdC5zZW50LmlkX3Rva2VuKTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImdldE9JRENQcm92aWRlck1ldGFEYXRhIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXt2YXIgbixhLGk7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsdGhpcy5fY29uZmlnKCk7Y2FzZSAyOmlmKG49dC5zZW50LHQudDA9IWUsIXQudDApe3QubmV4dD04O2JyZWFrfXJldHVybiB0Lm5leHQ9Nyx0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpO2Nhc2UgNzp0LnQwPXQuc2VudDtjYXNlIDg6aWYoIXQudDApe3QubmV4dD0xMDticmVha31yZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZXNvbHZlKCkpO2Nhc2UgMTA6aWYoIShhPW4ud2VsbEtub3duRW5kcG9pbnQpKXt0Lm5leHQ9MzY7YnJlYWt9cmV0dXJuIHQucHJldj0xMix0Lm5leHQ9MTUsZmV0Y2goYSk7Y2FzZSAxNTppZigyMDA9PT0oaT10LnNlbnQpLnN0YXR1cyYmaS5vayl7dC5uZXh0PTE4O2JyZWFrfXRocm93IG5ldyBFcnJvcjtjYXNlIDE4OnQubmV4dD0yMzticmVhaztjYXNlIDIwOnRocm93IHQucHJldj0yMCx0LnQxPXQuY2F0Y2goMTIpLG5ldyBJKCJKUy1BVVRIX0NPUkUtR09QTUQtSEUwMSIsIkludmFsaWQgd2VsbC1rbm93biByZXNwb25zZSIsIlRoZSB3ZWxsIGtub3duIGVuZHBvaW50IHJlc3BvbnNlIGhhcyBiZWVuIGZhaWxlZCB3aXRoIGFuIGVycm9yLiIpO2Nhc2UgMjM6cmV0dXJuIHQudDI9dGhpcy5fZGF0YUxheWVyLHQudDM9dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIsdC5uZXh0PTI3LGkuanNvbigpO2Nhc2UgMjc6cmV0dXJuIHQudDQ9dC5zZW50LHQubmV4dD0zMCx0LnQzLnJlc29sdmVFbmRwb2ludHMuY2FsbCh0LnQzLHQudDQpO2Nhc2UgMzA6cmV0dXJuIHQudDU9dC5zZW50LHQubmV4dD0zMyx0LnQyLnNldE9JRENQcm92aWRlck1ldGFEYXRhLmNhbGwodC50Mix0LnQ1KTtjYXNlIDMzOnJldHVybiB0Lm5leHQ9MzUsdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiLCEwKTtjYXNlIDM1OnJldHVybiB0LmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlc29sdmUoKSk7Y2FzZSAzNjppZighbi5iYXNlVXJsKXt0Lm5leHQ9NTI7YnJlYWt9cmV0dXJuIHQucHJldj0zNyx0LnQ2PXRoaXMuX2RhdGFMYXllcix0Lm5leHQ9NDEsdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZUVuZHBvaW50c0J5QmFzZVVSTCgpO2Nhc2UgNDE6cmV0dXJuIHQudDc9dC5zZW50LHQubmV4dD00NCx0LnQ2LnNldE9JRENQcm92aWRlck1ldGFEYXRhLmNhbGwodC50Nix0LnQ3KTtjYXNlIDQ0OnQubmV4dD00OTticmVhaztjYXNlIDQ2OnRocm93IHQucHJldj00Nix0LnQ4PXQuY2F0Y2goMzcpLG5ldyBJKCJKUy1BVVRIX0NPUkUtR09QTUQtSVYwMiIsIlJlc29sdmluZyBlbmRwb2ludHMgZmFpbGVkLiIsbnVsbCE9dC50OD90LnQ4OiJSZXNvbHZpbmcgZW5kcG9pbnRzIGJ5IGJhc2UgdXJsIGZhaWxlZC4iKTtjYXNlIDQ5OnJldHVybiB0Lm5leHQ9NTEsdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiLCEwKTtjYXNlIDUxOnJldHVybiB0LmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlc29sdmUoKSk7Y2FzZSA1MjpyZXR1cm4gdC5wcmV2PTUyLHQudDk9dGhpcy5fZGF0YUxheWVyLHQubmV4dD01Nix0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzRXhwbGljaXRseSgpO2Nhc2UgNTY6cmV0dXJuIHQudDEwPXQuc2VudCx0Lm5leHQ9NTksdC50OS5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YS5jYWxsKHQudDksdC50MTApO2Nhc2UgNTk6dC5uZXh0PTY0O2JyZWFrO2Nhc2UgNjE6dGhyb3cgdC5wcmV2PTYxLHQudDExPXQuY2F0Y2goNTIpLG5ldyBJKCJKUy1BVVRIX0NPUkUtR09QTUQtSVYwMyIsIlJlc29sdmluZyBlbmRwb2ludHMgZmFpbGVkLiIsbnVsbCE9dC50MTE/dC50MTE6IlJlc29sdmluZyBlbmRwb2ludHMgYnkgZXhwbGljaXRseSBmYWlsZWQuIik7Y2FzZSA2NDpyZXR1cm4gdC5uZXh0PTY2LHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIiwhMCk7Y2FzZSA2NjpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZXNvbHZlKCkpO2Nhc2UgNjc6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMsW1sxMiwyMF0sWzM3LDQ2XSxbNTIsNjFdXSl9KSkpfX0se2tleToiZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdCxuLGEsaSxvLHMsdSxjLGY7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBsKCl7dmFyIGg7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKTtjYXNlIDI6cmV0dXJuIGg9ci5zZW50LHIuYWJydXB0KCJyZXR1cm4iLHthdXRob3JpemF0aW9uRW5kcG9pbnQ6bnVsbCE9PShlPWguYXV0aG9yaXphdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWU/ZToiIixjaGVja1Nlc3Npb25JZnJhbWU6bnVsbCE9PSh0PWguY2hlY2tfc2Vzc2lvbl9pZnJhbWUpJiZ2b2lkIDAhPT10P3Q6IiIsZW5kU2Vzc2lvbkVuZHBvaW50Om51bGwhPT0obj1oLmVuZF9zZXNzaW9uX2VuZHBvaW50KSYmdm9pZCAwIT09bj9uOiIiLGludHJvc3BlY3Rpb25FbmRwb2ludDpudWxsIT09KGE9aC5pbnRyb3NwZWN0aW9uX2VuZHBvaW50KSYmdm9pZCAwIT09YT9hOiIiLGlzc3VlcjpudWxsIT09KGk9aC5pc3N1ZXIpJiZ2b2lkIDAhPT1pP2k6IiIsandrc1VyaTpudWxsIT09KG89aC5qd2tzX3VyaSkmJnZvaWQgMCE9PW8/bzoiIixyZWdpc3RyYXRpb25FbmRwb2ludDpudWxsIT09KHM9aC5yZWdpc3RyYXRpb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1zP3M6IiIscmV2b2NhdGlvbkVuZHBvaW50Om51bGwhPT0odT1oLnJldm9jYXRpb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT11P3U6IiIsdG9rZW5FbmRwb2ludDpudWxsIT09KGM9aC50b2tlbl9lbmRwb2ludCkmJnZvaWQgMCE9PWM/YzoiIix1c2VyaW5mb0VuZHBvaW50Om51bGwhPT0oZj1oLnVzZXJpbmZvX2VuZHBvaW50KSYmdm9pZCAwIT09Zj9mOiIifSk7Y2FzZSA0OmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksbCx0aGlzKX0pKSl9fSx7a2V5OiJnZXRTaWduT3V0VVJMIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdCxuLGE7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBpKCl7dmFyIG8scyx1LGM7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKTtjYXNlIDI6aWYoci50MT10PXIuc2VudCxyLnQwPW51bGw9PT1yLnQxLHIudDApe3IubmV4dD02O2JyZWFrfXIudDA9dm9pZCAwPT09dDtjYXNlIDY6aWYoIXIudDApe3IubmV4dD0xMDticmVha31yLnQyPXZvaWQgMCxyLm5leHQ9MTE7YnJlYWs7Y2FzZSAxMDpyLnQyPXQuZW5kX3Nlc3Npb25fZW5kcG9pbnQ7Y2FzZSAxMTpyZXR1cm4gbz1yLnQyLHIubmV4dD0xNCx0aGlzLl9jb25maWcoKTtjYXNlIDE0OmlmKHM9ci5zZW50LG8mJjAhPT1vLnRyaW0oKS5sZW5ndGgpe3IubmV4dD0xNzticmVha310aHJvdyBuZXcgSSgiSlMtQVVUSF9DT1JFLUdTT1UtTkYwMSIsIlNpZ24tb3V0IGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBzaWduLW91dCBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSBzaWduLW91dCBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjYXNlIDE3OnJldHVybiByLm5leHQ9MTksdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpO2Nhc2UgMTk6aWYoci50ND1uPXIuc2VudCxyLnQzPW51bGw9PT1yLnQ0LHIudDMpe3IubmV4dD0yMzticmVha31yLnQzPXZvaWQgMD09PW47Y2FzZSAyMzppZighci50Myl7ci5uZXh0PTI3O2JyZWFrfXIudDU9dm9pZCAwLHIubmV4dD0yODticmVhaztjYXNlIDI3OnIudDU9bi5pZF90b2tlbjtjYXNlIDI4OmlmKCh1PXIudDUpJiYwIT09dS50cmltKCkubGVuZ3RoKXtyLm5leHQ9MzE7YnJlYWt9dGhyb3cgbmV3IEkoIkpTLUFVVEhfQ09SRS1HU09VLU5GMDIiLCJJRCB0b2tlbiBub3QgZm91bmQuIiwiTm8gSUQgdG9rZW4gY291bGQgYmUgZm91bmQuIEVpdGhlciB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpcyBsb3N0IG9yIHlvdSBoYXZlIG5vdCBzaWduZWQgaW4uIik7Y2FzZSAzMTppZigoYz1udWxsIT09KGE9bnVsbD09cz92b2lkIDA6cy5zaWduT3V0UmVkaXJlY3RVUkwpJiZ2b2lkIDAhPT1hP2E6bnVsbD09cz92b2lkIDA6cy5zaWduSW5SZWRpcmVjdFVSTCkmJjAhPT1jLnRyaW0oKS5sZW5ndGgpe3IubmV4dD0zNDticmVha310aHJvdyBuZXcgSSgiSlMtQVVUSF9DT1JFLUdTT1UtTkYwMyIsIk5vIHNpZ24tb3V0IHJlZGlyZWN0IFVSTCBmb3VuZC4iLCJUaGUgc2lnbi1vdXQgcmVkaXJlY3QgVVJMIGNhbm5vdCBiZSBmb3VuZCBvciB0aGUgVVJMIHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiBObyBzaWduLWluIHJlZGlyZWN0IFVSTCBoYXMgYmVlbiBmb3VuZCBlaXRoZXIuICIpO2Nhc2UgMzQ6cmV0dXJuIHIuYWJydXB0KCJyZXR1cm4iLCIiLmNvbmNhdChvLCI/aWRfdG9rZW5faGludD0iKS5jb25jYXQodSwiJnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaT0iKS5jb25jYXQoYywiJnN0YXRlPXNpZ25fb3V0X3N1Y2Nlc3MiKSk7Y2FzZSAzNTpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGksdGhpcyl9KSkpfX0se2tleToic2lnbk91dCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsdGhpcy5nZXRTaWduT3V0VVJMKGUpO2Nhc2UgMjpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsdC5zZW50KTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImNsZWFyVXNlclNlc3Npb25EYXRhIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5jbGVhclVzZXJTZXNzaW9uRGF0YShlKTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImdldEFjY2Vzc1Rva2VuIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG4oKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSk7Y2FzZSAyOmlmKHIudDE9dD1yLnNlbnQsci50MD1udWxsPT09ci50MSxyLnQwKXtyLm5leHQ9NjticmVha31yLnQwPXZvaWQgMD09PXQ7Y2FzZSA2OmlmKCFyLnQwKXtyLm5leHQ9MTA7YnJlYWt9ci50Mj12b2lkIDAsci5uZXh0PTExO2JyZWFrO2Nhc2UgMTA6ci50Mj10LmFjY2Vzc190b2tlbjtjYXNlIDExOnJldHVybiByLmFicnVwdCgicmV0dXJuIixyLnQyKTtjYXNlIDEyOmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksbix0aGlzKX0pKSl9fSx7a2V5OiJpc0F1dGhlbnRpY2F0ZWQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQudDA9Qm9vbGVhbix0Lm5leHQ9Myx0aGlzLmdldEFjY2Vzc1Rva2VuKGUpO2Nhc2UgMzpyZXR1cm4gdC50MT10LnNlbnQsdC5hYnJ1cHQoInJldHVybiIsKDAsdC50MCkodC50MSkpO2Nhc2UgNTpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX0se2tleToiZ2V0UEtDRUNvZGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBuKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoTC5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKGUpLHQpO2Nhc2UgMjpyZXR1cm4gci5hYnJ1cHQoInJldHVybiIsci5zZW50KTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxuLHRoaXMpfSkpKX19LHtrZXk6InNldFBLQ0VDb2RlIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBhKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoTC5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKHQpLGUsbik7Y2FzZSAyOnJldHVybiByLmFicnVwdCgicmV0dXJuIixyLnNlbnQpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGEsdGhpcyl9KSkpfX0se2tleToidXBkYXRlQ29uZmlnIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuc2V0Q29uZmlnRGF0YShlKTtjYXNlIDI6cmV0dXJuIHQubmV4dD00LHRoaXMuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITApO2Nhc2UgNDpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX1dKSxlfSgpLHE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQscil7byh0aGlzLGUpLHRoaXMuX2lkPXQsdGhpcy5fc3RvcmU9cn1yZXR1cm4gdShlLFt7a2V5OiJzZXREYXRhSW5CdWxrIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gYSgpe3ZhciBpLG8scyx1O3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIubmV4dD0yLHRoaXMuX3N0b3JlLmdldERhdGEoZSk7Y2FzZSAyOmlmKHIudDE9bj1yLnNlbnQsci50MD1udWxsIT09ci50MSwhci50MCl7ci5uZXh0PTY7YnJlYWt9ci50MD12b2lkIDAhPT1uO2Nhc2UgNjppZighci50MCl7ci5uZXh0PTEwO2JyZWFrfXIudDI9bixyLm5leHQ9MTE7YnJlYWs7Y2FzZSAxMDpyLnQyPW51bGw7Y2FzZSAxMTpyZXR1cm4gaT1yLnQyLG89aSYmSlNPTi5wYXJzZShpKSxzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxvKSx0KSx1PUpTT04uc3RyaW5naWZ5KHMpLHIubmV4dD0xNyx0aGlzLl9zdG9yZS5zZXREYXRhKGUsdSk7Y2FzZSAxNzpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGEsdGhpcyl9KSkpfX0se2tleToic2V0VmFsdWUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgYTtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGkoKXt2YXIgbyxzLHUsZjtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLm5leHQ9Mix0aGlzLl9zdG9yZS5nZXREYXRhKGUpO2Nhc2UgMjppZihyLnQxPWE9ci5zZW50LHIudDA9bnVsbCE9PXIudDEsIXIudDApe3IubmV4dD02O2JyZWFrfXIudDA9dm9pZCAwIT09YTtjYXNlIDY6aWYoIXIudDApe3IubmV4dD0xMDticmVha31yLnQyPWEsci5uZXh0PTExO2JyZWFrO2Nhc2UgMTA6ci50Mj1udWxsO2Nhc2UgMTE6cmV0dXJuIG89ci50MixzPW8mJkpTT04ucGFyc2UobyksdT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scyksYyh7fSx0LG4pKSxmPUpTT04uc3RyaW5naWZ5KHUpLHIubmV4dD0xNyx0aGlzLl9zdG9yZS5zZXREYXRhKGUsZik7Y2FzZSAxNzpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGksdGhpcyl9KSkpfX0se2tleToicmVtb3ZlVmFsdWUiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBhKCl7dmFyIGksbyxzLHU7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fc3RvcmUuZ2V0RGF0YShlKTtjYXNlIDI6aWYoci50MT1uPXIuc2VudCxyLnQwPW51bGwhPT1yLnQxLCFyLnQwKXtyLm5leHQ9NjticmVha31yLnQwPXZvaWQgMCE9PW47Y2FzZSA2OmlmKCFyLnQwKXtyLm5leHQ9MTA7YnJlYWt9ci50Mj1uLHIubmV4dD0xMTticmVhaztjYXNlIDEwOnIudDI9bnVsbDtjYXNlIDExOnJldHVybiBpPXIudDIsbz1pJiZKU09OLnBhcnNlKGkpLGRlbGV0ZShzPU9iamVjdC5hc3NpZ24oe30sbykpW3RdLHU9SlNPTi5zdHJpbmdpZnkocyksci5uZXh0PTE4LHRoaXMuX3N0b3JlLnNldERhdGEoZSx1KTtjYXNlIDE4OmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksYSx0aGlzKX0pKSl9fSx7a2V5OiJfcmVzb2x2ZUtleSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8iIi5jb25jYXQoZSwiLSIpLmNvbmNhdCh0aGlzLl9pZCwiLSIpLmNvbmNhdCh0KToiIi5jb25jYXQoZSwiLSIpLmNvbmNhdCh0aGlzLl9pZCl9fSx7a2V5OiJzZXRDb25maWdEYXRhIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLnNldERhdGFJbkJ1bGsodGhpcy5fcmVzb2x2ZUtleShBLkNvbmZpZ0RhdGEpLGUpO2Nhc2UgMjpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX0se2tleToic2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6dGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoQS5PSURDUHJvdmlkZXJNZXRhRGF0YSksZSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSl9fSx7a2V5OiJzZXRUZW1wb3JhcnlEYXRhIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbigpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6dGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoQS5UZW1wb3JhcnlEYXRhLHQpLGUpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX0se2tleToic2V0U2Vzc2lvbkRhdGEiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBuKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDp0aGlzLnNldERhdGFJbkJ1bGsodGhpcy5fcmVzb2x2ZUtleShBLlNlc3Npb25EYXRhLHQpLGUpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX0se2tleToic2V0Q3VzdG9tRGF0YSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gYSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6dGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoZSxuKSx0KTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxhLHRoaXMpfSkpKX19LHtrZXk6ImdldENvbmZpZ0RhdGEiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC50MD1KU09OLHQubmV4dD0zLHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShBLkNvbmZpZ0RhdGEpKTtjYXNlIDM6aWYodC50Mj1lPXQuc2VudCx0LnQxPW51bGwhPT10LnQyLCF0LnQxKXt0Lm5leHQ9NzticmVha310LnQxPXZvaWQgMCE9PWU7Y2FzZSA3OmlmKCF0LnQxKXt0Lm5leHQ9MTE7YnJlYWt9dC50Mz1lLHQubmV4dD0xMjticmVhaztjYXNlIDExOnQudDM9bnVsbDtjYXNlIDEyOnJldHVybiB0LnQ0PXQudDMsdC5hYnJ1cHQoInJldHVybiIsdC50MC5wYXJzZS5jYWxsKHQudDAsdC50NCkpO2Nhc2UgMTQ6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImdldE9JRENQcm92aWRlck1ldGFEYXRhIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlO3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQudDA9SlNPTix0Lm5leHQ9Myx0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoQS5PSURDUHJvdmlkZXJNZXRhRGF0YSkpO2Nhc2UgMzppZih0LnQyPWU9dC5zZW50LHQudDE9bnVsbCE9PXQudDIsIXQudDEpe3QubmV4dD03O2JyZWFrfXQudDE9dm9pZCAwIT09ZTtjYXNlIDc6aWYoIXQudDEpe3QubmV4dD0xMTticmVha310LnQzPWUsdC5uZXh0PTEyO2JyZWFrO2Nhc2UgMTE6dC50Mz1udWxsO2Nhc2UgMTI6cmV0dXJuIHQudDQ9dC50Myx0LmFicnVwdCgicmV0dXJuIix0LnQwLnBhcnNlLmNhbGwodC50MCx0LnQ0KSk7Y2FzZSAxNDpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX0se2tleToiZ2V0VGVtcG9yYXJ5RGF0YSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBuKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci50MD1KU09OLHIubmV4dD0zLHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShBLlRlbXBvcmFyeURhdGEsZSkpO2Nhc2UgMzppZihyLnQyPXQ9ci5zZW50LHIudDE9bnVsbCE9PXIudDIsIXIudDEpe3IubmV4dD03O2JyZWFrfXIudDE9dm9pZCAwIT09dDtjYXNlIDc6aWYoIXIudDEpe3IubmV4dD0xMTticmVha31yLnQzPXQsci5uZXh0PTEyO2JyZWFrO2Nhc2UgMTE6ci50Mz1udWxsO2Nhc2UgMTI6cmV0dXJuIHIudDQ9ci50MyxyLmFicnVwdCgicmV0dXJuIixyLnQwLnBhcnNlLmNhbGwoci50MCxyLnQ0KSk7Y2FzZSAxNDpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX0se2tleToiZ2V0U2Vzc2lvbkRhdGEiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbigpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIudDA9SlNPTixyLm5leHQ9Myx0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoQS5TZXNzaW9uRGF0YSxlKSk7Y2FzZSAzOmlmKHIudDI9dD1yLnNlbnQsci50MT1udWxsIT09ci50Miwhci50MSl7ci5uZXh0PTc7YnJlYWt9ci50MT12b2lkIDAhPT10O2Nhc2UgNzppZighci50MSl7ci5uZXh0PTExO2JyZWFrfXIudDM9dCxyLm5leHQ9MTI7YnJlYWs7Y2FzZSAxMTpyLnQzPW51bGw7Y2FzZSAxMjpyZXR1cm4gci50ND1yLnQzLHIuYWJydXB0KCJyZXR1cm4iLHIudDAucGFyc2UuY2FsbChyLnQwLHIudDQpKTtjYXNlIDE0OmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksbix0aGlzKX0pKSl9fSx7a2V5OiJnZXRDdXN0b21EYXRhIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gYSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIudDA9SlNPTixyLm5leHQ9Myx0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoZSx0KSk7Y2FzZSAzOmlmKHIudDI9bj1yLnNlbnQsci50MT1udWxsIT09ci50Miwhci50MSl7ci5uZXh0PTc7YnJlYWt9ci50MT12b2lkIDAhPT1uO2Nhc2UgNzppZighci50MSl7ci5uZXh0PTExO2JyZWFrfXIudDM9bixyLm5leHQ9MTI7YnJlYWs7Y2FzZSAxMTpyLnQzPW51bGw7Y2FzZSAxMjpyZXR1cm4gci50ND1yLnQzLHIuYWJydXB0KCJyZXR1cm4iLHIudDAucGFyc2UuY2FsbChyLnQwLHIudDQpKTtjYXNlIDE0OmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksYSx0aGlzKX0pKSl9fSx7a2V5OiJyZW1vdmVDb25maWdEYXRhIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUubmV4dD0yLHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShBLkNvbmZpZ0RhdGEpKTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX19LHtrZXk6InJlbW92ZU9JRENQcm92aWRlck1ldGFEYXRhIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUubmV4dD0yLHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShBLk9JRENQcm92aWRlck1ldGFEYXRhKSk7Y2FzZSAyOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9fSx7a2V5OiJyZW1vdmVUZW1wb3JhcnlEYXRhIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoQS5UZW1wb3JhcnlEYXRhLGUpKTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6InJlbW92ZVNlc3Npb25EYXRhIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoQS5TZXNzaW9uRGF0YSxlKSk7Y2FzZSAyOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSl9fSx7a2V5OiJnZXRDb25maWdEYXRhUGFyYW1ldGVyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXt2YXIgbjtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoQS5Db25maWdEYXRhKSk7Y2FzZSAyOnJldHVybiBuPXQuc2VudCx0LmFicnVwdCgicmV0dXJuIixuJiZKU09OLnBhcnNlKG4pW2VdKTtjYXNlIDQ6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXt2YXIgbjtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoQS5PSURDUHJvdmlkZXJNZXRhRGF0YSkpO2Nhc2UgMjpyZXR1cm4gbj10LnNlbnQsdC5hYnJ1cHQoInJldHVybiIsbiYmSlNPTi5wYXJzZShuKVtlXSk7Y2FzZSA0OmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSl9fSx7a2V5OiJnZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbigpe3ZhciBhO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIubmV4dD0yLHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShBLlRlbXBvcmFyeURhdGEsdCkpO2Nhc2UgMjpyZXR1cm4gYT1yLnNlbnQsci5hYnJ1cHQoInJldHVybiIsYSYmSlNPTi5wYXJzZShhKVtlXSk7Y2FzZSA0OmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksbix0aGlzKX0pKSl9fSx7a2V5OiJnZXRTZXNzaW9uRGF0YVBhcmFtZXRlciIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG4oKXt2YXIgYTtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLm5leHQ9Mix0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoQS5TZXNzaW9uRGF0YSx0KSk7Y2FzZSAyOnJldHVybiBhPXIuc2VudCxyLmFicnVwdCgicmV0dXJuIixhJiZKU09OLnBhcnNlKGEpW2VdKTtjYXNlIDQ6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxuLHRoaXMpfSkpKX19LHtrZXk6InNldENvbmZpZ0RhdGFQYXJhbWV0ZXIiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBuKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KEEuQ29uZmlnRGF0YSksZSx0KTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxuLHRoaXMpfSkpKX19LHtrZXk6InNldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbigpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIubmV4dD0yLHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShBLk9JRENQcm92aWRlck1ldGFEYXRhKSxlLHQpO2Nhc2UgMjpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX0se2tleToic2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlciIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gYSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIubmV4dD0yLHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShBLlRlbXBvcmFyeURhdGEsbiksZSx0KTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxhLHRoaXMpfSkpKX19LHtrZXk6InNldFNlc3Npb25EYXRhUGFyYW1ldGVyIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBhKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KEEuU2Vzc2lvbkRhdGEsbiksZSx0KTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxhLHRoaXMpfSkpKX19LHtrZXk6InJlbW92ZUNvbmZpZ0RhdGFQYXJhbWV0ZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQubmV4dD0yLHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShBLkNvbmZpZ0RhdGEpLGUpO2Nhc2UgMjpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX0se2tleToicmVtb3ZlT0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQubmV4dD0yLHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShBLk9JRENQcm92aWRlck1ldGFEYXRhKSxlKTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6InJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBuKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KEEuVGVtcG9yYXJ5RGF0YSx0KSxlKTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxuLHRoaXMpfSkpKX19LHtrZXk6InJlbW92ZVNlc3Npb25EYXRhUGFyYW1ldGVyIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbigpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIubmV4dD0yLHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShBLlNlc3Npb25EYXRhLHQpLGUpO2Nhc2UgMjpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX1dKSxlfSgpLEs9e2Nsb2NrVG9sZXJhbmNlOjMwMCxlbmFibGVQS0NFOiEwLHJlc3BvbnNlTW9kZTpULnF1ZXJ5LHNjb3BlOlsib3BlbmlkIl0sc2VuZENvb2tpZXNJblJlcXVlc3RzOiEwLHZhbGlkYXRlSURUb2tlbjohMH0sSj1mdW5jdGlvbigpewovKioKICAgICAgICAgKiBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBtZXRob2QgdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSAuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0b3JlfSBzdG9yZSAtIFRoZSBzdG9yZSBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IF9zdG9yZTogU3RvcmUgPSBuZXcgRGF0YVN0b3JlKCk7CiAgICAgICAgICogY29uc3QgYXV0aCA9IG5ldyBBc2dhcmRlb0F1dGhDbGllbnQ8Q3VzdG9tQ2xpZW50Q29uZmlnPihfc3RvcmUpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2NvbnN0cnVjdG9yCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovCmZ1bmN0aW9uIGUodCxyKXtvKHRoaXMsZSksZS5faW5zdGFuY2VJRD9lLl9pbnN0YW5jZUlEKz0xOmUuX2luc3RhbmNlSUQ9MCx0aGlzLl9kYXRhTGF5ZXI9bmV3IHEoImluc3RhbmNlXyIuY29uY2F0KGUuX2luc3RhbmNlSUQpLHQpLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZT1uZXcgTih0aGlzLl9kYXRhTGF5ZXIsciksZS5fYXV0aGVudGljYXRpb25Db3JlPW5ldyBOKHRoaXMuX2RhdGFMYXllcixyKX0KLyoqCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0aGUgU0RLIHdpdGggdGhlIGNvbmZpZyBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBdXRoQ2xpZW50Q29uZmlnPFQ+fSBjb25maWcgLSBUaGUgY29uZmlnIG9iamVjdCB0byBpbml0aWFsaXplIHdpdGguCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICAgKiAgICAgc2lnbkluUmVkaXJlY3RVUkw6ICJodHRwOi8vbG9jYWxob3N0OjMwMDAvc2lnbi1pbiIsCiAgICAgICAgICogICAgIGNsaWVudElEOiAiY2xpZW50IElEIiwKICAgICAgICAgKiAgICAgYmFzZVVybDogImh0dHBzOi8vbG9jYWxob3N0Ojk0NDMiCiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogYXdhaXQgYXV0aC5pbml0aWFsaXplKGNvbmZpZyk7CiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaW5pdGlhbGl6ZQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovcmV0dXJuIHUoZSxbe2tleToiaW5pdGlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQsbixhO3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gaSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIubmV4dD0yLHRoaXMuX2RhdGFMYXllci5zZXRDb25maWdEYXRhKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LEspLGUpLHtzY29wZTpbXS5jb25jYXQoYihudWxsIT09KHQ9Sy5zY29wZSkmJnZvaWQgMCE9PXQ/dDpbXSksYihudWxsIT09KGE9bnVsbD09PShuPWUuc2NvcGUpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmZpbHRlcigoZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIShudWxsPT09KHQ9bnVsbD09Sz92b2lkIDA6Sy5zY29wZSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuaW5jbHVkZXMoZSkpfSkpKSYmdm9pZCAwIT09YT9hOltdKSl9KSk7Y2FzZSAyOmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksaSx0aGlzKX0pKSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYERhdGFMYXllcmAgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBhY2Nlc3MgYXV0aGVudGljYXRpb24gZGF0YS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJuIHtEYXRhTGF5ZXJ9IC0gVGhlIGBEYXRhTGF5ZXJgIG9iamVjdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBkYXRhID0gYXV0aC5nZXREYXRhTGF5ZXIoKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXREYXRhTGF5ZXIKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi99LHtrZXk6ImdldERhdGFMYXllciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YUxheWVyfQovKioKICAgICAgICAgICAqIFRoaXMgaXMgYW4gYXN5bmMgbWV0aG9kIHRoYXQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhdXRob3JpemF0aW9uIFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0ge0dldEF1dGhVUkxDb25maWd9IGNvbmZpZyAtIChPcHRpb25hbCkgQSBjb25maWcgb2JqZWN0IHRvIGZvcmNlIGluaXRpYWxpemF0aW9uIGFuZCBwYXNzCiAgICAgICAgICAgKiBjdXN0b20gcGF0aCBwYXJhbWV0ZXJzIHN1Y2ggYXMgdGhlIGZpZHAgcGFyYW1ldGVyLgogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYXV0aG9yaXphdGlvbiBVUkwuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogYXV0aC5nZXRBdXRob3JpemF0aW9uVVJMKCkudGhlbigodXJsKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHVybCk7CiAgICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICAgKiB9KTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRBdXRob3JpemF0aW9uVVJMCiAgICAgICAgICAgKgogICAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovfSx7a2V5OiJnZXRBdXRob3JpemF0aW9uVVJMIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbigpe3ZhciBhLGk9dGhpcztyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiBudWxsPT0oYT1PYmplY3QuYXNzaWduKHt9LGUpKXx8ZGVsZXRlIGEuZm9yY2VJbml0LHIubmV4dD00LHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIik7Y2FzZSA0OmlmKCFyLnNlbnQpe3IubmV4dD04O2JyZWFrfXIudDA9dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEF1dGhvcml6YXRpb25VUkwoYSx0KSxyLm5leHQ9OTticmVhaztjYXNlIDg6ci50MD10aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEobnVsbD09ZT92b2lkIDA6ZS5mb3JjZUluaXQpLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIGkuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBdXRob3JpemF0aW9uVVJMKGEsdCl9KSk7Y2FzZSA5OnJldHVybiByLmFicnVwdCgicmV0dXJuIixyLnQwKTtjYXNlIDEwOmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksbix0aGlzKX0pKSl9Ci8qKgogICAgICAgICAgICogVGhpcyBpcyBhbiBhc3luYyBtZXRob2QgdGhhdCBzZW5kcyBhIHJlcXVlc3QgdG8gb2J0YWluIHRoZSBhY2Nlc3MgdG9rZW4gYW5kIHJldHVybnMgYSBQcm9taXNlCiAgICAgICAgICAgKiB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIGFuZCBvdGhlciByZWxldmFudCBkYXRhLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRob3JpemF0aW9uQ29kZSAtIFRoZSBhdXRob3JpemF0aW9uIGNvZGUuCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvblN0YXRlIC0gVGhlIHNlc3Npb24gc3RhdGUuCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8VG9rZW5SZXNwb25zZT59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdG9rZW4gcmVzcG9uc2UuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogYXV0aC5yZXF1ZXN0QWNjZXNzVG9rZW4oYXV0aENvZGUsIHNlc3Npb25TdGF0ZSkudGhlbigodG9rZW4pPT57CiAgICAgICAgICAgKiAgLy8gY29uc29sZS5sb2codG9rZW4pOwogICAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAgICogfSk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmVxdWVzdEFjY2Vzc1Rva2VuCiAgICAgICAgICAgKgogICAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovfSx7a2V5OiJyZXF1ZXN0QWNjZXNzVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGEpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gaSgpe3ZhciBvPXRoaXM7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKTtjYXNlIDI6aWYoIXIuc2VudCl7ci5uZXh0PTY7YnJlYWt9ci50MD10aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVxdWVzdEFjY2Vzc1Rva2VuKGUsdCxuLGEpLHIubmV4dD03O2JyZWFrO2Nhc2UgNjpyLnQwPXRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSghMSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gby5fYXV0aGVudGljYXRpb25Db3JlLnJlcXVlc3RBY2Nlc3NUb2tlbihlLHQsbixhKX0pKTtjYXNlIDc6cmV0dXJuIHIuYWJydXB0KCJyZXR1cm4iLHIudDApO2Nhc2UgODpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGksdGhpcyl9KSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgYXV0aGVudGljYXRpb24gZGF0YSBhbmQgcmV0dXJucyB0aGUgc2lnbi1vdXQgVVJMLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBzaWduT3V0VXJsID0gYXdhaXQgYXV0aC5zaWduT3V0KCk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjc2lnbk91dAogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToic2lnbk91dCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnNpZ25PdXQoZSkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqICoqVGhpcyBkb2Vzbid0IGNsZWFyIHRoZSBhdXRoZW50aWNhdGlvbiBkYXRhLioqCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBzaWduT3V0VXJsID0gYXdhaXQgYXV0aC5nZXRTaWduT3V0VVJMKCk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0U2lnbk91dFVSTAogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToiZ2V0U2lnbk91dFVSTCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldFNpZ25PdXRVUkwoZSkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgT0lEQyBzZXJ2aWNlIGVuZHBvaW50cyB0aGF0IGFyZSBmZXRjaGVkIGZyb20gdGhlIGAud2VsbC1rbm93bmAgZW5kcG9pbnQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxPSURDRW5kcG9pbnRzPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBPSURDIHNlcnZpY2UgZW5kcG9pbnRzLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGF1dGguZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRPSURDU2VydmljZUVuZHBvaW50cwogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToiZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsdGhpcyl9KSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIGRlY29kZXMgdGhlIHBheWxvYWQgb2YgdGhlIElEIHRva2VuIGFuZCByZXR1cm5zIGl0LgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxEZWNvZGVkSURUb2tlblBheWxvYWQ+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGRlY29kZWQgSUQgdG9rZW4gcGF5bG9hZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBkZWNvZGVkSWRUb2tlbiA9IGF3YWl0IGF1dGguZ2V0RGVjb2RlZElEVG9rZW4oKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXREZWNvZGVkSURUb2tlbgogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToiZ2V0RGVjb2RlZElEVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXREZWNvZGVkSURUb2tlbihlKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgSUQgdG9rZW4uCiAgICAgICAgICAgKgogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgSUQgdG9rZW4uCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogY29uc3QgaWRUb2tlbiA9IGF3YWl0IGF1dGguZ2V0SURUb2tlbigpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldElEVG9rZW4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi99LHtrZXk6ImdldElEVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRJRFRva2VuKGUpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBiYXNpYyB1c2VyIGluZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gdGhlIElEIHRva2VuLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxCYXNpY1VzZXJJbmZvPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBiYXNpYyB1c2VyIGluZm9ybWF0aW9uLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IHVzZXJJbmZvID0gYXdhaXQgYXV0aC5nZXRCYXNpY1VzZXJJbmZvKCk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QmFzaWNVc2VySW5mbwogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToiZ2V0QmFzaWNVc2VySW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEJhc2ljVXNlckluZm8oZSkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGNyeXB0byBoZWxwZXIgb2JqZWN0LgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8Q3J5cHRvSGVscGVyPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGEgQ3J5cHRvSGVscGVyIG9iamVjdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBjcnlwdG9IZWxwZXIgPSBhd2FpdCBhdXRoLkNyeXB0b0hlbHBlcigpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldENyeXB0b0hlbHBlcgogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToiZ2V0Q3J5cHRvSGVscGVyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRDcnlwdG9IZWxwZXIoKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV2b2tlcyB0aGUgYWNjZXNzIHRva2VuLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogKipUaGlzIG1ldGhvZCBhbHNvIGNsZWFycyB0aGUgYXV0aGVudGljYXRpb24gZGF0YS4qKgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8RmV0Y2hSZXNwb25zZT59IC0gQSBQcm9taXNlIHRoYXQgcmV0dXJucyB0aGUgcmVzcG9uc2Ugb2YgdGhlIHJldm9rZS1hY2Nlc3MtdG9rZW4gcmVxdWVzdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBhdXRoLnJldm9rZUFjY2Vzc1Rva2VuKCkudGhlbigocmVzcG9uc2UpPT57CiAgICAgICAgICAgKiAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpOwogICAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAgICogfSk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmV2b2tlQWNjZXNzVG9rZW4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi99LHtrZXk6InJldm9rZUFjY2Vzc1Rva2VuIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJldm9rZUFjY2Vzc1Rva2VuKGUpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIHJlZnJlc2hlcyB0aGUgYWNjZXNzIHRva2VuIGFuZCByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIG5ldyBhY2Nlc3MKICAgICAgICAgICAqIHRva2VuIGFuZCBvdGhlciByZWxldmFudCBkYXRhLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxUb2tlblJlc3BvbnNlPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0b2tlbiByZXNwb25zZS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBhdXRoLnJlZnJlc2hBY2Nlc3NUb2tlbigpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTsKICAgICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgICAqIH0pOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3JlZnJlc2hBY2Nlc3NUb2tlbgogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToicmVmcmVzaEFjY2Vzc1Rva2VuIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlZnJlc2hBY2Nlc3NUb2tlbihlKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICAgKgogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYWNjZXNzIHRva2VuLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgYXV0aC5nZXRBY2Nlc3NUb2tlbigpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEFjY2Vzc1Rva2VuCiAgICAgICAgICAgKgogICAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovfSx7a2V5OiJnZXRBY2Nlc3NUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEFjY2Vzc1Rva2VuKGUpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCBzZW5kcyBhIGN1c3RvbS1ncmFudCByZXF1ZXN0IGFuZCByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3BvbnNlCiAgICAgICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIGNvbmZpZyBwYXNzZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHBhcmFtIHtDdXN0b21HcmFudENvbmZpZ30gY29uZmlnIC0gQSBjb25maWcgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1c3RvbSBncmFudCBjb25maWd1cmF0aW9ucy4KICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxUb2tlblJlc3BvbnNlIHwgRmV0Y2hSZXNwb25zZT59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzcG9uc2UgZGVwZW5kaW5nCiAgICAgICAgICAgKiBvbiB5b3VyIGNvbmZpZ3VyYXRpb25zLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICAgICAqICAgYXR0YWNoVG9rZW46IGZhbHNlLAogICAgICAgICAgICogICBkYXRhOiB7CiAgICAgICAgICAgKiAgICAgICBjbGllbnRfaWQ6ICJ7e2NsaWVudElEfX0iLAogICAgICAgICAgICogICAgICAgZ3JhbnRfdHlwZTogImFjY291bnRfc3dpdGNoIiwKICAgICAgICAgICAqICAgICAgIHNjb3BlOiAie3tzY29wZX19IiwKICAgICAgICAgICAqICAgICAgIHRva2VuOiAie3t0b2tlbn19IiwKICAgICAgICAgICAqICAgfSwKICAgICAgICAgICAqICAgaWQ6ICJhY2NvdW50LXN3aXRjaCIsCiAgICAgICAgICAgKiAgIHJldHVyblJlc3BvbnNlOiB0cnVlLAogICAgICAgICAgICogICByZXR1cm5zU2Vzc2lvbjogdHJ1ZSwKICAgICAgICAgICAqICAgc2lnbkluUmVxdWlyZWQ6IHRydWUKICAgICAgICAgICAqIH0KICAgICAgICAgICAqCiAgICAgICAgICAgKiBhdXRoLnJlcXVlc3RDdXN0b21HcmFudChjb25maWcpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTsKICAgICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgICAqIH0pOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3JlcXVlc3RDdXN0b21HcmFudAogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToicmVxdWVzdEN1c3RvbUdyYW50Iix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVxdWVzdEN1c3RvbUdyYW50KGUsdCl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIG9yIG5vdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogYXdhaXQgYXV0aC5pc0F1dGhlbnRpY2F0ZWQoKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNpc0F1dGhlbnRpY2F0ZWQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi99LHtrZXk6ImlzQXV0aGVudGljYXRlZCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmlzQXV0aGVudGljYXRlZChlKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgUEtDRSBjb2RlIGdlbmVyYXRlZCBkdXJpbmcgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGF1dGhlbnRpY2F0aW9uIFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlIC0gVGhlIHN0YXRlIHBhcmFtZXRlciB0aGF0IHdhcyBwYXNzZWQgaW4gdGhlIGF1dGhlbnRpY2F0aW9uIFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgUEtDRSBjb2RlLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IHBrY2UgPSBhd2FpdCBnZXRQS0NFQ29kZSgpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldFBLQ0VDb2RlCiAgICAgICAgICAgKgogICAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovfSx7a2V5OiJnZXRQS0NFQ29kZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG4oKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLmFicnVwdCgicmV0dXJuIix0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0UEtDRUNvZGUoZSx0KSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksbix0aGlzKX0pKSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgUEtDRSBjb2RlIHRvIHRoZSBkYXRhIHN0b3JlLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwa2NlIC0gVGhlIFBLQ0UgY29kZS4KICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZSAtIFRoZSBzdGF0ZSBwYXJhbWV0ZXIgdGhhdCB3YXMgcGFzc2VkIGluIHRoZSBhdXRoZW50aWNhdGlvbiBVUkwuCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGF3YWl0IGF1dGguc2V0UEtDRUNvZGUoInBrY2VfY29kZSIpCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjc2V0UEtDRUNvZGUKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi99LHtrZXk6InNldFBLQ0VDb2RlIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBhKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnNldFBLQ0VDb2RlKGUsdCxuKTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxhLHRoaXMpfSkpKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSBzaWduLW91dCBpcyBzdWNjZXNzZnVsIG9yIG5vdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbk91dFJlZGlyZWN0VXJsIC0gVGhlIFVSTCB0byB3aGljaCB0aGUgdXNlciBoYXMgYmVlbiByZWRpcmVjdGVkIHRvIGFmdGVyIHNpZ25pbmctb3V0LgogICAgICAgICAgICoKICAgICAgICAgICAqICoqVGhlIHNlcnZlciBhcHBlbmRzIHBhdGggcGFyYW1ldGVycyB0byB0aGUgYHNpZ25PdXRSZWRpcmVjdFVSTGAgYW5kIHRoZXNlIHBhdGggcGFyYW1ldGVycwogICAgICAgICAgICogIGFyZSByZXF1aXJlZCBmb3IgdGhpcyBtZXRob2QgdG8gZnVuY3Rpb24uKioKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiBzdWNjZXNzZnVsLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaXNTaWduT3V0U3VjY2Vzc2Z1bAogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToidXBkYXRlQ29uZmlnIix2YWx1ZToKLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCB1cGRhdGVzIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGluc3RhbnRpYXRpbmcgdGhpcyBjbGFzcy4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0ge1BhcnRpYWw8QXV0aENsaWVudENvbmZpZzxUPj59IGNvbmZpZyAtIEEgY29uZmlnIG9iamVjdCB0byB1cGRhdGUgdGhlIFNESyBjb25maWd1cmF0aW9ucyB3aXRoLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICAgICAqICAgICBzaWduSW5SZWRpcmVjdFVSTDogImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9zaWduLWluIiwKICAgICAgICAgICAqICAgICBjbGllbnRJRDogImNsaWVudCBJRCIsCiAgICAgICAgICAgKiAgICAgYmFzZVVybDogImh0dHBzOi8vbG9jYWxob3N0Ojk0NDMiCiAgICAgICAgICAgKiB9CiAgICAgICAgICAgKgogICAgICAgICAgICogYXdhaXQgYXV0aC51cGRhdGVDb25maWcoY29uZmlnKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3VwZGF0ZUNvbmZpZwogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqLwpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUudXBkYXRlQ29uZmlnKGUpO2Nhc2UgMjpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX1dLFt7a2V5OiJpc1NpZ25PdXRTdWNjZXNzZnVsIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1uZXcgVVJMKGUpLHI9dC5zZWFyY2hQYXJhbXMuZ2V0KCJzdGF0ZSIpLG49Qm9vbGVhbih0LnNlYXJjaFBhcmFtcy5nZXQoImVycm9yIikpO3JldHVybiEhciYmInNpZ25fb3V0X3N1Y2Nlc3MiPT09ciYmIW59Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgc2lnbi1vdXQgaGFzIGZhaWxlZCBvciBub3QuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNpZ25PdXRSZWRpcmVjdFVybCAtIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHVzZXIgaGFzIGJlZW4gcmVkaXJlY3RlZCB0byBhZnRlciBzaWduaW5nLW91dC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiAqKlRoZSBzZXJ2ZXIgYXBwZW5kcyBwYXRoIHBhcmFtZXRlcnMgdG8gdGhlIGBzaWduT3V0UmVkaXJlY3RVUkxgIGFuZCB0aGVzZSBwYXRoIHBhcmFtZXRlcnMKICAgICAgICAgICAqICBhcmUgcmVxdWlyZWQgZm9yIHRoaXMgbWV0aG9kIHRvIGZ1bmN0aW9uLioqCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gLSBgdHJ1ZWAgaWYgc3VjY2Vzc2Z1bCwgYGZhbHNlYCBvdGhlcndpc2UuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2RpZFNpZ25PdXRGYWlsCiAgICAgICAgICAgKgogICAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovfSx7a2V5OiJkaWRTaWduT3V0RmFpbCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFVSTChlKSxyPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxuPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIXImJiJzaWduX291dF9zdWNjZXNzIj09PXImJm59fSx7a2V5OiJjbGVhclVzZXJTZXNzaW9uRGF0YSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmNsZWFyVXNlclNlc3Npb25EYXRhKGUpO2Nhc2UgMjpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX1dKSxlfSgpLEI9ImluaXQiOyFmdW5jdGlvbihlKXtlLkxvY2FsU3RvcmFnZT0ibG9jYWxTdG9yYWdlIixlLlNlc3Npb25TdG9yYWdlPSJzZXNzaW9uU3RvcmFnZSIsZS5XZWJXb3JrZXI9IndlYldvcmtlciIsZS5Ccm93c2VyTWVtb3J5PSJicm93c2VyTWVtb3J5In0oVXx8KFU9e30pKSxmdW5jdGlvbihlKXtlLlNpZ25Jbj0ic2lnbi1pbiIsZS5TaWduT3V0PSJzaWduLW91dCIsZS5Jbml0aWFsaXplPSJpbml0aWFsaXplIixlLkh0dHBSZXF1ZXN0U3RhcnQ9Imh0dHAtcmVxdWVzdC1zdGFydCIsZS5IdHRwUmVxdWVzdEZpbmlzaD0iaHR0cC1yZXF1ZXN0LWZpbmlzaCIsZS5IdHRwUmVxdWVzdEVycm9yPSJodHRwLXJlcXVlc3QtZXJyb3IiLGUuSHR0cFJlcXVlc3RTdWNjZXNzPSJodHRwLXJlcXVlc3Qtc3VjY2VzcyIsZS5SZXZva2VBY2Nlc3NUb2tlbj0icmV2b2tlLWFjY2Vzcy10b2tlbiIsZS5DdXN0b21HcmFudD0iY3VzdG9tLWdyYW50IixlLlNpZ25PdXRGYWlsZWQ9InNpZ24tb3V0LWZhaWxlZCJ9KEh8fChIPXt9KSk7dmFyIEY9InByb21wdE5vbmVSZXF1ZXN0U2VudCIsVz0iZXJyb3IiLHo9ImVycm9yX2Rlc2NyaXB0aW9uIixZPSJjdXN0b21fZ3JhbnRfY29uZmlnIixHPSJzdGF0ZSIsVj0iQWNjZXNzIHRva2VuIGlzIGludmFsaWQiLFg9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiAkKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9ZnVuY3Rpb24gWihlKXtpZihlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHQ9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24ocil7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIsbi5nZXQ/bjp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZVtyXX19KX0pKSx0fXZhciBRPXtleHBvcnRzOnt9fSxlZT1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgcj1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksbj0wO248ci5sZW5ndGg7bisrKXJbbl09YXJndW1lbnRzW25dO3JldHVybiBlLmFwcGx5KHQscil9fSx0ZT1lZSxyZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIG5lKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpfWZ1bmN0aW9uIGFlKGUpe3JldHVybiB2b2lkIDA9PT1lfWZ1bmN0aW9uIGllKGUpe3JldHVybiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1yZS5jYWxsKGUpfWZ1bmN0aW9uIG9lKGUpe3JldHVybiBudWxsIT09ZSYmIm9iamVjdCI9PT1uKGUpfWZ1bmN0aW9uIHNlKGUpe2lmKCJbb2JqZWN0IE9iamVjdF0iIT09cmUuY2FsbChlKSlyZXR1cm4hMTt2YXIgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cmV0dXJuIG51bGw9PT10fHx0PT09T2JqZWN0LnByb3RvdHlwZX1mdW5jdGlvbiB1ZShlKXtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT09cmUuY2FsbChlKX1mdW5jdGlvbiBjZShlLHQpe2lmKG51bGwhPWUpaWYoIm9iamVjdCIhPT1uKGUpJiYoZT1bZV0pLG5lKGUpKWZvcih2YXIgcj0wLGE9ZS5sZW5ndGg7cjxhO3IrKyl0LmNhbGwobnVsbCxlW3JdLHIsZSk7ZWxzZSBmb3IodmFyIGkgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSYmdC5jYWxsKG51bGwsZVtpXSxpLGUpfXZhciBmZT17aXNBcnJheTpuZSxpc0FycmF5QnVmZmVyOmllLGlzQnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmIWFlKGUpJiZudWxsIT09ZS5jb25zdHJ1Y3RvciYmIWFlKGUuY29uc3RydWN0b3IpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihlKX0saXNGb3JtRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBGb3JtRGF0YV0iPT09cmUuY2FsbChlKX0saXNBcnJheUJ1ZmZlclZpZXc6ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmQXJyYXlCdWZmZXIuaXNWaWV3P0FycmF5QnVmZmVyLmlzVmlldyhlKTplJiZlLmJ1ZmZlciYmaWUoZS5idWZmZXIpfSxpc1N0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9LGlzTnVtYmVyOmZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX0saXNPYmplY3Q6b2UsaXNQbGFpbk9iamVjdDpzZSxpc1VuZGVmaW5lZDphZSxpc0RhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09cmUuY2FsbChlKX0saXNGaWxlOmZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEZpbGVdIj09PXJlLmNhbGwoZSl9LGlzQmxvYjpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBCbG9iXSI9PT1yZS5jYWxsKGUpfSxpc0Z1bmN0aW9uOnVlLGlzU3RyZWFtOmZ1bmN0aW9uKGUpe3JldHVybiBvZShlKSYmdWUoZS5waXBlKX0saXNVUkxTZWFyY2hQYXJhbXM6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgVVJMU2VhcmNoUGFyYW1zXSI9PT1yZS5jYWxsKGUpfSxpc1N0YW5kYXJkQnJvd3NlckVudjpmdW5jdGlvbigpe3JldHVybigidW5kZWZpbmVkIj09dHlwZW9mIG5hdmlnYXRvcnx8IlJlYWN0TmF0aXZlIiE9PW5hdmlnYXRvci5wcm9kdWN0JiYiTmF0aXZlU2NyaXB0IiE9PW5hdmlnYXRvci5wcm9kdWN0JiYiTlMiIT09bmF2aWdhdG9yLnByb2R1Y3QpJiYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpfSxmb3JFYWNoOmNlLG1lcmdlOmZ1bmN0aW9uIGUoKXt2YXIgdD17fTtmdW5jdGlvbiByKHIsbil7c2UodFtuXSkmJnNlKHIpP3Rbbl09ZSh0W25dLHIpOnNlKHIpP3Rbbl09ZSh7fSxyKTpuZShyKT90W25dPXIuc2xpY2UoKTp0W25dPXJ9Zm9yKHZhciBuPTAsYT1hcmd1bWVudHMubGVuZ3RoO248YTtuKyspY2UoYXJndW1lbnRzW25dLHIpO3JldHVybiB0fSxleHRlbmQ6ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBjZSh0LChmdW5jdGlvbih0LG4pe2Vbbl09ciYmImZ1bmN0aW9uIj09dHlwZW9mIHQ/dGUodCxyKTp0fSkpLGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0sc3RyaXBCT006ZnVuY3Rpb24oZSl7cmV0dXJuIDY1Mjc5PT09ZS5jaGFyQ29kZUF0KDApJiYoZT1lLnNsaWNlKDEpKSxlfX0sbGU9ZmU7ZnVuY3Rpb24gaGUoZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9dmFyIHBlPWZ1bmN0aW9uKGUsdCxyKXtpZighdClyZXR1cm4gZTt2YXIgbjtpZihyKW49cih0KTtlbHNlIGlmKGxlLmlzVVJMU2VhcmNoUGFyYW1zKHQpKW49dC50b1N0cmluZygpO2Vsc2V7dmFyIGE9W107bGUuZm9yRWFjaCh0LChmdW5jdGlvbihlLHQpe251bGwhPWUmJihsZS5pc0FycmF5KGUpP3QrPSJbXSI6ZT1bZV0sbGUuZm9yRWFjaChlLChmdW5jdGlvbihlKXtsZS5pc0RhdGUoZSk/ZT1lLnRvSVNPU3RyaW5nKCk6bGUuaXNPYmplY3QoZSkmJihlPUpTT04uc3RyaW5naWZ5KGUpKSxhLnB1c2goaGUodCkrIj0iK2hlKGUpKX0pKSl9KSksbj1hLmpvaW4oIiYiKX1pZihuKXt2YXIgaT1lLmluZGV4T2YoIiMiKTstMSE9PWkmJihlPWUuc2xpY2UoMCxpKSksZSs9KC0xPT09ZS5pbmRleE9mKCI/Iik/Ij8iOiImIikrbn1yZXR1cm4gZX0sZGU9ZmU7ZnVuY3Rpb24gdmUoKXt0aGlzLmhhbmRsZXJzPVtdfXZlLnByb3RvdHlwZS51c2U9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB0aGlzLmhhbmRsZXJzLnB1c2goe2Z1bGZpbGxlZDplLHJlamVjdGVkOnQsc3luY2hyb25vdXM6ISFyJiZyLnN5bmNocm9ub3VzLHJ1bldoZW46cj9yLnJ1bldoZW46bnVsbH0pLHRoaXMuaGFuZGxlcnMubGVuZ3RoLTF9LHZlLnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0sdmUucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24oZSl7ZGUuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLChmdW5jdGlvbih0KXtudWxsIT09dCYmZSh0KX0pKX07dmFyIGdlPXZlLHllPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e307ZnVuY3Rpb24gbWUoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiB3ZSgpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9dmFyIGJlPW1lLGtlPXdlO2Z1bmN0aW9uIHhlKGUpe2lmKGJlPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChlLDApO2lmKChiZT09PW1lfHwhYmUpJiZzZXRUaW1lb3V0KXJldHVybiBiZT1zZXRUaW1lb3V0LHNldFRpbWVvdXQoZSwwKTt0cnl7cmV0dXJuIGJlKGUsMCl9Y2F0Y2godCl7dHJ5e3JldHVybiBiZS5jYWxsKG51bGwsZSwwKX1jYXRjaCh0KXtyZXR1cm4gYmUuY2FsbCh0aGlzLGUsMCl9fX0iZnVuY3Rpb24iPT10eXBlb2YgeWUuc2V0VGltZW91dCYmKGJlPXNldFRpbWVvdXQpLCJmdW5jdGlvbiI9PXR5cGVvZiB5ZS5jbGVhclRpbWVvdXQmJihrZT1jbGVhclRpbWVvdXQpO3ZhciBfZSxTZT1bXSxFZT0hMSxUZT0tMTtmdW5jdGlvbiBBZSgpe0VlJiZfZSYmKEVlPSExLF9lLmxlbmd0aD9TZT1fZS5jb25jYXQoU2UpOlRlPS0xLFNlLmxlbmd0aCYmUmUoKSl9ZnVuY3Rpb24gUmUoKXtpZighRWUpe3ZhciBlPXhlKEFlKTtFZT0hMDtmb3IodmFyIHQ9U2UubGVuZ3RoO3Q7KXtmb3IoX2U9U2UsU2U9W107KytUZTx0OylfZSYmX2VbVGVdLnJ1bigpO1RlPS0xLHQ9U2UubGVuZ3RofV9lPW51bGwsRWU9ITEsZnVuY3Rpb24oZSl7aWYoa2U9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChlKTtpZigoa2U9PT13ZXx8IWtlKSYmY2xlYXJUaW1lb3V0KXJldHVybiBrZT1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGUpO3RyeXtrZShlKX1jYXRjaCh0KXt0cnl7cmV0dXJuIGtlLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4ga2UuY2FsbCh0aGlzLGUpfX19KGUpfX1mdW5jdGlvbiBDZShlLHQpe3RoaXMuZnVuPWUsdGhpcy5hcnJheT10fUNlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtmdW5jdGlvbiBQZSgpe312YXIgRGU9UGUsT2U9UGUsSWU9UGUsTGU9UGUsVWU9UGUsSGU9UGUsTWU9UGU7dmFyIGplPXllLnBlcmZvcm1hbmNlfHx7fSxOZT1qZS5ub3d8fGplLm1vek5vd3x8amUubXNOb3d8fGplLm9Ob3d8fGplLndlYmtpdE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07dmFyIHFlPW5ldyBEYXRlO3ZhciBLZT17bmV4dFRpY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgcj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspdFtyLTFdPWFyZ3VtZW50c1tyXTtTZS5wdXNoKG5ldyBDZShlLHQpKSwxIT09U2UubGVuZ3RofHxFZXx8eGUoUmUpfSx0aXRsZToiYnJvd3NlciIsYnJvd3NlcjohMCxlbnY6e30sYXJndjpbXSx2ZXJzaW9uOiIiLHZlcnNpb25zOnt9LG9uOkRlLGFkZExpc3RlbmVyOk9lLG9uY2U6SWUsb2ZmOkxlLHJlbW92ZUxpc3RlbmVyOlVlLHJlbW92ZUFsbExpc3RlbmVyczpIZSxlbWl0Ok1lLGJpbmRpbmc6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxjd2Q6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGNoZGlyOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkIil9LHVtYXNrOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGhydGltZTpmdW5jdGlvbihlKXt2YXIgdD0uMDAxKk5lLmNhbGwoamUpLHI9TWF0aC5mbG9vcih0KSxuPU1hdGguZmxvb3IodCUxKjFlOSk7cmV0dXJuIGUmJihyLT1lWzBdLChuLT1lWzFdKTwwJiYoci0tLG4rPTFlOSkpLFtyLG5dfSxwbGF0Zm9ybToiYnJvd3NlciIscmVsZWFzZTp7fSxjb25maWc6e30sdXB0aW1lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlLXFlKS8xZTN9fSxKZT1LZSxCZT1mZSxGZT1mdW5jdGlvbihlLHQscixuLGEpe3JldHVybiBlLmNvbmZpZz10LHImJihlLmNvZGU9ciksZS5yZXF1ZXN0PW4sZS5yZXNwb25zZT1hLGUuaXNBeGlvc0Vycm9yPSEwLGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX0sZX0sV2U9e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITF9LHplPUZlLFllPWZ1bmN0aW9uKGUsdCxyLG4sYSl7dmFyIGk9bmV3IEVycm9yKGUpO3JldHVybiB6ZShpLHQscixuLGEpfSxHZT1ZZSxWZT1mZSxYZT1WZS5pc1N0YW5kYXJkQnJvd3NlckVudigpP3t3cml0ZTpmdW5jdGlvbihlLHQscixuLGEsaSl7dmFyIG89W107by5wdXNoKGUrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KSksVmUuaXNOdW1iZXIocikmJm8ucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKHIpLnRvR01UU3RyaW5nKCkpLFZlLmlzU3RyaW5nKG4pJiZvLnB1c2goInBhdGg9IituKSxWZS5pc1N0cmluZyhhKSYmby5wdXNoKCJkb21haW49IithKSwhMD09PWkmJm8ucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPW8uam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrZSsiKT0oW147XSopIikpO3JldHVybiB0P2RlY29kZVVSSUNvbXBvbmVudCh0WzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24oZSl7dGhpcy53cml0ZShlLCIiLERhdGUubm93KCktODY0ZTUpfX06e3dyaXRlOmZ1bmN0aW9uKCl7fSxyZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHJlbW92ZTpmdW5jdGlvbigpe319LCRlPWZ1bmN0aW9uKGUpe3JldHVybi9eKFthLXpdW2EtelxkK1wtLl0qOik/XC9cLy9pLnRlc3QoZSl9LFplPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/ZS5yZXBsYWNlKC9cLyskLywiIikrIi8iK3QucmVwbGFjZSgvXlwvKy8sIiIpOmV9LFFlPWZlLGV0PVsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il0sdHQ9ZmUscnQ9dHQuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3ZhciBlLHQ9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBuKGUpe3ZhciBuPWU7cmV0dXJuIHQmJihyLnNldEF0dHJpYnV0ZSgiaHJlZiIsbiksbj1yLmhyZWYpLHIuc2V0QXR0cmlidXRlKCJocmVmIixuKSx7aHJlZjpyLmhyZWYscHJvdG9jb2w6ci5wcm90b2NvbD9yLnByb3RvY29sLnJlcGxhY2UoLzokLywiIik6IiIsaG9zdDpyLmhvc3Qsc2VhcmNoOnIuc2VhcmNoP3Iuc2VhcmNoLnJlcGxhY2UoL15cPy8sIiIpOiIiLGhhc2g6ci5oYXNoP3IuaGFzaC5yZXBsYWNlKC9eIy8sIiIpOiIiLGhvc3RuYW1lOnIuaG9zdG5hbWUscG9ydDpyLnBvcnQscGF0aG5hbWU6Ii8iPT09ci5wYXRobmFtZS5jaGFyQXQoMCk/ci5wYXRobmFtZToiLyIrci5wYXRobmFtZX19cmV0dXJuIGU9bih3aW5kb3cubG9jYXRpb24uaHJlZiksZnVuY3Rpb24odCl7dmFyIHI9dHQuaXNTdHJpbmcodCk/bih0KTp0O3JldHVybiByLnByb3RvY29sPT09ZS5wcm90b2NvbCYmci5ob3N0PT09ZS5ob3N0fX0oKTpmdW5jdGlvbigpe3JldHVybiEwfTtmdW5jdGlvbiBudChlKXt0aGlzLm1lc3NhZ2U9ZX1udC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQ2FuY2VsIisodGhpcy5tZXNzYWdlPyI6ICIrdGhpcy5tZXNzYWdlOiIiKX0sbnQucHJvdG90eXBlLl9fQ0FOQ0VMX189ITA7dmFyIGF0PW50LGl0PWZlLG90PWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztyLnN0YXR1cyYmbiYmIW4oci5zdGF0dXMpP3QoR2UoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIityLnN0YXR1cyxyLmNvbmZpZyxudWxsLHIucmVxdWVzdCxyKSk6ZShyKX0sc3Q9WGUsdXQ9cGUsY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmISRlKHQpP1plKGUsdCk6dH0sZnQ9ZnVuY3Rpb24oZSl7dmFyIHQscixuLGE9e307cmV0dXJuIGU/KFFlLmZvckVhY2goZS5zcGxpdCgiXG4iKSwoZnVuY3Rpb24oZSl7aWYobj1lLmluZGV4T2YoIjoiKSx0PVFlLnRyaW0oZS5zdWJzdHIoMCxuKSkudG9Mb3dlckNhc2UoKSxyPVFlLnRyaW0oZS5zdWJzdHIobisxKSksdCl7aWYoYVt0XSYmZXQuaW5kZXhPZih0KT49MClyZXR1cm47YVt0XT0ic2V0LWNvb2tpZSI9PT10PyhhW3RdP2FbdF06W10pLmNvbmNhdChbcl0pOmFbdF0/YVt0XSsiLCAiK3I6cn19KSksYSk6YX0sbHQ9cnQsaHQ9WWUscHQ9V2UsZHQ9YXQsdnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LHIpe3ZhciBuLGE9ZS5kYXRhLGk9ZS5oZWFkZXJzLG89ZS5yZXNwb25zZVR5cGU7ZnVuY3Rpb24gcygpe2UuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUobiksZS5zaWduYWwmJmUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixuKX1pdC5pc0Zvcm1EYXRhKGEpJiZkZWxldGUgaVsiQ29udGVudC1UeXBlIl07dmFyIHU9bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKGUuYXV0aCl7dmFyIGM9ZS5hdXRoLnVzZXJuYW1lfHwiIixmPWUuYXV0aC5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZS5hdXRoLnBhc3N3b3JkKSk6IiI7aS5BdXRob3JpemF0aW9uPSJCYXNpYyAiK2J0b2EoYysiOiIrZil9dmFyIGw9Y3QoZS5iYXNlVVJMLGUudXJsKTtmdW5jdGlvbiBoKCl7aWYodSl7dmFyIG49ImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiB1P2Z0KHUuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpOm51bGwsYT17ZGF0YTpvJiYidGV4dCIhPT1vJiYianNvbiIhPT1vP3UucmVzcG9uc2U6dS5yZXNwb25zZVRleHQsc3RhdHVzOnUuc3RhdHVzLHN0YXR1c1RleHQ6dS5zdGF0dXNUZXh0LGhlYWRlcnM6bixjb25maWc6ZSxyZXF1ZXN0OnV9O290KChmdW5jdGlvbihlKXt0KGUpLHMoKX0pLChmdW5jdGlvbihlKXtyKGUpLHMoKX0pLGEpLHU9bnVsbH19aWYodS5vcGVuKGUubWV0aG9kLnRvVXBwZXJDYXNlKCksdXQobCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSx1LnRpbWVvdXQ9ZS50aW1lb3V0LCJvbmxvYWRlbmQiaW4gdT91Lm9ubG9hZGVuZD1oOnUub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7dSYmND09PXUucmVhZHlTdGF0ZSYmKDAhPT11LnN0YXR1c3x8dS5yZXNwb25zZVVSTCYmMD09PXUucmVzcG9uc2VVUkwuaW5kZXhPZigiZmlsZToiKSkmJnNldFRpbWVvdXQoaCl9LHUub25hYm9ydD1mdW5jdGlvbigpe3UmJihyKGh0KCJSZXF1ZXN0IGFib3J0ZWQiLGUsIkVDT05OQUJPUlRFRCIsdSkpLHU9bnVsbCl9LHUub25lcnJvcj1mdW5jdGlvbigpe3IoaHQoIk5ldHdvcmsgRXJyb3IiLGUsbnVsbCx1KSksdT1udWxsfSx1Lm9udGltZW91dD1mdW5jdGlvbigpe3ZhciB0PWUudGltZW91dD8idGltZW91dCBvZiAiK2UudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixuPWUudHJhbnNpdGlvbmFsfHxwdDtlLnRpbWVvdXRFcnJvck1lc3NhZ2UmJih0PWUudGltZW91dEVycm9yTWVzc2FnZSkscihodCh0LGUsbi5jbGFyaWZ5VGltZW91dEVycm9yPyJFVElNRURPVVQiOiJFQ09OTkFCT1JURUQiLHUpKSx1PW51bGx9LGl0LmlzU3RhbmRhcmRCcm93c2VyRW52KCkpe3ZhciBwPShlLndpdGhDcmVkZW50aWFsc3x8bHQobCkpJiZlLnhzcmZDb29raWVOYW1lP3N0LnJlYWQoZS54c3JmQ29va2llTmFtZSk6dm9pZCAwO3AmJihpW2UueHNyZkhlYWRlck5hbWVdPXApfSJzZXRSZXF1ZXN0SGVhZGVyImluIHUmJml0LmZvckVhY2goaSwoZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1hJiYiY29udGVudC10eXBlIj09PXQudG9Mb3dlckNhc2UoKT9kZWxldGUgaVt0XTp1LnNldFJlcXVlc3RIZWFkZXIodCxlKX0pKSxpdC5pc1VuZGVmaW5lZChlLndpdGhDcmVkZW50aWFscyl8fCh1LndpdGhDcmVkZW50aWFscz0hIWUud2l0aENyZWRlbnRpYWxzKSxvJiYianNvbiIhPT1vJiYodS5yZXNwb25zZVR5cGU9ZS5yZXNwb25zZVR5cGUpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uRG93bmxvYWRQcm9ncmVzcyYmdS5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vbkRvd25sb2FkUHJvZ3Jlc3MpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uVXBsb2FkUHJvZ3Jlc3MmJnUudXBsb2FkJiZ1LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vblVwbG9hZFByb2dyZXNzKSwoZS5jYW5jZWxUb2tlbnx8ZS5zaWduYWwpJiYobj1mdW5jdGlvbihlKXt1JiYocighZXx8ZSYmZS50eXBlP25ldyBkdCgiY2FuY2VsZWQiKTplKSx1LmFib3J0KCksdT1udWxsKX0sZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi5zdWJzY3JpYmUobiksZS5zaWduYWwmJihlLnNpZ25hbC5hYm9ydGVkP24oKTplLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsbikpKSxhfHwoYT1udWxsKSx1LnNlbmQoYSl9KSl9LGd0PWZlLHl0PWZ1bmN0aW9uKGUsdCl7QmUuZm9yRWFjaChlLChmdW5jdGlvbihyLG4pe24hPT10JiZuLnRvVXBwZXJDYXNlKCk9PT10LnRvVXBwZXJDYXNlKCkmJihlW3RdPXIsZGVsZXRlIGVbbl0pfSkpfSxtdD1GZSx3dD17IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9O2Z1bmN0aW9uIGJ0KGUsdCl7IWd0LmlzVW5kZWZpbmVkKGUpJiZndC5pc1VuZGVmaW5lZChlWyJDb250ZW50LVR5cGUiXSkmJihlWyJDb250ZW50LVR5cGUiXT10KX12YXIga3QseHQ9e3RyYW5zaXRpb25hbDpXZSxhZGFwdGVyOigoInVuZGVmaW5lZCIhPXR5cGVvZiBYTUxIdHRwUmVxdWVzdHx8dm9pZCAwIT09SmUmJiJbb2JqZWN0IHByb2Nlc3NdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChKZSkpJiYoa3Q9dnQpLGt0KSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbihlLHQpe3JldHVybiB5dCh0LCJBY2NlcHQiKSx5dCh0LCJDb250ZW50LVR5cGUiKSxndC5pc0Zvcm1EYXRhKGUpfHxndC5pc0FycmF5QnVmZmVyKGUpfHxndC5pc0J1ZmZlcihlKXx8Z3QuaXNTdHJlYW0oZSl8fGd0LmlzRmlsZShlKXx8Z3QuaXNCbG9iKGUpP2U6Z3QuaXNBcnJheUJ1ZmZlclZpZXcoZSk/ZS5idWZmZXI6Z3QuaXNVUkxTZWFyY2hQYXJhbXMoZSk/KGJ0KHQsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiksZS50b1N0cmluZygpKTpndC5pc09iamVjdChlKXx8dCYmImFwcGxpY2F0aW9uL2pzb24iPT09dFsiQ29udGVudC1UeXBlIl0/KGJ0KHQsImFwcGxpY2F0aW9uL2pzb24iKSxmdW5jdGlvbihlLHQscil7aWYoZ3QuaXNTdHJpbmcoZSkpdHJ5e3JldHVybih0fHxKU09OLnBhcnNlKShlKSxndC50cmltKGUpfWNhdGNoKGUpe2lmKCJTeW50YXhFcnJvciIhPT1lLm5hbWUpdGhyb3cgZX1yZXR1cm4ocnx8SlNPTi5zdHJpbmdpZnkpKGUpfShlKSk6ZX1dLHRyYW5zZm9ybVJlc3BvbnNlOltmdW5jdGlvbihlKXt2YXIgdD10aGlzLnRyYW5zaXRpb25hbHx8eHQudHJhbnNpdGlvbmFsLHI9dCYmdC5zaWxlbnRKU09OUGFyc2luZyxuPXQmJnQuZm9yY2VkSlNPTlBhcnNpbmcsYT0hciYmImpzb24iPT09dGhpcy5yZXNwb25zZVR5cGU7aWYoYXx8biYmZ3QuaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChlKXtpZihhKXtpZigiU3ludGF4RXJyb3IiPT09ZS5uYW1lKXRocm93IG10KGUsdGhpcywiRV9KU09OX1BBUlNFIik7dGhyb3cgZX19cmV0dXJuIGV9XSx0aW1lb3V0OjAseHNyZkNvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLHhzcmZIZWFkZXJOYW1lOiJYLVhTUkYtVE9LRU4iLG1heENvbnRlbnRMZW5ndGg6LTEsbWF4Qm9keUxlbmd0aDotMSx2YWxpZGF0ZVN0YXR1czpmdW5jdGlvbihlKXtyZXR1cm4gZT49MjAwJiZlPDMwMH0saGVhZGVyczp7Y29tbW9uOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiJ9fX07Z3QuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSwoZnVuY3Rpb24oZSl7eHQuaGVhZGVyc1tlXT17fX0pKSxndC5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sKGZ1bmN0aW9uKGUpe3h0LmhlYWRlcnNbZV09Z3QubWVyZ2Uod3QpfSkpO3ZhciBfdD14dCxTdD1mZSxFdD1fdCxUdD1mdW5jdGlvbihlKXtyZXR1cm4hKCFlfHwhZS5fX0NBTkNFTF9fKX0sQXQ9ZmUsUnQ9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXRoaXN8fEV0O3JldHVybiBTdC5mb3JFYWNoKHIsKGZ1bmN0aW9uKHIpe2U9ci5jYWxsKG4sZSx0KX0pKSxlfSxDdD1UdCxQdD1fdCxEdD1hdDtmdW5jdGlvbiBPdChlKXtpZihlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKSxlLnNpZ25hbCYmZS5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgRHQoImNhbmNlbGVkIil9dmFyIEl0PWZlLEx0PWZ1bmN0aW9uKGUsdCl7dD10fHx7fTt2YXIgcj17fTtmdW5jdGlvbiBuKGUsdCl7cmV0dXJuIEl0LmlzUGxhaW5PYmplY3QoZSkmJkl0LmlzUGxhaW5PYmplY3QodCk/SXQubWVyZ2UoZSx0KTpJdC5pc1BsYWluT2JqZWN0KHQpP0l0Lm1lcmdlKHt9LHQpOkl0LmlzQXJyYXkodCk/dC5zbGljZSgpOnR9ZnVuY3Rpb24gYShyKXtyZXR1cm4gSXQuaXNVbmRlZmluZWQodFtyXSk/SXQuaXNVbmRlZmluZWQoZVtyXSk/dm9pZCAwOm4odm9pZCAwLGVbcl0pOm4oZVtyXSx0W3JdKX1mdW5jdGlvbiBpKGUpe2lmKCFJdC5pc1VuZGVmaW5lZCh0W2VdKSlyZXR1cm4gbih2b2lkIDAsdFtlXSl9ZnVuY3Rpb24gbyhyKXtyZXR1cm4gSXQuaXNVbmRlZmluZWQodFtyXSk/SXQuaXNVbmRlZmluZWQoZVtyXSk/dm9pZCAwOm4odm9pZCAwLGVbcl0pOm4odm9pZCAwLHRbcl0pfWZ1bmN0aW9uIHMocil7cmV0dXJuIHIgaW4gdD9uKGVbcl0sdFtyXSk6ciBpbiBlP24odm9pZCAwLGVbcl0pOnZvaWQgMH12YXIgdT17dXJsOmksbWV0aG9kOmksZGF0YTppLGJhc2VVUkw6byx0cmFuc2Zvcm1SZXF1ZXN0Om8sdHJhbnNmb3JtUmVzcG9uc2U6byxwYXJhbXNTZXJpYWxpemVyOm8sdGltZW91dDpvLHRpbWVvdXRNZXNzYWdlOm8sd2l0aENyZWRlbnRpYWxzOm8sYWRhcHRlcjpvLHJlc3BvbnNlVHlwZTpvLHhzcmZDb29raWVOYW1lOm8seHNyZkhlYWRlck5hbWU6byxvblVwbG9hZFByb2dyZXNzOm8sb25Eb3dubG9hZFByb2dyZXNzOm8sZGVjb21wcmVzczpvLG1heENvbnRlbnRMZW5ndGg6byxtYXhCb2R5TGVuZ3RoOm8sdHJhbnNwb3J0Om8saHR0cEFnZW50Om8saHR0cHNBZ2VudDpvLGNhbmNlbFRva2VuOm8sc29ja2V0UGF0aDpvLHJlc3BvbnNlRW5jb2Rpbmc6byx2YWxpZGF0ZVN0YXR1czpzfTtyZXR1cm4gSXQuZm9yRWFjaChPYmplY3Qua2V5cyhlKS5jb25jYXQoT2JqZWN0LmtleXModCkpLChmdW5jdGlvbihlKXt2YXIgdD11W2VdfHxhLG49dChlKTtJdC5pc1VuZGVmaW5lZChuKSYmdCE9PXN8fChyW2VdPW4pfSkpLHJ9LFV0PSIwLjI2LjEiLEh0PVV0LE10PXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSx0KXtNdFtlXT1mdW5jdGlvbihyKXtyZXR1cm4gbihyKT09PWV8fCJhIisodDwxPyJuICI6IiAiKStlfX0pKTt2YXIganQ9e307TXQudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxyKXtmdW5jdGlvbiBuKGUsdCl7cmV0dXJuIltBeGlvcyB2IitIdCsiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK2UrIiciK3QrKHI/Ii4gIityOiIiKX1yZXR1cm4gZnVuY3Rpb24ocixhLGkpe2lmKCExPT09ZSl0aHJvdyBuZXcgRXJyb3IobihhLCIgaGFzIGJlZW4gcmVtb3ZlZCIrKHQ/IiBpbiAiK3Q6IiIpKSk7cmV0dXJuIHQmJiFqdFthXSYmKGp0W2FdPSEwLGNvbnNvbGUud2FybihuKGEsIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksIWV8fGUocixhLGkpfX07dmFyIE50PXthc3NlcnRPcHRpb25zOmZ1bmN0aW9uKGUsdCxyKXtpZigib2JqZWN0IiE9PW4oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2Zvcih2YXIgYT1PYmplY3Qua2V5cyhlKSxpPWEubGVuZ3RoO2ktLSA+MDspe3ZhciBvPWFbaV0scz10W29dO2lmKHMpe3ZhciB1PWVbb10sYz12b2lkIDA9PT11fHxzKHUsbyxlKTtpZighMCE9PWMpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uICIrbysiIG11c3QgYmUgIitjKX1lbHNlIGlmKCEwIT09cil0aHJvdyBFcnJvcigiVW5rbm93biBvcHRpb24gIitvKX19LHZhbGlkYXRvcnM6TXR9LHF0PWZlLEt0PXBlLEp0PWdlLEJ0PWZ1bmN0aW9uKGUpe3JldHVybiBPdChlKSxlLmhlYWRlcnM9ZS5oZWFkZXJzfHx7fSxlLmRhdGE9UnQuY2FsbChlLGUuZGF0YSxlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXF1ZXN0KSxlLmhlYWRlcnM9QXQubWVyZ2UoZS5oZWFkZXJzLmNvbW1vbnx8e30sZS5oZWFkZXJzW2UubWV0aG9kXXx8e30sZS5oZWFkZXJzKSxBdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLChmdW5jdGlvbih0KXtkZWxldGUgZS5oZWFkZXJzW3RdfSkpLChlLmFkYXB0ZXJ8fFB0LmFkYXB0ZXIpKGUpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBPdChlKSx0LmRhdGE9UnQuY2FsbChlLHQuZGF0YSx0LmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSksdH0pLChmdW5jdGlvbih0KXtyZXR1cm4gQ3QodCl8fChPdChlKSx0JiZ0LnJlc3BvbnNlJiYodC5yZXNwb25zZS5kYXRhPVJ0LmNhbGwoZSx0LnJlc3BvbnNlLmRhdGEsdC5yZXNwb25zZS5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpKSksUHJvbWlzZS5yZWplY3QodCl9KSl9LEZ0PUx0LFd0PU50LHp0PVd0LnZhbGlkYXRvcnM7ZnVuY3Rpb24gWXQoZSl7dGhpcy5kZWZhdWx0cz1lLHRoaXMuaW50ZXJjZXB0b3JzPXtyZXF1ZXN0Om5ldyBKdCxyZXNwb25zZTpuZXcgSnR9fVl0LnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKGUsdCl7InN0cmluZyI9PXR5cGVvZiBlPyh0PXR8fHt9KS51cmw9ZTp0PWV8fHt9LCh0PUZ0KHRoaXMuZGVmYXVsdHMsdCkpLm1ldGhvZD90Lm1ldGhvZD10Lm1ldGhvZC50b0xvd2VyQ2FzZSgpOnRoaXMuZGVmYXVsdHMubWV0aG9kP3QubWV0aG9kPXRoaXMuZGVmYXVsdHMubWV0aG9kLnRvTG93ZXJDYXNlKCk6dC5tZXRob2Q9ImdldCI7dmFyIHI9dC50cmFuc2l0aW9uYWw7dm9pZCAwIT09ciYmV3QuYXNzZXJ0T3B0aW9ucyhyLHtzaWxlbnRKU09OUGFyc2luZzp6dC50cmFuc2l0aW9uYWwoenQuYm9vbGVhbiksZm9yY2VkSlNPTlBhcnNpbmc6enQudHJhbnNpdGlvbmFsKHp0LmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6enQudHJhbnNpdGlvbmFsKHp0LmJvb2xlYW4pfSwhMSk7dmFyIG49W10sYT0hMDt0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlLnJ1bldoZW4mJiExPT09ZS5ydW5XaGVuKHQpfHwoYT1hJiZlLnN5bmNocm9ub3VzLG4udW5zaGlmdChlLmZ1bGZpbGxlZCxlLnJlamVjdGVkKSl9KSk7dmFyIGksbz1bXTtpZih0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKChmdW5jdGlvbihlKXtvLnB1c2goZS5mdWxmaWxsZWQsZS5yZWplY3RlZCl9KSksIWEpe3ZhciBzPVtCdCx2b2lkIDBdO2ZvcihBcnJheS5wcm90b3R5cGUudW5zaGlmdC5hcHBseShzLG4pLHM9cy5jb25jYXQobyksaT1Qcm9taXNlLnJlc29sdmUodCk7cy5sZW5ndGg7KWk9aS50aGVuKHMuc2hpZnQoKSxzLnNoaWZ0KCkpO3JldHVybiBpfWZvcih2YXIgdT10O24ubGVuZ3RoOyl7dmFyIGM9bi5zaGlmdCgpLGY9bi5zaGlmdCgpO3RyeXt1PWModSl9Y2F0Y2goZSl7ZihlKTticmVha319dHJ5e2k9QnQodSl9Y2F0Y2goZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfWZvcig7by5sZW5ndGg7KWk9aS50aGVuKG8uc2hpZnQoKSxvLnNoaWZ0KCkpO3JldHVybiBpfSxZdC5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe3JldHVybiBlPUZ0KHRoaXMuZGVmYXVsdHMsZSksS3QoZS51cmwsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKS5yZXBsYWNlKC9eXD8vLCIiKX0scXQuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJvcHRpb25zIl0sKGZ1bmN0aW9uKGUpe1l0LnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LHIpe3JldHVybiB0aGlzLnJlcXVlc3QoRnQocnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6KHJ8fHt9KS5kYXRhfSkpfX0pKSxxdC5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sKGZ1bmN0aW9uKGUpe1l0LnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LHIsbil7cmV0dXJuIHRoaXMucmVxdWVzdChGdChufHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpyfSkpfX0pKTt2YXIgR3Q9WXQsVnQ9YXQ7ZnVuY3Rpb24gWHQoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciB0O3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7dD1lfSkpO3ZhciByPXRoaXM7dGhpcy5wcm9taXNlLnRoZW4oKGZ1bmN0aW9uKGUpe2lmKHIuX2xpc3RlbmVycyl7dmFyIHQsbj1yLl9saXN0ZW5lcnMubGVuZ3RoO2Zvcih0PTA7dDxuO3QrKylyLl9saXN0ZW5lcnNbdF0oZSk7ci5fbGlzdGVuZXJzPW51bGx9fSkpLHRoaXMucHJvbWlzZS50aGVuPWZ1bmN0aW9uKGUpe3ZhciB0LG49bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3Iuc3Vic2NyaWJlKGUpLHQ9ZX0pKS50aGVuKGUpO3JldHVybiBuLmNhbmNlbD1mdW5jdGlvbigpe3IudW5zdWJzY3JpYmUodCl9LG59LGUoKGZ1bmN0aW9uKGUpe3IucmVhc29ufHwoci5yZWFzb249bmV3IFZ0KGUpLHQoci5yZWFzb24pKX0pKX1YdC5wcm90b3R5cGUudGhyb3dJZlJlcXVlc3RlZD1mdW5jdGlvbigpe2lmKHRoaXMucmVhc29uKXRocm93IHRoaXMucmVhc29ufSxYdC5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe3RoaXMucmVhc29uP2UodGhpcy5yZWFzb24pOnRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaChlKTp0aGlzLl9saXN0ZW5lcnM9W2VdfSxYdC5wcm90b3R5cGUudW5zdWJzY3JpYmU9ZnVuY3Rpb24oZSl7aWYodGhpcy5fbGlzdGVuZXJzKXt2YXIgdD10aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihlKTstMSE9PXQmJnRoaXMuX2xpc3RlbmVycy5zcGxpY2UodCwxKX19LFh0LnNvdXJjZT1mdW5jdGlvbigpe3ZhciBlLHQ9bmV3IFh0KChmdW5jdGlvbih0KXtlPXR9KSk7cmV0dXJue3Rva2VuOnQsY2FuY2VsOmV9fTt2YXIgJHQ9WHQsWnQ9ZmUsUXQ9ZmUsZXI9ZWUsdHI9R3QscnI9THQ7dmFyIG5yPWZ1bmN0aW9uIGUodCl7dmFyIHI9bmV3IHRyKHQpLG49ZXIodHIucHJvdG90eXBlLnJlcXVlc3Qscik7cmV0dXJuIFF0LmV4dGVuZChuLHRyLnByb3RvdHlwZSxyKSxRdC5leHRlbmQobixyKSxuLmNyZWF0ZT1mdW5jdGlvbihyKXtyZXR1cm4gZShycih0LHIpKX0sbn0oX3QpO25yLkF4aW9zPXRyLG5yLkNhbmNlbD1hdCxuci5DYW5jZWxUb2tlbj0kdCxuci5pc0NhbmNlbD1UdCxuci5WRVJTSU9OPVV0LG5yLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9LG5yLnNwcmVhZD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuYXBwbHkobnVsbCx0KX19LG5yLmlzQXhpb3NFcnJvcj1mdW5jdGlvbihlKXtyZXR1cm4gWnQuaXNPYmplY3QoZSkmJiEwPT09ZS5pc0F4aW9zRXJyb3J9LFEuZXhwb3J0cz1ucixRLmV4cG9ydHMuZGVmYXVsdD1ucjt2YXIgYXIsaXI9US5leHBvcnRzO3ZhciBvcj1hcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtvKHRoaXMsZSksdGhpcy5hdHRhY2hUb2tlbj1mdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKX0sdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBudWxsfSx0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sdGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBudWxsfSx0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBudWxsfSx0aGlzLmluaXQ9dGhpcy5pbml0LmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrLmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrPXRoaXMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2suYmluZCh0aGlzKX1yZXR1cm4gdShlLFt7a2V5OiJyZXF1ZXN0SGFuZGxlciIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIG4sYTtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLmF0dGFjaFRva2VuKGUpO2Nhc2UgMjpyZXR1cm4obnVsbD09ZT92b2lkIDA6ZS5zaG91bGRFbmNvZGVUb0Zvcm1EYXRhKSYmKG49bnVsbD09ZT92b2lkIDA6ZS5kYXRhLGE9bmV3IEZvcm1EYXRhLE9iamVjdC5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKGUpe2EuYXBwZW5kKGUsbltlXSl9KSksZS5kYXRhPWEpLGUuc3RhcnRUaW1lSW5Ncz0obmV3IERhdGUpLmdldFRpbWUoKSxhci5pc0hhbmRsZXJFbmFibGVkJiZ0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayhlKSx0LmFicnVwdCgicmV0dXJuIixlKTtjYXNlIDY6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImVycm9ySGFuZGxlciIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhyb3cgYXIuaXNIYW5kbGVyRW5hYmxlZCYmKHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrJiZ0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrKGUpLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJnRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrKCkpLGV9fSx7a2V5OiJzdWNjZXNzSGFuZGxlciIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGFyLmlzSGFuZGxlckVuYWJsZWQmJih0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2smJnRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKSx0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiZ0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaygpKSxlfX0se2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0hKGFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdKXx8YXJndW1lbnRzWzBdLHQ9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBuKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDphci5pc0hhbmRsZXJFbmFibGVkPWUsdGhpcy5hdHRhY2hUb2tlbj10O2Nhc2UgMjpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX0se2tleToiZW5hYmxlSGFuZGxlciIsdmFsdWU6ZnVuY3Rpb24oKXthci5pc0hhbmRsZXJFbmFibGVkPSEwfX0se2tleToiZGlzYWJsZUhhbmRsZXIiLHZhbHVlOmZ1bmN0aW9uKCl7YXIuaXNIYW5kbGVyRW5hYmxlZD0hMX19LHtrZXk6ImRpc2FibGVIYW5kbGVyV2l0aFRpbWVvdXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOmFyLkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQ7YXIuaXNIYW5kbGVyRW5hYmxlZD0hMSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2FyLmlzSGFuZGxlckVuYWJsZWQ9ITB9KSxlKX19LHtrZXk6InNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjaz1lfX0se2tleToic2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz1lfX0se2tleToic2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrPWV9fSx7a2V5OiJzZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaz1lfX1dLFt7a2V5OiJnZXRJbnN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiB0aGlzLmF4aW9zSW5zdGFuY2V8fCh0aGlzLmF4aW9zSW5zdGFuY2U9aXIuY3JlYXRlKHt3aXRoQ3JlZGVudGlhbHM6ITB9KSx0aGlzLmNsaWVudEluc3RhbmNlfHwodGhpcy5jbGllbnRJbnN0YW5jZT1uZXcgYXIpLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoKGZ1bmN0aW9uKHQpe3JldHVybiBTKGUsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUubmV4dD0yLHRoaXMuY2xpZW50SW5zdGFuY2UucmVxdWVzdEhhbmRsZXIodCk7Y2FzZSAyOnJldHVybiBlLmFicnVwdCgicmV0dXJuIixlLnNlbnQpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsdGhpcyl9KSkpfSkpLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKChmdW5jdGlvbih0KXtyZXR1cm4gZS5jbGllbnRJbnN0YW5jZS5zdWNjZXNzSGFuZGxlcih0KX0pLChmdW5jdGlvbih0KXtyZXR1cm4gZS5jbGllbnRJbnN0YW5jZS5lcnJvckhhbmRsZXIodCl9KSksdGhpcy5heGlvc0luc3RhbmNlLmFsbD1pci5hbGwsdGhpcy5heGlvc0luc3RhbmNlLnNwcmVhZD1pci5zcHJlYWQsdGhpcy5heGlvc0luc3RhbmNlLmluaXQ9dGhpcy5jbGllbnRJbnN0YW5jZS5pbml0LHRoaXMuYXhpb3NJbnN0YW5jZS5lbmFibGVIYW5kbGVyPXRoaXMuY2xpZW50SW5zdGFuY2UuZW5hYmxlSGFuZGxlcix0aGlzLmF4aW9zSW5zdGFuY2UuZGlzYWJsZUhhbmRsZXI9dGhpcy5jbGllbnRJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcix0aGlzLmF4aW9zSW5zdGFuY2UuZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dD10aGlzLmNsaWVudEluc3RhbmNlLmRpc2FibGVIYW5kbGVyV2l0aFRpbWVvdXQsdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayksdGhpcy5heGlvc0luc3RhbmNlfX1dKSxlfSgpO29yLkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQ9MWUzLG9yPWFyPWZ1bmN0aW9uKGUsdCxyLGEpe3ZhciBpLG89YXJndW1lbnRzLmxlbmd0aCxzPW88Mz90Om51bGw9PT1hP2E9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LHIpOmE7aWYoIm9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0PyJ1bmRlZmluZWQiOm4oUmVmbGVjdCkpJiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlzPVJlZmxlY3QuZGVjb3JhdGUoZSx0LHIsYSk7ZWxzZSBmb3IodmFyIHU9ZS5sZW5ndGgtMTt1Pj0wO3UtLSkoaT1lW3VdKSYmKHM9KG88Mz9pKHMpOm8+Mz9pKHQscixzKTppKHQscikpfHxzKTtyZXR1cm4gbz4zJiZzJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLHMpLHN9KFtmdW5jdGlvbihlKXt9XSxvcik7dmFyIHNyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe28odGhpcyxlKSx0aGlzLl9kYXRhPW5ldyBNYXB9cmV0dXJuIHUoZSxbe2tleToic2V0RGF0YSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG4oKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnRoaXMuX2RhdGEuc2V0KGUsdCk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksbix0aGlzKX0pKSl9fSx7a2V5OiJnZXREYXRhIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gYSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIuYWJydXB0KCJyZXR1cm4iLG51bGwhPT0obj1udWxsPT09KHQ9dGhpcy5fZGF0YSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuZ2V0KGUpKSYmdm9pZCAwIT09bj9uOiJ7fSIpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGEsdGhpcyl9KSkpfX0se2tleToicmVtb3ZlRGF0YSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDp0aGlzLl9kYXRhLmRlbGV0ZShlKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19XSksZX0oKSx1cj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtvKHRoaXMsZSl9cmV0dXJuIHUoZSxudWxsLFt7a2V5OiJnZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm57YmxvYjoobnVsbD09ZT92b2lkIDA6ZS5kYXRhKWluc3RhbmNlb2YgQmxvYj9udWxsPT1lP3ZvaWQgMDplLmRhdGE6bnVsbCxkYXRhOkpTT04uc3RyaW5naWZ5KG51bGwhPWU/ZToiIiksc3VjY2VzczohMH19fSx7a2V5OiJnZW5lcmF0ZUZhaWx1cmVNZXNzYWdlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4obnVsbD09ZT92b2lkIDA6ZS50b0pTT04pJiZkZWxldGUgZS50b0pTT04se2Vycm9yOkpTT04uc3RyaW5naWZ5KG51bGwhPWU/ZToiIiksc3VjY2VzczohMX19fV0pLGV9KCksY3I9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7byh0aGlzLGUpfXJldHVybiB1KGUsbnVsbCxbe2tleToicmVtb3ZlQXV0aG9yaXphdGlvbkNvZGUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9bG9jYXRpb24uaHJlZjtoaXN0b3J5LnB1c2hTdGF0ZSh7fSxkb2N1bWVudC50aXRsZSxlLnJlcGxhY2UoL1w/Y29kZT0uKiQvLCIiKSl9fSx7a2V5OiJnZXRQS0NFIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gbnVsbCE9PSh0PXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oZSkpJiZ2b2lkIDAhPT10P3Q6IiJ9fSx7a2V5OiJzZXRQS0NFIix2YWx1ZTpmdW5jdGlvbihlLHQpe3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oZSx0KX19LHtrZXk6InNldFNpZ25PdXRVUkwiLHZhbHVlOmZ1bmN0aW9uKGUpe3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oRCxlKX19LHtrZXk6ImdldFNpZ25PdXRVUkwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIG51bGwhPT0oZT1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKEQpKSYmdm9pZCAwIT09ZT9lOiIifX0se2tleToicmVtb3ZlUEtDRSIsdmFsdWU6ZnVuY3Rpb24oZSl7c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShlKX19LHtrZXk6ImNhbkNvbnRpbnVlU2lnbkluIix2YWx1ZTpmdW5jdGlvbih0LHIpe3JldHVybiEodCYmIWUuaGFzRXJyb3JJblVSTCgpJiYhZS5oYXNBdXRoU2VhcmNoUGFyYW1zSW5VUkwoKSYmIXIpfX0se2tleToiaXNJbml0aWFsaXplZFNpbGVudFNpZ25JbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5pc1NpbGVudFN0YXRlUHJlc2VudEluVVJMKCl9fSx7a2V5OiJ3YXNTaWduSW5DYWxsZWQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuISghZS5oYXNFcnJvckluVVJMKCkmJiFlLmhhc0F1dGhTZWFyY2hQYXJhbXNJblVSTCgpfHx0aGlzLmlzU2lsZW50U3RhdGVQcmVzZW50SW5VUkwoKSl9fSx7a2V5OiJ3YXNTaWxlbnRTaWduSW5DYWxsZWQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiaW5pdGlhbGl6ZWQtc2lsZW50LXNpZ24taW4iKSx0PWU/SlNPTi5wYXJzZShlKTpudWxsO3JldHVybiBCb29sZWFuKHQpfX0se2tleToiaXNTaWduT3V0U3VjY2Vzc2Z1bCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXt2YXIgdDtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOmlmKCFKLmlzU2lnbk91dFN1Y2Nlc3NmdWwod2luZG93LmxvY2F0aW9uLmhyZWYpKXtlLm5leHQ9NjticmVha31yZXR1cm4gdD13aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgiPyIpWzBdLGhpc3RvcnkucHVzaFN0YXRlKHt9LGRvY3VtZW50LnRpdGxlLHQpLGUubmV4dD01LEouY2xlYXJVc2VyU2Vzc2lvbkRhdGEoKTtjYXNlIDU6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLCEwKTtjYXNlIDY6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLCExKTtjYXNlIDc6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSl9fSx7a2V5OiJkaWRTaWduT3V0RmFpbCIsdmFsdWU6ZnVuY3Rpb24oKXtpZihKLmRpZFNpZ25PdXRGYWlsKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSl7dmFyIGU9bmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZiksdD1lLnNlYXJjaFBhcmFtcy5nZXQoVykscj1lLnNlYXJjaFBhcmFtcy5nZXQoeiksbj13aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgiPyIpWzBdO3JldHVybiBoaXN0b3J5LnB1c2hTdGF0ZSh7fSxkb2N1bWVudC50aXRsZSxuKSx7ZGVzY3JpcHRpb246bnVsbCE9cj9yOiIiLGVycm9yOm51bGwhPXQ/dDoiIn19cmV0dXJuITF9fSx7a2V5OiJpc1NpbGVudFN0YXRlUHJlc2VudEluVVJMIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLHQ9bmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKTtyZXR1cm4gbnVsbCE9PShlPW51bGw9PXQ/dm9pZCAwOnQuaW5jbHVkZXMoInNpZ24taW4tc2lsZW50bHkiKSkmJnZvaWQgMCE9PWUmJmV9fSx7a2V5OiJoYXNBdXRoU2VhcmNoUGFyYW1zSW5VUkwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOndpbmRvdy5sb2NhdGlvbi5zZWFyY2gsdD0vWz8mXWNvZGU9W14mXSsvO3JldHVybiB0LnRlc3QoZSl9fSx7a2V5OiJoYXNFcnJvckluVVJMIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp3aW5kb3cubG9jYXRpb24uaHJlZix0PW5ldyBVUkwoZSk7cmV0dXJuISF0LnNlYXJjaFBhcmFtcy5nZXQoVykmJnQuc2VhcmNoUGFyYW1zLmdldChHKSE9PU99fSx7a2V5OiJjYW5TZW5kUHJvbXB0Tm9uZVJlcXVlc3QiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShGKTtyZXR1cm4hKGU/SlNPTi5wYXJzZShlKTpudWxsKX19LHtrZXk6InNldFByb21wdE5vbmVSZXF1ZXN0U2VudCIsdmFsdWU6ZnVuY3Rpb24oZSl7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShGLEpTT04uc3RyaW5naWZ5KGUpKX19LHtrZXk6IndhaXRUaWxsUGFnZVJlZGlyZWN0Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXt2YXIgbjtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiBuPW51bGwhPWU/ZTozZTMsdC5uZXh0PTMsbmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3JldHVybiBzZXRUaW1lb3V0KGUsMWUzKm4pfSkpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKX19XSksZX0oKSxmcj1bXSxscj1bXSxocj0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxwcj0hMTtmdW5jdGlvbiBkcigpe3ByPSEwO2Zvcih2YXIgZT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsdD0wLHI9ZS5sZW5ndGg7dDxyOysrdClmclt0XT1lW3RdLGxyW2UuY2hhckNvZGVBdCh0KV09dDtsclsiLSIuY2hhckNvZGVBdCgwKV09NjIsbHJbIl8iLmNoYXJDb2RlQXQoMCldPTYzfWZ1bmN0aW9uIHZyKGUsdCxyKXtmb3IodmFyIG4sYSxpPVtdLG89dDtvPHI7bys9MyluPShlW29dPDwxNikrKGVbbysxXTw8OCkrZVtvKzJdLGkucHVzaChmclsoYT1uKT4+MTgmNjNdK2ZyW2E+PjEyJjYzXStmclthPj42JjYzXStmcls2MyZhXSk7cmV0dXJuIGkuam9pbigiIil9ZnVuY3Rpb24gZ3IoZSl7dmFyIHQ7cHJ8fGRyKCk7Zm9yKHZhciByPWUubGVuZ3RoLG49ciUzLGE9IiIsaT1bXSxvPTE2MzgzLHM9MCx1PXItbjtzPHU7cys9bylpLnB1c2godnIoZSxzLHMrbz51P3U6cytvKSk7cmV0dXJuIDE9PT1uPyh0PWVbci0xXSxhKz1mclt0Pj4yXSxhKz1mclt0PDw0JjYzXSxhKz0iPT0iKToyPT09biYmKHQ9KGVbci0yXTw8OCkrZVtyLTFdLGErPWZyW3Q+PjEwXSxhKz1mclt0Pj40JjYzXSxhKz1mclt0PDwyJjYzXSxhKz0iPSIpLGkucHVzaChhKSxpLmpvaW4oIiIpfWZ1bmN0aW9uIHlyKGUsdCxyLG4sYSl7dmFyIGksbyxzPTgqYS1uLTEsdT0oMTw8cyktMSxjPXU+PjEsZj0tNyxsPXI/YS0xOjAsaD1yPy0xOjEscD1lW3QrbF07Zm9yKGwrPWgsaT1wJigxPDwtZiktMSxwPj49LWYsZis9cztmPjA7aT0yNTYqaStlW3QrbF0sbCs9aCxmLT04KTtmb3Iobz1pJigxPDwtZiktMSxpPj49LWYsZis9bjtmPjA7bz0yNTYqbytlW3QrbF0sbCs9aCxmLT04KTtpZigwPT09aSlpPTEtYztlbHNle2lmKGk9PT11KXJldHVybiBvP05hTjoxLzAqKHA/LTE6MSk7bys9TWF0aC5wb3coMixuKSxpLT1jfXJldHVybihwPy0xOjEpKm8qTWF0aC5wb3coMixpLW4pfWZ1bmN0aW9uIG1yKGUsdCxyLG4sYSxpKXt2YXIgbyxzLHUsYz04KmktYS0xLGY9KDE8PGMpLTEsbD1mPj4xLGg9MjM9PT1hP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxwPW4/MDppLTEsZD1uPzE6LTEsdj10PDB8fDA9PT10JiYxL3Q8MD8xOjA7Zm9yKHQ9TWF0aC5hYnModCksaXNOYU4odCl8fHQ9PT0xLzA/KHM9aXNOYU4odCk/MTowLG89Zik6KG89TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksdCoodT1NYXRoLnBvdygyLC1vKSk8MSYmKG8tLSx1Kj0yKSwodCs9bytsPj0xP2gvdTpoKk1hdGgucG93KDIsMS1sKSkqdT49MiYmKG8rKyx1Lz0yKSxvK2w+PWY/KHM9MCxvPWYpOm8rbD49MT8ocz0odCp1LTEpKk1hdGgucG93KDIsYSksbys9bCk6KHM9dCpNYXRoLnBvdygyLGwtMSkqTWF0aC5wb3coMixhKSxvPTApKTthPj04O2VbcitwXT0yNTUmcyxwKz1kLHMvPTI1NixhLT04KTtmb3Iobz1vPDxhfHMsYys9YTtjPjA7ZVtyK3BdPTI1NSZvLHArPWQsby89MjU2LGMtPTgpO2VbcitwLWRdfD0xMjgqdn12YXIgd3I9e30udG9TdHJpbmcsYnI9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09d3IuY2FsbChlKX07U3IuVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDA9PT15ZS5UWVBFRF9BUlJBWV9TVVBQT1JUfHx5ZS5UWVBFRF9BUlJBWV9TVVBQT1JUO3ZhciBrcj14cigpO2Z1bmN0aW9uIHhyKCl7cmV0dXJuIFNyLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIF9yKGUsdCl7aWYoeHIoKTx0KXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiBTci5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189U3IucHJvdG90eXBlOihudWxsPT09ZSYmKGU9bmV3IFNyKHQpKSxlLmxlbmd0aD10KSxlfWZ1bmN0aW9uIFNyKGUsdCxyKXtpZighKFNyLlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiBTcikpcmV0dXJuIG5ldyBTcihlLHQscik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBBcih0aGlzLGUpfXJldHVybiBFcih0aGlzLGUsdCxyKX1mdW5jdGlvbiBFcihlLHQscixuKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQscixuKXtpZih0LmJ5dGVMZW5ndGgscjwwfHx0LmJ5dGVMZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxyKyhufHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3Q9dm9pZCAwPT09ciYmdm9pZCAwPT09bj9uZXcgVWludDhBcnJheSh0KTp2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KHQscik6bmV3IFVpbnQ4QXJyYXkodCxyLG4pO1NyLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9dCkuX19wcm90b19fPVNyLnByb3RvdHlwZTplPVJyKGUsdCk7cmV0dXJuIGV9KGUsdCxyLG4pOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQscil7InN0cmluZyI9PXR5cGVvZiByJiYiIiE9PXJ8fChyPSJ1dGY4Iik7aWYoIVNyLmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIG49MHxEcih0LHIpLGE9KGU9X3IoZSxuKSkud3JpdGUodCxyKTthIT09biYmKGU9ZS5zbGljZSgwLGEpKTtyZXR1cm4gZX0oZSx0LHIpOmZ1bmN0aW9uKGUsdCl7aWYoUHIodCkpe3ZhciByPTB8Q3IodC5sZW5ndGgpO3JldHVybiAwPT09KGU9X3IoZSxyKSkubGVuZ3RofHx0LmNvcHkoZSwwLDAsciksZX1pZih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIHQpcmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8KG49dC5sZW5ndGgpIT1uP19yKGUsMCk6UnIoZSx0KTtpZigiQnVmZmVyIj09PXQudHlwZSYmYnIodC5kYXRhKSlyZXR1cm4gUnIoZSx0LmRhdGEpfXZhciBuO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0oZSx0KX1mdW5jdGlvbiBUcihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIEFyKGUsdCl7aWYoVHIodCksZT1fcihlLHQ8MD8wOjB8Q3IodCkpLCFTci5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgcj0wO3I8dDsrK3IpZVtyXT0wO3JldHVybiBlfWZ1bmN0aW9uIFJyKGUsdCl7dmFyIHI9dC5sZW5ndGg8MD8wOjB8Q3IodC5sZW5ndGgpO2U9X3IoZSxyKTtmb3IodmFyIG49MDtuPHI7bis9MSllW25dPTI1NSZ0W25dO3JldHVybiBlfWZ1bmN0aW9uIENyKGUpe2lmKGU+PXhyKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK3hyKCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHxlfWZ1bmN0aW9uIFByKGUpe3JldHVybiEobnVsbD09ZXx8IWUuX2lzQnVmZmVyKX1mdW5jdGlvbiBEcihlLHQpe2lmKFByKGUpKXJldHVybiBlLmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpfHxlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiBlLmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiBlJiYoZT0iIitlKTt2YXIgcj1lLmxlbmd0aDtpZigwPT09cilyZXR1cm4gMDtmb3IodmFyIG49ITE7Oylzd2l0Y2godCl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gcjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBhbihlKS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKnI7Y2FzZSJoZXgiOnJldHVybiByPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIG9uKGUpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuIGFuKGUpLmxlbmd0aDt0PSgiIit0KS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIE9yKGUsdCxyKXt2YXIgbj0hMTtpZigodm9pZCAwPT09dHx8dDwwKSYmKHQ9MCksdD50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09cnx8cj50aGlzLmxlbmd0aCkmJihyPXRoaXMubGVuZ3RoKSxyPD0wKXJldHVybiIiO2lmKChyPj4+PTApPD0odD4+Pj0wKSlyZXR1cm4iIjtmb3IoZXx8KGU9InV0ZjgiKTs7KXN3aXRjaChlKXtjYXNlImhleCI6cmV0dXJuIFlyKHRoaXMsdCxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBCcih0aGlzLHQscik7Y2FzZSJhc2NpaSI6cmV0dXJuIFdyKHRoaXMsdCxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiB6cih0aGlzLHQscik7Y2FzZSJiYXNlNjQiOnJldHVybiBKcih0aGlzLHQscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBHcih0aGlzLHQscik7ZGVmYXVsdDppZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrZSk7ZT0oZSsiIikudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBJcihlLHQscil7dmFyIG49ZVt0XTtlW3RdPWVbcl0sZVtyXT1ufWZ1bmN0aW9uIExyKGUsdCxyLG4sYSl7aWYoMD09PWUubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygcj8obj1yLHI9MCk6cj4yMTQ3NDgzNjQ3P3I9MjE0NzQ4MzY0NzpyPC0yMTQ3NDgzNjQ4JiYocj0tMjE0NzQ4MzY0OCkscj0rcixpc05hTihyKSYmKHI9YT8wOmUubGVuZ3RoLTEpLHI8MCYmKHI9ZS5sZW5ndGgrcikscj49ZS5sZW5ndGgpe2lmKGEpcmV0dXJuLTE7cj1lLmxlbmd0aC0xfWVsc2UgaWYocjwwKXtpZighYSlyZXR1cm4tMTtyPTB9aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD1Tci5mcm9tKHQsbikpLFByKHQpKXJldHVybiAwPT09dC5sZW5ndGg/LTE6VXIoZSx0LHIsbixhKTtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQmPTI1NSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9hP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChlLHQscik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChlLHQscik6VXIoZSxbdF0scixuLGEpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIFVyKGUsdCxyLG4sYSl7dmFyIGksbz0xLHM9ZS5sZW5ndGgsdT10Lmxlbmd0aDtpZih2b2lkIDAhPT1uJiYoInVjczIiPT09KG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09bnx8InV0ZjE2bGUiPT09bnx8InV0Zi0xNmxlIj09PW4pKXtpZihlLmxlbmd0aDwyfHx0Lmxlbmd0aDwyKXJldHVybi0xO289MixzLz0yLHUvPTIsci89Mn1mdW5jdGlvbiBjKGUsdCl7cmV0dXJuIDE9PT1vP2VbdF06ZS5yZWFkVUludDE2QkUodCpvKX1pZihhKXt2YXIgZj0tMTtmb3IoaT1yO2k8cztpKyspaWYoYyhlLGkpPT09Yyh0LC0xPT09Zj8wOmktZikpe2lmKC0xPT09ZiYmKGY9aSksaS1mKzE9PT11KXJldHVybiBmKm99ZWxzZS0xIT09ZiYmKGktPWktZiksZj0tMX1lbHNlIGZvcihyK3U+cyYmKHI9cy11KSxpPXI7aT49MDtpLS0pe2Zvcih2YXIgbD0hMCxoPTA7aDx1O2grKylpZihjKGUsaStoKSE9PWModCxoKSl7bD0hMTticmVha31pZihsKXJldHVybiBpfXJldHVybi0xfWZ1bmN0aW9uIEhyKGUsdCxyLG4pe3I9TnVtYmVyKHIpfHwwO3ZhciBhPWUubGVuZ3RoLXI7bj8obj1OdW1iZXIobikpPmEmJihuPWEpOm49YTt2YXIgaT10Lmxlbmd0aDtpZihpJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7bj5pLzImJihuPWkvMik7Zm9yKHZhciBvPTA7bzxuOysrbyl7dmFyIHM9cGFyc2VJbnQodC5zdWJzdHIoMipvLDIpLDE2KTtpZihpc05hTihzKSlyZXR1cm4gbztlW3Irb109c31yZXR1cm4gb31mdW5jdGlvbiBNcihlLHQscixuKXtyZXR1cm4gc24oYW4odCxlLmxlbmd0aC1yKSxlLHIsbil9ZnVuY3Rpb24ganIoZSx0LHIsbil7cmV0dXJuIHNuKGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxyPTA7cjxlLmxlbmd0aDsrK3IpdC5wdXNoKDI1NSZlLmNoYXJDb2RlQXQocikpO3JldHVybiB0fSh0KSxlLHIsbil9ZnVuY3Rpb24gTnIoZSx0LHIsbil7cmV0dXJuIGpyKGUsdCxyLG4pfWZ1bmN0aW9uIHFyKGUsdCxyLG4pe3JldHVybiBzbihvbih0KSxlLHIsbil9ZnVuY3Rpb24gS3IoZSx0LHIsbil7cmV0dXJuIHNuKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByLG4sYSxpPVtdLG89MDtvPGUubGVuZ3RoJiYhKCh0LT0yKTwwKTsrK28pbj0ocj1lLmNoYXJDb2RlQXQobykpPj44LGE9ciUyNTYsaS5wdXNoKGEpLGkucHVzaChuKTtyZXR1cm4gaX0odCxlLmxlbmd0aC1yKSxlLHIsbil9ZnVuY3Rpb24gSnIoZSx0LHIpe3JldHVybiAwPT09dCYmcj09PWUubGVuZ3RoP2dyKGUpOmdyKGUuc2xpY2UodCxyKSl9ZnVuY3Rpb24gQnIoZSx0LHIpe3I9TWF0aC5taW4oZS5sZW5ndGgscik7Zm9yKHZhciBuPVtdLGE9dDthPHI7KXt2YXIgaSxvLHMsdSxjPWVbYV0sZj1udWxsLGw9Yz4yMzk/NDpjPjIyMz8zOmM+MTkxPzI6MTtpZihhK2w8PXIpc3dpdGNoKGwpe2Nhc2UgMTpjPDEyOCYmKGY9Yyk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYoaT1lW2ErMV0pKSYmKHU9KDMxJmMpPDw2fDYzJmkpPjEyNyYmKGY9dSk7YnJlYWs7Y2FzZSAzOmk9ZVthKzFdLG89ZVthKzJdLDEyOD09KDE5MiZpKSYmMTI4PT0oMTkyJm8pJiYodT0oMTUmYyk8PDEyfCg2MyZpKTw8Nnw2MyZvKT4yMDQ3JiYodTw1NTI5Nnx8dT41NzM0MykmJihmPXUpO2JyZWFrO2Nhc2UgNDppPWVbYSsxXSxvPWVbYSsyXSxzPWVbYSszXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYodT0oMTUmYyk8PDE4fCg2MyZpKTw8MTJ8KDYzJm8pPDw2fDYzJnMpPjY1NTM1JiZ1PDExMTQxMTImJihmPXUpfW51bGw9PT1mPyhmPTY1NTMzLGw9MSk6Zj42NTUzNSYmKGYtPTY1NTM2LG4ucHVzaChmPj4+MTAmMTAyM3w1NTI5NiksZj01NjMyMHwxMDIzJmYpLG4ucHVzaChmKSxhKz1sfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtpZih0PD1GcilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZSk7dmFyIHI9IiIsbj0wO2Zvcig7bjx0OylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlLnNsaWNlKG4sbis9RnIpKTtyZXR1cm4gcn0obil9U3IucG9vbFNpemU9ODE5MixTci5fYXVnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX189U3IucHJvdG90eXBlLGV9LFNyLmZyb209ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBFcihudWxsLGUsdCxyKX0sU3IuVFlQRURfQVJSQVlfU1VQUE9SVCYmKFNyLnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsU3IuX19wcm90b19fPVVpbnQ4QXJyYXkpLFNyLmFsbG9jPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIFRyKHQpLHQ8PTA/X3IoZSx0KTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj9fcihlLHQpLmZpbGwocixuKTpfcihlLHQpLmZpbGwocik6X3IoZSx0KX0obnVsbCxlLHQscil9LFNyLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe3JldHVybiBBcihudWxsLGUpfSxTci5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIEFyKG51bGwsZSl9LFNyLmlzQnVmZmVyPXVuLFNyLmNvbXBhcmU9ZnVuY3Rpb24oZSx0KXtpZighUHIoZSl8fCFQcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYoZT09PXQpcmV0dXJuIDA7Zm9yKHZhciByPWUubGVuZ3RoLG49dC5sZW5ndGgsYT0wLGk9TWF0aC5taW4ocixuKTthPGk7KythKWlmKGVbYV0hPT10W2FdKXtyPWVbYV0sbj10W2FdO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0sU3IuaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sU3IuY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIWJyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIFNyLmFsbG9jKDApO3ZhciByO2lmKHZvaWQgMD09PXQpZm9yKHQ9MCxyPTA7cjxlLmxlbmd0aDsrK3IpdCs9ZVtyXS5sZW5ndGg7dmFyIG49U3IuYWxsb2NVbnNhZmUodCksYT0wO2ZvcihyPTA7cjxlLmxlbmd0aDsrK3Ipe3ZhciBpPWVbcl07aWYoIVByKGkpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpLmNvcHkobixhKSxhKz1pLmxlbmd0aH1yZXR1cm4gbn0sU3IuYnl0ZUxlbmd0aD1EcixTci5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLFNyLnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTIpSXIodGhpcyx0LHQrMSk7cmV0dXJuIHRoaXN9LFNyLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTQpSXIodGhpcyx0LHQrMyksSXIodGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc30sU3IucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9OClJcih0aGlzLHQsdCs3KSxJcih0aGlzLHQrMSx0KzYpLElyKHRoaXMsdCsyLHQrNSksSXIodGhpcyx0KzMsdCs0KTtyZXR1cm4gdGhpc30sU3IucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PWU/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/QnIodGhpcywwLGUpOk9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sU3IucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighUHIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09ZXx8MD09PVNyLmNvbXBhcmUodGhpcyxlKX0sU3IucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgZT0iIjtyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKGU9dGhpcy50b1N0cmluZygiaGV4IiwwLDUwKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+NTAmJihlKz0iIC4uLiAiKSksIjxCdWZmZXIgIitlKyI+In0sU3IucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LHIsbixhKXtpZighUHIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PXImJihyPWU/ZS5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09YSYmKGE9dGhpcy5sZW5ndGgpLHQ8MHx8cj5lLmxlbmd0aHx8bjwwfHxhPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1hJiZ0Pj1yKXJldHVybiAwO2lmKG4+PWEpcmV0dXJuLTE7aWYodD49cilyZXR1cm4gMTtpZih0aGlzPT09ZSlyZXR1cm4gMDtmb3IodmFyIGk9KGE+Pj49MCktKG4+Pj49MCksbz0ocj4+Pj0wKS0odD4+Pj0wKSxzPU1hdGgubWluKGksbyksdT10aGlzLnNsaWNlKG4sYSksYz1lLnNsaWNlKHQsciksZj0wO2Y8czsrK2YpaWYodVtmXSE9PWNbZl0pe2k9dVtmXSxvPWNbZl07YnJlYWt9cmV0dXJuIGk8bz8tMTpvPGk/MTowfSxTci5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24oZSx0LHIpe3JldHVybi0xIT09dGhpcy5pbmRleE9mKGUsdCxyKX0sU3IucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBMcih0aGlzLGUsdCxyLCEwKX0sU3IucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gTHIodGhpcyxlLHQsciwhMSl9LFNyLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQscixuKXtpZih2b2lkIDA9PT10KW49InV0ZjgiLHI9dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYodm9pZCAwPT09ciYmInN0cmluZyI9PXR5cGVvZiB0KW49dCxyPXRoaXMubGVuZ3RoLHQ9MDtlbHNle2lmKCFpc0Zpbml0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7dHw9MCxpc0Zpbml0ZShyKT8ocnw9MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgYT10aGlzLmxlbmd0aC10O2lmKCh2b2lkIDA9PT1yfHxyPmEpJiYocj1hKSxlLmxlbmd0aD4wJiYocjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBpPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gSHIodGhpcyxlLHQscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gTXIodGhpcyxlLHQscik7Y2FzZSJhc2NpaSI6cmV0dXJuIGpyKHRoaXMsZSx0LHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIE5yKHRoaXMsZSx0LHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gcXIodGhpcyxlLHQscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBLcih0aGlzLGUsdCxyKTtkZWZhdWx0OmlmKGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLGk9ITB9fSxTci5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgRnI9NDA5NjtmdW5jdGlvbiBXcihlLHQscil7dmFyIG49IiI7cj1NYXRoLm1pbihlLmxlbmd0aCxyKTtmb3IodmFyIGE9dDthPHI7KythKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JmVbYV0pO3JldHVybiBufWZ1bmN0aW9uIHpyKGUsdCxyKXt2YXIgbj0iIjtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgYT10O2E8cjsrK2Epbis9U3RyaW5nLmZyb21DaGFyQ29kZShlW2FdKTtyZXR1cm4gbn1mdW5jdGlvbiBZcihlLHQscil7dmFyIG49ZS5sZW5ndGg7KCF0fHx0PDApJiYodD0wKSwoIXJ8fHI8MHx8cj5uKSYmKHI9bik7Zm9yKHZhciBhPSIiLGk9dDtpPHI7KytpKWErPW5uKGVbaV0pO3JldHVybiBhfWZ1bmN0aW9uIEdyKGUsdCxyKXtmb3IodmFyIG49ZS5zbGljZSh0LHIpLGE9IiIsaT0wO2k8bi5sZW5ndGg7aSs9MilhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG5baV0rMjU2Km5baSsxXSk7cmV0dXJuIGF9ZnVuY3Rpb24gVnIoZSx0LHIpe2lmKGUlMSE9MHx8ZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZihlK3Q+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIFhyKGUsdCxyLG4sYSxpKXtpZighUHIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKHQ+YXx8dDxpKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihyK24+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uICRyKGUsdCxyLG4pe3Q8MCYmKHQ9NjU1MzUrdCsxKTtmb3IodmFyIGE9MCxpPU1hdGgubWluKGUubGVuZ3RoLXIsMik7YTxpOysrYSllW3IrYV09KHQmMjU1PDw4KihuP2E6MS1hKSk+Pj44KihuP2E6MS1hKX1mdW5jdGlvbiBacihlLHQscixuKXt0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKTtmb3IodmFyIGE9MCxpPU1hdGgubWluKGUubGVuZ3RoLXIsNCk7YTxpOysrYSllW3IrYV09dD4+PjgqKG4/YTozLWEpJjI1NX1mdW5jdGlvbiBRcihlLHQscixuLGEsaSl7aWYocituPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIGVuKGUsdCxyLG4sYSl7cmV0dXJuIGF8fFFyKGUsMCxyLDQpLG1yKGUsdCxyLG4sMjMsNCkscis0fWZ1bmN0aW9uIHRuKGUsdCxyLG4sYSl7cmV0dXJuIGF8fFFyKGUsMCxyLDgpLG1yKGUsdCxyLG4sNTIsOCkscis4fVNyLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe3ZhciByLG49dGhpcy5sZW5ndGg7aWYoKGU9fn5lKTwwPyhlKz1uKTwwJiYoZT0wKTplPm4mJihlPW4pLCh0PXZvaWQgMD09PXQ/bjp+fnQpPDA/KHQrPW4pPDAmJih0PTApOnQ+biYmKHQ9biksdDxlJiYodD1lKSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUKShyPXRoaXMuc3ViYXJyYXkoZSx0KSkuX19wcm90b19fPVNyLnByb3RvdHlwZTtlbHNle3ZhciBhPXQtZTtyPW5ldyBTcihhLHZvaWQgMCk7Zm9yKHZhciBpPTA7aTxhOysraSlyW2ldPXRoaXNbaStlXX1yZXR1cm4gcn0sU3IucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxWcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW2VdLGE9MSxpPTA7KytpPHQmJihhKj0yNTYpOyluKz10aGlzW2UraV0qYTtyZXR1cm4gbn0sU3IucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxWcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW2UrLS10XSxhPTE7dD4wJiYoYSo9MjU2KTspbis9dGhpc1tlKy0tdF0qYTtyZXR1cm4gbn0sU3IucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxWcihlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV19LFNyLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8VnIoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OH0sU3IucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxWcihlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDh8dGhpc1tlKzFdfSxTci5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFZyKGUsNCx0aGlzLmxlbmd0aCksKHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbZSszXX0sU3IucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxWcihlLDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbZV0rKHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXSl9LFNyLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxWcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW2VdLGE9MSxpPTA7KytpPHQmJihhKj0yNTYpOyluKz10aGlzW2UraV0qYTtyZXR1cm4gbj49KGEqPTEyOCkmJihuLT1NYXRoLnBvdygyLDgqdCkpLG59LFNyLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxWcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10LGE9MSxpPXRoaXNbZSstLW5dO24+MCYmKGEqPTI1Nik7KWkrPXRoaXNbZSstLW5dKmE7cmV0dXJuIGk+PShhKj0xMjgpJiYoaS09TWF0aC5wb3coMiw4KnQpKSxpfSxTci5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8VnIoZSwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1tlXT8tMSooMjU1LXRoaXNbZV0rMSk6dGhpc1tlXX0sU3IucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7dHx8VnIoZSwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW2VdfHRoaXNbZSsxXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sU3IucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7dHx8VnIoZSwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW2UrMV18dGhpc1tlXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sU3IucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFZyKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNnx0aGlzW2UrM108PDI0fSxTci5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8VnIoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdPDwyNHx0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM119LFNyLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxWcihlLDQsdGhpcy5sZW5ndGgpLHlyKHRoaXMsZSwhMCwyMyw0KX0sU3IucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFZyKGUsNCx0aGlzLmxlbmd0aCkseXIodGhpcyxlLCExLDIzLDQpfSxTci5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFZyKGUsOCx0aGlzLmxlbmd0aCkseXIodGhpcyxlLCEwLDUyLDgpfSxTci5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFZyKGUsOCx0aGlzLmxlbmd0aCkseXIodGhpcyxlLCExLDUyLDgpfSxTci5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24oZSx0LHIsbil7KGU9K2UsdHw9MCxyfD0wLG4pfHxYcih0aGlzLGUsdCxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBhPTEsaT0wO2Zvcih0aGlzW3RdPTI1NSZlOysraTxyJiYoYSo9MjU2KTspdGhpc1t0K2ldPWUvYSYyNTU7cmV0dXJuIHQrcn0sU3IucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKGUsdCxyLG4peyhlPStlLHR8PTAscnw9MCxuKXx8WHIodGhpcyxlLHQscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgYT1yLTEsaT0xO2Zvcih0aGlzW3QrYV09MjU1JmU7LS1hPj0wJiYoaSo9MjU2KTspdGhpc1t0K2FdPWUvaSYyNTU7cmV0dXJuIHQrcn0sU3IucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8WHIodGhpcyxlLHQsMSwyNTUsMCksU3IuVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksdGhpc1t0XT0yNTUmZSx0KzF9LFNyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fFhyKHRoaXMsZSx0LDIsNjU1MzUsMCksU3IuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgpOiRyKHRoaXMsZSx0LCEwKSx0KzJ9LFNyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fFhyKHRoaXMsZSx0LDIsNjU1MzUsMCksU3IuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOiRyKHRoaXMsZSx0LCExKSx0KzJ9LFNyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fFhyKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3QrM109ZT4+PjI0LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdF09MjU1JmUpOlpyKHRoaXMsZSx0LCEwKSx0KzR9LFNyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fFhyKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOlpyKHRoaXMsZSx0LCExKSx0KzR9LFNyLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKGU9K2UsdHw9MCwhbil7dmFyIGE9TWF0aC5wb3coMiw4KnItMSk7WHIodGhpcyxlLHQscixhLTEsLWEpfXZhciBpPTAsbz0xLHM9MDtmb3IodGhpc1t0XT0yNTUmZTsrK2k8ciYmKG8qPTI1Nik7KWU8MCYmMD09PXMmJjAhPT10aGlzW3QraS0xXSYmKHM9MSksdGhpc1t0K2ldPShlL28+PjApLXMmMjU1O3JldHVybiB0K3J9LFNyLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKGU9K2UsdHw9MCwhbil7dmFyIGE9TWF0aC5wb3coMiw4KnItMSk7WHIodGhpcyxlLHQscixhLTEsLWEpfXZhciBpPXItMSxvPTEscz0wO2Zvcih0aGlzW3QraV09MjU1JmU7LS1pPj0wJiYobyo9MjU2KTspZTwwJiYwPT09cyYmMCE9PXRoaXNbdCtpKzFdJiYocz0xKSx0aGlzW3QraV09KGUvbz4+MCktcyYyNTU7cmV0dXJuIHQrcn0sU3IucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxYcih0aGlzLGUsdCwxLDEyNywtMTI4KSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSxlPDAmJihlPTI1NStlKzEpLHRoaXNbdF09MjU1JmUsdCsxfSxTci5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fFhyKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6JHIodGhpcyxlLHQsITApLHQrMn0sU3IucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxYcih0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksU3IuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOiRyKHRoaXMsZSx0LCExKSx0KzJ9LFNyLnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8WHIodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOlpyKHRoaXMsZSx0LCEwKSx0KzR9LFNyLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8WHIodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOlpyKHRoaXMsZSx0LCExKSx0KzR9LFNyLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlbih0aGlzLGUsdCwhMCxyKX0sU3IucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGVuKHRoaXMsZSx0LCExLHIpfSxTci5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIHRuKHRoaXMsZSx0LCEwLHIpfSxTci5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIHRuKHRoaXMsZSx0LCExLHIpfSxTci5wcm90b3R5cGUuY29weT1mdW5jdGlvbihlLHQscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLHQ+PWUubGVuZ3RoJiYodD1lLmxlbmd0aCksdHx8KHQ9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT1lLmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLGUubGVuZ3RoLXQ8bi1yJiYobj1lLmxlbmd0aC10K3IpO3ZhciBhLGk9bi1yO2lmKHRoaXM9PT1lJiZyPHQmJnQ8bilmb3IoYT1pLTE7YT49MDstLWEpZVthK3RdPXRoaXNbYStyXTtlbHNlIGlmKGk8MWUzfHwhU3IuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoYT0wO2E8aTsrK2EpZVthK3RdPXRoaXNbYStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShyLHIraSksdCk7cmV0dXJuIGl9LFNyLnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0PyhuPXQsdD0wLHI9dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgciYmKG49cixyPXRoaXMubGVuZ3RoKSwxPT09ZS5sZW5ndGgpe3ZhciBhPWUuY2hhckNvZGVBdCgwKTthPDI1NiYmKGU9YSl9aWYodm9pZCAwIT09biYmInN0cmluZyIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIG4mJiFTci5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgZSYmKGUmPTI1NSk7aWYodDwwfHx0aGlzLmxlbmd0aDx0fHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD10KXJldHVybiB0aGlzO3ZhciBpO2lmKHQ+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsZXx8KGU9MCksIm51bWJlciI9PXR5cGVvZiBlKWZvcihpPXQ7aTxyOysraSl0aGlzW2ldPWU7ZWxzZXt2YXIgbz1QcihlKT9lOmFuKG5ldyBTcihlLG4pLnRvU3RyaW5nKCkpLHM9by5sZW5ndGg7Zm9yKGk9MDtpPHItdDsrK2kpdGhpc1tpK3RdPW9baSVzXX1yZXR1cm4gdGhpc307dmFyIHJuPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIG5uKGUpe3JldHVybiBlPDE2PyIwIitlLnRvU3RyaW5nKDE2KTplLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBhbihlLHQpe3ZhciByO3Q9dHx8MS8wO2Zvcih2YXIgbj1lLmxlbmd0aCxhPW51bGwsaT1bXSxvPTA7bzxuOysrbyl7aWYoKHI9ZS5jaGFyQ29kZUF0KG8pKT41NTI5NSYmcjw1NzM0NCl7aWYoIWEpe2lmKHI+NTYzMTkpeyh0LT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihvKzE9PT1uKXsodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9YT1yO2NvbnRpbnVlfWlmKHI8NTYzMjApeyh0LT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KSxhPXI7Y29udGludWV9cj02NTUzNisoYS01NTI5Njw8MTB8ci01NjMyMCl9ZWxzZSBhJiYodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7aWYoYT1udWxsLHI8MTI4KXtpZigodC09MSk8MClicmVhaztpLnB1c2gocil9ZWxzZSBpZihyPDIwNDgpe2lmKCh0LT0yKTwwKWJyZWFrO2kucHVzaChyPj42fDE5Miw2MyZyfDEyOCl9ZWxzZSBpZihyPDY1NTM2KXtpZigodC09Myk8MClicmVhaztpLnB1c2gocj4+MTJ8MjI0LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX1lbHNle2lmKCEocjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKCh0LT00KTwwKWJyZWFrO2kucHVzaChyPj4xOHwyNDAscj4+MTImNjN8MTI4LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX19cmV0dXJuIGl9ZnVuY3Rpb24gb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0LHIsbixhLGksbztwcnx8ZHIoKTt2YXIgcz1lLmxlbmd0aDtpZihzJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTtpPSI9Ij09PWVbcy0yXT8yOiI9Ij09PWVbcy0xXT8xOjAsbz1uZXcgaHIoMypzLzQtaSksbj1pPjA/cy00OnM7dmFyIHU9MDtmb3IodD0wLHI9MDt0PG47dCs9NCxyKz0zKWE9bHJbZS5jaGFyQ29kZUF0KHQpXTw8MTh8bHJbZS5jaGFyQ29kZUF0KHQrMSldPDwxMnxscltlLmNoYXJDb2RlQXQodCsyKV08PDZ8bHJbZS5jaGFyQ29kZUF0KHQrMyldLG9bdSsrXT1hPj4xNiYyNTUsb1t1KytdPWE+PjgmMjU1LG9bdSsrXT0yNTUmYTtyZXR1cm4gMj09PWk/KGE9bHJbZS5jaGFyQ29kZUF0KHQpXTw8MnxscltlLmNoYXJDb2RlQXQodCsxKV0+PjQsb1t1KytdPTI1NSZhKToxPT09aSYmKGE9bHJbZS5jaGFyQ29kZUF0KHQpXTw8MTB8bHJbZS5jaGFyQ29kZUF0KHQrMSldPDw0fGxyW2UuY2hhckNvZGVBdCh0KzIpXT4+MixvW3UrK109YT4+OCYyNTUsb1t1KytdPTI1NSZhKSxvfShmdW5jdGlvbihlKXtpZigoZT1mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfShlKS5yZXBsYWNlKHJuLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDtlLmxlbmd0aCU0IT0wOyllKz0iPSI7cmV0dXJuIGV9KGUpKX1mdW5jdGlvbiBzbihlLHQscixuKXtmb3IodmFyIGE9MDthPG4mJiEoYStyPj10Lmxlbmd0aHx8YT49ZS5sZW5ndGgpOysrYSl0W2Ercl09ZVthXTtyZXR1cm4gYX1mdW5jdGlvbiB1bihlKXtyZXR1cm4gbnVsbCE9ZSYmKCEhZS5faXNCdWZmZXJ8fGNuKGUpfHxmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZS5yZWFkRmxvYXRMRSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc2xpY2UmJmNuKGUuc2xpY2UoMCwwKSl9KGUpKX1mdW5jdGlvbiBjbihlKXtyZXR1cm4hIWUuY29uc3RydWN0b3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfXZhciBmbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxCdWZmZXI6U3IsSU5TUEVDVF9NQVhfQllURVM6NTAsU2xvd0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4rZSE9ZSYmKGU9MCksU3IuYWxsb2MoK2UpfSxpc0J1ZmZlcjp1bixrTWF4TGVuZ3RoOmtyfSksbG49e2V4cG9ydHM6e319LGhuPXt9LHBuPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShwbiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSkscG4uZGVmYXVsdD1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aCxyPXQlNDtpZighcilyZXR1cm4gZTt2YXIgbj10LGE9NC1yLGk9dCthLG89U3IuYWxsb2MoaSk7Zm9yKG8ud3JpdGUoZSk7YS0tOylvLndyaXRlKCI9IixuKyspO3JldHVybiBvLnRvU3RyaW5nKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGRuPXBuO2Z1bmN0aW9uIHZuKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSJ1dGY4IiksU3IuaXNCdWZmZXIoZSk/eW4oZS50b1N0cmluZygiYmFzZTY0IikpOnluKFNyLmZyb20oZSx0KS50b1N0cmluZygiYmFzZTY0IikpfWZ1bmN0aW9uIGduKGUpe3JldHVybiBlPWUudG9TdHJpbmcoKSxkbi5kZWZhdWx0KGUpLnJlcGxhY2UoL1wtL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKX1mdW5jdGlvbiB5bihlKXtyZXR1cm4gZS5yZXBsYWNlKC89L2csIiIpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIil9dmFyIG1uLHduPXZuO3duLmVuY29kZT12bix3bi5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9InV0ZjgiKSxTci5mcm9tKGduKGUpLCJiYXNlNjQiKS50b1N0cmluZyh0KX0sd24udG9CYXNlNjQ9Z24sd24uZnJvbUJhc2U2ND15bix3bi50b0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4gU3IuZnJvbShnbihlKSwiYmFzZTY0Iil9LGhuLmRlZmF1bHQ9d24sKG1uPWxuKS5leHBvcnRzPWhuLmRlZmF1bHQsbW4uZXhwb3J0cy5kZWZhdWx0PW1uLmV4cG9ydHM7dmFyIGJuPWxuLmV4cG9ydHMsa249e2V4cG9ydHM6e319OyFmdW5jdGlvbihlKXshZnVuY3Rpb24odCxyKXt2YXIgbj17fTshZnVuY3Rpb24oZSl7ZS5fX2VzTW9kdWxlPSEwLGUuZGlnZXN0TGVuZ3RoPTMyLGUuYmxvY2tTaXplPTY0O3ZhciB0PW5ldyBVaW50MzJBcnJheShbMTExNjM1MjQwOCwxODk5NDQ3NDQxLDMwNDkzMjM0NzEsMzkyMTAwOTU3Myw5NjE5ODcxNjMsMTUwODk3MDk5MywyNDUzNjM1NzQ4LDI4NzA3NjMyMjEsMzYyNDM4MTA4MCwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwyMTYyMDc4MjA2LDI2MTQ4ODgxMDMsMzI0ODIyMjU4MCwzODM1MzkwNDAxLDQwMjIyMjQ3NzQsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsMjU1NDIyMDg4MiwyODIxODM0MzQ5LDI5NTI5OTY4MDgsMzIxMDMxMzY3MSwzMzM2NTcxODkxLDM1ODQ1Mjg3MTEsMTEzOTI2OTkzLDMzODI0MTg5NSw2NjYzMDcyMDUsNzczNTI5OTEyLDEyOTQ3NTczNzIsMTM5NjE4MjI5MSwxNjk1MTgzNzAwLDE5ODY2NjEwNTEsMjE3NzAyNjM1MCwyNDU2OTU2MDM3LDI3MzA0ODU5MjEsMjgyMDMwMjQxMSwzMjU5NzMwODAwLDMzNDU3NjQ3NzEsMzUxNjA2NTgxNywzNjAwMzUyODA0LDQwOTQ1NzE5MDksMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LDIyMjc3MzA0NTIsMjM2MTg1MjQyNCwyNDI4NDM2NDc0LDI3NTY3MzQxODcsMzIwNDAzMTQ3OSwzMzI5MzI1Mjk4XSk7ZnVuY3Rpb24gcihlLHIsbixhLGkpe2Zvcih2YXIgbyxzLHUsYyxmLGwsaCxwLGQsdixnLHksbTtpPj02NDspe2ZvcihvPXJbMF0scz1yWzFdLHU9clsyXSxjPXJbM10sZj1yWzRdLGw9cls1XSxoPXJbNl0scD1yWzddLHY9MDt2PDE2O3YrKylnPWErNCp2LGVbdl09KDI1NSZuW2ddKTw8MjR8KDI1NSZuW2crMV0pPDwxNnwoMjU1Jm5bZysyXSk8PDh8MjU1Jm5bZyszXTtmb3Iodj0xNjt2PDY0O3YrKyl5PSgoZD1lW3YtMl0pPj4+MTd8ZDw8MTUpXihkPj4+MTl8ZDw8MTMpXmQ+Pj4xMCxtPSgoZD1lW3YtMTVdKT4+Pjd8ZDw8MjUpXihkPj4+MTh8ZDw8MTQpXmQ+Pj4zLGVbdl09KHkrZVt2LTddfDApKyhtK2Vbdi0xNl18MCk7Zm9yKHY9MDt2PDY0O3YrKyl5PSgoKGY+Pj42fGY8PDI2KV4oZj4+PjExfGY8PDIxKV4oZj4+PjI1fGY8PDcpKSsoZiZsXn5mJmgpfDApKyhwKyh0W3ZdK2Vbdl18MCl8MCl8MCxtPSgobz4+PjJ8bzw8MzApXihvPj4+MTN8bzw8MTkpXihvPj4+MjJ8bzw8MTApKSsobyZzXm8mdV5zJnUpfDAscD1oLGg9bCxsPWYsZj1jK3l8MCxjPXUsdT1zLHM9byxvPXkrbXwwO3JbMF0rPW8sclsxXSs9cyxyWzJdKz11LHJbM10rPWMscls0XSs9ZixyWzVdKz1sLHJbNl0rPWgscls3XSs9cCxhKz02NCxpLT02NH1yZXR1cm4gYX12YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLmRpZ2VzdExlbmd0aD1lLmRpZ2VzdExlbmd0aCx0aGlzLmJsb2NrU2l6ZT1lLmJsb2NrU2l6ZSx0aGlzLnN0YXRlPW5ldyBJbnQzMkFycmF5KDgpLHRoaXMudGVtcD1uZXcgSW50MzJBcnJheSg2NCksdGhpcy5idWZmZXI9bmV3IFVpbnQ4QXJyYXkoMTI4KSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExLHRoaXMucmVzZXQoKX1yZXR1cm4gdC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0ZVswXT0xNzc5MDMzNzAzLHRoaXMuc3RhdGVbMV09MzE0NDEzNDI3Nyx0aGlzLnN0YXRlWzJdPTEwMTM5MDQyNDIsdGhpcy5zdGF0ZVszXT0yNzczNDgwNzYyLHRoaXMuc3RhdGVbNF09MTM1OTg5MzExOSx0aGlzLnN0YXRlWzVdPTI2MDA4MjI5MjQsdGhpcy5zdGF0ZVs2XT01Mjg3MzQ2MzUsdGhpcy5zdGF0ZVs3XT0xNTQxNDU5MjI1LHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITEsdGhpc30sdC5wcm90b3R5cGUuY2xlYW49ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuYnVmZmVyLmxlbmd0aDtlKyspdGhpcy5idWZmZXJbZV09MDtmb3IoZT0wO2U8dGhpcy50ZW1wLmxlbmd0aDtlKyspdGhpcy50ZW1wW2VdPTA7dGhpcy5yZXNldCgpfSx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10JiYodD1lLmxlbmd0aCksdGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIlNIQTI1NjogY2FuJ3QgdXBkYXRlIGJlY2F1c2UgaGFzaCB3YXMgZmluaXNoZWQuIik7dmFyIG49MDtpZih0aGlzLmJ5dGVzSGFzaGVkKz10LHRoaXMuYnVmZmVyTGVuZ3RoPjApe2Zvcig7dGhpcy5idWZmZXJMZW5ndGg8NjQmJnQ+MDspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK109ZVtuKytdLHQtLTs2ND09PXRoaXMuYnVmZmVyTGVuZ3RoJiYocih0aGlzLnRlbXAsdGhpcy5zdGF0ZSx0aGlzLmJ1ZmZlciwwLDY0KSx0aGlzLmJ1ZmZlckxlbmd0aD0wKX1mb3IodD49NjQmJihuPXIodGhpcy50ZW1wLHRoaXMuc3RhdGUsZSxuLHQpLHQlPTY0KTt0PjA7KXRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdPWVbbisrXSx0LS07cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbihlKXtpZighdGhpcy5maW5pc2hlZCl7dmFyIHQ9dGhpcy5ieXRlc0hhc2hlZCxuPXRoaXMuYnVmZmVyTGVuZ3RoLGE9dC81MzY4NzA5MTJ8MCxpPXQ8PDMsbz10JTY0PDU2PzY0OjEyODt0aGlzLmJ1ZmZlcltuXT0xMjg7Zm9yKHZhciBzPW4rMTtzPG8tODtzKyspdGhpcy5idWZmZXJbc109MDt0aGlzLmJ1ZmZlcltvLThdPWE+Pj4yNCYyNTUsdGhpcy5idWZmZXJbby03XT1hPj4+MTYmMjU1LHRoaXMuYnVmZmVyW28tNl09YT4+PjgmMjU1LHRoaXMuYnVmZmVyW28tNV09YT4+PjAmMjU1LHRoaXMuYnVmZmVyW28tNF09aT4+PjI0JjI1NSx0aGlzLmJ1ZmZlcltvLTNdPWk+Pj4xNiYyNTUsdGhpcy5idWZmZXJbby0yXT1pPj4+OCYyNTUsdGhpcy5idWZmZXJbby0xXT1pPj4+MCYyNTUscih0aGlzLnRlbXAsdGhpcy5zdGF0ZSx0aGlzLmJ1ZmZlciwwLG8pLHRoaXMuZmluaXNoZWQ9ITB9Zm9yKHM9MDtzPDg7cysrKWVbNCpzKzBdPXRoaXMuc3RhdGVbc10+Pj4yNCYyNTUsZVs0KnMrMV09dGhpcy5zdGF0ZVtzXT4+PjE2JjI1NSxlWzQqcysyXT10aGlzLnN0YXRlW3NdPj4+OCYyNTUsZVs0KnMrM109dGhpcy5zdGF0ZVtzXT4+PjAmMjU1O3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgVWludDhBcnJheSh0aGlzLmRpZ2VzdExlbmd0aCk7cmV0dXJuIHRoaXMuZmluaXNoKGUpLGV9LHQucHJvdG90eXBlLl9zYXZlU3RhdGU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDx0aGlzLnN0YXRlLmxlbmd0aDt0KyspZVt0XT10aGlzLnN0YXRlW3RdfSx0LnByb3RvdHlwZS5fcmVzdG9yZVN0YXRlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPTA7cjx0aGlzLnN0YXRlLmxlbmd0aDtyKyspdGhpcy5zdGF0ZVtyXT1lW3JdO3RoaXMuYnl0ZXNIYXNoZWQ9dCx0aGlzLmZpbmlzaGVkPSExLHRoaXMuYnVmZmVyTGVuZ3RoPTB9LHR9KCk7ZS5IYXNoPW47dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMuaW5uZXI9bmV3IG4sdGhpcy5vdXRlcj1uZXcgbix0aGlzLmJsb2NrU2l6ZT10aGlzLmlubmVyLmJsb2NrU2l6ZSx0aGlzLmRpZ2VzdExlbmd0aD10aGlzLmlubmVyLmRpZ2VzdExlbmd0aDt2YXIgdD1uZXcgVWludDhBcnJheSh0aGlzLmJsb2NrU2l6ZSk7aWYoZS5sZW5ndGg+dGhpcy5ibG9ja1NpemUpKG5ldyBuKS51cGRhdGUoZSkuZmluaXNoKHQpLmNsZWFuKCk7ZWxzZSBmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl0W3JdPWVbcl07Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdXj01NDt0aGlzLmlubmVyLnVwZGF0ZSh0KTtmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXRbcl1ePTEwNjt0aGlzLm91dGVyLnVwZGF0ZSh0KSx0aGlzLmlzdGF0ZT1uZXcgVWludDMyQXJyYXkoOCksdGhpcy5vc3RhdGU9bmV3IFVpbnQzMkFycmF5KDgpLHRoaXMuaW5uZXIuX3NhdmVTdGF0ZSh0aGlzLmlzdGF0ZSksdGhpcy5vdXRlci5fc2F2ZVN0YXRlKHRoaXMub3N0YXRlKTtmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXRbcl09MH1yZXR1cm4gZS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbm5lci5fcmVzdG9yZVN0YXRlKHRoaXMuaXN0YXRlLHRoaXMuaW5uZXIuYmxvY2tTaXplKSx0aGlzLm91dGVyLl9yZXN0b3JlU3RhdGUodGhpcy5vc3RhdGUsdGhpcy5vdXRlci5ibG9ja1NpemUpLHRoaXN9LGUucHJvdG90eXBlLmNsZWFuPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmlzdGF0ZS5sZW5ndGg7ZSsrKXRoaXMub3N0YXRlW2VdPXRoaXMuaXN0YXRlW2VdPTA7dGhpcy5pbm5lci5jbGVhbigpLHRoaXMub3V0ZXIuY2xlYW4oKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmlubmVyLnVwZGF0ZShlKSx0aGlzfSxlLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3V0ZXIuZmluaXNoZWQ/dGhpcy5vdXRlci5maW5pc2goZSk6KHRoaXMuaW5uZXIuZmluaXNoKGUpLHRoaXMub3V0ZXIudXBkYXRlKGUsdGhpcy5kaWdlc3RMZW5ndGgpLmZpbmlzaChlKSksdGhpc30sZS5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodGhpcy5kaWdlc3RMZW5ndGgpO3JldHVybiB0aGlzLmZpbmlzaChlKSxlfSxlfSgpO2Z1bmN0aW9uIGkoZSl7dmFyIHQ9KG5ldyBuKS51cGRhdGUoZSkscj10LmRpZ2VzdCgpO3JldHVybiB0LmNsZWFuKCkscn1mdW5jdGlvbiBvKGUsdCl7dmFyIHI9bmV3IGEoZSkudXBkYXRlKHQpLG49ci5kaWdlc3QoKTtyZXR1cm4gci5jbGVhbigpLG59ZnVuY3Rpb24gcyhlLHQscixuKXt2YXIgYT1uWzBdO2lmKDA9PT1hKXRocm93IG5ldyBFcnJvcigiaGtkZjogY2Fubm90IGV4cGFuZCBtb3JlIik7dC5yZXNldCgpLGE+MSYmdC51cGRhdGUoZSksciYmdC51cGRhdGUociksdC51cGRhdGUobiksdC5maW5pc2goZSksblswXSsrfWUuSE1BQz1hLGUuaGFzaD1pLGUuZGVmYXVsdD1pLGUuaG1hYz1vO3ZhciB1PW5ldyBVaW50OEFycmF5KGUuZGlnZXN0TGVuZ3RoKTtmdW5jdGlvbiBjKGUsdCxyLG4pe3ZvaWQgMD09PXQmJih0PXUpLHZvaWQgMD09PW4mJihuPTMyKTtmb3IodmFyIGk9bmV3IFVpbnQ4QXJyYXkoWzFdKSxjPW8odCxlKSxmPW5ldyBhKGMpLGw9bmV3IFVpbnQ4QXJyYXkoZi5kaWdlc3RMZW5ndGgpLGg9bC5sZW5ndGgscD1uZXcgVWludDhBcnJheShuKSxkPTA7ZDxuO2QrKyloPT09bC5sZW5ndGgmJihzKGwsZixyLGkpLGg9MCkscFtkXT1sW2grK107cmV0dXJuIGYuY2xlYW4oKSxsLmZpbGwoMCksaS5maWxsKDApLHB9ZnVuY3Rpb24gZihlLHQscixuKXtmb3IodmFyIGk9bmV3IGEoZSksbz1pLmRpZ2VzdExlbmd0aCxzPW5ldyBVaW50OEFycmF5KDQpLHU9bmV3IFVpbnQ4QXJyYXkobyksYz1uZXcgVWludDhBcnJheShvKSxmPW5ldyBVaW50OEFycmF5KG4pLGw9MDtsKm88bjtsKyspe3ZhciBoPWwrMTtzWzBdPWg+Pj4yNCYyNTUsc1sxXT1oPj4+MTYmMjU1LHNbMl09aD4+PjgmMjU1LHNbM109aD4+PjAmMjU1LGkucmVzZXQoKSxpLnVwZGF0ZSh0KSxpLnVwZGF0ZShzKSxpLmZpbmlzaChjKTtmb3IodmFyIHA9MDtwPG87cCsrKXVbcF09Y1twXTtmb3IocD0yO3A8PXI7cCsrKXtpLnJlc2V0KCksaS51cGRhdGUoYykuZmluaXNoKGMpO2Zvcih2YXIgZD0wO2Q8bztkKyspdVtkXV49Y1tkXX1mb3IocD0wO3A8byYmbCpvK3A8bjtwKyspZltsKm8rcF09dVtwXX1mb3IobD0wO2w8bztsKyspdVtsXT1jW2xdPTA7Zm9yKGw9MDtsPDQ7bCsrKXNbbF09MDtyZXR1cm4gaS5jbGVhbigpLGZ9ZS5oa2RmPWMsZS5wYmtkZjI9Zn0obik7dmFyIGE9bi5kZWZhdWx0O2Zvcih2YXIgaSBpbiBuKWFbaV09bltpXTtlLmV4cG9ydHM9YX0oKX0oa24pO3ZhciB4bj0kKGtuLmV4cG9ydHMpLF9uPWNyeXB0byxTbj1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIENyeXB0b0tleX0sRW49bmV3IFRleHRFbmNvZGVyLFRuPW5ldyBUZXh0RGVjb2RlcjtmdW5jdGlvbiBBbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLHI9MDtyPGU7cisrKXRbcl09YXJndW1lbnRzW3JdO3ZhciBuPXQucmVkdWNlKChmdW5jdGlvbihlLHQpe3JldHVybiBlK3QubGVuZ3RofSksMCksYT1uZXcgVWludDhBcnJheShuKSxpPTA7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24oZSl7YS5zZXQoZSxpKSxpKz1lLmxlbmd0aH0pKSxhfXZhciBSbj1mdW5jdGlvbihlKXt2YXIgdD1lO3QgaW5zdGFuY2VvZiBVaW50OEFycmF5JiYodD1Ubi5kZWNvZGUodCkpLHQ9dC5yZXBsYWNlKC8tL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKS5yZXBsYWNlKC9ccy9nLCIiKTt0cnl7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1hdG9iKGUpLHI9bmV3IFVpbnQ4QXJyYXkodC5sZW5ndGgpLG49MDtuPHQubGVuZ3RoO24rKylyW25dPXQuY2hhckNvZGVBdChuKTtyZXR1cm4gcn0odCl9Y2F0Y2goZSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGlucHV0IHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLiIpfX0sQ249ZnVuY3Rpb24oZSl7ZihyLGUpO3ZhciB0PW0ocik7ZnVuY3Rpb24gcihlKXt2YXIgbixhO3JldHVybiBvKHRoaXMsciksKG49dC5jYWxsKHRoaXMsZSkpLmNvZGU9IkVSUl9KT1NFX0dFTkVSSUMiLG4ubmFtZT1uLmNvbnN0cnVjdG9yLm5hbWUsbnVsbD09PShhPUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKXx8dm9pZCAwPT09YXx8YS5jYWxsKEVycm9yLGcobiksbi5jb25zdHJ1Y3Rvciksbn1yZXR1cm4gdShyLG51bGwsW3trZXk6ImNvZGUiLGdldDpmdW5jdGlvbigpe3JldHVybiJFUlJfSk9TRV9HRU5FUklDIn19XSkscn0odihFcnJvcikpLFBuPWZ1bmN0aW9uKGUpe2YocixlKTt2YXIgdD1tKHIpO2Z1bmN0aW9uIHIoZSl7dmFyIG4sYT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06InVuc3BlY2lmaWVkIixpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXToidW5zcGVjaWZpZWQiO3JldHVybiBvKHRoaXMsciksKG49dC5jYWxsKHRoaXMsZSkpLmNvZGU9IkVSUl9KV1RfQ0xBSU1fVkFMSURBVElPTl9GQUlMRUQiLG4uY2xhaW09YSxuLnJlYXNvbj1pLG59cmV0dXJuIHUocixudWxsLFt7a2V5OiJjb2RlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iRVJSX0pXVF9DTEFJTV9WQUxJREFUSU9OX0ZBSUxFRCJ9fV0pLHJ9KENuKSxEbj1mdW5jdGlvbihlKXtmKHIsZSk7dmFyIHQ9bShyKTtmdW5jdGlvbiByKGUpe3ZhciBuLGE9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiJ1bnNwZWNpZmllZCIsaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06InVuc3BlY2lmaWVkIjtyZXR1cm4gbyh0aGlzLHIpLChuPXQuY2FsbCh0aGlzLGUpKS5jb2RlPSJFUlJfSldUX0VYUElSRUQiLG4uY2xhaW09YSxuLnJlYXNvbj1pLG59cmV0dXJuIHUocixudWxsLFt7a2V5OiJjb2RlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iRVJSX0pXVF9FWFBJUkVEIn19XSkscn0oQ24pLE9uPWZ1bmN0aW9uKGUpe2YocixlKTt2YXIgdD1tKHIpO2Z1bmN0aW9uIHIoKXt2YXIgZTtyZXR1cm4gbyh0aGlzLHIpLChlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpKS5jb2RlPSJFUlJfSk9TRV9BTEdfTk9UX0FMTE9XRUQiLGV9cmV0dXJuIHUocixudWxsLFt7a2V5OiJjb2RlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iRVJSX0pPU0VfQUxHX05PVF9BTExPV0VEIn19XSkscn0oQ24pLEluPWZ1bmN0aW9uKGUpe2YocixlKTt2YXIgdD1tKHIpO2Z1bmN0aW9uIHIoKXt2YXIgZTtyZXR1cm4gbyh0aGlzLHIpLChlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpKS5jb2RlPSJFUlJfSk9TRV9OT1RfU1VQUE9SVEVEIixlfXJldHVybiB1KHIsbnVsbCxbe2tleToiY29kZSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIkVSUl9KT1NFX05PVF9TVVBQT1JURUQifX1dKSxyfShDbiksTG49ZnVuY3Rpb24oZSl7ZihyLGUpO3ZhciB0PW0ocik7ZnVuY3Rpb24gcigpe3ZhciBlO3JldHVybiBvKHRoaXMsciksKGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cykpLmNvZGU9IkVSUl9KV1NfSU5WQUxJRCIsZX1yZXR1cm4gdShyLG51bGwsW3trZXk6ImNvZGUiLGdldDpmdW5jdGlvbigpe3JldHVybiJFUlJfSldTX0lOVkFMSUQifX1dKSxyfShDbiksVW49ZnVuY3Rpb24oZSl7ZihyLGUpO3ZhciB0PW0ocik7ZnVuY3Rpb24gcigpe3ZhciBlO3JldHVybiBvKHRoaXMsciksKGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cykpLmNvZGU9IkVSUl9KV1RfSU5WQUxJRCIsZX1yZXR1cm4gdShyLG51bGwsW3trZXk6ImNvZGUiLGdldDpmdW5jdGlvbigpe3JldHVybiJFUlJfSldUX0lOVkFMSUQifX1dKSxyfShDbiksSG49ZnVuY3Rpb24oZSl7ZihyLGUpO3ZhciB0PW0ocik7ZnVuY3Rpb24gcigpe3ZhciBlO3JldHVybiBvKHRoaXMsciksKGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cykpLmNvZGU9IkVSUl9KV0tTX0lOVkFMSUQiLGV9cmV0dXJuIHUocixudWxsLFt7a2V5OiJjb2RlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iRVJSX0pXS1NfSU5WQUxJRCJ9fV0pLHJ9KENuKSxNbj1mdW5jdGlvbihlKXtmKHIsZSk7dmFyIHQ9bShyKTtmdW5jdGlvbiByKCl7dmFyIGU7cmV0dXJuIG8odGhpcyxyKSwoZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkuY29kZT0iRVJSX0pXS1NfTk9fTUFUQ0hJTkdfS0VZIixlLm1lc3NhZ2U9Im5vIGFwcGxpY2FibGUga2V5IGZvdW5kIGluIHRoZSBKU09OIFdlYiBLZXkgU2V0IixlfXJldHVybiB1KHIsbnVsbCxbe2tleToiY29kZSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIkVSUl9KV0tTX05PX01BVENISU5HX0tFWSJ9fV0pLHJ9KENuKSxqbj1mdW5jdGlvbihlKXtmKHIsZSk7dmFyIHQ9bShyKTtmdW5jdGlvbiByKCl7dmFyIGU7cmV0dXJuIG8odGhpcyxyKSwoZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkuY29kZT0iRVJSX0pXS1NfTVVMVElQTEVfTUFUQ0hJTkdfS0VZUyIsZS5tZXNzYWdlPSJtdWx0aXBsZSBtYXRjaGluZyBrZXlzIGZvdW5kIGluIHRoZSBKU09OIFdlYiBLZXkgU2V0IixlfXJldHVybiB1KHIsbnVsbCxbe2tleToiY29kZSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIkVSUl9KV0tTX01VTFRJUExFX01BVENISU5HX0tFWVMifX1dKSxyfShDbiksTm49ZnVuY3Rpb24oZSl7ZihyLGUpO3ZhciB0PW0ocik7ZnVuY3Rpb24gcigpe3ZhciBlO3JldHVybiBvKHRoaXMsciksKGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cykpLmNvZGU9IkVSUl9KV1NfU0lHTkFUVVJFX1ZFUklGSUNBVElPTl9GQUlMRUQiLGUubWVzc2FnZT0ic2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQiLGV9cmV0dXJuIHUocixudWxsLFt7a2V5OiJjb2RlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iRVJSX0pXU19TSUdOQVRVUkVfVkVSSUZJQ0FUSU9OX0ZBSUxFRCJ9fV0pLHJ9KENuKTtmdW5jdGlvbiBxbigpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBXZWJTb2NrZXRQYWlyfWZ1bmN0aW9uIEtuKCl7dHJ5e3JldHVybiB2b2lkIDAhPT1KZS52ZXJzaW9ucy5ub2RlfWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiBKbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06ImFsZ29yaXRobS5uYW1lIjtyZXR1cm4gbmV3IFR5cGVFcnJvcigiQ3J5cHRvS2V5IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24sIGl0cyAiLmNvbmNhdCh0LCIgbXVzdCBiZSAiKS5jb25jYXQoZSkpfWZ1bmN0aW9uIEJuKGUsdCl7cmV0dXJuIGUubmFtZT09PXR9ZnVuY3Rpb24gRm4oZSl7cmV0dXJuIHBhcnNlSW50KGUubmFtZS5zbGljZSg0KSwxMCl9ZnVuY3Rpb24gV24oZSl7c3dpdGNoKGUpe2Nhc2UiRVMyNTYiOnJldHVybiJQLTI1NiI7Y2FzZSJFUzM4NCI6cmV0dXJuIlAtMzg0IjtjYXNlIkVTNTEyIjpyZXR1cm4iUC01MjEiO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bnJlYWNoYWJsZSIpfX1mdW5jdGlvbiB6bihlLHQpe2lmKHQubGVuZ3RoJiYhdC5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gZS51c2FnZXMuaW5jbHVkZXModCl9KSkpe3ZhciByPSJDcnlwdG9LZXkgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbiwgaXRzIHVzYWdlcyBtdXN0IGluY2x1ZGUgIjtpZih0Lmxlbmd0aD4yKXt2YXIgbj10LnBvcCgpO3IrPSJvbmUgb2YgIi5jb25jYXQodC5qb2luKCIsICIpLCIsIG9yICIpLmNvbmNhdChuLCIuIil9ZWxzZSAyPT09dC5sZW5ndGg/cis9Im9uZSBvZiAiLmNvbmNhdCh0WzBdLCIgb3IgIikuY29uY2F0KHRbMV0sIi4iKTpyKz0iIi5jb25jYXQodFswXSwiLiIpO3Rocm93IG5ldyBUeXBlRXJyb3Iocil9fXZhciBZbj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9IktleSBtdXN0IGJlICIscj1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KHI+MT9yLTE6MCksaT0xO2k8cjtpKyspYVtpLTFdPWFyZ3VtZW50c1tpXTtpZihhLmxlbmd0aD4yKXt2YXIgbz1hLnBvcCgpO3QrPSJvbmUgb2YgdHlwZSAiLmNvbmNhdChhLmpvaW4oIiwgIiksIiwgb3IgIikuY29uY2F0KG8sIi4iKX1lbHNlIDI9PT1hLmxlbmd0aD90Kz0ib25lIG9mIHR5cGUgIi5jb25jYXQoYVswXSwiIG9yICIpLmNvbmNhdChhWzFdLCIuIik6dCs9Im9mIHR5cGUgIi5jb25jYXQoYVswXSwiLiIpO3JldHVybiBudWxsPT1lP3QrPSIgUmVjZWl2ZWQgIi5jb25jYXQoZSk6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUubmFtZT90Kz0iIFJlY2VpdmVkIGZ1bmN0aW9uICIuY29uY2F0KGUubmFtZSk6Im9iamVjdCI9PT1uKGUpJiZudWxsIT1lJiZlLmNvbnN0cnVjdG9yJiZlLmNvbnN0cnVjdG9yLm5hbWUmJih0Kz0iIFJlY2VpdmVkIGFuIGluc3RhbmNlIG9mICIuY29uY2F0KGUuY29uc3RydWN0b3IubmFtZSkpLHR9LEduPWZ1bmN0aW9uKGUpe3JldHVybiBTbihlKX0sVm49WyJDcnlwdG9LZXkiXSxYbj1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLHI9MDtyPGU7cisrKXRbcl09YXJndW1lbnRzW3JdO3ZhciBuLGE9dC5maWx0ZXIoQm9vbGVhbik7aWYoMD09PWEubGVuZ3RofHwxPT09YS5sZW5ndGgpcmV0dXJuITA7dmFyIGksbz1fKGEpO3RyeXtmb3Ioby5zKCk7IShpPW8ubigpKS5kb25lOyl7dmFyIHM9aS52YWx1ZSx1PU9iamVjdC5rZXlzKHMpO2lmKG4mJjAhPT1uLnNpemUpZm9yKHZhciBjPTAsZj11O2M8Zi5sZW5ndGg7YysrKXt2YXIgbD1mW2NdO2lmKG4uaGFzKGwpKXJldHVybiExO24uYWRkKGwpfWVsc2Ugbj1uZXcgU2V0KHUpfX1jYXRjaChlKXtvLmUoZSl9ZmluYWxseXtvLmYoKX1yZXR1cm4hMH07ZnVuY3Rpb24gJG4oZSl7aWYoIm9iamVjdCIhPT1uKHQ9ZSl8fG51bGw9PT10fHwiW29iamVjdCBPYmplY3RdIiE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSlyZXR1cm4hMTt2YXIgdDtpZihudWxsPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKXJldHVybiEwO2Zvcih2YXIgcj1lO251bGwhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7KXI9T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpO3JldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1yfXZhciBabj1mdW5jdGlvbihlLHQpe2lmKGUuc3RhcnRzV2l0aCgiUlMiKXx8ZS5zdGFydHNXaXRoKCJQUyIpKXt2YXIgcj10LmFsZ29yaXRobS5tb2R1bHVzTGVuZ3RoO2lmKCJudW1iZXIiIT10eXBlb2Ygcnx8cjwyMDQ4KXRocm93IG5ldyBUeXBlRXJyb3IoIiIuY29uY2F0KGUsIiByZXF1aXJlcyBrZXkgbW9kdWx1c0xlbmd0aCB0byBiZSAyMDQ4IGJpdHMgb3IgbGFyZ2VyIikpfX07ZnVuY3Rpb24gUW4oZSl7dmFyIHQscjtzd2l0Y2goZS5rdHkpe2Nhc2Uib2N0Ijpzd2l0Y2goZS5hbGcpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOnQ9e25hbWU6IkhNQUMiLGhhc2g6IlNIQS0iLmNvbmNhdChlLmFsZy5zbGljZSgtMykpfSxyPVsic2lnbiIsInZlcmlmeSJdO2JyZWFrO2Nhc2UiQTEyOENCQy1IUzI1NiI6Y2FzZSJBMTkyQ0JDLUhTMzg0IjpjYXNlIkEyNTZDQkMtSFM1MTIiOnRocm93IG5ldyBJbigiIi5jb25jYXQoZS5hbGcsIiBrZXlzIGNhbm5vdCBiZSBpbXBvcnRlZCBhcyBDcnlwdG9LZXkgaW5zdGFuY2VzIikpO2Nhc2UiQTEyOEdDTSI6Y2FzZSJBMTkyR0NNIjpjYXNlIkEyNTZHQ00iOmNhc2UiQTEyOEdDTUtXIjpjYXNlIkExOTJHQ01LVyI6Y2FzZSJBMjU2R0NNS1ciOnQ9e25hbWU6IkFFUy1HQ00ifSxyPVsiZW5jcnlwdCIsImRlY3J5cHQiXTticmVhaztjYXNlIkExMjhLVyI6Y2FzZSJBMTkyS1ciOmNhc2UiQTI1NktXIjp0PXtuYW1lOiJBRVMtS1cifSxyPVsid3JhcEtleSIsInVud3JhcEtleSJdO2JyZWFrO2Nhc2UiUEJFUzItSFMyNTYrQTEyOEtXIjpjYXNlIlBCRVMyLUhTMzg0K0ExOTJLVyI6Y2FzZSJQQkVTMi1IUzUxMitBMjU2S1ciOnQ9e25hbWU6IlBCS0RGMiJ9LHI9WyJkZXJpdmVCaXRzIl07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSW4oJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2Nhc2UiUlNBIjpzd2l0Y2goZS5hbGcpe2Nhc2UiUFMyNTYiOmNhc2UiUFMzODQiOmNhc2UiUFM1MTIiOnQ9e25hbWU6IlJTQS1QU1MiLGhhc2g6IlNIQS0iLmNvbmNhdChlLmFsZy5zbGljZSgtMykpfSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiUlMyNTYiOmNhc2UiUlMzODQiOmNhc2UiUlM1MTIiOnQ9e25hbWU6IlJTQVNTQS1QS0NTMS12MV81IixoYXNoOiJTSEEtIi5jb25jYXQoZS5hbGcuc2xpY2UoLTMpKX0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIlJTQS1PQUVQIjpjYXNlIlJTQS1PQUVQLTI1NiI6Y2FzZSJSU0EtT0FFUC0zODQiOmNhc2UiUlNBLU9BRVAtNTEyIjp0PXtuYW1lOiJSU0EtT0FFUCIsaGFzaDoiU0hBLSIuY29uY2F0KHBhcnNlSW50KGUuYWxnLnNsaWNlKC0zKSwxMCl8fDEpfSxyPWUuZD9bImRlY3J5cHQiLCJ1bndyYXBLZXkiXTpbImVuY3J5cHQiLCJ3cmFwS2V5Il07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSW4oJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2Nhc2UiRUMiOnN3aXRjaChlLmFsZyl7Y2FzZSJFUzI1NiI6dD17bmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6IlAtMjU2In0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIkVTMzg0Ijp0PXtuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZToiUC0zODQifSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiRVM1MTIiOnQ9e25hbWU6IkVDRFNBIixuYW1lZEN1cnZlOiJQLTUyMSJ9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJFQ0RILUVTIjpjYXNlIkVDREgtRVMrQTEyOEtXIjpjYXNlIkVDREgtRVMrQTE5MktXIjpjYXNlIkVDREgtRVMrQTI1NktXIjp0PXtuYW1lOiJFQ0RIIixuYW1lZEN1cnZlOmUuY3J2fSxyPWUuZD9bImRlcml2ZUJpdHMiXTpbXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBJbignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7Y2FzZShxbigpfHxLbigpKSYmIk9LUCI6aWYoIkVkRFNBIiE9PWUuYWxnKXRocm93IG5ldyBJbignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyk7c3dpdGNoKGUuY3J2KXtjYXNlIkVkMjU1MTkiOnQ9e25hbWU6Ik5PREUtRUQyNTUxOSIsbmFtZWRDdXJ2ZToiTk9ERS1FRDI1NTE5In0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIEtuKCkmJiJFZDQ0OCI6dD17bmFtZToiTk9ERS1FRDQ0OCIsbmFtZWRDdXJ2ZToiTk9ERS1FRDQ0OCJ9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSW4oJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJjcnYiIChTdWJ0eXBlIG9mIEtleSBQYWlyKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztkZWZhdWx0OnRocm93IG5ldyBJbignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImt0eSIgKEtleSBUeXBlKSBQYXJhbWV0ZXIgdmFsdWUnKX1yZXR1cm57YWxnb3JpdGhtOnQsa2V5VXNhZ2VzOnJ9fXZhciBlYT1mdW5jdGlvbigpe3ZhciBlPWkocigpLm1hcmsoKGZ1bmN0aW9uIGUobil7dmFyIGEsaSxvLHMsdSxjLGYsbCxoO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYocz1RbihuKSx1PXMuYWxnb3JpdGhtLGM9cy5rZXlVc2FnZXMsZj1bdSxudWxsIT09KGk9bi5leHQpJiZ2b2lkIDAhPT1pJiZpLG51bGwhPT0obz1uLmtleV9vcHMpJiZ2b2lkIDAhPT1vP286Y10sIlBCS0RGMiIhPT11Lm5hbWUpe2UubmV4dD00O2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIiwobD1fbi5zdWJ0bGUpLmltcG9ydEtleS5hcHBseShsLFsicmF3IixSbihuLmspXS5jb25jYXQoZikpKTtjYXNlIDQ6cmV0dXJuIGRlbGV0ZShoPXQoe30sbikpLmFsZyxlLmFicnVwdCgicmV0dXJuIiwoYT1fbi5zdWJ0bGUpLmltcG9ydEtleS5hcHBseShhLFsiandrIixoXS5jb25jYXQoZikpKTtjYXNlIDc6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCk7ZnVuY3Rpb24gdGEoZSx0LHIpe3JldHVybiByYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcmEoKXtyZXR1cm4ocmE9aShyKCkubWFyaygoZnVuY3Rpb24gZShuLGEsaSl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDppZigkbihuKSl7ZS5uZXh0PTI7YnJlYWt9dGhyb3cgbmV3IFR5cGVFcnJvcigiSldLIG11c3QgYmUgYW4gb2JqZWN0Iik7Y2FzZSAyOmlmKGF8fChhPW4uYWxnKSwic3RyaW5nIj09dHlwZW9mIGEmJmEpe2UubmV4dD01O2JyZWFrfXRocm93IG5ldyBUeXBlRXJyb3IoJyJhbGciIGFyZ3VtZW50IGlzIHJlcXVpcmVkIHdoZW4gImp3ay5hbGciIGlzIG5vdCBwcmVzZW50Jyk7Y2FzZSA1OmUudDA9bi5rdHksZS5uZXh0PSJvY3QiPT09ZS50MD84OiJSU0EiPT09ZS50MD8xNDoiRUMiPT09ZS50MHx8Ik9LUCI9PT1lLnQwPzE2OjE3O2JyZWFrO2Nhc2UgODppZigic3RyaW5nIj09dHlwZW9mIG4uayYmbi5rKXtlLm5leHQ9MTA7YnJlYWt9dGhyb3cgbmV3IFR5cGVFcnJvcignbWlzc2luZyAiayIgKEtleSBWYWx1ZSkgUGFyYW1ldGVyIHZhbHVlJyk7Y2FzZSAxMDppZihudWxsIT1pfHwoaT0hMCE9PW4uZXh0KSwhaSl7ZS5uZXh0PTEzO2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIixlYSh0KHQoe30sbikse30se2FsZzphLGV4dDohMX0pKSk7Y2FzZSAxMzpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsUm4obi5rKSk7Y2FzZSAxNDppZih2b2lkIDA9PT1uLm90aCl7ZS5uZXh0PTE2O2JyZWFrfXRocm93IG5ldyBJbignUlNBIEpXSyAib3RoIiAoT3RoZXIgUHJpbWVzIEluZm8pIFBhcmFtZXRlciB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkJyk7Y2FzZSAxNjpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsZWEodCh0KHt9LG4pLHt9LHthbGc6YX0pKSk7Y2FzZSAxNzp0aHJvdyBuZXcgSW4oJ1Vuc3VwcG9ydGVkICJrdHkiIChLZXkgVHlwZSkgUGFyYW1ldGVyIHZhbHVlJyk7Y2FzZSAxODpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUpfSkpKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciBuYT1mdW5jdGlvbihlLHQscil7ZS5zdGFydHNXaXRoKCJIUyIpfHwiZGlyIj09PWV8fGUuc3RhcnRzV2l0aCgiUEJFUzIiKXx8L15BXGR7M30oPzpHQ00pP0tXJC8udGVzdChlKT9mdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSl7aWYoIUduKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoWW4uYXBwbHkodm9pZCAwLFtlXS5jb25jYXQoYihWbiksWyJVaW50OEFycmF5Il0pKSk7aWYoInNlY3JldCIhPT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiIi5jb25jYXQoVm4uam9pbigiIG9yICIpLCcgaW5zdGFuY2VzIGZvciBzeW1tZXRyaWMgYWxnb3JpdGhtcyBtdXN0IGJlIG9mIHR5cGUgInNlY3JldCInKSl9fSh0KTpmdW5jdGlvbihlLHQpe2lmKCFHbihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFluLmFwcGx5KHZvaWQgMCxbZV0uY29uY2F0KGIoVm4pKSkpO2lmKCJzZWNyZXQiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoIiIuY29uY2F0KFZuLmpvaW4oIiBvciAiKSwnIGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG1zIG11c3Qgbm90IGJlIG9mIHR5cGUgInNlY3JldCInKSk7aWYoInNpZ24iPT09dCYmInB1YmxpYyI9PT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiIi5jb25jYXQoVm4uam9pbigiIG9yICIpLCcgaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBzaWduaW5nIG11c3QgYmUgb2YgdHlwZSAicHJpdmF0ZSInKSk7aWYoImRlY3J5cHQiPT09dCYmInB1YmxpYyI9PT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiIi5jb25jYXQoVm4uam9pbigiIG9yICIpLCcgaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBkZWNyeXB0aW9uIG11c3QgYmUgb2YgdHlwZSAicHJpdmF0ZSInKSk7aWYoZS5hbGdvcml0aG0mJiJ2ZXJpZnkiPT09dCYmInByaXZhdGUiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoIiIuY29uY2F0KFZuLmpvaW4oIiBvciAiKSwnIGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG0gdmVyaWZ5aW5nIG11c3QgYmUgb2YgdHlwZSAicHVibGljIicpKTtpZihlLmFsZ29yaXRobSYmImVuY3J5cHQiPT09dCYmInByaXZhdGUiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoIiIuY29uY2F0KFZuLmpvaW4oIiBvciAiKSwnIGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG0gZW5jcnlwdGlvbiBtdXN0IGJlIG9mIHR5cGUgInB1YmxpYyInKSl9KHQscil9O2Z1bmN0aW9uIGFhKGUsdCxyLG4sYSl7aWYodm9pZCAwIT09YS5jcml0JiZ2b2lkIDA9PT1uLmNyaXQpdGhyb3cgbmV3IGUoJyJjcml0IiAoQ3JpdGljYWwpIEhlYWRlciBQYXJhbWV0ZXIgTVVTVCBiZSBpbnRlZ3JpdHkgcHJvdGVjdGVkJyk7aWYoIW58fHZvaWQgMD09PW4uY3JpdClyZXR1cm4gbmV3IFNldDtpZighQXJyYXkuaXNBcnJheShuLmNyaXQpfHwwPT09bi5jcml0Lmxlbmd0aHx8bi5jcml0LnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciIT10eXBlb2YgZXx8MD09PWUubGVuZ3RofSkpKXRocm93IG5ldyBlKCciY3JpdCIgKENyaXRpY2FsKSBIZWFkZXIgUGFyYW1ldGVyIE1VU1QgYmUgYW4gYXJyYXkgb2Ygbm9uLWVtcHR5IHN0cmluZ3Mgd2hlbiBwcmVzZW50Jyk7dmFyIGk7aT12b2lkIDAhPT1yP25ldyBNYXAoW10uY29uY2F0KGIoT2JqZWN0LmVudHJpZXMocikpLGIodC5lbnRyaWVzKCkpKSk6dDt2YXIgbyxzPV8obi5jcml0KTt0cnl7Zm9yKHMucygpOyEobz1zLm4oKSkuZG9uZTspe3ZhciB1PW8udmFsdWU7aWYoIWkuaGFzKHUpKXRocm93IG5ldyBJbignRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIicuY29uY2F0KHUsJyIgaXMgbm90IHJlY29nbml6ZWQnKSk7aWYodm9pZCAwPT09YVt1XSl0aHJvdyBuZXcgZSgnRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIicuY29uY2F0KHUsJyIgaXMgbWlzc2luZycpKTtpZihpLmdldCh1KSYmdm9pZCAwPT09blt1XSl0aHJvdyBuZXcgZSgnRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIicuY29uY2F0KHUsJyIgTVVTVCBiZSBpbnRlZ3JpdHkgcHJvdGVjdGVkJykpfX1jYXRjaChlKXtzLmUoZSl9ZmluYWxseXtzLmYoKX1yZXR1cm4gbmV3IFNldChuLmNyaXQpfXZhciBpYT1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMCE9PXQmJighQXJyYXkuaXNBcnJheSh0KXx8dC5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGV9KSkpKXRocm93IG5ldyBUeXBlRXJyb3IoJyInLmNvbmNhdChlLCciIG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKSk7aWYodClyZXR1cm4gbmV3IFNldCh0KX07ZnVuY3Rpb24gb2EoZSx0KXt2YXIgcj0iU0hBLSIuY29uY2F0KGUuc2xpY2UoLTMpKTtzd2l0Y2goZSl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6cmV0dXJue2hhc2g6cixuYW1lOiJITUFDIn07Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6cmV0dXJue2hhc2g6cixuYW1lOiJSU0EtUFNTIixzYWx0TGVuZ3RoOmUuc2xpY2UoLTMpPj4zfTtjYXNlIlJTMjU2IjpjYXNlIlJTMzg0IjpjYXNlIlJTNTEyIjpyZXR1cm57aGFzaDpyLG5hbWU6IlJTQVNTQS1QS0NTMS12MV81In07Y2FzZSJFUzI1NiI6Y2FzZSJFUzM4NCI6Y2FzZSJFUzUxMiI6cmV0dXJue2hhc2g6cixuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZTp0Lm5hbWVkQ3VydmV9O2Nhc2UocW4oKXx8S24oKSkmJiJFZERTQSI6dmFyIG49dC5uYW1lZEN1cnZlO3JldHVybntuYW1lOm4sbmFtZWRDdXJ2ZTpufTtkZWZhdWx0OnRocm93IG5ldyBJbigiYWxnICIuY29uY2F0KGUsIiBpcyBub3Qgc3VwcG9ydGVkIGVpdGhlciBieSBKT1NFIG9yIHlvdXIgamF2YXNjcmlwdCBydW50aW1lIikpfX1mdW5jdGlvbiBzYShlLHQscil7aWYoU24odCkpcmV0dXJuIGZ1bmN0aW9uKGUsdCl7c3dpdGNoKHQpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOmlmKCFCbihlLmFsZ29yaXRobSwiSE1BQyIpKXRocm93IEpuKCJITUFDIik7dmFyIHI9cGFyc2VJbnQodC5zbGljZSgyKSwxMCk7aWYoRm4oZS5hbGdvcml0aG0uaGFzaCkhPT1yKXRocm93IEpuKCJTSEEtIi5jb25jYXQociksImFsZ29yaXRobS5oYXNoIik7YnJlYWs7Y2FzZSJSUzI1NiI6Y2FzZSJSUzM4NCI6Y2FzZSJSUzUxMiI6aWYoIUJuKGUuYWxnb3JpdGhtLCJSU0FTU0EtUEtDUzEtdjFfNSIpKXRocm93IEpuKCJSU0FTU0EtUEtDUzEtdjFfNSIpO3ZhciBuPXBhcnNlSW50KHQuc2xpY2UoMiksMTApO2lmKEZuKGUuYWxnb3JpdGhtLmhhc2gpIT09bil0aHJvdyBKbigiU0hBLSIuY29uY2F0KG4pLCJhbGdvcml0aG0uaGFzaCIpO2JyZWFrO2Nhc2UiUFMyNTYiOmNhc2UiUFMzODQiOmNhc2UiUFM1MTIiOmlmKCFCbihlLmFsZ29yaXRobSwiUlNBLVBTUyIpKXRocm93IEpuKCJSU0EtUFNTIik7dmFyIGE9cGFyc2VJbnQodC5zbGljZSgyKSwxMCk7aWYoRm4oZS5hbGdvcml0aG0uaGFzaCkhPT1hKXRocm93IEpuKCJTSEEtIi5jb25jYXQoYSksImFsZ29yaXRobS5oYXNoIik7YnJlYWs7Y2FzZSBLbigpJiYiRWREU0EiOmlmKCJOT0RFLUVEMjU1MTkiIT09ZS5hbGdvcml0aG0ubmFtZSYmIk5PREUtRUQ0NDgiIT09ZS5hbGdvcml0aG0ubmFtZSl0aHJvdyBKbigiTk9ERS1FRDI1NTE5IG9yIE5PREUtRUQ0NDgiKTticmVhaztjYXNlIHFuKCkmJiJFZERTQSI6aWYoIUJuKGUuYWxnb3JpdGhtLCJOT0RFLUVEMjU1MTkiKSl0aHJvdyBKbigiTk9ERS1FRDI1NTE5Iik7YnJlYWs7Y2FzZSJFUzI1NiI6Y2FzZSJFUzM4NCI6Y2FzZSJFUzUxMiI6aWYoIUJuKGUuYWxnb3JpdGhtLCJFQ0RTQSIpKXRocm93IEpuKCJFQ0RTQSIpO3ZhciBpPVduKHQpO2lmKGUuYWxnb3JpdGhtLm5hbWVkQ3VydmUhPT1pKXRocm93IEpuKGksImFsZ29yaXRobS5uYW1lZEN1cnZlIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJDcnlwdG9LZXkgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbiIpfWZvcih2YXIgbz1hcmd1bWVudHMubGVuZ3RoLHM9bmV3IEFycmF5KG8+Mj9vLTI6MCksdT0yO3U8bzt1Kyspc1t1LTJdPWFyZ3VtZW50c1t1XTt6bihlLHMpfSh0LGUsciksdDtpZih0IGluc3RhbmNlb2YgVWludDhBcnJheSl7aWYoIWUuc3RhcnRzV2l0aCgiSFMiKSl0aHJvdyBuZXcgVHlwZUVycm9yKFluLmFwcGx5KHZvaWQgMCxbdF0uY29uY2F0KGIoVm4pKSkpO3JldHVybiBfbi5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLHQse2hhc2g6IlNIQS0iLmNvbmNhdChlLnNsaWNlKC0zKSksbmFtZToiSE1BQyJ9LCExLFtyXSl9dGhyb3cgbmV3IFR5cGVFcnJvcihZbi5hcHBseSh2b2lkIDAsW3RdLmNvbmNhdChiKFZuKSxbIlVpbnQ4QXJyYXkiXSkpKX12YXIgdWE9ZnVuY3Rpb24oKXt2YXIgZT1pKHIoKS5tYXJrKChmdW5jdGlvbiBlKHQsbixhLGkpe3ZhciBvLHM7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5uZXh0PTIsc2EodCxuLCJ2ZXJpZnkiKTtjYXNlIDI6cmV0dXJuIG89ZS5zZW50LFpuKHQsbykscz1vYSh0LG8uYWxnb3JpdGhtKSxlLnByZXY9NSxlLm5leHQ9OCxfbi5zdWJ0bGUudmVyaWZ5KHMsbyxhLGkpO2Nhc2UgODpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsZS5zZW50KTtjYXNlIDExOnJldHVybiBlLnByZXY9MTEsZS50MD1lLmNhdGNoKDUpLGUuYWJydXB0KCJyZXR1cm4iLCExKTtjYXNlIDE0OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSxudWxsLFtbNSwxMV1dKX0pKSk7cmV0dXJuIGZ1bmN0aW9uKHQscixuLGEpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCk7ZnVuY3Rpb24gY2EoZSx0LHIpe3JldHVybiBmYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gZmEoKXtyZXR1cm4gZmE9aShyKCkubWFyaygoZnVuY3Rpb24gZShuLGEsaSl7dmFyIG8scyx1LGMsZixsLGgscCxkLHYsZyx5LG07cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDppZigkbihuKSl7ZS5uZXh0PTI7YnJlYWt9dGhyb3cgbmV3IExuKCJGbGF0dGVuZWQgSldTIG11c3QgYmUgYW4gb2JqZWN0Iik7Y2FzZSAyOmlmKHZvaWQgMCE9PW4ucHJvdGVjdGVkfHx2b2lkIDAhPT1uLmhlYWRlcil7ZS5uZXh0PTQ7YnJlYWt9dGhyb3cgbmV3IExuKCdGbGF0dGVuZWQgSldTIG11c3QgaGF2ZSBlaXRoZXIgb2YgdGhlICJwcm90ZWN0ZWQiIG9yICJoZWFkZXIiIG1lbWJlcnMnKTtjYXNlIDQ6aWYodm9pZCAwPT09bi5wcm90ZWN0ZWR8fCJzdHJpbmciPT10eXBlb2Ygbi5wcm90ZWN0ZWQpe2UubmV4dD02O2JyZWFrfXRocm93IG5ldyBMbigiSldTIFByb3RlY3RlZCBIZWFkZXIgaW5jb3JyZWN0IHR5cGUiKTtjYXNlIDY6aWYodm9pZCAwIT09bi5wYXlsb2FkKXtlLm5leHQ9ODticmVha310aHJvdyBuZXcgTG4oIkpXUyBQYXlsb2FkIG1pc3NpbmciKTtjYXNlIDg6aWYoInN0cmluZyI9PXR5cGVvZiBuLnNpZ25hdHVyZSl7ZS5uZXh0PTEwO2JyZWFrfXRocm93IG5ldyBMbigiSldTIFNpZ25hdHVyZSBtaXNzaW5nIG9yIGluY29ycmVjdCB0eXBlIik7Y2FzZSAxMDppZih2b2lkIDA9PT1uLmhlYWRlcnx8JG4obi5oZWFkZXIpKXtlLm5leHQ9MTI7YnJlYWt9dGhyb3cgbmV3IExuKCJKV1MgVW5wcm90ZWN0ZWQgSGVhZGVyIGluY29ycmVjdCB0eXBlIik7Y2FzZSAxMjppZihzPXt9LCFuLnByb3RlY3RlZCl7ZS5uZXh0PTIyO2JyZWFrfXU9Um4obi5wcm90ZWN0ZWQpLGUucHJldj0xNSxzPUpTT04ucGFyc2UoVG4uZGVjb2RlKHUpKSxlLm5leHQ9MjI7YnJlYWs7Y2FzZSAxOTp0aHJvdyBlLnByZXY9MTksZS50MD1lLmNhdGNoKDE1KSxuZXcgTG4oIkpXUyBQcm90ZWN0ZWQgSGVhZGVyIGlzIGludmFsaWQiKTtjYXNlIDIyOmlmKFhuKHMsbi5oZWFkZXIpKXtlLm5leHQ9MjQ7YnJlYWt9dGhyb3cgbmV3IExuKCJKV1MgUHJvdGVjdGVkIGFuZCBKV1MgVW5wcm90ZWN0ZWQgSGVhZGVyIFBhcmFtZXRlciBuYW1lcyBtdXN0IGJlIGRpc2pvaW50Iik7Y2FzZSAyNDppZihjPXQodCh7fSxzKSxuLmhlYWRlciksZj1hYShMbixuZXcgTWFwKFtbImI2NCIsITBdXSksbnVsbD09aT92b2lkIDA6aS5jcml0LHMsYyksbD0hMCwhZi5oYXMoImI2NCIpKXtlLm5leHQ9MzE7YnJlYWt9aWYoImJvb2xlYW4iPT10eXBlb2YobD1zLmI2NCkpe2UubmV4dD0zMTticmVha310aHJvdyBuZXcgTG4oJ1RoZSAiYjY0IiAoYmFzZTY0dXJsLWVuY29kZSBwYXlsb2FkKSBIZWFkZXIgUGFyYW1ldGVyIG11c3QgYmUgYSBib29sZWFuJyk7Y2FzZSAzMTppZigic3RyaW5nIj09dHlwZW9mKGg9Yy5hbGcpJiZoKXtlLm5leHQ9MzQ7YnJlYWt9dGhyb3cgbmV3IExuKCdKV1MgImFsZyIgKEFsZ29yaXRobSkgSGVhZGVyIFBhcmFtZXRlciBtaXNzaW5nIG9yIGludmFsaWQnKTtjYXNlIDM0OmlmKCEocD1pJiZpYSgiYWxnb3JpdGhtcyIsaS5hbGdvcml0aG1zKSl8fHAuaGFzKGgpKXtlLm5leHQ9Mzc7YnJlYWt9dGhyb3cgbmV3IE9uKCciYWxnIiAoQWxnb3JpdGhtKSBIZWFkZXIgUGFyYW1ldGVyIG5vdCBhbGxvd2VkJyk7Y2FzZSAzNzppZighbCl7ZS5uZXh0PTQyO2JyZWFrfWlmKCJzdHJpbmciPT10eXBlb2Ygbi5wYXlsb2FkKXtlLm5leHQ9NDA7YnJlYWt9dGhyb3cgbmV3IExuKCJKV1MgUGF5bG9hZCBtdXN0IGJlIGEgc3RyaW5nIik7Y2FzZSA0MDplLm5leHQ9NDQ7YnJlYWs7Y2FzZSA0MjppZigic3RyaW5nIj09dHlwZW9mIG4ucGF5bG9hZHx8bi5wYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSl7ZS5uZXh0PTQ0O2JyZWFrfXRocm93IG5ldyBMbigiSldTIFBheWxvYWQgbXVzdCBiZSBhIHN0cmluZyBvciBhbiBVaW50OEFycmF5IGluc3RhbmNlIik7Y2FzZSA0NDppZihkPSExLCJmdW5jdGlvbiIhPXR5cGVvZiBhKXtlLm5leHQ9NTA7YnJlYWt9cmV0dXJuIGUubmV4dD00OCxhKHMsbik7Y2FzZSA0ODphPWUuc2VudCxkPSEwO2Nhc2UgNTA6cmV0dXJuIG5hKGgsYSwidmVyaWZ5Iiksdj1BbihFbi5lbmNvZGUobnVsbCE9PShvPW4ucHJvdGVjdGVkKSYmdm9pZCAwIT09bz9vOiIiKSxFbi5lbmNvZGUoIi4iKSwic3RyaW5nIj09dHlwZW9mIG4ucGF5bG9hZD9Fbi5lbmNvZGUobi5wYXlsb2FkKTpuLnBheWxvYWQpLGc9Um4obi5zaWduYXR1cmUpLGUubmV4dD01NSx1YShoLGEsZyx2KTtjYXNlIDU1OmlmKGUuc2VudCl7ZS5uZXh0PTU4O2JyZWFrfXRocm93IG5ldyBObjtjYXNlIDU4OmlmKHk9bD9SbihuLnBheWxvYWQpOiJzdHJpbmciPT10eXBlb2Ygbi5wYXlsb2FkP0VuLmVuY29kZShuLnBheWxvYWQpOm4ucGF5bG9hZCxtPXtwYXlsb2FkOnl9LHZvaWQgMCE9PW4ucHJvdGVjdGVkJiYobS5wcm90ZWN0ZWRIZWFkZXI9cyksdm9pZCAwIT09bi5oZWFkZXImJihtLnVucHJvdGVjdGVkSGVhZGVyPW4uaGVhZGVyKSwhZCl7ZS5uZXh0PTY0O2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIix0KHQoe30sbSkse30se2tleTphfSkpO2Nhc2UgNjQ6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLG0pO2Nhc2UgNjU6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLG51bGwsW1sxNSwxOV1dKX0pKSksZmEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGxhKGUsdCxyKXtyZXR1cm4gaGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGhhKCl7cmV0dXJuKGhhPWkocigpLm1hcmsoKGZ1bmN0aW9uIGUobixhLGkpe3ZhciBvLHMsdSxjLGYsbDtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOmlmKG4gaW5zdGFuY2VvZiBVaW50OEFycmF5JiYobj1Ubi5kZWNvZGUobikpLCJzdHJpbmciPT10eXBlb2Ygbil7ZS5uZXh0PTM7YnJlYWt9dGhyb3cgbmV3IExuKCJDb21wYWN0IEpXUyBtdXN0IGJlIGEgc3RyaW5nIG9yIFVpbnQ4QXJyYXkiKTtjYXNlIDM6aWYobz1uLnNwbGl0KCIuIikscz1vWzBdLHU9b1sxXSxjPW9bMl0sMz09PW8ubGVuZ3RoKXtlLm5leHQ9NjticmVha310aHJvdyBuZXcgTG4oIkludmFsaWQgQ29tcGFjdCBKV1MiKTtjYXNlIDY6cmV0dXJuIGUubmV4dD04LGNhKHtwYXlsb2FkOnUscHJvdGVjdGVkOnMsc2lnbmF0dXJlOmN9LGEsaSk7Y2FzZSA4OmlmKGY9ZS5zZW50LGw9e3BheWxvYWQ6Zi5wYXlsb2FkLHByb3RlY3RlZEhlYWRlcjpmLnByb3RlY3RlZEhlYWRlcn0sImZ1bmN0aW9uIiE9dHlwZW9mIGEpe2UubmV4dD0xMjticmVha31yZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsdCh0KHt9LGwpLHt9LHtrZXk6Zi5rZXl9KSk7Y2FzZSAxMjpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsbCk7Y2FzZSAxMzpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUpfSkpKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciBwYT1mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5mbG9vcihlLmdldFRpbWUoKS8xZTMpfSxkYT04NjQwMCx2YT0vXihcZCt8XGQrXC5cZCspID8oc2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KSQvaSxnYT1mdW5jdGlvbihlKXt2YXIgdD12YS5leGVjKGUpO2lmKCF0KXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgdGltZSBwZXJpb2QgZm9ybWF0Iik7dmFyIHI9cGFyc2VGbG9hdCh0WzFdKTtzd2l0Y2godFsyXS50b0xvd2VyQ2FzZSgpKXtjYXNlInNlYyI6Y2FzZSJzZWNzIjpjYXNlInNlY29uZCI6Y2FzZSJzZWNvbmRzIjpjYXNlInMiOnJldHVybiBNYXRoLnJvdW5kKHIpO2Nhc2UibWludXRlIjpjYXNlIm1pbnV0ZXMiOmNhc2UibWluIjpjYXNlIm1pbnMiOmNhc2UibSI6cmV0dXJuIE1hdGgucm91bmQoNjAqcik7Y2FzZSJob3VyIjpjYXNlImhvdXJzIjpjYXNlImhyIjpjYXNlImhycyI6Y2FzZSJoIjpyZXR1cm4gTWF0aC5yb3VuZCgzNjAwKnIpO2Nhc2UiZGF5IjpjYXNlImRheXMiOmNhc2UiZCI6cmV0dXJuIE1hdGgucm91bmQocipkYSk7Y2FzZSJ3ZWVrIjpjYXNlIndlZWtzIjpjYXNlInciOnJldHVybiBNYXRoLnJvdW5kKDYwNDgwMCpyKTtkZWZhdWx0OnJldHVybiBNYXRoLnJvdW5kKDMxNTU3NjAwKnIpfX0seWE9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9eYXBwbGljYXRpb25cLy8sIiIpfSxtYT1mdW5jdGlvbihlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZT90LmluY2x1ZGVzKGUpOiEhQXJyYXkuaXNBcnJheShlKSYmdC5zb21lKFNldC5wcm90b3R5cGUuaGFzLmJpbmQobmV3IFNldChlKSkpfSx3YT1mdW5jdGlvbihlLHQpe3ZhciByLGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGk9YS50eXA7aWYoaSYmKCJzdHJpbmciIT10eXBlb2YgZS50eXB8fHlhKGUudHlwKSE9PXlhKGkpKSl0aHJvdyBuZXcgUG4oJ3VuZXhwZWN0ZWQgInR5cCIgSldUIGhlYWRlciB2YWx1ZScsInR5cCIsImNoZWNrX2ZhaWxlZCIpO3RyeXtyPUpTT04ucGFyc2UoVG4uZGVjb2RlKHQpKX1jYXRjaChlKXt9aWYoISRuKHIpKXRocm93IG5ldyBVbigiSldUIENsYWltcyBTZXQgbXVzdCBiZSBhIHRvcC1sZXZlbCBKU09OIG9iamVjdCIpO3ZhciBvPWEuaXNzdWVyO2lmKG8mJiEoQXJyYXkuaXNBcnJheShvKT9vOltvXSkuaW5jbHVkZXMoci5pc3MpKXRocm93IG5ldyBQbigndW5leHBlY3RlZCAiaXNzIiBjbGFpbSB2YWx1ZScsImlzcyIsImNoZWNrX2ZhaWxlZCIpO3ZhciBzPWEuc3ViamVjdDtpZihzJiZyLnN1YiE9PXMpdGhyb3cgbmV3IFBuKCd1bmV4cGVjdGVkICJzdWIiIGNsYWltIHZhbHVlJywic3ViIiwiY2hlY2tfZmFpbGVkIik7dmFyIHUsYz1hLmF1ZGllbmNlO2lmKGMmJiFtYShyLmF1ZCwic3RyaW5nIj09dHlwZW9mIGM/W2NdOmMpKXRocm93IG5ldyBQbigndW5leHBlY3RlZCAiYXVkIiBjbGFpbSB2YWx1ZScsImF1ZCIsImNoZWNrX2ZhaWxlZCIpO3N3aXRjaChuKGEuY2xvY2tUb2xlcmFuY2UpKXtjYXNlInN0cmluZyI6dT1nYShhLmNsb2NrVG9sZXJhbmNlKTticmVhaztjYXNlIm51bWJlciI6dT1hLmNsb2NrVG9sZXJhbmNlO2JyZWFrO2Nhc2UidW5kZWZpbmVkIjp1PTA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGNsb2NrVG9sZXJhbmNlIG9wdGlvbiB0eXBlIil9dmFyIGY9YS5jdXJyZW50RGF0ZSxsPXBhKGZ8fG5ldyBEYXRlKTtpZigodm9pZCAwIT09ci5pYXR8fGEubWF4VG9rZW5BZ2UpJiYibnVtYmVyIiE9dHlwZW9mIHIuaWF0KXRocm93IG5ldyBQbignImlhdCIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsImlhdCIsImludmFsaWQiKTtpZih2b2lkIDAhPT1yLm5iZil7aWYoIm51bWJlciIhPXR5cGVvZiByLm5iZil0aHJvdyBuZXcgUG4oJyJuYmYiIGNsYWltIG11c3QgYmUgYSBudW1iZXInLCJuYmYiLCJpbnZhbGlkIik7aWYoci5uYmY+bCt1KXRocm93IG5ldyBQbignIm5iZiIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCcsIm5iZiIsImNoZWNrX2ZhaWxlZCIpfWlmKHZvaWQgMCE9PXIuZXhwKXtpZigibnVtYmVyIiE9dHlwZW9mIHIuZXhwKXRocm93IG5ldyBQbignImV4cCIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsImV4cCIsImludmFsaWQiKTtpZihyLmV4cDw9bC11KXRocm93IG5ldyBEbignImV4cCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCcsImV4cCIsImNoZWNrX2ZhaWxlZCIpfWlmKGEubWF4VG9rZW5BZ2Upe3ZhciBoPWwtci5pYXQscD0ibnVtYmVyIj09dHlwZW9mIGEubWF4VG9rZW5BZ2U/YS5tYXhUb2tlbkFnZTpnYShhLm1heFRva2VuQWdlKTtpZihoLXU+cCl0aHJvdyBuZXcgRG4oJyJpYXQiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQgKHRvbyBmYXIgaW4gdGhlIHBhc3QpJywiaWF0IiwiY2hlY2tfZmFpbGVkIik7aWYoaDwwLXUpdGhyb3cgbmV3IFBuKCciaWF0IiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkIChpdCBzaG91bGQgYmUgaW4gdGhlIHBhc3QpJywiaWF0IiwiY2hlY2tfZmFpbGVkIil9cmV0dXJuIHJ9O2Z1bmN0aW9uIGJhKCl7cmV0dXJuKGJhPWkocigpLm1hcmsoKGZ1bmN0aW9uIGUobixhLGkpe3ZhciBvLHMsdSxjO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUubmV4dD0yLGxhKG4sYSxpKTtjYXNlIDI6aWYocz1lLnNlbnQsIShudWxsPT09KG89cy5wcm90ZWN0ZWRIZWFkZXIuY3JpdCl8fHZvaWQgMD09PW8/dm9pZCAwOm8uaW5jbHVkZXMoImI2NCIpKXx8ITEhPT1zLnByb3RlY3RlZEhlYWRlci5iNjQpe2UubmV4dD01O2JyZWFrfXRocm93IG5ldyBVbigiSldUcyBNVVNUIE5PVCB1c2UgdW5lbmNvZGVkIHBheWxvYWQiKTtjYXNlIDU6aWYodT13YShzLnByb3RlY3RlZEhlYWRlcixzLnBheWxvYWQsaSksYz17cGF5bG9hZDp1LHByb3RlY3RlZEhlYWRlcjpzLnByb3RlY3RlZEhlYWRlcn0sImZ1bmN0aW9uIiE9dHlwZW9mIGEpe2UubmV4dD05O2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIix0KHQoe30sYykse30se2tleTpzLmtleX0pKTtjYXNlIDk6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGMpO2Nhc2UgMTA6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBrYShlKXtzd2l0Y2goInN0cmluZyI9PXR5cGVvZiBlJiZlLnNsaWNlKDAsMikpe2Nhc2UiUlMiOmNhc2UiUFMiOnJldHVybiJSU0EiO2Nhc2UiRVMiOnJldHVybiJFQyI7Y2FzZSJFZCI6cmV0dXJuIk9LUCI7ZGVmYXVsdDp0aHJvdyBuZXcgSW4oJ1Vuc3VwcG9ydGVkICJhbGciIHZhbHVlIGZvciBhIEpTT04gV2ViIEtleSBTZXQnKX19ZnVuY3Rpb24geGEoZSl7cmV0dXJuICRuKGUpfXZhciBfYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7aWYobyh0aGlzLGUpLHRoaXMuX2NhY2hlZD1uZXcgV2Vha01hcCwhZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJvYmplY3QiPT09bihlKSYmQXJyYXkuaXNBcnJheShlLmtleXMpJiZlLmtleXMuZXZlcnkoeGEpfSh0KSl0aHJvdyBuZXcgSG4oIkpTT04gV2ViIEtleSBTZXQgbWFsZm9ybWVkIik7dmFyIHI7dGhpcy5fandrcz0ocj10LCJmdW5jdGlvbiI9PXR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmU/c3RydWN0dXJlZENsb25lKHIpOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocikpKX12YXIgYTtyZXR1cm4gdShlLFt7a2V5OiJnZXRLZXkiLHZhbHVlOihhPWkocigpLm1hcmsoKGZ1bmN0aW9uIGUobixhKXt2YXIgaSxvLHMsdSxjLGYsbCxoLHA7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDppZihpPXQodCh7fSxuKSxhLmhlYWRlciksbz1pLmFsZyxzPWkua2lkLHU9a2EobyksYz10aGlzLl9qd2tzLmtleXMuZmlsdGVyKChmdW5jdGlvbihlKXt2YXIgdD11PT09ZS5rdHk7aWYodCYmInN0cmluZyI9PXR5cGVvZiBzJiYodD1zPT09ZS5raWQpLHQmJiJzdHJpbmciPT10eXBlb2YgZS5hbGcmJih0PW89PT1lLmFsZyksdCYmInN0cmluZyI9PXR5cGVvZiBlLnVzZSYmKHQ9InNpZyI9PT1lLnVzZSksdCYmQXJyYXkuaXNBcnJheShlLmtleV9vcHMpJiYodD1lLmtleV9vcHMuaW5jbHVkZXMoInZlcmlmeSIpKSx0JiYiRWREU0EiPT09byYmKHQ9IkVkMjU1MTkiPT09ZS5jcnZ8fCJFZDQ0OCI9PT1lLmNydiksdClzd2l0Y2gobyl7Y2FzZSJFUzI1NiI6dD0iUC0yNTYiPT09ZS5jcnY7YnJlYWs7Y2FzZSJFUzI1NksiOnQ9InNlY3AyNTZrMSI9PT1lLmNydjticmVhaztjYXNlIkVTMzg0Ijp0PSJQLTM4NCI9PT1lLmNydjticmVhaztjYXNlIkVTNTEyIjp0PSJQLTUyMSI9PT1lLmNydn1yZXR1cm4gdH0pKSxmPWNbMF0sMCE9PShsPWMubGVuZ3RoKSl7ZS5uZXh0PTg7YnJlYWt9dGhyb3cgbmV3IE1uO2Nhc2UgODppZigxPT09bCl7ZS5uZXh0PTEwO2JyZWFrfXRocm93IG5ldyBqbjtjYXNlIDEwOmlmKHZvaWQgMCE9PShoPXRoaXMuX2NhY2hlZC5nZXQoZil8fHRoaXMuX2NhY2hlZC5zZXQoZix7fSkuZ2V0KGYpKVtvXSl7ZS5uZXh0PTE4O2JyZWFrfXJldHVybiBlLm5leHQ9MTQsdGEodCh0KHt9LGYpLHt9LHtleHQ6ITB9KSxvKTtjYXNlIDE0OmlmKCEoKHA9ZS5zZW50KWluc3RhbmNlb2YgVWludDhBcnJheXx8InB1YmxpYyIhPT1wLnR5cGUpKXtlLm5leHQ9MTc7YnJlYWt9dGhyb3cgbmV3IEhuKCJKU09OIFdlYiBLZXkgU2V0IG1lbWJlcnMgbXVzdCBiZSBwdWJsaWMga2V5cyIpO2Nhc2UgMTc6aFtvXT1wO2Nhc2UgMTg6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGhbb10pO2Nhc2UgMTk6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKSxmdW5jdGlvbihlLHQpe3JldHVybiBhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfV0pLGV9KCk7dmFyIFNhPXtleHBvcnRzOnt9fSxFYT17ZXhwb3J0czp7fX0sVGE9Wihmbik7Ci8qISBzYWZlLWJ1ZmZlci4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqLwohZnVuY3Rpb24oZSx0KXt2YXIgcj1UYSxuPXIuQnVmZmVyO2Z1bmN0aW9uIGEoZSx0KXtmb3IodmFyIHIgaW4gZSl0W3JdPWVbcl19ZnVuY3Rpb24gaShlLHQscil7cmV0dXJuIG4oZSx0LHIpfW4uZnJvbSYmbi5hbGxvYyYmbi5hbGxvY1Vuc2FmZSYmbi5hbGxvY1Vuc2FmZVNsb3c/ZS5leHBvcnRzPXI6KGEocix0KSx0LkJ1ZmZlcj1pKSxpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSxhKG4saSksaS5mcm9tPWZ1bmN0aW9uKGUsdCxyKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gbihlLHQscil9LGkuYWxsb2M9ZnVuY3Rpb24oZSx0LHIpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7dmFyIGE9bihlKTtyZXR1cm4gdm9pZCAwIT09dD8ic3RyaW5nIj09dHlwZW9mIHI/YS5maWxsKHQscik6YS5maWxsKHQpOmEuZmlsbCgwKSxhfSxpLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIG4oZSl9LGkuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIuU2xvd0J1ZmZlcihlKX19KEVhLEVhLmV4cG9ydHMpO3ZhciBBYT02NTUzNixSYT00Mjk0OTY3Mjk1O3ZhciBDYT1FYS5leHBvcnRzLkJ1ZmZlcixQYT1YLmNyeXB0b3x8WC5tc0NyeXB0bztQYSYmUGEuZ2V0UmFuZG9tVmFsdWVzP1NhLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihlPlJhKXRocm93IG5ldyBSYW5nZUVycm9yKCJyZXF1ZXN0ZWQgdG9vIG1hbnkgcmFuZG9tIGJ5dGVzIik7dmFyIHI9Q2EuYWxsb2NVbnNhZmUoZSk7aWYoZT4wKWlmKGU+QWEpZm9yKHZhciBuPTA7bjxlO24rPUFhKVBhLmdldFJhbmRvbVZhbHVlcyhyLnNsaWNlKG4sbitBYSkpO2Vsc2UgUGEuZ2V0UmFuZG9tVmFsdWVzKHIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0KXJldHVybiBKZS5uZXh0VGljaygoZnVuY3Rpb24oKXt0KG51bGwscil9KSk7cmV0dXJuIHJ9OlNhLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuXG5Vc2UgQ2hyb21lLCBGaXJlZm94IG9yIEludGVybmV0IEV4cGxvcmVyIDExIil9O3ZhciBEYT1TYS5leHBvcnRzLE9hPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe28odGhpcyxlKX1yZXR1cm4gdShlLFt7a2V5OiJiYXNlNjRVUkxFbmNvZGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBibi5lbmNvZGUoZSkucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKS5yZXBsYWNlKC89L2csIiIpfX0se2tleToiYmFzZTY0VVJMRGVjb2RlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gYm4uZGVjb2RlKGUpLnRvU3RyaW5nKCl9fSx7a2V5OiJoYXNoU2hhMjU2Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gU3IuZnJvbSh4bigobmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoZSkpKX19LHtrZXk6ImdlbmVyYXRlUmFuZG9tQnl0ZXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBEYShlKX19LHtrZXk6InZlcmlmeUp3dCIsdmFsdWU6ZnVuY3Rpb24oZSx0LHIsbixhLGksbyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gYmEuYXBwbHkodGhpcyxhcmd1bWVudHMpfShlLChzPXtrZXlzOlt0XX0sX2EucHJvdG90eXBlLmdldEtleS5iaW5kKG5ldyBfYShzKSkpLHthbGdvcml0aG1zOnIsYXVkaWVuY2U6bixjbG9ja1RvbGVyYW5jZTpvLGlzc3VlcjphLHN1YmplY3Q6aX0pLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSghMCl9KSk7dmFyIHN9fV0pLGV9KCk7b3JpZ2luLFUuU2Vzc2lvblN0b3JhZ2U7dmFyIElhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtvKHRoaXMsZSksdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQ9dCx0aGlzLl9kYXRhTGF5ZXI9dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGF0YUxheWVyKCl9cmV0dXJuIHUoZSxbe2tleToicmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXt2YXIgdCxuLGEsaT10aGlzO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUubmV4dD0yLHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSgpO2Nhc2UgMjppZighKHQ9ZS5zZW50KS5yZWZyZXNoX3Rva2VuKXtlLm5leHQ9OTticmVha31yZXR1cm4gbj1wYXJzZUludCh0LmV4cGlyZXNfaW4pLGE9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gUyhpLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZWZyZXNoQWNjZXNzVG9rZW4oKTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX0pLDFlMyoobjw9MTA/bjpuLTEwKSksZS5uZXh0PTksdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoQyxKU09OLnN0cmluZ2lmeShhKSk7Y2FzZSA5OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9fSx7a2V5OiJjbGVhclJlZnJlc2hUb2tlblRpbWVvdXQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7dmFyIHQ7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoQyk7Y2FzZSAyOmlmKCFlLnNlbnQpe2UubmV4dD05O2JyZWFrfXJldHVybiBlLnQwPUpTT04sZS5uZXh0PTYsdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoQyk7Y2FzZSA2OmUudDE9ZS5zZW50LHQ9ZS50MC5wYXJzZS5jYWxsKGUudDAsZS50MSksY2xlYXJUaW1lb3V0KHQpO2Nhc2UgOTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsdGhpcyl9KSkpfX1dKSxlfSgpLExhPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG4oKXt2YXIgYSxpLG8scyx1LGMsZixsLGgscCxkLHYsZyx5LG0sdyxiLGsseCxfLEUsVCxBLFIsQyxQLEQsTyxJLEwsVSxILE0sajtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKG4pe2Zvcig7Oylzd2l0Y2gobi5wcmV2PW4ubmV4dCl7Y2FzZSAwOnJldHVybiBhPW5ldyBzcixpPW5ldyBPYSxvPW5ldyBKKGEsaSksbi5uZXh0PTUsby5pbml0aWFsaXplKGUpO2Nhc2UgNTppZihzPW5ldyBJYShvKSx1PXQobyxzKSxjPW8uZ2V0RGF0YUxheWVyKCksZj1vci5nZXRJbnN0YW5jZSgpLGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXt2YXIgbjtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOmlmKCEobj1PYmplY3QuYXNzaWduKHthdHRhY2hUb2tlbjohMH0sZSkpLmF0dGFjaFRva2VuKXt0Lm5leHQ9MjM7YnJlYWt9aWYoIW4uc2hvdWxkQXR0YWNoSURQQWNjZXNzVG9rZW4pe3QubmV4dD0xNDticmVha31yZXR1cm4gdC50MD1PYmplY3QsdC50MT1PYmplY3QuYXNzaWduKHt9LGUuaGVhZGVycyksdC50Mj0iQmVhcmVyICIsdC5uZXh0PTgsdS5nZXRJRFBBY2Nlc3NUb2tlbigpO2Nhc2UgODp0LnQzPXQuc2VudCx0LnQ0PXQudDIuY29uY2F0LmNhbGwodC50Mix0LnQzKSx0LnQ1PXtBdXRob3JpemF0aW9uOnQudDR9LGUuaGVhZGVycz10LnQwLmFzc2lnbi5jYWxsKHQudDAsdC50MSx0LnQ1KSx0Lm5leHQ9MjM7YnJlYWs7Y2FzZSAxNDpyZXR1cm4gdC50Nj1PYmplY3QsdC50Nz1PYmplY3QuYXNzaWduKHt9LGUuaGVhZGVycyksdC50OD0iQmVhcmVyICIsdC5uZXh0PTE5LHUuZ2V0QWNjZXNzVG9rZW4oKTtjYXNlIDE5OnQudDk9dC5zZW50LHQudDEwPXQudDguY29uY2F0LmNhbGwodC50OCx0LnQ5KSx0LnQxMT17QXV0aG9yaXphdGlvbjp0LnQxMH0sZS5oZWFkZXJzPXQudDYuYXNzaWduLmNhbGwodC50Nix0LnQ3LHQudDExKTtjYXNlIDIzOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCl9KSkpfSxuLnQwPW51bGw9PWY/dm9pZCAwOmYuaW5pdCwhbi50MCl7bi5uZXh0PTE0O2JyZWFrfXJldHVybiBuLm5leHQ9MTQsZi5pbml0KCEwLGwpO2Nhc2UgMTQ6cmV0dXJuIGg9ZnVuY3Rpb24oZSl7KG51bGw9PWY/dm9pZCAwOmYuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKSYmZi5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2soZSl9LHA9ZnVuY3Rpb24oZSl7KG51bGw9PWY/dm9pZCAwOmYuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2spJiZmLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpfSxkPWZ1bmN0aW9uKGUpeyhudWxsPT1mP3ZvaWQgMDpmLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2spJiZmLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2soZSl9LHY9ZnVuY3Rpb24oZSl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix1Lmh0dHBSZXF1ZXN0KGYsZSk7Y2FzZSAyOnJldHVybiB0LmFicnVwdCgicmV0dXJuIix0LnNlbnQpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKX0sZz1mdW5jdGlvbihlKXtyZXR1cm4gUyh2b2lkIDAsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQubmV4dD0yLHUuaHR0cFJlcXVlc3RBbGwoZSxmKTtjYXNlIDI6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLHQuc2VudCk7Y2FzZSAzOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCl9KSkpfSx5PWZ1bmN0aW9uKCl7dS5lbmFibGVIdHRwSGFuZGxlcihmKX0sbT1mdW5jdGlvbigpe3UuZGlzYWJsZUh0dHBIYW5kbGVyKGYpfSx3PWZ1bmN0aW9uKGUpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsby5nZXRBdXRob3JpemF0aW9uVVJMKGUpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIG4sYSxpLHM7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gYT1uZXcgVVJMKGUpLGk9bnVsbCE9PShuPWEuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSkmJnZvaWQgMCE9PW4/bjoiIix0Lm5leHQ9NCxvLmdldFBLQ0VDb2RlKGkpO2Nhc2UgNDpyZXR1cm4gcz10LnNlbnQsdC5hYnJ1cHQoInJldHVybiIse2F1dGhvcml6YXRpb25VUkw6ZSxwa2NlOnN9KTtjYXNlIDY6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0KX0pKSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLnJlamVjdChlKX0pKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCl9KSkpfSxiPWZ1bmN0aW9uKCl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBzLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHMucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLGUuYWJydXB0KCJyZXR1cm4iKTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSl9LGs9ZnVuY3Rpb24oZSx0LG4sYSl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGkoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLm5leHQ9Mix1LnJlcXVlc3RBY2Nlc3NUb2tlbihlLHQsdm9pZCAwLG4sYSk7Y2FzZSAyOnJldHVybiByLmFicnVwdCgicmV0dXJuIixyLnNlbnQpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGkpfSkpKX0seD1mdW5jdGlvbigpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gcy5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSxlLm5leHQ9MyxvLnNpZ25PdXQoKTtjYXNlIDM6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGUuc2VudCk7Y2FzZSA0OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpfSxfPWZ1bmN0aW9uKCl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9MixvLmdldFNpZ25PdXRVUkwoKTtjYXNlIDI6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGUuc2VudCk7Y2FzZSAzOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpfSxFPWZ1bmN0aW9uKGUpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsdS5yZXF1ZXN0Q3VzdG9tR3JhbnQoZSk7Y2FzZSAyOnJldHVybiB0LmFicnVwdCgicmV0dXJuIix0LnNlbnQpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKX0sVD1mdW5jdGlvbigpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5wcmV2PTAsZS5uZXh0PTMsdS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtjYXNlIDM6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGUuc2VudCk7Y2FzZSA2OnJldHVybiBlLnByZXY9NixlLnQwPWUuY2F0Y2goMCksZS5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZWplY3QoZS50MCkpO2Nhc2UgOTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsbnVsbCxbWzAsNl1dKX0pKSl9LEE9ZnVuY3Rpb24oKXtyZXR1cm4gby5yZXZva2VBY2Nlc3NUb2tlbigpLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIHMuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCksUHJvbWlzZS5yZXNvbHZlKCEwKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfSkpfSxSPWZ1bmN0aW9uKCl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLmFicnVwdCgicmV0dXJuIix1LmdldEJhc2ljVXNlckluZm8oKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpfSxDPWZ1bmN0aW9uKCl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLmFicnVwdCgicmV0dXJuIix1LmdldERlY29kZWRJRFRva2VuKCkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUpfSkpKX0sUD1mdW5jdGlvbigpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsdS5nZXRDcnlwdG9IZWxwZXIoKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpfSxEPWZ1bmN0aW9uKCl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLmFicnVwdCgicmV0dXJuIix1LmdldERlY29kZWRJRFBJRFRva2VuKCkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUpfSkpKX0sTz1mdW5jdGlvbigpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsdS5nZXRJRFRva2VuKCkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUpfSkpKX0sST1mdW5jdGlvbigpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsdS5nZXRPSURDU2VydmljZUVuZHBvaW50cygpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSl9LEw9ZnVuY3Rpb24oKXtyZXR1cm4gdS5nZXRBY2Nlc3NUb2tlbigpfSxVPWZ1bmN0aW9uKCl7cmV0dXJuIHUuaXNBdXRoZW50aWNhdGVkKCl9LEg9ZnVuY3Rpb24oZSl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9MixjLnNldFNlc3Npb25EYXRhUGFyYW1ldGVyKCJzZXNzaW9uX3N0YXRlIixlKTtjYXNlIDI6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iKTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0KX0pKSl9LE09ZnVuY3Rpb24oZSl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9MixvLnVwZGF0ZUNvbmZpZyhlKTtjYXNlIDI6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iKTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0KX0pKSl9LGo9ZnVuY3Rpb24oKXtyZXR1cm4gUyh2b2lkIDAsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGMuZ2V0Q29uZmlnRGF0YSgpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSl9LG4uYWJydXB0KCJyZXR1cm4iLHtkaXNhYmxlSHR0cEhhbmRsZXI6bSxlbmFibGVIdHRwSGFuZGxlcjp5LGdldEFjY2Vzc1Rva2VuOkwsZ2V0QXV0aG9yaXphdGlvblVSTDp3LGdldEJhc2ljVXNlckluZm86UixnZXRDb25maWdEYXRhOmosZ2V0Q3J5cHRvSGVscGVyOlAsZ2V0RGVjb2RlZElEUElEVG9rZW46RCxnZXREZWNvZGVkSURUb2tlbjpDLGdldElEVG9rZW46TyxnZXRPSURDU2VydmljZUVuZHBvaW50czpJLGdldFNpZ25PdXRVUkw6XyxodHRwUmVxdWVzdDp2LGh0dHBSZXF1ZXN0QWxsOmcsaXNBdXRoZW50aWNhdGVkOlUscmVmcmVzaEFjY2Vzc1Rva2VuOlQscmVxdWVzdEFjY2Vzc1Rva2VuOmsscmVxdWVzdEN1c3RvbUdyYW50OkUscmV2b2tlQWNjZXNzVG9rZW46QSxzZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrOmQsc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrOmgsc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s6cCxzZXRTZXNzaW9uU3RhdGU6SCxzaWduT3V0Ongsc3RhcnRBdXRvUmVmcmVzaFRva2VuOmIsdXBkYXRlQ29uZmlnOk19KTtjYXNlIDQxOmNhc2UiZW5kIjpyZXR1cm4gbi5zdG9wKCl9fSksbil9KSkpfSxVYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxyKXtvKHRoaXMsZSksdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQ9dCx0aGlzLl9kYXRhTGF5ZXI9dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGF0YUxheWVyKCksdGhpcy5fc3BhSGVscGVyPXJ9cmV0dXJuIHUoZSxbe2tleToiZW5hYmxlSHR0cEhhbmRsZXIiLHZhbHVlOmZ1bmN0aW9uKGUpeyhudWxsPT1lP3ZvaWQgMDplLmVuYWJsZUhhbmRsZXIpJiZlLmVuYWJsZUhhbmRsZXIoKX19LHtrZXk6ImRpc2FibGVIdHRwSGFuZGxlciIsdmFsdWU6ZnVuY3Rpb24oZSl7KG51bGw9PWU/dm9pZCAwOmUuZGlzYWJsZUhhbmRsZXIpJiZlLmRpc2FibGVIYW5kbGVyKCl9fSx7a2V5OiJpbml0aWFsaXplU2Vzc2lvbk1hbmdlciIsdmFsdWU6ZnVuY3Rpb24oZSx0LHIsbixhKXt2YXIgaSxvLHM7YS5pbml0aWFsaXplKGUuY2xpZW50SUQsbnVsbCE9PShpPXQuY2hlY2tTZXNzaW9uSWZyYW1lKSYmdm9pZCAwIT09aT9pOiIiLHIsbnVsbCE9PShvPWUuY2hlY2tTZXNzaW9uSW50ZXJ2YWwpJiZ2b2lkIDAhPT1vP286MyxudWxsIT09KHM9ZS5zZXNzaW9uUmVmcmVzaEludGVydmFsKSYmdm9pZCAwIT09cz9zOjMwMCxlLnNpZ25JblJlZGlyZWN0VVJMLG4pfX0se2tleToicmVxdWVzdEN1c3RvbUdyYW50Iix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuLGEsaTtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG8oKXt2YXIgcyx1LGMsZixsLGg9dGhpcztyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKG8pe2Zvcig7Oylzd2l0Y2goby5wcmV2PW8ubmV4dCl7Y2FzZSAwOmlmKHM9ITAsdT0hMSwhKG51bGw9PWU/dm9pZCAwOmUudG9rZW5FbmRwb2ludCkpe28ubmV4dD0zOTticmVha31yZXR1cm4gcz0hMSxjPTAsby50MD1bXSxvLnQxPWIsby5uZXh0PTksdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtjYXNlIDk6aWYoby50ND1uPW8uc2VudCxvLnQzPW51bGw9PT1vLnQ0LG8udDMpe28ubmV4dD0xMzticmVha31vLnQzPXZvaWQgMD09PW47Y2FzZSAxMzppZighby50Myl7by5uZXh0PTE3O2JyZWFrfW8udDU9dm9pZCAwLG8ubmV4dD0xODticmVhaztjYXNlIDE3Om8udDU9bi5yZXNvdXJjZVNlcnZlclVSTHM7Y2FzZSAxODppZihvLnQ2PWE9by50NSxvLnQyPW51bGwhPT1vLnQ2LCFvLnQyKXtvLm5leHQ9MjI7YnJlYWt9by50Mj12b2lkIDAhPT1hO2Nhc2UgMjI6aWYoIW8udDIpe28ubmV4dD0yNjticmVha31vLnQ3PWEsby5uZXh0PTI3O2JyZWFrO2Nhc2UgMjY6by50Nz1bXTtjYXNlIDI3Om8udDg9by50NyxvLnQ5PSgwLG8udDEpKG8udDgpLG8udDEwPVtlLmJhc2VVcmxdLGY9by50MC5jb25jYXQuY2FsbChvLnQwLG8udDksby50MTApO2Nhc2UgMzE6aWYoIShjPGYubGVuZ3RoKSl7by5uZXh0PTM5O2JyZWFrfWlmKCEobD1mW2NdKXx8IShudWxsPT09KGk9ZS50b2tlbkVuZHBvaW50KXx8dm9pZCAwPT09aT92b2lkIDA6aS5zdGFydHNXaXRoKGwpKSl7by5uZXh0PTM2O2JyZWFrfXJldHVybiB1PSEwLG8uYWJydXB0KCJicmVhayIsMzkpO2Nhc2UgMzY6YysrLG8ubmV4dD0zMTticmVhaztjYXNlIDM5OmlmKGUuc2hvdWxkUmVwbGF5QWZ0ZXJSZWZyZXNoJiZ0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihZLEpTT04uc3RyaW5naWZ5KGUpKSwhcyYmIXUpe28ubmV4dD00NDticmVha31yZXR1cm4gby5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQucmVxdWVzdEN1c3RvbUdyYW50KGUpLnRoZW4oKGZ1bmN0aW9uKG4pe3JldHVybiBTKGgsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gYSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6aWYodCYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQoZSksIWUucmV0dXJuc1Nlc3Npb24pe3IubmV4dD02O2JyZWFrfXJldHVybiB0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLHIuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKSk7Y2FzZSA2OnJldHVybiByLmFicnVwdCgicmV0dXJuIixuKTtjYXNlIDc6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxhLHRoaXMpfSkpKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfSkpKTtjYXNlIDQ0OnJldHVybiBvLmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlamVjdChuZXcgSSgiU1BBLU1BSU5fVEhSRUFEX0NMSUVOVC1SQ0ctSVYwMSIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIHRva2VuIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIikpKTtjYXNlIDQ1OmNhc2UiZW5kIjpyZXR1cm4gby5zdG9wKCl9fSksbyx0aGlzKX0pKSl9fSx7a2V5OiJnZXRDdXN0b21HcmFudENvbmZpZ0RhdGEiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7dmFyIHQ7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoWSk7Y2FzZSAyOmlmKCEodD1lLnNlbnQpKXtlLm5leHQ9NzticmVha31yZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsSlNPTi5wYXJzZSh0KSk7Y2FzZSA3OnJldHVybiBlLmFicnVwdCgicmV0dXJuIixudWxsKTtjYXNlIDg6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX19LHtrZXk6InJlZnJlc2hBY2Nlc3NUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIG47cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5wcmV2PTAsdC5uZXh0PTMsdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQucmVmcmVzaEFjY2Vzc1Rva2VuKCk7Y2FzZSAzOnJldHVybiB0Lm5leHQ9NSx0aGlzLmdldEN1c3RvbUdyYW50Q29uZmlnRGF0YSgpO2Nhc2UgNTppZighKG49dC5zZW50KSl7dC5uZXh0PTk7YnJlYWt9cmV0dXJuIHQubmV4dD05LHRoaXMucmVxdWVzdEN1c3RvbUdyYW50KG4sZSk7Y2FzZSA5OnJldHVybiB0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLHQuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKSk7Y2FzZSAxMzpyZXR1cm4gdC5wcmV2PTEzLHQudDA9dC5jYXRjaCgwKSx0LmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlamVjdCh0LnQwKSk7Y2FzZSAxNjpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyxbWzAsMTNdXSl9KSkpfX0se2tleToiaHR0cFJlcXVlc3QiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGEsaSxvKXt2YXIgcyx1O3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gYygpe3ZhciBmLGwsaCxwLGQsdj10aGlzO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oYyl7Zm9yKDs7KXN3aXRjaChjLnByZXY9Yy5uZXh0KXtjYXNlIDA6cmV0dXJuIGY9ITEsYy5uZXh0PTMsdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtjYXNlIDM6cmV0dXJuIGw9Yy5zZW50LGg9MCxjLnQwPVtdLGMudDE9YixjLm5leHQ9OSxudWxsPT1sP3ZvaWQgMDpsLnJlc291cmNlU2VydmVyVVJMcztjYXNlIDk6aWYoYy50Mz1zPWMuc2VudCxjLnQyPW51bGwhPT1jLnQzLCFjLnQyKXtjLm5leHQ9MTM7YnJlYWt9Yy50Mj12b2lkIDAhPT1zO2Nhc2UgMTM6aWYoIWMudDIpe2MubmV4dD0xNzticmVha31jLnQ0PXMsYy5uZXh0PTE4O2JyZWFrO2Nhc2UgMTc6Yy50ND1bXTtjYXNlIDE4OmMudDU9Yy50NCxjLnQ2PSgwLGMudDEpKGMudDUpLGMudDc9W2wuYmFzZVVybF0scD1jLnQwLmNvbmNhdC5jYWxsKGMudDAsYy50NixjLnQ3KTtjYXNlIDIyOmlmKCEoaDxwLmxlbmd0aCkpe2MubmV4dD0zMDticmVha31pZighKGQ9cFtoXSl8fCEobnVsbD09PSh1PW51bGw9PXQ/dm9pZCAwOnQudXJsKXx8dm9pZCAwPT09dT92b2lkIDA6dS5zdGFydHNXaXRoKGQpKSl7Yy5uZXh0PTI3O2JyZWFrfXJldHVybiBmPSEwLGMuYWJydXB0KCJicmVhayIsMzApO2Nhc2UgMjc6aCsrLGMubmV4dD0yMjticmVhaztjYXNlIDMwOmlmKCFmKXtjLm5leHQ9MzQ7YnJlYWt9cmV0dXJuIGMuYWJydXB0KCJyZXR1cm4iLGUucmVxdWVzdCh0KS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpfSkpLmNhdGNoKChmdW5jdGlvbihzKXtyZXR1cm4gUyh2LHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHUoKXt2YXIgYyxmLGwsaCxwO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6aWYoNDAxIT09KG51bGw9PT0oYz1udWxsPT1zP3ZvaWQgMDpzLnJlc3BvbnNlKXx8dm9pZCAwPT09Yz92b2lkIDA6Yy5zdGF0dXMpJiYobnVsbD09cz92b2lkIDA6cy5yZXNwb25zZSkpe3IubmV4dD0zMTticmVha31yZXR1cm4gci5wcmV2PTEsci5uZXh0PTQsdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4obyk7Y2FzZSA0Omg9ci5zZW50LHIubmV4dD0xNTticmVhaztjYXNlIDc6aWYoci5wcmV2PTcsci50MD1yLmNhdGNoKDEpLCFuKXtyLm5leHQ9MTQ7YnJlYWt9aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGEpe3IubmV4dD0xMzticmVha31yZXR1cm4gci5uZXh0PTEzLGEoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtjb2RlOlZ9KSk7Y2FzZSAxMzoiZnVuY3Rpb24iPT10eXBlb2YgaSYmaSgpO2Nhc2UgMTQ6dGhyb3cgbmV3IEkoIlNQQS1BVVRIX0hFTFBFUi1IUi1TRTAxIixudWxsIT09KGY9bnVsbD09PXIudDB8fHZvaWQgMD09PXIudDA/dm9pZCAwOnIudDAubmFtZSkmJnZvaWQgMCE9PWY/ZjoiUmVmcmVzaCB0b2tlbiByZXF1ZXN0IGZhaWxlZC4iLG51bGwhPT0obD1udWxsPT09ci50MHx8dm9pZCAwPT09ci50MD92b2lkIDA6ci50MC5tZXNzYWdlKSYmdm9pZCAwIT09bD9sOiJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcmVmcmVzaCB0aGUgYWNjZXNzIHRva2VuIGZvbGxvd2luZyBhIDQwMSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuIik7Y2FzZSAxNTppZighaCl7ci5uZXh0PTMxO2JyZWFrfXJldHVybiByLnByZXY9MTYsci5uZXh0PTE5LGUucmVxdWVzdCh0KTtjYXNlIDE5OnJldHVybiBwPXIuc2VudCxyLmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlc29sdmUocCkpO2Nhc2UgMjM6aWYoci5wcmV2PTIzLHIudDE9ci5jYXRjaCgxNiksIW4pe3IubmV4dD0zMDticmVha31pZigiZnVuY3Rpb24iIT10eXBlb2YgYSl7ci5uZXh0PTI5O2JyZWFrfXJldHVybiByLm5leHQ9MjksYShyLnQxKTtjYXNlIDI5OiJmdW5jdGlvbiI9PXR5cGVvZiBpJiZpKCk7Y2FzZSAzMDpyZXR1cm4gci5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZWplY3Qoci50MSkpO2Nhc2UgMzE6aWYoIW4pe3IubmV4dD0zNjticmVha31pZigiZnVuY3Rpb24iIT10eXBlb2YgYSl7ci5uZXh0PTM1O2JyZWFrfXJldHVybiByLm5leHQ9MzUsYShzKTtjYXNlIDM1OiJmdW5jdGlvbiI9PXR5cGVvZiBpJiZpKCk7Y2FzZSAzNjpyZXR1cm4gci5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZWplY3QocykpO2Nhc2UgMzc6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSx1LHRoaXMsW1sxLDddLFsxNiwyM11dKX0pKSl9KSkpO2Nhc2UgMzQ6cmV0dXJuIGMuYWJydXB0KCJyZXR1cm4iLFByb21pc2UucmVqZWN0KG5ldyBJKCJTUEEtQVVUSF9IRUxQRVItSFItSVYwMiIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIikpKTtjYXNlIDM1OmNhc2UiZW5kIjpyZXR1cm4gYy5zdG9wKCl9fSksYyx0aGlzKX0pKSl9fSx7a2V5OiJodHRwUmVxdWVzdEFsbCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4sYSxpKXt2YXIgbyxzLHU7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBjKCl7dmFyIGYsbCxoLHAsZCx2LGcseSxtLHcsaz10aGlzO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oYyl7Zm9yKDs7KXN3aXRjaChjLnByZXY9Yy5uZXh0KXtjYXNlIDA6cmV0dXJuIGY9ITAsYy5uZXh0PTMsdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtjYXNlIDM6bD1jLnNlbnQsaD1fKGUpLGMucHJldj01LGgucygpO2Nhc2UgNzppZigocD1oLm4oKSkuZG9uZSl7Yy5uZXh0PTUwO2JyZWFrfXJldHVybiBkPXAudmFsdWUsdj0hMSxnPTAsYy50MD1bXSxjLnQxPWIsYy5uZXh0PTE1LGw7Y2FzZSAxNTppZihjLnQ0PW89Yy5zZW50LGMudDM9bnVsbD09PWMudDQsYy50Myl7Yy5uZXh0PTE5O2JyZWFrfWMudDM9dm9pZCAwPT09bztjYXNlIDE5OmlmKCFjLnQzKXtjLm5leHQ9MjM7YnJlYWt9Yy50NT12b2lkIDAsYy5uZXh0PTI0O2JyZWFrO2Nhc2UgMjM6Yy50NT1vLnJlc291cmNlU2VydmVyVVJMcztjYXNlIDI0OmlmKGMudDY9cz1jLnQ1LGMudDI9bnVsbCE9PWMudDYsIWMudDIpe2MubmV4dD0yODticmVha31jLnQyPXZvaWQgMCE9PXM7Y2FzZSAyODppZighYy50Mil7Yy5uZXh0PTMyO2JyZWFrfWMudDc9cyxjLm5leHQ9MzM7YnJlYWs7Y2FzZSAzMjpjLnQ3PVtdO2Nhc2UgMzM6Yy50OD1jLnQ3LGMudDk9KDAsYy50MSkoYy50OCksYy50MTA9W2wuYmFzZVVybF0seT1jLnQwLmNvbmNhdC5jYWxsKGMudDAsYy50OSxjLnQxMCk7Y2FzZSAzNzppZighKGc8eS5sZW5ndGgpKXtjLm5leHQ9NDU7YnJlYWt9aWYoIShtPXlbZ10pfHwhKG51bGw9PT0odT1kLnVybCl8fHZvaWQgMD09PXU/dm9pZCAwOnUuc3RhcnRzV2l0aChtKSkpe2MubmV4dD00MjticmVha31yZXR1cm4gdj0hMCxjLmFicnVwdCgiYnJlYWsiLDQ1KTtjYXNlIDQyOmcrKyxjLm5leHQ9Mzc7YnJlYWs7Y2FzZSA0NTppZih2KXtjLm5leHQ9NDg7YnJlYWt9cmV0dXJuIGY9ITEsYy5hYnJ1cHQoImJyZWFrIiw1MCk7Y2FzZSA0ODpjLm5leHQ9NzticmVhaztjYXNlIDUwOmMubmV4dD01NTticmVhaztjYXNlIDUyOmMucHJldj01MixjLnQxMT1jLmNhdGNoKDUpLGguZShjLnQxMSk7Y2FzZSA1NTpyZXR1cm4gYy5wcmV2PTU1LGguZigpLGMuZmluaXNoKDU1KTtjYXNlIDU4OmlmKHc9W10sIWYpe2MubmV4dD02NDticmVha31yZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt3LnB1c2godC5yZXF1ZXN0KGUpKX0pKSxjLmFicnVwdCgicmV0dXJuIiwobnVsbD09dD92b2lkIDA6dC5hbGwpJiZ0LmFsbCh3KS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtyZXR1cm4gUyhrLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG8oKXt2YXIgcyx1LGMsZixsPXRoaXM7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihvKXtmb3IoOzspc3dpdGNoKG8ucHJldj1vLm5leHQpe2Nhc2UgMDppZig0MDEhPT0obnVsbD09PShzPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLnN0YXR1cykmJihudWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKSl7by5uZXh0PTE3O2JyZWFrfXJldHVybiBvLnByZXY9MSxvLm5leHQ9NCx0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZWZyZXNoQWNjZXNzVG9rZW4oKTtjYXNlIDQ6Zj1vLnNlbnQsby5uZXh0PTE1O2JyZWFrO2Nhc2UgNzppZihvLnByZXY9NyxvLnQwPW8uY2F0Y2goMSksIW4pe28ubmV4dD0xNDticmVha31pZigiZnVuY3Rpb24iIT10eXBlb2YgYSl7by5uZXh0PTEzO2JyZWFrfXJldHVybiBvLm5leHQ9MTMsYShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkse2NvZGU6Vn0pKTtjYXNlIDEzOiJmdW5jdGlvbiI9PXR5cGVvZiBpJiZpKCk7Y2FzZSAxNDp0aHJvdyBuZXcgSSgiU1BBLUFVVEhfSEVMUEVSLUhSQS1TRTAxIixudWxsIT09KHU9bnVsbD09PW8udDB8fHZvaWQgMD09PW8udDA/dm9pZCAwOm8udDAubmFtZSkmJnZvaWQgMCE9PXU/dToiUmVmcmVzaCB0b2tlbiByZXF1ZXN0IGZhaWxlZC4iLG51bGwhPT0oYz1udWxsPT09by50MHx8dm9pZCAwPT09by50MD92b2lkIDA6by50MC5tZXNzYWdlKSYmdm9pZCAwIT09Yz9jOiJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcmVmcmVzaCB0aGUgYWNjZXNzIHRva2VuIGZvbGxvd2luZyBhIDQwMSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuIik7Y2FzZSAxNTppZighZil7by5uZXh0PTE3O2JyZWFrfXJldHVybiBvLmFicnVwdCgicmV0dXJuIix0LmFsbCYmdC5hbGwodykudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIFMobCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDppZighbil7dC5uZXh0PTU7YnJlYWt9aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGEpe3QubmV4dD00O2JyZWFrfXJldHVybiB0Lm5leHQ9NCxhKGUpO2Nhc2UgNDoiZnVuY3Rpb24iPT10eXBlb2YgaSYmaSgpO2Nhc2UgNTpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZWplY3QoZSkpO2Nhc2UgNjpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKX0pKSk7Y2FzZSAxNzppZighbil7by5uZXh0PTIyO2JyZWFrfWlmKCJmdW5jdGlvbiIhPXR5cGVvZiBhKXtvLm5leHQ9MjE7YnJlYWt9cmV0dXJuIG8ubmV4dD0yMSxhKGUpO2Nhc2UgMjE6ImZ1bmN0aW9uIj09dHlwZW9mIGkmJmkoKTtjYXNlIDIyOnJldHVybiBvLmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlamVjdChlKSk7Y2FzZSAyMzpjYXNlImVuZCI6cmV0dXJuIG8uc3RvcCgpfX0pLG8sdGhpcyxbWzEsN11dKX0pKSl9KSkpO2Nhc2UgNjQ6dGhyb3cgbmV3IEkoIlNQQS1BVVRIX0hFTFBFUi1IUkEtSVYwMiIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIik7Y2FzZSA2NTpjYXNlImVuZCI6cmV0dXJuIGMuc3RvcCgpfX0pLGMsdGhpcyxbWzUsNTIsNTUsNThdXSl9KSkpfX0se2tleToicmVxdWVzdEFjY2Vzc1Rva2VuIix2YWx1ZTpmdW5jdGlvbihlLHQsbixhLGkpe3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbygpe3ZhciBzLHUsYz10aGlzO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24obyl7Zm9yKDs7KXN3aXRjaChvLnByZXY9by5uZXh0KXtjYXNlIDA6cmV0dXJuIG8ubmV4dD0yLHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCk7Y2FzZSAyOmlmKChzPW8uc2VudCkuc3RvcmFnZSE9PVUuQnJvd3Nlck1lbW9yeXx8IXMuZW5hYmxlUEtDRXx8IXQpe28ubmV4dD05O2JyZWFrfXJldHVybiB1PWNyLmdldFBLQ0UoTC5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKHQpKSxvLm5leHQ9Nyx0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5zZXRQS0NFQ29kZShMLmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0odCksdSk7Y2FzZSA3Om8ubmV4dD0xMjticmVhaztjYXNlIDk6aWYocy5zdG9yYWdlIT09VS5XZWJXb3JrZXJ8fCFhKXtvLm5leHQ9MTI7YnJlYWt9cmV0dXJuIG8ubmV4dD0xMix0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5zZXRQS0NFQ29kZShhLG51bGwhPWk/aToiIik7Y2FzZSAxMjppZighZSl7by5uZXh0PTE0O2JyZWFrfXJldHVybiBvLmFicnVwdCgicmV0dXJuIix0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZXF1ZXN0QWNjZXNzVG9rZW4oZSxudWxsIT10P3Q6IiIsbnVsbCE9aT9pOiIiKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBTKGMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYocy5zdG9yYWdlPT09VS5XZWJXb3JrZXIpe2UubmV4dD0xMDticmVha31yZXR1cm4gZS50MD1jcixlLm5leHQ9NCx0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRTaWduT3V0VVJMKCk7Y2FzZSA0OmUudDE9ZS5zZW50LGUudDAuc2V0U2lnbk91dFVSTC5jYWxsKGUudDAsZS50MSksdGhpcy5fc3BhSGVscGVyJiYodGhpcy5fc3BhSGVscGVyLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHRoaXMuX3NwYUhlbHBlci5yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KCkpLG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZzLmVuYWJsZU9JRENTZXNzaW9uTWFuYWdlbWVudCYmbigpLGUubmV4dD0xMTticmVhaztjYXNlIDEwOnRoaXMuX3NwYUhlbHBlciYmdGhpcy5fc3BhSGVscGVyLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoKTtjYXNlIDExOnJldHVybiBlLmFicnVwdCgicmV0dXJuIix0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRCYXNpY1VzZXJJbmZvKCkpO2Nhc2UgMTI6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfSkpKTtjYXNlIDE0OnJldHVybiBvLmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlamVjdChuZXcgSSgiU1BBLUFVVEhfSEVMUEVSLVJBVDEtTkYwMSIsIk5vIGF1dGhvcml6YXRpb24gY29kZS4iLCJObyBhdXRob3JpemF0aW9uIGNvZGUgd2FzIGZvdW5kLiIpKSk7Y2FzZSAxNTpjYXNlImVuZCI6cmV0dXJuIG8uc3RvcCgpfX0pLG8sdGhpcyl9KSkpfX0se2tleToidHJ5U2lnbkluU2lsZW50bHkiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgYTtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGkoKXt2YXIgbyxzLHUsYz10aGlzO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oaSl7Zm9yKDs7KXN3aXRjaChpLnByZXY9aS5uZXh0KXtjYXNlIDA6aWYoIWNyLmlzSW5pdGlhbGl6ZWRTaWxlbnRTaWduSW4oKSl7aS5uZXh0PTQ7YnJlYWt9cmV0dXJuIGkubmV4dD0zLG4ucmVjZWl2ZVByb21wdE5vbmVSZXNwb25zZSgpO2Nhc2UgMzpyZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZXNvbHZlKHthbGxvd2VkU2NvcGVzOiIiLGRpc3BsYXlOYW1lOiIiLGVtYWlsOiIiLHNlc3Npb25TdGF0ZToiIixzdWI6IiIsdGVuYW50RG9tYWluOiIiLHVzZXJuYW1lOiIifSkpO2Nhc2UgNDpyZXR1cm4gbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicnBJRnJhbWUiKSxzPW51bGw9PT0oYT1udWxsPT1vP3ZvaWQgMDpvLmNvbnRlbnREb2N1bWVudCl8fHZvaWQgMD09PWE/dm9pZCAwOmEuZ2V0RWxlbWVudEJ5SWQoInByb21wdE5vbmVJRnJhbWUiKSxpLnByZXY9NixpLm5leHQ9OSxlKCk7Y2FzZSA5OnU9aS5zZW50LHMuc3JjPXUsaS5uZXh0PTE2O2JyZWFrO2Nhc2UgMTM6cmV0dXJuIGkucHJldj0xMyxpLnQwPWkuY2F0Y2goNiksaS5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZWplY3QoaS50MCkpO2Nhc2UgMTY6cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLG5ldyBQcm9taXNlKChmdW5jdGlvbihlLG4pe3ZhciBhPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZSghMSl9KSwxZTQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoZnVuY3Rpb24gaShvKXtyZXR1cm4gUyhjLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHMoKXt2YXIgdSxjLGYsbCxoO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6ImNoZWNrX3Nlc3Npb25fc2lnbmVkX291dCI9PShudWxsPT0oaD1vLmRhdGEpP3ZvaWQgMDpoLnR5cGUpJiYod2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGkpLGNsZWFyVGltZW91dChhKSxlKCExKSksImNoZWNrX3Nlc3Npb25fc2lnbmVkX2luIj09KG51bGw9PWg/dm9pZCAwOmgudHlwZSkmJihudWxsPT09KHU9bnVsbD09aD92b2lkIDA6aC5kYXRhKXx8dm9pZCAwPT09dT92b2lkIDA6dS5jb2RlKSYmdChudWxsPT09KGM9bnVsbD09aD92b2lkIDA6aC5kYXRhKXx8dm9pZCAwPT09Yz92b2lkIDA6Yy5jb2RlLG51bGw9PT0oZj1udWxsPT1oP3ZvaWQgMDpoLmRhdGEpfHx2b2lkIDA9PT1mP3ZvaWQgMDpmLnNlc3Npb25TdGF0ZSxudWxsPT09KGw9bnVsbD09aD92b2lkIDA6aC5kYXRhKXx8dm9pZCAwPT09bD92b2lkIDA6bC5zdGF0ZSkudGhlbigoZnVuY3Rpb24odCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGkpLGUodCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixpKSxuKGUpfSkpLmZpbmFsbHkoKGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGEpfSkpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLHMpfSkpKX0pKX0pKSk7Y2FzZSAxNzpjYXNlImVuZCI6cmV0dXJuIGkuc3RvcCgpfX0pLGksbnVsbCxbWzYsMTNdXSl9KSkpfX0se2tleToiaGFuZGxlU2lnbkluIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBhKCl7dmFyIGksbyxzLHUsYztyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpO2Nhc2UgMjpyZXR1cm4gaT1yLnNlbnQsci5uZXh0PTUsZSgpO2Nhc2UgNTppZighci5zZW50KXtyLm5leHQ9NzticmVha31yZXR1cm4gci5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZXNvbHZlKHthbGxvd2VkU2NvcGVzOiIiLGRpc3BsYXlOYW1lOiIiLGVtYWlsOiIiLHNlc3Npb25TdGF0ZToiIixzdWI6IiIsdGVuYW50RG9tYWluOiIiLHVzZXJuYW1lOiIifSkpO2Nhc2UgNzppZihpLnN0b3JhZ2U9PT1VLldlYldvcmtlcil7ci5uZXh0PTE5O2JyZWFrfXJldHVybiByLm5leHQ9MTAsdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuaXNBdXRoZW50aWNhdGVkKCk7Y2FzZSAxMDppZighci5zZW50KXtyLm5leHQ9MTk7YnJlYWt9cmV0dXJuIHRoaXMuX3NwYUhlbHBlci5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSx0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLGkuZW5hYmxlT0lEQ1Nlc3Npb25NYW5hZ2VtZW50JiZ0KCksci50MD1Qcm9taXNlLHIubmV4dD0xNyx0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRCYXNpY1VzZXJJbmZvKCk7Y2FzZSAxNzpyZXR1cm4gci50MT1yLnNlbnQsci5hYnJ1cHQoInJldHVybiIsci50MC5yZXNvbHZlLmNhbGwoci50MCxyLnQxKSk7Y2FzZSAxOTppZihvPW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoVykscz1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KHopLCFvKXtyLm5leHQ9Mjc7YnJlYWt9dGhyb3codT1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSkuc2VhcmNoUGFyYW1zLmRlbGV0ZShXKSx1LnNlYXJjaFBhcmFtcy5kZWxldGUoeiksaGlzdG9yeS5wdXNoU3RhdGUobnVsbCxkb2N1bWVudC50aXRsZSx1LnRvU3RyaW5nKCkpLG5ldyBJKCJTUEEtQVVUSF9IRUxQRVItU0ktU0UwMSIsbyxudWxsIT1zP3M6IiIpO2Nhc2UgMjc6aWYoaS5zdG9yYWdlIT09VS5XZWJXb3JrZXJ8fCFuKXtyLm5leHQ9MzM7YnJlYWt9cmV0dXJuIHIubmV4dD0zMCxuKCk7Y2FzZSAzMDppZighKGM9ci5zZW50KSl7ci5uZXh0PTMzO2JyZWFrfXJldHVybiByLmFicnVwdCgicmV0dXJuIixjKTtjYXNlIDMzOmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksYSx0aGlzKX0pKSl9fSx7a2V5OiJnZXRCYXNpY1VzZXJJbmZvIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9fSx7a2V5OiJnZXREZWNvZGVkSURUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLmFicnVwdCgicmV0dXJuIix0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXREZWNvZGVkSURUb2tlbigpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX19LHtrZXk6ImdldERlY29kZWRJRFBJRFRva2VuIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldERlY29kZWRJRFRva2VuKCkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsdGhpcyl9KSkpfX0se2tleToiZ2V0Q3J5cHRvSGVscGVyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldENyeXB0b0hlbHBlcigpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX19LHtrZXk6ImdldElEVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0SURUb2tlbigpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX19LHtrZXk6ImdldE9JRENTZXJ2aWNlRW5kcG9pbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsdGhpcyl9KSkpfX0se2tleToiZ2V0QWNjZXNzVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QWNjZXNzVG9rZW4oKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9fSx7a2V5OiJnZXRJRFBBY2Nlc3NUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKTtjYXNlIDI6aWYodC50MT1lPXQuc2VudCx0LnQwPW51bGw9PT10LnQxLHQudDApe3QubmV4dD02O2JyZWFrfXQudDA9dm9pZCAwPT09ZTtjYXNlIDY6aWYoIXQudDApe3QubmV4dD0xMDticmVha310LnQyPXZvaWQgMCx0Lm5leHQ9MTE7YnJlYWs7Y2FzZSAxMDp0LnQyPWUuYWNjZXNzX3Rva2VuO2Nhc2UgMTE6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLHQudDIpO2Nhc2UgMTI6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImdldERhdGFMYXllciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YUxheWVyfX0se2tleToiaXNBdXRoZW50aWNhdGVkIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmlzQXV0aGVudGljYXRlZCgpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX19XSksZX0oKTshZnVuY3Rpb24oZSl7dmFyIHQsbj1zZWxmO24ub25tZXNzYWdlPWZ1bmN0aW9uKG4pe3ZhciBzPW4uZGF0YSx1PW4ucG9ydHM7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG4oKXt2YXIgYyxmLGwsaCxwLGQ7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDppZihwPXVbMF0scy50eXBlPT09Qnx8dCl7ci5uZXh0PTQ7YnJlYWt9cmV0dXJuIHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShuZXcgSSgiU1BBLUNMSUVOVF9XT1JLRVItT05NU0ctTkYwMSIsIlRoZSB3ZWIgd29ya2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuIiwiVGhlIGluaXRpYWxpemUgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gY2FuIGJlIGNhcnJpZWQgb3V0LiIpKSksci5hYnJ1cHQoInJldHVybiIpO2Nhc2UgNDpyLnQwPXMudHlwZSxyLm5leHQ9ci50MD09PUI/NzoiZ2V0X2F1dGhfdXJsIj09PXIudDA/MjI6InJlcXVlc3RfZ2V0X3Rva2VuIj09PXIudDA/MjQ6Imh0dHAtcmVxdWVzdCI9PT1yLnQwPzI2OiJodHRwLXJlcXVlc3QtYWxsIj09PXIudDA/Mjg6InNpZ24tb3V0Ij09PXIudDA/MzA6InJlcXVlc3QtY3VzdG9tLWdyYW50Ij09PXIudDA/NDQ6InJldm9rZS1hY2Nlc3MtdG9rZW4iPT09ci50MD80NjoiZ2V0LW9pZGMtc2VydmljZS1lbmRwb2ludHMiPT09ci50MD80ODoiZ2V0LWJhc2ljLXVzZXItaW5mbyI9PT1yLnQwPzYyOiJnZXQtZGVjb2RlZC1pZC10b2tlbiI9PT1yLnQwPzc2OiJnZXQtY3J5cHRvLWhlbHBlciI9PT1yLnQwPzkwOiJnZXRfaWRfdG9rZW4iPT09ci50MD8xMDQ6ImVuYWJsZV9odHRwX2hhbmRsZXIiPT09ci50MD8xMTg6ImRpc2FibGVfaHR0cF9oYW5kbGVyIj09PXIudDA/MTIxOiJpc19hdXRoZW50aWNhdGVkIj09PXIudDA/MTI0OiJnZXRfc2lnbl9vdXRfdXJsIj09PXIudDA/MTM4OiJyZWZyZXNoX2FjY2Vzcy10b2tlbiI9PT1yLnQwPzE1Mjoic3RhcnRfYXV0b19yZWZyZXNoX3Rva2VuIj09PXIudDA/MTY2OiJzZXRfc2Vzc2lvbl9zdGF0ZSI9PT1yLnQwPzE2ODoidXBkYXRlX2NvbmZpZyI9PT1yLnQwPzE4MjoiZ2V0X2NvbmZpZ19kYXRhIj09PXIudDA/MTk2OjIxMDticmVhaztjYXNlIDc6cmV0dXJuIHIucHJldj03LGQ9T2JqZWN0LmFzc2lnbih7fSxzLmRhdGEpLHIubmV4dD0xMSxMYShkLGUpO2Nhc2UgMTE6KHQ9ci5zZW50KS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKG8pLHQuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKGEpLHQuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2soaSkscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpLHIubmV4dD0yMTticmVhaztjYXNlIDE4OnIucHJldj0xOCxyLnQxPXIuY2F0Y2goNykscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKHIudDEpKTtjYXNlIDIxOnJldHVybiByLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAyMjpyZXR1cm4gdC5nZXRBdXRob3JpemF0aW9uVVJMKG51bGw9PXM/dm9pZCAwOnMuZGF0YSkudGhlbigoZnVuY3Rpb24oZSl7cC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKSxyLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAyNDpyZXR1cm4gdC5yZXF1ZXN0QWNjZXNzVG9rZW4obnVsbD09PShjPW51bGw9PXM/dm9pZCAwOnMuZGF0YSl8fHZvaWQgMD09PWM/dm9pZCAwOmMuY29kZSxudWxsPT09KGY9bnVsbD09cz92b2lkIDA6cy5kYXRhKXx8dm9pZCAwPT09Zj92b2lkIDA6Zi5zZXNzaW9uU3RhdGUsbnVsbD09PShsPW51bGw9PXM/dm9pZCAwOnMuZGF0YSl8fHZvaWQgMD09PWw/dm9pZCAwOmwucGtjZSxudWxsPT09KGg9bnVsbD09cz92b2lkIDA6cy5kYXRhKXx8dm9pZCAwPT09aD92b2lkIDA6aC5zdGF0ZSkudGhlbigoZnVuY3Rpb24oZSl7cC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKSxyLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAyNjpyZXR1cm4gdC5odHRwUmVxdWVzdChzLmRhdGEpLnRoZW4oKGZ1bmN0aW9uKGUpe3AucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3AucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSksci5hYnJ1cHQoImJyZWFrIiwyMTEpO2Nhc2UgMjg6cmV0dXJuIHQuaHR0cFJlcXVlc3RBbGwocy5kYXRhKS50aGVuKChmdW5jdGlvbihlKXtwLnBvc3RNZXNzYWdlKHVyLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtwLnBvc3RNZXNzYWdlKHVyLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpLHIuYWJydXB0KCJicmVhayIsMjExKTtjYXNlIDMwOnJldHVybiByLnByZXY9MzAsci50Mj1wLHIudDM9dXIsci5uZXh0PTM1LHQuc2lnbk91dCgpO2Nhc2UgMzU6ci50ND1yLnNlbnQsci50NT1yLnQzLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UuY2FsbChyLnQzLHIudDQpLHIudDIucG9zdE1lc3NhZ2UuY2FsbChyLnQyLHIudDUpLHIubmV4dD00MzticmVhaztjYXNlIDQwOnIucHJldj00MCxyLnQ2PXIuY2F0Y2goMzApLHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShyLnQ2KSk7Y2FzZSA0MzpyZXR1cm4gci5hYnJ1cHQoImJyZWFrIiwyMTEpO2Nhc2UgNDQ6cmV0dXJuIHQucmVxdWVzdEN1c3RvbUdyYW50KHMuZGF0YSkudGhlbigoZnVuY3Rpb24oZSl7cC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKSxyLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSA0NjpyZXR1cm4gdC5yZXZva2VBY2Nlc3NUb2tlbigpLnRoZW4oKGZ1bmN0aW9uKGUpe3AucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3AucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSksci5hYnJ1cHQoImJyZWFrIiwyMTEpO2Nhc2UgNDg6cmV0dXJuIHIucHJldj00OCxyLnQ3PXAsci50OD11cixyLm5leHQ9NTMsdC5nZXRPSURDU2VydmljZUVuZHBvaW50cygpO2Nhc2UgNTM6ci50OT1yLnNlbnQsci50MTA9ci50OC5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlLmNhbGwoci50OCxyLnQ5KSxyLnQ3LnBvc3RNZXNzYWdlLmNhbGwoci50NyxyLnQxMCksci5uZXh0PTYxO2JyZWFrO2Nhc2UgNTg6ci5wcmV2PTU4LHIudDExPXIuY2F0Y2goNDgpLHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShyLnQxMSkpO2Nhc2UgNjE6cmV0dXJuIHIuYWJydXB0KCJicmVhayIsMjExKTtjYXNlIDYyOnJldHVybiByLnByZXY9NjIsci50MTI9cCxyLnQxMz11cixyLm5leHQ9NjcsdC5nZXRCYXNpY1VzZXJJbmZvKCk7Y2FzZSA2NzpyLnQxND1yLnNlbnQsci50MTU9ci50MTMuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZS5jYWxsKHIudDEzLHIudDE0KSxyLnQxMi5wb3N0TWVzc2FnZS5jYWxsKHIudDEyLHIudDE1KSxyLm5leHQ9NzU7YnJlYWs7Y2FzZSA3MjpyLnByZXY9NzIsci50MTY9ci5jYXRjaCg2MikscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKHIudDE2KSk7Y2FzZSA3NTpyZXR1cm4gci5hYnJ1cHQoImJyZWFrIiwyMTEpO2Nhc2UgNzY6cmV0dXJuIHIucHJldj03NixyLnQxNz1wLHIudDE4PXVyLHIubmV4dD04MSx0LmdldERlY29kZWRJRFRva2VuKCk7Y2FzZSA4MTpyLnQxOT1yLnNlbnQsci50MjA9ci50MTguZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZS5jYWxsKHIudDE4LHIudDE5KSxyLnQxNy5wb3N0TWVzc2FnZS5jYWxsKHIudDE3LHIudDIwKSxyLm5leHQ9ODk7YnJlYWs7Y2FzZSA4NjpyLnByZXY9ODYsci50MjE9ci5jYXRjaCg3NikscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKHIudDIxKSk7Y2FzZSA4OTpyZXR1cm4gci5hYnJ1cHQoImJyZWFrIiwyMTEpO2Nhc2UgOTA6cmV0dXJuIHIucHJldj05MCxyLnQyMj1wLHIudDIzPXVyLHIubmV4dD05NSx0LmdldENyeXB0b0hlbHBlcigpO2Nhc2UgOTU6ci50MjQ9ci5zZW50LHIudDI1PXIudDIzLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UuY2FsbChyLnQyMyxyLnQyNCksci50MjIucG9zdE1lc3NhZ2UuY2FsbChyLnQyMixyLnQyNSksci5uZXh0PTEwMzticmVhaztjYXNlIDEwMDpyLnByZXY9MTAwLHIudDI2PXIuY2F0Y2goOTApLHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShyLnQyNikpO2Nhc2UgMTAzOnJldHVybiByLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAxMDQ6cmV0dXJuIHIucHJldj0xMDQsci50Mjc9cCxyLnQyOD11cixyLm5leHQ9MTA5LHQuZ2V0SURUb2tlbigpO2Nhc2UgMTA5OnIudDI5PXIuc2VudCxyLnQzMD1yLnQyOC5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlLmNhbGwoci50Mjgsci50MjkpLHIudDI3LnBvc3RNZXNzYWdlLmNhbGwoci50Mjcsci50MzApLHIubmV4dD0xMTc7YnJlYWs7Y2FzZSAxMTQ6ci5wcmV2PTExNCxyLnQzMT1yLmNhdGNoKDEwNCkscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKHIudDMxKSk7Y2FzZSAxMTc6cmV0dXJuIHIuYWJydXB0KCJicmVhayIsMjExKTtjYXNlIDExODpyZXR1cm4gdC5lbmFibGVIdHRwSGFuZGxlcigpLHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSgpKSxyLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAxMjE6cmV0dXJuIHQuZGlzYWJsZUh0dHBIYW5kbGVyKCkscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpLHIuYWJydXB0KCJicmVhayIsMjExKTtjYXNlIDEyNDpyZXR1cm4gci5wcmV2PTEyNCxyLnQzMj1wLHIudDMzPXVyLHIubmV4dD0xMjksdC5pc0F1dGhlbnRpY2F0ZWQoKTtjYXNlIDEyOTpyLnQzND1yLnNlbnQsci50MzU9ci50MzMuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZS5jYWxsKHIudDMzLHIudDM0KSxyLnQzMi5wb3N0TWVzc2FnZS5jYWxsKHIudDMyLHIudDM1KSxyLm5leHQ9MTM3O2JyZWFrO2Nhc2UgMTM0OnIucHJldj0xMzQsci50MzY9ci5jYXRjaCgxMjQpLHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShyLnQzNikpO2Nhc2UgMTM3OnJldHVybiByLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAxMzg6cmV0dXJuIHIucHJldj0xMzgsci50Mzc9cCxyLnQzOD11cixyLm5leHQ9MTQzLHQuZ2V0U2lnbk91dFVSTCgpO2Nhc2UgMTQzOnIudDM5PXIuc2VudCxyLnQ0MD1yLnQzOC5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlLmNhbGwoci50Mzgsci50MzkpLHIudDM3LnBvc3RNZXNzYWdlLmNhbGwoci50Mzcsci50NDApLHIubmV4dD0xNTE7YnJlYWs7Y2FzZSAxNDg6ci5wcmV2PTE0OCxyLnQ0MT1yLmNhdGNoKDEzOCkscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKHIudDQxKSk7Y2FzZSAxNTE6cmV0dXJuIHIuYWJydXB0KCJicmVhayIsMjExKTtjYXNlIDE1MjpyZXR1cm4gci5wcmV2PTE1MixyLnQ0Mj1wLHIudDQzPXVyLHIubmV4dD0xNTcsdC5yZWZyZXNoQWNjZXNzVG9rZW4oKTtjYXNlIDE1NzpyLnQ0ND1yLnNlbnQsci50NDU9ci50NDMuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZS5jYWxsKHIudDQzLHIudDQ0KSxyLnQ0Mi5wb3N0TWVzc2FnZS5jYWxsKHIudDQyLHIudDQ1KSxyLm5leHQ9MTY1O2JyZWFrO2Nhc2UgMTYyOnIucHJldj0xNjIsci50NDY9ci5jYXRjaCgxNTIpLHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShyLnQ0NikpO2Nhc2UgMTY1OnJldHVybiByLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAxNjY6dHJ5e3AucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh0LnN0YXJ0QXV0b1JlZnJlc2hUb2tlbigpKSl9Y2F0Y2goZSl7cC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1yZXR1cm4gci5hYnJ1cHQoImJyZWFrIiwyMTEpO2Nhc2UgMTY4OnJldHVybiByLnByZXY9MTY4LHIudDQ3PXAsci50NDg9dXIsci5uZXh0PTE3Myx0LnNldFNlc3Npb25TdGF0ZShudWxsPT1zP3ZvaWQgMDpzLmRhdGEpO2Nhc2UgMTczOnIudDQ5PXIuc2VudCxyLnQ1MD1yLnQ0OC5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlLmNhbGwoci50NDgsci50NDkpLHIudDQ3LnBvc3RNZXNzYWdlLmNhbGwoci50NDcsci50NTApLHIubmV4dD0xODE7YnJlYWs7Y2FzZSAxNzg6ci5wcmV2PTE3OCxyLnQ1MT1yLmNhdGNoKDE2OCkscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKHIudDUxKSk7Y2FzZSAxODE6cmV0dXJuIHIuYWJydXB0KCJicmVhayIsMjExKTtjYXNlIDE4MjpyZXR1cm4gci5wcmV2PTE4MixyLnQ1Mj1wLHIudDUzPXVyLHIubmV4dD0xODcsdC51cGRhdGVDb25maWcobnVsbD09cz92b2lkIDA6cy5kYXRhKTtjYXNlIDE4NzpyLnQ1ND1yLnNlbnQsci50NTU9ci50NTMuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZS5jYWxsKHIudDUzLHIudDU0KSxyLnQ1Mi5wb3N0TWVzc2FnZS5jYWxsKHIudDUyLHIudDU1KSxyLm5leHQ9MTk1O2JyZWFrO2Nhc2UgMTkyOnIucHJldj0xOTIsci50NTY9ci5jYXRjaCgxODIpLHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShyLnQ1NikpO2Nhc2UgMTk1OnJldHVybiByLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAxOTY6cmV0dXJuIHIucHJldj0xOTYsci50NTc9cCxyLnQ1OD11cixyLm5leHQ9MjAxLHQuZ2V0Q29uZmlnRGF0YSgpO2Nhc2UgMjAxOnIudDU5PXIuc2VudCxyLnQ2MD1yLnQ1OC5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlLmNhbGwoci50NTgsci50NTkpLHIudDU3LnBvc3RNZXNzYWdlLmNhbGwoci50NTcsci50NjApLHIubmV4dD0yMDk7YnJlYWs7Y2FzZSAyMDY6ci5wcmV2PTIwNixyLnQ2MT1yLmNhdGNoKDE5NikscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKHIudDYxKSk7Y2FzZSAyMDk6cmV0dXJuIHIuYWJydXB0KCJicmVhayIsMjExKTtjYXNlIDIxMDpudWxsPT1wfHxwLnBvc3RNZXNzYWdlKHVyLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UobmV3IEkoIlNQQS1DTElFTlRfV09SS0VSLU9OTVNHLUlWMDIiLCJUaGUgbWVzc2FnZSB0eXBlIGlzIGludmFsaWQuIiwiVGhlIG1lc3NhZ2UgdHlwZSBwcm92aWRlZCwgIi5jb25jYXQocy50eXBlLCIsIGlzIGludmFsaWQuIikpKSk7Y2FzZSAyMTE6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxuLG51bGwsW1s3LDE4XSxbMzAsNDBdLFs0OCw1OF0sWzYyLDcyXSxbNzYsODZdLFs5MCwxMDBdLFsxMDQsMTE0XSxbMTI0LDEzNF0sWzEzOCwxNDhdLFsxNTIsMTYyXSxbMTY4LDE3OF0sWzE4MiwxOTJdLFsxOTYsMjA2XV0pfSkpKX07dmFyIGE9ZnVuY3Rpb24oKXtuLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXF1ZXN0LXN0YXJ0In0pfSxpPWZ1bmN0aW9uKGUpe24ucG9zdE1lc3NhZ2Uoe2RhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSx0eXBlOiJyZXF1ZXN0LXN1Y2Nlc3MifSl9LG89ZnVuY3Rpb24oKXtuLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXF1ZXN0LWZpbmlzaCJ9KX19KChmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgVWEoZSx0KX0pKTtyZXR1cm57fX0oKTsKCg==",xF=null,HF=!1,function(t){return kF=kF||LF(JF,xF,HF),new Worker(kF,t)});!function(t){t.LocalStorage="localStorage",t.SessionStorage="sessionStorage",t.WebWorker="webWorker",t.BrowserMemory="browserMemory"}(UF||(UF={})),function(t){t.SignIn="sign-in",t.SignOut="sign-out",t.Initialize="initialize",t.HttpRequestStart="http-request-start",t.HttpRequestFinish="http-request-finish",t.HttpRequestError="http-request-error",t.HttpRequestSuccess="http-request-success",t.RevokeAccessToken="revoke-access-token",t.CustomGrant="custom-grant",t.SignOutFailed="sign-out-failed"}(TF||(TF={}));var AF,FF,zF,BF,jF,MF,QF,PF,EF,DF,OF,_F,qF,$F,tz,ez,nz,rz="Y2hlY2tTZXNzaW9u",iz=function(){function t(e,n){u(this,t),this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer(),this._spaHelper=n}return d(t,[{key:"enableHttpHandler",value:function(t){(null==t?void 0:t.enableHandler)&&t.enableHandler()}},{key:"disableHttpHandler",value:function(t){(null==t?void 0:t.disableHandler)&&t.disableHandler()}},{key:"initializeSessionManger",value:function(t,e,n,r,i){var c,a,o;i.initialize(t.clientID,null!==(c=e.checkSessionIframe)&&void 0!==c?c:"",n,null!==(a=t.checkSessionInterval)&&void 0!==a?a:3,null!==(o=t.sessionRefreshInterval)&&void 0!==o?o:300,t.signInRedirectURL,r)}},{key:"requestCustomGrant",value:function(t,e){var n,r,i;return rF(this,void 0,void 0,c().mark((function a(){var o,l,u,s,d,m=this;return c().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:if(o=!0,l=!1,!(null==t?void 0:t.tokenEndpoint)){a.next=39;break}return o=!1,u=0,a.t0=[],a.t1=V,a.next=9,this._dataLayer.getConfigData();case 9:if(a.t4=n=a.sent,a.t3=null===a.t4,a.t3){a.next=13;break}a.t3=void 0===n;case 13:if(!a.t3){a.next=17;break}a.t5=void 0,a.next=18;break;case 17:a.t5=n.resourceServerURLs;case 18:if(a.t6=r=a.t5,a.t2=null!==a.t6,!a.t2){a.next=22;break}a.t2=void 0!==r;case 22:if(!a.t2){a.next=26;break}a.t7=r,a.next=27;break;case 26:a.t7=[];case 27:a.t8=a.t7,a.t9=(0,a.t1)(a.t8),a.t10=[t.baseUrl],s=a.t0.concat.call(a.t0,a.t9,a.t10);case 31:if(!(u<s.length)){a.next=39;break}if(!(d=s[u])||!(null===(i=t.tokenEndpoint)||void 0===i?void 0:i.startsWith(d))){a.next=36;break}return l=!0,a.abrupt("break",39);case 36:u++,a.next=31;break;case 39:if(t.shouldReplayAfterRefresh&&this._dataLayer.setTemporaryDataParameter("custom_grant_config",JSON.stringify(t)),!o&&!l){a.next=44;break}return a.abrupt("return",this._authenticationClient.requestCustomGrant(t).then((function(n){return rF(m,void 0,void 0,c().mark((function r(){return c().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(e&&"function"==typeof e&&e(t),!t.returnsSession){r.next=6;break}return this._spaHelper.refreshAccessTokenAutomatically(),r.abrupt("return",this._authenticationClient.getBasicUserInfo());case 6:return r.abrupt("return",n);case 7:case"end":return r.stop()}}),r,this)})))})).catch((function(t){return Promise.reject(t)})));case 44:return a.abrupt("return",Promise.reject(new WF("SPA-MAIN_THREAD_CLIENT-RCG-IV01","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified token endpoint in this request cannot be found among the `resourceServerURLs`")));case 45:case"end":return a.stop()}}),a,this)})))}},{key:"getCustomGrantConfigData",value:function(){return rF(this,void 0,void 0,c().mark((function t(){var e;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this._dataLayer.getTemporaryDataParameter("custom_grant_config");case 2:if(!(e=t.sent)){t.next=7;break}return t.abrupt("return",JSON.parse(e));case 7:return t.abrupt("return",null);case 8:case"end":return t.stop()}}),t,this)})))}},{key:"refreshAccessToken",value:function(t){return rF(this,void 0,void 0,c().mark((function e(){var n;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,this._authenticationClient.refreshAccessToken();case 3:return e.next=5,this.getCustomGrantConfigData();case 5:if(!(n=e.sent)){e.next=9;break}return e.next=9,this.requestCustomGrant(n,t);case 9:return this._spaHelper.refreshAccessTokenAutomatically(),e.abrupt("return",this._authenticationClient.getBasicUserInfo());case 13:return e.prev=13,e.t0=e.catch(0),e.abrupt("return",Promise.reject(e.t0));case 16:case"end":return e.stop()}}),e,this,[[0,13]])})))}},{key:"httpRequest",value:function(t,e,n,r,i,a){var o,l;return rF(this,void 0,void 0,c().mark((function u(){var s,d,m,h,b,Z=this;return c().wrap((function(u){for(;;)switch(u.prev=u.next){case 0:return s=!1,u.next=3,this._dataLayer.getConfigData();case 3:return d=u.sent,m=0,u.t0=[],u.t1=V,u.next=9,null==d?void 0:d.resourceServerURLs;case 9:if(u.t3=o=u.sent,u.t2=null!==u.t3,!u.t2){u.next=13;break}u.t2=void 0!==o;case 13:if(!u.t2){u.next=17;break}u.t4=o,u.next=18;break;case 17:u.t4=[];case 18:u.t5=u.t4,u.t6=(0,u.t1)(u.t5),u.t7=[d.baseUrl],h=u.t0.concat.call(u.t0,u.t6,u.t7);case 22:if(!(m<h.length)){u.next=30;break}if(!(b=h[m])||!(null===(l=null==e?void 0:e.url)||void 0===l?void 0:l.startsWith(b))){u.next=27;break}return s=!0,u.abrupt("break",30);case 27:m++,u.next=22;break;case 30:if(!s){u.next=34;break}return u.abrupt("return",t.request(e).then((function(t){return Promise.resolve(t)})).catch((function(o){return rF(Z,void 0,void 0,c().mark((function l(){var u,s,d,m,h;return c().wrap((function(c){for(;;)switch(c.prev=c.next){case 0:if(401!==(null===(u=null==o?void 0:o.response)||void 0===u?void 0:u.status)&&(null==o?void 0:o.response)){c.next=31;break}return c.prev=1,c.next=4,this.refreshAccessToken(a);case 4:m=c.sent,c.next=15;break;case 7:if(c.prev=7,c.t0=c.catch(1),!n){c.next=14;break}if("function"!=typeof r){c.next=13;break}return c.next=13,r(Object.assign(Object.assign({},o),{code:"Access token is invalid"}));case 13:"function"==typeof i&&i();case 14:throw new WF("SPA-AUTH_HELPER-HR-SE01",null!==(s=null===c.t0||void 0===c.t0?void 0:c.t0.name)&&void 0!==s?s:"Refresh token request failed.",null!==(d=null===c.t0||void 0===c.t0?void 0:c.t0.message)&&void 0!==d?d:"An error occurred while trying to refresh the access token following a 401 response from the server.");case 15:if(!m){c.next=31;break}return c.prev=16,c.next=19,t.request(e);case 19:return h=c.sent,c.abrupt("return",Promise.resolve(h));case 23:if(c.prev=23,c.t1=c.catch(16),!n){c.next=30;break}if("function"!=typeof r){c.next=29;break}return c.next=29,r(c.t1);case 29:"function"==typeof i&&i();case 30:return c.abrupt("return",Promise.reject(c.t1));case 31:if(!n){c.next=36;break}if("function"!=typeof r){c.next=35;break}return c.next=35,r(o);case 35:"function"==typeof i&&i();case 36:return c.abrupt("return",Promise.reject(o));case 37:case"end":return c.stop()}}),l,this,[[1,7],[16,23]])})))})));case 34:return u.abrupt("return",Promise.reject(new WF("SPA-AUTH_HELPER-HR-IV02","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`")));case 35:case"end":return u.stop()}}),u,this)})))}},{key:"httpRequestAll",value:function(t,e,n,r,i){var a,o,l;return rF(this,void 0,void 0,c().mark((function u(){var s,d,m,h,b,Z,p,I,y,X,g=this;return c().wrap((function(u){for(;;)switch(u.prev=u.next){case 0:return s=!0,u.next=3,this._dataLayer.getConfigData();case 3:d=u.sent,m=C(t),u.prev=5,m.s();case 7:if((h=m.n()).done){u.next=50;break}return b=h.value,Z=!1,p=0,u.t0=[],u.t1=V,u.next=15,d;case 15:if(u.t4=a=u.sent,u.t3=null===u.t4,u.t3){u.next=19;break}u.t3=void 0===a;case 19:if(!u.t3){u.next=23;break}u.t5=void 0,u.next=24;break;case 23:u.t5=a.resourceServerURLs;case 24:if(u.t6=o=u.t5,u.t2=null!==u.t6,!u.t2){u.next=28;break}u.t2=void 0!==o;case 28:if(!u.t2){u.next=32;break}u.t7=o,u.next=33;break;case 32:u.t7=[];case 33:u.t8=u.t7,u.t9=(0,u.t1)(u.t8),u.t10=[d.baseUrl],I=u.t0.concat.call(u.t0,u.t9,u.t10);case 37:if(!(p<I.length)){u.next=45;break}if(!(y=I[p])||!(null===(l=b.url)||void 0===l?void 0:l.startsWith(y))){u.next=42;break}return Z=!0,u.abrupt("break",45);case 42:p++,u.next=37;break;case 45:if(Z){u.next=48;break}return s=!1,u.abrupt("break",50);case 48:u.next=7;break;case 50:u.next=55;break;case 52:u.prev=52,u.t11=u.catch(5),m.e(u.t11);case 55:return u.prev=55,m.f(),u.finish(55);case 58:if(X=[],!s){u.next=64;break}return t.forEach((function(t){X.push(e.request(t))})),u.abrupt("return",(null==e?void 0:e.all)&&e.all(X).then((function(t){return Promise.resolve(t)})).catch((function(t){return rF(g,void 0,void 0,c().mark((function a(){var o,l,u,s,d=this;return c().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:if(401!==(null===(o=null==t?void 0:t.response)||void 0===o?void 0:o.status)&&(null==t?void 0:t.response)){a.next=17;break}return a.prev=1,a.next=4,this._authenticationClient.refreshAccessToken();case 4:s=a.sent,a.next=15;break;case 7:if(a.prev=7,a.t0=a.catch(1),!n){a.next=14;break}if("function"!=typeof r){a.next=13;break}return a.next=13,r(Object.assign(Object.assign({},t),{code:"Access token is invalid"}));case 13:"function"==typeof i&&i();case 14:throw new WF("SPA-AUTH_HELPER-HRA-SE01",null!==(l=null===a.t0||void 0===a.t0?void 0:a.t0.name)&&void 0!==l?l:"Refresh token request failed.",null!==(u=null===a.t0||void 0===a.t0?void 0:a.t0.message)&&void 0!==u?u:"An error occurred while trying to refresh the access token following a 401 response from the server.");case 15:if(!s){a.next=17;break}return a.abrupt("return",e.all&&e.all(X).then((function(t){return Promise.resolve(t)})).catch((function(t){return rF(d,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!n){e.next=5;break}if("function"!=typeof r){e.next=4;break}return e.next=4,r(t);case 4:"function"==typeof i&&i();case 5:return e.abrupt("return",Promise.reject(t));case 6:case"end":return e.stop()}}),e)})))})));case 17:if(!n){a.next=22;break}if("function"!=typeof r){a.next=21;break}return a.next=21,r(t);case 21:"function"==typeof i&&i();case 22:return a.abrupt("return",Promise.reject(t));case 23:case"end":return a.stop()}}),a,this,[[1,7]])})))})));case 64:throw new WF("SPA-AUTH_HELPER-HRA-IV02","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`");case 65:case"end":return u.stop()}}),u,this,[[5,52,55,58]])})))}},{key:"requestAccessToken",value:function(t,e,n,r,i){return rF(this,void 0,void 0,c().mark((function a(){var o,l,u=this;return c().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,this._dataLayer.getConfigData();case 2:if((o=a.sent).storage!==UF.BrowserMemory||!o.enablePKCE||!e){a.next=9;break}return l=oz.getPKCE(vF.extractPKCEKeyFromStateParam(e)),a.next=7,this._authenticationClient.setPKCECode(vF.extractPKCEKeyFromStateParam(e),l);case 7:a.next=12;break;case 9:if(o.storage!==UF.WebWorker||!r){a.next=12;break}return a.next=12,this._authenticationClient.setPKCECode(r,null!=i?i:"");case 12:if(!t){a.next=14;break}return a.abrupt("return",this._authenticationClient.requestAccessToken(t,null!=e?e:"",null!=i?i:"").then((function(){return rF(u,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(o.storage===UF.WebWorker){t.next=10;break}return t.t0=oz,t.next=4,this._authenticationClient.getSignOutURL();case 4:t.t1=t.sent,t.t0.setSignOutURL.call(t.t0,t.t1),this._spaHelper&&(this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically()),n&&"function"==typeof n&&o.enableOIDCSessionManagement&&n(),t.next=11;break;case 10:this._spaHelper&&this._spaHelper.refreshAccessTokenAutomatically();case 11:return t.abrupt("return",this._authenticationClient.getBasicUserInfo());case 12:case"end":return t.stop()}}),t,this)})))})).catch((function(t){return Promise.reject(t)})));case 14:return a.abrupt("return",Promise.reject(new WF("SPA-AUTH_HELPER-RAT1-NF01","No authorization code.","No authorization code was found.")));case 15:case"end":return a.stop()}}),a,this)})))}},{key:"trySignInSilently",value:function(t,e,n){var r;return rF(this,void 0,void 0,c().mark((function i(){var a,o,l,u=this;return c().wrap((function(i){for(;;)switch(i.prev=i.next){case 0:if(!oz.isInitializedSilentSignIn()){i.next=4;break}return i.next=3,n.receivePromptNoneResponse();case 3:return i.abrupt("return",Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""}));case 4:return a=document.getElementById("rpIFrame"),o=null===(r=null==a?void 0:a.contentDocument)||void 0===r?void 0:r.getElementById("promptNoneIFrame"),i.prev=6,i.next=9,t();case 9:l=i.sent,o.src=l,i.next=16;break;case 13:return i.prev=13,i.t0=i.catch(6),i.abrupt("return",Promise.reject(i.t0));case 16:return i.abrupt("return",new Promise((function(t,n){var r=setTimeout((function(){t(!1)}),1e4);window.addEventListener("message",(function i(a){return rF(u,void 0,void 0,c().mark((function o(){var l,u,s,d,m;return c().wrap((function(c){for(;;)switch(c.prev=c.next){case 0:"check_session_signed_out"==(null==(m=a.data)?void 0:m.type)&&(window.removeEventListener("message",i),clearTimeout(r),t(!1)),"check_session_signed_in"==(null==m?void 0:m.type)&&(null===(l=null==m?void 0:m.data)||void 0===l?void 0:l.code)&&e(null===(u=null==m?void 0:m.data)||void 0===u?void 0:u.code,null===(s=null==m?void 0:m.data)||void 0===s?void 0:s.sessionState,null===(d=null==m?void 0:m.data)||void 0===d?void 0:d.state).then((function(e){window.removeEventListener("message",i),t(e)})).catch((function(t){window.removeEventListener("message",i),n(t)})).finally((function(){clearTimeout(r)}));case 3:case"end":return c.stop()}}),o)})))}))})));case 17:case"end":return i.stop()}}),i,null,[[6,13]])})))}},{key:"handleSignIn",value:function(t,e,n){return rF(this,void 0,void 0,c().mark((function r(){var i,a,o,l,u;return c().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.next=2,this._dataLayer.getConfigData();case 2:return i=r.sent,r.next=5,t();case 5:if(!r.sent){r.next=7;break}return r.abrupt("return",Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""}));case 7:if(i.storage===UF.WebWorker){r.next=19;break}return r.next=10,this._authenticationClient.isAuthenticated();case 10:if(!r.sent){r.next=19;break}return this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(),i.enableOIDCSessionManagement&&e(),r.t0=Promise,r.next=17,this._authenticationClient.getBasicUserInfo();case 17:return r.t1=r.sent,r.abrupt("return",r.t0.resolve.call(r.t0,r.t1));case 19:if(a=new URL(window.location.href).searchParams.get("error"),o=new URL(window.location.href).searchParams.get("error_description"),!a){r.next=27;break}throw(l=new URL(window.location.href)).searchParams.delete("error"),l.searchParams.delete("error_description"),history.pushState(null,document.title,l.toString()),new WF("SPA-AUTH_HELPER-SI-SE01",a,null!=o?o:"");case 27:if(i.storage!==UF.WebWorker||!n){r.next=33;break}return r.next=30,n();case 30:if(!(u=r.sent)){r.next=33;break}return r.abrupt("return",u);case 33:case"end":return r.stop()}}),r,this)})))}},{key:"getBasicUserInfo",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.getBasicUserInfo());case 1:case"end":return t.stop()}}),t,this)})))}},{key:"getDecodedIDToken",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.getDecodedIDToken());case 1:case"end":return t.stop()}}),t,this)})))}},{key:"getDecodedIDPIDToken",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.getDecodedIDToken());case 1:case"end":return t.stop()}}),t,this)})))}},{key:"getCryptoHelper",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.getCryptoHelper());case 1:case"end":return t.stop()}}),t,this)})))}},{key:"getIDToken",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.getIDToken());case 1:case"end":return t.stop()}}),t,this)})))}},{key:"getOIDCServiceEndpoints",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.getOIDCServiceEndpoints());case 1:case"end":return t.stop()}}),t,this)})))}},{key:"getAccessToken",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.getAccessToken());case 1:case"end":return t.stop()}}),t,this)})))}},{key:"getIDPAccessToken",value:function(){var t;return rF(this,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this._dataLayer.getSessionData();case 2:if(e.t1=t=e.sent,e.t0=null===e.t1,e.t0){e.next=6;break}e.t0=void 0===t;case 6:if(!e.t0){e.next=10;break}e.t2=void 0,e.next=11;break;case 10:e.t2=t.access_token;case 11:return e.abrupt("return",e.t2);case 12:case"end":return e.stop()}}),e,this)})))}},{key:"getDataLayer",value:function(){return this._dataLayer}},{key:"isAuthenticated",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.isAuthenticated());case 1:case"end":return t.stop()}}),t,this)})))}}]),t}(),cz=function(){function t(e){u(this,t),this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer()}return d(t,[{key:"refreshAccessTokenAutomatically",value:function(){return rF(this,void 0,void 0,c().mark((function t(){var e,n,r,i=this;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this._dataLayer.getSessionData();case 2:if(!(e=t.sent).refresh_token){t.next=9;break}return n=parseInt(e.expires_in),r=setTimeout((function(){return rF(i,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this._authenticationClient.refreshAccessToken();case 2:case"end":return t.stop()}}),t,this)})))}),1e3*(n<=10?n:n-10)),t.next=9,this._dataLayer.setTemporaryDataParameter(mF,JSON.stringify(r));case 9:case"end":return t.stop()}}),t,this)})))}},{key:"clearRefreshTokenTimeout",value:function(){return rF(this,void 0,void 0,c().mark((function t(){var e;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this._dataLayer.getTemporaryDataParameter(mF);case 2:if(!t.sent){t.next=9;break}return t.t0=JSON,t.next=6,this._dataLayer.getTemporaryDataParameter(mF);case 6:t.t1=t.sent,e=t.t0.parse.call(t.t0,t.t1),clearTimeout(e);case 9:case"end":return t.stop()}}),t,this)})))}}]),t}(),az=function(){function t(){u(this,t)}return d(t,null,[{key:"generateSuccessMessage",value:function(t){return{blob:(null==t?void 0:t.data)instanceof Blob?null==t?void 0:t.data:null,data:JSON.stringify(null!=t?t:""),success:!0}}},{key:"generateFailureMessage",value:function(t){return(null==t?void 0:t.toJSON)&&delete t.toJSON,{error:JSON.stringify(null!=t?t:""),success:!1}}}]),t}(),oz=function(){function t(){u(this,t)}return d(t,null,[{key:"removeAuthorizationCode",value:function(){var t=location.href;history.pushState({},document.title,t.replace(/\?code=.*$/,""))}},{key:"getPKCE",value:function(t){var e;return null!==(e=sessionStorage.getItem(t))&&void 0!==e?e:""}},{key:"setPKCE",value:function(t,e){sessionStorage.setItem(t,e)}},{key:"setSignOutURL",value:function(t){sessionStorage.setItem(gF,t)}},{key:"getSignOutURL",value:function(){var t;return null!==(t=sessionStorage.getItem(gF))&&void 0!==t?t:""}},{key:"removePKCE",value:function(t){sessionStorage.removeItem(t)}},{key:"canContinueSignIn",value:function(e,n){return!(e&&!t.hasErrorInURL()&&!t.hasAuthSearchParamsInURL()&&!n)}},{key:"isInitializedSilentSignIn",value:function(){return t.isSilentStatePresentInURL()}},{key:"wasSignInCalled",value:function(){return!(!t.hasErrorInURL()&&!t.hasAuthSearchParamsInURL()||this.isSilentStatePresentInURL())}},{key:"wasSilentSignInCalled",value:function(){var t=sessionStorage.getItem("initialized-silent-sign-in"),e=t?JSON.parse(t):null;return Boolean(e)}},{key:"isSignOutSuccessful",value:function(){return rF(this,void 0,void 0,c().mark((function t(){var e;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!NF.isSignOutSuccessful(window.location.href)){t.next=6;break}return e=window.location.href.split("?")[0],history.pushState({},document.title,e),t.next=5,NF.clearUserSessionData();case 5:return t.abrupt("return",!0);case 6:return t.abrupt("return",!1);case 7:case"end":return t.stop()}}),t)})))}},{key:"didSignOutFail",value:function(){if(NF.didSignOutFail(window.location.href)){var t=new URL(window.location.href),e=t.searchParams.get("error"),n=t.searchParams.get("error_description"),r=window.location.href.split("?")[0];return history.pushState({},document.title,r),{description:null!=n?n:"",error:null!=e?e:""}}return!1}},{key:"isSilentStatePresentInURL",value:function(){var t,e=new URL(window.location.href).searchParams.get("state");return null!==(t=null==e?void 0:e.includes("sign-in-silently"))&&void 0!==t&&t}},{key:"hasAuthSearchParamsInURL",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.location.search,e=/[?&]code=[^&]+/;return e.test(t)}},{key:"hasErrorInURL",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.location.href,e=new URL(t);return!!e.searchParams.get("error")&&e.searchParams.get("state")!==GF}},{key:"canSendPromptNoneRequest",value:function(){var t=sessionStorage.getItem("promptNoneRequestSent");return!(t?JSON.parse(t):null)}},{key:"setPromptNoneRequestSent",value:function(t){sessionStorage.setItem("promptNoneRequestSent",JSON.stringify(t))}},{key:"waitTillPageRedirect",value:function(t){return rF(this,void 0,void 0,c().mark((function e(){var n;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!=t?t:3e3,e.next=3,new Promise((function(t){return setTimeout(t,1e3*n)}));case 3:case"end":return e.stop()}}),e)})))}}]),t}(),lz=(_F=function(t,e,n,r,i,c,a){AF=t,FF=e,zF=n,jF=c,MF=i,OF=a,(BF=r)>-1&&qF(),MF>-1&&(i=setInterval((function(){ez()}),1e3*MF))},qF=function(){return rF(void 0,void 0,void 0,c().mark((function t(){var e,n,r,i;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r=function(){var t;return rF(this,void 0,void 0,c().mark((function e(){var r,i,a,o,l;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,zF();case 2:r=e.sent,Boolean(AF)&&Boolean(r)&&(i="".concat(AF," ").concat(r),a=document.getElementById("rpIFrame"),o=null===(t=null==a?void 0:a.contentDocument)||void 0===t?void 0:t.getElementById(n),null==(l=o.contentWindow)||l.postMessage(i,FF));case 4:case"end":return e.stop()}}),e)})))},FF&&AF&&jF){t.next=3;break}return t.abrupt("return");case 3:return n="opIFrame",i=document.getElementById("rpIFrame"),(null===(e=null==i?void 0:i.contentDocument)||void 0===e?void 0:e.getElementById(n)).src=FF+"?client_id="+AF+"&redirect_uri="+jF,t.next=9,r();case 9:PF=setInterval(r,1e3*BF),tz();case 11:case"end":return t.stop()}}),t)})))},$F=function(){clearInterval(PF),clearInterval(void 0)},tz=function(){null===window||void 0===window||window.addEventListener("message",(function(t){var e;return rF(this,void 0,void 0,c().mark((function n(){var r;return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if((r=FF)&&!((null==r?void 0:r.indexOf(t.origin))<0)&&"set_session_state_from_iframe"!==(null===(e=null==t?void 0:t.data)||void 0===e?void 0:e.type)){n.next=3;break}return n.abrupt("return");case 3:if("unchanged"!==t.data){n.next=6;break}n.next=13;break;case 6:if("error"!==t.data){n.next=12;break}return n.next=9,QF();case 9:window.location.href=n.sent,n.next=13;break;case 12:"changed"===t.data&&ez();case 13:case"end":return n.stop()}}),n)})))}),!1)},ez=function(){return rF(void 0,void 0,void 0,c().mark((function t(){var e,n,r,i,a;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n=document.getElementById("rpIFrame"),r=null===(e=null==n?void 0:n.contentDocument)||void 0===e?void 0:e.getElementById("promptNoneIFrame"),!oz.canSendPromptNoneRequest()){t.next=10;break}return oz.setPromptNoneRequestSent(!0),i=function t(e){var n,r,i;"set_session_state_from_iframe"===(null===(n=null==e?void 0:e.data)||void 0===n?void 0:n.type)&&(DF(null!==(i=null===(r=null==e?void 0:e.data)||void 0===r?void 0:r.data)&&void 0!==i?i:""),null===window||void 0===window||window.removeEventListener("message",t))},EF!==UF.BrowserMemory&&EF!==UF.WebWorker||null===window||void 0===window||window.addEventListener("message",i),t.next=8,OF({prompt:"none",responseMode:"query",state:rz});case 8:a=t.sent,r.src=a;case 10:case"end":return t.stop()}}),t)})))},nz=function(t){return rF(void 0,void 0,void 0,c().mark((function e(){var n,r,i,a,o,l,u,s,d,m;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(i=new URL(window.location.href).searchParams.get("state"),a=new URL(window.location.href).searchParams.get(XF),o=window.parent.parent,null===i||!i.includes(rz)&&!i.includes("sign-in-silently")){e.next=48;break}if(null===(l=new URL(window.location.href).searchParams.get("code"))||0===l.length){e.next=32;break}if(!i.includes("sign-in-silently")){e.next=15;break}return u={data:{code:l,sessionState:null!=a?a:"",state:i},type:"check_session_signed_in"},sessionStorage.setItem("initialized-silent-sign-in","false"),o.postMessage(u,o.origin),oz.setPromptNoneRequestSent(!1),window.location.href="about:blank",e.next=14,oz.waitTillPageRedirect();case 14:return e.abrupt("return",!0);case 15:if(s=new URL(window.location.href).searchParams.get("session_state"),EF!==UF.LocalStorage&&EF!==UF.SessionStorage){e.next=23;break}if(e.t0=t,!e.t0){e.next=21;break}return e.next=21,t(s);case 21:e.next=25;break;case 23:d={data:null!=s?s:"",type:"set_session_state_from_iframe"},null===(r=null===(n=null===window||void 0===window?void 0:window.parent)||void 0===n?void 0:n.parent)||void 0===r||r.postMessage(d);case 25:return oz.setPromptNoneRequestSent(!1),window.location.href="about:blank",e.next=29,oz.waitTillPageRedirect();case 29:return e.abrupt("return",!0);case 32:if(!i.includes("sign-in-silently")){e.next=40;break}return m={type:"check_session_signed_out"},window.parent.parent.postMessage(m,o.origin),oz.setPromptNoneRequestSent(!1),window.location.href="about:blank",e.next=39,oz.waitTillPageRedirect();case 39:return e.abrupt("return",!0);case 40:return oz.setPromptNoneRequestSent(!1),e.next=43,QF();case 43:return o.location.href=e.sent,window.location.href="about:blank",e.next=47,oz.waitTillPageRedirect();case 47:return e.abrupt("return",!0);case 48:return e.abrupt("return",!1);case 49:case"end":return e.stop()}}),e)})))},function(t,e,n){return rF(void 0,void 0,void 0,c().mark((function r(){var i,a,o,l;return c().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:(a=document.createElement("iframe")).setAttribute("id","rpIFrame"),a.style.display="none",o=!1,a.onload=function(){var t,e,n,r,i=null==(a=document.getElementById("rpIFrame"))?void 0:a.contentDocument,c=null==i?void 0:i.createElement("iframe");c&&(c.setAttribute("id","opIFrame"),c.style.display="none");var l=null==i?void 0:i.createElement("iframe");l&&(l.setAttribute("id","promptNoneIFrame"),l.style.display="none"),c&&(null===(e=null===(t=null==a?void 0:a.contentDocument)||void 0===t?void 0:t.body)||void 0===e||e.appendChild(c)),l&&(null===(r=null===(n=null==a?void 0:a.contentDocument)||void 0===n?void 0:n.body)||void 0===r||r.appendChild(l)),o=!0},null===(i=null===document||void 0===document?void 0:document.body)||void 0===i||i.appendChild(a),QF=t,EF=e,DF=n,l=function(){return new Promise((function(t){return setTimeout(t,1)}))};case 10:if(!1!==o){r.next=15;break}return r.next=13,l();case 13:r.next=10;break;case 15:return r.abrupt("return",{initialize:_F,receivePromptNoneResponse:nz,reset:$F});case 16:case"end":return r.stop()}}),r)})))}),uz={exports:{}},sz=function(t,e){return function(){for(var n=new Array(arguments.length),r=0;r<n.length;r++)n[r]=arguments[r];return t.apply(e,n)}},dz=sz,mz=Object.prototype.toString;function hz(t){return Array.isArray(t)}function bz(t){return void 0===t}function Zz(t){return"[object ArrayBuffer]"===mz.call(t)}function pz(t){return null!==t&&"object"===a(t)}function Iz(t){if("[object Object]"!==mz.call(t))return!1;var e=Object.getPrototypeOf(t);return null===e||e===Object.prototype}function yz(t){return"[object Function]"===mz.call(t)}function Xz(t,e){if(null!=t)if("object"!==a(t)&&(t=[t]),hz(t))for(var n=0,r=t.length;n<r;n++)e.call(null,t[n],n,t);else for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&e.call(null,t[i],i,t)}var gz={isArray:hz,isArrayBuffer:Zz,isBuffer:function(t){return null!==t&&!bz(t)&&null!==t.constructor&&!bz(t.constructor)&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)},isFormData:function(t){return"[object FormData]"===mz.call(t)},isArrayBufferView:function(t){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(t):t&&t.buffer&&Zz(t.buffer)},isString:function(t){return"string"==typeof t},isNumber:function(t){return"number"==typeof t},isObject:pz,isPlainObject:Iz,isUndefined:bz,isDate:function(t){return"[object Date]"===mz.call(t)},isFile:function(t){return"[object File]"===mz.call(t)},isBlob:function(t){return"[object Blob]"===mz.call(t)},isFunction:yz,isStream:function(t){return pz(t)&&yz(t.pipe)},isURLSearchParams:function(t){return"[object URLSearchParams]"===mz.call(t)},isStandardBrowserEnv:function(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)},forEach:Xz,merge:function t(){var e={};function n(n,r){Iz(e[r])&&Iz(n)?e[r]=t(e[r],n):Iz(n)?e[r]=t({},n):hz(n)?e[r]=n.slice():e[r]=n}for(var r=0,i=arguments.length;r<i;r++)Xz(arguments[r],n);return e},extend:function(t,e,n){return Xz(e,(function(e,r){t[r]=n&&"function"==typeof e?dz(e,n):e})),t},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},stripBOM:function(t){return 65279===t.charCodeAt(0)&&(t=t.slice(1)),t}},Gz=gz;function fz(t){return encodeURIComponent(t).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var Vz=function(t,e,n){if(!e)return t;var r;if(n)r=n(e);else if(Gz.isURLSearchParams(e))r=e.toString();else{var i=[];Gz.forEach(e,(function(t,e){null!=t&&(Gz.isArray(t)?e+="[]":t=[t],Gz.forEach(t,(function(t){Gz.isDate(t)?t=t.toISOString():Gz.isObject(t)&&(t=JSON.stringify(t)),i.push(fz(e)+"="+fz(t))})))})),r=i.join("&")}if(r){var c=t.indexOf("#");-1!==c&&(t=t.slice(0,c)),t+=(-1===t.indexOf("?")?"?":"&")+r}return t},Wz=gz;function vz(){this.handlers=[]}vz.prototype.use=function(t,e,n){return this.handlers.push({fulfilled:t,rejected:e,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1},vz.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},vz.prototype.forEach=function(t){Wz.forEach(this.handlers,(function(e){null!==e&&t(e)}))};var Cz=vz,Yz="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{};function Sz(){throw new Error("setTimeout has not been defined")}function Rz(){throw new Error("clearTimeout has not been defined")}var Kz=Sz,Nz=Rz;function Lz(t){if(Kz===setTimeout)return setTimeout(t,0);if((Kz===Sz||!Kz)&&setTimeout)return Kz=setTimeout,setTimeout(t,0);try{return Kz(t,0)}catch(e){try{return Kz.call(null,t,0)}catch(e){return Kz.call(this,t,0)}}}"function"==typeof Yz.setTimeout&&(Kz=setTimeout),"function"==typeof Yz.clearTimeout&&(Nz=clearTimeout);var Jz,xz=[],Hz=!1,kz=-1;function Uz(){Hz&&Jz&&(Hz=!1,Jz.length?xz=Jz.concat(xz):kz=-1,xz.length&&Tz())}function Tz(){if(!Hz){var t=Lz(Uz);Hz=!0;for(var e=xz.length;e;){for(Jz=xz,xz=[];++kz<e;)Jz&&Jz[kz].run();kz=-1,e=xz.length}Jz=null,Hz=!1,function(t){if(Nz===clearTimeout)return clearTimeout(t);if((Nz===Rz||!Nz)&&clearTimeout)return Nz=clearTimeout,clearTimeout(t);try{Nz(t)}catch(e){try{return Nz.call(null,t)}catch(e){return Nz.call(this,t)}}}(t)}}function wz(t,e){this.fun=t,this.array=e}wz.prototype.run=function(){this.fun.apply(null,this.array)};function Az(){}var Fz=Az,zz=Az,Bz=Az,jz=Az,Mz=Az,Qz=Az,Pz=Az;var Ez=Yz.performance||{},Dz=Ez.now||Ez.mozNow||Ez.msNow||Ez.oNow||Ez.webkitNow||function(){return(new Date).getTime()};var Oz=new Date;var _z={nextTick:function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];xz.push(new wz(t,e)),1!==xz.length||Hz||Lz(Tz)},title:"browser",browser:!0,env:{},argv:[],version:"",versions:{},on:Fz,addListener:zz,once:Bz,off:jz,removeListener:Mz,removeAllListeners:Qz,emit:Pz,binding:function(t){throw new Error("process.binding is not supported")},cwd:function(){return"/"},chdir:function(t){throw new Error("process.chdir is not supported")},umask:function(){return 0},hrtime:function(t){var e=.001*Dz.call(Ez),n=Math.floor(e),r=Math.floor(e%1*1e9);return t&&(n-=t[0],(r-=t[1])<0&&(n--,r+=1e9)),[n,r]},platform:"browser",release:{},config:{},uptime:function(){return(new Date-Oz)/1e3}},qz=_z,$z=gz,tB=function(t,e,n,r,i){return t.config=e,n&&(t.code=n),t.request=r,t.response=i,t.isAxiosError=!0,t.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}},t},eB={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},nB=tB,rB=function(t,e,n,r,i){var c=new Error(t);return nB(c,e,n,r,i)},iB=rB,cB=gz,aB=cB.isStandardBrowserEnv()?{write:function(t,e,n,r,i,c){var a=[];a.push(t+"="+encodeURIComponent(e)),cB.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),cB.isString(r)&&a.push("path="+r),cB.isString(i)&&a.push("domain="+i),!0===c&&a.push("secure"),document.cookie=a.join("; ")},read:function(t){var e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(t){this.write(t,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}},oB=function(t){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)},lB=function(t,e){return e?t.replace(/\/+$/,"")+"/"+e.replace(/^\/+/,""):t},uB=gz,sB=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"],dB=gz,mB=dB.isStandardBrowserEnv()?function(){var t,e=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function r(t){var r=t;return e&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return t=r(window.location.href),function(e){var n=dB.isString(e)?r(e):e;return n.protocol===t.protocol&&n.host===t.host}}():function(){return!0};function hB(t){this.message=t}hB.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},hB.prototype.__CANCEL__=!0;var bB=hB,ZB=gz,pB=function(t,e,n){var r=n.config.validateStatus;n.status&&r&&!r(n.status)?e(iB("Request failed with status code "+n.status,n.config,null,n.request,n)):t(n)},IB=aB,yB=Vz,XB=function(t,e){return t&&!oB(e)?lB(t,e):e},gB=function(t){var e,n,r,i={};return t?(uB.forEach(t.split("\n"),(function(t){if(r=t.indexOf(":"),e=uB.trim(t.substr(0,r)).toLowerCase(),n=uB.trim(t.substr(r+1)),e){if(i[e]&&sB.indexOf(e)>=0)return;i[e]="set-cookie"===e?(i[e]?i[e]:[]).concat([n]):i[e]?i[e]+", "+n:n}})),i):i},GB=mB,fB=rB,VB=eB,WB=bB,vB=function(t){return new Promise((function(e,n){var r,i=t.data,c=t.headers,a=t.responseType;function o(){t.cancelToken&&t.cancelToken.unsubscribe(r),t.signal&&t.signal.removeEventListener("abort",r)}ZB.isFormData(i)&&delete c["Content-Type"];var l=new XMLHttpRequest;if(t.auth){var u=t.auth.username||"",s=t.auth.password?unescape(encodeURIComponent(t.auth.password)):"";c.Authorization="Basic "+btoa(u+":"+s)}var d=XB(t.baseURL,t.url);function m(){if(l){var r="getAllResponseHeaders"in l?gB(l.getAllResponseHeaders()):null,i={data:a&&"text"!==a&&"json"!==a?l.response:l.responseText,status:l.status,statusText:l.statusText,headers:r,config:t,request:l};pB((function(t){e(t),o()}),(function(t){n(t),o()}),i),l=null}}if(l.open(t.method.toUpperCase(),yB(d,t.params,t.paramsSerializer),!0),l.timeout=t.timeout,"onloadend"in l?l.onloadend=m:l.onreadystatechange=function(){l&&4===l.readyState&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))&&setTimeout(m)},l.onabort=function(){l&&(n(fB("Request aborted",t,"ECONNABORTED",l)),l=null)},l.onerror=function(){n(fB("Network Error",t,null,l)),l=null},l.ontimeout=function(){var e=t.timeout?"timeout of "+t.timeout+"ms exceeded":"timeout exceeded",r=t.transitional||VB;t.timeoutErrorMessage&&(e=t.timeoutErrorMessage),n(fB(e,t,r.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",l)),l=null},ZB.isStandardBrowserEnv()){var h=(t.withCredentials||GB(d))&&t.xsrfCookieName?IB.read(t.xsrfCookieName):void 0;h&&(c[t.xsrfHeaderName]=h)}"setRequestHeader"in l&&ZB.forEach(c,(function(t,e){void 0===i&&"content-type"===e.toLowerCase()?delete c[e]:l.setRequestHeader(e,t)})),ZB.isUndefined(t.withCredentials)||(l.withCredentials=!!t.withCredentials),a&&"json"!==a&&(l.responseType=t.responseType),"function"==typeof t.onDownloadProgress&&l.addEventListener("progress",t.onDownloadProgress),"function"==typeof t.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",t.onUploadProgress),(t.cancelToken||t.signal)&&(r=function(t){l&&(n(!t||t&&t.type?new WB("canceled"):t),l.abort(),l=null)},t.cancelToken&&t.cancelToken.subscribe(r),t.signal&&(t.signal.aborted?r():t.signal.addEventListener("abort",r))),i||(i=null),l.send(i)}))},CB=gz,YB=function(t,e){$z.forEach(t,(function(n,r){r!==e&&r.toUpperCase()===e.toUpperCase()&&(t[e]=n,delete t[r])}))},SB=tB,RB={"Content-Type":"application/x-www-form-urlencoded"};function KB(t,e){!CB.isUndefined(t)&&CB.isUndefined(t["Content-Type"])&&(t["Content-Type"]=e)}var NB,LB={transitional:eB,adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==qz&&"[object process]"===Object.prototype.toString.call(qz))&&(NB=vB),NB),transformRequest:[function(t,e){return YB(e,"Accept"),YB(e,"Content-Type"),CB.isFormData(t)||CB.isArrayBuffer(t)||CB.isBuffer(t)||CB.isStream(t)||CB.isFile(t)||CB.isBlob(t)?t:CB.isArrayBufferView(t)?t.buffer:CB.isURLSearchParams(t)?(KB(e,"application/x-www-form-urlencoded;charset=utf-8"),t.toString()):CB.isObject(t)||e&&"application/json"===e["Content-Type"]?(KB(e,"application/json"),function(t,e,n){if(CB.isString(t))try{return(e||JSON.parse)(t),CB.trim(t)}catch(t){if("SyntaxError"!==t.name)throw t}return(n||JSON.stringify)(t)}(t)):t}],transformResponse:[function(t){var e=this.transitional||LB.transitional,n=e&&e.silentJSONParsing,r=e&&e.forcedJSONParsing,i=!n&&"json"===this.responseType;if(i||r&&CB.isString(t)&&t.length)try{return JSON.parse(t)}catch(t){if(i){if("SyntaxError"===t.name)throw SB(t,this,"E_JSON_PARSE");throw t}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};CB.forEach(["delete","get","head"],(function(t){LB.headers[t]={}})),CB.forEach(["post","put","patch"],(function(t){LB.headers[t]=CB.merge(RB)}));var JB=LB,xB=gz,HB=JB,kB=function(t){return!(!t||!t.__CANCEL__)},UB=gz,TB=function(t,e,n){var r=this||HB;return xB.forEach(n,(function(n){t=n.call(r,t,e)})),t},wB=kB,AB=JB,FB=bB;function zB(t){if(t.cancelToken&&t.cancelToken.throwIfRequested(),t.signal&&t.signal.aborted)throw new FB("canceled")}var BB=gz,jB=function(t,e){e=e||{};var n={};function r(t,e){return BB.isPlainObject(t)&&BB.isPlainObject(e)?BB.merge(t,e):BB.isPlainObject(e)?BB.merge({},e):BB.isArray(e)?e.slice():e}function i(n){return BB.isUndefined(e[n])?BB.isUndefined(t[n])?void 0:r(void 0,t[n]):r(t[n],e[n])}function c(t){if(!BB.isUndefined(e[t]))return r(void 0,e[t])}function a(n){return BB.isUndefined(e[n])?BB.isUndefined(t[n])?void 0:r(void 0,t[n]):r(void 0,e[n])}function o(n){return n in e?r(t[n],e[n]):n in t?r(void 0,t[n]):void 0}var l={url:c,method:c,data:c,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:o};return BB.forEach(Object.keys(t).concat(Object.keys(e)),(function(t){var e=l[t]||i,r=e(t);BB.isUndefined(r)&&e!==o||(n[t]=r)})),n},MB="0.26.1",QB=MB,PB={};["object","boolean","number","function","string","symbol"].forEach((function(t,e){PB[t]=function(n){return a(n)===t||"a"+(e<1?"n ":" ")+t}}));var EB={};PB.transitional=function(t,e,n){function r(t,e){return"[Axios v"+QB+"] Transitional option '"+t+"'"+e+(n?". "+n:"")}return function(n,i,c){if(!1===t)throw new Error(r(i," has been removed"+(e?" in "+e:"")));return e&&!EB[i]&&(EB[i]=!0,console.warn(r(i," has been deprecated since v"+e+" and will be removed in the near future"))),!t||t(n,i,c)}};var DB={assertOptions:function(t,e,n){if("object"!==a(t))throw new TypeError("options must be an object");for(var r=Object.keys(t),i=r.length;i-- >0;){var c=r[i],o=e[c];if(o){var l=t[c],u=void 0===l||o(l,c,t);if(!0!==u)throw new TypeError("option "+c+" must be "+u)}else if(!0!==n)throw Error("Unknown option "+c)}},validators:PB},OB=gz,_B=Vz,qB=Cz,$B=function(t){return zB(t),t.headers=t.headers||{},t.data=TB.call(t,t.data,t.headers,t.transformRequest),t.headers=UB.merge(t.headers.common||{},t.headers[t.method]||{},t.headers),UB.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete t.headers[e]})),(t.adapter||AB.adapter)(t).then((function(e){return zB(t),e.data=TB.call(t,e.data,e.headers,t.transformResponse),e}),(function(e){return wB(e)||(zB(t),e&&e.response&&(e.response.data=TB.call(t,e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)}))},tj=jB,ej=DB,nj=ej.validators;function rj(t){this.defaults=t,this.interceptors={request:new qB,response:new qB}}rj.prototype.request=function(t,e){"string"==typeof t?(e=e||{}).url=t:e=t||{},(e=tj(this.defaults,e)).method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var n=e.transitional;void 0!==n&&ej.assertOptions(n,{silentJSONParsing:nj.transitional(nj.boolean),forcedJSONParsing:nj.transitional(nj.boolean),clarifyTimeoutError:nj.transitional(nj.boolean)},!1);var r=[],i=!0;this.interceptors.request.forEach((function(t){"function"==typeof t.runWhen&&!1===t.runWhen(e)||(i=i&&t.synchronous,r.unshift(t.fulfilled,t.rejected))}));var c,a=[];if(this.interceptors.response.forEach((function(t){a.push(t.fulfilled,t.rejected)})),!i){var o=[$B,void 0];for(Array.prototype.unshift.apply(o,r),o=o.concat(a),c=Promise.resolve(e);o.length;)c=c.then(o.shift(),o.shift());return c}for(var l=e;r.length;){var u=r.shift(),s=r.shift();try{l=u(l)}catch(t){s(t);break}}try{c=$B(l)}catch(t){return Promise.reject(t)}for(;a.length;)c=c.then(a.shift(),a.shift());return c},rj.prototype.getUri=function(t){return t=tj(this.defaults,t),_B(t.url,t.params,t.paramsSerializer).replace(/^\?/,"")},OB.forEach(["delete","get","head","options"],(function(t){rj.prototype[t]=function(e,n){return this.request(tj(n||{},{method:t,url:e,data:(n||{}).data}))}})),OB.forEach(["post","put","patch"],(function(t){rj.prototype[t]=function(e,n,r){return this.request(tj(r||{},{method:t,url:e,data:n}))}}));var ij=rj,cj=bB;function aj(t){if("function"!=typeof t)throw new TypeError("executor must be a function.");var e;this.promise=new Promise((function(t){e=t}));var n=this;this.promise.then((function(t){if(n._listeners){var e,r=n._listeners.length;for(e=0;e<r;e++)n._listeners[e](t);n._listeners=null}})),this.promise.then=function(t){var e,r=new Promise((function(t){n.subscribe(t),e=t})).then(t);return r.cancel=function(){n.unsubscribe(e)},r},t((function(t){n.reason||(n.reason=new cj(t),e(n.reason))}))}aj.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},aj.prototype.subscribe=function(t){this.reason?t(this.reason):this._listeners?this._listeners.push(t):this._listeners=[t]},aj.prototype.unsubscribe=function(t){if(this._listeners){var e=this._listeners.indexOf(t);-1!==e&&this._listeners.splice(e,1)}},aj.source=function(){var t,e=new aj((function(e){t=e}));return{token:e,cancel:t}};var oj=aj,lj=gz,uj=gz,sj=sz,dj=ij,mj=jB;var hj=function t(e){var n=new dj(e),r=sj(dj.prototype.request,n);return uj.extend(r,dj.prototype,n),uj.extend(r,n),r.create=function(n){return t(mj(e,n))},r}(JB);hj.Axios=dj,hj.Cancel=bB,hj.CancelToken=oj,hj.isCancel=kB,hj.VERSION=MB,hj.all=function(t){return Promise.all(t)},hj.spread=function(t){return function(e){return t.apply(null,e)}},hj.isAxiosError=function(t){return lj.isObject(t)&&!0===t.isAxiosError},uz.exports=hj,uz.exports.default=hj;var bj,Zj=uz.exports;var pj=bj=function(){function t(){u(this,t),this.attachToken=function(){return Promise.resolve()},this.requestStartCallback=function(){return null},this.requestSuccessCallback=function(){return null},this.requestErrorCallback=function(){return null},this.requestFinishCallback=function(){return null},this.init=this.init.bind(this),this.setHttpRequestErrorCallback=this.setHttpRequestErrorCallback.bind(this),this.setHttpRequestFinishCallback=this.setHttpRequestFinishCallback.bind(this),this.setHttpRequestStartCallback=this.setHttpRequestStartCallback.bind(this),this.setHttpRequestSuccessCallback=this.setHttpRequestSuccessCallback.bind(this)}return d(t,[{key:"requestHandler",value:function(t){return rF(this,void 0,void 0,c().mark((function e(){var n,r;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.attachToken(t);case 2:return(null==t?void 0:t.shouldEncodeToFormData)&&(n=null==t?void 0:t.data,r=new FormData,Object.keys(n).forEach((function(t){r.append(t,n[t])})),t.data=r),t.startTimeInMs=(new Date).getTime(),bj.isHandlerEnabled&&this.requestStartCallback&&"function"==typeof this.requestStartCallback&&this.requestStartCallback(t),e.abrupt("return",t);case 6:case"end":return e.stop()}}),e,this)})))}},{key:"errorHandler",value:function(t){throw bj.isHandlerEnabled&&(this.requestErrorCallback&&"function"==typeof this.requestErrorCallback&&this.requestErrorCallback(t),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),t}},{key:"successHandler",value:function(t){return bj.isHandlerEnabled&&(this.requestSuccessCallback&&"function"==typeof this.requestSuccessCallback&&this.requestSuccessCallback(t),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),t}},{key:"init",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],e=arguments.length>1?arguments[1]:void 0;return rF(this,void 0,void 0,c().mark((function n(){return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:bj.isHandlerEnabled=t,this.attachToken=e;case 2:case"end":return n.stop()}}),n,this)})))}},{key:"enableHandler",value:function(){bj.isHandlerEnabled=!0}},{key:"disableHandler",value:function(){bj.isHandlerEnabled=!1}},{key:"disableHandlerWithTimeout",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:bj.DEFAULT_HANDLER_DISABLE_TIMEOUT;bj.isHandlerEnabled=!1,setTimeout((function(){bj.isHandlerEnabled=!0}),t)}},{key:"setHttpRequestStartCallback",value:function(t){this.requestStartCallback=t}},{key:"setHttpRequestSuccessCallback",value:function(t){this.requestSuccessCallback=t}},{key:"setHttpRequestErrorCallback",value:function(t){this.requestErrorCallback=t}},{key:"setHttpRequestFinishCallback",value:function(t){this.requestFinishCallback=t}}],[{key:"getInstance",value:function(){var t=this;return this.axiosInstance||(this.axiosInstance=Zj.create({withCredentials:!0}),this.clientInstance||(this.clientInstance=new bj),this.axiosInstance.interceptors.request.use((function(e){return rF(t,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.clientInstance.requestHandler(e);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t,this)})))})),this.axiosInstance.interceptors.response.use((function(e){return t.clientInstance.successHandler(e)}),(function(e){return t.clientInstance.errorHandler(e)})),this.axiosInstance.all=Zj.all,this.axiosInstance.spread=Zj.spread,this.axiosInstance.init=this.clientInstance.init,this.axiosInstance.enableHandler=this.clientInstance.enableHandler,this.axiosInstance.disableHandler=this.clientInstance.disableHandler,this.axiosInstance.disableHandlerWithTimeout=this.clientInstance.disableHandlerWithTimeout,this.axiosInstance.setHttpRequestStartCallback=this.clientInstance.setHttpRequestStartCallback,this.axiosInstance.setHttpRequestSuccessCallback=this.clientInstance.setHttpRequestSuccessCallback,this.axiosInstance.setHttpRequestErrorCallback=this.clientInstance.setHttpRequestErrorCallback,this.axiosInstance.setHttpRequestFinishCallback=this.clientInstance.setHttpRequestFinishCallback),this.axiosInstance}}]),t}();pj.DEFAULT_HANDLER_DISABLE_TIMEOUT=1e3,pj=bj=function(t,e,n,r){var i,c=arguments.length,o=c<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"===("undefined"==typeof Reflect?"undefined":a(Reflect))&&"function"==typeof Reflect.decorate)o=Reflect.decorate(t,e,n,r);else for(var l=t.length-1;l>=0;l--)(i=t[l])&&(o=(c<3?i(o):c>3?i(e,n,o):i(e,n))||o);return c>3&&o&&Object.defineProperty(e,n,o),o}([function(t){}],pj);var Ij=function(){function t(){u(this,t)}return d(t,[{key:"setData",value:function(t,e){return rF(this,void 0,void 0,c().mark((function n(){return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:localStorage.setItem(t,e);case 1:case"end":return n.stop()}}),n)})))}},{key:"getData",value:function(t){var e;return rF(this,void 0,void 0,c().mark((function n(){return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.abrupt("return",null!==(e=localStorage.getItem(t))&&void 0!==e?e:"{}");case 1:case"end":return n.stop()}}),n)})))}},{key:"removeData",value:function(t){return rF(this,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:localStorage.removeItem(t);case 1:case"end":return e.stop()}}),e)})))}}]),t}(),yj=function(){function t(){u(this,t),this._data=new Map}return d(t,[{key:"setData",value:function(t,e){return rF(this,void 0,void 0,c().mark((function n(){return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:this._data.set(t,e);case 1:case"end":return n.stop()}}),n,this)})))}},{key:"getData",value:function(t){var e,n;return rF(this,void 0,void 0,c().mark((function r(){return c().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.abrupt("return",null!==(n=null===(e=this._data)||void 0===e?void 0:e.get(t))&&void 0!==n?n:"{}");case 1:case"end":return r.stop()}}),r,this)})))}},{key:"removeData",value:function(t){return rF(this,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this._data.delete(t);case 1:case"end":return e.stop()}}),e,this)})))}}]),t}(),Xj=function(){function t(){u(this,t)}return d(t,[{key:"setData",value:function(t,e){return rF(this,void 0,void 0,c().mark((function n(){return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:sessionStorage.setItem(t,e);case 1:case"end":return n.stop()}}),n)})))}},{key:"getData",value:function(t){var e;return rF(this,void 0,void 0,c().mark((function n(){return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.abrupt("return",null!==(e=sessionStorage.getItem(t))&&void 0!==e?e:"{}");case 1:case"end":return n.stop()}}),n)})))}},{key:"removeData",value:function(t){return rF(this,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:sessionStorage.removeItem(t);case 1:case"end":return e.stop()}}),e)})))}}]),t}(),gj=[],Gj=[],fj="undefined"!=typeof Uint8Array?Uint8Array:Array,Vj=!1;function Wj(){Vj=!0;for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e=0,n=t.length;e<n;++e)gj[e]=t[e],Gj[t.charCodeAt(e)]=e;Gj["-".charCodeAt(0)]=62,Gj["_".charCodeAt(0)]=63}function vj(t,e,n){for(var r,i,c=[],a=e;a<n;a+=3)r=(t[a]<<16)+(t[a+1]<<8)+t[a+2],c.push(gj[(i=r)>>18&63]+gj[i>>12&63]+gj[i>>6&63]+gj[63&i]);return c.join("")}function Cj(t){var e;Vj||Wj();for(var n=t.length,r=n%3,i="",c=[],a=16383,o=0,l=n-r;o<l;o+=a)c.push(vj(t,o,o+a>l?l:o+a));return 1===r?(e=t[n-1],i+=gj[e>>2],i+=gj[e<<4&63],i+="=="):2===r&&(e=(t[n-2]<<8)+t[n-1],i+=gj[e>>10],i+=gj[e>>4&63],i+=gj[e<<2&63],i+="="),c.push(i),c.join("")}function Yj(t,e,n,r,i){var c,a,o=8*i-r-1,l=(1<<o)-1,u=l>>1,s=-7,d=n?i-1:0,m=n?-1:1,h=t[e+d];for(d+=m,c=h&(1<<-s)-1,h>>=-s,s+=o;s>0;c=256*c+t[e+d],d+=m,s-=8);for(a=c&(1<<-s)-1,c>>=-s,s+=r;s>0;a=256*a+t[e+d],d+=m,s-=8);if(0===c)c=1-u;else{if(c===l)return a?NaN:1/0*(h?-1:1);a+=Math.pow(2,r),c-=u}return(h?-1:1)*a*Math.pow(2,c-r)}function Sj(t,e,n,r,i,c){var a,o,l,u=8*c-i-1,s=(1<<u)-1,d=s>>1,m=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:c-1,b=r?1:-1,Z=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(o=isNaN(e)?1:0,a=s):(a=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-a))<1&&(a--,l*=2),(e+=a+d>=1?m/l:m*Math.pow(2,1-d))*l>=2&&(a++,l/=2),a+d>=s?(o=0,a=s):a+d>=1?(o=(e*l-1)*Math.pow(2,i),a+=d):(o=e*Math.pow(2,d-1)*Math.pow(2,i),a=0));i>=8;t[n+h]=255&o,h+=b,o/=256,i-=8);for(a=a<<i|o,u+=i;u>0;t[n+h]=255&a,h+=b,a/=256,u-=8);t[n+h-b]|=128*Z}var Rj={}.toString,Kj=Array.isArray||function(t){return"[object Array]"==Rj.call(t)};xj.TYPED_ARRAY_SUPPORT=void 0===Yz.TYPED_ARRAY_SUPPORT||Yz.TYPED_ARRAY_SUPPORT;var Nj=Lj();function Lj(){return xj.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Jj(t,e){if(Lj()<e)throw new RangeError("Invalid typed array length");return xj.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(e)).__proto__=xj.prototype:(null===t&&(t=new xj(e)),t.length=e),t}function xj(t,e,n){if(!(xj.TYPED_ARRAY_SUPPORT||this instanceof xj))return new xj(t,e,n);if("number"==typeof t){if("string"==typeof e)throw new Error("If encoding is specified then the first argument must be a string");return Uj(this,t)}return Hj(this,t,e,n)}function Hj(t,e,n,r){if("number"==typeof e)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer?function(t,e,n,r){if(e.byteLength,n<0||e.byteLength<n)throw new RangeError("'offset' is out of bounds");if(e.byteLength<n+(r||0))throw new RangeError("'length' is out of bounds");e=void 0===n&&void 0===r?new Uint8Array(e):void 0===r?new Uint8Array(e,n):new Uint8Array(e,n,r);xj.TYPED_ARRAY_SUPPORT?(t=e).__proto__=xj.prototype:t=Tj(t,e);return t}(t,e,n,r):"string"==typeof e?function(t,e,n){"string"==typeof n&&""!==n||(n="utf8");if(!xj.isEncoding(n))throw new TypeError('"encoding" must be a valid string encoding');var r=0|Fj(e,n),i=(t=Jj(t,r)).write(e,n);i!==r&&(t=t.slice(0,i));return t}(t,e,n):function(t,e){if(Aj(e)){var n=0|wj(e.length);return 0===(t=Jj(t,n)).length||e.copy(t,0,0,n),t}if(e){if("undefined"!=typeof ArrayBuffer&&e.buffer instanceof ArrayBuffer||"length"in e)return"number"!=typeof e.length||(r=e.length)!=r?Jj(t,0):Tj(t,e);if("Buffer"===e.type&&Kj(e.data))return Tj(t,e.data)}var r;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(t,e)}function kj(t){if("number"!=typeof t)throw new TypeError('"size" argument must be a number');if(t<0)throw new RangeError('"size" argument must not be negative')}function Uj(t,e){if(kj(e),t=Jj(t,e<0?0:0|wj(e)),!xj.TYPED_ARRAY_SUPPORT)for(var n=0;n<e;++n)t[n]=0;return t}function Tj(t,e){var n=e.length<0?0:0|wj(e.length);t=Jj(t,n);for(var r=0;r<n;r+=1)t[r]=255&e[r];return t}function wj(t){if(t>=Lj())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+Lj().toString(16)+" bytes");return 0|t}function Aj(t){return!(null==t||!t._isBuffer)}function Fj(t,e){if(Aj(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var n=t.length;if(0===n)return 0;for(var r=!1;;)switch(e){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return hM(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return bM(t).length;default:if(r)return hM(t).length;e=(""+e).toLowerCase(),r=!0}}function zj(t,e,n){var r=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return nM(this,e,n);case"utf8":case"utf-8":return $j(this,e,n);case"ascii":return tM(this,e,n);case"latin1":case"binary":return eM(this,e,n);case"base64":return qj(this,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return rM(this,e,n);default:if(r)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),r=!0}}function Bj(t,e,n){var r=t[e];t[e]=t[n],t[n]=r}function jj(t,e,n,r,i){if(0===t.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=i?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(i)return-1;n=t.length-1}else if(n<0){if(!i)return-1;n=0}if("string"==typeof e&&(e=xj.from(e,r)),Aj(e))return 0===e.length?-1:Mj(t,e,n,r,i);if("number"==typeof e)return e&=255,xj.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,n):Uint8Array.prototype.lastIndexOf.call(t,e,n):Mj(t,[e],n,r,i);throw new TypeError("val must be string, number or Buffer")}function Mj(t,e,n,r,i){var c,a=1,o=t.length,l=e.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(t.length<2||e.length<2)return-1;a=2,o/=2,l/=2,n/=2}function u(t,e){return 1===a?t[e]:t.readUInt16BE(e*a)}if(i){var s=-1;for(c=n;c<o;c++)if(u(t,c)===u(e,-1===s?0:c-s)){if(-1===s&&(s=c),c-s+1===l)return s*a}else-1!==s&&(c-=c-s),s=-1}else for(n+l>o&&(n=o-l),c=n;c>=0;c--){for(var d=!0,m=0;m<l;m++)if(u(t,c+m)!==u(e,m)){d=!1;break}if(d)return c}return-1}function Qj(t,e,n,r){n=Number(n)||0;var i=t.length-n;r?(r=Number(r))>i&&(r=i):r=i;var c=e.length;if(c%2!=0)throw new TypeError("Invalid hex string");r>c/2&&(r=c/2);for(var a=0;a<r;++a){var o=parseInt(e.substr(2*a,2),16);if(isNaN(o))return a;t[n+a]=o}return a}function Pj(t,e,n,r){return ZM(hM(e,t.length-n),t,n,r)}function Ej(t,e,n,r){return ZM(function(t){for(var e=[],n=0;n<t.length;++n)e.push(255&t.charCodeAt(n));return e}(e),t,n,r)}function Dj(t,e,n,r){return Ej(t,e,n,r)}function Oj(t,e,n,r){return ZM(bM(e),t,n,r)}function _j(t,e,n,r){return ZM(function(t,e){for(var n,r,i,c=[],a=0;a<t.length&&!((e-=2)<0);++a)r=(n=t.charCodeAt(a))>>8,i=n%256,c.push(i),c.push(r);return c}(e,t.length-n),t,n,r)}function qj(t,e,n){return 0===e&&n===t.length?Cj(t):Cj(t.slice(e,n))}function $j(t,e,n){n=Math.min(t.length,n);for(var r=[],i=e;i<n;){var c,a,o,l,u=t[i],s=null,d=u>239?4:u>223?3:u>191?2:1;if(i+d<=n)switch(d){case 1:u<128&&(s=u);break;case 2:128==(192&(c=t[i+1]))&&(l=(31&u)<<6|63&c)>127&&(s=l);break;case 3:c=t[i+1],a=t[i+2],128==(192&c)&&128==(192&a)&&(l=(15&u)<<12|(63&c)<<6|63&a)>2047&&(l<55296||l>57343)&&(s=l);break;case 4:c=t[i+1],a=t[i+2],o=t[i+3],128==(192&c)&&128==(192&a)&&128==(192&o)&&(l=(15&u)<<18|(63&c)<<12|(63&a)<<6|63&o)>65535&&l<1114112&&(s=l)}null===s?(s=65533,d=1):s>65535&&(s-=65536,r.push(s>>>10&1023|55296),s=56320|1023&s),r.push(s),i+=d}return function(t){var e=t.length;if(e<=4096)return String.fromCharCode.apply(String,t);var n="",r=0;for(;r<e;)n+=String.fromCharCode.apply(String,t.slice(r,r+=4096));return n}(r)}xj.poolSize=8192,xj._augment=function(t){return t.__proto__=xj.prototype,t},xj.from=function(t,e,n){return Hj(null,t,e,n)},xj.TYPED_ARRAY_SUPPORT&&(xj.prototype.__proto__=Uint8Array.prototype,xj.__proto__=Uint8Array),xj.alloc=function(t,e,n){return function(t,e,n,r){return kj(e),e<=0?Jj(t,e):void 0!==n?"string"==typeof r?Jj(t,e).fill(n,r):Jj(t,e).fill(n):Jj(t,e)}(null,t,e,n)},xj.allocUnsafe=function(t){return Uj(null,t)},xj.allocUnsafeSlow=function(t){return Uj(null,t)},xj.isBuffer=pM,xj.compare=function(t,e){if(!Aj(t)||!Aj(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var n=t.length,r=e.length,i=0,c=Math.min(n,r);i<c;++i)if(t[i]!==e[i]){n=t[i],r=e[i];break}return n<r?-1:r<n?1:0},xj.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},xj.concat=function(t,e){if(!Kj(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return xj.alloc(0);var n;if(void 0===e)for(e=0,n=0;n<t.length;++n)e+=t[n].length;var r=xj.allocUnsafe(e),i=0;for(n=0;n<t.length;++n){var c=t[n];if(!Aj(c))throw new TypeError('"list" argument must be an Array of Buffers');c.copy(r,i),i+=c.length}return r},xj.byteLength=Fj,xj.prototype._isBuffer=!0,xj.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var e=0;e<t;e+=2)Bj(this,e,e+1);return this},xj.prototype.swap32=function(){var t=this.length;if(t%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var e=0;e<t;e+=4)Bj(this,e,e+3),Bj(this,e+1,e+2);return this},xj.prototype.swap64=function(){var t=this.length;if(t%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var e=0;e<t;e+=8)Bj(this,e,e+7),Bj(this,e+1,e+6),Bj(this,e+2,e+5),Bj(this,e+3,e+4);return this},xj.prototype.toString=function(){var t=0|this.length;return 0===t?"":0===arguments.length?$j(this,0,t):zj.apply(this,arguments)},xj.prototype.equals=function(t){if(!Aj(t))throw new TypeError("Argument must be a Buffer");return this===t||0===xj.compare(this,t)},xj.prototype.inspect=function(){var t="";return this.length>0&&(t=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(t+=" ... ")),"<Buffer "+t+">"},xj.prototype.compare=function(t,e,n,r,i){if(!Aj(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===n&&(n=t?t.length:0),void 0===r&&(r=0),void 0===i&&(i=this.length),e<0||n>t.length||r<0||i>this.length)throw new RangeError("out of range index");if(r>=i&&e>=n)return 0;if(r>=i)return-1;if(e>=n)return 1;if(this===t)return 0;for(var c=(i>>>=0)-(r>>>=0),a=(n>>>=0)-(e>>>=0),o=Math.min(c,a),l=this.slice(r,i),u=t.slice(e,n),s=0;s<o;++s)if(l[s]!==u[s]){c=l[s],a=u[s];break}return c<a?-1:a<c?1:0},xj.prototype.includes=function(t,e,n){return-1!==this.indexOf(t,e,n)},xj.prototype.indexOf=function(t,e,n){return jj(this,t,e,n,!0)},xj.prototype.lastIndexOf=function(t,e,n){return jj(this,t,e,n,!1)},xj.prototype.write=function(t,e,n,r){if(void 0===e)r="utf8",n=this.length,e=0;else if(void 0===n&&"string"==typeof e)r=e,n=this.length,e=0;else{if(!isFinite(e))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");e|=0,isFinite(n)?(n|=0,void 0===r&&(r="utf8")):(r=n,n=void 0)}var i=this.length-e;if((void 0===n||n>i)&&(n=i),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var c=!1;;)switch(r){case"hex":return Qj(this,t,e,n);case"utf8":case"utf-8":return Pj(this,t,e,n);case"ascii":return Ej(this,t,e,n);case"latin1":case"binary":return Dj(this,t,e,n);case"base64":return Oj(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return _j(this,t,e,n);default:if(c)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),c=!0}},xj.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function tM(t,e,n){var r="";n=Math.min(t.length,n);for(var i=e;i<n;++i)r+=String.fromCharCode(127&t[i]);return r}function eM(t,e,n){var r="";n=Math.min(t.length,n);for(var i=e;i<n;++i)r+=String.fromCharCode(t[i]);return r}function nM(t,e,n){var r=t.length;(!e||e<0)&&(e=0),(!n||n<0||n>r)&&(n=r);for(var i="",c=e;c<n;++c)i+=mM(t[c]);return i}function rM(t,e,n){for(var r=t.slice(e,n),i="",c=0;c<r.length;c+=2)i+=String.fromCharCode(r[c]+256*r[c+1]);return i}function iM(t,e,n){if(t%1!=0||t<0)throw new RangeError("offset is not uint");if(t+e>n)throw new RangeError("Trying to access beyond buffer length")}function cM(t,e,n,r,i,c){if(!Aj(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||e<c)throw new RangeError('"value" argument is out of bounds');if(n+r>t.length)throw new RangeError("Index out of range")}function aM(t,e,n,r){e<0&&(e=65535+e+1);for(var i=0,c=Math.min(t.length-n,2);i<c;++i)t[n+i]=(e&255<<8*(r?i:1-i))>>>8*(r?i:1-i)}function oM(t,e,n,r){e<0&&(e=4294967295+e+1);for(var i=0,c=Math.min(t.length-n,4);i<c;++i)t[n+i]=e>>>8*(r?i:3-i)&255}function lM(t,e,n,r,i,c){if(n+r>t.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function uM(t,e,n,r,i){return i||lM(t,0,n,4),Sj(t,e,n,r,23,4),n+4}function sM(t,e,n,r,i){return i||lM(t,0,n,8),Sj(t,e,n,r,52,8),n+8}xj.prototype.slice=function(t,e){var n,r=this.length;if((t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e<t&&(e=t),xj.TYPED_ARRAY_SUPPORT)(n=this.subarray(t,e)).__proto__=xj.prototype;else{var i=e-t;n=new xj(i,void 0);for(var c=0;c<i;++c)n[c]=this[c+t]}return n},xj.prototype.readUIntLE=function(t,e,n){t|=0,e|=0,n||iM(t,e,this.length);for(var r=this[t],i=1,c=0;++c<e&&(i*=256);)r+=this[t+c]*i;return r},xj.prototype.readUIntBE=function(t,e,n){t|=0,e|=0,n||iM(t,e,this.length);for(var r=this[t+--e],i=1;e>0&&(i*=256);)r+=this[t+--e]*i;return r},xj.prototype.readUInt8=function(t,e){return e||iM(t,1,this.length),this[t]},xj.prototype.readUInt16LE=function(t,e){return e||iM(t,2,this.length),this[t]|this[t+1]<<8},xj.prototype.readUInt16BE=function(t,e){return e||iM(t,2,this.length),this[t]<<8|this[t+1]},xj.prototype.readUInt32LE=function(t,e){return e||iM(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},xj.prototype.readUInt32BE=function(t,e){return e||iM(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},xj.prototype.readIntLE=function(t,e,n){t|=0,e|=0,n||iM(t,e,this.length);for(var r=this[t],i=1,c=0;++c<e&&(i*=256);)r+=this[t+c]*i;return r>=(i*=128)&&(r-=Math.pow(2,8*e)),r},xj.prototype.readIntBE=function(t,e,n){t|=0,e|=0,n||iM(t,e,this.length);for(var r=e,i=1,c=this[t+--r];r>0&&(i*=256);)c+=this[t+--r]*i;return c>=(i*=128)&&(c-=Math.pow(2,8*e)),c},xj.prototype.readInt8=function(t,e){return e||iM(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},xj.prototype.readInt16LE=function(t,e){e||iM(t,2,this.length);var n=this[t]|this[t+1]<<8;return 32768&n?4294901760|n:n},xj.prototype.readInt16BE=function(t,e){e||iM(t,2,this.length);var n=this[t+1]|this[t]<<8;return 32768&n?4294901760|n:n},xj.prototype.readInt32LE=function(t,e){return e||iM(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},xj.prototype.readInt32BE=function(t,e){return e||iM(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},xj.prototype.readFloatLE=function(t,e){return e||iM(t,4,this.length),Yj(this,t,!0,23,4)},xj.prototype.readFloatBE=function(t,e){return e||iM(t,4,this.length),Yj(this,t,!1,23,4)},xj.prototype.readDoubleLE=function(t,e){return e||iM(t,8,this.length),Yj(this,t,!0,52,8)},xj.prototype.readDoubleBE=function(t,e){return e||iM(t,8,this.length),Yj(this,t,!1,52,8)},xj.prototype.writeUIntLE=function(t,e,n,r){(t=+t,e|=0,n|=0,r)||cM(this,t,e,n,Math.pow(2,8*n)-1,0);var i=1,c=0;for(this[e]=255&t;++c<n&&(i*=256);)this[e+c]=t/i&255;return e+n},xj.prototype.writeUIntBE=function(t,e,n,r){(t=+t,e|=0,n|=0,r)||cM(this,t,e,n,Math.pow(2,8*n)-1,0);var i=n-1,c=1;for(this[e+i]=255&t;--i>=0&&(c*=256);)this[e+i]=t/c&255;return e+n},xj.prototype.writeUInt8=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,1,255,0),xj.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},xj.prototype.writeUInt16LE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,2,65535,0),xj.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):aM(this,t,e,!0),e+2},xj.prototype.writeUInt16BE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,2,65535,0),xj.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):aM(this,t,e,!1),e+2},xj.prototype.writeUInt32LE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,4,4294967295,0),xj.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):oM(this,t,e,!0),e+4},xj.prototype.writeUInt32BE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,4,4294967295,0),xj.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):oM(this,t,e,!1),e+4},xj.prototype.writeIntLE=function(t,e,n,r){if(t=+t,e|=0,!r){var i=Math.pow(2,8*n-1);cM(this,t,e,n,i-1,-i)}var c=0,a=1,o=0;for(this[e]=255&t;++c<n&&(a*=256);)t<0&&0===o&&0!==this[e+c-1]&&(o=1),this[e+c]=(t/a>>0)-o&255;return e+n},xj.prototype.writeIntBE=function(t,e,n,r){if(t=+t,e|=0,!r){var i=Math.pow(2,8*n-1);cM(this,t,e,n,i-1,-i)}var c=n-1,a=1,o=0;for(this[e+c]=255&t;--c>=0&&(a*=256);)t<0&&0===o&&0!==this[e+c+1]&&(o=1),this[e+c]=(t/a>>0)-o&255;return e+n},xj.prototype.writeInt8=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,1,127,-128),xj.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},xj.prototype.writeInt16LE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,2,32767,-32768),xj.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):aM(this,t,e,!0),e+2},xj.prototype.writeInt16BE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,2,32767,-32768),xj.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):aM(this,t,e,!1),e+2},xj.prototype.writeInt32LE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,4,2147483647,-2147483648),xj.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):oM(this,t,e,!0),e+4},xj.prototype.writeInt32BE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),xj.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):oM(this,t,e,!1),e+4},xj.prototype.writeFloatLE=function(t,e,n){return uM(this,t,e,!0,n)},xj.prototype.writeFloatBE=function(t,e,n){return uM(this,t,e,!1,n)},xj.prototype.writeDoubleLE=function(t,e,n){return sM(this,t,e,!0,n)},xj.prototype.writeDoubleBE=function(t,e,n){return sM(this,t,e,!1,n)},xj.prototype.copy=function(t,e,n,r){if(n||(n=0),r||0===r||(r=this.length),e>=t.length&&(e=t.length),e||(e=0),r>0&&r<n&&(r=n),r===n)return 0;if(0===t.length||0===this.length)return 0;if(e<0)throw new RangeError("targetStart out of bounds");if(n<0||n>=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),t.length-e<r-n&&(r=t.length-e+n);var i,c=r-n;if(this===t&&n<e&&e<r)for(i=c-1;i>=0;--i)t[i+e]=this[i+n];else if(c<1e3||!xj.TYPED_ARRAY_SUPPORT)for(i=0;i<c;++i)t[i+e]=this[i+n];else Uint8Array.prototype.set.call(t,this.subarray(n,n+c),e);return c},xj.prototype.fill=function(t,e,n,r){if("string"==typeof t){if("string"==typeof e?(r=e,e=0,n=this.length):"string"==typeof n&&(r=n,n=this.length),1===t.length){var i=t.charCodeAt(0);i<256&&(t=i)}if(void 0!==r&&"string"!=typeof r)throw new TypeError("encoding must be a string");if("string"==typeof r&&!xj.isEncoding(r))throw new TypeError("Unknown encoding: "+r)}else"number"==typeof t&&(t&=255);if(e<0||this.length<e||this.length<n)throw new RangeError("Out of range index");if(n<=e)return this;var c;if(e>>>=0,n=void 0===n?this.length:n>>>0,t||(t=0),"number"==typeof t)for(c=e;c<n;++c)this[c]=t;else{var a=Aj(t)?t:hM(new xj(t,r).toString()),o=a.length;for(c=0;c<n-e;++c)this[c+e]=a[c%o]}return this};var dM=/[^+\/0-9A-Za-z-_]/g;function mM(t){return t<16?"0"+t.toString(16):t.toString(16)}function hM(t,e){var n;e=e||1/0;for(var r=t.length,i=null,c=[],a=0;a<r;++a){if((n=t.charCodeAt(a))>55295&&n<57344){if(!i){if(n>56319){(e-=3)>-1&&c.push(239,191,189);continue}if(a+1===r){(e-=3)>-1&&c.push(239,191,189);continue}i=n;continue}if(n<56320){(e-=3)>-1&&c.push(239,191,189),i=n;continue}n=65536+(i-55296<<10|n-56320)}else i&&(e-=3)>-1&&c.push(239,191,189);if(i=null,n<128){if((e-=1)<0)break;c.push(n)}else if(n<2048){if((e-=2)<0)break;c.push(n>>6|192,63&n|128)}else if(n<65536){if((e-=3)<0)break;c.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;c.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return c}function bM(t){return function(t){var e,n,r,i,c,a;Vj||Wj();var o=t.length;if(o%4>0)throw new Error("Invalid string. Length must be a multiple of 4");c="="===t[o-2]?2:"="===t[o-1]?1:0,a=new fj(3*o/4-c),r=c>0?o-4:o;var l=0;for(e=0,n=0;e<r;e+=4,n+=3)i=Gj[t.charCodeAt(e)]<<18|Gj[t.charCodeAt(e+1)]<<12|Gj[t.charCodeAt(e+2)]<<6|Gj[t.charCodeAt(e+3)],a[l++]=i>>16&255,a[l++]=i>>8&255,a[l++]=255&i;return 2===c?(i=Gj[t.charCodeAt(e)]<<2|Gj[t.charCodeAt(e+1)]>>4,a[l++]=255&i):1===c&&(i=Gj[t.charCodeAt(e)]<<10|Gj[t.charCodeAt(e+1)]<<4|Gj[t.charCodeAt(e+2)]>>2,a[l++]=i>>8&255,a[l++]=255&i),a}(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(dM,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function ZM(t,e,n,r){for(var i=0;i<r&&!(i+n>=e.length||i>=t.length);++i)e[i+n]=t[i];return i}function pM(t){return null!=t&&(!!t._isBuffer||IM(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&IM(t.slice(0,0))}(t))}function IM(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}var yM=Object.freeze({__proto__:null,Buffer:xj,INSPECT_MAX_BYTES:50,SlowBuffer:function(t){return+t!=t&&(t=0),xj.alloc(+t)},isBuffer:pM,kMaxLength:Nj}),XM={exports:{}},gM={},GM={};Object.defineProperty(GM,"__esModule",{value:!0}),GM.default=function(t){var e=t.length,n=e%4;if(!n)return t;var r=e,i=4-n,c=e+i,a=xj.alloc(c);for(a.write(t);i--;)a.write("=",r++);return a.toString()},Object.defineProperty(gM,"__esModule",{value:!0});var fM=GM;function VM(t,e){return void 0===e&&(e="utf8"),xj.isBuffer(t)?vM(t.toString("base64")):vM(xj.from(t,e).toString("base64"))}function WM(t){return t=t.toString(),fM.default(t).replace(/\-/g,"+").replace(/_/g,"/")}function vM(t){return t.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}var CM,YM=VM;YM.encode=VM,YM.decode=function(t,e){return void 0===e&&(e="utf8"),xj.from(WM(t),"base64").toString(e)},YM.toBase64=WM,YM.fromBase64=vM,YM.toBuffer=function(t){return xj.from(WM(t),"base64")},gM.default=YM,(CM=XM).exports=gM.default,CM.exports.default=CM.exports;var SM=XM.exports,RM={exports:{}};!function(t){!function(e,n){var r={};!function(t){t.__esModule=!0,t.digestLength=32,t.blockSize=64;var e=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);function n(t,n,r,i,c){for(var a,o,l,u,s,d,m,h,b,Z,p,I,y;c>=64;){for(a=n[0],o=n[1],l=n[2],u=n[3],s=n[4],d=n[5],m=n[6],h=n[7],Z=0;Z<16;Z++)p=i+4*Z,t[Z]=(255&r[p])<<24|(255&r[p+1])<<16|(255&r[p+2])<<8|255&r[p+3];for(Z=16;Z<64;Z++)I=((b=t[Z-2])>>>17|b<<15)^(b>>>19|b<<13)^b>>>10,y=((b=t[Z-15])>>>7|b<<25)^(b>>>18|b<<14)^b>>>3,t[Z]=(I+t[Z-7]|0)+(y+t[Z-16]|0);for(Z=0;Z<64;Z++)I=(((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))+(s&d^~s&m)|0)+(h+(e[Z]+t[Z]|0)|0)|0,y=((a>>>2|a<<30)^(a>>>13|a<<19)^(a>>>22|a<<10))+(a&o^a&l^o&l)|0,h=m,m=d,d=s,s=u+I|0,u=l,l=o,o=a,a=I+y|0;n[0]+=a,n[1]+=o,n[2]+=l,n[3]+=u,n[4]+=s,n[5]+=d,n[6]+=m,n[7]+=h,i+=64,c-=64}return i}var r=function(){function e(){this.digestLength=t.digestLength,this.blockSize=t.blockSize,this.state=new Int32Array(8),this.temp=new Int32Array(64),this.buffer=new Uint8Array(128),this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this.reset()}return e.prototype.reset=function(){return this.state[0]=1779033703,this.state[1]=3144134277,this.state[2]=1013904242,this.state[3]=2773480762,this.state[4]=1359893119,this.state[5]=2600822924,this.state[6]=528734635,this.state[7]=1541459225,this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this},e.prototype.clean=function(){for(var t=0;t<this.buffer.length;t++)this.buffer[t]=0;for(t=0;t<this.temp.length;t++)this.temp[t]=0;this.reset()},e.prototype.update=function(t,e){if(void 0===e&&(e=t.length),this.finished)throw new Error("SHA256: can't update because hash was finished.");var r=0;if(this.bytesHashed+=e,this.bufferLength>0){for(;this.bufferLength<64&&e>0;)this.buffer[this.bufferLength++]=t[r++],e--;64===this.bufferLength&&(n(this.temp,this.state,this.buffer,0,64),this.bufferLength=0)}for(e>=64&&(r=n(this.temp,this.state,t,r,e),e%=64);e>0;)this.buffer[this.bufferLength++]=t[r++],e--;return this},e.prototype.finish=function(t){if(!this.finished){var e=this.bytesHashed,r=this.bufferLength,i=e/536870912|0,c=e<<3,a=e%64<56?64:128;this.buffer[r]=128;for(var o=r+1;o<a-8;o++)this.buffer[o]=0;this.buffer[a-8]=i>>>24&255,this.buffer[a-7]=i>>>16&255,this.buffer[a-6]=i>>>8&255,this.buffer[a-5]=i>>>0&255,this.buffer[a-4]=c>>>24&255,this.buffer[a-3]=c>>>16&255,this.buffer[a-2]=c>>>8&255,this.buffer[a-1]=c>>>0&255,n(this.temp,this.state,this.buffer,0,a),this.finished=!0}for(o=0;o<8;o++)t[4*o+0]=this.state[o]>>>24&255,t[4*o+1]=this.state[o]>>>16&255,t[4*o+2]=this.state[o]>>>8&255,t[4*o+3]=this.state[o]>>>0&255;return this},e.prototype.digest=function(){var t=new Uint8Array(this.digestLength);return this.finish(t),t},e.prototype._saveState=function(t){for(var e=0;e<this.state.length;e++)t[e]=this.state[e]},e.prototype._restoreState=function(t,e){for(var n=0;n<this.state.length;n++)this.state[n]=t[n];this.bytesHashed=e,this.finished=!1,this.bufferLength=0},e}();t.Hash=r;var i=function(){function t(t){this.inner=new r,this.outer=new r,this.blockSize=this.inner.blockSize,this.digestLength=this.inner.digestLength;var e=new Uint8Array(this.blockSize);if(t.length>this.blockSize)(new r).update(t).finish(e).clean();else for(var n=0;n<t.length;n++)e[n]=t[n];for(n=0;n<e.length;n++)e[n]^=54;this.inner.update(e);for(n=0;n<e.length;n++)e[n]^=106;this.outer.update(e),this.istate=new Uint32Array(8),this.ostate=new Uint32Array(8),this.inner._saveState(this.istate),this.outer._saveState(this.ostate);for(n=0;n<e.length;n++)e[n]=0}return t.prototype.reset=function(){return this.inner._restoreState(this.istate,this.inner.blockSize),this.outer._restoreState(this.ostate,this.outer.blockSize),this},t.prototype.clean=function(){for(var t=0;t<this.istate.length;t++)this.ostate[t]=this.istate[t]=0;this.inner.clean(),this.outer.clean()},t.prototype.update=function(t){return this.inner.update(t),this},t.prototype.finish=function(t){return this.outer.finished?this.outer.finish(t):(this.inner.finish(t),this.outer.update(t,this.digestLength).finish(t)),this},t.prototype.digest=function(){var t=new Uint8Array(this.digestLength);return this.finish(t),t},t}();function c(t){var e=(new r).update(t),n=e.digest();return e.clean(),n}function a(t,e){var n=new i(t).update(e),r=n.digest();return n.clean(),r}function o(t,e,n,r){var i=r[0];if(0===i)throw new Error("hkdf: cannot expand more");e.reset(),i>1&&e.update(t),n&&e.update(n),e.update(r),e.finish(t),r[0]++}t.HMAC=i,t.hash=c,t.default=c,t.hmac=a;var l=new Uint8Array(t.digestLength);function u(t,e,n,r){void 0===e&&(e=l),void 0===r&&(r=32);for(var c=new Uint8Array([1]),u=a(e,t),s=new i(u),d=new Uint8Array(s.digestLength),m=d.length,h=new Uint8Array(r),b=0;b<r;b++)m===d.length&&(o(d,s,n,c),m=0),h[b]=d[m++];return s.clean(),d.fill(0),c.fill(0),h}function s(t,e,n,r){for(var c=new i(t),a=c.digestLength,o=new Uint8Array(4),l=new Uint8Array(a),u=new Uint8Array(a),s=new Uint8Array(r),d=0;d*a<r;d++){var m=d+1;o[0]=m>>>24&255,o[1]=m>>>16&255,o[2]=m>>>8&255,o[3]=m>>>0&255,c.reset(),c.update(e),c.update(o),c.finish(u);for(var h=0;h<a;h++)l[h]=u[h];for(h=2;h<=n;h++){c.reset(),c.update(u).finish(u);for(var b=0;b<a;b++)l[b]^=u[b]}for(h=0;h<a&&d*a+h<r;h++)s[d*a+h]=l[h]}for(d=0;d<a;d++)l[d]=u[d]=0;for(d=0;d<4;d++)o[d]=0;return c.clean(),s}t.hkdf=u,t.pbkdf2=s}(r);var i=r.default;for(var c in r)i[c]=r[c];t.exports=i}()}(RM);var KM=e(RM.exports),NM=crypto,LM=function(t){return t instanceof CryptoKey},JM=new TextEncoder,xM=new TextDecoder;function HM(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];var r=e.reduce((function(t,e){return t+e.length}),0),i=new Uint8Array(r),c=0;return e.forEach((function(t){i.set(t,c),c+=t.length})),i}var kM=function(t){var e=t;e instanceof Uint8Array&&(e=xM.decode(e)),e=e.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,"");try{return function(t){for(var e=atob(t),n=new Uint8Array(e.length),r=0;r<e.length;r++)n[r]=e.charCodeAt(r);return n}(e)}catch(t){throw new TypeError("The input to be decoded is not correctly encoded.")}},UM=function(t){h(n,y(Error));var e=G(n);function n(t){var r,i;return u(this,n),(r=e.call(this,t)).code="ERR_JOSE_GENERIC",r.name=r.constructor.name,null===(i=Error.captureStackTrace)||void 0===i||i.call(Error,X(r),r.constructor),r}return d(n,null,[{key:"code",get:function(){return"ERR_JOSE_GENERIC"}}]),n}(),TM=function(t){h(n,UM);var e=G(n);function n(t){var r,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"unspecified",c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"unspecified";return u(this,n),(r=e.call(this,t)).code="ERR_JWT_CLAIM_VALIDATION_FAILED",r.claim=i,r.reason=c,r}return d(n,null,[{key:"code",get:function(){return"ERR_JWT_CLAIM_VALIDATION_FAILED"}}]),n}(),wM=function(t){h(n,UM);var e=G(n);function n(t){var r,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"unspecified",c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"unspecified";return u(this,n),(r=e.call(this,t)).code="ERR_JWT_EXPIRED",r.claim=i,r.reason=c,r}return d(n,null,[{key:"code",get:function(){return"ERR_JWT_EXPIRED"}}]),n}(),AM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JOSE_ALG_NOT_ALLOWED",t}return d(n,null,[{key:"code",get:function(){return"ERR_JOSE_ALG_NOT_ALLOWED"}}]),n}(),FM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JOSE_NOT_SUPPORTED",t}return d(n,null,[{key:"code",get:function(){return"ERR_JOSE_NOT_SUPPORTED"}}]),n}(),zM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JWS_INVALID",t}return d(n,null,[{key:"code",get:function(){return"ERR_JWS_INVALID"}}]),n}(),BM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JWT_INVALID",t}return d(n,null,[{key:"code",get:function(){return"ERR_JWT_INVALID"}}]),n}(),jM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JWKS_INVALID",t}return d(n,null,[{key:"code",get:function(){return"ERR_JWKS_INVALID"}}]),n}(),MM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JWKS_NO_MATCHING_KEY",t.message="no applicable key found in the JSON Web Key Set",t}return d(n,null,[{key:"code",get:function(){return"ERR_JWKS_NO_MATCHING_KEY"}}]),n}(),QM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JWKS_MULTIPLE_MATCHING_KEYS",t.message="multiple matching keys found in the JSON Web Key Set",t}return d(n,null,[{key:"code",get:function(){return"ERR_JWKS_MULTIPLE_MATCHING_KEYS"}}]),n}(),PM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JWS_SIGNATURE_VERIFICATION_FAILED",t.message="signature verification failed",t}return d(n,null,[{key:"code",get:function(){return"ERR_JWS_SIGNATURE_VERIFICATION_FAILED"}}]),n}();function EM(){return"function"==typeof WebSocketPair}function DM(){try{return void 0!==qz.versions.node}catch(t){return!1}}function OM(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"algorithm.name";return new TypeError("CryptoKey does not support this operation, its ".concat(e," must be ").concat(t))}function _M(t,e){return t.name===e}function qM(t){return parseInt(t.name.slice(4),10)}function $M(t){switch(t){case"ES256":return"P-256";case"ES384":return"P-384";case"ES512":return"P-521";default:throw new Error("unreachable")}}function tQ(t,e){if(e.length&&!e.some((function(e){return t.usages.includes(e)}))){var n="CryptoKey does not support this operation, its usages must include ";if(e.length>2){var r=e.pop();n+="one of ".concat(e.join(", "),", or ").concat(r,".")}else 2===e.length?n+="one of ".concat(e[0]," or ").concat(e[1],"."):n+="".concat(e[0],".");throw new TypeError(n)}}var eQ=function(t){for(var e="Key must be ",n=arguments.length,r=new Array(n>1?n-1:0),i=1;i<n;i++)r[i-1]=arguments[i];if(r.length>2){var c=r.pop();e+="one of type ".concat(r.join(", "),", or ").concat(c,".")}else 2===r.length?e+="one of type ".concat(r[0]," or ").concat(r[1],"."):e+="of type ".concat(r[0],".");return null==t?e+=" Received ".concat(t):"function"==typeof t&&t.name?e+=" Received function ".concat(t.name):"object"===a(t)&&null!=t&&t.constructor&&t.constructor.name&&(e+=" Received an instance of ".concat(t.constructor.name)),e},nQ=function(t){return LM(t)},rQ=["CryptoKey"],iQ=function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];var r,i=e.filter(Boolean);if(0===i.length||1===i.length)return!0;var c,a=C(i);try{for(a.s();!(c=a.n()).done;){var o=c.value,l=Object.keys(o);if(r&&0!==r.size)for(var u=0,s=l;u<s.length;u++){var d=s[u];if(r.has(d))return!1;r.add(d)}else r=new Set(l)}}catch(t){a.e(t)}finally{a.f()}return!0};function cQ(t){if("object"!==a(e=t)||null===e||"[object Object]"!==Object.prototype.toString.call(t))return!1;var e;if(null===Object.getPrototypeOf(t))return!0;for(var n=t;null!==Object.getPrototypeOf(n);)n=Object.getPrototypeOf(n);return Object.getPrototypeOf(t)===n}var aQ=function(t,e){if(t.startsWith("RS")||t.startsWith("PS")){var n=e.algorithm.modulusLength;if("number"!=typeof n||n<2048)throw new TypeError("".concat(t," requires key modulusLength to be 2048 bits or larger"))}};function oQ(t){var e,n;switch(t.kty){case"oct":switch(t.alg){case"HS256":case"HS384":case"HS512":e={name:"HMAC",hash:"SHA-".concat(t.alg.slice(-3))},n=["sign","verify"];break;case"A128CBC-HS256":case"A192CBC-HS384":case"A256CBC-HS512":throw new FM("".concat(t.alg," keys cannot be imported as CryptoKey instances"));case"A128GCM":case"A192GCM":case"A256GCM":case"A128GCMKW":case"A192GCMKW":case"A256GCMKW":e={name:"AES-GCM"},n=["encrypt","decrypt"];break;case"A128KW":case"A192KW":case"A256KW":e={name:"AES-KW"},n=["wrapKey","unwrapKey"];break;case"PBES2-HS256+A128KW":case"PBES2-HS384+A192KW":case"PBES2-HS512+A256KW":e={name:"PBKDF2"},n=["deriveBits"];break;default:throw new FM('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"RSA":switch(t.alg){case"PS256":case"PS384":case"PS512":e={name:"RSA-PSS",hash:"SHA-".concat(t.alg.slice(-3))},n=t.d?["sign"]:["verify"];break;case"RS256":case"RS384":case"RS512":e={name:"RSASSA-PKCS1-v1_5",hash:"SHA-".concat(t.alg.slice(-3))},n=t.d?["sign"]:["verify"];break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":e={name:"RSA-OAEP",hash:"SHA-".concat(parseInt(t.alg.slice(-3),10)||1)},n=t.d?["decrypt","unwrapKey"]:["encrypt","wrapKey"];break;default:throw new FM('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"EC":switch(t.alg){case"ES256":e={name:"ECDSA",namedCurve:"P-256"},n=t.d?["sign"]:["verify"];break;case"ES384":e={name:"ECDSA",namedCurve:"P-384"},n=t.d?["sign"]:["verify"];break;case"ES512":e={name:"ECDSA",namedCurve:"P-521"},n=t.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":e={name:"ECDH",namedCurve:t.crv},n=t.d?["deriveBits"]:[];break;default:throw new FM('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case(EM()||DM())&&"OKP":if("EdDSA"!==t.alg)throw new FM('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');switch(t.crv){case"Ed25519":e={name:"NODE-ED25519",namedCurve:"NODE-ED25519"},n=t.d?["sign"]:["verify"];break;case DM()&&"Ed448":e={name:"NODE-ED448",namedCurve:"NODE-ED448"},n=t.d?["sign"]:["verify"];break;default:throw new FM('Invalid or unsupported JWK "crv" (Subtype of Key Pair) Parameter value')}break;default:throw new FM('Invalid or unsupported JWK "kty" (Key Type) Parameter value')}return{algorithm:e,keyUsages:n}}var lQ=function(){var t=l(c().mark((function t(e){var n,r,a,o,l,u,s,d,m;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(o=oQ(e),l=o.algorithm,u=o.keyUsages,s=[l,null!==(r=e.ext)&&void 0!==r&&r,null!==(a=e.key_ops)&&void 0!==a?a:u],"PBKDF2"!==l.name){t.next=4;break}return t.abrupt("return",(d=NM.subtle).importKey.apply(d,["raw",kM(e.k)].concat(s)));case 4:return delete(m=i({},e)).alg,t.abrupt("return",(n=NM.subtle).importKey.apply(n,["jwk",m].concat(s)));case 7:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();function uQ(t,e,n){return sQ.apply(this,arguments)}function sQ(){return(sQ=l(c().mark((function t(e,n,r){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(cQ(e)){t.next=2;break}throw new TypeError("JWK must be an object");case 2:if(n||(n=e.alg),"string"==typeof n&&n){t.next=5;break}throw new TypeError('"alg" argument is required when "jwk.alg" is not present');case 5:t.t0=e.kty,t.next="oct"===t.t0?8:"RSA"===t.t0?14:"EC"===t.t0||"OKP"===t.t0?16:17;break;case 8:if("string"==typeof e.k&&e.k){t.next=10;break}throw new TypeError('missing "k" (Key Value) Parameter value');case 10:if(null!=r||(r=!0!==e.ext),!r){t.next=13;break}return t.abrupt("return",lQ(i(i({},e),{},{alg:n,ext:!1})));case 13:return t.abrupt("return",kM(e.k));case 14:if(void 0===e.oth){t.next=16;break}throw new FM('RSA JWK "oth" (Other Primes Info) Parameter value is not supported');case 16:return t.abrupt("return",lQ(i(i({},e),{},{alg:n})));case 17:throw new FM('Unsupported "kty" (Key Type) Parameter value');case 18:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var dQ=function(t,e,n){t.startsWith("HS")||"dir"===t||t.startsWith("PBES2")||/^A\d{3}(?:GCM)?KW$/.test(t)?function(t){if(!(t instanceof Uint8Array)){if(!nQ(t))throw new TypeError(eQ.apply(void 0,[t].concat(V(rQ),["Uint8Array"])));if("secret"!==t.type)throw new TypeError("".concat(rQ.join(" or "),' instances for symmetric algorithms must be of type "secret"'))}}(e):function(t,e){if(!nQ(t))throw new TypeError(eQ.apply(void 0,[t].concat(V(rQ))));if("secret"===t.type)throw new TypeError("".concat(rQ.join(" or "),' instances for asymmetric algorithms must not be of type "secret"'));if("sign"===e&&"public"===t.type)throw new TypeError("".concat(rQ.join(" or "),' instances for asymmetric algorithm signing must be of type "private"'));if("decrypt"===e&&"public"===t.type)throw new TypeError("".concat(rQ.join(" or "),' instances for asymmetric algorithm decryption must be of type "private"'));if(t.algorithm&&"verify"===e&&"private"===t.type)throw new TypeError("".concat(rQ.join(" or "),' instances for asymmetric algorithm verifying must be of type "public"'));if(t.algorithm&&"encrypt"===e&&"private"===t.type)throw new TypeError("".concat(rQ.join(" or "),' instances for asymmetric algorithm encryption must be of type "public"'))}(e,n)};function mQ(t,e,n,r,i){if(void 0!==i.crit&&void 0===r.crit)throw new t('"crit" (Critical) Header Parameter MUST be integrity protected');if(!r||void 0===r.crit)return new Set;if(!Array.isArray(r.crit)||0===r.crit.length||r.crit.some((function(t){return"string"!=typeof t||0===t.length})))throw new t('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present');var c;c=void 0!==n?new Map([].concat(V(Object.entries(n)),V(e.entries()))):e;var a,o=C(r.crit);try{for(o.s();!(a=o.n()).done;){var l=a.value;if(!c.has(l))throw new FM('Extension Header Parameter "'.concat(l,'" is not recognized'));if(void 0===i[l])throw new t('Extension Header Parameter "'.concat(l,'" is missing'));if(c.get(l)&&void 0===r[l])throw new t('Extension Header Parameter "'.concat(l,'" MUST be integrity protected'))}}catch(t){o.e(t)}finally{o.f()}return new Set(r.crit)}var hQ=function(t,e){if(void 0!==e&&(!Array.isArray(e)||e.some((function(t){return"string"!=typeof t}))))throw new TypeError('"'.concat(t,'" option must be an array of strings'));if(e)return new Set(e)};function bQ(t,e){var n="SHA-".concat(t.slice(-3));switch(t){case"HS256":case"HS384":case"HS512":return{hash:n,name:"HMAC"};case"PS256":case"PS384":case"PS512":return{hash:n,name:"RSA-PSS",saltLength:t.slice(-3)>>3};case"RS256":case"RS384":case"RS512":return{hash:n,name:"RSASSA-PKCS1-v1_5"};case"ES256":case"ES384":case"ES512":return{hash:n,name:"ECDSA",namedCurve:e.namedCurve};case(EM()||DM())&&"EdDSA":var r=e.namedCurve;return{name:r,namedCurve:r};default:throw new FM("alg ".concat(t," is not supported either by JOSE or your javascript runtime"))}}function ZQ(t,e,n){if(LM(e))return function(t,e){switch(e){case"HS256":case"HS384":case"HS512":if(!_M(t.algorithm,"HMAC"))throw OM("HMAC");var n=parseInt(e.slice(2),10);if(qM(t.algorithm.hash)!==n)throw OM("SHA-".concat(n),"algorithm.hash");break;case"RS256":case"RS384":case"RS512":if(!_M(t.algorithm,"RSASSA-PKCS1-v1_5"))throw OM("RSASSA-PKCS1-v1_5");var r=parseInt(e.slice(2),10);if(qM(t.algorithm.hash)!==r)throw OM("SHA-".concat(r),"algorithm.hash");break;case"PS256":case"PS384":case"PS512":if(!_M(t.algorithm,"RSA-PSS"))throw OM("RSA-PSS");var i=parseInt(e.slice(2),10);if(qM(t.algorithm.hash)!==i)throw OM("SHA-".concat(i),"algorithm.hash");break;case DM()&&"EdDSA":if("NODE-ED25519"!==t.algorithm.name&&"NODE-ED448"!==t.algorithm.name)throw OM("NODE-ED25519 or NODE-ED448");break;case EM()&&"EdDSA":if(!_M(t.algorithm,"NODE-ED25519"))throw OM("NODE-ED25519");break;case"ES256":case"ES384":case"ES512":if(!_M(t.algorithm,"ECDSA"))throw OM("ECDSA");var c=$M(e);if(t.algorithm.namedCurve!==c)throw OM(c,"algorithm.namedCurve");break;default:throw new TypeError("CryptoKey does not support this operation")}for(var a=arguments.length,o=new Array(a>2?a-2:0),l=2;l<a;l++)o[l-2]=arguments[l];tQ(t,o)}(e,t,n),e;if(e instanceof Uint8Array){if(!t.startsWith("HS"))throw new TypeError(eQ.apply(void 0,[e].concat(V(rQ))));return NM.subtle.importKey("raw",e,{hash:"SHA-".concat(t.slice(-3)),name:"HMAC"},!1,[n])}throw new TypeError(eQ.apply(void 0,[e].concat(V(rQ),["Uint8Array"])))}var pQ=function(){var t=l(c().mark((function t(e,n,r,i){var a,o;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,ZQ(e,n,"verify");case 2:return a=t.sent,aQ(e,a),o=bQ(e,a.algorithm),t.prev=5,t.next=8,NM.subtle.verify(o,a,r,i);case 8:return t.abrupt("return",t.sent);case 11:return t.prev=11,t.t0=t.catch(5),t.abrupt("return",!1);case 14:case"end":return t.stop()}}),t,null,[[5,11]])})));return function(e,n,r,i){return t.apply(this,arguments)}}();function IQ(t,e,n){return yQ.apply(this,arguments)}function yQ(){return yQ=l(c().mark((function t(e,n,r){var a,o,l,u,s,d,m,h,b,Z,p,I,y;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(cQ(e)){t.next=2;break}throw new zM("Flattened JWS must be an object");case 2:if(void 0!==e.protected||void 0!==e.header){t.next=4;break}throw new zM('Flattened JWS must have either of the "protected" or "header" members');case 4:if(void 0===e.protected||"string"==typeof e.protected){t.next=6;break}throw new zM("JWS Protected Header incorrect type");case 6:if(void 0!==e.payload){t.next=8;break}throw new zM("JWS Payload missing");case 8:if("string"==typeof e.signature){t.next=10;break}throw new zM("JWS Signature missing or incorrect type");case 10:if(void 0===e.header||cQ(e.header)){t.next=12;break}throw new zM("JWS Unprotected Header incorrect type");case 12:if(o={},!e.protected){t.next=22;break}l=kM(e.protected),t.prev=15,o=JSON.parse(xM.decode(l)),t.next=22;break;case 19:throw t.prev=19,t.t0=t.catch(15),new zM("JWS Protected Header is invalid");case 22:if(iQ(o,e.header)){t.next=24;break}throw new zM("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");case 24:if(u=i(i({},o),e.header),s=mQ(zM,new Map([["b64",!0]]),null==r?void 0:r.crit,o,u),d=!0,!s.has("b64")){t.next=31;break}if("boolean"==typeof(d=o.b64)){t.next=31;break}throw new zM('The "b64" (base64url-encode payload) Header Parameter must be a boolean');case 31:if("string"==typeof(m=u.alg)&&m){t.next=34;break}throw new zM('JWS "alg" (Algorithm) Header Parameter missing or invalid');case 34:if(!(h=r&&hQ("algorithms",r.algorithms))||h.has(m)){t.next=37;break}throw new AM('"alg" (Algorithm) Header Parameter not allowed');case 37:if(!d){t.next=42;break}if("string"==typeof e.payload){t.next=40;break}throw new zM("JWS Payload must be a string");case 40:t.next=44;break;case 42:if("string"==typeof e.payload||e.payload instanceof Uint8Array){t.next=44;break}throw new zM("JWS Payload must be a string or an Uint8Array instance");case 44:if(b=!1,"function"!=typeof n){t.next=50;break}return t.next=48,n(o,e);case 48:n=t.sent,b=!0;case 50:return dQ(m,n,"verify"),Z=HM(JM.encode(null!==(a=e.protected)&&void 0!==a?a:""),JM.encode("."),"string"==typeof e.payload?JM.encode(e.payload):e.payload),p=kM(e.signature),t.next=55,pQ(m,n,p,Z);case 55:if(t.sent){t.next=58;break}throw new PM;case 58:if(I=d?kM(e.payload):"string"==typeof e.payload?JM.encode(e.payload):e.payload,y={payload:I},void 0!==e.protected&&(y.protectedHeader=o),void 0!==e.header&&(y.unprotectedHeader=e.header),!b){t.next=64;break}return t.abrupt("return",i(i({},y),{},{key:n}));case 64:return t.abrupt("return",y);case 65:case"end":return t.stop()}}),t,null,[[15,19]])}))),yQ.apply(this,arguments)}function XQ(t,e,n){return gQ.apply(this,arguments)}function gQ(){return gQ=l(c().mark((function t(e,n,r){var a,o,l,u,s,d;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(e instanceof Uint8Array&&(e=xM.decode(e)),"string"==typeof e){t.next=3;break}throw new zM("Compact JWS must be a string or Uint8Array");case 3:if(a=e.split("."),o=a[0],l=a[1],u=a[2],3===a.length){t.next=6;break}throw new zM("Invalid Compact JWS");case 6:return t.next=8,IQ({payload:l,protected:o,signature:u},n,r);case 8:if(s=t.sent,d={payload:s.payload,protectedHeader:s.protectedHeader},"function"!=typeof n){t.next=12;break}return t.abrupt("return",i(i({},d),{},{key:s.key}));case 12:return t.abrupt("return",d);case 13:case"end":return t.stop()}}),t)}))),gQ.apply(this,arguments)}var GQ=function(t){return Math.floor(t.getTime()/1e3)},fQ=/^(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)$/i,VQ=function(t){var e=fQ.exec(t);if(!e)throw new TypeError("Invalid time period format");var n=parseFloat(e[1]);switch(e[2].toLowerCase()){case"sec":case"secs":case"second":case"seconds":case"s":return Math.round(n);case"minute":case"minutes":case"min":case"mins":case"m":return Math.round(60*n);case"hour":case"hours":case"hr":case"hrs":case"h":return Math.round(3600*n);case"day":case"days":case"d":return Math.round(86400*n);case"week":case"weeks":case"w":return Math.round(604800*n);default:return Math.round(31557600*n)}},WQ=function(t){return t.toLowerCase().replace(/^application\//,"")},vQ=function(t,e){return"string"==typeof t?e.includes(t):!!Array.isArray(t)&&e.some(Set.prototype.has.bind(new Set(t)))},CQ=function(t,e){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=r.typ;if(i&&("string"!=typeof t.typ||WQ(t.typ)!==WQ(i)))throw new TM('unexpected "typ" JWT header value',"typ","check_failed");try{n=JSON.parse(xM.decode(e))}catch(t){}if(!cQ(n))throw new BM("JWT Claims Set must be a top-level JSON object");var c=r.issuer;if(c&&!(Array.isArray(c)?c:[c]).includes(n.iss))throw new TM('unexpected "iss" claim value',"iss","check_failed");var o=r.subject;if(o&&n.sub!==o)throw new TM('unexpected "sub" claim value',"sub","check_failed");var l,u=r.audience;if(u&&!vQ(n.aud,"string"==typeof u?[u]:u))throw new TM('unexpected "aud" claim value',"aud","check_failed");switch(a(r.clockTolerance)){case"string":l=VQ(r.clockTolerance);break;case"number":l=r.clockTolerance;break;case"undefined":l=0;break;default:throw new TypeError("Invalid clockTolerance option type")}var s=r.currentDate,d=GQ(s||new Date);if((void 0!==n.iat||r.maxTokenAge)&&"number"!=typeof n.iat)throw new TM('"iat" claim must be a number',"iat","invalid");if(void 0!==n.nbf){if("number"!=typeof n.nbf)throw new TM('"nbf" claim must be a number',"nbf","invalid");if(n.nbf>d+l)throw new TM('"nbf" claim timestamp check failed',"nbf","check_failed")}if(void 0!==n.exp){if("number"!=typeof n.exp)throw new TM('"exp" claim must be a number',"exp","invalid");if(n.exp<=d-l)throw new wM('"exp" claim timestamp check failed',"exp","check_failed")}if(r.maxTokenAge){var m=d-n.iat,h="number"==typeof r.maxTokenAge?r.maxTokenAge:VQ(r.maxTokenAge);if(m-l>h)throw new wM('"iat" claim timestamp check failed (too far in the past)',"iat","check_failed");if(m<0-l)throw new TM('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}return n};function YQ(){return YQ=l(c().mark((function t(e,n,r){var a,o,l,u;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,XQ(e,n,r);case 2:if(o=t.sent,!(null===(a=o.protectedHeader.crit)||void 0===a?void 0:a.includes("b64"))||!1!==o.protectedHeader.b64){t.next=5;break}throw new BM("JWTs MUST NOT use unencoded payload");case 5:if(l=CQ(o.protectedHeader,o.payload,r),u={payload:l,protectedHeader:o.protectedHeader},"function"!=typeof n){t.next=9;break}return t.abrupt("return",i(i({},u),{},{key:o.key}));case 9:return t.abrupt("return",u);case 10:case"end":return t.stop()}}),t)}))),YQ.apply(this,arguments)}function SQ(t){switch("string"==typeof t&&t.slice(0,2)){case"RS":case"PS":return"RSA";case"ES":return"EC";case"Ed":return"OKP";default:throw new FM('Unsupported "alg" value for a JSON Web Key Set')}}function RQ(t){return cQ(t)}var KQ=function(){function t(e){if(u(this,t),this._cached=new WeakMap,!function(t){return t&&"object"===a(t)&&Array.isArray(t.keys)&&t.keys.every(RQ)}(e))throw new jM("JSON Web Key Set malformed");var n;this._jwks=(n=e,"function"==typeof structuredClone?structuredClone(n):JSON.parse(JSON.stringify(n)))}var e;return d(t,[{key:"getKey",value:(e=l(c().mark((function t(e,n){var r,a,o,l,u,s,d,m,h;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r=i(i({},e),n.header),a=r.alg,o=r.kid,l=SQ(a),u=this._jwks.keys.filter((function(t){var e=l===t.kty;if(e&&"string"==typeof o&&(e=o===t.kid),e&&"string"==typeof t.alg&&(e=a===t.alg),e&&"string"==typeof t.use&&(e="sig"===t.use),e&&Array.isArray(t.key_ops)&&(e=t.key_ops.includes("verify")),e&&"EdDSA"===a&&(e="Ed25519"===t.crv||"Ed448"===t.crv),e)switch(a){case"ES256":e="P-256"===t.crv;break;case"ES256K":e="secp256k1"===t.crv;break;case"ES384":e="P-384"===t.crv;break;case"ES512":e="P-521"===t.crv}return e})),s=u[0],0!==(d=u.length)){t.next=8;break}throw new MM;case 8:if(1===d){t.next=10;break}throw new QM;case 10:if(void 0!==(m=this._cached.get(s)||this._cached.set(s,{}).get(s))[a]){t.next=18;break}return t.next=14,uQ(i(i({},s),{},{ext:!0}),a);case 14:if(!((h=t.sent)instanceof Uint8Array||"public"!==h.type)){t.next=17;break}throw new jM("JSON Web Key Set members must be public keys");case 17:m[a]=h;case 18:return t.abrupt("return",m[a]);case 19:case"end":return t.stop()}}),t,this)}))),function(t,n){return e.apply(this,arguments)})}]),t}();var NQ={exports:{}},LQ={exports:{}},JQ=n(yM);
453
+ */},{key:"didSignOutFail",value:function(t){var e=new URL(t),n=e.searchParams.get("state"),r=Boolean(e.searchParams.get("error"));return!!n&&"sign_out_success"===n&&r}},{key:"clearUserSessionData",value:function(t){return iF(this,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this._authenticationCore.clearUserSessionData(t);case 2:case"end":return e.stop()}}),e,this)})))}}]),t}();function LF(t,e,n){var r=void 0===e?null:e,i=function(t,e){var n=atob(t);if(e){for(var r=new Uint8Array(n.length),i=0,c=n.length;i<c;++i)r[i]=n.charCodeAt(i);return String.fromCharCode.apply(null,new Uint16Array(r.buffer))}return n}(t,void 0!==n&&n),c=i.indexOf("\n",10)+1,a=i.substring(c)+(r?"//# sourceMappingURL="+r:""),o=new Blob([a],{type:"application/javascript"});return URL.createObjectURL(o)}var JF,xF,HF,kF,UF,TF,wF=(JF="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlLHQpe3ZhciByPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKG49bi5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCkuZW51bWVyYWJsZX0pKSksci5wdXNoLmFwcGx5KHIsbil9cmV0dXJuIHJ9ZnVuY3Rpb24gdCh0KXtmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbcl0/YXJndW1lbnRzW3JdOnt9O3IlMj9lKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7Yyh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6ZShPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiByKCl7Ci8qISByZWdlbmVyYXRvci1ydW50aW1lIC0tIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLiAtLSBsaWNlbnNlIChNSVQpOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL0xJQ0VOU0UgKi8Kcj1mdW5jdGlvbigpe3JldHVybiBlfTt2YXIgZT17fSx0PU9iamVjdC5wcm90b3R5cGUsbj10Lmhhc093blByb3BlcnR5LGE9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbD9TeW1ib2w6e30saT1hLml0ZXJhdG9yfHwiQEBpdGVyYXRvciIsbz1hLmFzeW5jSXRlcmF0b3J8fCJAQGFzeW5jSXRlcmF0b3IiLHM9YS50b1N0cmluZ1RhZ3x8IkBAdG9TdHJpbmdUYWciO2Z1bmN0aW9uIHUoZSx0LHIpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksZVt0XX10cnl7dSh7fSwiIil9Y2F0Y2goZSl7dT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGVbdF09cn19ZnVuY3Rpb24gYyhlLHQscixuKXt2YXIgYT10JiZ0LnByb3RvdHlwZSBpbnN0YW5jZW9mIGg/dDpoLGk9T2JqZWN0LmNyZWF0ZShhLnByb3RvdHlwZSksbz1uZXcgUyhufHxbXSk7cmV0dXJuIGkuX2ludm9rZT1mdW5jdGlvbihlLHQscil7dmFyIG49InN1c3BlbmRlZFN0YXJ0IjtyZXR1cm4gZnVuY3Rpb24oYSxpKXtpZigiZXhlY3V0aW5nIj09PW4pdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7aWYoImNvbXBsZXRlZCI9PT1uKXtpZigidGhyb3ciPT09YSl0aHJvdyBpO3JldHVybiBUKCl9Zm9yKHIubWV0aG9kPWEsci5hcmc9aTs7KXt2YXIgbz1yLmRlbGVnYXRlO2lmKG8pe3ZhciBzPWsobyxyKTtpZihzKXtpZihzPT09bCljb250aW51ZTtyZXR1cm4gc319aWYoIm5leHQiPT09ci5tZXRob2Qpci5zZW50PXIuX3NlbnQ9ci5hcmc7ZWxzZSBpZigidGhyb3ciPT09ci5tZXRob2Qpe2lmKCJzdXNwZW5kZWRTdGFydCI9PT1uKXRocm93IG49ImNvbXBsZXRlZCIsci5hcmc7ci5kaXNwYXRjaEV4Y2VwdGlvbihyLmFyZyl9ZWxzZSJyZXR1cm4iPT09ci5tZXRob2QmJnIuYWJydXB0KCJyZXR1cm4iLHIuYXJnKTtuPSJleGVjdXRpbmciO3ZhciB1PWYoZSx0LHIpO2lmKCJub3JtYWwiPT09dS50eXBlKXtpZihuPXIuZG9uZT8iY29tcGxldGVkIjoic3VzcGVuZGVkWWllbGQiLHUuYXJnPT09bCljb250aW51ZTtyZXR1cm57dmFsdWU6dS5hcmcsZG9uZTpyLmRvbmV9fSJ0aHJvdyI9PT11LnR5cGUmJihuPSJjb21wbGV0ZWQiLHIubWV0aG9kPSJ0aHJvdyIsci5hcmc9dS5hcmcpfX19KGUscixvKSxpfWZ1bmN0aW9uIGYoZSx0LHIpe3RyeXtyZXR1cm57dHlwZToibm9ybWFsIixhcmc6ZS5jYWxsKHQscil9fWNhdGNoKGUpe3JldHVybnt0eXBlOiJ0aHJvdyIsYXJnOmV9fX1lLndyYXA9Yzt2YXIgbD17fTtmdW5jdGlvbiBoKCl7fWZ1bmN0aW9uIHAoKXt9ZnVuY3Rpb24gZCgpe312YXIgdj17fTt1KHYsaSwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKTt2YXIgZz1PYmplY3QuZ2V0UHJvdG90eXBlT2YseT1nJiZnKGcoRShbXSkpKTt5JiZ5IT09dCYmbi5jYWxsKHksaSkmJih2PXkpO3ZhciBtPWQucHJvdG90eXBlPWgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodik7ZnVuY3Rpb24gdyhlKXtbIm5leHQiLCJ0aHJvdyIsInJldHVybiJdLmZvckVhY2goKGZ1bmN0aW9uKHQpe3UoZSx0LChmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5faW52b2tlKHQsZSl9KSl9KSl9ZnVuY3Rpb24gYihlLHQpe2Z1bmN0aW9uIHIoYSxpLG8scyl7dmFyIHU9ZihlW2FdLGUsaSk7aWYoInRocm93IiE9PXUudHlwZSl7dmFyIGM9dS5hcmcsbD1jLnZhbHVlO3JldHVybiBsJiYib2JqZWN0Ij09dHlwZW9mIGwmJm4uY2FsbChsLCJfX2F3YWl0Iik/dC5yZXNvbHZlKGwuX19hd2FpdCkudGhlbigoZnVuY3Rpb24oZSl7cigibmV4dCIsZSxvLHMpfSksKGZ1bmN0aW9uKGUpe3IoInRocm93IixlLG8scyl9KSk6dC5yZXNvbHZlKGwpLnRoZW4oKGZ1bmN0aW9uKGUpe2MudmFsdWU9ZSxvKGMpfSksKGZ1bmN0aW9uKGUpe3JldHVybiByKCJ0aHJvdyIsZSxvLHMpfSkpfXModS5hcmcpfXZhciBhO3RoaXMuX2ludm9rZT1mdW5jdGlvbihlLG4pe2Z1bmN0aW9uIGkoKXtyZXR1cm4gbmV3IHQoKGZ1bmN0aW9uKHQsYSl7cihlLG4sdCxhKX0pKX1yZXR1cm4gYT1hP2EudGhlbihpLGkpOmkoKX19ZnVuY3Rpb24gayhlLHQpe3ZhciByPWUuaXRlcmF0b3JbdC5tZXRob2RdO2lmKHZvaWQgMD09PXIpe2lmKHQuZGVsZWdhdGU9bnVsbCwidGhyb3ciPT09dC5tZXRob2Qpe2lmKGUuaXRlcmF0b3IucmV0dXJuJiYodC5tZXRob2Q9InJldHVybiIsdC5hcmc9dm9pZCAwLGsoZSx0KSwidGhyb3ciPT09dC5tZXRob2QpKXJldHVybiBsO3QubWV0aG9kPSJ0aHJvdyIsdC5hcmc9bmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZCIpfXJldHVybiBsfXZhciBuPWYocixlLml0ZXJhdG9yLHQuYXJnKTtpZigidGhyb3ciPT09bi50eXBlKXJldHVybiB0Lm1ldGhvZD0idGhyb3ciLHQuYXJnPW4uYXJnLHQuZGVsZWdhdGU9bnVsbCxsO3ZhciBhPW4uYXJnO3JldHVybiBhP2EuZG9uZT8odFtlLnJlc3VsdE5hbWVdPWEudmFsdWUsdC5uZXh0PWUubmV4dExvYywicmV0dXJuIiE9PXQubWV0aG9kJiYodC5tZXRob2Q9Im5leHQiLHQuYXJnPXZvaWQgMCksdC5kZWxlZ2F0ZT1udWxsLGwpOmE6KHQubWV0aG9kPSJ0aHJvdyIsdC5hcmc9bmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKSx0LmRlbGVnYXRlPW51bGwsbCl9ZnVuY3Rpb24geChlKXt2YXIgdD17dHJ5TG9jOmVbMF19OzEgaW4gZSYmKHQuY2F0Y2hMb2M9ZVsxXSksMiBpbiBlJiYodC5maW5hbGx5TG9jPWVbMl0sdC5hZnRlckxvYz1lWzNdKSx0aGlzLnRyeUVudHJpZXMucHVzaCh0KX1mdW5jdGlvbiBfKGUpe3ZhciB0PWUuY29tcGxldGlvbnx8e307dC50eXBlPSJub3JtYWwiLGRlbGV0ZSB0LmFyZyxlLmNvbXBsZXRpb249dH1mdW5jdGlvbiBTKGUpe3RoaXMudHJ5RW50cmllcz1be3RyeUxvYzoicm9vdCJ9XSxlLmZvckVhY2goeCx0aGlzKSx0aGlzLnJlc2V0KCEwKX1mdW5jdGlvbiBFKGUpe2lmKGUpe3ZhciB0PWVbaV07aWYodClyZXR1cm4gdC5jYWxsKGUpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlLm5leHQpcmV0dXJuIGU7aWYoIWlzTmFOKGUubGVuZ3RoKSl7dmFyIHI9LTEsYT1mdW5jdGlvbiB0KCl7Zm9yKDsrK3I8ZS5sZW5ndGg7KWlmKG4uY2FsbChlLHIpKXJldHVybiB0LnZhbHVlPWVbcl0sdC5kb25lPSExLHQ7cmV0dXJuIHQudmFsdWU9dm9pZCAwLHQuZG9uZT0hMCx0fTtyZXR1cm4gYS5uZXh0PWF9fXJldHVybntuZXh0OlR9fWZ1bmN0aW9uIFQoKXtyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fXJldHVybiBwLnByb3RvdHlwZT1kLHUobSwiY29uc3RydWN0b3IiLGQpLHUoZCwiY29uc3RydWN0b3IiLHApLHAuZGlzcGxheU5hbWU9dShkLHMsIkdlbmVyYXRvckZ1bmN0aW9uIiksZS5pc0dlbmVyYXRvckZ1bmN0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLmNvbnN0cnVjdG9yO3JldHVybiEhdCYmKHQ9PT1wfHwiR2VuZXJhdG9yRnVuY3Rpb24iPT09KHQuZGlzcGxheU5hbWV8fHQubmFtZSkpfSxlLm1hcms9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSxkKTooZS5fX3Byb3RvX189ZCx1KGUscywiR2VuZXJhdG9yRnVuY3Rpb24iKSksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShtKSxlfSxlLmF3cmFwPWZ1bmN0aW9uKGUpe3JldHVybntfX2F3YWl0OmV9fSx3KGIucHJvdG90eXBlKSx1KGIucHJvdG90eXBlLG8sKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSksZS5Bc3luY0l0ZXJhdG9yPWIsZS5hc3luYz1mdW5jdGlvbih0LHIsbixhLGkpe3ZvaWQgMD09PWkmJihpPVByb21pc2UpO3ZhciBvPW5ldyBiKGModCxyLG4sYSksaSk7cmV0dXJuIGUuaXNHZW5lcmF0b3JGdW5jdGlvbihyKT9vOm8ubmV4dCgpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBlLmRvbmU/ZS52YWx1ZTpvLm5leHQoKX0pKX0sdyhtKSx1KG0scywiR2VuZXJhdG9yIiksdShtLGksKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSksdShtLCJ0b1N0cmluZyIsKGZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgR2VuZXJhdG9yXSJ9KSksZS5rZXlzPWZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgciBpbiBlKXQucHVzaChyKTtyZXR1cm4gdC5yZXZlcnNlKCksZnVuY3Rpb24gcigpe2Zvcig7dC5sZW5ndGg7KXt2YXIgbj10LnBvcCgpO2lmKG4gaW4gZSlyZXR1cm4gci52YWx1ZT1uLHIuZG9uZT0hMSxyfXJldHVybiByLmRvbmU9ITAscn19LGUudmFsdWVzPUUsUy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlMscmVzZXQ6ZnVuY3Rpb24oZSl7aWYodGhpcy5wcmV2PTAsdGhpcy5uZXh0PTAsdGhpcy5zZW50PXRoaXMuX3NlbnQ9dm9pZCAwLHRoaXMuZG9uZT0hMSx0aGlzLmRlbGVnYXRlPW51bGwsdGhpcy5tZXRob2Q9Im5leHQiLHRoaXMuYXJnPXZvaWQgMCx0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChfKSwhZSlmb3IodmFyIHQgaW4gdGhpcykidCI9PT10LmNoYXJBdCgwKSYmbi5jYWxsKHRoaXMsdCkmJiFpc05hTigrdC5zbGljZSgxKSkmJih0aGlzW3RdPXZvaWQgMCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmRvbmU9ITA7dmFyIGU9dGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247aWYoInRocm93Ij09PWUudHlwZSl0aHJvdyBlLmFyZztyZXR1cm4gdGhpcy5ydmFsfSxkaXNwYXRjaEV4Y2VwdGlvbjpmdW5jdGlvbihlKXtpZih0aGlzLmRvbmUpdGhyb3cgZTt2YXIgdD10aGlzO2Z1bmN0aW9uIHIocixuKXtyZXR1cm4gby50eXBlPSJ0aHJvdyIsby5hcmc9ZSx0Lm5leHQ9cixuJiYodC5tZXRob2Q9Im5leHQiLHQuYXJnPXZvaWQgMCksISFufWZvcih2YXIgYT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7YT49MDstLWEpe3ZhciBpPXRoaXMudHJ5RW50cmllc1thXSxvPWkuY29tcGxldGlvbjtpZigicm9vdCI9PT1pLnRyeUxvYylyZXR1cm4gcigiZW5kIik7aWYoaS50cnlMb2M8PXRoaXMucHJldil7dmFyIHM9bi5jYWxsKGksImNhdGNoTG9jIiksdT1uLmNhbGwoaSwiZmluYWxseUxvYyIpO2lmKHMmJnUpe2lmKHRoaXMucHJldjxpLmNhdGNoTG9jKXJldHVybiByKGkuY2F0Y2hMb2MsITApO2lmKHRoaXMucHJldjxpLmZpbmFsbHlMb2MpcmV0dXJuIHIoaS5maW5hbGx5TG9jKX1lbHNlIGlmKHMpe2lmKHRoaXMucHJldjxpLmNhdGNoTG9jKXJldHVybiByKGkuY2F0Y2hMb2MsITApfWVsc2V7aWYoIXUpdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpO2lmKHRoaXMucHJldjxpLmZpbmFsbHlMb2MpcmV0dXJuIHIoaS5maW5hbGx5TG9jKX19fX0sYWJydXB0OmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtyPj0wOy0tcil7dmFyIGE9dGhpcy50cnlFbnRyaWVzW3JdO2lmKGEudHJ5TG9jPD10aGlzLnByZXYmJm4uY2FsbChhLCJmaW5hbGx5TG9jIikmJnRoaXMucHJldjxhLmZpbmFsbHlMb2Mpe3ZhciBpPWE7YnJlYWt9fWkmJigiYnJlYWsiPT09ZXx8ImNvbnRpbnVlIj09PWUpJiZpLnRyeUxvYzw9dCYmdDw9aS5maW5hbGx5TG9jJiYoaT1udWxsKTt2YXIgbz1pP2kuY29tcGxldGlvbjp7fTtyZXR1cm4gby50eXBlPWUsby5hcmc9dCxpPyh0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5uZXh0PWkuZmluYWxseUxvYyxsKTp0aGlzLmNvbXBsZXRlKG8pfSxjb21wbGV0ZTpmdW5jdGlvbihlLHQpe2lmKCJ0aHJvdyI9PT1lLnR5cGUpdGhyb3cgZS5hcmc7cmV0dXJuImJyZWFrIj09PWUudHlwZXx8ImNvbnRpbnVlIj09PWUudHlwZT90aGlzLm5leHQ9ZS5hcmc6InJldHVybiI9PT1lLnR5cGU/KHRoaXMucnZhbD10aGlzLmFyZz1lLmFyZyx0aGlzLm1ldGhvZD0icmV0dXJuIix0aGlzLm5leHQ9ImVuZCIpOiJub3JtYWwiPT09ZS50eXBlJiZ0JiYodGhpcy5uZXh0PXQpLGx9LGZpbmlzaDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO3Q+PTA7LS10KXt2YXIgcj10aGlzLnRyeUVudHJpZXNbdF07aWYoci5maW5hbGx5TG9jPT09ZSlyZXR1cm4gdGhpcy5jb21wbGV0ZShyLmNvbXBsZXRpb24sci5hZnRlckxvYyksXyhyKSxsfX0sY2F0Y2g6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTt0Pj0wOy0tdCl7dmFyIHI9dGhpcy50cnlFbnRyaWVzW3RdO2lmKHIudHJ5TG9jPT09ZSl7dmFyIG49ci5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT1uLnR5cGUpe3ZhciBhPW4uYXJnO18ocil9cmV0dXJuIGF9fXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iil9LGRlbGVnYXRlWWllbGQ6ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB0aGlzLmRlbGVnYXRlPXtpdGVyYXRvcjpFKGUpLHJlc3VsdE5hbWU6dCxuZXh0TG9jOnJ9LCJuZXh0Ij09PXRoaXMubWV0aG9kJiYodGhpcy5hcmc9dm9pZCAwKSxsfX0sZX1mdW5jdGlvbiBuKGUpe3JldHVybiBuPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxuKGUpfWZ1bmN0aW9uIGEoZSx0LHIsbixhLGksbyl7dHJ5e3ZhciBzPWVbaV0obyksdT1zLnZhbHVlfWNhdGNoKGUpe3JldHVybiB2b2lkIHIoZSl9cy5kb25lP3QodSk6UHJvbWlzZS5yZXNvbHZlKHUpLnRoZW4obixhKX1mdW5jdGlvbiBpKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMscj1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLGkpe3ZhciBvPWUuYXBwbHkodCxyKTtmdW5jdGlvbiBzKGUpe2EobyxuLGkscyx1LCJuZXh0IixlKX1mdW5jdGlvbiB1KGUpe2EobyxuLGkscyx1LCJ0aHJvdyIsZSl9cyh2b2lkIDApfSkpfX1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gcyhlLHQpe2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgbj10W3JdO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbi5rZXksbil9fWZ1bmN0aW9uIHUoZSx0LHIpe3JldHVybiB0JiZzKGUucHJvdG90eXBlLHQpLHImJnMoZSxyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlfWZ1bmN0aW9uIGMoZSx0LHIpe3JldHVybiB0IGluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09cixlfWZ1bmN0aW9uIGYoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksdCYmaChlLHQpfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGw9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSl9LGwoZSl9ZnVuY3Rpb24gaChlLHQpe3JldHVybiBoPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX19wcm90b19fPXQsZX0saChlLHQpfWZ1bmN0aW9uIHAoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIGQoZSx0LHIpe3JldHVybiBkPXAoKT9SZWZsZWN0LmNvbnN0cnVjdC5iaW5kKCk6ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPVtudWxsXTtuLnB1c2guYXBwbHkobix0KTt2YXIgYT1uZXcoRnVuY3Rpb24uYmluZC5hcHBseShlLG4pKTtyZXR1cm4gciYmaChhLHIucHJvdG90eXBlKSxhfSxkLmFwcGx5KG51bGwsYXJndW1lbnRzKX1mdW5jdGlvbiB2KGUpe3ZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiBNYXA/bmV3IE1hcDp2b2lkIDA7cmV0dXJuIHY9ZnVuY3Rpb24oZSl7aWYobnVsbD09PWV8fChyPWUsLTE9PT1GdW5jdGlvbi50b1N0cmluZy5jYWxsKHIpLmluZGV4T2YoIltuYXRpdmUgY29kZV0iKSkpcmV0dXJuIGU7dmFyIHI7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTtpZih2b2lkIDAhPT10KXtpZih0LmhhcyhlKSlyZXR1cm4gdC5nZXQoZSk7dC5zZXQoZSxuKX1mdW5jdGlvbiBuKCl7cmV0dXJuIGQoZSxhcmd1bWVudHMsbCh0aGlzKS5jb25zdHJ1Y3Rvcil9cmV0dXJuIG4ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpuLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGgobixlKX0sdihlKX1mdW5jdGlvbiBnKGUpe2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiB5KGUsdCl7aWYodCYmKCJvYmplY3QiPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQpKXJldHVybiB0O2lmKHZvaWQgMCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWQiKTtyZXR1cm4gZyhlKX1mdW5jdGlvbiBtKGUpe3ZhciB0PXAoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcixuPWwoZSk7aWYodCl7dmFyIGE9bCh0aGlzKS5jb25zdHJ1Y3RvcjtyPVJlZmxlY3QuY29uc3RydWN0KG4sYXJndW1lbnRzLGEpfWVsc2Ugcj1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4geSh0aGlzLHIpfX1mdW5jdGlvbiB3KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGV9KGUpfHxmdW5jdGlvbihlLHQpe3ZhciByPW51bGw9PWU/bnVsbDoidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmZVtTeW1ib2wuaXRlcmF0b3JdfHxlWyJAQGl0ZXJhdG9yIl07aWYobnVsbD09cilyZXR1cm47dmFyIG4sYSxpPVtdLG89ITAscz0hMTt0cnl7Zm9yKHI9ci5jYWxsKGUpOyEobz0obj1yLm5leHQoKSkuZG9uZSkmJihpLnB1c2gobi52YWx1ZSksIXR8fGkubGVuZ3RoIT09dCk7bz0hMCk7fWNhdGNoKGUpe3M9ITAsYT1lfWZpbmFsbHl7dHJ5e298fG51bGw9PXIucmV0dXJufHxyLnJldHVybigpfWZpbmFsbHl7aWYocyl0aHJvdyBhfX1yZXR1cm4gaX0oZSx0KXx8ayhlLHQpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gYihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4geChlKX0oZSl8fGZ1bmN0aW9uKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZudWxsIT1lW1N5bWJvbC5pdGVyYXRvcl18fG51bGwhPWVbIkBAaXRlcmF0b3IiXSlyZXR1cm4gQXJyYXkuZnJvbShlKX0oZSl8fGsoZSl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gayhlLHQpe2lmKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4geChlLHQpO3ZhciByPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtyZXR1cm4iT2JqZWN0Ij09PXImJmUuY29uc3RydWN0b3ImJihyPWUuY29uc3RydWN0b3IubmFtZSksIk1hcCI9PT1yfHwiU2V0Ij09PXI/QXJyYXkuZnJvbShlKToiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpP3goZSx0KTp2b2lkIDB9fWZ1bmN0aW9uIHgoZSx0KXsobnVsbD09dHx8dD5lLmxlbmd0aCkmJih0PWUubGVuZ3RoKTtmb3IodmFyIHI9MCxuPW5ldyBBcnJheSh0KTtyPHQ7cisrKW5bcl09ZVtyXTtyZXR1cm4gbn1mdW5jdGlvbiBfKGUsdCl7dmFyIHI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJmVbU3ltYm9sLml0ZXJhdG9yXXx8ZVsiQEBpdGVyYXRvciJdO2lmKCFyKXtpZihBcnJheS5pc0FycmF5KGUpfHwocj1rKGUpKXx8dCYmZSYmIm51bWJlciI9PXR5cGVvZiBlLmxlbmd0aCl7ciYmKGU9cik7dmFyIG49MCxhPWZ1bmN0aW9uKCl7fTtyZXR1cm57czphLG46ZnVuY3Rpb24oKXtyZXR1cm4gbj49ZS5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOmVbbisrXX19LGU6ZnVuY3Rpb24oZSl7dGhyb3cgZX0sZjphfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGksbz0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7cj1yLmNhbGwoZSl9LG46ZnVuY3Rpb24oKXt2YXIgZT1yLm5leHQoKTtyZXR1cm4gbz1lLmRvbmUsZX0sZTpmdW5jdGlvbihlKXtzPSEwLGk9ZX0sZjpmdW5jdGlvbigpe3RyeXtvfHxudWxsPT1yLnJldHVybnx8ci5yZXR1cm4oKX1maW5hbGx5e2lmKHMpdGhyb3cgaX19fX1mdW5jdGlvbiBTKGUsdCxyLG4pe3JldHVybiBuZXcocnx8KHI9UHJvbWlzZSkpKChmdW5jdGlvbihhLGkpe2Z1bmN0aW9uIG8oZSl7dHJ5e3Uobi5uZXh0KGUpKX1jYXRjaChlKXtpKGUpfX1mdW5jdGlvbiBzKGUpe3RyeXt1KG4udGhyb3coZSkpfWNhdGNoKGUpe2koZSl9fWZ1bmN0aW9uIHUoZSl7dmFyIHQ7ZS5kb25lP2EoZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygcj90Om5ldyByKChmdW5jdGlvbihlKXtlKHQpfSkpKS50aGVuKG8scyl9dSgobj1uLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSkpfWZ1bmN0aW9uIEUoZSx0LHIsbil7cmV0dXJuIG5ldyhyfHwocj1Qcm9taXNlKSkoKGZ1bmN0aW9uKGEsaSl7ZnVuY3Rpb24gbyhlKXt0cnl7dShuLm5leHQoZSkpfWNhdGNoKGUpe2koZSl9fWZ1bmN0aW9uIHMoZSl7dHJ5e3Uobi50aHJvdyhlKSl9Y2F0Y2goZSl7aShlKX19ZnVuY3Rpb24gdShlKXt2YXIgdDtlLmRvbmU/YShlLnZhbHVlKToodD1lLnZhbHVlLHQgaW5zdGFuY2VvZiByP3Q6bmV3IHIoKGZ1bmN0aW9uKGUpe2UodCl9KSkpLnRoZW4obyxzKX11KChuPW4uYXBwbHkoZSx0fHxbXSkpLm5leHQoKSl9KSl9dmFyIFQ7IWZ1bmN0aW9uKGUpe2UuZm9ybVBvc3Q9ImZvcm1fcG9zdCIsZS5xdWVyeT0icXVlcnkifShUfHwoVD17fSkpO3ZhciBBOyFmdW5jdGlvbihlKXtlLkNvbmZpZ0RhdGE9ImNvbmZpZ19kYXRhIixlLk9JRENQcm92aWRlck1ldGFEYXRhPSJvaWRjX3Byb3ZpZGVyX21ldGFfZGF0YSIsZS5TZXNzaW9uRGF0YT0ic2Vzc2lvbl9kYXRhIixlLlRlbXBvcmFyeURhdGE9InRlbXBvcmFyeV9kYXRhIn0oQXx8KEE9e30pKTt2YXIgUixDPSJyZWZyZXNoX3Rva2VuX3RpbWVyIixQPVsiUlMyNTYiLCJSUzUxMiIsIlJTMzg0IiwiUFMyNTYiXSxEPSJzaWduX291dF91cmwiLE89InNpZ25fb3V0X3N1Y2Nlc3MiOyFmdW5jdGlvbihlKXtlLkluY2x1ZGU9ImluY2x1ZGUiLGUuU2FtZU9yaWdpbj0ic2FtZS1vcmlnaW4iLGUuT21pdD0ib21pdCJ9KFJ8fChSPXt9KSk7dmFyIEk9dSgoZnVuY3Rpb24gZSh0LHIsbil7byh0aGlzLGUpLHRoaXMubWVzc2FnZT1uLHRoaXMubmFtZT1yLHRoaXMuY29kZT10LE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCh0aGlzIGluc3RhbmNlb2YgZT90aGlzLmNvbnN0cnVjdG9yOnZvaWQgMCkucHJvdG90eXBlKX0pKSxMPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe28odGhpcyxlKX1yZXR1cm4gdShlLG51bGwsW3trZXk6ImZpbHRlckNsYWltc0Zyb21JRFRva2VuUGF5bG9hZCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtudWxsPT10fHxkZWxldGUgdC5pc3MsbnVsbD09dHx8ZGVsZXRlIHQuYXVkLG51bGw9PXR8fGRlbGV0ZSB0LmV4cCxudWxsPT10fHxkZWxldGUgdC5pYXQsbnVsbD09dHx8ZGVsZXRlIHQuYWNyLG51bGw9PXR8fGRlbGV0ZSB0LmFtcixudWxsPT10fHxkZWxldGUgdC5henAsbnVsbD09dHx8ZGVsZXRlIHQuYXV0aF90aW1lLG51bGw9PXR8fGRlbGV0ZSB0Lm5vbmNlLG51bGw9PXR8fGRlbGV0ZSB0LmNfaGFzaCxudWxsPT10fHxkZWxldGUgdC5hdF9oYXNoLG51bGw9PXR8fGRlbGV0ZSB0Lm5iZixudWxsPT10fHxkZWxldGUgdC5pc2ssbnVsbD09dHx8ZGVsZXRlIHQuc2lkO3ZhciByPXt9O3JldHVybiBPYmplY3QuZW50cmllcyh0KS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD13KGUsMiksbj10WzBdLGE9dFsxXSxpPW4uc3BsaXQoIl8iKS5tYXAoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIDA9PT10P2U6W2VbMF0udG9VcHBlckNhc2UoKV0uY29uY2F0KGIoZS5zbGljZSgxKSkpLmpvaW4oIiIpfSkpLmpvaW4oIiIpO3JbaV09YX0pKSxyfX0se2tleToiZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uIiwiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn19fSx7a2V5OiJnZW5lcmF0ZVN0YXRlUGFyYW1Gb3JSZXF1ZXN0Q29ycmVsYXRpb24iLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIHI9cGFyc2VJbnQoZS5zcGxpdCgiIyIpWzFdKTtyZXR1cm4gdD8iIi5jb25jYXQodCwiX3JlcXVlc3RfIikuY29uY2F0KHIpOiJyZXF1ZXN0XyIuY29uY2F0KHIpfX0se2tleToiZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuInBrY2VfY29kZV92ZXJpZmllciMiLmNvbmNhdChwYXJzZUludChlLnNwbGl0KCJyZXF1ZXN0XyIpWzFdKSl9fV0pLGV9KCk7TC5nZXRUZW5hbnREb21haW5Gcm9tSWRUb2tlblBheWxvYWQ9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiJAIixyPWUuc3ViLnNwbGl0KHQpO3JldHVybiByLmxlbmd0aD4yP3Jbci5sZW5ndGgtMV06IiJ9O3ZhciBVLEgsTT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXt2YXIgYT10aGlzO28odGhpcyxlKSx0aGlzLl9kYXRhTGF5ZXI9dCx0aGlzLl9jb25maWc9ZnVuY3Rpb24oKXtyZXR1cm4gRShhLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpO2Nhc2UgMjpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsZS5zZW50KTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX0sdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gRShhLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKTtjYXNlIDI6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGUuc2VudCk7Y2FzZSAzOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9LHRoaXMuX2NyeXB0b0hlbHBlcj1ufXJldHVybiB1KGUsW3trZXk6InJlc29sdmVFbmRwb2ludHMiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3ZhciBuLGE7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gbj17fSx0Lm5leHQ9Myx0aGlzLl9jb25maWcoKTtjYXNlIDM6cmV0dXJuIGE9dC5zZW50LHQuYWJydXB0KCJyZXR1cm4iLChhLmVuZHBvaW50cyYmT2JqZWN0LmtleXMoYS5lbmRwb2ludHMpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvW0EtWl0vZywoZnVuY3Rpb24oZSl7cmV0dXJuIl8iLmNvbmNhdChlLnRvTG93ZXJDYXNlKCkpfSkpO25bdF09KG51bGw9PWE/dm9pZCAwOmEuZW5kcG9pbnRzKT9hLmVuZHBvaW50c1tlXToiIn0pKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSksbikpKTtjYXNlIDU6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6InJlc29sdmVFbmRwb2ludHNFeHBsaWNpdGx5Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3ZhciB0LG4sYTtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiB0PXt9LGUubmV4dD0zLHRoaXMuX2NvbmZpZygpO2Nhc2UgMzppZihuPWUuc2VudCxhPVsiYXV0aG9yaXphdGlvbl9lbmRwb2ludCIsImVuZF9zZXNzaW9uX2VuZHBvaW50Iiwiandrc191cmkiLCJjaGVja19zZXNzaW9uX2lmcmFtZSIsInJldm9jYXRpb25fZW5kcG9pbnQiLCJ0b2tlbl9lbmRwb2ludCIsImlzc3VlciIsInVzZXJpbmZvX2VuZHBvaW50Il0sbi5lbmRwb2ludHMmJk9iamVjdC5rZXlzKG51bGw9PW4/dm9pZCAwOm4uZW5kcG9pbnRzKS5ldmVyeSgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKC9bQS1aXS9nLChmdW5jdGlvbihlKXtyZXR1cm4iXyIuY29uY2F0KGUudG9Mb3dlckNhc2UoKSl9KSk7cmV0dXJuIGEuaW5jbHVkZXModCl9KSkpe2UubmV4dD03O2JyZWFrfXRocm93IG5ldyBJKCJKUy1BVVRIX0hFTFBFUi1SRUUtTkYwMSIsIk5vIHJlcXVpcmVkIGVuZHBvaW50cy4iLCJSZXF1aXJlZCBvaWRjIGVuZHBvaW50cyBhcmUgbm90IGRlZmluZWQiKTtjYXNlIDc6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLChuLmVuZHBvaW50cyYmT2JqZWN0LmtleXMobi5lbmRwb2ludHMpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciByPWUucmVwbGFjZSgvW0EtWl0vZywoZnVuY3Rpb24oZSl7cmV0dXJuIl8iLmNvbmNhdChlLnRvTG93ZXJDYXNlKCkpfSkpO3Rbcl09KG51bGw9PW4/dm9pZCAwOm4uZW5kcG9pbnRzKT9uLmVuZHBvaW50c1tlXToiIn0pKSxPYmplY3QuYXNzaWduKHt9LHQpKSk7Y2FzZSA4OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9fSx7a2V5OiJyZXNvbHZlRW5kcG9pbnRzQnlCYXNlVVJMIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3ZhciB0LG4sYSxpO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIHQ9e30sZS5uZXh0PTMsdGhpcy5fY29uZmlnKCk7Y2FzZSAzOmlmKG49ZS5zZW50LGE9bi5iYXNlVXJsKXtlLm5leHQ9NzticmVha310aHJvdyBuZXcgSSgiSlMtQVVUSF9IRUxQRVJfUkVCTy1ORjAxIiwiQmFzZSBVUkwgbm90IGRlZmluZWQuIiwiQmFzZSBVUkwgaXMgbm90IGRlZmluZWQgaW4gQXV0aENsaWVudCBjb25maWcuIik7Y2FzZSA3OnJldHVybiBuLmVuZHBvaW50cyYmT2JqZWN0LmtleXMobi5lbmRwb2ludHMpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciByPWUucmVwbGFjZSgvW0EtWl0vZywoZnVuY3Rpb24oZSl7cmV0dXJuIl8iLmNvbmNhdChlLnRvTG93ZXJDYXNlKCkpfSkpO3Rbcl09KG51bGw9PW4/dm9pZCAwOm4uZW5kcG9pbnRzKT9uLmVuZHBvaW50c1tlXToiIn0pKSxpPXthdXRob3JpemF0aW9uX2VuZHBvaW50OiIiLmNvbmNhdChhKS5jb25jYXQoIi9vYXV0aDIvYXV0aG9yaXplIiksZW5kX3Nlc3Npb25fZW5kcG9pbnQ6IiIuY29uY2F0KGEpLmNvbmNhdCgiL29pZGMvbG9nb3V0IiksaXNzdWVyOiIiLmNvbmNhdChhKS5jb25jYXQoIi9vYXV0aDIvdG9rZW4iKSxqd2tzX3VyaToiIi5jb25jYXQoYSkuY29uY2F0KCIvb2F1dGgyL2p3a3MiKSxjaGVja19zZXNzaW9uX2lmcmFtZToiIi5jb25jYXQoYSkuY29uY2F0KCIvb2lkYy9jaGVja3Nlc3Npb24iKSxyZXZvY2F0aW9uX2VuZHBvaW50OiIiLmNvbmNhdChhKS5jb25jYXQoIi9vYXV0aDIvcmV2b2tlIiksdG9rZW5fZW5kcG9pbnQ6IiIuY29uY2F0KGEpLmNvbmNhdCgiL29hdXRoMi90b2tlbiIpLHVzZXJpbmZvX2VuZHBvaW50OiIiLmNvbmNhdChhKS5jb25jYXQoIi9vYXV0aDIvdXNlcmluZm8iKX0sZS5hYnJ1cHQoInJldHVybiIsT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkpLHQpKTtjYXNlIDEwOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9fSx7a2V5OiJ2YWxpZGF0ZUlkVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3ZhciBuLGEsaSxvLHMsdSxjO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQubmV4dD0yLHRoaXMuX2RhdGFMYXllci5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpO2Nhc2UgMjpyZXR1cm4gbj10LnNlbnQuandrc191cmksdC5uZXh0PTUsdGhpcy5fY29uZmlnKCk7Y2FzZSA1OmlmKGE9dC5zZW50LG4mJjAhPT1uLnRyaW0oKS5sZW5ndGgpe3QubmV4dD04O2JyZWFrfXRocm93IG5ldyBJKCJKU19BVVRIX0hFTFBFUi1WSVQtTkYwMSIsIkpXS1MgZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIEpXS1MgZW5kcG9pbnQgd2FzIGZvdW5kIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgSldLUyBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjYXNlIDg6cmV0dXJuIHQucHJldj04LHQubmV4dD0xMSxmZXRjaChuLHtjcmVkZW50aWFsczphLnNlbmRDb29raWVzSW5SZXF1ZXN0cz9SLkluY2x1ZGU6Ui5TYW1lT3JpZ2lufSk7Y2FzZSAxMTppPXQuc2VudCx0Lm5leHQ9MTc7YnJlYWs7Y2FzZSAxNDp0aHJvdyB0LnByZXY9MTQsdC50MD10LmNhdGNoKDgpLG5ldyBJKCJKUy1BVVRIX0hFTFBFUi1WSVQtTkUwMiIsIlJlcXVlc3QgdG8gandrcyBlbmRwb2ludCBmYWlsZWQuIixudWxsIT10LnQwP3QudDA6IlRoZSByZXF1ZXN0IHNlbnQgdG8gZ2V0IHRoZSBqd2tzIGZyb20gdGhlIHNlcnZlciBmYWlsZWQuIik7Y2FzZSAxNzppZigyMDA9PT1pLnN0YXR1cyYmaS5vayl7dC5uZXh0PTI0O2JyZWFrfXJldHVybiB0LnQxPUksdC50Mj0iSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIGp3a3MgcmVxdWVzdCAoIi5jb25jYXQoaS5zdGF0dXNUZXh0LCIpLiIpLHQubmV4dD0yMixpLmpzb24oKTtjYXNlIDIyOnRocm93IHQudDM9dC5zZW50LG5ldyB0LnQxKCJKUy1BVVRIX0hFTFBFUi1WSVQtSEUwMyIsdC50Mix0LnQzKTtjYXNlIDI0OnJldHVybiB0Lm5leHQ9MjYsdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKTtjYXNlIDI2OnJldHVybiBvPXQuc2VudC5pc3N1ZXIsdC5uZXh0PTI5LGkuanNvbigpO2Nhc2UgMjk6cmV0dXJuIHM9dC5zZW50LHU9cy5rZXlzLHQubmV4dD0zMyx0aGlzLl9jcnlwdG9IZWxwZXIuZ2V0SldLRm9yVGhlSWRUb2tlbihlLnNwbGl0KCIuIilbMF0sdSk7Y2FzZSAzMzpyZXR1cm4gYz10LnNlbnQsdC50ND10aGlzLl9jcnlwdG9IZWxwZXIsdC50NT1lLHQudDY9Yyx0Lm5leHQ9MzksdGhpcy5fY29uZmlnKCk7Y2FzZSAzOTpyZXR1cm4gdC50Nz10LnNlbnQuY2xpZW50SUQsdC50OD1udWxsIT1vP286IiIsdC50OT10aGlzLl9jcnlwdG9IZWxwZXIuZGVjb2RlSURUb2tlbihlKS5zdWIsdC5uZXh0PTQ0LHRoaXMuX2NvbmZpZygpO2Nhc2UgNDQ6cmV0dXJuIHQudDEwPXQuc2VudC5jbG9ja1RvbGVyYW5jZSx0LmFicnVwdCgicmV0dXJuIix0LnQ0LmlzVmFsaWRJZFRva2VuLmNhbGwodC50NCx0LnQ1LHQudDYsdC50Nyx0LnQ4LHQudDksdC50MTApKTtjYXNlIDQ2OmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzLFtbOCwxNF1dKX0pKSl9fSx7a2V5OiJnZXRBdXRoZW50aWNhdGVkVXNlckluZm8iLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LHIsbixhLGk9dGhpcy5fY3J5cHRvSGVscGVyLmRlY29kZUlEVG9rZW4oZSksbz1MLmdldFRlbmFudERvbWFpbkZyb21JZFRva2VuUGF5bG9hZChpKSxzPW51bGwhPT0odD1udWxsPT1pP3ZvaWQgMDppLnVzZXJuYW1lKSYmdm9pZCAwIT09dD90OiIiLHU9bnVsbCE9PShyPWkuZ2l2ZW5fbmFtZSkmJnZvaWQgMCE9PXI/cjoiIixjPW51bGwhPT0obj1pLmZhbWlseV9uYW1lKSYmdm9pZCAwIT09bj9uOiIiLGY9dSYmYz8iIi5jb25jYXQodSwiICIpLmNvbmNhdChjKTp1fHxjfHwiIixsPW51bGwhPT0oYT1pLnByZWZlcnJlZF91c2VybmFtZSkmJnZvaWQgMCE9PWE/YTpmO3JldHVybiBPYmplY3QuYXNzaWduKHtkaXNwbGF5TmFtZTpsLHRlbmFudERvbWFpbjpvLHVzZXJuYW1lOnN9LEwuZmlsdGVyQ2xhaW1zRnJvbUlEVG9rZW5QYXlsb2FkKGkpKX19LHtrZXk6InJlcGxhY2VDdXN0b21HcmFudFRlbXBsYXRlVGFncyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGEoKXt2YXIgaSxvLHM7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gaT0ib3BlbmlkIixyLm5leHQ9Myx0aGlzLl9jb25maWcoKTtjYXNlIDM6cmV0dXJuIG89ci5zZW50LHIubmV4dD02LHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSh0KTtjYXNlIDY6cmV0dXJuIHM9ci5zZW50LHIuYWJydXB0KCJyZXR1cm4iLChvLnNjb3BlJiZvLnNjb3BlLmxlbmd0aD4wJiYoby5zY29wZS5pbmNsdWRlcygib3BlbmlkIil8fG8uc2NvcGUucHVzaCgib3BlbmlkIiksaT1vLnNjb3BlLmpvaW4oIiAiKSksZS5yZXBsYWNlKCJ7e3Rva2VufX0iLHMuYWNjZXNzX3Rva2VuKS5yZXBsYWNlKCJ7e3VzZXJuYW1lfX0iLHRoaXMuZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKHMuaWRfdG9rZW4pLnVzZXJuYW1lKS5yZXBsYWNlKCJ7e3Njb3BlfX0iLGkpLnJlcGxhY2UoInt7Y2xpZW50SUR9fSIsby5jbGllbnRJRCkucmVwbGFjZSgie3tjbGllbnRTZWNyZXR9fSIsbnVsbCE9PShuPW8uY2xpZW50U2VjcmV0KSYmdm9pZCAwIT09bj9uOiIiKSkpO2Nhc2UgODpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGEsdGhpcyl9KSkpfX0se2tleToiY2xlYXJVc2VyU2Vzc2lvbkRhdGEiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQubmV4dD0yLHRoaXMuX2RhdGFMYXllci5yZW1vdmVUZW1wb3JhcnlEYXRhKGUpO2Nhc2UgMjpyZXR1cm4gdC5uZXh0PTQsdGhpcy5fZGF0YUxheWVyLnJlbW92ZVNlc3Npb25EYXRhKGUpO2Nhc2UgNDpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX0se2tleToiaGFuZGxlVG9rZW5SZXNwb25zZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG4oKXt2YXIgYSxpLG89dGhpcztyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKG4pe2Zvcig7Oylzd2l0Y2gobi5wcmV2PW4ubmV4dCl7Y2FzZSAwOmlmKDIwMD09PWUuc3RhdHVzJiZlLm9rKXtuLm5leHQ9NzticmVha31yZXR1cm4gbi50MD1JLG4udDE9IkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0b2tlbiByZXF1ZXN0ICgiLmNvbmNhdChlLnN0YXR1c1RleHQsIikuIiksbi5uZXh0PTUsZS5qc29uKCk7Y2FzZSA1OnRocm93IG4udDI9bi5zZW50LG5ldyBuLnQwKCJKUy1BVVRIX0hFTFBFUi1IVFItTkUwMSIsbi50MSxuLnQyKTtjYXNlIDc6cmV0dXJuIG4ubmV4dD05LGUuanNvbigpO2Nhc2UgOTpyZXR1cm4oYT1uLnNlbnQpLmNyZWF0ZWRfYXQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksbi5uZXh0PTEzLHRoaXMuX2NvbmZpZygpO2Nhc2UgMTM6aWYoIW4uc2VudC52YWxpZGF0ZUlEVG9rZW4pe24ubmV4dD0xNTticmVha31yZXR1cm4gbi5hYnJ1cHQoInJldHVybiIsdGhpcy52YWxpZGF0ZUlkVG9rZW4oYS5pZF90b2tlbikudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gRShvLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXt2YXIgbjtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGEoYSx0KTtjYXNlIDI6cmV0dXJuIG49e2FjY2Vzc1Rva2VuOmEuYWNjZXNzX3Rva2VuLGNyZWF0ZWRBdDphLmNyZWF0ZWRfYXQsZXhwaXJlc0luOmEuZXhwaXJlc19pbixpZFRva2VuOmEuaWRfdG9rZW4scmVmcmVzaFRva2VuOmEucmVmcmVzaF90b2tlbixzY29wZTphLnNjb3BlLHRva2VuVHlwZTphLnRva2VuX3R5cGV9LGUuYWJydXB0KCJyZXR1cm4iLFByb21pc2UucmVzb2x2ZShuKSk7Y2FzZSA0OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9KSkpO2Nhc2UgMTU6cmV0dXJuIGk9e2FjY2Vzc1Rva2VuOmEuYWNjZXNzX3Rva2VuLGNyZWF0ZWRBdDphLmNyZWF0ZWRfYXQsZXhwaXJlc0luOmEuZXhwaXJlc19pbixpZFRva2VuOmEuaWRfdG9rZW4scmVmcmVzaFRva2VuOmEucmVmcmVzaF90b2tlbixzY29wZTphLnNjb3BlLHRva2VuVHlwZTphLnRva2VuX3R5cGV9LG4ubmV4dD0xOCx0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGEoYSx0KTtjYXNlIDE4OnJldHVybiBuLmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlc29sdmUoaSkpO2Nhc2UgMTk6Y2FzZSJlbmQiOnJldHVybiBuLnN0b3AoKX19KSxuLHRoaXMpfSkpKX19LHtrZXk6ImdlbmVyYXRlUEtDRUtleSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBuKCl7dmFyIGEsaSxvO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIubmV4dD0yLHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhKGUpO2Nhc2UgMjpyZXR1cm4gYT1yLnNlbnQsaT1bXSxPYmplY3Qua2V5cyhhKS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLnN0YXJ0c1dpdGgoInBrY2VfY29kZV92ZXJpZmllciIpJiZpLnB1c2goZSl9KSksbz1pLnNvcnQoKS5wb3AoKSxyLmFicnVwdCgicmV0dXJuIiwicGtjZV9jb2RlX3ZlcmlmaWVyIyIuY29uY2F0KHBhcnNlSW50KG51bGwhPT0odD1udWxsPT1vP3ZvaWQgMDpvLnNwbGl0KCIjIilbMV0pJiZ2b2lkIDAhPT10P3Q6Ii0xIikrMSkpO2Nhc2UgNzpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX1dKSxlfSgpLGo9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe28odGhpcyxlKSx0aGlzLl9jcnlwdG9VdGlscz10fXJldHVybiB1KGUsW3trZXk6ImdldENvZGVWZXJpZmllciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3J5cHRvVXRpbHMuYmFzZTY0VVJMRW5jb2RlKHRoaXMuX2NyeXB0b1V0aWxzLmdlbmVyYXRlUmFuZG9tQnl0ZXMoMzIpKX19LHtrZXk6ImdldENvZGVDaGFsbGVuZ2UiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxFbmNvZGUodGhpcy5fY3J5cHRvVXRpbHMuaGFzaFNoYTI1NihlKSl9fSx7a2V5OiJnZXRKV0tGb3JUaGVJZFRva2VuIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciByLG49SlNPTi5wYXJzZSh0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxEZWNvZGUoZSkpLGE9Xyh0KTt0cnl7Zm9yKGEucygpOyEocj1hLm4oKSkuZG9uZTspe3ZhciBpPXIudmFsdWU7aWYobi5raWQ9PT1pLmtpZClyZXR1cm4gaX19Y2F0Y2goZSl7YS5lKGUpfWZpbmFsbHl7YS5mKCl9dGhyb3cgbmV3IEkoIkpTLUNSWVBUT19VVElMLUdKRlRJVC1JVjAxIiwia2lkIG5vdCBmb3VuZC4iLCJGYWlsZWQgdG8gZmluZCB0aGUgJ2tpZCcgc3BlY2lmaWVkIGluIHRoZSBpZF90b2tlbi4gJ2tpZCcgZm91bmQgaW4gdGhlIGhlYWRlciA6ICIrbi5raWQrIiwgRXhwZWN0ZWQgdmFsdWVzOiAiK3QubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5raWR9KSkuam9pbigiLCAiKSl9fSx7a2V5OiJpc1ZhbGlkSWRUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSx0LHIsbixhLGkpe3JldHVybiB0aGlzLl9jcnlwdG9VdGlscy52ZXJpZnlKd3QoZSx0LFAscixuLGEsaSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGU/UHJvbWlzZS5yZXNvbHZlKCEwKTpQcm9taXNlLnJlamVjdChuZXcgSSgiSlMtQ1JZUFRPX0hFTFBFUi1JVklULUlWMDEiLCJJbnZhbGlkIElEIHRva2VuLiIsIklEIHRva2VuIHZhbGlkYXRpb24gcmV0dXJuZWQgZmFsc2UiKSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybiJFUlJfSldUX0NMQUlNX1ZBTElEQVRJT05fRkFJTEVEIj09PShudWxsPT1lP3ZvaWQgMDplLmNvZGUpJiYibmJmIj09PShudWxsPT1lP3ZvaWQgMDplLmNsYWltKT9Qcm9taXNlLnJlamVjdChuZXcgSSgiSlMtQ1JZUFRPX1VUSUxTLUlWSVQtSVYwMiIsIkpXVCBOQkYgQ0xBSU0gVkFMSURBVElPTiBGQUlMRUQiLCJKV1QgTkJGIGNsYWltIHZhbGlkYXRpb24gaGFzIGJlZW4gZmFpbGVkIikpOlByb21pc2UucmVqZWN0KG5ldyBJKCJKUy1DUllQVE9fVVRJTFMtSVZJVC1JVjAzIiwiSldUIFZBTElEQVRJT04gRkFJTEVEIiwiSldUIHZhbGlkYXRpb24gaGFzIGJlZW4gZmFpbGVkIikpfSkpfX0se2tleToiZGVjb2RlSURUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7dHJ5e3ZhciB0PXRoaXMuX2NyeXB0b1V0aWxzLmJhc2U2NFVSTERlY29kZShlLnNwbGl0KCIuIilbMV0pO3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBJKCJKUy1DUllQVE9fVVRJTC1ESVQtSVYwMSIsIkRlY29kaW5nIElEIHRva2VuIGZhaWxlZC4iLGUpfX19XSksZX0oKSxOPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4pe3ZhciBhPXRoaXM7byh0aGlzLGUpLHRoaXMuX2NyeXB0b1V0aWxzPW4sdGhpcy5fY3J5cHRvSGVscGVyPW5ldyBqKG4pLHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyPW5ldyBNKHQsdGhpcy5fY3J5cHRvSGVscGVyKSx0aGlzLl9kYXRhTGF5ZXI9dCx0aGlzLl9jb25maWc9ZnVuY3Rpb24oKXtyZXR1cm4gRShhLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpO2Nhc2UgMjpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsZS5zZW50KTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX0sdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gRShhLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKTtjYXNlIDI6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGUuc2VudCk7Y2FzZSAzOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9fXJldHVybiB1KGUsW3trZXk6ImdldEF1dGhvcml6YXRpb25VUkwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG4sYSxpO3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbygpe3ZhciBzLHUsYyxmLGwsaCxwLGQsdixnLHksbSxiLGsseCxTLEUsVCxBLFI7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKCJhdXRob3JpemF0aW9uX2VuZHBvaW50Iik7Y2FzZSAyOnJldHVybiBzPXIuc2VudCxyLm5leHQ9NSx0aGlzLl9jb25maWcoKTtjYXNlIDU6aWYodT1yLnNlbnQscyYmMCE9PXMudHJpbSgpLmxlbmd0aCl7ci5uZXh0PTg7YnJlYWt9dGhyb3cgbmV3IEkoIkpTLUFVVEhfQ09SRS1HQVUtTkYwMSIsIk5vIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgZm91bmQuIiwiTm8gYXV0aG9yaXphdGlvbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIGZyb20gdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y2FzZSA4OnJldHVybiBjPW5ldyBVUkwocyksKGY9bmV3IE1hcCkuc2V0KCJyZXNwb25zZV90eXBlIiwiY29kZSIpLGYuc2V0KCJjbGllbnRfaWQiLHUuY2xpZW50SUQpLGw9Im9wZW5pZCIsdS5zY29wZSYmdS5zY29wZS5sZW5ndGg+MCYmKHUuc2NvcGUuaW5jbHVkZXMoIm9wZW5pZCIpfHx1LnNjb3BlLnB1c2goIm9wZW5pZCIpLGw9dS5zY29wZS5qb2luKCIgIikpLGYuc2V0KCJzY29wZSIsbCksZi5zZXQoInJlZGlyZWN0X3VyaSIsdS5zaWduSW5SZWRpcmVjdFVSTCksdS5yZXNwb25zZU1vZGUmJmYuc2V0KCJyZXNwb25zZV9tb2RlIix1LnJlc3BvbnNlTW9kZSksci5uZXh0PTE0LHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmdlbmVyYXRlUEtDRUtleSh0KTtjYXNlIDE0OmlmKGg9ci5zZW50LCF1LmVuYWJsZVBLQ0Upe3IubmV4dD0yMTticmVha31yZXR1cm4gcD1udWxsPT09KG49dGhpcy5fY3J5cHRvSGVscGVyKXx8dm9pZCAwPT09bj92b2lkIDA6bi5nZXRDb2RlVmVyaWZpZXIoKSxkPW51bGw9PT0oYT10aGlzLl9jcnlwdG9IZWxwZXIpfHx2b2lkIDA9PT1hP3ZvaWQgMDphLmdldENvZGVDaGFsbGVuZ2UocCksci5uZXh0PTE5LHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGgscCx0KTtjYXNlIDE5OmYuc2V0KCJjb2RlX2NoYWxsZW5nZV9tZXRob2QiLCJTMjU2IiksZi5zZXQoImNvZGVfY2hhbGxlbmdlIixkKTtjYXNlIDIxOmlmKHUucHJvbXB0JiZmLnNldCgicHJvbXB0Iix1LnByb21wdCksdj1lKWZvcihnPTAseT1PYmplY3QuZW50cmllcyh2KTtnPHkubGVuZ3RoO2crKyltPXcoeVtnXSwyKSxiPW1bMF0saz1tWzFdLCIiIT1iJiYiIiE9ayYmInN0YXRlIiE9PWImJih4PWIucmVwbGFjZSgvW0EtWl0vZywoZnVuY3Rpb24oZSl7cmV0dXJuIl8iLmNvbmNhdChlLnRvTG93ZXJDYXNlKCkpfSkpLGYuc2V0KHgsay50b1N0cmluZygpKSk7Zi5zZXQoInN0YXRlIixMLmdlbmVyYXRlU3RhdGVQYXJhbUZvclJlcXVlc3RDb3JyZWxhdGlvbihoLHY/bnVsbD09PShpPXYuc3RhdGUpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLnRvU3RyaW5nKCk6IiIpKSxTPV8oZi5lbnRyaWVzKCkpO3RyeXtmb3IoUy5zKCk7IShFPVMubigpKS5kb25lOylUPXcoRS52YWx1ZSwyKSxBPVRbMF0sUj1UWzFdLGMuc2VhcmNoUGFyYW1zLmFwcGVuZChBLFIpfWNhdGNoKGUpe1MuZShlKX1maW5hbGx5e1MuZigpfXJldHVybiByLmFicnVwdCgicmV0dXJuIixjLnRvU3RyaW5nKCkpO2Nhc2UgMjg6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxvLHRoaXMpfSkpKX19LHtrZXk6InJlcXVlc3RBY2Nlc3NUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4sYSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBpKCl7dmFyIG8scyx1LGMsZjtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLm5leHQ9Mix0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpO2Nhc2UgMjpyZXR1cm4gbz1yLnNlbnQudG9rZW5fZW5kcG9pbnQsci5uZXh0PTUsdGhpcy5fY29uZmlnKCk7Y2FzZSA1OmlmKHM9ci5zZW50LG8mJjAhPT1vLnRyaW0oKS5sZW5ndGgpe3IubmV4dD04O2JyZWFrfXRocm93IG5ldyBJKCJKUy1BVVRIX0NPUkUtUkFUMS1ORjAxIiwiVG9rZW4gZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIHRva2VuIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2Nhc2UgODppZihyLnQwPXQsIXIudDApe3IubmV4dD0xMjticmVha31yZXR1cm4gci5uZXh0PTEyLHRoaXMuX2RhdGFMYXllci5zZXRTZXNzaW9uRGF0YVBhcmFtZXRlcigic2Vzc2lvbl9zdGF0ZSIsdCxhKTtjYXNlIDEyOmlmKCh1PVtdKS5wdXNoKCJjbGllbnRfaWQ9Ii5jb25jYXQocy5jbGllbnRJRCkpLHMuY2xpZW50U2VjcmV0JiZzLmNsaWVudFNlY3JldC50cmltKCkubGVuZ3RoPjAmJnUucHVzaCgiY2xpZW50X3NlY3JldD0iLmNvbmNhdChzLmNsaWVudFNlY3JldCkpLGM9ZSx1LnB1c2goImNvZGU9Ii5jb25jYXQoYykpLHUucHVzaCgiZ3JhbnRfdHlwZT1hdXRob3JpemF0aW9uX2NvZGUiKSx1LnB1c2goInJlZGlyZWN0X3VyaT0iLmNvbmNhdChzLnNpZ25JblJlZGlyZWN0VVJMKSksci50MT1zLmVuYWJsZVBLQ0UsIXIudDEpe3IubmV4dD0yOTticmVha31yZXR1cm4gci50Mj11LHIudDM9ImNvZGVfdmVyaWZpZXI9IixyLm5leHQ9MjQsdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoTC5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKG4pLGEpO2Nhc2UgMjQ6cmV0dXJuIHIudDQ9ci5zZW50LHIudDU9ci50My5jb25jYXQuY2FsbChyLnQzLHIudDQpLHIudDIucHVzaC5jYWxsKHIudDIsci50NSksci5uZXh0PTI5LHRoaXMuX2RhdGFMYXllci5yZW1vdmVUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKEwuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShuKSxhKTtjYXNlIDI5OnJldHVybiByLnByZXY9Mjksci5uZXh0PTMyLGZldGNoKG8se2JvZHk6dS5qb2luKCImIiksY3JlZGVudGlhbHM6cy5zZW5kQ29va2llc0luUmVxdWVzdHM/Ui5JbmNsdWRlOlIuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKEwuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QifSk7Y2FzZSAzMjpmPXIuc2VudCxyLm5leHQ9Mzg7YnJlYWs7Y2FzZSAzNTp0aHJvdyByLnByZXY9MzUsci50Nj1yLmNhdGNoKDI5KSxuZXcgSSgiSlMtQVVUSF9DT1JFLVJBVDEtTkUwMiIsIlJlcXVlc3RpbmcgYWNjZXNzIHRva2VuIGZhaWxlZCIsbnVsbCE9ci50Nj9yLnQ2OiJUaGUgcmVxdWVzdCB0byBnZXQgdGhlIGFjY2VzcyB0b2tlbiBmcm9tIHRoZSBzZXJ2ZXIgZmFpbGVkLiIpO2Nhc2UgMzg6aWYoZi5vayl7ci5uZXh0PTQ1O2JyZWFrfXJldHVybiByLnQ3PUksci50OD0iUmVxdWVzdGluZyBhY2Nlc3MgdG9rZW4gZmFpbGVkIHdpdGggIi5jb25jYXQoZi5zdGF0dXNUZXh0KSxyLm5leHQ9NDMsZi5qc29uKCk7Y2FzZSA0Mzp0aHJvdyByLnQ5PXIuc2VudCxuZXcgci50NygiSlMtQVVUSF9DT1JFLVJBVDEtSEUwMyIsci50OCxyLnQ5KTtjYXNlIDQ1OnJldHVybiByLm5leHQ9NDcsdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShmLGEpO2Nhc2UgNDc6cmV0dXJuIHIuYWJydXB0KCJyZXR1cm4iLHIuc2VudCk7Y2FzZSA0ODpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGksdGhpcyxbWzI5LDM1XV0pfSkpKX19LHtrZXk6InJlZnJlc2hBY2Nlc3NUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIG4sYSxpLG8scztyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpO2Nhc2UgMjpyZXR1cm4gbj10LnNlbnQudG9rZW5fZW5kcG9pbnQsdC5uZXh0PTUsdGhpcy5fY29uZmlnKCk7Y2FzZSA1OnJldHVybiBhPXQuc2VudCx0Lm5leHQ9OCx0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSk7Y2FzZSA4OmlmKChpPXQuc2VudCkucmVmcmVzaF90b2tlbil7dC5uZXh0PTExO2JyZWFrfXRocm93IG5ldyBJKCJKUy1BVVRIX0NPUkUtUkFUMi1ORjAxIiwiTm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4iLCJUaGVyZSB3YXMgbm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4gQXNnYXJkZW8gZG9lc24ndCByZXR1cm4gYSByZWZyZXNoIHRva2VuIGlmIHRoZSByZWZyZXNoIHRva2VuIGdyYW50IGlzIG5vdCBlbmFibGVkLiIpO2Nhc2UgMTE6aWYobiYmMCE9PW4udHJpbSgpLmxlbmd0aCl7dC5uZXh0PTEzO2JyZWFrfXRocm93IG5ldyBJKCJKUy1BVVRIX0NPUkUtUkFUMi1ORjAyIiwiTm8gcmVmcmVzaCB0b2tlbiBlbmRwb2ludCBmb3VuZC4iLCJObyByZWZyZXNoIHRva2VuIGVuZHBvaW50IHdhcyBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y2FzZSAxMzpyZXR1cm4obz1bXSkucHVzaCgiY2xpZW50X2lkPSIuY29uY2F0KGEuY2xpZW50SUQpKSxvLnB1c2goInJlZnJlc2hfdG9rZW49Ii5jb25jYXQoaS5yZWZyZXNoX3Rva2VuKSksby5wdXNoKCJncmFudF90eXBlPXJlZnJlc2hfdG9rZW4iKSxhLmNsaWVudFNlY3JldCYmYS5jbGllbnRTZWNyZXQudHJpbSgpLmxlbmd0aD4wJiZvLnB1c2goImNsaWVudF9zZWNyZXQ9Ii5jb25jYXQoYS5jbGllbnRTZWNyZXQpKSx0LnByZXY9MTUsdC5uZXh0PTE4LGZldGNoKG4se2JvZHk6by5qb2luKCImIiksY3JlZGVudGlhbHM6YS5zZW5kQ29va2llc0luUmVxdWVzdHM/Ui5JbmNsdWRlOlIuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKEwuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QifSk7Y2FzZSAxODpzPXQuc2VudCx0Lm5leHQ9MjQ7YnJlYWs7Y2FzZSAyMTp0aHJvdyB0LnByZXY9MjEsdC50MD10LmNhdGNoKDE1KSxuZXcgSSgiSlMtQVVUSF9DT1JFLVJBVDItTlIwMyIsIlJlZnJlc2ggYWNjZXNzIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9dC50MD90LnQwOiJUaGUgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIpO2Nhc2UgMjQ6aWYocy5vayl7dC5uZXh0PTMxO2JyZWFrfXJldHVybiB0LnQxPUksdC50Mj0iUmVmcmVzaGluZyBhY2Nlc3MgdG9rZW4gZmFpbGVkIHdpdGggIi5jb25jYXQocy5zdGF0dXNUZXh0KSx0Lm5leHQ9Mjkscy5qc29uKCk7Y2FzZSAyOTp0aHJvdyB0LnQzPXQuc2VudCxuZXcgdC50MSgiSlMtQVVUSF9DT1JFLVJBVDItSEUwNCIsdC50Mix0LnQzKTtjYXNlIDMxOnJldHVybiB0LmFicnVwdCgicmV0dXJuIix0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5oYW5kbGVUb2tlblJlc3BvbnNlKHMsZSkpO2Nhc2UgMzI6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMsW1sxNSwyMV1dKX0pKSl9fSx7a2V5OiJyZXZva2VBY2Nlc3NUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIG4sYSxpLG87cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKTtjYXNlIDI6cmV0dXJuIG49dC5zZW50LnJldm9jYXRpb25fZW5kcG9pbnQsdC5uZXh0PTUsdGhpcy5fY29uZmlnKCk7Y2FzZSA1OmlmKGE9dC5zZW50LG4mJjAhPT1uLnRyaW0oKS5sZW5ndGgpe3QubmV4dD04O2JyZWFrfXRocm93IG5ldyBJKCJKUy1BVVRIX0NPUkUtUkFUMy1ORjAxIiwiTm8gcmV2b2tlIGFjY2VzcyB0b2tlbiBlbmRwb2ludCBmb3VuZC4iLCJObyByZXZva2UgYWNjZXNzIHRva2VuIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHJldm9rZSBhY2Nlc3MgdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y2FzZSA4OnJldHVybihpPVtdKS5wdXNoKCJjbGllbnRfaWQ9Ii5jb25jYXQoYS5jbGllbnRJRCkpLHQudDA9aSx0LnQxPSJ0b2tlbj0iLHQubmV4dD0xNCx0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSk7Y2FzZSAxNDpyZXR1cm4gdC50Mj10LnNlbnQuYWNjZXNzX3Rva2VuLHQudDM9dC50MS5jb25jYXQuY2FsbCh0LnQxLHQudDIpLHQudDAucHVzaC5jYWxsKHQudDAsdC50MyksaS5wdXNoKCJ0b2tlbl90eXBlX2hpbnQ9YWNjZXNzX3Rva2VuIiksdC5wcmV2PTE4LHQubmV4dD0yMSxmZXRjaChuLHtib2R5Omkuam9pbigiJiIpLGNyZWRlbnRpYWxzOmEuc2VuZENvb2tpZXNJblJlcXVlc3RzP1IuSW5jbHVkZTpSLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyhMLmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSksbWV0aG9kOiJQT1NUIn0pO2Nhc2UgMjE6bz10LnNlbnQsdC5uZXh0PTI3O2JyZWFrO2Nhc2UgMjQ6dGhyb3cgdC5wcmV2PTI0LHQudDQ9dC5jYXRjaCgxOCksbmV3IEkoIkpTLUFVVEhfQ09SRS1SQVQzLU5FMDIiLCJUaGUgcmVxdWVzdCB0byByZXZva2UgYWNjZXNzIHRva2VuIGZhaWxlZC4iLG51bGwhPXQudDQ/dC50NDoiVGhlIHJlcXVlc3Qgc2VudCB0byByZXZva2UgdGhlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIik7Y2FzZSAyNzppZigyMDA9PT1vLnN0YXR1cyYmby5vayl7dC5uZXh0PTM0O2JyZWFrfXJldHVybiB0LnQ1PUksdC50Nj0iSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHJldm9rZSBhY2Nlc3MgdG9rZW4gcmVxdWVzdCAoIi5jb25jYXQoby5zdGF0dXNUZXh0LCIpLiIpLHQubmV4dD0zMixvLmpzb24oKTtjYXNlIDMyOnRocm93IHQudDc9dC5zZW50LG5ldyB0LnQ1KCJKUy1BVVRIX0NPUkUtUkFUMy1IRTAzIix0LnQ2LHQudDcpO2Nhc2UgMzQ6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLCh0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5jbGVhclVzZXJTZXNzaW9uRGF0YShlKSxQcm9taXNlLnJlc29sdmUobykpKTtjYXNlIDM1OmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzLFtbMTgsMjRdXSl9KSkpfX0se2tleToicmVxdWVzdEN1c3RvbUdyYW50Iix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbigpe3ZhciBhLGksbyxzLHUsYyxmLGw9dGhpcztyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKG4pe2Zvcig7Oylzd2l0Y2gobi5wcmV2PW4ubmV4dCl7Y2FzZSAwOnJldHVybiBuLm5leHQ9Mix0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpO2Nhc2UgMjpyZXR1cm4gYT1uLnNlbnQsbi5uZXh0PTUsdGhpcy5fY29uZmlnKCk7Y2FzZSA1OmlmKGk9bi5zZW50LChvPWUudG9rZW5FbmRwb2ludCYmMCE9PWUudG9rZW5FbmRwb2ludC50cmltKCkubGVuZ3RoP2UudG9rZW5FbmRwb2ludDphLnRva2VuX2VuZHBvaW50KSYmMCE9PW8udHJpbSgpLmxlbmd0aCl7bi5uZXh0PTg7YnJlYWt9dGhyb3cgbmV3IEkoIkpTLUFVVEhfQ09SRS1SQ0ctTkYwMSIsIlRva2VuIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjYXNlIDg6cmV0dXJuIG4ubmV4dD0xMCxQcm9taXNlLmFsbChPYmplY3QuZW50cmllcyhlLmRhdGEpLm1hcCgoZnVuY3Rpb24oZSl7dmFyIG49dyhlLDIpLGE9blswXSxpPW5bMV07cmV0dXJuIEUobCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7dmFyIG47cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5uZXh0PTIsdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVwbGFjZUN1c3RvbUdyYW50VGVtcGxhdGVUYWdzKGksdCk7Y2FzZSAyOnJldHVybiBuPWUuc2VudCxlLmFicnVwdCgicmV0dXJuIiwiIi5jb25jYXQoYSwiPSIpLmNvbmNhdChuKSk7Y2FzZSA0OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9KSkpO2Nhc2UgMTA6aWYocz1uLnNlbnQsdT1PYmplY3QuYXNzaWduKHt9LEwuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxuLnQwPWUuYXR0YWNoVG9rZW4sIW4udDApe24ubmV4dD0yMzticmVha31yZXR1cm4gbi50MT1PYmplY3Qsbi50Mj1PYmplY3QuYXNzaWduKHt9LHUpLG4udDM9IkJlYXJlciAiLG4ubmV4dD0xOSx0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEodCk7Y2FzZSAxOTpuLnQ0PW4uc2VudC5hY2Nlc3NfdG9rZW4sbi50NT1uLnQzLmNvbmNhdC5jYWxsKG4udDMsbi50NCksbi50Nj17QXV0aG9yaXphdGlvbjpuLnQ1fSx1PW4udDEuYXNzaWduLmNhbGwobi50MSxuLnQyLG4udDYpO2Nhc2UgMjM6cmV0dXJuIGM9e2JvZHk6cy5qb2luKCImIiksY3JlZGVudGlhbHM6aS5zZW5kQ29va2llc0luUmVxdWVzdHM/Ui5JbmNsdWRlOlIuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKHUpLG1ldGhvZDoiUE9TVCJ9LG4ucHJldj0yNCxuLm5leHQ9MjcsZmV0Y2gobyxjKTtjYXNlIDI3OmY9bi5zZW50LG4ubmV4dD0zMzticmVhaztjYXNlIDMwOnRocm93IG4ucHJldj0zMCxuLnQ3PW4uY2F0Y2goMjQpLG5ldyBJKCJKUy1BVVRIX0NPUkUtUkNHLU5FMDIiLCJUaGUgY3VzdG9tIGdyYW50IHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9bi50Nz9uLnQ3OiJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgY3VzdG9tIGdyYW50IGZhaWxlZC4iKTtjYXNlIDMzOmlmKDIwMD09PWYuc3RhdHVzJiZmLm9rKXtuLm5leHQ9NDA7YnJlYWt9cmV0dXJuIG4udDg9SSxuLnQ5PSJJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgdGhlIGN1c3RvbSBncmFudCByZXF1ZXN0LiAoIi5jb25jYXQoZi5zdGF0dXNUZXh0LCIpIiksbi5uZXh0PTM4LGYuanNvbigpO2Nhc2UgMzg6dGhyb3cgbi50MTA9bi5zZW50LG5ldyBuLnQ4KCJKUy1BVVRIX0NPUkUtUkNHLUhFMDMiLG4udDksbi50MTApO2Nhc2UgNDA6aWYoIWUucmV0dXJuc1Nlc3Npb24pe24ubmV4dD00NDticmVha31uLnQxMT10aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5oYW5kbGVUb2tlblJlc3BvbnNlKGYsdCksbi5uZXh0PTQ5O2JyZWFrO2Nhc2UgNDQ6cmV0dXJuIG4udDEyPVByb21pc2Usbi5uZXh0PTQ3LGYuanNvbigpO2Nhc2UgNDc6bi50MTM9bi5zZW50LG4udDExPW4udDEyLnJlc29sdmUuY2FsbChuLnQxMixuLnQxMyk7Y2FzZSA0OTpyZXR1cm4gbi5hYnJ1cHQoInJldHVybiIsbi50MTEpO2Nhc2UgNTA6Y2FzZSJlbmQiOnJldHVybiBuLnN0b3AoKX19KSxuLHRoaXMsW1syNCwzMF1dKX0pKSl9fSx7a2V5OiJnZXRCYXNpY1VzZXJJbmZvIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXt2YXIgbixhLGk7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpO2Nhc2UgMjpyZXR1cm4gbj10LnNlbnQsYT10aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5nZXRBdXRoZW50aWNhdGVkVXNlckluZm8obnVsbD09bj92b2lkIDA6bi5pZF90b2tlbiksaT17YWxsb3dlZFNjb3BlczpuLnNjb3BlLHNlc3Npb25TdGF0ZTpuLnNlc3Npb25fc3RhdGV9LHQuYWJydXB0KCJyZXR1cm4iLChPYmplY3Qua2V5cyhhKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2b2lkIDAhPT1hW2VdJiYiIiE9PWFbZV0mJm51bGwhPT1hW2VdfHxkZWxldGUgYVtlXX0pKSxpPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSxhKSkpO2Nhc2UgNjpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX0se2tleToiZ2V0RGVjb2RlZElEVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3ZhciBuO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQubmV4dD0yLHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKTtjYXNlIDI6cmV0dXJuIG49dC5zZW50LmlkX3Rva2VuLHQuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2NyeXB0b0hlbHBlci5kZWNvZGVJRFRva2VuKG4pKTtjYXNlIDQ6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImdldENyeXB0b0hlbHBlciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLmFicnVwdCgicmV0dXJuIix0aGlzLl9jcnlwdG9IZWxwZXIpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsdGhpcyl9KSkpfX0se2tleToiZ2V0SURUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpO2Nhc2UgMjpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsdC5zZW50LmlkX3Rva2VuKTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImdldE9JRENQcm92aWRlck1ldGFEYXRhIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXt2YXIgbixhLGk7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsdGhpcy5fY29uZmlnKCk7Y2FzZSAyOmlmKG49dC5zZW50LHQudDA9IWUsIXQudDApe3QubmV4dD04O2JyZWFrfXJldHVybiB0Lm5leHQ9Nyx0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpO2Nhc2UgNzp0LnQwPXQuc2VudDtjYXNlIDg6aWYoIXQudDApe3QubmV4dD0xMDticmVha31yZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZXNvbHZlKCkpO2Nhc2UgMTA6aWYoIShhPW4ud2VsbEtub3duRW5kcG9pbnQpKXt0Lm5leHQ9MzY7YnJlYWt9cmV0dXJuIHQucHJldj0xMix0Lm5leHQ9MTUsZmV0Y2goYSk7Y2FzZSAxNTppZigyMDA9PT0oaT10LnNlbnQpLnN0YXR1cyYmaS5vayl7dC5uZXh0PTE4O2JyZWFrfXRocm93IG5ldyBFcnJvcjtjYXNlIDE4OnQubmV4dD0yMzticmVhaztjYXNlIDIwOnRocm93IHQucHJldj0yMCx0LnQxPXQuY2F0Y2goMTIpLG5ldyBJKCJKUy1BVVRIX0NPUkUtR09QTUQtSEUwMSIsIkludmFsaWQgd2VsbC1rbm93biByZXNwb25zZSIsIlRoZSB3ZWxsIGtub3duIGVuZHBvaW50IHJlc3BvbnNlIGhhcyBiZWVuIGZhaWxlZCB3aXRoIGFuIGVycm9yLiIpO2Nhc2UgMjM6cmV0dXJuIHQudDI9dGhpcy5fZGF0YUxheWVyLHQudDM9dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIsdC5uZXh0PTI3LGkuanNvbigpO2Nhc2UgMjc6cmV0dXJuIHQudDQ9dC5zZW50LHQubmV4dD0zMCx0LnQzLnJlc29sdmVFbmRwb2ludHMuY2FsbCh0LnQzLHQudDQpO2Nhc2UgMzA6cmV0dXJuIHQudDU9dC5zZW50LHQubmV4dD0zMyx0LnQyLnNldE9JRENQcm92aWRlck1ldGFEYXRhLmNhbGwodC50Mix0LnQ1KTtjYXNlIDMzOnJldHVybiB0Lm5leHQ9MzUsdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiLCEwKTtjYXNlIDM1OnJldHVybiB0LmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlc29sdmUoKSk7Y2FzZSAzNjppZighbi5iYXNlVXJsKXt0Lm5leHQ9NTI7YnJlYWt9cmV0dXJuIHQucHJldj0zNyx0LnQ2PXRoaXMuX2RhdGFMYXllcix0Lm5leHQ9NDEsdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZUVuZHBvaW50c0J5QmFzZVVSTCgpO2Nhc2UgNDE6cmV0dXJuIHQudDc9dC5zZW50LHQubmV4dD00NCx0LnQ2LnNldE9JRENQcm92aWRlck1ldGFEYXRhLmNhbGwodC50Nix0LnQ3KTtjYXNlIDQ0OnQubmV4dD00OTticmVhaztjYXNlIDQ2OnRocm93IHQucHJldj00Nix0LnQ4PXQuY2F0Y2goMzcpLG5ldyBJKCJKUy1BVVRIX0NPUkUtR09QTUQtSVYwMiIsIlJlc29sdmluZyBlbmRwb2ludHMgZmFpbGVkLiIsbnVsbCE9dC50OD90LnQ4OiJSZXNvbHZpbmcgZW5kcG9pbnRzIGJ5IGJhc2UgdXJsIGZhaWxlZC4iKTtjYXNlIDQ5OnJldHVybiB0Lm5leHQ9NTEsdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiLCEwKTtjYXNlIDUxOnJldHVybiB0LmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlc29sdmUoKSk7Y2FzZSA1MjpyZXR1cm4gdC5wcmV2PTUyLHQudDk9dGhpcy5fZGF0YUxheWVyLHQubmV4dD01Nix0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzRXhwbGljaXRseSgpO2Nhc2UgNTY6cmV0dXJuIHQudDEwPXQuc2VudCx0Lm5leHQ9NTksdC50OS5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YS5jYWxsKHQudDksdC50MTApO2Nhc2UgNTk6dC5uZXh0PTY0O2JyZWFrO2Nhc2UgNjE6dGhyb3cgdC5wcmV2PTYxLHQudDExPXQuY2F0Y2goNTIpLG5ldyBJKCJKUy1BVVRIX0NPUkUtR09QTUQtSVYwMyIsIlJlc29sdmluZyBlbmRwb2ludHMgZmFpbGVkLiIsbnVsbCE9dC50MTE/dC50MTE6IlJlc29sdmluZyBlbmRwb2ludHMgYnkgZXhwbGljaXRseSBmYWlsZWQuIik7Y2FzZSA2NDpyZXR1cm4gdC5uZXh0PTY2LHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIiwhMCk7Y2FzZSA2NjpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZXNvbHZlKCkpO2Nhc2UgNjc6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMsW1sxMiwyMF0sWzM3LDQ2XSxbNTIsNjFdXSl9KSkpfX0se2tleToiZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdCxuLGEsaSxvLHMsdSxjLGY7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBsKCl7dmFyIGg7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKTtjYXNlIDI6cmV0dXJuIGg9ci5zZW50LHIuYWJydXB0KCJyZXR1cm4iLHthdXRob3JpemF0aW9uRW5kcG9pbnQ6bnVsbCE9PShlPWguYXV0aG9yaXphdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWU/ZToiIixjaGVja1Nlc3Npb25JZnJhbWU6bnVsbCE9PSh0PWguY2hlY2tfc2Vzc2lvbl9pZnJhbWUpJiZ2b2lkIDAhPT10P3Q6IiIsZW5kU2Vzc2lvbkVuZHBvaW50Om51bGwhPT0obj1oLmVuZF9zZXNzaW9uX2VuZHBvaW50KSYmdm9pZCAwIT09bj9uOiIiLGludHJvc3BlY3Rpb25FbmRwb2ludDpudWxsIT09KGE9aC5pbnRyb3NwZWN0aW9uX2VuZHBvaW50KSYmdm9pZCAwIT09YT9hOiIiLGlzc3VlcjpudWxsIT09KGk9aC5pc3N1ZXIpJiZ2b2lkIDAhPT1pP2k6IiIsandrc1VyaTpudWxsIT09KG89aC5qd2tzX3VyaSkmJnZvaWQgMCE9PW8/bzoiIixyZWdpc3RyYXRpb25FbmRwb2ludDpudWxsIT09KHM9aC5yZWdpc3RyYXRpb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1zP3M6IiIscmV2b2NhdGlvbkVuZHBvaW50Om51bGwhPT0odT1oLnJldm9jYXRpb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT11P3U6IiIsdG9rZW5FbmRwb2ludDpudWxsIT09KGM9aC50b2tlbl9lbmRwb2ludCkmJnZvaWQgMCE9PWM/YzoiIix1c2VyaW5mb0VuZHBvaW50Om51bGwhPT0oZj1oLnVzZXJpbmZvX2VuZHBvaW50KSYmdm9pZCAwIT09Zj9mOiIifSk7Y2FzZSA0OmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksbCx0aGlzKX0pKSl9fSx7a2V5OiJnZXRTaWduT3V0VVJMIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdCxuLGE7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBpKCl7dmFyIG8scyx1LGM7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKTtjYXNlIDI6aWYoci50MT10PXIuc2VudCxyLnQwPW51bGw9PT1yLnQxLHIudDApe3IubmV4dD02O2JyZWFrfXIudDA9dm9pZCAwPT09dDtjYXNlIDY6aWYoIXIudDApe3IubmV4dD0xMDticmVha31yLnQyPXZvaWQgMCxyLm5leHQ9MTE7YnJlYWs7Y2FzZSAxMDpyLnQyPXQuZW5kX3Nlc3Npb25fZW5kcG9pbnQ7Y2FzZSAxMTpyZXR1cm4gbz1yLnQyLHIubmV4dD0xNCx0aGlzLl9jb25maWcoKTtjYXNlIDE0OmlmKHM9ci5zZW50LG8mJjAhPT1vLnRyaW0oKS5sZW5ndGgpe3IubmV4dD0xNzticmVha310aHJvdyBuZXcgSSgiSlMtQVVUSF9DT1JFLUdTT1UtTkYwMSIsIlNpZ24tb3V0IGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBzaWduLW91dCBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSBzaWduLW91dCBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjYXNlIDE3OnJldHVybiByLm5leHQ9MTksdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpO2Nhc2UgMTk6aWYoci50ND1uPXIuc2VudCxyLnQzPW51bGw9PT1yLnQ0LHIudDMpe3IubmV4dD0yMzticmVha31yLnQzPXZvaWQgMD09PW47Y2FzZSAyMzppZighci50Myl7ci5uZXh0PTI3O2JyZWFrfXIudDU9dm9pZCAwLHIubmV4dD0yODticmVhaztjYXNlIDI3OnIudDU9bi5pZF90b2tlbjtjYXNlIDI4OmlmKCh1PXIudDUpJiYwIT09dS50cmltKCkubGVuZ3RoKXtyLm5leHQ9MzE7YnJlYWt9dGhyb3cgbmV3IEkoIkpTLUFVVEhfQ09SRS1HU09VLU5GMDIiLCJJRCB0b2tlbiBub3QgZm91bmQuIiwiTm8gSUQgdG9rZW4gY291bGQgYmUgZm91bmQuIEVpdGhlciB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpcyBsb3N0IG9yIHlvdSBoYXZlIG5vdCBzaWduZWQgaW4uIik7Y2FzZSAzMTppZigoYz1udWxsIT09KGE9bnVsbD09cz92b2lkIDA6cy5zaWduT3V0UmVkaXJlY3RVUkwpJiZ2b2lkIDAhPT1hP2E6bnVsbD09cz92b2lkIDA6cy5zaWduSW5SZWRpcmVjdFVSTCkmJjAhPT1jLnRyaW0oKS5sZW5ndGgpe3IubmV4dD0zNDticmVha310aHJvdyBuZXcgSSgiSlMtQVVUSF9DT1JFLUdTT1UtTkYwMyIsIk5vIHNpZ24tb3V0IHJlZGlyZWN0IFVSTCBmb3VuZC4iLCJUaGUgc2lnbi1vdXQgcmVkaXJlY3QgVVJMIGNhbm5vdCBiZSBmb3VuZCBvciB0aGUgVVJMIHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiBObyBzaWduLWluIHJlZGlyZWN0IFVSTCBoYXMgYmVlbiBmb3VuZCBlaXRoZXIuICIpO2Nhc2UgMzQ6cmV0dXJuIHIuYWJydXB0KCJyZXR1cm4iLCIiLmNvbmNhdChvLCI/aWRfdG9rZW5faGludD0iKS5jb25jYXQodSwiJnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaT0iKS5jb25jYXQoYywiJnN0YXRlPXNpZ25fb3V0X3N1Y2Nlc3MiKSk7Y2FzZSAzNTpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGksdGhpcyl9KSkpfX0se2tleToic2lnbk91dCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsdGhpcy5nZXRTaWduT3V0VVJMKGUpO2Nhc2UgMjpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsdC5zZW50KTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImNsZWFyVXNlclNlc3Npb25EYXRhIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5jbGVhclVzZXJTZXNzaW9uRGF0YShlKTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImdldEFjY2Vzc1Rva2VuIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG4oKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSk7Y2FzZSAyOmlmKHIudDE9dD1yLnNlbnQsci50MD1udWxsPT09ci50MSxyLnQwKXtyLm5leHQ9NjticmVha31yLnQwPXZvaWQgMD09PXQ7Y2FzZSA2OmlmKCFyLnQwKXtyLm5leHQ9MTA7YnJlYWt9ci50Mj12b2lkIDAsci5uZXh0PTExO2JyZWFrO2Nhc2UgMTA6ci50Mj10LmFjY2Vzc190b2tlbjtjYXNlIDExOnJldHVybiByLmFicnVwdCgicmV0dXJuIixyLnQyKTtjYXNlIDEyOmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksbix0aGlzKX0pKSl9fSx7a2V5OiJpc0F1dGhlbnRpY2F0ZWQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQudDA9Qm9vbGVhbix0Lm5leHQ9Myx0aGlzLmdldEFjY2Vzc1Rva2VuKGUpO2Nhc2UgMzpyZXR1cm4gdC50MT10LnNlbnQsdC5hYnJ1cHQoInJldHVybiIsKDAsdC50MCkodC50MSkpO2Nhc2UgNTpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX0se2tleToiZ2V0UEtDRUNvZGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBuKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoTC5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKGUpLHQpO2Nhc2UgMjpyZXR1cm4gci5hYnJ1cHQoInJldHVybiIsci5zZW50KTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxuLHRoaXMpfSkpKX19LHtrZXk6InNldFBLQ0VDb2RlIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBhKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoTC5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKHQpLGUsbik7Y2FzZSAyOnJldHVybiByLmFicnVwdCgicmV0dXJuIixyLnNlbnQpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGEsdGhpcyl9KSkpfX0se2tleToidXBkYXRlQ29uZmlnIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuc2V0Q29uZmlnRGF0YShlKTtjYXNlIDI6cmV0dXJuIHQubmV4dD00LHRoaXMuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITApO2Nhc2UgNDpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX1dKSxlfSgpLHE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQscil7byh0aGlzLGUpLHRoaXMuX2lkPXQsdGhpcy5fc3RvcmU9cn1yZXR1cm4gdShlLFt7a2V5OiJzZXREYXRhSW5CdWxrIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gYSgpe3ZhciBpLG8scyx1O3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIubmV4dD0yLHRoaXMuX3N0b3JlLmdldERhdGEoZSk7Y2FzZSAyOmlmKHIudDE9bj1yLnNlbnQsci50MD1udWxsIT09ci50MSwhci50MCl7ci5uZXh0PTY7YnJlYWt9ci50MD12b2lkIDAhPT1uO2Nhc2UgNjppZighci50MCl7ci5uZXh0PTEwO2JyZWFrfXIudDI9bixyLm5leHQ9MTE7YnJlYWs7Y2FzZSAxMDpyLnQyPW51bGw7Y2FzZSAxMTpyZXR1cm4gaT1yLnQyLG89aSYmSlNPTi5wYXJzZShpKSxzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxvKSx0KSx1PUpTT04uc3RyaW5naWZ5KHMpLHIubmV4dD0xNyx0aGlzLl9zdG9yZS5zZXREYXRhKGUsdSk7Y2FzZSAxNzpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGEsdGhpcyl9KSkpfX0se2tleToic2V0VmFsdWUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgYTtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGkoKXt2YXIgbyxzLHUsZjtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLm5leHQ9Mix0aGlzLl9zdG9yZS5nZXREYXRhKGUpO2Nhc2UgMjppZihyLnQxPWE9ci5zZW50LHIudDA9bnVsbCE9PXIudDEsIXIudDApe3IubmV4dD02O2JyZWFrfXIudDA9dm9pZCAwIT09YTtjYXNlIDY6aWYoIXIudDApe3IubmV4dD0xMDticmVha31yLnQyPWEsci5uZXh0PTExO2JyZWFrO2Nhc2UgMTA6ci50Mj1udWxsO2Nhc2UgMTE6cmV0dXJuIG89ci50MixzPW8mJkpTT04ucGFyc2UobyksdT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scyksYyh7fSx0LG4pKSxmPUpTT04uc3RyaW5naWZ5KHUpLHIubmV4dD0xNyx0aGlzLl9zdG9yZS5zZXREYXRhKGUsZik7Y2FzZSAxNzpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGksdGhpcyl9KSkpfX0se2tleToicmVtb3ZlVmFsdWUiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBhKCl7dmFyIGksbyxzLHU7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fc3RvcmUuZ2V0RGF0YShlKTtjYXNlIDI6aWYoci50MT1uPXIuc2VudCxyLnQwPW51bGwhPT1yLnQxLCFyLnQwKXtyLm5leHQ9NjticmVha31yLnQwPXZvaWQgMCE9PW47Y2FzZSA2OmlmKCFyLnQwKXtyLm5leHQ9MTA7YnJlYWt9ci50Mj1uLHIubmV4dD0xMTticmVhaztjYXNlIDEwOnIudDI9bnVsbDtjYXNlIDExOnJldHVybiBpPXIudDIsbz1pJiZKU09OLnBhcnNlKGkpLGRlbGV0ZShzPU9iamVjdC5hc3NpZ24oe30sbykpW3RdLHU9SlNPTi5zdHJpbmdpZnkocyksci5uZXh0PTE4LHRoaXMuX3N0b3JlLnNldERhdGEoZSx1KTtjYXNlIDE4OmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksYSx0aGlzKX0pKSl9fSx7a2V5OiJfcmVzb2x2ZUtleSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8iIi5jb25jYXQoZSwiLSIpLmNvbmNhdCh0aGlzLl9pZCwiLSIpLmNvbmNhdCh0KToiIi5jb25jYXQoZSwiLSIpLmNvbmNhdCh0aGlzLl9pZCl9fSx7a2V5OiJzZXRDb25maWdEYXRhIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLnNldERhdGFJbkJ1bGsodGhpcy5fcmVzb2x2ZUtleShBLkNvbmZpZ0RhdGEpLGUpO2Nhc2UgMjpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX0se2tleToic2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6dGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoQS5PSURDUHJvdmlkZXJNZXRhRGF0YSksZSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSl9fSx7a2V5OiJzZXRUZW1wb3JhcnlEYXRhIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbigpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6dGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoQS5UZW1wb3JhcnlEYXRhLHQpLGUpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX0se2tleToic2V0U2Vzc2lvbkRhdGEiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBuKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDp0aGlzLnNldERhdGFJbkJ1bGsodGhpcy5fcmVzb2x2ZUtleShBLlNlc3Npb25EYXRhLHQpLGUpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX0se2tleToic2V0Q3VzdG9tRGF0YSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gYSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6dGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoZSxuKSx0KTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxhLHRoaXMpfSkpKX19LHtrZXk6ImdldENvbmZpZ0RhdGEiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC50MD1KU09OLHQubmV4dD0zLHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShBLkNvbmZpZ0RhdGEpKTtjYXNlIDM6aWYodC50Mj1lPXQuc2VudCx0LnQxPW51bGwhPT10LnQyLCF0LnQxKXt0Lm5leHQ9NzticmVha310LnQxPXZvaWQgMCE9PWU7Y2FzZSA3OmlmKCF0LnQxKXt0Lm5leHQ9MTE7YnJlYWt9dC50Mz1lLHQubmV4dD0xMjticmVhaztjYXNlIDExOnQudDM9bnVsbDtjYXNlIDEyOnJldHVybiB0LnQ0PXQudDMsdC5hYnJ1cHQoInJldHVybiIsdC50MC5wYXJzZS5jYWxsKHQudDAsdC50NCkpO2Nhc2UgMTQ6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImdldE9JRENQcm92aWRlck1ldGFEYXRhIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlO3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQudDA9SlNPTix0Lm5leHQ9Myx0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoQS5PSURDUHJvdmlkZXJNZXRhRGF0YSkpO2Nhc2UgMzppZih0LnQyPWU9dC5zZW50LHQudDE9bnVsbCE9PXQudDIsIXQudDEpe3QubmV4dD03O2JyZWFrfXQudDE9dm9pZCAwIT09ZTtjYXNlIDc6aWYoIXQudDEpe3QubmV4dD0xMTticmVha310LnQzPWUsdC5uZXh0PTEyO2JyZWFrO2Nhc2UgMTE6dC50Mz1udWxsO2Nhc2UgMTI6cmV0dXJuIHQudDQ9dC50Myx0LmFicnVwdCgicmV0dXJuIix0LnQwLnBhcnNlLmNhbGwodC50MCx0LnQ0KSk7Y2FzZSAxNDpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX0se2tleToiZ2V0VGVtcG9yYXJ5RGF0YSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBuKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci50MD1KU09OLHIubmV4dD0zLHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShBLlRlbXBvcmFyeURhdGEsZSkpO2Nhc2UgMzppZihyLnQyPXQ9ci5zZW50LHIudDE9bnVsbCE9PXIudDIsIXIudDEpe3IubmV4dD03O2JyZWFrfXIudDE9dm9pZCAwIT09dDtjYXNlIDc6aWYoIXIudDEpe3IubmV4dD0xMTticmVha31yLnQzPXQsci5uZXh0PTEyO2JyZWFrO2Nhc2UgMTE6ci50Mz1udWxsO2Nhc2UgMTI6cmV0dXJuIHIudDQ9ci50MyxyLmFicnVwdCgicmV0dXJuIixyLnQwLnBhcnNlLmNhbGwoci50MCxyLnQ0KSk7Y2FzZSAxNDpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX0se2tleToiZ2V0U2Vzc2lvbkRhdGEiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbigpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIudDA9SlNPTixyLm5leHQ9Myx0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoQS5TZXNzaW9uRGF0YSxlKSk7Y2FzZSAzOmlmKHIudDI9dD1yLnNlbnQsci50MT1udWxsIT09ci50Miwhci50MSl7ci5uZXh0PTc7YnJlYWt9ci50MT12b2lkIDAhPT10O2Nhc2UgNzppZighci50MSl7ci5uZXh0PTExO2JyZWFrfXIudDM9dCxyLm5leHQ9MTI7YnJlYWs7Y2FzZSAxMTpyLnQzPW51bGw7Y2FzZSAxMjpyZXR1cm4gci50ND1yLnQzLHIuYWJydXB0KCJyZXR1cm4iLHIudDAucGFyc2UuY2FsbChyLnQwLHIudDQpKTtjYXNlIDE0OmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksbix0aGlzKX0pKSl9fSx7a2V5OiJnZXRDdXN0b21EYXRhIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gYSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIudDA9SlNPTixyLm5leHQ9Myx0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoZSx0KSk7Y2FzZSAzOmlmKHIudDI9bj1yLnNlbnQsci50MT1udWxsIT09ci50Miwhci50MSl7ci5uZXh0PTc7YnJlYWt9ci50MT12b2lkIDAhPT1uO2Nhc2UgNzppZighci50MSl7ci5uZXh0PTExO2JyZWFrfXIudDM9bixyLm5leHQ9MTI7YnJlYWs7Y2FzZSAxMTpyLnQzPW51bGw7Y2FzZSAxMjpyZXR1cm4gci50ND1yLnQzLHIuYWJydXB0KCJyZXR1cm4iLHIudDAucGFyc2UuY2FsbChyLnQwLHIudDQpKTtjYXNlIDE0OmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksYSx0aGlzKX0pKSl9fSx7a2V5OiJyZW1vdmVDb25maWdEYXRhIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUubmV4dD0yLHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShBLkNvbmZpZ0RhdGEpKTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX19LHtrZXk6InJlbW92ZU9JRENQcm92aWRlck1ldGFEYXRhIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUubmV4dD0yLHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShBLk9JRENQcm92aWRlck1ldGFEYXRhKSk7Y2FzZSAyOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9fSx7a2V5OiJyZW1vdmVUZW1wb3JhcnlEYXRhIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoQS5UZW1wb3JhcnlEYXRhLGUpKTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6InJlbW92ZVNlc3Npb25EYXRhIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoQS5TZXNzaW9uRGF0YSxlKSk7Y2FzZSAyOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSl9fSx7a2V5OiJnZXRDb25maWdEYXRhUGFyYW1ldGVyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXt2YXIgbjtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoQS5Db25maWdEYXRhKSk7Y2FzZSAyOnJldHVybiBuPXQuc2VudCx0LmFicnVwdCgicmV0dXJuIixuJiZKU09OLnBhcnNlKG4pW2VdKTtjYXNlIDQ6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXt2YXIgbjtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoQS5PSURDUHJvdmlkZXJNZXRhRGF0YSkpO2Nhc2UgMjpyZXR1cm4gbj10LnNlbnQsdC5hYnJ1cHQoInJldHVybiIsbiYmSlNPTi5wYXJzZShuKVtlXSk7Y2FzZSA0OmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSl9fSx7a2V5OiJnZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbigpe3ZhciBhO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIubmV4dD0yLHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShBLlRlbXBvcmFyeURhdGEsdCkpO2Nhc2UgMjpyZXR1cm4gYT1yLnNlbnQsci5hYnJ1cHQoInJldHVybiIsYSYmSlNPTi5wYXJzZShhKVtlXSk7Y2FzZSA0OmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksbix0aGlzKX0pKSl9fSx7a2V5OiJnZXRTZXNzaW9uRGF0YVBhcmFtZXRlciIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG4oKXt2YXIgYTtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLm5leHQ9Mix0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoQS5TZXNzaW9uRGF0YSx0KSk7Y2FzZSAyOnJldHVybiBhPXIuc2VudCxyLmFicnVwdCgicmV0dXJuIixhJiZKU09OLnBhcnNlKGEpW2VdKTtjYXNlIDQ6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxuLHRoaXMpfSkpKX19LHtrZXk6InNldENvbmZpZ0RhdGFQYXJhbWV0ZXIiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBuKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KEEuQ29uZmlnRGF0YSksZSx0KTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxuLHRoaXMpfSkpKX19LHtrZXk6InNldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbigpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIubmV4dD0yLHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShBLk9JRENQcm92aWRlck1ldGFEYXRhKSxlLHQpO2Nhc2UgMjpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX0se2tleToic2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlciIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gYSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIubmV4dD0yLHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShBLlRlbXBvcmFyeURhdGEsbiksZSx0KTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxhLHRoaXMpfSkpKX19LHtrZXk6InNldFNlc3Npb25EYXRhUGFyYW1ldGVyIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBhKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KEEuU2Vzc2lvbkRhdGEsbiksZSx0KTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxhLHRoaXMpfSkpKX19LHtrZXk6InJlbW92ZUNvbmZpZ0RhdGFQYXJhbWV0ZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQubmV4dD0yLHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShBLkNvbmZpZ0RhdGEpLGUpO2Nhc2UgMjpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX0se2tleToicmVtb3ZlT0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQubmV4dD0yLHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShBLk9JRENQcm92aWRlck1ldGFEYXRhKSxlKTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6InJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBuKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KEEuVGVtcG9yYXJ5RGF0YSx0KSxlKTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxuLHRoaXMpfSkpKX19LHtrZXk6InJlbW92ZVNlc3Npb25EYXRhUGFyYW1ldGVyIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbigpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIubmV4dD0yLHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShBLlNlc3Npb25EYXRhLHQpLGUpO2Nhc2UgMjpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX1dKSxlfSgpLEs9e2Nsb2NrVG9sZXJhbmNlOjMwMCxlbmFibGVQS0NFOiEwLHJlc3BvbnNlTW9kZTpULnF1ZXJ5LHNjb3BlOlsib3BlbmlkIl0sc2VuZENvb2tpZXNJblJlcXVlc3RzOiEwLHZhbGlkYXRlSURUb2tlbjohMH0sSj1mdW5jdGlvbigpewovKioKICAgICAgICAgKiBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBtZXRob2QgdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSAuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0b3JlfSBzdG9yZSAtIFRoZSBzdG9yZSBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IF9zdG9yZTogU3RvcmUgPSBuZXcgRGF0YVN0b3JlKCk7CiAgICAgICAgICogY29uc3QgYXV0aCA9IG5ldyBBc2dhcmRlb0F1dGhDbGllbnQ8Q3VzdG9tQ2xpZW50Q29uZmlnPihfc3RvcmUpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2NvbnN0cnVjdG9yCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovCmZ1bmN0aW9uIGUodCxyKXtvKHRoaXMsZSksZS5faW5zdGFuY2VJRD9lLl9pbnN0YW5jZUlEKz0xOmUuX2luc3RhbmNlSUQ9MCx0aGlzLl9kYXRhTGF5ZXI9bmV3IHEoImluc3RhbmNlXyIuY29uY2F0KGUuX2luc3RhbmNlSUQpLHQpLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZT1uZXcgTih0aGlzLl9kYXRhTGF5ZXIsciksZS5fYXV0aGVudGljYXRpb25Db3JlPW5ldyBOKHRoaXMuX2RhdGFMYXllcixyKX0KLyoqCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0aGUgU0RLIHdpdGggdGhlIGNvbmZpZyBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBdXRoQ2xpZW50Q29uZmlnPFQ+fSBjb25maWcgLSBUaGUgY29uZmlnIG9iamVjdCB0byBpbml0aWFsaXplIHdpdGguCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICAgKiAgICAgc2lnbkluUmVkaXJlY3RVUkw6ICJodHRwOi8vbG9jYWxob3N0OjMwMDAvc2lnbi1pbiIsCiAgICAgICAgICogICAgIGNsaWVudElEOiAiY2xpZW50IElEIiwKICAgICAgICAgKiAgICAgYmFzZVVybDogImh0dHBzOi8vbG9jYWxob3N0Ojk0NDMiCiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogYXdhaXQgYXV0aC5pbml0aWFsaXplKGNvbmZpZyk7CiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaW5pdGlhbGl6ZQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovcmV0dXJuIHUoZSxbe2tleToiaW5pdGlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQsbixhO3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gaSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIubmV4dD0yLHRoaXMuX2RhdGFMYXllci5zZXRDb25maWdEYXRhKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LEspLGUpLHtzY29wZTpbXS5jb25jYXQoYihudWxsIT09KHQ9Sy5zY29wZSkmJnZvaWQgMCE9PXQ/dDpbXSksYihudWxsIT09KGE9bnVsbD09PShuPWUuc2NvcGUpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmZpbHRlcigoZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIShudWxsPT09KHQ9bnVsbD09Sz92b2lkIDA6Sy5zY29wZSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuaW5jbHVkZXMoZSkpfSkpKSYmdm9pZCAwIT09YT9hOltdKSl9KSk7Y2FzZSAyOmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksaSx0aGlzKX0pKSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYERhdGFMYXllcmAgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBhY2Nlc3MgYXV0aGVudGljYXRpb24gZGF0YS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJuIHtEYXRhTGF5ZXJ9IC0gVGhlIGBEYXRhTGF5ZXJgIG9iamVjdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBkYXRhID0gYXV0aC5nZXREYXRhTGF5ZXIoKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXREYXRhTGF5ZXIKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi99LHtrZXk6ImdldERhdGFMYXllciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YUxheWVyfQovKioKICAgICAgICAgICAqIFRoaXMgaXMgYW4gYXN5bmMgbWV0aG9kIHRoYXQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhdXRob3JpemF0aW9uIFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0ge0dldEF1dGhVUkxDb25maWd9IGNvbmZpZyAtIChPcHRpb25hbCkgQSBjb25maWcgb2JqZWN0IHRvIGZvcmNlIGluaXRpYWxpemF0aW9uIGFuZCBwYXNzCiAgICAgICAgICAgKiBjdXN0b20gcGF0aCBwYXJhbWV0ZXJzIHN1Y2ggYXMgdGhlIGZpZHAgcGFyYW1ldGVyLgogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYXV0aG9yaXphdGlvbiBVUkwuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogYXV0aC5nZXRBdXRob3JpemF0aW9uVVJMKCkudGhlbigodXJsKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHVybCk7CiAgICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICAgKiB9KTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRBdXRob3JpemF0aW9uVVJMCiAgICAgICAgICAgKgogICAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovfSx7a2V5OiJnZXRBdXRob3JpemF0aW9uVVJMIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbigpe3ZhciBhLGk9dGhpcztyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiBudWxsPT0oYT1PYmplY3QuYXNzaWduKHt9LGUpKXx8ZGVsZXRlIGEuZm9yY2VJbml0LHIubmV4dD00LHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIik7Y2FzZSA0OmlmKCFyLnNlbnQpe3IubmV4dD04O2JyZWFrfXIudDA9dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEF1dGhvcml6YXRpb25VUkwoYSx0KSxyLm5leHQ9OTticmVhaztjYXNlIDg6ci50MD10aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEobnVsbD09ZT92b2lkIDA6ZS5mb3JjZUluaXQpLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIGkuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBdXRob3JpemF0aW9uVVJMKGEsdCl9KSk7Y2FzZSA5OnJldHVybiByLmFicnVwdCgicmV0dXJuIixyLnQwKTtjYXNlIDEwOmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksbix0aGlzKX0pKSl9Ci8qKgogICAgICAgICAgICogVGhpcyBpcyBhbiBhc3luYyBtZXRob2QgdGhhdCBzZW5kcyBhIHJlcXVlc3QgdG8gb2J0YWluIHRoZSBhY2Nlc3MgdG9rZW4gYW5kIHJldHVybnMgYSBQcm9taXNlCiAgICAgICAgICAgKiB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIGFuZCBvdGhlciByZWxldmFudCBkYXRhLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRob3JpemF0aW9uQ29kZSAtIFRoZSBhdXRob3JpemF0aW9uIGNvZGUuCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvblN0YXRlIC0gVGhlIHNlc3Npb24gc3RhdGUuCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8VG9rZW5SZXNwb25zZT59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdG9rZW4gcmVzcG9uc2UuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogYXV0aC5yZXF1ZXN0QWNjZXNzVG9rZW4oYXV0aENvZGUsIHNlc3Npb25TdGF0ZSkudGhlbigodG9rZW4pPT57CiAgICAgICAgICAgKiAgLy8gY29uc29sZS5sb2codG9rZW4pOwogICAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAgICogfSk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmVxdWVzdEFjY2Vzc1Rva2VuCiAgICAgICAgICAgKgogICAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovfSx7a2V5OiJyZXF1ZXN0QWNjZXNzVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGEpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gaSgpe3ZhciBvPXRoaXM7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKTtjYXNlIDI6aWYoIXIuc2VudCl7ci5uZXh0PTY7YnJlYWt9ci50MD10aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVxdWVzdEFjY2Vzc1Rva2VuKGUsdCxuLGEpLHIubmV4dD03O2JyZWFrO2Nhc2UgNjpyLnQwPXRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSghMSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gby5fYXV0aGVudGljYXRpb25Db3JlLnJlcXVlc3RBY2Nlc3NUb2tlbihlLHQsbixhKX0pKTtjYXNlIDc6cmV0dXJuIHIuYWJydXB0KCJyZXR1cm4iLHIudDApO2Nhc2UgODpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGksdGhpcyl9KSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgYXV0aGVudGljYXRpb24gZGF0YSBhbmQgcmV0dXJucyB0aGUgc2lnbi1vdXQgVVJMLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBzaWduT3V0VXJsID0gYXdhaXQgYXV0aC5zaWduT3V0KCk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjc2lnbk91dAogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToic2lnbk91dCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnNpZ25PdXQoZSkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqICoqVGhpcyBkb2Vzbid0IGNsZWFyIHRoZSBhdXRoZW50aWNhdGlvbiBkYXRhLioqCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBzaWduT3V0VXJsID0gYXdhaXQgYXV0aC5nZXRTaWduT3V0VVJMKCk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0U2lnbk91dFVSTAogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToiZ2V0U2lnbk91dFVSTCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldFNpZ25PdXRVUkwoZSkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgT0lEQyBzZXJ2aWNlIGVuZHBvaW50cyB0aGF0IGFyZSBmZXRjaGVkIGZyb20gdGhlIGAud2VsbC1rbm93bmAgZW5kcG9pbnQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxPSURDRW5kcG9pbnRzPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBPSURDIHNlcnZpY2UgZW5kcG9pbnRzLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGF1dGguZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRPSURDU2VydmljZUVuZHBvaW50cwogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToiZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsdGhpcyl9KSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIGRlY29kZXMgdGhlIHBheWxvYWQgb2YgdGhlIElEIHRva2VuIGFuZCByZXR1cm5zIGl0LgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxEZWNvZGVkSURUb2tlblBheWxvYWQ+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGRlY29kZWQgSUQgdG9rZW4gcGF5bG9hZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBkZWNvZGVkSWRUb2tlbiA9IGF3YWl0IGF1dGguZ2V0RGVjb2RlZElEVG9rZW4oKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXREZWNvZGVkSURUb2tlbgogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToiZ2V0RGVjb2RlZElEVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXREZWNvZGVkSURUb2tlbihlKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgSUQgdG9rZW4uCiAgICAgICAgICAgKgogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgSUQgdG9rZW4uCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogY29uc3QgaWRUb2tlbiA9IGF3YWl0IGF1dGguZ2V0SURUb2tlbigpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldElEVG9rZW4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi99LHtrZXk6ImdldElEVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRJRFRva2VuKGUpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBiYXNpYyB1c2VyIGluZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gdGhlIElEIHRva2VuLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxCYXNpY1VzZXJJbmZvPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBiYXNpYyB1c2VyIGluZm9ybWF0aW9uLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IHVzZXJJbmZvID0gYXdhaXQgYXV0aC5nZXRCYXNpY1VzZXJJbmZvKCk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QmFzaWNVc2VySW5mbwogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToiZ2V0QmFzaWNVc2VySW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEJhc2ljVXNlckluZm8oZSkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGNyeXB0byBoZWxwZXIgb2JqZWN0LgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8Q3J5cHRvSGVscGVyPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGEgQ3J5cHRvSGVscGVyIG9iamVjdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBjcnlwdG9IZWxwZXIgPSBhd2FpdCBhdXRoLkNyeXB0b0hlbHBlcigpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldENyeXB0b0hlbHBlcgogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToiZ2V0Q3J5cHRvSGVscGVyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBFKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRDcnlwdG9IZWxwZXIoKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV2b2tlcyB0aGUgYWNjZXNzIHRva2VuLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogKipUaGlzIG1ldGhvZCBhbHNvIGNsZWFycyB0aGUgYXV0aGVudGljYXRpb24gZGF0YS4qKgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8RmV0Y2hSZXNwb25zZT59IC0gQSBQcm9taXNlIHRoYXQgcmV0dXJucyB0aGUgcmVzcG9uc2Ugb2YgdGhlIHJldm9rZS1hY2Nlc3MtdG9rZW4gcmVxdWVzdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBhdXRoLnJldm9rZUFjY2Vzc1Rva2VuKCkudGhlbigocmVzcG9uc2UpPT57CiAgICAgICAgICAgKiAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpOwogICAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAgICogfSk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmV2b2tlQWNjZXNzVG9rZW4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi99LHtrZXk6InJldm9rZUFjY2Vzc1Rva2VuIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJldm9rZUFjY2Vzc1Rva2VuKGUpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIHJlZnJlc2hlcyB0aGUgYWNjZXNzIHRva2VuIGFuZCByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIG5ldyBhY2Nlc3MKICAgICAgICAgICAqIHRva2VuIGFuZCBvdGhlciByZWxldmFudCBkYXRhLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxUb2tlblJlc3BvbnNlPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0b2tlbiByZXNwb25zZS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBhdXRoLnJlZnJlc2hBY2Nlc3NUb2tlbigpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTsKICAgICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgICAqIH0pOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3JlZnJlc2hBY2Nlc3NUb2tlbgogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToicmVmcmVzaEFjY2Vzc1Rva2VuIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlZnJlc2hBY2Nlc3NUb2tlbihlKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICAgKgogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYWNjZXNzIHRva2VuLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgYXV0aC5nZXRBY2Nlc3NUb2tlbigpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEFjY2Vzc1Rva2VuCiAgICAgICAgICAgKgogICAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovfSx7a2V5OiJnZXRBY2Nlc3NUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEFjY2Vzc1Rva2VuKGUpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCBzZW5kcyBhIGN1c3RvbS1ncmFudCByZXF1ZXN0IGFuZCByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3BvbnNlCiAgICAgICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIGNvbmZpZyBwYXNzZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHBhcmFtIHtDdXN0b21HcmFudENvbmZpZ30gY29uZmlnIC0gQSBjb25maWcgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1c3RvbSBncmFudCBjb25maWd1cmF0aW9ucy4KICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxUb2tlblJlc3BvbnNlIHwgRmV0Y2hSZXNwb25zZT59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzcG9uc2UgZGVwZW5kaW5nCiAgICAgICAgICAgKiBvbiB5b3VyIGNvbmZpZ3VyYXRpb25zLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICAgICAqICAgYXR0YWNoVG9rZW46IGZhbHNlLAogICAgICAgICAgICogICBkYXRhOiB7CiAgICAgICAgICAgKiAgICAgICBjbGllbnRfaWQ6ICJ7e2NsaWVudElEfX0iLAogICAgICAgICAgICogICAgICAgZ3JhbnRfdHlwZTogImFjY291bnRfc3dpdGNoIiwKICAgICAgICAgICAqICAgICAgIHNjb3BlOiAie3tzY29wZX19IiwKICAgICAgICAgICAqICAgICAgIHRva2VuOiAie3t0b2tlbn19IiwKICAgICAgICAgICAqICAgfSwKICAgICAgICAgICAqICAgaWQ6ICJhY2NvdW50LXN3aXRjaCIsCiAgICAgICAgICAgKiAgIHJldHVyblJlc3BvbnNlOiB0cnVlLAogICAgICAgICAgICogICByZXR1cm5zU2Vzc2lvbjogdHJ1ZSwKICAgICAgICAgICAqICAgc2lnbkluUmVxdWlyZWQ6IHRydWUKICAgICAgICAgICAqIH0KICAgICAgICAgICAqCiAgICAgICAgICAgKiBhdXRoLnJlcXVlc3RDdXN0b21HcmFudChjb25maWcpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTsKICAgICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgICAqIH0pOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3JlcXVlc3RDdXN0b21HcmFudAogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToicmVxdWVzdEN1c3RvbUdyYW50Iix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVxdWVzdEN1c3RvbUdyYW50KGUsdCl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIG9yIG5vdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogYXdhaXQgYXV0aC5pc0F1dGhlbnRpY2F0ZWQoKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNpc0F1dGhlbnRpY2F0ZWQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi99LHtrZXk6ImlzQXV0aGVudGljYXRlZCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmlzQXV0aGVudGljYXRlZChlKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzKX0pKSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgUEtDRSBjb2RlIGdlbmVyYXRlZCBkdXJpbmcgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGF1dGhlbnRpY2F0aW9uIFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlIC0gVGhlIHN0YXRlIHBhcmFtZXRlciB0aGF0IHdhcyBwYXNzZWQgaW4gdGhlIGF1dGhlbnRpY2F0aW9uIFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgUEtDRSBjb2RlLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IHBrY2UgPSBhd2FpdCBnZXRQS0NFQ29kZSgpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldFBLQ0VDb2RlCiAgICAgICAgICAgKgogICAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovfSx7a2V5OiJnZXRQS0NFQ29kZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG4oKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLmFicnVwdCgicmV0dXJuIix0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0UEtDRUNvZGUoZSx0KSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksbix0aGlzKX0pKSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgUEtDRSBjb2RlIHRvIHRoZSBkYXRhIHN0b3JlLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwa2NlIC0gVGhlIFBLQ0UgY29kZS4KICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZSAtIFRoZSBzdGF0ZSBwYXJhbWV0ZXIgdGhhdCB3YXMgcGFzc2VkIGluIHRoZSBhdXRoZW50aWNhdGlvbiBVUkwuCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGF3YWl0IGF1dGguc2V0UEtDRUNvZGUoInBrY2VfY29kZSIpCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjc2V0UEtDRUNvZGUKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi99LHtrZXk6InNldFBLQ0VDb2RlIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBhKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gci5uZXh0PTIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnNldFBLQ0VDb2RlKGUsdCxuKTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxhLHRoaXMpfSkpKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSBzaWduLW91dCBpcyBzdWNjZXNzZnVsIG9yIG5vdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbk91dFJlZGlyZWN0VXJsIC0gVGhlIFVSTCB0byB3aGljaCB0aGUgdXNlciBoYXMgYmVlbiByZWRpcmVjdGVkIHRvIGFmdGVyIHNpZ25pbmctb3V0LgogICAgICAgICAgICoKICAgICAgICAgICAqICoqVGhlIHNlcnZlciBhcHBlbmRzIHBhdGggcGFyYW1ldGVycyB0byB0aGUgYHNpZ25PdXRSZWRpcmVjdFVSTGAgYW5kIHRoZXNlIHBhdGggcGFyYW1ldGVycwogICAgICAgICAgICogIGFyZSByZXF1aXJlZCBmb3IgdGhpcyBtZXRob2QgdG8gZnVuY3Rpb24uKioKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiBzdWNjZXNzZnVsLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaXNTaWduT3V0U3VjY2Vzc2Z1bAogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL30se2tleToidXBkYXRlQ29uZmlnIix2YWx1ZToKLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCB1cGRhdGVzIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGluc3RhbnRpYXRpbmcgdGhpcyBjbGFzcy4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0ge1BhcnRpYWw8QXV0aENsaWVudENvbmZpZzxUPj59IGNvbmZpZyAtIEEgY29uZmlnIG9iamVjdCB0byB1cGRhdGUgdGhlIFNESyBjb25maWd1cmF0aW9ucyB3aXRoLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICAgICAqICAgICBzaWduSW5SZWRpcmVjdFVSTDogImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9zaWduLWluIiwKICAgICAgICAgICAqICAgICBjbGllbnRJRDogImNsaWVudCBJRCIsCiAgICAgICAgICAgKiAgICAgYmFzZVVybDogImh0dHBzOi8vbG9jYWxob3N0Ojk0NDMiCiAgICAgICAgICAgKiB9CiAgICAgICAgICAgKgogICAgICAgICAgICogYXdhaXQgYXV0aC51cGRhdGVDb25maWcoY29uZmlnKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3VwZGF0ZUNvbmZpZwogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqLwpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUudXBkYXRlQ29uZmlnKGUpO2Nhc2UgMjpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX1dLFt7a2V5OiJpc1NpZ25PdXRTdWNjZXNzZnVsIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1uZXcgVVJMKGUpLHI9dC5zZWFyY2hQYXJhbXMuZ2V0KCJzdGF0ZSIpLG49Qm9vbGVhbih0LnNlYXJjaFBhcmFtcy5nZXQoImVycm9yIikpO3JldHVybiEhciYmInNpZ25fb3V0X3N1Y2Nlc3MiPT09ciYmIW59Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgc2lnbi1vdXQgaGFzIGZhaWxlZCBvciBub3QuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNpZ25PdXRSZWRpcmVjdFVybCAtIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHVzZXIgaGFzIGJlZW4gcmVkaXJlY3RlZCB0byBhZnRlciBzaWduaW5nLW91dC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiAqKlRoZSBzZXJ2ZXIgYXBwZW5kcyBwYXRoIHBhcmFtZXRlcnMgdG8gdGhlIGBzaWduT3V0UmVkaXJlY3RVUkxgIGFuZCB0aGVzZSBwYXRoIHBhcmFtZXRlcnMKICAgICAgICAgICAqICBhcmUgcmVxdWlyZWQgZm9yIHRoaXMgbWV0aG9kIHRvIGZ1bmN0aW9uLioqCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gLSBgdHJ1ZWAgaWYgc3VjY2Vzc2Z1bCwgYGZhbHNlYCBvdGhlcndpc2UuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2RpZFNpZ25PdXRGYWlsCiAgICAgICAgICAgKgogICAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovfSx7a2V5OiJkaWRTaWduT3V0RmFpbCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFVSTChlKSxyPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxuPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIXImJiJzaWduX291dF9zdWNjZXNzIj09PXImJm59fSx7a2V5OiJjbGVhclVzZXJTZXNzaW9uRGF0YSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEUodGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmNsZWFyVXNlclNlc3Npb25EYXRhKGUpO2Nhc2UgMjpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyl9KSkpfX1dKSxlfSgpLEI9ImluaXQiOyFmdW5jdGlvbihlKXtlLkxvY2FsU3RvcmFnZT0ibG9jYWxTdG9yYWdlIixlLlNlc3Npb25TdG9yYWdlPSJzZXNzaW9uU3RvcmFnZSIsZS5XZWJXb3JrZXI9IndlYldvcmtlciIsZS5Ccm93c2VyTWVtb3J5PSJicm93c2VyTWVtb3J5In0oVXx8KFU9e30pKSxmdW5jdGlvbihlKXtlLlNpZ25Jbj0ic2lnbi1pbiIsZS5TaWduT3V0PSJzaWduLW91dCIsZS5Jbml0aWFsaXplPSJpbml0aWFsaXplIixlLkh0dHBSZXF1ZXN0U3RhcnQ9Imh0dHAtcmVxdWVzdC1zdGFydCIsZS5IdHRwUmVxdWVzdEZpbmlzaD0iaHR0cC1yZXF1ZXN0LWZpbmlzaCIsZS5IdHRwUmVxdWVzdEVycm9yPSJodHRwLXJlcXVlc3QtZXJyb3IiLGUuSHR0cFJlcXVlc3RTdWNjZXNzPSJodHRwLXJlcXVlc3Qtc3VjY2VzcyIsZS5SZXZva2VBY2Nlc3NUb2tlbj0icmV2b2tlLWFjY2Vzcy10b2tlbiIsZS5DdXN0b21HcmFudD0iY3VzdG9tLWdyYW50IixlLlNpZ25PdXRGYWlsZWQ9InNpZ24tb3V0LWZhaWxlZCJ9KEh8fChIPXt9KSk7dmFyIEY9InByb21wdE5vbmVSZXF1ZXN0U2VudCIsVz0iZXJyb3IiLHo9ImVycm9yX2Rlc2NyaXB0aW9uIixZPSJjdXN0b21fZ3JhbnRfY29uZmlnIixHPSJzdGF0ZSIsVj0iQWNjZXNzIHRva2VuIGlzIGludmFsaWQiLFg9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiAkKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9ZnVuY3Rpb24gWihlKXtpZihlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHQ9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24ocil7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIsbi5nZXQ/bjp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZVtyXX19KX0pKSx0fXZhciBRPXtleHBvcnRzOnt9fSxlZT1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgcj1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksbj0wO248ci5sZW5ndGg7bisrKXJbbl09YXJndW1lbnRzW25dO3JldHVybiBlLmFwcGx5KHQscil9fSx0ZT1lZSxyZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIG5lKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpfWZ1bmN0aW9uIGFlKGUpe3JldHVybiB2b2lkIDA9PT1lfWZ1bmN0aW9uIGllKGUpe3JldHVybiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1yZS5jYWxsKGUpfWZ1bmN0aW9uIG9lKGUpe3JldHVybiBudWxsIT09ZSYmIm9iamVjdCI9PT1uKGUpfWZ1bmN0aW9uIHNlKGUpe2lmKCJbb2JqZWN0IE9iamVjdF0iIT09cmUuY2FsbChlKSlyZXR1cm4hMTt2YXIgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cmV0dXJuIG51bGw9PT10fHx0PT09T2JqZWN0LnByb3RvdHlwZX1mdW5jdGlvbiB1ZShlKXtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT09cmUuY2FsbChlKX1mdW5jdGlvbiBjZShlLHQpe2lmKG51bGwhPWUpaWYoIm9iamVjdCIhPT1uKGUpJiYoZT1bZV0pLG5lKGUpKWZvcih2YXIgcj0wLGE9ZS5sZW5ndGg7cjxhO3IrKyl0LmNhbGwobnVsbCxlW3JdLHIsZSk7ZWxzZSBmb3IodmFyIGkgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSYmdC5jYWxsKG51bGwsZVtpXSxpLGUpfXZhciBmZT17aXNBcnJheTpuZSxpc0FycmF5QnVmZmVyOmllLGlzQnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmIWFlKGUpJiZudWxsIT09ZS5jb25zdHJ1Y3RvciYmIWFlKGUuY29uc3RydWN0b3IpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihlKX0saXNGb3JtRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBGb3JtRGF0YV0iPT09cmUuY2FsbChlKX0saXNBcnJheUJ1ZmZlclZpZXc6ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmQXJyYXlCdWZmZXIuaXNWaWV3P0FycmF5QnVmZmVyLmlzVmlldyhlKTplJiZlLmJ1ZmZlciYmaWUoZS5idWZmZXIpfSxpc1N0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9LGlzTnVtYmVyOmZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX0saXNPYmplY3Q6b2UsaXNQbGFpbk9iamVjdDpzZSxpc1VuZGVmaW5lZDphZSxpc0RhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09cmUuY2FsbChlKX0saXNGaWxlOmZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEZpbGVdIj09PXJlLmNhbGwoZSl9LGlzQmxvYjpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBCbG9iXSI9PT1yZS5jYWxsKGUpfSxpc0Z1bmN0aW9uOnVlLGlzU3RyZWFtOmZ1bmN0aW9uKGUpe3JldHVybiBvZShlKSYmdWUoZS5waXBlKX0saXNVUkxTZWFyY2hQYXJhbXM6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgVVJMU2VhcmNoUGFyYW1zXSI9PT1yZS5jYWxsKGUpfSxpc1N0YW5kYXJkQnJvd3NlckVudjpmdW5jdGlvbigpe3JldHVybigidW5kZWZpbmVkIj09dHlwZW9mIG5hdmlnYXRvcnx8IlJlYWN0TmF0aXZlIiE9PW5hdmlnYXRvci5wcm9kdWN0JiYiTmF0aXZlU2NyaXB0IiE9PW5hdmlnYXRvci5wcm9kdWN0JiYiTlMiIT09bmF2aWdhdG9yLnByb2R1Y3QpJiYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpfSxmb3JFYWNoOmNlLG1lcmdlOmZ1bmN0aW9uIGUoKXt2YXIgdD17fTtmdW5jdGlvbiByKHIsbil7c2UodFtuXSkmJnNlKHIpP3Rbbl09ZSh0W25dLHIpOnNlKHIpP3Rbbl09ZSh7fSxyKTpuZShyKT90W25dPXIuc2xpY2UoKTp0W25dPXJ9Zm9yKHZhciBuPTAsYT1hcmd1bWVudHMubGVuZ3RoO248YTtuKyspY2UoYXJndW1lbnRzW25dLHIpO3JldHVybiB0fSxleHRlbmQ6ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBjZSh0LChmdW5jdGlvbih0LG4pe2Vbbl09ciYmImZ1bmN0aW9uIj09dHlwZW9mIHQ/dGUodCxyKTp0fSkpLGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0sc3RyaXBCT006ZnVuY3Rpb24oZSl7cmV0dXJuIDY1Mjc5PT09ZS5jaGFyQ29kZUF0KDApJiYoZT1lLnNsaWNlKDEpKSxlfX0sbGU9ZmU7ZnVuY3Rpb24gaGUoZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9dmFyIHBlPWZ1bmN0aW9uKGUsdCxyKXtpZighdClyZXR1cm4gZTt2YXIgbjtpZihyKW49cih0KTtlbHNlIGlmKGxlLmlzVVJMU2VhcmNoUGFyYW1zKHQpKW49dC50b1N0cmluZygpO2Vsc2V7dmFyIGE9W107bGUuZm9yRWFjaCh0LChmdW5jdGlvbihlLHQpe251bGwhPWUmJihsZS5pc0FycmF5KGUpP3QrPSJbXSI6ZT1bZV0sbGUuZm9yRWFjaChlLChmdW5jdGlvbihlKXtsZS5pc0RhdGUoZSk/ZT1lLnRvSVNPU3RyaW5nKCk6bGUuaXNPYmplY3QoZSkmJihlPUpTT04uc3RyaW5naWZ5KGUpKSxhLnB1c2goaGUodCkrIj0iK2hlKGUpKX0pKSl9KSksbj1hLmpvaW4oIiYiKX1pZihuKXt2YXIgaT1lLmluZGV4T2YoIiMiKTstMSE9PWkmJihlPWUuc2xpY2UoMCxpKSksZSs9KC0xPT09ZS5pbmRleE9mKCI/Iik/Ij8iOiImIikrbn1yZXR1cm4gZX0sZGU9ZmU7ZnVuY3Rpb24gdmUoKXt0aGlzLmhhbmRsZXJzPVtdfXZlLnByb3RvdHlwZS51c2U9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB0aGlzLmhhbmRsZXJzLnB1c2goe2Z1bGZpbGxlZDplLHJlamVjdGVkOnQsc3luY2hyb25vdXM6ISFyJiZyLnN5bmNocm9ub3VzLHJ1bldoZW46cj9yLnJ1bldoZW46bnVsbH0pLHRoaXMuaGFuZGxlcnMubGVuZ3RoLTF9LHZlLnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0sdmUucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24oZSl7ZGUuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLChmdW5jdGlvbih0KXtudWxsIT09dCYmZSh0KX0pKX07dmFyIGdlPXZlLHllPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e307ZnVuY3Rpb24gbWUoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiB3ZSgpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9dmFyIGJlPW1lLGtlPXdlO2Z1bmN0aW9uIHhlKGUpe2lmKGJlPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChlLDApO2lmKChiZT09PW1lfHwhYmUpJiZzZXRUaW1lb3V0KXJldHVybiBiZT1zZXRUaW1lb3V0LHNldFRpbWVvdXQoZSwwKTt0cnl7cmV0dXJuIGJlKGUsMCl9Y2F0Y2godCl7dHJ5e3JldHVybiBiZS5jYWxsKG51bGwsZSwwKX1jYXRjaCh0KXtyZXR1cm4gYmUuY2FsbCh0aGlzLGUsMCl9fX0iZnVuY3Rpb24iPT10eXBlb2YgeWUuc2V0VGltZW91dCYmKGJlPXNldFRpbWVvdXQpLCJmdW5jdGlvbiI9PXR5cGVvZiB5ZS5jbGVhclRpbWVvdXQmJihrZT1jbGVhclRpbWVvdXQpO3ZhciBfZSxTZT1bXSxFZT0hMSxUZT0tMTtmdW5jdGlvbiBBZSgpe0VlJiZfZSYmKEVlPSExLF9lLmxlbmd0aD9TZT1fZS5jb25jYXQoU2UpOlRlPS0xLFNlLmxlbmd0aCYmUmUoKSl9ZnVuY3Rpb24gUmUoKXtpZighRWUpe3ZhciBlPXhlKEFlKTtFZT0hMDtmb3IodmFyIHQ9U2UubGVuZ3RoO3Q7KXtmb3IoX2U9U2UsU2U9W107KytUZTx0OylfZSYmX2VbVGVdLnJ1bigpO1RlPS0xLHQ9U2UubGVuZ3RofV9lPW51bGwsRWU9ITEsZnVuY3Rpb24oZSl7aWYoa2U9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChlKTtpZigoa2U9PT13ZXx8IWtlKSYmY2xlYXJUaW1lb3V0KXJldHVybiBrZT1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGUpO3RyeXtrZShlKX1jYXRjaCh0KXt0cnl7cmV0dXJuIGtlLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4ga2UuY2FsbCh0aGlzLGUpfX19KGUpfX1mdW5jdGlvbiBDZShlLHQpe3RoaXMuZnVuPWUsdGhpcy5hcnJheT10fUNlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtmdW5jdGlvbiBQZSgpe312YXIgRGU9UGUsT2U9UGUsSWU9UGUsTGU9UGUsVWU9UGUsSGU9UGUsTWU9UGU7dmFyIGplPXllLnBlcmZvcm1hbmNlfHx7fSxOZT1qZS5ub3d8fGplLm1vek5vd3x8amUubXNOb3d8fGplLm9Ob3d8fGplLndlYmtpdE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07dmFyIHFlPW5ldyBEYXRlO3ZhciBLZT17bmV4dFRpY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgcj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspdFtyLTFdPWFyZ3VtZW50c1tyXTtTZS5wdXNoKG5ldyBDZShlLHQpKSwxIT09U2UubGVuZ3RofHxFZXx8eGUoUmUpfSx0aXRsZToiYnJvd3NlciIsYnJvd3NlcjohMCxlbnY6e30sYXJndjpbXSx2ZXJzaW9uOiIiLHZlcnNpb25zOnt9LG9uOkRlLGFkZExpc3RlbmVyOk9lLG9uY2U6SWUsb2ZmOkxlLHJlbW92ZUxpc3RlbmVyOlVlLHJlbW92ZUFsbExpc3RlbmVyczpIZSxlbWl0Ok1lLGJpbmRpbmc6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxjd2Q6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGNoZGlyOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkIil9LHVtYXNrOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGhydGltZTpmdW5jdGlvbihlKXt2YXIgdD0uMDAxKk5lLmNhbGwoamUpLHI9TWF0aC5mbG9vcih0KSxuPU1hdGguZmxvb3IodCUxKjFlOSk7cmV0dXJuIGUmJihyLT1lWzBdLChuLT1lWzFdKTwwJiYoci0tLG4rPTFlOSkpLFtyLG5dfSxwbGF0Zm9ybToiYnJvd3NlciIscmVsZWFzZTp7fSxjb25maWc6e30sdXB0aW1lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlLXFlKS8xZTN9fSxKZT1LZSxCZT1mZSxGZT1mdW5jdGlvbihlLHQscixuLGEpe3JldHVybiBlLmNvbmZpZz10LHImJihlLmNvZGU9ciksZS5yZXF1ZXN0PW4sZS5yZXNwb25zZT1hLGUuaXNBeGlvc0Vycm9yPSEwLGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX0sZX0sV2U9e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITF9LHplPUZlLFllPWZ1bmN0aW9uKGUsdCxyLG4sYSl7dmFyIGk9bmV3IEVycm9yKGUpO3JldHVybiB6ZShpLHQscixuLGEpfSxHZT1ZZSxWZT1mZSxYZT1WZS5pc1N0YW5kYXJkQnJvd3NlckVudigpP3t3cml0ZTpmdW5jdGlvbihlLHQscixuLGEsaSl7dmFyIG89W107by5wdXNoKGUrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KSksVmUuaXNOdW1iZXIocikmJm8ucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKHIpLnRvR01UU3RyaW5nKCkpLFZlLmlzU3RyaW5nKG4pJiZvLnB1c2goInBhdGg9IituKSxWZS5pc1N0cmluZyhhKSYmby5wdXNoKCJkb21haW49IithKSwhMD09PWkmJm8ucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPW8uam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrZSsiKT0oW147XSopIikpO3JldHVybiB0P2RlY29kZVVSSUNvbXBvbmVudCh0WzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24oZSl7dGhpcy53cml0ZShlLCIiLERhdGUubm93KCktODY0ZTUpfX06e3dyaXRlOmZ1bmN0aW9uKCl7fSxyZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHJlbW92ZTpmdW5jdGlvbigpe319LCRlPWZ1bmN0aW9uKGUpe3JldHVybi9eKFthLXpdW2EtelxkK1wtLl0qOik/XC9cLy9pLnRlc3QoZSl9LFplPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/ZS5yZXBsYWNlKC9cLyskLywiIikrIi8iK3QucmVwbGFjZSgvXlwvKy8sIiIpOmV9LFFlPWZlLGV0PVsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il0sdHQ9ZmUscnQ9dHQuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3ZhciBlLHQ9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBuKGUpe3ZhciBuPWU7cmV0dXJuIHQmJihyLnNldEF0dHJpYnV0ZSgiaHJlZiIsbiksbj1yLmhyZWYpLHIuc2V0QXR0cmlidXRlKCJocmVmIixuKSx7aHJlZjpyLmhyZWYscHJvdG9jb2w6ci5wcm90b2NvbD9yLnByb3RvY29sLnJlcGxhY2UoLzokLywiIik6IiIsaG9zdDpyLmhvc3Qsc2VhcmNoOnIuc2VhcmNoP3Iuc2VhcmNoLnJlcGxhY2UoL15cPy8sIiIpOiIiLGhhc2g6ci5oYXNoP3IuaGFzaC5yZXBsYWNlKC9eIy8sIiIpOiIiLGhvc3RuYW1lOnIuaG9zdG5hbWUscG9ydDpyLnBvcnQscGF0aG5hbWU6Ii8iPT09ci5wYXRobmFtZS5jaGFyQXQoMCk/ci5wYXRobmFtZToiLyIrci5wYXRobmFtZX19cmV0dXJuIGU9bih3aW5kb3cubG9jYXRpb24uaHJlZiksZnVuY3Rpb24odCl7dmFyIHI9dHQuaXNTdHJpbmcodCk/bih0KTp0O3JldHVybiByLnByb3RvY29sPT09ZS5wcm90b2NvbCYmci5ob3N0PT09ZS5ob3N0fX0oKTpmdW5jdGlvbigpe3JldHVybiEwfTtmdW5jdGlvbiBudChlKXt0aGlzLm1lc3NhZ2U9ZX1udC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQ2FuY2VsIisodGhpcy5tZXNzYWdlPyI6ICIrdGhpcy5tZXNzYWdlOiIiKX0sbnQucHJvdG90eXBlLl9fQ0FOQ0VMX189ITA7dmFyIGF0PW50LGl0PWZlLG90PWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztyLnN0YXR1cyYmbiYmIW4oci5zdGF0dXMpP3QoR2UoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIityLnN0YXR1cyxyLmNvbmZpZyxudWxsLHIucmVxdWVzdCxyKSk6ZShyKX0sc3Q9WGUsdXQ9cGUsY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmISRlKHQpP1plKGUsdCk6dH0sZnQ9ZnVuY3Rpb24oZSl7dmFyIHQscixuLGE9e307cmV0dXJuIGU/KFFlLmZvckVhY2goZS5zcGxpdCgiXG4iKSwoZnVuY3Rpb24oZSl7aWYobj1lLmluZGV4T2YoIjoiKSx0PVFlLnRyaW0oZS5zdWJzdHIoMCxuKSkudG9Mb3dlckNhc2UoKSxyPVFlLnRyaW0oZS5zdWJzdHIobisxKSksdCl7aWYoYVt0XSYmZXQuaW5kZXhPZih0KT49MClyZXR1cm47YVt0XT0ic2V0LWNvb2tpZSI9PT10PyhhW3RdP2FbdF06W10pLmNvbmNhdChbcl0pOmFbdF0/YVt0XSsiLCAiK3I6cn19KSksYSk6YX0sbHQ9cnQsaHQ9WWUscHQ9V2UsZHQ9YXQsdnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LHIpe3ZhciBuLGE9ZS5kYXRhLGk9ZS5oZWFkZXJzLG89ZS5yZXNwb25zZVR5cGU7ZnVuY3Rpb24gcygpe2UuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUobiksZS5zaWduYWwmJmUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixuKX1pdC5pc0Zvcm1EYXRhKGEpJiZkZWxldGUgaVsiQ29udGVudC1UeXBlIl07dmFyIHU9bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKGUuYXV0aCl7dmFyIGM9ZS5hdXRoLnVzZXJuYW1lfHwiIixmPWUuYXV0aC5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZS5hdXRoLnBhc3N3b3JkKSk6IiI7aS5BdXRob3JpemF0aW9uPSJCYXNpYyAiK2J0b2EoYysiOiIrZil9dmFyIGw9Y3QoZS5iYXNlVVJMLGUudXJsKTtmdW5jdGlvbiBoKCl7aWYodSl7dmFyIG49ImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiB1P2Z0KHUuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpOm51bGwsYT17ZGF0YTpvJiYidGV4dCIhPT1vJiYianNvbiIhPT1vP3UucmVzcG9uc2U6dS5yZXNwb25zZVRleHQsc3RhdHVzOnUuc3RhdHVzLHN0YXR1c1RleHQ6dS5zdGF0dXNUZXh0LGhlYWRlcnM6bixjb25maWc6ZSxyZXF1ZXN0OnV9O290KChmdW5jdGlvbihlKXt0KGUpLHMoKX0pLChmdW5jdGlvbihlKXtyKGUpLHMoKX0pLGEpLHU9bnVsbH19aWYodS5vcGVuKGUubWV0aG9kLnRvVXBwZXJDYXNlKCksdXQobCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSx1LnRpbWVvdXQ9ZS50aW1lb3V0LCJvbmxvYWRlbmQiaW4gdT91Lm9ubG9hZGVuZD1oOnUub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7dSYmND09PXUucmVhZHlTdGF0ZSYmKDAhPT11LnN0YXR1c3x8dS5yZXNwb25zZVVSTCYmMD09PXUucmVzcG9uc2VVUkwuaW5kZXhPZigiZmlsZToiKSkmJnNldFRpbWVvdXQoaCl9LHUub25hYm9ydD1mdW5jdGlvbigpe3UmJihyKGh0KCJSZXF1ZXN0IGFib3J0ZWQiLGUsIkVDT05OQUJPUlRFRCIsdSkpLHU9bnVsbCl9LHUub25lcnJvcj1mdW5jdGlvbigpe3IoaHQoIk5ldHdvcmsgRXJyb3IiLGUsbnVsbCx1KSksdT1udWxsfSx1Lm9udGltZW91dD1mdW5jdGlvbigpe3ZhciB0PWUudGltZW91dD8idGltZW91dCBvZiAiK2UudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixuPWUudHJhbnNpdGlvbmFsfHxwdDtlLnRpbWVvdXRFcnJvck1lc3NhZ2UmJih0PWUudGltZW91dEVycm9yTWVzc2FnZSkscihodCh0LGUsbi5jbGFyaWZ5VGltZW91dEVycm9yPyJFVElNRURPVVQiOiJFQ09OTkFCT1JURUQiLHUpKSx1PW51bGx9LGl0LmlzU3RhbmRhcmRCcm93c2VyRW52KCkpe3ZhciBwPShlLndpdGhDcmVkZW50aWFsc3x8bHQobCkpJiZlLnhzcmZDb29raWVOYW1lP3N0LnJlYWQoZS54c3JmQ29va2llTmFtZSk6dm9pZCAwO3AmJihpW2UueHNyZkhlYWRlck5hbWVdPXApfSJzZXRSZXF1ZXN0SGVhZGVyImluIHUmJml0LmZvckVhY2goaSwoZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1hJiYiY29udGVudC10eXBlIj09PXQudG9Mb3dlckNhc2UoKT9kZWxldGUgaVt0XTp1LnNldFJlcXVlc3RIZWFkZXIodCxlKX0pKSxpdC5pc1VuZGVmaW5lZChlLndpdGhDcmVkZW50aWFscyl8fCh1LndpdGhDcmVkZW50aWFscz0hIWUud2l0aENyZWRlbnRpYWxzKSxvJiYianNvbiIhPT1vJiYodS5yZXNwb25zZVR5cGU9ZS5yZXNwb25zZVR5cGUpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uRG93bmxvYWRQcm9ncmVzcyYmdS5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vbkRvd25sb2FkUHJvZ3Jlc3MpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uVXBsb2FkUHJvZ3Jlc3MmJnUudXBsb2FkJiZ1LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vblVwbG9hZFByb2dyZXNzKSwoZS5jYW5jZWxUb2tlbnx8ZS5zaWduYWwpJiYobj1mdW5jdGlvbihlKXt1JiYocighZXx8ZSYmZS50eXBlP25ldyBkdCgiY2FuY2VsZWQiKTplKSx1LmFib3J0KCksdT1udWxsKX0sZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi5zdWJzY3JpYmUobiksZS5zaWduYWwmJihlLnNpZ25hbC5hYm9ydGVkP24oKTplLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsbikpKSxhfHwoYT1udWxsKSx1LnNlbmQoYSl9KSl9LGd0PWZlLHl0PWZ1bmN0aW9uKGUsdCl7QmUuZm9yRWFjaChlLChmdW5jdGlvbihyLG4pe24hPT10JiZuLnRvVXBwZXJDYXNlKCk9PT10LnRvVXBwZXJDYXNlKCkmJihlW3RdPXIsZGVsZXRlIGVbbl0pfSkpfSxtdD1GZSx3dD17IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9O2Z1bmN0aW9uIGJ0KGUsdCl7IWd0LmlzVW5kZWZpbmVkKGUpJiZndC5pc1VuZGVmaW5lZChlWyJDb250ZW50LVR5cGUiXSkmJihlWyJDb250ZW50LVR5cGUiXT10KX12YXIga3QseHQ9e3RyYW5zaXRpb25hbDpXZSxhZGFwdGVyOigoInVuZGVmaW5lZCIhPXR5cGVvZiBYTUxIdHRwUmVxdWVzdHx8dm9pZCAwIT09SmUmJiJbb2JqZWN0IHByb2Nlc3NdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChKZSkpJiYoa3Q9dnQpLGt0KSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbihlLHQpe3JldHVybiB5dCh0LCJBY2NlcHQiKSx5dCh0LCJDb250ZW50LVR5cGUiKSxndC5pc0Zvcm1EYXRhKGUpfHxndC5pc0FycmF5QnVmZmVyKGUpfHxndC5pc0J1ZmZlcihlKXx8Z3QuaXNTdHJlYW0oZSl8fGd0LmlzRmlsZShlKXx8Z3QuaXNCbG9iKGUpP2U6Z3QuaXNBcnJheUJ1ZmZlclZpZXcoZSk/ZS5idWZmZXI6Z3QuaXNVUkxTZWFyY2hQYXJhbXMoZSk/KGJ0KHQsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiksZS50b1N0cmluZygpKTpndC5pc09iamVjdChlKXx8dCYmImFwcGxpY2F0aW9uL2pzb24iPT09dFsiQ29udGVudC1UeXBlIl0/KGJ0KHQsImFwcGxpY2F0aW9uL2pzb24iKSxmdW5jdGlvbihlLHQscil7aWYoZ3QuaXNTdHJpbmcoZSkpdHJ5e3JldHVybih0fHxKU09OLnBhcnNlKShlKSxndC50cmltKGUpfWNhdGNoKGUpe2lmKCJTeW50YXhFcnJvciIhPT1lLm5hbWUpdGhyb3cgZX1yZXR1cm4ocnx8SlNPTi5zdHJpbmdpZnkpKGUpfShlKSk6ZX1dLHRyYW5zZm9ybVJlc3BvbnNlOltmdW5jdGlvbihlKXt2YXIgdD10aGlzLnRyYW5zaXRpb25hbHx8eHQudHJhbnNpdGlvbmFsLHI9dCYmdC5zaWxlbnRKU09OUGFyc2luZyxuPXQmJnQuZm9yY2VkSlNPTlBhcnNpbmcsYT0hciYmImpzb24iPT09dGhpcy5yZXNwb25zZVR5cGU7aWYoYXx8biYmZ3QuaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChlKXtpZihhKXtpZigiU3ludGF4RXJyb3IiPT09ZS5uYW1lKXRocm93IG10KGUsdGhpcywiRV9KU09OX1BBUlNFIik7dGhyb3cgZX19cmV0dXJuIGV9XSx0aW1lb3V0OjAseHNyZkNvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLHhzcmZIZWFkZXJOYW1lOiJYLVhTUkYtVE9LRU4iLG1heENvbnRlbnRMZW5ndGg6LTEsbWF4Qm9keUxlbmd0aDotMSx2YWxpZGF0ZVN0YXR1czpmdW5jdGlvbihlKXtyZXR1cm4gZT49MjAwJiZlPDMwMH0saGVhZGVyczp7Y29tbW9uOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiJ9fX07Z3QuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSwoZnVuY3Rpb24oZSl7eHQuaGVhZGVyc1tlXT17fX0pKSxndC5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sKGZ1bmN0aW9uKGUpe3h0LmhlYWRlcnNbZV09Z3QubWVyZ2Uod3QpfSkpO3ZhciBfdD14dCxTdD1mZSxFdD1fdCxUdD1mdW5jdGlvbihlKXtyZXR1cm4hKCFlfHwhZS5fX0NBTkNFTF9fKX0sQXQ9ZmUsUnQ9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXRoaXN8fEV0O3JldHVybiBTdC5mb3JFYWNoKHIsKGZ1bmN0aW9uKHIpe2U9ci5jYWxsKG4sZSx0KX0pKSxlfSxDdD1UdCxQdD1fdCxEdD1hdDtmdW5jdGlvbiBPdChlKXtpZihlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKSxlLnNpZ25hbCYmZS5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgRHQoImNhbmNlbGVkIil9dmFyIEl0PWZlLEx0PWZ1bmN0aW9uKGUsdCl7dD10fHx7fTt2YXIgcj17fTtmdW5jdGlvbiBuKGUsdCl7cmV0dXJuIEl0LmlzUGxhaW5PYmplY3QoZSkmJkl0LmlzUGxhaW5PYmplY3QodCk/SXQubWVyZ2UoZSx0KTpJdC5pc1BsYWluT2JqZWN0KHQpP0l0Lm1lcmdlKHt9LHQpOkl0LmlzQXJyYXkodCk/dC5zbGljZSgpOnR9ZnVuY3Rpb24gYShyKXtyZXR1cm4gSXQuaXNVbmRlZmluZWQodFtyXSk/SXQuaXNVbmRlZmluZWQoZVtyXSk/dm9pZCAwOm4odm9pZCAwLGVbcl0pOm4oZVtyXSx0W3JdKX1mdW5jdGlvbiBpKGUpe2lmKCFJdC5pc1VuZGVmaW5lZCh0W2VdKSlyZXR1cm4gbih2b2lkIDAsdFtlXSl9ZnVuY3Rpb24gbyhyKXtyZXR1cm4gSXQuaXNVbmRlZmluZWQodFtyXSk/SXQuaXNVbmRlZmluZWQoZVtyXSk/dm9pZCAwOm4odm9pZCAwLGVbcl0pOm4odm9pZCAwLHRbcl0pfWZ1bmN0aW9uIHMocil7cmV0dXJuIHIgaW4gdD9uKGVbcl0sdFtyXSk6ciBpbiBlP24odm9pZCAwLGVbcl0pOnZvaWQgMH12YXIgdT17dXJsOmksbWV0aG9kOmksZGF0YTppLGJhc2VVUkw6byx0cmFuc2Zvcm1SZXF1ZXN0Om8sdHJhbnNmb3JtUmVzcG9uc2U6byxwYXJhbXNTZXJpYWxpemVyOm8sdGltZW91dDpvLHRpbWVvdXRNZXNzYWdlOm8sd2l0aENyZWRlbnRpYWxzOm8sYWRhcHRlcjpvLHJlc3BvbnNlVHlwZTpvLHhzcmZDb29raWVOYW1lOm8seHNyZkhlYWRlck5hbWU6byxvblVwbG9hZFByb2dyZXNzOm8sb25Eb3dubG9hZFByb2dyZXNzOm8sZGVjb21wcmVzczpvLG1heENvbnRlbnRMZW5ndGg6byxtYXhCb2R5TGVuZ3RoOm8sdHJhbnNwb3J0Om8saHR0cEFnZW50Om8saHR0cHNBZ2VudDpvLGNhbmNlbFRva2VuOm8sc29ja2V0UGF0aDpvLHJlc3BvbnNlRW5jb2Rpbmc6byx2YWxpZGF0ZVN0YXR1czpzfTtyZXR1cm4gSXQuZm9yRWFjaChPYmplY3Qua2V5cyhlKS5jb25jYXQoT2JqZWN0LmtleXModCkpLChmdW5jdGlvbihlKXt2YXIgdD11W2VdfHxhLG49dChlKTtJdC5pc1VuZGVmaW5lZChuKSYmdCE9PXN8fChyW2VdPW4pfSkpLHJ9LFV0PSIwLjI2LjEiLEh0PVV0LE10PXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSx0KXtNdFtlXT1mdW5jdGlvbihyKXtyZXR1cm4gbihyKT09PWV8fCJhIisodDwxPyJuICI6IiAiKStlfX0pKTt2YXIganQ9e307TXQudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxyKXtmdW5jdGlvbiBuKGUsdCl7cmV0dXJuIltBeGlvcyB2IitIdCsiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK2UrIiciK3QrKHI/Ii4gIityOiIiKX1yZXR1cm4gZnVuY3Rpb24ocixhLGkpe2lmKCExPT09ZSl0aHJvdyBuZXcgRXJyb3IobihhLCIgaGFzIGJlZW4gcmVtb3ZlZCIrKHQ/IiBpbiAiK3Q6IiIpKSk7cmV0dXJuIHQmJiFqdFthXSYmKGp0W2FdPSEwLGNvbnNvbGUud2FybihuKGEsIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksIWV8fGUocixhLGkpfX07dmFyIE50PXthc3NlcnRPcHRpb25zOmZ1bmN0aW9uKGUsdCxyKXtpZigib2JqZWN0IiE9PW4oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2Zvcih2YXIgYT1PYmplY3Qua2V5cyhlKSxpPWEubGVuZ3RoO2ktLSA+MDspe3ZhciBvPWFbaV0scz10W29dO2lmKHMpe3ZhciB1PWVbb10sYz12b2lkIDA9PT11fHxzKHUsbyxlKTtpZighMCE9PWMpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uICIrbysiIG11c3QgYmUgIitjKX1lbHNlIGlmKCEwIT09cil0aHJvdyBFcnJvcigiVW5rbm93biBvcHRpb24gIitvKX19LHZhbGlkYXRvcnM6TXR9LHF0PWZlLEt0PXBlLEp0PWdlLEJ0PWZ1bmN0aW9uKGUpe3JldHVybiBPdChlKSxlLmhlYWRlcnM9ZS5oZWFkZXJzfHx7fSxlLmRhdGE9UnQuY2FsbChlLGUuZGF0YSxlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXF1ZXN0KSxlLmhlYWRlcnM9QXQubWVyZ2UoZS5oZWFkZXJzLmNvbW1vbnx8e30sZS5oZWFkZXJzW2UubWV0aG9kXXx8e30sZS5oZWFkZXJzKSxBdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLChmdW5jdGlvbih0KXtkZWxldGUgZS5oZWFkZXJzW3RdfSkpLChlLmFkYXB0ZXJ8fFB0LmFkYXB0ZXIpKGUpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBPdChlKSx0LmRhdGE9UnQuY2FsbChlLHQuZGF0YSx0LmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSksdH0pLChmdW5jdGlvbih0KXtyZXR1cm4gQ3QodCl8fChPdChlKSx0JiZ0LnJlc3BvbnNlJiYodC5yZXNwb25zZS5kYXRhPVJ0LmNhbGwoZSx0LnJlc3BvbnNlLmRhdGEsdC5yZXNwb25zZS5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpKSksUHJvbWlzZS5yZWplY3QodCl9KSl9LEZ0PUx0LFd0PU50LHp0PVd0LnZhbGlkYXRvcnM7ZnVuY3Rpb24gWXQoZSl7dGhpcy5kZWZhdWx0cz1lLHRoaXMuaW50ZXJjZXB0b3JzPXtyZXF1ZXN0Om5ldyBKdCxyZXNwb25zZTpuZXcgSnR9fVl0LnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKGUsdCl7InN0cmluZyI9PXR5cGVvZiBlPyh0PXR8fHt9KS51cmw9ZTp0PWV8fHt9LCh0PUZ0KHRoaXMuZGVmYXVsdHMsdCkpLm1ldGhvZD90Lm1ldGhvZD10Lm1ldGhvZC50b0xvd2VyQ2FzZSgpOnRoaXMuZGVmYXVsdHMubWV0aG9kP3QubWV0aG9kPXRoaXMuZGVmYXVsdHMubWV0aG9kLnRvTG93ZXJDYXNlKCk6dC5tZXRob2Q9ImdldCI7dmFyIHI9dC50cmFuc2l0aW9uYWw7dm9pZCAwIT09ciYmV3QuYXNzZXJ0T3B0aW9ucyhyLHtzaWxlbnRKU09OUGFyc2luZzp6dC50cmFuc2l0aW9uYWwoenQuYm9vbGVhbiksZm9yY2VkSlNPTlBhcnNpbmc6enQudHJhbnNpdGlvbmFsKHp0LmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6enQudHJhbnNpdGlvbmFsKHp0LmJvb2xlYW4pfSwhMSk7dmFyIG49W10sYT0hMDt0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlLnJ1bldoZW4mJiExPT09ZS5ydW5XaGVuKHQpfHwoYT1hJiZlLnN5bmNocm9ub3VzLG4udW5zaGlmdChlLmZ1bGZpbGxlZCxlLnJlamVjdGVkKSl9KSk7dmFyIGksbz1bXTtpZih0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKChmdW5jdGlvbihlKXtvLnB1c2goZS5mdWxmaWxsZWQsZS5yZWplY3RlZCl9KSksIWEpe3ZhciBzPVtCdCx2b2lkIDBdO2ZvcihBcnJheS5wcm90b3R5cGUudW5zaGlmdC5hcHBseShzLG4pLHM9cy5jb25jYXQobyksaT1Qcm9taXNlLnJlc29sdmUodCk7cy5sZW5ndGg7KWk9aS50aGVuKHMuc2hpZnQoKSxzLnNoaWZ0KCkpO3JldHVybiBpfWZvcih2YXIgdT10O24ubGVuZ3RoOyl7dmFyIGM9bi5zaGlmdCgpLGY9bi5zaGlmdCgpO3RyeXt1PWModSl9Y2F0Y2goZSl7ZihlKTticmVha319dHJ5e2k9QnQodSl9Y2F0Y2goZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfWZvcig7by5sZW5ndGg7KWk9aS50aGVuKG8uc2hpZnQoKSxvLnNoaWZ0KCkpO3JldHVybiBpfSxZdC5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe3JldHVybiBlPUZ0KHRoaXMuZGVmYXVsdHMsZSksS3QoZS51cmwsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKS5yZXBsYWNlKC9eXD8vLCIiKX0scXQuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJvcHRpb25zIl0sKGZ1bmN0aW9uKGUpe1l0LnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LHIpe3JldHVybiB0aGlzLnJlcXVlc3QoRnQocnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6KHJ8fHt9KS5kYXRhfSkpfX0pKSxxdC5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sKGZ1bmN0aW9uKGUpe1l0LnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LHIsbil7cmV0dXJuIHRoaXMucmVxdWVzdChGdChufHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpyfSkpfX0pKTt2YXIgR3Q9WXQsVnQ9YXQ7ZnVuY3Rpb24gWHQoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciB0O3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7dD1lfSkpO3ZhciByPXRoaXM7dGhpcy5wcm9taXNlLnRoZW4oKGZ1bmN0aW9uKGUpe2lmKHIuX2xpc3RlbmVycyl7dmFyIHQsbj1yLl9saXN0ZW5lcnMubGVuZ3RoO2Zvcih0PTA7dDxuO3QrKylyLl9saXN0ZW5lcnNbdF0oZSk7ci5fbGlzdGVuZXJzPW51bGx9fSkpLHRoaXMucHJvbWlzZS50aGVuPWZ1bmN0aW9uKGUpe3ZhciB0LG49bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3Iuc3Vic2NyaWJlKGUpLHQ9ZX0pKS50aGVuKGUpO3JldHVybiBuLmNhbmNlbD1mdW5jdGlvbigpe3IudW5zdWJzY3JpYmUodCl9LG59LGUoKGZ1bmN0aW9uKGUpe3IucmVhc29ufHwoci5yZWFzb249bmV3IFZ0KGUpLHQoci5yZWFzb24pKX0pKX1YdC5wcm90b3R5cGUudGhyb3dJZlJlcXVlc3RlZD1mdW5jdGlvbigpe2lmKHRoaXMucmVhc29uKXRocm93IHRoaXMucmVhc29ufSxYdC5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe3RoaXMucmVhc29uP2UodGhpcy5yZWFzb24pOnRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaChlKTp0aGlzLl9saXN0ZW5lcnM9W2VdfSxYdC5wcm90b3R5cGUudW5zdWJzY3JpYmU9ZnVuY3Rpb24oZSl7aWYodGhpcy5fbGlzdGVuZXJzKXt2YXIgdD10aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihlKTstMSE9PXQmJnRoaXMuX2xpc3RlbmVycy5zcGxpY2UodCwxKX19LFh0LnNvdXJjZT1mdW5jdGlvbigpe3ZhciBlLHQ9bmV3IFh0KChmdW5jdGlvbih0KXtlPXR9KSk7cmV0dXJue3Rva2VuOnQsY2FuY2VsOmV9fTt2YXIgJHQ9WHQsWnQ9ZmUsUXQ9ZmUsZXI9ZWUsdHI9R3QscnI9THQ7dmFyIG5yPWZ1bmN0aW9uIGUodCl7dmFyIHI9bmV3IHRyKHQpLG49ZXIodHIucHJvdG90eXBlLnJlcXVlc3Qscik7cmV0dXJuIFF0LmV4dGVuZChuLHRyLnByb3RvdHlwZSxyKSxRdC5leHRlbmQobixyKSxuLmNyZWF0ZT1mdW5jdGlvbihyKXtyZXR1cm4gZShycih0LHIpKX0sbn0oX3QpO25yLkF4aW9zPXRyLG5yLkNhbmNlbD1hdCxuci5DYW5jZWxUb2tlbj0kdCxuci5pc0NhbmNlbD1UdCxuci5WRVJTSU9OPVV0LG5yLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9LG5yLnNwcmVhZD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuYXBwbHkobnVsbCx0KX19LG5yLmlzQXhpb3NFcnJvcj1mdW5jdGlvbihlKXtyZXR1cm4gWnQuaXNPYmplY3QoZSkmJiEwPT09ZS5pc0F4aW9zRXJyb3J9LFEuZXhwb3J0cz1ucixRLmV4cG9ydHMuZGVmYXVsdD1ucjt2YXIgYXIsaXI9US5leHBvcnRzO3ZhciBvcj1hcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtvKHRoaXMsZSksdGhpcy5hdHRhY2hUb2tlbj1mdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKX0sdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBudWxsfSx0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sdGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBudWxsfSx0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBudWxsfSx0aGlzLmluaXQ9dGhpcy5pbml0LmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrLmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrPXRoaXMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2suYmluZCh0aGlzKX1yZXR1cm4gdShlLFt7a2V5OiJyZXF1ZXN0SGFuZGxlciIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIG4sYTtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLmF0dGFjaFRva2VuKGUpO2Nhc2UgMjpyZXR1cm4obnVsbD09ZT92b2lkIDA6ZS5zaG91bGRFbmNvZGVUb0Zvcm1EYXRhKSYmKG49bnVsbD09ZT92b2lkIDA6ZS5kYXRhLGE9bmV3IEZvcm1EYXRhLE9iamVjdC5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKGUpe2EuYXBwZW5kKGUsbltlXSl9KSksZS5kYXRhPWEpLGUuc3RhcnRUaW1lSW5Ncz0obmV3IERhdGUpLmdldFRpbWUoKSxhci5pc0hhbmRsZXJFbmFibGVkJiZ0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayhlKSx0LmFicnVwdCgicmV0dXJuIixlKTtjYXNlIDY6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImVycm9ySGFuZGxlciIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhyb3cgYXIuaXNIYW5kbGVyRW5hYmxlZCYmKHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrJiZ0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrKGUpLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJnRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrKCkpLGV9fSx7a2V5OiJzdWNjZXNzSGFuZGxlciIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGFyLmlzSGFuZGxlckVuYWJsZWQmJih0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2smJnRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKSx0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiZ0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaygpKSxlfX0se2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0hKGFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdKXx8YXJndW1lbnRzWzBdLHQ9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBuKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDphci5pc0hhbmRsZXJFbmFibGVkPWUsdGhpcy5hdHRhY2hUb2tlbj10O2Nhc2UgMjpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLG4sdGhpcyl9KSkpfX0se2tleToiZW5hYmxlSGFuZGxlciIsdmFsdWU6ZnVuY3Rpb24oKXthci5pc0hhbmRsZXJFbmFibGVkPSEwfX0se2tleToiZGlzYWJsZUhhbmRsZXIiLHZhbHVlOmZ1bmN0aW9uKCl7YXIuaXNIYW5kbGVyRW5hYmxlZD0hMX19LHtrZXk6ImRpc2FibGVIYW5kbGVyV2l0aFRpbWVvdXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOmFyLkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQ7YXIuaXNIYW5kbGVyRW5hYmxlZD0hMSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2FyLmlzSGFuZGxlckVuYWJsZWQ9ITB9KSxlKX19LHtrZXk6InNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjaz1lfX0se2tleToic2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz1lfX0se2tleToic2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrPWV9fSx7a2V5OiJzZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaz1lfX1dLFt7a2V5OiJnZXRJbnN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiB0aGlzLmF4aW9zSW5zdGFuY2V8fCh0aGlzLmF4aW9zSW5zdGFuY2U9aXIuY3JlYXRlKHt3aXRoQ3JlZGVudGlhbHM6ITB9KSx0aGlzLmNsaWVudEluc3RhbmNlfHwodGhpcy5jbGllbnRJbnN0YW5jZT1uZXcgYXIpLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoKGZ1bmN0aW9uKHQpe3JldHVybiBTKGUsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUubmV4dD0yLHRoaXMuY2xpZW50SW5zdGFuY2UucmVxdWVzdEhhbmRsZXIodCk7Y2FzZSAyOnJldHVybiBlLmFicnVwdCgicmV0dXJuIixlLnNlbnQpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsdGhpcyl9KSkpfSkpLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKChmdW5jdGlvbih0KXtyZXR1cm4gZS5jbGllbnRJbnN0YW5jZS5zdWNjZXNzSGFuZGxlcih0KX0pLChmdW5jdGlvbih0KXtyZXR1cm4gZS5jbGllbnRJbnN0YW5jZS5lcnJvckhhbmRsZXIodCl9KSksdGhpcy5heGlvc0luc3RhbmNlLmFsbD1pci5hbGwsdGhpcy5heGlvc0luc3RhbmNlLnNwcmVhZD1pci5zcHJlYWQsdGhpcy5heGlvc0luc3RhbmNlLmluaXQ9dGhpcy5jbGllbnRJbnN0YW5jZS5pbml0LHRoaXMuYXhpb3NJbnN0YW5jZS5lbmFibGVIYW5kbGVyPXRoaXMuY2xpZW50SW5zdGFuY2UuZW5hYmxlSGFuZGxlcix0aGlzLmF4aW9zSW5zdGFuY2UuZGlzYWJsZUhhbmRsZXI9dGhpcy5jbGllbnRJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcix0aGlzLmF4aW9zSW5zdGFuY2UuZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dD10aGlzLmNsaWVudEluc3RhbmNlLmRpc2FibGVIYW5kbGVyV2l0aFRpbWVvdXQsdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayksdGhpcy5heGlvc0luc3RhbmNlfX1dKSxlfSgpO29yLkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQ9MWUzLG9yPWFyPWZ1bmN0aW9uKGUsdCxyLGEpe3ZhciBpLG89YXJndW1lbnRzLmxlbmd0aCxzPW88Mz90Om51bGw9PT1hP2E9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LHIpOmE7aWYoIm9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0PyJ1bmRlZmluZWQiOm4oUmVmbGVjdCkpJiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlzPVJlZmxlY3QuZGVjb3JhdGUoZSx0LHIsYSk7ZWxzZSBmb3IodmFyIHU9ZS5sZW5ndGgtMTt1Pj0wO3UtLSkoaT1lW3VdKSYmKHM9KG88Mz9pKHMpOm8+Mz9pKHQscixzKTppKHQscikpfHxzKTtyZXR1cm4gbz4zJiZzJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLHMpLHN9KFtmdW5jdGlvbihlKXt9XSxvcik7dmFyIHNyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe28odGhpcyxlKSx0aGlzLl9kYXRhPW5ldyBNYXB9cmV0dXJuIHUoZSxbe2tleToic2V0RGF0YSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG4oKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnRoaXMuX2RhdGEuc2V0KGUsdCk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksbix0aGlzKX0pKSl9fSx7a2V5OiJnZXREYXRhIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gYSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6cmV0dXJuIHIuYWJydXB0KCJyZXR1cm4iLG51bGwhPT0obj1udWxsPT09KHQ9dGhpcy5fZGF0YSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuZ2V0KGUpKSYmdm9pZCAwIT09bj9uOiJ7fSIpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGEsdGhpcyl9KSkpfX0se2tleToicmVtb3ZlRGF0YSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDp0aGlzLl9kYXRhLmRlbGV0ZShlKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19XSksZX0oKSx1cj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtvKHRoaXMsZSl9cmV0dXJuIHUoZSxudWxsLFt7a2V5OiJnZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm57YmxvYjoobnVsbD09ZT92b2lkIDA6ZS5kYXRhKWluc3RhbmNlb2YgQmxvYj9udWxsPT1lP3ZvaWQgMDplLmRhdGE6bnVsbCxkYXRhOkpTT04uc3RyaW5naWZ5KG51bGwhPWU/ZToiIiksc3VjY2VzczohMH19fSx7a2V5OiJnZW5lcmF0ZUZhaWx1cmVNZXNzYWdlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4obnVsbD09ZT92b2lkIDA6ZS50b0pTT04pJiZkZWxldGUgZS50b0pTT04se2Vycm9yOkpTT04uc3RyaW5naWZ5KG51bGwhPWU/ZToiIiksc3VjY2VzczohMX19fV0pLGV9KCksY3I9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7byh0aGlzLGUpfXJldHVybiB1KGUsbnVsbCxbe2tleToicmVtb3ZlQXV0aG9yaXphdGlvbkNvZGUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9bG9jYXRpb24uaHJlZjtoaXN0b3J5LnB1c2hTdGF0ZSh7fSxkb2N1bWVudC50aXRsZSxlLnJlcGxhY2UoL1w/Y29kZT0uKiQvLCIiKSl9fSx7a2V5OiJnZXRQS0NFIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gbnVsbCE9PSh0PXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oZSkpJiZ2b2lkIDAhPT10P3Q6IiJ9fSx7a2V5OiJzZXRQS0NFIix2YWx1ZTpmdW5jdGlvbihlLHQpe3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oZSx0KX19LHtrZXk6InNldFNpZ25PdXRVUkwiLHZhbHVlOmZ1bmN0aW9uKGUpe3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oRCxlKX19LHtrZXk6ImdldFNpZ25PdXRVUkwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIG51bGwhPT0oZT1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKEQpKSYmdm9pZCAwIT09ZT9lOiIifX0se2tleToicmVtb3ZlUEtDRSIsdmFsdWU6ZnVuY3Rpb24oZSl7c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShlKX19LHtrZXk6ImNhbkNvbnRpbnVlU2lnbkluIix2YWx1ZTpmdW5jdGlvbih0LHIpe3JldHVybiEodCYmIWUuaGFzRXJyb3JJblVSTCgpJiYhZS5oYXNBdXRoU2VhcmNoUGFyYW1zSW5VUkwoKSYmIXIpfX0se2tleToiaXNJbml0aWFsaXplZFNpbGVudFNpZ25JbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5pc1NpbGVudFN0YXRlUHJlc2VudEluVVJMKCl9fSx7a2V5OiJ3YXNTaWduSW5DYWxsZWQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuISghZS5oYXNFcnJvckluVVJMKCkmJiFlLmhhc0F1dGhTZWFyY2hQYXJhbXNJblVSTCgpfHx0aGlzLmlzU2lsZW50U3RhdGVQcmVzZW50SW5VUkwoKSl9fSx7a2V5OiJ3YXNTaWxlbnRTaWduSW5DYWxsZWQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiaW5pdGlhbGl6ZWQtc2lsZW50LXNpZ24taW4iKSx0PWU/SlNPTi5wYXJzZShlKTpudWxsO3JldHVybiBCb29sZWFuKHQpfX0se2tleToiaXNTaWduT3V0U3VjY2Vzc2Z1bCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXt2YXIgdDtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOmlmKCFKLmlzU2lnbk91dFN1Y2Nlc3NmdWwod2luZG93LmxvY2F0aW9uLmhyZWYpKXtlLm5leHQ9NjticmVha31yZXR1cm4gdD13aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgiPyIpWzBdLGhpc3RvcnkucHVzaFN0YXRlKHt9LGRvY3VtZW50LnRpdGxlLHQpLGUubmV4dD01LEouY2xlYXJVc2VyU2Vzc2lvbkRhdGEoKTtjYXNlIDU6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLCEwKTtjYXNlIDY6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLCExKTtjYXNlIDc6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSl9fSx7a2V5OiJkaWRTaWduT3V0RmFpbCIsdmFsdWU6ZnVuY3Rpb24oKXtpZihKLmRpZFNpZ25PdXRGYWlsKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSl7dmFyIGU9bmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZiksdD1lLnNlYXJjaFBhcmFtcy5nZXQoVykscj1lLnNlYXJjaFBhcmFtcy5nZXQoeiksbj13aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgiPyIpWzBdO3JldHVybiBoaXN0b3J5LnB1c2hTdGF0ZSh7fSxkb2N1bWVudC50aXRsZSxuKSx7ZGVzY3JpcHRpb246bnVsbCE9cj9yOiIiLGVycm9yOm51bGwhPXQ/dDoiIn19cmV0dXJuITF9fSx7a2V5OiJpc1NpbGVudFN0YXRlUHJlc2VudEluVVJMIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLHQ9bmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKTtyZXR1cm4gbnVsbCE9PShlPW51bGw9PXQ/dm9pZCAwOnQuaW5jbHVkZXMoInNpZ24taW4tc2lsZW50bHkiKSkmJnZvaWQgMCE9PWUmJmV9fSx7a2V5OiJoYXNBdXRoU2VhcmNoUGFyYW1zSW5VUkwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOndpbmRvdy5sb2NhdGlvbi5zZWFyY2gsdD0vWz8mXWNvZGU9W14mXSsvO3JldHVybiB0LnRlc3QoZSl9fSx7a2V5OiJoYXNFcnJvckluVVJMIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp3aW5kb3cubG9jYXRpb24uaHJlZix0PW5ldyBVUkwoZSk7cmV0dXJuISF0LnNlYXJjaFBhcmFtcy5nZXQoVykmJnQuc2VhcmNoUGFyYW1zLmdldChHKSE9PU99fSx7a2V5OiJjYW5TZW5kUHJvbXB0Tm9uZVJlcXVlc3QiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShGKTtyZXR1cm4hKGU/SlNPTi5wYXJzZShlKTpudWxsKX19LHtrZXk6InNldFByb21wdE5vbmVSZXF1ZXN0U2VudCIsdmFsdWU6ZnVuY3Rpb24oZSl7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShGLEpTT04uc3RyaW5naWZ5KGUpKX19LHtrZXk6IndhaXRUaWxsUGFnZVJlZGlyZWN0Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXt2YXIgbjtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiBuPW51bGwhPWU/ZTozZTMsdC5uZXh0PTMsbmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3JldHVybiBzZXRUaW1lb3V0KGUsMWUzKm4pfSkpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKX19XSksZX0oKSxmcj1bXSxscj1bXSxocj0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxwcj0hMTtmdW5jdGlvbiBkcigpe3ByPSEwO2Zvcih2YXIgZT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsdD0wLHI9ZS5sZW5ndGg7dDxyOysrdClmclt0XT1lW3RdLGxyW2UuY2hhckNvZGVBdCh0KV09dDtsclsiLSIuY2hhckNvZGVBdCgwKV09NjIsbHJbIl8iLmNoYXJDb2RlQXQoMCldPTYzfWZ1bmN0aW9uIHZyKGUsdCxyKXtmb3IodmFyIG4sYSxpPVtdLG89dDtvPHI7bys9MyluPShlW29dPDwxNikrKGVbbysxXTw8OCkrZVtvKzJdLGkucHVzaChmclsoYT1uKT4+MTgmNjNdK2ZyW2E+PjEyJjYzXStmclthPj42JjYzXStmcls2MyZhXSk7cmV0dXJuIGkuam9pbigiIil9ZnVuY3Rpb24gZ3IoZSl7dmFyIHQ7cHJ8fGRyKCk7Zm9yKHZhciByPWUubGVuZ3RoLG49ciUzLGE9IiIsaT1bXSxvPTE2MzgzLHM9MCx1PXItbjtzPHU7cys9bylpLnB1c2godnIoZSxzLHMrbz51P3U6cytvKSk7cmV0dXJuIDE9PT1uPyh0PWVbci0xXSxhKz1mclt0Pj4yXSxhKz1mclt0PDw0JjYzXSxhKz0iPT0iKToyPT09biYmKHQ9KGVbci0yXTw8OCkrZVtyLTFdLGErPWZyW3Q+PjEwXSxhKz1mclt0Pj40JjYzXSxhKz1mclt0PDwyJjYzXSxhKz0iPSIpLGkucHVzaChhKSxpLmpvaW4oIiIpfWZ1bmN0aW9uIHlyKGUsdCxyLG4sYSl7dmFyIGksbyxzPTgqYS1uLTEsdT0oMTw8cyktMSxjPXU+PjEsZj0tNyxsPXI/YS0xOjAsaD1yPy0xOjEscD1lW3QrbF07Zm9yKGwrPWgsaT1wJigxPDwtZiktMSxwPj49LWYsZis9cztmPjA7aT0yNTYqaStlW3QrbF0sbCs9aCxmLT04KTtmb3Iobz1pJigxPDwtZiktMSxpPj49LWYsZis9bjtmPjA7bz0yNTYqbytlW3QrbF0sbCs9aCxmLT04KTtpZigwPT09aSlpPTEtYztlbHNle2lmKGk9PT11KXJldHVybiBvP05hTjoxLzAqKHA/LTE6MSk7bys9TWF0aC5wb3coMixuKSxpLT1jfXJldHVybihwPy0xOjEpKm8qTWF0aC5wb3coMixpLW4pfWZ1bmN0aW9uIG1yKGUsdCxyLG4sYSxpKXt2YXIgbyxzLHUsYz04KmktYS0xLGY9KDE8PGMpLTEsbD1mPj4xLGg9MjM9PT1hP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxwPW4/MDppLTEsZD1uPzE6LTEsdj10PDB8fDA9PT10JiYxL3Q8MD8xOjA7Zm9yKHQ9TWF0aC5hYnModCksaXNOYU4odCl8fHQ9PT0xLzA/KHM9aXNOYU4odCk/MTowLG89Zik6KG89TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksdCoodT1NYXRoLnBvdygyLC1vKSk8MSYmKG8tLSx1Kj0yKSwodCs9bytsPj0xP2gvdTpoKk1hdGgucG93KDIsMS1sKSkqdT49MiYmKG8rKyx1Lz0yKSxvK2w+PWY/KHM9MCxvPWYpOm8rbD49MT8ocz0odCp1LTEpKk1hdGgucG93KDIsYSksbys9bCk6KHM9dCpNYXRoLnBvdygyLGwtMSkqTWF0aC5wb3coMixhKSxvPTApKTthPj04O2VbcitwXT0yNTUmcyxwKz1kLHMvPTI1NixhLT04KTtmb3Iobz1vPDxhfHMsYys9YTtjPjA7ZVtyK3BdPTI1NSZvLHArPWQsby89MjU2LGMtPTgpO2VbcitwLWRdfD0xMjgqdn12YXIgd3I9e30udG9TdHJpbmcsYnI9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09d3IuY2FsbChlKX07U3IuVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDA9PT15ZS5UWVBFRF9BUlJBWV9TVVBQT1JUfHx5ZS5UWVBFRF9BUlJBWV9TVVBQT1JUO3ZhciBrcj14cigpO2Z1bmN0aW9uIHhyKCl7cmV0dXJuIFNyLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIF9yKGUsdCl7aWYoeHIoKTx0KXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiBTci5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189U3IucHJvdG90eXBlOihudWxsPT09ZSYmKGU9bmV3IFNyKHQpKSxlLmxlbmd0aD10KSxlfWZ1bmN0aW9uIFNyKGUsdCxyKXtpZighKFNyLlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiBTcikpcmV0dXJuIG5ldyBTcihlLHQscik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBBcih0aGlzLGUpfXJldHVybiBFcih0aGlzLGUsdCxyKX1mdW5jdGlvbiBFcihlLHQscixuKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQscixuKXtpZih0LmJ5dGVMZW5ndGgscjwwfHx0LmJ5dGVMZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxyKyhufHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3Q9dm9pZCAwPT09ciYmdm9pZCAwPT09bj9uZXcgVWludDhBcnJheSh0KTp2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KHQscik6bmV3IFVpbnQ4QXJyYXkodCxyLG4pO1NyLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9dCkuX19wcm90b19fPVNyLnByb3RvdHlwZTplPVJyKGUsdCk7cmV0dXJuIGV9KGUsdCxyLG4pOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQscil7InN0cmluZyI9PXR5cGVvZiByJiYiIiE9PXJ8fChyPSJ1dGY4Iik7aWYoIVNyLmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIG49MHxEcih0LHIpLGE9KGU9X3IoZSxuKSkud3JpdGUodCxyKTthIT09biYmKGU9ZS5zbGljZSgwLGEpKTtyZXR1cm4gZX0oZSx0LHIpOmZ1bmN0aW9uKGUsdCl7aWYoUHIodCkpe3ZhciByPTB8Q3IodC5sZW5ndGgpO3JldHVybiAwPT09KGU9X3IoZSxyKSkubGVuZ3RofHx0LmNvcHkoZSwwLDAsciksZX1pZih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIHQpcmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8KG49dC5sZW5ndGgpIT1uP19yKGUsMCk6UnIoZSx0KTtpZigiQnVmZmVyIj09PXQudHlwZSYmYnIodC5kYXRhKSlyZXR1cm4gUnIoZSx0LmRhdGEpfXZhciBuO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0oZSx0KX1mdW5jdGlvbiBUcihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIEFyKGUsdCl7aWYoVHIodCksZT1fcihlLHQ8MD8wOjB8Q3IodCkpLCFTci5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgcj0wO3I8dDsrK3IpZVtyXT0wO3JldHVybiBlfWZ1bmN0aW9uIFJyKGUsdCl7dmFyIHI9dC5sZW5ndGg8MD8wOjB8Q3IodC5sZW5ndGgpO2U9X3IoZSxyKTtmb3IodmFyIG49MDtuPHI7bis9MSllW25dPTI1NSZ0W25dO3JldHVybiBlfWZ1bmN0aW9uIENyKGUpe2lmKGU+PXhyKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK3hyKCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHxlfWZ1bmN0aW9uIFByKGUpe3JldHVybiEobnVsbD09ZXx8IWUuX2lzQnVmZmVyKX1mdW5jdGlvbiBEcihlLHQpe2lmKFByKGUpKXJldHVybiBlLmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpfHxlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiBlLmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiBlJiYoZT0iIitlKTt2YXIgcj1lLmxlbmd0aDtpZigwPT09cilyZXR1cm4gMDtmb3IodmFyIG49ITE7Oylzd2l0Y2godCl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gcjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBhbihlKS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKnI7Y2FzZSJoZXgiOnJldHVybiByPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIG9uKGUpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuIGFuKGUpLmxlbmd0aDt0PSgiIit0KS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIE9yKGUsdCxyKXt2YXIgbj0hMTtpZigodm9pZCAwPT09dHx8dDwwKSYmKHQ9MCksdD50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09cnx8cj50aGlzLmxlbmd0aCkmJihyPXRoaXMubGVuZ3RoKSxyPD0wKXJldHVybiIiO2lmKChyPj4+PTApPD0odD4+Pj0wKSlyZXR1cm4iIjtmb3IoZXx8KGU9InV0ZjgiKTs7KXN3aXRjaChlKXtjYXNlImhleCI6cmV0dXJuIFlyKHRoaXMsdCxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBCcih0aGlzLHQscik7Y2FzZSJhc2NpaSI6cmV0dXJuIFdyKHRoaXMsdCxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiB6cih0aGlzLHQscik7Y2FzZSJiYXNlNjQiOnJldHVybiBKcih0aGlzLHQscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBHcih0aGlzLHQscik7ZGVmYXVsdDppZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrZSk7ZT0oZSsiIikudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBJcihlLHQscil7dmFyIG49ZVt0XTtlW3RdPWVbcl0sZVtyXT1ufWZ1bmN0aW9uIExyKGUsdCxyLG4sYSl7aWYoMD09PWUubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygcj8obj1yLHI9MCk6cj4yMTQ3NDgzNjQ3P3I9MjE0NzQ4MzY0NzpyPC0yMTQ3NDgzNjQ4JiYocj0tMjE0NzQ4MzY0OCkscj0rcixpc05hTihyKSYmKHI9YT8wOmUubGVuZ3RoLTEpLHI8MCYmKHI9ZS5sZW5ndGgrcikscj49ZS5sZW5ndGgpe2lmKGEpcmV0dXJuLTE7cj1lLmxlbmd0aC0xfWVsc2UgaWYocjwwKXtpZighYSlyZXR1cm4tMTtyPTB9aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD1Tci5mcm9tKHQsbikpLFByKHQpKXJldHVybiAwPT09dC5sZW5ndGg/LTE6VXIoZSx0LHIsbixhKTtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQmPTI1NSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9hP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChlLHQscik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChlLHQscik6VXIoZSxbdF0scixuLGEpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIFVyKGUsdCxyLG4sYSl7dmFyIGksbz0xLHM9ZS5sZW5ndGgsdT10Lmxlbmd0aDtpZih2b2lkIDAhPT1uJiYoInVjczIiPT09KG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09bnx8InV0ZjE2bGUiPT09bnx8InV0Zi0xNmxlIj09PW4pKXtpZihlLmxlbmd0aDwyfHx0Lmxlbmd0aDwyKXJldHVybi0xO289MixzLz0yLHUvPTIsci89Mn1mdW5jdGlvbiBjKGUsdCl7cmV0dXJuIDE9PT1vP2VbdF06ZS5yZWFkVUludDE2QkUodCpvKX1pZihhKXt2YXIgZj0tMTtmb3IoaT1yO2k8cztpKyspaWYoYyhlLGkpPT09Yyh0LC0xPT09Zj8wOmktZikpe2lmKC0xPT09ZiYmKGY9aSksaS1mKzE9PT11KXJldHVybiBmKm99ZWxzZS0xIT09ZiYmKGktPWktZiksZj0tMX1lbHNlIGZvcihyK3U+cyYmKHI9cy11KSxpPXI7aT49MDtpLS0pe2Zvcih2YXIgbD0hMCxoPTA7aDx1O2grKylpZihjKGUsaStoKSE9PWModCxoKSl7bD0hMTticmVha31pZihsKXJldHVybiBpfXJldHVybi0xfWZ1bmN0aW9uIEhyKGUsdCxyLG4pe3I9TnVtYmVyKHIpfHwwO3ZhciBhPWUubGVuZ3RoLXI7bj8obj1OdW1iZXIobikpPmEmJihuPWEpOm49YTt2YXIgaT10Lmxlbmd0aDtpZihpJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7bj5pLzImJihuPWkvMik7Zm9yKHZhciBvPTA7bzxuOysrbyl7dmFyIHM9cGFyc2VJbnQodC5zdWJzdHIoMipvLDIpLDE2KTtpZihpc05hTihzKSlyZXR1cm4gbztlW3Irb109c31yZXR1cm4gb31mdW5jdGlvbiBNcihlLHQscixuKXtyZXR1cm4gc24oYW4odCxlLmxlbmd0aC1yKSxlLHIsbil9ZnVuY3Rpb24ganIoZSx0LHIsbil7cmV0dXJuIHNuKGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxyPTA7cjxlLmxlbmd0aDsrK3IpdC5wdXNoKDI1NSZlLmNoYXJDb2RlQXQocikpO3JldHVybiB0fSh0KSxlLHIsbil9ZnVuY3Rpb24gTnIoZSx0LHIsbil7cmV0dXJuIGpyKGUsdCxyLG4pfWZ1bmN0aW9uIHFyKGUsdCxyLG4pe3JldHVybiBzbihvbih0KSxlLHIsbil9ZnVuY3Rpb24gS3IoZSx0LHIsbil7cmV0dXJuIHNuKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByLG4sYSxpPVtdLG89MDtvPGUubGVuZ3RoJiYhKCh0LT0yKTwwKTsrK28pbj0ocj1lLmNoYXJDb2RlQXQobykpPj44LGE9ciUyNTYsaS5wdXNoKGEpLGkucHVzaChuKTtyZXR1cm4gaX0odCxlLmxlbmd0aC1yKSxlLHIsbil9ZnVuY3Rpb24gSnIoZSx0LHIpe3JldHVybiAwPT09dCYmcj09PWUubGVuZ3RoP2dyKGUpOmdyKGUuc2xpY2UodCxyKSl9ZnVuY3Rpb24gQnIoZSx0LHIpe3I9TWF0aC5taW4oZS5sZW5ndGgscik7Zm9yKHZhciBuPVtdLGE9dDthPHI7KXt2YXIgaSxvLHMsdSxjPWVbYV0sZj1udWxsLGw9Yz4yMzk/NDpjPjIyMz8zOmM+MTkxPzI6MTtpZihhK2w8PXIpc3dpdGNoKGwpe2Nhc2UgMTpjPDEyOCYmKGY9Yyk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYoaT1lW2ErMV0pKSYmKHU9KDMxJmMpPDw2fDYzJmkpPjEyNyYmKGY9dSk7YnJlYWs7Y2FzZSAzOmk9ZVthKzFdLG89ZVthKzJdLDEyOD09KDE5MiZpKSYmMTI4PT0oMTkyJm8pJiYodT0oMTUmYyk8PDEyfCg2MyZpKTw8Nnw2MyZvKT4yMDQ3JiYodTw1NTI5Nnx8dT41NzM0MykmJihmPXUpO2JyZWFrO2Nhc2UgNDppPWVbYSsxXSxvPWVbYSsyXSxzPWVbYSszXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYodT0oMTUmYyk8PDE4fCg2MyZpKTw8MTJ8KDYzJm8pPDw2fDYzJnMpPjY1NTM1JiZ1PDExMTQxMTImJihmPXUpfW51bGw9PT1mPyhmPTY1NTMzLGw9MSk6Zj42NTUzNSYmKGYtPTY1NTM2LG4ucHVzaChmPj4+MTAmMTAyM3w1NTI5NiksZj01NjMyMHwxMDIzJmYpLG4ucHVzaChmKSxhKz1sfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtpZih0PD1GcilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZSk7dmFyIHI9IiIsbj0wO2Zvcig7bjx0OylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlLnNsaWNlKG4sbis9RnIpKTtyZXR1cm4gcn0obil9U3IucG9vbFNpemU9ODE5MixTci5fYXVnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX189U3IucHJvdG90eXBlLGV9LFNyLmZyb209ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBFcihudWxsLGUsdCxyKX0sU3IuVFlQRURfQVJSQVlfU1VQUE9SVCYmKFNyLnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsU3IuX19wcm90b19fPVVpbnQ4QXJyYXkpLFNyLmFsbG9jPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIFRyKHQpLHQ8PTA/X3IoZSx0KTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj9fcihlLHQpLmZpbGwocixuKTpfcihlLHQpLmZpbGwocik6X3IoZSx0KX0obnVsbCxlLHQscil9LFNyLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe3JldHVybiBBcihudWxsLGUpfSxTci5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIEFyKG51bGwsZSl9LFNyLmlzQnVmZmVyPXVuLFNyLmNvbXBhcmU9ZnVuY3Rpb24oZSx0KXtpZighUHIoZSl8fCFQcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYoZT09PXQpcmV0dXJuIDA7Zm9yKHZhciByPWUubGVuZ3RoLG49dC5sZW5ndGgsYT0wLGk9TWF0aC5taW4ocixuKTthPGk7KythKWlmKGVbYV0hPT10W2FdKXtyPWVbYV0sbj10W2FdO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0sU3IuaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sU3IuY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIWJyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIFNyLmFsbG9jKDApO3ZhciByO2lmKHZvaWQgMD09PXQpZm9yKHQ9MCxyPTA7cjxlLmxlbmd0aDsrK3IpdCs9ZVtyXS5sZW5ndGg7dmFyIG49U3IuYWxsb2NVbnNhZmUodCksYT0wO2ZvcihyPTA7cjxlLmxlbmd0aDsrK3Ipe3ZhciBpPWVbcl07aWYoIVByKGkpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpLmNvcHkobixhKSxhKz1pLmxlbmd0aH1yZXR1cm4gbn0sU3IuYnl0ZUxlbmd0aD1EcixTci5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLFNyLnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTIpSXIodGhpcyx0LHQrMSk7cmV0dXJuIHRoaXN9LFNyLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTQpSXIodGhpcyx0LHQrMyksSXIodGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc30sU3IucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9OClJcih0aGlzLHQsdCs3KSxJcih0aGlzLHQrMSx0KzYpLElyKHRoaXMsdCsyLHQrNSksSXIodGhpcyx0KzMsdCs0KTtyZXR1cm4gdGhpc30sU3IucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PWU/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/QnIodGhpcywwLGUpOk9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sU3IucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighUHIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09ZXx8MD09PVNyLmNvbXBhcmUodGhpcyxlKX0sU3IucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgZT0iIjtyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKGU9dGhpcy50b1N0cmluZygiaGV4IiwwLDUwKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+NTAmJihlKz0iIC4uLiAiKSksIjxCdWZmZXIgIitlKyI+In0sU3IucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LHIsbixhKXtpZighUHIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PXImJihyPWU/ZS5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09YSYmKGE9dGhpcy5sZW5ndGgpLHQ8MHx8cj5lLmxlbmd0aHx8bjwwfHxhPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1hJiZ0Pj1yKXJldHVybiAwO2lmKG4+PWEpcmV0dXJuLTE7aWYodD49cilyZXR1cm4gMTtpZih0aGlzPT09ZSlyZXR1cm4gMDtmb3IodmFyIGk9KGE+Pj49MCktKG4+Pj49MCksbz0ocj4+Pj0wKS0odD4+Pj0wKSxzPU1hdGgubWluKGksbyksdT10aGlzLnNsaWNlKG4sYSksYz1lLnNsaWNlKHQsciksZj0wO2Y8czsrK2YpaWYodVtmXSE9PWNbZl0pe2k9dVtmXSxvPWNbZl07YnJlYWt9cmV0dXJuIGk8bz8tMTpvPGk/MTowfSxTci5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24oZSx0LHIpe3JldHVybi0xIT09dGhpcy5pbmRleE9mKGUsdCxyKX0sU3IucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBMcih0aGlzLGUsdCxyLCEwKX0sU3IucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gTHIodGhpcyxlLHQsciwhMSl9LFNyLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQscixuKXtpZih2b2lkIDA9PT10KW49InV0ZjgiLHI9dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYodm9pZCAwPT09ciYmInN0cmluZyI9PXR5cGVvZiB0KW49dCxyPXRoaXMubGVuZ3RoLHQ9MDtlbHNle2lmKCFpc0Zpbml0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7dHw9MCxpc0Zpbml0ZShyKT8ocnw9MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgYT10aGlzLmxlbmd0aC10O2lmKCh2b2lkIDA9PT1yfHxyPmEpJiYocj1hKSxlLmxlbmd0aD4wJiYocjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBpPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gSHIodGhpcyxlLHQscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gTXIodGhpcyxlLHQscik7Y2FzZSJhc2NpaSI6cmV0dXJuIGpyKHRoaXMsZSx0LHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIE5yKHRoaXMsZSx0LHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gcXIodGhpcyxlLHQscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBLcih0aGlzLGUsdCxyKTtkZWZhdWx0OmlmKGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLGk9ITB9fSxTci5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgRnI9NDA5NjtmdW5jdGlvbiBXcihlLHQscil7dmFyIG49IiI7cj1NYXRoLm1pbihlLmxlbmd0aCxyKTtmb3IodmFyIGE9dDthPHI7KythKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JmVbYV0pO3JldHVybiBufWZ1bmN0aW9uIHpyKGUsdCxyKXt2YXIgbj0iIjtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgYT10O2E8cjsrK2Epbis9U3RyaW5nLmZyb21DaGFyQ29kZShlW2FdKTtyZXR1cm4gbn1mdW5jdGlvbiBZcihlLHQscil7dmFyIG49ZS5sZW5ndGg7KCF0fHx0PDApJiYodD0wKSwoIXJ8fHI8MHx8cj5uKSYmKHI9bik7Zm9yKHZhciBhPSIiLGk9dDtpPHI7KytpKWErPW5uKGVbaV0pO3JldHVybiBhfWZ1bmN0aW9uIEdyKGUsdCxyKXtmb3IodmFyIG49ZS5zbGljZSh0LHIpLGE9IiIsaT0wO2k8bi5sZW5ndGg7aSs9MilhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG5baV0rMjU2Km5baSsxXSk7cmV0dXJuIGF9ZnVuY3Rpb24gVnIoZSx0LHIpe2lmKGUlMSE9MHx8ZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZihlK3Q+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIFhyKGUsdCxyLG4sYSxpKXtpZighUHIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKHQ+YXx8dDxpKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihyK24+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uICRyKGUsdCxyLG4pe3Q8MCYmKHQ9NjU1MzUrdCsxKTtmb3IodmFyIGE9MCxpPU1hdGgubWluKGUubGVuZ3RoLXIsMik7YTxpOysrYSllW3IrYV09KHQmMjU1PDw4KihuP2E6MS1hKSk+Pj44KihuP2E6MS1hKX1mdW5jdGlvbiBacihlLHQscixuKXt0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKTtmb3IodmFyIGE9MCxpPU1hdGgubWluKGUubGVuZ3RoLXIsNCk7YTxpOysrYSllW3IrYV09dD4+PjgqKG4/YTozLWEpJjI1NX1mdW5jdGlvbiBRcihlLHQscixuLGEsaSl7aWYocituPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIGVuKGUsdCxyLG4sYSl7cmV0dXJuIGF8fFFyKGUsMCxyLDQpLG1yKGUsdCxyLG4sMjMsNCkscis0fWZ1bmN0aW9uIHRuKGUsdCxyLG4sYSl7cmV0dXJuIGF8fFFyKGUsMCxyLDgpLG1yKGUsdCxyLG4sNTIsOCkscis4fVNyLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe3ZhciByLG49dGhpcy5sZW5ndGg7aWYoKGU9fn5lKTwwPyhlKz1uKTwwJiYoZT0wKTplPm4mJihlPW4pLCh0PXZvaWQgMD09PXQ/bjp+fnQpPDA/KHQrPW4pPDAmJih0PTApOnQ+biYmKHQ9biksdDxlJiYodD1lKSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUKShyPXRoaXMuc3ViYXJyYXkoZSx0KSkuX19wcm90b19fPVNyLnByb3RvdHlwZTtlbHNle3ZhciBhPXQtZTtyPW5ldyBTcihhLHZvaWQgMCk7Zm9yKHZhciBpPTA7aTxhOysraSlyW2ldPXRoaXNbaStlXX1yZXR1cm4gcn0sU3IucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxWcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW2VdLGE9MSxpPTA7KytpPHQmJihhKj0yNTYpOyluKz10aGlzW2UraV0qYTtyZXR1cm4gbn0sU3IucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxWcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW2UrLS10XSxhPTE7dD4wJiYoYSo9MjU2KTspbis9dGhpc1tlKy0tdF0qYTtyZXR1cm4gbn0sU3IucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxWcihlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV19LFNyLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8VnIoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OH0sU3IucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxWcihlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDh8dGhpc1tlKzFdfSxTci5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFZyKGUsNCx0aGlzLmxlbmd0aCksKHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbZSszXX0sU3IucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxWcihlLDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbZV0rKHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXSl9LFNyLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxWcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW2VdLGE9MSxpPTA7KytpPHQmJihhKj0yNTYpOyluKz10aGlzW2UraV0qYTtyZXR1cm4gbj49KGEqPTEyOCkmJihuLT1NYXRoLnBvdygyLDgqdCkpLG59LFNyLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxWcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10LGE9MSxpPXRoaXNbZSstLW5dO24+MCYmKGEqPTI1Nik7KWkrPXRoaXNbZSstLW5dKmE7cmV0dXJuIGk+PShhKj0xMjgpJiYoaS09TWF0aC5wb3coMiw4KnQpKSxpfSxTci5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8VnIoZSwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1tlXT8tMSooMjU1LXRoaXNbZV0rMSk6dGhpc1tlXX0sU3IucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7dHx8VnIoZSwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW2VdfHRoaXNbZSsxXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sU3IucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7dHx8VnIoZSwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW2UrMV18dGhpc1tlXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sU3IucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFZyKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNnx0aGlzW2UrM108PDI0fSxTci5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8VnIoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdPDwyNHx0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM119LFNyLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxWcihlLDQsdGhpcy5sZW5ndGgpLHlyKHRoaXMsZSwhMCwyMyw0KX0sU3IucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFZyKGUsNCx0aGlzLmxlbmd0aCkseXIodGhpcyxlLCExLDIzLDQpfSxTci5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFZyKGUsOCx0aGlzLmxlbmd0aCkseXIodGhpcyxlLCEwLDUyLDgpfSxTci5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFZyKGUsOCx0aGlzLmxlbmd0aCkseXIodGhpcyxlLCExLDUyLDgpfSxTci5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24oZSx0LHIsbil7KGU9K2UsdHw9MCxyfD0wLG4pfHxYcih0aGlzLGUsdCxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBhPTEsaT0wO2Zvcih0aGlzW3RdPTI1NSZlOysraTxyJiYoYSo9MjU2KTspdGhpc1t0K2ldPWUvYSYyNTU7cmV0dXJuIHQrcn0sU3IucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKGUsdCxyLG4peyhlPStlLHR8PTAscnw9MCxuKXx8WHIodGhpcyxlLHQscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgYT1yLTEsaT0xO2Zvcih0aGlzW3QrYV09MjU1JmU7LS1hPj0wJiYoaSo9MjU2KTspdGhpc1t0K2FdPWUvaSYyNTU7cmV0dXJuIHQrcn0sU3IucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8WHIodGhpcyxlLHQsMSwyNTUsMCksU3IuVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksdGhpc1t0XT0yNTUmZSx0KzF9LFNyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fFhyKHRoaXMsZSx0LDIsNjU1MzUsMCksU3IuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgpOiRyKHRoaXMsZSx0LCEwKSx0KzJ9LFNyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fFhyKHRoaXMsZSx0LDIsNjU1MzUsMCksU3IuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOiRyKHRoaXMsZSx0LCExKSx0KzJ9LFNyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fFhyKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3QrM109ZT4+PjI0LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdF09MjU1JmUpOlpyKHRoaXMsZSx0LCEwKSx0KzR9LFNyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fFhyKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOlpyKHRoaXMsZSx0LCExKSx0KzR9LFNyLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKGU9K2UsdHw9MCwhbil7dmFyIGE9TWF0aC5wb3coMiw4KnItMSk7WHIodGhpcyxlLHQscixhLTEsLWEpfXZhciBpPTAsbz0xLHM9MDtmb3IodGhpc1t0XT0yNTUmZTsrK2k8ciYmKG8qPTI1Nik7KWU8MCYmMD09PXMmJjAhPT10aGlzW3QraS0xXSYmKHM9MSksdGhpc1t0K2ldPShlL28+PjApLXMmMjU1O3JldHVybiB0K3J9LFNyLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKGU9K2UsdHw9MCwhbil7dmFyIGE9TWF0aC5wb3coMiw4KnItMSk7WHIodGhpcyxlLHQscixhLTEsLWEpfXZhciBpPXItMSxvPTEscz0wO2Zvcih0aGlzW3QraV09MjU1JmU7LS1pPj0wJiYobyo9MjU2KTspZTwwJiYwPT09cyYmMCE9PXRoaXNbdCtpKzFdJiYocz0xKSx0aGlzW3QraV09KGUvbz4+MCktcyYyNTU7cmV0dXJuIHQrcn0sU3IucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxYcih0aGlzLGUsdCwxLDEyNywtMTI4KSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSxlPDAmJihlPTI1NStlKzEpLHRoaXNbdF09MjU1JmUsdCsxfSxTci5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fFhyKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6JHIodGhpcyxlLHQsITApLHQrMn0sU3IucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxYcih0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksU3IuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOiRyKHRoaXMsZSx0LCExKSx0KzJ9LFNyLnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8WHIodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOlpyKHRoaXMsZSx0LCEwKSx0KzR9LFNyLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8WHIodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSxTci5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOlpyKHRoaXMsZSx0LCExKSx0KzR9LFNyLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlbih0aGlzLGUsdCwhMCxyKX0sU3IucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGVuKHRoaXMsZSx0LCExLHIpfSxTci5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIHRuKHRoaXMsZSx0LCEwLHIpfSxTci5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIHRuKHRoaXMsZSx0LCExLHIpfSxTci5wcm90b3R5cGUuY29weT1mdW5jdGlvbihlLHQscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLHQ+PWUubGVuZ3RoJiYodD1lLmxlbmd0aCksdHx8KHQ9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT1lLmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLGUubGVuZ3RoLXQ8bi1yJiYobj1lLmxlbmd0aC10K3IpO3ZhciBhLGk9bi1yO2lmKHRoaXM9PT1lJiZyPHQmJnQ8bilmb3IoYT1pLTE7YT49MDstLWEpZVthK3RdPXRoaXNbYStyXTtlbHNlIGlmKGk8MWUzfHwhU3IuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoYT0wO2E8aTsrK2EpZVthK3RdPXRoaXNbYStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShyLHIraSksdCk7cmV0dXJuIGl9LFNyLnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0PyhuPXQsdD0wLHI9dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgciYmKG49cixyPXRoaXMubGVuZ3RoKSwxPT09ZS5sZW5ndGgpe3ZhciBhPWUuY2hhckNvZGVBdCgwKTthPDI1NiYmKGU9YSl9aWYodm9pZCAwIT09biYmInN0cmluZyIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIG4mJiFTci5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgZSYmKGUmPTI1NSk7aWYodDwwfHx0aGlzLmxlbmd0aDx0fHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD10KXJldHVybiB0aGlzO3ZhciBpO2lmKHQ+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsZXx8KGU9MCksIm51bWJlciI9PXR5cGVvZiBlKWZvcihpPXQ7aTxyOysraSl0aGlzW2ldPWU7ZWxzZXt2YXIgbz1QcihlKT9lOmFuKG5ldyBTcihlLG4pLnRvU3RyaW5nKCkpLHM9by5sZW5ndGg7Zm9yKGk9MDtpPHItdDsrK2kpdGhpc1tpK3RdPW9baSVzXX1yZXR1cm4gdGhpc307dmFyIHJuPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIG5uKGUpe3JldHVybiBlPDE2PyIwIitlLnRvU3RyaW5nKDE2KTplLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBhbihlLHQpe3ZhciByO3Q9dHx8MS8wO2Zvcih2YXIgbj1lLmxlbmd0aCxhPW51bGwsaT1bXSxvPTA7bzxuOysrbyl7aWYoKHI9ZS5jaGFyQ29kZUF0KG8pKT41NTI5NSYmcjw1NzM0NCl7aWYoIWEpe2lmKHI+NTYzMTkpeyh0LT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihvKzE9PT1uKXsodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9YT1yO2NvbnRpbnVlfWlmKHI8NTYzMjApeyh0LT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KSxhPXI7Y29udGludWV9cj02NTUzNisoYS01NTI5Njw8MTB8ci01NjMyMCl9ZWxzZSBhJiYodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7aWYoYT1udWxsLHI8MTI4KXtpZigodC09MSk8MClicmVhaztpLnB1c2gocil9ZWxzZSBpZihyPDIwNDgpe2lmKCh0LT0yKTwwKWJyZWFrO2kucHVzaChyPj42fDE5Miw2MyZyfDEyOCl9ZWxzZSBpZihyPDY1NTM2KXtpZigodC09Myk8MClicmVhaztpLnB1c2gocj4+MTJ8MjI0LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX1lbHNle2lmKCEocjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKCh0LT00KTwwKWJyZWFrO2kucHVzaChyPj4xOHwyNDAscj4+MTImNjN8MTI4LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX19cmV0dXJuIGl9ZnVuY3Rpb24gb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0LHIsbixhLGksbztwcnx8ZHIoKTt2YXIgcz1lLmxlbmd0aDtpZihzJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTtpPSI9Ij09PWVbcy0yXT8yOiI9Ij09PWVbcy0xXT8xOjAsbz1uZXcgaHIoMypzLzQtaSksbj1pPjA/cy00OnM7dmFyIHU9MDtmb3IodD0wLHI9MDt0PG47dCs9NCxyKz0zKWE9bHJbZS5jaGFyQ29kZUF0KHQpXTw8MTh8bHJbZS5jaGFyQ29kZUF0KHQrMSldPDwxMnxscltlLmNoYXJDb2RlQXQodCsyKV08PDZ8bHJbZS5jaGFyQ29kZUF0KHQrMyldLG9bdSsrXT1hPj4xNiYyNTUsb1t1KytdPWE+PjgmMjU1LG9bdSsrXT0yNTUmYTtyZXR1cm4gMj09PWk/KGE9bHJbZS5jaGFyQ29kZUF0KHQpXTw8MnxscltlLmNoYXJDb2RlQXQodCsxKV0+PjQsb1t1KytdPTI1NSZhKToxPT09aSYmKGE9bHJbZS5jaGFyQ29kZUF0KHQpXTw8MTB8bHJbZS5jaGFyQ29kZUF0KHQrMSldPDw0fGxyW2UuY2hhckNvZGVBdCh0KzIpXT4+MixvW3UrK109YT4+OCYyNTUsb1t1KytdPTI1NSZhKSxvfShmdW5jdGlvbihlKXtpZigoZT1mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfShlKS5yZXBsYWNlKHJuLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDtlLmxlbmd0aCU0IT0wOyllKz0iPSI7cmV0dXJuIGV9KGUpKX1mdW5jdGlvbiBzbihlLHQscixuKXtmb3IodmFyIGE9MDthPG4mJiEoYStyPj10Lmxlbmd0aHx8YT49ZS5sZW5ndGgpOysrYSl0W2Ercl09ZVthXTtyZXR1cm4gYX1mdW5jdGlvbiB1bihlKXtyZXR1cm4gbnVsbCE9ZSYmKCEhZS5faXNCdWZmZXJ8fGNuKGUpfHxmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZS5yZWFkRmxvYXRMRSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc2xpY2UmJmNuKGUuc2xpY2UoMCwwKSl9KGUpKX1mdW5jdGlvbiBjbihlKXtyZXR1cm4hIWUuY29uc3RydWN0b3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfXZhciBmbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxCdWZmZXI6U3IsSU5TUEVDVF9NQVhfQllURVM6NTAsU2xvd0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4rZSE9ZSYmKGU9MCksU3IuYWxsb2MoK2UpfSxpc0J1ZmZlcjp1bixrTWF4TGVuZ3RoOmtyfSksbG49e2V4cG9ydHM6e319LGhuPXt9LHBuPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShwbiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSkscG4uZGVmYXVsdD1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aCxyPXQlNDtpZighcilyZXR1cm4gZTt2YXIgbj10LGE9NC1yLGk9dCthLG89U3IuYWxsb2MoaSk7Zm9yKG8ud3JpdGUoZSk7YS0tOylvLndyaXRlKCI9IixuKyspO3JldHVybiBvLnRvU3RyaW5nKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGRuPXBuO2Z1bmN0aW9uIHZuKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSJ1dGY4IiksU3IuaXNCdWZmZXIoZSk/eW4oZS50b1N0cmluZygiYmFzZTY0IikpOnluKFNyLmZyb20oZSx0KS50b1N0cmluZygiYmFzZTY0IikpfWZ1bmN0aW9uIGduKGUpe3JldHVybiBlPWUudG9TdHJpbmcoKSxkbi5kZWZhdWx0KGUpLnJlcGxhY2UoL1wtL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKX1mdW5jdGlvbiB5bihlKXtyZXR1cm4gZS5yZXBsYWNlKC89L2csIiIpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIil9dmFyIG1uLHduPXZuO3duLmVuY29kZT12bix3bi5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9InV0ZjgiKSxTci5mcm9tKGduKGUpLCJiYXNlNjQiKS50b1N0cmluZyh0KX0sd24udG9CYXNlNjQ9Z24sd24uZnJvbUJhc2U2ND15bix3bi50b0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4gU3IuZnJvbShnbihlKSwiYmFzZTY0Iil9LGhuLmRlZmF1bHQ9d24sKG1uPWxuKS5leHBvcnRzPWhuLmRlZmF1bHQsbW4uZXhwb3J0cy5kZWZhdWx0PW1uLmV4cG9ydHM7dmFyIGJuPWxuLmV4cG9ydHMsa249e2V4cG9ydHM6e319OyFmdW5jdGlvbihlKXshZnVuY3Rpb24odCxyKXt2YXIgbj17fTshZnVuY3Rpb24oZSl7ZS5fX2VzTW9kdWxlPSEwLGUuZGlnZXN0TGVuZ3RoPTMyLGUuYmxvY2tTaXplPTY0O3ZhciB0PW5ldyBVaW50MzJBcnJheShbMTExNjM1MjQwOCwxODk5NDQ3NDQxLDMwNDkzMjM0NzEsMzkyMTAwOTU3Myw5NjE5ODcxNjMsMTUwODk3MDk5MywyNDUzNjM1NzQ4LDI4NzA3NjMyMjEsMzYyNDM4MTA4MCwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwyMTYyMDc4MjA2LDI2MTQ4ODgxMDMsMzI0ODIyMjU4MCwzODM1MzkwNDAxLDQwMjIyMjQ3NzQsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsMjU1NDIyMDg4MiwyODIxODM0MzQ5LDI5NTI5OTY4MDgsMzIxMDMxMzY3MSwzMzM2NTcxODkxLDM1ODQ1Mjg3MTEsMTEzOTI2OTkzLDMzODI0MTg5NSw2NjYzMDcyMDUsNzczNTI5OTEyLDEyOTQ3NTczNzIsMTM5NjE4MjI5MSwxNjk1MTgzNzAwLDE5ODY2NjEwNTEsMjE3NzAyNjM1MCwyNDU2OTU2MDM3LDI3MzA0ODU5MjEsMjgyMDMwMjQxMSwzMjU5NzMwODAwLDMzNDU3NjQ3NzEsMzUxNjA2NTgxNywzNjAwMzUyODA0LDQwOTQ1NzE5MDksMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LDIyMjc3MzA0NTIsMjM2MTg1MjQyNCwyNDI4NDM2NDc0LDI3NTY3MzQxODcsMzIwNDAzMTQ3OSwzMzI5MzI1Mjk4XSk7ZnVuY3Rpb24gcihlLHIsbixhLGkpe2Zvcih2YXIgbyxzLHUsYyxmLGwsaCxwLGQsdixnLHksbTtpPj02NDspe2ZvcihvPXJbMF0scz1yWzFdLHU9clsyXSxjPXJbM10sZj1yWzRdLGw9cls1XSxoPXJbNl0scD1yWzddLHY9MDt2PDE2O3YrKylnPWErNCp2LGVbdl09KDI1NSZuW2ddKTw8MjR8KDI1NSZuW2crMV0pPDwxNnwoMjU1Jm5bZysyXSk8PDh8MjU1Jm5bZyszXTtmb3Iodj0xNjt2PDY0O3YrKyl5PSgoZD1lW3YtMl0pPj4+MTd8ZDw8MTUpXihkPj4+MTl8ZDw8MTMpXmQ+Pj4xMCxtPSgoZD1lW3YtMTVdKT4+Pjd8ZDw8MjUpXihkPj4+MTh8ZDw8MTQpXmQ+Pj4zLGVbdl09KHkrZVt2LTddfDApKyhtK2Vbdi0xNl18MCk7Zm9yKHY9MDt2PDY0O3YrKyl5PSgoKGY+Pj42fGY8PDI2KV4oZj4+PjExfGY8PDIxKV4oZj4+PjI1fGY8PDcpKSsoZiZsXn5mJmgpfDApKyhwKyh0W3ZdK2Vbdl18MCl8MCl8MCxtPSgobz4+PjJ8bzw8MzApXihvPj4+MTN8bzw8MTkpXihvPj4+MjJ8bzw8MTApKSsobyZzXm8mdV5zJnUpfDAscD1oLGg9bCxsPWYsZj1jK3l8MCxjPXUsdT1zLHM9byxvPXkrbXwwO3JbMF0rPW8sclsxXSs9cyxyWzJdKz11LHJbM10rPWMscls0XSs9ZixyWzVdKz1sLHJbNl0rPWgscls3XSs9cCxhKz02NCxpLT02NH1yZXR1cm4gYX12YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLmRpZ2VzdExlbmd0aD1lLmRpZ2VzdExlbmd0aCx0aGlzLmJsb2NrU2l6ZT1lLmJsb2NrU2l6ZSx0aGlzLnN0YXRlPW5ldyBJbnQzMkFycmF5KDgpLHRoaXMudGVtcD1uZXcgSW50MzJBcnJheSg2NCksdGhpcy5idWZmZXI9bmV3IFVpbnQ4QXJyYXkoMTI4KSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExLHRoaXMucmVzZXQoKX1yZXR1cm4gdC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0ZVswXT0xNzc5MDMzNzAzLHRoaXMuc3RhdGVbMV09MzE0NDEzNDI3Nyx0aGlzLnN0YXRlWzJdPTEwMTM5MDQyNDIsdGhpcy5zdGF0ZVszXT0yNzczNDgwNzYyLHRoaXMuc3RhdGVbNF09MTM1OTg5MzExOSx0aGlzLnN0YXRlWzVdPTI2MDA4MjI5MjQsdGhpcy5zdGF0ZVs2XT01Mjg3MzQ2MzUsdGhpcy5zdGF0ZVs3XT0xNTQxNDU5MjI1LHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITEsdGhpc30sdC5wcm90b3R5cGUuY2xlYW49ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuYnVmZmVyLmxlbmd0aDtlKyspdGhpcy5idWZmZXJbZV09MDtmb3IoZT0wO2U8dGhpcy50ZW1wLmxlbmd0aDtlKyspdGhpcy50ZW1wW2VdPTA7dGhpcy5yZXNldCgpfSx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10JiYodD1lLmxlbmd0aCksdGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIlNIQTI1NjogY2FuJ3QgdXBkYXRlIGJlY2F1c2UgaGFzaCB3YXMgZmluaXNoZWQuIik7dmFyIG49MDtpZih0aGlzLmJ5dGVzSGFzaGVkKz10LHRoaXMuYnVmZmVyTGVuZ3RoPjApe2Zvcig7dGhpcy5idWZmZXJMZW5ndGg8NjQmJnQ+MDspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK109ZVtuKytdLHQtLTs2ND09PXRoaXMuYnVmZmVyTGVuZ3RoJiYocih0aGlzLnRlbXAsdGhpcy5zdGF0ZSx0aGlzLmJ1ZmZlciwwLDY0KSx0aGlzLmJ1ZmZlckxlbmd0aD0wKX1mb3IodD49NjQmJihuPXIodGhpcy50ZW1wLHRoaXMuc3RhdGUsZSxuLHQpLHQlPTY0KTt0PjA7KXRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdPWVbbisrXSx0LS07cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbihlKXtpZighdGhpcy5maW5pc2hlZCl7dmFyIHQ9dGhpcy5ieXRlc0hhc2hlZCxuPXRoaXMuYnVmZmVyTGVuZ3RoLGE9dC81MzY4NzA5MTJ8MCxpPXQ8PDMsbz10JTY0PDU2PzY0OjEyODt0aGlzLmJ1ZmZlcltuXT0xMjg7Zm9yKHZhciBzPW4rMTtzPG8tODtzKyspdGhpcy5idWZmZXJbc109MDt0aGlzLmJ1ZmZlcltvLThdPWE+Pj4yNCYyNTUsdGhpcy5idWZmZXJbby03XT1hPj4+MTYmMjU1LHRoaXMuYnVmZmVyW28tNl09YT4+PjgmMjU1LHRoaXMuYnVmZmVyW28tNV09YT4+PjAmMjU1LHRoaXMuYnVmZmVyW28tNF09aT4+PjI0JjI1NSx0aGlzLmJ1ZmZlcltvLTNdPWk+Pj4xNiYyNTUsdGhpcy5idWZmZXJbby0yXT1pPj4+OCYyNTUsdGhpcy5idWZmZXJbby0xXT1pPj4+MCYyNTUscih0aGlzLnRlbXAsdGhpcy5zdGF0ZSx0aGlzLmJ1ZmZlciwwLG8pLHRoaXMuZmluaXNoZWQ9ITB9Zm9yKHM9MDtzPDg7cysrKWVbNCpzKzBdPXRoaXMuc3RhdGVbc10+Pj4yNCYyNTUsZVs0KnMrMV09dGhpcy5zdGF0ZVtzXT4+PjE2JjI1NSxlWzQqcysyXT10aGlzLnN0YXRlW3NdPj4+OCYyNTUsZVs0KnMrM109dGhpcy5zdGF0ZVtzXT4+PjAmMjU1O3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgVWludDhBcnJheSh0aGlzLmRpZ2VzdExlbmd0aCk7cmV0dXJuIHRoaXMuZmluaXNoKGUpLGV9LHQucHJvdG90eXBlLl9zYXZlU3RhdGU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDx0aGlzLnN0YXRlLmxlbmd0aDt0KyspZVt0XT10aGlzLnN0YXRlW3RdfSx0LnByb3RvdHlwZS5fcmVzdG9yZVN0YXRlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPTA7cjx0aGlzLnN0YXRlLmxlbmd0aDtyKyspdGhpcy5zdGF0ZVtyXT1lW3JdO3RoaXMuYnl0ZXNIYXNoZWQ9dCx0aGlzLmZpbmlzaGVkPSExLHRoaXMuYnVmZmVyTGVuZ3RoPTB9LHR9KCk7ZS5IYXNoPW47dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMuaW5uZXI9bmV3IG4sdGhpcy5vdXRlcj1uZXcgbix0aGlzLmJsb2NrU2l6ZT10aGlzLmlubmVyLmJsb2NrU2l6ZSx0aGlzLmRpZ2VzdExlbmd0aD10aGlzLmlubmVyLmRpZ2VzdExlbmd0aDt2YXIgdD1uZXcgVWludDhBcnJheSh0aGlzLmJsb2NrU2l6ZSk7aWYoZS5sZW5ndGg+dGhpcy5ibG9ja1NpemUpKG5ldyBuKS51cGRhdGUoZSkuZmluaXNoKHQpLmNsZWFuKCk7ZWxzZSBmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl0W3JdPWVbcl07Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdXj01NDt0aGlzLmlubmVyLnVwZGF0ZSh0KTtmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXRbcl1ePTEwNjt0aGlzLm91dGVyLnVwZGF0ZSh0KSx0aGlzLmlzdGF0ZT1uZXcgVWludDMyQXJyYXkoOCksdGhpcy5vc3RhdGU9bmV3IFVpbnQzMkFycmF5KDgpLHRoaXMuaW5uZXIuX3NhdmVTdGF0ZSh0aGlzLmlzdGF0ZSksdGhpcy5vdXRlci5fc2F2ZVN0YXRlKHRoaXMub3N0YXRlKTtmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXRbcl09MH1yZXR1cm4gZS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbm5lci5fcmVzdG9yZVN0YXRlKHRoaXMuaXN0YXRlLHRoaXMuaW5uZXIuYmxvY2tTaXplKSx0aGlzLm91dGVyLl9yZXN0b3JlU3RhdGUodGhpcy5vc3RhdGUsdGhpcy5vdXRlci5ibG9ja1NpemUpLHRoaXN9LGUucHJvdG90eXBlLmNsZWFuPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmlzdGF0ZS5sZW5ndGg7ZSsrKXRoaXMub3N0YXRlW2VdPXRoaXMuaXN0YXRlW2VdPTA7dGhpcy5pbm5lci5jbGVhbigpLHRoaXMub3V0ZXIuY2xlYW4oKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmlubmVyLnVwZGF0ZShlKSx0aGlzfSxlLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3V0ZXIuZmluaXNoZWQ/dGhpcy5vdXRlci5maW5pc2goZSk6KHRoaXMuaW5uZXIuZmluaXNoKGUpLHRoaXMub3V0ZXIudXBkYXRlKGUsdGhpcy5kaWdlc3RMZW5ndGgpLmZpbmlzaChlKSksdGhpc30sZS5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodGhpcy5kaWdlc3RMZW5ndGgpO3JldHVybiB0aGlzLmZpbmlzaChlKSxlfSxlfSgpO2Z1bmN0aW9uIGkoZSl7dmFyIHQ9KG5ldyBuKS51cGRhdGUoZSkscj10LmRpZ2VzdCgpO3JldHVybiB0LmNsZWFuKCkscn1mdW5jdGlvbiBvKGUsdCl7dmFyIHI9bmV3IGEoZSkudXBkYXRlKHQpLG49ci5kaWdlc3QoKTtyZXR1cm4gci5jbGVhbigpLG59ZnVuY3Rpb24gcyhlLHQscixuKXt2YXIgYT1uWzBdO2lmKDA9PT1hKXRocm93IG5ldyBFcnJvcigiaGtkZjogY2Fubm90IGV4cGFuZCBtb3JlIik7dC5yZXNldCgpLGE+MSYmdC51cGRhdGUoZSksciYmdC51cGRhdGUociksdC51cGRhdGUobiksdC5maW5pc2goZSksblswXSsrfWUuSE1BQz1hLGUuaGFzaD1pLGUuZGVmYXVsdD1pLGUuaG1hYz1vO3ZhciB1PW5ldyBVaW50OEFycmF5KGUuZGlnZXN0TGVuZ3RoKTtmdW5jdGlvbiBjKGUsdCxyLG4pe3ZvaWQgMD09PXQmJih0PXUpLHZvaWQgMD09PW4mJihuPTMyKTtmb3IodmFyIGk9bmV3IFVpbnQ4QXJyYXkoWzFdKSxjPW8odCxlKSxmPW5ldyBhKGMpLGw9bmV3IFVpbnQ4QXJyYXkoZi5kaWdlc3RMZW5ndGgpLGg9bC5sZW5ndGgscD1uZXcgVWludDhBcnJheShuKSxkPTA7ZDxuO2QrKyloPT09bC5sZW5ndGgmJihzKGwsZixyLGkpLGg9MCkscFtkXT1sW2grK107cmV0dXJuIGYuY2xlYW4oKSxsLmZpbGwoMCksaS5maWxsKDApLHB9ZnVuY3Rpb24gZihlLHQscixuKXtmb3IodmFyIGk9bmV3IGEoZSksbz1pLmRpZ2VzdExlbmd0aCxzPW5ldyBVaW50OEFycmF5KDQpLHU9bmV3IFVpbnQ4QXJyYXkobyksYz1uZXcgVWludDhBcnJheShvKSxmPW5ldyBVaW50OEFycmF5KG4pLGw9MDtsKm88bjtsKyspe3ZhciBoPWwrMTtzWzBdPWg+Pj4yNCYyNTUsc1sxXT1oPj4+MTYmMjU1LHNbMl09aD4+PjgmMjU1LHNbM109aD4+PjAmMjU1LGkucmVzZXQoKSxpLnVwZGF0ZSh0KSxpLnVwZGF0ZShzKSxpLmZpbmlzaChjKTtmb3IodmFyIHA9MDtwPG87cCsrKXVbcF09Y1twXTtmb3IocD0yO3A8PXI7cCsrKXtpLnJlc2V0KCksaS51cGRhdGUoYykuZmluaXNoKGMpO2Zvcih2YXIgZD0wO2Q8bztkKyspdVtkXV49Y1tkXX1mb3IocD0wO3A8byYmbCpvK3A8bjtwKyspZltsKm8rcF09dVtwXX1mb3IobD0wO2w8bztsKyspdVtsXT1jW2xdPTA7Zm9yKGw9MDtsPDQ7bCsrKXNbbF09MDtyZXR1cm4gaS5jbGVhbigpLGZ9ZS5oa2RmPWMsZS5wYmtkZjI9Zn0obik7dmFyIGE9bi5kZWZhdWx0O2Zvcih2YXIgaSBpbiBuKWFbaV09bltpXTtlLmV4cG9ydHM9YX0oKX0oa24pO3ZhciB4bj0kKGtuLmV4cG9ydHMpLF9uPWNyeXB0byxTbj1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIENyeXB0b0tleX0sRW49bmV3IFRleHRFbmNvZGVyLFRuPW5ldyBUZXh0RGVjb2RlcjtmdW5jdGlvbiBBbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLHI9MDtyPGU7cisrKXRbcl09YXJndW1lbnRzW3JdO3ZhciBuPXQucmVkdWNlKChmdW5jdGlvbihlLHQpe3JldHVybiBlK3QubGVuZ3RofSksMCksYT1uZXcgVWludDhBcnJheShuKSxpPTA7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24oZSl7YS5zZXQoZSxpKSxpKz1lLmxlbmd0aH0pKSxhfXZhciBSbj1mdW5jdGlvbihlKXt2YXIgdD1lO3QgaW5zdGFuY2VvZiBVaW50OEFycmF5JiYodD1Ubi5kZWNvZGUodCkpLHQ9dC5yZXBsYWNlKC8tL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKS5yZXBsYWNlKC9ccy9nLCIiKTt0cnl7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1hdG9iKGUpLHI9bmV3IFVpbnQ4QXJyYXkodC5sZW5ndGgpLG49MDtuPHQubGVuZ3RoO24rKylyW25dPXQuY2hhckNvZGVBdChuKTtyZXR1cm4gcn0odCl9Y2F0Y2goZSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGlucHV0IHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLiIpfX0sQ249ZnVuY3Rpb24oZSl7ZihyLGUpO3ZhciB0PW0ocik7ZnVuY3Rpb24gcihlKXt2YXIgbixhO3JldHVybiBvKHRoaXMsciksKG49dC5jYWxsKHRoaXMsZSkpLmNvZGU9IkVSUl9KT1NFX0dFTkVSSUMiLG4ubmFtZT1uLmNvbnN0cnVjdG9yLm5hbWUsbnVsbD09PShhPUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKXx8dm9pZCAwPT09YXx8YS5jYWxsKEVycm9yLGcobiksbi5jb25zdHJ1Y3Rvciksbn1yZXR1cm4gdShyLG51bGwsW3trZXk6ImNvZGUiLGdldDpmdW5jdGlvbigpe3JldHVybiJFUlJfSk9TRV9HRU5FUklDIn19XSkscn0odihFcnJvcikpLFBuPWZ1bmN0aW9uKGUpe2YocixlKTt2YXIgdD1tKHIpO2Z1bmN0aW9uIHIoZSl7dmFyIG4sYT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06InVuc3BlY2lmaWVkIixpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXToidW5zcGVjaWZpZWQiO3JldHVybiBvKHRoaXMsciksKG49dC5jYWxsKHRoaXMsZSkpLmNvZGU9IkVSUl9KV1RfQ0xBSU1fVkFMSURBVElPTl9GQUlMRUQiLG4uY2xhaW09YSxuLnJlYXNvbj1pLG59cmV0dXJuIHUocixudWxsLFt7a2V5OiJjb2RlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iRVJSX0pXVF9DTEFJTV9WQUxJREFUSU9OX0ZBSUxFRCJ9fV0pLHJ9KENuKSxEbj1mdW5jdGlvbihlKXtmKHIsZSk7dmFyIHQ9bShyKTtmdW5jdGlvbiByKGUpe3ZhciBuLGE9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiJ1bnNwZWNpZmllZCIsaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06InVuc3BlY2lmaWVkIjtyZXR1cm4gbyh0aGlzLHIpLChuPXQuY2FsbCh0aGlzLGUpKS5jb2RlPSJFUlJfSldUX0VYUElSRUQiLG4uY2xhaW09YSxuLnJlYXNvbj1pLG59cmV0dXJuIHUocixudWxsLFt7a2V5OiJjb2RlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iRVJSX0pXVF9FWFBJUkVEIn19XSkscn0oQ24pLE9uPWZ1bmN0aW9uKGUpe2YocixlKTt2YXIgdD1tKHIpO2Z1bmN0aW9uIHIoKXt2YXIgZTtyZXR1cm4gbyh0aGlzLHIpLChlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpKS5jb2RlPSJFUlJfSk9TRV9BTEdfTk9UX0FMTE9XRUQiLGV9cmV0dXJuIHUocixudWxsLFt7a2V5OiJjb2RlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iRVJSX0pPU0VfQUxHX05PVF9BTExPV0VEIn19XSkscn0oQ24pLEluPWZ1bmN0aW9uKGUpe2YocixlKTt2YXIgdD1tKHIpO2Z1bmN0aW9uIHIoKXt2YXIgZTtyZXR1cm4gbyh0aGlzLHIpLChlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpKS5jb2RlPSJFUlJfSk9TRV9OT1RfU1VQUE9SVEVEIixlfXJldHVybiB1KHIsbnVsbCxbe2tleToiY29kZSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIkVSUl9KT1NFX05PVF9TVVBQT1JURUQifX1dKSxyfShDbiksTG49ZnVuY3Rpb24oZSl7ZihyLGUpO3ZhciB0PW0ocik7ZnVuY3Rpb24gcigpe3ZhciBlO3JldHVybiBvKHRoaXMsciksKGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cykpLmNvZGU9IkVSUl9KV1NfSU5WQUxJRCIsZX1yZXR1cm4gdShyLG51bGwsW3trZXk6ImNvZGUiLGdldDpmdW5jdGlvbigpe3JldHVybiJFUlJfSldTX0lOVkFMSUQifX1dKSxyfShDbiksVW49ZnVuY3Rpb24oZSl7ZihyLGUpO3ZhciB0PW0ocik7ZnVuY3Rpb24gcigpe3ZhciBlO3JldHVybiBvKHRoaXMsciksKGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cykpLmNvZGU9IkVSUl9KV1RfSU5WQUxJRCIsZX1yZXR1cm4gdShyLG51bGwsW3trZXk6ImNvZGUiLGdldDpmdW5jdGlvbigpe3JldHVybiJFUlJfSldUX0lOVkFMSUQifX1dKSxyfShDbiksSG49ZnVuY3Rpb24oZSl7ZihyLGUpO3ZhciB0PW0ocik7ZnVuY3Rpb24gcigpe3ZhciBlO3JldHVybiBvKHRoaXMsciksKGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cykpLmNvZGU9IkVSUl9KV0tTX0lOVkFMSUQiLGV9cmV0dXJuIHUocixudWxsLFt7a2V5OiJjb2RlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iRVJSX0pXS1NfSU5WQUxJRCJ9fV0pLHJ9KENuKSxNbj1mdW5jdGlvbihlKXtmKHIsZSk7dmFyIHQ9bShyKTtmdW5jdGlvbiByKCl7dmFyIGU7cmV0dXJuIG8odGhpcyxyKSwoZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkuY29kZT0iRVJSX0pXS1NfTk9fTUFUQ0hJTkdfS0VZIixlLm1lc3NhZ2U9Im5vIGFwcGxpY2FibGUga2V5IGZvdW5kIGluIHRoZSBKU09OIFdlYiBLZXkgU2V0IixlfXJldHVybiB1KHIsbnVsbCxbe2tleToiY29kZSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIkVSUl9KV0tTX05PX01BVENISU5HX0tFWSJ9fV0pLHJ9KENuKSxqbj1mdW5jdGlvbihlKXtmKHIsZSk7dmFyIHQ9bShyKTtmdW5jdGlvbiByKCl7dmFyIGU7cmV0dXJuIG8odGhpcyxyKSwoZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkuY29kZT0iRVJSX0pXS1NfTVVMVElQTEVfTUFUQ0hJTkdfS0VZUyIsZS5tZXNzYWdlPSJtdWx0aXBsZSBtYXRjaGluZyBrZXlzIGZvdW5kIGluIHRoZSBKU09OIFdlYiBLZXkgU2V0IixlfXJldHVybiB1KHIsbnVsbCxbe2tleToiY29kZSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIkVSUl9KV0tTX01VTFRJUExFX01BVENISU5HX0tFWVMifX1dKSxyfShDbiksTm49ZnVuY3Rpb24oZSl7ZihyLGUpO3ZhciB0PW0ocik7ZnVuY3Rpb24gcigpe3ZhciBlO3JldHVybiBvKHRoaXMsciksKGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cykpLmNvZGU9IkVSUl9KV1NfU0lHTkFUVVJFX1ZFUklGSUNBVElPTl9GQUlMRUQiLGUubWVzc2FnZT0ic2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQiLGV9cmV0dXJuIHUocixudWxsLFt7a2V5OiJjb2RlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iRVJSX0pXU19TSUdOQVRVUkVfVkVSSUZJQ0FUSU9OX0ZBSUxFRCJ9fV0pLHJ9KENuKTtmdW5jdGlvbiBxbigpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBXZWJTb2NrZXRQYWlyfWZ1bmN0aW9uIEtuKCl7dHJ5e3JldHVybiB2b2lkIDAhPT1KZS52ZXJzaW9ucy5ub2RlfWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiBKbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06ImFsZ29yaXRobS5uYW1lIjtyZXR1cm4gbmV3IFR5cGVFcnJvcigiQ3J5cHRvS2V5IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24sIGl0cyAiLmNvbmNhdCh0LCIgbXVzdCBiZSAiKS5jb25jYXQoZSkpfWZ1bmN0aW9uIEJuKGUsdCl7cmV0dXJuIGUubmFtZT09PXR9ZnVuY3Rpb24gRm4oZSl7cmV0dXJuIHBhcnNlSW50KGUubmFtZS5zbGljZSg0KSwxMCl9ZnVuY3Rpb24gV24oZSl7c3dpdGNoKGUpe2Nhc2UiRVMyNTYiOnJldHVybiJQLTI1NiI7Y2FzZSJFUzM4NCI6cmV0dXJuIlAtMzg0IjtjYXNlIkVTNTEyIjpyZXR1cm4iUC01MjEiO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bnJlYWNoYWJsZSIpfX1mdW5jdGlvbiB6bihlLHQpe2lmKHQubGVuZ3RoJiYhdC5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gZS51c2FnZXMuaW5jbHVkZXModCl9KSkpe3ZhciByPSJDcnlwdG9LZXkgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbiwgaXRzIHVzYWdlcyBtdXN0IGluY2x1ZGUgIjtpZih0Lmxlbmd0aD4yKXt2YXIgbj10LnBvcCgpO3IrPSJvbmUgb2YgIi5jb25jYXQodC5qb2luKCIsICIpLCIsIG9yICIpLmNvbmNhdChuLCIuIil9ZWxzZSAyPT09dC5sZW5ndGg/cis9Im9uZSBvZiAiLmNvbmNhdCh0WzBdLCIgb3IgIikuY29uY2F0KHRbMV0sIi4iKTpyKz0iIi5jb25jYXQodFswXSwiLiIpO3Rocm93IG5ldyBUeXBlRXJyb3Iocil9fXZhciBZbj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9IktleSBtdXN0IGJlICIscj1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KHI+MT9yLTE6MCksaT0xO2k8cjtpKyspYVtpLTFdPWFyZ3VtZW50c1tpXTtpZihhLmxlbmd0aD4yKXt2YXIgbz1hLnBvcCgpO3QrPSJvbmUgb2YgdHlwZSAiLmNvbmNhdChhLmpvaW4oIiwgIiksIiwgb3IgIikuY29uY2F0KG8sIi4iKX1lbHNlIDI9PT1hLmxlbmd0aD90Kz0ib25lIG9mIHR5cGUgIi5jb25jYXQoYVswXSwiIG9yICIpLmNvbmNhdChhWzFdLCIuIik6dCs9Im9mIHR5cGUgIi5jb25jYXQoYVswXSwiLiIpO3JldHVybiBudWxsPT1lP3QrPSIgUmVjZWl2ZWQgIi5jb25jYXQoZSk6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUubmFtZT90Kz0iIFJlY2VpdmVkIGZ1bmN0aW9uICIuY29uY2F0KGUubmFtZSk6Im9iamVjdCI9PT1uKGUpJiZudWxsIT1lJiZlLmNvbnN0cnVjdG9yJiZlLmNvbnN0cnVjdG9yLm5hbWUmJih0Kz0iIFJlY2VpdmVkIGFuIGluc3RhbmNlIG9mICIuY29uY2F0KGUuY29uc3RydWN0b3IubmFtZSkpLHR9LEduPWZ1bmN0aW9uKGUpe3JldHVybiBTbihlKX0sVm49WyJDcnlwdG9LZXkiXSxYbj1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLHI9MDtyPGU7cisrKXRbcl09YXJndW1lbnRzW3JdO3ZhciBuLGE9dC5maWx0ZXIoQm9vbGVhbik7aWYoMD09PWEubGVuZ3RofHwxPT09YS5sZW5ndGgpcmV0dXJuITA7dmFyIGksbz1fKGEpO3RyeXtmb3Ioby5zKCk7IShpPW8ubigpKS5kb25lOyl7dmFyIHM9aS52YWx1ZSx1PU9iamVjdC5rZXlzKHMpO2lmKG4mJjAhPT1uLnNpemUpZm9yKHZhciBjPTAsZj11O2M8Zi5sZW5ndGg7YysrKXt2YXIgbD1mW2NdO2lmKG4uaGFzKGwpKXJldHVybiExO24uYWRkKGwpfWVsc2Ugbj1uZXcgU2V0KHUpfX1jYXRjaChlKXtvLmUoZSl9ZmluYWxseXtvLmYoKX1yZXR1cm4hMH07ZnVuY3Rpb24gJG4oZSl7aWYoIm9iamVjdCIhPT1uKHQ9ZSl8fG51bGw9PT10fHwiW29iamVjdCBPYmplY3RdIiE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSlyZXR1cm4hMTt2YXIgdDtpZihudWxsPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKXJldHVybiEwO2Zvcih2YXIgcj1lO251bGwhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7KXI9T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpO3JldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1yfXZhciBabj1mdW5jdGlvbihlLHQpe2lmKGUuc3RhcnRzV2l0aCgiUlMiKXx8ZS5zdGFydHNXaXRoKCJQUyIpKXt2YXIgcj10LmFsZ29yaXRobS5tb2R1bHVzTGVuZ3RoO2lmKCJudW1iZXIiIT10eXBlb2Ygcnx8cjwyMDQ4KXRocm93IG5ldyBUeXBlRXJyb3IoIiIuY29uY2F0KGUsIiByZXF1aXJlcyBrZXkgbW9kdWx1c0xlbmd0aCB0byBiZSAyMDQ4IGJpdHMgb3IgbGFyZ2VyIikpfX07ZnVuY3Rpb24gUW4oZSl7dmFyIHQscjtzd2l0Y2goZS5rdHkpe2Nhc2Uib2N0Ijpzd2l0Y2goZS5hbGcpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOnQ9e25hbWU6IkhNQUMiLGhhc2g6IlNIQS0iLmNvbmNhdChlLmFsZy5zbGljZSgtMykpfSxyPVsic2lnbiIsInZlcmlmeSJdO2JyZWFrO2Nhc2UiQTEyOENCQy1IUzI1NiI6Y2FzZSJBMTkyQ0JDLUhTMzg0IjpjYXNlIkEyNTZDQkMtSFM1MTIiOnRocm93IG5ldyBJbigiIi5jb25jYXQoZS5hbGcsIiBrZXlzIGNhbm5vdCBiZSBpbXBvcnRlZCBhcyBDcnlwdG9LZXkgaW5zdGFuY2VzIikpO2Nhc2UiQTEyOEdDTSI6Y2FzZSJBMTkyR0NNIjpjYXNlIkEyNTZHQ00iOmNhc2UiQTEyOEdDTUtXIjpjYXNlIkExOTJHQ01LVyI6Y2FzZSJBMjU2R0NNS1ciOnQ9e25hbWU6IkFFUy1HQ00ifSxyPVsiZW5jcnlwdCIsImRlY3J5cHQiXTticmVhaztjYXNlIkExMjhLVyI6Y2FzZSJBMTkyS1ciOmNhc2UiQTI1NktXIjp0PXtuYW1lOiJBRVMtS1cifSxyPVsid3JhcEtleSIsInVud3JhcEtleSJdO2JyZWFrO2Nhc2UiUEJFUzItSFMyNTYrQTEyOEtXIjpjYXNlIlBCRVMyLUhTMzg0K0ExOTJLVyI6Y2FzZSJQQkVTMi1IUzUxMitBMjU2S1ciOnQ9e25hbWU6IlBCS0RGMiJ9LHI9WyJkZXJpdmVCaXRzIl07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSW4oJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2Nhc2UiUlNBIjpzd2l0Y2goZS5hbGcpe2Nhc2UiUFMyNTYiOmNhc2UiUFMzODQiOmNhc2UiUFM1MTIiOnQ9e25hbWU6IlJTQS1QU1MiLGhhc2g6IlNIQS0iLmNvbmNhdChlLmFsZy5zbGljZSgtMykpfSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiUlMyNTYiOmNhc2UiUlMzODQiOmNhc2UiUlM1MTIiOnQ9e25hbWU6IlJTQVNTQS1QS0NTMS12MV81IixoYXNoOiJTSEEtIi5jb25jYXQoZS5hbGcuc2xpY2UoLTMpKX0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIlJTQS1PQUVQIjpjYXNlIlJTQS1PQUVQLTI1NiI6Y2FzZSJSU0EtT0FFUC0zODQiOmNhc2UiUlNBLU9BRVAtNTEyIjp0PXtuYW1lOiJSU0EtT0FFUCIsaGFzaDoiU0hBLSIuY29uY2F0KHBhcnNlSW50KGUuYWxnLnNsaWNlKC0zKSwxMCl8fDEpfSxyPWUuZD9bImRlY3J5cHQiLCJ1bndyYXBLZXkiXTpbImVuY3J5cHQiLCJ3cmFwS2V5Il07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSW4oJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2Nhc2UiRUMiOnN3aXRjaChlLmFsZyl7Y2FzZSJFUzI1NiI6dD17bmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6IlAtMjU2In0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIkVTMzg0Ijp0PXtuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZToiUC0zODQifSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiRVM1MTIiOnQ9e25hbWU6IkVDRFNBIixuYW1lZEN1cnZlOiJQLTUyMSJ9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJFQ0RILUVTIjpjYXNlIkVDREgtRVMrQTEyOEtXIjpjYXNlIkVDREgtRVMrQTE5MktXIjpjYXNlIkVDREgtRVMrQTI1NktXIjp0PXtuYW1lOiJFQ0RIIixuYW1lZEN1cnZlOmUuY3J2fSxyPWUuZD9bImRlcml2ZUJpdHMiXTpbXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBJbignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7Y2FzZShxbigpfHxLbigpKSYmIk9LUCI6aWYoIkVkRFNBIiE9PWUuYWxnKXRocm93IG5ldyBJbignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyk7c3dpdGNoKGUuY3J2KXtjYXNlIkVkMjU1MTkiOnQ9e25hbWU6Ik5PREUtRUQyNTUxOSIsbmFtZWRDdXJ2ZToiTk9ERS1FRDI1NTE5In0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIEtuKCkmJiJFZDQ0OCI6dD17bmFtZToiTk9ERS1FRDQ0OCIsbmFtZWRDdXJ2ZToiTk9ERS1FRDQ0OCJ9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSW4oJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJjcnYiIChTdWJ0eXBlIG9mIEtleSBQYWlyKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztkZWZhdWx0OnRocm93IG5ldyBJbignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImt0eSIgKEtleSBUeXBlKSBQYXJhbWV0ZXIgdmFsdWUnKX1yZXR1cm57YWxnb3JpdGhtOnQsa2V5VXNhZ2VzOnJ9fXZhciBlYT1mdW5jdGlvbigpe3ZhciBlPWkocigpLm1hcmsoKGZ1bmN0aW9uIGUobil7dmFyIGEsaSxvLHMsdSxjLGYsbCxoO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYocz1RbihuKSx1PXMuYWxnb3JpdGhtLGM9cy5rZXlVc2FnZXMsZj1bdSxudWxsIT09KGk9bi5leHQpJiZ2b2lkIDAhPT1pJiZpLG51bGwhPT0obz1uLmtleV9vcHMpJiZ2b2lkIDAhPT1vP286Y10sIlBCS0RGMiIhPT11Lm5hbWUpe2UubmV4dD00O2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIiwobD1fbi5zdWJ0bGUpLmltcG9ydEtleS5hcHBseShsLFsicmF3IixSbihuLmspXS5jb25jYXQoZikpKTtjYXNlIDQ6cmV0dXJuIGRlbGV0ZShoPXQoe30sbikpLmFsZyxlLmFicnVwdCgicmV0dXJuIiwoYT1fbi5zdWJ0bGUpLmltcG9ydEtleS5hcHBseShhLFsiandrIixoXS5jb25jYXQoZikpKTtjYXNlIDc6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCk7ZnVuY3Rpb24gdGEoZSx0LHIpe3JldHVybiByYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcmEoKXtyZXR1cm4ocmE9aShyKCkubWFyaygoZnVuY3Rpb24gZShuLGEsaSl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDppZigkbihuKSl7ZS5uZXh0PTI7YnJlYWt9dGhyb3cgbmV3IFR5cGVFcnJvcigiSldLIG11c3QgYmUgYW4gb2JqZWN0Iik7Y2FzZSAyOmlmKGF8fChhPW4uYWxnKSwic3RyaW5nIj09dHlwZW9mIGEmJmEpe2UubmV4dD01O2JyZWFrfXRocm93IG5ldyBUeXBlRXJyb3IoJyJhbGciIGFyZ3VtZW50IGlzIHJlcXVpcmVkIHdoZW4gImp3ay5hbGciIGlzIG5vdCBwcmVzZW50Jyk7Y2FzZSA1OmUudDA9bi5rdHksZS5uZXh0PSJvY3QiPT09ZS50MD84OiJSU0EiPT09ZS50MD8xNDoiRUMiPT09ZS50MHx8Ik9LUCI9PT1lLnQwPzE2OjE3O2JyZWFrO2Nhc2UgODppZigic3RyaW5nIj09dHlwZW9mIG4uayYmbi5rKXtlLm5leHQ9MTA7YnJlYWt9dGhyb3cgbmV3IFR5cGVFcnJvcignbWlzc2luZyAiayIgKEtleSBWYWx1ZSkgUGFyYW1ldGVyIHZhbHVlJyk7Y2FzZSAxMDppZihudWxsIT1pfHwoaT0hMCE9PW4uZXh0KSwhaSl7ZS5uZXh0PTEzO2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIixlYSh0KHQoe30sbikse30se2FsZzphLGV4dDohMX0pKSk7Y2FzZSAxMzpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsUm4obi5rKSk7Y2FzZSAxNDppZih2b2lkIDA9PT1uLm90aCl7ZS5uZXh0PTE2O2JyZWFrfXRocm93IG5ldyBJbignUlNBIEpXSyAib3RoIiAoT3RoZXIgUHJpbWVzIEluZm8pIFBhcmFtZXRlciB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkJyk7Y2FzZSAxNjpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsZWEodCh0KHt9LG4pLHt9LHthbGc6YX0pKSk7Y2FzZSAxNzp0aHJvdyBuZXcgSW4oJ1Vuc3VwcG9ydGVkICJrdHkiIChLZXkgVHlwZSkgUGFyYW1ldGVyIHZhbHVlJyk7Y2FzZSAxODpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUpfSkpKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciBuYT1mdW5jdGlvbihlLHQscil7ZS5zdGFydHNXaXRoKCJIUyIpfHwiZGlyIj09PWV8fGUuc3RhcnRzV2l0aCgiUEJFUzIiKXx8L15BXGR7M30oPzpHQ00pP0tXJC8udGVzdChlKT9mdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSl7aWYoIUduKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoWW4uYXBwbHkodm9pZCAwLFtlXS5jb25jYXQoYihWbiksWyJVaW50OEFycmF5Il0pKSk7aWYoInNlY3JldCIhPT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiIi5jb25jYXQoVm4uam9pbigiIG9yICIpLCcgaW5zdGFuY2VzIGZvciBzeW1tZXRyaWMgYWxnb3JpdGhtcyBtdXN0IGJlIG9mIHR5cGUgInNlY3JldCInKSl9fSh0KTpmdW5jdGlvbihlLHQpe2lmKCFHbihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFluLmFwcGx5KHZvaWQgMCxbZV0uY29uY2F0KGIoVm4pKSkpO2lmKCJzZWNyZXQiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoIiIuY29uY2F0KFZuLmpvaW4oIiBvciAiKSwnIGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG1zIG11c3Qgbm90IGJlIG9mIHR5cGUgInNlY3JldCInKSk7aWYoInNpZ24iPT09dCYmInB1YmxpYyI9PT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiIi5jb25jYXQoVm4uam9pbigiIG9yICIpLCcgaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBzaWduaW5nIG11c3QgYmUgb2YgdHlwZSAicHJpdmF0ZSInKSk7aWYoImRlY3J5cHQiPT09dCYmInB1YmxpYyI9PT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiIi5jb25jYXQoVm4uam9pbigiIG9yICIpLCcgaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBkZWNyeXB0aW9uIG11c3QgYmUgb2YgdHlwZSAicHJpdmF0ZSInKSk7aWYoZS5hbGdvcml0aG0mJiJ2ZXJpZnkiPT09dCYmInByaXZhdGUiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoIiIuY29uY2F0KFZuLmpvaW4oIiBvciAiKSwnIGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG0gdmVyaWZ5aW5nIG11c3QgYmUgb2YgdHlwZSAicHVibGljIicpKTtpZihlLmFsZ29yaXRobSYmImVuY3J5cHQiPT09dCYmInByaXZhdGUiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoIiIuY29uY2F0KFZuLmpvaW4oIiBvciAiKSwnIGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG0gZW5jcnlwdGlvbiBtdXN0IGJlIG9mIHR5cGUgInB1YmxpYyInKSl9KHQscil9O2Z1bmN0aW9uIGFhKGUsdCxyLG4sYSl7aWYodm9pZCAwIT09YS5jcml0JiZ2b2lkIDA9PT1uLmNyaXQpdGhyb3cgbmV3IGUoJyJjcml0IiAoQ3JpdGljYWwpIEhlYWRlciBQYXJhbWV0ZXIgTVVTVCBiZSBpbnRlZ3JpdHkgcHJvdGVjdGVkJyk7aWYoIW58fHZvaWQgMD09PW4uY3JpdClyZXR1cm4gbmV3IFNldDtpZighQXJyYXkuaXNBcnJheShuLmNyaXQpfHwwPT09bi5jcml0Lmxlbmd0aHx8bi5jcml0LnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciIT10eXBlb2YgZXx8MD09PWUubGVuZ3RofSkpKXRocm93IG5ldyBlKCciY3JpdCIgKENyaXRpY2FsKSBIZWFkZXIgUGFyYW1ldGVyIE1VU1QgYmUgYW4gYXJyYXkgb2Ygbm9uLWVtcHR5IHN0cmluZ3Mgd2hlbiBwcmVzZW50Jyk7dmFyIGk7aT12b2lkIDAhPT1yP25ldyBNYXAoW10uY29uY2F0KGIoT2JqZWN0LmVudHJpZXMocikpLGIodC5lbnRyaWVzKCkpKSk6dDt2YXIgbyxzPV8obi5jcml0KTt0cnl7Zm9yKHMucygpOyEobz1zLm4oKSkuZG9uZTspe3ZhciB1PW8udmFsdWU7aWYoIWkuaGFzKHUpKXRocm93IG5ldyBJbignRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIicuY29uY2F0KHUsJyIgaXMgbm90IHJlY29nbml6ZWQnKSk7aWYodm9pZCAwPT09YVt1XSl0aHJvdyBuZXcgZSgnRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIicuY29uY2F0KHUsJyIgaXMgbWlzc2luZycpKTtpZihpLmdldCh1KSYmdm9pZCAwPT09blt1XSl0aHJvdyBuZXcgZSgnRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIicuY29uY2F0KHUsJyIgTVVTVCBiZSBpbnRlZ3JpdHkgcHJvdGVjdGVkJykpfX1jYXRjaChlKXtzLmUoZSl9ZmluYWxseXtzLmYoKX1yZXR1cm4gbmV3IFNldChuLmNyaXQpfXZhciBpYT1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMCE9PXQmJighQXJyYXkuaXNBcnJheSh0KXx8dC5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGV9KSkpKXRocm93IG5ldyBUeXBlRXJyb3IoJyInLmNvbmNhdChlLCciIG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKSk7aWYodClyZXR1cm4gbmV3IFNldCh0KX07ZnVuY3Rpb24gb2EoZSx0KXt2YXIgcj0iU0hBLSIuY29uY2F0KGUuc2xpY2UoLTMpKTtzd2l0Y2goZSl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6cmV0dXJue2hhc2g6cixuYW1lOiJITUFDIn07Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6cmV0dXJue2hhc2g6cixuYW1lOiJSU0EtUFNTIixzYWx0TGVuZ3RoOmUuc2xpY2UoLTMpPj4zfTtjYXNlIlJTMjU2IjpjYXNlIlJTMzg0IjpjYXNlIlJTNTEyIjpyZXR1cm57aGFzaDpyLG5hbWU6IlJTQVNTQS1QS0NTMS12MV81In07Y2FzZSJFUzI1NiI6Y2FzZSJFUzM4NCI6Y2FzZSJFUzUxMiI6cmV0dXJue2hhc2g6cixuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZTp0Lm5hbWVkQ3VydmV9O2Nhc2UocW4oKXx8S24oKSkmJiJFZERTQSI6dmFyIG49dC5uYW1lZEN1cnZlO3JldHVybntuYW1lOm4sbmFtZWRDdXJ2ZTpufTtkZWZhdWx0OnRocm93IG5ldyBJbigiYWxnICIuY29uY2F0KGUsIiBpcyBub3Qgc3VwcG9ydGVkIGVpdGhlciBieSBKT1NFIG9yIHlvdXIgamF2YXNjcmlwdCBydW50aW1lIikpfX1mdW5jdGlvbiBzYShlLHQscil7aWYoU24odCkpcmV0dXJuIGZ1bmN0aW9uKGUsdCl7c3dpdGNoKHQpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOmlmKCFCbihlLmFsZ29yaXRobSwiSE1BQyIpKXRocm93IEpuKCJITUFDIik7dmFyIHI9cGFyc2VJbnQodC5zbGljZSgyKSwxMCk7aWYoRm4oZS5hbGdvcml0aG0uaGFzaCkhPT1yKXRocm93IEpuKCJTSEEtIi5jb25jYXQociksImFsZ29yaXRobS5oYXNoIik7YnJlYWs7Y2FzZSJSUzI1NiI6Y2FzZSJSUzM4NCI6Y2FzZSJSUzUxMiI6aWYoIUJuKGUuYWxnb3JpdGhtLCJSU0FTU0EtUEtDUzEtdjFfNSIpKXRocm93IEpuKCJSU0FTU0EtUEtDUzEtdjFfNSIpO3ZhciBuPXBhcnNlSW50KHQuc2xpY2UoMiksMTApO2lmKEZuKGUuYWxnb3JpdGhtLmhhc2gpIT09bil0aHJvdyBKbigiU0hBLSIuY29uY2F0KG4pLCJhbGdvcml0aG0uaGFzaCIpO2JyZWFrO2Nhc2UiUFMyNTYiOmNhc2UiUFMzODQiOmNhc2UiUFM1MTIiOmlmKCFCbihlLmFsZ29yaXRobSwiUlNBLVBTUyIpKXRocm93IEpuKCJSU0EtUFNTIik7dmFyIGE9cGFyc2VJbnQodC5zbGljZSgyKSwxMCk7aWYoRm4oZS5hbGdvcml0aG0uaGFzaCkhPT1hKXRocm93IEpuKCJTSEEtIi5jb25jYXQoYSksImFsZ29yaXRobS5oYXNoIik7YnJlYWs7Y2FzZSBLbigpJiYiRWREU0EiOmlmKCJOT0RFLUVEMjU1MTkiIT09ZS5hbGdvcml0aG0ubmFtZSYmIk5PREUtRUQ0NDgiIT09ZS5hbGdvcml0aG0ubmFtZSl0aHJvdyBKbigiTk9ERS1FRDI1NTE5IG9yIE5PREUtRUQ0NDgiKTticmVhaztjYXNlIHFuKCkmJiJFZERTQSI6aWYoIUJuKGUuYWxnb3JpdGhtLCJOT0RFLUVEMjU1MTkiKSl0aHJvdyBKbigiTk9ERS1FRDI1NTE5Iik7YnJlYWs7Y2FzZSJFUzI1NiI6Y2FzZSJFUzM4NCI6Y2FzZSJFUzUxMiI6aWYoIUJuKGUuYWxnb3JpdGhtLCJFQ0RTQSIpKXRocm93IEpuKCJFQ0RTQSIpO3ZhciBpPVduKHQpO2lmKGUuYWxnb3JpdGhtLm5hbWVkQ3VydmUhPT1pKXRocm93IEpuKGksImFsZ29yaXRobS5uYW1lZEN1cnZlIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJDcnlwdG9LZXkgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbiIpfWZvcih2YXIgbz1hcmd1bWVudHMubGVuZ3RoLHM9bmV3IEFycmF5KG8+Mj9vLTI6MCksdT0yO3U8bzt1Kyspc1t1LTJdPWFyZ3VtZW50c1t1XTt6bihlLHMpfSh0LGUsciksdDtpZih0IGluc3RhbmNlb2YgVWludDhBcnJheSl7aWYoIWUuc3RhcnRzV2l0aCgiSFMiKSl0aHJvdyBuZXcgVHlwZUVycm9yKFluLmFwcGx5KHZvaWQgMCxbdF0uY29uY2F0KGIoVm4pKSkpO3JldHVybiBfbi5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLHQse2hhc2g6IlNIQS0iLmNvbmNhdChlLnNsaWNlKC0zKSksbmFtZToiSE1BQyJ9LCExLFtyXSl9dGhyb3cgbmV3IFR5cGVFcnJvcihZbi5hcHBseSh2b2lkIDAsW3RdLmNvbmNhdChiKFZuKSxbIlVpbnQ4QXJyYXkiXSkpKX12YXIgdWE9ZnVuY3Rpb24oKXt2YXIgZT1pKHIoKS5tYXJrKChmdW5jdGlvbiBlKHQsbixhLGkpe3ZhciBvLHM7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5uZXh0PTIsc2EodCxuLCJ2ZXJpZnkiKTtjYXNlIDI6cmV0dXJuIG89ZS5zZW50LFpuKHQsbykscz1vYSh0LG8uYWxnb3JpdGhtKSxlLnByZXY9NSxlLm5leHQ9OCxfbi5zdWJ0bGUudmVyaWZ5KHMsbyxhLGkpO2Nhc2UgODpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsZS5zZW50KTtjYXNlIDExOnJldHVybiBlLnByZXY9MTEsZS50MD1lLmNhdGNoKDUpLGUuYWJydXB0KCJyZXR1cm4iLCExKTtjYXNlIDE0OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSxudWxsLFtbNSwxMV1dKX0pKSk7cmV0dXJuIGZ1bmN0aW9uKHQscixuLGEpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCk7ZnVuY3Rpb24gY2EoZSx0LHIpe3JldHVybiBmYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gZmEoKXtyZXR1cm4gZmE9aShyKCkubWFyaygoZnVuY3Rpb24gZShuLGEsaSl7dmFyIG8scyx1LGMsZixsLGgscCxkLHYsZyx5LG07cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDppZigkbihuKSl7ZS5uZXh0PTI7YnJlYWt9dGhyb3cgbmV3IExuKCJGbGF0dGVuZWQgSldTIG11c3QgYmUgYW4gb2JqZWN0Iik7Y2FzZSAyOmlmKHZvaWQgMCE9PW4ucHJvdGVjdGVkfHx2b2lkIDAhPT1uLmhlYWRlcil7ZS5uZXh0PTQ7YnJlYWt9dGhyb3cgbmV3IExuKCdGbGF0dGVuZWQgSldTIG11c3QgaGF2ZSBlaXRoZXIgb2YgdGhlICJwcm90ZWN0ZWQiIG9yICJoZWFkZXIiIG1lbWJlcnMnKTtjYXNlIDQ6aWYodm9pZCAwPT09bi5wcm90ZWN0ZWR8fCJzdHJpbmciPT10eXBlb2Ygbi5wcm90ZWN0ZWQpe2UubmV4dD02O2JyZWFrfXRocm93IG5ldyBMbigiSldTIFByb3RlY3RlZCBIZWFkZXIgaW5jb3JyZWN0IHR5cGUiKTtjYXNlIDY6aWYodm9pZCAwIT09bi5wYXlsb2FkKXtlLm5leHQ9ODticmVha310aHJvdyBuZXcgTG4oIkpXUyBQYXlsb2FkIG1pc3NpbmciKTtjYXNlIDg6aWYoInN0cmluZyI9PXR5cGVvZiBuLnNpZ25hdHVyZSl7ZS5uZXh0PTEwO2JyZWFrfXRocm93IG5ldyBMbigiSldTIFNpZ25hdHVyZSBtaXNzaW5nIG9yIGluY29ycmVjdCB0eXBlIik7Y2FzZSAxMDppZih2b2lkIDA9PT1uLmhlYWRlcnx8JG4obi5oZWFkZXIpKXtlLm5leHQ9MTI7YnJlYWt9dGhyb3cgbmV3IExuKCJKV1MgVW5wcm90ZWN0ZWQgSGVhZGVyIGluY29ycmVjdCB0eXBlIik7Y2FzZSAxMjppZihzPXt9LCFuLnByb3RlY3RlZCl7ZS5uZXh0PTIyO2JyZWFrfXU9Um4obi5wcm90ZWN0ZWQpLGUucHJldj0xNSxzPUpTT04ucGFyc2UoVG4uZGVjb2RlKHUpKSxlLm5leHQ9MjI7YnJlYWs7Y2FzZSAxOTp0aHJvdyBlLnByZXY9MTksZS50MD1lLmNhdGNoKDE1KSxuZXcgTG4oIkpXUyBQcm90ZWN0ZWQgSGVhZGVyIGlzIGludmFsaWQiKTtjYXNlIDIyOmlmKFhuKHMsbi5oZWFkZXIpKXtlLm5leHQ9MjQ7YnJlYWt9dGhyb3cgbmV3IExuKCJKV1MgUHJvdGVjdGVkIGFuZCBKV1MgVW5wcm90ZWN0ZWQgSGVhZGVyIFBhcmFtZXRlciBuYW1lcyBtdXN0IGJlIGRpc2pvaW50Iik7Y2FzZSAyNDppZihjPXQodCh7fSxzKSxuLmhlYWRlciksZj1hYShMbixuZXcgTWFwKFtbImI2NCIsITBdXSksbnVsbD09aT92b2lkIDA6aS5jcml0LHMsYyksbD0hMCwhZi5oYXMoImI2NCIpKXtlLm5leHQ9MzE7YnJlYWt9aWYoImJvb2xlYW4iPT10eXBlb2YobD1zLmI2NCkpe2UubmV4dD0zMTticmVha310aHJvdyBuZXcgTG4oJ1RoZSAiYjY0IiAoYmFzZTY0dXJsLWVuY29kZSBwYXlsb2FkKSBIZWFkZXIgUGFyYW1ldGVyIG11c3QgYmUgYSBib29sZWFuJyk7Y2FzZSAzMTppZigic3RyaW5nIj09dHlwZW9mKGg9Yy5hbGcpJiZoKXtlLm5leHQ9MzQ7YnJlYWt9dGhyb3cgbmV3IExuKCdKV1MgImFsZyIgKEFsZ29yaXRobSkgSGVhZGVyIFBhcmFtZXRlciBtaXNzaW5nIG9yIGludmFsaWQnKTtjYXNlIDM0OmlmKCEocD1pJiZpYSgiYWxnb3JpdGhtcyIsaS5hbGdvcml0aG1zKSl8fHAuaGFzKGgpKXtlLm5leHQ9Mzc7YnJlYWt9dGhyb3cgbmV3IE9uKCciYWxnIiAoQWxnb3JpdGhtKSBIZWFkZXIgUGFyYW1ldGVyIG5vdCBhbGxvd2VkJyk7Y2FzZSAzNzppZighbCl7ZS5uZXh0PTQyO2JyZWFrfWlmKCJzdHJpbmciPT10eXBlb2Ygbi5wYXlsb2FkKXtlLm5leHQ9NDA7YnJlYWt9dGhyb3cgbmV3IExuKCJKV1MgUGF5bG9hZCBtdXN0IGJlIGEgc3RyaW5nIik7Y2FzZSA0MDplLm5leHQ9NDQ7YnJlYWs7Y2FzZSA0MjppZigic3RyaW5nIj09dHlwZW9mIG4ucGF5bG9hZHx8bi5wYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSl7ZS5uZXh0PTQ0O2JyZWFrfXRocm93IG5ldyBMbigiSldTIFBheWxvYWQgbXVzdCBiZSBhIHN0cmluZyBvciBhbiBVaW50OEFycmF5IGluc3RhbmNlIik7Y2FzZSA0NDppZihkPSExLCJmdW5jdGlvbiIhPXR5cGVvZiBhKXtlLm5leHQ9NTA7YnJlYWt9cmV0dXJuIGUubmV4dD00OCxhKHMsbik7Y2FzZSA0ODphPWUuc2VudCxkPSEwO2Nhc2UgNTA6cmV0dXJuIG5hKGgsYSwidmVyaWZ5Iiksdj1BbihFbi5lbmNvZGUobnVsbCE9PShvPW4ucHJvdGVjdGVkKSYmdm9pZCAwIT09bz9vOiIiKSxFbi5lbmNvZGUoIi4iKSwic3RyaW5nIj09dHlwZW9mIG4ucGF5bG9hZD9Fbi5lbmNvZGUobi5wYXlsb2FkKTpuLnBheWxvYWQpLGc9Um4obi5zaWduYXR1cmUpLGUubmV4dD01NSx1YShoLGEsZyx2KTtjYXNlIDU1OmlmKGUuc2VudCl7ZS5uZXh0PTU4O2JyZWFrfXRocm93IG5ldyBObjtjYXNlIDU4OmlmKHk9bD9SbihuLnBheWxvYWQpOiJzdHJpbmciPT10eXBlb2Ygbi5wYXlsb2FkP0VuLmVuY29kZShuLnBheWxvYWQpOm4ucGF5bG9hZCxtPXtwYXlsb2FkOnl9LHZvaWQgMCE9PW4ucHJvdGVjdGVkJiYobS5wcm90ZWN0ZWRIZWFkZXI9cyksdm9pZCAwIT09bi5oZWFkZXImJihtLnVucHJvdGVjdGVkSGVhZGVyPW4uaGVhZGVyKSwhZCl7ZS5uZXh0PTY0O2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIix0KHQoe30sbSkse30se2tleTphfSkpO2Nhc2UgNjQ6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLG0pO2Nhc2UgNjU6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLG51bGwsW1sxNSwxOV1dKX0pKSksZmEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGxhKGUsdCxyKXtyZXR1cm4gaGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGhhKCl7cmV0dXJuKGhhPWkocigpLm1hcmsoKGZ1bmN0aW9uIGUobixhLGkpe3ZhciBvLHMsdSxjLGYsbDtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOmlmKG4gaW5zdGFuY2VvZiBVaW50OEFycmF5JiYobj1Ubi5kZWNvZGUobikpLCJzdHJpbmciPT10eXBlb2Ygbil7ZS5uZXh0PTM7YnJlYWt9dGhyb3cgbmV3IExuKCJDb21wYWN0IEpXUyBtdXN0IGJlIGEgc3RyaW5nIG9yIFVpbnQ4QXJyYXkiKTtjYXNlIDM6aWYobz1uLnNwbGl0KCIuIikscz1vWzBdLHU9b1sxXSxjPW9bMl0sMz09PW8ubGVuZ3RoKXtlLm5leHQ9NjticmVha310aHJvdyBuZXcgTG4oIkludmFsaWQgQ29tcGFjdCBKV1MiKTtjYXNlIDY6cmV0dXJuIGUubmV4dD04LGNhKHtwYXlsb2FkOnUscHJvdGVjdGVkOnMsc2lnbmF0dXJlOmN9LGEsaSk7Y2FzZSA4OmlmKGY9ZS5zZW50LGw9e3BheWxvYWQ6Zi5wYXlsb2FkLHByb3RlY3RlZEhlYWRlcjpmLnByb3RlY3RlZEhlYWRlcn0sImZ1bmN0aW9uIiE9dHlwZW9mIGEpe2UubmV4dD0xMjticmVha31yZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsdCh0KHt9LGwpLHt9LHtrZXk6Zi5rZXl9KSk7Y2FzZSAxMjpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsbCk7Y2FzZSAxMzpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUpfSkpKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciBwYT1mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5mbG9vcihlLmdldFRpbWUoKS8xZTMpfSxkYT04NjQwMCx2YT0vXihcZCt8XGQrXC5cZCspID8oc2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KSQvaSxnYT1mdW5jdGlvbihlKXt2YXIgdD12YS5leGVjKGUpO2lmKCF0KXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgdGltZSBwZXJpb2QgZm9ybWF0Iik7dmFyIHI9cGFyc2VGbG9hdCh0WzFdKTtzd2l0Y2godFsyXS50b0xvd2VyQ2FzZSgpKXtjYXNlInNlYyI6Y2FzZSJzZWNzIjpjYXNlInNlY29uZCI6Y2FzZSJzZWNvbmRzIjpjYXNlInMiOnJldHVybiBNYXRoLnJvdW5kKHIpO2Nhc2UibWludXRlIjpjYXNlIm1pbnV0ZXMiOmNhc2UibWluIjpjYXNlIm1pbnMiOmNhc2UibSI6cmV0dXJuIE1hdGgucm91bmQoNjAqcik7Y2FzZSJob3VyIjpjYXNlImhvdXJzIjpjYXNlImhyIjpjYXNlImhycyI6Y2FzZSJoIjpyZXR1cm4gTWF0aC5yb3VuZCgzNjAwKnIpO2Nhc2UiZGF5IjpjYXNlImRheXMiOmNhc2UiZCI6cmV0dXJuIE1hdGgucm91bmQocipkYSk7Y2FzZSJ3ZWVrIjpjYXNlIndlZWtzIjpjYXNlInciOnJldHVybiBNYXRoLnJvdW5kKDYwNDgwMCpyKTtkZWZhdWx0OnJldHVybiBNYXRoLnJvdW5kKDMxNTU3NjAwKnIpfX0seWE9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9eYXBwbGljYXRpb25cLy8sIiIpfSxtYT1mdW5jdGlvbihlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZT90LmluY2x1ZGVzKGUpOiEhQXJyYXkuaXNBcnJheShlKSYmdC5zb21lKFNldC5wcm90b3R5cGUuaGFzLmJpbmQobmV3IFNldChlKSkpfSx3YT1mdW5jdGlvbihlLHQpe3ZhciByLGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGk9YS50eXA7aWYoaSYmKCJzdHJpbmciIT10eXBlb2YgZS50eXB8fHlhKGUudHlwKSE9PXlhKGkpKSl0aHJvdyBuZXcgUG4oJ3VuZXhwZWN0ZWQgInR5cCIgSldUIGhlYWRlciB2YWx1ZScsInR5cCIsImNoZWNrX2ZhaWxlZCIpO3RyeXtyPUpTT04ucGFyc2UoVG4uZGVjb2RlKHQpKX1jYXRjaChlKXt9aWYoISRuKHIpKXRocm93IG5ldyBVbigiSldUIENsYWltcyBTZXQgbXVzdCBiZSBhIHRvcC1sZXZlbCBKU09OIG9iamVjdCIpO3ZhciBvPWEuaXNzdWVyO2lmKG8mJiEoQXJyYXkuaXNBcnJheShvKT9vOltvXSkuaW5jbHVkZXMoci5pc3MpKXRocm93IG5ldyBQbigndW5leHBlY3RlZCAiaXNzIiBjbGFpbSB2YWx1ZScsImlzcyIsImNoZWNrX2ZhaWxlZCIpO3ZhciBzPWEuc3ViamVjdDtpZihzJiZyLnN1YiE9PXMpdGhyb3cgbmV3IFBuKCd1bmV4cGVjdGVkICJzdWIiIGNsYWltIHZhbHVlJywic3ViIiwiY2hlY2tfZmFpbGVkIik7dmFyIHUsYz1hLmF1ZGllbmNlO2lmKGMmJiFtYShyLmF1ZCwic3RyaW5nIj09dHlwZW9mIGM/W2NdOmMpKXRocm93IG5ldyBQbigndW5leHBlY3RlZCAiYXVkIiBjbGFpbSB2YWx1ZScsImF1ZCIsImNoZWNrX2ZhaWxlZCIpO3N3aXRjaChuKGEuY2xvY2tUb2xlcmFuY2UpKXtjYXNlInN0cmluZyI6dT1nYShhLmNsb2NrVG9sZXJhbmNlKTticmVhaztjYXNlIm51bWJlciI6dT1hLmNsb2NrVG9sZXJhbmNlO2JyZWFrO2Nhc2UidW5kZWZpbmVkIjp1PTA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGNsb2NrVG9sZXJhbmNlIG9wdGlvbiB0eXBlIil9dmFyIGY9YS5jdXJyZW50RGF0ZSxsPXBhKGZ8fG5ldyBEYXRlKTtpZigodm9pZCAwIT09ci5pYXR8fGEubWF4VG9rZW5BZ2UpJiYibnVtYmVyIiE9dHlwZW9mIHIuaWF0KXRocm93IG5ldyBQbignImlhdCIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsImlhdCIsImludmFsaWQiKTtpZih2b2lkIDAhPT1yLm5iZil7aWYoIm51bWJlciIhPXR5cGVvZiByLm5iZil0aHJvdyBuZXcgUG4oJyJuYmYiIGNsYWltIG11c3QgYmUgYSBudW1iZXInLCJuYmYiLCJpbnZhbGlkIik7aWYoci5uYmY+bCt1KXRocm93IG5ldyBQbignIm5iZiIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCcsIm5iZiIsImNoZWNrX2ZhaWxlZCIpfWlmKHZvaWQgMCE9PXIuZXhwKXtpZigibnVtYmVyIiE9dHlwZW9mIHIuZXhwKXRocm93IG5ldyBQbignImV4cCIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsImV4cCIsImludmFsaWQiKTtpZihyLmV4cDw9bC11KXRocm93IG5ldyBEbignImV4cCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCcsImV4cCIsImNoZWNrX2ZhaWxlZCIpfWlmKGEubWF4VG9rZW5BZ2Upe3ZhciBoPWwtci5pYXQscD0ibnVtYmVyIj09dHlwZW9mIGEubWF4VG9rZW5BZ2U/YS5tYXhUb2tlbkFnZTpnYShhLm1heFRva2VuQWdlKTtpZihoLXU+cCl0aHJvdyBuZXcgRG4oJyJpYXQiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQgKHRvbyBmYXIgaW4gdGhlIHBhc3QpJywiaWF0IiwiY2hlY2tfZmFpbGVkIik7aWYoaDwwLXUpdGhyb3cgbmV3IFBuKCciaWF0IiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkIChpdCBzaG91bGQgYmUgaW4gdGhlIHBhc3QpJywiaWF0IiwiY2hlY2tfZmFpbGVkIil9cmV0dXJuIHJ9O2Z1bmN0aW9uIGJhKCl7cmV0dXJuKGJhPWkocigpLm1hcmsoKGZ1bmN0aW9uIGUobixhLGkpe3ZhciBvLHMsdSxjO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUubmV4dD0yLGxhKG4sYSxpKTtjYXNlIDI6aWYocz1lLnNlbnQsIShudWxsPT09KG89cy5wcm90ZWN0ZWRIZWFkZXIuY3JpdCl8fHZvaWQgMD09PW8/dm9pZCAwOm8uaW5jbHVkZXMoImI2NCIpKXx8ITEhPT1zLnByb3RlY3RlZEhlYWRlci5iNjQpe2UubmV4dD01O2JyZWFrfXRocm93IG5ldyBVbigiSldUcyBNVVNUIE5PVCB1c2UgdW5lbmNvZGVkIHBheWxvYWQiKTtjYXNlIDU6aWYodT13YShzLnByb3RlY3RlZEhlYWRlcixzLnBheWxvYWQsaSksYz17cGF5bG9hZDp1LHByb3RlY3RlZEhlYWRlcjpzLnByb3RlY3RlZEhlYWRlcn0sImZ1bmN0aW9uIiE9dHlwZW9mIGEpe2UubmV4dD05O2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIix0KHQoe30sYykse30se2tleTpzLmtleX0pKTtjYXNlIDk6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGMpO2Nhc2UgMTA6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBrYShlKXtzd2l0Y2goInN0cmluZyI9PXR5cGVvZiBlJiZlLnNsaWNlKDAsMikpe2Nhc2UiUlMiOmNhc2UiUFMiOnJldHVybiJSU0EiO2Nhc2UiRVMiOnJldHVybiJFQyI7Y2FzZSJFZCI6cmV0dXJuIk9LUCI7ZGVmYXVsdDp0aHJvdyBuZXcgSW4oJ1Vuc3VwcG9ydGVkICJhbGciIHZhbHVlIGZvciBhIEpTT04gV2ViIEtleSBTZXQnKX19ZnVuY3Rpb24geGEoZSl7cmV0dXJuICRuKGUpfXZhciBfYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7aWYobyh0aGlzLGUpLHRoaXMuX2NhY2hlZD1uZXcgV2Vha01hcCwhZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJvYmplY3QiPT09bihlKSYmQXJyYXkuaXNBcnJheShlLmtleXMpJiZlLmtleXMuZXZlcnkoeGEpfSh0KSl0aHJvdyBuZXcgSG4oIkpTT04gV2ViIEtleSBTZXQgbWFsZm9ybWVkIik7dmFyIHI7dGhpcy5fandrcz0ocj10LCJmdW5jdGlvbiI9PXR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmU/c3RydWN0dXJlZENsb25lKHIpOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocikpKX12YXIgYTtyZXR1cm4gdShlLFt7a2V5OiJnZXRLZXkiLHZhbHVlOihhPWkocigpLm1hcmsoKGZ1bmN0aW9uIGUobixhKXt2YXIgaSxvLHMsdSxjLGYsbCxoLHA7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDppZihpPXQodCh7fSxuKSxhLmhlYWRlciksbz1pLmFsZyxzPWkua2lkLHU9a2EobyksYz10aGlzLl9qd2tzLmtleXMuZmlsdGVyKChmdW5jdGlvbihlKXt2YXIgdD11PT09ZS5rdHk7aWYodCYmInN0cmluZyI9PXR5cGVvZiBzJiYodD1zPT09ZS5raWQpLHQmJiJzdHJpbmciPT10eXBlb2YgZS5hbGcmJih0PW89PT1lLmFsZyksdCYmInN0cmluZyI9PXR5cGVvZiBlLnVzZSYmKHQ9InNpZyI9PT1lLnVzZSksdCYmQXJyYXkuaXNBcnJheShlLmtleV9vcHMpJiYodD1lLmtleV9vcHMuaW5jbHVkZXMoInZlcmlmeSIpKSx0JiYiRWREU0EiPT09byYmKHQ9IkVkMjU1MTkiPT09ZS5jcnZ8fCJFZDQ0OCI9PT1lLmNydiksdClzd2l0Y2gobyl7Y2FzZSJFUzI1NiI6dD0iUC0yNTYiPT09ZS5jcnY7YnJlYWs7Y2FzZSJFUzI1NksiOnQ9InNlY3AyNTZrMSI9PT1lLmNydjticmVhaztjYXNlIkVTMzg0Ijp0PSJQLTM4NCI9PT1lLmNydjticmVhaztjYXNlIkVTNTEyIjp0PSJQLTUyMSI9PT1lLmNydn1yZXR1cm4gdH0pKSxmPWNbMF0sMCE9PShsPWMubGVuZ3RoKSl7ZS5uZXh0PTg7YnJlYWt9dGhyb3cgbmV3IE1uO2Nhc2UgODppZigxPT09bCl7ZS5uZXh0PTEwO2JyZWFrfXRocm93IG5ldyBqbjtjYXNlIDEwOmlmKHZvaWQgMCE9PShoPXRoaXMuX2NhY2hlZC5nZXQoZil8fHRoaXMuX2NhY2hlZC5zZXQoZix7fSkuZ2V0KGYpKVtvXSl7ZS5uZXh0PTE4O2JyZWFrfXJldHVybiBlLm5leHQ9MTQsdGEodCh0KHt9LGYpLHt9LHtleHQ6ITB9KSxvKTtjYXNlIDE0OmlmKCEoKHA9ZS5zZW50KWluc3RhbmNlb2YgVWludDhBcnJheXx8InB1YmxpYyIhPT1wLnR5cGUpKXtlLm5leHQ9MTc7YnJlYWt9dGhyb3cgbmV3IEhuKCJKU09OIFdlYiBLZXkgU2V0IG1lbWJlcnMgbXVzdCBiZSBwdWJsaWMga2V5cyIpO2Nhc2UgMTc6aFtvXT1wO2Nhc2UgMTg6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGhbb10pO2Nhc2UgMTk6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKSxmdW5jdGlvbihlLHQpe3JldHVybiBhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfV0pLGV9KCk7dmFyIFNhPXtleHBvcnRzOnt9fSxFYT17ZXhwb3J0czp7fX0sVGE9Wihmbik7Ci8qISBzYWZlLWJ1ZmZlci4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqLwohZnVuY3Rpb24oZSx0KXt2YXIgcj1UYSxuPXIuQnVmZmVyO2Z1bmN0aW9uIGEoZSx0KXtmb3IodmFyIHIgaW4gZSl0W3JdPWVbcl19ZnVuY3Rpb24gaShlLHQscil7cmV0dXJuIG4oZSx0LHIpfW4uZnJvbSYmbi5hbGxvYyYmbi5hbGxvY1Vuc2FmZSYmbi5hbGxvY1Vuc2FmZVNsb3c/ZS5leHBvcnRzPXI6KGEocix0KSx0LkJ1ZmZlcj1pKSxpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSxhKG4saSksaS5mcm9tPWZ1bmN0aW9uKGUsdCxyKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gbihlLHQscil9LGkuYWxsb2M9ZnVuY3Rpb24oZSx0LHIpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7dmFyIGE9bihlKTtyZXR1cm4gdm9pZCAwIT09dD8ic3RyaW5nIj09dHlwZW9mIHI/YS5maWxsKHQscik6YS5maWxsKHQpOmEuZmlsbCgwKSxhfSxpLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIG4oZSl9LGkuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIuU2xvd0J1ZmZlcihlKX19KEVhLEVhLmV4cG9ydHMpO3ZhciBBYT02NTUzNixSYT00Mjk0OTY3Mjk1O3ZhciBDYT1FYS5leHBvcnRzLkJ1ZmZlcixQYT1YLmNyeXB0b3x8WC5tc0NyeXB0bztQYSYmUGEuZ2V0UmFuZG9tVmFsdWVzP1NhLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihlPlJhKXRocm93IG5ldyBSYW5nZUVycm9yKCJyZXF1ZXN0ZWQgdG9vIG1hbnkgcmFuZG9tIGJ5dGVzIik7dmFyIHI9Q2EuYWxsb2NVbnNhZmUoZSk7aWYoZT4wKWlmKGU+QWEpZm9yKHZhciBuPTA7bjxlO24rPUFhKVBhLmdldFJhbmRvbVZhbHVlcyhyLnNsaWNlKG4sbitBYSkpO2Vsc2UgUGEuZ2V0UmFuZG9tVmFsdWVzKHIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0KXJldHVybiBKZS5uZXh0VGljaygoZnVuY3Rpb24oKXt0KG51bGwscil9KSk7cmV0dXJuIHJ9OlNhLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuXG5Vc2UgQ2hyb21lLCBGaXJlZm94IG9yIEludGVybmV0IEV4cGxvcmVyIDExIil9O3ZhciBEYT1TYS5leHBvcnRzLE9hPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe28odGhpcyxlKX1yZXR1cm4gdShlLFt7a2V5OiJiYXNlNjRVUkxFbmNvZGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBibi5lbmNvZGUoZSkucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKS5yZXBsYWNlKC89L2csIiIpfX0se2tleToiYmFzZTY0VVJMRGVjb2RlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gYm4uZGVjb2RlKGUpLnRvU3RyaW5nKCl9fSx7a2V5OiJoYXNoU2hhMjU2Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gU3IuZnJvbSh4bigobmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoZSkpKX19LHtrZXk6ImdlbmVyYXRlUmFuZG9tQnl0ZXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBEYShlKX19LHtrZXk6InZlcmlmeUp3dCIsdmFsdWU6ZnVuY3Rpb24oZSx0LHIsbixhLGksbyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gYmEuYXBwbHkodGhpcyxhcmd1bWVudHMpfShlLChzPXtrZXlzOlt0XX0sX2EucHJvdG90eXBlLmdldEtleS5iaW5kKG5ldyBfYShzKSkpLHthbGdvcml0aG1zOnIsYXVkaWVuY2U6bixjbG9ja1RvbGVyYW5jZTpvLGlzc3VlcjphLHN1YmplY3Q6aX0pLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSghMCl9KSk7dmFyIHN9fV0pLGV9KCk7b3JpZ2luLFUuU2Vzc2lvblN0b3JhZ2U7dmFyIElhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtvKHRoaXMsZSksdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQ9dCx0aGlzLl9kYXRhTGF5ZXI9dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGF0YUxheWVyKCl9cmV0dXJuIHUoZSxbe2tleToicmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXt2YXIgdCxuLGEsaT10aGlzO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUubmV4dD0yLHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSgpO2Nhc2UgMjppZighKHQ9ZS5zZW50KS5yZWZyZXNoX3Rva2VuKXtlLm5leHQ9OTticmVha31yZXR1cm4gbj1wYXJzZUludCh0LmV4cGlyZXNfaW4pLGE9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gUyhpLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZWZyZXNoQWNjZXNzVG9rZW4oKTtjYXNlIDI6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX0pLDFlMyoobjw9MTA/bjpuLTEwKSksZS5uZXh0PTksdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoQyxKU09OLnN0cmluZ2lmeShhKSk7Y2FzZSA5OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9fSx7a2V5OiJjbGVhclJlZnJlc2hUb2tlblRpbWVvdXQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7dmFyIHQ7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoQyk7Y2FzZSAyOmlmKCFlLnNlbnQpe2UubmV4dD05O2JyZWFrfXJldHVybiBlLnQwPUpTT04sZS5uZXh0PTYsdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoQyk7Y2FzZSA2OmUudDE9ZS5zZW50LHQ9ZS50MC5wYXJzZS5jYWxsKGUudDAsZS50MSksY2xlYXJUaW1lb3V0KHQpO2Nhc2UgOTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsdGhpcyl9KSkpfX1dKSxlfSgpLExhPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG4oKXt2YXIgYSxpLG8scyx1LGMsZixsLGgscCxkLHYsZyx5LG0sdyxiLGsseCxfLEUsVCxBLFIsQyxQLEQsTyxJLEwsVSxILE0sajtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKG4pe2Zvcig7Oylzd2l0Y2gobi5wcmV2PW4ubmV4dCl7Y2FzZSAwOnJldHVybiBhPW5ldyBzcixpPW5ldyBPYSxvPW5ldyBKKGEsaSksbi5uZXh0PTUsby5pbml0aWFsaXplKGUpO2Nhc2UgNTppZihzPW5ldyBJYShvKSx1PXQobyxzKSxjPW8uZ2V0RGF0YUxheWVyKCksZj1vci5nZXRJbnN0YW5jZSgpLGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXt2YXIgbjtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOmlmKCEobj1PYmplY3QuYXNzaWduKHthdHRhY2hUb2tlbjohMH0sZSkpLmF0dGFjaFRva2VuKXt0Lm5leHQ9MjM7YnJlYWt9aWYoIW4uc2hvdWxkQXR0YWNoSURQQWNjZXNzVG9rZW4pe3QubmV4dD0xNDticmVha31yZXR1cm4gdC50MD1PYmplY3QsdC50MT1PYmplY3QuYXNzaWduKHt9LGUuaGVhZGVycyksdC50Mj0iQmVhcmVyICIsdC5uZXh0PTgsdS5nZXRJRFBBY2Nlc3NUb2tlbigpO2Nhc2UgODp0LnQzPXQuc2VudCx0LnQ0PXQudDIuY29uY2F0LmNhbGwodC50Mix0LnQzKSx0LnQ1PXtBdXRob3JpemF0aW9uOnQudDR9LGUuaGVhZGVycz10LnQwLmFzc2lnbi5jYWxsKHQudDAsdC50MSx0LnQ1KSx0Lm5leHQ9MjM7YnJlYWs7Y2FzZSAxNDpyZXR1cm4gdC50Nj1PYmplY3QsdC50Nz1PYmplY3QuYXNzaWduKHt9LGUuaGVhZGVycyksdC50OD0iQmVhcmVyICIsdC5uZXh0PTE5LHUuZ2V0QWNjZXNzVG9rZW4oKTtjYXNlIDE5OnQudDk9dC5zZW50LHQudDEwPXQudDguY29uY2F0LmNhbGwodC50OCx0LnQ5KSx0LnQxMT17QXV0aG9yaXphdGlvbjp0LnQxMH0sZS5oZWFkZXJzPXQudDYuYXNzaWduLmNhbGwodC50Nix0LnQ3LHQudDExKTtjYXNlIDIzOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCl9KSkpfSxuLnQwPW51bGw9PWY/dm9pZCAwOmYuaW5pdCwhbi50MCl7bi5uZXh0PTE0O2JyZWFrfXJldHVybiBuLm5leHQ9MTQsZi5pbml0KCEwLGwpO2Nhc2UgMTQ6cmV0dXJuIGg9ZnVuY3Rpb24oZSl7KG51bGw9PWY/dm9pZCAwOmYuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKSYmZi5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2soZSl9LHA9ZnVuY3Rpb24oZSl7KG51bGw9PWY/dm9pZCAwOmYuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2spJiZmLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpfSxkPWZ1bmN0aW9uKGUpeyhudWxsPT1mP3ZvaWQgMDpmLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2spJiZmLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2soZSl9LHY9ZnVuY3Rpb24oZSl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix1Lmh0dHBSZXF1ZXN0KGYsZSk7Y2FzZSAyOnJldHVybiB0LmFicnVwdCgicmV0dXJuIix0LnNlbnQpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKX0sZz1mdW5jdGlvbihlKXtyZXR1cm4gUyh2b2lkIDAsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gdCgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQubmV4dD0yLHUuaHR0cFJlcXVlc3RBbGwoZSxmKTtjYXNlIDI6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLHQuc2VudCk7Y2FzZSAzOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCl9KSkpfSx5PWZ1bmN0aW9uKCl7dS5lbmFibGVIdHRwSGFuZGxlcihmKX0sbT1mdW5jdGlvbigpe3UuZGlzYWJsZUh0dHBIYW5kbGVyKGYpfSx3PWZ1bmN0aW9uKGUpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsby5nZXRBdXRob3JpemF0aW9uVVJMKGUpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIG4sYSxpLHM7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gYT1uZXcgVVJMKGUpLGk9bnVsbCE9PShuPWEuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSkmJnZvaWQgMCE9PW4/bjoiIix0Lm5leHQ9NCxvLmdldFBLQ0VDb2RlKGkpO2Nhc2UgNDpyZXR1cm4gcz10LnNlbnQsdC5hYnJ1cHQoInJldHVybiIse2F1dGhvcml6YXRpb25VUkw6ZSxwa2NlOnN9KTtjYXNlIDY6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0KX0pKSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLnJlamVjdChlKX0pKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gdC5zdG9wKCl9fSksdCl9KSkpfSxiPWZ1bmN0aW9uKCl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBzLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHMucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLGUuYWJydXB0KCJyZXR1cm4iKTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSl9LGs9ZnVuY3Rpb24oZSx0LG4sYSl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGkoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLm5leHQ9Mix1LnJlcXVlc3RBY2Nlc3NUb2tlbihlLHQsdm9pZCAwLG4sYSk7Y2FzZSAyOnJldHVybiByLmFicnVwdCgicmV0dXJuIixyLnNlbnQpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLGkpfSkpKX0seD1mdW5jdGlvbigpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gcy5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSxlLm5leHQ9MyxvLnNpZ25PdXQoKTtjYXNlIDM6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGUuc2VudCk7Y2FzZSA0OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpfSxfPWZ1bmN0aW9uKCl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9MixvLmdldFNpZ25PdXRVUkwoKTtjYXNlIDI6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGUuc2VudCk7Y2FzZSAzOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpfSxFPWZ1bmN0aW9uKGUpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsdS5yZXF1ZXN0Q3VzdG9tR3JhbnQoZSk7Y2FzZSAyOnJldHVybiB0LmFicnVwdCgicmV0dXJuIix0LnNlbnQpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKX0sVD1mdW5jdGlvbigpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5wcmV2PTAsZS5uZXh0PTMsdS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtjYXNlIDM6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGUuc2VudCk7Y2FzZSA2OnJldHVybiBlLnByZXY9NixlLnQwPWUuY2F0Y2goMCksZS5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZWplY3QoZS50MCkpO2Nhc2UgOTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsbnVsbCxbWzAsNl1dKX0pKSl9LEE9ZnVuY3Rpb24oKXtyZXR1cm4gby5yZXZva2VBY2Nlc3NUb2tlbigpLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIHMuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCksUHJvbWlzZS5yZXNvbHZlKCEwKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfSkpfSxSPWZ1bmN0aW9uKCl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLmFicnVwdCgicmV0dXJuIix1LmdldEJhc2ljVXNlckluZm8oKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpfSxDPWZ1bmN0aW9uKCl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLmFicnVwdCgicmV0dXJuIix1LmdldERlY29kZWRJRFRva2VuKCkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUpfSkpKX0sUD1mdW5jdGlvbigpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsdS5nZXRDcnlwdG9IZWxwZXIoKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpfSxEPWZ1bmN0aW9uKCl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLmFicnVwdCgicmV0dXJuIix1LmdldERlY29kZWRJRFBJRFRva2VuKCkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUpfSkpKX0sTz1mdW5jdGlvbigpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsdS5nZXRJRFRva2VuKCkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUpfSkpKX0sST1mdW5jdGlvbigpe3JldHVybiBTKHZvaWQgMCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsdS5nZXRPSURDU2VydmljZUVuZHBvaW50cygpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSl9LEw9ZnVuY3Rpb24oKXtyZXR1cm4gdS5nZXRBY2Nlc3NUb2tlbigpfSxVPWZ1bmN0aW9uKCl7cmV0dXJuIHUuaXNBdXRoZW50aWNhdGVkKCl9LEg9ZnVuY3Rpb24oZSl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9MixjLnNldFNlc3Npb25EYXRhUGFyYW1ldGVyKCJzZXNzaW9uX3N0YXRlIixlKTtjYXNlIDI6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iKTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0KX0pKSl9LE09ZnVuY3Rpb24oZSl7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9MixvLnVwZGF0ZUNvbmZpZyhlKTtjYXNlIDI6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iKTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0KX0pKSl9LGo9ZnVuY3Rpb24oKXtyZXR1cm4gUyh2b2lkIDAsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLGMuZ2V0Q29uZmlnRGF0YSgpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSl9LG4uYWJydXB0KCJyZXR1cm4iLHtkaXNhYmxlSHR0cEhhbmRsZXI6bSxlbmFibGVIdHRwSGFuZGxlcjp5LGdldEFjY2Vzc1Rva2VuOkwsZ2V0QXV0aG9yaXphdGlvblVSTDp3LGdldEJhc2ljVXNlckluZm86UixnZXRDb25maWdEYXRhOmosZ2V0Q3J5cHRvSGVscGVyOlAsZ2V0RGVjb2RlZElEUElEVG9rZW46RCxnZXREZWNvZGVkSURUb2tlbjpDLGdldElEVG9rZW46TyxnZXRPSURDU2VydmljZUVuZHBvaW50czpJLGdldFNpZ25PdXRVUkw6XyxodHRwUmVxdWVzdDp2LGh0dHBSZXF1ZXN0QWxsOmcsaXNBdXRoZW50aWNhdGVkOlUscmVmcmVzaEFjY2Vzc1Rva2VuOlQscmVxdWVzdEFjY2Vzc1Rva2VuOmsscmVxdWVzdEN1c3RvbUdyYW50OkUscmV2b2tlQWNjZXNzVG9rZW46QSxzZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrOmQsc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrOmgsc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s6cCxzZXRTZXNzaW9uU3RhdGU6SCxzaWduT3V0Ongsc3RhcnRBdXRvUmVmcmVzaFRva2VuOmIsdXBkYXRlQ29uZmlnOk19KTtjYXNlIDQxOmNhc2UiZW5kIjpyZXR1cm4gbi5zdG9wKCl9fSksbil9KSkpfSxVYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxyKXtvKHRoaXMsZSksdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQ9dCx0aGlzLl9kYXRhTGF5ZXI9dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGF0YUxheWVyKCksdGhpcy5fc3BhSGVscGVyPXJ9cmV0dXJuIHUoZSxbe2tleToiZW5hYmxlSHR0cEhhbmRsZXIiLHZhbHVlOmZ1bmN0aW9uKGUpeyhudWxsPT1lP3ZvaWQgMDplLmVuYWJsZUhhbmRsZXIpJiZlLmVuYWJsZUhhbmRsZXIoKX19LHtrZXk6ImRpc2FibGVIdHRwSGFuZGxlciIsdmFsdWU6ZnVuY3Rpb24oZSl7KG51bGw9PWU/dm9pZCAwOmUuZGlzYWJsZUhhbmRsZXIpJiZlLmRpc2FibGVIYW5kbGVyKCl9fSx7a2V5OiJpbml0aWFsaXplU2Vzc2lvbk1hbmdlciIsdmFsdWU6ZnVuY3Rpb24oZSx0LHIsbixhKXt2YXIgaSxvLHM7YS5pbml0aWFsaXplKGUuY2xpZW50SUQsbnVsbCE9PShpPXQuY2hlY2tTZXNzaW9uSWZyYW1lKSYmdm9pZCAwIT09aT9pOiIiLHIsbnVsbCE9PShvPWUuY2hlY2tTZXNzaW9uSW50ZXJ2YWwpJiZ2b2lkIDAhPT1vP286MyxudWxsIT09KHM9ZS5zZXNzaW9uUmVmcmVzaEludGVydmFsKSYmdm9pZCAwIT09cz9zOjMwMCxlLnNpZ25JblJlZGlyZWN0VVJMLG4pfX0se2tleToicmVxdWVzdEN1c3RvbUdyYW50Iix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuLGEsaTtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG8oKXt2YXIgcyx1LGMsZixsLGg9dGhpcztyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKG8pe2Zvcig7Oylzd2l0Y2goby5wcmV2PW8ubmV4dCl7Y2FzZSAwOmlmKHM9ITAsdT0hMSwhKG51bGw9PWU/dm9pZCAwOmUudG9rZW5FbmRwb2ludCkpe28ubmV4dD0zOTticmVha31yZXR1cm4gcz0hMSxjPTAsby50MD1bXSxvLnQxPWIsby5uZXh0PTksdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtjYXNlIDk6aWYoby50ND1uPW8uc2VudCxvLnQzPW51bGw9PT1vLnQ0LG8udDMpe28ubmV4dD0xMzticmVha31vLnQzPXZvaWQgMD09PW47Y2FzZSAxMzppZighby50Myl7by5uZXh0PTE3O2JyZWFrfW8udDU9dm9pZCAwLG8ubmV4dD0xODticmVhaztjYXNlIDE3Om8udDU9bi5yZXNvdXJjZVNlcnZlclVSTHM7Y2FzZSAxODppZihvLnQ2PWE9by50NSxvLnQyPW51bGwhPT1vLnQ2LCFvLnQyKXtvLm5leHQ9MjI7YnJlYWt9by50Mj12b2lkIDAhPT1hO2Nhc2UgMjI6aWYoIW8udDIpe28ubmV4dD0yNjticmVha31vLnQ3PWEsby5uZXh0PTI3O2JyZWFrO2Nhc2UgMjY6by50Nz1bXTtjYXNlIDI3Om8udDg9by50NyxvLnQ5PSgwLG8udDEpKG8udDgpLG8udDEwPVtlLmJhc2VVcmxdLGY9by50MC5jb25jYXQuY2FsbChvLnQwLG8udDksby50MTApO2Nhc2UgMzE6aWYoIShjPGYubGVuZ3RoKSl7by5uZXh0PTM5O2JyZWFrfWlmKCEobD1mW2NdKXx8IShudWxsPT09KGk9ZS50b2tlbkVuZHBvaW50KXx8dm9pZCAwPT09aT92b2lkIDA6aS5zdGFydHNXaXRoKGwpKSl7by5uZXh0PTM2O2JyZWFrfXJldHVybiB1PSEwLG8uYWJydXB0KCJicmVhayIsMzkpO2Nhc2UgMzY6YysrLG8ubmV4dD0zMTticmVhaztjYXNlIDM5OmlmKGUuc2hvdWxkUmVwbGF5QWZ0ZXJSZWZyZXNoJiZ0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihZLEpTT04uc3RyaW5naWZ5KGUpKSwhcyYmIXUpe28ubmV4dD00NDticmVha31yZXR1cm4gby5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQucmVxdWVzdEN1c3RvbUdyYW50KGUpLnRoZW4oKGZ1bmN0aW9uKG4pe3JldHVybiBTKGgsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gYSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6aWYodCYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQoZSksIWUucmV0dXJuc1Nlc3Npb24pe3IubmV4dD02O2JyZWFrfXJldHVybiB0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLHIuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKSk7Y2FzZSA2OnJldHVybiByLmFicnVwdCgicmV0dXJuIixuKTtjYXNlIDc6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxhLHRoaXMpfSkpKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfSkpKTtjYXNlIDQ0OnJldHVybiBvLmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlamVjdChuZXcgSSgiU1BBLU1BSU5fVEhSRUFEX0NMSUVOVC1SQ0ctSVYwMSIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIHRva2VuIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIikpKTtjYXNlIDQ1OmNhc2UiZW5kIjpyZXR1cm4gby5zdG9wKCl9fSksbyx0aGlzKX0pKSl9fSx7a2V5OiJnZXRDdXN0b21HcmFudENvbmZpZ0RhdGEiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7dmFyIHQ7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5uZXh0PTIsdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoWSk7Y2FzZSAyOmlmKCEodD1lLnNlbnQpKXtlLm5leHQ9NzticmVha31yZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsSlNPTi5wYXJzZSh0KSk7Y2FzZSA3OnJldHVybiBlLmFicnVwdCgicmV0dXJuIixudWxsKTtjYXNlIDg6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX19LHtrZXk6InJlZnJlc2hBY2Nlc3NUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIG47cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5wcmV2PTAsdC5uZXh0PTMsdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQucmVmcmVzaEFjY2Vzc1Rva2VuKCk7Y2FzZSAzOnJldHVybiB0Lm5leHQ9NSx0aGlzLmdldEN1c3RvbUdyYW50Q29uZmlnRGF0YSgpO2Nhc2UgNTppZighKG49dC5zZW50KSl7dC5uZXh0PTk7YnJlYWt9cmV0dXJuIHQubmV4dD05LHRoaXMucmVxdWVzdEN1c3RvbUdyYW50KG4sZSk7Y2FzZSA5OnJldHVybiB0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLHQuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKSk7Y2FzZSAxMzpyZXR1cm4gdC5wcmV2PTEzLHQudDA9dC5jYXRjaCgwKSx0LmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlamVjdCh0LnQwKSk7Y2FzZSAxNjpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyxbWzAsMTNdXSl9KSkpfX0se2tleToiaHR0cFJlcXVlc3QiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGEsaSxvKXt2YXIgcyx1O3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gYygpe3ZhciBmLGwsaCxwLGQsdj10aGlzO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oYyl7Zm9yKDs7KXN3aXRjaChjLnByZXY9Yy5uZXh0KXtjYXNlIDA6cmV0dXJuIGY9ITEsYy5uZXh0PTMsdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtjYXNlIDM6cmV0dXJuIGw9Yy5zZW50LGg9MCxjLnQwPVtdLGMudDE9YixjLm5leHQ9OSxudWxsPT1sP3ZvaWQgMDpsLnJlc291cmNlU2VydmVyVVJMcztjYXNlIDk6aWYoYy50Mz1zPWMuc2VudCxjLnQyPW51bGwhPT1jLnQzLCFjLnQyKXtjLm5leHQ9MTM7YnJlYWt9Yy50Mj12b2lkIDAhPT1zO2Nhc2UgMTM6aWYoIWMudDIpe2MubmV4dD0xNzticmVha31jLnQ0PXMsYy5uZXh0PTE4O2JyZWFrO2Nhc2UgMTc6Yy50ND1bXTtjYXNlIDE4OmMudDU9Yy50NCxjLnQ2PSgwLGMudDEpKGMudDUpLGMudDc9W2wuYmFzZVVybF0scD1jLnQwLmNvbmNhdC5jYWxsKGMudDAsYy50NixjLnQ3KTtjYXNlIDIyOmlmKCEoaDxwLmxlbmd0aCkpe2MubmV4dD0zMDticmVha31pZighKGQ9cFtoXSl8fCEobnVsbD09PSh1PW51bGw9PXQ/dm9pZCAwOnQudXJsKXx8dm9pZCAwPT09dT92b2lkIDA6dS5zdGFydHNXaXRoKGQpKSl7Yy5uZXh0PTI3O2JyZWFrfXJldHVybiBmPSEwLGMuYWJydXB0KCJicmVhayIsMzApO2Nhc2UgMjc6aCsrLGMubmV4dD0yMjticmVhaztjYXNlIDMwOmlmKCFmKXtjLm5leHQ9MzQ7YnJlYWt9cmV0dXJuIGMuYWJydXB0KCJyZXR1cm4iLGUucmVxdWVzdCh0KS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpfSkpLmNhdGNoKChmdW5jdGlvbihzKXtyZXR1cm4gUyh2LHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHUoKXt2YXIgYyxmLGwsaCxwO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6aWYoNDAxIT09KG51bGw9PT0oYz1udWxsPT1zP3ZvaWQgMDpzLnJlc3BvbnNlKXx8dm9pZCAwPT09Yz92b2lkIDA6Yy5zdGF0dXMpJiYobnVsbD09cz92b2lkIDA6cy5yZXNwb25zZSkpe3IubmV4dD0zMTticmVha31yZXR1cm4gci5wcmV2PTEsci5uZXh0PTQsdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4obyk7Y2FzZSA0Omg9ci5zZW50LHIubmV4dD0xNTticmVhaztjYXNlIDc6aWYoci5wcmV2PTcsci50MD1yLmNhdGNoKDEpLCFuKXtyLm5leHQ9MTQ7YnJlYWt9aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGEpe3IubmV4dD0xMzticmVha31yZXR1cm4gci5uZXh0PTEzLGEoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtjb2RlOlZ9KSk7Y2FzZSAxMzoiZnVuY3Rpb24iPT10eXBlb2YgaSYmaSgpO2Nhc2UgMTQ6dGhyb3cgbmV3IEkoIlNQQS1BVVRIX0hFTFBFUi1IUi1TRTAxIixudWxsIT09KGY9bnVsbD09PXIudDB8fHZvaWQgMD09PXIudDA/dm9pZCAwOnIudDAubmFtZSkmJnZvaWQgMCE9PWY/ZjoiUmVmcmVzaCB0b2tlbiByZXF1ZXN0IGZhaWxlZC4iLG51bGwhPT0obD1udWxsPT09ci50MHx8dm9pZCAwPT09ci50MD92b2lkIDA6ci50MC5tZXNzYWdlKSYmdm9pZCAwIT09bD9sOiJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcmVmcmVzaCB0aGUgYWNjZXNzIHRva2VuIGZvbGxvd2luZyBhIDQwMSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuIik7Y2FzZSAxNTppZighaCl7ci5uZXh0PTMxO2JyZWFrfXJldHVybiByLnByZXY9MTYsci5uZXh0PTE5LGUucmVxdWVzdCh0KTtjYXNlIDE5OnJldHVybiBwPXIuc2VudCxyLmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlc29sdmUocCkpO2Nhc2UgMjM6aWYoci5wcmV2PTIzLHIudDE9ci5jYXRjaCgxNiksIW4pe3IubmV4dD0zMDticmVha31pZigiZnVuY3Rpb24iIT10eXBlb2YgYSl7ci5uZXh0PTI5O2JyZWFrfXJldHVybiByLm5leHQ9MjksYShyLnQxKTtjYXNlIDI5OiJmdW5jdGlvbiI9PXR5cGVvZiBpJiZpKCk7Y2FzZSAzMDpyZXR1cm4gci5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZWplY3Qoci50MSkpO2Nhc2UgMzE6aWYoIW4pe3IubmV4dD0zNjticmVha31pZigiZnVuY3Rpb24iIT10eXBlb2YgYSl7ci5uZXh0PTM1O2JyZWFrfXJldHVybiByLm5leHQ9MzUsYShzKTtjYXNlIDM1OiJmdW5jdGlvbiI9PXR5cGVvZiBpJiZpKCk7Y2FzZSAzNjpyZXR1cm4gci5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZWplY3QocykpO2Nhc2UgMzc6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSx1LHRoaXMsW1sxLDddLFsxNiwyM11dKX0pKSl9KSkpO2Nhc2UgMzQ6cmV0dXJuIGMuYWJydXB0KCJyZXR1cm4iLFByb21pc2UucmVqZWN0KG5ldyBJKCJTUEEtQVVUSF9IRUxQRVItSFItSVYwMiIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIikpKTtjYXNlIDM1OmNhc2UiZW5kIjpyZXR1cm4gYy5zdG9wKCl9fSksYyx0aGlzKX0pKSl9fSx7a2V5OiJodHRwUmVxdWVzdEFsbCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4sYSxpKXt2YXIgbyxzLHU7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBjKCl7dmFyIGYsbCxoLHAsZCx2LGcseSxtLHcsaz10aGlzO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oYyl7Zm9yKDs7KXN3aXRjaChjLnByZXY9Yy5uZXh0KXtjYXNlIDA6cmV0dXJuIGY9ITAsYy5uZXh0PTMsdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtjYXNlIDM6bD1jLnNlbnQsaD1fKGUpLGMucHJldj01LGgucygpO2Nhc2UgNzppZigocD1oLm4oKSkuZG9uZSl7Yy5uZXh0PTUwO2JyZWFrfXJldHVybiBkPXAudmFsdWUsdj0hMSxnPTAsYy50MD1bXSxjLnQxPWIsYy5uZXh0PTE1LGw7Y2FzZSAxNTppZihjLnQ0PW89Yy5zZW50LGMudDM9bnVsbD09PWMudDQsYy50Myl7Yy5uZXh0PTE5O2JyZWFrfWMudDM9dm9pZCAwPT09bztjYXNlIDE5OmlmKCFjLnQzKXtjLm5leHQ9MjM7YnJlYWt9Yy50NT12b2lkIDAsYy5uZXh0PTI0O2JyZWFrO2Nhc2UgMjM6Yy50NT1vLnJlc291cmNlU2VydmVyVVJMcztjYXNlIDI0OmlmKGMudDY9cz1jLnQ1LGMudDI9bnVsbCE9PWMudDYsIWMudDIpe2MubmV4dD0yODticmVha31jLnQyPXZvaWQgMCE9PXM7Y2FzZSAyODppZighYy50Mil7Yy5uZXh0PTMyO2JyZWFrfWMudDc9cyxjLm5leHQ9MzM7YnJlYWs7Y2FzZSAzMjpjLnQ3PVtdO2Nhc2UgMzM6Yy50OD1jLnQ3LGMudDk9KDAsYy50MSkoYy50OCksYy50MTA9W2wuYmFzZVVybF0seT1jLnQwLmNvbmNhdC5jYWxsKGMudDAsYy50OSxjLnQxMCk7Y2FzZSAzNzppZighKGc8eS5sZW5ndGgpKXtjLm5leHQ9NDU7YnJlYWt9aWYoIShtPXlbZ10pfHwhKG51bGw9PT0odT1kLnVybCl8fHZvaWQgMD09PXU/dm9pZCAwOnUuc3RhcnRzV2l0aChtKSkpe2MubmV4dD00MjticmVha31yZXR1cm4gdj0hMCxjLmFicnVwdCgiYnJlYWsiLDQ1KTtjYXNlIDQyOmcrKyxjLm5leHQ9Mzc7YnJlYWs7Y2FzZSA0NTppZih2KXtjLm5leHQ9NDg7YnJlYWt9cmV0dXJuIGY9ITEsYy5hYnJ1cHQoImJyZWFrIiw1MCk7Y2FzZSA0ODpjLm5leHQ9NzticmVhaztjYXNlIDUwOmMubmV4dD01NTticmVhaztjYXNlIDUyOmMucHJldj01MixjLnQxMT1jLmNhdGNoKDUpLGguZShjLnQxMSk7Y2FzZSA1NTpyZXR1cm4gYy5wcmV2PTU1LGguZigpLGMuZmluaXNoKDU1KTtjYXNlIDU4OmlmKHc9W10sIWYpe2MubmV4dD02NDticmVha31yZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt3LnB1c2godC5yZXF1ZXN0KGUpKX0pKSxjLmFicnVwdCgicmV0dXJuIiwobnVsbD09dD92b2lkIDA6dC5hbGwpJiZ0LmFsbCh3KS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtyZXR1cm4gUyhrLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG8oKXt2YXIgcyx1LGMsZixsPXRoaXM7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihvKXtmb3IoOzspc3dpdGNoKG8ucHJldj1vLm5leHQpe2Nhc2UgMDppZig0MDEhPT0obnVsbD09PShzPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLnN0YXR1cykmJihudWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKSl7by5uZXh0PTE3O2JyZWFrfXJldHVybiBvLnByZXY9MSxvLm5leHQ9NCx0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZWZyZXNoQWNjZXNzVG9rZW4oKTtjYXNlIDQ6Zj1vLnNlbnQsby5uZXh0PTE1O2JyZWFrO2Nhc2UgNzppZihvLnByZXY9NyxvLnQwPW8uY2F0Y2goMSksIW4pe28ubmV4dD0xNDticmVha31pZigiZnVuY3Rpb24iIT10eXBlb2YgYSl7by5uZXh0PTEzO2JyZWFrfXJldHVybiBvLm5leHQ9MTMsYShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkse2NvZGU6Vn0pKTtjYXNlIDEzOiJmdW5jdGlvbiI9PXR5cGVvZiBpJiZpKCk7Y2FzZSAxNDp0aHJvdyBuZXcgSSgiU1BBLUFVVEhfSEVMUEVSLUhSQS1TRTAxIixudWxsIT09KHU9bnVsbD09PW8udDB8fHZvaWQgMD09PW8udDA/dm9pZCAwOm8udDAubmFtZSkmJnZvaWQgMCE9PXU/dToiUmVmcmVzaCB0b2tlbiByZXF1ZXN0IGZhaWxlZC4iLG51bGwhPT0oYz1udWxsPT09by50MHx8dm9pZCAwPT09by50MD92b2lkIDA6by50MC5tZXNzYWdlKSYmdm9pZCAwIT09Yz9jOiJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcmVmcmVzaCB0aGUgYWNjZXNzIHRva2VuIGZvbGxvd2luZyBhIDQwMSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuIik7Y2FzZSAxNTppZighZil7by5uZXh0PTE3O2JyZWFrfXJldHVybiBvLmFicnVwdCgicmV0dXJuIix0LmFsbCYmdC5hbGwodykudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIFMobCx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiB0KCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDppZighbil7dC5uZXh0PTU7YnJlYWt9aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGEpe3QubmV4dD00O2JyZWFrfXJldHVybiB0Lm5leHQ9NCxhKGUpO2Nhc2UgNDoiZnVuY3Rpb24iPT10eXBlb2YgaSYmaSgpO2Nhc2UgNTpyZXR1cm4gdC5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZWplY3QoZSkpO2Nhc2UgNjpjYXNlImVuZCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKX0pKSk7Y2FzZSAxNzppZighbil7by5uZXh0PTIyO2JyZWFrfWlmKCJmdW5jdGlvbiIhPXR5cGVvZiBhKXtvLm5leHQ9MjE7YnJlYWt9cmV0dXJuIG8ubmV4dD0yMSxhKGUpO2Nhc2UgMjE6ImZ1bmN0aW9uIj09dHlwZW9mIGkmJmkoKTtjYXNlIDIyOnJldHVybiBvLmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlamVjdChlKSk7Y2FzZSAyMzpjYXNlImVuZCI6cmV0dXJuIG8uc3RvcCgpfX0pLG8sdGhpcyxbWzEsN11dKX0pKSl9KSkpO2Nhc2UgNjQ6dGhyb3cgbmV3IEkoIlNQQS1BVVRIX0hFTFBFUi1IUkEtSVYwMiIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIik7Y2FzZSA2NTpjYXNlImVuZCI6cmV0dXJuIGMuc3RvcCgpfX0pLGMsdGhpcyxbWzUsNTIsNTUsNThdXSl9KSkpfX0se2tleToicmVxdWVzdEFjY2Vzc1Rva2VuIix2YWx1ZTpmdW5jdGlvbihlLHQsbixhLGkpe3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gbygpe3ZhciBzLHUsYz10aGlzO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24obyl7Zm9yKDs7KXN3aXRjaChvLnByZXY9by5uZXh0KXtjYXNlIDA6cmV0dXJuIG8ubmV4dD0yLHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCk7Y2FzZSAyOmlmKChzPW8uc2VudCkuc3RvcmFnZSE9PVUuQnJvd3Nlck1lbW9yeXx8IXMuZW5hYmxlUEtDRXx8IXQpe28ubmV4dD05O2JyZWFrfXJldHVybiB1PWNyLmdldFBLQ0UoTC5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKHQpKSxvLm5leHQ9Nyx0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5zZXRQS0NFQ29kZShMLmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0odCksdSk7Y2FzZSA3Om8ubmV4dD0xMjticmVhaztjYXNlIDk6aWYocy5zdG9yYWdlIT09VS5XZWJXb3JrZXJ8fCFhKXtvLm5leHQ9MTI7YnJlYWt9cmV0dXJuIG8ubmV4dD0xMix0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5zZXRQS0NFQ29kZShhLG51bGwhPWk/aToiIik7Y2FzZSAxMjppZighZSl7by5uZXh0PTE0O2JyZWFrfXJldHVybiBvLmFicnVwdCgicmV0dXJuIix0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZXF1ZXN0QWNjZXNzVG9rZW4oZSxudWxsIT10P3Q6IiIsbnVsbCE9aT9pOiIiKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBTKGMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYocy5zdG9yYWdlPT09VS5XZWJXb3JrZXIpe2UubmV4dD0xMDticmVha31yZXR1cm4gZS50MD1jcixlLm5leHQ9NCx0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRTaWduT3V0VVJMKCk7Y2FzZSA0OmUudDE9ZS5zZW50LGUudDAuc2V0U2lnbk91dFVSTC5jYWxsKGUudDAsZS50MSksdGhpcy5fc3BhSGVscGVyJiYodGhpcy5fc3BhSGVscGVyLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHRoaXMuX3NwYUhlbHBlci5yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KCkpLG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZzLmVuYWJsZU9JRENTZXNzaW9uTWFuYWdlbWVudCYmbigpLGUubmV4dD0xMTticmVhaztjYXNlIDEwOnRoaXMuX3NwYUhlbHBlciYmdGhpcy5fc3BhSGVscGVyLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoKTtjYXNlIDExOnJldHVybiBlLmFicnVwdCgicmV0dXJuIix0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRCYXNpY1VzZXJJbmZvKCkpO2Nhc2UgMTI6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfSkpKTtjYXNlIDE0OnJldHVybiBvLmFicnVwdCgicmV0dXJuIixQcm9taXNlLnJlamVjdChuZXcgSSgiU1BBLUFVVEhfSEVMUEVSLVJBVDEtTkYwMSIsIk5vIGF1dGhvcml6YXRpb24gY29kZS4iLCJObyBhdXRob3JpemF0aW9uIGNvZGUgd2FzIGZvdW5kLiIpKSk7Y2FzZSAxNTpjYXNlImVuZCI6cmV0dXJuIG8uc3RvcCgpfX0pLG8sdGhpcyl9KSkpfX0se2tleToidHJ5U2lnbkluU2lsZW50bHkiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgYTtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGkoKXt2YXIgbyxzLHUsYz10aGlzO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oaSl7Zm9yKDs7KXN3aXRjaChpLnByZXY9aS5uZXh0KXtjYXNlIDA6aWYoIWNyLmlzSW5pdGlhbGl6ZWRTaWxlbnRTaWduSW4oKSl7aS5uZXh0PTQ7YnJlYWt9cmV0dXJuIGkubmV4dD0zLG4ucmVjZWl2ZVByb21wdE5vbmVSZXNwb25zZSgpO2Nhc2UgMzpyZXR1cm4gaS5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZXNvbHZlKHthbGxvd2VkU2NvcGVzOiIiLGRpc3BsYXlOYW1lOiIiLGVtYWlsOiIiLHNlc3Npb25TdGF0ZToiIixzdWI6IiIsdGVuYW50RG9tYWluOiIiLHVzZXJuYW1lOiIifSkpO2Nhc2UgNDpyZXR1cm4gbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicnBJRnJhbWUiKSxzPW51bGw9PT0oYT1udWxsPT1vP3ZvaWQgMDpvLmNvbnRlbnREb2N1bWVudCl8fHZvaWQgMD09PWE/dm9pZCAwOmEuZ2V0RWxlbWVudEJ5SWQoInByb21wdE5vbmVJRnJhbWUiKSxpLnByZXY9NixpLm5leHQ9OSxlKCk7Y2FzZSA5OnU9aS5zZW50LHMuc3JjPXUsaS5uZXh0PTE2O2JyZWFrO2Nhc2UgMTM6cmV0dXJuIGkucHJldj0xMyxpLnQwPWkuY2F0Y2goNiksaS5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZWplY3QoaS50MCkpO2Nhc2UgMTY6cmV0dXJuIGkuYWJydXB0KCJyZXR1cm4iLG5ldyBQcm9taXNlKChmdW5jdGlvbihlLG4pe3ZhciBhPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZSghMSl9KSwxZTQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoZnVuY3Rpb24gaShvKXtyZXR1cm4gUyhjLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHMoKXt2YXIgdSxjLGYsbCxoO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6ImNoZWNrX3Nlc3Npb25fc2lnbmVkX291dCI9PShudWxsPT0oaD1vLmRhdGEpP3ZvaWQgMDpoLnR5cGUpJiYod2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGkpLGNsZWFyVGltZW91dChhKSxlKCExKSksImNoZWNrX3Nlc3Npb25fc2lnbmVkX2luIj09KG51bGw9PWg/dm9pZCAwOmgudHlwZSkmJihudWxsPT09KHU9bnVsbD09aD92b2lkIDA6aC5kYXRhKXx8dm9pZCAwPT09dT92b2lkIDA6dS5jb2RlKSYmdChudWxsPT09KGM9bnVsbD09aD92b2lkIDA6aC5kYXRhKXx8dm9pZCAwPT09Yz92b2lkIDA6Yy5jb2RlLG51bGw9PT0oZj1udWxsPT1oP3ZvaWQgMDpoLmRhdGEpfHx2b2lkIDA9PT1mP3ZvaWQgMDpmLnNlc3Npb25TdGF0ZSxudWxsPT09KGw9bnVsbD09aD92b2lkIDA6aC5kYXRhKXx8dm9pZCAwPT09bD92b2lkIDA6bC5zdGF0ZSkudGhlbigoZnVuY3Rpb24odCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGkpLGUodCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixpKSxuKGUpfSkpLmZpbmFsbHkoKGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGEpfSkpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0pLHMpfSkpKX0pKX0pKSk7Y2FzZSAxNzpjYXNlImVuZCI6cmV0dXJuIGkuc3RvcCgpfX0pLGksbnVsbCxbWzYsMTNdXSl9KSkpfX0se2tleToiaGFuZGxlU2lnbkluIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBhKCl7dmFyIGksbyxzLHUsYztyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpO2Nhc2UgMjpyZXR1cm4gaT1yLnNlbnQsci5uZXh0PTUsZSgpO2Nhc2UgNTppZighci5zZW50KXtyLm5leHQ9NzticmVha31yZXR1cm4gci5hYnJ1cHQoInJldHVybiIsUHJvbWlzZS5yZXNvbHZlKHthbGxvd2VkU2NvcGVzOiIiLGRpc3BsYXlOYW1lOiIiLGVtYWlsOiIiLHNlc3Npb25TdGF0ZToiIixzdWI6IiIsdGVuYW50RG9tYWluOiIiLHVzZXJuYW1lOiIifSkpO2Nhc2UgNzppZihpLnN0b3JhZ2U9PT1VLldlYldvcmtlcil7ci5uZXh0PTE5O2JyZWFrfXJldHVybiByLm5leHQ9MTAsdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuaXNBdXRoZW50aWNhdGVkKCk7Y2FzZSAxMDppZighci5zZW50KXtyLm5leHQ9MTk7YnJlYWt9cmV0dXJuIHRoaXMuX3NwYUhlbHBlci5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSx0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLGkuZW5hYmxlT0lEQ1Nlc3Npb25NYW5hZ2VtZW50JiZ0KCksci50MD1Qcm9taXNlLHIubmV4dD0xNyx0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRCYXNpY1VzZXJJbmZvKCk7Y2FzZSAxNzpyZXR1cm4gci50MT1yLnNlbnQsci5hYnJ1cHQoInJldHVybiIsci50MC5yZXNvbHZlLmNhbGwoci50MCxyLnQxKSk7Y2FzZSAxOTppZihvPW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoVykscz1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KHopLCFvKXtyLm5leHQ9Mjc7YnJlYWt9dGhyb3codT1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSkuc2VhcmNoUGFyYW1zLmRlbGV0ZShXKSx1LnNlYXJjaFBhcmFtcy5kZWxldGUoeiksaGlzdG9yeS5wdXNoU3RhdGUobnVsbCxkb2N1bWVudC50aXRsZSx1LnRvU3RyaW5nKCkpLG5ldyBJKCJTUEEtQVVUSF9IRUxQRVItU0ktU0UwMSIsbyxudWxsIT1zP3M6IiIpO2Nhc2UgMjc6aWYoaS5zdG9yYWdlIT09VS5XZWJXb3JrZXJ8fCFuKXtyLm5leHQ9MzM7YnJlYWt9cmV0dXJuIHIubmV4dD0zMCxuKCk7Y2FzZSAzMDppZighKGM9ci5zZW50KSl7ci5uZXh0PTMzO2JyZWFrfXJldHVybiByLmFicnVwdCgicmV0dXJuIixjKTtjYXNlIDMzOmNhc2UiZW5kIjpyZXR1cm4gci5zdG9wKCl9fSksYSx0aGlzKX0pKSl9fSx7a2V5OiJnZXRCYXNpY1VzZXJJbmZvIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9fSx7a2V5OiJnZXREZWNvZGVkSURUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLmFicnVwdCgicmV0dXJuIix0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXREZWNvZGVkSURUb2tlbigpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX19LHtrZXk6ImdldERlY29kZWRJRFBJRFRva2VuIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldERlY29kZWRJRFRva2VuKCkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsdGhpcyl9KSkpfX0se2tleToiZ2V0Q3J5cHRvSGVscGVyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldENyeXB0b0hlbHBlcigpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX19LHtrZXk6ImdldElEVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0SURUb2tlbigpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX19LHtrZXk6ImdldE9JRENTZXJ2aWNlRW5kcG9pbnRzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCkpO2Nhc2UgMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsdGhpcyl9KSkpfX0se2tleToiZ2V0QWNjZXNzVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIFModGhpcyx2b2lkIDAsdm9pZCAwLHIoKS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QWNjZXNzVG9rZW4oKSk7Y2FzZSAxOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSx0aGlzKX0pKSl9fSx7a2V5OiJnZXRJRFBBY2Nlc3NUb2tlbiIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gUyh0aGlzLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIHQoKXtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0Lm5leHQ9Mix0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKTtjYXNlIDI6aWYodC50MT1lPXQuc2VudCx0LnQwPW51bGw9PT10LnQxLHQudDApe3QubmV4dD02O2JyZWFrfXQudDA9dm9pZCAwPT09ZTtjYXNlIDY6aWYoIXQudDApe3QubmV4dD0xMDticmVha310LnQyPXZvaWQgMCx0Lm5leHQ9MTE7YnJlYWs7Y2FzZSAxMDp0LnQyPWUuYWNjZXNzX3Rva2VuO2Nhc2UgMTE6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLHQudDIpO2Nhc2UgMTI6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0LHRoaXMpfSkpKX19LHtrZXk6ImdldERhdGFMYXllciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YUxheWVyfX0se2tleToiaXNBdXRoZW50aWNhdGVkIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBTKHRoaXMsdm9pZCAwLHZvaWQgMCxyKCkubWFyaygoZnVuY3Rpb24gZSgpe3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmlzQXV0aGVudGljYXRlZCgpKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKX19XSksZX0oKTshZnVuY3Rpb24oZSl7dmFyIHQsbj1zZWxmO24ub25tZXNzYWdlPWZ1bmN0aW9uKG4pe3ZhciBzPW4uZGF0YSx1PW4ucG9ydHM7cmV0dXJuIFModm9pZCAwLHZvaWQgMCx2b2lkIDAscigpLm1hcmsoKGZ1bmN0aW9uIG4oKXt2YXIgYyxmLGwsaCxwLGQ7cmV0dXJuIHIoKS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDppZihwPXVbMF0scy50eXBlPT09Qnx8dCl7ci5uZXh0PTQ7YnJlYWt9cmV0dXJuIHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShuZXcgSSgiU1BBLUNMSUVOVF9XT1JLRVItT05NU0ctTkYwMSIsIlRoZSB3ZWIgd29ya2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuIiwiVGhlIGluaXRpYWxpemUgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gY2FuIGJlIGNhcnJpZWQgb3V0LiIpKSksci5hYnJ1cHQoInJldHVybiIpO2Nhc2UgNDpyLnQwPXMudHlwZSxyLm5leHQ9ci50MD09PUI/NzoiZ2V0X2F1dGhfdXJsIj09PXIudDA/MjI6InJlcXVlc3RfZ2V0X3Rva2VuIj09PXIudDA/MjQ6Imh0dHAtcmVxdWVzdCI9PT1yLnQwPzI2OiJodHRwLXJlcXVlc3QtYWxsIj09PXIudDA/Mjg6InNpZ24tb3V0Ij09PXIudDA/MzA6InJlcXVlc3QtY3VzdG9tLWdyYW50Ij09PXIudDA/NDQ6InJldm9rZS1hY2Nlc3MtdG9rZW4iPT09ci50MD80NjoiZ2V0LW9pZGMtc2VydmljZS1lbmRwb2ludHMiPT09ci50MD80ODoiZ2V0LWJhc2ljLXVzZXItaW5mbyI9PT1yLnQwPzYyOiJnZXQtZGVjb2RlZC1pZC10b2tlbiI9PT1yLnQwPzc2OiJnZXQtY3J5cHRvLWhlbHBlciI9PT1yLnQwPzkwOiJnZXRfaWRfdG9rZW4iPT09ci50MD8xMDQ6ImVuYWJsZV9odHRwX2hhbmRsZXIiPT09ci50MD8xMTg6ImRpc2FibGVfaHR0cF9oYW5kbGVyIj09PXIudDA/MTIxOiJpc19hdXRoZW50aWNhdGVkIj09PXIudDA/MTI0OiJnZXRfc2lnbl9vdXRfdXJsIj09PXIudDA/MTM4OiJyZWZyZXNoX2FjY2Vzcy10b2tlbiI9PT1yLnQwPzE1Mjoic3RhcnRfYXV0b19yZWZyZXNoX3Rva2VuIj09PXIudDA/MTY2OiJzZXRfc2Vzc2lvbl9zdGF0ZSI9PT1yLnQwPzE2ODoidXBkYXRlX2NvbmZpZyI9PT1yLnQwPzE4MjoiZ2V0X2NvbmZpZ19kYXRhIj09PXIudDA/MTk2OjIxMDticmVhaztjYXNlIDc6cmV0dXJuIHIucHJldj03LGQ9T2JqZWN0LmFzc2lnbih7fSxzLmRhdGEpLHIubmV4dD0xMSxMYShkLGUpO2Nhc2UgMTE6KHQ9ci5zZW50KS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKG8pLHQuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKGEpLHQuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2soaSkscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpLHIubmV4dD0yMTticmVhaztjYXNlIDE4OnIucHJldj0xOCxyLnQxPXIuY2F0Y2goNykscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKHIudDEpKTtjYXNlIDIxOnJldHVybiByLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAyMjpyZXR1cm4gdC5nZXRBdXRob3JpemF0aW9uVVJMKG51bGw9PXM/dm9pZCAwOnMuZGF0YSkudGhlbigoZnVuY3Rpb24oZSl7cC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKSxyLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAyNDpyZXR1cm4gdC5yZXF1ZXN0QWNjZXNzVG9rZW4obnVsbD09PShjPW51bGw9PXM/dm9pZCAwOnMuZGF0YSl8fHZvaWQgMD09PWM/dm9pZCAwOmMuY29kZSxudWxsPT09KGY9bnVsbD09cz92b2lkIDA6cy5kYXRhKXx8dm9pZCAwPT09Zj92b2lkIDA6Zi5zZXNzaW9uU3RhdGUsbnVsbD09PShsPW51bGw9PXM/dm9pZCAwOnMuZGF0YSl8fHZvaWQgMD09PWw/dm9pZCAwOmwucGtjZSxudWxsPT09KGg9bnVsbD09cz92b2lkIDA6cy5kYXRhKXx8dm9pZCAwPT09aD92b2lkIDA6aC5zdGF0ZSkudGhlbigoZnVuY3Rpb24oZSl7cC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKSxyLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAyNjpyZXR1cm4gdC5odHRwUmVxdWVzdChzLmRhdGEpLnRoZW4oKGZ1bmN0aW9uKGUpe3AucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3AucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSksci5hYnJ1cHQoImJyZWFrIiwyMTEpO2Nhc2UgMjg6cmV0dXJuIHQuaHR0cFJlcXVlc3RBbGwocy5kYXRhKS50aGVuKChmdW5jdGlvbihlKXtwLnBvc3RNZXNzYWdlKHVyLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtwLnBvc3RNZXNzYWdlKHVyLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpLHIuYWJydXB0KCJicmVhayIsMjExKTtjYXNlIDMwOnJldHVybiByLnByZXY9MzAsci50Mj1wLHIudDM9dXIsci5uZXh0PTM1LHQuc2lnbk91dCgpO2Nhc2UgMzU6ci50ND1yLnNlbnQsci50NT1yLnQzLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UuY2FsbChyLnQzLHIudDQpLHIudDIucG9zdE1lc3NhZ2UuY2FsbChyLnQyLHIudDUpLHIubmV4dD00MzticmVhaztjYXNlIDQwOnIucHJldj00MCxyLnQ2PXIuY2F0Y2goMzApLHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShyLnQ2KSk7Y2FzZSA0MzpyZXR1cm4gci5hYnJ1cHQoImJyZWFrIiwyMTEpO2Nhc2UgNDQ6cmV0dXJuIHQucmVxdWVzdEN1c3RvbUdyYW50KHMuZGF0YSkudGhlbigoZnVuY3Rpb24oZSl7cC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKSxyLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSA0NjpyZXR1cm4gdC5yZXZva2VBY2Nlc3NUb2tlbigpLnRoZW4oKGZ1bmN0aW9uKGUpe3AucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3AucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSksci5hYnJ1cHQoImJyZWFrIiwyMTEpO2Nhc2UgNDg6cmV0dXJuIHIucHJldj00OCxyLnQ3PXAsci50OD11cixyLm5leHQ9NTMsdC5nZXRPSURDU2VydmljZUVuZHBvaW50cygpO2Nhc2UgNTM6ci50OT1yLnNlbnQsci50MTA9ci50OC5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlLmNhbGwoci50OCxyLnQ5KSxyLnQ3LnBvc3RNZXNzYWdlLmNhbGwoci50NyxyLnQxMCksci5uZXh0PTYxO2JyZWFrO2Nhc2UgNTg6ci5wcmV2PTU4LHIudDExPXIuY2F0Y2goNDgpLHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShyLnQxMSkpO2Nhc2UgNjE6cmV0dXJuIHIuYWJydXB0KCJicmVhayIsMjExKTtjYXNlIDYyOnJldHVybiByLnByZXY9NjIsci50MTI9cCxyLnQxMz11cixyLm5leHQ9NjcsdC5nZXRCYXNpY1VzZXJJbmZvKCk7Y2FzZSA2NzpyLnQxND1yLnNlbnQsci50MTU9ci50MTMuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZS5jYWxsKHIudDEzLHIudDE0KSxyLnQxMi5wb3N0TWVzc2FnZS5jYWxsKHIudDEyLHIudDE1KSxyLm5leHQ9NzU7YnJlYWs7Y2FzZSA3MjpyLnByZXY9NzIsci50MTY9ci5jYXRjaCg2MikscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKHIudDE2KSk7Y2FzZSA3NTpyZXR1cm4gci5hYnJ1cHQoImJyZWFrIiwyMTEpO2Nhc2UgNzY6cmV0dXJuIHIucHJldj03NixyLnQxNz1wLHIudDE4PXVyLHIubmV4dD04MSx0LmdldERlY29kZWRJRFRva2VuKCk7Y2FzZSA4MTpyLnQxOT1yLnNlbnQsci50MjA9ci50MTguZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZS5jYWxsKHIudDE4LHIudDE5KSxyLnQxNy5wb3N0TWVzc2FnZS5jYWxsKHIudDE3LHIudDIwKSxyLm5leHQ9ODk7YnJlYWs7Y2FzZSA4NjpyLnByZXY9ODYsci50MjE9ci5jYXRjaCg3NikscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKHIudDIxKSk7Y2FzZSA4OTpyZXR1cm4gci5hYnJ1cHQoImJyZWFrIiwyMTEpO2Nhc2UgOTA6cmV0dXJuIHIucHJldj05MCxyLnQyMj1wLHIudDIzPXVyLHIubmV4dD05NSx0LmdldENyeXB0b0hlbHBlcigpO2Nhc2UgOTU6ci50MjQ9ci5zZW50LHIudDI1PXIudDIzLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UuY2FsbChyLnQyMyxyLnQyNCksci50MjIucG9zdE1lc3NhZ2UuY2FsbChyLnQyMixyLnQyNSksci5uZXh0PTEwMzticmVhaztjYXNlIDEwMDpyLnByZXY9MTAwLHIudDI2PXIuY2F0Y2goOTApLHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShyLnQyNikpO2Nhc2UgMTAzOnJldHVybiByLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAxMDQ6cmV0dXJuIHIucHJldj0xMDQsci50Mjc9cCxyLnQyOD11cixyLm5leHQ9MTA5LHQuZ2V0SURUb2tlbigpO2Nhc2UgMTA5OnIudDI5PXIuc2VudCxyLnQzMD1yLnQyOC5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlLmNhbGwoci50Mjgsci50MjkpLHIudDI3LnBvc3RNZXNzYWdlLmNhbGwoci50Mjcsci50MzApLHIubmV4dD0xMTc7YnJlYWs7Y2FzZSAxMTQ6ci5wcmV2PTExNCxyLnQzMT1yLmNhdGNoKDEwNCkscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKHIudDMxKSk7Y2FzZSAxMTc6cmV0dXJuIHIuYWJydXB0KCJicmVhayIsMjExKTtjYXNlIDExODpyZXR1cm4gdC5lbmFibGVIdHRwSGFuZGxlcigpLHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSgpKSxyLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAxMjE6cmV0dXJuIHQuZGlzYWJsZUh0dHBIYW5kbGVyKCkscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpLHIuYWJydXB0KCJicmVhayIsMjExKTtjYXNlIDEyNDpyZXR1cm4gci5wcmV2PTEyNCxyLnQzMj1wLHIudDMzPXVyLHIubmV4dD0xMjksdC5pc0F1dGhlbnRpY2F0ZWQoKTtjYXNlIDEyOTpyLnQzND1yLnNlbnQsci50MzU9ci50MzMuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZS5jYWxsKHIudDMzLHIudDM0KSxyLnQzMi5wb3N0TWVzc2FnZS5jYWxsKHIudDMyLHIudDM1KSxyLm5leHQ9MTM3O2JyZWFrO2Nhc2UgMTM0OnIucHJldj0xMzQsci50MzY9ci5jYXRjaCgxMjQpLHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShyLnQzNikpO2Nhc2UgMTM3OnJldHVybiByLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAxMzg6cmV0dXJuIHIucHJldj0xMzgsci50Mzc9cCxyLnQzOD11cixyLm5leHQ9MTQzLHQuZ2V0U2lnbk91dFVSTCgpO2Nhc2UgMTQzOnIudDM5PXIuc2VudCxyLnQ0MD1yLnQzOC5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlLmNhbGwoci50Mzgsci50MzkpLHIudDM3LnBvc3RNZXNzYWdlLmNhbGwoci50Mzcsci50NDApLHIubmV4dD0xNTE7YnJlYWs7Y2FzZSAxNDg6ci5wcmV2PTE0OCxyLnQ0MT1yLmNhdGNoKDEzOCkscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKHIudDQxKSk7Y2FzZSAxNTE6cmV0dXJuIHIuYWJydXB0KCJicmVhayIsMjExKTtjYXNlIDE1MjpyZXR1cm4gci5wcmV2PTE1MixyLnQ0Mj1wLHIudDQzPXVyLHIubmV4dD0xNTcsdC5yZWZyZXNoQWNjZXNzVG9rZW4oKTtjYXNlIDE1NzpyLnQ0ND1yLnNlbnQsci50NDU9ci50NDMuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZS5jYWxsKHIudDQzLHIudDQ0KSxyLnQ0Mi5wb3N0TWVzc2FnZS5jYWxsKHIudDQyLHIudDQ1KSxyLm5leHQ9MTY1O2JyZWFrO2Nhc2UgMTYyOnIucHJldj0xNjIsci50NDY9ci5jYXRjaCgxNTIpLHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShyLnQ0NikpO2Nhc2UgMTY1OnJldHVybiByLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAxNjY6dHJ5e3AucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh0LnN0YXJ0QXV0b1JlZnJlc2hUb2tlbigpKSl9Y2F0Y2goZSl7cC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1yZXR1cm4gci5hYnJ1cHQoImJyZWFrIiwyMTEpO2Nhc2UgMTY4OnJldHVybiByLnByZXY9MTY4LHIudDQ3PXAsci50NDg9dXIsci5uZXh0PTE3Myx0LnNldFNlc3Npb25TdGF0ZShudWxsPT1zP3ZvaWQgMDpzLmRhdGEpO2Nhc2UgMTczOnIudDQ5PXIuc2VudCxyLnQ1MD1yLnQ0OC5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlLmNhbGwoci50NDgsci50NDkpLHIudDQ3LnBvc3RNZXNzYWdlLmNhbGwoci50NDcsci50NTApLHIubmV4dD0xODE7YnJlYWs7Y2FzZSAxNzg6ci5wcmV2PTE3OCxyLnQ1MT1yLmNhdGNoKDE2OCkscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKHIudDUxKSk7Y2FzZSAxODE6cmV0dXJuIHIuYWJydXB0KCJicmVhayIsMjExKTtjYXNlIDE4MjpyZXR1cm4gci5wcmV2PTE4MixyLnQ1Mj1wLHIudDUzPXVyLHIubmV4dD0xODcsdC51cGRhdGVDb25maWcobnVsbD09cz92b2lkIDA6cy5kYXRhKTtjYXNlIDE4NzpyLnQ1ND1yLnNlbnQsci50NTU9ci50NTMuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZS5jYWxsKHIudDUzLHIudDU0KSxyLnQ1Mi5wb3N0TWVzc2FnZS5jYWxsKHIudDUyLHIudDU1KSxyLm5leHQ9MTk1O2JyZWFrO2Nhc2UgMTkyOnIucHJldj0xOTIsci50NTY9ci5jYXRjaCgxODIpLHAucG9zdE1lc3NhZ2UodXIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShyLnQ1NikpO2Nhc2UgMTk1OnJldHVybiByLmFicnVwdCgiYnJlYWsiLDIxMSk7Y2FzZSAxOTY6cmV0dXJuIHIucHJldj0xOTYsci50NTc9cCxyLnQ1OD11cixyLm5leHQ9MjAxLHQuZ2V0Q29uZmlnRGF0YSgpO2Nhc2UgMjAxOnIudDU5PXIuc2VudCxyLnQ2MD1yLnQ1OC5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlLmNhbGwoci50NTgsci50NTkpLHIudDU3LnBvc3RNZXNzYWdlLmNhbGwoci50NTcsci50NjApLHIubmV4dD0yMDk7YnJlYWs7Y2FzZSAyMDY6ci5wcmV2PTIwNixyLnQ2MT1yLmNhdGNoKDE5NikscC5wb3N0TWVzc2FnZSh1ci5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKHIudDYxKSk7Y2FzZSAyMDk6cmV0dXJuIHIuYWJydXB0KCJicmVhayIsMjExKTtjYXNlIDIxMDpudWxsPT1wfHxwLnBvc3RNZXNzYWdlKHVyLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UobmV3IEkoIlNQQS1DTElFTlRfV09SS0VSLU9OTVNHLUlWMDIiLCJUaGUgbWVzc2FnZSB0eXBlIGlzIGludmFsaWQuIiwiVGhlIG1lc3NhZ2UgdHlwZSBwcm92aWRlZCwgIi5jb25jYXQocy50eXBlLCIsIGlzIGludmFsaWQuIikpKSk7Y2FzZSAyMTE6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19KSxuLG51bGwsW1s3LDE4XSxbMzAsNDBdLFs0OCw1OF0sWzYyLDcyXSxbNzYsODZdLFs5MCwxMDBdLFsxMDQsMTE0XSxbMTI0LDEzNF0sWzEzOCwxNDhdLFsxNTIsMTYyXSxbMTY4LDE3OF0sWzE4MiwxOTJdLFsxOTYsMjA2XV0pfSkpKX07dmFyIGE9ZnVuY3Rpb24oKXtuLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXF1ZXN0LXN0YXJ0In0pfSxpPWZ1bmN0aW9uKGUpe24ucG9zdE1lc3NhZ2Uoe2RhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSx0eXBlOiJyZXF1ZXN0LXN1Y2Nlc3MifSl9LG89ZnVuY3Rpb24oKXtuLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXF1ZXN0LWZpbmlzaCJ9KX19KChmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgVWEoZSx0KX0pKTtyZXR1cm57fX0oKTsKCg==",xF=null,HF=!1,function(t){return kF=kF||LF(JF,xF,HF),new Worker(kF,t)});!function(t){t.LocalStorage="localStorage",t.SessionStorage="sessionStorage",t.WebWorker="webWorker",t.BrowserMemory="browserMemory"}(UF||(UF={})),function(t){t.SignIn="sign-in",t.SignOut="sign-out",t.Initialize="initialize",t.HttpRequestStart="http-request-start",t.HttpRequestFinish="http-request-finish",t.HttpRequestError="http-request-error",t.HttpRequestSuccess="http-request-success",t.RevokeAccessToken="revoke-access-token",t.CustomGrant="custom-grant",t.SignOutFailed="sign-out-failed"}(TF||(TF={}));var AF,FF,zF,BF,jF,MF,QF,PF,EF,DF,OF,_F,qF,$F,tz,ez,nz,rz="Y2hlY2tTZXNzaW9u",iz=function(){function t(e,n){u(this,t),this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer(),this._spaHelper=n}return d(t,[{key:"enableHttpHandler",value:function(t){(null==t?void 0:t.enableHandler)&&t.enableHandler()}},{key:"disableHttpHandler",value:function(t){(null==t?void 0:t.disableHandler)&&t.disableHandler()}},{key:"initializeSessionManger",value:function(t,e,n,r,i){var c,a,o;i.initialize(t.clientID,null!==(c=e.checkSessionIframe)&&void 0!==c?c:"",n,null!==(a=t.checkSessionInterval)&&void 0!==a?a:3,null!==(o=t.sessionRefreshInterval)&&void 0!==o?o:300,t.signInRedirectURL,r)}},{key:"requestCustomGrant",value:function(t,e){var n,r,i;return rF(this,void 0,void 0,c().mark((function a(){var o,l,u,s,d,m=this;return c().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:if(o=!0,l=!1,!(null==t?void 0:t.tokenEndpoint)){a.next=39;break}return o=!1,u=0,a.t0=[],a.t1=V,a.next=9,this._dataLayer.getConfigData();case 9:if(a.t4=n=a.sent,a.t3=null===a.t4,a.t3){a.next=13;break}a.t3=void 0===n;case 13:if(!a.t3){a.next=17;break}a.t5=void 0,a.next=18;break;case 17:a.t5=n.resourceServerURLs;case 18:if(a.t6=r=a.t5,a.t2=null!==a.t6,!a.t2){a.next=22;break}a.t2=void 0!==r;case 22:if(!a.t2){a.next=26;break}a.t7=r,a.next=27;break;case 26:a.t7=[];case 27:a.t8=a.t7,a.t9=(0,a.t1)(a.t8),a.t10=[t.baseUrl],s=a.t0.concat.call(a.t0,a.t9,a.t10);case 31:if(!(u<s.length)){a.next=39;break}if(!(d=s[u])||!(null===(i=t.tokenEndpoint)||void 0===i?void 0:i.startsWith(d))){a.next=36;break}return l=!0,a.abrupt("break",39);case 36:u++,a.next=31;break;case 39:if(t.shouldReplayAfterRefresh&&this._dataLayer.setTemporaryDataParameter("custom_grant_config",JSON.stringify(t)),!o&&!l){a.next=44;break}return a.abrupt("return",this._authenticationClient.requestCustomGrant(t).then((function(n){return rF(m,void 0,void 0,c().mark((function r(){return c().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(e&&"function"==typeof e&&e(t),!t.returnsSession){r.next=6;break}return this._spaHelper.refreshAccessTokenAutomatically(),r.abrupt("return",this._authenticationClient.getBasicUserInfo());case 6:return r.abrupt("return",n);case 7:case"end":return r.stop()}}),r,this)})))})).catch((function(t){return Promise.reject(t)})));case 44:return a.abrupt("return",Promise.reject(new WF("SPA-MAIN_THREAD_CLIENT-RCG-IV01","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified token endpoint in this request cannot be found among the `resourceServerURLs`")));case 45:case"end":return a.stop()}}),a,this)})))}},{key:"getCustomGrantConfigData",value:function(){return rF(this,void 0,void 0,c().mark((function t(){var e;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this._dataLayer.getTemporaryDataParameter("custom_grant_config");case 2:if(!(e=t.sent)){t.next=7;break}return t.abrupt("return",JSON.parse(e));case 7:return t.abrupt("return",null);case 8:case"end":return t.stop()}}),t,this)})))}},{key:"refreshAccessToken",value:function(t){return rF(this,void 0,void 0,c().mark((function e(){var n;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,this._authenticationClient.refreshAccessToken();case 3:return e.next=5,this.getCustomGrantConfigData();case 5:if(!(n=e.sent)){e.next=9;break}return e.next=9,this.requestCustomGrant(n,t);case 9:return this._spaHelper.refreshAccessTokenAutomatically(),e.abrupt("return",this._authenticationClient.getBasicUserInfo());case 13:return e.prev=13,e.t0=e.catch(0),e.abrupt("return",Promise.reject(e.t0));case 16:case"end":return e.stop()}}),e,this,[[0,13]])})))}},{key:"httpRequest",value:function(t,e,n,r,i,a){var o,l;return rF(this,void 0,void 0,c().mark((function u(){var s,d,m,h,b,Z=this;return c().wrap((function(u){for(;;)switch(u.prev=u.next){case 0:return s=!1,u.next=3,this._dataLayer.getConfigData();case 3:return d=u.sent,m=0,u.t0=[],u.t1=V,u.next=9,null==d?void 0:d.resourceServerURLs;case 9:if(u.t3=o=u.sent,u.t2=null!==u.t3,!u.t2){u.next=13;break}u.t2=void 0!==o;case 13:if(!u.t2){u.next=17;break}u.t4=o,u.next=18;break;case 17:u.t4=[];case 18:u.t5=u.t4,u.t6=(0,u.t1)(u.t5),u.t7=[d.baseUrl],h=u.t0.concat.call(u.t0,u.t6,u.t7);case 22:if(!(m<h.length)){u.next=30;break}if(!(b=h[m])||!(null===(l=null==e?void 0:e.url)||void 0===l?void 0:l.startsWith(b))){u.next=27;break}return s=!0,u.abrupt("break",30);case 27:m++,u.next=22;break;case 30:if(!s){u.next=34;break}return u.abrupt("return",t.request(e).then((function(t){return Promise.resolve(t)})).catch((function(o){return rF(Z,void 0,void 0,c().mark((function l(){var u,s,d,m,h;return c().wrap((function(c){for(;;)switch(c.prev=c.next){case 0:if(401!==(null===(u=null==o?void 0:o.response)||void 0===u?void 0:u.status)&&(null==o?void 0:o.response)){c.next=31;break}return c.prev=1,c.next=4,this.refreshAccessToken(a);case 4:m=c.sent,c.next=15;break;case 7:if(c.prev=7,c.t0=c.catch(1),!n){c.next=14;break}if("function"!=typeof r){c.next=13;break}return c.next=13,r(Object.assign(Object.assign({},o),{code:"Access token is invalid"}));case 13:"function"==typeof i&&i();case 14:throw new WF("SPA-AUTH_HELPER-HR-SE01",null!==(s=null===c.t0||void 0===c.t0?void 0:c.t0.name)&&void 0!==s?s:"Refresh token request failed.",null!==(d=null===c.t0||void 0===c.t0?void 0:c.t0.message)&&void 0!==d?d:"An error occurred while trying to refresh the access token following a 401 response from the server.");case 15:if(!m){c.next=31;break}return c.prev=16,c.next=19,t.request(e);case 19:return h=c.sent,c.abrupt("return",Promise.resolve(h));case 23:if(c.prev=23,c.t1=c.catch(16),!n){c.next=30;break}if("function"!=typeof r){c.next=29;break}return c.next=29,r(c.t1);case 29:"function"==typeof i&&i();case 30:return c.abrupt("return",Promise.reject(c.t1));case 31:if(!n){c.next=36;break}if("function"!=typeof r){c.next=35;break}return c.next=35,r(o);case 35:"function"==typeof i&&i();case 36:return c.abrupt("return",Promise.reject(o));case 37:case"end":return c.stop()}}),l,this,[[1,7],[16,23]])})))})));case 34:return u.abrupt("return",Promise.reject(new WF("SPA-AUTH_HELPER-HR-IV02","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`")));case 35:case"end":return u.stop()}}),u,this)})))}},{key:"httpRequestAll",value:function(t,e,n,r,i){var a,o,l;return rF(this,void 0,void 0,c().mark((function u(){var s,d,m,h,b,Z,p,I,y,X,g=this;return c().wrap((function(u){for(;;)switch(u.prev=u.next){case 0:return s=!0,u.next=3,this._dataLayer.getConfigData();case 3:d=u.sent,m=C(t),u.prev=5,m.s();case 7:if((h=m.n()).done){u.next=50;break}return b=h.value,Z=!1,p=0,u.t0=[],u.t1=V,u.next=15,d;case 15:if(u.t4=a=u.sent,u.t3=null===u.t4,u.t3){u.next=19;break}u.t3=void 0===a;case 19:if(!u.t3){u.next=23;break}u.t5=void 0,u.next=24;break;case 23:u.t5=a.resourceServerURLs;case 24:if(u.t6=o=u.t5,u.t2=null!==u.t6,!u.t2){u.next=28;break}u.t2=void 0!==o;case 28:if(!u.t2){u.next=32;break}u.t7=o,u.next=33;break;case 32:u.t7=[];case 33:u.t8=u.t7,u.t9=(0,u.t1)(u.t8),u.t10=[d.baseUrl],I=u.t0.concat.call(u.t0,u.t9,u.t10);case 37:if(!(p<I.length)){u.next=45;break}if(!(y=I[p])||!(null===(l=b.url)||void 0===l?void 0:l.startsWith(y))){u.next=42;break}return Z=!0,u.abrupt("break",45);case 42:p++,u.next=37;break;case 45:if(Z){u.next=48;break}return s=!1,u.abrupt("break",50);case 48:u.next=7;break;case 50:u.next=55;break;case 52:u.prev=52,u.t11=u.catch(5),m.e(u.t11);case 55:return u.prev=55,m.f(),u.finish(55);case 58:if(X=[],!s){u.next=64;break}return t.forEach((function(t){X.push(e.request(t))})),u.abrupt("return",(null==e?void 0:e.all)&&e.all(X).then((function(t){return Promise.resolve(t)})).catch((function(t){return rF(g,void 0,void 0,c().mark((function a(){var o,l,u,s,d=this;return c().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:if(401!==(null===(o=null==t?void 0:t.response)||void 0===o?void 0:o.status)&&(null==t?void 0:t.response)){a.next=17;break}return a.prev=1,a.next=4,this._authenticationClient.refreshAccessToken();case 4:s=a.sent,a.next=15;break;case 7:if(a.prev=7,a.t0=a.catch(1),!n){a.next=14;break}if("function"!=typeof r){a.next=13;break}return a.next=13,r(Object.assign(Object.assign({},t),{code:"Access token is invalid"}));case 13:"function"==typeof i&&i();case 14:throw new WF("SPA-AUTH_HELPER-HRA-SE01",null!==(l=null===a.t0||void 0===a.t0?void 0:a.t0.name)&&void 0!==l?l:"Refresh token request failed.",null!==(u=null===a.t0||void 0===a.t0?void 0:a.t0.message)&&void 0!==u?u:"An error occurred while trying to refresh the access token following a 401 response from the server.");case 15:if(!s){a.next=17;break}return a.abrupt("return",e.all&&e.all(X).then((function(t){return Promise.resolve(t)})).catch((function(t){return rF(d,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!n){e.next=5;break}if("function"!=typeof r){e.next=4;break}return e.next=4,r(t);case 4:"function"==typeof i&&i();case 5:return e.abrupt("return",Promise.reject(t));case 6:case"end":return e.stop()}}),e)})))})));case 17:if(!n){a.next=22;break}if("function"!=typeof r){a.next=21;break}return a.next=21,r(t);case 21:"function"==typeof i&&i();case 22:return a.abrupt("return",Promise.reject(t));case 23:case"end":return a.stop()}}),a,this,[[1,7]])})))})));case 64:throw new WF("SPA-AUTH_HELPER-HRA-IV02","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`");case 65:case"end":return u.stop()}}),u,this,[[5,52,55,58]])})))}},{key:"requestAccessToken",value:function(t,e,n,r,i){return rF(this,void 0,void 0,c().mark((function a(){var o,l,u=this;return c().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,this._dataLayer.getConfigData();case 2:if((o=a.sent).storage!==UF.BrowserMemory||!o.enablePKCE||!e){a.next=9;break}return l=oz.getPKCE(vF.extractPKCEKeyFromStateParam(e)),a.next=7,this._authenticationClient.setPKCECode(vF.extractPKCEKeyFromStateParam(e),l);case 7:a.next=12;break;case 9:if(o.storage!==UF.WebWorker||!r){a.next=12;break}return a.next=12,this._authenticationClient.setPKCECode(r,null!=i?i:"");case 12:if(!t){a.next=14;break}return a.abrupt("return",this._authenticationClient.requestAccessToken(t,null!=e?e:"",null!=i?i:"").then((function(){return rF(u,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(o.storage===UF.WebWorker){t.next=10;break}return t.t0=oz,t.next=4,this._authenticationClient.getSignOutURL();case 4:t.t1=t.sent,t.t0.setSignOutURL.call(t.t0,t.t1),this._spaHelper&&(this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically()),n&&"function"==typeof n&&o.enableOIDCSessionManagement&&n(),t.next=11;break;case 10:this._spaHelper&&this._spaHelper.refreshAccessTokenAutomatically();case 11:return t.abrupt("return",this._authenticationClient.getBasicUserInfo());case 12:case"end":return t.stop()}}),t,this)})))})).catch((function(t){return Promise.reject(t)})));case 14:return a.abrupt("return",Promise.reject(new WF("SPA-AUTH_HELPER-RAT1-NF01","No authorization code.","No authorization code was found.")));case 15:case"end":return a.stop()}}),a,this)})))}},{key:"trySignInSilently",value:function(t,e,n){var r;return rF(this,void 0,void 0,c().mark((function i(){var a,o,l,u=this;return c().wrap((function(i){for(;;)switch(i.prev=i.next){case 0:if(!oz.isInitializedSilentSignIn()){i.next=4;break}return i.next=3,n.receivePromptNoneResponse();case 3:return i.abrupt("return",Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""}));case 4:return a=document.getElementById("rpIFrame"),o=null===(r=null==a?void 0:a.contentDocument)||void 0===r?void 0:r.getElementById("promptNoneIFrame"),i.prev=6,i.next=9,t();case 9:l=i.sent,o.src=l,i.next=16;break;case 13:return i.prev=13,i.t0=i.catch(6),i.abrupt("return",Promise.reject(i.t0));case 16:return i.abrupt("return",new Promise((function(t,n){var r=setTimeout((function(){t(!1)}),1e4);window.addEventListener("message",(function i(a){return rF(u,void 0,void 0,c().mark((function o(){var l,u,s,d,m;return c().wrap((function(c){for(;;)switch(c.prev=c.next){case 0:"check_session_signed_out"==(null==(m=a.data)?void 0:m.type)&&(window.removeEventListener("message",i),clearTimeout(r),t(!1)),"check_session_signed_in"==(null==m?void 0:m.type)&&(null===(l=null==m?void 0:m.data)||void 0===l?void 0:l.code)&&e(null===(u=null==m?void 0:m.data)||void 0===u?void 0:u.code,null===(s=null==m?void 0:m.data)||void 0===s?void 0:s.sessionState,null===(d=null==m?void 0:m.data)||void 0===d?void 0:d.state).then((function(e){window.removeEventListener("message",i),t(e)})).catch((function(t){window.removeEventListener("message",i),n(t)})).finally((function(){clearTimeout(r)}));case 3:case"end":return c.stop()}}),o)})))}))})));case 17:case"end":return i.stop()}}),i,null,[[6,13]])})))}},{key:"handleSignIn",value:function(t,e,n){return rF(this,void 0,void 0,c().mark((function r(){var i,a,o,l,u;return c().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.next=2,this._dataLayer.getConfigData();case 2:return i=r.sent,r.next=5,t();case 5:if(!r.sent){r.next=7;break}return r.abrupt("return",Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""}));case 7:if(i.storage===UF.WebWorker){r.next=19;break}return r.next=10,this._authenticationClient.isAuthenticated();case 10:if(!r.sent){r.next=19;break}return this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(),i.enableOIDCSessionManagement&&e(),r.t0=Promise,r.next=17,this._authenticationClient.getBasicUserInfo();case 17:return r.t1=r.sent,r.abrupt("return",r.t0.resolve.call(r.t0,r.t1));case 19:if(a=new URL(window.location.href).searchParams.get("error"),o=new URL(window.location.href).searchParams.get("error_description"),!a){r.next=27;break}throw(l=new URL(window.location.href)).searchParams.delete("error"),l.searchParams.delete("error_description"),history.pushState(null,document.title,l.toString()),new WF("SPA-AUTH_HELPER-SI-SE01",a,null!=o?o:"");case 27:if(i.storage!==UF.WebWorker||!n){r.next=33;break}return r.next=30,n();case 30:if(!(u=r.sent)){r.next=33;break}return r.abrupt("return",u);case 33:case"end":return r.stop()}}),r,this)})))}},{key:"getBasicUserInfo",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.getBasicUserInfo());case 1:case"end":return t.stop()}}),t,this)})))}},{key:"getDecodedIDToken",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.getDecodedIDToken());case 1:case"end":return t.stop()}}),t,this)})))}},{key:"getDecodedIDPIDToken",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.getDecodedIDToken());case 1:case"end":return t.stop()}}),t,this)})))}},{key:"getCryptoHelper",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.getCryptoHelper());case 1:case"end":return t.stop()}}),t,this)})))}},{key:"getIDToken",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.getIDToken());case 1:case"end":return t.stop()}}),t,this)})))}},{key:"getOIDCServiceEndpoints",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.getOIDCServiceEndpoints());case 1:case"end":return t.stop()}}),t,this)})))}},{key:"getAccessToken",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.getAccessToken());case 1:case"end":return t.stop()}}),t,this)})))}},{key:"getIDPAccessToken",value:function(){var t;return rF(this,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this._dataLayer.getSessionData();case 2:if(e.t1=t=e.sent,e.t0=null===e.t1,e.t0){e.next=6;break}e.t0=void 0===t;case 6:if(!e.t0){e.next=10;break}e.t2=void 0,e.next=11;break;case 10:e.t2=t.access_token;case 11:return e.abrupt("return",e.t2);case 12:case"end":return e.stop()}}),e,this)})))}},{key:"getDataLayer",value:function(){return this._dataLayer}},{key:"isAuthenticated",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._authenticationClient.isAuthenticated());case 1:case"end":return t.stop()}}),t,this)})))}}]),t}(),cz=function(){function t(e){u(this,t),this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer()}return d(t,[{key:"refreshAccessTokenAutomatically",value:function(){return rF(this,void 0,void 0,c().mark((function t(){var e,n,r,i=this;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this._dataLayer.getSessionData();case 2:if(!(e=t.sent).refresh_token){t.next=9;break}return n=parseInt(e.expires_in),r=setTimeout((function(){return rF(i,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this._authenticationClient.refreshAccessToken();case 2:case"end":return t.stop()}}),t,this)})))}),1e3*(n<=10?n:n-10)),t.next=9,this._dataLayer.setTemporaryDataParameter(mF,JSON.stringify(r));case 9:case"end":return t.stop()}}),t,this)})))}},{key:"clearRefreshTokenTimeout",value:function(){return rF(this,void 0,void 0,c().mark((function t(){var e;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this._dataLayer.getTemporaryDataParameter(mF);case 2:if(!t.sent){t.next=9;break}return t.t0=JSON,t.next=6,this._dataLayer.getTemporaryDataParameter(mF);case 6:t.t1=t.sent,e=t.t0.parse.call(t.t0,t.t1),clearTimeout(e);case 9:case"end":return t.stop()}}),t,this)})))}}]),t}(),az=function(){function t(){u(this,t)}return d(t,null,[{key:"generateSuccessMessage",value:function(t){return{blob:(null==t?void 0:t.data)instanceof Blob?null==t?void 0:t.data:null,data:JSON.stringify(null!=t?t:""),success:!0}}},{key:"generateFailureMessage",value:function(t){return(null==t?void 0:t.toJSON)&&delete t.toJSON,{error:JSON.stringify(null!=t?t:""),success:!1}}}]),t}(),oz=function(){function t(){u(this,t)}return d(t,null,[{key:"removeAuthorizationCode",value:function(){var t=location.href;history.pushState({},document.title,t.replace(/\?code=.*$/,""))}},{key:"getPKCE",value:function(t){var e;return null!==(e=sessionStorage.getItem(t))&&void 0!==e?e:""}},{key:"setPKCE",value:function(t,e){sessionStorage.setItem(t,e)}},{key:"setSignOutURL",value:function(t){sessionStorage.setItem(gF,t)}},{key:"getSignOutURL",value:function(){var t;return null!==(t=sessionStorage.getItem(gF))&&void 0!==t?t:""}},{key:"removePKCE",value:function(t){sessionStorage.removeItem(t)}},{key:"canContinueSignIn",value:function(e,n){return!(e&&!t.hasErrorInURL()&&!t.hasAuthSearchParamsInURL()&&!n)}},{key:"isInitializedSilentSignIn",value:function(){return t.isSilentStatePresentInURL()}},{key:"wasSignInCalled",value:function(){return!(!t.hasErrorInURL()&&!t.hasAuthSearchParamsInURL()||this.isSilentStatePresentInURL())}},{key:"wasSilentSignInCalled",value:function(){var t=sessionStorage.getItem("initialized-silent-sign-in"),e=t?JSON.parse(t):null;return Boolean(e)}},{key:"isSignOutSuccessful",value:function(){return rF(this,void 0,void 0,c().mark((function t(){var e;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!NF.isSignOutSuccessful(window.location.href)){t.next=6;break}return e=window.location.href.split("?")[0],history.pushState({},document.title,e),t.next=5,NF.clearUserSessionData();case 5:return t.abrupt("return",!0);case 6:return t.abrupt("return",!1);case 7:case"end":return t.stop()}}),t)})))}},{key:"didSignOutFail",value:function(){if(NF.didSignOutFail(window.location.href)){var t=new URL(window.location.href),e=t.searchParams.get("error"),n=t.searchParams.get("error_description"),r=window.location.href.split("?")[0];return history.pushState({},document.title,r),{description:null!=n?n:"",error:null!=e?e:""}}return!1}},{key:"isSilentStatePresentInURL",value:function(){var t,e=new URL(window.location.href).searchParams.get("state");return null!==(t=null==e?void 0:e.includes("sign-in-silently"))&&void 0!==t&&t}},{key:"hasAuthSearchParamsInURL",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.location.search,e=/[?&]code=[^&]+/;return e.test(t)}},{key:"hasErrorInURL",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.location.href,e=new URL(t);return!!e.searchParams.get("error")&&e.searchParams.get("state")!==GF}},{key:"canSendPromptNoneRequest",value:function(){var t=sessionStorage.getItem("promptNoneRequestSent");return!(t?JSON.parse(t):null)}},{key:"setPromptNoneRequestSent",value:function(t){sessionStorage.setItem("promptNoneRequestSent",JSON.stringify(t))}},{key:"waitTillPageRedirect",value:function(t){return rF(this,void 0,void 0,c().mark((function e(){var n;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=null!=t?t:3e3,e.next=3,new Promise((function(t){return setTimeout(t,1e3*n)}));case 3:case"end":return e.stop()}}),e)})))}}]),t}(),lz=(_F=function(t,e,n,r,i,c,a){AF=t,FF=e,zF=n,jF=c,MF=i,OF=a,(BF=r)>-1&&qF(),MF>-1&&(i=setInterval((function(){ez()}),1e3*MF))},qF=function(){return rF(void 0,void 0,void 0,c().mark((function t(){var e,n,r,i;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r=function(){var t;return rF(this,void 0,void 0,c().mark((function e(){var r,i,a,o,l;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,zF();case 2:r=e.sent,Boolean(AF)&&Boolean(r)&&(i="".concat(AF," ").concat(r),a=document.getElementById("rpIFrame"),o=null===(t=null==a?void 0:a.contentDocument)||void 0===t?void 0:t.getElementById(n),null==(l=o.contentWindow)||l.postMessage(i,FF));case 4:case"end":return e.stop()}}),e)})))},FF&&AF&&jF){t.next=3;break}return t.abrupt("return");case 3:n="opIFrame",i=document.getElementById("rpIFrame"),(null===(e=null==i?void 0:i.contentDocument)||void 0===e?void 0:e.getElementById(n)).src=FF+"?client_id="+AF+"&redirect_uri="+jF,PF=setInterval(r,1e3*BF),tz();case 9:case"end":return t.stop()}}),t)})))},$F=function(){clearInterval(PF),clearInterval(void 0)},tz=function(){null===window||void 0===window||window.addEventListener("message",(function(t){var e;return rF(this,void 0,void 0,c().mark((function n(){var r;return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if((r=FF)&&!((null==r?void 0:r.indexOf(t.origin))<0)&&"set_session_state_from_iframe"!==(null===(e=null==t?void 0:t.data)||void 0===e?void 0:e.type)){n.next=3;break}return n.abrupt("return");case 3:if("unchanged"!==t.data){n.next=6;break}n.next=13;break;case 6:if("error"!==t.data){n.next=12;break}return n.next=9,QF();case 9:window.location.href=n.sent,n.next=13;break;case 12:"changed"===t.data&&ez();case 13:case"end":return n.stop()}}),n)})))}),!1)},ez=function(){return rF(void 0,void 0,void 0,c().mark((function t(){var e,n,r,i,a;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n=document.getElementById("rpIFrame"),r=null===(e=null==n?void 0:n.contentDocument)||void 0===e?void 0:e.getElementById("promptNoneIFrame"),!oz.canSendPromptNoneRequest()){t.next=10;break}return oz.setPromptNoneRequestSent(!0),i=function t(e){var n,r,i;"set_session_state_from_iframe"===(null===(n=null==e?void 0:e.data)||void 0===n?void 0:n.type)&&(DF(null!==(i=null===(r=null==e?void 0:e.data)||void 0===r?void 0:r.data)&&void 0!==i?i:""),null===window||void 0===window||window.removeEventListener("message",t))},EF!==UF.BrowserMemory&&EF!==UF.WebWorker||null===window||void 0===window||window.addEventListener("message",i),t.next=8,OF({prompt:"none",responseMode:"query",state:rz});case 8:a=t.sent,r.src=a;case 10:case"end":return t.stop()}}),t)})))},nz=function(t){return rF(void 0,void 0,void 0,c().mark((function e(){var n,r,i,a,o,l,u,s,d,m;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(i=new URL(window.location.href).searchParams.get("state"),a=new URL(window.location.href).searchParams.get(XF),o=window.parent.parent,null===i||!i.includes(rz)&&!i.includes("sign-in-silently")){e.next=48;break}if(null===(l=new URL(window.location.href).searchParams.get("code"))||0===l.length){e.next=32;break}if(!i.includes("sign-in-silently")){e.next=15;break}return u={data:{code:l,sessionState:null!=a?a:"",state:i},type:"check_session_signed_in"},sessionStorage.setItem("initialized-silent-sign-in","false"),o.postMessage(u,o.origin),oz.setPromptNoneRequestSent(!1),window.location.href="about:blank",e.next=14,oz.waitTillPageRedirect();case 14:return e.abrupt("return",!0);case 15:if(s=new URL(window.location.href).searchParams.get("session_state"),EF!==UF.LocalStorage&&EF!==UF.SessionStorage){e.next=23;break}if(e.t0=t,!e.t0){e.next=21;break}return e.next=21,t(s);case 21:e.next=25;break;case 23:d={data:null!=s?s:"",type:"set_session_state_from_iframe"},null===(r=null===(n=null===window||void 0===window?void 0:window.parent)||void 0===n?void 0:n.parent)||void 0===r||r.postMessage(d);case 25:return oz.setPromptNoneRequestSent(!1),window.location.href="about:blank",e.next=29,oz.waitTillPageRedirect();case 29:return e.abrupt("return",!0);case 32:if(!i.includes("sign-in-silently")){e.next=40;break}return m={type:"check_session_signed_out"},window.parent.parent.postMessage(m,o.origin),oz.setPromptNoneRequestSent(!1),window.location.href="about:blank",e.next=39,oz.waitTillPageRedirect();case 39:return e.abrupt("return",!0);case 40:return oz.setPromptNoneRequestSent(!1),e.next=43,QF();case 43:return o.location.href=e.sent,window.location.href="about:blank",e.next=47,oz.waitTillPageRedirect();case 47:return e.abrupt("return",!0);case 48:return e.abrupt("return",!1);case 49:case"end":return e.stop()}}),e)})))},function(t,e,n){return rF(void 0,void 0,void 0,c().mark((function r(){var i,a,o,l;return c().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:(a=document.createElement("iframe")).setAttribute("id","rpIFrame"),a.style.display="none",o=!1,a.onload=function(){var t,e,n,r,i=null==(a=document.getElementById("rpIFrame"))?void 0:a.contentDocument,c=null==i?void 0:i.createElement("iframe");c&&(c.setAttribute("id","opIFrame"),c.style.display="none");var l=null==i?void 0:i.createElement("iframe");l&&(l.setAttribute("id","promptNoneIFrame"),l.style.display="none"),c&&(null===(e=null===(t=null==a?void 0:a.contentDocument)||void 0===t?void 0:t.body)||void 0===e||e.appendChild(c)),l&&(null===(r=null===(n=null==a?void 0:a.contentDocument)||void 0===n?void 0:n.body)||void 0===r||r.appendChild(l)),o=!0},null===(i=null===document||void 0===document?void 0:document.body)||void 0===i||i.appendChild(a),QF=t,EF=e,DF=n,l=function(){return new Promise((function(t){return setTimeout(t,1)}))};case 10:if(!1!==o){r.next=15;break}return r.next=13,l();case 13:r.next=10;break;case 15:return r.abrupt("return",{initialize:_F,receivePromptNoneResponse:nz,reset:$F});case 16:case"end":return r.stop()}}),r)})))}),uz={exports:{}},sz=function(t,e){return function(){for(var n=new Array(arguments.length),r=0;r<n.length;r++)n[r]=arguments[r];return t.apply(e,n)}},dz=sz,mz=Object.prototype.toString;function hz(t){return Array.isArray(t)}function bz(t){return void 0===t}function Zz(t){return"[object ArrayBuffer]"===mz.call(t)}function pz(t){return null!==t&&"object"===a(t)}function Iz(t){if("[object Object]"!==mz.call(t))return!1;var e=Object.getPrototypeOf(t);return null===e||e===Object.prototype}function yz(t){return"[object Function]"===mz.call(t)}function Xz(t,e){if(null!=t)if("object"!==a(t)&&(t=[t]),hz(t))for(var n=0,r=t.length;n<r;n++)e.call(null,t[n],n,t);else for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&e.call(null,t[i],i,t)}var gz={isArray:hz,isArrayBuffer:Zz,isBuffer:function(t){return null!==t&&!bz(t)&&null!==t.constructor&&!bz(t.constructor)&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)},isFormData:function(t){return"[object FormData]"===mz.call(t)},isArrayBufferView:function(t){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(t):t&&t.buffer&&Zz(t.buffer)},isString:function(t){return"string"==typeof t},isNumber:function(t){return"number"==typeof t},isObject:pz,isPlainObject:Iz,isUndefined:bz,isDate:function(t){return"[object Date]"===mz.call(t)},isFile:function(t){return"[object File]"===mz.call(t)},isBlob:function(t){return"[object Blob]"===mz.call(t)},isFunction:yz,isStream:function(t){return pz(t)&&yz(t.pipe)},isURLSearchParams:function(t){return"[object URLSearchParams]"===mz.call(t)},isStandardBrowserEnv:function(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)},forEach:Xz,merge:function t(){var e={};function n(n,r){Iz(e[r])&&Iz(n)?e[r]=t(e[r],n):Iz(n)?e[r]=t({},n):hz(n)?e[r]=n.slice():e[r]=n}for(var r=0,i=arguments.length;r<i;r++)Xz(arguments[r],n);return e},extend:function(t,e,n){return Xz(e,(function(e,r){t[r]=n&&"function"==typeof e?dz(e,n):e})),t},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},stripBOM:function(t){return 65279===t.charCodeAt(0)&&(t=t.slice(1)),t}},Gz=gz;function fz(t){return encodeURIComponent(t).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var Vz=function(t,e,n){if(!e)return t;var r;if(n)r=n(e);else if(Gz.isURLSearchParams(e))r=e.toString();else{var i=[];Gz.forEach(e,(function(t,e){null!=t&&(Gz.isArray(t)?e+="[]":t=[t],Gz.forEach(t,(function(t){Gz.isDate(t)?t=t.toISOString():Gz.isObject(t)&&(t=JSON.stringify(t)),i.push(fz(e)+"="+fz(t))})))})),r=i.join("&")}if(r){var c=t.indexOf("#");-1!==c&&(t=t.slice(0,c)),t+=(-1===t.indexOf("?")?"?":"&")+r}return t},Wz=gz;function vz(){this.handlers=[]}vz.prototype.use=function(t,e,n){return this.handlers.push({fulfilled:t,rejected:e,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1},vz.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},vz.prototype.forEach=function(t){Wz.forEach(this.handlers,(function(e){null!==e&&t(e)}))};var Cz=vz,Yz="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{};function Sz(){throw new Error("setTimeout has not been defined")}function Rz(){throw new Error("clearTimeout has not been defined")}var Kz=Sz,Nz=Rz;function Lz(t){if(Kz===setTimeout)return setTimeout(t,0);if((Kz===Sz||!Kz)&&setTimeout)return Kz=setTimeout,setTimeout(t,0);try{return Kz(t,0)}catch(e){try{return Kz.call(null,t,0)}catch(e){return Kz.call(this,t,0)}}}"function"==typeof Yz.setTimeout&&(Kz=setTimeout),"function"==typeof Yz.clearTimeout&&(Nz=clearTimeout);var Jz,xz=[],Hz=!1,kz=-1;function Uz(){Hz&&Jz&&(Hz=!1,Jz.length?xz=Jz.concat(xz):kz=-1,xz.length&&Tz())}function Tz(){if(!Hz){var t=Lz(Uz);Hz=!0;for(var e=xz.length;e;){for(Jz=xz,xz=[];++kz<e;)Jz&&Jz[kz].run();kz=-1,e=xz.length}Jz=null,Hz=!1,function(t){if(Nz===clearTimeout)return clearTimeout(t);if((Nz===Rz||!Nz)&&clearTimeout)return Nz=clearTimeout,clearTimeout(t);try{Nz(t)}catch(e){try{return Nz.call(null,t)}catch(e){return Nz.call(this,t)}}}(t)}}function wz(t,e){this.fun=t,this.array=e}wz.prototype.run=function(){this.fun.apply(null,this.array)};function Az(){}var Fz=Az,zz=Az,Bz=Az,jz=Az,Mz=Az,Qz=Az,Pz=Az;var Ez=Yz.performance||{},Dz=Ez.now||Ez.mozNow||Ez.msNow||Ez.oNow||Ez.webkitNow||function(){return(new Date).getTime()};var Oz=new Date;var _z={nextTick:function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];xz.push(new wz(t,e)),1!==xz.length||Hz||Lz(Tz)},title:"browser",browser:!0,env:{},argv:[],version:"",versions:{},on:Fz,addListener:zz,once:Bz,off:jz,removeListener:Mz,removeAllListeners:Qz,emit:Pz,binding:function(t){throw new Error("process.binding is not supported")},cwd:function(){return"/"},chdir:function(t){throw new Error("process.chdir is not supported")},umask:function(){return 0},hrtime:function(t){var e=.001*Dz.call(Ez),n=Math.floor(e),r=Math.floor(e%1*1e9);return t&&(n-=t[0],(r-=t[1])<0&&(n--,r+=1e9)),[n,r]},platform:"browser",release:{},config:{},uptime:function(){return(new Date-Oz)/1e3}},qz=_z,$z=gz,tB=function(t,e,n,r,i){return t.config=e,n&&(t.code=n),t.request=r,t.response=i,t.isAxiosError=!0,t.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}},t},eB={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},nB=tB,rB=function(t,e,n,r,i){var c=new Error(t);return nB(c,e,n,r,i)},iB=rB,cB=gz,aB=cB.isStandardBrowserEnv()?{write:function(t,e,n,r,i,c){var a=[];a.push(t+"="+encodeURIComponent(e)),cB.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),cB.isString(r)&&a.push("path="+r),cB.isString(i)&&a.push("domain="+i),!0===c&&a.push("secure"),document.cookie=a.join("; ")},read:function(t){var e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(t){this.write(t,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}},oB=function(t){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)},lB=function(t,e){return e?t.replace(/\/+$/,"")+"/"+e.replace(/^\/+/,""):t},uB=gz,sB=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"],dB=gz,mB=dB.isStandardBrowserEnv()?function(){var t,e=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function r(t){var r=t;return e&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return t=r(window.location.href),function(e){var n=dB.isString(e)?r(e):e;return n.protocol===t.protocol&&n.host===t.host}}():function(){return!0};function hB(t){this.message=t}hB.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},hB.prototype.__CANCEL__=!0;var bB=hB,ZB=gz,pB=function(t,e,n){var r=n.config.validateStatus;n.status&&r&&!r(n.status)?e(iB("Request failed with status code "+n.status,n.config,null,n.request,n)):t(n)},IB=aB,yB=Vz,XB=function(t,e){return t&&!oB(e)?lB(t,e):e},gB=function(t){var e,n,r,i={};return t?(uB.forEach(t.split("\n"),(function(t){if(r=t.indexOf(":"),e=uB.trim(t.substr(0,r)).toLowerCase(),n=uB.trim(t.substr(r+1)),e){if(i[e]&&sB.indexOf(e)>=0)return;i[e]="set-cookie"===e?(i[e]?i[e]:[]).concat([n]):i[e]?i[e]+", "+n:n}})),i):i},GB=mB,fB=rB,VB=eB,WB=bB,vB=function(t){return new Promise((function(e,n){var r,i=t.data,c=t.headers,a=t.responseType;function o(){t.cancelToken&&t.cancelToken.unsubscribe(r),t.signal&&t.signal.removeEventListener("abort",r)}ZB.isFormData(i)&&delete c["Content-Type"];var l=new XMLHttpRequest;if(t.auth){var u=t.auth.username||"",s=t.auth.password?unescape(encodeURIComponent(t.auth.password)):"";c.Authorization="Basic "+btoa(u+":"+s)}var d=XB(t.baseURL,t.url);function m(){if(l){var r="getAllResponseHeaders"in l?gB(l.getAllResponseHeaders()):null,i={data:a&&"text"!==a&&"json"!==a?l.response:l.responseText,status:l.status,statusText:l.statusText,headers:r,config:t,request:l};pB((function(t){e(t),o()}),(function(t){n(t),o()}),i),l=null}}if(l.open(t.method.toUpperCase(),yB(d,t.params,t.paramsSerializer),!0),l.timeout=t.timeout,"onloadend"in l?l.onloadend=m:l.onreadystatechange=function(){l&&4===l.readyState&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))&&setTimeout(m)},l.onabort=function(){l&&(n(fB("Request aborted",t,"ECONNABORTED",l)),l=null)},l.onerror=function(){n(fB("Network Error",t,null,l)),l=null},l.ontimeout=function(){var e=t.timeout?"timeout of "+t.timeout+"ms exceeded":"timeout exceeded",r=t.transitional||VB;t.timeoutErrorMessage&&(e=t.timeoutErrorMessage),n(fB(e,t,r.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",l)),l=null},ZB.isStandardBrowserEnv()){var h=(t.withCredentials||GB(d))&&t.xsrfCookieName?IB.read(t.xsrfCookieName):void 0;h&&(c[t.xsrfHeaderName]=h)}"setRequestHeader"in l&&ZB.forEach(c,(function(t,e){void 0===i&&"content-type"===e.toLowerCase()?delete c[e]:l.setRequestHeader(e,t)})),ZB.isUndefined(t.withCredentials)||(l.withCredentials=!!t.withCredentials),a&&"json"!==a&&(l.responseType=t.responseType),"function"==typeof t.onDownloadProgress&&l.addEventListener("progress",t.onDownloadProgress),"function"==typeof t.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",t.onUploadProgress),(t.cancelToken||t.signal)&&(r=function(t){l&&(n(!t||t&&t.type?new WB("canceled"):t),l.abort(),l=null)},t.cancelToken&&t.cancelToken.subscribe(r),t.signal&&(t.signal.aborted?r():t.signal.addEventListener("abort",r))),i||(i=null),l.send(i)}))},CB=gz,YB=function(t,e){$z.forEach(t,(function(n,r){r!==e&&r.toUpperCase()===e.toUpperCase()&&(t[e]=n,delete t[r])}))},SB=tB,RB={"Content-Type":"application/x-www-form-urlencoded"};function KB(t,e){!CB.isUndefined(t)&&CB.isUndefined(t["Content-Type"])&&(t["Content-Type"]=e)}var NB,LB={transitional:eB,adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==qz&&"[object process]"===Object.prototype.toString.call(qz))&&(NB=vB),NB),transformRequest:[function(t,e){return YB(e,"Accept"),YB(e,"Content-Type"),CB.isFormData(t)||CB.isArrayBuffer(t)||CB.isBuffer(t)||CB.isStream(t)||CB.isFile(t)||CB.isBlob(t)?t:CB.isArrayBufferView(t)?t.buffer:CB.isURLSearchParams(t)?(KB(e,"application/x-www-form-urlencoded;charset=utf-8"),t.toString()):CB.isObject(t)||e&&"application/json"===e["Content-Type"]?(KB(e,"application/json"),function(t,e,n){if(CB.isString(t))try{return(e||JSON.parse)(t),CB.trim(t)}catch(t){if("SyntaxError"!==t.name)throw t}return(n||JSON.stringify)(t)}(t)):t}],transformResponse:[function(t){var e=this.transitional||LB.transitional,n=e&&e.silentJSONParsing,r=e&&e.forcedJSONParsing,i=!n&&"json"===this.responseType;if(i||r&&CB.isString(t)&&t.length)try{return JSON.parse(t)}catch(t){if(i){if("SyntaxError"===t.name)throw SB(t,this,"E_JSON_PARSE");throw t}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};CB.forEach(["delete","get","head"],(function(t){LB.headers[t]={}})),CB.forEach(["post","put","patch"],(function(t){LB.headers[t]=CB.merge(RB)}));var JB=LB,xB=gz,HB=JB,kB=function(t){return!(!t||!t.__CANCEL__)},UB=gz,TB=function(t,e,n){var r=this||HB;return xB.forEach(n,(function(n){t=n.call(r,t,e)})),t},wB=kB,AB=JB,FB=bB;function zB(t){if(t.cancelToken&&t.cancelToken.throwIfRequested(),t.signal&&t.signal.aborted)throw new FB("canceled")}var BB=gz,jB=function(t,e){e=e||{};var n={};function r(t,e){return BB.isPlainObject(t)&&BB.isPlainObject(e)?BB.merge(t,e):BB.isPlainObject(e)?BB.merge({},e):BB.isArray(e)?e.slice():e}function i(n){return BB.isUndefined(e[n])?BB.isUndefined(t[n])?void 0:r(void 0,t[n]):r(t[n],e[n])}function c(t){if(!BB.isUndefined(e[t]))return r(void 0,e[t])}function a(n){return BB.isUndefined(e[n])?BB.isUndefined(t[n])?void 0:r(void 0,t[n]):r(void 0,e[n])}function o(n){return n in e?r(t[n],e[n]):n in t?r(void 0,t[n]):void 0}var l={url:c,method:c,data:c,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:o};return BB.forEach(Object.keys(t).concat(Object.keys(e)),(function(t){var e=l[t]||i,r=e(t);BB.isUndefined(r)&&e!==o||(n[t]=r)})),n},MB="0.26.1",QB=MB,PB={};["object","boolean","number","function","string","symbol"].forEach((function(t,e){PB[t]=function(n){return a(n)===t||"a"+(e<1?"n ":" ")+t}}));var EB={};PB.transitional=function(t,e,n){function r(t,e){return"[Axios v"+QB+"] Transitional option '"+t+"'"+e+(n?". "+n:"")}return function(n,i,c){if(!1===t)throw new Error(r(i," has been removed"+(e?" in "+e:"")));return e&&!EB[i]&&(EB[i]=!0,console.warn(r(i," has been deprecated since v"+e+" and will be removed in the near future"))),!t||t(n,i,c)}};var DB={assertOptions:function(t,e,n){if("object"!==a(t))throw new TypeError("options must be an object");for(var r=Object.keys(t),i=r.length;i-- >0;){var c=r[i],o=e[c];if(o){var l=t[c],u=void 0===l||o(l,c,t);if(!0!==u)throw new TypeError("option "+c+" must be "+u)}else if(!0!==n)throw Error("Unknown option "+c)}},validators:PB},OB=gz,_B=Vz,qB=Cz,$B=function(t){return zB(t),t.headers=t.headers||{},t.data=TB.call(t,t.data,t.headers,t.transformRequest),t.headers=UB.merge(t.headers.common||{},t.headers[t.method]||{},t.headers),UB.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete t.headers[e]})),(t.adapter||AB.adapter)(t).then((function(e){return zB(t),e.data=TB.call(t,e.data,e.headers,t.transformResponse),e}),(function(e){return wB(e)||(zB(t),e&&e.response&&(e.response.data=TB.call(t,e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)}))},tj=jB,ej=DB,nj=ej.validators;function rj(t){this.defaults=t,this.interceptors={request:new qB,response:new qB}}rj.prototype.request=function(t,e){"string"==typeof t?(e=e||{}).url=t:e=t||{},(e=tj(this.defaults,e)).method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var n=e.transitional;void 0!==n&&ej.assertOptions(n,{silentJSONParsing:nj.transitional(nj.boolean),forcedJSONParsing:nj.transitional(nj.boolean),clarifyTimeoutError:nj.transitional(nj.boolean)},!1);var r=[],i=!0;this.interceptors.request.forEach((function(t){"function"==typeof t.runWhen&&!1===t.runWhen(e)||(i=i&&t.synchronous,r.unshift(t.fulfilled,t.rejected))}));var c,a=[];if(this.interceptors.response.forEach((function(t){a.push(t.fulfilled,t.rejected)})),!i){var o=[$B,void 0];for(Array.prototype.unshift.apply(o,r),o=o.concat(a),c=Promise.resolve(e);o.length;)c=c.then(o.shift(),o.shift());return c}for(var l=e;r.length;){var u=r.shift(),s=r.shift();try{l=u(l)}catch(t){s(t);break}}try{c=$B(l)}catch(t){return Promise.reject(t)}for(;a.length;)c=c.then(a.shift(),a.shift());return c},rj.prototype.getUri=function(t){return t=tj(this.defaults,t),_B(t.url,t.params,t.paramsSerializer).replace(/^\?/,"")},OB.forEach(["delete","get","head","options"],(function(t){rj.prototype[t]=function(e,n){return this.request(tj(n||{},{method:t,url:e,data:(n||{}).data}))}})),OB.forEach(["post","put","patch"],(function(t){rj.prototype[t]=function(e,n,r){return this.request(tj(r||{},{method:t,url:e,data:n}))}}));var ij=rj,cj=bB;function aj(t){if("function"!=typeof t)throw new TypeError("executor must be a function.");var e;this.promise=new Promise((function(t){e=t}));var n=this;this.promise.then((function(t){if(n._listeners){var e,r=n._listeners.length;for(e=0;e<r;e++)n._listeners[e](t);n._listeners=null}})),this.promise.then=function(t){var e,r=new Promise((function(t){n.subscribe(t),e=t})).then(t);return r.cancel=function(){n.unsubscribe(e)},r},t((function(t){n.reason||(n.reason=new cj(t),e(n.reason))}))}aj.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},aj.prototype.subscribe=function(t){this.reason?t(this.reason):this._listeners?this._listeners.push(t):this._listeners=[t]},aj.prototype.unsubscribe=function(t){if(this._listeners){var e=this._listeners.indexOf(t);-1!==e&&this._listeners.splice(e,1)}},aj.source=function(){var t,e=new aj((function(e){t=e}));return{token:e,cancel:t}};var oj=aj,lj=gz,uj=gz,sj=sz,dj=ij,mj=jB;var hj=function t(e){var n=new dj(e),r=sj(dj.prototype.request,n);return uj.extend(r,dj.prototype,n),uj.extend(r,n),r.create=function(n){return t(mj(e,n))},r}(JB);hj.Axios=dj,hj.Cancel=bB,hj.CancelToken=oj,hj.isCancel=kB,hj.VERSION=MB,hj.all=function(t){return Promise.all(t)},hj.spread=function(t){return function(e){return t.apply(null,e)}},hj.isAxiosError=function(t){return lj.isObject(t)&&!0===t.isAxiosError},uz.exports=hj,uz.exports.default=hj;var bj,Zj=uz.exports;var pj=bj=function(){function t(){u(this,t),this.attachToken=function(){return Promise.resolve()},this.requestStartCallback=function(){return null},this.requestSuccessCallback=function(){return null},this.requestErrorCallback=function(){return null},this.requestFinishCallback=function(){return null},this.init=this.init.bind(this),this.setHttpRequestErrorCallback=this.setHttpRequestErrorCallback.bind(this),this.setHttpRequestFinishCallback=this.setHttpRequestFinishCallback.bind(this),this.setHttpRequestStartCallback=this.setHttpRequestStartCallback.bind(this),this.setHttpRequestSuccessCallback=this.setHttpRequestSuccessCallback.bind(this)}return d(t,[{key:"requestHandler",value:function(t){return rF(this,void 0,void 0,c().mark((function e(){var n,r;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.attachToken(t);case 2:return(null==t?void 0:t.shouldEncodeToFormData)&&(n=null==t?void 0:t.data,r=new FormData,Object.keys(n).forEach((function(t){r.append(t,n[t])})),t.data=r),t.startTimeInMs=(new Date).getTime(),bj.isHandlerEnabled&&this.requestStartCallback&&"function"==typeof this.requestStartCallback&&this.requestStartCallback(t),e.abrupt("return",t);case 6:case"end":return e.stop()}}),e,this)})))}},{key:"errorHandler",value:function(t){throw bj.isHandlerEnabled&&(this.requestErrorCallback&&"function"==typeof this.requestErrorCallback&&this.requestErrorCallback(t),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),t}},{key:"successHandler",value:function(t){return bj.isHandlerEnabled&&(this.requestSuccessCallback&&"function"==typeof this.requestSuccessCallback&&this.requestSuccessCallback(t),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),t}},{key:"init",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],e=arguments.length>1?arguments[1]:void 0;return rF(this,void 0,void 0,c().mark((function n(){return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:bj.isHandlerEnabled=t,this.attachToken=e;case 2:case"end":return n.stop()}}),n,this)})))}},{key:"enableHandler",value:function(){bj.isHandlerEnabled=!0}},{key:"disableHandler",value:function(){bj.isHandlerEnabled=!1}},{key:"disableHandlerWithTimeout",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:bj.DEFAULT_HANDLER_DISABLE_TIMEOUT;bj.isHandlerEnabled=!1,setTimeout((function(){bj.isHandlerEnabled=!0}),t)}},{key:"setHttpRequestStartCallback",value:function(t){this.requestStartCallback=t}},{key:"setHttpRequestSuccessCallback",value:function(t){this.requestSuccessCallback=t}},{key:"setHttpRequestErrorCallback",value:function(t){this.requestErrorCallback=t}},{key:"setHttpRequestFinishCallback",value:function(t){this.requestFinishCallback=t}}],[{key:"getInstance",value:function(){var t=this;return this.axiosInstance||(this.axiosInstance=Zj.create({withCredentials:!0}),this.clientInstance||(this.clientInstance=new bj),this.axiosInstance.interceptors.request.use((function(e){return rF(t,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.clientInstance.requestHandler(e);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t,this)})))})),this.axiosInstance.interceptors.response.use((function(e){return t.clientInstance.successHandler(e)}),(function(e){return t.clientInstance.errorHandler(e)})),this.axiosInstance.all=Zj.all,this.axiosInstance.spread=Zj.spread,this.axiosInstance.init=this.clientInstance.init,this.axiosInstance.enableHandler=this.clientInstance.enableHandler,this.axiosInstance.disableHandler=this.clientInstance.disableHandler,this.axiosInstance.disableHandlerWithTimeout=this.clientInstance.disableHandlerWithTimeout,this.axiosInstance.setHttpRequestStartCallback=this.clientInstance.setHttpRequestStartCallback,this.axiosInstance.setHttpRequestSuccessCallback=this.clientInstance.setHttpRequestSuccessCallback,this.axiosInstance.setHttpRequestErrorCallback=this.clientInstance.setHttpRequestErrorCallback,this.axiosInstance.setHttpRequestFinishCallback=this.clientInstance.setHttpRequestFinishCallback),this.axiosInstance}}]),t}();pj.DEFAULT_HANDLER_DISABLE_TIMEOUT=1e3,pj=bj=function(t,e,n,r){var i,c=arguments.length,o=c<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"===("undefined"==typeof Reflect?"undefined":a(Reflect))&&"function"==typeof Reflect.decorate)o=Reflect.decorate(t,e,n,r);else for(var l=t.length-1;l>=0;l--)(i=t[l])&&(o=(c<3?i(o):c>3?i(e,n,o):i(e,n))||o);return c>3&&o&&Object.defineProperty(e,n,o),o}([function(t){}],pj);var Ij=function(){function t(){u(this,t)}return d(t,[{key:"setData",value:function(t,e){return rF(this,void 0,void 0,c().mark((function n(){return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:localStorage.setItem(t,e);case 1:case"end":return n.stop()}}),n)})))}},{key:"getData",value:function(t){var e;return rF(this,void 0,void 0,c().mark((function n(){return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.abrupt("return",null!==(e=localStorage.getItem(t))&&void 0!==e?e:"{}");case 1:case"end":return n.stop()}}),n)})))}},{key:"removeData",value:function(t){return rF(this,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:localStorage.removeItem(t);case 1:case"end":return e.stop()}}),e)})))}}]),t}(),yj=function(){function t(){u(this,t),this._data=new Map}return d(t,[{key:"setData",value:function(t,e){return rF(this,void 0,void 0,c().mark((function n(){return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:this._data.set(t,e);case 1:case"end":return n.stop()}}),n,this)})))}},{key:"getData",value:function(t){var e,n;return rF(this,void 0,void 0,c().mark((function r(){return c().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.abrupt("return",null!==(n=null===(e=this._data)||void 0===e?void 0:e.get(t))&&void 0!==n?n:"{}");case 1:case"end":return r.stop()}}),r,this)})))}},{key:"removeData",value:function(t){return rF(this,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this._data.delete(t);case 1:case"end":return e.stop()}}),e,this)})))}}]),t}(),Xj=function(){function t(){u(this,t)}return d(t,[{key:"setData",value:function(t,e){return rF(this,void 0,void 0,c().mark((function n(){return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:sessionStorage.setItem(t,e);case 1:case"end":return n.stop()}}),n)})))}},{key:"getData",value:function(t){var e;return rF(this,void 0,void 0,c().mark((function n(){return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.abrupt("return",null!==(e=sessionStorage.getItem(t))&&void 0!==e?e:"{}");case 1:case"end":return n.stop()}}),n)})))}},{key:"removeData",value:function(t){return rF(this,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:sessionStorage.removeItem(t);case 1:case"end":return e.stop()}}),e)})))}}]),t}(),gj=[],Gj=[],fj="undefined"!=typeof Uint8Array?Uint8Array:Array,Vj=!1;function Wj(){Vj=!0;for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e=0,n=t.length;e<n;++e)gj[e]=t[e],Gj[t.charCodeAt(e)]=e;Gj["-".charCodeAt(0)]=62,Gj["_".charCodeAt(0)]=63}function vj(t,e,n){for(var r,i,c=[],a=e;a<n;a+=3)r=(t[a]<<16)+(t[a+1]<<8)+t[a+2],c.push(gj[(i=r)>>18&63]+gj[i>>12&63]+gj[i>>6&63]+gj[63&i]);return c.join("")}function Cj(t){var e;Vj||Wj();for(var n=t.length,r=n%3,i="",c=[],a=16383,o=0,l=n-r;o<l;o+=a)c.push(vj(t,o,o+a>l?l:o+a));return 1===r?(e=t[n-1],i+=gj[e>>2],i+=gj[e<<4&63],i+="=="):2===r&&(e=(t[n-2]<<8)+t[n-1],i+=gj[e>>10],i+=gj[e>>4&63],i+=gj[e<<2&63],i+="="),c.push(i),c.join("")}function Yj(t,e,n,r,i){var c,a,o=8*i-r-1,l=(1<<o)-1,u=l>>1,s=-7,d=n?i-1:0,m=n?-1:1,h=t[e+d];for(d+=m,c=h&(1<<-s)-1,h>>=-s,s+=o;s>0;c=256*c+t[e+d],d+=m,s-=8);for(a=c&(1<<-s)-1,c>>=-s,s+=r;s>0;a=256*a+t[e+d],d+=m,s-=8);if(0===c)c=1-u;else{if(c===l)return a?NaN:1/0*(h?-1:1);a+=Math.pow(2,r),c-=u}return(h?-1:1)*a*Math.pow(2,c-r)}function Sj(t,e,n,r,i,c){var a,o,l,u=8*c-i-1,s=(1<<u)-1,d=s>>1,m=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:c-1,b=r?1:-1,Z=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(o=isNaN(e)?1:0,a=s):(a=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-a))<1&&(a--,l*=2),(e+=a+d>=1?m/l:m*Math.pow(2,1-d))*l>=2&&(a++,l/=2),a+d>=s?(o=0,a=s):a+d>=1?(o=(e*l-1)*Math.pow(2,i),a+=d):(o=e*Math.pow(2,d-1)*Math.pow(2,i),a=0));i>=8;t[n+h]=255&o,h+=b,o/=256,i-=8);for(a=a<<i|o,u+=i;u>0;t[n+h]=255&a,h+=b,a/=256,u-=8);t[n+h-b]|=128*Z}var Rj={}.toString,Kj=Array.isArray||function(t){return"[object Array]"==Rj.call(t)};xj.TYPED_ARRAY_SUPPORT=void 0===Yz.TYPED_ARRAY_SUPPORT||Yz.TYPED_ARRAY_SUPPORT;var Nj=Lj();function Lj(){return xj.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Jj(t,e){if(Lj()<e)throw new RangeError("Invalid typed array length");return xj.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(e)).__proto__=xj.prototype:(null===t&&(t=new xj(e)),t.length=e),t}function xj(t,e,n){if(!(xj.TYPED_ARRAY_SUPPORT||this instanceof xj))return new xj(t,e,n);if("number"==typeof t){if("string"==typeof e)throw new Error("If encoding is specified then the first argument must be a string");return Uj(this,t)}return Hj(this,t,e,n)}function Hj(t,e,n,r){if("number"==typeof e)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer?function(t,e,n,r){if(e.byteLength,n<0||e.byteLength<n)throw new RangeError("'offset' is out of bounds");if(e.byteLength<n+(r||0))throw new RangeError("'length' is out of bounds");e=void 0===n&&void 0===r?new Uint8Array(e):void 0===r?new Uint8Array(e,n):new Uint8Array(e,n,r);xj.TYPED_ARRAY_SUPPORT?(t=e).__proto__=xj.prototype:t=Tj(t,e);return t}(t,e,n,r):"string"==typeof e?function(t,e,n){"string"==typeof n&&""!==n||(n="utf8");if(!xj.isEncoding(n))throw new TypeError('"encoding" must be a valid string encoding');var r=0|Fj(e,n),i=(t=Jj(t,r)).write(e,n);i!==r&&(t=t.slice(0,i));return t}(t,e,n):function(t,e){if(Aj(e)){var n=0|wj(e.length);return 0===(t=Jj(t,n)).length||e.copy(t,0,0,n),t}if(e){if("undefined"!=typeof ArrayBuffer&&e.buffer instanceof ArrayBuffer||"length"in e)return"number"!=typeof e.length||(r=e.length)!=r?Jj(t,0):Tj(t,e);if("Buffer"===e.type&&Kj(e.data))return Tj(t,e.data)}var r;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(t,e)}function kj(t){if("number"!=typeof t)throw new TypeError('"size" argument must be a number');if(t<0)throw new RangeError('"size" argument must not be negative')}function Uj(t,e){if(kj(e),t=Jj(t,e<0?0:0|wj(e)),!xj.TYPED_ARRAY_SUPPORT)for(var n=0;n<e;++n)t[n]=0;return t}function Tj(t,e){var n=e.length<0?0:0|wj(e.length);t=Jj(t,n);for(var r=0;r<n;r+=1)t[r]=255&e[r];return t}function wj(t){if(t>=Lj())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+Lj().toString(16)+" bytes");return 0|t}function Aj(t){return!(null==t||!t._isBuffer)}function Fj(t,e){if(Aj(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var n=t.length;if(0===n)return 0;for(var r=!1;;)switch(e){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return hM(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return bM(t).length;default:if(r)return hM(t).length;e=(""+e).toLowerCase(),r=!0}}function zj(t,e,n){var r=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return nM(this,e,n);case"utf8":case"utf-8":return $j(this,e,n);case"ascii":return tM(this,e,n);case"latin1":case"binary":return eM(this,e,n);case"base64":return qj(this,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return rM(this,e,n);default:if(r)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),r=!0}}function Bj(t,e,n){var r=t[e];t[e]=t[n],t[n]=r}function jj(t,e,n,r,i){if(0===t.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=i?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(i)return-1;n=t.length-1}else if(n<0){if(!i)return-1;n=0}if("string"==typeof e&&(e=xj.from(e,r)),Aj(e))return 0===e.length?-1:Mj(t,e,n,r,i);if("number"==typeof e)return e&=255,xj.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,n):Uint8Array.prototype.lastIndexOf.call(t,e,n):Mj(t,[e],n,r,i);throw new TypeError("val must be string, number or Buffer")}function Mj(t,e,n,r,i){var c,a=1,o=t.length,l=e.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(t.length<2||e.length<2)return-1;a=2,o/=2,l/=2,n/=2}function u(t,e){return 1===a?t[e]:t.readUInt16BE(e*a)}if(i){var s=-1;for(c=n;c<o;c++)if(u(t,c)===u(e,-1===s?0:c-s)){if(-1===s&&(s=c),c-s+1===l)return s*a}else-1!==s&&(c-=c-s),s=-1}else for(n+l>o&&(n=o-l),c=n;c>=0;c--){for(var d=!0,m=0;m<l;m++)if(u(t,c+m)!==u(e,m)){d=!1;break}if(d)return c}return-1}function Qj(t,e,n,r){n=Number(n)||0;var i=t.length-n;r?(r=Number(r))>i&&(r=i):r=i;var c=e.length;if(c%2!=0)throw new TypeError("Invalid hex string");r>c/2&&(r=c/2);for(var a=0;a<r;++a){var o=parseInt(e.substr(2*a,2),16);if(isNaN(o))return a;t[n+a]=o}return a}function Pj(t,e,n,r){return ZM(hM(e,t.length-n),t,n,r)}function Ej(t,e,n,r){return ZM(function(t){for(var e=[],n=0;n<t.length;++n)e.push(255&t.charCodeAt(n));return e}(e),t,n,r)}function Dj(t,e,n,r){return Ej(t,e,n,r)}function Oj(t,e,n,r){return ZM(bM(e),t,n,r)}function _j(t,e,n,r){return ZM(function(t,e){for(var n,r,i,c=[],a=0;a<t.length&&!((e-=2)<0);++a)r=(n=t.charCodeAt(a))>>8,i=n%256,c.push(i),c.push(r);return c}(e,t.length-n),t,n,r)}function qj(t,e,n){return 0===e&&n===t.length?Cj(t):Cj(t.slice(e,n))}function $j(t,e,n){n=Math.min(t.length,n);for(var r=[],i=e;i<n;){var c,a,o,l,u=t[i],s=null,d=u>239?4:u>223?3:u>191?2:1;if(i+d<=n)switch(d){case 1:u<128&&(s=u);break;case 2:128==(192&(c=t[i+1]))&&(l=(31&u)<<6|63&c)>127&&(s=l);break;case 3:c=t[i+1],a=t[i+2],128==(192&c)&&128==(192&a)&&(l=(15&u)<<12|(63&c)<<6|63&a)>2047&&(l<55296||l>57343)&&(s=l);break;case 4:c=t[i+1],a=t[i+2],o=t[i+3],128==(192&c)&&128==(192&a)&&128==(192&o)&&(l=(15&u)<<18|(63&c)<<12|(63&a)<<6|63&o)>65535&&l<1114112&&(s=l)}null===s?(s=65533,d=1):s>65535&&(s-=65536,r.push(s>>>10&1023|55296),s=56320|1023&s),r.push(s),i+=d}return function(t){var e=t.length;if(e<=4096)return String.fromCharCode.apply(String,t);var n="",r=0;for(;r<e;)n+=String.fromCharCode.apply(String,t.slice(r,r+=4096));return n}(r)}xj.poolSize=8192,xj._augment=function(t){return t.__proto__=xj.prototype,t},xj.from=function(t,e,n){return Hj(null,t,e,n)},xj.TYPED_ARRAY_SUPPORT&&(xj.prototype.__proto__=Uint8Array.prototype,xj.__proto__=Uint8Array),xj.alloc=function(t,e,n){return function(t,e,n,r){return kj(e),e<=0?Jj(t,e):void 0!==n?"string"==typeof r?Jj(t,e).fill(n,r):Jj(t,e).fill(n):Jj(t,e)}(null,t,e,n)},xj.allocUnsafe=function(t){return Uj(null,t)},xj.allocUnsafeSlow=function(t){return Uj(null,t)},xj.isBuffer=pM,xj.compare=function(t,e){if(!Aj(t)||!Aj(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var n=t.length,r=e.length,i=0,c=Math.min(n,r);i<c;++i)if(t[i]!==e[i]){n=t[i],r=e[i];break}return n<r?-1:r<n?1:0},xj.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},xj.concat=function(t,e){if(!Kj(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return xj.alloc(0);var n;if(void 0===e)for(e=0,n=0;n<t.length;++n)e+=t[n].length;var r=xj.allocUnsafe(e),i=0;for(n=0;n<t.length;++n){var c=t[n];if(!Aj(c))throw new TypeError('"list" argument must be an Array of Buffers');c.copy(r,i),i+=c.length}return r},xj.byteLength=Fj,xj.prototype._isBuffer=!0,xj.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var e=0;e<t;e+=2)Bj(this,e,e+1);return this},xj.prototype.swap32=function(){var t=this.length;if(t%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var e=0;e<t;e+=4)Bj(this,e,e+3),Bj(this,e+1,e+2);return this},xj.prototype.swap64=function(){var t=this.length;if(t%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var e=0;e<t;e+=8)Bj(this,e,e+7),Bj(this,e+1,e+6),Bj(this,e+2,e+5),Bj(this,e+3,e+4);return this},xj.prototype.toString=function(){var t=0|this.length;return 0===t?"":0===arguments.length?$j(this,0,t):zj.apply(this,arguments)},xj.prototype.equals=function(t){if(!Aj(t))throw new TypeError("Argument must be a Buffer");return this===t||0===xj.compare(this,t)},xj.prototype.inspect=function(){var t="";return this.length>0&&(t=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(t+=" ... ")),"<Buffer "+t+">"},xj.prototype.compare=function(t,e,n,r,i){if(!Aj(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===n&&(n=t?t.length:0),void 0===r&&(r=0),void 0===i&&(i=this.length),e<0||n>t.length||r<0||i>this.length)throw new RangeError("out of range index");if(r>=i&&e>=n)return 0;if(r>=i)return-1;if(e>=n)return 1;if(this===t)return 0;for(var c=(i>>>=0)-(r>>>=0),a=(n>>>=0)-(e>>>=0),o=Math.min(c,a),l=this.slice(r,i),u=t.slice(e,n),s=0;s<o;++s)if(l[s]!==u[s]){c=l[s],a=u[s];break}return c<a?-1:a<c?1:0},xj.prototype.includes=function(t,e,n){return-1!==this.indexOf(t,e,n)},xj.prototype.indexOf=function(t,e,n){return jj(this,t,e,n,!0)},xj.prototype.lastIndexOf=function(t,e,n){return jj(this,t,e,n,!1)},xj.prototype.write=function(t,e,n,r){if(void 0===e)r="utf8",n=this.length,e=0;else if(void 0===n&&"string"==typeof e)r=e,n=this.length,e=0;else{if(!isFinite(e))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");e|=0,isFinite(n)?(n|=0,void 0===r&&(r="utf8")):(r=n,n=void 0)}var i=this.length-e;if((void 0===n||n>i)&&(n=i),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var c=!1;;)switch(r){case"hex":return Qj(this,t,e,n);case"utf8":case"utf-8":return Pj(this,t,e,n);case"ascii":return Ej(this,t,e,n);case"latin1":case"binary":return Dj(this,t,e,n);case"base64":return Oj(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return _j(this,t,e,n);default:if(c)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),c=!0}},xj.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function tM(t,e,n){var r="";n=Math.min(t.length,n);for(var i=e;i<n;++i)r+=String.fromCharCode(127&t[i]);return r}function eM(t,e,n){var r="";n=Math.min(t.length,n);for(var i=e;i<n;++i)r+=String.fromCharCode(t[i]);return r}function nM(t,e,n){var r=t.length;(!e||e<0)&&(e=0),(!n||n<0||n>r)&&(n=r);for(var i="",c=e;c<n;++c)i+=mM(t[c]);return i}function rM(t,e,n){for(var r=t.slice(e,n),i="",c=0;c<r.length;c+=2)i+=String.fromCharCode(r[c]+256*r[c+1]);return i}function iM(t,e,n){if(t%1!=0||t<0)throw new RangeError("offset is not uint");if(t+e>n)throw new RangeError("Trying to access beyond buffer length")}function cM(t,e,n,r,i,c){if(!Aj(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||e<c)throw new RangeError('"value" argument is out of bounds');if(n+r>t.length)throw new RangeError("Index out of range")}function aM(t,e,n,r){e<0&&(e=65535+e+1);for(var i=0,c=Math.min(t.length-n,2);i<c;++i)t[n+i]=(e&255<<8*(r?i:1-i))>>>8*(r?i:1-i)}function oM(t,e,n,r){e<0&&(e=4294967295+e+1);for(var i=0,c=Math.min(t.length-n,4);i<c;++i)t[n+i]=e>>>8*(r?i:3-i)&255}function lM(t,e,n,r,i,c){if(n+r>t.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function uM(t,e,n,r,i){return i||lM(t,0,n,4),Sj(t,e,n,r,23,4),n+4}function sM(t,e,n,r,i){return i||lM(t,0,n,8),Sj(t,e,n,r,52,8),n+8}xj.prototype.slice=function(t,e){var n,r=this.length;if((t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e<t&&(e=t),xj.TYPED_ARRAY_SUPPORT)(n=this.subarray(t,e)).__proto__=xj.prototype;else{var i=e-t;n=new xj(i,void 0);for(var c=0;c<i;++c)n[c]=this[c+t]}return n},xj.prototype.readUIntLE=function(t,e,n){t|=0,e|=0,n||iM(t,e,this.length);for(var r=this[t],i=1,c=0;++c<e&&(i*=256);)r+=this[t+c]*i;return r},xj.prototype.readUIntBE=function(t,e,n){t|=0,e|=0,n||iM(t,e,this.length);for(var r=this[t+--e],i=1;e>0&&(i*=256);)r+=this[t+--e]*i;return r},xj.prototype.readUInt8=function(t,e){return e||iM(t,1,this.length),this[t]},xj.prototype.readUInt16LE=function(t,e){return e||iM(t,2,this.length),this[t]|this[t+1]<<8},xj.prototype.readUInt16BE=function(t,e){return e||iM(t,2,this.length),this[t]<<8|this[t+1]},xj.prototype.readUInt32LE=function(t,e){return e||iM(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},xj.prototype.readUInt32BE=function(t,e){return e||iM(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},xj.prototype.readIntLE=function(t,e,n){t|=0,e|=0,n||iM(t,e,this.length);for(var r=this[t],i=1,c=0;++c<e&&(i*=256);)r+=this[t+c]*i;return r>=(i*=128)&&(r-=Math.pow(2,8*e)),r},xj.prototype.readIntBE=function(t,e,n){t|=0,e|=0,n||iM(t,e,this.length);for(var r=e,i=1,c=this[t+--r];r>0&&(i*=256);)c+=this[t+--r]*i;return c>=(i*=128)&&(c-=Math.pow(2,8*e)),c},xj.prototype.readInt8=function(t,e){return e||iM(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},xj.prototype.readInt16LE=function(t,e){e||iM(t,2,this.length);var n=this[t]|this[t+1]<<8;return 32768&n?4294901760|n:n},xj.prototype.readInt16BE=function(t,e){e||iM(t,2,this.length);var n=this[t+1]|this[t]<<8;return 32768&n?4294901760|n:n},xj.prototype.readInt32LE=function(t,e){return e||iM(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},xj.prototype.readInt32BE=function(t,e){return e||iM(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},xj.prototype.readFloatLE=function(t,e){return e||iM(t,4,this.length),Yj(this,t,!0,23,4)},xj.prototype.readFloatBE=function(t,e){return e||iM(t,4,this.length),Yj(this,t,!1,23,4)},xj.prototype.readDoubleLE=function(t,e){return e||iM(t,8,this.length),Yj(this,t,!0,52,8)},xj.prototype.readDoubleBE=function(t,e){return e||iM(t,8,this.length),Yj(this,t,!1,52,8)},xj.prototype.writeUIntLE=function(t,e,n,r){(t=+t,e|=0,n|=0,r)||cM(this,t,e,n,Math.pow(2,8*n)-1,0);var i=1,c=0;for(this[e]=255&t;++c<n&&(i*=256);)this[e+c]=t/i&255;return e+n},xj.prototype.writeUIntBE=function(t,e,n,r){(t=+t,e|=0,n|=0,r)||cM(this,t,e,n,Math.pow(2,8*n)-1,0);var i=n-1,c=1;for(this[e+i]=255&t;--i>=0&&(c*=256);)this[e+i]=t/c&255;return e+n},xj.prototype.writeUInt8=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,1,255,0),xj.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},xj.prototype.writeUInt16LE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,2,65535,0),xj.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):aM(this,t,e,!0),e+2},xj.prototype.writeUInt16BE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,2,65535,0),xj.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):aM(this,t,e,!1),e+2},xj.prototype.writeUInt32LE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,4,4294967295,0),xj.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):oM(this,t,e,!0),e+4},xj.prototype.writeUInt32BE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,4,4294967295,0),xj.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):oM(this,t,e,!1),e+4},xj.prototype.writeIntLE=function(t,e,n,r){if(t=+t,e|=0,!r){var i=Math.pow(2,8*n-1);cM(this,t,e,n,i-1,-i)}var c=0,a=1,o=0;for(this[e]=255&t;++c<n&&(a*=256);)t<0&&0===o&&0!==this[e+c-1]&&(o=1),this[e+c]=(t/a>>0)-o&255;return e+n},xj.prototype.writeIntBE=function(t,e,n,r){if(t=+t,e|=0,!r){var i=Math.pow(2,8*n-1);cM(this,t,e,n,i-1,-i)}var c=n-1,a=1,o=0;for(this[e+c]=255&t;--c>=0&&(a*=256);)t<0&&0===o&&0!==this[e+c+1]&&(o=1),this[e+c]=(t/a>>0)-o&255;return e+n},xj.prototype.writeInt8=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,1,127,-128),xj.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},xj.prototype.writeInt16LE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,2,32767,-32768),xj.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):aM(this,t,e,!0),e+2},xj.prototype.writeInt16BE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,2,32767,-32768),xj.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):aM(this,t,e,!1),e+2},xj.prototype.writeInt32LE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,4,2147483647,-2147483648),xj.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):oM(this,t,e,!0),e+4},xj.prototype.writeInt32BE=function(t,e,n){return t=+t,e|=0,n||cM(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),xj.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):oM(this,t,e,!1),e+4},xj.prototype.writeFloatLE=function(t,e,n){return uM(this,t,e,!0,n)},xj.prototype.writeFloatBE=function(t,e,n){return uM(this,t,e,!1,n)},xj.prototype.writeDoubleLE=function(t,e,n){return sM(this,t,e,!0,n)},xj.prototype.writeDoubleBE=function(t,e,n){return sM(this,t,e,!1,n)},xj.prototype.copy=function(t,e,n,r){if(n||(n=0),r||0===r||(r=this.length),e>=t.length&&(e=t.length),e||(e=0),r>0&&r<n&&(r=n),r===n)return 0;if(0===t.length||0===this.length)return 0;if(e<0)throw new RangeError("targetStart out of bounds");if(n<0||n>=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),t.length-e<r-n&&(r=t.length-e+n);var i,c=r-n;if(this===t&&n<e&&e<r)for(i=c-1;i>=0;--i)t[i+e]=this[i+n];else if(c<1e3||!xj.TYPED_ARRAY_SUPPORT)for(i=0;i<c;++i)t[i+e]=this[i+n];else Uint8Array.prototype.set.call(t,this.subarray(n,n+c),e);return c},xj.prototype.fill=function(t,e,n,r){if("string"==typeof t){if("string"==typeof e?(r=e,e=0,n=this.length):"string"==typeof n&&(r=n,n=this.length),1===t.length){var i=t.charCodeAt(0);i<256&&(t=i)}if(void 0!==r&&"string"!=typeof r)throw new TypeError("encoding must be a string");if("string"==typeof r&&!xj.isEncoding(r))throw new TypeError("Unknown encoding: "+r)}else"number"==typeof t&&(t&=255);if(e<0||this.length<e||this.length<n)throw new RangeError("Out of range index");if(n<=e)return this;var c;if(e>>>=0,n=void 0===n?this.length:n>>>0,t||(t=0),"number"==typeof t)for(c=e;c<n;++c)this[c]=t;else{var a=Aj(t)?t:hM(new xj(t,r).toString()),o=a.length;for(c=0;c<n-e;++c)this[c+e]=a[c%o]}return this};var dM=/[^+\/0-9A-Za-z-_]/g;function mM(t){return t<16?"0"+t.toString(16):t.toString(16)}function hM(t,e){var n;e=e||1/0;for(var r=t.length,i=null,c=[],a=0;a<r;++a){if((n=t.charCodeAt(a))>55295&&n<57344){if(!i){if(n>56319){(e-=3)>-1&&c.push(239,191,189);continue}if(a+1===r){(e-=3)>-1&&c.push(239,191,189);continue}i=n;continue}if(n<56320){(e-=3)>-1&&c.push(239,191,189),i=n;continue}n=65536+(i-55296<<10|n-56320)}else i&&(e-=3)>-1&&c.push(239,191,189);if(i=null,n<128){if((e-=1)<0)break;c.push(n)}else if(n<2048){if((e-=2)<0)break;c.push(n>>6|192,63&n|128)}else if(n<65536){if((e-=3)<0)break;c.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;c.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return c}function bM(t){return function(t){var e,n,r,i,c,a;Vj||Wj();var o=t.length;if(o%4>0)throw new Error("Invalid string. Length must be a multiple of 4");c="="===t[o-2]?2:"="===t[o-1]?1:0,a=new fj(3*o/4-c),r=c>0?o-4:o;var l=0;for(e=0,n=0;e<r;e+=4,n+=3)i=Gj[t.charCodeAt(e)]<<18|Gj[t.charCodeAt(e+1)]<<12|Gj[t.charCodeAt(e+2)]<<6|Gj[t.charCodeAt(e+3)],a[l++]=i>>16&255,a[l++]=i>>8&255,a[l++]=255&i;return 2===c?(i=Gj[t.charCodeAt(e)]<<2|Gj[t.charCodeAt(e+1)]>>4,a[l++]=255&i):1===c&&(i=Gj[t.charCodeAt(e)]<<10|Gj[t.charCodeAt(e+1)]<<4|Gj[t.charCodeAt(e+2)]>>2,a[l++]=i>>8&255,a[l++]=255&i),a}(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(dM,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function ZM(t,e,n,r){for(var i=0;i<r&&!(i+n>=e.length||i>=t.length);++i)e[i+n]=t[i];return i}function pM(t){return null!=t&&(!!t._isBuffer||IM(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&IM(t.slice(0,0))}(t))}function IM(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}var yM=Object.freeze({__proto__:null,Buffer:xj,INSPECT_MAX_BYTES:50,SlowBuffer:function(t){return+t!=t&&(t=0),xj.alloc(+t)},isBuffer:pM,kMaxLength:Nj}),XM={exports:{}},gM={},GM={};Object.defineProperty(GM,"__esModule",{value:!0}),GM.default=function(t){var e=t.length,n=e%4;if(!n)return t;var r=e,i=4-n,c=e+i,a=xj.alloc(c);for(a.write(t);i--;)a.write("=",r++);return a.toString()},Object.defineProperty(gM,"__esModule",{value:!0});var fM=GM;function VM(t,e){return void 0===e&&(e="utf8"),xj.isBuffer(t)?vM(t.toString("base64")):vM(xj.from(t,e).toString("base64"))}function WM(t){return t=t.toString(),fM.default(t).replace(/\-/g,"+").replace(/_/g,"/")}function vM(t){return t.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}var CM,YM=VM;YM.encode=VM,YM.decode=function(t,e){return void 0===e&&(e="utf8"),xj.from(WM(t),"base64").toString(e)},YM.toBase64=WM,YM.fromBase64=vM,YM.toBuffer=function(t){return xj.from(WM(t),"base64")},gM.default=YM,(CM=XM).exports=gM.default,CM.exports.default=CM.exports;var SM=XM.exports,RM={exports:{}};!function(t){!function(e,n){var r={};!function(t){t.__esModule=!0,t.digestLength=32,t.blockSize=64;var e=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);function n(t,n,r,i,c){for(var a,o,l,u,s,d,m,h,b,Z,p,I,y;c>=64;){for(a=n[0],o=n[1],l=n[2],u=n[3],s=n[4],d=n[5],m=n[6],h=n[7],Z=0;Z<16;Z++)p=i+4*Z,t[Z]=(255&r[p])<<24|(255&r[p+1])<<16|(255&r[p+2])<<8|255&r[p+3];for(Z=16;Z<64;Z++)I=((b=t[Z-2])>>>17|b<<15)^(b>>>19|b<<13)^b>>>10,y=((b=t[Z-15])>>>7|b<<25)^(b>>>18|b<<14)^b>>>3,t[Z]=(I+t[Z-7]|0)+(y+t[Z-16]|0);for(Z=0;Z<64;Z++)I=(((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))+(s&d^~s&m)|0)+(h+(e[Z]+t[Z]|0)|0)|0,y=((a>>>2|a<<30)^(a>>>13|a<<19)^(a>>>22|a<<10))+(a&o^a&l^o&l)|0,h=m,m=d,d=s,s=u+I|0,u=l,l=o,o=a,a=I+y|0;n[0]+=a,n[1]+=o,n[2]+=l,n[3]+=u,n[4]+=s,n[5]+=d,n[6]+=m,n[7]+=h,i+=64,c-=64}return i}var r=function(){function e(){this.digestLength=t.digestLength,this.blockSize=t.blockSize,this.state=new Int32Array(8),this.temp=new Int32Array(64),this.buffer=new Uint8Array(128),this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this.reset()}return e.prototype.reset=function(){return this.state[0]=1779033703,this.state[1]=3144134277,this.state[2]=1013904242,this.state[3]=2773480762,this.state[4]=1359893119,this.state[5]=2600822924,this.state[6]=528734635,this.state[7]=1541459225,this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this},e.prototype.clean=function(){for(var t=0;t<this.buffer.length;t++)this.buffer[t]=0;for(t=0;t<this.temp.length;t++)this.temp[t]=0;this.reset()},e.prototype.update=function(t,e){if(void 0===e&&(e=t.length),this.finished)throw new Error("SHA256: can't update because hash was finished.");var r=0;if(this.bytesHashed+=e,this.bufferLength>0){for(;this.bufferLength<64&&e>0;)this.buffer[this.bufferLength++]=t[r++],e--;64===this.bufferLength&&(n(this.temp,this.state,this.buffer,0,64),this.bufferLength=0)}for(e>=64&&(r=n(this.temp,this.state,t,r,e),e%=64);e>0;)this.buffer[this.bufferLength++]=t[r++],e--;return this},e.prototype.finish=function(t){if(!this.finished){var e=this.bytesHashed,r=this.bufferLength,i=e/536870912|0,c=e<<3,a=e%64<56?64:128;this.buffer[r]=128;for(var o=r+1;o<a-8;o++)this.buffer[o]=0;this.buffer[a-8]=i>>>24&255,this.buffer[a-7]=i>>>16&255,this.buffer[a-6]=i>>>8&255,this.buffer[a-5]=i>>>0&255,this.buffer[a-4]=c>>>24&255,this.buffer[a-3]=c>>>16&255,this.buffer[a-2]=c>>>8&255,this.buffer[a-1]=c>>>0&255,n(this.temp,this.state,this.buffer,0,a),this.finished=!0}for(o=0;o<8;o++)t[4*o+0]=this.state[o]>>>24&255,t[4*o+1]=this.state[o]>>>16&255,t[4*o+2]=this.state[o]>>>8&255,t[4*o+3]=this.state[o]>>>0&255;return this},e.prototype.digest=function(){var t=new Uint8Array(this.digestLength);return this.finish(t),t},e.prototype._saveState=function(t){for(var e=0;e<this.state.length;e++)t[e]=this.state[e]},e.prototype._restoreState=function(t,e){for(var n=0;n<this.state.length;n++)this.state[n]=t[n];this.bytesHashed=e,this.finished=!1,this.bufferLength=0},e}();t.Hash=r;var i=function(){function t(t){this.inner=new r,this.outer=new r,this.blockSize=this.inner.blockSize,this.digestLength=this.inner.digestLength;var e=new Uint8Array(this.blockSize);if(t.length>this.blockSize)(new r).update(t).finish(e).clean();else for(var n=0;n<t.length;n++)e[n]=t[n];for(n=0;n<e.length;n++)e[n]^=54;this.inner.update(e);for(n=0;n<e.length;n++)e[n]^=106;this.outer.update(e),this.istate=new Uint32Array(8),this.ostate=new Uint32Array(8),this.inner._saveState(this.istate),this.outer._saveState(this.ostate);for(n=0;n<e.length;n++)e[n]=0}return t.prototype.reset=function(){return this.inner._restoreState(this.istate,this.inner.blockSize),this.outer._restoreState(this.ostate,this.outer.blockSize),this},t.prototype.clean=function(){for(var t=0;t<this.istate.length;t++)this.ostate[t]=this.istate[t]=0;this.inner.clean(),this.outer.clean()},t.prototype.update=function(t){return this.inner.update(t),this},t.prototype.finish=function(t){return this.outer.finished?this.outer.finish(t):(this.inner.finish(t),this.outer.update(t,this.digestLength).finish(t)),this},t.prototype.digest=function(){var t=new Uint8Array(this.digestLength);return this.finish(t),t},t}();function c(t){var e=(new r).update(t),n=e.digest();return e.clean(),n}function a(t,e){var n=new i(t).update(e),r=n.digest();return n.clean(),r}function o(t,e,n,r){var i=r[0];if(0===i)throw new Error("hkdf: cannot expand more");e.reset(),i>1&&e.update(t),n&&e.update(n),e.update(r),e.finish(t),r[0]++}t.HMAC=i,t.hash=c,t.default=c,t.hmac=a;var l=new Uint8Array(t.digestLength);function u(t,e,n,r){void 0===e&&(e=l),void 0===r&&(r=32);for(var c=new Uint8Array([1]),u=a(e,t),s=new i(u),d=new Uint8Array(s.digestLength),m=d.length,h=new Uint8Array(r),b=0;b<r;b++)m===d.length&&(o(d,s,n,c),m=0),h[b]=d[m++];return s.clean(),d.fill(0),c.fill(0),h}function s(t,e,n,r){for(var c=new i(t),a=c.digestLength,o=new Uint8Array(4),l=new Uint8Array(a),u=new Uint8Array(a),s=new Uint8Array(r),d=0;d*a<r;d++){var m=d+1;o[0]=m>>>24&255,o[1]=m>>>16&255,o[2]=m>>>8&255,o[3]=m>>>0&255,c.reset(),c.update(e),c.update(o),c.finish(u);for(var h=0;h<a;h++)l[h]=u[h];for(h=2;h<=n;h++){c.reset(),c.update(u).finish(u);for(var b=0;b<a;b++)l[b]^=u[b]}for(h=0;h<a&&d*a+h<r;h++)s[d*a+h]=l[h]}for(d=0;d<a;d++)l[d]=u[d]=0;for(d=0;d<4;d++)o[d]=0;return c.clean(),s}t.hkdf=u,t.pbkdf2=s}(r);var i=r.default;for(var c in r)i[c]=r[c];t.exports=i}()}(RM);var KM=e(RM.exports),NM=crypto,LM=function(t){return t instanceof CryptoKey},JM=new TextEncoder,xM=new TextDecoder;function HM(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];var r=e.reduce((function(t,e){return t+e.length}),0),i=new Uint8Array(r),c=0;return e.forEach((function(t){i.set(t,c),c+=t.length})),i}var kM=function(t){var e=t;e instanceof Uint8Array&&(e=xM.decode(e)),e=e.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,"");try{return function(t){for(var e=atob(t),n=new Uint8Array(e.length),r=0;r<e.length;r++)n[r]=e.charCodeAt(r);return n}(e)}catch(t){throw new TypeError("The input to be decoded is not correctly encoded.")}},UM=function(t){h(n,y(Error));var e=G(n);function n(t){var r,i;return u(this,n),(r=e.call(this,t)).code="ERR_JOSE_GENERIC",r.name=r.constructor.name,null===(i=Error.captureStackTrace)||void 0===i||i.call(Error,X(r),r.constructor),r}return d(n,null,[{key:"code",get:function(){return"ERR_JOSE_GENERIC"}}]),n}(),TM=function(t){h(n,UM);var e=G(n);function n(t){var r,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"unspecified",c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"unspecified";return u(this,n),(r=e.call(this,t)).code="ERR_JWT_CLAIM_VALIDATION_FAILED",r.claim=i,r.reason=c,r}return d(n,null,[{key:"code",get:function(){return"ERR_JWT_CLAIM_VALIDATION_FAILED"}}]),n}(),wM=function(t){h(n,UM);var e=G(n);function n(t){var r,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"unspecified",c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"unspecified";return u(this,n),(r=e.call(this,t)).code="ERR_JWT_EXPIRED",r.claim=i,r.reason=c,r}return d(n,null,[{key:"code",get:function(){return"ERR_JWT_EXPIRED"}}]),n}(),AM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JOSE_ALG_NOT_ALLOWED",t}return d(n,null,[{key:"code",get:function(){return"ERR_JOSE_ALG_NOT_ALLOWED"}}]),n}(),FM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JOSE_NOT_SUPPORTED",t}return d(n,null,[{key:"code",get:function(){return"ERR_JOSE_NOT_SUPPORTED"}}]),n}(),zM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JWS_INVALID",t}return d(n,null,[{key:"code",get:function(){return"ERR_JWS_INVALID"}}]),n}(),BM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JWT_INVALID",t}return d(n,null,[{key:"code",get:function(){return"ERR_JWT_INVALID"}}]),n}(),jM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JWKS_INVALID",t}return d(n,null,[{key:"code",get:function(){return"ERR_JWKS_INVALID"}}]),n}(),MM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JWKS_NO_MATCHING_KEY",t.message="no applicable key found in the JSON Web Key Set",t}return d(n,null,[{key:"code",get:function(){return"ERR_JWKS_NO_MATCHING_KEY"}}]),n}(),QM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JWKS_MULTIPLE_MATCHING_KEYS",t.message="multiple matching keys found in the JSON Web Key Set",t}return d(n,null,[{key:"code",get:function(){return"ERR_JWKS_MULTIPLE_MATCHING_KEYS"}}]),n}(),PM=function(t){h(n,UM);var e=G(n);function n(){var t;return u(this,n),(t=e.apply(this,arguments)).code="ERR_JWS_SIGNATURE_VERIFICATION_FAILED",t.message="signature verification failed",t}return d(n,null,[{key:"code",get:function(){return"ERR_JWS_SIGNATURE_VERIFICATION_FAILED"}}]),n}();function EM(){return"function"==typeof WebSocketPair}function DM(){try{return void 0!==qz.versions.node}catch(t){return!1}}function OM(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"algorithm.name";return new TypeError("CryptoKey does not support this operation, its ".concat(e," must be ").concat(t))}function _M(t,e){return t.name===e}function qM(t){return parseInt(t.name.slice(4),10)}function $M(t){switch(t){case"ES256":return"P-256";case"ES384":return"P-384";case"ES512":return"P-521";default:throw new Error("unreachable")}}function tQ(t,e){if(e.length&&!e.some((function(e){return t.usages.includes(e)}))){var n="CryptoKey does not support this operation, its usages must include ";if(e.length>2){var r=e.pop();n+="one of ".concat(e.join(", "),", or ").concat(r,".")}else 2===e.length?n+="one of ".concat(e[0]," or ").concat(e[1],"."):n+="".concat(e[0],".");throw new TypeError(n)}}var eQ=function(t){for(var e="Key must be ",n=arguments.length,r=new Array(n>1?n-1:0),i=1;i<n;i++)r[i-1]=arguments[i];if(r.length>2){var c=r.pop();e+="one of type ".concat(r.join(", "),", or ").concat(c,".")}else 2===r.length?e+="one of type ".concat(r[0]," or ").concat(r[1],"."):e+="of type ".concat(r[0],".");return null==t?e+=" Received ".concat(t):"function"==typeof t&&t.name?e+=" Received function ".concat(t.name):"object"===a(t)&&null!=t&&t.constructor&&t.constructor.name&&(e+=" Received an instance of ".concat(t.constructor.name)),e},nQ=function(t){return LM(t)},rQ=["CryptoKey"],iQ=function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];var r,i=e.filter(Boolean);if(0===i.length||1===i.length)return!0;var c,a=C(i);try{for(a.s();!(c=a.n()).done;){var o=c.value,l=Object.keys(o);if(r&&0!==r.size)for(var u=0,s=l;u<s.length;u++){var d=s[u];if(r.has(d))return!1;r.add(d)}else r=new Set(l)}}catch(t){a.e(t)}finally{a.f()}return!0};function cQ(t){if("object"!==a(e=t)||null===e||"[object Object]"!==Object.prototype.toString.call(t))return!1;var e;if(null===Object.getPrototypeOf(t))return!0;for(var n=t;null!==Object.getPrototypeOf(n);)n=Object.getPrototypeOf(n);return Object.getPrototypeOf(t)===n}var aQ=function(t,e){if(t.startsWith("RS")||t.startsWith("PS")){var n=e.algorithm.modulusLength;if("number"!=typeof n||n<2048)throw new TypeError("".concat(t," requires key modulusLength to be 2048 bits or larger"))}};function oQ(t){var e,n;switch(t.kty){case"oct":switch(t.alg){case"HS256":case"HS384":case"HS512":e={name:"HMAC",hash:"SHA-".concat(t.alg.slice(-3))},n=["sign","verify"];break;case"A128CBC-HS256":case"A192CBC-HS384":case"A256CBC-HS512":throw new FM("".concat(t.alg," keys cannot be imported as CryptoKey instances"));case"A128GCM":case"A192GCM":case"A256GCM":case"A128GCMKW":case"A192GCMKW":case"A256GCMKW":e={name:"AES-GCM"},n=["encrypt","decrypt"];break;case"A128KW":case"A192KW":case"A256KW":e={name:"AES-KW"},n=["wrapKey","unwrapKey"];break;case"PBES2-HS256+A128KW":case"PBES2-HS384+A192KW":case"PBES2-HS512+A256KW":e={name:"PBKDF2"},n=["deriveBits"];break;default:throw new FM('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"RSA":switch(t.alg){case"PS256":case"PS384":case"PS512":e={name:"RSA-PSS",hash:"SHA-".concat(t.alg.slice(-3))},n=t.d?["sign"]:["verify"];break;case"RS256":case"RS384":case"RS512":e={name:"RSASSA-PKCS1-v1_5",hash:"SHA-".concat(t.alg.slice(-3))},n=t.d?["sign"]:["verify"];break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":e={name:"RSA-OAEP",hash:"SHA-".concat(parseInt(t.alg.slice(-3),10)||1)},n=t.d?["decrypt","unwrapKey"]:["encrypt","wrapKey"];break;default:throw new FM('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"EC":switch(t.alg){case"ES256":e={name:"ECDSA",namedCurve:"P-256"},n=t.d?["sign"]:["verify"];break;case"ES384":e={name:"ECDSA",namedCurve:"P-384"},n=t.d?["sign"]:["verify"];break;case"ES512":e={name:"ECDSA",namedCurve:"P-521"},n=t.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":e={name:"ECDH",namedCurve:t.crv},n=t.d?["deriveBits"]:[];break;default:throw new FM('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case(EM()||DM())&&"OKP":if("EdDSA"!==t.alg)throw new FM('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');switch(t.crv){case"Ed25519":e={name:"NODE-ED25519",namedCurve:"NODE-ED25519"},n=t.d?["sign"]:["verify"];break;case DM()&&"Ed448":e={name:"NODE-ED448",namedCurve:"NODE-ED448"},n=t.d?["sign"]:["verify"];break;default:throw new FM('Invalid or unsupported JWK "crv" (Subtype of Key Pair) Parameter value')}break;default:throw new FM('Invalid or unsupported JWK "kty" (Key Type) Parameter value')}return{algorithm:e,keyUsages:n}}var lQ=function(){var t=l(c().mark((function t(e){var n,r,a,o,l,u,s,d,m;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(o=oQ(e),l=o.algorithm,u=o.keyUsages,s=[l,null!==(r=e.ext)&&void 0!==r&&r,null!==(a=e.key_ops)&&void 0!==a?a:u],"PBKDF2"!==l.name){t.next=4;break}return t.abrupt("return",(d=NM.subtle).importKey.apply(d,["raw",kM(e.k)].concat(s)));case 4:return delete(m=i({},e)).alg,t.abrupt("return",(n=NM.subtle).importKey.apply(n,["jwk",m].concat(s)));case 7:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();function uQ(t,e,n){return sQ.apply(this,arguments)}function sQ(){return(sQ=l(c().mark((function t(e,n,r){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(cQ(e)){t.next=2;break}throw new TypeError("JWK must be an object");case 2:if(n||(n=e.alg),"string"==typeof n&&n){t.next=5;break}throw new TypeError('"alg" argument is required when "jwk.alg" is not present');case 5:t.t0=e.kty,t.next="oct"===t.t0?8:"RSA"===t.t0?14:"EC"===t.t0||"OKP"===t.t0?16:17;break;case 8:if("string"==typeof e.k&&e.k){t.next=10;break}throw new TypeError('missing "k" (Key Value) Parameter value');case 10:if(null!=r||(r=!0!==e.ext),!r){t.next=13;break}return t.abrupt("return",lQ(i(i({},e),{},{alg:n,ext:!1})));case 13:return t.abrupt("return",kM(e.k));case 14:if(void 0===e.oth){t.next=16;break}throw new FM('RSA JWK "oth" (Other Primes Info) Parameter value is not supported');case 16:return t.abrupt("return",lQ(i(i({},e),{},{alg:n})));case 17:throw new FM('Unsupported "kty" (Key Type) Parameter value');case 18:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var dQ=function(t,e,n){t.startsWith("HS")||"dir"===t||t.startsWith("PBES2")||/^A\d{3}(?:GCM)?KW$/.test(t)?function(t){if(!(t instanceof Uint8Array)){if(!nQ(t))throw new TypeError(eQ.apply(void 0,[t].concat(V(rQ),["Uint8Array"])));if("secret"!==t.type)throw new TypeError("".concat(rQ.join(" or "),' instances for symmetric algorithms must be of type "secret"'))}}(e):function(t,e){if(!nQ(t))throw new TypeError(eQ.apply(void 0,[t].concat(V(rQ))));if("secret"===t.type)throw new TypeError("".concat(rQ.join(" or "),' instances for asymmetric algorithms must not be of type "secret"'));if("sign"===e&&"public"===t.type)throw new TypeError("".concat(rQ.join(" or "),' instances for asymmetric algorithm signing must be of type "private"'));if("decrypt"===e&&"public"===t.type)throw new TypeError("".concat(rQ.join(" or "),' instances for asymmetric algorithm decryption must be of type "private"'));if(t.algorithm&&"verify"===e&&"private"===t.type)throw new TypeError("".concat(rQ.join(" or "),' instances for asymmetric algorithm verifying must be of type "public"'));if(t.algorithm&&"encrypt"===e&&"private"===t.type)throw new TypeError("".concat(rQ.join(" or "),' instances for asymmetric algorithm encryption must be of type "public"'))}(e,n)};function mQ(t,e,n,r,i){if(void 0!==i.crit&&void 0===r.crit)throw new t('"crit" (Critical) Header Parameter MUST be integrity protected');if(!r||void 0===r.crit)return new Set;if(!Array.isArray(r.crit)||0===r.crit.length||r.crit.some((function(t){return"string"!=typeof t||0===t.length})))throw new t('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present');var c;c=void 0!==n?new Map([].concat(V(Object.entries(n)),V(e.entries()))):e;var a,o=C(r.crit);try{for(o.s();!(a=o.n()).done;){var l=a.value;if(!c.has(l))throw new FM('Extension Header Parameter "'.concat(l,'" is not recognized'));if(void 0===i[l])throw new t('Extension Header Parameter "'.concat(l,'" is missing'));if(c.get(l)&&void 0===r[l])throw new t('Extension Header Parameter "'.concat(l,'" MUST be integrity protected'))}}catch(t){o.e(t)}finally{o.f()}return new Set(r.crit)}var hQ=function(t,e){if(void 0!==e&&(!Array.isArray(e)||e.some((function(t){return"string"!=typeof t}))))throw new TypeError('"'.concat(t,'" option must be an array of strings'));if(e)return new Set(e)};function bQ(t,e){var n="SHA-".concat(t.slice(-3));switch(t){case"HS256":case"HS384":case"HS512":return{hash:n,name:"HMAC"};case"PS256":case"PS384":case"PS512":return{hash:n,name:"RSA-PSS",saltLength:t.slice(-3)>>3};case"RS256":case"RS384":case"RS512":return{hash:n,name:"RSASSA-PKCS1-v1_5"};case"ES256":case"ES384":case"ES512":return{hash:n,name:"ECDSA",namedCurve:e.namedCurve};case(EM()||DM())&&"EdDSA":var r=e.namedCurve;return{name:r,namedCurve:r};default:throw new FM("alg ".concat(t," is not supported either by JOSE or your javascript runtime"))}}function ZQ(t,e,n){if(LM(e))return function(t,e){switch(e){case"HS256":case"HS384":case"HS512":if(!_M(t.algorithm,"HMAC"))throw OM("HMAC");var n=parseInt(e.slice(2),10);if(qM(t.algorithm.hash)!==n)throw OM("SHA-".concat(n),"algorithm.hash");break;case"RS256":case"RS384":case"RS512":if(!_M(t.algorithm,"RSASSA-PKCS1-v1_5"))throw OM("RSASSA-PKCS1-v1_5");var r=parseInt(e.slice(2),10);if(qM(t.algorithm.hash)!==r)throw OM("SHA-".concat(r),"algorithm.hash");break;case"PS256":case"PS384":case"PS512":if(!_M(t.algorithm,"RSA-PSS"))throw OM("RSA-PSS");var i=parseInt(e.slice(2),10);if(qM(t.algorithm.hash)!==i)throw OM("SHA-".concat(i),"algorithm.hash");break;case DM()&&"EdDSA":if("NODE-ED25519"!==t.algorithm.name&&"NODE-ED448"!==t.algorithm.name)throw OM("NODE-ED25519 or NODE-ED448");break;case EM()&&"EdDSA":if(!_M(t.algorithm,"NODE-ED25519"))throw OM("NODE-ED25519");break;case"ES256":case"ES384":case"ES512":if(!_M(t.algorithm,"ECDSA"))throw OM("ECDSA");var c=$M(e);if(t.algorithm.namedCurve!==c)throw OM(c,"algorithm.namedCurve");break;default:throw new TypeError("CryptoKey does not support this operation")}for(var a=arguments.length,o=new Array(a>2?a-2:0),l=2;l<a;l++)o[l-2]=arguments[l];tQ(t,o)}(e,t,n),e;if(e instanceof Uint8Array){if(!t.startsWith("HS"))throw new TypeError(eQ.apply(void 0,[e].concat(V(rQ))));return NM.subtle.importKey("raw",e,{hash:"SHA-".concat(t.slice(-3)),name:"HMAC"},!1,[n])}throw new TypeError(eQ.apply(void 0,[e].concat(V(rQ),["Uint8Array"])))}var pQ=function(){var t=l(c().mark((function t(e,n,r,i){var a,o;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,ZQ(e,n,"verify");case 2:return a=t.sent,aQ(e,a),o=bQ(e,a.algorithm),t.prev=5,t.next=8,NM.subtle.verify(o,a,r,i);case 8:return t.abrupt("return",t.sent);case 11:return t.prev=11,t.t0=t.catch(5),t.abrupt("return",!1);case 14:case"end":return t.stop()}}),t,null,[[5,11]])})));return function(e,n,r,i){return t.apply(this,arguments)}}();function IQ(t,e,n){return yQ.apply(this,arguments)}function yQ(){return yQ=l(c().mark((function t(e,n,r){var a,o,l,u,s,d,m,h,b,Z,p,I,y;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(cQ(e)){t.next=2;break}throw new zM("Flattened JWS must be an object");case 2:if(void 0!==e.protected||void 0!==e.header){t.next=4;break}throw new zM('Flattened JWS must have either of the "protected" or "header" members');case 4:if(void 0===e.protected||"string"==typeof e.protected){t.next=6;break}throw new zM("JWS Protected Header incorrect type");case 6:if(void 0!==e.payload){t.next=8;break}throw new zM("JWS Payload missing");case 8:if("string"==typeof e.signature){t.next=10;break}throw new zM("JWS Signature missing or incorrect type");case 10:if(void 0===e.header||cQ(e.header)){t.next=12;break}throw new zM("JWS Unprotected Header incorrect type");case 12:if(o={},!e.protected){t.next=22;break}l=kM(e.protected),t.prev=15,o=JSON.parse(xM.decode(l)),t.next=22;break;case 19:throw t.prev=19,t.t0=t.catch(15),new zM("JWS Protected Header is invalid");case 22:if(iQ(o,e.header)){t.next=24;break}throw new zM("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");case 24:if(u=i(i({},o),e.header),s=mQ(zM,new Map([["b64",!0]]),null==r?void 0:r.crit,o,u),d=!0,!s.has("b64")){t.next=31;break}if("boolean"==typeof(d=o.b64)){t.next=31;break}throw new zM('The "b64" (base64url-encode payload) Header Parameter must be a boolean');case 31:if("string"==typeof(m=u.alg)&&m){t.next=34;break}throw new zM('JWS "alg" (Algorithm) Header Parameter missing or invalid');case 34:if(!(h=r&&hQ("algorithms",r.algorithms))||h.has(m)){t.next=37;break}throw new AM('"alg" (Algorithm) Header Parameter not allowed');case 37:if(!d){t.next=42;break}if("string"==typeof e.payload){t.next=40;break}throw new zM("JWS Payload must be a string");case 40:t.next=44;break;case 42:if("string"==typeof e.payload||e.payload instanceof Uint8Array){t.next=44;break}throw new zM("JWS Payload must be a string or an Uint8Array instance");case 44:if(b=!1,"function"!=typeof n){t.next=50;break}return t.next=48,n(o,e);case 48:n=t.sent,b=!0;case 50:return dQ(m,n,"verify"),Z=HM(JM.encode(null!==(a=e.protected)&&void 0!==a?a:""),JM.encode("."),"string"==typeof e.payload?JM.encode(e.payload):e.payload),p=kM(e.signature),t.next=55,pQ(m,n,p,Z);case 55:if(t.sent){t.next=58;break}throw new PM;case 58:if(I=d?kM(e.payload):"string"==typeof e.payload?JM.encode(e.payload):e.payload,y={payload:I},void 0!==e.protected&&(y.protectedHeader=o),void 0!==e.header&&(y.unprotectedHeader=e.header),!b){t.next=64;break}return t.abrupt("return",i(i({},y),{},{key:n}));case 64:return t.abrupt("return",y);case 65:case"end":return t.stop()}}),t,null,[[15,19]])}))),yQ.apply(this,arguments)}function XQ(t,e,n){return gQ.apply(this,arguments)}function gQ(){return gQ=l(c().mark((function t(e,n,r){var a,o,l,u,s,d;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(e instanceof Uint8Array&&(e=xM.decode(e)),"string"==typeof e){t.next=3;break}throw new zM("Compact JWS must be a string or Uint8Array");case 3:if(a=e.split("."),o=a[0],l=a[1],u=a[2],3===a.length){t.next=6;break}throw new zM("Invalid Compact JWS");case 6:return t.next=8,IQ({payload:l,protected:o,signature:u},n,r);case 8:if(s=t.sent,d={payload:s.payload,protectedHeader:s.protectedHeader},"function"!=typeof n){t.next=12;break}return t.abrupt("return",i(i({},d),{},{key:s.key}));case 12:return t.abrupt("return",d);case 13:case"end":return t.stop()}}),t)}))),gQ.apply(this,arguments)}var GQ=function(t){return Math.floor(t.getTime()/1e3)},fQ=/^(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)$/i,VQ=function(t){var e=fQ.exec(t);if(!e)throw new TypeError("Invalid time period format");var n=parseFloat(e[1]);switch(e[2].toLowerCase()){case"sec":case"secs":case"second":case"seconds":case"s":return Math.round(n);case"minute":case"minutes":case"min":case"mins":case"m":return Math.round(60*n);case"hour":case"hours":case"hr":case"hrs":case"h":return Math.round(3600*n);case"day":case"days":case"d":return Math.round(86400*n);case"week":case"weeks":case"w":return Math.round(604800*n);default:return Math.round(31557600*n)}},WQ=function(t){return t.toLowerCase().replace(/^application\//,"")},vQ=function(t,e){return"string"==typeof t?e.includes(t):!!Array.isArray(t)&&e.some(Set.prototype.has.bind(new Set(t)))},CQ=function(t,e){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=r.typ;if(i&&("string"!=typeof t.typ||WQ(t.typ)!==WQ(i)))throw new TM('unexpected "typ" JWT header value',"typ","check_failed");try{n=JSON.parse(xM.decode(e))}catch(t){}if(!cQ(n))throw new BM("JWT Claims Set must be a top-level JSON object");var c=r.issuer;if(c&&!(Array.isArray(c)?c:[c]).includes(n.iss))throw new TM('unexpected "iss" claim value',"iss","check_failed");var o=r.subject;if(o&&n.sub!==o)throw new TM('unexpected "sub" claim value',"sub","check_failed");var l,u=r.audience;if(u&&!vQ(n.aud,"string"==typeof u?[u]:u))throw new TM('unexpected "aud" claim value',"aud","check_failed");switch(a(r.clockTolerance)){case"string":l=VQ(r.clockTolerance);break;case"number":l=r.clockTolerance;break;case"undefined":l=0;break;default:throw new TypeError("Invalid clockTolerance option type")}var s=r.currentDate,d=GQ(s||new Date);if((void 0!==n.iat||r.maxTokenAge)&&"number"!=typeof n.iat)throw new TM('"iat" claim must be a number',"iat","invalid");if(void 0!==n.nbf){if("number"!=typeof n.nbf)throw new TM('"nbf" claim must be a number',"nbf","invalid");if(n.nbf>d+l)throw new TM('"nbf" claim timestamp check failed',"nbf","check_failed")}if(void 0!==n.exp){if("number"!=typeof n.exp)throw new TM('"exp" claim must be a number',"exp","invalid");if(n.exp<=d-l)throw new wM('"exp" claim timestamp check failed',"exp","check_failed")}if(r.maxTokenAge){var m=d-n.iat,h="number"==typeof r.maxTokenAge?r.maxTokenAge:VQ(r.maxTokenAge);if(m-l>h)throw new wM('"iat" claim timestamp check failed (too far in the past)',"iat","check_failed");if(m<0-l)throw new TM('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}return n};function YQ(){return YQ=l(c().mark((function t(e,n,r){var a,o,l,u;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,XQ(e,n,r);case 2:if(o=t.sent,!(null===(a=o.protectedHeader.crit)||void 0===a?void 0:a.includes("b64"))||!1!==o.protectedHeader.b64){t.next=5;break}throw new BM("JWTs MUST NOT use unencoded payload");case 5:if(l=CQ(o.protectedHeader,o.payload,r),u={payload:l,protectedHeader:o.protectedHeader},"function"!=typeof n){t.next=9;break}return t.abrupt("return",i(i({},u),{},{key:o.key}));case 9:return t.abrupt("return",u);case 10:case"end":return t.stop()}}),t)}))),YQ.apply(this,arguments)}function SQ(t){switch("string"==typeof t&&t.slice(0,2)){case"RS":case"PS":return"RSA";case"ES":return"EC";case"Ed":return"OKP";default:throw new FM('Unsupported "alg" value for a JSON Web Key Set')}}function RQ(t){return cQ(t)}var KQ=function(){function t(e){if(u(this,t),this._cached=new WeakMap,!function(t){return t&&"object"===a(t)&&Array.isArray(t.keys)&&t.keys.every(RQ)}(e))throw new jM("JSON Web Key Set malformed");var n;this._jwks=(n=e,"function"==typeof structuredClone?structuredClone(n):JSON.parse(JSON.stringify(n)))}var e;return d(t,[{key:"getKey",value:(e=l(c().mark((function t(e,n){var r,a,o,l,u,s,d,m,h;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r=i(i({},e),n.header),a=r.alg,o=r.kid,l=SQ(a),u=this._jwks.keys.filter((function(t){var e=l===t.kty;if(e&&"string"==typeof o&&(e=o===t.kid),e&&"string"==typeof t.alg&&(e=a===t.alg),e&&"string"==typeof t.use&&(e="sig"===t.use),e&&Array.isArray(t.key_ops)&&(e=t.key_ops.includes("verify")),e&&"EdDSA"===a&&(e="Ed25519"===t.crv||"Ed448"===t.crv),e)switch(a){case"ES256":e="P-256"===t.crv;break;case"ES256K":e="secp256k1"===t.crv;break;case"ES384":e="P-384"===t.crv;break;case"ES512":e="P-521"===t.crv}return e})),s=u[0],0!==(d=u.length)){t.next=8;break}throw new MM;case 8:if(1===d){t.next=10;break}throw new QM;case 10:if(void 0!==(m=this._cached.get(s)||this._cached.set(s,{}).get(s))[a]){t.next=18;break}return t.next=14,uQ(i(i({},s),{},{ext:!0}),a);case 14:if(!((h=t.sent)instanceof Uint8Array||"public"!==h.type)){t.next=17;break}throw new jM("JSON Web Key Set members must be public keys");case 17:m[a]=h;case 18:return t.abrupt("return",m[a]);case 19:case"end":return t.stop()}}),t,this)}))),function(t,n){return e.apply(this,arguments)})}]),t}();var NQ={exports:{}},LQ={exports:{}},JQ=n(yM);
454
454
  /*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
455
455
  !function(t,e){var n=JQ,r=n.Buffer;function i(t,e){for(var n in t)e[n]=t[n]}function c(t,e,n){return r(t,e,n)}r.from&&r.alloc&&r.allocUnsafe&&r.allocUnsafeSlow?t.exports=n:(i(n,e),e.Buffer=c),c.prototype=Object.create(r.prototype),i(r,c),c.from=function(t,e,n){if("number"==typeof t)throw new TypeError("Argument must not be a number");return r(t,e,n)},c.alloc=function(t,e,n){if("number"!=typeof t)throw new TypeError("Argument must be a number");var i=r(t);return void 0!==e?"string"==typeof n?i.fill(e,n):i.fill(e):i.fill(0),i},c.allocUnsafe=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return r(t)},c.allocUnsafeSlow=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return n.SlowBuffer(t)}}(LQ,LQ.exports);var xQ=LQ.exports.Buffer,HQ=t.crypto||t.msCrypto;HQ&&HQ.getRandomValues?NQ.exports=function(t,e){if(t>4294967295)throw new RangeError("requested too many random bytes");var n=xQ.allocUnsafe(t);if(t>0)if(t>65536)for(var r=0;r<t;r+=65536)HQ.getRandomValues(n.slice(r,r+65536));else HQ.getRandomValues(n);if("function"==typeof e)return qz.nextTick((function(){e(null,n)}));return n}:NQ.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")};var kQ=NQ.exports,UQ=function(){function t(){u(this,t)}return d(t,[{key:"base64URLEncode",value:function(t){return SM.encode(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}},{key:"base64URLDecode",value:function(t){return SM.decode(t).toString()}},{key:"hashSha256",value:function(t){return xj.from(KM((new TextEncoder).encode(t)))}},{key:"generateRandomBytes",value:function(t){return kQ(t)}},{key:"verifyJwt",value:function(t,e,n,r,i,c,a){return function(t,e,n){return YQ.apply(this,arguments)}(t,(o={keys:[e]},KQ.prototype.getKey.bind(new KQ(o))),{algorithms:n,audience:r,clockTolerance:a,issuer:i,subject:c}).then((function(){return Promise.resolve(!0)}));var o}}]),t}(),TQ=function(t){switch(t){case UF.LocalStorage:return new Ij;case UF.SessionStorage:return new Xj;case UF.BrowserMemory:return new yj;default:return new Xj}},wQ=function(t,e){return rF(void 0,void 0,void 0,c().mark((function n(){var r,i,a,o,l,u,s,d,m,h,b,Z,p,I,y,X,g,G,f,V,W,v,C,Y,S,R,K,N,L,J,x,H,k,U,T,w,A,F,z,B,j,M,Q;return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return i=TQ(t.storage),a=new UQ,o=new NF(i,a),n.next=5,o.initialize(t);case 5:return l=new cz(o),u=o.getDataLayer(),n.next=9,lz((function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",o.signOut());case 1:case"end":return t.stop()}}),t)})))}),null!==(r=t.storage)&&void 0!==r?r:UF.SessionStorage,(function(t){return u.setSessionDataParameter(XF,null!=t?t:"")}));case 9:if(s=n.sent,d=e(o,l),m=!1,h=pj.getInstance(),b=!0,I=function(t){return rF(void 0,void 0,void 0,c().mark((function e(){var n;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(n=Object.assign({attachToken:!0},t)).attachToken){e.next=23;break}if(!n.shouldAttachIDPAccessToken){e.next=14;break}return e.t0=Object,e.t1=Object.assign({},t.headers),e.t2="Bearer ",e.next=8,d.getIDPAccessToken();case 8:e.t3=e.sent,e.t4=e.t2.concat.call(e.t2,e.t3),e.t5={Authorization:e.t4},t.headers=e.t0.assign.call(e.t0,e.t1,e.t5),e.next=23;break;case 14:return e.t6=Object,e.t7=Object.assign({},t.headers),e.t8="Bearer ",e.next=19,d.getAccessToken();case 19:e.t9=e.sent,e.t10=e.t8.concat.call(e.t8,e.t9),e.t11={Authorization:e.t10},t.headers=e.t6.assign.call(e.t6,e.t7,e.t11);case 23:case"end":return e.stop()}}),e)})))},n.t0=null==h?void 0:h.init,!n.t0){n.next=19;break}return n.next=19,h.init(!0,I);case 19:return y=function(t){(null==h?void 0:h.setHttpRequestStartCallback)&&h.setHttpRequestStartCallback(t)},X=function(t){(null==h?void 0:h.setHttpRequestSuccessCallback)&&h.setHttpRequestSuccessCallback(t)},g=function(t){(null==h?void 0:h.setHttpRequestFinishCallback)&&h.setHttpRequestFinishCallback(t)},G=function(t){Z=t},f=function(t){return rF(void 0,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d.httpRequest(h,t,b,Z,p);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)})))},V=function(t){return rF(void 0,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d.httpRequestAll(t,h,b,Z,p);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)})))},W=function(){return h},v=function(){return d.enableHttpHandler(h),b=!0,!0},C=function(){return d.disableHttpHandler(h),b=!1,!0},Y=function(){return rF(void 0,void 0,void 0,c().mark((function t(){var e,n;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,o.getOIDCServiceEndpoints();case 2:return e=t.sent,t.next=5,u.getConfigData();case 5:n=t.sent,d.initializeSessionManger(n,e,(function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,o.getBasicUserInfo();case 2:return t.abrupt("return",t.sent.sessionState);case 3:case"end":return t.stop()}}),t)})))}),(function(t){return rF(void 0,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",o.getAuthorizationURL(t));case 1:case"end":return e.stop()}}),e)})))}),s);case 7:case"end":return t.stop()}}),t)})))},S=function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,s.receivePromptNoneResponse((function(t){return rF(void 0,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,u.setSessionDataParameter(XF,null!=t?t:"");case 2:return e.abrupt("return");case 3:case"end":return e.stop()}}),e)})))}));case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t)})))},R=function(e,n,r,i){return rF(void 0,void 0,void 0,c().mark((function a(){var l,u,s,m,h,b,Z;return c().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,d.handleSignIn(S,Y);case 2:if(!(m=a.sent)){a.next=7;break}return a.abrupt("return",m);case 7:if((null==t?void 0:t.responseMode)===eF.formPost&&n?(h=n,b=null!=r?r:"",Z=null!=i?i:""):(h=null!==(l=new URL(window.location.href).searchParams.get(yF))&&void 0!==l?l:"",b=null!==(u=new URL(window.location.href).searchParams.get(XF))&&void 0!==u?u:"",Z=null!==(s=new URL(window.location.href).searchParams.get(fF))&&void 0!==s?s:"",oz.removeAuthorizationCode()),!h||!Z){a.next=10;break}return a.abrupt("return",H(h,b,Z));case 10:return a.abrupt("return",o.getAuthorizationURL(e).then((function(e){return rF(void 0,void 0,void 0,c().mark((function n(){var r;return c().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(t.storage!==UF.BrowserMemory||!t.enablePKCE){n.next=8;break}return r=vF.extractPKCEKeyFromStateParam(Z),n.t0=oz,n.t1=r,n.next=6,o.getPKCECode(Z);case 6:n.t2=n.sent,n.t0.setPKCE.call(n.t0,n.t1,n.t2);case 8:return location.href=e,n.next=11,oz.waitTillPageRedirect();case 11:return n.abrupt("return",Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""}));case 12:case"end":return n.stop()}}),n)})))})));case 11:case"end":return a.stop()}}),a)})))},K=function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,o.isAuthenticated();case 2:if(t.t0=t.sent,!t.t0){t.next=5;break}t.t0=!m;case 5:if(!t.t0){t.next=11;break}return t.next=8,o.signOut();case 8:location.href=t.sent,t.next=18;break;case 11:return location.href=oz.getSignOutURL(),t.next=14,u.removeOIDCProviderMetaData();case 14:return t.next=16,u.removeTemporaryData();case 16:return t.next=18,u.removeSessionData();case 18:return l.clearRefreshTokenTimeout(),t.next=21,oz.waitTillPageRedirect();case 21:return t.abrupt("return",!0);case 22:case"end":return t.stop()}}),t)})))},N=function(t){t.preventSignOutURLUpdate&&(m=!0)},L=function(t){return rF(void 0,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d.requestCustomGrant(t,N);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)})))},J=function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,d.refreshAccessToken(N);case 3:return t.abrupt("return",t.sent);case 6:return t.prev=6,t.t0=t.catch(0),t.abrupt("return",Promise.reject(t.t0));case 9:case"end":return t.stop()}}),t,null,[[0,6]])})))},x=function(){return o.revokeAccessToken().then((function(){return s.reset(),l.clearRefreshTokenTimeout(),Promise.resolve(!0)})).catch((function(t){return Promise.reject(t)}))},H=function(t,e,n){return rF(void 0,void 0,void 0,c().mark((function r(){return c().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.next=2,d.requestAccessToken(t,e,Y,void 0,n);case 2:return r.abrupt("return",r.sent);case 3:case"end":return r.stop()}}),r)})))},k=function(){return rF(void 0,void 0,void 0,c().mark((function t(){var e,n,r,i,a;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,u.getConfigData();case 2:return e=t.sent,t.next=5,o.getAuthorizationURL({prompt:"none",state:"sign-in-silently"});case 5:if(n=t.sent,(r=new URL(n)).searchParams.set("response_mode","query"),i=r.toString(),e.storage!==UF.BrowserMemory||!e.enablePKCE){t.next=17;break}return a=r.searchParams.get(fF),t.t0=oz,t.t1=vF.extractPKCEKeyFromStateParam(null!=a?a:""),t.next=15,o.getPKCECode(null!=a?a:"");case 15:t.t2=t.sent,t.t0.setPKCE.call(t.t0,t.t1,t.t2);case 17:return t.abrupt("return",i);case 18:case"end":return t.stop()}}),t)})))},U=function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,d.trySignInSilently(k,H,s);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t)})))},T=function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",d.getBasicUserInfo());case 1:case"end":return t.stop()}}),t)})))},w=function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",d.getDecodedIDToken());case 1:case"end":return t.stop()}}),t)})))},A=function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",d.getCryptoHelper());case 1:case"end":return t.stop()}}),t)})))},F=function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",d.getIDToken());case 1:case"end":return t.stop()}}),t)})))},z=function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",d.getOIDCServiceEndpoints());case 1:case"end":return t.stop()}}),t)})))},B=function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",d.getAccessToken());case 1:case"end":return t.stop()}}),t)})))},j=function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",d.getDataLayer());case 1:case"end":return t.stop()}}),t)})))},M=function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",d.isAuthenticated());case 1:case"end":return t.stop()}}),t)})))},Q=function(t){return rF(void 0,void 0,void 0,c().mark((function e(){var n,r,i;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,u.getConfigData();case 2:return n=e.sent,r=!(n&&n.endpoints&&n.endpoints.checkSessionIframe&&t&&t.endpoints&&t.endpoints.checkSessionIframe&&n.endpoints.checkSessionIframe===t.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},n),t),e.next=7,o.updateConfig(i);case 7:i.enableOIDCSessionManagement&&r&&(s.reset(),Y());case 8:case"end":return e.stop()}}),e)})))},n.abrupt("return",{disableHttpHandler:C,enableHttpHandler:v,getAccessToken:B,getBasicUserInfo:T,getCryptoHelper:A,getDataLayer:j,getDecodedIDToken:w,getHttpClient:W,getIDToken:F,getOIDCServiceEndpoints:z,httpRequest:f,httpRequestAll:V,isAuthenticated:M,refreshAccessToken:J,requestCustomGrant:L,revokeAccessToken:x,setHttpRequestErrorCallback:G,setHttpRequestFinishCallback:g,setHttpRequestStartCallback:y,setHttpRequestSuccessCallback:X,signIn:R,signOut:K,trySignInSilently:U,updateConfig:Q});case 49:case"end":return n.stop()}}),n)})))},AQ=function(t){switch(t){case UF.LocalStorage:return new Ij;case UF.SessionStorage:return new Xj;case UF.BrowserMemory:return new yj;default:return new Xj}},FQ=function(t,e,n){return rF(void 0,void 0,void 0,c().mark((function r(){var i,a,o,l,u,s,d,m,h,b,Z,p,I,y,X,g,G,f,V,W,v,C,Y,S,R,K,N,L,J,x,H,k,U,T,w,A,F,z,B,j,M,Q,P,E,D;return c().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return o=null!==(i=null==t?void 0:t.requestTimeout)&&void 0!==i?i:6e4,l=!0,u=!1,s=AQ(t.storage),d=new UQ,m=new NF(s,d),r.next=8,m.initialize(t);case 8:return h=new cz(m),r.next=11,lz((function(){return rF(void 0,void 0,void 0,c().mark((function t(){var e,n;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e={type:"sign-out"},t.prev=1,t.next=4,I(e);case 4:return n=t.sent,t.abrupt("return",n);case 8:return t.prev=8,t.t0=t.catch(1),t.abrupt("return",oz.getSignOutURL());case 11:case"end":return t.stop()}}),t,null,[[1,8]])})))}),t.storage,(function(t){return W(t)}));case 11:return b=r.sent,Z=n(m,h),p=new e,I=function(t){var e=new MessageChannel;return p.postMessage(t,[e.port2]),new Promise((function(t,n){var r=setTimeout((function(){n(new WF("SPA-WEB_WORKER_CLIENT-COM-TO01","Operation timed out.","No response was received from the web worker for "+o/1e3+" since dispatching the request"))}),o);return e.port1.onmessage=function(e){var i=e.data;if(clearTimeout(r),null==i?void 0:i.success){var c=(null==i?void 0:i.data)?JSON.parse(null==i?void 0:i.data):null;(null==i?void 0:i.blob)&&(c.data=null==i?void 0:i.blob),t(c)}else n(i.error?JSON.parse(i.error):null)}}))},y=function(t){return I({data:t,type:"request-custom-grant"}).then((function(e){return t.preventSignOutURLUpdate&&(u=!0),Promise.resolve(e)})).catch((function(t){return Promise.reject(t)}))},X=function(t){return I({data:t,type:"http-request"}).then((function(t){return Promise.resolve(t)})).catch((function(t){return rF(void 0,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!l){e.next=5;break}if("function"!=typeof a.requestErrorCallback){e.next=4;break}return e.next=4,a.requestErrorCallback(t);case 4:"function"==typeof a.requestFinishCallback&&a.requestFinishCallback();case 5:return e.abrupt("return",Promise.reject(t));case 6:case"end":return e.stop()}}),e)})))}))},g=function(t){return I({data:t,type:"http-request-all"}).then((function(t){return Promise.resolve(t)})).catch((function(t){return rF(void 0,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!l){e.next=5;break}if("function"!=typeof a.requestErrorCallback){e.next=4;break}return e.next=4,a.requestErrorCallback(t);case 4:"function"==typeof a.requestFinishCallback&&a.requestFinishCallback();case 5:return e.abrupt("return",Promise.reject(t));case 6:case"end":return e.stop()}}),e)})))}))},G=function(){return I({type:"enable_http_handler"}).then((function(){return l=!0,Promise.resolve(!0)})).catch((function(t){return Promise.reject(t)}))},f=function(){return I({type:"disable_http_handler"}).then((function(){return l=!1,Promise.resolve(!0)})).catch((function(t){return Promise.reject(t)}))},V=function(){return a||(a={requestErrorCallback:function(){return Promise.resolve()},requestFinishCallback:function(){return null},requestStartCallback:function(){return null},requestSuccessCallback:function(){return null}}),p.onmessage=function(t){var e=t.data;switch(e.type){case"request-finish":(null==a?void 0:a.requestFinishCallback)&&(null==a||a.requestFinishCallback());break;case"request-start":(null==a?void 0:a.requestStartCallback)&&(null==a||a.requestStartCallback());break;case"request-success":(null==a?void 0:a.requestSuccessCallback)&&(null==a||a.requestSuccessCallback(e.data?JSON.parse(e.data):null))}},I({data:t,type:"init"}).then((function(){return Promise.resolve(!0)})).catch((function(t){return Promise.reject(t)}))},W=function(t){return I({data:t,type:"set_session_state"})},v=function(){return I({type:"start_auto_refresh_token"})},C=function(){return rF(void 0,void 0,void 0,c().mark((function t(){var e,n;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,k();case 2:return e=t.sent,t.next=5,U();case 5:n=t.sent,Z.initializeSessionManger(n,e,(function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,T();case 2:return t.abrupt("return",t.sent.sessionState);case 3:case"end":return t.stop()}}),t)})))}),(function(t){return rF(void 0,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,R(t);case 2:return e.abrupt("return",e.sent.authorizationURL);case 3:case"end":return e.stop()}}),e)})))}),b);case 7:case"end":return t.stop()}}),t)})))},Y=function(){return rF(void 0,void 0,void 0,c().mark((function t(){var e,n,r,i,a,o,l,u;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,U();case 2:return n=t.sent,r={data:{prompt:"none",state:"sign-in-silently"},type:"get_auth_url"},t.next=6,I(r);case 6:return i=t.sent,a=vF.extractPKCEKeyFromStateParam(null!==(e=new URL(i.authorizationURL).searchParams.get(fF))&&void 0!==e?e:""),i.pkce&&n.enablePKCE&&oz.setPKCE(a,i.pkce),o=i.authorizationURL,(l=new URL(o)).searchParams.set("response_mode","query"),u=l.toString(),t.abrupt("return",u);case 14:case"end":return t.stop()}}),t)})))},S=function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,Z.trySignInSilently(Y,K,b);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t)})))},R=function(t){return rF(void 0,void 0,void 0,c().mark((function e(){var n,r;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,U();case 2:return n=e.sent,r={data:t,type:"get_auth_url"},e.abrupt("return",I(r).then((function(t){return rF(void 0,void 0,void 0,c().mark((function e(){var r,i;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.pkce&&n.enablePKCE&&(i=vF.extractPKCEKeyFromStateParam(null!==(r=new URL(t.authorizationURL).searchParams.get(fF))&&void 0!==r?r:""),oz.setPKCE(i,t.pkce)),e.abrupt("return",Promise.resolve(t));case 2:case"end":return e.stop()}}),e)})))})));case 5:case"end":return e.stop()}}),e)})))},K=function(t,e,n){return rF(void 0,void 0,void 0,c().mark((function r(){var i,a,o;return c().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.next=2,U();case 2:return i=r.sent,a=vF.extractPKCEKeyFromStateParam(n),o={data:{code:t,pkce:i.enablePKCE?oz.getPKCE(a):void 0,sessionState:e,state:n},type:"request_get_token"},i.enablePKCE&&oz.removePKCE(a),r.abrupt("return",I(o).then((function(t){return I({type:"get_sign_out_url"}).then((function(e){return oz.setSignOutURL(e),i.enableOIDCSessionManagement&&C(),v(),Promise.resolve(t)})).catch((function(t){return Promise.reject(t)}))})).catch((function(t){return Promise.reject(t)})));case 7:case"end":return r.stop()}}),r)})))},N=function(){return rF(void 0,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,b.receivePromptNoneResponse((function(t){return rF(void 0,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",W(t));case 1:case"end":return e.stop()}}),e)})))}));case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t)})))},L=function(){return rF(void 0,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,B();case 2:if(!e.sent){e.next=7;break}return e.next=5,v();case 5:return t.enableOIDCSessionManagement&&C(),e.abrupt("return",T());case 7:case"end":return e.stop()}}),e)})))},J=function(e,n,r,i){return rF(void 0,void 0,void 0,c().mark((function a(){var o,l,u,s,d,m,h;return c().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,Z.handleSignIn(N,C,L);case 2:if(!(s=a.sent)){a.next=7;break}return a.abrupt("return",s);case 7:if((null==t?void 0:t.responseMode)===eF.formPost&&n?(d=n,m=null!=r?r:"",h=null!=i?i:""):(d=null!==(o=new URL(window.location.href).searchParams.get(yF))&&void 0!==o?o:"",m=null!==(l=new URL(window.location.href).searchParams.get(XF))&&void 0!==l?l:"",h=null!==(u=new URL(window.location.href).searchParams.get(fF))&&void 0!==u?u:"",oz.removeAuthorizationCode()),!d||!h){a.next=10;break}return a.abrupt("return",K(d,m,h));case 10:return a.abrupt("return",R(e).then((function(t){return rF(void 0,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return location.href=t.authorizationURL,e.next=3,oz.waitTillPageRedirect();case 3:return e.abrupt("return",Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""}));case 4:case"end":return e.stop()}}),e)})))})).catch((function(t){return Promise.reject(t)})));case 11:case"end":return a.stop()}}),a)})))},x=function(){return B().then((function(t){return rF(void 0,void 0,void 0,c().mark((function e(){var n;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!t||u){e.next=5;break}return n={type:"sign-out"},e.abrupt("return",I(n).then((function(t){return rF(void 0,void 0,void 0,c().mark((function e(){return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return window.location.href=t,e.next=3,oz.waitTillPageRedirect();case 3:return e.abrupt("return",Promise.resolve(!0));case 4:case"end":return e.stop()}}),e)})))})).catch((function(t){return Promise.reject(t)})));case 5:return window.location.href=oz.getSignOutURL(),e.next=8,oz.waitTillPageRedirect();case 8:return e.abrupt("return",Promise.resolve(!0));case 9:case"end":return e.stop()}}),e)})))})).catch((function(t){return Promise.reject(t)}))},H=function(){return I({type:"revoke-access-token"}).then((function(t){return b.reset(),Promise.resolve(t)})).catch((function(t){return Promise.reject(t)}))},k=function(){return I({type:"get-oidc-service-endpoints"}).then((function(t){return Promise.resolve(t)})).catch((function(t){return Promise.reject(t)}))},U=function(){return I({type:"get_config_data"}).then((function(t){return Promise.resolve(t)})).catch((function(t){return Promise.reject(t)}))},T=function(){return I({type:"get-basic-user-info"}).then((function(t){return Promise.resolve(t)})).catch((function(t){return Promise.reject(t)}))},w=function(){return I({type:"get-decoded-id-token"}).then((function(t){return Promise.resolve(t)})).catch((function(t){return Promise.reject(t)}))},A=function(){return I({type:"get-decoded-idp-id-token"}).then((function(t){return Promise.resolve(t)})).catch((function(t){return Promise.reject(t)}))},F=function(){return I({type:"get-crypto-helper"}).then((function(t){return Promise.resolve(t)})).catch((function(t){return Promise.reject(t)}))},z=function(){return I({type:"get_id_token"}).then((function(t){return Promise.resolve(t)})).catch((function(t){return Promise.reject(t)}))},B=function(){return I({type:"is_authenticated"}).then((function(t){return Promise.resolve(t)})).catch((function(t){return Promise.reject(t)}))},j=function(){return I({type:"refresh_access-token"})},M=function(t){t&&"function"==typeof t&&(a.requestSuccessCallback=t)},Q=function(t){t&&"function"==typeof t&&(a.requestErrorCallback=t)},P=function(t){t&&"function"==typeof t&&(a.requestStartCallback=t)},E=function(t){t&&"function"==typeof t&&(a.requestFinishCallback=t)},D=function(t){return rF(void 0,void 0,void 0,c().mark((function e(){var n,r,i,a;return c().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,U();case 2:return n=e.sent,r=!(n&&n.endpoints&&n.endpoints.checkSessionIframe&&t&&t.endpoints&&t.endpoints.checkSessionIframe&&n.endpoints.checkSessionIframe===t.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},n),t),a={data:i,type:"update_config"},e.next=8,I(a);case 8:i.enableOIDCSessionManagement&&r&&(b.reset(),C());case 9:case"end":return e.stop()}}),e)})))},r.abrupt("return",{disableHttpHandler:f,enableHttpHandler:G,getBasicUserInfo:T,getCryptoHelper:F,getDecodedIDPIDToken:A,getDecodedIDToken:w,getIDToken:z,getOIDCServiceEndpoints:k,httpRequest:X,httpRequestAll:g,initialize:V,isAuthenticated:B,refreshAccessToken:j,requestCustomGrant:y,revokeAccessToken:H,setHttpRequestErrorCallback:Q,setHttpRequestFinishCallback:E,setHttpRequestStartCallback:P,setHttpRequestSuccessCallback:M,signIn:J,signOut:x,trySignInSilently:S,updateConfig:D});case 48:case"end":return r.stop()}}),r)})))},zQ={checkSessionInterval:3,clientHost:origin,enableOIDCSessionManagement:!1,sessionRefreshInterval:300,storage:UF.SessionStorage},BQ=function(){function t(e){u(this,t),this._authHelper=iz,this._worker=wF,this._initialized=!1,this._startedInitialize=!1,this._onSignInCallback=function(){return null},this._onSignOutCallback=function(){return null},this._onSignOutFailedCallback=function(){return null},this._onEndUserSession=function(){return null},this._onInitialize=function(){return null},this._onCustomGrant=new Map,this._instanceID=e}return d(t,[{key:"instantiateAuthHelper",value:function(t){this._authHelper=t||iz}},{key:"instantiateWorker",value:function(t){this._worker=t||wF}},{key:"_isInitialized",value:function(){return rF(this,void 0,void 0,c().mark((function t(){var e,n;return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this._startedInitialize){t.next=2;break}return t.abrupt("return",!1);case 2:e=0,n=function(){return new Promise((function(t){return setTimeout(t,1)}))};case 4:if(this._initialized){t.next=11;break}return 1e4===e&&console.warn("It is taking longer than usual for the object to be initialized"),t.next=8,n();case 8:e++,t.next=4;break;case 11:return t.abrupt("return",!0);case 12:case"end":return t.stop()}}),t,this)})))}},{key:"_validateMethod",value:function(){return rF(this,void 0,void 0,c().mark((function t(){return c().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this._isInitialized();case 2:if(t.sent){t.next=4;break}return t.abrupt("return",Promise.reject());case 4:return t.next=6,this.isAuthenticated();case 6:if(t.sent){t.next=8;break}return t.abrupt("return",Promise.reject());case 8:return t.abrupt("return",!0);case 9:case"end":return t.stop()}}),t,this)})))}
456
456
  /**