@asgardeo/auth-spa 3.4.0 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/asgardeo-spa.production.esm.js +10 -10
- package/dist/asgardeo-spa.production.esm.js.map +1 -1
- package/dist/asgardeo-spa.production.js +10 -10
- package/dist/asgardeo-spa.production.js.map +1 -1
- package/dist/asgardeo-spa.production.min.js +1 -1
- package/dist/asgardeo-spa.production.min.js.map +1 -1
- package/dist/polyfilled/asgardeo-spa.production.esm.js +7 -7
- package/dist/polyfilled/asgardeo-spa.production.esm.js.map +1 -1
- package/dist/polyfilled/asgardeo-spa.production.js +13 -13
- package/dist/polyfilled/asgardeo-spa.production.js.map +1 -1
- package/dist/polyfilled/asgardeo-spa.production.min.js +1 -1
- package/dist/polyfilled/asgardeo-spa.production.min.js.map +1 -1
- package/dist/src/utils/message-utils.d.ts +8 -1
- package/dist/src/utils/message-utils.d.ts.map +1 -1
- package/dist/src/utils/message-utils.js +27 -5
- package/dist/src/utils/message-utils.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/utils/message-utils.ts +26 -5
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).AsgardeoAuth={})}(this,(function(e){"use strict";var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function i(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function n(e){if(e.__esModule)return e;var t=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(e).forEach((function(i){var n=Object.getOwnPropertyDescriptor(e,i);Object.defineProperty(t,i,n.get?n:{enumerable:!0,get:function(){return e[i]}})})),t}var l=function(e){return e&&e.Math==Math&&e},o=l("object"==typeof globalThis&&globalThis)||l("object"==typeof window&&window)||l("object"==typeof self&&self)||l("object"==typeof t&&t)||function(){return this}()||Function("return this")(),c=o,a=function(e){try{return!!e()}catch(e){return!0}},d=!a((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")})),s=d,r=Function.prototype,u=r.bind,Z=r.call,b=s&&u.bind(Z,Z),h=s?function(e){return e&&b(e)}:function(e){return e&&function(){return Z.apply(e,arguments)}},m=TypeError,p=function(e){if(null==e)throw m("Can't call method on "+e);return e},I=p,G=Object,g=function(e){return G(I(e))},y=g,X=h({}.hasOwnProperty),V=Object.hasOwn||function(e,t){return X(y(e),t)},W={},C={exports:{}},R=o,S=Object.defineProperty,v=function(e,t){try{S(R,e,{value:t,configurable:!0,writable:!0})}catch(i){R[e]=t}return t},f=v,Y="__core-js_shared__",K=o[Y]||f(Y,{}),N=K;(C.exports=function(e,t){return N[e]||(N[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.24.0",mode:"global",copyright:"© 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.24.0/LICENSE",source:"https://github.com/zloirock/core-js"});var J,U,L=h,H=0,k=Math.random(),T=L(1..toString),F=function(e){return"Symbol("+(void 0===e?"":e)+")_"+T(++H+k,36)},A=function(e){return"function"==typeof e},x=o,B=A,w=function(e){return B(e)?e:void 0},z=function(e,t){return arguments.length<2?w(x[e]):x[e]&&x[e][t]},P=z("navigator","userAgent")||"",Q=o,j=P,M=Q.process,E=Q.Deno,O=M&&M.versions||E&&E.version,D=O&&O.v8;D&&(U=(J=D.split("."))[0]>0&&J[0]<4?1:+(J[0]+J[1])),!U&&j&&(!(J=j.match(/Edge\/(\d+)/))||J[1]>=74)&&(J=j.match(/Chrome\/(\d+)/))&&(U=+J[1]);var _=U,q=_,$=a,ee=!!Object.getOwnPropertySymbols&&!$((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&q&&q<41})),te=ee&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,ie=o,ne=C.exports,le=V,oe=F,ce=ee,ae=te,de=ne("wks"),se=ie.Symbol,re=se&&se.for,ue=ae?se:se&&se.withoutSetter||oe,Ze=function(e){if(!le(de,e)||!ce&&"string"!=typeof de[e]){var t="Symbol."+e;ce&&le(se,e)?de[e]=se[e]:de[e]=ae&&re?re(t):ue(t)}return de[e]},be=Ze;W.f=be;var he={},me=!a((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),pe=A,Ie=function(e){return"object"==typeof e?null!==e:pe(e)},Ge=Ie,ge=o.document,ye=Ge(ge)&&Ge(ge.createElement),Xe=function(e){return ye?ge.createElement(e):{}},Ve=Xe,We=!me&&!a((function(){return 7!=Object.defineProperty(Ve("div"),"a",{get:function(){return 7}}).a})),Ce=me&&a((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype})),Re=Ie,Se=String,ve=TypeError,fe=function(e){if(Re(e))return e;throw ve(Se(e)+" is not an object")},Ye=d,Ke=Function.prototype.call,Ne=Ye?Ke.bind(Ke):function(){return Ke.apply(Ke,arguments)},Je=h({}.isPrototypeOf),Ue=z,Le=A,He=Je,ke=Object,Te=te?function(e){return"symbol"==typeof e}:function(e){var t=Ue("Symbol");return Le(t)&&He(t.prototype,ke(e))},Fe=String,Ae=function(e){try{return Fe(e)}catch(e){return"Object"}},xe=A,Be=Ae,we=TypeError,ze=function(e){if(xe(e))return e;throw we(Be(e)+" is not a function")},Pe=ze,Qe=function(e,t){var i=e[t];return null==i?void 0:Pe(i)},je=Ne,Me=A,Ee=Ie,Oe=TypeError,De=Ne,_e=Ie,qe=Te,$e=Qe,et=function(e,t){var i,n;if("string"===t&&Me(i=e.toString)&&!Ee(n=je(i,e)))return n;if(Me(i=e.valueOf)&&!Ee(n=je(i,e)))return n;if("string"!==t&&Me(i=e.toString)&&!Ee(n=je(i,e)))return n;throw Oe("Can't convert object to primitive value")},tt=TypeError,it=Ze("toPrimitive"),nt=function(e,t){if(!_e(e)||qe(e))return e;var i,n=$e(e,it);if(n){if(void 0===t&&(t="default"),i=De(n,e,t),!_e(i)||qe(i))return i;throw tt("Can't convert object to primitive value")}return void 0===t&&(t="number"),et(e,t)},lt=nt,ot=Te,ct=function(e){var t=lt(e,"string");return ot(t)?t:t+""},at=me,dt=We,st=Ce,rt=fe,ut=ct,Zt=TypeError,bt=Object.defineProperty,ht=Object.getOwnPropertyDescriptor,mt="enumerable",pt="configurable",It="writable";he.f=at?st?function(e,t,i){if(rt(e),t=ut(t),rt(i),"function"==typeof e&&"prototype"===t&&"value"in i&&It in i&&!i.writable){var n=ht(e,t);n&&n.writable&&(e[t]=i.value,i={configurable:pt in i?i.configurable:n.configurable,enumerable:mt in i?i.enumerable:n.enumerable,writable:!1})}return bt(e,t,i)}:bt:function(e,t,i){if(rt(e),t=ut(t),rt(i),dt)try{return bt(e,t,i)}catch(e){}if("get"in i||"set"in i)throw Zt("Accessors not supported");return"value"in i&&(e[t]=i.value),e};var Gt=c,gt=V,yt=W,Xt=he.f,Vt=function(e){var t=Gt.Symbol||(Gt.Symbol={});gt(t,e)||Xt(t,e,{value:yt.f(e)})};Vt("matchAll");var Wt={},Ct={},Rt={}.propertyIsEnumerable,St=Object.getOwnPropertyDescriptor,vt=St&&!Rt.call({1:2},1);Ct.f=vt?function(e){var t=St(this,e);return!!t&&t.enumerable}:Rt;var ft=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},Yt=h,Kt=Yt({}.toString),Nt=Yt("".slice),Jt=function(e){return Nt(Kt(e),8,-1)},Ut=a,Lt=Jt,Ht=Object,kt=h("".split),Tt=Ut((function(){return!Ht("z").propertyIsEnumerable(0)}))?function(e){return"String"==Lt(e)?kt(e,""):Ht(e)}:Ht,Ft=Tt,At=p,xt=function(e){return Ft(At(e))},Bt=me,wt=Ne,zt=Ct,Pt=ft,Qt=xt,jt=ct,Mt=V,Et=We,Ot=Object.getOwnPropertyDescriptor;Wt.f=Bt?Ot:function(e,t){if(e=Qt(e),t=jt(t),Et)try{return Ot(e,t)}catch(e){}if(Mt(e,t))return Pt(!wt(zt.f,e,t),e[t])};var Dt=he,_t=ft,qt=me?function(e,t,i){return Dt.f(e,t,_t(1,i))}:function(e,t,i){return e[t]=i,e},$t={exports:{}},ei=me,ti=V,ii=Function.prototype,ni=ei&&Object.getOwnPropertyDescriptor,li=ti(ii,"name"),oi={EXISTS:li,PROPER:li&&"something"===function(){}.name,CONFIGURABLE:li&&(!ei||ei&&ni(ii,"name").configurable)},ci=A,ai=K,di=h(Function.toString);ci(ai.inspectSource)||(ai.inspectSource=function(e){return di(e)});var si,ri,ui,Zi=ai.inspectSource,bi=A,hi=Zi,mi=o.WeakMap,pi=bi(mi)&&/native code/.test(hi(mi)),Ii=C.exports,Gi=F,gi=Ii("keys"),yi=function(e){return gi[e]||(gi[e]=Gi(e))},Xi={},Vi=pi,Wi=o,Ci=h,Ri=Ie,Si=qt,vi=V,fi=K,Yi=yi,Ki=Xi,Ni="Object already initialized",Ji=Wi.TypeError,Ui=Wi.WeakMap;if(Vi||fi.state){var Li=fi.state||(fi.state=new Ui),Hi=Ci(Li.get),ki=Ci(Li.has),Ti=Ci(Li.set);si=function(e,t){if(ki(Li,e))throw new Ji(Ni);return t.facade=e,Ti(Li,e,t),t},ri=function(e){return Hi(Li,e)||{}},ui=function(e){return ki(Li,e)}}else{var Fi=Yi("state");Ki[Fi]=!0,si=function(e,t){if(vi(e,Fi))throw new Ji(Ni);return t.facade=e,Si(e,Fi,t),t},ri=function(e){return vi(e,Fi)?e[Fi]:{}},ui=function(e){return vi(e,Fi)}}var Ai={set:si,get:ri,has:ui,enforce:function(e){return ui(e)?ri(e):si(e,{})},getterFor:function(e){return function(t){var i;if(!Ri(t)||(i=ri(t)).type!==e)throw Ji("Incompatible receiver, "+e+" required");return i}}},xi=a,Bi=A,wi=V,zi=me,Pi=oi.CONFIGURABLE,Qi=Zi,ji=Ai.enforce,Mi=Ai.get,Ei=Object.defineProperty,Oi=zi&&!xi((function(){return 8!==Ei((function(){}),"length",{value:8}).length})),Di=String(String).split("String"),_i=$t.exports=function(e,t,i){"Symbol("===String(t).slice(0,7)&&(t="["+String(t).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),i&&i.getter&&(t="get "+t),i&&i.setter&&(t="set "+t),(!wi(e,"name")||Pi&&e.name!==t)&&(zi?Ei(e,"name",{value:t,configurable:!0}):e.name=t),Oi&&i&&wi(i,"arity")&&e.length!==i.arity&&Ei(e,"length",{value:i.arity});try{i&&wi(i,"constructor")&&i.constructor?zi&&Ei(e,"prototype",{writable:!1}):e.prototype&&(e.prototype=void 0)}catch(e){}var n=ji(e);return wi(n,"source")||(n.source=Di.join("string"==typeof t?t:"")),e};Function.prototype.toString=_i((function(){return Bi(this)&&Mi(this).source||Qi(this)}),"toString");var qi=A,$i=he,en=$t.exports,tn=v,nn=function(e,t,i,n){n||(n={});var l=n.enumerable,o=void 0!==n.name?n.name:t;if(qi(i)&&en(i,o,n),n.global)l?e[t]=i:tn(t,i);else{try{n.unsafe?e[t]&&(l=!0):delete e[t]}catch(e){}l?e[t]=i:$i.f(e,t,{value:i,enumerable:!1,configurable:!n.nonConfigurable,writable:!n.nonWritable})}return e},ln={},on=Math.ceil,cn=Math.floor,an=Math.trunc||function(e){var t=+e;return(t>0?cn:on)(t)},dn=an,sn=function(e){var t=+e;return t!=t||0===t?0:dn(t)},rn=sn,un=Math.max,Zn=Math.min,bn=function(e,t){var i=rn(e);return i<0?un(i+t,0):Zn(i,t)},hn=sn,mn=Math.min,pn=function(e){return e>0?mn(hn(e),9007199254740991):0},In=pn,Gn=function(e){return In(e.length)},gn=xt,yn=bn,Xn=Gn,Vn=function(e){return function(t,i,n){var l,o=gn(t),c=Xn(o),a=yn(n,c);if(e&&i!=i){for(;c>a;)if((l=o[a++])!=l)return!0}else for(;c>a;a++)if((e||a in o)&&o[a]===i)return e||a||0;return!e&&-1}},Wn={includes:Vn(!0),indexOf:Vn(!1)},Cn=V,Rn=xt,Sn=Wn.indexOf,vn=Xi,fn=h([].push),Yn=function(e,t){var i,n=Rn(e),l=0,o=[];for(i in n)!Cn(vn,i)&&Cn(n,i)&&fn(o,i);for(;t.length>l;)Cn(n,i=t[l++])&&(~Sn(o,i)||fn(o,i));return o},Kn=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Nn=Yn,Jn=Kn.concat("length","prototype");ln.f=Object.getOwnPropertyNames||function(e){return Nn(e,Jn)};var Un={};Un.f=Object.getOwnPropertySymbols;var Ln=z,Hn=ln,kn=Un,Tn=fe,Fn=h([].concat),An=Ln("Reflect","ownKeys")||function(e){var t=Hn.f(Tn(e)),i=kn.f;return i?Fn(t,i(e)):t},xn=V,Bn=An,wn=Wt,zn=he,Pn=a,Qn=A,jn=/#|\.prototype\./,Mn=function(e,t){var i=On[En(e)];return i==_n||i!=Dn&&(Qn(t)?Pn(t):!!t)},En=Mn.normalize=function(e){return String(e).replace(jn,".").toLowerCase()},On=Mn.data={},Dn=Mn.NATIVE="N",_n=Mn.POLYFILL="P",qn=Mn,$n=o,el=Wt.f,tl=qt,il=nn,nl=v,ll=function(e,t,i){for(var n=Bn(t),l=zn.f,o=wn.f,c=0;c<n.length;c++){var a=n[c];xn(e,a)||i&&xn(i,a)||l(e,a,o(t,a))}},ol=qn,cl=function(e,t){var i,n,l,o,c,a=e.target,d=e.global,s=e.stat;if(i=d?$n:s?$n[a]||nl(a,{}):($n[a]||{}).prototype)for(n in t){if(o=t[n],l=e.dontCallGetSet?(c=el(i,n))&&c.value:i[n],!ol(d?n:a+(s?".":"#")+n,e.forced)&&void 0!==l){if(typeof o==typeof l)continue;ll(o,l)}(e.sham||l&&l.sham)&&tl(o,"sham",!0),il(i,n,o,e)}},al={},dl=Yn,sl=Kn,rl=Object.keys||function(e){return dl(e,sl)},ul=me,Zl=Ce,bl=he,hl=fe,ml=xt,pl=rl;al.f=ul&&!Zl?Object.defineProperties:function(e,t){hl(e);for(var i,n=ml(t),l=pl(t),o=l.length,c=0;o>c;)bl.f(e,i=l[c++],n[i]);return e};var Il,Gl=z("document","documentElement"),gl=fe,yl=al,Xl=Kn,Vl=Xi,Wl=Gl,Cl=Xe,Rl=yi("IE_PROTO"),Sl=function(){},vl=function(e){return"<script>"+e+"</"+"script>"},fl=function(e){e.write(vl("")),e.close();var t=e.parentWindow.Object;return e=null,t},Yl=function(){try{Il=new ActiveXObject("htmlfile")}catch(e){}var e,t;Yl="undefined"!=typeof document?document.domain&&Il?fl(Il):((t=Cl("iframe")).style.display="none",Wl.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(vl("document.F=Object")),e.close(),e.F):fl(Il);for(var i=Xl.length;i--;)delete Yl.prototype[Xl[i]];return Yl()};Vl[Rl]=!0;var Kl=Object.create||function(e,t){var i;return null!==e?(Sl.prototype=gl(e),i=new Sl,Sl.prototype=null,i[Rl]=e):i=Yl(),void 0===t?i:yl.f(i,t)},Nl=Ze,Jl=Kl,Ul=he.f,Ll=Nl("unscopables"),Hl=Array.prototype;null==Hl[Ll]&&Ul(Hl,Ll,{configurable:!0,value:Jl(null)});var kl=function(e){Hl[Ll][e]=!0},Tl=Wn.includes,Fl=kl;cl({target:"Array",proto:!0,forced:a((function(){return!Array(1).includes()}))},{includes:function(e){return Tl(this,e,arguments.length>1?arguments[1]:void 0)}}),Fl("includes"),kl("flat"),kl("flatMap");var Al={},xl=ze,Bl=function(e){var t,i;this.promise=new e((function(e,n){if(void 0!==t||void 0!==i)throw TypeError("Bad Promise constructor");t=e,i=n})),this.resolve=xl(t),this.reject=xl(i)};Al.f=function(e){return new Bl(e)};var wl=ze,zl=d,Pl=h(h.bind),Ql=function(e,t){return wl(e),void 0===t?e:zl?Pl(e,t):function(){return e.apply(t,arguments)}},jl={},Ml=jl,El=Ze("iterator"),Ol=Array.prototype,Dl=function(e){return void 0!==e&&(Ml.Array===e||Ol[El]===e)},_l={};_l[Ze("toStringTag")]="z";var ql="[object z]"===String(_l),$l=A,eo=Jt,to=Ze("toStringTag"),io=Object,no="Arguments"==eo(function(){return arguments}()),lo=ql?eo:function(e){var t,i,n;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(i=function(e,t){try{return e[t]}catch(e){}}(t=io(e),to))?i:no?eo(t):"Object"==(n=eo(t))&&$l(t.callee)?"Arguments":n},oo=lo,co=Qe,ao=jl,so=Ze("iterator"),ro=function(e){if(null!=e)return co(e,so)||co(e,"@@iterator")||ao[oo(e)]},uo=Ne,Zo=ze,bo=fe,ho=Ae,mo=ro,po=TypeError,Io=function(e,t){var i=arguments.length<2?mo(e):t;if(Zo(i))return bo(uo(i,e));throw po(ho(e)+" is not iterable")},Go=Ne,go=fe,yo=Qe,Xo=function(e,t,i){var n,l;go(e);try{if(!(n=yo(e,"return"))){if("throw"===t)throw i;return i}n=Go(n,e)}catch(e){l=!0,n=e}if("throw"===t)throw i;if(l)throw n;return go(n),i},Vo=Ql,Wo=Ne,Co=fe,Ro=Ae,So=Dl,vo=Gn,fo=Je,Yo=Io,Ko=ro,No=Xo,Jo=TypeError,Uo=function(e,t){this.stopped=e,this.result=t},Lo=Uo.prototype,Ho=Ne,ko=ze,To=Al,Fo=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},Ao=function(e,t,i){var n,l,o,c,a,d,s,r=i&&i.that,u=!(!i||!i.AS_ENTRIES),Z=!(!i||!i.IS_RECORD),b=!(!i||!i.IS_ITERATOR),h=!(!i||!i.INTERRUPTED),m=Vo(t,r),p=function(e){return n&&No(n,"normal",e),new Uo(!0,e)},I=function(e){return u?(Co(e),h?m(e[0],e[1],p):m(e[0],e[1])):h?m(e,p):m(e)};if(Z)n=e.iterator;else if(b)n=e;else{if(!(l=Ko(e)))throw Jo(Ro(e)+" is not iterable");if(So(l)){for(o=0,c=vo(e);c>o;o++)if((a=I(e[o]))&&fo(Lo,a))return a;return new Uo(!1)}n=Yo(e,l)}for(d=Z?e.next:n.next;!(s=Wo(d,n)).done;){try{a=I(s.value)}catch(e){No(n,"throw",e)}if("object"==typeof a&&a&&fo(Lo,a))return a}return new Uo(!1)};cl({target:"Promise",stat:!0},{allSettled:function(e){var t=this,i=To.f(t),n=i.resolve,l=i.reject,o=Fo((function(){var i=ko(t.resolve),l=[],o=0,c=1;Ao(e,(function(e){var a=o++,d=!1;c++,Ho(i,t,e).then((function(e){d||(d=!0,l[a]={status:"fulfilled",value:e},--c||n(l))}),(function(e){d||(d=!0,l[a]={status:"rejected",reason:e},--c||n(l))}))})),--c||n(l)}));return o.error&&l(o.value),i.promise}});var xo=o.Promise,Bo=h,wo=a,zo=A,Po=lo,Qo=Zi,jo=function(){},Mo=[],Eo=z("Reflect","construct"),Oo=/^\s*(?:class|function)\b/,Do=Bo(Oo.exec),_o=!Oo.exec(jo),qo=function(e){if(!zo(e))return!1;try{return Eo(jo,Mo,e),!0}catch(e){return!1}},$o=function(e){if(!zo(e))return!1;switch(Po(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return _o||!!Do(Oo,Qo(e))}catch(e){return!0}};$o.sham=!0;var ec=!Eo||wo((function(){var e;return qo(qo.call)||!qo(Object)||!qo((function(){e=!0}))||e}))?$o:qo,tc=ec,ic=Ae,nc=TypeError,lc=function(e){if(tc(e))return e;throw nc(ic(e)+" is not a constructor")},oc=fe,cc=lc,ac=Ze("species"),dc=function(e,t){var i,n=oc(e).constructor;return void 0===n||null==(i=oc(n)[ac])?t:cc(i)},sc=fe,rc=Ie,uc=Al,Zc=cl,bc=xo,hc=a,mc=z,pc=A,Ic=dc,Gc=function(e,t){if(sc(e),rc(t)&&t.constructor===e)return t;var i=uc.f(e);return(0,i.resolve)(t),i.promise},gc=nn,yc=bc&&bc.prototype;if(Zc({target:"Promise",proto:!0,real:!0,forced:!!bc&&hc((function(){yc.finally.call({then:function(){}},(function(){}))}))},{finally:function(e){var t=Ic(this,mc("Promise")),i=pc(e);return this.then(i?function(i){return Gc(t,e()).then((function(){return i}))}:e,i?function(i){return Gc(t,e()).then((function(){throw i}))}:e)}}),pc(bc)){var Xc=mc("Promise").prototype.finally;yc.finally!==Xc&&gc(yc,"finally",Xc,{unsafe:!0})}var Vc=$t.exports,Wc=he,Cc=function(e,t,i){return i.get&&Vc(i.get,t,{getter:!0}),i.set&&Vc(i.set,t,{setter:!0}),Wc.f(e,t,i)},Rc=fe,Sc=function(){var e=Rc(this),t="";return e.hasIndices&&(t+="d"),e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.unicodeSets&&(t+="v"),e.sticky&&(t+="y"),t},vc=me,fc=Cc,Yc=Sc,Kc=a,Nc=o.RegExp,Jc=Nc.prototype,Uc=vc&&Kc((function(){var e=!0;try{Nc(".","d")}catch(t){e=!1}var t={},i="",n=e?"dgimsy":"gimsy",l=function(e,n){Object.defineProperty(t,e,{get:function(){return i+=n,!0}})},o={dotAll:"s",global:"g",ignoreCase:"i",multiline:"m",sticky:"y"};for(var c in e&&(o.hasIndices="d"),o)l(c,o[c]);return Object.getOwnPropertyDescriptor(Jc,"flags").get.call(t)!==n||i!==n}));Uc&&fc(Jc,"flags",{configurable:!0,get:Yc});var Lc,Hc,kc,Tc=!a((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})),Fc=V,Ac=A,xc=g,Bc=Tc,wc=yi("IE_PROTO"),zc=Object,Pc=zc.prototype,Qc=Bc?zc.getPrototypeOf:function(e){var t=xc(e);if(Fc(t,wc))return t[wc];var i=t.constructor;return Ac(i)&&t instanceof i?i.prototype:t instanceof zc?Pc:null},jc=a,Mc=A,Ec=Qc,Oc=nn,Dc=Ze("iterator"),_c=!1;[].keys&&("next"in(kc=[].keys())?(Hc=Ec(Ec(kc)))!==Object.prototype&&(Lc=Hc):_c=!0);var qc=null==Lc||jc((function(){var e={};return Lc[Dc].call(e)!==e}));qc&&(Lc={}),Mc(Lc[Dc])||Oc(Lc,Dc,(function(){return this}));var $c,ea,ta={IteratorPrototype:Lc,BUGGY_SAFARI_ITERATORS:_c},ia=he.f,na=V,la=Ze("toStringTag"),oa=function(e,t,i){e&&!i&&(e=e.prototype),e&&!na(e,la)&&ia(e,la,{configurable:!0,value:t})},ca=ta.IteratorPrototype,aa=Kl,da=ft,sa=oa,ra=jl,ua=function(){return this},Za=function(e,t,i,n){var l=t+" Iterator";return e.prototype=aa(ca,{next:da(+!n,i)}),sa(e,l,!1),ra[l]=ua,e},ba=lo,ha=String,ma=function(e){if("Symbol"===ba(e))throw TypeError("Cannot convert a Symbol value to a string");return ha(e)},pa=Ie,Ia=Jt,Ga=Ze("match"),ga=Ne,ya=V,Xa=Je,Va=Sc,Wa=RegExp.prototype,Ca=h,Ra=sn,Sa=ma,va=p,fa=Ca("".charAt),Ya=Ca("".charCodeAt),Ka=Ca("".slice),Na=function(e){return function(t,i){var n,l,o=Sa(va(t)),c=Ra(i),a=o.length;return c<0||c>=a?e?"":void 0:(n=Ya(o,c))<55296||n>56319||c+1===a||(l=Ya(o,c+1))<56320||l>57343?e?fa(o,c):n:e?Ka(o,c,c+2):l-56320+(n-55296<<10)+65536}},Ja={codeAt:Na(!1),charAt:Na(!0)},Ua=Ja.charAt,La=function(e,t,i){return t+(i?Ua(e,t).length:1)},Ha=a,ka=o.RegExp,Ta=Ha((function(){var e=ka("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),Fa=Ta||Ha((function(){return!ka("a","y").sticky})),Aa={BROKEN_CARET:Ta||Ha((function(){var e=ka("^r","gy");return e.lastIndex=2,null!=e.exec("str")})),MISSED_STICKY:Fa,UNSUPPORTED_Y:Ta},xa=a,Ba=o.RegExp,wa=xa((function(){var e=Ba(".","s");return!(e.dotAll&&e.exec("\n")&&"s"===e.flags)})),za=a,Pa=o.RegExp,Qa=za((function(){var e=Pa("(?<a>b)","g");return"b"!==e.exec("b").groups.a||"bc"!=="b".replace(e,"$<a>c")})),ja=Ne,Ma=h,Ea=ma,Oa=Sc,Da=Aa,_a=C.exports,qa=Kl,$a=Ai.get,ed=wa,td=Qa,id=_a("native-string-replace",String.prototype.replace),nd=RegExp.prototype.exec,ld=nd,od=Ma("".charAt),cd=Ma("".indexOf),ad=Ma("".replace),dd=Ma("".slice),sd=(ea=/b*/g,ja(nd,$c=/a/,"a"),ja(nd,ea,"a"),0!==$c.lastIndex||0!==ea.lastIndex),rd=Da.BROKEN_CARET,ud=void 0!==/()??/.exec("")[1];(sd||ud||rd||ed||td)&&(ld=function(e){var t,i,n,l,o,c,a,d=this,s=$a(d),r=Ea(e),u=s.raw;if(u)return u.lastIndex=d.lastIndex,t=ja(ld,u,r),d.lastIndex=u.lastIndex,t;var Z=s.groups,b=rd&&d.sticky,h=ja(Oa,d),m=d.source,p=0,I=r;if(b&&(h=ad(h,"y",""),-1===cd(h,"g")&&(h+="g"),I=dd(r,d.lastIndex),d.lastIndex>0&&(!d.multiline||d.multiline&&"\n"!==od(r,d.lastIndex-1))&&(m="(?: "+m+")",I=" "+I,p++),i=new RegExp("^(?:"+m+")",h)),ud&&(i=new RegExp("^"+m+"$(?!\\s)",h)),sd&&(n=d.lastIndex),l=ja(nd,b?i:d,I),b?l?(l.input=dd(l.input,p),l[0]=dd(l[0],p),l.index=d.lastIndex,d.lastIndex+=l[0].length):d.lastIndex=0:sd&&l&&(d.lastIndex=d.global?l.index+l[0].length:n),ud&&l&&l.length>1&&ja(id,l[0],i,(function(){for(o=1;o<arguments.length-2;o++)void 0===arguments[o]&&(l[o]=void 0)})),l&&Z)for(l.groups=c=qa(null),o=0;o<Z.length;o++)c[(a=Z[o])[0]]=l[a[1]];return l});var Zd=ld,bd=Ne,hd=fe,md=A,pd=Jt,Id=Zd,Gd=TypeError,gd=function(e,t){var i=e.exec;if(md(i)){var n=bd(i,e,t);return null!==n&&hd(n),n}if("RegExp"===pd(e))return bd(Id,e,t);throw Gd("RegExp#exec called on incompatible receiver")},yd=cl,Xd=Ne,Vd=h,Wd=Za,Cd=p,Rd=pn,Sd=ma,vd=fe,fd=function(e){var t;return pa(e)&&(void 0!==(t=e[Ga])?!!t:"RegExp"==Ia(e))},Yd=function(e){var t=e.flags;return void 0!==t||"flags"in Wa||ya(e,"flags")||!Xa(Wa,e)?t:ga(Va,e)},Kd=Qe,Nd=nn,Jd=a,Ud=dc,Ld=La,Hd=gd,kd=Ai,Td=Ze("matchAll"),Fd="RegExp String",Ad="RegExp String Iterator",xd=kd.set,Bd=kd.getterFor(Ad),wd=RegExp.prototype,zd=TypeError,Pd=Vd("".indexOf),Qd=Vd("".matchAll),jd=!!Qd&&!Jd((function(){Qd("a",/./)})),Md=Wd((function(e,t,i,n){xd(this,{type:Ad,regexp:e,string:t,global:i,unicode:n,done:!1})}),Fd,(function(){var e=Bd(this);if(e.done)return{value:void 0,done:!0};var t=e.regexp,i=e.string,n=Hd(t,i);return null===n?{value:void 0,done:e.done=!0}:e.global?(""===Sd(n[0])&&(t.lastIndex=Ld(i,Rd(t.lastIndex),e.unicode)),{value:n,done:!1}):(e.done=!0,{value:n,done:!1})})),Ed=function(e){var t,i,n,l=vd(this),o=Sd(e),c=Ud(l,RegExp),a=Sd(Yd(l));return t=new c(c===RegExp?l.source:l,a),i=!!~Pd(a,"g"),n=!!~Pd(a,"u"),t.lastIndex=Rd(l.lastIndex),new Md(t,o,i,n)};yd({target:"String",proto:!0,forced:jd},{matchAll:function(e){var t,i,n,l=Cd(this);if(null!=e){if(fd(e)&&(t=Sd(Cd(Yd(e))),!~Pd(t,"g")))throw zd("`.matchAll` does not allow non-global regexes");if(jd)return Qd(l,e);if(n=Kd(e,Td))return Xd(n,e,l)}else if(jd)return Qd(l,e);return i=Sd(l),new RegExp(e,"g")[Td](i)}}),Td in wd||Nd(wd,Td,Ed);var Od=d,Dd=Function.prototype,_d=Dd.apply,qd=Dd.call,$d="object"==typeof Reflect&&Reflect.apply||(Od?qd.bind(_d):function(){return qd.apply(_d,arguments)});cl({target:"RegExp",proto:!0,forced:/./.exec!==Zd},{exec:Zd});var es=h,ts=nn,is=Zd,ns=a,ls=Ze,os=qt,cs=ls("species"),as=RegExp.prototype,ds=h,ss=g,rs=Math.floor,us=ds("".charAt),Zs=ds("".replace),bs=ds("".slice),hs=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,ms=/\$([$&'`]|\d{1,2})/g,ps=$d,Is=Ne,Gs=h,gs=function(e,t,i,n){var l=ls(e),o=!ns((function(){var t={};return t[l]=function(){return 7},7!=""[e](t)})),c=o&&!ns((function(){var t=!1,i=/a/;return"split"===e&&((i={}).constructor={},i.constructor[cs]=function(){return i},i.flags="",i[l]=/./[l]),i.exec=function(){return t=!0,null},i[l](""),!t}));if(!o||!c||i){var a=es(/./[l]),d=t(l,""[e],(function(e,t,i,n,l){var c=es(e),d=t.exec;return d===is||d===as.exec?o&&!l?{done:!0,value:a(t,i,n)}:{done:!0,value:c(i,t,n)}:{done:!1}}));ts(String.prototype,e,d[0]),ts(as,l,d[1])}n&&os(as[l],"sham",!0)},ys=a,Xs=fe,Vs=A,Ws=sn,Cs=pn,Rs=ma,Ss=p,vs=La,fs=Qe,Ys=function(e,t,i,n,l,o){var c=i+e.length,a=n.length,d=ms;return void 0!==l&&(l=ss(l),d=hs),Zs(o,d,(function(o,d){var s;switch(us(d,0)){case"$":return"$";case"&":return e;case"`":return bs(t,0,i);case"'":return bs(t,c);case"<":s=l[bs(d,1,-1)];break;default:var r=+d;if(0===r)return o;if(r>a){var u=rs(r/10);return 0===u?o:u<=a?void 0===n[u-1]?us(d,1):n[u-1]+us(d,1):o}s=n[r-1]}return void 0===s?"":s}))},Ks=gd,Ns=Ze("replace"),Js=Math.max,Us=Math.min,Ls=Gs([].concat),Hs=Gs([].push),ks=Gs("".indexOf),Ts=Gs("".slice),Fs="$0"==="a".replace(/./,"$0"),As=!!/./[Ns]&&""===/./[Ns]("a","$0");gs("replace",(function(e,t,i){var n=As?"$":"$0";return[function(e,i){var n=Ss(this),l=null==e?void 0:fs(e,Ns);return l?Is(l,e,n,i):Is(t,Rs(n),e,i)},function(e,l){var o=Xs(this),c=Rs(e);if("string"==typeof l&&-1===ks(l,n)&&-1===ks(l,"$<")){var a=i(t,o,c,l);if(a.done)return a.value}var d=Vs(l);d||(l=Rs(l));var s=o.global;if(s){var r=o.unicode;o.lastIndex=0}for(var u=[];;){var Z=Ks(o,c);if(null===Z)break;if(Hs(u,Z),!s)break;""===Rs(Z[0])&&(o.lastIndex=vs(c,Cs(o.lastIndex),r))}for(var b,h="",m=0,p=0;p<u.length;p++){for(var I=Rs((Z=u[p])[0]),G=Js(Us(Ws(Z.index),c.length),0),g=[],y=1;y<Z.length;y++)Hs(g,void 0===(b=Z[y])?b:String(b));var X=Z.groups;if(d){var V=Ls([I],g,G,c);void 0!==X&&Hs(V,X);var W=Rs(ps(l,void 0,V))}else W=Ys(I,c,G,g,X,l);G>=m&&(h+=Ts(c,m,G)+W,m=G+I.length)}return h+Ts(c,m)}]}),!!ys((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")}))||!Fs||As);var xs={exports:{}},Bs=Ze("iterator"),ws=!1;try{var zs=0,Ps={next:function(){return{done:!!zs++}},return:function(){ws=!0}};Ps[Bs]=function(){return this},Array.from(Ps,(function(){throw 2}))}catch(e){}var Qs,js,Ms,Es="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView,Os=A,Ds=String,_s=TypeError,qs=h,$s=fe,er=function(e){if("object"==typeof e||Os(e))return e;throw _s("Can't set "+Ds(e)+" as a prototype")},tr=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,i={};try{(e=qs(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(i,[]),t=i instanceof Array}catch(e){}return function(i,n){return $s(i),er(n),t?e(i,n):i.__proto__=n,i}}():void 0),ir=Es,nr=me,lr=o,or=A,cr=Ie,ar=V,dr=lo,sr=Ae,rr=qt,ur=nn,Zr=he.f,br=Je,hr=Qc,mr=tr,pr=Ze,Ir=F,Gr=Ai.enforce,gr=Ai.get,yr=lr.Int8Array,Xr=yr&&yr.prototype,Vr=lr.Uint8ClampedArray,Wr=Vr&&Vr.prototype,Cr=yr&&hr(yr),Rr=Xr&&hr(Xr),Sr=Object.prototype,vr=lr.TypeError,fr=pr("toStringTag"),Yr=Ir("TYPED_ARRAY_TAG"),Kr="TypedArrayConstructor",Nr=ir&&!!mr&&"Opera"!==dr(lr.opera),Jr=!1,Ur={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},Lr={BigInt64Array:8,BigUint64Array:8},Hr=function(e){var t=hr(e);if(cr(t)){var i=gr(t);return i&&ar(i,Kr)?i.TypedArrayConstructor:Hr(t)}},kr=function(e){if(!cr(e))return!1;var t=dr(e);return ar(Ur,t)||ar(Lr,t)};for(Qs in Ur)(Ms=(js=lr[Qs])&&js.prototype)?Gr(Ms).TypedArrayConstructor=js:Nr=!1;for(Qs in Lr)(Ms=(js=lr[Qs])&&js.prototype)&&(Gr(Ms).TypedArrayConstructor=js);if((!Nr||!or(Cr)||Cr===Function.prototype)&&(Cr=function(){throw vr("Incorrect invocation")},Nr))for(Qs in Ur)lr[Qs]&&mr(lr[Qs],Cr);if((!Nr||!Rr||Rr===Sr)&&(Rr=Cr.prototype,Nr))for(Qs in Ur)lr[Qs]&&mr(lr[Qs].prototype,Rr);if(Nr&&hr(Wr)!==Rr&&mr(Wr,Rr),nr&&!ar(Rr,fr))for(Qs in Jr=!0,Zr(Rr,fr,{get:function(){return cr(this)?this[Yr]:void 0}}),Ur)lr[Qs]&&rr(lr[Qs],Yr,Qs);var Tr={NATIVE_ARRAY_BUFFER_VIEWS:Nr,TYPED_ARRAY_TAG:Jr&&Yr,aTypedArray:function(e){if(kr(e))return e;throw vr("Target is not a typed array")},aTypedArrayConstructor:function(e){if(or(e)&&(!mr||br(Cr,e)))return e;throw vr(sr(e)+" is not a typed array constructor")},exportTypedArrayMethod:function(e,t,i,n){if(nr){if(i)for(var l in Ur){var o=lr[l];if(o&&ar(o.prototype,e))try{delete o.prototype[e]}catch(i){try{o.prototype[e]=t}catch(e){}}}Rr[e]&&!i||ur(Rr,e,i?t:Nr&&Xr[e]||t,n)}},exportTypedArrayStaticMethod:function(e,t,i){var n,l;if(nr){if(mr){if(i)for(n in Ur)if((l=lr[n])&&ar(l,e))try{delete l[e]}catch(e){}if(Cr[e]&&!i)return;try{return ur(Cr,e,i?t:Nr&&Cr[e]||t)}catch(e){}}for(n in Ur)!(l=lr[n])||l[e]&&!i||ur(l,e,t)}},getTypedArrayConstructor:Hr,isView:function(e){if(!cr(e))return!1;var t=dr(e);return"DataView"===t||ar(Ur,t)||ar(Lr,t)},isTypedArray:kr,TypedArray:Cr,TypedArrayPrototype:Rr},Fr=o,Ar=a,xr=function(e,t){if(!t&&!ws)return!1;var i=!1;try{var n={};n[Bs]=function(){return{next:function(){return{done:i=!0}}}},e(n)}catch(e){}return i},Br=Tr.NATIVE_ARRAY_BUFFER_VIEWS,wr=Fr.ArrayBuffer,zr=Fr.Int8Array,Pr=!Br||!Ar((function(){zr(1)}))||!Ar((function(){new zr(-1)}))||!xr((function(e){new zr,new zr(null),new zr(1.5),new zr(e)}),!0)||Ar((function(){return 1!==new zr(new wr(2),1,void 0).length})),Qr=nn,jr=function(e,t,i){for(var n in t)Qr(e,n,t[n],i);return e},Mr=Je,Er=TypeError,Or=function(e,t){if(Mr(t,e))return e;throw Er("Incorrect invocation")},Dr=sn,_r=pn,qr=RangeError,$r=function(e){if(void 0===e)return 0;var t=Dr(e),i=_r(t);if(t!==i)throw qr("Wrong length or index");return i},eu=Array,tu=Math.abs,iu=Math.pow,nu=Math.floor,lu=Math.log,ou=Math.LN2,cu={pack:function(e,t,i){var n,l,o,c=eu(i),a=8*i-t-1,d=(1<<a)-1,s=d>>1,r=23===t?iu(2,-24)-iu(2,-77):0,u=e<0||0===e&&1/e<0?1:0,Z=0;for((e=tu(e))!=e||e===1/0?(l=e!=e?1:0,n=d):(n=nu(lu(e)/ou),e*(o=iu(2,-n))<1&&(n--,o*=2),(e+=n+s>=1?r/o:r*iu(2,1-s))*o>=2&&(n++,o/=2),n+s>=d?(l=0,n=d):n+s>=1?(l=(e*o-1)*iu(2,t),n+=s):(l=e*iu(2,s-1)*iu(2,t),n=0));t>=8;)c[Z++]=255&l,l/=256,t-=8;for(n=n<<t|l,a+=t;a>0;)c[Z++]=255&n,n/=256,a-=8;return c[--Z]|=128*u,c},unpack:function(e,t){var i,n=e.length,l=8*n-t-1,o=(1<<l)-1,c=o>>1,a=l-7,d=n-1,s=e[d--],r=127&s;for(s>>=7;a>0;)r=256*r+e[d--],a-=8;for(i=r&(1<<-a)-1,r>>=-a,a+=t;a>0;)i=256*i+e[d--],a-=8;if(0===r)r=1-c;else{if(r===o)return i?NaN:s?-1/0:1/0;i+=iu(2,t),r-=c}return(s?-1:1)*i*iu(2,r-t)}},au=g,du=bn,su=Gn,ru=function(e){for(var t=au(this),i=su(t),n=arguments.length,l=du(n>1?arguments[1]:void 0,i),o=n>2?arguments[2]:void 0,c=void 0===o?i:du(o,i);c>l;)t[l++]=e;return t},uu=ct,Zu=he,bu=ft,hu=function(e,t,i){var n=uu(t);n in e?Zu.f(e,n,bu(0,i)):e[n]=i},mu=bn,pu=Gn,Iu=hu,Gu=Array,gu=Math.max,yu=function(e,t,i){for(var n=pu(e),l=mu(t,n),o=mu(void 0===i?n:i,n),c=Gu(gu(o-l,0)),a=0;l<o;l++,a++)Iu(c,a,e[l]);return c.length=a,c},Xu=o,Vu=h,Wu=me,Cu=Es,Ru=oi,Su=qt,vu=jr,fu=a,Yu=Or,Ku=sn,Nu=pn,Ju=$r,Uu=cu,Lu=Qc,Hu=tr,ku=ln.f,Tu=he.f,Fu=ru,Au=yu,xu=oa,Bu=Ru.PROPER,wu=Ru.CONFIGURABLE,zu=Ai.get,Pu=Ai.set,Qu="ArrayBuffer",ju="DataView",Mu="Wrong index",Eu=Xu.ArrayBuffer,Ou=Eu,Du=Ou&&Ou.prototype,_u=Xu.DataView,qu=_u&&_u.prototype,$u=Object.prototype,eZ=Xu.Array,tZ=Xu.RangeError,iZ=Vu(Fu),nZ=Vu([].reverse),lZ=Uu.pack,oZ=Uu.unpack,cZ=function(e){return[255&e]},aZ=function(e){return[255&e,e>>8&255]},dZ=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},sZ=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},rZ=function(e){return lZ(e,23,4)},uZ=function(e){return lZ(e,52,8)},ZZ=function(e,t){Tu(e.prototype,t,{get:function(){return zu(this)[t]}})},bZ=function(e,t,i,n){var l=Ju(i),o=zu(e);if(l+t>o.byteLength)throw tZ(Mu);var c=zu(o.buffer).bytes,a=l+o.byteOffset,d=Au(c,a,a+t);return n?d:nZ(d)},hZ=function(e,t,i,n,l,o){var c=Ju(i),a=zu(e);if(c+t>a.byteLength)throw tZ(Mu);for(var d=zu(a.buffer).bytes,s=c+a.byteOffset,r=n(+l),u=0;u<t;u++)d[s+u]=r[o?u:t-u-1]};if(Cu){var mZ=Bu&&Eu.name!==Qu;if(fu((function(){Eu(1)}))&&fu((function(){new Eu(-1)}))&&!fu((function(){return new Eu,new Eu(1.5),new Eu(NaN),mZ&&!wu})))mZ&&wu&&Su(Eu,"name",Qu);else{(Ou=function(e){return Yu(this,Du),new Eu(Ju(e))}).prototype=Du;for(var pZ,IZ=ku(Eu),GZ=0;IZ.length>GZ;)(pZ=IZ[GZ++])in Ou||Su(Ou,pZ,Eu[pZ]);Du.constructor=Ou}Hu&&Lu(qu)!==$u&&Hu(qu,$u);var gZ=new _u(new Ou(2)),yZ=Vu(qu.setInt8);gZ.setInt8(0,2147483648),gZ.setInt8(1,2147483649),!gZ.getInt8(0)&&gZ.getInt8(1)||vu(qu,{setInt8:function(e,t){yZ(this,e,t<<24>>24)},setUint8:function(e,t){yZ(this,e,t<<24>>24)}},{unsafe:!0})}else Ou=function(e){Yu(this,Du);var t=Ju(e);Pu(this,{bytes:iZ(eZ(t),0),byteLength:t}),Wu||(this.byteLength=t)},Du=Ou.prototype,_u=function(e,t,i){Yu(this,qu),Yu(e,Du);var n=zu(e).byteLength,l=Ku(t);if(l<0||l>n)throw tZ("Wrong offset");if(l+(i=void 0===i?n-l:Nu(i))>n)throw tZ("Wrong length");Pu(this,{buffer:e,byteLength:i,byteOffset:l}),Wu||(this.buffer=e,this.byteLength=i,this.byteOffset=l)},qu=_u.prototype,Wu&&(ZZ(Ou,"byteLength"),ZZ(_u,"buffer"),ZZ(_u,"byteLength"),ZZ(_u,"byteOffset")),vu(qu,{getInt8:function(e){return bZ(this,1,e)[0]<<24>>24},getUint8:function(e){return bZ(this,1,e)[0]},getInt16:function(e){var t=bZ(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=bZ(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return sZ(bZ(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return sZ(bZ(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return oZ(bZ(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return oZ(bZ(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){hZ(this,1,e,cZ,t)},setUint8:function(e,t){hZ(this,1,e,cZ,t)},setInt16:function(e,t){hZ(this,2,e,aZ,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){hZ(this,2,e,aZ,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){hZ(this,4,e,dZ,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){hZ(this,4,e,dZ,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){hZ(this,4,e,rZ,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){hZ(this,8,e,uZ,t,arguments.length>2?arguments[2]:void 0)}});xu(Ou,Qu),xu(_u,ju);var XZ={ArrayBuffer:Ou,DataView:_u},VZ=Ie,WZ=Math.floor,CZ=Number.isInteger||function(e){return!VZ(e)&&isFinite(e)&&WZ(e)===e},RZ=sn,SZ=RangeError,vZ=function(e){var t=RZ(e);if(t<0)throw SZ("The argument can't be less than 0");return t},fZ=RangeError,YZ=function(e,t){var i=vZ(e);if(i%t)throw fZ("Wrong offset");return i},KZ=Ql,NZ=Ne,JZ=lc,UZ=g,LZ=Gn,HZ=Io,kZ=ro,TZ=Dl,FZ=Tr.aTypedArrayConstructor,AZ=function(e){var t,i,n,l,o,c,a=JZ(this),d=UZ(e),s=arguments.length,r=s>1?arguments[1]:void 0,u=void 0!==r,Z=kZ(d);if(Z&&!TZ(Z))for(c=(o=HZ(d,Z)).next,d=[];!(l=NZ(c,o)).done;)d.push(l.value);for(u&&s>2&&(r=KZ(r,arguments[2])),i=LZ(d),n=new(FZ(a))(i),t=0;i>t;t++)n[t]=u?r(d[t],t):d[t];return n},xZ=Jt,BZ=Array.isArray||function(e){return"Array"==xZ(e)},wZ=ec,zZ=Ie,PZ=Ze("species"),QZ=Array,jZ=function(e){var t;return BZ(e)&&(t=e.constructor,(wZ(t)&&(t===QZ||BZ(t.prototype))||zZ(t)&&null===(t=t[PZ]))&&(t=void 0)),void 0===t?QZ:t},MZ=Ql,EZ=Tt,OZ=g,DZ=Gn,_Z=function(e,t){return new(jZ(e))(0===t?0:t)},qZ=h([].push),$Z=function(e){var t=1==e,i=2==e,n=3==e,l=4==e,o=6==e,c=7==e,a=5==e||o;return function(d,s,r,u){for(var Z,b,h=OZ(d),m=EZ(h),p=MZ(s,r),I=DZ(m),G=0,g=u||_Z,y=t?g(d,I):i||c?g(d,0):void 0;I>G;G++)if((a||G in m)&&(b=p(Z=m[G],G,h),e))if(t)y[G]=b;else if(b)switch(e){case 3:return!0;case 5:return Z;case 6:return G;case 2:qZ(y,Z)}else switch(e){case 4:return!1;case 7:qZ(y,Z)}return o?-1:n||l?l:y}},eb={forEach:$Z(0),map:$Z(1),filter:$Z(2),some:$Z(3),every:$Z(4),find:$Z(5),findIndex:$Z(6),filterReject:$Z(7)},tb=z,ib=he,nb=me,lb=Ze("species"),ob=A,cb=Ie,ab=tr,db=cl,sb=o,rb=Ne,ub=me,Zb=Pr,bb=Tr,hb=XZ,mb=Or,pb=ft,Ib=qt,Gb=CZ,gb=pn,yb=$r,Xb=YZ,Vb=ct,Wb=V,Cb=lo,Rb=Ie,Sb=Te,vb=Kl,fb=Je,Yb=tr,Kb=ln.f,Nb=AZ,Jb=eb.forEach,Ub=function(e){var t=tb(e),i=ib.f;nb&&t&&!t[lb]&&i(t,lb,{configurable:!0,get:function(){return this}})},Lb=he,Hb=Wt,kb=function(e,t,i){var n,l;return ab&&ob(n=t.constructor)&&n!==i&&cb(l=n.prototype)&&l!==i.prototype&&ab(e,l),e},Tb=Ai.get,Fb=Ai.set,Ab=Ai.enforce,xb=Lb.f,Bb=Hb.f,wb=Math.round,zb=sb.RangeError,Pb=hb.ArrayBuffer,Qb=Pb.prototype,jb=hb.DataView,Mb=bb.NATIVE_ARRAY_BUFFER_VIEWS,Eb=bb.TYPED_ARRAY_TAG,Ob=bb.TypedArray,Db=bb.TypedArrayPrototype,_b=bb.aTypedArrayConstructor,qb=bb.isTypedArray,$b="BYTES_PER_ELEMENT",eh="Wrong length",th=function(e,t){_b(e);for(var i=0,n=t.length,l=new e(n);n>i;)l[i]=t[i++];return l},ih=function(e,t){xb(e,t,{get:function(){return Tb(this)[t]}})},nh=function(e){var t;return fb(Qb,e)||"ArrayBuffer"==(t=Cb(e))||"SharedArrayBuffer"==t},lh=function(e,t){return qb(e)&&!Sb(t)&&t in e&&Gb(+t)&&t>=0},oh=function(e,t){return t=Vb(t),lh(e,t)?pb(2,e[t]):Bb(e,t)},ch=function(e,t,i){return t=Vb(t),!(lh(e,t)&&Rb(i)&&Wb(i,"value"))||Wb(i,"get")||Wb(i,"set")||i.configurable||Wb(i,"writable")&&!i.writable||Wb(i,"enumerable")&&!i.enumerable?xb(e,t,i):(e[t]=i.value,e)};ub?(Mb||(Hb.f=oh,Lb.f=ch,ih(Db,"buffer"),ih(Db,"byteOffset"),ih(Db,"byteLength"),ih(Db,"length")),db({target:"Object",stat:!0,forced:!Mb},{getOwnPropertyDescriptor:oh,defineProperty:ch}),xs.exports=function(e,t,i){var n=e.match(/\d+$/)[0]/8,l=e+(i?"Clamped":"")+"Array",o="get"+e,c="set"+e,a=sb[l],d=a,s=d&&d.prototype,r={},u=function(e,t){xb(e,t,{get:function(){return function(e,t){var i=Tb(e);return i.view[o](t*n+i.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,l){var o=Tb(e);i&&(l=(l=wb(l))<0?0:l>255?255:255&l),o.view[c](t*n+o.byteOffset,l,!0)}(this,t,e)},enumerable:!0})};Mb?Zb&&(d=t((function(e,t,i,l){return mb(e,s),kb(Rb(t)?nh(t)?void 0!==l?new a(t,Xb(i,n),l):void 0!==i?new a(t,Xb(i,n)):new a(t):qb(t)?th(d,t):rb(Nb,d,t):new a(yb(t)),e,d)})),Yb&&Yb(d,Ob),Jb(Kb(a),(function(e){e in d||Ib(d,e,a[e])})),d.prototype=s):(d=t((function(e,t,i,l){mb(e,s);var o,c,a,r=0,Z=0;if(Rb(t)){if(!nh(t))return qb(t)?th(d,t):rb(Nb,d,t);o=t,Z=Xb(i,n);var b=t.byteLength;if(void 0===l){if(b%n)throw zb(eh);if((c=b-Z)<0)throw zb(eh)}else if((c=gb(l)*n)+Z>b)throw zb(eh);a=c/n}else a=yb(t),o=new Pb(c=a*n);for(Fb(e,{buffer:o,byteOffset:Z,byteLength:c,length:a,view:new jb(o)});r<a;)u(e,r++)})),Yb&&Yb(d,Ob),s=d.prototype=vb(Db)),s.constructor!==d&&Ib(s,"constructor",d),Ab(s).TypedArrayConstructor=d,Eb&&Ib(s,Eb,l);var Z=d!=a;r[l]=d,db({global:!0,constructor:!0,forced:Z,sham:!Mb},r),$b in d||Ib(d,$b,n),$b in s||Ib(s,$b,n),Ub(l)}):xs.exports=function(){},(0,xs.exports)("Float32",(function(e){return function(t,i,n){return e(this,t,i,n)}})),(0,xs.exports)("Float64",(function(e){return function(t,i,n){return e(this,t,i,n)}})),(0,xs.exports)("Int8",(function(e){return function(t,i,n){return e(this,t,i,n)}})),(0,xs.exports)("Int16",(function(e){return function(t,i,n){return e(this,t,i,n)}})),(0,xs.exports)("Int32",(function(e){return function(t,i,n){return e(this,t,i,n)}})),(0,xs.exports)("Uint8",(function(e){return function(t,i,n){return e(this,t,i,n)}})),(0,xs.exports)("Uint8",(function(e){return function(t,i,n){return e(this,t,i,n)}}),!0),(0,xs.exports)("Uint16",(function(e){return function(t,i,n){return e(this,t,i,n)}})),(0,xs.exports)("Uint32",(function(e){return function(t,i,n){return e(this,t,i,n)}}));var ah=nt,dh=TypeError,sh=ru,rh=function(e){var t=ah(e,"number");if("number"==typeof t)throw dh("Can't convert number to bigint");return BigInt(t)},uh=lo,Zh=Ne,bh=a,hh=Tr.aTypedArray,mh=Tr.exportTypedArrayMethod,ph=h("".slice);mh("fill",(function(e){var t=arguments.length;hh(this);var i="Big"===ph(uh(this),0,3)?rh(e):+e;return Zh(sh,this,i,t>1?arguments[1]:void 0,t>2?arguments[2]:void 0)}),bh((function(){var e=0;return new Int8Array(2).fill({valueOf:function(){return e++}}),1!==e}))),(0,Tr.exportTypedArrayStaticMethod)("from",AZ,Pr);var Ih=Tr.aTypedArrayConstructor;(0,Tr.exportTypedArrayStaticMethod)("of",(function(){for(var e=0,t=arguments.length,i=new(Ih(this))(t);t>e;)i[e]=arguments[e++];return i}),Pr);var Gh=o,gh=Ne,yh=Tr,Xh=Gn,Vh=YZ,Wh=g,Ch=a,Rh=Gh.RangeError,Sh=Gh.Int8Array,vh=Sh&&Sh.prototype,fh=vh&&vh.set,Yh=yh.aTypedArray,Kh=yh.exportTypedArrayMethod,Nh=!Ch((function(){var e=new Uint8ClampedArray(2);return gh(fh,e,{length:1,0:3},1),3!==e[1]})),Jh=Nh&&yh.NATIVE_ARRAY_BUFFER_VIEWS&&Ch((function(){var e=new Sh(2);return e.set(1),e.set("2",1),0!==e[0]||2!==e[1]}));Kh("set",(function(e){Yh(this);var t=Vh(arguments.length>1?arguments[1]:void 0,1),i=Wh(e);if(Nh)return gh(fh,this,i,t);var n=this.length,l=Xh(i),o=0;if(l+t>n)throw Rh("Wrong length");for(;o<l;)this[t+o]=i[o++]}),!Nh||Jh);var Uh=yu,Lh=Math.floor,Hh=function(e,t){var i=e.length,n=Lh(i/2);return i<8?kh(e,t):Th(e,Hh(Uh(e,0,n),t),Hh(Uh(e,n),t),t)},kh=function(e,t){for(var i,n,l=e.length,o=1;o<l;){for(n=o,i=e[o];n&&t(e[n-1],i)>0;)e[n]=e[--n];n!==o++&&(e[n]=i)}return e},Th=function(e,t,i,n){for(var l=t.length,o=i.length,c=0,a=0;c<l||a<o;)e[c+a]=c<l&&a<o?n(t[c],i[a])<=0?t[c++]:i[a++]:c<l?t[c++]:i[a++];return e},Fh=Hh,Ah=P.match(/firefox\/(\d+)/i),xh=!!Ah&&+Ah[1],Bh=/MSIE|Trident/.test(P),wh=P.match(/AppleWebKit\/(\d+)\./),zh=!!wh&&+wh[1],Ph=h,Qh=a,jh=ze,Mh=Fh,Eh=xh,Oh=Bh,Dh=_,_h=zh,qh=Tr.aTypedArray,$h=Tr.exportTypedArrayMethod,em=o.Uint16Array,tm=em&&Ph(em.prototype.sort),im=!(!tm||Qh((function(){tm(new em(2),null)}))&&Qh((function(){tm(new em(2),{})}))),nm=!!tm&&!Qh((function(){if(Dh)return Dh<74;if(Eh)return Eh<67;if(Oh)return!0;if(_h)return _h<602;var e,t,i=new em(516),n=Array(516);for(e=0;e<516;e++)t=e%4,i[e]=515-e,n[e]=e-2*t+3;for(tm(i,(function(e,t){return(e/4|0)-(t/4|0)})),e=0;e<516;e++)if(i[e]!==n[e])return!0}));$h("sort",(function(e){return void 0!==e&&jh(e),nm?tm(this,e):Mh(qh(this),function(e){return function(t,i){return void 0!==e?+e(t,i)||0:i!=i?-1:t!=t?1:0===t&&0===i?1/t>0&&1/i<0?1:-1:t>i}}(e))}),!nm||im);var lm=Xe("span").classList,om=lm&&lm.constructor&&lm.constructor.prototype,cm=om===Object.prototype?void 0:om,am=cl,dm=Ne,sm=A,rm=Za,um=Qc,Zm=tr,bm=oa,hm=qt,mm=nn,pm=jl,Im=oi.PROPER,Gm=oi.CONFIGURABLE,gm=ta.IteratorPrototype,ym=ta.BUGGY_SAFARI_ITERATORS,Xm=Ze("iterator"),Vm="keys",Wm="values",Cm="entries",Rm=function(){return this},Sm=function(e,t,i,n,l,o,c){rm(i,t,n);var a,d,s,r=function(e){if(e===l&&m)return m;if(!ym&&e in b)return b[e];switch(e){case Vm:case Wm:case Cm:return function(){return new i(this,e)}}return function(){return new i(this)}},u=t+" Iterator",Z=!1,b=e.prototype,h=b[Xm]||b["@@iterator"]||l&&b[l],m=!ym&&h||r(l),p="Array"==t&&b.entries||h;if(p&&(a=um(p.call(new e)))!==Object.prototype&&a.next&&(um(a)!==gm&&(Zm?Zm(a,gm):sm(a[Xm])||mm(a,Xm,Rm)),bm(a,u,!0)),Im&&l==Wm&&h&&h.name!==Wm&&(Gm?hm(b,"name",Wm):(Z=!0,m=function(){return dm(h,this)})),l)if(d={values:r(Wm),keys:o?m:r(Vm),entries:r(Cm)},c)for(s in d)(ym||Z||!(s in b))&&mm(b,s,d[s]);else am({target:t,proto:!0,forced:ym||Z},d);return b[Xm]!==m&&mm(b,Xm,m,{name:l}),pm[t]=m,d},vm=xt,fm=kl,Ym=jl,Km=Ai,Nm=he.f,Jm=Sm,Um=me,Lm="Array Iterator",Hm=Km.set,km=Km.getterFor(Lm),Tm=Jm(Array,"Array",(function(e,t){Hm(this,{type:Lm,target:vm(e),index:0,kind:t})}),(function(){var e=km(this),t=e.target,i=e.kind,n=e.index++;return!t||n>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==i?{value:n,done:!1}:"values"==i?{value:t[n],done:!1}:{value:[n,t[n]],done:!1}}),"values"),Fm=Ym.Arguments=Ym.Array;if(fm("keys"),fm("values"),fm("entries"),Um&&"values"!==Fm.name)try{Nm(Fm,"name",{value:"values"})}catch(e){}var Am=o,xm={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},Bm=cm,wm=Tm,zm=qt,Pm=Ze,Qm=Pm("iterator"),jm=Pm("toStringTag"),Mm=wm.values,Em=function(e,t){if(e){if(e[Qm]!==Mm)try{zm(e,Qm,Mm)}catch(t){e[Qm]=Mm}if(e[jm]||zm(e,jm,t),xm[t])for(var i in wm)if(e[i]!==wm[i])try{zm(e,i,wm[i])}catch(t){e[i]=wm[i]}}};for(var Om in xm)Em(Am[Om]&&Am[Om].prototype,Om);Em(Bm,"DOMTokenList");var Dm,_m,qm,$m,ep=h([].slice),tp=TypeError,ip=function(e,t){if(e<t)throw tp("Not enough arguments");return e},np=/(?:ipad|iphone|ipod).*applewebkit/i.test(P),lp="process"==Jt(o.process),op=o,cp=$d,ap=Ql,dp=A,sp=V,rp=a,up=Gl,Zp=ep,bp=Xe,hp=ip,mp=np,pp=lp,Ip=op.setImmediate,Gp=op.clearImmediate,gp=op.process,yp=op.Dispatch,Xp=op.Function,Vp=op.MessageChannel,Wp=op.String,Cp=0,Rp={},Sp="onreadystatechange";try{Dm=op.location}catch(e){}var vp=function(e){if(sp(Rp,e)){var t=Rp[e];delete Rp[e],t()}},fp=function(e){return function(){vp(e)}},Yp=function(e){vp(e.data)},Kp=function(e){op.postMessage(Wp(e),Dm.protocol+"//"+Dm.host)};Ip&&Gp||(Ip=function(e){hp(arguments.length,1);var t=dp(e)?e:Xp(e),i=Zp(arguments,1);return Rp[++Cp]=function(){cp(t,void 0,i)},_m(Cp),Cp},Gp=function(e){delete Rp[e]},pp?_m=function(e){gp.nextTick(fp(e))}:yp&&yp.now?_m=function(e){yp.now(fp(e))}:Vp&&!mp?($m=(qm=new Vp).port2,qm.port1.onmessage=Yp,_m=ap($m.postMessage,$m)):op.addEventListener&&dp(op.postMessage)&&!op.importScripts&&Dm&&"file:"!==Dm.protocol&&!rp(Kp)?(_m=Kp,op.addEventListener("message",Yp,!1)):_m=Sp in bp("script")?function(e){up.appendChild(bp("script")).onreadystatechange=function(){up.removeChild(this),vp(e)}}:function(e){setTimeout(fp(e),0)});var Np={set:Ip,clear:Gp},Jp=Np.clear;cl({global:!0,bind:!0,enumerable:!0,forced:o.clearImmediate!==Jp},{clearImmediate:Jp});var Up=Np.set;cl({global:!0,bind:!0,enumerable:!0,forced:o.setImmediate!==Up},{setImmediate:Up});var Lp=Ja.charAt,Hp=ma,kp=Ai,Tp=Sm,Fp="String Iterator",Ap=kp.set,xp=kp.getterFor(Fp);Tp(String,"String",(function(e){Ap(this,{type:Fp,string:Hp(e),index:0})}),(function(){var e,t=xp(this),i=t.string,n=t.index;return n>=i.length?{value:void 0,done:!0}:(e=Lp(i,n),t.index+=e.length,{value:e,done:!1})}));var Bp=a,wp=Ze("iterator"),zp=!Bp((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,i="";return e.pathname="c%20d",t.forEach((function(e,n){t.delete("b"),i+=n+e})),!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[wp]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==i||"x"!==new URL("http://x",void 0).host})),Pp=me,Qp=h,jp=Ne,Mp=a,Ep=rl,Op=Un,Dp=Ct,_p=g,qp=Tt,$p=Object.assign,eI=Object.defineProperty,tI=Qp([].concat),iI=!$p||Mp((function(){if(Pp&&1!==$p({b:1},$p(eI({},"a",{enumerable:!0,get:function(){eI(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},i=Symbol(),n="abcdefghijklmnopqrst";return e[i]=7,n.split("").forEach((function(e){t[e]=e})),7!=$p({},e)[i]||Ep($p({},t)).join("")!=n}))?function(e,t){for(var i=_p(e),n=arguments.length,l=1,o=Op.f,c=Dp.f;n>l;)for(var a,d=qp(arguments[l++]),s=o?tI(Ep(d),o(d)):Ep(d),r=s.length,u=0;r>u;)a=s[u++],Pp&&!jp(c,d,a)||(i[a]=d[a]);return i}:$p,nI=fe,lI=Xo,oI=Ql,cI=Ne,aI=g,dI=function(e,t,i,n){try{return n?t(nI(i)[0],i[1]):t(i)}catch(t){lI(e,"throw",t)}},sI=Dl,rI=ec,uI=Gn,ZI=hu,bI=Io,hI=ro,mI=Array,pI=h,II=2147483647,GI=/[^\0-\u007E]/,gI=/[.\u3002\uFF0E\uFF61]/g,yI="Overflow: input needs wider integers to process",XI=RangeError,VI=pI(gI.exec),WI=Math.floor,CI=String.fromCharCode,RI=pI("".charCodeAt),SI=pI([].join),vI=pI([].push),fI=pI("".replace),YI=pI("".split),KI=pI("".toLowerCase),NI=function(e){return e+22+75*(e<26)},JI=function(e,t,i){var n=0;for(e=i?WI(e/700):e>>1,e+=WI(e/t);e>455;)e=WI(e/35),n+=36;return WI(n+36*e/(e+38))},UI=function(e){var t=[];e=function(e){for(var t=[],i=0,n=e.length;i<n;){var l=RI(e,i++);if(l>=55296&&l<=56319&&i<n){var o=RI(e,i++);56320==(64512&o)?vI(t,((1023&l)<<10)+(1023&o)+65536):(vI(t,l),i--)}else vI(t,l)}return t}(e);var i,n,l=e.length,o=128,c=0,a=72;for(i=0;i<e.length;i++)(n=e[i])<128&&vI(t,CI(n));var d=t.length,s=d;for(d&&vI(t,"-");s<l;){var r=II;for(i=0;i<e.length;i++)(n=e[i])>=o&&n<r&&(r=n);var u=s+1;if(r-o>WI((II-c)/u))throw XI(yI);for(c+=(r-o)*u,o=r,i=0;i<e.length;i++){if((n=e[i])<o&&++c>II)throw XI(yI);if(n==o){for(var Z=c,b=36;;){var h=b<=a?1:b>=a+26?26:b-a;if(Z<h)break;var m=Z-h,p=36-h;vI(t,CI(NI(h+m%p))),Z=WI(m/p),b+=36}vI(t,CI(NI(Z))),a=JI(c,u,s==d),c=0,s++}}c++,o++}return SI(t,"")},LI=cl,HI=o,kI=Ne,TI=h,FI=me,AI=zp,xI=nn,BI=jr,wI=oa,zI=Za,PI=Ai,QI=Or,jI=A,MI=V,EI=Ql,OI=lo,DI=fe,_I=Ie,qI=ma,$I=Kl,eG=ft,tG=Io,iG=ro,nG=ip,lG=Fh,oG=Ze("iterator"),cG="URLSearchParams",aG="URLSearchParamsIterator",dG=PI.set,sG=PI.getterFor(cG),rG=PI.getterFor(aG),uG=Object.getOwnPropertyDescriptor,ZG=function(e){if(!FI)return HI[e];var t=uG(HI,e);return t&&t.value},bG=ZG("fetch"),hG=ZG("Request"),mG=ZG("Headers"),pG=hG&&hG.prototype,IG=mG&&mG.prototype,GG=HI.RegExp,gG=HI.TypeError,yG=HI.decodeURIComponent,XG=HI.encodeURIComponent,VG=TI("".charAt),WG=TI([].join),CG=TI([].push),RG=TI("".replace),SG=TI([].shift),vG=TI([].splice),fG=TI("".split),YG=TI("".slice),KG=/\+/g,NG=Array(4),JG=function(e){return NG[e-1]||(NG[e-1]=GG("((?:%[\\da-f]{2}){"+e+"})","gi"))},UG=function(e){try{return yG(e)}catch(t){return e}},LG=function(e){var t=RG(e,KG," "),i=4;try{return yG(t)}catch(e){for(;i;)t=RG(t,JG(i--),UG);return t}},HG=/[!'()~]|%20/g,kG={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},TG=function(e){return kG[e]},FG=function(e){return RG(XG(e),HG,TG)},AG=zI((function(e,t){dG(this,{type:aG,iterator:tG(sG(e).entries),kind:t})}),"Iterator",(function(){var e=rG(this),t=e.kind,i=e.iterator.next(),n=i.value;return i.done||(i.value="keys"===t?n.key:"values"===t?n.value:[n.key,n.value]),i}),!0),xG=function(e){this.entries=[],this.url=null,void 0!==e&&(_I(e)?this.parseObject(e):this.parseQuery("string"==typeof e?"?"===VG(e,0)?YG(e,1):e:qI(e)))};xG.prototype={type:cG,bindURL:function(e){this.url=e,this.update()},parseObject:function(e){var t,i,n,l,o,c,a,d=iG(e);if(d)for(i=(t=tG(e,d)).next;!(n=kI(i,t)).done;){if(o=(l=tG(DI(n.value))).next,(c=kI(o,l)).done||(a=kI(o,l)).done||!kI(o,l).done)throw gG("Expected sequence with length 2");CG(this.entries,{key:qI(c.value),value:qI(a.value)})}else for(var s in e)MI(e,s)&&CG(this.entries,{key:s,value:qI(e[s])})},parseQuery:function(e){if(e)for(var t,i,n=fG(e,"&"),l=0;l<n.length;)(t=n[l++]).length&&(i=fG(t,"="),CG(this.entries,{key:LG(SG(i)),value:LG(WG(i,"="))}))},serialize:function(){for(var e,t=this.entries,i=[],n=0;n<t.length;)e=t[n++],CG(i,FG(e.key)+"="+FG(e.value));return WG(i,"&")},update:function(){this.entries.length=0,this.parseQuery(this.url.query)},updateURL:function(){this.url&&this.url.update()}};var BG=function(){QI(this,wG);var e=arguments.length>0?arguments[0]:void 0;dG(this,new xG(e))},wG=BG.prototype;if(BI(wG,{append:function(e,t){nG(arguments.length,2);var i=sG(this);CG(i.entries,{key:qI(e),value:qI(t)}),i.updateURL()},delete:function(e){nG(arguments.length,1);for(var t=sG(this),i=t.entries,n=qI(e),l=0;l<i.length;)i[l].key===n?vG(i,l,1):l++;t.updateURL()},get:function(e){nG(arguments.length,1);for(var t=sG(this).entries,i=qI(e),n=0;n<t.length;n++)if(t[n].key===i)return t[n].value;return null},getAll:function(e){nG(arguments.length,1);for(var t=sG(this).entries,i=qI(e),n=[],l=0;l<t.length;l++)t[l].key===i&&CG(n,t[l].value);return n},has:function(e){nG(arguments.length,1);for(var t=sG(this).entries,i=qI(e),n=0;n<t.length;)if(t[n++].key===i)return!0;return!1},set:function(e,t){nG(arguments.length,1);for(var i,n=sG(this),l=n.entries,o=!1,c=qI(e),a=qI(t),d=0;d<l.length;d++)(i=l[d]).key===c&&(o?vG(l,d--,1):(o=!0,i.value=a));o||CG(l,{key:c,value:a}),n.updateURL()},sort:function(){var e=sG(this);lG(e.entries,(function(e,t){return e.key>t.key?1:-1})),e.updateURL()},forEach:function(e){for(var t,i=sG(this).entries,n=EI(e,arguments.length>1?arguments[1]:void 0),l=0;l<i.length;)n((t=i[l++]).value,t.key,this)},keys:function(){return new AG(this,"keys")},values:function(){return new AG(this,"values")},entries:function(){return new AG(this,"entries")}},{enumerable:!0}),xI(wG,oG,wG.entries,{name:"entries"}),xI(wG,"toString",(function(){return sG(this).serialize()}),{enumerable:!0}),wI(BG,cG),LI({global:!0,constructor:!0,forced:!AI},{URLSearchParams:BG}),!AI&&jI(mG)){var zG=TI(IG.has),PG=TI(IG.set),QG=function(e){if(_I(e)){var t,i=e.body;if(OI(i)===cG)return t=e.headers?new mG(e.headers):new mG,zG(t,"content-type")||PG(t,"content-type","application/x-www-form-urlencoded;charset=UTF-8"),$I(e,{body:eG(0,qI(i)),headers:eG(0,t)})}return e};if(jI(bG)&&LI({global:!0,enumerable:!0,dontCallGetSet:!0,forced:!0},{fetch:function(e){return bG(e,arguments.length>1?QG(arguments[1]):{})}}),jI(hG)){var jG=function(e){return QI(this,pG),new hG(e,arguments.length>1?QG(arguments[1]):{})};pG.constructor=jG,jG.prototype=pG,LI({global:!0,constructor:!0,dontCallGetSet:!0,forced:!0},{Request:jG})}}var MG,EG=cl,OG=me,DG=zp,_G=o,qG=Ql,$G=h,eg=nn,tg=Cc,ig=Or,ng=V,lg=iI,og=function(e){var t=aI(e),i=rI(this),n=arguments.length,l=n>1?arguments[1]:void 0,o=void 0!==l;o&&(l=oI(l,n>2?arguments[2]:void 0));var c,a,d,s,r,u,Z=hI(t),b=0;if(!Z||this===mI&&sI(Z))for(c=uI(t),a=i?new this(c):mI(c);c>b;b++)u=o?l(t[b],b):t[b],ZI(a,b,u);else for(r=(s=bI(t,Z)).next,a=i?new this:[];!(d=cI(r,s)).done;b++)u=o?dI(s,l,[d.value,b],!0):d.value,ZI(a,b,u);return a.length=b,a},cg=yu,ag=Ja.codeAt,dg=function(e){var t,i,n=[],l=YI(fI(KI(e),gI,"."),".");for(t=0;t<l.length;t++)i=l[t],vI(n,VI(GI,i)?"xn--"+UI(i):i);return SI(n,".")},sg=ma,rg=oa,ug=ip,Zg={URLSearchParams:BG,getState:sG},bg=Ai,hg=bg.set,mg=bg.getterFor("URL"),pg=Zg.URLSearchParams,Ig=Zg.getState,Gg=_G.URL,gg=_G.TypeError,yg=_G.parseInt,Xg=Math.floor,Vg=Math.pow,Wg=$G("".charAt),Cg=$G(/./.exec),Rg=$G([].join),Sg=$G(1..toString),vg=$G([].pop),fg=$G([].push),Yg=$G("".replace),Kg=$G([].shift),Ng=$G("".split),Jg=$G("".slice),Ug=$G("".toLowerCase),Lg=$G([].unshift),Hg="Invalid scheme",kg="Invalid host",Tg="Invalid port",Fg=/[a-z]/i,Ag=/[\d+-.a-z]/i,xg=/\d/,Bg=/^0x/i,wg=/^[0-7]+$/,zg=/^\d+$/,Pg=/^[\da-f]+$/i,Qg=/[\0\t\n\r #%/:<>?@[\\\]^|]/,jg=/[\0\t\n\r #/:<>?@[\\\]^|]/,Mg=/^[\u0000-\u0020]+|[\u0000-\u0020]+$/g,Eg=/[\t\n\r]/g,Og=function(e){var t,i,n,l;if("number"==typeof e){for(t=[],i=0;i<4;i++)Lg(t,e%256),e=Xg(e/256);return Rg(t,".")}if("object"==typeof e){for(t="",n=function(e){for(var t=null,i=1,n=null,l=0,o=0;o<8;o++)0!==e[o]?(l>i&&(t=n,i=l),n=null,l=0):(null===n&&(n=o),++l);return l>i&&(t=n,i=l),t}(e),i=0;i<8;i++)l&&0===e[i]||(l&&(l=!1),n===i?(t+=i?":":"::",l=!0):(t+=Sg(e[i],16),i<7&&(t+=":")));return"["+t+"]"}return e},Dg={},_g=lg({},Dg,{" ":1,'"':1,"<":1,">":1,"`":1}),qg=lg({},_g,{"#":1,"?":1,"{":1,"}":1}),$g=lg({},qg,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),ey=function(e,t){var i=ag(e,0);return i>32&&i<127&&!ng(t,e)?e:encodeURIComponent(e)},ty={ftp:21,file:null,http:80,https:443,ws:80,wss:443},iy=function(e,t){var i;return 2==e.length&&Cg(Fg,Wg(e,0))&&(":"==(i=Wg(e,1))||!t&&"|"==i)},ny=function(e){var t;return e.length>1&&iy(Jg(e,0,2))&&(2==e.length||"/"===(t=Wg(e,2))||"\\"===t||"?"===t||"#"===t)},ly=function(e){return"."===e||"%2e"===Ug(e)},oy={},cy={},ay={},dy={},sy={},ry={},uy={},Zy={},by={},hy={},my={},py={},Iy={},Gy={},gy={},yy={},Xy={},Vy={},Wy={},Cy={},Ry={},Sy=function(e,t,i){var n,l,o,c=sg(e);if(t){if(l=this.parse(c))throw gg(l);this.searchParams=null}else{if(void 0!==i&&(n=new Sy(i,!0)),l=this.parse(c,null,n))throw gg(l);(o=Ig(new pg)).bindURL(this),this.searchParams=o}};Sy.prototype={type:"URL",parse:function(e,t,i){var n,l,o,c,a,d=this,s=t||oy,r=0,u="",Z=!1,b=!1,h=!1;for(e=sg(e),t||(d.scheme="",d.username="",d.password="",d.host=null,d.port=null,d.path=[],d.query=null,d.fragment=null,d.cannotBeABaseURL=!1,e=Yg(e,Mg,"")),e=Yg(e,Eg,""),n=og(e);r<=n.length;){switch(l=n[r],s){case oy:if(!l||!Cg(Fg,l)){if(t)return Hg;s=ay;continue}u+=Ug(l),s=cy;break;case cy:if(l&&(Cg(Ag,l)||"+"==l||"-"==l||"."==l))u+=Ug(l);else{if(":"!=l){if(t)return Hg;u="",s=ay,r=0;continue}if(t&&(d.isSpecial()!=ng(ty,u)||"file"==u&&(d.includesCredentials()||null!==d.port)||"file"==d.scheme&&!d.host))return;if(d.scheme=u,t)return void(d.isSpecial()&&ty[d.scheme]==d.port&&(d.port=null));u="","file"==d.scheme?s=Gy:d.isSpecial()&&i&&i.scheme==d.scheme?s=dy:d.isSpecial()?s=Zy:"/"==n[r+1]?(s=sy,r++):(d.cannotBeABaseURL=!0,fg(d.path,""),s=Wy)}break;case ay:if(!i||i.cannotBeABaseURL&&"#"!=l)return Hg;if(i.cannotBeABaseURL&&"#"==l){d.scheme=i.scheme,d.path=cg(i.path),d.query=i.query,d.fragment="",d.cannotBeABaseURL=!0,s=Ry;break}s="file"==i.scheme?Gy:ry;continue;case dy:if("/"!=l||"/"!=n[r+1]){s=ry;continue}s=by,r++;break;case sy:if("/"==l){s=hy;break}s=Vy;continue;case ry:if(d.scheme=i.scheme,l==MG)d.username=i.username,d.password=i.password,d.host=i.host,d.port=i.port,d.path=cg(i.path),d.query=i.query;else if("/"==l||"\\"==l&&d.isSpecial())s=uy;else if("?"==l)d.username=i.username,d.password=i.password,d.host=i.host,d.port=i.port,d.path=cg(i.path),d.query="",s=Cy;else{if("#"!=l){d.username=i.username,d.password=i.password,d.host=i.host,d.port=i.port,d.path=cg(i.path),d.path.length--,s=Vy;continue}d.username=i.username,d.password=i.password,d.host=i.host,d.port=i.port,d.path=cg(i.path),d.query=i.query,d.fragment="",s=Ry}break;case uy:if(!d.isSpecial()||"/"!=l&&"\\"!=l){if("/"!=l){d.username=i.username,d.password=i.password,d.host=i.host,d.port=i.port,s=Vy;continue}s=hy}else s=by;break;case Zy:if(s=by,"/"!=l||"/"!=Wg(u,r+1))continue;r++;break;case by:if("/"!=l&&"\\"!=l){s=hy;continue}break;case hy:if("@"==l){Z&&(u="%40"+u),Z=!0,o=og(u);for(var m=0;m<o.length;m++){var p=o[m];if(":"!=p||h){var I=ey(p,$g);h?d.password+=I:d.username+=I}else h=!0}u=""}else if(l==MG||"/"==l||"?"==l||"#"==l||"\\"==l&&d.isSpecial()){if(Z&&""==u)return"Invalid authority";r-=og(u).length+1,u="",s=my}else u+=l;break;case my:case py:if(t&&"file"==d.scheme){s=yy;continue}if(":"!=l||b){if(l==MG||"/"==l||"?"==l||"#"==l||"\\"==l&&d.isSpecial()){if(d.isSpecial()&&""==u)return kg;if(t&&""==u&&(d.includesCredentials()||null!==d.port))return;if(c=d.parseHost(u))return c;if(u="",s=Xy,t)return;continue}"["==l?b=!0:"]"==l&&(b=!1),u+=l}else{if(""==u)return kg;if(c=d.parseHost(u))return c;if(u="",s=Iy,t==py)return}break;case Iy:if(!Cg(xg,l)){if(l==MG||"/"==l||"?"==l||"#"==l||"\\"==l&&d.isSpecial()||t){if(""!=u){var G=yg(u,10);if(G>65535)return Tg;d.port=d.isSpecial()&&G===ty[d.scheme]?null:G,u=""}if(t)return;s=Xy;continue}return Tg}u+=l;break;case Gy:if(d.scheme="file","/"==l||"\\"==l)s=gy;else{if(!i||"file"!=i.scheme){s=Vy;continue}if(l==MG)d.host=i.host,d.path=cg(i.path),d.query=i.query;else if("?"==l)d.host=i.host,d.path=cg(i.path),d.query="",s=Cy;else{if("#"!=l){ny(Rg(cg(n,r),""))||(d.host=i.host,d.path=cg(i.path),d.shortenPath()),s=Vy;continue}d.host=i.host,d.path=cg(i.path),d.query=i.query,d.fragment="",s=Ry}}break;case gy:if("/"==l||"\\"==l){s=yy;break}i&&"file"==i.scheme&&!ny(Rg(cg(n,r),""))&&(iy(i.path[0],!0)?fg(d.path,i.path[0]):d.host=i.host),s=Vy;continue;case yy:if(l==MG||"/"==l||"\\"==l||"?"==l||"#"==l){if(!t&&iy(u))s=Vy;else if(""==u){if(d.host="",t)return;s=Xy}else{if(c=d.parseHost(u))return c;if("localhost"==d.host&&(d.host=""),t)return;u="",s=Xy}continue}u+=l;break;case Xy:if(d.isSpecial()){if(s=Vy,"/"!=l&&"\\"!=l)continue}else if(t||"?"!=l)if(t||"#"!=l){if(l!=MG&&(s=Vy,"/"!=l))continue}else d.fragment="",s=Ry;else d.query="",s=Cy;break;case Vy:if(l==MG||"/"==l||"\\"==l&&d.isSpecial()||!t&&("?"==l||"#"==l)){if(".."===(a=Ug(a=u))||"%2e."===a||".%2e"===a||"%2e%2e"===a?(d.shortenPath(),"/"==l||"\\"==l&&d.isSpecial()||fg(d.path,"")):ly(u)?"/"==l||"\\"==l&&d.isSpecial()||fg(d.path,""):("file"==d.scheme&&!d.path.length&&iy(u)&&(d.host&&(d.host=""),u=Wg(u,0)+":"),fg(d.path,u)),u="","file"==d.scheme&&(l==MG||"?"==l||"#"==l))for(;d.path.length>1&&""===d.path[0];)Kg(d.path);"?"==l?(d.query="",s=Cy):"#"==l&&(d.fragment="",s=Ry)}else u+=ey(l,qg);break;case Wy:"?"==l?(d.query="",s=Cy):"#"==l?(d.fragment="",s=Ry):l!=MG&&(d.path[0]+=ey(l,Dg));break;case Cy:t||"#"!=l?l!=MG&&("'"==l&&d.isSpecial()?d.query+="%27":d.query+="#"==l?"%23":ey(l,Dg)):(d.fragment="",s=Ry);break;case Ry:l!=MG&&(d.fragment+=ey(l,_g))}r++}},parseHost:function(e){var t,i,n;if("["==Wg(e,0)){if("]"!=Wg(e,e.length-1))return kg;if(t=function(e){var t,i,n,l,o,c,a,d=[0,0,0,0,0,0,0,0],s=0,r=null,u=0,Z=function(){return Wg(e,u)};if(":"==Z()){if(":"!=Wg(e,1))return;u+=2,r=++s}for(;Z();){if(8==s)return;if(":"!=Z()){for(t=i=0;i<4&&Cg(Pg,Z());)t=16*t+yg(Z(),16),u++,i++;if("."==Z()){if(0==i)return;if(u-=i,s>6)return;for(n=0;Z();){if(l=null,n>0){if(!("."==Z()&&n<4))return;u++}if(!Cg(xg,Z()))return;for(;Cg(xg,Z());){if(o=yg(Z(),10),null===l)l=o;else{if(0==l)return;l=10*l+o}if(l>255)return;u++}d[s]=256*d[s]+l,2!=++n&&4!=n||s++}if(4!=n)return;break}if(":"==Z()){if(u++,!Z())return}else if(Z())return;d[s++]=t}else{if(null!==r)return;u++,r=++s}}if(null!==r)for(c=s-r,s=7;0!=s&&c>0;)a=d[s],d[s--]=d[r+c-1],d[r+--c]=a;else if(8!=s)return;return d}(Jg(e,1,-1)),!t)return kg;this.host=t}else if(this.isSpecial()){if(e=dg(e),Cg(Qg,e))return kg;if(t=function(e){var t,i,n,l,o,c,a,d=Ng(e,".");if(d.length&&""==d[d.length-1]&&d.length--,(t=d.length)>4)return e;for(i=[],n=0;n<t;n++){if(""==(l=d[n]))return e;if(o=10,l.length>1&&"0"==Wg(l,0)&&(o=Cg(Bg,l)?16:8,l=Jg(l,8==o?1:2)),""===l)c=0;else{if(!Cg(10==o?zg:8==o?wg:Pg,l))return e;c=yg(l,o)}fg(i,c)}for(n=0;n<t;n++)if(c=i[n],n==t-1){if(c>=Vg(256,5-t))return null}else if(c>255)return null;for(a=vg(i),n=0;n<i.length;n++)a+=i[n]*Vg(256,3-n);return a}(e),null===t)return kg;this.host=t}else{if(Cg(jg,e))return kg;for(t="",i=og(e),n=0;n<i.length;n++)t+=ey(i[n],Dg);this.host=t}},cannotHaveUsernamePasswordPort:function(){return!this.host||this.cannotBeABaseURL||"file"==this.scheme},includesCredentials:function(){return""!=this.username||""!=this.password},isSpecial:function(){return ng(ty,this.scheme)},shortenPath:function(){var e=this.path,t=e.length;!t||"file"==this.scheme&&1==t&&iy(e[0],!0)||e.length--},serialize:function(){var e=this,t=e.scheme,i=e.username,n=e.password,l=e.host,o=e.port,c=e.path,a=e.query,d=e.fragment,s=t+":";return null!==l?(s+="//",e.includesCredentials()&&(s+=i+(n?":"+n:"")+"@"),s+=Og(l),null!==o&&(s+=":"+o)):"file"==t&&(s+="//"),s+=e.cannotBeABaseURL?c[0]:c.length?"/"+Rg(c,"/"):"",null!==a&&(s+="?"+a),null!==d&&(s+="#"+d),s},setHref:function(e){var t=this.parse(e);if(t)throw gg(t);this.searchParams.update()},getOrigin:function(){var e=this.scheme,t=this.port;if("blob"==e)try{return new vy(e.path[0]).origin}catch(e){return"null"}return"file"!=e&&this.isSpecial()?e+"://"+Og(this.host)+(null!==t?":"+t:""):"null"},getProtocol:function(){return this.scheme+":"},setProtocol:function(e){this.parse(sg(e)+":",oy)},getUsername:function(){return this.username},setUsername:function(e){var t=og(sg(e));if(!this.cannotHaveUsernamePasswordPort()){this.username="";for(var i=0;i<t.length;i++)this.username+=ey(t[i],$g)}},getPassword:function(){return this.password},setPassword:function(e){var t=og(sg(e));if(!this.cannotHaveUsernamePasswordPort()){this.password="";for(var i=0;i<t.length;i++)this.password+=ey(t[i],$g)}},getHost:function(){var e=this.host,t=this.port;return null===e?"":null===t?Og(e):Og(e)+":"+t},setHost:function(e){this.cannotBeABaseURL||this.parse(e,my)},getHostname:function(){var e=this.host;return null===e?"":Og(e)},setHostname:function(e){this.cannotBeABaseURL||this.parse(e,py)},getPort:function(){var e=this.port;return null===e?"":sg(e)},setPort:function(e){this.cannotHaveUsernamePasswordPort()||(""==(e=sg(e))?this.port=null:this.parse(e,Iy))},getPathname:function(){var e=this.path;return this.cannotBeABaseURL?e[0]:e.length?"/"+Rg(e,"/"):""},setPathname:function(e){this.cannotBeABaseURL||(this.path=[],this.parse(e,Xy))},getSearch:function(){var e=this.query;return e?"?"+e:""},setSearch:function(e){""==(e=sg(e))?this.query=null:("?"==Wg(e,0)&&(e=Jg(e,1)),this.query="",this.parse(e,Cy)),this.searchParams.update()},getSearchParams:function(){return this.searchParams.facade},getHash:function(){var e=this.fragment;return e?"#"+e:""},setHash:function(e){""!=(e=sg(e))?("#"==Wg(e,0)&&(e=Jg(e,1)),this.fragment="",this.parse(e,Ry)):this.fragment=null},update:function(){this.query=this.searchParams.serialize()||null}};var vy=function(e){var t=ig(this,fy),i=ug(arguments.length,1)>1?arguments[1]:void 0,n=hg(t,new Sy(e,!1,i));OG||(t.href=n.serialize(),t.origin=n.getOrigin(),t.protocol=n.getProtocol(),t.username=n.getUsername(),t.password=n.getPassword(),t.host=n.getHost(),t.hostname=n.getHostname(),t.port=n.getPort(),t.pathname=n.getPathname(),t.search=n.getSearch(),t.searchParams=n.getSearchParams(),t.hash=n.getHash())},fy=vy.prototype,Yy=function(e,t){return{get:function(){return mg(this)[e]()},set:t&&function(e){return mg(this)[t](e)},configurable:!0,enumerable:!0}};if(OG&&(tg(fy,"href",Yy("serialize","setHref")),tg(fy,"origin",Yy("getOrigin")),tg(fy,"protocol",Yy("getProtocol","setProtocol")),tg(fy,"username",Yy("getUsername","setUsername")),tg(fy,"password",Yy("getPassword","setPassword")),tg(fy,"host",Yy("getHost","setHost")),tg(fy,"hostname",Yy("getHostname","setHostname")),tg(fy,"port",Yy("getPort","setPort")),tg(fy,"pathname",Yy("getPathname","setPathname")),tg(fy,"search",Yy("getSearch","setSearch")),tg(fy,"searchParams",Yy("getSearchParams")),tg(fy,"hash",Yy("getHash","setHash"))),eg(fy,"toJSON",(function(){return mg(this).serialize()}),{enumerable:!0}),eg(fy,"toString",(function(){return mg(this).serialize()}),{enumerable:!0}),Gg){var Ky=Gg.createObjectURL,Ny=Gg.revokeObjectURL;Ky&&eg(vy,"createObjectURL",qG(Ky,Gg)),Ny&&eg(vy,"revokeObjectURL",qG(Ny,Gg))}rg(vy,"URL"),EG({global:!0,constructor:!0,forced:!DG,sham:!OG},{URL:vy});var Jy=Ne;function Uy(e,t,i,n){return new(i||(i=Promise))((function(l,o){function c(e){try{d(n.next(e))}catch(e){o(e)}}function a(e){try{d(n.throw(e))}catch(e){o(e)}}function d(e){var t;e.done?l(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(c,a)}d((n=n.apply(e,t||[])).next())}))}function Ly(e,t,i,n){return new(i||(i=Promise))((function(l,o){function c(e){try{d(n.next(e))}catch(e){o(e)}}function a(e){try{d(n.throw(e))}catch(e){o(e)}}function d(e){var t;e.done?l(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(c,a)}d((n=n.apply(e,t||[])).next())}))}cl({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return Jy(URL.prototype.toString,this)}}),e.ResponseMode=void 0,function(e){e.formPost="form_post",e.query="query",e.direct="direct"}(e.ResponseMode||(e.ResponseMode={}));e.Stores=void 0,function(e){e.ConfigData="config_data",e.OIDCProviderMetaData="oidc_provider_meta_data",e.SessionData="session_data",e.TemporaryData="temporary_data"}(e.Stores||(e.Stores={}));const Hy="refresh_token_timer",ky=["RS256","RS512","RS384","PS256"],Ty="code",Fy="session_state",Ay="sign_out_url",xy="sign_out_success",By="state";var wy;!function(e){e.Include="include",e.SameOrigin="same-origin",e.Omit="omit"}(wy||(wy={}));class zy{constructor(e,t,i){this.message=i,this.name=t,this.code=e,Object.setPrototypeOf(this,new.target.prototype)}}class Py{constructor(){}static filterClaimsFromIDTokenPayload(e){const t=Object.assign({},e);null==t||delete t.iss,null==t||delete t.aud,null==t||delete t.exp,null==t||delete t.iat,null==t||delete t.acr,null==t||delete t.amr,null==t||delete t.azp,null==t||delete t.auth_time,null==t||delete t.nonce,null==t||delete t.c_hash,null==t||delete t.at_hash,null==t||delete t.nbf,null==t||delete t.isk,null==t||delete t.sid;const i={};return Object.entries(t).forEach((e=>{let[t,n]=e;const l=t.split("_").map(((e,t)=>0===t?e:[e[0].toUpperCase(),...e.slice(1)].join(""))).join("");i[l]=n})),i}static getTokenRequestHeaders(){return{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded"}}static generateStateParamForRequestCorrelation(e,t){const i=parseInt(e.split("#")[1]);return t?"".concat(t,"_request_").concat(i):"request_".concat(i)}static extractPKCEKeyFromStateParam(e){return"pkce_code_verifier#".concat(parseInt(e.split("request_")[1]))}}Py.getTenantDomainFromIdTokenPayload=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"@";const i=e.sub.split(t);return i.length>2?i[i.length-1]:""};class Qy{constructor(e,t){this._dataLayer=e,this._config=()=>Ly(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>Ly(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()})),this._cryptoHelper=t}resolveEndpoints(e){return Ly(this,void 0,void 0,(function*(){const t={},i=yield this._config();return i.endpoints&&Object.keys(i.endpoints).forEach((e=>{const n=e.replace(/[A-Z]/g,(e=>"_".concat(e.toLowerCase())));t[n]=(null==i?void 0:i.endpoints)?i.endpoints[e]:""})),Object.assign(Object.assign({},e),t)}))}resolveEndpointsExplicitly(){return Ly(this,void 0,void 0,(function*(){const e={},t=yield this._config();if(!t.endpoints||!["authorization_endpoint","end_session_endpoint","jwks_uri","check_session_iframe","revocation_endpoint","token_endpoint","issuer","userinfo_endpoint"].every((e=>!!t.endpoints&&Object.keys(t.endpoints).some((t=>t.replace(/[A-Z]/g,(e=>"_".concat(e.toLowerCase())))===e)))))throw new zy("JS-AUTH_HELPER-REE-NF01","Required endpoints missing","Some or all of the required endpoints are missing in the object passed to the `endpoints` attribute of the`AuthConfig` object.");return t.endpoints&&Object.keys(t.endpoints).forEach((i=>{const n=i.replace(/[A-Z]/g,(e=>"_".concat(e.toLowerCase())));e[n]=(null==t?void 0:t.endpoints)?t.endpoints[i]:""})),Object.assign({},e)}))}resolveEndpointsByBaseURL(){return Ly(this,void 0,void 0,(function*(){const e={},t=yield this._config(),i=t.baseUrl;if(!i)throw new zy("JS-AUTH_HELPER_REBO-NF01","Base URL not defined.","Base URL is not defined in AuthClient config.");t.endpoints&&Object.keys(t.endpoints).forEach((i=>{const n=i.replace(/[A-Z]/g,(e=>"_".concat(e.toLowerCase())));e[n]=(null==t?void 0:t.endpoints)?t.endpoints[i]:""}));const n={authorization_endpoint:"".concat(i).concat("/oauth2/authorize"),end_session_endpoint:"".concat(i).concat("/oidc/logout"),issuer:"".concat(i).concat("/oauth2/token"),jwks_uri:"".concat(i).concat("/oauth2/jwks"),check_session_iframe:"".concat(i).concat("/oidc/checksession"),revocation_endpoint:"".concat(i).concat("/oauth2/revoke"),token_endpoint:"".concat(i).concat("/oauth2/token"),userinfo_endpoint:"".concat(i).concat("/oauth2/userinfo")};return Object.assign(Object.assign({},n),e)}))}validateIdToken(e){var t;return Ly(this,void 0,void 0,(function*(){const i=(yield this._dataLayer.getOIDCProviderMetaData()).jwks_uri,n=yield this._config();if(!i||0===i.trim().length)throw new zy("JS_AUTH_HELPER-VIT-NF01","JWKS endpoint not found.","No JWKS endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the JWKS endpoint passed to the SDK is empty.");let l;try{l=yield fetch(i,{credentials:n.sendCookiesInRequests?wy.Include:wy.SameOrigin})}catch(i){throw new zy("JS-AUTH_HELPER-VIT-NE02","Request to jwks endpoint failed.",null!=i?i:"The request sent to get the jwks from the server failed.")}if(200!==l.status||!l.ok)throw new zy("JS-AUTH_HELPER-VIT-HE03","Invalid response status received for jwks request (".concat(l.statusText,")."),yield l.json());const o=(yield this._oidcProviderMetaData()).issuer,{keys:c}=yield l.json(),a=yield this._cryptoHelper.getJWKForTheIdToken(e.split(".")[0],c);return this._cryptoHelper.isValidIdToken(e,a,(yield this._config()).clientID,null!=o?o:"",this._cryptoHelper.decodeIDToken(e).sub,(yield this._config()).clockTolerance,null===(t=(yield this._config()).validateIDTokenIssuer)||void 0===t||t)}))}getAuthenticatedUserInfo(e){var t,i,n,l;const o=this._cryptoHelper.decodeIDToken(e),c=Py.getTenantDomainFromIdTokenPayload(o),a=null!==(t=null==o?void 0:o.username)&&void 0!==t?t:"",d=null!==(i=o.given_name)&&void 0!==i?i:"",s=null!==(n=o.family_name)&&void 0!==n?n:"",r=d&&s?"".concat(d," ").concat(s):d||s||"",u=null!==(l=o.preferred_username)&&void 0!==l?l:r;return Object.assign({displayName:u,tenantDomain:c,username:a},Py.filterClaimsFromIDTokenPayload(o))}replaceCustomGrantTemplateTags(e,t){var i;return Ly(this,void 0,void 0,(function*(){let n="openid";const l=yield this._config(),o=yield this._dataLayer.getSessionData(t);return l.scope&&l.scope.length>0&&(l.scope.includes("openid")||l.scope.push("openid"),n=l.scope.join(" ")),e.replace("{{token}}",o.access_token).replace("{{username}}",this.getAuthenticatedUserInfo(o.id_token).username).replace("{{scope}}",n).replace("{{clientID}}",l.clientID).replace("{{clientSecret}}",null!==(i=l.clientSecret)&&void 0!==i?i:"")}))}clearUserSessionData(e){return Ly(this,void 0,void 0,(function*(){yield this._dataLayer.removeTemporaryData(e),yield this._dataLayer.removeSessionData(e)}))}handleTokenResponse(e,t){return Ly(this,void 0,void 0,(function*(){if(200!==e.status||!e.ok)throw new zy("JS-AUTH_HELPER-HTR-NE01","Invalid response status received for token request (".concat(e.statusText,")."),yield e.json());const i=yield e.json();if(i.created_at=(new Date).getTime(),(yield this._config()).validateIDToken)return this.validateIdToken(i.id_token).then((()=>Ly(this,void 0,void 0,(function*(){yield this._dataLayer.setSessionData(i,t);const e={accessToken:i.access_token,createdAt:i.created_at,expiresIn:i.expires_in,idToken:i.id_token,refreshToken:i.refresh_token,scope:i.scope,tokenType:i.token_type};return Promise.resolve(e)}))));{const e={accessToken:i.access_token,createdAt:i.created_at,expiresIn:i.expires_in,idToken:i.id_token,refreshToken:i.refresh_token,scope:i.scope,tokenType:i.token_type};return yield this._dataLayer.setSessionData(i,t),Promise.resolve(e)}}))}generatePKCEKey(e){var t;return Ly(this,void 0,void 0,(function*(){const i=yield this._dataLayer.getTemporaryData(e),n=[];Object.keys(i).forEach((e=>{e.startsWith("pkce_code_verifier")&&n.push(e)}));const l=n.sort().pop();return"pkce_code_verifier#".concat(parseInt(null!==(t=null==l?void 0:l.split("#")[1])&&void 0!==t?t:"-1")+1)}))}}class jy{constructor(e){this._cryptoUtils=e}getCodeVerifier(){return this._cryptoUtils.base64URLEncode(this._cryptoUtils.generateRandomBytes(32))}getCodeChallenge(e){return this._cryptoUtils.base64URLEncode(this._cryptoUtils.hashSha256(e))}getJWKForTheIdToken(e,t){const i=JSON.parse(this._cryptoUtils.base64URLDecode(e));for(const e of t)if(i.kid===e.kid)return e;throw new zy("JS-CRYPTO_UTIL-GJFTIT-IV01","kid not found.","Failed to find the 'kid' specified in the id_token. 'kid' found in the header : "+i.kid+", Expected values: "+t.map((e=>e.kid)).join(", "))}isValidIdToken(e,t,i,n,l,o,c){return this._cryptoUtils.verifyJwt(e,t,ky,i,n,l,o,c).then((e=>e?Promise.resolve(!0):Promise.reject(new zy("JS-CRYPTO_HELPER-IVIT-IV01","Invalid ID token.","ID token validation returned false"))))}decodeIDToken(e){try{const t=this._cryptoUtils.base64URLDecode(e.split(".")[1]);return JSON.parse(t)}catch(e){throw new zy("JS-CRYPTO_UTIL-DIT-IV01","Decoding ID token failed.",e)}}}class My{constructor(e,t){this._cryptoUtils=t,this._cryptoHelper=new jy(t),this._authenticationHelper=new Qy(e,this._cryptoHelper),this._dataLayer=e,this._config=()=>Ly(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>Ly(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()}))}getAuthorizationURLParams(e,t){var i,n,l;return Ly(this,void 0,void 0,(function*(){const o=yield this._config(),c=new Map;c.set("response_type","code"),c.set("client_id",o.clientID),o.clientSecret&&o.clientSecret.trim().length>0&&c.set("client_secret",o.clientSecret);let a="openid";o.scope&&o.scope.length>0&&(o.scope.includes("openid")||o.scope.push("openid"),a=o.scope.join(" ")),c.set("scope",a),c.set("redirect_uri",o.signInRedirectURL),o.responseMode&&c.set("response_mode",o.responseMode);const d=yield this._authenticationHelper.generatePKCEKey(t);if(o.enablePKCE){const e=null===(i=this._cryptoHelper)||void 0===i?void 0:i.getCodeVerifier(),l=null===(n=this._cryptoHelper)||void 0===n?void 0:n.getCodeChallenge(e);yield this._dataLayer.setTemporaryDataParameter(d,e,t),c.set("code_challenge_method","S256"),c.set("code_challenge",l)}o.prompt&&c.set("prompt",o.prompt);const s=e;if(s)for(const[e,t]of Object.entries(s))""!=e&&""!=t&&"state"!==e&&c.set(e,t.toString());return c.set("state",Py.generateStateParamForRequestCorrelation(d,s?null===(l=s.state)||void 0===l?void 0:l.toString():"")),c}))}getAuthorizationURL(e,t){return Ly(this,void 0,void 0,(function*(){const i=yield this._dataLayer.getOIDCProviderMetaDataParameter("authorization_endpoint");if(!i||0===i.trim().length)throw new zy("JS-AUTH_CORE-GAU-NF01","No authorization endpoint found.","No authorization endpoint was found in the OIDC provider meta data from the well-known endpoint or the authorization endpoint passed to the SDK is empty.");const n=new URL(i),l=yield this.getAuthorizationURLParams(e,t);for(const[e,t]of l.entries())n.searchParams.append(e,t);return n.toString()}))}requestAccessToken(e,t,i,n,l){return Ly(this,void 0,void 0,(function*(){const o=(yield this._oidcProviderMetaData()).token_endpoint,c=yield this._config();if(!o||0===o.trim().length)throw new zy("JS-AUTH_CORE-RAT1-NF01","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty.");t&&(yield this._dataLayer.setSessionDataParameter("session_state",t,n));const a=new URLSearchParams;a.set("client_id",c.clientID),c.clientSecret&&c.clientSecret.trim().length>0&&a.set("client_secret",c.clientSecret);const d=e;let s;a.set("code",d),a.set("grant_type","authorization_code"),a.set("redirect_uri",c.signInRedirectURL),(null==l?void 0:l.params)&&Object.entries(l.params).forEach((e=>{let[t,i]=e;a.append(t,i)})),c.enablePKCE&&(a.set("code_verifier","".concat(yield this._dataLayer.getTemporaryDataParameter(Py.extractPKCEKeyFromStateParam(i),n))),yield this._dataLayer.removeTemporaryDataParameter(Py.extractPKCEKeyFromStateParam(i),n));try{s=yield fetch(o,{body:a,credentials:c.sendCookiesInRequests?wy.Include:wy.SameOrigin,headers:new Headers(Py.getTokenRequestHeaders()),method:"POST"})}catch(o){throw new zy("JS-AUTH_CORE-RAT1-NE02","Requesting access token failed",null!=o?o:"The request to get the access token from the server failed.")}if(!s.ok)throw new zy("JS-AUTH_CORE-RAT1-HE03","Requesting access token failed with ".concat(s.statusText),yield s.json());return yield this._authenticationHelper.handleTokenResponse(s,n)}))}refreshAccessToken(e){return Ly(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).token_endpoint,i=yield this._config(),n=yield this._dataLayer.getSessionData(e);if(!n.refresh_token)throw new zy("JS-AUTH_CORE-RAT2-NF01","No refresh token found.","There was no refresh token found. Asgardeo doesn't return a refresh token if the refresh token grant is not enabled.");if(!t||0===t.trim().length)throw new zy("JS-AUTH_CORE-RAT2-NF02","No refresh token endpoint found.","No refresh token endpoint was in the OIDC provider meta data returned by the well-known endpoint or the refresh token endpoint passed to the SDK is empty.");const l=[];let o;l.push("client_id=".concat(i.clientID)),l.push("refresh_token=".concat(n.refresh_token)),l.push("grant_type=refresh_token"),i.clientSecret&&i.clientSecret.trim().length>0&&l.push("client_secret=".concat(i.clientSecret));try{o=yield fetch(t,{body:l.join("&"),credentials:i.sendCookiesInRequests?wy.Include:wy.SameOrigin,headers:new Headers(Py.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new zy("JS-AUTH_CORE-RAT2-NR03","Refresh access token request failed.",null!=t?t:"The request to refresh the access token failed.")}if(!o.ok)throw new zy("JS-AUTH_CORE-RAT2-HE04","Refreshing access token failed with ".concat(o.statusText),yield o.json());return this._authenticationHelper.handleTokenResponse(o,e)}))}revokeAccessToken(e){return Ly(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).revocation_endpoint,i=yield this._config();if(!t||0===t.trim().length)throw new zy("JS-AUTH_CORE-RAT3-NF01","No revoke access token endpoint found.","No revoke access token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the revoke access token endpoint passed to the SDK is empty.");const n=[];let l;n.push("client_id=".concat(i.clientID)),n.push("token=".concat((yield this._dataLayer.getSessionData(e)).access_token)),n.push("token_type_hint=access_token");try{l=yield fetch(t,{body:n.join("&"),credentials:i.sendCookiesInRequests?wy.Include:wy.SameOrigin,headers:new Headers(Py.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new zy("JS-AUTH_CORE-RAT3-NE02","The request to revoke access token failed.",null!=t?t:"The request sent to revoke the access token failed.")}if(200!==l.status||!l.ok)throw new zy("JS-AUTH_CORE-RAT3-HE03","Invalid response status received for revoke access token request (".concat(l.statusText,")."),yield l.json());return this._authenticationHelper.clearUserSessionData(e),Promise.resolve(l)}))}requestCustomGrant(e,t){return Ly(this,void 0,void 0,(function*(){const i=yield this._oidcProviderMetaData(),n=yield this._config();let l;if(l=e.tokenEndpoint&&0!==e.tokenEndpoint.trim().length?e.tokenEndpoint:i.token_endpoint,!l||0===l.trim().length)throw new zy("JS-AUTH_CORE-RCG-NF01","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty.");const o=yield Promise.all(Object.entries(e.data).map((e=>{let[i,n]=e;return Ly(this,void 0,void 0,(function*(){const e=yield this._authenticationHelper.replaceCustomGrantTemplateTags(n,t);return"".concat(i,"=").concat(e)}))})));let c=Object.assign({},Py.getTokenRequestHeaders());e.attachToken&&(c=Object.assign(Object.assign({},c),{Authorization:"Bearer ".concat((yield this._dataLayer.getSessionData(t)).access_token)}));const a={body:o.join("&"),credentials:n.sendCookiesInRequests?wy.Include:wy.SameOrigin,headers:new Headers(c),method:"POST"};let d;try{d=yield fetch(l,a)}catch(e){throw new zy("JS-AUTH_CORE-RCG-NE02","The custom grant request failed.",null!=e?e:"The request sent to get the custom grant failed.")}if(200!==d.status||!d.ok)throw new zy("JS-AUTH_CORE-RCG-HE03","Invalid response status received for the custom grant request. (".concat(d.statusText,")"),yield d.json());return e.returnsSession?this._authenticationHelper.handleTokenResponse(d,t):Promise.resolve(yield d.json())}))}getBasicUserInfo(e){return Ly(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getSessionData(e),i=this._authenticationHelper.getAuthenticatedUserInfo(null==t?void 0:t.id_token);let n={allowedScopes:t.scope,sessionState:t.session_state};return Object.keys(i).forEach((e=>{void 0!==i[e]&&""!==i[e]&&null!==i[e]||delete i[e]})),n=Object.assign(Object.assign({},n),i),n}))}getDecodedIDToken(e){return Ly(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getSessionData(e)).id_token;return this._cryptoHelper.decodeIDToken(t)}))}getCryptoHelper(){return Ly(this,void 0,void 0,(function*(){return this._cryptoHelper}))}getIDToken(e){return Ly(this,void 0,void 0,(function*(){return(yield this._dataLayer.getSessionData(e)).id_token}))}getOIDCProviderMetaData(e){return Ly(this,void 0,void 0,(function*(){const t=yield this._config();if(!e&&(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated")))return Promise.resolve();const i=t.wellKnownEndpoint;if(i){let e;try{if(e=yield fetch(i),200!==e.status||!e.ok)throw new Error}catch(t){throw new zy("JS-AUTH_CORE-GOPMD-HE01","Invalid well-known response","The well known endpoint response has been failed with an error.")}return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpoints(yield e.json())),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}if(t.baseUrl){try{yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsByBaseURL())}catch(t){throw new zy("JS-AUTH_CORE-GOPMD-IV02","Resolving endpoints failed.",null!=t?t:"Resolving endpoints by base url failed.")}return yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsExplicitly()),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}))}getOIDCServiceEndpoints(){var e,t,i,n,l,o,c,a,d,s;return Ly(this,void 0,void 0,(function*(){const r=yield this._oidcProviderMetaData();return{authorizationEndpoint:null!==(e=r.authorization_endpoint)&&void 0!==e?e:"",checkSessionIframe:null!==(t=r.check_session_iframe)&&void 0!==t?t:"",endSessionEndpoint:null!==(i=r.end_session_endpoint)&&void 0!==i?i:"",introspectionEndpoint:null!==(n=r.introspection_endpoint)&&void 0!==n?n:"",issuer:null!==(l=r.issuer)&&void 0!==l?l:"",jwksUri:null!==(o=r.jwks_uri)&&void 0!==o?o:"",registrationEndpoint:null!==(c=r.registration_endpoint)&&void 0!==c?c:"",revocationEndpoint:null!==(a=r.revocation_endpoint)&&void 0!==a?a:"",tokenEndpoint:null!==(d=r.token_endpoint)&&void 0!==d?d:"",userinfoEndpoint:null!==(s=r.userinfo_endpoint)&&void 0!==s?s:""}}))}getSignOutURL(e){var t,i,n;return Ly(this,void 0,void 0,(function*(){const l=null===(t=yield this._oidcProviderMetaData())||void 0===t?void 0:t.end_session_endpoint,o=yield this._config();if(!l||0===l.trim().length)throw new zy("JS-AUTH_CORE-GSOU-NF01","Sign-out endpoint not found.","No sign-out endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the sign-out endpoint passed to the SDK is empty.");const c=null!==(i=null==o?void 0:o.signOutRedirectURL)&&void 0!==i?i:null==o?void 0:o.signInRedirectURL;if(!c||0===c.trim().length)throw new zy("JS-AUTH_CORE-GSOU-NF03","No sign-out redirect URL found.","The sign-out redirect URL cannot be found or the URL passed to the SDK is empty. No sign-in redirect URL has been found either. ");const a=new URLSearchParams;if(a.set("post_logout_redirect_uri",c),o.sendIdTokenInLogoutRequest){const t=null===(n=yield this._dataLayer.getSessionData(e))||void 0===n?void 0:n.id_token;if(!t||0===t.trim().length)throw new zy("JS-AUTH_CORE-GSOU-NF02","ID token not found.","No ID token could be found. Either the session information is lost or you have not signed in.");a.set("id_token_hint",t)}else a.set("client_id",o.clientID);return a.set("state","sign_out_success"),"".concat(l,"?").concat(a.toString())}))}clearUserSessionData(e){return Ly(this,void 0,void 0,(function*(){yield this._authenticationHelper.clearUserSessionData(e)}))}getAccessToken(e){var t;return Ly(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData(e))||void 0===t?void 0:t.access_token}))}getCreatedAt(e){var t;return Ly(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData(e))||void 0===t?void 0:t.created_at}))}getExpiresIn(e){var t;return Ly(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData(e))||void 0===t?void 0:t.expires_in}))}isAuthenticated(e){return Ly(this,void 0,void 0,(function*(){const t=Boolean(yield this.getAccessToken(e)),i=yield this.getCreatedAt(e),n=yield this.getExpiresIn(e);if(!n)return!1;const l=1e3*parseInt(n),o=(new Date).getTime();return t&&i+l>o}))}getPKCECode(e,t){return Ly(this,void 0,void 0,(function*(){return yield this._dataLayer.getTemporaryDataParameter(Py.extractPKCEKeyFromStateParam(e),t)}))}setPKCECode(e,t,i){return Ly(this,void 0,void 0,(function*(){return yield this._dataLayer.setTemporaryDataParameter(Py.extractPKCEKeyFromStateParam(t),e,i)}))}updateConfig(e){return Ly(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(e),yield this.getOIDCProviderMetaData(!0)}))}}class Ey{constructor(e,t){this._id=e,this._store=t}setDataInBulk(e,t){var i;return Ly(this,void 0,void 0,(function*(){const n=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,l=n&&JSON.parse(n),o=Object.assign(Object.assign({},l),t),c=JSON.stringify(o);yield this._store.setData(e,c)}))}setValue(e,t,i){var n;return Ly(this,void 0,void 0,(function*(){const l=null!==(n=yield this._store.getData(e))&&void 0!==n?n:null,o=l&&JSON.parse(l),c=Object.assign(Object.assign({},o),{[t]:i}),a=JSON.stringify(c);yield this._store.setData(e,a)}))}removeValue(e,t){var i;return Ly(this,void 0,void 0,(function*(){const n=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,l=n&&JSON.parse(n),o=Object.assign({},l);delete o[t];const c=JSON.stringify(o);yield this._store.setData(e,c)}))}_resolveKey(e,t){return t?"".concat(e,"-").concat(this._id,"-").concat(t):"".concat(e,"-").concat(this._id)}isLocalStorageAvailable(){try{const e="__ASGARDEO_AUTH_CORE_LOCAL_STORAGE_TEST__";return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch(e){return!1}}setConfigData(t){return Ly(this,void 0,void 0,(function*(){yield this.setDataInBulk(this._resolveKey(e.Stores.ConfigData),t)}))}setOIDCProviderMetaData(t){return Ly(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.OIDCProviderMetaData),t)}))}setTemporaryData(t,i){return Ly(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.TemporaryData,i),t)}))}setSessionData(t,i){return Ly(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.SessionData,i),t)}))}setCustomData(e,t,i){return Ly(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e,i),t)}))}getConfigData(){var t;return Ly(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(e.Stores.ConfigData)))&&void 0!==t?t:null)}))}getOIDCProviderMetaData(){var t;return Ly(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(e.Stores.OIDCProviderMetaData)))&&void 0!==t?t:null)}))}getTemporaryData(t){var i;return Ly(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e.Stores.TemporaryData,t)))&&void 0!==i?i:null)}))}getSessionData(t){var i;return Ly(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e.Stores.SessionData,t)))&&void 0!==i?i:null)}))}getCustomData(e,t){var i;return Ly(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e,t)))&&void 0!==i?i:null)}))}setSessionStatus(e){this.isLocalStorageAvailable()&&localStorage.setItem("asgardeo-session-active",e)}getSessionStatus(){var e;return this.isLocalStorageAvailable()&&null!==(e=localStorage.getItem("asgardeo-session-active"))&&void 0!==e?e:""}removeSessionStatus(){this.isLocalStorageAvailable()&&localStorage.removeItem("asgardeo-session-active")}removeConfigData(){return Ly(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.ConfigData))}))}removeOIDCProviderMetaData(){return Ly(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.OIDCProviderMetaData))}))}removeTemporaryData(t){return Ly(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.TemporaryData,t))}))}removeSessionData(t){return Ly(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.SessionData,t))}))}getConfigDataParameter(t){return Ly(this,void 0,void 0,(function*(){const i=yield this._store.getData(this._resolveKey(e.Stores.ConfigData));return i&&JSON.parse(i)[t]}))}getOIDCProviderMetaDataParameter(t){return Ly(this,void 0,void 0,(function*(){const i=yield this._store.getData(this._resolveKey(e.Stores.OIDCProviderMetaData));return i&&JSON.parse(i)[t]}))}getTemporaryDataParameter(t,i){return Ly(this,void 0,void 0,(function*(){const n=yield this._store.getData(this._resolveKey(e.Stores.TemporaryData,i));return n&&JSON.parse(n)[t]}))}getSessionDataParameter(t,i){return Ly(this,void 0,void 0,(function*(){const n=yield this._store.getData(this._resolveKey(e.Stores.SessionData,i));return n&&JSON.parse(n)[t]}))}setConfigDataParameter(t,i){return Ly(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.ConfigData),t,i)}))}setOIDCProviderMetaDataParameter(t,i){return Ly(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.OIDCProviderMetaData),t,i)}))}setTemporaryDataParameter(t,i,n){return Ly(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.TemporaryData,n),t,i)}))}setSessionDataParameter(t,i,n){return Ly(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.SessionData,n),t,i)}))}removeConfigDataParameter(t){return Ly(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.ConfigData),t)}))}removeOIDCProviderMetaDataParameter(t){return Ly(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.OIDCProviderMetaData),t)}))}removeTemporaryDataParameter(t,i){return Ly(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.TemporaryData,i),t)}))}removeSessionDataParameter(t,i){return Ly(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.SessionData,i),t)}))}}const Oy={clockTolerance:300,enablePKCE:!0,responseMode:e.ResponseMode.query,scope:["openid"],sendCookiesInRequests:!0,validateIDToken:!0,validateIDTokenIssuer:!0};class Dy{
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).AsgardeoAuth={})}(this,(function(e){"use strict";var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function i(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function n(e){if(e.__esModule)return e;var t=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(e).forEach((function(i){var n=Object.getOwnPropertyDescriptor(e,i);Object.defineProperty(t,i,n.get?n:{enumerable:!0,get:function(){return e[i]}})})),t}var l=function(e){return e&&e.Math==Math&&e},o=l("object"==typeof globalThis&&globalThis)||l("object"==typeof window&&window)||l("object"==typeof self&&self)||l("object"==typeof t&&t)||function(){return this}()||Function("return this")(),c=o,a=function(e){try{return!!e()}catch(e){return!0}},d=!a((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")})),s=d,r=Function.prototype,u=r.bind,Z=r.call,b=s&&u.bind(Z,Z),h=s?function(e){return e&&b(e)}:function(e){return e&&function(){return Z.apply(e,arguments)}},m=TypeError,p=function(e){if(null==e)throw m("Can't call method on "+e);return e},I=p,g=Object,G=function(e){return g(I(e))},y=G,X=h({}.hasOwnProperty),V=Object.hasOwn||function(e,t){return X(y(e),t)},W={},C={exports:{}},R=o,S=Object.defineProperty,v=function(e,t){try{S(R,e,{value:t,configurable:!0,writable:!0})}catch(i){R[e]=t}return t},f=v,Y="__core-js_shared__",K=o[Y]||f(Y,{}),N=K;(C.exports=function(e,t){return N[e]||(N[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.24.0",mode:"global",copyright:"© 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.24.0/LICENSE",source:"https://github.com/zloirock/core-js"});var J,U,L=h,k=0,H=Math.random(),T=L(1..toString),F=function(e){return"Symbol("+(void 0===e?"":e)+")_"+T(++k+H,36)},x=function(e){return"function"==typeof e},B=o,A=x,z=function(e){return A(e)?e:void 0},w=function(e,t){return arguments.length<2?z(B[e]):B[e]&&B[e][t]},P=w("navigator","userAgent")||"",Q=o,j=P,M=Q.process,E=Q.Deno,D=M&&M.versions||E&&E.version,O=D&&D.v8;O&&(U=(J=O.split("."))[0]>0&&J[0]<4?1:+(J[0]+J[1])),!U&&j&&(!(J=j.match(/Edge\/(\d+)/))||J[1]>=74)&&(J=j.match(/Chrome\/(\d+)/))&&(U=+J[1]);var _=U,q=_,$=a,ee=!!Object.getOwnPropertySymbols&&!$((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&q&&q<41})),te=ee&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,ie=o,ne=C.exports,le=V,oe=F,ce=ee,ae=te,de=ne("wks"),se=ie.Symbol,re=se&&se.for,ue=ae?se:se&&se.withoutSetter||oe,Ze=function(e){if(!le(de,e)||!ce&&"string"!=typeof de[e]){var t="Symbol."+e;ce&&le(se,e)?de[e]=se[e]:de[e]=ae&&re?re(t):ue(t)}return de[e]},be=Ze;W.f=be;var he={},me=!a((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),pe=x,Ie=function(e){return"object"==typeof e?null!==e:pe(e)},ge=Ie,Ge=o.document,ye=ge(Ge)&&ge(Ge.createElement),Xe=function(e){return ye?Ge.createElement(e):{}},Ve=Xe,We=!me&&!a((function(){return 7!=Object.defineProperty(Ve("div"),"a",{get:function(){return 7}}).a})),Ce=me&&a((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype})),Re=Ie,Se=String,ve=TypeError,fe=function(e){if(Re(e))return e;throw ve(Se(e)+" is not an object")},Ye=d,Ke=Function.prototype.call,Ne=Ye?Ke.bind(Ke):function(){return Ke.apply(Ke,arguments)},Je=h({}.isPrototypeOf),Ue=w,Le=x,ke=Je,He=Object,Te=te?function(e){return"symbol"==typeof e}:function(e){var t=Ue("Symbol");return Le(t)&&ke(t.prototype,He(e))},Fe=String,xe=function(e){try{return Fe(e)}catch(e){return"Object"}},Be=x,Ae=xe,ze=TypeError,we=function(e){if(Be(e))return e;throw ze(Ae(e)+" is not a function")},Pe=we,Qe=function(e,t){var i=e[t];return null==i?void 0:Pe(i)},je=Ne,Me=x,Ee=Ie,De=TypeError,Oe=Ne,_e=Ie,qe=Te,$e=Qe,et=function(e,t){var i,n;if("string"===t&&Me(i=e.toString)&&!Ee(n=je(i,e)))return n;if(Me(i=e.valueOf)&&!Ee(n=je(i,e)))return n;if("string"!==t&&Me(i=e.toString)&&!Ee(n=je(i,e)))return n;throw De("Can't convert object to primitive value")},tt=TypeError,it=Ze("toPrimitive"),nt=function(e,t){if(!_e(e)||qe(e))return e;var i,n=$e(e,it);if(n){if(void 0===t&&(t="default"),i=Oe(n,e,t),!_e(i)||qe(i))return i;throw tt("Can't convert object to primitive value")}return void 0===t&&(t="number"),et(e,t)},lt=nt,ot=Te,ct=function(e){var t=lt(e,"string");return ot(t)?t:t+""},at=me,dt=We,st=Ce,rt=fe,ut=ct,Zt=TypeError,bt=Object.defineProperty,ht=Object.getOwnPropertyDescriptor,mt="enumerable",pt="configurable",It="writable";he.f=at?st?function(e,t,i){if(rt(e),t=ut(t),rt(i),"function"==typeof e&&"prototype"===t&&"value"in i&&It in i&&!i.writable){var n=ht(e,t);n&&n.writable&&(e[t]=i.value,i={configurable:pt in i?i.configurable:n.configurable,enumerable:mt in i?i.enumerable:n.enumerable,writable:!1})}return bt(e,t,i)}:bt:function(e,t,i){if(rt(e),t=ut(t),rt(i),dt)try{return bt(e,t,i)}catch(e){}if("get"in i||"set"in i)throw Zt("Accessors not supported");return"value"in i&&(e[t]=i.value),e};var gt=c,Gt=V,yt=W,Xt=he.f,Vt=function(e){var t=gt.Symbol||(gt.Symbol={});Gt(t,e)||Xt(t,e,{value:yt.f(e)})};Vt("matchAll");var Wt={},Ct={},Rt={}.propertyIsEnumerable,St=Object.getOwnPropertyDescriptor,vt=St&&!Rt.call({1:2},1);Ct.f=vt?function(e){var t=St(this,e);return!!t&&t.enumerable}:Rt;var ft=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},Yt=h,Kt=Yt({}.toString),Nt=Yt("".slice),Jt=function(e){return Nt(Kt(e),8,-1)},Ut=a,Lt=Jt,kt=Object,Ht=h("".split),Tt=Ut((function(){return!kt("z").propertyIsEnumerable(0)}))?function(e){return"String"==Lt(e)?Ht(e,""):kt(e)}:kt,Ft=Tt,xt=p,Bt=function(e){return Ft(xt(e))},At=me,zt=Ne,wt=Ct,Pt=ft,Qt=Bt,jt=ct,Mt=V,Et=We,Dt=Object.getOwnPropertyDescriptor;Wt.f=At?Dt:function(e,t){if(e=Qt(e),t=jt(t),Et)try{return Dt(e,t)}catch(e){}if(Mt(e,t))return Pt(!zt(wt.f,e,t),e[t])};var Ot=he,_t=ft,qt=me?function(e,t,i){return Ot.f(e,t,_t(1,i))}:function(e,t,i){return e[t]=i,e},$t={exports:{}},ei=me,ti=V,ii=Function.prototype,ni=ei&&Object.getOwnPropertyDescriptor,li=ti(ii,"name"),oi={EXISTS:li,PROPER:li&&"something"===function(){}.name,CONFIGURABLE:li&&(!ei||ei&&ni(ii,"name").configurable)},ci=x,ai=K,di=h(Function.toString);ci(ai.inspectSource)||(ai.inspectSource=function(e){return di(e)});var si,ri,ui,Zi=ai.inspectSource,bi=x,hi=Zi,mi=o.WeakMap,pi=bi(mi)&&/native code/.test(hi(mi)),Ii=C.exports,gi=F,Gi=Ii("keys"),yi=function(e){return Gi[e]||(Gi[e]=gi(e))},Xi={},Vi=pi,Wi=o,Ci=h,Ri=Ie,Si=qt,vi=V,fi=K,Yi=yi,Ki=Xi,Ni="Object already initialized",Ji=Wi.TypeError,Ui=Wi.WeakMap;if(Vi||fi.state){var Li=fi.state||(fi.state=new Ui),ki=Ci(Li.get),Hi=Ci(Li.has),Ti=Ci(Li.set);si=function(e,t){if(Hi(Li,e))throw new Ji(Ni);return t.facade=e,Ti(Li,e,t),t},ri=function(e){return ki(Li,e)||{}},ui=function(e){return Hi(Li,e)}}else{var Fi=Yi("state");Ki[Fi]=!0,si=function(e,t){if(vi(e,Fi))throw new Ji(Ni);return t.facade=e,Si(e,Fi,t),t},ri=function(e){return vi(e,Fi)?e[Fi]:{}},ui=function(e){return vi(e,Fi)}}var xi={set:si,get:ri,has:ui,enforce:function(e){return ui(e)?ri(e):si(e,{})},getterFor:function(e){return function(t){var i;if(!Ri(t)||(i=ri(t)).type!==e)throw Ji("Incompatible receiver, "+e+" required");return i}}},Bi=a,Ai=x,zi=V,wi=me,Pi=oi.CONFIGURABLE,Qi=Zi,ji=xi.enforce,Mi=xi.get,Ei=Object.defineProperty,Di=wi&&!Bi((function(){return 8!==Ei((function(){}),"length",{value:8}).length})),Oi=String(String).split("String"),_i=$t.exports=function(e,t,i){"Symbol("===String(t).slice(0,7)&&(t="["+String(t).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),i&&i.getter&&(t="get "+t),i&&i.setter&&(t="set "+t),(!zi(e,"name")||Pi&&e.name!==t)&&(wi?Ei(e,"name",{value:t,configurable:!0}):e.name=t),Di&&i&&zi(i,"arity")&&e.length!==i.arity&&Ei(e,"length",{value:i.arity});try{i&&zi(i,"constructor")&&i.constructor?wi&&Ei(e,"prototype",{writable:!1}):e.prototype&&(e.prototype=void 0)}catch(e){}var n=ji(e);return zi(n,"source")||(n.source=Oi.join("string"==typeof t?t:"")),e};Function.prototype.toString=_i((function(){return Ai(this)&&Mi(this).source||Qi(this)}),"toString");var qi=x,$i=he,en=$t.exports,tn=v,nn=function(e,t,i,n){n||(n={});var l=n.enumerable,o=void 0!==n.name?n.name:t;if(qi(i)&&en(i,o,n),n.global)l?e[t]=i:tn(t,i);else{try{n.unsafe?e[t]&&(l=!0):delete e[t]}catch(e){}l?e[t]=i:$i.f(e,t,{value:i,enumerable:!1,configurable:!n.nonConfigurable,writable:!n.nonWritable})}return e},ln={},on=Math.ceil,cn=Math.floor,an=Math.trunc||function(e){var t=+e;return(t>0?cn:on)(t)},dn=an,sn=function(e){var t=+e;return t!=t||0===t?0:dn(t)},rn=sn,un=Math.max,Zn=Math.min,bn=function(e,t){var i=rn(e);return i<0?un(i+t,0):Zn(i,t)},hn=sn,mn=Math.min,pn=function(e){return e>0?mn(hn(e),9007199254740991):0},In=pn,gn=function(e){return In(e.length)},Gn=Bt,yn=bn,Xn=gn,Vn=function(e){return function(t,i,n){var l,o=Gn(t),c=Xn(o),a=yn(n,c);if(e&&i!=i){for(;c>a;)if((l=o[a++])!=l)return!0}else for(;c>a;a++)if((e||a in o)&&o[a]===i)return e||a||0;return!e&&-1}},Wn={includes:Vn(!0),indexOf:Vn(!1)},Cn=V,Rn=Bt,Sn=Wn.indexOf,vn=Xi,fn=h([].push),Yn=function(e,t){var i,n=Rn(e),l=0,o=[];for(i in n)!Cn(vn,i)&&Cn(n,i)&&fn(o,i);for(;t.length>l;)Cn(n,i=t[l++])&&(~Sn(o,i)||fn(o,i));return o},Kn=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Nn=Yn,Jn=Kn.concat("length","prototype");ln.f=Object.getOwnPropertyNames||function(e){return Nn(e,Jn)};var Un={};Un.f=Object.getOwnPropertySymbols;var Ln=w,kn=ln,Hn=Un,Tn=fe,Fn=h([].concat),xn=Ln("Reflect","ownKeys")||function(e){var t=kn.f(Tn(e)),i=Hn.f;return i?Fn(t,i(e)):t},Bn=V,An=xn,zn=Wt,wn=he,Pn=a,Qn=x,jn=/#|\.prototype\./,Mn=function(e,t){var i=Dn[En(e)];return i==_n||i!=On&&(Qn(t)?Pn(t):!!t)},En=Mn.normalize=function(e){return String(e).replace(jn,".").toLowerCase()},Dn=Mn.data={},On=Mn.NATIVE="N",_n=Mn.POLYFILL="P",qn=Mn,$n=o,el=Wt.f,tl=qt,il=nn,nl=v,ll=function(e,t,i){for(var n=An(t),l=wn.f,o=zn.f,c=0;c<n.length;c++){var a=n[c];Bn(e,a)||i&&Bn(i,a)||l(e,a,o(t,a))}},ol=qn,cl=function(e,t){var i,n,l,o,c,a=e.target,d=e.global,s=e.stat;if(i=d?$n:s?$n[a]||nl(a,{}):($n[a]||{}).prototype)for(n in t){if(o=t[n],l=e.dontCallGetSet?(c=el(i,n))&&c.value:i[n],!ol(d?n:a+(s?".":"#")+n,e.forced)&&void 0!==l){if(typeof o==typeof l)continue;ll(o,l)}(e.sham||l&&l.sham)&&tl(o,"sham",!0),il(i,n,o,e)}},al={},dl=Yn,sl=Kn,rl=Object.keys||function(e){return dl(e,sl)},ul=me,Zl=Ce,bl=he,hl=fe,ml=Bt,pl=rl;al.f=ul&&!Zl?Object.defineProperties:function(e,t){hl(e);for(var i,n=ml(t),l=pl(t),o=l.length,c=0;o>c;)bl.f(e,i=l[c++],n[i]);return e};var Il,gl=w("document","documentElement"),Gl=fe,yl=al,Xl=Kn,Vl=Xi,Wl=gl,Cl=Xe,Rl=yi("IE_PROTO"),Sl=function(){},vl=function(e){return"<script>"+e+"</"+"script>"},fl=function(e){e.write(vl("")),e.close();var t=e.parentWindow.Object;return e=null,t},Yl=function(){try{Il=new ActiveXObject("htmlfile")}catch(e){}var e,t;Yl="undefined"!=typeof document?document.domain&&Il?fl(Il):((t=Cl("iframe")).style.display="none",Wl.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(vl("document.F=Object")),e.close(),e.F):fl(Il);for(var i=Xl.length;i--;)delete Yl.prototype[Xl[i]];return Yl()};Vl[Rl]=!0;var Kl=Object.create||function(e,t){var i;return null!==e?(Sl.prototype=Gl(e),i=new Sl,Sl.prototype=null,i[Rl]=e):i=Yl(),void 0===t?i:yl.f(i,t)},Nl=Ze,Jl=Kl,Ul=he.f,Ll=Nl("unscopables"),kl=Array.prototype;null==kl[Ll]&&Ul(kl,Ll,{configurable:!0,value:Jl(null)});var Hl=function(e){kl[Ll][e]=!0},Tl=Wn.includes,Fl=Hl;cl({target:"Array",proto:!0,forced:a((function(){return!Array(1).includes()}))},{includes:function(e){return Tl(this,e,arguments.length>1?arguments[1]:void 0)}}),Fl("includes"),Hl("flat"),Hl("flatMap");var xl={},Bl=we,Al=function(e){var t,i;this.promise=new e((function(e,n){if(void 0!==t||void 0!==i)throw TypeError("Bad Promise constructor");t=e,i=n})),this.resolve=Bl(t),this.reject=Bl(i)};xl.f=function(e){return new Al(e)};var zl=we,wl=d,Pl=h(h.bind),Ql=function(e,t){return zl(e),void 0===t?e:wl?Pl(e,t):function(){return e.apply(t,arguments)}},jl={},Ml=jl,El=Ze("iterator"),Dl=Array.prototype,Ol=function(e){return void 0!==e&&(Ml.Array===e||Dl[El]===e)},_l={};_l[Ze("toStringTag")]="z";var ql="[object z]"===String(_l),$l=x,eo=Jt,to=Ze("toStringTag"),io=Object,no="Arguments"==eo(function(){return arguments}()),lo=ql?eo:function(e){var t,i,n;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(i=function(e,t){try{return e[t]}catch(e){}}(t=io(e),to))?i:no?eo(t):"Object"==(n=eo(t))&&$l(t.callee)?"Arguments":n},oo=lo,co=Qe,ao=jl,so=Ze("iterator"),ro=function(e){if(null!=e)return co(e,so)||co(e,"@@iterator")||ao[oo(e)]},uo=Ne,Zo=we,bo=fe,ho=xe,mo=ro,po=TypeError,Io=function(e,t){var i=arguments.length<2?mo(e):t;if(Zo(i))return bo(uo(i,e));throw po(ho(e)+" is not iterable")},go=Ne,Go=fe,yo=Qe,Xo=function(e,t,i){var n,l;Go(e);try{if(!(n=yo(e,"return"))){if("throw"===t)throw i;return i}n=go(n,e)}catch(e){l=!0,n=e}if("throw"===t)throw i;if(l)throw n;return Go(n),i},Vo=Ql,Wo=Ne,Co=fe,Ro=xe,So=Ol,vo=gn,fo=Je,Yo=Io,Ko=ro,No=Xo,Jo=TypeError,Uo=function(e,t){this.stopped=e,this.result=t},Lo=Uo.prototype,ko=Ne,Ho=we,To=xl,Fo=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},xo=function(e,t,i){var n,l,o,c,a,d,s,r=i&&i.that,u=!(!i||!i.AS_ENTRIES),Z=!(!i||!i.IS_RECORD),b=!(!i||!i.IS_ITERATOR),h=!(!i||!i.INTERRUPTED),m=Vo(t,r),p=function(e){return n&&No(n,"normal",e),new Uo(!0,e)},I=function(e){return u?(Co(e),h?m(e[0],e[1],p):m(e[0],e[1])):h?m(e,p):m(e)};if(Z)n=e.iterator;else if(b)n=e;else{if(!(l=Ko(e)))throw Jo(Ro(e)+" is not iterable");if(So(l)){for(o=0,c=vo(e);c>o;o++)if((a=I(e[o]))&&fo(Lo,a))return a;return new Uo(!1)}n=Yo(e,l)}for(d=Z?e.next:n.next;!(s=Wo(d,n)).done;){try{a=I(s.value)}catch(e){No(n,"throw",e)}if("object"==typeof a&&a&&fo(Lo,a))return a}return new Uo(!1)};cl({target:"Promise",stat:!0},{allSettled:function(e){var t=this,i=To.f(t),n=i.resolve,l=i.reject,o=Fo((function(){var i=Ho(t.resolve),l=[],o=0,c=1;xo(e,(function(e){var a=o++,d=!1;c++,ko(i,t,e).then((function(e){d||(d=!0,l[a]={status:"fulfilled",value:e},--c||n(l))}),(function(e){d||(d=!0,l[a]={status:"rejected",reason:e},--c||n(l))}))})),--c||n(l)}));return o.error&&l(o.value),i.promise}});var Bo=o.Promise,Ao=h,zo=a,wo=x,Po=lo,Qo=Zi,jo=function(){},Mo=[],Eo=w("Reflect","construct"),Do=/^\s*(?:class|function)\b/,Oo=Ao(Do.exec),_o=!Do.exec(jo),qo=function(e){if(!wo(e))return!1;try{return Eo(jo,Mo,e),!0}catch(e){return!1}},$o=function(e){if(!wo(e))return!1;switch(Po(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return _o||!!Oo(Do,Qo(e))}catch(e){return!0}};$o.sham=!0;var ec=!Eo||zo((function(){var e;return qo(qo.call)||!qo(Object)||!qo((function(){e=!0}))||e}))?$o:qo,tc=ec,ic=xe,nc=TypeError,lc=function(e){if(tc(e))return e;throw nc(ic(e)+" is not a constructor")},oc=fe,cc=lc,ac=Ze("species"),dc=function(e,t){var i,n=oc(e).constructor;return void 0===n||null==(i=oc(n)[ac])?t:cc(i)},sc=fe,rc=Ie,uc=xl,Zc=cl,bc=Bo,hc=a,mc=w,pc=x,Ic=dc,gc=function(e,t){if(sc(e),rc(t)&&t.constructor===e)return t;var i=uc.f(e);return(0,i.resolve)(t),i.promise},Gc=nn,yc=bc&&bc.prototype;if(Zc({target:"Promise",proto:!0,real:!0,forced:!!bc&&hc((function(){yc.finally.call({then:function(){}},(function(){}))}))},{finally:function(e){var t=Ic(this,mc("Promise")),i=pc(e);return this.then(i?function(i){return gc(t,e()).then((function(){return i}))}:e,i?function(i){return gc(t,e()).then((function(){throw i}))}:e)}}),pc(bc)){var Xc=mc("Promise").prototype.finally;yc.finally!==Xc&&Gc(yc,"finally",Xc,{unsafe:!0})}var Vc=$t.exports,Wc=he,Cc=function(e,t,i){return i.get&&Vc(i.get,t,{getter:!0}),i.set&&Vc(i.set,t,{setter:!0}),Wc.f(e,t,i)},Rc=fe,Sc=function(){var e=Rc(this),t="";return e.hasIndices&&(t+="d"),e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.unicodeSets&&(t+="v"),e.sticky&&(t+="y"),t},vc=me,fc=Cc,Yc=Sc,Kc=a,Nc=o.RegExp,Jc=Nc.prototype,Uc=vc&&Kc((function(){var e=!0;try{Nc(".","d")}catch(t){e=!1}var t={},i="",n=e?"dgimsy":"gimsy",l=function(e,n){Object.defineProperty(t,e,{get:function(){return i+=n,!0}})},o={dotAll:"s",global:"g",ignoreCase:"i",multiline:"m",sticky:"y"};for(var c in e&&(o.hasIndices="d"),o)l(c,o[c]);return Object.getOwnPropertyDescriptor(Jc,"flags").get.call(t)!==n||i!==n}));Uc&&fc(Jc,"flags",{configurable:!0,get:Yc});var Lc,kc,Hc,Tc=!a((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})),Fc=V,xc=x,Bc=G,Ac=Tc,zc=yi("IE_PROTO"),wc=Object,Pc=wc.prototype,Qc=Ac?wc.getPrototypeOf:function(e){var t=Bc(e);if(Fc(t,zc))return t[zc];var i=t.constructor;return xc(i)&&t instanceof i?i.prototype:t instanceof wc?Pc:null},jc=a,Mc=x,Ec=Qc,Dc=nn,Oc=Ze("iterator"),_c=!1;[].keys&&("next"in(Hc=[].keys())?(kc=Ec(Ec(Hc)))!==Object.prototype&&(Lc=kc):_c=!0);var qc=null==Lc||jc((function(){var e={};return Lc[Oc].call(e)!==e}));qc&&(Lc={}),Mc(Lc[Oc])||Dc(Lc,Oc,(function(){return this}));var $c,ea,ta={IteratorPrototype:Lc,BUGGY_SAFARI_ITERATORS:_c},ia=he.f,na=V,la=Ze("toStringTag"),oa=function(e,t,i){e&&!i&&(e=e.prototype),e&&!na(e,la)&&ia(e,la,{configurable:!0,value:t})},ca=ta.IteratorPrototype,aa=Kl,da=ft,sa=oa,ra=jl,ua=function(){return this},Za=function(e,t,i,n){var l=t+" Iterator";return e.prototype=aa(ca,{next:da(+!n,i)}),sa(e,l,!1),ra[l]=ua,e},ba=lo,ha=String,ma=function(e){if("Symbol"===ba(e))throw TypeError("Cannot convert a Symbol value to a string");return ha(e)},pa=Ie,Ia=Jt,ga=Ze("match"),Ga=Ne,ya=V,Xa=Je,Va=Sc,Wa=RegExp.prototype,Ca=h,Ra=sn,Sa=ma,va=p,fa=Ca("".charAt),Ya=Ca("".charCodeAt),Ka=Ca("".slice),Na=function(e){return function(t,i){var n,l,o=Sa(va(t)),c=Ra(i),a=o.length;return c<0||c>=a?e?"":void 0:(n=Ya(o,c))<55296||n>56319||c+1===a||(l=Ya(o,c+1))<56320||l>57343?e?fa(o,c):n:e?Ka(o,c,c+2):l-56320+(n-55296<<10)+65536}},Ja={codeAt:Na(!1),charAt:Na(!0)},Ua=Ja.charAt,La=function(e,t,i){return t+(i?Ua(e,t).length:1)},ka=a,Ha=o.RegExp,Ta=ka((function(){var e=Ha("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),Fa=Ta||ka((function(){return!Ha("a","y").sticky})),xa={BROKEN_CARET:Ta||ka((function(){var e=Ha("^r","gy");return e.lastIndex=2,null!=e.exec("str")})),MISSED_STICKY:Fa,UNSUPPORTED_Y:Ta},Ba=a,Aa=o.RegExp,za=Ba((function(){var e=Aa(".","s");return!(e.dotAll&&e.exec("\n")&&"s"===e.flags)})),wa=a,Pa=o.RegExp,Qa=wa((function(){var e=Pa("(?<a>b)","g");return"b"!==e.exec("b").groups.a||"bc"!=="b".replace(e,"$<a>c")})),ja=Ne,Ma=h,Ea=ma,Da=Sc,Oa=xa,_a=C.exports,qa=Kl,$a=xi.get,ed=za,td=Qa,id=_a("native-string-replace",String.prototype.replace),nd=RegExp.prototype.exec,ld=nd,od=Ma("".charAt),cd=Ma("".indexOf),ad=Ma("".replace),dd=Ma("".slice),sd=(ea=/b*/g,ja(nd,$c=/a/,"a"),ja(nd,ea,"a"),0!==$c.lastIndex||0!==ea.lastIndex),rd=Oa.BROKEN_CARET,ud=void 0!==/()??/.exec("")[1];(sd||ud||rd||ed||td)&&(ld=function(e){var t,i,n,l,o,c,a,d=this,s=$a(d),r=Ea(e),u=s.raw;if(u)return u.lastIndex=d.lastIndex,t=ja(ld,u,r),d.lastIndex=u.lastIndex,t;var Z=s.groups,b=rd&&d.sticky,h=ja(Da,d),m=d.source,p=0,I=r;if(b&&(h=ad(h,"y",""),-1===cd(h,"g")&&(h+="g"),I=dd(r,d.lastIndex),d.lastIndex>0&&(!d.multiline||d.multiline&&"\n"!==od(r,d.lastIndex-1))&&(m="(?: "+m+")",I=" "+I,p++),i=new RegExp("^(?:"+m+")",h)),ud&&(i=new RegExp("^"+m+"$(?!\\s)",h)),sd&&(n=d.lastIndex),l=ja(nd,b?i:d,I),b?l?(l.input=dd(l.input,p),l[0]=dd(l[0],p),l.index=d.lastIndex,d.lastIndex+=l[0].length):d.lastIndex=0:sd&&l&&(d.lastIndex=d.global?l.index+l[0].length:n),ud&&l&&l.length>1&&ja(id,l[0],i,(function(){for(o=1;o<arguments.length-2;o++)void 0===arguments[o]&&(l[o]=void 0)})),l&&Z)for(l.groups=c=qa(null),o=0;o<Z.length;o++)c[(a=Z[o])[0]]=l[a[1]];return l});var Zd=ld,bd=Ne,hd=fe,md=x,pd=Jt,Id=Zd,gd=TypeError,Gd=function(e,t){var i=e.exec;if(md(i)){var n=bd(i,e,t);return null!==n&&hd(n),n}if("RegExp"===pd(e))return bd(Id,e,t);throw gd("RegExp#exec called on incompatible receiver")},yd=cl,Xd=Ne,Vd=h,Wd=Za,Cd=p,Rd=pn,Sd=ma,vd=fe,fd=function(e){var t;return pa(e)&&(void 0!==(t=e[ga])?!!t:"RegExp"==Ia(e))},Yd=function(e){var t=e.flags;return void 0!==t||"flags"in Wa||ya(e,"flags")||!Xa(Wa,e)?t:Ga(Va,e)},Kd=Qe,Nd=nn,Jd=a,Ud=dc,Ld=La,kd=Gd,Hd=xi,Td=Ze("matchAll"),Fd="RegExp String",xd="RegExp String Iterator",Bd=Hd.set,Ad=Hd.getterFor(xd),zd=RegExp.prototype,wd=TypeError,Pd=Vd("".indexOf),Qd=Vd("".matchAll),jd=!!Qd&&!Jd((function(){Qd("a",/./)})),Md=Wd((function(e,t,i,n){Bd(this,{type:xd,regexp:e,string:t,global:i,unicode:n,done:!1})}),Fd,(function(){var e=Ad(this);if(e.done)return{value:void 0,done:!0};var t=e.regexp,i=e.string,n=kd(t,i);return null===n?{value:void 0,done:e.done=!0}:e.global?(""===Sd(n[0])&&(t.lastIndex=Ld(i,Rd(t.lastIndex),e.unicode)),{value:n,done:!1}):(e.done=!0,{value:n,done:!1})})),Ed=function(e){var t,i,n,l=vd(this),o=Sd(e),c=Ud(l,RegExp),a=Sd(Yd(l));return t=new c(c===RegExp?l.source:l,a),i=!!~Pd(a,"g"),n=!!~Pd(a,"u"),t.lastIndex=Rd(l.lastIndex),new Md(t,o,i,n)};yd({target:"String",proto:!0,forced:jd},{matchAll:function(e){var t,i,n,l=Cd(this);if(null!=e){if(fd(e)&&(t=Sd(Cd(Yd(e))),!~Pd(t,"g")))throw wd("`.matchAll` does not allow non-global regexes");if(jd)return Qd(l,e);if(n=Kd(e,Td))return Xd(n,e,l)}else if(jd)return Qd(l,e);return i=Sd(l),new RegExp(e,"g")[Td](i)}}),Td in zd||Nd(zd,Td,Ed);var Dd=d,Od=Function.prototype,_d=Od.apply,qd=Od.call,$d="object"==typeof Reflect&&Reflect.apply||(Dd?qd.bind(_d):function(){return qd.apply(_d,arguments)});cl({target:"RegExp",proto:!0,forced:/./.exec!==Zd},{exec:Zd});var es=h,ts=nn,is=Zd,ns=a,ls=Ze,os=qt,cs=ls("species"),as=RegExp.prototype,ds=h,ss=G,rs=Math.floor,us=ds("".charAt),Zs=ds("".replace),bs=ds("".slice),hs=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,ms=/\$([$&'`]|\d{1,2})/g,ps=$d,Is=Ne,gs=h,Gs=function(e,t,i,n){var l=ls(e),o=!ns((function(){var t={};return t[l]=function(){return 7},7!=""[e](t)})),c=o&&!ns((function(){var t=!1,i=/a/;return"split"===e&&((i={}).constructor={},i.constructor[cs]=function(){return i},i.flags="",i[l]=/./[l]),i.exec=function(){return t=!0,null},i[l](""),!t}));if(!o||!c||i){var a=es(/./[l]),d=t(l,""[e],(function(e,t,i,n,l){var c=es(e),d=t.exec;return d===is||d===as.exec?o&&!l?{done:!0,value:a(t,i,n)}:{done:!0,value:c(i,t,n)}:{done:!1}}));ts(String.prototype,e,d[0]),ts(as,l,d[1])}n&&os(as[l],"sham",!0)},ys=a,Xs=fe,Vs=x,Ws=sn,Cs=pn,Rs=ma,Ss=p,vs=La,fs=Qe,Ys=function(e,t,i,n,l,o){var c=i+e.length,a=n.length,d=ms;return void 0!==l&&(l=ss(l),d=hs),Zs(o,d,(function(o,d){var s;switch(us(d,0)){case"$":return"$";case"&":return e;case"`":return bs(t,0,i);case"'":return bs(t,c);case"<":s=l[bs(d,1,-1)];break;default:var r=+d;if(0===r)return o;if(r>a){var u=rs(r/10);return 0===u?o:u<=a?void 0===n[u-1]?us(d,1):n[u-1]+us(d,1):o}s=n[r-1]}return void 0===s?"":s}))},Ks=Gd,Ns=Ze("replace"),Js=Math.max,Us=Math.min,Ls=gs([].concat),ks=gs([].push),Hs=gs("".indexOf),Ts=gs("".slice),Fs="$0"==="a".replace(/./,"$0"),xs=!!/./[Ns]&&""===/./[Ns]("a","$0");Gs("replace",(function(e,t,i){var n=xs?"$":"$0";return[function(e,i){var n=Ss(this),l=null==e?void 0:fs(e,Ns);return l?Is(l,e,n,i):Is(t,Rs(n),e,i)},function(e,l){var o=Xs(this),c=Rs(e);if("string"==typeof l&&-1===Hs(l,n)&&-1===Hs(l,"$<")){var a=i(t,o,c,l);if(a.done)return a.value}var d=Vs(l);d||(l=Rs(l));var s=o.global;if(s){var r=o.unicode;o.lastIndex=0}for(var u=[];;){var Z=Ks(o,c);if(null===Z)break;if(ks(u,Z),!s)break;""===Rs(Z[0])&&(o.lastIndex=vs(c,Cs(o.lastIndex),r))}for(var b,h="",m=0,p=0;p<u.length;p++){for(var I=Rs((Z=u[p])[0]),g=Js(Us(Ws(Z.index),c.length),0),G=[],y=1;y<Z.length;y++)ks(G,void 0===(b=Z[y])?b:String(b));var X=Z.groups;if(d){var V=Ls([I],G,g,c);void 0!==X&&ks(V,X);var W=Rs(ps(l,void 0,V))}else W=Ys(I,c,g,G,X,l);g>=m&&(h+=Ts(c,m,g)+W,m=g+I.length)}return h+Ts(c,m)}]}),!!ys((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")}))||!Fs||xs);var Bs={exports:{}},As=Ze("iterator"),zs=!1;try{var ws=0,Ps={next:function(){return{done:!!ws++}},return:function(){zs=!0}};Ps[As]=function(){return this},Array.from(Ps,(function(){throw 2}))}catch(e){}var Qs,js,Ms,Es="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView,Ds=x,Os=String,_s=TypeError,qs=h,$s=fe,er=function(e){if("object"==typeof e||Ds(e))return e;throw _s("Can't set "+Os(e)+" as a prototype")},tr=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,i={};try{(e=qs(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(i,[]),t=i instanceof Array}catch(e){}return function(i,n){return $s(i),er(n),t?e(i,n):i.__proto__=n,i}}():void 0),ir=Es,nr=me,lr=o,or=x,cr=Ie,ar=V,dr=lo,sr=xe,rr=qt,ur=nn,Zr=he.f,br=Je,hr=Qc,mr=tr,pr=Ze,Ir=F,gr=xi.enforce,Gr=xi.get,yr=lr.Int8Array,Xr=yr&&yr.prototype,Vr=lr.Uint8ClampedArray,Wr=Vr&&Vr.prototype,Cr=yr&&hr(yr),Rr=Xr&&hr(Xr),Sr=Object.prototype,vr=lr.TypeError,fr=pr("toStringTag"),Yr=Ir("TYPED_ARRAY_TAG"),Kr="TypedArrayConstructor",Nr=ir&&!!mr&&"Opera"!==dr(lr.opera),Jr=!1,Ur={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},Lr={BigInt64Array:8,BigUint64Array:8},kr=function(e){var t=hr(e);if(cr(t)){var i=Gr(t);return i&&ar(i,Kr)?i.TypedArrayConstructor:kr(t)}},Hr=function(e){if(!cr(e))return!1;var t=dr(e);return ar(Ur,t)||ar(Lr,t)};for(Qs in Ur)(Ms=(js=lr[Qs])&&js.prototype)?gr(Ms).TypedArrayConstructor=js:Nr=!1;for(Qs in Lr)(Ms=(js=lr[Qs])&&js.prototype)&&(gr(Ms).TypedArrayConstructor=js);if((!Nr||!or(Cr)||Cr===Function.prototype)&&(Cr=function(){throw vr("Incorrect invocation")},Nr))for(Qs in Ur)lr[Qs]&&mr(lr[Qs],Cr);if((!Nr||!Rr||Rr===Sr)&&(Rr=Cr.prototype,Nr))for(Qs in Ur)lr[Qs]&&mr(lr[Qs].prototype,Rr);if(Nr&&hr(Wr)!==Rr&&mr(Wr,Rr),nr&&!ar(Rr,fr))for(Qs in Jr=!0,Zr(Rr,fr,{get:function(){return cr(this)?this[Yr]:void 0}}),Ur)lr[Qs]&&rr(lr[Qs],Yr,Qs);var Tr={NATIVE_ARRAY_BUFFER_VIEWS:Nr,TYPED_ARRAY_TAG:Jr&&Yr,aTypedArray:function(e){if(Hr(e))return e;throw vr("Target is not a typed array")},aTypedArrayConstructor:function(e){if(or(e)&&(!mr||br(Cr,e)))return e;throw vr(sr(e)+" is not a typed array constructor")},exportTypedArrayMethod:function(e,t,i,n){if(nr){if(i)for(var l in Ur){var o=lr[l];if(o&&ar(o.prototype,e))try{delete o.prototype[e]}catch(i){try{o.prototype[e]=t}catch(e){}}}Rr[e]&&!i||ur(Rr,e,i?t:Nr&&Xr[e]||t,n)}},exportTypedArrayStaticMethod:function(e,t,i){var n,l;if(nr){if(mr){if(i)for(n in Ur)if((l=lr[n])&&ar(l,e))try{delete l[e]}catch(e){}if(Cr[e]&&!i)return;try{return ur(Cr,e,i?t:Nr&&Cr[e]||t)}catch(e){}}for(n in Ur)!(l=lr[n])||l[e]&&!i||ur(l,e,t)}},getTypedArrayConstructor:kr,isView:function(e){if(!cr(e))return!1;var t=dr(e);return"DataView"===t||ar(Ur,t)||ar(Lr,t)},isTypedArray:Hr,TypedArray:Cr,TypedArrayPrototype:Rr},Fr=o,xr=a,Br=function(e,t){if(!t&&!zs)return!1;var i=!1;try{var n={};n[As]=function(){return{next:function(){return{done:i=!0}}}},e(n)}catch(e){}return i},Ar=Tr.NATIVE_ARRAY_BUFFER_VIEWS,zr=Fr.ArrayBuffer,wr=Fr.Int8Array,Pr=!Ar||!xr((function(){wr(1)}))||!xr((function(){new wr(-1)}))||!Br((function(e){new wr,new wr(null),new wr(1.5),new wr(e)}),!0)||xr((function(){return 1!==new wr(new zr(2),1,void 0).length})),Qr=nn,jr=function(e,t,i){for(var n in t)Qr(e,n,t[n],i);return e},Mr=Je,Er=TypeError,Dr=function(e,t){if(Mr(t,e))return e;throw Er("Incorrect invocation")},Or=sn,_r=pn,qr=RangeError,$r=function(e){if(void 0===e)return 0;var t=Or(e),i=_r(t);if(t!==i)throw qr("Wrong length or index");return i},eu=Array,tu=Math.abs,iu=Math.pow,nu=Math.floor,lu=Math.log,ou=Math.LN2,cu={pack:function(e,t,i){var n,l,o,c=eu(i),a=8*i-t-1,d=(1<<a)-1,s=d>>1,r=23===t?iu(2,-24)-iu(2,-77):0,u=e<0||0===e&&1/e<0?1:0,Z=0;for((e=tu(e))!=e||e===1/0?(l=e!=e?1:0,n=d):(n=nu(lu(e)/ou),e*(o=iu(2,-n))<1&&(n--,o*=2),(e+=n+s>=1?r/o:r*iu(2,1-s))*o>=2&&(n++,o/=2),n+s>=d?(l=0,n=d):n+s>=1?(l=(e*o-1)*iu(2,t),n+=s):(l=e*iu(2,s-1)*iu(2,t),n=0));t>=8;)c[Z++]=255&l,l/=256,t-=8;for(n=n<<t|l,a+=t;a>0;)c[Z++]=255&n,n/=256,a-=8;return c[--Z]|=128*u,c},unpack:function(e,t){var i,n=e.length,l=8*n-t-1,o=(1<<l)-1,c=o>>1,a=l-7,d=n-1,s=e[d--],r=127&s;for(s>>=7;a>0;)r=256*r+e[d--],a-=8;for(i=r&(1<<-a)-1,r>>=-a,a+=t;a>0;)i=256*i+e[d--],a-=8;if(0===r)r=1-c;else{if(r===o)return i?NaN:s?-1/0:1/0;i+=iu(2,t),r-=c}return(s?-1:1)*i*iu(2,r-t)}},au=G,du=bn,su=gn,ru=function(e){for(var t=au(this),i=su(t),n=arguments.length,l=du(n>1?arguments[1]:void 0,i),o=n>2?arguments[2]:void 0,c=void 0===o?i:du(o,i);c>l;)t[l++]=e;return t},uu=ct,Zu=he,bu=ft,hu=function(e,t,i){var n=uu(t);n in e?Zu.f(e,n,bu(0,i)):e[n]=i},mu=bn,pu=gn,Iu=hu,gu=Array,Gu=Math.max,yu=function(e,t,i){for(var n=pu(e),l=mu(t,n),o=mu(void 0===i?n:i,n),c=gu(Gu(o-l,0)),a=0;l<o;l++,a++)Iu(c,a,e[l]);return c.length=a,c},Xu=o,Vu=h,Wu=me,Cu=Es,Ru=oi,Su=qt,vu=jr,fu=a,Yu=Dr,Ku=sn,Nu=pn,Ju=$r,Uu=cu,Lu=Qc,ku=tr,Hu=ln.f,Tu=he.f,Fu=ru,xu=yu,Bu=oa,Au=Ru.PROPER,zu=Ru.CONFIGURABLE,wu=xi.get,Pu=xi.set,Qu="ArrayBuffer",ju="DataView",Mu="Wrong index",Eu=Xu.ArrayBuffer,Du=Eu,Ou=Du&&Du.prototype,_u=Xu.DataView,qu=_u&&_u.prototype,$u=Object.prototype,eZ=Xu.Array,tZ=Xu.RangeError,iZ=Vu(Fu),nZ=Vu([].reverse),lZ=Uu.pack,oZ=Uu.unpack,cZ=function(e){return[255&e]},aZ=function(e){return[255&e,e>>8&255]},dZ=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},sZ=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},rZ=function(e){return lZ(e,23,4)},uZ=function(e){return lZ(e,52,8)},ZZ=function(e,t){Tu(e.prototype,t,{get:function(){return wu(this)[t]}})},bZ=function(e,t,i,n){var l=Ju(i),o=wu(e);if(l+t>o.byteLength)throw tZ(Mu);var c=wu(o.buffer).bytes,a=l+o.byteOffset,d=xu(c,a,a+t);return n?d:nZ(d)},hZ=function(e,t,i,n,l,o){var c=Ju(i),a=wu(e);if(c+t>a.byteLength)throw tZ(Mu);for(var d=wu(a.buffer).bytes,s=c+a.byteOffset,r=n(+l),u=0;u<t;u++)d[s+u]=r[o?u:t-u-1]};if(Cu){var mZ=Au&&Eu.name!==Qu;if(fu((function(){Eu(1)}))&&fu((function(){new Eu(-1)}))&&!fu((function(){return new Eu,new Eu(1.5),new Eu(NaN),mZ&&!zu})))mZ&&zu&&Su(Eu,"name",Qu);else{(Du=function(e){return Yu(this,Ou),new Eu(Ju(e))}).prototype=Ou;for(var pZ,IZ=Hu(Eu),gZ=0;IZ.length>gZ;)(pZ=IZ[gZ++])in Du||Su(Du,pZ,Eu[pZ]);Ou.constructor=Du}ku&&Lu(qu)!==$u&&ku(qu,$u);var GZ=new _u(new Du(2)),yZ=Vu(qu.setInt8);GZ.setInt8(0,2147483648),GZ.setInt8(1,2147483649),!GZ.getInt8(0)&&GZ.getInt8(1)||vu(qu,{setInt8:function(e,t){yZ(this,e,t<<24>>24)},setUint8:function(e,t){yZ(this,e,t<<24>>24)}},{unsafe:!0})}else Du=function(e){Yu(this,Ou);var t=Ju(e);Pu(this,{bytes:iZ(eZ(t),0),byteLength:t}),Wu||(this.byteLength=t)},Ou=Du.prototype,_u=function(e,t,i){Yu(this,qu),Yu(e,Ou);var n=wu(e).byteLength,l=Ku(t);if(l<0||l>n)throw tZ("Wrong offset");if(l+(i=void 0===i?n-l:Nu(i))>n)throw tZ("Wrong length");Pu(this,{buffer:e,byteLength:i,byteOffset:l}),Wu||(this.buffer=e,this.byteLength=i,this.byteOffset=l)},qu=_u.prototype,Wu&&(ZZ(Du,"byteLength"),ZZ(_u,"buffer"),ZZ(_u,"byteLength"),ZZ(_u,"byteOffset")),vu(qu,{getInt8:function(e){return bZ(this,1,e)[0]<<24>>24},getUint8:function(e){return bZ(this,1,e)[0]},getInt16:function(e){var t=bZ(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=bZ(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return sZ(bZ(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return sZ(bZ(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return oZ(bZ(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return oZ(bZ(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){hZ(this,1,e,cZ,t)},setUint8:function(e,t){hZ(this,1,e,cZ,t)},setInt16:function(e,t){hZ(this,2,e,aZ,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){hZ(this,2,e,aZ,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){hZ(this,4,e,dZ,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){hZ(this,4,e,dZ,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){hZ(this,4,e,rZ,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){hZ(this,8,e,uZ,t,arguments.length>2?arguments[2]:void 0)}});Bu(Du,Qu),Bu(_u,ju);var XZ={ArrayBuffer:Du,DataView:_u},VZ=Ie,WZ=Math.floor,CZ=Number.isInteger||function(e){return!VZ(e)&&isFinite(e)&&WZ(e)===e},RZ=sn,SZ=RangeError,vZ=function(e){var t=RZ(e);if(t<0)throw SZ("The argument can't be less than 0");return t},fZ=RangeError,YZ=function(e,t){var i=vZ(e);if(i%t)throw fZ("Wrong offset");return i},KZ=Ql,NZ=Ne,JZ=lc,UZ=G,LZ=gn,kZ=Io,HZ=ro,TZ=Ol,FZ=Tr.aTypedArrayConstructor,xZ=function(e){var t,i,n,l,o,c,a=JZ(this),d=UZ(e),s=arguments.length,r=s>1?arguments[1]:void 0,u=void 0!==r,Z=HZ(d);if(Z&&!TZ(Z))for(c=(o=kZ(d,Z)).next,d=[];!(l=NZ(c,o)).done;)d.push(l.value);for(u&&s>2&&(r=KZ(r,arguments[2])),i=LZ(d),n=new(FZ(a))(i),t=0;i>t;t++)n[t]=u?r(d[t],t):d[t];return n},BZ=Jt,AZ=Array.isArray||function(e){return"Array"==BZ(e)},zZ=ec,wZ=Ie,PZ=Ze("species"),QZ=Array,jZ=function(e){var t;return AZ(e)&&(t=e.constructor,(zZ(t)&&(t===QZ||AZ(t.prototype))||wZ(t)&&null===(t=t[PZ]))&&(t=void 0)),void 0===t?QZ:t},MZ=Ql,EZ=Tt,DZ=G,OZ=gn,_Z=function(e,t){return new(jZ(e))(0===t?0:t)},qZ=h([].push),$Z=function(e){var t=1==e,i=2==e,n=3==e,l=4==e,o=6==e,c=7==e,a=5==e||o;return function(d,s,r,u){for(var Z,b,h=DZ(d),m=EZ(h),p=MZ(s,r),I=OZ(m),g=0,G=u||_Z,y=t?G(d,I):i||c?G(d,0):void 0;I>g;g++)if((a||g in m)&&(b=p(Z=m[g],g,h),e))if(t)y[g]=b;else if(b)switch(e){case 3:return!0;case 5:return Z;case 6:return g;case 2:qZ(y,Z)}else switch(e){case 4:return!1;case 7:qZ(y,Z)}return o?-1:n||l?l:y}},eb={forEach:$Z(0),map:$Z(1),filter:$Z(2),some:$Z(3),every:$Z(4),find:$Z(5),findIndex:$Z(6),filterReject:$Z(7)},tb=w,ib=he,nb=me,lb=Ze("species"),ob=x,cb=Ie,ab=tr,db=cl,sb=o,rb=Ne,ub=me,Zb=Pr,bb=Tr,hb=XZ,mb=Dr,pb=ft,Ib=qt,gb=CZ,Gb=pn,yb=$r,Xb=YZ,Vb=ct,Wb=V,Cb=lo,Rb=Ie,Sb=Te,vb=Kl,fb=Je,Yb=tr,Kb=ln.f,Nb=xZ,Jb=eb.forEach,Ub=function(e){var t=tb(e),i=ib.f;nb&&t&&!t[lb]&&i(t,lb,{configurable:!0,get:function(){return this}})},Lb=he,kb=Wt,Hb=function(e,t,i){var n,l;return ab&&ob(n=t.constructor)&&n!==i&&cb(l=n.prototype)&&l!==i.prototype&&ab(e,l),e},Tb=xi.get,Fb=xi.set,xb=xi.enforce,Bb=Lb.f,Ab=kb.f,zb=Math.round,wb=sb.RangeError,Pb=hb.ArrayBuffer,Qb=Pb.prototype,jb=hb.DataView,Mb=bb.NATIVE_ARRAY_BUFFER_VIEWS,Eb=bb.TYPED_ARRAY_TAG,Db=bb.TypedArray,Ob=bb.TypedArrayPrototype,_b=bb.aTypedArrayConstructor,qb=bb.isTypedArray,$b="BYTES_PER_ELEMENT",eh="Wrong length",th=function(e,t){_b(e);for(var i=0,n=t.length,l=new e(n);n>i;)l[i]=t[i++];return l},ih=function(e,t){Bb(e,t,{get:function(){return Tb(this)[t]}})},nh=function(e){var t;return fb(Qb,e)||"ArrayBuffer"==(t=Cb(e))||"SharedArrayBuffer"==t},lh=function(e,t){return qb(e)&&!Sb(t)&&t in e&&gb(+t)&&t>=0},oh=function(e,t){return t=Vb(t),lh(e,t)?pb(2,e[t]):Ab(e,t)},ch=function(e,t,i){return t=Vb(t),!(lh(e,t)&&Rb(i)&&Wb(i,"value"))||Wb(i,"get")||Wb(i,"set")||i.configurable||Wb(i,"writable")&&!i.writable||Wb(i,"enumerable")&&!i.enumerable?Bb(e,t,i):(e[t]=i.value,e)};ub?(Mb||(kb.f=oh,Lb.f=ch,ih(Ob,"buffer"),ih(Ob,"byteOffset"),ih(Ob,"byteLength"),ih(Ob,"length")),db({target:"Object",stat:!0,forced:!Mb},{getOwnPropertyDescriptor:oh,defineProperty:ch}),Bs.exports=function(e,t,i){var n=e.match(/\d+$/)[0]/8,l=e+(i?"Clamped":"")+"Array",o="get"+e,c="set"+e,a=sb[l],d=a,s=d&&d.prototype,r={},u=function(e,t){Bb(e,t,{get:function(){return function(e,t){var i=Tb(e);return i.view[o](t*n+i.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,l){var o=Tb(e);i&&(l=(l=zb(l))<0?0:l>255?255:255&l),o.view[c](t*n+o.byteOffset,l,!0)}(this,t,e)},enumerable:!0})};Mb?Zb&&(d=t((function(e,t,i,l){return mb(e,s),Hb(Rb(t)?nh(t)?void 0!==l?new a(t,Xb(i,n),l):void 0!==i?new a(t,Xb(i,n)):new a(t):qb(t)?th(d,t):rb(Nb,d,t):new a(yb(t)),e,d)})),Yb&&Yb(d,Db),Jb(Kb(a),(function(e){e in d||Ib(d,e,a[e])})),d.prototype=s):(d=t((function(e,t,i,l){mb(e,s);var o,c,a,r=0,Z=0;if(Rb(t)){if(!nh(t))return qb(t)?th(d,t):rb(Nb,d,t);o=t,Z=Xb(i,n);var b=t.byteLength;if(void 0===l){if(b%n)throw wb(eh);if((c=b-Z)<0)throw wb(eh)}else if((c=Gb(l)*n)+Z>b)throw wb(eh);a=c/n}else a=yb(t),o=new Pb(c=a*n);for(Fb(e,{buffer:o,byteOffset:Z,byteLength:c,length:a,view:new jb(o)});r<a;)u(e,r++)})),Yb&&Yb(d,Db),s=d.prototype=vb(Ob)),s.constructor!==d&&Ib(s,"constructor",d),xb(s).TypedArrayConstructor=d,Eb&&Ib(s,Eb,l);var Z=d!=a;r[l]=d,db({global:!0,constructor:!0,forced:Z,sham:!Mb},r),$b in d||Ib(d,$b,n),$b in s||Ib(s,$b,n),Ub(l)}):Bs.exports=function(){},(0,Bs.exports)("Float32",(function(e){return function(t,i,n){return e(this,t,i,n)}})),(0,Bs.exports)("Float64",(function(e){return function(t,i,n){return e(this,t,i,n)}})),(0,Bs.exports)("Int8",(function(e){return function(t,i,n){return e(this,t,i,n)}})),(0,Bs.exports)("Int16",(function(e){return function(t,i,n){return e(this,t,i,n)}})),(0,Bs.exports)("Int32",(function(e){return function(t,i,n){return e(this,t,i,n)}})),(0,Bs.exports)("Uint8",(function(e){return function(t,i,n){return e(this,t,i,n)}})),(0,Bs.exports)("Uint8",(function(e){return function(t,i,n){return e(this,t,i,n)}}),!0),(0,Bs.exports)("Uint16",(function(e){return function(t,i,n){return e(this,t,i,n)}})),(0,Bs.exports)("Uint32",(function(e){return function(t,i,n){return e(this,t,i,n)}}));var ah=nt,dh=TypeError,sh=ru,rh=function(e){var t=ah(e,"number");if("number"==typeof t)throw dh("Can't convert number to bigint");return BigInt(t)},uh=lo,Zh=Ne,bh=a,hh=Tr.aTypedArray,mh=Tr.exportTypedArrayMethod,ph=h("".slice);mh("fill",(function(e){var t=arguments.length;hh(this);var i="Big"===ph(uh(this),0,3)?rh(e):+e;return Zh(sh,this,i,t>1?arguments[1]:void 0,t>2?arguments[2]:void 0)}),bh((function(){var e=0;return new Int8Array(2).fill({valueOf:function(){return e++}}),1!==e}))),(0,Tr.exportTypedArrayStaticMethod)("from",xZ,Pr);var Ih=Tr.aTypedArrayConstructor;(0,Tr.exportTypedArrayStaticMethod)("of",(function(){for(var e=0,t=arguments.length,i=new(Ih(this))(t);t>e;)i[e]=arguments[e++];return i}),Pr);var gh=o,Gh=Ne,yh=Tr,Xh=gn,Vh=YZ,Wh=G,Ch=a,Rh=gh.RangeError,Sh=gh.Int8Array,vh=Sh&&Sh.prototype,fh=vh&&vh.set,Yh=yh.aTypedArray,Kh=yh.exportTypedArrayMethod,Nh=!Ch((function(){var e=new Uint8ClampedArray(2);return Gh(fh,e,{length:1,0:3},1),3!==e[1]})),Jh=Nh&&yh.NATIVE_ARRAY_BUFFER_VIEWS&&Ch((function(){var e=new Sh(2);return e.set(1),e.set("2",1),0!==e[0]||2!==e[1]}));Kh("set",(function(e){Yh(this);var t=Vh(arguments.length>1?arguments[1]:void 0,1),i=Wh(e);if(Nh)return Gh(fh,this,i,t);var n=this.length,l=Xh(i),o=0;if(l+t>n)throw Rh("Wrong length");for(;o<l;)this[t+o]=i[o++]}),!Nh||Jh);var Uh=yu,Lh=Math.floor,kh=function(e,t){var i=e.length,n=Lh(i/2);return i<8?Hh(e,t):Th(e,kh(Uh(e,0,n),t),kh(Uh(e,n),t),t)},Hh=function(e,t){for(var i,n,l=e.length,o=1;o<l;){for(n=o,i=e[o];n&&t(e[n-1],i)>0;)e[n]=e[--n];n!==o++&&(e[n]=i)}return e},Th=function(e,t,i,n){for(var l=t.length,o=i.length,c=0,a=0;c<l||a<o;)e[c+a]=c<l&&a<o?n(t[c],i[a])<=0?t[c++]:i[a++]:c<l?t[c++]:i[a++];return e},Fh=kh,xh=P.match(/firefox\/(\d+)/i),Bh=!!xh&&+xh[1],Ah=/MSIE|Trident/.test(P),zh=P.match(/AppleWebKit\/(\d+)\./),wh=!!zh&&+zh[1],Ph=h,Qh=a,jh=we,Mh=Fh,Eh=Bh,Dh=Ah,Oh=_,_h=wh,qh=Tr.aTypedArray,$h=Tr.exportTypedArrayMethod,em=o.Uint16Array,tm=em&&Ph(em.prototype.sort),im=!(!tm||Qh((function(){tm(new em(2),null)}))&&Qh((function(){tm(new em(2),{})}))),nm=!!tm&&!Qh((function(){if(Oh)return Oh<74;if(Eh)return Eh<67;if(Dh)return!0;if(_h)return _h<602;var e,t,i=new em(516),n=Array(516);for(e=0;e<516;e++)t=e%4,i[e]=515-e,n[e]=e-2*t+3;for(tm(i,(function(e,t){return(e/4|0)-(t/4|0)})),e=0;e<516;e++)if(i[e]!==n[e])return!0}));$h("sort",(function(e){return void 0!==e&&jh(e),nm?tm(this,e):Mh(qh(this),function(e){return function(t,i){return void 0!==e?+e(t,i)||0:i!=i?-1:t!=t?1:0===t&&0===i?1/t>0&&1/i<0?1:-1:t>i}}(e))}),!nm||im);var lm=Xe("span").classList,om=lm&&lm.constructor&&lm.constructor.prototype,cm=om===Object.prototype?void 0:om,am=cl,dm=Ne,sm=x,rm=Za,um=Qc,Zm=tr,bm=oa,hm=qt,mm=nn,pm=jl,Im=oi.PROPER,gm=oi.CONFIGURABLE,Gm=ta.IteratorPrototype,ym=ta.BUGGY_SAFARI_ITERATORS,Xm=Ze("iterator"),Vm="keys",Wm="values",Cm="entries",Rm=function(){return this},Sm=function(e,t,i,n,l,o,c){rm(i,t,n);var a,d,s,r=function(e){if(e===l&&m)return m;if(!ym&&e in b)return b[e];switch(e){case Vm:case Wm:case Cm:return function(){return new i(this,e)}}return function(){return new i(this)}},u=t+" Iterator",Z=!1,b=e.prototype,h=b[Xm]||b["@@iterator"]||l&&b[l],m=!ym&&h||r(l),p="Array"==t&&b.entries||h;if(p&&(a=um(p.call(new e)))!==Object.prototype&&a.next&&(um(a)!==Gm&&(Zm?Zm(a,Gm):sm(a[Xm])||mm(a,Xm,Rm)),bm(a,u,!0)),Im&&l==Wm&&h&&h.name!==Wm&&(gm?hm(b,"name",Wm):(Z=!0,m=function(){return dm(h,this)})),l)if(d={values:r(Wm),keys:o?m:r(Vm),entries:r(Cm)},c)for(s in d)(ym||Z||!(s in b))&&mm(b,s,d[s]);else am({target:t,proto:!0,forced:ym||Z},d);return b[Xm]!==m&&mm(b,Xm,m,{name:l}),pm[t]=m,d},vm=Bt,fm=Hl,Ym=jl,Km=xi,Nm=he.f,Jm=Sm,Um=me,Lm="Array Iterator",km=Km.set,Hm=Km.getterFor(Lm),Tm=Jm(Array,"Array",(function(e,t){km(this,{type:Lm,target:vm(e),index:0,kind:t})}),(function(){var e=Hm(this),t=e.target,i=e.kind,n=e.index++;return!t||n>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==i?{value:n,done:!1}:"values"==i?{value:t[n],done:!1}:{value:[n,t[n]],done:!1}}),"values"),Fm=Ym.Arguments=Ym.Array;if(fm("keys"),fm("values"),fm("entries"),Um&&"values"!==Fm.name)try{Nm(Fm,"name",{value:"values"})}catch(e){}var xm=o,Bm={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},Am=cm,zm=Tm,wm=qt,Pm=Ze,Qm=Pm("iterator"),jm=Pm("toStringTag"),Mm=zm.values,Em=function(e,t){if(e){if(e[Qm]!==Mm)try{wm(e,Qm,Mm)}catch(t){e[Qm]=Mm}if(e[jm]||wm(e,jm,t),Bm[t])for(var i in zm)if(e[i]!==zm[i])try{wm(e,i,zm[i])}catch(t){e[i]=zm[i]}}};for(var Dm in Bm)Em(xm[Dm]&&xm[Dm].prototype,Dm);Em(Am,"DOMTokenList");var Om,_m,qm,$m,ep=h([].slice),tp=TypeError,ip=function(e,t){if(e<t)throw tp("Not enough arguments");return e},np=/(?:ipad|iphone|ipod).*applewebkit/i.test(P),lp="process"==Jt(o.process),op=o,cp=$d,ap=Ql,dp=x,sp=V,rp=a,up=gl,Zp=ep,bp=Xe,hp=ip,mp=np,pp=lp,Ip=op.setImmediate,gp=op.clearImmediate,Gp=op.process,yp=op.Dispatch,Xp=op.Function,Vp=op.MessageChannel,Wp=op.String,Cp=0,Rp={},Sp="onreadystatechange";try{Om=op.location}catch(e){}var vp=function(e){if(sp(Rp,e)){var t=Rp[e];delete Rp[e],t()}},fp=function(e){return function(){vp(e)}},Yp=function(e){vp(e.data)},Kp=function(e){op.postMessage(Wp(e),Om.protocol+"//"+Om.host)};Ip&&gp||(Ip=function(e){hp(arguments.length,1);var t=dp(e)?e:Xp(e),i=Zp(arguments,1);return Rp[++Cp]=function(){cp(t,void 0,i)},_m(Cp),Cp},gp=function(e){delete Rp[e]},pp?_m=function(e){Gp.nextTick(fp(e))}:yp&&yp.now?_m=function(e){yp.now(fp(e))}:Vp&&!mp?($m=(qm=new Vp).port2,qm.port1.onmessage=Yp,_m=ap($m.postMessage,$m)):op.addEventListener&&dp(op.postMessage)&&!op.importScripts&&Om&&"file:"!==Om.protocol&&!rp(Kp)?(_m=Kp,op.addEventListener("message",Yp,!1)):_m=Sp in bp("script")?function(e){up.appendChild(bp("script")).onreadystatechange=function(){up.removeChild(this),vp(e)}}:function(e){setTimeout(fp(e),0)});var Np={set:Ip,clear:gp},Jp=Np.clear;cl({global:!0,bind:!0,enumerable:!0,forced:o.clearImmediate!==Jp},{clearImmediate:Jp});var Up=Np.set;cl({global:!0,bind:!0,enumerable:!0,forced:o.setImmediate!==Up},{setImmediate:Up});var Lp=Ja.charAt,kp=ma,Hp=xi,Tp=Sm,Fp="String Iterator",xp=Hp.set,Bp=Hp.getterFor(Fp);Tp(String,"String",(function(e){xp(this,{type:Fp,string:kp(e),index:0})}),(function(){var e,t=Bp(this),i=t.string,n=t.index;return n>=i.length?{value:void 0,done:!0}:(e=Lp(i,n),t.index+=e.length,{value:e,done:!1})}));var Ap=a,zp=Ze("iterator"),wp=!Ap((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,i="";return e.pathname="c%20d",t.forEach((function(e,n){t.delete("b"),i+=n+e})),!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[zp]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==i||"x"!==new URL("http://x",void 0).host})),Pp=me,Qp=h,jp=Ne,Mp=a,Ep=rl,Dp=Un,Op=Ct,_p=G,qp=Tt,$p=Object.assign,eI=Object.defineProperty,tI=Qp([].concat),iI=!$p||Mp((function(){if(Pp&&1!==$p({b:1},$p(eI({},"a",{enumerable:!0,get:function(){eI(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},i=Symbol(),n="abcdefghijklmnopqrst";return e[i]=7,n.split("").forEach((function(e){t[e]=e})),7!=$p({},e)[i]||Ep($p({},t)).join("")!=n}))?function(e,t){for(var i=_p(e),n=arguments.length,l=1,o=Dp.f,c=Op.f;n>l;)for(var a,d=qp(arguments[l++]),s=o?tI(Ep(d),o(d)):Ep(d),r=s.length,u=0;r>u;)a=s[u++],Pp&&!jp(c,d,a)||(i[a]=d[a]);return i}:$p,nI=fe,lI=Xo,oI=Ql,cI=Ne,aI=G,dI=function(e,t,i,n){try{return n?t(nI(i)[0],i[1]):t(i)}catch(t){lI(e,"throw",t)}},sI=Ol,rI=ec,uI=gn,ZI=hu,bI=Io,hI=ro,mI=Array,pI=h,II=2147483647,gI=/[^\0-\u007E]/,GI=/[.\u3002\uFF0E\uFF61]/g,yI="Overflow: input needs wider integers to process",XI=RangeError,VI=pI(GI.exec),WI=Math.floor,CI=String.fromCharCode,RI=pI("".charCodeAt),SI=pI([].join),vI=pI([].push),fI=pI("".replace),YI=pI("".split),KI=pI("".toLowerCase),NI=function(e){return e+22+75*(e<26)},JI=function(e,t,i){var n=0;for(e=i?WI(e/700):e>>1,e+=WI(e/t);e>455;)e=WI(e/35),n+=36;return WI(n+36*e/(e+38))},UI=function(e){var t=[];e=function(e){for(var t=[],i=0,n=e.length;i<n;){var l=RI(e,i++);if(l>=55296&&l<=56319&&i<n){var o=RI(e,i++);56320==(64512&o)?vI(t,((1023&l)<<10)+(1023&o)+65536):(vI(t,l),i--)}else vI(t,l)}return t}(e);var i,n,l=e.length,o=128,c=0,a=72;for(i=0;i<e.length;i++)(n=e[i])<128&&vI(t,CI(n));var d=t.length,s=d;for(d&&vI(t,"-");s<l;){var r=II;for(i=0;i<e.length;i++)(n=e[i])>=o&&n<r&&(r=n);var u=s+1;if(r-o>WI((II-c)/u))throw XI(yI);for(c+=(r-o)*u,o=r,i=0;i<e.length;i++){if((n=e[i])<o&&++c>II)throw XI(yI);if(n==o){for(var Z=c,b=36;;){var h=b<=a?1:b>=a+26?26:b-a;if(Z<h)break;var m=Z-h,p=36-h;vI(t,CI(NI(h+m%p))),Z=WI(m/p),b+=36}vI(t,CI(NI(Z))),a=JI(c,u,s==d),c=0,s++}}c++,o++}return SI(t,"")},LI=cl,kI=o,HI=Ne,TI=h,FI=me,xI=wp,BI=nn,AI=jr,zI=oa,wI=Za,PI=xi,QI=Dr,jI=x,MI=V,EI=Ql,DI=lo,OI=fe,_I=Ie,qI=ma,$I=Kl,eg=ft,tg=Io,ig=ro,ng=ip,lg=Fh,og=Ze("iterator"),cg="URLSearchParams",ag="URLSearchParamsIterator",dg=PI.set,sg=PI.getterFor(cg),rg=PI.getterFor(ag),ug=Object.getOwnPropertyDescriptor,Zg=function(e){if(!FI)return kI[e];var t=ug(kI,e);return t&&t.value},bg=Zg("fetch"),hg=Zg("Request"),mg=Zg("Headers"),pg=hg&&hg.prototype,Ig=mg&&mg.prototype,gg=kI.RegExp,Gg=kI.TypeError,yg=kI.decodeURIComponent,Xg=kI.encodeURIComponent,Vg=TI("".charAt),Wg=TI([].join),Cg=TI([].push),Rg=TI("".replace),Sg=TI([].shift),vg=TI([].splice),fg=TI("".split),Yg=TI("".slice),Kg=/\+/g,Ng=Array(4),Jg=function(e){return Ng[e-1]||(Ng[e-1]=gg("((?:%[\\da-f]{2}){"+e+"})","gi"))},Ug=function(e){try{return yg(e)}catch(t){return e}},Lg=function(e){var t=Rg(e,Kg," "),i=4;try{return yg(t)}catch(e){for(;i;)t=Rg(t,Jg(i--),Ug);return t}},kg=/[!'()~]|%20/g,Hg={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},Tg=function(e){return Hg[e]},Fg=function(e){return Rg(Xg(e),kg,Tg)},xg=wI((function(e,t){dg(this,{type:ag,iterator:tg(sg(e).entries),kind:t})}),"Iterator",(function(){var e=rg(this),t=e.kind,i=e.iterator.next(),n=i.value;return i.done||(i.value="keys"===t?n.key:"values"===t?n.value:[n.key,n.value]),i}),!0),Bg=function(e){this.entries=[],this.url=null,void 0!==e&&(_I(e)?this.parseObject(e):this.parseQuery("string"==typeof e?"?"===Vg(e,0)?Yg(e,1):e:qI(e)))};Bg.prototype={type:cg,bindURL:function(e){this.url=e,this.update()},parseObject:function(e){var t,i,n,l,o,c,a,d=ig(e);if(d)for(i=(t=tg(e,d)).next;!(n=HI(i,t)).done;){if(o=(l=tg(OI(n.value))).next,(c=HI(o,l)).done||(a=HI(o,l)).done||!HI(o,l).done)throw Gg("Expected sequence with length 2");Cg(this.entries,{key:qI(c.value),value:qI(a.value)})}else for(var s in e)MI(e,s)&&Cg(this.entries,{key:s,value:qI(e[s])})},parseQuery:function(e){if(e)for(var t,i,n=fg(e,"&"),l=0;l<n.length;)(t=n[l++]).length&&(i=fg(t,"="),Cg(this.entries,{key:Lg(Sg(i)),value:Lg(Wg(i,"="))}))},serialize:function(){for(var e,t=this.entries,i=[],n=0;n<t.length;)e=t[n++],Cg(i,Fg(e.key)+"="+Fg(e.value));return Wg(i,"&")},update:function(){this.entries.length=0,this.parseQuery(this.url.query)},updateURL:function(){this.url&&this.url.update()}};var Ag=function(){QI(this,zg);var e=arguments.length>0?arguments[0]:void 0;dg(this,new Bg(e))},zg=Ag.prototype;if(AI(zg,{append:function(e,t){ng(arguments.length,2);var i=sg(this);Cg(i.entries,{key:qI(e),value:qI(t)}),i.updateURL()},delete:function(e){ng(arguments.length,1);for(var t=sg(this),i=t.entries,n=qI(e),l=0;l<i.length;)i[l].key===n?vg(i,l,1):l++;t.updateURL()},get:function(e){ng(arguments.length,1);for(var t=sg(this).entries,i=qI(e),n=0;n<t.length;n++)if(t[n].key===i)return t[n].value;return null},getAll:function(e){ng(arguments.length,1);for(var t=sg(this).entries,i=qI(e),n=[],l=0;l<t.length;l++)t[l].key===i&&Cg(n,t[l].value);return n},has:function(e){ng(arguments.length,1);for(var t=sg(this).entries,i=qI(e),n=0;n<t.length;)if(t[n++].key===i)return!0;return!1},set:function(e,t){ng(arguments.length,1);for(var i,n=sg(this),l=n.entries,o=!1,c=qI(e),a=qI(t),d=0;d<l.length;d++)(i=l[d]).key===c&&(o?vg(l,d--,1):(o=!0,i.value=a));o||Cg(l,{key:c,value:a}),n.updateURL()},sort:function(){var e=sg(this);lg(e.entries,(function(e,t){return e.key>t.key?1:-1})),e.updateURL()},forEach:function(e){for(var t,i=sg(this).entries,n=EI(e,arguments.length>1?arguments[1]:void 0),l=0;l<i.length;)n((t=i[l++]).value,t.key,this)},keys:function(){return new xg(this,"keys")},values:function(){return new xg(this,"values")},entries:function(){return new xg(this,"entries")}},{enumerable:!0}),BI(zg,og,zg.entries,{name:"entries"}),BI(zg,"toString",(function(){return sg(this).serialize()}),{enumerable:!0}),zI(Ag,cg),LI({global:!0,constructor:!0,forced:!xI},{URLSearchParams:Ag}),!xI&&jI(mg)){var wg=TI(Ig.has),Pg=TI(Ig.set),Qg=function(e){if(_I(e)){var t,i=e.body;if(DI(i)===cg)return t=e.headers?new mg(e.headers):new mg,wg(t,"content-type")||Pg(t,"content-type","application/x-www-form-urlencoded;charset=UTF-8"),$I(e,{body:eg(0,qI(i)),headers:eg(0,t)})}return e};if(jI(bg)&&LI({global:!0,enumerable:!0,dontCallGetSet:!0,forced:!0},{fetch:function(e){return bg(e,arguments.length>1?Qg(arguments[1]):{})}}),jI(hg)){var jg=function(e){return QI(this,pg),new hg(e,arguments.length>1?Qg(arguments[1]):{})};pg.constructor=jg,jg.prototype=pg,LI({global:!0,constructor:!0,dontCallGetSet:!0,forced:!0},{Request:jg})}}var Mg,Eg=cl,Dg=me,Og=wp,_g=o,qg=Ql,$g=h,eG=nn,tG=Cc,iG=Dr,nG=V,lG=iI,oG=function(e){var t=aI(e),i=rI(this),n=arguments.length,l=n>1?arguments[1]:void 0,o=void 0!==l;o&&(l=oI(l,n>2?arguments[2]:void 0));var c,a,d,s,r,u,Z=hI(t),b=0;if(!Z||this===mI&&sI(Z))for(c=uI(t),a=i?new this(c):mI(c);c>b;b++)u=o?l(t[b],b):t[b],ZI(a,b,u);else for(r=(s=bI(t,Z)).next,a=i?new this:[];!(d=cI(r,s)).done;b++)u=o?dI(s,l,[d.value,b],!0):d.value,ZI(a,b,u);return a.length=b,a},cG=yu,aG=Ja.codeAt,dG=function(e){var t,i,n=[],l=YI(fI(KI(e),GI,"."),".");for(t=0;t<l.length;t++)i=l[t],vI(n,VI(gI,i)?"xn--"+UI(i):i);return SI(n,".")},sG=ma,rG=oa,uG=ip,ZG={URLSearchParams:Ag,getState:sg},bG=xi,hG=bG.set,mG=bG.getterFor("URL"),pG=ZG.URLSearchParams,IG=ZG.getState,gG=_g.URL,GG=_g.TypeError,yG=_g.parseInt,XG=Math.floor,VG=Math.pow,WG=$g("".charAt),CG=$g(/./.exec),RG=$g([].join),SG=$g(1..toString),vG=$g([].pop),fG=$g([].push),YG=$g("".replace),KG=$g([].shift),NG=$g("".split),JG=$g("".slice),UG=$g("".toLowerCase),LG=$g([].unshift),kG="Invalid scheme",HG="Invalid host",TG="Invalid port",FG=/[a-z]/i,xG=/[\d+-.a-z]/i,BG=/\d/,AG=/^0x/i,zG=/^[0-7]+$/,wG=/^\d+$/,PG=/^[\da-f]+$/i,QG=/[\0\t\n\r #%/:<>?@[\\\]^|]/,jG=/[\0\t\n\r #/:<>?@[\\\]^|]/,MG=/^[\u0000-\u0020]+|[\u0000-\u0020]+$/g,EG=/[\t\n\r]/g,DG=function(e){var t,i,n,l;if("number"==typeof e){for(t=[],i=0;i<4;i++)LG(t,e%256),e=XG(e/256);return RG(t,".")}if("object"==typeof e){for(t="",n=function(e){for(var t=null,i=1,n=null,l=0,o=0;o<8;o++)0!==e[o]?(l>i&&(t=n,i=l),n=null,l=0):(null===n&&(n=o),++l);return l>i&&(t=n,i=l),t}(e),i=0;i<8;i++)l&&0===e[i]||(l&&(l=!1),n===i?(t+=i?":":"::",l=!0):(t+=SG(e[i],16),i<7&&(t+=":")));return"["+t+"]"}return e},OG={},_G=lG({},OG,{" ":1,'"':1,"<":1,">":1,"`":1}),qG=lG({},_G,{"#":1,"?":1,"{":1,"}":1}),$G=lG({},qG,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),ey=function(e,t){var i=aG(e,0);return i>32&&i<127&&!nG(t,e)?e:encodeURIComponent(e)},ty={ftp:21,file:null,http:80,https:443,ws:80,wss:443},iy=function(e,t){var i;return 2==e.length&&CG(FG,WG(e,0))&&(":"==(i=WG(e,1))||!t&&"|"==i)},ny=function(e){var t;return e.length>1&&iy(JG(e,0,2))&&(2==e.length||"/"===(t=WG(e,2))||"\\"===t||"?"===t||"#"===t)},ly=function(e){return"."===e||"%2e"===UG(e)},oy={},cy={},ay={},dy={},sy={},ry={},uy={},Zy={},by={},hy={},my={},py={},Iy={},gy={},Gy={},yy={},Xy={},Vy={},Wy={},Cy={},Ry={},Sy=function(e,t,i){var n,l,o,c=sG(e);if(t){if(l=this.parse(c))throw GG(l);this.searchParams=null}else{if(void 0!==i&&(n=new Sy(i,!0)),l=this.parse(c,null,n))throw GG(l);(o=IG(new pG)).bindURL(this),this.searchParams=o}};Sy.prototype={type:"URL",parse:function(e,t,i){var n,l,o,c,a,d=this,s=t||oy,r=0,u="",Z=!1,b=!1,h=!1;for(e=sG(e),t||(d.scheme="",d.username="",d.password="",d.host=null,d.port=null,d.path=[],d.query=null,d.fragment=null,d.cannotBeABaseURL=!1,e=YG(e,MG,"")),e=YG(e,EG,""),n=oG(e);r<=n.length;){switch(l=n[r],s){case oy:if(!l||!CG(FG,l)){if(t)return kG;s=ay;continue}u+=UG(l),s=cy;break;case cy:if(l&&(CG(xG,l)||"+"==l||"-"==l||"."==l))u+=UG(l);else{if(":"!=l){if(t)return kG;u="",s=ay,r=0;continue}if(t&&(d.isSpecial()!=nG(ty,u)||"file"==u&&(d.includesCredentials()||null!==d.port)||"file"==d.scheme&&!d.host))return;if(d.scheme=u,t)return void(d.isSpecial()&&ty[d.scheme]==d.port&&(d.port=null));u="","file"==d.scheme?s=gy:d.isSpecial()&&i&&i.scheme==d.scheme?s=dy:d.isSpecial()?s=Zy:"/"==n[r+1]?(s=sy,r++):(d.cannotBeABaseURL=!0,fG(d.path,""),s=Wy)}break;case ay:if(!i||i.cannotBeABaseURL&&"#"!=l)return kG;if(i.cannotBeABaseURL&&"#"==l){d.scheme=i.scheme,d.path=cG(i.path),d.query=i.query,d.fragment="",d.cannotBeABaseURL=!0,s=Ry;break}s="file"==i.scheme?gy:ry;continue;case dy:if("/"!=l||"/"!=n[r+1]){s=ry;continue}s=by,r++;break;case sy:if("/"==l){s=hy;break}s=Vy;continue;case ry:if(d.scheme=i.scheme,l==Mg)d.username=i.username,d.password=i.password,d.host=i.host,d.port=i.port,d.path=cG(i.path),d.query=i.query;else if("/"==l||"\\"==l&&d.isSpecial())s=uy;else if("?"==l)d.username=i.username,d.password=i.password,d.host=i.host,d.port=i.port,d.path=cG(i.path),d.query="",s=Cy;else{if("#"!=l){d.username=i.username,d.password=i.password,d.host=i.host,d.port=i.port,d.path=cG(i.path),d.path.length--,s=Vy;continue}d.username=i.username,d.password=i.password,d.host=i.host,d.port=i.port,d.path=cG(i.path),d.query=i.query,d.fragment="",s=Ry}break;case uy:if(!d.isSpecial()||"/"!=l&&"\\"!=l){if("/"!=l){d.username=i.username,d.password=i.password,d.host=i.host,d.port=i.port,s=Vy;continue}s=hy}else s=by;break;case Zy:if(s=by,"/"!=l||"/"!=WG(u,r+1))continue;r++;break;case by:if("/"!=l&&"\\"!=l){s=hy;continue}break;case hy:if("@"==l){Z&&(u="%40"+u),Z=!0,o=oG(u);for(var m=0;m<o.length;m++){var p=o[m];if(":"!=p||h){var I=ey(p,$G);h?d.password+=I:d.username+=I}else h=!0}u=""}else if(l==Mg||"/"==l||"?"==l||"#"==l||"\\"==l&&d.isSpecial()){if(Z&&""==u)return"Invalid authority";r-=oG(u).length+1,u="",s=my}else u+=l;break;case my:case py:if(t&&"file"==d.scheme){s=yy;continue}if(":"!=l||b){if(l==Mg||"/"==l||"?"==l||"#"==l||"\\"==l&&d.isSpecial()){if(d.isSpecial()&&""==u)return HG;if(t&&""==u&&(d.includesCredentials()||null!==d.port))return;if(c=d.parseHost(u))return c;if(u="",s=Xy,t)return;continue}"["==l?b=!0:"]"==l&&(b=!1),u+=l}else{if(""==u)return HG;if(c=d.parseHost(u))return c;if(u="",s=Iy,t==py)return}break;case Iy:if(!CG(BG,l)){if(l==Mg||"/"==l||"?"==l||"#"==l||"\\"==l&&d.isSpecial()||t){if(""!=u){var g=yG(u,10);if(g>65535)return TG;d.port=d.isSpecial()&&g===ty[d.scheme]?null:g,u=""}if(t)return;s=Xy;continue}return TG}u+=l;break;case gy:if(d.scheme="file","/"==l||"\\"==l)s=Gy;else{if(!i||"file"!=i.scheme){s=Vy;continue}if(l==Mg)d.host=i.host,d.path=cG(i.path),d.query=i.query;else if("?"==l)d.host=i.host,d.path=cG(i.path),d.query="",s=Cy;else{if("#"!=l){ny(RG(cG(n,r),""))||(d.host=i.host,d.path=cG(i.path),d.shortenPath()),s=Vy;continue}d.host=i.host,d.path=cG(i.path),d.query=i.query,d.fragment="",s=Ry}}break;case Gy:if("/"==l||"\\"==l){s=yy;break}i&&"file"==i.scheme&&!ny(RG(cG(n,r),""))&&(iy(i.path[0],!0)?fG(d.path,i.path[0]):d.host=i.host),s=Vy;continue;case yy:if(l==Mg||"/"==l||"\\"==l||"?"==l||"#"==l){if(!t&&iy(u))s=Vy;else if(""==u){if(d.host="",t)return;s=Xy}else{if(c=d.parseHost(u))return c;if("localhost"==d.host&&(d.host=""),t)return;u="",s=Xy}continue}u+=l;break;case Xy:if(d.isSpecial()){if(s=Vy,"/"!=l&&"\\"!=l)continue}else if(t||"?"!=l)if(t||"#"!=l){if(l!=Mg&&(s=Vy,"/"!=l))continue}else d.fragment="",s=Ry;else d.query="",s=Cy;break;case Vy:if(l==Mg||"/"==l||"\\"==l&&d.isSpecial()||!t&&("?"==l||"#"==l)){if(".."===(a=UG(a=u))||"%2e."===a||".%2e"===a||"%2e%2e"===a?(d.shortenPath(),"/"==l||"\\"==l&&d.isSpecial()||fG(d.path,"")):ly(u)?"/"==l||"\\"==l&&d.isSpecial()||fG(d.path,""):("file"==d.scheme&&!d.path.length&&iy(u)&&(d.host&&(d.host=""),u=WG(u,0)+":"),fG(d.path,u)),u="","file"==d.scheme&&(l==Mg||"?"==l||"#"==l))for(;d.path.length>1&&""===d.path[0];)KG(d.path);"?"==l?(d.query="",s=Cy):"#"==l&&(d.fragment="",s=Ry)}else u+=ey(l,qG);break;case Wy:"?"==l?(d.query="",s=Cy):"#"==l?(d.fragment="",s=Ry):l!=Mg&&(d.path[0]+=ey(l,OG));break;case Cy:t||"#"!=l?l!=Mg&&("'"==l&&d.isSpecial()?d.query+="%27":d.query+="#"==l?"%23":ey(l,OG)):(d.fragment="",s=Ry);break;case Ry:l!=Mg&&(d.fragment+=ey(l,_G))}r++}},parseHost:function(e){var t,i,n;if("["==WG(e,0)){if("]"!=WG(e,e.length-1))return HG;if(t=function(e){var t,i,n,l,o,c,a,d=[0,0,0,0,0,0,0,0],s=0,r=null,u=0,Z=function(){return WG(e,u)};if(":"==Z()){if(":"!=WG(e,1))return;u+=2,r=++s}for(;Z();){if(8==s)return;if(":"!=Z()){for(t=i=0;i<4&&CG(PG,Z());)t=16*t+yG(Z(),16),u++,i++;if("."==Z()){if(0==i)return;if(u-=i,s>6)return;for(n=0;Z();){if(l=null,n>0){if(!("."==Z()&&n<4))return;u++}if(!CG(BG,Z()))return;for(;CG(BG,Z());){if(o=yG(Z(),10),null===l)l=o;else{if(0==l)return;l=10*l+o}if(l>255)return;u++}d[s]=256*d[s]+l,2!=++n&&4!=n||s++}if(4!=n)return;break}if(":"==Z()){if(u++,!Z())return}else if(Z())return;d[s++]=t}else{if(null!==r)return;u++,r=++s}}if(null!==r)for(c=s-r,s=7;0!=s&&c>0;)a=d[s],d[s--]=d[r+c-1],d[r+--c]=a;else if(8!=s)return;return d}(JG(e,1,-1)),!t)return HG;this.host=t}else if(this.isSpecial()){if(e=dG(e),CG(QG,e))return HG;if(t=function(e){var t,i,n,l,o,c,a,d=NG(e,".");if(d.length&&""==d[d.length-1]&&d.length--,(t=d.length)>4)return e;for(i=[],n=0;n<t;n++){if(""==(l=d[n]))return e;if(o=10,l.length>1&&"0"==WG(l,0)&&(o=CG(AG,l)?16:8,l=JG(l,8==o?1:2)),""===l)c=0;else{if(!CG(10==o?wG:8==o?zG:PG,l))return e;c=yG(l,o)}fG(i,c)}for(n=0;n<t;n++)if(c=i[n],n==t-1){if(c>=VG(256,5-t))return null}else if(c>255)return null;for(a=vG(i),n=0;n<i.length;n++)a+=i[n]*VG(256,3-n);return a}(e),null===t)return HG;this.host=t}else{if(CG(jG,e))return HG;for(t="",i=oG(e),n=0;n<i.length;n++)t+=ey(i[n],OG);this.host=t}},cannotHaveUsernamePasswordPort:function(){return!this.host||this.cannotBeABaseURL||"file"==this.scheme},includesCredentials:function(){return""!=this.username||""!=this.password},isSpecial:function(){return nG(ty,this.scheme)},shortenPath:function(){var e=this.path,t=e.length;!t||"file"==this.scheme&&1==t&&iy(e[0],!0)||e.length--},serialize:function(){var e=this,t=e.scheme,i=e.username,n=e.password,l=e.host,o=e.port,c=e.path,a=e.query,d=e.fragment,s=t+":";return null!==l?(s+="//",e.includesCredentials()&&(s+=i+(n?":"+n:"")+"@"),s+=DG(l),null!==o&&(s+=":"+o)):"file"==t&&(s+="//"),s+=e.cannotBeABaseURL?c[0]:c.length?"/"+RG(c,"/"):"",null!==a&&(s+="?"+a),null!==d&&(s+="#"+d),s},setHref:function(e){var t=this.parse(e);if(t)throw GG(t);this.searchParams.update()},getOrigin:function(){var e=this.scheme,t=this.port;if("blob"==e)try{return new vy(e.path[0]).origin}catch(e){return"null"}return"file"!=e&&this.isSpecial()?e+"://"+DG(this.host)+(null!==t?":"+t:""):"null"},getProtocol:function(){return this.scheme+":"},setProtocol:function(e){this.parse(sG(e)+":",oy)},getUsername:function(){return this.username},setUsername:function(e){var t=oG(sG(e));if(!this.cannotHaveUsernamePasswordPort()){this.username="";for(var i=0;i<t.length;i++)this.username+=ey(t[i],$G)}},getPassword:function(){return this.password},setPassword:function(e){var t=oG(sG(e));if(!this.cannotHaveUsernamePasswordPort()){this.password="";for(var i=0;i<t.length;i++)this.password+=ey(t[i],$G)}},getHost:function(){var e=this.host,t=this.port;return null===e?"":null===t?DG(e):DG(e)+":"+t},setHost:function(e){this.cannotBeABaseURL||this.parse(e,my)},getHostname:function(){var e=this.host;return null===e?"":DG(e)},setHostname:function(e){this.cannotBeABaseURL||this.parse(e,py)},getPort:function(){var e=this.port;return null===e?"":sG(e)},setPort:function(e){this.cannotHaveUsernamePasswordPort()||(""==(e=sG(e))?this.port=null:this.parse(e,Iy))},getPathname:function(){var e=this.path;return this.cannotBeABaseURL?e[0]:e.length?"/"+RG(e,"/"):""},setPathname:function(e){this.cannotBeABaseURL||(this.path=[],this.parse(e,Xy))},getSearch:function(){var e=this.query;return e?"?"+e:""},setSearch:function(e){""==(e=sG(e))?this.query=null:("?"==WG(e,0)&&(e=JG(e,1)),this.query="",this.parse(e,Cy)),this.searchParams.update()},getSearchParams:function(){return this.searchParams.facade},getHash:function(){var e=this.fragment;return e?"#"+e:""},setHash:function(e){""!=(e=sG(e))?("#"==WG(e,0)&&(e=JG(e,1)),this.fragment="",this.parse(e,Ry)):this.fragment=null},update:function(){this.query=this.searchParams.serialize()||null}};var vy=function(e){var t=iG(this,fy),i=uG(arguments.length,1)>1?arguments[1]:void 0,n=hG(t,new Sy(e,!1,i));Dg||(t.href=n.serialize(),t.origin=n.getOrigin(),t.protocol=n.getProtocol(),t.username=n.getUsername(),t.password=n.getPassword(),t.host=n.getHost(),t.hostname=n.getHostname(),t.port=n.getPort(),t.pathname=n.getPathname(),t.search=n.getSearch(),t.searchParams=n.getSearchParams(),t.hash=n.getHash())},fy=vy.prototype,Yy=function(e,t){return{get:function(){return mG(this)[e]()},set:t&&function(e){return mG(this)[t](e)},configurable:!0,enumerable:!0}};if(Dg&&(tG(fy,"href",Yy("serialize","setHref")),tG(fy,"origin",Yy("getOrigin")),tG(fy,"protocol",Yy("getProtocol","setProtocol")),tG(fy,"username",Yy("getUsername","setUsername")),tG(fy,"password",Yy("getPassword","setPassword")),tG(fy,"host",Yy("getHost","setHost")),tG(fy,"hostname",Yy("getHostname","setHostname")),tG(fy,"port",Yy("getPort","setPort")),tG(fy,"pathname",Yy("getPathname","setPathname")),tG(fy,"search",Yy("getSearch","setSearch")),tG(fy,"searchParams",Yy("getSearchParams")),tG(fy,"hash",Yy("getHash","setHash"))),eG(fy,"toJSON",(function(){return mG(this).serialize()}),{enumerable:!0}),eG(fy,"toString",(function(){return mG(this).serialize()}),{enumerable:!0}),gG){var Ky=gG.createObjectURL,Ny=gG.revokeObjectURL;Ky&&eG(vy,"createObjectURL",qg(Ky,gG)),Ny&&eG(vy,"revokeObjectURL",qg(Ny,gG))}rG(vy,"URL"),Eg({global:!0,constructor:!0,forced:!Og,sham:!Dg},{URL:vy});var Jy=Ne;function Uy(e,t,i,n){return new(i||(i=Promise))((function(l,o){function c(e){try{d(n.next(e))}catch(e){o(e)}}function a(e){try{d(n.throw(e))}catch(e){o(e)}}function d(e){var t;e.done?l(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(c,a)}d((n=n.apply(e,t||[])).next())}))}function Ly(e,t,i,n){return new(i||(i=Promise))((function(l,o){function c(e){try{d(n.next(e))}catch(e){o(e)}}function a(e){try{d(n.throw(e))}catch(e){o(e)}}function d(e){var t;e.done?l(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(c,a)}d((n=n.apply(e,t||[])).next())}))}cl({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return Jy(URL.prototype.toString,this)}}),e.ResponseMode=void 0,function(e){e.formPost="form_post",e.query="query",e.direct="direct"}(e.ResponseMode||(e.ResponseMode={}));e.Stores=void 0,function(e){e.ConfigData="config_data",e.OIDCProviderMetaData="oidc_provider_meta_data",e.SessionData="session_data",e.TemporaryData="temporary_data"}(e.Stores||(e.Stores={}));const ky="refresh_token_timer",Hy=["RS256","RS512","RS384","PS256"],Ty="code",Fy="session_state",xy="sign_out_url",By="sign_out_success",Ay="state";var zy;!function(e){e.Include="include",e.SameOrigin="same-origin",e.Omit="omit"}(zy||(zy={}));class wy{constructor(e,t,i){this.message=i,this.name=t,this.code=e,Object.setPrototypeOf(this,new.target.prototype)}}class Py{constructor(){}static filterClaimsFromIDTokenPayload(e){const t=Object.assign({},e);null==t||delete t.iss,null==t||delete t.aud,null==t||delete t.exp,null==t||delete t.iat,null==t||delete t.acr,null==t||delete t.amr,null==t||delete t.azp,null==t||delete t.auth_time,null==t||delete t.nonce,null==t||delete t.c_hash,null==t||delete t.at_hash,null==t||delete t.nbf,null==t||delete t.isk,null==t||delete t.sid;const i={};return Object.entries(t).forEach((e=>{let[t,n]=e;const l=t.split("_").map(((e,t)=>0===t?e:[e[0].toUpperCase(),...e.slice(1)].join(""))).join("");i[l]=n})),i}static getTokenRequestHeaders(){return{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded"}}static generateStateParamForRequestCorrelation(e,t){const i=parseInt(e.split("#")[1]);return t?"".concat(t,"_request_").concat(i):"request_".concat(i)}static extractPKCEKeyFromStateParam(e){return"pkce_code_verifier#".concat(parseInt(e.split("request_")[1]))}}Py.getTenantDomainFromIdTokenPayload=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"@";const i=e.sub.split(t);return i.length>2?i[i.length-1]:""};class Qy{constructor(e,t){this._dataLayer=e,this._config=()=>Ly(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>Ly(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()})),this._cryptoHelper=t}resolveEndpoints(e){return Ly(this,void 0,void 0,(function*(){const t={},i=yield this._config();return i.endpoints&&Object.keys(i.endpoints).forEach((e=>{const n=e.replace(/[A-Z]/g,(e=>"_".concat(e.toLowerCase())));t[n]=(null==i?void 0:i.endpoints)?i.endpoints[e]:""})),Object.assign(Object.assign({},e),t)}))}resolveEndpointsExplicitly(){return Ly(this,void 0,void 0,(function*(){const e={},t=yield this._config();if(!t.endpoints||!["authorization_endpoint","end_session_endpoint","jwks_uri","check_session_iframe","revocation_endpoint","token_endpoint","issuer","userinfo_endpoint"].every((e=>!!t.endpoints&&Object.keys(t.endpoints).some((t=>t.replace(/[A-Z]/g,(e=>"_".concat(e.toLowerCase())))===e)))))throw new wy("JS-AUTH_HELPER-REE-NF01","Required endpoints missing","Some or all of the required endpoints are missing in the object passed to the `endpoints` attribute of the`AuthConfig` object.");return t.endpoints&&Object.keys(t.endpoints).forEach((i=>{const n=i.replace(/[A-Z]/g,(e=>"_".concat(e.toLowerCase())));e[n]=(null==t?void 0:t.endpoints)?t.endpoints[i]:""})),Object.assign({},e)}))}resolveEndpointsByBaseURL(){return Ly(this,void 0,void 0,(function*(){const e={},t=yield this._config(),i=t.baseUrl;if(!i)throw new wy("JS-AUTH_HELPER_REBO-NF01","Base URL not defined.","Base URL is not defined in AuthClient config.");t.endpoints&&Object.keys(t.endpoints).forEach((i=>{const n=i.replace(/[A-Z]/g,(e=>"_".concat(e.toLowerCase())));e[n]=(null==t?void 0:t.endpoints)?t.endpoints[i]:""}));const n={authorization_endpoint:"".concat(i).concat("/oauth2/authorize"),end_session_endpoint:"".concat(i).concat("/oidc/logout"),issuer:"".concat(i).concat("/oauth2/token"),jwks_uri:"".concat(i).concat("/oauth2/jwks"),check_session_iframe:"".concat(i).concat("/oidc/checksession"),revocation_endpoint:"".concat(i).concat("/oauth2/revoke"),token_endpoint:"".concat(i).concat("/oauth2/token"),userinfo_endpoint:"".concat(i).concat("/oauth2/userinfo")};return Object.assign(Object.assign({},n),e)}))}validateIdToken(e){var t;return Ly(this,void 0,void 0,(function*(){const i=(yield this._dataLayer.getOIDCProviderMetaData()).jwks_uri,n=yield this._config();if(!i||0===i.trim().length)throw new wy("JS_AUTH_HELPER-VIT-NF01","JWKS endpoint not found.","No JWKS endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the JWKS endpoint passed to the SDK is empty.");let l;try{l=yield fetch(i,{credentials:n.sendCookiesInRequests?zy.Include:zy.SameOrigin})}catch(i){throw new wy("JS-AUTH_HELPER-VIT-NE02","Request to jwks endpoint failed.",null!=i?i:"The request sent to get the jwks from the server failed.")}if(200!==l.status||!l.ok)throw new wy("JS-AUTH_HELPER-VIT-HE03","Invalid response status received for jwks request (".concat(l.statusText,")."),yield l.json());const o=(yield this._oidcProviderMetaData()).issuer,{keys:c}=yield l.json(),a=yield this._cryptoHelper.getJWKForTheIdToken(e.split(".")[0],c);return this._cryptoHelper.isValidIdToken(e,a,(yield this._config()).clientID,null!=o?o:"",this._cryptoHelper.decodeIDToken(e).sub,(yield this._config()).clockTolerance,null===(t=(yield this._config()).validateIDTokenIssuer)||void 0===t||t)}))}getAuthenticatedUserInfo(e){var t,i,n,l;const o=this._cryptoHelper.decodeIDToken(e),c=Py.getTenantDomainFromIdTokenPayload(o),a=null!==(t=null==o?void 0:o.username)&&void 0!==t?t:"",d=null!==(i=o.given_name)&&void 0!==i?i:"",s=null!==(n=o.family_name)&&void 0!==n?n:"",r=d&&s?"".concat(d," ").concat(s):d||s||"",u=null!==(l=o.preferred_username)&&void 0!==l?l:r;return Object.assign({displayName:u,tenantDomain:c,username:a},Py.filterClaimsFromIDTokenPayload(o))}replaceCustomGrantTemplateTags(e,t){var i;return Ly(this,void 0,void 0,(function*(){let n="openid";const l=yield this._config(),o=yield this._dataLayer.getSessionData(t);return l.scope&&l.scope.length>0&&(l.scope.includes("openid")||l.scope.push("openid"),n=l.scope.join(" ")),e.replace("{{token}}",o.access_token).replace("{{username}}",this.getAuthenticatedUserInfo(o.id_token).username).replace("{{scope}}",n).replace("{{clientID}}",l.clientID).replace("{{clientSecret}}",null!==(i=l.clientSecret)&&void 0!==i?i:"")}))}clearUserSessionData(e){return Ly(this,void 0,void 0,(function*(){yield this._dataLayer.removeTemporaryData(e),yield this._dataLayer.removeSessionData(e)}))}handleTokenResponse(e,t){return Ly(this,void 0,void 0,(function*(){if(200!==e.status||!e.ok)throw new wy("JS-AUTH_HELPER-HTR-NE01","Invalid response status received for token request (".concat(e.statusText,")."),yield e.json());const i=yield e.json();if(i.created_at=(new Date).getTime(),(yield this._config()).validateIDToken)return this.validateIdToken(i.id_token).then((()=>Ly(this,void 0,void 0,(function*(){yield this._dataLayer.setSessionData(i,t);const e={accessToken:i.access_token,createdAt:i.created_at,expiresIn:i.expires_in,idToken:i.id_token,refreshToken:i.refresh_token,scope:i.scope,tokenType:i.token_type};return Promise.resolve(e)}))));{const e={accessToken:i.access_token,createdAt:i.created_at,expiresIn:i.expires_in,idToken:i.id_token,refreshToken:i.refresh_token,scope:i.scope,tokenType:i.token_type};return yield this._dataLayer.setSessionData(i,t),Promise.resolve(e)}}))}generatePKCEKey(e){var t;return Ly(this,void 0,void 0,(function*(){const i=yield this._dataLayer.getTemporaryData(e),n=[];Object.keys(i).forEach((e=>{e.startsWith("pkce_code_verifier")&&n.push(e)}));const l=n.sort().pop();return"pkce_code_verifier#".concat(parseInt(null!==(t=null==l?void 0:l.split("#")[1])&&void 0!==t?t:"-1")+1)}))}}class jy{constructor(e){this._cryptoUtils=e}getCodeVerifier(){return this._cryptoUtils.base64URLEncode(this._cryptoUtils.generateRandomBytes(32))}getCodeChallenge(e){return this._cryptoUtils.base64URLEncode(this._cryptoUtils.hashSha256(e))}getJWKForTheIdToken(e,t){const i=JSON.parse(this._cryptoUtils.base64URLDecode(e));for(const e of t)if(i.kid===e.kid)return e;throw new wy("JS-CRYPTO_UTIL-GJFTIT-IV01","kid not found.","Failed to find the 'kid' specified in the id_token. 'kid' found in the header : "+i.kid+", Expected values: "+t.map((e=>e.kid)).join(", "))}isValidIdToken(e,t,i,n,l,o,c){return this._cryptoUtils.verifyJwt(e,t,Hy,i,n,l,o,c).then((e=>e?Promise.resolve(!0):Promise.reject(new wy("JS-CRYPTO_HELPER-IVIT-IV01","Invalid ID token.","ID token validation returned false"))))}decodeIDToken(e){try{const t=this._cryptoUtils.base64URLDecode(e.split(".")[1]);return JSON.parse(t)}catch(e){throw new wy("JS-CRYPTO_UTIL-DIT-IV01","Decoding ID token failed.",e)}}}class My{constructor(e,t){this._cryptoUtils=t,this._cryptoHelper=new jy(t),this._authenticationHelper=new Qy(e,this._cryptoHelper),this._dataLayer=e,this._config=()=>Ly(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>Ly(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()}))}getAuthorizationURLParams(e,t){var i,n,l;return Ly(this,void 0,void 0,(function*(){const o=yield this._config(),c=new Map;c.set("response_type","code"),c.set("client_id",o.clientID),o.clientSecret&&o.clientSecret.trim().length>0&&c.set("client_secret",o.clientSecret);let a="openid";o.scope&&o.scope.length>0&&(o.scope.includes("openid")||o.scope.push("openid"),a=o.scope.join(" ")),c.set("scope",a),c.set("redirect_uri",o.signInRedirectURL),o.responseMode&&c.set("response_mode",o.responseMode);const d=yield this._authenticationHelper.generatePKCEKey(t);if(o.enablePKCE){const e=null===(i=this._cryptoHelper)||void 0===i?void 0:i.getCodeVerifier(),l=null===(n=this._cryptoHelper)||void 0===n?void 0:n.getCodeChallenge(e);yield this._dataLayer.setTemporaryDataParameter(d,e,t),c.set("code_challenge_method","S256"),c.set("code_challenge",l)}o.prompt&&c.set("prompt",o.prompt);const s=e;if(s)for(const[e,t]of Object.entries(s))""!=e&&""!=t&&"state"!==e&&c.set(e,t.toString());return c.set("state",Py.generateStateParamForRequestCorrelation(d,s?null===(l=s.state)||void 0===l?void 0:l.toString():"")),c}))}getAuthorizationURL(e,t){return Ly(this,void 0,void 0,(function*(){const i=yield this._dataLayer.getOIDCProviderMetaDataParameter("authorization_endpoint");if(!i||0===i.trim().length)throw new wy("JS-AUTH_CORE-GAU-NF01","No authorization endpoint found.","No authorization endpoint was found in the OIDC provider meta data from the well-known endpoint or the authorization endpoint passed to the SDK is empty.");const n=new URL(i),l=yield this.getAuthorizationURLParams(e,t);for(const[e,t]of l.entries())n.searchParams.append(e,t);return n.toString()}))}requestAccessToken(e,t,i,n,l){return Ly(this,void 0,void 0,(function*(){const o=(yield this._oidcProviderMetaData()).token_endpoint,c=yield this._config();if(!o||0===o.trim().length)throw new wy("JS-AUTH_CORE-RAT1-NF01","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty.");t&&(yield this._dataLayer.setSessionDataParameter("session_state",t,n));const a=new URLSearchParams;a.set("client_id",c.clientID),c.clientSecret&&c.clientSecret.trim().length>0&&a.set("client_secret",c.clientSecret);const d=e;let s;a.set("code",d),a.set("grant_type","authorization_code"),a.set("redirect_uri",c.signInRedirectURL),(null==l?void 0:l.params)&&Object.entries(l.params).forEach((e=>{let[t,i]=e;a.append(t,i)})),c.enablePKCE&&(a.set("code_verifier","".concat(yield this._dataLayer.getTemporaryDataParameter(Py.extractPKCEKeyFromStateParam(i),n))),yield this._dataLayer.removeTemporaryDataParameter(Py.extractPKCEKeyFromStateParam(i),n));try{s=yield fetch(o,{body:a,credentials:c.sendCookiesInRequests?zy.Include:zy.SameOrigin,headers:new Headers(Py.getTokenRequestHeaders()),method:"POST"})}catch(o){throw new wy("JS-AUTH_CORE-RAT1-NE02","Requesting access token failed",null!=o?o:"The request to get the access token from the server failed.")}if(!s.ok)throw new wy("JS-AUTH_CORE-RAT1-HE03","Requesting access token failed with ".concat(s.statusText),yield s.json());return yield this._authenticationHelper.handleTokenResponse(s,n)}))}refreshAccessToken(e){return Ly(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).token_endpoint,i=yield this._config(),n=yield this._dataLayer.getSessionData(e);if(!n.refresh_token)throw new wy("JS-AUTH_CORE-RAT2-NF01","No refresh token found.","There was no refresh token found. Asgardeo doesn't return a refresh token if the refresh token grant is not enabled.");if(!t||0===t.trim().length)throw new wy("JS-AUTH_CORE-RAT2-NF02","No refresh token endpoint found.","No refresh token endpoint was in the OIDC provider meta data returned by the well-known endpoint or the refresh token endpoint passed to the SDK is empty.");const l=[];let o;l.push("client_id=".concat(i.clientID)),l.push("refresh_token=".concat(n.refresh_token)),l.push("grant_type=refresh_token"),i.clientSecret&&i.clientSecret.trim().length>0&&l.push("client_secret=".concat(i.clientSecret));try{o=yield fetch(t,{body:l.join("&"),credentials:i.sendCookiesInRequests?zy.Include:zy.SameOrigin,headers:new Headers(Py.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new wy("JS-AUTH_CORE-RAT2-NR03","Refresh access token request failed.",null!=t?t:"The request to refresh the access token failed.")}if(!o.ok)throw new wy("JS-AUTH_CORE-RAT2-HE04","Refreshing access token failed with ".concat(o.statusText),yield o.json());return this._authenticationHelper.handleTokenResponse(o,e)}))}revokeAccessToken(e){return Ly(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).revocation_endpoint,i=yield this._config();if(!t||0===t.trim().length)throw new wy("JS-AUTH_CORE-RAT3-NF01","No revoke access token endpoint found.","No revoke access token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the revoke access token endpoint passed to the SDK is empty.");const n=[];let l;n.push("client_id=".concat(i.clientID)),n.push("token=".concat((yield this._dataLayer.getSessionData(e)).access_token)),n.push("token_type_hint=access_token");try{l=yield fetch(t,{body:n.join("&"),credentials:i.sendCookiesInRequests?zy.Include:zy.SameOrigin,headers:new Headers(Py.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new wy("JS-AUTH_CORE-RAT3-NE02","The request to revoke access token failed.",null!=t?t:"The request sent to revoke the access token failed.")}if(200!==l.status||!l.ok)throw new wy("JS-AUTH_CORE-RAT3-HE03","Invalid response status received for revoke access token request (".concat(l.statusText,")."),yield l.json());return this._authenticationHelper.clearUserSessionData(e),Promise.resolve(l)}))}requestCustomGrant(e,t){return Ly(this,void 0,void 0,(function*(){const i=yield this._oidcProviderMetaData(),n=yield this._config();let l;if(l=e.tokenEndpoint&&0!==e.tokenEndpoint.trim().length?e.tokenEndpoint:i.token_endpoint,!l||0===l.trim().length)throw new wy("JS-AUTH_CORE-RCG-NF01","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty.");const o=yield Promise.all(Object.entries(e.data).map((e=>{let[i,n]=e;return Ly(this,void 0,void 0,(function*(){const e=yield this._authenticationHelper.replaceCustomGrantTemplateTags(n,t);return"".concat(i,"=").concat(e)}))})));let c=Object.assign({},Py.getTokenRequestHeaders());e.attachToken&&(c=Object.assign(Object.assign({},c),{Authorization:"Bearer ".concat((yield this._dataLayer.getSessionData(t)).access_token)}));const a={body:o.join("&"),credentials:n.sendCookiesInRequests?zy.Include:zy.SameOrigin,headers:new Headers(c),method:"POST"};let d;try{d=yield fetch(l,a)}catch(e){throw new wy("JS-AUTH_CORE-RCG-NE02","The custom grant request failed.",null!=e?e:"The request sent to get the custom grant failed.")}if(200!==d.status||!d.ok)throw new wy("JS-AUTH_CORE-RCG-HE03","Invalid response status received for the custom grant request. (".concat(d.statusText,")"),yield d.json());return e.returnsSession?this._authenticationHelper.handleTokenResponse(d,t):Promise.resolve(yield d.json())}))}getBasicUserInfo(e){return Ly(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getSessionData(e),i=this._authenticationHelper.getAuthenticatedUserInfo(null==t?void 0:t.id_token);let n={allowedScopes:t.scope,sessionState:t.session_state};return Object.keys(i).forEach((e=>{void 0!==i[e]&&""!==i[e]&&null!==i[e]||delete i[e]})),n=Object.assign(Object.assign({},n),i),n}))}getDecodedIDToken(e){return Ly(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getSessionData(e)).id_token;return this._cryptoHelper.decodeIDToken(t)}))}getCryptoHelper(){return Ly(this,void 0,void 0,(function*(){return this._cryptoHelper}))}getIDToken(e){return Ly(this,void 0,void 0,(function*(){return(yield this._dataLayer.getSessionData(e)).id_token}))}getOIDCProviderMetaData(e){return Ly(this,void 0,void 0,(function*(){const t=yield this._config();if(!e&&(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated")))return Promise.resolve();const i=t.wellKnownEndpoint;if(i){let e;try{if(e=yield fetch(i),200!==e.status||!e.ok)throw new Error}catch(t){throw new wy("JS-AUTH_CORE-GOPMD-HE01","Invalid well-known response","The well known endpoint response has been failed with an error.")}return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpoints(yield e.json())),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}if(t.baseUrl){try{yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsByBaseURL())}catch(t){throw new wy("JS-AUTH_CORE-GOPMD-IV02","Resolving endpoints failed.",null!=t?t:"Resolving endpoints by base url failed.")}return yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsExplicitly()),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}))}getOIDCServiceEndpoints(){var e,t,i,n,l,o,c,a,d,s;return Ly(this,void 0,void 0,(function*(){const r=yield this._oidcProviderMetaData();return{authorizationEndpoint:null!==(e=r.authorization_endpoint)&&void 0!==e?e:"",checkSessionIframe:null!==(t=r.check_session_iframe)&&void 0!==t?t:"",endSessionEndpoint:null!==(i=r.end_session_endpoint)&&void 0!==i?i:"",introspectionEndpoint:null!==(n=r.introspection_endpoint)&&void 0!==n?n:"",issuer:null!==(l=r.issuer)&&void 0!==l?l:"",jwksUri:null!==(o=r.jwks_uri)&&void 0!==o?o:"",registrationEndpoint:null!==(c=r.registration_endpoint)&&void 0!==c?c:"",revocationEndpoint:null!==(a=r.revocation_endpoint)&&void 0!==a?a:"",tokenEndpoint:null!==(d=r.token_endpoint)&&void 0!==d?d:"",userinfoEndpoint:null!==(s=r.userinfo_endpoint)&&void 0!==s?s:""}}))}getSignOutURL(e){var t,i,n;return Ly(this,void 0,void 0,(function*(){const l=null===(t=yield this._oidcProviderMetaData())||void 0===t?void 0:t.end_session_endpoint,o=yield this._config();if(!l||0===l.trim().length)throw new wy("JS-AUTH_CORE-GSOU-NF01","Sign-out endpoint not found.","No sign-out endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the sign-out endpoint passed to the SDK is empty.");const c=null!==(i=null==o?void 0:o.signOutRedirectURL)&&void 0!==i?i:null==o?void 0:o.signInRedirectURL;if(!c||0===c.trim().length)throw new wy("JS-AUTH_CORE-GSOU-NF03","No sign-out redirect URL found.","The sign-out redirect URL cannot be found or the URL passed to the SDK is empty. No sign-in redirect URL has been found either. ");const a=new URLSearchParams;if(a.set("post_logout_redirect_uri",c),o.sendIdTokenInLogoutRequest){const t=null===(n=yield this._dataLayer.getSessionData(e))||void 0===n?void 0:n.id_token;if(!t||0===t.trim().length)throw new wy("JS-AUTH_CORE-GSOU-NF02","ID token not found.","No ID token could be found. Either the session information is lost or you have not signed in.");a.set("id_token_hint",t)}else a.set("client_id",o.clientID);return a.set("state","sign_out_success"),"".concat(l,"?").concat(a.toString())}))}clearUserSessionData(e){return Ly(this,void 0,void 0,(function*(){yield this._authenticationHelper.clearUserSessionData(e)}))}getAccessToken(e){var t;return Ly(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData(e))||void 0===t?void 0:t.access_token}))}getCreatedAt(e){var t;return Ly(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData(e))||void 0===t?void 0:t.created_at}))}getExpiresIn(e){var t;return Ly(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData(e))||void 0===t?void 0:t.expires_in}))}isAuthenticated(e){return Ly(this,void 0,void 0,(function*(){const t=Boolean(yield this.getAccessToken(e)),i=yield this.getCreatedAt(e),n=yield this.getExpiresIn(e);if(!n)return!1;const l=1e3*parseInt(n),o=(new Date).getTime();return t&&i+l>o}))}getPKCECode(e,t){return Ly(this,void 0,void 0,(function*(){return yield this._dataLayer.getTemporaryDataParameter(Py.extractPKCEKeyFromStateParam(e),t)}))}setPKCECode(e,t,i){return Ly(this,void 0,void 0,(function*(){return yield this._dataLayer.setTemporaryDataParameter(Py.extractPKCEKeyFromStateParam(t),e,i)}))}updateConfig(e){return Ly(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(e),yield this.getOIDCProviderMetaData(!0)}))}}class Ey{constructor(e,t){this._id=e,this._store=t}setDataInBulk(e,t){var i;return Ly(this,void 0,void 0,(function*(){const n=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,l=n&&JSON.parse(n),o=Object.assign(Object.assign({},l),t),c=JSON.stringify(o);yield this._store.setData(e,c)}))}setValue(e,t,i){var n;return Ly(this,void 0,void 0,(function*(){const l=null!==(n=yield this._store.getData(e))&&void 0!==n?n:null,o=l&&JSON.parse(l),c=Object.assign(Object.assign({},o),{[t]:i}),a=JSON.stringify(c);yield this._store.setData(e,a)}))}removeValue(e,t){var i;return Ly(this,void 0,void 0,(function*(){const n=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,l=n&&JSON.parse(n),o=Object.assign({},l);delete o[t];const c=JSON.stringify(o);yield this._store.setData(e,c)}))}_resolveKey(e,t){return t?"".concat(e,"-").concat(this._id,"-").concat(t):"".concat(e,"-").concat(this._id)}isLocalStorageAvailable(){try{const e="__ASGARDEO_AUTH_CORE_LOCAL_STORAGE_TEST__";return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch(e){return!1}}setConfigData(t){return Ly(this,void 0,void 0,(function*(){yield this.setDataInBulk(this._resolveKey(e.Stores.ConfigData),t)}))}setOIDCProviderMetaData(t){return Ly(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.OIDCProviderMetaData),t)}))}setTemporaryData(t,i){return Ly(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.TemporaryData,i),t)}))}setSessionData(t,i){return Ly(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.SessionData,i),t)}))}setCustomData(e,t,i){return Ly(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e,i),t)}))}getConfigData(){var t;return Ly(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(e.Stores.ConfigData)))&&void 0!==t?t:null)}))}getOIDCProviderMetaData(){var t;return Ly(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(e.Stores.OIDCProviderMetaData)))&&void 0!==t?t:null)}))}getTemporaryData(t){var i;return Ly(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e.Stores.TemporaryData,t)))&&void 0!==i?i:null)}))}getSessionData(t){var i;return Ly(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e.Stores.SessionData,t)))&&void 0!==i?i:null)}))}getCustomData(e,t){var i;return Ly(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e,t)))&&void 0!==i?i:null)}))}setSessionStatus(e){this.isLocalStorageAvailable()&&localStorage.setItem("asgardeo-session-active",e)}getSessionStatus(){var e;return this.isLocalStorageAvailable()&&null!==(e=localStorage.getItem("asgardeo-session-active"))&&void 0!==e?e:""}removeSessionStatus(){this.isLocalStorageAvailable()&&localStorage.removeItem("asgardeo-session-active")}removeConfigData(){return Ly(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.ConfigData))}))}removeOIDCProviderMetaData(){return Ly(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.OIDCProviderMetaData))}))}removeTemporaryData(t){return Ly(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.TemporaryData,t))}))}removeSessionData(t){return Ly(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.SessionData,t))}))}getConfigDataParameter(t){return Ly(this,void 0,void 0,(function*(){const i=yield this._store.getData(this._resolveKey(e.Stores.ConfigData));return i&&JSON.parse(i)[t]}))}getOIDCProviderMetaDataParameter(t){return Ly(this,void 0,void 0,(function*(){const i=yield this._store.getData(this._resolveKey(e.Stores.OIDCProviderMetaData));return i&&JSON.parse(i)[t]}))}getTemporaryDataParameter(t,i){return Ly(this,void 0,void 0,(function*(){const n=yield this._store.getData(this._resolveKey(e.Stores.TemporaryData,i));return n&&JSON.parse(n)[t]}))}getSessionDataParameter(t,i){return Ly(this,void 0,void 0,(function*(){const n=yield this._store.getData(this._resolveKey(e.Stores.SessionData,i));return n&&JSON.parse(n)[t]}))}setConfigDataParameter(t,i){return Ly(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.ConfigData),t,i)}))}setOIDCProviderMetaDataParameter(t,i){return Ly(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.OIDCProviderMetaData),t,i)}))}setTemporaryDataParameter(t,i,n){return Ly(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.TemporaryData,n),t,i)}))}setSessionDataParameter(t,i,n){return Ly(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.SessionData,n),t,i)}))}removeConfigDataParameter(t){return Ly(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.ConfigData),t)}))}removeOIDCProviderMetaDataParameter(t){return Ly(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.OIDCProviderMetaData),t)}))}removeTemporaryDataParameter(t,i){return Ly(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.TemporaryData,i),t)}))}removeSessionDataParameter(t,i){return Ly(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.SessionData,i),t)}))}}const Dy={clockTolerance:300,enablePKCE:!0,responseMode:e.ResponseMode.query,scope:["openid"],sendCookiesInRequests:!0,validateIDToken:!0,validateIDTokenIssuer:!0};class Oy{
|
|
2
2
|
/**
|
|
3
3
|
* This is the constructor method that returns an instance of the .
|
|
4
4
|
*
|
|
@@ -33,7 +33,7 @@ constructor(){}
|
|
|
33
33
|
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#initialize}
|
|
34
34
|
*
|
|
35
35
|
* @preserve
|
|
36
|
-
*/initialize(e,t,i,n){var l,o,c;return Ly(this,void 0,void 0,(function*(){const a=e.clientID;
|
|
36
|
+
*/initialize(e,t,i,n){var l,o,c;return Ly(this,void 0,void 0,(function*(){const a=e.clientID;Oy._instanceID?Oy._instanceID+=1:Oy._instanceID=0,n&&(Oy._instanceID=n),this._dataLayer=new Ey(a?"instance_".concat(Oy._instanceID,"-").concat(a):"instance_".concat(Oy._instanceID),t),this._authenticationCore=new My(this._dataLayer,i),Oy._authenticationCore=new My(this._dataLayer,i),yield this._dataLayer.setConfigData(Object.assign(Object.assign(Object.assign({},Dy),e),{scope:[...null!==(l=Dy.scope)&&void 0!==l?l:[],...null!==(c=null===(o=e.scope)||void 0===o?void 0:o.filter((e=>{var t;return!(null===(t=null==Dy?void 0:Dy.scope)||void 0===t?void 0:t.includes(e))})))&&void 0!==c?c:[]]}))}))}
|
|
37
37
|
/**
|
|
38
38
|
* This method returns the `DataLayer` object that allows you to access authentication data.
|
|
39
39
|
*
|
|
@@ -59,7 +59,7 @@ constructor(){}
|
|
|
59
59
|
* ```
|
|
60
60
|
*
|
|
61
61
|
* @preserve
|
|
62
|
-
*/getInstanceID(){return
|
|
62
|
+
*/getInstanceID(){return Oy._instanceID}
|
|
63
63
|
/**
|
|
64
64
|
* This is an async method that returns a Promise that resolves with the authorization URL parameters.
|
|
65
65
|
*
|
|
@@ -427,9 +427,9 @@ constructor(){}
|
|
|
427
427
|
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#updateConfig}
|
|
428
428
|
*
|
|
429
429
|
* @preserve
|
|
430
|
-
*/updateConfig(e){return Ly(this,void 0,void 0,(function*(){yield this._authenticationCore.updateConfig(e)}))}static clearUserSessionData(e){return Ly(this,void 0,void 0,(function*(){yield this._authenticationCore.clearUserSessionData(e)}))}}function _y(e,t,i){var n=void 0===t?null:t,l=function(e,t){var i=atob(e);if(t){for(var n=new Uint8Array(i.length),l=0,o=i.length;l<o;++l)n[l]=i.charCodeAt(l);return String.fromCharCode.apply(null,new Uint16Array(n.buffer))}return i}(e,void 0!==i&&i),o=l.indexOf("\n",10)+1,c=l.substring(o)+(n?"//# sourceMappingURL="+n:""),a=new Blob([c],{type:"application/javascript"});return URL.createObjectURL(a)}var qy,$y,eX,tX,iX=(qy="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlLHQsbixyKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKSgoZnVuY3Rpb24oaSxvKXtmdW5jdGlvbiBzKGUpe3RyeXtjKHIubmV4dChlKSl9Y2F0Y2goZSl7byhlKX19ZnVuY3Rpb24gYShlKXt0cnl7YyhyLnRocm93KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBjKGUpe3ZhciB0O2UuZG9uZT9pKGUudmFsdWUpOih0PWUudmFsdWUsdCBpbnN0YW5jZW9mIG4/dDpuZXcgbigoZnVuY3Rpb24oZSl7ZSh0KX0pKSkudGhlbihzLGEpfWMoKHI9ci5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pKX1mdW5jdGlvbiB0KGUsdCxuLHIpe3JldHVybiBuZXcobnx8KG49UHJvbWlzZSkpKChmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHMoZSl7dHJ5e2Moci5uZXh0KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBhKGUpe3RyeXtjKHIudGhyb3coZSkpfWNhdGNoKGUpe28oZSl9fWZ1bmN0aW9uIGMoZSl7dmFyIHQ7ZS5kb25lP2koZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygbj90Om5ldyBuKChmdW5jdGlvbihlKXtlKHQpfSkpKS50aGVuKHMsYSl9Yygocj1yLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSkpfXZhciBuOyFmdW5jdGlvbihlKXtlLmZvcm1Qb3N0PSJmb3JtX3Bvc3QiLGUucXVlcnk9InF1ZXJ5IixlLmRpcmVjdD0iZGlyZWN0In0obnx8KG49e30pKTt2YXIgcjshZnVuY3Rpb24oZSl7ZS5Db25maWdEYXRhPSJjb25maWdfZGF0YSIsZS5PSURDUHJvdmlkZXJNZXRhRGF0YT0ib2lkY19wcm92aWRlcl9tZXRhX2RhdGEiLGUuU2Vzc2lvbkRhdGE9InNlc3Npb25fZGF0YSIsZS5UZW1wb3JhcnlEYXRhPSJ0ZW1wb3JhcnlfZGF0YSJ9KHJ8fChyPXt9KSk7Y29uc3QgaT0icmVmcmVzaF90b2tlbl90aW1lciIsbz1bIlJTMjU2IiwiUlM1MTIiLCJSUzM4NCIsIlBTMjU2Il0scz0ic2lnbl9vdXRfdXJsIjt2YXIgYTshZnVuY3Rpb24oZSl7ZS5JbmNsdWRlPSJpbmNsdWRlIixlLlNhbWVPcmlnaW49InNhbWUtb3JpZ2luIixlLk9taXQ9Im9taXQifShhfHwoYT17fSkpO2NsYXNzIGN7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMubWVzc2FnZT1uLHRoaXMubmFtZT10LHRoaXMuY29kZT1lLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG5ldy50YXJnZXQucHJvdG90eXBlKX19Y2xhc3MgdXtjb25zdHJ1Y3Rvcigpe31zdGF0aWMgZmlsdGVyQ2xhaW1zRnJvbUlEVG9rZW5QYXlsb2FkKGUpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtudWxsPT10fHxkZWxldGUgdC5pc3MsbnVsbD09dHx8ZGVsZXRlIHQuYXVkLG51bGw9PXR8fGRlbGV0ZSB0LmV4cCxudWxsPT10fHxkZWxldGUgdC5pYXQsbnVsbD09dHx8ZGVsZXRlIHQuYWNyLG51bGw9PXR8fGRlbGV0ZSB0LmFtcixudWxsPT10fHxkZWxldGUgdC5henAsbnVsbD09dHx8ZGVsZXRlIHQuYXV0aF90aW1lLG51bGw9PXR8fGRlbGV0ZSB0Lm5vbmNlLG51bGw9PXR8fGRlbGV0ZSB0LmNfaGFzaCxudWxsPT10fHxkZWxldGUgdC5hdF9oYXNoLG51bGw9PXR8fGRlbGV0ZSB0Lm5iZixudWxsPT10fHxkZWxldGUgdC5pc2ssbnVsbD09dHx8ZGVsZXRlIHQuc2lkO2NvbnN0IG49e307cmV0dXJuIE9iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKGU9PntsZXRbdCxyXT1lO2NvbnN0IGk9dC5zcGxpdCgiXyIpLm1hcCgoKGUsdCk9PjA9PT10P2U6W2VbMF0udG9VcHBlckNhc2UoKSwuLi5lLnNsaWNlKDEpXS5qb2luKCIiKSkpLmpvaW4oIiIpO25baV09cn0pKSxufXN0YXRpYyBnZXRUb2tlblJlcXVlc3RIZWFkZXJzKCl7cmV0dXJue0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiIsIkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9fXN0YXRpYyBnZW5lcmF0ZVN0YXRlUGFyYW1Gb3JSZXF1ZXN0Q29ycmVsYXRpb24oZSx0KXtjb25zdCBuPXBhcnNlSW50KGUuc3BsaXQoIiMiKVsxXSk7cmV0dXJuIHQ/IiIuY29uY2F0KHQsIl9yZXF1ZXN0XyIpLmNvbmNhdChuKToicmVxdWVzdF8iLmNvbmNhdChuKX1zdGF0aWMgZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShlKXtyZXR1cm4icGtjZV9jb2RlX3ZlcmlmaWVyIyIuY29uY2F0KHBhcnNlSW50KGUuc3BsaXQoInJlcXVlc3RfIilbMV0pKX19dS5nZXRUZW5hbnREb21haW5Gcm9tSWRUb2tlblBheWxvYWQ9ZnVuY3Rpb24oZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiJAIjtjb25zdCBuPWUuc3ViLnNwbGl0KHQpO3JldHVybiBuLmxlbmd0aD4yP25bbi5sZW5ndGgtMV06IiJ9O2NsYXNzIGx7Y29uc3RydWN0b3IoZSxuKXt0aGlzLl9kYXRhTGF5ZXI9ZSx0aGlzLl9jb25maWc9KCk9PnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKX0pKSx0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YT0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKX0pKSx0aGlzLl9jcnlwdG9IZWxwZXI9bn1yZXNvbHZlRW5kcG9pbnRzKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD17fSxuPXlpZWxkIHRoaXMuX2NvbmZpZygpO3JldHVybiBuLmVuZHBvaW50cyYmT2JqZWN0LmtleXMobi5lbmRwb2ludHMpLmZvckVhY2goKGU9Pntjb25zdCByPWUucmVwbGFjZSgvW0EtWl0vZywoZT0+Il8iLmNvbmNhdChlLnRvTG93ZXJDYXNlKCkpKSk7dFtyXT0obnVsbD09bj92b2lkIDA6bi5lbmRwb2ludHMpP24uZW5kcG9pbnRzW2VdOiIifSkpLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx0KX0pKX1yZXNvbHZlRW5kcG9pbnRzRXhwbGljaXRseSgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT17fSx0PXlpZWxkIHRoaXMuX2NvbmZpZygpO2lmKCF0LmVuZHBvaW50c3x8IVsiYXV0aG9yaXphdGlvbl9lbmRwb2ludCIsImVuZF9zZXNzaW9uX2VuZHBvaW50Iiwiandrc191cmkiLCJjaGVja19zZXNzaW9uX2lmcmFtZSIsInJldm9jYXRpb25fZW5kcG9pbnQiLCJ0b2tlbl9lbmRwb2ludCIsImlzc3VlciIsInVzZXJpbmZvX2VuZHBvaW50Il0uZXZlcnkoKGU9PiEhdC5lbmRwb2ludHMmJk9iamVjdC5rZXlzKHQuZW5kcG9pbnRzKS5zb21lKCh0PT50LnJlcGxhY2UoL1tBLVpdL2csKGU9PiJfIi5jb25jYXQoZS50b0xvd2VyQ2FzZSgpKSkpPT09ZSkpKSkpdGhyb3cgbmV3IGMoIkpTLUFVVEhfSEVMUEVSLVJFRS1ORjAxIiwiUmVxdWlyZWQgZW5kcG9pbnRzIG1pc3NpbmciLCJTb21lIG9yIGFsbCBvZiB0aGUgcmVxdWlyZWQgZW5kcG9pbnRzIGFyZSBtaXNzaW5nIGluIHRoZSBvYmplY3QgcGFzc2VkIHRvIHRoZSBgZW5kcG9pbnRzYCBhdHRyaWJ1dGUgb2YgdGhlYEF1dGhDb25maWdgIG9iamVjdC4iKTtyZXR1cm4gdC5lbmRwb2ludHMmJk9iamVjdC5rZXlzKHQuZW5kcG9pbnRzKS5mb3JFYWNoKChuPT57Y29uc3Qgcj1uLnJlcGxhY2UoL1tBLVpdL2csKGU9PiJfIi5jb25jYXQoZS50b0xvd2VyQ2FzZSgpKSkpO2Vbcl09KG51bGw9PXQ/dm9pZCAwOnQuZW5kcG9pbnRzKT90LmVuZHBvaW50c1tuXToiIn0pKSxPYmplY3QuYXNzaWduKHt9LGUpfSkpfXJlc29sdmVFbmRwb2ludHNCeUJhc2VVUkwoKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9e30sdD15aWVsZCB0aGlzLl9jb25maWcoKSxuPXQuYmFzZVVybDtpZighbil0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVJfUkVCTy1ORjAxIiwiQmFzZSBVUkwgbm90IGRlZmluZWQuIiwiQmFzZSBVUkwgaXMgbm90IGRlZmluZWQgaW4gQXV0aENsaWVudCBjb25maWcuIik7dC5lbmRwb2ludHMmJk9iamVjdC5rZXlzKHQuZW5kcG9pbnRzKS5mb3JFYWNoKChuPT57Y29uc3Qgcj1uLnJlcGxhY2UoL1tBLVpdL2csKGU9PiJfIi5jb25jYXQoZS50b0xvd2VyQ2FzZSgpKSkpO2Vbcl09KG51bGw9PXQ/dm9pZCAwOnQuZW5kcG9pbnRzKT90LmVuZHBvaW50c1tuXToiIn0pKTtjb25zdCByPXthdXRob3JpemF0aW9uX2VuZHBvaW50OiIiLmNvbmNhdChuKS5jb25jYXQoIi9vYXV0aDIvYXV0aG9yaXplIiksZW5kX3Nlc3Npb25fZW5kcG9pbnQ6IiIuY29uY2F0KG4pLmNvbmNhdCgiL29pZGMvbG9nb3V0IiksaXNzdWVyOiIiLmNvbmNhdChuKS5jb25jYXQoIi9vYXV0aDIvdG9rZW4iKSxqd2tzX3VyaToiIi5jb25jYXQobikuY29uY2F0KCIvb2F1dGgyL2p3a3MiKSxjaGVja19zZXNzaW9uX2lmcmFtZToiIi5jb25jYXQobikuY29uY2F0KCIvb2lkYy9jaGVja3Nlc3Npb24iKSxyZXZvY2F0aW9uX2VuZHBvaW50OiIiLmNvbmNhdChuKS5jb25jYXQoIi9vYXV0aDIvcmV2b2tlIiksdG9rZW5fZW5kcG9pbnQ6IiIuY29uY2F0KG4pLmNvbmNhdCgiL29hdXRoMi90b2tlbiIpLHVzZXJpbmZvX2VuZHBvaW50OiIiLmNvbmNhdChuKS5jb25jYXQoIi9vYXV0aDIvdXNlcmluZm8iKX07cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSxlKX0pKX12YWxpZGF0ZUlkVG9rZW4oZSl7dmFyIG47cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PSh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKSkuandrc191cmkscj15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlNfQVVUSF9IRUxQRVItVklULU5GMDEiLCJKV0tTIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBKV0tTIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIEpXS1MgZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7bGV0IGk7dHJ5e2k9eWllbGQgZmV0Y2godCx7Y3JlZGVudGlhbHM6ci5zZW5kQ29va2llc0luUmVxdWVzdHM/YS5JbmNsdWRlOmEuU2FtZU9yaWdpbn0pfWNhdGNoKHQpe3Rocm93IG5ldyBjKCJKUy1BVVRIX0hFTFBFUi1WSVQtTkUwMiIsIlJlcXVlc3QgdG8gandrcyBlbmRwb2ludCBmYWlsZWQuIixudWxsIT10P3Q6IlRoZSByZXF1ZXN0IHNlbnQgdG8gZ2V0IHRoZSBqd2tzIGZyb20gdGhlIHNlcnZlciBmYWlsZWQuIil9aWYoMjAwIT09aS5zdGF0dXN8fCFpLm9rKXRocm93IG5ldyBjKCJKUy1BVVRIX0hFTFBFUi1WSVQtSEUwMyIsIkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciBqd2tzIHJlcXVlc3QgKCIuY29uY2F0KGkuc3RhdHVzVGV4dCwiKS4iKSx5aWVsZCBpLmpzb24oKSk7Y29uc3Qgbz0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkuaXNzdWVyLHtrZXlzOnN9PXlpZWxkIGkuanNvbigpLHU9eWllbGQgdGhpcy5fY3J5cHRvSGVscGVyLmdldEpXS0ZvclRoZUlkVG9rZW4oZS5zcGxpdCgiLiIpWzBdLHMpO3JldHVybiB0aGlzLl9jcnlwdG9IZWxwZXIuaXNWYWxpZElkVG9rZW4oZSx1LCh5aWVsZCB0aGlzLl9jb25maWcoKSkuY2xpZW50SUQsbnVsbCE9bz9vOiIiLHRoaXMuX2NyeXB0b0hlbHBlci5kZWNvZGVJRFRva2VuKGUpLnN1YiwoeWllbGQgdGhpcy5fY29uZmlnKCkpLmNsb2NrVG9sZXJhbmNlLG51bGw9PT0obj0oeWllbGQgdGhpcy5fY29uZmlnKCkpLnZhbGlkYXRlSURUb2tlbklzc3Vlcil8fHZvaWQgMD09PW58fG4pfSkpfWdldEF1dGhlbnRpY2F0ZWRVc2VySW5mbyhlKXt2YXIgdCxuLHIsaTtjb25zdCBvPXRoaXMuX2NyeXB0b0hlbHBlci5kZWNvZGVJRFRva2VuKGUpLHM9dS5nZXRUZW5hbnREb21haW5Gcm9tSWRUb2tlblBheWxvYWQobyksYT1udWxsIT09KHQ9bnVsbD09bz92b2lkIDA6by51c2VybmFtZSkmJnZvaWQgMCE9PXQ/dDoiIixjPW51bGwhPT0obj1vLmdpdmVuX25hbWUpJiZ2b2lkIDAhPT1uP246IiIsbD1udWxsIT09KHI9by5mYW1pbHlfbmFtZSkmJnZvaWQgMCE9PXI/cjoiIixkPWMmJmw/IiIuY29uY2F0KGMsIiAiKS5jb25jYXQobCk6Y3x8bHx8IiIsaD1udWxsIT09KGk9by5wcmVmZXJyZWRfdXNlcm5hbWUpJiZ2b2lkIDAhPT1pP2k6ZDtyZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGlzcGxheU5hbWU6aCx0ZW5hbnREb21haW46cyx1c2VybmFtZTphfSx1LmZpbHRlckNsYWltc0Zyb21JRFRva2VuUGF5bG9hZChvKSl9cmVwbGFjZUN1c3RvbUdyYW50VGVtcGxhdGVUYWdzKGUsbil7dmFyIHI7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtsZXQgdD0ib3BlbmlkIjtjb25zdCBpPXlpZWxkIHRoaXMuX2NvbmZpZygpLG89eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKG4pO3JldHVybiBpLnNjb3BlJiZpLnNjb3BlLmxlbmd0aD4wJiYoaS5zY29wZS5pbmNsdWRlcygib3BlbmlkIil8fGkuc2NvcGUucHVzaCgib3BlbmlkIiksdD1pLnNjb3BlLmpvaW4oIiAiKSksZS5yZXBsYWNlKCJ7e3Rva2VufX0iLG8uYWNjZXNzX3Rva2VuKS5yZXBsYWNlKCJ7e3VzZXJuYW1lfX0iLHRoaXMuZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKG8uaWRfdG9rZW4pLnVzZXJuYW1lKS5yZXBsYWNlKCJ7e3Njb3BlfX0iLHQpLnJlcGxhY2UoInt7Y2xpZW50SUR9fSIsaS5jbGllbnRJRCkucmVwbGFjZSgie3tjbGllbnRTZWNyZXR9fSIsbnVsbCE9PShyPWkuY2xpZW50U2VjcmV0KSYmdm9pZCAwIT09cj9yOiIiKX0pKX1jbGVhclVzZXJTZXNzaW9uRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVUZW1wb3JhcnlEYXRhKGUpLHlpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVTZXNzaW9uRGF0YShlKX0pKX1oYW5kbGVUb2tlblJlc3BvbnNlKGUsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZigyMDAhPT1lLnN0YXR1c3x8IWUub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfSEVMUEVSLUhUUi1ORTAxIiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHRva2VuIHJlcXVlc3QgKCIuY29uY2F0KGUuc3RhdHVzVGV4dCwiKS4iKSx5aWVsZCBlLmpzb24oKSk7Y29uc3Qgcj15aWVsZCBlLmpzb24oKTtpZihyLmNyZWF0ZWRfYXQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksKHlpZWxkIHRoaXMuX2NvbmZpZygpKS52YWxpZGF0ZUlEVG9rZW4pcmV0dXJuIHRoaXMudmFsaWRhdGVJZFRva2VuKHIuaWRfdG9rZW4pLnRoZW4oKCgpPT50KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFNlc3Npb25EYXRhKHIsbik7Y29uc3QgZT17YWNjZXNzVG9rZW46ci5hY2Nlc3NfdG9rZW4sY3JlYXRlZEF0OnIuY3JlYXRlZF9hdCxleHBpcmVzSW46ci5leHBpcmVzX2luLGlkVG9rZW46ci5pZF90b2tlbixyZWZyZXNoVG9rZW46ci5yZWZyZXNoX3Rva2VuLHNjb3BlOnIuc2NvcGUsdG9rZW5UeXBlOnIudG9rZW5fdHlwZX07cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKX0pKSkpO3tjb25zdCBlPXthY2Nlc3NUb2tlbjpyLmFjY2Vzc190b2tlbixjcmVhdGVkQXQ6ci5jcmVhdGVkX2F0LGV4cGlyZXNJbjpyLmV4cGlyZXNfaW4saWRUb2tlbjpyLmlkX3Rva2VuLHJlZnJlc2hUb2tlbjpyLnJlZnJlc2hfdG9rZW4sc2NvcGU6ci5zY29wZSx0b2tlblR5cGU6ci50b2tlbl90eXBlfTtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFNlc3Npb25EYXRhKHIsbiksUHJvbWlzZS5yZXNvbHZlKGUpfX0pKX1nZW5lcmF0ZVBLQ0VLZXkoZSl7dmFyIG47cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhKGUpLHI9W107T2JqZWN0LmtleXModCkuZm9yRWFjaCgoZT0+e2Uuc3RhcnRzV2l0aCgicGtjZV9jb2RlX3ZlcmlmaWVyIikmJnIucHVzaChlKX0pKTtjb25zdCBpPXIuc29ydCgpLnBvcCgpO3JldHVybiJwa2NlX2NvZGVfdmVyaWZpZXIjIi5jb25jYXQocGFyc2VJbnQobnVsbCE9PShuPW51bGw9PWk/dm9pZCAwOmkuc3BsaXQoIiMiKVsxXSkmJnZvaWQgMCE9PW4/bjoiLTEiKSsxKX0pKX19Y2xhc3MgZHtjb25zdHJ1Y3RvcihlKXt0aGlzLl9jcnlwdG9VdGlscz1lfWdldENvZGVWZXJpZmllcigpe3JldHVybiB0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxFbmNvZGUodGhpcy5fY3J5cHRvVXRpbHMuZ2VuZXJhdGVSYW5kb21CeXRlcygzMikpfWdldENvZGVDaGFsbGVuZ2UoZSl7cmV0dXJuIHRoaXMuX2NyeXB0b1V0aWxzLmJhc2U2NFVSTEVuY29kZSh0aGlzLl9jcnlwdG9VdGlscy5oYXNoU2hhMjU2KGUpKX1nZXRKV0tGb3JUaGVJZFRva2VuKGUsdCl7Y29uc3Qgbj1KU09OLnBhcnNlKHRoaXMuX2NyeXB0b1V0aWxzLmJhc2U2NFVSTERlY29kZShlKSk7Zm9yKGNvbnN0IGUgb2YgdClpZihuLmtpZD09PWUua2lkKXJldHVybiBlO3Rocm93IG5ldyBjKCJKUy1DUllQVE9fVVRJTC1HSkZUSVQtSVYwMSIsImtpZCBub3QgZm91bmQuIiwiRmFpbGVkIHRvIGZpbmQgdGhlICdraWQnIHNwZWNpZmllZCBpbiB0aGUgaWRfdG9rZW4uICdraWQnIGZvdW5kIGluIHRoZSBoZWFkZXIgOiAiK24ua2lkKyIsIEV4cGVjdGVkIHZhbHVlczogIit0Lm1hcCgoZT0+ZS5raWQpKS5qb2luKCIsICIpKX1pc1ZhbGlkSWRUb2tlbihlLHQsbixyLGkscyxhKXtyZXR1cm4gdGhpcy5fY3J5cHRvVXRpbHMudmVyaWZ5Snd0KGUsdCxvLG4scixpLHMsYSkudGhlbigoZT0+ZT9Qcm9taXNlLnJlc29sdmUoITApOlByb21pc2UucmVqZWN0KG5ldyBjKCJKUy1DUllQVE9fSEVMUEVSLUlWSVQtSVYwMSIsIkludmFsaWQgSUQgdG9rZW4uIiwiSUQgdG9rZW4gdmFsaWRhdGlvbiByZXR1cm5lZCBmYWxzZSIpKSkpfWRlY29kZUlEVG9rZW4oZSl7dHJ5e2NvbnN0IHQ9dGhpcy5fY3J5cHRvVXRpbHMuYmFzZTY0VVJMRGVjb2RlKGUuc3BsaXQoIi4iKVsxXSk7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2goZSl7dGhyb3cgbmV3IGMoIkpTLUNSWVBUT19VVElMLURJVC1JVjAxIiwiRGVjb2RpbmcgSUQgdG9rZW4gZmFpbGVkLiIsZSl9fX1jbGFzcyBoe2NvbnN0cnVjdG9yKGUsbil7dGhpcy5fY3J5cHRvVXRpbHM9bix0aGlzLl9jcnlwdG9IZWxwZXI9bmV3IGQobiksdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXI9bmV3IGwoZSx0aGlzLl9jcnlwdG9IZWxwZXIpLHRoaXMuX2RhdGFMYXllcj1lLHRoaXMuX2NvbmZpZz0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpfSkpLHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhPSgpPT50KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpfSkpfWdldEF1dGhvcml6YXRpb25VUkxQYXJhbXMoZSxuKXt2YXIgcixpLG87cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX2NvbmZpZygpLHM9bmV3IE1hcDtzLnNldCgicmVzcG9uc2VfdHlwZSIsImNvZGUiKSxzLnNldCgiY2xpZW50X2lkIix0LmNsaWVudElEKSx0LmNsaWVudFNlY3JldCYmdC5jbGllbnRTZWNyZXQudHJpbSgpLmxlbmd0aD4wJiZzLnNldCgiY2xpZW50X3NlY3JldCIsdC5jbGllbnRTZWNyZXQpO2xldCBhPSJvcGVuaWQiO3Quc2NvcGUmJnQuc2NvcGUubGVuZ3RoPjAmJih0LnNjb3BlLmluY2x1ZGVzKCJvcGVuaWQiKXx8dC5zY29wZS5wdXNoKCJvcGVuaWQiKSxhPXQuc2NvcGUuam9pbigiICIpKSxzLnNldCgic2NvcGUiLGEpLHMuc2V0KCJyZWRpcmVjdF91cmkiLHQuc2lnbkluUmVkaXJlY3RVUkwpLHQucmVzcG9uc2VNb2RlJiZzLnNldCgicmVzcG9uc2VfbW9kZSIsdC5yZXNwb25zZU1vZGUpO2NvbnN0IGM9eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuZ2VuZXJhdGVQS0NFS2V5KG4pO2lmKHQuZW5hYmxlUEtDRSl7Y29uc3QgZT1udWxsPT09KHI9dGhpcy5fY3J5cHRvSGVscGVyKXx8dm9pZCAwPT09cj92b2lkIDA6ci5nZXRDb2RlVmVyaWZpZXIoKSx0PW51bGw9PT0oaT10aGlzLl9jcnlwdG9IZWxwZXIpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLmdldENvZGVDaGFsbGVuZ2UoZSk7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoYyxlLG4pLHMuc2V0KCJjb2RlX2NoYWxsZW5nZV9tZXRob2QiLCJTMjU2Iikscy5zZXQoImNvZGVfY2hhbGxlbmdlIix0KX10LnByb21wdCYmcy5zZXQoInByb21wdCIsdC5wcm9tcHQpO2NvbnN0IGw9ZTtpZihsKWZvcihjb25zdFtlLHRdb2YgT2JqZWN0LmVudHJpZXMobCkpIiIhPWUmJiIiIT10JiYic3RhdGUiIT09ZSYmcy5zZXQoZSx0LnRvU3RyaW5nKCkpO3JldHVybiBzLnNldCgic3RhdGUiLHUuZ2VuZXJhdGVTdGF0ZVBhcmFtRm9yUmVxdWVzdENvcnJlbGF0aW9uKGMsbD9udWxsPT09KG89bC5zdGF0ZSl8fHZvaWQgMD09PW8/dm9pZCAwOm8udG9TdHJpbmcoKToiIikpLHN9KSl9Z2V0QXV0aG9yaXphdGlvblVSTChlLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIoImF1dGhvcml6YXRpb25fZW5kcG9pbnQiKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdBVS1ORjAxIiwiTm8gYXV0aG9yaXphdGlvbiBlbmRwb2ludCBmb3VuZC4iLCJObyBhdXRob3JpemF0aW9uIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgZnJvbSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgYXV0aG9yaXphdGlvbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCByPW5ldyBVUkwodCksaT15aWVsZCB0aGlzLmdldEF1dGhvcml6YXRpb25VUkxQYXJhbXMoZSxuKTtmb3IoY29uc3RbZSx0XW9mIGkuZW50cmllcygpKXIuc2VhcmNoUGFyYW1zLmFwcGVuZChlLHQpO3JldHVybiByLnRvU3RyaW5nKCl9KSl9cmVxdWVzdEFjY2Vzc1Rva2VuKGUsbixyLGksbyl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PSh5aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKS50b2tlbl9lbmRwb2ludCxzPXlpZWxkIHRoaXMuX2NvbmZpZygpO2lmKCF0fHwwPT09dC50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMS1ORjAxIiwiVG9rZW4gZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIHRva2VuIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO24mJih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoInNlc3Npb25fc3RhdGUiLG4saSkpO2NvbnN0IGw9bmV3IFVSTFNlYXJjaFBhcmFtcztsLnNldCgiY2xpZW50X2lkIixzLmNsaWVudElEKSxzLmNsaWVudFNlY3JldCYmcy5jbGllbnRTZWNyZXQudHJpbSgpLmxlbmd0aD4wJiZsLnNldCgiY2xpZW50X3NlY3JldCIscy5jbGllbnRTZWNyZXQpO2NvbnN0IGQ9ZTtsZXQgaDtsLnNldCgiY29kZSIsZCksbC5zZXQoImdyYW50X3R5cGUiLCJhdXRob3JpemF0aW9uX2NvZGUiKSxsLnNldCgicmVkaXJlY3RfdXJpIixzLnNpZ25JblJlZGlyZWN0VVJMKSwobnVsbD09bz92b2lkIDA6by5wYXJhbXMpJiZPYmplY3QuZW50cmllcyhvLnBhcmFtcykuZm9yRWFjaCgoZT0+e2xldFt0LG5dPWU7bC5hcHBlbmQodCxuKX0pKSxzLmVuYWJsZVBLQ0UmJihsLnNldCgiY29kZV92ZXJpZmllciIsIiIuY29uY2F0KHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShyKSxpKSkpLHlpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShyKSxpKSk7dHJ5e2g9eWllbGQgZmV0Y2godCx7Ym9keTpsLGNyZWRlbnRpYWxzOnMuc2VuZENvb2tpZXNJblJlcXVlc3RzP2EuSW5jbHVkZTphLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyh1LmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSksbWV0aG9kOiJQT1NUIn0pfWNhdGNoKHQpe3Rocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMS1ORTAyIiwiUmVxdWVzdGluZyBhY2Nlc3MgdG9rZW4gZmFpbGVkIixudWxsIT10P3Q6IlRoZSByZXF1ZXN0IHRvIGdldCB0aGUgYWNjZXNzIHRva2VuIGZyb20gdGhlIHNlcnZlciBmYWlsZWQuIil9aWYoIWgub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQxLUhFMDMiLCJSZXF1ZXN0aW5nIGFjY2VzcyB0b2tlbiBmYWlsZWQgd2l0aCAiLmNvbmNhdChoLnN0YXR1c1RleHQpLHlpZWxkIGguanNvbigpKTtyZXR1cm4geWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShoLGkpfSkpfXJlZnJlc2hBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9KHlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkpLnRva2VuX2VuZHBvaW50LG49eWllbGQgdGhpcy5fY29uZmlnKCkscj15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSk7aWYoIXIucmVmcmVzaF90b2tlbil0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDItTkYwMSIsIk5vIHJlZnJlc2ggdG9rZW4gZm91bmQuIiwiVGhlcmUgd2FzIG5vIHJlZnJlc2ggdG9rZW4gZm91bmQuIEFzZ2FyZGVvIGRvZXNuJ3QgcmV0dXJuIGEgcmVmcmVzaCB0b2tlbiBpZiB0aGUgcmVmcmVzaCB0b2tlbiBncmFudCBpcyBub3QgZW5hYmxlZC4iKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDItTkYwMiIsIk5vIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgZm91bmQuIiwiTm8gcmVmcmVzaCB0b2tlbiBlbmRwb2ludCB3YXMgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSByZWZyZXNoIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2NvbnN0IGk9W107bGV0IG87aS5wdXNoKCJjbGllbnRfaWQ9Ii5jb25jYXQobi5jbGllbnRJRCkpLGkucHVzaCgicmVmcmVzaF90b2tlbj0iLmNvbmNhdChyLnJlZnJlc2hfdG9rZW4pKSxpLnB1c2goImdyYW50X3R5cGU9cmVmcmVzaF90b2tlbiIpLG4uY2xpZW50U2VjcmV0JiZuLmNsaWVudFNlY3JldC50cmltKCkubGVuZ3RoPjAmJmkucHVzaCgiY2xpZW50X3NlY3JldD0iLmNvbmNhdChuLmNsaWVudFNlY3JldCkpO3RyeXtvPXlpZWxkIGZldGNoKHQse2JvZHk6aS5qb2luKCImIiksY3JlZGVudGlhbHM6bi5zZW5kQ29va2llc0luUmVxdWVzdHM/YS5JbmNsdWRlOmEuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKHUuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QifSl9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQyLU5SMDMiLCJSZWZyZXNoIGFjY2VzcyB0b2tlbiByZXF1ZXN0IGZhaWxlZC4iLG51bGwhPXQ/dDoiVGhlIHJlcXVlc3QgdG8gcmVmcmVzaCB0aGUgYWNjZXNzIHRva2VuIGZhaWxlZC4iKX1pZighby5vayl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDItSEUwNCIsIlJlZnJlc2hpbmcgYWNjZXNzIHRva2VuIGZhaWxlZCB3aXRoICIuY29uY2F0KG8uc3RhdHVzVGV4dCkseWllbGQgby5qc29uKCkpO3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5oYW5kbGVUb2tlblJlc3BvbnNlKG8sZSl9KSl9cmV2b2tlQWNjZXNzVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PSh5aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKS5yZXZvY2F0aW9uX2VuZHBvaW50LG49eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQzLU5GMDEiLCJObyByZXZva2UgYWNjZXNzIHRva2VuIGVuZHBvaW50IGZvdW5kLiIsIk5vIHJldm9rZSBhY2Nlc3MgdG9rZW4gZW5kcG9pbnQgd2FzIGZvdW5kIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgcmV2b2tlIGFjY2VzcyB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCByPVtdO2xldCBpO3IucHVzaCgiY2xpZW50X2lkPSIuY29uY2F0KG4uY2xpZW50SUQpKSxyLnB1c2goInRva2VuPSIuY29uY2F0KCh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSkpLmFjY2Vzc190b2tlbikpLHIucHVzaCgidG9rZW5fdHlwZV9oaW50PWFjY2Vzc190b2tlbiIpO3RyeXtpPXlpZWxkIGZldGNoKHQse2JvZHk6ci5qb2luKCImIiksY3JlZGVudGlhbHM6bi5zZW5kQ29va2llc0luUmVxdWVzdHM/YS5JbmNsdWRlOmEuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKHUuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QifSl9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQzLU5FMDIiLCJUaGUgcmVxdWVzdCB0byByZXZva2UgYWNjZXNzIHRva2VuIGZhaWxlZC4iLG51bGwhPXQ/dDoiVGhlIHJlcXVlc3Qgc2VudCB0byByZXZva2UgdGhlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIil9aWYoMjAwIT09aS5zdGF0dXN8fCFpLm9rKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMy1IRTAzIiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHJldm9rZSBhY2Nlc3MgdG9rZW4gcmVxdWVzdCAoIi5jb25jYXQoaS5zdGF0dXNUZXh0LCIpLiIpLHlpZWxkIGkuanNvbigpKTtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuY2xlYXJVc2VyU2Vzc2lvbkRhdGEoZSksUHJvbWlzZS5yZXNvbHZlKGkpfSkpfXJlcXVlc3RDdXN0b21HcmFudChlLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgcj15aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpLGk9eWllbGQgdGhpcy5fY29uZmlnKCk7bGV0IG87aWYobz1lLnRva2VuRW5kcG9pbnQmJjAhPT1lLnRva2VuRW5kcG9pbnQudHJpbSgpLmxlbmd0aD9lLnRva2VuRW5kcG9pbnQ6ci50b2tlbl9lbmRwb2ludCwhb3x8MD09PW8udHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJDRy1ORjAxIiwiVG9rZW4gZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIHRva2VuIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2NvbnN0IHM9eWllbGQgUHJvbWlzZS5hbGwoT2JqZWN0LmVudHJpZXMoZS5kYXRhKS5tYXAoKGU9PntsZXRbcixpXT1lO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXBsYWNlQ3VzdG9tR3JhbnRUZW1wbGF0ZVRhZ3MoaSxuKTtyZXR1cm4iIi5jb25jYXQociwiPSIpLmNvbmNhdChlKX0pKX0pKSk7bGV0IGw9T2JqZWN0LmFzc2lnbih7fSx1LmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSk7ZS5hdHRhY2hUb2tlbiYmKGw9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGwpLHtBdXRob3JpemF0aW9uOiJCZWFyZXIgIi5jb25jYXQoKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShuKSkuYWNjZXNzX3Rva2VuKX0pKTtjb25zdCBkPXtib2R5OnMuam9pbigiJiIpLGNyZWRlbnRpYWxzOmkuc2VuZENvb2tpZXNJblJlcXVlc3RzP2EuSW5jbHVkZTphLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyhsKSxtZXRob2Q6IlBPU1QifTtsZXQgaDt0cnl7aD15aWVsZCBmZXRjaChvLGQpfWNhdGNoKGUpe3Rocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkNHLU5FMDIiLCJUaGUgY3VzdG9tIGdyYW50IHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9ZT9lOiJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgY3VzdG9tIGdyYW50IGZhaWxlZC4iKX1pZigyMDAhPT1oLnN0YXR1c3x8IWgub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQ0ctSEUwMyIsIkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0aGUgY3VzdG9tIGdyYW50IHJlcXVlc3QuICgiLmNvbmNhdChoLnN0YXR1c1RleHQsIikiKSx5aWVsZCBoLmpzb24oKSk7cmV0dXJuIGUucmV0dXJuc1Nlc3Npb24/dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShoLG4pOlByb21pc2UucmVzb2x2ZSh5aWVsZCBoLmpzb24oKSl9KSl9Z2V0QmFzaWNVc2VySW5mbyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpLG49dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKG51bGw9PXQ/dm9pZCAwOnQuaWRfdG9rZW4pO2xldCByPXthbGxvd2VkU2NvcGVzOnQuc2NvcGUsc2Vzc2lvblN0YXRlOnQuc2Vzc2lvbl9zdGF0ZX07cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2goKGU9Pnt2b2lkIDAhPT1uW2VdJiYiIiE9PW5bZV0mJm51bGwhPT1uW2VdfHxkZWxldGUgbltlXX0pKSxyPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSxuKSxyfSkpfWdldERlY29kZWRJRFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5pZF90b2tlbjtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyLmRlY29kZUlEVG9rZW4odCl9KSl9Z2V0Q3J5cHRvSGVscGVyKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyfSkpfWdldElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5pZF90b2tlbn0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIWUmJih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3Qgbj10LndlbGxLbm93bkVuZHBvaW50O2lmKG4pe2xldCBlO3RyeXtpZihlPXlpZWxkIGZldGNoKG4pLDIwMCE9PWUuc3RhdHVzfHwhZS5vayl0aHJvdyBuZXcgRXJyb3J9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HT1BNRC1IRTAxIiwiSW52YWxpZCB3ZWxsLWtub3duIHJlc3BvbnNlIiwiVGhlIHdlbGwga25vd24gZW5kcG9pbnQgcmVzcG9uc2UgaGFzIGJlZW4gZmFpbGVkIHdpdGggYW4gZXJyb3IuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzKHlpZWxkIGUuanNvbigpKSkseWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiLCEwKSxQcm9taXNlLnJlc29sdmUoKX1pZih0LmJhc2VVcmwpe3RyeXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZUVuZHBvaW50c0J5QmFzZVVSTCgpKX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdPUE1ELUlWMDIiLCJSZXNvbHZpbmcgZW5kcG9pbnRzIGZhaWxlZC4iLG51bGwhPXQ/dDoiUmVzb2x2aW5nIGVuZHBvaW50cyBieSBiYXNlIHVybCBmYWlsZWQuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIiwhMCksUHJvbWlzZS5yZXNvbHZlKCl9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzRXhwbGljaXRseSgpKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIsITApLFByb21pc2UucmVzb2x2ZSgpfSkpfWdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl7dmFyIGUsbixyLGksbyxzLGEsYyx1LGw7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCk7cmV0dXJue2F1dGhvcml6YXRpb25FbmRwb2ludDpudWxsIT09KGU9dC5hdXRob3JpemF0aW9uX2VuZHBvaW50KSYmdm9pZCAwIT09ZT9lOiIiLGNoZWNrU2Vzc2lvbklmcmFtZTpudWxsIT09KG49dC5jaGVja19zZXNzaW9uX2lmcmFtZSkmJnZvaWQgMCE9PW4/bjoiIixlbmRTZXNzaW9uRW5kcG9pbnQ6bnVsbCE9PShyPXQuZW5kX3Nlc3Npb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1yP3I6IiIsaW50cm9zcGVjdGlvbkVuZHBvaW50Om51bGwhPT0oaT10LmludHJvc3BlY3Rpb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1pP2k6IiIsaXNzdWVyOm51bGwhPT0obz10Lmlzc3VlcikmJnZvaWQgMCE9PW8/bzoiIixqd2tzVXJpOm51bGwhPT0ocz10Lmp3a3NfdXJpKSYmdm9pZCAwIT09cz9zOiIiLHJlZ2lzdHJhdGlvbkVuZHBvaW50Om51bGwhPT0oYT10LnJlZ2lzdHJhdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWE/YToiIixyZXZvY2F0aW9uRW5kcG9pbnQ6bnVsbCE9PShjPXQucmV2b2NhdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWM/YzoiIix0b2tlbkVuZHBvaW50Om51bGwhPT0odT10LnRva2VuX2VuZHBvaW50KSYmdm9pZCAwIT09dT91OiIiLHVzZXJpbmZvRW5kcG9pbnQ6bnVsbCE9PShsPXQudXNlcmluZm9fZW5kcG9pbnQpJiZ2b2lkIDAhPT1sP2w6IiJ9fSkpfWdldFNpZ25PdXRVUkwoZSl7dmFyIG4scixpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsPT09KG49eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZW5kX3Nlc3Npb25fZW5kcG9pbnQsbz15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdTT1UtTkYwMSIsIlNpZ24tb3V0IGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBzaWduLW91dCBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSBzaWduLW91dCBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCBzPW51bGwhPT0ocj1udWxsPT1vP3ZvaWQgMDpvLnNpZ25PdXRSZWRpcmVjdFVSTCkmJnZvaWQgMCE9PXI/cjpudWxsPT1vP3ZvaWQgMDpvLnNpZ25JblJlZGlyZWN0VVJMO2lmKCFzfHwwPT09cy50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtR1NPVS1ORjAzIiwiTm8gc2lnbi1vdXQgcmVkaXJlY3QgVVJMIGZvdW5kLiIsIlRoZSBzaWduLW91dCByZWRpcmVjdCBVUkwgY2Fubm90IGJlIGZvdW5kIG9yIHRoZSBVUkwgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIE5vIHNpZ24taW4gcmVkaXJlY3QgVVJMIGhhcyBiZWVuIGZvdW5kIGVpdGhlci4gIik7Y29uc3QgYT1uZXcgVVJMU2VhcmNoUGFyYW1zO2lmKGEuc2V0KCJwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLHMpLG8uc2VuZElkVG9rZW5JbkxvZ291dFJlcXVlc3Qpe2NvbnN0IHQ9bnVsbD09PShpPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PWk/dm9pZCAwOmkuaWRfdG9rZW47aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HU09VLU5GMDIiLCJJRCB0b2tlbiBub3QgZm91bmQuIiwiTm8gSUQgdG9rZW4gY291bGQgYmUgZm91bmQuIEVpdGhlciB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpcyBsb3N0IG9yIHlvdSBoYXZlIG5vdCBzaWduZWQgaW4uIik7YS5zZXQoImlkX3Rva2VuX2hpbnQiLHQpfWVsc2UgYS5zZXQoImNsaWVudF9pZCIsby5jbGllbnRJRCk7cmV0dXJuIGEuc2V0KCJzdGF0ZSIsInNpZ25fb3V0X3N1Y2Nlc3MiKSwiIi5jb25jYXQodCwiPyIpLmNvbmNhdChhLnRvU3RyaW5nKCkpfSkpfWNsZWFyVXNlclNlc3Npb25EYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuY2xlYXJVc2VyU2Vzc2lvbkRhdGEoZSl9KSl9Z2V0QWNjZXNzVG9rZW4oZSl7dmFyIG47cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbnVsbD09PShuPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uYWNjZXNzX3Rva2VufSkpfWdldENyZWF0ZWRBdChlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KG49eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5jcmVhdGVkX2F0fSkpfWdldEV4cGlyZXNJbihlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KG49eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5leHBpcmVzX2lufSkpfWlzQXV0aGVudGljYXRlZChlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9Qm9vbGVhbih5aWVsZCB0aGlzLmdldEFjY2Vzc1Rva2VuKGUpKSxuPXlpZWxkIHRoaXMuZ2V0Q3JlYXRlZEF0KGUpLHI9eWllbGQgdGhpcy5nZXRFeHBpcmVzSW4oZSk7aWYoIXIpcmV0dXJuITE7Y29uc3QgaT0xZTMqcGFyc2VJbnQociksbz0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gdCYmbitpPm99KSl9Z2V0UEtDRUNvZGUoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcih1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0oZSksbil9KSl9c2V0UEtDRUNvZGUoZSxuLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShuKSxlLHIpfSkpfXVwZGF0ZUNvbmZpZyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRDb25maWdEYXRhKGUpLHlpZWxkIHRoaXMuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITApfSkpfX1jbGFzcyBme2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5faWQ9ZSx0aGlzLl9zdG9yZT10fXNldERhdGFJbkJ1bGsoZSxuKXt2YXIgcjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9bnVsbCE9PShyPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEoZSkpJiZ2b2lkIDAhPT1yP3I6bnVsbCxpPXQmJkpTT04ucGFyc2UodCksbz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSksbikscz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9c2V0VmFsdWUoZSxuLHIpe3ZhciBpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KGk9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PWk/aTpudWxsLG89dCYmSlNPTi5wYXJzZSh0KSxzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxvKSx7W25dOnJ9KSxhPUpTT04uc3RyaW5naWZ5KHMpO3lpZWxkIHRoaXMuX3N0b3JlLnNldERhdGEoZSxhKX0pKX1yZW1vdmVWYWx1ZShlLG4pe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KHI9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PXI/cjpudWxsLGk9dCYmSlNPTi5wYXJzZSh0KSxvPU9iamVjdC5hc3NpZ24oe30saSk7ZGVsZXRlIG9bbl07Y29uc3Qgcz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9X3Jlc29sdmVLZXkoZSx0KXtyZXR1cm4gdD8iIi5jb25jYXQoZSwiLSIpLmNvbmNhdCh0aGlzLl9pZCwiLSIpLmNvbmNhdCh0KToiIi5jb25jYXQoZSwiLSIpLmNvbmNhdCh0aGlzLl9pZCl9aXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKXt0cnl7Y29uc3QgZT0iX19BU0dBUkRFT19BVVRIX0NPUkVfTE9DQUxfU1RPUkFHRV9URVNUX18iO3JldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShlLGUpLGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX1zZXRDb25maWdEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoci5Db25maWdEYXRhKSxlKX0pKX1zZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KHIuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXNldFRlbXBvcmFyeURhdGEoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxuKSxlKX0pKX1zZXRTZXNzaW9uRGF0YShlLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoci5TZXNzaW9uRGF0YSxuKSxlKX0pKX1zZXRDdXN0b21EYXRhKGUsbixyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KGUsciksbil9KSl9Z2V0Q29uZmlnRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpKSkmJnZvaWQgMCE9PWU/ZTpudWxsKX0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShyLk9JRENQcm92aWRlck1ldGFEYXRhKSkpJiZ2b2lkIDAhPT1lP2U6bnVsbCl9KSl9Z2V0VGVtcG9yYXJ5RGF0YShlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0obj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5UZW1wb3JhcnlEYXRhLGUpKSkmJnZvaWQgMCE9PW4/bjpudWxsKX0pKX1nZXRTZXNzaW9uRGF0YShlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0obj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5TZXNzaW9uRGF0YSxlKSkpJiZ2b2lkIDAhPT1uP246bnVsbCl9KSl9Z2V0Q3VzdG9tRGF0YShlLG4pe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShyPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShlLG4pKSkmJnZvaWQgMCE9PXI/cjpudWxsKX0pKX1zZXRTZXNzaW9uU3RhdHVzKGUpe3RoaXMuaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSYmbG9jYWxTdG9yYWdlLnNldEl0ZW0oImFzZ2FyZGVvLXNlc3Npb24tYWN0aXZlIixlKX1nZXRTZXNzaW9uU3RhdHVzKCl7dmFyIGU7cmV0dXJuIHRoaXMuaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSYmbnVsbCE9PShlPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJhc2dhcmRlby1zZXNzaW9uLWFjdGl2ZSIpKSYmdm9pZCAwIT09ZT9lOiIifXJlbW92ZVNlc3Npb25TdGF0dXMoKXt0aGlzLmlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKCkmJmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJhc2dhcmRlby1zZXNzaW9uLWFjdGl2ZSIpfXJlbW92ZUNvbmZpZ0RhdGEoKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpKX0pKX1yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpKX0pKX1yZW1vdmVUZW1wb3JhcnlEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxlKSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5TZXNzaW9uRGF0YSxlKSl9KSl9Z2V0Q29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuQ29uZmlnRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5PSURDUHJvdmlkZXJNZXRhRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxuKSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodClbZV19KSl9Z2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuU2Vzc2lvbkRhdGEsbikpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfXNldENvbmZpZ0RhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpLGUsbil9KSl9c2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLk9JRENQcm92aWRlck1ldGFEYXRhKSxlLG4pfSkpfXNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxuLGkpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxpKSxlLG4pfSkpfXNldFNlc3Npb25EYXRhUGFyYW1ldGVyKGUsbixpKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLlNlc3Npb25EYXRhLGkpLGUsbil9KSl9cmVtb3ZlQ29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpLGUpfSkpfXJlbW92ZU9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KHIuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLlRlbXBvcmFyeURhdGEsbiksZSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLlNlc3Npb25EYXRhLG4pLGUpfSkpfX1jb25zdCBwPXtjbG9ja1RvbGVyYW5jZTozMDAsZW5hYmxlUEtDRTohMCxyZXNwb25zZU1vZGU6bi5xdWVyeSxzY29wZTpbIm9wZW5pZCJdLHNlbmRDb29raWVzSW5SZXF1ZXN0czohMCx2YWxpZGF0ZUlEVG9rZW46ITAsdmFsaWRhdGVJRFRva2VuSXNzdWVyOiEwfTtjbGFzcyBnewovKioKICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gc3RvcmUgLSBUaGUgc3RvcmUgb2JqZWN0LgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IF9zdG9yZTogU3RvcmUgPSBuZXcgRGF0YVN0b3JlKCk7CiAgICAgICAgICAgKiBjb25zdCBhdXRoID0gbmV3IEFzZ2FyZGVvQXV0aENsaWVudDxDdXN0b21DbGllbnRDb25maWc+KF9zdG9yZSk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2NvbnN0cnVjdG9yfQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovCmNvbnN0cnVjdG9yKCl7fQovKioKICAgICAgICAgICAqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0aGUgU0RLIHdpdGggdGhlIGNvbmZpZyBkYXRhLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlnIG9iamVjdCB0byBpbml0aWFsaXplIHdpdGguCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IFx7CiAgICAgICAgICAgKiAgICAgc2lnbkluUmVkaXJlY3RVUkw6ICJodHRwOi8vbG9jYWxob3N0OjMwMDAvc2lnbi1pbiIsCiAgICAgICAgICAgKiAgICAgY2xpZW50SUQ6ICJjbGllbnQgSUQiLAogICAgICAgICAgICogICAgIGJhc2VVcmw6ICJodHRwczovL2xvY2FsaG9zdDo5NDQzIgogICAgICAgICAgICogXH0KICAgICAgICAgICAqCiAgICAgICAgICAgKiBhd2FpdCBhdXRoLmluaXRpYWxpemUoY29uZmlnKTsKICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2luaXRpYWxpemV9CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi9pbml0aWFsaXplKGUsbixyLGkpe3ZhciBvLHMsYTtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9ZS5jbGllbnRJRDtnLl9pbnN0YW5jZUlEP2cuX2luc3RhbmNlSUQrPTE6Zy5faW5zdGFuY2VJRD0wLGkmJihnLl9pbnN0YW5jZUlEPWkpLHRoaXMuX2RhdGFMYXllcj1uZXcgZih0PyJpbnN0YW5jZV8iLmNvbmNhdChnLl9pbnN0YW5jZUlELCItIikuY29uY2F0KHQpOiJpbnN0YW5jZV8iLmNvbmNhdChnLl9pbnN0YW5jZUlEKSxuKSx0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmU9bmV3IGgodGhpcy5fZGF0YUxheWVyLHIpLGcuX2F1dGhlbnRpY2F0aW9uQ29yZT1uZXcgaCh0aGlzLl9kYXRhTGF5ZXIscikseWllbGQgdGhpcy5fZGF0YUxheWVyLnNldENvbmZpZ0RhdGEoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scCksZSkse3Njb3BlOlsuLi5udWxsIT09KG89cC5zY29wZSkmJnZvaWQgMCE9PW8/bzpbXSwuLi5udWxsIT09KGE9bnVsbD09PShzPWUuc2NvcGUpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLmZpbHRlcigoZT0+e3ZhciB0O3JldHVybiEobnVsbD09PSh0PW51bGw9PXA/dm9pZCAwOnAuc2NvcGUpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmluY2x1ZGVzKGUpKX0pKSkmJnZvaWQgMCE9PWE/YTpbXV19KSl9KSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYERhdGFMYXllcmAgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBhY2Nlc3MgYXV0aGVudGljYXRpb24gZGF0YS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIFRoZSBgRGF0YUxheWVyYCBvYmplY3QuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogY29uc3QgZGF0YSA9IGF1dGguZ2V0RGF0YUxheWVyKCk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldERhdGFMYXllcn0KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL2dldERhdGFMYXllcigpe3JldHVybiB0aGlzLl9kYXRhTGF5ZXJ9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYGluc3RhbmNlSURgIHZhcmlhYmxlIG9mIHRoZSBnaXZlbiBpbnN0YW5jZS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIFRoZSBgaW5zdGFuY2VJRGAgbnVtYmVyLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IGluc3RhbmNlSWQgPSBhdXRoLmdldEluc3RhbmNlSUQoKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovZ2V0SW5zdGFuY2VJRCgpe3JldHVybiBnLl9pbnN0YW5jZUlEfQovKioKICAgICAgICAgKiBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZCB0aGF0IHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYXV0aG9yaXphdGlvbiBVUkwgcGFyYW1ldGVycy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcgLSAoT3B0aW9uYWwpIEEgY29uZmlnIG9iamVjdCB0byBmb3JjZSBpbml0aWFsaXphdGlvbiBhbmQgcGFzcwogICAgICAgICAqIGN1c3RvbSBwYXRoIHBhcmFtZXRlcnMgc3VjaCBhcyB0aGUgYGZpZHBgIHBhcmFtZXRlci4KICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYXV0aG9yaXphdGlvbiBVUkwgcGFyYW1ldGVycy4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXV0aC5nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKCkudGhlbigocGFyYW1zKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhwYXJhbXMpOwogICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICogfSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEF1dGhvcml6YXRpb25VUkxQYXJhbXN9CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIG51bGw9PXR8fGRlbGV0ZSB0LmZvcmNlSW5pdCwoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSk/dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEF1dGhvcml6YXRpb25VUkxQYXJhbXModCxuKTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEobnVsbD09ZT92b2lkIDA6ZS5mb3JjZUluaXQpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTFBhcmFtcyh0LG4pKSl9KSl9Ci8qKgogICAgICAgICAgICogVGhpcyBpcyBhbiBhc3luYyBtZXRob2QgdGhhdCByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGF1dGhvcml6YXRpb24gVVJMLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSBjb25maWcgLSAoT3B0aW9uYWwpIEEgY29uZmlnIG9iamVjdCB0byBmb3JjZSBpbml0aWFsaXphdGlvbiBhbmQgcGFzcwogICAgICAgICAgICogY3VzdG9tIHBhdGggcGFyYW1ldGVycyBzdWNoIGFzIHRoZSBmaWRwIHBhcmFtZXRlci4KICAgICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybnMgLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhdXRob3JpemF0aW9uIFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBhdXRoLmdldEF1dGhvcml6YXRpb25VUkwoKS50aGVuKCh1cmwpPT57CiAgICAgICAgICAgKiAgLy8gY29uc29sZS5sb2codXJsKTsKICAgICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgICAqIH0pOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRBdXRob3JpemF0aW9uVVJMfQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovZ2V0QXV0aG9yaXphdGlvblVSTChlLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBudWxsPT10fHxkZWxldGUgdC5mb3JjZUluaXQsKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIikpP3RoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBdXRob3JpemF0aW9uVVJMKHQsbik6dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldE9JRENQcm92aWRlck1ldGFEYXRhKG51bGw9PWU/dm9pZCAwOmUuZm9yY2VJbml0KS50aGVuKCgoKT0+dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEF1dGhvcml6YXRpb25VUkwodCxuKSkpfSkpfQovKioKICAgICAgICAgICAqIFRoaXMgaXMgYW4gYXN5bmMgbWV0aG9kIHRoYXQgc2VuZHMgYSByZXF1ZXN0IHRvIG9idGFpbiB0aGUgYWNjZXNzIHRva2VuIGFuZCByZXR1cm5zIGEgUHJvbWlzZQogICAgICAgICAgICogdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0b2tlbiBhbmQgb3RoZXIgcmVsZXZhbnQgZGF0YS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gYXV0aG9yaXphdGlvbkNvZGUgLSBUaGUgYXV0aG9yaXphdGlvbiBjb2RlLgogICAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0ZSAtIFRoZSBzZXNzaW9uIHN0YXRlLgogICAgICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIHJlc3BvbnNlLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGF1dGgucmVxdWVzdEFjY2Vzc1Rva2VuKGF1dGhDb2RlLCBzZXNzaW9uU3RhdGUpLnRoZW4oKHRva2VuKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHRva2VuKTsKICAgICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgICAqIH0pOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZXF1ZXN0QWNjZXNzVG9rZW59CiAgICAgICAgICAgKgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovcmVxdWVzdEFjY2Vzc1Rva2VuKGUsbixyLGksbyl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSk/dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlcXVlc3RBY2Nlc3NUb2tlbihlLG4scixpLG8pOnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSghMSkudGhlbigoKCk9PnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0QWNjZXNzVG9rZW4oZSxuLHIsaSxvKSkpfSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqICoqVGhpcyBkb2Vzbid0IGNsZWFyIHRoZSBhdXRoZW50aWNhdGlvbiBkYXRhLioqCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBzaWduLW91dCBVUkwuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogY29uc3Qgc2lnbk91dFVybCA9IGF3YWl0IGF1dGguZ2V0U2lnbk91dFVSTCgpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRTaWduT3V0VVJMfQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovZ2V0U2lnbk91dFVSTChlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0U2lnbk91dFVSTChlKX0pKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIE9JREMgc2VydmljZSBlbmRwb2ludHMgdGhhdCBhcmUgZmV0Y2hlZCBmcm9tIHRoZSBgLndlbGwta25vd25gIGVuZHBvaW50LgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgT0lEQyBzZXJ2aWNlIGVuZHBvaW50cy4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBhdXRoLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldE9JRENTZXJ2aWNlRW5kcG9pbnRzfQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKX0pKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCBkZWNvZGVzIHRoZSBwYXlsb2FkIG9mIHRoZSBJRCB0b2tlbiBhbmQgcmV0dXJucyBpdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZGVjb2RlZCBJRCB0b2tlbiBwYXlsb2FkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IGRlY29kZWRJZFRva2VuID0gYXdhaXQgYXV0aC5nZXREZWNvZGVkSURUb2tlbigpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXREZWNvZGVkSURUb2tlbn0KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL2dldERlY29kZWRJRFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXREZWNvZGVkSURUb2tlbihlKX0pKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBJRCB0b2tlbi4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgSUQgdG9rZW4uCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogY29uc3QgaWRUb2tlbiA9IGF3YWl0IGF1dGguZ2V0SURUb2tlbigpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRJRFRva2VufQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovZ2V0SURUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0SURUb2tlbihlKX0pKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBiYXNpYyB1c2VyIGluZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gdGhlIElEIHRva2VuLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBiYXNpYyB1c2VyIGluZm9ybWF0aW9uLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IHVzZXJJbmZvID0gYXdhaXQgYXV0aC5nZXRCYXNpY1VzZXJJbmZvKCk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEJhc2ljVXNlckluZm99CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi9nZXRCYXNpY1VzZXJJbmZvKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRCYXNpY1VzZXJJbmZvKGUpfSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGNyeXB0byBoZWxwZXIgb2JqZWN0LgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIENyeXB0b0hlbHBlciBvYmplY3QuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogY29uc3QgY3J5cHRvSGVscGVyID0gYXdhaXQgYXV0aC5DcnlwdG9IZWxwZXIoKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0Q3J5cHRvSGVscGVyfQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovZ2V0Q3J5cHRvSGVscGVyKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldENyeXB0b0hlbHBlcigpfSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIHJldm9rZXMgdGhlIGFjY2VzcyB0b2tlbi4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqICoqVGhpcyBtZXRob2QgYWxzbyBjbGVhcnMgdGhlIGF1dGhlbnRpY2F0aW9uIGRhdGEuKioKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIEEgUHJvbWlzZSB0aGF0IHJldHVybnMgdGhlIHJlc3BvbnNlIG9mIHRoZSByZXZva2UtYWNjZXNzLXRva2VuIHJlcXVlc3QuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogYXV0aC5yZXZva2VBY2Nlc3NUb2tlbigpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTsKICAgICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgICAqIH0pOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZXZva2VBY2Nlc3NUb2tlbn0KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL3Jldm9rZUFjY2Vzc1Rva2VuKGUpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmV2b2tlQWNjZXNzVG9rZW4oZSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmVmcmVzaGVzIHRoZSBhY2Nlc3MgdG9rZW4gYW5kIHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbmV3IGFjY2VzcwogICAgICAgICAgICogdG9rZW4gYW5kIG90aGVyIHJlbGV2YW50IGRhdGEuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIHJlc3BvbnNlLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGF1dGgucmVmcmVzaEFjY2Vzc1Rva2VuKCkudGhlbigocmVzcG9uc2UpPT57CiAgICAgICAgICAgKiAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpOwogICAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAgICogfSk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3JlZnJlc2hBY2Nlc3NUb2tlbn0KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL3JlZnJlc2hBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlZnJlc2hBY2Nlc3NUb2tlbihlKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICAgKgogICAgICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGFjY2VzcyB0b2tlbi4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGF1dGguZ2V0QWNjZXNzVG9rZW4oKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QWNjZXNzVG9rZW59CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi9nZXRBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QWNjZXNzVG9rZW4oZSl9KSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2Qgc2VuZHMgYSBjdXN0b20tZ3JhbnQgcmVxdWVzdCBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZQogICAgICAgICAgICogZGVwZW5kaW5nIG9uIHRoZSBjb25maWcgcGFzc2VkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSBjb25maWcgLSBBIGNvbmZpZyBvYmplY3QgY29udGFpbmluZyB0aGUgY3VzdG9tIGdyYW50IGNvbmZpZ3VyYXRpb25zLgogICAgICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3BvbnNlIGRlcGVuZGluZwogICAgICAgICAgICogb24geW91ciBjb25maWd1cmF0aW9ucy4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBjb25maWcgPSB7CiAgICAgICAgICAgKiAgIGF0dGFjaFRva2VuOiBmYWxzZSwKICAgICAgICAgICAqICAgZGF0YTogewogICAgICAgICAgICogICAgICAgY2xpZW50X2lkOiAie3tjbGllbnRJRH19IiwKICAgICAgICAgICAqICAgICAgIGdyYW50X3R5cGU6ICJhY2NvdW50X3N3aXRjaCIsCiAgICAgICAgICAgKiAgICAgICBzY29wZTogInt7c2NvcGV9fSIsCiAgICAgICAgICAgKiAgICAgICB0b2tlbjogInt7dG9rZW59fSIsCiAgICAgICAgICAgKiAgIH0sCiAgICAgICAgICAgKiAgIGlkOiAiYWNjb3VudC1zd2l0Y2giLAogICAgICAgICAgICogICByZXR1cm5SZXNwb25zZTogdHJ1ZSwKICAgICAgICAgICAqICAgcmV0dXJuc1Nlc3Npb246IHRydWUsCiAgICAgICAgICAgKiAgIHNpZ25JblJlcXVpcmVkOiB0cnVlCiAgICAgICAgICAgKiB9CiAgICAgICAgICAgKgogICAgICAgICAgICogYXV0aC5yZXF1ZXN0Q3VzdG9tR3JhbnQoY29uZmlnKS50aGVuKChyZXNwb25zZSk9PnsKICAgICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICAgKiB9KTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmVxdWVzdEN1c3RvbUdyYW50fQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovcmVxdWVzdEN1c3RvbUdyYW50KGUsdCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0Q3VzdG9tR3JhbnQoZSx0KX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQgb3Igbm90LgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBhd2FpdCBhdXRoLmlzQXV0aGVudGljYXRlZCgpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNpc0F1dGhlbnRpY2F0ZWR9CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi9pc0F1dGhlbnRpY2F0ZWQoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmlzQXV0aGVudGljYXRlZChlKX0pKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBQS0NFIGNvZGUgZ2VuZXJhdGVkIGR1cmluZyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgYXV0aGVudGljYXRpb24gVVJMLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUgc3RhdGUgcGFyYW1ldGVyIHRoYXQgd2FzIHBhc3NlZCBpbiB0aGUgYXV0aGVudGljYXRpb24gVVJMLgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgUEtDRSBjb2RlLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IHBrY2UgPSBhd2FpdCBnZXRQS0NFQ29kZSgpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRQS0NFQ29kZX0KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL2dldFBLQ0VDb2RlKGUsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldFBLQ0VDb2RlKGUsbil9KSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgUEtDRSBjb2RlIHRvIHRoZSBkYXRhIHN0b3JlLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSBwa2NlIC0gVGhlIFBLQ0UgY29kZS4KICAgICAgICAgICAqIEBwYXJhbSBzdGF0ZSAtIFRoZSBzdGF0ZSBwYXJhbWV0ZXIgdGhhdCB3YXMgcGFzc2VkIGluIHRoZSBhdXRoZW50aWNhdGlvbiBVUkwuCiAgICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGF3YWl0IGF1dGguc2V0UEtDRUNvZGUoInBrY2VfY29kZSIpCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3NldFBLQ0VDb2RlfQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovc2V0UEtDRUNvZGUoZSxuLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnNldFBLQ0VDb2RlKGUsbixyKX0pKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSBzaWduLW91dCBpcyBzdWNjZXNzZnVsIG9yIG5vdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gc2lnbk91dFJlZGlyZWN0VXJsIC0gVGhlIFVSTCB0byB3aGljaCB0aGUgdXNlciBoYXMgYmVlbiByZWRpcmVjdGVkIHRvIGFmdGVyIHNpZ25pbmctb3V0LgogICAgICAgICAgICoKICAgICAgICAgICAqICoqVGhlIHNlcnZlciBhcHBlbmRzIHBhdGggcGFyYW1ldGVycyB0byB0aGUgYHNpZ25PdXRSZWRpcmVjdFVSTGAgYW5kIHRoZXNlIHBhdGggcGFyYW1ldGVycwogICAgICAgICAgICogIGFyZSByZXF1aXJlZCBmb3IgdGhpcyBtZXRob2QgdG8gZnVuY3Rpb24uKioKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIGB0cnVlYCBpZiBzdWNjZXNzZnVsLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2lzU2lnbk91dFN1Y2Nlc3NmdWx9CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi9zdGF0aWMgaXNTaWduT3V0U3VjY2Vzc2Z1bChlKXtjb25zdCB0PW5ldyBVUkwoZSksbj10LnNlYXJjaFBhcmFtcy5nZXQoInN0YXRlIikscj1Cb29sZWFuKHQuc2VhcmNoUGFyYW1zLmdldCgiZXJyb3IiKSk7cmV0dXJuISFuJiYic2lnbl9vdXRfc3VjY2VzcyI9PT1uJiYhcn0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSBzaWduLW91dCBoYXMgZmFpbGVkIG9yIG5vdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gc2lnbk91dFJlZGlyZWN0VXJsIC0gVGhlIFVSTCB0byB3aGljaCB0aGUgdXNlciBoYXMgYmVlbiByZWRpcmVjdGVkIHRvIGFmdGVyIHNpZ25pbmctb3V0LgogICAgICAgICAgICoKICAgICAgICAgICAqICoqVGhlIHNlcnZlciBhcHBlbmRzIHBhdGggcGFyYW1ldGVycyB0byB0aGUgYHNpZ25PdXRSZWRpcmVjdFVSTGAgYW5kIHRoZXNlIHBhdGggcGFyYW1ldGVycwogICAgICAgICAgICogIGFyZSByZXF1aXJlZCBmb3IgdGhpcyBtZXRob2QgdG8gZnVuY3Rpb24uKioKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIGB0cnVlYCBpZiBzdWNjZXNzZnVsLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2RpZFNpZ25PdXRGYWlsfQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovc3RhdGljIGRpZFNpZ25PdXRGYWlsKGUpe2NvbnN0IHQ9bmV3IFVSTChlKSxuPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxyPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIW4mJiJzaWduX291dF9zdWNjZXNzIj09PW4mJnJ9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgY29uZmlndXJhdGlvbiB0aGF0IHdhcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igd2hlbiBpbnN0YW50aWF0aW5nIHRoaXMgY2xhc3MuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHBhcmFtIGNvbmZpZyAtIEEgY29uZmlnIG9iamVjdCB0byB1cGRhdGUgdGhlIFNESyBjb25maWd1cmF0aW9ucyB3aXRoLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICAgICAqICAgICBzaWduSW5SZWRpcmVjdFVSTDogImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9zaWduLWluIiwKICAgICAgICAgICAqICAgICBjbGllbnRJRDogImNsaWVudCBJRCIsCiAgICAgICAgICAgKiAgICAgYmFzZVVybDogImh0dHBzOi8vbG9jYWxob3N0Ojk0NDMiCiAgICAgICAgICAgKiB9CiAgICAgICAgICAgKgogICAgICAgICAgICogYXdhaXQgYXV0aC51cGRhdGVDb25maWcoY29uZmlnKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciN1cGRhdGVDb25maWd9CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi91cGRhdGVDb25maWcoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUudXBkYXRlQ29uZmlnKGUpfSkpfXN0YXRpYyBjbGVhclVzZXJTZXNzaW9uRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5jbGVhclVzZXJTZXNzaW9uRGF0YShlKX0pKX19Y29uc3QgeT0iaW5pdCI7dmFyIHY7IWZ1bmN0aW9uKGUpe2UuU2lnbkluPSJzaWduLWluIixlLlNpZ25PdXQ9InNpZ24tb3V0IixlLkluaXRpYWxpemU9ImluaXRpYWxpemUiLGUuSHR0cFJlcXVlc3RTdGFydD0iaHR0cC1yZXF1ZXN0LXN0YXJ0IixlLkh0dHBSZXF1ZXN0RmluaXNoPSJodHRwLXJlcXVlc3QtZmluaXNoIixlLkh0dHBSZXF1ZXN0RXJyb3I9Imh0dHAtcmVxdWVzdC1lcnJvciIsZS5IdHRwUmVxdWVzdFN1Y2Nlc3M9Imh0dHAtcmVxdWVzdC1zdWNjZXNzIixlLlJldm9rZUFjY2Vzc1Rva2VuPSJyZXZva2UtYWNjZXNzLXRva2VuIixlLkN1c3RvbUdyYW50PSJjdXN0b20tZ3JhbnQiLGUuU2lnbk91dEZhaWxlZD0ic2lnbi1vdXQtZmFpbGVkIn0odnx8KHY9e30pKTtjb25zdCBtPSJwcm9tcHROb25lUmVxdWVzdFNlbnQiLHc9ImVycm9yIixiPSJlcnJvcl9kZXNjcmlwdGlvbiIsXz0iY3VzdG9tX2dyYW50X2NvbmZpZyIsUz0iQWNjZXNzIHRva2VuIGlzIGludmFsaWQiO3ZhciBFOyFmdW5jdGlvbihlKXtlLkxvY2FsU3RvcmFnZT0ibG9jYWxTdG9yYWdlIixlLlNlc3Npb25TdG9yYWdlPSJzZXNzaW9uU3RvcmFnZSIsZS5XZWJXb3JrZXI9IndlYldvcmtlciIsZS5Ccm93c2VyTWVtb3J5PSJicm93c2VyTWVtb3J5In0oRXx8KEU9e30pKTtjbGFzcyBSe2NvbnN0cnVjdG9yKCl7fXN0YXRpYyBnZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpe3JldHVybntibG9iOihudWxsPT1lP3ZvaWQgMDplLmRhdGEpaW5zdGFuY2VvZiBCbG9iP251bGw9PWU/dm9pZCAwOmUuZGF0YTpudWxsLGRhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSxzdWNjZXNzOiEwfX1zdGF0aWMgZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKXtyZXR1cm4obnVsbD09ZT92b2lkIDA6ZS50b0pTT04pJiZkZWxldGUgZS50b0pTT04se2Vycm9yOkpTT04uc3RyaW5naWZ5KG51bGwhPWU/ZToiIiksc3VjY2VzczohMX19fWNsYXNzIFR7Y29uc3RydWN0b3IoKXt9c3RhdGljIHJlbW92ZUF1dGhvcml6YXRpb25Db2RlKCl7Y29uc3QgZT1sb2NhdGlvbi5ocmVmO2hpc3RvcnkucHVzaFN0YXRlKHt9LGRvY3VtZW50LnRpdGxlLGUucmVwbGFjZSgvXD9jb2RlPS4qJC8sIiIpKX1zdGF0aWMgZ2V0UEtDRShlKXt2YXIgdDtyZXR1cm4gbnVsbCE9PSh0PXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oZSkpJiZ2b2lkIDAhPT10P3Q6IiJ9c3RhdGljIHNldFBLQ0UoZSx0KXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGUsdCl9c3RhdGljIHNldFNpZ25PdXRVUkwoZSx0LG4pe3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oIiIuY29uY2F0KHMsIi1pbnN0YW5jZV8iKS5jb25jYXQobiwiLSIpLmNvbmNhdCh0KSxlKX1zdGF0aWMgZ2V0U2lnbk91dFVSTChlLHQpe3ZhciBuO3JldHVybiBudWxsIT09KG49c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiIi5jb25jYXQocywiLWluc3RhbmNlXyIpLmNvbmNhdCh0LCItIikuY29uY2F0KGUpKSkmJnZvaWQgMCE9PW4/bjoiIn1zdGF0aWMgcmVtb3ZlUEtDRShlKXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGUpfXN0YXRpYyBjYW5Db250aW51ZVNpZ25JbihlLHQpe3JldHVybiEoZSYmIVQuaGFzRXJyb3JJblVSTCgpJiYhVC5oYXNBdXRoU2VhcmNoUGFyYW1zSW5VUkwoKSYmIXQpfXN0YXRpYyBpc0luaXRpYWxpemVkU2lsZW50U2lnbkluKCl7cmV0dXJuIFQuaXNTaWxlbnRTdGF0ZVByZXNlbnRJblVSTCgpfXN0YXRpYyB3YXNTaWduSW5DYWxsZWQoKXtyZXR1cm4hKCFULmhhc0Vycm9ySW5VUkwoKSYmIVQuaGFzQXV0aFNlYXJjaFBhcmFtc0luVVJMKCl8fHRoaXMuaXNTaWxlbnRTdGF0ZVByZXNlbnRJblVSTCgpKX1zdGF0aWMgd2FzU2lsZW50U2lnbkluQ2FsbGVkKCl7Y29uc3QgZT1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJpbml0aWFsaXplZC1zaWxlbnQtc2lnbi1pbiIpLHQ9ZT9KU09OLnBhcnNlKGUpOm51bGw7cmV0dXJuIEJvb2xlYW4odCl9c3RhdGljIGlzU2lnbk91dFN1Y2Nlc3NmdWwoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKGcuaXNTaWduT3V0U3VjY2Vzc2Z1bCh3aW5kb3cubG9jYXRpb24uaHJlZikpe2NvbnN0IGU9d2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoIj8iKVswXTtyZXR1cm4gaGlzdG9yeS5wdXNoU3RhdGUoe30sZG9jdW1lbnQudGl0bGUsZSkseWllbGQgZy5jbGVhclVzZXJTZXNzaW9uRGF0YSgpLCEwfXJldHVybiExfSkpfXN0YXRpYyBkaWRTaWduT3V0RmFpbCgpe2lmKGcuZGlkU2lnbk91dEZhaWwod2luZG93LmxvY2F0aW9uLmhyZWYpKXtjb25zdCBlPW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLHQ9ZS5zZWFyY2hQYXJhbXMuZ2V0KHcpLG49ZS5zZWFyY2hQYXJhbXMuZ2V0KGIpLHI9d2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoIj8iKVswXTtyZXR1cm4gaGlzdG9yeS5wdXNoU3RhdGUoe30sZG9jdW1lbnQudGl0bGUscikse2Rlc2NyaXB0aW9uOm51bGwhPW4/bjoiIixlcnJvcjpudWxsIT10P3Q6IiJ9fXJldHVybiExfXN0YXRpYyBpc1NpbGVudFN0YXRlUHJlc2VudEluVVJMKCl7dmFyIGU7Y29uc3QgdD1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCJzdGF0ZSIpO3JldHVybiBudWxsIT09KGU9bnVsbD09dD92b2lkIDA6dC5pbmNsdWRlcygic2lnbi1pbi1zaWxlbnRseSIpKSYmdm9pZCAwIT09ZSYmZX1zdGF0aWMgaGFzQXV0aFNlYXJjaFBhcmFtc0luVVJMKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOndpbmRvdy5sb2NhdGlvbi5zZWFyY2g7cmV0dXJuL1s/Jl1jb2RlPVteJl0rLy50ZXN0KGUpfXN0YXRpYyBoYXNFcnJvckluVVJMKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOndpbmRvdy5sb2NhdGlvbi5ocmVmO2NvbnN0IHQ9bmV3IFVSTChlKTtyZXR1cm4hIXQuc2VhcmNoUGFyYW1zLmdldCh3KSYmInNpZ25fb3V0X3N1Y2Nlc3MiIT09dC5zZWFyY2hQYXJhbXMuZ2V0KCJzdGF0ZSIpfXN0YXRpYyBjYW5TZW5kUHJvbXB0Tm9uZVJlcXVlc3QoKXtjb25zdCBlPXNlc3Npb25TdG9yYWdlLmdldEl0ZW0obSk7cmV0dXJuIShlP0pTT04ucGFyc2UoZSk6bnVsbCl9c3RhdGljIHNldFByb21wdE5vbmVSZXF1ZXN0U2VudChlKXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKG0sSlNPTi5zdHJpbmdpZnkoZSkpfXN0YXRpYyB3YWl0VGlsbFBhZ2VSZWRpcmVjdCh0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9bnVsbCE9dD90OjNlMzt5aWVsZCBuZXcgUHJvbWlzZSgodD0+c2V0VGltZW91dCh0LDFlMyplKSkpfSkpfX1ULnVudGlsPWZ1bmN0aW9uKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTo1MDA7Y29uc3Qgbj1yPT5lKCk/cigpOnNldFRpbWVvdXQoKCgpPT5uKHIpKSx0KTtyZXR1cm4gbmV3IFByb21pc2Uobil9O2NsYXNzIGt7Y29uc3RydWN0b3IoZSx0KXt0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudD1lLHRoaXMuX2RhdGFMYXllcj10aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXREYXRhTGF5ZXIoKSx0aGlzLl9zcGFIZWxwZXI9dCx0aGlzLl9pbnN0YW5jZUlEPXRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEluc3RhbmNlSUQoKSx0aGlzLl9pc1Rva2VuUmVmcmVzaGluZz0hMX1lbmFibGVIdHRwSGFuZGxlcihlKXsobnVsbD09ZT92b2lkIDA6ZS5lbmFibGVIYW5kbGVyKSYmZS5lbmFibGVIYW5kbGVyKCl9ZGlzYWJsZUh0dHBIYW5kbGVyKGUpeyhudWxsPT1lP3ZvaWQgMDplLmRpc2FibGVIYW5kbGVyKSYmZS5kaXNhYmxlSGFuZGxlcigpfWluaXRpYWxpemVTZXNzaW9uTWFuZ2VyKGUsdCxuLHIsaSl7dmFyIG8scyxhO2kuaW5pdGlhbGl6ZShlLmNsaWVudElELG51bGwhPT0obz10LmNoZWNrU2Vzc2lvbklmcmFtZSkmJnZvaWQgMCE9PW8/bzoiIixuLG51bGwhPT0ocz1lLmNoZWNrU2Vzc2lvbkludGVydmFsKSYmdm9pZCAwIT09cz9zOjMsbnVsbCE9PShhPWUuc2Vzc2lvblJlZnJlc2hJbnRlcnZhbCkmJnZvaWQgMCE9PWE/YTozMDAsZS5zaWduSW5SZWRpcmVjdFVSTCxyKX1yZXF1ZXN0Q3VzdG9tR3JhbnQodCxuKXt2YXIgcixpLG87cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtsZXQgcz0hMCxhPSExO2lmKG51bGw9PXQ/dm9pZCAwOnQudG9rZW5FbmRwb2ludCl7cz0hMTtmb3IoY29uc3QgZSBvZlsuLi5udWxsIT09KGk9bnVsbD09PShyPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCkpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnJlc291cmNlU2VydmVyVVJMcykmJnZvaWQgMCE9PWk/aTpbXSx0LmJhc2VVcmxdKWlmKGUmJihudWxsPT09KG89dC50b2tlbkVuZHBvaW50KXx8dm9pZCAwPT09bz92b2lkIDA6by5zdGFydHNXaXRoKGUpKSl7YT0hMDticmVha319cmV0dXJuIHQuc2hvdWxkUmVwbGF5QWZ0ZXJSZWZyZXNoJiZ0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihfLEpTT04uc3RyaW5naWZ5KHQpKSxzfHxhP3RoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnJlcXVlc3RDdXN0b21HcmFudCh0KS50aGVuKChyPT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZuKHQpLHQucmV0dXJuc1Nlc3Npb24/KHRoaXMuX3NwYUhlbHBlci5yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KHRoaXMpLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKSk6cn0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpOlByb21pc2UucmVqZWN0KG5ldyBjKCJTUEEtTUFJTl9USFJFQURfQ0xJRU5ULVJDRy1JVjAxIiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgdG9rZW4gZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKSl9KSl9Z2V0Q3VzdG9tR3JhbnRDb25maWdEYXRhKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKF8pO3JldHVybiBlP0pTT04ucGFyc2UoZSk6bnVsbH0pKX1yZWZyZXNoQWNjZXNzVG9rZW4odCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0cnl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQucmVmcmVzaEFjY2Vzc1Rva2VuKCk7Y29uc3QgZT15aWVsZCB0aGlzLmdldEN1c3RvbUdyYW50Q29uZmlnRGF0YSgpO3JldHVybiBlJiYoeWllbGQgdGhpcy5yZXF1ZXN0Q3VzdG9tR3JhbnQoZSx0KSksdGhpcy5fc3BhSGVscGVyLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkodGhpcyksdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QmFzaWNVc2VySW5mbygpfWNhdGNoKGUpe2NvbnN0IHQ9e3R5cGU6InJlZnJlc2gtYWNjZXNzLXRva2VuLWVycm9yIn07cmV0dXJuIHdpbmRvdy5wb3N0TWVzc2FnZSh0KSxQcm9taXNlLnJlamVjdChlKX19KSl9cmV0cnlGYWlsZWRSZXF1ZXN0cyh0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9dC5odHRwQ2xpZW50LG49dC5yZXF1ZXN0Q29uZmlnLHI9dC5pc0h0dHBIYW5kbGVyRW5hYmxlZCxpPXQuaHR0cEVycm9yQ2FsbGJhY2ssbz10Lmh0dHBGaW5pc2hDYWxsYmFjazt5aWVsZCBULnVudGlsKCgoKT0+IXRoaXMuX2lzVG9rZW5SZWZyZXNoaW5nKSk7dHJ5e2NvbnN0IHQ9eWllbGQgZS5yZXF1ZXN0KG4pO3JldHVybiBQcm9taXNlLnJlc29sdmUodCl9Y2F0Y2goZSl7cmV0dXJuIHImJigiZnVuY3Rpb24iPT10eXBlb2YgaSYmKHlpZWxkIGkoZSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvKCkpLFByb21pc2UucmVqZWN0KGUpfX0pKX1odHRwUmVxdWVzdCh0LG4scixpLG8scyl7dmFyIGEsdTtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2xldCBsPSExO2NvbnN0IGQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtmb3IoY29uc3QgZSBvZlsuLi5udWxsIT09KGE9eWllbGQgbnVsbD09ZD92b2lkIDA6ZC5yZXNvdXJjZVNlcnZlclVSTHMpJiZ2b2lkIDAhPT1hP2E6W10sZC5iYXNlVXJsXSlpZihlJiYobnVsbD09PSh1PW51bGw9PW4/dm9pZCAwOm4udXJsKXx8dm9pZCAwPT09dT92b2lkIDA6dS5zdGFydHNXaXRoKGUpKSl7bD0hMDticmVha31yZXR1cm4gbD90LnJlcXVlc3QobikudGhlbigoZT0+UHJvbWlzZS5yZXNvbHZlKGUpKSkuY2F0Y2goKGE9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgZSx1LGw7aWYoNDAxPT09KG51bGw9PT0oZT1udWxsPT1hP3ZvaWQgMDphLnJlc3BvbnNlKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5zdGF0dXMpfHwhKG51bGw9PWE/dm9pZCAwOmEucmVzcG9uc2UpKXtpZih0aGlzLl9pc1Rva2VuUmVmcmVzaGluZylyZXR1cm4gdGhpcy5yZXRyeUZhaWxlZFJlcXVlc3RzKHtlbmFibGVSZXRyaWV2aW5nU2lnbk91dFVSTEZyb21TZXNzaW9uOnMsaHR0cENsaWVudDp0LGh0dHBFcnJvckNhbGxiYWNrOmksaHR0cEZpbmlzaENhbGxiYWNrOm8saXNIdHRwSGFuZGxlckVuYWJsZWQ6cixyZXF1ZXN0Q29uZmlnOm59KTtsZXQgZTt0aGlzLl9pc1Rva2VuUmVmcmVzaGluZz0hMDt0cnl7ZT15aWVsZCB0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbihzKSx0aGlzLl9pc1Rva2VuUmVmcmVzaGluZz0hMX1jYXRjaChlKXt0aHJvdyB0aGlzLl9pc1Rva2VuUmVmcmVzaGluZz0hMSxyJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJih5aWVsZCBpKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7Y29kZTpTfSkpKSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbygpKSxuZXcgYygiU1BBLUFVVEhfSEVMUEVSLUhSLVNFMDEiLG51bGwhPT0odT1udWxsPT1lP3ZvaWQgMDplLm5hbWUpJiZ2b2lkIDAhPT11P3U6IlJlZnJlc2ggdG9rZW4gcmVxdWVzdCBmYWlsZWQuIixudWxsIT09KGw9bnVsbD09ZT92b2lkIDA6ZS5tZXNzYWdlKSYmdm9pZCAwIT09bD9sOiJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcmVmcmVzaCB0aGUgYWNjZXNzIHRva2VuIGZvbGxvd2luZyBhIDQwMSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuIil9aWYoZSl0cnl7Y29uc3QgZT15aWVsZCB0LnJlcXVlc3Qobik7cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKX1jYXRjaChlKXtyZXR1cm4gciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaShlKSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksUHJvbWlzZS5yZWplY3QoZSl9fXJldHVybiByJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJih5aWVsZCBpKGEpKSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbygpKSxQcm9taXNlLnJlamVjdChhKX0pKSkpOlByb21pc2UucmVqZWN0KG5ldyBjKCJTUEEtQVVUSF9IRUxQRVItSFItSVYwMiIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIikpfSkpfWh0dHBSZXF1ZXN0QWxsKHQsbixyLGksbyl7dmFyIHMsYSx1O3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7bGV0IGw9ITA7Y29uc3QgZD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpO2Zvcihjb25zdCBlIG9mIHQpe2xldCB0PSExO2Zvcihjb25zdCBuIG9mWy4uLm51bGwhPT0oYT1udWxsPT09KHM9eWllbGQgZCl8fHZvaWQgMD09PXM/dm9pZCAwOnMucmVzb3VyY2VTZXJ2ZXJVUkxzKSYmdm9pZCAwIT09YT9hOltdLGQuYmFzZVVybF0paWYobiYmKG51bGw9PT0odT1lLnVybCl8fHZvaWQgMD09PXU/dm9pZCAwOnUuc3RhcnRzV2l0aChuKSkpe3Q9ITA7YnJlYWt9aWYoIXQpe2w9ITE7YnJlYWt9fWNvbnN0IGg9W107aWYobClyZXR1cm4gdC5mb3JFYWNoKChlPT57aC5wdXNoKG4ucmVxdWVzdChlKSl9KSksKG51bGw9PW4/dm9pZCAwOm4uYWxsKSYmbi5hbGwoaCkudGhlbigoZT0+UHJvbWlzZS5yZXNvbHZlKGUpKSkuY2F0Y2goKHQ9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgcyxhLHU7aWYoNDAxPT09KG51bGw9PT0ocz1udWxsPT10P3ZvaWQgMDp0LnJlc3BvbnNlKXx8dm9pZCAwPT09cz92b2lkIDA6cy5zdGF0dXMpfHwhKG51bGw9PXQ/dm9pZCAwOnQucmVzcG9uc2UpKXtsZXQgczt0cnl7cz15aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZWZyZXNoQWNjZXNzVG9rZW4oKX1jYXRjaChlKXt0aHJvdyByJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJih5aWVsZCBpKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7Y29kZTpTfSkpKSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbygpKSxuZXcgYygiU1BBLUFVVEhfSEVMUEVSLUhSQS1TRTAxIixudWxsIT09KGE9bnVsbD09ZT92b2lkIDA6ZS5uYW1lKSYmdm9pZCAwIT09YT9hOiJSZWZyZXNoIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9PSh1PW51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSkmJnZvaWQgMCE9PXU/dToiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiBmb2xsb3dpbmcgYSA0MDEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiIpfWlmKHMpcmV0dXJuIG4uYWxsJiZuLmFsbChoKS50aGVuKChlPT5Qcm9taXNlLnJlc29sdmUoZSkpKS5jYXRjaCgodD0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiByJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJih5aWVsZCBpKHQpKSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbygpKSxQcm9taXNlLnJlamVjdCh0KX0pKSkpfXJldHVybiByJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJih5aWVsZCBpKHQpKSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbygpKSxQcm9taXNlLnJlamVjdCh0KX0pKSkpO3Rocm93IG5ldyBjKCJTUEEtQVVUSF9IRUxQRVItSFJBLUlWMDIiLCJSZXF1ZXN0IHRvIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBwcm9oaWJpdGVkLiIsIlJlcXVlc3RzIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVzb3VyY2Ugc2VydmVycyBzcGVjaWZpZWQgYnkgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIGF0dHJpYnV0ZSB3aGlsZSBpbml0aWFsaXppbmcgdGhlIFNESy4gVGhlIHNwZWNpZmllZCBlbmRwb2ludCBpbiB0aGlzIHJlcXVlc3QgY2Fubm90IGJlIGZvdW5kIGFtb25nIHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCIpfSkpfXJlcXVlc3RBY2Nlc3NUb2tlbih0LG4scixpLG8scyl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBhPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCk7aWYoYS5zdG9yYWdlPT09RS5Ccm93c2VyTWVtb3J5JiZhLmVuYWJsZVBLQ0UmJm4pe2NvbnN0IGU9VC5nZXRQS0NFKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShuKSk7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuc2V0UEtDRUNvZGUodS5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKG4pLGUpfWVsc2UgYS5zdG9yYWdlPT09RS5XZWJXb3JrZXImJmkmJih5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5zZXRQS0NFQ29kZShpLG51bGwhPW8/bzoiIikpO3JldHVybiB0P3RoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnJlcXVlc3RBY2Nlc3NUb2tlbih0LG51bGwhPW4/bjoiIixudWxsIT1vP286IiIsdm9pZCAwLHMpLnRoZW4oKCgpPT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuc3RvcmFnZSE9PUUuV2ViV29ya2VyPyhULnNldFNpZ25PdXRVUkwoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0U2lnbk91dFVSTCgpLGEuY2xpZW50SUQsdGhpcy5faW5zdGFuY2VJRCksdGhpcy5fc3BhSGVscGVyJiYodGhpcy5fc3BhSGVscGVyLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHRoaXMuX3NwYUhlbHBlci5yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KHRoaXMpKSxyJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmYS5lbmFibGVPSURDU2Vzc2lvbk1hbmFnZW1lbnQmJnIoKSk6dGhpcy5fc3BhSGVscGVyJiZ0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0aGlzKSx0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRCYXNpY1VzZXJJbmZvKCl9KSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKTpQcm9taXNlLnJlamVjdChuZXcgYygiU1BBLUFVVEhfSEVMUEVSLVJBVDEtTkYwMSIsIk5vIGF1dGhvcml6YXRpb24gY29kZS4iLCJObyBhdXRob3JpemF0aW9uIGNvZGUgd2FzIGZvdW5kLiIpKX0pKX10cnlTaWduSW5TaWxlbnRseSh0LG4scixpLG8pe3ZhciBzO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoVC5pc0luaXRpYWxpemVkU2lsZW50U2lnbkluKCkpcmV0dXJuIHlpZWxkIHIucmVjZWl2ZVByb21wdE5vbmVSZXNwb25zZSgpLFByb21pc2UucmVzb2x2ZSh7YWxsb3dlZFNjb3BlczoiIixkaXNwbGF5TmFtZToiIixlbWFpbDoiIixzZXNzaW9uU3RhdGU6IiIsc3ViOiIiLHRlbmFudERvbWFpbjoiIix1c2VybmFtZToiIn0pO2NvbnN0IGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJwSUZyYW1lIiksYz1udWxsPT09KHM9bnVsbD09YT92b2lkIDA6YS5jb250ZW50RG9jdW1lbnQpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLmdldEVsZW1lbnRCeUlkKCJwcm9tcHROb25lSUZyYW1lIik7dHJ5e2NvbnN0IGU9eWllbGQgdChpKTtjLnNyYz1lfWNhdGNoKGUpe3JldHVybiBQcm9taXNlLnJlamVjdChlKX1yZXR1cm4gbmV3IFByb21pc2UoKCh0LHIpPT57Y29uc3QgaT1zZXRUaW1lb3V0KCgoKT0+e3QoITEpfSksMWU0KSxzPWE9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgZSxjLHUsbDtjb25zdCBkPWEuZGF0YTsiY2hlY2tfc2Vzc2lvbl9zaWduZWRfb3V0Ij09KG51bGw9PWQ/dm9pZCAwOmQudHlwZSkmJih3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyksY2xlYXJUaW1lb3V0KGkpLHQoITEpKSwiY2hlY2tfc2Vzc2lvbl9zaWduZWRfaW4iPT0obnVsbD09ZD92b2lkIDA6ZC50eXBlKSYmKG51bGw9PT0oZT1udWxsPT1kP3ZvaWQgMDpkLmRhdGEpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNvZGUpJiZuKG51bGw9PT0oYz1udWxsPT1kP3ZvaWQgMDpkLmRhdGEpfHx2b2lkIDA9PT1jP3ZvaWQgMDpjLmNvZGUsbnVsbD09PSh1PW51bGw9PWQ/dm9pZCAwOmQuZGF0YSl8fHZvaWQgMD09PXU/dm9pZCAwOnUuc2Vzc2lvblN0YXRlLG51bGw9PT0obD1udWxsPT1kP3ZvaWQgMDpkLmRhdGEpfHx2b2lkIDA9PT1sP3ZvaWQgMDpsLnN0YXRlLG8pLnRoZW4oKGU9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyksdChlKX0pKS5jYXRjaCgoZT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxyKGUpfSkpLmZpbmFsbHkoKCgpPT57Y2xlYXJUaW1lb3V0KGkpfSkpfSkpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKX0pKX0pKX1oYW5kbGVTaWduSW4odCxuLHIpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpO2lmKHlpZWxkIHQoKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHthbGxvd2VkU2NvcGVzOiIiLGRpc3BsYXlOYW1lOiIiLGVtYWlsOiIiLHNlc3Npb25TdGF0ZToiIixzdWI6IiIsdGVuYW50RG9tYWluOiIiLHVzZXJuYW1lOiIifSk7aWYoZS5zdG9yYWdlIT09RS5XZWJXb3JrZXImJih5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5pc0F1dGhlbnRpY2F0ZWQoKSkpcmV0dXJuIHRoaXMuX3NwYUhlbHBlci5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSx0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0aGlzKSxlLmVuYWJsZU9JRENTZXNzaW9uTWFuYWdlbWVudCYmbigpLFByb21pc2UucmVzb2x2ZSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRCYXNpY1VzZXJJbmZvKCkpO2NvbnN0IGk9bmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCh3KSxvPW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoYik7aWYoaSl7Y29uc3QgZT1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTt0aHJvdyBlLnNlYXJjaFBhcmFtcy5kZWxldGUodyksZS5zZWFyY2hQYXJhbXMuZGVsZXRlKGIpLGhpc3RvcnkucHVzaFN0YXRlKG51bGwsZG9jdW1lbnQudGl0bGUsZS50b1N0cmluZygpKSxuZXcgYygiU1BBLUFVVEhfSEVMUEVSLVNJLVNFMDEiLGksbnVsbCE9bz9vOiIiKX1pZihlLnN0b3JhZ2U9PT1FLldlYldvcmtlciYmcil7Y29uc3QgZT15aWVsZCByKCk7aWYoZSlyZXR1cm4gZX19KSl9YXR0YWNoVG9rZW5Ub1JlcXVlc3RDb25maWcodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPU9iamVjdC5hc3NpZ24oe2F0dGFjaFRva2VuOiEwfSx0KTtlLmF0dGFjaFRva2VuJiYoZS5zaG91bGRBdHRhY2hJRFBBY2Nlc3NUb2tlbj90LmhlYWRlcnM9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuaGVhZGVycykse0F1dGhvcml6YXRpb246IkJlYXJlciAiLmNvbmNhdCh5aWVsZCB0aGlzLmdldElEUEFjY2Vzc1Rva2VuKCkpfSk6dC5oZWFkZXJzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmhlYWRlcnMpLHtBdXRob3JpemF0aW9uOiJCZWFyZXIgIi5jb25jYXQoeWllbGQgdGhpcy5nZXRBY2Nlc3NUb2tlbigpKX0pKX0pKX1nZXRCYXNpY1VzZXJJbmZvKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QmFzaWNVc2VySW5mbygpfSkpfWdldERlY29kZWRJRFRva2VuKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGVjb2RlZElEVG9rZW4oKX0pKX1nZXREZWNvZGVkSURQSURUb2tlbigpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldERlY29kZWRJRFRva2VuKCl9KSl9Z2V0Q3J5cHRvSGVscGVyKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0Q3J5cHRvSGVscGVyKCl9KSl9Z2V0SURUb2tlbigpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldElEVG9rZW4oKX0pKX1nZXRPSURDU2VydmljZUVuZHBvaW50cygpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl9KSl9Z2V0QWNjZXNzVG9rZW4oKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRBY2Nlc3NUb2tlbigpfSkpfWdldElEUEFjY2Vzc1Rva2VuKCl7dmFyIHQ7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbnVsbD09PSh0PXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSgpKXx8dm9pZCAwPT09dD92b2lkIDA6dC5hY2Nlc3NfdG9rZW59KSl9Z2V0RGF0YUxheWVyKCl7cmV0dXJuIHRoaXMuX2RhdGFMYXllcn1pc0F1dGhlbnRpY2F0ZWQoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5pc0F1dGhlbnRpY2F0ZWQoKX0pKX19Y2xhc3MgQXtjb25zdHJ1Y3RvcihlKXt0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudD1lLHRoaXMuX2RhdGFMYXllcj10aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXREYXRhTGF5ZXIoKX1yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KHQpe3ZhciBuLHI7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZighKG51bGwhPT0ocj1udWxsPT09KG49eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4ucGVyaW9kaWNUb2tlblJlZnJlc2gpJiZ2b2lkIDAhPT1yJiZyKSlyZXR1cm47Y29uc3Qgbz15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKTtpZihvLnJlZnJlc2hfdG9rZW4pe2NvbnN0IG49cGFyc2VJbnQoby5leHBpcmVzX2luKSxyPXNldFRpbWVvdXQoKCgpPT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdC5yZWZyZXNoQWNjZXNzVG9rZW4oKX0pKSksMWUzKihuPD0xMD9uOm4tMTApKTt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihpLEpTT04uc3RyaW5naWZ5KHIpKX19KSl9Z2V0UmVmcmVzaFRpbWVvdXRUaW1lcigpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGkpKT9KU09OLnBhcnNlKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGkpKTotMX0pKX1jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZih0KXJldHVybiB2b2lkIGNsZWFyVGltZW91dCh0KTtjb25zdCBlPXlpZWxkIHRoaXMuZ2V0UmVmcmVzaFRpbWVvdXRUaW1lcigpOy0xIT09ZSYmY2xlYXJUaW1lb3V0KGUpfSkpfX12YXIgQz0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9O2Z1bmN0aW9uIE8oKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBEKCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX12YXIgUD1PLEk9RDtmdW5jdGlvbiBVKGUpe2lmKFA9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGUsMCk7aWYoKFA9PT1PfHwhUCkmJnNldFRpbWVvdXQpcmV0dXJuIFA9c2V0VGltZW91dCxzZXRUaW1lb3V0KGUsMCk7dHJ5e3JldHVybiBQKGUsMCl9Y2F0Y2godCl7dHJ5e3JldHVybiBQLmNhbGwobnVsbCxlLDApfWNhdGNoKHQpe3JldHVybiBQLmNhbGwodGhpcyxlLDApfX19ImZ1bmN0aW9uIj09dHlwZW9mIEMuc2V0VGltZW91dCYmKFA9c2V0VGltZW91dCksImZ1bmN0aW9uIj09dHlwZW9mIEMuY2xlYXJUaW1lb3V0JiYoST1jbGVhclRpbWVvdXQpO3ZhciBMLEg9W10sTT0hMSxOPS0xO2Z1bmN0aW9uIGooKXtNJiZMJiYoTT0hMSxMLmxlbmd0aD9IPUwuY29uY2F0KEgpOk49LTEsSC5sZW5ndGgmJngoKSl9ZnVuY3Rpb24geCgpe2lmKCFNKXt2YXIgZT1VKGopO009ITA7Zm9yKHZhciB0PUgubGVuZ3RoO3Q7KXtmb3IoTD1ILEg9W107KytOPHQ7KUwmJkxbTl0ucnVuKCk7Tj0tMSx0PUgubGVuZ3RofUw9bnVsbCxNPSExLGZ1bmN0aW9uKGUpe2lmKEk9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChlKTtpZigoST09PUR8fCFJKSYmY2xlYXJUaW1lb3V0KXJldHVybiBJPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoZSk7dHJ5e0koZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBJLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4gSS5jYWxsKHRoaXMsZSl9fX0oZSl9fWZ1bmN0aW9uIHEoZSx0KXt0aGlzLmZ1bj1lLHRoaXMuYXJyYXk9dH1xLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtmdW5jdGlvbiBCKCl7fXZhciBGPUIsSz1CLEo9QixXPUIsej1CLFY9QixZPUI7dmFyIEc9Qy5wZXJmb3JtYW5jZXx8e30sWD1HLm5vd3x8Ry5tb3pOb3d8fEcubXNOb3d8fEcub05vd3x8Ry53ZWJraXROb3d8fGZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9O3ZhciAkPW5ldyBEYXRlO3ZhciBaPXtuZXh0VGljazpmdW5jdGlvbihlKXt2YXIgdD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0W24tMV09YXJndW1lbnRzW25dO0gucHVzaChuZXcgcShlLHQpKSwxIT09SC5sZW5ndGh8fE18fFUoeCl9LHRpdGxlOiJicm93c2VyIixicm93c2VyOiEwLGVudjp7fSxhcmd2OltdLHZlcnNpb246IiIsdmVyc2lvbnM6e30sb246RixhZGRMaXN0ZW5lcjpLLG9uY2U6SixvZmY6VyxyZW1vdmVMaXN0ZW5lcjp6LHJlbW92ZUFsbExpc3RlbmVyczpWLGVtaXQ6WSxiaW5kaW5nOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sY3dkOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxjaGRpcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx1bWFzazpmdW5jdGlvbigpe3JldHVybiAwfSxocnRpbWU6ZnVuY3Rpb24oZSl7dmFyIHQ9LjAwMSpYLmNhbGwoRyksbj1NYXRoLmZsb29yKHQpLHI9TWF0aC5mbG9vcih0JTEqMWU5KTtyZXR1cm4gZSYmKG4tPWVbMF0sKHItPWVbMV0pPDAmJihuLS0scis9MWU5KSksW24scl19LHBsYXRmb3JtOiJicm93c2VyIixyZWxlYXNlOnt9LGNvbmZpZzp7fSx1cHRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUtJCkvMWUzfX0sUT1aO2Z1bmN0aW9uIGVlKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodCxhcmd1bWVudHMpfX1jb25zdHt0b1N0cmluZzp0ZX09T2JqZWN0LnByb3RvdHlwZSx7Z2V0UHJvdG90eXBlT2Y6bmV9PU9iamVjdCx7aXRlcmF0b3I6cmUsdG9TdHJpbmdUYWc6aWV9PVN5bWJvbCxvZT0oc2U9T2JqZWN0LmNyZWF0ZShudWxsKSxlPT57Y29uc3QgdD10ZS5jYWxsKGUpO3JldHVybiBzZVt0XXx8KHNlW3RdPXQuc2xpY2UoOCwtMSkudG9Mb3dlckNhc2UoKSl9KTt2YXIgc2U7Y29uc3QgYWU9ZT0+KGU9ZS50b0xvd2VyQ2FzZSgpLHQ9Pm9lKHQpPT09ZSksY2U9ZT0+dD0+dHlwZW9mIHQ9PT1lLHtpc0FycmF5OnVlfT1BcnJheSxsZT1jZSgidW5kZWZpbmVkIik7ZnVuY3Rpb24gZGUoZSl7cmV0dXJuIG51bGwhPT1lJiYhbGUoZSkmJm51bGwhPT1lLmNvbnN0cnVjdG9yJiYhbGUoZS5jb25zdHJ1Y3RvcikmJnBlKGUuY29uc3RydWN0b3IuaXNCdWZmZXIpJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfWNvbnN0IGhlPWFlKCJBcnJheUJ1ZmZlciIpO2NvbnN0IGZlPWNlKCJzdHJpbmciKSxwZT1jZSgiZnVuY3Rpb24iKSxnZT1jZSgibnVtYmVyIikseWU9ZT0+bnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZSx2ZT1lPT57aWYoIm9iamVjdCIhPT1vZShlKSlyZXR1cm4hMTtjb25zdCB0PW5lKGUpO3JldHVybiEobnVsbCE9PXQmJnQhPT1PYmplY3QucHJvdG90eXBlJiZudWxsIT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfHxpZSBpbiBlfHxyZSBpbiBlKX0sbWU9YWUoIkRhdGUiKSx3ZT1hZSgiRmlsZSIpLGJlPWFlKCJCbG9iIiksX2U9YWUoIkZpbGVMaXN0Iik7Y29uc3QgU2U9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnZvaWQgMCE9PUM/Qzp7fSxFZT12b2lkIDAhPT1TZS5Gb3JtRGF0YT9TZS5Gb3JtRGF0YTp2b2lkIDAsUmU9YWUoIlVSTFNlYXJjaFBhcmFtcyIpLFtUZSxrZSxBZSxDZV09WyJSZWFkYWJsZVN0cmVhbSIsIlJlcXVlc3QiLCJSZXNwb25zZSIsIkhlYWRlcnMiXS5tYXAoYWUpO2Z1bmN0aW9uIE9lKGUsdCl7bGV0IG4scix7YWxsT3duS2V5czppPSExfT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e307aWYobnVsbCE9ZSlpZigib2JqZWN0IiE9dHlwZW9mIGUmJihlPVtlXSksdWUoZSkpZm9yKG49MCxyPWUubGVuZ3RoO248cjtuKyspdC5jYWxsKG51bGwsZVtuXSxuLGUpO2Vsc2V7aWYoZGUoZSkpcmV0dXJuO2NvbnN0IHI9aT9PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKTpPYmplY3Qua2V5cyhlKSxvPXIubGVuZ3RoO2xldCBzO2ZvcihuPTA7bjxvO24rKylzPXJbbl0sdC5jYWxsKG51bGwsZVtzXSxzLGUpfX1mdW5jdGlvbiBEZShlLHQpe2lmKGRlKGUpKXJldHVybiBudWxsO3Q9dC50b0xvd2VyQ2FzZSgpO2NvbnN0IG49T2JqZWN0LmtleXMoZSk7bGV0IHIsaT1uLmxlbmd0aDtmb3IoO2ktLSA+MDspaWYocj1uW2ldLHQ9PT1yLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHI7cmV0dXJuIG51bGx9Y29uc3QgUGU9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OkMsSWU9ZT0+IWxlKGUpJiZlIT09UGU7Y29uc3QgVWU9KExlPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSYmbmUoVWludDhBcnJheSksZT0+TGUmJmUgaW5zdGFuY2VvZiBMZSk7dmFyIExlO2NvbnN0IEhlPWFlKCJIVE1MRm9ybUVsZW1lbnQiKSxNZT0oZT0+e2xldHtoYXNPd25Qcm9wZXJ0eTp0fT1lO3JldHVybihlLG4pPT50LmNhbGwoZSxuKX0pKE9iamVjdC5wcm90b3R5cGUpLE5lPWFlKCJSZWdFeHAiKSxqZT0oZSx0KT0+e2NvbnN0IG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoZSkscj17fTtPZShuLCgobixpKT0+e2xldCBvOyExIT09KG89dChuLGksZSkpJiYocltpXT1vfHxuKX0pKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLHIpfTtjb25zdCB4ZT1hZSgiQXN5bmNGdW5jdGlvbiIpLHFlPShCZT0iZnVuY3Rpb24iPT10eXBlb2Ygc2V0SW1tZWRpYXRlLEZlPXBlKFBlLnBvc3RNZXNzYWdlKSxCZT9zZXRJbW1lZGlhdGU6RmU/KEtlPSJheGlvc0AiLmNvbmNhdChNYXRoLnJhbmRvbSgpKSxKZT1bXSxQZS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoZT0+e2xldHtzb3VyY2U6dCxkYXRhOm59PWU7dD09PVBlJiZuPT09S2UmJkplLmxlbmd0aCYmSmUuc2hpZnQoKSgpfSksITEpLGU9PntKZS5wdXNoKGUpLFBlLnBvc3RNZXNzYWdlKEtlLCIqIil9KTplPT5zZXRUaW1lb3V0KGUpKTt2YXIgQmUsRmUsS2UsSmU7Y29uc3QgV2U9InVuZGVmaW5lZCIhPXR5cGVvZiBxdWV1ZU1pY3JvdGFzaz9xdWV1ZU1pY3JvdGFzay5iaW5kKFBlKTp2b2lkIDAhPT1RJiZRLm5leHRUaWNrfHxxZTt2YXIgemU9e2lzQXJyYXk6dWUsaXNBcnJheUJ1ZmZlcjpoZSxpc0J1ZmZlcjpkZSxpc0Zvcm1EYXRhOmU9PntsZXQgdDtyZXR1cm4gZSYmKEVlJiZlIGluc3RhbmNlb2YgRWV8fHBlKGUuYXBwZW5kKSYmKCJmb3JtZGF0YSI9PT0odD1vZShlKSl8fCJvYmplY3QiPT09dCYmcGUoZS50b1N0cmluZykmJiJbb2JqZWN0IEZvcm1EYXRhXSI9PT1lLnRvU3RyaW5nKCkpKX0saXNBcnJheUJ1ZmZlclZpZXc6ZnVuY3Rpb24oZSl7bGV0IHQ7cmV0dXJuIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmQXJyYXlCdWZmZXIuaXNWaWV3P0FycmF5QnVmZmVyLmlzVmlldyhlKTplJiZlLmJ1ZmZlciYmaGUoZS5idWZmZXIpLHR9LGlzU3RyaW5nOmZlLGlzTnVtYmVyOmdlLGlzQm9vbGVhbjplPT4hMD09PWV8fCExPT09ZSxpc09iamVjdDp5ZSxpc1BsYWluT2JqZWN0OnZlLGlzRW1wdHlPYmplY3Q6ZT0+e2lmKCF5ZShlKXx8ZGUoZSkpcmV0dXJuITE7dHJ5e3JldHVybiAwPT09T2JqZWN0LmtleXMoZSkubGVuZ3RoJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1PYmplY3QucHJvdG90eXBlfWNhdGNoKGUpe3JldHVybiExfX0saXNSZWFkYWJsZVN0cmVhbTpUZSxpc1JlcXVlc3Q6a2UsaXNSZXNwb25zZTpBZSxpc0hlYWRlcnM6Q2UsaXNVbmRlZmluZWQ6bGUsaXNEYXRlOm1lLGlzRmlsZTp3ZSxpc1JlYWN0TmF0aXZlQmxvYjplPT4hKCFlfHx2b2lkIDA9PT1lLnVyaSksaXNSZWFjdE5hdGl2ZTplPT5lJiZ2b2lkIDAhPT1lLmdldFBhcnRzLGlzQmxvYjpiZSxpc1JlZ0V4cDpOZSxpc0Z1bmN0aW9uOnBlLGlzU3RyZWFtOmU9PnllKGUpJiZwZShlLnBpcGUpLGlzVVJMU2VhcmNoUGFyYW1zOlJlLGlzVHlwZWRBcnJheTpVZSxpc0ZpbGVMaXN0Ol9lLGZvckVhY2g6T2UsbWVyZ2U6ZnVuY3Rpb24gZSgpe2NvbnN0e2Nhc2VsZXNzOnQsc2tpcFVuZGVmaW5lZDpufT1JZSh0aGlzKSYmdGhpc3x8e30scj17fSxpPShpLG8pPT57aWYoIl9fcHJvdG9fXyI9PT1vfHwiY29uc3RydWN0b3IiPT09b3x8InByb3RvdHlwZSI9PT1vKXJldHVybjtjb25zdCBzPXQmJkRlKHIsbyl8fG87dmUocltzXSkmJnZlKGkpP3Jbc109ZShyW3NdLGkpOnZlKGkpP3Jbc109ZSh7fSxpKTp1ZShpKT9yW3NdPWkuc2xpY2UoKTpuJiZsZShpKXx8KHJbc109aSl9O2ZvcihsZXQgZT0wLHQ9YXJndW1lbnRzLmxlbmd0aDtlPHQ7ZSsrKWFyZ3VtZW50c1tlXSYmT2UoYXJndW1lbnRzW2VdLGkpO3JldHVybiByfSxleHRlbmQ6ZnVuY3Rpb24oZSx0LG4pe2xldHthbGxPd25LZXlzOnJ9PWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gT2UodCwoKHQscik9PntuJiZwZSh0KT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLHt2YWx1ZTplZSh0LG4pLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk6T2JqZWN0LmRlZmluZVByb3BlcnR5KGUscix7dmFsdWU6dCx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pfSkse2FsbE93bktleXM6cn0pLGV9LHRyaW06ZT0+ZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csIiIpLHN0cmlwQk9NOmU9Pig2NTI3OT09PWUuY2hhckNvZGVBdCgwKSYmKGU9ZS5zbGljZSgxKSksZSksaW5oZXJpdHM6KGUsdCxuLHIpPT57ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSxyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImNvbnN0cnVjdG9yIix7dmFsdWU6ZSx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJzdXBlciIse3ZhbHVlOnQucHJvdG90eXBlfSksbiYmT2JqZWN0LmFzc2lnbihlLnByb3RvdHlwZSxuKX0sdG9GbGF0T2JqZWN0OihlLHQsbixyKT0+e2xldCBpLG8scztjb25zdCBhPXt9O2lmKHQ9dHx8e30sbnVsbD09ZSlyZXR1cm4gdDtkb3tmb3IoaT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSxvPWkubGVuZ3RoO28tLSA+MDspcz1pW29dLHImJiFyKHMsZSx0KXx8YVtzXXx8KHRbc109ZVtzXSxhW3NdPSEwKTtlPSExIT09biYmbmUoZSl9d2hpbGUoZSYmKCFufHxuKGUsdCkpJiZlIT09T2JqZWN0LnByb3RvdHlwZSk7cmV0dXJuIHR9LGtpbmRPZjpvZSxraW5kT2ZUZXN0OmFlLGVuZHNXaXRoOihlLHQsbik9PntlPVN0cmluZyhlKSwodm9pZCAwPT09bnx8bj5lLmxlbmd0aCkmJihuPWUubGVuZ3RoKSxuLT10Lmxlbmd0aDtjb25zdCByPWUuaW5kZXhPZih0LG4pO3JldHVybi0xIT09ciYmcj09PW59LHRvQXJyYXk6ZT0+e2lmKCFlKXJldHVybiBudWxsO2lmKHVlKGUpKXJldHVybiBlO2xldCB0PWUubGVuZ3RoO2lmKCFnZSh0KSlyZXR1cm4gbnVsbDtjb25zdCBuPW5ldyBBcnJheSh0KTtmb3IoO3QtLSA+MDspblt0XT1lW3RdO3JldHVybiBufSxmb3JFYWNoRW50cnk6KGUsdCk9Pntjb25zdCBuPShlJiZlW3JlXSkuY2FsbChlKTtsZXQgcjtmb3IoOyhyPW4ubmV4dCgpKSYmIXIuZG9uZTspe2NvbnN0IG49ci52YWx1ZTt0LmNhbGwoZSxuWzBdLG5bMV0pfX0sbWF0Y2hBbGw6KGUsdCk9PntsZXQgbjtjb25zdCByPVtdO2Zvcig7bnVsbCE9PShuPWUuZXhlYyh0KSk7KXIucHVzaChuKTtyZXR1cm4gcn0saXNIVE1MRm9ybTpIZSxoYXNPd25Qcm9wZXJ0eTpNZSxoYXNPd25Qcm9wOk1lLHJlZHVjZURlc2NyaXB0b3JzOmplLGZyZWV6ZU1ldGhvZHM6ZT0+e2plKGUsKCh0LG4pPT57aWYocGUoZSkmJi0xIT09WyJhcmd1bWVudHMiLCJjYWxsZXIiLCJjYWxsZWUiXS5pbmRleE9mKG4pKXJldHVybiExO2NvbnN0IHI9ZVtuXTtwZShyKSYmKHQuZW51bWVyYWJsZT0hMSwid3JpdGFibGUiaW4gdD90LndyaXRhYmxlPSExOnQuc2V0fHwodC5zZXQ9KCk9Pnt0aHJvdyBFcnJvcigiQ2FuIG5vdCByZXdyaXRlIHJlYWQtb25seSBtZXRob2QgJyIrbisiJyIpfSkpfSkpfSx0b09iamVjdFNldDooZSx0KT0+e2NvbnN0IG49e30scj1lPT57ZS5mb3JFYWNoKChlPT57bltlXT0hMH0pKX07cmV0dXJuIHVlKGUpP3IoZSk6cihTdHJpbmcoZSkuc3BsaXQodCkpLG59LHRvQ2FtZWxDYXNlOmU9PmUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9cc10oW2EtelxkXSkoXHcqKS9nLChmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQudG9VcHBlckNhc2UoKStufSkpLG5vb3A6KCk9Pnt9LHRvRmluaXRlTnVtYmVyOihlLHQpPT5udWxsIT1lJiZOdW1iZXIuaXNGaW5pdGUoZT0rZSk/ZTp0LGZpbmRLZXk6RGUsZ2xvYmFsOlBlLGlzQ29udGV4dERlZmluZWQ6SWUsaXNTcGVjQ29tcGxpYW50Rm9ybTpmdW5jdGlvbihlKXtyZXR1cm4hIShlJiZwZShlLmFwcGVuZCkmJiJGb3JtRGF0YSI9PT1lW2llXSYmZVtyZV0pfSx0b0pTT05PYmplY3Q6ZT0+e2NvbnN0IHQ9bmV3IEFycmF5KDEwKSxuPShlLHIpPT57aWYoeWUoZSkpe2lmKHQuaW5kZXhPZihlKT49MClyZXR1cm47aWYoZGUoZSkpcmV0dXJuIGU7aWYoISgidG9KU09OImluIGUpKXt0W3JdPWU7Y29uc3QgaT11ZShlKT9bXTp7fTtyZXR1cm4gT2UoZSwoKGUsdCk9Pntjb25zdCBvPW4oZSxyKzEpOyFsZShvKSYmKGlbdF09byl9KSksdFtyXT12b2lkIDAsaX19cmV0dXJuIGV9O3JldHVybiBuKGUsMCl9LGlzQXN5bmNGbjp4ZSxpc1RoZW5hYmxlOmU9PmUmJih5ZShlKXx8cGUoZSkpJiZwZShlLnRoZW4pJiZwZShlLmNhdGNoKSxzZXRJbW1lZGlhdGU6cWUsYXNhcDpXZSxpc0l0ZXJhYmxlOmU9Pm51bGwhPWUmJnBlKGVbcmVdKX0sVmU9W10sWWU9W10sR2U9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksWGU9ITE7ZnVuY3Rpb24gJGUoKXtYZT0hMDtmb3IodmFyIGU9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLHQ9MCxuPWUubGVuZ3RoO3Q8bjsrK3QpVmVbdF09ZVt0XSxZZVtlLmNoYXJDb2RlQXQodCldPXQ7WWVbIi0iLmNoYXJDb2RlQXQoMCldPTYyLFllWyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiBaZShlLHQsbil7Zm9yKHZhciByLGksbz1bXSxzPXQ7czxuO3MrPTMpcj0oZVtzXTw8MTYpKyhlW3MrMV08PDgpK2VbcysyXSxvLnB1c2goVmVbKGk9cik+PjE4JjYzXStWZVtpPj4xMiY2M10rVmVbaT4+NiY2M10rVmVbNjMmaV0pO3JldHVybiBvLmpvaW4oIiIpfWZ1bmN0aW9uIFFlKGUpe3ZhciB0O1hlfHwkZSgpO2Zvcih2YXIgbj1lLmxlbmd0aCxyPW4lMyxpPSIiLG89W10scz0xNjM4MyxhPTAsYz1uLXI7YTxjO2ErPXMpby5wdXNoKFplKGUsYSxhK3M+Yz9jOmErcykpO3JldHVybiAxPT09cj8odD1lW24tMV0saSs9VmVbdD4+Ml0saSs9VmVbdDw8NCY2M10saSs9Ij09Iik6Mj09PXImJih0PShlW24tMl08PDgpK2Vbbi0xXSxpKz1WZVt0Pj4xMF0saSs9VmVbdD4+NCY2M10saSs9VmVbdDw8MiY2M10saSs9Ij0iKSxvLnB1c2goaSksby5qb2luKCIiKX1mdW5jdGlvbiBldChlLHQsbixyLGkpe3ZhciBvLHMsYT04Kmktci0xLGM9KDE8PGEpLTEsdT1jPj4xLGw9LTcsZD1uP2ktMTowLGg9bj8tMToxLGY9ZVt0K2RdO2ZvcihkKz1oLG89ZiYoMTw8LWwpLTEsZj4+PS1sLGwrPWE7bD4wO289MjU2Km8rZVt0K2RdLGQrPWgsbC09OCk7Zm9yKHM9byYoMTw8LWwpLTEsbz4+PS1sLGwrPXI7bD4wO3M9MjU2KnMrZVt0K2RdLGQrPWgsbC09OCk7aWYoMD09PW8pbz0xLXU7ZWxzZXtpZihvPT09YylyZXR1cm4gcz9OYU46MS8wKihmPy0xOjEpO3MrPU1hdGgucG93KDIsciksby09dX1yZXR1cm4oZj8tMToxKSpzKk1hdGgucG93KDIsby1yKX1mdW5jdGlvbiB0dChlLHQsbixyLGksbyl7dmFyIHMsYSxjLHU9OCpvLWktMSxsPSgxPDx1KS0xLGQ9bD4+MSxoPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsZj1yPzA6by0xLHA9cj8xOi0xLGc9dDwwfHwwPT09dCYmMS90PDA/MTowO2Zvcih0PU1hdGguYWJzKHQpLGlzTmFOKHQpfHx0PT09MS8wPyhhPWlzTmFOKHQpPzE6MCxzPWwpOihzPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjIpLHQqKGM9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sYyo9MiksKHQrPXMrZD49MT9oL2M6aCpNYXRoLnBvdygyLDEtZCkpKmM+PTImJihzKyssYy89MikscytkPj1sPyhhPTAscz1sKTpzK2Q+PTE/KGE9KHQqYy0xKSpNYXRoLnBvdygyLGkpLHMrPWQpOihhPXQqTWF0aC5wb3coMixkLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODtlW24rZl09MjU1JmEsZis9cCxhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLHUrPWk7dT4wO2VbbitmXT0yNTUmcyxmKz1wLHMvPTI1Nix1LT04KTtlW24rZi1wXXw9MTI4Kmd9dmFyIG50PXt9LnRvU3RyaW5nLHJ0PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PW50LmNhbGwoZSl9O2F0LlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwPT09Qy5UWVBFRF9BUlJBWV9TVVBQT1JUfHxDLlRZUEVEX0FSUkFZX1NVUFBPUlQ7dmFyIGl0PW90KCk7ZnVuY3Rpb24gb3QoKXtyZXR1cm4gYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gc3QoZSx0KXtpZihvdCgpPHQpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9bmV3IFVpbnQ4QXJyYXkodCkpLl9fcHJvdG9fXz1hdC5wcm90b3R5cGU6KG51bGw9PT1lJiYoZT1uZXcgYXQodCkpLGUubGVuZ3RoPXQpLGV9ZnVuY3Rpb24gYXQoZSx0LG4pe2lmKCEoYXQuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIGF0KSlyZXR1cm4gbmV3IGF0KGUsdCxuKTtpZigibnVtYmVyIj09dHlwZW9mIGUpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIGx0KHRoaXMsZSl9cmV0dXJuIGN0KHRoaXMsZSx0LG4pfWZ1bmN0aW9uIGN0KGUsdCxuLHIpe2lmKCJudW1iZXIiPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKGUsdCxuLHIpe2lmKHQuYnl0ZUxlbmd0aCxuPDB8fHQuYnl0ZUxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYodC5ieXRlTGVuZ3RoPG4rKHJ8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7dD12b2lkIDA9PT1uJiZ2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KHQpOnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkodCxuKTpuZXcgVWludDhBcnJheSh0LG4scik7YXQuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT10KS5fX3Byb3RvX189YXQucHJvdG90eXBlOmU9ZHQoZSx0KTtyZXR1cm4gZX0oZSx0LG4scik6InN0cmluZyI9PXR5cGVvZiB0P2Z1bmN0aW9uKGUsdCxuKXsic3RyaW5nIj09dHlwZW9mIG4mJiIiIT09bnx8KG49InV0ZjgiKTtpZighYXQuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgcj0wfHB0KHQsbiksaT0oZT1zdChlLHIpKS53cml0ZSh0LG4pO2khPT1yJiYoZT1lLnNsaWNlKDAsaSkpO3JldHVybiBlfShlLHQsbik6ZnVuY3Rpb24oZSx0KXtpZihmdCh0KSl7dmFyIG49MHxodCh0Lmxlbmd0aCk7cmV0dXJuIDA9PT0oZT1zdChlLG4pKS5sZW5ndGh8fHQuY29weShlLDAsMCxuKSxlfWlmKHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gdClyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIHQubGVuZ3RofHwocj10Lmxlbmd0aCkhPXI/c3QoZSwwKTpkdChlLHQpO2lmKCJCdWZmZXIiPT09dC50eXBlJiZydCh0LmRhdGEpKXJldHVybiBkdChlLHQuZGF0YSl9dmFyIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfShlLHQpfWZ1bmN0aW9uIHV0KGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gbHQoZSx0KXtpZih1dCh0KSxlPXN0KGUsdDwwPzA6MHxodCh0KSksIWF0LlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciBuPTA7bjx0OysrbillW25dPTA7cmV0dXJuIGV9ZnVuY3Rpb24gZHQoZSx0KXt2YXIgbj10Lmxlbmd0aDwwPzA6MHxodCh0Lmxlbmd0aCk7ZT1zdChlLG4pO2Zvcih2YXIgcj0wO3I8bjtyKz0xKWVbcl09MjU1JnRbcl07cmV0dXJuIGV9ZnVuY3Rpb24gaHQoZSl7aWYoZT49b3QoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrb3QoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfGV9ZnVuY3Rpb24gZnQoZSl7cmV0dXJuIShudWxsPT1lfHwhZS5faXNCdWZmZXIpfWZ1bmN0aW9uIHB0KGUsdCl7aWYoZnQoZSkpcmV0dXJuIGUubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcoZSl8fGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIGUuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIGUmJihlPSIiK2UpO3ZhciBuPWUubGVuZ3RoO2lmKDA9PT1uKXJldHVybiAwO2Zvcih2YXIgcj0hMTs7KXN3aXRjaCh0KXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBuO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIEJ0KGUpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqbjtjYXNlImhleCI6cmV0dXJuIG4+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gRnQoZSkubGVuZ3RoO2RlZmF1bHQ6aWYocilyZXR1cm4gQnQoZSkubGVuZ3RoO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gZ3QoZSx0LG4pe3ZhciByPSExO2lmKCh2b2lkIDA9PT10fHx0PDApJiYodD0wKSx0PnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1ufHxuPnRoaXMubGVuZ3RoKSYmKG49dGhpcy5sZW5ndGgpLG48PTApcmV0dXJuIiI7aWYoKG4+Pj49MCk8PSh0Pj4+PTApKXJldHVybiIiO2ZvcihlfHwoZT0idXRmOCIpOzspc3dpdGNoKGUpe2Nhc2UiaGV4IjpyZXR1cm4gRHQodGhpcyx0LG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIGt0KHRoaXMsdCxuKTtjYXNlImFzY2lpIjpyZXR1cm4gQ3QodGhpcyx0LG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIE90KHRoaXMsdCxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIFR0KHRoaXMsdCxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIFB0KHRoaXMsdCxuKTtkZWZhdWx0OmlmKHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIitlKTtlPShlKyIiKS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIHl0KGUsdCxuKXt2YXIgcj1lW3RdO2VbdF09ZVtuXSxlW25dPXJ9ZnVuY3Rpb24gdnQoZSx0LG4scixpKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiBuPyhyPW4sbj0wKTpuPjIxNDc0ODM2NDc/bj0yMTQ3NDgzNjQ3Om48LTIxNDc0ODM2NDgmJihuPS0yMTQ3NDgzNjQ4KSxuPStuLGlzTmFOKG4pJiYobj1pPzA6ZS5sZW5ndGgtMSksbjwwJiYobj1lLmxlbmd0aCtuKSxuPj1lLmxlbmd0aCl7aWYoaSlyZXR1cm4tMTtuPWUubGVuZ3RoLTF9ZWxzZSBpZihuPDApe2lmKCFpKXJldHVybi0xO249MH1pZigic3RyaW5nIj09dHlwZW9mIHQmJih0PWF0LmZyb20odCxyKSksZnQodCkpcmV0dXJuIDA9PT10Lmxlbmd0aD8tMTptdChlLHQsbixyLGkpO2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdCY9MjU1LGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP2k/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGUsdCxuKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGUsdCxuKTptdChlLFt0XSxuLHIsaSk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gbXQoZSx0LG4scixpKXt2YXIgbyxzPTEsYT1lLmxlbmd0aCxjPXQubGVuZ3RoO2lmKHZvaWQgMCE9PXImJigidWNzMiI9PT0ocj1TdHJpbmcocikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1yfHwidXRmMTZsZSI9PT1yfHwidXRmLTE2bGUiPT09cikpe2lmKGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDIpcmV0dXJuLTE7cz0yLGEvPTIsYy89MixuLz0yfWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4gMT09PXM/ZVt0XTplLnJlYWRVSW50MTZCRSh0KnMpfWlmKGkpe3ZhciBsPS0xO2ZvcihvPW47bzxhO28rKylpZih1KGUsbyk9PT11KHQsLTE9PT1sPzA6by1sKSl7aWYoLTE9PT1sJiYobD1vKSxvLWwrMT09PWMpcmV0dXJuIGwqc31lbHNlLTEhPT1sJiYoby09by1sKSxsPS0xfWVsc2UgZm9yKG4rYz5hJiYobj1hLWMpLG89bjtvPj0wO28tLSl7Zm9yKHZhciBkPSEwLGg9MDtoPGM7aCsrKWlmKHUoZSxvK2gpIT09dSh0LGgpKXtkPSExO2JyZWFrfWlmKGQpcmV0dXJuIG99cmV0dXJuLTF9ZnVuY3Rpb24gd3QoZSx0LG4scil7bj1OdW1iZXIobil8fDA7dmFyIGk9ZS5sZW5ndGgtbjtyPyhyPU51bWJlcihyKSk+aSYmKHI9aSk6cj1pO3ZhciBvPXQubGVuZ3RoO2lmKG8lMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtyPm8vMiYmKHI9by8yKTtmb3IodmFyIHM9MDtzPHI7KytzKXt2YXIgYT1wYXJzZUludCh0LnN1YnN0cigyKnMsMiksMTYpO2lmKGlzTmFOKGEpKXJldHVybiBzO2VbbitzXT1hfXJldHVybiBzfWZ1bmN0aW9uIGJ0KGUsdCxuLHIpe3JldHVybiBLdChCdCh0LGUubGVuZ3RoLW4pLGUsbixyKX1mdW5jdGlvbiBfdChlLHQsbixyKXtyZXR1cm4gS3QoZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOysrbil0LnB1c2goMjU1JmUuY2hhckNvZGVBdChuKSk7cmV0dXJuIHR9KHQpLGUsbixyKX1mdW5jdGlvbiBTdChlLHQsbixyKXtyZXR1cm4gX3QoZSx0LG4scil9ZnVuY3Rpb24gRXQoZSx0LG4scil7cmV0dXJuIEt0KEZ0KHQpLGUsbixyKX1mdW5jdGlvbiBSdChlLHQsbixyKXtyZXR1cm4gS3QoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4scixpLG89W10scz0wO3M8ZS5sZW5ndGgmJiEoKHQtPTIpPDApOysrcylyPShuPWUuY2hhckNvZGVBdChzKSk+PjgsaT1uJTI1NixvLnB1c2goaSksby5wdXNoKHIpO3JldHVybiBvfSh0LGUubGVuZ3RoLW4pLGUsbixyKX1mdW5jdGlvbiBUdChlLHQsbil7cmV0dXJuIDA9PT10JiZuPT09ZS5sZW5ndGg/UWUoZSk6UWUoZS5zbGljZSh0LG4pKX1mdW5jdGlvbiBrdChlLHQsbil7bj1NYXRoLm1pbihlLmxlbmd0aCxuKTtmb3IodmFyIHI9W10saT10O2k8bjspe3ZhciBvLHMsYSxjLHU9ZVtpXSxsPW51bGwsZD11PjIzOT80OnU+MjIzPzM6dT4xOTE/MjoxO2lmKGkrZDw9bilzd2l0Y2goZCl7Y2FzZSAxOnU8MTI4JiYobD11KTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihvPWVbaSsxXSkpJiYoYz0oMzEmdSk8PDZ8NjMmbyk+MTI3JiYobD1jKTticmVhaztjYXNlIDM6bz1lW2krMV0scz1lW2krMl0sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJihjPSgxNSZ1KTw8MTJ8KDYzJm8pPDw2fDYzJnMpPjIwNDcmJihjPDU1Mjk2fHxjPjU3MzQzKSYmKGw9Yyk7YnJlYWs7Y2FzZSA0Om89ZVtpKzFdLHM9ZVtpKzJdLGE9ZVtpKzNdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYxMjg9PSgxOTImYSkmJihjPSgxNSZ1KTw8MTh8KDYzJm8pPDwxMnwoNjMmcyk8PDZ8NjMmYSk+NjU1MzUmJmM8MTExNDExMiYmKGw9Yyl9bnVsbD09PWw/KGw9NjU1MzMsZD0xKTpsPjY1NTM1JiYobC09NjU1MzYsci5wdXNoKGw+Pj4xMCYxMDIzfDU1Mjk2KSxsPTU2MzIwfDEwMjMmbCksci5wdXNoKGwpLGkrPWR9cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO2lmKHQ8PUF0KXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlKTt2YXIgbj0iIixyPTA7Zm9yKDtyPHQ7KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UocixyKz1BdCkpO3JldHVybiBufShyKX1hdC5wb29sU2l6ZT04MTkyLGF0Ll9hdWdtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlLl9fcHJvdG9fXz1hdC5wcm90b3R5cGUsZX0sYXQuZnJvbT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGN0KG51bGwsZSx0LG4pfSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUJiYoYXQucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSxhdC5fX3Byb3RvX189VWludDhBcnJheSksYXQuYWxsb2M9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdXQodCksdDw9MD9zdChlLHQpOnZvaWQgMCE9PW4/InN0cmluZyI9PXR5cGVvZiByP3N0KGUsdCkuZmlsbChuLHIpOnN0KGUsdCkuZmlsbChuKTpzdChlLHQpfShudWxsLGUsdCxuKX0sYXQuYWxsb2NVbnNhZmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGx0KG51bGwsZSl9LGF0LmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtyZXR1cm4gbHQobnVsbCxlKX0sYXQuaXNCdWZmZXI9SnQsYXQuY29tcGFyZT1mdW5jdGlvbihlLHQpe2lmKCFmdChlKXx8IWZ0KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZihlPT09dClyZXR1cm4gMDtmb3IodmFyIG49ZS5sZW5ndGgscj10Lmxlbmd0aCxpPTAsbz1NYXRoLm1pbihuLHIpO2k8bzsrK2kpaWYoZVtpXSE9PXRbaV0pe249ZVtpXSxyPXRbaV07YnJlYWt9cmV0dXJuIG48cj8tMTpyPG4/MTowfSxhdC5pc0VuY29kaW5nPWZ1bmN0aW9uKGUpe3N3aXRjaChTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxhdC5jb25jYXQ9ZnVuY3Rpb24oZSx0KXtpZighcnQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gYXQuYWxsb2MoMCk7dmFyIG47aWYodm9pZCAwPT09dClmb3IodD0wLG49MDtuPGUubGVuZ3RoOysrbil0Kz1lW25dLmxlbmd0aDt2YXIgcj1hdC5hbGxvY1Vuc2FmZSh0KSxpPTA7Zm9yKG49MDtuPGUubGVuZ3RoOysrbil7dmFyIG89ZVtuXTtpZighZnQobykpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO28uY29weShyLGkpLGkrPW8ubGVuZ3RofXJldHVybiByfSxhdC5ieXRlTGVuZ3RoPXB0LGF0LnByb3RvdHlwZS5faXNCdWZmZXI9ITAsYXQucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9Mil5dCh0aGlzLHQsdCsxKTtyZXR1cm4gdGhpc30sYXQucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9NCl5dCh0aGlzLHQsdCszKSx5dCh0aGlzLHQrMSx0KzIpO3JldHVybiB0aGlzfSxhdC5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz04KXl0KHRoaXMsdCx0KzcpLHl0KHRoaXMsdCsxLHQrNikseXQodGhpcyx0KzIsdCs1KSx5dCh0aGlzLHQrMyx0KzQpO3JldHVybiB0aGlzfSxhdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09ZT8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9rdCh0aGlzLDAsZSk6Z3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhdC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKGUpe2lmKCFmdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT1lfHwwPT09YXQuY29tcGFyZSh0aGlzLGUpfSxhdC5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciBlPSIiO3JldHVybiB0aGlzLmxlbmd0aD4wJiYoZT10aGlzLnRvU3RyaW5nKCJoZXgiLDAsNTApLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD41MCYmKGUrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK2UrIj4ifSxhdC5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbihlLHQsbixyLGkpe2lmKCFmdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09biYmKG49ZT9lLmxlbmd0aDowKSx2b2lkIDA9PT1yJiYocj0wKSx2b2lkIDA9PT1pJiYoaT10aGlzLmxlbmd0aCksdDwwfHxuPmUubGVuZ3RofHxyPDB8fGk+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKHI+PWkmJnQ+PW4pcmV0dXJuIDA7aWYocj49aSlyZXR1cm4tMTtpZih0Pj1uKXJldHVybiAxO2lmKHRoaXM9PT1lKXJldHVybiAwO2Zvcih2YXIgbz0oaT4+Pj0wKS0ocj4+Pj0wKSxzPShuPj4+PTApLSh0Pj4+PTApLGE9TWF0aC5taW4obyxzKSxjPXRoaXMuc2xpY2UocixpKSx1PWUuc2xpY2UodCxuKSxsPTA7bDxhOysrbClpZihjW2xdIT09dVtsXSl7bz1jW2xdLHM9dVtsXTticmVha31yZXR1cm4gbzxzPy0xOnM8bz8xOjB9LGF0LnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbihlLHQsbil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YoZSx0LG4pfSxhdC5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHZ0KHRoaXMsZSx0LG4sITApfSxhdC5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2dCh0aGlzLGUsdCxuLCExKX0sYXQucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKHZvaWQgMD09PXQpcj0idXRmOCIsbj10aGlzLmxlbmd0aCx0PTA7ZWxzZSBpZih2b2lkIDA9PT1uJiYic3RyaW5nIj09dHlwZW9mIHQpcj10LG49dGhpcy5sZW5ndGgsdD0wO2Vsc2V7aWYoIWlzRmluaXRlKHQpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTt0fD0wLGlzRmluaXRlKG4pPyhufD0wLHZvaWQgMD09PXImJihyPSJ1dGY4IikpOihyPW4sbj12b2lkIDApfXZhciBpPXRoaXMubGVuZ3RoLXQ7aWYoKHZvaWQgMD09PW58fG4+aSkmJihuPWkpLGUubGVuZ3RoPjAmJihuPDB8fHQ8MCl8fHQ+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7cnx8KHI9InV0ZjgiKTtmb3IodmFyIG89ITE7Oylzd2l0Y2gocil7Y2FzZSJoZXgiOnJldHVybiB3dCh0aGlzLGUsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBidCh0aGlzLGUsdCxuKTtjYXNlImFzY2lpIjpyZXR1cm4gX3QodGhpcyxlLHQsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gU3QodGhpcyxlLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBFdCh0aGlzLGUsdCxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIFJ0KHRoaXMsZSx0LG4pO2RlZmF1bHQ6aWYobyl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpO3I9KCIiK3IpLnRvTG93ZXJDYXNlKCksbz0hMH19LGF0LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciBBdD00MDk2O2Z1bmN0aW9uIEN0KGUsdCxuKXt2YXIgcj0iIjtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgaT10O2k8bjsrK2kpcis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmZVtpXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gT3QoZSx0LG4pe3ZhciByPSIiO249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciBpPXQ7aTxuOysraSlyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbaV0pO3JldHVybiByfWZ1bmN0aW9uIER0KGUsdCxuKXt2YXIgcj1lLmxlbmd0aDsoIXR8fHQ8MCkmJih0PTApLCghbnx8bjwwfHxuPnIpJiYobj1yKTtmb3IodmFyIGk9IiIsbz10O288bjsrK28paSs9cXQoZVtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gUHQoZSx0LG4pe2Zvcih2YXIgcj1lLnNsaWNlKHQsbiksaT0iIixvPTA7bzxyLmxlbmd0aDtvKz0yKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUocltvXSsyNTYqcltvKzFdKTtyZXR1cm4gaX1mdW5jdGlvbiBJdChlLHQsbil7aWYoZSUxIT0wfHxlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKGUrdD5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gVXQoZSx0LG4scixpLG8pe2lmKCFmdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYodD5pfHx0PG8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKG4rcj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gTHQoZSx0LG4scil7dDwwJiYodD02NTUzNSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtbiwyKTtpPG87KytpKWVbbitpXT0odCYyNTU8PDgqKHI/aToxLWkpKT4+PjgqKHI/aToxLWkpfWZ1bmN0aW9uIEh0KGUsdCxuLHIpe3Q8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtbiw0KTtpPG87KytpKWVbbitpXT10Pj4+OCoocj9pOjMtaSkmMjU1fWZ1bmN0aW9uIE10KGUsdCxuLHIsaSxvKXtpZihuK3I+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gTnQoZSx0LG4scixpKXtyZXR1cm4gaXx8TXQoZSwwLG4sNCksdHQoZSx0LG4sciwyMyw0KSxuKzR9ZnVuY3Rpb24ganQoZSx0LG4scixpKXtyZXR1cm4gaXx8TXQoZSwwLG4sOCksdHQoZSx0LG4sciw1Miw4KSxuKzh9YXQucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLmxlbmd0aDtpZigoZT1+fmUpPDA/KGUrPXIpPDAmJihlPTApOmU+ciYmKGU9ciksKHQ9dm9pZCAwPT09dD9yOn5+dCk8MD8odCs9cik8MCYmKHQ9MCk6dD5yJiYodD1yKSx0PGUmJih0PWUpLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQpKG49dGhpcy5zdWJhcnJheShlLHQpKS5fX3Byb3RvX189YXQucHJvdG90eXBlO2Vsc2V7dmFyIGk9dC1lO249bmV3IGF0KGksdm9pZCAwKTtmb3IodmFyIG89MDtvPGk7KytvKW5bb109dGhpc1tvK2VdfXJldHVybiBufSxhdC5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fEl0KGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbZV0saT0xLG89MDsrK288dCYmKGkqPTI1Nik7KXIrPXRoaXNbZStvXSppO3JldHVybiByfSxhdC5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fEl0KGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbZSstLXRdLGk9MTt0PjAmJihpKj0yNTYpOylyKz10aGlzW2UrLS10XSppO3JldHVybiByfSxhdC5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEl0KGUsMSx0aGlzLmxlbmd0aCksdGhpc1tlXX0sYXQucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxJdChlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fSxhdC5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEl0KGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXTw8OHx0aGlzW2UrMV19LGF0LnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8SXQoZSw0LHRoaXMubGVuZ3RoKSwodGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNikrMTY3NzcyMTYqdGhpc1tlKzNdfSxhdC5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEl0KGUsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1tlXSsodGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdKX0sYXQucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fEl0KGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbZV0saT0xLG89MDsrK288dCYmKGkqPTI1Nik7KXIrPXRoaXNbZStvXSppO3JldHVybiByPj0oaSo9MTI4KSYmKHItPU1hdGgucG93KDIsOCp0KSkscn0sYXQucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fEl0KGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXQsaT0xLG89dGhpc1tlKy0tcl07cj4wJiYoaSo9MjU2KTspbys9dGhpc1tlKy0tcl0qaTtyZXR1cm4gbz49KGkqPTEyOCkmJihvLT1NYXRoLnBvdygyLDgqdCkpLG99LGF0LnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxJdChlLDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW2VdPy0xKigyNTUtdGhpc1tlXSsxKTp0aGlzW2VdfSxhdC5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24oZSx0KXt0fHxJdChlLDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbZV18dGhpc1tlKzFdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSxhdC5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24oZSx0KXt0fHxJdChlLDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbZSsxXXx0aGlzW2VdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSxhdC5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8SXQoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2fHRoaXNbZSszXTw8MjR9LGF0LnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxJdChlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDI0fHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXX0sYXQucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEl0KGUsNCx0aGlzLmxlbmd0aCksZXQodGhpcyxlLCEwLDIzLDQpfSxhdC5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8SXQoZSw0LHRoaXMubGVuZ3RoKSxldCh0aGlzLGUsITEsMjMsNCl9LGF0LnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8SXQoZSw4LHRoaXMubGVuZ3RoKSxldCh0aGlzLGUsITAsNTIsOCl9LGF0LnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8SXQoZSw4LHRoaXMubGVuZ3RoKSxldCh0aGlzLGUsITEsNTIsOCl9LGF0LnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbihlLHQsbixyKXsoZT0rZSx0fD0wLG58PTAscil8fFV0KHRoaXMsZSx0LG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIGk9MSxvPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytvPG4mJihpKj0yNTYpOyl0aGlzW3Qrb109ZS9pJjI1NTtyZXR1cm4gdCtufSxhdC5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24oZSx0LG4scil7KGU9K2UsdHw9MCxufD0wLHIpfHxVdCh0aGlzLGUsdCxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBpPW4tMSxvPTE7Zm9yKHRoaXNbdCtpXT0yNTUmZTstLWk+PTAmJihvKj0yNTYpOyl0aGlzW3QraV09ZS9vJjI1NTtyZXR1cm4gdCtufSxhdC5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxVdCh0aGlzLGUsdCwxLDI1NSwwKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSx0aGlzW3RdPTI1NSZlLHQrMX0sYXQucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8VXQodGhpcyxlLHQsMiw2NTUzNSwwKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6THQodGhpcyxlLHQsITApLHQrMn0sYXQucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8VXQodGhpcyxlLHQsMiw2NTUzNSwwKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT0yNTUmZSk6THQodGhpcyxlLHQsITEpLHQrMn0sYXQucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8VXQodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdCszXT1lPj4+MjQsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrMV09ZT4+PjgsdGhpc1t0XT0yNTUmZSk6SHQodGhpcyxlLHQsITApLHQrNH0sYXQucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8VXQodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6SHQodGhpcyxlLHQsITEpLHQrNH0sYXQucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT0rZSx0fD0wLCFyKXt2YXIgaT1NYXRoLnBvdygyLDgqbi0xKTtVdCh0aGlzLGUsdCxuLGktMSwtaSl9dmFyIG89MCxzPTEsYT0wO2Zvcih0aGlzW3RdPTI1NSZlOysrbzxuJiYocyo9MjU2KTspZTwwJiYwPT09YSYmMCE9PXRoaXNbdCtvLTFdJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrbn0sYXQucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT0rZSx0fD0wLCFyKXt2YXIgaT1NYXRoLnBvdygyLDgqbi0xKTtVdCh0aGlzLGUsdCxuLGktMSwtaSl9dmFyIG89bi0xLHM9MSxhPTA7Zm9yKHRoaXNbdCtvXT0yNTUmZTstLW8+PTAmJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K28rMV0mJihhPTEpLHRoaXNbdCtvXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtufSxhdC5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fFV0KHRoaXMsZSx0LDEsMTI3LC0xMjgpLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLGU8MCYmKGU9MjU1K2UrMSksdGhpc1t0XT0yNTUmZSx0KzF9LGF0LnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8VXQodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpMdCh0aGlzLGUsdCwhMCksdCsyfSxhdC5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fFV0KHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT0yNTUmZSk6THQodGhpcyxlLHQsITEpLHQrMn0sYXQucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxVdCh0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzNdPWU+Pj4yNCk6SHQodGhpcyxlLHQsITApLHQrNH0sYXQucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxVdCh0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGU8MCYmKGU9NDI5NDk2NzI5NStlKzEpLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6SHQodGhpcyxlLHQsITEpLHQrNH0sYXQucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIE50KHRoaXMsZSx0LCEwLG4pfSxhdC5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gTnQodGhpcyxlLHQsITEsbil9LGF0LnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4ganQodGhpcyxlLHQsITAsbil9LGF0LnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4ganQodGhpcyxlLHQsITEsbil9LGF0LnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGUsdCxuLHIpe2lmKG58fChuPTApLHJ8fDA9PT1yfHwocj10aGlzLmxlbmd0aCksdD49ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSx0fHwodD0wKSxyPjAmJnI8biYmKHI9bikscj09PW4pcmV0dXJuIDA7aWYoMD09PWUubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtyPnRoaXMubGVuZ3RoJiYocj10aGlzLmxlbmd0aCksZS5sZW5ndGgtdDxyLW4mJihyPWUubGVuZ3RoLXQrbik7dmFyIGksbz1yLW47aWYodGhpcz09PWUmJm48dCYmdDxyKWZvcihpPW8tMTtpPj0wOy0taSllW2krdF09dGhpc1tpK25dO2Vsc2UgaWYobzwxZTN8fCFhdC5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTxvOysraSllW2krdF09dGhpc1tpK25dO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoZSx0aGlzLnN1YmFycmF5KG4sbitvKSx0KTtyZXR1cm4gb30sYXQucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oZSx0LG4scil7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQ/KHI9dCx0PTAsbj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBuJiYocj1uLG49dGhpcy5sZW5ndGgpLDE9PT1lLmxlbmd0aCl7dmFyIGk9ZS5jaGFyQ29kZUF0KDApO2k8MjU2JiYoZT1pKX1pZih2b2lkIDAhPT1yJiYic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIWF0LmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKX1lbHNlIm51bWJlciI9PXR5cGVvZiBlJiYoZSY9MjU1KTtpZih0PDB8fHRoaXMubGVuZ3RoPHR8fHRoaXMubGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKG48PXQpcmV0dXJuIHRoaXM7dmFyIG87aWYodD4+Pj0wLG49dm9pZCAwPT09bj90aGlzLmxlbmd0aDpuPj4+MCxlfHwoZT0wKSwibnVtYmVyIj09dHlwZW9mIGUpZm9yKG89dDtvPG47KytvKXRoaXNbb109ZTtlbHNle3ZhciBzPWZ0KGUpP2U6QnQobmV3IGF0KGUscikudG9TdHJpbmcoKSksYT1zLmxlbmd0aDtmb3Iobz0wO288bi10Oysrbyl0aGlzW28rdF09c1tvJWFdfXJldHVybiB0aGlzfTt2YXIgeHQ9L1teK1wvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gcXQoZSl7cmV0dXJuIGU8MTY/IjAiK2UudG9TdHJpbmcoMTYpOmUudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIEJ0KGUsdCl7dmFyIG47dD10fHwxLzA7Zm9yKHZhciByPWUubGVuZ3RoLGk9bnVsbCxvPVtdLHM9MDtzPHI7KytzKXtpZigobj1lLmNoYXJDb2RlQXQocykpPjU1Mjk1JiZuPDU3MzQ0KXtpZighaSl7aWYobj41NjMxOSl7KHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKHMrMT09PXIpeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPW47Y29udGludWV9aWYobjw1NjMyMCl7KHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpLGk9bjtjb250aW51ZX1uPTY1NTM2KyhpLTU1Mjk2PDwxMHxuLTU2MzIwKX1lbHNlIGkmJih0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwsbjwxMjgpe2lmKCh0LT0xKTwwKWJyZWFrO28ucHVzaChuKX1lbHNlIGlmKG48MjA0OCl7aWYoKHQtPTIpPDApYnJlYWs7by5wdXNoKG4+PjZ8MTkyLDYzJm58MTI4KX1lbHNlIGlmKG48NjU1MzYpe2lmKCh0LT0zKTwwKWJyZWFrO28ucHVzaChuPj4xMnwyMjQsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfWVsc2V7aWYoIShuPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKHQtPTQpPDApYnJlYWs7by5wdXNoKG4+PjE4fDI0MCxuPj4xMiY2M3wxMjgsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfX1yZXR1cm4gb31mdW5jdGlvbiBGdChlKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxzO1hlfHwkZSgpO3ZhciBhPWUubGVuZ3RoO2lmKGElND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO289Ij0iPT09ZVthLTJdPzI6Ij0iPT09ZVthLTFdPzE6MCxzPW5ldyBHZSgzKmEvNC1vKSxyPW8+MD9hLTQ6YTt2YXIgYz0wO2Zvcih0PTAsbj0wO3Q8cjt0Kz00LG4rPTMpaT1ZZVtlLmNoYXJDb2RlQXQodCldPDwxOHxZZVtlLmNoYXJDb2RlQXQodCsxKV08PDEyfFllW2UuY2hhckNvZGVBdCh0KzIpXTw8NnxZZVtlLmNoYXJDb2RlQXQodCszKV0sc1tjKytdPWk+PjE2JjI1NSxzW2MrK109aT4+OCYyNTUsc1tjKytdPTI1NSZpO3JldHVybiAyPT09bz8oaT1ZZVtlLmNoYXJDb2RlQXQodCldPDwyfFllW2UuY2hhckNvZGVBdCh0KzEpXT4+NCxzW2MrK109MjU1JmkpOjE9PT1vJiYoaT1ZZVtlLmNoYXJDb2RlQXQodCldPDwxMHxZZVtlLmNoYXJDb2RlQXQodCsxKV08PDR8WWVbZS5jaGFyQ29kZUF0KHQrMildPj4yLHNbYysrXT1pPj44JjI1NSxzW2MrK109MjU1JmkpLHN9KGZ1bmN0aW9uKGUpe2lmKChlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0/ZS50cmltKCk6ZS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KGUpLnJlcGxhY2UoeHQsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO2UubGVuZ3RoJTQhPTA7KWUrPSI9IjtyZXR1cm4gZX0oZSkpfWZ1bmN0aW9uIEt0KGUsdCxuLHIpe2Zvcih2YXIgaT0wO2k8ciYmIShpK24+PXQubGVuZ3RofHxpPj1lLmxlbmd0aCk7KytpKXRbaStuXT1lW2ldO3JldHVybiBpfWZ1bmN0aW9uIEp0KGUpe3JldHVybiBudWxsIT1lJiYoISFlLl9pc0J1ZmZlcnx8V3QoZSl8fGZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5zbGljZSYmV3QoZS5zbGljZSgwLDApKX0oZSkpfWZ1bmN0aW9uIFd0KGUpe3JldHVybiEhZS5jb25zdHJ1Y3RvciYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY29uc3RydWN0b3IuaXNCdWZmZXImJmUuY29uc3RydWN0b3IuaXNCdWZmZXIoZSl9dmFyIHp0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJ1ZmZlcjphdCxJTlNQRUNUX01BWF9CWVRFUzo1MCxTbG93QnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybitlIT1lJiYoZT0wKSxhdC5hbGxvYygrZSl9LGlzQnVmZmVyOkp0LGtNYXhMZW5ndGg6aXR9KTtjbGFzcyBWdCBleHRlbmRzIEVycm9ye3N0YXRpYyBmcm9tKGUsdCxuLHIsaSxvKXtjb25zdCBzPW5ldyBWdChlLm1lc3NhZ2UsdHx8ZS5jb2RlLG4scixpKTtyZXR1cm4gcy5jYXVzZT1lLHMubmFtZT1lLm5hbWUsbnVsbCE9ZS5zdGF0dXMmJm51bGw9PXMuc3RhdHVzJiYocy5zdGF0dXM9ZS5zdGF0dXMpLG8mJk9iamVjdC5hc3NpZ24ocyxvKSxzfWNvbnN0cnVjdG9yKGUsdCxuLHIsaSl7c3VwZXIoZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1lc3NhZ2UiLHt2YWx1ZTplLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdGhpcy5uYW1lPSJBeGlvc0Vycm9yIix0aGlzLmlzQXhpb3NFcnJvcj0hMCx0JiYodGhpcy5jb2RlPXQpLG4mJih0aGlzLmNvbmZpZz1uKSxyJiYodGhpcy5yZXF1ZXN0PXIpLGkmJih0aGlzLnJlc3BvbnNlPWksdGhpcy5zdGF0dXM9aS5zdGF0dXMpfXRvSlNPTigpe3JldHVybnttZXNzYWdlOnRoaXMubWVzc2FnZSxuYW1lOnRoaXMubmFtZSxkZXNjcmlwdGlvbjp0aGlzLmRlc2NyaXB0aW9uLG51bWJlcjp0aGlzLm51bWJlcixmaWxlTmFtZTp0aGlzLmZpbGVOYW1lLGxpbmVOdW1iZXI6dGhpcy5saW5lTnVtYmVyLGNvbHVtbk51bWJlcjp0aGlzLmNvbHVtbk51bWJlcixzdGFjazp0aGlzLnN0YWNrLGNvbmZpZzp6ZS50b0pTT05PYmplY3QodGhpcy5jb25maWcpLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnN0YXR1c319fVZ0LkVSUl9CQURfT1BUSU9OX1ZBTFVFPSJFUlJfQkFEX09QVElPTl9WQUxVRSIsVnQuRVJSX0JBRF9PUFRJT049IkVSUl9CQURfT1BUSU9OIixWdC5FQ09OTkFCT1JURUQ9IkVDT05OQUJPUlRFRCIsVnQuRVRJTUVET1VUPSJFVElNRURPVVQiLFZ0LkVSUl9ORVRXT1JLPSJFUlJfTkVUV09SSyIsVnQuRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUz0iRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUyIsVnQuRVJSX0RFUFJFQ0FURUQ9IkVSUl9ERVBSRUNBVEVEIixWdC5FUlJfQkFEX1JFU1BPTlNFPSJFUlJfQkFEX1JFU1BPTlNFIixWdC5FUlJfQkFEX1JFUVVFU1Q9IkVSUl9CQURfUkVRVUVTVCIsVnQuRVJSX0NBTkNFTEVEPSJFUlJfQ0FOQ0VMRUQiLFZ0LkVSUl9OT1RfU1VQUE9SVD0iRVJSX05PVF9TVVBQT1JUIixWdC5FUlJfSU5WQUxJRF9VUkw9IkVSUl9JTlZBTElEX1VSTCI7dmFyIFl0PVZ0O2Z1bmN0aW9uIEd0KGUpe3JldHVybiB6ZS5pc1BsYWluT2JqZWN0KGUpfHx6ZS5pc0FycmF5KGUpfWZ1bmN0aW9uIFh0KGUpe3JldHVybiB6ZS5lbmRzV2l0aChlLCJbXSIpP2Uuc2xpY2UoMCwtMik6ZX1mdW5jdGlvbiAkdChlLHQsbil7cmV0dXJuIGU/ZS5jb25jYXQodCkubWFwKChmdW5jdGlvbihlLHQpe3JldHVybiBlPVh0KGUpLCFuJiZ0PyJbIitlKyJdIjplfSkpLmpvaW4obj8iLiI6IiIpOnR9Y29uc3QgWnQ9emUudG9GbGF0T2JqZWN0KHplLHt9LG51bGwsKGZ1bmN0aW9uKGUpe3JldHVybi9eaXNbQS1aXS8udGVzdChlKX0pKTtmdW5jdGlvbiBRdChlLHQsbil7aWYoIXplLmlzT2JqZWN0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoInRhcmdldCBtdXN0IGJlIGFuIG9iamVjdCIpO3Q9dHx8bmV3IEZvcm1EYXRhO2NvbnN0IHI9KG49emUudG9GbGF0T2JqZWN0KG4se21ldGFUb2tlbnM6ITAsZG90czohMSxpbmRleGVzOiExfSwhMSwoZnVuY3Rpb24oZSx0KXtyZXR1cm4hemUuaXNVbmRlZmluZWQodFtlXSl9KSkpLm1ldGFUb2tlbnMsaT1uLnZpc2l0b3J8fHUsbz1uLmRvdHMscz1uLmluZGV4ZXMsYT0obi5CbG9ifHwidW5kZWZpbmVkIiE9dHlwZW9mIEJsb2ImJkJsb2IpJiZ6ZS5pc1NwZWNDb21wbGlhbnRGb3JtKHQpO2lmKCF6ZS5pc0Z1bmN0aW9uKGkpKXRocm93IG5ldyBUeXBlRXJyb3IoInZpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uIik7ZnVuY3Rpb24gYyhlKXtpZihudWxsPT09ZSlyZXR1cm4iIjtpZih6ZS5pc0RhdGUoZSkpcmV0dXJuIGUudG9JU09TdHJpbmcoKTtpZih6ZS5pc0Jvb2xlYW4oZSkpcmV0dXJuIGUudG9TdHJpbmcoKTtpZighYSYmemUuaXNCbG9iKGUpKXRocm93IG5ldyBZdCgiQmxvYiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYSBCdWZmZXIgaW5zdGVhZC4iKTtyZXR1cm4gemUuaXNBcnJheUJ1ZmZlcihlKXx8emUuaXNUeXBlZEFycmF5KGUpP2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBCbG9iP25ldyBCbG9iKFtlXSk6YXQuZnJvbShlKTplfWZ1bmN0aW9uIHUoZSxuLGkpe2xldCBhPWU7aWYoemUuaXNSZWFjdE5hdGl2ZSh0KSYmemUuaXNSZWFjdE5hdGl2ZUJsb2IoZSkpcmV0dXJuIHQuYXBwZW5kKCR0KGksbixvKSxjKGUpKSwhMTtpZihlJiYhaSYmIm9iamVjdCI9PXR5cGVvZiBlKWlmKHplLmVuZHNXaXRoKG4sInt9Iikpbj1yP246bi5zbGljZSgwLC0yKSxlPUpTT04uc3RyaW5naWZ5KGUpO2Vsc2UgaWYoemUuaXNBcnJheShlKSYmZnVuY3Rpb24oZSl7cmV0dXJuIHplLmlzQXJyYXkoZSkmJiFlLnNvbWUoR3QpfShlKXx8KHplLmlzRmlsZUxpc3QoZSl8fHplLmVuZHNXaXRoKG4sIltdIikpJiYoYT16ZS50b0FycmF5KGUpKSlyZXR1cm4gbj1YdChuKSxhLmZvckVhY2goKGZ1bmN0aW9uKGUscil7IXplLmlzVW5kZWZpbmVkKGUpJiZudWxsIT09ZSYmdC5hcHBlbmQoITA9PT1zPyR0KFtuXSxyLG8pOm51bGw9PT1zP246bisiW10iLGMoZSkpfSkpLCExO3JldHVybiEhR3QoZSl8fCh0LmFwcGVuZCgkdChpLG4sbyksYyhlKSksITEpfWNvbnN0IGw9W10sZD1PYmplY3QuYXNzaWduKFp0LHtkZWZhdWx0VmlzaXRvcjp1LGNvbnZlcnRWYWx1ZTpjLGlzVmlzaXRhYmxlOkd0fSk7aWYoIXplLmlzT2JqZWN0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoImRhdGEgbXVzdCBiZSBhbiBvYmplY3QiKTtyZXR1cm4gZnVuY3Rpb24gZShuLHIpe2lmKCF6ZS5pc1VuZGVmaW5lZChuKSl7aWYoLTEhPT1sLmluZGV4T2YobikpdGhyb3cgRXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAiK3Iuam9pbigiLiIpKTtsLnB1c2gobiksemUuZm9yRWFjaChuLChmdW5jdGlvbihuLG8peyEwPT09KCEoemUuaXNVbmRlZmluZWQobil8fG51bGw9PT1uKSYmaS5jYWxsKHQsbix6ZS5pc1N0cmluZyhvKT9vLnRyaW0oKTpvLHIsZCkpJiZlKG4scj9yLmNvbmNhdChvKTpbb10pfSkpLGwucG9wKCl9fShlKSx0fWZ1bmN0aW9uIGVuKGUpe2NvbnN0IHQ9eyIhIjoiJTIxIiwiJyI6IiUyNyIsIigiOiIlMjgiLCIpIjoiJTI5IiwifiI6IiU3RSIsIiUyMCI6IisiLCIlMDAiOiJcMCJ9O3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvWyEnKCl+XXwlMjB8JTAwL2csKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSkpfWZ1bmN0aW9uIHRuKGUsdCl7dGhpcy5fcGFpcnM9W10sZSYmUXQoZSx0aGlzLHQpfWNvbnN0IG5uPXRuLnByb3RvdHlwZTtmdW5jdGlvbiBybihlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpLnJlcGxhY2UoLyUzQS9naSwiOiIpLnJlcGxhY2UoLyUyNC9nLCIkIikucmVwbGFjZSgvJTJDL2dpLCIsIikucmVwbGFjZSgvJTIwL2csIisiKX1mdW5jdGlvbiBvbihlLHQsbil7aWYoIXQpcmV0dXJuIGU7Y29uc3Qgcj1uJiZuLmVuY29kZXx8cm4saT16ZS5pc0Z1bmN0aW9uKG4pP3tzZXJpYWxpemU6bn06bixvPWkmJmkuc2VyaWFsaXplO2xldCBzO2lmKHM9bz9vKHQsaSk6emUuaXNVUkxTZWFyY2hQYXJhbXModCk/dC50b1N0cmluZygpOm5ldyB0bih0LGkpLnRvU3RyaW5nKHIpLHMpe2NvbnN0IHQ9ZS5pbmRleE9mKCIjIik7LTEhPT10JiYoZT1lLnNsaWNlKDAsdCkpLGUrPSgtMT09PWUuaW5kZXhPZigiPyIpPyI/IjoiJiIpK3N9cmV0dXJuIGV9bm4uYXBwZW5kPWZ1bmN0aW9uKGUsdCl7dGhpcy5fcGFpcnMucHVzaChbZSx0XSl9LG5uLnRvU3RyaW5nPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9ZT9mdW5jdGlvbih0KXtyZXR1cm4gZS5jYWxsKHRoaXMsdCxlbil9OmVuO3JldHVybiB0aGlzLl9wYWlycy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiB0KGVbMF0pKyI9Iit0KGVbMV0pfSksIiIpLmpvaW4oIiYiKX07dmFyIHNuPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5oYW5kbGVycz1bXX11c2UoZSx0LG4pe3JldHVybiB0aGlzLmhhbmRsZXJzLnB1c2goe2Z1bGZpbGxlZDplLHJlamVjdGVkOnQsc3luY2hyb25vdXM6ISFuJiZuLnN5bmNocm9ub3VzLHJ1bldoZW46bj9uLnJ1bldoZW46bnVsbH0pLHRoaXMuaGFuZGxlcnMubGVuZ3RoLTF9ZWplY3QoZSl7dGhpcy5oYW5kbGVyc1tlXSYmKHRoaXMuaGFuZGxlcnNbZV09bnVsbCl9Y2xlYXIoKXt0aGlzLmhhbmRsZXJzJiYodGhpcy5oYW5kbGVycz1bXSl9Zm9yRWFjaChlKXt6ZS5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsKGZ1bmN0aW9uKHQpe251bGwhPT10JiZlKHQpfSkpfX0sYW49e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITEsbGVnYWN5SW50ZXJjZXB0b3JSZXFSZXNPcmRlcmluZzohMH0sY249e2lzQnJvd3NlcjohMCxjbGFzc2VzOntVUkxTZWFyY2hQYXJhbXM6InVuZGVmaW5lZCIhPXR5cGVvZiBVUkxTZWFyY2hQYXJhbXM/VVJMU2VhcmNoUGFyYW1zOnRuLEZvcm1EYXRhOiJ1bmRlZmluZWQiIT10eXBlb2YgRm9ybURhdGE/Rm9ybURhdGE6bnVsbCxCbG9iOiJ1bmRlZmluZWQiIT10eXBlb2YgQmxvYj9CbG9iOm51bGx9LHByb3RvY29sczpbImh0dHAiLCJodHRwcyIsImZpbGUiLCJibG9iIiwidXJsIiwiZGF0YSJdfTtjb25zdCB1bj0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCxsbj0ib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvciYmbmF2aWdhdG9yfHx2b2lkIDAsZG49dW4mJighbG58fFsiUmVhY3ROYXRpdmUiLCJOYXRpdmVTY3JpcHQiLCJOUyJdLmluZGV4T2YobG4ucHJvZHVjdCk8MCksaG49InVuZGVmaW5lZCIhPXR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlJiYiZnVuY3Rpb24iPT10eXBlb2Ygc2VsZi5pbXBvcnRTY3JpcHRzLGZuPXVuJiZ3aW5kb3cubG9jYXRpb24uaHJlZnx8Imh0dHA6Ly9sb2NhbGhvc3QiO3ZhciBwbj17Li4uT2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsaGFzQnJvd3NlckVudjp1bixoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnY6aG4saGFzU3RhbmRhcmRCcm93c2VyRW52OmRuLG5hdmlnYXRvcjpsbixvcmlnaW46Zm59KSwuLi5jbn07ZnVuY3Rpb24gZ24oZSl7ZnVuY3Rpb24gdChlLG4scixpKXtsZXQgbz1lW2krK107aWYoIl9fcHJvdG9fXyI9PT1vKXJldHVybiEwO2NvbnN0IHM9TnVtYmVyLmlzRmluaXRlKCtvKSxhPWk+PWUubGVuZ3RoO2lmKG89IW8mJnplLmlzQXJyYXkocik/ci5sZW5ndGg6byxhKXJldHVybiB6ZS5oYXNPd25Qcm9wKHIsbyk/cltvXT1bcltvXSxuXTpyW29dPW4sIXM7cltvXSYmemUuaXNPYmplY3QocltvXSl8fChyW29dPVtdKTtyZXR1cm4gdChlLG4scltvXSxpKSYmemUuaXNBcnJheShyW29dKSYmKHJbb109ZnVuY3Rpb24oZSl7Y29uc3QgdD17fSxuPU9iamVjdC5rZXlzKGUpO2xldCByO2NvbnN0IGk9bi5sZW5ndGg7bGV0IG87Zm9yKHI9MDtyPGk7cisrKW89bltyXSx0W29dPWVbb107cmV0dXJuIHR9KHJbb10pKSwhc31pZih6ZS5pc0Zvcm1EYXRhKGUpJiZ6ZS5pc0Z1bmN0aW9uKGUuZW50cmllcykpe2NvbnN0IG49e307cmV0dXJuIHplLmZvckVhY2hFbnRyeShlLCgoZSxyKT0+e3QoZnVuY3Rpb24oZSl7cmV0dXJuIHplLm1hdGNoQWxsKC9cdyt8XFsoXHcqKV0vZyxlKS5tYXAoKGU9PiJbXSI9PT1lWzBdPyIiOmVbMV18fGVbMF0pKX0oZSkscixuLDApfSkpLG59cmV0dXJuIG51bGx9Y29uc3QgeW49e3RyYW5zaXRpb25hbDphbixhZGFwdGVyOlsieGhyIiwiaHR0cCIsImZldGNoIl0sdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24oZSx0KXtjb25zdCBuPXQuZ2V0Q29udGVudFR5cGUoKXx8IiIscj1uLmluZGV4T2YoImFwcGxpY2F0aW9uL2pzb24iKT4tMSxpPXplLmlzT2JqZWN0KGUpO2kmJnplLmlzSFRNTEZvcm0oZSkmJihlPW5ldyBGb3JtRGF0YShlKSk7aWYoemUuaXNGb3JtRGF0YShlKSlyZXR1cm4gcj9KU09OLnN0cmluZ2lmeShnbihlKSk6ZTtpZih6ZS5pc0FycmF5QnVmZmVyKGUpfHx6ZS5pc0J1ZmZlcihlKXx8emUuaXNTdHJlYW0oZSl8fHplLmlzRmlsZShlKXx8emUuaXNCbG9iKGUpfHx6ZS5pc1JlYWRhYmxlU3RyZWFtKGUpKXJldHVybiBlO2lmKHplLmlzQXJyYXlCdWZmZXJWaWV3KGUpKXJldHVybiBlLmJ1ZmZlcjtpZih6ZS5pc1VSTFNlYXJjaFBhcmFtcyhlKSlyZXR1cm4gdC5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiLCExKSxlLnRvU3RyaW5nKCk7bGV0IG87aWYoaSl7aWYobi5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKT4tMSlyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gUXQoZSxuZXcgcG4uY2xhc3Nlcy5VUkxTZWFyY2hQYXJhbXMse3Zpc2l0b3I6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHBuLmlzTm9kZSYmemUuaXNCdWZmZXIoZSk/KHRoaXMuYXBwZW5kKHQsZS50b1N0cmluZygiYmFzZTY0IikpLCExKTpyLmRlZmF1bHRWaXNpdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sLi4udH0pfShlLHRoaXMuZm9ybVNlcmlhbGl6ZXIpLnRvU3RyaW5nKCk7aWYoKG89emUuaXNGaWxlTGlzdChlKSl8fG4uaW5kZXhPZigibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpPi0xKXtjb25zdCB0PXRoaXMuZW52JiZ0aGlzLmVudi5Gb3JtRGF0YTtyZXR1cm4gUXQobz97ImZpbGVzW10iOmV9OmUsdCYmbmV3IHQsdGhpcy5mb3JtU2VyaWFsaXplcil9fXJldHVybiBpfHxyPyh0LnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi9qc29uIiwhMSksZnVuY3Rpb24oZSx0LG4pe2lmKHplLmlzU3RyaW5nKGUpKXRyeXtyZXR1cm4odHx8SlNPTi5wYXJzZSkoZSksemUudHJpbShlKX1jYXRjaChlKXtpZigiU3ludGF4RXJyb3IiIT09ZS5uYW1lKXRocm93IGV9cmV0dXJuKG58fEpTT04uc3RyaW5naWZ5KShlKX0oZSkpOmV9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24oZSl7Y29uc3QgdD10aGlzLnRyYW5zaXRpb25hbHx8eW4udHJhbnNpdGlvbmFsLG49dCYmdC5mb3JjZWRKU09OUGFyc2luZyxyPSJqc29uIj09PXRoaXMucmVzcG9uc2VUeXBlO2lmKHplLmlzUmVzcG9uc2UoZSl8fHplLmlzUmVhZGFibGVTdHJlYW0oZSkpcmV0dXJuIGU7aWYoZSYmemUuaXNTdHJpbmcoZSkmJihuJiYhdGhpcy5yZXNwb25zZVR5cGV8fHIpKXtjb25zdCBuPSEodCYmdC5zaWxlbnRKU09OUGFyc2luZykmJnI7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUsdGhpcy5wYXJzZVJldml2ZXIpfWNhdGNoKGUpe2lmKG4pe2lmKCJTeW50YXhFcnJvciI9PT1lLm5hbWUpdGhyb3cgWXQuZnJvbShlLFl0LkVSUl9CQURfUkVTUE9OU0UsdGhpcyxudWxsLHRoaXMucmVzcG9uc2UpO3Rocm93IGV9fX1yZXR1cm4gZX1dLHRpbWVvdXQ6MCx4c3JmQ29va2llTmFtZToiWFNSRi1UT0tFTiIseHNyZkhlYWRlck5hbWU6IlgtWFNSRi1UT0tFTiIsbWF4Q29udGVudExlbmd0aDotMSxtYXhCb2R5TGVuZ3RoOi0xLGVudjp7Rm9ybURhdGE6cG4uY2xhc3Nlcy5Gb3JtRGF0YSxCbG9iOnBuLmNsYXNzZXMuQmxvYn0sdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoiLCJDb250ZW50LVR5cGUiOnZvaWQgMH19fTt6ZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCJdLChlPT57eW4uaGVhZGVyc1tlXT17fX0pKTt2YXIgdm49eW47Y29uc3QgbW49emUudG9PYmplY3RTZXQoWyJhZ2UiLCJhdXRob3JpemF0aW9uIiwiY29udGVudC1sZW5ndGgiLCJjb250ZW50LXR5cGUiLCJldGFnIiwiZXhwaXJlcyIsImZyb20iLCJob3N0IiwiaWYtbW9kaWZpZWQtc2luY2UiLCJpZi11bm1vZGlmaWVkLXNpbmNlIiwibGFzdC1tb2RpZmllZCIsImxvY2F0aW9uIiwibWF4LWZvcndhcmRzIiwicHJveHktYXV0aG9yaXphdGlvbiIsInJlZmVyZXIiLCJyZXRyeS1hZnRlciIsInVzZXItYWdlbnQiXSk7Y29uc3Qgd249U3ltYm9sKCJpbnRlcm5hbHMiKTtmdW5jdGlvbiBibihlKXtyZXR1cm4gZSYmU3RyaW5nKGUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIF9uKGUpe3JldHVybiExPT09ZXx8bnVsbD09ZT9lOnplLmlzQXJyYXkoZSk/ZS5tYXAoX24pOlN0cmluZyhlKX1mdW5jdGlvbiBTbihlLHQsbixyLGkpe3JldHVybiB6ZS5pc0Z1bmN0aW9uKHIpP3IuY2FsbCh0aGlzLHQsbik6KGkmJih0PW4pLHplLmlzU3RyaW5nKHQpP3plLmlzU3RyaW5nKHIpPy0xIT09dC5pbmRleE9mKHIpOnplLmlzUmVnRXhwKHIpP3IudGVzdCh0KTp2b2lkIDA6dm9pZCAwKX1jbGFzcyBFbntjb25zdHJ1Y3RvcihlKXtlJiZ0aGlzLnNldChlKX1zZXQoZSx0LG4pe2NvbnN0IHI9dGhpcztmdW5jdGlvbiBpKGUsdCxuKXtjb25zdCBpPWJuKHQpO2lmKCFpKXRocm93IG5ldyBFcnJvcigiaGVhZGVyIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmciKTtjb25zdCBvPXplLmZpbmRLZXkocixpKTsoIW98fHZvaWQgMD09PXJbb118fCEwPT09bnx8dm9pZCAwPT09biYmITEhPT1yW29dKSYmKHJbb3x8dF09X24oZSkpfWNvbnN0IG89KGUsdCk9PnplLmZvckVhY2goZSwoKGUsbik9PmkoZSxuLHQpKSk7aWYoemUuaXNQbGFpbk9iamVjdChlKXx8ZSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpbyhlLHQpO2Vsc2UgaWYoemUuaXNTdHJpbmcoZSkmJihlPWUudHJpbSgpKSYmIS9eWy1fYS16QS1aMC05XmB8fiwhIyQlJicqKy5dKyQvLnRlc3QoZS50cmltKCkpKW8oKGU9Pntjb25zdCB0PXt9O2xldCBuLHIsaTtyZXR1cm4gZSYmZS5zcGxpdCgiXG4iKS5mb3JFYWNoKChmdW5jdGlvbihlKXtpPWUuaW5kZXhPZigiOiIpLG49ZS5zdWJzdHJpbmcoMCxpKS50cmltKCkudG9Mb3dlckNhc2UoKSxyPWUuc3Vic3RyaW5nKGkrMSkudHJpbSgpLCFufHx0W25dJiZtbltuXXx8KCJzZXQtY29va2llIj09PW4/dFtuXT90W25dLnB1c2gocik6dFtuXT1bcl06dFtuXT10W25dP3Rbbl0rIiwgIityOnIpfSkpLHR9KShlKSx0KTtlbHNlIGlmKHplLmlzT2JqZWN0KGUpJiZ6ZS5pc0l0ZXJhYmxlKGUpKXtsZXQgbixyLGk9e307Zm9yKGNvbnN0IHQgb2YgZSl7aWYoIXplLmlzQXJyYXkodCkpdGhyb3cgVHlwZUVycm9yKCJPYmplY3QgaXRlcmF0b3IgbXVzdCByZXR1cm4gYSBrZXktdmFsdWUgcGFpciIpO2lbcj10WzBdXT0obj1pW3JdKT96ZS5pc0FycmF5KG4pP1suLi5uLHRbMV1dOltuLHRbMV1dOnRbMV19byhpLHQpfWVsc2UgbnVsbCE9ZSYmaSh0LGUsbik7cmV0dXJuIHRoaXN9Z2V0KGUsdCl7aWYoZT1ibihlKSl7Y29uc3Qgbj16ZS5maW5kS2V5KHRoaXMsZSk7aWYobil7Y29uc3QgZT10aGlzW25dO2lmKCF0KXJldHVybiBlO2lmKCEwPT09dClyZXR1cm4gZnVuY3Rpb24oZSl7Y29uc3QgdD1PYmplY3QuY3JlYXRlKG51bGwpLG49LyhbXlxzLDs9XSspXHMqKD86PVxzKihbXiw7XSspKT8vZztsZXQgcjtmb3IoO3I9bi5leGVjKGUpOyl0W3JbMV1dPXJbMl07cmV0dXJuIHR9KGUpO2lmKHplLmlzRnVuY3Rpb24odCkpcmV0dXJuIHQuY2FsbCh0aGlzLGUsbik7aWYoemUuaXNSZWdFeHAodCkpcmV0dXJuIHQuZXhlYyhlKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJwYXJzZXIgbXVzdCBiZSBib29sZWFufHJlZ2V4cHxmdW5jdGlvbiIpfX19aGFzKGUsdCl7aWYoZT1ibihlKSl7Y29uc3Qgbj16ZS5maW5kS2V5KHRoaXMsZSk7cmV0dXJuISghbnx8dm9pZCAwPT09dGhpc1tuXXx8dCYmIVNuKDAsdGhpc1tuXSxuLHQpKX1yZXR1cm4hMX1kZWxldGUoZSx0KXtjb25zdCBuPXRoaXM7bGV0IHI9ITE7ZnVuY3Rpb24gaShlKXtpZihlPWJuKGUpKXtjb25zdCBpPXplLmZpbmRLZXkobixlKTshaXx8dCYmIVNuKDAsbltpXSxpLHQpfHwoZGVsZXRlIG5baV0scj0hMCl9fXJldHVybiB6ZS5pc0FycmF5KGUpP2UuZm9yRWFjaChpKTppKGUpLHJ9Y2xlYXIoZSl7Y29uc3QgdD1PYmplY3Qua2V5cyh0aGlzKTtsZXQgbj10Lmxlbmd0aCxyPSExO2Zvcig7bi0tOyl7Y29uc3QgaT10W25dO2UmJiFTbigwLHRoaXNbaV0saSxlLCEwKXx8KGRlbGV0ZSB0aGlzW2ldLHI9ITApfXJldHVybiByfW5vcm1hbGl6ZShlKXtjb25zdCB0PXRoaXMsbj17fTtyZXR1cm4gemUuZm9yRWFjaCh0aGlzLCgocixpKT0+e2NvbnN0IG89emUuZmluZEtleShuLGkpO2lmKG8pcmV0dXJuIHRbb109X24ociksdm9pZCBkZWxldGUgdFtpXTtjb25zdCBzPWU/ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKFthLXpcZF0pKFx3KikvZywoKGUsdCxuKT0+dC50b1VwcGVyQ2FzZSgpK24pKX0oaSk6U3RyaW5nKGkpLnRyaW0oKTtzIT09aSYmZGVsZXRlIHRbaV0sdFtzXT1fbihyKSxuW3NdPSEwfSkpLHRoaXN9Y29uY2F0KCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY29uY2F0KHRoaXMsLi4udCl9dG9KU09OKGUpe2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gemUuZm9yRWFjaCh0aGlzLCgobixyKT0+e251bGwhPW4mJiExIT09biYmKHRbcl09ZSYmemUuaXNBcnJheShuKT9uLmpvaW4oIiwgIik6bil9KSksdH1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKVtTeW1ib2wuaXRlcmF0b3JdKCl9dG9TdHJpbmcoKXtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSkubWFwKChlPT57bGV0W3Qsbl09ZTtyZXR1cm4gdCsiOiAiK259KSkuam9pbigiXG4iKX1nZXRTZXRDb29raWUoKXtyZXR1cm4gdGhpcy5nZXQoInNldC1jb29raWUiKXx8W119Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iQXhpb3NIZWFkZXJzIn1zdGF0aWMgZnJvbShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHRoaXM/ZTpuZXcgdGhpcyhlKX1zdGF0aWMgY29uY2F0KGUpe2NvbnN0IHQ9bmV3IHRoaXMoZSk7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxpPTE7aTxuO2krKylyW2ktMV09YXJndW1lbnRzW2ldO3JldHVybiByLmZvckVhY2goKGU9PnQuc2V0KGUpKSksdH1zdGF0aWMgYWNjZXNzb3IoZSl7Y29uc3QgdD0odGhpc1t3bl09dGhpc1t3bl09e2FjY2Vzc29yczp7fX0pLmFjY2Vzc29ycyxuPXRoaXMucHJvdG90eXBlO2Z1bmN0aW9uIHIoZSl7Y29uc3Qgcj1ibihlKTt0W3JdfHwoIWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj16ZS50b0NhbWVsQ2FzZSgiICIrdCk7WyJnZXQiLCJzZXQiLCJoYXMiXS5mb3JFYWNoKChyPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KGUscituLHt2YWx1ZTpmdW5jdGlvbihlLG4saSl7cmV0dXJuIHRoaXNbcl0uY2FsbCh0aGlzLHQsZSxuLGkpfSxjb25maWd1cmFibGU6ITB9KX0pKX0obixlKSx0W3JdPSEwKX1yZXR1cm4gemUuaXNBcnJheShlKT9lLmZvckVhY2gocik6cihlKSx0aGlzfX1Fbi5hY2Nlc3NvcihbIkNvbnRlbnQtVHlwZSIsIkNvbnRlbnQtTGVuZ3RoIiwiQWNjZXB0IiwiQWNjZXB0LUVuY29kaW5nIiwiVXNlci1BZ2VudCIsIkF1dGhvcml6YXRpb24iXSksemUucmVkdWNlRGVzY3JpcHRvcnMoRW4ucHJvdG90eXBlLCgoZSx0KT0+e2xldHt2YWx1ZTpufT1lLHI9dFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSk7cmV0dXJue2dldDooKT0+bixzZXQoZSl7dGhpc1tyXT1lfX19KSksemUuZnJlZXplTWV0aG9kcyhFbik7dmFyIFJuPUVuO2Z1bmN0aW9uIFRuKGUsdCl7Y29uc3Qgbj10aGlzfHx2bixyPXR8fG4saT1Sbi5mcm9tKHIuaGVhZGVycyk7bGV0IG89ci5kYXRhO3JldHVybiB6ZS5mb3JFYWNoKGUsKGZ1bmN0aW9uKGUpe289ZS5jYWxsKG4sbyxpLm5vcm1hbGl6ZSgpLHQ/dC5zdGF0dXM6dm9pZCAwKX0pKSxpLm5vcm1hbGl6ZSgpLG99ZnVuY3Rpb24ga24oZSl7cmV0dXJuISghZXx8IWUuX19DQU5DRUxfXyl9dmFyIEFuPWNsYXNzIGV4dGVuZHMgWXR7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKG51bGw9PWU/ImNhbmNlbGVkIjplLFl0LkVSUl9DQU5DRUxFRCx0LG4pLHRoaXMubmFtZT0iQ2FuY2VsZWRFcnJvciIsdGhpcy5fX0NBTkNFTF9fPSEwfX07ZnVuY3Rpb24gQ24oZSx0LG4pe2NvbnN0IHI9bi5jb25maWcudmFsaWRhdGVTdGF0dXM7bi5zdGF0dXMmJnImJiFyKG4uc3RhdHVzKT90KG5ldyBZdCgiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK24uc3RhdHVzLFtZdC5FUlJfQkFEX1JFUVVFU1QsWXQuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcihuLnN0YXR1cy8xMDApLTRdLG4uY29uZmlnLG4ucmVxdWVzdCxuKSk6ZShuKX1mdW5jdGlvbiBPbihlLHQpe2U9ZXx8MTA7Y29uc3Qgbj1uZXcgQXJyYXkoZSkscj1uZXcgQXJyYXkoZSk7bGV0IGksbz0wLHM9MDtyZXR1cm4gdD12b2lkIDAhPT10P3Q6MWUzLGZ1bmN0aW9uKGEpe2NvbnN0IGM9RGF0ZS5ub3coKSx1PXJbc107aXx8KGk9YyksbltvXT1hLHJbb109YztsZXQgbD1zLGQ9MDtmb3IoO2whPT1vOylkKz1uW2wrK10sbCU9ZTtpZihvPShvKzEpJWUsbz09PXMmJihzPShzKzEpJWUpLGMtaTx0KXJldHVybjtjb25zdCBoPXUmJmMtdTtyZXR1cm4gaD9NYXRoLnJvdW5kKDFlMypkL2gpOnZvaWQgMH19ZnVuY3Rpb24gRG4oZSx0KXtsZXQgbixyLGk9MCxvPTFlMy90O2NvbnN0IHM9ZnVuY3Rpb24odCl7bGV0IG89YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOkRhdGUubm93KCk7aT1vLG49bnVsbCxyJiYoY2xlYXJUaW1lb3V0KHIpLHI9bnVsbCksZSguLi50KX07cmV0dXJuW2Z1bmN0aW9uKCl7Y29uc3QgZT1EYXRlLm5vdygpLHQ9ZS1pO2Zvcih2YXIgYT1hcmd1bWVudHMubGVuZ3RoLGM9bmV3IEFycmF5KGEpLHU9MDt1PGE7dSsrKWNbdV09YXJndW1lbnRzW3VdO3Q+PW8/cyhjLGUpOihuPWMscnx8KHI9c2V0VGltZW91dCgoKCk9PntyPW51bGwscyhuKX0pLG8tdCkpKX0sKCk9Pm4mJnMobildfWNvbnN0IFBuPWZ1bmN0aW9uKGUsdCl7bGV0IG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOjMscj0wO2NvbnN0IGk9T24oNTAsMjUwKTtyZXR1cm4gRG4oKG49Pntjb25zdCBvPW4ubG9hZGVkLHM9bi5sZW5ndGhDb21wdXRhYmxlP24udG90YWw6dm9pZCAwLGE9by1yLGM9aShhKTtyPW87ZSh7bG9hZGVkOm8sdG90YWw6cyxwcm9ncmVzczpzP28vczp2b2lkIDAsYnl0ZXM6YSxyYXRlOmN8fHZvaWQgMCxlc3RpbWF0ZWQ6YyYmcyYmbzw9cz8ocy1vKS9jOnZvaWQgMCxldmVudDpuLGxlbmd0aENvbXB1dGFibGU6bnVsbCE9cyxbdD8iZG93bmxvYWQiOiJ1cGxvYWQiXTohMH0pfSksbil9LEluPShlLHQpPT57Y29uc3Qgbj1udWxsIT1lO3JldHVybltyPT50WzBdKHtsZW5ndGhDb21wdXRhYmxlOm4sdG90YWw6ZSxsb2FkZWQ6cn0pLHRbMV1dfSxVbj1lPT5mdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQpLHI9MDtyPHQ7cisrKW5bcl09YXJndW1lbnRzW3JdO3JldHVybiB6ZS5hc2FwKCgoKT0+ZSguLi5uKSkpfTt2YXIgTG49cG4uaGFzU3RhbmRhcmRCcm93c2VyRW52PygoZSx0KT0+bj0+KG49bmV3IFVSTChuLHBuLm9yaWdpbiksZS5wcm90b2NvbD09PW4ucHJvdG9jb2wmJmUuaG9zdD09PW4uaG9zdCYmKHR8fGUucG9ydD09PW4ucG9ydCkpKShuZXcgVVJMKHBuLm9yaWdpbikscG4ubmF2aWdhdG9yJiYvKG1zaWV8dHJpZGVudCkvaS50ZXN0KHBuLm5hdmlnYXRvci51c2VyQWdlbnQpKTooKT0+ITAsSG49cG4uaGFzU3RhbmRhcmRCcm93c2VyRW52P3t3cml0ZShlLHQsbixyLGksbyxzKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGRvY3VtZW50KXJldHVybjtjb25zdCBhPVsiIi5jb25jYXQoZSwiPSIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQodCkpXTt6ZS5pc051bWJlcihuKSYmYS5wdXNoKCJleHBpcmVzPSIuY29uY2F0KG5ldyBEYXRlKG4pLnRvVVRDU3RyaW5nKCkpKSx6ZS5pc1N0cmluZyhyKSYmYS5wdXNoKCJwYXRoPSIuY29uY2F0KHIpKSx6ZS5pc1N0cmluZyhpKSYmYS5wdXNoKCJkb21haW49Ii5jb25jYXQoaSkpLCEwPT09byYmYS5wdXNoKCJzZWN1cmUiKSx6ZS5pc1N0cmluZyhzKSYmYS5wdXNoKCJTYW1lU2l0ZT0iLmNvbmNhdChzKSksZG9jdW1lbnQuY29va2llPWEuam9pbigiOyAiKX0scmVhZChlKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGRvY3VtZW50KXJldHVybiBudWxsO2NvbnN0IHQ9ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIig/Ol58OyApIitlKyI9KFteO10qKSIpKTtyZXR1cm4gdD9kZWNvZGVVUklDb21wb25lbnQodFsxXSk6bnVsbH0scmVtb3ZlKGUpe3RoaXMud3JpdGUoZSwiIixEYXRlLm5vdygpLTg2NGU1LCIvIil9fTp7d3JpdGUoKXt9LHJlYWQ6KCk9Pm51bGwscmVtb3ZlKCl7fX07ZnVuY3Rpb24gTW4oZSx0LG4pe2xldCByPSEoInN0cmluZyI9PXR5cGVvZihpPXQpJiYvXihbYS16XVthLXpcZCtcLS5dKjopP1wvXC8vaS50ZXN0KGkpKTt2YXIgaTtyZXR1cm4gZSYmKHJ8fDA9PW4pP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/ZS5yZXBsYWNlKC9cLz9cLyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0oZSx0KTp0fWNvbnN0IE5uPWU9PmUgaW5zdGFuY2VvZiBSbj97Li4uZX06ZTtmdW5jdGlvbiBqbihlLHQpe3Q9dHx8e307Y29uc3Qgbj17fTtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiB6ZS5pc1BsYWluT2JqZWN0KGUpJiZ6ZS5pc1BsYWluT2JqZWN0KHQpP3plLm1lcmdlLmNhbGwoe2Nhc2VsZXNzOnJ9LGUsdCk6emUuaXNQbGFpbk9iamVjdCh0KT96ZS5tZXJnZSh7fSx0KTp6ZS5pc0FycmF5KHQpP3Quc2xpY2UoKTp0fWZ1bmN0aW9uIGkoZSx0LG4saSl7cmV0dXJuIHplLmlzVW5kZWZpbmVkKHQpP3plLmlzVW5kZWZpbmVkKGUpP3ZvaWQgMDpyKHZvaWQgMCxlLDAsaSk6cihlLHQsMCxpKX1mdW5jdGlvbiBvKGUsdCl7aWYoIXplLmlzVW5kZWZpbmVkKHQpKXJldHVybiByKHZvaWQgMCx0KX1mdW5jdGlvbiBzKGUsdCl7cmV0dXJuIHplLmlzVW5kZWZpbmVkKHQpP3plLmlzVW5kZWZpbmVkKGUpP3ZvaWQgMDpyKHZvaWQgMCxlKTpyKHZvaWQgMCx0KX1mdW5jdGlvbiBhKG4saSxvKXtyZXR1cm4gbyBpbiB0P3IobixpKTpvIGluIGU/cih2b2lkIDAsbik6dm9pZCAwfWNvbnN0IGM9e3VybDpvLG1ldGhvZDpvLGRhdGE6byxiYXNlVVJMOnMsdHJhbnNmb3JtUmVxdWVzdDpzLHRyYW5zZm9ybVJlc3BvbnNlOnMscGFyYW1zU2VyaWFsaXplcjpzLHRpbWVvdXQ6cyx0aW1lb3V0TWVzc2FnZTpzLHdpdGhDcmVkZW50aWFsczpzLHdpdGhYU1JGVG9rZW46cyxhZGFwdGVyOnMscmVzcG9uc2VUeXBlOnMseHNyZkNvb2tpZU5hbWU6cyx4c3JmSGVhZGVyTmFtZTpzLG9uVXBsb2FkUHJvZ3Jlc3M6cyxvbkRvd25sb2FkUHJvZ3Jlc3M6cyxkZWNvbXByZXNzOnMsbWF4Q29udGVudExlbmd0aDpzLG1heEJvZHlMZW5ndGg6cyxiZWZvcmVSZWRpcmVjdDpzLHRyYW5zcG9ydDpzLGh0dHBBZ2VudDpzLGh0dHBzQWdlbnQ6cyxjYW5jZWxUb2tlbjpzLHNvY2tldFBhdGg6cyxyZXNwb25zZUVuY29kaW5nOnMsdmFsaWRhdGVTdGF0dXM6YSxoZWFkZXJzOihlLHQsbik9PmkoTm4oZSksTm4odCksMCwhMCl9O3JldHVybiB6ZS5mb3JFYWNoKE9iamVjdC5rZXlzKHsuLi5lLC4uLnR9KSwoZnVuY3Rpb24ocil7aWYoIl9fcHJvdG9fXyI9PT1yfHwiY29uc3RydWN0b3IiPT09cnx8InByb3RvdHlwZSI9PT1yKXJldHVybjtjb25zdCBvPXplLmhhc093blByb3AoYyxyKT9jW3JdOmkscz1vKGVbcl0sdFtyXSxyKTt6ZS5pc1VuZGVmaW5lZChzKSYmbyE9PWF8fChuW3JdPXMpfSkpLG59dmFyIHhuPWU9Pntjb25zdCB0PWpuKHt9LGUpO2xldHtkYXRhOm4sd2l0aFhTUkZUb2tlbjpyLHhzcmZIZWFkZXJOYW1lOmkseHNyZkNvb2tpZU5hbWU6byxoZWFkZXJzOnMsYXV0aDphfT10O2lmKHQuaGVhZGVycz1zPVJuLmZyb20ocyksdC51cmw9b24oTW4odC5iYXNlVVJMLHQudXJsLHQuYWxsb3dBYnNvbHV0ZVVybHMpLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplciksYSYmcy5zZXQoIkF1dGhvcml6YXRpb24iLCJCYXNpYyAiK2J0b2EoKGEudXNlcm5hbWV8fCIiKSsiOiIrKGEucGFzc3dvcmQ/dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGEucGFzc3dvcmQpKToiIikpKSx6ZS5pc0Zvcm1EYXRhKG4pKWlmKHBuLmhhc1N0YW5kYXJkQnJvd3NlckVudnx8cG4uaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52KXMuc2V0Q29udGVudFR5cGUodm9pZCAwKTtlbHNlIGlmKHplLmlzRnVuY3Rpb24obi5nZXRIZWFkZXJzKSl7Y29uc3QgZT1uLmdldEhlYWRlcnMoKSx0PVsiY29udGVudC10eXBlIiwiY29udGVudC1sZW5ndGgiXTtPYmplY3QuZW50cmllcyhlKS5mb3JFYWNoKChlPT57bGV0W24scl09ZTt0LmluY2x1ZGVzKG4udG9Mb3dlckNhc2UoKSkmJnMuc2V0KG4scil9KSl9aWYocG4uaGFzU3RhbmRhcmRCcm93c2VyRW52JiYociYmemUuaXNGdW5jdGlvbihyKSYmKHI9cih0KSkscnx8ITEhPT1yJiZMbih0LnVybCkpKXtjb25zdCBlPWkmJm8mJkhuLnJlYWQobyk7ZSYmcy5zZXQoaSxlKX1yZXR1cm4gdH07dmFyIHFuPSJ1bmRlZmluZWQiIT10eXBlb2YgWE1MSHR0cFJlcXVlc3QmJmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXtjb25zdCByPXhuKGUpO2xldCBpPXIuZGF0YTtjb25zdCBvPVJuLmZyb20oci5oZWFkZXJzKS5ub3JtYWxpemUoKTtsZXQgcyxhLGMsdSxsLHtyZXNwb25zZVR5cGU6ZCxvblVwbG9hZFByb2dyZXNzOmgsb25Eb3dubG9hZFByb2dyZXNzOmZ9PXI7ZnVuY3Rpb24gcCgpe3UmJnUoKSxsJiZsKCksci5jYW5jZWxUb2tlbiYmci5jYW5jZWxUb2tlbi51bnN1YnNjcmliZShzKSxyLnNpZ25hbCYmci5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHMpfWxldCBnPW5ldyBYTUxIdHRwUmVxdWVzdDtmdW5jdGlvbiB5KCl7aWYoIWcpcmV0dXJuO2NvbnN0IHI9Um4uZnJvbSgiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzImluIGcmJmcuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpO0NuKChmdW5jdGlvbihlKXt0KGUpLHAoKX0pLChmdW5jdGlvbihlKXtuKGUpLHAoKX0pLHtkYXRhOmQmJiJ0ZXh0IiE9PWQmJiJqc29uIiE9PWQ/Zy5yZXNwb25zZTpnLnJlc3BvbnNlVGV4dCxzdGF0dXM6Zy5zdGF0dXMsc3RhdHVzVGV4dDpnLnN0YXR1c1RleHQsaGVhZGVyczpyLGNvbmZpZzplLHJlcXVlc3Q6Z30pLGc9bnVsbH1nLm9wZW4oci5tZXRob2QudG9VcHBlckNhc2UoKSxyLnVybCwhMCksZy50aW1lb3V0PXIudGltZW91dCwib25sb2FkZW5kImluIGc/Zy5vbmxvYWRlbmQ9eTpnLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2cmJjQ9PT1nLnJlYWR5U3RhdGUmJigwIT09Zy5zdGF0dXN8fGcucmVzcG9uc2VVUkwmJjA9PT1nLnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6IikpJiZzZXRUaW1lb3V0KHkpfSxnLm9uYWJvcnQ9ZnVuY3Rpb24oKXtnJiYobihuZXcgWXQoIlJlcXVlc3QgYWJvcnRlZCIsWXQuRUNPTk5BQk9SVEVELGUsZykpLGc9bnVsbCl9LGcub25lcnJvcj1mdW5jdGlvbih0KXtjb25zdCByPXQmJnQubWVzc2FnZT90Lm1lc3NhZ2U6Ik5ldHdvcmsgRXJyb3IiLGk9bmV3IFl0KHIsWXQuRVJSX05FVFdPUkssZSxnKTtpLmV2ZW50PXR8fG51bGwsbihpKSxnPW51bGx9LGcub250aW1lb3V0PWZ1bmN0aW9uKCl7bGV0IHQ9ci50aW1lb3V0PyJ0aW1lb3V0IG9mICIrci50aW1lb3V0KyJtcyBleGNlZWRlZCI6InRpbWVvdXQgZXhjZWVkZWQiO2NvbnN0IGk9ci50cmFuc2l0aW9uYWx8fGFuO3IudGltZW91dEVycm9yTWVzc2FnZSYmKHQ9ci50aW1lb3V0RXJyb3JNZXNzYWdlKSxuKG5ldyBZdCh0LGkuY2xhcmlmeVRpbWVvdXRFcnJvcj9ZdC5FVElNRURPVVQ6WXQuRUNPTk5BQk9SVEVELGUsZykpLGc9bnVsbH0sdm9pZCAwPT09aSYmby5zZXRDb250ZW50VHlwZShudWxsKSwic2V0UmVxdWVzdEhlYWRlciJpbiBnJiZ6ZS5mb3JFYWNoKG8udG9KU09OKCksKGZ1bmN0aW9uKGUsdCl7Zy5zZXRSZXF1ZXN0SGVhZGVyKHQsZSl9KSksemUuaXNVbmRlZmluZWQoci53aXRoQ3JlZGVudGlhbHMpfHwoZy53aXRoQ3JlZGVudGlhbHM9ISFyLndpdGhDcmVkZW50aWFscyksZCYmImpzb24iIT09ZCYmKGcucmVzcG9uc2VUeXBlPXIucmVzcG9uc2VUeXBlKSxmJiYoW2MsbF09UG4oZiwhMCksZy5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsYykpLGgmJmcudXBsb2FkJiYoW2EsdV09UG4oaCksZy51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGEpLGcudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlbmQiLHUpKSwoci5jYW5jZWxUb2tlbnx8ci5zaWduYWwpJiYocz10PT57ZyYmKG4oIXR8fHQudHlwZT9uZXcgQW4obnVsbCxlLGcpOnQpLGcuYWJvcnQoKSxnPW51bGwpfSxyLmNhbmNlbFRva2VuJiZyLmNhbmNlbFRva2VuLnN1YnNjcmliZShzKSxyLnNpZ25hbCYmKHIuc2lnbmFsLmFib3J0ZWQ/cygpOnIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixzKSkpO2NvbnN0IHY9ZnVuY3Rpb24oZSl7Y29uc3QgdD0vXihbLStcd117MSwyNX0pKDo/XC9cL3w6KS8uZXhlYyhlKTtyZXR1cm4gdCYmdFsxXXx8IiJ9KHIudXJsKTt2JiYtMT09PXBuLnByb3RvY29scy5pbmRleE9mKHYpP24obmV3IFl0KCJVbnN1cHBvcnRlZCBwcm90b2NvbCAiK3YrIjoiLFl0LkVSUl9CQURfUkVRVUVTVCxlKSk6Zy5zZW5kKGl8fG51bGwpfSkpfTt2YXIgQm49KGUsdCk9Pntjb25zdHtsZW5ndGg6bn09ZT1lP2UuZmlsdGVyKEJvb2xlYW4pOltdO2lmKHR8fG4pe2xldCBuLHI9bmV3IEFib3J0Q29udHJvbGxlcjtjb25zdCBpPWZ1bmN0aW9uKGUpe2lmKCFuKXtuPSEwLHMoKTtjb25zdCB0PWUgaW5zdGFuY2VvZiBFcnJvcj9lOnRoaXMucmVhc29uO3IuYWJvcnQodCBpbnN0YW5jZW9mIFl0P3Q6bmV3IEFuKHQgaW5zdGFuY2VvZiBFcnJvcj90Lm1lc3NhZ2U6dCkpfX07bGV0IG89dCYmc2V0VGltZW91dCgoKCk9PntvPW51bGwsaShuZXcgWXQoInRpbWVvdXQgb2YgIi5jb25jYXQodCwibXMgZXhjZWVkZWQiKSxZdC5FVElNRURPVVQpKX0pLHQpO2NvbnN0IHM9KCk9PntlJiYobyYmY2xlYXJUaW1lb3V0KG8pLG89bnVsbCxlLmZvckVhY2goKGU9PntlLnVuc3Vic2NyaWJlP2UudW5zdWJzY3JpYmUoaSk6ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsaSl9KSksZT1udWxsKX07ZS5mb3JFYWNoKChlPT5lLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixpKSkpO2NvbnN0e3NpZ25hbDphfT1yO3JldHVybiBhLnVuc3Vic2NyaWJlPSgpPT56ZS5hc2FwKHMpLGF9fTtjb25zdCBGbj1mdW5jdGlvbiooZSx0KXtsZXQgbj1lLmJ5dGVMZW5ndGg7aWYoIXR8fG48dClyZXR1cm4gdm9pZCh5aWVsZCBlKTtsZXQgcixpPTA7Zm9yKDtpPG47KXI9aSt0LHlpZWxkIGUuc2xpY2UoaSxyKSxpPXJ9LEtuPWFzeW5jIGZ1bmN0aW9uKihlKXtpZihlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSlyZXR1cm4gdm9pZCh5aWVsZCplKTtjb25zdCB0PWUuZ2V0UmVhZGVyKCk7dHJ5e2Zvcig7Oyl7Y29uc3R7ZG9uZTplLHZhbHVlOm59PWF3YWl0IHQucmVhZCgpO2lmKGUpYnJlYWs7eWllbGQgbn19ZmluYWxseXthd2FpdCB0LmNhbmNlbCgpfX0sSm49KGUsdCxuLHIpPT57Y29uc3QgaT1hc3luYyBmdW5jdGlvbiooZSx0KXtmb3IgYXdhaXQoY29uc3QgbiBvZiBLbihlKSl5aWVsZCpGbihuLHQpfShlLHQpO2xldCBvLHM9MCxhPWU9PntvfHwobz0hMCxyJiZyKGUpKX07cmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7YXN5bmMgcHVsbChlKXt0cnl7Y29uc3R7ZG9uZTp0LHZhbHVlOnJ9PWF3YWl0IGkubmV4dCgpO2lmKHQpcmV0dXJuIGEoKSx2b2lkIGUuY2xvc2UoKTtsZXQgbz1yLmJ5dGVMZW5ndGg7aWYobil7bGV0IGU9cys9bztuKGUpfWUuZW5xdWV1ZShuZXcgVWludDhBcnJheShyKSl9Y2F0Y2goZSl7dGhyb3cgYShlKSxlfX0sY2FuY2VsOmU9PihhKGUpLGkucmV0dXJuKCkpfSx7aGlnaFdhdGVyTWFyazoyfSl9LHtpc0Z1bmN0aW9uOldufT16ZSx6bj0oZT0+e2xldHtSZXF1ZXN0OnQsUmVzcG9uc2U6bn09ZTtyZXR1cm57UmVxdWVzdDp0LFJlc3BvbnNlOm59fSkoemUuZ2xvYmFsKSx7UmVhZGFibGVTdHJlYW06Vm4sVGV4dEVuY29kZXI6WW59PXplLmdsb2JhbCxHbj1mdW5jdGlvbihlKXt0cnl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkodD4xP3QtMTowKSxyPTE7cjx0O3IrKyluW3ItMV09YXJndW1lbnRzW3JdO3JldHVybiEhZSguLi5uKX1jYXRjaChlKXtyZXR1cm4hMX19LFhuPWU9PntlPXplLm1lcmdlLmNhbGwoe3NraXBVbmRlZmluZWQ6ITB9LHpuLGUpO2NvbnN0e2ZldGNoOnQsUmVxdWVzdDpuLFJlc3BvbnNlOnJ9PWUsaT10P1duKHQpOiJmdW5jdGlvbiI9PXR5cGVvZiBmZXRjaCxvPVduKG4pLHM9V24ocik7aWYoIWkpcmV0dXJuITE7Y29uc3QgYT1pJiZXbihWbiksYz1pJiYoImZ1bmN0aW9uIj09dHlwZW9mIFluPyhlPT50PT5lLmVuY29kZSh0KSkobmV3IFluKTphc3luYyBlPT5uZXcgVWludDhBcnJheShhd2FpdCBuZXcgbihlKS5hcnJheUJ1ZmZlcigpKSksdT1vJiZhJiZHbigoKCk9PntsZXQgZT0hMTtjb25zdCB0PW5ldyBuKHBuLm9yaWdpbix7Ym9keTpuZXcgVm4sbWV0aG9kOiJQT1NUIixnZXQgZHVwbGV4KCl7cmV0dXJuIGU9ITAsImhhbGYifX0pLmhlYWRlcnMuaGFzKCJDb250ZW50LVR5cGUiKTtyZXR1cm4gZSYmIXR9KSksbD1zJiZhJiZHbigoKCk9PnplLmlzUmVhZGFibGVTdHJlYW0obmV3IHIoIiIpLmJvZHkpKSksZD17c3RyZWFtOmwmJihlPT5lLmJvZHkpfTtpJiZbInRleHQiLCJhcnJheUJ1ZmZlciIsImJsb2IiLCJmb3JtRGF0YSIsInN0cmVhbSJdLmZvckVhY2goKGU9PnshZFtlXSYmKGRbZV09KHQsbik9PntsZXQgcj10JiZ0W2VdO2lmKHIpcmV0dXJuIHIuY2FsbCh0KTt0aHJvdyBuZXcgWXQoIlJlc3BvbnNlIHR5cGUgJyIuY29uY2F0KGUsIicgaXMgbm90IHN1cHBvcnRlZCIpLFl0LkVSUl9OT1RfU1VQUE9SVCxuKX0pfSkpO2NvbnN0IGg9YXN5bmMoZSx0KT0+e2NvbnN0IHI9emUudG9GaW5pdGVOdW1iZXIoZS5nZXRDb250ZW50TGVuZ3RoKCkpO3JldHVybiBudWxsPT1yPyhhc3luYyBlPT57aWYobnVsbD09ZSlyZXR1cm4gMDtpZih6ZS5pc0Jsb2IoZSkpcmV0dXJuIGUuc2l6ZTtpZih6ZS5pc1NwZWNDb21wbGlhbnRGb3JtKGUpKXtjb25zdCB0PW5ldyBuKHBuLm9yaWdpbix7bWV0aG9kOiJQT1NUIixib2R5OmV9KTtyZXR1cm4oYXdhaXQgdC5hcnJheUJ1ZmZlcigpKS5ieXRlTGVuZ3RofXJldHVybiB6ZS5pc0FycmF5QnVmZmVyVmlldyhlKXx8emUuaXNBcnJheUJ1ZmZlcihlKT9lLmJ5dGVMZW5ndGg6KHplLmlzVVJMU2VhcmNoUGFyYW1zKGUpJiYoZSs9IiIpLHplLmlzU3RyaW5nKGUpPyhhd2FpdCBjKGUpKS5ieXRlTGVuZ3RoOnZvaWQgMCl9KSh0KTpyfTtyZXR1cm4gYXN5bmMgZT0+e2xldHt1cmw6aSxtZXRob2Q6cyxkYXRhOmEsc2lnbmFsOmMsY2FuY2VsVG9rZW46Zix0aW1lb3V0OnAsb25Eb3dubG9hZFByb2dyZXNzOmcsb25VcGxvYWRQcm9ncmVzczp5LHJlc3BvbnNlVHlwZTp2LGhlYWRlcnM6bSx3aXRoQ3JlZGVudGlhbHM6dz0ic2FtZS1vcmlnaW4iLGZldGNoT3B0aW9uczpifT14bihlKSxfPXR8fGZldGNoO3Y9dj8odisiIikudG9Mb3dlckNhc2UoKToidGV4dCI7bGV0IFM9Qm4oW2MsZiYmZi50b0Fib3J0U2lnbmFsKCldLHApLEU9bnVsbDtjb25zdCBSPVMmJlMudW5zdWJzY3JpYmUmJigoKT0+e1MudW5zdWJzY3JpYmUoKX0pO2xldCBUO3RyeXtpZih5JiZ1JiYiZ2V0IiE9PXMmJiJoZWFkIiE9PXMmJjAhPT0oVD1hd2FpdCBoKG0sYSkpKXtsZXQgZSx0PW5ldyBuKGkse21ldGhvZDoiUE9TVCIsYm9keTphLGR1cGxleDoiaGFsZiJ9KTtpZih6ZS5pc0Zvcm1EYXRhKGEpJiYoZT10LmhlYWRlcnMuZ2V0KCJjb250ZW50LXR5cGUiKSkmJm0uc2V0Q29udGVudFR5cGUoZSksdC5ib2R5KXtjb25zdFtlLG5dPUluKFQsUG4oVW4oeSkpKTthPUpuKHQuYm9keSw2NTUzNixlLG4pfX16ZS5pc1N0cmluZyh3KXx8KHc9dz8iaW5jbHVkZSI6Im9taXQiKTtjb25zdCB0PW8mJiJjcmVkZW50aWFscyJpbiBuLnByb3RvdHlwZSxjPXsuLi5iLHNpZ25hbDpTLG1ldGhvZDpzLnRvVXBwZXJDYXNlKCksaGVhZGVyczptLm5vcm1hbGl6ZSgpLnRvSlNPTigpLGJvZHk6YSxkdXBsZXg6ImhhbGYiLGNyZWRlbnRpYWxzOnQ/dzp2b2lkIDB9O0U9byYmbmV3IG4oaSxjKTtsZXQgZj1hd2FpdChvP18oRSxiKTpfKGksYykpO2NvbnN0IHA9bCYmKCJzdHJlYW0iPT09dnx8InJlc3BvbnNlIj09PXYpO2lmKGwmJihnfHxwJiZSKSl7Y29uc3QgZT17fTtbInN0YXR1cyIsInN0YXR1c1RleHQiLCJoZWFkZXJzIl0uZm9yRWFjaCgodD0+e2VbdF09Zlt0XX0pKTtjb25zdCB0PXplLnRvRmluaXRlTnVtYmVyKGYuaGVhZGVycy5nZXQoImNvbnRlbnQtbGVuZ3RoIikpLFtuLGldPWcmJkluKHQsUG4oVW4oZyksITApKXx8W107Zj1uZXcgcihKbihmLmJvZHksNjU1MzYsbiwoKCk9PntpJiZpKCksUiYmUigpfSkpLGUpfXY9dnx8InRleHQiO2xldCBrPWF3YWl0IGRbemUuZmluZEtleShkLHYpfHwidGV4dCJdKGYsZSk7cmV0dXJuIXAmJlImJlIoKSxhd2FpdCBuZXcgUHJvbWlzZSgoKHQsbik9PntDbih0LG4se2RhdGE6ayxoZWFkZXJzOlJuLmZyb20oZi5oZWFkZXJzKSxzdGF0dXM6Zi5zdGF0dXMsc3RhdHVzVGV4dDpmLnN0YXR1c1RleHQsY29uZmlnOmUscmVxdWVzdDpFfSl9KSl9Y2F0Y2godCl7aWYoUiYmUigpLHQmJiJUeXBlRXJyb3IiPT09dC5uYW1lJiYvTG9hZCBmYWlsZWR8ZmV0Y2gvaS50ZXN0KHQubWVzc2FnZSkpdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgWXQoIk5ldHdvcmsgRXJyb3IiLFl0LkVSUl9ORVRXT1JLLGUsRSx0JiZ0LnJlc3BvbnNlKSx7Y2F1c2U6dC5jYXVzZXx8dH0pO3Rocm93IFl0LmZyb20odCx0JiZ0LmNvZGUsZSxFLHQmJnQucmVzcG9uc2UpfX19LCRuPW5ldyBNYXAsWm49ZT0+e2xldCB0PWUmJmUuZW52fHx7fTtjb25zdHtmZXRjaDpuLFJlcXVlc3Q6cixSZXNwb25zZTppfT10LG89W3IsaSxuXTtsZXQgcyxhLGM9by5sZW5ndGgsdT0kbjtmb3IoO2MtLTspcz1vW2NdLGE9dS5nZXQocyksdm9pZCAwPT09YSYmdS5zZXQocyxhPWM/bmV3IE1hcDpYbih0KSksdT1hO3JldHVybiBhfTtabigpO2NvbnN0IFFuPXtodHRwOm51bGwseGhyOnFuLGZldGNoOntnZXQ6Wm59fTt6ZS5mb3JFYWNoKFFuLCgoZSx0KT0+e2lmKGUpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwibmFtZSIse3ZhbHVlOnR9KX1jYXRjaChlKXt9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImFkYXB0ZXJOYW1lIix7dmFsdWU6dH0pfX0pKTtjb25zdCBlcj1lPT4iLSAiLmNvbmNhdChlKSx0cj1lPT56ZS5pc0Z1bmN0aW9uKGUpfHxudWxsPT09ZXx8ITE9PT1lO3ZhciBucj17Z2V0QWRhcHRlcjpmdW5jdGlvbihlLHQpe2U9emUuaXNBcnJheShlKT9lOltlXTtjb25zdHtsZW5ndGg6bn09ZTtsZXQgcixpO2NvbnN0IG89e307Zm9yKGxldCBzPTA7czxuO3MrKyl7bGV0IG47aWYocj1lW3NdLGk9ciwhdHIocikmJihpPVFuWyhuPVN0cmluZyhyKSkudG9Mb3dlckNhc2UoKV0sdm9pZCAwPT09aSkpdGhyb3cgbmV3IFl0KCJVbmtub3duIGFkYXB0ZXIgJyIuY29uY2F0KG4sIiciKSk7aWYoaSYmKHplLmlzRnVuY3Rpb24oaSl8fChpPWkuZ2V0KHQpKSkpYnJlYWs7b1tufHwiIyIrc109aX1pZighaSl7Y29uc3QgZT1PYmplY3QuZW50cmllcyhvKS5tYXAoKGU9PntsZXRbdCxuXT1lO3JldHVybiJhZGFwdGVyICIuY29uY2F0KHQsIiAiKSsoITE9PT1uPyJpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCI6ImlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkIil9KSk7bGV0IHQ9bj9lLmxlbmd0aD4xPyJzaW5jZSA6XG4iK2UubWFwKGVyKS5qb2luKCJcbiIpOiIgIitlcihlWzBdKToiYXMgbm8gYWRhcHRlciBzcGVjaWZpZWQiO3Rocm93IG5ldyBZdCgiVGhlcmUgaXMgbm8gc3VpdGFibGUgYWRhcHRlciB0byBkaXNwYXRjaCB0aGUgcmVxdWVzdCAiK3QsIkVSUl9OT1RfU1VQUE9SVCIpfXJldHVybiBpfSxhZGFwdGVyczpRbn07ZnVuY3Rpb24gcnIoZSl7aWYoZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksZS5zaWduYWwmJmUuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IEFuKG51bGwsZSl9ZnVuY3Rpb24gaXIoZSl7cnIoZSksZS5oZWFkZXJzPVJuLmZyb20oZS5oZWFkZXJzKSxlLmRhdGE9VG4uY2FsbChlLGUudHJhbnNmb3JtUmVxdWVzdCksLTEhPT1bInBvc3QiLCJwdXQiLCJwYXRjaCJdLmluZGV4T2YoZS5tZXRob2QpJiZlLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsITEpO3JldHVybiBuci5nZXRBZGFwdGVyKGUuYWRhcHRlcnx8dm4uYWRhcHRlcixlKShlKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gcnIoZSksdC5kYXRhPVRuLmNhbGwoZSxlLnRyYW5zZm9ybVJlc3BvbnNlLHQpLHQuaGVhZGVycz1Sbi5mcm9tKHQuaGVhZGVycyksdH0pLChmdW5jdGlvbih0KXtyZXR1cm4ga24odCl8fChycihlKSx0JiZ0LnJlc3BvbnNlJiYodC5yZXNwb25zZS5kYXRhPVRuLmNhbGwoZSxlLnRyYW5zZm9ybVJlc3BvbnNlLHQucmVzcG9uc2UpLHQucmVzcG9uc2UuaGVhZGVycz1Sbi5mcm9tKHQucmVzcG9uc2UuaGVhZGVycykpKSxQcm9taXNlLnJlamVjdCh0KX0pKX1jb25zdCBvcj0iMS4xMy42Iixzcj17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goKChlLHQpPT57c3JbZV09ZnVuY3Rpb24obil7cmV0dXJuIHR5cGVvZiBuPT09ZXx8ImEiKyh0PDE/Im4gIjoiICIpK2V9fSkpO2NvbnN0IGFyPXt9O3NyLnRyYW5zaXRpb25hbD1mdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlLHQpe3JldHVybiJbQXhpb3MgdjEuMTMuNl0gVHJhbnNpdGlvbmFsIG9wdGlvbiAnIitlKyInIit0KyhuPyIuICIrbjoiIil9cmV0dXJuKG4saSxvKT0+e2lmKCExPT09ZSl0aHJvdyBuZXcgWXQocihpLCIgaGFzIGJlZW4gcmVtb3ZlZCIrKHQ/IiBpbiAiK3Q6IiIpKSxZdC5FUlJfREVQUkVDQVRFRCk7cmV0dXJuIHQmJiFhcltpXSYmKGFyW2ldPSEwLGNvbnNvbGUud2FybihyKGksIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksIWV8fGUobixpLG8pfX0sc3Iuc3BlbGxpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuKHQsbik9Pihjb25zb2xlLndhcm4oIiIuY29uY2F0KG4sIiBpcyBsaWtlbHkgYSBtaXNzcGVsbGluZyBvZiAiKS5jb25jYXQoZSkpLCEwKX07dmFyIGNyPXthc3NlcnRPcHRpb25zOmZ1bmN0aW9uKGUsdCxuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFl0KCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0IixZdC5FUlJfQkFEX09QVElPTl9WQUxVRSk7Y29uc3Qgcj1PYmplY3Qua2V5cyhlKTtsZXQgaT1yLmxlbmd0aDtmb3IoO2ktLSA+MDspe2NvbnN0IG89cltpXSxzPXRbb107aWYocyl7Y29uc3QgdD1lW29dLG49dm9pZCAwPT09dHx8cyh0LG8sZSk7aWYoITAhPT1uKXRocm93IG5ldyBZdCgib3B0aW9uICIrbysiIG11c3QgYmUgIituLFl0LkVSUl9CQURfT1BUSU9OX1ZBTFVFKX1lbHNlIGlmKCEwIT09bil0aHJvdyBuZXcgWXQoIlVua25vd24gb3B0aW9uICIrbyxZdC5FUlJfQkFEX09QVElPTil9fSx2YWxpZGF0b3JzOnNyfTtjb25zdCB1cj1jci52YWxpZGF0b3JzO2NsYXNzIGxye2NvbnN0cnVjdG9yKGUpe3RoaXMuZGVmYXVsdHM9ZXx8e30sdGhpcy5pbnRlcmNlcHRvcnM9e3JlcXVlc3Q6bmV3IHNuLHJlc3BvbnNlOm5ldyBzbn19YXN5bmMgcmVxdWVzdChlLHQpe3RyeXtyZXR1cm4gYXdhaXQgdGhpcy5fcmVxdWVzdChlLHQpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBFcnJvcil7bGV0IHQ9e307RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodCk6dD1uZXcgRXJyb3I7Y29uc3Qgbj10LnN0YWNrP3Quc3RhY2sucmVwbGFjZSgvXi4rXG4vLCIiKToiIjt0cnl7ZS5zdGFjaz9uJiYhU3RyaW5nKGUuc3RhY2spLmVuZHNXaXRoKG4ucmVwbGFjZSgvXi4rXG4uK1xuLywiIikpJiYoZS5zdGFjays9IlxuIituKTplLnN0YWNrPW59Y2F0Y2goZSl7fX10aHJvdyBlfX1fcmVxdWVzdChlLHQpeyJzdHJpbmciPT10eXBlb2YgZT8odD10fHx7fSkudXJsPWU6dD1lfHx7fSx0PWpuKHRoaXMuZGVmYXVsdHMsdCk7Y29uc3R7dHJhbnNpdGlvbmFsOm4scGFyYW1zU2VyaWFsaXplcjpyLGhlYWRlcnM6aX09dDt2b2lkIDAhPT1uJiZjci5hc3NlcnRPcHRpb25zKG4se3NpbGVudEpTT05QYXJzaW5nOnVyLnRyYW5zaXRpb25hbCh1ci5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzp1ci50cmFuc2l0aW9uYWwodXIuYm9vbGVhbiksY2xhcmlmeVRpbWVvdXRFcnJvcjp1ci50cmFuc2l0aW9uYWwodXIuYm9vbGVhbiksbGVnYWN5SW50ZXJjZXB0b3JSZXFSZXNPcmRlcmluZzp1ci50cmFuc2l0aW9uYWwodXIuYm9vbGVhbil9LCExKSxudWxsIT1yJiYoemUuaXNGdW5jdGlvbihyKT90LnBhcmFtc1NlcmlhbGl6ZXI9e3NlcmlhbGl6ZTpyfTpjci5hc3NlcnRPcHRpb25zKHIse2VuY29kZTp1ci5mdW5jdGlvbixzZXJpYWxpemU6dXIuZnVuY3Rpb259LCEwKSksdm9pZCAwIT09dC5hbGxvd0Fic29sdXRlVXJsc3x8KHZvaWQgMCE9PXRoaXMuZGVmYXVsdHMuYWxsb3dBYnNvbHV0ZVVybHM/dC5hbGxvd0Fic29sdXRlVXJscz10aGlzLmRlZmF1bHRzLmFsbG93QWJzb2x1dGVVcmxzOnQuYWxsb3dBYnNvbHV0ZVVybHM9ITApLGNyLmFzc2VydE9wdGlvbnModCx7YmFzZVVybDp1ci5zcGVsbGluZygiYmFzZVVSTCIpLHdpdGhYc3JmVG9rZW46dXIuc3BlbGxpbmcoIndpdGhYU1JGVG9rZW4iKX0sITApLHQubWV0aG9kPSh0Lm1ldGhvZHx8dGhpcy5kZWZhdWx0cy5tZXRob2R8fCJnZXQiKS50b0xvd2VyQ2FzZSgpO2xldCBvPWkmJnplLm1lcmdlKGkuY29tbW9uLGlbdC5tZXRob2RdKTtpJiZ6ZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLChlPT57ZGVsZXRlIGlbZV19KSksdC5oZWFkZXJzPVJuLmNvbmNhdChvLGkpO2NvbnN0IHM9W107bGV0IGE9ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKChmdW5jdGlvbihlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZS5ydW5XaGVuJiYhMT09PWUucnVuV2hlbih0KSlyZXR1cm47YT1hJiZlLnN5bmNocm9ub3VzO2NvbnN0IG49dC50cmFuc2l0aW9uYWx8fGFuO24mJm4ubGVnYWN5SW50ZXJjZXB0b3JSZXFSZXNPcmRlcmluZz9zLnVuc2hpZnQoZS5mdWxmaWxsZWQsZS5yZWplY3RlZCk6cy5wdXNoKGUuZnVsZmlsbGVkLGUucmVqZWN0ZWQpfSkpO2NvbnN0IGM9W107bGV0IHU7dGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7Yy5wdXNoKGUuZnVsZmlsbGVkLGUucmVqZWN0ZWQpfSkpO2xldCBsLGQ9MDtpZighYSl7Y29uc3QgZT1baXIuYmluZCh0aGlzKSx2b2lkIDBdO2ZvcihlLnVuc2hpZnQoLi4ucyksZS5wdXNoKC4uLmMpLGw9ZS5sZW5ndGgsdT1Qcm9taXNlLnJlc29sdmUodCk7ZDxsOyl1PXUudGhlbihlW2QrK10sZVtkKytdKTtyZXR1cm4gdX1sPXMubGVuZ3RoO2xldCBoPXQ7Zm9yKDtkPGw7KXtjb25zdCBlPXNbZCsrXSx0PXNbZCsrXTt0cnl7aD1lKGgpfWNhdGNoKGUpe3QuY2FsbCh0aGlzLGUpO2JyZWFrfX10cnl7dT1pci5jYWxsKHRoaXMsaCl9Y2F0Y2goZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfWZvcihkPTAsbD1jLmxlbmd0aDtkPGw7KXU9dS50aGVuKGNbZCsrXSxjW2QrK10pO3JldHVybiB1fWdldFVyaShlKXtyZXR1cm4gb24oTW4oKGU9am4odGhpcy5kZWZhdWx0cyxlKSkuYmFzZVVSTCxlLnVybCxlLmFsbG93QWJzb2x1dGVVcmxzKSxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpfX16ZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSwoZnVuY3Rpb24oZSl7bHIucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMucmVxdWVzdChqbihufHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YToobnx8e30pLmRhdGF9KSl9fSkpLHplLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSwoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gZnVuY3Rpb24obixyLGkpe3JldHVybiB0aGlzLnJlcXVlc3Qoam4oaXx8e30se21ldGhvZDplLGhlYWRlcnM6dD97IkNvbnRlbnQtVHlwZSI6Im11bHRpcGFydC9mb3JtLWRhdGEifTp7fSx1cmw6bixkYXRhOnJ9KSl9fWxyLnByb3RvdHlwZVtlXT10KCksbHIucHJvdG90eXBlW2UrIkZvcm0iXT10KCEwKX0pKTt2YXIgZHI9bHI7Y2xhc3MgaHJ7Y29uc3RydWN0b3IoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO2xldCB0O3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7dD1lfSkpO2NvbnN0IG49dGhpczt0aGlzLnByb21pc2UudGhlbigoZT0+e2lmKCFuLl9saXN0ZW5lcnMpcmV0dXJuO2xldCB0PW4uX2xpc3RlbmVycy5sZW5ndGg7Zm9yKDt0LS0gPjA7KW4uX2xpc3RlbmVyc1t0XShlKTtuLl9saXN0ZW5lcnM9bnVsbH0pKSx0aGlzLnByb21pc2UudGhlbj1lPT57bGV0IHQ7Y29uc3Qgcj1uZXcgUHJvbWlzZSgoZT0+e24uc3Vic2NyaWJlKGUpLHQ9ZX0pKS50aGVuKGUpO3JldHVybiByLmNhbmNlbD1mdW5jdGlvbigpe24udW5zdWJzY3JpYmUodCl9LHJ9LGUoKGZ1bmN0aW9uKGUscixpKXtuLnJlYXNvbnx8KG4ucmVhc29uPW5ldyBBbihlLHIsaSksdChuLnJlYXNvbikpfSkpfXRocm93SWZSZXF1ZXN0ZWQoKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn1zdWJzY3JpYmUoZSl7dGhpcy5yZWFzb24/ZSh0aGlzLnJlYXNvbik6dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19dW5zdWJzY3JpYmUoZSl7aWYoIXRoaXMuX2xpc3RlbmVycylyZXR1cm47Y29uc3QgdD10aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihlKTstMSE9PXQmJnRoaXMuX2xpc3RlbmVycy5zcGxpY2UodCwxKX10b0Fib3J0U2lnbmFsKCl7Y29uc3QgZT1uZXcgQWJvcnRDb250cm9sbGVyLHQ9dD0+e2UuYWJvcnQodCl9O3JldHVybiB0aGlzLnN1YnNjcmliZSh0KSxlLnNpZ25hbC51bnN1YnNjcmliZT0oKT0+dGhpcy51bnN1YnNjcmliZSh0KSxlLnNpZ25hbH1zdGF0aWMgc291cmNlKCl7bGV0IGU7Y29uc3QgdD1uZXcgaHIoKGZ1bmN0aW9uKHQpe2U9dH0pKTtyZXR1cm57dG9rZW46dCxjYW5jZWw6ZX19fXZhciBmcj1ocjtjb25zdCBwcj17Q29udGludWU6MTAwLFN3aXRjaGluZ1Byb3RvY29sczoxMDEsUHJvY2Vzc2luZzoxMDIsRWFybHlIaW50czoxMDMsT2s6MjAwLENyZWF0ZWQ6MjAxLEFjY2VwdGVkOjIwMixOb25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb246MjAzLE5vQ29udGVudDoyMDQsUmVzZXRDb250ZW50OjIwNSxQYXJ0aWFsQ29udGVudDoyMDYsTXVsdGlTdGF0dXM6MjA3LEFscmVhZHlSZXBvcnRlZDoyMDgsSW1Vc2VkOjIyNixNdWx0aXBsZUNob2ljZXM6MzAwLE1vdmVkUGVybWFuZW50bHk6MzAxLEZvdW5kOjMwMixTZWVPdGhlcjozMDMsTm90TW9kaWZpZWQ6MzA0LFVzZVByb3h5OjMwNSxVbnVzZWQ6MzA2LFRlbXBvcmFyeVJlZGlyZWN0OjMwNyxQZXJtYW5lbnRSZWRpcmVjdDozMDgsQmFkUmVxdWVzdDo0MDAsVW5hdXRob3JpemVkOjQwMSxQYXltZW50UmVxdWlyZWQ6NDAyLEZvcmJpZGRlbjo0MDMsTm90Rm91bmQ6NDA0LE1ldGhvZE5vdEFsbG93ZWQ6NDA1LE5vdEFjY2VwdGFibGU6NDA2LFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDo0MDcsUmVxdWVzdFRpbWVvdXQ6NDA4LENvbmZsaWN0OjQwOSxHb25lOjQxMCxMZW5ndGhSZXF1aXJlZDo0MTEsUHJlY29uZGl0aW9uRmFpbGVkOjQxMixQYXlsb2FkVG9vTGFyZ2U6NDEzLFVyaVRvb0xvbmc6NDE0LFVuc3VwcG9ydGVkTWVkaWFUeXBlOjQxNSxSYW5nZU5vdFNhdGlzZmlhYmxlOjQxNixFeHBlY3RhdGlvbkZhaWxlZDo0MTcsSW1BVGVhcG90OjQxOCxNaXNkaXJlY3RlZFJlcXVlc3Q6NDIxLFVucHJvY2Vzc2FibGVFbnRpdHk6NDIyLExvY2tlZDo0MjMsRmFpbGVkRGVwZW5kZW5jeTo0MjQsVG9vRWFybHk6NDI1LFVwZ3JhZGVSZXF1aXJlZDo0MjYsUHJlY29uZGl0aW9uUmVxdWlyZWQ6NDI4LFRvb01hbnlSZXF1ZXN0czo0MjksUmVxdWVzdEhlYWRlckZpZWxkc1Rvb0xhcmdlOjQzMSxVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29uczo0NTEsSW50ZXJuYWxTZXJ2ZXJFcnJvcjo1MDAsTm90SW1wbGVtZW50ZWQ6NTAxLEJhZEdhdGV3YXk6NTAyLFNlcnZpY2VVbmF2YWlsYWJsZTo1MDMsR2F0ZXdheVRpbWVvdXQ6NTA0LEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOjUwNSxWYXJpYW50QWxzb05lZ290aWF0ZXM6NTA2LEluc3VmZmljaWVudFN0b3JhZ2U6NTA3LExvb3BEZXRlY3RlZDo1MDgsTm90RXh0ZW5kZWQ6NTEwLE5ldHdvcmtBdXRoZW50aWNhdGlvblJlcXVpcmVkOjUxMSxXZWJTZXJ2ZXJJc0Rvd246NTIxLENvbm5lY3Rpb25UaW1lZE91dDo1MjIsT3JpZ2luSXNVbnJlYWNoYWJsZTo1MjMsVGltZW91dE9jY3VycmVkOjUyNCxTc2xIYW5kc2hha2VGYWlsZWQ6NTI1LEludmFsaWRTc2xDZXJ0aWZpY2F0ZTo1MjZ9O09iamVjdC5lbnRyaWVzKHByKS5mb3JFYWNoKChlPT57bGV0W3Qsbl09ZTtwcltuXT10fSkpO3ZhciBncj1wcjtjb25zdCB5cj1mdW5jdGlvbiBlKHQpe2NvbnN0IG49bmV3IGRyKHQpLHI9ZWUoZHIucHJvdG90eXBlLnJlcXVlc3Qsbik7cmV0dXJuIHplLmV4dGVuZChyLGRyLnByb3RvdHlwZSxuLHthbGxPd25LZXlzOiEwfSksemUuZXh0ZW5kKHIsbixudWxsLHthbGxPd25LZXlzOiEwfSksci5jcmVhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGUoam4odCxuKSl9LHJ9KHZuKTt5ci5BeGlvcz1kcix5ci5DYW5jZWxlZEVycm9yPUFuLHlyLkNhbmNlbFRva2VuPWZyLHlyLmlzQ2FuY2VsPWtuLHlyLlZFUlNJT049b3IseXIudG9Gb3JtRGF0YT1RdCx5ci5BeGlvc0Vycm9yPVl0LHlyLkNhbmNlbD15ci5DYW5jZWxlZEVycm9yLHlyLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9LHlyLnNwcmVhZD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuYXBwbHkobnVsbCx0KX19LHlyLmlzQXhpb3NFcnJvcj1mdW5jdGlvbihlKXtyZXR1cm4gemUuaXNPYmplY3QoZSkmJiEwPT09ZS5pc0F4aW9zRXJyb3J9LHlyLm1lcmdlQ29uZmlnPWpuLHlyLkF4aW9zSGVhZGVycz1Sbix5ci5mb3JtVG9KU09OPWU9PmduKHplLmlzSFRNTEZvcm0oZSk/bmV3IEZvcm1EYXRhKGUpOmUpLHlyLmdldEFkYXB0ZXI9bnIuZ2V0QWRhcHRlcix5ci5IdHRwU3RhdHVzQ29kZT1ncix5ci5kZWZhdWx0PXlyO3ZhciB2cixtcj15cjtsZXQgd3I9dnI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmF0dGFjaFRva2VuPSgpPT5Qcm9taXNlLnJlc29sdmUoKSx0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrPSgpPT5udWxsLHRoaXMuaW5pdD10aGlzLmluaXQuYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjay5iaW5kKHRoaXMpfXN0YXRpYyBnZXRJbnN0YW5jZSgpe3JldHVybiB0aGlzLmF4aW9zSW5zdGFuY2V8fCh0aGlzLmF4aW9zSW5zdGFuY2U9bXIuY3JlYXRlKHt3aXRoQ3JlZGVudGlhbHM6ITB9KSx0aGlzLmNsaWVudEluc3RhbmNlfHwodGhpcy5jbGllbnRJbnN0YW5jZT1uZXcgdnIpLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoKHQ9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5jbGllbnRJbnN0YW5jZS5yZXF1ZXN0SGFuZGxlcih0KX0pKSkpLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKChlPT50aGlzLmNsaWVudEluc3RhbmNlLnN1Y2Nlc3NIYW5kbGVyKGUpKSwoZT0+dGhpcy5jbGllbnRJbnN0YW5jZS5lcnJvckhhbmRsZXIoZSkpKSx0aGlzLmF4aW9zSW5zdGFuY2UuYWxsPW1yLmFsbCx0aGlzLmF4aW9zSW5zdGFuY2Uuc3ByZWFkPW1yLnNwcmVhZCx0aGlzLmF4aW9zSW5zdGFuY2UuaW5pdD10aGlzLmNsaWVudEluc3RhbmNlLmluaXQsdGhpcy5heGlvc0luc3RhbmNlLmVuYWJsZUhhbmRsZXI9dGhpcy5jbGllbnRJbnN0YW5jZS5lbmFibGVIYW5kbGVyLHRoaXMuYXhpb3NJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcj10aGlzLmNsaWVudEluc3RhbmNlLmRpc2FibGVIYW5kbGVyLHRoaXMuYXhpb3NJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcldpdGhUaW1lb3V0PXRoaXMuY2xpZW50SW5zdGFuY2UuZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dCx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2ssdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKSx0aGlzLmF4aW9zSW5zdGFuY2V9cmVxdWVzdEhhbmRsZXIodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZih5aWVsZCB0aGlzLmF0dGFjaFRva2VuKHQpLG51bGw9PXQ/dm9pZCAwOnQuc2hvdWxkRW5jb2RlVG9Gb3JtRGF0YSl7Y29uc3QgZT1udWxsPT10P3ZvaWQgMDp0LmRhdGEsbj1uZXcgRm9ybURhdGE7T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e24uYXBwZW5kKHQsZVt0XSl9KSksdC5kYXRhPW59cmV0dXJuIHQuc3RhcnRUaW1lSW5Ncz0obmV3IERhdGUpLmdldFRpbWUoKSx2ci5pc0hhbmRsZXJFbmFibGVkJiZ0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayh0KSx0fSkpfWVycm9ySGFuZGxlcihlKXt0aHJvdyB2ci5pc0hhbmRsZXJFbmFibGVkJiYodGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2smJnRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2soZSksdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2soKSksZX1zdWNjZXNzSGFuZGxlcihlKXt2YXIgdCxuO3JldHVybiJzdHJlYW0iPT09KG51bGw9PT0obj1udWxsPT09KHQ9ZSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuY29uZmlnKXx8dm9pZCAwPT09bj92b2lkIDA6bi5yZXNwb25zZVR5cGUpfHx2ci5pc0hhbmRsZXJFbmFibGVkJiYodGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrJiZ0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2soZSksdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2soKSksZX1pbml0KCl7bGV0IHQ9IShhcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSl8fGFyZ3VtZW50c1swXSxuPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dnIuaXNIYW5kbGVyRW5hYmxlZD10LHRoaXMuYXR0YWNoVG9rZW49bn0pKX1lbmFibGVIYW5kbGVyKCl7dnIuaXNIYW5kbGVyRW5hYmxlZD0hMH1kaXNhYmxlSGFuZGxlcigpe3ZyLmlzSGFuZGxlckVuYWJsZWQ9ITF9ZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dCgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp2ci5ERUZBVUxUX0hBTkRMRVJfRElTQUJMRV9USU1FT1VUO3ZyLmlzSGFuZGxlckVuYWJsZWQ9ITEsc2V0VGltZW91dCgoKCk9Pnt2ci5pc0hhbmRsZXJFbmFibGVkPSEwfSksZSl9c2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKGUpe3RoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKXt0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjaz1lfXNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2s9ZX19O3dyLkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQ9MWUzLHdyPXZyPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89YXJndW1lbnRzLmxlbmd0aCxzPW88Mz90Om51bGw9PT1yP3I9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pOnI7aWYoIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlzPVJlZmxlY3QuZGVjb3JhdGUoZSx0LG4scik7ZWxzZSBmb3IodmFyIGE9ZS5sZW5ndGgtMTthPj0wO2EtLSkoaT1lW2FdKSYmKHM9KG88Mz9pKHMpOm8+Mz9pKHQsbixzKTppKHQsbikpfHxzKTtyZXR1cm4gbz4zJiZzJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHMpLHN9KFtlPT57fV0sd3IpO2NsYXNzIGJye2NvbnN0cnVjdG9yKCl7dGhpcy5fZGF0YT1uZXcgTWFwfXNldERhdGEodCxuKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2RhdGEuc2V0KHQsbil9KSl9Z2V0RGF0YSh0KXt2YXIgbixyO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG51bGwhPT0ocj1udWxsPT09KG49dGhpcy5fZGF0YSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZ2V0KHQpKSYmdm9pZCAwIT09cj9yOiJ7fSJ9KSl9cmVtb3ZlRGF0YSh0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2RhdGEuZGVsZXRlKHQpfSkpfX12YXIgX3I9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiBTcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwiZGVmYXVsdCIpP2UuZGVmYXVsdDplfWZ1bmN0aW9uIEVyKGUpe2lmKGUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgdD1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsbik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbixyLmdldD9yOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlW25dfX0pfSkpLHR9dmFyIFJyPXtleHBvcnRzOnt9fSxUcj17fSxrcj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoa3IsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGtyLmRlZmF1bHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGgsbj10JTQ7aWYoIW4pcmV0dXJuIGU7dmFyIHI9dCxpPTQtbixvPXQraSxzPWF0LmFsbG9jKG8pO2ZvcihzLndyaXRlKGUpO2ktLTspcy53cml0ZSgiPSIscisrKTtyZXR1cm4gcy50b1N0cmluZygpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoVHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBBcj1rcjtmdW5jdGlvbiBDcihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0idXRmOCIpLGF0LmlzQnVmZmVyKGUpP0RyKGUudG9TdHJpbmcoImJhc2U2NCIpKTpEcihhdC5mcm9tKGUsdCkudG9TdHJpbmcoImJhc2U2NCIpKX1mdW5jdGlvbiBPcihlKXtyZXR1cm4gZT1lLnRvU3RyaW5nKCksQXIuZGVmYXVsdChlKS5yZXBsYWNlKC9cLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIil9ZnVuY3Rpb24gRHIoZSl7cmV0dXJuIGUucmVwbGFjZSgvPS9nLCIiKS5yZXBsYWNlKC9cKy9nLCItIikucmVwbGFjZSgvXC8vZywiXyIpfXZhciBQcixJcj1DcjtJci5lbmNvZGU9Q3IsSXIuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSJ1dGY4IiksYXQuZnJvbShPcihlKSwiYmFzZTY0IikudG9TdHJpbmcodCl9LElyLnRvQmFzZTY0PU9yLElyLmZyb21CYXNlNjQ9RHIsSXIudG9CdWZmZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGF0LmZyb20oT3IoZSksImJhc2U2NCIpfSxUci5kZWZhdWx0PUlyLChQcj1ScikuZXhwb3J0cz1Uci5kZWZhdWx0LFByLmV4cG9ydHMuZGVmYXVsdD1Qci5leHBvcnRzO3ZhciBVcj1Sci5leHBvcnRzLExyPXtleHBvcnRzOnt9fTshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQsbil7dmFyIHI9e307IWZ1bmN0aW9uKGUpe2UuX19lc01vZHVsZT0hMCxlLmRpZ2VzdExlbmd0aD0zMixlLmJsb2NrU2l6ZT02NDt2YXIgdD1uZXcgVWludDMyQXJyYXkoWzExMTYzNTI0MDgsMTg5OTQ0NzQ0MSwzMDQ5MzIzNDcxLDM5MjEwMDk1NzMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsMjQ1MzYzNTc0OCwyODcwNzYzMjIxLDM2MjQzODEwODAsMzEwNTk4NDAxLDYwNzIyNTI3OCwxNDI2ODgxOTg3LDE5MjUwNzgzODgsMjE2MjA3ODIwNiwyNjE0ODg4MTAzLDMyNDgyMjI1ODAsMzgzNTM5MDQwMSw0MDIyMjI0Nzc0LDI2NDM0NzA3OCw2MDQ4MDc2MjgsNzcwMjU1OTgzLDEyNDkxNTAxMjIsMTU1NTA4MTY5MiwxOTk2MDY0OTg2LDI1NTQyMjA4ODIsMjgyMTgzNDM0OSwyOTUyOTk2ODA4LDMyMTAzMTM2NzEsMzMzNjU3MTg5MSwzNTg0NTI4NzExLDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLDIxNzcwMjYzNTAsMjQ1Njk1NjAzNywyNzMwNDg1OTIxLDI4MjAzMDI0MTEsMzI1OTczMDgwMCwzMzQ1NzY0NzcxLDM1MTYwNjU4MTcsMzYwMDM1MjgwNCw0MDk0NTcxOTA5LDI3NTQyMzM0NCw0MzAyMjc3MzQsNTA2OTQ4NjE2LDY1OTA2MDU1Niw4ODM5OTc4NzcsOTU4MTM5NTcxLDEzMjI4MjIyMTgsMTUzNzAwMjA2MywxNzQ3ODczNzc5LDE5NTU1NjIyMjIsMjAyNDEwNDgxNSwyMjI3NzMwNDUyLDIzNjE4NTI0MjQsMjQyODQzNjQ3NCwyNzU2NzM0MTg3LDMyMDQwMzE0NzksMzMyOTMyNTI5OF0pO2Z1bmN0aW9uIG4oZSxuLHIsaSxvKXtmb3IodmFyIHMsYSxjLHUsbCxkLGgsZixwLGcseSx2LG07bz49NjQ7KXtmb3Iocz1uWzBdLGE9blsxXSxjPW5bMl0sdT1uWzNdLGw9bls0XSxkPW5bNV0saD1uWzZdLGY9bls3XSxnPTA7ZzwxNjtnKyspeT1pKzQqZyxlW2ddPSgyNTUmclt5XSk8PDI0fCgyNTUmclt5KzFdKTw8MTZ8KDI1NSZyW3krMl0pPDw4fDI1NSZyW3krM107Zm9yKGc9MTY7Zzw2NDtnKyspdj0oKHA9ZVtnLTJdKT4+PjE3fHA8PDE1KV4ocD4+PjE5fHA8PDEzKV5wPj4+MTAsbT0oKHA9ZVtnLTE1XSk+Pj43fHA8PDI1KV4ocD4+PjE4fHA8PDE0KV5wPj4+MyxlW2ddPSh2K2VbZy03XXwwKSsobStlW2ctMTZdfDApO2ZvcihnPTA7Zzw2NDtnKyspdj0oKChsPj4+NnxsPDwyNileKGw+Pj4xMXxsPDwyMSleKGw+Pj4yNXxsPDw3KSkrKGwmZF5+bCZoKXwwKSsoZisodFtnXStlW2ddfDApfDApfDAsbT0oKHM+Pj4yfHM8PDMwKV4ocz4+PjEzfHM8PDE5KV4ocz4+PjIyfHM8PDEwKSkrKHMmYV5zJmNeYSZjKXwwLGY9aCxoPWQsZD1sLGw9dSt2fDAsdT1jLGM9YSxhPXMscz12K218MDtuWzBdKz1zLG5bMV0rPWEsblsyXSs9YyxuWzNdKz11LG5bNF0rPWwsbls1XSs9ZCxuWzZdKz1oLG5bN10rPWYsaSs9NjQsby09NjR9cmV0dXJuIGl9dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5kaWdlc3RMZW5ndGg9ZS5kaWdlc3RMZW5ndGgsdGhpcy5ibG9ja1NpemU9ZS5ibG9ja1NpemUsdGhpcy5zdGF0ZT1uZXcgSW50MzJBcnJheSg4KSx0aGlzLnRlbXA9bmV3IEludDMyQXJyYXkoNjQpLHRoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KDEyOCksdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmJ5dGVzSGFzaGVkPTAsdGhpcy5maW5pc2hlZD0hMSx0aGlzLnJlc2V0KCl9cmV0dXJuIHQucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGVbMF09MTc3OTAzMzcwMyx0aGlzLnN0YXRlWzFdPTMxNDQxMzQyNzcsdGhpcy5zdGF0ZVsyXT0xMDEzOTA0MjQyLHRoaXMuc3RhdGVbM109Mjc3MzQ4MDc2Mix0aGlzLnN0YXRlWzRdPTEzNTk4OTMxMTksdGhpcy5zdGF0ZVs1XT0yNjAwODIyOTI0LHRoaXMuc3RhdGVbNl09NTI4NzM0NjM1LHRoaXMuc3RhdGVbN109MTU0MTQ1OTIyNSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExLHRoaXN9LHQucHJvdG90eXBlLmNsZWFuPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmJ1ZmZlci5sZW5ndGg7ZSsrKXRoaXMuYnVmZmVyW2VdPTA7Zm9yKGU9MDtlPHRoaXMudGVtcC5sZW5ndGg7ZSsrKXRoaXMudGVtcFtlXT0wO3RoaXMucmVzZXQoKX0sdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUsdCl7aWYodm9pZCAwPT09dCYmKHQ9ZS5sZW5ndGgpLHRoaXMuZmluaXNoZWQpdGhyb3cgbmV3IEVycm9yKCJTSEEyNTY6IGNhbid0IHVwZGF0ZSBiZWNhdXNlIGhhc2ggd2FzIGZpbmlzaGVkLiIpO3ZhciByPTA7aWYodGhpcy5ieXRlc0hhc2hlZCs9dCx0aGlzLmJ1ZmZlckxlbmd0aD4wKXtmb3IoO3RoaXMuYnVmZmVyTGVuZ3RoPDY0JiZ0PjA7KXRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdPWVbcisrXSx0LS07NjQ9PT10aGlzLmJ1ZmZlckxlbmd0aCYmKG4odGhpcy50ZW1wLHRoaXMuc3RhdGUsdGhpcy5idWZmZXIsMCw2NCksdGhpcy5idWZmZXJMZW5ndGg9MCl9Zm9yKHQ+PTY0JiYocj1uKHRoaXMudGVtcCx0aGlzLnN0YXRlLGUscix0KSx0JT02NCk7dD4wOyl0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlckxlbmd0aCsrXT1lW3IrK10sdC0tO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuZmluaXNoZWQpe3ZhciB0PXRoaXMuYnl0ZXNIYXNoZWQscj10aGlzLmJ1ZmZlckxlbmd0aCxpPXQvNTM2ODcwOTEyfDAsbz10PDwzLHM9dCU2NDw1Nj82NDoxMjg7dGhpcy5idWZmZXJbcl09MTI4O2Zvcih2YXIgYT1yKzE7YTxzLTg7YSsrKXRoaXMuYnVmZmVyW2FdPTA7dGhpcy5idWZmZXJbcy04XT1pPj4+MjQmMjU1LHRoaXMuYnVmZmVyW3MtN109aT4+PjE2JjI1NSx0aGlzLmJ1ZmZlcltzLTZdPWk+Pj44JjI1NSx0aGlzLmJ1ZmZlcltzLTVdPWk+Pj4wJjI1NSx0aGlzLmJ1ZmZlcltzLTRdPW8+Pj4yNCYyNTUsdGhpcy5idWZmZXJbcy0zXT1vPj4+MTYmMjU1LHRoaXMuYnVmZmVyW3MtMl09bz4+PjgmMjU1LHRoaXMuYnVmZmVyW3MtMV09bz4+PjAmMjU1LG4odGhpcy50ZW1wLHRoaXMuc3RhdGUsdGhpcy5idWZmZXIsMCxzKSx0aGlzLmZpbmlzaGVkPSEwfWZvcihhPTA7YTw4O2ErKyllWzQqYSswXT10aGlzLnN0YXRlW2FdPj4+MjQmMjU1LGVbNCphKzFdPXRoaXMuc3RhdGVbYV0+Pj4xNiYyNTUsZVs0KmErMl09dGhpcy5zdGF0ZVthXT4+PjgmMjU1LGVbNCphKzNdPXRoaXMuc3RhdGVbYV0+Pj4wJjI1NTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodGhpcy5kaWdlc3RMZW5ndGgpO3JldHVybiB0aGlzLmZpbmlzaChlKSxlfSx0LnByb3RvdHlwZS5fc2F2ZVN0YXRlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8dGhpcy5zdGF0ZS5sZW5ndGg7dCsrKWVbdF09dGhpcy5zdGF0ZVt0XX0sdC5wcm90b3R5cGUuX3Jlc3RvcmVTdGF0ZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dGhpcy5zdGF0ZS5sZW5ndGg7bisrKXRoaXMuc3RhdGVbbl09ZVtuXTt0aGlzLmJ5dGVzSGFzaGVkPXQsdGhpcy5maW5pc2hlZD0hMSx0aGlzLmJ1ZmZlckxlbmd0aD0wfSx0fSgpO2UuSGFzaD1yO3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLmlubmVyPW5ldyByLHRoaXMub3V0ZXI9bmV3IHIsdGhpcy5ibG9ja1NpemU9dGhpcy5pbm5lci5ibG9ja1NpemUsdGhpcy5kaWdlc3RMZW5ndGg9dGhpcy5pbm5lci5kaWdlc3RMZW5ndGg7dmFyIHQ9bmV3IFVpbnQ4QXJyYXkodGhpcy5ibG9ja1NpemUpO2lmKGUubGVuZ3RoPnRoaXMuYmxvY2tTaXplKShuZXcgcikudXBkYXRlKGUpLmZpbmlzaCh0KS5jbGVhbigpO2Vsc2UgZm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspdFtuXT1lW25dO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXV49NTQ7dGhpcy5pbm5lci51cGRhdGUodCk7Zm9yKG49MDtuPHQubGVuZ3RoO24rKyl0W25dXj0xMDY7dGhpcy5vdXRlci51cGRhdGUodCksdGhpcy5pc3RhdGU9bmV3IFVpbnQzMkFycmF5KDgpLHRoaXMub3N0YXRlPW5ldyBVaW50MzJBcnJheSg4KSx0aGlzLmlubmVyLl9zYXZlU3RhdGUodGhpcy5pc3RhdGUpLHRoaXMub3V0ZXIuX3NhdmVTdGF0ZSh0aGlzLm9zdGF0ZSk7Zm9yKG49MDtuPHQubGVuZ3RoO24rKyl0W25dPTB9cmV0dXJuIGUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5uZXIuX3Jlc3RvcmVTdGF0ZSh0aGlzLmlzdGF0ZSx0aGlzLmlubmVyLmJsb2NrU2l6ZSksdGhpcy5vdXRlci5fcmVzdG9yZVN0YXRlKHRoaXMub3N0YXRlLHRoaXMub3V0ZXIuYmxvY2tTaXplKSx0aGlzfSxlLnByb3RvdHlwZS5jbGVhbj1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8dGhpcy5pc3RhdGUubGVuZ3RoO2UrKyl0aGlzLm9zdGF0ZVtlXT10aGlzLmlzdGF0ZVtlXT0wO3RoaXMuaW5uZXIuY2xlYW4oKSx0aGlzLm91dGVyLmNsZWFuKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pbm5lci51cGRhdGUoZSksdGhpc30sZS5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm91dGVyLmZpbmlzaGVkP3RoaXMub3V0ZXIuZmluaXNoKGUpOih0aGlzLmlubmVyLmZpbmlzaChlKSx0aGlzLm91dGVyLnVwZGF0ZShlLHRoaXMuZGlnZXN0TGVuZ3RoKS5maW5pc2goZSkpLHRoaXN9LGUucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBlPW5ldyBVaW50OEFycmF5KHRoaXMuZGlnZXN0TGVuZ3RoKTtyZXR1cm4gdGhpcy5maW5pc2goZSksZX0sZX0oKTtmdW5jdGlvbiBvKGUpe3ZhciB0PShuZXcgcikudXBkYXRlKGUpLG49dC5kaWdlc3QoKTtyZXR1cm4gdC5jbGVhbigpLG59ZnVuY3Rpb24gcyhlLHQpe3ZhciBuPW5ldyBpKGUpLnVwZGF0ZSh0KSxyPW4uZGlnZXN0KCk7cmV0dXJuIG4uY2xlYW4oKSxyfWZ1bmN0aW9uIGEoZSx0LG4scil7dmFyIGk9clswXTtpZigwPT09aSl0aHJvdyBuZXcgRXJyb3IoImhrZGY6IGNhbm5vdCBleHBhbmQgbW9yZSIpO3QucmVzZXQoKSxpPjEmJnQudXBkYXRlKGUpLG4mJnQudXBkYXRlKG4pLHQudXBkYXRlKHIpLHQuZmluaXNoKGUpLHJbMF0rK31lLkhNQUM9aSxlLmhhc2g9byxlLmRlZmF1bHQ9byxlLmhtYWM9czt2YXIgYz1uZXcgVWludDhBcnJheShlLmRpZ2VzdExlbmd0aCk7ZnVuY3Rpb24gdShlLHQsbixyKXt2b2lkIDA9PT10JiYodD1jKSx2b2lkIDA9PT1yJiYocj0zMik7Zm9yKHZhciBvPW5ldyBVaW50OEFycmF5KFsxXSksdT1zKHQsZSksbD1uZXcgaSh1KSxkPW5ldyBVaW50OEFycmF5KGwuZGlnZXN0TGVuZ3RoKSxoPWQubGVuZ3RoLGY9bmV3IFVpbnQ4QXJyYXkocikscD0wO3A8cjtwKyspaD09PWQubGVuZ3RoJiYoYShkLGwsbixvKSxoPTApLGZbcF09ZFtoKytdO3JldHVybiBsLmNsZWFuKCksZC5maWxsKDApLG8uZmlsbCgwKSxmfWZ1bmN0aW9uIGwoZSx0LG4scil7Zm9yKHZhciBvPW5ldyBpKGUpLHM9by5kaWdlc3RMZW5ndGgsYT1uZXcgVWludDhBcnJheSg0KSxjPW5ldyBVaW50OEFycmF5KHMpLHU9bmV3IFVpbnQ4QXJyYXkocyksbD1uZXcgVWludDhBcnJheShyKSxkPTA7ZCpzPHI7ZCsrKXt2YXIgaD1kKzE7YVswXT1oPj4+MjQmMjU1LGFbMV09aD4+PjE2JjI1NSxhWzJdPWg+Pj44JjI1NSxhWzNdPWg+Pj4wJjI1NSxvLnJlc2V0KCksby51cGRhdGUodCksby51cGRhdGUoYSksby5maW5pc2godSk7Zm9yKHZhciBmPTA7ZjxzO2YrKyljW2ZdPXVbZl07Zm9yKGY9MjtmPD1uO2YrKyl7by5yZXNldCgpLG8udXBkYXRlKHUpLmZpbmlzaCh1KTtmb3IodmFyIHA9MDtwPHM7cCsrKWNbcF1ePXVbcF19Zm9yKGY9MDtmPHMmJmQqcytmPHI7ZisrKWxbZCpzK2ZdPWNbZl19Zm9yKGQ9MDtkPHM7ZCsrKWNbZF09dVtkXT0wO2ZvcihkPTA7ZDw0O2QrKylhW2RdPTA7cmV0dXJuIG8uY2xlYW4oKSxsfWUuaGtkZj11LGUucGJrZGYyPWx9KHIpO3ZhciBpPXIuZGVmYXVsdDtmb3IodmFyIG8gaW4gcilpW29dPXJbb107ZS5leHBvcnRzPWl9KCl9KExyKTt2YXIgSHI9U3IoTHIuZXhwb3J0cyksTXI9Y3J5cHRvO2NvbnN0IE5yPWU9PmUgaW5zdGFuY2VvZiBDcnlwdG9LZXksanI9bmV3IFRleHRFbmNvZGVyLHhyPW5ldyBUZXh0RGVjb2Rlcjtjb25zdCBxcj1lPT57bGV0IHQ9ZTt0IGluc3RhbmNlb2YgVWludDhBcnJheSYmKHQ9eHIuZGVjb2RlKHQpKSx0PXQucmVwbGFjZSgvLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIikucmVwbGFjZSgvXHMvZywiIik7dHJ5e3JldHVybihlPT57Y29uc3QgdD1hdG9iKGUpLG49bmV3IFVpbnQ4QXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKW5bZV09dC5jaGFyQ29kZUF0KGUpO3JldHVybiBufSkodCl9Y2F0Y2goZSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGlucHV0IHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLiIpfX07Y2xhc3MgQnIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXt2YXIgdDtzdXBlcihlKSx0aGlzLmNvZGU9IkVSUl9KT1NFX0dFTkVSSUMiLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsbnVsbD09PSh0PUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKXx8dm9pZCAwPT09dHx8dC5jYWxsKEVycm9yLHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcil9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KT1NFX0dFTkVSSUMifX1jbGFzcyBGciBleHRlbmRzIEJye2NvbnN0cnVjdG9yKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToidW5zcGVjaWZpZWQiLG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOiJ1bnNwZWNpZmllZCI7c3VwZXIoZSksdGhpcy5jb2RlPSJFUlJfSldUX0NMQUlNX1ZBTElEQVRJT05fRkFJTEVEIix0aGlzLmNsYWltPXQsdGhpcy5yZWFzb249bn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXVF9DTEFJTV9WQUxJREFUSU9OX0ZBSUxFRCJ9fWNsYXNzIEtyIGV4dGVuZHMgQnJ7Y29uc3RydWN0b3IoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiJ1bnNwZWNpZmllZCIsbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06InVuc3BlY2lmaWVkIjtzdXBlcihlKSx0aGlzLmNvZGU9IkVSUl9KV1RfRVhQSVJFRCIsdGhpcy5jbGFpbT10LHRoaXMucmVhc29uPW59c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV1RfRVhQSVJFRCJ9fWNsYXNzIEpyIGV4dGVuZHMgQnJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pPU0VfQUxHX05PVF9BTExPV0VEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pPU0VfQUxHX05PVF9BTExPV0VEIn19Y2xhc3MgV3IgZXh0ZW5kcyBCcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSk9TRV9OT1RfU1VQUE9SVEVEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pPU0VfTk9UX1NVUFBPUlRFRCJ9fWNsYXNzIHpyIGV4dGVuZHMgQnJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXU19JTlZBTElEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXU19JTlZBTElEIn19Y2xhc3MgVnIgZXh0ZW5kcyBCcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldUX0lOVkFMSUQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldUX0lOVkFMSUQifX1jbGFzcyBZciBleHRlbmRzIEJye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV0tTX0lOVkFMSUQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldLU19JTlZBTElEIn19Y2xhc3MgR3IgZXh0ZW5kcyBCcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldLU19OT19NQVRDSElOR19LRVkiLHRoaXMubWVzc2FnZT0ibm8gYXBwbGljYWJsZSBrZXkgZm91bmQgaW4gdGhlIEpTT04gV2ViIEtleSBTZXQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldLU19OT19NQVRDSElOR19LRVkifX1jbGFzcyBYciBleHRlbmRzIEJye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV0tTX01VTFRJUExFX01BVENISU5HX0tFWVMiLHRoaXMubWVzc2FnZT0ibXVsdGlwbGUgbWF0Y2hpbmcga2V5cyBmb3VuZCBpbiB0aGUgSlNPTiBXZWIgS2V5IFNldCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV0tTX01VTFRJUExFX01BVENISU5HX0tFWVMifX1jbGFzcyAkciBleHRlbmRzIEJye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV1NfU0lHTkFUVVJFX1ZFUklGSUNBVElPTl9GQUlMRUQiLHRoaXMubWVzc2FnZT0ic2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldTX1NJR05BVFVSRV9WRVJJRklDQVRJT05fRkFJTEVEIn19ZnVuY3Rpb24gWnIoKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgV2ViU29ja2V0UGFpcn1mdW5jdGlvbiBRcihlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06ImFsZ29yaXRobS5uYW1lIjtyZXR1cm4gbmV3IFR5cGVFcnJvcigiQ3J5cHRvS2V5IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24sIGl0cyAiLmNvbmNhdCh0LCIgbXVzdCBiZSAiKS5jb25jYXQoZSkpfWZ1bmN0aW9uIGVpKGUsdCl7cmV0dXJuIGUubmFtZT09PXR9ZnVuY3Rpb24gdGkoZSl7cmV0dXJuIHBhcnNlSW50KGUubmFtZS5zbGljZSg0KSwxMCl9ZnVuY3Rpb24gbmkoZSl7c3dpdGNoKGUpe2Nhc2UiRVMyNTYiOnJldHVybiJQLTI1NiI7Y2FzZSJFUzM4NCI6cmV0dXJuIlAtMzg0IjtjYXNlIkVTNTEyIjpyZXR1cm4iUC01MjEiO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bnJlYWNoYWJsZSIpfX1mdW5jdGlvbiByaShlLHQpe2lmKHQubGVuZ3RoJiYhdC5zb21lKCh0PT5lLnVzYWdlcy5pbmNsdWRlcyh0KSkpKXtsZXQgZT0iQ3J5cHRvS2V5IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24sIGl0cyB1c2FnZXMgbXVzdCBpbmNsdWRlICI7aWYodC5sZW5ndGg+Mil7Y29uc3Qgbj10LnBvcCgpO2UrPSJvbmUgb2YgIi5jb25jYXQodC5qb2luKCIsICIpLCIsIG9yICIpLmNvbmNhdChuLCIuIil9ZWxzZSAyPT09dC5sZW5ndGg/ZSs9Im9uZSBvZiAiLmNvbmNhdCh0WzBdLCIgb3IgIikuY29uY2F0KHRbMV0sIi4iKTplKz0iIi5jb25jYXQodFswXSwiLiIpO3Rocm93IG5ldyBUeXBlRXJyb3IoZSl9fXZhciBpaT1mdW5jdGlvbihlKXtsZXQgdD0iS2V5IG11c3QgYmUgIjtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLGk9MTtpPG47aSsrKXJbaS0xXT1hcmd1bWVudHNbaV07aWYoci5sZW5ndGg+Mil7Y29uc3QgZT1yLnBvcCgpO3QrPSJvbmUgb2YgdHlwZSAiLmNvbmNhdChyLmpvaW4oIiwgIiksIiwgb3IgIikuY29uY2F0KGUsIi4iKX1lbHNlIDI9PT1yLmxlbmd0aD90Kz0ib25lIG9mIHR5cGUgIi5jb25jYXQoclswXSwiIG9yICIpLmNvbmNhdChyWzFdLCIuIik6dCs9Im9mIHR5cGUgIi5jb25jYXQoclswXSwiLiIpO3JldHVybiBudWxsPT1lP3QrPSIgUmVjZWl2ZWQgIi5jb25jYXQoZSk6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUubmFtZT90Kz0iIFJlY2VpdmVkIGZ1bmN0aW9uICIuY29uY2F0KGUubmFtZSk6Im9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lJiZlLmNvbnN0cnVjdG9yJiZlLmNvbnN0cnVjdG9yLm5hbWUmJih0Kz0iIFJlY2VpdmVkIGFuIGluc3RhbmNlIG9mICIuY29uY2F0KGUuY29uc3RydWN0b3IubmFtZSkpLHR9LG9pPWU9Pk5yKGUpO2NvbnN0IHNpPVsiQ3J5cHRvS2V5Il07ZnVuY3Rpb24gYWkoZSl7aWYoIm9iamVjdCIhPXR5cGVvZih0PWUpfHxudWxsPT09dHx8IltvYmplY3QgT2JqZWN0XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpcmV0dXJuITE7dmFyIHQ7aWYobnVsbD09PU9iamVjdC5nZXRQcm90b3R5cGVPZihlKSlyZXR1cm4hMDtsZXQgbj1lO2Zvcig7bnVsbCE9PU9iamVjdC5nZXRQcm90b3R5cGVPZihuKTspbj1PYmplY3QuZ2V0UHJvdG90eXBlT2Yobik7cmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PW59Y29uc3QgY2k9YXN5bmMgZT0+e3ZhciB0LG47Y29uc3R7YWxnb3JpdGhtOnIsa2V5VXNhZ2VzOml9PWZ1bmN0aW9uKGUpe2xldCB0LG47c3dpdGNoKGUua3R5KXtjYXNlIm9jdCI6c3dpdGNoKGUuYWxnKXtjYXNlIkhTMjU2IjpjYXNlIkhTMzg0IjpjYXNlIkhTNTEyIjp0PXtuYW1lOiJITUFDIixoYXNoOiJTSEEtIi5jb25jYXQoZS5hbGcuc2xpY2UoLTMpKX0sbj1bInNpZ24iLCJ2ZXJpZnkiXTticmVhaztjYXNlIkExMjhDQkMtSFMyNTYiOmNhc2UiQTE5MkNCQy1IUzM4NCI6Y2FzZSJBMjU2Q0JDLUhTNTEyIjp0aHJvdyBuZXcgV3IoIiIuY29uY2F0KGUuYWxnLCIga2V5cyBjYW5ub3QgYmUgaW1wb3J0ZWQgYXMgQ3J5cHRvS2V5IGluc3RhbmNlcyIpKTtjYXNlIkExMjhHQ00iOmNhc2UiQTE5MkdDTSI6Y2FzZSJBMjU2R0NNIjpjYXNlIkExMjhHQ01LVyI6Y2FzZSJBMTkyR0NNS1ciOmNhc2UiQTI1NkdDTUtXIjp0PXtuYW1lOiJBRVMtR0NNIn0sbj1bImVuY3J5cHQiLCJkZWNyeXB0Il07YnJlYWs7Y2FzZSJBMTI4S1ciOmNhc2UiQTE5MktXIjpjYXNlIkEyNTZLVyI6dD17bmFtZToiQUVTLUtXIn0sbj1bIndyYXBLZXkiLCJ1bndyYXBLZXkiXTticmVhaztjYXNlIlBCRVMyLUhTMjU2K0ExMjhLVyI6Y2FzZSJQQkVTMi1IUzM4NCtBMTkyS1ciOmNhc2UiUEJFUzItSFM1MTIrQTI1NktXIjp0PXtuYW1lOiJQQktERjIifSxuPVsiZGVyaXZlQml0cyJdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFdyKCdJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIEpXSyAiYWxnIiAoQWxnb3JpdGhtKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztjYXNlIlJTQSI6c3dpdGNoKGUuYWxnKXtjYXNlIlBTMjU2IjpjYXNlIlBTMzg0IjpjYXNlIlBTNTEyIjp0PXtuYW1lOiJSU0EtUFNTIixoYXNoOiJTSEEtIi5jb25jYXQoZS5hbGcuc2xpY2UoLTMpKX0sbj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIlJTMjU2IjpjYXNlIlJTMzg0IjpjYXNlIlJTNTEyIjp0PXtuYW1lOiJSU0FTU0EtUEtDUzEtdjFfNSIsaGFzaDoiU0hBLSIuY29uY2F0KGUuYWxnLnNsaWNlKC0zKSl9LG49ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJSU0EtT0FFUCI6Y2FzZSJSU0EtT0FFUC0yNTYiOmNhc2UiUlNBLU9BRVAtMzg0IjpjYXNlIlJTQS1PQUVQLTUxMiI6dD17bmFtZToiUlNBLU9BRVAiLGhhc2g6IlNIQS0iLmNvbmNhdChwYXJzZUludChlLmFsZy5zbGljZSgtMyksMTApfHwxKX0sbj1lLmQ/WyJkZWNyeXB0IiwidW53cmFwS2V5Il06WyJlbmNyeXB0Iiwid3JhcEtleSJdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFdyKCdJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIEpXSyAiYWxnIiAoQWxnb3JpdGhtKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztjYXNlIkVDIjpzd2l0Y2goZS5hbGcpe2Nhc2UiRVMyNTYiOnQ9e25hbWU6IkVDRFNBIixuYW1lZEN1cnZlOiJQLTI1NiJ9LG49ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJFUzM4NCI6dD17bmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6IlAtMzg0In0sbj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIkVTNTEyIjp0PXtuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZToiUC01MjEifSxuPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiRUNESC1FUyI6Y2FzZSJFQ0RILUVTK0ExMjhLVyI6Y2FzZSJFQ0RILUVTK0ExOTJLVyI6Y2FzZSJFQ0RILUVTK0EyNTZLVyI6dD17bmFtZToiRUNESCIsbmFtZWRDdXJ2ZTplLmNydn0sbj1lLmQ/WyJkZXJpdmVCaXRzIl06W107YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgV3IoJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2Nhc2UgWnIoKSYmIk9LUCI6aWYoIkVkRFNBIiE9PWUuYWxnKXRocm93IG5ldyBXcignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyk7aWYoIkVkMjU1MTkiIT09ZS5jcnYpdGhyb3cgbmV3IFdyKCdJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIEpXSyAiY3J2IiAoU3VidHlwZSBvZiBLZXkgUGFpcikgUGFyYW1ldGVyIHZhbHVlJyk7dD17bmFtZToiTk9ERS1FRDI1NTE5IixuYW1lZEN1cnZlOiJOT0RFLUVEMjU1MTkifSxuPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFdyKCdJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIEpXSyAia3R5IiAoS2V5IFR5cGUpIFBhcmFtZXRlciB2YWx1ZScpfXJldHVybnthbGdvcml0aG06dCxrZXlVc2FnZXM6bn19KGUpLG89W3IsbnVsbCE9PSh0PWUuZXh0KSYmdm9pZCAwIT09dCYmdCxudWxsIT09KG49ZS5rZXlfb3BzKSYmdm9pZCAwIT09bj9uOmldO2lmKCJQQktERjIiPT09ci5uYW1lKXJldHVybiBNci5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLHFyKGUuayksLi4ubyk7Y29uc3Qgcz17Li4uZX07cmV0dXJuIGRlbGV0ZSBzLmFsZyxNci5zdWJ0bGUuaW1wb3J0S2V5KCJqd2siLHMsLi4ubyl9O2NvbnN0IHVpPShlLHQsbik9PntlLnN0YXJ0c1dpdGgoIkhTIil8fCJkaXIiPT09ZXx8ZS5zdGFydHNXaXRoKCJQQkVTMiIpfHwvXkFcZHszfSg/OkdDTSk/S1ckLy50ZXN0KGUpPyhlPT57aWYoIShlIGluc3RhbmNlb2YgVWludDhBcnJheSkpe2lmKCFvaShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKGlpKGUsLi4uc2ksIlVpbnQ4QXJyYXkiKSk7aWYoInNlY3JldCIhPT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiIi5jb25jYXQoc2kuam9pbigiIG9yICIpLCcgaW5zdGFuY2VzIGZvciBzeW1tZXRyaWMgYWxnb3JpdGhtcyBtdXN0IGJlIG9mIHR5cGUgInNlY3JldCInKSl9fSkodCk6KChlLHQpPT57aWYoIW9pKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoaWkoZSwuLi5zaSkpO2lmKCJzZWNyZXQiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoIiIuY29uY2F0KHNpLmpvaW4oIiBvciAiKSwnIGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG1zIG11c3Qgbm90IGJlIG9mIHR5cGUgInNlY3JldCInKSk7aWYoInNpZ24iPT09dCYmInB1YmxpYyI9PT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiIi5jb25jYXQoc2kuam9pbigiIG9yICIpLCcgaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBzaWduaW5nIG11c3QgYmUgb2YgdHlwZSAicHJpdmF0ZSInKSk7aWYoImRlY3J5cHQiPT09dCYmInB1YmxpYyI9PT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiIi5jb25jYXQoc2kuam9pbigiIG9yICIpLCcgaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBkZWNyeXB0aW9uIG11c3QgYmUgb2YgdHlwZSAicHJpdmF0ZSInKSk7aWYoZS5hbGdvcml0aG0mJiJ2ZXJpZnkiPT09dCYmInByaXZhdGUiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoIiIuY29uY2F0KHNpLmpvaW4oIiBvciAiKSwnIGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG0gdmVyaWZ5aW5nIG11c3QgYmUgb2YgdHlwZSAicHVibGljIicpKTtpZihlLmFsZ29yaXRobSYmImVuY3J5cHQiPT09dCYmInByaXZhdGUiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoIiIuY29uY2F0KHNpLmpvaW4oIiBvciAiKSwnIGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG0gZW5jcnlwdGlvbiBtdXN0IGJlIG9mIHR5cGUgInB1YmxpYyInKSl9KSh0LG4pfTtmdW5jdGlvbiBsaShlLHQsbil7aWYoTnIodCkpcmV0dXJuIGZ1bmN0aW9uKGUsdCl7c3dpdGNoKHQpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOntpZighZWkoZS5hbGdvcml0aG0sIkhNQUMiKSl0aHJvdyBRcigiSE1BQyIpO2NvbnN0IG49cGFyc2VJbnQodC5zbGljZSgyKSwxMCk7aWYodGkoZS5hbGdvcml0aG0uaGFzaCkhPT1uKXRocm93IFFyKCJTSEEtIi5jb25jYXQobiksImFsZ29yaXRobS5oYXNoIik7YnJlYWt9Y2FzZSJSUzI1NiI6Y2FzZSJSUzM4NCI6Y2FzZSJSUzUxMiI6e2lmKCFlaShlLmFsZ29yaXRobSwiUlNBU1NBLVBLQ1MxLXYxXzUiKSl0aHJvdyBRcigiUlNBU1NBLVBLQ1MxLXYxXzUiKTtjb25zdCBuPXBhcnNlSW50KHQuc2xpY2UoMiksMTApO2lmKHRpKGUuYWxnb3JpdGhtLmhhc2gpIT09bil0aHJvdyBRcigiU0hBLSIuY29uY2F0KG4pLCJhbGdvcml0aG0uaGFzaCIpO2JyZWFrfWNhc2UiUFMyNTYiOmNhc2UiUFMzODQiOmNhc2UiUFM1MTIiOntpZighZWkoZS5hbGdvcml0aG0sIlJTQS1QU1MiKSl0aHJvdyBRcigiUlNBLVBTUyIpO2NvbnN0IG49cGFyc2VJbnQodC5zbGljZSgyKSwxMCk7aWYodGkoZS5hbGdvcml0aG0uaGFzaCkhPT1uKXRocm93IFFyKCJTSEEtIi5jb25jYXQobiksImFsZ29yaXRobS5oYXNoIik7YnJlYWt9Y2FzZSBacigpJiYiRWREU0EiOmlmKCFlaShlLmFsZ29yaXRobSwiTk9ERS1FRDI1NTE5IikpdGhyb3cgUXIoIk5PREUtRUQyNTUxOSIpO2JyZWFrO2Nhc2UiRVMyNTYiOmNhc2UiRVMzODQiOmNhc2UiRVM1MTIiOntpZighZWkoZS5hbGdvcml0aG0sIkVDRFNBIikpdGhyb3cgUXIoIkVDRFNBIik7Y29uc3Qgbj1uaSh0KTtpZihlLmFsZ29yaXRobS5uYW1lZEN1cnZlIT09bil0aHJvdyBRcihuLCJhbGdvcml0aG0ubmFtZWRDdXJ2ZSIpO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiQ3J5cHRvS2V5IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24iKX1mb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjI/bi0yOjApLGk9MjtpPG47aSsrKXJbaS0yXT1hcmd1bWVudHNbaV07cmkoZSxyKX0odCxlLG4pLHQ7aWYodCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2lmKCFlLnN0YXJ0c1dpdGgoIkhTIikpdGhyb3cgbmV3IFR5cGVFcnJvcihpaSh0LC4uLnNpKSk7cmV0dXJuIE1yLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsdCx7aGFzaDoiU0hBLSIuY29uY2F0KGUuc2xpY2UoLTMpKSxuYW1lOiJITUFDIn0sITEsW25dKX10aHJvdyBuZXcgVHlwZUVycm9yKGlpKHQsLi4uc2ksIlVpbnQ4QXJyYXkiKSl9Y29uc3QgZGk9YXN5bmMoZSx0LG4scik9Pntjb25zdCBpPWF3YWl0IGxpKGUsdCwidmVyaWZ5Iik7KChlLHQpPT57aWYoZS5zdGFydHNXaXRoKCJSUyIpfHxlLnN0YXJ0c1dpdGgoIlBTIikpe2NvbnN0e21vZHVsdXNMZW5ndGg6bn09dC5hbGdvcml0aG07aWYoIm51bWJlciIhPXR5cGVvZiBufHxuPDIwNDgpdGhyb3cgbmV3IFR5cGVFcnJvcigiIi5jb25jYXQoZSwiIHJlcXVpcmVzIGtleSBtb2R1bHVzTGVuZ3RoIHRvIGJlIDIwNDggYml0cyBvciBsYXJnZXIiKSl9fSkoZSxpKTtjb25zdCBvPWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj0iU0hBLSIuY29uY2F0KGUuc2xpY2UoLTMpKTtzd2l0Y2goZSl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6cmV0dXJue2hhc2g6bixuYW1lOiJITUFDIn07Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6cmV0dXJue2hhc2g6bixuYW1lOiJSU0EtUFNTIixzYWx0TGVuZ3RoOmUuc2xpY2UoLTMpPj4zfTtjYXNlIlJTMjU2IjpjYXNlIlJTMzg0IjpjYXNlIlJTNTEyIjpyZXR1cm57aGFzaDpuLG5hbWU6IlJTQVNTQS1QS0NTMS12MV81In07Y2FzZSJFUzI1NiI6Y2FzZSJFUzM4NCI6Y2FzZSJFUzUxMiI6cmV0dXJue2hhc2g6bixuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZTp0Lm5hbWVkQ3VydmV9O2Nhc2UgWnIoKSYmIkVkRFNBIjpjb25zdHtuYW1lZEN1cnZlOnJ9PXQ7cmV0dXJue25hbWU6cixuYW1lZEN1cnZlOnJ9O2RlZmF1bHQ6dGhyb3cgbmV3IFdyKCJhbGcgIi5jb25jYXQoZSwiIGlzIG5vdCBzdXBwb3J0ZWQgZWl0aGVyIGJ5IEpPU0Ugb3IgeW91ciBqYXZhc2NyaXB0IHJ1bnRpbWUiKSl9fShlLGkuYWxnb3JpdGhtKTt0cnl7cmV0dXJuIGF3YWl0IE1yLnN1YnRsZS52ZXJpZnkobyxpLG4scil9Y2F0Y2goZSl7cmV0dXJuITF9fTthc3luYyBmdW5jdGlvbiBoaShlLHQsbil7dmFyIHI7aWYoIWFpKGUpKXRocm93IG5ldyB6cigiRmxhdHRlbmVkIEpXUyBtdXN0IGJlIGFuIG9iamVjdCIpO2lmKHZvaWQgMD09PWUucHJvdGVjdGVkJiZ2b2lkIDA9PT1lLmhlYWRlcil0aHJvdyBuZXcgenIoJ0ZsYXR0ZW5lZCBKV1MgbXVzdCBoYXZlIGVpdGhlciBvZiB0aGUgInByb3RlY3RlZCIgb3IgImhlYWRlciIgbWVtYmVycycpO2lmKHZvaWQgMCE9PWUucHJvdGVjdGVkJiYic3RyaW5nIiE9dHlwZW9mIGUucHJvdGVjdGVkKXRocm93IG5ldyB6cigiSldTIFByb3RlY3RlZCBIZWFkZXIgaW5jb3JyZWN0IHR5cGUiKTtpZih2b2lkIDA9PT1lLnBheWxvYWQpdGhyb3cgbmV3IHpyKCJKV1MgUGF5bG9hZCBtaXNzaW5nIik7aWYoInN0cmluZyIhPXR5cGVvZiBlLnNpZ25hdHVyZSl0aHJvdyBuZXcgenIoIkpXUyBTaWduYXR1cmUgbWlzc2luZyBvciBpbmNvcnJlY3QgdHlwZSIpO2lmKHZvaWQgMCE9PWUuaGVhZGVyJiYhYWkoZS5oZWFkZXIpKXRocm93IG5ldyB6cigiSldTIFVucHJvdGVjdGVkIEhlYWRlciBpbmNvcnJlY3QgdHlwZSIpO2xldCBpPXt9O2lmKGUucHJvdGVjdGVkKXtjb25zdCB0PXFyKGUucHJvdGVjdGVkKTt0cnl7aT1KU09OLnBhcnNlKHhyLmRlY29kZSh0KSl9Y2F0Y2goZSl7dGhyb3cgbmV3IHpyKCJKV1MgUHJvdGVjdGVkIEhlYWRlciBpcyBpbnZhbGlkIil9fWlmKCFmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO2NvbnN0IHI9dC5maWx0ZXIoQm9vbGVhbik7aWYoMD09PXIubGVuZ3RofHwxPT09ci5sZW5ndGgpcmV0dXJuITA7bGV0IGk7Zm9yKGNvbnN0IGUgb2Ygcil7Y29uc3QgdD1PYmplY3Qua2V5cyhlKTtpZihpJiYwIT09aS5zaXplKWZvcihjb25zdCBlIG9mIHQpe2lmKGkuaGFzKGUpKXJldHVybiExO2kuYWRkKGUpfWVsc2UgaT1uZXcgU2V0KHQpfXJldHVybiEwfShpLGUuaGVhZGVyKSl0aHJvdyBuZXcgenIoIkpXUyBQcm90ZWN0ZWQgYW5kIEpXUyBVbnByb3RlY3RlZCBIZWFkZXIgUGFyYW1ldGVyIG5hbWVzIG11c3QgYmUgZGlzam9pbnQiKTtjb25zdCBvPXsuLi5pLC4uLmUuaGVhZGVyfSxzPWZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYodm9pZCAwIT09aS5jcml0JiZ2b2lkIDA9PT1yLmNyaXQpdGhyb3cgbmV3IGUoJyJjcml0IiAoQ3JpdGljYWwpIEhlYWRlciBQYXJhbWV0ZXIgTVVTVCBiZSBpbnRlZ3JpdHkgcHJvdGVjdGVkJyk7aWYoIXJ8fHZvaWQgMD09PXIuY3JpdClyZXR1cm4gbmV3IFNldDtpZighQXJyYXkuaXNBcnJheShyLmNyaXQpfHwwPT09ci5jcml0Lmxlbmd0aHx8ci5jcml0LnNvbWUoKGU9PiJzdHJpbmciIT10eXBlb2YgZXx8MD09PWUubGVuZ3RoKSkpdGhyb3cgbmV3IGUoJyJjcml0IiAoQ3JpdGljYWwpIEhlYWRlciBQYXJhbWV0ZXIgTVVTVCBiZSBhbiBhcnJheSBvZiBub24tZW1wdHkgc3RyaW5ncyB3aGVuIHByZXNlbnQnKTtsZXQgbztvPXZvaWQgMCE9PW4/bmV3IE1hcChbLi4uT2JqZWN0LmVudHJpZXMobiksLi4udC5lbnRyaWVzKCldKTp0O2Zvcihjb25zdCB0IG9mIHIuY3JpdCl7aWYoIW8uaGFzKHQpKXRocm93IG5ldyBXcignRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIicuY29uY2F0KHQsJyIgaXMgbm90IHJlY29nbml6ZWQnKSk7aWYodm9pZCAwPT09aVt0XSl0aHJvdyBuZXcgZSgnRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIicuY29uY2F0KHQsJyIgaXMgbWlzc2luZycpKTtpZihvLmdldCh0KSYmdm9pZCAwPT09clt0XSl0aHJvdyBuZXcgZSgnRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIicuY29uY2F0KHQsJyIgTVVTVCBiZSBpbnRlZ3JpdHkgcHJvdGVjdGVkJykpfXJldHVybiBuZXcgU2V0KHIuY3JpdCl9KHpyLG5ldyBNYXAoW1siYjY0IiwhMF1dKSxudWxsPT1uP3ZvaWQgMDpuLmNyaXQsaSxvKTtsZXQgYT0hMDtpZihzLmhhcygiYjY0IikmJihhPWkuYjY0LCJib29sZWFuIiE9dHlwZW9mIGEpKXRocm93IG5ldyB6cignVGhlICJiNjQiIChiYXNlNjR1cmwtZW5jb2RlIHBheWxvYWQpIEhlYWRlciBQYXJhbWV0ZXIgbXVzdCBiZSBhIGJvb2xlYW4nKTtjb25zdHthbGc6Y309bztpZigic3RyaW5nIiE9dHlwZW9mIGN8fCFjKXRocm93IG5ldyB6cignSldTICJhbGciIChBbGdvcml0aG0pIEhlYWRlciBQYXJhbWV0ZXIgbWlzc2luZyBvciBpbnZhbGlkJyk7Y29uc3QgdT1uJiYoKGUsdCk9PntpZih2b2lkIDAhPT10JiYoIUFycmF5LmlzQXJyYXkodCl8fHQuc29tZSgoZT0+InN0cmluZyIhPXR5cGVvZiBlKSkpKXRocm93IG5ldyBUeXBlRXJyb3IoJyInLmNvbmNhdChlLCciIG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKSk7aWYodClyZXR1cm4gbmV3IFNldCh0KX0pKCJhbGdvcml0aG1zIixuLmFsZ29yaXRobXMpO2lmKHUmJiF1LmhhcyhjKSl0aHJvdyBuZXcgSnIoJyJhbGciIChBbGdvcml0aG0pIEhlYWRlciBQYXJhbWV0ZXIgbm90IGFsbG93ZWQnKTtpZihhKXtpZigic3RyaW5nIiE9dHlwZW9mIGUucGF5bG9hZCl0aHJvdyBuZXcgenIoIkpXUyBQYXlsb2FkIG11c3QgYmUgYSBzdHJpbmciKX1lbHNlIGlmKCJzdHJpbmciIT10eXBlb2YgZS5wYXlsb2FkJiYhKGUucGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXRocm93IG5ldyB6cigiSldTIFBheWxvYWQgbXVzdCBiZSBhIHN0cmluZyBvciBhbiBVaW50OEFycmF5IGluc3RhbmNlIik7bGV0IGw9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PWF3YWl0IHQoaSxlKSxsPSEwKSx1aShjLHQsInZlcmlmeSIpO2NvbnN0IGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtjb25zdCByPXQucmVkdWNlKCgoZSx0KT0+e2xldHtsZW5ndGg6bn09dDtyZXR1cm4gZStufSksMCksaT1uZXcgVWludDhBcnJheShyKTtsZXQgbz0wO3JldHVybiB0LmZvckVhY2goKGU9PntpLnNldChlLG8pLG8rPWUubGVuZ3RofSkpLGl9KGpyLmVuY29kZShudWxsIT09KHI9ZS5wcm90ZWN0ZWQpJiZ2b2lkIDAhPT1yP3I6IiIpLGpyLmVuY29kZSgiLiIpLCJzdHJpbmciPT10eXBlb2YgZS5wYXlsb2FkP2pyLmVuY29kZShlLnBheWxvYWQpOmUucGF5bG9hZCksaD1xcihlLnNpZ25hdHVyZSk7aWYoIWF3YWl0IGRpKGMsdCxoLGQpKXRocm93IG5ldyAkcjtsZXQgZjtmPWE/cXIoZS5wYXlsb2FkKToic3RyaW5nIj09dHlwZW9mIGUucGF5bG9hZD9qci5lbmNvZGUoZS5wYXlsb2FkKTplLnBheWxvYWQ7Y29uc3QgcD17cGF5bG9hZDpmfTtyZXR1cm4gdm9pZCAwIT09ZS5wcm90ZWN0ZWQmJihwLnByb3RlY3RlZEhlYWRlcj1pKSx2b2lkIDAhPT1lLmhlYWRlciYmKHAudW5wcm90ZWN0ZWRIZWFkZXI9ZS5oZWFkZXIpLGw/ey4uLnAsa2V5OnR9OnB9dmFyIGZpPWU9Pk1hdGguZmxvb3IoZS5nZXRUaW1lKCkvMWUzKTtjb25zdCBwaT04NjQwMCxnaT0vXihcZCt8XGQrXC5cZCspID8oc2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KSQvaTt2YXIgeWk9ZT0+e2NvbnN0IHQ9Z2kuZXhlYyhlKTtpZighdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIHRpbWUgcGVyaW9kIGZvcm1hdCIpO2NvbnN0IG49cGFyc2VGbG9hdCh0WzFdKTtzd2l0Y2godFsyXS50b0xvd2VyQ2FzZSgpKXtjYXNlInNlYyI6Y2FzZSJzZWNzIjpjYXNlInNlY29uZCI6Y2FzZSJzZWNvbmRzIjpjYXNlInMiOnJldHVybiBNYXRoLnJvdW5kKG4pO2Nhc2UibWludXRlIjpjYXNlIm1pbnV0ZXMiOmNhc2UibWluIjpjYXNlIm1pbnMiOmNhc2UibSI6cmV0dXJuIE1hdGgucm91bmQoNjAqbik7Y2FzZSJob3VyIjpjYXNlImhvdXJzIjpjYXNlImhyIjpjYXNlImhycyI6Y2FzZSJoIjpyZXR1cm4gTWF0aC5yb3VuZCgzNjAwKm4pO2Nhc2UiZGF5IjpjYXNlImRheXMiOmNhc2UiZCI6cmV0dXJuIE1hdGgucm91bmQobipwaSk7Y2FzZSJ3ZWVrIjpjYXNlIndlZWtzIjpjYXNlInciOnJldHVybiBNYXRoLnJvdW5kKDYwNDgwMCpuKTtkZWZhdWx0OnJldHVybiBNYXRoLnJvdW5kKDMxNTU3NjAwKm4pfX07Y29uc3Qgdmk9ZT0+ZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15hcHBsaWNhdGlvblwvLywiIiksbWk9KGUsdCk9PiJzdHJpbmciPT10eXBlb2YgZT90LmluY2x1ZGVzKGUpOiEhQXJyYXkuaXNBcnJheShlKSYmdC5zb21lKFNldC5wcm90b3R5cGUuaGFzLmJpbmQobmV3IFNldChlKSkpO2FzeW5jIGZ1bmN0aW9uIHdpKGUsdCxuKXt2YXIgcjtjb25zdCBpPWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUsdCxuKXtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheSYmKGU9eHIuZGVjb2RlKGUpKSwic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IHpyKCJDb21wYWN0IEpXUyBtdXN0IGJlIGEgc3RyaW5nIG9yIFVpbnQ4QXJyYXkiKTtjb25zdHswOnIsMTppLDI6byxsZW5ndGg6c309ZS5zcGxpdCgiLiIpO2lmKDMhPT1zKXRocm93IG5ldyB6cigiSW52YWxpZCBDb21wYWN0IEpXUyIpO2NvbnN0IGE9YXdhaXQgaGkoe3BheWxvYWQ6aSxwcm90ZWN0ZWQ6cixzaWduYXR1cmU6b30sdCxuKSxjPXtwYXlsb2FkOmEucGF5bG9hZCxwcm90ZWN0ZWRIZWFkZXI6YS5wcm90ZWN0ZWRIZWFkZXJ9O3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3suLi5jLGtleTphLmtleX06Y30oZSx0LG4pO2lmKChudWxsPT09KHI9aS5wcm90ZWN0ZWRIZWFkZXIuY3JpdCl8fHZvaWQgMD09PXI/dm9pZCAwOnIuaW5jbHVkZXMoImI2NCIpKSYmITE9PT1pLnByb3RlY3RlZEhlYWRlci5iNjQpdGhyb3cgbmV3IFZyKCJKV1RzIE1VU1QgTk9UIHVzZSB1bmVuY29kZWQgcGF5bG9hZCIpO2NvbnN0IG89ZnVuY3Rpb24oZSx0KXtsZXQgbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e307Y29uc3R7dHlwOnJ9PW47aWYociYmKCJzdHJpbmciIT10eXBlb2YgZS50eXB8fHZpKGUudHlwKSE9PXZpKHIpKSl0aHJvdyBuZXcgRnIoJ3VuZXhwZWN0ZWQgInR5cCIgSldUIGhlYWRlciB2YWx1ZScsInR5cCIsImNoZWNrX2ZhaWxlZCIpO2xldCBpO3RyeXtpPUpTT04ucGFyc2UoeHIuZGVjb2RlKHQpKX1jYXRjaChlKXt9aWYoIWFpKGkpKXRocm93IG5ldyBWcigiSldUIENsYWltcyBTZXQgbXVzdCBiZSBhIHRvcC1sZXZlbCBKU09OIG9iamVjdCIpO2NvbnN0e2lzc3VlcjpvfT1uO2lmKG8mJiEoQXJyYXkuaXNBcnJheShvKT9vOltvXSkuaW5jbHVkZXMoaS5pc3MpKXRocm93IG5ldyBGcigndW5leHBlY3RlZCAiaXNzIiBjbGFpbSB2YWx1ZScsImlzcyIsImNoZWNrX2ZhaWxlZCIpO2NvbnN0e3N1YmplY3Q6c309bjtpZihzJiZpLnN1YiE9PXMpdGhyb3cgbmV3IEZyKCd1bmV4cGVjdGVkICJzdWIiIGNsYWltIHZhbHVlJywic3ViIiwiY2hlY2tfZmFpbGVkIik7Y29uc3R7YXVkaWVuY2U6YX09bjtpZihhJiYhbWkoaS5hdWQsInN0cmluZyI9PXR5cGVvZiBhP1thXTphKSl0aHJvdyBuZXcgRnIoJ3VuZXhwZWN0ZWQgImF1ZCIgY2xhaW0gdmFsdWUnLCJhdWQiLCJjaGVja19mYWlsZWQiKTtsZXQgYztzd2l0Y2godHlwZW9mIG4uY2xvY2tUb2xlcmFuY2Upe2Nhc2Uic3RyaW5nIjpjPXlpKG4uY2xvY2tUb2xlcmFuY2UpO2JyZWFrO2Nhc2UibnVtYmVyIjpjPW4uY2xvY2tUb2xlcmFuY2U7YnJlYWs7Y2FzZSJ1bmRlZmluZWQiOmM9MDticmVhaztkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgY2xvY2tUb2xlcmFuY2Ugb3B0aW9uIHR5cGUiKX1jb25zdHtjdXJyZW50RGF0ZTp1fT1uLGw9ZmkodXx8bmV3IERhdGUpO2lmKCh2b2lkIDAhPT1pLmlhdHx8bi5tYXhUb2tlbkFnZSkmJiJudW1iZXIiIT10eXBlb2YgaS5pYXQpdGhyb3cgbmV3IEZyKCciaWF0IiBjbGFpbSBtdXN0IGJlIGEgbnVtYmVyJywiaWF0IiwiaW52YWxpZCIpO2lmKHZvaWQgMCE9PWkubmJmKXtpZigibnVtYmVyIiE9dHlwZW9mIGkubmJmKXRocm93IG5ldyBGcignIm5iZiIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsIm5iZiIsImludmFsaWQiKTtpZihpLm5iZj5sK2MpdGhyb3cgbmV3IEZyKCcibmJmIiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkJywibmJmIiwiY2hlY2tfZmFpbGVkIil9aWYodm9pZCAwIT09aS5leHApe2lmKCJudW1iZXIiIT10eXBlb2YgaS5leHApdGhyb3cgbmV3IEZyKCciZXhwIiBjbGFpbSBtdXN0IGJlIGEgbnVtYmVyJywiZXhwIiwiaW52YWxpZCIpO2lmKGkuZXhwPD1sLWMpdGhyb3cgbmV3IEtyKCciZXhwIiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkJywiZXhwIiwiY2hlY2tfZmFpbGVkIil9aWYobi5tYXhUb2tlbkFnZSl7Y29uc3QgZT1sLWkuaWF0O2lmKGUtYz4oIm51bWJlciI9PXR5cGVvZiBuLm1heFRva2VuQWdlP24ubWF4VG9rZW5BZ2U6eWkobi5tYXhUb2tlbkFnZSkpKXRocm93IG5ldyBLcignImlhdCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCAodG9vIGZhciBpbiB0aGUgcGFzdCknLCJpYXQiLCJjaGVja19mYWlsZWQiKTtpZihlPDAtYyl0aHJvdyBuZXcgRnIoJyJpYXQiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQgKGl0IHNob3VsZCBiZSBpbiB0aGUgcGFzdCknLCJpYXQiLCJjaGVja19mYWlsZWQiKX1yZXR1cm4gaX0oaS5wcm90ZWN0ZWRIZWFkZXIsaS5wYXlsb2FkLG4pLHM9e3BheWxvYWQ6byxwcm90ZWN0ZWRIZWFkZXI6aS5wcm90ZWN0ZWRIZWFkZXJ9O3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3suLi5zLGtleTppLmtleX06c31mdW5jdGlvbiBiaShlKXtyZXR1cm4gYWkoZSl9Y2xhc3MgX2l7Y29uc3RydWN0b3IoZSl7aWYodGhpcy5fY2FjaGVkPW5ldyBXZWFrTWFwLCFmdW5jdGlvbihlKXtyZXR1cm4gZSYmIm9iamVjdCI9PXR5cGVvZiBlJiZBcnJheS5pc0FycmF5KGUua2V5cykmJmUua2V5cy5ldmVyeShiaSl9KGUpKXRocm93IG5ldyBZcigiSlNPTiBXZWIgS2V5IFNldCBtYWxmb3JtZWQiKTt2YXIgdDt0aGlzLl9qd2tzPSh0PWUsImZ1bmN0aW9uIj09dHlwZW9mIHN0cnVjdHVyZWRDbG9uZT9zdHJ1Y3R1cmVkQ2xvbmUodCk6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0KSkpfWFzeW5jIGdldEtleShlLHQpe2NvbnN0e2FsZzpuLGtpZDpyfT17Li4uZSwuLi50LmhlYWRlcn0saT1mdW5jdGlvbihlKXtzd2l0Y2goInN0cmluZyI9PXR5cGVvZiBlJiZlLnNsaWNlKDAsMikpe2Nhc2UiUlMiOmNhc2UiUFMiOnJldHVybiJSU0EiO2Nhc2UiRVMiOnJldHVybiJFQyI7Y2FzZSJFZCI6cmV0dXJuIk9LUCI7ZGVmYXVsdDp0aHJvdyBuZXcgV3IoJ1Vuc3VwcG9ydGVkICJhbGciIHZhbHVlIGZvciBhIEpTT04gV2ViIEtleSBTZXQnKX19KG4pLG89dGhpcy5fandrcy5rZXlzLmZpbHRlcigoZT0+e2xldCB0PWk9PT1lLmt0eTtpZih0JiYic3RyaW5nIj09dHlwZW9mIHImJih0PXI9PT1lLmtpZCksdCYmInN0cmluZyI9PXR5cGVvZiBlLmFsZyYmKHQ9bj09PWUuYWxnKSx0JiYic3RyaW5nIj09dHlwZW9mIGUudXNlJiYodD0ic2lnIj09PWUudXNlKSx0JiZBcnJheS5pc0FycmF5KGUua2V5X29wcykmJih0PWUua2V5X29wcy5pbmNsdWRlcygidmVyaWZ5IikpLHQmJiJFZERTQSI9PT1uJiYodD0iRWQyNTUxOSI9PT1lLmNydnx8IkVkNDQ4Ij09PWUuY3J2KSx0KXN3aXRjaChuKXtjYXNlIkVTMjU2Ijp0PSJQLTI1NiI9PT1lLmNydjticmVhaztjYXNlIkVTMjU2SyI6dD0ic2VjcDI1NmsxIj09PWUuY3J2O2JyZWFrO2Nhc2UiRVMzODQiOnQ9IlAtMzg0Ij09PWUuY3J2O2JyZWFrO2Nhc2UiRVM1MTIiOnQ9IlAtNTIxIj09PWUuY3J2fXJldHVybiB0fSkpLHswOnMsbGVuZ3RoOmF9PW87aWYoMD09PWEpdGhyb3cgbmV3IEdyO2lmKDEhPT1hKXRocm93IG5ldyBYcjtjb25zdCBjPXRoaXMuX2NhY2hlZC5nZXQocyl8fHRoaXMuX2NhY2hlZC5zZXQocyx7fSkuZ2V0KHMpO2lmKHZvaWQgMD09PWNbbl0pe2NvbnN0IGU9YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0LG4pe2lmKCFhaShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJKV0sgbXVzdCBiZSBhbiBvYmplY3QiKTtpZih0fHwodD1lLmFsZyksInN0cmluZyIhPXR5cGVvZiB0fHwhdCl0aHJvdyBuZXcgVHlwZUVycm9yKCciYWxnIiBhcmd1bWVudCBpcyByZXF1aXJlZCB3aGVuICJqd2suYWxnIiBpcyBub3QgcHJlc2VudCcpO3N3aXRjaChlLmt0eSl7Y2FzZSJvY3QiOmlmKCJzdHJpbmciIT10eXBlb2YgZS5rfHwhZS5rKXRocm93IG5ldyBUeXBlRXJyb3IoJ21pc3NpbmcgImsiIChLZXkgVmFsdWUpIFBhcmFtZXRlciB2YWx1ZScpO3JldHVybiBudWxsIT1ufHwobj0hMCE9PWUuZXh0KSxuP2NpKHsuLi5lLGFsZzp0LGV4dDohMX0pOnFyKGUuayk7Y2FzZSJSU0EiOmlmKHZvaWQgMCE9PWUub3RoKXRocm93IG5ldyBXcignUlNBIEpXSyAib3RoIiAoT3RoZXIgUHJpbWVzIEluZm8pIFBhcmFtZXRlciB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkJyk7Y2FzZSJFQyI6Y2FzZSJPS1AiOnJldHVybiBjaSh7Li4uZSxhbGc6dH0pO2RlZmF1bHQ6dGhyb3cgbmV3IFdyKCdVbnN1cHBvcnRlZCAia3R5IiAoS2V5IFR5cGUpIFBhcmFtZXRlciB2YWx1ZScpfX0oey4uLnMsZXh0OiEwfSxuKTtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheXx8InB1YmxpYyIhPT1lLnR5cGUpdGhyb3cgbmV3IFlyKCJKU09OIFdlYiBLZXkgU2V0IG1lbWJlcnMgbXVzdCBiZSBwdWJsaWMga2V5cyIpO2Nbbl09ZX1yZXR1cm4gY1tuXX19dmFyIFNpPXtleHBvcnRzOnt9fSxFaT17ZXhwb3J0czp7fX0sUmk9RXIoenQpOwovKiEgc2FmZS1idWZmZXIuIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi8KIWZ1bmN0aW9uKGUsdCl7dmFyIG49Umkscj1uLkJ1ZmZlcjtmdW5jdGlvbiBpKGUsdCl7Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dfWZ1bmN0aW9uIG8oZSx0LG4pe3JldHVybiByKGUsdCxuKX1yLmZyb20mJnIuYWxsb2MmJnIuYWxsb2NVbnNhZmUmJnIuYWxsb2NVbnNhZmVTbG93P2UuZXhwb3J0cz1uOihpKG4sdCksdC5CdWZmZXI9byksby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSksaShyLG8pLG8uZnJvbT1mdW5jdGlvbihlLHQsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIoZSx0LG4pfSxvLmFsbG9jPWZ1bmN0aW9uKGUsdCxuKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3ZhciBpPXIoZSk7cmV0dXJuIHZvaWQgMCE9PXQ/InN0cmluZyI9PXR5cGVvZiBuP2kuZmlsbCh0LG4pOmkuZmlsbCh0KTppLmZpbGwoMCksaX0sby5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiByKGUpfSxvLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBuLlNsb3dCdWZmZXIoZSl9fShFaSxFaS5leHBvcnRzKTt2YXIgVGk9NjU1MzYsa2k9NDI5NDk2NzI5NTt2YXIgQWk9RWkuZXhwb3J0cy5CdWZmZXIsQ2k9X3IuY3J5cHRvfHxfci5tc0NyeXB0bztDaSYmQ2kuZ2V0UmFuZG9tVmFsdWVzP1NpLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihlPmtpKXRocm93IG5ldyBSYW5nZUVycm9yKCJyZXF1ZXN0ZWQgdG9vIG1hbnkgcmFuZG9tIGJ5dGVzIik7dmFyIG49QWkuYWxsb2NVbnNhZmUoZSk7aWYoZT4wKWlmKGU+VGkpZm9yKHZhciByPTA7cjxlO3IrPVRpKUNpLmdldFJhbmRvbVZhbHVlcyhuLnNsaWNlKHIscitUaSkpO2Vsc2UgQ2kuZ2V0UmFuZG9tVmFsdWVzKG4pO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0KXJldHVybiBRLm5leHRUaWNrKChmdW5jdGlvbigpe3QobnVsbCxuKX0pKTtyZXR1cm4gbn06U2kuZXhwb3J0cz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiU2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYnJvd3Nlci5cblVzZSBDaHJvbWUsIEZpcmVmb3ggb3IgSW50ZXJuZXQgRXhwbG9yZXIgMTEiKX07dmFyIE9pPVNpLmV4cG9ydHM7Y2xhc3MgRGl7YmFzZTY0VVJMRW5jb2RlKGUpe3JldHVybiBVci5lbmNvZGUoZSkucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKS5yZXBsYWNlKC89L2csIiIpfWJhc2U2NFVSTERlY29kZShlKXtyZXR1cm4gVXIuZGVjb2RlKGUpLnRvU3RyaW5nKCl9aGFzaFNoYTI1NihlKXtyZXR1cm4gYXQuZnJvbShIcigobmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoZSkpKX1nZW5lcmF0ZVJhbmRvbUJ5dGVzKGUpe3JldHVybiBPaShlKX12ZXJpZnlKd3QoZSx0LG4scixpLG8scyxhKXtjb25zdCB1PXthbGdvcml0aG1zOm4sYXVkaWVuY2U6cixjbG9ja1RvbGVyYW5jZTpzLHN1YmplY3Q6b307cmV0dXJuKG51bGw9PWF8fGEpJiYodS5pc3N1ZXI9aSksd2koZSwobD17a2V5czpbdF19LF9pLnByb3RvdHlwZS5nZXRLZXkuYmluZChuZXcgX2kobCkpKSx1KS50aGVuKCgoKT0+UHJvbWlzZS5yZXNvbHZlKCEwKSkpLmNhdGNoKChlPT57dmFyIHQ7cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBjKCJTUEEtQ1JZUFRPLVVUSUxTLVZKLUlWMDEiLG51bGwhPT0odD1udWxsPT1lP3ZvaWQgMDplLnJlYXNvbikmJnZvaWQgMCE9PXQ/dDpKU09OLnN0cmluZ2lmeShlKSwiIi5jb25jYXQobnVsbD09ZT92b2lkIDA6ZS5jb2RlLCIgIikuY29uY2F0KG51bGw9PWU/dm9pZCAwOmUuY2xhaW0pKSl9KSk7dmFyIGx9fSh0PT57Y29uc3Qgbj1zZWxmO2xldCByO24ub25tZXNzYWdlPW49PntsZXR7ZGF0YTphLHBvcnRzOnV9PW47cmV0dXJuIGUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciBuLGwsZCxoLGYscDtjb25zdCB2PXVbMF07aWYoYS50eXBlPT09eXx8cilzd2l0Y2goYS50eXBlKXtjYXNlIHk6dHJ5e2NvbnN0IG49T2JqZWN0LmFzc2lnbih7fSxhLmRhdGEpO3I9eWllbGQoKHQsbik9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHI9bmV3IGJyLGk9bmV3IERpLG89bmV3IGc7eWllbGQgby5pbml0aWFsaXplKHQscixpKTtjb25zdCBzPW5ldyBBKG8pLGE9bihvLHMpLGM9by5nZXREYXRhTGF5ZXIoKSx1PXdyLmdldEluc3RhbmNlKCk7cmV0dXJuKG51bGw9PXU/dm9pZCAwOnUuaW5pdCkmJih5aWVsZCB1LmluaXQoITAsKHQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIGEuYXR0YWNoVG9rZW5Ub1JlcXVlc3RDb25maWcodCl9KSkpKSkse2Rpc2FibGVIdHRwSGFuZGxlcjooKT0+e2EuZGlzYWJsZUh0dHBIYW5kbGVyKHUpfSxlbmFibGVIdHRwSGFuZGxlcjooKT0+e2EuZW5hYmxlSHR0cEhhbmRsZXIodSl9LGdldEFjY2Vzc1Rva2VuOigpPT5hLmdldEFjY2Vzc1Rva2VuKCksZ2V0QXV0aG9yaXphdGlvblVSTDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gby5nZXRBdXRob3JpemF0aW9uVVJMKHQpLnRoZW4oKHQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciBlO2NvbnN0IG49bnVsbCE9PShlPW5ldyBVUkwodCkuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSkmJnZvaWQgMCE9PWU/ZToiIixyPXlpZWxkIG8uZ2V0UEtDRUNvZGUobik7cmV0dXJue2F1dGhvcml6YXRpb25VUkw6dCxwa2NlOnJ9fSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSl9KSksZ2V0QmFzaWNVc2VySW5mbzooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuZ2V0QmFzaWNVc2VySW5mbygpfSkpLGdldENvbmZpZ0RhdGE6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBjLmdldENvbmZpZ0RhdGEoKX0pKSxnZXRDcnlwdG9IZWxwZXI6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLmdldENyeXB0b0hlbHBlcigpfSkpLGdldERlY29kZWRJRFBJRFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYS5nZXREZWNvZGVkSURQSURUb2tlbigpfSkpLGdldERlY29kZWRJRFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYS5nZXREZWNvZGVkSURUb2tlbigpfSkpLGdldElEVG9rZW46KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLmdldElEVG9rZW4oKX0pKSxnZXRPSURDU2VydmljZUVuZHBvaW50czooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKX0pKSxnZXRTaWduT3V0VVJMOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgby5nZXRTaWduT3V0VVJMKCl9KSksaHR0cFJlcXVlc3Q6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIGEuaHR0cFJlcXVlc3QodSx0KX0pKSxodHRwUmVxdWVzdEFsbDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgYS5odHRwUmVxdWVzdEFsbCh0LHUpfSkpLGlzQXV0aGVudGljYXRlZDooKT0+YS5pc0F1dGhlbnRpY2F0ZWQoKSxyZWZyZXNoQWNjZXNzVG9rZW46KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RyeXtyZXR1cm4geWllbGQgYS5yZWZyZXNoQWNjZXNzVG9rZW4oKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9fSkpLHJlcXVlc3RBY2Nlc3NUb2tlbjoodCxuLHIsaSk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCBhLnJlcXVlc3RBY2Nlc3NUb2tlbih0LG4sdm9pZCAwLHIsaSl9KSkscmVxdWVzdEN1c3RvbUdyYW50OnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCBhLnJlcXVlc3RDdXN0b21HcmFudCh0KX0pKSxyZXZva2VBY2Nlc3NUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCBzLmdldFJlZnJlc2hUaW1lb3V0VGltZXIoKTtyZXR1cm4gby5yZXZva2VBY2Nlc3NUb2tlbigpLnRoZW4oKCgpPT4ocy5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoZSksUHJvbWlzZS5yZXNvbHZlKCEwKSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKX0pKSxzZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrOmU9PnsobnVsbD09dT92b2lkIDA6dS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKSYmdS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKGUpfSxzZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2s6ZT0+eyhudWxsPT11P3ZvaWQgMDp1LnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaykmJnUuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKGUpfSxzZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjazplPT57KG51bGw9PXU/dm9pZCAwOnUuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2spJiZ1LnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpfSxzZXRTZXNzaW9uU3RhdGU6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgYy5zZXRTZXNzaW9uRGF0YVBhcmFtZXRlcigic2Vzc2lvbl9zdGF0ZSIsdCl9KSksc2lnbk91dDooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHMuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCkseWllbGQgby5nZXRTaWduT3V0VVJMKCl9KSksc3RhcnRBdXRvUmVmcmVzaFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtzLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHMucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseShhKX0pKSx1cGRhdGVDb25maWc6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgby51cGRhdGVDb25maWcodCl9KSl9fSkpKShuLHQpLHIuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayhzKSxyLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayhpKSxyLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKG8pLHYucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpfWNhdGNoKGUpe3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9hdXRoX3VybCI6ci5nZXRBdXRob3JpemF0aW9uVVJMKG51bGw9PWE/dm9pZCAwOmEuZGF0YSkudGhlbigoZT0+e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlInJlcXVlc3RfZ2V0X3Rva2VuIjpyLnJlcXVlc3RBY2Nlc3NUb2tlbihudWxsPT09KG49bnVsbD09YT92b2lkIDA6YS5kYXRhKXx8dm9pZCAwPT09bj92b2lkIDA6bi5jb2RlLG51bGw9PT0obD1udWxsPT1hP3ZvaWQgMDphLmRhdGEpfHx2b2lkIDA9PT1sP3ZvaWQgMDpsLnNlc3Npb25TdGF0ZSxudWxsPT09KGQ9bnVsbD09YT92b2lkIDA6YS5kYXRhKXx8dm9pZCAwPT09ZD92b2lkIDA6ZC5wa2NlLG51bGw9PT0oaD1udWxsPT1hP3ZvaWQgMDphLmRhdGEpfHx2b2lkIDA9PT1oP3ZvaWQgMDpoLnN0YXRlKS50aGVuKChlPT57di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UiaHR0cC1yZXF1ZXN0Ijp7Y29uc3QgZT1hLmRhdGEsdD1udWxsPT1lP3ZvaWQgMDplLmRhdGE7aWYoITA9PT0obnVsbD09PShwPW51bGw9PT0oZj1hLmRhdGEpfHx2b2lkIDA9PT1mP3ZvaWQgMDpmLmRhdGEpfHx2b2lkIDA9PT1wP3ZvaWQgMDpwLmZvcm1EYXRhKSl7Y29uc3Qgbj1uZXcgRm9ybURhdGE7Zm9yKGNvbnN0IGUgaW4gdCkiZm9ybURhdGEiIT09ZSYmbi5hcHBlbmQoZSx0W2VdKTtlLmRhdGE9bn1yLmh0dHBSZXF1ZXN0KGUpLnRoZW4oKGU9Pnt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9Pnt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWt9Y2FzZSJodHRwLXN0cmVhbS1yZXF1ZXN0Ijp7Y29uc3QgZT1hLmRhdGE7ZS5hZGFwdGVyPSJmZXRjaCIsZS5yZXNwb25zZVR5cGU9InN0cmVhbSIsci5odHRwUmVxdWVzdChlKS50aGVuKChlPT57dmFyIHQ7Y29uc3Qgbj1udWxsPT09KHQ9ZSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuZGF0YTtuIGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW0/di5wb3N0TWVzc2FnZSh7ZGF0YTpuLHN1Y2Nlc3M6ITB9LFtuXSk6di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrfWNhc2UiaHR0cC1yZXF1ZXN0LWFsbCI6ci5odHRwUmVxdWVzdEFsbChhLmRhdGEpLnRoZW4oKGU9Pnt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9Pnt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJzaWduLW91dCI6dHJ5e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuc2lnbk91dCgpKSl9Y2F0Y2goZSl7di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UicmVxdWVzdC1jdXN0b20tZ3JhbnQiOnIucmVxdWVzdEN1c3RvbUdyYW50KGEuZGF0YSkudGhlbigoZT0+e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlInJldm9rZS1hY2Nlc3MtdG9rZW4iOnIucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKChlPT57di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UiZ2V0LW9pZGMtc2VydmljZS1lbmRwb2ludHMiOnRyeXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCkpKX1jYXRjaChlKXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXQtYmFzaWMtdXNlci1pbmZvIjp0cnl7di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5nZXRCYXNpY1VzZXJJbmZvKCkpKX1jYXRjaChlKXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXQtZGVjb2RlZC1pZC10b2tlbiI6dHJ5e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuZ2V0RGVjb2RlZElEVG9rZW4oKSkpfWNhdGNoKGUpe3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldC1jcnlwdG8taGVscGVyIjp0cnl7di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5nZXRDcnlwdG9IZWxwZXIoKSkpfWNhdGNoKGUpe3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9pZF90b2tlbiI6dHJ5e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuZ2V0SURUb2tlbigpKSl9Y2F0Y2goZSl7di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZW5hYmxlX2h0dHBfaGFuZGxlciI6ci5lbmFibGVIdHRwSGFuZGxlcigpLHYucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpO2JyZWFrO2Nhc2UiZGlzYWJsZV9odHRwX2hhbmRsZXIiOnIuZGlzYWJsZUh0dHBIYW5kbGVyKCksdi5wb3N0TWVzc2FnZShSLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoKSk7YnJlYWs7Y2FzZSJpc19hdXRoZW50aWNhdGVkIjp0cnl7di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5pc0F1dGhlbnRpY2F0ZWQoKSkpfWNhdGNoKGUpe3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9zaWduX291dF91cmwiOnRyeXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLmdldFNpZ25PdXRVUkwoKSkpfWNhdGNoKGUpe3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInJlZnJlc2hfYWNjZXNzLXRva2VuIjp0cnl7di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5yZWZyZXNoQWNjZXNzVG9rZW4oKSkpfWNhdGNoKGUpe3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInN0YXJ0X2F1dG9fcmVmcmVzaF90b2tlbiI6dHJ5e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHIuc3RhcnRBdXRvUmVmcmVzaFRva2VuKCkpKX1jYXRjaChlKXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJzZXRfc2Vzc2lvbl9zdGF0ZSI6dHJ5e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuc2V0U2Vzc2lvblN0YXRlKG51bGw9PWE/dm9pZCAwOmEuZGF0YSkpKX1jYXRjaChlKXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJ1cGRhdGVfY29uZmlnIjp0cnl7di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci51cGRhdGVDb25maWcobnVsbD09YT92b2lkIDA6YS5kYXRhKSkpfWNhdGNoKGUpe3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9jb25maWdfZGF0YSI6dHJ5e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuZ2V0Q29uZmlnRGF0YSgpKSl9Y2F0Y2goZSl7di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2RlZmF1bHQ6bnVsbD09dnx8di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UobmV3IGMoIlNQQS1DTElFTlRfV09SS0VSLU9OTVNHLUlWMDIiLCJUaGUgbWVzc2FnZSB0eXBlIGlzIGludmFsaWQuIiwiVGhlIG1lc3NhZ2UgdHlwZSBwcm92aWRlZCwgIi5jb25jYXQoYS50eXBlLCIsIGlzIGludmFsaWQuIikpKSl9ZWxzZSB2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShuZXcgYygiU1BBLUNMSUVOVF9XT1JLRVItT05NU0ctTkYwMSIsIlRoZSB3ZWIgd29ya2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuIiwiVGhlIGluaXRpYWxpemUgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gY2FuIGJlIGNhcnJpZWQgb3V0LiIpKSl9KSl9O2NvbnN0IGk9KCk9PntuLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXF1ZXN0LXN0YXJ0In0pfSxvPWU9Pnt2YXIgdDsobnVsbD09PSh0PWUpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmRhdGEpaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbXx8bi5wb3N0TWVzc2FnZSh7ZGF0YTpKU09OLnN0cmluZ2lmeShudWxsIT1lP2U6IiIpLHR5cGU6InJlcXVlc3Qtc3VjY2VzcyJ9KX0scz0oKT0+e24ucG9zdE1lc3NhZ2Uoe3R5cGU6InJlcXVlc3QtZmluaXNoIn0pfX0pKCgoZSx0KT0+bmV3IGsoZSx0KSkpO3JldHVybnt9fSgpOwoK",$y=null,eX=!1,function(e){return tX=tX||_y(qy,$y,eX),new Worker(tX,e)});const nX="init",lX="sign-out",oX="http-request",cX="http-request-all",aX="http-stream-request",dX="request-custom-grant",sX="revoke-access-token",rX="request-start",uX="request-success",ZX="request-finish",bX="get-oidc-service-endpoints",hX="get-basic-user-info",mX="get-decoded-id-token",pX="get-crypto-helper",IX="enable_http_handler",GX="disable_http_handler",gX="get_auth_url",yX="request_get_token",XX="is_authenticated",VX="get_sign_out_url",WX="refresh_access-token",CX="refresh-access-token-error",RX="set_session_state",SX="start_auto_refresh_token",vX="update_config",fX="get_id_token",YX="check_session_signed_in",KX="check_session_signed_out",NX="get_config_data",JX="set_session_state_from_iframe",UX="token_request_config";var LX;e.Hooks=void 0,(LX=e.Hooks||(e.Hooks={})).SignIn="sign-in",LX.SignOut="sign-out",LX.Initialize="initialize",LX.HttpRequestStart="http-request-start",LX.HttpRequestFinish="http-request-finish",LX.HttpRequestError="http-request-error",LX.HttpRequestSuccess="http-request-success",LX.RevokeAccessToken="revoke-access-token",LX.CustomGrant="custom-grant",LX.SignOutFailed="sign-out-failed";const HX="rpIFrame",kX="promptNoneIFrame",TX="Y2hlY2tTZXNzaW9u",FX="sign-in-silently",AX="initialized-silent-sign-in",xX="promptNoneRequestSent",BX="error",wX="error_description",zX="custom_grant_config",PX="state",QX="Access token is invalid";var jX;e.Storage=void 0,(jX=e.Storage||(e.Storage={})).LocalStorage="localStorage",jX.SessionStorage="sessionStorage",jX.WebWorker="webWorker",jX.BrowserMemory="browserMemory";class MX{constructor(){}static generateSuccessMessage(e){return{blob:(null==e?void 0:e.data)instanceof Blob?null==e?void 0:e.data:null,data:JSON.stringify(null!=e?e:""),success:!0}}static generateFailureMessage(e){return(null==e?void 0:e.toJSON)&&delete e.toJSON,{error:JSON.stringify(null!=e?e:""),success:!1}}}class EX{constructor(){}static removeAuthorizationCode(){const e=location.href;history.pushState({},document.title,e.replace(/\?code=.*$/,""))}static getPKCE(e){var t;return null!==(t=sessionStorage.getItem(e))&&void 0!==t?t:""}static setPKCE(e,t){sessionStorage.setItem(e,t)}static setSignOutURL(e,t,i){sessionStorage.setItem("".concat(Ay,"-instance_").concat(i,"-").concat(t),e)}static getSignOutURL(e,t){var i;return null!==(i=sessionStorage.getItem("".concat(Ay,"-instance_").concat(t,"-").concat(e)))&&void 0!==i?i:""}static removePKCE(e){sessionStorage.removeItem(e)}static canContinueSignIn(e,t){return!(e&&!EX.hasErrorInURL()&&!EX.hasAuthSearchParamsInURL()&&!t)}static isInitializedSilentSignIn(){return EX.isSilentStatePresentInURL()}static wasSignInCalled(){return!(!EX.hasErrorInURL()&&!EX.hasAuthSearchParamsInURL()||this.isSilentStatePresentInURL())}static wasSilentSignInCalled(){const e=sessionStorage.getItem(AX),t=e?JSON.parse(e):null;return Boolean(t)}static isSignOutSuccessful(){return Uy(this,void 0,void 0,(function*(){if(Dy.isSignOutSuccessful(window.location.href)){const e=window.location.href.split("?")[0];return history.pushState({},document.title,e),yield Dy.clearUserSessionData(),!0}return!1}))}static didSignOutFail(){if(Dy.didSignOutFail(window.location.href)){const e=new URL(window.location.href),t=e.searchParams.get(BX),i=e.searchParams.get(wX),n=window.location.href.split("?")[0];return history.pushState({},document.title,n),{description:null!=i?i:"",error:null!=t?t:""}}return!1}static isSilentStatePresentInURL(){var e;const t=new URL(window.location.href).searchParams.get("state");return null!==(e=null==t?void 0:t.includes(FX))&&void 0!==e&&e}static hasAuthSearchParamsInURL(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.location.search;return/[?&]code=[^&]+/.test(e)}static hasErrorInURL(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.location.href;const t=new URL(e);return!!t.searchParams.get(BX)&&t.searchParams.get(PX)!==xy}static canSendPromptNoneRequest(){const e=sessionStorage.getItem(xX);return!(e?JSON.parse(e):null)}static setPromptNoneRequestSent(e){sessionStorage.setItem(xX,JSON.stringify(e))}static waitTillPageRedirect(e){return Uy(this,void 0,void 0,(function*(){const t=null!=e?e:3e3;yield new Promise((e=>setTimeout(e,1e3*t)))}))}}EX.until=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:500;const i=n=>e()?n():setTimeout((()=>i(n)),t);return new Promise(i)};class OX{constructor(e,t){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer(),this._spaHelper=t,this._instanceID=this._authenticationClient.getInstanceID(),this._isTokenRefreshing=!1}enableHttpHandler(e){(null==e?void 0:e.enableHandler)&&e.enableHandler()}disableHttpHandler(e){(null==e?void 0:e.disableHandler)&&e.disableHandler()}initializeSessionManger(e,t,i,n,l){var o,c,a;l.initialize(e.clientID,null!==(o=t.checkSessionIframe)&&void 0!==o?o:"",i,null!==(c=e.checkSessionInterval)&&void 0!==c?c:3,null!==(a=e.sessionRefreshInterval)&&void 0!==a?a:300,e.signInRedirectURL,n)}requestCustomGrant(e,t){var i,n,l;return Uy(this,void 0,void 0,(function*(){let o=!0,c=!1;if(null==e?void 0:e.tokenEndpoint){o=!1;for(const t of[...null!==(n=null===(i=yield this._dataLayer.getConfigData())||void 0===i?void 0:i.resourceServerURLs)&&void 0!==n?n:[],e.baseUrl])if(t&&(null===(l=e.tokenEndpoint)||void 0===l?void 0:l.startsWith(t))){c=!0;break}}return e.shouldReplayAfterRefresh&&this._dataLayer.setTemporaryDataParameter(zX,JSON.stringify(e)),o||c?this._authenticationClient.requestCustomGrant(e).then((i=>Uy(this,void 0,void 0,(function*(){return t&&"function"==typeof t&&t(e),e.returnsSession?(this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()):i})))).catch((e=>Promise.reject(e))):Promise.reject(new zy("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`"))}))}getCustomGrantConfigData(){return Uy(this,void 0,void 0,(function*(){const e=yield this._dataLayer.getTemporaryDataParameter(zX);return e?JSON.parse(e):null}))}refreshAccessToken(e){return Uy(this,void 0,void 0,(function*(){try{yield this._authenticationClient.refreshAccessToken();const t=yield this.getCustomGrantConfigData();return t&&(yield this.requestCustomGrant(t,e)),this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()}catch(e){const t={type:CX};return window.postMessage(t),Promise.reject(e)}}))}retryFailedRequests(e){return Uy(this,void 0,void 0,(function*(){const t=e.httpClient,i=e.requestConfig,n=e.isHttpHandlerEnabled,l=e.httpErrorCallback,o=e.httpFinishCallback;yield EX.until((()=>!this._isTokenRefreshing));try{const e=yield t.request(i);return Promise.resolve(e)}catch(e){return n&&("function"==typeof l&&(yield l(e)),"function"==typeof o&&o()),Promise.reject(e)}}))}httpRequest(e,t,i,n,l,o){var c,a;return Uy(this,void 0,void 0,(function*(){let d=!1;const s=yield this._dataLayer.getConfigData();for(const e of[...null!==(c=yield null==s?void 0:s.resourceServerURLs)&&void 0!==c?c:[],s.baseUrl])if(e&&(null===(a=null==t?void 0:t.url)||void 0===a?void 0:a.startsWith(e))){d=!0;break}return d?e.request(t).then((e=>Promise.resolve(e))).catch((c=>Uy(this,void 0,void 0,(function*(){var a,d,s;if(401===(null===(a=null==c?void 0:c.response)||void 0===a?void 0:a.status)||!(null==c?void 0:c.response)){if(this._isTokenRefreshing)return this.retryFailedRequests({enableRetrievingSignOutURLFromSession:o,httpClient:e,httpErrorCallback:n,httpFinishCallback:l,isHttpHandlerEnabled:i,requestConfig:t});let a;this._isTokenRefreshing=!0;try{a=yield this.refreshAccessToken(o),this._isTokenRefreshing=!1}catch(e){throw this._isTokenRefreshing=!1,i&&("function"==typeof n&&(yield n(Object.assign(Object.assign({},c),{code:QX}))),"function"==typeof l&&l()),new zy("SPA-AUTH_HELPER-HR-SE01",null!==(d=null==e?void 0:e.name)&&void 0!==d?d:"Refresh token request failed.",null!==(s=null==e?void 0:e.message)&&void 0!==s?s:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(a)try{const i=yield e.request(t);return Promise.resolve(i)}catch(e){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof l&&l()),Promise.reject(e)}}return i&&("function"==typeof n&&(yield n(c)),"function"==typeof l&&l()),Promise.reject(c)})))):Promise.reject(new zy("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`"))}))}httpRequestAll(e,t,i,n,l){var o,c,a;return Uy(this,void 0,void 0,(function*(){let d=!0;const s=yield this._dataLayer.getConfigData();for(const t of e){let e=!1;for(const i of[...null!==(c=null===(o=yield s)||void 0===o?void 0:o.resourceServerURLs)&&void 0!==c?c:[],s.baseUrl])if(i&&(null===(a=t.url)||void 0===a?void 0:a.startsWith(i))){e=!0;break}if(!e){d=!1;break}}const r=[];if(d)return e.forEach((e=>{r.push(t.request(e))})),(null==t?void 0:t.all)&&t.all(r).then((e=>Promise.resolve(e))).catch((e=>Uy(this,void 0,void 0,(function*(){var o,c,a;if(401===(null===(o=null==e?void 0:e.response)||void 0===o?void 0:o.status)||!(null==e?void 0:e.response)){let o;try{o=yield this._authenticationClient.refreshAccessToken()}catch(t){throw i&&("function"==typeof n&&(yield n(Object.assign(Object.assign({},e),{code:QX}))),"function"==typeof l&&l()),new zy("SPA-AUTH_HELPER-HRA-SE01",null!==(c=null==t?void 0:t.name)&&void 0!==c?c:"Refresh token request failed.",null!==(a=null==t?void 0:t.message)&&void 0!==a?a:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(o)return t.all&&t.all(r).then((e=>Promise.resolve(e))).catch((e=>Uy(this,void 0,void 0,(function*(){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof l&&l()),Promise.reject(e)}))))}return i&&("function"==typeof n&&(yield n(e)),"function"==typeof l&&l()),Promise.reject(e)}))));throw new zy("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`")}))}requestAccessToken(t,i,n,l,o,c){return Uy(this,void 0,void 0,(function*(){const a=yield this._dataLayer.getConfigData();if(a.storage===e.Storage.BrowserMemory&&a.enablePKCE&&i){const e=EX.getPKCE(Py.extractPKCEKeyFromStateParam(i));yield this._authenticationClient.setPKCECode(Py.extractPKCEKeyFromStateParam(i),e)}else a.storage===e.Storage.WebWorker&&l&&(yield this._authenticationClient.setPKCECode(l,null!=o?o:""));return t?this._authenticationClient.requestAccessToken(t,null!=i?i:"",null!=o?o:"",void 0,c).then((()=>Uy(this,void 0,void 0,(function*(){return a.storage!==e.Storage.WebWorker?(EX.setSignOutURL(yield this._authenticationClient.getSignOutURL(),a.clientID,this._instanceID),this._spaHelper&&(this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(this)),n&&"function"==typeof n&&a.enableOIDCSessionManagement&&n()):this._spaHelper&&this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()})))).catch((e=>Promise.reject(e))):Promise.reject(new zy("SPA-AUTH_HELPER-RAT1-NF01","No authorization code.","No authorization code was found."))}))}trySignInSilently(e,t,i,n,l){var o;return Uy(this,void 0,void 0,(function*(){if(EX.isInitializedSilentSignIn())return yield i.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const c=document.getElementById(HX),a=null===(o=null==c?void 0:c.contentDocument)||void 0===o?void 0:o.getElementById(kX);try{const t=yield e(n);a.src=t}catch(e){return Promise.reject(e)}return new Promise(((e,i)=>{const n=setTimeout((()=>{e(!1)}),1e4),o=c=>Uy(this,void 0,void 0,(function*(){var a,d,s,r;const u=c.data;(null==u?void 0:u.type)==KX&&(window.removeEventListener("message",o),clearTimeout(n),e(!1)),(null==u?void 0:u.type)==YX&&(null===(a=null==u?void 0:u.data)||void 0===a?void 0:a.code)&&t(null===(d=null==u?void 0:u.data)||void 0===d?void 0:d.code,null===(s=null==u?void 0:u.data)||void 0===s?void 0:s.sessionState,null===(r=null==u?void 0:u.data)||void 0===r?void 0:r.state,l).then((t=>{window.removeEventListener("message",o),e(t)})).catch((e=>{window.removeEventListener("message",o),i(e)})).finally((()=>{clearTimeout(n)}))}));window.addEventListener("message",o)}))}))}handleSignIn(t,i,n){return Uy(this,void 0,void 0,(function*(){const l=yield this._dataLayer.getConfigData();if(yield t())return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});if(l.storage!==e.Storage.WebWorker&&(yield this._authenticationClient.isAuthenticated()))return this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(this),l.enableOIDCSessionManagement&&i(),Promise.resolve(yield this._authenticationClient.getBasicUserInfo());const o=new URL(window.location.href).searchParams.get(BX),c=new URL(window.location.href).searchParams.get(wX);if(o){const e=new URL(window.location.href);throw e.searchParams.delete(BX),e.searchParams.delete(wX),history.pushState(null,document.title,e.toString()),new zy("SPA-AUTH_HELPER-SI-SE01",o,null!=c?c:"")}if(l.storage===e.Storage.WebWorker&&n){const e=yield n();if(e)return e}}))}attachTokenToRequestConfig(e){return Uy(this,void 0,void 0,(function*(){const t=Object.assign({attachToken:!0},e);t.attachToken&&(t.shouldAttachIDPAccessToken?e.headers=Object.assign(Object.assign({},e.headers),{Authorization:"Bearer ".concat(yield this.getIDPAccessToken())}):e.headers=Object.assign(Object.assign({},e.headers),{Authorization:"Bearer ".concat(yield this.getAccessToken())}))}))}getBasicUserInfo(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.getBasicUserInfo()}))}getDecodedIDToken(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.getDecodedIDToken()}))}getDecodedIDPIDToken(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.getDecodedIDToken()}))}getCryptoHelper(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.getCryptoHelper()}))}getIDToken(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.getIDToken()}))}getOIDCServiceEndpoints(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.getOIDCServiceEndpoints()}))}getAccessToken(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.getAccessToken()}))}getIDPAccessToken(){var e;return Uy(this,void 0,void 0,(function*(){return null===(e=yield this._dataLayer.getSessionData())||void 0===e?void 0:e.access_token}))}getDataLayer(){return this._dataLayer}isAuthenticated(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.isAuthenticated()}))}}class DX{constructor(e){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer()}refreshAccessTokenAutomatically(e){var t,i;return Uy(this,void 0,void 0,(function*(){if(!(null!==(i=null===(t=yield this._dataLayer.getConfigData())||void 0===t?void 0:t.periodicTokenRefresh)&&void 0!==i&&i))return;const n=yield this._dataLayer.getSessionData();if(n.refresh_token){const t=parseInt(n.expires_in),i=setTimeout((()=>Uy(this,void 0,void 0,(function*(){yield e.refreshAccessToken()}))),1e3*(t<=10?t:t-10));yield this._dataLayer.setTemporaryDataParameter(Hy,JSON.stringify(i))}}))}getRefreshTimeoutTimer(){return Uy(this,void 0,void 0,(function*(){return(yield this._dataLayer.getTemporaryDataParameter(Hy))?JSON.parse(yield this._dataLayer.getTemporaryDataParameter(Hy)):-1}))}clearRefreshTokenTimeout(e){return Uy(this,void 0,void 0,(function*(){if(e)return void clearTimeout(e);const t=yield this.getRefreshTimeoutTimer();-1!==t&&clearTimeout(t)}))}}const _X=(()=>{let t,i,n,l,o,c,a,d,s,r,u;const Z=(e,a,d,s,r,Z,h)=>{t=e,i=a,n=d,l=s,o=Z,c=r,u=h,l>-1&&b(),c>-1&&(r=setInterval((()=>{p()}),1e3*c))},b=()=>Uy(void 0,void 0,void 0,(function*(){var e;if(!i||!t||!o)return;const c="opIFrame";const a=document.getElementById(HX);(null===(e=null==a?void 0:a.contentDocument)||void 0===e?void 0:e.getElementById(c)).src=i+"?client_id="+t+"&redirect_uri="+o,d=setInterval((function(){var e;return Uy(this,void 0,void 0,(function*(){const l=yield n();if(Boolean(t)&&Boolean(l)){const n="".concat(t," ").concat(l),o=document.getElementById(HX),a=(null===(e=null==o?void 0:o.contentDocument)||void 0===e?void 0:e.getElementById(c)).contentWindow;null==a||a.postMessage(n,i)}}))}),1e3*l),m()})),h=()=>{clearInterval(d),clearInterval(undefined)},m=()=>{null===window||void 0===window||window.addEventListener("message",(function(e){var t;return Uy(this,void 0,void 0,(function*(){const n=i;!n||(null==n?void 0:n.indexOf(e.origin))<0||(null===(t=null==e?void 0:e.data)||void 0===t?void 0:t.type)===JX||"unchanged"===e.data||("error"===e.data?window.location.href=yield a():"changed"===e.data&&p())}))}),!1)},p=()=>Uy(void 0,void 0,void 0,(function*(){var t;const i=document.getElementById(HX),n=null===(t=null==i?void 0:i.contentDocument)||void 0===t?void 0:t.getElementById(kX);if(EX.canSendPromptNoneRequest()){EX.setPromptNoneRequestSent(!0);const t=e=>{var i,n,l;(null===(i=null==e?void 0:e.data)||void 0===i?void 0:i.type)===JX&&(r(null!==(l=null===(n=null==e?void 0:e.data)||void 0===n?void 0:n.data)&&void 0!==l?l:""),null===window||void 0===window||window.removeEventListener("message",t))};s!==e.Storage.BrowserMemory&&s!==e.Storage.WebWorker||null===window||void 0===window||window.addEventListener("message",t);const i=yield u({prompt:"none",response_mode:"query",state:TX});n.src=i}})),I=t=>Uy(void 0,void 0,void 0,(function*(){var i,n;const l=new URL(window.location.href).searchParams.get(PX),o=new URL(window.location.href).searchParams.get(Fy),c=window.parent.parent;if(null!==l&&(l.includes(TX)||l.includes(FX))){const d=new URL(window.location.href).searchParams.get("code");if(null!==d&&0!==d.length){if(l.includes(FX)){const e={data:{code:d,sessionState:null!=o?o:"",state:l},type:YX};return sessionStorage.setItem(AX,"false"),c.postMessage(e,c.origin),EX.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield EX.waitTillPageRedirect(),!0}const a=new URL(window.location.href).searchParams.get("session_state");if(s===e.Storage.LocalStorage||s===e.Storage.SessionStorage)t&&(yield t(a));else{const e={data:null!=a?a:"",type:JX};null===(n=null===(i=null===window||void 0===window?void 0:window.parent)||void 0===i?void 0:i.parent)||void 0===n||n.postMessage(e)}return EX.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield EX.waitTillPageRedirect(),!0}{if(l.includes(FX)){const e={type:KX};return window.parent.parent.postMessage(e,c.origin),EX.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield EX.waitTillPageRedirect(),!0}EX.setPromptNoneRequestSent(!1);const e=yield a();return yield Dy.clearUserSessionData(),c.location.href=e,window.location.href="about:blank",yield EX.waitTillPageRedirect(),!0}}return!1}));return(e,t,i)=>Uy(void 0,void 0,void 0,(function*(){var n;let l=document.createElement("iframe");l.setAttribute("id",HX),l.style.display="none";let o=!1;l.onload=()=>{var e,t,i,n;l=document.getElementById(HX);const c=null==l?void 0:l.contentDocument,a=null==c?void 0:c.createElement("iframe");a&&(a.setAttribute("id","opIFrame"),a.style.display="none");const d=null==c?void 0:c.createElement("iframe");d&&(d.setAttribute("id",kX),d.style.display="none"),a&&(null===(t=null===(e=null==l?void 0:l.contentDocument)||void 0===e?void 0:e.body)||void 0===t||t.appendChild(a)),d&&(null===(n=null===(i=null==l?void 0:l.contentDocument)||void 0===i?void 0:i.body)||void 0===n||n.appendChild(d)),o=!0},null===(n=null===document||void 0===document?void 0:document.body)||void 0===n||n.appendChild(l),a=e,s=t,r=i;for(;!1===o;)yield new Promise((e=>setTimeout(e,1)));return{initialize:Z,receivePromptNoneResponse:I,reset:h}}))})();var qX="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{};function $X(){throw new Error("setTimeout has not been defined")}function eV(){throw new Error("clearTimeout has not been defined")}var tV=$X,iV=eV;function nV(e){if(tV===setTimeout)return setTimeout(e,0);if((tV===$X||!tV)&&setTimeout)return tV=setTimeout,setTimeout(e,0);try{return tV(e,0)}catch(t){try{return tV.call(null,e,0)}catch(t){return tV.call(this,e,0)}}}"function"==typeof qX.setTimeout&&(tV=setTimeout),"function"==typeof qX.clearTimeout&&(iV=clearTimeout);var lV,oV=[],cV=!1,aV=-1;function dV(){cV&&lV&&(cV=!1,lV.length?oV=lV.concat(oV):aV=-1,oV.length&&sV())}function sV(){if(!cV){var e=nV(dV);cV=!0;for(var t=oV.length;t;){for(lV=oV,oV=[];++aV<t;)lV&&lV[aV].run();aV=-1,t=oV.length}lV=null,cV=!1,function(e){if(iV===clearTimeout)return clearTimeout(e);if((iV===eV||!iV)&&clearTimeout)return iV=clearTimeout,clearTimeout(e);try{iV(e)}catch(t){try{return iV.call(null,e)}catch(t){return iV.call(this,e)}}}(e)}}function rV(e,t){this.fun=e,this.array=t}rV.prototype.run=function(){this.fun.apply(null,this.array)};function uV(){}var ZV=uV,bV=uV,hV=uV,mV=uV,pV=uV,IV=uV,GV=uV;var gV=qX.performance||{},yV=gV.now||gV.mozNow||gV.msNow||gV.oNow||gV.webkitNow||function(){return(new Date).getTime()};var XV=new Date;var VV={nextTick:function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)t[i-1]=arguments[i];oV.push(new rV(e,t)),1!==oV.length||cV||nV(sV)},title:"browser",browser:!0,env:{},argv:[],version:"",versions:{},on:ZV,addListener:bV,once:hV,off:mV,removeListener:pV,removeAllListeners:IV,emit:GV,binding:function(e){throw new Error("process.binding is not supported")},cwd:function(){return"/"},chdir:function(e){throw new Error("process.chdir is not supported")},umask:function(){return 0},hrtime:function(e){var t=.001*yV.call(gV),i=Math.floor(t),n=Math.floor(t%1*1e9);return e&&(i-=e[0],(n-=e[1])<0&&(i--,n+=1e9)),[i,n]},platform:"browser",release:{},config:{},uptime:function(){return(new Date-XV)/1e3}},WV=VV;function CV(e,t){return function(){return e.apply(t,arguments)}}const{toString:RV}=Object.prototype,{getPrototypeOf:SV}=Object,{iterator:vV,toStringTag:fV}=Symbol,YV=(KV=Object.create(null),e=>{const t=RV.call(e);return KV[t]||(KV[t]=t.slice(8,-1).toLowerCase())});var KV;const NV=e=>(e=e.toLowerCase(),t=>YV(t)===e),JV=e=>t=>typeof t===e,{isArray:UV}=Array,LV=JV("undefined");function HV(e){return null!==e&&!LV(e)&&null!==e.constructor&&!LV(e.constructor)&&FV(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const kV=NV("ArrayBuffer");const TV=JV("string"),FV=JV("function"),AV=JV("number"),xV=e=>null!==e&&"object"==typeof e,BV=e=>{if("object"!==YV(e))return!1;const t=SV(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||fV in e||vV in e)},wV=NV("Date"),zV=NV("File"),PV=NV("Blob"),QV=NV("FileList");const jV="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==qX?qX:{},MV=void 0!==jV.FormData?jV.FormData:void 0,EV=NV("URLSearchParams"),[OV,DV,_V,qV]=["ReadableStream","Request","Response","Headers"].map(NV);function $V(e,t){let i,n,{allOwnKeys:l=!1}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(null!=e)if("object"!=typeof e&&(e=[e]),UV(e))for(i=0,n=e.length;i<n;i++)t.call(null,e[i],i,e);else{if(HV(e))return;const n=l?Object.getOwnPropertyNames(e):Object.keys(e),o=n.length;let c;for(i=0;i<o;i++)c=n[i],t.call(null,e[c],c,e)}}function eW(e,t){if(HV(e))return null;t=t.toLowerCase();const i=Object.keys(e);let n,l=i.length;for(;l-- >0;)if(n=i[l],t===n.toLowerCase())return n;return null}const tW="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:qX,iW=e=>!LV(e)&&e!==tW;const nW=(e=>t=>e&&t instanceof e)("undefined"!=typeof Uint8Array&&SV(Uint8Array)),lW=NV("HTMLFormElement"),oW=(e=>{let{hasOwnProperty:t}=e;return(e,i)=>t.call(e,i)})(Object.prototype),cW=NV("RegExp"),aW=(e,t)=>{const i=Object.getOwnPropertyDescriptors(e),n={};$V(i,((i,l)=>{let o;!1!==(o=t(i,l,e))&&(n[l]=o||i)})),Object.defineProperties(e,n)};const dW=NV("AsyncFunction"),sW=(rW="function"==typeof setImmediate,uW=FV(tW.postMessage),rW?setImmediate:uW?(ZW="axios@".concat(Math.random()),bW=[],tW.addEventListener("message",(e=>{let{source:t,data:i}=e;t===tW&&i===ZW&&bW.length&&bW.shift()()}),!1),e=>{bW.push(e),tW.postMessage(ZW,"*")}):e=>setTimeout(e));var rW,uW,ZW,bW;const hW="undefined"!=typeof queueMicrotask?queueMicrotask.bind(tW):void 0!==WV&&WV.nextTick||sW;var mW={isArray:UV,isArrayBuffer:kV,isBuffer:HV,isFormData:e=>{let t;return e&&(MV&&e instanceof MV||FV(e.append)&&("formdata"===(t=YV(e))||"object"===t&&FV(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){let t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&kV(e.buffer),t},isString:TV,isNumber:AV,isBoolean:e=>!0===e||!1===e,isObject:xV,isPlainObject:BV,isEmptyObject:e=>{if(!xV(e)||HV(e))return!1;try{return 0===Object.keys(e).length&&Object.getPrototypeOf(e)===Object.prototype}catch(e){return!1}},isReadableStream:OV,isRequest:DV,isResponse:_V,isHeaders:qV,isUndefined:LV,isDate:wV,isFile:zV,isReactNativeBlob:e=>!(!e||void 0===e.uri),isReactNative:e=>e&&void 0!==e.getParts,isBlob:PV,isRegExp:cW,isFunction:FV,isStream:e=>xV(e)&&FV(e.pipe),isURLSearchParams:EV,isTypedArray:nW,isFileList:QV,forEach:$V,merge:function e(){const{caseless:t,skipUndefined:i}=iW(this)&&this||{},n={},l=(l,o)=>{if("__proto__"===o||"constructor"===o||"prototype"===o)return;const c=t&&eW(n,o)||o;BV(n[c])&&BV(l)?n[c]=e(n[c],l):BV(l)?n[c]=e({},l):UV(l)?n[c]=l.slice():i&&LV(l)||(n[c]=l)};for(let e=0,t=arguments.length;e<t;e++)arguments[e]&&$V(arguments[e],l);return n},extend:function(e,t,i){let{allOwnKeys:n}=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return $V(t,((t,n)=>{i&&FV(t)?Object.defineProperty(e,n,{value:CV(t,i),writable:!0,enumerable:!0,configurable:!0}):Object.defineProperty(e,n,{value:t,writable:!0,enumerable:!0,configurable:!0})}),{allOwnKeys:n}),e},trim:e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,i,n)=>{e.prototype=Object.create(t.prototype,n),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{value:t.prototype}),i&&Object.assign(e.prototype,i)},toFlatObject:(e,t,i,n)=>{let l,o,c;const a={};if(t=t||{},null==e)return t;do{for(l=Object.getOwnPropertyNames(e),o=l.length;o-- >0;)c=l[o],n&&!n(c,e,t)||a[c]||(t[c]=e[c],a[c]=!0);e=!1!==i&&SV(e)}while(e&&(!i||i(e,t))&&e!==Object.prototype);return t},kindOf:YV,kindOfTest:NV,endsWith:(e,t,i)=>{e=String(e),(void 0===i||i>e.length)&&(i=e.length),i-=t.length;const n=e.indexOf(t,i);return-1!==n&&n===i},toArray:e=>{if(!e)return null;if(UV(e))return e;let t=e.length;if(!AV(t))return null;const i=new Array(t);for(;t-- >0;)i[t]=e[t];return i},forEachEntry:(e,t)=>{const i=(e&&e[vV]).call(e);let n;for(;(n=i.next())&&!n.done;){const i=n.value;t.call(e,i[0],i[1])}},matchAll:(e,t)=>{let i;const n=[];for(;null!==(i=e.exec(t));)n.push(i);return n},isHTMLForm:lW,hasOwnProperty:oW,hasOwnProp:oW,reduceDescriptors:aW,freezeMethods:e=>{aW(e,((t,i)=>{if(FV(e)&&-1!==["arguments","caller","callee"].indexOf(i))return!1;const n=e[i];FV(n)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+i+"'")}))}))},toObjectSet:(e,t)=>{const i={},n=e=>{e.forEach((e=>{i[e]=!0}))};return UV(e)?n(e):n(String(e).split(t)),i},toCamelCase:e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,i){return t.toUpperCase()+i})),noop:()=>{},toFiniteNumber:(e,t)=>null!=e&&Number.isFinite(e=+e)?e:t,findKey:eW,global:tW,isContextDefined:iW,isSpecCompliantForm:function(e){return!!(e&&FV(e.append)&&"FormData"===e[fV]&&e[vV])},toJSONObject:e=>{const t=new Array(10),i=(e,n)=>{if(xV(e)){if(t.indexOf(e)>=0)return;if(HV(e))return e;if(!("toJSON"in e)){t[n]=e;const l=UV(e)?[]:{};return $V(e,((e,t)=>{const o=i(e,n+1);!LV(o)&&(l[t]=o)})),t[n]=void 0,l}}return e};return i(e,0)},isAsyncFn:dW,isThenable:e=>e&&(xV(e)||FV(e))&&FV(e.then)&&FV(e.catch),setImmediate:sW,asap:hW,isIterable:e=>null!=e&&FV(e[vV])},pW=[],IW=[],GW="undefined"!=typeof Uint8Array?Uint8Array:Array,gW=!1;function yW(){gW=!0;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t=0,i=e.length;t<i;++t)pW[t]=e[t],IW[e.charCodeAt(t)]=t;IW["-".charCodeAt(0)]=62,IW["_".charCodeAt(0)]=63}function XW(e,t,i){for(var n,l,o=[],c=t;c<i;c+=3)n=(e[c]<<16)+(e[c+1]<<8)+e[c+2],o.push(pW[(l=n)>>18&63]+pW[l>>12&63]+pW[l>>6&63]+pW[63&l]);return o.join("")}function VW(e){var t;gW||yW();for(var i=e.length,n=i%3,l="",o=[],c=16383,a=0,d=i-n;a<d;a+=c)o.push(XW(e,a,a+c>d?d:a+c));return 1===n?(t=e[i-1],l+=pW[t>>2],l+=pW[t<<4&63],l+="=="):2===n&&(t=(e[i-2]<<8)+e[i-1],l+=pW[t>>10],l+=pW[t>>4&63],l+=pW[t<<2&63],l+="="),o.push(l),o.join("")}function WW(e,t,i,n,l){var o,c,a=8*l-n-1,d=(1<<a)-1,s=d>>1,r=-7,u=i?l-1:0,Z=i?-1:1,b=e[t+u];for(u+=Z,o=b&(1<<-r)-1,b>>=-r,r+=a;r>0;o=256*o+e[t+u],u+=Z,r-=8);for(c=o&(1<<-r)-1,o>>=-r,r+=n;r>0;c=256*c+e[t+u],u+=Z,r-=8);if(0===o)o=1-s;else{if(o===d)return c?NaN:1/0*(b?-1:1);c+=Math.pow(2,n),o-=s}return(b?-1:1)*c*Math.pow(2,o-n)}function CW(e,t,i,n,l,o){var c,a,d,s=8*o-l-1,r=(1<<s)-1,u=r>>1,Z=23===l?Math.pow(2,-24)-Math.pow(2,-77):0,b=n?0:o-1,h=n?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,c=r):(c=Math.floor(Math.log(t)/Math.LN2),t*(d=Math.pow(2,-c))<1&&(c--,d*=2),(t+=c+u>=1?Z/d:Z*Math.pow(2,1-u))*d>=2&&(c++,d/=2),c+u>=r?(a=0,c=r):c+u>=1?(a=(t*d-1)*Math.pow(2,l),c+=u):(a=t*Math.pow(2,u-1)*Math.pow(2,l),c=0));l>=8;e[i+b]=255&a,b+=h,a/=256,l-=8);for(c=c<<l|a,s+=l;s>0;e[i+b]=255&c,b+=h,c/=256,s-=8);e[i+b-h]|=128*m}var RW={}.toString,SW=Array.isArray||function(e){return"[object Array]"==RW.call(e)};KW.TYPED_ARRAY_SUPPORT=void 0===qX.TYPED_ARRAY_SUPPORT||qX.TYPED_ARRAY_SUPPORT;var vW=fW();function fW(){return KW.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function YW(e,t){if(fW()<t)throw new RangeError("Invalid typed array length");return KW.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=KW.prototype:(null===e&&(e=new KW(t)),e.length=t),e}function KW(e,t,i){if(!(KW.TYPED_ARRAY_SUPPORT||this instanceof KW))return new KW(e,t,i);if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return UW(this,e)}return NW(this,e,t,i)}function NW(e,t,i,n){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,i,n){if(t.byteLength,i<0||t.byteLength<i)throw new RangeError("'offset' is out of bounds");if(t.byteLength<i+(n||0))throw new RangeError("'length' is out of bounds");t=void 0===i&&void 0===n?new Uint8Array(t):void 0===n?new Uint8Array(t,i):new Uint8Array(t,i,n);KW.TYPED_ARRAY_SUPPORT?(e=t).__proto__=KW.prototype:e=LW(e,t);return e}(e,t,i,n):"string"==typeof t?function(e,t,i){"string"==typeof i&&""!==i||(i="utf8");if(!KW.isEncoding(i))throw new TypeError('"encoding" must be a valid string encoding');var n=0|TW(t,i),l=(e=YW(e,n)).write(t,i);l!==n&&(e=e.slice(0,l));return e}(e,t,i):function(e,t){if(kW(t)){var i=0|HW(t.length);return 0===(e=YW(e,i)).length||t.copy(e,0,0,i),e}if(t){if("undefined"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||"length"in t)return"number"!=typeof t.length||(n=t.length)!=n?YW(e,0):LW(e,t);if("Buffer"===t.type&&SW(t.data))return LW(e,t.data)}var n;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function JW(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function UW(e,t){if(JW(t),e=YW(e,t<0?0:0|HW(t)),!KW.TYPED_ARRAY_SUPPORT)for(var i=0;i<t;++i)e[i]=0;return e}function LW(e,t){var i=t.length<0?0:0|HW(t.length);e=YW(e,i);for(var n=0;n<i;n+=1)e[n]=255&t[n];return e}function HW(e){if(e>=fW())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+fW().toString(16)+" bytes");return 0|e}function kW(e){return!(null==e||!e._isBuffer)}function TW(e,t){if(kW(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var i=e.length;if(0===i)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return i;case"utf8":case"utf-8":case void 0:return rC(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*i;case"hex":return i>>>1;case"base64":return uC(e).length;default:if(n)return rC(e).length;t=(""+t).toLowerCase(),n=!0}}function FW(e,t,i){var n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===i||i>this.length)&&(i=this.length),i<=0)return"";if((i>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return $W(this,t,i);case"utf8":case"utf-8":return OW(this,t,i);case"ascii":return _W(this,t,i);case"latin1":case"binary":return qW(this,t,i);case"base64":return EW(this,t,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return eC(this,t,i);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function AW(e,t,i){var n=e[t];e[t]=e[i],e[i]=n}function xW(e,t,i,n,l){if(0===e.length)return-1;if("string"==typeof i?(n=i,i=0):i>2147483647?i=2147483647:i<-2147483648&&(i=-2147483648),i=+i,isNaN(i)&&(i=l?0:e.length-1),i<0&&(i=e.length+i),i>=e.length){if(l)return-1;i=e.length-1}else if(i<0){if(!l)return-1;i=0}if("string"==typeof t&&(t=KW.from(t,n)),kW(t))return 0===t.length?-1:BW(e,t,i,n,l);if("number"==typeof t)return t&=255,KW.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?l?Uint8Array.prototype.indexOf.call(e,t,i):Uint8Array.prototype.lastIndexOf.call(e,t,i):BW(e,[t],i,n,l);throw new TypeError("val must be string, number or Buffer")}function BW(e,t,i,n,l){var o,c=1,a=e.length,d=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;c=2,a/=2,d/=2,i/=2}function s(e,t){return 1===c?e[t]:e.readUInt16BE(t*c)}if(l){var r=-1;for(o=i;o<a;o++)if(s(e,o)===s(t,-1===r?0:o-r)){if(-1===r&&(r=o),o-r+1===d)return r*c}else-1!==r&&(o-=o-r),r=-1}else for(i+d>a&&(i=a-d),o=i;o>=0;o--){for(var u=!0,Z=0;Z<d;Z++)if(s(e,o+Z)!==s(t,Z)){u=!1;break}if(u)return o}return-1}function wW(e,t,i,n){i=Number(i)||0;var l=e.length-i;n?(n=Number(n))>l&&(n=l):n=l;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var c=0;c<n;++c){var a=parseInt(t.substr(2*c,2),16);if(isNaN(a))return c;e[i+c]=a}return c}function zW(e,t,i,n){return ZC(rC(t,e.length-i),e,i,n)}function PW(e,t,i,n){return ZC(function(e){for(var t=[],i=0;i<e.length;++i)t.push(255&e.charCodeAt(i));return t}(t),e,i,n)}function QW(e,t,i,n){return PW(e,t,i,n)}function jW(e,t,i,n){return ZC(uC(t),e,i,n)}function MW(e,t,i,n){return ZC(function(e,t){for(var i,n,l,o=[],c=0;c<e.length&&!((t-=2)<0);++c)n=(i=e.charCodeAt(c))>>8,l=i%256,o.push(l),o.push(n);return o}(t,e.length-i),e,i,n)}function EW(e,t,i){return 0===t&&i===e.length?VW(e):VW(e.slice(t,i))}function OW(e,t,i){i=Math.min(e.length,i);for(var n=[],l=t;l<i;){var o,c,a,d,s=e[l],r=null,u=s>239?4:s>223?3:s>191?2:1;if(l+u<=i)switch(u){case 1:s<128&&(r=s);break;case 2:128==(192&(o=e[l+1]))&&(d=(31&s)<<6|63&o)>127&&(r=d);break;case 3:o=e[l+1],c=e[l+2],128==(192&o)&&128==(192&c)&&(d=(15&s)<<12|(63&o)<<6|63&c)>2047&&(d<55296||d>57343)&&(r=d);break;case 4:o=e[l+1],c=e[l+2],a=e[l+3],128==(192&o)&&128==(192&c)&&128==(192&a)&&(d=(15&s)<<18|(63&o)<<12|(63&c)<<6|63&a)>65535&&d<1114112&&(r=d)}null===r?(r=65533,u=1):r>65535&&(r-=65536,n.push(r>>>10&1023|55296),r=56320|1023&r),n.push(r),l+=u}return function(e){var t=e.length;if(t<=DW)return String.fromCharCode.apply(String,e);var i="",n=0;for(;n<t;)i+=String.fromCharCode.apply(String,e.slice(n,n+=DW));return i}(n)}KW.poolSize=8192,KW._augment=function(e){return e.__proto__=KW.prototype,e},KW.from=function(e,t,i){return NW(null,e,t,i)},KW.TYPED_ARRAY_SUPPORT&&(KW.prototype.__proto__=Uint8Array.prototype,KW.__proto__=Uint8Array),KW.alloc=function(e,t,i){return function(e,t,i,n){return JW(t),t<=0?YW(e,t):void 0!==i?"string"==typeof n?YW(e,t).fill(i,n):YW(e,t).fill(i):YW(e,t)}(null,e,t,i)},KW.allocUnsafe=function(e){return UW(null,e)},KW.allocUnsafeSlow=function(e){return UW(null,e)},KW.isBuffer=bC,KW.compare=function(e,t){if(!kW(e)||!kW(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var i=e.length,n=t.length,l=0,o=Math.min(i,n);l<o;++l)if(e[l]!==t[l]){i=e[l],n=t[l];break}return i<n?-1:n<i?1:0},KW.isEncoding=function(e){switch(String(e).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}},KW.concat=function(e,t){if(!SW(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return KW.alloc(0);var i;if(void 0===t)for(t=0,i=0;i<e.length;++i)t+=e[i].length;var n=KW.allocUnsafe(t),l=0;for(i=0;i<e.length;++i){var o=e[i];if(!kW(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(n,l),l+=o.length}return n},KW.byteLength=TW,KW.prototype._isBuffer=!0,KW.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)AW(this,t,t+1);return this},KW.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)AW(this,t,t+3),AW(this,t+1,t+2);return this},KW.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)AW(this,t,t+7),AW(this,t+1,t+6),AW(this,t+2,t+5),AW(this,t+3,t+4);return this},KW.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?OW(this,0,e):FW.apply(this,arguments)},KW.prototype.equals=function(e){if(!kW(e))throw new TypeError("Argument must be a Buffer");return this===e||0===KW.compare(this,e)},KW.prototype.inspect=function(){var e="";return this.length>0&&(e=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(e+=" ... ")),"<Buffer "+e+">"},KW.prototype.compare=function(e,t,i,n,l){if(!kW(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===i&&(i=e?e.length:0),void 0===n&&(n=0),void 0===l&&(l=this.length),t<0||i>e.length||n<0||l>this.length)throw new RangeError("out of range index");if(n>=l&&t>=i)return 0;if(n>=l)return-1;if(t>=i)return 1;if(this===e)return 0;for(var o=(l>>>=0)-(n>>>=0),c=(i>>>=0)-(t>>>=0),a=Math.min(o,c),d=this.slice(n,l),s=e.slice(t,i),r=0;r<a;++r)if(d[r]!==s[r]){o=d[r],c=s[r];break}return o<c?-1:c<o?1:0},KW.prototype.includes=function(e,t,i){return-1!==this.indexOf(e,t,i)},KW.prototype.indexOf=function(e,t,i){return xW(this,e,t,i,!0)},KW.prototype.lastIndexOf=function(e,t,i){return xW(this,e,t,i,!1)},KW.prototype.write=function(e,t,i,n){if(void 0===t)n="utf8",i=this.length,t=0;else if(void 0===i&&"string"==typeof t)n=t,i=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t|=0,isFinite(i)?(i|=0,void 0===n&&(n="utf8")):(n=i,i=void 0)}var l=this.length-t;if((void 0===i||i>l)&&(i=l),e.length>0&&(i<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return wW(this,e,t,i);case"utf8":case"utf-8":return zW(this,e,t,i);case"ascii":return PW(this,e,t,i);case"latin1":case"binary":return QW(this,e,t,i);case"base64":return jW(this,e,t,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return MW(this,e,t,i);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},KW.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var DW=4096;function _W(e,t,i){var n="";i=Math.min(e.length,i);for(var l=t;l<i;++l)n+=String.fromCharCode(127&e[l]);return n}function qW(e,t,i){var n="";i=Math.min(e.length,i);for(var l=t;l<i;++l)n+=String.fromCharCode(e[l]);return n}function $W(e,t,i){var n=e.length;(!t||t<0)&&(t=0),(!i||i<0||i>n)&&(i=n);for(var l="",o=t;o<i;++o)l+=sC(e[o]);return l}function eC(e,t,i){for(var n=e.slice(t,i),l="",o=0;o<n.length;o+=2)l+=String.fromCharCode(n[o]+256*n[o+1]);return l}function tC(e,t,i){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>i)throw new RangeError("Trying to access beyond buffer length")}function iC(e,t,i,n,l,o){if(!kW(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>l||t<o)throw new RangeError('"value" argument is out of bounds');if(i+n>e.length)throw new RangeError("Index out of range")}function nC(e,t,i,n){t<0&&(t=65535+t+1);for(var l=0,o=Math.min(e.length-i,2);l<o;++l)e[i+l]=(t&255<<8*(n?l:1-l))>>>8*(n?l:1-l)}function lC(e,t,i,n){t<0&&(t=4294967295+t+1);for(var l=0,o=Math.min(e.length-i,4);l<o;++l)e[i+l]=t>>>8*(n?l:3-l)&255}function oC(e,t,i,n,l,o){if(i+n>e.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("Index out of range")}function cC(e,t,i,n,l){return l||oC(e,0,i,4),CW(e,t,i,n,23,4),i+4}function aC(e,t,i,n,l){return l||oC(e,0,i,8),CW(e,t,i,n,52,8),i+8}KW.prototype.slice=function(e,t){var i,n=this.length;if((e=~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),(t=void 0===t?n:~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),t<e&&(t=e),KW.TYPED_ARRAY_SUPPORT)(i=this.subarray(e,t)).__proto__=KW.prototype;else{var l=t-e;i=new KW(l,void 0);for(var o=0;o<l;++o)i[o]=this[o+e]}return i},KW.prototype.readUIntLE=function(e,t,i){e|=0,t|=0,i||tC(e,t,this.length);for(var n=this[e],l=1,o=0;++o<t&&(l*=256);)n+=this[e+o]*l;return n},KW.prototype.readUIntBE=function(e,t,i){e|=0,t|=0,i||tC(e,t,this.length);for(var n=this[e+--t],l=1;t>0&&(l*=256);)n+=this[e+--t]*l;return n},KW.prototype.readUInt8=function(e,t){return t||tC(e,1,this.length),this[e]},KW.prototype.readUInt16LE=function(e,t){return t||tC(e,2,this.length),this[e]|this[e+1]<<8},KW.prototype.readUInt16BE=function(e,t){return t||tC(e,2,this.length),this[e]<<8|this[e+1]},KW.prototype.readUInt32LE=function(e,t){return t||tC(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},KW.prototype.readUInt32BE=function(e,t){return t||tC(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},KW.prototype.readIntLE=function(e,t,i){e|=0,t|=0,i||tC(e,t,this.length);for(var n=this[e],l=1,o=0;++o<t&&(l*=256);)n+=this[e+o]*l;return n>=(l*=128)&&(n-=Math.pow(2,8*t)),n},KW.prototype.readIntBE=function(e,t,i){e|=0,t|=0,i||tC(e,t,this.length);for(var n=t,l=1,o=this[e+--n];n>0&&(l*=256);)o+=this[e+--n]*l;return o>=(l*=128)&&(o-=Math.pow(2,8*t)),o},KW.prototype.readInt8=function(e,t){return t||tC(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},KW.prototype.readInt16LE=function(e,t){t||tC(e,2,this.length);var i=this[e]|this[e+1]<<8;return 32768&i?4294901760|i:i},KW.prototype.readInt16BE=function(e,t){t||tC(e,2,this.length);var i=this[e+1]|this[e]<<8;return 32768&i?4294901760|i:i},KW.prototype.readInt32LE=function(e,t){return t||tC(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},KW.prototype.readInt32BE=function(e,t){return t||tC(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},KW.prototype.readFloatLE=function(e,t){return t||tC(e,4,this.length),WW(this,e,!0,23,4)},KW.prototype.readFloatBE=function(e,t){return t||tC(e,4,this.length),WW(this,e,!1,23,4)},KW.prototype.readDoubleLE=function(e,t){return t||tC(e,8,this.length),WW(this,e,!0,52,8)},KW.prototype.readDoubleBE=function(e,t){return t||tC(e,8,this.length),WW(this,e,!1,52,8)},KW.prototype.writeUIntLE=function(e,t,i,n){(e=+e,t|=0,i|=0,n)||iC(this,e,t,i,Math.pow(2,8*i)-1,0);var l=1,o=0;for(this[t]=255&e;++o<i&&(l*=256);)this[t+o]=e/l&255;return t+i},KW.prototype.writeUIntBE=function(e,t,i,n){(e=+e,t|=0,i|=0,n)||iC(this,e,t,i,Math.pow(2,8*i)-1,0);var l=i-1,o=1;for(this[t+l]=255&e;--l>=0&&(o*=256);)this[t+l]=e/o&255;return t+i},KW.prototype.writeUInt8=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,1,255,0),KW.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},KW.prototype.writeUInt16LE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,2,65535,0),KW.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):nC(this,e,t,!0),t+2},KW.prototype.writeUInt16BE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,2,65535,0),KW.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):nC(this,e,t,!1),t+2},KW.prototype.writeUInt32LE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,4,4294967295,0),KW.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):lC(this,e,t,!0),t+4},KW.prototype.writeUInt32BE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,4,4294967295,0),KW.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):lC(this,e,t,!1),t+4},KW.prototype.writeIntLE=function(e,t,i,n){if(e=+e,t|=0,!n){var l=Math.pow(2,8*i-1);iC(this,e,t,i,l-1,-l)}var o=0,c=1,a=0;for(this[t]=255&e;++o<i&&(c*=256);)e<0&&0===a&&0!==this[t+o-1]&&(a=1),this[t+o]=(e/c>>0)-a&255;return t+i},KW.prototype.writeIntBE=function(e,t,i,n){if(e=+e,t|=0,!n){var l=Math.pow(2,8*i-1);iC(this,e,t,i,l-1,-l)}var o=i-1,c=1,a=0;for(this[t+o]=255&e;--o>=0&&(c*=256);)e<0&&0===a&&0!==this[t+o+1]&&(a=1),this[t+o]=(e/c>>0)-a&255;return t+i},KW.prototype.writeInt8=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,1,127,-128),KW.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},KW.prototype.writeInt16LE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,2,32767,-32768),KW.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):nC(this,e,t,!0),t+2},KW.prototype.writeInt16BE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,2,32767,-32768),KW.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):nC(this,e,t,!1),t+2},KW.prototype.writeInt32LE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,4,2147483647,-2147483648),KW.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):lC(this,e,t,!0),t+4},KW.prototype.writeInt32BE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),KW.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):lC(this,e,t,!1),t+4},KW.prototype.writeFloatLE=function(e,t,i){return cC(this,e,t,!0,i)},KW.prototype.writeFloatBE=function(e,t,i){return cC(this,e,t,!1,i)},KW.prototype.writeDoubleLE=function(e,t,i){return aC(this,e,t,!0,i)},KW.prototype.writeDoubleBE=function(e,t,i){return aC(this,e,t,!1,i)},KW.prototype.copy=function(e,t,i,n){if(i||(i=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n<i&&(n=i),n===i)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(i<0||i>=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t<n-i&&(n=e.length-t+i);var l,o=n-i;if(this===e&&i<t&&t<n)for(l=o-1;l>=0;--l)e[l+t]=this[l+i];else if(o<1e3||!KW.TYPED_ARRAY_SUPPORT)for(l=0;l<o;++l)e[l+t]=this[l+i];else Uint8Array.prototype.set.call(e,this.subarray(i,i+o),t);return o},KW.prototype.fill=function(e,t,i,n){if("string"==typeof e){if("string"==typeof t?(n=t,t=0,i=this.length):"string"==typeof i&&(n=i,i=this.length),1===e.length){var l=e.charCodeAt(0);l<256&&(e=l)}if(void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!KW.isEncoding(n))throw new TypeError("Unknown encoding: "+n)}else"number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<i)throw new RangeError("Out of range index");if(i<=t)return this;var o;if(t>>>=0,i=void 0===i?this.length:i>>>0,e||(e=0),"number"==typeof e)for(o=t;o<i;++o)this[o]=e;else{var c=kW(e)?e:rC(new KW(e,n).toString()),a=c.length;for(o=0;o<i-t;++o)this[o+t]=c[o%a]}return this};var dC=/[^+\/0-9A-Za-z-_]/g;function sC(e){return e<16?"0"+e.toString(16):e.toString(16)}function rC(e,t){var i;t=t||1/0;for(var n=e.length,l=null,o=[],c=0;c<n;++c){if((i=e.charCodeAt(c))>55295&&i<57344){if(!l){if(i>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(c+1===n){(t-=3)>-1&&o.push(239,191,189);continue}l=i;continue}if(i<56320){(t-=3)>-1&&o.push(239,191,189),l=i;continue}i=65536+(l-55296<<10|i-56320)}else l&&(t-=3)>-1&&o.push(239,191,189);if(l=null,i<128){if((t-=1)<0)break;o.push(i)}else if(i<2048){if((t-=2)<0)break;o.push(i>>6|192,63&i|128)}else if(i<65536){if((t-=3)<0)break;o.push(i>>12|224,i>>6&63|128,63&i|128)}else{if(!(i<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(i>>18|240,i>>12&63|128,i>>6&63|128,63&i|128)}}return o}function uC(e){return function(e){var t,i,n,l,o,c;gW||yW();var a=e.length;if(a%4>0)throw new Error("Invalid string. Length must be a multiple of 4");o="="===e[a-2]?2:"="===e[a-1]?1:0,c=new GW(3*a/4-o),n=o>0?a-4:a;var d=0;for(t=0,i=0;t<n;t+=4,i+=3)l=IW[e.charCodeAt(t)]<<18|IW[e.charCodeAt(t+1)]<<12|IW[e.charCodeAt(t+2)]<<6|IW[e.charCodeAt(t+3)],c[d++]=l>>16&255,c[d++]=l>>8&255,c[d++]=255&l;return 2===o?(l=IW[e.charCodeAt(t)]<<2|IW[e.charCodeAt(t+1)]>>4,c[d++]=255&l):1===o&&(l=IW[e.charCodeAt(t)]<<10|IW[e.charCodeAt(t+1)]<<4|IW[e.charCodeAt(t+2)]>>2,c[d++]=l>>8&255,c[d++]=255&l),c}(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(dC,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function ZC(e,t,i,n){for(var l=0;l<n&&!(l+i>=t.length||l>=e.length);++l)t[l+i]=e[l];return l}function bC(e){return null!=e&&(!!e._isBuffer||hC(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&hC(e.slice(0,0))}(e))}function hC(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}var mC=Object.freeze({__proto__:null,Buffer:KW,INSPECT_MAX_BYTES:50,SlowBuffer:function(e){return+e!=e&&(e=0),KW.alloc(+e)},isBuffer:bC,kMaxLength:vW});class pC extends Error{static from(e,t,i,n,l,o){const c=new pC(e.message,t||e.code,i,n,l);return c.cause=e,c.name=e.name,null!=e.status&&null==c.status&&(c.status=e.status),o&&Object.assign(c,o),c}constructor(e,t,i,n,l){super(e),Object.defineProperty(this,"message",{value:e,enumerable:!0,writable:!0,configurable:!0}),this.name="AxiosError",this.isAxiosError=!0,t&&(this.code=t),i&&(this.config=i),n&&(this.request=n),l&&(this.response=l,this.status=l.status)}toJSON(){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:mW.toJSONObject(this.config),code:this.code,status:this.status}}}pC.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE",pC.ERR_BAD_OPTION="ERR_BAD_OPTION",pC.ECONNABORTED="ECONNABORTED",pC.ETIMEDOUT="ETIMEDOUT",pC.ERR_NETWORK="ERR_NETWORK",pC.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS",pC.ERR_DEPRECATED="ERR_DEPRECATED",pC.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE",pC.ERR_BAD_REQUEST="ERR_BAD_REQUEST",pC.ERR_CANCELED="ERR_CANCELED",pC.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT",pC.ERR_INVALID_URL="ERR_INVALID_URL";var IC=pC;function GC(e){return mW.isPlainObject(e)||mW.isArray(e)}function gC(e){return mW.endsWith(e,"[]")?e.slice(0,-2):e}function yC(e,t,i){return e?e.concat(t).map((function(e,t){return e=gC(e),!i&&t?"["+e+"]":e})).join(i?".":""):t}const XC=mW.toFlatObject(mW,{},null,(function(e){return/^is[A-Z]/.test(e)}));function VC(e,t,i){if(!mW.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;const n=(i=mW.toFlatObject(i,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!mW.isUndefined(t[e])}))).metaTokens,l=i.visitor||s,o=i.dots,c=i.indexes,a=(i.Blob||"undefined"!=typeof Blob&&Blob)&&mW.isSpecCompliantForm(t);if(!mW.isFunction(l))throw new TypeError("visitor must be a function");function d(e){if(null===e)return"";if(mW.isDate(e))return e.toISOString();if(mW.isBoolean(e))return e.toString();if(!a&&mW.isBlob(e))throw new IC("Blob is not supported. Use a Buffer instead.");return mW.isArrayBuffer(e)||mW.isTypedArray(e)?a&&"function"==typeof Blob?new Blob([e]):KW.from(e):e}function s(e,i,l){let a=e;if(mW.isReactNative(t)&&mW.isReactNativeBlob(e))return t.append(yC(l,i,o),d(e)),!1;if(e&&!l&&"object"==typeof e)if(mW.endsWith(i,"{}"))i=n?i:i.slice(0,-2),e=JSON.stringify(e);else if(mW.isArray(e)&&function(e){return mW.isArray(e)&&!e.some(GC)}(e)||(mW.isFileList(e)||mW.endsWith(i,"[]"))&&(a=mW.toArray(e)))return i=gC(i),a.forEach((function(e,n){!mW.isUndefined(e)&&null!==e&&t.append(!0===c?yC([i],n,o):null===c?i:i+"[]",d(e))})),!1;return!!GC(e)||(t.append(yC(l,i,o),d(e)),!1)}const r=[],u=Object.assign(XC,{defaultVisitor:s,convertValue:d,isVisitable:GC});if(!mW.isObject(e))throw new TypeError("data must be an object");return function e(i,n){if(!mW.isUndefined(i)){if(-1!==r.indexOf(i))throw Error("Circular reference detected in "+n.join("."));r.push(i),mW.forEach(i,(function(i,o){!0===(!(mW.isUndefined(i)||null===i)&&l.call(t,i,mW.isString(o)?o.trim():o,n,u))&&e(i,n?n.concat(o):[o])})),r.pop()}}(e),t}function WC(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function CC(e,t){this._pairs=[],e&&VC(e,this,t)}const RC=CC.prototype;function SC(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function vC(e,t,i){if(!t)return e;const n=i&&i.encode||SC,l=mW.isFunction(i)?{serialize:i}:i,o=l&&l.serialize;let c;if(c=o?o(t,l):mW.isURLSearchParams(t)?t.toString():new CC(t,l).toString(n),c){const t=e.indexOf("#");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+c}return e}RC.append=function(e,t){this._pairs.push([e,t])},RC.toString=function(e){const t=e?function(t){return e.call(this,t,WC)}:WC;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var fC=class{constructor(){this.handlers=[]}use(e,t,i){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!i&&i.synchronous,runWhen:i?i.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){mW.forEach(this.handlers,(function(t){null!==t&&e(t)}))}},YC={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0},KC={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:CC,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]};const NC="undefined"!=typeof window&&"undefined"!=typeof document,JC="object"==typeof navigator&&navigator||void 0,UC=NC&&(!JC||["ReactNative","NativeScript","NS"].indexOf(JC.product)<0),LC="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,HC=NC&&window.location.href||"http://localhost";var kC={...Object.freeze({__proto__:null,hasBrowserEnv:NC,hasStandardBrowserWebWorkerEnv:LC,hasStandardBrowserEnv:UC,navigator:JC,origin:HC}),...KC};function TC(e){function t(e,i,n,l){let o=e[l++];if("__proto__"===o)return!0;const c=Number.isFinite(+o),a=l>=e.length;if(o=!o&&mW.isArray(n)?n.length:o,a)return mW.hasOwnProp(n,o)?n[o]=[n[o],i]:n[o]=i,!c;n[o]&&mW.isObject(n[o])||(n[o]=[]);return t(e,i,n[o],l)&&mW.isArray(n[o])&&(n[o]=function(e){const t={},i=Object.keys(e);let n;const l=i.length;let o;for(n=0;n<l;n++)o=i[n],t[o]=e[o];return t}(n[o])),!c}if(mW.isFormData(e)&&mW.isFunction(e.entries)){const i={};return mW.forEachEntry(e,((e,n)=>{t(function(e){return mW.matchAll(/\w+|\[(\w*)]/g,e).map((e=>"[]"===e[0]?"":e[1]||e[0]))}(e),n,i,0)})),i}return null}const FC={transitional:YC,adapter:["xhr","http","fetch"],transformRequest:[function(e,t){const i=t.getContentType()||"",n=i.indexOf("application/json")>-1,l=mW.isObject(e);l&&mW.isHTMLForm(e)&&(e=new FormData(e));if(mW.isFormData(e))return n?JSON.stringify(TC(e)):e;if(mW.isArrayBuffer(e)||mW.isBuffer(e)||mW.isStream(e)||mW.isFile(e)||mW.isBlob(e)||mW.isReadableStream(e))return e;if(mW.isArrayBufferView(e))return e.buffer;if(mW.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let o;if(l){if(i.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return VC(e,new kC.classes.URLSearchParams,{visitor:function(e,t,i,n){return kC.isNode&&mW.isBuffer(e)?(this.append(t,e.toString("base64")),!1):n.defaultVisitor.apply(this,arguments)},...t})}(e,this.formSerializer).toString();if((o=mW.isFileList(e))||i.indexOf("multipart/form-data")>-1){const t=this.env&&this.env.FormData;return VC(o?{"files[]":e}:e,t&&new t,this.formSerializer)}}return l||n?(t.setContentType("application/json",!1),function(e,t,i){if(mW.isString(e))try{return(t||JSON.parse)(e),mW.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(i||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||FC.transitional,i=t&&t.forcedJSONParsing,n="json"===this.responseType;if(mW.isResponse(e)||mW.isReadableStream(e))return e;if(e&&mW.isString(e)&&(i&&!this.responseType||n)){const i=!(t&&t.silentJSONParsing)&&n;try{return JSON.parse(e,this.parseReviver)}catch(e){if(i){if("SyntaxError"===e.name)throw IC.from(e,IC.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:kC.classes.FormData,Blob:kC.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};mW.forEach(["delete","get","head","post","put","patch"],(e=>{FC.headers[e]={}}));var AC=FC;const xC=mW.toObjectSet(["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"]);const BC=Symbol("internals");function wC(e){return e&&String(e).trim().toLowerCase()}function zC(e){return!1===e||null==e?e:mW.isArray(e)?e.map(zC):String(e)}function PC(e,t,i,n,l){return mW.isFunction(n)?n.call(this,t,i):(l&&(t=i),mW.isString(t)?mW.isString(n)?-1!==t.indexOf(n):mW.isRegExp(n)?n.test(t):void 0:void 0)}class QC{constructor(e){e&&this.set(e)}set(e,t,i){const n=this;function l(e,t,i){const l=wC(t);if(!l)throw new Error("header name must be a non-empty string");const o=mW.findKey(n,l);(!o||void 0===n[o]||!0===i||void 0===i&&!1!==n[o])&&(n[o||t]=zC(e))}const o=(e,t)=>mW.forEach(e,((e,i)=>l(e,i,t)));if(mW.isPlainObject(e)||e instanceof this.constructor)o(e,t);else if(mW.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))o((e=>{const t={};let i,n,l;return e&&e.split("\n").forEach((function(e){l=e.indexOf(":"),i=e.substring(0,l).trim().toLowerCase(),n=e.substring(l+1).trim(),!i||t[i]&&xC[i]||("set-cookie"===i?t[i]?t[i].push(n):t[i]=[n]:t[i]=t[i]?t[i]+", "+n:n)})),t})(e),t);else if(mW.isObject(e)&&mW.isIterable(e)){let i,n,l={};for(const t of e){if(!mW.isArray(t))throw TypeError("Object iterator must return a key-value pair");l[n=t[0]]=(i=l[n])?mW.isArray(i)?[...i,t[1]]:[i,t[1]]:t[1]}o(l,t)}else null!=e&&l(t,e,i);return this}get(e,t){if(e=wC(e)){const i=mW.findKey(this,e);if(i){const e=this[i];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),i=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let n;for(;n=i.exec(e);)t[n[1]]=n[2];return t}(e);if(mW.isFunction(t))return t.call(this,e,i);if(mW.isRegExp(t))return t.exec(e);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,t){if(e=wC(e)){const i=mW.findKey(this,e);return!(!i||void 0===this[i]||t&&!PC(0,this[i],i,t))}return!1}delete(e,t){const i=this;let n=!1;function l(e){if(e=wC(e)){const l=mW.findKey(i,e);!l||t&&!PC(0,i[l],l,t)||(delete i[l],n=!0)}}return mW.isArray(e)?e.forEach(l):l(e),n}clear(e){const t=Object.keys(this);let i=t.length,n=!1;for(;i--;){const l=t[i];e&&!PC(0,this[l],l,e,!0)||(delete this[l],n=!0)}return n}normalize(e){const t=this,i={};return mW.forEach(this,((n,l)=>{const o=mW.findKey(i,l);if(o)return t[o]=zC(n),void delete t[l];const c=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,((e,t,i)=>t.toUpperCase()+i))}(l):String(l).trim();c!==l&&delete t[l],t[c]=zC(n),i[c]=!0})),this}concat(){for(var e=arguments.length,t=new Array(e),i=0;i<e;i++)t[i]=arguments[i];return this.constructor.concat(this,...t)}toJSON(e){const t=Object.create(null);return mW.forEach(this,((i,n)=>{null!=i&&!1!==i&&(t[n]=e&&mW.isArray(i)?i.join(", "):i)})),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map((e=>{let[t,i]=e;return t+": "+i})).join("\n")}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e){const t=new this(e);for(var i=arguments.length,n=new Array(i>1?i-1:0),l=1;l<i;l++)n[l-1]=arguments[l];return n.forEach((e=>t.set(e))),t}static accessor(e){const t=(this[BC]=this[BC]={accessors:{}}).accessors,i=this.prototype;function n(e){const n=wC(e);t[n]||(!function(e,t){const i=mW.toCamelCase(" "+t);["get","set","has"].forEach((n=>{Object.defineProperty(e,n+i,{value:function(e,i,l){return this[n].call(this,t,e,i,l)},configurable:!0})}))}(i,e),t[n]=!0)}return mW.isArray(e)?e.forEach(n):n(e),this}}QC.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),mW.reduceDescriptors(QC.prototype,((e,t)=>{let{value:i}=e,n=t[0].toUpperCase()+t.slice(1);return{get:()=>i,set(e){this[n]=e}}})),mW.freezeMethods(QC);var jC=QC;function MC(e,t){const i=this||AC,n=t||i,l=jC.from(n.headers);let o=n.data;return mW.forEach(e,(function(e){o=e.call(i,o,l.normalize(),t?t.status:void 0)})),l.normalize(),o}function EC(e){return!(!e||!e.__CANCEL__)}var OC=class extends IC{constructor(e,t,i){super(null==e?"canceled":e,IC.ERR_CANCELED,t,i),this.name="CanceledError",this.__CANCEL__=!0}};function DC(e,t,i){const n=i.config.validateStatus;i.status&&n&&!n(i.status)?t(new IC("Request failed with status code "+i.status,[IC.ERR_BAD_REQUEST,IC.ERR_BAD_RESPONSE][Math.floor(i.status/100)-4],i.config,i.request,i)):e(i)}function _C(e,t){e=e||10;const i=new Array(e),n=new Array(e);let l,o=0,c=0;return t=void 0!==t?t:1e3,function(a){const d=Date.now(),s=n[c];l||(l=d),i[o]=a,n[o]=d;let r=c,u=0;for(;r!==o;)u+=i[r++],r%=e;if(o=(o+1)%e,o===c&&(c=(c+1)%e),d-l<t)return;const Z=s&&d-s;return Z?Math.round(1e3*u/Z):void 0}}function qC(e,t){let i,n,l=0,o=1e3/t;const c=function(t){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now();l=o,i=null,n&&(clearTimeout(n),n=null),e(...t)};return[function(){const e=Date.now(),t=e-l;for(var a=arguments.length,d=new Array(a),s=0;s<a;s++)d[s]=arguments[s];t>=o?c(d,e):(i=d,n||(n=setTimeout((()=>{n=null,c(i)}),o-t)))},()=>i&&c(i)]}const $C=function(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3,n=0;const l=_C(50,250);return qC((i=>{const o=i.loaded,c=i.lengthComputable?i.total:void 0,a=o-n,d=l(a);n=o;e({loaded:o,total:c,progress:c?o/c:void 0,bytes:a,rate:d||void 0,estimated:d&&c&&o<=c?(c-o)/d:void 0,event:i,lengthComputable:null!=c,[t?"download":"upload"]:!0})}),i)},eR=(e,t)=>{const i=null!=e;return[n=>t[0]({lengthComputable:i,total:e,loaded:n}),t[1]]},tR=e=>function(){for(var t=arguments.length,i=new Array(t),n=0;n<t;n++)i[n]=arguments[n];return mW.asap((()=>e(...i)))};var iR=kC.hasStandardBrowserEnv?((e,t)=>i=>(i=new URL(i,kC.origin),e.protocol===i.protocol&&e.host===i.host&&(t||e.port===i.port)))(new URL(kC.origin),kC.navigator&&/(msie|trident)/i.test(kC.navigator.userAgent)):()=>!0,nR=kC.hasStandardBrowserEnv?{write(e,t,i,n,l,o,c){if("undefined"==typeof document)return;const a=["".concat(e,"=").concat(encodeURIComponent(t))];mW.isNumber(i)&&a.push("expires=".concat(new Date(i).toUTCString())),mW.isString(n)&&a.push("path=".concat(n)),mW.isString(l)&&a.push("domain=".concat(l)),!0===o&&a.push("secure"),mW.isString(c)&&a.push("SameSite=".concat(c)),document.cookie=a.join("; ")},read(e){if("undefined"==typeof document)return null;const t=document.cookie.match(new RegExp("(?:^|; )"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,"",Date.now()-864e5,"/")}}:{write(){},read:()=>null,remove(){}};function lR(e,t,i){let n=!function(e){return"string"==typeof e&&/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}(t);return e&&(n||0==i)?function(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}(e,t):t}const oR=e=>e instanceof jC?{...e}:e;function cR(e,t){t=t||{};const i={};function n(e,t,i,n){return mW.isPlainObject(e)&&mW.isPlainObject(t)?mW.merge.call({caseless:n},e,t):mW.isPlainObject(t)?mW.merge({},t):mW.isArray(t)?t.slice():t}function l(e,t,i,l){return mW.isUndefined(t)?mW.isUndefined(e)?void 0:n(void 0,e,0,l):n(e,t,0,l)}function o(e,t){if(!mW.isUndefined(t))return n(void 0,t)}function c(e,t){return mW.isUndefined(t)?mW.isUndefined(e)?void 0:n(void 0,e):n(void 0,t)}function a(i,l,o){return o in t?n(i,l):o in e?n(void 0,i):void 0}const d={url:o,method:o,data:o,baseURL:c,transformRequest:c,transformResponse:c,paramsSerializer:c,timeout:c,timeoutMessage:c,withCredentials:c,withXSRFToken:c,adapter:c,responseType:c,xsrfCookieName:c,xsrfHeaderName:c,onUploadProgress:c,onDownloadProgress:c,decompress:c,maxContentLength:c,maxBodyLength:c,beforeRedirect:c,transport:c,httpAgent:c,httpsAgent:c,cancelToken:c,socketPath:c,responseEncoding:c,validateStatus:a,headers:(e,t,i)=>l(oR(e),oR(t),0,!0)};return mW.forEach(Object.keys({...e,...t}),(function(n){if("__proto__"===n||"constructor"===n||"prototype"===n)return;const o=mW.hasOwnProp(d,n)?d[n]:l,c=o(e[n],t[n],n);mW.isUndefined(c)&&o!==a||(i[n]=c)})),i}var aR=e=>{const t=cR({},e);let{data:i,withXSRFToken:n,xsrfHeaderName:l,xsrfCookieName:o,headers:c,auth:a}=t;if(t.headers=c=jC.from(c),t.url=vC(lR(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),a&&c.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):""))),mW.isFormData(i))if(kC.hasStandardBrowserEnv||kC.hasStandardBrowserWebWorkerEnv)c.setContentType(void 0);else if(mW.isFunction(i.getHeaders)){const e=i.getHeaders(),t=["content-type","content-length"];Object.entries(e).forEach((e=>{let[i,n]=e;t.includes(i.toLowerCase())&&c.set(i,n)}))}if(kC.hasStandardBrowserEnv&&(n&&mW.isFunction(n)&&(n=n(t)),n||!1!==n&&iR(t.url))){const e=l&&o&&nR.read(o);e&&c.set(l,e)}return t};var dR="undefined"!=typeof XMLHttpRequest&&function(e){return new Promise((function(t,i){const n=aR(e);let l=n.data;const o=jC.from(n.headers).normalize();let c,a,d,s,r,{responseType:u,onUploadProgress:Z,onDownloadProgress:b}=n;function h(){s&&s(),r&&r(),n.cancelToken&&n.cancelToken.unsubscribe(c),n.signal&&n.signal.removeEventListener("abort",c)}let m=new XMLHttpRequest;function p(){if(!m)return;const n=jC.from("getAllResponseHeaders"in m&&m.getAllResponseHeaders());DC((function(e){t(e),h()}),(function(e){i(e),h()}),{data:u&&"text"!==u&&"json"!==u?m.response:m.responseText,status:m.status,statusText:m.statusText,headers:n,config:e,request:m}),m=null}m.open(n.method.toUpperCase(),n.url,!0),m.timeout=n.timeout,"onloadend"in m?m.onloadend=p:m.onreadystatechange=function(){m&&4===m.readyState&&(0!==m.status||m.responseURL&&0===m.responseURL.indexOf("file:"))&&setTimeout(p)},m.onabort=function(){m&&(i(new IC("Request aborted",IC.ECONNABORTED,e,m)),m=null)},m.onerror=function(t){const n=t&&t.message?t.message:"Network Error",l=new IC(n,IC.ERR_NETWORK,e,m);l.event=t||null,i(l),m=null},m.ontimeout=function(){let t=n.timeout?"timeout of "+n.timeout+"ms exceeded":"timeout exceeded";const l=n.transitional||YC;n.timeoutErrorMessage&&(t=n.timeoutErrorMessage),i(new IC(t,l.clarifyTimeoutError?IC.ETIMEDOUT:IC.ECONNABORTED,e,m)),m=null},void 0===l&&o.setContentType(null),"setRequestHeader"in m&&mW.forEach(o.toJSON(),(function(e,t){m.setRequestHeader(t,e)})),mW.isUndefined(n.withCredentials)||(m.withCredentials=!!n.withCredentials),u&&"json"!==u&&(m.responseType=n.responseType),b&&([d,r]=$C(b,!0),m.addEventListener("progress",d)),Z&&m.upload&&([a,s]=$C(Z),m.upload.addEventListener("progress",a),m.upload.addEventListener("loadend",s)),(n.cancelToken||n.signal)&&(c=t=>{m&&(i(!t||t.type?new OC(null,e,m):t),m.abort(),m=null)},n.cancelToken&&n.cancelToken.subscribe(c),n.signal&&(n.signal.aborted?c():n.signal.addEventListener("abort",c)));const I=function(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}(n.url);I&&-1===kC.protocols.indexOf(I)?i(new IC("Unsupported protocol "+I+":",IC.ERR_BAD_REQUEST,e)):m.send(l||null)}))};var sR=(e,t)=>{const{length:i}=e=e?e.filter(Boolean):[];if(t||i){let i,n=new AbortController;const l=function(e){if(!i){i=!0,c();const t=e instanceof Error?e:this.reason;n.abort(t instanceof IC?t:new OC(t instanceof Error?t.message:t))}};let o=t&&setTimeout((()=>{o=null,l(new IC("timeout of ".concat(t,"ms exceeded"),IC.ETIMEDOUT))}),t);const c=()=>{e&&(o&&clearTimeout(o),o=null,e.forEach((e=>{e.unsubscribe?e.unsubscribe(l):e.removeEventListener("abort",l)})),e=null)};e.forEach((e=>e.addEventListener("abort",l)));const{signal:a}=n;return a.unsubscribe=()=>mW.asap(c),a}};const rR=function*(e,t){let i=e.byteLength;if(!t||i<t)return void(yield e);let n,l=0;for(;l<i;)n=l+t,yield e.slice(l,n),l=n},uR=async function*(e){if(e[Symbol.asyncIterator])return void(yield*e);const t=e.getReader();try{for(;;){const{done:e,value:i}=await t.read();if(e)break;yield i}}finally{await t.cancel()}},ZR=(e,t,i,n)=>{const l=async function*(e,t){for await(const i of uR(e))yield*rR(i,t)}(e,t);let o,c=0,a=e=>{o||(o=!0,n&&n(e))};return new ReadableStream({async pull(e){try{const{done:t,value:n}=await l.next();if(t)return a(),void e.close();let o=n.byteLength;if(i){let e=c+=o;i(e)}e.enqueue(new Uint8Array(n))}catch(e){throw a(e),e}},cancel:e=>(a(e),l.return())},{highWaterMark:2})},{isFunction:bR}=mW,hR=(e=>{let{Request:t,Response:i}=e;return{Request:t,Response:i}})(mW.global),{ReadableStream:mR,TextEncoder:pR}=mW.global,IR=function(e){try{for(var t=arguments.length,i=new Array(t>1?t-1:0),n=1;n<t;n++)i[n-1]=arguments[n];return!!e(...i)}catch(e){return!1}},GR=e=>{e=mW.merge.call({skipUndefined:!0},hR,e);const{fetch:t,Request:i,Response:n}=e,l=t?bR(t):"function"==typeof fetch,o=bR(i),c=bR(n);if(!l)return!1;const a=l&&bR(mR),d=l&&("function"==typeof pR?(e=>t=>e.encode(t))(new pR):async e=>new Uint8Array(await new i(e).arrayBuffer())),s=o&&a&&IR((()=>{let e=!1;const t=new i(kC.origin,{body:new mR,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t})),r=c&&a&&IR((()=>mW.isReadableStream(new n("").body))),u={stream:r&&(e=>e.body)};l&&["text","arrayBuffer","blob","formData","stream"].forEach((e=>{!u[e]&&(u[e]=(t,i)=>{let n=t&&t[e];if(n)return n.call(t);throw new IC("Response type '".concat(e,"' is not supported"),IC.ERR_NOT_SUPPORT,i)})}));const Z=async(e,t)=>{const n=mW.toFiniteNumber(e.getContentLength());return null==n?(async e=>{if(null==e)return 0;if(mW.isBlob(e))return e.size;if(mW.isSpecCompliantForm(e)){const t=new i(kC.origin,{method:"POST",body:e});return(await t.arrayBuffer()).byteLength}return mW.isArrayBufferView(e)||mW.isArrayBuffer(e)?e.byteLength:(mW.isURLSearchParams(e)&&(e+=""),mW.isString(e)?(await d(e)).byteLength:void 0)})(t):n};return async e=>{let{url:l,method:c,data:a,signal:d,cancelToken:b,timeout:h,onDownloadProgress:m,onUploadProgress:p,responseType:I,headers:G,withCredentials:g="same-origin",fetchOptions:y}=aR(e),X=t||fetch;I=I?(I+"").toLowerCase():"text";let V=sR([d,b&&b.toAbortSignal()],h),W=null;const C=V&&V.unsubscribe&&(()=>{V.unsubscribe()});let R;try{if(p&&s&&"get"!==c&&"head"!==c&&0!==(R=await Z(G,a))){let e,t=new i(l,{method:"POST",body:a,duplex:"half"});if(mW.isFormData(a)&&(e=t.headers.get("content-type"))&&G.setContentType(e),t.body){const[e,i]=eR(R,$C(tR(p)));a=ZR(t.body,65536,e,i)}}mW.isString(g)||(g=g?"include":"omit");const t=o&&"credentials"in i.prototype,d={...y,signal:V,method:c.toUpperCase(),headers:G.normalize().toJSON(),body:a,duplex:"half",credentials:t?g:void 0};W=o&&new i(l,d);let b=await(o?X(W,y):X(l,d));const h=r&&("stream"===I||"response"===I);if(r&&(m||h&&C)){const e={};["status","statusText","headers"].forEach((t=>{e[t]=b[t]}));const t=mW.toFiniteNumber(b.headers.get("content-length")),[i,l]=m&&eR(t,$C(tR(m),!0))||[];b=new n(ZR(b.body,65536,i,(()=>{l&&l(),C&&C()})),e)}I=I||"text";let S=await u[mW.findKey(u,I)||"text"](b,e);return!h&&C&&C(),await new Promise(((t,i)=>{DC(t,i,{data:S,headers:jC.from(b.headers),status:b.status,statusText:b.statusText,config:e,request:W})}))}catch(t){if(C&&C(),t&&"TypeError"===t.name&&/Load failed|fetch/i.test(t.message))throw Object.assign(new IC("Network Error",IC.ERR_NETWORK,e,W,t&&t.response),{cause:t.cause||t});throw IC.from(t,t&&t.code,e,W,t&&t.response)}}},gR=new Map,yR=e=>{let t=e&&e.env||{};const{fetch:i,Request:n,Response:l}=t,o=[n,l,i];let c,a,d=o.length,s=gR;for(;d--;)c=o[d],a=s.get(c),void 0===a&&s.set(c,a=d?new Map:GR(t)),s=a;return a};yR();const XR={http:null,xhr:dR,fetch:{get:yR}};mW.forEach(XR,((e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch(e){}Object.defineProperty(e,"adapterName",{value:t})}}));const VR=e=>"- ".concat(e),WR=e=>mW.isFunction(e)||null===e||!1===e;var CR={getAdapter:function(e,t){e=mW.isArray(e)?e:[e];const{length:i}=e;let n,l;const o={};for(let c=0;c<i;c++){let i;if(n=e[c],l=n,!WR(n)&&(l=XR[(i=String(n)).toLowerCase()],void 0===l))throw new IC("Unknown adapter '".concat(i,"'"));if(l&&(mW.isFunction(l)||(l=l.get(t))))break;o[i||"#"+c]=l}if(!l){const e=Object.entries(o).map((e=>{let[t,i]=e;return"adapter ".concat(t," ")+(!1===i?"is not supported by the environment":"is not available in the build")}));let t=i?e.length>1?"since :\n"+e.map(VR).join("\n"):" "+VR(e[0]):"as no adapter specified";throw new IC("There is no suitable adapter to dispatch the request "+t,"ERR_NOT_SUPPORT")}return l},adapters:XR};function RR(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new OC(null,e)}function SR(e){RR(e),e.headers=jC.from(e.headers),e.data=MC.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1);return CR.getAdapter(e.adapter||AC.adapter,e)(e).then((function(t){return RR(e),t.data=MC.call(e,e.transformResponse,t),t.headers=jC.from(t.headers),t}),(function(t){return EC(t)||(RR(e),t&&t.response&&(t.response.data=MC.call(e,e.transformResponse,t.response),t.response.headers=jC.from(t.response.headers))),Promise.reject(t)}))}const vR="1.13.6",fR={};["object","boolean","number","function","string","symbol"].forEach(((e,t)=>{fR[e]=function(i){return typeof i===e||"a"+(t<1?"n ":" ")+e}}));const YR={};fR.transitional=function(e,t,i){function n(e,t){return"[Axios v1.13.6] Transitional option '"+e+"'"+t+(i?". "+i:"")}return(i,l,o)=>{if(!1===e)throw new IC(n(l," has been removed"+(t?" in "+t:"")),IC.ERR_DEPRECATED);return t&&!YR[l]&&(YR[l]=!0,console.warn(n(l," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(i,l,o)}},fR.spelling=function(e){return(t,i)=>(console.warn("".concat(i," is likely a misspelling of ").concat(e)),!0)};var KR={assertOptions:function(e,t,i){if("object"!=typeof e)throw new IC("options must be an object",IC.ERR_BAD_OPTION_VALUE);const n=Object.keys(e);let l=n.length;for(;l-- >0;){const o=n[l],c=t[o];if(c){const t=e[o],i=void 0===t||c(t,o,e);if(!0!==i)throw new IC("option "+o+" must be "+i,IC.ERR_BAD_OPTION_VALUE)}else if(!0!==i)throw new IC("Unknown option "+o,IC.ERR_BAD_OPTION)}},validators:fR};const NR=KR.validators;class JR{constructor(e){this.defaults=e||{},this.interceptors={request:new fC,response:new fC}}async request(e,t){try{return await this._request(e,t)}catch(e){if(e instanceof Error){let t={};Error.captureStackTrace?Error.captureStackTrace(t):t=new Error;const i=t.stack?t.stack.replace(/^.+\n/,""):"";try{e.stack?i&&!String(e.stack).endsWith(i.replace(/^.+\n.+\n/,""))&&(e.stack+="\n"+i):e.stack=i}catch(e){}}throw e}}_request(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},t=cR(this.defaults,t);const{transitional:i,paramsSerializer:n,headers:l}=t;void 0!==i&&KR.assertOptions(i,{silentJSONParsing:NR.transitional(NR.boolean),forcedJSONParsing:NR.transitional(NR.boolean),clarifyTimeoutError:NR.transitional(NR.boolean),legacyInterceptorReqResOrdering:NR.transitional(NR.boolean)},!1),null!=n&&(mW.isFunction(n)?t.paramsSerializer={serialize:n}:KR.assertOptions(n,{encode:NR.function,serialize:NR.function},!0)),void 0!==t.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),KR.assertOptions(t,{baseUrl:NR.spelling("baseURL"),withXsrfToken:NR.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();let o=l&&mW.merge(l.common,l[t.method]);l&&mW.forEach(["delete","get","head","post","put","patch","common"],(e=>{delete l[e]})),t.headers=jC.concat(o,l);const c=[];let a=!0;this.interceptors.request.forEach((function(e){if("function"==typeof e.runWhen&&!1===e.runWhen(t))return;a=a&&e.synchronous;const i=t.transitional||YC;i&&i.legacyInterceptorReqResOrdering?c.unshift(e.fulfilled,e.rejected):c.push(e.fulfilled,e.rejected)}));const d=[];let s;this.interceptors.response.forEach((function(e){d.push(e.fulfilled,e.rejected)}));let r,u=0;if(!a){const e=[SR.bind(this),void 0];for(e.unshift(...c),e.push(...d),r=e.length,s=Promise.resolve(t);u<r;)s=s.then(e[u++],e[u++]);return s}r=c.length;let Z=t;for(;u<r;){const e=c[u++],t=c[u++];try{Z=e(Z)}catch(e){t.call(this,e);break}}try{s=SR.call(this,Z)}catch(e){return Promise.reject(e)}for(u=0,r=d.length;u<r;)s=s.then(d[u++],d[u++]);return s}getUri(e){return vC(lR((e=cR(this.defaults,e)).baseURL,e.url,e.allowAbsoluteUrls),e.params,e.paramsSerializer)}}mW.forEach(["delete","get","head","options"],(function(e){JR.prototype[e]=function(t,i){return this.request(cR(i||{},{method:e,url:t,data:(i||{}).data}))}})),mW.forEach(["post","put","patch"],(function(e){function t(t){return function(i,n,l){return this.request(cR(l||{},{method:e,headers:t?{"Content-Type":"multipart/form-data"}:{},url:i,data:n}))}}JR.prototype[e]=t(),JR.prototype[e+"Form"]=t(!0)}));var UR=JR;class LR{constructor(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");let t;this.promise=new Promise((function(e){t=e}));const i=this;this.promise.then((e=>{if(!i._listeners)return;let t=i._listeners.length;for(;t-- >0;)i._listeners[t](e);i._listeners=null})),this.promise.then=e=>{let t;const n=new Promise((e=>{i.subscribe(e),t=e})).then(e);return n.cancel=function(){i.unsubscribe(t)},n},e((function(e,n,l){i.reason||(i.reason=new OC(e,n,l),t(i.reason))}))}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}toAbortSignal(){const e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;const t=new LR((function(t){e=t}));return{token:t,cancel:e}}}var HR=LR;const kR={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(kR).forEach((e=>{let[t,i]=e;kR[i]=t}));var TR=kR;const FR=function e(t){const i=new UR(t),n=CV(UR.prototype.request,i);return mW.extend(n,UR.prototype,i,{allOwnKeys:!0}),mW.extend(n,i,null,{allOwnKeys:!0}),n.create=function(i){return e(cR(t,i))},n}(AC);FR.Axios=UR,FR.CanceledError=OC,FR.CancelToken=HR,FR.isCancel=EC,FR.VERSION=vR,FR.toFormData=VC,FR.AxiosError=IC,FR.Cancel=FR.CanceledError,FR.all=function(e){return Promise.all(e)},FR.spread=function(e){return function(t){return e.apply(null,t)}},FR.isAxiosError=function(e){return mW.isObject(e)&&!0===e.isAxiosError},FR.mergeConfig=cR,FR.AxiosHeaders=jC,FR.formToJSON=e=>TC(mW.isHTMLForm(e)?new FormData(e):e),FR.getAdapter=CR.getAdapter,FR.HttpStatusCode=TR,FR.default=FR;var AR=FR;const{Axios:xR,AxiosError:BR,CanceledError:wR,isCancel:zR,CancelToken:PR,VERSION:QR,all:jR,Cancel:MR,isAxiosError:ER,spread:OR,toFormData:DR,AxiosHeaders:_R,HttpStatusCode:qR,formToJSON:$R,getAdapter:eS,mergeConfig:tS}=AR;var iS;let nS=iS=class{constructor(){this.attachToken=()=>Promise.resolve(),this.requestStartCallback=()=>null,this.requestSuccessCallback=()=>null,this.requestErrorCallback=()=>null,this.requestFinishCallback=()=>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)}static getInstance(){return this.axiosInstance||(this.axiosInstance=AR.create({withCredentials:!0}),this.clientInstance||(this.clientInstance=new iS),this.axiosInstance.interceptors.request.use((e=>Uy(this,void 0,void 0,(function*(){return yield this.clientInstance.requestHandler(e)})))),this.axiosInstance.interceptors.response.use((e=>this.clientInstance.successHandler(e)),(e=>this.clientInstance.errorHandler(e))),this.axiosInstance.all=AR.all,this.axiosInstance.spread=AR.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}requestHandler(e){return Uy(this,void 0,void 0,(function*(){if(yield this.attachToken(e),null==e?void 0:e.shouldEncodeToFormData){const t=null==e?void 0:e.data,i=new FormData;Object.keys(t).forEach((e=>{i.append(e,t[e])})),e.data=i}return e.startTimeInMs=(new Date).getTime(),iS.isHandlerEnabled&&this.requestStartCallback&&"function"==typeof this.requestStartCallback&&this.requestStartCallback(e),e}))}errorHandler(e){throw iS.isHandlerEnabled&&(this.requestErrorCallback&&"function"==typeof this.requestErrorCallback&&this.requestErrorCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}successHandler(e){var t,i;return"stream"===(null===(i=null===(t=e)||void 0===t?void 0:t.config)||void 0===i?void 0:i.responseType)||iS.isHandlerEnabled&&(this.requestSuccessCallback&&"function"==typeof this.requestSuccessCallback&&this.requestSuccessCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}init(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=arguments.length>1?arguments[1]:void 0;return Uy(this,void 0,void 0,(function*(){iS.isHandlerEnabled=e,this.attachToken=t}))}enableHandler(){iS.isHandlerEnabled=!0}disableHandler(){iS.isHandlerEnabled=!1}disableHandlerWithTimeout(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:iS.DEFAULT_HANDLER_DISABLE_TIMEOUT;iS.isHandlerEnabled=!1,setTimeout((()=>{iS.isHandlerEnabled=!0}),e)}setHttpRequestStartCallback(e){this.requestStartCallback=e}setHttpRequestSuccessCallback(e){this.requestSuccessCallback=e}setHttpRequestErrorCallback(e){this.requestErrorCallback=e}setHttpRequestFinishCallback(e){this.requestFinishCallback=e}};nS.DEFAULT_HANDLER_DISABLE_TIMEOUT=1e3,nS=iS=function(e,t,i,n){var l,o=arguments.length,c=o<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)c=Reflect.decorate(e,t,i,n);else for(var a=e.length-1;a>=0;a--)(l=e[a])&&(c=(o<3?l(c):o>3?l(t,i,c):l(t,i))||c);return o>3&&c&&Object.defineProperty(t,i,c),c}([e=>{}],nS);class lS{setData(e,t){return Uy(this,void 0,void 0,(function*(){localStorage.setItem(e,t)}))}getData(e){var t;return Uy(this,void 0,void 0,(function*(){return null!==(t=localStorage.getItem(e))&&void 0!==t?t:"{}"}))}removeData(e){return Uy(this,void 0,void 0,(function*(){localStorage.removeItem(e)}))}}class oS{constructor(){this._data=new Map}setData(e,t){return Uy(this,void 0,void 0,(function*(){this._data.set(e,t)}))}getData(e){var t,i;return Uy(this,void 0,void 0,(function*(){return null!==(i=null===(t=this._data)||void 0===t?void 0:t.get(e))&&void 0!==i?i:"{}"}))}removeData(e){return Uy(this,void 0,void 0,(function*(){this._data.delete(e)}))}}class cS{setData(e,t){return Uy(this,void 0,void 0,(function*(){sessionStorage.setItem(e,t)}))}getData(e){var t;return Uy(this,void 0,void 0,(function*(){return null!==(t=sessionStorage.getItem(e))&&void 0!==t?t:"{}"}))}removeData(e){return Uy(this,void 0,void 0,(function*(){sessionStorage.removeItem(e)}))}}var aS={exports:{}},dS={},sS={};Object.defineProperty(sS,"__esModule",{value:!0}),sS.default=function(e){var t=e.length,i=t%4;if(!i)return e;var n=t,l=4-i,o=t+l,c=KW.alloc(o);for(c.write(e);l--;)c.write("=",n++);return c.toString()},Object.defineProperty(dS,"__esModule",{value:!0});var rS=sS;function uS(e,t){return void 0===t&&(t="utf8"),KW.isBuffer(e)?bS(e.toString("base64")):bS(KW.from(e,t).toString("base64"))}function ZS(e){return e=e.toString(),rS.default(e).replace(/\-/g,"+").replace(/_/g,"/")}function bS(e){return e.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}var hS=uS;hS.encode=uS,hS.decode=function(e,t){return void 0===t&&(t="utf8"),KW.from(ZS(e),"base64").toString(t)},hS.toBase64=ZS,hS.fromBase64=bS,hS.toBuffer=function(e){return KW.from(ZS(e),"base64")},dS.default=hS,function(e){e.exports=dS.default,e.exports.default=e.exports}(aS);var mS=aS.exports,pS={exports:{}};!function(e){!function(t,i){var n={};!function(e){e.__esModule=!0,e.digestLength=32,e.blockSize=64;var t=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 i(e,i,n,l,o){for(var c,a,d,s,r,u,Z,b,h,m,p,I,G;o>=64;){for(c=i[0],a=i[1],d=i[2],s=i[3],r=i[4],u=i[5],Z=i[6],b=i[7],m=0;m<16;m++)p=l+4*m,e[m]=(255&n[p])<<24|(255&n[p+1])<<16|(255&n[p+2])<<8|255&n[p+3];for(m=16;m<64;m++)I=((h=e[m-2])>>>17|h<<15)^(h>>>19|h<<13)^h>>>10,G=((h=e[m-15])>>>7|h<<25)^(h>>>18|h<<14)^h>>>3,e[m]=(I+e[m-7]|0)+(G+e[m-16]|0);for(m=0;m<64;m++)I=(((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+(r&u^~r&Z)|0)+(b+(t[m]+e[m]|0)|0)|0,G=((c>>>2|c<<30)^(c>>>13|c<<19)^(c>>>22|c<<10))+(c&a^c&d^a&d)|0,b=Z,Z=u,u=r,r=s+I|0,s=d,d=a,a=c,c=I+G|0;i[0]+=c,i[1]+=a,i[2]+=d,i[3]+=s,i[4]+=r,i[5]+=u,i[6]+=Z,i[7]+=b,l+=64,o-=64}return l}var n=function(){function t(){this.digestLength=e.digestLength,this.blockSize=e.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 t.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},t.prototype.clean=function(){for(var e=0;e<this.buffer.length;e++)this.buffer[e]=0;for(e=0;e<this.temp.length;e++)this.temp[e]=0;this.reset()},t.prototype.update=function(e,t){if(void 0===t&&(t=e.length),this.finished)throw new Error("SHA256: can't update because hash was finished.");var n=0;if(this.bytesHashed+=t,this.bufferLength>0){for(;this.bufferLength<64&&t>0;)this.buffer[this.bufferLength++]=e[n++],t--;64===this.bufferLength&&(i(this.temp,this.state,this.buffer,0,64),this.bufferLength=0)}for(t>=64&&(n=i(this.temp,this.state,e,n,t),t%=64);t>0;)this.buffer[this.bufferLength++]=e[n++],t--;return this},t.prototype.finish=function(e){if(!this.finished){var t=this.bytesHashed,n=this.bufferLength,l=t/536870912|0,o=t<<3,c=t%64<56?64:128;this.buffer[n]=128;for(var a=n+1;a<c-8;a++)this.buffer[a]=0;this.buffer[c-8]=l>>>24&255,this.buffer[c-7]=l>>>16&255,this.buffer[c-6]=l>>>8&255,this.buffer[c-5]=l>>>0&255,this.buffer[c-4]=o>>>24&255,this.buffer[c-3]=o>>>16&255,this.buffer[c-2]=o>>>8&255,this.buffer[c-1]=o>>>0&255,i(this.temp,this.state,this.buffer,0,c),this.finished=!0}for(a=0;a<8;a++)e[4*a+0]=this.state[a]>>>24&255,e[4*a+1]=this.state[a]>>>16&255,e[4*a+2]=this.state[a]>>>8&255,e[4*a+3]=this.state[a]>>>0&255;return this},t.prototype.digest=function(){var e=new Uint8Array(this.digestLength);return this.finish(e),e},t.prototype._saveState=function(e){for(var t=0;t<this.state.length;t++)e[t]=this.state[t]},t.prototype._restoreState=function(e,t){for(var i=0;i<this.state.length;i++)this.state[i]=e[i];this.bytesHashed=t,this.finished=!1,this.bufferLength=0},t}();e.Hash=n;var l=function(){function e(e){this.inner=new n,this.outer=new n,this.blockSize=this.inner.blockSize,this.digestLength=this.inner.digestLength;var t=new Uint8Array(this.blockSize);if(e.length>this.blockSize)(new n).update(e).finish(t).clean();else for(var i=0;i<e.length;i++)t[i]=e[i];for(i=0;i<t.length;i++)t[i]^=54;this.inner.update(t);for(i=0;i<t.length;i++)t[i]^=106;this.outer.update(t),this.istate=new Uint32Array(8),this.ostate=new Uint32Array(8),this.inner._saveState(this.istate),this.outer._saveState(this.ostate);for(i=0;i<t.length;i++)t[i]=0}return e.prototype.reset=function(){return this.inner._restoreState(this.istate,this.inner.blockSize),this.outer._restoreState(this.ostate,this.outer.blockSize),this},e.prototype.clean=function(){for(var e=0;e<this.istate.length;e++)this.ostate[e]=this.istate[e]=0;this.inner.clean(),this.outer.clean()},e.prototype.update=function(e){return this.inner.update(e),this},e.prototype.finish=function(e){return this.outer.finished?this.outer.finish(e):(this.inner.finish(e),this.outer.update(e,this.digestLength).finish(e)),this},e.prototype.digest=function(){var e=new Uint8Array(this.digestLength);return this.finish(e),e},e}();function o(e){var t=(new n).update(e),i=t.digest();return t.clean(),i}function c(e,t){var i=new l(e).update(t),n=i.digest();return i.clean(),n}function a(e,t,i,n){var l=n[0];if(0===l)throw new Error("hkdf: cannot expand more");t.reset(),l>1&&t.update(e),i&&t.update(i),t.update(n),t.finish(e),n[0]++}e.HMAC=l,e.hash=o,e.default=o,e.hmac=c;var d=new Uint8Array(e.digestLength);function s(e,t,i,n){void 0===t&&(t=d),void 0===n&&(n=32);for(var o=new Uint8Array([1]),s=c(t,e),r=new l(s),u=new Uint8Array(r.digestLength),Z=u.length,b=new Uint8Array(n),h=0;h<n;h++)Z===u.length&&(a(u,r,i,o),Z=0),b[h]=u[Z++];return r.clean(),u.fill(0),o.fill(0),b}function r(e,t,i,n){for(var o=new l(e),c=o.digestLength,a=new Uint8Array(4),d=new Uint8Array(c),s=new Uint8Array(c),r=new Uint8Array(n),u=0;u*c<n;u++){var Z=u+1;a[0]=Z>>>24&255,a[1]=Z>>>16&255,a[2]=Z>>>8&255,a[3]=Z>>>0&255,o.reset(),o.update(t),o.update(a),o.finish(s);for(var b=0;b<c;b++)d[b]=s[b];for(b=2;b<=i;b++){o.reset(),o.update(s).finish(s);for(var h=0;h<c;h++)d[h]^=s[h]}for(b=0;b<c&&u*c+b<n;b++)r[u*c+b]=d[b]}for(u=0;u<c;u++)d[u]=s[u]=0;for(u=0;u<4;u++)a[u]=0;return o.clean(),r}e.hkdf=s,e.pbkdf2=r}(n);var l=n.default;for(var o in n)l[o]=n[o];e.exports=l}()}(pS);var IS=i(pS.exports),GS=crypto;const gS=e=>e instanceof CryptoKey,yS=new TextEncoder,XS=new TextDecoder;const VS=e=>{let t=e;t instanceof Uint8Array&&(t=XS.decode(t)),t=t.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,"");try{return(e=>{const t=atob(e),i=new Uint8Array(t.length);for(let e=0;e<t.length;e++)i[e]=t.charCodeAt(e);return i})(t)}catch(e){throw new TypeError("The input to be decoded is not correctly encoded.")}};class WS extends Error{constructor(e){var t;super(e),this.code="ERR_JOSE_GENERIC",this.name=this.constructor.name,null===(t=Error.captureStackTrace)||void 0===t||t.call(Error,this,this.constructor)}static get code(){return"ERR_JOSE_GENERIC"}}class CS extends WS{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"unspecified",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"unspecified";super(e),this.code="ERR_JWT_CLAIM_VALIDATION_FAILED",this.claim=t,this.reason=i}static get code(){return"ERR_JWT_CLAIM_VALIDATION_FAILED"}}class RS extends WS{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"unspecified",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"unspecified";super(e),this.code="ERR_JWT_EXPIRED",this.claim=t,this.reason=i}static get code(){return"ERR_JWT_EXPIRED"}}class SS extends WS{constructor(){super(...arguments),this.code="ERR_JOSE_ALG_NOT_ALLOWED"}static get code(){return"ERR_JOSE_ALG_NOT_ALLOWED"}}class vS extends WS{constructor(){super(...arguments),this.code="ERR_JOSE_NOT_SUPPORTED"}static get code(){return"ERR_JOSE_NOT_SUPPORTED"}}class fS extends WS{constructor(){super(...arguments),this.code="ERR_JWS_INVALID"}static get code(){return"ERR_JWS_INVALID"}}class YS extends WS{constructor(){super(...arguments),this.code="ERR_JWT_INVALID"}static get code(){return"ERR_JWT_INVALID"}}class KS extends WS{constructor(){super(...arguments),this.code="ERR_JWKS_INVALID"}static get code(){return"ERR_JWKS_INVALID"}}class NS extends WS{constructor(){super(...arguments),this.code="ERR_JWKS_NO_MATCHING_KEY",this.message="no applicable key found in the JSON Web Key Set"}static get code(){return"ERR_JWKS_NO_MATCHING_KEY"}}class JS extends WS{constructor(){super(...arguments),this.code="ERR_JWKS_MULTIPLE_MATCHING_KEYS",this.message="multiple matching keys found in the JSON Web Key Set"}static get code(){return"ERR_JWKS_MULTIPLE_MATCHING_KEYS"}}class US extends WS{constructor(){super(...arguments),this.code="ERR_JWS_SIGNATURE_VERIFICATION_FAILED",this.message="signature verification failed"}static get code(){return"ERR_JWS_SIGNATURE_VERIFICATION_FAILED"}}function LS(){return"function"==typeof WebSocketPair}function HS(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"algorithm.name";return new TypeError("CryptoKey does not support this operation, its ".concat(t," must be ").concat(e))}function kS(e,t){return e.name===t}function TS(e){return parseInt(e.name.slice(4),10)}function FS(e){switch(e){case"ES256":return"P-256";case"ES384":return"P-384";case"ES512":return"P-521";default:throw new Error("unreachable")}}function AS(e,t){if(t.length&&!t.some((t=>e.usages.includes(t)))){let e="CryptoKey does not support this operation, its usages must include ";if(t.length>2){const i=t.pop();e+="one of ".concat(t.join(", "),", or ").concat(i,".")}else 2===t.length?e+="one of ".concat(t[0]," or ").concat(t[1],"."):e+="".concat(t[0],".");throw new TypeError(e)}}var xS=function(e){let t="Key must be ";for(var i=arguments.length,n=new Array(i>1?i-1:0),l=1;l<i;l++)n[l-1]=arguments[l];if(n.length>2){const e=n.pop();t+="one of type ".concat(n.join(", "),", or ").concat(e,".")}else 2===n.length?t+="one of type ".concat(n[0]," or ").concat(n[1],"."):t+="of type ".concat(n[0],".");return null==e?t+=" Received ".concat(e):"function"==typeof e&&e.name?t+=" Received function ".concat(e.name):"object"==typeof e&&null!=e&&e.constructor&&e.constructor.name&&(t+=" Received an instance of ".concat(e.constructor.name)),t},BS=e=>gS(e);const wS=["CryptoKey"];function zS(e){if("object"!=typeof(t=e)||null===t||"[object Object]"!==Object.prototype.toString.call(e))return!1;var t;if(null===Object.getPrototypeOf(e))return!0;let i=e;for(;null!==Object.getPrototypeOf(i);)i=Object.getPrototypeOf(i);return Object.getPrototypeOf(e)===i}const PS=async e=>{var t,i;const{algorithm:n,keyUsages:l}=function(e){let t,i;switch(e.kty){case"oct":switch(e.alg){case"HS256":case"HS384":case"HS512":t={name:"HMAC",hash:"SHA-".concat(e.alg.slice(-3))},i=["sign","verify"];break;case"A128CBC-HS256":case"A192CBC-HS384":case"A256CBC-HS512":throw new vS("".concat(e.alg," keys cannot be imported as CryptoKey instances"));case"A128GCM":case"A192GCM":case"A256GCM":case"A128GCMKW":case"A192GCMKW":case"A256GCMKW":t={name:"AES-GCM"},i=["encrypt","decrypt"];break;case"A128KW":case"A192KW":case"A256KW":t={name:"AES-KW"},i=["wrapKey","unwrapKey"];break;case"PBES2-HS256+A128KW":case"PBES2-HS384+A192KW":case"PBES2-HS512+A256KW":t={name:"PBKDF2"},i=["deriveBits"];break;default:throw new vS('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"RSA":switch(e.alg){case"PS256":case"PS384":case"PS512":t={name:"RSA-PSS",hash:"SHA-".concat(e.alg.slice(-3))},i=e.d?["sign"]:["verify"];break;case"RS256":case"RS384":case"RS512":t={name:"RSASSA-PKCS1-v1_5",hash:"SHA-".concat(e.alg.slice(-3))},i=e.d?["sign"]:["verify"];break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":t={name:"RSA-OAEP",hash:"SHA-".concat(parseInt(e.alg.slice(-3),10)||1)},i=e.d?["decrypt","unwrapKey"]:["encrypt","wrapKey"];break;default:throw new vS('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"EC":switch(e.alg){case"ES256":t={name:"ECDSA",namedCurve:"P-256"},i=e.d?["sign"]:["verify"];break;case"ES384":t={name:"ECDSA",namedCurve:"P-384"},i=e.d?["sign"]:["verify"];break;case"ES512":t={name:"ECDSA",namedCurve:"P-521"},i=e.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":t={name:"ECDH",namedCurve:e.crv},i=e.d?["deriveBits"]:[];break;default:throw new vS('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case LS()&&"OKP":if("EdDSA"!==e.alg)throw new vS('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');if("Ed25519"!==e.crv)throw new vS('Invalid or unsupported JWK "crv" (Subtype of Key Pair) Parameter value');t={name:"NODE-ED25519",namedCurve:"NODE-ED25519"},i=e.d?["sign"]:["verify"];break;default:throw new vS('Invalid or unsupported JWK "kty" (Key Type) Parameter value')}return{algorithm:t,keyUsages:i}}(e),o=[n,null!==(t=e.ext)&&void 0!==t&&t,null!==(i=e.key_ops)&&void 0!==i?i:l];if("PBKDF2"===n.name)return GS.subtle.importKey("raw",VS(e.k),...o);const c={...e};return delete c.alg,GS.subtle.importKey("jwk",c,...o)};const QS=(e,t,i)=>{e.startsWith("HS")||"dir"===e||e.startsWith("PBES2")||/^A\d{3}(?:GCM)?KW$/.test(e)?(e=>{if(!(e instanceof Uint8Array)){if(!BS(e))throw new TypeError(xS(e,...wS,"Uint8Array"));if("secret"!==e.type)throw new TypeError("".concat(wS.join(" or "),' instances for symmetric algorithms must be of type "secret"'))}})(t):((e,t)=>{if(!BS(e))throw new TypeError(xS(e,...wS));if("secret"===e.type)throw new TypeError("".concat(wS.join(" or "),' instances for asymmetric algorithms must not be of type "secret"'));if("sign"===t&&"public"===e.type)throw new TypeError("".concat(wS.join(" or "),' instances for asymmetric algorithm signing must be of type "private"'));if("decrypt"===t&&"public"===e.type)throw new TypeError("".concat(wS.join(" or "),' instances for asymmetric algorithm decryption must be of type "private"'));if(e.algorithm&&"verify"===t&&"private"===e.type)throw new TypeError("".concat(wS.join(" or "),' instances for asymmetric algorithm verifying must be of type "public"'));if(e.algorithm&&"encrypt"===t&&"private"===e.type)throw new TypeError("".concat(wS.join(" or "),' instances for asymmetric algorithm encryption must be of type "public"'))})(t,i)};function jS(e,t,i){if(gS(t))return function(e,t){switch(t){case"HS256":case"HS384":case"HS512":{if(!kS(e.algorithm,"HMAC"))throw HS("HMAC");const i=parseInt(t.slice(2),10);if(TS(e.algorithm.hash)!==i)throw HS("SHA-".concat(i),"algorithm.hash");break}case"RS256":case"RS384":case"RS512":{if(!kS(e.algorithm,"RSASSA-PKCS1-v1_5"))throw HS("RSASSA-PKCS1-v1_5");const i=parseInt(t.slice(2),10);if(TS(e.algorithm.hash)!==i)throw HS("SHA-".concat(i),"algorithm.hash");break}case"PS256":case"PS384":case"PS512":{if(!kS(e.algorithm,"RSA-PSS"))throw HS("RSA-PSS");const i=parseInt(t.slice(2),10);if(TS(e.algorithm.hash)!==i)throw HS("SHA-".concat(i),"algorithm.hash");break}case LS()&&"EdDSA":if(!kS(e.algorithm,"NODE-ED25519"))throw HS("NODE-ED25519");break;case"ES256":case"ES384":case"ES512":{if(!kS(e.algorithm,"ECDSA"))throw HS("ECDSA");const i=FS(t);if(e.algorithm.namedCurve!==i)throw HS(i,"algorithm.namedCurve");break}default:throw new TypeError("CryptoKey does not support this operation")}for(var i=arguments.length,n=new Array(i>2?i-2:0),l=2;l<i;l++)n[l-2]=arguments[l];AS(e,n)}(t,e,i),t;if(t instanceof Uint8Array){if(!e.startsWith("HS"))throw new TypeError(xS(t,...wS));return GS.subtle.importKey("raw",t,{hash:"SHA-".concat(e.slice(-3)),name:"HMAC"},!1,[i])}throw new TypeError(xS(t,...wS,"Uint8Array"))}const MS=async(e,t,i,n)=>{const l=await jS(e,t,"verify");((e,t)=>{if(e.startsWith("RS")||e.startsWith("PS")){const{modulusLength:i}=t.algorithm;if("number"!=typeof i||i<2048)throw new TypeError("".concat(e," requires key modulusLength to be 2048 bits or larger"))}})(e,l);const o=function(e,t){const i="SHA-".concat(e.slice(-3));switch(e){case"HS256":case"HS384":case"HS512":return{hash:i,name:"HMAC"};case"PS256":case"PS384":case"PS512":return{hash:i,name:"RSA-PSS",saltLength:e.slice(-3)>>3};case"RS256":case"RS384":case"RS512":return{hash:i,name:"RSASSA-PKCS1-v1_5"};case"ES256":case"ES384":case"ES512":return{hash:i,name:"ECDSA",namedCurve:t.namedCurve};case LS()&&"EdDSA":const{namedCurve:n}=t;return{name:n,namedCurve:n};default:throw new vS("alg ".concat(e," is not supported either by JOSE or your javascript runtime"))}}(e,l.algorithm);try{return await GS.subtle.verify(o,l,i,n)}catch(e){return!1}};async function ES(e,t,i){var n;if(!zS(e))throw new fS("Flattened JWS must be an object");if(void 0===e.protected&&void 0===e.header)throw new fS('Flattened JWS must have either of the "protected" or "header" members');if(void 0!==e.protected&&"string"!=typeof e.protected)throw new fS("JWS Protected Header incorrect type");if(void 0===e.payload)throw new fS("JWS Payload missing");if("string"!=typeof e.signature)throw new fS("JWS Signature missing or incorrect type");if(void 0!==e.header&&!zS(e.header))throw new fS("JWS Unprotected Header incorrect type");let l={};if(e.protected){const t=VS(e.protected);try{l=JSON.parse(XS.decode(t))}catch(e){throw new fS("JWS Protected Header is invalid")}}if(!function(){for(var e=arguments.length,t=new Array(e),i=0;i<e;i++)t[i]=arguments[i];const n=t.filter(Boolean);if(0===n.length||1===n.length)return!0;let l;for(const e of n){const t=Object.keys(e);if(l&&0!==l.size)for(const e of t){if(l.has(e))return!1;l.add(e)}else l=new Set(t)}return!0}(l,e.header))throw new fS("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");const o={...l,...e.header},c=function(e,t,i,n,l){if(void 0!==l.crit&&void 0===n.crit)throw new e('"crit" (Critical) Header Parameter MUST be integrity protected');if(!n||void 0===n.crit)return new Set;if(!Array.isArray(n.crit)||0===n.crit.length||n.crit.some((e=>"string"!=typeof e||0===e.length)))throw new e('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present');let o;o=void 0!==i?new Map([...Object.entries(i),...t.entries()]):t;for(const t of n.crit){if(!o.has(t))throw new vS('Extension Header Parameter "'.concat(t,'" is not recognized'));if(void 0===l[t])throw new e('Extension Header Parameter "'.concat(t,'" is missing'));if(o.get(t)&&void 0===n[t])throw new e('Extension Header Parameter "'.concat(t,'" MUST be integrity protected'))}return new Set(n.crit)}(fS,new Map([["b64",!0]]),null==i?void 0:i.crit,l,o);let a=!0;if(c.has("b64")&&(a=l.b64,"boolean"!=typeof a))throw new fS('The "b64" (base64url-encode payload) Header Parameter must be a boolean');const{alg:d}=o;if("string"!=typeof d||!d)throw new fS('JWS "alg" (Algorithm) Header Parameter missing or invalid');const s=i&&((e,t)=>{if(void 0!==t&&(!Array.isArray(t)||t.some((e=>"string"!=typeof e))))throw new TypeError('"'.concat(e,'" option must be an array of strings'));if(t)return new Set(t)})("algorithms",i.algorithms);if(s&&!s.has(d))throw new SS('"alg" (Algorithm) Header Parameter not allowed');if(a){if("string"!=typeof e.payload)throw new fS("JWS Payload must be a string")}else if("string"!=typeof e.payload&&!(e.payload instanceof Uint8Array))throw new fS("JWS Payload must be a string or an Uint8Array instance");let r=!1;"function"==typeof t&&(t=await t(l,e),r=!0),QS(d,t,"verify");const u=function(){for(var e=arguments.length,t=new Array(e),i=0;i<e;i++)t[i]=arguments[i];const n=t.reduce(((e,t)=>{let{length:i}=t;return e+i}),0),l=new Uint8Array(n);let o=0;return t.forEach((e=>{l.set(e,o),o+=e.length})),l}(yS.encode(null!==(n=e.protected)&&void 0!==n?n:""),yS.encode("."),"string"==typeof e.payload?yS.encode(e.payload):e.payload),Z=VS(e.signature);if(!await MS(d,t,Z,u))throw new US;let b;b=a?VS(e.payload):"string"==typeof e.payload?yS.encode(e.payload):e.payload;const h={payload:b};return void 0!==e.protected&&(h.protectedHeader=l),void 0!==e.header&&(h.unprotectedHeader=e.header),r?{...h,key:t}:h}var OS=e=>Math.floor(e.getTime()/1e3);const DS=86400,_S=/^(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)$/i;var qS=e=>{const t=_S.exec(e);if(!t)throw new TypeError("Invalid time period format");const i=parseFloat(t[1]);switch(t[2].toLowerCase()){case"sec":case"secs":case"second":case"seconds":case"s":return Math.round(i);case"minute":case"minutes":case"min":case"mins":case"m":return Math.round(60*i);case"hour":case"hours":case"hr":case"hrs":case"h":return Math.round(3600*i);case"day":case"days":case"d":return Math.round(i*DS);case"week":case"weeks":case"w":return Math.round(604800*i);default:return Math.round(31557600*i)}};const $S=e=>e.toLowerCase().replace(/^application\//,""),ev=(e,t)=>"string"==typeof e?t.includes(e):!!Array.isArray(e)&&t.some(Set.prototype.has.bind(new Set(e)));async function tv(e,t,i){var n;const l=await async function(e,t,i){if(e instanceof Uint8Array&&(e=XS.decode(e)),"string"!=typeof e)throw new fS("Compact JWS must be a string or Uint8Array");const{0:n,1:l,2:o,length:c}=e.split(".");if(3!==c)throw new fS("Invalid Compact JWS");const a=await ES({payload:l,protected:n,signature:o},t,i),d={payload:a.payload,protectedHeader:a.protectedHeader};return"function"==typeof t?{...d,key:a.key}:d}(e,t,i);if((null===(n=l.protectedHeader.crit)||void 0===n?void 0:n.includes("b64"))&&!1===l.protectedHeader.b64)throw new YS("JWTs MUST NOT use unencoded payload");const o=function(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const{typ:n}=i;if(n&&("string"!=typeof e.typ||$S(e.typ)!==$S(n)))throw new CS('unexpected "typ" JWT header value',"typ","check_failed");let l;try{l=JSON.parse(XS.decode(t))}catch(e){}if(!zS(l))throw new YS("JWT Claims Set must be a top-level JSON object");const{issuer:o}=i;if(o&&!(Array.isArray(o)?o:[o]).includes(l.iss))throw new CS('unexpected "iss" claim value',"iss","check_failed");const{subject:c}=i;if(c&&l.sub!==c)throw new CS('unexpected "sub" claim value',"sub","check_failed");const{audience:a}=i;if(a&&!ev(l.aud,"string"==typeof a?[a]:a))throw new CS('unexpected "aud" claim value',"aud","check_failed");let d;switch(typeof i.clockTolerance){case"string":d=qS(i.clockTolerance);break;case"number":d=i.clockTolerance;break;case"undefined":d=0;break;default:throw new TypeError("Invalid clockTolerance option type")}const{currentDate:s}=i,r=OS(s||new Date);if((void 0!==l.iat||i.maxTokenAge)&&"number"!=typeof l.iat)throw new CS('"iat" claim must be a number',"iat","invalid");if(void 0!==l.nbf){if("number"!=typeof l.nbf)throw new CS('"nbf" claim must be a number',"nbf","invalid");if(l.nbf>r+d)throw new CS('"nbf" claim timestamp check failed',"nbf","check_failed")}if(void 0!==l.exp){if("number"!=typeof l.exp)throw new CS('"exp" claim must be a number',"exp","invalid");if(l.exp<=r-d)throw new RS('"exp" claim timestamp check failed',"exp","check_failed")}if(i.maxTokenAge){const e=r-l.iat;if(e-d>("number"==typeof i.maxTokenAge?i.maxTokenAge:qS(i.maxTokenAge)))throw new RS('"iat" claim timestamp check failed (too far in the past)',"iat","check_failed");if(e<0-d)throw new CS('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}return l}(l.protectedHeader,l.payload,i),c={payload:o,protectedHeader:l.protectedHeader};return"function"==typeof t?{...c,key:l.key}:c}function iv(e){return zS(e)}class nv{constructor(e){if(this._cached=new WeakMap,!function(e){return e&&"object"==typeof e&&Array.isArray(e.keys)&&e.keys.every(iv)}(e))throw new KS("JSON Web Key Set malformed");var t;this._jwks=(t=e,"function"==typeof structuredClone?structuredClone(t):JSON.parse(JSON.stringify(t)))}async getKey(e,t){const{alg:i,kid:n}={...e,...t.header},l=function(e){switch("string"==typeof e&&e.slice(0,2)){case"RS":case"PS":return"RSA";case"ES":return"EC";case"Ed":return"OKP";default:throw new vS('Unsupported "alg" value for a JSON Web Key Set')}}(i),o=this._jwks.keys.filter((e=>{let t=l===e.kty;if(t&&"string"==typeof n&&(t=n===e.kid),t&&"string"==typeof e.alg&&(t=i===e.alg),t&&"string"==typeof e.use&&(t="sig"===e.use),t&&Array.isArray(e.key_ops)&&(t=e.key_ops.includes("verify")),t&&"EdDSA"===i&&(t="Ed25519"===e.crv||"Ed448"===e.crv),t)switch(i){case"ES256":t="P-256"===e.crv;break;case"ES256K":t="secp256k1"===e.crv;break;case"ES384":t="P-384"===e.crv;break;case"ES512":t="P-521"===e.crv}return t})),{0:c,length:a}=o;if(0===a)throw new NS;if(1!==a)throw new JS;const d=this._cached.get(c)||this._cached.set(c,{}).get(c);if(void 0===d[i]){const e=await async function(e,t,i){if(!zS(e))throw new TypeError("JWK must be an object");if(t||(t=e.alg),"string"!=typeof t||!t)throw new TypeError('"alg" argument is required when "jwk.alg" is not present');switch(e.kty){case"oct":if("string"!=typeof e.k||!e.k)throw new TypeError('missing "k" (Key Value) Parameter value');return null!=i||(i=!0!==e.ext),i?PS({...e,alg:t,ext:!1}):VS(e.k);case"RSA":if(void 0!==e.oth)throw new vS('RSA JWK "oth" (Other Primes Info) Parameter value is not supported');case"EC":case"OKP":return PS({...e,alg:t});default:throw new vS('Unsupported "kty" (Key Type) Parameter value')}}({...c,ext:!0},i);if(e instanceof Uint8Array||"public"!==e.type)throw new KS("JSON Web Key Set members must be public keys");d[i]=e}return d[i]}}var lv={exports:{}},ov={exports:{}},cv=n(mC);
|
|
430
|
+
*/updateConfig(e){return Ly(this,void 0,void 0,(function*(){yield this._authenticationCore.updateConfig(e)}))}static clearUserSessionData(e){return Ly(this,void 0,void 0,(function*(){yield this._authenticationCore.clearUserSessionData(e)}))}}function _y(e,t,i){var n=void 0===t?null:t,l=function(e,t){var i=atob(e);if(t){for(var n=new Uint8Array(i.length),l=0,o=i.length;l<o;++l)n[l]=i.charCodeAt(l);return String.fromCharCode.apply(null,new Uint16Array(n.buffer))}return i}(e,void 0!==i&&i),o=l.indexOf("\n",10)+1,c=l.substring(o)+(n?"//# sourceMappingURL="+n:""),a=new Blob([c],{type:"application/javascript"});return URL.createObjectURL(a)}var qy,$y,eX,tX,iX=(qy="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlLHQsbixyKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKSgoZnVuY3Rpb24oaSxvKXtmdW5jdGlvbiBzKGUpe3RyeXtjKHIubmV4dChlKSl9Y2F0Y2goZSl7byhlKX19ZnVuY3Rpb24gYShlKXt0cnl7YyhyLnRocm93KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBjKGUpe3ZhciB0O2UuZG9uZT9pKGUudmFsdWUpOih0PWUudmFsdWUsdCBpbnN0YW5jZW9mIG4/dDpuZXcgbigoZnVuY3Rpb24oZSl7ZSh0KX0pKSkudGhlbihzLGEpfWMoKHI9ci5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pKX1mdW5jdGlvbiB0KGUsdCxuLHIpe3JldHVybiBuZXcobnx8KG49UHJvbWlzZSkpKChmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHMoZSl7dHJ5e2Moci5uZXh0KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBhKGUpe3RyeXtjKHIudGhyb3coZSkpfWNhdGNoKGUpe28oZSl9fWZ1bmN0aW9uIGMoZSl7dmFyIHQ7ZS5kb25lP2koZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygbj90Om5ldyBuKChmdW5jdGlvbihlKXtlKHQpfSkpKS50aGVuKHMsYSl9Yygocj1yLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSkpfXZhciBuOyFmdW5jdGlvbihlKXtlLmZvcm1Qb3N0PSJmb3JtX3Bvc3QiLGUucXVlcnk9InF1ZXJ5IixlLmRpcmVjdD0iZGlyZWN0In0obnx8KG49e30pKTt2YXIgcjshZnVuY3Rpb24oZSl7ZS5Db25maWdEYXRhPSJjb25maWdfZGF0YSIsZS5PSURDUHJvdmlkZXJNZXRhRGF0YT0ib2lkY19wcm92aWRlcl9tZXRhX2RhdGEiLGUuU2Vzc2lvbkRhdGE9InNlc3Npb25fZGF0YSIsZS5UZW1wb3JhcnlEYXRhPSJ0ZW1wb3JhcnlfZGF0YSJ9KHJ8fChyPXt9KSk7Y29uc3QgaT0icmVmcmVzaF90b2tlbl90aW1lciIsbz1bIlJTMjU2IiwiUlM1MTIiLCJSUzM4NCIsIlBTMjU2Il0scz0ic2lnbl9vdXRfdXJsIjt2YXIgYTshZnVuY3Rpb24oZSl7ZS5JbmNsdWRlPSJpbmNsdWRlIixlLlNhbWVPcmlnaW49InNhbWUtb3JpZ2luIixlLk9taXQ9Im9taXQifShhfHwoYT17fSkpO2NsYXNzIGN7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMubWVzc2FnZT1uLHRoaXMubmFtZT10LHRoaXMuY29kZT1lLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG5ldy50YXJnZXQucHJvdG90eXBlKX19Y2xhc3MgdXtjb25zdHJ1Y3Rvcigpe31zdGF0aWMgZmlsdGVyQ2xhaW1zRnJvbUlEVG9rZW5QYXlsb2FkKGUpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtudWxsPT10fHxkZWxldGUgdC5pc3MsbnVsbD09dHx8ZGVsZXRlIHQuYXVkLG51bGw9PXR8fGRlbGV0ZSB0LmV4cCxudWxsPT10fHxkZWxldGUgdC5pYXQsbnVsbD09dHx8ZGVsZXRlIHQuYWNyLG51bGw9PXR8fGRlbGV0ZSB0LmFtcixudWxsPT10fHxkZWxldGUgdC5henAsbnVsbD09dHx8ZGVsZXRlIHQuYXV0aF90aW1lLG51bGw9PXR8fGRlbGV0ZSB0Lm5vbmNlLG51bGw9PXR8fGRlbGV0ZSB0LmNfaGFzaCxudWxsPT10fHxkZWxldGUgdC5hdF9oYXNoLG51bGw9PXR8fGRlbGV0ZSB0Lm5iZixudWxsPT10fHxkZWxldGUgdC5pc2ssbnVsbD09dHx8ZGVsZXRlIHQuc2lkO2NvbnN0IG49e307cmV0dXJuIE9iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKGU9PntsZXRbdCxyXT1lO2NvbnN0IGk9dC5zcGxpdCgiXyIpLm1hcCgoKGUsdCk9PjA9PT10P2U6W2VbMF0udG9VcHBlckNhc2UoKSwuLi5lLnNsaWNlKDEpXS5qb2luKCIiKSkpLmpvaW4oIiIpO25baV09cn0pKSxufXN0YXRpYyBnZXRUb2tlblJlcXVlc3RIZWFkZXJzKCl7cmV0dXJue0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiIsIkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9fXN0YXRpYyBnZW5lcmF0ZVN0YXRlUGFyYW1Gb3JSZXF1ZXN0Q29ycmVsYXRpb24oZSx0KXtjb25zdCBuPXBhcnNlSW50KGUuc3BsaXQoIiMiKVsxXSk7cmV0dXJuIHQ/IiIuY29uY2F0KHQsIl9yZXF1ZXN0XyIpLmNvbmNhdChuKToicmVxdWVzdF8iLmNvbmNhdChuKX1zdGF0aWMgZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShlKXtyZXR1cm4icGtjZV9jb2RlX3ZlcmlmaWVyIyIuY29uY2F0KHBhcnNlSW50KGUuc3BsaXQoInJlcXVlc3RfIilbMV0pKX19dS5nZXRUZW5hbnREb21haW5Gcm9tSWRUb2tlblBheWxvYWQ9ZnVuY3Rpb24oZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiJAIjtjb25zdCBuPWUuc3ViLnNwbGl0KHQpO3JldHVybiBuLmxlbmd0aD4yP25bbi5sZW5ndGgtMV06IiJ9O2NsYXNzIGx7Y29uc3RydWN0b3IoZSxuKXt0aGlzLl9kYXRhTGF5ZXI9ZSx0aGlzLl9jb25maWc9KCk9PnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKX0pKSx0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YT0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKX0pKSx0aGlzLl9jcnlwdG9IZWxwZXI9bn1yZXNvbHZlRW5kcG9pbnRzKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD17fSxuPXlpZWxkIHRoaXMuX2NvbmZpZygpO3JldHVybiBuLmVuZHBvaW50cyYmT2JqZWN0LmtleXMobi5lbmRwb2ludHMpLmZvckVhY2goKGU9Pntjb25zdCByPWUucmVwbGFjZSgvW0EtWl0vZywoZT0+Il8iLmNvbmNhdChlLnRvTG93ZXJDYXNlKCkpKSk7dFtyXT0obnVsbD09bj92b2lkIDA6bi5lbmRwb2ludHMpP24uZW5kcG9pbnRzW2VdOiIifSkpLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx0KX0pKX1yZXNvbHZlRW5kcG9pbnRzRXhwbGljaXRseSgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT17fSx0PXlpZWxkIHRoaXMuX2NvbmZpZygpO2lmKCF0LmVuZHBvaW50c3x8IVsiYXV0aG9yaXphdGlvbl9lbmRwb2ludCIsImVuZF9zZXNzaW9uX2VuZHBvaW50Iiwiandrc191cmkiLCJjaGVja19zZXNzaW9uX2lmcmFtZSIsInJldm9jYXRpb25fZW5kcG9pbnQiLCJ0b2tlbl9lbmRwb2ludCIsImlzc3VlciIsInVzZXJpbmZvX2VuZHBvaW50Il0uZXZlcnkoKGU9PiEhdC5lbmRwb2ludHMmJk9iamVjdC5rZXlzKHQuZW5kcG9pbnRzKS5zb21lKCh0PT50LnJlcGxhY2UoL1tBLVpdL2csKGU9PiJfIi5jb25jYXQoZS50b0xvd2VyQ2FzZSgpKSkpPT09ZSkpKSkpdGhyb3cgbmV3IGMoIkpTLUFVVEhfSEVMUEVSLVJFRS1ORjAxIiwiUmVxdWlyZWQgZW5kcG9pbnRzIG1pc3NpbmciLCJTb21lIG9yIGFsbCBvZiB0aGUgcmVxdWlyZWQgZW5kcG9pbnRzIGFyZSBtaXNzaW5nIGluIHRoZSBvYmplY3QgcGFzc2VkIHRvIHRoZSBgZW5kcG9pbnRzYCBhdHRyaWJ1dGUgb2YgdGhlYEF1dGhDb25maWdgIG9iamVjdC4iKTtyZXR1cm4gdC5lbmRwb2ludHMmJk9iamVjdC5rZXlzKHQuZW5kcG9pbnRzKS5mb3JFYWNoKChuPT57Y29uc3Qgcj1uLnJlcGxhY2UoL1tBLVpdL2csKGU9PiJfIi5jb25jYXQoZS50b0xvd2VyQ2FzZSgpKSkpO2Vbcl09KG51bGw9PXQ/dm9pZCAwOnQuZW5kcG9pbnRzKT90LmVuZHBvaW50c1tuXToiIn0pKSxPYmplY3QuYXNzaWduKHt9LGUpfSkpfXJlc29sdmVFbmRwb2ludHNCeUJhc2VVUkwoKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9e30sdD15aWVsZCB0aGlzLl9jb25maWcoKSxuPXQuYmFzZVVybDtpZighbil0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVJfUkVCTy1ORjAxIiwiQmFzZSBVUkwgbm90IGRlZmluZWQuIiwiQmFzZSBVUkwgaXMgbm90IGRlZmluZWQgaW4gQXV0aENsaWVudCBjb25maWcuIik7dC5lbmRwb2ludHMmJk9iamVjdC5rZXlzKHQuZW5kcG9pbnRzKS5mb3JFYWNoKChuPT57Y29uc3Qgcj1uLnJlcGxhY2UoL1tBLVpdL2csKGU9PiJfIi5jb25jYXQoZS50b0xvd2VyQ2FzZSgpKSkpO2Vbcl09KG51bGw9PXQ/dm9pZCAwOnQuZW5kcG9pbnRzKT90LmVuZHBvaW50c1tuXToiIn0pKTtjb25zdCByPXthdXRob3JpemF0aW9uX2VuZHBvaW50OiIiLmNvbmNhdChuKS5jb25jYXQoIi9vYXV0aDIvYXV0aG9yaXplIiksZW5kX3Nlc3Npb25fZW5kcG9pbnQ6IiIuY29uY2F0KG4pLmNvbmNhdCgiL29pZGMvbG9nb3V0IiksaXNzdWVyOiIiLmNvbmNhdChuKS5jb25jYXQoIi9vYXV0aDIvdG9rZW4iKSxqd2tzX3VyaToiIi5jb25jYXQobikuY29uY2F0KCIvb2F1dGgyL2p3a3MiKSxjaGVja19zZXNzaW9uX2lmcmFtZToiIi5jb25jYXQobikuY29uY2F0KCIvb2lkYy9jaGVja3Nlc3Npb24iKSxyZXZvY2F0aW9uX2VuZHBvaW50OiIiLmNvbmNhdChuKS5jb25jYXQoIi9vYXV0aDIvcmV2b2tlIiksdG9rZW5fZW5kcG9pbnQ6IiIuY29uY2F0KG4pLmNvbmNhdCgiL29hdXRoMi90b2tlbiIpLHVzZXJpbmZvX2VuZHBvaW50OiIiLmNvbmNhdChuKS5jb25jYXQoIi9vYXV0aDIvdXNlcmluZm8iKX07cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSxlKX0pKX12YWxpZGF0ZUlkVG9rZW4oZSl7dmFyIG47cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PSh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKSkuandrc191cmkscj15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlNfQVVUSF9IRUxQRVItVklULU5GMDEiLCJKV0tTIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBKV0tTIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIEpXS1MgZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7bGV0IGk7dHJ5e2k9eWllbGQgZmV0Y2godCx7Y3JlZGVudGlhbHM6ci5zZW5kQ29va2llc0luUmVxdWVzdHM/YS5JbmNsdWRlOmEuU2FtZU9yaWdpbn0pfWNhdGNoKHQpe3Rocm93IG5ldyBjKCJKUy1BVVRIX0hFTFBFUi1WSVQtTkUwMiIsIlJlcXVlc3QgdG8gandrcyBlbmRwb2ludCBmYWlsZWQuIixudWxsIT10P3Q6IlRoZSByZXF1ZXN0IHNlbnQgdG8gZ2V0IHRoZSBqd2tzIGZyb20gdGhlIHNlcnZlciBmYWlsZWQuIil9aWYoMjAwIT09aS5zdGF0dXN8fCFpLm9rKXRocm93IG5ldyBjKCJKUy1BVVRIX0hFTFBFUi1WSVQtSEUwMyIsIkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciBqd2tzIHJlcXVlc3QgKCIuY29uY2F0KGkuc3RhdHVzVGV4dCwiKS4iKSx5aWVsZCBpLmpzb24oKSk7Y29uc3Qgbz0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkuaXNzdWVyLHtrZXlzOnN9PXlpZWxkIGkuanNvbigpLHU9eWllbGQgdGhpcy5fY3J5cHRvSGVscGVyLmdldEpXS0ZvclRoZUlkVG9rZW4oZS5zcGxpdCgiLiIpWzBdLHMpO3JldHVybiB0aGlzLl9jcnlwdG9IZWxwZXIuaXNWYWxpZElkVG9rZW4oZSx1LCh5aWVsZCB0aGlzLl9jb25maWcoKSkuY2xpZW50SUQsbnVsbCE9bz9vOiIiLHRoaXMuX2NyeXB0b0hlbHBlci5kZWNvZGVJRFRva2VuKGUpLnN1YiwoeWllbGQgdGhpcy5fY29uZmlnKCkpLmNsb2NrVG9sZXJhbmNlLG51bGw9PT0obj0oeWllbGQgdGhpcy5fY29uZmlnKCkpLnZhbGlkYXRlSURUb2tlbklzc3Vlcil8fHZvaWQgMD09PW58fG4pfSkpfWdldEF1dGhlbnRpY2F0ZWRVc2VySW5mbyhlKXt2YXIgdCxuLHIsaTtjb25zdCBvPXRoaXMuX2NyeXB0b0hlbHBlci5kZWNvZGVJRFRva2VuKGUpLHM9dS5nZXRUZW5hbnREb21haW5Gcm9tSWRUb2tlblBheWxvYWQobyksYT1udWxsIT09KHQ9bnVsbD09bz92b2lkIDA6by51c2VybmFtZSkmJnZvaWQgMCE9PXQ/dDoiIixjPW51bGwhPT0obj1vLmdpdmVuX25hbWUpJiZ2b2lkIDAhPT1uP246IiIsbD1udWxsIT09KHI9by5mYW1pbHlfbmFtZSkmJnZvaWQgMCE9PXI/cjoiIixkPWMmJmw/IiIuY29uY2F0KGMsIiAiKS5jb25jYXQobCk6Y3x8bHx8IiIsaD1udWxsIT09KGk9by5wcmVmZXJyZWRfdXNlcm5hbWUpJiZ2b2lkIDAhPT1pP2k6ZDtyZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGlzcGxheU5hbWU6aCx0ZW5hbnREb21haW46cyx1c2VybmFtZTphfSx1LmZpbHRlckNsYWltc0Zyb21JRFRva2VuUGF5bG9hZChvKSl9cmVwbGFjZUN1c3RvbUdyYW50VGVtcGxhdGVUYWdzKGUsbil7dmFyIHI7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtsZXQgdD0ib3BlbmlkIjtjb25zdCBpPXlpZWxkIHRoaXMuX2NvbmZpZygpLG89eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKG4pO3JldHVybiBpLnNjb3BlJiZpLnNjb3BlLmxlbmd0aD4wJiYoaS5zY29wZS5pbmNsdWRlcygib3BlbmlkIil8fGkuc2NvcGUucHVzaCgib3BlbmlkIiksdD1pLnNjb3BlLmpvaW4oIiAiKSksZS5yZXBsYWNlKCJ7e3Rva2VufX0iLG8uYWNjZXNzX3Rva2VuKS5yZXBsYWNlKCJ7e3VzZXJuYW1lfX0iLHRoaXMuZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKG8uaWRfdG9rZW4pLnVzZXJuYW1lKS5yZXBsYWNlKCJ7e3Njb3BlfX0iLHQpLnJlcGxhY2UoInt7Y2xpZW50SUR9fSIsaS5jbGllbnRJRCkucmVwbGFjZSgie3tjbGllbnRTZWNyZXR9fSIsbnVsbCE9PShyPWkuY2xpZW50U2VjcmV0KSYmdm9pZCAwIT09cj9yOiIiKX0pKX1jbGVhclVzZXJTZXNzaW9uRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVUZW1wb3JhcnlEYXRhKGUpLHlpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVTZXNzaW9uRGF0YShlKX0pKX1oYW5kbGVUb2tlblJlc3BvbnNlKGUsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZigyMDAhPT1lLnN0YXR1c3x8IWUub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfSEVMUEVSLUhUUi1ORTAxIiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHRva2VuIHJlcXVlc3QgKCIuY29uY2F0KGUuc3RhdHVzVGV4dCwiKS4iKSx5aWVsZCBlLmpzb24oKSk7Y29uc3Qgcj15aWVsZCBlLmpzb24oKTtpZihyLmNyZWF0ZWRfYXQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksKHlpZWxkIHRoaXMuX2NvbmZpZygpKS52YWxpZGF0ZUlEVG9rZW4pcmV0dXJuIHRoaXMudmFsaWRhdGVJZFRva2VuKHIuaWRfdG9rZW4pLnRoZW4oKCgpPT50KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFNlc3Npb25EYXRhKHIsbik7Y29uc3QgZT17YWNjZXNzVG9rZW46ci5hY2Nlc3NfdG9rZW4sY3JlYXRlZEF0OnIuY3JlYXRlZF9hdCxleHBpcmVzSW46ci5leHBpcmVzX2luLGlkVG9rZW46ci5pZF90b2tlbixyZWZyZXNoVG9rZW46ci5yZWZyZXNoX3Rva2VuLHNjb3BlOnIuc2NvcGUsdG9rZW5UeXBlOnIudG9rZW5fdHlwZX07cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKX0pKSkpO3tjb25zdCBlPXthY2Nlc3NUb2tlbjpyLmFjY2Vzc190b2tlbixjcmVhdGVkQXQ6ci5jcmVhdGVkX2F0LGV4cGlyZXNJbjpyLmV4cGlyZXNfaW4saWRUb2tlbjpyLmlkX3Rva2VuLHJlZnJlc2hUb2tlbjpyLnJlZnJlc2hfdG9rZW4sc2NvcGU6ci5zY29wZSx0b2tlblR5cGU6ci50b2tlbl90eXBlfTtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFNlc3Npb25EYXRhKHIsbiksUHJvbWlzZS5yZXNvbHZlKGUpfX0pKX1nZW5lcmF0ZVBLQ0VLZXkoZSl7dmFyIG47cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhKGUpLHI9W107T2JqZWN0LmtleXModCkuZm9yRWFjaCgoZT0+e2Uuc3RhcnRzV2l0aCgicGtjZV9jb2RlX3ZlcmlmaWVyIikmJnIucHVzaChlKX0pKTtjb25zdCBpPXIuc29ydCgpLnBvcCgpO3JldHVybiJwa2NlX2NvZGVfdmVyaWZpZXIjIi5jb25jYXQocGFyc2VJbnQobnVsbCE9PShuPW51bGw9PWk/dm9pZCAwOmkuc3BsaXQoIiMiKVsxXSkmJnZvaWQgMCE9PW4/bjoiLTEiKSsxKX0pKX19Y2xhc3MgZHtjb25zdHJ1Y3RvcihlKXt0aGlzLl9jcnlwdG9VdGlscz1lfWdldENvZGVWZXJpZmllcigpe3JldHVybiB0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxFbmNvZGUodGhpcy5fY3J5cHRvVXRpbHMuZ2VuZXJhdGVSYW5kb21CeXRlcygzMikpfWdldENvZGVDaGFsbGVuZ2UoZSl7cmV0dXJuIHRoaXMuX2NyeXB0b1V0aWxzLmJhc2U2NFVSTEVuY29kZSh0aGlzLl9jcnlwdG9VdGlscy5oYXNoU2hhMjU2KGUpKX1nZXRKV0tGb3JUaGVJZFRva2VuKGUsdCl7Y29uc3Qgbj1KU09OLnBhcnNlKHRoaXMuX2NyeXB0b1V0aWxzLmJhc2U2NFVSTERlY29kZShlKSk7Zm9yKGNvbnN0IGUgb2YgdClpZihuLmtpZD09PWUua2lkKXJldHVybiBlO3Rocm93IG5ldyBjKCJKUy1DUllQVE9fVVRJTC1HSkZUSVQtSVYwMSIsImtpZCBub3QgZm91bmQuIiwiRmFpbGVkIHRvIGZpbmQgdGhlICdraWQnIHNwZWNpZmllZCBpbiB0aGUgaWRfdG9rZW4uICdraWQnIGZvdW5kIGluIHRoZSBoZWFkZXIgOiAiK24ua2lkKyIsIEV4cGVjdGVkIHZhbHVlczogIit0Lm1hcCgoZT0+ZS5raWQpKS5qb2luKCIsICIpKX1pc1ZhbGlkSWRUb2tlbihlLHQsbixyLGkscyxhKXtyZXR1cm4gdGhpcy5fY3J5cHRvVXRpbHMudmVyaWZ5Snd0KGUsdCxvLG4scixpLHMsYSkudGhlbigoZT0+ZT9Qcm9taXNlLnJlc29sdmUoITApOlByb21pc2UucmVqZWN0KG5ldyBjKCJKUy1DUllQVE9fSEVMUEVSLUlWSVQtSVYwMSIsIkludmFsaWQgSUQgdG9rZW4uIiwiSUQgdG9rZW4gdmFsaWRhdGlvbiByZXR1cm5lZCBmYWxzZSIpKSkpfWRlY29kZUlEVG9rZW4oZSl7dHJ5e2NvbnN0IHQ9dGhpcy5fY3J5cHRvVXRpbHMuYmFzZTY0VVJMRGVjb2RlKGUuc3BsaXQoIi4iKVsxXSk7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2goZSl7dGhyb3cgbmV3IGMoIkpTLUNSWVBUT19VVElMLURJVC1JVjAxIiwiRGVjb2RpbmcgSUQgdG9rZW4gZmFpbGVkLiIsZSl9fX1jbGFzcyBoe2NvbnN0cnVjdG9yKGUsbil7dGhpcy5fY3J5cHRvVXRpbHM9bix0aGlzLl9jcnlwdG9IZWxwZXI9bmV3IGQobiksdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXI9bmV3IGwoZSx0aGlzLl9jcnlwdG9IZWxwZXIpLHRoaXMuX2RhdGFMYXllcj1lLHRoaXMuX2NvbmZpZz0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpfSkpLHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhPSgpPT50KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpfSkpfWdldEF1dGhvcml6YXRpb25VUkxQYXJhbXMoZSxuKXt2YXIgcixpLG87cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX2NvbmZpZygpLHM9bmV3IE1hcDtzLnNldCgicmVzcG9uc2VfdHlwZSIsImNvZGUiKSxzLnNldCgiY2xpZW50X2lkIix0LmNsaWVudElEKSx0LmNsaWVudFNlY3JldCYmdC5jbGllbnRTZWNyZXQudHJpbSgpLmxlbmd0aD4wJiZzLnNldCgiY2xpZW50X3NlY3JldCIsdC5jbGllbnRTZWNyZXQpO2xldCBhPSJvcGVuaWQiO3Quc2NvcGUmJnQuc2NvcGUubGVuZ3RoPjAmJih0LnNjb3BlLmluY2x1ZGVzKCJvcGVuaWQiKXx8dC5zY29wZS5wdXNoKCJvcGVuaWQiKSxhPXQuc2NvcGUuam9pbigiICIpKSxzLnNldCgic2NvcGUiLGEpLHMuc2V0KCJyZWRpcmVjdF91cmkiLHQuc2lnbkluUmVkaXJlY3RVUkwpLHQucmVzcG9uc2VNb2RlJiZzLnNldCgicmVzcG9uc2VfbW9kZSIsdC5yZXNwb25zZU1vZGUpO2NvbnN0IGM9eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuZ2VuZXJhdGVQS0NFS2V5KG4pO2lmKHQuZW5hYmxlUEtDRSl7Y29uc3QgZT1udWxsPT09KHI9dGhpcy5fY3J5cHRvSGVscGVyKXx8dm9pZCAwPT09cj92b2lkIDA6ci5nZXRDb2RlVmVyaWZpZXIoKSx0PW51bGw9PT0oaT10aGlzLl9jcnlwdG9IZWxwZXIpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLmdldENvZGVDaGFsbGVuZ2UoZSk7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoYyxlLG4pLHMuc2V0KCJjb2RlX2NoYWxsZW5nZV9tZXRob2QiLCJTMjU2Iikscy5zZXQoImNvZGVfY2hhbGxlbmdlIix0KX10LnByb21wdCYmcy5zZXQoInByb21wdCIsdC5wcm9tcHQpO2NvbnN0IGw9ZTtpZihsKWZvcihjb25zdFtlLHRdb2YgT2JqZWN0LmVudHJpZXMobCkpIiIhPWUmJiIiIT10JiYic3RhdGUiIT09ZSYmcy5zZXQoZSx0LnRvU3RyaW5nKCkpO3JldHVybiBzLnNldCgic3RhdGUiLHUuZ2VuZXJhdGVTdGF0ZVBhcmFtRm9yUmVxdWVzdENvcnJlbGF0aW9uKGMsbD9udWxsPT09KG89bC5zdGF0ZSl8fHZvaWQgMD09PW8/dm9pZCAwOm8udG9TdHJpbmcoKToiIikpLHN9KSl9Z2V0QXV0aG9yaXphdGlvblVSTChlLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIoImF1dGhvcml6YXRpb25fZW5kcG9pbnQiKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdBVS1ORjAxIiwiTm8gYXV0aG9yaXphdGlvbiBlbmRwb2ludCBmb3VuZC4iLCJObyBhdXRob3JpemF0aW9uIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgZnJvbSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgYXV0aG9yaXphdGlvbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCByPW5ldyBVUkwodCksaT15aWVsZCB0aGlzLmdldEF1dGhvcml6YXRpb25VUkxQYXJhbXMoZSxuKTtmb3IoY29uc3RbZSx0XW9mIGkuZW50cmllcygpKXIuc2VhcmNoUGFyYW1zLmFwcGVuZChlLHQpO3JldHVybiByLnRvU3RyaW5nKCl9KSl9cmVxdWVzdEFjY2Vzc1Rva2VuKGUsbixyLGksbyl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PSh5aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKS50b2tlbl9lbmRwb2ludCxzPXlpZWxkIHRoaXMuX2NvbmZpZygpO2lmKCF0fHwwPT09dC50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMS1ORjAxIiwiVG9rZW4gZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIHRva2VuIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO24mJih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoInNlc3Npb25fc3RhdGUiLG4saSkpO2NvbnN0IGw9bmV3IFVSTFNlYXJjaFBhcmFtcztsLnNldCgiY2xpZW50X2lkIixzLmNsaWVudElEKSxzLmNsaWVudFNlY3JldCYmcy5jbGllbnRTZWNyZXQudHJpbSgpLmxlbmd0aD4wJiZsLnNldCgiY2xpZW50X3NlY3JldCIscy5jbGllbnRTZWNyZXQpO2NvbnN0IGQ9ZTtsZXQgaDtsLnNldCgiY29kZSIsZCksbC5zZXQoImdyYW50X3R5cGUiLCJhdXRob3JpemF0aW9uX2NvZGUiKSxsLnNldCgicmVkaXJlY3RfdXJpIixzLnNpZ25JblJlZGlyZWN0VVJMKSwobnVsbD09bz92b2lkIDA6by5wYXJhbXMpJiZPYmplY3QuZW50cmllcyhvLnBhcmFtcykuZm9yRWFjaCgoZT0+e2xldFt0LG5dPWU7bC5hcHBlbmQodCxuKX0pKSxzLmVuYWJsZVBLQ0UmJihsLnNldCgiY29kZV92ZXJpZmllciIsIiIuY29uY2F0KHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShyKSxpKSkpLHlpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShyKSxpKSk7dHJ5e2g9eWllbGQgZmV0Y2godCx7Ym9keTpsLGNyZWRlbnRpYWxzOnMuc2VuZENvb2tpZXNJblJlcXVlc3RzP2EuSW5jbHVkZTphLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyh1LmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSksbWV0aG9kOiJQT1NUIn0pfWNhdGNoKHQpe3Rocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMS1ORTAyIiwiUmVxdWVzdGluZyBhY2Nlc3MgdG9rZW4gZmFpbGVkIixudWxsIT10P3Q6IlRoZSByZXF1ZXN0IHRvIGdldCB0aGUgYWNjZXNzIHRva2VuIGZyb20gdGhlIHNlcnZlciBmYWlsZWQuIil9aWYoIWgub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQxLUhFMDMiLCJSZXF1ZXN0aW5nIGFjY2VzcyB0b2tlbiBmYWlsZWQgd2l0aCAiLmNvbmNhdChoLnN0YXR1c1RleHQpLHlpZWxkIGguanNvbigpKTtyZXR1cm4geWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShoLGkpfSkpfXJlZnJlc2hBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9KHlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkpLnRva2VuX2VuZHBvaW50LG49eWllbGQgdGhpcy5fY29uZmlnKCkscj15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSk7aWYoIXIucmVmcmVzaF90b2tlbil0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDItTkYwMSIsIk5vIHJlZnJlc2ggdG9rZW4gZm91bmQuIiwiVGhlcmUgd2FzIG5vIHJlZnJlc2ggdG9rZW4gZm91bmQuIEFzZ2FyZGVvIGRvZXNuJ3QgcmV0dXJuIGEgcmVmcmVzaCB0b2tlbiBpZiB0aGUgcmVmcmVzaCB0b2tlbiBncmFudCBpcyBub3QgZW5hYmxlZC4iKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDItTkYwMiIsIk5vIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgZm91bmQuIiwiTm8gcmVmcmVzaCB0b2tlbiBlbmRwb2ludCB3YXMgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSByZWZyZXNoIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2NvbnN0IGk9W107bGV0IG87aS5wdXNoKCJjbGllbnRfaWQ9Ii5jb25jYXQobi5jbGllbnRJRCkpLGkucHVzaCgicmVmcmVzaF90b2tlbj0iLmNvbmNhdChyLnJlZnJlc2hfdG9rZW4pKSxpLnB1c2goImdyYW50X3R5cGU9cmVmcmVzaF90b2tlbiIpLG4uY2xpZW50U2VjcmV0JiZuLmNsaWVudFNlY3JldC50cmltKCkubGVuZ3RoPjAmJmkucHVzaCgiY2xpZW50X3NlY3JldD0iLmNvbmNhdChuLmNsaWVudFNlY3JldCkpO3RyeXtvPXlpZWxkIGZldGNoKHQse2JvZHk6aS5qb2luKCImIiksY3JlZGVudGlhbHM6bi5zZW5kQ29va2llc0luUmVxdWVzdHM/YS5JbmNsdWRlOmEuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKHUuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QifSl9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQyLU5SMDMiLCJSZWZyZXNoIGFjY2VzcyB0b2tlbiByZXF1ZXN0IGZhaWxlZC4iLG51bGwhPXQ/dDoiVGhlIHJlcXVlc3QgdG8gcmVmcmVzaCB0aGUgYWNjZXNzIHRva2VuIGZhaWxlZC4iKX1pZighby5vayl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDItSEUwNCIsIlJlZnJlc2hpbmcgYWNjZXNzIHRva2VuIGZhaWxlZCB3aXRoICIuY29uY2F0KG8uc3RhdHVzVGV4dCkseWllbGQgby5qc29uKCkpO3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5oYW5kbGVUb2tlblJlc3BvbnNlKG8sZSl9KSl9cmV2b2tlQWNjZXNzVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PSh5aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKS5yZXZvY2F0aW9uX2VuZHBvaW50LG49eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQzLU5GMDEiLCJObyByZXZva2UgYWNjZXNzIHRva2VuIGVuZHBvaW50IGZvdW5kLiIsIk5vIHJldm9rZSBhY2Nlc3MgdG9rZW4gZW5kcG9pbnQgd2FzIGZvdW5kIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgcmV2b2tlIGFjY2VzcyB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCByPVtdO2xldCBpO3IucHVzaCgiY2xpZW50X2lkPSIuY29uY2F0KG4uY2xpZW50SUQpKSxyLnB1c2goInRva2VuPSIuY29uY2F0KCh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSkpLmFjY2Vzc190b2tlbikpLHIucHVzaCgidG9rZW5fdHlwZV9oaW50PWFjY2Vzc190b2tlbiIpO3RyeXtpPXlpZWxkIGZldGNoKHQse2JvZHk6ci5qb2luKCImIiksY3JlZGVudGlhbHM6bi5zZW5kQ29va2llc0luUmVxdWVzdHM/YS5JbmNsdWRlOmEuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKHUuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QifSl9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQzLU5FMDIiLCJUaGUgcmVxdWVzdCB0byByZXZva2UgYWNjZXNzIHRva2VuIGZhaWxlZC4iLG51bGwhPXQ/dDoiVGhlIHJlcXVlc3Qgc2VudCB0byByZXZva2UgdGhlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIil9aWYoMjAwIT09aS5zdGF0dXN8fCFpLm9rKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMy1IRTAzIiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHJldm9rZSBhY2Nlc3MgdG9rZW4gcmVxdWVzdCAoIi5jb25jYXQoaS5zdGF0dXNUZXh0LCIpLiIpLHlpZWxkIGkuanNvbigpKTtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuY2xlYXJVc2VyU2Vzc2lvbkRhdGEoZSksUHJvbWlzZS5yZXNvbHZlKGkpfSkpfXJlcXVlc3RDdXN0b21HcmFudChlLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgcj15aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpLGk9eWllbGQgdGhpcy5fY29uZmlnKCk7bGV0IG87aWYobz1lLnRva2VuRW5kcG9pbnQmJjAhPT1lLnRva2VuRW5kcG9pbnQudHJpbSgpLmxlbmd0aD9lLnRva2VuRW5kcG9pbnQ6ci50b2tlbl9lbmRwb2ludCwhb3x8MD09PW8udHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJDRy1ORjAxIiwiVG9rZW4gZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIHRva2VuIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2NvbnN0IHM9eWllbGQgUHJvbWlzZS5hbGwoT2JqZWN0LmVudHJpZXMoZS5kYXRhKS5tYXAoKGU9PntsZXRbcixpXT1lO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXBsYWNlQ3VzdG9tR3JhbnRUZW1wbGF0ZVRhZ3MoaSxuKTtyZXR1cm4iIi5jb25jYXQociwiPSIpLmNvbmNhdChlKX0pKX0pKSk7bGV0IGw9T2JqZWN0LmFzc2lnbih7fSx1LmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSk7ZS5hdHRhY2hUb2tlbiYmKGw9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGwpLHtBdXRob3JpemF0aW9uOiJCZWFyZXIgIi5jb25jYXQoKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShuKSkuYWNjZXNzX3Rva2VuKX0pKTtjb25zdCBkPXtib2R5OnMuam9pbigiJiIpLGNyZWRlbnRpYWxzOmkuc2VuZENvb2tpZXNJblJlcXVlc3RzP2EuSW5jbHVkZTphLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyhsKSxtZXRob2Q6IlBPU1QifTtsZXQgaDt0cnl7aD15aWVsZCBmZXRjaChvLGQpfWNhdGNoKGUpe3Rocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkNHLU5FMDIiLCJUaGUgY3VzdG9tIGdyYW50IHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9ZT9lOiJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgY3VzdG9tIGdyYW50IGZhaWxlZC4iKX1pZigyMDAhPT1oLnN0YXR1c3x8IWgub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQ0ctSEUwMyIsIkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0aGUgY3VzdG9tIGdyYW50IHJlcXVlc3QuICgiLmNvbmNhdChoLnN0YXR1c1RleHQsIikiKSx5aWVsZCBoLmpzb24oKSk7cmV0dXJuIGUucmV0dXJuc1Nlc3Npb24/dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShoLG4pOlByb21pc2UucmVzb2x2ZSh5aWVsZCBoLmpzb24oKSl9KSl9Z2V0QmFzaWNVc2VySW5mbyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpLG49dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKG51bGw9PXQ/dm9pZCAwOnQuaWRfdG9rZW4pO2xldCByPXthbGxvd2VkU2NvcGVzOnQuc2NvcGUsc2Vzc2lvblN0YXRlOnQuc2Vzc2lvbl9zdGF0ZX07cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2goKGU9Pnt2b2lkIDAhPT1uW2VdJiYiIiE9PW5bZV0mJm51bGwhPT1uW2VdfHxkZWxldGUgbltlXX0pKSxyPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSxuKSxyfSkpfWdldERlY29kZWRJRFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5pZF90b2tlbjtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyLmRlY29kZUlEVG9rZW4odCl9KSl9Z2V0Q3J5cHRvSGVscGVyKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyfSkpfWdldElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5pZF90b2tlbn0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIWUmJih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3Qgbj10LndlbGxLbm93bkVuZHBvaW50O2lmKG4pe2xldCBlO3RyeXtpZihlPXlpZWxkIGZldGNoKG4pLDIwMCE9PWUuc3RhdHVzfHwhZS5vayl0aHJvdyBuZXcgRXJyb3J9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HT1BNRC1IRTAxIiwiSW52YWxpZCB3ZWxsLWtub3duIHJlc3BvbnNlIiwiVGhlIHdlbGwga25vd24gZW5kcG9pbnQgcmVzcG9uc2UgaGFzIGJlZW4gZmFpbGVkIHdpdGggYW4gZXJyb3IuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzKHlpZWxkIGUuanNvbigpKSkseWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiLCEwKSxQcm9taXNlLnJlc29sdmUoKX1pZih0LmJhc2VVcmwpe3RyeXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZUVuZHBvaW50c0J5QmFzZVVSTCgpKX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdPUE1ELUlWMDIiLCJSZXNvbHZpbmcgZW5kcG9pbnRzIGZhaWxlZC4iLG51bGwhPXQ/dDoiUmVzb2x2aW5nIGVuZHBvaW50cyBieSBiYXNlIHVybCBmYWlsZWQuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIiwhMCksUHJvbWlzZS5yZXNvbHZlKCl9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzRXhwbGljaXRseSgpKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIsITApLFByb21pc2UucmVzb2x2ZSgpfSkpfWdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl7dmFyIGUsbixyLGksbyxzLGEsYyx1LGw7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCk7cmV0dXJue2F1dGhvcml6YXRpb25FbmRwb2ludDpudWxsIT09KGU9dC5hdXRob3JpemF0aW9uX2VuZHBvaW50KSYmdm9pZCAwIT09ZT9lOiIiLGNoZWNrU2Vzc2lvbklmcmFtZTpudWxsIT09KG49dC5jaGVja19zZXNzaW9uX2lmcmFtZSkmJnZvaWQgMCE9PW4/bjoiIixlbmRTZXNzaW9uRW5kcG9pbnQ6bnVsbCE9PShyPXQuZW5kX3Nlc3Npb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1yP3I6IiIsaW50cm9zcGVjdGlvbkVuZHBvaW50Om51bGwhPT0oaT10LmludHJvc3BlY3Rpb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1pP2k6IiIsaXNzdWVyOm51bGwhPT0obz10Lmlzc3VlcikmJnZvaWQgMCE9PW8/bzoiIixqd2tzVXJpOm51bGwhPT0ocz10Lmp3a3NfdXJpKSYmdm9pZCAwIT09cz9zOiIiLHJlZ2lzdHJhdGlvbkVuZHBvaW50Om51bGwhPT0oYT10LnJlZ2lzdHJhdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWE/YToiIixyZXZvY2F0aW9uRW5kcG9pbnQ6bnVsbCE9PShjPXQucmV2b2NhdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWM/YzoiIix0b2tlbkVuZHBvaW50Om51bGwhPT0odT10LnRva2VuX2VuZHBvaW50KSYmdm9pZCAwIT09dT91OiIiLHVzZXJpbmZvRW5kcG9pbnQ6bnVsbCE9PShsPXQudXNlcmluZm9fZW5kcG9pbnQpJiZ2b2lkIDAhPT1sP2w6IiJ9fSkpfWdldFNpZ25PdXRVUkwoZSl7dmFyIG4scixpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsPT09KG49eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZW5kX3Nlc3Npb25fZW5kcG9pbnQsbz15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdTT1UtTkYwMSIsIlNpZ24tb3V0IGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBzaWduLW91dCBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSBzaWduLW91dCBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCBzPW51bGwhPT0ocj1udWxsPT1vP3ZvaWQgMDpvLnNpZ25PdXRSZWRpcmVjdFVSTCkmJnZvaWQgMCE9PXI/cjpudWxsPT1vP3ZvaWQgMDpvLnNpZ25JblJlZGlyZWN0VVJMO2lmKCFzfHwwPT09cy50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtR1NPVS1ORjAzIiwiTm8gc2lnbi1vdXQgcmVkaXJlY3QgVVJMIGZvdW5kLiIsIlRoZSBzaWduLW91dCByZWRpcmVjdCBVUkwgY2Fubm90IGJlIGZvdW5kIG9yIHRoZSBVUkwgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIE5vIHNpZ24taW4gcmVkaXJlY3QgVVJMIGhhcyBiZWVuIGZvdW5kIGVpdGhlci4gIik7Y29uc3QgYT1uZXcgVVJMU2VhcmNoUGFyYW1zO2lmKGEuc2V0KCJwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLHMpLG8uc2VuZElkVG9rZW5JbkxvZ291dFJlcXVlc3Qpe2NvbnN0IHQ9bnVsbD09PShpPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PWk/dm9pZCAwOmkuaWRfdG9rZW47aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HU09VLU5GMDIiLCJJRCB0b2tlbiBub3QgZm91bmQuIiwiTm8gSUQgdG9rZW4gY291bGQgYmUgZm91bmQuIEVpdGhlciB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpcyBsb3N0IG9yIHlvdSBoYXZlIG5vdCBzaWduZWQgaW4uIik7YS5zZXQoImlkX3Rva2VuX2hpbnQiLHQpfWVsc2UgYS5zZXQoImNsaWVudF9pZCIsby5jbGllbnRJRCk7cmV0dXJuIGEuc2V0KCJzdGF0ZSIsInNpZ25fb3V0X3N1Y2Nlc3MiKSwiIi5jb25jYXQodCwiPyIpLmNvbmNhdChhLnRvU3RyaW5nKCkpfSkpfWNsZWFyVXNlclNlc3Npb25EYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuY2xlYXJVc2VyU2Vzc2lvbkRhdGEoZSl9KSl9Z2V0QWNjZXNzVG9rZW4oZSl7dmFyIG47cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbnVsbD09PShuPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uYWNjZXNzX3Rva2VufSkpfWdldENyZWF0ZWRBdChlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KG49eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5jcmVhdGVkX2F0fSkpfWdldEV4cGlyZXNJbihlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KG49eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5leHBpcmVzX2lufSkpfWlzQXV0aGVudGljYXRlZChlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9Qm9vbGVhbih5aWVsZCB0aGlzLmdldEFjY2Vzc1Rva2VuKGUpKSxuPXlpZWxkIHRoaXMuZ2V0Q3JlYXRlZEF0KGUpLHI9eWllbGQgdGhpcy5nZXRFeHBpcmVzSW4oZSk7aWYoIXIpcmV0dXJuITE7Y29uc3QgaT0xZTMqcGFyc2VJbnQociksbz0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gdCYmbitpPm99KSl9Z2V0UEtDRUNvZGUoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcih1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0oZSksbil9KSl9c2V0UEtDRUNvZGUoZSxuLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShuKSxlLHIpfSkpfXVwZGF0ZUNvbmZpZyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRDb25maWdEYXRhKGUpLHlpZWxkIHRoaXMuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITApfSkpfX1jbGFzcyBme2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5faWQ9ZSx0aGlzLl9zdG9yZT10fXNldERhdGFJbkJ1bGsoZSxuKXt2YXIgcjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9bnVsbCE9PShyPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEoZSkpJiZ2b2lkIDAhPT1yP3I6bnVsbCxpPXQmJkpTT04ucGFyc2UodCksbz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSksbikscz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9c2V0VmFsdWUoZSxuLHIpe3ZhciBpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KGk9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PWk/aTpudWxsLG89dCYmSlNPTi5wYXJzZSh0KSxzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxvKSx7W25dOnJ9KSxhPUpTT04uc3RyaW5naWZ5KHMpO3lpZWxkIHRoaXMuX3N0b3JlLnNldERhdGEoZSxhKX0pKX1yZW1vdmVWYWx1ZShlLG4pe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KHI9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PXI/cjpudWxsLGk9dCYmSlNPTi5wYXJzZSh0KSxvPU9iamVjdC5hc3NpZ24oe30saSk7ZGVsZXRlIG9bbl07Y29uc3Qgcz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9X3Jlc29sdmVLZXkoZSx0KXtyZXR1cm4gdD8iIi5jb25jYXQoZSwiLSIpLmNvbmNhdCh0aGlzLl9pZCwiLSIpLmNvbmNhdCh0KToiIi5jb25jYXQoZSwiLSIpLmNvbmNhdCh0aGlzLl9pZCl9aXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKXt0cnl7Y29uc3QgZT0iX19BU0dBUkRFT19BVVRIX0NPUkVfTE9DQUxfU1RPUkFHRV9URVNUX18iO3JldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShlLGUpLGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX1zZXRDb25maWdEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoci5Db25maWdEYXRhKSxlKX0pKX1zZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KHIuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXNldFRlbXBvcmFyeURhdGEoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxuKSxlKX0pKX1zZXRTZXNzaW9uRGF0YShlLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoci5TZXNzaW9uRGF0YSxuKSxlKX0pKX1zZXRDdXN0b21EYXRhKGUsbixyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KGUsciksbil9KSl9Z2V0Q29uZmlnRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpKSkmJnZvaWQgMCE9PWU/ZTpudWxsKX0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShyLk9JRENQcm92aWRlck1ldGFEYXRhKSkpJiZ2b2lkIDAhPT1lP2U6bnVsbCl9KSl9Z2V0VGVtcG9yYXJ5RGF0YShlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0obj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5UZW1wb3JhcnlEYXRhLGUpKSkmJnZvaWQgMCE9PW4/bjpudWxsKX0pKX1nZXRTZXNzaW9uRGF0YShlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0obj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5TZXNzaW9uRGF0YSxlKSkpJiZ2b2lkIDAhPT1uP246bnVsbCl9KSl9Z2V0Q3VzdG9tRGF0YShlLG4pe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShyPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShlLG4pKSkmJnZvaWQgMCE9PXI/cjpudWxsKX0pKX1zZXRTZXNzaW9uU3RhdHVzKGUpe3RoaXMuaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSYmbG9jYWxTdG9yYWdlLnNldEl0ZW0oImFzZ2FyZGVvLXNlc3Npb24tYWN0aXZlIixlKX1nZXRTZXNzaW9uU3RhdHVzKCl7dmFyIGU7cmV0dXJuIHRoaXMuaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSYmbnVsbCE9PShlPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJhc2dhcmRlby1zZXNzaW9uLWFjdGl2ZSIpKSYmdm9pZCAwIT09ZT9lOiIifXJlbW92ZVNlc3Npb25TdGF0dXMoKXt0aGlzLmlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKCkmJmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJhc2dhcmRlby1zZXNzaW9uLWFjdGl2ZSIpfXJlbW92ZUNvbmZpZ0RhdGEoKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpKX0pKX1yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpKX0pKX1yZW1vdmVUZW1wb3JhcnlEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxlKSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5TZXNzaW9uRGF0YSxlKSl9KSl9Z2V0Q29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuQ29uZmlnRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5PSURDUHJvdmlkZXJNZXRhRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxuKSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodClbZV19KSl9Z2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuU2Vzc2lvbkRhdGEsbikpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfXNldENvbmZpZ0RhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpLGUsbil9KSl9c2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLk9JRENQcm92aWRlck1ldGFEYXRhKSxlLG4pfSkpfXNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxuLGkpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxpKSxlLG4pfSkpfXNldFNlc3Npb25EYXRhUGFyYW1ldGVyKGUsbixpKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLlNlc3Npb25EYXRhLGkpLGUsbil9KSl9cmVtb3ZlQ29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpLGUpfSkpfXJlbW92ZU9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KHIuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLlRlbXBvcmFyeURhdGEsbiksZSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLlNlc3Npb25EYXRhLG4pLGUpfSkpfX1jb25zdCBwPXtjbG9ja1RvbGVyYW5jZTozMDAsZW5hYmxlUEtDRTohMCxyZXNwb25zZU1vZGU6bi5xdWVyeSxzY29wZTpbIm9wZW5pZCJdLHNlbmRDb29raWVzSW5SZXF1ZXN0czohMCx2YWxpZGF0ZUlEVG9rZW46ITAsdmFsaWRhdGVJRFRva2VuSXNzdWVyOiEwfTtjbGFzcyBnewovKioKICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gc3RvcmUgLSBUaGUgc3RvcmUgb2JqZWN0LgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IF9zdG9yZTogU3RvcmUgPSBuZXcgRGF0YVN0b3JlKCk7CiAgICAgICAgICAgKiBjb25zdCBhdXRoID0gbmV3IEFzZ2FyZGVvQXV0aENsaWVudDxDdXN0b21DbGllbnRDb25maWc+KF9zdG9yZSk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2NvbnN0cnVjdG9yfQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovCmNvbnN0cnVjdG9yKCl7fQovKioKICAgICAgICAgICAqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0aGUgU0RLIHdpdGggdGhlIGNvbmZpZyBkYXRhLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlnIG9iamVjdCB0byBpbml0aWFsaXplIHdpdGguCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IFx7CiAgICAgICAgICAgKiAgICAgc2lnbkluUmVkaXJlY3RVUkw6ICJodHRwOi8vbG9jYWxob3N0OjMwMDAvc2lnbi1pbiIsCiAgICAgICAgICAgKiAgICAgY2xpZW50SUQ6ICJjbGllbnQgSUQiLAogICAgICAgICAgICogICAgIGJhc2VVcmw6ICJodHRwczovL2xvY2FsaG9zdDo5NDQzIgogICAgICAgICAgICogXH0KICAgICAgICAgICAqCiAgICAgICAgICAgKiBhd2FpdCBhdXRoLmluaXRpYWxpemUoY29uZmlnKTsKICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2luaXRpYWxpemV9CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi9pbml0aWFsaXplKGUsbixyLGkpe3ZhciBvLHMsYTtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9ZS5jbGllbnRJRDtnLl9pbnN0YW5jZUlEP2cuX2luc3RhbmNlSUQrPTE6Zy5faW5zdGFuY2VJRD0wLGkmJihnLl9pbnN0YW5jZUlEPWkpLHRoaXMuX2RhdGFMYXllcj1uZXcgZih0PyJpbnN0YW5jZV8iLmNvbmNhdChnLl9pbnN0YW5jZUlELCItIikuY29uY2F0KHQpOiJpbnN0YW5jZV8iLmNvbmNhdChnLl9pbnN0YW5jZUlEKSxuKSx0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmU9bmV3IGgodGhpcy5fZGF0YUxheWVyLHIpLGcuX2F1dGhlbnRpY2F0aW9uQ29yZT1uZXcgaCh0aGlzLl9kYXRhTGF5ZXIscikseWllbGQgdGhpcy5fZGF0YUxheWVyLnNldENvbmZpZ0RhdGEoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scCksZSkse3Njb3BlOlsuLi5udWxsIT09KG89cC5zY29wZSkmJnZvaWQgMCE9PW8/bzpbXSwuLi5udWxsIT09KGE9bnVsbD09PShzPWUuc2NvcGUpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLmZpbHRlcigoZT0+e3ZhciB0O3JldHVybiEobnVsbD09PSh0PW51bGw9PXA/dm9pZCAwOnAuc2NvcGUpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmluY2x1ZGVzKGUpKX0pKSkmJnZvaWQgMCE9PWE/YTpbXV19KSl9KSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYERhdGFMYXllcmAgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBhY2Nlc3MgYXV0aGVudGljYXRpb24gZGF0YS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIFRoZSBgRGF0YUxheWVyYCBvYmplY3QuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogY29uc3QgZGF0YSA9IGF1dGguZ2V0RGF0YUxheWVyKCk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldERhdGFMYXllcn0KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL2dldERhdGFMYXllcigpe3JldHVybiB0aGlzLl9kYXRhTGF5ZXJ9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYGluc3RhbmNlSURgIHZhcmlhYmxlIG9mIHRoZSBnaXZlbiBpbnN0YW5jZS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIFRoZSBgaW5zdGFuY2VJRGAgbnVtYmVyLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IGluc3RhbmNlSWQgPSBhdXRoLmdldEluc3RhbmNlSUQoKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovZ2V0SW5zdGFuY2VJRCgpe3JldHVybiBnLl9pbnN0YW5jZUlEfQovKioKICAgICAgICAgKiBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZCB0aGF0IHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYXV0aG9yaXphdGlvbiBVUkwgcGFyYW1ldGVycy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcgLSAoT3B0aW9uYWwpIEEgY29uZmlnIG9iamVjdCB0byBmb3JjZSBpbml0aWFsaXphdGlvbiBhbmQgcGFzcwogICAgICAgICAqIGN1c3RvbSBwYXRoIHBhcmFtZXRlcnMgc3VjaCBhcyB0aGUgYGZpZHBgIHBhcmFtZXRlci4KICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYXV0aG9yaXphdGlvbiBVUkwgcGFyYW1ldGVycy4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXV0aC5nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKCkudGhlbigocGFyYW1zKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhwYXJhbXMpOwogICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICogfSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEF1dGhvcml6YXRpb25VUkxQYXJhbXN9CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIG51bGw9PXR8fGRlbGV0ZSB0LmZvcmNlSW5pdCwoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSk/dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEF1dGhvcml6YXRpb25VUkxQYXJhbXModCxuKTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEobnVsbD09ZT92b2lkIDA6ZS5mb3JjZUluaXQpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTFBhcmFtcyh0LG4pKSl9KSl9Ci8qKgogICAgICAgICAgICogVGhpcyBpcyBhbiBhc3luYyBtZXRob2QgdGhhdCByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGF1dGhvcml6YXRpb24gVVJMLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSBjb25maWcgLSAoT3B0aW9uYWwpIEEgY29uZmlnIG9iamVjdCB0byBmb3JjZSBpbml0aWFsaXphdGlvbiBhbmQgcGFzcwogICAgICAgICAgICogY3VzdG9tIHBhdGggcGFyYW1ldGVycyBzdWNoIGFzIHRoZSBmaWRwIHBhcmFtZXRlci4KICAgICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybnMgLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhdXRob3JpemF0aW9uIFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBhdXRoLmdldEF1dGhvcml6YXRpb25VUkwoKS50aGVuKCh1cmwpPT57CiAgICAgICAgICAgKiAgLy8gY29uc29sZS5sb2codXJsKTsKICAgICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgICAqIH0pOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRBdXRob3JpemF0aW9uVVJMfQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovZ2V0QXV0aG9yaXphdGlvblVSTChlLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBudWxsPT10fHxkZWxldGUgdC5mb3JjZUluaXQsKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIikpP3RoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBdXRob3JpemF0aW9uVVJMKHQsbik6dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldE9JRENQcm92aWRlck1ldGFEYXRhKG51bGw9PWU/dm9pZCAwOmUuZm9yY2VJbml0KS50aGVuKCgoKT0+dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEF1dGhvcml6YXRpb25VUkwodCxuKSkpfSkpfQovKioKICAgICAgICAgICAqIFRoaXMgaXMgYW4gYXN5bmMgbWV0aG9kIHRoYXQgc2VuZHMgYSByZXF1ZXN0IHRvIG9idGFpbiB0aGUgYWNjZXNzIHRva2VuIGFuZCByZXR1cm5zIGEgUHJvbWlzZQogICAgICAgICAgICogdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0b2tlbiBhbmQgb3RoZXIgcmVsZXZhbnQgZGF0YS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gYXV0aG9yaXphdGlvbkNvZGUgLSBUaGUgYXV0aG9yaXphdGlvbiBjb2RlLgogICAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0ZSAtIFRoZSBzZXNzaW9uIHN0YXRlLgogICAgICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIHJlc3BvbnNlLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGF1dGgucmVxdWVzdEFjY2Vzc1Rva2VuKGF1dGhDb2RlLCBzZXNzaW9uU3RhdGUpLnRoZW4oKHRva2VuKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHRva2VuKTsKICAgICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgICAqIH0pOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZXF1ZXN0QWNjZXNzVG9rZW59CiAgICAgICAgICAgKgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovcmVxdWVzdEFjY2Vzc1Rva2VuKGUsbixyLGksbyl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSk/dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlcXVlc3RBY2Nlc3NUb2tlbihlLG4scixpLG8pOnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSghMSkudGhlbigoKCk9PnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0QWNjZXNzVG9rZW4oZSxuLHIsaSxvKSkpfSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqICoqVGhpcyBkb2Vzbid0IGNsZWFyIHRoZSBhdXRoZW50aWNhdGlvbiBkYXRhLioqCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBzaWduLW91dCBVUkwuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogY29uc3Qgc2lnbk91dFVybCA9IGF3YWl0IGF1dGguZ2V0U2lnbk91dFVSTCgpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRTaWduT3V0VVJMfQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovZ2V0U2lnbk91dFVSTChlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0U2lnbk91dFVSTChlKX0pKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIE9JREMgc2VydmljZSBlbmRwb2ludHMgdGhhdCBhcmUgZmV0Y2hlZCBmcm9tIHRoZSBgLndlbGwta25vd25gIGVuZHBvaW50LgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgT0lEQyBzZXJ2aWNlIGVuZHBvaW50cy4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBhdXRoLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldE9JRENTZXJ2aWNlRW5kcG9pbnRzfQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKX0pKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCBkZWNvZGVzIHRoZSBwYXlsb2FkIG9mIHRoZSBJRCB0b2tlbiBhbmQgcmV0dXJucyBpdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZGVjb2RlZCBJRCB0b2tlbiBwYXlsb2FkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IGRlY29kZWRJZFRva2VuID0gYXdhaXQgYXV0aC5nZXREZWNvZGVkSURUb2tlbigpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXREZWNvZGVkSURUb2tlbn0KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL2dldERlY29kZWRJRFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXREZWNvZGVkSURUb2tlbihlKX0pKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBJRCB0b2tlbi4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgSUQgdG9rZW4uCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogY29uc3QgaWRUb2tlbiA9IGF3YWl0IGF1dGguZ2V0SURUb2tlbigpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRJRFRva2VufQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovZ2V0SURUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0SURUb2tlbihlKX0pKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBiYXNpYyB1c2VyIGluZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gdGhlIElEIHRva2VuLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBiYXNpYyB1c2VyIGluZm9ybWF0aW9uLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IHVzZXJJbmZvID0gYXdhaXQgYXV0aC5nZXRCYXNpY1VzZXJJbmZvKCk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEJhc2ljVXNlckluZm99CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi9nZXRCYXNpY1VzZXJJbmZvKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRCYXNpY1VzZXJJbmZvKGUpfSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGNyeXB0byBoZWxwZXIgb2JqZWN0LgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIENyeXB0b0hlbHBlciBvYmplY3QuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogY29uc3QgY3J5cHRvSGVscGVyID0gYXdhaXQgYXV0aC5DcnlwdG9IZWxwZXIoKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0Q3J5cHRvSGVscGVyfQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovZ2V0Q3J5cHRvSGVscGVyKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldENyeXB0b0hlbHBlcigpfSkpfQovKioKICAgICAgICAgICAqIFRoaXMgbWV0aG9kIHJldm9rZXMgdGhlIGFjY2VzcyB0b2tlbi4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqICoqVGhpcyBtZXRob2QgYWxzbyBjbGVhcnMgdGhlIGF1dGhlbnRpY2F0aW9uIGRhdGEuKioKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIEEgUHJvbWlzZSB0aGF0IHJldHVybnMgdGhlIHJlc3BvbnNlIG9mIHRoZSByZXZva2UtYWNjZXNzLXRva2VuIHJlcXVlc3QuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICogYXV0aC5yZXZva2VBY2Nlc3NUb2tlbigpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTsKICAgICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgICAqIH0pOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZXZva2VBY2Nlc3NUb2tlbn0KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL3Jldm9rZUFjY2Vzc1Rva2VuKGUpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmV2b2tlQWNjZXNzVG9rZW4oZSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgcmVmcmVzaGVzIHRoZSBhY2Nlc3MgdG9rZW4gYW5kIHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbmV3IGFjY2VzcwogICAgICAgICAgICogdG9rZW4gYW5kIG90aGVyIHJlbGV2YW50IGRhdGEuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIHJlc3BvbnNlLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGF1dGgucmVmcmVzaEFjY2Vzc1Rva2VuKCkudGhlbigocmVzcG9uc2UpPT57CiAgICAgICAgICAgKiAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpOwogICAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAgICogfSk7CiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3JlZnJlc2hBY2Nlc3NUb2tlbn0KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL3JlZnJlc2hBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlZnJlc2hBY2Nlc3NUb2tlbihlKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICAgKgogICAgICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGFjY2VzcyB0b2tlbi4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGF1dGguZ2V0QWNjZXNzVG9rZW4oKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QWNjZXNzVG9rZW59CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi9nZXRBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QWNjZXNzVG9rZW4oZSl9KSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2Qgc2VuZHMgYSBjdXN0b20tZ3JhbnQgcmVxdWVzdCBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZQogICAgICAgICAgICogZGVwZW5kaW5nIG9uIHRoZSBjb25maWcgcGFzc2VkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSBjb25maWcgLSBBIGNvbmZpZyBvYmplY3QgY29udGFpbmluZyB0aGUgY3VzdG9tIGdyYW50IGNvbmZpZ3VyYXRpb25zLgogICAgICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3BvbnNlIGRlcGVuZGluZwogICAgICAgICAgICogb24geW91ciBjb25maWd1cmF0aW9ucy4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBjb25zdCBjb25maWcgPSB7CiAgICAgICAgICAgKiAgIGF0dGFjaFRva2VuOiBmYWxzZSwKICAgICAgICAgICAqICAgZGF0YTogewogICAgICAgICAgICogICAgICAgY2xpZW50X2lkOiAie3tjbGllbnRJRH19IiwKICAgICAgICAgICAqICAgICAgIGdyYW50X3R5cGU6ICJhY2NvdW50X3N3aXRjaCIsCiAgICAgICAgICAgKiAgICAgICBzY29wZTogInt7c2NvcGV9fSIsCiAgICAgICAgICAgKiAgICAgICB0b2tlbjogInt7dG9rZW59fSIsCiAgICAgICAgICAgKiAgIH0sCiAgICAgICAgICAgKiAgIGlkOiAiYWNjb3VudC1zd2l0Y2giLAogICAgICAgICAgICogICByZXR1cm5SZXNwb25zZTogdHJ1ZSwKICAgICAgICAgICAqICAgcmV0dXJuc1Nlc3Npb246IHRydWUsCiAgICAgICAgICAgKiAgIHNpZ25JblJlcXVpcmVkOiB0cnVlCiAgICAgICAgICAgKiB9CiAgICAgICAgICAgKgogICAgICAgICAgICogYXV0aC5yZXF1ZXN0Q3VzdG9tR3JhbnQoY29uZmlnKS50aGVuKChyZXNwb25zZSk9PnsKICAgICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICAgKiB9KTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoKICAgICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmVxdWVzdEN1c3RvbUdyYW50fQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovcmVxdWVzdEN1c3RvbUdyYW50KGUsdCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0Q3VzdG9tR3JhbnQoZSx0KX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQgb3Igbm90LgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKiBhd2FpdCBhdXRoLmlzQXV0aGVudGljYXRlZCgpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNpc0F1dGhlbnRpY2F0ZWR9CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi9pc0F1dGhlbnRpY2F0ZWQoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmlzQXV0aGVudGljYXRlZChlKX0pKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBQS0NFIGNvZGUgZ2VuZXJhdGVkIGR1cmluZyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgYXV0aGVudGljYXRpb24gVVJMLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUgc3RhdGUgcGFyYW1ldGVyIHRoYXQgd2FzIHBhc3NlZCBpbiB0aGUgYXV0aGVudGljYXRpb24gVVJMLgogICAgICAgICAgICoKICAgICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgUEtDRSBjb2RlLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IHBrY2UgPSBhd2FpdCBnZXRQS0NFQ29kZSgpOwogICAgICAgICAgICogYGBgCiAgICAgICAgICAgKgogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRQS0NFQ29kZX0KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgICAqL2dldFBLQ0VDb2RlKGUsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldFBLQ0VDb2RlKGUsbil9KSl9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgUEtDRSBjb2RlIHRvIHRoZSBkYXRhIHN0b3JlLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwYXJhbSBwa2NlIC0gVGhlIFBLQ0UgY29kZS4KICAgICAgICAgICAqIEBwYXJhbSBzdGF0ZSAtIFRoZSBzdGF0ZSBwYXJhbWV0ZXIgdGhhdCB3YXMgcGFzc2VkIGluIHRoZSBhdXRoZW50aWNhdGlvbiBVUkwuCiAgICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGF3YWl0IGF1dGguc2V0UEtDRUNvZGUoInBrY2VfY29kZSIpCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3NldFBLQ0VDb2RlfQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovc2V0UEtDRUNvZGUoZSxuLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnNldFBLQ0VDb2RlKGUsbixyKX0pKX0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSBzaWduLW91dCBpcyBzdWNjZXNzZnVsIG9yIG5vdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gc2lnbk91dFJlZGlyZWN0VXJsIC0gVGhlIFVSTCB0byB3aGljaCB0aGUgdXNlciBoYXMgYmVlbiByZWRpcmVjdGVkIHRvIGFmdGVyIHNpZ25pbmctb3V0LgogICAgICAgICAgICoKICAgICAgICAgICAqICoqVGhlIHNlcnZlciBhcHBlbmRzIHBhdGggcGFyYW1ldGVycyB0byB0aGUgYHNpZ25PdXRSZWRpcmVjdFVSTGAgYW5kIHRoZXNlIHBhdGggcGFyYW1ldGVycwogICAgICAgICAgICogIGFyZSByZXF1aXJlZCBmb3IgdGhpcyBtZXRob2QgdG8gZnVuY3Rpb24uKioKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIGB0cnVlYCBpZiBzdWNjZXNzZnVsLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2lzU2lnbk91dFN1Y2Nlc3NmdWx9CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi9zdGF0aWMgaXNTaWduT3V0U3VjY2Vzc2Z1bChlKXtjb25zdCB0PW5ldyBVUkwoZSksbj10LnNlYXJjaFBhcmFtcy5nZXQoInN0YXRlIikscj1Cb29sZWFuKHQuc2VhcmNoUGFyYW1zLmdldCgiZXJyb3IiKSk7cmV0dXJuISFuJiYic2lnbl9vdXRfc3VjY2VzcyI9PT1uJiYhcn0KLyoqCiAgICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSBzaWduLW91dCBoYXMgZmFpbGVkIG9yIG5vdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcGFyYW0gc2lnbk91dFJlZGlyZWN0VXJsIC0gVGhlIFVSTCB0byB3aGljaCB0aGUgdXNlciBoYXMgYmVlbiByZWRpcmVjdGVkIHRvIGFmdGVyIHNpZ25pbmctb3V0LgogICAgICAgICAgICoKICAgICAgICAgICAqICoqVGhlIHNlcnZlciBhcHBlbmRzIHBhdGggcGFyYW1ldGVycyB0byB0aGUgYHNpZ25PdXRSZWRpcmVjdFVSTGAgYW5kIHRoZXNlIHBhdGggcGFyYW1ldGVycwogICAgICAgICAgICogIGFyZSByZXF1aXJlZCBmb3IgdGhpcyBtZXRob2QgdG8gZnVuY3Rpb24uKioKICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcmV0dXJucyAtIGB0cnVlYCBpZiBzdWNjZXNzZnVsLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2RpZFNpZ25PdXRGYWlsfQogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAgICovc3RhdGljIGRpZFNpZ25PdXRGYWlsKGUpe2NvbnN0IHQ9bmV3IFVSTChlKSxuPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxyPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIW4mJiJzaWduX291dF9zdWNjZXNzIj09PW4mJnJ9Ci8qKgogICAgICAgICAgICogVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgY29uZmlndXJhdGlvbiB0aGF0IHdhcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igd2hlbiBpbnN0YW50aWF0aW5nIHRoaXMgY2xhc3MuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHBhcmFtIGNvbmZpZyAtIEEgY29uZmlnIG9iamVjdCB0byB1cGRhdGUgdGhlIFNESyBjb25maWd1cmF0aW9ucyB3aXRoLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICAgKiBgYGAKICAgICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICAgICAqICAgICBzaWduSW5SZWRpcmVjdFVSTDogImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9zaWduLWluIiwKICAgICAgICAgICAqICAgICBjbGllbnRJRDogImNsaWVudCBJRCIsCiAgICAgICAgICAgKiAgICAgYmFzZVVybDogImh0dHBzOi8vbG9jYWxob3N0Ojk0NDMiCiAgICAgICAgICAgKiB9CiAgICAgICAgICAgKgogICAgICAgICAgICogYXdhaXQgYXV0aC51cGRhdGVDb25maWcoY29uZmlnKTsKICAgICAgICAgICAqIGBgYAogICAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciN1cGRhdGVDb25maWd9CiAgICAgICAgICAgKgogICAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICAgKi91cGRhdGVDb25maWcoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUudXBkYXRlQ29uZmlnKGUpfSkpfXN0YXRpYyBjbGVhclVzZXJTZXNzaW9uRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5jbGVhclVzZXJTZXNzaW9uRGF0YShlKX0pKX19Y29uc3QgeT0iaW5pdCI7dmFyIHY7IWZ1bmN0aW9uKGUpe2UuU2lnbkluPSJzaWduLWluIixlLlNpZ25PdXQ9InNpZ24tb3V0IixlLkluaXRpYWxpemU9ImluaXRpYWxpemUiLGUuSHR0cFJlcXVlc3RTdGFydD0iaHR0cC1yZXF1ZXN0LXN0YXJ0IixlLkh0dHBSZXF1ZXN0RmluaXNoPSJodHRwLXJlcXVlc3QtZmluaXNoIixlLkh0dHBSZXF1ZXN0RXJyb3I9Imh0dHAtcmVxdWVzdC1lcnJvciIsZS5IdHRwUmVxdWVzdFN1Y2Nlc3M9Imh0dHAtcmVxdWVzdC1zdWNjZXNzIixlLlJldm9rZUFjY2Vzc1Rva2VuPSJyZXZva2UtYWNjZXNzLXRva2VuIixlLkN1c3RvbUdyYW50PSJjdXN0b20tZ3JhbnQiLGUuU2lnbk91dEZhaWxlZD0ic2lnbi1vdXQtZmFpbGVkIn0odnx8KHY9e30pKTtjb25zdCBtPSJwcm9tcHROb25lUmVxdWVzdFNlbnQiLHc9ImVycm9yIixiPSJlcnJvcl9kZXNjcmlwdGlvbiIsXz0iY3VzdG9tX2dyYW50X2NvbmZpZyIsUz0iQWNjZXNzIHRva2VuIGlzIGludmFsaWQiO3ZhciBFOyFmdW5jdGlvbihlKXtlLkxvY2FsU3RvcmFnZT0ibG9jYWxTdG9yYWdlIixlLlNlc3Npb25TdG9yYWdlPSJzZXNzaW9uU3RvcmFnZSIsZS5XZWJXb3JrZXI9IndlYldvcmtlciIsZS5Ccm93c2VyTWVtb3J5PSJicm93c2VyTWVtb3J5In0oRXx8KEU9e30pKTtjbGFzcyBSe2NvbnN0cnVjdG9yKCl7fXN0YXRpYyBnZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpe3JldHVybntibG9iOihudWxsPT1lP3ZvaWQgMDplLmRhdGEpaW5zdGFuY2VvZiBCbG9iP251bGw9PWU/dm9pZCAwOmUuZGF0YTpudWxsLGRhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSxzdWNjZXNzOiEwfX1zdGF0aWMgZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKXt2YXIgdCxuLHI7Y29uc3QgaT1lP3tjb2RlOm51bGw9PWU/dm9pZCAwOmUuY29kZSxjb25maWc6bnVsbD09ZT92b2lkIDA6ZS5jb25maWcsaXNBeGlvc0Vycm9yOm51bGw9PWU/dm9pZCAwOmUuaXNBeGlvc0Vycm9yLG1lc3NhZ2U6bnVsbD09ZT92b2lkIDA6ZS5tZXNzYWdlLG5hbWU6bnVsbD09ZT92b2lkIDA6ZS5uYW1lLHJlcXVlc3Q6bnVsbD09ZT92b2lkIDA6ZS5yZXF1ZXN0LHJlc3BvbnNlOihudWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKT97Y29uZmlnOmUucmVzcG9uc2UuY29uZmlnLGRhdGE6ZS5yZXNwb25zZS5kYXRhLGhlYWRlcnM6ZS5yZXNwb25zZS5oZWFkZXJzLHJlcXVlc3Q6ZS5yZXNwb25zZS5yZXF1ZXN0LHN0YXR1czplLnJlc3BvbnNlLnN0YXR1cyxzdGF0dXNUZXh0OmUucmVzcG9uc2Uuc3RhdHVzVGV4dH06dm9pZCAwLHN0YXR1czpudWxsIT09KHI9bnVsbCE9PSh0PW51bGw9PWU/dm9pZCAwOmUuc3RhdHVzKSYmdm9pZCAwIT09dD90Om51bGw9PT0obj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5zdGF0dXMpJiZ2b2lkIDAhPT1yP3I6bnVsbH06IiI7cmV0dXJue2Vycm9yOkpTT04uc3RyaW5naWZ5KGkpLHN1Y2Nlc3M6ITF9fX1jbGFzcyBUe2NvbnN0cnVjdG9yKCl7fXN0YXRpYyByZW1vdmVBdXRob3JpemF0aW9uQ29kZSgpe2NvbnN0IGU9bG9jYXRpb24uaHJlZjtoaXN0b3J5LnB1c2hTdGF0ZSh7fSxkb2N1bWVudC50aXRsZSxlLnJlcGxhY2UoL1w/Y29kZT0uKiQvLCIiKSl9c3RhdGljIGdldFBLQ0UoZSl7dmFyIHQ7cmV0dXJuIG51bGwhPT0odD1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGUpKSYmdm9pZCAwIT09dD90OiIifXN0YXRpYyBzZXRQS0NFKGUsdCl7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShlLHQpfXN0YXRpYyBzZXRTaWduT3V0VVJMKGUsdCxuKXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCIiLmNvbmNhdChzLCItaW5zdGFuY2VfIikuY29uY2F0KG4sIi0iKS5jb25jYXQodCksZSl9c3RhdGljIGdldFNpZ25PdXRVUkwoZSx0KXt2YXIgbjtyZXR1cm4gbnVsbCE9PShuPXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oIiIuY29uY2F0KHMsIi1pbnN0YW5jZV8iKS5jb25jYXQodCwiLSIpLmNvbmNhdChlKSkpJiZ2b2lkIDAhPT1uP246IiJ9c3RhdGljIHJlbW92ZVBLQ0UoZSl7c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShlKX1zdGF0aWMgY2FuQ29udGludWVTaWduSW4oZSx0KXtyZXR1cm4hKGUmJiFULmhhc0Vycm9ySW5VUkwoKSYmIVQuaGFzQXV0aFNlYXJjaFBhcmFtc0luVVJMKCkmJiF0KX1zdGF0aWMgaXNJbml0aWFsaXplZFNpbGVudFNpZ25Jbigpe3JldHVybiBULmlzU2lsZW50U3RhdGVQcmVzZW50SW5VUkwoKX1zdGF0aWMgd2FzU2lnbkluQ2FsbGVkKCl7cmV0dXJuISghVC5oYXNFcnJvckluVVJMKCkmJiFULmhhc0F1dGhTZWFyY2hQYXJhbXNJblVSTCgpfHx0aGlzLmlzU2lsZW50U3RhdGVQcmVzZW50SW5VUkwoKSl9c3RhdGljIHdhc1NpbGVudFNpZ25JbkNhbGxlZCgpe2NvbnN0IGU9c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiaW5pdGlhbGl6ZWQtc2lsZW50LXNpZ24taW4iKSx0PWU/SlNPTi5wYXJzZShlKTpudWxsO3JldHVybiBCb29sZWFuKHQpfXN0YXRpYyBpc1NpZ25PdXRTdWNjZXNzZnVsKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZihnLmlzU2lnbk91dFN1Y2Nlc3NmdWwod2luZG93LmxvY2F0aW9uLmhyZWYpKXtjb25zdCBlPXdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCI/IilbMF07cmV0dXJuIGhpc3RvcnkucHVzaFN0YXRlKHt9LGRvY3VtZW50LnRpdGxlLGUpLHlpZWxkIGcuY2xlYXJVc2VyU2Vzc2lvbkRhdGEoKSwhMH1yZXR1cm4hMX0pKX1zdGF0aWMgZGlkU2lnbk91dEZhaWwoKXtpZihnLmRpZFNpZ25PdXRGYWlsKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSl7Y29uc3QgZT1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSx0PWUuc2VhcmNoUGFyYW1zLmdldCh3KSxuPWUuc2VhcmNoUGFyYW1zLmdldChiKSxyPXdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCI/IilbMF07cmV0dXJuIGhpc3RvcnkucHVzaFN0YXRlKHt9LGRvY3VtZW50LnRpdGxlLHIpLHtkZXNjcmlwdGlvbjpudWxsIT1uP246IiIsZXJyb3I6bnVsbCE9dD90OiIifX1yZXR1cm4hMX1zdGF0aWMgaXNTaWxlbnRTdGF0ZVByZXNlbnRJblVSTCgpe3ZhciBlO2NvbnN0IHQ9bmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKTtyZXR1cm4gbnVsbCE9PShlPW51bGw9PXQ/dm9pZCAwOnQuaW5jbHVkZXMoInNpZ24taW4tc2lsZW50bHkiKSkmJnZvaWQgMCE9PWUmJmV9c3RhdGljIGhhc0F1dGhTZWFyY2hQYXJhbXNJblVSTCgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp3aW5kb3cubG9jYXRpb24uc2VhcmNoO3JldHVybi9bPyZdY29kZT1bXiZdKy8udGVzdChlKX1zdGF0aWMgaGFzRXJyb3JJblVSTCgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp3aW5kb3cubG9jYXRpb24uaHJlZjtjb25zdCB0PW5ldyBVUkwoZSk7cmV0dXJuISF0LnNlYXJjaFBhcmFtcy5nZXQodykmJiJzaWduX291dF9zdWNjZXNzIiE9PXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKX1zdGF0aWMgY2FuU2VuZFByb21wdE5vbmVSZXF1ZXN0KCl7Y29uc3QgZT1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKG0pO3JldHVybiEoZT9KU09OLnBhcnNlKGUpOm51bGwpfXN0YXRpYyBzZXRQcm9tcHROb25lUmVxdWVzdFNlbnQoZSl7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShtLEpTT04uc3RyaW5naWZ5KGUpKX1zdGF0aWMgd2FpdFRpbGxQYWdlUmVkaXJlY3QodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPW51bGwhPXQ/dDozZTM7eWllbGQgbmV3IFByb21pc2UoKHQ9PnNldFRpbWVvdXQodCwxZTMqZSkpKX0pKX19VC51bnRpbD1mdW5jdGlvbihlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06NTAwO2NvbnN0IG49cj0+ZSgpP3IoKTpzZXRUaW1lb3V0KCgoKT0+bihyKSksdCk7cmV0dXJuIG5ldyBQcm9taXNlKG4pfTtjbGFzcyBre2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQ9ZSx0aGlzLl9kYXRhTGF5ZXI9dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGF0YUxheWVyKCksdGhpcy5fc3BhSGVscGVyPXQsdGhpcy5faW5zdGFuY2VJRD10aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRJbnN0YW5jZUlEKCksdGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITF9ZW5hYmxlSHR0cEhhbmRsZXIoZSl7KG51bGw9PWU/dm9pZCAwOmUuZW5hYmxlSGFuZGxlcikmJmUuZW5hYmxlSGFuZGxlcigpfWRpc2FibGVIdHRwSGFuZGxlcihlKXsobnVsbD09ZT92b2lkIDA6ZS5kaXNhYmxlSGFuZGxlcikmJmUuZGlzYWJsZUhhbmRsZXIoKX1pbml0aWFsaXplU2Vzc2lvbk1hbmdlcihlLHQsbixyLGkpe3ZhciBvLHMsYTtpLmluaXRpYWxpemUoZS5jbGllbnRJRCxudWxsIT09KG89dC5jaGVja1Nlc3Npb25JZnJhbWUpJiZ2b2lkIDAhPT1vP286IiIsbixudWxsIT09KHM9ZS5jaGVja1Nlc3Npb25JbnRlcnZhbCkmJnZvaWQgMCE9PXM/czozLG51bGwhPT0oYT1lLnNlc3Npb25SZWZyZXNoSW50ZXJ2YWwpJiZ2b2lkIDAhPT1hP2E6MzAwLGUuc2lnbkluUmVkaXJlY3RVUkwscil9cmVxdWVzdEN1c3RvbUdyYW50KHQsbil7dmFyIHIsaSxvO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7bGV0IHM9ITAsYT0hMTtpZihudWxsPT10P3ZvaWQgMDp0LnRva2VuRW5kcG9pbnQpe3M9ITE7Zm9yKGNvbnN0IGUgb2ZbLi4ubnVsbCE9PShpPW51bGw9PT0ocj15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5yZXNvdXJjZVNlcnZlclVSTHMpJiZ2b2lkIDAhPT1pP2k6W10sdC5iYXNlVXJsXSlpZihlJiYobnVsbD09PShvPXQudG9rZW5FbmRwb2ludCl8fHZvaWQgMD09PW8/dm9pZCAwOm8uc3RhcnRzV2l0aChlKSkpe2E9ITA7YnJlYWt9fXJldHVybiB0LnNob3VsZFJlcGxheUFmdGVyUmVmcmVzaCYmdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoXyxKU09OLnN0cmluZ2lmeSh0KSksc3x8YT90aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZXF1ZXN0Q3VzdG9tR3JhbnQodCkudGhlbigocj0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBuJiYiZnVuY3Rpb24iPT10eXBlb2YgbiYmbih0KSx0LnJldHVybnNTZXNzaW9uPyh0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0aGlzKSx0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRCYXNpY1VzZXJJbmZvKCkpOnJ9KSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKTpQcm9taXNlLnJlamVjdChuZXcgYygiU1BBLU1BSU5fVEhSRUFEX0NMSUVOVC1SQ0ctSVYwMSIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIHRva2VuIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIikpfSkpfWdldEN1c3RvbUdyYW50Q29uZmlnRGF0YSgpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihfKTtyZXR1cm4gZT9KU09OLnBhcnNlKGUpOm51bGx9KSl9cmVmcmVzaEFjY2Vzc1Rva2VuKHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dHJ5e3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnJlZnJlc2hBY2Nlc3NUb2tlbigpO2NvbnN0IGU9eWllbGQgdGhpcy5nZXRDdXN0b21HcmFudENvbmZpZ0RhdGEoKTtyZXR1cm4gZSYmKHlpZWxkIHRoaXMucmVxdWVzdEN1c3RvbUdyYW50KGUsdCkpLHRoaXMuX3NwYUhlbHBlci5yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KHRoaXMpLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKX1jYXRjaChlKXtjb25zdCB0PXt0eXBlOiJyZWZyZXNoLWFjY2Vzcy10b2tlbi1lcnJvciJ9O3JldHVybiB3aW5kb3cucG9zdE1lc3NhZ2UodCksUHJvbWlzZS5yZWplY3QoZSl9fSkpfXJldHJ5RmFpbGVkUmVxdWVzdHModCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXQuaHR0cENsaWVudCxuPXQucmVxdWVzdENvbmZpZyxyPXQuaXNIdHRwSGFuZGxlckVuYWJsZWQsaT10Lmh0dHBFcnJvckNhbGxiYWNrLG89dC5odHRwRmluaXNoQ2FsbGJhY2s7eWllbGQgVC51bnRpbCgoKCk9PiF0aGlzLl9pc1Rva2VuUmVmcmVzaGluZykpO3RyeXtjb25zdCB0PXlpZWxkIGUucmVxdWVzdChuKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHQpfWNhdGNoKGUpe3JldHVybiByJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJih5aWVsZCBpKGUpKSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbygpKSxQcm9taXNlLnJlamVjdChlKX19KSl9aHR0cFJlcXVlc3QodCxuLHIsaSxvLHMpe3ZhciBhLHU7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtsZXQgbD0hMTtjb25zdCBkPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCk7Zm9yKGNvbnN0IGUgb2ZbLi4ubnVsbCE9PShhPXlpZWxkIG51bGw9PWQ/dm9pZCAwOmQucmVzb3VyY2VTZXJ2ZXJVUkxzKSYmdm9pZCAwIT09YT9hOltdLGQuYmFzZVVybF0paWYoZSYmKG51bGw9PT0odT1udWxsPT1uP3ZvaWQgMDpuLnVybCl8fHZvaWQgMD09PXU/dm9pZCAwOnUuc3RhcnRzV2l0aChlKSkpe2w9ITA7YnJlYWt9cmV0dXJuIGw/dC5yZXF1ZXN0KG4pLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKChhPT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIGUsdSxsO2lmKDQwMT09PShudWxsPT09KGU9bnVsbD09YT92b2lkIDA6YS5yZXNwb25zZSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuc3RhdHVzKXx8IShudWxsPT1hP3ZvaWQgMDphLnJlc3BvbnNlKSl7aWYodGhpcy5faXNUb2tlblJlZnJlc2hpbmcpcmV0dXJuIHRoaXMucmV0cnlGYWlsZWRSZXF1ZXN0cyh7ZW5hYmxlUmV0cmlldmluZ1NpZ25PdXRVUkxGcm9tU2Vzc2lvbjpzLGh0dHBDbGllbnQ6dCxodHRwRXJyb3JDYWxsYmFjazppLGh0dHBGaW5pc2hDYWxsYmFjazpvLGlzSHR0cEhhbmRsZXJFbmFibGVkOnIscmVxdWVzdENvbmZpZzpufSk7bGV0IGU7dGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITA7dHJ5e2U9eWllbGQgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4ocyksdGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITF9Y2F0Y2goZSl7dGhyb3cgdGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITEsciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NvZGU6U30pKSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksbmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1IUi1TRTAxIixudWxsIT09KHU9bnVsbD09ZT92b2lkIDA6ZS5uYW1lKSYmdm9pZCAwIT09dT91OiJSZWZyZXNoIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9PShsPW51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSkmJnZvaWQgMCE9PWw/bDoiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiBmb2xsb3dpbmcgYSA0MDEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiIpfWlmKGUpdHJ5e2NvbnN0IGU9eWllbGQgdC5yZXF1ZXN0KG4pO3JldHVybiBQcm9taXNlLnJlc29sdmUoZSl9Y2F0Y2goZSl7cmV0dXJuIHImJigiZnVuY3Rpb24iPT10eXBlb2YgaSYmKHlpZWxkIGkoZSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvKCkpLFByb21pc2UucmVqZWN0KGUpfX1yZXR1cm4gciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaShhKSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksUHJvbWlzZS5yZWplY3QoYSl9KSkpKTpQcm9taXNlLnJlamVjdChuZXcgYygiU1BBLUFVVEhfSEVMUEVSLUhSLUlWMDIiLCJSZXF1ZXN0IHRvIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBwcm9oaWJpdGVkLiIsIlJlcXVlc3RzIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVzb3VyY2Ugc2VydmVycyBzcGVjaWZpZWQgYnkgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIGF0dHJpYnV0ZSB3aGlsZSBpbml0aWFsaXppbmcgdGhlIFNESy4gVGhlIHNwZWNpZmllZCBlbmRwb2ludCBpbiB0aGlzIHJlcXVlc3QgY2Fubm90IGJlIGZvdW5kIGFtb25nIHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCIpKX0pKX1odHRwUmVxdWVzdEFsbCh0LG4scixpLG8pe3ZhciBzLGEsdTtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2xldCBsPSEwO2NvbnN0IGQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtmb3IoY29uc3QgZSBvZiB0KXtsZXQgdD0hMTtmb3IoY29uc3QgbiBvZlsuLi5udWxsIT09KGE9bnVsbD09PShzPXlpZWxkIGQpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLnJlc291cmNlU2VydmVyVVJMcykmJnZvaWQgMCE9PWE/YTpbXSxkLmJhc2VVcmxdKWlmKG4mJihudWxsPT09KHU9ZS51cmwpfHx2b2lkIDA9PT11P3ZvaWQgMDp1LnN0YXJ0c1dpdGgobikpKXt0PSEwO2JyZWFrfWlmKCF0KXtsPSExO2JyZWFrfX1jb25zdCBoPVtdO2lmKGwpcmV0dXJuIHQuZm9yRWFjaCgoZT0+e2gucHVzaChuLnJlcXVlc3QoZSkpfSkpLChudWxsPT1uP3ZvaWQgMDpuLmFsbCkmJm4uYWxsKGgpLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKCh0PT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIHMsYSx1O2lmKDQwMT09PShudWxsPT09KHM9bnVsbD09dD92b2lkIDA6dC5yZXNwb25zZSl8fHZvaWQgMD09PXM/dm9pZCAwOnMuc3RhdHVzKXx8IShudWxsPT10P3ZvaWQgMDp0LnJlc3BvbnNlKSl7bGV0IHM7dHJ5e3M9eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQucmVmcmVzaEFjY2Vzc1Rva2VuKCl9Y2F0Y2goZSl7dGhyb3cgciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2NvZGU6U30pKSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksbmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1IUkEtU0UwMSIsbnVsbCE9PShhPW51bGw9PWU/dm9pZCAwOmUubmFtZSkmJnZvaWQgMCE9PWE/YToiUmVmcmVzaCB0b2tlbiByZXF1ZXN0IGZhaWxlZC4iLG51bGwhPT0odT1udWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2UpJiZ2b2lkIDAhPT11P3U6IkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4gZm9sbG93aW5nIGEgNDAxIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4iKX1pZihzKXJldHVybiBuLmFsbCYmbi5hbGwoaCkudGhlbigoZT0+UHJvbWlzZS5yZXNvbHZlKGUpKSkuY2F0Y2goKHQ9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaSh0KSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksUHJvbWlzZS5yZWplY3QodCl9KSkpKX1yZXR1cm4gciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaSh0KSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksUHJvbWlzZS5yZWplY3QodCl9KSkpKTt0aHJvdyBuZXcgYygiU1BBLUFVVEhfSEVMUEVSLUhSQS1JVjAyIiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKX0pKX1yZXF1ZXN0QWNjZXNzVG9rZW4odCxuLHIsaSxvLHMpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgYT15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpO2lmKGEuc3RvcmFnZT09PUUuQnJvd3Nlck1lbW9yeSYmYS5lbmFibGVQS0NFJiZuKXtjb25zdCBlPVQuZ2V0UEtDRSh1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0obikpO3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnNldFBLQ0VDb2RlKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShuKSxlKX1lbHNlIGEuc3RvcmFnZT09PUUuV2ViV29ya2VyJiZpJiYoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuc2V0UEtDRUNvZGUoaSxudWxsIT1vP286IiIpKTtyZXR1cm4gdD90aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZXF1ZXN0QWNjZXNzVG9rZW4odCxudWxsIT1uP246IiIsbnVsbCE9bz9vOiIiLHZvaWQgMCxzKS50aGVuKCgoKT0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLnN0b3JhZ2UhPT1FLldlYldvcmtlcj8oVC5zZXRTaWduT3V0VVJMKHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldFNpZ25PdXRVUkwoKSxhLmNsaWVudElELHRoaXMuX2luc3RhbmNlSUQpLHRoaXMuX3NwYUhlbHBlciYmKHRoaXMuX3NwYUhlbHBlci5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSx0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0aGlzKSksciYmImZ1bmN0aW9uIj09dHlwZW9mIHImJmEuZW5hYmxlT0lEQ1Nlc3Npb25NYW5hZ2VtZW50JiZyKCkpOnRoaXMuX3NwYUhlbHBlciYmdGhpcy5fc3BhSGVscGVyLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkodGhpcyksdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QmFzaWNVc2VySW5mbygpfSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSk6UHJvbWlzZS5yZWplY3QobmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1SQVQxLU5GMDEiLCJObyBhdXRob3JpemF0aW9uIGNvZGUuIiwiTm8gYXV0aG9yaXphdGlvbiBjb2RlIHdhcyBmb3VuZC4iKSl9KSl9dHJ5U2lnbkluU2lsZW50bHkodCxuLHIsaSxvKXt2YXIgcztyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKFQuaXNJbml0aWFsaXplZFNpbGVudFNpZ25JbigpKXJldHVybiB5aWVsZCByLnJlY2VpdmVQcm9tcHROb25lUmVzcG9uc2UoKSxQcm9taXNlLnJlc29sdmUoe2FsbG93ZWRTY29wZXM6IiIsZGlzcGxheU5hbWU6IiIsZW1haWw6IiIsc2Vzc2lvblN0YXRlOiIiLHN1YjoiIix0ZW5hbnREb21haW46IiIsdXNlcm5hbWU6IiJ9KTtjb25zdCBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJycElGcmFtZSIpLGM9bnVsbD09PShzPW51bGw9PWE/dm9pZCAwOmEuY29udGVudERvY3VtZW50KXx8dm9pZCAwPT09cz92b2lkIDA6cy5nZXRFbGVtZW50QnlJZCgicHJvbXB0Tm9uZUlGcmFtZSIpO3RyeXtjb25zdCBlPXlpZWxkIHQoaSk7Yy5zcmM9ZX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9cmV0dXJuIG5ldyBQcm9taXNlKCgodCxyKT0+e2NvbnN0IGk9c2V0VGltZW91dCgoKCk9Pnt0KCExKX0pLDFlNCkscz1hPT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIGUsYyx1LGw7Y29uc3QgZD1hLmRhdGE7ImNoZWNrX3Nlc3Npb25fc2lnbmVkX291dCI9PShudWxsPT1kP3ZvaWQgMDpkLnR5cGUpJiYod2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHMpLGNsZWFyVGltZW91dChpKSx0KCExKSksImNoZWNrX3Nlc3Npb25fc2lnbmVkX2luIj09KG51bGw9PWQ/dm9pZCAwOmQudHlwZSkmJihudWxsPT09KGU9bnVsbD09ZD92b2lkIDA6ZC5kYXRhKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jb2RlKSYmbihudWxsPT09KGM9bnVsbD09ZD92b2lkIDA6ZC5kYXRhKXx8dm9pZCAwPT09Yz92b2lkIDA6Yy5jb2RlLG51bGw9PT0odT1udWxsPT1kP3ZvaWQgMDpkLmRhdGEpfHx2b2lkIDA9PT11P3ZvaWQgMDp1LnNlc3Npb25TdGF0ZSxudWxsPT09KGw9bnVsbD09ZD92b2lkIDA6ZC5kYXRhKXx8dm9pZCAwPT09bD92b2lkIDA6bC5zdGF0ZSxvKS50aGVuKChlPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHMpLHQoZSl9KSkuY2F0Y2goKGU9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscykscihlKX0pKS5maW5hbGx5KCgoKT0+e2NsZWFyVGltZW91dChpKX0pKX0pKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyl9KSl9KSl9aGFuZGxlU2lnbkluKHQsbixyKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtpZih5aWVsZCB0KCkpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7YWxsb3dlZFNjb3BlczoiIixkaXNwbGF5TmFtZToiIixlbWFpbDoiIixzZXNzaW9uU3RhdGU6IiIsc3ViOiIiLHRlbmFudERvbWFpbjoiIix1c2VybmFtZToiIn0pO2lmKGUuc3RvcmFnZSE9PUUuV2ViV29ya2VyJiYoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuaXNBdXRoZW50aWNhdGVkKCkpKXJldHVybiB0aGlzLl9zcGFIZWxwZXIuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCksdGhpcy5fc3BhSGVscGVyLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkodGhpcyksZS5lbmFibGVPSURDU2Vzc2lvbk1hbmFnZW1lbnQmJm4oKSxQcm9taXNlLnJlc29sdmUoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QmFzaWNVc2VySW5mbygpKTtjb25zdCBpPW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQodyksbz1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KGIpO2lmKGkpe2NvbnN0IGU9bmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7dGhyb3cgZS5zZWFyY2hQYXJhbXMuZGVsZXRlKHcpLGUuc2VhcmNoUGFyYW1zLmRlbGV0ZShiKSxoaXN0b3J5LnB1c2hTdGF0ZShudWxsLGRvY3VtZW50LnRpdGxlLGUudG9TdHJpbmcoKSksbmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1TSS1TRTAxIixpLG51bGwhPW8/bzoiIil9aWYoZS5zdG9yYWdlPT09RS5XZWJXb3JrZXImJnIpe2NvbnN0IGU9eWllbGQgcigpO2lmKGUpcmV0dXJuIGV9fSkpfWF0dGFjaFRva2VuVG9SZXF1ZXN0Q29uZmlnKHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT1PYmplY3QuYXNzaWduKHthdHRhY2hUb2tlbjohMH0sdCk7ZS5hdHRhY2hUb2tlbiYmKGUuc2hvdWxkQXR0YWNoSURQQWNjZXNzVG9rZW4/dC5oZWFkZXJzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmhlYWRlcnMpLHtBdXRob3JpemF0aW9uOiJCZWFyZXIgIi5jb25jYXQoeWllbGQgdGhpcy5nZXRJRFBBY2Nlc3NUb2tlbigpKX0pOnQuaGVhZGVycz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5oZWFkZXJzKSx7QXV0aG9yaXphdGlvbjoiQmVhcmVyICIuY29uY2F0KHlpZWxkIHRoaXMuZ2V0QWNjZXNzVG9rZW4oKSl9KSl9KSl9Z2V0QmFzaWNVc2VySW5mbygpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKX0pKX1nZXREZWNvZGVkSURUb2tlbigpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldERlY29kZWRJRFRva2VuKCl9KSl9Z2V0RGVjb2RlZElEUElEVG9rZW4oKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXREZWNvZGVkSURUb2tlbigpfSkpfWdldENyeXB0b0hlbHBlcigpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldENyeXB0b0hlbHBlcigpfSkpfWdldElEVG9rZW4oKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRJRFRva2VuKCl9KSl9Z2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRPSURDU2VydmljZUVuZHBvaW50cygpfSkpfWdldEFjY2Vzc1Rva2VuKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QWNjZXNzVG9rZW4oKX0pKX1nZXRJRFBBY2Nlc3NUb2tlbigpe3ZhciB0O3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG51bGw9PT0odD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuYWNjZXNzX3Rva2VufSkpfWdldERhdGFMYXllcigpe3JldHVybiB0aGlzLl9kYXRhTGF5ZXJ9aXNBdXRoZW50aWNhdGVkKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuaXNBdXRoZW50aWNhdGVkKCl9KSl9fWNsYXNzIEF7Y29uc3RydWN0b3IoZSl7dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQ9ZSx0aGlzLl9kYXRhTGF5ZXI9dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGF0YUxheWVyKCl9cmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0KXt2YXIgbixyO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoIShudWxsIT09KHI9bnVsbD09PShuPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCkpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnBlcmlvZGljVG9rZW5SZWZyZXNoKSYmdm9pZCAwIT09ciYmcikpcmV0dXJuO2NvbnN0IG89eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCk7aWYoby5yZWZyZXNoX3Rva2VuKXtjb25zdCBuPXBhcnNlSW50KG8uZXhwaXJlc19pbikscj1zZXRUaW1lb3V0KCgoKT0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHQucmVmcmVzaEFjY2Vzc1Rva2VuKCl9KSkpLDFlMyoobjw9MTA/bjpuLTEwKSk7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoaSxKU09OLnN0cmluZ2lmeShyKSl9fSkpfWdldFJlZnJlc2hUaW1lb3V0VGltZXIoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihpKSk/SlNPTi5wYXJzZSh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihpKSk6LTF9KSl9Y2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYodClyZXR1cm4gdm9pZCBjbGVhclRpbWVvdXQodCk7Y29uc3QgZT15aWVsZCB0aGlzLmdldFJlZnJlc2hUaW1lb3V0VGltZXIoKTstMSE9PWUmJmNsZWFyVGltZW91dChlKX0pKX19dmFyIEM9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fTtmdW5jdGlvbiBEKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gTygpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9dmFyIFA9RCxJPU87ZnVuY3Rpb24gVShlKXtpZihQPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChlLDApO2lmKChQPT09RHx8IVApJiZzZXRUaW1lb3V0KXJldHVybiBQPXNldFRpbWVvdXQsc2V0VGltZW91dChlLDApO3RyeXtyZXR1cm4gUChlLDApfWNhdGNoKHQpe3RyeXtyZXR1cm4gUC5jYWxsKG51bGwsZSwwKX1jYXRjaCh0KXtyZXR1cm4gUC5jYWxsKHRoaXMsZSwwKX19fSJmdW5jdGlvbiI9PXR5cGVvZiBDLnNldFRpbWVvdXQmJihQPXNldFRpbWVvdXQpLCJmdW5jdGlvbiI9PXR5cGVvZiBDLmNsZWFyVGltZW91dCYmKEk9Y2xlYXJUaW1lb3V0KTt2YXIgTCxIPVtdLE09ITEsTj0tMTtmdW5jdGlvbiBqKCl7TSYmTCYmKE09ITEsTC5sZW5ndGg/SD1MLmNvbmNhdChIKTpOPS0xLEgubGVuZ3RoJiZ4KCkpfWZ1bmN0aW9uIHgoKXtpZighTSl7dmFyIGU9VShqKTtNPSEwO2Zvcih2YXIgdD1ILmxlbmd0aDt0Oyl7Zm9yKEw9SCxIPVtdOysrTjx0OylMJiZMW05dLnJ1bigpO049LTEsdD1ILmxlbmd0aH1MPW51bGwsTT0hMSxmdW5jdGlvbihlKXtpZihJPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQoZSk7aWYoKEk9PT1PfHwhSSkmJmNsZWFyVGltZW91dClyZXR1cm4gST1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGUpO3RyeXtJKGUpfWNhdGNoKHQpe3RyeXtyZXR1cm4gSS5jYWxsKG51bGwsZSl9Y2F0Y2godCl7cmV0dXJuIEkuY2FsbCh0aGlzLGUpfX19KGUpfX1mdW5jdGlvbiBxKGUsdCl7dGhpcy5mdW49ZSx0aGlzLmFycmF5PXR9cS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07ZnVuY3Rpb24gQigpe312YXIgRj1CLEs9QixKPUIsVz1CLHo9QixWPUIsWT1CO3ZhciBHPUMucGVyZm9ybWFuY2V8fHt9LFg9Ry5ub3d8fEcubW96Tm93fHxHLm1zTm93fHxHLm9Ob3d8fEcud2Via2l0Tm93fHxmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfTt2YXIgJD1uZXcgRGF0ZTt2YXIgWj17bmV4dFRpY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdFtuLTFdPWFyZ3VtZW50c1tuXTtILnB1c2gobmV3IHEoZSx0KSksMSE9PUgubGVuZ3RofHxNfHxVKHgpfSx0aXRsZToiYnJvd3NlciIsYnJvd3NlcjohMCxlbnY6e30sYXJndjpbXSx2ZXJzaW9uOiIiLHZlcnNpb25zOnt9LG9uOkYsYWRkTGlzdGVuZXI6SyxvbmNlOkosb2ZmOlcscmVtb3ZlTGlzdGVuZXI6eixyZW1vdmVBbGxMaXN0ZW5lcnM6VixlbWl0OlksYmluZGluZzpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIil9LGN3ZDpmdW5jdGlvbigpe3JldHVybiIvIn0sY2hkaXI6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0sdW1hc2s6ZnVuY3Rpb24oKXtyZXR1cm4gMH0saHJ0aW1lOmZ1bmN0aW9uKGUpe3ZhciB0PS4wMDEqWC5jYWxsKEcpLG49TWF0aC5mbG9vcih0KSxyPU1hdGguZmxvb3IodCUxKjFlOSk7cmV0dXJuIGUmJihuLT1lWzBdLChyLT1lWzFdKTwwJiYobi0tLHIrPTFlOSkpLFtuLHJdfSxwbGF0Zm9ybToiYnJvd3NlciIscmVsZWFzZTp7fSxjb25maWc6e30sdXB0aW1lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlLSQpLzFlM319LFE9WjtmdW5jdGlvbiBlZShlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHQsYXJndW1lbnRzKX19Y29uc3R7dG9TdHJpbmc6dGV9PU9iamVjdC5wcm90b3R5cGUse2dldFByb3RvdHlwZU9mOm5lfT1PYmplY3Qse2l0ZXJhdG9yOnJlLHRvU3RyaW5nVGFnOmllfT1TeW1ib2wsb2U9KHNlPU9iamVjdC5jcmVhdGUobnVsbCksZT0+e2NvbnN0IHQ9dGUuY2FsbChlKTtyZXR1cm4gc2VbdF18fChzZVt0XT10LnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCkpfSk7dmFyIHNlO2NvbnN0IGFlPWU9PihlPWUudG9Mb3dlckNhc2UoKSx0PT5vZSh0KT09PWUpLGNlPWU9PnQ9PnR5cGVvZiB0PT09ZSx7aXNBcnJheTp1ZX09QXJyYXksbGU9Y2UoInVuZGVmaW5lZCIpO2Z1bmN0aW9uIGRlKGUpe3JldHVybiBudWxsIT09ZSYmIWxlKGUpJiZudWxsIT09ZS5jb25zdHJ1Y3RvciYmIWxlKGUuY29uc3RydWN0b3IpJiZwZShlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKSYmZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihlKX1jb25zdCBoZT1hZSgiQXJyYXlCdWZmZXIiKTtjb25zdCBmZT1jZSgic3RyaW5nIikscGU9Y2UoImZ1bmN0aW9uIiksZ2U9Y2UoIm51bWJlciIpLHllPWU9Pm51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGUsdmU9ZT0+e2lmKCJvYmplY3QiIT09b2UoZSkpcmV0dXJuITE7Y29uc3QgdD1uZShlKTtyZXR1cm4hKG51bGwhPT10JiZ0IT09T2JqZWN0LnByb3RvdHlwZSYmbnVsbCE9PU9iamVjdC5nZXRQcm90b3R5cGVPZih0KXx8aWUgaW4gZXx8cmUgaW4gZSl9LG1lPWFlKCJEYXRlIiksd2U9YWUoIkZpbGUiKSxiZT1hZSgiQmxvYiIpLF9lPWFlKCJGaWxlTGlzdCIpO2NvbnN0IFNlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp2b2lkIDAhPT1DP0M6e30sRWU9dm9pZCAwIT09U2UuRm9ybURhdGE/U2UuRm9ybURhdGE6dm9pZCAwLFJlPWFlKCJVUkxTZWFyY2hQYXJhbXMiKSxbVGUsa2UsQWUsQ2VdPVsiUmVhZGFibGVTdHJlYW0iLCJSZXF1ZXN0IiwiUmVzcG9uc2UiLCJIZWFkZXJzIl0ubWFwKGFlKTtmdW5jdGlvbiBEZShlLHQpe2xldCBuLHIse2FsbE93bktleXM6aT0hMX09YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O2lmKG51bGwhPWUpaWYoIm9iamVjdCIhPXR5cGVvZiBlJiYoZT1bZV0pLHVlKGUpKWZvcihuPTAscj1lLmxlbmd0aDtuPHI7bisrKXQuY2FsbChudWxsLGVbbl0sbixlKTtlbHNle2lmKGRlKGUpKXJldHVybjtjb25zdCByPWk/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSk6T2JqZWN0LmtleXMoZSksbz1yLmxlbmd0aDtsZXQgcztmb3Iobj0wO248bztuKyspcz1yW25dLHQuY2FsbChudWxsLGVbc10scyxlKX19ZnVuY3Rpb24gT2UoZSx0KXtpZihkZShlKSlyZXR1cm4gbnVsbDt0PXQudG9Mb3dlckNhc2UoKTtjb25zdCBuPU9iamVjdC5rZXlzKGUpO2xldCByLGk9bi5sZW5ndGg7Zm9yKDtpLS0gPjA7KWlmKHI9bltpXSx0PT09ci50b0xvd2VyQ2FzZSgpKXJldHVybiByO3JldHVybiBudWxsfWNvbnN0IFBlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzpDLEllPWU9PiFsZShlKSYmZSE9PVBlO2NvbnN0IFVlPShMZT0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXkmJm5lKFVpbnQ4QXJyYXkpLGU9PkxlJiZlIGluc3RhbmNlb2YgTGUpO3ZhciBMZTtjb25zdCBIZT1hZSgiSFRNTEZvcm1FbGVtZW50IiksTWU9KGU9PntsZXR7aGFzT3duUHJvcGVydHk6dH09ZTtyZXR1cm4oZSxuKT0+dC5jYWxsKGUsbil9KShPYmplY3QucHJvdG90eXBlKSxOZT1hZSgiUmVnRXhwIiksamU9KGUsdCk9Pntjb25zdCBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGUpLHI9e307RGUobiwoKG4saSk9PntsZXQgbzshMSE9PShvPXQobixpLGUpKSYmKHJbaV09b3x8bil9KSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxyKX07Y29uc3QgeGU9YWUoIkFzeW5jRnVuY3Rpb24iKSxxZT0oQmU9ImZ1bmN0aW9uIj09dHlwZW9mIHNldEltbWVkaWF0ZSxGZT1wZShQZS5wb3N0TWVzc2FnZSksQmU/c2V0SW1tZWRpYXRlOkZlPyhLZT0iYXhpb3NAIi5jb25jYXQoTWF0aC5yYW5kb20oKSksSmU9W10sUGUuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKGU9PntsZXR7c291cmNlOnQsZGF0YTpufT1lO3Q9PT1QZSYmbj09PUtlJiZKZS5sZW5ndGgmJkplLnNoaWZ0KCkoKX0pLCExKSxlPT57SmUucHVzaChlKSxQZS5wb3N0TWVzc2FnZShLZSwiKiIpfSk6ZT0+c2V0VGltZW91dChlKSk7dmFyIEJlLEZlLEtlLEplO2NvbnN0IFdlPSJ1bmRlZmluZWQiIT10eXBlb2YgcXVldWVNaWNyb3Rhc2s/cXVldWVNaWNyb3Rhc2suYmluZChQZSk6dm9pZCAwIT09USYmUS5uZXh0VGlja3x8cWU7dmFyIHplPXtpc0FycmF5OnVlLGlzQXJyYXlCdWZmZXI6aGUsaXNCdWZmZXI6ZGUsaXNGb3JtRGF0YTplPT57bGV0IHQ7cmV0dXJuIGUmJihFZSYmZSBpbnN0YW5jZW9mIEVlfHxwZShlLmFwcGVuZCkmJigiZm9ybWRhdGEiPT09KHQ9b2UoZSkpfHwib2JqZWN0Ij09PXQmJnBlKGUudG9TdHJpbmcpJiYiW29iamVjdCBGb3JtRGF0YV0iPT09ZS50b1N0cmluZygpKSl9LGlzQXJyYXlCdWZmZXJWaWV3OmZ1bmN0aW9uKGUpe2xldCB0O3JldHVybiB0PSJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJkFycmF5QnVmZmVyLmlzVmlldz9BcnJheUJ1ZmZlci5pc1ZpZXcoZSk6ZSYmZS5idWZmZXImJmhlKGUuYnVmZmVyKSx0fSxpc1N0cmluZzpmZSxpc051bWJlcjpnZSxpc0Jvb2xlYW46ZT0+ITA9PT1lfHwhMT09PWUsaXNPYmplY3Q6eWUsaXNQbGFpbk9iamVjdDp2ZSxpc0VtcHR5T2JqZWN0OmU9PntpZigheWUoZSl8fGRlKGUpKXJldHVybiExO3RyeXtyZXR1cm4gMD09PU9iamVjdC5rZXlzKGUpLmxlbmd0aCYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09T2JqZWN0LnByb3RvdHlwZX1jYXRjaChlKXtyZXR1cm4hMX19LGlzUmVhZGFibGVTdHJlYW06VGUsaXNSZXF1ZXN0OmtlLGlzUmVzcG9uc2U6QWUsaXNIZWFkZXJzOkNlLGlzVW5kZWZpbmVkOmxlLGlzRGF0ZTptZSxpc0ZpbGU6d2UsaXNSZWFjdE5hdGl2ZUJsb2I6ZT0+ISghZXx8dm9pZCAwPT09ZS51cmkpLGlzUmVhY3ROYXRpdmU6ZT0+ZSYmdm9pZCAwIT09ZS5nZXRQYXJ0cyxpc0Jsb2I6YmUsaXNSZWdFeHA6TmUsaXNGdW5jdGlvbjpwZSxpc1N0cmVhbTplPT55ZShlKSYmcGUoZS5waXBlKSxpc1VSTFNlYXJjaFBhcmFtczpSZSxpc1R5cGVkQXJyYXk6VWUsaXNGaWxlTGlzdDpfZSxmb3JFYWNoOkRlLG1lcmdlOmZ1bmN0aW9uIGUoKXtjb25zdHtjYXNlbGVzczp0LHNraXBVbmRlZmluZWQ6bn09SWUodGhpcykmJnRoaXN8fHt9LHI9e30saT0oaSxvKT0+e2lmKCJfX3Byb3RvX18iPT09b3x8ImNvbnN0cnVjdG9yIj09PW98fCJwcm90b3R5cGUiPT09bylyZXR1cm47Y29uc3Qgcz10JiZPZShyLG8pfHxvO3ZlKHJbc10pJiZ2ZShpKT9yW3NdPWUocltzXSxpKTp2ZShpKT9yW3NdPWUoe30saSk6dWUoaSk/cltzXT1pLnNsaWNlKCk6biYmbGUoaSl8fChyW3NdPWkpfTtmb3IobGV0IGU9MCx0PWFyZ3VtZW50cy5sZW5ndGg7ZTx0O2UrKylhcmd1bWVudHNbZV0mJkRlKGFyZ3VtZW50c1tlXSxpKTtyZXR1cm4gcn0sZXh0ZW5kOmZ1bmN0aW9uKGUsdCxuKXtsZXR7YWxsT3duS2V5czpyfT1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e307cmV0dXJuIERlKHQsKCh0LHIpPT57biYmcGUodCk/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUscix7dmFsdWU6ZWUodCxuKSx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIse3ZhbHVlOnQsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KX0pLHthbGxPd25LZXlzOnJ9KSxlfSx0cmltOmU9PmUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLCIiKSxzdHJpcEJPTTplPT4oNjUyNzk9PT1lLmNoYXJDb2RlQXQoMCkmJihlPWUuc2xpY2UoMSkpLGUpLGluaGVyaXRzOihlLHQsbixyKT0+e2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUsciksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJjb25zdHJ1Y3RvciIse3ZhbHVlOmUsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwic3VwZXIiLHt2YWx1ZTp0LnByb3RvdHlwZX0pLG4mJk9iamVjdC5hc3NpZ24oZS5wcm90b3R5cGUsbil9LHRvRmxhdE9iamVjdDooZSx0LG4scik9PntsZXQgaSxvLHM7Y29uc3QgYT17fTtpZih0PXR8fHt9LG51bGw9PWUpcmV0dXJuIHQ7ZG97Zm9yKGk9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSksbz1pLmxlbmd0aDtvLS0gPjA7KXM9aVtvXSxyJiYhcihzLGUsdCl8fGFbc118fCh0W3NdPWVbc10sYVtzXT0hMCk7ZT0hMSE9PW4mJm5lKGUpfXdoaWxlKGUmJighbnx8bihlLHQpKSYmZSE9PU9iamVjdC5wcm90b3R5cGUpO3JldHVybiB0fSxraW5kT2Y6b2Usa2luZE9mVGVzdDphZSxlbmRzV2l0aDooZSx0LG4pPT57ZT1TdHJpbmcoZSksKHZvaWQgMD09PW58fG4+ZS5sZW5ndGgpJiYobj1lLmxlbmd0aCksbi09dC5sZW5ndGg7Y29uc3Qgcj1lLmluZGV4T2YodCxuKTtyZXR1cm4tMSE9PXImJnI9PT1ufSx0b0FycmF5OmU9PntpZighZSlyZXR1cm4gbnVsbDtpZih1ZShlKSlyZXR1cm4gZTtsZXQgdD1lLmxlbmd0aDtpZighZ2UodCkpcmV0dXJuIG51bGw7Y29uc3Qgbj1uZXcgQXJyYXkodCk7Zm9yKDt0LS0gPjA7KW5bdF09ZVt0XTtyZXR1cm4gbn0sZm9yRWFjaEVudHJ5OihlLHQpPT57Y29uc3Qgbj0oZSYmZVtyZV0pLmNhbGwoZSk7bGV0IHI7Zm9yKDsocj1uLm5leHQoKSkmJiFyLmRvbmU7KXtjb25zdCBuPXIudmFsdWU7dC5jYWxsKGUsblswXSxuWzFdKX19LG1hdGNoQWxsOihlLHQpPT57bGV0IG47Y29uc3Qgcj1bXTtmb3IoO251bGwhPT0obj1lLmV4ZWModCkpOylyLnB1c2gobik7cmV0dXJuIHJ9LGlzSFRNTEZvcm06SGUsaGFzT3duUHJvcGVydHk6TWUsaGFzT3duUHJvcDpNZSxyZWR1Y2VEZXNjcmlwdG9yczpqZSxmcmVlemVNZXRob2RzOmU9PntqZShlLCgodCxuKT0+e2lmKHBlKGUpJiYtMSE9PVsiYXJndW1lbnRzIiwiY2FsbGVyIiwiY2FsbGVlIl0uaW5kZXhPZihuKSlyZXR1cm4hMTtjb25zdCByPWVbbl07cGUocikmJih0LmVudW1lcmFibGU9ITEsIndyaXRhYmxlImluIHQ/dC53cml0YWJsZT0hMTp0LnNldHx8KHQuc2V0PSgpPT57dGhyb3cgRXJyb3IoIkNhbiBub3QgcmV3cml0ZSByZWFkLW9ubHkgbWV0aG9kICciK24rIiciKX0pKX0pKX0sdG9PYmplY3RTZXQ6KGUsdCk9Pntjb25zdCBuPXt9LHI9ZT0+e2UuZm9yRWFjaCgoZT0+e25bZV09ITB9KSl9O3JldHVybiB1ZShlKT9yKGUpOnIoU3RyaW5nKGUpLnNwbGl0KHQpKSxufSx0b0NhbWVsQ2FzZTplPT5lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXHNdKFthLXpcZF0pKFx3KikvZywoZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0LnRvVXBwZXJDYXNlKCkrbn0pKSxub29wOigpPT57fSx0b0Zpbml0ZU51bWJlcjooZSx0KT0+bnVsbCE9ZSYmTnVtYmVyLmlzRmluaXRlKGU9K2UpP2U6dCxmaW5kS2V5Ok9lLGdsb2JhbDpQZSxpc0NvbnRleHREZWZpbmVkOkllLGlzU3BlY0NvbXBsaWFudEZvcm06ZnVuY3Rpb24oZSl7cmV0dXJuISEoZSYmcGUoZS5hcHBlbmQpJiYiRm9ybURhdGEiPT09ZVtpZV0mJmVbcmVdKX0sdG9KU09OT2JqZWN0OmU9Pntjb25zdCB0PW5ldyBBcnJheSgxMCksbj0oZSxyKT0+e2lmKHllKGUpKXtpZih0LmluZGV4T2YoZSk+PTApcmV0dXJuO2lmKGRlKGUpKXJldHVybiBlO2lmKCEoInRvSlNPTiJpbiBlKSl7dFtyXT1lO2NvbnN0IGk9dWUoZSk/W106e307cmV0dXJuIERlKGUsKChlLHQpPT57Y29uc3Qgbz1uKGUscisxKTshbGUobykmJihpW3RdPW8pfSkpLHRbcl09dm9pZCAwLGl9fXJldHVybiBlfTtyZXR1cm4gbihlLDApfSxpc0FzeW5jRm46eGUsaXNUaGVuYWJsZTplPT5lJiYoeWUoZSl8fHBlKGUpKSYmcGUoZS50aGVuKSYmcGUoZS5jYXRjaCksc2V0SW1tZWRpYXRlOnFlLGFzYXA6V2UsaXNJdGVyYWJsZTplPT5udWxsIT1lJiZwZShlW3JlXSl9LFZlPVtdLFllPVtdLEdlPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LFhlPSExO2Z1bmN0aW9uICRlKCl7WGU9ITA7Zm9yKHZhciBlPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIix0PTAsbj1lLmxlbmd0aDt0PG47Kyt0KVZlW3RdPWVbdF0sWWVbZS5jaGFyQ29kZUF0KHQpXT10O1llWyItIi5jaGFyQ29kZUF0KDApXT02MixZZVsiXyIuY2hhckNvZGVBdCgwKV09NjN9ZnVuY3Rpb24gWmUoZSx0LG4pe2Zvcih2YXIgcixpLG89W10scz10O3M8bjtzKz0zKXI9KGVbc108PDE2KSsoZVtzKzFdPDw4KStlW3MrMl0sby5wdXNoKFZlWyhpPXIpPj4xOCY2M10rVmVbaT4+MTImNjNdK1ZlW2k+PjYmNjNdK1ZlWzYzJmldKTtyZXR1cm4gby5qb2luKCIiKX1mdW5jdGlvbiBRZShlKXt2YXIgdDtYZXx8JGUoKTtmb3IodmFyIG49ZS5sZW5ndGgscj1uJTMsaT0iIixvPVtdLHM9MTYzODMsYT0wLGM9bi1yO2E8YzthKz1zKW8ucHVzaChaZShlLGEsYStzPmM/YzphK3MpKTtyZXR1cm4gMT09PXI/KHQ9ZVtuLTFdLGkrPVZlW3Q+PjJdLGkrPVZlW3Q8PDQmNjNdLGkrPSI9PSIpOjI9PT1yJiYodD0oZVtuLTJdPDw4KStlW24tMV0saSs9VmVbdD4+MTBdLGkrPVZlW3Q+PjQmNjNdLGkrPVZlW3Q8PDImNjNdLGkrPSI9Iiksby5wdXNoKGkpLG8uam9pbigiIil9ZnVuY3Rpb24gZXQoZSx0LG4scixpKXt2YXIgbyxzLGE9OCppLXItMSxjPSgxPDxhKS0xLHU9Yz4+MSxsPS03LGQ9bj9pLTE6MCxoPW4/LTE6MSxmPWVbdCtkXTtmb3IoZCs9aCxvPWYmKDE8PC1sKS0xLGY+Pj0tbCxsKz1hO2w+MDtvPTI1NipvK2VbdCtkXSxkKz1oLGwtPTgpO2ZvcihzPW8mKDE8PC1sKS0xLG8+Pj0tbCxsKz1yO2w+MDtzPTI1NipzK2VbdCtkXSxkKz1oLGwtPTgpO2lmKDA9PT1vKW89MS11O2Vsc2V7aWYobz09PWMpcmV0dXJuIHM/TmFOOjEvMCooZj8tMToxKTtzKz1NYXRoLnBvdygyLHIpLG8tPXV9cmV0dXJuKGY/LTE6MSkqcypNYXRoLnBvdygyLG8tcil9ZnVuY3Rpb24gdHQoZSx0LG4scixpLG8pe3ZhciBzLGEsYyx1PTgqby1pLTEsbD0oMTw8dSktMSxkPWw+PjEsaD0yMz09PWk/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGY9cj8wOm8tMSxwPXI/MTotMSxnPXQ8MHx8MD09PXQmJjEvdDwwPzE6MDtmb3IodD1NYXRoLmFicyh0KSxpc05hTih0KXx8dD09PTEvMD8oYT1pc05hTih0KT8xOjAscz1sKToocz1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSx0KihjPU1hdGgucG93KDIsLXMpKTwxJiYocy0tLGMqPTIpLCh0Kz1zK2Q+PTE/aC9jOmgqTWF0aC5wb3coMiwxLWQpKSpjPj0yJiYocysrLGMvPTIpLHMrZD49bD8oYT0wLHM9bCk6cytkPj0xPyhhPSh0KmMtMSkqTWF0aC5wb3coMixpKSxzKz1kKTooYT10Kk1hdGgucG93KDIsZC0xKSpNYXRoLnBvdygyLGkpLHM9MCkpO2k+PTg7ZVtuK2ZdPTI1NSZhLGYrPXAsYS89MjU2LGktPTgpO2ZvcihzPXM8PGl8YSx1Kz1pO3U+MDtlW24rZl09MjU1JnMsZis9cCxzLz0yNTYsdS09OCk7ZVtuK2YtcF18PTEyOCpnfXZhciBudD17fS50b1N0cmluZyxydD1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1udC5jYWxsKGUpfTthdC5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMD09PUMuVFlQRURfQVJSQVlfU1VQUE9SVHx8Qy5UWVBFRF9BUlJBWV9TVVBQT1JUO3ZhciBpdD1vdCgpO2Z1bmN0aW9uIG90KCl7cmV0dXJuIGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIHN0KGUsdCl7aWYob3QoKTx0KXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiBhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189YXQucHJvdG90eXBlOihudWxsPT09ZSYmKGU9bmV3IGF0KHQpKSxlLmxlbmd0aD10KSxlfWZ1bmN0aW9uIGF0KGUsdCxuKXtpZighKGF0LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiBhdCkpcmV0dXJuIG5ldyBhdChlLHQsbik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBsdCh0aGlzLGUpfXJldHVybiBjdCh0aGlzLGUsdCxuKX1mdW5jdGlvbiBjdChlLHQsbixyKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQsbixyKXtpZih0LmJ5dGVMZW5ndGgsbjwwfHx0LmJ5dGVMZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxuKyhyfHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3Q9dm9pZCAwPT09biYmdm9pZCAwPT09cj9uZXcgVWludDhBcnJheSh0KTp2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KHQsbik6bmV3IFVpbnQ4QXJyYXkodCxuLHIpO2F0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9dCkuX19wcm90b19fPWF0LnByb3RvdHlwZTplPWR0KGUsdCk7cmV0dXJuIGV9KGUsdCxuLHIpOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQsbil7InN0cmluZyI9PXR5cGVvZiBuJiYiIiE9PW58fChuPSJ1dGY4Iik7aWYoIWF0LmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIHI9MHxwdCh0LG4pLGk9KGU9c3QoZSxyKSkud3JpdGUodCxuKTtpIT09ciYmKGU9ZS5zbGljZSgwLGkpKTtyZXR1cm4gZX0oZSx0LG4pOmZ1bmN0aW9uKGUsdCl7aWYoZnQodCkpe3ZhciBuPTB8aHQodC5sZW5ndGgpO3JldHVybiAwPT09KGU9c3QoZSxuKSkubGVuZ3RofHx0LmNvcHkoZSwwLDAsbiksZX1pZih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIHQpcmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8KHI9dC5sZW5ndGgpIT1yP3N0KGUsMCk6ZHQoZSx0KTtpZigiQnVmZmVyIj09PXQudHlwZSYmcnQodC5kYXRhKSlyZXR1cm4gZHQoZSx0LmRhdGEpfXZhciByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0oZSx0KX1mdW5jdGlvbiB1dChlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIGx0KGUsdCl7aWYodXQodCksZT1zdChlLHQ8MD8wOjB8aHQodCkpLCFhdC5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgbj0wO248dDsrK24pZVtuXT0wO3JldHVybiBlfWZ1bmN0aW9uIGR0KGUsdCl7dmFyIG49dC5sZW5ndGg8MD8wOjB8aHQodC5sZW5ndGgpO2U9c3QoZSxuKTtmb3IodmFyIHI9MDtyPG47cis9MSllW3JdPTI1NSZ0W3JdO3JldHVybiBlfWZ1bmN0aW9uIGh0KGUpe2lmKGU+PW90KCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK290KCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHxlfWZ1bmN0aW9uIGZ0KGUpe3JldHVybiEobnVsbD09ZXx8IWUuX2lzQnVmZmVyKX1mdW5jdGlvbiBwdChlLHQpe2lmKGZ0KGUpKXJldHVybiBlLmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpfHxlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiBlLmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiBlJiYoZT0iIitlKTt2YXIgbj1lLmxlbmd0aDtpZigwPT09bilyZXR1cm4gMDtmb3IodmFyIHI9ITE7Oylzd2l0Y2godCl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gbjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBCdChlKS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKm47Y2FzZSJoZXgiOnJldHVybiBuPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIEZ0KGUpLmxlbmd0aDtkZWZhdWx0OmlmKHIpcmV0dXJuIEJ0KGUpLmxlbmd0aDt0PSgiIit0KS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIGd0KGUsdCxuKXt2YXIgcj0hMTtpZigodm9pZCAwPT09dHx8dDwwKSYmKHQ9MCksdD50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09bnx8bj50aGlzLmxlbmd0aCkmJihuPXRoaXMubGVuZ3RoKSxuPD0wKXJldHVybiIiO2lmKChuPj4+PTApPD0odD4+Pj0wKSlyZXR1cm4iIjtmb3IoZXx8KGU9InV0ZjgiKTs7KXN3aXRjaChlKXtjYXNlImhleCI6cmV0dXJuIE90KHRoaXMsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBrdCh0aGlzLHQsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIEN0KHRoaXMsdCxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBEdCh0aGlzLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBUdCh0aGlzLHQsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBQdCh0aGlzLHQsbik7ZGVmYXVsdDppZihyKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrZSk7ZT0oZSsiIikudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiB5dChlLHQsbil7dmFyIHI9ZVt0XTtlW3RdPWVbbl0sZVtuXT1yfWZ1bmN0aW9uIHZ0KGUsdCxuLHIsaSl7aWYoMD09PWUubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygbj8ocj1uLG49MCk6bj4yMTQ3NDgzNjQ3P249MjE0NzQ4MzY0NzpuPC0yMTQ3NDgzNjQ4JiYobj0tMjE0NzQ4MzY0OCksbj0rbixpc05hTihuKSYmKG49aT8wOmUubGVuZ3RoLTEpLG48MCYmKG49ZS5sZW5ndGgrbiksbj49ZS5sZW5ndGgpe2lmKGkpcmV0dXJuLTE7bj1lLmxlbmd0aC0xfWVsc2UgaWYobjwwKXtpZighaSlyZXR1cm4tMTtuPTB9aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD1hdC5mcm9tKHQscikpLGZ0KHQpKXJldHVybiAwPT09dC5sZW5ndGg/LTE6bXQoZSx0LG4scixpKTtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQmPTI1NSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9pP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChlLHQsbik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChlLHQsbik6bXQoZSxbdF0sbixyLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIG10KGUsdCxuLHIsaSl7dmFyIG8scz0xLGE9ZS5sZW5ndGgsYz10Lmxlbmd0aDtpZih2b2lkIDAhPT1yJiYoInVjczIiPT09KHI9U3RyaW5nKHIpLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09cnx8InV0ZjE2bGUiPT09cnx8InV0Zi0xNmxlIj09PXIpKXtpZihlLmxlbmd0aDwyfHx0Lmxlbmd0aDwyKXJldHVybi0xO3M9MixhLz0yLGMvPTIsbi89Mn1mdW5jdGlvbiB1KGUsdCl7cmV0dXJuIDE9PT1zP2VbdF06ZS5yZWFkVUludDE2QkUodCpzKX1pZihpKXt2YXIgbD0tMTtmb3Iobz1uO288YTtvKyspaWYodShlLG8pPT09dSh0LC0xPT09bD8wOm8tbCkpe2lmKC0xPT09bCYmKGw9byksby1sKzE9PT1jKXJldHVybiBsKnN9ZWxzZS0xIT09bCYmKG8tPW8tbCksbD0tMX1lbHNlIGZvcihuK2M+YSYmKG49YS1jKSxvPW47bz49MDtvLS0pe2Zvcih2YXIgZD0hMCxoPTA7aDxjO2grKylpZih1KGUsbytoKSE9PXUodCxoKSl7ZD0hMTticmVha31pZihkKXJldHVybiBvfXJldHVybi0xfWZ1bmN0aW9uIHd0KGUsdCxuLHIpe249TnVtYmVyKG4pfHwwO3ZhciBpPWUubGVuZ3RoLW47cj8ocj1OdW1iZXIocikpPmkmJihyPWkpOnI9aTt2YXIgbz10Lmxlbmd0aDtpZihvJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7cj5vLzImJihyPW8vMik7Zm9yKHZhciBzPTA7czxyOysrcyl7dmFyIGE9cGFyc2VJbnQodC5zdWJzdHIoMipzLDIpLDE2KTtpZihpc05hTihhKSlyZXR1cm4gcztlW24rc109YX1yZXR1cm4gc31mdW5jdGlvbiBidChlLHQsbixyKXtyZXR1cm4gS3QoQnQodCxlLmxlbmd0aC1uKSxlLG4scil9ZnVuY3Rpb24gX3QoZSx0LG4scil7cmV0dXJuIEt0KGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDsrK24pdC5wdXNoKDI1NSZlLmNoYXJDb2RlQXQobikpO3JldHVybiB0fSh0KSxlLG4scil9ZnVuY3Rpb24gU3QoZSx0LG4scil7cmV0dXJuIF90KGUsdCxuLHIpfWZ1bmN0aW9uIEV0KGUsdCxuLHIpe3JldHVybiBLdChGdCh0KSxlLG4scil9ZnVuY3Rpb24gUnQoZSx0LG4scil7cmV0dXJuIEt0KGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHIsaSxvPVtdLHM9MDtzPGUubGVuZ3RoJiYhKCh0LT0yKTwwKTsrK3Mpcj0obj1lLmNoYXJDb2RlQXQocykpPj44LGk9biUyNTYsby5wdXNoKGkpLG8ucHVzaChyKTtyZXR1cm4gb30odCxlLmxlbmd0aC1uKSxlLG4scil9ZnVuY3Rpb24gVHQoZSx0LG4pe3JldHVybiAwPT09dCYmbj09PWUubGVuZ3RoP1FlKGUpOlFlKGUuc2xpY2UodCxuKSl9ZnVuY3Rpb24ga3QoZSx0LG4pe249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciByPVtdLGk9dDtpPG47KXt2YXIgbyxzLGEsYyx1PWVbaV0sbD1udWxsLGQ9dT4yMzk/NDp1PjIyMz8zOnU+MTkxPzI6MTtpZihpK2Q8PW4pc3dpdGNoKGQpe2Nhc2UgMTp1PDEyOCYmKGw9dSk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYobz1lW2krMV0pKSYmKGM9KDMxJnUpPDw2fDYzJm8pPjEyNyYmKGw9Yyk7YnJlYWs7Y2FzZSAzOm89ZVtpKzFdLHM9ZVtpKzJdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYoYz0oMTUmdSk8PDEyfCg2MyZvKTw8Nnw2MyZzKT4yMDQ3JiYoYzw1NTI5Nnx8Yz41NzM0MykmJihsPWMpO2JyZWFrO2Nhc2UgNDpvPWVbaSsxXSxzPWVbaSsyXSxhPWVbaSszXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmMTI4PT0oMTkyJmEpJiYoYz0oMTUmdSk8PDE4fCg2MyZvKTw8MTJ8KDYzJnMpPDw2fDYzJmEpPjY1NTM1JiZjPDExMTQxMTImJihsPWMpfW51bGw9PT1sPyhsPTY1NTMzLGQ9MSk6bD42NTUzNSYmKGwtPTY1NTM2LHIucHVzaChsPj4+MTAmMTAyM3w1NTI5NiksbD01NjMyMHwxMDIzJmwpLHIucHVzaChsKSxpKz1kfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtpZih0PD1BdClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZSk7dmFyIG49IiIscj0wO2Zvcig7cjx0OyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlLnNsaWNlKHIscis9QXQpKTtyZXR1cm4gbn0ocil9YXQucG9vbFNpemU9ODE5MixhdC5fYXVnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX189YXQucHJvdG90eXBlLGV9LGF0LmZyb209ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBjdChudWxsLGUsdCxuKX0sYXQuVFlQRURfQVJSQVlfU1VQUE9SVCYmKGF0LnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsYXQuX19wcm90b19fPVVpbnQ4QXJyYXkpLGF0LmFsbG9jPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHV0KHQpLHQ8PTA/c3QoZSx0KTp2b2lkIDAhPT1uPyJzdHJpbmciPT10eXBlb2Ygcj9zdChlLHQpLmZpbGwobixyKTpzdChlLHQpLmZpbGwobik6c3QoZSx0KX0obnVsbCxlLHQsbil9LGF0LmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe3JldHVybiBsdChudWxsLGUpfSxhdC5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIGx0KG51bGwsZSl9LGF0LmlzQnVmZmVyPUp0LGF0LmNvbXBhcmU9ZnVuY3Rpb24oZSx0KXtpZighZnQoZSl8fCFmdCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYoZT09PXQpcmV0dXJuIDA7Zm9yKHZhciBuPWUubGVuZ3RoLHI9dC5sZW5ndGgsaT0wLG89TWF0aC5taW4obixyKTtpPG87KytpKWlmKGVbaV0hPT10W2ldKXtuPWVbaV0scj10W2ldO2JyZWFrfXJldHVybiBuPHI/LTE6cjxuPzE6MH0sYXQuaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sYXQuY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIXJ0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGF0LmFsbG9jKDApO3ZhciBuO2lmKHZvaWQgMD09PXQpZm9yKHQ9MCxuPTA7bjxlLmxlbmd0aDsrK24pdCs9ZVtuXS5sZW5ndGg7dmFyIHI9YXQuYWxsb2NVbnNhZmUodCksaT0wO2ZvcihuPTA7bjxlLmxlbmd0aDsrK24pe3ZhciBvPWVbbl07aWYoIWZ0KG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkocixpKSxpKz1vLmxlbmd0aH1yZXR1cm4gcn0sYXQuYnl0ZUxlbmd0aD1wdCxhdC5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLGF0LnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTIpeXQodGhpcyx0LHQrMSk7cmV0dXJuIHRoaXN9LGF0LnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTQpeXQodGhpcyx0LHQrMykseXQodGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc30sYXQucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9OCl5dCh0aGlzLHQsdCs3KSx5dCh0aGlzLHQrMSx0KzYpLHl0KHRoaXMsdCsyLHQrNSkseXQodGhpcyx0KzMsdCs0KTtyZXR1cm4gdGhpc30sYXQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PWU/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/a3QodGhpcywwLGUpOmd0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYXQucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighZnQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09ZXx8MD09PWF0LmNvbXBhcmUodGhpcyxlKX0sYXQucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgZT0iIjtyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKGU9dGhpcy50b1N0cmluZygiaGV4IiwwLDUwKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+NTAmJihlKz0iIC4uLiAiKSksIjxCdWZmZXIgIitlKyI+In0sYXQucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LG4scixpKXtpZighZnQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PW4mJihuPWU/ZS5sZW5ndGg6MCksdm9pZCAwPT09ciYmKHI9MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLHQ8MHx8bj5lLmxlbmd0aHx8cjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPj1pJiZ0Pj1uKXJldHVybiAwO2lmKHI+PWkpcmV0dXJuLTE7aWYodD49bilyZXR1cm4gMTtpZih0aGlzPT09ZSlyZXR1cm4gMDtmb3IodmFyIG89KGk+Pj49MCktKHI+Pj49MCkscz0obj4+Pj0wKS0odD4+Pj0wKSxhPU1hdGgubWluKG8scyksYz10aGlzLnNsaWNlKHIsaSksdT1lLnNsaWNlKHQsbiksbD0wO2w8YTsrK2wpaWYoY1tsXSE9PXVbbF0pe289Y1tsXSxzPXVbbF07YnJlYWt9cmV0dXJuIG88cz8tMTpzPG8/MTowfSxhdC5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybi0xIT09dGhpcy5pbmRleE9mKGUsdCxuKX0sYXQucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2dCh0aGlzLGUsdCxuLCEwKX0sYXQucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdnQodGhpcyxlLHQsbiwhMSl9LGF0LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQsbixyKXtpZih2b2lkIDA9PT10KXI9InV0ZjgiLG49dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYodm9pZCAwPT09biYmInN0cmluZyI9PXR5cGVvZiB0KXI9dCxuPXRoaXMubGVuZ3RoLHQ9MDtlbHNle2lmKCFpc0Zpbml0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7dHw9MCxpc0Zpbml0ZShuKT8obnw9MCx2b2lkIDA9PT1yJiYocj0idXRmOCIpKToocj1uLG49dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC10O2lmKCh2b2lkIDA9PT1ufHxuPmkpJiYobj1pKSxlLmxlbmd0aD4wJiYobjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO3J8fChyPSJ1dGY4Iik7Zm9yKHZhciBvPSExOzspc3dpdGNoKHIpe2Nhc2UiaGV4IjpyZXR1cm4gd3QodGhpcyxlLHQsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gYnQodGhpcyxlLHQsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIF90KHRoaXMsZSx0LG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIFN0KHRoaXMsZSx0LG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gRXQodGhpcyxlLHQsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBSdCh0aGlzLGUsdCxuKTtkZWZhdWx0OmlmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKTtyPSgiIityKS50b0xvd2VyQ2FzZSgpLG89ITB9fSxhdC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgQXQ9NDA5NjtmdW5jdGlvbiBDdChlLHQsbil7dmFyIHI9IiI7bj1NYXRoLm1pbihlLmxlbmd0aCxuKTtmb3IodmFyIGk9dDtpPG47KytpKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JmVbaV0pO3JldHVybiByfWZ1bmN0aW9uIER0KGUsdCxuKXt2YXIgcj0iIjtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgaT10O2k8bjsrK2kpcis9U3RyaW5nLmZyb21DaGFyQ29kZShlW2ldKTtyZXR1cm4gcn1mdW5jdGlvbiBPdChlLHQsbil7dmFyIHI9ZS5sZW5ndGg7KCF0fHx0PDApJiYodD0wKSwoIW58fG48MHx8bj5yKSYmKG49cik7Zm9yKHZhciBpPSIiLG89dDtvPG47KytvKWkrPXF0KGVbb10pO3JldHVybiBpfWZ1bmN0aW9uIFB0KGUsdCxuKXtmb3IodmFyIHI9ZS5zbGljZSh0LG4pLGk9IiIsbz0wO288ci5sZW5ndGg7bys9MilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbb10rMjU2KnJbbysxXSk7cmV0dXJuIGl9ZnVuY3Rpb24gSXQoZSx0LG4pe2lmKGUlMSE9MHx8ZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZihlK3Q+bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIFV0KGUsdCxuLHIsaSxvKXtpZighZnQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKHQ+aXx8dDxvKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihuK3I+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEx0KGUsdCxuLHIpe3Q8MCYmKHQ9NjU1MzUrdCsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKGUubGVuZ3RoLW4sMik7aTxvOysraSllW24raV09KHQmMjU1PDw4KihyP2k6MS1pKSk+Pj44KihyP2k6MS1pKX1mdW5jdGlvbiBIdChlLHQsbixyKXt0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKGUubGVuZ3RoLW4sNCk7aTxvOysraSllW24raV09dD4+PjgqKHI/aTozLWkpJjI1NX1mdW5jdGlvbiBNdChlLHQsbixyLGksbyl7aWYobityPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIE50KGUsdCxuLHIsaSl7cmV0dXJuIGl8fE10KGUsMCxuLDQpLHR0KGUsdCxuLHIsMjMsNCksbis0fWZ1bmN0aW9uIGp0KGUsdCxuLHIsaSl7cmV0dXJuIGl8fE10KGUsMCxuLDgpLHR0KGUsdCxuLHIsNTIsOCksbis4fWF0LnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9dGhpcy5sZW5ndGg7aWYoKGU9fn5lKTwwPyhlKz1yKTwwJiYoZT0wKTplPnImJihlPXIpLCh0PXZvaWQgMD09PXQ/cjp+fnQpPDA/KHQrPXIpPDAmJih0PTApOnQ+ciYmKHQ9ciksdDxlJiYodD1lKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUKShuPXRoaXMuc3ViYXJyYXkoZSx0KSkuX19wcm90b19fPWF0LnByb3RvdHlwZTtlbHNle3ZhciBpPXQtZTtuPW5ldyBhdChpLHZvaWQgMCk7Zm9yKHZhciBvPTA7bzxpOysrbyluW29dPXRoaXNbbytlXX1yZXR1cm4gbn0sYXQucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxJdChlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2VdLGk9MSxvPTA7KytvPHQmJihpKj0yNTYpOylyKz10aGlzW2Urb10qaTtyZXR1cm4gcn0sYXQucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxJdChlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2UrLS10XSxpPTE7dD4wJiYoaSo9MjU2KTspcis9dGhpc1tlKy0tdF0qaTtyZXR1cm4gcn0sYXQucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxJdChlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV19LGF0LnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8SXQoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OH0sYXQucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxJdChlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDh8dGhpc1tlKzFdfSxhdC5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEl0KGUsNCx0aGlzLmxlbmd0aCksKHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbZSszXX0sYXQucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxJdChlLDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbZV0rKHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXSl9LGF0LnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxJdChlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2VdLGk9MSxvPTA7KytvPHQmJihpKj0yNTYpOylyKz10aGlzW2Urb10qaTtyZXR1cm4gcj49KGkqPTEyOCkmJihyLT1NYXRoLnBvdygyLDgqdCkpLHJ9LGF0LnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxJdChlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10LGk9MSxvPXRoaXNbZSstLXJdO3I+MCYmKGkqPTI1Nik7KW8rPXRoaXNbZSstLXJdKmk7cmV0dXJuIG8+PShpKj0xMjgpJiYoby09TWF0aC5wb3coMiw4KnQpKSxvfSxhdC5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8SXQoZSwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1tlXT8tMSooMjU1LXRoaXNbZV0rMSk6dGhpc1tlXX0sYXQucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7dHx8SXQoZSwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW2VdfHRoaXNbZSsxXTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sYXQucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7dHx8SXQoZSwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW2UrMV18dGhpc1tlXTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sYXQucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEl0KGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNnx0aGlzW2UrM108PDI0fSxhdC5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8SXQoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdPDwyNHx0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM119LGF0LnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxJdChlLDQsdGhpcy5sZW5ndGgpLGV0KHRoaXMsZSwhMCwyMyw0KX0sYXQucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEl0KGUsNCx0aGlzLmxlbmd0aCksZXQodGhpcyxlLCExLDIzLDQpfSxhdC5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEl0KGUsOCx0aGlzLmxlbmd0aCksZXQodGhpcyxlLCEwLDUyLDgpfSxhdC5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEl0KGUsOCx0aGlzLmxlbmd0aCksZXQodGhpcyxlLCExLDUyLDgpfSxhdC5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24oZSx0LG4scil7KGU9K2UsdHw9MCxufD0wLHIpfHxVdCh0aGlzLGUsdCxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBpPTEsbz0wO2Zvcih0aGlzW3RdPTI1NSZlOysrbzxuJiYoaSo9MjU2KTspdGhpc1t0K29dPWUvaSYyNTU7cmV0dXJuIHQrbn0sYXQucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKGUsdCxuLHIpeyhlPStlLHR8PTAsbnw9MCxyKXx8VXQodGhpcyxlLHQsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgaT1uLTEsbz0xO2Zvcih0aGlzW3QraV09MjU1JmU7LS1pPj0wJiYobyo9MjU2KTspdGhpc1t0K2ldPWUvbyYyNTU7cmV0dXJuIHQrbn0sYXQucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8VXQodGhpcyxlLHQsMSwyNTUsMCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksdGhpc1t0XT0yNTUmZSx0KzF9LGF0LnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fFV0KHRoaXMsZSx0LDIsNjU1MzUsMCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgpOkx0KHRoaXMsZSx0LCEwKSx0KzJ9LGF0LnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fFV0KHRoaXMsZSx0LDIsNjU1MzUsMCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOkx0KHRoaXMsZSx0LCExKSx0KzJ9LGF0LnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fFV0KHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3QrM109ZT4+PjI0LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdF09MjU1JmUpOkh0KHRoaXMsZSx0LCEwKSx0KzR9LGF0LnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fFV0KHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOkh0KHRoaXMsZSx0LCExKSx0KzR9LGF0LnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9K2UsdHw9MCwhcil7dmFyIGk9TWF0aC5wb3coMiw4Km4tMSk7VXQodGhpcyxlLHQsbixpLTEsLWkpfXZhciBvPTAscz0xLGE9MDtmb3IodGhpc1t0XT0yNTUmZTsrK288biYmKHMqPTI1Nik7KWU8MCYmMD09PWEmJjAhPT10aGlzW3Qrby0xXSYmKGE9MSksdGhpc1t0K29dPShlL3M+PjApLWEmMjU1O3JldHVybiB0K259LGF0LnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9K2UsdHw9MCwhcil7dmFyIGk9TWF0aC5wb3coMiw4Km4tMSk7VXQodGhpcyxlLHQsbixpLTEsLWkpfXZhciBvPW4tMSxzPTEsYT0wO2Zvcih0aGlzW3Qrb109MjU1JmU7LS1vPj0wJiYocyo9MjU2KTspZTwwJiYwPT09YSYmMCE9PXRoaXNbdCtvKzFdJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrbn0sYXQucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxVdCh0aGlzLGUsdCwxLDEyNywtMTI4KSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSxlPDAmJihlPTI1NStlKzEpLHRoaXNbdF09MjU1JmUsdCsxfSxhdC5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fFV0KHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6THQodGhpcyxlLHQsITApLHQrMn0sYXQucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxVdCh0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOkx0KHRoaXMsZSx0LCExKSx0KzJ9LGF0LnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8VXQodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOkh0KHRoaXMsZSx0LCEwKSx0KzR9LGF0LnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8VXQodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOkh0KHRoaXMsZSx0LCExKSx0KzR9LGF0LnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBOdCh0aGlzLGUsdCwhMCxuKX0sYXQucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIE50KHRoaXMsZSx0LCExLG4pfSxhdC5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGp0KHRoaXMsZSx0LCEwLG4pfSxhdC5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGp0KHRoaXMsZSx0LCExLG4pfSxhdC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihlLHQsbixyKXtpZihufHwobj0wKSxyfHwwPT09cnx8KHI9dGhpcy5sZW5ndGgpLHQ+PWUubGVuZ3RoJiYodD1lLmxlbmd0aCksdHx8KHQ9MCkscj4wJiZyPG4mJihyPW4pLHI9PT1uKXJldHVybiAwO2lmKDA9PT1lLmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKG48MHx8bj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7cj50aGlzLmxlbmd0aCYmKHI9dGhpcy5sZW5ndGgpLGUubGVuZ3RoLXQ8ci1uJiYocj1lLmxlbmd0aC10K24pO3ZhciBpLG89ci1uO2lmKHRoaXM9PT1lJiZuPHQmJnQ8cilmb3IoaT1vLTE7aT49MDstLWkpZVtpK3RdPXRoaXNbaStuXTtlbHNlIGlmKG88MWUzfHwhYXQuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpZVtpK3RdPXRoaXNbaStuXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShuLG4rbyksdCk7cmV0dXJuIG99LGF0LnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0PyhyPXQsdD0wLG49dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgbiYmKHI9bixuPXRoaXMubGVuZ3RoKSwxPT09ZS5sZW5ndGgpe3ZhciBpPWUuY2hhckNvZGVBdCgwKTtpPDI1NiYmKGU9aSl9aWYodm9pZCAwIT09ciYmInN0cmluZyIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIHImJiFhdC5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrcil9ZWxzZSJudW1iZXIiPT10eXBlb2YgZSYmKGUmPTI1NSk7aWYodDwwfHx0aGlzLmxlbmd0aDx0fHx0aGlzLmxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPD10KXJldHVybiB0aGlzO3ZhciBvO2lmKHQ+Pj49MCxuPXZvaWQgMD09PW4/dGhpcy5sZW5ndGg6bj4+PjAsZXx8KGU9MCksIm51bWJlciI9PXR5cGVvZiBlKWZvcihvPXQ7bzxuOysrbyl0aGlzW29dPWU7ZWxzZXt2YXIgcz1mdChlKT9lOkJ0KG5ldyBhdChlLHIpLnRvU3RyaW5nKCkpLGE9cy5sZW5ndGg7Zm9yKG89MDtvPG4tdDsrK28pdGhpc1tvK3RdPXNbbyVhXX1yZXR1cm4gdGhpc307dmFyIHh0PS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIHF0KGUpe3JldHVybiBlPDE2PyIwIitlLnRvU3RyaW5nKDE2KTplLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBCdChlLHQpe3ZhciBuO3Q9dHx8MS8wO2Zvcih2YXIgcj1lLmxlbmd0aCxpPW51bGwsbz1bXSxzPTA7czxyOysrcyl7aWYoKG49ZS5jaGFyQ29kZUF0KHMpKT41NTI5NSYmbjw1NzM0NCl7aWYoIWkpe2lmKG4+NTYzMTkpeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihzKzE9PT1yKXsodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT1uO2NvbnRpbnVlfWlmKG48NTYzMjApeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KSxpPW47Y29udGludWV9bj02NTUzNisoaS01NTI5Njw8MTB8bi01NjMyMCl9ZWxzZSBpJiYodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7aWYoaT1udWxsLG48MTI4KXtpZigodC09MSk8MClicmVhaztvLnB1c2gobil9ZWxzZSBpZihuPDIwNDgpe2lmKCh0LT0yKTwwKWJyZWFrO28ucHVzaChuPj42fDE5Miw2MyZufDEyOCl9ZWxzZSBpZihuPDY1NTM2KXtpZigodC09Myk8MClicmVhaztvLnB1c2gobj4+MTJ8MjI0LG4+PjYmNjN8MTI4LDYzJm58MTI4KX1lbHNle2lmKCEobjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKCh0LT00KTwwKWJyZWFrO28ucHVzaChuPj4xOHwyNDAsbj4+MTImNjN8MTI4LG4+PjYmNjN8MTI4LDYzJm58MTI4KX19cmV0dXJuIG99ZnVuY3Rpb24gRnQoZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8scztYZXx8JGUoKTt2YXIgYT1lLmxlbmd0aDtpZihhJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTtvPSI9Ij09PWVbYS0yXT8yOiI9Ij09PWVbYS0xXT8xOjAscz1uZXcgR2UoMyphLzQtbykscj1vPjA/YS00OmE7dmFyIGM9MDtmb3IodD0wLG49MDt0PHI7dCs9NCxuKz0zKWk9WWVbZS5jaGFyQ29kZUF0KHQpXTw8MTh8WWVbZS5jaGFyQ29kZUF0KHQrMSldPDwxMnxZZVtlLmNoYXJDb2RlQXQodCsyKV08PDZ8WWVbZS5jaGFyQ29kZUF0KHQrMyldLHNbYysrXT1pPj4xNiYyNTUsc1tjKytdPWk+PjgmMjU1LHNbYysrXT0yNTUmaTtyZXR1cm4gMj09PW8/KGk9WWVbZS5jaGFyQ29kZUF0KHQpXTw8MnxZZVtlLmNoYXJDb2RlQXQodCsxKV0+PjQsc1tjKytdPTI1NSZpKToxPT09byYmKGk9WWVbZS5jaGFyQ29kZUF0KHQpXTw8MTB8WWVbZS5jaGFyQ29kZUF0KHQrMSldPDw0fFllW2UuY2hhckNvZGVBdCh0KzIpXT4+MixzW2MrK109aT4+OCYyNTUsc1tjKytdPTI1NSZpKSxzfShmdW5jdGlvbihlKXtpZigoZT1mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfShlKS5yZXBsYWNlKHh0LCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDtlLmxlbmd0aCU0IT0wOyllKz0iPSI7cmV0dXJuIGV9KGUpKX1mdW5jdGlvbiBLdChlLHQsbixyKXtmb3IodmFyIGk9MDtpPHImJiEoaStuPj10Lmxlbmd0aHx8aT49ZS5sZW5ndGgpOysraSl0W2krbl09ZVtpXTtyZXR1cm4gaX1mdW5jdGlvbiBKdChlKXtyZXR1cm4gbnVsbCE9ZSYmKCEhZS5faXNCdWZmZXJ8fFd0KGUpfHxmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZS5yZWFkRmxvYXRMRSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc2xpY2UmJld0KGUuc2xpY2UoMCwwKSl9KGUpKX1mdW5jdGlvbiBXdChlKXtyZXR1cm4hIWUuY29uc3RydWN0b3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfXZhciB6dD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxCdWZmZXI6YXQsSU5TUEVDVF9NQVhfQllURVM6NTAsU2xvd0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4rZSE9ZSYmKGU9MCksYXQuYWxsb2MoK2UpfSxpc0J1ZmZlcjpKdCxrTWF4TGVuZ3RoOml0fSk7Y2xhc3MgVnQgZXh0ZW5kcyBFcnJvcntzdGF0aWMgZnJvbShlLHQsbixyLGksbyl7Y29uc3Qgcz1uZXcgVnQoZS5tZXNzYWdlLHR8fGUuY29kZSxuLHIsaSk7cmV0dXJuIHMuY2F1c2U9ZSxzLm5hbWU9ZS5uYW1lLG51bGwhPWUuc3RhdHVzJiZudWxsPT1zLnN0YXR1cyYmKHMuc3RhdHVzPWUuc3RhdHVzKSxvJiZPYmplY3QuYXNzaWduKHMsbyksc31jb25zdHJ1Y3RvcihlLHQsbixyLGkpe3N1cGVyKGUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJtZXNzYWdlIix7dmFsdWU6ZSxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHRoaXMubmFtZT0iQXhpb3NFcnJvciIsdGhpcy5pc0F4aW9zRXJyb3I9ITAsdCYmKHRoaXMuY29kZT10KSxuJiYodGhpcy5jb25maWc9biksciYmKHRoaXMucmVxdWVzdD1yKSxpJiYodGhpcy5yZXNwb25zZT1pLHRoaXMuc3RhdHVzPWkuc3RhdHVzKX10b0pTT04oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6emUudG9KU09OT2JqZWN0KHRoaXMuY29uZmlnKSxjb2RlOnRoaXMuY29kZSxzdGF0dXM6dGhpcy5zdGF0dXN9fX1WdC5FUlJfQkFEX09QVElPTl9WQUxVRT0iRVJSX0JBRF9PUFRJT05fVkFMVUUiLFZ0LkVSUl9CQURfT1BUSU9OPSJFUlJfQkFEX09QVElPTiIsVnQuRUNPTk5BQk9SVEVEPSJFQ09OTkFCT1JURUQiLFZ0LkVUSU1FRE9VVD0iRVRJTUVET1VUIixWdC5FUlJfTkVUV09SSz0iRVJSX05FVFdPUksiLFZ0LkVSUl9GUl9UT09fTUFOWV9SRURJUkVDVFM9IkVSUl9GUl9UT09fTUFOWV9SRURJUkVDVFMiLFZ0LkVSUl9ERVBSRUNBVEVEPSJFUlJfREVQUkVDQVRFRCIsVnQuRVJSX0JBRF9SRVNQT05TRT0iRVJSX0JBRF9SRVNQT05TRSIsVnQuRVJSX0JBRF9SRVFVRVNUPSJFUlJfQkFEX1JFUVVFU1QiLFZ0LkVSUl9DQU5DRUxFRD0iRVJSX0NBTkNFTEVEIixWdC5FUlJfTk9UX1NVUFBPUlQ9IkVSUl9OT1RfU1VQUE9SVCIsVnQuRVJSX0lOVkFMSURfVVJMPSJFUlJfSU5WQUxJRF9VUkwiO3ZhciBZdD1WdDtmdW5jdGlvbiBHdChlKXtyZXR1cm4gemUuaXNQbGFpbk9iamVjdChlKXx8emUuaXNBcnJheShlKX1mdW5jdGlvbiBYdChlKXtyZXR1cm4gemUuZW5kc1dpdGgoZSwiW10iKT9lLnNsaWNlKDAsLTIpOmV9ZnVuY3Rpb24gJHQoZSx0LG4pe3JldHVybiBlP2UuY29uY2F0KHQpLm1hcCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1YdChlKSwhbiYmdD8iWyIrZSsiXSI6ZX0pKS5qb2luKG4/Ii4iOiIiKTp0fWNvbnN0IFp0PXplLnRvRmxhdE9iamVjdCh6ZSx7fSxudWxsLChmdW5jdGlvbihlKXtyZXR1cm4vXmlzW0EtWl0vLnRlc3QoZSl9KSk7ZnVuY3Rpb24gUXQoZSx0LG4pe2lmKCF6ZS5pc09iamVjdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3QiKTt0PXR8fG5ldyBGb3JtRGF0YTtjb25zdCByPShuPXplLnRvRmxhdE9iamVjdChuLHttZXRhVG9rZW5zOiEwLGRvdHM6ITEsaW5kZXhlczohMX0sITEsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIXplLmlzVW5kZWZpbmVkKHRbZV0pfSkpKS5tZXRhVG9rZW5zLGk9bi52aXNpdG9yfHx1LG89bi5kb3RzLHM9bi5pbmRleGVzLGE9KG4uQmxvYnx8InVuZGVmaW5lZCIhPXR5cGVvZiBCbG9iJiZCbG9iKSYmemUuaXNTcGVjQ29tcGxpYW50Rm9ybSh0KTtpZighemUuaXNGdW5jdGlvbihpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ2aXNpdG9yIG11c3QgYmUgYSBmdW5jdGlvbiIpO2Z1bmN0aW9uIGMoZSl7aWYobnVsbD09PWUpcmV0dXJuIiI7aWYoemUuaXNEYXRlKGUpKXJldHVybiBlLnRvSVNPU3RyaW5nKCk7aWYoemUuaXNCb29sZWFuKGUpKXJldHVybiBlLnRvU3RyaW5nKCk7aWYoIWEmJnplLmlzQmxvYihlKSl0aHJvdyBuZXcgWXQoIkJsb2IgaXMgbm90IHN1cHBvcnRlZC4gVXNlIGEgQnVmZmVyIGluc3RlYWQuIik7cmV0dXJuIHplLmlzQXJyYXlCdWZmZXIoZSl8fHplLmlzVHlwZWRBcnJheShlKT9hJiYiZnVuY3Rpb24iPT10eXBlb2YgQmxvYj9uZXcgQmxvYihbZV0pOmF0LmZyb20oZSk6ZX1mdW5jdGlvbiB1KGUsbixpKXtsZXQgYT1lO2lmKHplLmlzUmVhY3ROYXRpdmUodCkmJnplLmlzUmVhY3ROYXRpdmVCbG9iKGUpKXJldHVybiB0LmFwcGVuZCgkdChpLG4sbyksYyhlKSksITE7aWYoZSYmIWkmJiJvYmplY3QiPT10eXBlb2YgZSlpZih6ZS5lbmRzV2l0aChuLCJ7fSIpKW49cj9uOm4uc2xpY2UoMCwtMiksZT1KU09OLnN0cmluZ2lmeShlKTtlbHNlIGlmKHplLmlzQXJyYXkoZSkmJmZ1bmN0aW9uKGUpe3JldHVybiB6ZS5pc0FycmF5KGUpJiYhZS5zb21lKEd0KX0oZSl8fCh6ZS5pc0ZpbGVMaXN0KGUpfHx6ZS5lbmRzV2l0aChuLCJbXSIpKSYmKGE9emUudG9BcnJheShlKSkpcmV0dXJuIG49WHQobiksYS5mb3JFYWNoKChmdW5jdGlvbihlLHIpeyF6ZS5pc1VuZGVmaW5lZChlKSYmbnVsbCE9PWUmJnQuYXBwZW5kKCEwPT09cz8kdChbbl0scixvKTpudWxsPT09cz9uOm4rIltdIixjKGUpKX0pKSwhMTtyZXR1cm4hIUd0KGUpfHwodC5hcHBlbmQoJHQoaSxuLG8pLGMoZSkpLCExKX1jb25zdCBsPVtdLGQ9T2JqZWN0LmFzc2lnbihadCx7ZGVmYXVsdFZpc2l0b3I6dSxjb252ZXJ0VmFsdWU6Yyxpc1Zpc2l0YWJsZTpHdH0pO2lmKCF6ZS5pc09iamVjdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIG11c3QgYmUgYW4gb2JqZWN0Iik7cmV0dXJuIGZ1bmN0aW9uIGUobixyKXtpZighemUuaXNVbmRlZmluZWQobikpe2lmKC0xIT09bC5pbmRleE9mKG4pKXRocm93IEVycm9yKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gIityLmpvaW4oIi4iKSk7bC5wdXNoKG4pLHplLmZvckVhY2gobiwoZnVuY3Rpb24obixvKXshMD09PSghKHplLmlzVW5kZWZpbmVkKG4pfHxudWxsPT09bikmJmkuY2FsbCh0LG4semUuaXNTdHJpbmcobyk/by50cmltKCk6byxyLGQpKSYmZShuLHI/ci5jb25jYXQobyk6W29dKX0pKSxsLnBvcCgpfX0oZSksdH1mdW5jdGlvbiBlbihlKXtjb25zdCB0PXsiISI6IiUyMSIsIiciOiIlMjciLCIoIjoiJTI4IiwiKSI6IiUyOSIsIn4iOiIlN0UiLCIlMjAiOiIrIiwiJTAwIjoiXDAifTtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpLnJlcGxhY2UoL1shJygpfl18JTIwfCUwMC9nLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX1mdW5jdGlvbiB0bihlLHQpe3RoaXMuX3BhaXJzPVtdLGUmJlF0KGUsdGhpcyx0KX1jb25zdCBubj10bi5wcm90b3R5cGU7ZnVuY3Rpb24gcm4oZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIil9ZnVuY3Rpb24gb24oZSx0LG4pe2lmKCF0KXJldHVybiBlO2NvbnN0IHI9biYmbi5lbmNvZGV8fHJuLGk9emUuaXNGdW5jdGlvbihuKT97c2VyaWFsaXplOm59Om4sbz1pJiZpLnNlcmlhbGl6ZTtsZXQgcztpZihzPW8/byh0LGkpOnplLmlzVVJMU2VhcmNoUGFyYW1zKHQpP3QudG9TdHJpbmcoKTpuZXcgdG4odCxpKS50b1N0cmluZyhyKSxzKXtjb25zdCB0PWUuaW5kZXhPZigiIyIpOy0xIT09dCYmKGU9ZS5zbGljZSgwLHQpKSxlKz0oLTE9PT1lLmluZGV4T2YoIj8iKT8iPyI6IiYiKStzfXJldHVybiBlfW5uLmFwcGVuZD1mdW5jdGlvbihlLHQpe3RoaXMuX3BhaXJzLnB1c2goW2UsdF0pfSxubi50b1N0cmluZz1mdW5jdGlvbihlKXtjb25zdCB0PWU/ZnVuY3Rpb24odCl7cmV0dXJuIGUuY2FsbCh0aGlzLHQsZW4pfTplbjtyZXR1cm4gdGhpcy5fcGFpcnMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdChlWzBdKSsiPSIrdChlWzFdKX0pLCIiKS5qb2luKCImIil9O3ZhciBzbj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuaGFuZGxlcnM9W119dXNlKGUsdCxuKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0LHN5bmNocm9ub3VzOiEhbiYmbi5zeW5jaHJvbm91cyxydW5XaGVuOm4/bi5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfWVqZWN0KGUpe3RoaXMuaGFuZGxlcnNbZV0mJih0aGlzLmhhbmRsZXJzW2VdPW51bGwpfWNsZWFyKCl7dGhpcy5oYW5kbGVycyYmKHRoaXMuaGFuZGxlcnM9W10pfWZvckVhY2goZSl7emUuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLChmdW5jdGlvbih0KXtudWxsIT09dCYmZSh0KX0pKX19LGFuPXtzaWxlbnRKU09OUGFyc2luZzohMCxmb3JjZWRKU09OUGFyc2luZzohMCxjbGFyaWZ5VGltZW91dEVycm9yOiExLGxlZ2FjeUludGVyY2VwdG9yUmVxUmVzT3JkZXJpbmc6ITB9LGNuPXtpc0Jyb3dzZXI6ITAsY2xhc3Nlczp7VVJMU2VhcmNoUGFyYW1zOiJ1bmRlZmluZWQiIT10eXBlb2YgVVJMU2VhcmNoUGFyYW1zP1VSTFNlYXJjaFBhcmFtczp0bixGb3JtRGF0YToidW5kZWZpbmVkIiE9dHlwZW9mIEZvcm1EYXRhP0Zvcm1EYXRhOm51bGwsQmxvYjoidW5kZWZpbmVkIiE9dHlwZW9mIEJsb2I/QmxvYjpudWxsfSxwcm90b2NvbHM6WyJodHRwIiwiaHR0cHMiLCJmaWxlIiwiYmxvYiIsInVybCIsImRhdGEiXX07Y29uc3QgdW49InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQsbG49Im9iamVjdCI9PXR5cGVvZiBuYXZpZ2F0b3ImJm5hdmlnYXRvcnx8dm9pZCAwLGRuPXVuJiYoIWxufHxbIlJlYWN0TmF0aXZlIiwiTmF0aXZlU2NyaXB0IiwiTlMiXS5pbmRleE9mKGxuLnByb2R1Y3QpPDApLGhuPSJ1bmRlZmluZWQiIT10eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUmJnNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSYmImZ1bmN0aW9uIj09dHlwZW9mIHNlbGYuaW1wb3J0U2NyaXB0cyxmbj11biYmd2luZG93LmxvY2F0aW9uLmhyZWZ8fCJodHRwOi8vbG9jYWxob3N0Ijt2YXIgcG49ey4uLk9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGhhc0Jyb3dzZXJFbnY6dW4saGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52OmhuLGhhc1N0YW5kYXJkQnJvd3NlckVudjpkbixuYXZpZ2F0b3I6bG4sb3JpZ2luOmZufSksLi4uY259O2Z1bmN0aW9uIGduKGUpe2Z1bmN0aW9uIHQoZSxuLHIsaSl7bGV0IG89ZVtpKytdO2lmKCJfX3Byb3RvX18iPT09bylyZXR1cm4hMDtjb25zdCBzPU51bWJlci5pc0Zpbml0ZSgrbyksYT1pPj1lLmxlbmd0aDtpZihvPSFvJiZ6ZS5pc0FycmF5KHIpP3IubGVuZ3RoOm8sYSlyZXR1cm4gemUuaGFzT3duUHJvcChyLG8pP3Jbb109W3Jbb10sbl06cltvXT1uLCFzO3Jbb10mJnplLmlzT2JqZWN0KHJbb10pfHwocltvXT1bXSk7cmV0dXJuIHQoZSxuLHJbb10saSkmJnplLmlzQXJyYXkocltvXSkmJihyW29dPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9e30sbj1PYmplY3Qua2V5cyhlKTtsZXQgcjtjb25zdCBpPW4ubGVuZ3RoO2xldCBvO2ZvcihyPTA7cjxpO3IrKylvPW5bcl0sdFtvXT1lW29dO3JldHVybiB0fShyW29dKSksIXN9aWYoemUuaXNGb3JtRGF0YShlKSYmemUuaXNGdW5jdGlvbihlLmVudHJpZXMpKXtjb25zdCBuPXt9O3JldHVybiB6ZS5mb3JFYWNoRW50cnkoZSwoKGUscik9Pnt0KGZ1bmN0aW9uKGUpe3JldHVybiB6ZS5tYXRjaEFsbCgvXHcrfFxbKFx3KildL2csZSkubWFwKChlPT4iW10iPT09ZVswXT8iIjplWzFdfHxlWzBdKSl9KGUpLHIsbiwwKX0pKSxufXJldHVybiBudWxsfWNvbnN0IHluPXt0cmFuc2l0aW9uYWw6YW4sYWRhcHRlcjpbInhociIsImh0dHAiLCJmZXRjaCJdLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7Y29uc3Qgbj10LmdldENvbnRlbnRUeXBlKCl8fCIiLHI9bi5pbmRleE9mKCJhcHBsaWNhdGlvbi9qc29uIik+LTEsaT16ZS5pc09iamVjdChlKTtpJiZ6ZS5pc0hUTUxGb3JtKGUpJiYoZT1uZXcgRm9ybURhdGEoZSkpO2lmKHplLmlzRm9ybURhdGEoZSkpcmV0dXJuIHI/SlNPTi5zdHJpbmdpZnkoZ24oZSkpOmU7aWYoemUuaXNBcnJheUJ1ZmZlcihlKXx8emUuaXNCdWZmZXIoZSl8fHplLmlzU3RyZWFtKGUpfHx6ZS5pc0ZpbGUoZSl8fHplLmlzQmxvYihlKXx8emUuaXNSZWFkYWJsZVN0cmVhbShlKSlyZXR1cm4gZTtpZih6ZS5pc0FycmF5QnVmZmVyVmlldyhlKSlyZXR1cm4gZS5idWZmZXI7aWYoemUuaXNVUkxTZWFyY2hQYXJhbXMoZSkpcmV0dXJuIHQuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiwhMSksZS50b1N0cmluZygpO2xldCBvO2lmKGkpe2lmKG4uaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik+LTEpcmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFF0KGUsbmV3IHBuLmNsYXNzZXMuVVJMU2VhcmNoUGFyYW1zLHt2aXNpdG9yOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBwbi5pc05vZGUmJnplLmlzQnVmZmVyKGUpPyh0aGlzLmFwcGVuZCh0LGUudG9TdHJpbmcoImJhc2U2NCIpKSwhMSk6ci5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LC4uLnR9KX0oZSx0aGlzLmZvcm1TZXJpYWxpemVyKS50b1N0cmluZygpO2lmKChvPXplLmlzRmlsZUxpc3QoZSkpfHxuLmluZGV4T2YoIm11bHRpcGFydC9mb3JtLWRhdGEiKT4tMSl7Y29uc3QgdD10aGlzLmVudiYmdGhpcy5lbnYuRm9ybURhdGE7cmV0dXJuIFF0KG8/eyJmaWxlc1tdIjplfTplLHQmJm5ldyB0LHRoaXMuZm9ybVNlcmlhbGl6ZXIpfX1yZXR1cm4gaXx8cj8odC5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vanNvbiIsITEpLGZ1bmN0aW9uKGUsdCxuKXtpZih6ZS5pc1N0cmluZyhlKSl0cnl7cmV0dXJuKHR8fEpTT04ucGFyc2UpKGUpLHplLnRyaW0oZSl9Y2F0Y2goZSl7aWYoIlN5bnRheEVycm9yIiE9PWUubmFtZSl0aHJvdyBlfXJldHVybihufHxKU09OLnN0cmluZ2lmeSkoZSl9KGUpKTplfV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKGUpe2NvbnN0IHQ9dGhpcy50cmFuc2l0aW9uYWx8fHluLnRyYW5zaXRpb25hbCxuPXQmJnQuZm9yY2VkSlNPTlBhcnNpbmcscj0ianNvbiI9PT10aGlzLnJlc3BvbnNlVHlwZTtpZih6ZS5pc1Jlc3BvbnNlKGUpfHx6ZS5pc1JlYWRhYmxlU3RyZWFtKGUpKXJldHVybiBlO2lmKGUmJnplLmlzU3RyaW5nKGUpJiYobiYmIXRoaXMucmVzcG9uc2VUeXBlfHxyKSl7Y29uc3Qgbj0hKHQmJnQuc2lsZW50SlNPTlBhcnNpbmcpJiZyO3RyeXtyZXR1cm4gSlNPTi5wYXJzZShlLHRoaXMucGFyc2VSZXZpdmVyKX1jYXRjaChlKXtpZihuKXtpZigiU3ludGF4RXJyb3IiPT09ZS5uYW1lKXRocm93IFl0LmZyb20oZSxZdC5FUlJfQkFEX1JFU1BPTlNFLHRoaXMsbnVsbCx0aGlzLnJlc3BvbnNlKTt0aHJvdyBlfX19cmV0dXJuIGV9XSx0aW1lb3V0OjAseHNyZkNvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLHhzcmZIZWFkZXJOYW1lOiJYLVhTUkYtVE9LRU4iLG1heENvbnRlbnRMZW5ndGg6LTEsbWF4Qm9keUxlbmd0aDotMSxlbnY6e0Zvcm1EYXRhOnBuLmNsYXNzZXMuRm9ybURhdGEsQmxvYjpwbi5jbGFzc2VzLkJsb2J9LHZhbGlkYXRlU3RhdHVzOmZ1bmN0aW9uKGUpe3JldHVybiBlPj0yMDAmJmU8MzAwfSxoZWFkZXJzOntjb21tb246e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIiwiQ29udGVudC1UeXBlIjp2b2lkIDB9fX07emUuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giXSwoZT0+e3luLmhlYWRlcnNbZV09e319KSk7dmFyIHZuPXluO2NvbnN0IG1uPXplLnRvT2JqZWN0U2V0KFsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il0pO2NvbnN0IHduPVN5bWJvbCgiaW50ZXJuYWxzIik7ZnVuY3Rpb24gYm4oZSl7cmV0dXJuIGUmJlN0cmluZyhlKS50cmltKCkudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBfbihlKXtyZXR1cm4hMT09PWV8fG51bGw9PWU/ZTp6ZS5pc0FycmF5KGUpP2UubWFwKF9uKTpTdHJpbmcoZSl9ZnVuY3Rpb24gU24oZSx0LG4scixpKXtyZXR1cm4gemUuaXNGdW5jdGlvbihyKT9yLmNhbGwodGhpcyx0LG4pOihpJiYodD1uKSx6ZS5pc1N0cmluZyh0KT96ZS5pc1N0cmluZyhyKT8tMSE9PXQuaW5kZXhPZihyKTp6ZS5pc1JlZ0V4cChyKT9yLnRlc3QodCk6dm9pZCAwOnZvaWQgMCl9Y2xhc3MgRW57Y29uc3RydWN0b3IoZSl7ZSYmdGhpcy5zZXQoZSl9c2V0KGUsdCxuKXtjb25zdCByPXRoaXM7ZnVuY3Rpb24gaShlLHQsbil7Y29uc3QgaT1ibih0KTtpZighaSl0aHJvdyBuZXcgRXJyb3IoImhlYWRlciBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIik7Y29uc3Qgbz16ZS5maW5kS2V5KHIsaSk7KCFvfHx2b2lkIDA9PT1yW29dfHwhMD09PW58fHZvaWQgMD09PW4mJiExIT09cltvXSkmJihyW298fHRdPV9uKGUpKX1jb25zdCBvPShlLHQpPT56ZS5mb3JFYWNoKGUsKChlLG4pPT5pKGUsbix0KSkpO2lmKHplLmlzUGxhaW5PYmplY3QoZSl8fGUgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKW8oZSx0KTtlbHNlIGlmKHplLmlzU3RyaW5nKGUpJiYoZT1lLnRyaW0oKSkmJiEvXlstX2EtekEtWjAtOV5gfH4sISMkJSYnKisuXSskLy50ZXN0KGUudHJpbSgpKSlvKChlPT57Y29uc3QgdD17fTtsZXQgbixyLGk7cmV0dXJuIGUmJmUuc3BsaXQoIlxuIikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aT1lLmluZGV4T2YoIjoiKSxuPWUuc3Vic3RyaW5nKDAsaSkudHJpbSgpLnRvTG93ZXJDYXNlKCkscj1lLnN1YnN0cmluZyhpKzEpLnRyaW0oKSwhbnx8dFtuXSYmbW5bbl18fCgic2V0LWNvb2tpZSI9PT1uP3Rbbl0/dFtuXS5wdXNoKHIpOnRbbl09W3JdOnRbbl09dFtuXT90W25dKyIsICIrcjpyKX0pKSx0fSkoZSksdCk7ZWxzZSBpZih6ZS5pc09iamVjdChlKSYmemUuaXNJdGVyYWJsZShlKSl7bGV0IG4scixpPXt9O2Zvcihjb25zdCB0IG9mIGUpe2lmKCF6ZS5pc0FycmF5KHQpKXRocm93IFR5cGVFcnJvcigiT2JqZWN0IGl0ZXJhdG9yIG11c3QgcmV0dXJuIGEga2V5LXZhbHVlIHBhaXIiKTtpW3I9dFswXV09KG49aVtyXSk/emUuaXNBcnJheShuKT9bLi4ubix0WzFdXTpbbix0WzFdXTp0WzFdfW8oaSx0KX1lbHNlIG51bGwhPWUmJmkodCxlLG4pO3JldHVybiB0aGlzfWdldChlLHQpe2lmKGU9Ym4oZSkpe2NvbnN0IG49emUuZmluZEtleSh0aGlzLGUpO2lmKG4pe2NvbnN0IGU9dGhpc1tuXTtpZighdClyZXR1cm4gZTtpZighMD09PXQpcmV0dXJuIGZ1bmN0aW9uKGUpe2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKSxuPS8oW15ccyw7PV0rKVxzKig/Oj1ccyooW14sO10rKSk/L2c7bGV0IHI7Zm9yKDtyPW4uZXhlYyhlKTspdFtyWzFdXT1yWzJdO3JldHVybiB0fShlKTtpZih6ZS5pc0Z1bmN0aW9uKHQpKXJldHVybiB0LmNhbGwodGhpcyxlLG4pO2lmKHplLmlzUmVnRXhwKHQpKXJldHVybiB0LmV4ZWMoZSk7dGhyb3cgbmV3IFR5cGVFcnJvcigicGFyc2VyIG11c3QgYmUgYm9vbGVhbnxyZWdleHB8ZnVuY3Rpb24iKX19fWhhcyhlLHQpe2lmKGU9Ym4oZSkpe2NvbnN0IG49emUuZmluZEtleSh0aGlzLGUpO3JldHVybiEoIW58fHZvaWQgMD09PXRoaXNbbl18fHQmJiFTbigwLHRoaXNbbl0sbix0KSl9cmV0dXJuITF9ZGVsZXRlKGUsdCl7Y29uc3Qgbj10aGlzO2xldCByPSExO2Z1bmN0aW9uIGkoZSl7aWYoZT1ibihlKSl7Y29uc3QgaT16ZS5maW5kS2V5KG4sZSk7IWl8fHQmJiFTbigwLG5baV0saSx0KXx8KGRlbGV0ZSBuW2ldLHI9ITApfX1yZXR1cm4gemUuaXNBcnJheShlKT9lLmZvckVhY2goaSk6aShlKSxyfWNsZWFyKGUpe2NvbnN0IHQ9T2JqZWN0LmtleXModGhpcyk7bGV0IG49dC5sZW5ndGgscj0hMTtmb3IoO24tLTspe2NvbnN0IGk9dFtuXTtlJiYhU24oMCx0aGlzW2ldLGksZSwhMCl8fChkZWxldGUgdGhpc1tpXSxyPSEwKX1yZXR1cm4gcn1ub3JtYWxpemUoZSl7Y29uc3QgdD10aGlzLG49e307cmV0dXJuIHplLmZvckVhY2godGhpcywoKHIsaSk9Pntjb25zdCBvPXplLmZpbmRLZXkobixpKTtpZihvKXJldHVybiB0W29dPV9uKHIpLHZvaWQgZGVsZXRlIHRbaV07Y29uc3Qgcz1lP2Z1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyhbYS16XGRdKShcdyopL2csKChlLHQsbik9PnQudG9VcHBlckNhc2UoKStuKSl9KGkpOlN0cmluZyhpKS50cmltKCk7cyE9PWkmJmRlbGV0ZSB0W2ldLHRbc109X24ociksbltzXT0hMH0pKSx0aGlzfWNvbmNhdCgpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLmNvbmNhdCh0aGlzLC4uLnQpfXRvSlNPTihlKXtjb25zdCB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIHplLmZvckVhY2godGhpcywoKG4scik9PntudWxsIT1uJiYhMSE9PW4mJih0W3JdPWUmJnplLmlzQXJyYXkobik/bi5qb2luKCIsICIpOm4pfSkpLHR9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSlbU3ltYm9sLml0ZXJhdG9yXSgpfXRvU3RyaW5nKCl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpLm1hcCgoZT0+e2xldFt0LG5dPWU7cmV0dXJuIHQrIjogIitufSkpLmpvaW4oIlxuIil9Z2V0U2V0Q29va2llKCl7cmV0dXJuIHRoaXMuZ2V0KCJzZXQtY29va2llIil8fFtdfWdldFtTeW1ib2wudG9TdHJpbmdUYWddKCl7cmV0dXJuIkF4aW9zSGVhZGVycyJ9c3RhdGljIGZyb20oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiB0aGlzP2U6bmV3IHRoaXMoZSl9c3RhdGljIGNvbmNhdChlKXtjb25zdCB0PW5ldyB0aGlzKGUpO2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4+MT9uLTE6MCksaT0xO2k8bjtpKyspcltpLTFdPWFyZ3VtZW50c1tpXTtyZXR1cm4gci5mb3JFYWNoKChlPT50LnNldChlKSkpLHR9c3RhdGljIGFjY2Vzc29yKGUpe2NvbnN0IHQ9KHRoaXNbd25dPXRoaXNbd25dPXthY2Nlc3NvcnM6e319KS5hY2Nlc3NvcnMsbj10aGlzLnByb3RvdHlwZTtmdW5jdGlvbiByKGUpe2NvbnN0IHI9Ym4oZSk7dFtyXXx8KCFmdW5jdGlvbihlLHQpe2NvbnN0IG49emUudG9DYW1lbENhc2UoIiAiK3QpO1siZ2V0Iiwic2V0IiwiaGFzIl0uZm9yRWFjaCgocj0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIrbix7dmFsdWU6ZnVuY3Rpb24oZSxuLGkpe3JldHVybiB0aGlzW3JdLmNhbGwodGhpcyx0LGUsbixpKX0sY29uZmlndXJhYmxlOiEwfSl9KSl9KG4sZSksdFtyXT0hMCl9cmV0dXJuIHplLmlzQXJyYXkoZSk/ZS5mb3JFYWNoKHIpOnIoZSksdGhpc319RW4uYWNjZXNzb3IoWyJDb250ZW50LVR5cGUiLCJDb250ZW50LUxlbmd0aCIsIkFjY2VwdCIsIkFjY2VwdC1FbmNvZGluZyIsIlVzZXItQWdlbnQiLCJBdXRob3JpemF0aW9uIl0pLHplLnJlZHVjZURlc2NyaXB0b3JzKEVuLnByb3RvdHlwZSwoKGUsdCk9PntsZXR7dmFsdWU6bn09ZSxyPXRbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO3JldHVybntnZXQ6KCk9Pm4sc2V0KGUpe3RoaXNbcl09ZX19fSkpLHplLmZyZWV6ZU1ldGhvZHMoRW4pO3ZhciBSbj1FbjtmdW5jdGlvbiBUbihlLHQpe2NvbnN0IG49dGhpc3x8dm4scj10fHxuLGk9Um4uZnJvbShyLmhlYWRlcnMpO2xldCBvPXIuZGF0YTtyZXR1cm4gemUuZm9yRWFjaChlLChmdW5jdGlvbihlKXtvPWUuY2FsbChuLG8saS5ub3JtYWxpemUoKSx0P3Quc3RhdHVzOnZvaWQgMCl9KSksaS5ub3JtYWxpemUoKSxvfWZ1bmN0aW9uIGtuKGUpe3JldHVybiEoIWV8fCFlLl9fQ0FOQ0VMX18pfXZhciBBbj1jbGFzcyBleHRlbmRzIFl0e2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihudWxsPT1lPyJjYW5jZWxlZCI6ZSxZdC5FUlJfQ0FOQ0VMRUQsdCxuKSx0aGlzLm5hbWU9IkNhbmNlbGVkRXJyb3IiLHRoaXMuX19DQU5DRUxfXz0hMH19O2Z1bmN0aW9uIENuKGUsdCxuKXtjb25zdCByPW4uY29uZmlnLnZhbGlkYXRlU3RhdHVzO24uc3RhdHVzJiZyJiYhcihuLnN0YXR1cyk/dChuZXcgWXQoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIituLnN0YXR1cyxbWXQuRVJSX0JBRF9SRVFVRVNULFl0LkVSUl9CQURfUkVTUE9OU0VdW01hdGguZmxvb3Iobi5zdGF0dXMvMTAwKS00XSxuLmNvbmZpZyxuLnJlcXVlc3QsbikpOmUobil9ZnVuY3Rpb24gRG4oZSx0KXtlPWV8fDEwO2NvbnN0IG49bmV3IEFycmF5KGUpLHI9bmV3IEFycmF5KGUpO2xldCBpLG89MCxzPTA7cmV0dXJuIHQ9dm9pZCAwIT09dD90OjFlMyxmdW5jdGlvbihhKXtjb25zdCBjPURhdGUubm93KCksdT1yW3NdO2l8fChpPWMpLG5bb109YSxyW29dPWM7bGV0IGw9cyxkPTA7Zm9yKDtsIT09bzspZCs9bltsKytdLGwlPWU7aWYobz0obysxKSVlLG89PT1zJiYocz0ocysxKSVlKSxjLWk8dClyZXR1cm47Y29uc3QgaD11JiZjLXU7cmV0dXJuIGg/TWF0aC5yb3VuZCgxZTMqZC9oKTp2b2lkIDB9fWZ1bmN0aW9uIE9uKGUsdCl7bGV0IG4scixpPTAsbz0xZTMvdDtjb25zdCBzPWZ1bmN0aW9uKHQpe2xldCBvPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpEYXRlLm5vdygpO2k9byxuPW51bGwsciYmKGNsZWFyVGltZW91dChyKSxyPW51bGwpLGUoLi4udCl9O3JldHVybltmdW5jdGlvbigpe2NvbnN0IGU9RGF0ZS5ub3coKSx0PWUtaTtmb3IodmFyIGE9YXJndW1lbnRzLmxlbmd0aCxjPW5ldyBBcnJheShhKSx1PTA7dTxhO3UrKyljW3VdPWFyZ3VtZW50c1t1XTt0Pj1vP3MoYyxlKToobj1jLHJ8fChyPXNldFRpbWVvdXQoKCgpPT57cj1udWxsLHMobil9KSxvLXQpKSl9LCgpPT5uJiZzKG4pXX1jb25zdCBQbj1mdW5jdGlvbihlLHQpe2xldCBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTozLHI9MDtjb25zdCBpPURuKDUwLDI1MCk7cmV0dXJuIE9uKChuPT57Y29uc3Qgbz1uLmxvYWRlZCxzPW4ubGVuZ3RoQ29tcHV0YWJsZT9uLnRvdGFsOnZvaWQgMCxhPW8tcixjPWkoYSk7cj1vO2Uoe2xvYWRlZDpvLHRvdGFsOnMscHJvZ3Jlc3M6cz9vL3M6dm9pZCAwLGJ5dGVzOmEscmF0ZTpjfHx2b2lkIDAsZXN0aW1hdGVkOmMmJnMmJm88PXM/KHMtbykvYzp2b2lkIDAsZXZlbnQ6bixsZW5ndGhDb21wdXRhYmxlOm51bGwhPXMsW3Q/ImRvd25sb2FkIjoidXBsb2FkIl06ITB9KX0pLG4pfSxJbj0oZSx0KT0+e2NvbnN0IG49bnVsbCE9ZTtyZXR1cm5bcj0+dFswXSh7bGVuZ3RoQ29tcHV0YWJsZTpuLHRvdGFsOmUsbG9hZGVkOnJ9KSx0WzFdXX0sVW49ZT0+ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheSh0KSxyPTA7cjx0O3IrKyluW3JdPWFyZ3VtZW50c1tyXTtyZXR1cm4gemUuYXNhcCgoKCk9PmUoLi4ubikpKX07dmFyIExuPXBuLmhhc1N0YW5kYXJkQnJvd3NlckVudj8oKGUsdCk9Pm49PihuPW5ldyBVUkwobixwbi5vcmlnaW4pLGUucHJvdG9jb2w9PT1uLnByb3RvY29sJiZlLmhvc3Q9PT1uLmhvc3QmJih0fHxlLnBvcnQ9PT1uLnBvcnQpKSkobmV3IFVSTChwbi5vcmlnaW4pLHBuLm5hdmlnYXRvciYmLyhtc2llfHRyaWRlbnQpL2kudGVzdChwbi5uYXZpZ2F0b3IudXNlckFnZW50KSk6KCk9PiEwLEhuPXBuLmhhc1N0YW5kYXJkQnJvd3NlckVudj97d3JpdGUoZSx0LG4scixpLG8scyl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBkb2N1bWVudClyZXR1cm47Y29uc3QgYT1bIiIuY29uY2F0KGUsIj0iKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KHQpKV07emUuaXNOdW1iZXIobikmJmEucHVzaCgiZXhwaXJlcz0iLmNvbmNhdChuZXcgRGF0ZShuKS50b1VUQ1N0cmluZygpKSksemUuaXNTdHJpbmcocikmJmEucHVzaCgicGF0aD0iLmNvbmNhdChyKSksemUuaXNTdHJpbmcoaSkmJmEucHVzaCgiZG9tYWluPSIuY29uY2F0KGkpKSwhMD09PW8mJmEucHVzaCgic2VjdXJlIiksemUuaXNTdHJpbmcocykmJmEucHVzaCgiU2FtZVNpdGU9Ii5jb25jYXQocykpLGRvY3VtZW50LmNvb2tpZT1hLmpvaW4oIjsgIil9LHJlYWQoZSl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBkb2N1bWVudClyZXR1cm4gbnVsbDtjb25zdCB0PWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoPzpefDsgKSIrZSsiPShbXjtdKikiKSk7cmV0dXJuIHQ/ZGVjb2RlVVJJQ29tcG9uZW50KHRbMV0pOm51bGx9LHJlbW92ZShlKXt0aGlzLndyaXRlKGUsIiIsRGF0ZS5ub3coKS04NjRlNSwiLyIpfX06e3dyaXRlKCl7fSxyZWFkOigpPT5udWxsLHJlbW92ZSgpe319O2Z1bmN0aW9uIE1uKGUsdCxuKXtsZXQgcj0hKCJzdHJpbmciPT10eXBlb2YoaT10KSYmL14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChpKSk7dmFyIGk7cmV0dXJuIGUmJihyfHwwPT1uKT9mdW5jdGlvbihlLHQpe3JldHVybiB0P2UucmVwbGFjZSgvXC8/XC8kLywiIikrIi8iK3QucmVwbGFjZSgvXlwvKy8sIiIpOmV9KGUsdCk6dH1jb25zdCBObj1lPT5lIGluc3RhbmNlb2YgUm4/ey4uLmV9OmU7ZnVuY3Rpb24gam4oZSx0KXt0PXR8fHt9O2NvbnN0IG49e307ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gemUuaXNQbGFpbk9iamVjdChlKSYmemUuaXNQbGFpbk9iamVjdCh0KT96ZS5tZXJnZS5jYWxsKHtjYXNlbGVzczpyfSxlLHQpOnplLmlzUGxhaW5PYmplY3QodCk/emUubWVyZ2Uoe30sdCk6emUuaXNBcnJheSh0KT90LnNsaWNlKCk6dH1mdW5jdGlvbiBpKGUsdCxuLGkpe3JldHVybiB6ZS5pc1VuZGVmaW5lZCh0KT96ZS5pc1VuZGVmaW5lZChlKT92b2lkIDA6cih2b2lkIDAsZSwwLGkpOnIoZSx0LDAsaSl9ZnVuY3Rpb24gbyhlLHQpe2lmKCF6ZS5pc1VuZGVmaW5lZCh0KSlyZXR1cm4gcih2b2lkIDAsdCl9ZnVuY3Rpb24gcyhlLHQpe3JldHVybiB6ZS5pc1VuZGVmaW5lZCh0KT96ZS5pc1VuZGVmaW5lZChlKT92b2lkIDA6cih2b2lkIDAsZSk6cih2b2lkIDAsdCl9ZnVuY3Rpb24gYShuLGksbyl7cmV0dXJuIG8gaW4gdD9yKG4saSk6byBpbiBlP3Iodm9pZCAwLG4pOnZvaWQgMH1jb25zdCBjPXt1cmw6byxtZXRob2Q6byxkYXRhOm8sYmFzZVVSTDpzLHRyYW5zZm9ybVJlcXVlc3Q6cyx0cmFuc2Zvcm1SZXNwb25zZTpzLHBhcmFtc1NlcmlhbGl6ZXI6cyx0aW1lb3V0OnMsdGltZW91dE1lc3NhZ2U6cyx3aXRoQ3JlZGVudGlhbHM6cyx3aXRoWFNSRlRva2VuOnMsYWRhcHRlcjpzLHJlc3BvbnNlVHlwZTpzLHhzcmZDb29raWVOYW1lOnMseHNyZkhlYWRlck5hbWU6cyxvblVwbG9hZFByb2dyZXNzOnMsb25Eb3dubG9hZFByb2dyZXNzOnMsZGVjb21wcmVzczpzLG1heENvbnRlbnRMZW5ndGg6cyxtYXhCb2R5TGVuZ3RoOnMsYmVmb3JlUmVkaXJlY3Q6cyx0cmFuc3BvcnQ6cyxodHRwQWdlbnQ6cyxodHRwc0FnZW50OnMsY2FuY2VsVG9rZW46cyxzb2NrZXRQYXRoOnMscmVzcG9uc2VFbmNvZGluZzpzLHZhbGlkYXRlU3RhdHVzOmEsaGVhZGVyczooZSx0LG4pPT5pKE5uKGUpLE5uKHQpLDAsITApfTtyZXR1cm4gemUuZm9yRWFjaChPYmplY3Qua2V5cyh7Li4uZSwuLi50fSksKGZ1bmN0aW9uKHIpe2lmKCJfX3Byb3RvX18iPT09cnx8ImNvbnN0cnVjdG9yIj09PXJ8fCJwcm90b3R5cGUiPT09cilyZXR1cm47Y29uc3Qgbz16ZS5oYXNPd25Qcm9wKGMscik/Y1tyXTppLHM9byhlW3JdLHRbcl0scik7emUuaXNVbmRlZmluZWQocykmJm8hPT1hfHwobltyXT1zKX0pKSxufXZhciB4bj1lPT57Y29uc3QgdD1qbih7fSxlKTtsZXR7ZGF0YTpuLHdpdGhYU1JGVG9rZW46cix4c3JmSGVhZGVyTmFtZTppLHhzcmZDb29raWVOYW1lOm8saGVhZGVyczpzLGF1dGg6YX09dDtpZih0LmhlYWRlcnM9cz1Sbi5mcm9tKHMpLHQudXJsPW9uKE1uKHQuYmFzZVVSTCx0LnVybCx0LmFsbG93QWJzb2x1dGVVcmxzKSxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLGEmJnMuc2V0KCJBdXRob3JpemF0aW9uIiwiQmFzaWMgIitidG9hKChhLnVzZXJuYW1lfHwiIikrIjoiKyhhLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChhLnBhc3N3b3JkKSk6IiIpKSksemUuaXNGb3JtRGF0YShuKSlpZihwbi5oYXNTdGFuZGFyZEJyb3dzZXJFbnZ8fHBuLmhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudilzLnNldENvbnRlbnRUeXBlKHZvaWQgMCk7ZWxzZSBpZih6ZS5pc0Z1bmN0aW9uKG4uZ2V0SGVhZGVycykpe2NvbnN0IGU9bi5nZXRIZWFkZXJzKCksdD1bImNvbnRlbnQtdHlwZSIsImNvbnRlbnQtbGVuZ3RoIl07T2JqZWN0LmVudHJpZXMoZSkuZm9yRWFjaCgoZT0+e2xldFtuLHJdPWU7dC5pbmNsdWRlcyhuLnRvTG93ZXJDYXNlKCkpJiZzLnNldChuLHIpfSkpfWlmKHBuLmhhc1N0YW5kYXJkQnJvd3NlckVudiYmKHImJnplLmlzRnVuY3Rpb24ocikmJihyPXIodCkpLHJ8fCExIT09ciYmTG4odC51cmwpKSl7Y29uc3QgZT1pJiZvJiZIbi5yZWFkKG8pO2UmJnMuc2V0KGksZSl9cmV0dXJuIHR9O3ZhciBxbj0idW5kZWZpbmVkIiE9dHlwZW9mIFhNTEh0dHBSZXF1ZXN0JiZmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsbil7Y29uc3Qgcj14bihlKTtsZXQgaT1yLmRhdGE7Y29uc3Qgbz1Sbi5mcm9tKHIuaGVhZGVycykubm9ybWFsaXplKCk7bGV0IHMsYSxjLHUsbCx7cmVzcG9uc2VUeXBlOmQsb25VcGxvYWRQcm9ncmVzczpoLG9uRG93bmxvYWRQcm9ncmVzczpmfT1yO2Z1bmN0aW9uIHAoKXt1JiZ1KCksbCYmbCgpLHIuY2FuY2VsVG9rZW4mJnIuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUocyksci5zaWduYWwmJnIuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixzKX1sZXQgZz1uZXcgWE1MSHR0cFJlcXVlc3Q7ZnVuY3Rpb24geSgpe2lmKCFnKXJldHVybjtjb25zdCByPVJuLmZyb20oImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiBnJiZnLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTtDbigoZnVuY3Rpb24oZSl7dChlKSxwKCl9KSwoZnVuY3Rpb24oZSl7bihlKSxwKCl9KSx7ZGF0YTpkJiYidGV4dCIhPT1kJiYianNvbiIhPT1kP2cucmVzcG9uc2U6Zy5yZXNwb25zZVRleHQsc3RhdHVzOmcuc3RhdHVzLHN0YXR1c1RleHQ6Zy5zdGF0dXNUZXh0LGhlYWRlcnM6cixjb25maWc6ZSxyZXF1ZXN0Omd9KSxnPW51bGx9Zy5vcGVuKHIubWV0aG9kLnRvVXBwZXJDYXNlKCksci51cmwsITApLGcudGltZW91dD1yLnRpbWVvdXQsIm9ubG9hZGVuZCJpbiBnP2cub25sb2FkZW5kPXk6Zy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtnJiY0PT09Zy5yZWFkeVN0YXRlJiYoMCE9PWcuc3RhdHVzfHxnLnJlc3BvbnNlVVJMJiYwPT09Zy5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpKSYmc2V0VGltZW91dCh5KX0sZy5vbmFib3J0PWZ1bmN0aW9uKCl7ZyYmKG4obmV3IFl0KCJSZXF1ZXN0IGFib3J0ZWQiLFl0LkVDT05OQUJPUlRFRCxlLGcpKSxnPW51bGwpfSxnLm9uZXJyb3I9ZnVuY3Rpb24odCl7Y29uc3Qgcj10JiZ0Lm1lc3NhZ2U/dC5tZXNzYWdlOiJOZXR3b3JrIEVycm9yIixpPW5ldyBZdChyLFl0LkVSUl9ORVRXT1JLLGUsZyk7aS5ldmVudD10fHxudWxsLG4oaSksZz1udWxsfSxnLm9udGltZW91dD1mdW5jdGlvbigpe2xldCB0PXIudGltZW91dD8idGltZW91dCBvZiAiK3IudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIjtjb25zdCBpPXIudHJhbnNpdGlvbmFsfHxhbjtyLnRpbWVvdXRFcnJvck1lc3NhZ2UmJih0PXIudGltZW91dEVycm9yTWVzc2FnZSksbihuZXcgWXQodCxpLmNsYXJpZnlUaW1lb3V0RXJyb3I/WXQuRVRJTUVET1VUOll0LkVDT05OQUJPUlRFRCxlLGcpKSxnPW51bGx9LHZvaWQgMD09PWkmJm8uc2V0Q29udGVudFR5cGUobnVsbCksInNldFJlcXVlc3RIZWFkZXIiaW4gZyYmemUuZm9yRWFjaChvLnRvSlNPTigpLChmdW5jdGlvbihlLHQpe2cuc2V0UmVxdWVzdEhlYWRlcih0LGUpfSkpLHplLmlzVW5kZWZpbmVkKHIud2l0aENyZWRlbnRpYWxzKXx8KGcud2l0aENyZWRlbnRpYWxzPSEhci53aXRoQ3JlZGVudGlhbHMpLGQmJiJqc29uIiE9PWQmJihnLnJlc3BvbnNlVHlwZT1yLnJlc3BvbnNlVHlwZSksZiYmKFtjLGxdPVBuKGYsITApLGcuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGMpKSxoJiZnLnVwbG9hZCYmKFthLHVdPVBuKGgpLGcudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixhKSxnLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJsb2FkZW5kIix1KSksKHIuY2FuY2VsVG9rZW58fHIuc2lnbmFsKSYmKHM9dD0+e2cmJihuKCF0fHx0LnR5cGU/bmV3IEFuKG51bGwsZSxnKTp0KSxnLmFib3J0KCksZz1udWxsKX0sci5jYW5jZWxUb2tlbiYmci5jYW5jZWxUb2tlbi5zdWJzY3JpYmUocyksci5zaWduYWwmJihyLnNpZ25hbC5hYm9ydGVkP3MoKTpyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIscykpKTtjb25zdCB2PWZ1bmN0aW9uKGUpe2NvbnN0IHQ9L14oWy0rXHddezEsMjV9KSg6P1wvXC98OikvLmV4ZWMoZSk7cmV0dXJuIHQmJnRbMV18fCIifShyLnVybCk7diYmLTE9PT1wbi5wcm90b2NvbHMuaW5kZXhPZih2KT9uKG5ldyBZdCgiVW5zdXBwb3J0ZWQgcHJvdG9jb2wgIit2KyI6IixZdC5FUlJfQkFEX1JFUVVFU1QsZSkpOmcuc2VuZChpfHxudWxsKX0pKX07dmFyIEJuPShlLHQpPT57Y29uc3R7bGVuZ3RoOm59PWU9ZT9lLmZpbHRlcihCb29sZWFuKTpbXTtpZih0fHxuKXtsZXQgbixyPW5ldyBBYm9ydENvbnRyb2xsZXI7Y29uc3QgaT1mdW5jdGlvbihlKXtpZighbil7bj0hMCxzKCk7Y29uc3QgdD1lIGluc3RhbmNlb2YgRXJyb3I/ZTp0aGlzLnJlYXNvbjtyLmFib3J0KHQgaW5zdGFuY2VvZiBZdD90Om5ldyBBbih0IGluc3RhbmNlb2YgRXJyb3I/dC5tZXNzYWdlOnQpKX19O2xldCBvPXQmJnNldFRpbWVvdXQoKCgpPT57bz1udWxsLGkobmV3IFl0KCJ0aW1lb3V0IG9mICIuY29uY2F0KHQsIm1zIGV4Y2VlZGVkIiksWXQuRVRJTUVET1VUKSl9KSx0KTtjb25zdCBzPSgpPT57ZSYmKG8mJmNsZWFyVGltZW91dChvKSxvPW51bGwsZS5mb3JFYWNoKChlPT57ZS51bnN1YnNjcmliZT9lLnVuc3Vic2NyaWJlKGkpOmUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGkpfSkpLGU9bnVsbCl9O2UuZm9yRWFjaCgoZT0+ZS5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsaSkpKTtjb25zdHtzaWduYWw6YX09cjtyZXR1cm4gYS51bnN1YnNjcmliZT0oKT0+emUuYXNhcChzKSxhfX07Y29uc3QgRm49ZnVuY3Rpb24qKGUsdCl7bGV0IG49ZS5ieXRlTGVuZ3RoO2lmKCF0fHxuPHQpcmV0dXJuIHZvaWQoeWllbGQgZSk7bGV0IHIsaT0wO2Zvcig7aTxuOylyPWkrdCx5aWVsZCBlLnNsaWNlKGksciksaT1yfSxLbj1hc3luYyBmdW5jdGlvbiooZSl7aWYoZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pcmV0dXJuIHZvaWQoeWllbGQqZSk7Y29uc3QgdD1lLmdldFJlYWRlcigpO3RyeXtmb3IoOzspe2NvbnN0e2RvbmU6ZSx2YWx1ZTpufT1hd2FpdCB0LnJlYWQoKTtpZihlKWJyZWFrO3lpZWxkIG59fWZpbmFsbHl7YXdhaXQgdC5jYW5jZWwoKX19LEpuPShlLHQsbixyKT0+e2NvbnN0IGk9YXN5bmMgZnVuY3Rpb24qKGUsdCl7Zm9yIGF3YWl0KGNvbnN0IG4gb2YgS24oZSkpeWllbGQqRm4obix0KX0oZSx0KTtsZXQgbyxzPTAsYT1lPT57b3x8KG89ITAsciYmcihlKSl9O3JldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe2FzeW5jIHB1bGwoZSl7dHJ5e2NvbnN0e2RvbmU6dCx2YWx1ZTpyfT1hd2FpdCBpLm5leHQoKTtpZih0KXJldHVybiBhKCksdm9pZCBlLmNsb3NlKCk7bGV0IG89ci5ieXRlTGVuZ3RoO2lmKG4pe2xldCBlPXMrPW87bihlKX1lLmVucXVldWUobmV3IFVpbnQ4QXJyYXkocikpfWNhdGNoKGUpe3Rocm93IGEoZSksZX19LGNhbmNlbDplPT4oYShlKSxpLnJldHVybigpKX0se2hpZ2hXYXRlck1hcms6Mn0pfSx7aXNGdW5jdGlvbjpXbn09emUsem49KGU9PntsZXR7UmVxdWVzdDp0LFJlc3BvbnNlOm59PWU7cmV0dXJue1JlcXVlc3Q6dCxSZXNwb25zZTpufX0pKHplLmdsb2JhbCkse1JlYWRhYmxlU3RyZWFtOlZuLFRleHRFbmNvZGVyOllufT16ZS5nbG9iYWwsR249ZnVuY3Rpb24oZSl7dHJ5e2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQ+MT90LTE6MCkscj0xO3I8dDtyKyspbltyLTFdPWFyZ3VtZW50c1tyXTtyZXR1cm4hIWUoLi4ubil9Y2F0Y2goZSl7cmV0dXJuITF9fSxYbj1lPT57ZT16ZS5tZXJnZS5jYWxsKHtza2lwVW5kZWZpbmVkOiEwfSx6bixlKTtjb25zdHtmZXRjaDp0LFJlcXVlc3Q6bixSZXNwb25zZTpyfT1lLGk9dD9Xbih0KToiZnVuY3Rpb24iPT10eXBlb2YgZmV0Y2gsbz1XbihuKSxzPVduKHIpO2lmKCFpKXJldHVybiExO2NvbnN0IGE9aSYmV24oVm4pLGM9aSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBZbj8oZT0+dD0+ZS5lbmNvZGUodCkpKG5ldyBZbik6YXN5bmMgZT0+bmV3IFVpbnQ4QXJyYXkoYXdhaXQgbmV3IG4oZSkuYXJyYXlCdWZmZXIoKSkpLHU9byYmYSYmR24oKCgpPT57bGV0IGU9ITE7Y29uc3QgdD1uZXcgbihwbi5vcmlnaW4se2JvZHk6bmV3IFZuLG1ldGhvZDoiUE9TVCIsZ2V0IGR1cGxleCgpe3JldHVybiBlPSEwLCJoYWxmIn19KS5oZWFkZXJzLmhhcygiQ29udGVudC1UeXBlIik7cmV0dXJuIGUmJiF0fSkpLGw9cyYmYSYmR24oKCgpPT56ZS5pc1JlYWRhYmxlU3RyZWFtKG5ldyByKCIiKS5ib2R5KSkpLGQ9e3N0cmVhbTpsJiYoZT0+ZS5ib2R5KX07aSYmWyJ0ZXh0IiwiYXJyYXlCdWZmZXIiLCJibG9iIiwiZm9ybURhdGEiLCJzdHJlYW0iXS5mb3JFYWNoKChlPT57IWRbZV0mJihkW2VdPSh0LG4pPT57bGV0IHI9dCYmdFtlXTtpZihyKXJldHVybiByLmNhbGwodCk7dGhyb3cgbmV3IFl0KCJSZXNwb25zZSB0eXBlICciLmNvbmNhdChlLCInIGlzIG5vdCBzdXBwb3J0ZWQiKSxZdC5FUlJfTk9UX1NVUFBPUlQsbil9KX0pKTtjb25zdCBoPWFzeW5jKGUsdCk9Pntjb25zdCByPXplLnRvRmluaXRlTnVtYmVyKGUuZ2V0Q29udGVudExlbmd0aCgpKTtyZXR1cm4gbnVsbD09cj8oYXN5bmMgZT0+e2lmKG51bGw9PWUpcmV0dXJuIDA7aWYoemUuaXNCbG9iKGUpKXJldHVybiBlLnNpemU7aWYoemUuaXNTcGVjQ29tcGxpYW50Rm9ybShlKSl7Y29uc3QgdD1uZXcgbihwbi5vcmlnaW4se21ldGhvZDoiUE9TVCIsYm9keTplfSk7cmV0dXJuKGF3YWl0IHQuYXJyYXlCdWZmZXIoKSkuYnl0ZUxlbmd0aH1yZXR1cm4gemUuaXNBcnJheUJ1ZmZlclZpZXcoZSl8fHplLmlzQXJyYXlCdWZmZXIoZSk/ZS5ieXRlTGVuZ3RoOih6ZS5pc1VSTFNlYXJjaFBhcmFtcyhlKSYmKGUrPSIiKSx6ZS5pc1N0cmluZyhlKT8oYXdhaXQgYyhlKSkuYnl0ZUxlbmd0aDp2b2lkIDApfSkodCk6cn07cmV0dXJuIGFzeW5jIGU9PntsZXR7dXJsOmksbWV0aG9kOnMsZGF0YTphLHNpZ25hbDpjLGNhbmNlbFRva2VuOmYsdGltZW91dDpwLG9uRG93bmxvYWRQcm9ncmVzczpnLG9uVXBsb2FkUHJvZ3Jlc3M6eSxyZXNwb25zZVR5cGU6dixoZWFkZXJzOm0sd2l0aENyZWRlbnRpYWxzOnc9InNhbWUtb3JpZ2luIixmZXRjaE9wdGlvbnM6Yn09eG4oZSksXz10fHxmZXRjaDt2PXY/KHYrIiIpLnRvTG93ZXJDYXNlKCk6InRleHQiO2xldCBTPUJuKFtjLGYmJmYudG9BYm9ydFNpZ25hbCgpXSxwKSxFPW51bGw7Y29uc3QgUj1TJiZTLnVuc3Vic2NyaWJlJiYoKCk9PntTLnVuc3Vic2NyaWJlKCl9KTtsZXQgVDt0cnl7aWYoeSYmdSYmImdldCIhPT1zJiYiaGVhZCIhPT1zJiYwIT09KFQ9YXdhaXQgaChtLGEpKSl7bGV0IGUsdD1uZXcgbihpLHttZXRob2Q6IlBPU1QiLGJvZHk6YSxkdXBsZXg6ImhhbGYifSk7aWYoemUuaXNGb3JtRGF0YShhKSYmKGU9dC5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIikpJiZtLnNldENvbnRlbnRUeXBlKGUpLHQuYm9keSl7Y29uc3RbZSxuXT1JbihULFBuKFVuKHkpKSk7YT1Kbih0LmJvZHksNjU1MzYsZSxuKX19emUuaXNTdHJpbmcodyl8fCh3PXc/ImluY2x1ZGUiOiJvbWl0Iik7Y29uc3QgdD1vJiYiY3JlZGVudGlhbHMiaW4gbi5wcm90b3R5cGUsYz17Li4uYixzaWduYWw6UyxtZXRob2Q6cy50b1VwcGVyQ2FzZSgpLGhlYWRlcnM6bS5ub3JtYWxpemUoKS50b0pTT04oKSxib2R5OmEsZHVwbGV4OiJoYWxmIixjcmVkZW50aWFsczp0P3c6dm9pZCAwfTtFPW8mJm5ldyBuKGksYyk7bGV0IGY9YXdhaXQobz9fKEUsYik6XyhpLGMpKTtjb25zdCBwPWwmJigic3RyZWFtIj09PXZ8fCJyZXNwb25zZSI9PT12KTtpZihsJiYoZ3x8cCYmUikpe2NvbnN0IGU9e307WyJzdGF0dXMiLCJzdGF0dXNUZXh0IiwiaGVhZGVycyJdLmZvckVhY2goKHQ9PntlW3RdPWZbdF19KSk7Y29uc3QgdD16ZS50b0Zpbml0ZU51bWJlcihmLmhlYWRlcnMuZ2V0KCJjb250ZW50LWxlbmd0aCIpKSxbbixpXT1nJiZJbih0LFBuKFVuKGcpLCEwKSl8fFtdO2Y9bmV3IHIoSm4oZi5ib2R5LDY1NTM2LG4sKCgpPT57aSYmaSgpLFImJlIoKX0pKSxlKX12PXZ8fCJ0ZXh0IjtsZXQgaz1hd2FpdCBkW3plLmZpbmRLZXkoZCx2KXx8InRleHQiXShmLGUpO3JldHVybiFwJiZSJiZSKCksYXdhaXQgbmV3IFByb21pc2UoKCh0LG4pPT57Q24odCxuLHtkYXRhOmssaGVhZGVyczpSbi5mcm9tKGYuaGVhZGVycyksc3RhdHVzOmYuc3RhdHVzLHN0YXR1c1RleHQ6Zi5zdGF0dXNUZXh0LGNvbmZpZzplLHJlcXVlc3Q6RX0pfSkpfWNhdGNoKHQpe2lmKFImJlIoKSx0JiYiVHlwZUVycm9yIj09PXQubmFtZSYmL0xvYWQgZmFpbGVkfGZldGNoL2kudGVzdCh0Lm1lc3NhZ2UpKXRocm93IE9iamVjdC5hc3NpZ24obmV3IFl0KCJOZXR3b3JrIEVycm9yIixZdC5FUlJfTkVUV09SSyxlLEUsdCYmdC5yZXNwb25zZSkse2NhdXNlOnQuY2F1c2V8fHR9KTt0aHJvdyBZdC5mcm9tKHQsdCYmdC5jb2RlLGUsRSx0JiZ0LnJlc3BvbnNlKX19fSwkbj1uZXcgTWFwLFpuPWU9PntsZXQgdD1lJiZlLmVudnx8e307Y29uc3R7ZmV0Y2g6bixSZXF1ZXN0OnIsUmVzcG9uc2U6aX09dCxvPVtyLGksbl07bGV0IHMsYSxjPW8ubGVuZ3RoLHU9JG47Zm9yKDtjLS07KXM9b1tjXSxhPXUuZ2V0KHMpLHZvaWQgMD09PWEmJnUuc2V0KHMsYT1jP25ldyBNYXA6WG4odCkpLHU9YTtyZXR1cm4gYX07Wm4oKTtjb25zdCBRbj17aHR0cDpudWxsLHhocjpxbixmZXRjaDp7Z2V0OlpufX07emUuZm9yRWFjaChRbiwoKGUsdCk9PntpZihlKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm5hbWUiLHt2YWx1ZTp0fSl9Y2F0Y2goZSl7fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJhZGFwdGVyTmFtZSIse3ZhbHVlOnR9KX19KSk7Y29uc3QgZXI9ZT0+Ii0gIi5jb25jYXQoZSksdHI9ZT0+emUuaXNGdW5jdGlvbihlKXx8bnVsbD09PWV8fCExPT09ZTt2YXIgbnI9e2dldEFkYXB0ZXI6ZnVuY3Rpb24oZSx0KXtlPXplLmlzQXJyYXkoZSk/ZTpbZV07Y29uc3R7bGVuZ3RoOm59PWU7bGV0IHIsaTtjb25zdCBvPXt9O2ZvcihsZXQgcz0wO3M8bjtzKyspe2xldCBuO2lmKHI9ZVtzXSxpPXIsIXRyKHIpJiYoaT1Rblsobj1TdHJpbmcocikpLnRvTG93ZXJDYXNlKCldLHZvaWQgMD09PWkpKXRocm93IG5ldyBZdCgiVW5rbm93biBhZGFwdGVyICciLmNvbmNhdChuLCInIikpO2lmKGkmJih6ZS5pc0Z1bmN0aW9uKGkpfHwoaT1pLmdldCh0KSkpKWJyZWFrO29bbnx8IiMiK3NdPWl9aWYoIWkpe2NvbnN0IGU9T2JqZWN0LmVudHJpZXMobykubWFwKChlPT57bGV0W3Qsbl09ZTtyZXR1cm4iYWRhcHRlciAiLmNvbmNhdCh0LCIgIikrKCExPT09bj8iaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZW52aXJvbm1lbnQiOiJpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBidWlsZCIpfSkpO2xldCB0PW4/ZS5sZW5ndGg+MT8ic2luY2UgOlxuIitlLm1hcChlcikuam9pbigiXG4iKToiICIrZXIoZVswXSk6ImFzIG5vIGFkYXB0ZXIgc3BlY2lmaWVkIjt0aHJvdyBuZXcgWXQoIlRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgIit0LCJFUlJfTk9UX1NVUFBPUlQiKX1yZXR1cm4gaX0sYWRhcHRlcnM6UW59O2Z1bmN0aW9uIHJyKGUpe2lmKGUuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpLGUuc2lnbmFsJiZlLnNpZ25hbC5hYm9ydGVkKXRocm93IG5ldyBBbihudWxsLGUpfWZ1bmN0aW9uIGlyKGUpe3JyKGUpLGUuaGVhZGVycz1Sbi5mcm9tKGUuaGVhZGVycyksZS5kYXRhPVRuLmNhbGwoZSxlLnRyYW5zZm9ybVJlcXVlc3QpLC0xIT09WyJwb3N0IiwicHV0IiwicGF0Y2giXS5pbmRleE9mKGUubWV0aG9kKSYmZS5oZWFkZXJzLnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLCExKTtyZXR1cm4gbnIuZ2V0QWRhcHRlcihlLmFkYXB0ZXJ8fHZuLmFkYXB0ZXIsZSkoZSkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHJyKGUpLHQuZGF0YT1Ubi5jYWxsKGUsZS50cmFuc2Zvcm1SZXNwb25zZSx0KSx0LmhlYWRlcnM9Um4uZnJvbSh0LmhlYWRlcnMpLHR9KSwoZnVuY3Rpb24odCl7cmV0dXJuIGtuKHQpfHwocnIoZSksdCYmdC5yZXNwb25zZSYmKHQucmVzcG9uc2UuZGF0YT1Ubi5jYWxsKGUsZS50cmFuc2Zvcm1SZXNwb25zZSx0LnJlc3BvbnNlKSx0LnJlc3BvbnNlLmhlYWRlcnM9Um4uZnJvbSh0LnJlc3BvbnNlLmhlYWRlcnMpKSksUHJvbWlzZS5yZWplY3QodCl9KSl9Y29uc3Qgb3I9IjEuMTMuNiIsc3I9e307WyJvYmplY3QiLCJib29sZWFuIiwibnVtYmVyIiwiZnVuY3Rpb24iLCJzdHJpbmciLCJzeW1ib2wiXS5mb3JFYWNoKCgoZSx0KT0+e3NyW2VdPWZ1bmN0aW9uKG4pe3JldHVybiB0eXBlb2Ygbj09PWV8fCJhIisodDwxPyJuICI6IiAiKStlfX0pKTtjb25zdCBhcj17fTtzci50cmFuc2l0aW9uYWw9ZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4iW0F4aW9zIHYxLjEzLjZdIFRyYW5zaXRpb25hbCBvcHRpb24gJyIrZSsiJyIrdCsobj8iLiAiK246IiIpfXJldHVybihuLGksbyk9PntpZighMT09PWUpdGhyb3cgbmV3IFl0KHIoaSwiIGhhcyBiZWVuIHJlbW92ZWQiKyh0PyIgaW4gIit0OiIiKSksWXQuRVJSX0RFUFJFQ0FURUQpO3JldHVybiB0JiYhYXJbaV0mJihhcltpXT0hMCxjb25zb2xlLndhcm4ocihpLCIgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2Iit0KyIgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUiKSkpLCFlfHxlKG4saSxvKX19LHNyLnNwZWxsaW5nPWZ1bmN0aW9uKGUpe3JldHVybih0LG4pPT4oY29uc29sZS53YXJuKCIiLmNvbmNhdChuLCIgaXMgbGlrZWx5IGEgbWlzc3BlbGxpbmcgb2YgIikuY29uY2F0KGUpKSwhMCl9O3ZhciBjcj17YXNzZXJ0T3B0aW9uczpmdW5jdGlvbihlLHQsbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBZdCgib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIsWXQuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2NvbnN0IHI9T2JqZWN0LmtleXMoZSk7bGV0IGk9ci5sZW5ndGg7Zm9yKDtpLS0gPjA7KXtjb25zdCBvPXJbaV0scz10W29dO2lmKHMpe2NvbnN0IHQ9ZVtvXSxuPXZvaWQgMD09PXR8fHModCxvLGUpO2lmKCEwIT09bil0aHJvdyBuZXcgWXQoIm9wdGlvbiAiK28rIiBtdXN0IGJlICIrbixZdC5FUlJfQkFEX09QVElPTl9WQUxVRSl9ZWxzZSBpZighMCE9PW4pdGhyb3cgbmV3IFl0KCJVbmtub3duIG9wdGlvbiAiK28sWXQuRVJSX0JBRF9PUFRJT04pfX0sdmFsaWRhdG9yczpzcn07Y29uc3QgdXI9Y3IudmFsaWRhdG9ycztjbGFzcyBscntjb25zdHJ1Y3RvcihlKXt0aGlzLmRlZmF1bHRzPWV8fHt9LHRoaXMuaW50ZXJjZXB0b3JzPXtyZXF1ZXN0Om5ldyBzbixyZXNwb25zZTpuZXcgc259fWFzeW5jIHJlcXVlc3QoZSx0KXt0cnl7cmV0dXJuIGF3YWl0IHRoaXMuX3JlcXVlc3QoZSx0KX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgRXJyb3Ipe2xldCB0PXt9O0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKHQpOnQ9bmV3IEVycm9yO2NvbnN0IG49dC5zdGFjaz90LnN0YWNrLnJlcGxhY2UoL14uK1xuLywiIik6IiI7dHJ5e2Uuc3RhY2s/biYmIVN0cmluZyhlLnN0YWNrKS5lbmRzV2l0aChuLnJlcGxhY2UoL14uK1xuLitcbi8sIiIpKSYmKGUuc3RhY2srPSJcbiIrbik6ZS5zdGFjaz1ufWNhdGNoKGUpe319dGhyb3cgZX19X3JlcXVlc3QoZSx0KXsic3RyaW5nIj09dHlwZW9mIGU/KHQ9dHx8e30pLnVybD1lOnQ9ZXx8e30sdD1qbih0aGlzLmRlZmF1bHRzLHQpO2NvbnN0e3RyYW5zaXRpb25hbDpuLHBhcmFtc1NlcmlhbGl6ZXI6cixoZWFkZXJzOml9PXQ7dm9pZCAwIT09biYmY3IuYXNzZXJ0T3B0aW9ucyhuLHtzaWxlbnRKU09OUGFyc2luZzp1ci50cmFuc2l0aW9uYWwodXIuYm9vbGVhbiksZm9yY2VkSlNPTlBhcnNpbmc6dXIudHJhbnNpdGlvbmFsKHVyLmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6dXIudHJhbnNpdGlvbmFsKHVyLmJvb2xlYW4pLGxlZ2FjeUludGVyY2VwdG9yUmVxUmVzT3JkZXJpbmc6dXIudHJhbnNpdGlvbmFsKHVyLmJvb2xlYW4pfSwhMSksbnVsbCE9ciYmKHplLmlzRnVuY3Rpb24ocik/dC5wYXJhbXNTZXJpYWxpemVyPXtzZXJpYWxpemU6cn06Y3IuYXNzZXJ0T3B0aW9ucyhyLHtlbmNvZGU6dXIuZnVuY3Rpb24sc2VyaWFsaXplOnVyLmZ1bmN0aW9ufSwhMCkpLHZvaWQgMCE9PXQuYWxsb3dBYnNvbHV0ZVVybHN8fCh2b2lkIDAhPT10aGlzLmRlZmF1bHRzLmFsbG93QWJzb2x1dGVVcmxzP3QuYWxsb3dBYnNvbHV0ZVVybHM9dGhpcy5kZWZhdWx0cy5hbGxvd0Fic29sdXRlVXJsczp0LmFsbG93QWJzb2x1dGVVcmxzPSEwKSxjci5hc3NlcnRPcHRpb25zKHQse2Jhc2VVcmw6dXIuc3BlbGxpbmcoImJhc2VVUkwiKSx3aXRoWHNyZlRva2VuOnVyLnNwZWxsaW5nKCJ3aXRoWFNSRlRva2VuIil9LCEwKSx0Lm1ldGhvZD0odC5tZXRob2R8fHRoaXMuZGVmYXVsdHMubWV0aG9kfHwiZ2V0IikudG9Mb3dlckNhc2UoKTtsZXQgbz1pJiZ6ZS5tZXJnZShpLmNvbW1vbixpW3QubWV0aG9kXSk7aSYmemUuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSwoZT0+e2RlbGV0ZSBpW2VdfSkpLHQuaGVhZGVycz1Sbi5jb25jYXQobyxpKTtjb25zdCBzPVtdO2xldCBhPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUucnVuV2hlbiYmITE9PT1lLnJ1bldoZW4odCkpcmV0dXJuO2E9YSYmZS5zeW5jaHJvbm91cztjb25zdCBuPXQudHJhbnNpdGlvbmFsfHxhbjtuJiZuLmxlZ2FjeUludGVyY2VwdG9yUmVxUmVzT3JkZXJpbmc/cy51bnNoaWZ0KGUuZnVsZmlsbGVkLGUucmVqZWN0ZWQpOnMucHVzaChlLmZ1bGZpbGxlZCxlLnJlamVjdGVkKX0pKTtjb25zdCBjPVtdO2xldCB1O3RoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2MucHVzaChlLmZ1bGZpbGxlZCxlLnJlamVjdGVkKX0pKTtsZXQgbCxkPTA7aWYoIWEpe2NvbnN0IGU9W2lyLmJpbmQodGhpcyksdm9pZCAwXTtmb3IoZS51bnNoaWZ0KC4uLnMpLGUucHVzaCguLi5jKSxsPWUubGVuZ3RoLHU9UHJvbWlzZS5yZXNvbHZlKHQpO2Q8bDspdT11LnRoZW4oZVtkKytdLGVbZCsrXSk7cmV0dXJuIHV9bD1zLmxlbmd0aDtsZXQgaD10O2Zvcig7ZDxsOyl7Y29uc3QgZT1zW2QrK10sdD1zW2QrK107dHJ5e2g9ZShoKX1jYXRjaChlKXt0LmNhbGwodGhpcyxlKTticmVha319dHJ5e3U9aXIuY2FsbCh0aGlzLGgpfWNhdGNoKGUpe3JldHVybiBQcm9taXNlLnJlamVjdChlKX1mb3IoZD0wLGw9Yy5sZW5ndGg7ZDxsOyl1PXUudGhlbihjW2QrK10sY1tkKytdKTtyZXR1cm4gdX1nZXRVcmkoZSl7cmV0dXJuIG9uKE1uKChlPWpuKHRoaXMuZGVmYXVsdHMsZSkpLmJhc2VVUkwsZS51cmwsZS5hbGxvd0Fic29sdXRlVXJscyksZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKX19emUuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJvcHRpb25zIl0sKGZ1bmN0aW9uKGUpe2xyLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLnJlcXVlc3Qoam4obnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6KG58fHt9KS5kYXRhfSkpfX0pKSx6ZS5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIGZ1bmN0aW9uKG4scixpKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KGpuKGl8fHt9LHttZXRob2Q6ZSxoZWFkZXJzOnQ/eyJDb250ZW50LVR5cGUiOiJtdWx0aXBhcnQvZm9ybS1kYXRhIn06e30sdXJsOm4sZGF0YTpyfSkpfX1sci5wcm90b3R5cGVbZV09dCgpLGxyLnByb3RvdHlwZVtlKyJGb3JtIl09dCghMCl9KSk7dmFyIGRyPWxyO2NsYXNzIGhye2NvbnN0cnVjdG9yKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoImV4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4iKTtsZXQgdDt0aGlzLnByb21pc2U9bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3Q9ZX0pKTtjb25zdCBuPXRoaXM7dGhpcy5wcm9taXNlLnRoZW4oKGU9PntpZighbi5fbGlzdGVuZXJzKXJldHVybjtsZXQgdD1uLl9saXN0ZW5lcnMubGVuZ3RoO2Zvcig7dC0tID4wOyluLl9saXN0ZW5lcnNbdF0oZSk7bi5fbGlzdGVuZXJzPW51bGx9KSksdGhpcy5wcm9taXNlLnRoZW49ZT0+e2xldCB0O2NvbnN0IHI9bmV3IFByb21pc2UoKGU9PntuLnN1YnNjcmliZShlKSx0PWV9KSkudGhlbihlKTtyZXR1cm4gci5jYW5jZWw9ZnVuY3Rpb24oKXtuLnVuc3Vic2NyaWJlKHQpfSxyfSxlKChmdW5jdGlvbihlLHIsaSl7bi5yZWFzb258fChuLnJlYXNvbj1uZXcgQW4oZSxyLGkpLHQobi5yZWFzb24pKX0pKX10aHJvd0lmUmVxdWVzdGVkKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259c3Vic2NyaWJlKGUpe3RoaXMucmVhc29uP2UodGhpcy5yZWFzb24pOnRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaChlKTp0aGlzLl9saXN0ZW5lcnM9W2VdfXVuc3Vic2NyaWJlKGUpe2lmKCF0aGlzLl9saXN0ZW5lcnMpcmV0dXJuO2NvbnN0IHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7LTEhPT10JiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9dG9BYm9ydFNpZ25hbCgpe2NvbnN0IGU9bmV3IEFib3J0Q29udHJvbGxlcix0PXQ9PntlLmFib3J0KHQpfTtyZXR1cm4gdGhpcy5zdWJzY3JpYmUodCksZS5zaWduYWwudW5zdWJzY3JpYmU9KCk9PnRoaXMudW5zdWJzY3JpYmUodCksZS5zaWduYWx9c3RhdGljIHNvdXJjZSgpe2xldCBlO2NvbnN0IHQ9bmV3IGhyKChmdW5jdGlvbih0KXtlPXR9KSk7cmV0dXJue3Rva2VuOnQsY2FuY2VsOmV9fX12YXIgZnI9aHI7Y29uc3QgcHI9e0NvbnRpbnVlOjEwMCxTd2l0Y2hpbmdQcm90b2NvbHM6MTAxLFByb2Nlc3Npbmc6MTAyLEVhcmx5SGludHM6MTAzLE9rOjIwMCxDcmVhdGVkOjIwMSxBY2NlcHRlZDoyMDIsTm9uQXV0aG9yaXRhdGl2ZUluZm9ybWF0aW9uOjIwMyxOb0NvbnRlbnQ6MjA0LFJlc2V0Q29udGVudDoyMDUsUGFydGlhbENvbnRlbnQ6MjA2LE11bHRpU3RhdHVzOjIwNyxBbHJlYWR5UmVwb3J0ZWQ6MjA4LEltVXNlZDoyMjYsTXVsdGlwbGVDaG9pY2VzOjMwMCxNb3ZlZFBlcm1hbmVudGx5OjMwMSxGb3VuZDozMDIsU2VlT3RoZXI6MzAzLE5vdE1vZGlmaWVkOjMwNCxVc2VQcm94eTozMDUsVW51c2VkOjMwNixUZW1wb3JhcnlSZWRpcmVjdDozMDcsUGVybWFuZW50UmVkaXJlY3Q6MzA4LEJhZFJlcXVlc3Q6NDAwLFVuYXV0aG9yaXplZDo0MDEsUGF5bWVudFJlcXVpcmVkOjQwMixGb3JiaWRkZW46NDAzLE5vdEZvdW5kOjQwNCxNZXRob2ROb3RBbGxvd2VkOjQwNSxOb3RBY2NlcHRhYmxlOjQwNixQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6NDA3LFJlcXVlc3RUaW1lb3V0OjQwOCxDb25mbGljdDo0MDksR29uZTo0MTAsTGVuZ3RoUmVxdWlyZWQ6NDExLFByZWNvbmRpdGlvbkZhaWxlZDo0MTIsUGF5bG9hZFRvb0xhcmdlOjQxMyxVcmlUb29Mb25nOjQxNCxVbnN1cHBvcnRlZE1lZGlhVHlwZTo0MTUsUmFuZ2VOb3RTYXRpc2ZpYWJsZTo0MTYsRXhwZWN0YXRpb25GYWlsZWQ6NDE3LEltQVRlYXBvdDo0MTgsTWlzZGlyZWN0ZWRSZXF1ZXN0OjQyMSxVbnByb2Nlc3NhYmxlRW50aXR5OjQyMixMb2NrZWQ6NDIzLEZhaWxlZERlcGVuZGVuY3k6NDI0LFRvb0Vhcmx5OjQyNSxVcGdyYWRlUmVxdWlyZWQ6NDI2LFByZWNvbmRpdGlvblJlcXVpcmVkOjQyOCxUb29NYW55UmVxdWVzdHM6NDI5LFJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZTo0MzEsVW5hdmFpbGFibGVGb3JMZWdhbFJlYXNvbnM6NDUxLEludGVybmFsU2VydmVyRXJyb3I6NTAwLE5vdEltcGxlbWVudGVkOjUwMSxCYWRHYXRld2F5OjUwMixTZXJ2aWNlVW5hdmFpbGFibGU6NTAzLEdhdGV3YXlUaW1lb3V0OjUwNCxIdHRwVmVyc2lvbk5vdFN1cHBvcnRlZDo1MDUsVmFyaWFudEFsc29OZWdvdGlhdGVzOjUwNixJbnN1ZmZpY2llbnRTdG9yYWdlOjUwNyxMb29wRGV0ZWN0ZWQ6NTA4LE5vdEV4dGVuZGVkOjUxMCxOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZDo1MTEsV2ViU2VydmVySXNEb3duOjUyMSxDb25uZWN0aW9uVGltZWRPdXQ6NTIyLE9yaWdpbklzVW5yZWFjaGFibGU6NTIzLFRpbWVvdXRPY2N1cnJlZDo1MjQsU3NsSGFuZHNoYWtlRmFpbGVkOjUyNSxJbnZhbGlkU3NsQ2VydGlmaWNhdGU6NTI2fTtPYmplY3QuZW50cmllcyhwcikuZm9yRWFjaCgoZT0+e2xldFt0LG5dPWU7cHJbbl09dH0pKTt2YXIgZ3I9cHI7Y29uc3QgeXI9ZnVuY3Rpb24gZSh0KXtjb25zdCBuPW5ldyBkcih0KSxyPWVlKGRyLnByb3RvdHlwZS5yZXF1ZXN0LG4pO3JldHVybiB6ZS5leHRlbmQocixkci5wcm90b3R5cGUsbix7YWxsT3duS2V5czohMH0pLHplLmV4dGVuZChyLG4sbnVsbCx7YWxsT3duS2V5czohMH0pLHIuY3JlYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBlKGpuKHQsbikpfSxyfSh2bik7eXIuQXhpb3M9ZHIseXIuQ2FuY2VsZWRFcnJvcj1Bbix5ci5DYW5jZWxUb2tlbj1mcix5ci5pc0NhbmNlbD1rbix5ci5WRVJTSU9OPW9yLHlyLnRvRm9ybURhdGE9UXQseXIuQXhpb3NFcnJvcj1ZdCx5ci5DYW5jZWw9eXIuQ2FuY2VsZWRFcnJvcix5ci5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUpfSx5ci5zcHJlYWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmFwcGx5KG51bGwsdCl9fSx5ci5pc0F4aW9zRXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHplLmlzT2JqZWN0KGUpJiYhMD09PWUuaXNBeGlvc0Vycm9yfSx5ci5tZXJnZUNvbmZpZz1qbix5ci5BeGlvc0hlYWRlcnM9Um4seXIuZm9ybVRvSlNPTj1lPT5nbih6ZS5pc0hUTUxGb3JtKGUpP25ldyBGb3JtRGF0YShlKTplKSx5ci5nZXRBZGFwdGVyPW5yLmdldEFkYXB0ZXIseXIuSHR0cFN0YXR1c0NvZGU9Z3IseXIuZGVmYXVsdD15cjt2YXIgdnIsbXI9eXI7bGV0IHdyPXZyPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5hdHRhY2hUb2tlbj0oKT0+UHJvbWlzZS5yZXNvbHZlKCksdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9KCk9Pm51bGwsdGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLmluaXQ9dGhpcy5pbml0LmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrLmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrPXRoaXMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2suYmluZCh0aGlzKX1zdGF0aWMgZ2V0SW5zdGFuY2UoKXtyZXR1cm4gdGhpcy5heGlvc0luc3RhbmNlfHwodGhpcy5heGlvc0luc3RhbmNlPW1yLmNyZWF0ZSh7d2l0aENyZWRlbnRpYWxzOiEwfSksdGhpcy5jbGllbnRJbnN0YW5jZXx8KHRoaXMuY2xpZW50SW5zdGFuY2U9bmV3IHZyKSx0aGlzLmF4aW9zSW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKCh0PT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuY2xpZW50SW5zdGFuY2UucmVxdWVzdEhhbmRsZXIodCl9KSkpKSx0aGlzLmF4aW9zSW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZSgoZT0+dGhpcy5jbGllbnRJbnN0YW5jZS5zdWNjZXNzSGFuZGxlcihlKSksKGU9PnRoaXMuY2xpZW50SW5zdGFuY2UuZXJyb3JIYW5kbGVyKGUpKSksdGhpcy5heGlvc0luc3RhbmNlLmFsbD1tci5hbGwsdGhpcy5heGlvc0luc3RhbmNlLnNwcmVhZD1tci5zcHJlYWQsdGhpcy5heGlvc0luc3RhbmNlLmluaXQ9dGhpcy5jbGllbnRJbnN0YW5jZS5pbml0LHRoaXMuYXhpb3NJbnN0YW5jZS5lbmFibGVIYW5kbGVyPXRoaXMuY2xpZW50SW5zdGFuY2UuZW5hYmxlSGFuZGxlcix0aGlzLmF4aW9zSW5zdGFuY2UuZGlzYWJsZUhhbmRsZXI9dGhpcy5jbGllbnRJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcix0aGlzLmF4aW9zSW5zdGFuY2UuZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dD10aGlzLmNsaWVudEluc3RhbmNlLmRpc2FibGVIYW5kbGVyV2l0aFRpbWVvdXQsdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayksdGhpcy5heGlvc0luc3RhbmNlfXJlcXVlc3RIYW5kbGVyKHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoeWllbGQgdGhpcy5hdHRhY2hUb2tlbih0KSxudWxsPT10P3ZvaWQgMDp0LnNob3VsZEVuY29kZVRvRm9ybURhdGEpe2NvbnN0IGU9bnVsbD09dD92b2lkIDA6dC5kYXRhLG49bmV3IEZvcm1EYXRhO09iamVjdC5rZXlzKGUpLmZvckVhY2goKHQ9PntuLmFwcGVuZCh0LGVbdF0pfSkpLHQuZGF0YT1ufXJldHVybiB0LnN0YXJ0VGltZUluTXM9KG5ldyBEYXRlKS5nZXRUaW1lKCksdnIuaXNIYW5kbGVyRW5hYmxlZCYmdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2smJnRoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2sodCksdH0pKX1lcnJvckhhbmRsZXIoZSl7dGhyb3cgdnIuaXNIYW5kbGVyRW5hYmxlZCYmKHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrJiZ0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrKGUpLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJnRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrKCkpLGV9c3VjY2Vzc0hhbmRsZXIoZSl7dmFyIHQsbjtyZXR1cm4ic3RyZWFtIj09PShudWxsPT09KG49bnVsbD09PSh0PWUpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmNvbmZpZyl8fHZvaWQgMD09PW4/dm9pZCAwOm4ucmVzcG9uc2VUeXBlKXx8dnIuaXNIYW5kbGVyRW5hYmxlZCYmKHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJnRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrKCkpLGV9aW5pdCgpe2xldCB0PSEoYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0pfHxhcmd1bWVudHNbMF0sbj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZyLmlzSGFuZGxlckVuYWJsZWQ9dCx0aGlzLmF0dGFjaFRva2VuPW59KSl9ZW5hYmxlSGFuZGxlcigpe3ZyLmlzSGFuZGxlckVuYWJsZWQ9ITB9ZGlzYWJsZUhhbmRsZXIoKXt2ci5pc0hhbmRsZXJFbmFibGVkPSExfWRpc2FibGVIYW5kbGVyV2l0aFRpbWVvdXQoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dnIuREVGQVVMVF9IQU5ETEVSX0RJU0FCTEVfVElNRU9VVDt2ci5pc0hhbmRsZXJFbmFibGVkPSExLHNldFRpbWVvdXQoKCgpPT57dnIuaXNIYW5kbGVyRW5hYmxlZD0hMH0pLGUpfXNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayhlKXt0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrPWV9c2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrPWV9c2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrKGUpe3RoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKGUpe3RoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrPWV9fTt3ci5ERUZBVUxUX0hBTkRMRVJfRElTQUJMRV9USU1FT1VUPTFlMyx3cj12cj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGgscz1vPDM/dDpudWxsPT09cj9yPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTpyO2lmKCJvYmplY3QiPT10eXBlb2YgUmVmbGVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUpcz1SZWZsZWN0LmRlY29yYXRlKGUsdCxuLHIpO2Vsc2UgZm9yKHZhciBhPWUubGVuZ3RoLTE7YT49MDthLS0pKGk9ZVthXSkmJihzPShvPDM/aShzKTpvPjM/aSh0LG4scyk6aSh0LG4pKXx8cyk7cmV0dXJuIG8+MyYmcyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbixzKSxzfShbZT0+e31dLHdyKTtjbGFzcyBicntjb25zdHJ1Y3Rvcigpe3RoaXMuX2RhdGE9bmV3IE1hcH1zZXREYXRhKHQsbil7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLl9kYXRhLnNldCh0LG4pfSkpfWdldERhdGEodCl7dmFyIG4scjtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsIT09KHI9bnVsbD09PShuPXRoaXMuX2RhdGEpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmdldCh0KSkmJnZvaWQgMCE9PXI/cjoie30ifSkpfXJlbW92ZURhdGEodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLl9kYXRhLmRlbGV0ZSh0KX0pKX19dmFyIF9yPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gU3IoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRlZmF1bHQiKT9lLmRlZmF1bHQ6ZX1mdW5jdGlvbiBFcihlKXtpZihlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHQ9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLG4pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4sci5nZXQ/cjp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZVtuXX19KX0pKSx0fXZhciBScj17ZXhwb3J0czp7fX0sVHI9e30sa3I9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KGtyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxrci5kZWZhdWx0PWZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoLG49dCU0O2lmKCFuKXJldHVybiBlO3ZhciByPXQsaT00LW4sbz10K2kscz1hdC5hbGxvYyhvKTtmb3Iocy53cml0ZShlKTtpLS07KXMud3JpdGUoIj0iLHIrKyk7cmV0dXJuIHMudG9TdHJpbmcoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KFRyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgQXI9a3I7ZnVuY3Rpb24gQ3IoZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9InV0ZjgiKSxhdC5pc0J1ZmZlcihlKT9PcihlLnRvU3RyaW5nKCJiYXNlNjQiKSk6T3IoYXQuZnJvbShlLHQpLnRvU3RyaW5nKCJiYXNlNjQiKSl9ZnVuY3Rpb24gRHIoZSl7cmV0dXJuIGU9ZS50b1N0cmluZygpLEFyLmRlZmF1bHQoZSkucmVwbGFjZSgvXC0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpfWZ1bmN0aW9uIE9yKGUpe3JldHVybiBlLnJlcGxhY2UoLz0vZywiIikucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKX12YXIgUHIsSXI9Q3I7SXIuZW5jb2RlPUNyLElyLmRlY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0idXRmOCIpLGF0LmZyb20oRHIoZSksImJhc2U2NCIpLnRvU3RyaW5nKHQpfSxJci50b0Jhc2U2ND1EcixJci5mcm9tQmFzZTY0PU9yLElyLnRvQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiBhdC5mcm9tKERyKGUpLCJiYXNlNjQiKX0sVHIuZGVmYXVsdD1JciwoUHI9UnIpLmV4cG9ydHM9VHIuZGVmYXVsdCxQci5leHBvcnRzLmRlZmF1bHQ9UHIuZXhwb3J0czt2YXIgVXI9UnIuZXhwb3J0cyxMcj17ZXhwb3J0czp7fX07IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0LG4pe3ZhciByPXt9OyFmdW5jdGlvbihlKXtlLl9fZXNNb2R1bGU9ITAsZS5kaWdlc3RMZW5ndGg9MzIsZS5ibG9ja1NpemU9NjQ7dmFyIHQ9bmV3IFVpbnQzMkFycmF5KFsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdKTtmdW5jdGlvbiBuKGUsbixyLGksbyl7Zm9yKHZhciBzLGEsYyx1LGwsZCxoLGYscCxnLHksdixtO28+PTY0Oyl7Zm9yKHM9blswXSxhPW5bMV0sYz1uWzJdLHU9blszXSxsPW5bNF0sZD1uWzVdLGg9bls2XSxmPW5bN10sZz0wO2c8MTY7ZysrKXk9aSs0KmcsZVtnXT0oMjU1JnJbeV0pPDwyNHwoMjU1JnJbeSsxXSk8PDE2fCgyNTUmclt5KzJdKTw8OHwyNTUmclt5KzNdO2ZvcihnPTE2O2c8NjQ7ZysrKXY9KChwPWVbZy0yXSk+Pj4xN3xwPDwxNSleKHA+Pj4xOXxwPDwxMylecD4+PjEwLG09KChwPWVbZy0xNV0pPj4+N3xwPDwyNSleKHA+Pj4xOHxwPDwxNClecD4+PjMsZVtnXT0oditlW2ctN118MCkrKG0rZVtnLTE2XXwwKTtmb3IoZz0wO2c8NjQ7ZysrKXY9KCgobD4+PjZ8bDw8MjYpXihsPj4+MTF8bDw8MjEpXihsPj4+MjV8bDw8NykpKyhsJmRefmwmaCl8MCkrKGYrKHRbZ10rZVtnXXwwKXwwKXwwLG09KChzPj4+MnxzPDwzMCleKHM+Pj4xM3xzPDwxOSleKHM+Pj4yMnxzPDwxMCkpKyhzJmFecyZjXmEmYyl8MCxmPWgsaD1kLGQ9bCxsPXUrdnwwLHU9YyxjPWEsYT1zLHM9dittfDA7blswXSs9cyxuWzFdKz1hLG5bMl0rPWMsblszXSs9dSxuWzRdKz1sLG5bNV0rPWQsbls2XSs9aCxuWzddKz1mLGkrPTY0LG8tPTY0fXJldHVybiBpfXZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuZGlnZXN0TGVuZ3RoPWUuZGlnZXN0TGVuZ3RoLHRoaXMuYmxvY2tTaXplPWUuYmxvY2tTaXplLHRoaXMuc3RhdGU9bmV3IEludDMyQXJyYXkoOCksdGhpcy50ZW1wPW5ldyBJbnQzMkFycmF5KDY0KSx0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSgxMjgpLHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITEsdGhpcy5yZXNldCgpfXJldHVybiB0LnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlWzBdPTE3NzkwMzM3MDMsdGhpcy5zdGF0ZVsxXT0zMTQ0MTM0Mjc3LHRoaXMuc3RhdGVbMl09MTAxMzkwNDI0Mix0aGlzLnN0YXRlWzNdPTI3NzM0ODA3NjIsdGhpcy5zdGF0ZVs0XT0xMzU5ODkzMTE5LHRoaXMuc3RhdGVbNV09MjYwMDgyMjkyNCx0aGlzLnN0YXRlWzZdPTUyODczNDYzNSx0aGlzLnN0YXRlWzddPTE1NDE0NTkyMjUsdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmJ5dGVzSGFzaGVkPTAsdGhpcy5maW5pc2hlZD0hMSx0aGlzfSx0LnByb3RvdHlwZS5jbGVhbj1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8dGhpcy5idWZmZXIubGVuZ3RoO2UrKyl0aGlzLmJ1ZmZlcltlXT0wO2ZvcihlPTA7ZTx0aGlzLnRlbXAubGVuZ3RoO2UrKyl0aGlzLnRlbXBbZV09MDt0aGlzLnJlc2V0KCl9LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXQmJih0PWUubGVuZ3RoKSx0aGlzLmZpbmlzaGVkKXRocm93IG5ldyBFcnJvcigiU0hBMjU2OiBjYW4ndCB1cGRhdGUgYmVjYXVzZSBoYXNoIHdhcyBmaW5pc2hlZC4iKTt2YXIgcj0wO2lmKHRoaXMuYnl0ZXNIYXNoZWQrPXQsdGhpcy5idWZmZXJMZW5ndGg+MCl7Zm9yKDt0aGlzLmJ1ZmZlckxlbmd0aDw2NCYmdD4wOyl0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlckxlbmd0aCsrXT1lW3IrK10sdC0tOzY0PT09dGhpcy5idWZmZXJMZW5ndGgmJihuKHRoaXMudGVtcCx0aGlzLnN0YXRlLHRoaXMuYnVmZmVyLDAsNjQpLHRoaXMuYnVmZmVyTGVuZ3RoPTApfWZvcih0Pj02NCYmKHI9bih0aGlzLnRlbXAsdGhpcy5zdGF0ZSxlLHIsdCksdCU9NjQpO3Q+MDspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK109ZVtyKytdLHQtLTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmZpbmlzaGVkKXt2YXIgdD10aGlzLmJ5dGVzSGFzaGVkLHI9dGhpcy5idWZmZXJMZW5ndGgsaT10LzUzNjg3MDkxMnwwLG89dDw8MyxzPXQlNjQ8NTY/NjQ6MTI4O3RoaXMuYnVmZmVyW3JdPTEyODtmb3IodmFyIGE9cisxO2E8cy04O2ErKyl0aGlzLmJ1ZmZlclthXT0wO3RoaXMuYnVmZmVyW3MtOF09aT4+PjI0JjI1NSx0aGlzLmJ1ZmZlcltzLTddPWk+Pj4xNiYyNTUsdGhpcy5idWZmZXJbcy02XT1pPj4+OCYyNTUsdGhpcy5idWZmZXJbcy01XT1pPj4+MCYyNTUsdGhpcy5idWZmZXJbcy00XT1vPj4+MjQmMjU1LHRoaXMuYnVmZmVyW3MtM109bz4+PjE2JjI1NSx0aGlzLmJ1ZmZlcltzLTJdPW8+Pj44JjI1NSx0aGlzLmJ1ZmZlcltzLTFdPW8+Pj4wJjI1NSxuKHRoaXMudGVtcCx0aGlzLnN0YXRlLHRoaXMuYnVmZmVyLDAscyksdGhpcy5maW5pc2hlZD0hMH1mb3IoYT0wO2E8ODthKyspZVs0KmErMF09dGhpcy5zdGF0ZVthXT4+PjI0JjI1NSxlWzQqYSsxXT10aGlzLnN0YXRlW2FdPj4+MTYmMjU1LGVbNCphKzJdPXRoaXMuc3RhdGVbYV0+Pj44JjI1NSxlWzQqYSszXT10aGlzLnN0YXRlW2FdPj4+MCYyNTU7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBlPW5ldyBVaW50OEFycmF5KHRoaXMuZGlnZXN0TGVuZ3RoKTtyZXR1cm4gdGhpcy5maW5pc2goZSksZX0sdC5wcm90b3R5cGUuX3NhdmVTdGF0ZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PHRoaXMuc3RhdGUubGVuZ3RoO3QrKyllW3RdPXRoaXMuc3RhdGVbdF19LHQucHJvdG90eXBlLl9yZXN0b3JlU3RhdGU9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHRoaXMuc3RhdGUubGVuZ3RoO24rKyl0aGlzLnN0YXRlW25dPWVbbl07dGhpcy5ieXRlc0hhc2hlZD10LHRoaXMuZmluaXNoZWQ9ITEsdGhpcy5idWZmZXJMZW5ndGg9MH0sdH0oKTtlLkhhc2g9cjt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy5pbm5lcj1uZXcgcix0aGlzLm91dGVyPW5ldyByLHRoaXMuYmxvY2tTaXplPXRoaXMuaW5uZXIuYmxvY2tTaXplLHRoaXMuZGlnZXN0TGVuZ3RoPXRoaXMuaW5uZXIuZGlnZXN0TGVuZ3RoO3ZhciB0PW5ldyBVaW50OEFycmF5KHRoaXMuYmxvY2tTaXplKTtpZihlLmxlbmd0aD50aGlzLmJsb2NrU2l6ZSkobmV3IHIpLnVwZGF0ZShlKS5maW5pc2godCkuY2xlYW4oKTtlbHNlIGZvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXRbbl09ZVtuXTtmb3Iobj0wO248dC5sZW5ndGg7bisrKXRbbl1ePTU0O3RoaXMuaW5uZXIudXBkYXRlKHQpO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXV49MTA2O3RoaXMub3V0ZXIudXBkYXRlKHQpLHRoaXMuaXN0YXRlPW5ldyBVaW50MzJBcnJheSg4KSx0aGlzLm9zdGF0ZT1uZXcgVWludDMyQXJyYXkoOCksdGhpcy5pbm5lci5fc2F2ZVN0YXRlKHRoaXMuaXN0YXRlKSx0aGlzLm91dGVyLl9zYXZlU3RhdGUodGhpcy5vc3RhdGUpO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXT0wfXJldHVybiBlLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlubmVyLl9yZXN0b3JlU3RhdGUodGhpcy5pc3RhdGUsdGhpcy5pbm5lci5ibG9ja1NpemUpLHRoaXMub3V0ZXIuX3Jlc3RvcmVTdGF0ZSh0aGlzLm9zdGF0ZSx0aGlzLm91dGVyLmJsb2NrU2l6ZSksdGhpc30sZS5wcm90b3R5cGUuY2xlYW49ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuaXN0YXRlLmxlbmd0aDtlKyspdGhpcy5vc3RhdGVbZV09dGhpcy5pc3RhdGVbZV09MDt0aGlzLmlubmVyLmNsZWFuKCksdGhpcy5vdXRlci5jbGVhbigpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaW5uZXIudXBkYXRlKGUpLHRoaXN9LGUucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vdXRlci5maW5pc2hlZD90aGlzLm91dGVyLmZpbmlzaChlKToodGhpcy5pbm5lci5maW5pc2goZSksdGhpcy5vdXRlci51cGRhdGUoZSx0aGlzLmRpZ2VzdExlbmd0aCkuZmluaXNoKGUpKSx0aGlzfSxlLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgVWludDhBcnJheSh0aGlzLmRpZ2VzdExlbmd0aCk7cmV0dXJuIHRoaXMuZmluaXNoKGUpLGV9LGV9KCk7ZnVuY3Rpb24gbyhlKXt2YXIgdD0obmV3IHIpLnVwZGF0ZShlKSxuPXQuZGlnZXN0KCk7cmV0dXJuIHQuY2xlYW4oKSxufWZ1bmN0aW9uIHMoZSx0KXt2YXIgbj1uZXcgaShlKS51cGRhdGUodCkscj1uLmRpZ2VzdCgpO3JldHVybiBuLmNsZWFuKCkscn1mdW5jdGlvbiBhKGUsdCxuLHIpe3ZhciBpPXJbMF07aWYoMD09PWkpdGhyb3cgbmV3IEVycm9yKCJoa2RmOiBjYW5ub3QgZXhwYW5kIG1vcmUiKTt0LnJlc2V0KCksaT4xJiZ0LnVwZGF0ZShlKSxuJiZ0LnVwZGF0ZShuKSx0LnVwZGF0ZShyKSx0LmZpbmlzaChlKSxyWzBdKyt9ZS5ITUFDPWksZS5oYXNoPW8sZS5kZWZhdWx0PW8sZS5obWFjPXM7dmFyIGM9bmV3IFVpbnQ4QXJyYXkoZS5kaWdlc3RMZW5ndGgpO2Z1bmN0aW9uIHUoZSx0LG4scil7dm9pZCAwPT09dCYmKHQ9Yyksdm9pZCAwPT09ciYmKHI9MzIpO2Zvcih2YXIgbz1uZXcgVWludDhBcnJheShbMV0pLHU9cyh0LGUpLGw9bmV3IGkodSksZD1uZXcgVWludDhBcnJheShsLmRpZ2VzdExlbmd0aCksaD1kLmxlbmd0aCxmPW5ldyBVaW50OEFycmF5KHIpLHA9MDtwPHI7cCsrKWg9PT1kLmxlbmd0aCYmKGEoZCxsLG4sbyksaD0wKSxmW3BdPWRbaCsrXTtyZXR1cm4gbC5jbGVhbigpLGQuZmlsbCgwKSxvLmZpbGwoMCksZn1mdW5jdGlvbiBsKGUsdCxuLHIpe2Zvcih2YXIgbz1uZXcgaShlKSxzPW8uZGlnZXN0TGVuZ3RoLGE9bmV3IFVpbnQ4QXJyYXkoNCksYz1uZXcgVWludDhBcnJheShzKSx1PW5ldyBVaW50OEFycmF5KHMpLGw9bmV3IFVpbnQ4QXJyYXkociksZD0wO2QqczxyO2QrKyl7dmFyIGg9ZCsxO2FbMF09aD4+PjI0JjI1NSxhWzFdPWg+Pj4xNiYyNTUsYVsyXT1oPj4+OCYyNTUsYVszXT1oPj4+MCYyNTUsby5yZXNldCgpLG8udXBkYXRlKHQpLG8udXBkYXRlKGEpLG8uZmluaXNoKHUpO2Zvcih2YXIgZj0wO2Y8cztmKyspY1tmXT11W2ZdO2ZvcihmPTI7Zjw9bjtmKyspe28ucmVzZXQoKSxvLnVwZGF0ZSh1KS5maW5pc2godSk7Zm9yKHZhciBwPTA7cDxzO3ArKyljW3BdXj11W3BdfWZvcihmPTA7ZjxzJiZkKnMrZjxyO2YrKylsW2QqcytmXT1jW2ZdfWZvcihkPTA7ZDxzO2QrKyljW2RdPXVbZF09MDtmb3IoZD0wO2Q8NDtkKyspYVtkXT0wO3JldHVybiBvLmNsZWFuKCksbH1lLmhrZGY9dSxlLnBia2RmMj1sfShyKTt2YXIgaT1yLmRlZmF1bHQ7Zm9yKHZhciBvIGluIHIpaVtvXT1yW29dO2UuZXhwb3J0cz1pfSgpfShMcik7dmFyIEhyPVNyKExyLmV4cG9ydHMpLE1yPWNyeXB0bztjb25zdCBOcj1lPT5lIGluc3RhbmNlb2YgQ3J5cHRvS2V5LGpyPW5ldyBUZXh0RW5jb2Rlcix4cj1uZXcgVGV4dERlY29kZXI7Y29uc3QgcXI9ZT0+e2xldCB0PWU7dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJih0PXhyLmRlY29kZSh0KSksdD10LnJlcGxhY2UoLy0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpLnJlcGxhY2UoL1xzL2csIiIpO3RyeXtyZXR1cm4oZT0+e2NvbnN0IHQ9YXRvYihlKSxuPW5ldyBVaW50OEFycmF5KHQubGVuZ3RoKTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyluW2VdPXQuY2hhckNvZGVBdChlKTtyZXR1cm4gbn0pKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBpbnB1dCB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC4iKX19O2NsYXNzIEJyIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7dmFyIHQ7c3VwZXIoZSksdGhpcy5jb2RlPSJFUlJfSk9TRV9HRU5FUklDIix0aGlzLm5hbWU9dGhpcy5jb25zdHJ1Y3Rvci5uYW1lLG51bGw9PT0odD1FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSl8fHZvaWQgMD09PXR8fHQuY2FsbChFcnJvcix0aGlzLHRoaXMuY29uc3RydWN0b3IpfXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSk9TRV9HRU5FUklDIn19Y2xhc3MgRnIgZXh0ZW5kcyBCcntjb25zdHJ1Y3RvcihlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06InVuc3BlY2lmaWVkIixuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXToidW5zcGVjaWZpZWQiO3N1cGVyKGUpLHRoaXMuY29kZT0iRVJSX0pXVF9DTEFJTV9WQUxJREFUSU9OX0ZBSUxFRCIsdGhpcy5jbGFpbT10LHRoaXMucmVhc29uPW59c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV1RfQ0xBSU1fVkFMSURBVElPTl9GQUlMRUQifX1jbGFzcyBLciBleHRlbmRzIEJye2NvbnN0cnVjdG9yKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToidW5zcGVjaWZpZWQiLG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOiJ1bnNwZWNpZmllZCI7c3VwZXIoZSksdGhpcy5jb2RlPSJFUlJfSldUX0VYUElSRUQiLHRoaXMuY2xhaW09dCx0aGlzLnJlYXNvbj1ufXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldUX0VYUElSRUQifX1jbGFzcyBKciBleHRlbmRzIEJye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KT1NFX0FMR19OT1RfQUxMT1dFRCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KT1NFX0FMR19OT1RfQUxMT1dFRCJ9fWNsYXNzIFdyIGV4dGVuZHMgQnJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pPU0VfTk9UX1NVUFBPUlRFRCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KT1NFX05PVF9TVVBQT1JURUQifX1jbGFzcyB6ciBleHRlbmRzIEJye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV1NfSU5WQUxJRCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV1NfSU5WQUxJRCJ9fWNsYXNzIFZyIGV4dGVuZHMgQnJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXVF9JTlZBTElEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXVF9JTlZBTElEIn19Y2xhc3MgWXIgZXh0ZW5kcyBCcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldLU19JTlZBTElEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXS1NfSU5WQUxJRCJ9fWNsYXNzIEdyIGV4dGVuZHMgQnJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXS1NfTk9fTUFUQ0hJTkdfS0VZIix0aGlzLm1lc3NhZ2U9Im5vIGFwcGxpY2FibGUga2V5IGZvdW5kIGluIHRoZSBKU09OIFdlYiBLZXkgU2V0In1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXS1NfTk9fTUFUQ0hJTkdfS0VZIn19Y2xhc3MgWHIgZXh0ZW5kcyBCcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldLU19NVUxUSVBMRV9NQVRDSElOR19LRVlTIix0aGlzLm1lc3NhZ2U9Im11bHRpcGxlIG1hdGNoaW5nIGtleXMgZm91bmQgaW4gdGhlIEpTT04gV2ViIEtleSBTZXQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldLU19NVUxUSVBMRV9NQVRDSElOR19LRVlTIn19Y2xhc3MgJHIgZXh0ZW5kcyBCcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldTX1NJR05BVFVSRV9WRVJJRklDQVRJT05fRkFJTEVEIix0aGlzLm1lc3NhZ2U9InNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXU19TSUdOQVRVUkVfVkVSSUZJQ0FUSU9OX0ZBSUxFRCJ9fWZ1bmN0aW9uIFpyKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIFdlYlNvY2tldFBhaXJ9ZnVuY3Rpb24gUXIoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiJhbGdvcml0aG0ubmFtZSI7cmV0dXJuIG5ldyBUeXBlRXJyb3IoIkNyeXB0b0tleSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLCBpdHMgIi5jb25jYXQodCwiIG11c3QgYmUgIikuY29uY2F0KGUpKX1mdW5jdGlvbiBlaShlLHQpe3JldHVybiBlLm5hbWU9PT10fWZ1bmN0aW9uIHRpKGUpe3JldHVybiBwYXJzZUludChlLm5hbWUuc2xpY2UoNCksMTApfWZ1bmN0aW9uIG5pKGUpe3N3aXRjaChlKXtjYXNlIkVTMjU2IjpyZXR1cm4iUC0yNTYiO2Nhc2UiRVMzODQiOnJldHVybiJQLTM4NCI7Y2FzZSJFUzUxMiI6cmV0dXJuIlAtNTIxIjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidW5yZWFjaGFibGUiKX19ZnVuY3Rpb24gcmkoZSx0KXtpZih0Lmxlbmd0aCYmIXQuc29tZSgodD0+ZS51c2FnZXMuaW5jbHVkZXModCkpKSl7bGV0IGU9IkNyeXB0b0tleSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLCBpdHMgdXNhZ2VzIG11c3QgaW5jbHVkZSAiO2lmKHQubGVuZ3RoPjIpe2NvbnN0IG49dC5wb3AoKTtlKz0ib25lIG9mICIuY29uY2F0KHQuam9pbigiLCAiKSwiLCBvciAiKS5jb25jYXQobiwiLiIpfWVsc2UgMj09PXQubGVuZ3RoP2UrPSJvbmUgb2YgIi5jb25jYXQodFswXSwiIG9yICIpLmNvbmNhdCh0WzFdLCIuIik6ZSs9IiIuY29uY2F0KHRbMF0sIi4iKTt0aHJvdyBuZXcgVHlwZUVycm9yKGUpfX12YXIgaWk9ZnVuY3Rpb24oZSl7bGV0IHQ9IktleSBtdXN0IGJlICI7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxpPTE7aTxuO2krKylyW2ktMV09YXJndW1lbnRzW2ldO2lmKHIubGVuZ3RoPjIpe2NvbnN0IGU9ci5wb3AoKTt0Kz0ib25lIG9mIHR5cGUgIi5jb25jYXQoci5qb2luKCIsICIpLCIsIG9yICIpLmNvbmNhdChlLCIuIil9ZWxzZSAyPT09ci5sZW5ndGg/dCs9Im9uZSBvZiB0eXBlICIuY29uY2F0KHJbMF0sIiBvciAiKS5jb25jYXQoclsxXSwiLiIpOnQrPSJvZiB0eXBlICIuY29uY2F0KHJbMF0sIi4iKTtyZXR1cm4gbnVsbD09ZT90Kz0iIFJlY2VpdmVkICIuY29uY2F0KGUpOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLm5hbWU/dCs9IiBSZWNlaXZlZCBmdW5jdGlvbiAiLmNvbmNhdChlLm5hbWUpOiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9ZSYmZS5jb25zdHJ1Y3RvciYmZS5jb25zdHJ1Y3Rvci5uYW1lJiYodCs9IiBSZWNlaXZlZCBhbiBpbnN0YW5jZSBvZiAiLmNvbmNhdChlLmNvbnN0cnVjdG9yLm5hbWUpKSx0fSxvaT1lPT5OcihlKTtjb25zdCBzaT1bIkNyeXB0b0tleSJdO2Z1bmN0aW9uIGFpKGUpe2lmKCJvYmplY3QiIT10eXBlb2YodD1lKXx8bnVsbD09PXR8fCJbb2JqZWN0IE9iamVjdF0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKXJldHVybiExO3ZhciB0O2lmKG51bGw9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpcmV0dXJuITA7bGV0IG49ZTtmb3IoO251bGwhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yobik7KW49T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pO3JldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1ufWNvbnN0IGNpPWFzeW5jIGU9Pnt2YXIgdCxuO2NvbnN0e2FsZ29yaXRobTpyLGtleVVzYWdlczppfT1mdW5jdGlvbihlKXtsZXQgdCxuO3N3aXRjaChlLmt0eSl7Y2FzZSJvY3QiOnN3aXRjaChlLmFsZyl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6dD17bmFtZToiSE1BQyIsaGFzaDoiU0hBLSIuY29uY2F0KGUuYWxnLnNsaWNlKC0zKSl9LG49WyJzaWduIiwidmVyaWZ5Il07YnJlYWs7Y2FzZSJBMTI4Q0JDLUhTMjU2IjpjYXNlIkExOTJDQkMtSFMzODQiOmNhc2UiQTI1NkNCQy1IUzUxMiI6dGhyb3cgbmV3IFdyKCIiLmNvbmNhdChlLmFsZywiIGtleXMgY2Fubm90IGJlIGltcG9ydGVkIGFzIENyeXB0b0tleSBpbnN0YW5jZXMiKSk7Y2FzZSJBMTI4R0NNIjpjYXNlIkExOTJHQ00iOmNhc2UiQTI1NkdDTSI6Y2FzZSJBMTI4R0NNS1ciOmNhc2UiQTE5MkdDTUtXIjpjYXNlIkEyNTZHQ01LVyI6dD17bmFtZToiQUVTLUdDTSJ9LG49WyJlbmNyeXB0IiwiZGVjcnlwdCJdO2JyZWFrO2Nhc2UiQTEyOEtXIjpjYXNlIkExOTJLVyI6Y2FzZSJBMjU2S1ciOnQ9e25hbWU6IkFFUy1LVyJ9LG49WyJ3cmFwS2V5IiwidW53cmFwS2V5Il07YnJlYWs7Y2FzZSJQQkVTMi1IUzI1NitBMTI4S1ciOmNhc2UiUEJFUzItSFMzODQrQTE5MktXIjpjYXNlIlBCRVMyLUhTNTEyK0EyNTZLVyI6dD17bmFtZToiUEJLREYyIn0sbj1bImRlcml2ZUJpdHMiXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBXcignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7Y2FzZSJSU0EiOnN3aXRjaChlLmFsZyl7Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6dD17bmFtZToiUlNBLVBTUyIsaGFzaDoiU0hBLSIuY29uY2F0KGUuYWxnLnNsaWNlKC0zKSl9LG49ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJSUzI1NiI6Y2FzZSJSUzM4NCI6Y2FzZSJSUzUxMiI6dD17bmFtZToiUlNBU1NBLVBLQ1MxLXYxXzUiLGhhc2g6IlNIQS0iLmNvbmNhdChlLmFsZy5zbGljZSgtMykpfSxuPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiUlNBLU9BRVAiOmNhc2UiUlNBLU9BRVAtMjU2IjpjYXNlIlJTQS1PQUVQLTM4NCI6Y2FzZSJSU0EtT0FFUC01MTIiOnQ9e25hbWU6IlJTQS1PQUVQIixoYXNoOiJTSEEtIi5jb25jYXQocGFyc2VJbnQoZS5hbGcuc2xpY2UoLTMpLDEwKXx8MSl9LG49ZS5kP1siZGVjcnlwdCIsInVud3JhcEtleSJdOlsiZW5jcnlwdCIsIndyYXBLZXkiXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBXcignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7Y2FzZSJFQyI6c3dpdGNoKGUuYWxnKXtjYXNlIkVTMjU2Ijp0PXtuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZToiUC0yNTYifSxuPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiRVMzODQiOnQ9e25hbWU6IkVDRFNBIixuYW1lZEN1cnZlOiJQLTM4NCJ9LG49ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJFUzUxMiI6dD17bmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6IlAtNTIxIn0sbj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIkVDREgtRVMiOmNhc2UiRUNESC1FUytBMTI4S1ciOmNhc2UiRUNESC1FUytBMTkyS1ciOmNhc2UiRUNESC1FUytBMjU2S1ciOnQ9e25hbWU6IkVDREgiLG5hbWVkQ3VydmU6ZS5jcnZ9LG49ZS5kP1siZGVyaXZlQml0cyJdOltdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFdyKCdJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIEpXSyAiYWxnIiAoQWxnb3JpdGhtKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztjYXNlIFpyKCkmJiJPS1AiOmlmKCJFZERTQSIhPT1lLmFsZyl0aHJvdyBuZXcgV3IoJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpO2lmKCJFZDI1NTE5IiE9PWUuY3J2KXRocm93IG5ldyBXcignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImNydiIgKFN1YnR5cGUgb2YgS2V5IFBhaXIpIFBhcmFtZXRlciB2YWx1ZScpO3Q9e25hbWU6Ik5PREUtRUQyNTUxOSIsbmFtZWRDdXJ2ZToiTk9ERS1FRDI1NTE5In0sbj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBXcignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImt0eSIgKEtleSBUeXBlKSBQYXJhbWV0ZXIgdmFsdWUnKX1yZXR1cm57YWxnb3JpdGhtOnQsa2V5VXNhZ2VzOm59fShlKSxvPVtyLG51bGwhPT0odD1lLmV4dCkmJnZvaWQgMCE9PXQmJnQsbnVsbCE9PShuPWUua2V5X29wcykmJnZvaWQgMCE9PW4/bjppXTtpZigiUEJLREYyIj09PXIubmFtZSlyZXR1cm4gTXIuc3VidGxlLmltcG9ydEtleSgicmF3IixxcihlLmspLC4uLm8pO2NvbnN0IHM9ey4uLmV9O3JldHVybiBkZWxldGUgcy5hbGcsTXIuc3VidGxlLmltcG9ydEtleSgiandrIixzLC4uLm8pfTtjb25zdCB1aT0oZSx0LG4pPT57ZS5zdGFydHNXaXRoKCJIUyIpfHwiZGlyIj09PWV8fGUuc3RhcnRzV2l0aCgiUEJFUzIiKXx8L15BXGR7M30oPzpHQ00pP0tXJC8udGVzdChlKT8oZT0+e2lmKCEoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXtpZighb2koZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihpaShlLC4uLnNpLCJVaW50OEFycmF5IikpO2lmKCJzZWNyZXQiIT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoIiIuY29uY2F0KHNpLmpvaW4oIiBvciAiKSwnIGluc3RhbmNlcyBmb3Igc3ltbWV0cmljIGFsZ29yaXRobXMgbXVzdCBiZSBvZiB0eXBlICJzZWNyZXQiJykpfX0pKHQpOigoZSx0KT0+e2lmKCFvaShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKGlpKGUsLi4uc2kpKTtpZigic2VjcmV0Ij09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCIiLmNvbmNhdChzaS5qb2luKCIgb3IgIiksJyBpbnN0YW5jZXMgZm9yIGFzeW1tZXRyaWMgYWxnb3JpdGhtcyBtdXN0IG5vdCBiZSBvZiB0eXBlICJzZWNyZXQiJykpO2lmKCJzaWduIj09PXQmJiJwdWJsaWMiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoIiIuY29uY2F0KHNpLmpvaW4oIiBvciAiKSwnIGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG0gc2lnbmluZyBtdXN0IGJlIG9mIHR5cGUgInByaXZhdGUiJykpO2lmKCJkZWNyeXB0Ij09PXQmJiJwdWJsaWMiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoIiIuY29uY2F0KHNpLmpvaW4oIiBvciAiKSwnIGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG0gZGVjcnlwdGlvbiBtdXN0IGJlIG9mIHR5cGUgInByaXZhdGUiJykpO2lmKGUuYWxnb3JpdGhtJiYidmVyaWZ5Ij09PXQmJiJwcml2YXRlIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCIiLmNvbmNhdChzaS5qb2luKCIgb3IgIiksJyBpbnN0YW5jZXMgZm9yIGFzeW1tZXRyaWMgYWxnb3JpdGhtIHZlcmlmeWluZyBtdXN0IGJlIG9mIHR5cGUgInB1YmxpYyInKSk7aWYoZS5hbGdvcml0aG0mJiJlbmNyeXB0Ij09PXQmJiJwcml2YXRlIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCIiLmNvbmNhdChzaS5qb2luKCIgb3IgIiksJyBpbnN0YW5jZXMgZm9yIGFzeW1tZXRyaWMgYWxnb3JpdGhtIGVuY3J5cHRpb24gbXVzdCBiZSBvZiB0eXBlICJwdWJsaWMiJykpfSkodCxuKX07ZnVuY3Rpb24gbGkoZSx0LG4pe2lmKE5yKHQpKXJldHVybiBmdW5jdGlvbihlLHQpe3N3aXRjaCh0KXtjYXNlIkhTMjU2IjpjYXNlIkhTMzg0IjpjYXNlIkhTNTEyIjp7aWYoIWVpKGUuYWxnb3JpdGhtLCJITUFDIikpdGhyb3cgUXIoIkhNQUMiKTtjb25zdCBuPXBhcnNlSW50KHQuc2xpY2UoMiksMTApO2lmKHRpKGUuYWxnb3JpdGhtLmhhc2gpIT09bil0aHJvdyBRcigiU0hBLSIuY29uY2F0KG4pLCJhbGdvcml0aG0uaGFzaCIpO2JyZWFrfWNhc2UiUlMyNTYiOmNhc2UiUlMzODQiOmNhc2UiUlM1MTIiOntpZighZWkoZS5hbGdvcml0aG0sIlJTQVNTQS1QS0NTMS12MV81IikpdGhyb3cgUXIoIlJTQVNTQS1QS0NTMS12MV81Iik7Y29uc3Qgbj1wYXJzZUludCh0LnNsaWNlKDIpLDEwKTtpZih0aShlLmFsZ29yaXRobS5oYXNoKSE9PW4pdGhyb3cgUXIoIlNIQS0iLmNvbmNhdChuKSwiYWxnb3JpdGhtLmhhc2giKTticmVha31jYXNlIlBTMjU2IjpjYXNlIlBTMzg0IjpjYXNlIlBTNTEyIjp7aWYoIWVpKGUuYWxnb3JpdGhtLCJSU0EtUFNTIikpdGhyb3cgUXIoIlJTQS1QU1MiKTtjb25zdCBuPXBhcnNlSW50KHQuc2xpY2UoMiksMTApO2lmKHRpKGUuYWxnb3JpdGhtLmhhc2gpIT09bil0aHJvdyBRcigiU0hBLSIuY29uY2F0KG4pLCJhbGdvcml0aG0uaGFzaCIpO2JyZWFrfWNhc2UgWnIoKSYmIkVkRFNBIjppZighZWkoZS5hbGdvcml0aG0sIk5PREUtRUQyNTUxOSIpKXRocm93IFFyKCJOT0RFLUVEMjU1MTkiKTticmVhaztjYXNlIkVTMjU2IjpjYXNlIkVTMzg0IjpjYXNlIkVTNTEyIjp7aWYoIWVpKGUuYWxnb3JpdGhtLCJFQ0RTQSIpKXRocm93IFFyKCJFQ0RTQSIpO2NvbnN0IG49bmkodCk7aWYoZS5hbGdvcml0aG0ubmFtZWRDdXJ2ZSE9PW4pdGhyb3cgUXIobiwiYWxnb3JpdGhtLm5hbWVkQ3VydmUiKTticmVha31kZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIkNyeXB0b0tleSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uIil9Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4yP24tMjowKSxpPTI7aTxuO2krKylyW2ktMl09YXJndW1lbnRzW2ldO3JpKGUscil9KHQsZSxuKSx0O2lmKHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtpZighZS5zdGFydHNXaXRoKCJIUyIpKXRocm93IG5ldyBUeXBlRXJyb3IoaWkodCwuLi5zaSkpO3JldHVybiBNci5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLHQse2hhc2g6IlNIQS0iLmNvbmNhdChlLnNsaWNlKC0zKSksbmFtZToiSE1BQyJ9LCExLFtuXSl9dGhyb3cgbmV3IFR5cGVFcnJvcihpaSh0LC4uLnNpLCJVaW50OEFycmF5IikpfWNvbnN0IGRpPWFzeW5jKGUsdCxuLHIpPT57Y29uc3QgaT1hd2FpdCBsaShlLHQsInZlcmlmeSIpOygoZSx0KT0+e2lmKGUuc3RhcnRzV2l0aCgiUlMiKXx8ZS5zdGFydHNXaXRoKCJQUyIpKXtjb25zdHttb2R1bHVzTGVuZ3RoOm59PXQuYWxnb3JpdGhtO2lmKCJudW1iZXIiIT10eXBlb2Ygbnx8bjwyMDQ4KXRocm93IG5ldyBUeXBlRXJyb3IoIiIuY29uY2F0KGUsIiByZXF1aXJlcyBrZXkgbW9kdWx1c0xlbmd0aCB0byBiZSAyMDQ4IGJpdHMgb3IgbGFyZ2VyIikpfX0pKGUsaSk7Y29uc3Qgbz1mdW5jdGlvbihlLHQpe2NvbnN0IG49IlNIQS0iLmNvbmNhdChlLnNsaWNlKC0zKSk7c3dpdGNoKGUpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOnJldHVybntoYXNoOm4sbmFtZToiSE1BQyJ9O2Nhc2UiUFMyNTYiOmNhc2UiUFMzODQiOmNhc2UiUFM1MTIiOnJldHVybntoYXNoOm4sbmFtZToiUlNBLVBTUyIsc2FsdExlbmd0aDplLnNsaWNlKC0zKT4+M307Y2FzZSJSUzI1NiI6Y2FzZSJSUzM4NCI6Y2FzZSJSUzUxMiI6cmV0dXJue2hhc2g6bixuYW1lOiJSU0FTU0EtUEtDUzEtdjFfNSJ9O2Nhc2UiRVMyNTYiOmNhc2UiRVMzODQiOmNhc2UiRVM1MTIiOnJldHVybntoYXNoOm4sbmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6dC5uYW1lZEN1cnZlfTtjYXNlIFpyKCkmJiJFZERTQSI6Y29uc3R7bmFtZWRDdXJ2ZTpyfT10O3JldHVybntuYW1lOnIsbmFtZWRDdXJ2ZTpyfTtkZWZhdWx0OnRocm93IG5ldyBXcigiYWxnICIuY29uY2F0KGUsIiBpcyBub3Qgc3VwcG9ydGVkIGVpdGhlciBieSBKT1NFIG9yIHlvdXIgamF2YXNjcmlwdCBydW50aW1lIikpfX0oZSxpLmFsZ29yaXRobSk7dHJ5e3JldHVybiBhd2FpdCBNci5zdWJ0bGUudmVyaWZ5KG8saSxuLHIpfWNhdGNoKGUpe3JldHVybiExfX07YXN5bmMgZnVuY3Rpb24gaGkoZSx0LG4pe3ZhciByO2lmKCFhaShlKSl0aHJvdyBuZXcgenIoIkZsYXR0ZW5lZCBKV1MgbXVzdCBiZSBhbiBvYmplY3QiKTtpZih2b2lkIDA9PT1lLnByb3RlY3RlZCYmdm9pZCAwPT09ZS5oZWFkZXIpdGhyb3cgbmV3IHpyKCdGbGF0dGVuZWQgSldTIG11c3QgaGF2ZSBlaXRoZXIgb2YgdGhlICJwcm90ZWN0ZWQiIG9yICJoZWFkZXIiIG1lbWJlcnMnKTtpZih2b2lkIDAhPT1lLnByb3RlY3RlZCYmInN0cmluZyIhPXR5cGVvZiBlLnByb3RlY3RlZCl0aHJvdyBuZXcgenIoIkpXUyBQcm90ZWN0ZWQgSGVhZGVyIGluY29ycmVjdCB0eXBlIik7aWYodm9pZCAwPT09ZS5wYXlsb2FkKXRocm93IG5ldyB6cigiSldTIFBheWxvYWQgbWlzc2luZyIpO2lmKCJzdHJpbmciIT10eXBlb2YgZS5zaWduYXR1cmUpdGhyb3cgbmV3IHpyKCJKV1MgU2lnbmF0dXJlIG1pc3Npbmcgb3IgaW5jb3JyZWN0IHR5cGUiKTtpZih2b2lkIDAhPT1lLmhlYWRlciYmIWFpKGUuaGVhZGVyKSl0aHJvdyBuZXcgenIoIkpXUyBVbnByb3RlY3RlZCBIZWFkZXIgaW5jb3JyZWN0IHR5cGUiKTtsZXQgaT17fTtpZihlLnByb3RlY3RlZCl7Y29uc3QgdD1xcihlLnByb3RlY3RlZCk7dHJ5e2k9SlNPTi5wYXJzZSh4ci5kZWNvZGUodCkpfWNhdGNoKGUpe3Rocm93IG5ldyB6cigiSldTIFByb3RlY3RlZCBIZWFkZXIgaXMgaW52YWxpZCIpfX1pZighZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtjb25zdCByPXQuZmlsdGVyKEJvb2xlYW4pO2lmKDA9PT1yLmxlbmd0aHx8MT09PXIubGVuZ3RoKXJldHVybiEwO2xldCBpO2Zvcihjb25zdCBlIG9mIHIpe2NvbnN0IHQ9T2JqZWN0LmtleXMoZSk7aWYoaSYmMCE9PWkuc2l6ZSlmb3IoY29uc3QgZSBvZiB0KXtpZihpLmhhcyhlKSlyZXR1cm4hMTtpLmFkZChlKX1lbHNlIGk9bmV3IFNldCh0KX1yZXR1cm4hMH0oaSxlLmhlYWRlcikpdGhyb3cgbmV3IHpyKCJKV1MgUHJvdGVjdGVkIGFuZCBKV1MgVW5wcm90ZWN0ZWQgSGVhZGVyIFBhcmFtZXRlciBuYW1lcyBtdXN0IGJlIGRpc2pvaW50Iik7Y29uc3Qgbz17Li4uaSwuLi5lLmhlYWRlcn0scz1mdW5jdGlvbihlLHQsbixyLGkpe2lmKHZvaWQgMCE9PWkuY3JpdCYmdm9pZCAwPT09ci5jcml0KXRocm93IG5ldyBlKCciY3JpdCIgKENyaXRpY2FsKSBIZWFkZXIgUGFyYW1ldGVyIE1VU1QgYmUgaW50ZWdyaXR5IHByb3RlY3RlZCcpO2lmKCFyfHx2b2lkIDA9PT1yLmNyaXQpcmV0dXJuIG5ldyBTZXQ7aWYoIUFycmF5LmlzQXJyYXkoci5jcml0KXx8MD09PXIuY3JpdC5sZW5ndGh8fHIuY3JpdC5zb21lKChlPT4ic3RyaW5nIiE9dHlwZW9mIGV8fDA9PT1lLmxlbmd0aCkpKXRocm93IG5ldyBlKCciY3JpdCIgKENyaXRpY2FsKSBIZWFkZXIgUGFyYW1ldGVyIE1VU1QgYmUgYW4gYXJyYXkgb2Ygbm9uLWVtcHR5IHN0cmluZ3Mgd2hlbiBwcmVzZW50Jyk7bGV0IG87bz12b2lkIDAhPT1uP25ldyBNYXAoWy4uLk9iamVjdC5lbnRyaWVzKG4pLC4uLnQuZW50cmllcygpXSk6dDtmb3IoY29uc3QgdCBvZiByLmNyaXQpe2lmKCFvLmhhcyh0KSl0aHJvdyBuZXcgV3IoJ0V4dGVuc2lvbiBIZWFkZXIgUGFyYW1ldGVyICInLmNvbmNhdCh0LCciIGlzIG5vdCByZWNvZ25pemVkJykpO2lmKHZvaWQgMD09PWlbdF0pdGhyb3cgbmV3IGUoJ0V4dGVuc2lvbiBIZWFkZXIgUGFyYW1ldGVyICInLmNvbmNhdCh0LCciIGlzIG1pc3NpbmcnKSk7aWYoby5nZXQodCkmJnZvaWQgMD09PXJbdF0pdGhyb3cgbmV3IGUoJ0V4dGVuc2lvbiBIZWFkZXIgUGFyYW1ldGVyICInLmNvbmNhdCh0LCciIE1VU1QgYmUgaW50ZWdyaXR5IHByb3RlY3RlZCcpKX1yZXR1cm4gbmV3IFNldChyLmNyaXQpfSh6cixuZXcgTWFwKFtbImI2NCIsITBdXSksbnVsbD09bj92b2lkIDA6bi5jcml0LGksbyk7bGV0IGE9ITA7aWYocy5oYXMoImI2NCIpJiYoYT1pLmI2NCwiYm9vbGVhbiIhPXR5cGVvZiBhKSl0aHJvdyBuZXcgenIoJ1RoZSAiYjY0IiAoYmFzZTY0dXJsLWVuY29kZSBwYXlsb2FkKSBIZWFkZXIgUGFyYW1ldGVyIG11c3QgYmUgYSBib29sZWFuJyk7Y29uc3R7YWxnOmN9PW87aWYoInN0cmluZyIhPXR5cGVvZiBjfHwhYyl0aHJvdyBuZXcgenIoJ0pXUyAiYWxnIiAoQWxnb3JpdGhtKSBIZWFkZXIgUGFyYW1ldGVyIG1pc3Npbmcgb3IgaW52YWxpZCcpO2NvbnN0IHU9biYmKChlLHQpPT57aWYodm9pZCAwIT09dCYmKCFBcnJheS5pc0FycmF5KHQpfHx0LnNvbWUoKGU9PiJzdHJpbmciIT10eXBlb2YgZSkpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciJy5jb25jYXQoZSwnIiBvcHRpb24gbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJykpO2lmKHQpcmV0dXJuIG5ldyBTZXQodCl9KSgiYWxnb3JpdGhtcyIsbi5hbGdvcml0aG1zKTtpZih1JiYhdS5oYXMoYykpdGhyb3cgbmV3IEpyKCciYWxnIiAoQWxnb3JpdGhtKSBIZWFkZXIgUGFyYW1ldGVyIG5vdCBhbGxvd2VkJyk7aWYoYSl7aWYoInN0cmluZyIhPXR5cGVvZiBlLnBheWxvYWQpdGhyb3cgbmV3IHpyKCJKV1MgUGF5bG9hZCBtdXN0IGJlIGEgc3RyaW5nIil9ZWxzZSBpZigic3RyaW5nIiE9dHlwZW9mIGUucGF5bG9hZCYmIShlLnBheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSl0aHJvdyBuZXcgenIoIkpXUyBQYXlsb2FkIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gVWludDhBcnJheSBpbnN0YW5jZSIpO2xldCBsPSExOyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD1hd2FpdCB0KGksZSksbD0hMCksdWkoYyx0LCJ2ZXJpZnkiKTtjb25zdCBkPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07Y29uc3Qgcj10LnJlZHVjZSgoKGUsdCk9PntsZXR7bGVuZ3RoOm59PXQ7cmV0dXJuIGUrbn0pLDApLGk9bmV3IFVpbnQ4QXJyYXkocik7bGV0IG89MDtyZXR1cm4gdC5mb3JFYWNoKChlPT57aS5zZXQoZSxvKSxvKz1lLmxlbmd0aH0pKSxpfShqci5lbmNvZGUobnVsbCE9PShyPWUucHJvdGVjdGVkKSYmdm9pZCAwIT09cj9yOiIiKSxqci5lbmNvZGUoIi4iKSwic3RyaW5nIj09dHlwZW9mIGUucGF5bG9hZD9qci5lbmNvZGUoZS5wYXlsb2FkKTplLnBheWxvYWQpLGg9cXIoZS5zaWduYXR1cmUpO2lmKCFhd2FpdCBkaShjLHQsaCxkKSl0aHJvdyBuZXcgJHI7bGV0IGY7Zj1hP3FyKGUucGF5bG9hZCk6InN0cmluZyI9PXR5cGVvZiBlLnBheWxvYWQ/anIuZW5jb2RlKGUucGF5bG9hZCk6ZS5wYXlsb2FkO2NvbnN0IHA9e3BheWxvYWQ6Zn07cmV0dXJuIHZvaWQgMCE9PWUucHJvdGVjdGVkJiYocC5wcm90ZWN0ZWRIZWFkZXI9aSksdm9pZCAwIT09ZS5oZWFkZXImJihwLnVucHJvdGVjdGVkSGVhZGVyPWUuaGVhZGVyKSxsP3suLi5wLGtleTp0fTpwfXZhciBmaT1lPT5NYXRoLmZsb29yKGUuZ2V0VGltZSgpLzFlMyk7Y29uc3QgcGk9ODY0MDAsZ2k9L14oXGQrfFxkK1wuXGQrKSA/KHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSkkL2k7dmFyIHlpPWU9Pntjb25zdCB0PWdpLmV4ZWMoZSk7aWYoIXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCB0aW1lIHBlcmlvZCBmb3JtYXQiKTtjb25zdCBuPXBhcnNlRmxvYXQodFsxXSk7c3dpdGNoKHRbMl0udG9Mb3dlckNhc2UoKSl7Y2FzZSJzZWMiOmNhc2Uic2VjcyI6Y2FzZSJzZWNvbmQiOmNhc2Uic2Vjb25kcyI6Y2FzZSJzIjpyZXR1cm4gTWF0aC5yb3VuZChuKTtjYXNlIm1pbnV0ZSI6Y2FzZSJtaW51dGVzIjpjYXNlIm1pbiI6Y2FzZSJtaW5zIjpjYXNlIm0iOnJldHVybiBNYXRoLnJvdW5kKDYwKm4pO2Nhc2UiaG91ciI6Y2FzZSJob3VycyI6Y2FzZSJociI6Y2FzZSJocnMiOmNhc2UiaCI6cmV0dXJuIE1hdGgucm91bmQoMzYwMCpuKTtjYXNlImRheSI6Y2FzZSJkYXlzIjpjYXNlImQiOnJldHVybiBNYXRoLnJvdW5kKG4qcGkpO2Nhc2Uid2VlayI6Y2FzZSJ3ZWVrcyI6Y2FzZSJ3IjpyZXR1cm4gTWF0aC5yb3VuZCg2MDQ4MDAqbik7ZGVmYXVsdDpyZXR1cm4gTWF0aC5yb3VuZCgzMTU1NzYwMCpuKX19O2NvbnN0IHZpPWU9PmUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9eYXBwbGljYXRpb25cLy8sIiIpLG1pPShlLHQpPT4ic3RyaW5nIj09dHlwZW9mIGU/dC5pbmNsdWRlcyhlKTohIUFycmF5LmlzQXJyYXkoZSkmJnQuc29tZShTZXQucHJvdG90eXBlLmhhcy5iaW5kKG5ldyBTZXQoZSkpKTthc3luYyBmdW5jdGlvbiB3aShlLHQsbil7dmFyIHI7Y29uc3QgaT1hd2FpdCBhc3luYyBmdW5jdGlvbihlLHQsbil7aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJihlPXhyLmRlY29kZShlKSksInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyB6cigiQ29tcGFjdCBKV1MgbXVzdCBiZSBhIHN0cmluZyBvciBVaW50OEFycmF5Iik7Y29uc3R7MDpyLDE6aSwyOm8sbGVuZ3RoOnN9PWUuc3BsaXQoIi4iKTtpZigzIT09cyl0aHJvdyBuZXcgenIoIkludmFsaWQgQ29tcGFjdCBKV1MiKTtjb25zdCBhPWF3YWl0IGhpKHtwYXlsb2FkOmkscHJvdGVjdGVkOnIsc2lnbmF0dXJlOm99LHQsbiksYz17cGF5bG9hZDphLnBheWxvYWQscHJvdGVjdGVkSGVhZGVyOmEucHJvdGVjdGVkSGVhZGVyfTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD97Li4uYyxrZXk6YS5rZXl9OmN9KGUsdCxuKTtpZigobnVsbD09PShyPWkucHJvdGVjdGVkSGVhZGVyLmNyaXQpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmluY2x1ZGVzKCJiNjQiKSkmJiExPT09aS5wcm90ZWN0ZWRIZWFkZXIuYjY0KXRocm93IG5ldyBWcigiSldUcyBNVVNUIE5PVCB1c2UgdW5lbmNvZGVkIHBheWxvYWQiKTtjb25zdCBvPWZ1bmN0aW9uKGUsdCl7bGV0IG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O2NvbnN0e3R5cDpyfT1uO2lmKHImJigic3RyaW5nIiE9dHlwZW9mIGUudHlwfHx2aShlLnR5cCkhPT12aShyKSkpdGhyb3cgbmV3IEZyKCd1bmV4cGVjdGVkICJ0eXAiIEpXVCBoZWFkZXIgdmFsdWUnLCJ0eXAiLCJjaGVja19mYWlsZWQiKTtsZXQgaTt0cnl7aT1KU09OLnBhcnNlKHhyLmRlY29kZSh0KSl9Y2F0Y2goZSl7fWlmKCFhaShpKSl0aHJvdyBuZXcgVnIoIkpXVCBDbGFpbXMgU2V0IG11c3QgYmUgYSB0b3AtbGV2ZWwgSlNPTiBvYmplY3QiKTtjb25zdHtpc3N1ZXI6b309bjtpZihvJiYhKEFycmF5LmlzQXJyYXkobyk/bzpbb10pLmluY2x1ZGVzKGkuaXNzKSl0aHJvdyBuZXcgRnIoJ3VuZXhwZWN0ZWQgImlzcyIgY2xhaW0gdmFsdWUnLCJpc3MiLCJjaGVja19mYWlsZWQiKTtjb25zdHtzdWJqZWN0OnN9PW47aWYocyYmaS5zdWIhPT1zKXRocm93IG5ldyBGcigndW5leHBlY3RlZCAic3ViIiBjbGFpbSB2YWx1ZScsInN1YiIsImNoZWNrX2ZhaWxlZCIpO2NvbnN0e2F1ZGllbmNlOmF9PW47aWYoYSYmIW1pKGkuYXVkLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSkpdGhyb3cgbmV3IEZyKCd1bmV4cGVjdGVkICJhdWQiIGNsYWltIHZhbHVlJywiYXVkIiwiY2hlY2tfZmFpbGVkIik7bGV0IGM7c3dpdGNoKHR5cGVvZiBuLmNsb2NrVG9sZXJhbmNlKXtjYXNlInN0cmluZyI6Yz15aShuLmNsb2NrVG9sZXJhbmNlKTticmVhaztjYXNlIm51bWJlciI6Yz1uLmNsb2NrVG9sZXJhbmNlO2JyZWFrO2Nhc2UidW5kZWZpbmVkIjpjPTA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGNsb2NrVG9sZXJhbmNlIG9wdGlvbiB0eXBlIil9Y29uc3R7Y3VycmVudERhdGU6dX09bixsPWZpKHV8fG5ldyBEYXRlKTtpZigodm9pZCAwIT09aS5pYXR8fG4ubWF4VG9rZW5BZ2UpJiYibnVtYmVyIiE9dHlwZW9mIGkuaWF0KXRocm93IG5ldyBGcignImlhdCIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsImlhdCIsImludmFsaWQiKTtpZih2b2lkIDAhPT1pLm5iZil7aWYoIm51bWJlciIhPXR5cGVvZiBpLm5iZil0aHJvdyBuZXcgRnIoJyJuYmYiIGNsYWltIG11c3QgYmUgYSBudW1iZXInLCJuYmYiLCJpbnZhbGlkIik7aWYoaS5uYmY+bCtjKXRocm93IG5ldyBGcignIm5iZiIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCcsIm5iZiIsImNoZWNrX2ZhaWxlZCIpfWlmKHZvaWQgMCE9PWkuZXhwKXtpZigibnVtYmVyIiE9dHlwZW9mIGkuZXhwKXRocm93IG5ldyBGcignImV4cCIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsImV4cCIsImludmFsaWQiKTtpZihpLmV4cDw9bC1jKXRocm93IG5ldyBLcignImV4cCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCcsImV4cCIsImNoZWNrX2ZhaWxlZCIpfWlmKG4ubWF4VG9rZW5BZ2Upe2NvbnN0IGU9bC1pLmlhdDtpZihlLWM+KCJudW1iZXIiPT10eXBlb2Ygbi5tYXhUb2tlbkFnZT9uLm1heFRva2VuQWdlOnlpKG4ubWF4VG9rZW5BZ2UpKSl0aHJvdyBuZXcgS3IoJyJpYXQiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQgKHRvbyBmYXIgaW4gdGhlIHBhc3QpJywiaWF0IiwiY2hlY2tfZmFpbGVkIik7aWYoZTwwLWMpdGhyb3cgbmV3IEZyKCciaWF0IiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkIChpdCBzaG91bGQgYmUgaW4gdGhlIHBhc3QpJywiaWF0IiwiY2hlY2tfZmFpbGVkIil9cmV0dXJuIGl9KGkucHJvdGVjdGVkSGVhZGVyLGkucGF5bG9hZCxuKSxzPXtwYXlsb2FkOm8scHJvdGVjdGVkSGVhZGVyOmkucHJvdGVjdGVkSGVhZGVyfTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD97Li4ucyxrZXk6aS5rZXl9OnN9ZnVuY3Rpb24gYmkoZSl7cmV0dXJuIGFpKGUpfWNsYXNzIF9pe2NvbnN0cnVjdG9yKGUpe2lmKHRoaXMuX2NhY2hlZD1uZXcgV2Vha01hcCwhZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmQXJyYXkuaXNBcnJheShlLmtleXMpJiZlLmtleXMuZXZlcnkoYmkpfShlKSl0aHJvdyBuZXcgWXIoIkpTT04gV2ViIEtleSBTZXQgbWFsZm9ybWVkIik7dmFyIHQ7dGhpcy5fandrcz0odD1lLCJmdW5jdGlvbiI9PXR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmU/c3RydWN0dXJlZENsb25lKHQpOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodCkpKX1hc3luYyBnZXRLZXkoZSx0KXtjb25zdHthbGc6bixraWQ6cn09ey4uLmUsLi4udC5oZWFkZXJ9LGk9ZnVuY3Rpb24oZSl7c3dpdGNoKCJzdHJpbmciPT10eXBlb2YgZSYmZS5zbGljZSgwLDIpKXtjYXNlIlJTIjpjYXNlIlBTIjpyZXR1cm4iUlNBIjtjYXNlIkVTIjpyZXR1cm4iRUMiO2Nhc2UiRWQiOnJldHVybiJPS1AiO2RlZmF1bHQ6dGhyb3cgbmV3IFdyKCdVbnN1cHBvcnRlZCAiYWxnIiB2YWx1ZSBmb3IgYSBKU09OIFdlYiBLZXkgU2V0Jyl9fShuKSxvPXRoaXMuX2p3a3Mua2V5cy5maWx0ZXIoKGU9PntsZXQgdD1pPT09ZS5rdHk7aWYodCYmInN0cmluZyI9PXR5cGVvZiByJiYodD1yPT09ZS5raWQpLHQmJiJzdHJpbmciPT10eXBlb2YgZS5hbGcmJih0PW49PT1lLmFsZyksdCYmInN0cmluZyI9PXR5cGVvZiBlLnVzZSYmKHQ9InNpZyI9PT1lLnVzZSksdCYmQXJyYXkuaXNBcnJheShlLmtleV9vcHMpJiYodD1lLmtleV9vcHMuaW5jbHVkZXMoInZlcmlmeSIpKSx0JiYiRWREU0EiPT09biYmKHQ9IkVkMjU1MTkiPT09ZS5jcnZ8fCJFZDQ0OCI9PT1lLmNydiksdClzd2l0Y2gobil7Y2FzZSJFUzI1NiI6dD0iUC0yNTYiPT09ZS5jcnY7YnJlYWs7Y2FzZSJFUzI1NksiOnQ9InNlY3AyNTZrMSI9PT1lLmNydjticmVhaztjYXNlIkVTMzg0Ijp0PSJQLTM4NCI9PT1lLmNydjticmVhaztjYXNlIkVTNTEyIjp0PSJQLTUyMSI9PT1lLmNydn1yZXR1cm4gdH0pKSx7MDpzLGxlbmd0aDphfT1vO2lmKDA9PT1hKXRocm93IG5ldyBHcjtpZigxIT09YSl0aHJvdyBuZXcgWHI7Y29uc3QgYz10aGlzLl9jYWNoZWQuZ2V0KHMpfHx0aGlzLl9jYWNoZWQuc2V0KHMse30pLmdldChzKTtpZih2b2lkIDA9PT1jW25dKXtjb25zdCBlPWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUsdCxuKXtpZighYWkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSldLIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYodHx8KHQ9ZS5hbGcpLCJzdHJpbmciIT10eXBlb2YgdHx8IXQpdGhyb3cgbmV3IFR5cGVFcnJvcignImFsZyIgYXJndW1lbnQgaXMgcmVxdWlyZWQgd2hlbiAiandrLmFsZyIgaXMgbm90IHByZXNlbnQnKTtzd2l0Y2goZS5rdHkpe2Nhc2Uib2N0IjppZigic3RyaW5nIiE9dHlwZW9mIGUua3x8IWUuayl0aHJvdyBuZXcgVHlwZUVycm9yKCdtaXNzaW5nICJrIiAoS2V5IFZhbHVlKSBQYXJhbWV0ZXIgdmFsdWUnKTtyZXR1cm4gbnVsbCE9bnx8KG49ITAhPT1lLmV4dCksbj9jaSh7Li4uZSxhbGc6dCxleHQ6ITF9KTpxcihlLmspO2Nhc2UiUlNBIjppZih2b2lkIDAhPT1lLm90aCl0aHJvdyBuZXcgV3IoJ1JTQSBKV0sgIm90aCIgKE90aGVyIFByaW1lcyBJbmZvKSBQYXJhbWV0ZXIgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCcpO2Nhc2UiRUMiOmNhc2UiT0tQIjpyZXR1cm4gY2koey4uLmUsYWxnOnR9KTtkZWZhdWx0OnRocm93IG5ldyBXcignVW5zdXBwb3J0ZWQgImt0eSIgKEtleSBUeXBlKSBQYXJhbWV0ZXIgdmFsdWUnKX19KHsuLi5zLGV4dDohMH0sbik7aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fCJwdWJsaWMiIT09ZS50eXBlKXRocm93IG5ldyBZcigiSlNPTiBXZWIgS2V5IFNldCBtZW1iZXJzIG11c3QgYmUgcHVibGljIGtleXMiKTtjW25dPWV9cmV0dXJuIGNbbl19fXZhciBTaT17ZXhwb3J0czp7fX0sRWk9e2V4cG9ydHM6e319LFJpPUVyKHp0KTsKLyohIHNhZmUtYnVmZmVyLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovCiFmdW5jdGlvbihlLHQpe3ZhciBuPVJpLHI9bi5CdWZmZXI7ZnVuY3Rpb24gaShlLHQpe2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXX1mdW5jdGlvbiBvKGUsdCxuKXtyZXR1cm4gcihlLHQsbil9ci5mcm9tJiZyLmFsbG9jJiZyLmFsbG9jVW5zYWZlJiZyLmFsbG9jVW5zYWZlU2xvdz9lLmV4cG9ydHM9bjooaShuLHQpLHQuQnVmZmVyPW8pLG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpLGkocixvKSxvLmZyb209ZnVuY3Rpb24oZSx0LG4pe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlciIpO3JldHVybiByKGUsdCxuKX0sby5hbGxvYz1mdW5jdGlvbihlLHQsbil7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTt2YXIgaT1yKGUpO3JldHVybiB2b2lkIDAhPT10PyJzdHJpbmciPT10eXBlb2Ygbj9pLmZpbGwodCxuKTppLmZpbGwodCk6aS5maWxsKDApLGl9LG8uYWxsb2NVbnNhZmU9ZnVuY3Rpb24oZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gcihlKX0sby5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gbi5TbG93QnVmZmVyKGUpfX0oRWksRWkuZXhwb3J0cyk7dmFyIFRpPTY1NTM2LGtpPTQyOTQ5NjcyOTU7dmFyIEFpPUVpLmV4cG9ydHMuQnVmZmVyLENpPV9yLmNyeXB0b3x8X3IubXNDcnlwdG87Q2kmJkNpLmdldFJhbmRvbVZhbHVlcz9TaS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYoZT5raSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigicmVxdWVzdGVkIHRvbyBtYW55IHJhbmRvbSBieXRlcyIpO3ZhciBuPUFpLmFsbG9jVW5zYWZlKGUpO2lmKGU+MClpZihlPlRpKWZvcih2YXIgcj0wO3I8ZTtyKz1UaSlDaS5nZXRSYW5kb21WYWx1ZXMobi5zbGljZShyLHIrVGkpKTtlbHNlIENpLmdldFJhbmRvbVZhbHVlcyhuKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gUS5uZXh0VGljaygoZnVuY3Rpb24oKXt0KG51bGwsbil9KSk7cmV0dXJuIG59OlNpLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuXG5Vc2UgQ2hyb21lLCBGaXJlZm94IG9yIEludGVybmV0IEV4cGxvcmVyIDExIil9O3ZhciBEaT1TaS5leHBvcnRzO2NsYXNzIE9pe2Jhc2U2NFVSTEVuY29kZShlKXtyZXR1cm4gVXIuZW5jb2RlKGUpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIikucmVwbGFjZSgvPS9nLCIiKX1iYXNlNjRVUkxEZWNvZGUoZSl7cmV0dXJuIFVyLmRlY29kZShlKS50b1N0cmluZygpfWhhc2hTaGEyNTYoZSl7cmV0dXJuIGF0LmZyb20oSHIoKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpKSl9Z2VuZXJhdGVSYW5kb21CeXRlcyhlKXtyZXR1cm4gRGkoZSl9dmVyaWZ5Snd0KGUsdCxuLHIsaSxvLHMsYSl7Y29uc3QgdT17YWxnb3JpdGhtczpuLGF1ZGllbmNlOnIsY2xvY2tUb2xlcmFuY2U6cyxzdWJqZWN0Om99O3JldHVybihudWxsPT1hfHxhKSYmKHUuaXNzdWVyPWkpLHdpKGUsKGw9e2tleXM6W3RdfSxfaS5wcm90b3R5cGUuZ2V0S2V5LmJpbmQobmV3IF9pKGwpKSksdSkudGhlbigoKCk9PlByb21pc2UucmVzb2x2ZSghMCkpKS5jYXRjaCgoZT0+e3ZhciB0O3JldHVybiBQcm9taXNlLnJlamVjdChuZXcgYygiU1BBLUNSWVBUTy1VVElMUy1WSi1JVjAxIixudWxsIT09KHQ9bnVsbD09ZT92b2lkIDA6ZS5yZWFzb24pJiZ2b2lkIDAhPT10P3Q6SlNPTi5zdHJpbmdpZnkoZSksIiIuY29uY2F0KG51bGw9PWU/dm9pZCAwOmUuY29kZSwiICIpLmNvbmNhdChudWxsPT1lP3ZvaWQgMDplLmNsYWltKSkpfSkpO3ZhciBsfX0odD0+e2NvbnN0IG49c2VsZjtsZXQgcjtuLm9ubWVzc2FnZT1uPT57bGV0e2RhdGE6YSxwb3J0czp1fT1uO3JldHVybiBlKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgbixsLGQsaCxmLHA7Y29uc3Qgdj11WzBdO2lmKGEudHlwZT09PXl8fHIpc3dpdGNoKGEudHlwZSl7Y2FzZSB5OnRyeXtjb25zdCBuPU9iamVjdC5hc3NpZ24oe30sYS5kYXRhKTtyPXlpZWxkKCh0LG4pPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCByPW5ldyBicixpPW5ldyBPaSxvPW5ldyBnO3lpZWxkIG8uaW5pdGlhbGl6ZSh0LHIsaSk7Y29uc3Qgcz1uZXcgQShvKSxhPW4obyxzKSxjPW8uZ2V0RGF0YUxheWVyKCksdT13ci5nZXRJbnN0YW5jZSgpO3JldHVybihudWxsPT11P3ZvaWQgMDp1LmluaXQpJiYoeWllbGQgdS5pbml0KCEwLCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCBhLmF0dGFjaFRva2VuVG9SZXF1ZXN0Q29uZmlnKHQpfSkpKSkpLHtkaXNhYmxlSHR0cEhhbmRsZXI6KCk9PnthLmRpc2FibGVIdHRwSGFuZGxlcih1KX0sZW5hYmxlSHR0cEhhbmRsZXI6KCk9PnthLmVuYWJsZUh0dHBIYW5kbGVyKHUpfSxnZXRBY2Nlc3NUb2tlbjooKT0+YS5nZXRBY2Nlc3NUb2tlbigpLGdldEF1dGhvcml6YXRpb25VUkw6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG8uZ2V0QXV0aG9yaXphdGlvblVSTCh0KS50aGVuKCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgZTtjb25zdCBuPW51bGwhPT0oZT1uZXcgVVJMKHQpLnNlYXJjaFBhcmFtcy5nZXQoInN0YXRlIikpJiZ2b2lkIDAhPT1lP2U6IiIscj15aWVsZCBvLmdldFBLQ0VDb2RlKG4pO3JldHVybnthdXRob3JpemF0aW9uVVJMOnQscGtjZTpyfX0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpfSkpLGdldEJhc2ljVXNlckluZm86KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLmdldEJhc2ljVXNlckluZm8oKX0pKSxnZXRDb25maWdEYXRhOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYy5nZXRDb25maWdEYXRhKCl9KSksZ2V0Q3J5cHRvSGVscGVyOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYS5nZXRDcnlwdG9IZWxwZXIoKX0pKSxnZXREZWNvZGVkSURQSURUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuZ2V0RGVjb2RlZElEUElEVG9rZW4oKX0pKSxnZXREZWNvZGVkSURUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuZ2V0RGVjb2RlZElEVG9rZW4oKX0pKSxnZXRJRFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYS5nZXRJRFRva2VuKCl9KSksZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHM6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl9KSksZ2V0U2lnbk91dFVSTDooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIG8uZ2V0U2lnbk91dFVSTCgpfSkpLGh0dHBSZXF1ZXN0OnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCBhLmh0dHBSZXF1ZXN0KHUsdCl9KSksaHR0cFJlcXVlc3RBbGw6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIGEuaHR0cFJlcXVlc3RBbGwodCx1KX0pKSxpc0F1dGhlbnRpY2F0ZWQ6KCk9PmEuaXNBdXRoZW50aWNhdGVkKCkscmVmcmVzaEFjY2Vzc1Rva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0cnl7cmV0dXJuIHlpZWxkIGEucmVmcmVzaEFjY2Vzc1Rva2VuKCl9Y2F0Y2goZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfX0pKSxyZXF1ZXN0QWNjZXNzVG9rZW46KHQsbixyLGkpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgYS5yZXF1ZXN0QWNjZXNzVG9rZW4odCxuLHZvaWQgMCxyLGkpfSkpLHJlcXVlc3RDdXN0b21HcmFudDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgYS5yZXF1ZXN0Q3VzdG9tR3JhbnQodCl9KSkscmV2b2tlQWNjZXNzVG9rZW46KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgcy5nZXRSZWZyZXNoVGltZW91dFRpbWVyKCk7cmV0dXJuIG8ucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKCgoKT0+KHMuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KGUpLFByb21pc2UucmVzb2x2ZSghMCkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSl9KSksc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjazplPT57KG51bGw9PXU/dm9pZCAwOnUuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaykmJnUuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayhlKX0sc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrOmU9PnsobnVsbD09dT92b2lkIDA6dS5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2spJiZ1LnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayhlKX0sc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s6ZT0+eyhudWxsPT11P3ZvaWQgMDp1LnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKSYmdS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKX0sc2V0U2Vzc2lvblN0YXRlOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIGMuc2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoInNlc3Npb25fc3RhdGUiLHQpfSkpLHNpZ25PdXQ6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBzLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHlpZWxkIG8uZ2V0U2lnbk91dFVSTCgpfSkpLHN0YXJ0QXV0b1JlZnJlc2hUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cy5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSxzLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoYSl9KSksdXBkYXRlQ29uZmlnOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIG8udXBkYXRlQ29uZmlnKHQpfSkpfX0pKSkobix0KSxyLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2socyksci5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2soaSksci5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhvKSx2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSgpKX1jYXRjaChlKXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfYXV0aF91cmwiOnIuZ2V0QXV0aG9yaXphdGlvblVSTChudWxsPT1hP3ZvaWQgMDphLmRhdGEpLnRoZW4oKGU9Pnt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9Pnt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJyZXF1ZXN0X2dldF90b2tlbiI6ci5yZXF1ZXN0QWNjZXNzVG9rZW4obnVsbD09PShuPW51bGw9PWE/dm9pZCAwOmEuZGF0YSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uY29kZSxudWxsPT09KGw9bnVsbD09YT92b2lkIDA6YS5kYXRhKXx8dm9pZCAwPT09bD92b2lkIDA6bC5zZXNzaW9uU3RhdGUsbnVsbD09PShkPW51bGw9PWE/dm9pZCAwOmEuZGF0YSl8fHZvaWQgMD09PWQ/dm9pZCAwOmQucGtjZSxudWxsPT09KGg9bnVsbD09YT92b2lkIDA6YS5kYXRhKXx8dm9pZCAwPT09aD92b2lkIDA6aC5zdGF0ZSkudGhlbigoZT0+e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlImh0dHAtcmVxdWVzdCI6e2NvbnN0IGU9YS5kYXRhLHQ9bnVsbD09ZT92b2lkIDA6ZS5kYXRhO2lmKCEwPT09KG51bGw9PT0ocD1udWxsPT09KGY9YS5kYXRhKXx8dm9pZCAwPT09Zj92b2lkIDA6Zi5kYXRhKXx8dm9pZCAwPT09cD92b2lkIDA6cC5mb3JtRGF0YSkpe2NvbnN0IG49bmV3IEZvcm1EYXRhO2Zvcihjb25zdCBlIGluIHQpImZvcm1EYXRhIiE9PWUmJm4uYXBwZW5kKGUsdFtlXSk7ZS5kYXRhPW59ci5odHRwUmVxdWVzdChlKS50aGVuKChlPT57di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrfWNhc2UiaHR0cC1zdHJlYW0tcmVxdWVzdCI6e2NvbnN0IGU9YS5kYXRhO2UuYWRhcHRlcj0iZmV0Y2giLGUucmVzcG9uc2VUeXBlPSJzdHJlYW0iLHIuaHR0cFJlcXVlc3QoZSkudGhlbigoZT0+e3ZhciB0O2NvbnN0IG49bnVsbD09PSh0PWUpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmRhdGE7biBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtP3YucG9zdE1lc3NhZ2Uoe2RhdGE6bixzdWNjZXNzOiEwfSxbbl0pOnYucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVha31jYXNlImh0dHAtcmVxdWVzdC1hbGwiOnIuaHR0cFJlcXVlc3RBbGwoYS5kYXRhKS50aGVuKChlPT57di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2Uic2lnbi1vdXQiOnRyeXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLnNpZ25PdXQoKSkpfWNhdGNoKGUpe3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInJlcXVlc3QtY3VzdG9tLWdyYW50IjpyLnJlcXVlc3RDdXN0b21HcmFudChhLmRhdGEpLnRoZW4oKGU9Pnt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9Pnt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJyZXZva2UtYWNjZXNzLXRva2VuIjpyLnJldm9rZUFjY2Vzc1Rva2VuKCkudGhlbigoZT0+e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlImdldC1vaWRjLXNlcnZpY2UtZW5kcG9pbnRzIjp0cnl7di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5nZXRPSURDU2VydmljZUVuZHBvaW50cygpKSl9Y2F0Y2goZSl7di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZ2V0LWJhc2ljLXVzZXItaW5mbyI6dHJ5e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuZ2V0QmFzaWNVc2VySW5mbygpKSl9Y2F0Y2goZSl7di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZ2V0LWRlY29kZWQtaWQtdG9rZW4iOnRyeXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLmdldERlY29kZWRJRFRva2VuKCkpKX1jYXRjaChlKXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXQtY3J5cHRvLWhlbHBlciI6dHJ5e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuZ2V0Q3J5cHRvSGVscGVyKCkpKX1jYXRjaChlKXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfaWRfdG9rZW4iOnRyeXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLmdldElEVG9rZW4oKSkpfWNhdGNoKGUpe3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImVuYWJsZV9odHRwX2hhbmRsZXIiOnIuZW5hYmxlSHR0cEhhbmRsZXIoKSx2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSgpKTticmVhaztjYXNlImRpc2FibGVfaHR0cF9oYW5kbGVyIjpyLmRpc2FibGVIdHRwSGFuZGxlcigpLHYucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpO2JyZWFrO2Nhc2UiaXNfYXV0aGVudGljYXRlZCI6dHJ5e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuaXNBdXRoZW50aWNhdGVkKCkpKX1jYXRjaChlKXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfc2lnbl9vdXRfdXJsIjp0cnl7di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5nZXRTaWduT3V0VVJMKCkpKX1jYXRjaChlKXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJyZWZyZXNoX2FjY2Vzcy10b2tlbiI6dHJ5e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIucmVmcmVzaEFjY2Vzc1Rva2VuKCkpKX1jYXRjaChlKXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJzdGFydF9hdXRvX3JlZnJlc2hfdG9rZW4iOnRyeXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShyLnN0YXJ0QXV0b1JlZnJlc2hUb2tlbigpKSl9Y2F0Y2goZSl7di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2Uic2V0X3Nlc3Npb25fc3RhdGUiOnRyeXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLnNldFNlc3Npb25TdGF0ZShudWxsPT1hP3ZvaWQgMDphLmRhdGEpKSl9Y2F0Y2goZSl7di5wb3N0TWVzc2FnZShSLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UidXBkYXRlX2NvbmZpZyI6dHJ5e3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIudXBkYXRlQ29uZmlnKG51bGw9PWE/dm9pZCAwOmEuZGF0YSkpKX1jYXRjaChlKXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfY29uZmlnX2RhdGEiOnRyeXt2LnBvc3RNZXNzYWdlKFIuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLmdldENvbmZpZ0RhdGEoKSkpfWNhdGNoKGUpe3YucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztkZWZhdWx0Om51bGw9PXZ8fHYucG9zdE1lc3NhZ2UoUi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKG5ldyBjKCJTUEEtQ0xJRU5UX1dPUktFUi1PTk1TRy1JVjAyIiwiVGhlIG1lc3NhZ2UgdHlwZSBpcyBpbnZhbGlkLiIsIlRoZSBtZXNzYWdlIHR5cGUgcHJvdmlkZWQsICIuY29uY2F0KGEudHlwZSwiLCBpcyBpbnZhbGlkLiIpKSkpfWVsc2Ugdi5wb3N0TWVzc2FnZShSLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UobmV3IGMoIlNQQS1DTElFTlRfV09SS0VSLU9OTVNHLU5GMDEiLCJUaGUgd2ViIHdvcmtlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LiIsIlRoZSBpbml0aWFsaXplIG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIGNhbiBiZSBjYXJyaWVkIG91dC4iKSkpfSkpfTtjb25zdCBpPSgpPT57bi5wb3N0TWVzc2FnZSh7dHlwZToicmVxdWVzdC1zdGFydCJ9KX0sbz1lPT57dmFyIHQ7KG51bGw9PT0odD1lKXx8dm9pZCAwPT09dD92b2lkIDA6dC5kYXRhKWluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW18fG4ucG9zdE1lc3NhZ2Uoe2RhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSx0eXBlOiJyZXF1ZXN0LXN1Y2Nlc3MifSl9LHM9KCk9PntuLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXF1ZXN0LWZpbmlzaCJ9KX19KSgoKGUsdCk9Pm5ldyBrKGUsdCkpKTtyZXR1cm57fX0oKTsKCg==",$y=null,eX=!1,function(e){return tX=tX||_y(qy,$y,eX),new Worker(tX,e)});const nX="init",lX="sign-out",oX="http-request",cX="http-request-all",aX="http-stream-request",dX="request-custom-grant",sX="revoke-access-token",rX="request-start",uX="request-success",ZX="request-finish",bX="get-oidc-service-endpoints",hX="get-basic-user-info",mX="get-decoded-id-token",pX="get-crypto-helper",IX="enable_http_handler",gX="disable_http_handler",GX="get_auth_url",yX="request_get_token",XX="is_authenticated",VX="get_sign_out_url",WX="refresh_access-token",CX="refresh-access-token-error",RX="set_session_state",SX="start_auto_refresh_token",vX="update_config",fX="get_id_token",YX="check_session_signed_in",KX="check_session_signed_out",NX="get_config_data",JX="set_session_state_from_iframe",UX="token_request_config";var LX;e.Hooks=void 0,(LX=e.Hooks||(e.Hooks={})).SignIn="sign-in",LX.SignOut="sign-out",LX.Initialize="initialize",LX.HttpRequestStart="http-request-start",LX.HttpRequestFinish="http-request-finish",LX.HttpRequestError="http-request-error",LX.HttpRequestSuccess="http-request-success",LX.RevokeAccessToken="revoke-access-token",LX.CustomGrant="custom-grant",LX.SignOutFailed="sign-out-failed";const kX="rpIFrame",HX="promptNoneIFrame",TX="Y2hlY2tTZXNzaW9u",FX="sign-in-silently",xX="initialized-silent-sign-in",BX="promptNoneRequestSent",AX="error",zX="error_description",wX="custom_grant_config",PX="state",QX="Access token is invalid";var jX;e.Storage=void 0,(jX=e.Storage||(e.Storage={})).LocalStorage="localStorage",jX.SessionStorage="sessionStorage",jX.WebWorker="webWorker",jX.BrowserMemory="browserMemory";class MX{constructor(){}static generateSuccessMessage(e){return{blob:(null==e?void 0:e.data)instanceof Blob?null==e?void 0:e.data:null,data:JSON.stringify(null!=e?e:""),success:!0}}static generateFailureMessage(e){var t,i,n;const l=e?{code:null==e?void 0:e.code,config:null==e?void 0:e.config,isAxiosError:null==e?void 0:e.isAxiosError,message:null==e?void 0:e.message,name:null==e?void 0:e.name,request:null==e?void 0:e.request,response:(null==e?void 0:e.response)?{config:e.response.config,data:e.response.data,headers:e.response.headers,request:e.response.request,status:e.response.status,statusText:e.response.statusText}:void 0,status:null!==(n=null!==(t=null==e?void 0:e.status)&&void 0!==t?t:null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.status)&&void 0!==n?n:null}:"";return{error:JSON.stringify(l),success:!1}}}class EX{constructor(){}static removeAuthorizationCode(){const e=location.href;history.pushState({},document.title,e.replace(/\?code=.*$/,""))}static getPKCE(e){var t;return null!==(t=sessionStorage.getItem(e))&&void 0!==t?t:""}static setPKCE(e,t){sessionStorage.setItem(e,t)}static setSignOutURL(e,t,i){sessionStorage.setItem("".concat(xy,"-instance_").concat(i,"-").concat(t),e)}static getSignOutURL(e,t){var i;return null!==(i=sessionStorage.getItem("".concat(xy,"-instance_").concat(t,"-").concat(e)))&&void 0!==i?i:""}static removePKCE(e){sessionStorage.removeItem(e)}static canContinueSignIn(e,t){return!(e&&!EX.hasErrorInURL()&&!EX.hasAuthSearchParamsInURL()&&!t)}static isInitializedSilentSignIn(){return EX.isSilentStatePresentInURL()}static wasSignInCalled(){return!(!EX.hasErrorInURL()&&!EX.hasAuthSearchParamsInURL()||this.isSilentStatePresentInURL())}static wasSilentSignInCalled(){const e=sessionStorage.getItem(xX),t=e?JSON.parse(e):null;return Boolean(t)}static isSignOutSuccessful(){return Uy(this,void 0,void 0,(function*(){if(Oy.isSignOutSuccessful(window.location.href)){const e=window.location.href.split("?")[0];return history.pushState({},document.title,e),yield Oy.clearUserSessionData(),!0}return!1}))}static didSignOutFail(){if(Oy.didSignOutFail(window.location.href)){const e=new URL(window.location.href),t=e.searchParams.get(AX),i=e.searchParams.get(zX),n=window.location.href.split("?")[0];return history.pushState({},document.title,n),{description:null!=i?i:"",error:null!=t?t:""}}return!1}static isSilentStatePresentInURL(){var e;const t=new URL(window.location.href).searchParams.get("state");return null!==(e=null==t?void 0:t.includes(FX))&&void 0!==e&&e}static hasAuthSearchParamsInURL(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.location.search;return/[?&]code=[^&]+/.test(e)}static hasErrorInURL(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.location.href;const t=new URL(e);return!!t.searchParams.get(AX)&&t.searchParams.get(PX)!==By}static canSendPromptNoneRequest(){const e=sessionStorage.getItem(BX);return!(e?JSON.parse(e):null)}static setPromptNoneRequestSent(e){sessionStorage.setItem(BX,JSON.stringify(e))}static waitTillPageRedirect(e){return Uy(this,void 0,void 0,(function*(){const t=null!=e?e:3e3;yield new Promise((e=>setTimeout(e,1e3*t)))}))}}EX.until=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:500;const i=n=>e()?n():setTimeout((()=>i(n)),t);return new Promise(i)};class DX{constructor(e,t){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer(),this._spaHelper=t,this._instanceID=this._authenticationClient.getInstanceID(),this._isTokenRefreshing=!1}enableHttpHandler(e){(null==e?void 0:e.enableHandler)&&e.enableHandler()}disableHttpHandler(e){(null==e?void 0:e.disableHandler)&&e.disableHandler()}initializeSessionManger(e,t,i,n,l){var o,c,a;l.initialize(e.clientID,null!==(o=t.checkSessionIframe)&&void 0!==o?o:"",i,null!==(c=e.checkSessionInterval)&&void 0!==c?c:3,null!==(a=e.sessionRefreshInterval)&&void 0!==a?a:300,e.signInRedirectURL,n)}requestCustomGrant(e,t){var i,n,l;return Uy(this,void 0,void 0,(function*(){let o=!0,c=!1;if(null==e?void 0:e.tokenEndpoint){o=!1;for(const t of[...null!==(n=null===(i=yield this._dataLayer.getConfigData())||void 0===i?void 0:i.resourceServerURLs)&&void 0!==n?n:[],e.baseUrl])if(t&&(null===(l=e.tokenEndpoint)||void 0===l?void 0:l.startsWith(t))){c=!0;break}}return e.shouldReplayAfterRefresh&&this._dataLayer.setTemporaryDataParameter(wX,JSON.stringify(e)),o||c?this._authenticationClient.requestCustomGrant(e).then((i=>Uy(this,void 0,void 0,(function*(){return t&&"function"==typeof t&&t(e),e.returnsSession?(this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()):i})))).catch((e=>Promise.reject(e))):Promise.reject(new wy("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`"))}))}getCustomGrantConfigData(){return Uy(this,void 0,void 0,(function*(){const e=yield this._dataLayer.getTemporaryDataParameter(wX);return e?JSON.parse(e):null}))}refreshAccessToken(e){return Uy(this,void 0,void 0,(function*(){try{yield this._authenticationClient.refreshAccessToken();const t=yield this.getCustomGrantConfigData();return t&&(yield this.requestCustomGrant(t,e)),this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()}catch(e){const t={type:CX};return window.postMessage(t),Promise.reject(e)}}))}retryFailedRequests(e){return Uy(this,void 0,void 0,(function*(){const t=e.httpClient,i=e.requestConfig,n=e.isHttpHandlerEnabled,l=e.httpErrorCallback,o=e.httpFinishCallback;yield EX.until((()=>!this._isTokenRefreshing));try{const e=yield t.request(i);return Promise.resolve(e)}catch(e){return n&&("function"==typeof l&&(yield l(e)),"function"==typeof o&&o()),Promise.reject(e)}}))}httpRequest(e,t,i,n,l,o){var c,a;return Uy(this,void 0,void 0,(function*(){let d=!1;const s=yield this._dataLayer.getConfigData();for(const e of[...null!==(c=yield null==s?void 0:s.resourceServerURLs)&&void 0!==c?c:[],s.baseUrl])if(e&&(null===(a=null==t?void 0:t.url)||void 0===a?void 0:a.startsWith(e))){d=!0;break}return d?e.request(t).then((e=>Promise.resolve(e))).catch((c=>Uy(this,void 0,void 0,(function*(){var a,d,s;if(401===(null===(a=null==c?void 0:c.response)||void 0===a?void 0:a.status)||!(null==c?void 0:c.response)){if(this._isTokenRefreshing)return this.retryFailedRequests({enableRetrievingSignOutURLFromSession:o,httpClient:e,httpErrorCallback:n,httpFinishCallback:l,isHttpHandlerEnabled:i,requestConfig:t});let a;this._isTokenRefreshing=!0;try{a=yield this.refreshAccessToken(o),this._isTokenRefreshing=!1}catch(e){throw this._isTokenRefreshing=!1,i&&("function"==typeof n&&(yield n(Object.assign(Object.assign({},c),{code:QX}))),"function"==typeof l&&l()),new wy("SPA-AUTH_HELPER-HR-SE01",null!==(d=null==e?void 0:e.name)&&void 0!==d?d:"Refresh token request failed.",null!==(s=null==e?void 0:e.message)&&void 0!==s?s:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(a)try{const i=yield e.request(t);return Promise.resolve(i)}catch(e){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof l&&l()),Promise.reject(e)}}return i&&("function"==typeof n&&(yield n(c)),"function"==typeof l&&l()),Promise.reject(c)})))):Promise.reject(new wy("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`"))}))}httpRequestAll(e,t,i,n,l){var o,c,a;return Uy(this,void 0,void 0,(function*(){let d=!0;const s=yield this._dataLayer.getConfigData();for(const t of e){let e=!1;for(const i of[...null!==(c=null===(o=yield s)||void 0===o?void 0:o.resourceServerURLs)&&void 0!==c?c:[],s.baseUrl])if(i&&(null===(a=t.url)||void 0===a?void 0:a.startsWith(i))){e=!0;break}if(!e){d=!1;break}}const r=[];if(d)return e.forEach((e=>{r.push(t.request(e))})),(null==t?void 0:t.all)&&t.all(r).then((e=>Promise.resolve(e))).catch((e=>Uy(this,void 0,void 0,(function*(){var o,c,a;if(401===(null===(o=null==e?void 0:e.response)||void 0===o?void 0:o.status)||!(null==e?void 0:e.response)){let o;try{o=yield this._authenticationClient.refreshAccessToken()}catch(t){throw i&&("function"==typeof n&&(yield n(Object.assign(Object.assign({},e),{code:QX}))),"function"==typeof l&&l()),new wy("SPA-AUTH_HELPER-HRA-SE01",null!==(c=null==t?void 0:t.name)&&void 0!==c?c:"Refresh token request failed.",null!==(a=null==t?void 0:t.message)&&void 0!==a?a:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(o)return t.all&&t.all(r).then((e=>Promise.resolve(e))).catch((e=>Uy(this,void 0,void 0,(function*(){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof l&&l()),Promise.reject(e)}))))}return i&&("function"==typeof n&&(yield n(e)),"function"==typeof l&&l()),Promise.reject(e)}))));throw new wy("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`")}))}requestAccessToken(t,i,n,l,o,c){return Uy(this,void 0,void 0,(function*(){const a=yield this._dataLayer.getConfigData();if(a.storage===e.Storage.BrowserMemory&&a.enablePKCE&&i){const e=EX.getPKCE(Py.extractPKCEKeyFromStateParam(i));yield this._authenticationClient.setPKCECode(Py.extractPKCEKeyFromStateParam(i),e)}else a.storage===e.Storage.WebWorker&&l&&(yield this._authenticationClient.setPKCECode(l,null!=o?o:""));return t?this._authenticationClient.requestAccessToken(t,null!=i?i:"",null!=o?o:"",void 0,c).then((()=>Uy(this,void 0,void 0,(function*(){return a.storage!==e.Storage.WebWorker?(EX.setSignOutURL(yield this._authenticationClient.getSignOutURL(),a.clientID,this._instanceID),this._spaHelper&&(this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(this)),n&&"function"==typeof n&&a.enableOIDCSessionManagement&&n()):this._spaHelper&&this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()})))).catch((e=>Promise.reject(e))):Promise.reject(new wy("SPA-AUTH_HELPER-RAT1-NF01","No authorization code.","No authorization code was found."))}))}trySignInSilently(e,t,i,n,l){var o;return Uy(this,void 0,void 0,(function*(){if(EX.isInitializedSilentSignIn())return yield i.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const c=document.getElementById(kX),a=null===(o=null==c?void 0:c.contentDocument)||void 0===o?void 0:o.getElementById(HX);try{const t=yield e(n);a.src=t}catch(e){return Promise.reject(e)}return new Promise(((e,i)=>{const n=setTimeout((()=>{e(!1)}),1e4),o=c=>Uy(this,void 0,void 0,(function*(){var a,d,s,r;const u=c.data;(null==u?void 0:u.type)==KX&&(window.removeEventListener("message",o),clearTimeout(n),e(!1)),(null==u?void 0:u.type)==YX&&(null===(a=null==u?void 0:u.data)||void 0===a?void 0:a.code)&&t(null===(d=null==u?void 0:u.data)||void 0===d?void 0:d.code,null===(s=null==u?void 0:u.data)||void 0===s?void 0:s.sessionState,null===(r=null==u?void 0:u.data)||void 0===r?void 0:r.state,l).then((t=>{window.removeEventListener("message",o),e(t)})).catch((e=>{window.removeEventListener("message",o),i(e)})).finally((()=>{clearTimeout(n)}))}));window.addEventListener("message",o)}))}))}handleSignIn(t,i,n){return Uy(this,void 0,void 0,(function*(){const l=yield this._dataLayer.getConfigData();if(yield t())return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});if(l.storage!==e.Storage.WebWorker&&(yield this._authenticationClient.isAuthenticated()))return this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(this),l.enableOIDCSessionManagement&&i(),Promise.resolve(yield this._authenticationClient.getBasicUserInfo());const o=new URL(window.location.href).searchParams.get(AX),c=new URL(window.location.href).searchParams.get(zX);if(o){const e=new URL(window.location.href);throw e.searchParams.delete(AX),e.searchParams.delete(zX),history.pushState(null,document.title,e.toString()),new wy("SPA-AUTH_HELPER-SI-SE01",o,null!=c?c:"")}if(l.storage===e.Storage.WebWorker&&n){const e=yield n();if(e)return e}}))}attachTokenToRequestConfig(e){return Uy(this,void 0,void 0,(function*(){const t=Object.assign({attachToken:!0},e);t.attachToken&&(t.shouldAttachIDPAccessToken?e.headers=Object.assign(Object.assign({},e.headers),{Authorization:"Bearer ".concat(yield this.getIDPAccessToken())}):e.headers=Object.assign(Object.assign({},e.headers),{Authorization:"Bearer ".concat(yield this.getAccessToken())}))}))}getBasicUserInfo(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.getBasicUserInfo()}))}getDecodedIDToken(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.getDecodedIDToken()}))}getDecodedIDPIDToken(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.getDecodedIDToken()}))}getCryptoHelper(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.getCryptoHelper()}))}getIDToken(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.getIDToken()}))}getOIDCServiceEndpoints(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.getOIDCServiceEndpoints()}))}getAccessToken(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.getAccessToken()}))}getIDPAccessToken(){var e;return Uy(this,void 0,void 0,(function*(){return null===(e=yield this._dataLayer.getSessionData())||void 0===e?void 0:e.access_token}))}getDataLayer(){return this._dataLayer}isAuthenticated(){return Uy(this,void 0,void 0,(function*(){return this._authenticationClient.isAuthenticated()}))}}class OX{constructor(e){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer()}refreshAccessTokenAutomatically(e){var t,i;return Uy(this,void 0,void 0,(function*(){if(!(null!==(i=null===(t=yield this._dataLayer.getConfigData())||void 0===t?void 0:t.periodicTokenRefresh)&&void 0!==i&&i))return;const n=yield this._dataLayer.getSessionData();if(n.refresh_token){const t=parseInt(n.expires_in),i=setTimeout((()=>Uy(this,void 0,void 0,(function*(){yield e.refreshAccessToken()}))),1e3*(t<=10?t:t-10));yield this._dataLayer.setTemporaryDataParameter(ky,JSON.stringify(i))}}))}getRefreshTimeoutTimer(){return Uy(this,void 0,void 0,(function*(){return(yield this._dataLayer.getTemporaryDataParameter(ky))?JSON.parse(yield this._dataLayer.getTemporaryDataParameter(ky)):-1}))}clearRefreshTokenTimeout(e){return Uy(this,void 0,void 0,(function*(){if(e)return void clearTimeout(e);const t=yield this.getRefreshTimeoutTimer();-1!==t&&clearTimeout(t)}))}}const _X=(()=>{let t,i,n,l,o,c,a,d,s,r,u;const Z=(e,a,d,s,r,Z,h)=>{t=e,i=a,n=d,l=s,o=Z,c=r,u=h,l>-1&&b(),c>-1&&(r=setInterval((()=>{p()}),1e3*c))},b=()=>Uy(void 0,void 0,void 0,(function*(){var e;if(!i||!t||!o)return;const c="opIFrame";const a=document.getElementById(kX);(null===(e=null==a?void 0:a.contentDocument)||void 0===e?void 0:e.getElementById(c)).src=i+"?client_id="+t+"&redirect_uri="+o,d=setInterval((function(){var e;return Uy(this,void 0,void 0,(function*(){const l=yield n();if(Boolean(t)&&Boolean(l)){const n="".concat(t," ").concat(l),o=document.getElementById(kX),a=(null===(e=null==o?void 0:o.contentDocument)||void 0===e?void 0:e.getElementById(c)).contentWindow;null==a||a.postMessage(n,i)}}))}),1e3*l),m()})),h=()=>{clearInterval(d),clearInterval(undefined)},m=()=>{null===window||void 0===window||window.addEventListener("message",(function(e){var t;return Uy(this,void 0,void 0,(function*(){const n=i;!n||(null==n?void 0:n.indexOf(e.origin))<0||(null===(t=null==e?void 0:e.data)||void 0===t?void 0:t.type)===JX||"unchanged"===e.data||("error"===e.data?window.location.href=yield a():"changed"===e.data&&p())}))}),!1)},p=()=>Uy(void 0,void 0,void 0,(function*(){var t;const i=document.getElementById(kX),n=null===(t=null==i?void 0:i.contentDocument)||void 0===t?void 0:t.getElementById(HX);if(EX.canSendPromptNoneRequest()){EX.setPromptNoneRequestSent(!0);const t=e=>{var i,n,l;(null===(i=null==e?void 0:e.data)||void 0===i?void 0:i.type)===JX&&(r(null!==(l=null===(n=null==e?void 0:e.data)||void 0===n?void 0:n.data)&&void 0!==l?l:""),null===window||void 0===window||window.removeEventListener("message",t))};s!==e.Storage.BrowserMemory&&s!==e.Storage.WebWorker||null===window||void 0===window||window.addEventListener("message",t);const i=yield u({prompt:"none",response_mode:"query",state:TX});n.src=i}})),I=t=>Uy(void 0,void 0,void 0,(function*(){var i,n;const l=new URL(window.location.href).searchParams.get(PX),o=new URL(window.location.href).searchParams.get(Fy),c=window.parent.parent;if(null!==l&&(l.includes(TX)||l.includes(FX))){const d=new URL(window.location.href).searchParams.get("code");if(null!==d&&0!==d.length){if(l.includes(FX)){const e={data:{code:d,sessionState:null!=o?o:"",state:l},type:YX};return sessionStorage.setItem(xX,"false"),c.postMessage(e,c.origin),EX.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield EX.waitTillPageRedirect(),!0}const a=new URL(window.location.href).searchParams.get("session_state");if(s===e.Storage.LocalStorage||s===e.Storage.SessionStorage)t&&(yield t(a));else{const e={data:null!=a?a:"",type:JX};null===(n=null===(i=null===window||void 0===window?void 0:window.parent)||void 0===i?void 0:i.parent)||void 0===n||n.postMessage(e)}return EX.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield EX.waitTillPageRedirect(),!0}{if(l.includes(FX)){const e={type:KX};return window.parent.parent.postMessage(e,c.origin),EX.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield EX.waitTillPageRedirect(),!0}EX.setPromptNoneRequestSent(!1);const e=yield a();return yield Oy.clearUserSessionData(),c.location.href=e,window.location.href="about:blank",yield EX.waitTillPageRedirect(),!0}}return!1}));return(e,t,i)=>Uy(void 0,void 0,void 0,(function*(){var n;let l=document.createElement("iframe");l.setAttribute("id",kX),l.style.display="none";let o=!1;l.onload=()=>{var e,t,i,n;l=document.getElementById(kX);const c=null==l?void 0:l.contentDocument,a=null==c?void 0:c.createElement("iframe");a&&(a.setAttribute("id","opIFrame"),a.style.display="none");const d=null==c?void 0:c.createElement("iframe");d&&(d.setAttribute("id",HX),d.style.display="none"),a&&(null===(t=null===(e=null==l?void 0:l.contentDocument)||void 0===e?void 0:e.body)||void 0===t||t.appendChild(a)),d&&(null===(n=null===(i=null==l?void 0:l.contentDocument)||void 0===i?void 0:i.body)||void 0===n||n.appendChild(d)),o=!0},null===(n=null===document||void 0===document?void 0:document.body)||void 0===n||n.appendChild(l),a=e,s=t,r=i;for(;!1===o;)yield new Promise((e=>setTimeout(e,1)));return{initialize:Z,receivePromptNoneResponse:I,reset:h}}))})();var qX="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{};function $X(){throw new Error("setTimeout has not been defined")}function eV(){throw new Error("clearTimeout has not been defined")}var tV=$X,iV=eV;function nV(e){if(tV===setTimeout)return setTimeout(e,0);if((tV===$X||!tV)&&setTimeout)return tV=setTimeout,setTimeout(e,0);try{return tV(e,0)}catch(t){try{return tV.call(null,e,0)}catch(t){return tV.call(this,e,0)}}}"function"==typeof qX.setTimeout&&(tV=setTimeout),"function"==typeof qX.clearTimeout&&(iV=clearTimeout);var lV,oV=[],cV=!1,aV=-1;function dV(){cV&&lV&&(cV=!1,lV.length?oV=lV.concat(oV):aV=-1,oV.length&&sV())}function sV(){if(!cV){var e=nV(dV);cV=!0;for(var t=oV.length;t;){for(lV=oV,oV=[];++aV<t;)lV&&lV[aV].run();aV=-1,t=oV.length}lV=null,cV=!1,function(e){if(iV===clearTimeout)return clearTimeout(e);if((iV===eV||!iV)&&clearTimeout)return iV=clearTimeout,clearTimeout(e);try{iV(e)}catch(t){try{return iV.call(null,e)}catch(t){return iV.call(this,e)}}}(e)}}function rV(e,t){this.fun=e,this.array=t}rV.prototype.run=function(){this.fun.apply(null,this.array)};function uV(){}var ZV=uV,bV=uV,hV=uV,mV=uV,pV=uV,IV=uV,gV=uV;var GV=qX.performance||{},yV=GV.now||GV.mozNow||GV.msNow||GV.oNow||GV.webkitNow||function(){return(new Date).getTime()};var XV=new Date;var VV={nextTick:function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)t[i-1]=arguments[i];oV.push(new rV(e,t)),1!==oV.length||cV||nV(sV)},title:"browser",browser:!0,env:{},argv:[],version:"",versions:{},on:ZV,addListener:bV,once:hV,off:mV,removeListener:pV,removeAllListeners:IV,emit:gV,binding:function(e){throw new Error("process.binding is not supported")},cwd:function(){return"/"},chdir:function(e){throw new Error("process.chdir is not supported")},umask:function(){return 0},hrtime:function(e){var t=.001*yV.call(GV),i=Math.floor(t),n=Math.floor(t%1*1e9);return e&&(i-=e[0],(n-=e[1])<0&&(i--,n+=1e9)),[i,n]},platform:"browser",release:{},config:{},uptime:function(){return(new Date-XV)/1e3}},WV=VV;function CV(e,t){return function(){return e.apply(t,arguments)}}const{toString:RV}=Object.prototype,{getPrototypeOf:SV}=Object,{iterator:vV,toStringTag:fV}=Symbol,YV=(KV=Object.create(null),e=>{const t=RV.call(e);return KV[t]||(KV[t]=t.slice(8,-1).toLowerCase())});var KV;const NV=e=>(e=e.toLowerCase(),t=>YV(t)===e),JV=e=>t=>typeof t===e,{isArray:UV}=Array,LV=JV("undefined");function kV(e){return null!==e&&!LV(e)&&null!==e.constructor&&!LV(e.constructor)&&FV(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const HV=NV("ArrayBuffer");const TV=JV("string"),FV=JV("function"),xV=JV("number"),BV=e=>null!==e&&"object"==typeof e,AV=e=>{if("object"!==YV(e))return!1;const t=SV(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||fV in e||vV in e)},zV=NV("Date"),wV=NV("File"),PV=NV("Blob"),QV=NV("FileList");const jV="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==qX?qX:{},MV=void 0!==jV.FormData?jV.FormData:void 0,EV=NV("URLSearchParams"),[DV,OV,_V,qV]=["ReadableStream","Request","Response","Headers"].map(NV);function $V(e,t){let i,n,{allOwnKeys:l=!1}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(null!=e)if("object"!=typeof e&&(e=[e]),UV(e))for(i=0,n=e.length;i<n;i++)t.call(null,e[i],i,e);else{if(kV(e))return;const n=l?Object.getOwnPropertyNames(e):Object.keys(e),o=n.length;let c;for(i=0;i<o;i++)c=n[i],t.call(null,e[c],c,e)}}function eW(e,t){if(kV(e))return null;t=t.toLowerCase();const i=Object.keys(e);let n,l=i.length;for(;l-- >0;)if(n=i[l],t===n.toLowerCase())return n;return null}const tW="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:qX,iW=e=>!LV(e)&&e!==tW;const nW=(e=>t=>e&&t instanceof e)("undefined"!=typeof Uint8Array&&SV(Uint8Array)),lW=NV("HTMLFormElement"),oW=(e=>{let{hasOwnProperty:t}=e;return(e,i)=>t.call(e,i)})(Object.prototype),cW=NV("RegExp"),aW=(e,t)=>{const i=Object.getOwnPropertyDescriptors(e),n={};$V(i,((i,l)=>{let o;!1!==(o=t(i,l,e))&&(n[l]=o||i)})),Object.defineProperties(e,n)};const dW=NV("AsyncFunction"),sW=(rW="function"==typeof setImmediate,uW=FV(tW.postMessage),rW?setImmediate:uW?(ZW="axios@".concat(Math.random()),bW=[],tW.addEventListener("message",(e=>{let{source:t,data:i}=e;t===tW&&i===ZW&&bW.length&&bW.shift()()}),!1),e=>{bW.push(e),tW.postMessage(ZW,"*")}):e=>setTimeout(e));var rW,uW,ZW,bW;const hW="undefined"!=typeof queueMicrotask?queueMicrotask.bind(tW):void 0!==WV&&WV.nextTick||sW;var mW={isArray:UV,isArrayBuffer:HV,isBuffer:kV,isFormData:e=>{let t;return e&&(MV&&e instanceof MV||FV(e.append)&&("formdata"===(t=YV(e))||"object"===t&&FV(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){let t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&HV(e.buffer),t},isString:TV,isNumber:xV,isBoolean:e=>!0===e||!1===e,isObject:BV,isPlainObject:AV,isEmptyObject:e=>{if(!BV(e)||kV(e))return!1;try{return 0===Object.keys(e).length&&Object.getPrototypeOf(e)===Object.prototype}catch(e){return!1}},isReadableStream:DV,isRequest:OV,isResponse:_V,isHeaders:qV,isUndefined:LV,isDate:zV,isFile:wV,isReactNativeBlob:e=>!(!e||void 0===e.uri),isReactNative:e=>e&&void 0!==e.getParts,isBlob:PV,isRegExp:cW,isFunction:FV,isStream:e=>BV(e)&&FV(e.pipe),isURLSearchParams:EV,isTypedArray:nW,isFileList:QV,forEach:$V,merge:function e(){const{caseless:t,skipUndefined:i}=iW(this)&&this||{},n={},l=(l,o)=>{if("__proto__"===o||"constructor"===o||"prototype"===o)return;const c=t&&eW(n,o)||o;AV(n[c])&&AV(l)?n[c]=e(n[c],l):AV(l)?n[c]=e({},l):UV(l)?n[c]=l.slice():i&&LV(l)||(n[c]=l)};for(let e=0,t=arguments.length;e<t;e++)arguments[e]&&$V(arguments[e],l);return n},extend:function(e,t,i){let{allOwnKeys:n}=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return $V(t,((t,n)=>{i&&FV(t)?Object.defineProperty(e,n,{value:CV(t,i),writable:!0,enumerable:!0,configurable:!0}):Object.defineProperty(e,n,{value:t,writable:!0,enumerable:!0,configurable:!0})}),{allOwnKeys:n}),e},trim:e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,i,n)=>{e.prototype=Object.create(t.prototype,n),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{value:t.prototype}),i&&Object.assign(e.prototype,i)},toFlatObject:(e,t,i,n)=>{let l,o,c;const a={};if(t=t||{},null==e)return t;do{for(l=Object.getOwnPropertyNames(e),o=l.length;o-- >0;)c=l[o],n&&!n(c,e,t)||a[c]||(t[c]=e[c],a[c]=!0);e=!1!==i&&SV(e)}while(e&&(!i||i(e,t))&&e!==Object.prototype);return t},kindOf:YV,kindOfTest:NV,endsWith:(e,t,i)=>{e=String(e),(void 0===i||i>e.length)&&(i=e.length),i-=t.length;const n=e.indexOf(t,i);return-1!==n&&n===i},toArray:e=>{if(!e)return null;if(UV(e))return e;let t=e.length;if(!xV(t))return null;const i=new Array(t);for(;t-- >0;)i[t]=e[t];return i},forEachEntry:(e,t)=>{const i=(e&&e[vV]).call(e);let n;for(;(n=i.next())&&!n.done;){const i=n.value;t.call(e,i[0],i[1])}},matchAll:(e,t)=>{let i;const n=[];for(;null!==(i=e.exec(t));)n.push(i);return n},isHTMLForm:lW,hasOwnProperty:oW,hasOwnProp:oW,reduceDescriptors:aW,freezeMethods:e=>{aW(e,((t,i)=>{if(FV(e)&&-1!==["arguments","caller","callee"].indexOf(i))return!1;const n=e[i];FV(n)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+i+"'")}))}))},toObjectSet:(e,t)=>{const i={},n=e=>{e.forEach((e=>{i[e]=!0}))};return UV(e)?n(e):n(String(e).split(t)),i},toCamelCase:e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,i){return t.toUpperCase()+i})),noop:()=>{},toFiniteNumber:(e,t)=>null!=e&&Number.isFinite(e=+e)?e:t,findKey:eW,global:tW,isContextDefined:iW,isSpecCompliantForm:function(e){return!!(e&&FV(e.append)&&"FormData"===e[fV]&&e[vV])},toJSONObject:e=>{const t=new Array(10),i=(e,n)=>{if(BV(e)){if(t.indexOf(e)>=0)return;if(kV(e))return e;if(!("toJSON"in e)){t[n]=e;const l=UV(e)?[]:{};return $V(e,((e,t)=>{const o=i(e,n+1);!LV(o)&&(l[t]=o)})),t[n]=void 0,l}}return e};return i(e,0)},isAsyncFn:dW,isThenable:e=>e&&(BV(e)||FV(e))&&FV(e.then)&&FV(e.catch),setImmediate:sW,asap:hW,isIterable:e=>null!=e&&FV(e[vV])},pW=[],IW=[],gW="undefined"!=typeof Uint8Array?Uint8Array:Array,GW=!1;function yW(){GW=!0;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t=0,i=e.length;t<i;++t)pW[t]=e[t],IW[e.charCodeAt(t)]=t;IW["-".charCodeAt(0)]=62,IW["_".charCodeAt(0)]=63}function XW(e,t,i){for(var n,l,o=[],c=t;c<i;c+=3)n=(e[c]<<16)+(e[c+1]<<8)+e[c+2],o.push(pW[(l=n)>>18&63]+pW[l>>12&63]+pW[l>>6&63]+pW[63&l]);return o.join("")}function VW(e){var t;GW||yW();for(var i=e.length,n=i%3,l="",o=[],c=16383,a=0,d=i-n;a<d;a+=c)o.push(XW(e,a,a+c>d?d:a+c));return 1===n?(t=e[i-1],l+=pW[t>>2],l+=pW[t<<4&63],l+="=="):2===n&&(t=(e[i-2]<<8)+e[i-1],l+=pW[t>>10],l+=pW[t>>4&63],l+=pW[t<<2&63],l+="="),o.push(l),o.join("")}function WW(e,t,i,n,l){var o,c,a=8*l-n-1,d=(1<<a)-1,s=d>>1,r=-7,u=i?l-1:0,Z=i?-1:1,b=e[t+u];for(u+=Z,o=b&(1<<-r)-1,b>>=-r,r+=a;r>0;o=256*o+e[t+u],u+=Z,r-=8);for(c=o&(1<<-r)-1,o>>=-r,r+=n;r>0;c=256*c+e[t+u],u+=Z,r-=8);if(0===o)o=1-s;else{if(o===d)return c?NaN:1/0*(b?-1:1);c+=Math.pow(2,n),o-=s}return(b?-1:1)*c*Math.pow(2,o-n)}function CW(e,t,i,n,l,o){var c,a,d,s=8*o-l-1,r=(1<<s)-1,u=r>>1,Z=23===l?Math.pow(2,-24)-Math.pow(2,-77):0,b=n?0:o-1,h=n?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,c=r):(c=Math.floor(Math.log(t)/Math.LN2),t*(d=Math.pow(2,-c))<1&&(c--,d*=2),(t+=c+u>=1?Z/d:Z*Math.pow(2,1-u))*d>=2&&(c++,d/=2),c+u>=r?(a=0,c=r):c+u>=1?(a=(t*d-1)*Math.pow(2,l),c+=u):(a=t*Math.pow(2,u-1)*Math.pow(2,l),c=0));l>=8;e[i+b]=255&a,b+=h,a/=256,l-=8);for(c=c<<l|a,s+=l;s>0;e[i+b]=255&c,b+=h,c/=256,s-=8);e[i+b-h]|=128*m}var RW={}.toString,SW=Array.isArray||function(e){return"[object Array]"==RW.call(e)};KW.TYPED_ARRAY_SUPPORT=void 0===qX.TYPED_ARRAY_SUPPORT||qX.TYPED_ARRAY_SUPPORT;var vW=fW();function fW(){return KW.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function YW(e,t){if(fW()<t)throw new RangeError("Invalid typed array length");return KW.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=KW.prototype:(null===e&&(e=new KW(t)),e.length=t),e}function KW(e,t,i){if(!(KW.TYPED_ARRAY_SUPPORT||this instanceof KW))return new KW(e,t,i);if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return UW(this,e)}return NW(this,e,t,i)}function NW(e,t,i,n){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,i,n){if(t.byteLength,i<0||t.byteLength<i)throw new RangeError("'offset' is out of bounds");if(t.byteLength<i+(n||0))throw new RangeError("'length' is out of bounds");t=void 0===i&&void 0===n?new Uint8Array(t):void 0===n?new Uint8Array(t,i):new Uint8Array(t,i,n);KW.TYPED_ARRAY_SUPPORT?(e=t).__proto__=KW.prototype:e=LW(e,t);return e}(e,t,i,n):"string"==typeof t?function(e,t,i){"string"==typeof i&&""!==i||(i="utf8");if(!KW.isEncoding(i))throw new TypeError('"encoding" must be a valid string encoding');var n=0|TW(t,i),l=(e=YW(e,n)).write(t,i);l!==n&&(e=e.slice(0,l));return e}(e,t,i):function(e,t){if(HW(t)){var i=0|kW(t.length);return 0===(e=YW(e,i)).length||t.copy(e,0,0,i),e}if(t){if("undefined"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||"length"in t)return"number"!=typeof t.length||(n=t.length)!=n?YW(e,0):LW(e,t);if("Buffer"===t.type&&SW(t.data))return LW(e,t.data)}var n;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function JW(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function UW(e,t){if(JW(t),e=YW(e,t<0?0:0|kW(t)),!KW.TYPED_ARRAY_SUPPORT)for(var i=0;i<t;++i)e[i]=0;return e}function LW(e,t){var i=t.length<0?0:0|kW(t.length);e=YW(e,i);for(var n=0;n<i;n+=1)e[n]=255&t[n];return e}function kW(e){if(e>=fW())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+fW().toString(16)+" bytes");return 0|e}function HW(e){return!(null==e||!e._isBuffer)}function TW(e,t){if(HW(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var i=e.length;if(0===i)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return i;case"utf8":case"utf-8":case void 0:return rC(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*i;case"hex":return i>>>1;case"base64":return uC(e).length;default:if(n)return rC(e).length;t=(""+t).toLowerCase(),n=!0}}function FW(e,t,i){var n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===i||i>this.length)&&(i=this.length),i<=0)return"";if((i>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return $W(this,t,i);case"utf8":case"utf-8":return DW(this,t,i);case"ascii":return _W(this,t,i);case"latin1":case"binary":return qW(this,t,i);case"base64":return EW(this,t,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return eC(this,t,i);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function xW(e,t,i){var n=e[t];e[t]=e[i],e[i]=n}function BW(e,t,i,n,l){if(0===e.length)return-1;if("string"==typeof i?(n=i,i=0):i>2147483647?i=2147483647:i<-2147483648&&(i=-2147483648),i=+i,isNaN(i)&&(i=l?0:e.length-1),i<0&&(i=e.length+i),i>=e.length){if(l)return-1;i=e.length-1}else if(i<0){if(!l)return-1;i=0}if("string"==typeof t&&(t=KW.from(t,n)),HW(t))return 0===t.length?-1:AW(e,t,i,n,l);if("number"==typeof t)return t&=255,KW.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?l?Uint8Array.prototype.indexOf.call(e,t,i):Uint8Array.prototype.lastIndexOf.call(e,t,i):AW(e,[t],i,n,l);throw new TypeError("val must be string, number or Buffer")}function AW(e,t,i,n,l){var o,c=1,a=e.length,d=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;c=2,a/=2,d/=2,i/=2}function s(e,t){return 1===c?e[t]:e.readUInt16BE(t*c)}if(l){var r=-1;for(o=i;o<a;o++)if(s(e,o)===s(t,-1===r?0:o-r)){if(-1===r&&(r=o),o-r+1===d)return r*c}else-1!==r&&(o-=o-r),r=-1}else for(i+d>a&&(i=a-d),o=i;o>=0;o--){for(var u=!0,Z=0;Z<d;Z++)if(s(e,o+Z)!==s(t,Z)){u=!1;break}if(u)return o}return-1}function zW(e,t,i,n){i=Number(i)||0;var l=e.length-i;n?(n=Number(n))>l&&(n=l):n=l;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var c=0;c<n;++c){var a=parseInt(t.substr(2*c,2),16);if(isNaN(a))return c;e[i+c]=a}return c}function wW(e,t,i,n){return ZC(rC(t,e.length-i),e,i,n)}function PW(e,t,i,n){return ZC(function(e){for(var t=[],i=0;i<e.length;++i)t.push(255&e.charCodeAt(i));return t}(t),e,i,n)}function QW(e,t,i,n){return PW(e,t,i,n)}function jW(e,t,i,n){return ZC(uC(t),e,i,n)}function MW(e,t,i,n){return ZC(function(e,t){for(var i,n,l,o=[],c=0;c<e.length&&!((t-=2)<0);++c)n=(i=e.charCodeAt(c))>>8,l=i%256,o.push(l),o.push(n);return o}(t,e.length-i),e,i,n)}function EW(e,t,i){return 0===t&&i===e.length?VW(e):VW(e.slice(t,i))}function DW(e,t,i){i=Math.min(e.length,i);for(var n=[],l=t;l<i;){var o,c,a,d,s=e[l],r=null,u=s>239?4:s>223?3:s>191?2:1;if(l+u<=i)switch(u){case 1:s<128&&(r=s);break;case 2:128==(192&(o=e[l+1]))&&(d=(31&s)<<6|63&o)>127&&(r=d);break;case 3:o=e[l+1],c=e[l+2],128==(192&o)&&128==(192&c)&&(d=(15&s)<<12|(63&o)<<6|63&c)>2047&&(d<55296||d>57343)&&(r=d);break;case 4:o=e[l+1],c=e[l+2],a=e[l+3],128==(192&o)&&128==(192&c)&&128==(192&a)&&(d=(15&s)<<18|(63&o)<<12|(63&c)<<6|63&a)>65535&&d<1114112&&(r=d)}null===r?(r=65533,u=1):r>65535&&(r-=65536,n.push(r>>>10&1023|55296),r=56320|1023&r),n.push(r),l+=u}return function(e){var t=e.length;if(t<=OW)return String.fromCharCode.apply(String,e);var i="",n=0;for(;n<t;)i+=String.fromCharCode.apply(String,e.slice(n,n+=OW));return i}(n)}KW.poolSize=8192,KW._augment=function(e){return e.__proto__=KW.prototype,e},KW.from=function(e,t,i){return NW(null,e,t,i)},KW.TYPED_ARRAY_SUPPORT&&(KW.prototype.__proto__=Uint8Array.prototype,KW.__proto__=Uint8Array),KW.alloc=function(e,t,i){return function(e,t,i,n){return JW(t),t<=0?YW(e,t):void 0!==i?"string"==typeof n?YW(e,t).fill(i,n):YW(e,t).fill(i):YW(e,t)}(null,e,t,i)},KW.allocUnsafe=function(e){return UW(null,e)},KW.allocUnsafeSlow=function(e){return UW(null,e)},KW.isBuffer=bC,KW.compare=function(e,t){if(!HW(e)||!HW(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var i=e.length,n=t.length,l=0,o=Math.min(i,n);l<o;++l)if(e[l]!==t[l]){i=e[l],n=t[l];break}return i<n?-1:n<i?1:0},KW.isEncoding=function(e){switch(String(e).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}},KW.concat=function(e,t){if(!SW(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return KW.alloc(0);var i;if(void 0===t)for(t=0,i=0;i<e.length;++i)t+=e[i].length;var n=KW.allocUnsafe(t),l=0;for(i=0;i<e.length;++i){var o=e[i];if(!HW(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(n,l),l+=o.length}return n},KW.byteLength=TW,KW.prototype._isBuffer=!0,KW.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)xW(this,t,t+1);return this},KW.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)xW(this,t,t+3),xW(this,t+1,t+2);return this},KW.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)xW(this,t,t+7),xW(this,t+1,t+6),xW(this,t+2,t+5),xW(this,t+3,t+4);return this},KW.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?DW(this,0,e):FW.apply(this,arguments)},KW.prototype.equals=function(e){if(!HW(e))throw new TypeError("Argument must be a Buffer");return this===e||0===KW.compare(this,e)},KW.prototype.inspect=function(){var e="";return this.length>0&&(e=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(e+=" ... ")),"<Buffer "+e+">"},KW.prototype.compare=function(e,t,i,n,l){if(!HW(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===i&&(i=e?e.length:0),void 0===n&&(n=0),void 0===l&&(l=this.length),t<0||i>e.length||n<0||l>this.length)throw new RangeError("out of range index");if(n>=l&&t>=i)return 0;if(n>=l)return-1;if(t>=i)return 1;if(this===e)return 0;for(var o=(l>>>=0)-(n>>>=0),c=(i>>>=0)-(t>>>=0),a=Math.min(o,c),d=this.slice(n,l),s=e.slice(t,i),r=0;r<a;++r)if(d[r]!==s[r]){o=d[r],c=s[r];break}return o<c?-1:c<o?1:0},KW.prototype.includes=function(e,t,i){return-1!==this.indexOf(e,t,i)},KW.prototype.indexOf=function(e,t,i){return BW(this,e,t,i,!0)},KW.prototype.lastIndexOf=function(e,t,i){return BW(this,e,t,i,!1)},KW.prototype.write=function(e,t,i,n){if(void 0===t)n="utf8",i=this.length,t=0;else if(void 0===i&&"string"==typeof t)n=t,i=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t|=0,isFinite(i)?(i|=0,void 0===n&&(n="utf8")):(n=i,i=void 0)}var l=this.length-t;if((void 0===i||i>l)&&(i=l),e.length>0&&(i<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return zW(this,e,t,i);case"utf8":case"utf-8":return wW(this,e,t,i);case"ascii":return PW(this,e,t,i);case"latin1":case"binary":return QW(this,e,t,i);case"base64":return jW(this,e,t,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return MW(this,e,t,i);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},KW.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var OW=4096;function _W(e,t,i){var n="";i=Math.min(e.length,i);for(var l=t;l<i;++l)n+=String.fromCharCode(127&e[l]);return n}function qW(e,t,i){var n="";i=Math.min(e.length,i);for(var l=t;l<i;++l)n+=String.fromCharCode(e[l]);return n}function $W(e,t,i){var n=e.length;(!t||t<0)&&(t=0),(!i||i<0||i>n)&&(i=n);for(var l="",o=t;o<i;++o)l+=sC(e[o]);return l}function eC(e,t,i){for(var n=e.slice(t,i),l="",o=0;o<n.length;o+=2)l+=String.fromCharCode(n[o]+256*n[o+1]);return l}function tC(e,t,i){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>i)throw new RangeError("Trying to access beyond buffer length")}function iC(e,t,i,n,l,o){if(!HW(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>l||t<o)throw new RangeError('"value" argument is out of bounds');if(i+n>e.length)throw new RangeError("Index out of range")}function nC(e,t,i,n){t<0&&(t=65535+t+1);for(var l=0,o=Math.min(e.length-i,2);l<o;++l)e[i+l]=(t&255<<8*(n?l:1-l))>>>8*(n?l:1-l)}function lC(e,t,i,n){t<0&&(t=4294967295+t+1);for(var l=0,o=Math.min(e.length-i,4);l<o;++l)e[i+l]=t>>>8*(n?l:3-l)&255}function oC(e,t,i,n,l,o){if(i+n>e.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("Index out of range")}function cC(e,t,i,n,l){return l||oC(e,0,i,4),CW(e,t,i,n,23,4),i+4}function aC(e,t,i,n,l){return l||oC(e,0,i,8),CW(e,t,i,n,52,8),i+8}KW.prototype.slice=function(e,t){var i,n=this.length;if((e=~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),(t=void 0===t?n:~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),t<e&&(t=e),KW.TYPED_ARRAY_SUPPORT)(i=this.subarray(e,t)).__proto__=KW.prototype;else{var l=t-e;i=new KW(l,void 0);for(var o=0;o<l;++o)i[o]=this[o+e]}return i},KW.prototype.readUIntLE=function(e,t,i){e|=0,t|=0,i||tC(e,t,this.length);for(var n=this[e],l=1,o=0;++o<t&&(l*=256);)n+=this[e+o]*l;return n},KW.prototype.readUIntBE=function(e,t,i){e|=0,t|=0,i||tC(e,t,this.length);for(var n=this[e+--t],l=1;t>0&&(l*=256);)n+=this[e+--t]*l;return n},KW.prototype.readUInt8=function(e,t){return t||tC(e,1,this.length),this[e]},KW.prototype.readUInt16LE=function(e,t){return t||tC(e,2,this.length),this[e]|this[e+1]<<8},KW.prototype.readUInt16BE=function(e,t){return t||tC(e,2,this.length),this[e]<<8|this[e+1]},KW.prototype.readUInt32LE=function(e,t){return t||tC(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},KW.prototype.readUInt32BE=function(e,t){return t||tC(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},KW.prototype.readIntLE=function(e,t,i){e|=0,t|=0,i||tC(e,t,this.length);for(var n=this[e],l=1,o=0;++o<t&&(l*=256);)n+=this[e+o]*l;return n>=(l*=128)&&(n-=Math.pow(2,8*t)),n},KW.prototype.readIntBE=function(e,t,i){e|=0,t|=0,i||tC(e,t,this.length);for(var n=t,l=1,o=this[e+--n];n>0&&(l*=256);)o+=this[e+--n]*l;return o>=(l*=128)&&(o-=Math.pow(2,8*t)),o},KW.prototype.readInt8=function(e,t){return t||tC(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},KW.prototype.readInt16LE=function(e,t){t||tC(e,2,this.length);var i=this[e]|this[e+1]<<8;return 32768&i?4294901760|i:i},KW.prototype.readInt16BE=function(e,t){t||tC(e,2,this.length);var i=this[e+1]|this[e]<<8;return 32768&i?4294901760|i:i},KW.prototype.readInt32LE=function(e,t){return t||tC(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},KW.prototype.readInt32BE=function(e,t){return t||tC(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},KW.prototype.readFloatLE=function(e,t){return t||tC(e,4,this.length),WW(this,e,!0,23,4)},KW.prototype.readFloatBE=function(e,t){return t||tC(e,4,this.length),WW(this,e,!1,23,4)},KW.prototype.readDoubleLE=function(e,t){return t||tC(e,8,this.length),WW(this,e,!0,52,8)},KW.prototype.readDoubleBE=function(e,t){return t||tC(e,8,this.length),WW(this,e,!1,52,8)},KW.prototype.writeUIntLE=function(e,t,i,n){(e=+e,t|=0,i|=0,n)||iC(this,e,t,i,Math.pow(2,8*i)-1,0);var l=1,o=0;for(this[t]=255&e;++o<i&&(l*=256);)this[t+o]=e/l&255;return t+i},KW.prototype.writeUIntBE=function(e,t,i,n){(e=+e,t|=0,i|=0,n)||iC(this,e,t,i,Math.pow(2,8*i)-1,0);var l=i-1,o=1;for(this[t+l]=255&e;--l>=0&&(o*=256);)this[t+l]=e/o&255;return t+i},KW.prototype.writeUInt8=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,1,255,0),KW.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},KW.prototype.writeUInt16LE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,2,65535,0),KW.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):nC(this,e,t,!0),t+2},KW.prototype.writeUInt16BE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,2,65535,0),KW.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):nC(this,e,t,!1),t+2},KW.prototype.writeUInt32LE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,4,4294967295,0),KW.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):lC(this,e,t,!0),t+4},KW.prototype.writeUInt32BE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,4,4294967295,0),KW.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):lC(this,e,t,!1),t+4},KW.prototype.writeIntLE=function(e,t,i,n){if(e=+e,t|=0,!n){var l=Math.pow(2,8*i-1);iC(this,e,t,i,l-1,-l)}var o=0,c=1,a=0;for(this[t]=255&e;++o<i&&(c*=256);)e<0&&0===a&&0!==this[t+o-1]&&(a=1),this[t+o]=(e/c>>0)-a&255;return t+i},KW.prototype.writeIntBE=function(e,t,i,n){if(e=+e,t|=0,!n){var l=Math.pow(2,8*i-1);iC(this,e,t,i,l-1,-l)}var o=i-1,c=1,a=0;for(this[t+o]=255&e;--o>=0&&(c*=256);)e<0&&0===a&&0!==this[t+o+1]&&(a=1),this[t+o]=(e/c>>0)-a&255;return t+i},KW.prototype.writeInt8=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,1,127,-128),KW.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},KW.prototype.writeInt16LE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,2,32767,-32768),KW.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):nC(this,e,t,!0),t+2},KW.prototype.writeInt16BE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,2,32767,-32768),KW.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):nC(this,e,t,!1),t+2},KW.prototype.writeInt32LE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,4,2147483647,-2147483648),KW.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):lC(this,e,t,!0),t+4},KW.prototype.writeInt32BE=function(e,t,i){return e=+e,t|=0,i||iC(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),KW.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):lC(this,e,t,!1),t+4},KW.prototype.writeFloatLE=function(e,t,i){return cC(this,e,t,!0,i)},KW.prototype.writeFloatBE=function(e,t,i){return cC(this,e,t,!1,i)},KW.prototype.writeDoubleLE=function(e,t,i){return aC(this,e,t,!0,i)},KW.prototype.writeDoubleBE=function(e,t,i){return aC(this,e,t,!1,i)},KW.prototype.copy=function(e,t,i,n){if(i||(i=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n<i&&(n=i),n===i)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(i<0||i>=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t<n-i&&(n=e.length-t+i);var l,o=n-i;if(this===e&&i<t&&t<n)for(l=o-1;l>=0;--l)e[l+t]=this[l+i];else if(o<1e3||!KW.TYPED_ARRAY_SUPPORT)for(l=0;l<o;++l)e[l+t]=this[l+i];else Uint8Array.prototype.set.call(e,this.subarray(i,i+o),t);return o},KW.prototype.fill=function(e,t,i,n){if("string"==typeof e){if("string"==typeof t?(n=t,t=0,i=this.length):"string"==typeof i&&(n=i,i=this.length),1===e.length){var l=e.charCodeAt(0);l<256&&(e=l)}if(void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!KW.isEncoding(n))throw new TypeError("Unknown encoding: "+n)}else"number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<i)throw new RangeError("Out of range index");if(i<=t)return this;var o;if(t>>>=0,i=void 0===i?this.length:i>>>0,e||(e=0),"number"==typeof e)for(o=t;o<i;++o)this[o]=e;else{var c=HW(e)?e:rC(new KW(e,n).toString()),a=c.length;for(o=0;o<i-t;++o)this[o+t]=c[o%a]}return this};var dC=/[^+\/0-9A-Za-z-_]/g;function sC(e){return e<16?"0"+e.toString(16):e.toString(16)}function rC(e,t){var i;t=t||1/0;for(var n=e.length,l=null,o=[],c=0;c<n;++c){if((i=e.charCodeAt(c))>55295&&i<57344){if(!l){if(i>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(c+1===n){(t-=3)>-1&&o.push(239,191,189);continue}l=i;continue}if(i<56320){(t-=3)>-1&&o.push(239,191,189),l=i;continue}i=65536+(l-55296<<10|i-56320)}else l&&(t-=3)>-1&&o.push(239,191,189);if(l=null,i<128){if((t-=1)<0)break;o.push(i)}else if(i<2048){if((t-=2)<0)break;o.push(i>>6|192,63&i|128)}else if(i<65536){if((t-=3)<0)break;o.push(i>>12|224,i>>6&63|128,63&i|128)}else{if(!(i<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(i>>18|240,i>>12&63|128,i>>6&63|128,63&i|128)}}return o}function uC(e){return function(e){var t,i,n,l,o,c;GW||yW();var a=e.length;if(a%4>0)throw new Error("Invalid string. Length must be a multiple of 4");o="="===e[a-2]?2:"="===e[a-1]?1:0,c=new gW(3*a/4-o),n=o>0?a-4:a;var d=0;for(t=0,i=0;t<n;t+=4,i+=3)l=IW[e.charCodeAt(t)]<<18|IW[e.charCodeAt(t+1)]<<12|IW[e.charCodeAt(t+2)]<<6|IW[e.charCodeAt(t+3)],c[d++]=l>>16&255,c[d++]=l>>8&255,c[d++]=255&l;return 2===o?(l=IW[e.charCodeAt(t)]<<2|IW[e.charCodeAt(t+1)]>>4,c[d++]=255&l):1===o&&(l=IW[e.charCodeAt(t)]<<10|IW[e.charCodeAt(t+1)]<<4|IW[e.charCodeAt(t+2)]>>2,c[d++]=l>>8&255,c[d++]=255&l),c}(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(dC,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function ZC(e,t,i,n){for(var l=0;l<n&&!(l+i>=t.length||l>=e.length);++l)t[l+i]=e[l];return l}function bC(e){return null!=e&&(!!e._isBuffer||hC(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&hC(e.slice(0,0))}(e))}function hC(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}var mC=Object.freeze({__proto__:null,Buffer:KW,INSPECT_MAX_BYTES:50,SlowBuffer:function(e){return+e!=e&&(e=0),KW.alloc(+e)},isBuffer:bC,kMaxLength:vW});class pC extends Error{static from(e,t,i,n,l,o){const c=new pC(e.message,t||e.code,i,n,l);return c.cause=e,c.name=e.name,null!=e.status&&null==c.status&&(c.status=e.status),o&&Object.assign(c,o),c}constructor(e,t,i,n,l){super(e),Object.defineProperty(this,"message",{value:e,enumerable:!0,writable:!0,configurable:!0}),this.name="AxiosError",this.isAxiosError=!0,t&&(this.code=t),i&&(this.config=i),n&&(this.request=n),l&&(this.response=l,this.status=l.status)}toJSON(){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:mW.toJSONObject(this.config),code:this.code,status:this.status}}}pC.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE",pC.ERR_BAD_OPTION="ERR_BAD_OPTION",pC.ECONNABORTED="ECONNABORTED",pC.ETIMEDOUT="ETIMEDOUT",pC.ERR_NETWORK="ERR_NETWORK",pC.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS",pC.ERR_DEPRECATED="ERR_DEPRECATED",pC.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE",pC.ERR_BAD_REQUEST="ERR_BAD_REQUEST",pC.ERR_CANCELED="ERR_CANCELED",pC.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT",pC.ERR_INVALID_URL="ERR_INVALID_URL";var IC=pC;function gC(e){return mW.isPlainObject(e)||mW.isArray(e)}function GC(e){return mW.endsWith(e,"[]")?e.slice(0,-2):e}function yC(e,t,i){return e?e.concat(t).map((function(e,t){return e=GC(e),!i&&t?"["+e+"]":e})).join(i?".":""):t}const XC=mW.toFlatObject(mW,{},null,(function(e){return/^is[A-Z]/.test(e)}));function VC(e,t,i){if(!mW.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;const n=(i=mW.toFlatObject(i,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!mW.isUndefined(t[e])}))).metaTokens,l=i.visitor||s,o=i.dots,c=i.indexes,a=(i.Blob||"undefined"!=typeof Blob&&Blob)&&mW.isSpecCompliantForm(t);if(!mW.isFunction(l))throw new TypeError("visitor must be a function");function d(e){if(null===e)return"";if(mW.isDate(e))return e.toISOString();if(mW.isBoolean(e))return e.toString();if(!a&&mW.isBlob(e))throw new IC("Blob is not supported. Use a Buffer instead.");return mW.isArrayBuffer(e)||mW.isTypedArray(e)?a&&"function"==typeof Blob?new Blob([e]):KW.from(e):e}function s(e,i,l){let a=e;if(mW.isReactNative(t)&&mW.isReactNativeBlob(e))return t.append(yC(l,i,o),d(e)),!1;if(e&&!l&&"object"==typeof e)if(mW.endsWith(i,"{}"))i=n?i:i.slice(0,-2),e=JSON.stringify(e);else if(mW.isArray(e)&&function(e){return mW.isArray(e)&&!e.some(gC)}(e)||(mW.isFileList(e)||mW.endsWith(i,"[]"))&&(a=mW.toArray(e)))return i=GC(i),a.forEach((function(e,n){!mW.isUndefined(e)&&null!==e&&t.append(!0===c?yC([i],n,o):null===c?i:i+"[]",d(e))})),!1;return!!gC(e)||(t.append(yC(l,i,o),d(e)),!1)}const r=[],u=Object.assign(XC,{defaultVisitor:s,convertValue:d,isVisitable:gC});if(!mW.isObject(e))throw new TypeError("data must be an object");return function e(i,n){if(!mW.isUndefined(i)){if(-1!==r.indexOf(i))throw Error("Circular reference detected in "+n.join("."));r.push(i),mW.forEach(i,(function(i,o){!0===(!(mW.isUndefined(i)||null===i)&&l.call(t,i,mW.isString(o)?o.trim():o,n,u))&&e(i,n?n.concat(o):[o])})),r.pop()}}(e),t}function WC(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function CC(e,t){this._pairs=[],e&&VC(e,this,t)}const RC=CC.prototype;function SC(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function vC(e,t,i){if(!t)return e;const n=i&&i.encode||SC,l=mW.isFunction(i)?{serialize:i}:i,o=l&&l.serialize;let c;if(c=o?o(t,l):mW.isURLSearchParams(t)?t.toString():new CC(t,l).toString(n),c){const t=e.indexOf("#");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+c}return e}RC.append=function(e,t){this._pairs.push([e,t])},RC.toString=function(e){const t=e?function(t){return e.call(this,t,WC)}:WC;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var fC=class{constructor(){this.handlers=[]}use(e,t,i){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!i&&i.synchronous,runWhen:i?i.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){mW.forEach(this.handlers,(function(t){null!==t&&e(t)}))}},YC={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0},KC={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:CC,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]};const NC="undefined"!=typeof window&&"undefined"!=typeof document,JC="object"==typeof navigator&&navigator||void 0,UC=NC&&(!JC||["ReactNative","NativeScript","NS"].indexOf(JC.product)<0),LC="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,kC=NC&&window.location.href||"http://localhost";var HC={...Object.freeze({__proto__:null,hasBrowserEnv:NC,hasStandardBrowserWebWorkerEnv:LC,hasStandardBrowserEnv:UC,navigator:JC,origin:kC}),...KC};function TC(e){function t(e,i,n,l){let o=e[l++];if("__proto__"===o)return!0;const c=Number.isFinite(+o),a=l>=e.length;if(o=!o&&mW.isArray(n)?n.length:o,a)return mW.hasOwnProp(n,o)?n[o]=[n[o],i]:n[o]=i,!c;n[o]&&mW.isObject(n[o])||(n[o]=[]);return t(e,i,n[o],l)&&mW.isArray(n[o])&&(n[o]=function(e){const t={},i=Object.keys(e);let n;const l=i.length;let o;for(n=0;n<l;n++)o=i[n],t[o]=e[o];return t}(n[o])),!c}if(mW.isFormData(e)&&mW.isFunction(e.entries)){const i={};return mW.forEachEntry(e,((e,n)=>{t(function(e){return mW.matchAll(/\w+|\[(\w*)]/g,e).map((e=>"[]"===e[0]?"":e[1]||e[0]))}(e),n,i,0)})),i}return null}const FC={transitional:YC,adapter:["xhr","http","fetch"],transformRequest:[function(e,t){const i=t.getContentType()||"",n=i.indexOf("application/json")>-1,l=mW.isObject(e);l&&mW.isHTMLForm(e)&&(e=new FormData(e));if(mW.isFormData(e))return n?JSON.stringify(TC(e)):e;if(mW.isArrayBuffer(e)||mW.isBuffer(e)||mW.isStream(e)||mW.isFile(e)||mW.isBlob(e)||mW.isReadableStream(e))return e;if(mW.isArrayBufferView(e))return e.buffer;if(mW.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let o;if(l){if(i.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return VC(e,new HC.classes.URLSearchParams,{visitor:function(e,t,i,n){return HC.isNode&&mW.isBuffer(e)?(this.append(t,e.toString("base64")),!1):n.defaultVisitor.apply(this,arguments)},...t})}(e,this.formSerializer).toString();if((o=mW.isFileList(e))||i.indexOf("multipart/form-data")>-1){const t=this.env&&this.env.FormData;return VC(o?{"files[]":e}:e,t&&new t,this.formSerializer)}}return l||n?(t.setContentType("application/json",!1),function(e,t,i){if(mW.isString(e))try{return(t||JSON.parse)(e),mW.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(i||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||FC.transitional,i=t&&t.forcedJSONParsing,n="json"===this.responseType;if(mW.isResponse(e)||mW.isReadableStream(e))return e;if(e&&mW.isString(e)&&(i&&!this.responseType||n)){const i=!(t&&t.silentJSONParsing)&&n;try{return JSON.parse(e,this.parseReviver)}catch(e){if(i){if("SyntaxError"===e.name)throw IC.from(e,IC.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:HC.classes.FormData,Blob:HC.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};mW.forEach(["delete","get","head","post","put","patch"],(e=>{FC.headers[e]={}}));var xC=FC;const BC=mW.toObjectSet(["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"]);const AC=Symbol("internals");function zC(e){return e&&String(e).trim().toLowerCase()}function wC(e){return!1===e||null==e?e:mW.isArray(e)?e.map(wC):String(e)}function PC(e,t,i,n,l){return mW.isFunction(n)?n.call(this,t,i):(l&&(t=i),mW.isString(t)?mW.isString(n)?-1!==t.indexOf(n):mW.isRegExp(n)?n.test(t):void 0:void 0)}class QC{constructor(e){e&&this.set(e)}set(e,t,i){const n=this;function l(e,t,i){const l=zC(t);if(!l)throw new Error("header name must be a non-empty string");const o=mW.findKey(n,l);(!o||void 0===n[o]||!0===i||void 0===i&&!1!==n[o])&&(n[o||t]=wC(e))}const o=(e,t)=>mW.forEach(e,((e,i)=>l(e,i,t)));if(mW.isPlainObject(e)||e instanceof this.constructor)o(e,t);else if(mW.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))o((e=>{const t={};let i,n,l;return e&&e.split("\n").forEach((function(e){l=e.indexOf(":"),i=e.substring(0,l).trim().toLowerCase(),n=e.substring(l+1).trim(),!i||t[i]&&BC[i]||("set-cookie"===i?t[i]?t[i].push(n):t[i]=[n]:t[i]=t[i]?t[i]+", "+n:n)})),t})(e),t);else if(mW.isObject(e)&&mW.isIterable(e)){let i,n,l={};for(const t of e){if(!mW.isArray(t))throw TypeError("Object iterator must return a key-value pair");l[n=t[0]]=(i=l[n])?mW.isArray(i)?[...i,t[1]]:[i,t[1]]:t[1]}o(l,t)}else null!=e&&l(t,e,i);return this}get(e,t){if(e=zC(e)){const i=mW.findKey(this,e);if(i){const e=this[i];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),i=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let n;for(;n=i.exec(e);)t[n[1]]=n[2];return t}(e);if(mW.isFunction(t))return t.call(this,e,i);if(mW.isRegExp(t))return t.exec(e);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,t){if(e=zC(e)){const i=mW.findKey(this,e);return!(!i||void 0===this[i]||t&&!PC(0,this[i],i,t))}return!1}delete(e,t){const i=this;let n=!1;function l(e){if(e=zC(e)){const l=mW.findKey(i,e);!l||t&&!PC(0,i[l],l,t)||(delete i[l],n=!0)}}return mW.isArray(e)?e.forEach(l):l(e),n}clear(e){const t=Object.keys(this);let i=t.length,n=!1;for(;i--;){const l=t[i];e&&!PC(0,this[l],l,e,!0)||(delete this[l],n=!0)}return n}normalize(e){const t=this,i={};return mW.forEach(this,((n,l)=>{const o=mW.findKey(i,l);if(o)return t[o]=wC(n),void delete t[l];const c=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,((e,t,i)=>t.toUpperCase()+i))}(l):String(l).trim();c!==l&&delete t[l],t[c]=wC(n),i[c]=!0})),this}concat(){for(var e=arguments.length,t=new Array(e),i=0;i<e;i++)t[i]=arguments[i];return this.constructor.concat(this,...t)}toJSON(e){const t=Object.create(null);return mW.forEach(this,((i,n)=>{null!=i&&!1!==i&&(t[n]=e&&mW.isArray(i)?i.join(", "):i)})),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map((e=>{let[t,i]=e;return t+": "+i})).join("\n")}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e){const t=new this(e);for(var i=arguments.length,n=new Array(i>1?i-1:0),l=1;l<i;l++)n[l-1]=arguments[l];return n.forEach((e=>t.set(e))),t}static accessor(e){const t=(this[AC]=this[AC]={accessors:{}}).accessors,i=this.prototype;function n(e){const n=zC(e);t[n]||(!function(e,t){const i=mW.toCamelCase(" "+t);["get","set","has"].forEach((n=>{Object.defineProperty(e,n+i,{value:function(e,i,l){return this[n].call(this,t,e,i,l)},configurable:!0})}))}(i,e),t[n]=!0)}return mW.isArray(e)?e.forEach(n):n(e),this}}QC.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),mW.reduceDescriptors(QC.prototype,((e,t)=>{let{value:i}=e,n=t[0].toUpperCase()+t.slice(1);return{get:()=>i,set(e){this[n]=e}}})),mW.freezeMethods(QC);var jC=QC;function MC(e,t){const i=this||xC,n=t||i,l=jC.from(n.headers);let o=n.data;return mW.forEach(e,(function(e){o=e.call(i,o,l.normalize(),t?t.status:void 0)})),l.normalize(),o}function EC(e){return!(!e||!e.__CANCEL__)}var DC=class extends IC{constructor(e,t,i){super(null==e?"canceled":e,IC.ERR_CANCELED,t,i),this.name="CanceledError",this.__CANCEL__=!0}};function OC(e,t,i){const n=i.config.validateStatus;i.status&&n&&!n(i.status)?t(new IC("Request failed with status code "+i.status,[IC.ERR_BAD_REQUEST,IC.ERR_BAD_RESPONSE][Math.floor(i.status/100)-4],i.config,i.request,i)):e(i)}function _C(e,t){e=e||10;const i=new Array(e),n=new Array(e);let l,o=0,c=0;return t=void 0!==t?t:1e3,function(a){const d=Date.now(),s=n[c];l||(l=d),i[o]=a,n[o]=d;let r=c,u=0;for(;r!==o;)u+=i[r++],r%=e;if(o=(o+1)%e,o===c&&(c=(c+1)%e),d-l<t)return;const Z=s&&d-s;return Z?Math.round(1e3*u/Z):void 0}}function qC(e,t){let i,n,l=0,o=1e3/t;const c=function(t){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now();l=o,i=null,n&&(clearTimeout(n),n=null),e(...t)};return[function(){const e=Date.now(),t=e-l;for(var a=arguments.length,d=new Array(a),s=0;s<a;s++)d[s]=arguments[s];t>=o?c(d,e):(i=d,n||(n=setTimeout((()=>{n=null,c(i)}),o-t)))},()=>i&&c(i)]}const $C=function(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3,n=0;const l=_C(50,250);return qC((i=>{const o=i.loaded,c=i.lengthComputable?i.total:void 0,a=o-n,d=l(a);n=o;e({loaded:o,total:c,progress:c?o/c:void 0,bytes:a,rate:d||void 0,estimated:d&&c&&o<=c?(c-o)/d:void 0,event:i,lengthComputable:null!=c,[t?"download":"upload"]:!0})}),i)},eR=(e,t)=>{const i=null!=e;return[n=>t[0]({lengthComputable:i,total:e,loaded:n}),t[1]]},tR=e=>function(){for(var t=arguments.length,i=new Array(t),n=0;n<t;n++)i[n]=arguments[n];return mW.asap((()=>e(...i)))};var iR=HC.hasStandardBrowserEnv?((e,t)=>i=>(i=new URL(i,HC.origin),e.protocol===i.protocol&&e.host===i.host&&(t||e.port===i.port)))(new URL(HC.origin),HC.navigator&&/(msie|trident)/i.test(HC.navigator.userAgent)):()=>!0,nR=HC.hasStandardBrowserEnv?{write(e,t,i,n,l,o,c){if("undefined"==typeof document)return;const a=["".concat(e,"=").concat(encodeURIComponent(t))];mW.isNumber(i)&&a.push("expires=".concat(new Date(i).toUTCString())),mW.isString(n)&&a.push("path=".concat(n)),mW.isString(l)&&a.push("domain=".concat(l)),!0===o&&a.push("secure"),mW.isString(c)&&a.push("SameSite=".concat(c)),document.cookie=a.join("; ")},read(e){if("undefined"==typeof document)return null;const t=document.cookie.match(new RegExp("(?:^|; )"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,"",Date.now()-864e5,"/")}}:{write(){},read:()=>null,remove(){}};function lR(e,t,i){let n=!function(e){return"string"==typeof e&&/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}(t);return e&&(n||0==i)?function(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}(e,t):t}const oR=e=>e instanceof jC?{...e}:e;function cR(e,t){t=t||{};const i={};function n(e,t,i,n){return mW.isPlainObject(e)&&mW.isPlainObject(t)?mW.merge.call({caseless:n},e,t):mW.isPlainObject(t)?mW.merge({},t):mW.isArray(t)?t.slice():t}function l(e,t,i,l){return mW.isUndefined(t)?mW.isUndefined(e)?void 0:n(void 0,e,0,l):n(e,t,0,l)}function o(e,t){if(!mW.isUndefined(t))return n(void 0,t)}function c(e,t){return mW.isUndefined(t)?mW.isUndefined(e)?void 0:n(void 0,e):n(void 0,t)}function a(i,l,o){return o in t?n(i,l):o in e?n(void 0,i):void 0}const d={url:o,method:o,data:o,baseURL:c,transformRequest:c,transformResponse:c,paramsSerializer:c,timeout:c,timeoutMessage:c,withCredentials:c,withXSRFToken:c,adapter:c,responseType:c,xsrfCookieName:c,xsrfHeaderName:c,onUploadProgress:c,onDownloadProgress:c,decompress:c,maxContentLength:c,maxBodyLength:c,beforeRedirect:c,transport:c,httpAgent:c,httpsAgent:c,cancelToken:c,socketPath:c,responseEncoding:c,validateStatus:a,headers:(e,t,i)=>l(oR(e),oR(t),0,!0)};return mW.forEach(Object.keys({...e,...t}),(function(n){if("__proto__"===n||"constructor"===n||"prototype"===n)return;const o=mW.hasOwnProp(d,n)?d[n]:l,c=o(e[n],t[n],n);mW.isUndefined(c)&&o!==a||(i[n]=c)})),i}var aR=e=>{const t=cR({},e);let{data:i,withXSRFToken:n,xsrfHeaderName:l,xsrfCookieName:o,headers:c,auth:a}=t;if(t.headers=c=jC.from(c),t.url=vC(lR(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),a&&c.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):""))),mW.isFormData(i))if(HC.hasStandardBrowserEnv||HC.hasStandardBrowserWebWorkerEnv)c.setContentType(void 0);else if(mW.isFunction(i.getHeaders)){const e=i.getHeaders(),t=["content-type","content-length"];Object.entries(e).forEach((e=>{let[i,n]=e;t.includes(i.toLowerCase())&&c.set(i,n)}))}if(HC.hasStandardBrowserEnv&&(n&&mW.isFunction(n)&&(n=n(t)),n||!1!==n&&iR(t.url))){const e=l&&o&&nR.read(o);e&&c.set(l,e)}return t};var dR="undefined"!=typeof XMLHttpRequest&&function(e){return new Promise((function(t,i){const n=aR(e);let l=n.data;const o=jC.from(n.headers).normalize();let c,a,d,s,r,{responseType:u,onUploadProgress:Z,onDownloadProgress:b}=n;function h(){s&&s(),r&&r(),n.cancelToken&&n.cancelToken.unsubscribe(c),n.signal&&n.signal.removeEventListener("abort",c)}let m=new XMLHttpRequest;function p(){if(!m)return;const n=jC.from("getAllResponseHeaders"in m&&m.getAllResponseHeaders());OC((function(e){t(e),h()}),(function(e){i(e),h()}),{data:u&&"text"!==u&&"json"!==u?m.response:m.responseText,status:m.status,statusText:m.statusText,headers:n,config:e,request:m}),m=null}m.open(n.method.toUpperCase(),n.url,!0),m.timeout=n.timeout,"onloadend"in m?m.onloadend=p:m.onreadystatechange=function(){m&&4===m.readyState&&(0!==m.status||m.responseURL&&0===m.responseURL.indexOf("file:"))&&setTimeout(p)},m.onabort=function(){m&&(i(new IC("Request aborted",IC.ECONNABORTED,e,m)),m=null)},m.onerror=function(t){const n=t&&t.message?t.message:"Network Error",l=new IC(n,IC.ERR_NETWORK,e,m);l.event=t||null,i(l),m=null},m.ontimeout=function(){let t=n.timeout?"timeout of "+n.timeout+"ms exceeded":"timeout exceeded";const l=n.transitional||YC;n.timeoutErrorMessage&&(t=n.timeoutErrorMessage),i(new IC(t,l.clarifyTimeoutError?IC.ETIMEDOUT:IC.ECONNABORTED,e,m)),m=null},void 0===l&&o.setContentType(null),"setRequestHeader"in m&&mW.forEach(o.toJSON(),(function(e,t){m.setRequestHeader(t,e)})),mW.isUndefined(n.withCredentials)||(m.withCredentials=!!n.withCredentials),u&&"json"!==u&&(m.responseType=n.responseType),b&&([d,r]=$C(b,!0),m.addEventListener("progress",d)),Z&&m.upload&&([a,s]=$C(Z),m.upload.addEventListener("progress",a),m.upload.addEventListener("loadend",s)),(n.cancelToken||n.signal)&&(c=t=>{m&&(i(!t||t.type?new DC(null,e,m):t),m.abort(),m=null)},n.cancelToken&&n.cancelToken.subscribe(c),n.signal&&(n.signal.aborted?c():n.signal.addEventListener("abort",c)));const I=function(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}(n.url);I&&-1===HC.protocols.indexOf(I)?i(new IC("Unsupported protocol "+I+":",IC.ERR_BAD_REQUEST,e)):m.send(l||null)}))};var sR=(e,t)=>{const{length:i}=e=e?e.filter(Boolean):[];if(t||i){let i,n=new AbortController;const l=function(e){if(!i){i=!0,c();const t=e instanceof Error?e:this.reason;n.abort(t instanceof IC?t:new DC(t instanceof Error?t.message:t))}};let o=t&&setTimeout((()=>{o=null,l(new IC("timeout of ".concat(t,"ms exceeded"),IC.ETIMEDOUT))}),t);const c=()=>{e&&(o&&clearTimeout(o),o=null,e.forEach((e=>{e.unsubscribe?e.unsubscribe(l):e.removeEventListener("abort",l)})),e=null)};e.forEach((e=>e.addEventListener("abort",l)));const{signal:a}=n;return a.unsubscribe=()=>mW.asap(c),a}};const rR=function*(e,t){let i=e.byteLength;if(!t||i<t)return void(yield e);let n,l=0;for(;l<i;)n=l+t,yield e.slice(l,n),l=n},uR=async function*(e){if(e[Symbol.asyncIterator])return void(yield*e);const t=e.getReader();try{for(;;){const{done:e,value:i}=await t.read();if(e)break;yield i}}finally{await t.cancel()}},ZR=(e,t,i,n)=>{const l=async function*(e,t){for await(const i of uR(e))yield*rR(i,t)}(e,t);let o,c=0,a=e=>{o||(o=!0,n&&n(e))};return new ReadableStream({async pull(e){try{const{done:t,value:n}=await l.next();if(t)return a(),void e.close();let o=n.byteLength;if(i){let e=c+=o;i(e)}e.enqueue(new Uint8Array(n))}catch(e){throw a(e),e}},cancel:e=>(a(e),l.return())},{highWaterMark:2})},{isFunction:bR}=mW,hR=(e=>{let{Request:t,Response:i}=e;return{Request:t,Response:i}})(mW.global),{ReadableStream:mR,TextEncoder:pR}=mW.global,IR=function(e){try{for(var t=arguments.length,i=new Array(t>1?t-1:0),n=1;n<t;n++)i[n-1]=arguments[n];return!!e(...i)}catch(e){return!1}},gR=e=>{e=mW.merge.call({skipUndefined:!0},hR,e);const{fetch:t,Request:i,Response:n}=e,l=t?bR(t):"function"==typeof fetch,o=bR(i),c=bR(n);if(!l)return!1;const a=l&&bR(mR),d=l&&("function"==typeof pR?(e=>t=>e.encode(t))(new pR):async e=>new Uint8Array(await new i(e).arrayBuffer())),s=o&&a&&IR((()=>{let e=!1;const t=new i(HC.origin,{body:new mR,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t})),r=c&&a&&IR((()=>mW.isReadableStream(new n("").body))),u={stream:r&&(e=>e.body)};l&&["text","arrayBuffer","blob","formData","stream"].forEach((e=>{!u[e]&&(u[e]=(t,i)=>{let n=t&&t[e];if(n)return n.call(t);throw new IC("Response type '".concat(e,"' is not supported"),IC.ERR_NOT_SUPPORT,i)})}));const Z=async(e,t)=>{const n=mW.toFiniteNumber(e.getContentLength());return null==n?(async e=>{if(null==e)return 0;if(mW.isBlob(e))return e.size;if(mW.isSpecCompliantForm(e)){const t=new i(HC.origin,{method:"POST",body:e});return(await t.arrayBuffer()).byteLength}return mW.isArrayBufferView(e)||mW.isArrayBuffer(e)?e.byteLength:(mW.isURLSearchParams(e)&&(e+=""),mW.isString(e)?(await d(e)).byteLength:void 0)})(t):n};return async e=>{let{url:l,method:c,data:a,signal:d,cancelToken:b,timeout:h,onDownloadProgress:m,onUploadProgress:p,responseType:I,headers:g,withCredentials:G="same-origin",fetchOptions:y}=aR(e),X=t||fetch;I=I?(I+"").toLowerCase():"text";let V=sR([d,b&&b.toAbortSignal()],h),W=null;const C=V&&V.unsubscribe&&(()=>{V.unsubscribe()});let R;try{if(p&&s&&"get"!==c&&"head"!==c&&0!==(R=await Z(g,a))){let e,t=new i(l,{method:"POST",body:a,duplex:"half"});if(mW.isFormData(a)&&(e=t.headers.get("content-type"))&&g.setContentType(e),t.body){const[e,i]=eR(R,$C(tR(p)));a=ZR(t.body,65536,e,i)}}mW.isString(G)||(G=G?"include":"omit");const t=o&&"credentials"in i.prototype,d={...y,signal:V,method:c.toUpperCase(),headers:g.normalize().toJSON(),body:a,duplex:"half",credentials:t?G:void 0};W=o&&new i(l,d);let b=await(o?X(W,y):X(l,d));const h=r&&("stream"===I||"response"===I);if(r&&(m||h&&C)){const e={};["status","statusText","headers"].forEach((t=>{e[t]=b[t]}));const t=mW.toFiniteNumber(b.headers.get("content-length")),[i,l]=m&&eR(t,$C(tR(m),!0))||[];b=new n(ZR(b.body,65536,i,(()=>{l&&l(),C&&C()})),e)}I=I||"text";let S=await u[mW.findKey(u,I)||"text"](b,e);return!h&&C&&C(),await new Promise(((t,i)=>{OC(t,i,{data:S,headers:jC.from(b.headers),status:b.status,statusText:b.statusText,config:e,request:W})}))}catch(t){if(C&&C(),t&&"TypeError"===t.name&&/Load failed|fetch/i.test(t.message))throw Object.assign(new IC("Network Error",IC.ERR_NETWORK,e,W,t&&t.response),{cause:t.cause||t});throw IC.from(t,t&&t.code,e,W,t&&t.response)}}},GR=new Map,yR=e=>{let t=e&&e.env||{};const{fetch:i,Request:n,Response:l}=t,o=[n,l,i];let c,a,d=o.length,s=GR;for(;d--;)c=o[d],a=s.get(c),void 0===a&&s.set(c,a=d?new Map:gR(t)),s=a;return a};yR();const XR={http:null,xhr:dR,fetch:{get:yR}};mW.forEach(XR,((e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch(e){}Object.defineProperty(e,"adapterName",{value:t})}}));const VR=e=>"- ".concat(e),WR=e=>mW.isFunction(e)||null===e||!1===e;var CR={getAdapter:function(e,t){e=mW.isArray(e)?e:[e];const{length:i}=e;let n,l;const o={};for(let c=0;c<i;c++){let i;if(n=e[c],l=n,!WR(n)&&(l=XR[(i=String(n)).toLowerCase()],void 0===l))throw new IC("Unknown adapter '".concat(i,"'"));if(l&&(mW.isFunction(l)||(l=l.get(t))))break;o[i||"#"+c]=l}if(!l){const e=Object.entries(o).map((e=>{let[t,i]=e;return"adapter ".concat(t," ")+(!1===i?"is not supported by the environment":"is not available in the build")}));let t=i?e.length>1?"since :\n"+e.map(VR).join("\n"):" "+VR(e[0]):"as no adapter specified";throw new IC("There is no suitable adapter to dispatch the request "+t,"ERR_NOT_SUPPORT")}return l},adapters:XR};function RR(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new DC(null,e)}function SR(e){RR(e),e.headers=jC.from(e.headers),e.data=MC.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1);return CR.getAdapter(e.adapter||xC.adapter,e)(e).then((function(t){return RR(e),t.data=MC.call(e,e.transformResponse,t),t.headers=jC.from(t.headers),t}),(function(t){return EC(t)||(RR(e),t&&t.response&&(t.response.data=MC.call(e,e.transformResponse,t.response),t.response.headers=jC.from(t.response.headers))),Promise.reject(t)}))}const vR="1.13.6",fR={};["object","boolean","number","function","string","symbol"].forEach(((e,t)=>{fR[e]=function(i){return typeof i===e||"a"+(t<1?"n ":" ")+e}}));const YR={};fR.transitional=function(e,t,i){function n(e,t){return"[Axios v1.13.6] Transitional option '"+e+"'"+t+(i?". "+i:"")}return(i,l,o)=>{if(!1===e)throw new IC(n(l," has been removed"+(t?" in "+t:"")),IC.ERR_DEPRECATED);return t&&!YR[l]&&(YR[l]=!0,console.warn(n(l," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(i,l,o)}},fR.spelling=function(e){return(t,i)=>(console.warn("".concat(i," is likely a misspelling of ").concat(e)),!0)};var KR={assertOptions:function(e,t,i){if("object"!=typeof e)throw new IC("options must be an object",IC.ERR_BAD_OPTION_VALUE);const n=Object.keys(e);let l=n.length;for(;l-- >0;){const o=n[l],c=t[o];if(c){const t=e[o],i=void 0===t||c(t,o,e);if(!0!==i)throw new IC("option "+o+" must be "+i,IC.ERR_BAD_OPTION_VALUE)}else if(!0!==i)throw new IC("Unknown option "+o,IC.ERR_BAD_OPTION)}},validators:fR};const NR=KR.validators;class JR{constructor(e){this.defaults=e||{},this.interceptors={request:new fC,response:new fC}}async request(e,t){try{return await this._request(e,t)}catch(e){if(e instanceof Error){let t={};Error.captureStackTrace?Error.captureStackTrace(t):t=new Error;const i=t.stack?t.stack.replace(/^.+\n/,""):"";try{e.stack?i&&!String(e.stack).endsWith(i.replace(/^.+\n.+\n/,""))&&(e.stack+="\n"+i):e.stack=i}catch(e){}}throw e}}_request(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},t=cR(this.defaults,t);const{transitional:i,paramsSerializer:n,headers:l}=t;void 0!==i&&KR.assertOptions(i,{silentJSONParsing:NR.transitional(NR.boolean),forcedJSONParsing:NR.transitional(NR.boolean),clarifyTimeoutError:NR.transitional(NR.boolean),legacyInterceptorReqResOrdering:NR.transitional(NR.boolean)},!1),null!=n&&(mW.isFunction(n)?t.paramsSerializer={serialize:n}:KR.assertOptions(n,{encode:NR.function,serialize:NR.function},!0)),void 0!==t.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),KR.assertOptions(t,{baseUrl:NR.spelling("baseURL"),withXsrfToken:NR.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();let o=l&&mW.merge(l.common,l[t.method]);l&&mW.forEach(["delete","get","head","post","put","patch","common"],(e=>{delete l[e]})),t.headers=jC.concat(o,l);const c=[];let a=!0;this.interceptors.request.forEach((function(e){if("function"==typeof e.runWhen&&!1===e.runWhen(t))return;a=a&&e.synchronous;const i=t.transitional||YC;i&&i.legacyInterceptorReqResOrdering?c.unshift(e.fulfilled,e.rejected):c.push(e.fulfilled,e.rejected)}));const d=[];let s;this.interceptors.response.forEach((function(e){d.push(e.fulfilled,e.rejected)}));let r,u=0;if(!a){const e=[SR.bind(this),void 0];for(e.unshift(...c),e.push(...d),r=e.length,s=Promise.resolve(t);u<r;)s=s.then(e[u++],e[u++]);return s}r=c.length;let Z=t;for(;u<r;){const e=c[u++],t=c[u++];try{Z=e(Z)}catch(e){t.call(this,e);break}}try{s=SR.call(this,Z)}catch(e){return Promise.reject(e)}for(u=0,r=d.length;u<r;)s=s.then(d[u++],d[u++]);return s}getUri(e){return vC(lR((e=cR(this.defaults,e)).baseURL,e.url,e.allowAbsoluteUrls),e.params,e.paramsSerializer)}}mW.forEach(["delete","get","head","options"],(function(e){JR.prototype[e]=function(t,i){return this.request(cR(i||{},{method:e,url:t,data:(i||{}).data}))}})),mW.forEach(["post","put","patch"],(function(e){function t(t){return function(i,n,l){return this.request(cR(l||{},{method:e,headers:t?{"Content-Type":"multipart/form-data"}:{},url:i,data:n}))}}JR.prototype[e]=t(),JR.prototype[e+"Form"]=t(!0)}));var UR=JR;class LR{constructor(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");let t;this.promise=new Promise((function(e){t=e}));const i=this;this.promise.then((e=>{if(!i._listeners)return;let t=i._listeners.length;for(;t-- >0;)i._listeners[t](e);i._listeners=null})),this.promise.then=e=>{let t;const n=new Promise((e=>{i.subscribe(e),t=e})).then(e);return n.cancel=function(){i.unsubscribe(t)},n},e((function(e,n,l){i.reason||(i.reason=new DC(e,n,l),t(i.reason))}))}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}toAbortSignal(){const e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;const t=new LR((function(t){e=t}));return{token:t,cancel:e}}}var kR=LR;const HR={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(HR).forEach((e=>{let[t,i]=e;HR[i]=t}));var TR=HR;const FR=function e(t){const i=new UR(t),n=CV(UR.prototype.request,i);return mW.extend(n,UR.prototype,i,{allOwnKeys:!0}),mW.extend(n,i,null,{allOwnKeys:!0}),n.create=function(i){return e(cR(t,i))},n}(xC);FR.Axios=UR,FR.CanceledError=DC,FR.CancelToken=kR,FR.isCancel=EC,FR.VERSION=vR,FR.toFormData=VC,FR.AxiosError=IC,FR.Cancel=FR.CanceledError,FR.all=function(e){return Promise.all(e)},FR.spread=function(e){return function(t){return e.apply(null,t)}},FR.isAxiosError=function(e){return mW.isObject(e)&&!0===e.isAxiosError},FR.mergeConfig=cR,FR.AxiosHeaders=jC,FR.formToJSON=e=>TC(mW.isHTMLForm(e)?new FormData(e):e),FR.getAdapter=CR.getAdapter,FR.HttpStatusCode=TR,FR.default=FR;var xR=FR;const{Axios:BR,AxiosError:AR,CanceledError:zR,isCancel:wR,CancelToken:PR,VERSION:QR,all:jR,Cancel:MR,isAxiosError:ER,spread:DR,toFormData:OR,AxiosHeaders:_R,HttpStatusCode:qR,formToJSON:$R,getAdapter:eS,mergeConfig:tS}=xR;var iS;let nS=iS=class{constructor(){this.attachToken=()=>Promise.resolve(),this.requestStartCallback=()=>null,this.requestSuccessCallback=()=>null,this.requestErrorCallback=()=>null,this.requestFinishCallback=()=>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)}static getInstance(){return this.axiosInstance||(this.axiosInstance=xR.create({withCredentials:!0}),this.clientInstance||(this.clientInstance=new iS),this.axiosInstance.interceptors.request.use((e=>Uy(this,void 0,void 0,(function*(){return yield this.clientInstance.requestHandler(e)})))),this.axiosInstance.interceptors.response.use((e=>this.clientInstance.successHandler(e)),(e=>this.clientInstance.errorHandler(e))),this.axiosInstance.all=xR.all,this.axiosInstance.spread=xR.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}requestHandler(e){return Uy(this,void 0,void 0,(function*(){if(yield this.attachToken(e),null==e?void 0:e.shouldEncodeToFormData){const t=null==e?void 0:e.data,i=new FormData;Object.keys(t).forEach((e=>{i.append(e,t[e])})),e.data=i}return e.startTimeInMs=(new Date).getTime(),iS.isHandlerEnabled&&this.requestStartCallback&&"function"==typeof this.requestStartCallback&&this.requestStartCallback(e),e}))}errorHandler(e){throw iS.isHandlerEnabled&&(this.requestErrorCallback&&"function"==typeof this.requestErrorCallback&&this.requestErrorCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}successHandler(e){var t,i;return"stream"===(null===(i=null===(t=e)||void 0===t?void 0:t.config)||void 0===i?void 0:i.responseType)||iS.isHandlerEnabled&&(this.requestSuccessCallback&&"function"==typeof this.requestSuccessCallback&&this.requestSuccessCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}init(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=arguments.length>1?arguments[1]:void 0;return Uy(this,void 0,void 0,(function*(){iS.isHandlerEnabled=e,this.attachToken=t}))}enableHandler(){iS.isHandlerEnabled=!0}disableHandler(){iS.isHandlerEnabled=!1}disableHandlerWithTimeout(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:iS.DEFAULT_HANDLER_DISABLE_TIMEOUT;iS.isHandlerEnabled=!1,setTimeout((()=>{iS.isHandlerEnabled=!0}),e)}setHttpRequestStartCallback(e){this.requestStartCallback=e}setHttpRequestSuccessCallback(e){this.requestSuccessCallback=e}setHttpRequestErrorCallback(e){this.requestErrorCallback=e}setHttpRequestFinishCallback(e){this.requestFinishCallback=e}};nS.DEFAULT_HANDLER_DISABLE_TIMEOUT=1e3,nS=iS=function(e,t,i,n){var l,o=arguments.length,c=o<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)c=Reflect.decorate(e,t,i,n);else for(var a=e.length-1;a>=0;a--)(l=e[a])&&(c=(o<3?l(c):o>3?l(t,i,c):l(t,i))||c);return o>3&&c&&Object.defineProperty(t,i,c),c}([e=>{}],nS);class lS{setData(e,t){return Uy(this,void 0,void 0,(function*(){localStorage.setItem(e,t)}))}getData(e){var t;return Uy(this,void 0,void 0,(function*(){return null!==(t=localStorage.getItem(e))&&void 0!==t?t:"{}"}))}removeData(e){return Uy(this,void 0,void 0,(function*(){localStorage.removeItem(e)}))}}class oS{constructor(){this._data=new Map}setData(e,t){return Uy(this,void 0,void 0,(function*(){this._data.set(e,t)}))}getData(e){var t,i;return Uy(this,void 0,void 0,(function*(){return null!==(i=null===(t=this._data)||void 0===t?void 0:t.get(e))&&void 0!==i?i:"{}"}))}removeData(e){return Uy(this,void 0,void 0,(function*(){this._data.delete(e)}))}}class cS{setData(e,t){return Uy(this,void 0,void 0,(function*(){sessionStorage.setItem(e,t)}))}getData(e){var t;return Uy(this,void 0,void 0,(function*(){return null!==(t=sessionStorage.getItem(e))&&void 0!==t?t:"{}"}))}removeData(e){return Uy(this,void 0,void 0,(function*(){sessionStorage.removeItem(e)}))}}var aS={exports:{}},dS={},sS={};Object.defineProperty(sS,"__esModule",{value:!0}),sS.default=function(e){var t=e.length,i=t%4;if(!i)return e;var n=t,l=4-i,o=t+l,c=KW.alloc(o);for(c.write(e);l--;)c.write("=",n++);return c.toString()},Object.defineProperty(dS,"__esModule",{value:!0});var rS=sS;function uS(e,t){return void 0===t&&(t="utf8"),KW.isBuffer(e)?bS(e.toString("base64")):bS(KW.from(e,t).toString("base64"))}function ZS(e){return e=e.toString(),rS.default(e).replace(/\-/g,"+").replace(/_/g,"/")}function bS(e){return e.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}var hS=uS;hS.encode=uS,hS.decode=function(e,t){return void 0===t&&(t="utf8"),KW.from(ZS(e),"base64").toString(t)},hS.toBase64=ZS,hS.fromBase64=bS,hS.toBuffer=function(e){return KW.from(ZS(e),"base64")},dS.default=hS,function(e){e.exports=dS.default,e.exports.default=e.exports}(aS);var mS=aS.exports,pS={exports:{}};!function(e){!function(t,i){var n={};!function(e){e.__esModule=!0,e.digestLength=32,e.blockSize=64;var t=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 i(e,i,n,l,o){for(var c,a,d,s,r,u,Z,b,h,m,p,I,g;o>=64;){for(c=i[0],a=i[1],d=i[2],s=i[3],r=i[4],u=i[5],Z=i[6],b=i[7],m=0;m<16;m++)p=l+4*m,e[m]=(255&n[p])<<24|(255&n[p+1])<<16|(255&n[p+2])<<8|255&n[p+3];for(m=16;m<64;m++)I=((h=e[m-2])>>>17|h<<15)^(h>>>19|h<<13)^h>>>10,g=((h=e[m-15])>>>7|h<<25)^(h>>>18|h<<14)^h>>>3,e[m]=(I+e[m-7]|0)+(g+e[m-16]|0);for(m=0;m<64;m++)I=(((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+(r&u^~r&Z)|0)+(b+(t[m]+e[m]|0)|0)|0,g=((c>>>2|c<<30)^(c>>>13|c<<19)^(c>>>22|c<<10))+(c&a^c&d^a&d)|0,b=Z,Z=u,u=r,r=s+I|0,s=d,d=a,a=c,c=I+g|0;i[0]+=c,i[1]+=a,i[2]+=d,i[3]+=s,i[4]+=r,i[5]+=u,i[6]+=Z,i[7]+=b,l+=64,o-=64}return l}var n=function(){function t(){this.digestLength=e.digestLength,this.blockSize=e.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 t.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},t.prototype.clean=function(){for(var e=0;e<this.buffer.length;e++)this.buffer[e]=0;for(e=0;e<this.temp.length;e++)this.temp[e]=0;this.reset()},t.prototype.update=function(e,t){if(void 0===t&&(t=e.length),this.finished)throw new Error("SHA256: can't update because hash was finished.");var n=0;if(this.bytesHashed+=t,this.bufferLength>0){for(;this.bufferLength<64&&t>0;)this.buffer[this.bufferLength++]=e[n++],t--;64===this.bufferLength&&(i(this.temp,this.state,this.buffer,0,64),this.bufferLength=0)}for(t>=64&&(n=i(this.temp,this.state,e,n,t),t%=64);t>0;)this.buffer[this.bufferLength++]=e[n++],t--;return this},t.prototype.finish=function(e){if(!this.finished){var t=this.bytesHashed,n=this.bufferLength,l=t/536870912|0,o=t<<3,c=t%64<56?64:128;this.buffer[n]=128;for(var a=n+1;a<c-8;a++)this.buffer[a]=0;this.buffer[c-8]=l>>>24&255,this.buffer[c-7]=l>>>16&255,this.buffer[c-6]=l>>>8&255,this.buffer[c-5]=l>>>0&255,this.buffer[c-4]=o>>>24&255,this.buffer[c-3]=o>>>16&255,this.buffer[c-2]=o>>>8&255,this.buffer[c-1]=o>>>0&255,i(this.temp,this.state,this.buffer,0,c),this.finished=!0}for(a=0;a<8;a++)e[4*a+0]=this.state[a]>>>24&255,e[4*a+1]=this.state[a]>>>16&255,e[4*a+2]=this.state[a]>>>8&255,e[4*a+3]=this.state[a]>>>0&255;return this},t.prototype.digest=function(){var e=new Uint8Array(this.digestLength);return this.finish(e),e},t.prototype._saveState=function(e){for(var t=0;t<this.state.length;t++)e[t]=this.state[t]},t.prototype._restoreState=function(e,t){for(var i=0;i<this.state.length;i++)this.state[i]=e[i];this.bytesHashed=t,this.finished=!1,this.bufferLength=0},t}();e.Hash=n;var l=function(){function e(e){this.inner=new n,this.outer=new n,this.blockSize=this.inner.blockSize,this.digestLength=this.inner.digestLength;var t=new Uint8Array(this.blockSize);if(e.length>this.blockSize)(new n).update(e).finish(t).clean();else for(var i=0;i<e.length;i++)t[i]=e[i];for(i=0;i<t.length;i++)t[i]^=54;this.inner.update(t);for(i=0;i<t.length;i++)t[i]^=106;this.outer.update(t),this.istate=new Uint32Array(8),this.ostate=new Uint32Array(8),this.inner._saveState(this.istate),this.outer._saveState(this.ostate);for(i=0;i<t.length;i++)t[i]=0}return e.prototype.reset=function(){return this.inner._restoreState(this.istate,this.inner.blockSize),this.outer._restoreState(this.ostate,this.outer.blockSize),this},e.prototype.clean=function(){for(var e=0;e<this.istate.length;e++)this.ostate[e]=this.istate[e]=0;this.inner.clean(),this.outer.clean()},e.prototype.update=function(e){return this.inner.update(e),this},e.prototype.finish=function(e){return this.outer.finished?this.outer.finish(e):(this.inner.finish(e),this.outer.update(e,this.digestLength).finish(e)),this},e.prototype.digest=function(){var e=new Uint8Array(this.digestLength);return this.finish(e),e},e}();function o(e){var t=(new n).update(e),i=t.digest();return t.clean(),i}function c(e,t){var i=new l(e).update(t),n=i.digest();return i.clean(),n}function a(e,t,i,n){var l=n[0];if(0===l)throw new Error("hkdf: cannot expand more");t.reset(),l>1&&t.update(e),i&&t.update(i),t.update(n),t.finish(e),n[0]++}e.HMAC=l,e.hash=o,e.default=o,e.hmac=c;var d=new Uint8Array(e.digestLength);function s(e,t,i,n){void 0===t&&(t=d),void 0===n&&(n=32);for(var o=new Uint8Array([1]),s=c(t,e),r=new l(s),u=new Uint8Array(r.digestLength),Z=u.length,b=new Uint8Array(n),h=0;h<n;h++)Z===u.length&&(a(u,r,i,o),Z=0),b[h]=u[Z++];return r.clean(),u.fill(0),o.fill(0),b}function r(e,t,i,n){for(var o=new l(e),c=o.digestLength,a=new Uint8Array(4),d=new Uint8Array(c),s=new Uint8Array(c),r=new Uint8Array(n),u=0;u*c<n;u++){var Z=u+1;a[0]=Z>>>24&255,a[1]=Z>>>16&255,a[2]=Z>>>8&255,a[3]=Z>>>0&255,o.reset(),o.update(t),o.update(a),o.finish(s);for(var b=0;b<c;b++)d[b]=s[b];for(b=2;b<=i;b++){o.reset(),o.update(s).finish(s);for(var h=0;h<c;h++)d[h]^=s[h]}for(b=0;b<c&&u*c+b<n;b++)r[u*c+b]=d[b]}for(u=0;u<c;u++)d[u]=s[u]=0;for(u=0;u<4;u++)a[u]=0;return o.clean(),r}e.hkdf=s,e.pbkdf2=r}(n);var l=n.default;for(var o in n)l[o]=n[o];e.exports=l}()}(pS);var IS=i(pS.exports),gS=crypto;const GS=e=>e instanceof CryptoKey,yS=new TextEncoder,XS=new TextDecoder;const VS=e=>{let t=e;t instanceof Uint8Array&&(t=XS.decode(t)),t=t.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,"");try{return(e=>{const t=atob(e),i=new Uint8Array(t.length);for(let e=0;e<t.length;e++)i[e]=t.charCodeAt(e);return i})(t)}catch(e){throw new TypeError("The input to be decoded is not correctly encoded.")}};class WS extends Error{constructor(e){var t;super(e),this.code="ERR_JOSE_GENERIC",this.name=this.constructor.name,null===(t=Error.captureStackTrace)||void 0===t||t.call(Error,this,this.constructor)}static get code(){return"ERR_JOSE_GENERIC"}}class CS extends WS{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"unspecified",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"unspecified";super(e),this.code="ERR_JWT_CLAIM_VALIDATION_FAILED",this.claim=t,this.reason=i}static get code(){return"ERR_JWT_CLAIM_VALIDATION_FAILED"}}class RS extends WS{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"unspecified",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"unspecified";super(e),this.code="ERR_JWT_EXPIRED",this.claim=t,this.reason=i}static get code(){return"ERR_JWT_EXPIRED"}}class SS extends WS{constructor(){super(...arguments),this.code="ERR_JOSE_ALG_NOT_ALLOWED"}static get code(){return"ERR_JOSE_ALG_NOT_ALLOWED"}}class vS extends WS{constructor(){super(...arguments),this.code="ERR_JOSE_NOT_SUPPORTED"}static get code(){return"ERR_JOSE_NOT_SUPPORTED"}}class fS extends WS{constructor(){super(...arguments),this.code="ERR_JWS_INVALID"}static get code(){return"ERR_JWS_INVALID"}}class YS extends WS{constructor(){super(...arguments),this.code="ERR_JWT_INVALID"}static get code(){return"ERR_JWT_INVALID"}}class KS extends WS{constructor(){super(...arguments),this.code="ERR_JWKS_INVALID"}static get code(){return"ERR_JWKS_INVALID"}}class NS extends WS{constructor(){super(...arguments),this.code="ERR_JWKS_NO_MATCHING_KEY",this.message="no applicable key found in the JSON Web Key Set"}static get code(){return"ERR_JWKS_NO_MATCHING_KEY"}}class JS extends WS{constructor(){super(...arguments),this.code="ERR_JWKS_MULTIPLE_MATCHING_KEYS",this.message="multiple matching keys found in the JSON Web Key Set"}static get code(){return"ERR_JWKS_MULTIPLE_MATCHING_KEYS"}}class US extends WS{constructor(){super(...arguments),this.code="ERR_JWS_SIGNATURE_VERIFICATION_FAILED",this.message="signature verification failed"}static get code(){return"ERR_JWS_SIGNATURE_VERIFICATION_FAILED"}}function LS(){return"function"==typeof WebSocketPair}function kS(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"algorithm.name";return new TypeError("CryptoKey does not support this operation, its ".concat(t," must be ").concat(e))}function HS(e,t){return e.name===t}function TS(e){return parseInt(e.name.slice(4),10)}function FS(e){switch(e){case"ES256":return"P-256";case"ES384":return"P-384";case"ES512":return"P-521";default:throw new Error("unreachable")}}function xS(e,t){if(t.length&&!t.some((t=>e.usages.includes(t)))){let e="CryptoKey does not support this operation, its usages must include ";if(t.length>2){const i=t.pop();e+="one of ".concat(t.join(", "),", or ").concat(i,".")}else 2===t.length?e+="one of ".concat(t[0]," or ").concat(t[1],"."):e+="".concat(t[0],".");throw new TypeError(e)}}var BS=function(e){let t="Key must be ";for(var i=arguments.length,n=new Array(i>1?i-1:0),l=1;l<i;l++)n[l-1]=arguments[l];if(n.length>2){const e=n.pop();t+="one of type ".concat(n.join(", "),", or ").concat(e,".")}else 2===n.length?t+="one of type ".concat(n[0]," or ").concat(n[1],"."):t+="of type ".concat(n[0],".");return null==e?t+=" Received ".concat(e):"function"==typeof e&&e.name?t+=" Received function ".concat(e.name):"object"==typeof e&&null!=e&&e.constructor&&e.constructor.name&&(t+=" Received an instance of ".concat(e.constructor.name)),t},AS=e=>GS(e);const zS=["CryptoKey"];function wS(e){if("object"!=typeof(t=e)||null===t||"[object Object]"!==Object.prototype.toString.call(e))return!1;var t;if(null===Object.getPrototypeOf(e))return!0;let i=e;for(;null!==Object.getPrototypeOf(i);)i=Object.getPrototypeOf(i);return Object.getPrototypeOf(e)===i}const PS=async e=>{var t,i;const{algorithm:n,keyUsages:l}=function(e){let t,i;switch(e.kty){case"oct":switch(e.alg){case"HS256":case"HS384":case"HS512":t={name:"HMAC",hash:"SHA-".concat(e.alg.slice(-3))},i=["sign","verify"];break;case"A128CBC-HS256":case"A192CBC-HS384":case"A256CBC-HS512":throw new vS("".concat(e.alg," keys cannot be imported as CryptoKey instances"));case"A128GCM":case"A192GCM":case"A256GCM":case"A128GCMKW":case"A192GCMKW":case"A256GCMKW":t={name:"AES-GCM"},i=["encrypt","decrypt"];break;case"A128KW":case"A192KW":case"A256KW":t={name:"AES-KW"},i=["wrapKey","unwrapKey"];break;case"PBES2-HS256+A128KW":case"PBES2-HS384+A192KW":case"PBES2-HS512+A256KW":t={name:"PBKDF2"},i=["deriveBits"];break;default:throw new vS('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"RSA":switch(e.alg){case"PS256":case"PS384":case"PS512":t={name:"RSA-PSS",hash:"SHA-".concat(e.alg.slice(-3))},i=e.d?["sign"]:["verify"];break;case"RS256":case"RS384":case"RS512":t={name:"RSASSA-PKCS1-v1_5",hash:"SHA-".concat(e.alg.slice(-3))},i=e.d?["sign"]:["verify"];break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":t={name:"RSA-OAEP",hash:"SHA-".concat(parseInt(e.alg.slice(-3),10)||1)},i=e.d?["decrypt","unwrapKey"]:["encrypt","wrapKey"];break;default:throw new vS('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"EC":switch(e.alg){case"ES256":t={name:"ECDSA",namedCurve:"P-256"},i=e.d?["sign"]:["verify"];break;case"ES384":t={name:"ECDSA",namedCurve:"P-384"},i=e.d?["sign"]:["verify"];break;case"ES512":t={name:"ECDSA",namedCurve:"P-521"},i=e.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":t={name:"ECDH",namedCurve:e.crv},i=e.d?["deriveBits"]:[];break;default:throw new vS('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case LS()&&"OKP":if("EdDSA"!==e.alg)throw new vS('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');if("Ed25519"!==e.crv)throw new vS('Invalid or unsupported JWK "crv" (Subtype of Key Pair) Parameter value');t={name:"NODE-ED25519",namedCurve:"NODE-ED25519"},i=e.d?["sign"]:["verify"];break;default:throw new vS('Invalid or unsupported JWK "kty" (Key Type) Parameter value')}return{algorithm:t,keyUsages:i}}(e),o=[n,null!==(t=e.ext)&&void 0!==t&&t,null!==(i=e.key_ops)&&void 0!==i?i:l];if("PBKDF2"===n.name)return gS.subtle.importKey("raw",VS(e.k),...o);const c={...e};return delete c.alg,gS.subtle.importKey("jwk",c,...o)};const QS=(e,t,i)=>{e.startsWith("HS")||"dir"===e||e.startsWith("PBES2")||/^A\d{3}(?:GCM)?KW$/.test(e)?(e=>{if(!(e instanceof Uint8Array)){if(!AS(e))throw new TypeError(BS(e,...zS,"Uint8Array"));if("secret"!==e.type)throw new TypeError("".concat(zS.join(" or "),' instances for symmetric algorithms must be of type "secret"'))}})(t):((e,t)=>{if(!AS(e))throw new TypeError(BS(e,...zS));if("secret"===e.type)throw new TypeError("".concat(zS.join(" or "),' instances for asymmetric algorithms must not be of type "secret"'));if("sign"===t&&"public"===e.type)throw new TypeError("".concat(zS.join(" or "),' instances for asymmetric algorithm signing must be of type "private"'));if("decrypt"===t&&"public"===e.type)throw new TypeError("".concat(zS.join(" or "),' instances for asymmetric algorithm decryption must be of type "private"'));if(e.algorithm&&"verify"===t&&"private"===e.type)throw new TypeError("".concat(zS.join(" or "),' instances for asymmetric algorithm verifying must be of type "public"'));if(e.algorithm&&"encrypt"===t&&"private"===e.type)throw new TypeError("".concat(zS.join(" or "),' instances for asymmetric algorithm encryption must be of type "public"'))})(t,i)};function jS(e,t,i){if(GS(t))return function(e,t){switch(t){case"HS256":case"HS384":case"HS512":{if(!HS(e.algorithm,"HMAC"))throw kS("HMAC");const i=parseInt(t.slice(2),10);if(TS(e.algorithm.hash)!==i)throw kS("SHA-".concat(i),"algorithm.hash");break}case"RS256":case"RS384":case"RS512":{if(!HS(e.algorithm,"RSASSA-PKCS1-v1_5"))throw kS("RSASSA-PKCS1-v1_5");const i=parseInt(t.slice(2),10);if(TS(e.algorithm.hash)!==i)throw kS("SHA-".concat(i),"algorithm.hash");break}case"PS256":case"PS384":case"PS512":{if(!HS(e.algorithm,"RSA-PSS"))throw kS("RSA-PSS");const i=parseInt(t.slice(2),10);if(TS(e.algorithm.hash)!==i)throw kS("SHA-".concat(i),"algorithm.hash");break}case LS()&&"EdDSA":if(!HS(e.algorithm,"NODE-ED25519"))throw kS("NODE-ED25519");break;case"ES256":case"ES384":case"ES512":{if(!HS(e.algorithm,"ECDSA"))throw kS("ECDSA");const i=FS(t);if(e.algorithm.namedCurve!==i)throw kS(i,"algorithm.namedCurve");break}default:throw new TypeError("CryptoKey does not support this operation")}for(var i=arguments.length,n=new Array(i>2?i-2:0),l=2;l<i;l++)n[l-2]=arguments[l];xS(e,n)}(t,e,i),t;if(t instanceof Uint8Array){if(!e.startsWith("HS"))throw new TypeError(BS(t,...zS));return gS.subtle.importKey("raw",t,{hash:"SHA-".concat(e.slice(-3)),name:"HMAC"},!1,[i])}throw new TypeError(BS(t,...zS,"Uint8Array"))}const MS=async(e,t,i,n)=>{const l=await jS(e,t,"verify");((e,t)=>{if(e.startsWith("RS")||e.startsWith("PS")){const{modulusLength:i}=t.algorithm;if("number"!=typeof i||i<2048)throw new TypeError("".concat(e," requires key modulusLength to be 2048 bits or larger"))}})(e,l);const o=function(e,t){const i="SHA-".concat(e.slice(-3));switch(e){case"HS256":case"HS384":case"HS512":return{hash:i,name:"HMAC"};case"PS256":case"PS384":case"PS512":return{hash:i,name:"RSA-PSS",saltLength:e.slice(-3)>>3};case"RS256":case"RS384":case"RS512":return{hash:i,name:"RSASSA-PKCS1-v1_5"};case"ES256":case"ES384":case"ES512":return{hash:i,name:"ECDSA",namedCurve:t.namedCurve};case LS()&&"EdDSA":const{namedCurve:n}=t;return{name:n,namedCurve:n};default:throw new vS("alg ".concat(e," is not supported either by JOSE or your javascript runtime"))}}(e,l.algorithm);try{return await gS.subtle.verify(o,l,i,n)}catch(e){return!1}};async function ES(e,t,i){var n;if(!wS(e))throw new fS("Flattened JWS must be an object");if(void 0===e.protected&&void 0===e.header)throw new fS('Flattened JWS must have either of the "protected" or "header" members');if(void 0!==e.protected&&"string"!=typeof e.protected)throw new fS("JWS Protected Header incorrect type");if(void 0===e.payload)throw new fS("JWS Payload missing");if("string"!=typeof e.signature)throw new fS("JWS Signature missing or incorrect type");if(void 0!==e.header&&!wS(e.header))throw new fS("JWS Unprotected Header incorrect type");let l={};if(e.protected){const t=VS(e.protected);try{l=JSON.parse(XS.decode(t))}catch(e){throw new fS("JWS Protected Header is invalid")}}if(!function(){for(var e=arguments.length,t=new Array(e),i=0;i<e;i++)t[i]=arguments[i];const n=t.filter(Boolean);if(0===n.length||1===n.length)return!0;let l;for(const e of n){const t=Object.keys(e);if(l&&0!==l.size)for(const e of t){if(l.has(e))return!1;l.add(e)}else l=new Set(t)}return!0}(l,e.header))throw new fS("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");const o={...l,...e.header},c=function(e,t,i,n,l){if(void 0!==l.crit&&void 0===n.crit)throw new e('"crit" (Critical) Header Parameter MUST be integrity protected');if(!n||void 0===n.crit)return new Set;if(!Array.isArray(n.crit)||0===n.crit.length||n.crit.some((e=>"string"!=typeof e||0===e.length)))throw new e('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present');let o;o=void 0!==i?new Map([...Object.entries(i),...t.entries()]):t;for(const t of n.crit){if(!o.has(t))throw new vS('Extension Header Parameter "'.concat(t,'" is not recognized'));if(void 0===l[t])throw new e('Extension Header Parameter "'.concat(t,'" is missing'));if(o.get(t)&&void 0===n[t])throw new e('Extension Header Parameter "'.concat(t,'" MUST be integrity protected'))}return new Set(n.crit)}(fS,new Map([["b64",!0]]),null==i?void 0:i.crit,l,o);let a=!0;if(c.has("b64")&&(a=l.b64,"boolean"!=typeof a))throw new fS('The "b64" (base64url-encode payload) Header Parameter must be a boolean');const{alg:d}=o;if("string"!=typeof d||!d)throw new fS('JWS "alg" (Algorithm) Header Parameter missing or invalid');const s=i&&((e,t)=>{if(void 0!==t&&(!Array.isArray(t)||t.some((e=>"string"!=typeof e))))throw new TypeError('"'.concat(e,'" option must be an array of strings'));if(t)return new Set(t)})("algorithms",i.algorithms);if(s&&!s.has(d))throw new SS('"alg" (Algorithm) Header Parameter not allowed');if(a){if("string"!=typeof e.payload)throw new fS("JWS Payload must be a string")}else if("string"!=typeof e.payload&&!(e.payload instanceof Uint8Array))throw new fS("JWS Payload must be a string or an Uint8Array instance");let r=!1;"function"==typeof t&&(t=await t(l,e),r=!0),QS(d,t,"verify");const u=function(){for(var e=arguments.length,t=new Array(e),i=0;i<e;i++)t[i]=arguments[i];const n=t.reduce(((e,t)=>{let{length:i}=t;return e+i}),0),l=new Uint8Array(n);let o=0;return t.forEach((e=>{l.set(e,o),o+=e.length})),l}(yS.encode(null!==(n=e.protected)&&void 0!==n?n:""),yS.encode("."),"string"==typeof e.payload?yS.encode(e.payload):e.payload),Z=VS(e.signature);if(!await MS(d,t,Z,u))throw new US;let b;b=a?VS(e.payload):"string"==typeof e.payload?yS.encode(e.payload):e.payload;const h={payload:b};return void 0!==e.protected&&(h.protectedHeader=l),void 0!==e.header&&(h.unprotectedHeader=e.header),r?{...h,key:t}:h}var DS=e=>Math.floor(e.getTime()/1e3);const OS=86400,_S=/^(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)$/i;var qS=e=>{const t=_S.exec(e);if(!t)throw new TypeError("Invalid time period format");const i=parseFloat(t[1]);switch(t[2].toLowerCase()){case"sec":case"secs":case"second":case"seconds":case"s":return Math.round(i);case"minute":case"minutes":case"min":case"mins":case"m":return Math.round(60*i);case"hour":case"hours":case"hr":case"hrs":case"h":return Math.round(3600*i);case"day":case"days":case"d":return Math.round(i*OS);case"week":case"weeks":case"w":return Math.round(604800*i);default:return Math.round(31557600*i)}};const $S=e=>e.toLowerCase().replace(/^application\//,""),ev=(e,t)=>"string"==typeof e?t.includes(e):!!Array.isArray(e)&&t.some(Set.prototype.has.bind(new Set(e)));async function tv(e,t,i){var n;const l=await async function(e,t,i){if(e instanceof Uint8Array&&(e=XS.decode(e)),"string"!=typeof e)throw new fS("Compact JWS must be a string or Uint8Array");const{0:n,1:l,2:o,length:c}=e.split(".");if(3!==c)throw new fS("Invalid Compact JWS");const a=await ES({payload:l,protected:n,signature:o},t,i),d={payload:a.payload,protectedHeader:a.protectedHeader};return"function"==typeof t?{...d,key:a.key}:d}(e,t,i);if((null===(n=l.protectedHeader.crit)||void 0===n?void 0:n.includes("b64"))&&!1===l.protectedHeader.b64)throw new YS("JWTs MUST NOT use unencoded payload");const o=function(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const{typ:n}=i;if(n&&("string"!=typeof e.typ||$S(e.typ)!==$S(n)))throw new CS('unexpected "typ" JWT header value',"typ","check_failed");let l;try{l=JSON.parse(XS.decode(t))}catch(e){}if(!wS(l))throw new YS("JWT Claims Set must be a top-level JSON object");const{issuer:o}=i;if(o&&!(Array.isArray(o)?o:[o]).includes(l.iss))throw new CS('unexpected "iss" claim value',"iss","check_failed");const{subject:c}=i;if(c&&l.sub!==c)throw new CS('unexpected "sub" claim value',"sub","check_failed");const{audience:a}=i;if(a&&!ev(l.aud,"string"==typeof a?[a]:a))throw new CS('unexpected "aud" claim value',"aud","check_failed");let d;switch(typeof i.clockTolerance){case"string":d=qS(i.clockTolerance);break;case"number":d=i.clockTolerance;break;case"undefined":d=0;break;default:throw new TypeError("Invalid clockTolerance option type")}const{currentDate:s}=i,r=DS(s||new Date);if((void 0!==l.iat||i.maxTokenAge)&&"number"!=typeof l.iat)throw new CS('"iat" claim must be a number',"iat","invalid");if(void 0!==l.nbf){if("number"!=typeof l.nbf)throw new CS('"nbf" claim must be a number',"nbf","invalid");if(l.nbf>r+d)throw new CS('"nbf" claim timestamp check failed',"nbf","check_failed")}if(void 0!==l.exp){if("number"!=typeof l.exp)throw new CS('"exp" claim must be a number',"exp","invalid");if(l.exp<=r-d)throw new RS('"exp" claim timestamp check failed',"exp","check_failed")}if(i.maxTokenAge){const e=r-l.iat;if(e-d>("number"==typeof i.maxTokenAge?i.maxTokenAge:qS(i.maxTokenAge)))throw new RS('"iat" claim timestamp check failed (too far in the past)',"iat","check_failed");if(e<0-d)throw new CS('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}return l}(l.protectedHeader,l.payload,i),c={payload:o,protectedHeader:l.protectedHeader};return"function"==typeof t?{...c,key:l.key}:c}function iv(e){return wS(e)}class nv{constructor(e){if(this._cached=new WeakMap,!function(e){return e&&"object"==typeof e&&Array.isArray(e.keys)&&e.keys.every(iv)}(e))throw new KS("JSON Web Key Set malformed");var t;this._jwks=(t=e,"function"==typeof structuredClone?structuredClone(t):JSON.parse(JSON.stringify(t)))}async getKey(e,t){const{alg:i,kid:n}={...e,...t.header},l=function(e){switch("string"==typeof e&&e.slice(0,2)){case"RS":case"PS":return"RSA";case"ES":return"EC";case"Ed":return"OKP";default:throw new vS('Unsupported "alg" value for a JSON Web Key Set')}}(i),o=this._jwks.keys.filter((e=>{let t=l===e.kty;if(t&&"string"==typeof n&&(t=n===e.kid),t&&"string"==typeof e.alg&&(t=i===e.alg),t&&"string"==typeof e.use&&(t="sig"===e.use),t&&Array.isArray(e.key_ops)&&(t=e.key_ops.includes("verify")),t&&"EdDSA"===i&&(t="Ed25519"===e.crv||"Ed448"===e.crv),t)switch(i){case"ES256":t="P-256"===e.crv;break;case"ES256K":t="secp256k1"===e.crv;break;case"ES384":t="P-384"===e.crv;break;case"ES512":t="P-521"===e.crv}return t})),{0:c,length:a}=o;if(0===a)throw new NS;if(1!==a)throw new JS;const d=this._cached.get(c)||this._cached.set(c,{}).get(c);if(void 0===d[i]){const e=await async function(e,t,i){if(!wS(e))throw new TypeError("JWK must be an object");if(t||(t=e.alg),"string"!=typeof t||!t)throw new TypeError('"alg" argument is required when "jwk.alg" is not present');switch(e.kty){case"oct":if("string"!=typeof e.k||!e.k)throw new TypeError('missing "k" (Key Value) Parameter value');return null!=i||(i=!0!==e.ext),i?PS({...e,alg:t,ext:!1}):VS(e.k);case"RSA":if(void 0!==e.oth)throw new vS('RSA JWK "oth" (Other Primes Info) Parameter value is not supported');case"EC":case"OKP":return PS({...e,alg:t});default:throw new vS('Unsupported "kty" (Key Type) Parameter value')}}({...c,ext:!0},i);if(e instanceof Uint8Array||"public"!==e.type)throw new KS("JSON Web Key Set members must be public keys");d[i]=e}return d[i]}}var lv={exports:{}},ov={exports:{}},cv=n(mC);
|
|
431
431
|
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
|
432
|
-
!function(e,t){var i=cv,n=i.Buffer;function l(e,t){for(var i in e)t[i]=e[i]}function o(e,t,i){return n(e,t,i)}n.from&&n.alloc&&n.allocUnsafe&&n.allocUnsafeSlow?e.exports=i:(l(i,t),t.Buffer=o),o.prototype=Object.create(n.prototype),l(n,o),o.from=function(e,t,i){if("number"==typeof e)throw new TypeError("Argument must not be a number");return n(e,t,i)},o.alloc=function(e,t,i){if("number"!=typeof e)throw new TypeError("Argument must be a number");var l=n(e);return void 0!==t?"string"==typeof i?l.fill(t,i):l.fill(t):l.fill(0),l},o.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return n(e)},o.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i.SlowBuffer(e)}}(ov,ov.exports);var av=65536,dv=4294967295;var sv=ov.exports.Buffer,rv=t.crypto||t.msCrypto;rv&&rv.getRandomValues?lv.exports=function(e,t){if(e>dv)throw new RangeError("requested too many random bytes");var i=sv.allocUnsafe(e);if(e>0)if(e>av)for(var n=0;n<e;n+=av)rv.getRandomValues(i.slice(n,n+av));else rv.getRandomValues(i);if("function"==typeof t)return WV.nextTick((function(){t(null,i)}));return i}:lv.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")};var uv=lv.exports;class Zv{base64URLEncode(e){return mS.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}base64URLDecode(e){return mS.decode(e).toString()}hashSha256(e){return KW.from(IS((new TextEncoder).encode(e)))}generateRandomBytes(e){return uv(e)}verifyJwt(e,t,i,n,l,o,c,a){const d={algorithms:i,audience:n,clockTolerance:c,subject:o};return(null==a||a)&&(d.issuer=l),tv(e,(s={keys:[t]},nv.prototype.getKey.bind(new nv(s))),d).then((()=>Promise.resolve(!0))).catch((e=>{var t;return Promise.reject(new zy("SPA-CRYPTO-UTILS-VJ-IV01",null!==(t=null==e?void 0:e.reason)&&void 0!==t?t:JSON.stringify(e),"".concat(null==e?void 0:e.code," ").concat(null==e?void 0:e.claim)))}));var s}}const bv=(t,i,n)=>Uy(void 0,void 0,void 0,(function*(){var l;const o=(t=>{switch(t){case e.Storage.LocalStorage:return new lS;case e.Storage.SessionStorage:return new cS;case e.Storage.BrowserMemory:return new oS;default:return new cS}})(i.storage),c=new Zv,a=new Dy;yield a.initialize(i,o,c,t);const d=new DX(a),s=a.getDataLayer(),r=yield _X((()=>Uy(void 0,void 0,void 0,(function*(){return a.getSignOutURL()}))),null!==(l=i.storage)&&void 0!==l?l:e.Storage.SessionStorage,(e=>s.setSessionDataParameter(Fy,null!=e?e:""))),u=n(a,d);let Z=!1;const b=nS.getInstance();let h,m,p=!0;(null==b?void 0:b.init)&&(yield b.init(!0,(e=>Uy(void 0,void 0,void 0,(function*(){yield u.attachTokenToRequestConfig(e)})))));const I=()=>Uy(void 0,void 0,void 0,(function*(){const e=yield a.getOIDCServiceEndpoints(),t=yield s.getConfigData();u.initializeSessionManger(t,e,(()=>Uy(void 0,void 0,void 0,(function*(){return(yield a.getBasicUserInfo()).sessionState}))),(e=>Uy(void 0,void 0,void 0,(function*(){return a.getAuthorizationURL(e)}))),r)})),G=()=>Uy(void 0,void 0,void 0,(function*(){return yield r.receivePromptNoneResponse((e=>Uy(void 0,void 0,void 0,(function*(){yield s.setSessionDataParameter(Fy,null!=e?e:"")}))))})),g=e=>{e.preventSignOutURLUpdate&&(Z=!0)},y=(e,t,i,n)=>Uy(void 0,void 0,void 0,(function*(){return yield u.requestAccessToken(e,t,I,void 0,i,n)})),X=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Uy(void 0,void 0,void 0,(function*(){const i=yield s.getConfigData(),n=yield a.getAuthorizationURL(Object.assign({prompt:"none",state:FX},t)),l=new URL(n);l.searchParams.set("response_mode","query");const o=l.toString();if(i.storage===e.Storage.BrowserMemory&&i.enablePKCE){const e=l.searchParams.get(By);EX.setPKCE(Py.extractPKCEKeyFromStateParam(null!=e?e:""),yield a.getPKCECode(null!=e?e:""))}return o}))};return{disableHttpHandler:()=>(u.disableHttpHandler(b),p=!1,!0),enableHttpHandler:()=>(u.enableHttpHandler(b),p=!0,!0),getAccessToken:()=>Uy(void 0,void 0,void 0,(function*(){return u.getAccessToken()})),getBasicUserInfo:()=>Uy(void 0,void 0,void 0,(function*(){return u.getBasicUserInfo()})),getConfigData:()=>Uy(void 0,void 0,void 0,(function*(){return yield s.getConfigData()})),getCryptoHelper:()=>Uy(void 0,void 0,void 0,(function*(){return u.getCryptoHelper()})),getDataLayer:()=>Uy(void 0,void 0,void 0,(function*(){return u.getDataLayer()})),getDecodedIDToken:()=>Uy(void 0,void 0,void 0,(function*(){return u.getDecodedIDToken()})),getHttpClient:()=>b,getIDToken:()=>Uy(void 0,void 0,void 0,(function*(){return u.getIDToken()})),getOIDCServiceEndpoints:()=>Uy(void 0,void 0,void 0,(function*(){return u.getOIDCServiceEndpoints()})),httpRequest:e=>Uy(void 0,void 0,void 0,(function*(){return yield u.httpRequest(b,e,p,h,m)})),httpRequestAll:e=>Uy(void 0,void 0,void 0,(function*(){return yield u.httpRequestAll(e,b,p,h,m)})),isAuthenticated:()=>Uy(void 0,void 0,void 0,(function*(){return u.isAuthenticated()})),isSessionActive:()=>Uy(void 0,void 0,void 0,(function*(){return"true"===(yield s.getSessionStatus())})),refreshAccessToken:()=>Uy(void 0,void 0,void 0,(function*(){try{return yield u.refreshAccessToken(g)}catch(e){return Promise.reject(e)}})),requestCustomGrant:e=>Uy(void 0,void 0,void 0,(function*(){return yield u.requestCustomGrant(e,g)})),revokeAccessToken:()=>Uy(void 0,void 0,void 0,(function*(){const e=yield d.getRefreshTimeoutTimer();return a.revokeAccessToken().then((()=>(r.reset(),d.clearRefreshTokenTimeout(e),Promise.resolve(!0)))).catch((e=>Promise.reject(e)))})),setHttpRequestErrorCallback:e=>{h=e},setHttpRequestFinishCallback:e=>{(null==b?void 0:b.setHttpRequestFinishCallback)&&b.setHttpRequestFinishCallback(e)},setHttpRequestStartCallback:e=>{(null==b?void 0:b.setHttpRequestStartCallback)&&b.setHttpRequestStartCallback(e)},setHttpRequestSuccessCallback:e=>{(null==b?void 0:b.setHttpRequestSuccessCallback)&&b.setHttpRequestSuccessCallback(e)},signIn:(t,n,l,o,c)=>Uy(void 0,void 0,void 0,(function*(){var d,r,Z;const b=yield u.handleSignIn(G,I,void 0);if(b)return b;{let u,b,m,p={params:{}};if((null==i?void 0:i.responseMode)===e.ResponseMode.formPost&&n?(u=n,b=null!=l?l:"",m=null!=o?o:""):(u=null!==(d=new URL(window.location.href).searchParams.get(Ty))&&void 0!==d?d:"",b=null!==(r=new URL(window.location.href).searchParams.get(Fy))&&void 0!==r?r:"",m=null!==(Z=new URL(window.location.href).searchParams.get(By))&&void 0!==Z?Z:"",EX.removeAuthorizationCode()),u&&m){h="true",Uy(void 0,void 0,void 0,(function*(){yield s.setSessionStatus(h)}));const e=yield s.getTemporaryDataParameter(UX);return e&&"string"==typeof e&&(p=JSON.parse(e)),y(u,b,m,p)}return a.getAuthorizationURL(t).then((t=>Uy(void 0,void 0,void 0,(function*(){if(i.storage===e.Storage.BrowserMemory&&i.enablePKCE){const e=Py.extractPKCEKeyFromStateParam(m);EX.setPKCE(e,yield a.getPKCECode(m))}return c&&s.setTemporaryDataParameter(UX,JSON.stringify(c)),location.href=t,yield EX.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})}))))}var h})),signOut:()=>Uy(void 0,void 0,void 0,(function*(){return(yield a.isAuthenticated())&&!Z?location.href=yield a.getSignOutURL():location.href=EX.getSignOutURL(i.clientID,t),d.clearRefreshTokenTimeout(),yield s.removeOIDCProviderMetaData(),yield s.removeTemporaryData(),yield s.removeSessionData(),yield s.removeSessionStatus(),yield EX.waitTillPageRedirect(),!0})),trySignInSilently:(e,t)=>Uy(void 0,void 0,void 0,(function*(){return yield u.trySignInSilently(X,y,r,e,t)})),updateConfig:e=>Uy(void 0,void 0,void 0,(function*(){const t=yield s.getConfigData(),i=!(t&&t.endpoints&&t.endpoints.checkSessionIframe&&e&&e.endpoints&&e.endpoints.checkSessionIframe&&t.endpoints.checkSessionIframe===e.endpoints.checkSessionIframe),n=Object.assign(Object.assign({},t),e);yield a.updateConfig(n),n.enableOIDCSessionManagement&&i&&(r.reset(),I())}))}})),hv=(t,i,n,l)=>Uy(void 0,void 0,void 0,(function*(){var o;let c;const a=null!==(o=null==i?void 0:i.requestTimeout)&&void 0!==o?o:6e4;let d=!0,s=!1;const r=(t=>{switch(t){case e.Storage.LocalStorage:return new lS;case e.Storage.SessionStorage:return new cS;case e.Storage.BrowserMemory:return new oS;default:return new cS}})(i.storage),u=new Zv,Z=new Dy;yield Z.initialize(i,r,u,t);const b=new DX(Z),h=yield _X((()=>Uy(void 0,void 0,void 0,(function*(){const e={type:lX};try{return yield I(e)}catch(e){return EX.getSignOutURL(i.clientID,t)}}))),i.storage,(e=>G(e))),m=l(Z,b),p=new n,I=e=>{const t=new MessageChannel;return p.postMessage(e,[t.port2]),new Promise(((e,i)=>{const n=setTimeout((()=>{i(new zy("SPA-WEB_WORKER_CLIENT-COM-TO01","Operation timed out.","No response was received from the web worker for "+a/1e3+" since dispatching the request"))}),a);return t.port1.onmessage=l=>{let{data:o}=l;if(clearTimeout(n),t.port1.close(),t.port2.close(),null==o?void 0:o.success){const t=(null==o?void 0:o.data)?JSON.parse(null==o?void 0:o.data):null;(null==o?void 0:o.blob)&&(t.data=null==o?void 0:o.blob),e(t)}else i(o.error?JSON.parse(o.error):null)}}))},G=e=>I({data:e,type:RX}),g=()=>I({type:SX}),y=()=>Uy(void 0,void 0,void 0,(function*(){const e=yield S(),t=yield v();m.initializeSessionManger(t,e,(()=>Uy(void 0,void 0,void 0,(function*(){return(yield f()).sessionState}))),(e=>Uy(void 0,void 0,void 0,(function*(){return(yield V(e)).authorizationURL}))),h)})),X=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Uy(void 0,void 0,void 0,(function*(){var t;const i=yield v(),n={data:Object.assign({prompt:"none",state:FX},e),type:gX},l=yield I(n),o=Py.extractPKCEKeyFromStateParam(null!==(t=new URL(l.authorizationURL).searchParams.get(By))&&void 0!==t?t:"");l.pkce&&i.enablePKCE&&EX.setPKCE(o,l.pkce);const c=l.authorizationURL,a=new URL(c);a.searchParams.set("response_mode","query");return a.toString()}))},V=e=>Uy(void 0,void 0,void 0,(function*(){const t=yield v();return I({data:e,type:gX}).then((e=>Uy(void 0,void 0,void 0,(function*(){var i;if(e.pkce&&t.enablePKCE){const t=Py.extractPKCEKeyFromStateParam(null!==(i=new URL(e.authorizationURL).searchParams.get(By))&&void 0!==i?i:"");EX.setPKCE(t,e.pkce)}return Promise.resolve(e)}))))})),W=(e,i,n,l)=>Uy(void 0,void 0,void 0,(function*(){const o=yield v(),c=Py.extractPKCEKeyFromStateParam(n),a={data:{code:e,pkce:o.enablePKCE?EX.getPKCE(c):void 0,sessionState:i,state:n,tokenRequestConfig:l},type:yX};return o.enablePKCE&&EX.removePKCE(c),I(a).then((e=>I({type:VX}).then((i=>(EX.setSignOutURL(i,o.clientID,t),o.enableOIDCSessionManagement&&y(),g(),Promise.resolve(e)))).catch((e=>Promise.reject(e))))).catch((e=>Promise.reject(e)))})),C=()=>Uy(void 0,void 0,void 0,(function*(){return yield h.receivePromptNoneResponse((e=>Uy(void 0,void 0,void 0,(function*(){return G(e)}))))})),R=()=>Uy(void 0,void 0,void 0,(function*(){if(yield Y())return yield g(),i.enableOIDCSessionManagement&&y(),f()})),S=()=>I({type:bX}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),v=()=>I({type:NX}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),f=()=>I({type:hX}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),Y=()=>I({type:XX}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e)));return{disableHttpHandler:()=>I({type:GX}).then((()=>(d=!1,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),enableHttpHandler:()=>I({type:IX}).then((()=>(d=!0,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),getBasicUserInfo:f,getConfigData:v,getCryptoHelper:()=>I({type:pX}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getDecodedIDPIDToken:()=>I({type:"get-decoded-idp-id-token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getDecodedIDToken:()=>I({type:mX}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getIDToken:()=>I({type:fX}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getOIDCServiceEndpoints:S,httpRequest:e=>{(null==e?void 0:e.data)&&(null==e?void 0:e.data)instanceof FormData&&(e.data=Object.assign(Object.assign({},Object.fromEntries(null==e?void 0:e.data.entries())),{formData:!0}));return I({data:e,type:oX}).then((e=>Promise.resolve(e))).catch((e=>Uy(void 0,void 0,void 0,(function*(){return d&&("function"==typeof c.requestErrorCallback&&(yield c.requestErrorCallback(e)),"function"==typeof c.requestFinishCallback&&c.requestFinishCallback()),Promise.reject(e)}))))},httpRequestAll:e=>I({data:e,type:cX}).then((e=>Promise.resolve(e))).catch((e=>Uy(void 0,void 0,void 0,(function*(){return d&&("function"==typeof c.requestErrorCallback&&(yield c.requestErrorCallback(e)),"function"==typeof c.requestFinishCallback&&c.requestFinishCallback()),Promise.reject(e)})))),httpStreamRequest:e=>{(null==e?void 0:e.data)&&(null==e?void 0:e.data)instanceof FormData&&(e.data=Object.assign(Object.assign({},Object.fromEntries(null==e?void 0:e.data.entries())),{formData:!0}));return(e=>{const t=new MessageChannel;return p.postMessage(e,[t.port2]),new Promise(((e,i)=>{const n=setTimeout((()=>{i(new zy("SPA-WEB_WORKER_CLIENT-COMS-TO01","Stream operation timed out.","No response was received from the web worker for "+a/1e3+" since dispatching the stream request"))}),a);return t.port1.onmessage=l=>{let{data:o}=l;clearTimeout(n),t.port1.close(),t.port2.close(),(null==o?void 0:o.success)?e(null==o?void 0:o.data):i(o.error?JSON.parse(o.error):null)}}))})({data:e,type:aX})},initialize:()=>{c||(c={requestErrorCallback:()=>Promise.resolve(),requestFinishCallback:()=>null,requestStartCallback:()=>null,requestSuccessCallback:()=>null}),p.onmessage=e=>{let{data:t}=e;switch(t.type){case ZX:(null==c?void 0:c.requestFinishCallback)&&(null==c||c.requestFinishCallback());break;case rX:(null==c?void 0:c.requestStartCallback)&&(null==c||c.requestStartCallback());break;case uX:(null==c?void 0:c.requestSuccessCallback)&&(null==c||c.requestSuccessCallback(t.data?JSON.parse(t.data):null))}};return I({data:i,type:nX}).then((()=>Promise.resolve(!0))).catch((e=>Promise.reject(e)))},isAuthenticated:Y,refreshAccessToken:()=>I({type:WX}),requestCustomGrant:e=>I({data:e,type:dX}).then((t=>(e.preventSignOutURLUpdate&&(s=!0),Promise.resolve(t)))).catch((e=>Promise.reject(e))),revokeAccessToken:()=>I({type:sX}).then((e=>(h.reset(),Promise.resolve(e)))).catch((e=>Promise.reject(e))),setHttpRequestErrorCallback:e=>{e&&"function"==typeof e&&(c.requestErrorCallback=e)},setHttpRequestFinishCallback:e=>{e&&"function"==typeof e&&(c.requestFinishCallback=e)},setHttpRequestStartCallback:e=>{e&&"function"==typeof e&&(c.requestStartCallback=e)},setHttpRequestSuccessCallback:e=>{e&&"function"==typeof e&&(c.requestSuccessCallback=e)},signIn:(t,n,l,o,c)=>Uy(void 0,void 0,void 0,(function*(){var a,d,s;const r=yield m.handleSignIn(C,y,R);if(r)return r;{let r,u,Z;return(null==i?void 0:i.responseMode)===e.ResponseMode.formPost&&n?(r=n,u=null!=l?l:"",Z=null!=o?o:""):(r=null!==(a=new URL(window.location.href).searchParams.get(Ty))&&void 0!==a?a:"",u=null!==(d=new URL(window.location.href).searchParams.get(Fy))&&void 0!==d?d:"",Z=null!==(s=new URL(window.location.href).searchParams.get(By))&&void 0!==s?s:"",EX.removeAuthorizationCode()),r&&Z?W(r,u,Z,c):V(t).then((e=>Uy(void 0,void 0,void 0,(function*(){return location.href=e.authorizationURL,yield EX.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})})))).catch((e=>Promise.reject(e)))}})),signOut:()=>new Promise(((e,n)=>{if(!s){return I({type:lX}).then((t=>Uy(void 0,void 0,void 0,(function*(){return window.location.href=t,yield EX.waitTillPageRedirect(),e(!0)})))).catch((e=>n(e)))}window.location.href=EX.getSignOutURL(i.clientID,t),EX.waitTillPageRedirect().then((()=>Promise.resolve(!0)))})),trySignInSilently:(e,t)=>Uy(void 0,void 0,void 0,(function*(){return yield m.trySignInSilently(X,W,h,e,t)})),updateConfig:e=>Uy(void 0,void 0,void 0,(function*(){const t=yield v(),i=!(t&&t.endpoints&&t.endpoints.checkSessionIframe&&e&&e.endpoints&&e.endpoints.checkSessionIframe&&t.endpoints.checkSessionIframe===e.endpoints.checkSessionIframe),n=Object.assign(Object.assign({},t),e),l={data:n,type:vX};yield I(l),n.enableOIDCSessionManagement&&i&&(h.reset(),y())}))}})),mv={autoLogoutOnTokenRefreshError:!0,checkSessionInterval:3,clientHost:origin,enableOIDCSessionManagement:!1,periodicTokenRefresh:!1,sessionRefreshInterval:300,storage:e.Storage.SessionStorage};class pv{constructor(e){this._authHelper=OX,this._worker=iX,this._initialized=!1,this._startedInitialize=!1,this._onSignInCallback=()=>null,this._onSignOutCallback=()=>null,this._onSignOutFailedCallback=()=>null,this._onEndUserSession=()=>null,this._onInitialize=()=>null,this._onCustomGrant=new Map,this._instanceID=e}instantiateAuthHelper(e){this._authHelper=e||OX}instantiateWorker(e){this._worker=e||iX}_isInitialized(){return Uy(this,void 0,void 0,(function*(){if(!this._startedInitialize)return!1;let e=0;for(;!this._initialized;)1e4===e&&console.warn("It is taking longer than usual for the object to be initialized"),yield new Promise((e=>setTimeout(e,1))),e++;return!0}))}_validateMethod(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return Uy(this,void 0,void 0,(function*(){return(yield this._isInitialized())?!(e&&!(yield this.isAuthenticated()))||Promise.reject(new zy("SPA-AUTH_CLIENT-VM-IV02","The user is not authenticated.","The user must be authenticated first.")):Promise.reject(new zy("SPA-AUTH_CLIENT-VM-NF01","The SDK is not initialized.","The SDK must be initialized first."))}))}
|
|
432
|
+
!function(e,t){var i=cv,n=i.Buffer;function l(e,t){for(var i in e)t[i]=e[i]}function o(e,t,i){return n(e,t,i)}n.from&&n.alloc&&n.allocUnsafe&&n.allocUnsafeSlow?e.exports=i:(l(i,t),t.Buffer=o),o.prototype=Object.create(n.prototype),l(n,o),o.from=function(e,t,i){if("number"==typeof e)throw new TypeError("Argument must not be a number");return n(e,t,i)},o.alloc=function(e,t,i){if("number"!=typeof e)throw new TypeError("Argument must be a number");var l=n(e);return void 0!==t?"string"==typeof i?l.fill(t,i):l.fill(t):l.fill(0),l},o.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return n(e)},o.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i.SlowBuffer(e)}}(ov,ov.exports);var av=65536,dv=4294967295;var sv=ov.exports.Buffer,rv=t.crypto||t.msCrypto;rv&&rv.getRandomValues?lv.exports=function(e,t){if(e>dv)throw new RangeError("requested too many random bytes");var i=sv.allocUnsafe(e);if(e>0)if(e>av)for(var n=0;n<e;n+=av)rv.getRandomValues(i.slice(n,n+av));else rv.getRandomValues(i);if("function"==typeof t)return WV.nextTick((function(){t(null,i)}));return i}:lv.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")};var uv=lv.exports;class Zv{base64URLEncode(e){return mS.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}base64URLDecode(e){return mS.decode(e).toString()}hashSha256(e){return KW.from(IS((new TextEncoder).encode(e)))}generateRandomBytes(e){return uv(e)}verifyJwt(e,t,i,n,l,o,c,a){const d={algorithms:i,audience:n,clockTolerance:c,subject:o};return(null==a||a)&&(d.issuer=l),tv(e,(s={keys:[t]},nv.prototype.getKey.bind(new nv(s))),d).then((()=>Promise.resolve(!0))).catch((e=>{var t;return Promise.reject(new wy("SPA-CRYPTO-UTILS-VJ-IV01",null!==(t=null==e?void 0:e.reason)&&void 0!==t?t:JSON.stringify(e),"".concat(null==e?void 0:e.code," ").concat(null==e?void 0:e.claim)))}));var s}}const bv=(t,i,n)=>Uy(void 0,void 0,void 0,(function*(){var l;const o=(t=>{switch(t){case e.Storage.LocalStorage:return new lS;case e.Storage.SessionStorage:return new cS;case e.Storage.BrowserMemory:return new oS;default:return new cS}})(i.storage),c=new Zv,a=new Oy;yield a.initialize(i,o,c,t);const d=new OX(a),s=a.getDataLayer(),r=yield _X((()=>Uy(void 0,void 0,void 0,(function*(){return a.getSignOutURL()}))),null!==(l=i.storage)&&void 0!==l?l:e.Storage.SessionStorage,(e=>s.setSessionDataParameter(Fy,null!=e?e:""))),u=n(a,d);let Z=!1;const b=nS.getInstance();let h,m,p=!0;(null==b?void 0:b.init)&&(yield b.init(!0,(e=>Uy(void 0,void 0,void 0,(function*(){yield u.attachTokenToRequestConfig(e)})))));const I=()=>Uy(void 0,void 0,void 0,(function*(){const e=yield a.getOIDCServiceEndpoints(),t=yield s.getConfigData();u.initializeSessionManger(t,e,(()=>Uy(void 0,void 0,void 0,(function*(){return(yield a.getBasicUserInfo()).sessionState}))),(e=>Uy(void 0,void 0,void 0,(function*(){return a.getAuthorizationURL(e)}))),r)})),g=()=>Uy(void 0,void 0,void 0,(function*(){return yield r.receivePromptNoneResponse((e=>Uy(void 0,void 0,void 0,(function*(){yield s.setSessionDataParameter(Fy,null!=e?e:"")}))))})),G=e=>{e.preventSignOutURLUpdate&&(Z=!0)},y=(e,t,i,n)=>Uy(void 0,void 0,void 0,(function*(){return yield u.requestAccessToken(e,t,I,void 0,i,n)})),X=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Uy(void 0,void 0,void 0,(function*(){const i=yield s.getConfigData(),n=yield a.getAuthorizationURL(Object.assign({prompt:"none",state:FX},t)),l=new URL(n);l.searchParams.set("response_mode","query");const o=l.toString();if(i.storage===e.Storage.BrowserMemory&&i.enablePKCE){const e=l.searchParams.get(Ay);EX.setPKCE(Py.extractPKCEKeyFromStateParam(null!=e?e:""),yield a.getPKCECode(null!=e?e:""))}return o}))};return{disableHttpHandler:()=>(u.disableHttpHandler(b),p=!1,!0),enableHttpHandler:()=>(u.enableHttpHandler(b),p=!0,!0),getAccessToken:()=>Uy(void 0,void 0,void 0,(function*(){return u.getAccessToken()})),getBasicUserInfo:()=>Uy(void 0,void 0,void 0,(function*(){return u.getBasicUserInfo()})),getConfigData:()=>Uy(void 0,void 0,void 0,(function*(){return yield s.getConfigData()})),getCryptoHelper:()=>Uy(void 0,void 0,void 0,(function*(){return u.getCryptoHelper()})),getDataLayer:()=>Uy(void 0,void 0,void 0,(function*(){return u.getDataLayer()})),getDecodedIDToken:()=>Uy(void 0,void 0,void 0,(function*(){return u.getDecodedIDToken()})),getHttpClient:()=>b,getIDToken:()=>Uy(void 0,void 0,void 0,(function*(){return u.getIDToken()})),getOIDCServiceEndpoints:()=>Uy(void 0,void 0,void 0,(function*(){return u.getOIDCServiceEndpoints()})),httpRequest:e=>Uy(void 0,void 0,void 0,(function*(){return yield u.httpRequest(b,e,p,h,m)})),httpRequestAll:e=>Uy(void 0,void 0,void 0,(function*(){return yield u.httpRequestAll(e,b,p,h,m)})),isAuthenticated:()=>Uy(void 0,void 0,void 0,(function*(){return u.isAuthenticated()})),isSessionActive:()=>Uy(void 0,void 0,void 0,(function*(){return"true"===(yield s.getSessionStatus())})),refreshAccessToken:()=>Uy(void 0,void 0,void 0,(function*(){try{return yield u.refreshAccessToken(G)}catch(e){return Promise.reject(e)}})),requestCustomGrant:e=>Uy(void 0,void 0,void 0,(function*(){return yield u.requestCustomGrant(e,G)})),revokeAccessToken:()=>Uy(void 0,void 0,void 0,(function*(){const e=yield d.getRefreshTimeoutTimer();return a.revokeAccessToken().then((()=>(r.reset(),d.clearRefreshTokenTimeout(e),Promise.resolve(!0)))).catch((e=>Promise.reject(e)))})),setHttpRequestErrorCallback:e=>{h=e},setHttpRequestFinishCallback:e=>{(null==b?void 0:b.setHttpRequestFinishCallback)&&b.setHttpRequestFinishCallback(e)},setHttpRequestStartCallback:e=>{(null==b?void 0:b.setHttpRequestStartCallback)&&b.setHttpRequestStartCallback(e)},setHttpRequestSuccessCallback:e=>{(null==b?void 0:b.setHttpRequestSuccessCallback)&&b.setHttpRequestSuccessCallback(e)},signIn:(t,n,l,o,c)=>Uy(void 0,void 0,void 0,(function*(){var d,r,Z;const b=yield u.handleSignIn(g,I,void 0);if(b)return b;{let u,b,m,p={params:{}};if((null==i?void 0:i.responseMode)===e.ResponseMode.formPost&&n?(u=n,b=null!=l?l:"",m=null!=o?o:""):(u=null!==(d=new URL(window.location.href).searchParams.get(Ty))&&void 0!==d?d:"",b=null!==(r=new URL(window.location.href).searchParams.get(Fy))&&void 0!==r?r:"",m=null!==(Z=new URL(window.location.href).searchParams.get(Ay))&&void 0!==Z?Z:"",EX.removeAuthorizationCode()),u&&m){h="true",Uy(void 0,void 0,void 0,(function*(){yield s.setSessionStatus(h)}));const e=yield s.getTemporaryDataParameter(UX);return e&&"string"==typeof e&&(p=JSON.parse(e)),y(u,b,m,p)}return a.getAuthorizationURL(t).then((t=>Uy(void 0,void 0,void 0,(function*(){if(i.storage===e.Storage.BrowserMemory&&i.enablePKCE){const e=Py.extractPKCEKeyFromStateParam(m);EX.setPKCE(e,yield a.getPKCECode(m))}return c&&s.setTemporaryDataParameter(UX,JSON.stringify(c)),location.href=t,yield EX.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})}))))}var h})),signOut:()=>Uy(void 0,void 0,void 0,(function*(){return(yield a.isAuthenticated())&&!Z?location.href=yield a.getSignOutURL():location.href=EX.getSignOutURL(i.clientID,t),d.clearRefreshTokenTimeout(),yield s.removeOIDCProviderMetaData(),yield s.removeTemporaryData(),yield s.removeSessionData(),yield s.removeSessionStatus(),yield EX.waitTillPageRedirect(),!0})),trySignInSilently:(e,t)=>Uy(void 0,void 0,void 0,(function*(){return yield u.trySignInSilently(X,y,r,e,t)})),updateConfig:e=>Uy(void 0,void 0,void 0,(function*(){const t=yield s.getConfigData(),i=!(t&&t.endpoints&&t.endpoints.checkSessionIframe&&e&&e.endpoints&&e.endpoints.checkSessionIframe&&t.endpoints.checkSessionIframe===e.endpoints.checkSessionIframe),n=Object.assign(Object.assign({},t),e);yield a.updateConfig(n),n.enableOIDCSessionManagement&&i&&(r.reset(),I())}))}})),hv=(t,i,n,l)=>Uy(void 0,void 0,void 0,(function*(){var o;let c;const a=null!==(o=null==i?void 0:i.requestTimeout)&&void 0!==o?o:6e4;let d=!0,s=!1;const r=(t=>{switch(t){case e.Storage.LocalStorage:return new lS;case e.Storage.SessionStorage:return new cS;case e.Storage.BrowserMemory:return new oS;default:return new cS}})(i.storage),u=new Zv,Z=new Oy;yield Z.initialize(i,r,u,t);const b=new OX(Z),h=yield _X((()=>Uy(void 0,void 0,void 0,(function*(){const e={type:lX};try{return yield I(e)}catch(e){return EX.getSignOutURL(i.clientID,t)}}))),i.storage,(e=>g(e))),m=l(Z,b),p=new n,I=e=>{const t=new MessageChannel;return p.postMessage(e,[t.port2]),new Promise(((e,i)=>{const n=setTimeout((()=>{i(new wy("SPA-WEB_WORKER_CLIENT-COM-TO01","Operation timed out.","No response was received from the web worker for "+a/1e3+" since dispatching the request"))}),a);return t.port1.onmessage=l=>{let{data:o}=l;if(clearTimeout(n),t.port1.close(),t.port2.close(),null==o?void 0:o.success){const t=(null==o?void 0:o.data)?JSON.parse(null==o?void 0:o.data):null;(null==o?void 0:o.blob)&&(t.data=null==o?void 0:o.blob),e(t)}else i(o.error?JSON.parse(o.error):null)}}))},g=e=>I({data:e,type:RX}),G=()=>I({type:SX}),y=()=>Uy(void 0,void 0,void 0,(function*(){const e=yield S(),t=yield v();m.initializeSessionManger(t,e,(()=>Uy(void 0,void 0,void 0,(function*(){return(yield f()).sessionState}))),(e=>Uy(void 0,void 0,void 0,(function*(){return(yield V(e)).authorizationURL}))),h)})),X=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Uy(void 0,void 0,void 0,(function*(){var t;const i=yield v(),n={data:Object.assign({prompt:"none",state:FX},e),type:GX},l=yield I(n),o=Py.extractPKCEKeyFromStateParam(null!==(t=new URL(l.authorizationURL).searchParams.get(Ay))&&void 0!==t?t:"");l.pkce&&i.enablePKCE&&EX.setPKCE(o,l.pkce);const c=l.authorizationURL,a=new URL(c);a.searchParams.set("response_mode","query");return a.toString()}))},V=e=>Uy(void 0,void 0,void 0,(function*(){const t=yield v();return I({data:e,type:GX}).then((e=>Uy(void 0,void 0,void 0,(function*(){var i;if(e.pkce&&t.enablePKCE){const t=Py.extractPKCEKeyFromStateParam(null!==(i=new URL(e.authorizationURL).searchParams.get(Ay))&&void 0!==i?i:"");EX.setPKCE(t,e.pkce)}return Promise.resolve(e)}))))})),W=(e,i,n,l)=>Uy(void 0,void 0,void 0,(function*(){const o=yield v(),c=Py.extractPKCEKeyFromStateParam(n),a={data:{code:e,pkce:o.enablePKCE?EX.getPKCE(c):void 0,sessionState:i,state:n,tokenRequestConfig:l},type:yX};return o.enablePKCE&&EX.removePKCE(c),I(a).then((e=>I({type:VX}).then((i=>(EX.setSignOutURL(i,o.clientID,t),o.enableOIDCSessionManagement&&y(),G(),Promise.resolve(e)))).catch((e=>Promise.reject(e))))).catch((e=>Promise.reject(e)))})),C=()=>Uy(void 0,void 0,void 0,(function*(){return yield h.receivePromptNoneResponse((e=>Uy(void 0,void 0,void 0,(function*(){return g(e)}))))})),R=()=>Uy(void 0,void 0,void 0,(function*(){if(yield Y())return yield G(),i.enableOIDCSessionManagement&&y(),f()})),S=()=>I({type:bX}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),v=()=>I({type:NX}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),f=()=>I({type:hX}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),Y=()=>I({type:XX}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e)));return{disableHttpHandler:()=>I({type:gX}).then((()=>(d=!1,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),enableHttpHandler:()=>I({type:IX}).then((()=>(d=!0,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),getBasicUserInfo:f,getConfigData:v,getCryptoHelper:()=>I({type:pX}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getDecodedIDPIDToken:()=>I({type:"get-decoded-idp-id-token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getDecodedIDToken:()=>I({type:mX}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getIDToken:()=>I({type:fX}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getOIDCServiceEndpoints:S,httpRequest:e=>{(null==e?void 0:e.data)&&(null==e?void 0:e.data)instanceof FormData&&(e.data=Object.assign(Object.assign({},Object.fromEntries(null==e?void 0:e.data.entries())),{formData:!0}));return I({data:e,type:oX}).then((e=>Promise.resolve(e))).catch((e=>Uy(void 0,void 0,void 0,(function*(){return d&&("function"==typeof c.requestErrorCallback&&(yield c.requestErrorCallback(e)),"function"==typeof c.requestFinishCallback&&c.requestFinishCallback()),Promise.reject(e)}))))},httpRequestAll:e=>I({data:e,type:cX}).then((e=>Promise.resolve(e))).catch((e=>Uy(void 0,void 0,void 0,(function*(){return d&&("function"==typeof c.requestErrorCallback&&(yield c.requestErrorCallback(e)),"function"==typeof c.requestFinishCallback&&c.requestFinishCallback()),Promise.reject(e)})))),httpStreamRequest:e=>{(null==e?void 0:e.data)&&(null==e?void 0:e.data)instanceof FormData&&(e.data=Object.assign(Object.assign({},Object.fromEntries(null==e?void 0:e.data.entries())),{formData:!0}));return(e=>{const t=new MessageChannel;return p.postMessage(e,[t.port2]),new Promise(((e,i)=>{const n=setTimeout((()=>{i(new wy("SPA-WEB_WORKER_CLIENT-COMS-TO01","Stream operation timed out.","No response was received from the web worker for "+a/1e3+" since dispatching the stream request"))}),a);return t.port1.onmessage=l=>{let{data:o}=l;clearTimeout(n),t.port1.close(),t.port2.close(),(null==o?void 0:o.success)?e(null==o?void 0:o.data):i(o.error?JSON.parse(o.error):null)}}))})({data:e,type:aX})},initialize:()=>{c||(c={requestErrorCallback:()=>Promise.resolve(),requestFinishCallback:()=>null,requestStartCallback:()=>null,requestSuccessCallback:()=>null}),p.onmessage=e=>{let{data:t}=e;switch(t.type){case ZX:(null==c?void 0:c.requestFinishCallback)&&(null==c||c.requestFinishCallback());break;case rX:(null==c?void 0:c.requestStartCallback)&&(null==c||c.requestStartCallback());break;case uX:(null==c?void 0:c.requestSuccessCallback)&&(null==c||c.requestSuccessCallback(t.data?JSON.parse(t.data):null))}};return I({data:i,type:nX}).then((()=>Promise.resolve(!0))).catch((e=>Promise.reject(e)))},isAuthenticated:Y,refreshAccessToken:()=>I({type:WX}),requestCustomGrant:e=>I({data:e,type:dX}).then((t=>(e.preventSignOutURLUpdate&&(s=!0),Promise.resolve(t)))).catch((e=>Promise.reject(e))),revokeAccessToken:()=>I({type:sX}).then((e=>(h.reset(),Promise.resolve(e)))).catch((e=>Promise.reject(e))),setHttpRequestErrorCallback:e=>{e&&"function"==typeof e&&(c.requestErrorCallback=e)},setHttpRequestFinishCallback:e=>{e&&"function"==typeof e&&(c.requestFinishCallback=e)},setHttpRequestStartCallback:e=>{e&&"function"==typeof e&&(c.requestStartCallback=e)},setHttpRequestSuccessCallback:e=>{e&&"function"==typeof e&&(c.requestSuccessCallback=e)},signIn:(t,n,l,o,c)=>Uy(void 0,void 0,void 0,(function*(){var a,d,s;const r=yield m.handleSignIn(C,y,R);if(r)return r;{let r,u,Z;return(null==i?void 0:i.responseMode)===e.ResponseMode.formPost&&n?(r=n,u=null!=l?l:"",Z=null!=o?o:""):(r=null!==(a=new URL(window.location.href).searchParams.get(Ty))&&void 0!==a?a:"",u=null!==(d=new URL(window.location.href).searchParams.get(Fy))&&void 0!==d?d:"",Z=null!==(s=new URL(window.location.href).searchParams.get(Ay))&&void 0!==s?s:"",EX.removeAuthorizationCode()),r&&Z?W(r,u,Z,c):V(t).then((e=>Uy(void 0,void 0,void 0,(function*(){return location.href=e.authorizationURL,yield EX.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})})))).catch((e=>Promise.reject(e)))}})),signOut:()=>new Promise(((e,n)=>{if(!s){return I({type:lX}).then((t=>Uy(void 0,void 0,void 0,(function*(){return window.location.href=t,yield EX.waitTillPageRedirect(),e(!0)})))).catch((e=>n(e)))}window.location.href=EX.getSignOutURL(i.clientID,t),EX.waitTillPageRedirect().then((()=>Promise.resolve(!0)))})),trySignInSilently:(e,t)=>Uy(void 0,void 0,void 0,(function*(){return yield m.trySignInSilently(X,W,h,e,t)})),updateConfig:e=>Uy(void 0,void 0,void 0,(function*(){const t=yield v(),i=!(t&&t.endpoints&&t.endpoints.checkSessionIframe&&e&&e.endpoints&&e.endpoints.checkSessionIframe&&t.endpoints.checkSessionIframe===e.endpoints.checkSessionIframe),n=Object.assign(Object.assign({},t),e),l={data:n,type:vX};yield I(l),n.enableOIDCSessionManagement&&i&&(h.reset(),y())}))}})),mv={autoLogoutOnTokenRefreshError:!0,checkSessionInterval:3,clientHost:origin,enableOIDCSessionManagement:!1,periodicTokenRefresh:!1,sessionRefreshInterval:300,storage:e.Storage.SessionStorage};class pv{constructor(e){this._authHelper=DX,this._worker=iX,this._initialized=!1,this._startedInitialize=!1,this._onSignInCallback=()=>null,this._onSignOutCallback=()=>null,this._onSignOutFailedCallback=()=>null,this._onEndUserSession=()=>null,this._onInitialize=()=>null,this._onCustomGrant=new Map,this._instanceID=e}instantiateAuthHelper(e){this._authHelper=e||DX}instantiateWorker(e){this._worker=e||iX}_isInitialized(){return Uy(this,void 0,void 0,(function*(){if(!this._startedInitialize)return!1;let e=0;for(;!this._initialized;)1e4===e&&console.warn("It is taking longer than usual for the object to be initialized"),yield new Promise((e=>setTimeout(e,1))),e++;return!0}))}_validateMethod(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return Uy(this,void 0,void 0,(function*(){return(yield this._isInitialized())?!(e&&!(yield this.isAuthenticated()))||Promise.reject(new wy("SPA-AUTH_CLIENT-VM-IV02","The user is not authenticated.","The user must be authenticated first.")):Promise.reject(new wy("SPA-AUTH_CLIENT-VM-NF01","The SDK is not initialized.","The SDK must be initialized first."))}))}
|
|
433
433
|
/**
|
|
434
434
|
* This method returns the instance of the singleton class.
|
|
435
435
|
* If an ID is provided, it will return the instance with the given ID.
|
|
@@ -658,7 +658,7 @@ constructor(){}
|
|
|
658
658
|
* @memberof AsgardeoSPAClient
|
|
659
659
|
*
|
|
660
660
|
* @preserve
|
|
661
|
-
*/httpStreamRequest(t){return Uy(this,void 0,void 0,(function*(){if(yield this._validateMethod(!1),this._storage!==e.Storage.WebWorker)throw new
|
|
661
|
+
*/httpStreamRequest(t){return Uy(this,void 0,void 0,(function*(){if(yield this._validateMethod(!1),this._storage!==e.Storage.WebWorker)throw new wy("SPA-AUTH_CLIENT-HSR-IV01","Streaming is only supported with WebWorker storage.","The httpStreamRequest method requires storage type to be set to webWorker.");return this._client.httpStreamRequest(t)}))}
|
|
662
662
|
/**
|
|
663
663
|
* This method allows you to send a request with a custom grant.
|
|
664
664
|
*
|
|
@@ -689,7 +689,7 @@ constructor(){}
|
|
|
689
689
|
* @memberof AsgardeoSPAClient
|
|
690
690
|
*
|
|
691
691
|
* @preserve
|
|
692
|
-
*/requestCustomGrant(e){var t,i;return Uy(this,void 0,void 0,(function*(){if(e.signInRequired,yield this._validateMethod(),!e.id)return Promise.reject(new
|
|
692
|
+
*/requestCustomGrant(e){var t,i;return Uy(this,void 0,void 0,(function*(){if(e.signInRequired,yield this._validateMethod(),!e.id)return Promise.reject(new wy("SPA-AUTH_CLIENT-RCG-NF01","The custom grant request id not found.","The id attribute of the custom grant config object passed as an argument should have a value."));const n=yield null===(t=this._client)||void 0===t?void 0:t.requestCustomGrant(e),l=this._onCustomGrant.get(e.id);return l&&l(null===(i=this._onCustomGrant)||void 0===i?void 0:i.get(e.id)),n}))}
|
|
693
693
|
/**
|
|
694
694
|
* This method ends a user session. The access token is revoked and the session information is destroyed.
|
|
695
695
|
*
|
|
@@ -738,7 +738,7 @@ constructor(){}
|
|
|
738
738
|
* @memberof AsgardeoSPAClient
|
|
739
739
|
*
|
|
740
740
|
* @preserve
|
|
741
|
-
*/getHttpClient(){if(this._client){if(this._storage!==e.Storage.WebWorker){return this._client.getHttpClient()}throw new
|
|
741
|
+
*/getHttpClient(){if(this._client){if(this._storage!==e.Storage.WebWorker){return this._client.getHttpClient()}throw new wy("SPA-AUTH_CLIENT-GHC-IV01","Http client cannot be returned.","The http client cannot be returned when the storage type is set to webWorker.")}throw new wy("SPA-AUTH_CLIENT-GHC-NF02","The SDK is not initialized.","The SDK has not been initialized yet. Initialize the SDK using the initialize method before calling this method.")}
|
|
742
742
|
/**
|
|
743
743
|
* This method decodes the payload of the id token and returns it.
|
|
744
744
|
*
|
|
@@ -816,7 +816,7 @@ constructor(){}
|
|
|
816
816
|
* @memberof AsgardeoSPAClient
|
|
817
817
|
*
|
|
818
818
|
* @preserve
|
|
819
|
-
*/getAccessToken(){return Uy(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(e.Storage.WebWorker,e.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new
|
|
819
|
+
*/getAccessToken(){return Uy(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(e.Storage.WebWorker,e.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new wy("SPA-AUTH_CLIENT-GAT-IV01","The access token cannot be returned.","The access token cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getAccessToken()}))}
|
|
820
820
|
/**
|
|
821
821
|
* This method return a Promise that resolves with the idp access token.
|
|
822
822
|
*
|
|
@@ -838,7 +838,7 @@ constructor(){}
|
|
|
838
838
|
* @memberof AsgardeoSPAClient
|
|
839
839
|
*
|
|
840
840
|
* @preserve
|
|
841
|
-
*/getIDPAccessToken(){return Uy(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(e.Storage.WebWorker,e.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new
|
|
841
|
+
*/getIDPAccessToken(){return Uy(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(e.Storage.WebWorker,e.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new wy("SPA-AUTH_CLIENT-GIAT-IV01","The access token cannot be returned.","The access token cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getAccessToken()}))}
|
|
842
842
|
/**
|
|
843
843
|
* This method return a Promise that resolves with the data layer object.
|
|
844
844
|
*
|
|
@@ -860,7 +860,7 @@ constructor(){}
|
|
|
860
860
|
* @memberof AsgardeoSPAClient
|
|
861
861
|
*
|
|
862
862
|
* @preserve
|
|
863
|
-
*/getDataLayer(){return Uy(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(e.Storage.WebWorker,e.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new
|
|
863
|
+
*/getDataLayer(){return Uy(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(e.Storage.WebWorker,e.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new wy("SPA-AUTH_CLIENT-GDL-IV01","The data layer cannot be returned.","The data layer cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getDataLayer()}))}
|
|
864
864
|
/**
|
|
865
865
|
* This method return a Promise that resolves with the config data stored in the storage.
|
|
866
866
|
*
|
|
@@ -919,7 +919,7 @@ constructor(){}
|
|
|
919
919
|
* @memberof AsgardeoSPAClient
|
|
920
920
|
*
|
|
921
921
|
* @preserve
|
|
922
|
-
*/isSessionActive(){return Uy(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage&&[(e.Storage.WebWorker,e.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new
|
|
922
|
+
*/isSessionActive(){return Uy(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage&&[(e.Storage.WebWorker,e.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new wy("SPA-AUTH_CLIENT-ISA-IV01","The active session cannot be returned.","The active session cannot be returned when the storage type is set to webWorker or browserMemory."));const t=this._client;return null==t?void 0:t.isSessionActive()}))}on(t,i,n){var l,o,c,a;return Uy(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!i||"function"!=typeof i)throw new wy("SPA-AUTH_CLIENT-ON-IV02","Invalid callback function.","The provided callback function is invalid.");switch(t){case e.Hooks.SignIn:this._onSignInCallback=i;break;case e.Hooks.SignOut:this._onSignOutCallback=i,(yield EX.isSignOutSuccessful())&&this._onSignOutCallback();break;case e.Hooks.RevokeAccessToken:this._onEndUserSession=i;break;case e.Hooks.Initialize:this._onInitialize=i;break;case e.Hooks.HttpRequestError:null===(l=this._client)||void 0===l||l.setHttpRequestErrorCallback(i);break;case e.Hooks.HttpRequestFinish:null===(o=this._client)||void 0===o||o.setHttpRequestFinishCallback(i);break;case e.Hooks.HttpRequestStart:null===(c=this._client)||void 0===c||c.setHttpRequestStartCallback(i);break;case e.Hooks.HttpRequestSuccess:null===(a=this._client)||void 0===a||a.setHttpRequestSuccessCallback(i);break;case e.Hooks.CustomGrant:n&&this._onCustomGrant.set(n,i);break;case e.Hooks.SignOutFailed:{this._onSignOutFailedCallback=i;const e=EX.didSignOutFail();e&&this._onSignOutFailedCallback(e);break}default:throw new wy("SPA-AUTH_CLIENT-ON-IV01","Invalid hook.","The provided hook is invalid.")}}))}
|
|
923
923
|
/**
|
|
924
924
|
* This method enables callback functions attached to the http client.
|
|
925
925
|
*
|
|
@@ -971,5 +971,5 @@ constructor(){}
|
|
|
971
971
|
* @memberof AsgardeoAuthClient
|
|
972
972
|
*
|
|
973
973
|
* @preserve
|
|
974
|
-
*/updateConfig(t){return Uy(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage===e.Storage.WebWorker){const e=this._client;yield e.updateConfig(t)}else{const e=this._client;yield e.updateConfig(t)}}))}}pv._instances=new Map;class Iv extends Worker{constructor(){super(...arguments),this.onmessage=()=>null}}e.ASGARDEO_SESSION_ACTIVE="asgardeo-session-active",e.AUTHORIZATION_CODE=Ty,e.AsgardeoAuthClient=
|
|
974
|
+
*/updateConfig(t){return Uy(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage===e.Storage.WebWorker){const e=this._client;yield e.updateConfig(t)}else{const e=this._client;yield e.updateConfig(t)}}))}}pv._instances=new Map;class Iv extends Worker{constructor(){super(...arguments),this.onmessage=()=>null}}e.ASGARDEO_SESSION_ACTIVE="asgardeo-session-active",e.AUTHORIZATION_CODE=Ty,e.AsgardeoAuthClient=Oy,e.AsgardeoAuthException=wy,e.AsgardeoSPAClient=pv,e.AuthenticationHelper=DX,e.AuthenticationUtils=Py,e.CLIENT_ID_TAG="{{clientID}}",e.CLIENT_SECRET_TAG="{{clientSecret}}",e.CryptoHelper=jy,e.DataLayer=Ey,e.HttpError=AR,e.MainThreadClient=bv,e.OIDC_SCOPE="openid",e.PKCE_CODE_VERIFIER="pkce_code_verifier",e.PKCE_SEPARATOR="#",e.REFRESH_TOKEN_TIMER=ky,e.SCOPE_TAG="{{scope}}",e.SESSION_STATE=Fy,e.SIGN_OUT_SUCCESS_PARAM=By,e.SIGN_OUT_URL=xy,e.SPAHelper=OX,e.SPAUtils=EX,e.STATE=Ay,e.SUPPORTED_SIGNATURE_ALGORITHMS=Hy,e.TOKEN_REQUEST_CONFIG_KEY=UX,e.TOKEN_TAG="{{token}}",e.USERNAME_TAG="{{username}}",e.WebWorkerClass=Iv,e.WebWorkerClient=hv,e.workerReceiver=e=>{const t=self;let i;t.onmessage=t=>{let{data:c,ports:a}=t;return Uy(void 0,void 0,void 0,(function*(){var t,d,s,r,u,Z;const b=a[0];if(c.type===nX||i)switch(c.type){case nX:try{const t=Object.assign({},c.data);i=yield((e,t)=>Uy(void 0,void 0,void 0,(function*(){const i=new oS,n=new Zv,l=new Oy;yield l.initialize(e,i,n);const o=new OX(l),c=t(l,o),a=l.getDataLayer(),d=nS.getInstance();return(null==d?void 0:d.init)&&(yield d.init(!0,(e=>Uy(void 0,void 0,void 0,(function*(){yield c.attachTokenToRequestConfig(e)}))))),{disableHttpHandler:()=>{c.disableHttpHandler(d)},enableHttpHandler:()=>{c.enableHttpHandler(d)},getAccessToken:()=>c.getAccessToken(),getAuthorizationURL:e=>Uy(void 0,void 0,void 0,(function*(){return l.getAuthorizationURL(e).then((e=>Uy(void 0,void 0,void 0,(function*(){var t;const i=null!==(t=new URL(e).searchParams.get(Ay))&&void 0!==t?t:"",n=yield l.getPKCECode(i);return{authorizationURL:e,pkce:n}})))).catch((e=>Promise.reject(e)))})),getBasicUserInfo:()=>Uy(void 0,void 0,void 0,(function*(){return c.getBasicUserInfo()})),getConfigData:()=>Uy(void 0,void 0,void 0,(function*(){return a.getConfigData()})),getCryptoHelper:()=>Uy(void 0,void 0,void 0,(function*(){return c.getCryptoHelper()})),getDecodedIDPIDToken:()=>Uy(void 0,void 0,void 0,(function*(){return c.getDecodedIDPIDToken()})),getDecodedIDToken:()=>Uy(void 0,void 0,void 0,(function*(){return c.getDecodedIDToken()})),getIDToken:()=>Uy(void 0,void 0,void 0,(function*(){return c.getIDToken()})),getOIDCServiceEndpoints:()=>Uy(void 0,void 0,void 0,(function*(){return c.getOIDCServiceEndpoints()})),getSignOutURL:()=>Uy(void 0,void 0,void 0,(function*(){return yield l.getSignOutURL()})),httpRequest:e=>Uy(void 0,void 0,void 0,(function*(){return yield c.httpRequest(d,e)})),httpRequestAll:e=>Uy(void 0,void 0,void 0,(function*(){return yield c.httpRequestAll(e,d)})),isAuthenticated:()=>c.isAuthenticated(),refreshAccessToken:()=>Uy(void 0,void 0,void 0,(function*(){try{return yield c.refreshAccessToken()}catch(e){return Promise.reject(e)}})),requestAccessToken:(e,t,i,n)=>Uy(void 0,void 0,void 0,(function*(){return yield c.requestAccessToken(e,t,void 0,i,n)})),requestCustomGrant:e=>Uy(void 0,void 0,void 0,(function*(){return yield c.requestCustomGrant(e)})),revokeAccessToken:()=>Uy(void 0,void 0,void 0,(function*(){const e=yield o.getRefreshTimeoutTimer();return l.revokeAccessToken().then((()=>(o.clearRefreshTokenTimeout(e),Promise.resolve(!0)))).catch((e=>Promise.reject(e)))})),setHttpRequestFinishCallback:e=>{(null==d?void 0:d.setHttpRequestFinishCallback)&&d.setHttpRequestFinishCallback(e)},setHttpRequestStartCallback:e=>{(null==d?void 0:d.setHttpRequestStartCallback)&&d.setHttpRequestStartCallback(e)},setHttpRequestSuccessCallback:e=>{(null==d?void 0:d.setHttpRequestSuccessCallback)&&d.setHttpRequestSuccessCallback(e)},setSessionState:e=>Uy(void 0,void 0,void 0,(function*(){yield a.setSessionDataParameter(Fy,e)})),signOut:()=>Uy(void 0,void 0,void 0,(function*(){return o.clearRefreshTokenTimeout(),yield l.getSignOutURL()})),startAutoRefreshToken:()=>Uy(void 0,void 0,void 0,(function*(){o.clearRefreshTokenTimeout(),o.refreshAccessTokenAutomatically(c)})),updateConfig:e=>Uy(void 0,void 0,void 0,(function*(){yield l.updateConfig(e)}))}})))(t,e),i.setHttpRequestFinishCallback(o),i.setHttpRequestStartCallback(n),i.setHttpRequestSuccessCallback(l),b.postMessage(MX.generateSuccessMessage())}catch(e){b.postMessage(MX.generateFailureMessage(e))}break;case GX:i.getAuthorizationURL(null==c?void 0:c.data).then((e=>{b.postMessage(MX.generateSuccessMessage(e))})).catch((e=>{b.postMessage(MX.generateFailureMessage(e))}));break;case yX:i.requestAccessToken(null===(t=null==c?void 0:c.data)||void 0===t?void 0:t.code,null===(d=null==c?void 0:c.data)||void 0===d?void 0:d.sessionState,null===(s=null==c?void 0:c.data)||void 0===s?void 0:s.pkce,null===(r=null==c?void 0:c.data)||void 0===r?void 0:r.state).then((e=>{b.postMessage(MX.generateSuccessMessage(e))})).catch((e=>{b.postMessage(MX.generateFailureMessage(e))}));break;case oX:{const e=c.data,t=null==e?void 0:e.data;if(!0===(null===(Z=null===(u=c.data)||void 0===u?void 0:u.data)||void 0===Z?void 0:Z.formData)){const i=new FormData;for(const e in t)"formData"!==e&&i.append(e,t[e]);e.data=i}i.httpRequest(e).then((e=>{b.postMessage(MX.generateSuccessMessage(e))})).catch((e=>{b.postMessage(MX.generateFailureMessage(e))}));break}case aX:{const e=c.data;e.adapter="fetch",e.responseType="stream",i.httpRequest(e).then((e=>{var t;const i=null===(t=e)||void 0===t?void 0:t.data;i instanceof ReadableStream?b.postMessage({data:i,success:!0},[i]):b.postMessage(MX.generateSuccessMessage(e))})).catch((e=>{b.postMessage(MX.generateFailureMessage(e))}));break}case cX:i.httpRequestAll(c.data).then((e=>{b.postMessage(MX.generateSuccessMessage(e))})).catch((e=>{b.postMessage(MX.generateFailureMessage(e))}));break;case lX:try{b.postMessage(MX.generateSuccessMessage(yield i.signOut()))}catch(e){b.postMessage(MX.generateFailureMessage(e))}break;case dX:i.requestCustomGrant(c.data).then((e=>{b.postMessage(MX.generateSuccessMessage(e))})).catch((e=>{b.postMessage(MX.generateFailureMessage(e))}));break;case sX:i.revokeAccessToken().then((e=>{b.postMessage(MX.generateSuccessMessage(e))})).catch((e=>{b.postMessage(MX.generateFailureMessage(e))}));break;case bX:try{b.postMessage(MX.generateSuccessMessage(yield i.getOIDCServiceEndpoints()))}catch(e){b.postMessage(MX.generateFailureMessage(e))}break;case hX:try{b.postMessage(MX.generateSuccessMessage(yield i.getBasicUserInfo()))}catch(e){b.postMessage(MX.generateFailureMessage(e))}break;case mX:try{b.postMessage(MX.generateSuccessMessage(yield i.getDecodedIDToken()))}catch(e){b.postMessage(MX.generateFailureMessage(e))}break;case pX:try{b.postMessage(MX.generateSuccessMessage(yield i.getCryptoHelper()))}catch(e){b.postMessage(MX.generateFailureMessage(e))}break;case fX:try{b.postMessage(MX.generateSuccessMessage(yield i.getIDToken()))}catch(e){b.postMessage(MX.generateFailureMessage(e))}break;case IX:i.enableHttpHandler(),b.postMessage(MX.generateSuccessMessage());break;case gX:i.disableHttpHandler(),b.postMessage(MX.generateSuccessMessage());break;case XX:try{b.postMessage(MX.generateSuccessMessage(yield i.isAuthenticated()))}catch(e){b.postMessage(MX.generateFailureMessage(e))}break;case VX:try{b.postMessage(MX.generateSuccessMessage(yield i.getSignOutURL()))}catch(e){b.postMessage(MX.generateFailureMessage(e))}break;case WX:try{b.postMessage(MX.generateSuccessMessage(yield i.refreshAccessToken()))}catch(e){b.postMessage(MX.generateFailureMessage(e))}break;case SX:try{b.postMessage(MX.generateSuccessMessage(i.startAutoRefreshToken()))}catch(e){b.postMessage(MX.generateFailureMessage(e))}break;case RX:try{b.postMessage(MX.generateSuccessMessage(yield i.setSessionState(null==c?void 0:c.data)))}catch(e){b.postMessage(MX.generateFailureMessage(e))}break;case vX:try{b.postMessage(MX.generateSuccessMessage(yield i.updateConfig(null==c?void 0:c.data)))}catch(e){b.postMessage(MX.generateFailureMessage(e))}break;case NX:try{b.postMessage(MX.generateSuccessMessage(yield i.getConfigData()))}catch(e){b.postMessage(MX.generateFailureMessage(e))}break;default:null==b||b.postMessage(MX.generateFailureMessage(new wy("SPA-CLIENT_WORKER-ONMSG-IV02","The message type is invalid.","The message type provided, ".concat(c.type,", is invalid."))))}else b.postMessage(MX.generateFailureMessage(new wy("SPA-CLIENT_WORKER-ONMSG-NF01","The web worker has not been initialized yet.","The initialize method needs to be called before the specified operation can be carried out.")))}))};const n=()=>{t.postMessage({type:rX})},l=e=>{var i;(null===(i=e)||void 0===i?void 0:i.data)instanceof ReadableStream||t.postMessage({data:JSON.stringify(null!=e?e:""),type:uX})},o=()=>{t.postMessage({type:ZX})}},Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
975
975
|
//# sourceMappingURL=asgardeo-spa.production.js.map
|