@willbooster/wb 10.6.7 → 10.6.9

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.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +5 -7
package/dist/index.js CHANGED
@@ -6,5 +6,5 @@ import e from"node:fs";import t from"node:path";import n from"tree-kill";import
6
6
  * @author Chen, Yi-Cyuan [emn178@gmail.com]
7
7
  * @copyright Chen, Yi-Cyuan 2015-2023
8
8
  * @license MIT
9
- */const E=[..."0123456789abcdef"],N=[6,1536,393216,100663296],A=[0,8,16,24],P=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648];const x=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class R{blocks=[];s=[];reset=!0;finalized=!1;block=0;start=0;lastByteIndex=0;constructor(e,t,n){this.padding=t,this.outputBits=n,this.blockCount=1600-(e<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=n>>5,this.extraBytes=(31&n)>>3;for(let e=0;e<50;++e)this.s[e]=0}update(e){if(this.finalized)throw new Error("finalize already called");const t=this.blocks,n=this.byteCount,r=e.length,s=this.blockCount,o=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<s+1;++i)t[i]=0;for(i=this.start;c<r&&i<n;++c)a=e.codePointAt(c)||0,a<128?t[i>>2]|=a<<A[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<A[3&i++],t[i>>2]|=(128|a>>6&63)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<A[3&i++],t[i>>2]|=(128|a>>12&63)<<A[3&i++],t[i>>2]|=(128|a>>6&63)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[s],i=0;i<s;++i)o[i]^=t[i];j(o),this.reset=!0}else this.start=i}return this}finalize(){if(this.finalized)return;this.finalized=!0;const e=this.blocks;let t=this.lastByteIndex;const n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];j(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let s,o=0,i=0,a="";for(;i<n;){for(o=0;o<e&&i<n;++o,++i)s=t[o],a+=E[s>>4&15]+E[15&s]+E[s>>12&15]+E[s>>8&15]+E[s>>20&15]+E[s>>16&15]+E[s>>28&15]+E[s>>24&15];i%e===0&&(t=x(t),j(t),o=0)}return r&&(s=t[o],a+=E[s>>4&15]+E[15&s],r>1&&(a+=E[s>>12&15]+E[s>>8&15]),r>2&&(a+=E[s>>20&15]+E[s>>16&15])),a}}const j=function(e){let t,n,r,s,o,i,a,c,d,l,u,p,m,f,h,g,b,y,v,w,$,k,E,N,A,x,R,j,S,O,D,T,_,B,C,I,W,V,F,J,z,Y,L,U,M,G,q,H,K,X,Q,Z,ee,te,ne,re,se,oe,ie,ae,ce,de,le;for(r=0;r<48;r+=2)s=e[0]^e[10]^e[20]^e[30]^e[40],o=e[1]^e[11]^e[21]^e[31]^e[41],i=e[2]^e[12]^e[22]^e[32]^e[42],a=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],d=e[5]^e[15]^e[25]^e[35]^e[45],l=e[6]^e[16]^e[26]^e[36]^e[46],u=e[7]^e[17]^e[27]^e[37]^e[47],p=e[8]^e[18]^e[28]^e[38]^e[48],m=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=m^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=s^(c<<1|d>>>31),n=o^(d<<1|c>>>31),e[2]^=t,e[3]^=n,e[12]^=t,e[13]^=n,e[22]^=t,e[23]^=n,e[32]^=t,e[33]^=n,e[42]^=t,e[43]^=n,t=i^(l<<1|u>>>31),n=a^(u<<1|l>>>31),e[4]^=t,e[5]^=n,e[14]^=t,e[15]^=n,e[24]^=t,e[25]^=n,e[34]^=t,e[35]^=n,e[44]^=t,e[45]^=n,t=c^(p<<1|m>>>31),n=d^(m<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=l^(s<<1|o>>>31),n=u^(o<<1|s>>>31),e[8]^=t,e[9]^=n,e[18]^=t,e[19]^=n,e[28]^=t,e[29]^=n,e[38]^=t,e[39]^=n,e[48]^=t,e[49]^=n,f=e[0],h=e[1],G=e[11]<<4|e[10]>>>28,q=e[10]<<4|e[11]>>>28,j=e[20]<<3|e[21]>>>29,S=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,Y=e[40]<<18|e[41]>>>14,L=e[41]<<18|e[40]>>>14,B=e[2]<<1|e[3]>>>31,C=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,b=e[12]<<12|e[13]>>>20,H=e[22]<<10|e[23]>>>22,K=e[23]<<10|e[22]>>>22,O=e[33]<<13|e[32]>>>19,D=e[32]<<13|e[33]>>>19,de=e[42]<<2|e[43]>>>30,le=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,I=e[14]<<6|e[15]>>>26,W=e[15]<<6|e[14]>>>26,y=e[25]<<11|e[24]>>>21,v=e[24]<<11|e[25]>>>21,X=e[34]<<15|e[35]>>>17,Q=e[35]<<15|e[34]>>>17,T=e[45]<<29|e[44]>>>3,_=e[44]<<29|e[45]>>>3,N=e[6]<<28|e[7]>>>4,A=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,se=e[16]<<23|e[17]>>>9,V=e[26]<<25|e[27]>>>7,F=e[27]<<25|e[26]>>>7,w=e[36]<<21|e[37]>>>11,$=e[37]<<21|e[36]>>>11,Z=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,U=e[8]<<27|e[9]>>>5,M=e[9]<<27|e[8]>>>5,x=e[18]<<20|e[19]>>>12,R=e[19]<<20|e[18]>>>12,oe=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,J=e[38]<<8|e[39]>>>24,z=e[39]<<8|e[38]>>>24,k=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=f^~g&y,e[1]=h^~b&v,e[10]=N^~x&j,e[11]=A^~R&S,e[20]=B^~I&V,e[21]=C^~W&F,e[30]=U^~G&H,e[31]=M^~q&K,e[40]=te^~re&oe,e[41]=ne^~se&ie,e[2]=g^~y&w,e[3]=b^~v&$,e[12]=x^~j&O,e[13]=R^~S&D,e[22]=I^~V&J,e[23]=W^~F&z,e[32]=G^~H&X,e[33]=q^~K&Q,e[42]=re^~oe&ae,e[43]=se^~ie&ce,e[4]=y^~w&k,e[5]=v^~$&E,e[14]=j^~O&T,e[15]=S^~D&_,e[24]=V^~J&Y,e[25]=F^~z&L,e[34]=H^~X&Z,e[35]=K^~Q&ee,e[44]=oe^~ae&de,e[45]=ie^~ce&le,e[6]=w^~k&f,e[7]=$^~E&h,e[16]=O^~T&N,e[17]=D^~_&A,e[26]=J^~Y&B,e[27]=z^~L&C,e[36]=X^~Z&U,e[37]=Q^~ee&M,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=k^~f&g,e[9]=E^~h&b,e[18]=T^~N&x,e[19]=_^~A&R,e[28]=Y^~B&I,e[29]=L^~C&W,e[38]=Z^~U&G,e[39]=ee^~M&q,e[48]=de^~te&re,e[49]=le^~ne&se,e[0]^=P[r],e[1]^=P[r+1]},S=function(){const e={instance:Error,from:e=>{const t=[e.name,e.message];return void 0!==e.stack&&t.push(e.stack),void 0!==e.cause&&(void 0===e.stack&&t.push(void 0),t.push(e.cause)),t},stub:()=>new Error,hydrate:(e,[t,n,r,s])=>{e.name=t,e.message=n,void 0===r?delete e.stack:e.stack=r,void 0!==s&&(e.cause=s)}},t={instance:Uint8Array,from:e=>[btoa(D.decode(e))],create:([e])=>O.encode(atob(e))},n={instance:Map,from:e=>[...e.entries()],stub:()=>new Map,hydrate:(e,t)=>{for(const[n,r]of t)e.set(n,r)}},r={instance:Set,from:e=>[...e.values()],stub:()=>new Set,hydrate:(e,t)=>{for(const n of t)e.add(n)}},s={instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},o={instance:RegExp,from:({flags:e,source:t})=>e?[t,e]:[t],create:([e,t])=>new RegExp(e,t)},i={instance:URL,from:e=>[e.href],create:([e])=>new URL(e)};return new Map([e,t,n,r,s,o,i].map(e=>[e.instance.name,e]))}(),O=new TextEncoder,D=new TextDecoder("utf8");function T(e=void 0,t=S){return JSON.stringify(C(e,t))}function _(e){if(void 0===e)return-1;if("number"==typeof e){if(Number.isNaN(e))return-3;if(!Number.isFinite(e))return e<0?-5:-4}return null}const B=[];function C(e,t=S){const n=_(e);if(null!==n)return n;const r=[],s=new Map;return function e(n){const o=_(n);if(null!==o)return o;let i=s.get(n);if(void 0!==i)return i;switch(i=r.length,typeof n){case"number":case"string":case"boolean":r[i]=n,s.set(n,i);break;case"bigint":r[i]=[-6,n.toString(16)],s.set(n,i);break;case"object":if(null===n)r[i]=n,s.set(n,i);else if(Array.isArray(n)){const t=function(e){if(B.length<e){const t=B.length;B.length=e,B.fill(-2,t,e)}return B.slice(0,e)}(n.length);r[i]=t,s.set(n,i);for(const[r,s]of n.entries())t[r]=e(s)}else{const[o,a]=function(e,t){const n=e.constructor;if("function"==typeof n){const r=n.name,s=t.get(r);if(void 0!==s)return[r,s.from(e)]}const r=Object.entries(e),s=r.length,o=Array.from({length:s+s});for(let e=0;e<s;e++){const t=r[e],n=e+e;o[n]=t[0],o[n+1]=t[1]}return["",o]}(n,t),c=a.length,d=Array.from({length:c+1});d[0]=o,r[i]=d,s.set(n,i);for(let t=0;t<c;t++)d[t+1]=e(a[t])}}return i}(e),r}function I(e,t){return function(e){return new R(512,N,512).update(e).hex()}(T([e,t]))}const W=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=I}={}){return function(n,r){let s,o,i;return"getter"===r?.kind?function(){const r=t(this,[]),a=Date.now();return(i!==r||a-o>e)&&(i=r,s=n.call(this),o=a),s}:function(...a){const c=t(this,a),d=Date.now();return(i!==c||d-o>e)&&(i=c,s=r?n.call(this,...a):n(...a),o=d),s}}}({getCacheKey:I});function V(e){return!!e&&"0"!==e&&"false"!==e}let F;class J{static{[F]=function(e,t,n,r,s){var o,i,a,c,d,l,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),m=Object.defineProperty,f=Object.create,h=[f(null),f(null)],g=t.length;function b(t,n,r){return function(s,o){n&&(o=s,s=e);for(var i=0;i<t.length;i++)o=t[i].apply(s,r?[o]:[]);return r?o:s}}function y(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function v(e,t,n,r,s,a,c,d,l,u,p){function f(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),v=t[3],w=!c,k=1===s,E=3===s,N=4===s,A=2===s;function P(t,n,r){return function(s,o){return n&&(o=s,s=e),r&&r(s),x[t].call(s,o)}}if(!w){var x={},R=[],j=E?"get":N||k?"set":"value";if(l?(u||k?x={get:$(function(){return v(this)},r,"get"),set:function(e){t[4](this,e)}}:x[j]=v,u||$(x[j],r,A?"":j)):u||(x=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=h[+d][r])&&7!==(i^s))throw Error("Decorating two elements with the same name ("+x[j].name+") is not supported yet");h[+d][r]=s<3?1:s}}for(var S=e,O=g.length-1;O>=0;O-=n?2:1){var D=y(g[O],"A decorator","be",!0),T=n?g[O-1]:void 0,_={},B={kind:["field","accessor","method","getter","setter","class"][s],name:r,metadata:o,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");y(t,"An initializer","be",!0),a.push(t)}.bind(null,_)};if(w)i=D.call(T,S,B),_.v=1,y(i,"class decorators","return")&&(S=i);else if(B.static=d,B.private=l,i=B.access={has:l?p.bind():function(e){return r in e}},N||(i.get=l?A?function(e){return f(e),x.value}:P("get",0,f):function(e){return e[r]}),A||E||(i.set=l?P("set",0,f):function(e,t){e[r]=t}),S=D.call(T,k?{get:x.get,set:x.set}:x[j],B),_.v=1,k){if("object"==typeof S&&S)(i=y(S.get,"accessor.get"))&&(x.get=i),(i=y(S.set,"accessor.set"))&&(x.set=i),(i=y(S.init,"accessor.init"))&&R.unshift(i);else if(void 0!==S)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(S,(u?"field":"method")+" decorators","return")&&(u?R.unshift(S):x[j]=S)}return s<2&&c.push(b(R,d,1),b(a,d,0)),u||w||(l?k?c.splice(-1,0,P("get",d),P("set",d)):c.push(A?x[j]:y.call.bind(x[j])):m(e,r,x)),S}function E(e){return m(e,p,{configurable:!0,enumerable:!0,value:o})}return o=f(null==o?null:o),d=[],l=function(e){e&&d.push(b(e))},u=function(t,r){for(var o=0;o<n.length;o++){var i=n[o],l=i[1],u=7&l;if((8&l)==t&&!u==r){var p=i[2],m=!!i[3],f=16&l;v(t?e:e.prototype,i,f,m?"#"+p:k(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,m,r,t&&m?function(t){return w(t)===e}:s)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||E(e),{e:i,get c(){var n=[];return g&&[E(e=v(e,[t],r,e.name,5,n)),b(n,1)]}}}(this,[],[[W,3,"isBunAvailable"],[W,3,"buildCommand"],[W,3,"rootDirPath"],[W,3,"dockerfile"],[W,3,"hasDockerfile"],[W,3,"hasSourceCode"],[W,3,"name"],[W,3,"dockerImageName"],[W,3,"env"],[W,3,"packageJson"],[W,3,"packageJsonPath"],[W,3,"hasPrisma"],[W,3,"hasVitest"],[W,3,"skipLaunchingServerForPlaywright"],[W,3,"dockerPackageJson"],[W,3,"binExists"]]).e}argv=void F(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,"..","..","package.json"))?t.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){if(!this.loadEnv)return process.env;const[n,r]=function(n,r){let s=(n.env??[]).map(e=>t.resolve(r,e.toString()));const o=n.cascadeEnv??(n.cascadeNodeEnv?process.env.NODE_ENV||"development":n.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof o){if(0===s.length&&(s.push(t.join(r,".env")),n.includeRootEnv)){const n=t.resolve(r,"..","..");e.existsSync(t.join(n,"package.json"))&&s.push(t.join(n,".env"))}s=s.flatMap(e=>o?[`${e}.${o}.local`,`${e}.local`,`${e}.${o}`,e]:[`${e}.local`,e])}s=s.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e)),n.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",s.join(", ")));const i=[],a={};for(const e of s){let s=0;for(const[n,o]of Object.entries(y(t.join(r,e))))n in a||(a[n]=o,s++);i.push([e,s]),n.verbose&&s>0&&console.info(`Read ${s} environment variables from ${e}`)}if(n.checkEnv){const e=Object.keys(y(t.join(r,n.checkEnv))).filter(e=>!(e in a));if(e.length>0)throw new Error(`Missing environment variables in [${s.join(", ")}]: [${e.join(", ")}]`)}return[a,i]}(this.argv,this.dirPath);for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...process.env,...n}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!!(this.packageJson.dependencies?.prisma??this.packageJson.devDependencies?.prisma)}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get skipLaunchingServerForPlaywright(){if(V(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const s=t.join(r,"node_modules",".bin");if(e.existsSync(s)&&(this.env.PATH=`${s}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const o=t.dirname(r);if(r===o)break;r=o}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}}function z(n,r=!0,s){if(s??=process.cwd(),e.existsSync(t.join(s,"package.json")))return new J(s,n,r)}async function Y(n,r=!0,s){const o=function(n,r=!0,s){if(s??=process.cwd(),!e.existsSync(t.join(s,"package.json")))return;const o=new J(s,n,r);let i=o;if(!o.packageJson.workspaces&&t.dirname(s).endsWith("/packages")){const o=t.resolve(s,"..","..");e.existsSync(t.join(o,"package.json"))&&(i=new J(o,n,r))}return{root:i,self:o}}(n,r,s);if(o)return{...o,descendants:o.root===o.self?await L(n,o.root,r):[o.self]}}async function L(n,r,s){const o=[r],i=r.packageJson.workspaces;if(!Array.isArray(i))return o;const a=[],c=[];for(const n of i.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):a.push(n);c.push(...await l(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&o.push(new J(r,n,s));return o}const U=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),M=U?"bun --bun run":"node",G=U?"bun":"yarn",q=U?"bun --bun run":"yarn",H={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(n){await async function(n,r){const s=z(n,!0,r);if(!s)return console.error(d.red("No project found.")),!0;if(n={...n,command:n.command??(U?"bun run build":"yarn build")},!e.existsSync(t.join(s.rootDirPath,".git")))return K(s,n),!0;const[i,a,l]=await async function(n,r){const s=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await e.promises.mkdir(s,{recursive:!0});const a=c("sha256"),d=o.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!X.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(l),await async function(e,t,n){return new Promise(r=>{const s=o.spawnSync("git",["diff","--name-only"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(Q.some(t=>e.includes(t))||Z.some(t=>e.endsWith(t)))&&!ee.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${s.join(", ")}`);const i=o.spawn("git",["diff","--",...s],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,a);const u=a.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(s,n);if(i)return console.info(d.green(`Skip to run '${n.command}' 💫`)),!1;if(!K(s,n))return;n.dryRun||await e.promises.writeFile(a,l,"utf8");return!0}(n)}};function K(e,t){if(console.info(d.green(`Run '${t.command}'`)),!t.dryRun){const n=o.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const X=new Set(["CI","PWDEBUG","TMPDIR"]);const Q=["src/","public/"],Z=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],ee=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const te={command:"kill-port-if-non-ci",describe:"Kill the port specified by PORT environment variable if non-CI.",builder:{},async handler(e){await async function(){if(V(process.env.CI))return void console.info(`Skip killing port due to CI: ${process.env.CI}`);const e=process.env.PORT,t=Number(e);(!Number.isInteger(t)||t<=0)&&(console.error(d.red(`PORT environment variable is invalid: ${e}`)),process.exit(1));console.info(`Killing the port: ${t}`);try{await p(t)}catch{}}()}};const ne=new Set;async function re(e){try{await p(e)}catch{}}const se=new m,oe={exitIfFailed:!0};async function ie(e,t,n,r=oe){const[s,o]=ce(e,t);if(de(s,t),n.verbose&&de(o,t,"Start (raw)",!0),n.dryRun)return le(s,0,r),0;const i=/http-get:\/\/127.0.0.1:(\d+)/.exec(o)?.[1];o.includes("wait-on")&&i&&!o.includes("docker run")&&await async function(e){await re(e);const t=async()=>{ne.has(e)||(ne.add(e),await re(e))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,t)}(Number(i));const a=await v(o,void 0,{cwd:t.dirPath,env:ue(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return le(s,a.status,r),a.status??1}function ae(e,t,n,r=oe){return se.runAndWaitForReturnValue(async()=>{const[s,o]=ce(e,t);if(de(s,t,"Start (parallel)",!0),n.dryRun)return de(s,t,"Started (log)"),n.verbose&&de(o,t,"Started (raw)",!0),le(s,0,r),0;const i=await v(o,void 0,{cwd:t.dirPath,env:ue(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});de(s,t,"Started (log)"),n.verbose&&de(o,t,"Started (raw)",!0);const a=i.stdout.trim();return a&&(process.stdout.write(a),process.stdout.write("\n")),le(s,i.status,r),i.status??1})}function ce(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",U?"bun --bun run ":"yarn run ");U&&(n=n.replaceAll("YARN build-ts run","bun --bun run").replaceAll("bun --bun run bun --bun run","bun --bun run").replaceAll("dist/index.js","src/index.ts").replaceAll(/(?:YARN )?vitest run/g,"bun test").replaceAll(/ --color --passWithNoTests(?: --allowOnly)?/g,"")),n=n.trim();const r=pe(n.replaceAll("YARN ",`${q} `)),s=pe(n.replaceAll("YARN playwright ",`${q} playwright `).replaceAll("YARN ",!U&&t.binExists?"":`${q} `));return[`dotenv${t.env.WB_ENV?` --cascade-env=${t.env.WB_ENV||"development"}`:""} ${r}`,s]}function de(e,t,n="Start",r=!1){console.info("\n"+(r?d.gray:d.cyan)(d.bold(`${n}:`),e)+d.gray(` at ${t.dirPath}`))}function le(e,t,n){0===t?console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function ue(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function pe(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const me=new Set(["cjs","cts","js","json","jsonc","jsx","mjs","mts","ts","tsx"]),fe=new Set(["cjs","cts","htm","html","js","json","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),he=new Set([...fe].filter(e=>!me.has(e))),ge={command:"lint [files...]",describe:"Lint code on Bun",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"}},async handler(e){U||(console.error(d.red("This command is only available on Bun.")),process.exit(1));const n=await Y(e,!1);n||(console.error(d.red("No project found.")),process.exit(1));const r=e.files??[];let s,o,i;if(r.length>0){const e=[],n=[],a=[];for(const s of r){const r=t.resolve(String(s));if(r.endsWith("/test/fixtures")||r.includes("/test/fixtures/")||r.endsWith("/test-fixtures")||r.includes("/test-fixtures/"))continue;const o=t.extname(r).slice(1);r.endsWith("/package.json")?a.push(r):me.has(o)?e.push(r):fe.has(o)&&n.push(r)}s=e.map(e=>`"${e}"`).join(" "),o=n.map(e=>`"${e}"`).join(" "),i=a.map(e=>`"${e}"`).join(" ")}else s="",o=`"**/{.*/,}*.{${[...he].join(",")}}" "!**/test{-,/}fixtures/**"`,i=n.descendants.map(e=>`"${e.packageJsonPath}"`).join(" ");const a=e.fix&&e.format?"check --fix":e.fix?"lint --fix":e.format?"format --fix":"lint";let c;(s||0===r.length)&&(c=ae(`bun --bun biome ${a} --colors=force --no-errors-on-unmatched --files-ignore-unknown=true ${s}`,n.self,e,{forceColor:!0})),e.format&&(o&&ae(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${o}`,n.self,e,{forceColor:!0}),i&&(await c,ae(`bun --bun sort-package-json ${i}`,n.self,e,{forceColor:!0})))}};function*be(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const ye={command:"optimizeForDockerBuild",describe:"Optimize configuration when building a Docker image",builder:{outside:{description:"Whether the optimization is executed outside a docker container or not",type:"boolean",alias:"o"}},async handler(n){const r=await Y(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const s of be("optimizeForDockerBuild",r.descendants)){const r=s.packageJson,o=["dependencies","devDependencies"];for(const e of o){const t=r[e]??{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(ve(n,r),we(r),$e(r),n.dryRun)continue;const i=n.outside?t.join(s.dirPath,"dist"):s.dirPath;await e.promises.mkdir(i,{recursive:!0}),await e.promises.writeFile(t.join(i,"package.json"),JSON.stringify(r),"utf8")}n.dryRun||n.outside||(o.spawnSync(G,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function ve(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["artillery","biome","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],s=[];for(const e of Object.keys(n))(r.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete n[e],s.push(e));console.info("Removed devDependencies:",s.join(", ")||"none")}function we(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts??{},s=[];for(const[e,o]of Object.entries(r))(t.some(t=>e.startsWith(t))||n.some(e=>o.includes(e)||o.trim()===e.trim()))&&(delete r[e],s.push(e));console.info("Removed scripts:",s.join(", ")||"none")}function $e(e){delete e.private,delete e.publishConfig,delete e.prettier}const ke=new class{deploy(e,t=""){return"PRISMA migrate deploy"+(t?` ${t}`:"")}deployForce(e,t){const n=e.packageJson.dependencies?.blitz?"db":"prisma";return`rm -Rf ${n}/mount/prod.sqlite3*; PRISMA migrate reset --force && rm -Rf ${n}/mount/prod.sqlite3*\n && litestream restore -o ${n}/mount/prod.sqlite3 ${t} && ls -ahl ${n}/mount/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}litestream(e){return`${M} -e '\nconst { PrismaClient } = require("@prisma/client");\nnew PrismaClient().$queryRaw\`PRAGMA journal_mode = WAL;\`\n .catch((error) => { console.log("Failed due to:", error); process.exit(1); });\n'`}migrate(e,t=""){return`PRISMA migrate deploy${t?` ${t}`:""} && PRISMA generate && ${this.seed(e)}`}migrateDev(e,t=""){return"PRISMA migrate dev"+(t?` ${t}`:"")}reset(e,t=""){return`PRISMA migrate reset --force --skip-seed${t?` ${t}`:""} && ${this.seed(e)}`}restore(e,t,n){return`rm -Rf ${e.packageJson.dependencies?.blitz?"db":"prisma"}/restored.sqlite3; GOOGLE_APPLICATION_CREDENTIALS=gcp-sa-key.json litestream restore -o ${n} ${t}`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(n,r,s=""){const o="file:";let i="";if(r)try{new URL(r),i=`DATABASE_URL=${r} `}catch{i=`DATABASE_URL=${o}${t.resolve(r)} `}else if(n.env.DATABASE_URL?.startsWith(o)){const r=[{schemaPath:t.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:t.join("prisma","schema"),dbPath:t.join("prisma","schema")},{schemaPath:t.join("db","schema.prisma"),dbPath:"db"}];for(const{dbPath:s,schemaPath:a}of r)if(e.existsSync(t.resolve(n.dirPath,a))){i=`DATABASE_URL=${o}${t.resolve(n.dirPath,s,n.env.DATABASE_URL.slice(5))} `;break}}return`${i}PRISMA studio${s?` ${s}`:""}`}},Ee={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"},"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}},Ne={},Ae={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(Pe).command(Re).command(je).command(Se).command(Oe).command(De).command(Te).command(_e).command(Be).command(Ce).demandCommand().strict(!1),handler(){}},Pe={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Ne,async handler(e){const t=await Ie(e),n=We(e);for(const r of be("prisma deploy",t))await ie(ke.deploy(r,n),r,e)}},xe={...Ne,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},Re={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:xe,async handler(e){const t=await Ie(e);for(const n of be("prisma deploy-force",t))await ie(ke.deployForce(n,e.backupPath),n,e)}},je={command:"litestream",describe:"Setup DB for Litestream",builder:Ne,async handler(e){const t=await Ie(e);for(const n of be("prisma litestream",t))await ie(ke.litestream(n),n,e)}},Se={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Ne,async handler(e){const t=await Ie(e),n=We(e);for(const r of be("prisma migrate",t))await ie(ke.migrate(r,n),r,e)}},Oe={command:"migrate-dev",describe:"Create a migration file",builder:Ne,async handler(e){const t=await Ie(e),n=We(e);for(const r of be("prisma migrate-dev",t))await ie(ke.migrateDev(r,n),r,e)}},De={command:"reset",describe:"Reset DB",builder:Ne,async handler(e){const t=await Ie(e),n=We(e);for(const r of be("prisma reset",t))await ie(ke.reset(r,n),r,e)}},Te={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...xe,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await Ie(e);for(const n of be("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await ie(ke.restore(n,e.backupPath,t),n,e)}}},_e={command:"seed",describe:"Populate DB with seed data",builder:{...Ne,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await Ie(e);for(const n of be("prisma seed",t))await ie(ke.seed(n,e.file),n,e)}},Be={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...Ne,"db-url-or-path":{description:"URL or path to the database",type:"string"},restored:{description:"Whether to open the default restored database (<db|prisma>/restored.sqlite3).",type:"boolean"}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw new Error("You cannot specify both --restored and --db-url-or-path.");const t=await Ie(e),n=We(e,["db-url-or-path","restored"]);for(const r of be("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await ie(ke.studio(r,t,n),r,e)}}},Ce={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await Ie(e),n=[(e.args?.join(" ")??"").trimEnd(),We(e,["args"])].filter(Boolean).join(" ");for(const r of be(`prisma ${n}`,t))await ie(`PRISMA ${n}`,r,e)}};async function Ie(e){const t=await Y(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=t.descendants.filter(e=>e.packageJson.dependencies?.prisma??e.packageJson.devDependencies?.prisma);return 0===n.length&&(console.error(d.red("No prisma project found.")),process.exit(1)),n}function We(e,t=[]){const n=[],r=Object.keys(Ee),s=Object.values(Ee).flatMap(e=>"alias"in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),o=new Set([...t,...r,...s,"_","$0"]);for(const[t,r]of Object.entries(e))if(!o.has(t)){const s=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(s!==t&&void 0!==e[s])continue;if("boolean"==typeof r&&r)n.push(`--${t}`);else if("string"==typeof r||"number"==typeof r)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(const e of r)n.push(`--${t}`,String(e))}return n.join(" ")}const Ve={command:"retry [command] [args...]",describe:"Retry the given command until it succeeds",builder:{retry:{description:"A maximum retry count",type:"number",alias:"r",default:3}},async handler(e){const t=z(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let s=0;s<e.retry;s++)if(s>0&&console.info(`\n${d.yellow(`#${s} Retrying: ${n.join(" ")}`)}`),r=await ie(n.join(" "),t,e,{exitIfFailed:!1}),0===r)return;process.exit(r)}},Fe={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await Y(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of be("setup",n.descendants)){const r=await f.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===h.platform()){const n=["pstree"];t.hasDockerfile&&n.push("expect"),await ae(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await ie("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await ae("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await ae(`poetry env use ${n}`,t,e),await se.promiseAll(),await ie("poetry run pip install --upgrade pip",t,e),await ie("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await ie(`${q} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await ie(`${q} playwright install --with-deps`,r,e)}(e)}};function Je(e){return e.silent?" > /dev/null":""}async function ze(e=3e3,t=100){for(let n=e;n<e+t;n++)if(await Ye(n))return n;throw new Error(`No available port found in range ${e}-${e+t-1}`)}async function Ye(e){return new Promise(t=>{const n=g();n.once("error",e=>{e.code,t(!1)}),n.once("listening",()=>{n.close(()=>{t(!0)})}),n.listen(e,"127.0.0.1")})}const Le=new class{buildDevImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)\n --build-arg WB_ENV=${e.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t=!1,n="",r=""){return`${this.stop(e)} && ${t?"unbuffer ":""}${this.start(e,n,r)}`}start(e,t="",n=""){return function(e,t){const n=()=>{if(ne.has(e))return;ne.add(e),de(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});le(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e),`docker run --rm -it -p \${PORT:-8080}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class Ue{buildDocker(e,t="development"){return Le.buildDevImage(e,t)}startDocker(e,t){const n=Number(e.env.PORT)||8080;return`${this.buildDocker(e)}${Je(t)}\n && YARN concurrently --raw --kill-others-on-fail\n "${Le.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n="test test/e2e/",prismaDirectory:r,startCommand:s}){const o=e.env.WB_ENV,i=e.env.PORT||"8080",a=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",c=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/",d=`WB_ENV=${o} NEXT_PUBLIC_WB_ENV=${o} APP_ENV=${o} PORT=${i}`,l=n.startsWith("test ")?`BUN playwright ${n}`:`BUN playwright test ${c}`;if(e.skipLaunchingServerForPlaywright)return`${d} ${l}${a}`;return`${d} YARN concurrently --kill-others --raw --success first\n "${r?`rm -Rf ${r}/mount && `:""}${s} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${i}\n && ${l}${a}"`}testE2EDev(e,t,{playwrightArgs:n="test test/e2e/",startCommand:r}){const s=e.env.WB_ENV,o=e.env.PORT||"8080",i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",a=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/",c=`WB_ENV=${s} NEXT_PUBLIC_WB_ENV=${s} APP_ENV=${s} PORT=${o}`,d=n.startsWith("test ")?`BUN playwright ${n}`:`BUN playwright test ${a}`;return e.skipLaunchingServerForPlaywright?`${c} ${d}${i}`:`${c} YARN concurrently --kill-others --raw --success first\n "${r} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o}\n && ${d}${i}"`}testUnit(e,t){const n=t.targets&&t.targets.length>0?t.targets.join(" "):"test/unit/";return e.hasVitest?`WB_ENV=${e.env.WB_ENV} YARN vitest run ${n} --color --passWithNoTests --allowOnly`:e.isBunAvailable?`WB_ENV=${e.env.WB_ENV} bun test ${n}`:'echo "No tests."'}waitApp(e,t,n=e.env.PORT||3e3){return`wait-on -t 10000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 90000 -i 10000 http-get://127.0.0.1:${n}`}waitAndOpenApp(e,t,n=e.env.PORT||3e3){return`${this.waitApp(e,t,n)} || wait-on http-get://127.0.0.1:${n} && open-cli http://\${HOST:-localhost}:${n}`}}const Me=new class extends Ue{start(e,t){const n=e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:"",r=Number(e.env.PORT)||3e3;return`${n}YARN concurrently --raw --kill-others-on-fail\n "blitz dev -p ${r} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,r)}"`}startProduction(e,t,n){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[ke.migrate(e),e.buildCommand,`PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}startTest(e,t){const n=Number(e.env.PORT)||8080;return`YARN concurrently --raw --kill-others-on-fail\n "${[...ke.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Je(t)}`).join(" && ")}"\n "${this.waitApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...ke.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Je(t)}`).join(" && ")})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r}){const s=`blitz dev -p ${e.env.PORT||"8080"}${Je(t)}`;return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r??s})}async testStart(e,t){const n=await ze();return`WB_ENV=${e.env.WB_ENV} YARN concurrently --kill-others --raw --success first "blitz dev -p ${n}${Je(t)}" "${this.waitApp(e,t,n)}"`}};const Ge=new class extends Ue{start(e,t){return`PORT=${Number(e.env.PORT)||3e3} YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)}${Je(t)} && ${Le.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand}${Je(t)} && NODE_ENV=production PORT=\${PORT:-${n}} ${M} dist/index.js ${t.normalizedArgsText??""}`}startTest(e,t){return`${e.hasPrisma?"prisma migrate reset --force --skip-generate && ":""}(${this.startProduction(e,t)})`}testE2E(e,t,n={}){const{startCommand:r=`${e.hasPrisma?"prisma migrate reset --force --skip-generate && ":""}(${this.startProduction(e,t)})`}=n,s=e.env.PORT||"8080",o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=${s} YARN concurrently --kill-others --raw --success first\n "${r} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s} && vitest run ${i} --color --passWithNoTests --allowOnly${o}"`}testE2EDev(e,t,n={}){const{startCommand:r}=n,s=e.env.PORT||"8080",o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=${s} YARN concurrently --kill-others --raw --success first\n "${r??this.start(e,t)} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s} && vitest run ${i} --color --passWithNoTests --allowOnly${o}"`}async testStart(e,t){const n=await ze();return`WB_ENV=${e.env.WB_ENV} PORT=${n} YARN concurrently --kill-others --raw --success first "${this.start(e,t)}" "${this.waitApp(e,t,n)}"`}};const qe=new class extends Ue{start(e,t){const n=Number(e.env.PORT)||3e3;return`YARN concurrently --raw --kill-others-on-fail\n "next dev --turbopack -p ${n} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?[ke.migrate(e)]:[],e.buildCommand,`PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}startTest(e,t){const n=Number(e.env.PORT)||8080;return`YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?ke.reset(e).split("&&"):[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Je(t)}`).join(" && ")}"\n "${this.waitApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...e.hasPrisma?ke.reset(e).split("&&"):[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Je(t)}`).join(" && ")})}testE2EDev(e,t,{startCommand:n}){const r=`next dev --turbopack -p ${e.env.PORT||"8080"}${Je(t)}`;return super.testE2EDev(e,t,{startCommand:n??r})}async testStart(e,t){const n=await ze();return`WB_ENV=${e.env.WB_ENV} YARN concurrently --kill-others --raw --success first "next dev --turbopack -p ${n}${Je(t)}" "${this.waitApp(e,t,n)}"`}};const He=new class extends Ue{start(e,t){return`PORT=${Number(e.env.PORT)||3e3} YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)}${Je(t)} && ${Le.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${M} dist/index.js ${t.normalizedArgsText??""}`}startTest(){return"echo 'do nothing.'"}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return Promise.resolve("echo 'do nothing.'")}};const Ke=new class extends Ue{start(e,t){const n=Number(e.env.PORT)||3e3;return`PORT=${n} YARN concurrently --raw --kill-others-on-fail\n "remix dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${ke.migrate(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}startTest(e,t){const n=Number(e.env.PORT)||8080;return`YARN concurrently --raw --kill-others-on-fail\n "${[...ke.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Je(t)}`).join(" && ")}"\n "${this.waitApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"prisma",startCommand:n.startCommand??[...ke.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Je(t)}`).join(" && ")})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r=`remix dev${Je(t)}`}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r})}async testStart(e,t){const n=await ze();return`WB_ENV=${e.env.WB_ENV} PORT=${n} YARN concurrently --kill-others --raw --success first "remix dev${Je(t)}" "${this.waitApp(e,t,n)}"`}},Xe=["express","fastify","elysia","hono"],Qe={command:"start [args..]",describe:"Start app",builder:{watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug | test",type:"string",alias:"m"}},async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[]].map(e=>`'${e}'`).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>`'${e}'`).join(" ")}(e);const t=await Y(e);t||(console.error(d.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let s;if(t.blitz)s=Me;else if(t.next)s=qe;else if(r["@remix-run/dev"])s=Ke;else if(Xe.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))s=Ge;else{if(!t["build-ts"]&&!r["build-ts"])continue;s=He}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":{const r=Ze(t,"development");await ie(`${r}${s.start(n,e)}`,n,e);break}case"staging":{const r=Ze(t,"staging"),o=Number(n.env.PORT)||8080;await ie(`${r}${s.startProduction(n,e,o)}`,n,e);break}case"docker":{const r=Ze(t,"staging");await ie(`${r}${s.startDocker(n,e)}`,n,e);break}case"docker-debug":{const r=Ze(t,"staging");e.normalizedArgsText="'/bin/bash'",await ie(`${r}${s.startDocker(n,e)}`,n,e);break}case"test":{const r=Ze(t,"test");await ie(`${r}${s.startTest(n,e)}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function Ze(e,t){process.env.WB_ENV||=t;let n=`WB_ENV=${process.env.WB_ENV} `;return e.next&&(process.env.NEXT_PUBLIC_WB_ENV=process.env.WB_ENV,n+=`NEXT_PUBLIC_WB_ENV=${process.env.WB_ENV} `),n}const et={command:"test [targets...]",describe:"Test project. If you pass no arguments, it will run all tests.",builder:{e2e:{description:"E2e test mode: headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string",choices:["headless","headless-dev","headed","headed-dev","docker","docker-debug","debug","generate","trace"],default:"headless"},silent:{description:"Reduce redundant outputs",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"},targets:{description:"Test target paths",type:"array"}},async handler(n){await async function(n){const r=await Y(n);r||(console.error(d.red("No project found.")),process.exit(1));r.descendants.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const s=n.targets??[],o=0===s.length,i=s.some(e=>e.includes("/e2e")),a=s.some(e=>e.includes("/unit")),c=o||a,l=o||i;for(const o of r.descendants){const r=o.packageJson.dependencies??{},i=o.packageJson.devDependencies??{};let a;if(a=r.blitz?Me:r.next?qe:i["@remix-run/dev"]?Ke:Xe.some(e=>r[e])&&!r["firebase-functions"]?Ge:He,console.info(`Running "test" for ${o.name} ...`),c&&e.existsSync(t.join(o.dirPath,"test","unit"))){const e=s.filter(e=>e.includes("/unit")),t={...n,targets:e.length>0?e:void 0};await ie(a.testUnit(o,t),o,n,{timeout:n.unitTimeout})}if(!l||!e.existsSync(t.join(o.dirPath,"test","e2e")))continue;const d=s.filter(e=>e.includes("/e2e")),u={...n,targets:d.length>0?d:void 0};switch(n.e2e){case"headless":await ie(a.testE2E(o,u,{}),o,n);continue;case"headless-dev":await ie(a.testE2EDev(o,u,{}),o,n);continue;case"docker":await tt(o,u,a);continue;case"docker-debug":{const e=d.length>0?d.join(" "):"test/e2e/";await tt(o,u,a,`test ${e} --debug`);continue}}if(r.blitz||r.next||i["@remix-run/dev"]){const e=d.length>0?d.join(" "):"test/e2e/";switch(n.e2e){case"headed":await ie(a.testE2E(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"headed-dev":await ie(a.testE2EDev(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"debug":await ie(a.testE2E(o,u,{playwrightArgs:`test ${e} --debug`}),o,n);break;case"generate":{const e=o.env.PORT||"8080";await ie(a.testE2E(o,u,{playwrightArgs:`codegen http://localhost:${e}`}),o,n);break}case"trace":await ie("BUN playwright show-trace",o,n)}}}}(n)}};async function tt(e,t,n,r){process.env.WB_DOCKER??="1",await ie(`${n.buildDocker(e,"test")}${Je(t)}`,e,t),process.exitCode=await ie(n.testE2E(e,t,{playwrightArgs:r,startCommand:`${Le.stopAndStart(e,!0)}${Je(t)}`}),e,t,{exitIfFailed:!1}),await ie(Le.stop(e),e,t)}const nt={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{},async handler(n){await async function(n){const r=await Y(n);r||(console.error(d.red("No project found.")),process.exit(1));process.env.CI||="1",process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const s of r.descendants){const r=s.packageJson.dependencies??{},o=s.packageJson.devDependencies??{};let i;if(i=r.blitz?Me:r.next?qe:o["@remix-run/dev"]?Ke:Xe.some(e=>r[e])&&!r["firebase-functions"]?Ge:He,console.info(`Running "test-on-ci" for ${s.name} ...`),await ae(Le.stopAll(),s,n),e.existsSync(t.join(s.dirPath,"test","unit"))&&await ae(i.testUnit(s,n).replaceAll(" --allowOnly",""),s,n),await ae(await i.testStart(s,n),s,n),await se.promiseAll(),e.existsSync(t.join(s.dirPath,"test","e2e"))){s.hasDockerfile&&(process.env.WB_DOCKER??="1",await ie(`${i.buildDocker(s,"test")}${Je(n)}`,s,n));const e=s.hasDockerfile?{startCommand:Le.stopAndStart(s,!0)}:{};process.exitCode=await ie(i.testE2E(s,n,e).replaceAll(" --allowOnly",""),s,n,{exitIfFailed:!1}),await ie(Le.stop(s),s,n)}}}(n)}};const rt={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await Y(n,!1);r||(console.error(d.red("No project found.")),process.exit(1));const s=r.descendants.map(async s=>{const o=[];for(s.packageJson.workspaces?s.hasSourceCode&&(s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&o.push("BUN tsc --noEmit --Pretty"):((s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&o.push("BUN tsc --noEmit --Pretty"),s.packageJson.devDependencies?.pyright&&o.push("YARN pyright"));o.length>0;){const i=await ae(o.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),a=t.join(s.dirPath,".next");if(!i||!e.existsSync(a))return i;e.rmSync(a,{force:!0,recursive:!0}),console.info(d.yellow("Removed `.next` directory. We will re-try type checking."))}}),o=await Promise.all(s);let i=0;for(const[e,t]of o.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(d.yellow('Please try "yarn gen-code" if you face unknown type errors.')),i=t}i&&process.exit(i)}},st={...rt,command:"tc"};await r(s(process.argv)).scriptName("wb").options(Ee).middleware(e=>{const n=e["working-dir"];if(n){const e=t.resolve(n);process.chdir(e)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)}).command(H).command(te).command(ge).command(ye).command(Ae).command(Ve).command(Fe).command(Qe).command(et).command(nt).command(rt).command(st).demandCommand().strict().version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).help().argv;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{n(process.pid),process.exit()});
10
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2xpbnQudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ByaXNtYS50cyIsIi4uL3NyYy9jb21tYW5kcy9yZXRyeS50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cC50cyIsIi4uL3NyYy9zY3JpcHRzL2J1aWxkZXIudHMiLCIuLi9zcmMvdXRpbHMvZmluZFBvcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9kb2NrZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9jb21tYW5kcy9zdGFydC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3RPbkNpLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3R5cGVjaGVjay50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICBlbnY6IHtcbiAgICBkZXNjcmlwdGlvbjogJy5lbnYgZmlsZXMgdG8gYmUgbG9hZGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgJ2Nhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0Vudmlyb25tZW50IHRvIGxvYWQgY2FzY2FkaW5nIC5lbnYgZmlsZXMgKGUuZy4sIGAuZW52YCwgYC5lbnYuPGVudmlyb25tZW50PmAsIGAuZW52LmxvY2FsYCBhbmQgYC5lbnYuPGVudmlyb25tZW50Pi5sb2NhbGApLiBQcmVmZXJyZWQgb3ZlciBgY2FzY2FkZS1ub2RlLWVudmAgYW5kIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICAnY2FzY2FkZS1ub2RlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LiBQcmVmZXJyZWQgb3ZlciBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdhdXRvLWNhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PFdCX0VOViB8fCBOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdpbmNsdWRlLXJvb3QtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSAuZW52IGZpbGVzIGluIHJvb3QgZGlyZWN0b3J5IGlmIHRoZSBwcm9qZWN0IGlzIGluIGEgbW9ub3JlcG8gYW5kIC0tZW52IG9wdGlvbiBpcyBub3QgdXNlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnY2hlY2stZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ2hlY2sgd2hldGhlciB0aGUga2V5cyBvZiB0aGUgbG9hZGVkIC5lbnYgZmlsZXMgYXJlIHNhbWUgd2l0aCB0aGUgZ2l2ZW4gLmVudiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy5lbnYuZXhhbXBsZScsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzLlxuICogTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogQHJldHVybiBbZW52VmFycywgW2VudlBhdGhzLCBlbnZWYXJDb3VudF1bXV1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIFtzdHJpbmcsIG51bWJlcl1bXV0ge1xuICBsZXQgZW52UGF0aHMgPSAoYXJndi5lbnYgPz8gW10pLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgZW52UGF0aC50b1N0cmluZygpKSk7XG4gIGNvbnN0IGNhc2NhZGUgPVxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudlxuICAgICAgICA/IHByb2Nlc3MuZW52LldCX0VOViB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBjYXNjYWRlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChlbnZQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKGN3ZCwgJy5lbnYnKSk7XG4gICAgICBpZiAoYXJndi5pbmNsdWRlUm9vdEVudikge1xuICAgICAgICBjb25zdCByb290UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsICcuLicsICcuLicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdFBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihyb290UGF0aCwgJy5lbnYnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aHMgPSBlbnZQYXRocy5mbGF0TWFwKChlbnZQYXRoKSA9PlxuICAgICAgY2FzY2FkZVxuICAgICAgICA/IFtgJHtlbnZQYXRofS4ke2Nhc2NhZGV9LmxvY2FsYCwgYCR7ZW52UGF0aH0ubG9jYWxgLCBgJHtlbnZQYXRofS4ke2Nhc2NhZGV9YCwgZW52UGF0aF1cbiAgICAgICAgOiBbYCR7ZW52UGF0aH0ubG9jYWxgLCBlbnZQYXRoXVxuICAgICk7XG4gIH1cbiAgZW52UGF0aHMgPSBlbnZQYXRocy5maWx0ZXIoKGVudlBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZW52UGF0aCkpLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMuam9pbignLCAnKSk7XG4gIH1cblxuICBjb25zdCBlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlyczogW3N0cmluZywgbnVtYmVyXVtdID0gW107XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBlbnZQYXRoKSkpKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZW52VmFycykpIHtcbiAgICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzLnB1c2goW2VudlBhdGgsIGNvdW50XSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiBjb3VudCA+IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUmVhZCAke2NvdW50fSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykpO1xuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIFske2VudlBhdGhzLmpvaW4oJywgJyl9XTogWyR7bWlzc2luZ0tleXMuam9pbignLCAnKX1dYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbZW52VmFycywgZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnNdO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMgYW5kIGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICBPYmplY3QuYXNzaWduKHByb2Nlc3MuZW52LCBlbnZWYXJzKTtcbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbmNvbnN0IGNhY2hlZEVudlZhcnMgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcblxuZnVuY3Rpb24gcmVhZEVudkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZWRFbnZWYXJzLmdldChmaWxlUGF0aCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgcGFyc2VkID0gY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGZpbGVQYXRoKSwgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IHt9O1xuICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbGF0ZWQgdG8gbnBtIGFuZCB5YXJuIGZyb20gdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiB2b2lkIHtcbiAgLy8gUmVtb3ZlIG5wbSAmIHlhcm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcHJvY2Vzcy5lbnZcbiAgaWYgKGVudlZhcnMuUEFUSCAmJiBlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnZWYXJzLlBBVEggPSBlbnZWYXJzLlBBVEgucmVwbGFjZShgJHtlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiBtYWNPU1xuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ByaXZhdGVcXC92YXJcXC9mb2xkZXJzXFwvW146XSs6L2csICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGluIExpbnV4XG4gICAgICAucmVwbGFjZUFsbCgvXFwvdmFyXFwvdG1wXFwvW146XSs6L2csICcnKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3RtcFxcL1teOl0rOi9nLCAnJyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICBjb25zdCB1cHBlcktleSA9IGtleS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ05QTV8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnWUFSTl8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnQkVSUllfJykgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnUFJPSkVDVF9DV0QnIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ0lOSVRfQ1dEJ1xuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgU3Bhd25PcHRpb25zLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlLFxuICBTcGF3blN5bmNSZXR1cm5zLFxuICBTdGRpb051bGwsXG4gIFN0ZGlvUGlwZSxcbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHRyZWVLaWxsIGZyb20gJ3RyZWUta2lsbCc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIGFzeW5jaHJvbm91c2x5IGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0c1xuICpcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBQcm9taXNlLWJhc2VkIHdyYXBwZXIgYXJvdW5kIE5vZGUuanMncyBzcGF3biBmdW5jdGlvbiB3aXRoIGFkZGl0aW9uYWwgZmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBlbmNvZGluZyBvZiBzdGRvdXQvc3RkZXJyIGFzIFVURi04XG4gKiAtIE9wdGlvbiB0byBtZXJnZSBzdGRlcnIgaW50byBzdGRvdXRcbiAqIC0gT3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkga2lsbCB0aGUgcHJvY2VzcyBvbiBwYXJlbnQgZXhpdFxuICogLSBPcHRpb24gdG8gcHJvdmlkZSBpbnB1dCB2aWEgc3RkaW5cbiAqIC0gVmVyYm9zZSBsb2dnaW5nIGNhcGFiaWxpdHlcbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIHJ1blxuICogQHBhcmFtIGFyZ3MgLSBMaXN0IG9mIHN0cmluZyBhcmd1bWVudHNcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzIGluY2x1ZGluZyBwaWQsIHN0ZG91dCwgc3RkZXJyLCBzdGF0dXMsIGFuZCBzaWduYWxcbiAqIEB0aHJvd3MgV2lsbCByZWplY3QgdGhlIHByb21pc2UgaWYgdGhlIHByb2Nlc3MgZmFpbHMgdG8gc3Bhd24gb3IgZW5jb3VudGVycyBhbiBlcnJvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzcGF3bkFzeW5jKCdscycsIFsnLWxhJ10sIHsgdmVyYm9zZTogdHJ1ZSB9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5zdGRvdXQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzcGF3bkFzeW5jKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M/OiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3Rkb3V0Py5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3Rkb3V0KSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHN0b3BQcm9jZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc3RvcHBlZCB8fCAhcHJvYy5waWQpIHJldHVybjtcblxuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYHRyZWVLaWxsKCR7cHJvYy5waWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucz8ua2lsbE9uRXhpdCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICB9XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zPy5pbnB1dCkge1xuICAgICAgICBwcm9jLnN0ZGluPy53cml0ZShvcHRpb25zLmlucHV0KTtcbiAgICAgICAgcHJvYy5zdGRpbj8uZW5kKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiLyoqXG4gKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4zXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5jb25zdCB0PVsuLi5cIjAxMjM0NTY3ODlhYmNkZWZcIl0scz1bNiwxNTM2LDM5MzIxNiwxMDA2NjMyOTZdLGk9WzAsOCwxNiwyNF0sZT1bMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF07ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbmV3IGgoNTEyLHMsNTEyKS51cGRhdGUodCkuaGV4KCl9Y29uc3Qgbj10PT57Y29uc3Qgcz1bXTtmb3IoY29uc3RbaSxlXW9mIHQuZW50cmllcygpKXNbaV09ZTtyZXR1cm4gc307Y2xhc3MgaHtibG9ja3M9W107cz1bXTtyZXNldD0hMDtmaW5hbGl6ZWQ9ITE7YmxvY2s9MDtzdGFydD0wO2xhc3RCeXRlSW5kZXg9MDtjb25zdHJ1Y3Rvcih0LHMsaSl7dGhpcy5wYWRkaW5nPXMsdGhpcy5vdXRwdXRCaXRzPWksdGhpcy5ibG9ja0NvdW50PTE2MDAtKHQ8PDEpPj41LHRoaXMuYnl0ZUNvdW50PXRoaXMuYmxvY2tDb3VudDw8Mix0aGlzLm91dHB1dEJsb2Nrcz1pPj41LHRoaXMuZXh0cmFCeXRlcz0oMzEmaSk+PjM7Zm9yKGxldCB0PTA7dDw1MDsrK3QpdGhpcy5zW3RdPTB9dXBkYXRlKHQpe2lmKHRoaXMuZmluYWxpemVkKXRocm93IG5ldyBFcnJvcihcImZpbmFsaXplIGFscmVhZHkgY2FsbGVkXCIpO2NvbnN0IHM9dGhpcy5ibG9ja3MsZT10aGlzLmJ5dGVDb3VudCxvPXQubGVuZ3RoLG49dGhpcy5ibG9ja0NvdW50LGg9dGhpcy5zO2xldCBsLGMsZj0wO2Zvcig7ZjxvOyl7aWYodGhpcy5yZXNldClmb3IodGhpcy5yZXNldD0hMSxzWzBdPXRoaXMuYmxvY2ssbD0xO2w8bisxOysrbClzW2xdPTA7Zm9yKGw9dGhpcy5zdGFydDtmPG8mJmw8ZTsrK2YpYz10LmNvZGVQb2ludEF0KGYpfHwwLGM8MTI4P3NbbD4+Ml18PWM8PGlbMyZsKytdOmM8MjA0OD8oc1tsPj4yXXw9KDE5MnxjPj42KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOmM8NTUyOTZ8fGM+PTU3MzQ0PyhzW2w+PjJdfD0oMjI0fGM+PjEyKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOihjPTY1NTM2KygoMTAyMyZjKTw8MTB8MTAyMyYodC5jb2RlUG9pbnRBdCgrK2YpfHwwKSksc1tsPj4yXXw9KDI0MHxjPj4xOCk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+MTImNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk7aWYodGhpcy5sYXN0Qnl0ZUluZGV4PWwsbD49ZSl7Zm9yKHRoaXMuc3RhcnQ9bC1lLHRoaXMuYmxvY2s9c1tuXSxsPTA7bDxuOysrbCloW2xdXj1zW2xdO3IoaCksdGhpcy5yZXNldD0hMH1lbHNlIHRoaXMuc3RhcnQ9bH1yZXR1cm4gdGhpc31maW5hbGl6ZSgpe2lmKHRoaXMuZmluYWxpemVkKXJldHVybjt0aGlzLmZpbmFsaXplZD0hMDtjb25zdCB0PXRoaXMuYmxvY2tzO2xldCBzPXRoaXMubGFzdEJ5dGVJbmRleDtjb25zdCBpPXRoaXMuYmxvY2tDb3VudCxlPXRoaXMucztpZih0W3M+PjJdfD10aGlzLnBhZGRpbmdbMyZzXSx0aGlzLmxhc3RCeXRlSW5kZXg9PT10aGlzLmJ5dGVDb3VudClmb3IodFswXT10W2ldLHM9MTtzPGkrMTsrK3MpdFtzXT0wO2Zvcih0W2ktMV18PTIxNDc0ODM2NDgscz0wO3M8aTsrK3MpZVtzXV49dFtzXTtyKGUpfWhleCgpe3RoaXMuZmluYWxpemUoKTtjb25zdCBzPXRoaXMuYmxvY2tDb3VudDtsZXQgaT10aGlzLnM7Y29uc3QgZT10aGlzLm91dHB1dEJsb2NrcyxvPXRoaXMuZXh0cmFCeXRlcztsZXQgaCxsPTAsYz0wLGY9XCJcIjtmb3IoO2M8ZTspe2ZvcihsPTA7bDxzJiZjPGU7KytsLCsrYyloPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdK3RbaD4+MTImMTVdK3RbaD4+OCYxNV0rdFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0rdFtoPj4yOCYxNV0rdFtoPj4yNCYxNV07YyVzPT09MCYmKGk9bihpKSxyKGkpLGw9MCl9cmV0dXJuIG8mJihoPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdLG8+MSYmKGYrPXRbaD4+MTImMTVdK3RbaD4+OCYxNV0pLG8+MiYmKGYrPXRbaD4+MjAmMTVdK3RbaD4+MTYmMTVdKSksZn19Y29uc3Qgcj1mdW5jdGlvbih0KXtsZXQgcyxpLG8sbixoLHIsbCxjLGYsYSx1LGQsYixrLHkseCxCLHAsQyx6LEksZyx3LEEsUCxFLGosbSxxLHYsRCxGLEcsSCxKLEssTCxNLE4sTyxRLFIsUyxULFUsVixXLFgsWSxaLCQsXyx0dCxzdCxpdCxldCxvdCxudCxodCxydCxsdCxjdCxmdDtmb3Iobz0wO288NDg7bys9MiluPXRbMF1edFsxMF1edFsyMF1edFszMF1edFs0MF0saD10WzFdXnRbMTFdXnRbMjFdXnRbMzFdXnRbNDFdLHI9dFsyXV50WzEyXV50WzIyXV50WzMyXV50WzQyXSxsPXRbM11edFsxM11edFsyM11edFszM11edFs0M10sYz10WzRdXnRbMTRdXnRbMjRdXnRbMzRdXnRbNDRdLGY9dFs1XV50WzE1XV50WzI1XV50WzM1XV50WzQ1XSxhPXRbNl1edFsxNl1edFsyNl1edFszNl1edFs0Nl0sdT10WzddXnRbMTddXnRbMjddXnRbMzddXnRbNDddLGQ9dFs4XV50WzE4XV50WzI4XV50WzM4XV50WzQ4XSxiPXRbOV1edFsxOV1edFsyOV1edFszOV1edFs0OV0scz1kXihyPDwxfGw+Pj4zMSksaT1iXihsPDwxfHI+Pj4zMSksdFswXV49cyx0WzFdXj1pLHRbMTBdXj1zLHRbMTFdXj1pLHRbMjBdXj1zLHRbMjFdXj1pLHRbMzBdXj1zLHRbMzFdXj1pLHRbNDBdXj1zLHRbNDFdXj1pLHM9bl4oYzw8MXxmPj4+MzEpLGk9aF4oZjw8MXxjPj4+MzEpLHRbMl1ePXMsdFszXV49aSx0WzEyXV49cyx0WzEzXV49aSx0WzIyXV49cyx0WzIzXV49aSx0WzMyXV49cyx0WzMzXV49aSx0WzQyXV49cyx0WzQzXV49aSxzPXJeKGE8PDF8dT4+PjMxKSxpPWxeKHU8PDF8YT4+PjMxKSx0WzRdXj1zLHRbNV1ePWksdFsxNF1ePXMsdFsxNV1ePWksdFsyNF1ePXMsdFsyNV1ePWksdFszNF1ePXMsdFszNV1ePWksdFs0NF1ePXMsdFs0NV1ePWkscz1jXihkPDwxfGI+Pj4zMSksaT1mXihiPDwxfGQ+Pj4zMSksdFs2XV49cyx0WzddXj1pLHRbMTZdXj1zLHRbMTddXj1pLHRbMjZdXj1zLHRbMjddXj1pLHRbMzZdXj1zLHRbMzddXj1pLHRbNDZdXj1zLHRbNDddXj1pLHM9YV4objw8MXxoPj4+MzEpLGk9dV4oaDw8MXxuPj4+MzEpLHRbOF1ePXMsdFs5XV49aSx0WzE4XV49cyx0WzE5XV49aSx0WzI4XV49cyx0WzI5XV49aSx0WzM4XV49cyx0WzM5XV49aSx0WzQ4XV49cyx0WzQ5XV49aSxrPXRbMF0seT10WzFdLFY9dFsxMV08PDR8dFsxMF0+Pj4yOCxXPXRbMTBdPDw0fHRbMTFdPj4+MjgsbT10WzIwXTw8M3x0WzIxXT4+PjI5LHE9dFsyMV08PDN8dFsyMF0+Pj4yOSxydD10WzMxXTw8OXx0WzMwXT4+PjIzLGx0PXRbMzBdPDw5fHRbMzFdPj4+MjMsUj10WzQwXTw8MTh8dFs0MV0+Pj4xNCxTPXRbNDFdPDwxOHx0WzQwXT4+PjE0LEg9dFsyXTw8MXx0WzNdPj4+MzEsSj10WzNdPDwxfHRbMl0+Pj4zMSx4PXRbMTNdPDwxMnx0WzEyXT4+PjIwLEI9dFsxMl08PDEyfHRbMTNdPj4+MjAsWD10WzIyXTw8MTB8dFsyM10+Pj4yMixZPXRbMjNdPDwxMHx0WzIyXT4+PjIyLHY9dFszM108PDEzfHRbMzJdPj4+MTksRD10WzMyXTw8MTN8dFszM10+Pj4xOSxjdD10WzQyXTw8Mnx0WzQzXT4+PjMwLGZ0PXRbNDNdPDwyfHRbNDJdPj4+MzAsc3Q9dFs1XTw8MzB8dFs0XT4+PjIsaXQ9dFs0XTw8MzB8dFs1XT4+PjIsSz10WzE0XTw8Nnx0WzE1XT4+PjI2LEw9dFsxNV08PDZ8dFsxNF0+Pj4yNixwPXRbMjVdPDwxMXx0WzI0XT4+PjIxLEM9dFsyNF08PDExfHRbMjVdPj4+MjEsWj10WzM0XTw8MTV8dFszNV0+Pj4xNywkPXRbMzVdPDwxNXx0WzM0XT4+PjE3LEY9dFs0NV08PDI5fHRbNDRdPj4+MyxHPXRbNDRdPDwyOXx0WzQ1XT4+PjMsQT10WzZdPDwyOHx0WzddPj4+NCxQPXRbN108PDI4fHRbNl0+Pj40LGV0PXRbMTddPDwyM3x0WzE2XT4+Pjksb3Q9dFsxNl08PDIzfHRbMTddPj4+OSxNPXRbMjZdPDwyNXx0WzI3XT4+PjcsTj10WzI3XTw8MjV8dFsyNl0+Pj43LHo9dFszNl08PDIxfHRbMzddPj4+MTEsST10WzM3XTw8MjF8dFszNl0+Pj4xMSxfPXRbNDddPDwyNHx0WzQ2XT4+PjgsdHQ9dFs0Nl08PDI0fHRbNDddPj4+OCxUPXRbOF08PDI3fHRbOV0+Pj41LFU9dFs5XTw8Mjd8dFs4XT4+PjUsRT10WzE4XTw8MjB8dFsxOV0+Pj4xMixqPXRbMTldPDwyMHx0WzE4XT4+PjEyLG50PXRbMjldPDw3fHRbMjhdPj4+MjUsaHQ9dFsyOF08PDd8dFsyOV0+Pj4yNSxPPXRbMzhdPDw4fHRbMzldPj4+MjQsUT10WzM5XTw8OHx0WzM4XT4+PjI0LGc9dFs0OF08PDE0fHRbNDldPj4+MTgsdz10WzQ5XTw8MTR8dFs0OF0+Pj4xOCx0WzBdPWtefngmcCx0WzFdPXlefkImQyx0WzEwXT1BXn5FJm0sdFsxMV09UF5+aiZxLHRbMjBdPUhefksmTSx0WzIxXT1KXn5MJk4sdFszMF09VF5+ViZYLHRbMzFdPVVeflcmWSx0WzQwXT1zdF5+ZXQmbnQsdFs0MV09aXRefm90Jmh0LHRbMl09eF5+cCZ6LHRbM109Ql5+QyZJLHRbMTJdPUVefm0mdix0WzEzXT1qXn5xJkQsdFsyMl09S15+TSZPLHRbMjNdPUxefk4mUSx0WzMyXT1WXn5YJlosdFszM109V15+WSYkLHRbNDJdPWV0Xn5udCZydCx0WzQzXT1vdF5+aHQmbHQsdFs0XT1wXn56JmcsdFs1XT1DXn5JJncsdFsxNF09bV5+diZGLHRbMTVdPXFefkQmRyx0WzI0XT1NXn5PJlIsdFsyNV09Tl5+USZTLHRbMzRdPVheflomXyx0WzM1XT1ZXn4kJnR0LHRbNDRdPW50Xn5ydCZjdCx0WzQ1XT1odF5+bHQmZnQsdFs2XT16Xn5nJmssdFs3XT1JXn53JnksdFsxNl09dl5+RiZBLHRbMTddPURefkcmUCx0WzI2XT1PXn5SJkgsdFsyN109UV5+UyZKLHRbMzZdPVpefl8mVCx0WzM3XT0kXn50dCZVLHRbNDZdPXJ0Xn5jdCZzdCx0WzQ3XT1sdF5+ZnQmaXQsdFs4XT1nXn5rJngsdFs5XT13Xn55JkIsdFsxOF09Rl5+QSZFLHRbMTldPUdeflAmaix0WzI4XT1SXn5IJkssdFsyOV09U15+SiZMLHRbMzhdPV9eflQmVix0WzM5XT10dF5+VSZXLHRbNDhdPWN0Xn5zdCZldCx0WzQ5XT1mdF5+aXQmb3QsdFswXV49ZVtvXSx0WzFdXj1lW28rMV19O2V4cG9ydHtvIGFzIHNoYTNfNTEyfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJjb25zdCBlPVwiXCIsdD1mdW5jdGlvbigpe2NvbnN0IGU9e2luc3RhbmNlOkVycm9yLGZyb206ZT0+e2NvbnN0IHQ9W2UubmFtZSxlLm1lc3NhZ2VdO3JldHVybiB2b2lkIDAhPT1lLnN0YWNrJiZ0LnB1c2goZS5zdGFjayksdm9pZCAwIT09ZS5jYXVzZSYmKHZvaWQgMD09PWUuc3RhY2smJnQucHVzaCh2b2lkIDApLHQucHVzaChlLmNhdXNlKSksdH0sc3R1YjooKT0+bmV3IEVycm9yLGh5ZHJhdGU6KGUsW3QsbixhLHNdKT0+e2UubmFtZT10LGUubWVzc2FnZT1uLHZvaWQgMD09PWE/ZGVsZXRlIGUuc3RhY2s6ZS5zdGFjaz1hLHZvaWQgMCE9PXMmJihlLmNhdXNlPXMpfX0sdD17aW5zdGFuY2U6VWludDhBcnJheSxmcm9tOmU9PltidG9hKGEuZGVjb2RlKGUpKV0sY3JlYXRlOihbZV0pPT5uLmVuY29kZShhdG9iKGUpKX0scz17aW5zdGFuY2U6TWFwLGZyb206ZT0+Wy4uLmUuZW50cmllcygpXSxzdHViOigpPT5uZXcgTWFwLGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3RbbixhXW9mIHQpZS5zZXQobixhKX19LG89e2luc3RhbmNlOlNldCxmcm9tOmU9PlsuLi5lLnZhbHVlcygpXSxzdHViOigpPT5uZXcgU2V0LGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3QgbiBvZiB0KWUuYWRkKG4pfX0scj17aW5zdGFuY2U6RGF0ZSxmcm9tOmU9PltlLnRvSlNPTigpXSxjcmVhdGU6KFtlXSk9Pm5ldyBEYXRlKGUpfSxjPXtpbnN0YW5jZTpSZWdFeHAsZnJvbTooe2ZsYWdzOmUsc291cmNlOnR9KT0+ZT9bdCxlXTpbdF0sY3JlYXRlOihbZSx0XSk9Pm5ldyBSZWdFeHAoZSx0KX0sZD17aW5zdGFuY2U6VVJMLGZyb206ZT0+W2UuaHJlZl0sY3JlYXRlOihbZV0pPT5uZXcgVVJMKGUpfTtyZXR1cm4gbmV3IE1hcChbZSx0LHMsbyxyLGMsZF0ubWFwKGU9PltlLmluc3RhbmNlLm5hbWUsZV0pKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuPXZvaWQgMCxlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5sb2FkRW52KSByZXR1cm4gcHJvY2Vzcy5lbnY7XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gICAgLy8gT3ZlcndyaXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBldmVuIHRob3VnaCB0aGlzIGJlaGF2aW9yIGlzIG5vbi1zdGFuZGFyZFxuICAgIC8vIGJlY2F1c2UgYGJ1biB3YiAuLi5gIHdpbGwgbG9hZCAuZW52IGFuZCAuZW52LmxvY2FsIGJlZm9yZSBgd2JgIGxvYWRzIG90aGVyIHZhcmlhYmxlcy5cbiAgICByZXR1cm4geyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8ucHJpc21hID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wcmlzbWEpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ZpdGVzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpdGVzdCA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udml0ZXN0KTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICBpZiAoaXNDSSh0aGlzLmVudi5DSSkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgICByZXR1cm4gL1xcYndlYlNlcnZlclxcYi8udGVzdChmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IChKU09OLnBhcnNlKFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgICApIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGJpbkZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5kaXJQYXRoO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgICAgdGhpcy5lbnYuUEFUSCA9IGAke2JpblBhdGh9OiR7dGhpcy5lbnYuUEFUSH1gO1xuICAgICAgICBiaW5Gb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJpbkZvdW5kO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgRm91bmRQcm9qZWN0cyA9IHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cyxcbiAgICBkZXNjZW5kYW50czpcbiAgICAgIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCA9PT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXG4gICAgICAgID8gYXdhaXQgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudilcbiAgICAgICAgOiBbcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnZGVzY2VuZGFudHMnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcm9vdFByb2plY3QgPSBuZXcgUHJvamVjdChyb290RGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IFtyb290UHJvamVjdF07XG5cbiAgY29uc3Qgd29ya3NwYWNlID0gcm9vdFByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHdvcmtzcGFjZSkpIHJldHVybiBwcm9qZWN0cztcblxuICBjb25zdCBnbG9iUGF0dGVybjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZURpcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0aCBvZiB3b3Jrc3BhY2UubWFwKCh3czogc3RyaW5nKSA9PiBwYXRoLmpvaW4ocm9vdFByb2plY3QuZGlyUGF0aCwgd3MpKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgICBwYWNrYWdlRGlycy5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iUGF0dGVybi5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH1cbiAgfVxuICBwYWNrYWdlRGlycy5wdXNoKC4uLihhd2FpdCBnbG9iYnkoZ2xvYlBhdHRlcm4sIHsgZG90OiB0cnVlLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpKTtcbiAgZm9yIChjb25zdCBzdWJQYWNrYWdlRGlyUGF0aCBvZiBwYWNrYWdlRGlycykge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViUGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuXG4gICAgcHJvamVjdHMucHVzaChuZXcgUHJvamVjdChzdWJQYWNrYWdlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpO1xuICB9XG4gIHJldHVybiBwcm9qZWN0cztcbn1cbiIsImV4cG9ydCBjb25zdCBpc1J1bm5pbmdPbkJ1biA9XG4gIC8vIERldGVjdCBgYnVuIC0tYnVuIHJ1biB3YiAuLi5gLiBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICBwcm9jZXNzLnZlcnNpb25zLmJ1biB8fFxuICAvLyBEZXRlY3QgYGJ1biBydW4gd2IgLi4uYC5cbiAgcHJvY2Vzcy5hcmd2WzBdPy5lbmRzV2l0aCgnL2J1bicpIHx8XG4gIHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uZW5kc1dpdGgoJy9idW4nKTtcblxuZXhwb3J0IGNvbnN0IHJ1bnRpbWVXaXRoQXJncyA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ25vZGUnO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuJyA6ICd5YXJuJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICd5YXJuJztcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IEJpbmFyeUxpa2UsIEhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSWZOZWVkZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2J1aWxkSWZOZWVkZWQnLFxuICBkZXNjcmliZTogJ0J1aWxkIGNvZGUgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBidWlsZElmTmVlZGVkKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSWZOZWVkZWQoXG4gIC8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBhcmd2LmNvbW1hbmQgPz8gKGlzUnVubmluZ09uQnVuID8gJ2J1biBydW4gYnVpbGQnIDogJ3lhcm4gYnVpbGQnKSB9O1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkpIHtcbiAgICBidWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtjYW5Ta2lwLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF0gPSBhd2FpdCBjYW5Ta2lwQnVpbGQocHJvamVjdCwgYXJndik7XG4gIGlmIChjYW5Ta2lwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTa2lwIHRvIHJ1biAnJHthcmd2LmNvbW1hbmR9JyDwn5KrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghYnVpbGQocHJvamVjdCwgYXJndikpIHJldHVybjtcblxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBidWlsZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+KTogYm9vbGVhbiB7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgUnVuICcke2FyZ3YuY29tbWFuZH0nYCkpO1xuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoYXJndi5jb21tYW5kID8/ICcnLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBpZ25vcmluZ0VudlZhck5hbWVzID0gbmV3IFNldChbJ0NJJywgJ1BXREVCVUcnLCAnVE1QRElSJ10pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuU2tpcEJ1aWxkKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdnaXQgcmV2LXBhcnNlIEhFQUQnLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSlcbiAgKTtcbiAgaGFzaC51cGRhdGUoZW52aXJvbm1lbnRKc29uKTtcblxuICBhd2FpdCB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQocHJvamVjdCwgYXJndiwgaGFzaCk7XG4gIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaC5kaWdlc3QoJ2hleCcpO1xuXG4gIGNvbnN0IGNhY2hlZENvbnRlbnRIYXNoID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIHJldHVybiBbY2FjaGVkQ29udGVudEhhc2ggPT09IGNvbnRlbnRIYXNoLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG59XG5cbmNvbnN0IGluY2x1ZGVQYXR0ZXJucyA9IFsnc3JjLycsICdwdWJsaWMvJ107XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG5dO1xuY29uc3QgZXhjbHVkZVBhdHRlcm5zID0gWyd0ZXN0LycsICd0ZXN0cy8nLCAnX190ZXN0c19fLycsICd0ZXN0LWZpeHR1cmVzLycsICd0ZXN0L2ZpeHR1cmVzLyddO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydkaWZmJywgJy0tbmFtZS1vbmx5J10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGZpbGVQYXRocyA9IHJldC5zdGRvdXRcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0JyA/IGZpbGVQYXRoLnJlcGxhY2UoL3BhY2thZ2VzXFwvd2JcXC90ZXN0XFwvZml4dHVyZXNcXC9bXi9dK1xcLy8sICcnKSA6IGZpbGVQYXRoXG4gICAgICApO1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZVBhdGhzID0gZmlsZVBhdGhzLmZpbHRlcihcbiAgICAgIChmaWxlUGF0aCkgPT5cbiAgICAgICAgKGluY2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gZmlsZVBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFleGNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpXG4gICAgKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZWQgZmlsZXM6ICR7ZmlsdGVyZWRGaWxlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGhcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignZ2l0JywgWydkaWZmJywgJy0tJywgLi4uZmlsdGVyZWRGaWxlUGF0aHNdLCB7IGN3ZDogcHJvamVjdC5yb290RGlyUGF0aCB9KTtcbiAgICBwcm9jLnN0ZG91dC5vbignZGF0YScsIChkYXRhOiBCaW5hcnlMaWtlKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdEYXRhOicsIGRhdGEpO1xuICAgICAgICBjb25zb2xlLmluZm8oJ0hhc2g6JywgaGFzaC5jb3B5KCkuZGlnZXN0KCdoZXgnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFJldHJ5T3B0aW9ucyA9IHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufTtcblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuY29uc3Qga2lsbFBvcnRJZk5vbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qga2lsbFBvcnRJZk5vbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdraWxsLXBvcnQtaWYtbm9uLWNpJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBwb3J0IHNwZWNpZmllZCBieSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIG5vbi1DSS4nLFxuICBidWlsZGVyOiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBraWxsUG9ydElmTm9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRJZk5vbkNpKFxuICBfOiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGlzQ0kocHJvY2Vzcy5lbnYuQ0kpKSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwIGtpbGxpbmcgcG9ydCBkdWUgdG8gQ0k6ICR7cHJvY2Vzcy5lbnYuQ0l9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9ydEVudiA9IHByb2Nlc3MuZW52LlBPUlQ7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhgS2lsbGluZyB0aGUgcG9ydDogJHtwb3J0fWApO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuLCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxudHlwZSBPcHRpb25zID0ge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufTtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gIGV4aXRJZkZhaWxlZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoU3Bhd24oXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBbcHJpbnRhYmxlU2NyaXB0LCBydW5uYWJsZVNjcmlwdF0gPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0IChyYXcpJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIDAsIG9wdHMpO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcG9ydCA9IC9odHRwLWdldDpcXC9cXC8xMjcuMC4wLjE6KFxcZCspLy5leGVjKHJ1bm5hYmxlU2NyaXB0KT8uWzFdO1xuICBpZiAocnVubmFibGVTY3JpcHQuaW5jbHVkZXMoJ3dhaXQtb24nKSAmJiBwb3J0ICYmICFydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnZG9ja2VyIHJ1bicpKSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQoTnVtYmVyKHBvcnQpKTtcbiAgfVxuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKHJ1bm5hYmxlU2NyaXB0LCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSByZXQuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAob3V0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBjYXBpdGFsaXplZCBjb21tYW5kcyAoZS5nLiwgWUFSTiwgUFJJU01BLCBCVU4pIHdpdGggc3VpdGFibGUgY29tbWFuZHMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICBsZXQgbmV3U2NyaXB0ID0gc2NyaXB0XG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXHNcXHMrL2csICcgJylcbiAgICAucmVwbGFjZUFsbCgnUFJJU01BICcsIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biAtLWJ1biBydW4gJyA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1biAtLWJ1bikgcnVuYFxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHJ1biAnLCBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuICcgOiAneWFybiBydW4gJyk7XG4gIGlmIChpc1J1bm5pbmdPbkJ1bikge1xuICAgIG5ld1NjcmlwdCA9IG5ld1NjcmlwdFxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gYnVpbGQtdHMgcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLnJlcGxhY2VBbGwoJ2J1biAtLWJ1biBydW4gYnVuIC0tYnVuIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC8vIEJlY2F1c2UgYnVuIGNhbiBydW4gc3JjL2luZGV4LnRzIGRpcmVjdGx5LlxuICAgICAgLnJlcGxhY2VBbGwoJ2Rpc3QvaW5kZXguanMnLCAnc3JjL2luZGV4LnRzJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oPzpZQVJOICk/dml0ZXN0IHJ1bi9nLCAnYnVuIHRlc3QnKVxuICAgICAgLy8gJy0tYWxsb3dPbmx5JyBpcyBzb21ldGltZXMgcmVtb3ZlZC5cbiAgICAgIC5yZXBsYWNlQWxsKC8gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyg/OiAtLWFsbG93T25seSk/L2csICcnKTtcbiAgfVxuICBuZXdTY3JpcHQgPSBuZXdTY3JpcHQudHJpbSgpO1xuICBjb25zdCBwcmludGFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCkpO1xuICBjb25zdCBydW5uYWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQoXG4gICAgbmV3U2NyaXB0XG4gICAgICAvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIGB5YXJuIHBsYXl3cmlnaHRgIGluIGEgcHJvamVjdCBkZXBlbmRpbmcgb24gYGFydGlsbGVyeS1lbmdpbmUtcGxheXdyaWdodGAuXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBwbGF5d3JpZ2h0ICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIWlzUnVubmluZ09uQnVuICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApXG4gICk7XG4gIC8vIEFkZCBjYXNjYWRlIG9wdGlvbiB3aGVuIFdCX0VOViBpcyBkZWZpbmVkXG4gIGNvbnN0IGNhc2NhZGVPcHRpb24gPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgIC0tY2FzY2FkZS1lbnY9JHtwcm9qZWN0LmVudi5XQl9FTlYgfHwgJ2RldmVsb3BtZW50J31gIDogJyc7XG4gIHJldHVybiBbYGRvdGVudiR7Y2FzY2FkZU9wdGlvbn0gJHtwcmludGFibGVTY3JpcHR9YCwgcnVubmFibGVTY3JpcHRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QsIHByZWZpeCA9ICdTdGFydCcsIHdlYWsgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgJ1xcbicgK1xuICAgICAgKHdlYWsgPyBjaGFsay5ncmF5IDogY2hhbGsuY3lhbikoY2hhbGsuYm9sZChgJHtwcmVmaXh9OmApLCBub3JtYWxpemVkU2NyaXB0KSArXG4gICAgICBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBleGl0Q29kZTogbnVtYmVyIHwgbnVsbCxcbiAgb3B0czogT21pdDxPcHRpb25zLCAndGltZW91dCc+XG4pOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBzY3JpcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTogYCksIHNjcmlwdCkpO1xuICAgIGlmIChvcHRzLmV4aXRJZkZhaWxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSA/PyAxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uZmlndXJlRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiwgb3B0czogT3B0aW9ucyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBpZiAob3B0cy5mb3JjZUNvbG9yKSB7XG4gICAgbmV3RW52LkZPUkNFX0NPTE9SID0gJzMnO1xuICB9XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvMTQzNTlcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgfHxcbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy84MjIyXG4gICAgY29tbWFuZC5pbmNsdWRlcygncGxheXdyaWdodCcpIHx8XG4gICAgLy8gXCJidW4gLS1idW4gcHJpc21hIGdlbmVyYXRlXCIgZG9lc24ndCB3b3JrXG4gICAgY29tbWFuZC5pbmNsdWRlcygncHJpc21hJykgfHxcbiAgICBjb21tYW5kLmluY2x1ZGVzKCd0ZXN0L2UyZS1hZGRpdGlvbmFsJylcbiAgICA/IGNvbW1hbmQucmVwbGFjZUFsbCgnYnVuIC0tYnVuJywgJ2J1bicpXG4gICAgOiBjb21tYW5kO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmaXg6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpeCB0aGUgbGludGluZyBlcnJvcnMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZm9ybWF0OiB7XG4gICAgZGVzY3JpcHRpb246ICdGb3JtYXQgdGhlIGNvZGUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBiaW9tZUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnY2pzJywgJ2N0cycsICdqcycsICdqc29uJywgJ2pzb25jJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3RzJywgJ3RzeCddKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2N0cycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhYmlvbWVFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdsaW50IFtmaWxlcy4uLl0nLFxuICBkZXNjcmliZTogJ0xpbnQgY29kZSBvbiBCdW4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoIWlzUnVubmluZ09uQnVuKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG9ubHkgYXZhaWxhYmxlIG9uIEJ1bi4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZXMgPSBhcmd2LmZpbGVzID8/IFtdO1xuICAgIGxldCBiaW9tZUFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgbGV0IHByZXR0aWVyQXJnc1RleHQ6IHN0cmluZztcbiAgICBsZXQgc29ydFBhY2thZ2VKc29uQXJnc1RleHQ6IHN0cmluZztcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXI6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShTdHJpbmcoZmlsZSkpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0L2ZpeHR1cmVzJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fFxuICAgICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgICAgcGFja2FnZUpzb25GaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYmlvbWVFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBiaW9tZUFyZ3NUZXh0ID0gZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgICAgcHJldHRpZXJBcmdzVGV4dCA9IGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgICAgc29ydFBhY2thZ2VKc29uQXJnc1RleHQgPSBwYWNrYWdlSnNvbkZpbGVQYXRocy5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmlvbWVBcmdzVGV4dCA9ICcnO1xuICAgICAgcHJldHRpZXJBcmdzVGV4dCA9IGBcIioqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19XCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImA7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzVGV4dCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gYFwiJHtwLnBhY2thZ2VKc29uUGF0aH1cImApLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaW9tZUNvbW1hbmQgPVxuICAgICAgYXJndi5maXggJiYgYXJndi5mb3JtYXQgPyAnY2hlY2sgLS1maXgnIDogYXJndi5maXggPyAnbGludCAtLWZpeCcgOiBhcmd2LmZvcm1hdCA/ICdmb3JtYXQgLS1maXgnIDogJ2xpbnQnO1xuICAgIGxldCBiaW9tZVByb21pc2U6IFByb21pc2U8bnVtYmVyPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYmlvbWVBcmdzVGV4dCB8fCBmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJpb21lUHJvbWlzZSA9IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gICAgICAgIGBidW4gLS1idW4gYmlvbWUgJHtiaW9tZUNvbW1hbmR9IC0tY29sb3JzPWZvcmNlIC0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCAtLWZpbGVzLWlnbm9yZS11bmtub3duPXRydWUgJHtiaW9tZUFyZ3NUZXh0fWAsXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHsgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgIGlmIChwcmV0dGllckFyZ3NUZXh0KSB7XG4gICAgICAgIHZvaWQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgICBgYnVuIC0tYnVuIHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgJHtwcmV0dGllckFyZ3NUZXh0fWAsXG4gICAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHsgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc29ydFBhY2thZ2VKc29uQXJnc1RleHQpIHtcbiAgICAgICAgYXdhaXQgYmlvbWVQcm9taXNlO1xuICAgICAgICB2b2lkIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJ1biAtLWJ1biBzb3J0LXBhY2thZ2UtanNvbiAke3NvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0fWAsIHByb2plY3RzLnNlbGYsIGFyZ3YsIHtcbiAgICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgICAgIGRlcHNbbmFtZV0gPSBgLi8ke25hbWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmluZm8oJ0luc3RhbGxlZCBkZXBlbmRlbmNpZXMuJyk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWFyZ3Yub3V0c2lkZSkge1xuICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gICAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2Jpb21lJyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAncGxheXdyaWdodCcsXG4gICAgJ3ByZXR0aWVyJyxcbiAgICAncGluc3QnLFxuICAgICdyYWlsd2F5JyxcbiAgICAnc2VtYW50aWMtcmVsZWFzZScsXG4gICAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgICAnd2FpdC1vbicsXG4gICAgJ3ZpdGVzdCcsXG4gIF07XG4gIGNvbnN0IHJlbW92ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGV2RGVwcykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNUb0JlUmVtb3ZlZC5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgKG5hbWUuaW5jbHVkZXMoJ3dpbGxib29zdGVyJykgJiYgbmFtZS5pbmNsdWRlcygnY29uZmlnJykpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZGV2RGVwc1tuYW1lXTtcbiAgICAgIHJlbW92ZWREZXBzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBkZXZEZXBlbmRlbmNpZXM6JywgcmVtb3ZlZERlcHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydjaGVjaycsICdkZXBsb3knLCAnZm9ybWF0JywgJ2xpbnQnLCAnc3RhcnQnLCAndGVzdCddO1xuICBjb25zdCBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsncGluc3QgJywgJ2h1c2t5ICddO1xuICBjb25zdCBzY3JpcHRzID0gKHBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbnN0IHJlbW92ZWRTY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IG5hbWUuc3RhcnRzV2l0aCh3b3JkKSkgfHxcbiAgICAgIC8vIFN1cHBvcnQgXCJodXNreVwiIHNpbmNlIGh1c2t5IHY5IHJlcXVpcmVzIGBcInBvc3RpbnN0YWxsXCI6IFwiaHVza3lcImBcbiAgICAgIGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IGNvbnRlbnQuaW5jbHVkZXMod29yZCkgfHwgY29udGVudC50cmltKCkgPT09IHdvcmQudHJpbSgpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIHNjcmlwdHNbbmFtZV07XG4gICAgICByZW1vdmVkU2NyaXB0cy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgc2NyaXB0czonLCByZW1vdmVkU2NyaXB0cy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJpdmF0ZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWc7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcmV0dGllcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgIG9yIGBZQVJOIGJsaXR6IHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfWA7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0LCBiYWNrdXBQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGBybSAtUmYgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMqOyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlICYmIHJtIC1SZiAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMypcbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAtbyAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyAke2JhY2t1cFBhdGh9ICYmIGxzIC1haGwgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMgJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpdGVzdHJlYW0oXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3J1bnRpbWVXaXRoQXJnc30gLWUgJ1xuY29uc3QgeyBQcmlzbWFDbGllbnQgfSA9IHJlcXVpcmUoXCJAcHJpc21hL2NsaWVudFwiKTtcbm5ldyBQcmlzbWFDbGllbnQoKS4kcXVlcnlSYXdcXGBQUkFHTUEgam91cm5hbF9tb2RlID0gV0FMO1xcYFxuICAuY2F0Y2goKGVycm9yKSA9PiB7IGNvbnNvbGUubG9nKFwiRmFpbGVkIGR1ZSB0bzpcIiwgZXJyb3IpOyBwcm9jZXNzLmV4aXQoMSk7IH0pO1xuJ2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95JHthZGRpdGlvbmFsT3B0aW9ucyA/IGAgJHthZGRpdGlvbmFsT3B0aW9uc31gIDogJyd9ICYmIFBSSVNNQSBnZW5lcmF0ZSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldiR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICAvLyBCbGl0eiBkb2VzIG5vdCB0cmlnZ2VyIHNlZWQgYXV0b21hdGljYWxseSwgc28gd2UgbmVlZCB0byBydW4gaXQgbWFudWFsbHkuXG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkJHthZGRpdGlvbmFsT3B0aW9ucyA/IGAgJHthZGRpdGlvbmFsT3B0aW9uc31gIDogJyd9ICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIGJhY2t1cFBhdGg6IHN0cmluZywgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vcmVzdG9yZWQuc3FsaXRlMzsgR09PR0xFX0FQUExJQ0FUSU9OX0NSRURFTlRJQUxTPWdjcC1zYS1rZXkuanNvbiBsaXRlc3RyZWFtIHJlc3RvcmUgLW8gJHtvdXRwdXRQYXRofSAke2JhY2t1cFBhdGh9YDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCBGSUxFX1NDSEVNQSA9ICdmaWxlOic7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIC8vIERlYWwgd2l0aCBQcmlzbWEgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWEvc3R1ZGlvL2lzc3Vlcy8xMjczXG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2plY3QuZW52LkRBVEFCQVNFX1VSTD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHtcbiAgICAgIGNvbnN0IFBPU1NJQkxFX1BBVEhTID0gW1xuICAgICAgICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICAgICAgICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gICAgICAgIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuICAgICAgXTtcbiAgICAgIGZvciAoY29uc3QgeyBkYlBhdGgsIHNjaGVtYVBhdGggfSBvZiBQT1NTSUJMRV9QQVRIUykge1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBzY2hlbWFQYXRoKSkpIHtcbiAgICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgICAgICBkYlBhdGgsXG4gICAgICAgICAgICBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpbyR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGRlc2NyaWJlOiAnUnVuIHByaXNtYSBjb21tYW5kcycsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpXG4gICAgICAuc3RyaWN0KGZhbHNlKTsgLy8gQWxsb3cgdW5rbm93biBvcHRpb25zIHRvIGJlIHBhc3NlZCB0aHJvdWdoXG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveShwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUZvcmNlQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2JhY2t1cC1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgZGVtYW5kT3B0aW9uOiB0cnVlLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVwbG95Rm9yY2VCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3ktZm9yY2UgPGJhY2t1cC1wYXRoPicsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyOiBkZXBsb3lGb3JjZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveUZvcmNlKHByb2plY3QsIGFyZ3YuYmFja3VwUGF0aCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGxpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ1NldHVwIERCIGZvciBMaXRlc3RyZWFtJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmxpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXN0b3JlQnVpbGRlciA9IHtcbiAgLi4uZGVwbG95Rm9yY2VCdWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlIDxiYWNrdXAtcGF0aD4nLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0ID8/IChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgYXJndi5iYWNrdXBQYXRoLCBvdXRwdXQpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWVkQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgZmlsZToge1xuICAgIGFsaWFzOiAnZicsXG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBzZWVkIHNjcmlwdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc2VlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2VlZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NlZWQnLFxuICBkZXNjcmliZTogJ1BvcHVsYXRlIERCIHdpdGggc2VlZCBkYXRhJyxcbiAgYnVpbGRlcjogc2VlZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzZWVkJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBQcmlzbWEgU3R1ZGlvJyxcbiAgYnVpbGRlcjogc3R1ZGlvQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3YucmVzdG9yZWQgJiYgYXJndi5kYlVybE9yUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlc3RvcmVkIGFuZCAtLWRiLXVybC1vci1wYXRoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnZGItdXJsLW9yLXBhdGgnLCAncmVzdG9yZWQnXSk7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHN0dWRpbycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgZGJVcmxPclBhdGggPSBhcmd2LnJlc3RvcmVkXG4gICAgICAgID8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6XG4gICAgICAgICAgPyAnZGIvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgICA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgOiBhcmd2LmRiVXJsT3JQYXRoPy50b1N0cmluZygpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOiAnUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHByaXNtYSBhcyBpcycsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChgcHJpc21hICR7ZnVsbENvbW1hbmR9YCwgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYFBSSVNNQSAke2Z1bGxDb21tYW5kfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmlsdGVyKFxuICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8ucHJpc21hID8/IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wcmlzbWFcbiAgKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcmlzbWEgcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHVua25vd24gb3B0aW9ucyBmcm9tIGFyZ3YgdG8gcGFzcyB0byBwcmlzbWEgY29tbWFuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3Y6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmcge1xuICBjb25zdCB1bmtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBCdWlsZCBsaXN0IG9mIGtub3duIG9wdGlvbnMgZnJvbSBzaGFyZWQgb3B0aW9ucyBidWlsZGVyc1xuICBjb25zdCBzaGFyZWRPcHRpb25LZXlzID0gT2JqZWN0LmtleXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpO1xuICBjb25zdCBzaGFyZWRPcHRpb25BbGlhc2VzID0gT2JqZWN0LnZhbHVlcyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgICAuZmxhdE1hcCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAoJ2FsaWFzJyBpbiBvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob3B0aW9uLmFsaWFzKSA/IG9wdGlvbi5hbGlhcyA6IFtvcHRpb24uYWxpYXNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLm1hcChTdHJpbmcpO1xuXG4gIGNvbnN0IGFsbEtub3duT3B0aW9ucyA9IG5ldyBTZXQoW1xuICAgIC4uLmtub3duT3B0aW9ucyxcbiAgICAuLi5zaGFyZWRPcHRpb25LZXlzLFxuICAgIC4uLnNoYXJlZE9wdGlvbkFsaWFzZXMsXG4gICAgLy8gSW50ZXJuYWwgeWFyZ3MgcHJvcGVydGllc1xuICAgICdfJyxcbiAgICAnJDAnLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmd2KSkge1xuICAgIGlmICghYWxsS25vd25PcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9ucyBvZiBrZWJhYi1jYXNlIG9wdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRpb25cbiAgICAgIC8vIElmIHdlIGhhdmUgYm90aCAnY3JlYXRlLW9ubHknIGFuZCAnY3JlYXRlT25seScsIHByZWZlciB0aGUga2ViYWItY2FzZSB2ZXJzaW9uXG4gICAgICBjb25zdCBrZWJhYkNhc2VLZXkgPSBrZXkucmVwbGFjZUFsbCgvW0EtWl0vZywgKG1hdGNoKSA9PiBgLSR7bWF0Y2gudG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgIGlmIChrZWJhYkNhc2VLZXkgIT09IGtleSAmJiBhcmd2W2tlYmFiQ2FzZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbiBpZiBrZWJhYi1jYXNlIGV4aXN0c1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiBmbGFnc1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgc3RyaW5nL251bWJlciB2YWx1ZXNcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGFycmF5c1xuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcoaXRlbSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVua25vd25PcHRpb25zLmpvaW4oJyAnKTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAobGFzdFN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQobGFzdFN0YXR1cyk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHNldHVwQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZXR1cCcsXG4gIGRlc2NyaWJlOiAnU2V0dXAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgc2V0dXAoYXJndik7XG4gIH0sXG59O1xuXG4vLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXAoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdzZXR1cCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5yZWFkZGlyKHByb2plY3QuZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGlmIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290KSB7XG4gICAgICBpZiAob3MucGxhdGZvcm0oKSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZXMgPSBbJ3BzdHJlZSddO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgICAgcGFja2FnZXMucHVzaCgnZXhwZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdhc2RmIGluc3RhbGwnLCBwcm9qZWN0LCBhcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUgPT09ICdweXByb2plY3QudG9tbCcpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKCdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgY29uc3QgWywgdmVyc2lvbl0gPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdhc2RmIGN1cnJlbnQgcHl0aG9uJykudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7dmVyc2lvbn1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maW5kKChwKSA9PiBwLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucGxheXdyaWdodCk7XG4gIGlmIChwcm9qZWN0KSB7XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0T3B0aW9uc0J1aWxkZXIgPSB7XG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHdhdGNoIGZpbGVzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgY29yZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnYScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG4gICdkb2NrZXItb3B0aW9ucyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgXCJkb2NrZXIgcnVuXCInLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTY3JpcHRBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+XG4pOiB2b2lkIHtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZEFyZ3NUZXh0ID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndi5fPy5zbGljZSgxKSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKVxuICAgIC5qb2luKCcgJyk7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA9IChhcmd2LmRvY2tlck9wdGlvbnMgPz8gW10pLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG4vKipcbiAqIEZpbmRzIGFuIGF2YWlsYWJsZSBwb3J0IHN0YXJ0aW5nIGZyb20gdGhlIGdpdmVuIHBvcnQgbnVtYmVyLlxuICogQHBhcmFtIHN0YXJ0UG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBzdGFydCBzZWFyY2hpbmcgZnJvbSAoZGVmYXVsdDogMzAwMClcbiAqIEBwYXJhbSBtYXhBdHRlbXB0cyAtIE1heGltdW0gbnVtYmVyIG9mIHBvcnRzIHRvIHRyeSAoZGVmYXVsdDogMTAwKVxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXZhaWxhYmxlIHBvcnQgbnVtYmVyXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kQXZhaWxhYmxlUG9ydChzdGFydFBvcnQgPSAzMDAwLCBtYXhBdHRlbXB0cyA9IDEwMCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGZvciAobGV0IHBvcnQgPSBzdGFydFBvcnQ7IHBvcnQgPCBzdGFydFBvcnQgKyBtYXhBdHRlbXB0czsgcG9ydCsrKSB7XG4gICAgaWYgKGF3YWl0IGlzUG9ydEF2YWlsYWJsZShwb3J0KSkge1xuICAgICAgcmV0dXJuIHBvcnQ7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihgTm8gYXZhaWxhYmxlIHBvcnQgZm91bmQgaW4gcmFuZ2UgJHtzdGFydFBvcnR9LSR7c3RhcnRQb3J0ICsgbWF4QXR0ZW1wdHMgLSAxfWApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHBvcnQgaXMgYXZhaWxhYmxlLlxuICogQHBhcmFtIHBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gY2hlY2tcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHBvcnQgaXMgYXZhaWxhYmxlLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNQb3J0QXZhaWxhYmxlKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcblxuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICcxMjcuMC4wLjEnKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGREZXZJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259IC5gO1xuICB9XG5cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIHVuYnVmZmVyID0gZmFsc2UsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dW5idWZmZXIgPyAndW5idWZmZXIgJyA6ICcnfSR7dGhpcy5zdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBhZGRpdGlvbmFsT3B0aW9ucyxcbiAgICAgIGFkZGl0aW9uYWxBcmdzXG4gICAgKX1gO1xuICB9XG5cbiAgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgc3Bhd25TeW5jT25FeGl0KHRoaXMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCk7XG4gICAgcmV0dXJuIGBkb2NrZXIgcnVuIC0tcm0gLWl0IC1wIFxcJHtQT1JUOi04MDgwfTo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBjb250YWluZXIgbHMgLXEgLWYgbmFtZT0ke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCB0eXBlIFRlc3RFMkVEZXZPcHRpb25zID0ge1xuICAvLyAnLS1lMmUgZ2VuZXJhdGUnIGNhbGxzICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCdcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmc7XG4gIHN0YXJ0Q29tbWFuZD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFRlc3RFMkVPcHRpb25zID0ge1xuICBwcmlzbWFEaXJlY3Rvcnk/OiBzdHJpbmc7XG59ICYgVGVzdEUyRURldk9wdGlvbnM7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbiA9ICdkZXZlbG9wbWVudCcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkb2NrZXJTY3JpcHRzLmJ1aWxkRGV2SW1hZ2UocHJvamVjdCwgdmVyc2lvbik7XG4gIH1cblxuICBhYnN0cmFjdCBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuXG4gIGFic3RyYWN0IHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgYWJzdHJhY3Qgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG5cbiAgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCA4MDgwO1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSR7dG9EZXZOdWxsKGFyZ3YpfVxuICAgICAgJiYgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICAgIFwiJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICAgICl9XCJcbiAgICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MgPSAndGVzdCB0ZXN0L2UyZS8nLCBwcmlzbWFEaXJlY3RvcnksIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHMgJiYgYXJndi50YXJnZXRzLmxlbmd0aCA+IDAgPyBhcmd2LnRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgY29uc3QgZW52UHJlZml4ID0gYFdCX0VOVj0ke2Vudn0gTkVYVF9QVUJMSUNfV0JfRU5WPSR7ZW52fSBBUFBfRU5WPSR7ZW52fSBQT1JUPSR7cG9ydH1gO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gcGxheXdyaWdodEFyZ3Muc3RhcnRzV2l0aCgndGVzdCAnKVxuICAgICAgPyBgQlVOIHBsYXl3cmlnaHQgJHtwbGF5d3JpZ2h0QXJnc31gXG4gICAgICA6IGBCVU4gcGxheXdyaWdodCB0ZXN0ICR7dGVzdFRhcmdldH1gO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gYCR7ZW52UHJlZml4fSAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzZXRDb21tYW5kID0gcHJpc21hRGlyZWN0b3J5ID8gYHJtIC1SZiAke3ByaXNtYURpcmVjdG9yeX0vbW91bnQgJiYgYCA6ICcnO1xuICAgIHJldHVybiBgJHtlbnZQcmVmaXh9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7cmVzZXRDb21tYW5kfSR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1cImA7XG4gIH1cblxuICB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3QvZTJlLycsIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHMgJiYgYXJndi50YXJnZXRzLmxlbmd0aCA+IDAgPyBhcmd2LnRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgY29uc3QgZW52UHJlZml4ID0gYFdCX0VOVj0ke2Vudn0gTkVYVF9QVUJMSUNfV0JfRU5WPSR7ZW52fSBBUFBfRU5WPSR7ZW52fSBQT1JUPSR7cG9ydH1gO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gcGxheXdyaWdodEFyZ3Muc3RhcnRzV2l0aCgndGVzdCAnKVxuICAgICAgPyBgQlVOIHBsYXl3cmlnaHQgJHtwbGF5d3JpZ2h0QXJnc31gXG4gICAgICA6IGBCVU4gcGxheXdyaWdodCB0ZXN0ICR7dGVzdFRhcmdldH1gO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gYCR7ZW52UHJlZml4fSAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2VudlByZWZpeH0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fVxuICAgICAgICAmJiAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIGFic3RyYWN0IHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIHRlc3RVbml0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZXN0VGFyZ2V0ID0gYXJndi50YXJnZXRzICYmIGFyZ3YudGFyZ2V0cy5sZW5ndGggPiAwID8gYXJndi50YXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L3VuaXQvJztcbiAgICBpZiAocHJvamVjdC5oYXNWaXRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgY29tbWFuZCBpcyByZWZlcnJlZCBmcm9tIG90aGVyIGNvbW1hbmRzLCB3ZSBoYXZlIHRvIHVzZSBcInZpdGVzdCBydW5cIiAobm9uLWludGVyYWN0aXZlIG1vZGUpLlxuICAgICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFlBUk4gdml0ZXN0IHJ1biAke3Rlc3RUYXJnZXR9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHlgO1xuICAgIH0gZWxzZSBpZiAocHJvamVjdC5pc0J1bkF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGJ1biB0ZXN0ICR7dGVzdFRhcmdldH1gO1xuICAgIH1cbiAgICByZXR1cm4gJ2VjaG8gXCJObyB0ZXN0cy5cIic7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAzMDAwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHdhaXQtb24gLXQgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgNTAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDEwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAyMDAwMCAtaSA0MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDYwMDAwIC1pIDUwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgOTAwMDAgLWkgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgMzAwMCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2LFxuICAgICAgcG9ydFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZEF2YWlsYWJsZVBvcnQgfSBmcm9tICcuLi8uLi91dGlscy9maW5kUG9ydC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIEJsaXR6LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBCbGl0elNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFwcEVudiA9IHByb2plY3QuZW52LldCX0VOViA/IGBBUFBfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBgIDogJyc7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCAzMDAwO1xuICAgIHJldHVybiBgJHthcHBFbnZ9WUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcImJsaXR6IGRldiAtcCAke3BvcnR9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFwcEVudiA9IHByb2plY3QuZW52LldCX0VOViA/IGBBUFBfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBgIDogJyc7XG4gICAgcmV0dXJuIGAke2FwcEVudn1OT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke1tcbiAgICAgICAgcHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpLFxuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YCxcbiAgICAgIF0uam9pbignICYmICcpfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCA4MDgwO1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICAuLi5wcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpLFxuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgXVxuICAgICAgICAubWFwKChjKSA9PiBgJHtjLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgICAuam9pbignICYmICcpfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZDpcbiAgICAgICAgb3B0aW9ucy5zdGFydENvbW1hbmQgPz9cbiAgICAgICAgW1xuICAgICAgICAgIC4uLnByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJyksXG4gICAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgICBdXG4gICAgICAgICAgLm1hcCgoYykgPT4gYCR7Yy50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgICAgICAuam9pbignICYmICcpLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVEZXZPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0Q29tbWFuZCA9IGBibGl0eiBkZXYgLXAgJHtwb3J0fSR7dG9EZXZOdWxsKGFyZ3YpfWA7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kOiBzdGFydENvbW1hbmQgPz8gZGVmYXVsdFN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgZmluZEF2YWlsYWJsZVBvcnQoKTtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJibGl0eiBkZXYgLXAgJHtwb3J0fSR7dG9EZXZOdWxsKGFyZ3YpfVwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRBdmFpbGFibGVQb3J0IH0gZnJvbSAnLi4vLi4vdXRpbHMvZmluZFBvcnQuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgMzAwMDtcbiAgICByZXR1cm4gYFBPUlQ9JHtwb3J0fSBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSR7dG9EZXZOdWxsKGFyZ3YpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICl9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gODA4MCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uICR7XG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZFxuICAgIH0ke3RvRGV2TnVsbChhcmd2KX0gJiYgTk9ERV9FTlY9cHJvZHVjdGlvbiBQT1JUPVxcJHtQT1JUOi0ke3BvcnR9fSAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuaGFzUHJpc21hID8gJ3ByaXNtYSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLWdlbmVyYXRlICYmICcgOiAnJ30oJHt0aGlzLnN0YXJ0UHJvZHVjdGlvbihcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2XG4gICAgKX0pYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IHtcbiAgICAgIHN0YXJ0Q29tbWFuZCA9IGAke3Byb2plY3QuaGFzUHJpc21hID8gJ3ByaXNtYSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLWdlbmVyYXRlICYmICcgOiAnJ30oJHt0aGlzLnN0YXJ0UHJvZHVjdGlvbihcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKX0pYCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHMgJiYgYXJndi50YXJnZXRzLmxlbmd0aCA+IDAgPyBhcmd2LnRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gUE9SVD0ke3BvcnR9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgdml0ZXN0IHJ1biAke3Rlc3RUYXJnZXR9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkke3N1ZmZpeH1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFRGV2T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCB7IHN0YXJ0Q29tbWFuZCB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHMgJiYgYXJndi50YXJnZXRzLmxlbmd0aCA+IDAgPyBhcmd2LnRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFdCX0VOVj0ke1xuICAgICAgcHJvamVjdC5lbnYuV0JfRU5WXG4gICAgfSBQT1JUPSR7cG9ydH0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmQgPz8gdGhpcy5zdGFydChwcm9qZWN0LCBhcmd2KX0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIHZpdGVzdCBydW4gJHt0ZXN0VGFyZ2V0fSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBmaW5kQXZhaWxhYmxlUG9ydCgpO1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBQT1JUPSR7cG9ydH0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCIke3RoaXMuc3RhcnQocHJvamVjdCwgYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRBdmFpbGFibGVQb3J0IH0gZnJvbSAnLi4vLi4vdXRpbHMvZmluZFBvcnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCAzMDAwO1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIm5leHQgZGV2IC0tdHVyYm9wYWNrIC1wICR7cG9ydH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke1tcbiAgICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KV0gOiBbXSksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLFxuICAgICAgXS5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDgwODA7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtbXG4gICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJykgOiBbXSksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICBdXG4gICAgICAgIC5tYXAoKGMpID0+IGAke2MudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAgIC5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzOiBvcHRpb25zLnBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAnZGInLFxuICAgICAgc3RhcnRDb21tYW5kOlxuICAgICAgICBvcHRpb25zLnN0YXJ0Q29tbWFuZCA/P1xuICAgICAgICBbXG4gICAgICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gcHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KS5zcGxpdCgnJiYnKSA6IFtdKSxcbiAgICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICAgIF1cbiAgICAgICAgICAubWFwKChjKSA9PiBgJHtjLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgICAgIC5qb2luKCcgJiYgJyksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCB7IHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgJzgwODAnO1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydENvbW1hbmQgPSBgbmV4dCBkZXYgLS10dXJib3BhY2sgLXAgJHtwb3J0fSR7dG9EZXZOdWxsKGFyZ3YpfWA7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBzdGFydENvbW1hbmQ6IHN0YXJ0Q29tbWFuZCA/PyBkZWZhdWx0U3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBmaW5kQXZhaWxhYmxlUG9ydCgpO1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcIm5leHQgZGV2IC0tdHVyYm9wYWNrIC1wICR7cG9ydH0ke3RvRGV2TnVsbChhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgMzAwMDtcbiAgICByZXR1cm4gYFBPUlQ9JHtwb3J0fSBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSR7dG9EZXZOdWxsKGFyZ3YpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICl9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgTk9ERV9FTlY9cHJvZHVjdGlvbiAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke1xuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICB9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZEF2YWlsYWJsZVBvcnQgfSBmcm9tICcuLi8uLi91dGlscy9maW5kUG9ydC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFJlbWl4IGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBSZW1peFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgMzAwMDtcbiAgICByZXR1cm4gYFBPUlQ9JHtwb3J0fSBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwicmVtaXggZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCl9ICYmICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoXG4gICAgICAgICdlY29zeXN0ZW0uY29uZmlnLmNqcydcbiAgICAgICl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDgwODA7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtbXG4gICAgICAgIC4uLnByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJyksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICBdXG4gICAgICAgIC5tYXAoKGMpID0+IGAke2MudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAgIC5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzOiBvcHRpb25zLnBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAncHJpc21hJyxcbiAgICAgIHN0YXJ0Q29tbWFuZDpcbiAgICAgICAgb3B0aW9ucy5zdGFydENvbW1hbmQgPz9cbiAgICAgICAgW1xuICAgICAgICAgIC4uLnByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJyksXG4gICAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgICBdXG4gICAgICAgICAgLm1hcCgoYykgPT4gYCR7Yy50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgICAgICAuam9pbignICYmICcpLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCA9IGByZW1peCBkZXYke3RvRGV2TnVsbChhcmd2KX1gIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBmaW5kQXZhaWxhYmxlUG9ydCgpO1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBQT1JUPSR7cG9ydH0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJyZW1peCBkZXYke3RvRGV2TnVsbChhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVtaXhTY3JpcHRzID0gbmV3IFJlbWl4U2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2NyaXB0T3B0aW9uc0J1aWxkZXIsXG4gIG1vZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IG1vZGU6IGRldltlbG9wbWVudF0gKGRlZmF1bHQpIHwgc3RhZ2luZyB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IHRlc3QnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc3RhcnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0YXJ0IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6ICdTdGFydCBhcHAnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ2RldmVsb3BtZW50Jyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnQocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhZ2luZyc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgODA4MDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwgcG9ydCl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3Rlc3QnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydFRlc3QocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFydCBtb2RlOiAke2FyZ3YubW9kZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sIHdiRW52OiBzdHJpbmcpOiBzdHJpbmcge1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9IHdiRW52O1xuICBsZXQgcHJlZml4ID0gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gYDtcbiAgaWYgKGRlcHMubmV4dCkge1xuICAgIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1dCX0VOViA9IHByb2Nlc3MuZW52LldCX0VOVjtcbiAgICBwcmVmaXggKz0gYE5FWFRfUFVCTElDX1dCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gYDtcbiAgfVxuICByZXR1cm4gcHJlZml4O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGUyZToge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0UyZSB0ZXN0IG1vZGU6IGhlYWRsZXNzIChkZWZhdWx0KSB8IGhlYWRsZXNzLWRldiB8IGhlYWRlZCB8IGhlYWRlZC1kZXYgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCBkZWJ1ZyB8IGdlbmVyYXRlIHwgdHJhY2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFtcbiAgICAgICdoZWFkbGVzcycsXG4gICAgICAnaGVhZGxlc3MtZGV2JyxcbiAgICAgICdoZWFkZWQnLFxuICAgICAgJ2hlYWRlZC1kZXYnLFxuICAgICAgJ2RvY2tlcicsXG4gICAgICAnZG9ja2VyLWRlYnVnJyxcbiAgICAgICdkZWJ1ZycsXG4gICAgICAnZ2VuZXJhdGUnLFxuICAgICAgJ3RyYWNlJyxcbiAgICBdLFxuICAgIGRlZmF1bHQ6ICdoZWFkbGVzcycsXG4gIH0sXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Rlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QgW3RhcmdldHMuLi5dJyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLicsXG4gIGJ1aWxkZXI6IHsgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0KGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAocHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSkge1xuICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgIHByb2Nlc3MuZW52LkNJID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIC8vIEdldCB0ZXN0IHRhcmdldHMgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICBjb25zdCB0ZXN0VGFyZ2V0cyA9IChhcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IHRlc3RUYXJnZXRzLmxlbmd0aCA9PT0gMDtcblxuICAvLyBEZXRlY3QgdGVzdCBtb2RlcyBmcm9tIHRhcmdldCBwYXRoc1xuICBjb25zdCBoYXNFMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gIGNvbnN0IGhhc1VuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICBjb25zdCBzaG91bGRSdW5Vbml0ID0gc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzVW5pdFRhcmdldHM7XG4gIGNvbnN0IHNob3VsZFJ1bkUyZSA9IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc0UyZVRhcmdldHM7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBpZiAoc2hvdWxkUnVuVW5pdCAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkpIHtcbiAgICAgIGNvbnN0IHVuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0czogdW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IHVuaXRUYXJnZXRzIDogdW5kZWZpbmVkIH07XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIGFyZ3YsIHsgdGltZW91dDogYXJndi51bml0VGltZW91dCB9KTtcbiAgICB9XG4gICAgLy8gU2tpcCBlMmUgdGVzdHMgaWYgbm90IG5lZWRlZCBvciBubyBlMmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghc2hvdWxkUnVuRTJlIHx8ICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGUyZSB0YXJnZXRzIGZvciB0aGlzIHByb2plY3RcbiAgICBjb25zdCBlMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgICBjb25zdCBlMmVBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBlMmVBcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGUyZUFyZ3YsIHNjcmlwdHMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgY29uc3QgZTJlVGFyZ2V0ID0gZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGUyZUFyZ3YsIHNjcmlwdHMsIGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWRlYnVnYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwcy5ibGl0eiB8fCBkZXBzLm5leHQgfHwgZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgY29uc3QgZTJlVGFyZ2V0ID0gZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBlMmVBcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2UyZVRhcmdldH0gLS1oZWFkZWRgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWRlYnVnYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGBjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2Nlc3MuZW52LldCX0RPQ0tFUiA/Pz0gJzEnO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHN0YXJ0Q29tbWFuZDogYCR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgdHJ1ZSl9JHt0b0Rldk51bGwoYXJndil9YCxcbiAgICB9KSxcbiAgICBwcm9qZWN0LFxuICAgIGFyZ3YsXG4gICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH1cbiAgKTtcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LkNJIHx8PSAnMSc7XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3Qtb24tY2lcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChkb2NrZXJTY3JpcHRzLnN0b3BBbGwoKSwgcHJvamVjdCwgYXJndik7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRE9DS0VSID8/PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBvcHRpb25zID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc3RhcnRDb21tYW5kOiBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCB0cnVlKSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge307XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHtcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG4gICAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQgLS1QcmV0dHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnB5cmlnaHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdZQVJOIHB5cmlnaHQnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJvamVjdC5oYXNTb3VyY2VDb2RlICYmXG4gICAgICAgIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdClcbiAgICAgICkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0IC0tUHJldHR5Jyk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBuZXh0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcubmV4dCcpO1xuICAgICAgICBpZiAoZXhpdENvZGUgJiYgZnMuZXhpc3RzU3luYyhuZXh0RGlyUGF0aCkpIHtcbiAgICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdSZW1vdmVkIGAubmV4dGAgZGlyZWN0b3J5LiBXZSB3aWxsIHJlLXRyeSB0eXBlIGNoZWNraW5nLicpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgbGV0IGZpbmFsRXhpdENvZGUgPSAwO1xuICAgIGZvciAoY29uc3QgW2ksIGV4aXRDb2RlXSBvZiBleGl0Q29kZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzW2ldPy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaW5hbEV4aXRDb2RlKSBwcm9jZXNzLmV4aXQoZmluYWxFeGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHJlZUtpbGwgZnJvbSAndHJlZS1raWxsJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGVzdE9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0T25DaS5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQoa2lsbFBvcnRJZk5vbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQobGludENvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdE9uQ2lDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICBwcm9jZXNzLmV4aXQoKTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsiY2FjaGVkRW52VmFycyIsIk1hcCIsInJlYWRFbnZGaWxlIiwiZmlsZVBhdGgiLCJjYWNoZWQiLCJnZXQiLCJwYXJzZWQiLCJjb25maWciLCJwYXRoIiwicmVzb2x2ZSIsInByb2Nlc3NFbnYiLCJzZXQiLCJhc3luYyIsInNwYXduQXN5bmMiLCJjb21tYW5kIiwiYXJncyIsIm9wdGlvbnMiLCJQcm9taXNlIiwicmVqZWN0IiwicHJvYyIsInNwYXduIiwic3Rkb3V0Iiwic2V0RW5jb2RpbmciLCJzdGRlcnIiLCJvbiIsImRhdGEiLCJwcmludGluZ1N0ZG91dCIsInByb2Nlc3MiLCJ3cml0ZSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJwcmludGluZ1N0ZGVyciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsInBpZCIsInZlcmJvc2UiLCJjb25zb2xlIiwiaW5mbyIsInRyZWVLaWxsIiwia2lsbE9uRXhpdCIsImVycm9yIiwicmVtb3ZlTGlzdGVuZXIiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJjb2RlIiwic2lnbmFsIiwidW5kZWZpbmVkIiwiRXJyb3IiLCJzdGF0dXMiLCJpbnB1dCIsInN0ZGluIiwiZW5kIiwidCIsInMiLCJpIiwiZSIsIm4iLCJlbnRyaWVzIiwiaCIsImJsb2NrcyIsInJlc2V0IiwiZmluYWxpemVkIiwiYmxvY2siLCJzdGFydCIsImxhc3RCeXRlSW5kZXgiLCJjb25zdHJ1Y3RvciIsInRoaXMiLCJwYWRkaW5nIiwib3V0cHV0Qml0cyIsImJsb2NrQ291bnQiLCJieXRlQ291bnQiLCJvdXRwdXRCbG9ja3MiLCJleHRyYUJ5dGVzIiwidXBkYXRlIiwibyIsImxlbmd0aCIsImwiLCJjIiwiZiIsImNvZGVQb2ludEF0IiwiciIsImZpbmFsaXplIiwiaGV4IiwiYSIsInUiLCJkIiwiYiIsImsiLCJ5IiwieCIsIkIiLCJwIiwiQyIsInoiLCJJIiwiZyIsInciLCJBIiwiUCIsIkUiLCJqIiwibSIsInEiLCJ2IiwiRCIsIkYiLCJHIiwiSCIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCIkIiwiXyIsInR0Iiwic3QiLCJpdCIsImV0Iiwib3QiLCJudCIsImh0IiwicnQiLCJsdCIsImN0IiwiZnQiLCJpbnN0YW5jZSIsImZyb20iLCJuYW1lIiwibWVzc2FnZSIsInN0YWNrIiwicHVzaCIsImNhdXNlIiwic3R1YiIsImh5ZHJhdGUiLCJVaW50OEFycmF5IiwiYnRvYSIsImRlY29kZSIsImNyZWF0ZSIsImVuY29kZSIsImF0b2IiLCJTZXQiLCJ2YWx1ZXMiLCJhZGQiLCJEYXRlIiwidG9KU09OIiwiUmVnRXhwIiwiZmxhZ3MiLCJzb3VyY2UiLCJVUkwiLCJocmVmIiwibWFwIiwiVGV4dEVuY29kZXIiLCJUZXh0RGVjb2RlciIsIkpTT04iLCJzdHJpbmdpZnkiLCJOdW1iZXIiLCJpc05hTiIsImlzRmluaXRlIiwidG9TdHJpbmciLCJBcnJheSIsImlzQXJyYXkiLCJmaWxsIiwic2xpY2UiLCJPYmplY3QiLCJjYWNoZUR1cmF0aW9uIiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJnZXRDYWNoZUtleSIsImtpbmQiLCJub3ciLCJjYWxsIiwiaXNDSSIsImNpRW52IiwiUHJvamVjdCIsIl9pbml0UHJvdG8iLCJfYXBwbHlEZWNzIiwibWVtb2l6ZU9uZSIsImFyZ3YiLCJwYXRoQnlOYW1lIiwiZGlyUGF0aCIsImxvYWRFbnYiLCJfZGlyUGF0aCIsImlzQnVuQXZhaWxhYmxlIiwidGVzdCIsImZzIiwicmVhZEZpbGVTeW5jIiwiam9pbiIsInJvb3REaXJQYXRoIiwiYnVpbGRDb21tYW5kIiwicGFja2FnZUpzb24iLCJzY3JpcHRzIiwiYnVpbGQiLCJpbmNsdWRlcyIsImV4aXN0c1N5bmMiLCJkb2NrZXJmaWxlIiwiZmluZEZpbGUiLCJoYXNEb2NrZXJmaWxlIiwiaGFzU291cmNlQ29kZSIsImRvY2tlckltYWdlTmFtZSIsInJlcGxhY2VBbGwiLCJlbnYiLCJlbnZWYXJzIiwiZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMiLCJjd2QiLCJlbnZQYXRocyIsImVudlBhdGgiLCJjYXNjYWRlIiwiY2FzY2FkZUVudiIsImNhc2NhZGVOb2RlRW52IiwiTk9ERV9FTlYiLCJhdXRvQ2FzY2FkZUVudiIsIldCX0VOViIsImluY2x1ZGVSb290RW52Iiwicm9vdFBhdGgiLCJmbGF0TWFwIiwiZmlsdGVyIiwicmVsYXRpdmUiLCJlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlycyIsImNvdW50Iiwia2V5IiwidmFsdWUiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwia2V5cyIsInJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhcnNlIiwicGFja2FnZUpzb25QYXRoIiwiaGFzUHJpc21hIiwiZGVwZW5kZW5jaWVzIiwicHJpc21hIiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzVml0ZXN0Iiwidml0ZXN0Iiwic2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQiLCJDSSIsImNvbmZpZ1BhdGgiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImRpcm5hbWUiLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmlsZU5hbWUiLCJmaW5kIiwiZmluZFNlbGZQcm9qZWN0IiwiZmluZERlc2NlbmRhbnRQcm9qZWN0cyIsInJvb3RBbmRTZWxmUHJvamVjdHMiLCJ0aGlzUHJvamVjdCIsInJvb3RQcm9qZWN0Iiwid29ya3NwYWNlcyIsImVuZHNXaXRoIiwicm9vdCIsInNlbGYiLCJmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyIsImRlc2NlbmRhbnRzIiwiZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIiwicHJvamVjdHMiLCJ3b3Jrc3BhY2UiLCJnbG9iUGF0dGVybiIsInBhY2thZ2VEaXJzIiwid29ya3NwYWNlUGF0aCIsIndzIiwiZ2xvYmJ5IiwiZG90Iiwib25seURpcmVjdG9yaWVzIiwic3ViUGFja2FnZURpclBhdGgiLCJpc1J1bm5pbmdPbkJ1biIsInZlcnNpb25zIiwiYnVuIiwibnBtX2V4ZWNwYXRoIiwicnVudGltZVdpdGhBcmdzIiwicGFja2FnZU1hbmFnZXIiLCJwYWNrYWdlTWFuYWdlcldpdGhSdW4iLCJidWlsZElmTmVlZGVkQ29tbWFuZCIsImRlc2NyaWJlIiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiYWxpYXMiLCJoYW5kbGVyIiwicHJvamVjdFBhdGhGb3JUZXN0aW5nIiwicHJvamVjdCIsImNoYWxrIiwicmVkIiwiY2FuU2tpcCIsImNhY2hlRmlsZVBhdGgiLCJjb250ZW50SGFzaCIsImNhY2hlRGlyZWN0b3J5UGF0aCIsInByb21pc2VzIiwibWtkaXIiLCJyZWN1cnNpdmUiLCJoYXNoIiwiY3JlYXRlSGFzaCIsImNvbW1pdEhhc2giLCJjaGlsZF9wcm9jZXNzIiwiZXhlY1N5bmMiLCJ0cmltIiwiZW52aXJvbm1lbnRKc29uIiwiaWdub3JpbmdFbnZWYXJOYW1lcyIsImhhcyIsInRvU29ydGVkIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRGaWxlUGF0aHMiLCJzcGF3blN5bmMiLCJzdGRpbyIsImVuY29kaW5nIiwic3BsaXQiLCJyZXBsYWNlIiwiaW5jbHVkZVBhdHRlcm5zIiwic29tZSIsInBhdHRlcm4iLCJpbmNsdWRlU3VmZml4Iiwic3VmZml4IiwiZXhjbHVkZVBhdHRlcm5zIiwiY29weSIsImRpZ2VzdCIsInVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdCIsImNhY2hlZENvbnRlbnRIYXNoIiwiZm4iLCJpZ25vcmVFbm9lbnRBc3luYyIsInJlYWRGaWxlIiwiY2FuU2tpcEJ1aWxkIiwiZ3JlZW4iLCJkcnlSdW4iLCJ3cml0ZUZpbGUiLCJidWlsZElmTmVlZGVkIiwicmV0Iiwic2hlbGwiLCJleGl0Q29kZSIsImtpbGxQb3J0SWZOb25DaUNvbW1hbmQiLCJidWlsZGVyIiwicG9ydEVudiIsIlBPUlQiLCJwb3J0IiwiaXNJbnRlZ2VyIiwiZXhpdCIsImtpbGxQb3J0UHJvY2VzcyIsImtpbGxQb3J0SWZOb25DaSIsImtpbGxlZCIsImtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0Iiwib3B0cyIsInByaW50YWJsZVNjcmlwdCIsInJ1bm5hYmxlU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0IiwicHJpbnRTdGFydCIsInByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQiLCJleGVjIiwia2lsbEZ1bmMiLCJraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCIsImNvbmZpZ3VyZUVudiIsInRpbWVvdXQiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsIiwicnVuQW5kV2FpdEZvclJldHVyblZhbHVlIiwib3V0IiwibmV3U2NyaXB0IiwiYmxpdHoiLCJmaXhCdW5Db21tYW5kIiwibm9ybWFsaXplZFNjcmlwdCIsInByZWZpeCIsIndlYWsiLCJncmF5IiwiY3lhbiIsImJvbGQiLCJuZXdFbnYiLCJjaSIsImZvcmNlQ29sb3IiLCJGT1JDRV9DT0xPUiIsImJpb21lRXh0ZW5zaW9ucyIsInByZXR0aWVyRXh0ZW5zaW9ucyIsInByZXR0aWVyT25seUV4dGVuc2lvbnMiLCJleHQiLCJsaW50Q29tbWFuZCIsImZpeCIsImZvcm1hdCIsImZpbGVzIiwiYmlvbWVBcmdzVGV4dCIsInByZXR0aWVyQXJnc1RleHQiLCJzb3J0UGFja2FnZUpzb25BcmdzVGV4dCIsImZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZSIsImZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJmaWxlIiwiU3RyaW5nIiwiZXh0ZW5zaW9uIiwiZXh0bmFtZSIsImJpb21lQ29tbWFuZCIsImJpb21lUHJvbWlzZSIsInByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCIsImNvbW1hbmROYW1lIiwib3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQiLCJvdXRzaWRlIiwiZGVwcyIsInN0YXJ0c1dpdGgiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJkZXZEZXBzIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJyZW1vdmVkRGVwcyIsIndvcmQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwicmVtb3ZlZFNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsInByaXNtYVNjcmlwdHMiLCJkZXBsb3kiLCJhZGRpdGlvbmFsT3B0aW9ucyIsImRlcGxveUZvcmNlIiwiYmFja3VwUGF0aCIsImRpck5hbWUiLCJsaXRlc3RyZWFtIiwibWlncmF0ZSIsInNlZWQiLCJtaWdyYXRlRGV2IiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJzY3JpcHRQYXRoIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJGSUxFX1NDSEVNQSIsIkRBVEFCQVNFX1VSTCIsIlBPU1NJQkxFX1BBVEhTIiwic2NoZW1hUGF0aCIsImRiUGF0aCIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwiZGVmYXVsdCIsInByaXNtYUNvbW1hbmQiLCJ5YXJncyIsImRlcGxveUNvbW1hbmQiLCJkZXBsb3lGb3JjZUNvbW1hbmQiLCJsaXRlc3RyZWFtQ29tbWFuZCIsIm1pZ3JhdGVDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXNldENvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInNlZWRDb21tYW5kIiwic3R1ZGlvQ29tbWFuZCIsImRlZmF1bHRDb21tYW5kIiwiZGVtYW5kQ29tbWFuZCIsInN0cmljdCIsImFsbFByb2plY3RzIiwiZmluZFByaXNtYVByb2plY3RzIiwidW5rbm93bk9wdGlvbnMiLCJleHRyYWN0VW5rbm93bk9wdGlvbnMiLCJkZXBsb3lGb3JjZUJ1aWxkZXIiLCJkZW1hbmRPcHRpb24iLCJvdXRwdXQiLCJyZXN0b3JlZCIsImZ1bGxDb21tYW5kIiwidHJpbUVuZCIsIkJvb2xlYW4iLCJmaWx0ZXJlZCIsImtub3duT3B0aW9ucyIsInNoYXJlZE9wdGlvbktleXMiLCJzaGFyZWRPcHRpb25BbGlhc2VzIiwib3B0aW9uIiwiYWxsS25vd25PcHRpb25zIiwia2ViYWJDYXNlS2V5IiwibWF0Y2giLCJ0b0xvd2VyQ2FzZSIsIml0ZW0iLCJyZXRyeUNvbW1hbmQiLCJyZXRyeSIsImNtZEFuZEFyZ3MiLCJsYXN0U3RhdHVzIiwieWVsbG93Iiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib3MiLCJwbGF0Zm9ybSIsInBhY2thZ2VzIiwiaXNGaWxlIiwidmVyc2lvbiIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJ0b0Rldk51bGwiLCJzaWxlbnQiLCJmaW5kQXZhaWxhYmxlUG9ydCIsInN0YXJ0UG9ydCIsIm1heEF0dGVtcHRzIiwiaXNQb3J0QXZhaWxhYmxlIiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwib25jZSIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkRGV2SW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJ1bmJ1ZmZlciIsImFkZGl0aW9uYWxBcmdzIiwic3RvcCIsInNwYXduU3luY09uRXhpdCIsInN0b3BBbGwiLCJCYXNlU2NyaXB0cyIsImJ1aWxkRG9ja2VyIiwic3RhcnREb2NrZXIiLCJub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQiLCJub3JtYWxpemVkQXJnc1RleHQiLCJ3YWl0QW5kT3BlbkFwcCIsInRlc3RFMkUiLCJwbGF5d3JpZ2h0QXJncyIsInByaXNtYURpcmVjdG9yeSIsInN0YXJ0Q29tbWFuZCIsInRlc3RUYXJnZXQiLCJ0YXJnZXRzIiwiZW52UHJlZml4IiwicGxheXdyaWdodENvbW1hbmQiLCJ0ZXN0RTJFRGV2IiwidGVzdFVuaXQiLCJ3YWl0QXBwIiwiYmxpdHpTY3JpcHRzIiwiYXBwRW52Iiwic3RhcnRQcm9kdWN0aW9uIiwic3RhcnRUZXN0Iiwic3VwZXIiLCJkZWZhdWx0U3RhcnRDb21tYW5kIiwidGVzdFN0YXJ0IiwiaHR0cFNlcnZlclNjcmlwdHMiLCJ3YXRjaCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwicmVtaXhTY3JpcHRzIiwiaHR0cFNlcnZlclBhY2thZ2VzIiwibW9kZSIsImFyZyIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwibmV4dCIsImNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzIiwid2JFbnYiLCJORVhUX1BVQkxJQ19XQl9FTlYiLCJ0ZXN0Q29tbWFuZCIsImUyZSIsImNob2ljZXMiLCJ0ZXN0VGFyZ2V0cyIsInNob3VsZFJ1bkFsbFRlc3RzIiwiaGFzRTJlVGFyZ2V0cyIsInRhcmdldCIsImhhc1VuaXRUYXJnZXRzIiwic2hvdWxkUnVuVW5pdCIsInNob3VsZFJ1bkUyZSIsInVuaXRUYXJnZXRzIiwidW5pdEFyZ3YiLCJ1bml0VGltZW91dCIsImUyZVRhcmdldHMiLCJlMmVBcmd2IiwidGVzdE9uRG9ja2VyIiwiZTJlVGFyZ2V0IiwiV0JfRE9DS0VSIiwidGVzdE9uQ2lDb21tYW5kIiwidGVzdE9uQ2kiLCJ0eXBlQ2hlY2tDb21tYW5kIiwiY29tbWFuZHMiLCJ0eXBlc2NyaXB0IiwicHlyaWdodCIsIm5leHREaXJQYXRoIiwicm1TeW5jIiwiZm9yY2UiLCJleGl0Q29kZXMiLCJhbGwiLCJmaW5hbEV4aXRDb2RlIiwidGNDb21tYW5kIiwiaGlkZUJpbiIsInNjcmlwdE5hbWUiLCJtaWRkbGV3YXJlIiwid29ya2luZ0RpciIsImNoZGlyIiwiQkVSUllfQklOX0ZPTERFUiIsInVwcGVyS2V5IiwidG9VcHBlckNhc2UiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYWNrYWdlSnNvbkRpciIsInVybCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiXSwibWFwcGluZ3MiOiI0ZUF5SEEsTUFBTUEsRUFBZ0IsSUFBSUMsSUFFMUIsU0FBU0MsRUFBWUMsR0FDbkIsTUFBTUMsRUFBU0osRUFBY0ssSUFBSUYsR0FDakMsR0FBSUMsRUFBUSxP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QUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUcsSUFBSTlELEVBQUUsRUFBRUEsRUFBRSxHQUFHQSxHQUFHLEVBQUVsQixFQUFFSixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSU0sRUFBRU4sRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUk0QixFQUFFNUIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUl3QixFQUFFeEIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUl5QixFQUFFekIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUkwQixFQUFFMUIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUkrQixFQUFFL0IsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlnQyxFQUFFaEMsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlpQyxFQUFFakMsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlrQyxFQUFFbEMsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlDLEVBQUVnQyxHQUFHTCxHQUFHLEVBQUVKLElBQUksSUFBSXRCLEVBQUVnQyxHQUFHVixHQUFHLEVBQUVJLElBQUksSUFBSTVCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRUcsR0FBR3FCLEdBQUcsRUFBRUMsSUFBSSxJQUFJeEIsRUFBRUksR0FBR29CLEdBQUcsRUFBRUQsSUFBSSxJQUFJekIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFMkIsR0FBR0csR0FBRyxFQUFFQyxJQUFJLElBQUk5QixFQUFFc0IsR0FBR1EsR0FBRyxFQUFFRCxJQUFJLElBQUkvQixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUV3QixHQUFHUSxHQUFHLEVBQUVDLElBQUksSUFBSWhDLEVBQUV3QixHQUFHUSxHQUFHLEVBQUVELElBQUksSUFBSWpDLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVE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TTRJLEVBQVFsakIsUUFBUStKLE9BQ3pCb1osV0FBVyxNQUNYOWpCLFFBQVE4YSxJQUNSaUosV0FBWXJaLElBQ1gsTUFBTXNaLEVBQWF0WixFQUFLLGVBQ3hCLEdBQUlzWixFQUFZLENBQ2QsTUFBTXBaLEVBQVVwTCxFQUFLQyxRQUFRdWtCLEdBQzdCcmpCLFFBQVFzakIsTUFBTXJaLEVBQ2hCLEV0QzBHRyxTQUE4Q3NCLEdBRS9DQSxFQUFReUMsTUFBUXpDLEVBQVFnWSxtQkFDMUJoWSxFQUFReUMsS0FBT3pDLEVBQVF5QyxLQUFLb0UsUUFBUSxHQUFHN0csRUFBUWdZLG9CQUFxQixJQUVqRWxZLFdBQVcsbUNBQW9DLElBRS9DQSxXQUFXLHNCQUF1QixJQUNsQ0EsV0FBVyxpQkFBa0IsS0FFbEMsSUFBSyxNQUFNb0IsS0FBT3ZELE9BQU8yRCxLQUFLdEIsR0FBVSxDQUN0QyxNQUFNaVksRUFBVy9XLEVBQUlnWCxlQUVuQkQsRUFBU3pMLFdBQVcsU0FDcEJ5TCxFQUFTekwsV0FBVyxVQUNwQnlMLEVBQVN6TCxXQUFXLFdBQ1AsZ0JBQWJ5TCxHQUNhLGFBQWJBLFdBR09qWSxFQUFRa0IsRUFFbkIsQ0FDRixDc0MvSElpWCxDQUFxQzFqQixRQUFRc0wsT0FFOUNuTSxRQUFROFEsR0FDUjlRLFFBQVF1VSxJQUNSdlUsUUFBUXVYLElBQ1J2WCxRQUFReVksSUFDUnpZLFFBQVFrYixJQUNSbGIsUUFBUXFkLElBQ1JyZCxRQUFRMGQsSUFDUjFkLFFBQVFtZ0IsSUFDUm5nQixRQUFRZ2lCLElBQ1JoaUIsUUFBUWtqQixJQUNSbGpCLFFBQVFvakIsSUFDUnBqQixRQUFROGpCLElBQ1JoSSxnQkFDQUMsU0FDQW1DLFFBR0gsV0FDRSxJQUFJc0csRUFBaUI5a0IsRUFBSzhPLFFBQVEsSUFBSXhGLGdCQUFnQnliLEtBQUtDLFVBQzNELE1BQVF2WixFQUFHUyxXQUFXbE0sRUFBSzJMLEtBQUttWixFQUFnQixrQkFDOUNBLEVBQWlCOWtCLEVBQUs4TyxRQUFRZ1csR0FLaEMsT0FIb0JuYixLQUFLdUUsTUFBTXpDLEVBQUdDLGFBQWExTCxFQUFLMkwsS0FBS21aLEVBQWdCLGdCQUFpQixTQUd2RXRHLE9BQ3JCLENBWld5RyxJQUNSQyxPQUFPaGEsS0FhVixJQUFLLE1BQU0vSSxJQUFVLENBQUMsU0FBVSxVQUFXLFdBQ3pDaEIsUUFBUUgsR0FBR21CLEVBQVEsS0FDakJOLEVBQVNWLFFBQVFNLEtBQ2pCTixRQUFRZ1UiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMiwzLDQsNSw2XX0=
9
+ */const E=[..."0123456789abcdef"],N=[6,1536,393216,100663296],A=[0,8,16,24],P=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648];const x=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class R{blocks=[];s=[];reset=!0;finalized=!1;block=0;start=0;lastByteIndex=0;constructor(e,t,n){this.padding=t,this.outputBits=n,this.blockCount=1600-(e<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=n>>5,this.extraBytes=(31&n)>>3;for(let e=0;e<50;++e)this.s[e]=0}update(e){if(this.finalized)throw new Error("finalize already called");const t=this.blocks,n=this.byteCount,r=e.length,s=this.blockCount,o=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<s+1;++i)t[i]=0;for(i=this.start;c<r&&i<n;++c)a=e.codePointAt(c)||0,a<128?t[i>>2]|=a<<A[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<A[3&i++],t[i>>2]|=(128|a>>6&63)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<A[3&i++],t[i>>2]|=(128|a>>12&63)<<A[3&i++],t[i>>2]|=(128|a>>6&63)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[s],i=0;i<s;++i)o[i]^=t[i];j(o),this.reset=!0}else this.start=i}return this}finalize(){if(this.finalized)return;this.finalized=!0;const e=this.blocks;let t=this.lastByteIndex;const n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];j(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let s,o=0,i=0,a="";for(;i<n;){for(o=0;o<e&&i<n;++o,++i)s=t[o],a+=E[s>>4&15]+E[15&s]+E[s>>12&15]+E[s>>8&15]+E[s>>20&15]+E[s>>16&15]+E[s>>28&15]+E[s>>24&15];i%e===0&&(t=x(t),j(t),o=0)}return r&&(s=t[o],a+=E[s>>4&15]+E[15&s],r>1&&(a+=E[s>>12&15]+E[s>>8&15]),r>2&&(a+=E[s>>20&15]+E[s>>16&15])),a}}const j=function(e){let t,n,r,s,o,i,a,c,d,l,u,p,m,f,h,g,b,y,v,w,$,k,E,N,A,x,R,j,S,O,D,T,_,B,C,I,W,V,F,J,z,Y,L,U,M,q,G,H,K,X,Q,Z,ee,te,ne,re,se,oe,ie,ae,ce,de,le;for(r=0;r<48;r+=2)s=e[0]^e[10]^e[20]^e[30]^e[40],o=e[1]^e[11]^e[21]^e[31]^e[41],i=e[2]^e[12]^e[22]^e[32]^e[42],a=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],d=e[5]^e[15]^e[25]^e[35]^e[45],l=e[6]^e[16]^e[26]^e[36]^e[46],u=e[7]^e[17]^e[27]^e[37]^e[47],p=e[8]^e[18]^e[28]^e[38]^e[48],m=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=m^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=s^(c<<1|d>>>31),n=o^(d<<1|c>>>31),e[2]^=t,e[3]^=n,e[12]^=t,e[13]^=n,e[22]^=t,e[23]^=n,e[32]^=t,e[33]^=n,e[42]^=t,e[43]^=n,t=i^(l<<1|u>>>31),n=a^(u<<1|l>>>31),e[4]^=t,e[5]^=n,e[14]^=t,e[15]^=n,e[24]^=t,e[25]^=n,e[34]^=t,e[35]^=n,e[44]^=t,e[45]^=n,t=c^(p<<1|m>>>31),n=d^(m<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=l^(s<<1|o>>>31),n=u^(o<<1|s>>>31),e[8]^=t,e[9]^=n,e[18]^=t,e[19]^=n,e[28]^=t,e[29]^=n,e[38]^=t,e[39]^=n,e[48]^=t,e[49]^=n,f=e[0],h=e[1],q=e[11]<<4|e[10]>>>28,G=e[10]<<4|e[11]>>>28,j=e[20]<<3|e[21]>>>29,S=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,Y=e[40]<<18|e[41]>>>14,L=e[41]<<18|e[40]>>>14,B=e[2]<<1|e[3]>>>31,C=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,b=e[12]<<12|e[13]>>>20,H=e[22]<<10|e[23]>>>22,K=e[23]<<10|e[22]>>>22,O=e[33]<<13|e[32]>>>19,D=e[32]<<13|e[33]>>>19,de=e[42]<<2|e[43]>>>30,le=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,I=e[14]<<6|e[15]>>>26,W=e[15]<<6|e[14]>>>26,y=e[25]<<11|e[24]>>>21,v=e[24]<<11|e[25]>>>21,X=e[34]<<15|e[35]>>>17,Q=e[35]<<15|e[34]>>>17,T=e[45]<<29|e[44]>>>3,_=e[44]<<29|e[45]>>>3,N=e[6]<<28|e[7]>>>4,A=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,se=e[16]<<23|e[17]>>>9,V=e[26]<<25|e[27]>>>7,F=e[27]<<25|e[26]>>>7,w=e[36]<<21|e[37]>>>11,$=e[37]<<21|e[36]>>>11,Z=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,U=e[8]<<27|e[9]>>>5,M=e[9]<<27|e[8]>>>5,x=e[18]<<20|e[19]>>>12,R=e[19]<<20|e[18]>>>12,oe=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,J=e[38]<<8|e[39]>>>24,z=e[39]<<8|e[38]>>>24,k=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=f^~g&y,e[1]=h^~b&v,e[10]=N^~x&j,e[11]=A^~R&S,e[20]=B^~I&V,e[21]=C^~W&F,e[30]=U^~q&H,e[31]=M^~G&K,e[40]=te^~re&oe,e[41]=ne^~se&ie,e[2]=g^~y&w,e[3]=b^~v&$,e[12]=x^~j&O,e[13]=R^~S&D,e[22]=I^~V&J,e[23]=W^~F&z,e[32]=q^~H&X,e[33]=G^~K&Q,e[42]=re^~oe&ae,e[43]=se^~ie&ce,e[4]=y^~w&k,e[5]=v^~$&E,e[14]=j^~O&T,e[15]=S^~D&_,e[24]=V^~J&Y,e[25]=F^~z&L,e[34]=H^~X&Z,e[35]=K^~Q&ee,e[44]=oe^~ae&de,e[45]=ie^~ce&le,e[6]=w^~k&f,e[7]=$^~E&h,e[16]=O^~T&N,e[17]=D^~_&A,e[26]=J^~Y&B,e[27]=z^~L&C,e[36]=X^~Z&U,e[37]=Q^~ee&M,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=k^~f&g,e[9]=E^~h&b,e[18]=T^~N&x,e[19]=_^~A&R,e[28]=Y^~B&I,e[29]=L^~C&W,e[38]=Z^~U&q,e[39]=ee^~M&G,e[48]=de^~te&re,e[49]=le^~ne&se,e[0]^=P[r],e[1]^=P[r+1]},S=function(){const e={instance:Error,from:e=>{const t=[e.name,e.message];return void 0!==e.stack&&t.push(e.stack),void 0!==e.cause&&(void 0===e.stack&&t.push(void 0),t.push(e.cause)),t},stub:()=>new Error,hydrate:(e,[t,n,r,s])=>{e.name=t,e.message=n,void 0===r?delete e.stack:e.stack=r,void 0!==s&&(e.cause=s)}},t={instance:Uint8Array,from:e=>[btoa(D.decode(e))],create:([e])=>O.encode(atob(e))},n={instance:Map,from:e=>[...e.entries()],stub:()=>new Map,hydrate:(e,t)=>{for(const[n,r]of t)e.set(n,r)}},r={instance:Set,from:e=>[...e.values()],stub:()=>new Set,hydrate:(e,t)=>{for(const n of t)e.add(n)}},s={instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},o={instance:RegExp,from:({flags:e,source:t})=>e?[t,e]:[t],create:([e,t])=>new RegExp(e,t)},i={instance:URL,from:e=>[e.href],create:([e])=>new URL(e)};return new Map([e,t,n,r,s,o,i].map(e=>[e.instance.name,e]))}(),O=new TextEncoder,D=new TextDecoder("utf8");function T(e=void 0,t=S){return JSON.stringify(C(e,t))}function _(e){if(void 0===e)return-1;if("number"==typeof e){if(Number.isNaN(e))return-3;if(!Number.isFinite(e))return e<0?-5:-4}return null}const B=[];function C(e,t=S){const n=_(e);if(null!==n)return n;const r=[],s=new Map;return function e(n){const o=_(n);if(null!==o)return o;let i=s.get(n);if(void 0!==i)return i;switch(i=r.length,typeof n){case"number":case"string":case"boolean":r[i]=n,s.set(n,i);break;case"bigint":r[i]=[-6,n.toString(16)],s.set(n,i);break;case"object":if(null===n)r[i]=n,s.set(n,i);else if(Array.isArray(n)){const t=function(e){if(B.length<e){const t=B.length;B.length=e,B.fill(-2,t,e)}return B.slice(0,e)}(n.length);r[i]=t,s.set(n,i);for(const[r,s]of n.entries())t[r]=e(s)}else{const[o,a]=function(e,t){const n=e.constructor;if("function"==typeof n){const r=n.name,s=t.get(r);if(void 0!==s)return[r,s.from(e)]}const r=Object.entries(e),s=r.length,o=Array.from({length:s+s});for(let e=0;e<s;e++){const t=r[e],n=e+e;o[n]=t[0],o[n+1]=t[1]}return["",o]}(n,t),c=a.length,d=Array.from({length:c+1});d[0]=o,r[i]=d,s.set(n,i);for(let t=0;t<c;t++)d[t+1]=e(a[t])}}return i}(e),r}function I(e,t){return function(e){return new R(512,N,512).update(e).hex()}(T([e,t]))}const W=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=I}={}){return function(n,r){let s,o,i;return"getter"===r?.kind?function(){const r=t(this,[]),a=Date.now();return(i!==r||a-o>e)&&(i=r,s=n.call(this),o=a),s}:function(...a){const c=t(this,a),d=Date.now();return(i!==c||d-o>e)&&(i=c,s=r?n.call(this,...a):n(...a),o=d),s}}}({getCacheKey:I});function V(e){return!!e&&"0"!==e&&"false"!==e}let F;class J{static{[F]=function(e,t,n,r,s){var o,i,a,c,d,l,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),m=Object.defineProperty,f=Object.create,h=[f(null),f(null)],g=t.length;function b(t,n,r){return function(s,o){n&&(o=s,s=e);for(var i=0;i<t.length;i++)o=t[i].apply(s,r?[o]:[]);return r?o:s}}function y(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function v(e,t,n,r,s,a,c,d,l,u,p){function f(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),v=t[3],w=!c,k=1===s,E=3===s,N=4===s,A=2===s;function P(t,n,r){return function(s,o){return n&&(o=s,s=e),r&&r(s),x[t].call(s,o)}}if(!w){var x={},R=[],j=E?"get":N||k?"set":"value";if(l?(u||k?x={get:$(function(){return v(this)},r,"get"),set:function(e){t[4](this,e)}}:x[j]=v,u||$(x[j],r,A?"":j)):u||(x=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=h[+d][r])&&7!==(i^s))throw Error("Decorating two elements with the same name ("+x[j].name+") is not supported yet");h[+d][r]=s<3?1:s}}for(var S=e,O=g.length-1;O>=0;O-=n?2:1){var D=y(g[O],"A decorator","be",!0),T=n?g[O-1]:void 0,_={},B={kind:["field","accessor","method","getter","setter","class"][s],name:r,metadata:o,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");y(t,"An initializer","be",!0),a.push(t)}.bind(null,_)};if(w)i=D.call(T,S,B),_.v=1,y(i,"class decorators","return")&&(S=i);else if(B.static=d,B.private=l,i=B.access={has:l?p.bind():function(e){return r in e}},N||(i.get=l?A?function(e){return f(e),x.value}:P("get",0,f):function(e){return e[r]}),A||E||(i.set=l?P("set",0,f):function(e,t){e[r]=t}),S=D.call(T,k?{get:x.get,set:x.set}:x[j],B),_.v=1,k){if("object"==typeof S&&S)(i=y(S.get,"accessor.get"))&&(x.get=i),(i=y(S.set,"accessor.set"))&&(x.set=i),(i=y(S.init,"accessor.init"))&&R.unshift(i);else if(void 0!==S)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(S,(u?"field":"method")+" decorators","return")&&(u?R.unshift(S):x[j]=S)}return s<2&&c.push(b(R,d,1),b(a,d,0)),u||w||(l?k?c.splice(-1,0,P("get",d),P("set",d)):c.push(A?x[j]:y.call.bind(x[j])):m(e,r,x)),S}function E(e){return m(e,p,{configurable:!0,enumerable:!0,value:o})}return o=f(null==o?null:o),d=[],l=function(e){e&&d.push(b(e))},u=function(t,r){for(var o=0;o<n.length;o++){var i=n[o],l=i[1],u=7&l;if((8&l)==t&&!u==r){var p=i[2],m=!!i[3],f=16&l;v(t?e:e.prototype,i,f,m?"#"+p:k(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,m,r,t&&m?function(t){return w(t)===e}:s)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||E(e),{e:i,get c(){var n=[];return g&&[E(e=v(e,[t],r,e.name,5,n)),b(n,1)]}}}(this,[],[[W,3,"isBunAvailable"],[W,3,"buildCommand"],[W,3,"rootDirPath"],[W,3,"dockerfile"],[W,3,"hasDockerfile"],[W,3,"hasSourceCode"],[W,3,"name"],[W,3,"dockerImageName"],[W,3,"env"],[W,3,"packageJson"],[W,3,"packageJsonPath"],[W,3,"hasPrisma"],[W,3,"hasVitest"],[W,3,"skipLaunchingServerForPlaywright"],[W,3,"dockerPackageJson"],[W,3,"binExists"]]).e}argv=void F(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,"..","..","package.json"))?t.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){if(!this.loadEnv)return process.env;const[n,r]=function(n,r){let s=(n.env??[]).map(e=>t.resolve(r,e.toString()));const o=n.cascadeEnv??(n.cascadeNodeEnv?process.env.NODE_ENV||"development":n.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof o){if(0===s.length&&(s.push(t.join(r,".env")),n.includeRootEnv)){const n=t.resolve(r,"..","..");e.existsSync(t.join(n,"package.json"))&&s.push(t.join(n,".env"))}s=s.flatMap(e=>o?[`${e}.${o}.local`,`${e}.local`,`${e}.${o}`,e]:[`${e}.local`,e])}s=s.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e)),n.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",s.join(", ")));const i=[],a={};for(const e of s){let s=0;for(const[n,o]of Object.entries(y(t.join(r,e))))n in a||(a[n]=o,s++);i.push([e,s]),n.verbose&&s>0&&console.info(`Read ${s} environment variables from ${e}`)}if(n.checkEnv){const e=Object.keys(y(t.join(r,n.checkEnv))).filter(e=>!(e in a));if(e.length>0)throw new Error(`Missing environment variables in [${s.join(", ")}]: [${e.join(", ")}]`)}return[a,i]}(this.argv,this.dirPath);for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...process.env,...n}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!!(this.packageJson.dependencies?.prisma??this.packageJson.devDependencies?.prisma)}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get skipLaunchingServerForPlaywright(){if(V(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const s=t.join(r,"node_modules",".bin");if(e.existsSync(s)&&(this.env.PATH=`${s}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const o=t.dirname(r);if(r===o)break;r=o}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}}function z(n,r=!0,s){if(s??=process.cwd(),e.existsSync(t.join(s,"package.json")))return new J(s,n,r)}async function Y(n,r=!0,s){const o=function(n,r=!0,s){if(s??=process.cwd(),!e.existsSync(t.join(s,"package.json")))return;const o=new J(s,n,r);let i=o;if(!o.packageJson.workspaces&&t.dirname(s).endsWith("/packages")){const o=t.resolve(s,"..","..");e.existsSync(t.join(o,"package.json"))&&(i=new J(o,n,r))}return{root:i,self:o}}(n,r,s);if(o)return{...o,descendants:o.root===o.self?await L(n,o.root,r):[o.self]}}async function L(n,r,s){const o=[r],i=r.packageJson.workspaces;if(!Array.isArray(i))return o;const a=[],c=[];for(const n of i.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):a.push(n);c.push(...await l(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&o.push(new J(r,n,s));return o}const U=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),M=U?"bun --bun run":"node",q=U?"bun":"yarn",G=U?"bun --bun run":"yarn",H={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(n){await async function(n,r){const s=z(n,!0,r);if(!s)return console.error(d.red("No project found.")),!0;if(n={...n,command:n.command??(U?"bun run build":"yarn build")},!e.existsSync(t.join(s.rootDirPath,".git")))return K(s,n),!0;const[i,a,l]=await async function(n,r){const s=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await e.promises.mkdir(s,{recursive:!0});const a=c("sha256"),d=o.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!X.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(l),await async function(e,t,n){return new Promise(r=>{const s=o.spawnSync("git",["status"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(Q.some(t=>e.includes(t))||Z.some(t=>e.endsWith(t)))&&!ee.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${s.join(", ")}`);const i=o.spawn("git",["diff","--",...s],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,a);const u=a.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(s,n);if(i)return console.info(d.green(`Skip to run '${n.command}' 💫`)),!1;if(!K(s,n))return;n.dryRun||await e.promises.writeFile(a,l,"utf8");return!0}(n)}};function K(e,t){if(console.info(d.green(`Run '${t.command}'`)),!t.dryRun){const n=o.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const X=new Set(["CI","PWDEBUG","TMPDIR"]);const Q=["src/","public/"],Z=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],ee=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const te={command:"kill-port-if-non-ci",describe:"Kill the port specified by PORT environment variable if non-CI.",builder:{},async handler(e){await async function(){if(V(process.env.CI))return void console.info(`Skip killing port due to CI: ${process.env.CI}`);const e=process.env.PORT,t=Number(e);(!Number.isInteger(t)||t<=0)&&(console.error(d.red(`PORT environment variable is invalid: ${e}`)),process.exit(1));console.info(`Killing the port: ${t}`);try{await p(t)}catch{}}()}};const ne=new Set;async function re(e){try{await p(e)}catch{}}async function se(e,t){try{const n=await async function(e,t){const{stdout:n}=await v("docker",["ps","-q",...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}(e,t);if(0===n.length)return;await v("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}const oe=new m,ie={exitIfFailed:!0};async function ae(e,t,n,r=ie){const[s,o]=de(e,t);if(le(s,t),n.verbose&&le(o,t,"Start (raw)",!0),n.dryRun)return ue(s,0,r),0;const i=/http-get:\/\/127.0.0.1:(\d+)/.exec(o)?.[1];o.includes("wait-on")&&i&&(o.includes("docker run")&&(await async function(e,t){await se(["--filter",`publish=${e}`],t)}(Number(i),t),await async function(e,t){await se(["--filter",`name=${e}`],t)}(t.dockerImageName,t)),await async function(e){await re(e);const t=async()=>{ne.has(e)||(ne.add(e),await re(e))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,t)}(Number(i)));const a=await v(o,void 0,{cwd:t.dirPath,env:pe(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return ue(s,a.status,r),a.status??1}function ce(e,t,n,r=ie){return oe.runAndWaitForReturnValue(async()=>{const[s,o]=de(e,t);if(le(s,t,"Start (parallel)",!0),n.dryRun)return le(s,t,"Started (log)"),n.verbose&&le(o,t,"Started (raw)",!0),ue(s,0,r),0;const i=await v(o,void 0,{cwd:t.dirPath,env:pe(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});le(s,t,"Started (log)"),n.verbose&&le(o,t,"Started (raw)",!0);const a=i.stdout.trim();return a&&(process.stdout.write(a),process.stdout.write("\n")),ue(s,i.status,r),i.status??1})}function de(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",U?"bun --bun run ":"yarn run ");U&&(n=n.replaceAll("YARN build-ts run","bun --bun run").replaceAll("bun --bun run bun --bun run","bun --bun run").replaceAll("dist/index.js","src/index.ts").replaceAll(/(?:YARN )?vitest run/g,"bun test").replaceAll(/ --color --passWithNoTests(?: --allowOnly)?/g,"")),n=n.trim();const r=me(n.replaceAll("YARN ",`${G} `)),s=me(n.replaceAll("YARN playwright ",`${G} playwright `).replaceAll("YARN ",!U&&t.binExists?"":`${G} `));return[`dotenv${t.env.WB_ENV?` --cascade-env=${t.env.WB_ENV||"development"}`:""} ${r}`,s]}function le(e,t,n="Start",r=!1){console.info("\n"+(r?d.gray:d.cyan)(d.bold(`${n}:`),e)+d.gray(` at ${t.dirPath}`))}function ue(e,t,n){0===t?console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function pe(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function me(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const fe=new Set(["cjs","cts","js","json","jsonc","jsx","mjs","mts","ts","tsx"]),he=new Set(["cjs","cts","htm","html","js","json","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),ge=new Set([...he].filter(e=>!fe.has(e))),be={command:"lint [files...]",describe:"Lint code on Bun",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"}},async handler(e){U||(console.error(d.red("This command is only available on Bun.")),process.exit(1));const n=await Y(e,!1);n||(console.error(d.red("No project found.")),process.exit(1));const r=e.files??[];let s,o,i;if(r.length>0){const e=[],n=[],a=[];for(const s of r){const r=t.resolve(String(s));if(r.endsWith("/test/fixtures")||r.includes("/test/fixtures/")||r.endsWith("/test-fixtures")||r.includes("/test-fixtures/"))continue;const o=t.extname(r).slice(1);r.endsWith("/package.json")?a.push(r):fe.has(o)?e.push(r):he.has(o)&&n.push(r)}s=e.map(e=>`"${e}"`).join(" "),o=n.map(e=>`"${e}"`).join(" "),i=a.map(e=>`"${e}"`).join(" ")}else s="",o=`"**/{.*/,}*.{${[...ge].join(",")}}" "!**/test{-,/}fixtures/**"`,i=n.descendants.map(e=>`"${e.packageJsonPath}"`).join(" ");const a=e.fix&&e.format?"check --fix":e.fix?"lint --fix":e.format?"format --fix":"lint";let c;(s||0===r.length)&&(c=ce(`bun --bun biome ${a} --colors=force --no-errors-on-unmatched --files-ignore-unknown=true ${s}`,n.self,e,{forceColor:!0})),e.format&&(o&&ce(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${o}`,n.self,e,{forceColor:!0}),i&&(await c,ce(`bun --bun sort-package-json ${i}`,n.self,e,{forceColor:!0})))}};function*ye(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const ve={command:"optimizeForDockerBuild",describe:"Optimize configuration when building a Docker image",builder:{outside:{description:"Whether the optimization is executed outside a docker container or not",type:"boolean",alias:"o"}},async handler(n){const r=await Y(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const s of ye("optimizeForDockerBuild",r.descendants)){const r=s.packageJson,o=["dependencies","devDependencies"];for(const e of o){const t=r[e]??{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(we(n,r),$e(r),ke(r),n.dryRun)continue;const i=n.outside?t.join(s.dirPath,"dist"):s.dirPath;await e.promises.mkdir(i,{recursive:!0}),await e.promises.writeFile(t.join(i,"package.json"),JSON.stringify(r),"utf8")}n.dryRun||n.outside||(o.spawnSync(q,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function we(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["artillery","biome","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],s=[];for(const e of Object.keys(n))(r.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete n[e],s.push(e));console.info("Removed devDependencies:",s.join(", ")||"none")}function $e(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts??{},s=[];for(const[e,o]of Object.entries(r))(t.some(t=>e.startsWith(t))||n.some(e=>o.includes(e)||o.trim()===e.trim()))&&(delete r[e],s.push(e));console.info("Removed scripts:",s.join(", ")||"none")}function ke(e){delete e.private,delete e.publishConfig,delete e.prettier}const Ee=new class{deploy(e,t=""){return"PRISMA migrate deploy"+(t?` ${t}`:"")}deployForce(e,t){const n=e.packageJson.dependencies?.blitz?"db":"prisma";return`rm -Rf ${n}/mount/prod.sqlite3*; PRISMA migrate reset --force && rm -Rf ${n}/mount/prod.sqlite3*\n && litestream restore -o ${n}/mount/prod.sqlite3 ${t} && ls -ahl ${n}/mount/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}litestream(e){return`${M} -e '\nconst { PrismaClient } = require("@prisma/client");\nnew PrismaClient().$queryRaw\`PRAGMA journal_mode = WAL;\`\n .catch((error) => { console.log("Failed due to:", error); process.exit(1); });\n'`}migrate(e,t=""){return`PRISMA migrate deploy${t?` ${t}`:""} && PRISMA generate && ${this.seed(e)}`}migrateDev(e,t=""){return"PRISMA migrate dev"+(t?` ${t}`:"")}reset(e,t=""){return`PRISMA migrate reset --force --skip-seed${t?` ${t}`:""} && ${this.seed(e)}`}restore(e,t,n){return`rm -Rf ${e.packageJson.dependencies?.blitz?"db":"prisma"}/restored.sqlite3; GOOGLE_APPLICATION_CREDENTIALS=gcp-sa-key.json litestream restore -o ${n} ${t}`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(n,r,s=""){const o="file:";let i="";if(r)try{new URL(r),i=`DATABASE_URL=${r} `}catch{i=`DATABASE_URL=${o}${t.resolve(r)} `}else if(n.env.DATABASE_URL?.startsWith(o)){const r=[{schemaPath:t.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:t.join("prisma","schema"),dbPath:t.join("prisma","schema")},{schemaPath:t.join("db","schema.prisma"),dbPath:"db"}];for(const{dbPath:s,schemaPath:a}of r)if(e.existsSync(t.resolve(n.dirPath,a))){i=`DATABASE_URL=${o}${t.resolve(n.dirPath,s,n.env.DATABASE_URL.slice(5))} `;break}}return`${i}PRISMA studio${s?` ${s}`:""}`}},Ne={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"},"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}},Ae={},Pe={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(xe).command(je).command(Se).command(Oe).command(De).command(Te).command(_e).command(Be).command(Ce).command(Ie).demandCommand().strict(!1),handler(){}},xe={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Ae,async handler(e){const t=await We(e),n=Ve(e);for(const r of ye("prisma deploy",t))await ae(Ee.deploy(r,n),r,e)}},Re={...Ae,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},je={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Re,async handler(e){const t=await We(e);for(const n of ye("prisma deploy-force",t))await ae(Ee.deployForce(n,e.backupPath),n,e)}},Se={command:"litestream",describe:"Setup DB for Litestream",builder:Ae,async handler(e){const t=await We(e);for(const n of ye("prisma litestream",t))await ae(Ee.litestream(n),n,e)}},Oe={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Ae,async handler(e){const t=await We(e),n=Ve(e);for(const r of ye("prisma migrate",t))await ae(Ee.migrate(r,n),r,e)}},De={command:"migrate-dev",describe:"Create a migration file",builder:Ae,async handler(e){const t=await We(e),n=Ve(e);for(const r of ye("prisma migrate-dev",t))await ae(Ee.migrateDev(r,n),r,e)}},Te={command:"reset",describe:"Reset DB",builder:Ae,async handler(e){const t=await We(e),n=Ve(e);for(const r of ye("prisma reset",t))await ae(Ee.reset(r,n),r,e)}},_e={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...Re,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await We(e);for(const n of ye("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await ae(Ee.restore(n,e.backupPath,t),n,e)}}},Be={command:"seed",describe:"Populate DB with seed data",builder:{...Ae,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await We(e);for(const n of ye("prisma seed",t))await ae(Ee.seed(n,e.file),n,e)}},Ce={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...Ae,"db-url-or-path":{description:"URL or path to the database",type:"string"},restored:{description:"Whether to open the default restored database (<db|prisma>/restored.sqlite3).",type:"boolean"}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw new Error("You cannot specify both --restored and --db-url-or-path.");const t=await We(e),n=Ve(e,["db-url-or-path","restored"]);for(const r of ye("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await ae(Ee.studio(r,t,n),r,e)}}},Ie={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await We(e),n=[(e.args?.join(" ")??"").trimEnd(),Ve(e,["args"])].filter(Boolean).join(" ");for(const r of ye(`prisma ${n}`,t))await ae(`PRISMA ${n}`,r,e)}};async function We(e){const t=await Y(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=t.descendants.filter(e=>e.packageJson.dependencies?.prisma??e.packageJson.devDependencies?.prisma);return 0===n.length&&(console.error(d.red("No prisma project found.")),process.exit(1)),n}function Ve(e,t=[]){const n=[],r=Object.keys(Ne),s=Object.values(Ne).flatMap(e=>"alias"in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),o=new Set([...t,...r,...s,"_","$0"]);for(const[t,r]of Object.entries(e))if(!o.has(t)){const s=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(s!==t&&void 0!==e[s])continue;if("boolean"==typeof r&&r)n.push(`--${t}`);else if("string"==typeof r||"number"==typeof r)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(const e of r)n.push(`--${t}`,String(e))}return n.join(" ")}const Fe={command:"retry [command] [args...]",describe:"Retry the given command until it succeeds",builder:{retry:{description:"A maximum retry count",type:"number",alias:"r",default:3}},async handler(e){const t=z(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let s=0;s<e.retry;s++)if(s>0&&console.info(`\n${d.yellow(`#${s} Retrying: ${n.join(" ")}`)}`),r=await ae(n.join(" "),t,e,{exitIfFailed:!1}),0===r)return;process.exit(r)}},Je={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await Y(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of ye("setup",n.descendants)){const r=await f.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===h.platform()){const n=["pstree"];t.hasDockerfile&&n.push("expect"),await ce(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await ae("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await ce("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await ce(`poetry env use ${n}`,t,e),await oe.promiseAll(),await ae("poetry run pip install --upgrade pip",t,e),await ae("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await ae(`${G} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await ae(`${G} playwright install --with-deps`,r,e)}(e)}};function ze(e){return e.silent?" > /dev/null":""}async function Ye(e=3e3,t=100){for(let n=e;n<e+t;n++)if(await Le(n))return n;throw new Error(`No available port found in range ${e}-${e+t-1}`)}async function Le(e){return new Promise(t=>{const n=g();n.once("error",e=>{e.code,t(!1)}),n.once("listening",()=>{n.close(()=>{t(!0)})}),n.listen(e,"127.0.0.1")})}const Ue=new class{buildDevImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)\n --build-arg WB_ENV=${e.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t=!1,n="",r=""){return`${this.stop(e)} && ${t?"unbuffer ":""}${this.start(e,n,r)}`}start(e,t="",n=""){return function(e,t){const n=()=>{if(ne.has(e))return;ne.add(e),le(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ue(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e),`docker run --rm -it -p \${PORT:-8080}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class Me{buildDocker(e,t="development"){return Ue.buildDevImage(e,t)}startDocker(e,t){const n=Number(e.env.PORT)||8080;return`${this.buildDocker(e)}${ze(t)}\n && YARN concurrently --raw --kill-others-on-fail\n "${Ue.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n="test test/e2e/",prismaDirectory:r,startCommand:s}){const o=e.env.WB_ENV,i=e.env.PORT||"8080",a=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",c=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/",d=`WB_ENV=${o} NEXT_PUBLIC_WB_ENV=${o} APP_ENV=${o} PORT=${i}`,l=n.startsWith("test ")?`BUN playwright ${n}`:`BUN playwright test ${c}`;if(e.skipLaunchingServerForPlaywright)return`${d} ${l}${a}`;return`${d} YARN concurrently --kill-others --raw --success first\n "${r?`rm -Rf ${r}/mount && `:""}${s} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${i}\n && ${l}${a}"`}testE2EDev(e,t,{playwrightArgs:n="test test/e2e/",startCommand:r}){const s=e.env.WB_ENV,o=e.env.PORT||"8080",i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",a=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/",c=`WB_ENV=${s} NEXT_PUBLIC_WB_ENV=${s} APP_ENV=${s} PORT=${o}`,d=n.startsWith("test ")?`BUN playwright ${n}`:`BUN playwright test ${a}`;return e.skipLaunchingServerForPlaywright?`${c} ${d}${i}`:`${c} YARN concurrently --kill-others --raw --success first\n "${r} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o}\n && ${d}${i}"`}testUnit(e,t){const n=t.targets&&t.targets.length>0?t.targets.join(" "):"test/unit/";return e.hasVitest?`WB_ENV=${e.env.WB_ENV} YARN vitest run ${n} --color --passWithNoTests --allowOnly`:e.isBunAvailable?`WB_ENV=${e.env.WB_ENV} bun test ${n}`:'echo "No tests."'}waitApp(e,t,n=e.env.PORT||3e3){return`wait-on -t 10000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 90000 -i 10000 http-get://127.0.0.1:${n}`}waitAndOpenApp(e,t,n=e.env.PORT||3e3){return`${this.waitApp(e,t,n)} || wait-on http-get://127.0.0.1:${n} && open-cli http://\${HOST:-localhost}:${n}`}}const qe=new class extends Me{start(e,t){const n=e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:"",r=Number(e.env.PORT)||3e3;return`${n}YARN concurrently --raw --kill-others-on-fail\n "blitz dev -p ${r} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,r)}"`}startProduction(e,t,n){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[Ee.migrate(e),e.buildCommand,`PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}startTest(e,t){const n=Number(e.env.PORT)||8080;return`YARN concurrently --raw --kill-others-on-fail\n "${[...Ee.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${ze(t)}`).join(" && ")}"\n "${this.waitApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...Ee.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${ze(t)}`).join(" && ")})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r}){const s=`blitz dev -p ${e.env.PORT||"8080"}${ze(t)}`;return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r??s})}async testStart(e,t){const n=await Ye();return`WB_ENV=${e.env.WB_ENV} YARN concurrently --kill-others --raw --success first "blitz dev -p ${n}${ze(t)}" "${this.waitApp(e,t,n)}"`}};const Ge=new class extends Me{start(e,t){return`PORT=${Number(e.env.PORT)||3e3} YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)}${ze(t)} && ${Ue.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand}${ze(t)} && NODE_ENV=production PORT=\${PORT:-${n}} ${M} dist/index.js ${t.normalizedArgsText??""}`}startTest(e,t){return`${e.hasPrisma?"prisma migrate reset --force --skip-generate && ":""}(${this.startProduction(e,t)})`}testE2E(e,t,n={}){const{startCommand:r=`${e.hasPrisma?"prisma migrate reset --force --skip-generate && ":""}(${this.startProduction(e,t)})`}=n,s=e.env.PORT||"8080",o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=${s} YARN concurrently --kill-others --raw --success first\n "${r} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s} && vitest run ${i} --color --passWithNoTests --allowOnly${o}"`}testE2EDev(e,t,n={}){const{startCommand:r}=n,s=e.env.PORT||"8080",o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=${s} YARN concurrently --kill-others --raw --success first\n "${r??this.start(e,t)} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s} && vitest run ${i} --color --passWithNoTests --allowOnly${o}"`}async testStart(e,t){const n=await Ye();return`WB_ENV=${e.env.WB_ENV} PORT=${n} YARN concurrently --kill-others --raw --success first "${this.start(e,t)}" "${this.waitApp(e,t,n)}"`}};const He=new class extends Me{start(e,t){const n=Number(e.env.PORT)||3e3;return`YARN concurrently --raw --kill-others-on-fail\n "next dev --turbopack -p ${n} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?[Ee.migrate(e)]:[],e.buildCommand,`PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}startTest(e,t){const n=Number(e.env.PORT)||8080;return`YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?Ee.reset(e).split("&&"):[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${ze(t)}`).join(" && ")}"\n "${this.waitApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...e.hasPrisma?Ee.reset(e).split("&&"):[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${ze(t)}`).join(" && ")})}testE2EDev(e,t,{startCommand:n}){const r=`next dev --turbopack -p ${e.env.PORT||"8080"}${ze(t)}`;return super.testE2EDev(e,t,{startCommand:n??r})}async testStart(e,t){const n=await Ye();return`WB_ENV=${e.env.WB_ENV} YARN concurrently --kill-others --raw --success first "next dev --turbopack -p ${n}${ze(t)}" "${this.waitApp(e,t,n)}"`}};const Ke=new class extends Me{start(e,t){return`PORT=${Number(e.env.PORT)||3e3} YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)}${ze(t)} && ${Ue.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${M} dist/index.js ${t.normalizedArgsText??""}`}startTest(){return"echo 'do nothing.'"}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return Promise.resolve("echo 'do nothing.'")}};const Xe=new class extends Me{start(e,t){const n=Number(e.env.PORT)||3e3;return`PORT=${n} YARN concurrently --raw --kill-others-on-fail\n "remix dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${Ee.migrate(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}startTest(e,t){const n=Number(e.env.PORT)||8080;return`YARN concurrently --raw --kill-others-on-fail\n "${[...Ee.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${ze(t)}`).join(" && ")}"\n "${this.waitApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"prisma",startCommand:n.startCommand??[...Ee.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${ze(t)}`).join(" && ")})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r=`remix dev${ze(t)}`}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r})}async testStart(e,t){const n=await Ye();return`WB_ENV=${e.env.WB_ENV} PORT=${n} YARN concurrently --kill-others --raw --success first "remix dev${ze(t)}" "${this.waitApp(e,t,n)}"`}},Qe=["express","fastify","elysia","hono"],Ze={command:"start [args..]",describe:"Start app",builder:{watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug | test",type:"string",alias:"m"}},async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[]].map(e=>`'${e}'`).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>`'${e}'`).join(" ")}(e);const t=await Y(e);t||(console.error(d.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let s;if(t.blitz)s=qe;else if(t.next)s=He;else if(r["@remix-run/dev"])s=Xe;else if(Qe.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))s=Ge;else{if(!t["build-ts"]&&!r["build-ts"])continue;s=Ke}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":{const r=et(t,"development");await ae(`${r}${s.start(n,e)}`,n,e);break}case"staging":{const r=et(t,"staging"),o=Number(n.env.PORT)||8080;await ae(`${r}${s.startProduction(n,e,o)}`,n,e);break}case"docker":{const r=et(t,"staging");await ae(`${r}${s.startDocker(n,e)}`,n,e);break}case"docker-debug":{const r=et(t,"staging");e.normalizedArgsText="'/bin/bash'",await ae(`${r}${s.startDocker(n,e)}`,n,e);break}case"test":{const r=et(t,"test");await ae(`${r}${s.startTest(n,e)}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function et(e,t){process.env.WB_ENV||=t;let n=`WB_ENV=${process.env.WB_ENV} `;return e.next&&(process.env.NEXT_PUBLIC_WB_ENV=process.env.WB_ENV,n+=`NEXT_PUBLIC_WB_ENV=${process.env.WB_ENV} `),n}const tt={command:"test [targets...]",describe:"Test project. If you pass no arguments, it will run all tests.",builder:{e2e:{description:"E2e test mode: headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string",choices:["headless","headless-dev","headed","headed-dev","docker","docker-debug","debug","generate","trace"],default:"headless"},silent:{description:"Reduce redundant outputs",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"},targets:{description:"Test target paths",type:"array"}},async handler(n){await async function(n){const r=await Y(n);r||(console.error(d.red("No project found.")),process.exit(1));r.descendants.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const s=n.targets??[],o=0===s.length,i=s.some(e=>e.includes("/e2e")),a=s.some(e=>e.includes("/unit")),c=o||a,l=o||i;for(const o of r.descendants){const r=o.packageJson.dependencies??{},i=o.packageJson.devDependencies??{};let a;if(a=r.blitz?qe:r.next?He:i["@remix-run/dev"]?Xe:Qe.some(e=>r[e])&&!r["firebase-functions"]?Ge:Ke,console.info(`Running "test" for ${o.name} ...`),c&&e.existsSync(t.join(o.dirPath,"test","unit"))){const e=s.filter(e=>e.includes("/unit")),t={...n,targets:e.length>0?e:void 0};await ae(a.testUnit(o,t),o,n,{timeout:n.unitTimeout})}if(!l||!e.existsSync(t.join(o.dirPath,"test","e2e")))continue;const d=s.filter(e=>e.includes("/e2e")),u={...n,targets:d.length>0?d:void 0};switch(n.e2e){case"headless":await ae(a.testE2E(o,u,{}),o,n);continue;case"headless-dev":await ae(a.testE2EDev(o,u,{}),o,n);continue;case"docker":await nt(o,u,a);continue;case"docker-debug":{const e=d.length>0?d.join(" "):"test/e2e/";await nt(o,u,a,`test ${e} --debug`);continue}}if(r.blitz||r.next||i["@remix-run/dev"]){const e=d.length>0?d.join(" "):"test/e2e/";switch(n.e2e){case"headed":await ae(a.testE2E(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"headed-dev":await ae(a.testE2EDev(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"debug":await ae(a.testE2E(o,u,{playwrightArgs:`test ${e} --debug`}),o,n);break;case"generate":{const e=o.env.PORT||"8080";await ae(a.testE2E(o,u,{playwrightArgs:`codegen http://localhost:${e}`}),o,n);break}case"trace":await ae("BUN playwright show-trace",o,n)}}}}(n)}};async function nt(e,t,n,r){process.env.WB_DOCKER??="1",await ae(`${n.buildDocker(e,"test")}${ze(t)}`,e,t),process.exitCode=await ae(n.testE2E(e,t,{playwrightArgs:r,startCommand:`${Ue.stopAndStart(e,!0)}${ze(t)}`}),e,t,{exitIfFailed:!1}),await ae(Ue.stop(e),e,t)}const rt={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{},async handler(n){await async function(n){const r=await Y(n);r||(console.error(d.red("No project found.")),process.exit(1));process.env.CI||="1",process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const s of r.descendants){const r=s.packageJson.dependencies??{},o=s.packageJson.devDependencies??{};let i;if(i=r.blitz?qe:r.next?He:o["@remix-run/dev"]?Xe:Qe.some(e=>r[e])&&!r["firebase-functions"]?Ge:Ke,console.info(`Running "test-on-ci" for ${s.name} ...`),await ce(Ue.stopAll(),s,n),e.existsSync(t.join(s.dirPath,"test","unit"))&&await ce(i.testUnit(s,n).replaceAll(" --allowOnly",""),s,n),await ce(await i.testStart(s,n),s,n),await oe.promiseAll(),e.existsSync(t.join(s.dirPath,"test","e2e"))){s.hasDockerfile&&(process.env.WB_DOCKER??="1",await ae(`${i.buildDocker(s,"test")}${ze(n)}`,s,n));const e=s.hasDockerfile?{startCommand:Ue.stopAndStart(s,!0)}:{};process.exitCode=await ae(i.testE2E(s,n,e).replaceAll(" --allowOnly",""),s,n,{exitIfFailed:!1}),await ae(Ue.stop(s),s,n)}}}(n)}};const st={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await Y(n,!1);r||(console.error(d.red("No project found.")),process.exit(1));const s=r.descendants.map(async s=>{const o=[];for(s.packageJson.workspaces?s.hasSourceCode&&(s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&o.push("BUN tsc --noEmit --Pretty"):((s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&o.push("BUN tsc --noEmit --Pretty"),s.packageJson.devDependencies?.pyright&&o.push("YARN pyright"));o.length>0;){const i=await ce(o.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),a=t.join(s.dirPath,".next");if(!i||!e.existsSync(a))return i;e.rmSync(a,{force:!0,recursive:!0}),console.info(d.yellow("Removed `.next` directory. We will re-try type checking."))}}),o=await Promise.all(s);let i=0;for(const[e,t]of o.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(d.yellow('Please try "yarn gen-code" if you face unknown type errors.')),i=t}i&&process.exit(i)}},ot={...st,command:"tc"};await r(s(process.argv)).scriptName("wb").options(Ne).middleware(e=>{const n=e["working-dir"];if(n){const e=t.resolve(n);process.chdir(e)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)}).command(H).command(te).command(be).command(ve).command(Pe).command(Fe).command(Je).command(Ze).command(tt).command(rt).command(st).command(ot).demandCommand().strict().version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).help().argv;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{n(process.pid),process.exit()});
10
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2xpbnQudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ByaXNtYS50cyIsIi4uL3NyYy9jb21tYW5kcy9yZXRyeS50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cC50cyIsIi4uL3NyYy9zY3JpcHRzL2J1aWxkZXIudHMiLCIuLi9zcmMvdXRpbHMvZmluZFBvcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9kb2NrZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9jb21tYW5kcy9zdGFydC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3RPbkNpLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3R5cGVjaGVjay50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICBlbnY6IHtcbiAgICBkZXNjcmlwdGlvbjogJy5lbnYgZmlsZXMgdG8gYmUgbG9hZGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgJ2Nhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0Vudmlyb25tZW50IHRvIGxvYWQgY2FzY2FkaW5nIC5lbnYgZmlsZXMgKGUuZy4sIGAuZW52YCwgYC5lbnYuPGVudmlyb25tZW50PmAsIGAuZW52LmxvY2FsYCBhbmQgYC5lbnYuPGVudmlyb25tZW50Pi5sb2NhbGApLiBQcmVmZXJyZWQgb3ZlciBgY2FzY2FkZS1ub2RlLWVudmAgYW5kIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICAnY2FzY2FkZS1ub2RlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LiBQcmVmZXJyZWQgb3ZlciBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdhdXRvLWNhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PFdCX0VOViB8fCBOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdpbmNsdWRlLXJvb3QtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSAuZW52IGZpbGVzIGluIHJvb3QgZGlyZWN0b3J5IGlmIHRoZSBwcm9qZWN0IGlzIGluIGEgbW9ub3JlcG8gYW5kIC0tZW52IG9wdGlvbiBpcyBub3QgdXNlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnY2hlY2stZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ2hlY2sgd2hldGhlciB0aGUga2V5cyBvZiB0aGUgbG9hZGVkIC5lbnYgZmlsZXMgYXJlIHNhbWUgd2l0aCB0aGUgZ2l2ZW4gLmVudiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy5lbnYuZXhhbXBsZScsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzLlxuICogTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogQHJldHVybiBbZW52VmFycywgW2VudlBhdGhzLCBlbnZWYXJDb3VudF1bXV1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIFtzdHJpbmcsIG51bWJlcl1bXV0ge1xuICBsZXQgZW52UGF0aHMgPSAoYXJndi5lbnYgPz8gW10pLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgZW52UGF0aC50b1N0cmluZygpKSk7XG4gIGNvbnN0IGNhc2NhZGUgPVxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudlxuICAgICAgICA/IHByb2Nlc3MuZW52LldCX0VOViB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBjYXNjYWRlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChlbnZQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKGN3ZCwgJy5lbnYnKSk7XG4gICAgICBpZiAoYXJndi5pbmNsdWRlUm9vdEVudikge1xuICAgICAgICBjb25zdCByb290UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsICcuLicsICcuLicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdFBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihyb290UGF0aCwgJy5lbnYnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aHMgPSBlbnZQYXRocy5mbGF0TWFwKChlbnZQYXRoKSA9PlxuICAgICAgY2FzY2FkZVxuICAgICAgICA/IFtgJHtlbnZQYXRofS4ke2Nhc2NhZGV9LmxvY2FsYCwgYCR7ZW52UGF0aH0ubG9jYWxgLCBgJHtlbnZQYXRofS4ke2Nhc2NhZGV9YCwgZW52UGF0aF1cbiAgICAgICAgOiBbYCR7ZW52UGF0aH0ubG9jYWxgLCBlbnZQYXRoXVxuICAgICk7XG4gIH1cbiAgZW52UGF0aHMgPSBlbnZQYXRocy5maWx0ZXIoKGVudlBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZW52UGF0aCkpLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMuam9pbignLCAnKSk7XG4gIH1cblxuICBjb25zdCBlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlyczogW3N0cmluZywgbnVtYmVyXVtdID0gW107XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBlbnZQYXRoKSkpKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZW52VmFycykpIHtcbiAgICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzLnB1c2goW2VudlBhdGgsIGNvdW50XSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiBjb3VudCA+IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUmVhZCAke2NvdW50fSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykpO1xuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIFske2VudlBhdGhzLmpvaW4oJywgJyl9XTogWyR7bWlzc2luZ0tleXMuam9pbignLCAnKX1dYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbZW52VmFycywgZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnNdO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMgYW5kIGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICBPYmplY3QuYXNzaWduKHByb2Nlc3MuZW52LCBlbnZWYXJzKTtcbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbmNvbnN0IGNhY2hlZEVudlZhcnMgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcblxuZnVuY3Rpb24gcmVhZEVudkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZWRFbnZWYXJzLmdldChmaWxlUGF0aCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgcGFyc2VkID0gY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGZpbGVQYXRoKSwgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IHt9O1xuICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbGF0ZWQgdG8gbnBtIGFuZCB5YXJuIGZyb20gdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiB2b2lkIHtcbiAgLy8gUmVtb3ZlIG5wbSAmIHlhcm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcHJvY2Vzcy5lbnZcbiAgaWYgKGVudlZhcnMuUEFUSCAmJiBlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnZWYXJzLlBBVEggPSBlbnZWYXJzLlBBVEgucmVwbGFjZShgJHtlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiBtYWNPU1xuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ByaXZhdGVcXC92YXJcXC9mb2xkZXJzXFwvW146XSs6L2csICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGluIExpbnV4XG4gICAgICAucmVwbGFjZUFsbCgvXFwvdmFyXFwvdG1wXFwvW146XSs6L2csICcnKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3RtcFxcL1teOl0rOi9nLCAnJyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICBjb25zdCB1cHBlcktleSA9IGtleS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ05QTV8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnWUFSTl8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnQkVSUllfJykgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnUFJPSkVDVF9DV0QnIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ0lOSVRfQ1dEJ1xuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgU3Bhd25PcHRpb25zLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlLFxuICBTcGF3blN5bmNSZXR1cm5zLFxuICBTdGRpb051bGwsXG4gIFN0ZGlvUGlwZSxcbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHRyZWVLaWxsIGZyb20gJ3RyZWUta2lsbCc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIGFzeW5jaHJvbm91c2x5IGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0c1xuICpcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBQcm9taXNlLWJhc2VkIHdyYXBwZXIgYXJvdW5kIE5vZGUuanMncyBzcGF3biBmdW5jdGlvbiB3aXRoIGFkZGl0aW9uYWwgZmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBlbmNvZGluZyBvZiBzdGRvdXQvc3RkZXJyIGFzIFVURi04XG4gKiAtIE9wdGlvbiB0byBtZXJnZSBzdGRlcnIgaW50byBzdGRvdXRcbiAqIC0gT3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkga2lsbCB0aGUgcHJvY2VzcyBvbiBwYXJlbnQgZXhpdFxuICogLSBPcHRpb24gdG8gcHJvdmlkZSBpbnB1dCB2aWEgc3RkaW5cbiAqIC0gVmVyYm9zZSBsb2dnaW5nIGNhcGFiaWxpdHlcbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIHJ1blxuICogQHBhcmFtIGFyZ3MgLSBMaXN0IG9mIHN0cmluZyBhcmd1bWVudHNcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzIGluY2x1ZGluZyBwaWQsIHN0ZG91dCwgc3RkZXJyLCBzdGF0dXMsIGFuZCBzaWduYWxcbiAqIEB0aHJvd3MgV2lsbCByZWplY3QgdGhlIHByb21pc2UgaWYgdGhlIHByb2Nlc3MgZmFpbHMgdG8gc3Bhd24gb3IgZW5jb3VudGVycyBhbiBlcnJvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzcGF3bkFzeW5jKCdscycsIFsnLWxhJ10sIHsgdmVyYm9zZTogdHJ1ZSB9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5zdGRvdXQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzcGF3bkFzeW5jKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M/OiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3Rkb3V0Py5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3Rkb3V0KSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHN0b3BQcm9jZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc3RvcHBlZCB8fCAhcHJvYy5waWQpIHJldHVybjtcblxuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYHRyZWVLaWxsKCR7cHJvYy5waWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucz8ua2lsbE9uRXhpdCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICB9XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zPy5pbnB1dCkge1xuICAgICAgICBwcm9jLnN0ZGluPy53cml0ZShvcHRpb25zLmlucHV0KTtcbiAgICAgICAgcHJvYy5zdGRpbj8uZW5kKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiLyoqXG4gKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4zXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5jb25zdCB0PVsuLi5cIjAxMjM0NTY3ODlhYmNkZWZcIl0scz1bNiwxNTM2LDM5MzIxNiwxMDA2NjMyOTZdLGk9WzAsOCwxNiwyNF0sZT1bMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF07ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbmV3IGgoNTEyLHMsNTEyKS51cGRhdGUodCkuaGV4KCl9Y29uc3Qgbj10PT57Y29uc3Qgcz1bXTtmb3IoY29uc3RbaSxlXW9mIHQuZW50cmllcygpKXNbaV09ZTtyZXR1cm4gc307Y2xhc3MgaHtibG9ja3M9W107cz1bXTtyZXNldD0hMDtmaW5hbGl6ZWQ9ITE7YmxvY2s9MDtzdGFydD0wO2xhc3RCeXRlSW5kZXg9MDtjb25zdHJ1Y3Rvcih0LHMsaSl7dGhpcy5wYWRkaW5nPXMsdGhpcy5vdXRwdXRCaXRzPWksdGhpcy5ibG9ja0NvdW50PTE2MDAtKHQ8PDEpPj41LHRoaXMuYnl0ZUNvdW50PXRoaXMuYmxvY2tDb3VudDw8Mix0aGlzLm91dHB1dEJsb2Nrcz1pPj41LHRoaXMuZXh0cmFCeXRlcz0oMzEmaSk+PjM7Zm9yKGxldCB0PTA7dDw1MDsrK3QpdGhpcy5zW3RdPTB9dXBkYXRlKHQpe2lmKHRoaXMuZmluYWxpemVkKXRocm93IG5ldyBFcnJvcihcImZpbmFsaXplIGFscmVhZHkgY2FsbGVkXCIpO2NvbnN0IHM9dGhpcy5ibG9ja3MsZT10aGlzLmJ5dGVDb3VudCxvPXQubGVuZ3RoLG49dGhpcy5ibG9ja0NvdW50LGg9dGhpcy5zO2xldCBsLGMsZj0wO2Zvcig7ZjxvOyl7aWYodGhpcy5yZXNldClmb3IodGhpcy5yZXNldD0hMSxzWzBdPXRoaXMuYmxvY2ssbD0xO2w8bisxOysrbClzW2xdPTA7Zm9yKGw9dGhpcy5zdGFydDtmPG8mJmw8ZTsrK2YpYz10LmNvZGVQb2ludEF0KGYpfHwwLGM8MTI4P3NbbD4+Ml18PWM8PGlbMyZsKytdOmM8MjA0OD8oc1tsPj4yXXw9KDE5MnxjPj42KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOmM8NTUyOTZ8fGM+PTU3MzQ0PyhzW2w+PjJdfD0oMjI0fGM+PjEyKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOihjPTY1NTM2KygoMTAyMyZjKTw8MTB8MTAyMyYodC5jb2RlUG9pbnRBdCgrK2YpfHwwKSksc1tsPj4yXXw9KDI0MHxjPj4xOCk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+MTImNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk7aWYodGhpcy5sYXN0Qnl0ZUluZGV4PWwsbD49ZSl7Zm9yKHRoaXMuc3RhcnQ9bC1lLHRoaXMuYmxvY2s9c1tuXSxsPTA7bDxuOysrbCloW2xdXj1zW2xdO3IoaCksdGhpcy5yZXNldD0hMH1lbHNlIHRoaXMuc3RhcnQ9bH1yZXR1cm4gdGhpc31maW5hbGl6ZSgpe2lmKHRoaXMuZmluYWxpemVkKXJldHVybjt0aGlzLmZpbmFsaXplZD0hMDtjb25zdCB0PXRoaXMuYmxvY2tzO2xldCBzPXRoaXMubGFzdEJ5dGVJbmRleDtjb25zdCBpPXRoaXMuYmxvY2tDb3VudCxlPXRoaXMucztpZih0W3M+PjJdfD10aGlzLnBhZGRpbmdbMyZzXSx0aGlzLmxhc3RCeXRlSW5kZXg9PT10aGlzLmJ5dGVDb3VudClmb3IodFswXT10W2ldLHM9MTtzPGkrMTsrK3MpdFtzXT0wO2Zvcih0W2ktMV18PTIxNDc0ODM2NDgscz0wO3M8aTsrK3MpZVtzXV49dFtzXTtyKGUpfWhleCgpe3RoaXMuZmluYWxpemUoKTtjb25zdCBzPXRoaXMuYmxvY2tDb3VudDtsZXQgaT10aGlzLnM7Y29uc3QgZT10aGlzLm91dHB1dEJsb2NrcyxvPXRoaXMuZXh0cmFCeXRlcztsZXQgaCxsPTAsYz0wLGY9XCJcIjtmb3IoO2M8ZTspe2ZvcihsPTA7bDxzJiZjPGU7KytsLCsrYyloPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdK3RbaD4+MTImMTVdK3RbaD4+OCYxNV0rdFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0rdFtoPj4yOCYxNV0rdFtoPj4yNCYxNV07YyVzPT09MCYmKGk9bihpKSxyKGkpLGw9MCl9cmV0dXJuIG8mJihoPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdLG8+MSYmKGYrPXRbaD4+MTImMTVdK3RbaD4+OCYxNV0pLG8+MiYmKGYrPXRbaD4+MjAmMTVdK3RbaD4+MTYmMTVdKSksZn19Y29uc3Qgcj1mdW5jdGlvbih0KXtsZXQgcyxpLG8sbixoLHIsbCxjLGYsYSx1LGQsYixrLHkseCxCLHAsQyx6LEksZyx3LEEsUCxFLGosbSxxLHYsRCxGLEcsSCxKLEssTCxNLE4sTyxRLFIsUyxULFUsVixXLFgsWSxaLCQsXyx0dCxzdCxpdCxldCxvdCxudCxodCxydCxsdCxjdCxmdDtmb3Iobz0wO288NDg7bys9MiluPXRbMF1edFsxMF1edFsyMF1edFszMF1edFs0MF0saD10WzFdXnRbMTFdXnRbMjFdXnRbMzFdXnRbNDFdLHI9dFsyXV50WzEyXV50WzIyXV50WzMyXV50WzQyXSxsPXRbM11edFsxM11edFsyM11edFszM11edFs0M10sYz10WzRdXnRbMTRdXnRbMjRdXnRbMzRdXnRbNDRdLGY9dFs1XV50WzE1XV50WzI1XV50WzM1XV50WzQ1XSxhPXRbNl1edFsxNl1edFsyNl1edFszNl1edFs0Nl0sdT10WzddXnRbMTddXnRbMjddXnRbMzddXnRbNDddLGQ9dFs4XV50WzE4XV50WzI4XV50WzM4XV50WzQ4XSxiPXRbOV1edFsxOV1edFsyOV1edFszOV1edFs0OV0scz1kXihyPDwxfGw+Pj4zMSksaT1iXihsPDwxfHI+Pj4zMSksdFswXV49cyx0WzFdXj1pLHRbMTBdXj1zLHRbMTFdXj1pLHRbMjBdXj1zLHRbMjFdXj1pLHRbMzBdXj1zLHRbMzFdXj1pLHRbNDBdXj1zLHRbNDFdXj1pLHM9bl4oYzw8MXxmPj4+MzEpLGk9aF4oZjw8MXxjPj4+MzEpLHRbMl1ePXMsdFszXV49aSx0WzEyXV49cyx0WzEzXV49aSx0WzIyXV49cyx0WzIzXV49aSx0WzMyXV49cyx0WzMzXV49aSx0WzQyXV49cyx0WzQzXV49aSxzPXJeKGE8PDF8dT4+PjMxKSxpPWxeKHU8PDF8YT4+PjMxKSx0WzRdXj1zLHRbNV1ePWksdFsxNF1ePXMsdFsxNV1ePWksdFsyNF1ePXMsdFsyNV1ePWksdFszNF1ePXMsdFszNV1ePWksdFs0NF1ePXMsdFs0NV1ePWkscz1jXihkPDwxfGI+Pj4zMSksaT1mXihiPDwxfGQ+Pj4zMSksdFs2XV49cyx0WzddXj1pLHRbMTZdXj1zLHRbMTddXj1pLHRbMjZdXj1zLHRbMjddXj1pLHRbMzZdXj1zLHRbMzddXj1pLHRbNDZdXj1zLHRbNDddXj1pLHM9YV4objw8MXxoPj4+MzEpLGk9dV4oaDw8MXxuPj4+MzEpLHRbOF1ePXMsdFs5XV49aSx0WzE4XV49cyx0WzE5XV49aSx0WzI4XV49cyx0WzI5XV49aSx0WzM4XV49cyx0WzM5XV49aSx0WzQ4XV49cyx0WzQ5XV49aSxrPXRbMF0seT10WzFdLFY9dFsxMV08PDR8dFsxMF0+Pj4yOCxXPXRbMTBdPDw0fHRbMTFdPj4+MjgsbT10WzIwXTw8M3x0WzIxXT4+PjI5LHE9dFsyMV08PDN8dFsyMF0+Pj4yOSxydD10WzMxXTw8OXx0WzMwXT4+PjIzLGx0PXRbMzBdPDw5fHRbMzFdPj4+MjMsUj10WzQwXTw8MTh8dFs0MV0+Pj4xNCxTPXRbNDFdPDwxOHx0WzQwXT4+PjE0LEg9dFsyXTw8MXx0WzNdPj4+MzEsSj10WzNdPDwxfHRbMl0+Pj4zMSx4PXRbMTNdPDwxMnx0WzEyXT4+PjIwLEI9dFsxMl08PDEyfHRbMTNdPj4+MjAsWD10WzIyXTw8MTB8dFsyM10+Pj4yMixZPXRbMjNdPDwxMHx0WzIyXT4+PjIyLHY9dFszM108PDEzfHRbMzJdPj4+MTksRD10WzMyXTw8MTN8dFszM10+Pj4xOSxjdD10WzQyXTw8Mnx0WzQzXT4+PjMwLGZ0PXRbNDNdPDwyfHRbNDJdPj4+MzAsc3Q9dFs1XTw8MzB8dFs0XT4+PjIsaXQ9dFs0XTw8MzB8dFs1XT4+PjIsSz10WzE0XTw8Nnx0WzE1XT4+PjI2LEw9dFsxNV08PDZ8dFsxNF0+Pj4yNixwPXRbMjVdPDwxMXx0WzI0XT4+PjIxLEM9dFsyNF08PDExfHRbMjVdPj4+MjEsWj10WzM0XTw8MTV8dFszNV0+Pj4xNywkPXRbMzVdPDwxNXx0WzM0XT4+PjE3LEY9dFs0NV08PDI5fHRbNDRdPj4+MyxHPXRbNDRdPDwyOXx0WzQ1XT4+PjMsQT10WzZdPDwyOHx0WzddPj4+NCxQPXRbN108PDI4fHRbNl0+Pj40LGV0PXRbMTddPDwyM3x0WzE2XT4+Pjksb3Q9dFsxNl08PDIzfHRbMTddPj4+OSxNPXRbMjZdPDwyNXx0WzI3XT4+PjcsTj10WzI3XTw8MjV8dFsyNl0+Pj43LHo9dFszNl08PDIxfHRbMzddPj4+MTEsST10WzM3XTw8MjF8dFszNl0+Pj4xMSxfPXRbNDddPDwyNHx0WzQ2XT4+PjgsdHQ9dFs0Nl08PDI0fHRbNDddPj4+OCxUPXRbOF08PDI3fHRbOV0+Pj41LFU9dFs5XTw8Mjd8dFs4XT4+PjUsRT10WzE4XTw8MjB8dFsxOV0+Pj4xMixqPXRbMTldPDwyMHx0WzE4XT4+PjEyLG50PXRbMjldPDw3fHRbMjhdPj4+MjUsaHQ9dFsyOF08PDd8dFsyOV0+Pj4yNSxPPXRbMzhdPDw4fHRbMzldPj4+MjQsUT10WzM5XTw8OHx0WzM4XT4+PjI0LGc9dFs0OF08PDE0fHRbNDldPj4+MTgsdz10WzQ5XTw8MTR8dFs0OF0+Pj4xOCx0WzBdPWtefngmcCx0WzFdPXlefkImQyx0WzEwXT1BXn5FJm0sdFsxMV09UF5+aiZxLHRbMjBdPUhefksmTSx0WzIxXT1KXn5MJk4sdFszMF09VF5+ViZYLHRbMzFdPVVeflcmWSx0WzQwXT1zdF5+ZXQmbnQsdFs0MV09aXRefm90Jmh0LHRbMl09eF5+cCZ6LHRbM109Ql5+QyZJLHRbMTJdPUVefm0mdix0WzEzXT1qXn5xJkQsdFsyMl09S15+TSZPLHRbMjNdPUxefk4mUSx0WzMyXT1WXn5YJlosdFszM109V15+WSYkLHRbNDJdPWV0Xn5udCZydCx0WzQzXT1vdF5+aHQmbHQsdFs0XT1wXn56JmcsdFs1XT1DXn5JJncsdFsxNF09bV5+diZGLHRbMTVdPXFefkQmRyx0WzI0XT1NXn5PJlIsdFsyNV09Tl5+USZTLHRbMzRdPVheflomXyx0WzM1XT1ZXn4kJnR0LHRbNDRdPW50Xn5ydCZjdCx0WzQ1XT1odF5+bHQmZnQsdFs2XT16Xn5nJmssdFs3XT1JXn53JnksdFsxNl09dl5+RiZBLHRbMTddPURefkcmUCx0WzI2XT1PXn5SJkgsdFsyN109UV5+UyZKLHRbMzZdPVpefl8mVCx0WzM3XT0kXn50dCZVLHRbNDZdPXJ0Xn5jdCZzdCx0WzQ3XT1sdF5+ZnQmaXQsdFs4XT1nXn5rJngsdFs5XT13Xn55JkIsdFsxOF09Rl5+QSZFLHRbMTldPUdeflAmaix0WzI4XT1SXn5IJkssdFsyOV09U15+SiZMLHRbMzhdPV9eflQmVix0WzM5XT10dF5+VSZXLHRbNDhdPWN0Xn5zdCZldCx0WzQ5XT1mdF5+aXQmb3QsdFswXV49ZVtvXSx0WzFdXj1lW28rMV19O2V4cG9ydHtvIGFzIHNoYTNfNTEyfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJjb25zdCBlPVwiXCIsdD1mdW5jdGlvbigpe2NvbnN0IGU9e2luc3RhbmNlOkVycm9yLGZyb206ZT0+e2NvbnN0IHQ9W2UubmFtZSxlLm1lc3NhZ2VdO3JldHVybiB2b2lkIDAhPT1lLnN0YWNrJiZ0LnB1c2goZS5zdGFjayksdm9pZCAwIT09ZS5jYXVzZSYmKHZvaWQgMD09PWUuc3RhY2smJnQucHVzaCh2b2lkIDApLHQucHVzaChlLmNhdXNlKSksdH0sc3R1YjooKT0+bmV3IEVycm9yLGh5ZHJhdGU6KGUsW3QsbixhLHNdKT0+e2UubmFtZT10LGUubWVzc2FnZT1uLHZvaWQgMD09PWE/ZGVsZXRlIGUuc3RhY2s6ZS5zdGFjaz1hLHZvaWQgMCE9PXMmJihlLmNhdXNlPXMpfX0sdD17aW5zdGFuY2U6VWludDhBcnJheSxmcm9tOmU9PltidG9hKGEuZGVjb2RlKGUpKV0sY3JlYXRlOihbZV0pPT5uLmVuY29kZShhdG9iKGUpKX0scz17aW5zdGFuY2U6TWFwLGZyb206ZT0+Wy4uLmUuZW50cmllcygpXSxzdHViOigpPT5uZXcgTWFwLGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3RbbixhXW9mIHQpZS5zZXQobixhKX19LG89e2luc3RhbmNlOlNldCxmcm9tOmU9PlsuLi5lLnZhbHVlcygpXSxzdHViOigpPT5uZXcgU2V0LGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3QgbiBvZiB0KWUuYWRkKG4pfX0scj17aW5zdGFuY2U6RGF0ZSxmcm9tOmU9PltlLnRvSlNPTigpXSxjcmVhdGU6KFtlXSk9Pm5ldyBEYXRlKGUpfSxjPXtpbnN0YW5jZTpSZWdFeHAsZnJvbTooe2ZsYWdzOmUsc291cmNlOnR9KT0+ZT9bdCxlXTpbdF0sY3JlYXRlOihbZSx0XSk9Pm5ldyBSZWdFeHAoZSx0KX0sZD17aW5zdGFuY2U6VVJMLGZyb206ZT0+W2UuaHJlZl0sY3JlYXRlOihbZV0pPT5uZXcgVVJMKGUpfTtyZXR1cm4gbmV3IE1hcChbZSx0LHMsbyxyLGMsZF0ubWFwKGU9PltlLmluc3RhbmNlLm5hbWUsZV0pKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuPXZvaWQgMCxlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5sb2FkRW52KSByZXR1cm4gcHJvY2Vzcy5lbnY7XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gICAgLy8gT3ZlcndyaXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBldmVuIHRob3VnaCB0aGlzIGJlaGF2aW9yIGlzIG5vbi1zdGFuZGFyZFxuICAgIC8vIGJlY2F1c2UgYGJ1biB3YiAuLi5gIHdpbGwgbG9hZCAuZW52IGFuZCAuZW52LmxvY2FsIGJlZm9yZSBgd2JgIGxvYWRzIG90aGVyIHZhcmlhYmxlcy5cbiAgICByZXR1cm4geyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8ucHJpc21hID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wcmlzbWEpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ZpdGVzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpdGVzdCA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udml0ZXN0KTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICBpZiAoaXNDSSh0aGlzLmVudi5DSSkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgICByZXR1cm4gL1xcYndlYlNlcnZlclxcYi8udGVzdChmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IChKU09OLnBhcnNlKFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgICApIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGJpbkZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5kaXJQYXRoO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgICAgdGhpcy5lbnYuUEFUSCA9IGAke2JpblBhdGh9OiR7dGhpcy5lbnYuUEFUSH1gO1xuICAgICAgICBiaW5Gb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJpbkZvdW5kO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0/LmVuZHNXaXRoKCcvYnVuJykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGFyZ3YuY29tbWFuZCA/PyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIH07XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLmdpdCcpKSkge1xuICAgIGJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgW2NhblNraXAsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXSA9IGF3YWl0IGNhblNraXBCdWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKGNhblNraXApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFNraXAgdG8gcnVuICcke2FyZ3YuY29tbWFuZH0nIPCfkqtgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFidWlsZChwcm9qZWN0LCBhcmd2KSkgcmV0dXJuO1xuXG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2gsICd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYW5Ta2lwQnVpbGQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj5cbik6IFByb21pc2U8W2Jvb2xlYW4sIHN0cmluZywgc3RyaW5nXT4ge1xuICBjb25zdCBjYWNoZURpcmVjdG9yeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5jYWNoZScsICdidWlsZCcpO1xuICBjb25zdCBjYWNoZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNhY2hlRGlyZWN0b3J5UGF0aCwgJ2xhc3QtYnVpbGQnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoY2FjaGVEaXJlY3RvcnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2dpdCByZXYtcGFyc2UgSEVBRCcsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGggfSkudG9TdHJpbmcoKS50cmltKCk7XG4gIGhhc2gudXBkYXRlKGNvbW1pdEhhc2gpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50SnNvbiA9IEpTT04uc3RyaW5naWZ5KFxuICAgIE9iamVjdC5lbnRyaWVzKHByb2plY3QuZW52KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFpZ25vcmluZ0VudlZhck5hbWVzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudEhhc2ggPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgcmV0dXJuIFtjYWNoZWRDb250ZW50SGFzaCA9PT0gY29udGVudEhhc2gsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gWydzcmMvJywgJ3B1YmxpYy8nXTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbl07XG5jb25zdCBleGNsdWRlUGF0dGVybnMgPSBbJ3Rlc3QvJywgJ3Rlc3RzLycsICdfX3Rlc3RzX18vJywgJ3Rlc3QtZml4dHVyZXMvJywgJ3Rlc3QvZml4dHVyZXMvJ107XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ3N0YXR1cyddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSByZXQuc3Rkb3V0XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuY29uc3Qga2lsbFBvcnRJZk5vbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qga2lsbFBvcnRJZk5vbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdraWxsLXBvcnQtaWYtbm9uLWNpJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBwb3J0IHNwZWNpZmllZCBieSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIG5vbi1DSS4nLFxuICBidWlsZGVyOiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBraWxsUG9ydElmTm9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRJZk5vbkNpKFxuICBfOiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGlzQ0kocHJvY2Vzcy5lbnYuQ0kpKSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwIGtpbGxpbmcgcG9ydCBkdWUgdG8gQ0k6ICR7cHJvY2Vzcy5lbnYuQ0l9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9ydEVudiA9IHByb2Nlc3MuZW52LlBPUlQ7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhgS2lsbGluZyB0aGUgcG9ydDogJHtwb3J0fWApO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQsIHByaW50U3RhcnQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmNvbnN0IGtpbGxlZCA9IG5ldyBTZXQ8bnVtYmVyIHwgc3RyaW5nPigpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQpO1xuICBjb25zdCBraWxsRnVuYyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhwb3J0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChwb3J0KTtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzKHBvcnQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeUltYWdlTmFtZShpbWFnZU5hbWU6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgbmFtZT0ke2ltYWdlTmFtZX1gXSwgcHJvamVjdCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgcHVibGlzaD0ke3BvcnR9YF0sIHByb2plY3QpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJDb250YWluZXJzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGFpbmVySWRzID0gYXdhaXQgbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzLCBwcm9qZWN0KTtcbiAgICBpZiAoY29udGFpbmVySWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydybScsICctZicsIC4uLmNvbnRhaW5lcklkc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3BzJywgJy1xJywgLi4uZmlsdGVyQXJnc10sIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IHByb2plY3QuZW52LFxuICB9KTtcbiAgcmV0dXJuIHN0ZG91dFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoaWQpID0+IGlkLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7XG4gIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0LFxuICBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0LFxuICBzdG9wRG9ja2VyQ29udGFpbmVyQnlJbWFnZU5hbWUsXG59IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biwgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgY2k/OiBib29sZWFuO1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xuICBmb3JjZUNvbG9yPzogYm9vbGVhbjtcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gIGV4aXRJZkZhaWxlZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoU3Bhd24oXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBbcHJpbnRhYmxlU2NyaXB0LCBydW5uYWJsZVNjcmlwdF0gPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0IChyYXcpJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIDAsIG9wdHMpO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcG9ydCA9IC9odHRwLWdldDpcXC9cXC8xMjcuMC4wLjE6KFxcZCspLy5leGVjKHJ1bm5hYmxlU2NyaXB0KT8uWzFdO1xuICBpZiAocnVubmFibGVTY3JpcHQuaW5jbHVkZXMoJ3dhaXQtb24nKSAmJiBwb3J0KSB7XG4gICAgaWYgKHJ1bm5hYmxlU2NyaXB0LmluY2x1ZGVzKCdkb2NrZXIgcnVuJykpIHtcbiAgICAgIGF3YWl0IHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQoTnVtYmVyKHBvcnQpLCBwcm9qZWN0KTtcbiAgICAgIGF3YWl0IHN0b3BEb2NrZXJDb250YWluZXJCeUltYWdlTmFtZShwcm9qZWN0LmRvY2tlckltYWdlTmFtZSwgcHJvamVjdCk7XG4gICAgfVxuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KE51bWJlcihwb3J0KSk7XG4gIH1cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhydW5uYWJsZVNjcmlwdCwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIG9wdHMpLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcbiAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIHJldC5zdGF0dXMsIG9wdHMpO1xuICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtwcmludGFibGVTY3JpcHQsIHJ1bm5hYmxlU2NyaXB0XSA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnQgKHBhcmFsbGVsKScsIHRydWUpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgMCwgb3B0cyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKHJ1bm5hYmxlU2NyaXB0LCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIG9wdHMpLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FwaXRhbGl6ZWQgY29tbWFuZHMgKGUuZy4sIFlBUk4sIFBSSVNNQSwgQlVOKSB3aXRoIHN1aXRhYmxlIGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnWUFSTiBibGl0eiBwcmlzbWEgJyA6ICdZQVJOIHByaXNtYSAnKVxuICAgIC5yZXBsYWNlQWxsKCdCVU4gJywgcHJvamVjdC5pc0J1bkF2YWlsYWJsZSA/ICdidW4gLS1idW4gcnVuICcgOiAnWUFSTiAnKVxuICAgIC8vIEF2b2lkIHJlcGxhY2luZyBgWUFSTiBydW5gIHdpdGggYHJ1bmAgYnkgcmVwbGFjaW5nIGBZQVJOYCB3aXRoIGAoeWFybnxidW4gLS1idW4pIHJ1bmBcbiAgICAucmVwbGFjZUFsbCgnWUFSTiBydW4gJywgaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1biAnIDogJ3lhcm4gcnVuICcpO1xuICBpZiAoaXNSdW5uaW5nT25CdW4pIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gLS1idW4gcnVuIGJ1biAtLWJ1biBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpXG4gICAgICAucmVwbGFjZUFsbCgvKD86WUFSTiApP3ZpdGVzdCBydW4vZywgJ2J1biB0ZXN0JylcbiAgICAgIC8vICctLWFsbG93T25seScgaXMgc29tZXRpbWVzIHJlbW92ZWQuXG4gICAgICAucmVwbGFjZUFsbCgvIC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMoPzogLS1hbGxvd09ubHkpPy9nLCAnJyk7XG4gIH1cbiAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0LnRyaW0oKTtcbiAgY29uc3QgcHJpbnRhYmxlU2NyaXB0ID0gZml4QnVuQ29tbWFuZChuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApKTtcbiAgY29uc3QgcnVubmFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKFxuICAgIG5ld1NjcmlwdFxuICAgICAgLy8gQmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBgeWFybiBwbGF5d3JpZ2h0YCBpbiBhIHByb2plY3QgZGVwZW5kaW5nIG9uIGBhcnRpbGxlcnktZW5naW5lLXBsYXl3cmlnaHRgLlxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgYClcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOICcsICFpc1J1bm5pbmdPbkJ1biAmJiBwcm9qZWN0LmJpbkV4aXN0cyA/ICcnIDogYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKVxuICApO1xuICAvLyBBZGQgY2FzY2FkZSBvcHRpb24gd2hlbiBXQl9FTlYgaXMgZGVmaW5lZFxuICBjb25zdCBjYXNjYWRlT3B0aW9uID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYCAtLWNhc2NhZGUtZW52PSR7cHJvamVjdC5lbnYuV0JfRU5WIHx8ICdkZXZlbG9wbWVudCd9YCA6ICcnO1xuICByZXR1cm4gW2Bkb3RlbnYke2Nhc2NhZGVPcHRpb259ICR7cHJpbnRhYmxlU2NyaXB0fWAsIHJ1bm5hYmxlU2NyaXB0XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPlxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIG9wdHM6IE9wdGlvbnMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmV3RW52ID0geyAuLi5lbnYgfTtcbiAgaWYgKG9wdHMuY2kpIHtcbiAgICBuZXdFbnYuQ0kgPSAnMSc7XG4gIH1cbiAgaWYgKG9wdHMuZm9yY2VDb2xvcikge1xuICAgIG5ld0Vudi5GT1JDRV9DT0xPUiA9ICczJztcbiAgfVxuICByZXR1cm4gbmV3RW52O1xufVxuXG5mdW5jdGlvbiBmaXhCdW5Db21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzE0MzU5XG4gIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKCduZXh0IGRldicpIHx8XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvODIyMlxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3BsYXl3cmlnaHQnKSB8fFxuICAgIC8vIFwiYnVuIC0tYnVuIHByaXNtYSBnZW5lcmF0ZVwiIGRvZXNuJ3Qgd29ya1xuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3ByaXNtYScpIHx8XG4gICAgY29tbWFuZC5pbmNsdWRlcygndGVzdC9lMmUtYWRkaXRpb25hbCcpXG4gICAgPyBjb21tYW5kLnJlcGxhY2VBbGwoJ2J1biAtLWJ1bicsICdidW4nKVxuICAgIDogY29tbWFuZDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYmlvbWVFeHRlbnNpb25zID0gbmV3IFNldChbJ2NqcycsICdjdHMnLCAnanMnLCAnanNvbicsICdqc29uYycsICdqc3gnLCAnbWpzJywgJ210cycsICd0cycsICd0c3gnXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIWJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUgb24gQnVuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKCFpc1J1bm5pbmdPbkJ1bikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBCdW4uJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gYXJndi5maWxlcyA/PyBbXTtcbiAgICBsZXQgYmlvbWVBcmdzVGV4dDogc3RyaW5nO1xuICAgIGxldCBwcmV0dGllckFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgcGFja2FnZUpzb25GaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoU3RyaW5nKGZpbGUpKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0L2ZpeHR1cmVzLycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnNsaWNlKDEpO1xuICAgICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZS5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllci5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmlvbWVBcmdzVGV4dCA9IGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZS5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICAgIHByZXR0aWVyQXJnc1RleHQgPSBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllci5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0ID0gcGFja2FnZUpzb25GaWxlUGF0aHMubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJpb21lQXJnc1RleHQgPSAnJztcbiAgICAgIHByZXR0aWVyQXJnc1RleHQgPSBgXCIqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgO1xuICAgICAgc29ydFBhY2thZ2VKc29uQXJnc1RleHQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoKHApID0+IGBcIiR7cC5wYWNrYWdlSnNvblBhdGh9XCJgKS5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYmlvbWVDb21tYW5kID1cbiAgICAgIGFyZ3YuZml4ICYmIGFyZ3YuZm9ybWF0ID8gJ2NoZWNrIC0tZml4JyA6IGFyZ3YuZml4ID8gJ2xpbnQgLS1maXgnIDogYXJndi5mb3JtYXQgPyAnZm9ybWF0IC0tZml4JyA6ICdsaW50JztcbiAgICBsZXQgYmlvbWVQcm9taXNlOiBQcm9taXNlPG51bWJlcj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGJpb21lQXJnc1RleHQgfHwgZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBiaW9tZVByb21pc2UgPSBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICBgYnVuIC0tYnVuIGJpb21lICR7YmlvbWVDb21tYW5kfSAtLWNvbG9ycz1mb3JjZSAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1maWxlcy1pZ25vcmUtdW5rbm93bj10cnVlICR7YmlvbWVBcmdzVGV4dH1gLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICB7IGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICBpZiAocHJldHRpZXJBcmdzVGV4dCkge1xuICAgICAgICB2b2lkIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gICAgICAgICAgYGJ1biAtLWJ1biBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlICR7cHJldHRpZXJBcmdzVGV4dH1gLFxuICAgICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7IGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0KSB7XG4gICAgICAgIGF3YWl0IGJpb21lUHJvbWlzZTtcbiAgICAgICAgdm9pZCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBidW4gLS1idW4gc29ydC1wYWNrYWdlLWpzb24gJHtzb3J0UGFja2FnZUpzb25BcmdzVGV4dH1gLCBwcm9qZWN0cy5zZWxmLCBhcmd2LCB7XG4gICAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nLCBwcm9qZWN0czogUHJvamVjdFtdKTogR2VuZXJhdG9yPFByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiJHtjb21tYW5kTmFtZX1cIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgeWllbGQgcHJvamVjdDtcbiAgfVxufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBvdXRzaWRlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBvcHRpbWl6YXRpb24gaXMgZXhlY3V0ZWQgb3V0c2lkZSBhIGRvY2tlciBjb250YWluZXIgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJyxcbiAgZGVzY3JpYmU6ICdPcHRpbWl6ZSBjb25maWd1cmF0aW9uIHdoZW4gYnVpbGRpbmcgYSBEb2NrZXIgaW1hZ2UnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICBjb25zdCBrZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldID8/IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwcykpIHtcbiAgICAgICAgICBpZiAodmFsdWU/LnN0YXJ0c1dpdGgoJ2dpdEBnaXRodWIuY29tOicpKSB7XG4gICAgICAgICAgICBkZXBzW25hbWVdID0gYC4vJHtuYW1lfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKCdJbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3Y6IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFhcmd2Lm91dHNpZGUpIHtcbiAgICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuICAgIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IG5hbWVXb3Jkc1RvQmVSZW1vdmVkID0gW1xuICAgICdhcnRpbGxlcnknLFxuICAgICdiaW9tZScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2VzbGludCcsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAncmFpbHdheScsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIChuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLnN0YXJ0c1dpdGgod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUHJpc21hIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBQUklTTUFgIGlzIHJlcGxhY2VkIHdpdGggYFlBUk4gcHJpc21hYCBvciBgWUFSTiBibGl0eiBwcmlzbWFgXG4gKiBhbmQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFByaXNtYVNjcmlwdHMge1xuICBkZXBsb3koXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ31gO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCwgYmFja3VwUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzKjsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAmJiBybSAtUmYgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMqXG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgLW8gJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMgJHtiYWNrdXBQYXRofSAmJiBscyAtYWhsICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXRlc3RyZWFtKF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtydW50aW1lV2l0aEFyZ3N9IC1lICdcbmNvbnN0IHsgUHJpc21hQ2xpZW50IH0gPSByZXF1aXJlKFwiQHByaXNtYS9jbGllbnRcIik7XG5uZXcgUHJpc21hQ2xpZW50KCkuJHF1ZXJ5UmF3XFxgUFJBR01BIGpvdXJuYWxfbW9kZSA9IFdBTDtcXGBcbiAgLmNhdGNoKChlcnJvcikgPT4geyBjb25zb2xlLmxvZyhcIkZhaWxlZCBkdWUgdG86XCIsIGVycm9yKTsgcHJvY2Vzcy5leGl0KDEpOyB9KTtcbidgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfSAmJiBQUklTTUEgZ2VuZXJhdGUgJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXYke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ31gO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgcmVzdG9yZShwcm9qZWN0OiBQcm9qZWN0LCBiYWNrdXBQYXRoOiBzdHJpbmcsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYicgOiAncHJpc21hJztcbiAgICByZXR1cm4gYHJtIC1SZiAke2Rpck5hbWV9L3Jlc3RvcmVkLnNxbGl0ZTM7IEdPT0dMRV9BUFBMSUNBVElPTl9DUkVERU5USUFMUz1nY3Atc2Eta2V5Lmpzb24gbGl0ZXN0cmVhbSByZXN0b3JlIC1vICR7b3V0cHV0UGF0aH0gJHtiYWNrdXBQYXRofWA7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5zZWVkKSByZXR1cm4gYFlBUk4gcHJpc21hIGRiIHNlZWRgO1xuICAgIHJldHVybiBgaWYgWyAtZSBcInByaXNtYS9zZWVkcy50c1wiIF07IHRoZW4gQlVOIGJ1aWxkLXRzIHJ1biBwcmlzbWEvc2VlZHMudHM7IGZpYDtcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICAvLyBEZWFsIHdpdGggUHJpc21hIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcHJpc21hL3N0dWRpby9pc3N1ZXMvMTI3M1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFVSTChkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtkYlVybE9yUGF0aH0gYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSB7XG4gICAgICBjb25zdCBQT1NTSUJMRV9QQVRIUyA9IFtcbiAgICAgICAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ3ByaXNtYScgfSxcbiAgICAgICAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSwgZGJQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSB9LFxuICAgICAgICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbignZGInLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdkYicgfSxcbiAgICAgIF07XG4gICAgICBmb3IgKGNvbnN0IHsgZGJQYXRoLCBzY2hlbWFQYXRoIH0gb2YgUE9TU0lCTEVfUEFUSFMpIHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKSB7XG4gICAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgICAgcHJvamVjdC5kaXJQYXRoLFxuICAgICAgICAgICAgZGJQYXRoLFxuICAgICAgICAgICAgcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aClcbiAgICAgICAgICApO1xuICAgICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYCR7cHJlZml4fVBSSVNNQSBzdHVkaW8ke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFTY3JpcHRzID0gbmV3IFByaXNtYVNjcmlwdHMoKTtcbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHByaXNtYUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdwcmlzbWEnLFxuICBkZXNjcmliZTogJ1J1biBwcmlzbWEgY29tbWFuZHMnLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHtcbiAgICByZXR1cm4geWFyZ3NcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKVxuICAgICAgLnN0cmljdChmYWxzZSk7IC8vIEFsbG93IHVua25vd24gb3B0aW9ucyB0byBiZSBwYXNzZWQgdGhyb3VnaFxuICB9LFxuICBoYW5kbGVyKCkge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdiYWNrdXAtcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2InLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlcGxveUZvcmNlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlIDxiYWNrdXAtcGF0aD4nLFxuICBkZXNjcmliZTogXCJGb3JjZSB0byBhcHBseSBtaWdyYXRpb24gdG8gREIgdXRpbGl6aW5nIExpdGVzdHJlYW0ncyBiYWNrdXAgd2l0aG91dCBpbml0aWFsaXppbmcgaXRcIixcbiAgYnVpbGRlcjogZGVwbG95Rm9yY2VCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0LCBhcmd2LmJhY2t1cFBhdGgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBsaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBEQiBmb3IgTGl0ZXN0cmVhbScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBsaXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlJyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVEZXZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUtZGV2JyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgYSBtaWdyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlLWRldicsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubWlncmF0ZURldihwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc2V0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXNldCcsXG4gIGRlc2NyaWJlOiAnUmVzZXQgREInLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgcmVzZXQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmRlcGxveUZvcmNlQnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgcmVzdG9yZWQgZGF0YWJhc2UuIERlZmF1bHRzIHRvIFwiPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZSA8YmFja3VwLXBhdGg+JyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICBhcmd2Lm91dHB1dCA/PyAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXN0b3JlKHByb2plY3QsIGFyZ3YuYmFja3VwUGF0aCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gUHJpc21hIFN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgPGFyZ3MuLj4nLFxuICBkZXNjcmliZTogJ1Bhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byBwcmlzbWEgYXMgaXMnLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IChhcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJykudHJpbUVuZCgpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnYXJncyddKTtcbiAgICBjb25zdCBmdWxsQ29tbWFuZCA9IFtzY3JpcHQsIHVua25vd25PcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoYHByaXNtYSAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBQUklTTUEgJHtmdWxsQ29tbWFuZH1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBmaW5kUHJpc21hUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbHRlcihcbiAgICAocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnByaXNtYSA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHJpc21hXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gcHJpc21hIGNvbW1hbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmtub3duT3B0aW9ucy5qb2luKCcgJyk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXRyeSBbY29tbWFuZF0gW2FyZ3MuLi5dJyxcbiAgZGVzY3JpYmU6ICdSZXRyeSB0aGUgZ2l2ZW4gY29tbWFuZCB1bnRpbCBpdCBzdWNjZWVkcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY21kQW5kQXJncyA9IFthcmd2LmNvbW1hbmQsIC4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSldLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgbGFzdFN0YXR1cyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2LnJldHJ5OyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiR7Y2hhbGsueWVsbG93KGAjJHtpfSBSZXRyeWluZzogJHtjbWRBbmRBcmdzLmpvaW4oJyAnKX1gKX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhZGQgc2luZ2xlIHF1b3RlcyBhcm91bmQgZWFjaCBhcmd1bWVudD9cbiAgICAgIGxhc3RTdGF0dXMgPSBhd2FpdCBydW5XaXRoU3Bhd24oY21kQW5kQXJncy5qb2luKCcgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICAgIHBhY2thZ2VzLnB1c2goJ2V4cGVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmluZCgocCkgPT4gcC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnBsYXl3cmlnaHQpO1xuICBpZiAocHJvamVjdCkge1xuICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICBub3JtYWxpemVkQXJnc1RleHQ/OiBzdHJpbmc7XG4gIG5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PlxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gYCcke2FyZ30nYClcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKS5tYXAoKGFyZykgPT4gYCcke2FyZ30nYCkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9EZXZOdWxsKGFyZ3Y6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gKGFyZ3YgYXMgeyBzaWxlbnQ6IGJvb2xlYW4gfSkuc2lsZW50ID8gYCA+IC9kZXYvbnVsbGAgOiAnJztcbn1cbiIsImltcG9ydCB7IGNyZWF0ZVNlcnZlciB9IGZyb20gJ25vZGU6bmV0JztcblxuLyoqXG4gKiBGaW5kcyBhbiBhdmFpbGFibGUgcG9ydCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBwb3J0IG51bWJlci5cbiAqIEBwYXJhbSBzdGFydFBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gKGRlZmF1bHQ6IDMwMDApXG4gKiBAcGFyYW0gbWF4QXR0ZW1wdHMgLSBNYXhpbXVtIG51bWJlciBvZiBwb3J0cyB0byB0cnkgKGRlZmF1bHQ6IDEwMClcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGF2YWlsYWJsZSBwb3J0IG51bWJlclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZEF2YWlsYWJsZVBvcnQoc3RhcnRQb3J0ID0gMzAwMCwgbWF4QXR0ZW1wdHMgPSAxMDApOiBQcm9taXNlPG51bWJlcj4ge1xuICBmb3IgKGxldCBwb3J0ID0gc3RhcnRQb3J0OyBwb3J0IDwgc3RhcnRQb3J0ICsgbWF4QXR0ZW1wdHM7IHBvcnQrKykge1xuICAgIGlmIChhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCkpIHtcbiAgICAgIHJldHVybiBwb3J0O1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYE5vIGF2YWlsYWJsZSBwb3J0IGZvdW5kIGluIHJhbmdlICR7c3RhcnRQb3J0fS0ke3N0YXJ0UG9ydCArIG1heEF0dGVtcHRzIC0gMX1gKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3J0IGlzIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBwb3J0IGlzIGF2YWlsYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzUG9ydEF2YWlsYWJsZShwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gY3JlYXRlU2VydmVyKCk7XG5cbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAnMTI3LjAuMC4xJyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkRGV2SW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ1lBUk4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8geDg2XzY0KVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9XG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX1ZFUlNJT049JHt2ZXJzaW9ufSAuYDtcbiAgfVxuXG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCB1bmJ1ZmZlciA9IGZhbHNlLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3VuYnVmZmVyID8gJ3VuYnVmZmVyICcgOiAnJ30ke3RoaXMuc3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYWRkaXRpb25hbE9wdGlvbnMsXG4gICAgICBhZGRpdGlvbmFsQXJnc1xuICAgICl9YDtcbiAgfVxuXG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtIC1pdCAtcCBcXCR7UE9SVDotODA4MH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVEZXZPcHRpb25zIHtcbiAgLy8gJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nO1xuICBzdGFydENvbW1hbmQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFRlc3RFMkVPcHRpb25zID0ge1xuICBwcmlzbWFEaXJlY3Rvcnk/OiBzdHJpbmc7XG59ICYgVGVzdEUyRURldk9wdGlvbnM7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbiA9ICdkZXZlbG9wbWVudCcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkb2NrZXJTY3JpcHRzLmJ1aWxkRGV2SW1hZ2UocHJvamVjdCwgdmVyc2lvbik7XG4gIH1cblxuICBhYnN0cmFjdCBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuXG4gIGFic3RyYWN0IHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgYWJzdHJhY3Qgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG5cbiAgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCA4MDgwO1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSR7dG9EZXZOdWxsKGFyZ3YpfVxuICAgICAgJiYgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICAgIFwiJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICAgICl9XCJcbiAgICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MgPSAndGVzdCB0ZXN0L2UyZS8nLCBwcmlzbWFEaXJlY3RvcnksIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHMgJiYgYXJndi50YXJnZXRzLmxlbmd0aCA+IDAgPyBhcmd2LnRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgY29uc3QgZW52UHJlZml4ID0gYFdCX0VOVj0ke2Vudn0gTkVYVF9QVUJMSUNfV0JfRU5WPSR7ZW52fSBBUFBfRU5WPSR7ZW52fSBQT1JUPSR7cG9ydH1gO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gcGxheXdyaWdodEFyZ3Muc3RhcnRzV2l0aCgndGVzdCAnKVxuICAgICAgPyBgQlVOIHBsYXl3cmlnaHQgJHtwbGF5d3JpZ2h0QXJnc31gXG4gICAgICA6IGBCVU4gcGxheXdyaWdodCB0ZXN0ICR7dGVzdFRhcmdldH1gO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gYCR7ZW52UHJlZml4fSAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzZXRDb21tYW5kID0gcHJpc21hRGlyZWN0b3J5ID8gYHJtIC1SZiAke3ByaXNtYURpcmVjdG9yeX0vbW91bnQgJiYgYCA6ICcnO1xuICAgIHJldHVybiBgJHtlbnZQcmVmaXh9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7cmVzZXRDb21tYW5kfSR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1cImA7XG4gIH1cblxuICB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3QvZTJlLycsIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHMgJiYgYXJndi50YXJnZXRzLmxlbmd0aCA+IDAgPyBhcmd2LnRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgY29uc3QgZW52UHJlZml4ID0gYFdCX0VOVj0ke2Vudn0gTkVYVF9QVUJMSUNfV0JfRU5WPSR7ZW52fSBBUFBfRU5WPSR7ZW52fSBQT1JUPSR7cG9ydH1gO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gcGxheXdyaWdodEFyZ3Muc3RhcnRzV2l0aCgndGVzdCAnKVxuICAgICAgPyBgQlVOIHBsYXl3cmlnaHQgJHtwbGF5d3JpZ2h0QXJnc31gXG4gICAgICA6IGBCVU4gcGxheXdyaWdodCB0ZXN0ICR7dGVzdFRhcmdldH1gO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gYCR7ZW52UHJlZml4fSAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2VudlByZWZpeH0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fVxuICAgICAgICAmJiAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIGFic3RyYWN0IHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIHRlc3RVbml0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZXN0VGFyZ2V0ID0gYXJndi50YXJnZXRzICYmIGFyZ3YudGFyZ2V0cy5sZW5ndGggPiAwID8gYXJndi50YXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L3VuaXQvJztcbiAgICBpZiAocHJvamVjdC5oYXNWaXRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgY29tbWFuZCBpcyByZWZlcnJlZCBmcm9tIG90aGVyIGNvbW1hbmRzLCB3ZSBoYXZlIHRvIHVzZSBcInZpdGVzdCBydW5cIiAobm9uLWludGVyYWN0aXZlIG1vZGUpLlxuICAgICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFlBUk4gdml0ZXN0IHJ1biAke3Rlc3RUYXJnZXR9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHlgO1xuICAgIH0gZWxzZSBpZiAocHJvamVjdC5pc0J1bkF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGJ1biB0ZXN0ICR7dGVzdFRhcmdldH1gO1xuICAgIH1cbiAgICByZXR1cm4gJ2VjaG8gXCJObyB0ZXN0cy5cIic7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAzMDAwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHdhaXQtb24gLXQgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgNTAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDEwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAyMDAwMCAtaSA0MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDYwMDAwIC1pIDUwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgOTAwMDAgLWkgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgMzAwMCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2LFxuICAgICAgcG9ydFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZEF2YWlsYWJsZVBvcnQgfSBmcm9tICcuLi8uLi91dGlscy9maW5kUG9ydC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIEJsaXR6LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBCbGl0elNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFwcEVudiA9IHByb2plY3QuZW52LldCX0VOViA/IGBBUFBfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBgIDogJyc7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCAzMDAwO1xuICAgIHJldHVybiBgJHthcHBFbnZ9WUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcImJsaXR6IGRldiAtcCAke3BvcnR9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFwcEVudiA9IHByb2plY3QuZW52LldCX0VOViA/IGBBUFBfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBgIDogJyc7XG4gICAgcmV0dXJuIGAke2FwcEVudn1OT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke1tcbiAgICAgICAgcHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpLFxuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YCxcbiAgICAgIF0uam9pbignICYmICcpfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCA4MDgwO1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICAuLi5wcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpLFxuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgXVxuICAgICAgICAubWFwKChjKSA9PiBgJHtjLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgICAuam9pbignICYmICcpfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZDpcbiAgICAgICAgb3B0aW9ucy5zdGFydENvbW1hbmQgPz9cbiAgICAgICAgW1xuICAgICAgICAgIC4uLnByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJyksXG4gICAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgICBdXG4gICAgICAgICAgLm1hcCgoYykgPT4gYCR7Yy50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgICAgICAuam9pbignICYmICcpLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVEZXZPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0Q29tbWFuZCA9IGBibGl0eiBkZXYgLXAgJHtwb3J0fSR7dG9EZXZOdWxsKGFyZ3YpfWA7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kOiBzdGFydENvbW1hbmQgPz8gZGVmYXVsdFN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgZmluZEF2YWlsYWJsZVBvcnQoKTtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJibGl0eiBkZXYgLXAgJHtwb3J0fSR7dG9EZXZOdWxsKGFyZ3YpfVwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRBdmFpbGFibGVQb3J0IH0gZnJvbSAnLi4vLi4vdXRpbHMvZmluZFBvcnQuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgMzAwMDtcbiAgICByZXR1cm4gYFBPUlQ9JHtwb3J0fSBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSR7dG9EZXZOdWxsKGFyZ3YpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICl9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gODA4MCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uICR7XG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZFxuICAgIH0ke3RvRGV2TnVsbChhcmd2KX0gJiYgTk9ERV9FTlY9cHJvZHVjdGlvbiBQT1JUPVxcJHtQT1JUOi0ke3BvcnR9fSAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuaGFzUHJpc21hID8gJ3ByaXNtYSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLWdlbmVyYXRlICYmICcgOiAnJ30oJHt0aGlzLnN0YXJ0UHJvZHVjdGlvbihcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2XG4gICAgKX0pYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IHtcbiAgICAgIHN0YXJ0Q29tbWFuZCA9IGAke3Byb2plY3QuaGFzUHJpc21hID8gJ3ByaXNtYSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLWdlbmVyYXRlICYmICcgOiAnJ30oJHt0aGlzLnN0YXJ0UHJvZHVjdGlvbihcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKX0pYCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHMgJiYgYXJndi50YXJnZXRzLmxlbmd0aCA+IDAgPyBhcmd2LnRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gUE9SVD0ke3BvcnR9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgdml0ZXN0IHJ1biAke3Rlc3RUYXJnZXR9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkke3N1ZmZpeH1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFRGV2T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCB7IHN0YXJ0Q29tbWFuZCB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHMgJiYgYXJndi50YXJnZXRzLmxlbmd0aCA+IDAgPyBhcmd2LnRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFdCX0VOVj0ke1xuICAgICAgcHJvamVjdC5lbnYuV0JfRU5WXG4gICAgfSBQT1JUPSR7cG9ydH0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmQgPz8gdGhpcy5zdGFydChwcm9qZWN0LCBhcmd2KX0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIHZpdGVzdCBydW4gJHt0ZXN0VGFyZ2V0fSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBmaW5kQXZhaWxhYmxlUG9ydCgpO1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBQT1JUPSR7cG9ydH0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCIke3RoaXMuc3RhcnQocHJvamVjdCwgYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRBdmFpbGFibGVQb3J0IH0gZnJvbSAnLi4vLi4vdXRpbHMvZmluZFBvcnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCAzMDAwO1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIm5leHQgZGV2IC0tdHVyYm9wYWNrIC1wICR7cG9ydH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke1tcbiAgICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KV0gOiBbXSksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLFxuICAgICAgXS5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDgwODA7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtbXG4gICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJykgOiBbXSksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICBdXG4gICAgICAgIC5tYXAoKGMpID0+IGAke2MudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAgIC5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzOiBvcHRpb25zLnBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAnZGInLFxuICAgICAgc3RhcnRDb21tYW5kOlxuICAgICAgICBvcHRpb25zLnN0YXJ0Q29tbWFuZCA/P1xuICAgICAgICBbXG4gICAgICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gcHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KS5zcGxpdCgnJiYnKSA6IFtdKSxcbiAgICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICAgIF1cbiAgICAgICAgICAubWFwKChjKSA9PiBgJHtjLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgICAgIC5qb2luKCcgJiYgJyksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCB7IHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgJzgwODAnO1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydENvbW1hbmQgPSBgbmV4dCBkZXYgLS10dXJib3BhY2sgLXAgJHtwb3J0fSR7dG9EZXZOdWxsKGFyZ3YpfWA7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBzdGFydENvbW1hbmQ6IHN0YXJ0Q29tbWFuZCA/PyBkZWZhdWx0U3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBmaW5kQXZhaWxhYmxlUG9ydCgpO1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcIm5leHQgZGV2IC0tdHVyYm9wYWNrIC1wICR7cG9ydH0ke3RvRGV2TnVsbChhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgMzAwMDtcbiAgICByZXR1cm4gYFBPUlQ9JHtwb3J0fSBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSR7dG9EZXZOdWxsKGFyZ3YpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICl9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgTk9ERV9FTlY9cHJvZHVjdGlvbiAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke1xuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICB9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZEF2YWlsYWJsZVBvcnQgfSBmcm9tICcuLi8uLi91dGlscy9maW5kUG9ydC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFJlbWl4IGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBSZW1peFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgMzAwMDtcbiAgICByZXR1cm4gYFBPUlQ9JHtwb3J0fSBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwicmVtaXggZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCl9ICYmICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoXG4gICAgICAgICdlY29zeXN0ZW0uY29uZmlnLmNqcydcbiAgICAgICl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDgwODA7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtbXG4gICAgICAgIC4uLnByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJyksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICBdXG4gICAgICAgIC5tYXAoKGMpID0+IGAke2MudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAgIC5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzOiBvcHRpb25zLnBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAncHJpc21hJyxcbiAgICAgIHN0YXJ0Q29tbWFuZDpcbiAgICAgICAgb3B0aW9ucy5zdGFydENvbW1hbmQgPz9cbiAgICAgICAgW1xuICAgICAgICAgIC4uLnByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJyksXG4gICAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgICBdXG4gICAgICAgICAgLm1hcCgoYykgPT4gYCR7Yy50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgICAgICAuam9pbignICYmICcpLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCA9IGByZW1peCBkZXYke3RvRGV2TnVsbChhcmd2KX1gIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBmaW5kQXZhaWxhYmxlUG9ydCgpO1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBQT1JUPSR7cG9ydH0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJyZW1peCBkZXYke3RvRGV2TnVsbChhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVtaXhTY3JpcHRzID0gbmV3IFJlbWl4U2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2NyaXB0T3B0aW9uc0J1aWxkZXIsXG4gIG1vZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IG1vZGU6IGRldltlbG9wbWVudF0gKGRlZmF1bHQpIHwgc3RhZ2luZyB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IHRlc3QnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc3RhcnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0YXJ0IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6ICdTdGFydCBhcHAnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ2RldmVsb3BtZW50Jyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnQocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhZ2luZyc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgODA4MDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwgcG9ydCl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3Rlc3QnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydFRlc3QocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFydCBtb2RlOiAke2FyZ3YubW9kZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sIHdiRW52OiBzdHJpbmcpOiBzdHJpbmcge1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9IHdiRW52O1xuICBsZXQgcHJlZml4ID0gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gYDtcbiAgaWYgKGRlcHMubmV4dCkge1xuICAgIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1dCX0VOViA9IHByb2Nlc3MuZW52LldCX0VOVjtcbiAgICBwcmVmaXggKz0gYE5FWFRfUFVCTElDX1dCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gYDtcbiAgfVxuICByZXR1cm4gcHJlZml4O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGUyZToge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0UyZSB0ZXN0IG1vZGU6IGhlYWRsZXNzIChkZWZhdWx0KSB8IGhlYWRsZXNzLWRldiB8IGhlYWRlZCB8IGhlYWRlZC1kZXYgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCBkZWJ1ZyB8IGdlbmVyYXRlIHwgdHJhY2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFtcbiAgICAgICdoZWFkbGVzcycsXG4gICAgICAnaGVhZGxlc3MtZGV2JyxcbiAgICAgICdoZWFkZWQnLFxuICAgICAgJ2hlYWRlZC1kZXYnLFxuICAgICAgJ2RvY2tlcicsXG4gICAgICAnZG9ja2VyLWRlYnVnJyxcbiAgICAgICdkZWJ1ZycsXG4gICAgICAnZ2VuZXJhdGUnLFxuICAgICAgJ3RyYWNlJyxcbiAgICBdLFxuICAgIGRlZmF1bHQ6ICdoZWFkbGVzcycsXG4gIH0sXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Rlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QgW3RhcmdldHMuLi5dJyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLicsXG4gIGJ1aWxkZXI6IHsgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0KGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAocHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSkge1xuICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgIHByb2Nlc3MuZW52LkNJID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIC8vIEdldCB0ZXN0IHRhcmdldHMgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICBjb25zdCB0ZXN0VGFyZ2V0cyA9IChhcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IHRlc3RUYXJnZXRzLmxlbmd0aCA9PT0gMDtcblxuICAvLyBEZXRlY3QgdGVzdCBtb2RlcyBmcm9tIHRhcmdldCBwYXRoc1xuICBjb25zdCBoYXNFMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gIGNvbnN0IGhhc1VuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICBjb25zdCBzaG91bGRSdW5Vbml0ID0gc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzVW5pdFRhcmdldHM7XG4gIGNvbnN0IHNob3VsZFJ1bkUyZSA9IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc0UyZVRhcmdldHM7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBpZiAoc2hvdWxkUnVuVW5pdCAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkpIHtcbiAgICAgIGNvbnN0IHVuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0czogdW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IHVuaXRUYXJnZXRzIDogdW5kZWZpbmVkIH07XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIGFyZ3YsIHsgdGltZW91dDogYXJndi51bml0VGltZW91dCB9KTtcbiAgICB9XG4gICAgLy8gU2tpcCBlMmUgdGVzdHMgaWYgbm90IG5lZWRlZCBvciBubyBlMmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghc2hvdWxkUnVuRTJlIHx8ICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGUyZSB0YXJnZXRzIGZvciB0aGlzIHByb2plY3RcbiAgICBjb25zdCBlMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgICBjb25zdCBlMmVBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBlMmVBcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGUyZUFyZ3YsIHNjcmlwdHMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgY29uc3QgZTJlVGFyZ2V0ID0gZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGUyZUFyZ3YsIHNjcmlwdHMsIGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWRlYnVnYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwcy5ibGl0eiB8fCBkZXBzLm5leHQgfHwgZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgY29uc3QgZTJlVGFyZ2V0ID0gZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBlMmVBcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2UyZVRhcmdldH0gLS1oZWFkZWRgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWRlYnVnYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGBjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2Nlc3MuZW52LldCX0RPQ0tFUiA/Pz0gJzEnO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHN0YXJ0Q29tbWFuZDogYCR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgdHJ1ZSl9JHt0b0Rldk51bGwoYXJndil9YCxcbiAgICB9KSxcbiAgICBwcm9qZWN0LFxuICAgIGFyZ3YsXG4gICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH1cbiAgKTtcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LkNJIHx8PSAnMSc7XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3Qtb24tY2lcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChkb2NrZXJTY3JpcHRzLnN0b3BBbGwoKSwgcHJvamVjdCwgYXJndik7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRE9DS0VSID8/PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBvcHRpb25zID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc3RhcnRDb21tYW5kOiBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCB0cnVlKSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge307XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHtcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG4gICAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQgLS1QcmV0dHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnB5cmlnaHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdZQVJOIHB5cmlnaHQnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJvamVjdC5oYXNTb3VyY2VDb2RlICYmXG4gICAgICAgIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdClcbiAgICAgICkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0IC0tUHJldHR5Jyk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBuZXh0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcubmV4dCcpO1xuICAgICAgICBpZiAoZXhpdENvZGUgJiYgZnMuZXhpc3RzU3luYyhuZXh0RGlyUGF0aCkpIHtcbiAgICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdSZW1vdmVkIGAubmV4dGAgZGlyZWN0b3J5LiBXZSB3aWxsIHJlLXRyeSB0eXBlIGNoZWNraW5nLicpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgbGV0IGZpbmFsRXhpdENvZGUgPSAwO1xuICAgIGZvciAoY29uc3QgW2ksIGV4aXRDb2RlXSBvZiBleGl0Q29kZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzW2ldPy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaW5hbEV4aXRDb2RlKSBwcm9jZXNzLmV4aXQoZmluYWxFeGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHJlZUtpbGwgZnJvbSAndHJlZS1raWxsJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGVzdE9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0T25DaS5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQoa2lsbFBvcnRJZk5vbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQobGludENvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdE9uQ2lDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICBwcm9jZXNzLmV4aXQoKTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsiY2FjaGVkRW52VmFycyIsIk1hcCIsInJlYWRFbnZGaWxlIiwiZmlsZVBhdGgiLCJjYWNoZWQiLCJnZXQiLCJwYXJzZWQiLCJjb25maWciLCJwYXRoIiwicmVzb2x2ZSIsInByb2Nlc3NFbnYiLCJzZXQiLCJhc3luYyIsInNwYXduQXN5bmMiLCJjb21tYW5kIiwiYXJncyIsIm9wdGlvbnMiLCJQcm9taXNlIiwicmVqZWN0IiwicHJvYyIsInNwYXduIiwic3Rkb3V0Iiwic2V0RW5jb2RpbmciLCJzdGRlcnIiLCJvbiIsImRhdGEiLCJwcmludGluZ1N0ZG91dCIsInByb2Nlc3MiLCJ3cml0ZSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJwcmludGluZ1N0ZGVyciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsInBpZCIsInZlcmJvc2UiLCJjb25zb2xlIiwiaW5mbyIsInRyZWVLaWxsIiwia2lsbE9uRXhpdCIsImVycm9yIiwicmVtb3ZlTGlzdGVuZXIiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJjb2RlIiwic2lnbmFsIiwidW5kZWZpbmVkIiwiRXJyb3IiLCJzdGF0dXMiLCJpbnB1dCIsInN0ZGluIiwiZW5kIiwidCIsInMiLCJpIiwiZSIsIm4iLCJlbnRyaWVzIiwiaCIsImJsb2NrcyIsInJlc2V0IiwiZmluYWxpemVkIiwiYmxvY2siLCJzdGFydCIsImxhc3RCeXRlSW5kZXgiLCJjb25zdHJ1Y3RvciIsInRoaXMiLCJwYWRkaW5nIiwib3V0cHV0Qml0cyIsImJsb2NrQ291bnQiLCJieXRlQ291bnQiLCJvdXRwdXRCbG9ja3MiLCJleHRyYUJ5dGVzIiwidXBkYXRlIiwibyIsImxlbmd0aCIsImwiLCJjIiwiZiIsImNvZGVQb2ludEF0IiwiciIsImZpbmFsaXplIiwiaGV4IiwiYSIsInUiLCJkIiwiYiIsImsiLCJ5IiwieCIsIkIiLCJwIiwiQyIsInoiLCJJIiwiZyIsInciLCJBIiwiUCIsIkUiLCJqIiwibSIsInEiLCJ2IiwiRCIsIkYiLCJHIiwiSCIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCIkIiwiXyIsInR0Iiwic3QiLCJpdCIsImV0Iiwib3QiLCJudCIsImh0IiwicnQiLCJsdCIsImN0IiwiZnQiLCJpbnN0YW5jZSIsImZyb20iLCJuYW1lIiwibWVzc2FnZSIsInN0YWNrIiwicHVzaCIsImNhdXNlIiwic3R1YiIsImh5ZHJhdGUiLCJVaW50OEFycmF5IiwiYnRvYSIsImRlY29kZSIsImNyZWF0ZSIsImVuY29kZSIsImF0b2IiLCJTZXQiLCJ2YWx1ZXMiLCJhZGQiLCJEYXRlIiwidG9KU09OIiwiUmVnRXhwIiwiZmxhZ3MiLCJzb3VyY2UiLCJVUkwiLCJocmVmIiwibWFwIiwiVGV4dEVuY29kZXIiLCJUZXh0RGVjb2RlciIsIkpTT04iLCJzdHJpbmdpZnkiLCJOdW1iZXIiLCJpc05hTiIsImlzRmluaXRlIiwidG9TdHJpbmciLCJBcnJheSIsImlzQXJyYXkiLCJmaWxsIiwic2xpY2UiLCJPYmplY3QiLCJjYWNoZUR1cmF0aW9uIiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJnZXRDYWNoZUtleSIsImtpbmQiLCJub3ciLCJjYWxsIiwiaXNDSSIsImNpRW52IiwiUHJvamVjdCIsIl9pbml0UHJvdG8iLCJfYXBwbHlEZWNzIiwibWVtb2l6ZU9uZSIsImFyZ3YiLCJwYXRoQnlOYW1lIiwiZGlyUGF0aCIsImxvYWRFbnYiLCJfZGlyUGF0aCIsImlzQnVuQXZhaWxhYmxlIiwidGVzdCIsImZzIiwicmVhZEZpbGVTeW5jIiwiam9pbiIsInJvb3REaXJQYXRoIiwiYnVpbGRDb21tYW5kIiwicGFja2FnZUpzb24iLCJzY3JpcHRzIiwiYnVpbGQiLCJpbmNsdWRlcyIsImV4aXN0c1N5bmMiLCJkb2NrZXJmaWxlIiwiZmluZEZpbGUiLCJoYXNEb2NrZXJmaWxlIiwiaGFzU291cmNlQ29kZSIsImRvY2tlckltYWdlTmFtZSIsInJlcGxhY2VBbGwiLCJlbnYiLCJlbnZWYXJzIiwiZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMiLCJjd2QiLCJlbnZQYXRocyIsImVudlBhdGgiLCJjYXNjYWRlIiwiY2FzY2FkZUVudiIsImNhc2NhZGVOb2RlRW52IiwiTk9ERV9FTlYiLCJhdXRvQ2FzY2FkZUVudiIsIldCX0VOViIsImluY2x1ZGVSb290RW52Iiwicm9vdFBhdGgiLCJmbGF0TWFwIiwiZmlsdGVyIiwicmVsYXRpdmUiLCJlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlycyIsImNvdW50Iiwia2V5IiwidmFsdWUiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwia2V5cyIsInJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhcnNlIiwicGFja2FnZUpzb25QYXRoIiwiaGFzUHJpc21hIiwiZGVwZW5kZW5jaWVzIiwicHJpc21hIiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzVml0ZXN0Iiwidml0ZXN0Iiwic2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQiLCJDSSIsImNvbmZpZ1BhdGgiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImRpcm5hbWUiLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmlsZU5hbWUiLCJmaW5kIiwiZmluZFNlbGZQcm9qZWN0IiwiZmluZERlc2NlbmRhbnRQcm9qZWN0cyIsInJvb3RBbmRTZWxmUHJvamVjdHMiLCJ0aGlzUHJvamVjdCIsInJvb3RQcm9qZWN0Iiwid29ya3NwYWNlcyIsImVuZHNXaXRoIiwicm9vdCIsInNlbGYiLCJmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyIsImRlc2NlbmRhbnRzIiwiZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIiwicHJvamVjdHMiLCJ3b3Jrc3BhY2UiLCJnbG9iUGF0dGVybiIsInBhY2thZ2VEaXJzIiwid29ya3NwYWNlUGF0aCIsIndzIiwiZ2xvYmJ5IiwiZG90Iiwib25seURpcmVjdG9yaWVzIiwic3ViUGFja2FnZURpclBhdGgiLCJpc1J1bm5pbmdPbkJ1biIsInZlcnNpb25zIiwiYnVuIiwibnBtX2V4ZWNwYXRoIiwicnVudGltZVdpdGhBcmdzIiwicGFja2FnZU1hbmFnZXIiLCJwYWNrYWdlTWFuYWdlcldpdGhSdW4iLCJidWlsZElmTmVlZGVkQ29tbWFuZCIsImRlc2NyaWJlIiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiYWxpYXMiLCJoYW5kbGVyIiwicHJvamVjdFBhdGhGb3JUZXN0aW5nIiwicHJvamVjdCIsImNoYWxrIiwicmVkIiwiY2FuU2tpcCIsImNhY2hlRmlsZVBhdGgiLCJjb250ZW50SGFzaCIsImNhY2hlRGlyZWN0b3J5UGF0aCIsInByb21pc2VzIiwibWtkaXIiLCJyZWN1cnNpdmUiLCJoYXNoIiwiY3JlYXRlSGFzaCIsImNvbW1pdEhhc2giLCJjaGlsZF9wcm9jZXNzIiwiZXhlY1N5bmMiLCJ0cmltIiwiZW52aXJvbm1lbnRKc29uIiwiaWdub3JpbmdFbnZWYXJOYW1lcyIsImhhcyIsInRvU29ydGVkIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRGaWxlUGF0aHMiLCJzcGF3blN5bmMiLCJzdGRpbyIsImVuY29kaW5nIiwic3BsaXQiLCJyZXBsYWNlIiwiaW5jbHVkZVBhdHRlcm5zIiwic29tZSIsInBhdHRlcm4iLCJpbmNsdWRlU3VmZml4Iiwic3VmZml4IiwiZXhjbHVkZVBhdHRlcm5zIiwiY29weSIsImRpZ2VzdCIsInVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdCIsImNhY2hlZENvbnRlbnRIYXNoIiwiZm4iLCJpZ25vcmVFbm9lbnRBc3luYyIsInJlYWRGaWxlIiwiY2FuU2tpcEJ1aWxkIiwiZ3JlZW4iLCJkcnlSdW4iLCJ3cml0ZUZpbGUiLCJidWlsZElmTmVlZGVkIiwicmV0Iiwic2hlbGwiLCJleGl0Q29kZSIsImtpbGxQb3J0SWZOb25DaUNvbW1hbmQiLCJidWlsZGVyIiwicG9ydEVudiIsIlBPUlQiLCJwb3J0IiwiaXNJbnRlZ2VyIiwiZXhpdCIsImtpbGxQb3J0UHJvY2VzcyIsImtpbGxQb3J0SWZOb25DaSIsImtpbGxlZCIsImtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzIiwicmVtb3ZlRG9ja2VyQ29udGFpbmVycyIsImZpbHRlckFyZ3MiLCJjb250YWluZXJJZHMiLCJpZCIsIkJvb2xlYW4iLCJsaXN0RG9ja2VyQ29udGFpbmVySWRzIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0Iiwib3B0cyIsInByaW50YWJsZVNjcmlwdCIsInJ1bm5hYmxlU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0IiwicHJpbnRTdGFydCIsInByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQiLCJleGVjIiwic3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydCIsImltYWdlTmFtZSIsInN0b3BEb2NrZXJDb250YWluZXJCeUltYWdlTmFtZSIsImtpbGxGdW5jIiwia2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQiLCJjb25maWd1cmVFbnYiLCJ0aW1lb3V0IiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSIsIm91dCIsIm5ld1NjcmlwdCIsImJsaXR6IiwiZml4QnVuQ29tbWFuZCIsIm5vcm1hbGl6ZWRTY3JpcHQiLCJwcmVmaXgiLCJ3ZWFrIiwiZ3JheSIsImN5YW4iLCJib2xkIiwibmV3RW52IiwiY2kiLCJmb3JjZUNvbG9yIiwiRk9SQ0VfQ09MT1IiLCJiaW9tZUV4dGVuc2lvbnMiLCJwcmV0dGllckV4dGVuc2lvbnMiLCJwcmV0dGllck9ubHlFeHRlbnNpb25zIiwiZXh0IiwibGludENvbW1hbmQiLCJmaXgiLCJmb3JtYXQiLCJmaWxlcyIsImJpb21lQXJnc1RleHQiLCJwcmV0dGllckFyZ3NUZXh0Iiwic29ydFBhY2thZ2VKc29uQXJnc1RleHQiLCJmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUiLCJmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllciIsInBhY2thZ2VKc29uRmlsZVBhdGhzIiwiZmlsZSIsIlN0cmluZyIsImV4dGVuc2lvbiIsImV4dG5hbWUiLCJiaW9tZUNvbW1hbmQiLCJiaW9tZVByb21pc2UiLCJwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQiLCJjb21tYW5kTmFtZSIsIm9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIiwib3V0c2lkZSIsImRlcHMiLCJzdGFydHNXaXRoIiwib3B0aW1pemVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZVNjcmlwdHMiLCJvcHRpbWl6ZVJvb3RQcm9wcyIsImRpc3REaXJQYXRoIiwiZGV2RGVwcyIsIm5hbWVXb3Jkc1RvQmVSZW1vdmVkIiwicmVtb3ZlZERlcHMiLCJ3b3JkIiwibmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsInJlbW92ZWRTY3JpcHRzIiwiY29udGVudCIsInByaXZhdGUiLCJwdWJsaXNoQ29uZmlnIiwicHJldHRpZXIiLCJwcmlzbWFTY3JpcHRzIiwiZGVwbG95IiwiYWRkaXRpb25hbE9wdGlvbnMiLCJkZXBsb3lGb3JjZSIsImJhY2t1cFBhdGgiLCJkaXJOYW1lIiwibGl0ZXN0cmVhbSIsIm1pZ3JhdGUiLCJzZWVkIiwibWlncmF0ZURldiIsInJlc3RvcmUiLCJvdXRwdXRQYXRoIiwic2NyaXB0UGF0aCIsInN0dWRpbyIsImRiVXJsT3JQYXRoIiwiRklMRV9TQ0hFTUEiLCJEQVRBQkFTRV9VUkwiLCJQT1NTSUJMRV9QQVRIUyIsInNjaGVtYVBhdGgiLCJkYlBhdGgiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsImRlZmF1bHQiLCJwcmlzbWFDb21tYW5kIiwieWFyZ3MiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwibGl0ZXN0cmVhbUNvbW1hbmQiLCJtaWdyYXRlQ29tbWFuZCIsIm1pZ3JhdGVEZXZDb21tYW5kIiwicmVzZXRDb21tYW5kIiwicmVzdG9yZUNvbW1hbmQiLCJzZWVkQ29tbWFuZCIsInN0dWRpb0NvbW1hbmQiLCJkZWZhdWx0Q29tbWFuZCIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJhbGxQcm9qZWN0cyIsImZpbmRQcmlzbWFQcm9qZWN0cyIsInVua25vd25PcHRpb25zIiwiZXh0cmFjdFVua25vd25PcHRpb25zIiwiZGVwbG95Rm9yY2VCdWlsZGVyIiwiZGVtYW5kT3B0aW9uIiwib3V0cHV0IiwicmVzdG9yZWQiLCJmdWxsQ29tbWFuZCIsInRyaW1FbmQiLCJmaWx0ZXJlZCIsImtub3duT3B0aW9ucyIsInNoYXJlZE9wdGlvbktleXMiLCJzaGFyZWRPcHRpb25BbGlhc2VzIiwib3B0aW9uIiwiYWxsS25vd25PcHRpb25zIiwia2ViYWJDYXNlS2V5IiwibWF0Y2giLCJ0b0xvd2VyQ2FzZSIsIml0ZW0iLCJyZXRyeUNvbW1hbmQiLCJyZXRyeSIsImNtZEFuZEFyZ3MiLCJsYXN0U3RhdHVzIiwieWVsbG93Iiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib3MiLCJwbGF0Zm9ybSIsInBhY2thZ2VzIiwiaXNGaWxlIiwidmVyc2lvbiIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJ0b0Rldk51bGwiLCJzaWxlbnQiLCJmaW5kQXZhaWxhYmxlUG9ydCIsInN0YXJ0UG9ydCIsIm1heEF0dGVtcHRzIiwiaXNQb3J0QXZhaWxhYmxlIiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwib25jZSIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkRGV2SW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJ1bmJ1ZmZlciIsImFkZGl0aW9uYWxBcmdzIiwic3RvcCIsInNwYXduU3luY09uRXhpdCIsInN0b3BBbGwiLCJCYXNlU2NyaXB0cyIsImJ1aWxkRG9ja2VyIiwic3RhcnREb2NrZXIiLCJub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQiLCJub3JtYWxpemVkQXJnc1RleHQiLCJ3YWl0QW5kT3BlbkFwcCIsInRlc3RFMkUiLCJwbGF5d3JpZ2h0QXJncyIsInByaXNtYURpcmVjdG9yeSIsInN0YXJ0Q29tbWFuZCIsInRlc3RUYXJnZXQiLCJ0YXJnZXRzIiwiZW52UHJlZml4IiwicGxheXdyaWdodENvbW1hbmQiLCJ0ZXN0RTJFRGV2IiwidGVzdFVuaXQiLCJ3YWl0QXBwIiwiYmxpdHpTY3JpcHRzIiwiYXBwRW52Iiwic3RhcnRQcm9kdWN0aW9uIiwic3RhcnRUZXN0Iiwic3VwZXIiLCJkZWZhdWx0U3RhcnRDb21tYW5kIiwidGVzdFN0YXJ0IiwiaHR0cFNlcnZlclNjcmlwdHMiLCJ3YXRjaCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwicmVtaXhTY3JpcHRzIiwiaHR0cFNlcnZlclBhY2thZ2VzIiwibW9kZSIsImFyZyIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwibmV4dCIsImNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzIiwid2JFbnYiLCJORVhUX1BVQkxJQ19XQl9FTlYiLCJ0ZXN0Q29tbWFuZCIsImUyZSIsImNob2ljZXMiLCJ0ZXN0VGFyZ2V0cyIsInNob3VsZFJ1bkFsbFRlc3RzIiwiaGFzRTJlVGFyZ2V0cyIsInRhcmdldCIsImhhc1VuaXRUYXJnZXRzIiwic2hvdWxkUnVuVW5pdCIsInNob3VsZFJ1bkUyZSIsInVuaXRUYXJnZXRzIiwidW5pdEFyZ3YiLCJ1bml0VGltZW91dCIsImUyZVRhcmdldHMiLCJlMmVBcmd2IiwidGVzdE9uRG9ja2VyIiwiZTJlVGFyZ2V0IiwiV0JfRE9DS0VSIiwidGVzdE9uQ2lDb21tYW5kIiwidGVzdE9uQ2kiLCJ0eXBlQ2hlY2tDb21tYW5kIiwiY29tbWFuZHMiLCJ0eXBlc2NyaXB0IiwicHlyaWdodCIsIm5leHREaXJQYXRoIiwicm1TeW5jIiwiZm9yY2UiLCJleGl0Q29kZXMiLCJhbGwiLCJmaW5hbEV4aXRDb2RlIiwidGNDb21tYW5kIiwiaGlkZUJpbiIsInNjcmlwdE5hbWUiLCJtaWRkbGV3YXJlIiwid29ya2luZ0RpciIsImNoZGlyIiwiQkVSUllfQklOX0ZPTERFUiIsInVwcGVyS2V5IiwidG9VcHBlckNhc2UiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYWNrYWdlSnNvbkRpciIsInVybCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiXSwibWFwcGluZ3MiOiI0ZUF5SEEsTUFBTUEsRUFBZ0IsSUFBSUMsSUFFMUIsU0FBU0MsRUFBWUMsR0FDbkIsTUFBTUMsRUFBU0osRUFBY0ssSUFBSUYsR0FDakMsR0FBSUMsRUFBUSxPQUFPQSxFQUVuQixNQUFNRSxFQUFTQyxFQUFPLENBQUVDLEtBQU1BLEVBQUtDLFFBQVFOLEdBQVdPLFdBQVksQ0FBQSxJQUFNSixRQUFVLENBQUEsRUFFbEYsT0FEQU4sRUFBY1csSUFBSVIsRUFBVUcsR0FDckJBLENBQ1QsQ0M5RE9NLGVBQWVDLEVBQ3BCQyxFQUNBQyxFQUNBQyxHQUVBLE9BQU8sSUFBSUMsUUFBUSxDQUFDUixFQUFTUyxLQUMzQixJQUNFLE1BQU1DLEVBQU9DLEVBQU1OLEVBQVNDLEdBQVEsR0FBSUMsR0FBVyxJQUduREcsRUFBS0UsUUFBUUMs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QUFFTSxHQUFHLEdBQUcsSUFBSU4sRUFBRU0sR0FBRyxFQUFFLElBQUlOLEVBQUVNLEdBQUcsR0FBRyxJQUFJTixFQUFFTSxHQUFHLEdBQUcsSUFBSU4sRUFBRU0sR0FBRyxHQUFHLElBQUlOLEVBQUVNLEdBQUcsR0FBRyxJQUFJbUIsRUFBRXhCLElBQUksSUFBSUMsRUFBRUUsRUFBRUYsR0FBRzBCLEVBQUUxQixHQUFHc0IsRUFBRSxFQUFFLENBQUMsT0FBT0YsSUFBSWhCLEVBQUVKLEVBQUVzQixHQUFHRSxHQUFHMUIsRUFBRU0sR0FBRyxFQUFFLElBQUlOLEVBQUUsR0FBR00sR0FBR2dCLEVBQUUsSUFBSUksR0FBRzFCLEVBQUVNLEdBQUcsR0FBRyxJQUFJTixFQUFFTSxHQUFHLEVBQUUsS0FBS2dCLEVBQUUsSUFBSUksR0FBRzFCLEVBQUVNLEdBQUcsR0FBRyxJQUFJTixFQUFFTSxHQUFHLEdBQUcsTUFBTW9CLENBQUMsRUFBRSxNQUFNRSxFQUFFLFNBQVM1QixHQUFHLElBQUlDLEVBQUVDLEVBQUVvQixFQUFFbEIsRUFBRUUsRUFBRXNCLEVBQUVKLEVBQUVDLEVBQUVDLEVBQUVLLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUcsSUFBSTlELEVBQUUsRUFBRUEsRUFBRSxHQUFHQSxHQUFHLEVBQUVsQixFQUFFSixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSU0sRUFBRU4sRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUk0QixFQUFFNUIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUl3QixFQUFFeEIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUl5QixFQUFFekIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUkwQixFQUFFMUIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUkrQixFQUFFL0IsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlnQyxFQUFFaEMsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlpQyxFQUFFakMsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlrQyxFQUFFbEMsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlDLEVBQUVnQyxHQUFHTCxHQUFHLEVBQUVKLElBQUksSUFBSXRCLEVBQUVnQyxHQUFHVixHQUFHLEVBQUVJLElBQUksSUFBSTVCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRUcsR0FBR3FCLEdBQUcsRUFBRUMsSUFBSSxJQUFJeEIsRUFBRUksR0FBR29CLEdBQUcsRUFBRUQsSUFBSSxJQUFJekIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFMkIsR0FBR0csR0FBRyxFQUFFQyxJQUFJLElBQUk5QixFQUFFc0IsR0FBR1EsR0FBRyxFQUFFRCxJQUFJLElBQUkvQixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUV3QixHQUFHUSxHQUFHLEVBQUVDLElBQUksSUFBSWhDLEVBQUV3QixHQUFHUSxHQUFHLEVBQUVELElBQUksSUFBSWpDLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRThCLEdBQUczQixHQUFHLEVBQUVFLElBQUksSUFBSUosRUFBRThCLEdBQUcxQixHQUFHLEVBQUVGLElBQUksSUFBSUosRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFaUMsRUFBRW5DLEVBQUUsR0FBR29DLEVBQUVwQyxFQUFFLEdBQUdtRSxFQUFFbkUsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHb0UsRUFBRXBFLEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBR2lELEVBQUVqRCxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUdrRCxFQUFFbEQsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHaUYsR0FBR2pGLEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBR2tGLEdBQUdsRixFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUcrRCxFQUFFL0QsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHZ0UsRUFBRWhFLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR3VELEVBQUV2RCxFQUFFLElBQUksRUFBRUEsRUFBRSxLQUFLLEdBQUd3RCxFQUFFeEQsRUFBRSxJQUFJLEVBQUVBLEVBQUUsS0FBSyxHQUFHcUMsRUFBRXJDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR3NDLEVBQUV0QyxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUdxRSxFQUFFckUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHc0UsRUFBRXRFLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR21ELEVBQUVuRCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUdvRCxFQUFFcEQsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHbUYsR0FBR25GLEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBR29GLEdBQUdwRixFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUcyRSxHQUFHM0UsRUFBRSxJQUFJLEdBQUdBLEVBQUUsS0FBSyxFQUFFNEUsR0FBRzVFLEVBQUUsSUFBSSxHQUFHQSxFQUFFLEtBQUssRUFBRXlELEVBQUV6RCxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUcwRCxFQUFFMUQsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHdUMsRUFBRXZDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR3dDLEVBQUV4QyxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUd1RSxFQUFFdkUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHd0UsRUFBRXhFLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR3FELEVBQUVyRCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEVBQUVzRCxFQUFFdEQsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFNkMsRUFBRTdDLEVBQUUsSUFBSSxHQUFHQSxFQUFFLEtBQUssRUFBRThDLEVBQUU5QyxFQUFFLElBQUksR0FBR0EsRUFBRSxLQUFLLEVBQUU2RSxHQUFHN0UsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFOEUsR0FBRzlFLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sRUFBRTJELEVBQUUzRCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEVBQUU0RCxFQUFFNUQsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFeUMsRUFBRXpDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBRzBDLEVBQUUxQyxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUd5RSxFQUFFekUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFMEUsR0FBRzFFLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sRUFBRWlFLEVBQUVqRSxFQUFFLElBQUksR0FBR0EsRUFBRSxLQUFLLEVBQUVrRSxFQUFFbEUsRUFBRSxJQUFJLEdBQUdBLEVBQUUsS0FBSyxFQUFFK0MsRUFBRS9DLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR2dELEVBQUVoRCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUcrRSxHQUFHL0UsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHZ0YsR0FBR2hGLEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBRzZELEVBQUU3RCxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUc4RCxFQUFFOUQsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHMkMsRUFBRTNDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBRzRDLEVBQUU1QyxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUdBLEVBQUUsR0FBR21DLEdBQUdFLEVBQUVFLEVBQUV2QyxFQUFFLEdBQUdvQyxHQUFHRSxFQUFFRSxFQUFFeEMsRUFBRSxJQUFJNkMsR0FBR0UsRUFBRUUsRUFBRWpELEVBQUUsSUFBSThDLEdBQUdFLEVBQUVFLEVBQUVsRCxFQUFFLElBQUl1RCxHQUFHRSxFQUFFRSxFQUFFM0QsRUFBRSxJQUFJd0QsR0FBR0UsRUFBRUUsRUFBRTVELEVBQUUsSUFBSWlFLEdBQUdFLEVBQUVFLEVBQUVyRSxFQUFFLElBQUlrRSxHQUFHRSxFQUFFRSxFQUFFdEUsRUFBRSxJQUFJMkUsSUFBSUUsR0FBR0UsR0FBRy9FLEVBQUUsSUFBSTRFLElBQUlFLEdBQUdFLEdBQUdoRixFQUFFLEdBQUdxQyxHQUFHRSxFQUFFRSxFQUFFekMsRUFBRSxHQUFHc0MsR0FBR0UsRUFBRUUsRUFBRTFDLEVBQUUsSUFBSStDLEdBQUdFLEVBQUVFLEVBQUVuRCxFQUFFLElBQUlnRCxHQUFHRSxFQUFFRSxFQUFFcEQsRUFBRSxJQUFJeUQsR0FBR0UsRUFBRUUsRUFBRTdELEVBQUUsSUFBSTBELEdBQUdFLEVBQUVFLEVBQUU5RCxFQUFFLElBQUltRSxHQUFHRSxFQUFFRSxFQUFFdkUsRUFBRSxJQUFJb0UsR0FBR0UsRUFBRUUsRUFBRXhFLEVBQUUsSUFBSTZFLElBQUlFLEdBQUdFLEdBQUdqRixFQUFFLElBQUk4RSxJQUFJRSxHQUFHRSxHQUFHbEYsRUFBRSxHQUFHdUMsR0FBR0UsRUFBRUUsRUFBRTNDLEVBQUUsR0FBR3dDLEdBQUdFLEVBQUVFLEVBQUU1QyxFQUFFLElBQUlpRCxHQUFHRSxFQUFFRSxFQUFFckQsRUFBRSxJQUFJa0QsR0FBR0UsRUFBRUUsRUFBRXRELEVBQUUsSUFBSTJELEdBQUdFLEVBQUVFLEVBQUUvRCxFQUFFLElBQUk0RCxHQUFHRSxFQUFFRSxFQUFFaEUsRUFBRSxJQUFJcUUsR0FBR0UsRUFBRUUsRUFBRXpFLEVBQUUsSUFBSXNFLEdBQUdFLEVBQUVFLEdBQUcxRSxFQUFFLElBQUkrRSxJQUFJRSxHQUFHRSxHQUFHbkYsRUFBRSxJQUFJZ0YsSUFBSUUsR0FBR0UsR0FBR3BGLEVBQUUsR0FBR3lDLEdBQUdFLEVBQUVSLEVBQUVuQyxFQUFFLEdBQUcwQyxHQUFHRSxFQUFFUixFQUFFcEMsRUFBRSxJQUFJbUQsR0FBR0UsRUFBRVIsRUFBRTdDLEVBQUUsSUFBSW9ELEdBQUdFLEVBQUVSLEVBQUU5QyxFQUFFLElBQUk2RCxHQUFHRSxFQUFFUixFQUFFdkQsRUFBRSxJQUFJOEQsR0FBR0UsRUFBRVIsRUFBRXhELEVBQUUsSUFBSXVFLEdBQUdFLEVBQUVSLEVBQUVqRSxFQUFFLElBQUl3RSxHQUFHRSxHQUFHUixFQUFFbEUsRUFBRSxJQUFJaUYsSUFBSUUsR0FBR1IsR0FBRzNFLEVBQUUsSUFBSWtGLElBQUlFLEdBQUdSLEdBQUc1RSxFQUFFLEdBQUcyQyxHQUFHUixFQUFFRSxFQUFFckMsRUFBRSxHQUFHNEMsR0FBR1IsRUFBRUUsRUFBRXRDLEVBQUUsSUFBSXFELEdBQUdSLEVBQUVFLEVBQUUvQyxFQUFFLElBQUlzRCxHQUFHUixFQUFFRSxFQUFFaEQsRUFBRSxJQUFJK0QsR0FBR1IsRUFBRUUsRUFBRXpELEVBQUUsSUFBSWdFLEdBQUdSLEVBQUVFLEVBQUUxRCxFQUFFLElBQUl5RSxHQUFHUixFQUFFRSxFQUFFbkUsRUFBRSxJQUFJMEUsSUFBSVIsRUFBRUUsRUFBRXBFLEVBQUUsSUFBSW1GLElBQUlSLEdBQUdFLEdBQUc3RSxFQUFFLElBQUlvRixJQUFJUixHQUFHRSxHQUFHOUUsRUFBRSxJQUFJRyxFQUFFbUIsR0FBR3RCLEVBQUUsSUFBSUcsRUFBRW1CLEVBQUUsRUFBRSxFQ1JobEt0QixFQUFFLFdBQVcsTUFBTUcsRUFBRSxDQUFDa0YsU0FBUzFGLE1BQU0yRixLQUFLbkYsSUFBSSxNQUFNSCxFQUFFLENBQUNHLEVBQUVvRixLQUFLcEYsRUFBRXFGLFNBQVMsWUFBTyxJQUFTckYsRUFBRXNGLE9BQU96RixFQUFFMEYsS0FBS3ZGLEVBQUVzRixZQUFPLElBQVN0RixFQUFFd0YsYUFBUSxJQUFTeEYsRUFBRXNGLE9BQU96RixFQUFFMEYsVUFBSyxHQUFRMUYsRUFBRTBGLEtBQUt2RixFQUFFd0YsUUFBUTNGLEdBQUc0RixLQUFLLElBQUksSUFBSWpHLE1BQU1rRyxRQUFRLENBQUMxRixHQUFHSCxFQUFFSSxFQUFFMkIsRUFBRTlCLE1BQU1FLEVBQUVvRixLQUFLdkYsRUFBRUcsRUFBRXFGLFFBQVFwRixPQUFFLElBQVMyQixTQUFTNUIsRUFBRXNGLE1BQU10RixFQUFFc0YsTUFBTTFELE9BQUUsSUFBUzlCLElBQUlFLEVBQUV3RixNQUFNMUYsS0FBS0QsRUFBRSxDQUFDcUYsU0FBU1MsV0FBV1IsS0FBS25GLEdBQUcsQ0FBQzRGLEtBQUtoRSxFQUFFaUUsT0FBTzdGLEtBQUs4RixPQUFPLEVBQUU5RixLQUFLQyxFQUFFOEYsT0FBT0MsS0FBS2hHLEtBQUtGLEVBQUUsQ0FBQ29GLFNBQVN0SSxJQUFJdUksS0FBS25GLEdBQUcsSUFBSUEsRUFBRUUsV0FBV3VGLEtBQUssSUFBSSxJQUFJN0ksSUFBSThJLFFBQVEsQ0FBQzFGLEVBQUVILEtBQUssSUFBSSxNQUFNSSxFQUFFMkIsS0FBSy9CLEVBQUVHLEVBQUUxQyxJQUFJMkMsRUFBRTJCLEtBQUtULEVBQUUsQ0FBQytELFNBQVNlLElBQUlkLEtBQUtuRixHQUFHLElBQUlBLEVBQUVrRyxVQUFVVCxLQUFLLElBQUksSUFBSVEsSUFBSVAsUUFBUSxDQUFDMUYsRUFBRUgsS0FBSyxJQUFJLE1BQU1JLEtBQUtKLEVBQUVHLEVBQUVtRyxJQUFJbEcsS0FBS3dCLEVBQUUsQ0FBQ3lELFNBQVNrQixLQUFLakIsS0FBS25GLEdBQUcsQ0FBQ0EsRUFBRXFHLFVBQVVQLE9BQU8sRUFBRTlGLEtBQUssSUFBSW9HLEtBQUtwRyxJQUFJc0IsRUFBRSxDQUFDNEQsU0FBU29CLE9BQU9uQixLQUFLLEVBQUVvQixNQUFNdkcsRUFBRXdHLE9BQU8zRyxLQUFLRyxFQUFFLENBQUNILEVBQUVHLEdBQUcsQ0FBQ0gsR0FBR2lHLE9BQU8sRUFBRTlGLEVBQUVILEtBQUssSUFBSXlHLE9BQU90RyxFQUFFSCxJQUFJaUMsRUFBRSxDQUFDb0QsU0FBU3VCLElBQUl0QixLQUFLbkYsR0FBRyxDQUFDQSxFQUFFMEcsTUFBTVosT0FBTyxFQUFFOUYsS0FBSyxJQUFJeUcsSUFBSXpHLElBQUksT0FBTyxJQUFJcEQsSUFBSSxDQUFDb0QsRUFBRUgsRUFBRUMsRUFBRXFCLEVBQUVNLEVBQUVILEVBQUVRLEdBQUc2RSxJQUFJM0csR0FBRyxDQUFDQSxFQUFFa0YsU0FBU0UsS0FBS3BGLElBQUksQ0FBMzJCLEdBQSsyQkMsRUFBRSxJQUFJMkcsWUFBWWhGLEVBQUUsSUFBSWlGLFlBQVksUUNBenlCLFNBQVN0RixFQUFFdEIsT0FBRSxFQUFPRCxFQUFFSCxHQUFHLE9BQU9pSCxLQUFLQyxVQUFVbkYsRUFBRTNCLEVBQUVELEdBQUcsQ0FBQyxTQUFTNkIsRUFBRWhDLEdBQUcsUUFBRyxJQUFTQSxFQUFFLE9BQU0sRUFBRyxHQUFHLGlCQUFpQkEsRUFBRSxDQUFDLEdBQUdtSCxPQUFPQyxNQUFNcEgsR0FBRyxPQUFNLEVBQUcsSUFBSW1ILE9BQU9FLFNBQVNySCxHQUFHLE9BQU9BLEVBQUUsR0FBRSxHQUFHLENBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNd0IsRUFBRSxHQUFHLFNBQVNPLEVBQUU1QixFQUFFeUIsRUFBRTVCLEdBQUcsTUFBTXNCLEVBQUVVLEVBQUU3QixHQUFHLEdBQUcsT0FBT21CLEVBQUUsT0FBT0EsRUFBRSxNQUFNcEIsRUFBRSxHQUFHRCxFQUFFLElBQUlsRCxJQUFJLE9BQU8sU0FBU2lELEVBQUVHLEdBQUcsTUFBTW1CLEVBQUVVLEVBQUU3QixHQUFHLEdBQUcsT0FBT21CLEVBQUUsT0FBT0EsRUFBRSxJQUFJRyxFQUFFeEIsRUFBRTlDLElBQUlnRCxHQUFHLFFBQUcsSUFBU3NCLEVBQUUsT0FBT0EsRUFBRSxPQUFPQSxFQUFFdkIsRUFBRXFCLGNBQWNwQixHQUFHLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxVQUFVRCxFQUFFdUIsR0FBR3RCLEVBQUVGLEVBQUV4QyxJQUFJMEMsRUFBRXNCLEdBQUcsTUFBTSxJQUFJLFNBQVN2QixFQUFFdUIsR0FBRyxFQUFDLEVBQUd0QixFQUFFbUgsU0FBUyxLQUFLckgsRUFBRXhDLElBQUkwQyxFQUFFc0IsR0FBRyxNQUFNLElBQUksU0FBUyxHQUFHLE9BQU90QixFQUFFRCxFQUFFdUIsR0FBR3RCLEVBQUVGLEVBQUV4QyxJQUFJMEMsRUFBRXNCLFFBQVEsR0FBRzhGLE1BQU1DLFFBQVFySCxHQUFHLENBQUMsTUFBTUMsRUFBRSxTQUFTSixHQUFHLEdBQUd3QixFQUFFRCxPQUFPdkIsRUFBRSxDQUFDLE1BQU1JLEVBQUVvQixFQUFFRCxPQUFPQyxFQUFFRCxPQUFPdkIsRUFBRXdCLEVBQUVpRyxNQUFLLEVBQUdySCxFQUFFSixFQUFFLENBQUMsT0FBT3dCLEVBQUVrRyxNQUFNLEVBQUUxSCxFQUFFLENBQXpGLENBQTJGRyxFQUFFb0IsUUFBUXJCLEVBQUV1QixHQUFHckIsRUFBRUgsRUFBRXhDLElBQUkwQyxFQUFFc0IsR0FBRyxJQUFJLE1BQU1HLEVBQUVOLEtBQUtuQixFQUFFRSxVQUFVRCxFQUFFd0IsR0FBRzVCLEVBQUVzQixFQUFFLEtBQUssQ0FBQyxNQUFNQSxFQUFFSSxHQUFHLFNBQVMxQixFQUFFRyxHQUFHLE1BQU15QixFQUFFNUIsRUFBRWEsWUFBWSxHQUFHLG1CQUFtQmUsRUFBRSxDQUFDLE1BQU14QixFQUFFd0IsRUFBRTJELEtBQUtqRSxFQUFFbkIsRUFBRWhELElBQUlpRCxHQUFHLFFBQUcsSUFBU2tCLEVBQUUsTUFBTSxDQUFDbEIsRUFBRWtCLEVBQUVnRSxLQUFLdEYsR0FBRyxDQUFDLE1BQU1zQixFQUFFcUcsT0FBT3RILFFBQVFMLEdBQUdFLEVBQUVvQixFQUFFQyxPQUFPdEIsRUFBRXNILE1BQU1qQyxLQUFLLENBQUMvRCxPQUFPckIsRUFBRUEsSUFBSSxJQUFJLElBQUlGLEVBQUUsRUFBRUEsRUFBRUUsRUFBRUYsSUFBSSxDQUFDLE1BQU1JLEVBQUVrQixFQUFFdEIsR0FBR0csRUFBRUgsRUFBRUEsRUFBRUMsRUFBRUUsR0FBR0MsRUFBRSxHQUFHSCxFQUFFRSxFQUFFLEdBQUdDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0RBOW1DLEdDQWluQ0gsRUFBRSxDQUFsUSxDQUFvUUUsRUFBRXlCLEdBQUdJLEVBQUVOLEVBQUVILE9BQU9DLEVBQUUrRixNQUFNakMsS0FBSyxDQUFDL0QsT0FBT1MsRUFBRSxJQUFJUixFQUFFLEdBQUdGLEVBQUVwQixFQUFFdUIsR0FBR0QsRUFBRXZCLEVBQUV4QyxJQUFJMEMsRUFBRXNCLEdBQUcsSUFBSSxJQUFJckIsRUFBRSxFQUFFQSxFQUFFNEIsRUFBRTVCLElBQUlvQixFQUFFcEIsRUFBRSxHQUFHSixFQUFFMEIsRUFBRXRCLEdBQUcsRUFBRSxPQUFPcUIsQ0FBQyxDQUF4MUIsQ0FBMDFCdEIsR0FBR0QsQ0FBQyxDQ0E5cEMsU0FBU29CLEVBQUVBLEVBQUV0QixHQUFHLE9IUW9VLFNBQVdBLEdBQUcsT0FBTyxJQUFJTSxFQUFFLElBQUlMLEVBQUUsS0FBS29CLE9BQU9yQixHQUFHOEIsS0FBSyxDR1JsWEYsQ0FBRXhCLEVBQUUsQ0FBQ2tCLEVBQUV0QixJQUFJLENDQS9CLE1BQUNJLEVBQTBDLFVBQVl3SCxjQUFjekgsRUFBRWdILE9BQU9VLGtCQUFrQkMsWUFBWTFILEVBQUVKLEdBQUcsQ0FBQSxHQUFJLE9BQU8sU0FBU0EsRUFBRXlCLEdBQUcsSUFBSUcsRUFBRU4sRUFBRXBCLEVBQUUsTUFBTSxXQUFXdUIsR0FBR3NHLEtBQUssV0FBVyxNQUFNdEcsRUFBRXJCLEVBQUVVLEtBQUssSUFBSWlCLEVBQUV3RSxLQUFLeUIsTUFBTSxPQUFPOUgsSUFBSXVCLEdBQUdNLEVBQUVULEVBQUVuQixLQUFLRCxFQUFFdUIsRUFBRUcsRUFBRTVCLEVBQUVpSSxLQUFLbkgsTUFBTVEsRUFBRVMsR0FBR0gsQ0FBQyxFQUFFLFlBQVlHLEdBQUcsTUFBTUMsRUFBRTVCLEVBQUVVLEtBQUtpQixHQUFHekIsRUFBRWlHLEtBQUt5QixNQUFNLE9BQU85SCxJQUFJOEIsR0FBRzFCLEVBQUVnQixFQUFFbkIsS0FBS0QsRUFBRThCLEVBQUVKLEVBQUVILEVBQUV6QixFQUFFaUksS0FBS25ILFFBQVFpQixHQUFHL0IsS0FBSytCLEdBQUdULEVBQUVoQixHQUFHc0IsQ0FBQyxDQUFDLENBQUMsQ0FBdFhBLENBQUUsQ0FBQ2tHLFlBQVk5SCxJQ0FuRyxTQUFTa0ksRUFBS0MsR0FDbkIsUUFBU0EsR0FBbUIsTUFBVkEsR0FBMkIsVUFBVkEsQ0FDckMsT0NTTyxNQUFNQyxVQUFRQywrcUZBQUFDLENBQUF4SCxLQUFBLEdBQUEsQ0FBQSxDQWFsQnlILHVCQVNBQSxFQUFVLEVBQUEsZ0JBQUEsQ0FhVkEsRUFBVSxFQUFBLGVBQUEsQ0FPVkEsRUFBVSxFQUFBLGNBQUEsQ0FLVkEsRUFBVSxFQUFBLGlCQUFBLENBU1ZBLHNCQUtBQSxFQUFVLEVBQUEsUUFBQSxDQUtWQSxFQUFVLEVBQUEsbUJBQUEsQ0FNVkEsRUFBVSxFQUFBLE9BQUEsQ0FhVkEsRUFBVSxFQUFBLGVBQUEsQ0FLVkEsd0JBS0FBLEVBQVUsRUFBQSxhQUFBLENBS1ZBLEVBQVUsRUFBQSxhQUFBLENBS1ZBLEVBQVUsRUFBQSxvQ0FBQSxDQVdWQSxFQUFVLEVBQUEscUJBQUEsQ0FTVkEsbUJBQVVwSSxDQUFBLENBNUhNcUksVUFBSUgsRUFBQXZILE1BRUoySCxXQUFhLElBQUkxTCxJQUlsQzhELFdBQUFBLENBQVk2SCxFQUFpQkYsRUFBd0JHLEdBQ25EN0gsS0FBSzhILFNBQVd0TCxFQUFLQyxRQUFRbUwsR0FDN0I1SCxLQUFLMEgsS0FBT0EsRUFDWjFILEtBQUs2SCxRQUFVQSxDQUNqQixDQUVBLGtCQUNJRSxHQUNGLElBQ0UsTUFBTyxjQUFjQyxLQUFLQyxFQUFHQyxhQUFhMUwsRUFBSzJMLEtBQUtuSSxLQUFLb0ksWUFBYSxrQkFBbUIsUUFDM0YsQ0FBRSxNQUNBLE9BQU8sQ0FDVCxDQUNGLENBRUEsZ0JBQ0lDLEdBQ0YsT0FBT3JJLEtBQUtzSSxZQUFZQyxTQUFTQyxPQUFPQyxTQUFTLGlCQUM3QyxpQkFDQXpJLEtBQUtzSSxZQUFZQyxTQUFTQyxNQUN4QiwwQkFBeUJ4SSxLQUFLMEgsS0FBS3hKLFFBQVUsWUFBYyxJQUMzRCx3QkFDUixDQUVBLFdBQUkwSixHQUNGLE9BQU81SCxLQUFLOEgsUUFDZCxDQUVBLGVBQ0lNLEdBQ0YsT0FBT0gsRUFBR1MsV0FBV2xNLEVBQUsyTCxLQUFLbkksS0FBSzRILFFBQVMsS0FBTSxLQUFNLGlCQUNyRHBMLEVBQUtDLFFBQVF1RCxLQUFLNEgsUUFBUyxLQUFNLE1BQ2pDNUgsS0FBSzRILE9BQ1gsQ0FFQSxjQUNJZSxHQUNGLE9BQU9WLEVBQUdDLGFBQWFsSSxLQUFLNEksU0FBUyxjQUFlLE9BQ3RELENBRUEsaUJBQ0lDLEdBQ0YsSUFDRSxRQUFTN0ksS0FBSzRJLFNBQVMsYUFDekIsQ0FBRSxNQUNBLE9BQU8sQ0FDVCxDQUNGLENBRUEsaUJBQ0lFLEdBQ0YsT0FBT2IsRUFBR1MsV0FBV2xNLEVBQUsyTCxLQUFLbkksS0FBSzRILFFBQVMsT0FDL0MsQ0FFQSxRQUNJbkQsR0FDRixPQUFPekUsS0FBS3NJLFlBQVk3RCxNQUFRLFNBQ2xDLENBRUEsbUJBQ0lzRSxHQUVGLE9BRGEvSSxLQUFLc0ksWUFBWTdELE1BQVEsV0FDMUJ1RSxXQUFXLElBQUssSUFBSUEsV0FBVyxJQUFLLElBQ2xELENBRUEsT0FDSUMsR0FDRixJQUFLakosS0FBSzZILFFBQVMsT0FBT2xLLFFBQVFzTCxJQUVsQyxNQUFPQyxFQUFTQyxHUnRDYixTQUNMekIsRUFDQTBCLEdBRUEsSUFBSUMsR0FBWTNCLEVBQUt1QixLQUFPLElBQUlqRCxJQUFLc0QsR0FBWTlNLEVBQUtDLFFBQVEyTSxFQUFLRSxFQUFROUMsYUFDM0UsTUFBTStDLEVBQ0o3QixFQUFLOEIsYUFDSjlCLEVBQUsrQixlQUNGOUwsUUFBUXNMLElBQUlTLFVBQVksY0FDeEJoQyxFQUFLaUMsZUFDSGhNLFFBQVFzTCxJQUFJVyxRQUFVak0sUUFBUXNMLElBQUlTLFVBQVksbUJBQzlDOUssR0FDUixHQUF1QixpQkFBWjJLLEVBQXNCLENBQy9CLEdBQXdCLElBQXBCRixFQUFTNUksU0FDWDRJLEVBQVN6RSxLQUFLcEksRUFBSzJMLEtBQUtpQixFQUFLLFNBQ3pCMUIsRUFBS21DLGdCQUFnQixDQUN2QixNQUFNQyxFQUFXdE4sRUFBS0MsUUFBUTJNLEVBQUssS0FBTSxNQUNyQ25CLEVBQUdTLFdBQVdsTSxFQUFLMkwsS0FBSzJCLEVBQVUsa0JBQ3BDVCxFQUFTekUsS0FBS3BJLEVBQUsyTCxLQUFLMkIsRUFBVSxRQUV0QyxDQUVGVCxFQUFXQSxFQUFTVSxRQUFTVCxHQUMzQkMsRUFDSSxDQUFDLEdBQUdELEtBQVdDLFVBQWlCLEdBQUdELFVBQWlCLEdBQUdBLEtBQVdDLElBQVdELEdBQzdFLENBQUMsR0FBR0EsVUFBaUJBLEdBRTdCLENBQ0FELEVBQVdBLEVBQVNXLE9BQVFWLEdBQVlyQixFQUFHUyxXQUFXWSxJQUFVdEQsSUFBS3NELEdBQVk5TSxFQUFLeU4sU0FBU2IsRUFBS0UsSUFDaEc1QixFQUFLeEosVUFDUEMsUUFBUUMsS0FBSyxXQUFXVCxRQUFRc0wsSUFBSVcscUJBQXFCak0sUUFBUXNMLElBQUlTLFlBQ3JFdkwsUUFBUUMsS0FBSyxxQkFBc0JpTCxFQUFTbEIsS0FBSyxRQUduRCxNQUFNK0IsRUFBaUQsR0FDakRoQixFQUFrQyxDQUFBLEVBQ3hDLElBQUssTUFBTUksS0FBV0QsRUFBVSxDQUM5QixJQUFJYyxFQUFRLEVBQ1osSUFBSyxNQUFPQyxFQUFLQyxLQUFVeEQsT0FBT3RILFFBQVFyRCxFQUFZTSxFQUFLMkwsS0FBS2lCLEVBQUtFLEtBQzdEYyxLQUFPbEIsSUFDWEEsRUFBUWtCLEdBQU9DLEVBQ2ZGLEtBR0pELEVBQTJCdEYsS0FBSyxDQUFDMEUsRUFBU2EsSUFDdEN6QyxFQUFLeEosU0FBV2lNLEVBQVEsR0FDMUJoTSxRQUFRQyxLQUFLLFFBQVErTCxnQ0FBb0NiLElBRTdELENBRUEsR0FBSTVCLEVBQUs0QyxTQUFVLENBQ2pCLE1BQ01DLEVBRGMxRCxPQUFPMkQsS0FBS3RPLEVBQVlNLEVBQUsyTCxLQUFLaUIsRUFBSzFCLEVBQUs0QyxZQUNoQ04sT0FBUUksS0FBVUEsS0FBT2xCLElBQ3pELEdBQUlxQixFQUFZOUosT0FBUyxFQUN2QixNQUFNLElBQUk1QixNQUFNLHFDQUFxQ3dLLEVBQVNsQixLQUFLLFlBQVlvQyxFQUFZcEMsS0FBSyxTQUVwRyxDQUNBLE1BQU8sQ0FBQ2UsRUFBU2dCLEVBQ25CLENRcEJ3RE8sQ0FBeUJ6SyxLQUFLMEgsS0FBTTFILEtBQUs0SCxTQUM3RixJQUFLLE1BQU8wQixFQUFTYSxLQUFVaEIsRUFDN0JoTCxRQUFRQyxLQUFLLFVBQVUrTCxnQ0FBb0NiLEtBSTdELE1BQU8sSUFBSzNMLFFBQVFzTCxPQUFRQyxFQUM5QixDQUVBLGVBQ0laLEdBQ0YsT0FBT25DLEtBQUt1RSxNQUFNekMsRUFBR0MsYUFBYWxJLEtBQUsySyxnQkFBaUIsUUFDMUQsQ0FFQSxtQkFDSUEsR0FDRixPQUFPbk8sRUFBSzJMLEtBQUtuSSxLQUFLNEgsUUFBUyxlQUNqQyxDQUVBLGFBQ0lnRCxHQUNGLFNBQVU1SyxLQUFLc0ksWUFBWXVDLGNBQWNDLFFBQVU5SyxLQUFLc0ksWUFBWXlDLGlCQUFpQkQsT0FDdkYsQ0FFQSxhQUNJRSxHQUNGLFNBQVVoTCxLQUFLc0ksWUFBWXVDLGNBQWNJLFFBQVVqTCxLQUFLc0ksWUFBWXlDLGlCQUFpQkUsT0FDdkYsQ0FFQSxvQ0FDSUMsR0FDRixHQUFJOUQsRUFBS3BILEtBQUtpSixJQUFJa0MsSUFBSyxPQUFPLEVBQzlCLElBQ0UsTUFBTUMsRUFBYXBMLEtBQUs0SSxTQUFTLHdCQUNqQyxNQUFPLGdCQUFnQlosS0FBS0MsRUFBR0MsYUFBYWtELEVBQVksUUFDMUQsQ0FBRSxNQUNBLE9BQU8sQ0FDVCxDQUNGLENBRUEscUJBQ0lDLEdBQ0YsT0FBTzdPLEVBQUs4TyxRQUFRdEwsS0FBSzRJLFNBQVMsaUJBQW1CNUksS0FBSzRILFFBQ3RENUgsS0FBS3NJLFlBQ0puQyxLQUFLdUUsTUFDSnpDLEVBQUdDLGFBQWExTCxFQUFLMkwsS0FBSzNMLEVBQUs4TyxRQUFRdEwsS0FBSzRJLFNBQVMsZUFBZ0IsZ0JBQWlCLFFBRTlGLENBRUEsYUFDSTJDLEdBQ0YsSUFBSUMsR0FBVyxFQUNYQyxFQUFjekwsS0FBSzRILFFBQ3ZCLE9BQVMsQ0FDUCxNQUFNOEQsRUFBVWxQLEVBQUsyTCxLQUFLc0QsRUFBYSxlQUFnQixRQU12RCxHQUxJeEQsRUFBR1MsV0FBV2dELEtBQ2hCMUwsS0FBS2lKLElBQUkwQyxLQUFPLEdBQUdELEtBQVcxTCxLQUFLaUosSUFBSTBDLE9BQ3ZDSCxHQUFXLEdBR1R2RCxFQUFHUyxXQUFXbE0sRUFBSzJMLEtBQUtzRCxFQUFhLFNBQ3ZDLE1BRUYsTUFBTUcsRUFBYXBQLEVBQUs4TyxRQUFRRyxHQUNoQyxHQUFJQSxJQUFnQkcsRUFDbEIsTUFFRkgsRUFBY0csQ0FDaEIsQ0FDQSxPQUFPSixDQUNULENBRUE1QyxRQUFBQSxDQUFTaUQsR0FDUCxJQUFJMVAsRUFBVzZELEtBQUsySCxXQUFXdEwsSUFBSXdQLEdBQ25DLEdBQUkxUCxFQUFVLE9BQU9BLEVBS3JCLEdBSEFBLEVBQVcsQ0FBQzBQLEVBQVVyUCxFQUFLMkwsS0FBSyxLQUFNLEtBQU0wRCxJQUN6QzdGLElBQUt2RSxHQUFNakYsRUFBS0MsUUFBUXVELEtBQUs0SCxRQUFTbkcsSUFDdENxSyxLQUFNckssR0FBTXdHLEVBQUdTLFdBQVdqSCxLQUN4QnRGLEVBQ0gsTUFBTSxJQUFJMEMsTUFBTSxtQkFBbUJnTixLQUdyQyxPQURBN0wsS0FBSzJILFdBQVdoTCxJQUFJa1AsRUFBVTFQLEdBQ3ZCQSxDQUNULEVBU0ssU0FBUzRQLEVBQWdCckUsRUFBd0JHLEdBQVUsRUFBTUQsR0FFdEUsR0FEQUEsSUFBWWpLLFFBQVF5TCxNQUNmbkIsRUFBR1MsV0FBV2xNLEVBQUsyTCxLQUFLUCxFQUFTLGlCQUV0QyxPQUFPLElBQUlOLEVBQVFNLEVBQVNGLEVBQU1HLEVBQ3BDLENBRU9qTCxlQUFlb1AsRUFDcEJ0RSxFQUNBRyxHQUFVLEVBQ1ZELEdBRUEsTUFBTXFFLEVBWUQsU0FDTHZFLEVBQ0FHLEdBQVUsRUFDVkQsR0FHQSxHQURBQSxJQUFZakssUUFBUXlMLE9BQ2ZuQixFQUFHUyxXQUFXbE0sRUFBSzJMLEtBQUtQLEVBQVMsaUJBQWtCLE9BRXhELE1BQU1zRSxFQUFjLElBQUk1RSxFQUFRTSxFQUFTRixFQUFNRyxHQUMvQyxJQUFJc0UsRUFBY0QsRUFDbEIsSUFBS0EsRUFBWTVELFlBQVk4RCxZQUFjNVAsRUFBSzhPLFFBQVExRCxHQUFTeUUsU0FBUyxhQUFjLENBQ3RGLE1BQU1qRSxFQUFjNUwsRUFBS0MsUUFBUW1MLEVBQVMsS0FBTSxNQUM1Q0ssRUFBR1MsV0FBV2xNLEVBQUsyTCxLQUFLQyxFQUFhLG1CQUN2QytELEVBQWMsSUFBSTdFLEVBQVFjLEVBQWFWLEVBQU1HLEdBRWpELENBQ0EsTUFBTyxDQUFFeUUsS0FBTUgsRUFBYUksS0FBTUwsRUFDcEMsQ0E3QjhCTSxDQUF3QjlFLEVBQU1HLEVBQVNELEdBQ25FLEdBQUtxRSxFQUVMLE1BQU8sSUFDRkEsRUFDSFEsWUFDRVIsRUFBb0JLLE9BQVNMLEVBQW9CTSxXQUN2Q0csRUFBeUJoRixFQUFNdUUsRUFBb0JLLEtBQU16RSxHQUMvRCxDQUFDb0UsRUFBb0JNLE1BRS9CLENBcUJBM1AsZUFBZThQLEVBQ2JoRixFQUNBeUUsRUFDQXRFLEdBRUEsTUFBTThFLEVBQVcsQ0FBQ1IsR0FFWlMsRUFBWVQsRUFBWTdELFlBQVk4RCxXQUMxQyxJQUFLM0YsTUFBTUMsUUFBUWtHLEdBQVksT0FBT0QsRUFFdEMsTUFBTUUsRUFBd0IsR0FDeEJDLEVBQXdCLEdBQzlCLElBQUssTUFBTUMsS0FBaUJILEVBQVU1RyxJQUFLZ0gsR0FBZXhRLEVBQUsyTCxLQUFLZ0UsRUFBWXZFLFFBQVNvRixJQUNuRi9FLEVBQUdTLFdBQVdxRSxHQUNoQkQsRUFBWWxJLEtBQUttSSxHQUVqQkYsRUFBWWpJLEtBQUttSSxHQUdyQkQsRUFBWWxJLGNBQWVxSSxFQUFPSixFQUFhLENBQUVLLEtBQUssRUFBTUMsaUJBQWlCLEtBQzdFLElBQUssTUFBTUMsS0FBcUJOLEVBQ3pCN0UsRUFBR1MsV0FBV2xNLEVBQUsyTCxLQUFLaUYsRUFBbUIsa0JBRWhEVCxFQUFTL0gsS0FBSyxJQUFJMEMsRUFBUThGLEVBQW1CMUYsRUFBTUcsSUFFckQsT0FBTzhFLENBQ1QsQ0N6UE8sTUFBTVUsRUFFWDFQLFFBQVEyUCxTQUFTQyxLQUVqQjVQLFFBQVErSixLQUFLLElBQUkyRSxTQUFTLFNBQzFCMU8sUUFBUXNMLElBQUl1RSxjQUFjbkIsU0FBUyxRQUV4Qm9CLEVBQWtCSixFQUFpQixnQkFBa0IsT0FDckRLLEVBQWlCTCxFQUFpQixNQUFRLE9BQzFDTSxFQUF3Qk4sRUFBaUIsZ0JBQWtCLE9DYzNETyxFQUFvRixDQUMvRjlRLFFBQVMsZ0JBQ1QrUSxTQUFVLDZDQVZJLENBQ2QvUSxRQUFTLENBQ1BnUixZQUFhLDRDQUNiQyxLQUFNLFNBQ05DLE1BQU8sTUFRVCxhQUFNQyxDQUFRdkcsU0FLVDlLLGVBRUw4SyxFQUNBd0csR0FFQSxNQUFNQyxFQUFVcEMsRUFBZ0JyRSxHQUFNLEVBQU13RyxHQUM1QyxJQUFLQyxFQUVILE9BREFoUSxRQUFRSSxNQUFNNlAsRUFBTUMsSUFBSSx1QkFDakIsRUFLVCxHQUZBM0csRUFBTyxJQUFLQSxFQUFNNUssUUFBUzRLLEVBQUs1SyxVQUFZdVEsRUFBaUIsZ0JBQWtCLGdCQUUxRXBGLEVBQUdTLFdBQVdsTSxFQUFLMkwsS0FBS2dHLEVBQVEvRixZQUFhLFNBRWhELE9BREFJLEVBQU0yRixFQUFTekcsSUFDUixFQUdULE1BQU80RyxFQUFTQyxFQUFlQyxTQWlDMUI1UixlQUNMdVIsRUFDQXpHLEdBRUEsTUFBTStHLEVBQXFCalMsRUFBS0MsUUFBUTBSLEVBQVF2RyxRQUFTLGVBQWdCLFNBQVUsU0FDN0UyRyxFQUFnQi9SLEVBQUtDLFFBQVFnUyxFQUFvQixvQkFDakR4RyxFQUFHeUcsU0FBU0MsTUFBTUYsRUFBb0IsQ0FBRUcsV0FBVyxJQUV6RCxNQUFNQyxFQUFPQyxFQUFXLFVBRWxCQyxFQUFhQyxFQUFjQyxTQUFTLHFCQUFzQixDQUFFN0YsSUFBSytFLEVBQVF2RyxVQUFXcEIsV0FBVzBJLE9BQ3JHTCxFQUFLdE8sT0FBT3dPLEdBRVosTUFBTUksRUFBa0JoSixLQUFLQyxVQUMzQlMsT0FBT3RILFFBQVE0TyxFQUFRbEYsS0FDcEJlLE9BQU8sRUFBRUksTUFBVWdGLEVBQW9CQyxJQUFJakYsSUFDM0NrRixTQUFTLEVBQUVDLElBQVFDLEtBQVVELEVBQUtFLGNBQWNELEtBRXJEWCxFQUFLdE8sT0FBTzRPLFNBMkJkdlMsZUFDRXVSLEVBQ0F6RyxFQUNBbUgsR0FFQSxPQUFPLElBQUk1UixRQUFTUixJQUNsQixNQVlNaVQsRUFaTVYsRUFBY1csVUFBVSxNQUFPLENBQUMsVUFBVyxDQUNyRHZHLElBQUsrRSxFQUFRdkcsUUFDYnFCLElBQUtrRixFQUFRbEYsSUFDYjJHLE1BQU8sT0FDUEMsU0FBVSxTQUVVeFMsT0FDbkI2UixPQUNBWSxNQUFNLE1BQ045SixJQUFLN0osR0FDbUIsU0FBdkJnUyxFQUFRbEYsSUFBSVcsT0FBb0J6TixFQUFTNFQsUUFBUSx3Q0FBeUMsSUFBTTVULEdBRWhFNk4sT0FDakM3TixJQUNFNlQsRUFBZ0JDLEtBQU1DLEdBQVkvVCxFQUFTc00sU0FBU3lILEtBQ25EQyxFQUFjRixLQUFNRyxHQUFXalUsRUFBU2tRLFNBQVMrRCxPQUNsREMsR0FBZ0JKLEtBQU1DLEdBQVkvVCxFQUFTc00sU0FBU3lILEtBRXJEeEksRUFBS3hKLFNBQ1BDLFFBQVFDLEtBQUssa0JBQWtCc1IsRUFBa0J2SCxLQUFLLFNBSXhELE1BQU1oTCxFQUFPNlIsRUFBYzVSLE1BQU0sTUFBTyxDQUFDLE9BQVEsUUFBU3NTLEdBQW9CLENBQUV0RyxJQUFLK0UsRUFBUS9GLGNBQzdGakwsRUFBS0UsT0FBT0csR0FBRyxPQUFTQyxJQUN0Qm9SLEVBQUt0TyxPQUFPOUMsR0FDUmlLLEVBQUt4SixVQUNQQyxRQUFRQyxLQUFLLFFBQVNYLEdBQ3RCVSxRQUFRQyxLQUFLLFFBQVN5USxFQUFLeUIsT0FBT0MsT0FBTyxXQUc3Q3BULEVBQUtLLEdBQUcsUUFBUyxLQUNmZixPQUdOLENBbEVRK1QsQ0FBeUJyQyxFQUFTekcsRUFBTW1ILEdBQzlDLE1BQU1MLEVBQWNLLEVBQUswQixPQUFPLE9BRTFCRSxRQy9ERDdULGVBQW9DOFQsR0FDekMsSUFDRSxhQUFhQSxHQUNmLENBQUUsTUFBT25TLEdBQ1AsR0FBcUIsaUJBQVZBLEdBQXNCQSxHQUFTLFNBQVVBLEdBQXdCLFdBQWZBLEVBQU1HLEtBQ2pFLE9BRUYsTUFBTUgsQ0FDUixDQUNGLENEc0RrQ29TLENBQWtCLElBQU0xSSxFQUFHeUcsU0FBU2tDLFNBQVNyQyxFQUFlLFNBQzVGLE1BQU8sQ0FBQ2tDLElBQXNCakMsRUFBYUQsRUFBZUMsRUFDNUQsQ0ExRHNEcUMsQ0FBYTFDLEVBQVN6RyxHQUMxRSxHQUFJNEcsRUFFRixPQURBblEsUUFBUUMsS0FBS2dRLEVBQU0wQyxNQUFNLGdCQUFnQnBKLEVBQUs1SyxpQkFDdkMsRUFHVCxJQUFLMEwsRUFBTTJGLEVBQVN6RyxHQUFPLE9BRXRCQSxFQUFLcUosY0FDRjlJLEVBQUd5RyxTQUFTc0MsVUFBVXpDLEVBQWVDLEVBQWEsUUFFMUQsT0FBTyxDQUNULENBbENVeUMsQ0FBY3ZKLEVBQ3RCLEdBbUNGLFNBQVNjLEVBQU0yRixFQUFrQnpHLEdBRS9CLEdBREF2SixRQUFRQyxLQUFLZ1EsRUFBTTBDLE1BQU0sUUFBUXBKLEVBQUs1SyxjQUNqQzRLLEVBQUtxSixPQUFRLENBQ2hCLE1BQU1HLEVBQU1sQyxFQUFjVyxVQUFVakksRUFBSzVLLFNBQVcsR0FBSSxDQUN0RHNNLElBQUsrRSxFQUFRdkcsUUFDYnFCLElBQUtrRixFQUFRbEYsSUFDYmtJLE9BQU8sRUFDUHZCLE1BQU8sWUFFVCxHQUFtQixJQUFmc0IsRUFBSXBTLE9BRU4sT0FEQW5CLFFBQVF5VCxTQUFXRixFQUFJcFMsUUFBVSxHQUMxQixDQUVYLENBQ0EsT0FBTyxDQUNULENBRUEsTUFBTXNRLEVBQXNCLElBQUk5SixJQUFJLENBQUMsS0FBTSxVQUFXLFdBNkJ0RCxNQUFNMEssRUFBa0IsQ0FBQyxPQUFRLFdBQzNCRyxFQUFnQixDQUNwQixNQUNBLE9BQ0EsT0FDQSxPQUNBLE1BQ0EsT0FDQSxPQUNBLE9BQ0EsUUFDQSxrQkFFQSxlQUNBLGFBRUlFLEdBQWtCLENBQUMsUUFBUyxTQUFVLGFBQWMsaUJBQWtCLGtCRXZINUUsTUFFYWdCLEdBR1QsQ0FDRnZVLFFBQVMsc0JBQ1QrUSxTQUFVLGtFQUNWeUQsUUFSNkIsQ0FBQSxFQVM3QixhQUFNckQsQ0FBUXZHLFNBS1Q5SyxpQkFHTCxHQUFJd0ssRUFBS3pKLFFBQVFzTCxJQUFJa0MsSUFFbkIsWUFEQWhOLFFBQVFDLEtBQUssZ0NBQWdDVCxRQUFRc0wsSUFBSWtDLE1BSTNELE1BQU1vRyxFQUFVNVQsUUFBUXNMLElBQUl1SSxLQUN0QkMsRUFBT3BMLE9BQU9rTCxLQUNmbEwsT0FBT3FMLFVBQVVELElBQVNBLEdBQVEsS0FDckN0VCxRQUFRSSxNQUFNNlAsRUFBTUMsSUFBSSx5Q0FBeUNrRCxNQUNqRTVULFFBQVFnVSxLQUFLLElBR2Z4VCxRQUFRQyxLQUFLLHFCQUFxQnFULEtBQ2xDLFVBQ1FHLEVBQWdCSCxFQUN4QixDQUFFLE1BQ0EsQ0FFSixDQXpCVUksRUFDUixHQ1ZGLE1BQU1DLEdBQVMsSUFBSXhNLElBZW5CMUksZUFBZW1WLEdBQThCTixHQUMzQyxVQUNRRyxFQUFnQkgsRUFDeEIsQ0FBRSxNQUNBLENBRUosQ0FVQTdVLGVBQWVvVixHQUF1QkMsRUFBc0I5RCxHQUMxRCxJQUNFLE1BQU0rRCxRQVlWdFYsZUFBc0NxVixFQUFzQjlELEdBQzFELE1BQU05USxPQUFFQSxTQUFpQlIsRUFBVyxTQUFVLENBQUMsS0FBTSxRQUFTb1YsR0FBYSxDQUN6RTdJLElBQUsrRSxFQUFRdkcsUUFDYnFCLElBQUtrRixFQUFRbEYsTUFFZixPQUFPNUwsRUFDSnlTLE1BQU0sT0FDTjlKLElBQUttTSxHQUFPQSxFQUFHakQsUUFDZmxGLE9BQU9vSSxRQUNaLENBckIrQkMsQ0FBdUJKLEVBQVk5RCxHQUM5RCxHQUE0QixJQUF4QitELEVBQWF6UixPQUFjLGFBRXpCNUQsRUFBVyxTQUFVLENBQUMsS0FBTSxRQUFTcVYsR0FBZSxDQUN4RDlJLElBQUsrRSxFQUFRdkcsUUFDYnFCLElBQUtrRixFQUFRbEYsS0FFakIsQ0FBRSxNQUNBLENBRUosQ0NqRE8sTUFBTXFKLEdBQWMsSUFBSUMsRUNtQnpCQyxHQUEwQixDQUM5QkMsY0FBYyxHQUdUN1YsZUFBZThWLEdBQ3BCQyxFQUNBeEUsRUFDQXpHLEVBQ0FrTCxFQUFnQkosSUFFaEIsTUFBT0ssRUFBaUJDLEdBQWtCQyxHQUFnQkosRUFBUXhFLEdBS2xFLEdBSkE2RSxHQUFXSCxFQUFpQjFFLEdBQ3hCekcsRUFBS3hKLFNBQ1A4VSxHQUFXRixFQUFnQjNFLEVBQVMsZUFBZSxHQUVqRHpHLEVBQUtxSixPQUVQLE9BREFrQyxHQUE2QkosRUFBaUIsRUFBR0QsR0FDMUMsRUFHVCxNQUFNbkIsRUFBTywrQkFBK0J5QixLQUFLSixLQUFrQixHQUMvREEsRUFBZXJLLFNBQVMsWUFBY2dKLElBQ3BDcUIsRUFBZXJLLFNBQVMsc0JGUnpCN0wsZUFBeUM2VSxFQUFjdEQsU0FDdEQ2RCxHQUF1QixDQUFDLFdBQVksV0FBV1AsS0FBU3RELEVBQ2hFLENFT1lnRixDQUEwQjlNLE9BQU9vTCxHQUFPdEQsU0ZiN0N2UixlQUE4Q3dXLEVBQW1CakYsU0FDaEU2RCxHQUF1QixDQUFDLFdBQVksUUFBUW9CLEtBQWNqRixFQUNsRSxDRVlZa0YsQ0FBK0JsRixFQUFRcEYsZ0JBQWlCb0YsVUZuQzdEdlIsZUFBbUQ2VSxTQUNsRE0sR0FBOEJOLEdBQ3BDLE1BQU02QixFQUFXMVcsVUFDWGtWLEdBQU96QyxJQUFJb0MsS0FFZkssR0FBT3RNLElBQUlpTSxTQUNMTSxHQUE4Qk4sS0FFdEMsSUFBSyxNQUFNOVMsSUFBVSxDQUFDLGFBQWMsU0FBVSxVQUFXLFdBQ3ZEaEIsUUFBUUgsR0FBR21CLEVBQVEyVSxFQUV2QixDRTBCVUMsQ0FBb0NsTixPQUFPb0wsS0FFbkQsTUFBTVAsUUFBWXJVLEVBQVdpVyxPQUFnQmxVLEVBQVcsQ0FDdER3SyxJQUFLK0UsRUFBUXZHLFFBQ2JxQixJQUFLdUssR0FBYXJGLEVBQVFsRixJQUFLMkosR0FDL0J6QixPQUFPLEVBQ1B2QixNQUFPLFVBQ1A2RCxRQUFTYixFQUFLYSxRQUNkblYsWUFBWSxFQUNaSixRQUFTd0osRUFBS3hKLFVBR2hCLE9BREErVSxHQUE2QkosRUFBaUIzQixFQUFJcFMsT0FBUThULEdBQ25EMUIsRUFBSXBTLFFBQVUsQ0FDdkIsQ0FFTyxTQUFTNFUsR0FDZGYsRUFDQXhFLEVBQ0F6RyxFQUNBa0wsRUFBZ0JKLElBRWhCLE9BQU9GLEdBQVlxQix5QkFBeUIvVyxVQUMxQyxNQUFPaVcsRUFBaUJDLEdBQWtCQyxHQUFnQkosRUFBUXhFLEdBRWxFLEdBREE2RSxHQUFXSCxFQUFpQjFFLEVBQVMsb0JBQW9CLEdBQ3JEekcsRUFBS3FKLE9BTVAsT0FMQWlDLEdBQVdILEVBQWlCMUUsRUFBUyxpQkFDakN6RyxFQUFLeEosU0FDUDhVLEdBQVdGLEVBQWdCM0UsRUFBUyxpQkFBaUIsR0FFdkQ4RSxHQUE2QkosRUFBaUIsRUFBR0QsR0FDMUMsRUFHVCxNQUFNMUIsUUFBWXJVLEVBQVdpVyxPQUFnQmxVLEVBQVcsQ0FDdER3SyxJQUFLK0UsRUFBUXZHLFFBQ2JxQixJQUFLdUssR0FBYXJGLEVBQVFsRixJQUFLMkosR0FDL0J6QixPQUFPLEVBQ1B2QixNQUFPLE9BQ1A2RCxRQUFTYixFQUFLYSxRQUNkNVYsa0JBQWtCLEVBQ2xCUyxZQUFZLEVBQ1pKLFFBQVN3SixFQUFLeEosVUFFaEI4VSxHQUFXSCxFQUFpQjFFLEVBQVMsaUJBQ2pDekcsRUFBS3hKLFNBQ1A4VSxHQUFXRixFQUFnQjNFLEVBQVMsaUJBQWlCLEdBRXZELE1BQU15RixFQUFNMUMsRUFBSTdULE9BQU82UixPQU12QixPQUxJMEUsSUFDRmpXLFFBQVFOLE9BQU9PLE1BQU1nVyxHQUNyQmpXLFFBQVFOLE9BQU9PLE1BQU0sT0FFdkJxVixHQUE2QkosRUFBaUIzQixFQUFJcFMsT0FBUThULEdBQ25EMUIsRUFBSXBTLFFBQVUsR0FFekIsQ0FLQSxTQUFTaVUsR0FBZ0JKLEVBQWdCeEUsR0FDdkMsSUFBSTBGLEVBQVlsQixFQUNiM0osV0FBVyxLQUFNLElBQ2pCQSxXQUFXLFNBQVUsS0FDckJBLFdBQVcsVUFBV21GLEVBQVE3RixZQUFZdUMsY0FBY2lKLE1BQVEscUJBQXVCLGdCQUN2RjlLLFdBQVcsT0FBUW1GLEVBQVFwRyxlQUFpQixpQkFBbUIsU0FFL0RpQixXQUFXLFlBQWFxRSxFQUFpQixpQkFBbUIsYUFDM0RBLElBQ0Z3RyxFQUFZQSxFQUNUN0ssV0FBVyxvQkFBcUIsaUJBQ2hDQSxXQUFXLDhCQUErQixpQkFFMUNBLFdBQVcsZ0JBQWlCLGdCQUM1QkEsV0FBVyx3QkFBeUIsWUFFcENBLFdBQVcsK0NBQWdELEtBRWhFNkssRUFBWUEsRUFBVTNFLE9BQ3RCLE1BQU0yRCxFQUFrQmtCLEdBQWNGLEVBQVU3SyxXQUFXLFFBQVMsR0FBRzJFLE9BQ2pFbUYsRUFBaUJpQixHQUNyQkYsRUFFRzdLLFdBQVcsbUJBQW9CLEdBQUcyRSxpQkFDbEMzRSxXQUFXLFNBQVVxRSxHQUFrQmMsRUFBUTVDLFVBQVksR0FBSyxHQUFHb0MsT0FJeEUsTUFBTyxDQUFDLFNBRGNRLEVBQVFsRixJQUFJVyxPQUFTLGtCQUFrQnVFLEVBQVFsRixJQUFJVyxRQUFVLGdCQUFrQixNQUNuRWlKLElBQW1CQyxFQUN2RCxDQUVPLFNBQVNFLEdBQVdnQixFQUEwQjdGLEVBQWtCOEYsRUFBUyxRQUFTQyxHQUFPLEdBQzlGL1YsUUFBUUMsS0FDTixNQUNHOFYsRUFBTzlGLEVBQU0rRixLQUFPL0YsRUFBTWdHLE1BQU1oRyxFQUFNaUcsS0FBSyxHQUFHSixNQUFZRCxHQUMzRDVGLEVBQU0rRixLQUFLLE9BQU9oRyxFQUFRdkcsV0FFaEMsQ0FFTyxTQUFTcUwsR0FDZE4sRUFDQXZCLEVBQ0F3QixHQUVpQixJQUFieEIsRUFDRmpULFFBQVFDLEtBQUtnUSxFQUFNMEMsTUFBTTFDLEVBQU1pRyxLQUFLLGFBQWMxQixLQUVsRHhVLFFBQVFDLEtBQUtnUSxFQUFNQyxJQUFJRCxFQUFNaUcsS0FBSyxxQkFBcUJqRCxRQUFnQnVCLEtBQzdDLElBQXRCQyxFQUFLSCxjQUNQOVUsUUFBUWdVLEtBQUtQLEdBQVksR0FHL0IsQ0FFQSxTQUFTb0MsR0FBYXZLLEVBQXlDMkosR0FDN0QsTUFBTTBCLEVBQVMsSUFBS3JMLEdBT3BCLE9BTkkySixFQUFLMkIsS0FDUEQsRUFBT25KLEdBQUssS0FFVnlILEVBQUs0QixhQUNQRixFQUFPRyxZQUFjLEtBRWhCSCxDQUNULENBRUEsU0FBU1AsR0FBY2pYLEdBRXJCLE9BQU9BLEVBQVEyTCxTQUFTLGFBRXRCM0wsRUFBUTJMLFNBQVMsZUFFakIzTCxFQUFRMkwsU0FBUyxXQUNqQjNMLEVBQVEyTCxTQUFTLHVCQUNmM0wsRUFBUWtNLFdBQVcsWUFBYSxPQUNoQ2xNLENBQ04sQ0M1S0EsTUFrQk00WCxHQUFrQixJQUFJcFAsSUFBSSxDQUFDLE1BQU8sTUFBTyxLQUFNLE9BQVEsUUFBUyxNQUFPLE1BQU8sTUFBTyxLQUFNLFFBQzNGcVAsR0FBcUIsSUFBSXJQLElBQUksQ0FDakMsTUFDQSxNQUNBLE1BQ0EsT0FDQSxLQUNBLE9BQ0EsUUFDQSxNQUNBLEtBQ0EsTUFDQSxNQUNBLE9BQ0EsS0FDQSxNQUNBLE1BQ0EsT0FDQSxRQUVJc1AsR0FBeUIsSUFBSXRQLElBQUksSUFBSXFQLElBQW9CM0ssT0FBUTZLLElBQVNILEdBQWdCckYsSUFBSXdGLEtBRXZGQyxHQUdULENBQ0ZoWSxRQUFTLGtCQUNUK1EsU0FBVSwyQkE3Q0ksQ0FDZGtILElBQUssQ0FDSGpILFlBQWEseUJBQ2JDLEtBQU0sV0FFUmlILE9BQVEsQ0FDTmxILFlBQWEsa0JBQ2JDLEtBQU0sWUF3Q1IsYUFBTUUsQ0FBUXZHLEdBQ1AyRixJQUNIbFAsUUFBUUksTUFBTTZQLEVBQU1DLElBQUksMkNBQ3hCMVEsUUFBUWdVLEtBQUssSUFHZixNQUFNaEYsUUFBaUJYLEVBQXVCdEUsR0FBTSxHQUMvQ2lGLElBQ0h4TyxRQUFRSSxNQUFNNlAsRUFBTUMsSUFBSSxzQkFDeEIxUSxRQUFRZ1UsS0FBSyxJQUdmLE1BQU1zRCxFQUFRdk4sRUFBS3VOLE9BQVMsR0FDNUIsSUFBSUMsRUFDQUMsRUFDQUMsRUFDSixHQUFJSCxFQUFNeFUsT0FBUyxFQUFHLENBQ3BCLE1BQU00VSxFQUF3QyxHQUN4Q0MsRUFBNkMsR0FDN0NDLEVBQWlDLEdBQ3ZDLElBQUssTUFBTUMsS0FBUVAsRUFBTyxDQUN4QixNQUFNOVksRUFBV0ssRUFBS0MsUUFBUWdaLE9BQU9ELElBQ3JDLEdBQ0VyWixFQUFTa1EsU0FBUyxtQkFDbEJsUSxFQUFTc00sU0FBUyxvQkFDbEJ0TSxFQUFTa1EsU0FBUyxtQkFDbEJsUSxFQUFTc00sU0FBUyxtQkFFbEIsU0FHRixNQUFNaU4sRUFBWWxaLEVBQUttWixRQUFReFosR0FBVXlLLE1BQU0sR0FDM0N6SyxFQUFTa1EsU0FBUyxpQkFDcEJrSixFQUFxQjNRLEtBQUt6SSxHQUNqQnVZLEdBQWdCckYsSUFBSXFHLEdBQzdCTCxFQUE0QnpRLEtBQUt6SSxHQUN4QndZLEdBQW1CdEYsSUFBSXFHLElBQ2hDSixFQUFpQzFRLEtBQUt6SSxFQUUxQyxDQUNBK1ksRUFBZ0JHLEVBQTRCclAsSUFBS3BGLEdBQU0sSUFBSUEsTUFBTXVILEtBQUssS0FDdEVnTixFQUFtQkcsRUFBaUN0UCxJQUFLcEYsR0FBTSxJQUFJQSxNQUFNdUgsS0FBSyxLQUM5RWlOLEVBQTBCRyxFQUFxQnZQLElBQUtwRixHQUFNLElBQUlBLE1BQU11SCxLQUFLLElBQzNFLE1BQ0UrTSxFQUFnQixHQUNoQkMsRUFBbUIsZ0JBQWdCLElBQUlQLElBQXdCek0sS0FBSyxvQ0FDcEVpTixFQUEwQnpJLEVBQVNGLFlBQVl6RyxJQUFLdkUsR0FBTSxJQUFJQSxFQUFFa0osb0JBQW9CeEMsS0FBSyxLQUczRixNQUFNeU4sRUFDSmxPLEVBQUtxTixLQUFPck4sRUFBS3NOLE9BQVMsY0FBZ0J0TixFQUFLcU4sSUFBTSxhQUFlck4sRUFBS3NOLE9BQVMsZUFBaUIsT0FDckcsSUFBSWEsR0FDQVgsR0FBa0MsSUFBakJELEVBQU14VSxVQUN6Qm9WLEVBQWVuQyxHQUNiLG1CQUFtQmtDLHlFQUFvRlYsSUFDdkd2SSxFQUFTSixLQUNUN0UsRUFDQSxDQUFFOE0sWUFBWSxLQUdkOU0sRUFBS3NOLFNBQ0hHLEdBQ0d6QixHQUNILDhFQUE4RXlCLElBQzlFeEksRUFBU0osS0FDVDdFLEVBQ0EsQ0FBRThNLFlBQVksSUFHZFksVUFDSVMsRUFDRG5DLEdBQXVCLCtCQUErQjBCLElBQTJCekksRUFBU0osS0FBTTdFLEVBQU0sQ0FDekc4TSxZQUFZLEtBSXBCLEdDbklLLFNBQVVzQixHQUF5QkMsRUFBcUJwSixHQUM3RCxJQUFLLE1BQU13QixLQUFXeEIsRUFDcEJ4TyxRQUFRQyxLQUFLLFlBQVkyWCxVQUFvQjVILEVBQVExSixrQkFFL0MwSixDQUVWLENDS0EsTUFRYTZILEdBQTZGLENBQ3hHbFosUUFBUyx5QkFDVCtRLFNBQVUsOERBVkksQ0FDZG9JLFFBQVMsQ0FDUG5JLFlBQWEseUVBQ2JDLEtBQU0sVUFDTkMsTUFBTyxNQVFULGFBQU1DLENBQVF2RyxHQUNaLE1BQU1pRixRQUFpQlgsRUFBdUJ0RSxHQUN6Q2lGLElBQ0h4TyxRQUFRSSxNQUFNNlAsRUFBTUMsSUFBSSxzQkFDeEIxUSxRQUFRZ1UsS0FBSyxJQUdmLElBQUssTUFBTXhELEtBQVcySCxHQUF5Qix5QkFBMEJuSixFQUFTRixhQUFjLENBQzlGLE1BQU1uRSxFQUEyQjZGLEVBQVE3RixZQUNuQ2tDLEVBQU8sQ0FBQyxlQUFnQixtQkFDOUIsSUFBSyxNQUFNSixLQUFPSSxFQUFNLENBQ3RCLE1BQU0wTCxFQUFPNU4sRUFBWThCLElBQVEsQ0FBQSxFQUNqQyxJQUFLLE1BQU8zRixFQUFNNEYsS0FBVXhELE9BQU90SCxRQUFRMlcsR0FDckM3TCxHQUFPOEwsV0FBVyxxQkFDcEJELEVBQUt6UixHQUFRLEtBQUtBLElBR3hCLENBUUEsR0FOQTJSLEdBQXdCMU8sRUFBTVksR0FFOUIrTixHQUFnQi9OLEdBRWhCZ08sR0FBa0JoTyxHQUVkWixFQUFLcUosT0FBUSxTQUVqQixNQUFNd0YsRUFBYzdPLEVBQUt1TyxRQUFVelosRUFBSzJMLEtBQUtnRyxFQUFRdkcsUUFBUyxRQUFVdUcsRUFBUXZHLGNBQzFFSyxFQUFHeUcsU0FBU0MsTUFBTTRILEVBQWEsQ0FBRTNILFdBQVcsVUFDNUMzRyxFQUFHeUcsU0FBU3NDLFVBQVV4VSxFQUFLMkwsS0FBS29PLEVBQWEsZ0JBQWlCcFEsS0FBS0MsVUFBVWtDLEdBQWMsT0FDbkcsQ0FDS1osRUFBS3FKLFFBQVdySixFQUFLdU8sVUFDeEJqSCxFQUFjVyxVQUFVakMsRUFBZ0IsQ0FBQyxXQUFZLENBQ25Ea0MsTUFBTyxZQUVUelIsUUFBUUMsS0FBSywyQkFFakIsR0FHRixTQUFTZ1ksR0FBd0IxTyxFQUEyQ1ksR0FDMUUsSUFBS1osRUFBS3VPLFFBR1IsY0FGTzNOLEVBQVl5QyxxQkFDbkI1TSxRQUFRQyxLQUFLLGdDQUlmLE1BQU1vWSxFQUFVbE8sRUFBWXlDLGlCQUFtQixDQUFBLEVBQ3pDMEwsRUFBdUIsQ0FDM0IsWUFDQSxRQUNBLGVBQ0EsNkNBQ0EsU0FDQSxRQUNBLFdBQ0EsT0FDQSxZQUNBLGNBQ0EsV0FDQSxhQUNBLFdBQ0EsUUFDQSxVQUNBLG1CQUNBLG9CQUNBLFVBQ0EsVUFFSUMsRUFBd0IsR0FDOUIsSUFBSyxNQUFNalMsS0FBUW9DLE9BQU8yRCxLQUFLZ00sSUFFM0JDLEVBQXFCeEcsS0FBTTBHLEdBQVNsUyxFQUFLZ0UsU0FBU2tPLEtBQ2pEbFMsRUFBS2dFLFNBQVMsZ0JBQWtCaEUsRUFBS2dFLFNBQVMsb0JBR3hDK04sRUFBUS9SLEdBQ2ZpUyxFQUFZOVIsS0FBS0gsSUFHckJ0RyxRQUFRQyxLQUFLLDJCQUE0QnNZLEVBQVl2TyxLQUFLLE9BQVMsT0FDckUsQ0FFQSxTQUFTa08sR0FBZ0IvTixHQUN2QixNQUFNc08sRUFBZ0MsQ0FBQyxRQUFTLFNBQVUsU0FBVSxPQUFRLFFBQVMsUUFDL0VDLEVBQW1DLENBQUMsU0FBVSxVQUM5Q3RPLEVBQVdELEVBQVlDLFNBQVcsQ0FBQSxFQUNsQ3VPLEVBQTJCLEdBQ2pDLElBQUssTUFBT3JTLEVBQU1zUyxLQUFZbFEsT0FBT3RILFFBQVFnSixJQUV6Q3FPLEVBQThCM0csS0FBTTBHLEdBQVNsUyxFQUFLMFIsV0FBV1EsS0FFN0RFLEVBQWlDNUcsS0FBTTBHLEdBQVNJLEVBQVF0TyxTQUFTa08sSUFBU0ksRUFBUTdILFNBQVd5SCxFQUFLekgsa0JBRzNGM0csRUFBUTlELEdBQ2ZxUyxFQUFlbFMsS0FBS0gsSUFHeEJ0RyxRQUFRQyxLQUFLLG1CQUFvQjBZLEVBQWUzTyxLQUFLLE9BQVMsT0FDaEUsQ0FFQSxTQUFTbU8sR0FBa0JoTyxVQUNsQkEsRUFBWTBPLGVBQ1oxTyxFQUFZMk8scUJBQ1ozTyxFQUFZNE8sUUFDckIsQ0N4Q08sTUFBTUMsR0FBZ0IsSUFoRjdCLE1BQ0VDLE1BQUFBLENBQU96VCxFQUFZMFQsRUFBb0IsSUFDckMsTUFBTyx5QkFBd0JBLEVBQW9CLElBQUlBLElBQXNCLEdBQy9FLENBRUFDLFdBQUFBLENBQVluSixFQUFrQm9KLEdBQzVCLE1BQU1DLEVBQVVySixFQUFRN0YsWUFBWXVDLGNBQWNpSixNQUFRLEtBQU8sU0FFakUsTUFBTyxVQUFVMEQsaUVBQXVFQSx5REFDM0RBLHdCQUE4QkQsZ0JBQXlCQyxvRUFDdEYsQ0FFQUMsVUFBQUEsQ0FBVzlULEdBQ1QsTUFBTyxHQUFHOEosOE1BS1osQ0FFQWlLLE9BQUFBLENBQVF2SixFQUFrQmtKLEVBQW9CLElBQzVDLE1BQU8sd0JBQXdCQSxFQUFvQixJQUFJQSxJQUFzQiw0QkFBNEJyWCxLQUFLMlgsS0FBS3hKLElBQ3JILENBRUF5SixVQUFBQSxDQUFXalUsRUFBWTBULEVBQW9CLElBQ3pDLE1BQU8sc0JBQXFCQSxFQUFvQixJQUFJQSxJQUFzQixHQUM1RSxDQUVBM1gsS0FBQUEsQ0FBTXlPLEVBQWtCa0osRUFBb0IsSUFHMUMsTUFBTywyQ0FBMkNBLEVBQW9CLElBQUlBLElBQXNCLFNBQVNyWCxLQUFLMlgsS0FBS3hKLElBQ3JILENBRUEwSixPQUFBQSxDQUFRMUosRUFBa0JvSixFQUFvQk8sR0FFNUMsTUFBTyxVQURTM0osRUFBUTdGLFlBQVl1QyxjQUFjaUosTUFBUSxLQUFPLG1HQUNrRGdFLEtBQWNQLEdBQ25JLENBRUFJLElBQUFBLENBQUt4SixFQUFrQjRKLEdBQ3JCLE9BQUk1SixFQUFRN0YsWUFBWXVDLGNBQWNpSixNQUFjLHNCQUFxQmlFLEVBQWEsT0FBT0EsSUFBZSxJQUN4R0EsRUFBbUIsb0JBQW9CQSxJQUN0QzVKLEVBQVE3RixZQUFZd0MsUUFBK0M2TSxLQUFhLHNCQUM5RSx3RUFDVCxDQUVBSyxNQUFBQSxDQUFPN0osRUFBa0I4SixFQUFzQlosRUFBb0IsSUFDakUsTUFBTWEsRUFBYyxRQUNwQixJQUFJakUsRUFBUyxHQUViLEdBQUlnRSxFQUNGLElBQ0UsSUFBSW5TLElBQUltUyxHQUNSaEUsRUFBUyxnQkFBZ0JnRSxJQUMzQixDQUFFLE1BRUFoRSxFQUFTLGdCQUFnQmlFLElBREoxYixFQUFLQyxRQUFRd2IsS0FFcEMsTUFDSyxHQUFJOUosRUFBUWxGLElBQUlrUCxjQUFjaEMsV0FBVytCLEdBQWMsQ0FDNUQsTUFBTUUsRUFBaUIsQ0FDckIsQ0FBRUMsV0FBWTdiLEVBQUsyTCxLQUFLLFNBQVUsaUJBQWtCbVEsT0FBUSxVQUM1RCxDQUFFRCxXQUFZN2IsRUFBSzJMLEtBQUssU0FBVSxVQUFXbVEsT0FBUTliLEVBQUsyTCxLQUFLLFNBQVUsV0FDekUsQ0FBRWtRLFdBQVk3YixFQUFLMkwsS0FBSyxLQUFNLGlCQUFrQm1RLE9BQVEsT0FFMUQsSUFBSyxNQUFNQSxPQUFFQSxFQUFNRCxXQUFFQSxLQUFnQkQsRUFDbkMsR0FBSW5RLEVBQUdTLFdBQVdsTSxFQUFLQyxRQUFRMFIsRUFBUXZHLFFBQVN5USxJQUFjLENBTTVEcEUsRUFBUyxnQkFBZ0JpRSxJQUxKMWIsRUFBS0MsUUFDeEIwUixFQUFRdkcsUUFDUjBRLEVBQ0FuSyxFQUFRbEYsSUFBSWtQLGFBQWF2UixNQUFNc1IsT0FHakMsS0FDRixDQUVKLENBQ0EsTUFBTyxHQUFHakUsaUJBQXNCb0QsRUFBb0IsSUFBSUEsSUFBc0IsSUFDaEYsR0N0RldrQixHQUF1QixDcEJLbEN0UCxJQUFLLENBQ0g2RSxZQUFhLDJCQUNiQyxLQUFNLFNBRVIsY0FBZSxDQUNiRCxZQUNFLHdMQUNGQyxLQUFNLFVBRVIsbUJBQW9CLENBQ2xCRCxZQUFhLDBGQUNiQyxLQUFNLFdBRVIsbUJBQW9CLENBQ2xCRCxZQUFhLGlFQUNiQyxLQUFNLFVBQ055SyxTQUFTLEdBRVgsbUJBQW9CLENBQ2xCMUssWUFBYSxxR0FDYkMsS0FBTSxVQUNOeUssU0FBUyxHQUVYLFlBQWEsQ0FDWDFLLFlBQWEscUZBQ2JDLEtBQU0sU0FDTnlLLFFBQVMsZ0JBRVh0YSxRQUFTLENBQ1A0UCxZQUFhLHNDQUNiQyxLQUFNLFVBQ05DLE1BQU8sS29CakNULGNBQWUsQ0FDYkYsWUFBYSxzQkFDYkMsS0FBTSxTQUNOQyxNQUFPLEtBRVQsVUFBVyxDQUNURixZQUFhLDJDQUNiQyxLQUFNLFVBQ05DLE1BQU8sQ0FBQyxNQUFPLE9DRGJzRCxHQUFVLENBQUEsRUFFSG1ILEdBQStCLENBQzFDM2IsUUFBUyxTQUNUK1EsU0FBVSxzQkFDVnlELFFBQVVvSCxHQUNEQSxFQUNKNWIsUUFBUTZiLElBQ1I3YixRQUFROGIsSUFDUjliLFFBQVErYixJQUNSL2IsUUFBUWdjLElBQ1JoYyxRQUFRaWMsSUFDUmpjLFFBQVFrYyxJQUNSbGMsUUFBUW1jLElBQ1JuYyxRQUFRb2MsSUFDUnBjLFFBQVFxYyxJQUNScmMsUUFBUXNjLElBQ1JDLGdCQUNBQyxRQUFPLEdBRVpyTCxPQUFBQSxHQUNFLEdBSUUwSyxHQUE2RSxDQUNqRjdiLFFBQVMsU0FDVCtRLFNBQVUsd0RBQ1Z5RCxHQUNBLGFBQU1yRCxDQUFRdkcsR0FDWixNQUFNNlIsUUFBb0JDLEdBQW1COVIsR0FDdkMrUixFQUFpQkMsR0FBc0JoUyxHQUM3QyxJQUFLLE1BQU15RyxLQUFXMkgsR0FBeUIsZ0JBQWlCeUQsU0FDeEQ3RyxHQUFheUUsR0FBY0MsT0FBT2pKLEVBQVNzTCxHQUFpQnRMLEVBQVN6RyxFQUUvRSxHQUdJaVMsR0FBcUIsSUFDdEJySSxHQUNILGNBQWUsQ0FDYnhELFlBQWEsMkNBQ2I4TCxjQUFjLEVBQ2Q3TCxLQUFNLFNBQ05DLE1BQU8sTUFJTDRLLEdBQTZGLENBQ2pHOWIsUUFBUyw2QkFDVCtRLFNBQVUsdUZBQ1Z5RCxRQUFTcUksR0FDVCxhQUFNMUwsQ0FBUXZHLEdBQ1osTUFBTTZSLFFBQW9CQyxHQUFtQjlSLEdBQzdDLElBQUssTUFBTXlHLEtBQVcySCxHQUF5QixzQkFBdUJ5RCxTQUM5RDdHLEdBQWF5RSxHQUFjRyxZQUFZbkosRUFBU3pHLEVBQUs2UCxZQUFhcEosRUFBU3pHLEVBRXJGLEdBR0ltUixHQUFpRixDQUNyRi9iLFFBQVMsYUFDVCtRLFNBQVUsa0NBQ1Z5RCxHQUNBLGFBQU1yRCxDQUFRdkcsR0FDWixNQUFNNlIsUUFBb0JDLEdBQW1COVIsR0FDN0MsSUFBSyxNQUFNeUcsS0FBVzJILEdBQXlCLG9CQUFxQnlELFNBQzVEN0csR0FBYXlFLEdBQWNNLFdBQVd0SixHQUFVQSxFQUFTekcsRUFFbkUsR0FHSW9SLEdBQThFLENBQ2xGaGMsUUFBUyxVQUNUK1EsU0FBVSxxREFDVnlELEdBQ0EsYUFBTXJELENBQVF2RyxHQUNaLE1BQU02UixRQUFvQkMsR0FBbUI5UixHQUN2QytSLEVBQWlCQyxHQUFzQmhTLEdBQzdDLElBQUssTUFBTXlHLEtBQVcySCxHQUF5QixpQkFBa0J5RCxTQUN6RDdHLEdBQWF5RSxHQUFjTyxRQUFRdkosRUFBU3NMLEdBQWlCdEwsRUFBU3pHLEVBRWhGLEdBR0lxUixHQUFpRixDQUNyRmpjLFFBQVMsY0FDVCtRLFNBQVUsa0NBQ1Z5RCxHQUNBLGFBQU1yRCxDQUFRdkcsR0FDWixNQUFNNlIsUUFBb0JDLEdBQW1COVIsR0FDdkMrUixFQUFpQkMsR0FBc0JoUyxHQUM3QyxJQUFLLE1BQU15RyxLQUFXMkgsR0FBeUIscUJBQXNCeUQsU0FDN0Q3RyxHQUFheUUsR0FBY1MsV0FBV3pKLEVBQVNzTCxHQUFpQnRMLEVBQVN6RyxFQUVuRixHQUdJc1IsR0FBNEUsQ0FDaEZsYyxRQUFTLFFBQ1QrUSxTQUFVLG1CQUNWeUQsR0FDQSxhQUFNckQsQ0FBUXZHLEdBQ1osTUFBTTZSLFFBQW9CQyxHQUFtQjlSLEdBQ3ZDK1IsRUFBaUJDLEdBQXNCaFMsR0FDN0MsSUFBSyxNQUFNeUcsS0FBVzJILEdBQXlCLGVBQWdCeUQsU0FDdkQ3RyxHQUFheUUsR0FBY3pYLE1BQU15TyxFQUFTc0wsR0FBaUJ0TCxFQUFTekcsRUFFOUUsR0FXSXVSLEdBQXFGLENBQ3pGbmMsUUFBUyx3QkFDVCtRLFNBQVUsc0NBQ1Z5RCxRQVhxQixJQUNsQnFJLEdBQ0hFLE9BQVEsQ0FDTi9MLFlBQWEsb0ZBQ2JDLEtBQU0sV0FRUixhQUFNRSxDQUFRdkcsR0FDWixNQUFNNlIsUUFBb0JDLEdBQW1COVIsR0FDN0MsSUFBSyxNQUFNeUcsS0FBVzJILEdBQXlCLGlCQUFrQnlELEdBQWMsQ0FDN0UsTUFBTU0sRUFDSm5TLEVBQUttUyxTQUFXMUwsRUFBUTdGLFlBQVl1QyxjQUFjaUosTUFBUSxzQkFBd0IsaUNBQzlFcEIsR0FBYXlFLEdBQWNVLFFBQVExSixFQUFTekcsRUFBSzZQLFdBQVlzQyxHQUFTMUwsRUFBU3pHLEVBQ3ZGLENBQ0YsR0FZSXdSLEdBQStFLENBQ25GcGMsUUFBUyxPQUNUK1EsU0FBVSw2QkFDVnlELFFBWmtCLElBQ2ZBLEdBQ0hrRSxLQUFNLENBQ0p4SCxNQUFPLElBQ1BGLFlBQWEsMkJBQ2JDLEtBQU0sV0FRUixhQUFNRSxDQUFRdkcsR0FDWixNQUFNNlIsUUFBb0JDLEdBQW1COVIsR0FDN0MsSUFBSyxNQUFNeUcsS0FBVzJILEdBQXlCLGNBQWV5RCxTQUN0RDdHLEdBQWF5RSxHQUFjUSxLQUFLeEosRUFBU3pHLEVBQUs4TixNQUFPckgsRUFBU3pHLEVBRXhFLEdBZUl5UixHQUFtRixDQUN2RnJjLFFBQVMsMEJBQ1QrUSxTQUFVLHFCQUNWeUQsUUFmb0IsSUFDakJBLEdBQ0gsaUJBQWtCLENBQ2hCeEQsWUFBYSw4QkFDYkMsS0FBTSxVQUVSK0wsU0FBVSxDQUNSaE0sWUFBYSxnRkFDYkMsS0FBTSxZQVFSLGFBQU1FLENBQVF2RyxHQUNaLEdBQUlBLEVBQUtvUyxVQUFZcFMsRUFBS3VRLFlBQ3hCLE1BQU0sSUFBSXBaLE1BQU0sNERBR2xCLE1BQU0wYSxRQUFvQkMsR0FBbUI5UixHQUN2QytSLEVBQWlCQyxHQUFzQmhTLEVBQU0sQ0FBQyxpQkFBa0IsYUFDdEUsSUFBSyxNQUFNeUcsS0FBVzJILEdBQXlCLGdCQUFpQnlELEdBQWMsQ0FDNUUsTUFBTXRCLEVBQWN2USxFQUFLb1MsU0FDckIzTCxFQUFRN0YsWUFBWXVDLGNBQWNpSixNQUNoQyxzQkFDQSwwQkFDRnBNLEVBQUt1USxhQUFhelIsaUJBQ2hCa00sR0FBYXlFLEdBQWNhLE9BQU83SixFQUFTOEosRUFBYXdCLEdBQWlCdEwsRUFBU3pHLEVBQzFGLENBQ0YsR0FLSTBSLEdBQTRGLENBQ2hHdGMsUUFBUyxjQUNUK1EsU0FBVSxpREFDVnlELFFBTDRCLENBQUV2VSxLQUFNLENBQUVnUixLQUFNLFVBTTVDLGFBQU1FLENBQVF2RyxHQUNaLE1BQU02UixRQUFvQkMsR0FBbUI5UixHQUd2Q3FTLEVBQWMsRUFGSnJTLEVBQUszSyxNQUFNb0wsS0FBSyxNQUFRLElBQUk2UixVQUNyQk4sR0FBc0JoUyxFQUFNLENBQUMsVUFDUHNDLE9BQU9vSSxTQUFTakssS0FBSyxLQUNsRSxJQUFLLE1BQU1nRyxLQUFXMkgsR0FBeUIsVUFBVWlFLElBQWVSLFNBQ2hFN0csR0FBYSxVQUFVcUgsSUFBZTVMLEVBQVN6RyxFQUV6RCxHQUdGOUssZUFBZTRjLEdBQW1COVIsR0FDaEMsTUFBTWlGLFFBQWlCWCxFQUF1QnRFLEdBQ3pDaUYsSUFDSHhPLFFBQVFJLE1BQU02UCxFQUFNQyxJQUFJLHNCQUN4QjFRLFFBQVFnVSxLQUFLLElBR2YsTUFBTXNJLEVBQVd0TixFQUFTRixZQUFZekMsT0FDbkNtRSxHQUFZQSxFQUFRN0YsWUFBWXVDLGNBQWNDLFFBQVVxRCxFQUFRN0YsWUFBWXlDLGlCQUFpQkQsUUFNaEcsT0FKd0IsSUFBcEJtUCxFQUFTeFosU0FDWHRDLFFBQVFJLE1BQU02UCxFQUFNQyxJQUFJLDZCQUN4QjFRLFFBQVFnVSxLQUFLLElBRVJzSSxDQUNULENBS08sU0FBU1AsR0FBc0JoUyxFQUErQndTLEVBQXlCLElBQzVGLE1BQU1ULEVBQTJCLEdBRzNCVSxFQUFtQnRULE9BQU8yRCxLQUFLK04sSUFDL0I2QixFQUFzQnZULE9BQU90QixPQUFPZ1QsSUFDdkN4TyxRQUFTc1EsR0FDSixVQUFXQSxFQUNONVQsTUFBTUMsUUFBUTJULEVBQU9yTSxPQUFTcU0sRUFBT3JNLE1BQVEsQ0FBQ3FNLEVBQU9yTSxPQUV2RCxJQUVSaEksSUFBSXlQLFFBRUQ2RSxFQUFrQixJQUFJaFYsSUFBSSxJQUMzQjRVLEtBQ0FDLEtBQ0FDLEVBRUgsSUFDQSxPQUdGLElBQUssTUFBT2hRLEVBQUtDLEtBQVV4RCxPQUFPdEgsUUFBUW1JLEdBQ3hDLElBQUs0UyxFQUFnQmpMLElBQUlqRixHQUFNLENBRzdCLE1BQU1tUSxFQUFlblEsRUFBSXBCLFdBQVcsU0FBV3dSLEdBQVUsSUFBSUEsRUFBTUMsaUJBQ25FLEdBQUlGLElBQWlCblEsUUFBOEJ4TCxJQUF2QjhJLEVBQUs2UyxHQUMvQixTQUlGLEdBQXFCLGtCQUFWbFEsR0FBdUJBLEVBQ2hDb1AsRUFBZTdVLEtBQUssS0FBS3dGLFVBR3RCLEdBQXFCLGlCQUFWQyxHQUF1QyxpQkFBVkEsRUFDM0NvUCxFQUFlN1UsS0FBSyxLQUFLd0YsSUFBT3FMLE9BQU9wTCxTQUdwQyxHQUFJNUQsTUFBTUMsUUFBUTJELEdBQ3JCLElBQUssTUFBTXFRLEtBQVFyUSxFQUNqQm9QLEVBQWU3VSxLQUFLLEtBQUt3RixJQUFPcUwsT0FBT2lGLEdBRzdDLENBR0YsT0FBT2pCLEVBQWV0UixLQUFLLElBQzdCLENDeFJBLE1Bb0Jhd1MsR0FHVCxDQUNGN2QsUUFBUyw0QkFDVCtRLFNBQVUsb0RBekJJLENBQ2QrTSxNQUFPLENBQ0w5TSxZQUFhLHdCQUNiQyxLQUFNLFNBQ05DLE1BQU8sSUFDUHdLLFFBQVMsSUFzQlgsYUFBTXZLLENBQVF2RyxHQUNaLE1BQU15RyxFQUFVcEMsRUFBZ0JyRSxHQUMzQnlHLElBQ0hoUSxRQUFRSSxNQUFNNlAsRUFBTUMsSUFBSSxzQkFDeEIxUSxRQUFRZ1UsS0FBSyxJQUdmLE1BQU1rSixFQUFhLENBQUNuVCxFQUFLNUssV0FBYTRLLEVBQUszSyxNQUFRLE1BQVEySyxFQUFLL0QsRUFBRWlELE1BQU0sSUFBSW9ELE9BQU9vSSxTQUNuRixJQUFJMEksRUFBYSxFQUNqQixJQUFLLElBQUkxYixFQUFJLEVBQUdBLEVBQUlzSSxFQUFLa1QsTUFBT3hiLElBUTlCLEdBUElBLEVBQUksR0FDTmpCLFFBQVFDLEtBQUssS0FBS2dRLEVBQU0yTSxPQUFPLElBQUkzYixlQUFleWIsRUFBVzFTLEtBQUssV0FHcEUyUyxRQUFtQnBJLEdBQWFtSSxFQUFXMVMsS0FBSyxLQUFNZ0csRUFBU3pHLEVBQU0sQ0FDbkUrSyxjQUFjLElBRUcsSUFBZnFJLEVBQWtCLE9BRXhCbmQsUUFBUWdVLEtBQUttSixFQUNmLEdDdENXRSxHQUE0RSxDQUN2RmxlLFFBQVMsUUFDVCtRLFNBQVUsaUVBSkksQ0FBQSxFQU1kLGFBQU1JLENBQVF2RyxTQU1UOUssZUFDTDhLLEVBQ0F3RyxHQUVBLE1BQU12QixRQUFpQlgsRUFBdUJ0RSxHQUFNLEVBQU93RyxHQUN0RHZCLElBQ0h4TyxRQUFRSSxNQUFNNlAsRUFBTUMsSUFBSSxzQkFDeEIxUSxRQUFRZ1UsS0FBSyxJQUdmLElBQUssTUFBTXhELEtBQVcySCxHQUF5QixRQUFTbkosRUFBU0YsYUFBYyxDQUM3RSxNQUFNd08sUUFBZ0JoVCxFQUFHaVQsUUFBUS9NLEVBQVF2RyxRQUFTLENBQUV1VCxlQUFlLElBQ25FLEdBQUloTixJQUFZeEIsRUFBU0wsS0FBTSxDQUM3QixHQUFzQixXQUFsQjhPLEVBQUdDLFdBQXlCLENBQzlCLE1BQU1DLEVBQVcsQ0FBQyxVQUNkbk4sRUFBUXRGLGVBQ1Z5UyxFQUFTMVcsS0FBSyxnQkFFVjhPLEdBQXVCLGdCQUFnQjRILEVBQVNuVCxLQUFLLE9BQVFnRyxFQUFTekcsRUFDOUUsQ0FFSXVULEVBQVFoTCxLQUFNOU8sR0FBTUEsRUFBRW9hLFVBQVlwYSxFQUFFc0QsS0FBS2dFLFNBQVMsb0JBQzlDaUssR0FBYSxlQUFnQnZFLEVBQVN6RyxFQUFNLENBQUUrSyxjQUFjLEdBRXRFLENBRUEsR0FBSXdJLEVBQVFoTCxLQUFNOU8sR0FBTUEsRUFBRW9hLFVBQXVCLG1CQUFYcGEsRUFBRXNELE1BQTRCLE9BQzVEaVAsR0FBdUIsNENBQTZDdkYsRUFBU3pHLEdBQ25GLE9BQVM4VCxHQUFXeE0sRUFBY0MsU0FBUyx1QkFBdUJ6SSxXQUFXMEksT0FBT1ksTUFBTSxhQUNwRjRELEdBQXVCLGtCQUFrQjhILElBQVdyTixFQUFTekcsU0FDN0Q0SyxHQUFZbUosbUJBQ1ovSSxHQUFhLHVDQUF3Q3ZFLEVBQVN6RyxTQUM5RGdMLEdBQWEsd0JBQXlCdkUsRUFBU3pHLEVBQ3ZELENBR0d5RyxJQUFZeEIsRUFBU0wsTUFBU0ssRUFBU0wsS0FBS2hFLFlBQVlDLFVBQVUsY0FDbkU0RixFQUFRN0YsWUFBWUMsVUFBVSxtQkFFeEJtSyxHQUFhLEdBQUcvRSxhQUFrQ1EsRUFBU3pHLEVBRXJFLENBRUEsTUFBTXlHLEVBQVV4QixFQUFTRixZQUFZWCxLQUFNckssR0FBTUEsRUFBRTZHLFlBQVl5QyxpQkFBaUIyUSxZQUM1RXZOLFNBQ0l1RSxHQUFhLEdBQUcvRSxtQ0FBd0RRLEVBQVN6RyxFQUUzRixDQXBEVWlVLENBQU1qVSxFQUNkLEdDWUssU0FBU2tVLEdBQVVsVSxHQUN4QixPQUFRQSxFQUE2Qm1VLE9BQVMsZUFBaUIsRUFDakUsQ0M1Qk9qZixlQUFla2YsR0FBa0JDLEVBQVksSUFBTUMsRUFBYyxLQUN0RSxJQUFLLElBQUl2SyxFQUFPc0ssRUFBV3RLLEVBQU9zSyxFQUFZQyxFQUFhdkssSUFDekQsU0FBVXdLLEdBQWdCeEssR0FDeEIsT0FBT0EsRUFHWCxNQUFNLElBQUk1UyxNQUFNLG9DQUFvQ2tkLEtBQWFBLEVBQVlDLEVBQWMsSUFDN0YsQ0FPQXBmLGVBQWVxZixHQUFnQnhLLEdBQzdCLE9BQU8sSUFBSXhVLFFBQVNSLElBQ2xCLE1BQU15ZixFQUFTQyxJQUVmRCxFQUFPRSxLQUFLLFFBQVVDLElBQ2hCQSxFQUFJM2QsS0FDTmpDLEdBQVEsS0FNWnlmLEVBQU9FLEtBQUssWUFBYSxLQUN2QkYsRUFBT0ksTUFBTSxLQUNYN2YsR0FBUSxPQUlaeWYsRUFBT0ssT0FBTzlLLEVBQU0sY0FFeEIsQ0NHTyxNQUFNK0ssR0FBZ0IsSUFwQzdCLE1BQ0VDLGFBQUFBLENBQWN0TyxFQUFrQnFOLEdBRTlCLE1BQU12SCxFQUFTOUYsRUFBUTlDLGtCQUFrQjlDLFVBQVUsd0JBQy9DLG9DQUNBLEdBQ0osTUFBTyxNQUFNL0wsRUFBSzhPLFFBQVE2QyxFQUFRdkYsU0FBUywwQkFDdENxTCxzRkFDaUM5RixFQUFRcEYsbUlBRXJCb0YsRUFBUWxGLElBQUlXLDBDQUNSNFIsS0FDL0IsQ0FFQWtCLFlBQUFBLENBQWF2TyxFQUFrQndPLEdBQVcsRUFBT3RGLEVBQW9CLEdBQUl1RixFQUFpQixJQUN4RixNQUFPLEdBQUc1YyxLQUFLNmMsS0FBSzFPLFNBQWV3TyxFQUFXLFlBQWMsS0FBSzNjLEtBQUtILE1BQ3BFc08sRUFDQWtKLEVBQ0F1RixJQUVKLENBRUEvYyxLQUFBQSxDQUFNc08sRUFBa0JrSixFQUFvQixHQUFJdUYsRUFBaUIsSUFFL0QsT2IrQkcsU0FBeUJqSyxFQUFnQnhFLEdBQzlDLE1BQU1tRixFQUFXQSxLQUNmLEdBQUl4QixHQUFPekMsSUFBSXNELEdBQVMsT0FFeEJiLEdBQU90TSxJQUFJbU4sR0FDWEssR0FBV0wsRUFBUXhFLEdBQ25CLE1BQU1yUCxPQUFFQSxHQUFXNlEsRUFBVWdELEVBQVEsQ0FBRXZKLElBQUsrRSxFQUFRdkcsUUFBU3VKLE9BQU8sRUFBTXZCLE1BQU8sWUFDakZxRCxHQUE2Qk4sRUFBUTdULEVBQVEsS0FFL0MsSUFBSyxNQUFNSCxJQUFVLENBQUMsYUFBYyxTQUFVLFVBQVcsV0FDdkRoQixRQUFRSCxHQUFHbUIsRUFBUTJVLEVBRXZCLENhNUNJd0osQ0FBZ0I5YyxLQUFLNmMsS0FBSzFPLEdBQVVBLEdBQzdCLHFEQUFxREEsRUFBUXBGLG1CQUFtQnNPLEtBQXFCbEosRUFBUXBGLG1CQUFtQjZULEdBQ3pJLENBRUFDLElBQUFBLENBQUsxTyxHQUNILE1BQU8sd0RBQXdEQSxFQUFRcEYsZ0NBQ3pFLENBRUFnVSxPQUFBQSxHQUNFLE1BQU8sbURBQ1QsR0N0QkssTUFBZUMsR0FDcEJDLFdBQUFBLENBQVk5TyxFQUFrQnFOLEVBQVUsZUFDdEMsT0FBT2dCLEdBQWNDLGNBQWN0TyxFQUFTcU4sRUFDOUMsQ0FRQTBCLFdBQUFBLENBQVkvTyxFQUFrQnpHLEdBQzVCLE1BQU0rSixFQUFPcEwsT0FBTzhILEVBQVFsRixJQUFJdUksT0FBUyxLQUN6QyxNQUFPLEdBQUd4UixLQUFLaWQsWUFBWTlPLEtBQVd5TixHQUFVbFUsd0VBRXpDOFUsR0FBY0UsYUFDZnZPLEdBQ0EsRUFDQXpHLEVBQUt5Viw2QkFBK0IsR0FDcEN6VixFQUFLMFYsb0JBQXNCLGtCQUUxQnBkLEtBQUtxZCxlQUFlbFAsRUFBU3pHLEVBQU0rSixLQUM1QyxDQUVBNkwsT0FBQUEsQ0FDRW5QLEVBQ0F6RyxHQUNBNlYsZUFBRUEsRUFBaUIsaUJBQWdCQyxnQkFBRUEsRUFBZUMsYUFBRUEsSUFFdEQsTUFBTXhVLEVBQU1rRixFQUFRbEYsSUFBSVcsT0FDbEI2SCxFQUFPdEQsRUFBUWxGLElBQUl1SSxNQUFRLE9BQzNCcEIsRUFBU2pDLEVBQVE3RixZQUFZQyxVQUFVLHVCQUF5QiwrQkFBaUMsR0FDakdtVixFQUFhaFcsRUFBS2lXLFNBQVdqVyxFQUFLaVcsUUFBUWxkLE9BQVMsRUFBSWlILEVBQUtpVyxRQUFReFYsS0FBSyxLQUFPLFlBQ2hGeVYsRUFBWSxVQUFVM1Usd0JBQTBCQSxhQUFlQSxVQUFZd0ksSUFDM0VvTSxFQUFvQk4sRUFBZXBILFdBQVcsU0FDaEQsa0JBQWtCb0gsSUFDbEIsdUJBQXVCRyxJQUMzQixHQUFJdlAsRUFBUWpELGlDQUNWLE1BQU8sR0FBRzBTLEtBQWFDLElBQW9Cek4sSUFJN0MsTUFBTyxHQUFHd04sbUVBRFdKLEVBQWtCLFVBQVVBLGNBQThCLEtBRTNEQyx1RUFDZ0NoTSxpQkFDM0NvTSxJQUFvQnpOLElBQy9CLENBRUEwTixVQUFBQSxDQUNFM1AsRUFDQXpHLEdBQ0E2VixlQUFFQSxFQUFpQixpQkFBZ0JFLGFBQUVBLElBRXJDLE1BQU14VSxFQUFNa0YsRUFBUWxGLElBQUlXLE9BQ2xCNkgsRUFBT3RELEVBQVFsRixJQUFJdUksTUFBUSxPQUMzQnBCLEVBQVNqQyxFQUFRN0YsWUFBWUMsVUFBVSx1QkFBeUIsK0JBQWlDLEdBQ2pHbVYsRUFBYWhXLEVBQUtpVyxTQUFXalcsRUFBS2lXLFFBQVFsZCxPQUFTLEVBQUlpSCxFQUFLaVcsUUFBUXhWLEtBQUssS0FBTyxZQUNoRnlWLEVBQVksVUFBVTNVLHdCQUEwQkEsYUFBZUEsVUFBWXdJLElBQzNFb00sRUFBb0JOLEVBQWVwSCxXQUFXLFNBQ2hELGtCQUFrQm9ILElBQ2xCLHVCQUF1QkcsSUFDM0IsT0FBSXZQLEVBQVFqRCxpQ0FDSCxHQUFHMFMsS0FBYUMsSUFBb0J6TixJQUd0QyxHQUFHd04sbUVBQ0xILHVFQUMrQ2hNLGlCQUMzQ29NLElBQW9Cek4sSUFDL0IsQ0FJQTJOLFFBQUFBLENBQVM1UCxFQUFrQnpHLEdBQ3pCLE1BQU1nVyxFQUFhaFcsRUFBS2lXLFNBQVdqVyxFQUFLaVcsUUFBUWxkLE9BQVMsRUFBSWlILEVBQUtpVyxRQUFReFYsS0FBSyxLQUFPLGFBQ3RGLE9BQUlnRyxFQUFRbkQsVUFFSCxVQUFVbUQsRUFBUWxGLElBQUlXLDBCQUEwQjhULDBDQUM5Q3ZQLEVBQVFwRyxlQUNWLFVBQVVvRyxFQUFRbEYsSUFBSVcsbUJBQW1COFQsSUFFM0Msa0JBQ1QsQ0FFVU0sT0FBQUEsQ0FBUTdQLEVBQWtCekcsRUFBa0IrSixFQUFPdEQsRUFBUWxGLElBQUl1SSxNQUFRLEtBQy9FLE1BQU8seUNBQXlDQyx5RUFDSUEsMEVBQ0NBLDBFQUNBQSwwRUFDQUEsMEVBQ0FBLDJFQUNDQSxHQUN4RCxDQUVVNEwsY0FBQUEsQ0FBZWxQLEVBQWtCekcsRUFBa0IrSixFQUFPdEQsRUFBUWxGLElBQUl1SSxNQUFRLEtBQ3RGLE1BQU8sR0FBR3hSLEtBQUtnZSxRQUNiN1AsRUFDQXpHLEVBQ0ErSixzQ0FDbUNBLDRDQUErQ0EsR0FDdEYsRUM3Q0ssTUFBTXdNLEdBQWUsSUE3RDVCLGNBQTJCakIsR0FDaEJuZCxLQUFBQSxDQUFNc08sRUFBa0J6RyxHQUMvQixNQUFNd1csRUFBUy9QLEVBQVFsRixJQUFJVyxPQUFTLFdBQVd1RSxFQUFRbEYsSUFBSVcsVUFBWSxHQUNqRTZILEVBQU9wTCxPQUFPOEgsRUFBUWxGLElBQUl1SSxPQUFTLElBQ3pDLE1BQU8sR0FBRzBNLHVFQUNRek0sS0FBUS9KLEVBQUswVixvQkFBc0IsZUFDaERwZCxLQUFLcWQsZUFBZWxQLEVBQVN6RyxFQUFNK0osS0FDMUMsQ0FFUzBNLGVBQUFBLENBQWdCaFEsRUFBa0J6RyxFQUFrQitKLEdBRTNELE1BQU8sR0FEUXRELEVBQVFsRixJQUFJVyxPQUFTLFdBQVd1RSxFQUFRbEYsSUFBSVcsVUFBWSwrRUFFbEUsQ0FDRHVOLEdBQWNPLFFBQVF2SixHQUN0QkEsRUFBUTlGLGFBQ1IsUUFBUW9KLHVCQUEwQnRELEVBQVF2RixTQUFTLDJCQUEyQmxCLEVBQUswVixvQkFBc0IsTUFDekdqVixLQUFLLG9CQUNKbkksS0FBS3FkLGVBQWVsUCxFQUFTekcsRUFBTStKLEtBQzFDLENBRVMyTSxTQUFBQSxDQUFValEsRUFBa0J6RyxHQUNuQyxNQUFNK0osRUFBT3BMLE9BQU84SCxFQUFRbEYsSUFBSXVJLE9BQVMsS0FDekMsTUFBTyx5REFDRixJQUNFMkYsR0FBY3pYLE1BQU15TyxHQUFTMkIsTUFBTSxNQUN0QzNCLEVBQVE5RixhQUNSLHFCQUFxQjhGLEVBQVF2RixTQUFTLDJCQUVyQzVDLElBQUtyRixHQUFNLEdBQUdBLEVBQUV1TyxTQUFTME0sR0FBVWxVLE1BQ25DUyxLQUFLLG9CQUNMbkksS0FBS2dlLFFBQVE3UCxFQUFTekcsRUFBTStKLEtBQ25DLENBRVM2TCxPQUFBQSxDQUFRblAsRUFBa0J6RyxFQUFnQjFLLEdBQ2pELE9BQU9xaEIsTUFBTWYsUUFBUW5QLEVBQVN6RyxFQUFNLENBQ2xDNlYsZUFBZ0J2Z0IsRUFBUXVnQixlQUN4QkMsZ0JBQWlCLEtBQ2pCQyxhQUNFemdCLEVBQVF5Z0IsY0FDUixJQUNLdEcsR0FBY3pYLE1BQU15TyxHQUFTMkIsTUFBTSxNQUN0QzNCLEVBQVE5RixhQUNSLHFCQUFxQjhGLEVBQVF2RixTQUFTLDJCQUVyQzVDLElBQUtyRixHQUFNLEdBQUdBLEVBQUV1TyxTQUFTME0sR0FBVWxVLE1BQ25DUyxLQUFLLFNBRWQsQ0FFUzJWLFVBQUFBLENBQVczUCxFQUFrQnpHLEdBQWdCNlYsZUFBRUEsRUFBY0UsYUFBRUEsSUFDdEUsTUFDTWEsRUFBc0IsZ0JBRGZuUSxFQUFRbEYsSUFBSXVJLE1BQVEsU0FDa0JvSyxHQUFVbFUsS0FDN0QsT0FBTzJXLE1BQU1QLFdBQVczUCxFQUFTekcsRUFBTSxDQUFFNlYsaUJBQWdCRSxhQUFjQSxHQUFnQmEsR0FDekYsQ0FFQSxlQUFlQyxDQUFVcFEsRUFBa0J6RyxHQUN6QyxNQUFNK0osUUFBYXFLLEtBQ25CLE1BQU8sVUFBVTNOLEVBQVFsRixJQUFJVyw4RUFBOEU2SCxJQUFPbUssR0FBVWxVLFFBQVcxSCxLQUFLZ2UsUUFBUTdQLEVBQVN6RyxFQUFNK0osS0FDckssR0NJSyxNQUFNK00sR0FBb0IsSUE3RGpDLGNBQWdDeEIsR0FDckJuZCxLQUFBQSxDQUFNc08sRUFBa0J6RyxHQUUvQixNQUFPLFFBRE1yQixPQUFPOEgsRUFBUWxGLElBQUl1SSxPQUFTLHlCQUNBOUosRUFBSytXLE1BQVEsVUFBWSxzQkFBc0IvVyxFQUFLMFYsb0JBQXNCLElBQ3JILENBRVNGLFdBQUFBLENBQVkvTyxFQUFrQnpHLEdBQ3JDLE1BQU8sR0FBRzFILEtBQUtpZCxZQUFZOU8sS0FBV3lOLEdBQVVsVSxTQUFZOFUsR0FBY0UsYUFDeEV2TyxHQUNBLEVBQ0F6RyxFQUFLeVYsNkJBQStCLEdBQ3BDelYsRUFBSzBWLG9CQUFzQixLQUUvQixDQUVTZSxlQUFBQSxDQUFnQmhRLEVBQWtCekcsRUFBa0IrSixFQUFPLE1BQ2xFLE1BQU8sdUJBQ0x0RCxFQUFROUYsZUFDUHVULEdBQVVsVSwyQ0FBOEMrSixNQUFTaEUsbUJBQWlDL0YsRUFBSzBWLG9CQUFzQixJQUNsSSxDQUVTZ0IsU0FBQUEsQ0FBVWpRLEVBQWtCekcsR0FDbkMsTUFBTyxHQUFHeUcsRUFBUXZELFVBQVksbURBQXFELE1BQU01SyxLQUFLbWUsZ0JBQzVGaFEsRUFDQXpHLEtBRUosQ0FFUzRWLE9BQUFBLENBQVFuUCxFQUFrQnpHLEVBQWdCMUssRUFBMEIsQ0FBQSxHQUMzRSxNQUFNeWdCLGFBQ0pBLEVBQWUsR0FBR3RQLEVBQVF2RCxVQUFZLG1EQUFxRCxNQUFNNUssS0FBS21lLGdCQUNwR2hRLEVBQ0F6RyxPQUVBMUssRUFDRXlVLEVBQU90RCxFQUFRbEYsSUFBSXVJLE1BQVEsT0FDM0JwQixFQUFTakMsRUFBUTdGLFlBQVlDLFVBQVUsdUJBQXlCLCtCQUFpQyxHQUNqR21WLEVBQWFoVyxFQUFLaVcsU0FBV2pXLEVBQUtpVyxRQUFRbGQsT0FBUyxFQUFJaUgsRUFBS2lXLFFBQVF4VixLQUFLLEtBQU8sWUFDdEYsTUFBTyw4QkFBOEJnRyxFQUFRbEYsSUFBSVcsZUFBZTZILG1FQUMzRGdNLHVFQUMrQ2hNLG1CQUFzQmlNLDBDQUFtRHROLElBQy9ILENBRVMwTixVQUFBQSxDQUFXM1AsRUFBa0J6RyxFQUFnQjFLLEVBQTZCLENBQUEsR0FDakYsTUFBTXlnQixhQUFFQSxHQUFpQnpnQixFQUNuQnlVLEVBQU90RCxFQUFRbEYsSUFBSXVJLE1BQVEsT0FDM0JwQixFQUFTakMsRUFBUTdGLFlBQVlDLFVBQVUsdUJBQXlCLCtCQUFpQyxHQUNqR21WLEVBQWFoVyxFQUFLaVcsU0FBV2pXLEVBQUtpVyxRQUFRbGQsT0FBUyxFQUFJaUgsRUFBS2lXLFFBQVF4VixLQUFLLEtBQU8sWUFDdEYsTUFBTyw4QkFDTGdHLEVBQVFsRixJQUFJVyxlQUNMNkgsbUVBQ0pnTSxHQUFnQnpkLEtBQUtILE1BQU1zTyxFQUFTekcsd0VBQ1crSixtQkFBc0JpTSwwQ0FBbUR0TixJQUMvSCxDQUVBLGVBQWVtTyxDQUFVcFEsRUFBa0J6RyxHQUN6QyxNQUFNK0osUUFBYXFLLEtBQ25CLE1BQU8sVUFBVTNOLEVBQVFsRixJQUFJVyxlQUFlNkgsNERBQStEelIsS0FBS0gsTUFBTXNPLEVBQVN6RyxRQUFXMUgsS0FBS2dlLFFBQVE3UCxFQUFTekcsRUFBTStKLEtBQ3hLLEdDQUssTUFBTWlOLEdBQWMsSUEzRDNCLGNBQTBCMUIsR0FDZm5kLEtBQUFBLENBQU1zTyxFQUFrQnpHLEdBQy9CLE1BQU0rSixFQUFPcEwsT0FBTzhILEVBQVFsRixJQUFJdUksT0FBUyxJQUN6QyxNQUFPLGlGQUNzQkMsS0FBUS9KLEVBQUswVixvQkFBc0IsZUFDM0RwZCxLQUFLcWQsZUFBZWxQLEVBQVN6RyxFQUFNK0osS0FDMUMsQ0FFUzBNLGVBQUFBLENBQWdCaFEsRUFBa0J6RyxFQUFrQitKLEdBQzNELE1BQU8sNkVBQ0YsSUFDR3RELEVBQVF2RCxVQUFZLENBQUN1TSxHQUFjTyxRQUFRdkosSUFBWSxHQUMzREEsRUFBUTlGLGFBQ1IsUUFBUW9KLHVCQUEwQnRELEVBQVF2RixTQUFTLDJCQUEyQmxCLEVBQUswVixvQkFBc0IsTUFDekdqVixLQUFLLG9CQUNKbkksS0FBS3FkLGVBQWVsUCxFQUFTekcsRUFBTStKLEtBQzFDLENBRVMyTSxTQUFBQSxDQUFValEsRUFBa0J6RyxHQUNuQyxNQUFNK0osRUFBT3BMLE9BQU84SCxFQUFRbEYsSUFBSXVJLE9BQVMsS0FDekMsTUFBTyx5REFDRixJQUNHckQsRUFBUXZELFVBQVl1TSxHQUFjelgsTUFBTXlPLEdBQVMyQixNQUFNLE1BQVEsR0FDbkUzQixFQUFROUYsYUFDUixxQkFBcUI4RixFQUFRdkYsU0FBUywyQkFFckM1QyxJQUFLckYsR0FBTSxHQUFHQSxFQUFFdU8sU0FBUzBNLEdBQVVsVSxNQUNuQ1MsS0FBSyxvQkFDTG5JLEtBQUtnZSxRQUFRN1AsRUFBU3pHLEVBQU0rSixLQUNuQyxDQUVTNkwsT0FBQUEsQ0FBUW5QLEVBQWtCekcsRUFBZ0IxSyxHQUNqRCxPQUFPcWhCLE1BQU1mLFFBQVFuUCxFQUFTekcsRUFBTSxDQUNsQzZWLGVBQWdCdmdCLEVBQVF1Z0IsZUFDeEJDLGdCQUFpQixLQUNqQkMsYUFDRXpnQixFQUFReWdCLGNBQ1IsSUFDTXRQLEVBQVF2RCxVQUFZdU0sR0FBY3pYLE1BQU15TyxHQUFTMkIsTUFBTSxNQUFRLEdBQ25FM0IsRUFBUTlGLGFBQ1IscUJBQXFCOEYsRUFBUXZGLFNBQVMsMkJBRXJDNUMsSUFBS3JGLEdBQU0sR0FBR0EsRUFBRXVPLFNBQVMwTSxHQUFVbFUsTUFDbkNTLEtBQUssU0FFZCxDQUVTMlYsVUFBQUEsQ0FBVzNQLEVBQWtCekcsR0FBZ0IrVixhQUFFQSxJQUN0RCxNQUNNYSxFQUFzQiwyQkFEZm5RLEVBQVFsRixJQUFJdUksTUFBUSxTQUM2Qm9LLEdBQVVsVSxLQUN4RSxPQUFPMlcsTUFBTVAsV0FBVzNQLEVBQVN6RyxFQUFNLENBQUUrVixhQUFjQSxHQUFnQmEsR0FDekUsQ0FFQSxlQUFlQyxDQUFVcFEsRUFBa0J6RyxHQUN6QyxNQUFNK0osUUFBYXFLLEtBQ25CLE1BQU8sVUFBVTNOLEVBQVFsRixJQUFJVyx5RkFBeUY2SCxJQUFPbUssR0FBVWxVLFFBQVcxSCxLQUFLZ2UsUUFBUTdQLEVBQVN6RyxFQUFNK0osS0FDaEwsR0NwQkssTUFBTWtOLEdBQWtCLElBdEMvQixjQUE4QjNCLEdBQ25CbmQsS0FBQUEsQ0FBTXNPLEVBQWtCekcsR0FFL0IsTUFBTyxRQURNckIsT0FBTzhILEVBQVFsRixJQUFJdUksT0FBUyx5QkFDQTlKLEVBQUsrVyxNQUFRLFVBQVksc0JBQXNCL1csRUFBSzBWLG9CQUFzQixJQUNySCxDQUVTRixXQUFBQSxDQUFZL08sRUFBa0J6RyxHQUNyQyxNQUFPLEdBQUcxSCxLQUFLaWQsWUFBWTlPLEtBQVd5TixHQUFVbFUsU0FBWThVLEdBQWNFLGFBQ3hFdk8sR0FDQSxFQUNBekcsRUFBS3lWLDZCQUErQixHQUNwQ3pWLEVBQUswVixvQkFBc0IsS0FFL0IsQ0FFU2UsZUFBQUEsQ0FBZ0JoUSxFQUFrQnpHLEdBQ3pDLE1BQU8sdUJBQXVCeUcsRUFBUTlGLHVDQUF1Q29GLG1CQUMzRS9GLEVBQUswVixvQkFBc0IsSUFFL0IsQ0FFU2dCLFNBQUFBLEdBQ1AsTUFBTyxvQkFDVCxDQUVTZCxPQUFBQSxHQUNQLE1BQU8sb0JBQ1QsQ0FFU1EsVUFBQUEsR0FDUCxNQUFPLG9CQUNULENBRVNTLFNBQUFBLEdBQ1AsT0FBT3RoQixRQUFRUixRQUFRLHFCQUN6QixHQzBCSyxNQUFNbWlCLEdBQWUsSUEzRDVCLGNBQTJCNUIsR0FDaEJuZCxLQUFBQSxDQUFNc08sRUFBa0J6RyxHQUMvQixNQUFNK0osRUFBT3BMLE9BQU84SCxFQUFRbEYsSUFBSXVJLE9BQVMsSUFDekMsTUFBTyxRQUFRQyxxRUFDQS9KLEVBQUswVixvQkFBc0IsZUFDckNwZCxLQUFLcWQsZUFBZWxQLEVBQVN6RyxFQUFNK0osS0FDMUMsQ0FFUzBNLGVBQUFBLENBQWdCaFEsRUFBa0J6RyxFQUFrQitKLEdBQzNELE1BQU8sNkVBQ0YwRixHQUFjTyxRQUFRdkosU0FBZUEsRUFBUTlGLHdCQUF3Qm9KLHVCQUEwQnRELEVBQVF2RixTQUN4RywyQkFDR2xCLEVBQUswVixvQkFBc0IsZUFDN0JwZCxLQUFLcWQsZUFBZWxQLEVBQVN6RyxFQUFNK0osS0FDMUMsQ0FFUzJNLFNBQUFBLENBQVVqUSxFQUFrQnpHLEdBQ25DLE1BQU0rSixFQUFPcEwsT0FBTzhILEVBQVFsRixJQUFJdUksT0FBUyxLQUN6QyxNQUFPLHlEQUNGLElBQ0UyRixHQUFjelgsTUFBTXlPLEdBQVMyQixNQUFNLE1BQ3RDM0IsRUFBUTlGLGFBQ1IscUJBQXFCOEYsRUFBUXZGLFNBQVMsMkJBRXJDNUMsSUFBS3JGLEdBQU0sR0FBR0EsRUFBRXVPLFNBQVMwTSxHQUFVbFUsTUFDbkNTLEtBQUssb0JBQ0xuSSxLQUFLZ2UsUUFBUTdQLEVBQVN6RyxFQUFNK0osS0FDbkMsQ0FFUzZMLE9BQUFBLENBQVFuUCxFQUFrQnpHLEVBQWdCMUssR0FDakQsT0FBT3FoQixNQUFNZixRQUFRblAsRUFBU3pHLEVBQU0sQ0FDbEM2VixlQUFnQnZnQixFQUFRdWdCLGVBQ3hCQyxnQkFBaUIsU0FDakJDLGFBQ0V6Z0IsRUFBUXlnQixjQUNSLElBQ0t0RyxHQUFjelgsTUFBTXlPLEdBQVMyQixNQUFNLE1BQ3RDM0IsRUFBUTlGLGFBQ1IscUJBQXFCOEYsRUFBUXZGLFNBQVMsMkJBRXJDNUMsSUFBS3JGLEdBQU0sR0FBR0EsRUFBRXVPLFNBQVMwTSxHQUFVbFUsTUFDbkNTLEtBQUssU0FFZCxDQUVTMlYsVUFBQUEsQ0FDUDNQLEVBQ0F6RyxHQUNBNlYsZUFBRUEsRUFBY0UsYUFBRUEsRUFBZSxZQUFZN0IsR0FBVWxVLE9BRXZELE9BQU8yVyxNQUFNUCxXQUFXM1AsRUFBU3pHLEVBQU0sQ0FBRTZWLGlCQUFnQkUsZ0JBQzNELENBRUEsZUFBZWMsQ0FBVXBRLEVBQWtCekcsR0FDekMsTUFBTStKLFFBQWFxSyxLQUNuQixNQUFPLFVBQVUzTixFQUFRbEYsSUFBSVcsZUFBZTZILHFFQUF3RW1LLEdBQVVsVSxRQUFXMUgsS0FBS2dlLFFBQVE3UCxFQUFTekcsRUFBTStKLEtBQ3ZLLEdDdEVXb04sR0FBcUIsQ0FBQyxVQUFXLFVBQVcsU0FBVSxRQ3lCdERwQixHQUEwRyxDQUNySDNnQixRQUFTLGlCQUNUK1EsU0FBVSxvQkFYSSxDVmJkNFEsTUFBTyxDQUNMM1EsWUFBYSx5QkFDYkMsS0FBTSxXQUVSaFIsS0FBTSxDQUNKK1EsWUFBYSw2QkFDYkMsS0FBTSxRQUNOQyxNQUFPLElBQ1B3SyxRQUFTLElBRVgsaUJBQWtCLENBQ2hCMUssWUFBYSw2QkFDYkMsS0FBTSxRQUNOeUssUUFBUyxJVUVYc0csS0FBTSxDQUNKaFIsWUFBYSwrRUFDYkMsS0FBTSxTQUNOQyxNQUFPLE1BUVQsYUFBTUMsQ0FBUXZHLElWSlQsU0FDTEEsR0FFQ0EsRUFBb0IwVixtQkFBcUIsSUFBSzFWLEVBQUszSyxNQUFRLE1BQVMySyxFQUFLL0QsR0FBR2lELE1BQU0sSUFBTSxJQUN0RlosSUFBSytZLEdBQVEsSUFBSUEsTUFDakI1VyxLQUFLLEtBQ1BULEVBQW9CeVYsNkJBQStCelYsRUFBS3NYLGVBQWlCLElBQUloWixJQUFLK1ksR0FBUSxJQUFJQSxNQUFRNVcsS0FBSyxJQUM5RyxDVUZJOFcsQ0FBY3ZYLEdBRWQsTUFBTWlGLFFBQWlCWCxFQUF1QnRFLEdBQ3pDaUYsSUFDSHhPLFFBQVFJLE1BQU02UCxFQUFNQyxJQUFJLHNCQUN4QjFRLFFBQVFnVSxLQUFLLElBR2YsSUFBSyxNQUFNeEQsS0FBV3hCLEVBQVNGLFlBQWEsQ0FDMUMsTUFBTXlKLEVBQU8vSCxFQUFRN0YsWUFBWXVDLGNBQWdCLENBQUEsRUFDM0MyTCxFQUFVckksRUFBUTdGLFlBQVl5QyxpQkFBbUIsQ0FBQSxFQUN2RCxJQUFJeEMsRUFDSixHQUFJMk4sRUFBS3BDLE1BQ1B2TCxFQUFVMFYsUUFDTCxHQUFJL0gsRUFBS2dKLEtBQ2QzVyxFQUFVbVcsUUFDTCxHQUFJbEksRUFBUSxrQkFDakJqTyxFQUFVcVcsUUFDTCxHQUNKQyxHQUFtQjVPLEtBQU14TyxHQUFNeVUsRUFBS3pVLE1BQVF5VSxFQUFLLHVCQUNqRC9ILEVBQVF0RixlQUFpQixnQkFBZ0JiLEtBQUttRyxFQUFReEYsWUFFdkRKLEVBQVVpVyxPQUNMLEtBQUl0SSxFQUFLLGNBQWVNLEVBQVEsWUFHckMsU0FGQWpPLEVBQVVvVyxFQUdaLENBR0EsT0FGQXhnQixRQUFRQyxLQUFLLHVCQUF1QitQLEVBQVExSixZQUVwQ2lELEVBQUtvWCxNQUFRLE9BQ25CLElBQUssTUFDTCxJQUFLLGNBQWUsQ0FDbEIsTUFBTTdLLEVBQVNrTCxHQUE4QmpKLEVBQU0scUJBQzdDeEQsR0FBYSxHQUFHdUIsSUFBUzFMLEVBQVExSSxNQUFNc08sRUFBU3pHLEtBQVN5RyxFQUFTekcsR0FDeEUsS0FDRixDQUNBLElBQUssVUFBVyxDQUNkLE1BQU11TSxFQUFTa0wsR0FBOEJqSixFQUFNLFdBQzdDekUsRUFBT3BMLE9BQU84SCxFQUFRbEYsSUFBSXVJLE9BQVMsV0FDbkNrQixHQUFhLEdBQUd1QixJQUFTMUwsRUFBUTRWLGdCQUFnQmhRLEVBQVN6RyxFQUFNK0osS0FBU3RELEVBQVN6RyxHQUN4RixLQUNGLENBQ0EsSUFBSyxTQUFVLENBQ2IsTUFBTXVNLEVBQVNrTCxHQUE4QmpKLEVBQU0saUJBQzdDeEQsR0FBYSxHQUFHdUIsSUFBUzFMLEVBQVEyVSxZQUFZL08sRUFBU3pHLEtBQVN5RyxFQUFTekcsR0FDOUUsS0FDRixDQUNBLElBQUssZUFBZ0IsQ0FDbkIsTUFBTXVNLEVBQVNrTCxHQUE4QmpKLEVBQU0sV0FDbkR4TyxFQUFLMFYsbUJBQXFCLG9CQUNwQjFLLEdBQWEsR0FBR3VCLElBQVMxTCxFQUFRMlUsWUFBWS9PLEVBQVN6RyxLQUFTeUcsRUFBU3pHLEdBQzlFLEtBQ0YsQ0FDQSxJQUFLLE9BQVEsQ0FDWCxNQUFNdU0sRUFBU2tMLEdBQThCakosRUFBTSxjQUM3Q3hELEdBQWEsR0FBR3VCLElBQVMxTCxFQUFRNlYsVUFBVWpRLEVBQVN6RyxLQUFTeUcsRUFBU3pHLEdBQzVFLEtBQ0YsQ0FDQSxRQUNFLE1BQU0sSUFBSTdJLE1BQU0sdUJBQXVCNkksRUFBS29YLFFBR2xELENBQ0YsR0FHRixTQUFTSyxHQUE4QmpKLEVBQXVDa0osR0FDNUV6aEIsUUFBUXNMLElBQUlXLFNBQVd3VixFQUN2QixJQUFJbkwsRUFBUyxVQUFVdFcsUUFBUXNMLElBQUlXLFVBS25DLE9BSklzTSxFQUFLZ0osT0FDUHZoQixRQUFRc0wsSUFBSW9XLG1CQUFxQjFoQixRQUFRc0wsSUFBSVcsT0FDN0NxSyxHQUFVLHNCQUFzQnRXLFFBQVFzTCxJQUFJVyxXQUV2Q3FLLENBQ1QsQ0NuRkEsTUF1Q2FxTCxHQUdULENBQ0Z4aUIsUUFBUyxvQkFDVCtRLFNBQVUsaUVBQ1Z5RCxRQUFTLENBNUNUaU8sSUFBSyxDQUNIelIsWUFDRSw0SEFDRkMsS0FBTSxTQUNOeVIsUUFBUyxDQUNQLFdBQ0EsZUFDQSxTQUNBLGFBQ0EsU0FDQSxlQUNBLFFBQ0EsV0FDQSxTQUVGaEgsUUFBUyxZQUVYcUQsT0FBUSxDQUNOL04sWUFBYSwyQkFDYkMsS0FBTSxXQUVSLGVBQWdCLENBQ2RELFlBQWEseUJBQ2JDLEtBQU0sVUFLUjRQLFFBQVMsQ0FDUDdQLFlBQWEsb0JBQ2JDLEtBQU0sVUFlUixhQUFNRSxDQUFRdkcsU0FLVDlLLGVBQ0w4SyxHQUVBLE1BQU1pRixRQUFpQlgsRUFBdUJ0RSxHQUN6Q2lGLElBQ0h4TyxRQUFRSSxNQUFNNlAsRUFBTUMsSUFBSSxzQkFDeEIxUSxRQUFRZ1UsS0FBSyxJQUdYaEYsRUFBU0YsWUFBWWhNLE9BQVMsSUFFaEM5QyxRQUFRc0wsSUFBSWtDLEdBQUssS0FFbkJ4TixRQUFRc0wsSUFBSXdMLGNBQWdCLElBQzVCOVcsUUFBUXNMLElBQUlXLFNBQVcsT0FHdkIsTUFBTTZWLEVBQWUvWCxFQUFLaVcsU0FBVyxHQUMvQitCLEVBQTJDLElBQXZCRCxFQUFZaGYsT0FHaENrZixFQUFnQkYsRUFBWXhQLEtBQU0yUCxHQUFXQSxFQUFPblgsU0FBUyxTQUM3RG9YLEVBQWlCSixFQUFZeFAsS0FBTTJQLEdBQVdBLEVBQU9uWCxTQUFTLFVBQzlEcVgsRUFBZ0JKLEdBQXFCRyxFQUNyQ0UsRUFBZUwsR0FBcUJDLEVBRTFDLElBQUssTUFBTXhSLEtBQVd4QixFQUFTRixZQUFhLENBQzFDLE1BQU15SixFQUFPL0gsRUFBUTdGLFlBQVl1QyxjQUFnQixDQUFBLEVBQzNDMkwsRUFBVXJJLEVBQVE3RixZQUFZeUMsaUJBQW1CLENBQUEsRUFDdkQsSUFBSXhDLEVBZ0JKLEdBZEVBLEVBREUyTixFQUFLcEMsTUFDR21LLEdBQ0QvSCxFQUFLZ0osS0FDSlIsR0FDRGxJLEVBQVEsa0JBQ1BvSSxHQUNEQyxHQUFtQjVPLEtBQU14TyxHQUFNeVUsRUFBS3pVLE1BQVF5VSxFQUFLLHNCQUNoRHNJLEdBRUFHLEdBR1p4Z0IsUUFBUUMsS0FBSyxzQkFBc0IrUCxFQUFRMUosWUFHdkNxYixHQUFpQjdYLEVBQUdTLFdBQVdsTSxFQUFLMkwsS0FBS2dHLEVBQVF2RyxRQUFTLE9BQVEsU0FBVSxDQUM5RSxNQUFNb1ksRUFBY1AsRUFBWXpWLE9BQVE0VixHQUFXQSxFQUFPblgsU0FBUyxVQUM3RHdYLEVBQVcsSUFBS3ZZLEVBQU1pVyxRQUFTcUMsRUFBWXZmLE9BQVMsRUFBSXVmLE9BQWNwaEIsU0FDdEU4VCxHQUFhbkssRUFBUXdWLFNBQVM1UCxFQUFTOFIsR0FBVzlSLEVBQVN6RyxFQUFNLENBQUUrTCxRQUFTL0wsRUFBS3dZLGFBQ3pGLENBRUEsSUFBS0gsSUFBaUI5WCxFQUFHUyxXQUFXbE0sRUFBSzJMLEtBQUtnRyxFQUFRdkcsUUFBUyxPQUFRLFFBQ3JFLFNBSUYsTUFBTXVZLEVBQWFWLEVBQVl6VixPQUFRNFYsR0FBV0EsRUFBT25YLFNBQVMsU0FDNUQyWCxFQUFVLElBQUsxWSxFQUFNaVcsUUFBU3dDLEVBQVcxZixPQUFTLEVBQUkwZixPQUFhdmhCLEdBRXpFLE9BQVE4SSxFQUFLNlgsS0FDWCxJQUFLLGlCQUNHN00sR0FBYW5LLEVBQVErVSxRQUFRblAsRUFBU2lTLEVBQVMsQ0FBQSxHQUFLalMsRUFBU3pHLEdBQ25FLFNBRUYsSUFBSyxxQkFDR2dMLEdBQWFuSyxFQUFRdVYsV0FBVzNQLEVBQVNpUyxFQUFTLENBQUEsR0FBS2pTLEVBQVN6RyxHQUN0RSxTQUVGLElBQUssZUFDRzJZLEdBQWFsUyxFQUFTaVMsRUFBUzdYLEdBQ3JDLFNBRUYsSUFBSyxlQUFnQixDQUNuQixNQUFNK1gsRUFBWUgsRUFBVzFmLE9BQVMsRUFBSTBmLEVBQVdoWSxLQUFLLEtBQU8sa0JBQzNEa1ksR0FBYWxTLEVBQVNpUyxFQUFTN1gsRUFBUyxRQUFRK1gsYUFDdEQsUUFDRixFQUVGLEdBQUlwSyxFQUFLcEMsT0FBU29DLEVBQUtnSixNQUFRMUksRUFBUSxrQkFBbUIsQ0FDeEQsTUFBTThKLEVBQVlILEVBQVcxZixPQUFTLEVBQUkwZixFQUFXaFksS0FBSyxLQUFPLFlBQ2pFLE9BQVFULEVBQUs2WCxLQUNYLElBQUssZUFDRzdNLEdBQ0puSyxFQUFRK1UsUUFBUW5QLEVBQVNpUyxFQUFTLENBQUU3QyxlQUFnQixRQUFRK0MsZUFDNURuUyxFQUNBekcsR0FFRixNQUVGLElBQUssbUJBQ0dnTCxHQUNKbkssRUFBUXVWLFdBQVczUCxFQUFTaVMsRUFBUyxDQUFFN0MsZUFBZ0IsUUFBUStDLGVBQy9EblMsRUFDQXpHLEdBRUYsTUFFRixJQUFLLGNBQ0dnTCxHQUNKbkssRUFBUStVLFFBQVFuUCxFQUFTaVMsRUFBUyxDQUFFN0MsZUFBZ0IsUUFBUStDLGNBQzVEblMsRUFDQXpHLEdBRUYsTUFFRixJQUFLLFdBQVksQ0FDZixNQUFNK0osRUFBT3RELEVBQVFsRixJQUFJdUksTUFBUSxhQUMzQmtCLEdBQ0puSyxFQUFRK1UsUUFBUW5QLEVBQVNpUyxFQUFTLENBQUU3QyxlQUFnQiw0QkFBNEI5TCxNQUNoRnRELEVBQ0F6RyxHQUVGLEtBQ0YsQ0FDQSxJQUFLLGNBQ0dnTCxHQUFhLDRCQUE2QnZFLEVBQVN6RyxHQUkvRCxDQUNGLENBQ0YsQ0E3SFVNLENBQUtOLEVBQ2IsR0E4SEY5SyxlQUFleWpCLEdBQ2JsUyxFQUNBekcsRUFDQWEsRUFDQWdWLEdBRUE1ZixRQUFRc0wsSUFBSXNYLFlBQWMsVUFDcEI3TixHQUFhLEdBQUduSyxFQUFRMFUsWUFBWTlPLEVBQVMsVUFBVXlOLEdBQVVsVSxLQUFTeUcsRUFBU3pHLEdBQ3pGL0osUUFBUXlULGVBQWlCc0IsR0FDdkJuSyxFQUFRK1UsUUFBUW5QLEVBQVN6RyxFQUFNLENBQzdCNlYsaUJBQ0FFLGFBQWMsR0FBR2pCLEdBQWNFLGFBQWF2TyxHQUFTLEtBQVF5TixHQUFVbFUsT0FFekV5RyxFQUNBekcsRUFDQSxDQUFFK0ssY0FBYyxVQUVaQyxHQUFhOEosR0FBY0ssS0FBSzFPLEdBQVVBLEVBQVN6RyxFQUMzRCxDQ2pNQSxNQUNhOFksR0FHVCxDQUNGMWpCLFFBQVMsYUFDVCtRLFNBQVUsc0NBQ1Z5RCxRQVBzQixDQUFBLEVBUXRCLGFBQU1yRCxDQUFRdkcsU0FLVDlLLGVBQ0w4SyxHQUVBLE1BQU1pRixRQUFpQlgsRUFBdUJ0RSxHQUN6Q2lGLElBQ0h4TyxRQUFRSSxNQUFNNlAsRUFBTUMsSUFBSSxzQkFDeEIxUSxRQUFRZ1UsS0FBSyxJQUdmaFUsUUFBUXNMLElBQUlrQyxLQUFPLElBQ25CeE4sUUFBUXNMLElBQUl3TCxjQUFnQixJQUM1QjlXLFFBQVFzTCxJQUFJVyxTQUFXLE9BRXZCLElBQUssTUFBTXVFLEtBQVd4QixFQUFTRixZQUFhLENBQzFDLE1BQU15SixFQUFPL0gsRUFBUTdGLFlBQVl1QyxjQUFnQixDQUFBLEVBQzNDMkwsRUFBVXJJLEVBQVE3RixZQUFZeUMsaUJBQW1CLENBQUEsRUFDdkQsSUFBSXhDLEVBc0JKLEdBcEJFQSxFQURFMk4sRUFBS3BDLE1BQ0dtSyxHQUNEL0gsRUFBS2dKLEtBQ0pSLEdBQ0RsSSxFQUFRLGtCQUNQb0ksR0FDREMsR0FBbUI1TyxLQUFNeE8sR0FBTXlVLEVBQUt6VSxNQUFReVUsRUFBSyxzQkFDaERzSSxHQUVBRyxHQUdaeGdCLFFBQVFDLEtBQUssNEJBQTRCK1AsRUFBUTFKLGtCQUUzQ2lQLEdBQXVCOEksR0FBY08sVUFBVzVPLEVBQVN6RyxHQUMzRE8sRUFBR1MsV0FBV2xNLEVBQUsyTCxLQUFLZ0csRUFBUXZHLFFBQVMsT0FBUSxnQkFFN0M4TCxHQUF1Qm5MLEVBQVF3VixTQUFTNVAsRUFBU3pHLEdBQU1zQixXQUFXLGVBQWdCLElBQUttRixFQUFTekcsU0FFbEdnTSxTQUE2Qm5MLEVBQVFnVyxVQUFVcFEsRUFBU3pHLEdBQU95RyxFQUFTekcsU0FDeEU0SyxHQUFZbUosYUFDZHhULEVBQUdTLFdBQVdsTSxFQUFLMkwsS0FBS2dHLEVBQVF2RyxRQUFTLE9BQVEsUUFBUyxDQUN4RHVHLEVBQVF0RixnQkFDVmxMLFFBQVFzTCxJQUFJc1gsWUFBYyxVQUNwQjdOLEdBQWEsR0FBR25LLEVBQVEwVSxZQUFZOU8sRUFBUyxVQUFVeU4sR0FBVWxVLEtBQVN5RyxFQUFTekcsSUFFM0YsTUFBTTFLLEVBQVVtUixFQUFRdEYsY0FDcEIsQ0FDRTRVLGFBQWNqQixHQUFjRSxhQUFhdk8sR0FBUyxJQUVwRCxDQUFBLEVBQ0p4USxRQUFReVQsZUFBaUJzQixHQUV2Qm5LLEVBQVErVSxRQUFRblAsRUFBU3pHLEVBQU0xSyxHQUFTZ00sV0FBVyxlQUFnQixJQUNuRW1GLEVBQ0F6RyxFQUNBLENBQ0UrSyxjQUFjLFVBR1pDLEdBQWE4SixHQUFjSyxLQUFLMU8sR0FBVUEsRUFBU3pHLEVBQzNELENBQ0YsQ0FDRixDQWhFVStZLENBQVMvWSxFQUNqQixHQ3JCRixNQUVhZ1osR0FHVCxDQUNGNWpCLFFBQVMsWUFDVCtRLFNBQVUsNkNBQ1Z5RCxRQVJjLENBQUEsRUFTZCxhQUFNckQsQ0FBUXZHLEdBQ1osTUFBTWlGLFFBQWlCWCxFQUF1QnRFLEdBQU0sR0FDL0NpRixJQUNIeE8sUUFBUUksTUFBTTZQLEVBQU1DLElBQUksc0JBQ3hCMVEsUUFBUWdVLEtBQUssSUFHZixNQUFNakQsRUFBVy9CLEVBQVNGLFlBQVl6RyxJQUFJcEosVUFDeEMsTUFBTStqQixFQUFxQixHQWMzQixJQWJLeFMsRUFBUTdGLFlBQVk4RCxXQVF2QitCLEVBQVFyRixnQkFDUHFGLEVBQVE3RixZQUFZdUMsY0FBYytWLFlBQWN6UyxFQUFRN0YsWUFBWXlDLGlCQUFpQjZWLGFBRXRGRCxFQUFTL2IsS0FBSywrQkFWVnVKLEVBQVE3RixZQUFZdUMsY0FBYytWLFlBQWN6UyxFQUFRN0YsWUFBWXlDLGlCQUFpQjZWLGFBQ3ZGRCxFQUFTL2IsS0FBSyw2QkFFWnVKLEVBQVE3RixZQUFZeUMsaUJBQWlCOFYsU0FDdkNGLEVBQVMvYixLQUFLLGlCQVFYK2IsRUFBU2xnQixPQUFTLEdBQUcsQ0FDMUIsTUFBTTJRLFFBQWlCc0MsR0FBdUJpTixFQUFTeFksS0FBSyxRQUFTZ0csRUFBU3pHLEVBQU0sQ0FFbEY2TSxHQUFJNUgsRUFBU0YsWUFBWWhNLE9BQVMsRUFDbENnUyxjQUFjLEVBQ2QrQixZQUFZLElBSVJzTSxFQUFjdGtCLEVBQUsyTCxLQUFLZ0csRUFBUXZHLFFBQVMsU0FDL0MsSUFBSXdKLElBQVluSixFQUFHUyxXQUFXb1ksR0FNOUIsT0FBTzFQLEVBTExuSixFQUFHOFksT0FBT0QsRUFBYSxDQUFFRSxPQUFPLEVBQU1wUyxXQUFXLElBQ2pEelEsUUFBUUMsS0FBS2dRLEVBQU0yTSxPQUFPLDREQUs5QixJQUVJa0csUUFBa0Joa0IsUUFBUWlrQixJQUFJeFMsR0FDcEMsSUFBSXlTLEVBQWdCLEVBQ3BCLElBQUssTUFBTy9oQixFQUFHZ1MsS0FBYTZQLEVBQVUxaEIsVUFDcEMsR0FBSTZSLEVBQVUsRUFDQ3pFLEVBQVNGLFlBQVlyTixJQUFJa0osWUFBWXVDLGNBQWdCLENBQUEsR0FDekRpSixPQUNQM1YsUUFBUUMsS0FBS2dRLEVBQU0yTSxPQUFPLGdFQUU1Qm9HLEVBQWdCL1AsQ0FDbEIsQ0FFRStQLEdBQWV4akIsUUFBUWdVLEtBQUt3UCxFQUNsQyxHQUdXQyxHQUF1RyxJQUMvR1YsR0FDSDVqQixRQUFTLFlDeERMNGIsRUFBTTJJLEVBQVExakIsUUFBUStKLE9BQ3pCNFosV0FBVyxNQUNYdGtCLFFBQVF1YixJQUNSZ0osV0FBWTdaLElBQ1gsTUFBTThaLEVBQWE5WixFQUFLLGVBQ3hCLEdBQUk4WixFQUFZLENBQ2QsTUFBTTVaLEVBQVVwTCxFQUFLQyxRQUFRK2tCLEdBQzdCN2pCLFFBQVE4akIsTUFBTTdaLEVBQ2hCLEV0QzBHRyxTQUE4Q3NCLEdBRS9DQSxFQUFReUMsTUFBUXpDLEVBQVF3WSxtQkFDMUJ4WSxFQUFReUMsS0FBT3pDLEVBQVF5QyxLQUFLb0UsUUFBUSxHQUFHN0csRUFBUXdZLG9CQUFxQixJQUVqRTFZLFdBQVcsbUNBQW9DLElBRS9DQSxXQUFXLHNCQUF1QixJQUNsQ0EsV0FBVyxpQkFBa0IsS0FFbEMsSUFBSyxNQUFNb0IsS0FBT3ZELE9BQU8yRCxLQUFLdEIsR0FBVSxDQUN0QyxNQUFNeVksRUFBV3ZYLEVBQUl3WCxlQUVuQkQsRUFBU3hMLFdBQVcsU0FDcEJ3TCxFQUFTeEwsV0FBVyxVQUNwQndMLEVBQVN4TCxXQUFXLFdBQ1AsZ0JBQWJ3TCxHQUNhLGFBQWJBLFdBR096WSxFQUFRa0IsRUFFbkIsQ0FDRixDc0MvSEl5WCxDQUFxQ2xrQixRQUFRc0wsT0FFOUNuTSxRQUFROFEsR0FDUjlRLFFBQVF1VSxJQUNSdlUsUUFBUWdZLElBQ1JoWSxRQUFRa1osSUFDUmxaLFFBQVEyYixJQUNSM2IsUUFBUTZkLElBQ1I3ZCxRQUFRa2UsSUFDUmxlLFFBQVEyZ0IsSUFDUjNnQixRQUFRd2lCLElBQ1J4aUIsUUFBUTBqQixJQUNSMWpCLFFBQVE0akIsSUFDUjVqQixRQUFRc2tCLElBQ1IvSCxnQkFDQUMsU0FDQWtDLFFBR0gsV0FDRSxJQUFJc0csRUFBaUJ0bEIsRUFBSzhPLFFBQVEsSUFBSXhGLGdCQUFnQmljLEtBQUtDLFVBQzNELE1BQVEvWixFQUFHUyxXQUFXbE0sRUFBSzJMLEtBQUsyWixFQUFnQixrQkFDOUNBLEVBQWlCdGxCLEVBQUs4TyxRQUFRd1csR0FLaEMsT0FIb0IzYixLQUFLdUUsTUFBTXpDLEVBQUdDLGFBQWExTCxFQUFLMkwsS0FBSzJaLEVBQWdCLGdCQUFpQixTQUd2RXRHLE9BQ3JCLENBWld5RyxJQUNSQyxPQUFPeGEsS0FhVixJQUFLLE1BQU0vSSxJQUFVLENBQUMsU0FBVSxVQUFXLFdBQ3pDaEIsUUFBUUgsR0FBR21CLEVBQVEsS0FDakJOLEVBQVNWLFFBQVFNLEtBQ2pCTixRQUFRZ1UiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMiwzLDQsNSw2XX0=