@drincs/pixi-vn 1.5.13 → 1.5.18
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/README.md +8 -3
- package/dist/canvas.cjs +3 -2
- package/dist/canvas.d.cts +46 -105
- package/dist/canvas.d.ts +46 -105
- package/dist/canvas.mjs +3 -2
- package/dist/characters.cjs +2 -1
- package/dist/characters.mjs +2 -1
- package/dist/chunk-46QBDRUK.mjs +2 -0
- package/dist/chunk-52EK6LYW.mjs +2 -0
- package/dist/chunk-INJYRMJ3.mjs +2 -0
- package/dist/{chunk-TTRUPDAB.mjs → chunk-JJFD2BVW.mjs} +2 -1
- package/dist/chunk-JJFD2BVW.mjs.map +1 -0
- package/dist/chunk-OXRIVLY2.mjs +2 -0
- package/dist/chunk-SOFV7YZ5.mjs +2 -0
- package/dist/chunk-XZMYXKAY.mjs +2 -0
- package/dist/core.cjs +1 -0
- package/dist/core.d.cts +399 -0
- package/dist/core.d.ts +399 -0
- package/dist/core.mjs +1 -0
- package/dist/history.cjs +2 -1
- package/dist/history.d.cts +1 -1
- package/dist/history.d.ts +1 -1
- package/dist/history.mjs +2 -1
- package/dist/index.cjs +3 -2
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +9 -10
- package/dist/index.d.ts +9 -10
- package/dist/index.mjs +3 -2
- package/dist/index.mjs.map +1 -0
- package/dist/motion.cjs +2 -0
- package/dist/motion.cjs.map +1 -0
- package/dist/motion.d.cts +96 -0
- package/dist/motion.d.ts +96 -0
- package/dist/motion.mjs +2 -0
- package/dist/motion.mjs.map +1 -0
- package/dist/narration.cjs +3 -2
- package/dist/narration.mjs +3 -2
- package/dist/pixi/browser.js +170 -167
- package/dist/sound.cjs +2 -1
- package/dist/sound.mjs +2 -1
- package/dist/storage.cjs +2 -1
- package/dist/storage.mjs +2 -1
- package/dist/vite-listener.cjs +2 -1
- package/dist/vite-listener.cjs.map +1 -0
- package/dist/vite-listener.mjs +2 -1
- package/dist/vite-listener.mjs.map +1 -0
- package/dist/vite.cjs +2 -1
- package/dist/vite.cjs.map +1 -0
- package/dist/vite.mjs +2 -1
- package/dist/vite.mjs.map +1 -0
- package/package.json +27 -10
- package/dist/chunk-6GO4XVS7.mjs +0 -1
- package/dist/chunk-6IVCTY6P.mjs +0 -1
- package/dist/chunk-GNJIUFU2.mjs +0 -1
- package/dist/chunk-HVEJJGVC.mjs +0 -1
- package/dist/chunk-XDBHD3IV.mjs +0 -1
- package/dist/chunk-XSN6P5JL.mjs +0 -0
- package/dist/unifier.cjs +0 -1
- package/dist/unifier.mjs +0 -1
package/dist/narration.cjs
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
'use strict';var unifier=require('@drincs/pixi-vn/unifier');var bt=Object.create;var Ke=Object.defineProperty;var mt=Object.getOwnPropertyDescriptor;var St=Object.getOwnPropertyNames;var gt=Object.getPrototypeOf,yt=Object.prototype.hasOwnProperty;var Ze=h=>{throw TypeError(h)};var _t=(h,e,t)=>e in h?Ke(h,e,{enumerable:true,configurable:true,writable:true,value:t}):h[e]=t;var We=(h=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(h,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):h)(function(h){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+h+'" is not supported')});var et=(h,e)=>()=>(e||h((e={exports:{}}).exports,e),e.exports);var Lt=(h,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of St(e))!yt.call(h,n)&&n!==t&&Ke(h,n,{get:()=>e[n],enumerable:!(i=mt(e,n))||i.enumerable});return h};var Tt=(h,e,t)=>(t=h!=null?bt(gt(h)):{},Lt(Ke(t,"default",{value:h,enumerable:true}),h));var T=(h,e,t)=>_t(h,typeof e!="symbol"?e+"":e,t),Be=(h,e,t)=>e.has(h)||Ze("Cannot "+t);var r=(h,e,t)=>(Be(h,e,"read from private field"),t?t.call(h):e.get(h)),R=(h,e,t)=>e.has(h)?Ze("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(h):e.set(h,t),S=(h,e,t,i)=>(Be(h,e,"write to private field"),e.set(h,t),t),f=(h,e,t)=>(Be(h,e,"access private method"),t);var Pe=(h,e,t,i)=>({set _(n){S(h,e,n);},get _(){return r(h,e,i)}});var ut=et((Ge,ht)=>{(function(h,e){typeof Ge=="object"?ht.exports=Ge=e():typeof define=="function"&&define.amd?define([],e):h.CryptoJS=e();})(Ge,function(){var h=h||(function(e,t){var i;if(typeof window<"u"&&window.crypto&&(i=window.crypto),typeof self<"u"&&self.crypto&&(i=self.crypto),typeof globalThis<"u"&&globalThis.crypto&&(i=globalThis.crypto),!i&&typeof window<"u"&&window.msCrypto&&(i=window.msCrypto),!i&&typeof global<"u"&&global.crypto&&(i=global.crypto),!i&&typeof We=="function")try{i=We("crypto");}catch{}var n=function(){if(i){if(typeof i.getRandomValues=="function")try{return i.getRandomValues(new Uint32Array(1))[0]}catch{}if(typeof i.randomBytes=="function")try{return i.randomBytes(4).readInt32LE()}catch{}}throw new Error("Native crypto module could not be used to get secure random number.")},a=Object.create||(function(){function o(){}return function(d){var v;return o.prototype=d,v=new o,o.prototype=null,v}})(),s={},l=s.lib={},p=l.Base=(function(){return {extend:function(o){var d=a(this);return o&&d.mixIn(o),(!d.hasOwnProperty("init")||this.init===d.init)&&(d.init=function(){d.$super.init.apply(this,arguments);}),d.init.prototype=d,d.$super=this,d},create:function(){var o=this.extend();return o.init.apply(o,arguments),o},init:function(){},mixIn:function(o){for(var d in o)o.hasOwnProperty(d)&&(this[d]=o[d]);o.hasOwnProperty("toString")&&(this.toString=o.toString);},clone:function(){return this.init.prototype.extend(this)}}})(),y=l.WordArray=p.extend({init:function(o,d){o=this.words=o||[],d!=t?this.sigBytes=d:this.sigBytes=o.length*4;},toString:function(o){return (o||E).stringify(this)},concat:function(o){var d=this.words,v=o.words,I=this.sigBytes,O=o.sigBytes;if(this.clamp(),I%4)for(var U=0;U<O;U++){var oe=v[U>>>2]>>>24-U%4*8&255;d[I+U>>>2]|=oe<<24-(I+U)%4*8;}else for(var z=0;z<O;z+=4)d[I+z>>>2]=v[z>>>2];return this.sigBytes+=O,this},clamp:function(){var o=this.words,d=this.sigBytes;o[d>>>2]&=4294967295<<32-d%4*8,o.length=e.ceil(d/4);},clone:function(){var o=p.clone.call(this);return o.words=this.words.slice(0),o},random:function(o){for(var d=[],v=0;v<o;v+=4)d.push(n());return new y.init(d,o)}}),c=s.enc={},E=c.Hex={stringify:function(o){for(var d=o.words,v=o.sigBytes,I=[],O=0;O<v;O++){var U=d[O>>>2]>>>24-O%4*8&255;I.push((U>>>4).toString(16)),I.push((U&15).toString(16));}return I.join("")},parse:function(o){for(var d=o.length,v=[],I=0;I<d;I+=2)v[I>>>3]|=parseInt(o.substr(I,2),16)<<24-I%8*4;return new y.init(v,d/2)}},N=c.Latin1={stringify:function(o){for(var d=o.words,v=o.sigBytes,I=[],O=0;O<v;O++){var U=d[O>>>2]>>>24-O%4*8&255;I.push(String.fromCharCode(U));}return I.join("")},parse:function(o){for(var d=o.length,v=[],I=0;I<d;I++)v[I>>>2]|=(o.charCodeAt(I)&255)<<24-I%4*8;return new y.init(v,d)}},D=c.Utf8={stringify:function(o){try{return decodeURIComponent(escape(N.stringify(o)))}catch{throw new Error("Malformed UTF-8 data")}},parse:function(o){return N.parse(unescape(encodeURIComponent(o)))}},P=l.BufferedBlockAlgorithm=p.extend({reset:function(){this._data=new y.init,this._nDataBytes=0;},_append:function(o){typeof o=="string"&&(o=D.parse(o)),this._data.concat(o),this._nDataBytes+=o.sigBytes;},_process:function(o){var d,v=this._data,I=v.words,O=v.sigBytes,U=this.blockSize,oe=U*4,z=O/oe;o?z=e.ceil(z):z=e.max((z|0)-this._minBufferSize,0);var J=z*U,_e=e.min(J*4,O);if(J){for(var He=0;He<J;He+=U)this._doProcessBlock(I,He);d=I.splice(0,J),v.sigBytes-=_e;}return new y.init(d,_e)},clone:function(){var o=p.clone.call(this);return o._data=this._data.clone(),o},_minBufferSize:0});l.Hasher=P.extend({cfg:p.extend(),init:function(o){this.cfg=this.cfg.extend(o),this.reset();},reset:function(){P.reset.call(this),this._doReset();},update:function(o){return this._append(o),this._process(),this},finalize:function(o){o&&this._append(o);var d=this._doFinalize();return d},blockSize:512/32,_createHelper:function(o){return function(d,v){return new o.init(v).finalize(d)}},_createHmacHelper:function(o){return function(d,v){return new C.HMAC.init(o,v).finalize(d)}}});var C=s.algo={};return s})(Math);return h});});var dt=et((ze,pt)=>{(function(h,e){typeof ze=="object"?pt.exports=ze=e(ut()):typeof define=="function"&&define.amd?define(["./core"],e):e(h.CryptoJS);})(ze,function(h){return (function(){var e=h,t=e.lib,i=t.WordArray,n=t.Hasher,a=e.algo,s=[],l=a.SHA1=n.extend({_doReset:function(){this._hash=new i.init([1732584193,4023233417,2562383102,271733878,3285377520]);},_doProcessBlock:function(p,y){for(var c=this._hash.words,E=c[0],N=c[1],D=c[2],P=c[3],x=c[4],C=0;C<80;C++){if(C<16)s[C]=p[y+C]|0;else {var o=s[C-3]^s[C-8]^s[C-14]^s[C-16];s[C]=o<<1|o>>>31;}var d=(E<<5|E>>>27)+x+s[C];C<20?d+=(N&D|~N&P)+1518500249:C<40?d+=(N^D^P)+1859775393:C<60?d+=(N&D|N&P|D&P)-1894007588:d+=(N^D^P)-899497514,x=P,P=D,D=N<<30|N>>>2,N=E,E=d;}c[0]=c[0]+E|0,c[1]=c[1]+N|0,c[2]=c[2]+D|0,c[3]=c[3]+P|0,c[4]=c[4]+x|0;},_doFinalize:function(){var p=this._data,y=p.words,c=this._nDataBytes*8,E=p.sigBytes*8;return y[E>>>5]|=128<<24-E%32,y[(E+64>>>9<<4)+14]=Math.floor(c/4294967296),y[(E+64>>>9<<4)+15]=c,p.sigBytes=y.length*4,this._process(),this._hash},clone:function(){var p=n.clone.call(this);return p._hash=this._hash.clone(),p}});e.SHA1=n._createHelper(l),e.HmacSHA1=n._createHmacHelper(l);})(),h.SHA1});});var w={CURRENT_DIALOGUE_MEMORY_KEY:"___current_dialogue_memory___",LAST_DIALOGUE_ADDED_IN_STEP_MEMORY_KEY:"___last_dialogue_added_in_step_memory___",CURRENT_MENU_OPTIONS_MEMORY_KEY:"___current_menu_options_memory___",LAST_MENU_OPTIONS_ADDED_IN_STEP_MEMORY_KEY:"___last_menu_options_added_in_step_memory___",CURRENT_INPUT_VALUE_MEMORY_KEY:"_input_value_",LAST_INPUT_ADDED_IN_STEP_MEMORY_KEY:"___last_input_added_in_step_memory___",CURRENT_INPUT_INFO_MEMORY_KEY:"___current_input_info_memory___",CHARACTER_CATEGORY_KEY:"___character___",ADD_NEXT_DIALOG_TEXT_INTO_THE_CURRENT_DIALOG_FLAG_KEY:"___glue___",OPENED_LABELS_COUNTER_KEY:"___opened_labels_counter___",ALL_CHOICES_MADE_KEY:"___all_choices_made___",CURRENT_STEP_TIMES_COUNTER_KEY:"___current_step_times_counter___",LAST_STEP_GLUED:"___last_step_glued___"};var _;(n=>(n.log=(a,...s)=>console.log(`[Pixi\u2019VN] ${a}`,...s),n.warn=(a,...s)=>console.warn(`[Pixi\u2019VN] ${a}`,...s),n.error=(a,...s)=>console.error(`[Pixi\u2019VN] ${a}`,...s),n.info=(a,...s)=>console.info(`[Pixi\u2019VN] ${a}`,...s)))(_||(_={}));function le(h){try{if(typeof h>"u")return h;let e=JSON.stringify(h);return JSON.parse(e)}catch(e){throw _.error("Error creating exportable element",h,e),new Error("[Pixi\u2019VN] Error creating exportable element")}}var Et=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,nt=new Set,je=typeof process=="object"&&process?process:{},st=(h,e,t,i)=>{typeof je.emitWarning=="function"?je.emitWarning(h,e,t,i):console.error(`[${t}] ${e}: ${h}`);},Ve=globalThis.AbortController,tt=globalThis.AbortSignal;if(typeof Ve>"u"){tt=class{constructor(){T(this,"onabort");T(this,"_onabort",[]);T(this,"reason");T(this,"aborted",false);}addEventListener(t,i){this._onabort.push(i);}},Ve=class{constructor(){T(this,"signal",new tt);e();}abort(t){if(!this.signal.aborted){this.signal.reason=t,this.signal.aborted=true;for(let i of this.signal._onabort)i(t);this.signal.onabort?.(t);}}};let h=je.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",e=()=>{h&&(h=false,st("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",e));};}var Ct=h=>!nt.has(h);var de=h=>h&&h===Math.floor(h)&&h>0&&isFinite(h),at=h=>de(h)?h<=Math.pow(2,8)?Uint8Array:h<=Math.pow(2,16)?Uint16Array:h<=Math.pow(2,32)?Uint32Array:h<=Number.MAX_SAFE_INTEGER?Ue:null:null,Ue=class extends Array{constructor(h){super(h),this.fill(0);}},he,Le,It=(he=class{constructor(e,t){T(this,"heap");T(this,"length");if(!r(he,Le))throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new t(e),this.length=0;}static create(e){let t=at(e);if(!t)return [];S(he,Le,true);let i=new he(e,t);return S(he,Le,false),i}push(e){this.heap[this.length++]=e;}pop(){return this.heap[--this.length]}},Le=new WeakMap,R(he,Le,false),he),rt,it,X,B,Q,Se,Z,Te,Ee,ee,F,te,Y,M,L,K,j,H,V,re,G,ie,ne,k,$,se,me,W,Ce,u,ke,ge,ue,Me,q,lt,ye,Ie,Ne,ce,fe,$e,Ye,Fe,A,qe,Ae,be,Xe,ve,ot=(ve=class{constructor(e){R(this,u);R(this,X);R(this,B);R(this,Q);R(this,Se);R(this,Z);R(this,Te);R(this,Ee);R(this,ee);T(this,"ttl");T(this,"ttlResolution");T(this,"ttlAutopurge");T(this,"updateAgeOnGet");T(this,"updateAgeOnHas");T(this,"allowStale");T(this,"noDisposeOnSet");T(this,"noUpdateTTL");T(this,"maxEntrySize");T(this,"sizeCalculation");T(this,"noDeleteOnFetchRejection");T(this,"noDeleteOnStaleGet");T(this,"allowStaleOnFetchAbort");T(this,"allowStaleOnFetchRejection");T(this,"ignoreFetchAbort");R(this,F);R(this,te);R(this,Y);R(this,M);R(this,L);R(this,K);R(this,j);R(this,H);R(this,V);R(this,re);R(this,G);R(this,ie);R(this,ne);R(this,k);R(this,$);R(this,se);R(this,me);R(this,W);R(this,Ce);R(this,ge,()=>{});R(this,ue,()=>{});R(this,Me,()=>{});R(this,q,()=>false);R(this,ye,e=>{});R(this,Ie,(e,t,i)=>{});R(this,Ne,(e,t,i,n)=>{if(i||n)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0});T(this,rt,"LRUCache");let{max:t=0,ttl:i,ttlResolution:n=1,ttlAutopurge:a,updateAgeOnGet:s,updateAgeOnHas:l,allowStale:p,dispose:y,onInsert:c,disposeAfter:E,noDisposeOnSet:N,noUpdateTTL:D,maxSize:P=0,maxEntrySize:x=0,sizeCalculation:C,fetchMethod:o,memoMethod:d,noDeleteOnFetchRejection:v,noDeleteOnStaleGet:I,allowStaleOnFetchRejection:O,allowStaleOnFetchAbort:U,ignoreFetchAbort:oe,perf:z}=e;if(z!==void 0&&typeof z?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(S(this,ee,z??Et),t!==0&&!de(t))throw new TypeError("max option must be a nonnegative integer");let J=t?at(t):Array;if(!J)throw new Error("invalid max value: "+t);if(S(this,X,t),S(this,B,P),this.maxEntrySize=x||r(this,B),this.sizeCalculation=C,this.sizeCalculation){if(!r(this,B)&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(d!==void 0&&typeof d!="function")throw new TypeError("memoMethod must be a function if defined");if(S(this,Ee,d),o!==void 0&&typeof o!="function")throw new TypeError("fetchMethod must be a function if specified");if(S(this,Te,o),S(this,me,!!o),S(this,Y,new Map),S(this,M,new Array(t).fill(void 0)),S(this,L,new Array(t).fill(void 0)),S(this,K,new J(t)),S(this,j,new J(t)),S(this,H,0),S(this,V,0),S(this,re,It.create(t)),S(this,F,0),S(this,te,0),typeof y=="function"&&S(this,Q,y),typeof c=="function"&&S(this,Se,c),typeof E=="function"?(S(this,Z,E),S(this,G,[])):(S(this,Z,void 0),S(this,G,void 0)),S(this,se,!!r(this,Q)),S(this,Ce,!!r(this,Se)),S(this,W,!!r(this,Z)),this.noDisposeOnSet=!!N,this.noUpdateTTL=!!D,this.noDeleteOnFetchRejection=!!v,this.allowStaleOnFetchRejection=!!O,this.allowStaleOnFetchAbort=!!U,this.ignoreFetchAbort=!!oe,this.maxEntrySize!==0){if(r(this,B)!==0&&!de(r(this,B)))throw new TypeError("maxSize must be a positive integer if specified");if(!de(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");f(this,u,lt).call(this);}if(this.allowStale=!!p,this.noDeleteOnStaleGet=!!I,this.updateAgeOnGet=!!s,this.updateAgeOnHas=!!l,this.ttlResolution=de(n)||n===0?n:1,this.ttlAutopurge=!!a,this.ttl=i||0,this.ttl){if(!de(this.ttl))throw new TypeError("ttl must be a positive integer if specified");f(this,u,ke).call(this);}if(r(this,X)===0&&this.ttl===0&&r(this,B)===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!r(this,X)&&!r(this,B)){let _e="LRU_CACHE_UNBOUNDED";Ct(_e)&&(nt.add(_e),st("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",_e,ve));}}get perf(){return r(this,ee)}static unsafeExposeInternals(e){return {starts:r(e,ne),ttls:r(e,k),autopurgeTimers:r(e,$),sizes:r(e,ie),keyMap:r(e,Y),keyList:r(e,M),valList:r(e,L),next:r(e,K),prev:r(e,j),get head(){return r(e,H)},get tail(){return r(e,V)},free:r(e,re),isBackgroundFetch:t=>{var i;return f(i=e,u,A).call(i,t)},backgroundFetch:(t,i,n,a)=>{var s;return f(s=e,u,Fe).call(s,t,i,n,a)},moveToTail:t=>{var i;return f(i=e,u,Ae).call(i,t)},indexes:t=>{var i;return f(i=e,u,ce).call(i,t)},rindexes:t=>{var i;return f(i=e,u,fe).call(i,t)},isStale:t=>{var i;return r(i=e,q).call(i,t)}}}get max(){return r(this,X)}get maxSize(){return r(this,B)}get calculatedSize(){return r(this,te)}get size(){return r(this,F)}get fetchMethod(){return r(this,Te)}get memoMethod(){return r(this,Ee)}get dispose(){return r(this,Q)}get onInsert(){return r(this,Se)}get disposeAfter(){return r(this,Z)}getRemainingTTL(e){return r(this,Y).has(e)?1/0:0}*entries(){for(let e of f(this,u,ce).call(this))r(this,L)[e]!==void 0&&r(this,M)[e]!==void 0&&!f(this,u,A).call(this,r(this,L)[e])&&(yield [r(this,M)[e],r(this,L)[e]]);}*rentries(){for(let e of f(this,u,fe).call(this))r(this,L)[e]!==void 0&&r(this,M)[e]!==void 0&&!f(this,u,A).call(this,r(this,L)[e])&&(yield [r(this,M)[e],r(this,L)[e]]);}*keys(){for(let e of f(this,u,ce).call(this)){let t=r(this,M)[e];t!==void 0&&!f(this,u,A).call(this,r(this,L)[e])&&(yield t);}}*rkeys(){for(let e of f(this,u,fe).call(this)){let t=r(this,M)[e];t!==void 0&&!f(this,u,A).call(this,r(this,L)[e])&&(yield t);}}*values(){for(let e of f(this,u,ce).call(this))r(this,L)[e]!==void 0&&!f(this,u,A).call(this,r(this,L)[e])&&(yield r(this,L)[e]);}*rvalues(){for(let e of f(this,u,fe).call(this))r(this,L)[e]!==void 0&&!f(this,u,A).call(this,r(this,L)[e])&&(yield r(this,L)[e]);}[(it=Symbol.iterator,rt=Symbol.toStringTag,it)](){return this.entries()}find(e,t={}){for(let i of f(this,u,ce).call(this)){let n=r(this,L)[i],a=f(this,u,A).call(this,n)?n.__staleWhileFetching:n;if(a!==void 0&&e(a,r(this,M)[i],this))return this.get(r(this,M)[i],t)}}forEach(e,t=this){for(let i of f(this,u,ce).call(this)){let n=r(this,L)[i],a=f(this,u,A).call(this,n)?n.__staleWhileFetching:n;a!==void 0&&e.call(t,a,r(this,M)[i],this);}}rforEach(e,t=this){for(let i of f(this,u,fe).call(this)){let n=r(this,L)[i],a=f(this,u,A).call(this,n)?n.__staleWhileFetching:n;a!==void 0&&e.call(t,a,r(this,M)[i],this);}}purgeStale(){let e=false;for(let t of f(this,u,fe).call(this,{allowStale:true}))r(this,q).call(this,t)&&(f(this,u,be).call(this,r(this,M)[t],"expire"),e=true);return e}info(e){let t=r(this,Y).get(e);if(t===void 0)return;let i=r(this,L)[t],n=f(this,u,A).call(this,i)?i.__staleWhileFetching:i;if(n===void 0)return;let a={value:n};if(r(this,k)&&r(this,ne)){let s=r(this,k)[t],l=r(this,ne)[t];if(s&&l){let p=s-(r(this,ee).now()-l);a.ttl=p,a.start=Date.now();}}return r(this,ie)&&(a.size=r(this,ie)[t]),a}dump(){let e=[];for(let t of f(this,u,ce).call(this,{allowStale:true})){let i=r(this,M)[t],n=r(this,L)[t],a=f(this,u,A).call(this,n)?n.__staleWhileFetching:n;if(a===void 0||i===void 0)continue;let s={value:a};if(r(this,k)&&r(this,ne)){s.ttl=r(this,k)[t];let l=r(this,ee).now()-r(this,ne)[t];s.start=Math.floor(Date.now()-l);}r(this,ie)&&(s.size=r(this,ie)[t]),e.unshift([i,s]);}return e}load(e){this.clear();for(let[t,i]of e){if(i.start){let n=Date.now()-i.start;i.start=r(this,ee).now()-n;}this.set(t,i.value,i);}}set(e,t,i={}){var N,D,P,x;if(t===void 0)return this.delete(e),this;let{ttl:n=this.ttl,start:a,noDisposeOnSet:s=this.noDisposeOnSet,sizeCalculation:l=this.sizeCalculation,status:p}=i,{noUpdateTTL:y=this.noUpdateTTL}=i,c=r(this,Ne).call(this,e,t,i.size||0,l);if(this.maxEntrySize&&c>this.maxEntrySize)return p&&(p.set="miss",p.maxEntrySizeExceeded=true),f(this,u,be).call(this,e,"set"),this;let E=r(this,F)===0?void 0:r(this,Y).get(e);if(E===void 0)E=r(this,F)===0?r(this,V):r(this,re).length!==0?r(this,re).pop():r(this,F)===r(this,X)?f(this,u,Ye).call(this,false):r(this,F),r(this,M)[E]=e,r(this,L)[E]=t,r(this,Y).set(e,E),r(this,K)[r(this,V)]=E,r(this,j)[E]=r(this,V),S(this,V,E),Pe(this,F)._++,r(this,Ie).call(this,E,c,p),p&&(p.set="add"),y=false,r(this,Ce)&&((N=r(this,Se))==null||N.call(this,t,e,"add"));else {f(this,u,Ae).call(this,E);let C=r(this,L)[E];if(t!==C){if(r(this,me)&&f(this,u,A).call(this,C)){C.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:o}=C;o!==void 0&&!s&&(r(this,se)&&((D=r(this,Q))==null||D.call(this,o,e,"set")),r(this,W)&&r(this,G)?.push([o,e,"set"]));}else s||(r(this,se)&&((P=r(this,Q))==null||P.call(this,C,e,"set")),r(this,W)&&r(this,G)?.push([C,e,"set"]));if(r(this,ye).call(this,E),r(this,Ie).call(this,E,c,p),r(this,L)[E]=t,p){p.set="replace";let o=C&&f(this,u,A).call(this,C)?C.__staleWhileFetching:C;o!==void 0&&(p.oldValue=o);}}else p&&(p.set="update");r(this,Ce)&&this.onInsert?.(t,e,t===C?"update":"replace");}if(n!==0&&!r(this,k)&&f(this,u,ke).call(this),r(this,k)&&(y||r(this,Me).call(this,E,n,a),p&&r(this,ue).call(this,p,E)),!s&&r(this,W)&&r(this,G)){let C=r(this,G),o;for(;o=C?.shift();)(x=r(this,Z))==null||x.call(this,...o);}return this}pop(){var e;try{for(;r(this,F);){let t=r(this,L)[r(this,H)];if(f(this,u,Ye).call(this,!0),f(this,u,A).call(this,t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(r(this,W)&&r(this,G)){let t=r(this,G),i;for(;i=t?.shift();)(e=r(this,Z))==null||e.call(this,...i);}}}has(e,t={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:n}=t,a=r(this,Y).get(e);if(a!==void 0){let s=r(this,L)[a];if(f(this,u,A).call(this,s)&&s.__staleWhileFetching===void 0)return false;if(r(this,q).call(this,a))n&&(n.has="stale",r(this,ue).call(this,n,a));else return i&&r(this,ge).call(this,a),n&&(n.has="hit",r(this,ue).call(this,n,a)),true}else n&&(n.has="miss");return false}peek(e,t={}){let{allowStale:i=this.allowStale}=t,n=r(this,Y).get(e);if(n===void 0||!i&&r(this,q).call(this,n))return;let a=r(this,L)[n];return f(this,u,A).call(this,a)?a.__staleWhileFetching:a}async fetch(e,t={}){let{allowStale:i=this.allowStale,updateAgeOnGet:n=this.updateAgeOnGet,noDeleteOnStaleGet:a=this.noDeleteOnStaleGet,ttl:s=this.ttl,noDisposeOnSet:l=this.noDisposeOnSet,size:p=0,sizeCalculation:y=this.sizeCalculation,noUpdateTTL:c=this.noUpdateTTL,noDeleteOnFetchRejection:E=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:N=this.allowStaleOnFetchRejection,ignoreFetchAbort:D=this.ignoreFetchAbort,allowStaleOnFetchAbort:P=this.allowStaleOnFetchAbort,context:x,forceRefresh:C=false,status:o,signal:d}=t;if(!r(this,me))return o&&(o.fetch="get"),this.get(e,{allowStale:i,updateAgeOnGet:n,noDeleteOnStaleGet:a,status:o});let v={allowStale:i,updateAgeOnGet:n,noDeleteOnStaleGet:a,ttl:s,noDisposeOnSet:l,size:p,sizeCalculation:y,noUpdateTTL:c,noDeleteOnFetchRejection:E,allowStaleOnFetchRejection:N,allowStaleOnFetchAbort:P,ignoreFetchAbort:D,status:o,signal:d},I=r(this,Y).get(e);if(I===void 0){o&&(o.fetch="miss");let O=f(this,u,Fe).call(this,e,I,v,x);return O.__returned=O}else {let O=r(this,L)[I];if(f(this,u,A).call(this,O)){let J=i&&O.__staleWhileFetching!==void 0;return o&&(o.fetch="inflight",J&&(o.returnedStale=true)),J?O.__staleWhileFetching:O.__returned=O}let U=r(this,q).call(this,I);if(!C&&!U)return o&&(o.fetch="hit"),f(this,u,Ae).call(this,I),n&&r(this,ge).call(this,I),o&&r(this,ue).call(this,o,I),O;let oe=f(this,u,Fe).call(this,e,I,v,x),z=oe.__staleWhileFetching!==void 0&&i;return o&&(o.fetch=U?"stale":"refresh",z&&U&&(o.returnedStale=true)),z?oe.__staleWhileFetching:oe.__returned=oe}}async forceFetch(e,t={}){let i=await this.fetch(e,t);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(e,t={}){let i=r(this,Ee);if(!i)throw new Error("no memoMethod provided to constructor");let{context:n,forceRefresh:a,...s}=t,l=this.get(e,s);if(!a&&l!==void 0)return l;let p=i(e,l,{options:s,context:n});return this.set(e,p,s),p}get(e,t={}){let{allowStale:i=this.allowStale,updateAgeOnGet:n=this.updateAgeOnGet,noDeleteOnStaleGet:a=this.noDeleteOnStaleGet,status:s}=t,l=r(this,Y).get(e);if(l!==void 0){let p=r(this,L)[l],y=f(this,u,A).call(this,p);return s&&r(this,ue).call(this,s,l),r(this,q).call(this,l)?(s&&(s.get="stale"),y?(s&&i&&p.__staleWhileFetching!==void 0&&(s.returnedStale=true),i?p.__staleWhileFetching:void 0):(a||f(this,u,be).call(this,e,"expire"),s&&i&&(s.returnedStale=true),i?p:void 0)):(s&&(s.get="hit"),y?p.__staleWhileFetching:(f(this,u,Ae).call(this,l),n&&r(this,ge).call(this,l),p))}else s&&(s.get="miss");}delete(e){return f(this,u,be).call(this,e,"delete")}clear(){return f(this,u,Xe).call(this,"delete")}},X=new WeakMap,B=new WeakMap,Q=new WeakMap,Se=new WeakMap,Z=new WeakMap,Te=new WeakMap,Ee=new WeakMap,ee=new WeakMap,F=new WeakMap,te=new WeakMap,Y=new WeakMap,M=new WeakMap,L=new WeakMap,K=new WeakMap,j=new WeakMap,H=new WeakMap,V=new WeakMap,re=new WeakMap,G=new WeakMap,ie=new WeakMap,ne=new WeakMap,k=new WeakMap,$=new WeakMap,se=new WeakMap,me=new WeakMap,W=new WeakMap,Ce=new WeakMap,u=new WeakSet,ke=function(){let e=new Ue(r(this,X)),t=new Ue(r(this,X));S(this,k,e),S(this,ne,t);let i=this.ttlAutopurge?new Array(r(this,X)):void 0;S(this,$,i),S(this,Me,(s,l,p=r(this,ee).now())=>{if(t[s]=l!==0?p:0,e[s]=l,i?.[s]&&(clearTimeout(i[s]),i[s]=void 0),l!==0&&i){let y=setTimeout(()=>{r(this,q).call(this,s)&&f(this,u,be).call(this,r(this,M)[s],"expire");},l+1);y.unref&&y.unref(),i[s]=y;}}),S(this,ge,s=>{t[s]=e[s]!==0?r(this,ee).now():0;}),S(this,ue,(s,l)=>{if(e[l]){let p=e[l],y=t[l];if(!p||!y)return;s.ttl=p,s.start=y,s.now=n||a();let c=s.now-y;s.remainingTTL=p-c;}});let n=0,a=()=>{let s=r(this,ee).now();if(this.ttlResolution>0){n=s;let l=setTimeout(()=>n=0,this.ttlResolution);l.unref&&l.unref();}return s};this.getRemainingTTL=s=>{let l=r(this,Y).get(s);if(l===void 0)return 0;let p=e[l],y=t[l];if(!p||!y)return 1/0;let c=(n||a())-y;return p-c},S(this,q,s=>{let l=t[s],p=e[s];return !!p&&!!l&&(n||a())-l>p});},ge=new WeakMap,ue=new WeakMap,Me=new WeakMap,q=new WeakMap,lt=function(){let e=new Ue(r(this,X));S(this,te,0),S(this,ie,e),S(this,ye,t=>{S(this,te,r(this,te)-e[t]),e[t]=0;}),S(this,Ne,(t,i,n,a)=>{if(f(this,u,A).call(this,i))return 0;if(!de(n))if(a){if(typeof a!="function")throw new TypeError("sizeCalculation must be a function");if(n=a(i,t),!de(n))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return n}),S(this,Ie,(t,i,n)=>{if(e[t]=i,r(this,B)){let a=r(this,B)-e[t];for(;r(this,te)>a;)f(this,u,Ye).call(this,true);}S(this,te,r(this,te)+e[t]),n&&(n.entrySize=i,n.totalCalculatedSize=r(this,te));});},ye=new WeakMap,Ie=new WeakMap,Ne=new WeakMap,ce=function*({allowStale:e=this.allowStale}={}){if(r(this,F))for(let t=r(this,V);!(!f(this,u,$e).call(this,t)||((e||!r(this,q).call(this,t))&&(yield t),t===r(this,H)));)t=r(this,j)[t];},fe=function*({allowStale:e=this.allowStale}={}){if(r(this,F))for(let t=r(this,H);!(!f(this,u,$e).call(this,t)||((e||!r(this,q).call(this,t))&&(yield t),t===r(this,V)));)t=r(this,K)[t];},$e=function(e){return e!==void 0&&r(this,Y).get(r(this,M)[e])===e},Ye=function(e){var a;let t=r(this,H),i=r(this,M)[t],n=r(this,L)[t];return r(this,me)&&f(this,u,A).call(this,n)?n.__abortController.abort(new Error("evicted")):(r(this,se)||r(this,W))&&(r(this,se)&&((a=r(this,Q))==null||a.call(this,n,i,"evict")),r(this,W)&&r(this,G)?.push([n,i,"evict"])),r(this,ye).call(this,t),r(this,$)?.[t]&&(clearTimeout(r(this,$)[t]),r(this,$)[t]=void 0),e&&(r(this,M)[t]=void 0,r(this,L)[t]=void 0,r(this,re).push(t)),r(this,F)===1?(S(this,H,S(this,V,0)),r(this,re).length=0):S(this,H,r(this,K)[t]),r(this,Y).delete(i),Pe(this,F)._--,t},Fe=function(e,t,i,n){let a=t===void 0?void 0:r(this,L)[t];if(f(this,u,A).call(this,a))return a;let s=new Ve,{signal:l}=i;l?.addEventListener("abort",()=>s.abort(l.reason),{signal:s.signal});let p={signal:s.signal,options:i,context:n},y=(x,C=false)=>{let{aborted:o}=s.signal,d=i.ignoreFetchAbort&&x!==void 0,v=i.ignoreFetchAbort||!!(i.allowStaleOnFetchAbort&&x!==void 0);if(i.status&&(o&&!C?(i.status.fetchAborted=true,i.status.fetchError=s.signal.reason,d&&(i.status.fetchAbortIgnored=true)):i.status.fetchResolved=true),o&&!d&&!C)return E(s.signal.reason,v);let I=D,O=r(this,L)[t];return (O===D||d&&C&&O===void 0)&&(x===void 0?I.__staleWhileFetching!==void 0?r(this,L)[t]=I.__staleWhileFetching:f(this,u,be).call(this,e,"fetch"):(i.status&&(i.status.fetchUpdated=true),this.set(e,x,p.options))),x},c=x=>(i.status&&(i.status.fetchRejected=true,i.status.fetchError=x),E(x,false)),E=(x,C)=>{let{aborted:o}=s.signal,d=o&&i.allowStaleOnFetchAbort,v=d||i.allowStaleOnFetchRejection,I=v||i.noDeleteOnFetchRejection,O=D;if(r(this,L)[t]===D&&(!I||!C&&O.__staleWhileFetching===void 0?f(this,u,be).call(this,e,"fetch"):d||(r(this,L)[t]=O.__staleWhileFetching)),v)return i.status&&O.__staleWhileFetching!==void 0&&(i.status.returnedStale=true),O.__staleWhileFetching;if(O.__returned===O)throw x},N=(x,C)=>{var d;let o=(d=r(this,Te))==null?void 0:d.call(this,e,a,p);o&&o instanceof Promise&&o.then(v=>x(v===void 0?void 0:v),C),s.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(x(void 0),i.allowStaleOnFetchAbort&&(x=v=>y(v,true)));});};i.status&&(i.status.fetchDispatched=true);let D=new Promise(N).then(y,c),P=Object.assign(D,{__abortController:s,__staleWhileFetching:a,__returned:void 0});return t===void 0?(this.set(e,P,{...p.options,status:void 0}),t=r(this,Y).get(e)):r(this,L)[t]=P,P},A=function(e){if(!r(this,me))return false;let t=e;return !!t&&t instanceof Promise&&t.hasOwnProperty("__staleWhileFetching")&&t.__abortController instanceof Ve},qe=function(e,t){r(this,j)[t]=e,r(this,K)[e]=t;},Ae=function(e){e!==r(this,V)&&(e===r(this,H)?S(this,H,r(this,K)[e]):f(this,u,qe).call(this,r(this,j)[e],r(this,K)[e]),f(this,u,qe).call(this,r(this,V),e),S(this,V,e));},be=function(e,t){var n,a;let i=false;if(r(this,F)!==0){let s=r(this,Y).get(e);if(s!==void 0)if(r(this,$)?.[s]&&(clearTimeout(r(this,$)?.[s]),r(this,$)[s]=void 0),i=true,r(this,F)===1)f(this,u,Xe).call(this,t);else {r(this,ye).call(this,s);let l=r(this,L)[s];if(f(this,u,A).call(this,l)?l.__abortController.abort(new Error("deleted")):(r(this,se)||r(this,W))&&(r(this,se)&&((n=r(this,Q))==null||n.call(this,l,e,t)),r(this,W)&&r(this,G)?.push([l,e,t])),r(this,Y).delete(e),r(this,M)[s]=void 0,r(this,L)[s]=void 0,s===r(this,V))S(this,V,r(this,j)[s]);else if(s===r(this,H))S(this,H,r(this,K)[s]);else {let p=r(this,j)[s];r(this,K)[p]=r(this,K)[s];let y=r(this,K)[s];r(this,j)[y]=r(this,j)[s];}Pe(this,F)._--,r(this,re).push(s);}}if(r(this,W)&&r(this,G)?.length){let s=r(this,G),l;for(;l=s?.shift();)(a=r(this,Z))==null||a.call(this,...l);}return i},Xe=function(e){var t,i;for(let n of f(this,u,fe).call(this,{allowStale:true})){let a=r(this,L)[n];if(f(this,u,A).call(this,a))a.__abortController.abort(new Error("deleted"));else {let s=r(this,M)[n];r(this,se)&&((t=r(this,Q))==null||t.call(this,a,s,e)),r(this,W)&&r(this,G)?.push([a,s,e]);}}if(r(this,Y).clear(),r(this,L).fill(void 0),r(this,M).fill(void 0),r(this,k)&&r(this,ne)){r(this,k).fill(0),r(this,ne).fill(0);for(let n of r(this,$)??[])n!==void 0&&clearTimeout(n);r(this,$)?.fill(void 0);}if(r(this,ie)&&r(this,ie).fill(0),S(this,H,0),S(this,V,0),r(this,re).length=0,S(this,te,0),S(this,F,0),r(this,W)&&r(this,G)){let n=r(this,G),a;for(;a=n?.shift();)(i=r(this,Z))==null||i.call(this,...a);}},ve);var we=class{constructor(e){T(this,"cache");T(this,"map",new Map);this.cache=new ot({max:e.cacheSize}),this.map=new Map;}get[Symbol.iterator](){return this.map[Symbol.iterator]}get[Symbol.toStringTag](){return this.map[Symbol.toStringTag]}clear(){return this.cache.clear(),this.map.clear()}delete(e){let t=this.map.delete(e);return t&&this.cache.delete(e),t}get forEach(){return this.map.forEach}get(e){let t=this.cache.get(e);return t||this.map.get(e)}has(e){return this.map.has(e)}set(e,t){return this.map.set(e,t),this.cache.set(e,t),this}get size(){return this.map.size}entries(){return this.map.entries()}keys(){return this.map.keys()}values(){return this.map.values()}};var Oe=new we({cacheSize:10}),Je;(a=>{function h(s){let l=Oe.get(s);if(!l){_.error(`Label "${s}" not found`);return}return l}a.get=h;function e(s){if(Array.isArray(s)){s.forEach(l=>e(l));return}Oe.has(s.id)&&_.info(`Label "${s.id}" already exists, it will be overwritten`),Oe.set(s.id,s);}a.add=e;function t(){return Array.from(Oe.values())}a.values=t;function i(s){return Oe.has(s)}a.has=i;function n(){return Array.from(Oe.keys())}a.keys=n;})(Je||(Je={}));var ae=Je;var m=class m{constructor(){}static get allOpenedLabels(){return unifier.GameUnifier.getVariable(w.OPENED_LABELS_COUNTER_KEY)||{}}static set allOpenedLabels(e){unifier.GameUnifier.setVariable(w.OPENED_LABELS_COUNTER_KEY,e);}static getCurrentStepTimesCounterData(e=""){let t=m.currentLabelStepIndex;if(t===null)return _.error("currentLabelStepIndex is null"),null;let i=`${t}${e}`,n=m.currentLabelId,a=m._currentLabel;if(!n||t===null||!a)return _.error("currentLabelId or currentLabelStepIndex is null or currentLabel not found"),null;let s=a.getStepSha(t)||"error",l=unifier.GameUnifier.getVariable(w.CURRENT_STEP_TIMES_COUNTER_KEY)||{};return l[n]||(l[n]={}),(!l[n][i]||l[n][i].stepSha1!=s)&&(l[n][i]={stepSha1:s}),l[n][i]}static setCurrentStepTimesCounterData(e="",t){let i=m.currentLabelStepIndex,n=i+e,a=m.currentLabelId;if(!a||i===null){_.error("currentLabelId or currentLabelStepIndex is null");return}let s=unifier.GameUnifier.getVariable(w.CURRENT_STEP_TIMES_COUNTER_KEY)||{};s[a]||(s[a]={}),s[a][n]=t,unifier.GameUnifier.setVariable(w.CURRENT_STEP_TIMES_COUNTER_KEY,s);}static getCurrentStepTimesCounter(e=""){let t=m._stepCounter,i=m.getCurrentStepTimesCounterData(e);if(!i)return _.error("getCurrentStepTimesCounter obj is null"),0;let n=i.stepCounters||i.lastStepIndexs||[];return n.find(s=>s===t)||(n.push(t),delete i.lastStepIndexs,i.stepCounters=n,m.setCurrentStepTimesCounterData(e,i)),n.length}static getRandomNumber(e,t,i={}){let n=i.nestedId||"";if(i.onceOnly||false){let s=m.getCurrentStepTimesCounterData(n);if(!s)return;let l=s.usedRandomNumbers||{},p=Array.from({length:t-e+1},(E,N)=>N+e).filter(E=>!l[`${e}-${t}`]?.includes(E));if(p.length===0)return;let y=Math.floor(Math.random()*p.length),c=p[y];return l[`${e}-${t}`]||(l[`${e}-${t}`]=[]),l[`${e}-${t}`].push(c),s.usedRandomNumbers=l,m.setCurrentStepTimesCounterData(n,s),c}return Math.floor(Math.random()*(t-e+1))+e}static resetCurrentStepTimesCounter(e=""){let t=m.currentLabelStepIndex,i=t+e,n=m.currentLabelId;if(!n||t===null){_.error("currentLabelId or currentLabelStepIndex is null");return}let a=unifier.GameUnifier.getVariable(w.CURRENT_STEP_TIMES_COUNTER_KEY)||{};a[n]||(a[n]={}),a[n][i]={stepCounters:[],stepSha1:""},unifier.GameUnifier.setVariable(w.CURRENT_STEP_TIMES_COUNTER_KEY,a);}static get allChoicesMade(){return unifier.GameUnifier.getVariable(w.ALL_CHOICES_MADE_KEY)||[]}static set allChoicesMade(e){unifier.GameUnifier.setVariable(w.ALL_CHOICES_MADE_KEY,e);}static increaseStepCounter(){m._stepCounter++;}static get openedLabels(){return le(m._openedLabels)}static set openedLabels(e){m._openedLabels=le(e);}static get originalOpenedLabels(){return le(m._originalOpenedLabels)}static set originalOpenedLabels(e){m._originalOpenedLabels=le(e);}static get _currentLabel(){if(m.currentLabelId)return ae.get(m.currentLabelId)}static get currentLabelId(){if(m._openedLabels.length>0)return m._openedLabels[m._openedLabels.length-1].label}static get currentLabelStepIndex(){return m._openedLabels.length>0?m._openedLabels[m._openedLabels.length-1].currentStepIndex:null}static addLabelHistory(e,t){let i=m.allOpenedLabels,n=m.allOpenedLabels[e]?.biggestStep||0,a=m.allOpenedLabels[e]?.openCount||0;(!n||n<t)&&(i[e]={biggestStep:t,openCount:a},m.allOpenedLabels=i);}static addChoicesMade(e,t,i,n){let a=m.allChoicesMade,s=a.findIndex(l=>l.labelId===e&&l.stepIndex===t&&l.choiceIndex===n&&l.stepSha1===i);s<0?a.push({labelId:e,stepIndex:t,choiceIndex:n,stepSha1:i,madeTimes:1}):a[s].madeTimes++,m.allChoicesMade=a;}static pushNewLabel(e){if(!ae.get(e))throw new Error(`[Pixi\u2019VN] Label ${e} not found`);m._openedLabels.push({label:e,currentStepIndex:0});let i=m.allOpenedLabels,n=m.allOpenedLabels[e]?.biggestStep||0,a=m.allOpenedLabels[e]?.openCount||0;i[e]={biggestStep:n,openCount:a+1},m.allOpenedLabels=i;}static increaseCurrentStepIndex(){if(m._openedLabels.length>0){let e=m._openedLabels[m._openedLabels.length-1];m._openedLabels[m._openedLabels.length-1]={...e,currentStepIndex:e.currentStepIndex+1};}}static set onStepStart(e){m._onStepStart=e;}static get onStepStart(){return async(e,t)=>{let i=[];return m.onLoadingLabel&&e===0&&i.push(m.onLoadingLabel(e,t)),m._onStepStart&&i.push(m._onStepStart(e,t)),await Promise.all(i)}}};T(m,"choiceMadeTemp"),T(m,"lastHistoryStep",null),T(m,"_stepCounter",0),T(m,"_openedLabels",[]),T(m,"_originalOpenedLabels",[]),T(m,"_onStepStart"),T(m,"onLoadingLabel"),T(m,"onStepEnd");var b=m;var De=class{get currentStepTimesCounter(){return b.getCurrentStepTimesCounter()}set currentStepTimesCounter(e){b.resetCurrentStepTimesCounter();}getRandomNumber(e,t,i={}){return b.getRandomNumber(e,t,i)}get stepCounter(){return b._stepCounter}get openedLabels(){return b.openedLabels}get currentLabel(){return b._currentLabel}addStepHistory(e,t={}){let{choiceMade:i,ignoreSameStep:n}=t,a,s,l,p=unifier.GameUnifier.getVariable(w.LAST_STEP_GLUED)===this.stepCounter;unifier.GameUnifier.getVariable(w.LAST_DIALOGUE_ADDED_IN_STEP_MEMORY_KEY)===this.stepCounter&&(a=unifier.GameUnifier.getVariable(w.CURRENT_DIALOGUE_MEMORY_KEY)),unifier.GameUnifier.getVariable(w.LAST_MENU_OPTIONS_ADDED_IN_STEP_MEMORY_KEY)===this.stepCounter&&(s=unifier.GameUnifier.getVariable(w.CURRENT_MENU_OPTIONS_MEMORY_KEY)),unifier.GameUnifier.getVariable(w.LAST_INPUT_ADDED_IN_STEP_MEMORY_KEY)===this.stepCounter&&(l=unifier.GameUnifier.getVariable(w.CURRENT_INPUT_VALUE_MEMORY_KEY));let y=b.openedLabels,c={currentLabel:b.currentLabelId,dialogue:a,choices:s,stepSha1:e,index:this.stepCounter,labelStepIndex:b.currentLabelStepIndex,choiceIndexMade:i,inputValue:l,alreadyMadeChoices:this.alreadyCurrentStepMadeChoices,isGlued:p,openedLabels:y};b.originalOpenedLabels=y,unifier.GameUnifier.addHistoryItem(c,{ignoreSameStep:n}),b.lastHistoryStep=c,b.increaseStepCounter();}closeCurrentLabel(){if(!b.currentLabelId){_.warn("No label to close");return}if(!this.currentLabel){_.error("currentLabel not found");return}let e=b.openedLabels;e.pop(),b.openedLabels=e,unifier.GameUnifier.onLabelClosing(this.openedLabels.length);}closeAllLabels(){for(;b.openedLabels.length>0;)this.closeCurrentLabel(),unifier.GameUnifier.onLabelClosing(this.openedLabels.length);}isLabelAlreadyCompleted(e){let t;typeof e=="string"?t=e:t=e.id;let n=b.allOpenedLabels[t]?.biggestStep||0;if(n){let a=ae.get(t);if(a)return a.stepCount<=n}return false}get alreadyCurrentStepMadeChoicesObj(){let e=b.currentLabelStepIndex,t=this.currentLabel;if(e===null||!t)return;let i=t.getStepSha(e);return i||(_.warn("stepSha not found, setting to ERROR"),i="error"),b.allChoicesMade.filter(n=>n.labelId===t?.id&&n.stepIndex===e&&n.stepSha1===i)}get alreadyCurrentStepMadeChoices(){return this.alreadyCurrentStepMadeChoicesObj?.map(e=>e.choiceIndex)}get isCurrentStepAlreadyOpened(){let e=b.currentLabelId;if(e){let t=b.allOpenedLabels[e]?.openCount||0;if(b.currentLabelStepIndex&&t>=b.currentLabelStepIndex)return true}return false}getTimesLabelOpened(e){return b.allOpenedLabels[e]?.openCount||0}getTimesChoiceMade(e){return this.alreadyCurrentStepMadeChoicesObj?.find(t=>t.choiceIndex===e)?.madeTimes||0}addCurrentStepToHistory(){this.addStepHistory("dev",{ignoreSameStep:true});}getCanContinue(e){let t=e?.showWarn||false,i=this.choices;return i&&i.length>0?(t&&_.warn("The player must make a choice"),false):this.isRequiredInput?(t&&_.warn("The player must enter a value"),false):true}get canContinue(){return unifier.GameUnifier.runningStepsCount!==0?false:this.getCanContinue()}async onStepStart(e,t){let i=[];return e.onStepStart&&i.push(e.onStepStart(t,e)),b.onStepStart&&i.push(b.onStepStart(t,e)),await Promise.all(i)}async onStepEnd(e,t){let i=[];return e.onStepEnd&&i.push(e.onStepEnd(t,e)),b.onStepEnd&&i.push(b.onStepEnd(t,e)),await Promise.all(i)}async continue(e,t={}){let{runNow:i=false,steps:n=1}=t;if(!Number.isFinite(n)){_.warn(`[continue] The parameter steps must be a valid finite number, received: ${n}`);return}if(n<=0){_.warn(`[continue] The parameter steps must be greater than 0, received: ${n}`);return}if(!i&&!this.getCanContinue({showWarn:true}))return;if(!i&&unifier.GameUnifier.runningStepsCount!==0){unifier.GameUnifier.increaseContinueRequest(n);return}n>1&&unifier.GameUnifier.increaseContinueRequest(n-1),unifier.GameUnifier.runningStepsCount++;let a;try{unifier.GameUnifier.runningStepsCount===1&&await unifier.GameUnifier.onPreContinue(),b.increaseCurrentStepIndex(),a=await this.runCurrentStep(e,t);}catch(s){throw _.error("Error continuing",s),s}finally{unifier.GameUnifier.runningStepsCount--,a=await this.afterRunCurrentStep(e)||a;}return a}async afterRunCurrentStep(e){if(unifier.GameUnifier.runningStepsCount===0&&unifier.GameUnifier.continueRequestsCount!==0)return await unifier.GameUnifier.processNavigationRequests(e);if(this.openedLabels.length===0){if(unifier.GameUnifier.onEnd)return await unifier.GameUnifier.onEnd(e,{labelId:"end"});_.error("The end of the game is not managed, so the game is blocked. Read this documentation to know how to manage the end of the game: https://pixi-vn.web.app/start/other-narrative-features.html#how-manage-the-end-of-the-game");}}async runCurrentStep(e,t={}){let{choiceMade:i}=t;if(b.currentLabelId){let n=b.currentLabelStepIndex;if(n===null){_.error("currentLabelStepIndex is null");return}let a=b._currentLabel;if(!a){_.error("currentLabel not found");return}if(a.stepCount>n){try{await this.onStepStart(a,n);}catch(c){_.error("Error running onStepStart",c),this.onStepError&&await this.onStepError(c,e);return}let s=a.getStepById(n);if(!s){_.error("step not found");return}let l=a.getStepSha(n);l||(_.warn("stepSha not found, setting to ERROR"),l="error");let p,y;try{p=await s(e,{labelId:a.id});}catch(c){_.error("Error running step",c),y=c;}try{let c=this.choices;if(c?.length===1&&c[0].autoSelect){let E=c[0];p=await this.selectChoice(E,e);}}catch(c){_.error("Error auto-selecting choice",c),y===void 0&&(y=c);}try{let c=b.lastHistoryStep;i!==void 0&&c&&(l=c.stepSha1,l||(_.warn("stepSha not found, setting to ERROR"),l="error"),b.addChoicesMade(c.currentLabel||"error",typeof c.labelStepIndex=="number"?c.labelStepIndex:-1,c.stepSha1||"error",i),b.choiceMadeTemp=i);}catch(c){_.warn("Error adding choice made to history",c);}try{unifier.GameUnifier.runningStepsCount===1&&(b.addLabelHistory(a.id,n),this.addStepHistory(l,{...t,choiceMade:b.choiceMadeTemp}),b.choiceMadeTemp=void 0);}catch(c){_.warn("Error adding step to history",c);}try{this.currentLabel&&await this.onStepEnd(this.currentLabel,b.currentLabelStepIndex||0);}catch(c){_.warn("Error running onStepEnd",c);}return y&&this.onStepError&&await this.onStepError(y,e),p}else {if(this.openedLabels.length>1)return this.closeCurrentLabel(),await this.continue(e,t);if(this.openedLabels.length===1){b.openedLabels=[];return}}}else {if(this.openedLabels.length===0)return;_.error("currentLabelId not found");}}async call(e,t,i){let{choiceMade:n}=i||{},a;typeof e=="string"?a=e:a=e.id,unifier.GameUnifier.runningStepsCount++;let s;try{let l=ae.get(a);if(!l)throw new Error(`[Pixi\u2019VN] Label ${a} not found`);b.pushNewLabel(l.id),s=await this.runCurrentStep(t,{choiceMade:n});}catch(l){throw _.error("Error calling label",l),l}finally{unifier.GameUnifier.runningStepsCount--,s=await this.afterRunCurrentStep(t)||s;}return s}async jump(e,t,i){if(this.stepCounter===0)return await this.call(e,t,i);this.openedLabels.length>0&&this.closeCurrentLabel();let{choiceMade:n}=i||{},a;typeof e=="string"?a=e:a=e.id,unifier.GameUnifier.runningStepsCount++;let s;try{let l=ae.get(a);if(!l)throw new Error(`[Pixi\u2019VN] Label ${a} not found`);b.pushNewLabel(l.id),s=await this.runCurrentStep(t,{choiceMade:n});}catch(l){throw _.error("Error jumping to label",l),l}finally{unifier.GameUnifier.runningStepsCount--,s=await this.afterRunCurrentStep(t)||s;}return s}async selectChoice(e,t){this.choices=void 0;let i=e.type;switch(i){case "call":return await this.call(e.label,{...e.props,...t},{choiceMade:e.choiceIndex});case "jump":return await this.jump(e.label,{...e.props,...t},{choiceMade:e.choiceIndex});case "close":return await this.closeChoiceMenu(e,{...e.props,...t});default:throw _.error(`Type ${i} not found`),new Error(`[Pixi\u2019VN] Type ${i} not found`)}}async closeChoiceMenu(e,t){if(e.type!=="close")throw _.error("For closeChoiceMenu, the type must be close"),new Error("[Pixi\u2019VN] For closeChoiceMenu, the type must be close");let i;return typeof e.choiceIndex=="number"&&(i=e.choiceIndex),e.closeCurrentLabel&&this.closeCurrentLabel(),await this.continue(t,{choiceMade:i})}get onStepError(){let e=unifier.GameUnifier.onError;if(e)return async(t,i)=>{try{return await e("step",t,i)}catch(n){_.error("Error in onError handler",n);}}}set onStepError(e){unifier.GameUnifier.onError=(t,i,n)=>e(i,n);}get dialogue(){let e=unifier.GameUnifier.getVariable(w.CURRENT_DIALOGUE_MEMORY_KEY);if(e)return {...e,character:e.character?unifier.GameUnifier.getCharacter(e.character)||e.character:void 0}}set dialogue(e){if(e===void 0){unifier.GameUnifier.setVariable(w.CURRENT_DIALOGUE_MEMORY_KEY,void 0);return}if((typeof e=="string"||Array.isArray(e))&&(e={text:e}),this.dialogGlue){let t=unifier.GameUnifier.getVariable(w.CURRENT_DIALOGUE_MEMORY_KEY);if(t){let i=[];Array.isArray(t.text)?i=[...t.text]:i=[t.text],Array.isArray(e.text)?i=[...i,...e.text]:i=[...i,e.text],e.text=i,e.character=e.character||t.character;}unifier.GameUnifier.setVariable(w.LAST_STEP_GLUED,this.stepCounter),this.dialogGlue=false;}try{unifier.GameUnifier.setVariable(w.CURRENT_DIALOGUE_MEMORY_KEY,le({...e,character:typeof e.character=="string"?e.character:e.character?.id})),unifier.GameUnifier.setVariable(w.LAST_DIALOGUE_ADDED_IN_STEP_MEMORY_KEY,this.stepCounter);}catch(t){throw _.error("DialogueInterface cannot contain functions or classes"),t}}get choices(){let e=unifier.GameUnifier.getVariable(w.CURRENT_MENU_OPTIONS_MEMORY_KEY);if(e){let t=[],i=e.map((a,s)=>({...a,choiceIndex:s})),n=this.alreadyCurrentStepMadeChoices;if(i=i.filter((a,s)=>a.oneTime&&n&&n.includes(s)?false:a.onlyHaveNoChoice?(t.push(a),false):true),i.length>0)return i;if(t.length>0)return [t[0]]}}set choices(e){if(!e||e.length===0){unifier.GameUnifier.setVariable(w.CURRENT_MENU_OPTIONS_MEMORY_KEY,void 0);return}try{unifier.GameUnifier.setVariable(w.CURRENT_MENU_OPTIONS_MEMORY_KEY,le(e)),unifier.GameUnifier.setVariable(w.LAST_MENU_OPTIONS_ADDED_IN_STEP_MEMORY_KEY,this.stepCounter);}catch(t){throw _.error("ChoiceInterface cannot contain functions or classes"),t}}get dialogGlue(){return unifier.GameUnifier.getFlag(w.ADD_NEXT_DIALOG_TEXT_INTO_THE_CURRENT_DIALOG_FLAG_KEY)}set dialogGlue(e){unifier.GameUnifier.setFlag(w.ADD_NEXT_DIALOG_TEXT_INTO_THE_CURRENT_DIALOG_FLAG_KEY,e);}get inputValue(){return unifier.GameUnifier.getVariable(w.CURRENT_INPUT_VALUE_MEMORY_KEY)}set inputValue(e){this.removeInputRequest(),unifier.GameUnifier.setVariable(w.CURRENT_INPUT_VALUE_MEMORY_KEY,e),unifier.GameUnifier.setVariable(w.LAST_INPUT_ADDED_IN_STEP_MEMORY_KEY,this.stepCounter);}get isRequiredInput(){return unifier.GameUnifier.getVariable(w.CURRENT_INPUT_INFO_MEMORY_KEY)?.isRequired||false}get inputType(){return unifier.GameUnifier.getVariable(w.CURRENT_INPUT_INFO_MEMORY_KEY)?.type}requestInput(e,t){e.isRequired=true,unifier.GameUnifier.setVariable(w.CURRENT_INPUT_INFO_MEMORY_KEY,e),t!==void 0?unifier.GameUnifier.setVariable(w.CURRENT_INPUT_VALUE_MEMORY_KEY,t):unifier.GameUnifier.removeVariable(w.CURRENT_INPUT_VALUE_MEMORY_KEY);}removeInputRequest(){unifier.GameUnifier.removeVariable(w.CURRENT_INPUT_INFO_MEMORY_KEY),unifier.GameUnifier.removeVariable(w.CURRENT_INPUT_VALUE_MEMORY_KEY);}clear(){b.openedLabels=[],b._stepCounter=0;}export(){return {openedLabels:le(b.openedLabels),stepCounter:this.stepCounter}}async onLoadingLabel(e){let t=this.openedLabels.map(async i=>{let n=[],a=ae.get(i.label);return a&&(a.onLoadingLabel&&n.push(a.onLoadingLabel(e,a)),b.onLoadingLabel&&n.push(b.onLoadingLabel(e,a))),await Promise.all(n)});return await Promise.all(t)}async restore(e,t){this.clear();try{b.lastHistoryStep=t,e.hasOwnProperty("openedLabels")?(b.openedLabels=e.openedLabels,b.originalOpenedLabels=b.openedLabels):_.warn("Could not import openedLabels data, so will be ignored"),e.hasOwnProperty("stepCounter")?b._stepCounter=e.stepCounter:e.hasOwnProperty("lastStepIndex")?b._stepCounter=e.lastStepIndex:_.warn("Could not import stepCounter data, so will be ignored");try{await this.onLoadingLabel(b.currentLabelStepIndex||0);}catch(i){_.error("Error running onLoadingLabel",i);}}catch(i){_.error("Error importing data",i);}}};function wt(h,e,t,i){let n=typeof e=="string"?e:e.id;return {...i,label:n,props:t,text:h,type:i?.type||"call"}}var Qe="close";function Ot(h,e){return {...e,type:Qe,text:h}}var ct=Tt(dt());var Re=class{constructor(e,t){T(this,"id");T(this,"_onStepStart");T(this,"_onLoadingLabel");T(this,"_onStepEnd");this.id=e,this._onStepStart=t?.onStepStart,this._onLoadingLabel=t?.onLoadingLabel,this._onStepEnd=t?.onStepEnd;}get onStepStart(){return async(e,t)=>{if(this._onLoadingLabel&&e===0&&await this._onLoadingLabel(e,t),this._onStepStart)return await this._onStepStart(e,t)}}get onLoadingLabel(){return this._onLoadingLabel}get onStepEnd(){return this._onStepEnd}};var xe=class extends Re{constructor(t,i,n){super(t,n);T(this,"_steps");this._steps=i;}get stepCount(){return this.steps.length}getStepById(t){return this.steps[t]}get steps(){return typeof this._steps=="function"?this._steps():this._steps}getStepSha(t){if(t<0||t>=this.steps.length)return _.warn("stepSha not found, setting to ERROR"),"error";try{let i=this.steps[t];return (0,ct.default)(i.toString().toLocaleLowerCase()).toString()}catch(i){return _.warn("stepSha not found, setting to ERROR",i),"error"}}};function ft(h,e,t){let i=new xe(h,e,t);return ae.add(i),i}var Or=new De;
|
|
2
|
-
exports.Close=
|
|
1
|
+
'use strict';var core=require('@drincs/pixi-vn/core');var mt=Object.create;var We=Object.defineProperty;var St=Object.getOwnPropertyDescriptor;var gt=Object.getOwnPropertyNames;var yt=Object.getPrototypeOf,_t=Object.prototype.hasOwnProperty;var et=h=>{throw TypeError(h)};var Lt=(h,e,t)=>e in h?We(h,e,{enumerable:true,configurable:true,writable:true,value:t}):h[e]=t;var Be=(h=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(h,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):h)(function(h){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+h+'" is not supported')});var tt=(h,e)=>()=>(e||h((e={exports:{}}).exports,e),e.exports);var Tt=(h,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of gt(e))!_t.call(h,n)&&n!==t&&We(h,n,{get:()=>e[n],enumerable:!(i=St(e,n))||i.enumerable});return h};var Et=(h,e,t)=>(t=h!=null?mt(yt(h)):{},Tt(We(t,"default",{value:h,enumerable:true}),h));var E=(h,e,t)=>Lt(h,typeof e!="symbol"?e+"":e,t),je=(h,e,t)=>e.has(h)||et("Cannot "+t);var r=(h,e,t)=>(je(h,e,"read from private field"),t?t.call(h):e.get(h)),R=(h,e,t)=>e.has(h)?et("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(h):e.set(h,t),g=(h,e,t,i)=>(je(h,e,"write to private field"),e.set(h,t),t),f=(h,e,t)=>(je(h,e,"access private method"),t);var Ue=(h,e,t,i)=>({set _(n){g(h,e,n);},get _(){return r(h,e,i)}});var pt=tt((Ve,ut)=>{(function(h,e){typeof Ve=="object"?ut.exports=Ve=e():typeof define=="function"&&define.amd?define([],e):h.CryptoJS=e();})(Ve,function(){var h=h||(function(e,t){var i;if(typeof window<"u"&&window.crypto&&(i=window.crypto),typeof self<"u"&&self.crypto&&(i=self.crypto),typeof globalThis<"u"&&globalThis.crypto&&(i=globalThis.crypto),!i&&typeof window<"u"&&window.msCrypto&&(i=window.msCrypto),!i&&typeof global<"u"&&global.crypto&&(i=global.crypto),!i&&typeof Be=="function")try{i=Be("crypto");}catch{}var n=function(){if(i){if(typeof i.getRandomValues=="function")try{return i.getRandomValues(new Uint32Array(1))[0]}catch{}if(typeof i.randomBytes=="function")try{return i.randomBytes(4).readInt32LE()}catch{}}throw new Error("Native crypto module could not be used to get secure random number.")},s=Object.create||(function(){function o(){}return function(c){var w;return o.prototype=c,w=new o,o.prototype=null,w}})(),a={},l=a.lib={},u=l.Base=(function(){return {extend:function(o){var c=s(this);return o&&c.mixIn(o),(!c.hasOwnProperty("init")||this.init===c.init)&&(c.init=function(){c.$super.init.apply(this,arguments);}),c.init.prototype=c,c.$super=this,c},create:function(){var o=this.extend();return o.init.apply(o,arguments),o},init:function(){},mixIn:function(o){for(var c in o)o.hasOwnProperty(c)&&(this[c]=o[c]);o.hasOwnProperty("toString")&&(this.toString=o.toString);},clone:function(){return this.init.prototype.extend(this)}}})(),S=l.WordArray=u.extend({init:function(o,c){o=this.words=o||[],c!=t?this.sigBytes=c:this.sigBytes=o.length*4;},toString:function(o){return (o||L).stringify(this)},concat:function(o){var c=this.words,w=o.words,I=this.sigBytes,O=o.sigBytes;if(this.clamp(),I%4)for(var U=0;U<O;U++){var oe=w[U>>>2]>>>24-U%4*8&255;c[I+U>>>2]|=oe<<24-(I+U)%4*8;}else for(var V=0;V<O;V+=4)c[I+V>>>2]=w[V>>>2];return this.sigBytes+=O,this},clamp:function(){var o=this.words,c=this.sigBytes;o[c>>>2]&=4294967295<<32-c%4*8,o.length=e.ceil(c/4);},clone:function(){var o=u.clone.call(this);return o.words=this.words.slice(0),o},random:function(o){for(var c=[],w=0;w<o;w+=4)c.push(n());return new S.init(c,o)}}),d=a.enc={},L=d.Hex={stringify:function(o){for(var c=o.words,w=o.sigBytes,I=[],O=0;O<w;O++){var U=c[O>>>2]>>>24-O%4*8&255;I.push((U>>>4).toString(16)),I.push((U&15).toString(16));}return I.join("")},parse:function(o){for(var c=o.length,w=[],I=0;I<c;I+=2)w[I>>>3]|=parseInt(o.substr(I,2),16)<<24-I%8*4;return new S.init(w,c/2)}},N=d.Latin1={stringify:function(o){for(var c=o.words,w=o.sigBytes,I=[],O=0;O<w;O++){var U=c[O>>>2]>>>24-O%4*8&255;I.push(String.fromCharCode(U));}return I.join("")},parse:function(o){for(var c=o.length,w=[],I=0;I<c;I++)w[I>>>2]|=(o.charCodeAt(I)&255)<<24-I%4*8;return new S.init(w,c)}},D=d.Utf8={stringify:function(o){try{return decodeURIComponent(escape(N.stringify(o)))}catch{throw new Error("Malformed UTF-8 data")}},parse:function(o){return N.parse(unescape(encodeURIComponent(o)))}},P=l.BufferedBlockAlgorithm=u.extend({reset:function(){this._data=new S.init,this._nDataBytes=0;},_append:function(o){typeof o=="string"&&(o=D.parse(o)),this._data.concat(o),this._nDataBytes+=o.sigBytes;},_process:function(o){var c,w=this._data,I=w.words,O=w.sigBytes,U=this.blockSize,oe=U*4,V=O/oe;o?V=e.ceil(V):V=e.max((V|0)-this._minBufferSize,0);var J=V*U,_e=e.min(J*4,O);if(J){for(var Ke=0;Ke<J;Ke+=U)this._doProcessBlock(I,Ke);c=I.splice(0,J),w.sigBytes-=_e;}return new S.init(c,_e)},clone:function(){var o=u.clone.call(this);return o._data=this._data.clone(),o},_minBufferSize:0});l.Hasher=P.extend({cfg:u.extend(),init:function(o){this.cfg=this.cfg.extend(o),this.reset();},reset:function(){P.reset.call(this),this._doReset();},update:function(o){return this._append(o),this._process(),this},finalize:function(o){o&&this._append(o);var c=this._doFinalize();return c},blockSize:512/32,_createHelper:function(o){return function(c,w){return new o.init(w).finalize(c)}},_createHmacHelper:function(o){return function(c,w){return new C.HMAC.init(o,w).finalize(c)}}});var C=a.algo={};return a})(Math);return h});});var ct=tt((He,dt)=>{(function(h,e){typeof He=="object"?dt.exports=He=e(pt()):typeof define=="function"&&define.amd?define(["./core"],e):e(h.CryptoJS);})(He,function(h){return (function(){var e=h,t=e.lib,i=t.WordArray,n=t.Hasher,s=e.algo,a=[],l=s.SHA1=n.extend({_doReset:function(){this._hash=new i.init([1732584193,4023233417,2562383102,271733878,3285377520]);},_doProcessBlock:function(u,S){for(var d=this._hash.words,L=d[0],N=d[1],D=d[2],P=d[3],x=d[4],C=0;C<80;C++){if(C<16)a[C]=u[S+C]|0;else {var o=a[C-3]^a[C-8]^a[C-14]^a[C-16];a[C]=o<<1|o>>>31;}var c=(L<<5|L>>>27)+x+a[C];C<20?c+=(N&D|~N&P)+1518500249:C<40?c+=(N^D^P)+1859775393:C<60?c+=(N&D|N&P|D&P)-1894007588:c+=(N^D^P)-899497514,x=P,P=D,D=N<<30|N>>>2,N=L,L=c;}d[0]=d[0]+L|0,d[1]=d[1]+N|0,d[2]=d[2]+D|0,d[3]=d[3]+P|0,d[4]=d[4]+x|0;},_doFinalize:function(){var u=this._data,S=u.words,d=this._nDataBytes*8,L=u.sigBytes*8;return S[L>>>5]|=128<<24-L%32,S[(L+64>>>9<<4)+14]=Math.floor(d/4294967296),S[(L+64>>>9<<4)+15]=d,u.sigBytes=S.length*4,this._process(),this._hash},clone:function(){var u=n.clone.call(this);return u._hash=this._hash.clone(),u}});e.SHA1=n._createHelper(l),e.HmacSHA1=n._createHmacHelper(l);})(),h.SHA1});});var v={CURRENT_DIALOGUE_MEMORY_KEY:"___current_dialogue_memory___",LAST_DIALOGUE_ADDED_IN_STEP_MEMORY_KEY:"___last_dialogue_added_in_step_memory___",CURRENT_MENU_OPTIONS_MEMORY_KEY:"___current_menu_options_memory___",LAST_MENU_OPTIONS_ADDED_IN_STEP_MEMORY_KEY:"___last_menu_options_added_in_step_memory___",CURRENT_INPUT_VALUE_MEMORY_KEY:"_input_value_",LAST_INPUT_ADDED_IN_STEP_MEMORY_KEY:"___last_input_added_in_step_memory___",CURRENT_INPUT_INFO_MEMORY_KEY:"___current_input_info_memory___",CHARACTER_CATEGORY_KEY:"___character___",ADD_NEXT_DIALOG_TEXT_INTO_THE_CURRENT_DIALOG_FLAG_KEY:"___glue___",OPENED_LABELS_COUNTER_KEY:"___opened_labels_counter___",ALL_CHOICES_MADE_KEY:"___all_choices_made___",CURRENT_STEP_TIMES_COUNTER_KEY:"___current_step_times_counter___",LAST_STEP_GLUED:"___last_step_glued___"};var _;(n=>(n.log=(s,...a)=>console.log(`[Pixi\u2019VN] ${s}`,...a),n.warn=(s,...a)=>console.warn(`[Pixi\u2019VN] ${s}`,...a),n.error=(s,...a)=>console.error(`[Pixi\u2019VN] ${s}`,...a),n.info=(s,...a)=>console.info(`[Pixi\u2019VN] ${s}`,...a)))(_||(_={}));function le(h){try{if(typeof h>"u")return h;let e=JSON.stringify(h);return JSON.parse(e)}catch(e){throw _.error("Error creating exportable element",h,e),new core.PixiError("not_json_serializable","Error creating exportable element")}}var It=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,st=new Set,ke=typeof process=="object"&&process?process:{},at=(h,e,t,i)=>{typeof ke.emitWarning=="function"?ke.emitWarning(h,e,t,i):console.error(`[${t}] ${e}: ${h}`);},Ge=globalThis.AbortController,rt=globalThis.AbortSignal;if(typeof Ge>"u"){rt=class{constructor(){E(this,"onabort");E(this,"_onabort",[]);E(this,"reason");E(this,"aborted",false);}addEventListener(t,i){this._onabort.push(i);}},Ge=class{constructor(){E(this,"signal",new rt);e();}abort(t){if(!this.signal.aborted){this.signal.reason=t,this.signal.aborted=true;for(let i of this.signal._onabort)i(t);this.signal.onabort?.(t);}}};let h=ke.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",e=()=>{h&&(h=false,at("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",e));};}var wt=h=>!st.has(h);var de=h=>h&&h===Math.floor(h)&&h>0&&isFinite(h),ot=h=>de(h)?h<=Math.pow(2,8)?Uint8Array:h<=Math.pow(2,16)?Uint16Array:h<=Math.pow(2,32)?Uint32Array:h<=Number.MAX_SAFE_INTEGER?Ye:null:null,Ye=class extends Array{constructor(h){super(h),this.fill(0);}},he,Le,vt=(he=class{constructor(e,t){E(this,"heap");E(this,"length");if(!r(he,Le))throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new t(e),this.length=0;}static create(e){let t=ot(e);if(!t)return [];g(he,Le,true);let i=new he(e,t);return g(he,Le,false),i}push(e){this.heap[this.length++]=e;}pop(){return this.heap[--this.length]}},Le=new WeakMap,R(he,Le,false),he),it,nt,X,B,Q,Se,Z,Te,Ee,ee,F,te,Y,M,T,K,j,H,z,re,G,ie,ne,k,$,se,me,W,Ce,p,$e,ge,ue,Ne,q,ht,ye,Ie,De,ce,fe,qe,Fe,ze,A,Xe,Me,be,Je,we,lt=(we=class{constructor(e){R(this,p);R(this,X);R(this,B);R(this,Q);R(this,Se);R(this,Z);R(this,Te);R(this,Ee);R(this,ee);E(this,"ttl");E(this,"ttlResolution");E(this,"ttlAutopurge");E(this,"updateAgeOnGet");E(this,"updateAgeOnHas");E(this,"allowStale");E(this,"noDisposeOnSet");E(this,"noUpdateTTL");E(this,"maxEntrySize");E(this,"sizeCalculation");E(this,"noDeleteOnFetchRejection");E(this,"noDeleteOnStaleGet");E(this,"allowStaleOnFetchAbort");E(this,"allowStaleOnFetchRejection");E(this,"ignoreFetchAbort");R(this,F);R(this,te);R(this,Y);R(this,M);R(this,T);R(this,K);R(this,j);R(this,H);R(this,z);R(this,re);R(this,G);R(this,ie);R(this,ne);R(this,k);R(this,$);R(this,se);R(this,me);R(this,W);R(this,Ce);R(this,ge,()=>{});R(this,ue,()=>{});R(this,Ne,()=>{});R(this,q,()=>false);R(this,ye,e=>{});R(this,Ie,(e,t,i)=>{});R(this,De,(e,t,i,n)=>{if(i||n)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0});E(this,it,"LRUCache");let{max:t=0,ttl:i,ttlResolution:n=1,ttlAutopurge:s,updateAgeOnGet:a,updateAgeOnHas:l,allowStale:u,dispose:S,onInsert:d,disposeAfter:L,noDisposeOnSet:N,noUpdateTTL:D,maxSize:P=0,maxEntrySize:x=0,sizeCalculation:C,fetchMethod:o,memoMethod:c,noDeleteOnFetchRejection:w,noDeleteOnStaleGet:I,allowStaleOnFetchRejection:O,allowStaleOnFetchAbort:U,ignoreFetchAbort:oe,perf:V}=e;if(V!==void 0&&typeof V?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(g(this,ee,V??It),t!==0&&!de(t))throw new TypeError("max option must be a nonnegative integer");let J=t?ot(t):Array;if(!J)throw new Error("invalid max value: "+t);if(g(this,X,t),g(this,B,P),this.maxEntrySize=x||r(this,B),this.sizeCalculation=C,this.sizeCalculation){if(!r(this,B)&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(c!==void 0&&typeof c!="function")throw new TypeError("memoMethod must be a function if defined");if(g(this,Ee,c),o!==void 0&&typeof o!="function")throw new TypeError("fetchMethod must be a function if specified");if(g(this,Te,o),g(this,me,!!o),g(this,Y,new Map),g(this,M,new Array(t).fill(void 0)),g(this,T,new Array(t).fill(void 0)),g(this,K,new J(t)),g(this,j,new J(t)),g(this,H,0),g(this,z,0),g(this,re,vt.create(t)),g(this,F,0),g(this,te,0),typeof S=="function"&&g(this,Q,S),typeof d=="function"&&g(this,Se,d),typeof L=="function"?(g(this,Z,L),g(this,G,[])):(g(this,Z,void 0),g(this,G,void 0)),g(this,se,!!r(this,Q)),g(this,Ce,!!r(this,Se)),g(this,W,!!r(this,Z)),this.noDisposeOnSet=!!N,this.noUpdateTTL=!!D,this.noDeleteOnFetchRejection=!!w,this.allowStaleOnFetchRejection=!!O,this.allowStaleOnFetchAbort=!!U,this.ignoreFetchAbort=!!oe,this.maxEntrySize!==0){if(r(this,B)!==0&&!de(r(this,B)))throw new TypeError("maxSize must be a positive integer if specified");if(!de(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");f(this,p,ht).call(this);}if(this.allowStale=!!u,this.noDeleteOnStaleGet=!!I,this.updateAgeOnGet=!!a,this.updateAgeOnHas=!!l,this.ttlResolution=de(n)||n===0?n:1,this.ttlAutopurge=!!s,this.ttl=i||0,this.ttl){if(!de(this.ttl))throw new TypeError("ttl must be a positive integer if specified");f(this,p,$e).call(this);}if(r(this,X)===0&&this.ttl===0&&r(this,B)===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!r(this,X)&&!r(this,B)){let _e="LRU_CACHE_UNBOUNDED";wt(_e)&&(st.add(_e),at("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",_e,we));}}get perf(){return r(this,ee)}static unsafeExposeInternals(e){return {starts:r(e,ne),ttls:r(e,k),autopurgeTimers:r(e,$),sizes:r(e,ie),keyMap:r(e,Y),keyList:r(e,M),valList:r(e,T),next:r(e,K),prev:r(e,j),get head(){return r(e,H)},get tail(){return r(e,z)},free:r(e,re),isBackgroundFetch:t=>{var i;return f(i=e,p,A).call(i,t)},backgroundFetch:(t,i,n,s)=>{var a;return f(a=e,p,ze).call(a,t,i,n,s)},moveToTail:t=>{var i;return f(i=e,p,Me).call(i,t)},indexes:t=>{var i;return f(i=e,p,ce).call(i,t)},rindexes:t=>{var i;return f(i=e,p,fe).call(i,t)},isStale:t=>{var i;return r(i=e,q).call(i,t)}}}get max(){return r(this,X)}get maxSize(){return r(this,B)}get calculatedSize(){return r(this,te)}get size(){return r(this,F)}get fetchMethod(){return r(this,Te)}get memoMethod(){return r(this,Ee)}get dispose(){return r(this,Q)}get onInsert(){return r(this,Se)}get disposeAfter(){return r(this,Z)}getRemainingTTL(e){return r(this,Y).has(e)?1/0:0}*entries(){for(let e of f(this,p,ce).call(this))r(this,T)[e]!==void 0&&r(this,M)[e]!==void 0&&!f(this,p,A).call(this,r(this,T)[e])&&(yield [r(this,M)[e],r(this,T)[e]]);}*rentries(){for(let e of f(this,p,fe).call(this))r(this,T)[e]!==void 0&&r(this,M)[e]!==void 0&&!f(this,p,A).call(this,r(this,T)[e])&&(yield [r(this,M)[e],r(this,T)[e]]);}*keys(){for(let e of f(this,p,ce).call(this)){let t=r(this,M)[e];t!==void 0&&!f(this,p,A).call(this,r(this,T)[e])&&(yield t);}}*rkeys(){for(let e of f(this,p,fe).call(this)){let t=r(this,M)[e];t!==void 0&&!f(this,p,A).call(this,r(this,T)[e])&&(yield t);}}*values(){for(let e of f(this,p,ce).call(this))r(this,T)[e]!==void 0&&!f(this,p,A).call(this,r(this,T)[e])&&(yield r(this,T)[e]);}*rvalues(){for(let e of f(this,p,fe).call(this))r(this,T)[e]!==void 0&&!f(this,p,A).call(this,r(this,T)[e])&&(yield r(this,T)[e]);}[(nt=Symbol.iterator,it=Symbol.toStringTag,nt)](){return this.entries()}find(e,t={}){for(let i of f(this,p,ce).call(this)){let n=r(this,T)[i],s=f(this,p,A).call(this,n)?n.__staleWhileFetching:n;if(s!==void 0&&e(s,r(this,M)[i],this))return this.get(r(this,M)[i],t)}}forEach(e,t=this){for(let i of f(this,p,ce).call(this)){let n=r(this,T)[i],s=f(this,p,A).call(this,n)?n.__staleWhileFetching:n;s!==void 0&&e.call(t,s,r(this,M)[i],this);}}rforEach(e,t=this){for(let i of f(this,p,fe).call(this)){let n=r(this,T)[i],s=f(this,p,A).call(this,n)?n.__staleWhileFetching:n;s!==void 0&&e.call(t,s,r(this,M)[i],this);}}purgeStale(){let e=false;for(let t of f(this,p,fe).call(this,{allowStale:true}))r(this,q).call(this,t)&&(f(this,p,be).call(this,r(this,M)[t],"expire"),e=true);return e}info(e){let t=r(this,Y).get(e);if(t===void 0)return;let i=r(this,T)[t],n=f(this,p,A).call(this,i)?i.__staleWhileFetching:i;if(n===void 0)return;let s={value:n};if(r(this,k)&&r(this,ne)){let a=r(this,k)[t],l=r(this,ne)[t];if(a&&l){let u=a-(r(this,ee).now()-l);s.ttl=u,s.start=Date.now();}}return r(this,ie)&&(s.size=r(this,ie)[t]),s}dump(){let e=[];for(let t of f(this,p,ce).call(this,{allowStale:true})){let i=r(this,M)[t],n=r(this,T)[t],s=f(this,p,A).call(this,n)?n.__staleWhileFetching:n;if(s===void 0||i===void 0)continue;let a={value:s};if(r(this,k)&&r(this,ne)){a.ttl=r(this,k)[t];let l=r(this,ee).now()-r(this,ne)[t];a.start=Math.floor(Date.now()-l);}r(this,ie)&&(a.size=r(this,ie)[t]),e.unshift([i,a]);}return e}load(e){this.clear();for(let[t,i]of e){if(i.start){let n=Date.now()-i.start;i.start=r(this,ee).now()-n;}this.set(t,i.value,i);}}set(e,t,i={}){var N,D,P,x;if(t===void 0)return this.delete(e),this;let{ttl:n=this.ttl,start:s,noDisposeOnSet:a=this.noDisposeOnSet,sizeCalculation:l=this.sizeCalculation,status:u}=i,{noUpdateTTL:S=this.noUpdateTTL}=i,d=r(this,De).call(this,e,t,i.size||0,l);if(this.maxEntrySize&&d>this.maxEntrySize)return u&&(u.set="miss",u.maxEntrySizeExceeded=true),f(this,p,be).call(this,e,"set"),this;let L=r(this,F)===0?void 0:r(this,Y).get(e);if(L===void 0)L=r(this,F)===0?r(this,z):r(this,re).length!==0?r(this,re).pop():r(this,F)===r(this,X)?f(this,p,Fe).call(this,false):r(this,F),r(this,M)[L]=e,r(this,T)[L]=t,r(this,Y).set(e,L),r(this,K)[r(this,z)]=L,r(this,j)[L]=r(this,z),g(this,z,L),Ue(this,F)._++,r(this,Ie).call(this,L,d,u),u&&(u.set="add"),S=false,r(this,Ce)&&((N=r(this,Se))==null||N.call(this,t,e,"add"));else {f(this,p,Me).call(this,L);let C=r(this,T)[L];if(t!==C){if(r(this,me)&&f(this,p,A).call(this,C)){C.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:o}=C;o!==void 0&&!a&&(r(this,se)&&((D=r(this,Q))==null||D.call(this,o,e,"set")),r(this,W)&&r(this,G)?.push([o,e,"set"]));}else a||(r(this,se)&&((P=r(this,Q))==null||P.call(this,C,e,"set")),r(this,W)&&r(this,G)?.push([C,e,"set"]));if(r(this,ye).call(this,L),r(this,Ie).call(this,L,d,u),r(this,T)[L]=t,u){u.set="replace";let o=C&&f(this,p,A).call(this,C)?C.__staleWhileFetching:C;o!==void 0&&(u.oldValue=o);}}else u&&(u.set="update");r(this,Ce)&&this.onInsert?.(t,e,t===C?"update":"replace");}if(n!==0&&!r(this,k)&&f(this,p,$e).call(this),r(this,k)&&(S||r(this,Ne).call(this,L,n,s),u&&r(this,ue).call(this,u,L)),!a&&r(this,W)&&r(this,G)){let C=r(this,G),o;for(;o=C?.shift();)(x=r(this,Z))==null||x.call(this,...o);}return this}pop(){var e;try{for(;r(this,F);){let t=r(this,T)[r(this,H)];if(f(this,p,Fe).call(this,!0),f(this,p,A).call(this,t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(r(this,W)&&r(this,G)){let t=r(this,G),i;for(;i=t?.shift();)(e=r(this,Z))==null||e.call(this,...i);}}}has(e,t={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:n}=t,s=r(this,Y).get(e);if(s!==void 0){let a=r(this,T)[s];if(f(this,p,A).call(this,a)&&a.__staleWhileFetching===void 0)return false;if(r(this,q).call(this,s))n&&(n.has="stale",r(this,ue).call(this,n,s));else return i&&r(this,ge).call(this,s),n&&(n.has="hit",r(this,ue).call(this,n,s)),true}else n&&(n.has="miss");return false}peek(e,t={}){let{allowStale:i=this.allowStale}=t,n=r(this,Y).get(e);if(n===void 0||!i&&r(this,q).call(this,n))return;let s=r(this,T)[n];return f(this,p,A).call(this,s)?s.__staleWhileFetching:s}async fetch(e,t={}){let{allowStale:i=this.allowStale,updateAgeOnGet:n=this.updateAgeOnGet,noDeleteOnStaleGet:s=this.noDeleteOnStaleGet,ttl:a=this.ttl,noDisposeOnSet:l=this.noDisposeOnSet,size:u=0,sizeCalculation:S=this.sizeCalculation,noUpdateTTL:d=this.noUpdateTTL,noDeleteOnFetchRejection:L=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:N=this.allowStaleOnFetchRejection,ignoreFetchAbort:D=this.ignoreFetchAbort,allowStaleOnFetchAbort:P=this.allowStaleOnFetchAbort,context:x,forceRefresh:C=false,status:o,signal:c}=t;if(!r(this,me))return o&&(o.fetch="get"),this.get(e,{allowStale:i,updateAgeOnGet:n,noDeleteOnStaleGet:s,status:o});let w={allowStale:i,updateAgeOnGet:n,noDeleteOnStaleGet:s,ttl:a,noDisposeOnSet:l,size:u,sizeCalculation:S,noUpdateTTL:d,noDeleteOnFetchRejection:L,allowStaleOnFetchRejection:N,allowStaleOnFetchAbort:P,ignoreFetchAbort:D,status:o,signal:c},I=r(this,Y).get(e);if(I===void 0){o&&(o.fetch="miss");let O=f(this,p,ze).call(this,e,I,w,x);return O.__returned=O}else {let O=r(this,T)[I];if(f(this,p,A).call(this,O)){let J=i&&O.__staleWhileFetching!==void 0;return o&&(o.fetch="inflight",J&&(o.returnedStale=true)),J?O.__staleWhileFetching:O.__returned=O}let U=r(this,q).call(this,I);if(!C&&!U)return o&&(o.fetch="hit"),f(this,p,Me).call(this,I),n&&r(this,ge).call(this,I),o&&r(this,ue).call(this,o,I),O;let oe=f(this,p,ze).call(this,e,I,w,x),V=oe.__staleWhileFetching!==void 0&&i;return o&&(o.fetch=U?"stale":"refresh",V&&U&&(o.returnedStale=true)),V?oe.__staleWhileFetching:oe.__returned=oe}}async forceFetch(e,t={}){let i=await this.fetch(e,t);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(e,t={}){let i=r(this,Ee);if(!i)throw new Error("no memoMethod provided to constructor");let{context:n,forceRefresh:s,...a}=t,l=this.get(e,a);if(!s&&l!==void 0)return l;let u=i(e,l,{options:a,context:n});return this.set(e,u,a),u}get(e,t={}){let{allowStale:i=this.allowStale,updateAgeOnGet:n=this.updateAgeOnGet,noDeleteOnStaleGet:s=this.noDeleteOnStaleGet,status:a}=t,l=r(this,Y).get(e);if(l!==void 0){let u=r(this,T)[l],S=f(this,p,A).call(this,u);return a&&r(this,ue).call(this,a,l),r(this,q).call(this,l)?(a&&(a.get="stale"),S?(a&&i&&u.__staleWhileFetching!==void 0&&(a.returnedStale=true),i?u.__staleWhileFetching:void 0):(s||f(this,p,be).call(this,e,"expire"),a&&i&&(a.returnedStale=true),i?u:void 0)):(a&&(a.get="hit"),S?u.__staleWhileFetching:(f(this,p,Me).call(this,l),n&&r(this,ge).call(this,l),u))}else a&&(a.get="miss");}delete(e){return f(this,p,be).call(this,e,"delete")}clear(){return f(this,p,Je).call(this,"delete")}},X=new WeakMap,B=new WeakMap,Q=new WeakMap,Se=new WeakMap,Z=new WeakMap,Te=new WeakMap,Ee=new WeakMap,ee=new WeakMap,F=new WeakMap,te=new WeakMap,Y=new WeakMap,M=new WeakMap,T=new WeakMap,K=new WeakMap,j=new WeakMap,H=new WeakMap,z=new WeakMap,re=new WeakMap,G=new WeakMap,ie=new WeakMap,ne=new WeakMap,k=new WeakMap,$=new WeakMap,se=new WeakMap,me=new WeakMap,W=new WeakMap,Ce=new WeakMap,p=new WeakSet,$e=function(){let e=new Ye(r(this,X)),t=new Ye(r(this,X));g(this,k,e),g(this,ne,t);let i=this.ttlAutopurge?new Array(r(this,X)):void 0;g(this,$,i),g(this,Ne,(l,u,S=r(this,ee).now())=>{t[l]=u!==0?S:0,e[l]=u,n(l,u);}),g(this,ge,l=>{t[l]=e[l]!==0?r(this,ee).now():0,n(l,e[l]);});let n=this.ttlAutopurge?(l,u)=>{if(i?.[l]&&(clearTimeout(i[l]),i[l]=void 0),u&&u!==0&&i){let S=setTimeout(()=>{r(this,q).call(this,l)&&f(this,p,be).call(this,r(this,M)[l],"expire");},u+1);S.unref&&S.unref(),i[l]=S;}}:()=>{};g(this,ue,(l,u)=>{if(e[u]){let S=e[u],d=t[u];if(!S||!d)return;l.ttl=S,l.start=d,l.now=s||a();let L=l.now-d;l.remainingTTL=S-L;}});let s=0,a=()=>{let l=r(this,ee).now();if(this.ttlResolution>0){s=l;let u=setTimeout(()=>s=0,this.ttlResolution);u.unref&&u.unref();}return l};this.getRemainingTTL=l=>{let u=r(this,Y).get(l);if(u===void 0)return 0;let S=e[u],d=t[u];if(!S||!d)return 1/0;let L=(s||a())-d;return S-L},g(this,q,l=>{let u=t[l],S=e[l];return !!S&&!!u&&(s||a())-u>S});},ge=new WeakMap,ue=new WeakMap,Ne=new WeakMap,q=new WeakMap,ht=function(){let e=new Ye(r(this,X));g(this,te,0),g(this,ie,e),g(this,ye,t=>{g(this,te,r(this,te)-e[t]),e[t]=0;}),g(this,De,(t,i,n,s)=>{if(f(this,p,A).call(this,i))return 0;if(!de(n))if(s){if(typeof s!="function")throw new TypeError("sizeCalculation must be a function");if(n=s(i,t),!de(n))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return n}),g(this,Ie,(t,i,n)=>{if(e[t]=i,r(this,B)){let s=r(this,B)-e[t];for(;r(this,te)>s;)f(this,p,Fe).call(this,true);}g(this,te,r(this,te)+e[t]),n&&(n.entrySize=i,n.totalCalculatedSize=r(this,te));});},ye=new WeakMap,Ie=new WeakMap,De=new WeakMap,ce=function*({allowStale:e=this.allowStale}={}){if(r(this,F))for(let t=r(this,z);!(!f(this,p,qe).call(this,t)||((e||!r(this,q).call(this,t))&&(yield t),t===r(this,H)));)t=r(this,j)[t];},fe=function*({allowStale:e=this.allowStale}={}){if(r(this,F))for(let t=r(this,H);!(!f(this,p,qe).call(this,t)||((e||!r(this,q).call(this,t))&&(yield t),t===r(this,z)));)t=r(this,K)[t];},qe=function(e){return e!==void 0&&r(this,Y).get(r(this,M)[e])===e},Fe=function(e){var s;let t=r(this,H),i=r(this,M)[t],n=r(this,T)[t];return r(this,me)&&f(this,p,A).call(this,n)?n.__abortController.abort(new Error("evicted")):(r(this,se)||r(this,W))&&(r(this,se)&&((s=r(this,Q))==null||s.call(this,n,i,"evict")),r(this,W)&&r(this,G)?.push([n,i,"evict"])),r(this,ye).call(this,t),r(this,$)?.[t]&&(clearTimeout(r(this,$)[t]),r(this,$)[t]=void 0),e&&(r(this,M)[t]=void 0,r(this,T)[t]=void 0,r(this,re).push(t)),r(this,F)===1?(g(this,H,g(this,z,0)),r(this,re).length=0):g(this,H,r(this,K)[t]),r(this,Y).delete(i),Ue(this,F)._--,t},ze=function(e,t,i,n){let s=t===void 0?void 0:r(this,T)[t];if(f(this,p,A).call(this,s))return s;let a=new Ge,{signal:l}=i;l?.addEventListener("abort",()=>a.abort(l.reason),{signal:a.signal});let u={signal:a.signal,options:i,context:n},S=(x,C=false)=>{let{aborted:o}=a.signal,c=i.ignoreFetchAbort&&x!==void 0,w=i.ignoreFetchAbort||!!(i.allowStaleOnFetchAbort&&x!==void 0);if(i.status&&(o&&!C?(i.status.fetchAborted=true,i.status.fetchError=a.signal.reason,c&&(i.status.fetchAbortIgnored=true)):i.status.fetchResolved=true),o&&!c&&!C)return L(a.signal.reason,w);let I=D,O=r(this,T)[t];return (O===D||c&&C&&O===void 0)&&(x===void 0?I.__staleWhileFetching!==void 0?r(this,T)[t]=I.__staleWhileFetching:f(this,p,be).call(this,e,"fetch"):(i.status&&(i.status.fetchUpdated=true),this.set(e,x,u.options))),x},d=x=>(i.status&&(i.status.fetchRejected=true,i.status.fetchError=x),L(x,false)),L=(x,C)=>{let{aborted:o}=a.signal,c=o&&i.allowStaleOnFetchAbort,w=c||i.allowStaleOnFetchRejection,I=w||i.noDeleteOnFetchRejection,O=D;if(r(this,T)[t]===D&&(!I||!C&&O.__staleWhileFetching===void 0?f(this,p,be).call(this,e,"fetch"):c||(r(this,T)[t]=O.__staleWhileFetching)),w)return i.status&&O.__staleWhileFetching!==void 0&&(i.status.returnedStale=true),O.__staleWhileFetching;if(O.__returned===O)throw x},N=(x,C)=>{var c;let o=(c=r(this,Te))==null?void 0:c.call(this,e,s,u);o&&o instanceof Promise&&o.then(w=>x(w===void 0?void 0:w),C),a.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(x(void 0),i.allowStaleOnFetchAbort&&(x=w=>S(w,true)));});};i.status&&(i.status.fetchDispatched=true);let D=new Promise(N).then(S,d),P=Object.assign(D,{__abortController:a,__staleWhileFetching:s,__returned:void 0});return t===void 0?(this.set(e,P,{...u.options,status:void 0}),t=r(this,Y).get(e)):r(this,T)[t]=P,P},A=function(e){if(!r(this,me))return false;let t=e;return !!t&&t instanceof Promise&&t.hasOwnProperty("__staleWhileFetching")&&t.__abortController instanceof Ge},Xe=function(e,t){r(this,j)[t]=e,r(this,K)[e]=t;},Me=function(e){e!==r(this,z)&&(e===r(this,H)?g(this,H,r(this,K)[e]):f(this,p,Xe).call(this,r(this,j)[e],r(this,K)[e]),f(this,p,Xe).call(this,r(this,z),e),g(this,z,e));},be=function(e,t){var n,s;let i=false;if(r(this,F)!==0){let a=r(this,Y).get(e);if(a!==void 0)if(r(this,$)?.[a]&&(clearTimeout(r(this,$)?.[a]),r(this,$)[a]=void 0),i=true,r(this,F)===1)f(this,p,Je).call(this,t);else {r(this,ye).call(this,a);let l=r(this,T)[a];if(f(this,p,A).call(this,l)?l.__abortController.abort(new Error("deleted")):(r(this,se)||r(this,W))&&(r(this,se)&&((n=r(this,Q))==null||n.call(this,l,e,t)),r(this,W)&&r(this,G)?.push([l,e,t])),r(this,Y).delete(e),r(this,M)[a]=void 0,r(this,T)[a]=void 0,a===r(this,z))g(this,z,r(this,j)[a]);else if(a===r(this,H))g(this,H,r(this,K)[a]);else {let u=r(this,j)[a];r(this,K)[u]=r(this,K)[a];let S=r(this,K)[a];r(this,j)[S]=r(this,j)[a];}Ue(this,F)._--,r(this,re).push(a);}}if(r(this,W)&&r(this,G)?.length){let a=r(this,G),l;for(;l=a?.shift();)(s=r(this,Z))==null||s.call(this,...l);}return i},Je=function(e){var t,i;for(let n of f(this,p,fe).call(this,{allowStale:true})){let s=r(this,T)[n];if(f(this,p,A).call(this,s))s.__abortController.abort(new Error("deleted"));else {let a=r(this,M)[n];r(this,se)&&((t=r(this,Q))==null||t.call(this,s,a,e)),r(this,W)&&r(this,G)?.push([s,a,e]);}}if(r(this,Y).clear(),r(this,T).fill(void 0),r(this,M).fill(void 0),r(this,k)&&r(this,ne)){r(this,k).fill(0),r(this,ne).fill(0);for(let n of r(this,$)??[])n!==void 0&&clearTimeout(n);r(this,$)?.fill(void 0);}if(r(this,ie)&&r(this,ie).fill(0),g(this,H,0),g(this,z,0),r(this,re).length=0,g(this,te,0),g(this,F,0),r(this,W)&&r(this,G)){let n=r(this,G),s;for(;s=n?.shift();)(i=r(this,Z))==null||i.call(this,...s);}},we);var ve=class{constructor(e){E(this,"cache");E(this,"map",new Map);this.cache=new lt({max:e.cacheSize}),this.map=new Map;}get[Symbol.iterator](){return this.map[Symbol.iterator]}get[Symbol.toStringTag](){return this.map[Symbol.toStringTag]}clear(){return this.cache.clear(),this.map.clear()}delete(e){let t=this.map.delete(e);return t&&this.cache.delete(e),t}get forEach(){return this.map.forEach}get(e){let t=this.cache.get(e);return t||this.map.get(e)}has(e){return this.map.has(e)}set(e,t){return this.map.set(e,t),this.cache.set(e,t),this}get size(){return this.map.size}entries(){return this.map.entries()}keys(){return this.map.keys()}values(){return this.map.values()}};var Oe=new ve({cacheSize:10}),Qe;(s=>{function h(a){let l=Oe.get(a);if(!l){_.error(`Label "${a}" not found`);return}return l}s.get=h;function e(a){if(Array.isArray(a)){a.forEach(l=>e(l));return}Oe.has(a.id)&&_.info(`Label "${a.id}" already exists, it will be overwritten`),Oe.set(a.id,a);}s.add=e;function t(){return Array.from(Oe.values())}s.values=t;function i(a){return Oe.has(a)}s.has=i;function n(){return Array.from(Oe.keys())}s.keys=n;})(Qe||(Qe={}));var ae=Qe;var m=class m{constructor(){}static get allOpenedLabels(){return core.GameUnifier.getVariable(v.OPENED_LABELS_COUNTER_KEY)||{}}static set allOpenedLabels(e){core.GameUnifier.setVariable(v.OPENED_LABELS_COUNTER_KEY,e);}static getCurrentStepTimesCounterData(e=""){let t=m.currentLabelStepIndex;if(t===null)return _.error("currentLabelStepIndex is null"),null;let i=`${t}${e}`,n=m.currentLabelId,s=m._currentLabel;if(!n||t===null||!s)return _.error("currentLabelId or currentLabelStepIndex is null or currentLabel not found"),null;let a=s.getStepSha(t)||"error",l=core.GameUnifier.getVariable(v.CURRENT_STEP_TIMES_COUNTER_KEY)||{};return l[n]||(l[n]={}),(!l[n][i]||l[n][i].stepSha1!=a)&&(l[n][i]={stepSha1:a}),l[n][i]}static setCurrentStepTimesCounterData(e="",t){let i=m.currentLabelStepIndex,n=i+e,s=m.currentLabelId;if(!s||i===null){_.error("currentLabelId or currentLabelStepIndex is null");return}let a=core.GameUnifier.getVariable(v.CURRENT_STEP_TIMES_COUNTER_KEY)||{};a[s]||(a[s]={}),a[s][n]=t,core.GameUnifier.setVariable(v.CURRENT_STEP_TIMES_COUNTER_KEY,a);}static getCurrentStepTimesCounter(e=""){let t=m._stepCounter,i=m.getCurrentStepTimesCounterData(e);if(!i)return _.error("getCurrentStepTimesCounter obj is null"),0;let n=i.stepCounters||i.lastStepIndexs||[];return n.find(a=>a===t)||(n.push(t),delete i.lastStepIndexs,i.stepCounters=n,m.setCurrentStepTimesCounterData(e,i)),n.length}static getRandomNumber(e,t,i={}){let n=i.nestedId||"";if(i.onceOnly||false){let a=m.getCurrentStepTimesCounterData(n);if(!a)return;let l=a.usedRandomNumbers||{},u=Array.from({length:t-e+1},(L,N)=>N+e).filter(L=>!l[`${e}-${t}`]?.includes(L));if(u.length===0)return;let S=Math.floor(Math.random()*u.length),d=u[S];return l[`${e}-${t}`]||(l[`${e}-${t}`]=[]),l[`${e}-${t}`].push(d),a.usedRandomNumbers=l,m.setCurrentStepTimesCounterData(n,a),d}return Math.floor(Math.random()*(t-e+1))+e}static resetCurrentStepTimesCounter(e=""){let t=m.currentLabelStepIndex,i=t+e,n=m.currentLabelId;if(!n||t===null){_.error("currentLabelId or currentLabelStepIndex is null");return}let s=core.GameUnifier.getVariable(v.CURRENT_STEP_TIMES_COUNTER_KEY)||{};s[n]||(s[n]={}),s[n][i]={stepCounters:[],stepSha1:""},core.GameUnifier.setVariable(v.CURRENT_STEP_TIMES_COUNTER_KEY,s);}static get allChoicesMade(){return core.GameUnifier.getVariable(v.ALL_CHOICES_MADE_KEY)||[]}static set allChoicesMade(e){core.GameUnifier.setVariable(v.ALL_CHOICES_MADE_KEY,e);}static increaseStepCounter(){m._stepCounter++;}static get openedLabels(){return le(m._openedLabels)}static set openedLabels(e){m._openedLabels=le(e);}static get originalOpenedLabels(){return le(m._originalOpenedLabels)}static set originalOpenedLabels(e){m._originalOpenedLabels=le(e);}static get _currentLabel(){if(m.currentLabelId)return ae.get(m.currentLabelId)}static get currentLabelId(){if(m._openedLabels.length>0)return m._openedLabels[m._openedLabels.length-1].label}static get currentLabelStepIndex(){return m._openedLabels.length>0?m._openedLabels[m._openedLabels.length-1].currentStepIndex:null}static addLabelHistory(e,t){let i=m.allOpenedLabels,n=m.allOpenedLabels[e]?.biggestStep||0,s=m.allOpenedLabels[e]?.openCount||0;(!n||n<t)&&(i[e]={biggestStep:t,openCount:s},m.allOpenedLabels=i);}static addChoicesMade(e,t,i,n){let s=m.allChoicesMade,a=s.findIndex(l=>l.labelId===e&&l.stepIndex===t&&l.choiceIndex===n&&l.stepSha1===i);a<0?s.push({labelId:e,stepIndex:t,choiceIndex:n,stepSha1:i,madeTimes:1}):s[a].madeTimes++,m.allChoicesMade=s;}static pushNewLabel(e){if(!ae.get(e))throw new core.PixiError("unregistered_element",`Label ${e} not found`);m._openedLabels.push({label:e,currentStepIndex:0});let i=m.allOpenedLabels,n=m.allOpenedLabels[e]?.biggestStep||0,s=m.allOpenedLabels[e]?.openCount||0;i[e]={biggestStep:n,openCount:s+1},m.allOpenedLabels=i;}static increaseCurrentStepIndex(){if(m._openedLabels.length>0){let e=m._openedLabels[m._openedLabels.length-1];m._openedLabels[m._openedLabels.length-1]={...e,currentStepIndex:e.currentStepIndex+1};}}static set onStepStart(e){m._onStepStart=e;}static get onStepStart(){return async(e,t)=>{let i=[];return m.onLoadingLabel&&e===0&&i.push(m.onLoadingLabel(e,t)),m._onStepStart&&i.push(m._onStepStart(e,t)),await Promise.all(i)}}};E(m,"choiceMadeTemp"),E(m,"lastHistoryStep",null),E(m,"_stepCounter",0),E(m,"_openedLabels",[]),E(m,"_originalOpenedLabels",[]),E(m,"_onStepStart"),E(m,"onLoadingLabel"),E(m,"onStepEnd");var b=m;var Pe=class{get currentStepTimesCounter(){return b.getCurrentStepTimesCounter()}set currentStepTimesCounter(e){b.resetCurrentStepTimesCounter();}getRandomNumber(e,t,i={}){return b.getRandomNumber(e,t,i)}get stepCounter(){return b._stepCounter}get openedLabels(){return b.openedLabels}get currentLabel(){return b._currentLabel}addStepHistory(e,t={}){let{choiceMade:i,ignoreSameStep:n}=t,s,a,l,u=core.GameUnifier.getVariable(v.LAST_STEP_GLUED)===this.stepCounter;core.GameUnifier.getVariable(v.LAST_DIALOGUE_ADDED_IN_STEP_MEMORY_KEY)===this.stepCounter&&(s=core.GameUnifier.getVariable(v.CURRENT_DIALOGUE_MEMORY_KEY)),core.GameUnifier.getVariable(v.LAST_MENU_OPTIONS_ADDED_IN_STEP_MEMORY_KEY)===this.stepCounter&&(a=core.GameUnifier.getVariable(v.CURRENT_MENU_OPTIONS_MEMORY_KEY)),core.GameUnifier.getVariable(v.LAST_INPUT_ADDED_IN_STEP_MEMORY_KEY)===this.stepCounter&&(l=core.GameUnifier.getVariable(v.CURRENT_INPUT_VALUE_MEMORY_KEY));let S=b.openedLabels,d={currentLabel:b.currentLabelId,dialogue:s,choices:a,stepSha1:e,index:this.stepCounter,labelStepIndex:b.currentLabelStepIndex,choiceIndexMade:i,inputValue:l,alreadyMadeChoices:this.alreadyCurrentStepMadeChoices,isGlued:u,openedLabels:S};b.originalOpenedLabels=S,core.GameUnifier.addHistoryItem(d,{ignoreSameStep:n}),b.lastHistoryStep=d,b.increaseStepCounter();}closeCurrentLabel(){if(!b.currentLabelId){_.warn("No label to close");return}if(!this.currentLabel){_.error("currentLabel not found");return}let e=b.openedLabels;e.pop(),b.openedLabels=e,core.GameUnifier.onLabelClosing(this.openedLabels.length);}closeAllLabels(){for(;b.openedLabels.length>0;)this.closeCurrentLabel(),core.GameUnifier.onLabelClosing(this.openedLabels.length);}isLabelAlreadyCompleted(e){let t;typeof e=="string"?t=e:t=e.id;let n=b.allOpenedLabels[t]?.biggestStep||0;if(n){let s=ae.get(t);if(s)return s.stepCount<=n}return false}get alreadyCurrentStepMadeChoicesObj(){let e=b.currentLabelStepIndex,t=this.currentLabel;if(e===null||!t)return;let i=t.getStepSha(e);return i||(_.warn("stepSha not found, setting to ERROR"),i="error"),b.allChoicesMade.filter(n=>n.labelId===t?.id&&n.stepIndex===e&&n.stepSha1===i)}get alreadyCurrentStepMadeChoices(){return this.alreadyCurrentStepMadeChoicesObj?.map(e=>e.choiceIndex)}get isCurrentStepAlreadyOpened(){let e=b.currentLabelId;if(e){let t=b.allOpenedLabels[e]?.openCount||0;if(b.currentLabelStepIndex&&t>=b.currentLabelStepIndex)return true}return false}getTimesLabelOpened(e){return b.allOpenedLabels[e]?.openCount||0}getTimesChoiceMade(e){return this.alreadyCurrentStepMadeChoicesObj?.find(t=>t.choiceIndex===e)?.madeTimes||0}addCurrentStepToHistory(){this.addStepHistory("dev",{ignoreSameStep:true});}getCanContinue(e){let t=e?.showWarn||false,i=this.choices;return i&&i.length>0?(t&&_.warn("The player must make a choice"),false):this.isRequiredInput?(t&&_.warn("The player must enter a value"),false):true}get canContinue(){return core.GameUnifier.runningStepsCount!==0?false:this.getCanContinue()}async onStepStart(e,t){let i=[];return e.onStepStart&&i.push(e.onStepStart(t,e)),b.onStepStart&&i.push(b.onStepStart(t,e)),await Promise.all(i)}async onStepEnd(e,t){let i=[];return e.onStepEnd&&i.push(e.onStepEnd(t,e)),b.onStepEnd&&i.push(b.onStepEnd(t,e)),await Promise.all(i)}async continue(e,t={}){let{runNow:i=false,steps:n=1}=t;if(!Number.isFinite(n)){_.warn(`[continue] The parameter steps must be a valid finite number, received: ${n}`);return}if(n<=0){_.warn(`[continue] The parameter steps must be greater than 0, received: ${n}`);return}if(!i&&!this.getCanContinue({showWarn:true}))return;if(!i&&core.GameUnifier.runningStepsCount!==0){core.GameUnifier.increaseContinueRequest(n);return}n>1&&core.GameUnifier.increaseContinueRequest(n-1),core.GameUnifier.runningStepsCount++;let s;try{core.GameUnifier.runningStepsCount===1&&await core.GameUnifier.onPreContinue(),b.increaseCurrentStepIndex(),s=await this.runCurrentStep(e,t);}catch(a){throw _.error("Error continuing",a),a}finally{core.GameUnifier.runningStepsCount--,s=await this.afterRunCurrentStep(e)||s;}return s}async afterRunCurrentStep(e){if(core.GameUnifier.runningStepsCount===0&&core.GameUnifier.continueRequestsCount!==0)return await core.GameUnifier.processNavigationRequests(e);if(this.openedLabels.length===0){if(core.GameUnifier.onEnd)return await core.GameUnifier.onEnd(e,{labelId:"end"});_.error("The end of the game is not managed, so the game is blocked. Read this documentation to know how to manage the end of the game: https://pixi-vn.web.app/start/other-narrative-features.html#how-manage-the-end-of-the-game");}}async runCurrentStep(e,t={}){let{choiceMade:i}=t;if(b.currentLabelId){let n=b.currentLabelStepIndex;if(n===null){_.error("currentLabelStepIndex is null");return}let s=b._currentLabel;if(!s){_.error("currentLabel not found");return}if(s.stepCount>n){try{await this.onStepStart(s,n);}catch(d){_.error("Error running onStepStart",d),this.onStepError&&await this.onStepError(d,e);return}let a=s.getStepById(n);if(!a){_.error("step not found");return}let l=s.getStepSha(n);l||(_.warn("stepSha not found, setting to ERROR"),l="error");let u,S;try{u=await a(e,{labelId:s.id});}catch(d){_.error("Error running step",d),S=d;}try{let d=this.choices;if(d?.length===1&&d[0].autoSelect){let L=d[0];u=await this.selectChoice(L,e);}}catch(d){_.error("Error auto-selecting choice",d),S===void 0&&(S=d);}try{let d=b.lastHistoryStep;i!==void 0&&d&&(l=d.stepSha1,l||(_.warn("stepSha not found, setting to ERROR"),l="error"),b.addChoicesMade(d.currentLabel||"error",typeof d.labelStepIndex=="number"?d.labelStepIndex:-1,d.stepSha1||"error",i),b.choiceMadeTemp=i);}catch(d){_.warn("Error adding choice made to history",d);}try{core.GameUnifier.runningStepsCount===1&&(b.addLabelHistory(s.id,n),this.addStepHistory(l,{...t,choiceMade:b.choiceMadeTemp}),b.choiceMadeTemp=void 0);}catch(d){_.warn("Error adding step to history",d);}try{this.currentLabel&&await this.onStepEnd(this.currentLabel,b.currentLabelStepIndex||0);}catch(d){_.warn("Error running onStepEnd",d);}return S&&this.onStepError&&await this.onStepError(S,e),u}else {if(this.openedLabels.length>1)return this.closeCurrentLabel(),await this.continue(e,t);if(this.openedLabels.length===1){b.openedLabels=[];return}}}else {if(this.openedLabels.length===0)return;_.error("currentLabelId not found");}}async call(e,t,i){let{choiceMade:n}=i||{},s;typeof e=="string"?s=e:s=e.id,core.GameUnifier.runningStepsCount++;let a;try{let l=ae.get(s);if(!l)throw new core.PixiError("unregistered_element",`Label ${s} not found`);b.pushNewLabel(l.id),a=await this.runCurrentStep(t,{choiceMade:n});}catch(l){throw _.error("Error calling label",l),l}finally{core.GameUnifier.runningStepsCount--,a=await this.afterRunCurrentStep(t)||a;}return a}async jump(e,t,i){if(this.stepCounter===0)return await this.call(e,t,i);this.openedLabels.length>0&&this.closeCurrentLabel();let{choiceMade:n}=i||{},s;typeof e=="string"?s=e:s=e.id,core.GameUnifier.runningStepsCount++;let a;try{let l=ae.get(s);if(!l)throw new core.PixiError("unregistered_element",`Label ${s} not found`);b.pushNewLabel(l.id),a=await this.runCurrentStep(t,{choiceMade:n});}catch(l){throw _.error("Error jumping to label",l),l}finally{core.GameUnifier.runningStepsCount--,a=await this.afterRunCurrentStep(t)||a;}return a}async selectChoice(e,t){this.choices=void 0;let i=e.type;switch(i){case "call":return await this.call(e.label,{...e.props,...t},{choiceMade:e.choiceIndex});case "jump":return await this.jump(e.label,{...e.props,...t},{choiceMade:e.choiceIndex});case "close":return await this.closeChoiceMenu(e,{...e.props,...t});default:throw _.error(`Type ${i} not found`),new core.PixiError("invalid_usage",`Type ${i} not found`)}}async closeChoiceMenu(e,t){if(e.type!=="close")throw _.error("For closeChoiceMenu, the type must be close"),new core.PixiError("invalid_usage","For closeChoiceMenu, the type must be close");let i;return typeof e.choiceIndex=="number"&&(i=e.choiceIndex),e.closeCurrentLabel&&this.closeCurrentLabel(),await this.continue(t,{choiceMade:i})}get onStepError(){let e=core.GameUnifier.onError;if(e)return async(t,i)=>{try{return await e("step",t,i)}catch(n){_.error("Error in onError handler",n);}}}set onStepError(e){core.GameUnifier.onError=(t,i,n)=>e(i,n);}get dialogue(){let e=core.GameUnifier.getVariable(v.CURRENT_DIALOGUE_MEMORY_KEY);if(e)return {...e,character:e.character?core.GameUnifier.getCharacter(e.character)||e.character:void 0}}set dialogue(e){if(e===void 0){core.GameUnifier.setVariable(v.CURRENT_DIALOGUE_MEMORY_KEY,void 0);return}if((typeof e=="string"||Array.isArray(e))&&(e={text:e}),this.dialogGlue){let t=core.GameUnifier.getVariable(v.CURRENT_DIALOGUE_MEMORY_KEY);if(t){let i=[];Array.isArray(t.text)?i=[...t.text]:i=[t.text],Array.isArray(e.text)?i=[...i,...e.text]:i=[...i,e.text],e.text=i,e.character=e.character||t.character;}core.GameUnifier.setVariable(v.LAST_STEP_GLUED,this.stepCounter),this.dialogGlue=false;}try{core.GameUnifier.setVariable(v.CURRENT_DIALOGUE_MEMORY_KEY,le({...e,character:typeof e.character=="string"?e.character:e.character?.id})),core.GameUnifier.setVariable(v.LAST_DIALOGUE_ADDED_IN_STEP_MEMORY_KEY,this.stepCounter);}catch{throw _.error("DialogueInterface cannot contain functions or classes"),new core.PixiError("not_json_serializable","ChoiceInterface cannot contain functions or classes")}}get choices(){let e=core.GameUnifier.getVariable(v.CURRENT_MENU_OPTIONS_MEMORY_KEY);if(e){let t=[],i=e.map((s,a)=>({...s,choiceIndex:a})),n=this.alreadyCurrentStepMadeChoices;if(i=i.filter((s,a)=>s.oneTime&&n&&n.includes(a)?false:s.onlyHaveNoChoice?(t.push(s),false):true),i.length>0)return i;if(t.length>0)return [t[0]]}}set choices(e){if(!e||e.length===0){core.GameUnifier.setVariable(v.CURRENT_MENU_OPTIONS_MEMORY_KEY,void 0);return}try{core.GameUnifier.setVariable(v.CURRENT_MENU_OPTIONS_MEMORY_KEY,le(e)),core.GameUnifier.setVariable(v.LAST_MENU_OPTIONS_ADDED_IN_STEP_MEMORY_KEY,this.stepCounter);}catch{throw _.error("ChoiceInterface cannot contain functions or classes"),new core.PixiError("not_json_serializable","ChoiceInterface cannot contain functions or classes")}}get dialogGlue(){return core.GameUnifier.getFlag(v.ADD_NEXT_DIALOG_TEXT_INTO_THE_CURRENT_DIALOG_FLAG_KEY)}set dialogGlue(e){core.GameUnifier.setFlag(v.ADD_NEXT_DIALOG_TEXT_INTO_THE_CURRENT_DIALOG_FLAG_KEY,e);}get inputValue(){return core.GameUnifier.getVariable(v.CURRENT_INPUT_VALUE_MEMORY_KEY)}set inputValue(e){this.removeInputRequest(),core.GameUnifier.setVariable(v.CURRENT_INPUT_VALUE_MEMORY_KEY,e),core.GameUnifier.setVariable(v.LAST_INPUT_ADDED_IN_STEP_MEMORY_KEY,this.stepCounter);}get isRequiredInput(){return core.GameUnifier.getVariable(v.CURRENT_INPUT_INFO_MEMORY_KEY)?.isRequired||false}get inputType(){return core.GameUnifier.getVariable(v.CURRENT_INPUT_INFO_MEMORY_KEY)?.type}requestInput(e,t){e.isRequired=true,core.GameUnifier.setVariable(v.CURRENT_INPUT_INFO_MEMORY_KEY,e),t!==void 0?core.GameUnifier.setVariable(v.CURRENT_INPUT_VALUE_MEMORY_KEY,t):core.GameUnifier.removeVariable(v.CURRENT_INPUT_VALUE_MEMORY_KEY);}removeInputRequest(){core.GameUnifier.removeVariable(v.CURRENT_INPUT_INFO_MEMORY_KEY),core.GameUnifier.removeVariable(v.CURRENT_INPUT_VALUE_MEMORY_KEY);}clear(){b.openedLabels=[],b._stepCounter=0;}export(){return {openedLabels:le(b.openedLabels),stepCounter:this.stepCounter}}async onLoadingLabel(e){let t=this.openedLabels.map(async i=>{let n=[],s=ae.get(i.label);return s&&(s.onLoadingLabel&&n.push(s.onLoadingLabel(e,s)),b.onLoadingLabel&&n.push(b.onLoadingLabel(e,s))),await Promise.all(n)});return await Promise.all(t)}async restore(e,t){this.clear();try{b.lastHistoryStep=t,e.hasOwnProperty("openedLabels")?(b.openedLabels=e.openedLabels,b.originalOpenedLabels=b.openedLabels):_.warn("Could not import openedLabels data, so will be ignored"),e.hasOwnProperty("stepCounter")?b._stepCounter=e.stepCounter:e.hasOwnProperty("lastStepIndex")?b._stepCounter=e.lastStepIndex:_.warn("Could not import stepCounter data, so will be ignored");try{await this.onLoadingLabel(b.currentLabelStepIndex||0);}catch(i){_.error("Error running onLoadingLabel",i);}}catch(i){_.error("Error importing data",i);}}};function xt(h,e,t,i){let n=typeof e=="string"?e:e.id;return {...i,label:n,props:t,text:h,type:i?.type||"call"}}var Ze="close";function At(h,e){return {...e,type:Ze,text:h}}var ft=Et(ct());var xe=class{constructor(e,t){E(this,"id");E(this,"_onStepStart");E(this,"_onLoadingLabel");E(this,"_onStepEnd");this.id=e,this._onStepStart=t?.onStepStart,this._onLoadingLabel=t?.onLoadingLabel,this._onStepEnd=t?.onStepEnd;}get onStepStart(){return async(e,t)=>{if(this._onLoadingLabel&&e===0&&await this._onLoadingLabel(e,t),this._onStepStart)return await this._onStepStart(e,t)}}get onLoadingLabel(){return this._onLoadingLabel}get onStepEnd(){return this._onStepEnd}};var Ae=class extends xe{constructor(t,i,n){super(t,n);E(this,"_steps");this._steps=i;}get stepCount(){return this.steps.length}getStepById(t){return this.steps[t]}get steps(){return typeof this._steps=="function"?this._steps():this._steps}getStepSha(t){if(t<0||t>=this.steps.length)return _.warn("stepSha not found, setting to ERROR"),"error";try{let i=this.steps[t];return (0,ft.default)(i.toString().toLocaleLowerCase()).toString()}catch(i){return _.warn("stepSha not found, setting to ERROR",i),"error"}}};function bt(h,e,t){let i=new Ae(h,e,t);return ae.add(i),i}var Mr=new Pe;
|
|
2
|
+
exports.Close=Ze;exports.Label=Ae;exports.LabelAbstract=xe;exports.NarrationManagerStatic=b;exports.RegisteredLabels=ae;exports.narration=Mr;exports.newChoiceOption=xt;exports.newCloseChoiceOption=At;exports.newLabel=bt;//# sourceMappingURL=narration.cjs.map
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvY29yZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvc2hhMS5qcyIsIi4uL3NyYy9zdG9yYWdlL2NvbnN0YW50cy50cyIsIi4uL3NyYy91dGlscy9sb2ctdXRpbGl0eS50cyIsIi4uL3NyYy91dGlscy9leHBvcnQtdXRpbGl0eS50cyIsIi4uL25vZGVfbW9kdWxlcy9scnUtY2FjaGUvc3JjL2luZGV4LnRzIiwiLi4vc3JjL2NsYXNzZXMvQ2FjaGVkTWFwLnRzIiwiLi4vc3JjL25hcnJhdGlvbi9kZWNvcmF0b3JzL1JlZ2lzdGVyZWRMYWJlbHMudHMiLCIuLi9zcmMvbmFycmF0aW9uL05hcnJhdGlvbk1hbmFnZXJTdGF0aWMudHMiLCIuLi9zcmMvbmFycmF0aW9uL05hcnJhdGlvbk1hbmFnZXIudHMiLCIuLi9zcmMvbmFycmF0aW9uL2NsYXNzZXMvQ2hvaWNlTWVudU9wdGlvbi50cyIsIi4uL3NyYy9uYXJyYXRpb24vdHlwZXMvQ2xvc2VUeXBlLnRzIiwiLi4vc3JjL25hcnJhdGlvbi9jbGFzc2VzL0Nsb3NlQ2hvaWNlT3B0aW9uLnRzIiwiLi4vc3JjL25hcnJhdGlvbi9jbGFzc2VzL0xhYmVsLnRzIiwiLi4vc3JjL25hcnJhdGlvbi9jbGFzc2VzL0xhYmVsQWJzdHJhY3QudHMiLCIuLi9zcmMvbmFycmF0aW9uL2RlY29yYXRvcnMvbmV3TGFiZWwudHMiLCIuLi9zcmMvbmFycmF0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbInJlcXVpcmVfY29yZSIsIl9fY29tbW9uSlNNaW4iLCJleHBvcnRzIiwibW9kdWxlIiwicm9vdCIsImZhY3RvcnkiLCJDcnlwdG9KUyIsIk1hdGgiLCJ1bmRlZmluZWQiLCJjcnlwdG8iLCJfX3JlcXVpcmUiLCJjcnlwdG9TZWN1cmVSYW5kb21JbnQiLCJjcmVhdGUiLCJGIiwib2JqIiwic3VidHlwZSIsIkMiLCJDX2xpYiIsIkJhc2UiLCJvdmVycmlkZXMiLCJpbnN0YW5jZSIsInByb3BlcnRpZXMiLCJwcm9wZXJ0eU5hbWUiLCJXb3JkQXJyYXkiLCJ3b3JkcyIsInNpZ0J5dGVzIiwiZW5jb2RlciIsIkhleCIsIndvcmRBcnJheSIsInRoaXNXb3JkcyIsInRoYXRXb3JkcyIsInRoaXNTaWdCeXRlcyIsInRoYXRTaWdCeXRlcyIsImkiLCJ0aGF0Qnl0ZSIsImoiLCJjbG9uZSIsIm5CeXRlcyIsIkNfZW5jIiwiaGV4Q2hhcnMiLCJiaXRlIiwiaGV4U3RyIiwiaGV4U3RyTGVuZ3RoIiwiTGF0aW4xIiwibGF0aW4xQ2hhcnMiLCJsYXRpbjFTdHIiLCJsYXRpbjFTdHJMZW5ndGgiLCJVdGY4IiwidXRmOFN0ciIsIkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0iLCJkYXRhIiwiZG9GbHVzaCIsInByb2Nlc3NlZFdvcmRzIiwiZGF0YVdvcmRzIiwiZGF0YVNpZ0J5dGVzIiwiYmxvY2tTaXplIiwiYmxvY2tTaXplQnl0ZXMiLCJuQmxvY2tzUmVhZHkiLCJuV29yZHNSZWFkeSIsIm5CeXRlc1JlYWR5Iiwib2Zmc2V0IiwiY2ZnIiwibWVzc2FnZVVwZGF0ZSIsImhhc2giLCJoYXNoZXIiLCJtZXNzYWdlIiwia2V5IiwiQ19hbGdvIiwicmVxdWlyZV9zaGExIiwiSGFzaGVyIiwiVyIsIlNIQTEiLCJNIiwiSCIsImEiLCJiIiwiYyIsImQiLCJlIiwibiIsInQiLCJuQml0c1RvdGFsIiwibkJpdHNMZWZ0IiwiU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUyIsImxvZ2dlciIsIm9wdGlvbmFsUGFyYW1zIiwiY3JlYXRlRXhwb3J0YWJsZUVsZW1lbnQiLCJlbGVtZW50IiwiZWxlbWVudFN0cmluZyIsIlBpeGlFcnJvciIsImRlZmF1bHRQZXJmIiwid2FybmVkIiwiUFJPQ0VTUyIsImVtaXRXYXJuaW5nIiwibXNnIiwidHlwZSIsImNvZGUiLCJmbiIsIkFDIiwiQVMiLCJfX3B1YmxpY0ZpZWxkIiwiXyIsIndhcm5BQ1BvbHlmaWxsIiwicmVhc29uIiwicHJpbnRBQ1BvbHlmaWxsV2FybmluZyIsInNob3VsZFdhcm4iLCJpc1Bvc0ludCIsImdldFVpbnRBcnJheSIsIm1heCIsIlplcm9BcnJheSIsInNpemUiLCJfYSIsIl9vIiwiU3RhY2siLCJIZWFwQ2xzIiwiX1N0YWNrIiwiI2NvbnN0cnVjdGluZyIsInMiLCJfX3ByaXZhdGVBZGQiLCJfYiIsIl9jIiwiX3ciLCJfQyIsIl9TIiwiX0wiLCJfSSIsIl9tIiwiX24iLCJfXyIsIl9zIiwiX2kiLCJfdCIsIl91IiwiX2wiLCJfaCIsIl9yIiwiX3kiLCJfQSIsIl9kIiwiX2ciLCJfVCIsIl92IiwiX2YiLCJfVSIsIl9jX2luc3RhbmNlcyIsImpfZm4iLCJfUiIsIl96IiwiX04iLCJfcCIsIkJfZm4iLCJfVyIsIl9NIiwiX1AiLCJGX2ZuIiwiT19mbiIsIkhfZm4iLCJ4X2ZuIiwiR19mbiIsImVfZm4iLCJrX2ZuIiwiRF9mbiIsIkVfZm4iLCJWX2ZuIiwiTFJVQ2FjaGUiLCJvcHRpb25zIiwiI21heCIsIiNtYXhTaXplIiwiI2Rpc3Bvc2UiLCIjb25JbnNlcnQiLCIjZGlzcG9zZUFmdGVyIiwiI2ZldGNoTWV0aG9kIiwiI21lbW9NZXRob2QiLCIjcGVyZiIsIiNzaXplIiwiI2NhbGN1bGF0ZWRTaXplIiwiI2tleU1hcCIsIiNrZXlMaXN0IiwiI3ZhbExpc3QiLCIjbmV4dCIsIiNwcmV2IiwiI2hlYWQiLCIjdGFpbCIsIiNmcmVlIiwiI2Rpc3Bvc2VkIiwiI3NpemVzIiwiI3N0YXJ0cyIsIiN0dGxzIiwiI2F1dG9wdXJnZVRpbWVycyIsIiNoYXNEaXNwb3NlIiwiI2hhc0ZldGNoTWV0aG9kIiwiI2hhc0Rpc3Bvc2VBZnRlciIsIiNoYXNPbkluc2VydCIsIiN1cGRhdGVJdGVtQWdlIiwiI3N0YXR1c1RUTCIsIiNzZXRJdGVtVFRMIiwiI2lzU3RhbGUiLCIjcmVtb3ZlSXRlbVNpemUiLCIjYWRkSXRlbVNpemUiLCJfc3QiLCIjcmVxdWlyZVNpemUiLCJfayIsInNpemVDYWxjdWxhdGlvbiIsInR0bCIsInR0bFJlc29sdXRpb24iLCJ0dGxBdXRvcHVyZ2UiLCJ1cGRhdGVBZ2VPbkdldCIsInVwZGF0ZUFnZU9uSGFzIiwiYWxsb3dTdGFsZSIsImRpc3Bvc2UiLCJvbkluc2VydCIsImRpc3Bvc2VBZnRlciIsIm5vRGlzcG9zZU9uU2V0Iiwibm9VcGRhdGVUVEwiLCJtYXhTaXplIiwibWF4RW50cnlTaXplIiwiZmV0Y2hNZXRob2QiLCJtZW1vTWV0aG9kIiwibm9EZWxldGVPbkZldGNoUmVqZWN0aW9uIiwibm9EZWxldGVPblN0YWxlR2V0IiwiYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24iLCJhbGxvd1N0YWxlT25GZXRjaEFib3J0IiwiaWdub3JlRmV0Y2hBYm9ydCIsInBlcmYiLCJfX3ByaXZhdGVTZXQiLCJVaW50QXJyYXkiLCJfX3ByaXZhdGVHZXQiLCJfX3ByaXZhdGVNZXRob2QiLCIjaW5pdGlhbGl6ZVNpemVUcmFja2luZyIsIiNpbml0aWFsaXplVFRMVHJhY2tpbmciLCJfTFJVQ2FjaGUiLCJwIiwiI2lzQmFja2dyb3VuZEZldGNoIiwiayIsImluZGV4IiwiY29udGV4dCIsIiNiYWNrZ3JvdW5kRmV0Y2giLCIjbW92ZVRvVGFpbCIsIiNpbmRleGVzIiwiI3JpbmRleGVzIiwiZ2V0T3B0aW9ucyIsInYiLCJ2YWx1ZSIsInRoaXNwIiwiZGVsZXRlZCIsIiNkZWxldGUiLCJlbnRyeSIsInN0YXJ0IiwicmVtYWluIiwiYXJyIiwiYWdlIiwic2V0T3B0aW9ucyIsInN0YXR1cyIsIiNldmljdCIsIl9fcHJpdmF0ZVdyYXBwZXIiLCJvbGRWYWwiLCJvbGRWYWx1ZSIsImR0IiwidGFzayIsInZhbCIsImhhc09wdGlvbnMiLCJwZWVrT3B0aW9ucyIsImZldGNoT3B0aW9ucyIsImZvcmNlUmVmcmVzaCIsInNpZ25hbCIsInN0YWxlIiwiaXNTdGFsZSIsInN0YWxlVmFsIiwibWVtb09wdGlvbnMiLCJ2diIsImZldGNoaW5nIiwiI2NsZWFyIiwidHRscyIsInN0YXJ0cyIsInB1cmdlVGltZXJzIiwic2V0UHVyZ2V0VGltZXIiLCJjYWNoZWROb3ciLCJnZXROb3ciLCJzaXplcyIsIiNpc1ZhbGlkSW5kZXgiLCJmcmVlIiwiaGVhZCIsImFjIiwiZmV0Y2hPcHRzIiwiY2IiLCJ1cGRhdGVDYWNoZSIsImFib3J0ZWQiLCJpZ25vcmVBYm9ydCIsInByb2NlZWQiLCJmZXRjaEZhaWwiLCJiZiIsInZsIiwiZWIiLCJlciIsImFsbG93U3RhbGVBYm9ydGVkIiwibm9EZWxldGUiLCJwY2FsbCIsInJlcyIsInJlaiIsImZtcCIsIiNjb25uZWN0IiwicGkiLCJuaSIsIkNhY2hlZE1hcCIsIkwiLCJjYWNoZWRWYWx1ZSIsInJlZ2lzdGVyZWRMYWJlbHMiLCJSZWdpc3RlcmVkTGFiZWxzIiwiZ2V0IiwiaWQiLCJsYWJlbCIsImFkZCIsInZhbHVlcyIsImhhcyIsImtleXMiLCJSZWdpc3RlcmVkTGFiZWxzX2RlZmF1bHQiLCJfTmFycmF0aW9uTWFuYWdlclN0YXRpYyIsIkdhbWVVbmlmaWVyIiwibmVzdGVkSWQiLCJjdXJyZW50TGFiZWxTdGVwSW5kZXgiLCJjdXJyZW50TGFiZWxTdGVwSW5kZXhJZCIsImxhYmVsSWQiLCJjdXJyZW50TGFiZWwiLCJzdGVwU2hhMSIsImxhc3RTdGVwIiwibGlzdCIsIml0ZW0iLCJtaW4iLCJ1c2VkUmFuZG9tTnVtYmVycyIsImFsbE51bWJlcnMiLCJyYW5kb21JbmRleCIsInJhbmRvbU51bWJlciIsInN0ZXBJbmRleCIsImFsbE9wZW5lZExhYmVscyIsIm9sZFN0ZXBJbmRleCIsIm9wZW5Db3VudCIsInN0ZXBTaGEiLCJjaG9pY2VNYWRlIiwiYWxsQ2hvaWNlc01hZGUiLCJhbHJlZHlNYWRlIiwiYmlnZ2VzdFN0ZXAiLCJzdGVwSWQiLCJOYXJyYXRpb25NYW5hZ2VyU3RhdGljIiwiTmFycmF0aW9uTWFuYWdlciIsImlnbm9yZVNhbWVTdGVwIiwiZGlhbG9ndWUiLCJjaG9pY2VzIiwiaW5wdXRWYWx1ZSIsImlzR2x1ZWQiLCJvcGVuZWRMYWJlbHMiLCJoaXN0b3J5SW5mbyIsImNob2ljZSIsInNob3dXYXJuIiwiY2hvaWNlTWVudU9wdGlvbnMiLCJwcm9wcyIsInJ1bk5vdyIsInN0ZXBzIiwicmVzdWx0Iiwic3RlcCIsImVyciIsImxhc3RIaXN0b3J5U3RlcCIsInRlbXBMYWJlbCIsIm9uRXJyb3IiLCJlcnJvciIsImdsdWVEaWFsb2d1ZSIsIm5ld1RleHQiLCJvbmx5SGF2ZU5vQ2hvaWNlIiwib3B0aW9uIiwiYWxyZWFkeUNob2ljZXMiLCJpbmZvIiwiZGVmYXVsdFZhbHVlIiwicHJvbWlzZSIsImxhYmVsSW5mbyIsIm5ld0Nob2ljZU9wdGlvbiIsInRleHQiLCJDbG9zZSIsIm5ld0Nsb3NlQ2hvaWNlT3B0aW9uIiwiaW1wb3J0X3NoYTEiLCJMYWJlbEFic3RyYWN0IiwiTGFiZWwiLCJzaGExIiwibmV3TGFiZWwiLCJuYXJyYXRpb24iXSwibWFwcGluZ3MiOiJzREFBQSxJQUFBLEVBQUEsQ0FBQSxNQUFBLENBQUEsTUFBQSxDQUFBLElBQUEsRUFBQSxDQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsSUFBQSxFQUFBLENBQUEsTUFBQSxDQUFBLHdCQUFBLENBQUEsSUFBQSxFQUFBLENBQUEsTUFBQSxDQUFBLG1CQUFBLENBQUEsSUFBQSxFQUFBLENBQUEsTUFBQSxDQUFBLGNBQUEsQ0FBQSxFQUFBLENBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxjQUFBLENBQUEsSUFBQSxFQUFBLENBQUEsQ0FBQSxFQUFBLENBQUEsTUFBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxJQUFBLEVBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsRUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxVQUFBLENBQUEsSUFBQSxDQUFBLFlBQUEsQ0FBQSxJQUFBLENBQUEsUUFBQSxDQUFBLElBQUEsQ0FBQSxLQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLElBQUEsRUFBQSxDQUFBLENBQUEsQ0FBQSxFQUFBLE9BQUEsT0FBQSxDQUFBLEdBQUEsQ0FBQSxPQUFBLENBQUEsT0FBQSxLQUFBLENBQUEsR0FBQSxDQUFBLElBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUEsQ0FBQSxPQUFBLE9BQUEsQ0FBQSxHQUFBLENBQUEsT0FBQSxDQUFBLENBQUEsRUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxFQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsR0FBQSxPQUFBLE9BQUEsQ0FBQSxHQUFBLENBQUEsT0FBQSxPQUFBLENBQUEsS0FBQSxDQUFBLElBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBQSxNQUFBLEtBQUEsQ0FBQSxzQkFBQSxDQUFBLENBQUEsQ0FBQSxvQkFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLElBQUEsRUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsR0FBQSxLQUFBLENBQUEsRUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxPQUFBLENBQUEsRUFBQSxDQUFBLEVBQUEsT0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxPQUFBLENBQUEsQ0FBQSxJQUFBLEVBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsR0FBQSxDQUFBLEdBQUEsQ0FBQSxFQUFBLE9BQUEsQ0FBQSxFQUFBLFFBQUEsRUFBQSxPQUFBLENBQUEsRUFBQSxVQUFBLENBQUEsSUFBQSxJQUFBLENBQUEsSUFBQSxFQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxFQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsRUFBQSxDQUFBLEdBQUEsQ0FBQSxFQUFBLEVBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsR0FBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLFVBQUEsQ0FBQSxFQUFBLENBQUEsQ0FBQSxFQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxDQUFBLFVBQUEsQ0FBQSxDQUFBLENBQUEsT0FBQSxDQUFBLENBQUEsQ0FBQSxJQUFBLEVBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxDQUFBLEVBQUEsSUFBQSxDQUFBLEVBQUEsQ0FBQSxFQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxFQUFBLENBQUEsRUFBQSxDQUFBLEVBQUEsQ0FBQSxDQUFBLENBQUEsU0FBQSxDQUFBLENBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQSxVQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUEsRUFBQSxDQUFBLENBQUEsQ0FBQSxPQUFBLENBQUEsRUFBQSxRQUFBLENBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsRUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLENBQUEsRUFBQSxFQUFBLENBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLElBQUEsRUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEseUJBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxtREFBQSxDQUFBLENBQUEsQ0FBQSxZQUFBLE9BQUEsQ0FBQSxDQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsSUFBQSxFQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSx3QkFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLElBQUEsRUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsdUJBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLElBQUEsRUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxFQUFBLENBQUEsQ0FBQSxJQUFBLENBQUEsRUFBQSxDQUFBLE9BQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUEsSUFBQUEsRUFBQUEsQ0FBQUMsRUFBQUEsQ0FBQSxDQUFBQyxFQUFBQSxDQUFBQyxLQUFBLENBQUEsQ0FBRSxTQUFVQyxDQUFBQSxDQUFNQyxDQUFBQSxDQUFTLENBQ3RCLE9BQU9ILEVBQUFBLEVBQVksUUFBQSxDQUV0QkMsR0FBTyxPQUFBLENBQVVELEVBQUFBLENBQVVHLENBQUFBLEVBQVEsQ0FFM0IsT0FBTyxNQUFBLEVBQVcsVUFBQSxFQUFjLE1BQUEsQ0FBTyxJQUUvQyxNQUFBLENBQU8sRUFBQyxDQUFHQSxDQUFPLEVBSWxCRCxDQUFBQSxDQUFLLFFBQUEsQ0FBV0MsQ0FBQUEsR0FFbEIsR0FBRUgsRUFBQUEsQ0FBTSxVQUFZLENBT25CLElBQUlJLENBQUFBLENBQVdBLENBQUFBLEVBQUFBLENBQWEsU0FBVUMsQ0FBQUEsQ0FBTUMs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QyxFQUFBQSxDQUFBQyxHQUFBQyxFQUFBQSxDQUFBQyxDQUFBQSxDQUFBQyxFQUFBQSxDQUFBQyxFQUFBQSxDQUFBQyxHQUFBQyxFQUFBQSxDQUFBM0MsRUFBQUEsQ0EybkNhNEMsRUFBQUEsRUFBUDVDLEVBQUFBLENBQUEsS0FBZSxDQW1ObkIsV0FBQSxDQUFZNkMsQ0FBQUEsQ0FBd0QsQ0FuTmhFL0MsQ0FBQUEsQ0FBQSxJQUFBLENBQUEwQixDQUFBQSxDQUFBQSxDQUVLc0IsQ0FBQUEsQ0FBQUEsS0FBQUEsQ0FBQUEsQ0FBQUEsQ0FDQUMsQ0FBQUEsQ0FBQUEsSUFBQUEsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FDQUMsRUFBQUEsSUFBQUEsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FDQUMsQ0FBQUEsQ0FBQUEsSUFBQUEsQ0FBQUEsRUFBQUEsQ0FBQUEsQ0FDQUMsQ0FBQUEsQ0FBQUEsSUFBQUEsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FDQUMsRUFBQUEsSUFBQUEsQ0FBQUEsRUFBQUEsQ0FBQUEsQ0FDQUMsQ0FBQUEsQ0FBQUEsSUFBQUEsQ0FBQUEsRUFBQUEsQ0FBQUEsQ0FDQUMsQ0FBQUEsQ0FBQUEsSUFBQUEsQ0FBQUEsRUFBQUEsQ0FBQUEsQ0FZVHpFLEVBQUEsSUFBQSxDQUFBLEtBQUEsQ0FBQSxDQUtBQSxDQUFBQSxDQUFBLElBQUEsQ0FBQSxlQUFBLENBQUEsQ0FJQUEsQ0FBQUEsQ0FBQSxJQUFBLENBQUEsY0FBQSxDQUFBLENBSUFBLENBQUFBLENBQUEsSUFBQSxDQUFBLGdCQUFBLENBQUEsQ0FJQUEsQ0FBQUEsQ0FBQSx1QkFJQUEsQ0FBQUEsQ0FBQSxJQUFBLENBQUEsWUFBQSxDQUFBLENBS0FBLENBQUFBLENBQUEsSUFBQSxDQUFBLGdCQUFBLENBQUEsQ0FJQUEsRUFBQSxJQUFBLENBQUEsYUFBQSxDQUFBLENBSUFBLENBQUFBLENBQUEsSUFBQSxDQUFBLGNBQUEsQ0FBQSxDQUlBQSxDQUFBQSxDQUFBLHdCQUlBQSxDQUFBQSxDQUFBLElBQUEsQ0FBQSwwQkFBQSxDQUFBLENBSUFBLENBQUFBLENBQUEsSUFBQSxDQUFBLG9CQUFBLENBQUEsQ0FJQUEsQ0FBQUEsQ0FBQSxJQUFBLENBQUEsd0JBQUEsQ0FBQSxDQUlBQSxDQUFBQSxDQUFBLElBQUEsQ0FBQSw0QkFBQSxDQUFBLENBSUFBLEVBQUEsSUFBQSxDQUFBLGtCQUFBLENBQUEsQ0FHQTBFLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLEVBQUFBLElBQUFBLENBQUFBLEVBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLEdBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLEdBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLEtBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLEVBQUFBLElBQUFBLENBQUFBLEVBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLEVBQUFBLENBQUFBLENBQ0FDLEVBQUFBLElBQUFBLENBQUFBLEVBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBRUFDLEVBQUFBLElBQUFBLENBQUFBLEVBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLEVBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLEVBQUFBLElBQUFBLENBQUFBLEVBQUFBLENBQUFBLENBMlhBQyxDQUFBQSxDQUFBQSxJQUFBQSxDQUFB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ckMsR0FBSUEsQ0FBQUEsQ0FBUSxDQUFBLEVBQUtBLENBQUFBLEVBQVMsSUFBQSxDQUFLLE1BQU0sTUFBQSxDQUNqQyxPQUFBdEosQ0FBQUEsQ0FBTyxJQUFBLENBQUsscUNBQXFDLENBQUEsQ0FDMUMsT0FBQSxDQUVYLEdBQUksQ0FDQSxJQUFJa1IsQ0FBQUEsQ0FBTyxJQUFBLENBQUssS0FBQSxDQUFNNUgsQ0FBSyxDQUFBLENBRTNCLE9BQUEsQ0FBQSxDQUFBLENBRGlCLEVBQUEsQ0FBQWtKLE9BQUFBLEVBQUt0QixFQUFLLFFBQUEsRUFBUyxDQUFFLGlCQUFBLEVBQW1CLEVBQ3ZDLFFBQUEsRUFDdEIsQ0FBQSxNQUFTeFIsQ0FBQUEsQ0FBRyxDQUNSLE9BQUFNLENBQUFBLENBQU8sSUFBQSxDQUFLLHNDQUF1Q04sQ0FBQyxDQUFBLENBQzdDLE9BQ1gsQ0FDSixDQUNKLEVFNURlLFNBQVIrUyxFQUFBQSxDQUNIeEUsQ0FBQUEsQ0FDQStDLEVBQ0FGLENBQUFBLENBQ1EsQ0FDUixJQUFJNUMsQ0FBQUEsQ0FBUSxJQUFJcUUsRUFBQUEsQ0FBU3RFLENBQUFBLENBQUkrQyxDQUFBQSxDQUFPRixDQUFLLENBQUEsQ0FDekMsT0FBQXZDLEVBQUFBLENBQWlCLEdBQUEsQ0FBSUwsQ0FBSyxDQUFBLENBQ25CQSxDQUNYLENDYUEsSUFBTXdFLEdBQXVDLElBQUl2QyIsImZpbGUiOiJuYXJyYXRpb24uY2pzIiwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdHJvb3QuQ3J5cHRvSlMgPSBmYWN0b3J5KCk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuXG5cdC8qZ2xvYmFscyB3aW5kb3csIGdsb2JhbCwgcmVxdWlyZSovXG5cblx0LyoqXG5cdCAqIENyeXB0b0pTIGNvcmUgY29tcG9uZW50cy5cblx0ICovXG5cdHZhciBDcnlwdG9KUyA9IENyeXB0b0pTIHx8IChmdW5jdGlvbiAoTWF0aCwgdW5kZWZpbmVkKSB7XG5cblx0ICAgIHZhciBjcnlwdG87XG5cblx0ICAgIC8vIE5hdGl2ZSBjcnlwdG8gZnJvbSB3aW5kb3cgKEJyb3dzZXIpXG5cdCAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNyeXB0bykge1xuXHQgICAgICAgIGNyeXB0byA9IHdpbmRvdy5jcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSBjcnlwdG8gaW4gd2ViIHdvcmtlciAoQnJvd3Nlcilcblx0ICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5jcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSBzZWxmLmNyeXB0bztcblx0ICAgIH1cblxuXHQgICAgLy8gTmF0aXZlIGNyeXB0byBmcm9tIHdvcmtlclxuXHQgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWxUaGlzLmNyeXB0bykge1xuXHQgICAgICAgIGNyeXB0byA9IGdsb2JhbFRoaXMuY3J5cHRvO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYXRpdmUgKGV4cGVyaW1lbnRhbCBJRSAxMSkgY3J5cHRvIGZyb20gd2luZG93IChCcm93c2VyKVxuXHQgICAgaWYgKCFjcnlwdG8gJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lm1zQ3J5cHRvKSB7XG5cdCAgICAgICAgY3J5cHRvID0gd2luZG93Lm1zQ3J5cHRvO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGZyb20gZ2xvYmFsIChOb2RlSlMpXG5cdCAgICBpZiAoIWNyeXB0byAmJiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwuY3J5cHRvKSB7XG5cdCAgICAgICAgY3J5cHRvID0gZ2xvYmFsLmNyeXB0bztcblx0ICAgIH1cblxuXHQgICAgLy8gTmF0aXZlIGNyeXB0byBpbXBvcnQgdmlhIHJlcXVpcmUgKE5vZGVKUylcblx0ICAgIGlmICghY3J5cHRvICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cdCAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuXHQgICAgfVxuXG5cdCAgICAvKlxuXHQgICAgICogQ3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHBzZXVkb3JhbmRvbSBudW1iZXIgZ2VuZXJhdG9yXG5cdCAgICAgKlxuXHQgICAgICogQXMgTWF0aC5yYW5kb20oKSBpcyBjcnlwdG9ncmFwaGljYWxseSBub3Qgc2FmZSB0byB1c2Vcblx0ICAgICAqL1xuXHQgICAgdmFyIGNyeXB0b1NlY3VyZVJhbmRvbUludCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAoY3J5cHRvKSB7XG5cdCAgICAgICAgICAgIC8vIFVzZSBnZXRSYW5kb21WYWx1ZXMgbWV0aG9kIChCcm93c2VyKVxuXHQgICAgICAgICAgICBpZiAodHlwZW9mIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KDEpKVswXTtcblx0ICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge31cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFVzZSByYW5kb21CeXRlcyBtZXRob2QgKE5vZGVKUylcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8ucmFuZG9tQnl0ZXMgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21CeXRlcyg0KS5yZWFkSW50MzJMRSgpO1xuXHQgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOYXRpdmUgY3J5cHRvIG1vZHVsZSBjb3VsZCBub3QgYmUgdXNlZCB0byBnZXQgc2VjdXJlIHJhbmRvbSBudW1iZXIuJyk7XG5cdCAgICB9O1xuXG5cdCAgICAvKlxuXHQgICAgICogTG9jYWwgcG9seWZpbGwgb2YgT2JqZWN0LmNyZWF0ZVxuXG5cdCAgICAgKi9cblx0ICAgIHZhciBjcmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8IChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgZnVuY3Rpb24gRigpIHt9XG5cblx0ICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG9iaikge1xuXHQgICAgICAgICAgICB2YXIgc3VidHlwZTtcblxuXHQgICAgICAgICAgICBGLnByb3RvdHlwZSA9IG9iajtcblxuXHQgICAgICAgICAgICBzdWJ0eXBlID0gbmV3IEYoKTtcblxuXHQgICAgICAgICAgICBGLnByb3RvdHlwZSA9IG51bGw7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHN1YnR5cGU7XG5cdCAgICAgICAgfTtcblx0ICAgIH0oKSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQ3J5cHRvSlMgbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQyA9IHt9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIExpYnJhcnkgbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYiA9IHt9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEJhc2Ugb2JqZWN0IGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQmFzZSA9IENfbGliLkJhc2UgPSAoZnVuY3Rpb24gKCkge1xuXG5cblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIHRoaXMgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3ZlcnJpZGVzIFByb3BlcnRpZXMgdG8gY29weSBpbnRvIHRoZSBuZXcgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBuZXcgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICB2YXIgTXlUeXBlID0gQ3J5cHRvSlMubGliLkJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAgICAgICogICAgICAgICBmaWVsZDogJ3ZhbHVlJyxcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgICAgICBtZXRob2Q6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICogICAgICAgICB9XG5cdCAgICAgICAgICAgICAqICAgICB9KTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIGV4dGVuZDogZnVuY3Rpb24gKG92ZXJyaWRlcykge1xuXHQgICAgICAgICAgICAgICAgLy8gU3Bhd25cblx0ICAgICAgICAgICAgICAgIHZhciBzdWJ0eXBlID0gY3JlYXRlKHRoaXMpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBBdWdtZW50XG5cdCAgICAgICAgICAgICAgICBpZiAob3ZlcnJpZGVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3VidHlwZS5taXhJbihvdmVycmlkZXMpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBDcmVhdGUgZGVmYXVsdCBpbml0aWFsaXplclxuXHQgICAgICAgICAgICAgICAgaWYgKCFzdWJ0eXBlLmhhc093blByb3BlcnR5KCdpbml0JykgfHwgdGhpcy5pbml0ID09PSBzdWJ0eXBlLmluaXQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUuJHN1cGVyLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplcidzIHByb3RvdHlwZSBpcyB0aGUgc3VidHlwZSBvYmplY3Rcblx0ICAgICAgICAgICAgICAgIHN1YnR5cGUuaW5pdC5wcm90b3R5cGUgPSBzdWJ0eXBlO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBSZWZlcmVuY2Ugc3VwZXJ0eXBlXG5cdCAgICAgICAgICAgICAgICBzdWJ0eXBlLiRzdXBlciA9IHRoaXM7XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBzdWJ0eXBlO1xuXHQgICAgICAgICAgICB9LFxuXG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBFeHRlbmRzIHRoaXMgb2JqZWN0IGFuZCBydW5zIHRoZSBpbml0IG1ldGhvZC5cblx0ICAgICAgICAgICAgICogQXJndW1lbnRzIHRvIGNyZWF0ZSgpIHdpbGwgYmUgcGFzc2VkIHRvIGluaXQoKS5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgbmV3IG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgdmFyIGluc3RhbmNlID0gTXlUeXBlLmNyZWF0ZSgpO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgY3JlYXRlOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLmV4dGVuZCgpO1xuXHQgICAgICAgICAgICAgICAgaW5zdGFuY2UuaW5pdC5hcHBseShpbnN0YW5jZSwgYXJndW1lbnRzKTtcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuXHQgICAgICAgICAgICB9LFxuXG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBhZGQgc29tZSBsb2dpYyB3aGVuIHlvdXIgb2JqZWN0cyBhcmUgY3JlYXRlZC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIHZhciBNeVR5cGUgPSBDcnlwdG9KUy5saWIuQmFzZS5leHRlbmQoe1xuXHQgICAgICAgICAgICAgKiAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICogICAgICAgICAgICAgLy8gLi4uXG5cdCAgICAgICAgICAgICAqICAgICAgICAgfVxuXHQgICAgICAgICAgICAgKiAgICAgfSk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIENvcGllcyBwcm9wZXJ0aWVzIGludG8gdGhpcyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIHRvIG1peCBpbi5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIE15VHlwZS5taXhJbih7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgZmllbGQ6ICd2YWx1ZSdcblx0ICAgICAgICAgICAgICogICAgIH0pO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgbWl4SW46IGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3BlcnR5TmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gSUUgd29uJ3QgY29weSB0b1N0cmluZyB1c2luZyB0aGUgbG9vcCBhYm92ZVxuXHQgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoJ3RvU3RyaW5nJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvU3RyaW5nID0gcHJvcGVydGllcy50b1N0cmluZztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGNsb25lLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgdmFyIGNsb25lID0gaW5zdGFuY2UuY2xvbmUoKTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbml0LnByb3RvdHlwZS5leHRlbmQodGhpcyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgfSgpKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBbiBhcnJheSBvZiAzMi1iaXQgd29yZHMuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtBcnJheX0gd29yZHMgVGhlIGFycmF5IG9mIDMyLWJpdCB3b3Jkcy5cblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaWdCeXRlcyBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJ5dGVzIGluIHRoaXMgd29yZCBhcnJheS5cblx0ICAgICAqL1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheSA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHdvcmRzIChPcHRpb25hbCkgQW4gYXJyYXkgb2YgMzItYml0IHdvcmRzLlxuXHQgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaWdCeXRlcyAoT3B0aW9uYWwpIFRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYnl0ZXMgaW4gdGhlIHdvcmRzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5jcmVhdGUoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFsweDAwMDEwMjAzLCAweDA0MDUwNjA3XSk7XG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZShbMHgwMDAxMDIwMywgMHgwNDA1MDYwN10sIDYpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uICh3b3Jkcywgc2lnQnl0ZXMpIHtcblx0ICAgICAgICAgICAgd29yZHMgPSB0aGlzLndvcmRzID0gd29yZHMgfHwgW107XG5cblx0ICAgICAgICAgICAgaWYgKHNpZ0J5dGVzICE9IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5zaWdCeXRlcyA9IHNpZ0J5dGVzO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5zaWdCeXRlcyA9IHdvcmRzLmxlbmd0aCAqIDQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgdGhpcyB3b3JkIGFycmF5IHRvIGEgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtFbmNvZGVyfSBlbmNvZGVyIChPcHRpb25hbCkgVGhlIGVuY29kaW5nIHN0cmF0ZWd5IHRvIHVzZS4gRGVmYXVsdDogQ3J5cHRvSlMuZW5jLkhleFxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgc3RyaW5naWZpZWQgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IHdvcmRBcnJheSArICcnO1xuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gd29yZEFycmF5LnRvU3RyaW5nKCk7XG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSB3b3JkQXJyYXkudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoZW5jb2Rlcikge1xuXHQgICAgICAgICAgICByZXR1cm4gKGVuY29kZXIgfHwgSGV4KS5zdHJpbmdpZnkodGhpcyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbmNhdGVuYXRlcyBhIHdvcmQgYXJyYXkgdG8gdGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheSB0byBhcHBlbmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoaXMgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgd29yZEFycmF5MS5jb25jYXQod29yZEFycmF5Mik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY29uY2F0OiBmdW5jdGlvbiAod29yZEFycmF5KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgdGhpc1dvcmRzID0gdGhpcy53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHRoYXRXb3JkcyA9IHdvcmRBcnJheS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHRoaXNTaWdCeXRlcyA9IHRoaXMuc2lnQnl0ZXM7XG5cdCAgICAgICAgICAgIHZhciB0aGF0U2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ2xhbXAgZXhjZXNzIGJpdHNcblx0ICAgICAgICAgICAgdGhpcy5jbGFtcCgpO1xuXG5cdCAgICAgICAgICAgIC8vIENvbmNhdFxuXHQgICAgICAgICAgICBpZiAodGhpc1NpZ0J5dGVzICUgNCkge1xuXHQgICAgICAgICAgICAgICAgLy8gQ29weSBvbmUgYnl0ZSBhdCBhIHRpbWVcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhhdFNpZ0J5dGVzOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdEJ5dGUgPSAodGhhdFdvcmRzW2kgPj4+IDJdID4+PiAoMjQgLSAoaSAlIDQpICogOCkpICYgMHhmZjtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzV29yZHNbKHRoaXNTaWdCeXRlcyArIGkpID4+PiAyXSB8PSB0aGF0Qnl0ZSA8PCAoMjQgLSAoKHRoaXNTaWdCeXRlcyArIGkpICUgNCkgKiA4KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIC8vIENvcHkgb25lIHdvcmQgYXQgYSB0aW1lXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoYXRTaWdCeXRlczsgaiArPSA0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpc1dvcmRzWyh0aGlzU2lnQnl0ZXMgKyBqKSA+Pj4gMl0gPSB0aGF0V29yZHNbaiA+Pj4gMl07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5zaWdCeXRlcyArPSB0aGF0U2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ2hhaW5hYmxlXG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBSZW1vdmVzIGluc2lnbmlmaWNhbnQgYml0cy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgd29yZEFycmF5LmNsYW1wKCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2xhbXA6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IHRoaXMud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBzaWdCeXRlcyA9IHRoaXMuc2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ2xhbXBcblx0ICAgICAgICAgICAgd29yZHNbc2lnQnl0ZXMgPj4+IDJdICY9IDB4ZmZmZmZmZmYgPDwgKDMyIC0gKHNpZ0J5dGVzICUgNCkgKiA4KTtcblx0ICAgICAgICAgICAgd29yZHMubGVuZ3RoID0gTWF0aC5jZWlsKHNpZ0J5dGVzIC8gNCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGNsb25lLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2xvbmUgPSB3b3JkQXJyYXkuY2xvbmUoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgY2xvbmUgPSBCYXNlLmNsb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGNsb25lLndvcmRzID0gdGhpcy53b3Jkcy5zbGljZSgwKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gY2xvbmU7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSB3b3JkIGFycmF5IGZpbGxlZCB3aXRoIHJhbmRvbSBieXRlcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuQnl0ZXMgVGhlIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gZ2VuZXJhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSByYW5kb20gd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkucmFuZG9tKDE2KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICByYW5kb206IGZ1bmN0aW9uIChuQnl0ZXMpIHtcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gW107XG5cblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuQnl0ZXM7IGkgKz0gNCkge1xuXHQgICAgICAgICAgICAgICAgd29yZHMucHVzaChjcnlwdG9TZWN1cmVSYW5kb21JbnQoKSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHdvcmRzLCBuQnl0ZXMpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEVuY29kZXIgbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19lbmMgPSBDLmVuYyA9IHt9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEhleCBlbmNvZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEhleCA9IENfZW5jLkhleCA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBoZXggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGhleCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBoZXhTdHJpbmcgPSBDcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgaGV4Q2hhcnMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWdCeXRlczsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYml0ZSA9ICh3b3Jkc1tpID4+PiAyXSA+Pj4gKDI0IC0gKGkgJSA0KSAqIDgpKSAmIDB4ZmY7XG5cdCAgICAgICAgICAgICAgICBoZXhDaGFycy5wdXNoKChiaXRlID4+PiA0KS50b1N0cmluZygxNikpO1xuXHQgICAgICAgICAgICAgICAgaGV4Q2hhcnMucHVzaCgoYml0ZSAmIDB4MGYpLnRvU3RyaW5nKDE2KSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gaGV4Q2hhcnMuam9pbignJyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgaGV4IHN0cmluZyB0byBhIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaGV4U3RyIFRoZSBoZXggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5IZXgucGFyc2UoaGV4U3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKGhleFN0cikge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgaGV4U3RyTGVuZ3RoID0gaGV4U3RyLmxlbmd0aDtcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhleFN0ckxlbmd0aDsgaSArPSAyKSB7XG5cdCAgICAgICAgICAgICAgICB3b3Jkc1tpID4+PiAzXSB8PSBwYXJzZUludChoZXhTdHIuc3Vic3RyKGksIDIpLCAxNikgPDwgKDI0IC0gKGkgJSA4KSAqIDQpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdCh3b3JkcywgaGV4U3RyTGVuZ3RoIC8gMik7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBMYXRpbjEgZW5jb2Rpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBMYXRpbjEgPSBDX2VuYy5MYXRpbjEgPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSB3b3JkIGFycmF5IHRvIGEgTGF0aW4xIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBMYXRpbjEgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgbGF0aW4xU3RyaW5nID0gQ3J5cHRvSlMuZW5jLkxhdGluMS5zdHJpbmdpZnkod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IHdvcmRBcnJheS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHNpZ0J5dGVzID0gd29yZEFycmF5LnNpZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgdmFyIGxhdGluMUNoYXJzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2lnQnl0ZXM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgdmFyIGJpdGUgPSAod29yZHNbaSA+Pj4gMl0gPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgJiAweGZmO1xuXHQgICAgICAgICAgICAgICAgbGF0aW4xQ2hhcnMucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGJpdGUpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBsYXRpbjFDaGFycy5qb2luKCcnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBMYXRpbjEgc3RyaW5nIHRvIGEgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXRpbjFTdHIgVGhlIExhdGluMSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLkxhdGluMS5wYXJzZShsYXRpbjFTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAobGF0aW4xU3RyKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBsYXRpbjFTdHJMZW5ndGggPSBsYXRpbjFTdHIubGVuZ3RoO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGF0aW4xU3RyTGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRzW2kgPj4+IDJdIHw9IChsYXRpbjFTdHIuY2hhckNvZGVBdChpKSAmIDB4ZmYpIDw8ICgyNCAtIChpICUgNCkgKiA4KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgV29yZEFycmF5LmluaXQod29yZHMsIGxhdGluMVN0ckxlbmd0aCk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBVVEYtOCBlbmNvZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIFV0ZjggPSBDX2VuYy5VdGY4ID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIFVURi04IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBVVEYtOCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB1dGY4U3RyaW5nID0gQ3J5cHRvSlMuZW5jLlV0Zjguc3RyaW5naWZ5KHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShMYXRpbjEuc3RyaW5naWZ5KHdvcmRBcnJheSkpKTtcblx0ICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYWxmb3JtZWQgVVRGLTggZGF0YScpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgVVRGLTggc3RyaW5nIHRvIGEgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1dGY4U3RyIFRoZSBVVEYtOCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UodXRmOFN0cmluZyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFyc2U6IGZ1bmN0aW9uICh1dGY4U3RyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBMYXRpbjEucGFyc2UodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHV0ZjhTdHIpKSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBYnN0cmFjdCBidWZmZXJlZCBibG9jayBhbGdvcml0aG0gdGVtcGxhdGUuXG5cdCAgICAgKlxuXHQgICAgICogVGhlIHByb3BlcnR5IGJsb2NrU2l6ZSBtdXN0IGJlIGltcGxlbWVudGVkIGluIGEgY29uY3JldGUgc3VidHlwZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gX21pbkJ1ZmZlclNpemUgVGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBzaG91bGQgYmUga2VwdCB1bnByb2Nlc3NlZCBpbiB0aGUgYnVmZmVyLiBEZWZhdWx0OiAwXG5cdCAgICAgKi9cblx0ICAgIHZhciBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtID0gQ19saWIuQnVmZmVyZWRCbG9ja0FsZ29yaXRobSA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBSZXNldHMgdGhpcyBibG9jayBhbGdvcml0aG0ncyBkYXRhIGJ1ZmZlciB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5yZXNldCgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIEluaXRpYWwgdmFsdWVzXG5cdCAgICAgICAgICAgIHRoaXMuX2RhdGEgPSBuZXcgV29yZEFycmF5LmluaXQoKTtcblx0ICAgICAgICAgICAgdGhpcy5fbkRhdGFCeXRlcyA9IDA7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEFkZHMgbmV3IGRhdGEgdG8gdGhpcyBibG9jayBhbGdvcml0aG0ncyBidWZmZXIuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGRhdGEgVGhlIGRhdGEgdG8gYXBwZW5kLiBTdHJpbmdzIGFyZSBjb252ZXJ0ZWQgdG8gYSBXb3JkQXJyYXkgdXNpbmcgVVRGLTguXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX2FwcGVuZCgnZGF0YScpO1xuXHQgICAgICAgICAqICAgICBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLl9hcHBlbmQod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfYXBwZW5kOiBmdW5jdGlvbiAoZGF0YSkge1xuXHQgICAgICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBXb3JkQXJyYXksIGVsc2UgYXNzdW1lIFdvcmRBcnJheSBhbHJlYWR5XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnc3RyaW5nJykge1xuXHQgICAgICAgICAgICAgICAgZGF0YSA9IFV0ZjgucGFyc2UoZGF0YSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBBcHBlbmRcblx0ICAgICAgICAgICAgdGhpcy5fZGF0YS5jb25jYXQoZGF0YSk7XG5cdCAgICAgICAgICAgIHRoaXMuX25EYXRhQnl0ZXMgKz0gZGF0YS5zaWdCeXRlcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUHJvY2Vzc2VzIGF2YWlsYWJsZSBkYXRhIGJsb2Nrcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIFRoaXMgbWV0aG9kIGludm9rZXMgX2RvUHJvY2Vzc0Jsb2NrKG9mZnNldCksIHdoaWNoIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSBjb25jcmV0ZSBzdWJ0eXBlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBkb0ZsdXNoIFdoZXRoZXIgYWxsIGJsb2NrcyBhbmQgcGFydGlhbCBibG9ja3Mgc2hvdWxkIGJlIHByb2Nlc3NlZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHByb2Nlc3NlZCBkYXRhLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgcHJvY2Vzc2VkRGF0YSA9IGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX3Byb2Nlc3MoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHByb2Nlc3NlZERhdGEgPSBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLl9wcm9jZXNzKCEhJ2ZsdXNoJyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX3Byb2Nlc3M6IGZ1bmN0aW9uIChkb0ZsdXNoKSB7XG5cdCAgICAgICAgICAgIHZhciBwcm9jZXNzZWRXb3JkcztcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9kYXRhO1xuXHQgICAgICAgICAgICB2YXIgZGF0YVdvcmRzID0gZGF0YS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIGRhdGFTaWdCeXRlcyA9IGRhdGEuc2lnQnl0ZXM7XG5cdCAgICAgICAgICAgIHZhciBibG9ja1NpemUgPSB0aGlzLmJsb2NrU2l6ZTtcblx0ICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZUJ5dGVzID0gYmxvY2tTaXplICogNDtcblxuXHQgICAgICAgICAgICAvLyBDb3VudCBibG9ja3MgcmVhZHlcblx0ICAgICAgICAgICAgdmFyIG5CbG9ja3NSZWFkeSA9IGRhdGFTaWdCeXRlcyAvIGJsb2NrU2l6ZUJ5dGVzO1xuXHQgICAgICAgICAgICBpZiAoZG9GbHVzaCkge1xuXHQgICAgICAgICAgICAgICAgLy8gUm91bmQgdXAgdG8gaW5jbHVkZSBwYXJ0aWFsIGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgbkJsb2Nrc1JlYWR5ID0gTWF0aC5jZWlsKG5CbG9ja3NSZWFkeSk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAvLyBSb3VuZCBkb3duIHRvIGluY2x1ZGUgb25seSBmdWxsIGJsb2Nrcyxcblx0ICAgICAgICAgICAgICAgIC8vIGxlc3MgdGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBtdXN0IHJlbWFpbiBpbiB0aGUgYnVmZmVyXG5cdCAgICAgICAgICAgICAgICBuQmxvY2tzUmVhZHkgPSBNYXRoLm1heCgobkJsb2Nrc1JlYWR5IHwgMCkgLSB0aGlzLl9taW5CdWZmZXJTaXplLCAwKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIENvdW50IHdvcmRzIHJlYWR5XG5cdCAgICAgICAgICAgIHZhciBuV29yZHNSZWFkeSA9IG5CbG9ja3NSZWFkeSAqIGJsb2NrU2l6ZTtcblxuXHQgICAgICAgICAgICAvLyBDb3VudCBieXRlcyByZWFkeVxuXHQgICAgICAgICAgICB2YXIgbkJ5dGVzUmVhZHkgPSBNYXRoLm1pbihuV29yZHNSZWFkeSAqIDQsIGRhdGFTaWdCeXRlcyk7XG5cblx0ICAgICAgICAgICAgLy8gUHJvY2VzcyBibG9ja3Ncblx0ICAgICAgICAgICAgaWYgKG5Xb3Jkc1JlYWR5KSB7XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBuV29yZHNSZWFkeTsgb2Zmc2V0ICs9IGJsb2NrU2l6ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtYWxnb3JpdGhtIGxvZ2ljXG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG9Qcm9jZXNzQmxvY2soZGF0YVdvcmRzLCBvZmZzZXQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBSZW1vdmUgcHJvY2Vzc2VkIHdvcmRzXG5cdCAgICAgICAgICAgICAgICBwcm9jZXNzZWRXb3JkcyA9IGRhdGFXb3Jkcy5zcGxpY2UoMCwgbldvcmRzUmVhZHkpO1xuXHQgICAgICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyAtPSBuQnl0ZXNSZWFkeTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFJldHVybiBwcm9jZXNzZWQgd29yZHNcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdChwcm9jZXNzZWRXb3JkcywgbkJ5dGVzUmVhZHkpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGNsb25lLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2xvbmUgPSBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLmNsb25lKCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb25lID0gQmFzZS5jbG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgICAgICBjbG9uZS5fZGF0YSA9IHRoaXMuX2RhdGEuY2xvbmUoKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gY2xvbmU7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9taW5CdWZmZXJTaXplOiAwXG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBYnN0cmFjdCBoYXNoZXIgdGVtcGxhdGUuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGJsb2NrU2l6ZSBUaGUgbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyB0aGlzIGhhc2hlciBvcGVyYXRlcyBvbi4gRGVmYXVsdDogMTYgKDUxMiBiaXRzKVxuXHQgICAgICovXG5cdCAgICB2YXIgSGFzaGVyID0gQ19saWIuSGFzaGVyID0gQnVmZmVyZWRCbG9ja0FsZ29yaXRobS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IEJhc2UuZXh0ZW5kKCksXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgaGFzaGVyLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIGhhc2ggY29tcHV0YXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBoYXNoZXIgPSBDcnlwdG9KUy5hbGdvLlNIQTI1Ni5jcmVhdGUoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBpbml0OiBmdW5jdGlvbiAoY2ZnKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0c1xuXHQgICAgICAgICAgICB0aGlzLmNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlc1xuXHQgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlc2V0cyB0aGlzIGhhc2hlciB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgaGFzaGVyLnJlc2V0KCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gUmVzZXQgZGF0YSBidWZmZXJcblx0ICAgICAgICAgICAgQnVmZmVyZWRCbG9ja0FsZ29yaXRobS5yZXNldC5jYWxsKHRoaXMpO1xuXG5cdCAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtaGFzaGVyIGxvZ2ljXG5cdCAgICAgICAgICAgIHRoaXMuX2RvUmVzZXQoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogVXBkYXRlcyB0aGlzIGhhc2hlciB3aXRoIGEgbWVzc2FnZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZVVwZGF0ZSBUaGUgbWVzc2FnZSB0byBhcHBlbmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtIYXNoZXJ9IFRoaXMgaGFzaGVyLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBoYXNoZXIudXBkYXRlKCdtZXNzYWdlJyk7XG5cdCAgICAgICAgICogICAgIGhhc2hlci51cGRhdGUod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uIChtZXNzYWdlVXBkYXRlKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGVuZFxuXHQgICAgICAgICAgICB0aGlzLl9hcHBlbmQobWVzc2FnZVVwZGF0ZSk7XG5cblx0ICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBoYXNoXG5cdCAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3MoKTtcblxuXHQgICAgICAgICAgICAvLyBDaGFpbmFibGVcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEZpbmFsaXplcyB0aGUgaGFzaCBjb21wdXRhdGlvbi5cblx0ICAgICAgICAgKiBOb3RlIHRoYXQgdGhlIGZpbmFsaXplIG9wZXJhdGlvbiBpcyBlZmZlY3RpdmVseSBhIGRlc3RydWN0aXZlLCByZWFkLW9uY2Ugb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlVXBkYXRlIChPcHRpb25hbCkgQSBmaW5hbCBtZXNzYWdlIHVwZGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBoYXNoID0gaGFzaGVyLmZpbmFsaXplKCk7XG5cdCAgICAgICAgICogICAgIHZhciBoYXNoID0gaGFzaGVyLmZpbmFsaXplKCdtZXNzYWdlJyk7XG5cdCAgICAgICAgICogICAgIHZhciBoYXNoID0gaGFzaGVyLmZpbmFsaXplKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZmluYWxpemU6IGZ1bmN0aW9uIChtZXNzYWdlVXBkYXRlKSB7XG5cdCAgICAgICAgICAgIC8vIEZpbmFsIG1lc3NhZ2UgdXBkYXRlXG5cdCAgICAgICAgICAgIGlmIChtZXNzYWdlVXBkYXRlKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9hcHBlbmQobWVzc2FnZVVwZGF0ZSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBQZXJmb3JtIGNvbmNyZXRlLWhhc2hlciBsb2dpY1xuXHQgICAgICAgICAgICB2YXIgaGFzaCA9IHRoaXMuX2RvRmluYWxpemUoKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gaGFzaDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgYmxvY2tTaXplOiA1MTIvMzIsXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIGEgc2hvcnRjdXQgZnVuY3Rpb24gdG8gYSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtIYXNoZXJ9IGhhc2hlciBUaGUgaGFzaGVyIHRvIGNyZWF0ZSBhIGhlbHBlciBmb3IuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIHNob3J0Y3V0IGZ1bmN0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgU0hBMjU2ID0gQ3J5cHRvSlMubGliLkhhc2hlci5fY3JlYXRlSGVscGVyKENyeXB0b0pTLmFsZ28uU0hBMjU2KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfY3JlYXRlSGVscGVyOiBmdW5jdGlvbiAoaGFzaGVyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobWVzc2FnZSwgY2ZnKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGhhc2hlci5pbml0KGNmZykuZmluYWxpemUobWVzc2FnZSk7XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSBzaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0hhc2hlcn0gaGFzaGVyIFRoZSBoYXNoZXIgdG8gdXNlIGluIHRoaXMgSE1BQyBoZWxwZXIuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIHNob3J0Y3V0IGZ1bmN0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgSG1hY1NIQTI1NiA9IENyeXB0b0pTLmxpYi5IYXNoZXIuX2NyZWF0ZUhtYWNIZWxwZXIoQ3J5cHRvSlMuYWxnby5TSEEyNTYpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9jcmVhdGVIbWFjSGVscGVyOiBmdW5jdGlvbiAoaGFzaGVyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobWVzc2FnZSwga2V5KSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENfYWxnby5ITUFDLmluaXQoaGFzaGVyLCBrZXkpLmZpbmFsaXplKG1lc3NhZ2UpO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFsZ29yaXRobSBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ28gPSB7fTtcblxuXHQgICAgcmV0dXJuIEM7XG5cdH0oTWF0aCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTO1xuXG59KSk7IiwiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlcjtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cblx0ICAgIC8vIFJldXNhYmxlIG9iamVjdFxuXHQgICAgdmFyIFcgPSBbXTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTSEEtMSBoYXNoIGFsZ29yaXRobS5cblx0ICAgICAqL1xuXHQgICAgdmFyIFNIQTEgPSBDX2FsZ28uU0hBMSA9IEhhc2hlci5leHRlbmQoe1xuXHQgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2hhc2ggPSBuZXcgV29yZEFycmF5LmluaXQoW1xuXHQgICAgICAgICAgICAgICAgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSxcblx0ICAgICAgICAgICAgICAgIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsXG5cdCAgICAgICAgICAgICAgICAweGMzZDJlMWYwXG5cdCAgICAgICAgICAgIF0pO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIEggPSB0aGlzLl9oYXNoLndvcmRzO1xuXG5cdCAgICAgICAgICAgIC8vIFdvcmtpbmcgdmFyaWFibGVzXG5cdCAgICAgICAgICAgIHZhciBhID0gSFswXTtcblx0ICAgICAgICAgICAgdmFyIGIgPSBIWzFdO1xuXHQgICAgICAgICAgICB2YXIgYyA9IEhbMl07XG5cdCAgICAgICAgICAgIHZhciBkID0gSFszXTtcblx0ICAgICAgICAgICAgdmFyIGUgPSBIWzRdO1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGF0aW9uXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODA7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgaWYgKGkgPCAxNikge1xuXHQgICAgICAgICAgICAgICAgICAgIFdbaV0gPSBNW29mZnNldCArIGldIHwgMDtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBXW2kgLSAzXSBeIFdbaSAtIDhdIF4gV1tpIC0gMTRdIF4gV1tpIC0gMTZdO1xuXHQgICAgICAgICAgICAgICAgICAgIFdbaV0gPSAobiA8PCAxKSB8IChuID4+PiAzMSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHZhciB0ID0gKChhIDw8IDUpIHwgKGEgPj4+IDI3KSkgKyBlICsgV1tpXTtcblx0ICAgICAgICAgICAgICAgIGlmIChpIDwgMjApIHtcblx0ICAgICAgICAgICAgICAgICAgICB0ICs9ICgoYiAmIGMpIHwgKH5iICYgZCkpICsgMHg1YTgyNzk5OTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDQwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdCArPSAoYiBeIGMgXiBkKSArIDB4NmVkOWViYTE7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCA2MCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHQgKz0gKChiICYgYykgfCAoYiAmIGQpIHwgKGMgJiBkKSkgLSAweDcwZTQ0MzI0O1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChpIDwgODApICovIHtcblx0ICAgICAgICAgICAgICAgICAgICB0ICs9IChiIF4gYyBeIGQpIC0gMHgzNTlkM2UyYTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgZSA9IGQ7XG5cdCAgICAgICAgICAgICAgICBkID0gYztcblx0ICAgICAgICAgICAgICAgIGMgPSAoYiA8PCAzMCkgfCAoYiA+Pj4gMik7XG5cdCAgICAgICAgICAgICAgICBiID0gYTtcblx0ICAgICAgICAgICAgICAgIGEgPSB0O1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gSW50ZXJtZWRpYXRlIGhhc2ggdmFsdWVcblx0ICAgICAgICAgICAgSFswXSA9IChIWzBdICsgYSkgfCAwO1xuXHQgICAgICAgICAgICBIWzFdID0gKEhbMV0gKyBiKSB8IDA7XG5cdCAgICAgICAgICAgIEhbMl0gPSAoSFsyXSArIGMpIHwgMDtcblx0ICAgICAgICAgICAgSFszXSA9IChIWzNdICsgZCkgfCAwO1xuXHQgICAgICAgICAgICBIWzRdID0gKEhbNF0gKyBlKSB8IDA7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG5cdCAgICAgICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzO1xuXG5cdCAgICAgICAgICAgIHZhciBuQml0c1RvdGFsID0gdGhpcy5fbkRhdGFCeXRlcyAqIDg7XG5cdCAgICAgICAgICAgIHZhciBuQml0c0xlZnQgPSBkYXRhLnNpZ0J5dGVzICogODtcblxuXHQgICAgICAgICAgICAvLyBBZGQgcGFkZGluZ1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbbkJpdHNMZWZ0ID4+PiA1XSB8PSAweDgwIDw8ICgyNCAtIG5CaXRzTGVmdCAlIDMyKTtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNF0gPSBNYXRoLmZsb29yKG5CaXRzVG90YWwgLyAweDEwMDAwMDAwMCk7XG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1soKChuQml0c0xlZnQgKyA2NCkgPj4+IDkpIDw8IDQpICsgMTVdID0gbkJpdHNUb3RhbDtcblx0ICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyA9IGRhdGFXb3Jkcy5sZW5ndGggKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIEhhc2ggZmluYWwgYmxvY2tzXG5cdCAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3MoKTtcblxuXHQgICAgICAgICAgICAvLyBSZXR1cm4gZmluYWwgY29tcHV0ZWQgaGFzaFxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFzaDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb25lID0gSGFzaGVyLmNsb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGNsb25lLl9oYXNoID0gdGhpcy5faGFzaC5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTEoJ21lc3NhZ2UnKTtcblx0ICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTEod29yZEFycmF5KTtcblx0ICAgICAqL1xuXHQgICAgQy5TSEExID0gSGFzaGVyLl9jcmVhdGVIZWxwZXIoU0hBMSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIEhNQUMncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBrZXkgVGhlIHNlY3JldCBrZXkuXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgSE1BQy5cblx0ICAgICAqXG5cdCAgICAgKiBAc3RhdGljXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGhtYWMgPSBDcnlwdG9KUy5IbWFjU0hBMShtZXNzYWdlLCBrZXkpO1xuXHQgICAgICovXG5cdCAgICBDLkhtYWNTSEExID0gSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKFNIQTEpO1xuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLlNIQTE7XG5cbn0pKTsiLCJleHBvcnQgY29uc3QgU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUyA9IHtcbiAgICAvKipcbiAgICAgKiBUaGUga2V5IG9mIHRoZSBjdXJyZW50IGRpYWxvZ3VlIG1lbW9yeVxuICAgICAqL1xuICAgIENVUlJFTlRfRElBTE9HVUVfTUVNT1JZX0tFWTogXCJfX19jdXJyZW50X2RpYWxvZ3VlX21lbW9yeV9fX1wiLFxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIGxhc3QgZGlhbG9ndWUgYWRkZWQgaW4gdGhlIHN0ZXAgbWVtb3J5XG4gICAgICovXG4gICAgTEFTVF9ESUFMT0dVRV9BRERFRF9JTl9TVEVQX01FTU9SWV9LRVk6IFwiX19fbGFzdF9kaWFsb2d1ZV9hZGRlZF9pbl9zdGVwX21lbW9yeV9fX1wiLFxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgbWVudSBvcHRpb25zIG1lbW9yeVxuICAgICAqL1xuICAgIENVUlJFTlRfTUVOVV9PUFRJT05TX01FTU9SWV9LRVk6IFwiX19fY3VycmVudF9tZW51X29wdGlvbnNfbWVtb3J5X19fXCIsXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBvZiB0aGUgbGFzdCBtZW51IG9wdGlvbnMgYWRkZWQgaW4gdGhlIHN0ZXAgbWVtb3J5XG4gICAgICovXG4gICAgTEFTVF9NRU5VX09QVElPTlNfQURERURfSU5fU1RFUF9NRU1PUllfS0VZOiBcIl9fX2xhc3RfbWVudV9vcHRpb25zX2FkZGVkX2luX3N0ZXBfbWVtb3J5X19fXCIsXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBvZiB0aGUgaW5wdXQgbWVtb3J5LiBUaGlzIHZhbHVlIGNhbiBiZSByZWFkIGJ5IHBpeGktdm4ganNvbiBpbXBvcnRlclxuICAgICAqL1xuICAgIENVUlJFTlRfSU5QVVRfVkFMVUVfTUVNT1JZX0tFWTogXCJfaW5wdXRfdmFsdWVfXCIsXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBvZiB0aGUgbGFzdCBpbnB1dCBhZGRlZCBpbiB0aGUgc3RlcCBtZW1vcnlcbiAgICAgKi9cbiAgICBMQVNUX0lOUFVUX0FEREVEX0lOX1NURVBfTUVNT1JZX0tFWTogXCJfX19sYXN0X2lucHV0X2FkZGVkX2luX3N0ZXBfbWVtb3J5X19fXCIsXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBvZiB0aGUgY3VycmVudCBpbnB1dCBpbmZvXG4gICAgICovXG4gICAgQ1VSUkVOVF9JTlBVVF9JTkZPX01FTU9SWV9LRVk6IFwiX19fY3VycmVudF9pbnB1dF9pbmZvX21lbW9yeV9fX1wiLFxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIGNoYXJhY3RlcnMgbWVtb3J5XG4gICAgICovXG4gICAgQ0hBUkFDVEVSX0NBVEVHT1JZX0tFWTogXCJfX19jaGFyYWN0ZXJfX19cIixcbiAgICAvKipcbiAgICAgKiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gYWRkIHRoZSBuZXh0IGRpYWxvZyB0ZXh0IGludG8gdGhlIGN1cnJlbnQgZGlhbG9nIG1lbW9yeS5cbiAgICAgKiBUaGlzIHZhbHVlIHdhcyBhZGRlZCB0byBpbnRyb2R1Y2UgSW5rIEdsdWUgZnVuY3Rpb25hbGl0eSBodHRwczovL2dpdGh1Yi5jb20vaW5rbGUvaW5rL2Jsb2IvbWFzdGVyL0RvY3VtZW50YXRpb24vV3JpdGluZ1dpdGhJbmsubWQjZ2x1ZVxuICAgICAqL1xuICAgIEFERF9ORVhUX0RJQUxPR19URVhUX0lOVE9fVEhFX0NVUlJFTlRfRElBTE9HX0ZMQUdfS0VZOiBcIl9fX2dsdWVfX19cIixcbiAgICAvKipcbiAgICAgKiBUaGUga2V5IG9mIGEgbGlzdCBvZiBhbGwgbGFiZWxzIHRoYXQgaGF2ZSBiZWVuIG9wZW5lZCBkdXJpbmcgdGhlIHByb2dyZXNzaW9uIG9mIHRoZSBzdGVwcy5cbiAgICAgKi9cbiAgICBPUEVORURfTEFCRUxTX0NPVU5URVJfS0VZOiBcIl9fX29wZW5lZF9sYWJlbHNfY291bnRlcl9fX1wiLFxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgYSBsaXN0IG9mIGFsbCBjaG9pY2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgZHVyaW5nIHRoZSBwcm9ncmVzc2lvbiBvZiB0aGUgc3RlcHMuXG4gICAgICovXG4gICAgQUxMX0NIT0lDRVNfTUFERV9LRVk6IFwiX19fYWxsX2Nob2ljZXNfbWFkZV9fX1wiLFxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgc3RlcCB0aW1lcyBjb3VudGVyLlxuICAgICAqIFRoaXMgdmFsdWUgd2FzIGFkZGVkIHRvIGludHJvZHVjZSBJbmsgU2VxdWVuY2VzLCBjeWNsZXMgYW5kIG90aGVyIGFsdGVybmF0aXZlcyBodHRwczovL2dpdGh1Yi5jb20vaW5rbGUvaW5rL2Jsb2IvbWFzdGVyL0RvY3VtZW50YXRpb24vV3JpdGluZ1dpdGhJbmsubWQjc2VxdWVuY2VzLWN5Y2xlcy1hbmQtb3RoZXItYWx0ZXJuYXRpdmVzXG4gICAgICovXG4gICAgQ1VSUkVOVF9TVEVQX1RJTUVTX0NPVU5URVJfS0VZOiBcIl9fX2N1cnJlbnRfc3RlcF90aW1lc19jb3VudGVyX19fXCIsXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBvZiB0aGUgbGFzdCBkaWFsb2d1ZSBzdGVwIGdsdWVkIGluIHRoZSBzdGVwIG1lbW9yeVxuICAgICAqL1xuICAgIExBU1RfU1RFUF9HTFVFRDogXCJfX19sYXN0X3N0ZXBfZ2x1ZWRfX19cIixcbn07XG4iLCJleHBvcnQgbmFtZXNwYWNlIGxvZ2dlciB7XG4gICAgZXhwb3J0IGNvbnN0IGxvZyA9IChtZXNzYWdlPzogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pID0+XG4gICAgICAgIGNvbnNvbGUubG9nKGBbUGl4aeKAmVZOXSAke21lc3NhZ2V9YCwgLi4ub3B0aW9uYWxQYXJhbXMpO1xuICAgIGV4cG9ydCBjb25zdCB3YXJuID0gKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkgPT5cbiAgICAgICAgY29uc29sZS53YXJuKGBbUGl4aeKAmVZOXSAke21lc3NhZ2V9YCwgLi4ub3B0aW9uYWxQYXJhbXMpO1xuICAgIGV4cG9ydCBjb25zdCBlcnJvciA9IChtZXNzYWdlPzogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pID0+XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtQaXhp4oCZVk5dICR7bWVzc2FnZX1gLCAuLi5vcHRpb25hbFBhcmFtcyk7XG4gICAgZXhwb3J0IGNvbnN0IGluZm8gPSAobWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSA9PlxuICAgICAgICBjb25zb2xlLmluZm8oYFtQaXhp4oCZVk5dICR7bWVzc2FnZX1gLCAuLi5vcHRpb25hbFBhcmFtcyk7XG59XG4iLCJpbXBvcnQgeyBQaXhpRXJyb3IgfSBmcm9tIFwiQGRyaW5jcy9waXhpLXZuL2NvcmVcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL2xvZy11dGlsaXR5XCI7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIGRlZXAgY29weSBvZiB0aGUgZWxlbWVudFxuICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gYmUgY29waWVkXG4gKiBAcmV0dXJucyBUaGUgY29waWVkIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50PFQ+KGVsZW1lbnQ6IFQpOiBUIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIGxldCBlbGVtZW50U3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudCk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGVsZW1lbnRTdHJpbmcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgY3JlYXRpbmcgZXhwb3J0YWJsZSBlbGVtZW50XCIsIGVsZW1lbnQsIGUpO1xuICAgICAgICB0aHJvdyBuZXcgUGl4aUVycm9yKFwibm90X2pzb25fc2VyaWFsaXphYmxlXCIsIFwiRXJyb3IgY3JlYXRpbmcgZXhwb3J0YWJsZSBlbGVtZW50XCIpO1xuICAgIH1cbn1cbiIsIi8qKlxuICogQG1vZHVsZSBMUlVDYWNoZVxuICovXG5cbi8vIG1vZHVsZS1wcml2YXRlIG5hbWVzIGFuZCB0eXBlc1xuLy8gdGhpcyBwcm92aWRlcyB0aGUgZGVmYXVsdCBQZXJmIG9iamVjdCBzb3VyY2UuXG4vLyBpdCBjYW4gYmUgcGFzc2VkIGluIHZpYSBjb25maWd1cmF0aW9uIHRvIG92ZXJyaWRlIGl0XG4vLyBmb3IgYSBzaW5nbGUgTFJVIG9iamVjdC5cbmV4cG9ydCB0eXBlIFBlcmYgPSB7IG5vdzogKCkgPT4gbnVtYmVyIH1cbmNvbnN0IGRlZmF1bHRQZXJmOiBQZXJmID1cbiAgKFxuICAgIHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ29iamVjdCcgJiZcbiAgICBwZXJmb3JtYW5jZSAmJlxuICAgIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbidcbiAgKSA/XG4gICAgcGVyZm9ybWFuY2VcbiAgOiBEYXRlXG5cbmNvbnN0IHdhcm5lZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbi8vIGVpdGhlciBhIGZ1bmN0aW9uIG9yIGEgY2xhc3NcbnR5cGUgRm9yQyA9ICgoLi4uYTogYW55W10pID0+IGFueSkgfCB7IG5ldyAoLi4uYTogYW55W10pOiBhbnkgfVxuXG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbmNvbnN0IFBST0NFU1MgPSAoXG4gIHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiAhIXByb2Nlc3MgP1xuICAgIHByb2Nlc3NcbiAgOiB7fSkgYXMgeyBbazogc3RyaW5nXTogYW55IH1cbi8qIGM4IGlnbm9yZSBzdGFydCAqL1xuXG5jb25zdCBlbWl0V2FybmluZyA9IChcbiAgbXNnOiBzdHJpbmcsXG4gIHR5cGU6IHN0cmluZyxcbiAgY29kZTogc3RyaW5nLFxuICBmbjogRm9yQyxcbikgPT4ge1xuICB0eXBlb2YgUFJPQ0VTUy5lbWl0V2FybmluZyA9PT0gJ2Z1bmN0aW9uJyA/XG4gICAgUFJPQ0VTUy5lbWl0V2FybmluZyhtc2csIHR5cGUsIGNvZGUsIGZuKVxuICA6IGNvbnNvbGUuZXJyb3IoYFske2NvZGV9XSAke3R5cGV9OiAke21zZ31gKVxufVxuXG5sZXQgQUMgPSBnbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlclxubGV0IEFTID0gZ2xvYmFsVGhpcy5BYm9ydFNpZ25hbFxuXG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbmlmICh0eXBlb2YgQUMgPT09ICd1bmRlZmluZWQnKSB7XG4gIC8vQHRzLWlnbm9yZVxuICBBUyA9IGNsYXNzIEFib3J0U2lnbmFsIHtcbiAgICBvbmFib3J0PzogKC4uLmE6IGFueVtdKSA9PiBhbnlcbiAgICBfb25hYm9ydDogKCguLi5hOiBhbnlbXSkgPT4gYW55KVtdID0gW11cbiAgICByZWFzb24/OiBhbnlcbiAgICBhYm9ydGVkOiBib29sZWFuID0gZmFsc2VcbiAgICBhZGRFdmVudExpc3RlbmVyKF86IHN0cmluZywgZm46ICguLi5hOiBhbnlbXSkgPT4gYW55KSB7XG4gICAgICB0aGlzLl9vbmFib3J0LnB1c2goZm4pXG4gICAgfVxuICB9XG4gIC8vQHRzLWlnbm9yZVxuICBBQyA9IGNsYXNzIEFib3J0Q29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB3YXJuQUNQb2x5ZmlsbCgpXG4gICAgfVxuICAgIHNpZ25hbCA9IG5ldyBBUygpXG4gICAgYWJvcnQocmVhc29uOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNpZ25hbC5hYm9ydGVkKSByZXR1cm5cbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgdGhpcy5zaWduYWwucmVhc29uID0gcmVhc29uXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHRoaXMuc2lnbmFsLmFib3J0ZWQgPSB0cnVlXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGZvciAoY29uc3QgZm4gb2YgdGhpcy5zaWduYWwuX29uYWJvcnQpIHtcbiAgICAgICAgZm4ocmVhc29uKVxuICAgICAgfVxuICAgICAgdGhpcy5zaWduYWwub25hYm9ydD8uKHJlYXNvbilcbiAgICB9XG4gIH1cbiAgbGV0IHByaW50QUNQb2x5ZmlsbFdhcm5pbmcgPVxuICAgIFBST0NFU1MuZW52Py5MUlVfQ0FDSEVfSUdOT1JFX0FDX1dBUk5JTkcgIT09ICcxJ1xuICBjb25zdCB3YXJuQUNQb2x5ZmlsbCA9ICgpID0+IHtcbiAgICBpZiAoIXByaW50QUNQb2x5ZmlsbFdhcm5pbmcpIHJldHVyblxuICAgIHByaW50QUNQb2x5ZmlsbFdhcm5pbmcgPSBmYWxzZVxuICAgIGVtaXRXYXJuaW5nKFxuICAgICAgJ0Fib3J0Q29udHJvbGxlciBpcyBub3QgZGVmaW5lZC4gSWYgdXNpbmcgbHJ1LWNhY2hlIGluICcgK1xuICAgICAgICAnbm9kZSAxNCwgbG9hZCBhbiBBYm9ydENvbnRyb2xsZXIgcG9seWZpbGwgZnJvbSB0aGUgJyArXG4gICAgICAgICdgbm9kZS1hYm9ydC1jb250cm9sbGVyYCBwYWNrYWdlLiBBIG1pbmltYWwgcG9seWZpbGwgaXMgJyArXG4gICAgICAgICdwcm92aWRlZCBmb3IgdXNlIGJ5IExSVUNhY2hlLmZldGNoKCksIGJ1dCBpdCBzaG91bGQgbm90IGJlICcgK1xuICAgICAgICAncmVsaWVkIHVwb24gaW4gb3RoZXIgY29udGV4dHMgKGVnLCBwYXNzaW5nIGl0IHRvIG90aGVyIEFQSXMgdGhhdCAnICtcbiAgICAgICAgJ3VzZSBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgbWlnaHQgaGF2ZSB1bmRlc2lyYWJsZSBlZmZlY3RzKS4gJyArXG4gICAgICAgICdZb3UgbWF5IGRpc2FibGUgdGhpcyB3aXRoIExSVV9DQUNIRV9JR05PUkVfQUNfV0FSTklORz0xIGluIHRoZSBlbnYuJyxcbiAgICAgICdOT19BQk9SVF9DT05UUk9MTEVSJyxcbiAgICAgICdFTk9UU1VQJyxcbiAgICAgIHdhcm5BQ1BvbHlmaWxsLFxuICAgIClcbiAgfVxufVxuLyogYzggaWdub3JlIHN0b3AgKi9cblxuY29uc3Qgc2hvdWxkV2FybiA9IChjb2RlOiBzdHJpbmcpID0+ICF3YXJuZWQuaGFzKGNvZGUpXG5cbmNvbnN0IFRZUEUgPSBTeW1ib2woJ3R5cGUnKVxuZXhwb3J0IHR5cGUgUG9zSW50ID0gbnVtYmVyICYgeyBbVFlQRV06ICdQb3NpdGl2ZSBJbnRlZ2VyJyB9XG5leHBvcnQgdHlwZSBJbmRleCA9IG51bWJlciAmIHsgW1RZUEVdOiAnTFJVQ2FjaGUgSW5kZXgnIH1cblxuY29uc3QgaXNQb3NJbnQgPSAobjogYW55KTogbiBpcyBQb3NJbnQgPT5cbiAgbiAmJiBuID09PSBNYXRoLmZsb29yKG4pICYmIG4gPiAwICYmIGlzRmluaXRlKG4pXG5cbmV4cG9ydCB0eXBlIFVpbnRBcnJheSA9IFVpbnQ4QXJyYXkgfCBVaW50MTZBcnJheSB8IFVpbnQzMkFycmF5XG5leHBvcnQgdHlwZSBOdW1iZXJBcnJheSA9IFVpbnRBcnJheSB8IG51bWJlcltdXG5cbi8qIGM4IGlnbm9yZSBzdGFydCAqL1xuLy8gVGhpcyBpcyBhIGxpdHRsZSBiaXQgcmlkaWN1bG91cywgdGJoLlxuLy8gVGhlIG1heGltdW0gYXJyYXkgbGVuZ3RoIGlzIDJeMzItMSBvciB0aGVyZWFib3V0cyBvbiBtb3N0IEpTIGltcGxzLlxuLy8gQW5kIHdlbGwgYmVmb3JlIHRoYXQgcG9pbnQsIHlvdSdyZSBjYWNoaW5nIHRoZSBlbnRpcmUgd29ybGQsIEkgbWVhbixcbi8vIHRoYXQncyB+MzJHQiBvZiBqdXN0IGludGVnZXJzIGZvciB0aGUgbmV4dC9wcmV2IGxpbmtzLCBwbHVzIHdoYXRldmVyXG4vLyBlbHNlIHRvIGhvbGQgdGhhdCBtYW55IGtleXMgYW5kIHZhbHVlcy4gIEp1c3QgZmlsbGluZyB0aGUgbWVtb3J5IHdpdGhcbi8vIHplcm9lcyBhdCBpbml0IHRpbWUgaXMgYnJ1dGFsIHdoZW4geW91IGdldCB0aGF0IGJpZy5cbi8vIEJ1dCB3aHkgbm90IGJlIGNvbXBsZXRlP1xuLy8gTWF5YmUgaW4gdGhlIGZ1dHVyZSwgdGhlc2UgbGltaXRzIHdpbGwgaGF2ZSBleHBhbmRlZC5cbmNvbnN0IGdldFVpbnRBcnJheSA9IChtYXg6IG51bWJlcikgPT5cbiAgIWlzUG9zSW50KG1heCkgPyBudWxsXG4gIDogbWF4IDw9IE1hdGgucG93KDIsIDgpID8gVWludDhBcnJheVxuICA6IG1heCA8PSBNYXRoLnBvdygyLCAxNikgPyBVaW50MTZBcnJheVxuICA6IG1heCA8PSBNYXRoLnBvdygyLCAzMikgPyBVaW50MzJBcnJheVxuICA6IG1heCA8PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA/IFplcm9BcnJheVxuICA6IG51bGxcbi8qIGM4IGlnbm9yZSBzdG9wICovXG5cbmNsYXNzIFplcm9BcnJheSBleHRlbmRzIEFycmF5PG51bWJlcj4ge1xuICBjb25zdHJ1Y3RvcihzaXplOiBudW1iZXIpIHtcbiAgICBzdXBlcihzaXplKVxuICAgIHRoaXMuZmlsbCgwKVxuICB9XG59XG5leHBvcnQgdHlwZSB7IFplcm9BcnJheSB9XG5leHBvcnQgdHlwZSB7IFN0YWNrIH1cblxuZXhwb3J0IHR5cGUgU3RhY2tMaWtlID0gU3RhY2sgfCBJbmRleFtdXG5jbGFzcyBTdGFjayB7XG4gIGhlYXA6IE51bWJlckFycmF5XG4gIGxlbmd0aDogbnVtYmVyXG4gIC8vIHByaXZhdGUgY29uc3RydWN0b3JcbiAgc3RhdGljICNjb25zdHJ1Y3Rpbmc6IGJvb2xlYW4gPSBmYWxzZVxuICBzdGF0aWMgY3JlYXRlKG1heDogbnVtYmVyKTogU3RhY2tMaWtlIHtcbiAgICBjb25zdCBIZWFwQ2xzID0gZ2V0VWludEFycmF5KG1heClcbiAgICBpZiAoIUhlYXBDbHMpIHJldHVybiBbXVxuICAgIFN0YWNrLiNjb25zdHJ1Y3RpbmcgPSB0cnVlXG4gICAgY29uc3QgcyA9IG5ldyBTdGFjayhtYXgsIEhlYXBDbHMpXG4gICAgU3RhY2suI2NvbnN0cnVjdGluZyA9IGZhbHNlXG4gICAgcmV0dXJuIHNcbiAgfVxuICBjb25zdHJ1Y3RvcihtYXg6IG51bWJlciwgSGVhcENsczogeyBuZXcgKG46IG51bWJlcik6IE51bWJlckFycmF5IH0pIHtcbiAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICBpZiAoIVN0YWNrLiNjb25zdHJ1Y3RpbmcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2luc3RhbnRpYXRlIFN0YWNrIHVzaW5nIFN0YWNrLmNyZWF0ZShuKScpXG4gICAgfVxuICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgdGhpcy5oZWFwID0gbmV3IEhlYXBDbHMobWF4KVxuICAgIHRoaXMubGVuZ3RoID0gMFxuICB9XG4gIHB1c2gobjogSW5kZXgpIHtcbiAgICB0aGlzLmhlYXBbdGhpcy5sZW5ndGgrK10gPSBuXG4gIH1cbiAgcG9wKCk6IEluZGV4IHtcbiAgICByZXR1cm4gdGhpcy5oZWFwWy0tdGhpcy5sZW5ndGhdIGFzIEluZGV4XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9taXNlIHJlcHJlc2VudGluZyBhbiBpbi1wcm9ncmVzcyB7QGxpbmsgTFJVQ2FjaGUjZmV0Y2h9IGNhbGxcbiAqL1xuZXhwb3J0IHR5cGUgQmFja2dyb3VuZEZldGNoPFY+ID0gUHJvbWlzZTxWIHwgdW5kZWZpbmVkPiAmIHtcbiAgX19yZXR1cm5lZDogQmFja2dyb3VuZEZldGNoPFY+IHwgdW5kZWZpbmVkXG4gIF9fYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXJcbiAgX19zdGFsZVdoaWxlRmV0Y2hpbmc6IFYgfCB1bmRlZmluZWRcbn1cblxuZXhwb3J0IHR5cGUgRGlzcG9zZVRhc2s8SywgVj4gPSBbXG4gIHZhbHVlOiBWLFxuICBrZXk6IEssXG4gIHJlYXNvbjogTFJVQ2FjaGUuRGlzcG9zZVJlYXNvbixcbl1cblxuZXhwb3J0IG5hbWVzcGFjZSBMUlVDYWNoZSB7XG4gIC8qKlxuICAgKiBBbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwLCByZWZsZWN0aW5nIHRoZSBjYWxjdWxhdGVkIHNpemUgb2YgaXRlbXNcbiAgICovXG4gIGV4cG9ydCB0eXBlIFNpemUgPSBudW1iZXJcblxuICAvKipcbiAgICogSW50ZWdlciBncmVhdGVyIHRoYW4gMCwgcmVwcmVzZW50aW5nIHNvbWUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgb3IgdGhlXG4gICAqIHRpbWUgYXQgd2hpY2ggYSBUVEwgc3RhcnRlZCBjb3VudGluZyBmcm9tLlxuICAgKi9cbiAgZXhwb3J0IHR5cGUgTWlsbGlzZWNvbmRzID0gbnVtYmVyXG5cbiAgLyoqXG4gICAqIEFuIGludGVnZXIgZ3JlYXRlciB0aGFuIDAsIHJlZmxlY3RpbmcgYSBudW1iZXIgb2YgaXRlbXNcbiAgICovXG4gIGV4cG9ydCB0eXBlIENvdW50ID0gbnVtYmVyXG5cbiAgLyoqXG4gICAqIFRoZSByZWFzb24gd2h5IGFuIGl0ZW0gd2FzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUsIHBhc3NlZFxuICAgKiB0byB0aGUge0BsaW5rIERpc3Bvc2VyfSBtZXRob2RzLlxuICAgKlxuICAgKiAtIGBldmljdGA6IFRoZSBpdGVtIHdhcyBldmljdGVkIGJlY2F1c2UgaXQgaXMgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQsXG4gICAqICAgYW5kIHRoZSBjYWNoZSBpcyBmdWxsLlxuICAgKiAtIGBzZXRgOiBBIG5ldyB2YWx1ZSB3YXMgc2V0LCBvdmVyd3JpdGluZyB0aGUgb2xkIHZhbHVlIGJlaW5nIGRpc3Bvc2VkLlxuICAgKiAtIGBkZWxldGVgOiBUaGUgaXRlbSB3YXMgZXhwbGljaXRseSBkZWxldGVkLCBlaXRoZXIgYnkgY2FsbGluZ1xuICAgKiAgIHtAbGluayBMUlVDYWNoZSNkZWxldGV9LCB7QGxpbmsgTFJVQ2FjaGUjY2xlYXJ9LCBvclxuICAgKiAgIHtAbGluayBMUlVDYWNoZSNzZXR9IHdpdGggYW4gdW5kZWZpbmVkIHZhbHVlLlxuICAgKiAtIGBleHBpcmVgOiBUaGUgaXRlbSB3YXMgcmVtb3ZlZCBkdWUgdG8gZXhjZWVkaW5nIGl0cyBUVEwuXG4gICAqIC0gYGZldGNoYDogQSB7QGxpbmsgT3B0aW9uc0Jhc2UjZmV0Y2hNZXRob2R9IG9wZXJhdGlvbiByZXR1cm5lZFxuICAgKiAgIGB1bmRlZmluZWRgIG9yIHdhcyBhYm9ydGVkLCBjYXVzaW5nIHRoZSBpdGVtIHRvIGJlIGRlbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgdHlwZSBEaXNwb3NlUmVhc29uID1cbiAgICB8ICdldmljdCdcbiAgICB8ICdzZXQnXG4gICAgfCAnZGVsZXRlJ1xuICAgIHwgJ2V4cGlyZSdcbiAgICB8ICdmZXRjaCdcbiAgLyoqXG4gICAqIEEgbWV0aG9kIGNhbGxlZCB1cG9uIGl0ZW0gcmVtb3ZhbCwgcGFzc2VkIGFzIHRoZVxuICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2UuZGlzcG9zZX0gYW5kL29yXG4gICAqIHtAbGluayBPcHRpb25zQmFzZS5kaXNwb3NlQWZ0ZXJ9IG9wdGlvbnMuXG4gICAqL1xuICBleHBvcnQgdHlwZSBEaXNwb3NlcjxLLCBWPiA9IChcbiAgICB2YWx1ZTogVixcbiAgICBrZXk6IEssXG4gICAgcmVhc29uOiBEaXNwb3NlUmVhc29uLFxuICApID0+IHZvaWRcblxuICAvKipcbiAgICogVGhlIHJlYXNvbiB3aHkgYW4gaXRlbSB3YXMgYWRkZWQgdG8gdGhlIGNhY2hlLCBwYXNzZWRcbiAgICogdG8gdGhlIHtAbGluayBJbnNlcnRlcn0gbWV0aG9kcy5cbiAgICpcbiAgICogLSBgYWRkYDogdGhlIGl0ZW0gd2FzIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUsIGFuZCB3YXMgYWRkZWRcbiAgICogLSBgdXBkYXRlYDogdGhlIGl0ZW0gd2FzIGluIHRoZSBjYWNoZSwgd2l0aCB0aGUgc2FtZSB2YWx1ZSBwcm92aWRlZFxuICAgKiAtIGByZXBsYWNlYDogdGhlIGl0ZW0gd2FzIGluIHRoZSBjYWNoZSwgYW5kIHJlcGxhY2VkXG4gICAqL1xuICBleHBvcnQgdHlwZSBJbnNlcnRSZWFzb24gPSAnYWRkJyB8ICd1cGRhdGUnIHwgJ3JlcGxhY2UnXG5cbiAgLyoqXG4gICAqIEEgbWV0aG9kIGNhbGxlZCB1cG9uIGl0ZW0gaW5zZXJ0aW9uLCBwYXNzZWQgYXMgdGhlXG4gICAqIHtAbGluayBPcHRpb25zQmFzZS5pbnNlcnR9XG4gICAqL1xuICBleHBvcnQgdHlwZSBJbnNlcnRlcjxLLCBWPiA9IChcbiAgICB2YWx1ZTogVixcbiAgICBrZXk6IEssXG4gICAgcmVhc29uOiBJbnNlcnRSZWFzb24sXG4gICkgPT4gdm9pZFxuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgZWZmZWN0aXZlIGNhbGN1bGF0ZWQgc2l6ZVxuICAgKiBvZiBhbiBlbnRyeSBpbiB0aGUgY2FjaGUuXG4gICAqL1xuICBleHBvcnQgdHlwZSBTaXplQ2FsY3VsYXRvcjxLLCBWPiA9ICh2YWx1ZTogViwga2V5OiBLKSA9PiBTaXplXG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgcHJvdmlkZWQgdG8gdGhlXG4gICAqIHtAbGluayBPcHRpb25zQmFzZS5mZXRjaE1ldGhvZH0gZnVuY3Rpb24uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEZldGNoZXJPcHRpb25zPEssIFYsIEZDID0gdW5rbm93bj4ge1xuICAgIHNpZ25hbDogQWJvcnRTaWduYWxcbiAgICBvcHRpb25zOiBGZXRjaGVyRmV0Y2hPcHRpb25zPEssIFYsIEZDPlxuICAgIC8qKlxuICAgICAqIE9iamVjdCBwcm92aWRlZCBpbiB0aGUge0BsaW5rIEZldGNoT3B0aW9ucy5jb250ZXh0fSBvcHRpb24gdG9cbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUjZmV0Y2h9XG4gICAgICovXG4gICAgY29udGV4dDogRkNcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2Nhc2lvbmFsbHksIGl0IG1heSBiZSB1c2VmdWwgdG8gdHJhY2sgdGhlIGludGVybmFsIGJlaGF2aW9yIG9mIHRoZVxuICAgKiBjYWNoZSwgcGFydGljdWxhcmx5IGZvciBsb2dnaW5nLCBkZWJ1Z2dpbmcsIG9yIGZvciBiZWhhdmlvciB3aXRoaW4gdGhlXG4gICAqIGBmZXRjaE1ldGhvZGAuIFRvIGRvIHRoaXMsIHlvdSBjYW4gcGFzcyBhIGBzdGF0dXNgIG9iamVjdCB0byB0aGVcbiAgICoge0BsaW5rIExSVUNhY2hlI2ZldGNofSwge0BsaW5rIExSVUNhY2hlI2dldH0sIHtAbGluayBMUlVDYWNoZSNzZXR9LFxuICAgKiB7QGxpbmsgTFJVQ2FjaGUjbWVtb30sIGFuZCB7QGxpbmsgTFJVQ2FjaGUjaGFzfSBtZXRob2RzLlxuICAgKlxuICAgKiBUaGUgYHN0YXR1c2Agb3B0aW9uIHNob3VsZCBiZSBhIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0LiBUaGUgZm9sbG93aW5nXG4gICAqIGZpZWxkcyB3aWxsIGJlIHNldCBvbiBpdCBhcHByb3ByaWF0ZWx5LCBkZXBlbmRpbmcgb24gdGhlIHNpdHVhdGlvbi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzPFY+IHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIG9mIGEgc2V0KCkgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogLSBhZGQ6IHRoZSBpdGVtIHdhcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLCBhbmQgd2FzIGFkZGVkXG4gICAgICogLSB1cGRhdGU6IHRoZSBpdGVtIHdhcyBpbiB0aGUgY2FjaGUsIHdpdGggdGhlIHNhbWUgdmFsdWUgcHJvdmlkZWRcbiAgICAgKiAtIHJlcGxhY2U6IHRoZSBpdGVtIHdhcyBpbiB0aGUgY2FjaGUsIGFuZCByZXBsYWNlZFxuICAgICAqIC0gbWlzczogdGhlIGl0ZW0gd2FzIG5vdCBhZGRlZCB0byB0aGUgY2FjaGUgZm9yIHNvbWUgcmVhc29uXG4gICAgICovXG4gICAgc2V0PzogJ2FkZCcgfCAndXBkYXRlJyB8ICdyZXBsYWNlJyB8ICdtaXNzJ1xuXG4gICAgLyoqXG4gICAgICogdGhlIHR0bCBzdG9yZWQgZm9yIHRoZSBpdGVtLCBvciB1bmRlZmluZWQgaWYgdHRscyBhcmUgbm90IHVzZWQuXG4gICAgICovXG4gICAgdHRsPzogTWlsbGlzZWNvbmRzXG5cbiAgICAvKipcbiAgICAgKiB0aGUgc3RhcnQgdGltZSBmb3IgdGhlIGl0ZW0sIG9yIHVuZGVmaW5lZCBpZiB0dGxzIGFyZSBub3QgdXNlZC5cbiAgICAgKi9cbiAgICBzdGFydD86IE1pbGxpc2Vjb25kc1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCB1c2VkIGZvciBUVEwgY2FsY3VsYXRpb25cbiAgICAgKi9cbiAgICBub3c/OiBNaWxsaXNlY29uZHNcblxuICAgIC8qKlxuICAgICAqIHRoZSByZW1haW5pbmcgdHRsIGZvciB0aGUgaXRlbSwgb3IgdW5kZWZpbmVkIGlmIHR0bHMgYXJlIG5vdCB1c2VkLlxuICAgICAqL1xuICAgIHJlbWFpbmluZ1RUTD86IE1pbGxpc2Vjb25kc1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNhbGN1bGF0ZWQgc2l6ZSBmb3IgdGhlIGl0ZW0sIGlmIHNpemVzIGFyZSB1c2VkLlxuICAgICAqL1xuICAgIGVudHJ5U2l6ZT86IFNpemVcblxuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjYWxjdWxhdGVkIHNpemUgb2YgdGhlIGNhY2hlLCBpZiBzaXplcyBhcmUgdXNlZC5cbiAgICAgKi9cbiAgICB0b3RhbENhbGN1bGF0ZWRTaXplPzogU2l6ZVxuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgaXRlbSB3YXMgbm90IHN0b3JlZCwgZHVlIHRvIGV4Y2VlZGluZyB0aGVcbiAgICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2UubWF4RW50cnlTaXplfVxuICAgICAqL1xuICAgIG1heEVudHJ5U2l6ZUV4Y2VlZGVkPzogdHJ1ZVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9sZCB2YWx1ZSwgc3BlY2lmaWVkIGluIHRoZSBjYXNlIG9mIGBzZXQ6J3VwZGF0ZSdgIG9yXG4gICAgICogYHNldDoncmVwbGFjZSdgXG4gICAgICovXG4gICAgb2xkVmFsdWU/OiBWXG5cbiAgICAvKipcbiAgICAgKiBUaGUgcmVzdWx0cyBvZiBhIHtAbGluayBMUlVDYWNoZSNoYXN9IG9wZXJhdGlvblxuICAgICAqXG4gICAgICogLSBoaXQ6IHRoZSBpdGVtIHdhcyBmb3VuZCBpbiB0aGUgY2FjaGVcbiAgICAgKiAtIHN0YWxlOiB0aGUgaXRlbSB3YXMgZm91bmQgaW4gdGhlIGNhY2hlLCBidXQgaXMgc3RhbGVcbiAgICAgKiAtIG1pc3M6IHRoZSBpdGVtIHdhcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlXG4gICAgICovXG4gICAgaGFzPzogJ2hpdCcgfCAnc3RhbGUnIHwgJ21pc3MnXG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIG9mIGEge0BsaW5rIExSVUNhY2hlI2ZldGNofSBvcGVyYXRpb24uXG4gICAgICogTm90ZSB0aGF0IHRoaXMgY2FuIGNoYW5nZSBhcyB0aGUgdW5kZXJseWluZyBmZXRjaCgpIG1vdmVzIHRocm91Z2hcbiAgICAgKiB2YXJpb3VzIHN0YXRlcy5cbiAgICAgKlxuICAgICAqIC0gaW5mbGlnaHQ6IHRoZXJlIGlzIGFub3RoZXIgZmV0Y2goKSBmb3IgdGhpcyBrZXkgd2hpY2ggaXMgaW4gcHJvY2Vzc1xuICAgICAqIC0gZ2V0OiB0aGVyZSBpcyBubyB7QGxpbmsgT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9LCBzb1xuICAgICAqICAge0BsaW5rIExSVUNhY2hlI2dldH0gd2FzIGNhbGxlZC5cbiAgICAgKiAtIG1pc3M6IHRoZSBpdGVtIGlzIG5vdCBpbiBjYWNoZSwgYW5kIHdpbGwgYmUgZmV0Y2hlZC5cbiAgICAgKiAtIGhpdDogdGhlIGl0ZW0gaXMgaW4gdGhlIGNhY2hlLCBhbmQgd2FzIHJlc29sdmVkIGltbWVkaWF0ZWx5LlxuICAgICAqIC0gc3RhbGU6IHRoZSBpdGVtIGlzIGluIHRoZSBjYWNoZSwgYnV0IHN0YWxlLlxuICAgICAqIC0gcmVmcmVzaDogdGhlIGl0ZW0gaXMgaW4gdGhlIGNhY2hlLCBhbmQgbm90IHN0YWxlLCBidXRcbiAgICAgKiAgIHtAbGluayBGZXRjaE9wdGlvbnMuZm9yY2VSZWZyZXNofSB3YXMgc3BlY2lmaWVkLlxuICAgICAqL1xuICAgIGZldGNoPzogJ2dldCcgfCAnaW5mbGlnaHQnIHwgJ21pc3MnIHwgJ2hpdCcgfCAnc3RhbGUnIHwgJ3JlZnJlc2gnXG5cbiAgICAvKipcbiAgICAgKiBUaGUge0BsaW5rIE9wdGlvbnNCYXNlLmZldGNoTWV0aG9kfSB3YXMgY2FsbGVkXG4gICAgICovXG4gICAgZmV0Y2hEaXNwYXRjaGVkPzogdHJ1ZVxuXG4gICAgLyoqXG4gICAgICogVGhlIGNhY2hlZCB2YWx1ZSB3YXMgdXBkYXRlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCB0b1xuICAgICAqIHtAbGluayBPcHRpb25zQmFzZS5mZXRjaE1ldGhvZH1cbiAgICAgKi9cbiAgICBmZXRjaFVwZGF0ZWQ/OiB0cnVlXG5cbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIGZvciBhIGZldGNoKCkgcmVqZWN0aW9uLiAgRWl0aGVyIHRoZSBlcnJvciByYWlzZWQgYnkgdGhlXG4gICAgICoge0BsaW5rIE9wdGlvbnNCYXNlLmZldGNoTWV0aG9kfSwgb3IgdGhlIHJlYXNvbiBmb3IgYW5cbiAgICAgKiBBYm9ydFNpZ25hbC5cbiAgICAgKi9cbiAgICBmZXRjaEVycm9yPzogRXJyb3JcblxuICAgIC8qKlxuICAgICAqIFRoZSBmZXRjaCByZWNlaXZlZCBhbiBhYm9ydCBzaWduYWxcbiAgICAgKi9cbiAgICBmZXRjaEFib3J0ZWQ/OiB0cnVlXG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWJvcnQgc2lnbmFsIHJlY2VpdmVkIHdhcyBpZ25vcmVkLCBhbmQgdGhlIGZldGNoIHdhcyBhbGxvd2VkIHRvXG4gICAgICogY29udGludWUuXG4gICAgICovXG4gICAgZmV0Y2hBYm9ydElnbm9yZWQ/OiB0cnVlXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmV0Y2hNZXRob2QgcHJvbWlzZSByZXNvbHZlZCBzdWNjZXNzZnVsbHlcbiAgICAgKi9cbiAgICBmZXRjaFJlc29sdmVkPzogdHJ1ZVxuXG4gICAgLyoqXG4gICAgICogVGhlIGZldGNoTWV0aG9kIHByb21pc2Ugd2FzIHJlamVjdGVkXG4gICAgICovXG4gICAgZmV0Y2hSZWplY3RlZD86IHRydWVcblxuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgb2YgYSB7QGxpbmsgTFJVQ2FjaGUjZ2V0fSBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiAtIGZldGNoaW5nOiBUaGUgaXRlbSBpcyBjdXJyZW50bHkgYmVpbmcgZmV0Y2hlZC4gIElmIGEgcHJldmlvdXMgdmFsdWVcbiAgICAgKiAgIGlzIHByZXNlbnQgYW5kIGFsbG93ZWQsIHRoYXQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiAtIHN0YWxlOiBUaGUgaXRlbSBpcyBpbiB0aGUgY2FjaGUsIGFuZCBpcyBzdGFsZS5cbiAgICAgKiAtIGhpdDogdGhlIGl0ZW0gaXMgaW4gdGhlIGNhY2hlXG4gICAgICogLSBtaXNzOiB0aGUgaXRlbSBpcyBub3QgaW4gdGhlIGNhY2hlXG4gICAgICovXG4gICAgZ2V0PzogJ3N0YWxlJyB8ICdoaXQnIHwgJ21pc3MnXG5cbiAgICAvKipcbiAgICAgKiBBIGZldGNoIG9yIGdldCBvcGVyYXRpb24gcmV0dXJuZWQgYSBzdGFsZSB2YWx1ZS5cbiAgICAgKi9cbiAgICByZXR1cm5lZFN0YWxlPzogdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIG9wdGlvbnMgd2hpY2ggb3ZlcnJpZGUgdGhlIG9wdGlvbnMgc2V0IGluIHRoZSBMUlVDYWNoZSBjb25zdHJ1Y3RvclxuICAgKiB3aGVuIGNhbGxpbmcge0BsaW5rIExSVUNhY2hlI2ZldGNofS5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgdW5pb24gb2Yge0BsaW5rIEdldE9wdGlvbnN9IGFuZCB7QGxpbmsgU2V0T3B0aW9uc30sIHBsdXNcbiAgICoge0BsaW5rIE9wdGlvbnNCYXNlLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbn0sXG4gICAqIHtAbGluayBPcHRpb25zQmFzZS5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbn0sXG4gICAqIHtAbGluayBGZXRjaE9wdGlvbnMuZm9yY2VSZWZyZXNofSwgYW5kXG4gICAqIHtAbGluayBGZXRjaGVyT3B0aW9ucy5jb250ZXh0fVxuICAgKlxuICAgKiBBbnkgb2YgdGhlc2UgbWF5IGJlIG1vZGlmaWVkIGluIHRoZSB7QGxpbmsgT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9XG4gICAqIGZ1bmN0aW9uLCBidXQgdGhlIHtAbGluayBHZXRPcHRpb25zfSBmaWVsZHMgd2lsbCBvZiBjb3Vyc2UgaGF2ZSBub1xuICAgKiBlZmZlY3QsIGFzIHRoZSB7QGxpbmsgTFJVQ2FjaGUjZ2V0fSBjYWxsIGFscmVhZHkgaGFwcGVuZWQgYnkgdGhlIHRpbWVcbiAgICogdGhlIGZldGNoTWV0aG9kIGlzIGNhbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hlckZldGNoT3B0aW9uczxLLCBWLCBGQyA9IHVua25vd24+XG4gICAgZXh0ZW5kcyBQaWNrPFxuICAgICAgT3B0aW9uc0Jhc2U8SywgViwgRkM+LFxuICAgICAgfCAnYWxsb3dTdGFsZSdcbiAgICAgIHwgJ3VwZGF0ZUFnZU9uR2V0J1xuICAgICAgfCAnbm9EZWxldGVPblN0YWxlR2V0J1xuICAgICAgfCAnc2l6ZUNhbGN1bGF0aW9uJ1xuICAgICAgfCAndHRsJ1xuICAgICAgfCAnbm9EaXNwb3NlT25TZXQnXG4gICAgICB8ICdub1VwZGF0ZVRUTCdcbiAgICAgIHwgJ25vRGVsZXRlT25GZXRjaFJlamVjdGlvbidcbiAgICAgIHwgJ2FsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uJ1xuICAgICAgfCAnaWdub3JlRmV0Y2hBYm9ydCdcbiAgICAgIHwgJ2FsbG93U3RhbGVPbkZldGNoQWJvcnQnXG4gICAgPiB7XG4gICAgc3RhdHVzPzogU3RhdHVzPFY+XG4gICAgc2l6ZT86IFNpemVcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpb25zIHRoYXQgbWF5IGJlIHBhc3NlZCB0byB0aGUge0BsaW5rIExSVUNhY2hlI2ZldGNofSBtZXRob2QuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEZldGNoT3B0aW9uczxLLCBWLCBGQz5cbiAgICBleHRlbmRzIEZldGNoZXJGZXRjaE9wdGlvbnM8SywgViwgRkM+IHtcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gdHJ1ZSB0byBmb3JjZSBhIHJlLWxvYWQgb2YgdGhlIGV4aXN0aW5nIGRhdGEsIGV2ZW4gaWYgaXRcbiAgICAgKiBpcyBub3QgeWV0IHN0YWxlLlxuICAgICAqL1xuICAgIGZvcmNlUmVmcmVzaD86IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb250ZXh0IHByb3ZpZGVkIHRvIHRoZSB7QGxpbmsgT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9IGFzXG4gICAgICogdGhlIHtAbGluayBGZXRjaGVyT3B0aW9ucy5jb250ZXh0fSBwYXJhbS5cbiAgICAgKlxuICAgICAqIElmIHRoZSBGQyB0eXBlIGlzIHNwZWNpZmllZCBhcyB1bmtub3duICh0aGUgZGVmYXVsdCksXG4gICAgICogdW5kZWZpbmVkIG9yIHZvaWQsIHRoZW4gdGhpcyBpcyBvcHRpb25hbC4gIE90aGVyd2lzZSwgaXQgd2lsbFxuICAgICAqIGJlIHJlcXVpcmVkLlxuICAgICAqL1xuICAgIGNvbnRleHQ/OiBGQ1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsXG4gICAgc3RhdHVzPzogU3RhdHVzPFY+XG4gIH1cbiAgLyoqXG4gICAqIE9wdGlvbnMgcHJvdmlkZWQgdG8ge0BsaW5rIExSVUNhY2hlI2ZldGNofSB3aGVuIHRoZSBGQyB0eXBlIGlzIHNvbWV0aGluZ1xuICAgKiBvdGhlciB0aGFuIGB1bmtub3duYCwgYHVuZGVmaW5lZGAsIG9yIGB2b2lkYFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBGZXRjaE9wdGlvbnNXaXRoQ29udGV4dDxLLCBWLCBGQz5cbiAgICBleHRlbmRzIEZldGNoT3B0aW9uczxLLCBWLCBGQz4ge1xuICAgIGNvbnRleHQ6IEZDXG4gIH1cbiAgLyoqXG4gICAqIE9wdGlvbnMgcHJvdmlkZWQgdG8ge0BsaW5rIExSVUNhY2hlI2ZldGNofSB3aGVuIHRoZSBGQyB0eXBlIGlzXG4gICAqIGB1bmRlZmluZWRgIG9yIGB2b2lkYFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBGZXRjaE9wdGlvbnNOb0NvbnRleHQ8SywgVj5cbiAgICBleHRlbmRzIEZldGNoT3B0aW9uczxLLCBWLCB1bmRlZmluZWQ+IHtcbiAgICBjb250ZXh0PzogdW5kZWZpbmVkXG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIE1lbW9PcHRpb25zPEssIFYsIEZDID0gdW5rbm93bj5cbiAgICBleHRlbmRzIFBpY2s8XG4gICAgICBPcHRpb25zQmFzZTxLLCBWLCBGQz4sXG4gICAgICB8ICdhbGxvd1N0YWxlJ1xuICAgICAgfCAndXBkYXRlQWdlT25HZXQnXG4gICAgICB8ICdub0RlbGV0ZU9uU3RhbGVHZXQnXG4gICAgICB8ICdzaXplQ2FsY3VsYXRpb24nXG4gICAgICB8ICd0dGwnXG4gICAgICB8ICdub0Rpc3Bvc2VPblNldCdcbiAgICAgIHwgJ25vVXBkYXRlVFRMJ1xuICAgICAgfCAnbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uJ1xuICAgICAgfCAnYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24nXG4gICAgICB8ICdpZ25vcmVGZXRjaEFib3J0J1xuICAgICAgfCAnYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCdcbiAgICA+IHtcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gdHJ1ZSB0byBmb3JjZSBhIHJlLWxvYWQgb2YgdGhlIGV4aXN0aW5nIGRhdGEsIGV2ZW4gaWYgaXRcbiAgICAgKiBpcyBub3QgeWV0IHN0YWxlLlxuICAgICAqL1xuICAgIGZvcmNlUmVmcmVzaD86IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb250ZXh0IHByb3ZpZGVkIHRvIHRoZSB7QGxpbmsgT3B0aW9uc0Jhc2UubWVtb01ldGhvZH0gYXNcbiAgICAgKiB0aGUge0BsaW5rIE1lbW9pemVyT3B0aW9ucy5jb250ZXh0fSBwYXJhbS5cbiAgICAgKlxuICAgICAqIElmIHRoZSBGQyB0eXBlIGlzIHNwZWNpZmllZCBhcyB1bmtub3duICh0aGUgZGVmYXVsdCksXG4gICAgICogdW5kZWZpbmVkIG9yIHZvaWQsIHRoZW4gdGhpcyBpcyBvcHRpb25hbC4gIE90aGVyd2lzZSwgaXQgd2lsbFxuICAgICAqIGJlIHJlcXVpcmVkLlxuICAgICAqL1xuICAgIGNvbnRleHQ/OiBGQ1xuICAgIHN0YXR1cz86IFN0YXR1czxWPlxuICB9XG4gIC8qKlxuICAgKiBPcHRpb25zIHByb3ZpZGVkIHRvIHtAbGluayBMUlVDYWNoZSNtZW1vfSB3aGVuIHRoZSBGQyB0eXBlIGlzIHNvbWV0aGluZ1xuICAgKiBvdGhlciB0aGFuIGB1bmtub3duYCwgYHVuZGVmaW5lZGAsIG9yIGB2b2lkYFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBNZW1vT3B0aW9uc1dpdGhDb250ZXh0PEssIFYsIEZDPlxuICAgIGV4dGVuZHMgTWVtb09wdGlvbnM8SywgViwgRkM+IHtcbiAgICBjb250ZXh0OiBGQ1xuICB9XG4gIC8qKlxuICAgKiBPcHRpb25zIHByb3ZpZGVkIHRvIHtAbGluayBMUlVDYWNoZSNtZW1vfSB3aGVuIHRoZSBGQyB0eXBlIGlzXG4gICAqIGB1bmRlZmluZWRgIG9yIGB2b2lkYFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBNZW1vT3B0aW9uc05vQ29udGV4dDxLLCBWPlxuICAgIGV4dGVuZHMgTWVtb09wdGlvbnM8SywgViwgdW5kZWZpbmVkPiB7XG4gICAgY29udGV4dD86IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgcHJvdmlkZWQgdG8gdGhlXG4gICAqIHtAbGluayBPcHRpb25zQmFzZS5tZW1vTWV0aG9kfSBmdW5jdGlvbi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVtb2l6ZXJPcHRpb25zPEssIFYsIEZDID0gdW5rbm93bj4ge1xuICAgIG9wdGlvbnM6IE1lbW9pemVyTWVtb09wdGlvbnM8SywgViwgRkM+XG4gICAgLyoqXG4gICAgICogT2JqZWN0IHByb3ZpZGVkIGluIHRoZSB7QGxpbmsgTWVtb09wdGlvbnMuY29udGV4dH0gb3B0aW9uIHRvXG4gICAgICoge0BsaW5rIExSVUNhY2hlI21lbW99XG4gICAgICovXG4gICAgY29udGV4dDogRkNcbiAgfVxuXG4gIC8qKlxuICAgKiBvcHRpb25zIHdoaWNoIG92ZXJyaWRlIHRoZSBvcHRpb25zIHNldCBpbiB0aGUgTFJVQ2FjaGUgY29uc3RydWN0b3JcbiAgICogd2hlbiBjYWxsaW5nIHtAbGluayBMUlVDYWNoZSNtZW1vfS5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgdW5pb24gb2Yge0BsaW5rIEdldE9wdGlvbnN9IGFuZCB7QGxpbmsgU2V0T3B0aW9uc30sIHBsdXNcbiAgICoge0BsaW5rIE1lbW9PcHRpb25zLmZvcmNlUmVmcmVzaH0sIGFuZFxuICAgKiB7QGxpbmsgTWVtb09wdGlvbnMuY29udGV4dH1cbiAgICpcbiAgICogQW55IG9mIHRoZXNlIG1heSBiZSBtb2RpZmllZCBpbiB0aGUge0BsaW5rIE9wdGlvbnNCYXNlLm1lbW9NZXRob2R9XG4gICAqIGZ1bmN0aW9uLCBidXQgdGhlIHtAbGluayBHZXRPcHRpb25zfSBmaWVsZHMgd2lsbCBvZiBjb3Vyc2UgaGF2ZSBub1xuICAgKiBlZmZlY3QsIGFzIHRoZSB7QGxpbmsgTFJVQ2FjaGUjZ2V0fSBjYWxsIGFscmVhZHkgaGFwcGVuZWQgYnkgdGhlIHRpbWVcbiAgICogdGhlIG1lbW9NZXRob2QgaXMgY2FsbGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBNZW1vaXplck1lbW9PcHRpb25zPEssIFYsIEZDID0gdW5rbm93bj5cbiAgICBleHRlbmRzIFBpY2s8XG4gICAgICBPcHRpb25zQmFzZTxLLCBWLCBGQz4sXG4gICAgICB8ICdhbGxvd1N0YWxlJ1xuICAgICAgfCAndXBkYXRlQWdlT25HZXQnXG4gICAgICB8ICdub0RlbGV0ZU9uU3RhbGVHZXQnXG4gICAgICB8ICdzaXplQ2FsY3VsYXRpb24nXG4gICAgICB8ICd0dGwnXG4gICAgICB8ICdub0Rpc3Bvc2VPblNldCdcbiAgICAgIHwgJ25vVXBkYXRlVFRMJ1xuICAgID4ge1xuICAgIHN0YXR1cz86IFN0YXR1czxWPlxuICAgIHNpemU/OiBTaXplXG4gICAgc3RhcnQ/OiBNaWxsaXNlY29uZHNcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpb25zIHRoYXQgbWF5IGJlIHBhc3NlZCB0byB0aGUge0BsaW5rIExSVUNhY2hlI2hhc30gbWV0aG9kLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBIYXNPcHRpb25zPEssIFYsIEZDPlxuICAgIGV4dGVuZHMgUGljazxPcHRpb25zQmFzZTxLLCBWLCBGQz4sICd1cGRhdGVBZ2VPbkhhcyc+IHtcbiAgICBzdGF0dXM/OiBTdGF0dXM8Vj5cbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpb25zIHRoYXQgbWF5IGJlIHBhc3NlZCB0byB0aGUge0BsaW5rIExSVUNhY2hlI2dldH0gbWV0aG9kLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBHZXRPcHRpb25zPEssIFYsIEZDPlxuICAgIGV4dGVuZHMgUGljazxcbiAgICAgIE9wdGlvbnNCYXNlPEssIFYsIEZDPixcbiAgICAgICdhbGxvd1N0YWxlJyB8ICd1cGRhdGVBZ2VPbkdldCcgfCAnbm9EZWxldGVPblN0YWxlR2V0J1xuICAgID4ge1xuICAgIHN0YXR1cz86IFN0YXR1czxWPlxuICB9XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgdGhhdCBtYXkgYmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgTFJVQ2FjaGUjcGVla30gbWV0aG9kLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBQZWVrT3B0aW9uczxLLCBWLCBGQz5cbiAgICBleHRlbmRzIFBpY2s8T3B0aW9uc0Jhc2U8SywgViwgRkM+LCAnYWxsb3dTdGFsZSc+IHt9XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgdGhhdCBtYXkgYmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgTFJVQ2FjaGUjc2V0fSBtZXRob2QuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFNldE9wdGlvbnM8SywgViwgRkM+XG4gICAgZXh0ZW5kcyBQaWNrPFxuICAgICAgT3B0aW9uc0Jhc2U8SywgViwgRkM+LFxuICAgICAgJ3NpemVDYWxjdWxhdGlvbicgfCAndHRsJyB8ICdub0Rpc3Bvc2VPblNldCcgfCAnbm9VcGRhdGVUVEwnXG4gICAgPiB7XG4gICAgLyoqXG4gICAgICogSWYgc2l6ZSB0cmFja2luZyBpcyBlbmFibGVkLCB0aGVuIHNldHRpbmcgYW4gZXhwbGljaXQgc2l6ZVxuICAgICAqIGluIHRoZSB7QGxpbmsgTFJVQ2FjaGUjc2V0fSBjYWxsIHdpbGwgcHJldmVudCBjYWxsaW5nIHRoZVxuICAgICAqIHtAbGluayBPcHRpb25zQmFzZS5zaXplQ2FsY3VsYXRpb259IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHNpemU/OiBTaXplXG4gICAgLyoqXG4gICAgICogSWYgVFRMIHRyYWNraW5nIGlzIGVuYWJsZWQsIHRoZW4gc2V0dGluZyBhbiBleHBsaWNpdCBzdGFydFxuICAgICAqIHRpbWUgaW4gdGhlIHtAbGluayBMUlVDYWNoZSNzZXR9IGNhbGwgd2lsbCBvdmVycmlkZSB0aGVcbiAgICAgKiBkZWZhdWx0IHRpbWUgZnJvbSBgcGVyZm9ybWFuY2Uubm93KClgIG9yIGBEYXRlLm5vdygpYC5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBpdCBtdXN0IGJlIGEgdmFsaWQgdmFsdWUgZm9yIHdoaWNoZXZlciB0aW1lLXRyYWNraW5nXG4gICAgICogbWV0aG9kIGlzIGluIHVzZS5cbiAgICAgKi9cbiAgICBzdGFydD86IE1pbGxpc2Vjb25kc1xuICAgIHN0YXR1cz86IFN0YXR1czxWPlxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIHNpZ25hdHVyZSBmb3IgdGhlIHtAbGluayBPcHRpb25zQmFzZS5mZXRjaE1ldGhvZH0gb3B0aW9uLlxuICAgKi9cbiAgZXhwb3J0IHR5cGUgRmV0Y2hlcjxLLCBWLCBGQyA9IHVua25vd24+ID0gKFxuICAgIGtleTogSyxcbiAgICBzdGFsZVZhbHVlOiBWIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IEZldGNoZXJPcHRpb25zPEssIFYsIEZDPixcbiAgKSA9PiBQcm9taXNlPFYgfCB1bmRlZmluZWQgfCB2b2lkPiB8IFYgfCB1bmRlZmluZWQgfCB2b2lkXG5cbiAgLyoqXG4gICAqIHRoZSB0eXBlIHNpZ25hdHVyZSBmb3IgdGhlIHtAbGluayBPcHRpb25zQmFzZS5tZW1vTWV0aG9kfSBvcHRpb24uXG4gICAqL1xuICBleHBvcnQgdHlwZSBNZW1vaXplcjxLLCBWLCBGQyA9IHVua25vd24+ID0gKFxuICAgIGtleTogSyxcbiAgICBzdGFsZVZhbHVlOiBWIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IE1lbW9pemVyT3B0aW9uczxLLCBWLCBGQz4sXG4gICkgPT4gVlxuXG4gIC8qKlxuICAgKiBPcHRpb25zIHdoaWNoIG1heSBiZSBwYXNzZWQgdG8gdGhlIHtAbGluayBMUlVDYWNoZX0gY29uc3RydWN0b3IuXG4gICAqXG4gICAqIE1vc3Qgb2YgdGhlc2UgbWF5IGJlIG92ZXJyaWRkZW4gaW4gdGhlIHZhcmlvdXMgb3B0aW9ucyB0aGF0IHVzZVxuICAgKiB0aGVtLlxuICAgKlxuICAgKiBEZXNwaXRlIGFsbCBiZWluZyB0ZWNobmljYWxseSBvcHRpb25hbCwgdGhlIGNvbnN0cnVjdG9yIHJlcXVpcmVzIHRoYXRcbiAgICogYSBjYWNoZSBpcyBhdCBtaW5pbXVtIGxpbWl0ZWQgYnkgb25lIG9yIG1vcmUgb2Yge0BsaW5rIE9wdGlvbnNCYXNlLm1heH0sXG4gICAqIHtAbGluayBPcHRpb25zQmFzZS50dGx9LCBvciB7QGxpbmsgT3B0aW9uc0Jhc2UubWF4U2l6ZX0uXG4gICAqXG4gICAqIElmIHtAbGluayBPcHRpb25zQmFzZS50dGx9IGlzIHVzZWQgYWxvbmUsIHRoZW4gaXQgaXMgc3Ryb25nbHkgYWR2aXNlZFxuICAgKiAoYW5kIGluIGZhY3QgcmVxdWlyZWQgYnkgdGhlIHR5cGUgZGVmaW5pdGlvbnMgaGVyZSkgdGhhdCB0aGUgY2FjaGVcbiAgICogYWxzbyBzZXQge0BsaW5rIE9wdGlvbnNCYXNlLnR0bEF1dG9wdXJnZX0sIHRvIHByZXZlbnQgcG90ZW50aWFsbHlcbiAgICogdW5ib3VuZGVkIHN0b3JhZ2UuXG4gICAqXG4gICAqIEFsbCBvcHRpb25zIGFyZSBhbHNvIGF2YWlsYWJsZSBvbiB0aGUge0BsaW5rIExSVUNhY2hlfSBpbnN0YW5jZSwgbWFraW5nXG4gICAqIGl0IHNhZmUgdG8gcGFzcyBhbiBMUlVDYWNoZSBpbnN0YW5jZSBhcyB0aGUgb3B0aW9ucyBhcmd1bWVtbnQgdG9cbiAgICogbWFrZSBhbm90aGVyIGVtcHR5IGNhY2hlIG9mIHRoZSBzYW1lIHR5cGUuXG4gICAqXG4gICAqIFNvbWUgb3B0aW9ucyBhcmUgbWFya2VkIGFzIHJlYWQtb25seSwgYmVjYXVzZSBjaGFuZ2luZyB0aGVtIGFmdGVyXG4gICAqIGluc3RhbnRpYXRpb24gaXMgbm90IHNhZmUuIENoYW5naW5nIGFueSBvZiB0aGUgb3RoZXIgb3B0aW9ucyB3aWxsIG9mXG4gICAqIGNvdXJzZSBvbmx5IGhhdmUgYW4gZWZmZWN0IG9uIHN1YnNlcXVlbnQgbWV0aG9kIGNhbGxzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBPcHRpb25zQmFzZTxLLCBWLCBGQz4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byBzdG9yZSBpbiB0aGUgY2FjaGUgYmVmb3JlIGV2aWN0aW5nXG4gICAgICogb2xkIGVudHJpZXMuIFRoaXMgaXMgcmVhZC1vbmx5IG9uIHRoZSB7QGxpbmsgTFJVQ2FjaGV9IGluc3RhbmNlLFxuICAgICAqIGFuZCBtYXkgbm90IGJlIG92ZXJyaWRkZW4uXG4gICAgICpcbiAgICAgKiBJZiBzZXQsIHRoZW4gc3RvcmFnZSBzcGFjZSB3aWxsIGJlIHByZS1hbGxvY2F0ZWQgYXQgY29uc3RydWN0aW9uXG4gICAgICogdGltZSwgYW5kIHRoZSBjYWNoZSB3aWxsIHBlcmZvcm0gc2lnbmlmaWNhbnRseSBmYXN0ZXIuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgc2lnbmlmaWNhbnRseSBmZXdlciBpdGVtcyBtYXkgYmUgc3RvcmVkLCBpZlxuICAgICAqIHtAbGluayBPcHRpb25zQmFzZS5tYXhTaXplfSBhbmQvb3Ige0BsaW5rIE9wdGlvbnNCYXNlLnR0bH0gYXJlIGFsc29cbiAgICAgKiBzZXQuXG4gICAgICpcbiAgICAgKiAqKkl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHNldCBhIGBtYXhgIHRvIHByZXZlbnQgdW5ib3VuZGVkIGdyb3d0aFxuICAgICAqIG9mIHRoZSBjYWNoZS4qKlxuICAgICAqL1xuICAgIG1heD86IENvdW50XG5cbiAgICAvKipcbiAgICAgKiBNYXggdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIGl0ZW1zIHRvIGxpdmUgaW4gY2FjaGUgYmVmb3JlIHRoZXkgYXJlXG4gICAgICogY29uc2lkZXJlZCBzdGFsZS4gIE5vdGUgdGhhdCBzdGFsZSBpdGVtcyBhcmUgTk9UIHByZWVtcHRpdmVseSByZW1vdmVkIGJ5XG4gICAgICogZGVmYXVsdCwgYW5kIE1BWSBsaXZlIGluIHRoZSBjYWNoZSwgY29udHJpYnV0aW5nIHRvIGl0cyBMUlUgbWF4LCBsb25nXG4gICAgICogYWZ0ZXIgdGhleSBoYXZlIGV4cGlyZWQsIHVubGVzcyB7QGxpbmsgT3B0aW9uc0Jhc2UudHRsQXV0b3B1cmdlfSBpc1xuICAgICAqIHNldC5cbiAgICAgKlxuICAgICAqIElmIHNldCB0byBgMGAgKHRoZSBkZWZhdWx0IHZhbHVlKSwgdGhlbiB0aGF0IG1lYW5zIFwiZG8gbm90IHRyYWNrXG4gICAgICogVFRMXCIsIG5vdCBcImV4cGlyZSBpbW1lZGlhdGVseVwiLlxuICAgICAqXG4gICAgICogQWxzbywgYXMgdGhpcyBjYWNoZSBpcyBvcHRpbWl6ZWQgZm9yIExSVS9NUlUgb3BlcmF0aW9ucywgc29tZSBvZlxuICAgICAqIHRoZSBzdGFsZW5lc3MvVFRMIGNoZWNrcyB3aWxsIHJlZHVjZSBwZXJmb3JtYW5jZSwgYXMgdGhleSB3aWxsIGluY3VyXG4gICAgICogb3ZlcmhlYWQgYnkgZGVsZXRpbmcgaXRlbXMuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG5vdCBwcmltYXJpbHkgYSBUVEwgY2FjaGUsIGFuZCBkb2VzIG5vdCBtYWtlIHN0cm9uZyBUVExcbiAgICAgKiBndWFyYW50ZWVzLiBUaGVyZSBpcyBubyBwcmUtZW1wdGl2ZSBwcnVuaW5nIG9mIGV4cGlyZWQgaXRlbXMsIGJ1dCB5b3VcbiAgICAgKiBfbWF5XyBzZXQgYSBUVEwgb24gdGhlIGNhY2hlLCBhbmQgaXQgd2lsbCB0cmVhdCBleHBpcmVkIGl0ZW1zIGFzIG1pc3NpbmdcbiAgICAgKiB3aGVuIHRoZXkgYXJlIGZldGNoZWQsIGFuZCBkZWxldGUgdGhlbS5cbiAgICAgKlxuICAgICAqIE9wdGlvbmFsLCBidXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGluIG1zIGlmIHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBhbiBvcHRpb25zIG9iamVjdCB0byBgY2FjaGUuc2V0KClgLlxuICAgICAqXG4gICAgICogQXQgbGVhc3Qgb25lIG9mIGBtYXhgLCBgbWF4U2l6ZWAsIG9yIGBUVExgIGlzIHJlcXVpcmVkLiBUaGlzIG11c3QgYmUgYVxuICAgICAqIHBvc2l0aXZlIGludGVnZXIgaWYgc2V0LlxuICAgICAqXG4gICAgICogRXZlbiBpZiB0dGwgdHJhY2tpbmcgaXMgZW5hYmxlZCwgKippdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBzZXQgYVxuICAgICAqIGBtYXhgIHRvIHByZXZlbnQgdW5ib3VuZGVkIGdyb3d0aCBvZiB0aGUgY2FjaGUuKipcbiAgICAgKlxuICAgICAqIElmIHR0bCB0cmFja2luZyBpcyBlbmFibGVkLCBhbmQgYG1heGAgYW5kIGBtYXhTaXplYCBhcmUgbm90IHNldCxcbiAgICAgKiBhbmQgYHR0bEF1dG9wdXJnZWAgaXMgbm90IHNldCwgdGhlbiBhIHdhcm5pbmcgd2lsbCBiZSBlbWl0dGVkXG4gICAgICogY2F1dGlvbmluZyBhYm91dCB0aGUgcG90ZW50aWFsIGZvciB1bmJvdW5kZWQgbWVtb3J5IGNvbnN1bXB0aW9uLlxuICAgICAqIChUaGUgVHlwZVNjcmlwdCBkZWZpbml0aW9ucyB3aWxsIGFsc28gZGlzY291cmFnZSB0aGlzLilcbiAgICAgKi9cbiAgICB0dGw/OiBNaWxsaXNlY29uZHNcblxuICAgIC8qKlxuICAgICAqIE1pbmltdW0gYW1vdW50IG9mIHRpbWUgaW4gbXMgaW4gd2hpY2ggdG8gY2hlY2sgZm9yIHN0YWxlbmVzcy5cbiAgICAgKiBEZWZhdWx0cyB0byAxLCB3aGljaCBtZWFucyB0aGF0IHRoZSBjdXJyZW50IHRpbWUgaXMgY2hlY2tlZFxuICAgICAqIGF0IG1vc3Qgb25jZSBwZXIgbWlsbGlzZWNvbmQuXG4gICAgICpcbiAgICAgKiBTZXQgdG8gMCB0byBjaGVjayB0aGUgY3VycmVudCB0aW1lIGV2ZXJ5IHRpbWUgc3RhbGVuZXNzIGlzIHRlc3RlZC5cbiAgICAgKiAoVGhpcyByZWR1Y2VzIHBlcmZvcm1hbmNlLCBhbmQgaXMgdGhlb3JldGljYWxseSB1bm5lY2Vzc2FyeS4pXG4gICAgICpcbiAgICAgKiBTZXR0aW5nIHRoaXMgdG8gYSBoaWdoZXIgdmFsdWUgd2lsbCBpbXByb3ZlIHBlcmZvcm1hbmNlIHNvbWV3aGF0XG4gICAgICogd2hpbGUgdXNpbmcgdHRsIHRyYWNraW5nLCBhbGJlaXQgYXQgdGhlIGV4cGVuc2Ugb2Yga2VlcGluZyBzdGFsZVxuICAgICAqIGl0ZW1zIGFyb3VuZCBhIGJpdCBsb25nZXIgdGhhbiB0aGVpciBUVExzIHdvdWxkIGluZGljYXRlLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgMVxuICAgICAqL1xuICAgIHR0bFJlc29sdXRpb24/OiBNaWxsaXNlY29uZHNcblxuICAgIC8qKlxuICAgICAqIFByZWVtcHRpdmVseSByZW1vdmUgc3RhbGUgaXRlbXMgZnJvbSB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBtYXkgKnNpZ25pZmljYW50bHkqIGRlZ3JhZGUgcGVyZm9ybWFuY2UsIGVzcGVjaWFsbHkgaWZcbiAgICAgKiB0aGUgY2FjaGUgaXMgc3RvcmluZyBhIGxhcmdlIG51bWJlciBvZiBpdGVtcy4gSXQgaXMgYWxtb3N0IGFsd2F5cyBiZXN0XG4gICAgICogdG8ganVzdCBsZWF2ZSB0aGUgc3RhbGUgaXRlbXMgaW4gdGhlIGNhY2hlLCBhbmQgbGV0IHRoZW0gZmFsbCBvdXQgYXMgbmV3XG4gICAgICogaXRlbXMgYXJlIGFkZGVkLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoaXMgbWVhbnMgdGhhdCB7QGxpbmsgT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZX0gaXMgYSBiaXRcbiAgICAgKiBwb2ludGxlc3MsIGFzIHN0YWxlIGl0ZW1zIHdpbGwgYmUgZGVsZXRlZCBhbG1vc3QgYXMgc29vbiBhcyB0aGV5XG4gICAgICogZXhwaXJlLlxuICAgICAqXG4gICAgICogVXNlIHdpdGggY2F1dGlvbiFcbiAgICAgKi9cbiAgICB0dGxBdXRvcHVyZ2U/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBXaGVuIHVzaW5nIHRpbWUtZXhwaXJpbmcgZW50cmllcyB3aXRoIGB0dGxgLCBzZXR0aW5nIHRoaXMgdG8gYHRydWVgIHdpbGxcbiAgICAgKiBtYWtlIGVhY2ggaXRlbSdzIGFnZSByZXNldCB0byAwIHdoZW5ldmVyIGl0IGlzIHJldHJpZXZlZCBmcm9tIGNhY2hlIHdpdGhcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUjZ2V0fSwgY2F1c2luZyBpdCB0byBub3QgZXhwaXJlLiAoSXQgY2FuIHN0aWxsIGZhbGwgb3V0XG4gICAgICogb2YgY2FjaGUgYmFzZWQgb24gcmVjZW5jeSBvZiB1c2UsIG9mIGNvdXJzZS4pXG4gICAgICpcbiAgICAgKiBIYXMgbm8gZWZmZWN0IGlmIHtAbGluayBPcHRpb25zQmFzZS50dGx9IGlzIG5vdCBzZXQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGJ5IHBhc3NpbmcgYW4gb3B0aW9ucyBvYmplY3QgdG8gYGNhY2hlLmdldCgpYC5cbiAgICAgKi9cbiAgICB1cGRhdGVBZ2VPbkdldD86IGJvb2xlYW5cblxuICAgIC8qKlxuICAgICAqIFdoZW4gdXNpbmcgdGltZS1leHBpcmluZyBlbnRyaWVzIHdpdGggYHR0bGAsIHNldHRpbmcgdGhpcyB0byBgdHJ1ZWAgd2lsbFxuICAgICAqIG1ha2UgZWFjaCBpdGVtJ3MgYWdlIHJlc2V0IHRvIDAgd2hlbmV2ZXIgaXRzIHByZXNlbmNlIGluIHRoZSBjYWNoZSBpc1xuICAgICAqIGNoZWNrZWQgd2l0aCB7QGxpbmsgTFJVQ2FjaGUjaGFzfSwgY2F1c2luZyBpdCB0byBub3QgZXhwaXJlLiAoSXQgY2FuXG4gICAgICogc3RpbGwgZmFsbCBvdXQgb2YgY2FjaGUgYmFzZWQgb24gcmVjZW5jeSBvZiB1c2UsIG9mIGNvdXJzZS4pXG4gICAgICpcbiAgICAgKiBIYXMgbm8gZWZmZWN0IGlmIHtAbGluayBPcHRpb25zQmFzZS50dGx9IGlzIG5vdCBzZXQuXG4gICAgICovXG4gICAgdXBkYXRlQWdlT25IYXM/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBBbGxvdyB7QGxpbmsgTFJVQ2FjaGUjZ2V0fSBhbmQge0BsaW5rIExSVUNhY2hlI2ZldGNofSBjYWxscyB0byByZXR1cm5cbiAgICAgKiBzdGFsZSBkYXRhLCBpZiBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBpZiB5b3Ugc2V0IGB0dGxgLCBzdGFsZSBpdGVtcyB3aWxsIG9ubHkgYmUgZGVsZXRlZCBmcm9tIHRoZVxuICAgICAqIGNhY2hlIHdoZW4geW91IGBnZXQoa2V5KWAuIFRoYXQgaXMsIGl0J3Mgbm90IHByZWVtcHRpdmVseSBwcnVuaW5nIGl0ZW1zLFxuICAgICAqIHVubGVzcyB7QGxpbmsgT3B0aW9uc0Jhc2UudHRsQXV0b3B1cmdlfSBpcyBzZXQuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugc2V0IGBhbGxvd1N0YWxlOnRydWVgLCBpdCdsbCByZXR1cm4gdGhlIHN0YWxlIHZhbHVlICphcyB3ZWxsIGFzKlxuICAgICAqIGRlbGV0aW5nIGl0LiBJZiB5b3UgZG9uJ3Qgc2V0IHRoaXMsIHRoZW4gaXQnbGwgcmV0dXJuIGB1bmRlZmluZWRgIHdoZW5cbiAgICAgKiB5b3UgdHJ5IHRvIGdldCBhIHN0YWxlIGVudHJ5LlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHdoZW4gYSBzdGFsZSBlbnRyeSBpcyBmZXRjaGVkLCBfZXZlbiBpZiBpdCBpcyByZXR1cm5lZCBkdWUgdG9cbiAgICAgKiBgYWxsb3dTdGFsZWAgYmVpbmcgc2V0XywgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSBpbW1lZGlhdGVseS4gWW91XG4gICAgICogY2FuIHN1cHByZXNzIHRoaXMgYmVoYXZpb3IgYnkgc2V0dGluZ1xuICAgICAqIHtAbGluayBPcHRpb25zQmFzZS5ub0RlbGV0ZU9uU3RhbGVHZXR9LCBlaXRoZXIgaW4gdGhlIGNvbnN0cnVjdG9yLCBvciBpblxuICAgICAqIHRoZSBvcHRpb25zIHByb3ZpZGVkIHRvIHtAbGluayBMUlVDYWNoZSNnZXR9LlxuICAgICAqXG4gICAgICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nIGFuIG9wdGlvbnMgb2JqZWN0IHRvIGBjYWNoZS5nZXQoKWAuXG4gICAgICogVGhlIGBjYWNoZS5oYXMoKWAgbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybiBgZmFsc2VgIGZvciBzdGFsZSBpdGVtcy5cbiAgICAgKlxuICAgICAqIE9ubHkgcmVsZXZhbnQgaWYgYSB0dGwgaXMgc2V0LlxuICAgICAqL1xuICAgIGFsbG93U3RhbGU/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBvbiBpdGVtcyB3aGVuIHRoZXkgYXJlIGRyb3BwZWQgZnJvbSB0aGVcbiAgICAgKiBjYWNoZSwgYXMgYGRpc3Bvc2UodmFsdWUsIGtleSwgcmVhc29uKWAuXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbiBiZSBoYW5keSBpZiB5b3Ugd2FudCB0byBjbG9zZSBmaWxlIGRlc2NyaXB0b3JzIG9yIGRvXG4gICAgICogb3RoZXIgY2xlYW51cCB0YXNrcyB3aGVuIGl0ZW1zIGFyZSBubyBsb25nZXIgc3RvcmVkIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqICoqTk9URSoqOiBJdCBpcyBjYWxsZWQgX2JlZm9yZV8gdGhlIGl0ZW0gaGFzIGJlZW4gZnVsbHkgcmVtb3ZlZFxuICAgICAqIGZyb20gdGhlIGNhY2hlLCBzbyBpZiB5b3Ugd2FudCB0byBwdXQgaXQgcmlnaHQgYmFjayBpbiwgeW91IG5lZWRcbiAgICAgKiB0byB3YWl0IHVudGlsIHRoZSBuZXh0IHRpY2suIElmIHlvdSB0cnkgdG8gYWRkIGl0IGJhY2sgaW4gZHVyaW5nXG4gICAgICogdGhlIGBkaXNwb3NlKClgIGZ1bmN0aW9uIGNhbGwsIGl0IHdpbGwgYnJlYWsgdGhpbmdzIGluIHN1YnRsZSBhbmRcbiAgICAgKiB3ZWlyZCB3YXlzLlxuICAgICAqXG4gICAgICogVW5saWtlIHNldmVyYWwgb3RoZXIgb3B0aW9ucywgdGhpcyBtYXkgX25vdF8gYmUgb3ZlcnJpZGRlbiBieVxuICAgICAqIHBhc3NpbmcgYW4gb3B0aW9uIHRvIGBzZXQoKWAsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLlxuICAgICAqXG4gICAgICogVGhlIGByZWFzb25gIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5ncywgY29ycmVzcG9uZGluZ1xuICAgICAqIHRvIHRoZSByZWFzb24gZm9yIHRoZSBpdGVtJ3MgZGVsZXRpb246XG4gICAgICpcbiAgICAgKiAtIGBldmljdGAgSXRlbSB3YXMgZXZpY3RlZCB0byBtYWtlIHNwYWNlIGZvciBhIG5ldyBhZGRpdGlvblxuICAgICAqIC0gYHNldGAgSXRlbSB3YXMgb3ZlcndyaXR0ZW4gYnkgYSBuZXcgdmFsdWVcbiAgICAgKiAtIGBleHBpcmVgIEl0ZW0gZXhwaXJlZCBpdHMgVFRMXG4gICAgICogLSBgZmV0Y2hgIEl0ZW0gd2FzIGRlbGV0ZWQgZHVlIHRvIGEgZmFpbGVkIG9yIGFib3J0ZWQgZmV0Y2gsIG9yIGFcbiAgICAgKiAgIGZldGNoTWV0aG9kIHJldHVybmluZyBgdW5kZWZpbmVkLlxuICAgICAqIC0gYGRlbGV0ZWAgSXRlbSB3YXMgcmVtb3ZlZCBieSBleHBsaWNpdCBgY2FjaGUuZGVsZXRlKGtleSlgLFxuICAgICAqICAgYGNhY2hlLmNsZWFyKClgLCBvciBgY2FjaGUuc2V0KGtleSwgdW5kZWZpbmVkKWAuXG4gICAgICovXG4gICAgZGlzcG9zZT86IERpc3Bvc2VyPEssIFY+XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIG5ldyBpdGVtcyBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgY2FjaGUsXG4gICAgICogYXMgYG9uSW5zZXJ0KHZhbHVlLCBrZXksIHJlYXNvbilgLlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBuZWVkIHRvIHBlcmZvcm0gYWN0aW9ucyB3aGVuIGFuIGl0ZW0gaXNcbiAgICAgKiBhZGRlZCwgc3VjaCBhcyBsb2dnaW5nIG9yIHRyYWNraW5nIGluc2VydGlvbnMuXG4gICAgICpcbiAgICAgKiBVbmxpa2Ugc29tZSBvdGhlciBvcHRpb25zLCB0aGlzIG1heSBfbm90XyBiZSBvdmVycmlkZGVuIGJ5IHBhc3NpbmdcbiAgICAgKiBhbiBvcHRpb24gdG8gYHNldCgpYCwgZm9yIHBlcmZvcm1hbmNlIGFuZCBjb25zaXN0ZW5jeSByZWFzb25zLlxuICAgICAqL1xuICAgIG9uSW5zZXJ0PzogSW5zZXJ0ZXI8SywgVj5cblxuICAgIC8qKlxuICAgICAqIFRoZSBzYW1lIGFzIHtAbGluayBPcHRpb25zQmFzZS5kaXNwb3NlfSwgYnV0IGNhbGxlZCAqYWZ0ZXIqIHRoZSBlbnRyeVxuICAgICAqIGlzIGNvbXBsZXRlbHkgcmVtb3ZlZCBhbmQgdGhlIGNhY2hlIGlzIG9uY2UgYWdhaW4gaW4gYSBjbGVhbiBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEl0IGlzIHNhZmUgdG8gYWRkIGFuIGl0ZW0gcmlnaHQgYmFjayBpbnRvIHRoZSBjYWNoZSBhdCB0aGlzIHBvaW50LlxuICAgICAqIEhvd2V2ZXIsIG5vdGUgdGhhdCBpdCBpcyAqdmVyeSogZWFzeSB0byBpbmFkdmVydGVudGx5IGNyZWF0ZSBpbmZpbml0ZVxuICAgICAqIHJlY3Vyc2lvbiB0aGlzIHdheS5cbiAgICAgKi9cbiAgICBkaXNwb3NlQWZ0ZXI/OiBEaXNwb3NlcjxLLCBWPlxuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIHRydWUgdG8gc3VwcHJlc3MgY2FsbGluZyB0aGVcbiAgICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2UuZGlzcG9zZX0gZnVuY3Rpb24gaWYgdGhlIGVudHJ5IGtleSBpc1xuICAgICAqIHN0aWxsIGFjY2Vzc2libGUgd2l0aGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBhbiBvcHRpb25zIG9iamVjdCB0b1xuICAgICAqIHtAbGluayBMUlVDYWNoZSNzZXR9LlxuICAgICAqXG4gICAgICogT25seSByZWxldmFudCBpZiBgZGlzcG9zZWAgb3IgYGRpc3Bvc2VBZnRlcmAgYXJlIHNldC5cbiAgICAgKi9cbiAgICBub0Rpc3Bvc2VPblNldD86IGJvb2xlYW5cblxuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gZmxhZyB0byB0ZWxsIHRoZSBjYWNoZSB0byBub3QgdXBkYXRlIHRoZSBUVEwgd2hlbiBzZXR0aW5nIGEgbmV3XG4gICAgICogdmFsdWUgZm9yIGFuIGV4aXN0aW5nIGtleSAoaWUsIHdoZW4gdXBkYXRpbmcgYSB2YWx1ZSByYXRoZXIgdGhhblxuICAgICAqIGluc2VydGluZyBhIG5ldyB2YWx1ZSkuICBOb3RlIHRoYXQgdGhlIFRUTCB2YWx1ZSBpcyBfYWx3YXlzXyBzZXQgKGlmXG4gICAgICogcHJvdmlkZWQpIHdoZW4gYWRkaW5nIGEgbmV3IGVudHJ5IGludG8gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiBhIHtAbGluayBPcHRpb25zQmFzZS50dGx9IGlzIG5vdCBzZXQuXG4gICAgICpcbiAgICAgKiBNYXkgYmUgcGFzc2VkIGFzIGFuIG9wdGlvbiB0byB7QGxpbmsgTFJVQ2FjaGUjc2V0fS5cbiAgICAgKi9cbiAgICBub1VwZGF0ZVRUTD86IGJvb2xlYW5cblxuICAgIC8qKlxuICAgICAqIFNldCB0byBhIHBvc2l0aXZlIGludGVnZXIgdG8gdHJhY2sgdGhlIHNpemVzIG9mIGl0ZW1zIGFkZGVkIHRvIHRoZVxuICAgICAqIGNhY2hlLCBhbmQgYXV0b21hdGljYWxseSBldmljdCBpdGVtcyBpbiBvcmRlciB0byBzdGF5IGJlbG93IHRoaXMgc2l6ZS5cbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBtYXkgcmVzdWx0IGluIGZld2VyIHRoYW4gYG1heGAgaXRlbXMgYmVpbmcgc3RvcmVkLlxuICAgICAqXG4gICAgICogQXR0ZW1wdGluZyB0byBhZGQgYW4gaXRlbSB0byB0aGUgY2FjaGUgd2hvc2UgY2FsY3VsYXRlZCBzaXplIGlzIGdyZWF0ZXJcbiAgICAgKiB0aGF0IHRoaXMgYW1vdW50IHdpbGwgYmUgYSBuby1vcC4gVGhlIGl0ZW0gd2lsbCBub3QgYmUgY2FjaGVkLCBhbmQgbm9cbiAgICAgKiBvdGhlciBpdGVtcyB3aWxsIGJlIGV2aWN0ZWQuXG4gICAgICpcbiAgICAgKiBPcHRpb25hbCwgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBTZXRzIGBtYXhFbnRyeVNpemVgIHRvIHRoZSBzYW1lIHZhbHVlLCB1bmxlc3MgYSBkaWZmZXJlbnQgdmFsdWUgaXNcbiAgICAgKiBwcm92aWRlZCBmb3IgYG1heEVudHJ5U2l6ZWAuXG4gICAgICpcbiAgICAgKiBBdCBsZWFzdCBvbmUgb2YgYG1heGAsIGBtYXhTaXplYCwgb3IgYFRUTGAgaXMgcmVxdWlyZWQuIFRoaXMgbXVzdCBiZSBhXG4gICAgICogcG9zaXRpdmUgaW50ZWdlciBpZiBzZXQuXG4gICAgICpcbiAgICAgKiBFdmVuIGlmIHNpemUgdHJhY2tpbmcgaXMgZW5hYmxlZCwgKippdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBzZXQgYVxuICAgICAqIGBtYXhgIHRvIHByZXZlbnQgdW5ib3VuZGVkIGdyb3d0aCBvZiB0aGUgY2FjaGUuKipcbiAgICAgKlxuICAgICAqIE5vdGUgYWxzbyB0aGF0IHNpemUgdHJhY2tpbmcgY2FuIG5lZ2F0aXZlbHkgaW1wYWN0IHBlcmZvcm1hbmNlLFxuICAgICAqIHRob3VnaCBmb3IgbW9zdCBjYXNlcywgb25seSBtaW5pbWFsbHkuXG4gICAgICovXG4gICAgbWF4U2l6ZT86IFNpemVcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGFsbG93ZWQgc2l6ZSBmb3IgYW55IHNpbmdsZSBpdGVtIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIElmIGEgbGFyZ2VyIGl0ZW0gaXMgcGFzc2VkIHRvIHtAbGluayBMUlVDYWNoZSNzZXR9IG9yIHJldHVybmVkIGJ5IGFcbiAgICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9IG9yIHtAbGluayBPcHRpb25zQmFzZS5tZW1vTWV0aG9kfSwgdGhlblxuICAgICAqIGl0IHdpbGwgbm90IGJlIHN0b3JlZCBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBBdHRlbXB0aW5nIHRvIGFkZCBhbiBpdGVtIHdob3NlIGNhbGN1bGF0ZWQgc2l6ZSBpcyBncmVhdGVyIHRoYW5cbiAgICAgKiB0aGlzIGFtb3VudCB3aWxsIG5vdCBjYWNoZSB0aGUgaXRlbSBvciBldmljdCBhbnkgb2xkIGl0ZW1zLCBidXRcbiAgICAgKiBXSUxMIGRlbGV0ZSBhbiBleGlzdGluZyB2YWx1ZSBpZiBvbmUgaXMgYWxyZWFkeSBwcmVzZW50LlxuICAgICAqXG4gICAgICogT3B0aW9uYWwsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHByb3ZpZGVkLiBEZWZhdWx0cyB0b1xuICAgICAqIHRoZSB2YWx1ZSBvZiBgbWF4U2l6ZWAgaWYgcHJvdmlkZWQuXG4gICAgICovXG4gICAgbWF4RW50cnlTaXplPzogU2l6ZVxuXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBudW1iZXIgaW5kaWNhdGluZyB0aGUgaXRlbSdzIHNpemUuXG4gICAgICpcbiAgICAgKiBSZXF1aXJlcyB7QGxpbmsgT3B0aW9uc0Jhc2UubWF4U2l6ZX0gdG8gYmUgc2V0LlxuICAgICAqXG4gICAgICogSWYgbm90IHByb3ZpZGVkLCBhbmQge0BsaW5rIE9wdGlvbnNCYXNlLm1heFNpemV9IG9yXG4gICAgICoge0BsaW5rIE9wdGlvbnNCYXNlLm1heEVudHJ5U2l6ZX0gYXJlIHNldCwgdGhlbiBhbGxcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUjc2V0fSBjYWxscyAqKm11c3QqKiBwcm92aWRlIGFuIGV4cGxpY2l0XG4gICAgICoge0BsaW5rIFNldE9wdGlvbnMuc2l6ZX0gb3Igc2l6ZUNhbGN1bGF0aW9uIHBhcmFtLlxuICAgICAqL1xuICAgIHNpemVDYWxjdWxhdGlvbj86IFNpemVDYWxjdWxhdG9yPEssIFY+XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgdGhhdCBwcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBMUlVDYWNoZSNmZXRjaH1cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZmV0Y2hNZXRob2Qoa2V5LCBzdGFsZVZhbHVlLCB7IHNpZ25hbCwgb3B0aW9ucywgY29udGV4dCB9KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSWYgYGZldGNoTWV0aG9kYCBpcyBub3QgcHJvdmlkZWQsIHRoZW4gYGNhY2hlLmZldGNoKGtleSlgIGlzIGVxdWl2YWxlbnRcbiAgICAgKiB0byBgUHJvbWlzZS5yZXNvbHZlKGNhY2hlLmdldChrZXkpKWAuXG4gICAgICpcbiAgICAgKiBJZiBhdCBhbnkgdGltZSwgYHNpZ25hbC5hYm9ydGVkYCBpcyBzZXQgdG8gYHRydWVgLCBvciBpZiB0aGVcbiAgICAgKiBgc2lnbmFsLm9uYWJvcnRgIG1ldGhvZCBpcyBjYWxsZWQsIG9yIGlmIGl0IGVtaXRzIGFuIGAnYWJvcnQnYCBldmVudFxuICAgICAqIHdoaWNoIHlvdSBjYW4gbGlzdGVuIHRvIHdpdGggYGFkZEV2ZW50TGlzdGVuZXJgLCB0aGVuIHRoYXQgbWVhbnMgdGhhdFxuICAgICAqIHRoZSBmZXRjaCBzaG91bGQgYmUgYWJhbmRvbmVkLiBUaGlzIG1heSBiZSBwYXNzZWQgYWxvbmcgdG8gYXN5bmNcbiAgICAgKiBmdW5jdGlvbnMgYXdhcmUgb2YgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIGJlaGF2aW9yLlxuICAgICAqXG4gICAgICogVGhlIGBmZXRjaE1ldGhvZGAgc2hvdWxkICoqb25seSoqIHJldHVybiBgdW5kZWZpbmVkYCBvciBhIFByb21pc2VcbiAgICAgKiByZXNvbHZpbmcgdG8gYHVuZGVmaW5lZGAgaWYgdGhlIEFib3J0Q29udHJvbGxlciBzaWduYWxlZCBhbiBgYWJvcnRgXG4gICAgICogZXZlbnQuIEluIGFsbCBvdGhlciBjYXNlcywgaXQgc2hvdWxkIHJldHVybiBvciByZXNvbHZlIHRvIGEgdmFsdWVcbiAgICAgKiBzdWl0YWJsZSBmb3IgYWRkaW5nIHRvIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIFRoZSBgb3B0aW9uc2Agb2JqZWN0IGlzIGEgdW5pb24gb2YgdGhlIG9wdGlvbnMgdGhhdCBtYXkgYmUgcHJvdmlkZWQgdG9cbiAgICAgKiBgc2V0KClgIGFuZCBgZ2V0KClgLiBJZiB0aGV5IGFyZSBtb2RpZmllZCwgdGhlbiB0aGF0IHdpbGwgcmVzdWx0IGluXG4gICAgICogbW9kaWZ5aW5nIHRoZSBzZXR0aW5ncyB0byBgY2FjaGUuc2V0KClgIHdoZW4gdGhlIHZhbHVlIGlzIHJlc29sdmVkLCBhbmRcbiAgICAgKiBpbiB0aGUgY2FzZSBvZlxuICAgICAqIHtAbGluayBPcHRpb25zQmFzZS5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb259IGFuZFxuICAgICAqIHtAbGluayBPcHRpb25zQmFzZS5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbn0sIHRoZSBoYW5kbGluZyBvZlxuICAgICAqIGBmZXRjaE1ldGhvZGAgZmFpbHVyZXMuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgYSBETlMgY2FjaGUgbWF5IHVwZGF0ZSB0aGUgVFRMIGJhc2VkIG9uIHRoZSB2YWx1ZSByZXR1cm5lZFxuICAgICAqIGZyb20gYSByZW1vdGUgRE5TIHNlcnZlciBieSBjaGFuZ2luZyBgb3B0aW9ucy50dGxgIGluIHRoZSBgZmV0Y2hNZXRob2RgLlxuICAgICAqL1xuICAgIGZldGNoTWV0aG9kPzogRmV0Y2hlcjxLLCBWLCBGQz5cblxuICAgIC8qKlxuICAgICAqIE1ldGhvZCB0aGF0IHByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIExSVUNhY2hlI21lbW99XG4gICAgICovXG4gICAgbWVtb01ldGhvZD86IE1lbW9pemVyPEssIFYsIEZDPlxuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIHRydWUgdG8gc3VwcHJlc3MgdGhlIGRlbGV0aW9uIG9mIHN0YWxlIGRhdGEgd2hlbiBhXG4gICAgICoge0BsaW5rIE9wdGlvbnNCYXNlLmZldGNoTWV0aG9kfSByZXR1cm5zIGEgcmVqZWN0ZWQgcHJvbWlzZS5cbiAgICAgKi9cbiAgICBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBEbyBub3QgZGVsZXRlIHN0YWxlIGl0ZW1zIHdoZW4gdGhleSBhcmUgcmV0cmlldmVkIHdpdGhcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUjZ2V0fS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB0aGUgYGdldGAgcmV0dXJuIHZhbHVlIHdpbGwgc3RpbGwgYmUgYHVuZGVmaW5lZGBcbiAgICAgKiB1bmxlc3Mge0BsaW5rIE9wdGlvbnNCYXNlLmFsbG93U3RhbGV9IGlzIHRydWUuXG4gICAgICpcbiAgICAgKiBXaGVuIHVzaW5nIHRpbWUtZXhwaXJpbmcgZW50cmllcyB3aXRoIGB0dGxgLCBieSBkZWZhdWx0IHN0YWxlXG4gICAgICogaXRlbXMgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGNhY2hlIHdoZW4gdGhlIGtleSBpcyBhY2Nlc3NlZFxuICAgICAqIHdpdGggYGNhY2hlLmdldCgpYC5cbiAgICAgKlxuICAgICAqIFNldHRpbmcgdGhpcyBvcHRpb24gd2lsbCBjYXVzZSBzdGFsZSBpdGVtcyB0byByZW1haW4gaW4gdGhlIGNhY2hlLCB1bnRpbFxuICAgICAqIHRoZXkgYXJlIGV4cGxpY2l0bHkgZGVsZXRlZCB3aXRoIGBjYWNoZS5kZWxldGUoa2V5KWAsIG9yIHJldHJpZXZlZCB3aXRoXG4gICAgICogYG5vRGVsZXRlT25TdGFsZUdldGAgc2V0IHRvIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGJ5IHBhc3NpbmcgYW4gb3B0aW9ucyBvYmplY3QgdG8gYGNhY2hlLmdldCgpYC5cbiAgICAgKlxuICAgICAqIE9ubHkgcmVsZXZhbnQgaWYgYSB0dGwgaXMgdXNlZC5cbiAgICAgKi9cbiAgICBub0RlbGV0ZU9uU3RhbGVHZXQ/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gdHJ1ZSB0byBhbGxvdyByZXR1cm5pbmcgc3RhbGUgZGF0YSB3aGVuIGFcbiAgICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9IHRocm93cyBhbiBlcnJvciBvciByZXR1cm5zIGEgcmVqZWN0ZWRcbiAgICAgKiBwcm9taXNlLlxuICAgICAqXG4gICAgICogVGhpcyBkaWZmZXJzIGZyb20gdXNpbmcge0BsaW5rIE9wdGlvbnNCYXNlLmFsbG93U3RhbGV9IGluIHRoYXQgc3RhbGVcbiAgICAgKiBkYXRhIHdpbGwgT05MWSBiZSByZXR1cm5lZCBpbiB0aGUgY2FzZSB0aGF0IHRoZSB7QGxpbmsgTFJVQ2FjaGUjZmV0Y2h9XG4gICAgICogZmFpbHMsIG5vdCBhbnkgb3RoZXIgdGltZXMuXG4gICAgICpcbiAgICAgKiBJZiBhIGBmZXRjaE1ldGhvZGAgZmFpbHMsIGFuZCB0aGVyZSBpcyBubyBzdGFsZSB2YWx1ZSBhdmFpbGFibGUsIHRoZVxuICAgICAqIGBmZXRjaCgpYCB3aWxsIHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuIEllLCBhbGwgYGZldGNoTWV0aG9kYCBlcnJvcnMgYXJlXG4gICAgICogc3VwcHJlc3NlZC5cbiAgICAgKlxuICAgICAqIEltcGxpZXMgYG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBUaGlzIG1heSBiZSBzZXQgaW4gY2FsbHMgdG8gYGZldGNoKClgLCBvciBkZWZhdWx0ZWQgb24gdGhlIGNvbnN0cnVjdG9yLFxuICAgICAqIG9yIG92ZXJyaWRkZW4gYnkgbW9kaWZ5aW5nIHRoZSBvcHRpb25zIG9iamVjdCBpbiB0aGUgYGZldGNoTWV0aG9kYC5cbiAgICAgKi9cbiAgICBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbj86IGJvb2xlYW5cblxuICAgIC8qKlxuICAgICAqIFNldCB0byB0cnVlIHRvIHJldHVybiBhIHN0YWxlIHZhbHVlIGZyb20gdGhlIGNhY2hlIHdoZW4gdGhlXG4gICAgICogYEFib3J0U2lnbmFsYCBwYXNzZWQgdG8gdGhlIHtAbGluayBPcHRpb25zQmFzZS5mZXRjaE1ldGhvZH0gZGlzcGF0Y2hlc1xuICAgICAqIGFuIGAnYWJvcnQnYCBldmVudCwgd2hldGhlciB1c2VyLXRyaWdnZXJlZCwgb3IgZHVlIHRvIGludGVybmFsIGNhY2hlXG4gICAgICogYmVoYXZpb3IuXG4gICAgICpcbiAgICAgKiBVbmxlc3Mge0BsaW5rIE9wdGlvbnNCYXNlLmlnbm9yZUZldGNoQWJvcnR9IGlzIGFsc28gc2V0LCB0aGUgdW5kZXJseWluZ1xuICAgICAqIHtAbGluayBPcHRpb25zQmFzZS5mZXRjaE1ldGhvZH0gd2lsbCBzdGlsbCBiZSBjb25zaWRlcmVkIGNhbmNlbGVkLCBhbmRcbiAgICAgKiBhbnkgdmFsdWUgaXQgcmV0dXJucyB3aWxsIGJlIGlnbm9yZWQgYW5kIG5vdCBjYWNoZWQuXG4gICAgICpcbiAgICAgKiBDYXZlYXQ6IHNpbmNlIGZldGNoZXMgYXJlIGFib3J0ZWQgd2hlbiBhIG5ldyB2YWx1ZSBpcyBleHBsaWNpdGx5XG4gICAgICogc2V0IGluIHRoZSBjYWNoZSwgdGhpcyBjYW4gbGVhZCB0byBmZXRjaCByZXR1cm5pbmcgYSBzdGFsZSB2YWx1ZSxcbiAgICAgKiBzaW5jZSB0aGF0IHdhcyB0aGUgZmFsbGJhY2sgdmFsdWUgX2F0IHRoZSBtb21lbnQgdGhlIGBmZXRjaCgpYCB3YXNcbiAgICAgKiBpbml0aWF0ZWRfLCBldmVuIHRob3VnaCB0aGUgbmV3IHVwZGF0ZWQgdmFsdWUgaXMgbm93IHByZXNlbnQgaW5cbiAgICAgKiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgY2FjaGUgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nLCBhbnk+KHtcbiAgICAgKiAgIHR0bDogMTAwLFxuICAgICAqICAgZmV0Y2hNZXRob2Q6IGFzeW5jICh1cmwsIG9sZFZhbHVlLCB7IHNpZ25hbCB9KSA9PiAge1xuICAgICAqICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsIH0pXG4gICAgICogICAgIHJldHVybiBhd2FpdCByZXMuanNvbigpXG4gICAgICogICB9XG4gICAgICogfSlcbiAgICAgKiBjYWNoZS5zZXQoJ2h0dHBzOi8vZXhhbXBsZS5jb20vJywgeyBzb21lOiAnZGF0YScgfSlcbiAgICAgKiAvLyAxMDBtcyBnbyBieS4uLlxuICAgICAqIGNvbnN0IHJlc3VsdCA9IGNhY2hlLmZldGNoKCdodHRwczovL2V4YW1wbGUuY29tLycpXG4gICAgICogY2FjaGUuc2V0KCdodHRwczovL2V4YW1wbGUuY29tLycsIHsgb3RoZXI6ICd0aGluZycgfSlcbiAgICAgKiBjb25zb2xlLmxvZyhhd2FpdCByZXN1bHQpIC8vIHsgc29tZTogJ2RhdGEnIH1cbiAgICAgKiBjb25zb2xlLmxvZyhjYWNoZS5nZXQoJ2h0dHBzOi8vZXhhbXBsZS5jb20vJykpIC8vIHsgb3RoZXI6ICd0aGluZycgfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFsbG93U3RhbGVPbkZldGNoQWJvcnQ/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gdHJ1ZSB0byBpZ25vcmUgdGhlIGBhYm9ydGAgZXZlbnQgZW1pdHRlZCBieSB0aGUgYEFib3J0U2lnbmFsYFxuICAgICAqIG9iamVjdCBwYXNzZWQgdG8ge0BsaW5rIE9wdGlvbnNCYXNlLmZldGNoTWV0aG9kfSwgYW5kIHN0aWxsIGNhY2hlIHRoZVxuICAgICAqIHJlc3VsdGluZyByZXNvbHV0aW9uIHZhbHVlLCBhcyBsb25nIGFzIGl0IGlzIG5vdCBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIFdoZW4gdXNlZCBvbiBpdHMgb3duLCB0aGlzIG1lYW5zIGFib3J0ZWQge0BsaW5rIExSVUNhY2hlI2ZldGNofSBjYWxsc1xuICAgICAqIGFyZSBub3QgaW1tZWRpYXRlbHkgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiB0aGV5IGFyZSBhYm9ydGVkLCBhbmRcbiAgICAgKiBpbnN0ZWFkIHRha2UgdGhlIGZ1bGwgdGltZSB0byBhd2FpdC5cbiAgICAgKlxuICAgICAqIFdoZW4gdXNlZCB3aXRoIHtAbGluayBPcHRpb25zQmFzZS5hbGxvd1N0YWxlT25GZXRjaEFib3J0fSwgYWJvcnRlZFxuICAgICAqIHtAbGluayBMUlVDYWNoZSNmZXRjaH0gY2FsbHMgd2lsbCByZXNvbHZlIGltbWVkaWF0ZWx5IHRvIHRoZWlyIHN0YWxlXG4gICAgICogY2FjaGVkIHZhbHVlIG9yIGB1bmRlZmluZWRgLCBhbmQgd2lsbCBjb250aW51ZSB0byBwcm9jZXNzIGFuZCBldmVudHVhbGx5XG4gICAgICogdXBkYXRlIHRoZSBjYWNoZSB3aGVuIHRoZXkgcmVzb2x2ZSwgYXMgbG9uZyBhcyB0aGUgcmVzdWx0aW5nIHZhbHVlIGlzXG4gICAgICogbm90IGB1bmRlZmluZWRgLCB0aHVzIHN1cHBvcnRpbmcgYSBcInJldHVybiBzdGFsZSBvbiB0aW1lb3V0IHdoaWxlXG4gICAgICogcmVmcmVzaGluZ1wiIG1lY2hhbmlzbSBieSBwYXNzaW5nIGBBYm9ydFNpZ25hbC50aW1lb3V0KG4pYCBhcyB0aGUgc2lnbmFsLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IGMgPSBuZXcgTFJVQ2FjaGUoe1xuICAgICAqICAgdHRsOiAxMDAsXG4gICAgICogICBpZ25vcmVGZXRjaEFib3J0OiB0cnVlLFxuICAgICAqICAgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDogdHJ1ZSxcbiAgICAgKiAgIGZldGNoTWV0aG9kOiBhc3luYyAoa2V5LCBvbGRWYWx1ZSwgeyBzaWduYWwgfSkgPT4ge1xuICAgICAqICAgICAvLyBub3RlOiBkbyBOT1QgcGFzcyB0aGUgc2lnbmFsIHRvIGZldGNoKCkhXG4gICAgICogICAgIC8vIGxldCdzIHNheSB0aGlzIGZldGNoIGNhbiB0YWtlIGEgbG9uZyB0aW1lLlxuICAgICAqICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9zbG93LWJhY2tlbmQtc2VydmVyLyR7a2V5fWApXG4gICAgICogICAgIHJldHVybiBhd2FpdCByZXMuanNvbigpXG4gICAgICogICB9LFxuICAgICAqIH0pXG4gICAgICpcbiAgICAgKiAvLyB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzdGFsZSB2YWx1ZSBhZnRlciAxMDBtcywgd2hpbGUgc3RpbGxcbiAgICAgKiAvLyB1cGRhdGluZyBpbiB0aGUgYmFja2dyb3VuZCBmb3IgbmV4dCB0aW1lLlxuICAgICAqIGNvbnN0IHZhbCA9IGF3YWl0IGMuZmV0Y2goJ2tleScsIHsgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDEwMCkgfSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqICoqTm90ZSoqOiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZywgYW4gYGFib3J0YCBldmVudCBfaXMgc3RpbGxcbiAgICAgKiBlbWl0dGVkIG9uIHRoZSBgQWJvcnRTaWduYWxgIG9iamVjdF8sIHNvIG1heSByZXN1bHQgaW4gaW52YWxpZCByZXN1bHRzXG4gICAgICogd2hlbiBwYXNzZWQgdG8gb3RoZXIgdW5kZXJseWluZyBBUElzIHRoYXQgdXNlIEFib3J0U2lnbmFscy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gaW4gdGhlIHtAbGluayBPcHRpb25zQmFzZS5mZXRjaE1ldGhvZH0gb3IgdGhlXG4gICAgICogY2FsbCB0byB7QGxpbmsgTFJVQ2FjaGUjZmV0Y2h9LlxuICAgICAqL1xuICAgIGlnbm9yZUZldGNoQWJvcnQ/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IHdhbnQgdG8gc3dhcCBvdXQgdGhlIHBlcmZvcm1hbmNlL0RhdGUgb2JqZWN0XG4gICAgICogdXNlZCBmb3IgVFRMIHRyYWNraW5nLiBUaGlzIHNob3VsZCBhbG1vc3QgY2VydGFpbmx5IE5PVCBiZSBkb25lIGluXG4gICAgICogcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMhXG4gICAgICpcbiAgICAgKiBUaGlzIHZhbHVlIGRlZmF1bHRzIHRvIGBnbG9iYWwucGVyZm9ybWFuY2VgIGlmIGl0IGhhcyBhIGBub3coKWAgbWV0aG9kLFxuICAgICAqIG9yIHRoZSBgZ2xvYmFsLkRhdGVgIG9iamVjdCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcGVyZj86IFBlcmZcbiAgfVxuXG4gIGV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uc01heExpbWl0PEssIFYsIEZDPlxuICAgIGV4dGVuZHMgT3B0aW9uc0Jhc2U8SywgViwgRkM+IHtcbiAgICBtYXg6IENvdW50XG4gIH1cbiAgZXhwb3J0IGludGVyZmFjZSBPcHRpb25zVFRMTGltaXQ8SywgViwgRkM+XG4gICAgZXh0ZW5kcyBPcHRpb25zQmFzZTxLLCBWLCBGQz4ge1xuICAgIHR0bDogTWlsbGlzZWNvbmRzXG4gICAgdHRsQXV0b3B1cmdlOiBib29sZWFuXG4gIH1cbiAgZXhwb3J0IGludGVyZmFjZSBPcHRpb25zU2l6ZUxpbWl0PEssIFYsIEZDPlxuICAgIGV4dGVuZHMgT3B0aW9uc0Jhc2U8SywgViwgRkM+IHtcbiAgICBtYXhTaXplOiBTaXplXG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbGlkIHNhZmUgb3B0aW9ucyBmb3IgdGhlIHtAbGluayBMUlVDYWNoZX0gY29uc3RydWN0b3JcbiAgICovXG4gIGV4cG9ydCB0eXBlIE9wdGlvbnM8SywgViwgRkM+ID1cbiAgICB8IE9wdGlvbnNNYXhMaW1pdDxLLCBWLCBGQz5cbiAgICB8IE9wdGlvbnNTaXplTGltaXQ8SywgViwgRkM+XG4gICAgfCBPcHRpb25zVFRMTGltaXQ8SywgViwgRkM+XG5cbiAgLyoqXG4gICAqIEVudHJ5IG9iamVjdHMgdXNlZCBieSB7QGxpbmsgTFJVQ2FjaGUjbG9hZH0gYW5kIHtAbGluayBMUlVDYWNoZSNkdW1wfSxcbiAgICogYW5kIHJldHVybmVkIGJ5IHtAbGluayBMUlVDYWNoZSNpbmZvfS5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRW50cnk8Vj4ge1xuICAgIHZhbHVlOiBWXG4gICAgdHRsPzogTWlsbGlzZWNvbmRzXG4gICAgc2l6ZT86IFNpemVcbiAgICBzdGFydD86IE1pbGxpc2Vjb25kc1xuICB9XG59XG5cbi8qKlxuICogRGVmYXVsdCBleHBvcnQsIHRoZSB0aGluZyB5b3UncmUgdXNpbmcgdGhpcyBtb2R1bGUgdG8gZ2V0LlxuICpcbiAqIFRoZSBgS2AgYW5kIGBWYCB0eXBlcyBkZWZpbmUgdGhlIGtleSBhbmQgdmFsdWUgdHlwZXMsIHJlc3BlY3RpdmVseS4gVGhlXG4gKiBvcHRpb25hbCBgRkNgIHR5cGUgZGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgYGNvbnRleHRgIG9iamVjdCBwYXNzZWQgdG9cbiAqIGBjYWNoZS5mZXRjaCgpYCBhbmQgYGNhY2hlLm1lbW8oKWAuXG4gKlxuICogS2V5cyBhbmQgdmFsdWVzICoqbXVzdCBub3QqKiBiZSBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogQWxsIHByb3BlcnRpZXMgZnJvbSB0aGUgb3B0aW9ucyBvYmplY3QgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBgbWF4YCxcbiAqIGBtYXhTaXplYCwgYGZldGNoTWV0aG9kYCwgYG1lbW9NZXRob2RgLCBgZGlzcG9zZWAgYW5kIGBkaXNwb3NlQWZ0ZXJgKSBhcmVcbiAqIGFkZGVkIGFzIG5vcm1hbCBwdWJsaWMgbWVtYmVycy4gKFRoZSBsaXN0ZWQgb3B0aW9ucyBhcmUgcmVhZC1vbmx5IGdldHRlcnMuKVxuICpcbiAqIENoYW5naW5nIGFueSBvZiB0aGVzZSB3aWxsIGFsdGVyIHRoZSBkZWZhdWx0cyBmb3Igc3Vic2VxdWVudCBtZXRob2QgY2FsbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMUlVDYWNoZTxLIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgRkMgPSB1bmtub3duPiB7XG4gIC8vIG9wdGlvbnMgdGhhdCBjYW5ub3QgYmUgY2hhbmdlZCB3aXRob3V0IGRpc2FzdGVyXG4gIHJlYWRvbmx5ICNtYXg6IExSVUNhY2hlLkNvdW50XG4gIHJlYWRvbmx5ICNtYXhTaXplOiBMUlVDYWNoZS5TaXplXG4gIHJlYWRvbmx5ICNkaXNwb3NlPzogTFJVQ2FjaGUuRGlzcG9zZXI8SywgVj5cbiAgcmVhZG9ubHkgI29uSW5zZXJ0PzogTFJVQ2FjaGUuSW5zZXJ0ZXI8SywgVj5cbiAgcmVhZG9ubHkgI2Rpc3Bvc2VBZnRlcj86IExSVUNhY2hlLkRpc3Bvc2VyPEssIFY+XG4gIHJlYWRvbmx5ICNmZXRjaE1ldGhvZD86IExSVUNhY2hlLkZldGNoZXI8SywgViwgRkM+XG4gIHJlYWRvbmx5ICNtZW1vTWV0aG9kPzogTFJVQ2FjaGUuTWVtb2l6ZXI8SywgViwgRkM+XG4gIHJlYWRvbmx5ICNwZXJmOiBQZXJmXG5cbiAgLyoqXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5wZXJmfVxuICAgKi9cbiAgZ2V0IHBlcmYoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3BlcmZcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudHRsfVxuICAgKi9cbiAgdHRsOiBMUlVDYWNoZS5NaWxsaXNlY29uZHNcblxuICAvKipcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnR0bFJlc29sdXRpb259XG4gICAqL1xuICB0dGxSZXNvbHV0aW9uOiBMUlVDYWNoZS5NaWxsaXNlY29uZHNcbiAgLyoqXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS50dGxBdXRvcHVyZ2V9XG4gICAqL1xuICB0dGxBdXRvcHVyZ2U6IGJvb2xlYW5cbiAgLyoqXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS51cGRhdGVBZ2VPbkdldH1cbiAgICovXG4gIHVwZGF0ZUFnZU9uR2V0OiBib29sZWFuXG4gIC8qKlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudXBkYXRlQWdlT25IYXN9XG4gICAqL1xuICB1cGRhdGVBZ2VPbkhhczogYm9vbGVhblxuICAvKipcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGV9XG4gICAqL1xuICBhbGxvd1N0YWxlOiBib29sZWFuXG5cbiAgLyoqXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5ub0Rpc3Bvc2VPblNldH1cbiAgICovXG4gIG5vRGlzcG9zZU9uU2V0OiBib29sZWFuXG4gIC8qKlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uubm9VcGRhdGVUVEx9XG4gICAqL1xuICBub1VwZGF0ZVRUTDogYm9vbGVhblxuICAvKipcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm1heEVudHJ5U2l6ZX1cbiAgICovXG4gIG1heEVudHJ5U2l6ZTogTFJVQ2FjaGUuU2l6ZVxuICAvKipcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnNpemVDYWxjdWxhdGlvbn1cbiAgICovXG4gIHNpemVDYWxjdWxhdGlvbj86IExSVUNhY2hlLlNpemVDYWxjdWxhdG9yPEssIFY+XG4gIC8qKlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uubm9EZWxldGVPbkZldGNoUmVqZWN0aW9ufVxuICAgKi9cbiAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uOiBib29sZWFuXG4gIC8qKlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uubm9EZWxldGVPblN0YWxlR2V0fVxuICAgKi9cbiAgbm9EZWxldGVPblN0YWxlR2V0OiBib29sZWFuXG4gIC8qKlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydH1cbiAgICovXG4gIGFsbG93U3RhbGVPbkZldGNoQWJvcnQ6IGJvb2xlYW5cbiAgLyoqXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbn1cbiAgICovXG4gIGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOiBib29sZWFuXG4gIC8qKlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuaWdub3JlRmV0Y2hBYm9ydH1cbiAgICovXG4gIGlnbm9yZUZldGNoQWJvcnQ6IGJvb2xlYW5cblxuICAvLyBjb21wdXRlZCBwcm9wZXJ0aWVzXG4gICNzaXplOiBMUlVDYWNoZS5Db3VudFxuICAjY2FsY3VsYXRlZFNpemU6IExSVUNhY2hlLlNpemVcbiAgI2tleU1hcDogTWFwPEssIEluZGV4PlxuICAja2V5TGlzdDogKEsgfCB1bmRlZmluZWQpW11cbiAgI3ZhbExpc3Q6IChWIHwgQmFja2dyb3VuZEZldGNoPFY+IHwgdW5kZWZpbmVkKVtdXG4gICNuZXh0OiBOdW1iZXJBcnJheVxuICAjcHJldjogTnVtYmVyQXJyYXlcbiAgI2hlYWQ6IEluZGV4XG4gICN0YWlsOiBJbmRleFxuICAjZnJlZTogU3RhY2tMaWtlXG4gICNkaXNwb3NlZD86IERpc3Bvc2VUYXNrPEssIFY+W11cbiAgI3NpemVzPzogWmVyb0FycmF5XG4gICNzdGFydHM/OiBaZXJvQXJyYXlcbiAgI3R0bHM/OiBaZXJvQXJyYXlcbiAgI2F1dG9wdXJnZVRpbWVycz86ICh1bmRlZmluZWQgfCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PilbXVxuXG4gICNoYXNEaXNwb3NlOiBib29sZWFuXG4gICNoYXNGZXRjaE1ldGhvZDogYm9vbGVhblxuICAjaGFzRGlzcG9zZUFmdGVyOiBib29sZWFuXG4gICNoYXNPbkluc2VydDogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBEbyBub3QgY2FsbCB0aGlzIG1ldGhvZCB1bmxlc3MgeW91IG5lZWQgdG8gaW5zcGVjdCB0aGVcbiAgICogaW5uZXIgd29ya2luZ3Mgb2YgdGhlIGNhY2hlLiAgSWYgYW55dGhpbmcgcmV0dXJuZWQgYnkgdGhpc1xuICAgKiBvYmplY3QgaXMgbW9kaWZpZWQgaW4gYW55IHdheSwgc3RyYW5nZSBicmVha2FnZSBtYXkgb2NjdXIuXG4gICAqXG4gICAqIFRoZXNlIGZpZWxkcyBhcmUgcHJpdmF0ZSBmb3IgYSByZWFzb24hXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc3RhdGljIHVuc2FmZUV4cG9zZUludGVybmFsczxcbiAgICBLIGV4dGVuZHMge30sXG4gICAgViBleHRlbmRzIHt9LFxuICAgIEZDIGV4dGVuZHMgdW5rbm93biA9IHVua25vd24sXG4gID4oYzogTFJVQ2FjaGU8SywgViwgRkM+KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIHByb3BlcnRpZXNcbiAgICAgIHN0YXJ0czogYy4jc3RhcnRzLFxuICAgICAgdHRsczogYy4jdHRscyxcbiAgICAgIGF1dG9wdXJnZVRpbWVyczogYy4jYXV0b3B1cmdlVGltZXJzLFxuICAgICAgc2l6ZXM6IGMuI3NpemVzLFxuICAgICAga2V5TWFwOiBjLiNrZXlNYXAgYXMgTWFwPEssIG51bWJlcj4sXG4gICAgICBrZXlMaXN0OiBjLiNrZXlMaXN0LFxuICAgICAgdmFsTGlzdDogYy4jdmFsTGlzdCxcbiAgICAgIG5leHQ6IGMuI25leHQsXG4gICAgICBwcmV2OiBjLiNwcmV2LFxuICAgICAgZ2V0IGhlYWQoKSB7XG4gICAgICAgIHJldHVybiBjLiNoZWFkXG4gICAgICB9LFxuICAgICAgZ2V0IHRhaWwoKSB7XG4gICAgICAgIHJldHVybiBjLiN0YWlsXG4gICAgICB9LFxuICAgICAgZnJlZTogYy4jZnJlZSxcbiAgICAgIC8vIG1ldGhvZHNcbiAgICAgIGlzQmFja2dyb3VuZEZldGNoOiAocDogYW55KSA9PiBjLiNpc0JhY2tncm91bmRGZXRjaChwKSxcbiAgICAgIGJhY2tncm91bmRGZXRjaDogKFxuICAgICAgICBrOiBLLFxuICAgICAgICBpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgICAgICBvcHRpb25zOiBMUlVDYWNoZS5GZXRjaE9wdGlvbnM8SywgViwgRkM+LFxuICAgICAgICBjb250ZXh0OiBhbnksXG4gICAgICApOiBCYWNrZ3JvdW5kRmV0Y2g8Vj4gPT5cbiAgICAgICAgYy4jYmFja2dyb3VuZEZldGNoKFxuICAgICAgICAgIGssXG4gICAgICAgICAgaW5kZXggYXMgSW5kZXggfCB1bmRlZmluZWQsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICApLFxuICAgICAgbW92ZVRvVGFpbDogKGluZGV4OiBudW1iZXIpOiB2b2lkID0+IGMuI21vdmVUb1RhaWwoaW5kZXggYXMgSW5kZXgpLFxuICAgICAgaW5kZXhlczogKG9wdGlvbnM/OiB7IGFsbG93U3RhbGU6IGJvb2xlYW4gfSkgPT4gYy4jaW5kZXhlcyhvcHRpb25zKSxcbiAgICAgIHJpbmRleGVzOiAob3B0aW9ucz86IHsgYWxsb3dTdGFsZTogYm9vbGVhbiB9KSA9PlxuICAgICAgICBjLiNyaW5kZXhlcyhvcHRpb25zKSxcbiAgICAgIGlzU3RhbGU6IChpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiBjLiNpc1N0YWxlKGluZGV4IGFzIEluZGV4KSxcbiAgICB9XG4gIH1cblxuICAvLyBQcm90ZWN0ZWQgcmVhZC1vbmx5IG1lbWJlcnNcblxuICAvKipcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm1heH0gKHJlYWQtb25seSlcbiAgICovXG4gIGdldCBtYXgoKTogTFJVQ2FjaGUuQ291bnQge1xuICAgIHJldHVybiB0aGlzLiNtYXhcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm1heFNpemV9IChyZWFkLW9ubHkpXG4gICAqL1xuICBnZXQgbWF4U2l6ZSgpOiBMUlVDYWNoZS5Db3VudCB7XG4gICAgcmV0dXJuIHRoaXMuI21heFNpemVcbiAgfVxuICAvKipcbiAgICogVGhlIHRvdGFsIGNvbXB1dGVkIHNpemUgb2YgaXRlbXMgaW4gdGhlIGNhY2hlIChyZWFkLW9ubHkpXG4gICAqL1xuICBnZXQgY2FsY3VsYXRlZFNpemUoKTogTFJVQ2FjaGUuU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuI2NhbGN1bGF0ZWRTaXplXG4gIH1cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgaXRlbXMgc3RvcmVkIGluIHRoZSBjYWNoZSAocmVhZC1vbmx5KVxuICAgKi9cbiAgZ2V0IHNpemUoKTogTFJVQ2FjaGUuQ291bnQge1xuICAgIHJldHVybiB0aGlzLiNzaXplXG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5mZXRjaE1ldGhvZH0gKHJlYWQtb25seSlcbiAgICovXG4gIGdldCBmZXRjaE1ldGhvZCgpOiBMUlVDYWNoZS5GZXRjaGVyPEssIFYsIEZDPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2ZldGNoTWV0aG9kXG4gIH1cbiAgZ2V0IG1lbW9NZXRob2QoKTogTFJVQ2FjaGUuTWVtb2l6ZXI8SywgViwgRkM+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jbWVtb01ldGhvZFxuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuZGlzcG9zZX0gKHJlYWQtb25seSlcbiAgICovXG4gIGdldCBkaXNwb3NlKCkge1xuICAgIHJldHVybiB0aGlzLiNkaXNwb3NlXG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5vbkluc2VydH0gKHJlYWQtb25seSlcbiAgICovXG4gIGdldCBvbkluc2VydCgpIHtcbiAgICByZXR1cm4gdGhpcy4jb25JbnNlcnRcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmRpc3Bvc2VBZnRlcn0gKHJlYWQtb25seSlcbiAgICovXG4gIGdldCBkaXNwb3NlQWZ0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2VBZnRlclxuICB9XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTFJVQ2FjaGUuT3B0aW9uczxLLCBWLCBGQz4gfCBMUlVDYWNoZTxLLCBWLCBGQz4pIHtcbiAgICBjb25zdCB7XG4gICAgICBtYXggPSAwLFxuICAgICAgdHRsLFxuICAgICAgdHRsUmVzb2x1dGlvbiA9IDEsXG4gICAgICB0dGxBdXRvcHVyZ2UsXG4gICAgICB1cGRhdGVBZ2VPbkdldCxcbiAgICAgIHVwZGF0ZUFnZU9uSGFzLFxuICAgICAgYWxsb3dTdGFsZSxcbiAgICAgIGRpc3Bvc2UsXG4gICAgICBvbkluc2VydCxcbiAgICAgIGRpc3Bvc2VBZnRlcixcbiAgICAgIG5vRGlzcG9zZU9uU2V0LFxuICAgICAgbm9VcGRhdGVUVEwsXG4gICAgICBtYXhTaXplID0gMCxcbiAgICAgIG1heEVudHJ5U2l6ZSA9IDAsXG4gICAgICBzaXplQ2FsY3VsYXRpb24sXG4gICAgICBmZXRjaE1ldGhvZCxcbiAgICAgIG1lbW9NZXRob2QsXG4gICAgICBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBub0RlbGV0ZU9uU3RhbGVHZXQsXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbixcbiAgICAgIGFsbG93U3RhbGVPbkZldGNoQWJvcnQsXG4gICAgICBpZ25vcmVGZXRjaEFib3J0LFxuICAgICAgcGVyZixcbiAgICB9ID0gb3B0aW9uc1xuXG4gICAgaWYgKHBlcmYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBwZXJmPy5ub3cgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAncGVyZiBvcHRpb24gbXVzdCBoYXZlIGEgbm93KCkgbWV0aG9kIGlmIHNwZWNpZmllZCcsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLiNwZXJmID0gcGVyZiA/PyBkZWZhdWx0UGVyZlxuXG4gICAgaWYgKG1heCAhPT0gMCAmJiAhaXNQb3NJbnQobWF4KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4IG9wdGlvbiBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlcicpXG4gICAgfVxuXG4gICAgY29uc3QgVWludEFycmF5ID0gbWF4ID8gZ2V0VWludEFycmF5KG1heCkgOiBBcnJheVxuICAgIGlmICghVWludEFycmF5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWF4IHZhbHVlOiAnICsgbWF4KVxuICAgIH1cblxuICAgIHRoaXMuI21heCA9IG1heFxuICAgIHRoaXMuI21heFNpemUgPSBtYXhTaXplXG4gICAgdGhpcy5tYXhFbnRyeVNpemUgPSBtYXhFbnRyeVNpemUgfHwgdGhpcy4jbWF4U2l6ZVxuICAgIHRoaXMuc2l6ZUNhbGN1bGF0aW9uID0gc2l6ZUNhbGN1bGF0aW9uXG4gICAgaWYgKHRoaXMuc2l6ZUNhbGN1bGF0aW9uKSB7XG4gICAgICBpZiAoIXRoaXMuI21heFNpemUgJiYgIXRoaXMubWF4RW50cnlTaXplKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ2Nhbm5vdCBzZXQgc2l6ZUNhbGN1bGF0aW9uIHdpdGhvdXQgc2V0dGluZyBtYXhTaXplIG9yIG1heEVudHJ5U2l6ZScsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5zaXplQ2FsY3VsYXRpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2l6ZUNhbGN1bGF0aW9uIHNldCB0byBub24tZnVuY3Rpb24nKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZW1vTWV0aG9kICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG1lbW9NZXRob2QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21lbW9NZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIGlmIGRlZmluZWQnKVxuICAgIH1cbiAgICB0aGlzLiNtZW1vTWV0aG9kID0gbWVtb01ldGhvZFxuXG4gICAgaWYgKGZldGNoTWV0aG9kICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGZldGNoTWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmZXRjaE1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24gaWYgc3BlY2lmaWVkJylcbiAgICB9XG4gICAgdGhpcy4jZmV0Y2hNZXRob2QgPSBmZXRjaE1ldGhvZFxuICAgIHRoaXMuI2hhc0ZldGNoTWV0aG9kID0gISFmZXRjaE1ldGhvZFxuXG4gICAgdGhpcy4ja2V5TWFwID0gbmV3IE1hcCgpXG4gICAgdGhpcy4ja2V5TGlzdCA9IG5ldyBBcnJheShtYXgpLmZpbGwodW5kZWZpbmVkKVxuICAgIHRoaXMuI3ZhbExpc3QgPSBuZXcgQXJyYXkobWF4KS5maWxsKHVuZGVmaW5lZClcbiAgICB0aGlzLiNuZXh0ID0gbmV3IFVpbnRBcnJheShtYXgpXG4gICAgdGhpcy4jcHJldiA9IG5ldyBVaW50QXJyYXkobWF4KVxuICAgIHRoaXMuI2hlYWQgPSAwIGFzIEluZGV4XG4gICAgdGhpcy4jdGFpbCA9IDAgYXMgSW5kZXhcbiAgICB0aGlzLiNmcmVlID0gU3RhY2suY3JlYXRlKG1heClcbiAgICB0aGlzLiNzaXplID0gMFxuICAgIHRoaXMuI2NhbGN1bGF0ZWRTaXplID0gMFxuXG4gICAgaWYgKHR5cGVvZiBkaXNwb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLiNkaXNwb3NlID0gZGlzcG9zZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG9uSW5zZXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLiNvbkluc2VydCA9IG9uSW5zZXJ0XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZUFmdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXIgPSBkaXNwb3NlQWZ0ZXJcbiAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gW11cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLiNkaXNwb3NlZCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgICB0aGlzLiNoYXNEaXNwb3NlID0gISF0aGlzLiNkaXNwb3NlXG4gICAgdGhpcy4jaGFzT25JbnNlcnQgPSAhIXRoaXMuI29uSW5zZXJ0XG4gICAgdGhpcy4jaGFzRGlzcG9zZUFmdGVyID0gISF0aGlzLiNkaXNwb3NlQWZ0ZXJcblxuICAgIHRoaXMubm9EaXNwb3NlT25TZXQgPSAhIW5vRGlzcG9zZU9uU2V0XG4gICAgdGhpcy5ub1VwZGF0ZVRUTCA9ICEhbm9VcGRhdGVUVExcbiAgICB0aGlzLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbiA9ICEhbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uXG4gICAgdGhpcy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiA9ICEhYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb25cbiAgICB0aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQgPSAhIWFsbG93U3RhbGVPbkZldGNoQWJvcnRcbiAgICB0aGlzLmlnbm9yZUZldGNoQWJvcnQgPSAhIWlnbm9yZUZldGNoQWJvcnRcblxuICAgIC8vIE5COiBtYXhFbnRyeVNpemUgaXMgc2V0IHRvIG1heFNpemUgaWYgaXQncyBzZXRcbiAgICBpZiAodGhpcy5tYXhFbnRyeVNpemUgIT09IDApIHtcbiAgICAgIGlmICh0aGlzLiNtYXhTaXplICE9PSAwKSB7XG4gICAgICAgIGlmICghaXNQb3NJbnQodGhpcy4jbWF4U2l6ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgJ21heFNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkJyxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaXNQb3NJbnQodGhpcy5tYXhFbnRyeVNpemUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ21heEVudHJ5U2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBzcGVjaWZpZWQnLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICB0aGlzLiNpbml0aWFsaXplU2l6ZVRyYWNraW5nKClcbiAgICB9XG5cbiAgICB0aGlzLmFsbG93U3RhbGUgPSAhIWFsbG93U3RhbGVcbiAgICB0aGlzLm5vRGVsZXRlT25TdGFsZUdldCA9ICEhbm9EZWxldGVPblN0YWxlR2V0XG4gICAgdGhpcy51cGRhdGVBZ2VPbkdldCA9ICEhdXBkYXRlQWdlT25HZXRcbiAgICB0aGlzLnVwZGF0ZUFnZU9uSGFzID0gISF1cGRhdGVBZ2VPbkhhc1xuICAgIHRoaXMudHRsUmVzb2x1dGlvbiA9XG4gICAgICBpc1Bvc0ludCh0dGxSZXNvbHV0aW9uKSB8fCB0dGxSZXNvbHV0aW9uID09PSAwID8gdHRsUmVzb2x1dGlvbiA6IDFcbiAgICB0aGlzLnR0bEF1dG9wdXJnZSA9ICEhdHRsQXV0b3B1cmdlXG4gICAgdGhpcy50dGwgPSB0dGwgfHwgMFxuICAgIGlmICh0aGlzLnR0bCkge1xuICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLnR0bCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHRsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCcpXG4gICAgICB9XG4gICAgICB0aGlzLiNpbml0aWFsaXplVFRMVHJhY2tpbmcoKVxuICAgIH1cblxuICAgIC8vIGRvIG5vdCBhbGxvdyBjb21wbGV0ZWx5IHVuYm91bmRlZCBjYWNoZXNcbiAgICBpZiAodGhpcy4jbWF4ID09PSAwICYmIHRoaXMudHRsID09PSAwICYmIHRoaXMuI21heFNpemUgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdBdCBsZWFzdCBvbmUgb2YgbWF4LCBtYXhTaXplLCBvciB0dGwgaXMgcmVxdWlyZWQnLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAoIXRoaXMudHRsQXV0b3B1cmdlICYmICF0aGlzLiNtYXggJiYgIXRoaXMuI21heFNpemUpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSAnTFJVX0NBQ0hFX1VOQk9VTkRFRCdcbiAgICAgIGlmIChzaG91bGRXYXJuKGNvZGUpKSB7XG4gICAgICAgIHdhcm5lZC5hZGQoY29kZSlcbiAgICAgICAgY29uc3QgbXNnID1cbiAgICAgICAgICAnVFRMIGNhY2hpbmcgd2l0aG91dCB0dGxBdXRvcHVyZ2UsIG1heCwgb3IgbWF4U2l6ZSBjYW4gJyArXG4gICAgICAgICAgJ3Jlc3VsdCBpbiB1bmJvdW5kZWQgbWVtb3J5IGNvbnN1bXB0aW9uLidcbiAgICAgICAgZW1pdFdhcm5pbmcobXNnLCAnVW5ib3VuZGVkQ2FjaGVXYXJuaW5nJywgY29kZSwgTFJVQ2FjaGUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIG1zIGxlZnQgaW4gdGhlIGl0ZW0ncyBUVEwuIElmIGl0ZW0gaXMgbm90IGluIGNhY2hlLFxuICAgKiByZXR1cm5zIGAwYC4gUmV0dXJucyBgSW5maW5pdHlgIGlmIGl0ZW0gaXMgaW4gY2FjaGUgd2l0aG91dCBhIGRlZmluZWQgVFRMLlxuICAgKi9cbiAgZ2V0UmVtYWluaW5nVFRMKGtleTogSykge1xuICAgIHJldHVybiB0aGlzLiNrZXlNYXAuaGFzKGtleSkgPyBJbmZpbml0eSA6IDBcbiAgfVxuXG4gICNpbml0aWFsaXplVFRMVHJhY2tpbmcoKSB7XG4gICAgY29uc3QgdHRscyA9IG5ldyBaZXJvQXJyYXkodGhpcy4jbWF4KVxuICAgIGNvbnN0IHN0YXJ0cyA9IG5ldyBaZXJvQXJyYXkodGhpcy4jbWF4KVxuICAgIHRoaXMuI3R0bHMgPSB0dGxzXG4gICAgdGhpcy4jc3RhcnRzID0gc3RhcnRzXG4gICAgY29uc3QgcHVyZ2VUaW1lcnMgPVxuICAgICAgdGhpcy50dGxBdXRvcHVyZ2UgP1xuICAgICAgICBuZXcgQXJyYXk8dW5kZWZpbmVkIHwgUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4+KHRoaXMuI21heClcbiAgICAgIDogdW5kZWZpbmVkXG4gICAgdGhpcy4jYXV0b3B1cmdlVGltZXJzID0gcHVyZ2VUaW1lcnNcblxuICAgIHRoaXMuI3NldEl0ZW1UVEwgPSAoaW5kZXgsIHR0bCwgc3RhcnQgPSB0aGlzLiNwZXJmLm5vdygpKSA9PiB7XG4gICAgICBzdGFydHNbaW5kZXhdID0gdHRsICE9PSAwID8gc3RhcnQgOiAwXG4gICAgICB0dGxzW2luZGV4XSA9IHR0bFxuICAgICAgc2V0UHVyZ2V0VGltZXIoaW5kZXgsIHR0bClcbiAgICB9XG5cbiAgICB0aGlzLiN1cGRhdGVJdGVtQWdlID0gaW5kZXggPT4ge1xuICAgICAgc3RhcnRzW2luZGV4XSA9IHR0bHNbaW5kZXhdICE9PSAwID8gdGhpcy4jcGVyZi5ub3coKSA6IDBcbiAgICAgIHNldFB1cmdldFRpbWVyKGluZGV4LCB0dGxzW2luZGV4XSlcbiAgICB9XG5cbiAgICAvLyBjbGVhciBvdXQgdGhlIHB1cmdlIHRpbWVyIGlmIHdlJ3JlIHNldHRpbmcgVFRMIHRvIDAsIGFuZFxuICAgIC8vIHByZXZpb3VzbHkgaGFkIGEgdHRsIHB1cmdlIHRpbWVyIHJ1bm5pbmcsIHNvIGl0IGRvZXNuJ3RcbiAgICAvLyBmaXJlIHVubmVjZXNzYXJpbHkuIERvbid0IG5lZWQgdG8gZG8gdGhpcyBpZiB3ZSdyZSBub3QgZG9pbmdcbiAgICAvLyBhdXRvcHVyZ2UuXG4gICAgY29uc3Qgc2V0UHVyZ2V0VGltZXIgPVxuICAgICAgIXRoaXMudHRsQXV0b3B1cmdlID9cbiAgICAgICAgKCkgPT4ge31cbiAgICAgIDogKGluZGV4OiBJbmRleCwgdHRsPzogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgaWYgKHB1cmdlVGltZXJzPy5baW5kZXhdKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocHVyZ2VUaW1lcnNbaW5kZXhdKVxuICAgICAgICAgICAgcHVyZ2VUaW1lcnNbaW5kZXhdID0gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0dGwgJiYgdHRsICE9PSAwICYmIHB1cmdlVGltZXJzKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLiNpc1N0YWxlKGluZGV4KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2RlbGV0ZSh0aGlzLiNrZXlMaXN0W2luZGV4XSBhcyBLLCAnZXhwaXJlJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdHRsICsgMSlcbiAgICAgICAgICAgIC8vIHVucmVmKCkgbm90IHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zXG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgIGlmICh0LnVucmVmKSB7XG4gICAgICAgICAgICAgIHQudW5yZWYoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIHB1cmdlVGltZXJzW2luZGV4XSA9IHRcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIHRoaXMuI3N0YXR1c1RUTCA9IChzdGF0dXMsIGluZGV4KSA9PiB7XG4gICAgICBpZiAodHRsc1tpbmRleF0pIHtcbiAgICAgICAgY29uc3QgdHRsID0gdHRsc1tpbmRleF1cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBzdGFydHNbaW5kZXhdXG4gICAgICAgIC8qIGM4IGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGlmICghdHRsIHx8ICFzdGFydCkgcmV0dXJuXG4gICAgICAgIHN0YXR1cy50dGwgPSB0dGxcbiAgICAgICAgc3RhdHVzLnN0YXJ0ID0gc3RhcnRcbiAgICAgICAgc3RhdHVzLm5vdyA9IGNhY2hlZE5vdyB8fCBnZXROb3coKVxuICAgICAgICBjb25zdCBhZ2UgPSBzdGF0dXMubm93IC0gc3RhcnRcbiAgICAgICAgc3RhdHVzLnJlbWFpbmluZ1RUTCA9IHR0bCAtIGFnZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRlYm91bmNlIGNhbGxzIHRvIHBlcmYubm93KCkgdG8gMXMgc28gd2UncmUgbm90IGhpdHRpbmdcbiAgICAvLyB0aGF0IGNvc3RseSBjYWxsIHJlcGVhdGVkbHkuXG4gICAgbGV0IGNhY2hlZE5vdyA9IDBcbiAgICBjb25zdCBnZXROb3cgPSAoKSA9PiB7XG4gICAgICBjb25zdCBuID0gdGhpcy4jcGVyZi5ub3coKVxuICAgICAgaWYgKHRoaXMudHRsUmVzb2x1dGlvbiA+IDApIHtcbiAgICAgICAgY2FjaGVkTm93ID0gblxuICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiAoY2FjaGVkTm93ID0gMCksIHRoaXMudHRsUmVzb2x1dGlvbilcbiAgICAgICAgLy8gbm90IGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zXG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBpZiAodC51bnJlZikge1xuICAgICAgICAgIHQudW5yZWYoKVxuICAgICAgICB9XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICB9XG4gICAgICByZXR1cm4gblxuICAgIH1cblxuICAgIHRoaXMuZ2V0UmVtYWluaW5nVFRMID0ga2V5ID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrZXkpXG4gICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgICAgY29uc3QgdHRsID0gdHRsc1tpbmRleF1cbiAgICAgIGNvbnN0IHN0YXJ0ID0gc3RhcnRzW2luZGV4XVxuICAgICAgaWYgKCF0dGwgfHwgIXN0YXJ0KSB7XG4gICAgICAgIHJldHVybiBJbmZpbml0eVxuICAgICAgfVxuICAgICAgY29uc3QgYWdlID0gKGNhY2hlZE5vdyB8fCBnZXROb3coKSkgLSBzdGFydFxuICAgICAgcmV0dXJuIHR0bCAtIGFnZVxuICAgIH1cblxuICAgIHRoaXMuI2lzU3RhbGUgPSBpbmRleCA9PiB7XG4gICAgICBjb25zdCBzID0gc3RhcnRzW2luZGV4XVxuICAgICAgY29uc3QgdCA9IHR0bHNbaW5kZXhdXG4gICAgICByZXR1cm4gISF0ICYmICEhcyAmJiAoY2FjaGVkTm93IHx8IGdldE5vdygpKSAtIHMgPiB0XG4gICAgfVxuICB9XG5cbiAgLy8gY29uZGl0aW9uYWxseSBzZXQgcHJpdmF0ZSBtZXRob2RzIHJlbGF0ZWQgdG8gVFRMXG4gICN1cGRhdGVJdGVtQWdlOiAoaW5kZXg6IEluZGV4KSA9PiB2b2lkID0gKCkgPT4ge31cbiAgI3N0YXR1c1RUTDogKHN0YXR1czogTFJVQ2FjaGUuU3RhdHVzPFY+LCBpbmRleDogSW5kZXgpID0+IHZvaWQgPSAoKSA9PiB7fVxuICAjc2V0SXRlbVRUTDogKFxuICAgIGluZGV4OiBJbmRleCxcbiAgICB0dGw6IExSVUNhY2hlLk1pbGxpc2Vjb25kcyxcbiAgICBzdGFydD86IExSVUNhY2hlLk1pbGxpc2Vjb25kcyxcbiAgICAvLyBpZ25vcmUgYmVjYXVzZSB3ZSBuZXZlciBjYWxsIHRoaXMgaWYgd2UncmUgbm90IGFscmVhZHkgaW4gVFRMIG1vZGVcbiAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgKSA9PiB2b2lkID0gKCkgPT4ge31cbiAgLyogYzggaWdub3JlIHN0b3AgKi9cblxuICAjaXNTdGFsZTogKGluZGV4OiBJbmRleCkgPT4gYm9vbGVhbiA9ICgpID0+IGZhbHNlXG5cbiAgI2luaXRpYWxpemVTaXplVHJhY2tpbmcoKSB7XG4gICAgY29uc3Qgc2l6ZXMgPSBuZXcgWmVyb0FycmF5KHRoaXMuI21heClcbiAgICB0aGlzLiNjYWxjdWxhdGVkU2l6ZSA9IDBcbiAgICB0aGlzLiNzaXplcyA9IHNpemVzXG4gICAgdGhpcy4jcmVtb3ZlSXRlbVNpemUgPSBpbmRleCA9PiB7XG4gICAgICB0aGlzLiNjYWxjdWxhdGVkU2l6ZSAtPSBzaXplc1tpbmRleF0gYXMgbnVtYmVyXG4gICAgICBzaXplc1tpbmRleF0gPSAwXG4gICAgfVxuICAgIHRoaXMuI3JlcXVpcmVTaXplID0gKGssIHYsIHNpemUsIHNpemVDYWxjdWxhdGlvbikgPT4ge1xuICAgICAgLy8gcHJvdmlzaW9uYWxseSBhY2NlcHQgYmFja2dyb3VuZCBmZXRjaGVzLlxuICAgICAgLy8gYWN0dWFsIHZhbHVlIHNpemUgd2lsbCBiZSBjaGVja2VkIHdoZW4gdGhleSByZXR1cm4uXG4gICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cbiAgICAgIGlmICghaXNQb3NJbnQoc2l6ZSkpIHtcbiAgICAgICAgaWYgKHNpemVDYWxjdWxhdGlvbikge1xuICAgICAgICAgIGlmICh0eXBlb2Ygc2l6ZUNhbGN1bGF0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplQ2FsY3VsYXRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uJylcbiAgICAgICAgICB9XG4gICAgICAgICAgc2l6ZSA9IHNpemVDYWxjdWxhdGlvbih2LCBrKVxuICAgICAgICAgIGlmICghaXNQb3NJbnQoc2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICdzaXplQ2FsY3VsYXRpb24gcmV0dXJuIGludmFsaWQgKGV4cGVjdCBwb3NpdGl2ZSBpbnRlZ2VyKScsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAnaW52YWxpZCBzaXplIHZhbHVlIChtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIpLiAnICtcbiAgICAgICAgICAgICAgJ1doZW4gbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUgaXMgdXNlZCwgc2l6ZUNhbGN1bGF0aW9uICcgK1xuICAgICAgICAgICAgICAnb3Igc2l6ZSBtdXN0IGJlIHNldC4nLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHNpemVcbiAgICB9XG4gICAgdGhpcy4jYWRkSXRlbVNpemUgPSAoXG4gICAgICBpbmRleDogSW5kZXgsXG4gICAgICBzaXplOiBMUlVDYWNoZS5TaXplLFxuICAgICAgc3RhdHVzPzogTFJVQ2FjaGUuU3RhdHVzPFY+LFxuICAgICkgPT4ge1xuICAgICAgc2l6ZXNbaW5kZXhdID0gc2l6ZVxuICAgICAgaWYgKHRoaXMuI21heFNpemUpIHtcbiAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHRoaXMuI21heFNpemUgLSAoc2l6ZXNbaW5kZXhdIGFzIG51bWJlcilcbiAgICAgICAgd2hpbGUgKHRoaXMuI2NhbGN1bGF0ZWRTaXplID4gbWF4U2l6ZSkge1xuICAgICAgICAgIHRoaXMuI2V2aWN0KHRydWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuI2NhbGN1bGF0ZWRTaXplICs9IHNpemVzW2luZGV4XSBhcyBudW1iZXJcbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLmVudHJ5U2l6ZSA9IHNpemVcbiAgICAgICAgc3RhdHVzLnRvdGFsQ2FsY3VsYXRlZFNpemUgPSB0aGlzLiNjYWxjdWxhdGVkU2l6ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICNyZW1vdmVJdGVtU2l6ZTogKGluZGV4OiBJbmRleCkgPT4gdm9pZCA9IF9pID0+IHt9XG4gICNhZGRJdGVtU2l6ZTogKFxuICAgIGluZGV4OiBJbmRleCxcbiAgICBzaXplOiBMUlVDYWNoZS5TaXplLFxuICAgIHN0YXR1cz86IExSVUNhY2hlLlN0YXR1czxWPixcbiAgKSA9PiB2b2lkID0gKF9pLCBfcywgX3N0KSA9PiB7fVxuICAjcmVxdWlyZVNpemU6IChcbiAgICBrOiBLLFxuICAgIHY6IFYgfCBCYWNrZ3JvdW5kRmV0Y2g8Vj4sXG4gICAgc2l6ZT86IExSVUNhY2hlLlNpemUsXG4gICAgc2l6ZUNhbGN1bGF0aW9uPzogTFJVQ2FjaGUuU2l6ZUNhbGN1bGF0b3I8SywgVj4sXG4gICkgPT4gTFJVQ2FjaGUuU2l6ZSA9IChcbiAgICBfazogSyxcbiAgICBfdjogViB8IEJhY2tncm91bmRGZXRjaDxWPixcbiAgICBzaXplPzogTFJVQ2FjaGUuU2l6ZSxcbiAgICBzaXplQ2FsY3VsYXRpb24/OiBMUlVDYWNoZS5TaXplQ2FsY3VsYXRvcjxLLCBWPixcbiAgKSA9PiB7XG4gICAgaWYgKHNpemUgfHwgc2l6ZUNhbGN1bGF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnY2Fubm90IHNldCBzaXplIHdpdGhvdXQgc2V0dGluZyBtYXhTaXplIG9yIG1heEVudHJ5U2l6ZSBvbiBjYWNoZScsXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiAwXG4gIH07XG5cbiAgKiNpbmRleGVzKHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0ge30pIHtcbiAgICBpZiAodGhpcy4jc2l6ZSkge1xuICAgICAgZm9yIChsZXQgaSA9IHRoaXMuI3RhaWw7IHRydWU7ICkge1xuICAgICAgICBpZiAoIXRoaXMuI2lzVmFsaWRJbmRleChpKSkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbG93U3RhbGUgfHwgIXRoaXMuI2lzU3RhbGUoaSkpIHtcbiAgICAgICAgICB5aWVsZCBpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPT09IHRoaXMuI2hlYWQpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGkgPSB0aGlzLiNwcmV2W2ldIGFzIEluZGV4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAqI3JpbmRleGVzKHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0ge30pIHtcbiAgICBpZiAodGhpcy4jc2l6ZSkge1xuICAgICAgZm9yIChsZXQgaSA9IHRoaXMuI2hlYWQ7IHRydWU7ICkge1xuICAgICAgICBpZiAoIXRoaXMuI2lzVmFsaWRJbmRleChpKSkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbG93U3RhbGUgfHwgIXRoaXMuI2lzU3RhbGUoaSkpIHtcbiAgICAgICAgICB5aWVsZCBpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPT09IHRoaXMuI3RhaWwpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGkgPSB0aGlzLiNuZXh0W2ldIGFzIEluZGV4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAjaXNWYWxpZEluZGV4KGluZGV4OiBJbmRleCkge1xuICAgIHJldHVybiAoXG4gICAgICBpbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLiNrZXlNYXAuZ2V0KHRoaXMuI2tleUxpc3RbaW5kZXhdIGFzIEspID09PSBpbmRleFxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgYFtrZXksIHZhbHVlXWAgcGFpcnMsXG4gICAqIGluIG9yZGVyIGZyb20gbW9zdCByZWNlbnRseSB1c2VkIHRvIGxlYXN0IHJlY2VudGx5IHVzZWQuXG4gICAqL1xuICAqZW50cmllcygpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuI3ZhbExpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0aGlzLiNrZXlMaXN0W2ldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pXG4gICAgICApIHtcbiAgICAgICAgeWllbGQgW3RoaXMuI2tleUxpc3RbaV0sIHRoaXMuI3ZhbExpc3RbaV1dIGFzIFtLLCBWXVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZlcnNlIG9yZGVyIHZlcnNpb24gb2Yge0BsaW5rIExSVUNhY2hlLmVudHJpZXN9XG4gICAqXG4gICAqIFJldHVybiBhIGdlbmVyYXRvciB5aWVsZGluZyBgW2tleSwgdmFsdWVdYCBwYWlycyxcbiAgICogaW4gb3JkZXIgZnJvbSBsZWFzdCByZWNlbnRseSB1c2VkIHRvIG1vc3QgcmVjZW50bHkgdXNlZC5cbiAgICovXG4gICpyZW50cmllcygpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoKSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLiN2YWxMaXN0W2ldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdGhpcy4ja2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKVxuICAgICAgKSB7XG4gICAgICAgIHlpZWxkIFt0aGlzLiNrZXlMaXN0W2ldLCB0aGlzLiN2YWxMaXN0W2ldXVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgdGhlIGtleXMgaW4gdGhlIGNhY2hlLFxuICAgKiBpbiBvcmRlciBmcm9tIG1vc3QgcmVjZW50bHkgdXNlZCB0byBsZWFzdCByZWNlbnRseSB1c2VkLlxuICAgKi9cbiAgKmtleXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgY29uc3QgayA9IHRoaXMuI2tleUxpc3RbaV1cbiAgICAgIGlmIChrICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgIHlpZWxkIGtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52ZXJzZSBvcmRlciB2ZXJzaW9uIG9mIHtAbGluayBMUlVDYWNoZS5rZXlzfVxuICAgKlxuICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgdGhlIGtleXMgaW4gdGhlIGNhY2hlLFxuICAgKiBpbiBvcmRlciBmcm9tIGxlYXN0IHJlY2VudGx5IHVzZWQgdG8gbW9zdCByZWNlbnRseSB1c2VkLlxuICAgKi9cbiAgKnJrZXlzKCkge1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNyaW5kZXhlcygpKSB7XG4gICAgICBjb25zdCBrID0gdGhpcy4ja2V5TGlzdFtpXVxuICAgICAgaWYgKGsgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSkpIHtcbiAgICAgICAgeWllbGQga1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgdGhlIHZhbHVlcyBpbiB0aGUgY2FjaGUsXG4gICAqIGluIG9yZGVyIGZyb20gbW9zdCByZWNlbnRseSB1c2VkIHRvIGxlYXN0IHJlY2VudGx5IHVzZWQuXG4gICAqL1xuICAqdmFsdWVzKCkge1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldXG4gICAgICBpZiAodiAhPT0gdW5kZWZpbmVkICYmICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICB5aWVsZCB0aGlzLiN2YWxMaXN0W2ldIGFzIFZcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52ZXJzZSBvcmRlciB2ZXJzaW9uIG9mIHtAbGluayBMUlVDYWNoZS52YWx1ZXN9XG4gICAqXG4gICAqIFJldHVybiBhIGdlbmVyYXRvciB5aWVsZGluZyB0aGUgdmFsdWVzIGluIHRoZSBjYWNoZSxcbiAgICogaW4gb3JkZXIgZnJvbSBsZWFzdCByZWNlbnRseSB1c2VkIHRvIG1vc3QgcmVjZW50bHkgdXNlZC5cbiAgICovXG4gICpydmFsdWVzKCkge1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNyaW5kZXhlcygpKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXVxuICAgICAgaWYgKHYgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSkpIHtcbiAgICAgICAgeWllbGQgdGhpcy4jdmFsTGlzdFtpXVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRpbmcgb3ZlciB0aGUgY2FjaGUgaXRzZWxmIHlpZWxkcyB0aGUgc2FtZSByZXN1bHRzIGFzXG4gICAqIHtAbGluayBMUlVDYWNoZS5lbnRyaWVzfVxuICAgKi9cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcygpXG4gIH1cblxuICAvKipcbiAgICogQSBTdHJpbmcgdmFsdWUgdGhhdCBpcyB1c2VkIGluIHRoZSBjcmVhdGlvbiBvZiB0aGUgZGVmYXVsdCBzdHJpbmdcbiAgICogZGVzY3JpcHRpb24gb2YgYW4gb2JqZWN0LiBDYWxsZWQgYnkgdGhlIGJ1aWx0LWluIG1ldGhvZFxuICAgKiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gICAqL1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdMUlVDYWNoZSdcblxuICAvKipcbiAgICogRmluZCBhIHZhbHVlIGZvciB3aGljaCB0aGUgc3VwcGxpZWQgZm4gbWV0aG9kIHJldHVybnMgYSB0cnV0aHkgdmFsdWUsXG4gICAqIHNpbWlsYXIgdG8gYEFycmF5LmZpbmQoKWAuIGZuIGlzIGNhbGxlZCBhcyBgZm4odmFsdWUsIGtleSwgY2FjaGUpYC5cbiAgICovXG4gIGZpbmQoXG4gICAgZm46ICh2OiBWLCBrOiBLLCBzZWxmOiBMUlVDYWNoZTxLLCBWLCBGQz4pID0+IGJvb2xlYW4sXG4gICAgZ2V0T3B0aW9uczogTFJVQ2FjaGUuR2V0T3B0aW9uczxLLCBWLCBGQz4gPSB7fSxcbiAgKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV1cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nIDogdlxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICBpZiAoZm4odmFsdWUsIHRoaXMuI2tleUxpc3RbaV0gYXMgSywgdGhpcykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMuI2tleUxpc3RbaV0gYXMgSywgZ2V0T3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gb24gZWFjaCBpdGVtIGluIHRoZSBjYWNoZSwgaW4gb3JkZXIgZnJvbSBtb3N0XG4gICAqIHJlY2VudGx5IHVzZWQgdG8gbGVhc3QgcmVjZW50bHkgdXNlZC5cbiAgICpcbiAgICogYGZuYCBpcyBjYWxsZWQgYXMgYGZuKHZhbHVlLCBrZXksIGNhY2hlKWAuXG4gICAqXG4gICAqIElmIGB0aGlzcGAgaXMgcHJvdmlkZWQsIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGluIHRoZSBgdGhpc2AtY29udGV4dCBvZlxuICAgKiB0aGUgcHJvdmlkZWQgb2JqZWN0LCBvciB0aGUgY2FjaGUgaWYgbm8gYHRoaXNwYCBvYmplY3QgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIERvZXMgbm90IHVwZGF0ZSBhZ2Ugb3IgcmVjZW50eSBvZiB1c2UsIG9yIGl0ZXJhdGUgb3ZlciBzdGFsZSB2YWx1ZXMuXG4gICAqL1xuICBmb3JFYWNoKFxuICAgIGZuOiAodjogViwgazogSywgc2VsZjogTFJVQ2FjaGU8SywgViwgRkM+KSA9PiBhbnksXG4gICAgdGhpc3A6IGFueSA9IHRoaXMsXG4gICkge1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHZcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgZm4uY2FsbCh0aGlzcCwgdmFsdWUsIHRoaXMuI2tleUxpc3RbaV0gYXMgSywgdGhpcylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNhbWUgYXMge0BsaW5rIExSVUNhY2hlLmZvckVhY2h9IGJ1dCBpdGVtcyBhcmUgaXRlcmF0ZWQgb3ZlciBpblxuICAgKiByZXZlcnNlIG9yZGVyLiAgKGllLCBsZXNzIHJlY2VudGx5IHVzZWQgaXRlbXMgYXJlIGl0ZXJhdGVkIG92ZXIgZmlyc3QuKVxuICAgKi9cbiAgcmZvckVhY2goXG4gICAgZm46ICh2OiBWLCBrOiBLLCBzZWxmOiBMUlVDYWNoZTxLLCBWLCBGQz4pID0+IGFueSxcbiAgICB0aGlzcDogYW55ID0gdGhpcyxcbiAgKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI3JpbmRleGVzKCkpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHZcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgZm4uY2FsbCh0aGlzcCwgdmFsdWUsIHRoaXMuI2tleUxpc3RbaV0gYXMgSywgdGhpcylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFueSBzdGFsZSBlbnRyaWVzLiBSZXR1cm5zIHRydWUgaWYgYW55dGhpbmcgd2FzIHJlbW92ZWQsXG4gICAqIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHB1cmdlU3RhbGUoKSB7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZVxuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNyaW5kZXhlcyh7IGFsbG93U3RhbGU6IHRydWUgfSkpIHtcbiAgICAgIGlmICh0aGlzLiNpc1N0YWxlKGkpKSB7XG4gICAgICAgIHRoaXMuI2RlbGV0ZSh0aGlzLiNrZXlMaXN0W2ldIGFzIEssICdleHBpcmUnKVxuICAgICAgICBkZWxldGVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVsZXRlZFxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZXh0ZW5kZWQgaW5mbyBhYm91dCBhIGdpdmVuIGVudHJ5LCB0byBnZXQgaXRzIHZhbHVlLCBzaXplLCBhbmRcbiAgICogVFRMIGluZm8gc2ltdWx0YW5lb3VzbHkuIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIGtleSBpcyBub3QgcHJlc2VudC5cbiAgICpcbiAgICogVW5saWtlIHtAbGluayBMUlVDYWNoZSNkdW1wfSwgd2hpY2ggaXMgZGVzaWduZWQgdG8gYmUgcG9ydGFibGUgYW5kIHN1cnZpdmVcbiAgICogc2VyaWFsaXphdGlvbiwgdGhlIGBzdGFydGAgdmFsdWUgaXMgYWx3YXlzIHRoZSBjdXJyZW50IHRpbWVzdGFtcCwgYW5kIHRoZVxuICAgKiBgdHRsYCBpcyBhIGNhbGN1bGF0ZWQgcmVtYWluaW5nIHRpbWUgdG8gbGl2ZSAobmVnYXRpdmUgaWYgZXhwaXJlZCkuXG4gICAqXG4gICAqIEFsd2F5cyByZXR1cm5zIHN0YWxlIHZhbHVlcywgaWYgdGhlaXIgaW5mbyBpcyBmb3VuZCBpbiB0aGUgY2FjaGUsIHNvIGJlXG4gICAqIHN1cmUgdG8gY2hlY2sgZm9yIGV4cGlyYXRpb25zIChpZSwgYSBuZWdhdGl2ZSB7QGxpbmsgTFJVQ2FjaGUuRW50cnkjdHRsfSlcbiAgICogaWYgcmVsZXZhbnQuXG4gICAqL1xuICBpbmZvKGtleTogSyk6IExSVUNhY2hlLkVudHJ5PFY+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpID0gdGhpcy4ja2V5TWFwLmdldChrZXkpXG4gICAgaWYgKGkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldXG4gICAgLyogYzggaWdub3JlIHN0YXJ0IC0gdGhpcyBpc24ndCB0ZXN0ZWQgZm9yIHRoZSBpbmZvIGZ1bmN0aW9uLFxuICAgICAqIGJ1dCBpdCdzIHRoZSBzYW1lIGxvZ2ljIGFzIGZvdW5kIGluIG90aGVyIHBsYWNlcy4gKi9cbiAgICBjb25zdCB2YWx1ZTogViB8IHVuZGVmaW5lZCA9XG4gICAgICB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiB2XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWRcbiAgICAvKiBjOCBpZ25vcmUgZW5kICovXG4gICAgY29uc3QgZW50cnk6IExSVUNhY2hlLkVudHJ5PFY+ID0geyB2YWx1ZSB9XG4gICAgaWYgKHRoaXMuI3R0bHMgJiYgdGhpcy4jc3RhcnRzKSB7XG4gICAgICBjb25zdCB0dGwgPSB0aGlzLiN0dGxzW2ldXG4gICAgICBjb25zdCBzdGFydCA9IHRoaXMuI3N0YXJ0c1tpXVxuICAgICAgaWYgKHR0bCAmJiBzdGFydCkge1xuICAgICAgICBjb25zdCByZW1haW4gPSB0dGwgLSAodGhpcy4jcGVyZi5ub3coKSAtIHN0YXJ0KVxuICAgICAgICBlbnRyeS50dGwgPSByZW1haW5cbiAgICAgICAgZW50cnkuc3RhcnQgPSBEYXRlLm5vdygpXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLiNzaXplcykge1xuICAgICAgZW50cnkuc2l6ZSA9IHRoaXMuI3NpemVzW2ldXG4gICAgfVxuICAgIHJldHVybiBlbnRyeVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBba2V5LCB7QGxpbmsgTFJVQ2FjaGUuRW50cnl9XSB0dXBsZXMgd2hpY2ggY2FuIGJlXG4gICAqIHBhc3NlZCB0byB7QGxpbmsgTFJVQ2FjaGUjbG9hZH0uXG4gICAqXG4gICAqIFRoZSBgc3RhcnRgIGZpZWxkcyBhcmUgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byBhIHBvcnRhYmxlIGBEYXRlLm5vdygpYFxuICAgKiB0aW1lc3RhbXAsIGV2ZW4gaWYgYHBlcmZvcm1hbmNlLm5vdygpYCBpcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIFN0YWxlIGVudHJpZXMgYXJlIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgYGR1bXBgLCBldmVuIGlmXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlfSBpcyBmYWxzZS5cbiAgICpcbiAgICogTm90ZTogdGhpcyByZXR1cm5zIGFuIGFjdHVhbCBhcnJheSwgbm90IGEgZ2VuZXJhdG9yLCBzbyBpdCBjYW4gYmUgbW9yZVxuICAgKiBlYXNpbHkgcGFzc2VkIGFyb3VuZC5cbiAgICovXG4gIGR1bXAoKSB7XG4gICAgY29uc3QgYXJyOiBbSywgTFJVQ2FjaGUuRW50cnk8Vj5dW10gPSBbXVxuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKHsgYWxsb3dTdGFsZTogdHJ1ZSB9KSkge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy4ja2V5TGlzdFtpXVxuICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV1cbiAgICAgIGNvbnN0IHZhbHVlOiBWIHwgdW5kZWZpbmVkID1cbiAgICAgICAgdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nIDogdlxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwga2V5ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICBjb25zdCBlbnRyeTogTFJVQ2FjaGUuRW50cnk8Vj4gPSB7IHZhbHVlIH1cbiAgICAgIGlmICh0aGlzLiN0dGxzICYmIHRoaXMuI3N0YXJ0cykge1xuICAgICAgICBlbnRyeS50dGwgPSB0aGlzLiN0dGxzW2ldXG4gICAgICAgIC8vIGFsd2F5cyBkdW1wIHRoZSBzdGFydCByZWxhdGl2ZSB0byBhIHBvcnRhYmxlIHRpbWVzdGFtcFxuICAgICAgICAvLyBpdCdzIG9rIGZvciB0aGlzIHRvIGJlIGEgYml0IHNsb3csIGl0J3MgYSByYXJlIG9wZXJhdGlvbi5cbiAgICAgICAgY29uc3QgYWdlID0gdGhpcy4jcGVyZi5ub3coKSAtICh0aGlzLiNzdGFydHNbaV0gYXMgbnVtYmVyKVxuICAgICAgICBlbnRyeS5zdGFydCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAtIGFnZSlcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLiNzaXplcykge1xuICAgICAgICBlbnRyeS5zaXplID0gdGhpcy4jc2l6ZXNbaV1cbiAgICAgIH1cbiAgICAgIGFyci51bnNoaWZ0KFtrZXksIGVudHJ5XSlcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBjYWNoZSBhbmQgbG9hZCBpbiB0aGUgaXRlbXMgaW4gZW50cmllcyBpbiB0aGUgb3JkZXIgbGlzdGVkLlxuICAgKlxuICAgKiBUaGUgc2hhcGUgb2YgdGhlIHJlc3VsdGluZyBjYWNoZSBtYXkgYmUgZGlmZmVyZW50IGlmIHRoZSBzYW1lIG9wdGlvbnMgYXJlXG4gICAqIG5vdCB1c2VkIGluIGJvdGggY2FjaGVzLlxuICAgKlxuICAgKiBUaGUgYHN0YXJ0YCBmaWVsZHMgYXJlIGFzc3VtZWQgdG8gYmUgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byBhIHBvcnRhYmxlXG4gICAqIGBEYXRlLm5vdygpYCB0aW1lc3RhbXAsIGV2ZW4gaWYgYHBlcmZvcm1hbmNlLm5vdygpYCBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBsb2FkKGFycjogW0ssIExSVUNhY2hlLkVudHJ5PFY+XVtdKSB7XG4gICAgdGhpcy5jbGVhcigpXG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgYXJyKSB7XG4gICAgICBpZiAoZW50cnkuc3RhcnQpIHtcbiAgICAgICAgLy8gZW50cnkuc3RhcnQgaXMgYSBwb3J0YWJsZSB0aW1lc3RhbXAsIGJ1dCB3ZSBtYXkgYmUgdXNpbmdcbiAgICAgICAgLy8gbm9kZSdzIHBlcmZvcm1hbmNlLm5vdygpLCBzbyBjYWxjdWxhdGUgdGhlIG9mZnNldCwgc28gdGhhdFxuICAgICAgICAvLyB3ZSBnZXQgdGhlIGludGVuZGVkIHJlbWFpbmluZyBUVEwsIG5vIG1hdHRlciBob3cgbG9uZyBpdCdzXG4gICAgICAgIC8vIGJlZW4gb24gaWNlLlxuICAgICAgICAvL1xuICAgICAgICAvLyBpdCdzIG9rIGZvciB0aGlzIHRvIGJlIGEgYml0IHNsb3csIGl0J3MgYSByYXJlIG9wZXJhdGlvbi5cbiAgICAgICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIGVudHJ5LnN0YXJ0XG4gICAgICAgIGVudHJ5LnN0YXJ0ID0gdGhpcy4jcGVyZi5ub3coKSAtIGFnZVxuICAgICAgfVxuICAgICAgdGhpcy5zZXQoa2V5LCBlbnRyeS52YWx1ZSwgZW50cnkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHZhbHVlIHRvIHRoZSBjYWNoZS5cbiAgICpcbiAgICogTm90ZTogaWYgYHVuZGVmaW5lZGAgaXMgc3BlY2lmaWVkIGFzIGEgdmFsdWUsIHRoaXMgaXMgYW4gYWxpYXMgZm9yXG4gICAqIHtAbGluayBMUlVDYWNoZSNkZWxldGV9XG4gICAqXG4gICAqIEZpZWxkcyBvbiB0aGUge0BsaW5rIExSVUNhY2hlLlNldE9wdGlvbnN9IG9wdGlvbnMgcGFyYW0gd2lsbCBvdmVycmlkZVxuICAgKiB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGUgY29uc3RydWN0b3Igb3B0aW9ucyBmb3IgdGhlIHNjb3BlXG4gICAqIG9mIHRoaXMgc2luZ2xlIGBzZXQoKWAgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBJZiBgc3RhcnRgIGlzIHByb3ZpZGVkLCB0aGVuIHRoYXQgd2lsbCBzZXQgdGhlIGVmZmVjdGl2ZSBzdGFydFxuICAgKiB0aW1lIGZvciB0aGUgVFRMIGNhbGN1bGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBtdXN0IGJlIGEgcHJldmlvdXNcbiAgICogdmFsdWUgb2YgYHBlcmZvcm1hbmNlLm5vdygpYCBpZiBzdXBwb3J0ZWQsIG9yIGEgcHJldmlvdXMgdmFsdWUgb2ZcbiAgICogYERhdGUubm93KClgIGlmIG5vdC5cbiAgICpcbiAgICogT3B0aW9ucyBvYmplY3QgbWF5IGFsc28gaW5jbHVkZSBgc2l6ZWAsIHdoaWNoIHdpbGwgcHJldmVudFxuICAgKiBjYWxsaW5nIHRoZSBgc2l6ZUNhbGN1bGF0aW9uYCBmdW5jdGlvbiBhbmQganVzdCB1c2UgdGhlIHNwZWNpZmllZFxuICAgKiBudW1iZXIgaWYgaXQgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBhbmQgYG5vRGlzcG9zZU9uU2V0YCB3aGljaFxuICAgKiB3aWxsIHByZXZlbnQgY2FsbGluZyBhIGBkaXNwb3NlYCBmdW5jdGlvbiBpbiB0aGUgY2FzZSBvZlxuICAgKiBvdmVyd3JpdGVzLlxuICAgKlxuICAgKiBJZiB0aGUgYHNpemVgIChvciByZXR1cm4gdmFsdWUgb2YgYHNpemVDYWxjdWxhdGlvbmApIGZvciBhIGdpdmVuXG4gICAqIGVudHJ5IGlzIGdyZWF0ZXIgdGhhbiBgbWF4RW50cnlTaXplYCwgdGhlbiB0aGUgaXRlbSB3aWxsIG5vdCBiZVxuICAgKiBhZGRlZCB0byB0aGUgY2FjaGUuXG4gICAqXG4gICAqIFdpbGwgdXBkYXRlIHRoZSByZWNlbmN5IG9mIHRoZSBlbnRyeS5cbiAgICpcbiAgICogSWYgdGhlIHZhbHVlIGlzIGB1bmRlZmluZWRgLCB0aGVuIHRoaXMgaXMgYW4gYWxpYXMgZm9yXG4gICAqIGBjYWNoZS5kZWxldGUoa2V5KWAuIGB1bmRlZmluZWRgIGlzIG5ldmVyIHN0b3JlZCBpbiB0aGUgY2FjaGUuXG4gICAqL1xuICBzZXQoXG4gICAgazogSyxcbiAgICB2OiBWIHwgQmFja2dyb3VuZEZldGNoPFY+IHwgdW5kZWZpbmVkLFxuICAgIHNldE9wdGlvbnM6IExSVUNhY2hlLlNldE9wdGlvbnM8SywgViwgRkM+ID0ge30sXG4gICkge1xuICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZGVsZXRlKGspXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICB0dGwgPSB0aGlzLnR0bCxcbiAgICAgIHN0YXJ0LFxuICAgICAgbm9EaXNwb3NlT25TZXQgPSB0aGlzLm5vRGlzcG9zZU9uU2V0LFxuICAgICAgc2l6ZUNhbGN1bGF0aW9uID0gdGhpcy5zaXplQ2FsY3VsYXRpb24sXG4gICAgICBzdGF0dXMsXG4gICAgfSA9IHNldE9wdGlvbnNcbiAgICBsZXQgeyBub1VwZGF0ZVRUTCA9IHRoaXMubm9VcGRhdGVUVEwgfSA9IHNldE9wdGlvbnNcblxuICAgIGNvbnN0IHNpemUgPSB0aGlzLiNyZXF1aXJlU2l6ZShcbiAgICAgIGssXG4gICAgICB2LFxuICAgICAgc2V0T3B0aW9ucy5zaXplIHx8IDAsXG4gICAgICBzaXplQ2FsY3VsYXRpb24sXG4gICAgKVxuICAgIC8vIGlmIHRoZSBpdGVtIGRvZXNuJ3QgZml0LCBkb24ndCBkbyBhbnl0aGluZ1xuICAgIC8vIE5COiBtYXhFbnRyeVNpemUgc2V0IHRvIG1heFNpemUgYnkgZGVmYXVsdFxuICAgIGlmICh0aGlzLm1heEVudHJ5U2l6ZSAmJiBzaXplID4gdGhpcy5tYXhFbnRyeVNpemUpIHtcbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLnNldCA9ICdtaXNzJ1xuICAgICAgICBzdGF0dXMubWF4RW50cnlTaXplRXhjZWVkZWQgPSB0cnVlXG4gICAgICB9XG4gICAgICAvLyBoYXZlIHRvIGRlbGV0ZSwgaW4gY2FzZSBzb21ldGhpbmcgaXMgdGhlcmUgYWxyZWFkeS5cbiAgICAgIHRoaXMuI2RlbGV0ZShrLCAnc2V0JylcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICAgIGxldCBpbmRleCA9IHRoaXMuI3NpemUgPT09IDAgPyB1bmRlZmluZWQgOiB0aGlzLiNrZXlNYXAuZ2V0KGspXG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGFkZGl0aW9uXG4gICAgICBpbmRleCA9IChcbiAgICAgICAgdGhpcy4jc2l6ZSA9PT0gMCA/IHRoaXMuI3RhaWxcbiAgICAgICAgOiB0aGlzLiNmcmVlLmxlbmd0aCAhPT0gMCA/IHRoaXMuI2ZyZWUucG9wKClcbiAgICAgICAgOiB0aGlzLiNzaXplID09PSB0aGlzLiNtYXggPyB0aGlzLiNldmljdChmYWxzZSlcbiAgICAgICAgOiB0aGlzLiNzaXplKSBhcyBJbmRleFxuICAgICAgdGhpcy4ja2V5TGlzdFtpbmRleF0gPSBrXG4gICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IHZcbiAgICAgIHRoaXMuI2tleU1hcC5zZXQoaywgaW5kZXgpXG4gICAgICB0aGlzLiNuZXh0W3RoaXMuI3RhaWxdID0gaW5kZXhcbiAgICAgIHRoaXMuI3ByZXZbaW5kZXhdID0gdGhpcy4jdGFpbFxuICAgICAgdGhpcy4jdGFpbCA9IGluZGV4XG4gICAgICB0aGlzLiNzaXplKytcbiAgICAgIHRoaXMuI2FkZEl0ZW1TaXplKGluZGV4LCBzaXplLCBzdGF0dXMpXG4gICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuc2V0ID0gJ2FkZCdcbiAgICAgIG5vVXBkYXRlVFRMID0gZmFsc2VcbiAgICAgIGlmICh0aGlzLiNoYXNPbkluc2VydCkge1xuICAgICAgICB0aGlzLiNvbkluc2VydD8uKHYgYXMgViwgaywgJ2FkZCcpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVwZGF0ZVxuICAgICAgdGhpcy4jbW92ZVRvVGFpbChpbmRleClcbiAgICAgIGNvbnN0IG9sZFZhbCA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdIGFzIFYgfCBCYWNrZ3JvdW5kRmV0Y2g8Vj5cbiAgICAgIGlmICh2ICE9PSBvbGRWYWwpIHtcbiAgICAgICAgaWYgKHRoaXMuI2hhc0ZldGNoTWV0aG9kICYmIHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKG9sZFZhbCkpIHtcbiAgICAgICAgICBvbGRWYWwuX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdyZXBsYWNlZCcpKVxuICAgICAgICAgIGNvbnN0IHsgX19zdGFsZVdoaWxlRmV0Y2hpbmc6IHMgfSA9IG9sZFZhbFxuICAgICAgICAgIGlmIChzICE9PSB1bmRlZmluZWQgJiYgIW5vRGlzcG9zZU9uU2V0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZSkge1xuICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlPy4ocyBhcyBWLCBrLCAnc2V0JylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQ/LnB1c2goW3MgYXMgViwgaywgJ3NldCddKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghbm9EaXNwb3NlT25TZXQpIHtcbiAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZSkge1xuICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKG9sZFZhbCBhcyBWLCBrLCAnc2V0JylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQ/LnB1c2goW29sZFZhbCBhcyBWLCBrLCAnc2V0J10pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3JlbW92ZUl0ZW1TaXplKGluZGV4KVxuICAgICAgICB0aGlzLiNhZGRJdGVtU2l6ZShpbmRleCwgc2l6ZSwgc3RhdHVzKVxuICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IHZcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgIHN0YXR1cy5zZXQgPSAncmVwbGFjZSdcbiAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9XG4gICAgICAgICAgICBvbGRWYWwgJiYgdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2gob2xkVmFsKSA/XG4gICAgICAgICAgICAgIG9sZFZhbC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgOiBvbGRWYWxcbiAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IHVuZGVmaW5lZCkgc3RhdHVzLm9sZFZhbHVlID0gb2xkVmFsdWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLnNldCA9ICd1cGRhdGUnXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLiNoYXNPbkluc2VydCkge1xuICAgICAgICB0aGlzLm9uSW5zZXJ0Py4odiBhcyBWLCBrLCB2ID09PSBvbGRWYWwgPyAndXBkYXRlJyA6ICdyZXBsYWNlJylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR0bCAhPT0gMCAmJiAhdGhpcy4jdHRscykge1xuICAgICAgdGhpcy4jaW5pdGlhbGl6ZVRUTFRyYWNraW5nKClcbiAgICB9XG4gICAgaWYgKHRoaXMuI3R0bHMpIHtcbiAgICAgIGlmICghbm9VcGRhdGVUVEwpIHtcbiAgICAgICAgdGhpcy4jc2V0SXRlbVRUTChpbmRleCwgdHRsLCBzdGFydClcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0dXMpIHRoaXMuI3N0YXR1c1RUTChzdGF0dXMsIGluZGV4KVxuICAgIH1cbiAgICBpZiAoIW5vRGlzcG9zZU9uU2V0ICYmIHRoaXMuI2hhc0Rpc3Bvc2VBZnRlciAmJiB0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgY29uc3QgZHQgPSB0aGlzLiNkaXNwb3NlZFxuICAgICAgbGV0IHRhc2s6IERpc3Bvc2VUYXNrPEssIFY+IHwgdW5kZWZpbmVkXG4gICAgICB3aGlsZSAoKHRhc2sgPSBkdD8uc2hpZnQoKSkpIHtcbiAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyPy4oLi4udGFzaylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmljdCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtLCByZXR1cm5pbmcgaXRzIHZhbHVlIG9yXG4gICAqIGB1bmRlZmluZWRgIGlmIGNhY2hlIGlzIGVtcHR5LlxuICAgKi9cbiAgcG9wKCk6IFYgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICB3aGlsZSAodGhpcy4jc2l6ZSkge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLiN2YWxMaXN0W3RoaXMuI2hlYWRdXG4gICAgICAgIHRoaXMuI2V2aWN0KHRydWUpXG4gICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2YWwpKSB7XG4gICAgICAgICAgaWYgKHZhbC5fX3N0YWxlV2hpbGVGZXRjaGluZykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiB2YWxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyICYmIHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICAgIGNvbnN0IGR0ID0gdGhpcy4jZGlzcG9zZWRcbiAgICAgICAgbGV0IHRhc2s6IERpc3Bvc2VUYXNrPEssIFY+IHwgdW5kZWZpbmVkXG4gICAgICAgIHdoaWxlICgodGFzayA9IGR0Py5zaGlmdCgpKSkge1xuICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlcj8uKC4uLnRhc2spXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAjZXZpY3QoZnJlZTogYm9vbGVhbikge1xuICAgIGNvbnN0IGhlYWQgPSB0aGlzLiNoZWFkXG4gICAgY29uc3QgayA9IHRoaXMuI2tleUxpc3RbaGVhZF0gYXMgS1xuICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2hlYWRdIGFzIFZcbiAgICBpZiAodGhpcy4jaGFzRmV0Y2hNZXRob2QgJiYgdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgIHYuX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdldmljdGVkJykpXG4gICAgfSBlbHNlIGlmICh0aGlzLiNoYXNEaXNwb3NlIHx8IHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgdGhpcy4jZGlzcG9zZT8uKHYsIGssICdldmljdCcpXG4gICAgICB9XG4gICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFt2LCBrLCAnZXZpY3QnXSlcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jcmVtb3ZlSXRlbVNpemUoaGVhZClcbiAgICBpZiAodGhpcy4jYXV0b3B1cmdlVGltZXJzPy5baGVhZF0pIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNhdXRvcHVyZ2VUaW1lcnNbaGVhZF0pXG4gICAgICB0aGlzLiNhdXRvcHVyZ2VUaW1lcnNbaGVhZF0gPSB1bmRlZmluZWRcbiAgICB9XG4gICAgLy8gaWYgd2UgYXJlbid0IGFib3V0IHRvIHVzZSB0aGUgaW5kZXgsIHRoZW4gbnVsbCB0aGVzZSBvdXRcbiAgICBpZiAoZnJlZSkge1xuICAgICAgdGhpcy4ja2V5TGlzdFtoZWFkXSA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy4jdmFsTGlzdFtoZWFkXSA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy4jZnJlZS5wdXNoKGhlYWQpXG4gICAgfVxuICAgIGlmICh0aGlzLiNzaXplID09PSAxKSB7XG4gICAgICB0aGlzLiNoZWFkID0gdGhpcy4jdGFpbCA9IDAgYXMgSW5kZXhcbiAgICAgIHRoaXMuI2ZyZWUubGVuZ3RoID0gMFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNoZWFkID0gdGhpcy4jbmV4dFtoZWFkXSBhcyBJbmRleFxuICAgIH1cbiAgICB0aGlzLiNrZXlNYXAuZGVsZXRlKGspXG4gICAgdGhpcy4jc2l6ZS0tXG4gICAgcmV0dXJuIGhlYWRcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGtleSBpcyBpbiB0aGUgY2FjaGUsIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHJlY2VuY3kgb2YgdXNlLlxuICAgKiBXaWxsIHJldHVybiBmYWxzZSBpZiB0aGUgaXRlbSBpcyBzdGFsZSwgZXZlbiB0aG91Z2ggaXQgaXMgdGVjaG5pY2FsbHlcbiAgICogaW4gdGhlIGNhY2hlLlxuICAgKlxuICAgKiBDaGVjayBpZiBhIGtleSBpcyBpbiB0aGUgY2FjaGUsIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHJlY2VuY3kgb2ZcbiAgICogdXNlLiBBZ2UgaXMgdXBkYXRlZCBpZiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudXBkYXRlQWdlT25IYXN9IGlzIHNldFxuICAgKiB0byBgdHJ1ZWAgaW4gZWl0aGVyIHRoZSBvcHRpb25zIG9yIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogV2lsbCByZXR1cm4gYGZhbHNlYCBpZiB0aGUgaXRlbSBpcyBzdGFsZSwgZXZlbiB0aG91Z2ggaXQgaXMgdGVjaG5pY2FsbHkgaW5cbiAgICogdGhlIGNhY2hlLiBUaGUgZGlmZmVyZW5jZSBjYW4gYmUgZGV0ZXJtaW5lZCAoaWYgaXQgbWF0dGVycykgYnkgdXNpbmcgYVxuICAgKiBgc3RhdHVzYCBhcmd1bWVudCwgYW5kIGluc3BlY3RpbmcgdGhlIGBoYXNgIGZpZWxkLlxuICAgKlxuICAgKiBXaWxsIG5vdCB1cGRhdGUgaXRlbSBhZ2UgdW5sZXNzXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS51cGRhdGVBZ2VPbkhhc30gaXMgc2V0LlxuICAgKi9cbiAgaGFzKGs6IEssIGhhc09wdGlvbnM6IExSVUNhY2hlLkhhc09wdGlvbnM8SywgViwgRkM+ID0ge30pIHtcbiAgICBjb25zdCB7IHVwZGF0ZUFnZU9uSGFzID0gdGhpcy51cGRhdGVBZ2VPbkhhcywgc3RhdHVzIH0gPSBoYXNPcHRpb25zXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspXG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2luZGV4XVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSAmJlxuICAgICAgICB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nID09PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy4jaXNTdGFsZShpbmRleCkpIHtcbiAgICAgICAgaWYgKHVwZGF0ZUFnZU9uSGFzKSB7XG4gICAgICAgICAgdGhpcy4jdXBkYXRlSXRlbUFnZShpbmRleClcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgc3RhdHVzLmhhcyA9ICdoaXQnXG4gICAgICAgICAgdGhpcy4jc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy5oYXMgPSAnc3RhbGUnXG4gICAgICAgIHRoaXMuI3N0YXR1c1RUTChzdGF0dXMsIGluZGV4KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICBzdGF0dXMuaGFzID0gJ21pc3MnXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIExpa2Uge0BsaW5rIExSVUNhY2hlI2dldH0gYnV0IGRvZXNuJ3QgdXBkYXRlIHJlY2VuY3kgb3IgZGVsZXRlIHN0YWxlXG4gICAqIGl0ZW1zLlxuICAgKlxuICAgKiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBpdGVtIGlzIHN0YWxlLCB1bmxlc3NcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGV9IGlzIHNldC5cbiAgICovXG4gIHBlZWsoazogSywgcGVla09wdGlvbnM6IExSVUNhY2hlLlBlZWtPcHRpb25zPEssIFYsIEZDPiA9IHt9KSB7XG4gICAgY29uc3QgeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSBwZWVrT3B0aW9uc1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKVxuICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkIHx8ICghYWxsb3dTdGFsZSAmJiB0aGlzLiNpc1N0YWxlKGluZGV4KSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF1cbiAgICAvLyBlaXRoZXIgc3RhbGUgYW5kIGFsbG93ZWQsIG9yIGZvcmNpbmcgYSByZWZyZXNoIG9mIG5vbi1zdGFsZSB2YWx1ZVxuICAgIHJldHVybiB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiB2XG4gIH1cblxuICAjYmFja2dyb3VuZEZldGNoKFxuICAgIGs6IEssXG4gICAgaW5kZXg6IEluZGV4IHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IExSVUNhY2hlLkZldGNoT3B0aW9uczxLLCBWLCBGQz4sXG4gICAgY29udGV4dDogYW55LFxuICApOiBCYWNrZ3JvdW5kRmV0Y2g8Vj4ge1xuICAgIGNvbnN0IHYgPSBpbmRleCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy4jdmFsTGlzdFtpbmRleF1cbiAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgIHJldHVybiB2XG4gICAgfVxuXG4gICAgY29uc3QgYWMgPSBuZXcgQUMoKVxuICAgIGNvbnN0IHsgc2lnbmFsIH0gPSBvcHRpb25zXG4gICAgLy8gd2hlbi9pZiBvdXIgQUMgc2lnbmFscywgdGhlbiBzdG9wIGxpc3RlbmluZyB0byB0aGVpcnMuXG4gICAgc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IGFjLmFib3J0KHNpZ25hbC5yZWFzb24pLCB7XG4gICAgICBzaWduYWw6IGFjLnNpZ25hbCxcbiAgICB9KVxuXG4gICAgY29uc3QgZmV0Y2hPcHRzID0ge1xuICAgICAgc2lnbmFsOiBhYy5zaWduYWwsXG4gICAgICBvcHRpb25zLFxuICAgICAgY29udGV4dCxcbiAgICB9XG5cbiAgICBjb25zdCBjYiA9ICh2OiBWIHwgdW5kZWZpbmVkLCB1cGRhdGVDYWNoZSA9IGZhbHNlKTogViB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCB7IGFib3J0ZWQgfSA9IGFjLnNpZ25hbFxuICAgICAgY29uc3QgaWdub3JlQWJvcnQgPSBvcHRpb25zLmlnbm9yZUZldGNoQWJvcnQgJiYgdiAhPT0gdW5kZWZpbmVkXG4gICAgICBjb25zdCBwcm9jZWVkID1cbiAgICAgICAgb3B0aW9ucy5pZ25vcmVGZXRjaEFib3J0IHx8XG4gICAgICAgICEhKG9wdGlvbnMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCAmJiB2ICE9PSB1bmRlZmluZWQpXG4gICAgICBpZiAob3B0aW9ucy5zdGF0dXMpIHtcbiAgICAgICAgaWYgKGFib3J0ZWQgJiYgIXVwZGF0ZUNhY2hlKSB7XG4gICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hBYm9ydGVkID0gdHJ1ZVxuICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoRXJyb3IgPSBhYy5zaWduYWwucmVhc29uXG4gICAgICAgICAgaWYgKGlnbm9yZUFib3J0KSBvcHRpb25zLnN0YXR1cy5mZXRjaEFib3J0SWdub3JlZCA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaFJlc29sdmVkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYWJvcnRlZCAmJiAhaWdub3JlQWJvcnQgJiYgIXVwZGF0ZUNhY2hlKSB7XG4gICAgICAgIHJldHVybiBmZXRjaEZhaWwoYWMuc2lnbmFsLnJlYXNvbiwgcHJvY2VlZClcbiAgICAgIH1cbiAgICAgIC8vIGVpdGhlciB3ZSBkaWRuJ3QgYWJvcnQsIGFuZCBhcmUgc3RpbGwgaGVyZSwgb3Igd2UgZGlkLCBhbmQgaWdub3JlZFxuICAgICAgY29uc3QgYmYgPSBwIGFzIEJhY2tncm91bmRGZXRjaDxWPlxuICAgICAgLy8gaWYgbm90aGluZyBlbHNlIGhhcyBiZWVuIHdyaXR0ZW4gdGhlcmUgYnV0IHdlJ3JlIHNldCB0byB1cGRhdGUgdGhlXG4gICAgICAvLyBjYWNoZSBhbmQgaWdub3JlIHRoZSBhYm9ydCwgb3IgaWYgaXQncyBzdGlsbCBwZW5kaW5nIG9uIHRoaXMgc3BlY2lmaWNcbiAgICAgIC8vIGJhY2tncm91bmQgcmVxdWVzdCwgdGhlbiB3cml0ZSBpdCB0byB0aGUgY2FjaGUuXG4gICAgICBjb25zdCB2bCA9IHRoaXMuI3ZhbExpc3RbaW5kZXggYXMgSW5kZXhdXG4gICAgICBpZiAodmwgPT09IHAgfHwgKGlnbm9yZUFib3J0ICYmIHVwZGF0ZUNhY2hlICYmIHZsID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleCBhcyBJbmRleF0gPSBiZi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNkZWxldGUoaywgJ2ZldGNoJylcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzKSBvcHRpb25zLnN0YXR1cy5mZXRjaFVwZGF0ZWQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5zZXQoaywgdiwgZmV0Y2hPcHRzLm9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2XG4gICAgfVxuXG4gICAgY29uc3QgZWIgPSAoZXI6IGFueSkgPT4ge1xuICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzKSB7XG4gICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoUmVqZWN0ZWQgPSB0cnVlXG4gICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoRXJyb3IgPSBlclxuICAgICAgfVxuICAgICAgLy8gZG8gbm90IHBhc3MgZ28sIGRvIG5vdCBjb2xsZWN0ICQyMDBcbiAgICAgIHJldHVybiBmZXRjaEZhaWwoZXIsIGZhbHNlKVxuICAgIH1cblxuICAgIGNvbnN0IGZldGNoRmFpbCA9IChlcjogYW55LCBwcm9jZWVkOiBib29sZWFuKTogViB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCB7IGFib3J0ZWQgfSA9IGFjLnNpZ25hbFxuICAgICAgY29uc3QgYWxsb3dTdGFsZUFib3J0ZWQgPSBhYm9ydGVkICYmIG9wdGlvbnMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydFxuICAgICAgY29uc3QgYWxsb3dTdGFsZSA9XG4gICAgICAgIGFsbG93U3RhbGVBYm9ydGVkIHx8IG9wdGlvbnMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb25cbiAgICAgIGNvbnN0IG5vRGVsZXRlID0gYWxsb3dTdGFsZSB8fCBvcHRpb25zLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvblxuICAgICAgY29uc3QgYmYgPSBwIGFzIEJhY2tncm91bmRGZXRjaDxWPlxuICAgICAgaWYgKHRoaXMuI3ZhbExpc3RbaW5kZXggYXMgSW5kZXhdID09PSBwKSB7XG4gICAgICAgIC8vIGlmIHdlIGFsbG93IHN0YWxlIG9uIGZldGNoIHJlamVjdGlvbnMsIHRoZW4gd2UgbmVlZCB0byBlbnN1cmUgdGhhdFxuICAgICAgICAvLyB0aGUgc3RhbGUgdmFsdWUgaXMgbm90IHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUgd2hlbiB0aGUgZmV0Y2ggZmFpbHMuXG4gICAgICAgIGNvbnN0IGRlbCA9XG4gICAgICAgICAgIW5vRGVsZXRlIHx8ICghcHJvY2VlZCAmJiBiZi5fX3N0YWxlV2hpbGVGZXRjaGluZyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICBpZiAoZGVsKSB7XG4gICAgICAgICAgdGhpcy4jZGVsZXRlKGssICdmZXRjaCcpXG4gICAgICAgIH0gZWxzZSBpZiAoIWFsbG93U3RhbGVBYm9ydGVkKSB7XG4gICAgICAgICAgLy8gc3RpbGwgcmVwbGFjZSB0aGUgKnByb21pc2UqIHdpdGggdGhlIHN0YWxlIHZhbHVlLFxuICAgICAgICAgIC8vIHNpbmNlIHdlIGFyZSBkb25lIHdpdGggdGhlIHByb21pc2UgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAvLyBsZWF2ZSBpdCB1bnRvdWNoZWQgaWYgd2UncmUgc3RpbGwgd2FpdGluZyBmb3IgYW5cbiAgICAgICAgICAvLyBhYm9ydGVkIGJhY2tncm91bmQgZmV0Y2ggdGhhdCBoYXNuJ3QgeWV0IHJldHVybmVkLlxuICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXggYXMgSW5kZXhdID0gYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGFsbG93U3RhbGUpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzICYmIGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvcHRpb25zLnN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgfSBlbHNlIGlmIChiZi5fX3JldHVybmVkID09PSBiZikge1xuICAgICAgICB0aHJvdyBlclxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBjYWxsID0gKFxuICAgICAgcmVzOiAodjogViB8IHVuZGVmaW5lZCkgPT4gdm9pZCxcbiAgICAgIHJlajogKGU6IGFueSkgPT4gdm9pZCxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGZtcCA9IHRoaXMuI2ZldGNoTWV0aG9kPy4oaywgdiwgZmV0Y2hPcHRzKVxuICAgICAgaWYgKGZtcCAmJiBmbXAgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIGZtcC50aGVuKHYgPT4gcmVzKHYgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHYpLCByZWopXG4gICAgICB9XG4gICAgICAvLyBpZ25vcmVkLCB3ZSBnbyB1bnRpbCB3ZSBmaW5pc2gsIHJlZ2FyZGxlc3MuXG4gICAgICAvLyBkZWZlciBjaGVjayB1bnRpbCB3ZSBhcmUgYWN0dWFsbHkgYWJvcnRpbmcsXG4gICAgICAvLyBzbyBmZXRjaE1ldGhvZCBjYW4gb3ZlcnJpZGUuXG4gICAgICBhYy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVGZXRjaEFib3J0IHx8IG9wdGlvbnMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCkge1xuICAgICAgICAgIHJlcyh1bmRlZmluZWQpXG4gICAgICAgICAgLy8gd2hlbiBpdCBldmVudHVhbGx5IHJlc29sdmVzLCB1cGRhdGUgdGhlIGNhY2hlLlxuICAgICAgICAgIGlmIChvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoQWJvcnQpIHtcbiAgICAgICAgICAgIHJlcyA9IHYgPT4gY2IodiwgdHJ1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc3RhdHVzKSBvcHRpb25zLnN0YXR1cy5mZXRjaERpc3BhdGNoZWQgPSB0cnVlXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlKHBjYWxsKS50aGVuKGNiLCBlYilcbiAgICBjb25zdCBiZjogQmFja2dyb3VuZEZldGNoPFY+ID0gT2JqZWN0LmFzc2lnbihwLCB7XG4gICAgICBfX2Fib3J0Q29udHJvbGxlcjogYWMsXG4gICAgICBfX3N0YWxlV2hpbGVGZXRjaGluZzogdixcbiAgICAgIF9fcmV0dXJuZWQ6IHVuZGVmaW5lZCxcbiAgICB9KVxuXG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGludGVybmFsLCBkb24ndCBleHBvc2Ugc3RhdHVzLlxuICAgICAgdGhpcy5zZXQoaywgYmYsIHsgLi4uZmV0Y2hPcHRzLm9wdGlvbnMsIHN0YXR1czogdW5kZWZpbmVkIH0pXG4gICAgICBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoaylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSBiZlxuICAgIH1cbiAgICByZXR1cm4gYmZcbiAgfVxuXG4gICNpc0JhY2tncm91bmRGZXRjaChwOiBhbnkpOiBwIGlzIEJhY2tncm91bmRGZXRjaDxWPiB7XG4gICAgaWYgKCF0aGlzLiNoYXNGZXRjaE1ldGhvZCkgcmV0dXJuIGZhbHNlXG4gICAgY29uc3QgYiA9IHAgYXMgQmFja2dyb3VuZEZldGNoPFY+XG4gICAgcmV0dXJuIChcbiAgICAgICEhYiAmJlxuICAgICAgYiBpbnN0YW5jZW9mIFByb21pc2UgJiZcbiAgICAgIGIuaGFzT3duUHJvcGVydHkoJ19fc3RhbGVXaGlsZUZldGNoaW5nJykgJiZcbiAgICAgIGIuX19hYm9ydENvbnRyb2xsZXIgaW5zdGFuY2VvZiBBQ1xuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGFuIGFzeW5jaHJvbm91cyBjYWNoZWQgZmV0Y2ggdXNpbmcgdGhlXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5mZXRjaE1ldGhvZH0gZnVuY3Rpb24uXG4gICAqXG4gICAqIElmIHRoZSB2YWx1ZSBpcyBpbiB0aGUgY2FjaGUgYW5kIG5vdCBzdGFsZSwgdGhlbiB0aGUgcmV0dXJuZWRcbiAgICogUHJvbWlzZSByZXNvbHZlcyB0byB0aGUgdmFsdWUuXG4gICAqXG4gICAqIElmIG5vdCBpbiB0aGUgY2FjaGUsIG9yIGJleW9uZCBpdHMgVFRMIHN0YWxlbmVzcywgdGhlblxuICAgKiBgZmV0Y2hNZXRob2Qoa2V5LCBzdGFsZVZhbHVlLCB7IG9wdGlvbnMsIHNpZ25hbCwgY29udGV4dCB9KWAgaXNcbiAgICogY2FsbGVkLCBhbmQgdGhlIHZhbHVlIHJldHVybmVkIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNhY2hlIG9uY2VcbiAgICogcmVzb2x2ZWQuXG4gICAqXG4gICAqIElmIGNhbGxlZCB3aXRoIGBhbGxvd1N0YWxlYCwgYW5kIGFuIGFzeW5jaHJvbm91cyBmZXRjaCBpc1xuICAgKiBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MgdG8gcmVsb2FkIGEgc3RhbGUgdmFsdWUsIHRoZW4gdGhlIGZvcm1lclxuICAgKiBzdGFsZSB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLlxuICAgKlxuICAgKiBJZiBjYWxsZWQgd2l0aCBgZm9yY2VSZWZyZXNoYCwgdGhlbiB0aGUgY2FjaGVkIGl0ZW0gd2lsbCBiZVxuICAgKiByZS1mZXRjaGVkLCBldmVuIGlmIGl0IGlzIG5vdCBzdGFsZS4gSG93ZXZlciwgaWYgYGFsbG93U3RhbGVgIGlzIGFsc29cbiAgICogc2V0LCB0aGVuIHRoZSBvbGQgdmFsdWUgd2lsbCBzdGlsbCBiZSByZXR1cm5lZC4gVGhpcyBpcyB1c2VmdWxcbiAgICogaW4gY2FzZXMgd2hlcmUgeW91IHdhbnQgdG8gZm9yY2UgYSByZWxvYWQgb2YgYSBjYWNoZWQgdmFsdWUuIElmXG4gICAqIGEgYmFja2dyb3VuZCBmZXRjaCBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCB0aGVuIGBmb3JjZVJlZnJlc2hgXG4gICAqIGhhcyBubyBlZmZlY3QuXG4gICAqXG4gICAqIElmIG11bHRpcGxlIGZldGNoZXMgZm9yIHRoZSBzYW1lIGtleSBhcmUgaXNzdWVkLCB0aGVuIHRoZXkgd2lsbCBhbGwgYmVcbiAgICogY29hbGVzY2VkIGludG8gYSBzaW5nbGUgY2FsbCB0byBmZXRjaE1ldGhvZC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgbWVhbnMgdGhhdCBoYW5kbGluZyBvcHRpb25zIHN1Y2ggYXNcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGVPbkZldGNoQWJvcnR9LFxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuRmV0Y2hPcHRpb25zLnNpZ25hbH0sXG4gICAqIGFuZCB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb259IHdpbGwgYmVcbiAgICogZGV0ZXJtaW5lZCBieSB0aGUgRklSU1QgZmV0Y2goKSBjYWxsIGZvciBhIGdpdmVuIGtleS5cbiAgICpcbiAgICogVGhpcyBpcyBhIGtub3duIChmaXhhYmxlKSBzaG9ydGNvbWluZyB3aGljaCB3aWxsIGJlIGFkZHJlc2VkIG9uIHdoZW5cbiAgICogc29tZW9uZSBjb21wbGFpbnMgYWJvdXQgaXQsIGFzIHRoZSBmaXggd291bGQgaW52b2x2ZSBhZGRlZCBjb21wbGV4aXR5IGFuZFxuICAgKiBtYXkgbm90IGJlIHdvcnRoIHRoZSBjb3N0cyBmb3IgdGhpcyBlZGdlIGNhc2UuXG4gICAqXG4gICAqIElmIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5mZXRjaE1ldGhvZH0gaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0aGlzIGlzXG4gICAqIGVmZmVjdGl2ZWx5IGFuIGFsaWFzIGZvciBgUHJvbWlzZS5yZXNvbHZlKGNhY2hlLmdldChrZXkpKWAuXG4gICAqXG4gICAqIFdoZW4gdGhlIGZldGNoIG1ldGhvZCByZXNvbHZlcyB0byBhIHZhbHVlLCBpZiB0aGUgZmV0Y2ggaGFzIG5vdFxuICAgKiBiZWVuIGFib3J0ZWQgZHVlIHRvIGRlbGV0aW9uLCBldmljdGlvbiwgb3IgYmVpbmcgb3ZlcndyaXR0ZW4sXG4gICAqIHRoZW4gaXQgaXMgYWRkZWQgdG8gdGhlIGNhY2hlIHVzaW5nIHRoZSBvcHRpb25zIHByb3ZpZGVkLlxuICAgKlxuICAgKiBJZiB0aGUga2V5IGlzIGV2aWN0ZWQgb3IgZGVsZXRlZCBiZWZvcmUgdGhlIGBmZXRjaE1ldGhvZGBcbiAgICogcmVzb2x2ZXMsIHRoZW4gdGhlIEFib3J0U2lnbmFsIHBhc3NlZCB0byB0aGUgYGZldGNoTWV0aG9kYCB3aWxsXG4gICAqIHJlY2VpdmUgYW4gYGFib3J0YCBldmVudCwgYW5kIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IGBmZXRjaCgpYFxuICAgKiB3aWxsIHJlamVjdCB3aXRoIHRoZSByZWFzb24gZm9yIHRoZSBhYm9ydC5cbiAgICpcbiAgICogSWYgYSBgc2lnbmFsYCBpcyBwYXNzZWQgdG8gdGhlIGBmZXRjaCgpYCBjYWxsLCB0aGVuIGFib3J0aW5nIHRoZVxuICAgKiBzaWduYWwgd2lsbCBhYm9ydCB0aGUgZmV0Y2ggYW5kIGNhdXNlIHRoZSBgZmV0Y2goKWAgcHJvbWlzZSB0b1xuICAgKiByZWplY3Qgd2l0aCB0aGUgcmVhc29uIHByb3ZpZGVkLlxuICAgKlxuICAgKiAqKlNldHRpbmcgYGNvbnRleHRgKipcbiAgICpcbiAgICogSWYgYW4gYEZDYCB0eXBlIGlzIHNldCB0byBhIHR5cGUgb3RoZXIgdGhhbiBgdW5rbm93bmAsIGB2b2lkYCwgb3JcbiAgICogYHVuZGVmaW5lZGAgaW4gdGhlIHtAbGluayBMUlVDYWNoZX0gY29uc3RydWN0b3IsIHRoZW4gYWxsXG4gICAqIGNhbGxzIHRvIGBjYWNoZS5mZXRjaCgpYCBfbXVzdF8gcHJvdmlkZSBhIGBjb250ZXh0YCBvcHRpb24uIElmXG4gICAqIHNldCB0byBgdW5kZWZpbmVkYCBvciBgdm9pZGAsIHRoZW4gY2FsbHMgdG8gZmV0Y2ggX211c3Qgbm90X1xuICAgKiBwcm92aWRlIGEgYGNvbnRleHRgIG9wdGlvbi5cbiAgICpcbiAgICogVGhlIGBjb250ZXh0YCBwYXJhbSBhbGxvd3MgeW91IHRvIHByb3ZpZGUgYXJiaXRyYXJ5IGRhdGEgdGhhdFxuICAgKiBtaWdodCBiZSByZWxldmFudCBpbiB0aGUgY291cnNlIG9mIGZldGNoaW5nIHRoZSBkYXRhLiBJdCBpcyBvbmx5XG4gICAqIHJlbGV2YW50IGZvciB0aGUgY291cnNlIG9mIGEgc2luZ2xlIGBmZXRjaCgpYCBvcGVyYXRpb24sIGFuZFxuICAgKiBkaXNjYXJkZWQgYWZ0ZXJ3YXJkcy5cbiAgICpcbiAgICogKipOb3RlOiBgZmV0Y2goKWAgY2FsbHMgYXJlIGluZmxpZ2h0LXVuaXF1ZSoqXG4gICAqXG4gICAqIElmIHlvdSBjYWxsIGBmZXRjaCgpYCBtdWx0aXBsZSB0aW1lcyB3aXRoIHRoZSBzYW1lIGtleSB2YWx1ZSxcbiAgICogdGhlbiBldmVyeSBjYWxsIGFmdGVyIHRoZSBmaXJzdCB3aWxsIHJlc29sdmUgb24gdGhlIHNhbWVcbiAgICogcHJvbWlzZTxzdXA+MTwvc3VwPixcbiAgICogX2V2ZW4gaWYgdGhleSBoYXZlIGRpZmZlcmVudCBzZXR0aW5ncyB0aGF0IHdvdWxkIG90aGVyd2lzZSBjaGFuZ2VcbiAgICogdGhlIGJlaGF2aW9yIG9mIHRoZSBmZXRjaF8sIHN1Y2ggYXMgYG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbmBcbiAgICogb3IgYGlnbm9yZUZldGNoQWJvcnRgLlxuICAgKlxuICAgKiBJbiBtb3N0IGNhc2VzLCB0aGlzIGlzIG5vdCBhIHByb2JsZW0gKGluIGZhY3QsIG9ubHkgZmV0Y2hpbmdcbiAgICogc29tZXRoaW5nIG9uY2UgaXMgd2hhdCB5b3UgcHJvYmFibHkgd2FudCwgaWYgeW91J3JlIGNhY2hpbmcgaW5cbiAgICogdGhlIGZpcnN0IHBsYWNlKS4gSWYgeW91IGFyZSBjaGFuZ2luZyB0aGUgZmV0Y2goKSBvcHRpb25zXG4gICAqIGRyYW1hdGljYWxseSBiZXR3ZWVuIHJ1bnMsIHRoZXJlJ3MgYSBnb29kIGNoYW5jZSB0aGF0IHlvdSBtaWdodFxuICAgKiBiZSB0cnlpbmcgdG8gZml0IGRpdmVyZ2VudCBzZW1hbnRpY3MgaW50byBhIHNpbmdsZSBvYmplY3QsIGFuZFxuICAgKiB3b3VsZCBiZSBiZXR0ZXIgb2ZmIHdpdGggbXVsdGlwbGUgY2FjaGUgaW5zdGFuY2VzLlxuICAgKlxuICAgKiAqKjEqKjogSWUsIHRoZXkncmUgbm90IHRoZSBcInNhbWUgUHJvbWlzZVwiLCBidXQgdGhleSByZXNvbHZlIGF0XG4gICAqIHRoZSBzYW1lIHRpbWUsIGJlY2F1c2UgdGhleSdyZSBib3RoIHdhaXRpbmcgb24gdGhlIHNhbWVcbiAgICogdW5kZXJseWluZyBmZXRjaE1ldGhvZCByZXNwb25zZS5cbiAgICovXG5cbiAgZmV0Y2goXG4gICAgazogSyxcbiAgICBmZXRjaE9wdGlvbnM6IHVua25vd24gZXh0ZW5kcyBGQyA/IExSVUNhY2hlLkZldGNoT3B0aW9uczxLLCBWLCBGQz5cbiAgICA6IEZDIGV4dGVuZHMgdW5kZWZpbmVkIHwgdm9pZCA/IExSVUNhY2hlLkZldGNoT3B0aW9uc05vQ29udGV4dDxLLCBWPlxuICAgIDogTFJVQ2FjaGUuRmV0Y2hPcHRpb25zV2l0aENvbnRleHQ8SywgViwgRkM+LFxuICApOiBQcm9taXNlPHVuZGVmaW5lZCB8IFY+XG5cbiAgLy8gdGhpcyBvdmVybG9hZCBub3QgYWxsb3dlZCBpZiBjb250ZXh0IGlzIHJlcXVpcmVkXG4gIGZldGNoKFxuICAgIGs6IHVua25vd24gZXh0ZW5kcyBGQyA/IEtcbiAgICA6IEZDIGV4dGVuZHMgdW5kZWZpbmVkIHwgdm9pZCA/IEtcbiAgICA6IG5ldmVyLFxuICAgIGZldGNoT3B0aW9ucz86IHVua25vd24gZXh0ZW5kcyBGQyA/IExSVUNhY2hlLkZldGNoT3B0aW9uczxLLCBWLCBGQz5cbiAgICA6IEZDIGV4dGVuZHMgdW5kZWZpbmVkIHwgdm9pZCA/IExSVUNhY2hlLkZldGNoT3B0aW9uc05vQ29udGV4dDxLLCBWPlxuICAgIDogbmV2ZXIsXG4gICk6IFByb21pc2U8dW5kZWZpbmVkIHwgVj5cblxuICBhc3luYyBmZXRjaChcbiAgICBrOiBLLFxuICAgIGZldGNoT3B0aW9uczogTFJVQ2FjaGUuRmV0Y2hPcHRpb25zPEssIFYsIEZDPiA9IHt9LFxuICApOiBQcm9taXNlPHVuZGVmaW5lZCB8IFY+IHtcbiAgICBjb25zdCB7XG4gICAgICAvLyBnZXQgb3B0aW9uc1xuICAgICAgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSxcbiAgICAgIHVwZGF0ZUFnZU9uR2V0ID0gdGhpcy51cGRhdGVBZ2VPbkdldCxcbiAgICAgIG5vRGVsZXRlT25TdGFsZUdldCA9IHRoaXMubm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgLy8gc2V0IG9wdGlvbnNcbiAgICAgIHR0bCA9IHRoaXMudHRsLFxuICAgICAgbm9EaXNwb3NlT25TZXQgPSB0aGlzLm5vRGlzcG9zZU9uU2V0LFxuICAgICAgc2l6ZSA9IDAsXG4gICAgICBzaXplQ2FsY3VsYXRpb24gPSB0aGlzLnNpemVDYWxjdWxhdGlvbixcbiAgICAgIG5vVXBkYXRlVFRMID0gdGhpcy5ub1VwZGF0ZVRUTCxcbiAgICAgIC8vIGZldGNoIGV4Y2x1c2l2ZSBvcHRpb25zXG4gICAgICBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24gPSB0aGlzLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbixcbiAgICAgIGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uID0gdGhpcy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbixcbiAgICAgIGlnbm9yZUZldGNoQWJvcnQgPSB0aGlzLmlnbm9yZUZldGNoQWJvcnQsXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaEFib3J0ID0gdGhpcy5hbGxvd1N0YWxlT25GZXRjaEFib3J0LFxuICAgICAgY29udGV4dCxcbiAgICAgIGZvcmNlUmVmcmVzaCA9IGZhbHNlLFxuICAgICAgc3RhdHVzLFxuICAgICAgc2lnbmFsLFxuICAgIH0gPSBmZXRjaE9wdGlvbnNcblxuICAgIGlmICghdGhpcy4jaGFzRmV0Y2hNZXRob2QpIHtcbiAgICAgIGlmIChzdGF0dXMpIHN0YXR1cy5mZXRjaCA9ICdnZXQnXG4gICAgICByZXR1cm4gdGhpcy5nZXQoaywge1xuICAgICAgICBhbGxvd1N0YWxlLFxuICAgICAgICB1cGRhdGVBZ2VPbkdldCxcbiAgICAgICAgbm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgICBzdGF0dXMsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBhbGxvd1N0YWxlLFxuICAgICAgdXBkYXRlQWdlT25HZXQsXG4gICAgICBub0RlbGV0ZU9uU3RhbGVHZXQsXG4gICAgICB0dGwsXG4gICAgICBub0Rpc3Bvc2VPblNldCxcbiAgICAgIHNpemUsXG4gICAgICBzaXplQ2FsY3VsYXRpb24sXG4gICAgICBub1VwZGF0ZVRUTCxcbiAgICAgIG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbixcbiAgICAgIGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uLFxuICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCxcbiAgICAgIGlnbm9yZUZldGNoQWJvcnQsXG4gICAgICBzdGF0dXMsXG4gICAgICBzaWduYWwsXG4gICAgfVxuXG4gICAgbGV0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKVxuICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuZmV0Y2ggPSAnbWlzcydcbiAgICAgIGNvbnN0IHAgPSB0aGlzLiNiYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpXG4gICAgICByZXR1cm4gKHAuX19yZXR1cm5lZCA9IHApXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGluIGNhY2hlLCBtYXliZSBhbHJlYWR5IGZldGNoaW5nXG4gICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF1cbiAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICBjb25zdCBzdGFsZSA9IGFsbG93U3RhbGUgJiYgdi5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkXG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICBzdGF0dXMuZmV0Y2ggPSAnaW5mbGlnaHQnXG4gICAgICAgICAgaWYgKHN0YWxlKSBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhbGUgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nIDogKHYuX19yZXR1cm5lZCA9IHYpXG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHdlIGZvcmNlIGEgcmVmcmVzaCwgdGhhdCBtZWFucyBkbyBOT1Qgc2VydmUgdGhlIGNhY2hlZCB2YWx1ZSxcbiAgICAgIC8vIHVubGVzcyB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcyBvZiByZWZyZXNoaW5nIHRoZSBjYWNoZS5cbiAgICAgIGNvbnN0IGlzU3RhbGUgPSB0aGlzLiNpc1N0YWxlKGluZGV4KVxuICAgICAgaWYgKCFmb3JjZVJlZnJlc2ggJiYgIWlzU3RhbGUpIHtcbiAgICAgICAgaWYgKHN0YXR1cykgc3RhdHVzLmZldGNoID0gJ2hpdCdcbiAgICAgICAgdGhpcy4jbW92ZVRvVGFpbChpbmRleClcbiAgICAgICAgaWYgKHVwZGF0ZUFnZU9uR2V0KSB7XG4gICAgICAgICAgdGhpcy4jdXBkYXRlSXRlbUFnZShpbmRleClcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHVzKSB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleClcbiAgICAgICAgcmV0dXJuIHZcbiAgICAgIH1cblxuICAgICAgLy8gb2ssIGl0IGlzIHN0YWxlIG9yIGEgZm9yY2VkIHJlZnJlc2gsIGFuZCBub3QgYWxyZWFkeSBmZXRjaGluZy5cbiAgICAgIC8vIHJlZnJlc2ggdGhlIGNhY2hlLlxuICAgICAgY29uc3QgcCA9IHRoaXMuI2JhY2tncm91bmRGZXRjaChrLCBpbmRleCwgb3B0aW9ucywgY29udGV4dClcbiAgICAgIGNvbnN0IGhhc1N0YWxlID0gcC5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkXG4gICAgICBjb25zdCBzdGFsZVZhbCA9IGhhc1N0YWxlICYmIGFsbG93U3RhbGVcbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLmZldGNoID0gaXNTdGFsZSA/ICdzdGFsZScgOiAncmVmcmVzaCdcbiAgICAgICAgaWYgKHN0YWxlVmFsICYmIGlzU3RhbGUpIHN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YWxlVmFsID8gcC5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IChwLl9fcmV0dXJuZWQgPSBwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBzb21lIGNhc2VzLCBgY2FjaGUuZmV0Y2goKWAgbWF5IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAsIGVpdGhlciBiZWNhdXNlXG4gICAqIGEge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlI2ZldGNoTWV0aG9kfSB3YXMgbm90IHByb3ZpZGVkICh0dXJuaW5nXG4gICAqIGBjYWNoZS5mZXRjaChrKWAgaW50byBqdXN0IGFuIGFzeW5jIHdyYXBwZXIgYXJvdW5kIGBjYWNoZS5nZXQoaylgKSBvclxuICAgKiBiZWNhdXNlIGBpZ25vcmVGZXRjaEFib3J0YCB3YXMgc3BlY2lmaWVkIChlaXRoZXIgdG8gdGhlIGNvbnN0cnVjdG9yIG9yXG4gICAqIGluIHRoZSB7QGxpbmsgTFJVQ2FjaGUuRmV0Y2hPcHRpb25zfSkuIEFsc28sIHRoZVxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9IG1heSByZXR1cm4gYHVuZGVmaW5lZGAgb3IgYHZvaWRgLCBtYWtpbmdcbiAgICogdGhlIHRlc3QgZXZlbiBtb3JlIGNvbXBsaWNhdGVkLlxuICAgKlxuICAgKiBCZWNhdXNlIGluZmVycmluZyB0aGUgY2FzZXMgd2hlcmUgYHVuZGVmaW5lZGAgbWlnaHQgYmUgcmV0dXJuZWQgYXJlIHNvXG4gICAqIGN1bWJlcnNvbWUsIGJ1dCB0ZXN0aW5nIGZvciBgdW5kZWZpbmVkYCBjYW4gYWxzbyBiZSBhbm5veWluZywgdGhpcyBtZXRob2RcbiAgICogY2FuIGJlIHVzZWQsIHdoaWNoIHdpbGwgcmVqZWN0IGlmIGB0aGlzLmZldGNoKClgIHJlc29sdmVzIHRvIHVuZGVmaW5lZC5cbiAgICovXG4gIGZvcmNlRmV0Y2goXG4gICAgazogSyxcbiAgICBmZXRjaE9wdGlvbnM6IHVua25vd24gZXh0ZW5kcyBGQyA/IExSVUNhY2hlLkZldGNoT3B0aW9uczxLLCBWLCBGQz5cbiAgICA6IEZDIGV4dGVuZHMgdW5kZWZpbmVkIHwgdm9pZCA/IExSVUNhY2hlLkZldGNoT3B0aW9uc05vQ29udGV4dDxLLCBWPlxuICAgIDogTFJVQ2FjaGUuRmV0Y2hPcHRpb25zV2l0aENvbnRleHQ8SywgViwgRkM+LFxuICApOiBQcm9taXNlPFY+XG4gIC8vIHRoaXMgb3ZlcmxvYWQgbm90IGFsbG93ZWQgaWYgY29udGV4dCBpcyByZXF1aXJlZFxuICBmb3JjZUZldGNoKFxuICAgIGs6IHVua25vd24gZXh0ZW5kcyBGQyA/IEtcbiAgICA6IEZDIGV4dGVuZHMgdW5kZWZpbmVkIHwgdm9pZCA/IEtcbiAgICA6IG5ldmVyLFxuICAgIGZldGNoT3B0aW9ucz86IHVua25vd24gZXh0ZW5kcyBGQyA/IExSVUNhY2hlLkZldGNoT3B0aW9uczxLLCBWLCBGQz5cbiAgICA6IEZDIGV4dGVuZHMgdW5kZWZpbmVkIHwgdm9pZCA/IExSVUNhY2hlLkZldGNoT3B0aW9uc05vQ29udGV4dDxLLCBWPlxuICAgIDogbmV2ZXIsXG4gICk6IFByb21pc2U8Vj5cbiAgYXN5bmMgZm9yY2VGZXRjaChcbiAgICBrOiBLLFxuICAgIGZldGNoT3B0aW9uczogTFJVQ2FjaGUuRmV0Y2hPcHRpb25zPEssIFYsIEZDPiA9IHt9LFxuICApOiBQcm9taXNlPFY+IHtcbiAgICBjb25zdCB2ID0gYXdhaXQgdGhpcy5mZXRjaChcbiAgICAgIGssXG4gICAgICBmZXRjaE9wdGlvbnMgYXMgdW5rbm93biBleHRlbmRzIEZDID8gTFJVQ2FjaGUuRmV0Y2hPcHRpb25zPEssIFYsIEZDPlxuICAgICAgOiBGQyBleHRlbmRzIHVuZGVmaW5lZCB8IHZvaWQgPyBMUlVDYWNoZS5GZXRjaE9wdGlvbnNOb0NvbnRleHQ8SywgVj5cbiAgICAgIDogTFJVQ2FjaGUuRmV0Y2hPcHRpb25zV2l0aENvbnRleHQ8SywgViwgRkM+LFxuICAgIClcbiAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ2ZldGNoKCkgcmV0dXJuZWQgdW5kZWZpbmVkJylcbiAgICByZXR1cm4gdlxuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBrZXkgaXMgZm91bmQgaW4gdGhlIGNhY2hlLCB0aGVuIHRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgKiB7QGxpbmsgTFJVQ2FjaGUjZ2V0fS4gSWYgbm90LCBpbiB0aGUgY2FjaGUsIHRoZW4gY2FsY3VsYXRlIHRoZSB2YWx1ZSB1c2luZ1xuICAgKiB0aGUge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm1lbW9NZXRob2R9LCBhbmQgYWRkIGl0IHRvIHRoZSBjYWNoZS5cbiAgICpcbiAgICogSWYgYW4gYEZDYCB0eXBlIGlzIHNldCB0byBhIHR5cGUgb3RoZXIgdGhhbiBgdW5rbm93bmAsIGB2b2lkYCwgb3JcbiAgICogYHVuZGVmaW5lZGAgaW4gdGhlIExSVUNhY2hlIGNvbnN0cnVjdG9yLCB0aGVuIGFsbCBjYWxscyB0byBgY2FjaGUubWVtbygpYFxuICAgKiBfbXVzdF8gcHJvdmlkZSBhIGBjb250ZXh0YCBvcHRpb24uIElmIHNldCB0byBgdW5kZWZpbmVkYCBvciBgdm9pZGAsIHRoZW5cbiAgICogY2FsbHMgdG8gbWVtbyBfbXVzdCBub3RfIHByb3ZpZGUgYSBgY29udGV4dGAgb3B0aW9uLlxuICAgKlxuICAgKiBUaGUgYGNvbnRleHRgIHBhcmFtIGFsbG93cyB5b3UgdG8gcHJvdmlkZSBhcmJpdHJhcnkgZGF0YSB0aGF0IG1pZ2h0IGJlXG4gICAqIHJlbGV2YW50IGluIHRoZSBjb3Vyc2Ugb2YgZmV0Y2hpbmcgdGhlIGRhdGEuIEl0IGlzIG9ubHkgcmVsZXZhbnQgZm9yIHRoZVxuICAgKiBjb3Vyc2Ugb2YgYSBzaW5nbGUgYG1lbW8oKWAgb3BlcmF0aW9uLCBhbmQgZGlzY2FyZGVkIGFmdGVyd2FyZHMuXG4gICAqL1xuICBtZW1vKFxuICAgIGs6IEssXG4gICAgbWVtb09wdGlvbnM6IHVua25vd24gZXh0ZW5kcyBGQyA/IExSVUNhY2hlLk1lbW9PcHRpb25zPEssIFYsIEZDPlxuICAgIDogRkMgZXh0ZW5kcyB1bmRlZmluZWQgfCB2b2lkID8gTFJVQ2FjaGUuTWVtb09wdGlvbnNOb0NvbnRleHQ8SywgVj5cbiAgICA6IExSVUNhY2hlLk1lbW9PcHRpb25zV2l0aENvbnRleHQ8SywgViwgRkM+LFxuICApOiBWXG4gIC8vIHRoaXMgb3ZlcmxvYWQgbm90IGFsbG93ZWQgaWYgY29udGV4dCBpcyByZXF1aXJlZFxuICBtZW1vKFxuICAgIGs6IHVua25vd24gZXh0ZW5kcyBGQyA/IEtcbiAgICA6IEZDIGV4dGVuZHMgdW5kZWZpbmVkIHwgdm9pZCA/IEtcbiAgICA6IG5ldmVyLFxuICAgIG1lbW9PcHRpb25zPzogdW5rbm93biBleHRlbmRzIEZDID8gTFJVQ2FjaGUuTWVtb09wdGlvbnM8SywgViwgRkM+XG4gICAgOiBGQyBleHRlbmRzIHVuZGVmaW5lZCB8IHZvaWQgPyBMUlVDYWNoZS5NZW1vT3B0aW9uc05vQ29udGV4dDxLLCBWPlxuICAgIDogbmV2ZXIsXG4gICk6IFZcbiAgbWVtbyhrOiBLLCBtZW1vT3B0aW9uczogTFJVQ2FjaGUuTWVtb09wdGlvbnM8SywgViwgRkM+ID0ge30pIHtcbiAgICBjb25zdCBtZW1vTWV0aG9kID0gdGhpcy4jbWVtb01ldGhvZFxuICAgIGlmICghbWVtb01ldGhvZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBtZW1vTWV0aG9kIHByb3ZpZGVkIHRvIGNvbnN0cnVjdG9yJylcbiAgICB9XG4gICAgY29uc3QgeyBjb250ZXh0LCBmb3JjZVJlZnJlc2gsIC4uLm9wdGlvbnMgfSA9IG1lbW9PcHRpb25zXG4gICAgY29uc3QgdiA9IHRoaXMuZ2V0KGssIG9wdGlvbnMpXG4gICAgaWYgKCFmb3JjZVJlZnJlc2ggJiYgdiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdlxuICAgIGNvbnN0IHZ2ID0gbWVtb01ldGhvZChrLCB2LCB7XG4gICAgICBvcHRpb25zLFxuICAgICAgY29udGV4dCxcbiAgICB9IGFzIExSVUNhY2hlLk1lbW9pemVyT3B0aW9uczxLLCBWLCBGQz4pXG4gICAgdGhpcy5zZXQoaywgdnYsIG9wdGlvbnMpXG4gICAgcmV0dXJuIHZ2XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgdmFsdWUgZnJvbSB0aGUgY2FjaGUuIFdpbGwgdXBkYXRlIHRoZSByZWNlbmN5IG9mIHRoZSBjYWNoZVxuICAgKiBlbnRyeSBmb3VuZC5cbiAgICpcbiAgICogSWYgdGhlIGtleSBpcyBub3QgZm91bmQsIGdldCgpIHdpbGwgcmV0dXJuIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgZ2V0KGs6IEssIGdldE9wdGlvbnM6IExSVUNhY2hlLkdldE9wdGlvbnM8SywgViwgRkM+ID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlLFxuICAgICAgdXBkYXRlQWdlT25HZXQgPSB0aGlzLnVwZGF0ZUFnZU9uR2V0LFxuICAgICAgbm9EZWxldGVPblN0YWxlR2V0ID0gdGhpcy5ub0RlbGV0ZU9uU3RhbGVHZXQsXG4gICAgICBzdGF0dXMsXG4gICAgfSA9IGdldE9wdGlvbnNcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoaylcbiAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiN2YWxMaXN0W2luZGV4XVxuICAgICAgY29uc3QgZmV0Y2hpbmcgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2YWx1ZSlcbiAgICAgIGlmIChzdGF0dXMpIHRoaXMuI3N0YXR1c1RUTChzdGF0dXMsIGluZGV4KVxuICAgICAgaWYgKHRoaXMuI2lzU3RhbGUoaW5kZXgpKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHN0YXR1cy5nZXQgPSAnc3RhbGUnXG4gICAgICAgIC8vIGRlbGV0ZSBvbmx5IGlmIG5vdCBhbiBpbi1mbGlnaHQgYmFja2dyb3VuZCBmZXRjaFxuICAgICAgICBpZiAoIWZldGNoaW5nKSB7XG4gICAgICAgICAgaWYgKCFub0RlbGV0ZU9uU3RhbGVHZXQpIHtcbiAgICAgICAgICAgIHRoaXMuI2RlbGV0ZShrLCAnZXhwaXJlJylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXR1cyAmJiBhbGxvd1N0YWxlKSBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWVcbiAgICAgICAgICByZXR1cm4gYWxsb3dTdGFsZSA/IHZhbHVlIDogdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc3RhdHVzICYmXG4gICAgICAgICAgICBhbGxvd1N0YWxlICYmXG4gICAgICAgICAgICB2YWx1ZS5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFsbG93U3RhbGUgPyB2YWx1ZS5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuZ2V0ID0gJ2hpdCdcbiAgICAgICAgLy8gaWYgd2UncmUgY3VycmVudGx5IGZldGNoaW5nIGl0LCB3ZSBkb24ndCBhY3R1YWxseSBoYXZlIGl0IHlldFxuICAgICAgICAvLyBpdCdzIG5vdCBzdGFsZSwgd2hpY2ggbWVhbnMgdGhpcyBpc24ndCBhIHN0YWxlV2hpbGVSZWZldGNoaW5nLlxuICAgICAgICAvLyBJZiBpdCdzIG5vdCBzdGFsZSwgYW5kIGZldGNoaW5nLCBBTkQgaGFzIGEgX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgLy8gdmFsdWUsIHRoZW4gdGhhdCBtZWFucyB0aGUgdXNlciBmZXRjaGVkIHdpdGgge2ZvcmNlUmVmcmVzaDp0cnVlfSxcbiAgICAgICAgLy8gc28gaXQncyBzYWZlIHRvIHJldHVybiB0aGF0IHZhbHVlLlxuICAgICAgICBpZiAoZmV0Y2hpbmcpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNtb3ZlVG9UYWlsKGluZGV4KVxuICAgICAgICBpZiAodXBkYXRlQWdlT25HZXQpIHtcbiAgICAgICAgICB0aGlzLiN1cGRhdGVJdGVtQWdlKGluZGV4KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICBzdGF0dXMuZ2V0ID0gJ21pc3MnXG4gICAgfVxuICB9XG5cbiAgI2Nvbm5lY3QocDogSW5kZXgsIG46IEluZGV4KSB7XG4gICAgdGhpcy4jcHJldltuXSA9IHBcbiAgICB0aGlzLiNuZXh0W3BdID0gblxuICB9XG5cbiAgI21vdmVUb1RhaWwoaW5kZXg6IEluZGV4KTogdm9pZCB7XG4gICAgLy8gaWYgdGFpbCBhbHJlYWR5LCBub3RoaW5nIHRvIGRvXG4gICAgLy8gaWYgaGVhZCwgbW92ZSBoZWFkIHRvIG5leHRbaW5kZXhdXG4gICAgLy8gZWxzZVxuICAgIC8vICAgbW92ZSBuZXh0W3ByZXZbaW5kZXhdXSB0byBuZXh0W2luZGV4XSAoaGVhZCBoYXMgbm8gcHJldilcbiAgICAvLyAgIG1vdmUgcHJldltuZXh0W2luZGV4XV0gdG8gcHJldltpbmRleF1cbiAgICAvLyBwcmV2W2luZGV4XSA9IHRhaWxcbiAgICAvLyBuZXh0W3RhaWxdID0gaW5kZXhcbiAgICAvLyB0YWlsID0gaW5kZXhcbiAgICBpZiAoaW5kZXggIT09IHRoaXMuI3RhaWwpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gdGhpcy4jaGVhZCkge1xuICAgICAgICB0aGlzLiNoZWFkID0gdGhpcy4jbmV4dFtpbmRleF0gYXMgSW5kZXhcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3QoXG4gICAgICAgICAgdGhpcy4jcHJldltpbmRleF0gYXMgSW5kZXgsXG4gICAgICAgICAgdGhpcy4jbmV4dFtpbmRleF0gYXMgSW5kZXgsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHRoaXMuI2Nvbm5lY3QodGhpcy4jdGFpbCwgaW5kZXgpXG4gICAgICB0aGlzLiN0YWlsID0gaW5kZXhcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhIGtleSBvdXQgb2YgdGhlIGNhY2hlLlxuICAgKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGtleSB3YXMgZGVsZXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgZGVsZXRlKGs6IEspIHtcbiAgICByZXR1cm4gdGhpcy4jZGVsZXRlKGssICdkZWxldGUnKVxuICB9XG5cbiAgI2RlbGV0ZShrOiBLLCByZWFzb246IExSVUNhY2hlLkRpc3Bvc2VSZWFzb24pIHtcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlXG4gICAgaWYgKHRoaXMuI3NpemUgIT09IDApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKVxuICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuI2F1dG9wdXJnZVRpbWVycz8uW2luZGV4XSkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNhdXRvcHVyZ2VUaW1lcnM/LltpbmRleF0pXG4gICAgICAgICAgdGhpcy4jYXV0b3B1cmdlVGltZXJzW2luZGV4XSA9IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlXG4gICAgICAgIGlmICh0aGlzLiNzaXplID09PSAxKSB7XG4gICAgICAgICAgdGhpcy4jY2xlYXIocmVhc29uKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuI3JlbW92ZUl0ZW1TaXplKGluZGV4KVxuICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2luZGV4XVxuICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgdi5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ2RlbGV0ZWQnKSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UgfHwgdGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZSkge1xuICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlPy4odiBhcyBWLCBrLCByZWFzb24pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFt2IGFzIFYsIGssIHJlYXNvbl0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuI2tleU1hcC5kZWxldGUoaylcbiAgICAgICAgICB0aGlzLiNrZXlMaXN0W2luZGV4XSA9IHVuZGVmaW5lZFxuICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKGluZGV4ID09PSB0aGlzLiN0YWlsKSB7XG4gICAgICAgICAgICB0aGlzLiN0YWlsID0gdGhpcy4jcHJldltpbmRleF0gYXMgSW5kZXhcbiAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09PSB0aGlzLiNoZWFkKSB7XG4gICAgICAgICAgICB0aGlzLiNoZWFkID0gdGhpcy4jbmV4dFtpbmRleF0gYXMgSW5kZXhcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGkgPSB0aGlzLiNwcmV2W2luZGV4XSBhcyBudW1iZXJcbiAgICAgICAgICAgIHRoaXMuI25leHRbcGldID0gdGhpcy4jbmV4dFtpbmRleF0gYXMgbnVtYmVyXG4gICAgICAgICAgICBjb25zdCBuaSA9IHRoaXMuI25leHRbaW5kZXhdIGFzIG51bWJlclxuICAgICAgICAgICAgdGhpcy4jcHJldltuaV0gPSB0aGlzLiNwcmV2W2luZGV4XSBhcyBudW1iZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy4jc2l6ZS0tXG4gICAgICAgICAgdGhpcy4jZnJlZS5wdXNoKGluZGV4KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIgJiYgdGhpcy4jZGlzcG9zZWQ/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgZHQgPSB0aGlzLiNkaXNwb3NlZFxuICAgICAgbGV0IHRhc2s6IERpc3Bvc2VUYXNrPEssIFY+IHwgdW5kZWZpbmVkXG4gICAgICB3aGlsZSAoKHRhc2sgPSBkdD8uc2hpZnQoKSkpIHtcbiAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyPy4oLi4udGFzaylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlbGV0ZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgY2FjaGUgZW50aXJlbHksIHRocm93aW5nIGF3YXkgYWxsIHZhbHVlcy5cbiAgICovXG4gIGNsZWFyKCkge1xuICAgIHJldHVybiB0aGlzLiNjbGVhcignZGVsZXRlJylcbiAgfVxuICAjY2xlYXIocmVhc29uOiBMUlVDYWNoZS5EaXNwb3NlUmVhc29uKSB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiB0aGlzLiNyaW5kZXhlcyh7IGFsbG93U3RhbGU6IHRydWUgfSkpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2luZGV4XVxuICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgIHYuX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdkZWxldGVkJykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBrID0gdGhpcy4ja2V5TGlzdFtpbmRleF1cbiAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICB0aGlzLiNkaXNwb3NlPy4odiBhcyBWLCBrIGFzIEssIHJlYXNvbilcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgdGhpcy4jZGlzcG9zZWQ/LnB1c2goW3YgYXMgViwgayBhcyBLLCByZWFzb25dKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy4ja2V5TWFwLmNsZWFyKClcbiAgICB0aGlzLiN2YWxMaXN0LmZpbGwodW5kZWZpbmVkKVxuICAgIHRoaXMuI2tleUxpc3QuZmlsbCh1bmRlZmluZWQpXG4gICAgaWYgKHRoaXMuI3R0bHMgJiYgdGhpcy4jc3RhcnRzKSB7XG4gICAgICB0aGlzLiN0dGxzLmZpbGwoMClcbiAgICAgIHRoaXMuI3N0YXJ0cy5maWxsKDApXG4gICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy4jYXV0b3B1cmdlVGltZXJzID8/IFtdKSB7XG4gICAgICAgIGlmICh0ICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0KVxuICAgICAgfVxuICAgICAgdGhpcy4jYXV0b3B1cmdlVGltZXJzPy5maWxsKHVuZGVmaW5lZClcbiAgICB9XG4gICAgaWYgKHRoaXMuI3NpemVzKSB7XG4gICAgICB0aGlzLiNzaXplcy5maWxsKDApXG4gICAgfVxuICAgIHRoaXMuI2hlYWQgPSAwIGFzIEluZGV4XG4gICAgdGhpcy4jdGFpbCA9IDAgYXMgSW5kZXhcbiAgICB0aGlzLiNmcmVlLmxlbmd0aCA9IDBcbiAgICB0aGlzLiNjYWxjdWxhdGVkU2l6ZSA9IDBcbiAgICB0aGlzLiNzaXplID0gMFxuICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIgJiYgdGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgIGNvbnN0IGR0ID0gdGhpcy4jZGlzcG9zZWRcbiAgICAgIGxldCB0YXNrOiBEaXNwb3NlVGFzazxLLCBWPiB8IHVuZGVmaW5lZFxuICAgICAgd2hpbGUgKCh0YXNrID0gZHQ/LnNoaWZ0KCkpKSB7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlcj8uKC4uLnRhc2spXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gXCJscnUtY2FjaGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FjaGVkTWFwPEsgZXh0ZW5kcyB7fSwgViBleHRlbmRzIHt9PiBpbXBsZW1lbnRzIE1hcDxLLCBWPiB7XG4gICAgcmVhZG9ubHkgY2FjaGU6IExSVUNhY2hlPEssIFY+O1xuICAgIHJlYWRvbmx5IG1hcDogTWFwPEssIFY+ID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgY2FjaGVTaXplOiBudW1iZXIgfSkge1xuICAgICAgICB0aGlzLmNhY2hlID0gbmV3IExSVUNhY2hlPEssIFY+KHtcbiAgICAgICAgICAgIG1heDogb3B0aW9ucy5jYWNoZVNpemUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1hcCA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgZ2V0IFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBbU3ltYm9sLml0ZXJhdG9yXTtcbiAgICB9XG4gICAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBbU3ltYm9sLnRvU3RyaW5nVGFnXTtcbiAgICB9XG4gICAgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmNsZWFyKCk7XG4gICAgfVxuICAgIGRlbGV0ZShrZXk6IEspOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGVsZXRlZCA9IHRoaXMubWFwLmRlbGV0ZShrZXkpO1xuICAgICAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsZXRlZDtcbiAgICB9XG4gICAgZ2V0IGZvckVhY2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5mb3JFYWNoO1xuICAgIH1cbiAgICBnZXQoa2V5OiBLKTogViB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IGNhY2hlZFZhbHVlID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGNhY2hlZFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChrZXkpO1xuICAgIH1cbiAgICBoYXMoa2V5OiBLKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5oYXMoa2V5KTtcbiAgICB9XG4gICAgc2V0KGtleTogSywgdmFsdWU6IFYpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5tYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB0aGlzLmNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuc2l6ZTtcbiAgICB9XG4gICAgZW50cmllcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmVudHJpZXMoKTtcbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmtleXMoKTtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAudmFsdWVzKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ2FjaGVkTWFwIH0gZnJvbSBcIi4uLy4uL2NsYXNzZXNcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi8uLi91dGlscy9sb2ctdXRpbGl0eVwiO1xuaW1wb3J0IExhYmVsIGZyb20gXCIuLi9jbGFzc2VzL0xhYmVsXCI7XG5pbXBvcnQgTGFiZWxBYnN0cmFjdCBmcm9tIFwiLi4vY2xhc3Nlcy9MYWJlbEFic3RyYWN0XCI7XG5pbXBvcnQgeyBMYWJlbElkVHlwZSB9IGZyb20gXCIuLi90eXBlcy9MYWJlbElkVHlwZVwiO1xuXG4vKipcbiAqIEEgTWFwIHRoYXQgY29udGFpbnMgYWxsIGxhYmVscyByZWdpc3RlcmVkIGFuZCBhdmFpbGFibGUgdG8gYmUgdXNlZC5cbiAqIFRoZSBrZXkgaXMgdGhlIGlkIG9mIHRoZSBsYWJlbCBhbmQgdGhlIHZhbHVlIGlzIHRoZSBsYWJlbCBpdHNlbGYuXG4gKi9cbmNvbnN0IHJlZ2lzdGVyZWRMYWJlbHMgPSBuZXcgQ2FjaGVkTWFwPExhYmVsSWRUeXBlLCBMYWJlbEFic3RyYWN0PGFueT4gfCBMYWJlbDxhbnk+Pih7IGNhY2hlU2l6ZTogMTAgfSk7XG5cbm5hbWVzcGFjZSBSZWdpc3RlcmVkTGFiZWxzIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIGEgbGFiZWwgYnkgaXRzIGlkXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgbGFiZWxcbiAgICAgKiBAcmV0dXJucyBUaGUgbGFiZWwgb3IgdW5kZWZpbmVkIGlmIGl0IGRvZXMgbm90IGV4aXN0XG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldDxUID0gTGFiZWxBYnN0cmFjdDxhbnk+PihpZDogTGFiZWxJZFR5cGUpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IGxhYmVsID0gcmVnaXN0ZXJlZExhYmVscy5nZXQoaWQpO1xuICAgICAgICBpZiAoIWxhYmVsKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYExhYmVsIFwiJHtpZH1cIiBub3QgZm91bmRgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFiZWwgYXMgVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlcyBhIGxhYmVsIGluIHRoZSBzeXN0ZW1cbiAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIGJlIHNhdmVkXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGFkZChsYWJlbDogTGFiZWxBYnN0cmFjdDxhbnksIGFueT4gfCBMYWJlbEFic3RyYWN0PGFueSwgYW55PltdKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxhYmVsKSkge1xuICAgICAgICAgICAgbGFiZWwuZm9yRWFjaCgobCkgPT4gYWRkKGwpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVnaXN0ZXJlZExhYmVscy5oYXMobGFiZWwuaWQpKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgTGFiZWwgXCIke2xhYmVsLmlkfVwiIGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVnaXN0ZXJlZExhYmVscy5zZXQobGFiZWwuaWQsIGxhYmVsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBsaXN0IG9mIGFsbCBsYWJlbHMgcmVnaXN0ZXJlZC5cbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBsYWJlbHMuXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHZhbHVlcygpOiBMYWJlbEFic3RyYWN0PGFueT5bXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHJlZ2lzdGVyZWRMYWJlbHMudmFsdWVzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgbGFiZWwgaXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIGxhYmVsXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgbGFiZWwgaXMgcmVnaXN0ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGhhcyhpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiByZWdpc3RlcmVkTGFiZWxzLmhhcyhpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGlzdCBvZiBhbGwgbGFiZWwgaWRzIHJlZ2lzdGVyZWQuXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgbGFiZWwgaWRzLlxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBrZXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocmVnaXN0ZXJlZExhYmVscy5rZXlzKCkpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IFJlZ2lzdGVyZWRMYWJlbHM7XG4iLCJpbXBvcnQgeyBHYW1lVW5pZmllciwgUGl4aUVycm9yIH0gZnJvbSBcIkBkcmluY3MvcGl4aS12bi9jb3JlXCI7XG5pbXBvcnQgeyBMYWJlbEFic3RyYWN0IH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMgfSBmcm9tIFwiLi4vc3RvcmFnZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nLXV0aWxpdHlcIjtcbmltcG9ydCBMYWJlbCBmcm9tIFwiLi9jbGFzc2VzL0xhYmVsXCI7XG5pbXBvcnQgUmVnaXN0ZXJlZExhYmVscyBmcm9tIFwiLi9kZWNvcmF0b3JzL1JlZ2lzdGVyZWRMYWJlbHNcIjtcbmltcG9ydCBIaXN0b3J5U3RlcCBmcm9tIFwiLi9pbnRlcmZhY2VzL0hpc3RvcnlTdGVwXCI7XG5pbXBvcnQgT3BlbmVkTGFiZWwgZnJvbSBcIi4vaW50ZXJmYWNlcy9PcGVuZWRMYWJlbFwiO1xuaW1wb3J0IENob2ljZXNNYWRlVHlwZSBmcm9tIFwiLi90eXBlcy9DaG9pY2VzTWFkZVR5cGVcIjtcbmltcG9ydCB7IExhYmVsSWRUeXBlIH0gZnJvbSBcIi4vdHlwZXMvTGFiZWxJZFR5cGVcIjtcblxudHlwZSBBbGxPcGVuZWRMYWJlbHNUeXBlID0geyBba2V5OiBMYWJlbElkVHlwZV06IHsgYmlnZ2VzdFN0ZXA6IG51bWJlcjsgb3BlbkNvdW50OiBudW1iZXIgfSB9O1xuXG50eXBlIEN1cnJlbnRTdGVwVGltZXNDb3VudGVyTWVtb3R5RGF0YSA9IHtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Ugc3RlcEluZGV4c1xuICAgICAqL1xuICAgIGxhc3RTdGVwSW5kZXhzPzogbnVtYmVyW107XG4gICAgc3RlcENvdW50ZXJzPzogbnVtYmVyW107XG4gICAgdXNlZFJhbmRvbU51bWJlcnM/OiB7IFttaW5tYXhrZXk6IHN0cmluZ106IG51bWJlcltdIH07XG4gICAgc3RlcFNoYTE6IHN0cmluZztcbn07XG50eXBlIEN1cnJlbnRTdGVwVGltZXNDb3VudGVyTWVtb3R5ID0ge1xuICAgIFtrZXk6IExhYmVsSWRUeXBlXToge1xuICAgICAgICBba2V5OiBzdHJpbmddOiBDdXJyZW50U3RlcFRpbWVzQ291bnRlck1lbW90eURhdGE7XG4gICAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMge1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHN0YXRpYyBjaG9pY2VNYWRlVGVtcDogdW5kZWZpbmVkIHwgbnVtYmVyID0gdW5kZWZpbmVkO1xuICAgIHN0YXRpYyBsYXN0SGlzdG9yeVN0ZXA6IE9taXQ8SGlzdG9yeVN0ZXAsIFwiZGlmZlwiPiB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIGlzIGEgbGlzdCBvZiBhbGwgbGFiZWxzIHRoYXQgaGF2ZSBiZWVuIG9wZW5lZCBkdXJpbmcgdGhlIHByb2dyZXNzaW9uIG9mIHRoZSBzdGVwcy5cbiAgICAgKiB0aGUga2V5IGlzIHRoZSBsYWJlbCBpZCBhbmQgdGhlIGJpZ2dlc3Qgc3RlcCBvcGVuZWQuXG4gICAgICovXG4gICAgc3RhdGljIGdldCBhbGxPcGVuZWRMYWJlbHMoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBHYW1lVW5pZmllci5nZXRWYXJpYWJsZTxBbGxPcGVuZWRMYWJlbHNUeXBlPihTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLk9QRU5FRF9MQUJFTFNfQ09VTlRFUl9LRVkpIHx8IHt9XG4gICAgICAgICk7XG4gICAgfVxuICAgIHN0YXRpYyBzZXQgYWxsT3BlbmVkTGFiZWxzKHZhbHVlOiBBbGxPcGVuZWRMYWJlbHNUeXBlKSB7XG4gICAgICAgIEdhbWVVbmlmaWVyLnNldFZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuT1BFTkVEX0xBQkVMU19DT1VOVEVSX0tFWSwgdmFsdWUpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Q3VycmVudFN0ZXBUaW1lc0NvdW50ZXJEYXRhKG5lc3RlZElkOiBzdHJpbmcgPSBcIlwiKTogQ3VycmVudFN0ZXBUaW1lc0NvdW50ZXJNZW1vdHlEYXRhIHwgbnVsbCB7XG4gICAgICAgIGxldCBjdXJyZW50TGFiZWxTdGVwSW5kZXggPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmN1cnJlbnRMYWJlbFN0ZXBJbmRleDtcbiAgICAgICAgaWYgKGN1cnJlbnRMYWJlbFN0ZXBJbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiY3VycmVudExhYmVsU3RlcEluZGV4IGlzIG51bGxcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3VycmVudExhYmVsU3RlcEluZGV4SWQgPSBgJHtjdXJyZW50TGFiZWxTdGVwSW5kZXh9JHtuZXN0ZWRJZH1gO1xuICAgICAgICBsZXQgbGFiZWxJZCA9IE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuY3VycmVudExhYmVsSWQ7XG4gICAgICAgIGxldCBjdXJyZW50TGFiZWwgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLl9jdXJyZW50TGFiZWw7XG4gICAgICAgIGlmICghbGFiZWxJZCB8fCBjdXJyZW50TGFiZWxTdGVwSW5kZXggPT09IG51bGwgfHwgIWN1cnJlbnRMYWJlbCkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiY3VycmVudExhYmVsSWQgb3IgY3VycmVudExhYmVsU3RlcEluZGV4IGlzIG51bGwgb3IgY3VycmVudExhYmVsIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGVwU2hhMSA9IGN1cnJlbnRMYWJlbC5nZXRTdGVwU2hhKGN1cnJlbnRMYWJlbFN0ZXBJbmRleCkgfHwgXCJlcnJvclwiO1xuICAgICAgICBsZXQgb2JqID1cbiAgICAgICAgICAgIEdhbWVVbmlmaWVyLmdldFZhcmlhYmxlPEN1cnJlbnRTdGVwVGltZXNDb3VudGVyTWVtb3R5PihcbiAgICAgICAgICAgICAgICBTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfU1RFUF9USU1FU19DT1VOVEVSX0tFWSxcbiAgICAgICAgICAgICkgfHwge307XG4gICAgICAgIGlmICghb2JqW2xhYmVsSWRdKSB7XG4gICAgICAgICAgICBvYmpbbGFiZWxJZF0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9ialtsYWJlbElkXVtjdXJyZW50TGFiZWxTdGVwSW5kZXhJZF0gfHwgb2JqW2xhYmVsSWRdW2N1cnJlbnRMYWJlbFN0ZXBJbmRleElkXS5zdGVwU2hhMSAhPSBzdGVwU2hhMSkge1xuICAgICAgICAgICAgb2JqW2xhYmVsSWRdW2N1cnJlbnRMYWJlbFN0ZXBJbmRleElkXSA9IHsgc3RlcFNoYTE6IHN0ZXBTaGExIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9ialtsYWJlbElkXVtjdXJyZW50TGFiZWxTdGVwSW5kZXhJZF07XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIHNldEN1cnJlbnRTdGVwVGltZXNDb3VudGVyRGF0YShuZXN0ZWRJZDogc3RyaW5nID0gXCJcIiwgZGF0YTogQ3VycmVudFN0ZXBUaW1lc0NvdW50ZXJNZW1vdHlEYXRhKSB7XG4gICAgICAgIGxldCBjdXJyZW50TGFiZWxTdGVwSW5kZXggPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmN1cnJlbnRMYWJlbFN0ZXBJbmRleDtcbiAgICAgICAgbGV0IGN1cnJlbnRMYWJlbFN0ZXBJbmRleElkID0gY3VycmVudExhYmVsU3RlcEluZGV4ICsgbmVzdGVkSWQ7XG4gICAgICAgIGxldCBsYWJlbElkID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5jdXJyZW50TGFiZWxJZDtcbiAgICAgICAgaWYgKCFsYWJlbElkIHx8IGN1cnJlbnRMYWJlbFN0ZXBJbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiY3VycmVudExhYmVsSWQgb3IgY3VycmVudExhYmVsU3RlcEluZGV4IGlzIG51bGxcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9iaiA9XG4gICAgICAgICAgICBHYW1lVW5pZmllci5nZXRWYXJpYWJsZTxDdXJyZW50U3RlcFRpbWVzQ291bnRlck1lbW90eT4oXG4gICAgICAgICAgICAgICAgU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5DVVJSRU5UX1NURVBfVElNRVNfQ09VTlRFUl9LRVksXG4gICAgICAgICAgICApIHx8IHt9O1xuICAgICAgICBpZiAoIW9ialtsYWJlbElkXSkge1xuICAgICAgICAgICAgb2JqW2xhYmVsSWRdID0ge307XG4gICAgICAgIH1cbiAgICAgICAgb2JqW2xhYmVsSWRdW2N1cnJlbnRMYWJlbFN0ZXBJbmRleElkXSA9IGRhdGE7XG4gICAgICAgIEdhbWVVbmlmaWVyLnNldFZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9TVEVQX1RJTUVTX0NPVU5URVJfS0VZLCBvYmopO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Q3VycmVudFN0ZXBUaW1lc0NvdW50ZXIobmVzdGVkSWQ6IHN0cmluZyA9IFwiXCIpOiBudW1iZXIge1xuICAgICAgICBsZXQgbGFzdFN0ZXAgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLl9zdGVwQ291bnRlcjtcbiAgICAgICAgbGV0IG9iaiA9IE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuZ2V0Q3VycmVudFN0ZXBUaW1lc0NvdW50ZXJEYXRhKG5lc3RlZElkKTtcbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcImdldEN1cnJlbnRTdGVwVGltZXNDb3VudGVyIG9iaiBpcyBudWxsXCIpO1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxpc3QgPSBvYmouc3RlcENvdW50ZXJzIHx8IG9iai5sYXN0U3RlcEluZGV4cyB8fCBbXTtcbiAgICAgICAgbGV0IGxpc3RDb250YWluTGFzdFN0ZXAgPSBsaXN0LmZpbmQoKGl0ZW0pID0+IGl0ZW0gPT09IGxhc3RTdGVwKTtcbiAgICAgICAgaWYgKCFsaXN0Q29udGFpbkxhc3RTdGVwKSB7XG4gICAgICAgICAgICBsaXN0LnB1c2gobGFzdFN0ZXApO1xuICAgICAgICAgICAgZGVsZXRlIG9iai5sYXN0U3RlcEluZGV4cztcbiAgICAgICAgICAgIG9iai5zdGVwQ291bnRlcnMgPSBsaXN0O1xuICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5zZXRDdXJyZW50U3RlcFRpbWVzQ291bnRlckRhdGEobmVzdGVkSWQsIG9iaik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpc3QubGVuZ3RoO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0UmFuZG9tTnVtYmVyKFxuICAgICAgICBtaW46IG51bWJlcixcbiAgICAgICAgbWF4OiBudW1iZXIsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIG9uY2VPbmx5PzogYm9vbGVhbjtcbiAgICAgICAgICAgIG5lc3RlZElkPzogc3RyaW5nO1xuICAgICAgICB9ID0ge30sXG4gICAgKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IG5lc3RlZElkID0gb3B0aW9ucy5uZXN0ZWRJZCB8fCBcIlwiO1xuICAgICAgICBsZXQgb25jZW9ubHkgPSBvcHRpb25zLm9uY2VPbmx5IHx8IGZhbHNlO1xuICAgICAgICBpZiAob25jZW9ubHkpIHtcbiAgICAgICAgICAgIGxldCBvYmogPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmdldEN1cnJlbnRTdGVwVGltZXNDb3VudGVyRGF0YShuZXN0ZWRJZCk7XG4gICAgICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdXNlZFJhbmRvbU51bWJlcnMgPSBvYmoudXNlZFJhbmRvbU51bWJlcnMgfHwge307XG4gICAgICAgICAgICAvLyBnZXQgYSByYW5kb20gbnVtYmVyIGJldHdlZW4gbWluIGFuZCBtYXggYW5kIG5vdCBpbiB0aGUgdXNlZFJhbmRvbU51bWJlcnMsIGlmIGFsbCBudW1iZXJzIGFyZSBpbiB0aGUgdXNlZFJhbmRvbU51bWJlcnMsIHJldHVybiBudWxsXG4gICAgICAgICAgICBsZXQgYWxsTnVtYmVycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IG1heCAtIG1pbiArIDEgfSwgKF8sIGkpID0+IGkgKyBtaW4pLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoaXRlbSkgPT4gIXVzZWRSYW5kb21OdW1iZXJzW2Ake21pbn0tJHttYXh9YF0/LmluY2x1ZGVzKGl0ZW0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChhbGxOdW1iZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhbGxOdW1iZXJzLmxlbmd0aCk7XG4gICAgICAgICAgICBsZXQgcmFuZG9tTnVtYmVyID0gYWxsTnVtYmVyc1tyYW5kb21JbmRleF07XG4gICAgICAgICAgICBpZiAoIXVzZWRSYW5kb21OdW1iZXJzW2Ake21pbn0tJHttYXh9YF0pIHtcbiAgICAgICAgICAgICAgICB1c2VkUmFuZG9tTnVtYmVyc1tgJHttaW59LSR7bWF4fWBdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1c2VkUmFuZG9tTnVtYmVyc1tgJHttaW59LSR7bWF4fWBdLnB1c2gocmFuZG9tTnVtYmVyKTtcbiAgICAgICAgICAgIG9iai51c2VkUmFuZG9tTnVtYmVycyA9IHVzZWRSYW5kb21OdW1iZXJzO1xuICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5zZXRDdXJyZW50U3RlcFRpbWVzQ291bnRlckRhdGEobmVzdGVkSWQsIG9iaik7XG4gICAgICAgICAgICByZXR1cm4gcmFuZG9tTnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluO1xuICAgIH1cbiAgICBzdGF0aWMgcmVzZXRDdXJyZW50U3RlcFRpbWVzQ291bnRlcihuZXN0ZWRJZDogc3RyaW5nID0gXCJcIikge1xuICAgICAgICBsZXQgY3VycmVudExhYmVsU3RlcEluZGV4ID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5jdXJyZW50TGFiZWxTdGVwSW5kZXg7XG4gICAgICAgIGxldCBjdXJyZW50TGFiZWxTdGVwSW5kZXhJZCA9IGN1cnJlbnRMYWJlbFN0ZXBJbmRleCArIG5lc3RlZElkO1xuICAgICAgICBsZXQgbGFiZWxJZCA9IE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuY3VycmVudExhYmVsSWQ7XG4gICAgICAgIGlmICghbGFiZWxJZCB8fCBjdXJyZW50TGFiZWxTdGVwSW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcImN1cnJlbnRMYWJlbElkIG9yIGN1cnJlbnRMYWJlbFN0ZXBJbmRleCBpcyBudWxsXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvYmogPVxuICAgICAgICAgICAgR2FtZVVuaWZpZXIuZ2V0VmFyaWFibGU8Q3VycmVudFN0ZXBUaW1lc0NvdW50ZXJNZW1vdHk+KFxuICAgICAgICAgICAgICAgIFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9TVEVQX1RJTUVTX0NPVU5URVJfS0VZLFxuICAgICAgICAgICAgKSB8fCB7fTtcbiAgICAgICAgaWYgKCFvYmpbbGFiZWxJZF0pIHtcbiAgICAgICAgICAgIG9ialtsYWJlbElkXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIG9ialtsYWJlbElkXVtjdXJyZW50TGFiZWxTdGVwSW5kZXhJZF0gPSB7IHN0ZXBDb3VudGVyczogW10sIHN0ZXBTaGExOiBcIlwiIH07XG4gICAgICAgIEdhbWVVbmlmaWVyLnNldFZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9TVEVQX1RJTUVTX0NPVU5URVJfS0VZLCBvYmopO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBpcyBhIGxpc3Qgb2YgYWxsIGNob2ljZXMgbWFkZSBieSB0aGUgcGxheWVyIGR1cmluZyB0aGUgcHJvZ3Jlc3Npb24gb2YgdGhlIHN0ZXBzLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgYWxsQ2hvaWNlc01hZGUoKSB7XG4gICAgICAgIHJldHVybiBHYW1lVW5pZmllci5nZXRWYXJpYWJsZTxDaG9pY2VzTWFkZVR5cGVbXT4oU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5BTExfQ0hPSUNFU19NQURFX0tFWSkgfHwgW107XG4gICAgfVxuICAgIHN0YXRpYyBzZXQgYWxsQ2hvaWNlc01hZGUodmFsdWU6IENob2ljZXNNYWRlVHlwZVtdKSB7XG4gICAgICAgIEdhbWVVbmlmaWVyLnNldFZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQUxMX0NIT0lDRVNfTUFERV9LRVksIHZhbHVlKTtcbiAgICB9XG4gICAgc3RhdGljIF9zdGVwQ291bnRlcjogbnVtYmVyID0gMDtcbiAgICAvKipcbiAgICAgKiBJbmNyZWFzZSB0aGUgbGFzdCBzdGVwIGluZGV4IHRoYXQgb2NjdXJyZWQgZHVyaW5nIHRoZSBwcm9ncmVzc2lvbiBvZiB0aGUgc3RlcHMuXG4gICAgICovXG4gICAgc3RhdGljIGluY3JlYXNlU3RlcENvdW50ZXIoKSB7XG4gICAgICAgIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX3N0ZXBDb3VudGVyKys7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIF9vcGVuZWRMYWJlbHM6IE9wZW5lZExhYmVsW10gPSBbXTtcbiAgICBzdGF0aWMgZ2V0IG9wZW5lZExhYmVscygpOiBPcGVuZWRMYWJlbFtdIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50KE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29wZW5lZExhYmVscyk7XG4gICAgfVxuICAgIHN0YXRpYyBzZXQgb3BlbmVkTGFiZWxzKHZhbHVlOiBPcGVuZWRMYWJlbFtdKSB7XG4gICAgICAgIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29wZW5lZExhYmVscyA9IGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50KHZhbHVlKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgX29yaWdpbmFsT3BlbmVkTGFiZWxzOiBPcGVuZWRMYWJlbFtdID0gW107XG4gICAgc3RhdGljIGdldCBvcmlnaW5hbE9wZW5lZExhYmVscygpOiBPcGVuZWRMYWJlbFtdIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50KE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29yaWdpbmFsT3BlbmVkTGFiZWxzKTtcbiAgICB9XG4gICAgc3RhdGljIHNldCBvcmlnaW5hbE9wZW5lZExhYmVscyh2YWx1ZTogT3BlbmVkTGFiZWxbXSkge1xuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLl9vcmlnaW5hbE9wZW5lZExhYmVscyA9IGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50KHZhbHVlKTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBfY3VycmVudExhYmVsKCk6IExhYmVsIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuY3VycmVudExhYmVsSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSZWdpc3RlcmVkTGFiZWxzLmdldChOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmN1cnJlbnRMYWJlbElkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBjdXJyZW50TGFiZWxJZCBpcyB0aGUgY3VycmVudCBsYWJlbCBpZCB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgcHJvZ3Jlc3Npb24gb2YgdGhlIHN0ZXBzLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgY3VycmVudExhYmVsSWQoKTogTGFiZWxJZFR5cGUgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fb3BlbmVkTGFiZWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fb3BlbmVkTGFiZWxzW05hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29wZW5lZExhYmVscy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLmxhYmVsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgY3VycmVudExhYmVsU3RlcEluZGV4KCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBpZiAoTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fb3BlbmVkTGFiZWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fb3BlbmVkTGFiZWxzW05hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29wZW5lZExhYmVscy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLmN1cnJlbnRTdGVwSW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyogRWRpdCBIaXN0b3J5IE1ldGhvZHMgKi9cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGxhYmVsIHRvIHRoZSBoaXN0b3J5LlxuICAgICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdG8gYWRkIHRvIHRoZSBoaXN0b3J5LlxuICAgICAqIEBwYXJhbSBzdGVwSW5kZXggVGhlIHN0ZXAgaW5kZXggb2YgdGhlIGxhYmVsLlxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRMYWJlbEhpc3RvcnkobGFiZWw6IExhYmVsSWRUeXBlLCBzdGVwSW5kZXg6IG51bWJlcikge1xuICAgICAgICBsZXQgYWxsT3BlbmVkTGFiZWxzID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hbGxPcGVuZWRMYWJlbHM7XG4gICAgICAgIGxldCBvbGRTdGVwSW5kZXggPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmFsbE9wZW5lZExhYmVsc1tsYWJlbF0/LmJpZ2dlc3RTdGVwIHx8IDA7XG4gICAgICAgIGxldCBvcGVuQ291bnQgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmFsbE9wZW5lZExhYmVsc1tsYWJlbF0/Lm9wZW5Db3VudCB8fCAwO1xuICAgICAgICBpZiAoIW9sZFN0ZXBJbmRleCB8fCBvbGRTdGVwSW5kZXggPCBzdGVwSW5kZXgpIHtcbiAgICAgICAgICAgIGFsbE9wZW5lZExhYmVsc1tsYWJlbF0gPSB7IGJpZ2dlc3RTdGVwOiBzdGVwSW5kZXgsIG9wZW5Db3VudDogb3BlbkNvdW50IH07XG4gICAgICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmFsbE9wZW5lZExhYmVscyA9IGFsbE9wZW5lZExhYmVscztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYWRkQ2hvaWNlc01hZGUobGFiZWw6IExhYmVsSWRUeXBlLCBzdGVwSW5kZXg6IG51bWJlciwgc3RlcFNoYTogc3RyaW5nLCBjaG9pY2VNYWRlOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGFsbENob2ljZXNNYWRlID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hbGxDaG9pY2VzTWFkZTtcbiAgICAgICAgbGV0IGFscmVkeU1hZGUgPSBhbGxDaG9pY2VzTWFkZS5maW5kSW5kZXgoXG4gICAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICBpdGVtLmxhYmVsSWQgPT09IGxhYmVsICYmXG4gICAgICAgICAgICAgICAgaXRlbS5zdGVwSW5kZXggPT09IHN0ZXBJbmRleCAmJlxuICAgICAgICAgICAgICAgIGl0ZW0uY2hvaWNlSW5kZXggPT09IGNob2ljZU1hZGUgJiZcbiAgICAgICAgICAgICAgICBpdGVtLnN0ZXBTaGExID09PSBzdGVwU2hhLFxuICAgICAgICApO1xuICAgICAgICBpZiAoYWxyZWR5TWFkZSA8IDApIHtcbiAgICAgICAgICAgIGFsbENob2ljZXNNYWRlLnB1c2goe1xuICAgICAgICAgICAgICAgIGxhYmVsSWQ6IGxhYmVsLFxuICAgICAgICAgICAgICAgIHN0ZXBJbmRleDogc3RlcEluZGV4LFxuICAgICAgICAgICAgICAgIGNob2ljZUluZGV4OiBjaG9pY2VNYWRlLFxuICAgICAgICAgICAgICAgIHN0ZXBTaGExOiBzdGVwU2hhLFxuICAgICAgICAgICAgICAgIG1hZGVUaW1lczogMSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWxsQ2hvaWNlc01hZGVbYWxyZWR5TWFkZV0ubWFkZVRpbWVzKys7XG4gICAgICAgIH1cbiAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hbGxDaG9pY2VzTWFkZSA9IGFsbENob2ljZXNNYWRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBsYWJlbCB0byB0aGUgaGlzdG9yeS5cbiAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIGFkZCB0byB0aGUgaGlzdG9yeS5cbiAgICAgKi9cbiAgICBzdGF0aWMgcHVzaE5ld0xhYmVsKGxhYmVsOiBMYWJlbElkVHlwZSkge1xuICAgICAgICBsZXQgY3VycmVudExhYmVsID0gUmVnaXN0ZXJlZExhYmVscy5nZXQobGFiZWwpO1xuICAgICAgICBpZiAoIWN1cnJlbnRMYWJlbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFBpeGlFcnJvcihcInVucmVnaXN0ZXJlZF9lbGVtZW50XCIsIGBMYWJlbCAke2xhYmVsfSBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLl9vcGVuZWRMYWJlbHMucHVzaCh7XG4gICAgICAgICAgICBsYWJlbDogbGFiZWwsXG4gICAgICAgICAgICBjdXJyZW50U3RlcEluZGV4OiAwLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGFsbE9wZW5lZExhYmVscyA9IE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuYWxsT3BlbmVkTGFiZWxzO1xuICAgICAgICBsZXQgYmlnZ2VzdFN0ZXAgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmFsbE9wZW5lZExhYmVsc1tsYWJlbF0/LmJpZ2dlc3RTdGVwIHx8IDA7XG4gICAgICAgIGxldCBvcGVuQ291bnQgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmFsbE9wZW5lZExhYmVsc1tsYWJlbF0/Lm9wZW5Db3VudCB8fCAwO1xuICAgICAgICBhbGxPcGVuZWRMYWJlbHNbbGFiZWxdID0geyBiaWdnZXN0U3RlcDogYmlnZ2VzdFN0ZXAsIG9wZW5Db3VudDogb3BlbkNvdW50ICsgMSB9O1xuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmFsbE9wZW5lZExhYmVscyA9IGFsbE9wZW5lZExhYmVscztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5jcmVhc2UgdGhlIGN1cnJlbnQgc3RlcCBpbmRleCBvZiB0aGUgY3VycmVudCBsYWJlbC5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW5jcmVhc2VDdXJyZW50U3RlcEluZGV4KCkge1xuICAgICAgICBpZiAoTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fb3BlbmVkTGFiZWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fb3BlbmVkTGFiZWxzW05hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29wZW5lZExhYmVscy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29wZW5lZExhYmVsc1tOYXJyYXRpb25NYW5hZ2VyU3RhdGljLl9vcGVuZWRMYWJlbHMubGVuZ3RoIC0gMV0gPSB7XG4gICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICBjdXJyZW50U3RlcEluZGV4OiBpdGVtLmN1cnJlbnRTdGVwSW5kZXggKyAxLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9vblN0ZXBTdGFydD86IChzdGVwSWQ6IG51bWJlciwgbGFiZWw6IExhYmVsQWJzdHJhY3Q8YW55PikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gICAgc3RhdGljIHNldCBvblN0ZXBTdGFydCh2YWx1ZTogKHN0ZXBJZDogbnVtYmVyLCBsYWJlbDogTGFiZWxBYnN0cmFjdDxhbnk+KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikge1xuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLl9vblN0ZXBTdGFydCA9IHZhbHVlO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IG9uU3RlcFN0YXJ0KCk6ICgoc3RlcElkOiBudW1iZXIsIGxhYmVsOiBMYWJlbEFic3RyYWN0PGFueT4pID0+IFByb21pc2U8dm9pZFtdPikgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gYXN5bmMgKHN0ZXBJZDogbnVtYmVyLCBsYWJlbDogTGFiZWxBYnN0cmFjdDxhbnk+KSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzOiAoUHJvbWlzZTx2b2lkPiB8IHZvaWQpW10gPSBbXTtcbiAgICAgICAgICAgIGlmIChOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9uTG9hZGluZ0xhYmVsICYmIHN0ZXBJZCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMub25Mb2FkaW5nTGFiZWwoc3RlcElkLCBsYWJlbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29uU3RlcFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fb25TdGVwU3RhcnQoc3RlcElkLCBsYWJlbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKHJlcyk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHN0YXRpYyBvbkxvYWRpbmdMYWJlbD86IChzdGVwSWQ6IG51bWJlciwgbGFiZWw6IExhYmVsQWJzdHJhY3Q8YW55PikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gICAgc3RhdGljIG9uU3RlcEVuZD86IChzdGVwSWQ6IG51bWJlciwgbGFiZWw6IExhYmVsQWJzdHJhY3Q8YW55PikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG4iLCJpbXBvcnQgeyBDaGFyYWN0ZXJJbnRlcmZhY2UsIERpYWxvZ3VlSW50ZXJmYWNlIH0gZnJvbSBcIkBkcmluY3MvcGl4aS12blwiO1xuaW1wb3J0IHsgR2FtZVVuaWZpZXIsIFBpeGlFcnJvciB9IGZyb20gXCJAZHJpbmNzL3BpeGktdm4vY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlRWxlbWVudFR5cGUgfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUyB9IGZyb20gXCIuLi9zdG9yYWdlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgY3JlYXRlRXhwb3J0YWJsZUVsZW1lbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi91dGlscy9sb2ctdXRpbGl0eVwiO1xuaW1wb3J0IExhYmVsQWJzdHJhY3QgZnJvbSBcIi4vY2xhc3Nlcy9MYWJlbEFic3RyYWN0XCI7XG5pbXBvcnQgUmVnaXN0ZXJlZExhYmVscyBmcm9tIFwiLi9kZWNvcmF0b3JzL1JlZ2lzdGVyZWRMYWJlbHNcIjtcbmltcG9ydCB7IFN0b3JlZERpYWxvZ3VlIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9EaWFsb2d1ZUludGVyZmFjZVwiO1xuaW1wb3J0IEhpc3RvcnlTdGVwLCB7IEFkZGl0aW9uYWxTaGFTcGV0c0VudW0gfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0hpc3RvcnlTdGVwXCI7XG5pbXBvcnQgTmFycmF0aW9uR2FtZVN0YXRlIGZyb20gXCIuL2ludGVyZmFjZXMvTmFycmF0aW9uR2FtZVN0YXRlXCI7XG5pbXBvcnQgTmFycmF0aW9uTWFuYWdlckludGVyZmFjZSBmcm9tIFwiLi9pbnRlcmZhY2VzL05hcnJhdGlvbk1hbmFnZXJJbnRlcmZhY2VcIjtcbmltcG9ydCBTdG9yZWRDaG9pY2VJbnRlcmZhY2UsIHsgU3RvcmVkSW5kZXhlZENob2ljZUludGVyZmFjZSB9IGZyb20gXCIuL2ludGVyZmFjZXMvU3RvcmVkQ2hvaWNlSW50ZXJmYWNlXCI7XG5pbXBvcnQgTmFycmF0aW9uTWFuYWdlclN0YXRpYyBmcm9tIFwiLi9OYXJyYXRpb25NYW5hZ2VyU3RhdGljXCI7XG5pbXBvcnQgQ2hvaWNlc01hZGVUeXBlIGZyb20gXCIuL3R5cGVzL0Nob2ljZXNNYWRlVHlwZVwiO1xuaW1wb3J0IHsgSW5wdXRJbmZvIH0gZnJvbSBcIi4vdHlwZXMvSW5wdXRJbmZvXCI7XG5pbXBvcnQgeyBMYWJlbElkVHlwZSB9IGZyb20gXCIuL3R5cGVzL0xhYmVsSWRUeXBlXCI7XG5pbXBvcnQgeyBTdGVwTGFiZWxQcm9wc1R5cGUsIFN0ZXBMYWJlbFJlc3VsdFR5cGUgfSBmcm9tIFwiLi90eXBlcy9TdGVwTGFiZWxUeXBlXCI7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyBhIGNsYXNzIHRoYXQgbWFuYWdlcyB0aGUgc3RlcHMgYW5kIGxhYmVscyBvZiB0aGUgZ2FtZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmFycmF0aW9uTWFuYWdlciBpbXBsZW1lbnRzIE5hcnJhdGlvbk1hbmFnZXJJbnRlcmZhY2Uge1xuICAgIGdldCBjdXJyZW50U3RlcFRpbWVzQ291bnRlcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5nZXRDdXJyZW50U3RlcFRpbWVzQ291bnRlcigpO1xuICAgIH1cbiAgICBzZXQgY3VycmVudFN0ZXBUaW1lc0NvdW50ZXIoXzogMCkge1xuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLnJlc2V0Q3VycmVudFN0ZXBUaW1lc0NvdW50ZXIoKTtcbiAgICB9XG4gICAgZ2V0UmFuZG9tTnVtYmVyKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgb3B0aW9uczogeyBvbmNlT25seT86IGJvb2xlYW4gfSA9IHt9KTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuZ2V0UmFuZG9tTnVtYmVyKG1pbiwgbWF4LCBvcHRpb25zKTtcbiAgICB9XG4gICAgZ2V0IHN0ZXBDb3VudGVyKCkge1xuICAgICAgICByZXR1cm4gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fc3RlcENvdW50ZXI7XG4gICAgfVxuICAgIGdldCBvcGVuZWRMYWJlbHMoKSB7XG4gICAgICAgIHJldHVybiBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9wZW5lZExhYmVscztcbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRMYWJlbCgpOiBMYWJlbEFic3RyYWN0PGFueT4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fY3VycmVudExhYmVsO1xuICAgIH1cblxuICAgIC8qIEVkaXQgSGlzdG9yeSBNZXRob2RzICovXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBsYWJlbCB0byB0aGUgaGlzdG9yeS5cbiAgICAgKiBAcGFyYW0gc3RlcFNoYSBUaGUgc2hhMSBvZiB0aGUgc3RlcC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFkZFN0ZXBIaXN0b3J5KFxuICAgICAgICBzdGVwU2hhOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGNob2ljZU1hZGU/OiBudW1iZXI7XG4gICAgICAgICAgICBpZ25vcmVTYW1lU3RlcD86IGJvb2xlYW47XG4gICAgICAgIH0gPSB7fSxcbiAgICApIHtcbiAgICAgICAgY29uc3QgeyBjaG9pY2VNYWRlLCBpZ25vcmVTYW1lU3RlcCB9ID0gb3B0aW9ucztcbiAgICAgICAgbGV0IGRpYWxvZ3VlOiBTdG9yZWREaWFsb2d1ZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNob2ljZXM6IFN0b3JlZENob2ljZUludGVyZmFjZVtdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaW5wdXRWYWx1ZTogU3RvcmFnZUVsZW1lbnRUeXBlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaXNHbHVlZCA9IEdhbWVVbmlmaWVyLmdldFZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuTEFTVF9TVEVQX0dMVUVEKSA9PT0gdGhpcy5zdGVwQ291bnRlcjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgR2FtZVVuaWZpZXIuZ2V0VmFyaWFibGU8bnVtYmVyPihTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkxBU1RfRElBTE9HVUVfQURERURfSU5fU1RFUF9NRU1PUllfS0VZKSA9PT1cbiAgICAgICAgICAgIHRoaXMuc3RlcENvdW50ZXJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBkaWFsb2d1ZSA9IEdhbWVVbmlmaWVyLmdldFZhcmlhYmxlPFN0b3JlZERpYWxvZ3VlPihcbiAgICAgICAgICAgICAgICBTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfRElBTE9HVUVfTUVNT1JZX0tFWSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgR2FtZVVuaWZpZXIuZ2V0VmFyaWFibGU8bnVtYmVyPihTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkxBU1RfTUVOVV9PUFRJT05TX0FEREVEX0lOX1NURVBfTUVNT1JZX0tFWSkgPT09XG4gICAgICAgICAgICB0aGlzLnN0ZXBDb3VudGVyXG4gICAgICAgICkge1xuICAgICAgICAgICAgY2hvaWNlcyA9IEdhbWVVbmlmaWVyLmdldFZhcmlhYmxlPGFueT4oXG4gICAgICAgICAgICAgICAgU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5DVVJSRU5UX01FTlVfT1BUSU9OU19NRU1PUllfS0VZLFxuICAgICAgICAgICAgKSBhcyBTdG9yZWRDaG9pY2VJbnRlcmZhY2VbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBHYW1lVW5pZmllci5nZXRWYXJpYWJsZTxTdG9yYWdlRWxlbWVudFR5cGU+KFxuICAgICAgICAgICAgICAgIFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuTEFTVF9JTlBVVF9BRERFRF9JTl9TVEVQX01FTU9SWV9LRVksXG4gICAgICAgICAgICApID09PSB0aGlzLnN0ZXBDb3VudGVyXG4gICAgICAgICkge1xuICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IEdhbWVVbmlmaWVyLmdldFZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9JTlBVVF9WQUxVRV9NRU1PUllfS0VZKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcGVuZWRMYWJlbHMgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9wZW5lZExhYmVscztcbiAgICAgICAgbGV0IGhpc3RvcnlJbmZvOiBPbWl0PEhpc3RvcnlTdGVwLCBcImRpZmZcIj4gPSB7XG4gICAgICAgICAgICBjdXJyZW50TGFiZWw6IE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuY3VycmVudExhYmVsSWQsXG4gICAgICAgICAgICBkaWFsb2d1ZTogZGlhbG9ndWUsXG4gICAgICAgICAgICBjaG9pY2VzOiBjaG9pY2VzLFxuICAgICAgICAgICAgc3RlcFNoYTE6IHN0ZXBTaGEsXG4gICAgICAgICAgICBpbmRleDogdGhpcy5zdGVwQ291bnRlcixcbiAgICAgICAgICAgIGxhYmVsU3RlcEluZGV4OiBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmN1cnJlbnRMYWJlbFN0ZXBJbmRleCxcbiAgICAgICAgICAgIGNob2ljZUluZGV4TWFkZTogY2hvaWNlTWFkZSxcbiAgICAgICAgICAgIGlucHV0VmFsdWU6IGlucHV0VmFsdWUsXG4gICAgICAgICAgICBhbHJlYWR5TWFkZUNob2ljZXM6IHRoaXMuYWxyZWFkeUN1cnJlbnRTdGVwTWFkZUNob2ljZXMsXG4gICAgICAgICAgICBpc0dsdWVkOiBpc0dsdWVkLFxuICAgICAgICAgICAgb3BlbmVkTGFiZWxzOiBvcGVuZWRMYWJlbHMsXG4gICAgICAgIH07XG4gICAgICAgIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMub3JpZ2luYWxPcGVuZWRMYWJlbHMgPSBvcGVuZWRMYWJlbHM7XG4gICAgICAgIEdhbWVVbmlmaWVyLmFkZEhpc3RvcnlJdGVtKGhpc3RvcnlJbmZvLCB7IGlnbm9yZVNhbWVTdGVwIH0pO1xuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmxhc3RIaXN0b3J5U3RlcCA9IGhpc3RvcnlJbmZvO1xuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmluY3JlYXNlU3RlcENvdW50ZXIoKTtcbiAgICB9XG4gICAgY2xvc2VDdXJyZW50TGFiZWwoKSB7XG4gICAgICAgIGlmICghTmFycmF0aW9uTWFuYWdlclN0YXRpYy5jdXJyZW50TGFiZWxJZCkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJObyBsYWJlbCB0byBjbG9zZVwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY3VycmVudExhYmVsKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJjdXJyZW50TGFiZWwgbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVuZWRMYWJlbHMgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9wZW5lZExhYmVscztcbiAgICAgICAgb3BlbmVkTGFiZWxzLnBvcCgpO1xuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9wZW5lZExhYmVscyA9IG9wZW5lZExhYmVscztcbiAgICAgICAgR2FtZVVuaWZpZXIub25MYWJlbENsb3NpbmcodGhpcy5vcGVuZWRMYWJlbHMubGVuZ3RoKTtcbiAgICB9XG4gICAgY2xvc2VBbGxMYWJlbHMoKSB7XG4gICAgICAgIHdoaWxlIChOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9wZW5lZExhYmVscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQ3VycmVudExhYmVsKCk7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5vbkxhYmVsQ2xvc2luZyh0aGlzLm9wZW5lZExhYmVscy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBpc0xhYmVsQWxyZWFkeUNvbXBsZXRlZChsYWJlbDogTGFiZWxJZFR5cGUgfCBMYWJlbEFic3RyYWN0PGFueT4pOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGxhYmVsSWQ6IExhYmVsSWRUeXBlO1xuICAgICAgICBpZiAodHlwZW9mIGxhYmVsID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBsYWJlbElkID0gbGFiZWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYWJlbElkID0gbGFiZWwuaWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFsbE9wZW5lZExhYmVscyA9IE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuYWxsT3BlbmVkTGFiZWxzO1xuICAgICAgICBsZXQgbGFzdFN0ZXAgPSBhbGxPcGVuZWRMYWJlbHNbbGFiZWxJZF0/LmJpZ2dlc3RTdGVwIHx8IDA7XG4gICAgICAgIGlmIChsYXN0U3RlcCkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRMYWJlbCA9IFJlZ2lzdGVyZWRMYWJlbHMuZ2V0KGxhYmVsSWQpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRMYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50TGFiZWwuc3RlcENvdW50IDw9IGxhc3RTdGVwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXQgYWxyZWFkeUN1cnJlbnRTdGVwTWFkZUNob2ljZXNPYmooKTogQ2hvaWNlc01hZGVUeXBlW10gfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgY3VycmVudExhYmVsU3RlcEluZGV4ID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5jdXJyZW50TGFiZWxTdGVwSW5kZXg7XG4gICAgICAgIGxldCBjdXJyZW50TGFiZWwgPSB0aGlzLmN1cnJlbnRMYWJlbDtcbiAgICAgICAgaWYgKGN1cnJlbnRMYWJlbFN0ZXBJbmRleCA9PT0gbnVsbCB8fCAhY3VycmVudExhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0ZXBTaGEgPSBjdXJyZW50TGFiZWwuZ2V0U3RlcFNoYShjdXJyZW50TGFiZWxTdGVwSW5kZXgpO1xuICAgICAgICBpZiAoIXN0ZXBTaGEpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwic3RlcFNoYSBub3QgZm91bmQsIHNldHRpbmcgdG8gRVJST1JcIik7XG4gICAgICAgICAgICBzdGVwU2hhID0gQWRkaXRpb25hbFNoYVNwZXRzRW51bS5FUlJPUjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hbGxDaG9pY2VzTWFkZS5maWx0ZXIoKGNob2ljZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBjaG9pY2UubGFiZWxJZCA9PT0gY3VycmVudExhYmVsPy5pZCAmJlxuICAgICAgICAgICAgICAgIGNob2ljZS5zdGVwSW5kZXggPT09IGN1cnJlbnRMYWJlbFN0ZXBJbmRleCAmJlxuICAgICAgICAgICAgICAgIGNob2ljZS5zdGVwU2hhMSA9PT0gc3RlcFNoYVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBhbHJlYWR5Q3VycmVudFN0ZXBNYWRlQ2hvaWNlcygpOiBudW1iZXJbXSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmFscmVhZHlDdXJyZW50U3RlcE1hZGVDaG9pY2VzT2JqPy5tYXAoKGNob2ljZSkgPT4gY2hvaWNlLmNob2ljZUluZGV4KTtcbiAgICB9XG4gICAgZ2V0IGlzQ3VycmVudFN0ZXBBbHJlYWR5T3BlbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgY3VycmVudExhYmVsID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5jdXJyZW50TGFiZWxJZDtcbiAgICAgICAgaWYgKGN1cnJlbnRMYWJlbCkge1xuICAgICAgICAgICAgbGV0IGxhc3RTdGVwID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hbGxPcGVuZWRMYWJlbHNbY3VycmVudExhYmVsXT8ub3BlbkNvdW50IHx8IDA7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5jdXJyZW50TGFiZWxTdGVwSW5kZXggJiZcbiAgICAgICAgICAgICAgICBsYXN0U3RlcCA+PSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmN1cnJlbnRMYWJlbFN0ZXBJbmRleFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VGltZXNMYWJlbE9wZW5lZChsYWJlbDogTGFiZWxJZFR5cGUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hbGxPcGVuZWRMYWJlbHNbbGFiZWxdPy5vcGVuQ291bnQgfHwgMDtcbiAgICB9XG4gICAgcHVibGljIGdldFRpbWVzQ2hvaWNlTWFkZShpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxyZWFkeUN1cnJlbnRTdGVwTWFkZUNob2ljZXNPYmo/LmZpbmQoKGNob2ljZSkgPT4gY2hvaWNlLmNob2ljZUluZGV4ID09PSBpbmRleCk/Lm1hZGVUaW1lcyB8fCAwO1xuICAgIH1cbiAgICBhZGRDdXJyZW50U3RlcFRvSGlzdG9yeSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZGRTdGVwSGlzdG9yeShBZGRpdGlvbmFsU2hhU3BldHNFbnVtLkRFVkVMT1BFUiwgeyBpZ25vcmVTYW1lU3RlcDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvKiBSdW4gTWV0aG9kcyAqL1xuXG4gICAgcHJpdmF0ZSBnZXRDYW5Db250aW51ZShvcHRpb25zPzoge1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdHJ1ZSwgc2hvdyBhIHdhcm5pbmcgaW4gdGhlIGNvbnNvbGUuXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICAqL1xuICAgICAgICBzaG93V2Fybj86IGJvb2xlYW47XG4gICAgfSk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgc2hvd1dhcm4gPSBvcHRpb25zPy5zaG93V2FybiB8fCBmYWxzZTtcbiAgICAgICAgbGV0IGNob2ljZU1lbnVPcHRpb25zID0gdGhpcy5jaG9pY2VzO1xuICAgICAgICBpZiAoY2hvaWNlTWVudU9wdGlvbnMgJiYgY2hvaWNlTWVudU9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2hvd1dhcm4gJiYgbG9nZ2VyLndhcm4oXCJUaGUgcGxheWVyIG11c3QgbWFrZSBhIGNob2ljZVwiKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkSW5wdXQpIHtcbiAgICAgICAgICAgIHNob3dXYXJuICYmIGxvZ2dlci53YXJuKFwiVGhlIHBsYXllciBtdXN0IGVudGVyIGEgdmFsdWVcIik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGdldCBjYW5Db250aW51ZSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKEdhbWVVbmlmaWVyLnJ1bm5pbmdTdGVwc0NvdW50ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FuQ29udGludWUoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBvblN0ZXBTdGFydChsYWJlbDogTGFiZWxBYnN0cmFjdDxhbnksIGFueT4sIHN0ZXBJZDogbnVtYmVyKSB7XG4gICAgICAgIGxldCByZXM6ICh2b2lkIHwgUHJvbWlzZTx2b2lkPiB8IFByb21pc2U8dm9pZFtdPilbXSA9IFtdO1xuICAgICAgICBpZiAobGFiZWwub25TdGVwU3RhcnQpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKGxhYmVsLm9uU3RlcFN0YXJ0KHN0ZXBJZCwgbGFiZWwpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoTmFycmF0aW9uTWFuYWdlclN0YXRpYy5vblN0ZXBTdGFydCkge1xuICAgICAgICAgICAgcmVzLnB1c2goTmFycmF0aW9uTWFuYWdlclN0YXRpYy5vblN0ZXBTdGFydChzdGVwSWQsIGxhYmVsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKHJlcyk7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgb25TdGVwRW5kKGxhYmVsOiBMYWJlbEFic3RyYWN0PGFueSwgYW55Piwgc3RlcElkOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHJlczogKHZvaWQgfCBQcm9taXNlPHZvaWQ+KVtdID0gW107XG4gICAgICAgIGlmIChsYWJlbC5vblN0ZXBFbmQpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKGxhYmVsLm9uU3RlcEVuZChzdGVwSWQsIGxhYmVsKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMub25TdGVwRW5kKSB7XG4gICAgICAgICAgICByZXMucHVzaChOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9uU3RlcEVuZChzdGVwSWQsIGxhYmVsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKHJlcyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBjb250aW51ZShcbiAgICAgICAgcHJvcHM6IFN0ZXBMYWJlbFByb3BzVHlwZSxcbiAgICAgICAgb3B0aW9uczogeyBzdGVwcz86IG51bWJlcjsgcnVuTm93PzogYm9vbGVhbjsgY2hvaWNlTWFkZT86IG51bWJlciB9ID0ge30sXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHsgcnVuTm93ID0gZmFsc2UsIHN0ZXBzID0gMSB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoc3RlcHMpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgW2NvbnRpbnVlXSBUaGUgcGFyYW1ldGVyIHN0ZXBzIG11c3QgYmUgYSB2YWxpZCBmaW5pdGUgbnVtYmVyLCByZWNlaXZlZDogJHtzdGVwc31gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RlcHMgPD0gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYFtjb250aW51ZV0gVGhlIHBhcmFtZXRlciBzdGVwcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLCByZWNlaXZlZDogJHtzdGVwc31gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bk5vdyAmJiAhdGhpcy5nZXRDYW5Db250aW51ZSh7IHNob3dXYXJuOiB0cnVlIH0pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydW5Ob3cgJiYgR2FtZVVuaWZpZXIucnVubmluZ1N0ZXBzQ291bnQgIT09IDApIHtcbiAgICAgICAgICAgIEdhbWVVbmlmaWVyLmluY3JlYXNlQ29udGludWVSZXF1ZXN0KHN0ZXBzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RlcHMgPiAxKSB7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5pbmNyZWFzZUNvbnRpbnVlUmVxdWVzdChzdGVwcyAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIEdhbWVVbmlmaWVyLnJ1bm5pbmdTdGVwc0NvdW50Kys7XG4gICAgICAgIGxldCByZXN1bHQ6IFN0ZXBMYWJlbFJlc3VsdFR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoR2FtZVVuaWZpZXIucnVubmluZ1N0ZXBzQ291bnQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBHYW1lVW5pZmllci5vblByZUNvbnRpbnVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmluY3JlYXNlQ3VycmVudFN0ZXBJbmRleCgpO1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5DdXJyZW50U3RlcChwcm9wcywgb3B0aW9ucyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIGNvbnRpbnVpbmdcIiwgZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgR2FtZVVuaWZpZXIucnVubmluZ1N0ZXBzQ291bnQtLTtcbiAgICAgICAgICAgIHJlc3VsdCA9IChhd2FpdCB0aGlzLmFmdGVyUnVuQ3VycmVudFN0ZXAocHJvcHMpKSB8fCByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBhZnRlclJ1bkN1cnJlbnRTdGVwKHByb3BzOiBTdGVwTGFiZWxQcm9wc1R5cGU8YW55Pikge1xuICAgICAgICBpZiAoR2FtZVVuaWZpZXIucnVubmluZ1N0ZXBzQ291bnQgPT09IDAgJiYgR2FtZVVuaWZpZXIuY29udGludWVSZXF1ZXN0c0NvdW50ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgR2FtZVVuaWZpZXIucHJvY2Vzc05hdmlnYXRpb25SZXF1ZXN0cyhwcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3BlbmVkTGFiZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKEdhbWVVbmlmaWVyLm9uRW5kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IEdhbWVVbmlmaWVyLm9uRW5kKHByb3BzLCB7IGxhYmVsSWQ6IFwiZW5kXCIgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJUaGUgZW5kIG9mIHRoZSBnYW1lIGlzIG5vdCBtYW5hZ2VkLCBzbyB0aGUgZ2FtZSBpcyBibG9ja2VkLiBSZWFkIHRoaXMgZG9jdW1lbnRhdGlvbiB0byBrbm93IGhvdyB0byBtYW5hZ2UgdGhlIGVuZCBvZiB0aGUgZ2FtZTogaHR0cHM6Ly9waXhpLXZuLndlYi5hcHAvc3RhcnQvb3RoZXItbmFycmF0aXZlLWZlYXR1cmVzLmh0bWwjaG93LW1hbmFnZS10aGUtZW5kLW9mLXRoZS1nYW1lXCIsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIHRoZSBjdXJyZW50IHN0ZXAgYW5kIGFkZCBpdCB0byB0aGUgaGlzdG9yeS5cbiAgICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BzIHRvIHBhc3MgdG8gdGhlIHN0ZXAuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMuXG4gICAgICogQHJldHVybnMgU3RlcExhYmVsUmVzdWx0VHlwZSBvciB1bmRlZmluZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBydW5DdXJyZW50U3RlcDxUIGV4dGVuZHMge30+KFxuICAgICAgICBwcm9wczogU3RlcExhYmVsUHJvcHNUeXBlPFQ+LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2hvaWNlIG1hZGUgYnkgdGhlIHBsYXllci4gKFRoaXMgcGFyYW1zIGlzIHVzZWQgaW4gdGhlIGNob2ljZSBtZW51KVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjaG9pY2VNYWRlPzogbnVtYmVyO1xuICAgICAgICB9ID0ge30sXG4gICAgKTogUHJvbWlzZTxTdGVwTGFiZWxSZXN1bHRUeXBlPiB7XG4gICAgICAgIGNvbnN0IHsgY2hvaWNlTWFkZSB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuY3VycmVudExhYmVsSWQpIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50TGFiZWxTdGVwSW5kZXggPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmN1cnJlbnRMYWJlbFN0ZXBJbmRleDtcbiAgICAgICAgICAgIGlmIChjdXJyZW50TGFiZWxTdGVwSW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJjdXJyZW50TGFiZWxTdGVwSW5kZXggaXMgbnVsbFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY3VycmVudExhYmVsID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fY3VycmVudExhYmVsIGFzIExhYmVsQWJzdHJhY3Q8YW55LCBUPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghY3VycmVudExhYmVsKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiY3VycmVudExhYmVsIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VycmVudExhYmVsLnN0ZXBDb3VudCA+IGN1cnJlbnRMYWJlbFN0ZXBJbmRleCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25TdGVwU3RhcnQoY3VycmVudExhYmVsLCBjdXJyZW50TGFiZWxTdGVwSW5kZXgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgcnVubmluZyBvblN0ZXBTdGFydFwiLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25TdGVwRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25TdGVwRXJyb3IoZSwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHN0ZXAgPSBjdXJyZW50TGFiZWwuZ2V0U3RlcEJ5SWQoY3VycmVudExhYmVsU3RlcEluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoIXN0ZXApIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwic3RlcCBub3QgZm91bmRcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHN0ZXBTaGEgPSBjdXJyZW50TGFiZWwuZ2V0U3RlcFNoYShjdXJyZW50TGFiZWxTdGVwSW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmICghc3RlcFNoYSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcInN0ZXBTaGEgbm90IGZvdW5kLCBzZXR0aW5nIHRvIEVSUk9SXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdGVwU2hhID0gQWRkaXRpb25hbFNoYVNwZXRzRW51bS5FUlJPUjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBsZXQgZXJyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHN0ZXAocHJvcHMsIHsgbGFiZWxJZDogY3VycmVudExhYmVsLmlkIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgcnVubmluZyBzdGVwXCIsIGUpO1xuICAgICAgICAgICAgICAgICAgICBlcnIgPSBlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjaG9pY2VNZW51T3B0aW9ucyA9IHRoaXMuY2hvaWNlcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNob2ljZU1lbnVPcHRpb25zPy5sZW5ndGggPT09IDEgJiYgY2hvaWNlTWVudU9wdGlvbnNbMF0uYXV0b1NlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNob2ljZSA9IGNob2ljZU1lbnVPcHRpb25zWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZWxlY3RDaG9pY2UoY2hvaWNlLCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIGF1dG8tc2VsZWN0aW5nIGNob2ljZVwiLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0SGlzdG9yeVN0ZXAgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmxhc3RIaXN0b3J5U3RlcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNob2ljZU1hZGUgIT09IHVuZGVmaW5lZCAmJiBsYXN0SGlzdG9yeVN0ZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBTaGEgPSBsYXN0SGlzdG9yeVN0ZXAuc3RlcFNoYTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0ZXBTaGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcInN0ZXBTaGEgbm90IGZvdW5kLCBzZXR0aW5nIHRvIEVSUk9SXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBTaGEgPSBBZGRpdGlvbmFsU2hhU3BldHNFbnVtLkVSUk9SO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hZGRDaG9pY2VzTWFkZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0SGlzdG9yeVN0ZXAuY3VycmVudExhYmVsIHx8IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgbGFzdEhpc3RvcnlTdGVwLmxhYmVsU3RlcEluZGV4ID09PSBcIm51bWJlclwiID8gbGFzdEhpc3RvcnlTdGVwLmxhYmVsU3RlcEluZGV4IDogLTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEhpc3RvcnlTdGVwLnN0ZXBTaGExIHx8IEFkZGl0aW9uYWxTaGFTcGV0c0VudW0uRVJST1IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlTWFkZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmNob2ljZU1hZGVUZW1wID0gY2hvaWNlTWFkZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJFcnJvciBhZGRpbmcgY2hvaWNlIG1hZGUgdG8gaGlzdG9yeVwiLCBlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGFkZCB0byBoaXN0b3J5IGlmIGlzIHRoZSBtYWluIHN0ZXAgKG5vdCBhIG5lc3RlZCBjYWxsL2p1bXApXG4gICAgICAgICAgICAgICAgICAgIGlmIChHYW1lVW5pZmllci5ydW5uaW5nU3RlcHNDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hZGRMYWJlbEhpc3RvcnkoY3VycmVudExhYmVsLmlkLCBjdXJyZW50TGFiZWxTdGVwSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRTdGVwSGlzdG9yeShzdGVwU2hhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VNYWRlOiBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmNob2ljZU1hZGVUZW1wLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmNob2ljZU1hZGVUZW1wID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcIkVycm9yIGFkZGluZyBzdGVwIHRvIGhpc3RvcnlcIiwgZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFiZWwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLm9uU3RlcEVuZCh0aGlzLmN1cnJlbnRMYWJlbCwgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5jdXJyZW50TGFiZWxTdGVwSW5kZXggfHwgMCkpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJFcnJvciBydW5uaW5nIG9uU3RlcEVuZFwiLCBlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZXJyICYmIHRoaXMub25TdGVwRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vblN0ZXBFcnJvcihlcnIsIHByb3BzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcGVuZWRMYWJlbHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VDdXJyZW50TGFiZWwoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb250aW51ZShwcm9wcywgb3B0aW9ucyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3BlbmVkTGFiZWxzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMub3BlbmVkTGFiZWxzID0gW107XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3BlbmVkTGFiZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiY3VycmVudExhYmVsSWQgbm90IGZvdW5kXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBjYWxsPFQgZXh0ZW5kcyB7fSA9IHt9PihcbiAgICAgICAgbGFiZWw6IExhYmVsQWJzdHJhY3Q8YW55LCBUPiB8IExhYmVsSWRUeXBlLFxuICAgICAgICBwcm9wczogU3RlcExhYmVsUHJvcHNUeXBlPFQ+LFxuICAgICAgICBvcHRpb25zPzoge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGNob2ljZSBtYWRlIGJ5IHRoZSBwbGF5ZXIuIChUaGlzIHBhcmFtcyBpcyB1c2VkIGluIHRoZSBjaG9pY2UgbWVudSlcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY2hvaWNlTWFkZT86IG51bWJlcjtcbiAgICAgICAgfSxcbiAgICApOiBQcm9taXNlPFN0ZXBMYWJlbFJlc3VsdFR5cGU+IHtcbiAgICAgICAgY29uc3QgeyBjaG9pY2VNYWRlIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBsZXQgbGFiZWxJZDogTGFiZWxJZFR5cGU7XG4gICAgICAgIGlmICh0eXBlb2YgbGFiZWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxhYmVsSWQgPSBsYWJlbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhYmVsSWQgPSBsYWJlbC5pZDtcbiAgICAgICAgfVxuICAgICAgICBHYW1lVW5pZmllci5ydW5uaW5nU3RlcHNDb3VudCsrO1xuICAgICAgICBsZXQgcmVzdWx0OiBTdGVwTGFiZWxSZXN1bHRUeXBlID0gdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHRlbXBMYWJlbCA9IFJlZ2lzdGVyZWRMYWJlbHMuZ2V0PExhYmVsQWJzdHJhY3Q8YW55LCBUPj4obGFiZWxJZCk7XG4gICAgICAgICAgICBpZiAoIXRlbXBMYWJlbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBQaXhpRXJyb3IoXCJ1bnJlZ2lzdGVyZWRfZWxlbWVudFwiLCBgTGFiZWwgJHtsYWJlbElkfSBub3QgZm91bmRgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5wdXNoTmV3TGFiZWwodGVtcExhYmVsLmlkKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuQ3VycmVudFN0ZXA8VD4ocHJvcHMsIHsgY2hvaWNlTWFkZTogY2hvaWNlTWFkZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgY2FsbGluZyBsYWJlbFwiLCBlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5ydW5uaW5nU3RlcHNDb3VudC0tO1xuICAgICAgICAgICAgcmVzdWx0ID0gKGF3YWl0IHRoaXMuYWZ0ZXJSdW5DdXJyZW50U3RlcChwcm9wcykpIHx8IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMganVtcDxUIGV4dGVuZHMge30+KFxuICAgICAgICBsYWJlbDogTGFiZWxBYnN0cmFjdDxhbnksIFQ+IHwgTGFiZWxJZFR5cGUsXG4gICAgICAgIHByb3BzOiBTdGVwTGFiZWxQcm9wc1R5cGU8VD4sXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2hvaWNlIG1hZGUgYnkgdGhlIHBsYXllci4gKFRoaXMgcGFyYW1zIGlzIHVzZWQgaW4gdGhlIGNob2ljZSBtZW51KVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjaG9pY2VNYWRlPzogbnVtYmVyO1xuICAgICAgICB9LFxuICAgICk6IFByb21pc2U8U3RlcExhYmVsUmVzdWx0VHlwZT4ge1xuICAgICAgICBpZiAodGhpcy5zdGVwQ291bnRlciA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsbChsYWJlbCwgcHJvcHMsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wZW5lZExhYmVscy5sZW5ndGggPiAwKSB0aGlzLmNsb3NlQ3VycmVudExhYmVsKCk7XG4gICAgICAgIGNvbnN0IHsgY2hvaWNlTWFkZSB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgbGV0IGxhYmVsSWQ6IExhYmVsSWRUeXBlO1xuICAgICAgICBpZiAodHlwZW9mIGxhYmVsID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBsYWJlbElkID0gbGFiZWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYWJlbElkID0gbGFiZWwuaWQ7XG4gICAgICAgIH1cbiAgICAgICAgR2FtZVVuaWZpZXIucnVubmluZ1N0ZXBzQ291bnQrKztcbiAgICAgICAgbGV0IHJlc3VsdDogU3RlcExhYmVsUmVzdWx0VHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCB0ZW1wTGFiZWwgPSBSZWdpc3RlcmVkTGFiZWxzLmdldDxMYWJlbEFic3RyYWN0PGFueSwgVD4+KGxhYmVsSWQpO1xuICAgICAgICAgICAgaWYgKCF0ZW1wTGFiZWwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGl4aUVycm9yKFwidW5yZWdpc3RlcmVkX2VsZW1lbnRcIiwgYExhYmVsICR7bGFiZWxJZH0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMucHVzaE5ld0xhYmVsKHRlbXBMYWJlbC5pZCk7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkN1cnJlbnRTdGVwPFQ+KHByb3BzLCB7IGNob2ljZU1hZGU6IGNob2ljZU1hZGUgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIGp1bXBpbmcgdG8gbGFiZWxcIiwgZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgR2FtZVVuaWZpZXIucnVubmluZ1N0ZXBzQ291bnQtLTtcbiAgICAgICAgICAgIHJlc3VsdCA9IChhd2FpdCB0aGlzLmFmdGVyUnVuQ3VycmVudFN0ZXAocHJvcHMpKSB8fCByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNlbGVjdENob2ljZTxUIGV4dGVuZHMge30+KFxuICAgICAgICBpdGVtOiBTdG9yZWRJbmRleGVkQ2hvaWNlSW50ZXJmYWNlLFxuICAgICAgICBwcm9wczogU3RlcExhYmVsUHJvcHNUeXBlPFQ+LFxuICAgICk6IFByb21pc2U8U3RlcExhYmVsUmVzdWx0VHlwZT4ge1xuICAgICAgICB0aGlzLmNob2ljZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBpdGVtLnR5cGU7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcImNhbGxcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jYWxsKFxuICAgICAgICAgICAgICAgICAgICBpdGVtLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICB7IC4uLml0ZW0ucHJvcHMsIC4uLnByb3BzIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZU1hZGU6IGl0ZW0uY2hvaWNlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgXCJqdW1wXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuanVtcChcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgeyAuLi5pdGVtLnByb3BzLCAuLi5wcm9wcyB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VNYWRlOiBpdGVtLmNob2ljZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlIFwiY2xvc2VcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbG9zZUNob2ljZU1lbnUoaXRlbSwgeyAuLi5pdGVtLnByb3BzLCAuLi5wcm9wcyB9KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBUeXBlICR7dHlwZX0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBpeGlFcnJvcihcImludmFsaWRfdXNhZ2VcIiwgYFR5cGUgJHt0eXBlfSBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBwbGF5ZXIgaXMgaW4gYSBjaG9pY2UgbWVudSwgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGV4aXQgdG8gdGhlIGNob2ljZSBtZW51LlxuICAgICAqIEBwYXJhbSBjaG9pY2VcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcmV0dXJucyBTdGVwTGFiZWxSZXN1bHRUeXBlIG9yIHVuZGVmaW5lZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBuYXJyYXRpb24uY2xvc2VDaG9pY2VNZW51KHlvdXJQYXJhbXMpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAqICAgICBpZiAocmVzdWx0KSB7XG4gICAgICogICAgICAgICAvLyB5b3VyIGNvZGVcbiAgICAgKiAgICAgfVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNsb3NlQ2hvaWNlTWVudTxUIGV4dGVuZHMge30gPSB7fT4oXG4gICAgICAgIGNob2ljZTogU3RvcmVkSW5kZXhlZENob2ljZUludGVyZmFjZSxcbiAgICAgICAgcHJvcHM6IFN0ZXBMYWJlbFByb3BzVHlwZTxUPixcbiAgICApOiBQcm9taXNlPFN0ZXBMYWJlbFJlc3VsdFR5cGU+IHtcbiAgICAgICAgaWYgKGNob2ljZS50eXBlICE9PSBcImNsb3NlXCIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkZvciBjbG9zZUNob2ljZU1lbnUsIHRoZSB0eXBlIG11c3QgYmUgY2xvc2VcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGl4aUVycm9yKFwiaW52YWxpZF91c2FnZVwiLCBcIkZvciBjbG9zZUNob2ljZU1lbnUsIHRoZSB0eXBlIG11c3QgYmUgY2xvc2VcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNob2ljZU1hZGU6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHR5cGVvZiBjaG9pY2UuY2hvaWNlSW5kZXggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGNob2ljZU1hZGUgPSBjaG9pY2UuY2hvaWNlSW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNob2ljZS5jbG9zZUN1cnJlbnRMYWJlbCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUN1cnJlbnRMYWJlbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbnRpbnVlKHByb3BzLCB7IGNob2ljZU1hZGUgfSk7XG4gICAgfVxuXG4gICAgLyogR28gQmFjayAmIFJlZnJlc2ggTWV0aG9kcyAqL1xuXG4gICAgcHJpdmF0ZSBnZXQgb25TdGVwRXJyb3IoKTogKChlcnJvcjogYW55LCBwcm9wczogU3RlcExhYmVsUHJvcHNUeXBlKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBvbkVycm9yID0gR2FtZVVuaWZpZXIub25FcnJvcjtcbiAgICAgICAgaWYgKCFvbkVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3luYyAoZXJyb3I6IGFueSwgcHJvcHM6IFN0ZXBMYWJlbFByb3BzVHlwZSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgb25FcnJvcihcInN0ZXBcIiwgZXJyb3IsIHByb3BzKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJFcnJvciBpbiBvbkVycm9yIGhhbmRsZXJcIiwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHByaXZhdGUgc2V0IG9uU3RlcEVycm9yKHZhbHVlOiAoZXJyb3I6IGFueSwgcHJvcHM6IFN0ZXBMYWJlbFByb3BzVHlwZSkgPT4gdm9pZCkge1xuICAgICAgICBHYW1lVW5pZmllci5vbkVycm9yID0gKHR5cGU6IHN0cmluZywgZXJyb3I6IGFueSwgcHJvcHM6IFN0ZXBMYWJlbFByb3BzVHlwZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlKGVycm9yLCBwcm9wcyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkaWFsb2d1ZSgpOlxuICAgICAgICB8IChQYXJ0aWFsPERpYWxvZ3VlSW50ZXJmYWNlPiAmIHtcbiAgICAgICAgICAgICAgdGV4dDogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICAgICAgICAgIGNoYXJhY3Rlcj86IENoYXJhY3RlckludGVyZmFjZSB8IHN0cmluZztcbiAgICAgICAgICB9KVxuICAgICAgICB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IGRpYWxvZ3VlID0gR2FtZVVuaWZpZXIuZ2V0VmFyaWFibGU8U3RvcmVkRGlhbG9ndWU+KFxuICAgICAgICAgICAgU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5DVVJSRU5UX0RJQUxPR1VFX01FTU9SWV9LRVksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZGlhbG9ndWUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmRpYWxvZ3VlLFxuICAgICAgICAgICAgY2hhcmFjdGVyOiBkaWFsb2d1ZS5jaGFyYWN0ZXJcbiAgICAgICAgICAgICAgICA/IEdhbWVVbmlmaWVyLmdldENoYXJhY3RlcihkaWFsb2d1ZS5jaGFyYWN0ZXIpIHx8IGRpYWxvZ3VlLmNoYXJhY3RlclxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGRpYWxvZ3VlKGRpYWxvZ3VlOiBEaWFsb2d1ZUludGVyZmFjZSB8IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChkaWFsb2d1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfRElBTE9HVUVfTUVNT1JZX0tFWSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGlhbG9ndWUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheShkaWFsb2d1ZSkpIHtcbiAgICAgICAgICAgIGRpYWxvZ3VlID0geyB0ZXh0OiBkaWFsb2d1ZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGlhbG9nR2x1ZSkge1xuICAgICAgICAgICAgbGV0IGdsdWVEaWFsb2d1ZSA9IEdhbWVVbmlmaWVyLmdldFZhcmlhYmxlPFN0b3JlZERpYWxvZ3VlPihcbiAgICAgICAgICAgICAgICBTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfRElBTE9HVUVfTUVNT1JZX0tFWSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoZ2x1ZURpYWxvZ3VlKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1RleHQgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShnbHVlRGlhbG9ndWUudGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VGV4dCA9IFsuLi5nbHVlRGlhbG9ndWUudGV4dF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VGV4dCA9IFtnbHVlRGlhbG9ndWUudGV4dF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpYWxvZ3VlLnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1RleHQgPSBbLi4ubmV3VGV4dCwgLi4uZGlhbG9ndWUudGV4dF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VGV4dCA9IFsuLi5uZXdUZXh0LCBkaWFsb2d1ZS50ZXh0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGlhbG9ndWUudGV4dCA9IG5ld1RleHQ7XG4gICAgICAgICAgICAgICAgZGlhbG9ndWUuY2hhcmFjdGVyID0gZGlhbG9ndWUuY2hhcmFjdGVyIHx8IGdsdWVEaWFsb2d1ZS5jaGFyYWN0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkxBU1RfU1RFUF9HTFVFRCwgdGhpcy5zdGVwQ291bnRlcik7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZ0dsdWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgR2FtZVVuaWZpZXIuc2V0VmFyaWFibGUoXG4gICAgICAgICAgICAgICAgU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5DVVJSRU5UX0RJQUxPR1VFX01FTU9SWV9LRVksXG4gICAgICAgICAgICAgICAgY3JlYXRlRXhwb3J0YWJsZUVsZW1lbnQoe1xuICAgICAgICAgICAgICAgICAgICAuLi5kaWFsb2d1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyOiB0eXBlb2YgZGlhbG9ndWUuY2hhcmFjdGVyID09PSBcInN0cmluZ1wiID8gZGlhbG9ndWUuY2hhcmFjdGVyIDogZGlhbG9ndWUuY2hhcmFjdGVyPy5pZCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShcbiAgICAgICAgICAgICAgICBTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkxBU1RfRElBTE9HVUVfQURERURfSU5fU1RFUF9NRU1PUllfS0VZLFxuICAgICAgICAgICAgICAgIHRoaXMuc3RlcENvdW50ZXIsXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJEaWFsb2d1ZUludGVyZmFjZSBjYW5ub3QgY29udGFpbiBmdW5jdGlvbnMgb3IgY2xhc3Nlc1wiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBQaXhpRXJyb3IoXCJub3RfanNvbl9zZXJpYWxpemFibGVcIiwgXCJDaG9pY2VJbnRlcmZhY2UgY2Fubm90IGNvbnRhaW4gZnVuY3Rpb25zIG9yIGNsYXNzZXNcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGdldCBjaG9pY2VzKCk6IFN0b3JlZEluZGV4ZWRDaG9pY2VJbnRlcmZhY2VbXSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBkID0gR2FtZVVuaWZpZXIuZ2V0VmFyaWFibGU8YW55PihcbiAgICAgICAgICAgIFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9NRU5VX09QVElPTlNfTUVNT1JZX0tFWSxcbiAgICAgICAgKSBhcyBTdG9yZWRDaG9pY2VJbnRlcmZhY2VbXTtcbiAgICAgICAgaWYgKGQpIHtcbiAgICAgICAgICAgIGxldCBvbmx5SGF2ZU5vQ2hvaWNlOiBTdG9yZWRJbmRleGVkQ2hvaWNlSW50ZXJmYWNlW10gPSBbXTtcbiAgICAgICAgICAgIGxldCBvcHRpb25zOiBTdG9yZWRJbmRleGVkQ2hvaWNlSW50ZXJmYWNlW10gPSBkLm1hcCgob3B0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgY2hvaWNlSW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBhbHJlYWR5Q2hvaWNlcyA9IHRoaXMuYWxyZWFkeUN1cnJlbnRTdGVwTWFkZUNob2ljZXM7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucy5maWx0ZXIoKG9wdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uLm9uZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFscmVhZHlDaG9pY2VzICYmIGFscmVhZHlDaG9pY2VzLmluY2x1ZGVzKGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb24ub25seUhhdmVOb0Nob2ljZSkge1xuICAgICAgICAgICAgICAgICAgICBvbmx5SGF2ZU5vQ2hvaWNlLnB1c2gob3B0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvbmx5SGF2ZU5vQ2hvaWNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3RPcHRpb24gPSBvbmx5SGF2ZU5vQ2hvaWNlWzBdO1xuICAgICAgICAgICAgICAgIHJldHVybiBbZmlyc3RPcHRpb25dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgY2hvaWNlcyhvcHRpb25zOiBTdG9yZWRDaG9pY2VJbnRlcmZhY2VbXSB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIEdhbWVVbmlmaWVyLnNldFZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9NRU5VX09QVElPTlNfTUVNT1JZX0tFWSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgR2FtZVVuaWZpZXIuc2V0VmFyaWFibGUoXG4gICAgICAgICAgICAgICAgU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5DVVJSRU5UX01FTlVfT1BUSU9OU19NRU1PUllfS0VZLFxuICAgICAgICAgICAgICAgIGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50KG9wdGlvbnMpIGFzIGFueSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShcbiAgICAgICAgICAgICAgICBTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkxBU1RfTUVOVV9PUFRJT05TX0FEREVEX0lOX1NURVBfTUVNT1JZX0tFWSxcbiAgICAgICAgICAgICAgICB0aGlzLnN0ZXBDb3VudGVyLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQ2hvaWNlSW50ZXJmYWNlIGNhbm5vdCBjb250YWluIGZ1bmN0aW9ucyBvciBjbGFzc2VzXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IFBpeGlFcnJvcihcIm5vdF9qc29uX3NlcmlhbGl6YWJsZVwiLCBcIkNob2ljZUludGVyZmFjZSBjYW5ub3QgY29udGFpbiBmdW5jdGlvbnMgb3IgY2xhc3Nlc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGRpYWxvZ0dsdWUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBHYW1lVW5pZmllci5nZXRGbGFnKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQUREX05FWFRfRElBTE9HX1RFWFRfSU5UT19USEVfQ1VSUkVOVF9ESUFMT0dfRkxBR19LRVkpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGRpYWxvZ0dsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgR2FtZVVuaWZpZXIuc2V0RmxhZyhTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkFERF9ORVhUX0RJQUxPR19URVhUX0lOVE9fVEhFX0NVUlJFTlRfRElBTE9HX0ZMQUdfS0VZLCB2YWx1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaW5wdXRWYWx1ZSgpOiBTdG9yYWdlRWxlbWVudFR5cGUge1xuICAgICAgICByZXR1cm4gR2FtZVVuaWZpZXIuZ2V0VmFyaWFibGUoU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5DVVJSRU5UX0lOUFVUX1ZBTFVFX01FTU9SWV9LRVkpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGlucHV0VmFsdWUodmFsdWU6IFN0b3JhZ2VFbGVtZW50VHlwZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUlucHV0UmVxdWVzdCgpO1xuICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfSU5QVVRfVkFMVUVfTUVNT1JZX0tFWSwgdmFsdWUpO1xuICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkxBU1RfSU5QVVRfQURERURfSU5fU1RFUF9NRU1PUllfS0VZLCB0aGlzLnN0ZXBDb3VudGVyKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBpc1JlcXVpcmVkSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBHYW1lVW5pZmllci5nZXRWYXJpYWJsZTxJbnB1dEluZm8+KFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9JTlBVVF9JTkZPX01FTU9SWV9LRVkpXG4gICAgICAgICAgICAgICAgPy5pc1JlcXVpcmVkIHx8IGZhbHNlXG4gICAgICAgICk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaW5wdXRUeXBlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBHYW1lVW5pZmllci5nZXRWYXJpYWJsZTxJbnB1dEluZm8+KFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9JTlBVVF9JTkZPX01FTU9SWV9LRVkpPy50eXBlO1xuICAgIH1cbiAgICBwdWJsaWMgcmVxdWVzdElucHV0KGluZm86IE9taXQ8SW5wdXRJbmZvLCBcImlzUmVxdWlyZWRcIj4sIGRlZmF1bHRWYWx1ZT86IFN0b3JhZ2VFbGVtZW50VHlwZSkge1xuICAgICAgICAoaW5mbyBhcyBJbnB1dEluZm8pLmlzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfSU5QVVRfSU5GT19NRU1PUllfS0VZLCBpbmZvKTtcbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfSU5QVVRfVkFMVUVfTUVNT1JZX0tFWSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEdhbWVVbmlmaWVyLnJlbW92ZVZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9JTlBVVF9WQUxVRV9NRU1PUllfS0VZKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgcmVtb3ZlSW5wdXRSZXF1ZXN0KCkge1xuICAgICAgICBHYW1lVW5pZmllci5yZW1vdmVWYXJpYWJsZShTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfSU5QVVRfSU5GT19NRU1PUllfS0VZKTtcbiAgICAgICAgR2FtZVVuaWZpZXIucmVtb3ZlVmFyaWFibGUoU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5DVVJSRU5UX0lOUFVUX1ZBTFVFX01FTU9SWV9LRVkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5vcGVuZWRMYWJlbHMgPSBbXTtcbiAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fc3RlcENvdW50ZXIgPSAwO1xuICAgIH1cblxuICAgIC8qIEV4cG9ydCBhbmQgSW1wb3J0IE1ldGhvZHMgKi9cblxuICAgIHB1YmxpYyBleHBvcnQoKTogTmFycmF0aW9uR2FtZVN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9wZW5lZExhYmVsczogY3JlYXRlRXhwb3J0YWJsZUVsZW1lbnQoTmFycmF0aW9uTWFuYWdlclN0YXRpYy5vcGVuZWRMYWJlbHMpLFxuICAgICAgICAgICAgc3RlcENvdW50ZXI6IHRoaXMuc3RlcENvdW50ZXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvbkxvYWRpbmdMYWJlbChjdXJyZW50TGFiZWxTdGVwSW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5vcGVuZWRMYWJlbHMubWFwKGFzeW5jIChsYWJlbEluZm8pID0+IHtcbiAgICAgICAgICAgIGxldCByZXM6ICh2b2lkIHwgUHJvbWlzZTx2b2lkPilbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IGxhYmVsID0gUmVnaXN0ZXJlZExhYmVscy5nZXQobGFiZWxJbmZvLmxhYmVsKTtcbiAgICAgICAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbC5vbkxvYWRpbmdMYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICByZXMucHVzaChsYWJlbC5vbkxvYWRpbmdMYWJlbChjdXJyZW50TGFiZWxTdGVwSW5kZXgsIGxhYmVsKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9uTG9hZGluZ0xhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMub25Mb2FkaW5nTGFiZWwoY3VycmVudExhYmVsU3RlcEluZGV4LCBsYWJlbCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChyZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2UpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVzdG9yZShkYXRhOiBvYmplY3QsIGxhc3RIaXN0b3J5U3RlcDogT21pdDxIaXN0b3J5U3RlcCwgXCJkaWZmXCI+IHwgbnVsbCkge1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmxhc3RIaXN0b3J5U3RlcCA9IGxhc3RIaXN0b3J5U3RlcDtcbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KFwib3BlbmVkTGFiZWxzXCIpKSB7XG4gICAgICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5vcGVuZWRMYWJlbHMgPSAoZGF0YSBhcyBOYXJyYXRpb25HYW1lU3RhdGUpW1wib3BlbmVkTGFiZWxzXCJdO1xuICAgICAgICAgICAgICAgIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMub3JpZ2luYWxPcGVuZWRMYWJlbHMgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9wZW5lZExhYmVscztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJDb3VsZCBub3QgaW1wb3J0IG9wZW5lZExhYmVscyBkYXRhLCBzbyB3aWxsIGJlIGlnbm9yZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShcInN0ZXBDb3VudGVyXCIpKSB7XG4gICAgICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fc3RlcENvdW50ZXIgPSAoZGF0YSBhcyBOYXJyYXRpb25HYW1lU3RhdGUpW1wic3RlcENvdW50ZXJcIl07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJsYXN0U3RlcEluZGV4XCIpKSB7XG4gICAgICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fc3RlcENvdW50ZXIgPSAoZGF0YSBhcyBOYXJyYXRpb25HYW1lU3RhdGUpW1wibGFzdFN0ZXBJbmRleFwiXSBhcyBudW1iZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiQ291bGQgbm90IGltcG9ydCBzdGVwQ291bnRlciBkYXRhLCBzbyB3aWxsIGJlIGlnbm9yZWRcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkxvYWRpbmdMYWJlbChOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmN1cnJlbnRMYWJlbFN0ZXBJbmRleCB8fCAwKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJFcnJvciBydW5uaW5nIG9uTG9hZGluZ0xhYmVsXCIsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJFcnJvciBpbXBvcnRpbmcgZGF0YVwiLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IENob2ljZUludGVyZmFjZSB9IGZyb20gXCJAZHJpbmNzL3BpeGktdm5cIjtcbmltcG9ydCB7IFN0b3JhZ2VPYmplY3RUeXBlIH0gZnJvbSBcIi4uLy4uL3N0b3JhZ2VcIjtcbmltcG9ydCB7IENob2ljZU9wdGlvbkludGVyZmFjZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1N0b3JlZENob2ljZUludGVyZmFjZVwiO1xuaW1wb3J0IHsgTGFiZWxJZFR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvTGFiZWxJZFR5cGVcIjtcbmltcG9ydCBMYWJlbFJ1bk1vZGVUeXBlIGZyb20gXCIuLi90eXBlcy9MYWJlbFJ1bk1vZGVUeXBlXCI7XG5pbXBvcnQgTGFiZWwgZnJvbSBcIi4vTGFiZWxcIjtcbmltcG9ydCBMYWJlbEFic3RyYWN0IGZyb20gXCIuL0xhYmVsQWJzdHJhY3RcIjtcblxuaW50ZXJmYWNlIENob2ljZU1lbnVPcHRpb25PcHRpb25zXG4gICAgZXh0ZW5kcyBPbWl0PENob2ljZUludGVyZmFjZSwgXCJ0ZXh0XCIgfCBcImxhYmVsXCIgfCBcInR5cGVcIiB8IFwicHJvcHNcIiB8IFwiY2xvc2VDdXJyZW50TGFiZWxcIj4ge1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgdGhlIGxhYmVsIHRvIGJlIG9wZW5lZC4gQGRlZmF1bHQgXCJjYWxsXCJcbiAgICAgKi9cbiAgICB0eXBlPzogTGFiZWxSdW5Nb2RlVHlwZTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgY2hvaWNlIG1lbnUgb3B0aW9uLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG5ld0Nob2ljZU9wdGlvbihcIkhlbGxvXCIsIEhlbGxvTGFiZWwsIHt9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXdDaG9pY2VPcHRpb248VCBleHRlbmRzIFN0b3JhZ2VPYmplY3RUeXBlPihcbiAgICB0ZXh0OiBDaG9pY2VJbnRlcmZhY2VbXCJ0ZXh0XCJdLFxuICAgIGxhYmVsOiBMYWJlbDxUPiB8IExhYmVsQWJzdHJhY3Q8YW55LCBUPiB8IExhYmVsSWRUeXBlLFxuICAgIHByb3BzOiBULFxuICAgIG9wdGlvbnM/OiBDaG9pY2VNZW51T3B0aW9uT3B0aW9uc1xuKTogQ2hvaWNlT3B0aW9uSW50ZXJmYWNlIHtcbiAgICBjb25zdCBsYWJlbElkID0gdHlwZW9mIGxhYmVsID09PSBcInN0cmluZ1wiID8gbGFiZWwgOiBsYWJlbC5pZDtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBsYWJlbDogbGFiZWxJZCxcbiAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgICB0ZXh0LFxuICAgICAgICB0eXBlOiBvcHRpb25zPy50eXBlIHx8IFwiY2FsbFwiLFxuICAgIH07XG59XG4iLCJleHBvcnQgdHlwZSBDbG9zZVR5cGUgPSBcImNsb3NlXCJcbmV4cG9ydCBjb25zdCBDbG9zZTogQ2xvc2VUeXBlID0gXCJjbG9zZVwiIiwiaW1wb3J0IHsgQ2hvaWNlSW50ZXJmYWNlIH0gZnJvbSBcIkBkcmluY3MvcGl4aS12blwiO1xuaW1wb3J0IHsgQ2xvc2VDaG9pY2VPcHRpb25JbnRlcmZhY2UgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TdG9yZWRDaG9pY2VJbnRlcmZhY2VcIjtcbmltcG9ydCB7IENsb3NlIH0gZnJvbSBcIi4uL3R5cGVzL0Nsb3NlVHlwZVwiO1xuXG5pbnRlcmZhY2UgQ2hvaWNlTWVudU9wdGlvbkNsb3NlT3B0aW9uc1xuICAgIGV4dGVuZHMgT21pdDxDaG9pY2VJbnRlcmZhY2UsIFwidGV4dFwiIHwgXCJsYWJlbFwiIHwgXCJ0eXBlXCIgfCBcInByb3BzXCIgfCBcImNsb3NlQ3VycmVudExhYmVsXCI+IHtcbiAgICAvKipcbiAgICAgKiBJZiB0cnVlLCB0aGUgY3VycmVudCBsYWJlbCB3aWxsIGJlIGNsb3NlZC4gQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBjbG9zZUN1cnJlbnRMYWJlbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGNob2ljZSBtZW51IG9wdGlvbiB0aGF0IHdpbGwgY2xvc2UgdGhlIG1lbnUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogbmV3Q2xvc2VDaG9pY2VPcHRpb24oXCJSZXR1cm5cIilcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3Q2xvc2VDaG9pY2VPcHRpb24oXG4gICAgdGV4dDogQ2hvaWNlSW50ZXJmYWNlW1widGV4dFwiXSxcbiAgICBvcHRpb25zPzogQ2hvaWNlTWVudU9wdGlvbkNsb3NlT3B0aW9uc1xuKTogQ2xvc2VDaG9pY2VPcHRpb25JbnRlcmZhY2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHR5cGU6IENsb3NlLFxuICAgICAgICB0ZXh0LFxuICAgIH07XG59XG4iLCJpbXBvcnQgc2hhMSBmcm9tIFwiY3J5cHRvLWpzL3NoYTFcIjtcbmltcG9ydCB7IExhYmVsUHJvcHMgfSBmcm9tIFwiLi4vLi5cIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi8uLi91dGlscy9sb2ctdXRpbGl0eVwiO1xuaW1wb3J0IHsgQWRkaXRpb25hbFNoYVNwZXRzRW51bSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL0hpc3RvcnlTdGVwXCI7XG5pbXBvcnQgeyBMYWJlbElkVHlwZSB9IGZyb20gXCIuLi90eXBlcy9MYWJlbElkVHlwZVwiO1xuaW1wb3J0IHsgU3RlcExhYmVsVHlwZSB9IGZyb20gXCIuLi90eXBlcy9TdGVwTGFiZWxUeXBlXCI7XG5pbXBvcnQgTGFiZWxBYnN0cmFjdCBmcm9tIFwiLi9MYWJlbEFic3RyYWN0XCI7XG5cbi8qKlxuICogTGFiZWwgaXMgYSBjbGFzcyB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBzdGVwcywgd2hpY2ggd2lsbCBiZSBwZXJmb3JtZWQgYXMgdGhlIGdhbWUgY29udGludWVzLlxuICogRm9yIFJlbidweSB0aGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIGEgbGFiZWwuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgU1RBUlRfTEFCRUxfSUQgPSBcIlN0YXJ0TGFiZWxcIlxuICpcbiAqIGV4cG9ydCBjb25zdCBzdGFydExhYmVsID0gbmV3TGFiZWwoU1RBUlRfTEFCRUxfSUQsXG4gKiAgICAgW1xuICogICAgICAgICAocHJvcHMpID0+IHtcbiAqICAgICAgICAgICAgIGNhbnZhcy5jbGVhcigpXG4gKiAgICAgICAgICAgICBuYXJyYXRpb24uZGlhbG9ndWUgPSB7IGNoYXJhY3RlcjogbGlhbSwgdGV4dDogXCJXaGljaCB0ZXN0IGRvIHlvdSB3YW50IHRvIHBlcmZvcm0/XCIgfVxuICogICAgICAgICAgICAgbmFycmF0aW9uLmNob2ljZXMgPSBbXG4gKiAgICAgICAgICAgICAgICAgbmV3Q2hvaWNlT3B0aW9uKFwiRXZlbnRzIFRlc3RcIiwgZXZlbnRzVGVzdExhYmVsKSxcbiAqICAgICAgICAgICAgICAgICBuZXdDaG9pY2VPcHRpb24oXCJTaG93IEltYWdlIFRlc3RcIiwgc2hvd0ltYWdlVGVzdCksXG4gKiAgICAgICAgICAgICBdXG4gKiAgICAgICAgIH0sXG4gKiAgICAgICAgIChwcm9wcykgPT4gbmFycmF0aW9uLmp1bXAoU1RBUlRfTEFCRUxfSUQsIHByb3BzKSxcbiAqICAgICBdXG4gKiApXG4gKlxuICogbmFycmF0aW9uLmNhbGwoU3RhcnRMYWJlbClcbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWJlbDxUIGV4dGVuZHMge30gPSB7fT4gZXh0ZW5kcyBMYWJlbEFic3RyYWN0PExhYmVsPFQ+LCBUPiB7XG4gICAgcHVibGljIGdldCBzdGVwQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RlcHMubGVuZ3RoO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0U3RlcEJ5SWQoc3RlcElkOiBudW1iZXIpOiBTdGVwTGFiZWxUeXBlPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RlcHNbc3RlcElkXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGlkIGlzIHRoZSBpZCBvZiB0aGUgbGFiZWxcbiAgICAgKiBAcGFyYW0gc3RlcHMgaXMgdGhlIGxpc3Qgb2Ygc3RlcHMgdGhhdCB0aGUgbGFiZWwgd2lsbCBwZXJmb3JtXG4gICAgICogQHBhcmFtIHByb3BzIGlzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBsYWJlbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGlkOiBMYWJlbElkVHlwZSwgc3RlcHM6IFN0ZXBMYWJlbFR5cGU8VD5bXSB8ICgoKSA9PiBTdGVwTGFiZWxUeXBlPFQ+W10pLCBwcm9wcz86IExhYmVsUHJvcHM8TGFiZWw8VD4+KSB7XG4gICAgICAgIHN1cGVyKGlkLCBwcm9wcyk7XG4gICAgICAgIHRoaXMuX3N0ZXBzID0gc3RlcHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3RlcHM6IFN0ZXBMYWJlbFR5cGU8VD5bXSB8ICgoKSA9PiBTdGVwTGFiZWxUeXBlPFQ+W10pO1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc3RlcHMgb2YgdGhlIGxhYmVsLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3RlcHMoKTogU3RlcExhYmVsVHlwZTxUPltdIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zdGVwcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RlcHMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc3RlcHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN0ZXBTaGEoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5zdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwic3RlcFNoYSBub3QgZm91bmQsIHNldHRpbmcgdG8gRVJST1JcIik7XG4gICAgICAgICAgICByZXR1cm4gQWRkaXRpb25hbFNoYVNwZXRzRW51bS5FUlJPUjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHN0ZXAgPSB0aGlzLnN0ZXBzW2luZGV4XTtcbiAgICAgICAgICAgIGxldCBzaGExU3RyaW5nID0gc2hhMShzdGVwLnRvU3RyaW5nKCkudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgICAgICAgICByZXR1cm4gc2hhMVN0cmluZy50b1N0cmluZygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcInN0ZXBTaGEgbm90IGZvdW5kLCBzZXR0aW5nIHRvIEVSUk9SXCIsIGUpO1xuICAgICAgICAgICAgcmV0dXJuIEFkZGl0aW9uYWxTaGFTcGV0c0VudW0uRVJST1I7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgUmVnaXN0ZXJlZExhYmVscyBmcm9tIFwiLi4vZGVjb3JhdG9ycy9SZWdpc3RlcmVkTGFiZWxzXCI7XG5pbXBvcnQgTGFiZWxQcm9wcyBmcm9tIFwiLi4vaW50ZXJmYWNlcy9MYWJlbFByb3BzXCI7XG5pbXBvcnQgeyBMYWJlbElkVHlwZSB9IGZyb20gXCIuLi90eXBlcy9MYWJlbElkVHlwZVwiO1xuaW1wb3J0IHsgU3RlcExhYmVsVHlwZSB9IGZyb20gXCIuLi90eXBlcy9TdGVwTGFiZWxUeXBlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIExhYmVsQWJzdHJhY3Q8VExhYmVsLCBUUHJvcHMgZXh0ZW5kcyB7fSA9IHt9LCBTdGVwSWRUeXBlID0gbnVtYmVyPlxuICAgIGltcGxlbWVudHMgTGFiZWxQcm9wczxUTGFiZWwsIFN0ZXBJZFR5cGU+XG57XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGlkIGlzIHRoZSBpZCBvZiB0aGUgbGFiZWxcbiAgICAgKiBAcGFyYW0gcHJvcHMgaXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGxhYmVsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoaWQ6IExhYmVsSWRUeXBlLCBwcm9wcz86IExhYmVsUHJvcHM8VExhYmVsLCBTdGVwSWRUeXBlPikge1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuX29uU3RlcFN0YXJ0ID0gcHJvcHM/Lm9uU3RlcFN0YXJ0O1xuICAgICAgICB0aGlzLl9vbkxvYWRpbmdMYWJlbCA9IHByb3BzPy5vbkxvYWRpbmdMYWJlbDtcbiAgICAgICAgdGhpcy5fb25TdGVwRW5kID0gcHJvcHM/Lm9uU3RlcEVuZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGlkIG9mIHRoZSBsYWJlbC4gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGluIHRoZSBzeXN0ZW0gdG8gZ2V0IHRoZSBsYWJlbCBieSBpZCwge0BsaW5rIFJlZ2lzdGVyZWRMYWJlbHMuZ2V0fVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGlkOiBMYWJlbElkVHlwZTtcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHN0ZXBzIGluIHRoZSBsYWJlbC4gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGluIHRoZSBzeXN0ZW0gdG8gZ2V0IHRoZSBudW1iZXIgb2Ygc3RlcHMgaW4gdGhlIGxhYmVsLlxuICAgICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2Ygc3RlcHMgaW4gdGhlIGxhYmVsXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldCBzdGVwQ291bnQoKTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzaGEgb2YgdGhlIHN0ZXBcbiAgICAgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIHN0ZXBcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0U3RlcFNoYShzdGVwSWQ6IFN0ZXBJZFR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHN0ZXAgYnkgaWRcbiAgICAgKiBAcGFyYW0gc3RlcElkIElkIG9mIHRoZSBzdGVwXG4gICAgICogQHJldHVybiBUaGUgc3RlcCBvciB1bmRlZmluZWQgaWYgaXQgZG9lcyBub3QgZXhpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0U3RlcEJ5SWQoc3RlcElkOiBTdGVwSWRUeXBlKTogU3RlcExhYmVsVHlwZTxUUHJvcHM+IHwgdW5kZWZpbmVkO1xuXG4gICAgcHJpdmF0ZSBfb25TdGVwU3RhcnQ6ICgoc3RlcElkOiBTdGVwSWRUeXBlLCBsYWJlbDogVExhYmVsKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCB1bmRlZmluZWQ7XG4gICAgcHVibGljIGdldCBvblN0ZXBTdGFydCgpOiAoKHN0ZXBJZDogU3RlcElkVHlwZSwgbGFiZWw6IFRMYWJlbCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jIChzdGVwSWQ6IFN0ZXBJZFR5cGUsIGxhYmVsOiBUTGFiZWwpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vbkxvYWRpbmdMYWJlbCAmJiBzdGVwSWQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9vbkxvYWRpbmdMYWJlbChzdGVwSWQsIGxhYmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9vblN0ZXBTdGFydCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9vblN0ZXBTdGFydChzdGVwSWQsIGxhYmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9vbkxvYWRpbmdMYWJlbDogKChzdGVwSWQ6IFN0ZXBJZFR5cGUsIGxhYmVsOiBUTGFiZWwpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KSB8IHVuZGVmaW5lZDtcbiAgICBwdWJsaWMgZ2V0IG9uTG9hZGluZ0xhYmVsKCk6ICgoc3RlcElkOiBTdGVwSWRUeXBlLCBsYWJlbDogVExhYmVsKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25Mb2FkaW5nTGFiZWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25TdGVwRW5kOiAoKHN0ZXBJZDogU3RlcElkVHlwZSwgbGFiZWw6IFRMYWJlbCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHwgdW5kZWZpbmVkO1xuICAgIHB1YmxpYyBnZXQgb25TdGVwRW5kKCk6ICgoc3RlcElkOiBTdGVwSWRUeXBlLCBsYWJlbDogVExhYmVsKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25TdGVwRW5kO1xuICAgIH1cbn1cbiIsImltcG9ydCBMYWJlbCBmcm9tIFwiLi4vY2xhc3Nlcy9MYWJlbFwiO1xuaW1wb3J0IExhYmVsUHJvcHMgZnJvbSBcIi4uL2ludGVyZmFjZXMvTGFiZWxQcm9wc1wiO1xuaW1wb3J0IHsgTGFiZWxJZFR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvTGFiZWxJZFR5cGVcIjtcbmltcG9ydCBMYWJlbFN0ZXBzIGZyb20gXCIuLi90eXBlcy9MYWJlbFN0ZXBzXCI7XG5pbXBvcnQgUmVnaXN0ZXJlZExhYmVscyBmcm9tIFwiLi9SZWdpc3RlcmVkTGFiZWxzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBsYWJlbCBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBzeXN0ZW0uXG4gKiAqKlRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSBhdCBzeXN0ZW0gc3RhcnR1cCB0byByZWdpc3RlciB0aGUgbGFiZWwsIG90aGVyd2lzZSB0aGUgc3lzdGVtIGNhbm5vdCBiZSB1c2VkLioqXG4gKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBsYWJlbCwgaXQgbXVzdCBiZSB1bmlxdWVcbiAqIEBwYXJhbSBzdGVwcyBUaGUgc3RlcHMgb2YgdGhlIGxhYmVsXG4gKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIGxhYmVsXG4gKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBsYWJlbFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBuZXdMYWJlbDxUIGV4dGVuZHMge30gPSB7fT4oXG4gICAgaWQ6IExhYmVsSWRUeXBlLFxuICAgIHN0ZXBzOiBMYWJlbFN0ZXBzPFQ+IHwgKCgpID0+IExhYmVsU3RlcHM8VD4pLFxuICAgIHByb3BzPzogTGFiZWxQcm9wczxMYWJlbDxUPj5cbik6IExhYmVsPFQ+IHtcbiAgICBsZXQgbGFiZWwgPSBuZXcgTGFiZWw8VD4oaWQsIHN0ZXBzLCBwcm9wcyk7XG4gICAgUmVnaXN0ZXJlZExhYmVscy5hZGQobGFiZWwpO1xuICAgIHJldHVybiBsYWJlbDtcbn1cbiIsImltcG9ydCB7IE5hcnJhdGlvbk1hbmFnZXJJbnRlcmZhY2UgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCBOYXJyYXRpb25NYW5hZ2VyIGZyb20gXCIuL05hcnJhdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHsgbmV3Q2hvaWNlT3B0aW9uIH0gZnJvbSBcIi4vY2xhc3Nlcy9DaG9pY2VNZW51T3B0aW9uXCI7XG5leHBvcnQgeyBuZXdDbG9zZUNob2ljZU9wdGlvbiB9IGZyb20gXCIuL2NsYXNzZXMvQ2xvc2VDaG9pY2VPcHRpb25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTGFiZWwgfSBmcm9tIFwiLi9jbGFzc2VzL0xhYmVsXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIExhYmVsQWJzdHJhY3QgfSBmcm9tIFwiLi9jbGFzc2VzL0xhYmVsQWJzdHJhY3RcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbmV3TGFiZWwgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL25ld0xhYmVsXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFJlZ2lzdGVyZWRMYWJlbHMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL1JlZ2lzdGVyZWRMYWJlbHNcIjtcbmV4cG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBDaG9pY2VJbnRlcmZhY2UgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0Nob2ljZUludGVyZmFjZVwiO1xuZXhwb3J0IHR5cGUgeyBkZWZhdWx0IGFzIERpYWxvZ3VlSW50ZXJmYWNlIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9EaWFsb2d1ZUludGVyZmFjZVwiO1xuZXhwb3J0IHR5cGUgeyBkZWZhdWx0IGFzIEhpc3RvcnlTdGVwIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9IaXN0b3J5U3RlcFwiO1xuZXhwb3J0IHR5cGUgeyBkZWZhdWx0IGFzIExhYmVsUHJvcHMgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0xhYmVsUHJvcHNcIjtcbmV4cG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBOYXJyYXRpb25HYW1lU3RhdGUgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL05hcnJhdGlvbkdhbWVTdGF0ZVwiO1xuZXhwb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE5hcnJhdGlvbkhpc3RvcnkgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL05hcnJhdGlvbkhpc3RvcnlcIjtcbmV4cG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBOYXJyYXRpb25NYW5hZ2VySW50ZXJmYWNlIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9OYXJyYXRpb25NYW5hZ2VySW50ZXJmYWNlXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT3BlbmVkTGFiZWwgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL09wZW5lZExhYmVsXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgU3RlcExhYmVsUHJvcHMgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL1N0ZXBMYWJlbFByb3BzXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgU3RlcExhYmVsUmVzdWx0IH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9TdGVwTGFiZWxSZXN1bHRcIjtcbmV4cG9ydCB0eXBlIHtcbiAgICBDaG9pY2VPcHRpb25JbnRlcmZhY2UsXG4gICAgQ2xvc2VDaG9pY2VPcHRpb25JbnRlcmZhY2UsXG4gICAgZGVmYXVsdCBhcyBTdG9yZWRDaG9pY2VJbnRlcmZhY2UsXG4gICAgU3RvcmVkSW5kZXhlZENob2ljZUludGVyZmFjZSxcbn0gZnJvbSBcIi4vaW50ZXJmYWNlcy9TdG9yZWRDaG9pY2VJbnRlcmZhY2VcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTmFycmF0aW9uTWFuYWdlclN0YXRpYyB9IGZyb20gXCIuL05hcnJhdGlvbk1hbmFnZXJTdGF0aWNcIjtcbmV4cG9ydCB7IENsb3NlIH0gZnJvbSBcIi4vdHlwZXMvQ2xvc2VUeXBlXCI7XG5leHBvcnQgdHlwZSB7IENsb3NlVHlwZSB9IGZyb20gXCIuL3R5cGVzL0Nsb3NlVHlwZVwiO1xuZXhwb3J0IHR5cGUgeyBkZWZhdWx0IGFzIEhpc3RvcnlDaG9pY2VNZW51T3B0aW9uIH0gZnJvbSBcIi4vdHlwZXMvSGlzdG9yeUNob2ljZU1lbnVPcHRpb25cIjtcbmV4cG9ydCB0eXBlIHsgSW5wdXRJbmZvIH0gZnJvbSBcIi4vdHlwZXMvSW5wdXRJbmZvXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgTGFiZWxSdW5Nb2RlVHlwZSB9IGZyb20gXCIuL3R5cGVzL0xhYmVsUnVuTW9kZVR5cGVcIjtcbmV4cG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBMYWJlbFN0ZXBzIH0gZnJvbSBcIi4vdHlwZXMvTGFiZWxTdGVwc1wiO1xuZXhwb3J0IHR5cGUgeyBTdGVwTGFiZWxQcm9wc1R5cGUsIFN0ZXBMYWJlbFJlc3VsdFR5cGUsIFN0ZXBMYWJlbFR5cGUgfSBmcm9tIFwiLi90eXBlcy9TdGVwTGFiZWxUeXBlXCI7XG5leHBvcnQgeyBuYXJyYXRpb24gfTtcblxuY29uc3QgbmFycmF0aW9uOiBOYXJyYXRpb25NYW5hZ2VySW50ZXJmYWNlID0gbmV3IE5hcnJhdGlvbk1hbmFnZXIoKTtcbiJdfQ==
|