@willbooster/wb 8.0.27 → 8.0.29

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 +9 -9
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import e from"node:path";import t from"yargs";import{hideBin as n}from"yargs/helpers";import r,{spawn as s,spawnSync as o}from"node:child_process";import{createHash as i}from"node:crypto";import a from"node:fs";import c from"chalk";import{globby as d}from"globby";import{config as l}from"dotenv";import u from"kill-port";import{PromisePool as p}from"minimal-promise-pool";import m from"tree-kill";import f from"node:fs/promises";import h from"node:os";const g=new Map;function b(t){const n=g.get(t);if(n)return n;const r=l({path:e.resolve(t),processEnv:{}}).parsed??{};return g.set(t,r),r}async function y(e,t,n){return new Promise(((r,o)=>{try{const i=s(e,t??[],n??{});i.stdout?.setEncoding?.("utf8"),i.stderr?.setEncoding?.("utf8");let a="",c="";i.stdout?.on("data",(e=>{a+=e})),i.stderr?.on("data",(e=>{n?.mergeOutAndError?a+=e:c+=e}));let d=!1;const l=()=>{!d&&i.pid&&(d=!0,n?.verbose&&console.info(`treeKill(${i.pid})`),m(i.pid))};n?.killOnExit&&(process.on("beforeExit",l),process.on("SIGINT",l)),i.on("error",(e=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),i.removeAllListeners("close"),o(e)})),i.on("close",((e,t)=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),void 0===i.pid?o(new Error("Process has no pid.")):r({pid:i.pid,stdout:a,stderr:c,status:e,signal:t})})),n?.input&&(i.stdin?.write(n.input),i.stdin?.end())}catch(e){o(e)}}))}function w(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function v(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function k(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}
1
+ import e from"node:path";import t from"yargs";import{hideBin as n}from"yargs/helpers";import r,{spawn as s,spawnSync as o}from"node:child_process";import{createHash as i}from"node:crypto";import a from"node:fs";import c from"chalk";import{globby as d}from"globby";import{config as l}from"dotenv";import u from"kill-port";import{PromisePool as p}from"minimal-promise-pool";import m from"tree-kill";import f from"node:fs/promises";import h from"node:os";const g=new Map;function b(t){const n=g.get(t);if(n)return n;const r=l({path:e.resolve(t),processEnv:{}}).parsed??{};return g.set(t,r),r}async function y(e,t,n){return new Promise(((r,o)=>{try{const i=s(e,t??[],n??{});i.stdout?.setEncoding?.("utf8"),i.stderr?.setEncoding?.("utf8");let a="",c="";i.stdout?.on("data",(e=>{a+=e})),i.stderr?.on("data",(e=>{n?.mergeOutAndError?a+=e:c+=e}));let d=!1;const l=()=>{!d&&i.pid&&(d=!0,n?.verbose&&console.info(`treeKill(${i.pid})`),m(i.pid))};n?.killOnExit&&(process.on("beforeExit",l),process.on("SIGINT",l)),i.on("error",(e=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),i.removeAllListeners("close"),o(e)})),i.on("close",((e,t)=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),void 0===i.pid?o(new Error("Process has no pid.")):r({pid:i.pid,stdout:a,stderr:c,status:e,signal:t})})),n?.input&&(i.stdin?.write(n.input),i.stdin?.end())}catch(e){o(e)}}))}function w(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function v(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function k(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}
2
2
  /**
3
3
  * [js-sha3]{@link https://github.com/emn178/js-sha3}
4
4
  *
@@ -7,4 +7,4 @@ import e from"node:path";import t from"yargs";import{hideBin as n}from"yargs/hel
7
7
  * @copyright Chen, Yi-Cyuan 2015-2023
8
8
  * @license MIT
9
9
  */const $=[..."0123456789abcdef"],E=[6,1536,393216,100663296],A=[0,8,16,24],N=[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 P{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+=$[s>>4&15]+$[15&s]+$[s>>12&15]+$[s>>8&15]+$[s>>20&15]+$[s>>16&15]+$[s>>28&15]+$[s>>24&15];i%e==0&&(t=x(t),j(t),o=0)}return r&&(s=t[o],a+=$[s>>4&15]+$[15&s],r>1&&(a+=$[s>>12&15]+$[s>>8&15]),r>2&&(a+=$[s>>20&15]+$[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,w,v,k,$,E,A,x,P,j,R,D,S,_,B,O,T,I,C,W,V,z,J,F,Y,L,U,M,G,q,H,X,K,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,R=e[20]<<3|e[21]>>>29,D=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,T=e[2]<<1|e[3]>>>31,I=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,X=e[23]<<10|e[22]>>>22,S=e[33]<<13|e[32]>>>19,_=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,C=e[14]<<6|e[15]>>>26,W=e[15]<<6|e[14]>>>26,y=e[25]<<11|e[24]>>>21,w=e[24]<<11|e[25]>>>21,K=e[34]<<15|e[35]>>>17,Q=e[35]<<15|e[34]>>>17,B=e[45]<<29|e[44]>>>3,O=e[44]<<29|e[45]>>>3,A=e[6]<<28|e[7]>>>4,x=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,z=e[27]<<25|e[26]>>>7,v=e[36]<<21|e[37]>>>11,k=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,P=e[18]<<20|e[19]>>>12,j=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,F=e[39]<<8|e[38]>>>24,$=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=f^~g&y,e[1]=h^~b&w,e[10]=A^~P&R,e[11]=x^~j&D,e[20]=T^~C&V,e[21]=I^~W&z,e[30]=U^~G&H,e[31]=M^~q&X,e[40]=te^~re&oe,e[41]=ne^~se&ie,e[2]=g^~y&v,e[3]=b^~w&k,e[12]=P^~R&S,e[13]=j^~D&_,e[22]=C^~V&J,e[23]=W^~z&F,e[32]=G^~H&K,e[33]=q^~X&Q,e[42]=re^~oe&ae,e[43]=se^~ie&ce,e[4]=y^~v&$,e[5]=w^~k&E,e[14]=R^~S&B,e[15]=D^~_&O,e[24]=V^~J&Y,e[25]=z^~F&L,e[34]=H^~K&Z,e[35]=X^~Q&ee,e[44]=oe^~ae&de,e[45]=ie^~ce&le,e[6]=v^~$&f,e[7]=k^~E&h,e[16]=S^~B&A,e[17]=_^~O&x,e[26]=J^~Y&T,e[27]=F^~L&I,e[36]=K^~Z&U,e[37]=Q^~ee&M,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=$^~f&g,e[9]=E^~h&b,e[18]=B^~A&P,e[19]=O^~x&j,e[28]=Y^~T&C,e[29]=L^~I&W,e[38]=Z^~U&G,e[39]=ee^~M&q,e[48]=de^~te&re,e[49]=le^~ne&se,e[0]^=N[r],e[1]^=N[r+1]};function R(e,t){return function(e){return new P(512,E,512).update(e).hex()}(JSON.stringify([e,t]))}const D=function({cacheDuration:e=Number.POSITIVE_INFINITY,calcHash:t=R}={}){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}}}({calcHash:R});let S;class _{static{[S]=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 $(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]),w=t[3],k=!c,$=1===s,E=3===s,A=4===s,N=2===s;function x(t,n,r){return function(s,o){return n&&(o=s,s=e),r&&r(s),P[t].call(s,o)}}if(!k){var P={},j=[],R=E?"get":A||$?"set":"value";if(l?(u||$?P={get:v((function(){return w(this)}),r,"get"),set:function(e){t[4](this,e)}}:P[R]=w,u||v(P[R],r,N?"":R)):u||(P=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=h[+d][r])&&7!=(i^s))throw Error("Decorating two elements with the same name ("+P[R].name+") is not supported yet");h[+d][r]=s<3?1:s}}for(var D=e,S=g.length-1;S>=0;S-=n?2:1){var _=y(g[S],"A decorator","be",!0),B=n?g[S-1]:void 0,O={},T={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,O)};if(k)i=_.call(B,D,T),O.v=1,y(i,"class decorators","return")&&(D=i);else if(T.static=d,T.private=l,i=T.access={has:l?p.bind():function(e){return r in e}},A||(i.get=l?N?function(e){return f(e),P.value}:x("get",0,f):function(e){return e[r]}),N||E||(i.set=l?x("set",0,f):function(e,t){e[r]=t}),D=_.call(B,$?{get:P.get,set:P.set}:P[R],T),O.v=1,$){if("object"==typeof D&&D)(i=y(D.get,"accessor.get"))&&(P.get=i),(i=y(D.set,"accessor.set"))&&(P.set=i),(i=y(D.init,"accessor.init"))&&j.unshift(i);else if(void 0!==D)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(D,(u?"field":"method")+" decorators","return")&&(u?j.unshift(D):P[R]=D)}return s<2&&c.push(b(j,d,1),b(a,d,0)),u||k||(l?$?c.splice(-1,0,x("get",d),x("set",d)):c.push(N?P[R]:y.call.bind(P[R])):m(e,r,P)),D}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;$(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=$(e,[t],r,e.name,5,n)),b(n,1)]}}}(this,[],[[D,3,"isBunAvailable"],[D,3,"buildCommand"],[D,3,"rootDirPath"],[D,3,"dockerfile"],[D,3,"hasDockerfile"],[D,3,"hasSourceCode"],[D,3,"name"],[D,3,"dockerImageName"],[D,3,"env"],[D,3,"packageJson"],[D,3,"packageJsonPath"],[D,3,"hasPrisma"],[D,3,"dockerPackageJson"],[D,3,"binExists"]]).e}argv=void S(this);pathByName=new Map;constructor(t,n,r){this._dirPath=e.resolve(t),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(a.readFileSync(e.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 a.existsSync(e.join(this.dirPath,"..","..","package.json"))?e.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return a.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return a.existsSync(e.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[t,n]=function(t,n){let r=(t.env??[]).map((t=>e.resolve(n,t.toString())));const s=t.cascadeEnv??(t.cascadeNodeEnv?process.env.NODE_ENV||"development":t.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof s){if(0===r.length&&(r.push(e.join(n,".env")),t.includeRootEnv)){const t=e.resolve(n,"..","..");a.existsSync(e.join(t,"package.json"))&&r.push(e.join(t,".env"))}r=r.flatMap((e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e]))}r=r.filter((e=>a.existsSync(e))).map((t=>e.relative(n,t))),t.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",r.join(", ")));const o=[],i={};for(const s of r){let r=0;for(const[t,o]of Object.entries(b(e.join(n,s))))t in i||(i[t]=o,r++);o.push([s,r]),t.verbose&&r>0&&console.info(`Read ${r} environment variables from ${s}`)}if(t.checkEnv){const s=Object.keys(b(e.join(n,t.checkEnv))||{}).filter((e=>!(e in i)));if(s.length>0)throw new Error(`Missing environment variables in [${r.join(", ")}]: [${s.join(", ")}]`)}return[i,o]}(this.argv,this.dirPath);for(const[e,t]of n)console.info(`Loaded ${t} environment variables from ${e}`);return{...process.env,...t}}get packageJson(){return JSON.parse(a.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return e.join(this.dirPath,"package.json")}get hasPrisma(){return!(!this.packageJson.dependencies?.prisma&&!this.packageJson.devDependencies?.prisma)}get dockerPackageJson(){return e.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(a.readFileSync(e.join(e.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let t=!1,n=this.dirPath;for(;;){const r=e.join(n,"node_modules",".bin");if(a.existsSync(r)&&(this.env.PATH=`${r}:${this.env.PATH}`,t=!0),a.existsSync(e.join(n,".git")))break;const s=e.dirname(n);if(n===s)break;n=s}return t}findFile(t){let n=this.pathByName.get(t);if(n)return n;if(n=[t,e.join("..","..",t)].map((t=>e.resolve(this.dirPath,t))).find((e=>a.existsSync(e))),!n)throw new Error(`File not found: ${t}`);return this.pathByName.set(t,n),n}}function B(t,n=!0,r){if(r??=process.cwd(),a.existsSync(e.join(r,"package.json")))return new _(r,t,n)}async function O(t,n=!0,r){const s=function(t,n=!0,r){if(r??=process.cwd(),!a.existsSync(e.join(r,"package.json")))return;const s=new _(r,t,n);let o=s;if(!s.packageJson.workspaces&&e.dirname(r).endsWith("/packages")){const s=e.resolve(r,"..","..");a.existsSync(e.join(s,"package.json"))&&(o=new _(s,t,n))}return{root:o,self:s}}(t,n,r);if(s)return{...s,descendants:s.root===s.self?await T(t,s.root,n):[s.self]}}async function T(t,n,r){const s=[n],o=n.packageJson.workspaces;if(!Array.isArray(o))return s;const i=[],c=[];for(const t of o.map((t=>e.join(n.dirPath,t))))a.existsSync(t)?c.push(t):i.push(t);c.push(...await d(i,{dot:!0,onlyDirectories:!0}));for(const n of c)a.existsSync(e.join(n,"package.json"))&&s.push(new _(n,t,r));return s}const I=process.argv[0].endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),C=I?"bun --bun run":"node",W=I?"bun":"yarn",V=I?"bun --bun run":"yarn",z={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(t){await async function(t,n){const s=B(t,!0,n);if(!s)return console.error(c.red("No project found.")),!0;if(t={...t,command:t.command??(I?"bun run build":"yarn build")},!a.existsSync(e.join(s.rootDirPath,".git")))return J(s,t),!0;const[o,d,l]=await async function(t,n){const s=e.resolve(t.dirPath,"node_modules",".cache","build"),o=e.resolve(s,"last-build");await a.promises.mkdir(s,{recursive:!0});const c=i("sha256"),d=r.execSync("git rev-parse HEAD",{cwd:t.dirPath}).toString().trim();c.update(d);const l=JSON.stringify(Object.entries(t.env).filter((([e])=>!F.has(e))).sort((([e],[t])=>e.localeCompare(t))));c.update(l),await async function(e,t,n){return new Promise((s=>{const o=r.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\/scripts\/test-fixtures\/[^/]+\//,""):t)).filter((e=>(Y.some((t=>e.includes(t)))||L.some((t=>e.endsWith(t))))&&!U.some((t=>e.includes(t)))));t.verbose&&console.info(`Changed files: ${o.join(", ")}`);const i=r.spawn("git",["diff","--",...o],{cwd:e.rootDirPath});i.stdout?.on("data",(e=>{n.update(e),t.verbose&&(console.info(e.toString()),console.info("Hash:",n.copy().digest("hex")))})),i.on("close",(()=>{s()}))}))}(t,n,c);const u=c.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}}((()=>a.promises.readFile(o,"utf8")));return[p===u,o,u]}(s,t);if(o)return console.info(c.green(`Skip to run '${t.command}' 💫`)),!1;if(!J(s,t))return;t.dryRun||await a.promises.writeFile(d,l,"utf8");return!0}(t)}};function J(e,t){if(console.info(c.green(`Run '${t.command}'`)),!t.dryRun){const n=r.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 F=new Set(["CI","PWDEBUG","TMPDIR"]);const Y=["src/","public/"],L=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],U=["test/","tests/","__tests__/","test-fixtures/"];const M=new Set;async function G(e){try{await u(e)}catch{}}const q=new p,H={exitIfFailed:!0};async function X(e,t,n,r=H){const[s,o]=Q(e,t);if(Z(s,t),n.verbose&&Z(o,t,"Start (raw)",!0),n.dryRun)return ee(s,0,r),0;const i=o.match(/http-get:\/\/127.0.0.1:(\d+)/)?.[1];o.includes("wait-on")&&i&&!o.includes("docker run")&&await async function(e){await G(e);const t=async()=>{M.has(e)||(M.add(e),await G(e))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,t)}(Number(i));const a=await y(o,void 0,{cwd:t.dirPath,env:te(t.env,r),shell:!0,stdio:"inherit",timeout:r?.timeout,killOnExit:!0,verbose:n.verbose});return ee(s,a.status,r),a.status??1}function K(e,t,n,r=H){return q.runAndWaitForReturnValue((async()=>{const[s,o]=Q(e,t);if(Z(s,t,"Start (parallel)",!0),n.dryRun)return Z(s,t,"Started (log)"),n.verbose&&Z(o,t,"Started (raw)",!0),ee(s,0,r),0;const i=await y(o,void 0,{cwd:t.dirPath,env:te(t.env,r),shell:!0,stdio:"pipe",timeout:r?.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});Z(s,t,"Started (log)"),n.verbose&&Z(o,t,"Started (raw)",!0);const a=i.stdout.trim();return a&&(process.stdout.write(a),process.stdout.write("\n")),ee(s,i.status,r),i.status??1}))}function Q(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 ",t.isBunAvailable?"bun --bun run ":"yarn run ");return I&&(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(),[ne(n.replaceAll("YARN ",`${V} `)),ne(n.replaceAll("YARN playwright ",`${V} playwright `).replaceAll("YARN ",!I&&t.binExists?"":`${V} `))]}function Z(e,t,n="Start",r=!1){console.info("\n"+(r?c.gray:c.cyan)(c.bold(`${n}:`),e)+c.gray(` at ${t.dirPath}`))}function ee(e,t,n){0===t?console.info(c.green(c.bold("Finished:"),e)):(console.info(c.red(c.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function te(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function ne(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const re=new Set(["cjs","cts","js","json","jsonc","jsx","mjs","mts","ts","tsx"]),se=new Set(["cjs","cts","htm","html","js","json","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),oe=new Set([...se].filter((e=>!re.has(e)))),ie={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(t){I||(console.error(c.red("This command is only available on Bun.")),process.exit(1));const n=await O(t,!1);n||(console.error(c.red("No project found.")),process.exit(1));const r=t.files??[];let s,o,i;if(r.length>0){const t=[],n=[],a=[];for(const s of r){const r=e.resolve(String(s));if(r.endsWith("/test-fixtures")||r.includes("/test-fixtures/"))continue;const o=e.extname(r).slice(1);r.endsWith("/package.json")?a.push(r):re.has(o)?t.push(r):se.has(o)&&n.push(r)}s=t.map((e=>`"${e}"`)).join(" "),o=n.map((e=>`"${e}"`)).join(" "),i=a.map((e=>`"${e}"`)).join(" ")}else s="",o=`"**/{.*/,}*.{${[...oe].join(",")}" "!**/test-fixtures/**"`,i=n.descendants.map((e=>`"${e.packageJsonPath}"`)).join(" ");const a=t.fix&&t.format?"check --fix":t.fix?"lint --fix":"lint";let d;(s||0===r.length)&&(d=K(`bun --bun biome ${a} --colors=force --no-errors-on-unmatched --files-ignore-unknown=true ${s}`,n.self,t,{forceColor:!0})),t.format&&(o&&K(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${o}`,n.self,t,{forceColor:!0}),i&&(await d,K(`bun --bun sort-package-json ${i}`,n.self,t,{forceColor:!0})))}};function*ae(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const ce={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(t){const n=await O(t);n||(console.error(c.red("No project found.")),process.exit(1));for(const r of ae("optimizeForDockerBuild",n.descendants)){const n=r.packageJson,s=["dependencies","devDependencies"];for(const e of s){const t=n[e]||{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(de(t,n),le(n),ue(n),t.dryRun)continue;const o=t.outside?e.join(r.dirPath,"dist"):r.dirPath;await a.promises.mkdir(o,{recursive:!0}),await a.promises.writeFile(e.join(o,"package.json"),JSON.stringify(n),"utf8")}t.dryRun||t.outside||(r.spawnSync(W,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function de(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies||{},r=["artillery","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","sort-package-json","wait-on","semantic-release","vitest"],s=[];for(const t of Object.keys(n))(r.some((e=>t.includes(e)))||!e.outside&&t.includes("willbooster")&&t.includes("config"))&&(delete n[t],s.push(t));console.info("Removed devDependencies:",s.join(", ")||"none")}function le(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.includes(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 ue(e){delete e.private,delete e.publishConfig,delete e.prettier}const pe=new class{deploy(e){return"PRISMA migrate deploy"}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} && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}litestream(e){return`${C} -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){return`PRISMA migrate deploy && PRISMA generate && ${this.seed(e)}`}migrateDev(e){return"PRISMA migrate dev"}reset(e){return`PRISMA migrate reset --force --skip-seed && ${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(t,n){const r="file:";let s="";if(n)try{new URL(n),s=`DATABASE_URL=${n} `}catch{s=`DATABASE_URL=${r}${e.resolve(n)} `}else if(t.env.DATABASE_URL?.startsWith(r)){const n=[{schemaPath:e.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:e.join("prisma","schema"),dbPath:e.join("prisma","schema")},{schemaPath:e.join("db","schema.prisma"),dbPath:"db"}];for(const{dbPath:o,schemaPath:i}of n)if(a.existsSync(e.resolve(t.dirPath,i))){s=`DATABASE_URL=${r}${e.resolve(t.dirPath,o,t.env.DATABASE_URL.slice(5))} `;break}}return`${s}PRISMA studio`}},me={},fe={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(he).command(be).command(ye).command(we).command(ve).command(ke).command($e).command(Ee).command(Ae).command(Ne).demandCommand(),handler(){}},he={command:"deploy",describe:"Apply migration to DB without initializing it",builder:me,async handler(e){const t=await xe(e);for(const n of ae("prisma deploy",t))await X(pe.deploy(n),n,e)}},ge={...me,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},be={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:ge,async handler(e){const t=await xe(e);for(const n of ae("prisma deploy-force",t))await X(pe.deployForce(n,e.backupPath),n,e)}},ye={command:"litestream",describe:"Setup DB for Litestream",builder:me,async handler(e){const t=await xe(e);for(const n of ae("prisma litestream",t))await X(pe.litestream(n),n,e)}},we={command:"migrate",describe:"Apply migration to DB with initializing it",builder:me,async handler(e){const t=await xe(e);for(const n of ae("prisma migrate",t))await X(pe.migrate(n),n,e)}},ve={command:"migrate-dev",describe:"Create a migration file",builder:me,async handler(e){const t=await xe(e);for(const n of ae("prisma migrate-dev",t))await X(pe.migrateDev(n),n,e)}},ke={command:"reset",describe:"Reset DB",builder:me,async handler(e){const t=await xe(e);for(const n of ae("prisma reset",t))await X(pe.reset(n),n,e)}},$e={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...ge,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await xe(e);for(const n of ae("prisma restore",t)){const t=e.output||(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await X(pe.restore(n,e.backupPath,t),n,e)}}},Ee={command:"seed",describe:"Populate DB with seed data",builder:{...me,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await xe(e);for(const n of ae("prisma seed",t))await X(pe.seed(n,e.file),n,e)}},Ae={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...me,"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 xe(e);for(const n of ae("prisma studio",t)){const t=e.restored?n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await X(pe.studio(n,t),n,e)}}},Ne={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await xe(e),n=`${e.args?.join(" ")??""}`.trimEnd();for(const r of ae(`prisma ${n}`,t))await X(`PRISMA ${n}`,r,e)}};async function xe(e){const t=await O(e);t||(console.error(c.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(c.red("No prisma project found.")),process.exit(1)),n}const Pe={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=B(e);t||(console.error(c.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${c.yellow(`#${s} Retrying: ${n.join(" ")}`)}`),r=await X(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 O(e,!1,t);n||(console.error(c.red("No project found.")),process.exit(1));for(const t of ae("setup",n.descendants)){const s=await f.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===h.platform()){const n=["pstree"];t.hasDockerfile&&n.push("expect"),await K(`brew install ${n.join(" ")}`,t,e)}s.some((e=>e.isFile()&&e.name.includes("-version")))&&await X("asdf install",t,e)}if(s.some((e=>e.isFile()&&"pyproject.toml"===e.name))){await K("poetry config virtualenvs.in-project true",t,e);const[,n]=r.execSync("asdf current python").toString().trim().split(/\s+/);await K(`poetry env use ${n}`,t,e),await q.promiseAll(),await X("poetry run pip install --upgrade pip",t,e),await X("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await X(`${V} gen-code`,t,e)}const s=n.descendants.find((e=>e.packageJson.devDependencies?.playwright));s&&await X(`${V} playwright install --with-deps`,s,e)}(e)}};const Re=new class{buildDevImage(t,n){const r=t.dockerPackageJson.scripts?.["docker/build/prepare"]?"yarn run docker/build/prepare && ":"";return`cd ${e.dirname(t.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${t.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo amd64)\n --build-arg WB_ENV=${t.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=async()=>{if(M.has(e))return;M.add(e),Z(e,t);const{status:n}=o(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ee(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e),`docker run --rm -it -p 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 De{constructor(e=Number(process.env.PORT)||3e3){this.defaultPort=e}buildDocker(e,t="development"){return Re.buildDevImage(e,t)}startDocker(e,t){return`${this.buildDocker(e)}\n && YARN concurrently --raw --kill-others-on-fail\n "${Re.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e,t,8080)}"`}testE2E(e,t,{playwrightArgs:n="test tests/e2e",prismaDirectory:r,startCommand:s}){const o=e.env.WB_ENV,i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`WB_ENV=${o} NEXT_PUBLIC_WB_ENV=${o} APP_ENV=${o} PORT=8080 YARN concurrently --kill-others --raw --success first\n "rm -Rf ${r}/mount && ${s} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080\n && BUN playwright ${"test tests/e2e"===n&&t.target?n.replace("tests/e2e",t.target):n}${i}"`}testE2EDev(e,t,{playwrightArgs:n="test tests/e2e",startCommand:r}){const s=e.env.WB_ENV,o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`WB_ENV=${s} NEXT_PUBLIC_WB_ENV=${s} APP_ENV=${s} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${r} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080\n && BUN playwright ${"test tests/e2e"===n&&t.target?n.replace("tests/e2e",t.target):n}${o}"`}testUnit(e,t){return`WB_ENV=${e.env.WB_ENV} YARN vitest run ${t.target||"tests/unit"} --color --passWithNoTests --allowOnly`}waitApp(e,t,n=this.defaultPort){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}`}waitAndOpenApp(e,t,n=this.defaultPort){return`${this.waitApp(e,t,n)} || wait-on http-get://127.0.0.1:${n} && open-cli http://\${HOST:-localhost}:${n}`}}const Se=new class extends De{constructor(){super()}start(e,t){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}YARN concurrently --raw --kill-others-on-fail\n "blitz dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}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 "${pe.reset(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:r=`${pe.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"db",startCommand:r})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r="blitz dev -p 8080"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r})}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "blitz dev" "${this.waitApp(e,t)}"`}};const _e=new class extends De{constructor(){super()}start(e,t){return`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${Re.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production PORT=\${PORT:-${n}} ${C} dist/index.js ${t.normalizedArgsText??""}`}testE2E(e,t,{startCommand:n=`${e.hasPrisma?"prisma migrate reset --force --skip-generate && ":""}(${this.startProduction(e,t)})`}){const r=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly${r}"`}testE2EDev(e,t,{startCommand:n}){const r=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n||this.start(e,t)} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly${r}"`}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "${this.start(e,t)}" "${this.waitApp(e,t)}"`}};const Be=new class extends De{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "next dev --turbopack ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?[pe.reset(e)]:[],e.buildCommand,`PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...e.hasPrisma?[pe.reset(e)]:[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].join(" && ")})}testE2EDev(e,t,{startCommand:n="next dev --turbopack -p 8080"}){return super.testE2EDev(e,t,{startCommand:n})}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "next dev --turbopack" "${this.waitApp(e,t)}"`}};const Oe=new class extends De{constructor(){super()}start(e,t){return`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${Re.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${C} dist/index.js ${t.normalizedArgsText??""}`}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return"echo 'do nothing.'"}};const Te=new class extends De{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "remix dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${pe.reset(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:r=`${pe.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"prisma",startCommand:r})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r="remix dev"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r})}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "remix dev" "${this.waitApp(e,t)}"`}},Ie=["express","fastify","elysia"],Ce={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",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 O(e);t||(console.error(c.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=Se;else if(t.next)s=Be;else if(r["@remix-run/dev"])s=Te;else if(Ie.some((e=>t[e]))&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))s=_e;else{if(!t["build-ts"]&&!r["build-ts"])continue;s=Oe}switch(console.info(`Running "start" for ${n.name} ...`),e.mode||"dev"){case"dev":case"development":{const r=We(t,"development");await X(`${r}${s.start(n,e)}`,n,e);break}case"staging":{const r=We(t,"staging");await X(`${r}${s.startProduction(n,e,8080)}`,n,e);break}case"docker":{const r=We(t,"staging");await X(`${r}${s.startDocker(n,e)}`,n,e);break}case"docker-debug":{const r=We(t,"staging");e.normalizedArgsText="'/bin/bash'",await X(`${r}${s.startDocker(n,e)}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function We(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 Ve={command:"test",describe:"Test project. If you pass no arguments, it will run all tests.",builder:{ci:{description:"Whether to run tests on CI",type:"boolean"},e2e:{description:"Whether to run e2e tests. You may pass mode as argument: none | headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string"},start:{description:"Whether to run start tests",type:"boolean"},unit:{description:"Whether to run unit tests",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"},target:{description:"Test target",type:"string",alias:"t"}},async handler(t){await async function(t){const n=await O(t);n||(console.error(c.red("No project found.")),process.exit(1));n.descendants.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const r=void 0===t.e2e&&void 0===t.start&&void 0===t.unit;for(const s of n.descendants){const n=s.packageJson.dependencies||{},o=s.packageJson.devDependencies||{};let i;i=n.blitz?Se:n.next?Be:o["@remix-run/dev"]?Te:Ie.some((e=>n[e]))&&!n["firebase-functions"]?_e:Oe,r&&(t={...t,e2e:a.existsSync(e.join(s.dirPath,"tests","e2e"))&&!t.target?.includes("/unit/")?"headless":"none",start:!0,unit:a.existsSync(e.join(s.dirPath,"tests","unit"))&&!t.target?.includes("/e2e/")}),console.info(`Running "test" for ${s.name} ...`);const c=[];if(!t.ci){switch(t.unit&&c.push(X(i.testUnit(s,t),s,t,{timeout:t.unitTimeout})),t.start&&c.push(X(i.testStart(s,t),s,t)),await Promise.all(c),t.e2e){case void 0:case"none":continue;case"":case"headless":await X(i.testE2E(s,t,{}),s,t);continue;case"headless-dev":await X(i.testE2EDev(s,t,{}),s,t);continue;case"docker":await ze(s,t,i);continue;case"docker-debug":await ze(s,t,i,`test ${t.target||"tests/e2e"} --debug`);continue}if(n.blitz||n.next||o["@remix-run/dev"])switch(t.e2e){case"headed":await X(i.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"headed-dev":await X(i.testE2EDev(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"debug":await X(i.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --debug`}),s,t);continue;case"generate":await X(i.testE2E(s,t,{playwrightArgs:"codegen http://localhost:8080"}),s,t);continue;case"trace":await X("BUN playwright show-trace",s,t);continue}throw new Error(`Unknown e2e mode: ${t.e2e}`)}if(await K(Re.stopAll(),s,t),t.unit&&await K(i.testUnit(s,t).replaceAll(" --allowOnly",""),s,t,{timeout:t.unitTimeout}),t.start&&await K(i.testStart(s,t),s,t),await q.promiseAll(),"none"!==t.e2e){s.hasDockerfile&&(process.env.WB_DOCKER||="1",await X(`${i.buildDocker(s,"test")}`,s,t));const e=s.hasDockerfile?{startCommand:Re.stopAndStart(s,!0)}:{};process.exitCode=await X(i.testE2E(s,t,e).replaceAll(" --allowOnly",""),s,t,{exitIfFailed:!1}),await X(Re.stop(s),s,t)}}}(t)}};async function ze(e,t,n,r){process.env.WB_DOCKER||="1",await X(`${n.buildDocker(e,"test")}`,e,t),process.exitCode=await X(`${n.testE2E(e,t,{playwrightArgs:r,startCommand:Re.stopAndStart(e,!0)})}`,e,t,{exitIfFailed:!1}),await X(Re.stop(e),e,t)}const Je={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(e){const t=await O(e,!1);t||(console.error(c.red("No project found.")),process.exit(1));const n=t.descendants.map((n=>{const r=[];if(n.packageJson.workspaces?n.hasSourceCode&&(n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&r.push("BUN tsc --noEmit --Pretty"):((n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&r.push("BUN tsc --noEmit --Pretty"),n.packageJson.devDependencies?.pyright&&r.push("YARN pyright")),r.length>0)return K(r.join(" && "),n,e,{ci:t.descendants.length>1,forceColor:!0})})),r=await Promise.all(n);let s=0;for(const[e,n]of r.entries())if(n){(t.descendants[e].packageJson.dependencies||{}).blitz&&console.info(c.yellow('Please try "yarn gen-code" if you face unknown type errors.')),s=n}s&&process.exit(s)}},Fe={...Je,command:"tc"},Ye={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"]}};await t(n(process.argv)).scriptName("wb").options(Ye).middleware((t=>{const n=t["working-dir"];if(n){const t=e.resolve(n);process.chdir(t)}!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(z).command(ie).command(ce).command(fe).command(Pe).command(je).command(Ce).command(Ve).command(Je).command(Fe).demandCommand().strict().help().argv;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,(()=>process.exit()));
10
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvY2FjbEhhc2guanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L21lbW9pemVPbmUuanMiLCIuLi9zcmMvcHJvamVjdC50cyIsIi4uL3NyYy91dGlscy9ydW50aW1lLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2xpbnQudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ByaXNtYS50cyIsIi4uL3NyYy9jb21tYW5kcy9yZXRyeS50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3R5cGVjaGVjay50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICBlbnY6IHtcbiAgICBkZXNjcmlwdGlvbjogJy5lbnYgZmlsZXMgdG8gYmUgbG9hZGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgJ2Nhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0Vudmlyb25tZW50IHRvIGxvYWQgY2FzY2FkaW5nIC5lbnYgZmlsZXMgKGUuZy4sIGAuZW52YCwgYC5lbnYuPGVudmlyb25tZW50PmAsIGAuZW52LmxvY2FsYCBhbmQgYC5lbnYuPGVudmlyb25tZW50Pi5sb2NhbGApLiBQcmVmZXJyZWQgb3ZlciBgY2FzY2FkZS1ub2RlLWVudmAgYW5kIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICAnY2FzY2FkZS1ub2RlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LiBQcmVmZXJyZWQgb3ZlciBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdhdXRvLWNhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PFdCX0VOViB8fCBOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdpbmNsdWRlLXJvb3QtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSAuZW52IGZpbGVzIGluIHJvb3QgZGlyZWN0b3J5IGlmIHRoZSBwcm9qZWN0IGlzIGluIGEgbW9ub3JlcG8gYW5kIC0tZW52IG9wdGlvbiBpcyBub3QgdXNlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnY2hlY2stZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ2hlY2sgd2hldGhlciB0aGUga2V5cyBvZiB0aGUgbG9hZGVkIC5lbnYgZmlsZXMgYXJlIHNhbWUgd2l0aCB0aGUgZ2l2ZW4gLmVudiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy5lbnYuZXhhbXBsZScsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzLlxuICogTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogQHJldHVybiBbZW52VmFycywgW2VudlBhdGhzLCBlbnZWYXJDb3VudF1bXV1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIFtzdHJpbmcsIG51bWJlcl1bXV0ge1xuICBsZXQgZW52UGF0aHMgPSAoYXJndi5lbnYgPz8gW10pLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgZW52UGF0aC50b1N0cmluZygpKSk7XG4gIGNvbnN0IGNhc2NhZGUgPVxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudlxuICAgICAgICA/IHByb2Nlc3MuZW52LldCX0VOViB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBjYXNjYWRlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChlbnZQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKGN3ZCwgJy5lbnYnKSk7XG4gICAgICBpZiAoYXJndi5pbmNsdWRlUm9vdEVudikge1xuICAgICAgICBjb25zdCByb290UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsICcuLicsICcuLicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdFBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihyb290UGF0aCwgJy5lbnYnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aHMgPSBlbnZQYXRocy5mbGF0TWFwKChlbnZQYXRoKSA9PlxuICAgICAgY2FzY2FkZVxuICAgICAgICA/IFtgJHtlbnZQYXRofS4ke2Nhc2NhZGV9LmxvY2FsYCwgYCR7ZW52UGF0aH0ubG9jYWxgLCBgJHtlbnZQYXRofS4ke2Nhc2NhZGV9YCwgZW52UGF0aF1cbiAgICAgICAgOiBbYCR7ZW52UGF0aH0ubG9jYWxgLCBlbnZQYXRoXVxuICAgICk7XG4gIH1cbiAgZW52UGF0aHMgPSBlbnZQYXRocy5maWx0ZXIoKGVudlBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZW52UGF0aCkpLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMuam9pbignLCAnKSk7XG4gIH1cblxuICBjb25zdCBlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlyczogW3N0cmluZywgbnVtYmVyXVtdID0gW107XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBlbnZQYXRoKSkpKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZW52VmFycykpIHtcbiAgICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzLnB1c2goW2VudlBhdGgsIGNvdW50XSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiBjb3VudCA+IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUmVhZCAke2NvdW50fSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSB8fCB7fSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykpO1xuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIFske2VudlBhdGhzLmpvaW4oJywgJyl9XTogWyR7bWlzc2luZ0tleXMuam9pbignLCAnKX1dYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbZW52VmFycywgZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnNdO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMgYW5kIGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICBPYmplY3QuYXNzaWduKHByb2Nlc3MuZW52LCBlbnZWYXJzKTtcbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbmNvbnN0IGNhY2hlZEVudlZhcnMgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcblxuZnVuY3Rpb24gcmVhZEVudkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZWRFbnZWYXJzLmdldChmaWxlUGF0aCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgcGFyc2VkID0gY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGZpbGVQYXRoKSwgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IHt9O1xuICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbGF0ZWQgdG8gbnBtIGFuZCB5YXJuIGZyb20gdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiB2b2lkIHtcbiAgLy8gUmVtb3ZlIG5wbSAmIHlhcm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcHJvY2Vzcy5lbnZcbiAgaWYgKGVudlZhcnMuUEFUSCAmJiBlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnZWYXJzLlBBVEggPSBlbnZWYXJzLlBBVEgucmVwbGFjZShgJHtlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiBtYWNPU1xuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ByaXZhdGVcXC92YXJcXC9mb2xkZXJzXFwvW146XSs6L2csICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGluIExpbnV4XG4gICAgICAucmVwbGFjZUFsbCgvXFwvdmFyXFwvdG1wXFwvW146XSs6L2csICcnKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3RtcFxcL1teOl0rOi9nLCAnJyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICBjb25zdCB1cHBlcktleSA9IGtleS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ05QTV8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnWUFSTl8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnQkVSUllfJykgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnUFJPSkVDVF9DV0QnIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ0lOSVRfQ1dEJ1xuICAgICkge1xuICAgICAgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgU3Bhd25PcHRpb25zLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlLFxuICBTcGF3blN5bmNSZXR1cm5zLFxuICBTdGRpb051bGwsXG4gIFN0ZGlvUGlwZSxcbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHRyZWVLaWxsIGZyb20gJ3RyZWUta2lsbCc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHN0b3BQcm9jZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc3RvcHBlZCB8fCAhcHJvYy5waWQpIHJldHVybjtcblxuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYHRyZWVLaWxsKCR7cHJvYy5waWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucz8ua2lsbE9uRXhpdCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICB9XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zPy5pbnB1dCkge1xuICAgICAgICBwcm9jLnN0ZGluPy53cml0ZShvcHRpb25zLmlucHV0KTtcbiAgICAgICAgcHJvYy5zdGRpbj8uZW5kKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsIi8qKlxuICogW2pzLXNoYTNde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9lbW4xNzgvanMtc2hhM31cbiAqXG4gKiBAdmVyc2lvbiAwLjkuM1xuICogQGF1dGhvciBDaGVuLCBZaS1DeXVhbiBbZW1uMTc4QGdtYWlsLmNvbV1cbiAqIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDIzXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuY29uc3QgdD1bLi4uXCIwMTIzNDU2Nzg5YWJjZGVmXCJdLHM9WzYsMTUzNiwzOTMyMTYsMTAwNjYzMjk2XSxpPVswLDgsMTYsMjRdLGU9WzEsMCwzMjg5OCwwLDMyOTA2LDIxNDc0ODM2NDgsMjE0NzUxNjQxNiwyMTQ3NDgzNjQ4LDMyOTA3LDAsMjE0NzQ4MzY0OSwwLDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjc3NywyMTQ3NDgzNjQ4LDEzOCwwLDEzNiwwLDIxNDc1MTY0MjUsMCwyMTQ3NDgzNjU4LDAsMjE0NzUxNjU1NSwwLDEzOSwyMTQ3NDgzNjQ4LDMyOTA1LDIxNDc0ODM2NDgsMzI3NzEsMjE0NzQ4MzY0OCwzMjc3MCwyMTQ3NDgzNjQ4LDEyOCwyMTQ3NDgzNjQ4LDMyNzc4LDAsMjE0NzQ4MzY1OCwyMTQ3NDgzNjQ4LDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjg5NiwyMTQ3NDgzNjQ4LDIxNDc0ODM2NDksMCwyMTQ3NTE2NDI0LDIxNDc0ODM2NDhdO2Z1bmN0aW9uIG8odCl7cmV0dXJuIG5ldyBoKDUxMixzLDUxMikudXBkYXRlKHQpLmhleCgpfWNvbnN0IG49dD0+e2NvbnN0IHM9W107Zm9yKGNvbnN0W2ksZV1vZiB0LmVudHJpZXMoKSlzW2ldPWU7cmV0dXJuIHN9O2NsYXNzIGh7YmxvY2tzPVtdO3M9W107cmVzZXQ9ITA7ZmluYWxpemVkPSExO2Jsb2NrPTA7c3RhcnQ9MDtsYXN0Qnl0ZUluZGV4PTA7Y29uc3RydWN0b3IodCxzLGkpe3RoaXMucGFkZGluZz1zLHRoaXMub3V0cHV0Qml0cz1pLHRoaXMuYmxvY2tDb3VudD0xNjAwLSh0PDwxKT4+NSx0aGlzLmJ5dGVDb3VudD10aGlzLmJsb2NrQ291bnQ8PDIsdGhpcy5vdXRwdXRCbG9ja3M9aT4+NSx0aGlzLmV4dHJhQnl0ZXM9KDMxJmkpPj4zO2ZvcihsZXQgdD0wO3Q8NTA7Kyt0KXRoaXMuc1t0XT0wfXVwZGF0ZSh0KXtpZih0aGlzLmZpbmFsaXplZCl0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbGl6ZSBhbHJlYWR5IGNhbGxlZFwiKTtjb25zdCBzPXRoaXMuYmxvY2tzLGU9dGhpcy5ieXRlQ291bnQsbz10Lmxlbmd0aCxuPXRoaXMuYmxvY2tDb3VudCxoPXRoaXMucztsZXQgbCxjLGY9MDtmb3IoO2Y8bzspe2lmKHRoaXMucmVzZXQpZm9yKHRoaXMucmVzZXQ9ITEsc1swXT10aGlzLmJsb2NrLGw9MTtsPG4rMTsrK2wpc1tsXT0wO2ZvcihsPXRoaXMuc3RhcnQ7ZjxvJiZsPGU7KytmKWM9dC5jb2RlUG9pbnRBdChmKXx8MCxjPDEyOD9zW2w+PjJdfD1jPDxpWzMmbCsrXTpjPDIwNDg/KHNbbD4+Ml18PSgxOTJ8Yz4+Nik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTpjPDU1Mjk2fHxjPj01NzM0ND8oc1tsPj4yXXw9KDIyNHxjPj4xMik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTooYz02NTUzNisoKDEwMjMmYyk8PDEwfDEwMjMmKHQuY29kZVBvaW50QXQoKytmKXx8MCkpLHNbbD4+Ml18PSgyNDB8Yz4+MTgpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjEyJjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pO2lmKHRoaXMubGFzdEJ5dGVJbmRleD1sLGw+PWUpe2Zvcih0aGlzLnN0YXJ0PWwtZSx0aGlzLmJsb2NrPXNbbl0sbD0wO2w8bjsrK2wpaFtsXV49c1tsXTtyKGgpLHRoaXMucmVzZXQ9ITB9ZWxzZSB0aGlzLnN0YXJ0PWx9cmV0dXJuIHRoaXN9ZmluYWxpemUoKXtpZih0aGlzLmZpbmFsaXplZClyZXR1cm47dGhpcy5maW5hbGl6ZWQ9ITA7Y29uc3QgdD10aGlzLmJsb2NrcztsZXQgcz10aGlzLmxhc3RCeXRlSW5kZXg7Y29uc3QgaT10aGlzLmJsb2NrQ291bnQsZT10aGlzLnM7aWYodFtzPj4yXXw9dGhpcy5wYWRkaW5nWzMmc10sdGhpcy5sYXN0Qnl0ZUluZGV4PT09dGhpcy5ieXRlQ291bnQpZm9yKHRbMF09dFtpXSxzPTE7czxpKzE7KytzKXRbc109MDtmb3IodFtpLTFdfD0yMTQ3NDgzNjQ4LHM9MDtzPGk7KytzKWVbc11ePXRbc107cihlKX1oZXgoKXt0aGlzLmZpbmFsaXplKCk7Y29uc3Qgcz10aGlzLmJsb2NrQ291bnQ7bGV0IGk9dGhpcy5zO2NvbnN0IGU9dGhpcy5vdXRwdXRCbG9ja3Msbz10aGlzLmV4dHJhQnl0ZXM7bGV0IGgsbD0wLGM9MCxmPVwiXCI7Zm9yKDtjPGU7KXtmb3IobD0wO2w8cyYmYzxlOysrbCwrK2MpaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSt0W2g+PjEyJjE1XSt0W2g+PjgmMTVdK3RbaD4+MjAmMTVdK3RbaD4+MTYmMTVdK3RbaD4+MjgmMTVdK3RbaD4+MjQmMTVdO2Mlcz09MCYmKGk9bihpKSxyKGkpLGw9MCl9cmV0dXJuIG8mJihoPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdLG8+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+aXQmb3QsdFswXV49ZVtvXSx0WzFdXj1lW28rMV19O2V4cG9ydHtvIGFzIHNoYTNfNTEyfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtmdW5jdGlvbiBuKG4sdCl7cmV0dXJuIHIoSlNPTi5zdHJpbmdpZnkoW24sdF0pKX1mdW5jdGlvbiB0KCl7cmV0dXJuXCJcIn1leHBvcnR7dCBhcyBjYWxjRW1wdHlIYXNoLG4gYXMgY2FsY0hhc2hXaXRoQ29udGV4dH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYWNsSGFzaC5qcy5tYXBcbiIsImltcG9ydHtjYWxjSGFzaFdpdGhDb250ZXh0IGFzIHQsY2FsY0VtcHR5SGFzaCBhcyBjfWZyb21cIi4vY2FjbEhhc2guanNcIjtjb25zdCBuPXIoe2NhbGNIYXNoOnR9KSxhPXIoe2NhbGNIYXNoOmN9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmM9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGNhbGNIYXNoOm49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGEpe2xldCByLG8sZTtyZXR1cm5cImdldHRlclwiPT09YT8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGE9bih0aGlzLFtdKSxzPURhdGUubm93KCk7cmV0dXJuKGUhPT1hfHxzLW8+YykmJihlPWEscj10LmNhbGwodGhpcyksbz1zKSxyfTpmdW5jdGlvbiguLi5zKXtjb25zdCBpPW4odGhpcyxzKSx1PURhdGUubm93KCk7cmV0dXJuKGUhPT1pfHx1LW8+YykmJihlPWkscj1hP3QuY2FsbCh0aGlzLC4uLnMpOnQoLi4ucyksbz11KSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGEgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKF58XFxuKWJ1blxccy8udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ1lBUk4gcnVuIGJ1aWxkJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkXG4gICAgICAgID8gYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gXG4gICAgICAgIDogXCJlY2hvICdObyBidWlsZCBzY3JpcHQnXCI7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMubG9hZEVudikgcmV0dXJuIHByb2Nlc3MuZW52O1xuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBbZW52UGF0aCwgY291bnRdIG9mIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke2NvdW50fSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICAgIC8vIE92ZXJ3cml0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZXZlbiB0aG91Z2ggdGhpcyBiZWhhdmlvciBpcyBub24tc3RhbmRhcmRcbiAgICAvLyBiZWNhdXNlIGBidW4gd2IgLi4uYCB3aWxsIGxvYWQgLmVudiBhbmQgLmVudi5sb2NhbCBiZWZvcmUgYHdiYCBsb2FkcyBvdGhlciB2YXJpYWJsZXMuXG4gICAgcmV0dXJuIHsgLi4ucHJvY2Vzcy5lbnYsIC4uLmVudlZhcnMgfTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsncHJpc21hJ10gfHwgdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LlsncHJpc21hJ10pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGJpbkZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5kaXJQYXRoO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgICAgdGhpcy5lbnYuUEFUSCA9IGAke2JpblBhdGh9OiR7dGhpcy5lbnYuUEFUSH1gO1xuICAgICAgICBiaW5Gb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJpbkZvdW5kO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID0gcHJvY2Vzcy5hcmd2WzBdLmVuZHNXaXRoKCcvYnVuJykgfHwgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGFyZ3YuY29tbWFuZCA/PyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIH07XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLmdpdCcpKSkge1xuICAgIGJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgW2NhblNraXAsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXSA9IGF3YWl0IGNhblNraXBCdWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKGNhblNraXApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFNraXAgdG8gcnVuICcke2FyZ3YuY29tbWFuZH0nIPCfkqtgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFidWlsZChwcm9qZWN0LCBhcmd2KSkgcmV0dXJuO1xuXG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2gsICd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYW5Ta2lwQnVpbGQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj5cbik6IFByb21pc2U8W2Jvb2xlYW4sIHN0cmluZywgc3RyaW5nXT4ge1xuICBjb25zdCBjYWNoZURpcmVjdG9yeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5jYWNoZScsICdidWlsZCcpO1xuICBjb25zdCBjYWNoZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNhY2hlRGlyZWN0b3J5UGF0aCwgJ2xhc3QtYnVpbGQnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoY2FjaGVEaXJlY3RvcnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2dpdCByZXYtcGFyc2UgSEVBRCcsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGggfSkudG9TdHJpbmcoKS50cmltKCk7XG4gIGhhc2gudXBkYXRlKGNvbW1pdEhhc2gpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50SnNvbiA9IEpTT04uc3RyaW5naWZ5KFxuICAgIE9iamVjdC5lbnRyaWVzKHByb2plY3QuZW52KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFpZ25vcmluZ0VudlZhck5hbWVzLmhhcyhrZXkpKVxuICAgICAgLnNvcnQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnZGlmZicsICctLW5hbWUtb25seSddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSByZXQuc3Rkb3V0XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3NjcmlwdHNcXC90ZXN0LWZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oZGF0YS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAgeyBiZWZvcmVSZXRyeSwgaGFuZGxlRXJyb3IsIHJldHJ5Q291bnQgPSAzLCByZXRyeUxvZ2dlciwgc2xlZXBNaWxsaXNlY29uZHMgPSAwIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIGVycm9yLnN0YWNrIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0KTtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHBvcnQgPSBydW5uYWJsZVNjcmlwdC5tYXRjaCgvaHR0cC1nZXQ6XFwvXFwvMTI3LjAuMC4xOihcXGQrKS8pPy5bMV07XG4gIGlmIChydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnd2FpdC1vbicpICYmIHBvcnQgJiYgIXJ1bm5hYmxlU2NyaXB0LmluY2x1ZGVzKCdkb2NrZXIgcnVuJykpIHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChOdW1iZXIocG9ydCkpO1xuICB9XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHM/LnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzPy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FwaXRhbGl6ZWQgY29tbWFuZHMgKGUuZy4sIFlBUk4sIFBSSVNNQSwgQlVOKSB3aXRoIHN1aXRhYmxlIGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuIC0tYnVuKSBydW5gXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ3lhcm4gcnVuICcpO1xuICBpZiAoaXNSdW5uaW5nT25CdW4pIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gLS1idW4gcnVuIGJ1biAtLWJ1biBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpXG4gICAgICAucmVwbGFjZUFsbCgvKD86WUFSTiApP3ZpdGVzdCBydW4vZywgJ2J1biB0ZXN0JylcbiAgICAgIC8vICctLWFsbG93T25seScgaXMgc29tZXRpbWVzIHJlbW92ZWQuXG4gICAgICAucmVwbGFjZUFsbCgvIC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMoPzogLS1hbGxvd09ubHkpPy9nLCAnJyk7XG4gIH1cbiAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0LnRyaW0oKTtcbiAgcmV0dXJuIFtcbiAgICBmaXhCdW5Db21tYW5kKG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCkpLFxuICAgIGZpeEJ1bkNvbW1hbmQoXG4gICAgICBuZXdTY3JpcHRcbiAgICAgICAgLy8gQmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBgeWFybiBwbGF5d3JpZ2h0YCBpbiBhIHByb2plY3QgZGVwZW5kaW5nIG9uIGBhcnRpbGxlcnktZW5naW5lLXBsYXl3cmlnaHRgLlxuICAgICAgICAucmVwbGFjZUFsbCgnWUFSTiBwbGF5d3JpZ2h0ICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgICAgICAucmVwbGFjZUFsbCgnWUFSTiAnLCAhaXNSdW5uaW5nT25CdW4gJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYClcbiAgICApLFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QsIHByZWZpeCA9ICdTdGFydCcsIHdlYWsgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgJ1xcbicgK1xuICAgICAgKHdlYWsgPyBjaGFsay5ncmF5IDogY2hhbGsuY3lhbikoY2hhbGsuYm9sZChgJHtwcmVmaXh9OmApLCBub3JtYWxpemVkU2NyaXB0KSArXG4gICAgICBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBleGl0Q29kZTogbnVtYmVyIHwgbnVsbCxcbiAgb3B0czogT21pdDxPcHRpb25zLCAndGltZW91dCc+XG4pOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBzY3JpcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTogYCksIHNjcmlwdCkpO1xuICAgIGlmIChvcHRzLmV4aXRJZkZhaWxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSA/PyAxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uZmlndXJlRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiwgb3B0czogT3B0aW9ucyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0VudlsnQ0knXSA9ICcxJztcbiAgfVxuICBpZiAob3B0cy5mb3JjZUNvbG9yKSB7XG4gICAgbmV3RW52WydGT1JDRV9DT0xPUiddID0gJzMnO1xuICB9XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvMTQzNTlcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgfHxcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwbGF5d3JpZ2h0JykgfHxcbiAgICAvLyBcImJ1biAtLWJ1biBwcmlzbWEgZ2VuZXJhdGVcIiBkb2Vzbid0IHdvcmtcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwcmlzbWEnKSB8fFxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnKVxuICAgID8gY29tbWFuZC5yZXBsYWNlQWxsKCdidW4gLS1idW4nLCAnYnVuJylcbiAgICA6IGNvbW1hbmQ7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZpeDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRml4IHRoZSBsaW50aW5nIGVycm9ycycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBmb3JtYXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Zvcm1hdCB0aGUgY29kZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYmlvbWVFeHRlbnNpb25zID0gbmV3IFNldChbJ2NqcycsICdjdHMnLCAnanMnLCAnanNvbicsICdqc29uYycsICdqc3gnLCAnbWpzJywgJ210cycsICd0cycsICd0c3gnXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIWJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdsaW50IFtmaWxlcy4uLl0nLFxuICBkZXNjcmliZTogJ0xpbnQgY29kZSBvbiBCdW4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoIWlzUnVubmluZ09uQnVuKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG9ubHkgYXZhaWxhYmxlIG9uIEJ1bi4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZXMgPSBhcmd2LmZpbGVzID8/IFtdO1xuICAgIGxldCBiaW9tZUFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgbGV0IHByZXR0aWVyQXJnc1RleHQ6IHN0cmluZztcbiAgICBsZXQgc29ydFBhY2thZ2VKc29uQXJnc1RleHQ6IHN0cmluZztcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXI6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShTdHJpbmcoZmlsZSkpO1xuICAgICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHwgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnNsaWNlKDEpO1xuICAgICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZS5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllci5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmlvbWVBcmdzVGV4dCA9IGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZS5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICAgIHByZXR0aWVyQXJnc1RleHQgPSBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllci5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0ID0gcGFja2FnZUpzb25GaWxlUGF0aHMubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJpb21lQXJnc1RleHQgPSAnJztcbiAgICAgIHByZXR0aWVyQXJnc1RleHQgPSBgXCIqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9XCIgXCIhKiovdGVzdC1maXh0dXJlcy8qKlwiYDtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBgXCIke3AucGFja2FnZUpzb25QYXRofVwiYCkuam9pbignICcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpb21lQ29tbWFuZCA9IGFyZ3YuZml4ICYmIGFyZ3YuZm9ybWF0ID8gJ2NoZWNrIC0tZml4JyA6IGFyZ3YuZml4ID8gJ2xpbnQgLS1maXgnIDogJ2xpbnQnO1xuICAgIGxldCBiaW9tZVByb21pc2U6IFByb21pc2U8bnVtYmVyPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYmlvbWVBcmdzVGV4dCB8fCBmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJpb21lUHJvbWlzZSA9IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gICAgICAgIGBidW4gLS1idW4gYmlvbWUgJHtiaW9tZUNvbW1hbmR9IC0tY29sb3JzPWZvcmNlIC0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCAtLWZpbGVzLWlnbm9yZS11bmtub3duPXRydWUgJHtiaW9tZUFyZ3NUZXh0fWAsXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHsgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgIGlmIChwcmV0dGllckFyZ3NUZXh0KSB7XG4gICAgICAgIHZvaWQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgICBgYnVuIC0tYnVuIHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgJHtwcmV0dGllckFyZ3NUZXh0fWAsXG4gICAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHsgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc29ydFBhY2thZ2VKc29uQXJnc1RleHQpIHtcbiAgICAgICAgYXdhaXQgYmlvbWVQcm9taXNlO1xuICAgICAgICB2b2lkIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJ1biAtLWJ1biBzb3J0LXBhY2thZ2UtanNvbiAke3NvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0fWAsIHByb2plY3RzLnNlbGYsIGFyZ3YsIHtcbiAgICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gfHwge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgICAgIGRlcHNbbmFtZV0gPSBgLi8ke25hbWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmluZm8oJ0luc3RhbGxlZCBkZXBlbmRlbmNpZXMuJyk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWFyZ3Yub3V0c2lkZSkge1xuICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gICAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2VzbGludCcsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAnc2VtYW50aWMtcmVsZWFzZScsXG4gICAgJ3ZpdGVzdCcsXG4gIF07XG4gIGNvbnN0IHJlbW92ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGV2RGVwcykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNUb0JlUmVtb3ZlZC5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgKCFhcmd2Lm91dHNpZGUgJiYgbmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIC8vIFN1cHBvcnQgXCJodXNreVwiIHNpbmNlIGh1c2t5IHY5IHJlcXVpcmVzIGBcInBvc3RpbnN0YWxsXCI6IFwiaHVza3lcImBcbiAgICAgIGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IGNvbnRlbnQuaW5jbHVkZXMod29yZCkgfHwgY29udGVudC50cmltKCkgPT09IHdvcmQudHJpbSgpKVxuICAgICkge1xuICAgICAgZGVsZXRlIHNjcmlwdHNbbmFtZV07XG4gICAgICByZW1vdmVkU2NyaXB0cy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgc2NyaXB0czonLCByZW1vdmVkU2NyaXB0cy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJpdmF0ZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWc7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcmV0dGllcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgIG9yIGBZQVJOIGJsaXR6IHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGRlcGxveShfOiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ1BSSVNNQSBtaWdyYXRlIGRlcGxveSc7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0LCBiYWNrdXBQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzKjsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAmJiBybSAtUmYgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMqXG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgLW8gJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMgJHtiYWNrdXBQYXRofSAmJiBBTExPV19UT19TS0lQX1NFRUQ9MCBQUklTTUEgbWlncmF0ZSBkZXBsb3lgO1xuICB9XG5cbiAgbGl0ZXN0cmVhbShfOiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cnVudGltZVdpdGhBcmdzfSAtZSAnXG5jb25zdCB7IFByaXNtYUNsaWVudCB9ID0gcmVxdWlyZShcIkBwcmlzbWEvY2xpZW50XCIpO1xubmV3IFByaXNtYUNsaWVudCgpLiRxdWVyeVJhd1xcYFBSQUdNQSBqb3VybmFsX21vZGUgPSBXQUw7XFxgXG4gIC5jYXRjaCgoZXJyb3IpID0+IHsgY29uc29sZS5sb2coXCJGYWlsZWQgZHVlIHRvOlwiLCBlcnJvcik7IHByb2Nlc3MuZXhpdCgxKTsgfSk7XG4nYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJiYgUFJJU01BIGdlbmVyYXRlICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIC8vIEJsaXR6IGRvZXMgbm90IHRyaWdnZXIgc2VlZCBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBuZWVkIHRvIHJ1biBpdCBtYW51YWxseS5cbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQgJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgICAvLyBJJ20gbm90IHN1cmUgd2h5IHdlIG5lZWQgdG8gcmVtb3ZlIGFsbCBzcWxpdGUgZmlsZXMsIHNvIEkgY29tbWVudGVkIG91dCB0aGUgZm9sbG93aW5nIGxpbmUuXG4gICAgLy8gcmV0dXJuIGB0cnVlICQocm0gLVJmIGRiLyoqLyouc3FsaXRlKiAyPiAvZGV2L251bGwpICYmIHRydWUgJChybSAtUmYgcHJpc21hLyoqLyouc3FsaXRlKiAyPiAvZGV2L251bGwpICYmIFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQgJiYgJHt0aGlzLnNlZWQoKX1gO1xuICB9XG5cbiAgcmVzdG9yZShwcm9qZWN0OiBQcm9qZWN0LCBiYWNrdXBQYXRoOiBzdHJpbmcsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10gPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgcmV0dXJuIGBybSAtUmYgJHtkaXJOYW1lfS9yZXN0b3JlZC5zcWxpdGUzOyBHT09HTEVfQVBQTElDQVRJT05fQ1JFREVOVElBTFM9Z2NwLXNhLWtleS5qc29uIGxpdGVzdHJlYW0gcmVzdG9yZSAtbyAke291dHB1dFBhdGh9ICR7YmFja3VwUGF0aH1gO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSlcbiAgICAgIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5bJ3NlZWQnXSkgcmV0dXJuIGBZQVJOIHByaXNtYSBkYiBzZWVkYDtcbiAgICByZXR1cm4gYGlmIFsgLWUgXCJwcmlzbWEvc2VlZHMudHNcIiBdOyB0aGVuIEJVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzOyBmaWA7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgUE9TU0lCTEVfUEFUSFMgPSBbXG4gICAgICAgIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdwcmlzbWEnIH0sXG4gICAgICAgIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJyksIGRiUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJykgfSxcbiAgICAgICAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ2RiJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAnZGInIH0sXG4gICAgICBdO1xuICAgICAgZm9yIChjb25zdCB7IGRiUGF0aCwgc2NoZW1hUGF0aCB9IG9mIFBPU1NJQkxFX1BBVEhTKSB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIHNjaGVtYVBhdGgpKSkge1xuICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgIHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgICAgIGRiUGF0aCxcbiAgICAgICAgICAgIHByb2plY3QuZW52LkRBVEFCQVNFX1VSTC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHByaXNtYUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdwcmlzbWEnLFxuICBkZXNjcmliZTogJ1J1biBwcmlzbWEgY29tbWFuZHMnLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHtcbiAgICByZXR1cm4geWFyZ3NcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKTtcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95KHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdiYWNrdXAtcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2InLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlcGxveUZvcmNlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlIDxiYWNrdXAtcGF0aD4nLFxuICBkZXNjcmliZTogXCJGb3JjZSB0byBhcHBseSBtaWdyYXRpb24gdG8gREIgdXRpbGl6aW5nIExpdGVzdHJlYW0ncyBiYWNrdXAgd2l0aG91dCBpbml0aWFsaXppbmcgaXRcIixcbiAgYnVpbGRlcjogZGVwbG95Rm9yY2VCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0LCBhcmd2LmJhY2t1cFBhdGgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBsaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBEQiBmb3IgTGl0ZXN0cmVhbScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBsaXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlJyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlRGV2KHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmRlcGxveUZvcmNlQnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgcmVzdG9yZWQgZGF0YWJhc2UuIERlZmF1bHRzIHRvIFwiPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZSA8YmFja3VwLXBhdGg+JyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICBhcmd2Lm91dHB1dCB8fFxuICAgICAgICAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJyA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMycpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzdG9yZShwcm9qZWN0LCBhcmd2LmJhY2t1cFBhdGgsIG91dHB1dCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIFByaXNtYSBTdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHN0dWRpbycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgZGJVcmxPclBhdGggPSBhcmd2LnJlc3RvcmVkXG4gICAgICAgID8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXVxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOiAnUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHByaXNtYSBhcyBpcycsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gYCR7YXJndi5hcmdzPy5qb2luKCcgJykgPz8gJyd9YC50cmltRW5kKCk7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChgcHJpc21hICR7c2NyaXB0fWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBQUklTTUEgJHtzY3JpcHR9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gZmluZFByaXNtYVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maWx0ZXIoXG4gICAgKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddIHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgICBwYWNrYWdlcy5wdXNoKCdleHBlY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmluZCgocCkgPT4gcC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnBsYXl3cmlnaHQpO1xuICBpZiAocHJvamVjdCkge1xuICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGREZXZJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAneWFybiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyBhbWQ2NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0gLmA7XG4gIH1cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIHVuYnVmZmVyID0gZmFsc2UsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dW5idWZmZXIgPyAndW5idWZmZXIgJyA6ICcnfSR7dGhpcy5zdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBhZGRpdGlvbmFsT3B0aW9ucyxcbiAgICAgIGFkZGl0aW9uYWxBcmdzXG4gICAgKX1gO1xuICB9XG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtIC1pdCAtcCA4MDgwOjgwODAgLS1uYW1lICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbE9wdGlvbnN9ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbEFyZ3N9YDtcbiAgfVxuXG4gIHN0b3AocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIGNvbnRhaW5lciBscyAtcSAtZiBuYW1lPSR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9KSAyPiAvZGV2L251bGwpYDtcbiAgfVxuXG4gIHN0b3BBbGwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgcHMgLXEpIDI+IC9kZXYvbnVsbClgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkb2NrZXJTY3JpcHRzID0gbmV3IERvY2tlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRURldk9wdGlvbnMge1xuICAvLyAnLS1lMmUgZ2VuZXJhdGUnIGNhbGxzICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCdcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmc7XG4gIHN0YXJ0Q29tbWFuZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFT3B0aW9ucyBleHRlbmRzIFRlc3RFMkVEZXZPcHRpb25zIHtcbiAgcHJpc21hRGlyZWN0b3J5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRQb3J0ID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQpIHx8IDMwMDApIHt9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbiA9ICdkZXZlbG9wbWVudCcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkb2NrZXJTY3JpcHRzLmJ1aWxkRGV2SW1hZ2UocHJvamVjdCwgdmVyc2lvbik7XG4gIH1cblxuICBhYnN0cmFjdCBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuXG4gIGFic3RyYWN0IHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9XG4gICAgICAmJiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgICAgXCIke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICAgKX1cIlxuICAgICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCA4MDgwKX1cImA7XG4gIH1cblxuICB0ZXN0RTJFKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3RzL2UyZScsIHByaXNtYURpcmVjdG9yeSwgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZW52ID0gcHJvamVjdC5lbnYuV0JfRU5WO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICByZXR1cm4gYFdCX0VOVj0ke2Vudn0gTkVYVF9QVUJMSUNfV0JfRU5WPSR7ZW52fSBBUFBfRU5WPSR7ZW52fSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwicm0gLVJmICR7cHJpc21hRGlyZWN0b3J5fS9tb3VudCAmJiAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMTo4MDgwXG4gICAgICAgICYmIEJVTiBwbGF5d3JpZ2h0ICR7cGxheXdyaWdodEFyZ3MgPT09ICd0ZXN0IHRlc3RzL2UyZScgJiYgYXJndi50YXJnZXQgPyBwbGF5d3JpZ2h0QXJncy5yZXBsYWNlKCd0ZXN0cy9lMmUnLCBhcmd2LnRhcmdldCkgOiBwbGF5d3JpZ2h0QXJnc30ke3N1ZmZpeH1cImA7XG4gIH1cblxuICB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3RzL2UyZScsIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODBcbiAgICAgICAgJiYgQlVOIHBsYXl3cmlnaHQgJHtwbGF5d3JpZ2h0QXJncyA9PT0gJ3Rlc3QgdGVzdHMvZTJlJyAmJiBhcmd2LnRhcmdldCA/IHBsYXl3cmlnaHRBcmdzLnJlcGxhY2UoJ3Rlc3RzL2UyZScsIGFyZ3YudGFyZ2V0KSA6IHBsYXl3cmlnaHRBcmdzfSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIGFic3RyYWN0IHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuXG4gIHRlc3RVbml0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2KTogc3RyaW5nIHtcbiAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gWUFSTiB2aXRlc3QgcnVuICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL3VuaXQnfSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QXBwKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSB0aGlzLmRlZmF1bHRQb3J0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHdhaXQtb24gLXQgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgNTAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDEwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAyMDAwMCAtaSA0MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDYwMDAwIC1pIDUwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IHRoaXMuZGVmYXVsdFBvcnQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYXJndixcbiAgICAgIHBvcnRcbiAgICApfSB8fCB3YWl0LW9uIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgb3Blbi1jbGkgaHR0cDovL1xcJHtIT1NUOi1sb2NhbGhvc3R9OiR7cG9ydH1gO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIEJsaXR6LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBCbGl0elNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBhcHBFbnYgPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgQVBQX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gYCA6ICcnO1xuICAgIHJldHVybiBgJHthcHBFbnZ9WUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcImJsaXR6IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBhcHBFbnYgPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgQVBQX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gYCA6ICcnO1xuICAgIHJldHVybiBgJHthcHBFbnZ9Tk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpfSAmJiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKFxuICAgICAgICAnZWNvc3lzdGVtLmNvbmZpZy5janMnXG4gICAgICApfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBzdGFydENvbW1hbmQgPSBgJHtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpfSAmJiAke1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZFxuICAgICAgfSAmJiBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAnZGInLFxuICAgICAgc3RhcnRDb21tYW5kLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCA9ICdibGl0eiBkZXYgLXAgODA4MCcgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwiYmxpdHogZGV2XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGJsaXR6U2NyaXB0cyA9IG5ldyBCbGl0elNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEh0dHBTZXJ2ZXJTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICl9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gODA4MCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uICR7XG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZFxuICAgIH0gJiYgTk9ERV9FTlY9cHJvZHVjdGlvbiBQT1JUPVxcJHtQT1JUOi0ke3BvcnR9fSAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAge1xuICAgICAgc3RhcnRDb21tYW5kID0gYCR7cHJvamVjdC5oYXNQcmlzbWEgPyAncHJpc21hIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtZ2VuZXJhdGUgJiYgJyA6ICcnfSgke3RoaXMuc3RhcnRQcm9kdWN0aW9uKFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApfSlgLFxuICAgIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMTo4MDgwICYmIHZpdGVzdCBydW4gJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIHsgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVEZXZPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFdCX0VOVj0ke1xuICAgICAgcHJvamVjdC5lbnYuV0JfRU5WXG4gICAgfSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmQgfHwgdGhpcy5zdGFydChwcm9qZWN0LCBhcmd2KX0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMTo4MDgwICYmIHZpdGVzdCBydW4gJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCIke3RoaXMuc3RhcnQocHJvamVjdCwgYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2XG4gICAgKX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwibmV4dCBkZXYgLS10dXJib3BhY2sgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke1tcbiAgICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCldIDogW10pLFxuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YCxcbiAgICAgIF0uam9pbignICYmICcpfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3M6IG9wdGlvbnMucGxheXdyaWdodEFyZ3MsXG4gICAgICBwcmlzbWFEaXJlY3Rvcnk6ICdkYicsXG4gICAgICBzdGFydENvbW1hbmQ6XG4gICAgICAgIG9wdGlvbnMuc3RhcnRDb21tYW5kID8/XG4gICAgICAgIFtcbiAgICAgICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBbcHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KV0gOiBbXSksXG4gICAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgICBdLmpvaW4oJyAmJiAnKSxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHN0YXJ0Q29tbWFuZCA9ICduZXh0IGRldiAtLXR1cmJvcGFjayAtcCA4MDgwJyB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcIm5leHQgZGV2IC0tdHVyYm9wYWNrXCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICApfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIE5PREVfRU5WPXByb2R1Y3Rpb24gJHtydW50aW1lV2l0aEFyZ3N9IGRpc3QvaW5kZXguanMgJHtcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgfWA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5BcHBTY3JpcHRzID0gbmV3IFBsYWluQXBwU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwicmVtaXggZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpfSAmJiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKFxuICAgICAgICAnZWNvc3lzdGVtLmNvbmZpZy5janMnXG4gICAgICApfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBzdGFydENvbW1hbmQgPSBgJHtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpfSAmJiAke1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZFxuICAgICAgfSAmJiBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHByaXNtYURpcmVjdG9yeTogJ3ByaXNtYScsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgPSAncmVtaXggZGV2JyB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJyZW1peCBkZXZcIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVtaXhTY3JpcHRzID0gbmV3IFJlbWl4U2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYSddO1xuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXJncywgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc3RhcnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0YXJ0IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6ICdTdGFydCBhcHAnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICAgIGlmIChkZXBzWydibGl0eiddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHNbJ25leHQnXSkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgfHwgJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ2RldmVsb3BtZW50Jyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnQocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhZ2luZyc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2LCA4MDgwKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3N0YWdpbmcnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3N0YWdpbmcnKTtcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA9IGAnL2Jpbi9iYXNoJ2A7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFydCBtb2RlOiAke2FyZ3YubW9kZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sIHdiRW52OiBzdHJpbmcpOiBzdHJpbmcge1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9IHdiRW52O1xuICBsZXQgcHJlZml4ID0gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gYDtcbiAgaWYgKGRlcHNbJ25leHQnXSkge1xuICAgIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1dCX0VOViA9IHByb2Nlc3MuZW52LldCX0VOVjtcbiAgICBwcmVmaXggKz0gYE5FWFRfUFVCTElDX1dCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gYDtcbiAgfVxuICByZXR1cm4gcHJlZml4O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXJncyhcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj5cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKV1cbiAgICAubWFwKChhcmcpID0+IGAnJHthcmd9J2ApXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSkubWFwKChhcmcpID0+IGAnJHthcmd9J2ApLmpvaW4oJyAnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY2k6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gcnVuIHRlc3RzIG9uIENJJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGUyZToge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1doZXRoZXIgdG8gcnVuIGUyZSB0ZXN0cy4gWW91IG1heSBwYXNzIG1vZGUgYXMgYXJndW1lbnQ6IG5vbmUgfCBoZWFkbGVzcyAoZGVmYXVsdCkgfCBoZWFkbGVzcy1kZXYgfCBoZWFkZWQgfCBoZWFkZWQtZGV2IHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgZGVidWcgfCBnZW5lcmF0ZSB8IHRyYWNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgc3RhcnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gcnVuIHN0YXJ0IHRlc3RzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHVuaXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gcnVuIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ3VuaXQtdGltZW91dCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWVvdXQgZm9yIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxuICB0YXJnZXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Rlc3QgdGFyZ2V0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3QnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+O1xuXG5leHBvcnQgY29uc3QgdGVzdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAndGVzdCcsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0LiBJZiB5b3UgcGFzcyBubyBhcmd1bWVudHMsIGl0IHdpbGwgcnVuIGFsbCB0ZXN0cy4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0KGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICBwcm9jZXNzLmVudi5DSSA9ICcxJztcbiAgfVxuICBwcm9jZXNzLmVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IGFyZ3YuZTJlID09PSB1bmRlZmluZWQgJiYgYXJndi5zdGFydCA9PT0gdW5kZWZpbmVkICYmIGFyZ3YudW5pdCA9PT0gdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzWydibGl0eiddKSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRSdW5BbGxUZXN0cykge1xuICAgICAgYXJndiA9IHtcbiAgICAgICAgLi4uYXJndixcbiAgICAgICAgZTJlOlxuICAgICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3RzJywgJ2UyZScpKSAmJiAhYXJndi50YXJnZXQ/LmluY2x1ZGVzKCcvdW5pdC8nKVxuICAgICAgICAgICAgPyAnaGVhZGxlc3MnXG4gICAgICAgICAgICA6ICdub25lJyxcbiAgICAgICAgc3RhcnQ6IHRydWUsXG4gICAgICAgIHVuaXQ6IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3RzJywgJ3VuaXQnKSkgJiYgIWFyZ3YudGFyZ2V0Py5pbmNsdWRlcygnL2UyZS8nKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx1bmtub3duPltdID0gW107XG4gICAgaWYgKGFyZ3YuY2kpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoZG9ja2VyU2NyaXB0cy5zdG9wQWxsKCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgaWYgKGFyZ3YudW5pdCkge1xuICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgICB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmd2LnN0YXJ0KSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGFyZ3YuZTJlICE9PSAnbm9uZScpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHByb2plY3QuaGFzRG9ja2VyZmlsZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBzdGFydENvbW1hbmQ6IGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge307XG4gICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChhcmd2LnVuaXQpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YsIHsgdGltZW91dDogYXJndi51bml0VGltZW91dCB9KSk7XG4gICAgfVxuICAgIGlmIChhcmd2LnN0YXJ0KSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndikpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBjYXNlICdub25lJzoge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJyc6XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGFyZ3YsIHNjcmlwdHMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGFyZ3YsIHNjcmlwdHMsIGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0tZGVidWdgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzWydibGl0eiddIHx8IGRlcHNbJ25leHQnXSB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1oZWFkZWRgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1kZWJ1Z2AgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6ICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCcgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGUyZSBtb2RlOiAke2FyZ3YuZTJlfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RPbkRvY2tlcihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvY2Vzcy5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9YCwgcHJvamVjdCwgYXJndik7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgYCR7c2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgc3RhcnRDb21tYW5kOiBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCB0cnVlKSxcbiAgICB9KX1gLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoKHByb2plY3QpID0+IHtcbiAgICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCAtLVByZXR0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHlyaWdodCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQgLS1QcmV0dHknKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICAgIGNpOiBwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxLFxuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gICAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChleGl0Q29kZSkge1xuICAgICAgICBjb25zdCBkZXBzID0gcHJvamVjdHMuZGVzY2VuZGFudHNbaV0ucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgICBpZiAoZGVwc1snYmxpdHonXSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1BsZWFzZSB0cnkgXCJ5YXJuIGdlbi1jb2RlXCIgaWYgeW91IGZhY2UgdW5rbm93biB0eXBlIGVycm9ycy4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxFeGl0Q29kZSA9IGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmluYWxFeGl0Q29kZSkgcHJvY2Vzcy5leGl0KGZpbmFsRXhpdENvZGUpO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGNDb21tYW5kLCB0eXBlQ2hlY2tDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90eXBlY2hlY2suanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnd2InKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gYXJndlsnd29ya2luZy1kaXInXTtcbiAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyKTtcbiAgICAgIHByb2Nlc3MuY2hkaXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgfSlcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLmhlbHAoKS5hcmd2O1xuXG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4gcHJvY2Vzcy5leGl0KCkpO1xufVxuIl0sIm5hbWVzIjpbImNhY2hlZEVudlZhcnMiLCJNYXAiLCJyZWFkRW52RmlsZSIsImZpbGVQYXRoIiwiY2FjaGVkIiwiZ2V0IiwicGFyc2VkIiwiY29uZmlnIiwicGF0aCIsInJlc29sdmUiLCJwcm9jZXNzRW52Iiwic2V0IiwiYXN5bmMiLCJzcGF3bkFzeW5jIiwiY29tbWFuZCIsImFyZ3MiLCJvcHRpb25zIiwiUHJvbWlzZSIsInJlamVjdCIsInByb2MiLCJzcGF3biIsInN0ZG91dCIsInNldEVuY29kaW5nIiwic3RkZXJyIiwib24iLCJkYXRhIiwibWVyZ2VPdXRBbmRFcnJvciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsInBpZCIsInZlcmJvc2UiLCJjb25zb2xlIiwiaW5mbyIsInRyZWVLaWxsIiwia2lsbE9uRXhpdCIsInByb2Nlc3MiLCJlcnJvciIsInJlbW92ZUxpc3RlbmVyIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiY29kZSIsInNpZ25hbCIsInVuZGVmaW5lZCIsIkVycm9yIiwic3RhdHVzIiwiaW5wdXQiLCJzdGRpbiIsIndyaXRlIiwiZW5kIiwidCIsInMiLCJpIiwiZSIsIm4iLCJlbnRyaWVzIiwiaCIsImJsb2NrcyIsInJlc2V0IiwiZmluYWxpemVkIiwiYmxvY2siLCJzdGFydCIsImxhc3RCeXRlSW5kZXgiLCJjb25zdHJ1Y3RvciIsInRoaXMiLCJwYWRkaW5nIiwib3V0cHV0Qml0cyIsImJsb2NrQ291bnQiLCJieXRlQ291bnQiLCJvdXRwdXRCbG9ja3MiLCJleHRyYUJ5dGVzIiwidXBkYXRlIiwibyIsImxlbmd0aCIsImwiLCJjIiwiZiIsImNvZGVQb2ludEF0IiwiciIsImZpbmFsaXplIiwiaGV4IiwiYSIsInUiLCJkIiwiYiIsImsiLCJ5IiwieCIsIkIiLCJwIiwiQyIsInoiLCJJIiwiZyIsInciLCJBIiwiUCIsIkUiLCJqIiwibSIsInEiLCJ2IiwiRCIsIkYiLCJHIiwiSCIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCIkIiwiXyIsInR0Iiwic3QiLCJpdCIsImV0Iiwib3QiLCJudCIsImh0IiwicnQiLCJsdCIsImN0IiwiZnQiLCJKU09OIiwic3RyaW5naWZ5IiwiY2FjaGVEdXJhdGlvbiIsIk51bWJlciIsIlBPU0lUSVZFX0lORklOSVRZIiwiY2FsY0hhc2giLCJraW5kIiwiRGF0ZSIsIm5vdyIsImNhbGwiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJtZW1vaXplT25lIiwiYXJndiIsInBhdGhCeU5hbWUiLCJkaXJQYXRoIiwibG9hZEVudiIsIl9kaXJQYXRoIiwiaXNCdW5BdmFpbGFibGUiLCJ0ZXN0IiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJqb2luIiwicm9vdERpclBhdGgiLCJidWlsZENvbW1hbmQiLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJidWlsZCIsImluY2x1ZGVzIiwiZXhpc3RzU3luYyIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwibmFtZSIsImRvY2tlckltYWdlTmFtZSIsInJlcGxhY2VBbGwiLCJlbnYiLCJlbnZWYXJzIiwiZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMiLCJjd2QiLCJlbnZQYXRocyIsIm1hcCIsImVudlBhdGgiLCJ0b1N0cmluZyIsImNhc2NhZGUiLCJjYXNjYWRlRW52IiwiY2FzY2FkZU5vZGVFbnYiLCJOT0RFX0VOViIsImF1dG9DYXNjYWRlRW52IiwiV0JfRU5WIiwicHVzaCIsImluY2x1ZGVSb290RW52Iiwicm9vdFBhdGgiLCJmbGF0TWFwIiwiZmlsdGVyIiwicmVsYXRpdmUiLCJlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlycyIsImNvdW50Iiwia2V5IiwidmFsdWUiLCJPYmplY3QiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwia2V5cyIsInJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhcnNlIiwicGFja2FnZUpzb25QYXRoIiwiaGFzUHJpc21hIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiZG9ja2VyUGFja2FnZUpzb24iLCJkaXJuYW1lIiwiYmluRXhpc3RzIiwiYmluRm91bmQiLCJjdXJyZW50UGF0aCIsImJpblBhdGgiLCJQQVRIIiwicGFyZW50UGF0aCIsImZpbGVOYW1lIiwiZmluZCIsImZpbmRTZWxmUHJvamVjdCIsImZpbmREZXNjZW5kYW50UHJvamVjdHMiLCJyb290QW5kU2VsZlByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInJvb3QiLCJzZWxmIiwiZmluZFJvb3RBbmRTZWxmUHJvamVjdHMiLCJkZXNjZW5kYW50cyIsImdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyIsInByb2plY3RzIiwid29ya3NwYWNlIiwiQXJyYXkiLCJpc0FycmF5IiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJucG1fZXhlY3BhdGgiLCJydW50aW1lV2l0aEFyZ3MiLCJwYWNrYWdlTWFuYWdlciIsInBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsImJ1aWxkSWZOZWVkZWRDb21tYW5kIiwiZGVzY3JpYmUiLCJkZXNjcmlwdGlvbiIsInR5cGUiLCJhbGlhcyIsImhhbmRsZXIiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJwcm9qZWN0IiwiY2hhbGsiLCJyZWQiLCJjYW5Ta2lwIiwiY2FjaGVGaWxlUGF0aCIsImNvbnRlbnRIYXNoIiwiY2FjaGVEaXJlY3RvcnlQYXRoIiwicHJvbWlzZXMiLCJta2RpciIsInJlY3Vyc2l2ZSIsImhhc2giLCJjcmVhdGVIYXNoIiwiY29tbWl0SGFzaCIsImNoaWxkX3Byb2Nlc3MiLCJleGVjU3luYyIsInRyaW0iLCJlbnZpcm9ubWVudEpzb24iLCJpZ25vcmluZ0VudlZhck5hbWVzIiwiaGFzIiwic29ydCIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkRmlsZVBhdGhzIiwic3Bhd25TeW5jIiwic3RkaW8iLCJlbmNvZGluZyIsInNwbGl0IiwicmVwbGFjZSIsImluY2x1ZGVQYXR0ZXJucyIsInNvbWUiLCJwYXR0ZXJuIiwiaW5jbHVkZVN1ZmZpeCIsInN1ZmZpeCIsImV4Y2x1ZGVQYXR0ZXJucyIsImNvcHkiLCJkaWdlc3QiLCJ1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQiLCJjYWNoZWRDb250ZW50SGFzaCIsImZuIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkRmlsZSIsImNhblNraXBCdWlsZCIsImdyZWVuIiwiZHJ5UnVuIiwid3JpdGVGaWxlIiwiYnVpbGRJZk5lZWRlZCIsInJldCIsInNoZWxsIiwiZXhpdENvZGUiLCJTZXQiLCJraWxsZWQiLCJraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyIsInBvcnQiLCJraWxsUG9ydFByb2Nlc3MiLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZGVmYXVsdE9wdGlvbnMiLCJleGl0SWZGYWlsZWQiLCJydW5XaXRoU3Bhd24iLCJzY3JpcHQiLCJvcHRzIiwicHJpbnRhYmxlU2NyaXB0IiwicnVubmFibGVTY3JpcHQiLCJub3JtYWxpemVTY3JpcHQiLCJwcmludFN0YXJ0IiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsIm1hdGNoIiwia2lsbEZ1bmMiLCJhZGQiLCJraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCIsImNvbmZpZ3VyZUVudiIsInRpbWVvdXQiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsIiwicnVuQW5kV2FpdEZvclJldHVyblZhbHVlIiwib3V0IiwibmV3U2NyaXB0IiwiZml4QnVuQ29tbWFuZCIsIm5vcm1hbGl6ZWRTY3JpcHQiLCJwcmVmaXgiLCJ3ZWFrIiwiZ3JheSIsImN5YW4iLCJib2xkIiwiZXhpdCIsIm5ld0VudiIsImNpIiwiZm9yY2VDb2xvciIsImJpb21lRXh0ZW5zaW9ucyIsInByZXR0aWVyRXh0ZW5zaW9ucyIsInByZXR0aWVyT25seUV4dGVuc2lvbnMiLCJleHQiLCJsaW50Q29tbWFuZCIsImZpeCIsImZvcm1hdCIsImZpbGVzIiwiYmlvbWVBcmdzVGV4dCIsInByZXR0aWVyQXJnc1RleHQiLCJzb3J0UGFja2FnZUpzb25BcmdzVGV4dCIsImZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZSIsImZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJmaWxlIiwiU3RyaW5nIiwiZXh0ZW5zaW9uIiwiZXh0bmFtZSIsInNsaWNlIiwiYmlvbWVDb21tYW5kIiwiYmlvbWVQcm9taXNlIiwicHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIiwiY29tbWFuZE5hbWUiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwic3RhcnRzV2l0aCIsIm9wdGltaXplRGV2RGVwZW5kZW5jaWVzIiwib3B0aW1pemVTY3JpcHRzIiwib3B0aW1pemVSb290UHJvcHMiLCJkaXN0RGlyUGF0aCIsImRldkRlcHMiLCJuYW1lV29yZHNUb0JlUmVtb3ZlZCIsInJlbW92ZWREZXBzIiwid29yZCIsIm5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwiY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJyZW1vdmVkU2NyaXB0cyIsImNvbnRlbnQiLCJwcml2YXRlIiwicHVibGlzaENvbmZpZyIsInByZXR0aWVyIiwicHJpc21hU2NyaXB0cyIsImRlcGxveSIsImRlcGxveUZvcmNlIiwiYmFja3VwUGF0aCIsImRpck5hbWUiLCJsaXRlc3RyZWFtIiwibWlncmF0ZSIsInNlZWQiLCJtaWdyYXRlRGV2IiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJzY3JpcHRQYXRoIiwicHJpc21hIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJGSUxFX1NDSEVNQSIsIlVSTCIsIkRBVEFCQVNFX1VSTCIsIlBPU1NJQkxFX1BBVEhTIiwic2NoZW1hUGF0aCIsImRiUGF0aCIsImJ1aWxkZXIiLCJwcmlzbWFDb21tYW5kIiwieWFyZ3MiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwibGl0ZXN0cmVhbUNvbW1hbmQiLCJtaWdyYXRlQ29tbWFuZCIsIm1pZ3JhdGVEZXZDb21tYW5kIiwicmVzZXRDb21tYW5kIiwicmVzdG9yZUNvbW1hbmQiLCJzZWVkQ29tbWFuZCIsInN0dWRpb0NvbW1hbmQiLCJkZWZhdWx0Q29tbWFuZCIsImRlbWFuZENvbW1hbmQiLCJhbGxQcm9qZWN0cyIsImZpbmRQcmlzbWFQcm9qZWN0cyIsImRlcGxveUZvcmNlQnVpbGRlciIsImRlbWFuZE9wdGlvbiIsIm91dHB1dCIsInJlc3RvcmVkIiwidHJpbUVuZCIsImZpbHRlcmVkIiwicmV0cnlDb21tYW5kIiwicmV0cnkiLCJkZWZhdWx0IiwiY21kQW5kQXJncyIsIkJvb2xlYW4iLCJsYXN0U3RhdHVzIiwieWVsbG93Iiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib3MiLCJwbGF0Zm9ybSIsInBhY2thZ2VzIiwiaXNGaWxlIiwidmVyc2lvbiIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJkb2NrZXJTY3JpcHRzIiwiYnVpbGREZXZJbWFnZSIsInN0b3BBbmRTdGFydCIsInVuYnVmZmVyIiwiYWRkaXRpb25hbE9wdGlvbnMiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJzdG9wQWxsIiwiQmFzZVNjcmlwdHMiLCJkZWZhdWx0UG9ydCIsIlBPUlQiLCJidWlsZERvY2tlciIsInN0YXJ0RG9ja2VyIiwibm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Iiwibm9ybWFsaXplZEFyZ3NUZXh0Iiwid2FpdEFuZE9wZW5BcHAiLCJ0ZXN0RTJFIiwicGxheXdyaWdodEFyZ3MiLCJwcmlzbWFEaXJlY3RvcnkiLCJzdGFydENvbW1hbmQiLCJ0YXJnZXQiLCJ0ZXN0RTJFRGV2IiwidGVzdFVuaXQiLCJ3YWl0QXBwIiwiYmxpdHpTY3JpcHRzIiwic3VwZXIiLCJzdGFydFByb2R1Y3Rpb24iLCJ0ZXN0U3RhcnQiLCJodHRwU2VydmVyU2NyaXB0cyIsIndhdGNoIiwibmV4dFNjcmlwdHMiLCJwbGFpbkFwcFNjcmlwdHMiLCJyZW1peFNjcmlwdHMiLCJodHRwU2VydmVyUGFja2FnZXMiLCJtb2RlIiwiYXJnIiwiZG9ja2VyT3B0aW9ucyIsIm5vcm1hbGl6ZUFyZ3MiLCJjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyIsIndiRW52IiwiTkVYVF9QVUJMSUNfV0JfRU5WIiwidGVzdENvbW1hbmQiLCJlMmUiLCJ1bml0IiwiQ0kiLCJGT1JDRV9DT0xPUiIsInNob3VsZFJ1bkFsbFRlc3RzIiwidW5pdFRpbWVvdXQiLCJhbGwiLCJ0ZXN0T25Eb2NrZXIiLCJXQl9ET0NLRVIiLCJ0eXBlQ2hlY2tDb21tYW5kIiwiY29tbWFuZHMiLCJ0eXBlc2NyaXB0IiwicHlyaWdodCIsImV4aXRDb2RlcyIsImZpbmFsRXhpdENvZGUiLCJ0Y0NvbW1hbmQiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsImhpZGVCaW4iLCJzY3JpcHROYW1lIiwibWlkZGxld2FyZSIsIndvcmtpbmdEaXIiLCJjaGRpciIsIkJFUlJZX0JJTl9GT0xERVIiLCJ1cHBlcktleSIsInRvVXBwZXJDYXNlIiwicmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIiwic3RyaWN0IiwiaGVscCJdLCJtYXBwaW5ncyI6Im9jQXlIQSxNQUFNQSxFQUFnQixJQUFJQyxJQUUxQixTQUFTQyxFQUFZQyxHQUNuQixNQUFNQyxFQUFTSixFQUFjSyxJQUFJRixHQUNqQyxHQUFJQyxFQUFRLE9BQU9BLEVBRW5CLE1BQU1FLEVBQVNDLEVBQU8sQ0FBRUMsS0FBTUEsRUFBS0MsUUFBUU4sR0FBV08sV0FBWSxDQUFBLElBQU1KLFFBQVUsQ0FBRSxFQUVw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
10
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvY2FjbEhhc2guanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L21lbW9pemVPbmUuanMiLCIuLi9zcmMvcHJvamVjdC50cyIsIi4uL3NyYy91dGlscy9ydW50aW1lLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2xpbnQudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ByaXNtYS50cyIsIi4uL3NyYy9jb21tYW5kcy9yZXRyeS50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3R5cGVjaGVjay50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICBlbnY6IHtcbiAgICBkZXNjcmlwdGlvbjogJy5lbnYgZmlsZXMgdG8gYmUgbG9hZGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgJ2Nhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0Vudmlyb25tZW50IHRvIGxvYWQgY2FzY2FkaW5nIC5lbnYgZmlsZXMgKGUuZy4sIGAuZW52YCwgYC5lbnYuPGVudmlyb25tZW50PmAsIGAuZW52LmxvY2FsYCBhbmQgYC5lbnYuPGVudmlyb25tZW50Pi5sb2NhbGApLiBQcmVmZXJyZWQgb3ZlciBgY2FzY2FkZS1ub2RlLWVudmAgYW5kIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICAnY2FzY2FkZS1ub2RlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LiBQcmVmZXJyZWQgb3ZlciBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdhdXRvLWNhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PFdCX0VOViB8fCBOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdpbmNsdWRlLXJvb3QtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSAuZW52IGZpbGVzIGluIHJvb3QgZGlyZWN0b3J5IGlmIHRoZSBwcm9qZWN0IGlzIGluIGEgbW9ub3JlcG8gYW5kIC0tZW52IG9wdGlvbiBpcyBub3QgdXNlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnY2hlY2stZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ2hlY2sgd2hldGhlciB0aGUga2V5cyBvZiB0aGUgbG9hZGVkIC5lbnYgZmlsZXMgYXJlIHNhbWUgd2l0aCB0aGUgZ2l2ZW4gLmVudiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy5lbnYuZXhhbXBsZScsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzLlxuICogTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogQHJldHVybiBbZW52VmFycywgW2VudlBhdGhzLCBlbnZWYXJDb3VudF1bXV1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIFtzdHJpbmcsIG51bWJlcl1bXV0ge1xuICBsZXQgZW52UGF0aHMgPSAoYXJndi5lbnYgPz8gW10pLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgZW52UGF0aC50b1N0cmluZygpKSk7XG4gIGNvbnN0IGNhc2NhZGUgPVxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudlxuICAgICAgICA/IHByb2Nlc3MuZW52LldCX0VOViB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBjYXNjYWRlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChlbnZQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKGN3ZCwgJy5lbnYnKSk7XG4gICAgICBpZiAoYXJndi5pbmNsdWRlUm9vdEVudikge1xuICAgICAgICBjb25zdCByb290UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsICcuLicsICcuLicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdFBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihyb290UGF0aCwgJy5lbnYnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aHMgPSBlbnZQYXRocy5mbGF0TWFwKChlbnZQYXRoKSA9PlxuICAgICAgY2FzY2FkZVxuICAgICAgICA/IFtgJHtlbnZQYXRofS4ke2Nhc2NhZGV9LmxvY2FsYCwgYCR7ZW52UGF0aH0ubG9jYWxgLCBgJHtlbnZQYXRofS4ke2Nhc2NhZGV9YCwgZW52UGF0aF1cbiAgICAgICAgOiBbYCR7ZW52UGF0aH0ubG9jYWxgLCBlbnZQYXRoXVxuICAgICk7XG4gIH1cbiAgZW52UGF0aHMgPSBlbnZQYXRocy5maWx0ZXIoKGVudlBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZW52UGF0aCkpLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMuam9pbignLCAnKSk7XG4gIH1cblxuICBjb25zdCBlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlyczogW3N0cmluZywgbnVtYmVyXVtdID0gW107XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBlbnZQYXRoKSkpKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZW52VmFycykpIHtcbiAgICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzLnB1c2goW2VudlBhdGgsIGNvdW50XSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiBjb3VudCA+IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUmVhZCAke2NvdW50fSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSB8fCB7fSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykpO1xuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIFske2VudlBhdGhzLmpvaW4oJywgJyl9XTogWyR7bWlzc2luZ0tleXMuam9pbignLCAnKX1dYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbZW52VmFycywgZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnNdO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMgYW5kIGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICBPYmplY3QuYXNzaWduKHByb2Nlc3MuZW52LCBlbnZWYXJzKTtcbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbmNvbnN0IGNhY2hlZEVudlZhcnMgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcblxuZnVuY3Rpb24gcmVhZEVudkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZWRFbnZWYXJzLmdldChmaWxlUGF0aCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgcGFyc2VkID0gY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGZpbGVQYXRoKSwgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IHt9O1xuICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbGF0ZWQgdG8gbnBtIGFuZCB5YXJuIGZyb20gdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiB2b2lkIHtcbiAgLy8gUmVtb3ZlIG5wbSAmIHlhcm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcHJvY2Vzcy5lbnZcbiAgaWYgKGVudlZhcnMuUEFUSCAmJiBlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnZWYXJzLlBBVEggPSBlbnZWYXJzLlBBVEgucmVwbGFjZShgJHtlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiBtYWNPU1xuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ByaXZhdGVcXC92YXJcXC9mb2xkZXJzXFwvW146XSs6L2csICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGluIExpbnV4XG4gICAgICAucmVwbGFjZUFsbCgvXFwvdmFyXFwvdG1wXFwvW146XSs6L2csICcnKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3RtcFxcL1teOl0rOi9nLCAnJyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICBjb25zdCB1cHBlcktleSA9IGtleS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ05QTV8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnWUFSTl8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnQkVSUllfJykgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnUFJPSkVDVF9DV0QnIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ0lOSVRfQ1dEJ1xuICAgICkge1xuICAgICAgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgU3Bhd25PcHRpb25zLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlLFxuICBTcGF3blN5bmNSZXR1cm5zLFxuICBTdGRpb051bGwsXG4gIFN0ZGlvUGlwZSxcbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHRyZWVLaWxsIGZyb20gJ3RyZWUta2lsbCc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHN0b3BQcm9jZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc3RvcHBlZCB8fCAhcHJvYy5waWQpIHJldHVybjtcblxuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYHRyZWVLaWxsKCR7cHJvYy5waWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucz8ua2lsbE9uRXhpdCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICB9XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zPy5pbnB1dCkge1xuICAgICAgICBwcm9jLnN0ZGluPy53cml0ZShvcHRpb25zLmlucHV0KTtcbiAgICAgICAgcHJvYy5zdGRpbj8uZW5kKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsIi8qKlxuICogW2pzLXNoYTNde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9lbW4xNzgvanMtc2hhM31cbiAqXG4gKiBAdmVyc2lvbiAwLjkuM1xuICogQGF1dGhvciBDaGVuLCBZaS1DeXVhbiBbZW1uMTc4QGdtYWlsLmNvbV1cbiAqIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDIzXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuY29uc3QgdD1bLi4uXCIwMTIzNDU2Nzg5YWJjZGVmXCJdLHM9WzYsMTUzNiwzOTMyMTYsMTAwNjYzMjk2XSxpPVswLDgsMTYsMjRdLGU9WzEsMCwzMjg5OCwwLDMyOTA2LDIxNDc0ODM2NDgsMjE0NzUxNjQxNiwyMTQ3NDgzNjQ4LDMyOTA3LDAsMjE0NzQ4MzY0OSwwLDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjc3NywyMTQ3NDgzNjQ4LDEzOCwwLDEzNiwwLDIxNDc1MTY0MjUsMCwyMTQ3NDgzNjU4LDAsMjE0NzUxNjU1NSwwLDEzOSwyMTQ3NDgzNjQ4LDMyOTA1LDIxNDc0ODM2NDgsMzI3NzEsMjE0NzQ4MzY0OCwzMjc3MCwyMTQ3NDgzNjQ4LDEyOCwyMTQ3NDgzNjQ4LDMyNzc4LDAsMjE0NzQ4MzY1OCwyMTQ3NDgzNjQ4LDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjg5NiwyMTQ3NDgzNjQ4LDIxNDc0ODM2NDksMCwyMTQ3NTE2NDI0LDIxNDc0ODM2NDhdO2Z1bmN0aW9uIG8odCl7cmV0dXJuIG5ldyBoKDUxMixzLDUxMikudXBkYXRlKHQpLmhleCgpfWNvbnN0IG49dD0+e2NvbnN0IHM9W107Zm9yKGNvbnN0W2ksZV1vZiB0LmVudHJpZXMoKSlzW2ldPWU7cmV0dXJuIHN9O2NsYXNzIGh7YmxvY2tzPVtdO3M9W107cmVzZXQ9ITA7ZmluYWxpemVkPSExO2Jsb2NrPTA7c3RhcnQ9MDtsYXN0Qnl0ZUluZGV4PTA7Y29uc3RydWN0b3IodCxzLGkpe3RoaXMucGFkZGluZz1zLHRoaXMub3V0cHV0Qml0cz1pLHRoaXMuYmxvY2tDb3VudD0xNjAwLSh0PDwxKT4+NSx0aGlzLmJ5dGVDb3VudD10aGlzLmJsb2NrQ291bnQ8PDIsdGhpcy5vdXRwdXRCbG9ja3M9aT4+NSx0aGlzLmV4dHJhQnl0ZXM9KDMxJmkpPj4zO2ZvcihsZXQgdD0wO3Q8NTA7Kyt0KXRoaXMuc1t0XT0wfXVwZGF0ZSh0KXtpZih0aGlzLmZpbmFsaXplZCl0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbGl6ZSBhbHJlYWR5IGNhbGxlZFwiKTtjb25zdCBzPXRoaXMuYmxvY2tzLGU9dGhpcy5ieXRlQ291bnQsbz10Lmxlbmd0aCxuPXRoaXMuYmxvY2tDb3VudCxoPXRoaXMucztsZXQgbCxjLGY9MDtmb3IoO2Y8bzspe2lmKHRoaXMucmVzZXQpZm9yKHRoaXMucmVzZXQ9ITEsc1swXT10aGlzLmJsb2NrLGw9MTtsPG4rMTsrK2wpc1tsXT0wO2ZvcihsPXRoaXMuc3RhcnQ7ZjxvJiZsPGU7KytmKWM9dC5jb2RlUG9pbnRBdChmKXx8MCxjPDEyOD9zW2w+PjJdfD1jPDxpWzMmbCsrXTpjPDIwNDg/KHNbbD4+Ml18PSgxOTJ8Yz4+Nik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTpjPDU1Mjk2fHxjPj01NzM0ND8oc1tsPj4yXXw9KDIyNHxjPj4xMik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTooYz02NTUzNisoKDEwMjMmYyk8PDEwfDEwMjMmKHQuY29kZVBvaW50QXQoKytmKXx8MCkpLHNbbD4+Ml18PSgyNDB8Yz4+MTgpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjEyJjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pO2lmKHRoaXMubGFzdEJ5dGVJbmRleD1sLGw+PWUpe2Zvcih0aGlzLnN0YXJ0PWwtZSx0aGlzLmJsb2NrPXNbbl0sbD0wO2w8bjsrK2wpaFtsXV49c1tsXTtyKGgpLHRoaXMucmVzZXQ9ITB9ZWxzZSB0aGlzLnN0YXJ0PWx9cmV0dXJuIHRoaXN9ZmluYWxpemUoKXtpZih0aGlzLmZpbmFsaXplZClyZXR1cm47dGhpcy5maW5hbGl6ZWQ9ITA7Y29uc3QgdD10aGlzLmJsb2NrcztsZXQgcz10aGlzLmxhc3RCeXRlSW5kZXg7Y29uc3QgaT10aGlzLmJsb2NrQ291bnQsZT10aGlzLnM7aWYodFtzPj4yXXw9dGhpcy5wYWRkaW5nWzMmc10sdGhpcy5sYXN0Qnl0ZUluZGV4PT09dGhpcy5ieXRlQ291bnQpZm9yKHRbMF09dFtpXSxzPTE7czxpKzE7KytzKXRbc109MDtmb3IodFtpLTFdfD0yMTQ3NDgzNjQ4LHM9MDtzPGk7KytzKWVbc11ePXRbc107cihlKX1oZXgoKXt0aGlzLmZpbmFsaXplKCk7Y29uc3Qgcz10aGlzLmJsb2NrQ291bnQ7bGV0IGk9dGhpcy5zO2NvbnN0IGU9dGhpcy5vdXRwdXRCbG9ja3Msbz10aGlzLmV4dHJhQnl0ZXM7bGV0IGgsbD0wLGM9MCxmPVwiXCI7Zm9yKDtjPGU7KXtmb3IobD0wO2w8cyYmYzxlOysrbCwrK2MpaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSt0W2g+PjEyJjE1XSt0W2g+PjgmMTVdK3RbaD4+MjAmMTVdK3RbaD4+MTYmMTVdK3RbaD4+MjgmMTVdK3RbaD4+MjQmMTVdO2Mlcz09MCYmKGk9bihpKSxyKGkpLGw9MCl9cmV0dXJuIG8mJihoPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdLG8+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+aXQmb3QsdFswXV49ZVtvXSx0WzFdXj1lW28rMV19O2V4cG9ydHtvIGFzIHNoYTNfNTEyfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtmdW5jdGlvbiBuKG4sdCl7cmV0dXJuIHIoSlNPTi5zdHJpbmdpZnkoW24sdF0pKX1mdW5jdGlvbiB0KCl7cmV0dXJuXCJcIn1leHBvcnR7dCBhcyBjYWxjRW1wdHlIYXNoLG4gYXMgY2FsY0hhc2hXaXRoQ29udGV4dH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYWNsSGFzaC5qcy5tYXBcbiIsImltcG9ydHtjYWxjSGFzaFdpdGhDb250ZXh0IGFzIHQsY2FsY0VtcHR5SGFzaCBhcyBjfWZyb21cIi4vY2FjbEhhc2guanNcIjtjb25zdCBuPXIoe2NhbGNIYXNoOnR9KSxhPXIoe2NhbGNIYXNoOmN9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmM9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGNhbGNIYXNoOm49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGEpe2xldCByLG8sZTtyZXR1cm5cImdldHRlclwiPT09YT8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGE9bih0aGlzLFtdKSxzPURhdGUubm93KCk7cmV0dXJuKGUhPT1hfHxzLW8+YykmJihlPWEscj10LmNhbGwodGhpcyksbz1zKSxyfTpmdW5jdGlvbiguLi5zKXtjb25zdCBpPW4odGhpcyxzKSx1PURhdGUubm93KCk7cmV0dXJuKGUhPT1pfHx1LW8+YykmJihlPWkscj1hP3QuY2FsbCh0aGlzLC4uLnMpOnQoLi4ucyksbz11KSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGEgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKF58XFxuKWJ1blxccy8udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ1lBUk4gcnVuIGJ1aWxkJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkXG4gICAgICAgID8gYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gXG4gICAgICAgIDogXCJlY2hvICdObyBidWlsZCBzY3JpcHQnXCI7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMubG9hZEVudikgcmV0dXJuIHByb2Nlc3MuZW52O1xuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBbZW52UGF0aCwgY291bnRdIG9mIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke2NvdW50fSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICAgIC8vIE92ZXJ3cml0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZXZlbiB0aG91Z2ggdGhpcyBiZWhhdmlvciBpcyBub24tc3RhbmRhcmRcbiAgICAvLyBiZWNhdXNlIGBidW4gd2IgLi4uYCB3aWxsIGxvYWQgLmVudiBhbmQgLmVudi5sb2NhbCBiZWZvcmUgYHdiYCBsb2FkcyBvdGhlciB2YXJpYWJsZXMuXG4gICAgcmV0dXJuIHsgLi4ucHJvY2Vzcy5lbnYsIC4uLmVudlZhcnMgfTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsncHJpc21hJ10gfHwgdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LlsncHJpc21hJ10pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGJpbkZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5kaXJQYXRoO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgICAgdGhpcy5lbnYuUEFUSCA9IGAke2JpblBhdGh9OiR7dGhpcy5lbnYuUEFUSH1gO1xuICAgICAgICBiaW5Gb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJpbkZvdW5kO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID0gcHJvY2Vzcy5hcmd2WzBdLmVuZHNXaXRoKCcvYnVuJykgfHwgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGFyZ3YuY29tbWFuZCA/PyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIH07XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLmdpdCcpKSkge1xuICAgIGJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgW2NhblNraXAsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXSA9IGF3YWl0IGNhblNraXBCdWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKGNhblNraXApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFNraXAgdG8gcnVuICcke2FyZ3YuY29tbWFuZH0nIPCfkqtgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFidWlsZChwcm9qZWN0LCBhcmd2KSkgcmV0dXJuO1xuXG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2gsICd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYW5Ta2lwQnVpbGQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj5cbik6IFByb21pc2U8W2Jvb2xlYW4sIHN0cmluZywgc3RyaW5nXT4ge1xuICBjb25zdCBjYWNoZURpcmVjdG9yeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5jYWNoZScsICdidWlsZCcpO1xuICBjb25zdCBjYWNoZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNhY2hlRGlyZWN0b3J5UGF0aCwgJ2xhc3QtYnVpbGQnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoY2FjaGVEaXJlY3RvcnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2dpdCByZXYtcGFyc2UgSEVBRCcsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGggfSkudG9TdHJpbmcoKS50cmltKCk7XG4gIGhhc2gudXBkYXRlKGNvbW1pdEhhc2gpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50SnNvbiA9IEpTT04uc3RyaW5naWZ5KFxuICAgIE9iamVjdC5lbnRyaWVzKHByb2plY3QuZW52KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFpZ25vcmluZ0VudlZhck5hbWVzLmhhcyhrZXkpKVxuICAgICAgLnNvcnQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnZGlmZicsICctLW5hbWUtb25seSddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSByZXQuc3Rkb3V0XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3NjcmlwdHNcXC90ZXN0LWZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oZGF0YS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAgeyBiZWZvcmVSZXRyeSwgaGFuZGxlRXJyb3IsIHJldHJ5Q291bnQgPSAzLCByZXRyeUxvZ2dlciwgc2xlZXBNaWxsaXNlY29uZHMgPSAwIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIGVycm9yLnN0YWNrIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0KTtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHBvcnQgPSBydW5uYWJsZVNjcmlwdC5tYXRjaCgvaHR0cC1nZXQ6XFwvXFwvMTI3LjAuMC4xOihcXGQrKS8pPy5bMV07XG4gIGlmIChydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnd2FpdC1vbicpICYmIHBvcnQgJiYgIXJ1bm5hYmxlU2NyaXB0LmluY2x1ZGVzKCdkb2NrZXIgcnVuJykpIHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChOdW1iZXIocG9ydCkpO1xuICB9XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHM/LnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzPy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FwaXRhbGl6ZWQgY29tbWFuZHMgKGUuZy4sIFlBUk4sIFBSSVNNQSwgQlVOKSB3aXRoIHN1aXRhYmxlIGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuIC0tYnVuKSBydW5gXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ3lhcm4gcnVuICcpO1xuICBpZiAoaXNSdW5uaW5nT25CdW4pIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gLS1idW4gcnVuIGJ1biAtLWJ1biBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpXG4gICAgICAucmVwbGFjZUFsbCgvKD86WUFSTiApP3ZpdGVzdCBydW4vZywgJ2J1biB0ZXN0JylcbiAgICAgIC8vICctLWFsbG93T25seScgaXMgc29tZXRpbWVzIHJlbW92ZWQuXG4gICAgICAucmVwbGFjZUFsbCgvIC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMoPzogLS1hbGxvd09ubHkpPy9nLCAnJyk7XG4gIH1cbiAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0LnRyaW0oKTtcbiAgcmV0dXJuIFtcbiAgICBmaXhCdW5Db21tYW5kKG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCkpLFxuICAgIGZpeEJ1bkNvbW1hbmQoXG4gICAgICBuZXdTY3JpcHRcbiAgICAgICAgLy8gQmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBgeWFybiBwbGF5d3JpZ2h0YCBpbiBhIHByb2plY3QgZGVwZW5kaW5nIG9uIGBhcnRpbGxlcnktZW5naW5lLXBsYXl3cmlnaHRgLlxuICAgICAgICAucmVwbGFjZUFsbCgnWUFSTiBwbGF5d3JpZ2h0ICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgICAgICAucmVwbGFjZUFsbCgnWUFSTiAnLCAhaXNSdW5uaW5nT25CdW4gJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYClcbiAgICApLFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QsIHByZWZpeCA9ICdTdGFydCcsIHdlYWsgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgJ1xcbicgK1xuICAgICAgKHdlYWsgPyBjaGFsay5ncmF5IDogY2hhbGsuY3lhbikoY2hhbGsuYm9sZChgJHtwcmVmaXh9OmApLCBub3JtYWxpemVkU2NyaXB0KSArXG4gICAgICBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBleGl0Q29kZTogbnVtYmVyIHwgbnVsbCxcbiAgb3B0czogT21pdDxPcHRpb25zLCAndGltZW91dCc+XG4pOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBzY3JpcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTogYCksIHNjcmlwdCkpO1xuICAgIGlmIChvcHRzLmV4aXRJZkZhaWxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSA/PyAxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uZmlndXJlRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiwgb3B0czogT3B0aW9ucyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0VudlsnQ0knXSA9ICcxJztcbiAgfVxuICBpZiAob3B0cy5mb3JjZUNvbG9yKSB7XG4gICAgbmV3RW52WydGT1JDRV9DT0xPUiddID0gJzMnO1xuICB9XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvMTQzNTlcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgfHxcbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy84MjIyXG4gICAgY29tbWFuZC5pbmNsdWRlcygncGxheXdyaWdodCcpIHx8XG4gICAgLy8gXCJidW4gLS1idW4gcHJpc21hIGdlbmVyYXRlXCIgZG9lc24ndCB3b3JrXG4gICAgY29tbWFuZC5pbmNsdWRlcygncHJpc21hJykgfHxcbiAgICBjb21tYW5kLmluY2x1ZGVzKCd0ZXN0L2UyZS1hZGRpdGlvbmFsJylcbiAgICA/IGNvbW1hbmQucmVwbGFjZUFsbCgnYnVuIC0tYnVuJywgJ2J1bicpXG4gICAgOiBjb21tYW5kO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmaXg6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpeCB0aGUgbGludGluZyBlcnJvcnMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZm9ybWF0OiB7XG4gICAgZGVzY3JpcHRpb246ICdGb3JtYXQgdGhlIGNvZGUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGZpbGVzOiB7XG4gICAgZGVzY3JpcHRpb246ICdGaWxlIGFuZCBkaXJlY3RvcnkgcGF0aHMgdG8gbGludCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGJpb21lRXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydjanMnLCAnY3RzJywgJ2pzJywgJ2pzb24nLCAnanNvbmMnLCAnanN4JywgJ21qcycsICdtdHMnLCAndHMnLCAndHN4J10pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcblxuZXhwb3J0IGNvbnN0IGxpbnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUgb24gQnVuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKCFpc1J1bm5pbmdPbkJ1bikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBCdW4uJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gYXJndi5maWxlcyA/PyBbXTtcbiAgICBsZXQgYmlvbWVBcmdzVGV4dDogc3RyaW5nO1xuICAgIGxldCBwcmV0dGllckFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgcGFja2FnZUpzb25GaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoU3RyaW5nKGZpbGUpKTtcbiAgICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC1maXh0dXJlcycpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvcGFja2FnZS5qc29uJykpIHtcbiAgICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJpb21lQXJnc1RleHQgPSBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgICBwcmV0dGllckFyZ3NUZXh0ID0gZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzVGV4dCA9IHBhY2thZ2VKc29uRmlsZVBhdGhzLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaW9tZUFyZ3NUZXh0ID0gJyc7XG4gICAgICBwcmV0dGllckFyZ3NUZXh0ID0gYFwiKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfVwiIFwiISoqL3Rlc3QtZml4dHVyZXMvKipcImA7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzVGV4dCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gYFwiJHtwLnBhY2thZ2VKc29uUGF0aH1cImApLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaW9tZUNvbW1hbmQgPSBhcmd2LmZpeCAmJiBhcmd2LmZvcm1hdCA/ICdjaGVjayAtLWZpeCcgOiBhcmd2LmZpeCA/ICdsaW50IC0tZml4JyA6ICdsaW50JztcbiAgICBsZXQgYmlvbWVQcm9taXNlOiBQcm9taXNlPG51bWJlcj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGJpb21lQXJnc1RleHQgfHwgZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBiaW9tZVByb21pc2UgPSBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICBgYnVuIC0tYnVuIGJpb21lICR7YmlvbWVDb21tYW5kfSAtLWNvbG9ycz1mb3JjZSAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1maWxlcy1pZ25vcmUtdW5rbm93bj10cnVlICR7YmlvbWVBcmdzVGV4dH1gLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICB7IGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICBpZiAocHJldHRpZXJBcmdzVGV4dCkge1xuICAgICAgICB2b2lkIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gICAgICAgICAgYGJ1biAtLWJ1biBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlICR7cHJldHRpZXJBcmdzVGV4dH1gLFxuICAgICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7IGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0KSB7XG4gICAgICAgIGF3YWl0IGJpb21lUHJvbWlzZTtcbiAgICAgICAgdm9pZCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBidW4gLS1idW4gc29ydC1wYWNrYWdlLWpzb24gJHtzb3J0UGFja2FnZUpzb25BcmdzVGV4dH1gLCBwcm9qZWN0cy5zZWxmLCBhcmd2LCB7XG4gICAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nLCBwcm9qZWN0czogUHJvamVjdFtdKTogR2VuZXJhdG9yPFByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiJHtjb21tYW5kTmFtZX1cIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgeWllbGQgcHJvamVjdDtcbiAgfVxufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBvdXRzaWRlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBvcHRpbWl6YXRpb24gaXMgZXhlY3V0ZWQgb3V0c2lkZSBhIGRvY2tlciBjb250YWluZXIgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJyxcbiAgZGVzY3JpYmU6ICdPcHRpbWl6ZSBjb25maWd1cmF0aW9uIHdoZW4gYnVpbGRpbmcgYSBEb2NrZXIgaW1hZ2UnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICBjb25zdCBrZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldIHx8IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwcykpIHtcbiAgICAgICAgICBpZiAodmFsdWU/LnN0YXJ0c1dpdGgoJ2dpdEBnaXRodWIuY29tOicpKSB7XG4gICAgICAgICAgICBkZXBzW25hbWVdID0gYC4vJHtuYW1lfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKCdJbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3Y6IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFhcmd2Lm91dHNpZGUpIHtcbiAgICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuICAgIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gIGNvbnN0IG5hbWVXb3Jkc1RvQmVSZW1vdmVkID0gW1xuICAgICdhcnRpbGxlcnknLFxuICAgICdjb25jdXJyZW50bHknLFxuICAgICdjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICdlc2xpbnQnLFxuICAgICdodXNreScsXG4gICAgJ2ltYWdlbWluJyxcbiAgICAnamVzdCcsXG4gICAgJ2tpbGwtcG9ydCcsXG4gICAgJ2xpbnQtc3RhZ2VkJyxcbiAgICAnb3Blbi1jbGknLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgICAnd2FpdC1vbicsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgICghYXJndi5vdXRzaWRlICYmIG5hbWUuaW5jbHVkZXMoJ3dpbGxib29zdGVyJykgJiYgbmFtZS5pbmNsdWRlcygnY29uZmlnJykpXG4gICAgKSB7XG4gICAgICBkZWxldGUgZGV2RGVwc1tuYW1lXTtcbiAgICAgIHJlbW92ZWREZXBzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBkZXZEZXBlbmRlbmNpZXM6JywgcmVtb3ZlZERlcHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydjaGVjaycsICdkZXBsb3knLCAnZm9ybWF0JywgJ2xpbnQnLCAnc3RhcnQnLCAndGVzdCddO1xuICBjb25zdCBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsncGluc3QgJywgJ2h1c2t5ICddO1xuICBjb25zdCBzY3JpcHRzID0gKHBhY2thZ2VKc29uLnNjcmlwdHMgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbnN0IHJlbW92ZWRTY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUHJpc21hIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBQUklTTUFgIGlzIHJlcGxhY2VkIHdpdGggYFlBUk4gcHJpc21hYCBvciBgWUFSTiBibGl0eiBwcmlzbWFgXG4gKiBhbmQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFByaXNtYVNjcmlwdHMge1xuICBkZXBsb3koXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdQUklTTUEgbWlncmF0ZSBkZXBsb3knO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCwgYmFja3VwUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdkYicgOiAncHJpc21hJztcbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYHJtIC1SZiAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyo7IFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgJiYgcm0gLVJmICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzKlxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlIC1vICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzICR7YmFja3VwUGF0aH0gJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpdGVzdHJlYW0oXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3J1bnRpbWVXaXRoQXJnc30gLWUgJ1xuY29uc3QgeyBQcmlzbWFDbGllbnQgfSA9IHJlcXVpcmUoXCJAcHJpc21hL2NsaWVudFwiKTtcbm5ldyBQcmlzbWFDbGllbnQoKS4kcXVlcnlSYXdcXGBQUkFHTUEgam91cm5hbF9tb2RlID0gV0FMO1xcYFxuICAuY2F0Y2goKGVycm9yKSA9PiB7IGNvbnNvbGUubG9nKFwiRmFpbGVkIGR1ZSB0bzpcIiwgZXJyb3IpOyBwcm9jZXNzLmV4aXQoMSk7IH0pO1xuJ2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICYmIFBSSVNNQSBnZW5lcmF0ZSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldmA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICAvLyBCbGl0eiBkb2VzIG5vdCB0cmlnZ2VyIHNlZWQgYXV0b21hdGljYWxseSwgc28gd2UgbmVlZCB0byBydW4gaXQgbWFudWFsbHkuXG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gICAgLy8gSSdtIG5vdCBzdXJlIHdoeSB3ZSBuZWVkIHRvIHJlbW92ZSBhbGwgc3FsaXRlIGZpbGVzLCBzbyBJIGNvbW1lbnRlZCBvdXQgdGhlIGZvbGxvd2luZyBsaW5lLlxuICAgIC8vIHJldHVybiBgdHJ1ZSAkKHJtIC1SZiBkYi8qKi8qLnNxbGl0ZSogMj4gL2Rldi9udWxsKSAmJiB0cnVlICQocm0gLVJmIHByaXNtYS8qKi8qLnNxbGl0ZSogMj4gL2Rldi9udWxsKSAmJiBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7dGhpcy5zZWVkKCl9YDtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgYmFja3VwUGF0aDogc3RyaW5nLCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vcmVzdG9yZWQuc3FsaXRlMzsgR09PR0xFX0FQUExJQ0FUSU9OX0NSRURFTlRJQUxTPWdjcC1zYS1rZXkuanNvbiBsaXRlc3RyZWFtIHJlc3RvcmUgLW8gJHtvdXRwdXRQYXRofSAke2JhY2t1cFBhdGh9YDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10pXG4gICAgICByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gYEJVTiBidWlsZC10cyBydW4gJHtzY3JpcHRQYXRofWA7XG4gICAgaWYgKChwcm9qZWN0LnBhY2thZ2VKc29uLnByaXNtYSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uWydzZWVkJ10pIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBGSUxFX1NDSEVNQSA9ICdmaWxlOic7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIC8vIERlYWwgd2l0aCBQcmlzbWEgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWEvc3R1ZGlvL2lzc3Vlcy8xMjczXG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2plY3QuZW52LkRBVEFCQVNFX1VSTD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHtcbiAgICAgIGNvbnN0IFBPU1NJQkxFX1BBVEhTID0gW1xuICAgICAgICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICAgICAgICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gICAgICAgIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuICAgICAgXTtcbiAgICAgIGZvciAoY29uc3QgeyBkYlBhdGgsIHNjaGVtYVBhdGggfSBvZiBQT1NTSUJMRV9QQVRIUykge1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBzY2hlbWFQYXRoKSkpIHtcbiAgICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgICAgICBkYlBhdGgsXG4gICAgICAgICAgICBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpb2A7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgZGVzY3JpYmU6ICdSdW4gcHJpc21hIGNvbW1hbmRzJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKCk7XG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnYmFja3VwLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdiJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlcGxveUZvcmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZXBsb3lGb3JjZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZSA8YmFja3VwLXBhdGg+JyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXI6IGRlcGxveUZvcmNlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveS1mb3JjZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95Rm9yY2UocHJvamVjdCwgYXJndi5iYWNrdXBQYXRoKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnU2V0dXAgREIgZm9yIExpdGVzdHJlYW0nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVEZXZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUtZGV2JyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgYSBtaWdyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlLWRldicsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubWlncmF0ZURldihwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5kZXBsb3lGb3JjZUJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUgPGJhY2t1cC1wYXRoPicsXG4gIGRlc2NyaWJlOiBcIlJlc3RvcmUgREIgZnJvbSBMaXRlc3RyZWFtJ3MgYmFja3VwXCIsXG4gIGJ1aWxkZXI6IHJlc3RvcmVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgcmVzdG9yZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID1cbiAgICAgICAgYXJndi5vdXRwdXQgfHxcbiAgICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10gPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgYXJndi5iYWNrdXBQYXRoLCBvdXRwdXQpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWVkQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgZmlsZToge1xuICAgIGFsaWFzOiAnZicsXG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBzZWVkIHNjcmlwdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc2VlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2VlZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NlZWQnLFxuICBkZXNjcmliZTogJ1BvcHVsYXRlIERCIHdpdGggc2VlZCBkYXRhJyxcbiAgYnVpbGRlcjogc2VlZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzZWVkJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBQcmlzbWEgU3R1ZGlvJyxcbiAgYnVpbGRlcjogc3R1ZGlvQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3YucmVzdG9yZWQgJiYgYXJndi5kYlVybE9yUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlc3RvcmVkIGFuZCAtLWRiLXVybC1vci1wYXRoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J11cbiAgICAgICAgICA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICAgIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgPGFyZ3MuLj4nLFxuICBkZXNjcmliZTogJ1Bhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byBwcmlzbWEgYXMgaXMnLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IGAke2FyZ3YuYXJncz8uam9pbignICcpID8/ICcnfWAudHJpbUVuZCgpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoYHByaXNtYSAke3NjcmlwdH1gLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgUFJJU01BICR7c2NyaXB0fWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmlsdGVyKFxuICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydwcmlzbWEnXSB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uWydwcmlzbWEnXVxuICApO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByaXNtYSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAobGFzdFN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQobGFzdFN0YXR1cyk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHNldHVwQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZXR1cCcsXG4gIGRlc2NyaWJlOiAnU2V0dXAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgc2V0dXAoYXJndik7XG4gIH0sXG59O1xuXG4vLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXAoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdzZXR1cCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5yZWFkZGlyKHByb2plY3QuZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGlmIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290KSB7XG4gICAgICBpZiAob3MucGxhdGZvcm0oKSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZXMgPSBbJ3BzdHJlZSddO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgICAgcGFja2FnZXMucHVzaCgnZXhwZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdhc2RmIGluc3RhbGwnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZSA9PT0gJ3B5cHJvamVjdC50b21sJykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2FzZGYgY3VycmVudCBweXRob24nKS50b1N0cmluZygpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgcG9ldHJ5IGVudiB1c2UgJHt2ZXJzaW9ufWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IGluc3RhbGwgLS1hbnNpJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QgfHwgIXByb2plY3RzLnJvb3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSAmJlxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ11cbiAgICApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHNgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkRGV2SW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ3lhcm4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8gYW1kNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259IC5gO1xuICB9XG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCB1bmJ1ZmZlciA9IGZhbHNlLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3VuYnVmZmVyID8gJ3VuYnVmZmVyICcgOiAnJ30ke3RoaXMuc3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYWRkaXRpb25hbE9wdGlvbnMsXG4gICAgICBhZGRpdGlvbmFsQXJnc1xuICAgICl9YDtcbiAgfVxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAtaXQgLXAgODA4MDo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBjb250YWluZXIgbHMgLXEgLWYgbmFtZT0ke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVEZXZPcHRpb25zIHtcbiAgLy8gJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nO1xuICBzdGFydENvbW1hbmQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMgZXh0ZW5kcyBUZXN0RTJFRGV2T3B0aW9ucyB7XG4gIHByaXNtYURpcmVjdG9yeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcC5cbiAqIE5vdGUgdGhhdCBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVNjcmlwdHMge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UG9ydCA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUKSB8fCAzMDAwKSB7fVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb24gPSAnZGV2ZWxvcG1lbnQnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZERldkltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgYWJzdHJhY3Qgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcblxuICBhYnN0cmFjdCBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfVxuICAgICAgJiYgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICAgIFwiJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICAgICl9XCJcbiAgICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgODA4MCl9XCJgO1xuICB9XG5cbiAgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MgPSAndGVzdCB0ZXN0cy9lMmUnLCBwcmlzbWFEaXJlY3RvcnksIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcInJtIC1SZiAke3ByaXNtYURpcmVjdG9yeX0vbW91bnQgJiYgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MFxuICAgICAgICAmJiBCVU4gcGxheXdyaWdodCAke3BsYXl3cmlnaHRBcmdzID09PSAndGVzdCB0ZXN0cy9lMmUnICYmIGFyZ3YudGFyZ2V0ID8gcGxheXdyaWdodEFyZ3MucmVwbGFjZSgndGVzdHMvZTJlJywgYXJndi50YXJnZXQpIDogcGxheXdyaWdodEFyZ3N9JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MgPSAndGVzdCB0ZXN0cy9lMmUnLCBzdGFydENvbW1hbmQgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIHJldHVybiBgV0JfRU5WPSR7ZW52fSBORVhUX1BVQkxJQ19XQl9FTlY9JHtlbnZ9IEFQUF9FTlY9JHtlbnZ9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMTo4MDgwXG4gICAgICAgICYmIEJVTiBwbGF5d3JpZ2h0ICR7cGxheXdyaWdodEFyZ3MgPT09ICd0ZXN0IHRlc3RzL2UyZScgJiYgYXJndi50YXJnZXQgPyBwbGF5d3JpZ2h0QXJncy5yZXBsYWNlKCd0ZXN0cy9lMmUnLCBhcmd2LnRhcmdldCkgOiBwbGF5d3JpZ2h0QXJnc30ke3N1ZmZpeH1cImA7XG4gIH1cblxuICBhYnN0cmFjdCB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFlBUk4gdml0ZXN0IHJ1biAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy91bml0J30gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gdGhpcy5kZWZhdWx0UG9ydCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSB0aGlzLmRlZmF1bHRQb3J0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFyZ3YsXG4gICAgICBwb3J0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBCbGl0ei5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgQmxpdHpTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgYXBwRW52ID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYEFQUF9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGAgOiAnJztcbiAgICByZXR1cm4gYCR7YXBwRW52fVlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCJibGl0eiBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgYXBwRW52ID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYEFQUF9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGAgOiAnJztcbiAgICByZXR1cm4gYCR7YXBwRW52fU5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7cHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KX0gJiYgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZShcbiAgICAgICAgJ2Vjb3N5c3RlbS5jb25maWcuY2pzJ1xuICAgICAgKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgc3RhcnRDb21tYW5kID0gYCR7cHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KX0gJiYgJHtcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmRcbiAgICAgIH0gJiYgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZCxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgPSAnYmxpdHogZGV2IC1wIDgwODAnIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcImJsaXR6IGRldlwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICApfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IDgwODApOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiAke1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmRcbiAgICB9ICYmIE5PREVfRU5WPXByb2R1Y3Rpb24gUE9SVD1cXCR7UE9SVDotJHtwb3J0fX0gJHtydW50aW1lV2l0aEFyZ3N9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHtcbiAgICAgIHN0YXJ0Q29tbWFuZCA9IGAke3Byb2plY3QuaGFzUHJpc21hID8gJ3ByaXNtYSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLWdlbmVyYXRlICYmICcgOiAnJ30oJHt0aGlzLnN0YXJ0UHJvZHVjdGlvbihcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKX0pYCxcbiAgICB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MCAmJiB2aXRlc3QgcnVuICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkke3N1ZmZpeH1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCB7IHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBXQl9FTlY9JHtcbiAgICAgIHByb2plY3QuZW52LldCX0VOVlxuICAgIH0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kIHx8IHRoaXMuc3RhcnQocHJvamVjdCwgYXJndil9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MCAmJiB2aXRlc3QgcnVuICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkke3N1ZmZpeH1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwiJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfVwiIFwiJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYXJndlxuICAgICl9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIm5leHQgZGV2IC0tdHVyYm9wYWNrICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtbXG4gICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpXSA6IFtdKSxcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgIGBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAsXG4gICAgICBdLmpvaW4oJyAmJiAnKX1cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzOiBvcHRpb25zLnBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAnZGInLFxuICAgICAgc3RhcnRDb21tYW5kOlxuICAgICAgICBvcHRpb25zLnN0YXJ0Q29tbWFuZCA/P1xuICAgICAgICBbXG4gICAgICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCldIDogW10pLFxuICAgICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICAgIGBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICAgICAgXS5qb2luKCcgJiYgJyksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBzdGFydENvbW1hbmQgPSAnbmV4dCBkZXYgLS10dXJib3BhY2sgLXAgODA4MCcgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJuZXh0IGRldiAtLXR1cmJvcGFja1wiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBuZXh0U2NyaXB0cyA9IG5ldyBOZXh0U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7XG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgIH1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcInJlbWl4IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7cHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KX0gJiYgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZShcbiAgICAgICAgJ2Vjb3N5c3RlbS5jb25maWcuY2pzJ1xuICAgICAgKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgc3RhcnRDb21tYW5kID0gYCR7cHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KX0gJiYgJHtcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmRcbiAgICAgIH0gJiYgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBwcmlzbWFEaXJlY3Rvcnk6ICdwcmlzbWEnLCBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kID0gJ3JlbWl4IGRldicgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwicmVtaXggZGV2XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlbWl4U2NyaXB0cyA9IG5ldyBSZW1peFNjcmlwdHMoKTtcbiIsImV4cG9ydCBjb25zdCBodHRwU2VydmVyUGFja2FnZXMgPSBbJ2V4cHJlc3MnLCAnZmFzdGlmeScsICdlbHlzaWEnXTtcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOiAnU3RhcnQgYXBwJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgbm9ybWFsaXplQXJncyhhcmd2KTtcblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge307XG4gICAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gICAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgICBpZiAoZGVwc1snYmxpdHonXSkge1xuICAgICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWyduZXh0J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkgfHxcbiAgICAgICAgKHByb2plY3QuaGFzRG9ja2VyZmlsZSAmJiAvRVhQT1NFXFxzKzgwODAvLnRlc3QocHJvamVjdC5kb2NrZXJmaWxlKSlcbiAgICAgICkge1xuICAgICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHNbJ2J1aWxkLXRzJ10gfHwgZGV2RGVwc1snYnVpbGQtdHMnXSkge1xuICAgICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJzdGFydFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAgIHN3aXRjaCAoYXJndi5tb2RlIHx8ICdkZXYnKSB7XG4gICAgICAgIGNhc2UgJ2Rldic6XG4gICAgICAgIGNhc2UgJ2RldmVsb3BtZW50Jzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdkZXZlbG9wbWVudCcpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0YWdpbmcnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3N0YWdpbmcnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwgODA4MCl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LCB3YkVudjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSB3YkVudjtcbiAgbGV0IHByZWZpeCA9IGBXQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IGA7XG4gIGlmIChkZXBzWyduZXh0J10pIHtcbiAgICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19XQl9FTlYgPSBwcm9jZXNzLmVudi5XQl9FTlY7XG4gICAgcHJlZml4ICs9IGBORVhUX1BVQkxJQ19XQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IGA7XG4gIH1cbiAgcmV0dXJuIHByZWZpeDtcbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0T3B0aW9uc0J1aWxkZXIgPSB7XG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHdhdGNoIGZpbGVzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgY29yZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnYScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG4gICdkb2NrZXItb3B0aW9ucyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgXCJkb2NrZXIgcnVuXCInLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTY3JpcHRBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+XG4pOiB2b2lkIHtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZEFyZ3NUZXh0ID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndi5fPy5zbGljZSgxKSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKVxuICAgIC5qb2luKCcgJyk7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA9IChhcmd2LmRvY2tlck9wdGlvbnMgPz8gW10pLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKS5qb2luKCcgJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNpOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHJ1biB0ZXN0cyBvbiBDSScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdXaGV0aGVyIHRvIHJ1biBlMmUgdGVzdHMuIFlvdSBtYXkgcGFzcyBtb2RlIGFzIGFyZ3VtZW50OiBub25lIHwgaGVhZGxlc3MgKGRlZmF1bHQpIHwgaGVhZGxlc3MtZGV2IHwgaGVhZGVkIHwgaGVhZGVkLWRldiB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IGRlYnVnIHwgZ2VuZXJhdGUgfCB0cmFjZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHN0YXJ0OiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHJ1biBzdGFydCB0ZXN0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICB1bml0OiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHJ1biB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbiAgdGFyZ2V0OiB7XG4gICAgZGVzY3JpcHRpb246ICdUZXN0IHRhcmdldCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd0JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRlc3RBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PjtcblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QnLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0KFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxKSB7XG4gICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgcHJvY2Vzcy5lbnYuQ0kgPSAnMSc7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgY29uc3Qgc2hvdWxkUnVuQWxsVGVzdHMgPSBhcmd2LmUyZSA9PT0gdW5kZWZpbmVkICYmIGFyZ3Yuc3RhcnQgPT09IHVuZGVmaW5lZCAmJiBhcmd2LnVuaXQgPT09IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwc1snYmxpdHonXSkge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHNbJ25leHQnXSkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUnVuQWxsVGVzdHMpIHtcbiAgICAgIGFyZ3YgPSB7XG4gICAgICAgIC4uLmFyZ3YsXG4gICAgICAgIGUyZTpcbiAgICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0cycsICdlMmUnKSkgJiYgIWFyZ3YudGFyZ2V0Py5pbmNsdWRlcygnL3VuaXQvJylcbiAgICAgICAgICAgID8gJ2hlYWRsZXNzJ1xuICAgICAgICAgICAgOiAnbm9uZScsXG4gICAgICAgIHN0YXJ0OiB0cnVlLFxuICAgICAgICB1bml0OiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0cycsICd1bml0JykpICYmICFhcmd2LnRhcmdldD8uaW5jbHVkZXMoJy9lMmUvJyksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdO1xuICAgIGlmIChhcmd2LmNpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGlmIChhcmd2LnVuaXQpIHtcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndikucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgICAgdGltZW91dDogYXJndi51bml0VGltZW91dCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYXJndi5zdGFydCkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmIChhcmd2LmUyZSAhPT0gJ25vbmUnKSB7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9qZWN0Lmhhc0RvY2tlcmZpbGVcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgc3RhcnRDb21tYW5kOiBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCB0cnVlKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9O1xuICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgb3B0aW9ucykucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoYXJndi51bml0KSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2LCB7IHRpbWVvdXQ6IGFyZ3YudW5pdFRpbWVvdXQgfSkpO1xuICAgIH1cbiAgICBpZiAoYXJndi5zdGFydCkge1xuICAgICAgcHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpKTtcbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgY2FzZSAnbm9uZSc6IHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICcnOlxuICAgICAgY2FzZSAnaGVhZGxlc3MnOiB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwge30pLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFkbGVzcy1kZXYnOiB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwge30pLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGF3YWl0IHRlc3RPbkRvY2tlcihwcm9qZWN0LCBhcmd2LCBzY3JpcHRzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgIGF3YWl0IHRlc3RPbkRvY2tlcihwcm9qZWN0LCBhcmd2LCBzY3JpcHRzLCBgdGVzdCAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWRlYnVnYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwc1snYmxpdHonXSB8fCBkZXBzWyduZXh0J10gfHwgZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0tZGVidWdgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RyYWNlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgQlVOIHBsYXl3cmlnaHQgc2hvdy10cmFjZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBlMmUgbW9kZTogJHthcmd2LmUyZX1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T25Eb2NrZXIoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2Nlc3MuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgIGAke3NjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHN0YXJ0Q29tbWFuZDogZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgdHJ1ZSksXG4gICAgfSl9YCxcbiAgICBwcm9qZWN0LFxuICAgIGFyZ3YsXG4gICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH1cbiAgKTtcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwcm9qZWN0KSA9PiB7XG4gICAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQgLS1QcmV0dHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnB5cmlnaHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdZQVJOIHB5cmlnaHQnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJvamVjdC5oYXNTb3VyY2VDb2RlICYmXG4gICAgICAgIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdClcbiAgICAgICkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0IC0tUHJldHR5Jyk7XG4gICAgICB9XG4gICAgICBpZiAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgbGV0IGZpbmFsRXhpdENvZGUgPSAwO1xuICAgIGZvciAoY29uc3QgW2ksIGV4aXRDb2RlXSBvZiBleGl0Q29kZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzW2ldLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICAgICAgaWYgKGRlcHNbJ2JsaXR6J10pIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdQbGVhc2UgdHJ5IFwieWFybiBnZW4tY29kZVwiIGlmIHlvdSBmYWNlIHVua25vd24gdHlwZSBlcnJvcnMuJykpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbmFsRXhpdENvZGUpIHByb2Nlc3MuZXhpdChmaW5hbEV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYnVpbGRJZk5lZWRlZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKGJ1aWxkSWZOZWVkZWRDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQob3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQpXG4gIC5jb21tYW5kKHByaXNtYUNvbW1hbmQpXG4gIC5jb21tYW5kKHJldHJ5Q29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC5oZWxwKCkuYXJndjtcblxuZm9yIChjb25zdCBzaWduYWwgb2YgWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHByb2Nlc3MuZXhpdCgpKTtcbn1cbiJdLCJuYW1lcyI6WyJjYWNoZWRFbnZWYXJzIiwiTWFwIiwicmVhZEVudkZpbGUiLCJmaWxlUGF0aCIsImNhY2hlZCIsImdldCIsInBhcnNlZCIsImNvbmZpZyIsInBhdGgiLCJyZXNvbHZlIiwicHJvY2Vzc0VudiIsInNldCIsImFzeW5jIiwic3Bhd25Bc3luYyIsImNvbW1hbmQiLCJhcmdzIiwib3B0aW9ucyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzdGRvdXQiLCJzZXRFbmNvZGluZyIsInN0ZGVyciIsIm9uIiwiZGF0YSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJzdG9wcGVkIiwic3RvcFByb2Nlc3MiLCJwaWQiLCJ2ZXJib3NlIiwiY29uc29sZSIsImluZm8iLCJ0cmVlS2lsbCIsImtpbGxPbkV4aXQiLCJwcm9jZXNzIiwiZXJyb3IiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImNvZGUiLCJzaWduYWwiLCJ1bmRlZmluZWQiLCJFcnJvciIsInN0YXR1cyIsImlucHV0Iiwic3RkaW4iLCJ3cml0ZSIsImVuZCIsInQiLCJzIiwiaSIsImUiLCJuIiwiZW50cmllcyIsImgiLCJibG9ja3MiLCJyZXNldCIsImZpbmFsaXplZCIsImJsb2NrIiwic3RhcnQiLCJsYXN0Qnl0ZUluZGV4IiwiY29uc3RydWN0b3IiLCJ0aGlzIiwicGFkZGluZyIsIm91dHB1dEJpdHMiLCJibG9ja0NvdW50IiwiYnl0ZUNvdW50Iiwib3V0cHV0QmxvY2tzIiwiZXh0cmFCeXRlcyIsInVwZGF0ZSIsIm8iLCJsZW5ndGgiLCJsIiwiYyIsImYiLCJjb2RlUG9pbnRBdCIsInIiLCJmaW5hbGl6ZSIsImhleCIsImEiLCJ1IiwiZCIsImIiLCJrIiwieSIsIngiLCJCIiwicCIsIkMiLCJ6IiwiSSIsImciLCJ3IiwiQSIsIlAiLCJFIiwiaiIsIm0iLCJxIiwidiIsIkQiLCJGIiwiRyIsIkgiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiJCIsIl8iLCJ0dCIsInN0IiwiaXQiLCJldCIsIm90IiwibnQiLCJodCIsInJ0IiwibHQiLCJjdCIsImZ0IiwiSlNPTiIsInN0cmluZ2lmeSIsImNhY2hlRHVyYXRpb24iLCJOdW1iZXIiLCJQT1NJVElWRV9JTkZJTklUWSIsImNhbGNIYXNoIiwia2luZCIsIkRhdGUiLCJub3ciLCJjYWxsIiwiUHJvamVjdCIsIl9pbml0UHJvdG8iLCJfYXBwbHlEZWNzIiwibWVtb2l6ZU9uZSIsImFyZ3YiLCJwYXRoQnlOYW1lIiwiZGlyUGF0aCIsImxvYWRFbnYiLCJfZGlyUGF0aCIsImlzQnVuQXZhaWxhYmxlIiwidGVzdCIsImZzIiwicmVhZEZpbGVTeW5jIiwiam9pbiIsInJvb3REaXJQYXRoIiwiYnVpbGRDb21tYW5kIiwicGFja2FnZUpzb24iLCJzY3JpcHRzIiwiYnVpbGQiLCJpbmNsdWRlcyIsImV4aXN0c1N5bmMiLCJkb2NrZXJmaWxlIiwiZmluZEZpbGUiLCJoYXNEb2NrZXJmaWxlIiwiaGFzU291cmNlQ29kZSIsIm5hbWUiLCJkb2NrZXJJbWFnZU5hbWUiLCJyZXBsYWNlQWxsIiwiZW52IiwiZW52VmFycyIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzIiwiY3dkIiwiZW52UGF0aHMiLCJtYXAiLCJlbnZQYXRoIiwidG9TdHJpbmciLCJjYXNjYWRlIiwiY2FzY2FkZUVudiIsImNhc2NhZGVOb2RlRW52IiwiTk9ERV9FTlYiLCJhdXRvQ2FzY2FkZUVudiIsIldCX0VOViIsInB1c2giLCJpbmNsdWRlUm9vdEVudiIsInJvb3RQYXRoIiwiZmxhdE1hcCIsImZpbHRlciIsInJlbGF0aXZlIiwiZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnMiLCJjb3VudCIsImtleSIsInZhbHVlIiwiT2JqZWN0IiwiY2hlY2tFbnYiLCJtaXNzaW5nS2V5cyIsImtleXMiLCJyZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYXJzZSIsInBhY2thZ2VKc29uUGF0aCIsImhhc1ByaXNtYSIsImRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY2llcyIsImRvY2tlclBhY2thZ2VKc29uIiwiZGlybmFtZSIsImJpbkV4aXN0cyIsImJpbkZvdW5kIiwiY3VycmVudFBhdGgiLCJiaW5QYXRoIiwiUEFUSCIsInBhcmVudFBhdGgiLCJmaWxlTmFtZSIsImZpbmQiLCJmaW5kU2VsZlByb2plY3QiLCJmaW5kRGVzY2VuZGFudFByb2plY3RzIiwicm9vdEFuZFNlbGZQcm9qZWN0cyIsInRoaXNQcm9qZWN0Iiwicm9vdFByb2plY3QiLCJ3b3Jrc3BhY2VzIiwiZW5kc1dpdGgiLCJyb290Iiwic2VsZiIsImZpbmRSb290QW5kU2VsZlByb2plY3RzIiwiZGVzY2VuZGFudHMiLCJnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMiLCJwcm9qZWN0cyIsIndvcmtzcGFjZSIsIkFycmF5IiwiaXNBcnJheSIsImdsb2JQYXR0ZXJuIiwicGFja2FnZURpcnMiLCJ3b3Jrc3BhY2VQYXRoIiwid3MiLCJnbG9iYnkiLCJkb3QiLCJvbmx5RGlyZWN0b3JpZXMiLCJzdWJQYWNrYWdlRGlyUGF0aCIsImlzUnVubmluZ09uQnVuIiwibnBtX2V4ZWNwYXRoIiwicnVudGltZVdpdGhBcmdzIiwicGFja2FnZU1hbmFnZXIiLCJwYWNrYWdlTWFuYWdlcldpdGhSdW4iLCJidWlsZElmTmVlZGVkQ29tbWFuZCIsImRlc2NyaWJlIiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiYWxpYXMiLCJoYW5kbGVyIiwicHJvamVjdFBhdGhGb3JUZXN0aW5nIiwicHJvamVjdCIsImNoYWxrIiwicmVkIiwiY2FuU2tpcCIsImNhY2hlRmlsZVBhdGgiLCJjb250ZW50SGFzaCIsImNhY2hlRGlyZWN0b3J5UGF0aCIsInByb21pc2VzIiwibWtkaXIiLCJyZWN1cnNpdmUiLCJoYXNoIiwiY3JlYXRlSGFzaCIsImNvbW1pdEhhc2giLCJjaGlsZF9wcm9jZXNzIiwiZXhlY1N5bmMiLCJ0cmltIiwiZW52aXJvbm1lbnRKc29uIiwiaWdub3JpbmdFbnZWYXJOYW1lcyIsImhhcyIsInNvcnQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZEZpbGVQYXRocyIsInNwYXduU3luYyIsInN0ZGlvIiwiZW5jb2RpbmciLCJzcGxpdCIsInJlcGxhY2UiLCJpbmNsdWRlUGF0dGVybnMiLCJzb21lIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJncmVlbiIsImRyeVJ1biIsIndyaXRlRmlsZSIsImJ1aWxkSWZOZWVkZWQiLCJyZXQiLCJzaGVsbCIsImV4aXRDb2RlIiwiU2V0Iiwia2lsbGVkIiwia2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMiLCJwb3J0Iiwia2lsbFBvcnRQcm9jZXNzIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0Iiwib3B0cyIsInByaW50YWJsZVNjcmlwdCIsInJ1bm5hYmxlU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0IiwicHJpbnRTdGFydCIsInByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQiLCJtYXRjaCIsImtpbGxGdW5jIiwiYWRkIiwia2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQiLCJjb25maWd1cmVFbnYiLCJ0aW1lb3V0IiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSIsIm91dCIsIm5ld1NjcmlwdCIsImZpeEJ1bkNvbW1hbmQiLCJub3JtYWxpemVkU2NyaXB0IiwicHJlZml4Iiwid2VhayIsImdyYXkiLCJjeWFuIiwiYm9sZCIsImV4aXQiLCJuZXdFbnYiLCJjaSIsImZvcmNlQ29sb3IiLCJiaW9tZUV4dGVuc2lvbnMiLCJwcmV0dGllckV4dGVuc2lvbnMiLCJwcmV0dGllck9ubHlFeHRlbnNpb25zIiwiZXh0IiwibGludENvbW1hbmQiLCJmaXgiLCJmb3JtYXQiLCJmaWxlcyIsImJpb21lQXJnc1RleHQiLCJwcmV0dGllckFyZ3NUZXh0Iiwic29ydFBhY2thZ2VKc29uQXJnc1RleHQiLCJmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUiLCJmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllciIsInBhY2thZ2VKc29uRmlsZVBhdGhzIiwiZmlsZSIsIlN0cmluZyIsImV4dGVuc2lvbiIsImV4dG5hbWUiLCJzbGljZSIsImJpb21lQ29tbWFuZCIsImJpb21lUHJvbWlzZSIsInByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCIsImNvbW1hbmROYW1lIiwib3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQiLCJvdXRzaWRlIiwiZGVwcyIsInN0YXJ0c1dpdGgiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJkZXZEZXBzIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJyZW1vdmVkRGVwcyIsIndvcmQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwicmVtb3ZlZFNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsInByaXNtYVNjcmlwdHMiLCJkZXBsb3kiLCJkZXBsb3lGb3JjZSIsImJhY2t1cFBhdGgiLCJkaXJOYW1lIiwibGl0ZXN0cmVhbSIsIm1pZ3JhdGUiLCJzZWVkIiwibWlncmF0ZURldiIsInJlc3RvcmUiLCJvdXRwdXRQYXRoIiwic2NyaXB0UGF0aCIsInByaXNtYSIsInN0dWRpbyIsImRiVXJsT3JQYXRoIiwiRklMRV9TQ0hFTUEiLCJVUkwiLCJEQVRBQkFTRV9VUkwiLCJQT1NTSUJMRV9QQVRIUyIsInNjaGVtYVBhdGgiLCJkYlBhdGgiLCJidWlsZGVyIiwicHJpc21hQ29tbWFuZCIsInlhcmdzIiwiZGVwbG95Q29tbWFuZCIsImRlcGxveUZvcmNlQ29tbWFuZCIsImxpdGVzdHJlYW1Db21tYW5kIiwibWlncmF0ZUNvbW1hbmQiLCJtaWdyYXRlRGV2Q29tbWFuZCIsInJlc2V0Q29tbWFuZCIsInJlc3RvcmVDb21tYW5kIiwic2VlZENvbW1hbmQiLCJzdHVkaW9Db21tYW5kIiwiZGVmYXVsdENvbW1hbmQiLCJkZW1hbmRDb21tYW5kIiwiYWxsUHJvamVjdHMiLCJmaW5kUHJpc21hUHJvamVjdHMiLCJkZXBsb3lGb3JjZUJ1aWxkZXIiLCJkZW1hbmRPcHRpb24iLCJvdXRwdXQiLCJyZXN0b3JlZCIsInRyaW1FbmQiLCJmaWx0ZXJlZCIsInJldHJ5Q29tbWFuZCIsInJldHJ5IiwiZGVmYXVsdCIsImNtZEFuZEFyZ3MiLCJCb29sZWFuIiwibGFzdFN0YXR1cyIsInllbGxvdyIsInNldHVwQ29tbWFuZCIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9zIiwicGxhdGZvcm0iLCJwYWNrYWdlcyIsImlzRmlsZSIsInZlcnNpb24iLCJwcm9taXNlQWxsIiwicGxheXdyaWdodCIsInNldHVwIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkRGV2SW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJ1bmJ1ZmZlciIsImFkZGl0aW9uYWxPcHRpb25zIiwiYWRkaXRpb25hbEFyZ3MiLCJzdG9wIiwic3Bhd25TeW5jT25FeGl0Iiwic3RvcEFsbCIsIkJhc2VTY3JpcHRzIiwiZGVmYXVsdFBvcnQiLCJQT1JUIiwiYnVpbGREb2NrZXIiLCJzdGFydERvY2tlciIsIm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCIsIm5vcm1hbGl6ZWRBcmdzVGV4dCIsIndhaXRBbmRPcGVuQXBwIiwidGVzdEUyRSIsInBsYXl3cmlnaHRBcmdzIiwicHJpc21hRGlyZWN0b3J5Iiwic3RhcnRDb21tYW5kIiwidGFyZ2V0IiwidGVzdEUyRURldiIsInRlc3RVbml0Iiwid2FpdEFwcCIsImJsaXR6U2NyaXB0cyIsInN1cGVyIiwic3RhcnRQcm9kdWN0aW9uIiwidGVzdFN0YXJ0IiwiaHR0cFNlcnZlclNjcmlwdHMiLCJ3YXRjaCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwicmVtaXhTY3JpcHRzIiwiaHR0cFNlcnZlclBhY2thZ2VzIiwibW9kZSIsImFyZyIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwiY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJ3YkVudiIsIk5FWFRfUFVCTElDX1dCX0VOViIsInRlc3RDb21tYW5kIiwiZTJlIiwidW5pdCIsIkNJIiwiRk9SQ0VfQ09MT1IiLCJzaG91bGRSdW5BbGxUZXN0cyIsInVuaXRUaW1lb3V0IiwiYWxsIiwidGVzdE9uRG9ja2VyIiwiV0JfRE9DS0VSIiwidHlwZUNoZWNrQ29tbWFuZCIsImNvbW1hbmRzIiwidHlwZXNjcmlwdCIsInB5cmlnaHQiLCJleGl0Q29kZXMiLCJmaW5hbEV4aXRDb2RlIiwidGNDb21tYW5kIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJ0b1VwcGVyQ2FzZSIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyIsInN0cmljdCIsImhlbHAiXSwibWFwcGluZ3MiOiJvY0F5SEEsTUFBTUEsRUFBZ0IsSUFBSUMsSUFFMUIsU0FBU0MsRUFBWUMsR0FDbkIsTUFBTUMsRUFBU0osRUFBY0ssSUFBSUYsR0FDakMsR0FBSUMsRUFBUSxPQUFPQSxFQUVuQixNQUFNRSxFQUFTQyxFQUFPLENBQUVD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LEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUVHLEdBQUdxQixHQUFHLEVBQUVDLElBQUksSUFBSXhCLEVBQUVJLEdBQUdvQixHQUFHLEVBQUVELElBQUksSUFBSXpCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRTJCLEdBQUdHLEdBQUcsRUFBRUMsSUFBSSxJQUFJOUIsRUFBRXNCLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJL0IsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFd0IsR0FBR1EsR0FBRyxFQUFFQyxJQUFJLElBQUloQyxFQUFFd0IsR0FBR1EsR0FBRyxFQUFFRCxJQUFJLElBQUlqQyxFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUU4QixHQUFHM0IsR0FBRyxFQUFFRSxJQUFJLElBQUlKLEVBQUU4QixHQUFHMUIsR0FBRyxFQUFFRixJQUFJLElBQUlK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LFdBRVIsbUJBQW9CLENBQ2xCRCxZQUFhLGlFQUNiQyxLQUFNLFVBQ05tTCxTQUFTLEdBRVgsbUJBQW9CLENBQ2xCcEwsWUFBYSxxR0FDYkMsS0FBTSxVQUNObUwsU0FBUyxHQUVYLFlBQWEsQ0FDWHBMLFlBQWEscUZBQ2JDLEtBQU0sU0FDTm1MLFFBQVMsZ0JBRVg1WSxRQUFTLENBQ1B3TixZQUFhLHNDQUNiQyxLQUFNLFVBQ05DLE1BQU8sSytCakNULGNBQWUsQ0FDYkYsWUFBYSxzQkFDYkMsS0FBTSxTQUNOQyxNQUFPLEtBRVQsVUFBVyxDQUNURixZQUFhLDJDQUNiQyxLQUFNLFVBQ05DLE1BQU8sQ0FBQyxNQUFPLGFDSWI0SixFQUFNbUcsRUFBUXBkLFFBQVFnSCxPQUN6QnFXLFdBQVcsTUFDWHhlLFFBQVFzZSxJQUNSRyxZQUFZdFcsSUFDWCxNQUFNdVcsRUFBYXZXLEVBQUssZUFDeEIsR0FBSXVXLEVBQVksQ0FDZCxNQUFNclcsRUFBVTdJLEVBQUtDLFFBQVFpZixHQUM3QnZkLFFBQVF3ZCxNQUFNdFcsRUFDaEIsRWhDOEdHLFNBQThDdUIsR0FFL0NBLEVBQVF1QyxNQUFRdkMsRUFBUWdWLG1CQUMxQmhWLEVBQVF1QyxLQUFPdkMsRUFBUXVDLEtBQUtvRSxRQUFRLEdBQUczRyxFQUFRZ1Ysb0JBQXFCLElBRWpFbFYsV0FBVyxtQ0FBb0MsSUFFL0NBLFdBQVcsc0JBQXVCLElBQ2xDQSxXQUFXLGlCQUFrQixLQUVsQyxJQUFLLE1BQU11QixLQUFPRSxPQUFPRyxLQUFLMUIsR0FBVSxDQUN0QyxNQUFNaVYsRUFBVzVULEVBQUk2VCxlQUVuQkQsRUFBU2hKLFdBQVcsU0FDcEJnSixFQUFTaEosV0FBVyxVQUNwQmdKLEVBQVNoSixXQUFXLFdBQ1AsZ0JBQWJnSixHQUNhLGFBQWJBLFdBRU9qVixFQUFRcUIsRUFFbkIsQ0FDRixDZ0NsSUk4VCxDQUFxQzVkLFFBQVF3SSxJQUFJLElBRWxEN0osUUFBUXNPLEdBQ1J0TyxRQUFReVUsSUFDUnpVLFFBQVE0VixJQUNSNVYsUUFBUXFZLElBQ1JyWSxRQUFRMFosSUFDUjFaLFFBQVFpYSxJQUNSamEsUUFBUWljLElBQ1JqYyxRQUFRdWQsSUFDUnZkLFFBQVFpZSxJQUNSamUsUUFBUXVlLElBQ1J0RixnQkFDQWlHLFNBQ0FDLE9BQU85VyxLQUVWLElBQUssTUFBTTNHLElBQVUsQ0FBQyxTQUFVLFVBQVcsV0FDekNMLFFBQVFYLEdBQUdnQixHQUFRLElBQU1MLFFBQVE0UyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlsyLDMsNF19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@willbooster/wb",
3
- "version": "8.0.27",
3
+ "version": "8.0.29",
4
4
  "license": "Apache-2.0",
5
5
  "author": "WillBooster Inc.",
6
6
  "type": "module",
@@ -26,7 +26,7 @@
26
26
  "dependencies": {
27
27
  "chalk": "5.4.1",
28
28
  "dotenv": "16.4.7",
29
- "globby": "14.0.2",
29
+ "globby": "14.1.0",
30
30
  "kill-port": "2.0.1",
31
31
  "minimal-promise-pool": "4.1.2",
32
32
  "tree-kill": "1.2.2",
@@ -34,18 +34,18 @@
34
34
  },
35
35
  "devDependencies": {
36
36
  "@rollup/plugin-swc": "0.4.0",
37
- "@swc/core": "1.10.12",
37
+ "@swc/core": "1.10.15",
38
38
  "@types/eslint": "8.56.10",
39
39
  "@types/kill-port": "2.0.3",
40
40
  "@types/micromatch": "4.0.9",
41
- "@types/node": "22.13.0",
41
+ "@types/node": "22.13.1",
42
42
  "@types/yargs": "17.0.33",
43
- "@typescript-eslint/eslint-plugin": "8.22.0",
44
- "@typescript-eslint/parser": "8.22.0",
43
+ "@typescript-eslint/eslint-plugin": "8.23.0",
44
+ "@typescript-eslint/parser": "8.23.0",
45
45
  "@willbooster/eslint-config-ts": "10.6.1",
46
46
  "@willbooster/prettier-config": "9.1.3",
47
47
  "at-decorators": "4.1.3",
48
- "build-ts": "13.1.15",
48
+ "build-ts": "13.1.19",
49
49
  "eslint": "8.57.0",
50
50
  "eslint-config-prettier": "10.0.1",
51
51
  "eslint-import-resolver-typescript": "3.7.0",
@@ -56,11 +56,11 @@
56
56
  "lint-staged": "15.4.3",
57
57
  "micromatch": "4.0.8",
58
58
  "prettier": "3.4.2",
59
- "prisma": "6.3.0",
59
+ "prisma": "6.3.1",
60
60
  "sort-package-json": "2.14.0",
61
61
  "type-fest": "4.33.0",
62
62
  "typescript": "5.7.3",
63
- "vitest": "3.0.4"
63
+ "vitest": "3.0.5"
64
64
  },
65
65
  "engines": {
66
66
  "node": ">= 18"